From 92c156fbfba3bcfee03888a880b4c60275e813cb Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Sat, 27 Jul 2024 16:14:13 +0300 Subject: [PATCH] Remove the core/displayer split (#4) --- changelog.txt | 2 + migrations/10-from-realistic-reactors.lua | 5 +- migrations/20-from-ur-v0.1.2.lua | 5 + prototypes/category_fix.lua | 4 - prototypes/entities.lua | 22 +--- prototypes/items.lua | 16 --- scripts/entity/reactor.lua | 136 +++------------------- scripts/entity/util.lua | 8 -- scripts/formulas.lua | 4 +- scripts/heat/network.lua | 3 - 10 files changed, 25 insertions(+), 180 deletions(-) create mode 100644 migrations/20-from-ur-v0.1.2.lua diff --git a/changelog.txt b/changelog.txt index d3e2a5a..9ce1e11 100644 --- a/changelog.txt +++ b/changelog.txt @@ -14,3 +14,5 @@ Date: 2024-07-17 --------------------------------------------------------------------------------------------------- Version: 0.1.3 Date: UNRELEASED + Changes: + - replaced multi-entity power generation dance with direct temperature manipulation diff --git a/migrations/10-from-realistic-reactors.lua b/migrations/10-from-realistic-reactors.lua index de1336a..92fcbb5 100644 --- a/migrations/10-from-realistic-reactors.lua +++ b/migrations/10-from-realistic-reactors.lua @@ -59,7 +59,6 @@ local function find_reactors() local p = reactor_entity.position local subs = get_subs(surface.find_entities({{p.x-1.5, p.y-1.5}, {p.x+1.5, p.y+1.5}}), { entity = reactor_entity.name, - core = function(name) return string.match(name, "realistic%-reactor%-%d+") end, interface = E2I_NAME[reactor_entity.name], eccs = BOILER_ENTITY_NAME, power = POWER_NAME[reactor_entity.name], @@ -68,13 +67,11 @@ local function find_reactors() }) local reactor = { id = subs.entity.unit_number, -- ID of the reactor (doesn't change) - core_id = subs.core.unit_number, -- ID of the core (changes when core is replaced) - core = subs.core, -- core entity interface = subs.interface, -- interface entity eccs = subs.eccs, -- eccs entity power = subs.power, -- power entity entity = subs.entity, -- displayer entity - position = subs.core.position, -- core position = reactor position + position = subs.entity.position, state = 0, -- reactor state state_active_since = game.tick - TICKS_PER_UPDATE, -- state begin neighbours = 1, -- number of connected reactors and itself diff --git a/migrations/20-from-ur-v0.1.2.lua b/migrations/20-from-ur-v0.1.2.lua new file mode 100644 index 0000000..e3bd5d7 --- /dev/null +++ b/migrations/20-from-ur-v0.1.2.lua @@ -0,0 +1,5 @@ +for _, reactor in pairs(global.reactors) do + reactor.core = nil + reactor.core_id = nil + reactor.entity.temperature = reactor.signals.parameters.core_temperature +end diff --git a/prototypes/category_fix.lua b/prototypes/category_fix.lua index bd2dad8..bc01ca7 100644 --- a/prototypes/category_fix.lua +++ b/prototypes/category_fix.lua @@ -20,7 +20,3 @@ end insert_categories(data.raw.reactor["realistic-reactor"]) insert_categories(data.raw.reactor["realistic-reactor-normal"]) insert_categories(data.raw.reactor["realistic-reactor-breeder"]) - -for i=1, 250 do - insert_categories(data.raw.reactor["realistic-reactor-"..i]) -end diff --git a/prototypes/entities.lua b/prototypes/entities.lua index 9172675..b103dea 100644 --- a/prototypes/entities.lua +++ b/prototypes/entities.lua @@ -220,7 +220,7 @@ reactor_template = { flags = {"not-deconstructable", unpack(REACTOR_TEMPLATE_ENTITY_FLAGS)}, max_health = 500, corpse = "big-remnants", - consumption = "40MW", + consumption = "0.00001W", neighbour_bonus = 0, selectable_in_game = false, vehicle_impact_sound = {filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65}, @@ -293,7 +293,6 @@ reactor_normal.flags = {"not-rotatable", "hide-alt-info", unpack(REACTOR_ENTITY_ reactor_normal.placeable_by = {item="realistic-reactor", count = 1} reactor_normal.resistances = REACTOR_RESISTANCES_ATTRS reactor_normal.minable = {mining_time = 1.5, result = "realistic-reactor"} -reactor_normal.consumption = "0.00001W" reactor_normal.collision_box = {{-1.3, -1.3}, {1.3, 1.4}} --reactor_normal.selection_box = {{-1.4, -1.9}, {1.4, 0.5}} reactor_normal.selection_box = {{-1.4, -1.8}, {1.4, 1.35}} --eccs would not be selectable, but interface would. @@ -349,8 +348,6 @@ reactor_normal.heat_lower_layer_picture = apply_heat_pipe_glow{ shift = REACTOR_DEFAULT_PICTURE_ATTRS.shift, } -reactor_normal.heat_buffer.specific_heat = "1kJ" -reactor_normal.heat_buffer.max_transfer = "0.00001W" reactor_normal.heat_buffer.heat_picture = apply_heat_pipe_glow{ filename = "__UnrealisticReactors__/graphics/entity/reactor-heated.png", priority = "extra-high", @@ -395,23 +392,6 @@ reactor_default.resistances = {} table.insert(reactor_template.flags, "no-automated-item-insertion") table.insert(reactor_template.flags, "no-automated-item-removal") --- Nuclear reactor x, running phase -for i=1, 250 do - - local temp_reactor = table.deepcopy(reactor_template) - temp_reactor.name = "realistic-reactor-"..i - temp_reactor.collision_mask = {"item-layer"} - temp_reactor.consumption = i.."MW" - - if debug_core then - temp_reactor.selection_box = {{-1.4, -2.5}, {1.4, 1.35}} - temp_reactor.selectable_in_game = true - end - - data:extend({temp_reactor}) - -end - -- Circuit interface entity for nuclear reactor reactor_interface = { type = "constant-combinator", diff --git a/prototypes/items.lua b/prototypes/items.lua index 09ec6e2..5cd7c0b 100644 --- a/prototypes/items.lua +++ b/prototypes/items.lua @@ -90,20 +90,4 @@ data:extend{ place_result = "realistic-breeder-interface", stack_size = 50, }, - - -- Dummy Fuel Cell for Reactor Core - { - type = "item", - name = "rr-dummy-fuel-cell", - flags = {"hidden","hide-from-bonus-gui","hide-from-fuel-tooltip"}, - icon = "__base__/graphics/icons/uranium-fuel-cell.png", - icon_size = 32, - subgroup = "intermediate-product", - order = "r[uranium-processing]-a[uranium-fuel-cell]", - fuel_category = "nuclear", - burnt_result = "used-up-uranium-fuel-cell", - fuel_value = "9223372035GJ", - stack_size = 50, - }, - } diff --git a/scripts/entity/reactor.lua b/scripts/entity/reactor.lua index d615524..79fcae7 100644 --- a/scripts/entity/reactor.lua +++ b/scripts/entity/reactor.lua @@ -32,13 +32,7 @@ local function Signals() return { parameters = { -- signals for interface local function add_reactor(entity,interface) local surface = entity.surface local p,f = entity.position,entity.force - local reactor_core = surface.create_entity{ - name = "realistic-reactor-1", - position = p, - force = f, - } --reactor is actually the reactor core - reactor_core.destructible = false --logging("---------------------------------------------------------------") --logging("Adding new reactor: "..entity.name) --logging("Reactor core ID: " .. reactor_core.unit_number) @@ -80,9 +74,6 @@ local function add_reactor(entity,interface) reactor_lamp.destructible = false reactor_light.destructible = false - -- reactor is not active when it is build (state=stopped) - reactor_core.active = false - --max power for gui if Setting.ingos_formula() then reactor_max_power = 123 @@ -95,13 +86,11 @@ local function add_reactor(entity,interface) end local reactor = { id = entity.unit_number, -- ID of the reactor (doesn't change) - core_id = reactor_core.unit_number, -- ID of the core (changes when core is replaced) - core = reactor_core, -- core entity interface = interface, -- interface entity eccs = eccs, -- eccs entity power = power, -- power entity entity = entity, -- displayer entity - position = reactor_core.position, -- core position = reactor position + position = entity.position, -- core position = reactor position state = 0, -- reactor state state_active_since = game.tick, -- state begin neighbours = 1, -- number of connected reactors and itself @@ -126,7 +115,6 @@ local function add_reactor(entity,interface) signals = Signals(), } global.reactors[reactor.id] = reactor - reactor.core.get_fuel_inventory().insert{name="rr-dummy-fuel-cell", count = 50} reactor.control.parameters = reactor.signals.parameters --logging("-> reactor successfully added") --logging("") @@ -192,7 +180,6 @@ local function remove_reactor(entity, tick, has_died) --remove other stuff if reactor.power.valid then reactor.power.destroy() end -- remove power entity if reactor.eccs.valid then reactor.eccs.destroy() end -- remove eccs - if reactor.core.valid then reactor.core.destroy() end if reactor.lamp.valid then reactor.lamp.destroy() end if reactor.light.valid then reactor.light.destroy() end if reactor.interface_warning and reactor.interface_warning.valid then reactor.interface_warning.destroy() end @@ -203,72 +190,6 @@ local function remove_reactor(entity, tick, has_died) end --- replaces the reactor core entity with another one -local function replace_reactor_core(reactor, new_reactor_entity_name) - local temp = reactor.core.temperature - --logging("Building reactor model: "..new_reactor_entity_name) - - --logging("- old reactor ID: " .. reactor.id) - --logging("- old reactor core ID: " .. reactor.core_id) - - -- create new reactor core - local new_reactor_core = reactor.core.surface.create_entity{ - name = new_reactor_entity_name, - position = reactor.core.position, - force = reactor.core.force, - create_build_effect_smoke = false, - } - --logging("- new reactor core ID: " .. new_reactor_core.unit_number) - - -- copy everything from old core to new core - new_reactor_core.copy_settings(reactor.core) --(what is this actually copying???) -- on/off state for example - new_reactor_core.temperature = temp - new_reactor_core.destructible = false - --logging("-> updated temperature: " .. new_reactor_core.temperature) - -- transfer burner heat and remaining fuel in burner - - --if reactor.state == 0 and not (Setting.behavior("scram") == "stop-half-empty") then - -- -- do nothing (don't transfer burner heat to a stopped or scramed reactor) - -- if Setting.behavior("scram") == "consume-additional-cell" and reactor.entity.burner.currently_burning then - -- reactor.entity.get_burnt_result_inventory().insert({name = reactor.entity.burner.currently_burning.burnt_result.name, count = 1}) - -- reactor.entity.burner.currently_burning = nil - -- end - -- - -- --logging("-> burner settings not transferred, state: stopped or scramed") - --else - -- -- transfer current burner settings - -- --if reactor.core.burner.heat > 0 then --not reliable! - -- if reactor.entity.burner.remaining_burning_fuel > 0 then - --new_reactor_core.burner.currently_burning = game.item_prototypes["uranium-fuel-cell"] - --new_reactor_core.burner.currently_burning = reactor.entity.burner.currently_burning - new_reactor_core.burner.currently_burning = "rr-dummy-fuel-cell" - new_reactor_core.burner.remaining_burning_fuel = 9223372035000000000 - new_reactor_core.burner.heat = reactor.entity.burner.heat - --logging("-> updated burner heat: " .. new_reactor_core.burner.heat) - --new_reactor_core.burner.remaining_burning_fuel = reactor.entity.burner.remaining_burning_fuel - --logging("-> updated burner remaining_burning_fuel: " .. new_reactor_core.burner.remaining_burning_fuel) - -- else - -- --logging("-> burner settings not transferred, empty") - -- end - --end - - new_reactor_core.minable = false -- core should be unminable in any case cause its removed via script - - new_reactor_core.get_fuel_inventory().insert{name="rr-dummy-fuel-cell", count = 50} - - - -- destroy old core - reactor.core.destroy() - -- store new core - reactor.core = new_reactor_core - --update reactor core id with new core unit_number - reactor.core_id = new_reactor_core.unit_number - - --logging("-> reactor replaced") - --logging("- new reactor ID: " .. reactor.id) - --logging("- new reactor core ID: " .. reactor.core_id) -end - local function update_reactor_signals(reactor, tick) local inventory = reactor.entity.get_fuel_inventory() local cells = reactor.signals.parameters["uranium-fuel-cells"] @@ -283,7 +204,7 @@ local function update_reactor_signals(reactor, tick) if game.tick - reactor.interface_warning_tick >=60 and reactor.interface_warning and reactor.interface_warning.valid then reactor.interface_warning.destroy() end - reactor.signals.parameters["core_temperature"].count = reactor.core.temperature + reactor.signals.parameters["core_temperature"].count = reactor.entity.temperature local fluid = reactor.eccs.fluidbox[1] if fluid then @@ -320,7 +241,7 @@ local function update_reactor_temperature(reactor, tick) local time_passed = math.max(1,tick - reactor.last_temp_update) reactor.last_temp_update = tick local change_mult = CHANGE_MULTIPLIER * (time_passed / 15) - local reactor_core_temperature = reactor.core.temperature + local reactor_core_temperature = reactor.entity.temperature local reactor_state = reactor.state local powersignal = reactor.signals.parameters["power-output"].count local reactor_efficiency = reactor.efficiency @@ -362,10 +283,10 @@ local function update_reactor_temperature(reactor, tick) local Tchange_reactor_env = (Tdelta_reactor_env * change_mult * 0.1) --logging("-> Tchange_reactor_env: " .. Tchange_reactor_env) if (reactor_core_temperature - Tchange_reactor_env) > 15 then - reactor.core.temperature = reactor_core_temperature - Tchange_reactor_env + reactor.entity.temperature = reactor_core_temperature - Tchange_reactor_env reactor_core_temperature = reactor_core_temperature - Tchange_reactor_env else - reactor.core.temperature = 15 + reactor.entity.temperature = 15 reactor_core_temperature = 15 end ]] @@ -380,8 +301,8 @@ local function update_reactor_temperature(reactor, tick) end end - -- do decay heat effect if state is scramed - if reactor_state == 3 and Setting.behavior("scram") == "decay-heat-v1" then + -- generate power + if reactor_state ~= 0 then reactor_core_temperature = reactor_core_temperature + powersignal/20 end @@ -535,7 +456,7 @@ local function update_reactor_temperature(reactor, tick) -- destroy the reactor core (will trigger meltdown) reactor.entity.die() else - reactor.core.temperature = reactor_core_temperature + reactor.entity.temperature = reactor_core_temperature end end @@ -556,9 +477,7 @@ local function change_reactor_state(new_state, reactor, tick) reactor.signals.parameters["state_running"].count = 0 reactor.signals.parameters["state_scramed"].count = 0 -- configure reactor - replace_reactor_core(reactor,"realistic-reactor-1") reactor.entity.active = false - reactor.core.active = false reactor.entity.minable = true elseif new_state == 1 then --set signals @@ -568,7 +487,6 @@ local function change_reactor_state(new_state, reactor, tick) reactor.signals.parameters["state_scramed"].count = 0 -- configure reactor reactor.entity.active = true - reactor.core.active = true --reactor.debug_start_cell = true reactor.entity.minable = false light_color = "yellow" @@ -580,7 +498,6 @@ local function change_reactor_state(new_state, reactor, tick) reactor.signals.parameters["state_scramed"].count = 0 -- configure reactor reactor.entity.active = true - reactor.core.active = true reactor.entity.minable = false light_color = "green" @@ -592,7 +509,6 @@ local function change_reactor_state(new_state, reactor, tick) reactor.signals.parameters["state_scramed"].count = 1 -- configure reactor if Setting.behavior("scram") == "decay-heat-v1" then - reactor.core.active = false reactor.entity.active = false if reactor.entity.burner.currently_burning then reactor.entity.get_burnt_result_inventory().insert({name = reactor.entity.burner.currently_burning.burnt_result.name, count = 1}) @@ -600,22 +516,21 @@ local function change_reactor_state(new_state, reactor, tick) reactor.entity.burner.currently_burning = nil reactor.entity.burner.remaining_burning_fuel = 0 else - reactor.core.active = true reactor.entity.active = true end reactor.entity.minable = false light_color = "red" end - local p = reactor.core.position - reactor.lamp = reactor.core.surface.create_entity{ + local p = reactor.position + reactor.lamp = reactor.entity.surface.create_entity{ name = "rr-"..light_color.."-lamp", position = {p.x+0.017,p.y+0.88}, - force = reactor.core.force.name, + force = reactor.entity.force.name, } - reactor.light = reactor.core.surface.create_entity{ + reactor.light = reactor.entity.surface.create_entity{ name = "rr-"..light_color.."-light", position = {p.x+0.017,p.y+0.88}, - force = reactor.core.force.name, + force = reactor.entity.force.name, } reactor.lamp.destructible = false reactor.light.destructible = false @@ -625,9 +540,7 @@ end local function update_reactor_states(reactor, tick) --logging("---") --logging("Updating reactor ID: " .. reactor.id) - --logging("Reactor core ID: " .. reactor.core_id) --logging("Reactor type: ".. reactor.entity.name) - --logging("Reactor model: " .. reactor.core.name) --logging("Reactor state: " .. reactor.state) local running_time = math.ceil((tick - reactor.state_active_since)/60) --logging("-> state active for (s): " .. running_time) @@ -785,7 +698,7 @@ local function update_reactor_states(reactor, tick) -- reactor_parameters.bonus_cells = 0 -- end - --logging("-> Temperature="..reactor.core.temperature.." PowerOutput="..reactor_parameters.power.." Efficiency="..math.floor(reactor_parameters.efficiency).." BonusCellAmount: "..reactor_parameters.bonus_cells) + --logging("-> Temperature="..reactor.entity.temperature.." PowerOutput="..reactor_parameters.power.." Efficiency="..math.floor(reactor_parameters.efficiency).." BonusCellAmount: "..reactor_parameters.bonus_cells) --apply material bonus by adding empty fuel cell local burnt_result @@ -865,37 +778,16 @@ local function update_reactor_states(reactor, tick) if reactor_state == 2 or reactor_state == 1 then reactor.power_output_last_tick = reactor_parameters.power end - - - -- replace reactor with updated level version - --logging("Replace reactor model:") - local reactor_to_build = "realistic-reactor-" .. math.max(1,reactor_parameters.power) - --logging("-Reactor to be: "..reactor_to_build) - --logging("-Current reactor: "..reactor.core.name) - if reactor.core.name == reactor_to_build then - --logging("-> Reactor already build.") - elseif not (reactor_state == 3 and Setting.behavior("scram") == "decay-heat-v1") then - replace_reactor_core(reactor,reactor_to_build) - end - end -- UPDATE DISPLAYER -- - reactor.entity.temperature = reactor.core.temperature - reactor.last_states_update = game.tick end -local function is_core(entity) - return string.sub(entity.name, 1, 18) == "realistic-reactor-" - and not E2I_NAME[entity.name] -end - local function is_reactor(entity) return entity.type == "reactor" - and not is_core(entity) end local function reactor_is_empty(entity) diff --git a/scripts/entity/util.lua b/scripts/entity/util.lua index d7a3781..0c332d9 100644 --- a/scripts/entity/util.lua +++ b/scripts/entity/util.lua @@ -20,13 +20,6 @@ local function find_nuclear_ghost(surface, position, name) })[1] end - -local function get_reactor_core_power(entity) - if string.sub(entity.name,1,18) ~= "realistic-reactor-" then return nil end - return tonumber(string.sub(entity.name, 19)) -end - - local function create_warning(entity,kind) local warning = entity.surface.create_entity{ name = "rr-" .. kind .. "-warning", @@ -52,7 +45,6 @@ end return { -- exports create_steam = create_steam, create_warning = create_warning, - get_reactor_core_power = get_reactor_core_power, next_delay = next_delay, find_nuclear_entity = find_nuclear_entity, find_nuclear_ghost = find_nuclear_ghost, diff --git a/scripts/formulas.lua b/scripts/formulas.lua index 58bdca4..50a048e 100644 --- a/scripts/formulas.lua +++ b/scripts/formulas.lua @@ -4,7 +4,7 @@ local Setting = require(rpath .. "setting") -- calculate power output, efficiency, bonus cell production local function calculate_stats_ingo(reactor,state_running_time) - local temperature = reactor.core.temperature + local temperature = reactor.entity.temperature local reactor_neighbours = math.min(reactor.neighbours,4) local power local power_breeder @@ -187,7 +187,7 @@ local function calculate_stats_ownly(reactor,running_time) if fuel_cell ~= nil then fuel_cell_name = fuel_cell.name end - local temperature = reactor.core.temperature + local temperature = reactor.entity.temperature local neighbours = reactor.neighbours local reactors = neighbours reactors = math.min(4,reactors) diff --git a/scripts/heat/network.lua b/scripts/heat/network.lua index a830cd6..2af17ed 100644 --- a/scripts/heat/network.lua +++ b/scripts/heat/network.lua @@ -1,6 +1,5 @@ local rpath = (...):match("(.-)[^%.]+$") local rroot = rpath:match("^([^%.]+%.)") -local get_reactor_core_power = require(rroot .. "entity.util").get_reactor_core_power local mod = require(rpath .. "init") local heat_buffer_transition_position = require(rpath .. "buffer").heat_buffer_transition_position local heat_buffer_transitions = require(rpath .. "buffer").heat_buffer_transitions @@ -549,7 +548,6 @@ local function calculate_corner_index(area, x,y) return i -- {1=(x,y inside area), 2=(x outside area), 3=(y outside area), 4=(x,y outside area)} end local function add_reactor_to_network(entity) - if get_reactor_core_power(entity) then return end -- ignore reactor cores local x,y,z = Coordinates(entity) -- log(string.format("add reactor to network x=%s y=%s z=%s", x,y,z)) local cell = add_entity_to_network_cell(x,y,z,entity) @@ -580,7 +578,6 @@ end local function remove_reactor_from_network(entity) - if get_reactor_core_power(entity) then return end -- ignore reactor cores local x,y,z = Coordinates(entity) local cell = get_heat_network_cell(x,y,z) local reactor = cell and cell.reactors[entity.unit_number]