local biter_virus = require("scripts.biter-virus") local planetary_teleporter = require("scripts.planetary-teleporter") local function ensure_turret_force() if not game.forces["kr-internal-turrets"] then game.create_force("kr-internal-turrets") end end --- @class MigrationsHandler: event_handler local migrations = {} migrations.on_init = ensure_turret_force --- @param e ConfigurationChangedData function migrations.on_configuration_changed(e) local old_version = e.mod_changes and e.mod_changes[script.mod_name] and e.mod_changes[script.mod_name].old_version if not old_version then return end for version, callback in pairs(migrations.versions) do if helpers.compare_versions(version, old_version) > 0 then callback() end end ensure_turret_force() end migrations.events = { [defines.events.on_technology_effects_reset] = function(e) if game.finished or game.finished_but_continuing then e.force.technologies["kr-logo"].enabled = true end end, } migrations.versions = { ["1.2.25"] = function() error("Loading Krastorio 2 saves from versions prior to 1.2.25 is no longer supported.") end, ["1.3.0"] = function() if game.finished or game.finished_but_continuing then for _, force in pairs(game.forces) do force.technologies["kr-logo"].enabled = true end end end, ["1.3.8"] = function() -- Clean up any invalid roboport GUIs local new = {} for player_index, player_gui in pairs(storage.roboport_guis) do if player_gui.valid then new[player_index] = player_gui end end storage.roboport_guis = new end, ["1.3.10"] = function() -- Clean up any orphaned internal entities local valid_unit_numbers = {} for _, data in pairs(storage.tesla_coil.towers) do for _, entity in pairs(data.entities) do if entity.valid then valid_unit_numbers[entity.unit_number or 0] = true end end end --- @diagnostic disable-next-line for _, data in pairs(storage.planetary_teleporter.data) do for _, entity in pairs(data.entities) do if entity.valid then valid_unit_numbers[entity.unit_number or 0] = true end end end for _, surface in pairs(game.surfaces) do for _, entity in pairs(surface.find_entities_filtered({ name = { "kr-planetary-teleporter-turret", "kr-planetary-teleporter-front-layer", "kr-planetary-teleporter-collision-1", "kr-planetary-teleporter-collision-2", "kr-planetary-teleporter-collision-3", "kr-tesla-coil-turret", "kr-tesla-coil-collision", }, })) do if entity.valid and not valid_unit_numbers[entity.unit_number] then entity.destroy() end end end end, ["2.0.0"] = function() storage.creep = nil storage.inserter_has_droplane_gui = nil storage.temp_inserter_settings = nil storage.virus = nil biter_virus.on_init() storage.intergalactic_transceiver.in_cutscene = {} --- @diagnostic disable: undefined-field if storage.inserter_guis then for _, gui in pairs(storage.inserter_guis) do if gui.valid then gui.destroy() end end storage.inserter_guis = nil end if storage.planetary_teleporter and storage.planetary_teleporter.data then --- @type {entity: LuaEntity, name: string?}[] local teleporters = {} for _, data in pairs(storage.planetary_teleporter.data) do local entity = data.entities.base if not entity or not entity.valid then goto continue end for key, stored_entity in pairs(data.entities) do if key ~= "base" and stored_entity.valid then stored_entity.destroy() end end teleporters[#teleporters + 1] = { entity = entity, name = data.name } ::continue:: end storage.planetary_teleporter = nil planetary_teleporter.on_init() for _, data in pairs(teleporters) do planetary_teleporter.migrate_teleporter(data.entity, data.name) end end --- @param force LuaForce --- @param name string local function research(force, tech_name) local tech = force.technologies[tech_name] if tech then tech.researched = true end end for _, force in pairs(game.forces) do if force.technologies["production-science-pack"].researched or force.technologies["utility-science-pack"].researched then local found_basic = false local found_automation = false for _, surface in pairs(game.surfaces) do if surface.count_entities_filtered({ name = "lab" }) > 0 then found_basic = true found_automation = true elseif surface.count_entities_filtered({ name = { "kr-advanced-lab" } }) > 0 then found_automation = true end end if not found_basic then research(force, "kr-laboratory") research(force, "radar") research(force, "repair-pack") end if not found_automation then research(force, "advanced-combinators") research(force, "kr-fusion-reactor-equipment") end end end -- Convert all steel pipes into regular pipes for _, surface in pairs(game.surfaces) do for _, entity in pairs(surface.find_entities_filtered({ name = "kr-steel-pipe" })) do surface.create_entity({ name = "pipe", position = entity.position, direction = entity.direction, mirror = entity.mirroring, quality = entity.quality, force = entity.force, fast_replace = true, player = entity.last_user, raise_built = true, create_build_effect_smoke = false, }) end for _, entity in pairs(surface.find_entities_filtered({ name = "kr-steel-pipe-to-ground" })) do surface.create_entity({ name = "kr-legacy-steel-pipe-to-ground", position = entity.position, direction = entity.direction, mirror = entity.mirroring, quality = entity.quality, force = entity.force, fast_replace = true, player = entity.last_user, raise_built = true, create_build_effect_smoke = false, }) end end end, ["2.0.7"] = function() if storage.intergalactic_transceiver then storage.intergalactic_transceiver.player_in_cutscene = {} for force_index in pairs(storage.intergalactic_transceiver.in_cutscene) do local force = game.forces[force_index] if force then for _, player in pairs(force.players) do if player.controller_type == defines.controllers.cutscene then storage.intergalactic_transceiver.player_in_cutscene[player.index] = true end end end end end end, -- STOP! Do not add any more migrations here. Use Lua migration files instead. } return migrations