--- a/more-descriptions/data-final-fixes.lua Sun Jun 29 23:37:36 2025 +0300 +++ b/more-descriptions/data-final-fixes.lua Mon Jun 30 13:04:59 2025 +0300 @@ -1,3 +1,23 @@ +local function seconds(x) + return {"time-symbol-seconds", tostring(x)} +end + +local function build_new_description(main_description, new_descriptions) + local new_localised_description = { + "", + main_description, + } + for i, k in pairs(new_descriptions) + do + if i ~= 1 + then + table.insert(new_localised_description, "\n") + end + table.insert(new_localised_description, k) + end + return new_localised_description +end + local item_categories = { "item", @@ -99,6 +119,7 @@ "linked-container", "proxy-container", "heat-interface", + "heat-pipe", "lane-splitter", "linked-belt", "valve", @@ -163,14 +184,48 @@ return nil end +local ammo_categories = {} + +for _, ammo in pairs(data.raw.ammo) +do + if not ammo_categories[ammo.ammo_category] + then + ammo_categories[ammo.ammo_category] = "" + end + if #ammo_categories[ammo.ammo_category] < 120 + then + ammo_categories[ammo.ammo_category] = ammo_categories[ammo.ammo_category].."[item="..ammo.name.."]" + elseif string.sub(ammo_categories[ammo.ammo_category], -3, -1) ~= "..." + then + ammo_categories[ammo.ammo_category] = ammo_categories[ammo.ammo_category] .. "..." + end +end + for _, item_type in pairs(item_categories) do for _, item in pairs(data.raw[item_type] or {}) do local new_descriptions = {} - local refining_recipe = data.raw.recipe[item.name.."-refining"] local recycling_recipe = data.raw.recipe[item.name.."-recycling"] + local add_description = function(x) + table.insert(new_descriptions, x) + end + + local add_ammo_from_attack_parameters = function(attack_parameters) + if attack_parameters.ammo_category and ammo_categories[attack_parameters.ammo_category] + then + add_description{"more-descriptions-mod.gun-accepts-ammo", ammo_categories[attack_parameters.ammo_category]} + end + for _, category in pairs(attack_parameters.ammo_categories or {}) + do + if ammo_categories[category] + then + add_description{"more-descriptions-mod.gun-accepts-ammo", ammo_categories[category]} + end + end + end + if recycling_recipe ~= nil then local recycling_results = {""} @@ -178,29 +233,51 @@ do table.insert(recycling_results, "[img="..result.type.."."..result.name.."]") end - table.insert(new_descriptions, { + add_description{ "more-descriptions-mod.recycling", - tostring(recycling_recipe.energy_required), + seconds(recycling_recipe.energy_required), recycling_results - }) + } end if mods["promethium-quality"] then + local refining_recipe = data.raw.recipe[item.name.."-refining"] if refining_recipe ~= nil then - table.insert(new_descriptions, { + add_description{ "more-descriptions-mod.refining-cost", tostring(refining_recipe.energy_required), - }) + } elseif recycling_recipe ~= nil then - table.insert(new_descriptions, { - "more-descriptions-mod.cannot-be-refined", - }) + add_description{"more-descriptions-mod.cannot-be-refined"} end end + if item.type == "ammo" and (item.reload_time or 0) > 0 + then + add_description{ + "more-descriptions-mod.reload-time", + seconds(tostring(item.reload_time / 60.0)), + } + end + + if item.type == "active-defense-equipment" and item.automatic + then + add_description{"more-descriptions-mod.fires-automatically"} + end + + if item.type == "armor" and item.provides_flight + then + add_description{"more-descriptions-mod.armor-provides-flight"} + end + + if item.type == "gun" + then + add_ammo_from_attack_parameters(item.attack_parameters) + end + local entity = item.place_result and find_entity(item.place_result) or nil if entity ~= nil then @@ -209,11 +286,156 @@ local cb = entity.collision_box local width = math.ceil(cb[2][1] - cb[1][1]) local height = math.ceil(cb[2][2] - cb[1][2]) - table.insert(new_descriptions, { + add_description{ "more-descriptions-mod.size", tostring(width), tostring(height), - }) + } + end + + if entity.drops_full_belt_stacks + then + add_description{"more-descriptions-mod.drops-full-belt-stacks"} + end + + if entity.heat_buffer and entity.heat_buffer.specific_heat + then + add_description{ + "more-descriptions-mod.specific-heat", + entity.heat_buffer.specific_heat, + } + elseif entity.energy_source + and entity.energy_source.type == "heat" + and entity.energy_source.specific_heat + then + add_description{ + "more-descriptions-mod.specific-heat", + entity.energy_source.specific_heat, + } + end + + if entity.is_military_target + then + add_description{"more-descriptions-mod.is-military-target"} + end + + if entity.type == "agricultural-tower" + then + local cb = entity.collision_box + local W = math.ceil(cb[2][1] - cb[1][1]) + local w = (entity.growth_grid_tile_size or 3) + -- width of the "buffer" area around the agricultural tower + local z = (2 * w * math.ceil((W - w) / 2 / w)) + w + -- num of growth cells extending from the edges of the tower + local r = math.floor(entity.radius) -- why is it double..? + add_description{"more-descriptions-mod.agricultural-tower-num-inputs", + tostring(entity.input_inventory_size) + } + add_description{"more-descriptions-mod.agricultural-tower-growth-cell-size", + tostring(w) + } + add_description{"more-descriptions-mod.agricultural-tower-growth-cell-count", + tostring(4 * r * (r + (z / w))) + } + add_description{"more-descriptions-mod.agricultural-tower-total-size", + tostring(z + 2 * r * w) + } + elseif entity.type == "ammo-turret" + then + if entity.energy_per_shot ~= nil + then + add_description{"more-descriptions-mod.energy-per-shot-fired", + entity.energy_per_shot} + end + add_ammo_from_attack_parameters(entity.attack_parameters) + elseif entity.type == "beacon" + then + add_description{"more-descriptions-mod.beacon-supply-area-distance", + tostring(entity.supply_area_distance) + } + elseif entity.type == "car" + then + local immunities = "" + if (entity.immune_to_tree_impacts or false) + then + immunities = immunities.."[entity=tree-01]" + end + if (entity.immune_to_rock_impacts or false) + then + immunities = immunities.."[entity=big-rock]" + end + if (entity.immune_to_cliff_impacts or true) + then + immunities = immunities.."[entity=cliff]" + end + if immunities ~= "" + then + add_description{"more-descriptions-mod.car-immune-to-impacts", immunities} + end + elseif entity.type == "constant-combinator" + then + -- used by pushbutton mod + if (entity.pulse_duration or 0) > 60 + then + add_description{"more-descriptions-mod.constant-combinator-pulse-duration", + seconds(entity.pulse_duration / 60.0)} + elseif (entity.pulse_duration or 0) > 0 + then + add_description{"more-descriptions-mod.constant-combinator-pulse-duration", + {"more-descriptions-mod.ticks", tostring(entity.pulse_duration)}} + end + elseif (entity.type == "container" or entity.type == "logistic-container") + then + if entity.inventory_type == "with_filters_and_bar" + then + add_description{"more-descriptions-mod.container-filters"} + end + elseif entity.type == "cargo-wagon" + then + -- all cargo wagons support filters + add_description{"more-descriptions-mod.container-filters"} + elseif entity.type == "display-panel" + then + add_description{"more-descriptions-mod.display-panel-max-text-width", + tostring(entity.max_text_width or 400)} + elseif entity.type == "logistic-robot" or entity.type == "construction-robot" + then + if entity.speed_multiplier_when_out_of_energy > 0 + then + add_description{"more-descriptions-mod.robot-speed-multiplier-when-out-of-energy", + tostring(entity.speed_multiplier_when_out_of_energy * 100)} + else + add_description{"more-descriptions-mod.robot-crashes-when-out-of-energy"} + end + elseif entity.type == "inserter" + then + if entity.wait_for_full_hand + then + add_description{"more-descriptions-mod.inserter-wait-for-full-hand", + tostring(entity.filter_count)} + end + elseif entity.type == "land-mine" + then + add_description{"more-descriptions-mod.land-mine-timeout", + seconds((entity.timeout or 120) / 60.0)} + elseif entity.type == "radar" + then + if entity.connects_to_other_radars ~= false + then + add_description{"more-descriptions-mod.radar-connection"} + end + end + if entity.filter_count + then + add_description{"more-descriptions-mod.filter-count", + tostring(entity.filter_count)} + end + for _, flag in pairs(entity.flags or {}) + do + if flag == "no-automated-item-insertion" + then + table.insert(new_descriptions, {"more-descriptions-mod.no-automated-item-insertion"}) + end end end @@ -227,18 +449,7 @@ {"", {"item-description."..item.name}, "\n"}, "" } - item.localised_description = { - "", - main_description, - } - for i, k in pairs(new_descriptions) - do - if i ~= 1 - then - table.insert(item.localised_description, "\n") - end - table.insert(item.localised_description, k) - end + item.localised_description = build_new_description(main_description, new_descriptions) end end end @@ -261,17 +472,77 @@ {"", {"recipe-description."..recipe.name}, "\n"}, "" } - recipe.localised_description = { - "", - main_description, - } - for i, k in pairs(new_descriptions) + recipe.localised_description = build_new_description(main_description, new_descriptions) + end +end + +-- Stuff mostly specific for entities that you don't place with items (like biters) +for _, entity_category in pairs(entity_categories) +do + for _, entity in pairs(data.raw[entity_category] or {}) + do + local new_descriptions = {} + + if entity.minable + then + table.insert(new_descriptions, {"more-descriptions-mod.mining-time", + seconds(entity.minable.mining_time)}) + end + + for _, flag in pairs(entity.flags or {}) do - if i ~= 1 + if flag == "breaths-air" + then + table.insert(new_descriptions, {"more-descriptions-mod.breathes-air"}) + end + end + + if entity.type == "unit-spawner" + then + if (entity.time_to_capture or 0) > 0 then - table.insert(recipe.localised_description, "\n") + table.insert(new_descriptions, {"more-descriptions-mod.unit-spawner-time-to-capture", + seconds(entity.time_to_capture / 60.0)}) end - table.insert(recipe.localised_description, k) + end + + if #new_descriptions > 0 + then + local main_description = entity.localised_description + and {"", entity.localised_description, "\n"} + or { + "?", + {"", {"entity-description."..entity.name}, "\n"}, + "" + } + entity.localised_description = build_new_description(main_description, new_descriptions) end end end + +for _, space_location in pairs(data.raw["space-location"]) +do + local new_descriptions = {} + + if (space_location.fly_condition or false) + then + table.insert(new_descriptions, {"more-descriptions-mod.space-location-fly-condition"}) + end + + if space_location.auto_save_on_first_trip == false -- (nil=true) + then + table.insert(new_descriptions, {"more-descriptions-mod.space-location-no-autosave"}) + end + + if #new_descriptions > 0 + then + local main_description = space_location.localised_description + and {"", space_location.localised_description, "\n"} + or { + "?", + {"", {"space-location-description."..space_location.name}, "\n"}, + "" + } + space_location.localised_description = build_new_description(main_description, new_descriptions) + end +end \ No newline at end of file