Initial release
This commit is contained in:
commit
e3357f8bec
6 changed files with 372 additions and 0 deletions
22
README.md
Normal file
22
README.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
[](https://foundrygg.com)[](https://discord.gg/ufvFUJtVwk)[](https://git.cacklingfiend.info/cacklingfiend/factorio-light)[](https://mods.factorio.com/mod/factorio-light/metrics?range=last_two_months&type=mod_downloads)[](https://ko-fi.com/cacklingfiend)
|
||||
|
||||
_________________
|
||||
## Factorio light
|
||||
|
||||
Did you ever think Factorio is too complex? Do you want to introduce your child to Factorio but think he/she will be overwhelmed?
|
||||
|
||||
Well, that is over now! Factorio light is a reduced version of the vanilla experience.
|
||||
|
||||
The following has been removed:
|
||||
|
||||
* Production science pack
|
||||
* Utility science pack
|
||||
* Uranium and anything related
|
||||
* Processing units
|
||||
* mk2 equipment
|
||||
* Beacons
|
||||
* Circuitry
|
||||
* Artillery
|
||||
* Combat bots
|
||||
* Infinite research
|
||||
* Behemoth biters
|
||||
121
factorio-light/data.lua
Normal file
121
factorio-light/data.lua
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
require "__cf-lib__/util/table"
|
||||
|
||||
local util = require "util"
|
||||
local Technology = require("__cf-lib__/data/technology")
|
||||
local Recipe = require("__cf-lib__/data/recipe")
|
||||
|
||||
-- Clear space science
|
||||
util.removeTechWithPrerequisite("space-science-pack")
|
||||
|
||||
-- Clear production/utility science
|
||||
util.removeEverythingRecursivelyByTechnology("uranium-mining", { hideEntities = { "heat-pipe", "nuclear-reactor", "spidertron" } })
|
||||
util.removeEverythingRecursivelyByTechnology("circuit-network", { skip = { "iron-stick" }, hideEntity = true })
|
||||
util.removeEverythingRecursivelyByTechnology("follower-robot-count-1")
|
||||
util.removeEverythingRecursivelyByTechnology("military-4", { hideEntities = { "power-armor-mk2", "artillery-turret", "artillery-wagon", "spidertron" } })
|
||||
util.removeEverythingRecursivelyByTechnology("defender")
|
||||
util.removeEverythingByTechnology("coal-liquefaction")
|
||||
util.removeEverythingByTechnology("effect-transmission", { hideEntity = true })
|
||||
util.removeEverythingByTechnology("discharge-defense-equipment")
|
||||
util.removeEverythingByTechnology("energy-shield-mk2-equipment")
|
||||
util.removeEverythingByTechnology("personal-roboport-mk2-equipment")
|
||||
util.removeEverythingByTechnology("battery-mk2-equipment")
|
||||
util.removeEverythingByItem("discharge-defense-remote")
|
||||
|
||||
-- Move rocket
|
||||
Technology:new("rocket-silo")
|
||||
:removePrerequisite("productivity-module-3")
|
||||
:removePrerequisite("speed-module-3")
|
||||
:removePrerequisite("utility-science-pack")
|
||||
:removeIngredient("production-science-pack")
|
||||
:removeIngredient("utility-science-pack")
|
||||
|
||||
-- Move production/utility techs to space science
|
||||
util.replacePrerequisite("production-science-pack", "space-science-pack")
|
||||
util.replacePrerequisite("utility-science-pack", "space-science-pack")
|
||||
util.replaceTechIngredient("production-science-pack", "space-science-pack")
|
||||
util.replaceTechIngredient("utility-science-pack", "space-science-pack")
|
||||
util.removeEverythingByTechnology("production-science-pack")
|
||||
util.removeEverythingByTechnology("utility-science-pack")
|
||||
data.raw["lab"]["lab"].inputs = table.filter(
|
||||
data.raw["lab"]["lab"].inputs,
|
||||
function(value)
|
||||
return not table.contains({ "production-science-pack", "utility-science-pack" }, value)
|
||||
end
|
||||
)
|
||||
|
||||
-- Remove processing unit
|
||||
local recipes = { "speed-module-2", "speed-module-3", "efficiency-module-2", "efficiency-module-3", "productivity-module-2", "productivity-module-3" }
|
||||
for _, recipe in pairs(recipes) do
|
||||
Recipe:new(recipe):replaceIngredient("advanced-circuit", "electronic-circuit")
|
||||
end
|
||||
util.replaceRecipeIngredient("processing-unit", "advanced-circuit", 2)
|
||||
util.replacePrerequisite("processing-unit", "chemical-science-pack")
|
||||
util.removeEverythingByTechnology("processing-unit", { skip = { "advanced-circuit" } })
|
||||
|
||||
-- Remove tips and tricks
|
||||
data.raw["tips-and-tricks-item"]["spidertron-control"] = nil
|
||||
data.raw["tips-and-tricks-item"]["copy-paste-spidertron"] = nil
|
||||
data.raw["tips-and-tricks-item"]["circuit-network"] = nil
|
||||
data.raw["tips-and-tricks-item"]["connect-switch"] = nil
|
||||
|
||||
-- Remove menu simulations
|
||||
data.raw["utility-constants"]["default"].main_menu_simulations.nauvis_biter_base_laser_defense = nil
|
||||
|
||||
-- Remove behemoth enemies
|
||||
data.raw["unit"]["behemoth-biter"] = nil
|
||||
data.raw["unit"]["behemoth-spitter"] = nil
|
||||
data.raw["turret"]["behemoth-worm-turret"] = nil
|
||||
data.raw["corpse"]["behemoth-biter-corpse"] = nil
|
||||
data.raw["corpse"]["behemoth-spitter-corpse"] = nil
|
||||
data.raw["corpse"]["behemoth-worm-corpse"] = nil
|
||||
data.raw["corpse"]["behemoth-worm-corpse-burrowed"] = nil
|
||||
data.raw["unit-spawner"]["biter-spawner"].result_units = (function()
|
||||
local res = {}
|
||||
res[1] = { "small-biter", { { 0.0, 0.3 }, { 0.6, 0.0 } } }
|
||||
if not data.is_demo then
|
||||
res[2] = { "medium-biter", { { 0.4, 0.0 }, { 0.6, 0.3 }, { 0.8, 0.1 } } }
|
||||
res[3] = { "big-biter", { { 0.8, 0.0 }, { 1.0, 0.4 } } }
|
||||
end
|
||||
return res
|
||||
end)()
|
||||
data.raw["unit-spawner"]["spitter-spawner"].result_units = {
|
||||
{ "small-biter", { { 0.0, 0.3 }, { 0.55, 0 } } },
|
||||
{ "small-spitter", { { 0.2, 0.0 }, { 0.4, 0.3 }, { 0.6, 0.0 } } },
|
||||
{ "medium-spitter", { { 0.4, 0.0 }, { 0.6, 0.3 }, { 0.8, 0.1 } } },
|
||||
{ "big-spitter", { { 0.8, 0.0 }, { 1.0, 0.4 } } }
|
||||
}
|
||||
data.raw["group-attack-achievement"]["it-stinks-and-they-dont-like-it"].entities = table.filter(
|
||||
data.raw["group-attack-achievement"]["it-stinks-and-they-dont-like-it"].entities,
|
||||
function(value)
|
||||
return not table.contains({ "behemoth-biter", "behemoth-spitter" }, value)
|
||||
end
|
||||
)
|
||||
|
||||
-- Remove uranium
|
||||
data.raw["resource"]["uranium-ore"] = nil
|
||||
data.raw["autoplace-control"]["uranium-ore"] = nil
|
||||
data.raw["planet"]["nauvis"].map_gen_settings.autoplace_controls["uranium-ore"] = nil
|
||||
data.raw["planet"]["nauvis"].map_gen_settings.autoplace_settings["entity"].settings["uranium-ore"] = nil
|
||||
data.raw["map-gen-presets"]["default"]["rich-resources"].basic_settings.autoplace_controls["uranium-ore"] = nil
|
||||
data.raw["map-gen-presets"]["default"]["rail-world"].basic_settings.autoplace_controls["uranium-ore"] = nil
|
||||
data.raw["map-gen-presets"]["default"]["ribbon-world"].basic_settings.autoplace_controls["uranium-ore"] = nil
|
||||
util.removeEverythingByItem("uranium-235")
|
||||
util.removeEverythingByItem("uranium-238")
|
||||
util.removeEverythingByItem("depleted-uranium-fuel-cell")
|
||||
|
||||
-- Buff rocket silo
|
||||
data.raw["rocket-silo"]["rocket-silo"].rocket_parts_required = 25
|
||||
|
||||
-- Buff LDS
|
||||
Recipe:new("low-density-structure")
|
||||
:replaceIngredient("copper-plate", 2)
|
||||
:replaceIngredient("steel-plate", 1)
|
||||
|
||||
-- Update character
|
||||
data.raw["character"]["character"].animations[3].armors = table.filter(data.raw["character"]["character"].animations[3].armors, function(value)
|
||||
return value ~= "power-armor-mk2"
|
||||
end)
|
||||
data.raw["character-corpse"]["character-corpse"].armor_picture_mapping["power-armor-mk2"] = nil
|
||||
|
||||
-- Increase moisture
|
||||
data.raw.planet["nauvis"].map_gen_settings.autoplace_controls["starting_area_moisture"] = { size = 2, richness = 6 }
|
||||
16
factorio-light/info.json
Normal file
16
factorio-light/info.json
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"name": "factorio-light",
|
||||
"version": "1.0.0",
|
||||
"title": "Factorio light",
|
||||
"description": "A light-weight version of Factorio for a chill round or your kids.",
|
||||
"author": "cackling fiend",
|
||||
"homepage": "https://discord.gg/ufvFUJtVwk",
|
||||
"factorio_version": "2.0",
|
||||
"dependencies": [
|
||||
"base",
|
||||
"cf-lib >= 1.4.0",
|
||||
"? elevated-rails",
|
||||
"! space-age",
|
||||
"! quality"
|
||||
]
|
||||
}
|
||||
BIN
factorio-light/thumbnail.png
Normal file
BIN
factorio-light/thumbnail.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
213
factorio-light/util.lua
Normal file
213
factorio-light/util.lua
Normal file
|
|
@ -0,0 +1,213 @@
|
|||
local util = {}
|
||||
|
||||
util.removeTechWithPrerequisite = function(name)
|
||||
for techName, technology in pairs(data.raw.technology) do
|
||||
if technology.prerequisites and table.contains(technology.prerequisites, name) then
|
||||
data.raw.technology[techName] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.removeAchievementByItem = function(name)
|
||||
for type in pairs(defines.prototypes['achievement']) do
|
||||
if data.raw[type] then
|
||||
for achievementName, achievement in pairs(data.raw[type]) do
|
||||
if achievement.ammo_type == name or achievement.consumed_condition == name
|
||||
or achievement.produced_condition == name or achievement.science_pack == name then
|
||||
data.raw[type][achievementName] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.removeAchievementByEntity = function(name)
|
||||
for protoType in pairs(defines.prototypes['achievement']) do
|
||||
if data.raw[protoType] then
|
||||
local match = function(stringOrTable)
|
||||
if stringOrTable == nil then
|
||||
return false
|
||||
end
|
||||
local tableValue = type(stringOrTable) == "string" and { stringOrTable } or stringOrTable
|
||||
return table.contains(tableValue, name)
|
||||
end
|
||||
|
||||
for achievementName, achievement in pairs(data.raw[protoType]) do
|
||||
if achievement.to_build == name or match(achievement.to_kill) or match(achievement.damage_dealer)
|
||||
or achievement.entity == name or match(achievement.excluded) or match(achievement.included) then
|
||||
data.raw[protoType][achievementName] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.removeOrHide = function(type, name, options)
|
||||
local hide = options and options.hideEntity or false
|
||||
if options and options.skip then
|
||||
if table.contains(options.skip, name) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
if options and options.hideEntities then
|
||||
if table.contains(options.hideEntities, name) then
|
||||
hide = true
|
||||
end
|
||||
end
|
||||
if hide then
|
||||
data.raw[type][name].hidden = true
|
||||
data.raw[type][name].hidden_in_factoriopedia = true
|
||||
else
|
||||
data.raw[type][name] = nil
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
util.removeEntity = function(name, options)
|
||||
for type in pairs(table.merge(defines.prototypes['entity'], defines.prototypes['equipment'])) do
|
||||
if data.raw[type] then
|
||||
local entity = data.raw[type][name]
|
||||
if entity then
|
||||
util.removeOrHide(type, name, options)
|
||||
util.removeAchievementByEntity(name)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.removeEverythingByItem = function(name, options)
|
||||
for type in pairs(defines.prototypes['item']) do
|
||||
if data.raw[type] then
|
||||
local item = data.raw[type][name]
|
||||
if item then
|
||||
if item.place_result then
|
||||
util.removeEntity(item.place_result, options)
|
||||
end
|
||||
if item.place_as_equipment_result then
|
||||
util.removeEntity(item.place_as_equipment_result, options)
|
||||
end
|
||||
util.removeOrHide(type, name, options)
|
||||
|
||||
for customInputName, customInput in pairs(data.raw["custom-input"]) do
|
||||
if customInput.item_to_spawn == name then
|
||||
data.raw["custom-input"][customInputName] = nil
|
||||
end
|
||||
end
|
||||
|
||||
util.removeAchievementByItem(name)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.removeEverythingByRecipe = function(name, options)
|
||||
local recipe = data.raw.recipe[name]
|
||||
local removed = util.removeOrHide("recipe", name, options)
|
||||
if not removed then
|
||||
return
|
||||
end
|
||||
if recipe.main_product then
|
||||
util.removeEverythingByItem(recipe.main_product, options)
|
||||
elseif recipe.results and #recipe.results == 1 and recipe.results[1].type == "item" then
|
||||
util.removeEverythingByItem(recipe.results[1].name, options)
|
||||
end
|
||||
data.raw.recipe[name] = nil
|
||||
end
|
||||
|
||||
util.removeEverythingByTechnology = function(name, options)
|
||||
local technology = data.raw.technology[name]
|
||||
if technology and technology.effects then
|
||||
for _, effect in pairs(technology.effects) do
|
||||
if effect.type == "unlock-recipe" then
|
||||
util.removeEverythingByRecipe(effect.recipe, options)
|
||||
end
|
||||
end
|
||||
end
|
||||
data.raw.technology[name] = nil
|
||||
|
||||
for shortcutName, shortcut in pairs(data.raw.shortcut) do
|
||||
if shortcut.technology_to_unlock then
|
||||
data.raw.shortcut[shortcutName] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.removeEverythingRecursivelyByTechnology = function(name, options)
|
||||
util.removeEverythingByTechnology(name, options)
|
||||
|
||||
for techName, technology in pairs(data.raw.technology) do
|
||||
if technology.prerequisites and table.contains(technology.prerequisites, name) then
|
||||
util.removeEverythingRecursivelyByTechnology(techName, options)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.replacePrerequisite = function(source, target)
|
||||
for _, technology in pairs(data.raw.technology) do
|
||||
if technology.prerequisites and table.contains(technology.prerequisites, source) then
|
||||
table.removeValue(technology.prerequisites, source)
|
||||
if not table.contains(technology.prerequisites, target) then
|
||||
table.insert(technology.prerequisites, target)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.replaceTechIngredient = function(old, new)
|
||||
for _, technology in pairs(data.raw.technology) do
|
||||
if technology.unit and technology.unit.ingredients then
|
||||
local matchOld = table.filter(technology.unit.ingredients, function(v)
|
||||
return v[1] == old
|
||||
end)
|
||||
local matchNew = table.filter(technology.unit.ingredients, function(v)
|
||||
return v[1] == new
|
||||
end)
|
||||
if #matchNew > 0 then
|
||||
technology.unit.ingredients = table.filter(technology.unit.ingredients, function(v)
|
||||
return v[1] ~= old
|
||||
end)
|
||||
elseif #matchOld > 0 then
|
||||
matchOld[1][1] = new
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.replaceRecipeIngredient = function(old, new, multiplier)
|
||||
multiplier = multiplier or 1
|
||||
local function replace(tbl)
|
||||
if not tbl then return end
|
||||
for _, entry in pairs(tbl) do
|
||||
if entry.name == old then
|
||||
entry.name = new
|
||||
if entry.amount then
|
||||
entry.amount = entry.amount * multiplier
|
||||
end
|
||||
if entry.amount_min then
|
||||
entry.amount_min = entry.amount_min * multiplier
|
||||
end
|
||||
if entry.amount_max then
|
||||
entry.amount_max = entry.amount_max * multiplier
|
||||
end
|
||||
if entry.ignored_by_stats then
|
||||
entry.ignored_by_stats = entry.ignored_by_stats * multiplier
|
||||
end
|
||||
if entry.ignored_by_productivity then
|
||||
entry.ignored_by_productivity = entry.ignored_by_productivity * multiplier
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for _, recipe in pairs(data.raw["recipe"]) do
|
||||
replace(recipe.ingredients)
|
||||
replace(recipe.results)
|
||||
if recipe.main_product == old then
|
||||
recipe.main_product = new
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return util
|
||||
BIN
sources/thumbnail.afphoto
Normal file
BIN
sources/thumbnail.afphoto
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue