z_mirror/Krastorio2

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

Caleb HeuerChange to four-space indentation07409ca6

four-space-indentation
6.9 KiB200 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    end,
181    ["2.0.7"] = function()
182        if storage.intergalactic_transceiver then
183            storage.intergalactic_transceiver.player_in_cutscene = {}
184            for force_index in pairs(storage.intergalactic_transceiver.in_cutscene) do
185                local force = game.forces[force_index]
186                if force then
187                    for _, player in pairs(force.players) do
188                        if player.controller_type == defines.controllers.cutscene then
189                            storage.intergalactic_transceiver.player_in_cutscene[player.index] = true
190                        end
191                    end
192                end
193            end
194        end
195    end,
196
197    -- STOP! Do not add any more migrations here. Use Lua migration files instead.
198}
199
200return migrations