z_mirror/Krastorio2

git clone https://git.raiguard.me/z_mirror/Krastorio2

Caleb HeuerFix steel pipes being transmuted when updating K2SO4414062d

trunk
7.0 KiB232 linesraw
1local biter_virus = require("scripts.biter-virus")
2local planetary_teleporter = require("scripts.planetary-teleporter")
3
4local function ensure_turret_force()
5  if not game.forces["kr-internal-turrets"] then
6    game.create_force("kr-internal-turrets")
7  end
8end
9
10--- @class MigrationsHandler: event_handler
11local migrations = {}
12
13migrations.on_init = ensure_turret_force
14
15--- @param e ConfigurationChangedData
16function migrations.on_configuration_changed(e)
17  local old_version = e.mod_changes and e.mod_changes[script.mod_name] and e.mod_changes[script.mod_name].old_version
18  if not old_version then
19    return
20  end
21
22  for version, callback in pairs(migrations.versions) do
23    if helpers.compare_versions(version, old_version) > 0 then
24      callback()
25    end
26  end
27
28  ensure_turret_force()
29end
30
31migrations.events = {
32  [defines.events.on_technology_effects_reset] = function(e)
33    if game.finished or game.finished_but_continuing then
34      e.force.technologies["kr-logo"].enabled = true
35    end
36  end,
37}
38
39migrations.versions = {
40  ["1.2.25"] = function()
41    error("Loading Krastorio 2 saves from versions prior to 1.2.25 is no longer supported.")
42  end,
43  ["1.3.0"] = function()
44    if game.finished or game.finished_but_continuing then
45      for _, force in pairs(game.forces) do
46        force.technologies["kr-logo"].enabled = true
47      end
48    end
49  end,
50  ["1.3.8"] = function()
51    -- Clean up any invalid roboport GUIs
52    local new = {}
53    for player_index, player_gui in pairs(storage.roboport_guis) do
54      if player_gui.valid then
55        new[player_index] = player_gui
56      end
57    end
58    storage.roboport_guis = new
59  end,
60  ["1.3.10"] = function()
61    -- Clean up any orphaned internal entities
62    local valid_unit_numbers = {}
63    for _, data in pairs(storage.tesla_coil.towers) do
64      for _, entity in pairs(data.entities) do
65        if entity.valid then
66          valid_unit_numbers[entity.unit_number or 0] = true
67        end
68      end
69    end
70    --- @diagnostic disable-next-line
71    for _, data in pairs(storage.planetary_teleporter.data) do
72      for _, entity in pairs(data.entities) do
73        if entity.valid then
74          valid_unit_numbers[entity.unit_number or 0] = true
75        end
76      end
77    end
78    for _, surface in pairs(game.surfaces) do
79      for _, entity in
80        pairs(surface.find_entities_filtered({
81          name = {
82            "kr-planetary-teleporter-turret",
83            "kr-planetary-teleporter-front-layer",
84            "kr-planetary-teleporter-collision-1",
85            "kr-planetary-teleporter-collision-2",
86            "kr-planetary-teleporter-collision-3",
87            "kr-tesla-coil-turret",
88            "kr-tesla-coil-collision",
89          },
90        }))
91      do
92        if entity.valid and not valid_unit_numbers[entity.unit_number] then
93          entity.destroy()
94        end
95      end
96    end
97  end,
98  ["2.0.0"] = function()
99    storage.creep = nil
100    storage.inserter_has_droplane_gui = nil
101    storage.temp_inserter_settings = nil
102    storage.virus = nil
103    biter_virus.on_init()
104    storage.intergalactic_transceiver.in_cutscene = {}
105
106    --- @diagnostic disable: undefined-field
107
108    if storage.inserter_guis then
109      for _, gui in pairs(storage.inserter_guis) do
110        if gui.valid then
111          gui.destroy()
112        end
113      end
114      storage.inserter_guis = nil
115    end
116
117    if storage.planetary_teleporter and storage.planetary_teleporter.data then
118      --- @type {entity: LuaEntity, name: string?}[]
119      local teleporters = {}
120      for _, data in pairs(storage.planetary_teleporter.data) do
121        local entity = data.entities.base
122        if not entity or not entity.valid then
123          goto continue
124        end
125
126        for key, stored_entity in pairs(data.entities) do
127          if key ~= "base" and stored_entity.valid then
128            stored_entity.destroy()
129          end
130        end
131
132        teleporters[#teleporters + 1] = { entity = entity, name = data.name }
133
134        ::continue::
135      end
136
137      storage.planetary_teleporter = nil
138
139      planetary_teleporter.on_init()
140      for _, data in pairs(teleporters) do
141        planetary_teleporter.migrate_teleporter(data.entity, data.name)
142      end
143    end
144
145    --- @param force LuaForce
146    --- @param name string
147    local function research(force, tech_name)
148      local tech = force.technologies[tech_name]
149      if tech then
150        tech.researched = true
151      end
152    end
153
154    for _, force in pairs(game.forces) do
155      if
156        force.technologies["production-science-pack"].researched
157        or force.technologies["utility-science-pack"].researched
158      then
159        local found_basic = false
160        local found_automation = false
161        for _, surface in pairs(game.surfaces) do
162          if surface.count_entities_filtered({ name = "lab" }) > 0 then
163            found_basic = true
164            found_automation = true
165          elseif surface.count_entities_filtered({ name = { "kr-advanced-lab" } }) > 0 then
166            found_automation = true
167          end
168        end
169        if not found_basic then
170          research(force, "kr-laboratory")
171          research(force, "radar")
172          research(force, "repair-pack")
173        end
174        if not found_automation then
175          research(force, "advanced-combinators")
176          research(force, "kr-fusion-reactor-equipment")
177        end
178      end
179    end
180
181    -- Convert all steel pipes into regular pipes
182    for _, surface in pairs(game.surfaces) do
183      for _, entity in pairs(surface.find_entities_filtered({ name = "kr-steel-pipe" })) do
184        surface.create_entity({
185          name = "pipe",
186          position = entity.position,
187          direction = entity.direction,
188          mirror = entity.mirroring,
189          quality = entity.quality,
190          force = entity.force,
191          fast_replace = true,
192          player = entity.last_user,
193          raise_built = true,
194          create_build_effect_smoke = false,
195        })
196      end
197      for _, entity in pairs(surface.find_entities_filtered({ name = "kr-steel-pipe-to-ground" })) do
198        surface.create_entity({
199          name = "kr-legacy-steel-pipe-to-ground",
200          position = entity.position,
201          direction = entity.direction,
202          mirror = entity.mirroring,
203          quality = entity.quality,
204          force = entity.force,
205          fast_replace = true,
206          player = entity.last_user,
207          raise_built = true,
208          create_build_effect_smoke = false,
209        })
210      end
211    end
212  end,
213  ["2.0.7"] = function()
214    if storage.intergalactic_transceiver then
215      storage.intergalactic_transceiver.player_in_cutscene = {}
216      for force_index in pairs(storage.intergalactic_transceiver.in_cutscene) do
217        local force = game.forces[force_index]
218        if force then
219          for _, player in pairs(force.players) do
220            if player.controller_type == defines.controllers.cutscene then
221              storage.intergalactic_transceiver.player_in_cutscene[player.index] = true
222            end
223          end
224        end
225      end
226    end
227  end,
228
229  -- STOP! Do not add any more migrations here. Use Lua migration files instead.
230}
231
232return migrations