88 lines
3.4 KiB
Lua

local table = require("__flib__.table")
local util = require("scripts.util")
local properties_by_type = {
["active-defense-equipment"] = { { "energy_consumption", "energy" } },
["battery-equipment"] = {},
["belt-immunity-equipment"] = { { "energy_consumption", "energy" } },
["energy-shield-equipment"] = {
{ "energy_consumption", "energy" },
{ "shield", "number", "shield_points" },
{ "energy_per_shield", "energy", "energy_per_shield_point" },
},
["generator-equipment"] = { { "energy_production", "energy" } },
["movement-bonus-equipment"] = { { "energy_consumption", "energy" }, { "movement_bonus", "percent" } },
["night-vision-equipment"] = { { "energy_consumption", "energy" } },
["roboport-equipment"] = { { "energy_consumption", "energy" } },
["solar-panel-equipment"] = { { "energy_production", "energy" } },
}
local function get_equipment_property(properties, source, name, formatter, label)
local value = source[name]
if value and value > 0 then
table.insert(properties, {
type = "plain",
label = label or name,
value = value,
formatter = formatter,
})
end
end
return function(database)
--- @type table<string, LuaEquipmentPrototype>
local prototypes = global.prototypes.equipment
for name, prototype in pairs(prototypes) do
local fuel_categories
local burner = prototype.burner_prototype
if burner then
fuel_categories = util.convert_categories(burner.fuel_categories, "fuel_category")
end
for _, category in pairs(prototype.equipment_categories) do
local category_data = database.equipment_category[category]
category_data.equipment[#category_data.equipment + 1] = { class = "equipment", name = name }
end
local equipment_type = prototype.type
local properties = {}
for _, property in pairs(properties_by_type[equipment_type]) do
get_equipment_property(properties, prototype, property[1], property[2], property[3])
end
local energy_source = prototype.energy_source
if energy_source then
get_equipment_property(properties, energy_source, "buffer_capacity", "energy_storage")
end
if equipment_type == "roboport-equipment" then
local logistic_parameters = prototype.logistic_parameters
get_equipment_property(properties, logistic_parameters, "logistic_radius", "number")
get_equipment_property(properties, logistic_parameters, "construction_radius", "number")
get_equipment_property(properties, logistic_parameters, "robot_limit", "number")
get_equipment_property(properties, logistic_parameters, "charging_energy", "energy")
end
database.equipment[name] = {
can_burn = {},
class = "equipment",
enabled = true,
equipment_categories = table.map(prototype.equipment_categories, function(category)
return { class = "equipment_category", name = category }
end),
equipment_properties = properties,
fuel_categories = fuel_categories,
hidden = false,
placed_in = util.unique_obj_array(),
prototype_name = name,
science_packs = {},
size = prototype.shape and prototype.shape.width or nil, -- Equipments can have irregular shapes
take_result = prototype.take_result and { class = "item", name = prototype.take_result.name } or nil,
unlocked_by = {},
}
util.add_to_dictionary("equipment", name, prototype.localised_name)
util.add_to_dictionary("equipment_description", name, prototype.localised_description)
end
end