From 366a16f76db3608c1ba16739c4c9a0b0c19337b8 Mon Sep 17 00:00:00 2001 From: Simon Brodtmann Date: Tue, 21 Jan 2025 23:20:34 +0100 Subject: [PATCH] Migrate control code to using event_handler --- lignumis/control.lua | 185 ++---------------------------- lignumis/script/init-existing.lua | 21 ++++ lignumis/script/init-new.lua | 76 ++++++++++++ lignumis/script/init.lua | 155 +++++++++++++++++++++++++ lignumis/script/to-nauvis.lua | 70 +++++++---- 5 files changed, 309 insertions(+), 198 deletions(-) create mode 100644 lignumis/script/init-existing.lua create mode 100644 lignumis/script/init-new.lua create mode 100644 lignumis/script/init.lua diff --git a/lignumis/control.lua b/lignumis/control.lua index ff5b58c..a4946ba 100644 --- a/lignumis/control.lua +++ b/lignumis/control.lua @@ -1,181 +1,10 @@ -require("script/to-nauvis") +local handler = require("event_handler") -local crash_site = require("crash-site") -local util = require("util") -local e = defines.events +handler.add_libraries({ + require("script/init-existing"), + require("script/init-new"), + require("script/init"), + require("script/to-nauvis") +}) -local function chart_starting_area() - local r = 200 - local force = game.forces.player - local surface = storage.surface - local origin = force.get_spawn_position(surface) - force.chart(surface, { { origin.x - r, origin.y - r }, { origin.x + r, origin.y + r } }) -end -local function correct_space_locations() - local force = game.forces.player - force.technologies["planet-discovery-lignumis"].researched = true - if not force.technologies["planet-discovery-nauvis"].researched then - force.lock_space_location("nauvis") - end -end - -script.on_init(function() - if game.tick > 0 then - storage.init = {} - for _, player in pairs(game.players) do - storage.init[player.index] = true - end - game.print { "", { "lignumis.start-new-game" } } - return - end - - if remote.interfaces.freeplay then - storage.disable_crashsite = remote.call("freeplay", "get_disable_crashsite") - remote.call("freeplay", "set_disable_crashsite", true) - remote.call("freeplay", "set_skip_intro", true) - - if not script.active_mods["wood-military"] then - local respawn_items = remote.call("freeplay", "get_respawn_items") - respawn_items["wood-darts-magazine"] = respawn_items["firearm-magazine"] - respawn_items["firearm-magazine"] = nil - remote.call("freeplay", "set_respawn_items", respawn_items) - - local created_items = remote.call("freeplay", "get_created_items") - created_items["wood-darts-magazine"] = created_items["firearm-magazine"] - created_items["firearm-magazine"] = nil - remote.call("freeplay", "set_created_items", created_items) - end - end - - correct_space_locations() - - storage.surface = game.planets["lignumis"].create_surface() - storage.surface.request_to_generate_chunks({ 0, 0 }, 3) - storage.surface.force_generate_chunk_requests() - storage.surface.daytime = 0.7 -end) - -script.on_event(e.on_player_created, function(event) - if not storage.nauvis_visited then - local nauvis = game.get_surface("nauvis") --[[@as LuaSurface]] - nauvis.clear() - end - - if storage.init and type(storage.init) == "boolean" then - storage.init = { - [event.player_index] = true - } - else - storage.init = {} - end - - local player = game.get_player(event.player_index) --[[@as LuaPlayer]] - local surface = storage.surface or game.planets["lignumis"].surface - - if not storage.init[event.player_index] then - storage.init[event.player_index] = true - chart_starting_area() - - if player then - if player.character then - player.teleport(surface.find_non_colliding_position("character", { 0, 0 }, 0, 1), "lignumis") - player.character.destructible = false - local main_inventory = player.character.get_main_inventory() - main_inventory.insert({ name = "burner-mining-drill", count = 1 }) - main_inventory.insert({ name = "burner-agricultural-tower", count = 2 }) - end - - if remote.interfaces.freeplay then - storage.crashed_ship_items = remote.call("freeplay", "get_ship_items") - storage.crashed_debris_items = remote.call("freeplay", "get_debris_items") - storage.crashed_ship_parts = remote.call("freeplay", "get_ship_parts") - storage.starting_message = remote.call("freeplay", "get_custom_intro_message") - - local ship_items = { ["wood-darts-magazine"] = 2 } - local debris_items = { ["lumber"] = 8 } - - crash_site.create_crash_site(surface, { -5, -6 }, ship_items, debris_items, - table.deepcopy(storage.crashed_ship_parts)) - util.remove_safe(player, storage.crashed_ship_items) - util.remove_safe(player, storage.crashed_debris_items) - - player.get_main_inventory().sort_and_merge() - - storage.crash_site_cutscene_active = true - crash_site.create_cutscene(player, { -5, -4 }) - end - end - end -end) - -script.on_event(e.on_player_changed_surface, function(event) - local player = game.get_player(event.player_index) --[[@as LuaPlayer]] - if player.surface.name == "nauvis" then - storage.nauvis_visited = true - end -end) - -local get_starting_message = function() - if storage.custom_intro_message then - return storage.custom_intro_message - end - return { "msg-intro-space-age" } -end - -local function show_intro_message(player) - if storage.skip_intro then - return - end - - if game.is_multiplayer() then - player.print(get_starting_message()) - else - game.show_message_dialog { text = get_starting_message() } - end -end - -script.on_event(e.on_cutscene_waypoint_reached, function(event) - if not storage.crash_site_cutscene_active then - return - end - if not crash_site.is_crash_site_cutscene(event) then - return - end - - local player = game.get_player(event.player_index) --[[@as LuaPlayer]] - - player.exit_cutscene() - show_intro_message(player) -end) - -script.on_event("crash-site-skip-cutscene", function(event) - if not storage.crash_site_cutscene_active then - return - end - if event.player_index ~= 1 then - return - end - local player = game.get_player(event.player_index) --[[@as LuaPlayer]] - if player.controller_type == defines.controllers.cutscene then - player.exit_cutscene() - end -end) - -script.on_event(e.on_cutscene_cancelled, function(event) - if not storage.crash_site_cutscene_active then - return - end - if event.player_index ~= 1 then - return - end - storage.crash_site_cutscene_active = nil - local player = game.get_player(event.player_index) --[[@as LuaPlayer]] - if player.gui.screen.skip_cutscene_label then - player.gui.screen.skip_cutscene_label.destroy() - end - if player.character then - player.character.destructible = true - end - player.zoom = 1.5 -end) diff --git a/lignumis/script/init-existing.lua b/lignumis/script/init-existing.lua new file mode 100644 index 0000000..b50a7a1 --- /dev/null +++ b/lignumis/script/init-existing.lua @@ -0,0 +1,21 @@ +local InitExisting = {} + +-- Initialization for existing games +-- Don't send players to Lignumis but instead print a warning + +InitExisting.on_init = function() + if game.tick == 0 then + return + end + + storage.init = {} + for _, player in pairs(game.players) do + storage.init[player.index] = true + if player.physical_surface.name == "nauvis" then + storage.nauvis_visited = true + end + end + game.print { "", { "lignumis.start-new-game" } } +end + +return InitExisting diff --git a/lignumis/script/init-new.lua b/lignumis/script/init-new.lua new file mode 100644 index 0000000..ff7eefc --- /dev/null +++ b/lignumis/script/init-new.lua @@ -0,0 +1,76 @@ +local InitNew = {} + +-- Initialization for new games +-- Send all players to Lignumis and clear Nauvis + + +-- Initialize the freeplay intro +local function init_intro() + if not remote.interfaces.freeplay then + return + end + + -- Disable Nauvis intro + remote.call("freeplay", "set_disable_crashsite", true) + remote.call("freeplay", "set_skip_intro", true) + + -- Replace yellow ammo with wood ammo + -- Wooden military does the same already + if not script.active_mods["wood-military"] then + local respawn_items = remote.call("freeplay", "get_respawn_items") + respawn_items["wood-darts-magazine"] = respawn_items["firearm-magazine"] + respawn_items["firearm-magazine"] = nil + remote.call("freeplay", "set_respawn_items", respawn_items) + + local created_items = remote.call("freeplay", "get_created_items") + created_items["wood-darts-magazine"] = created_items["firearm-magazine"] + created_items["firearm-magazine"] = nil + remote.call("freeplay", "set_created_items", created_items) + end +end + + +-- Initialize space locations +-- Lock Nauvis, unlock Lignumis +local function init_space_locations() + local force = game.forces.player + force.technologies["planet-discovery-lignumis"].researched = true + if not force.technologies["planet-discovery-nauvis"].researched then + force.lock_space_location("nauvis") + end +end + + +-- Initialize Lignumis +local function init_lignumis() + storage.surface = game.planets["lignumis"].create_surface() + storage.surface.request_to_generate_chunks({ 0, 0 }, 3) + storage.surface.force_generate_chunk_requests() + storage.surface.daytime = 0.7 + + -- Chart starting area + local r = 200 + local force = game.forces.player + local origin = force.get_spawn_position(storage.surface) + force.chart(storage.surface, { { origin.x - r, origin.y - r }, { origin.x + r, origin.y + r } }) +end + + +-- Clear Nauvis surface as we start on Lignumis +local function clear_nauvis() + game.get_surface("nauvis").clear() +end + + +InitNew.on_init = function() + if game.tick > 0 then + return + end + + init_intro() + init_space_locations() + init_lignumis() + clear_nauvis() +end + +return InitNew diff --git a/lignumis/script/init.lua b/lignumis/script/init.lua new file mode 100644 index 0000000..9370f4e --- /dev/null +++ b/lignumis/script/init.lua @@ -0,0 +1,155 @@ +local crash_site = require("crash-site") +local util = require("util") + +-- General initialization + +local Init = { + events = {} +} + + +-- Migrate storage init as it was just a boolean before not supporting multiple players +local function migrate_0_9_6(event) + if storage.init and type(storage.init) == "boolean" then + storage.init = { + [event.player_index] = true + } + end +end + + +-- Initialize the player +-- Teleport to Lignumis and give some starting items +local function init_player(event) + local player = game.get_player(event.player_index) + + if not player.character then + return + end + + local surface = storage.surface or game.planets["lignumis"].surface + player.teleport(surface.find_non_colliding_position("character", { 0, 0 }, 0, 1), "lignumis") + player.character.destructible = false + local main_inventory = player.character.get_main_inventory() + + -- Add some starting items to player inventory + main_inventory.insert({ name = "lumber", count = 8 }) +end + + +-- Initialize the freeplay scenario +local function init_freeplay(event) + local player = game.get_player(event.player_index) + + if not player or not remote.interfaces.freeplay then + return + end + + local surface = storage.surface or game.planets["lignumis"].surface + storage.crashed_ship_items = remote.call("freeplay", "get_ship_items") + storage.crashed_debris_items = remote.call("freeplay", "get_debris_items") + storage.crashed_ship_parts = remote.call("freeplay", "get_ship_parts") + storage.starting_message = remote.call("freeplay", "get_custom_intro_message") + + local ship_items = { + ["burner-mining-drill"] = 1, + ["burner-agricultural-tower"] = 2 + } + local debris_items = { + ["lumber"] = 8, + ["wood-darts-magazine"] = 2 + } + + crash_site.create_crash_site(surface, { -5, -6 }, ship_items, debris_items, + table.deepcopy(storage.crashed_ship_parts)) + util.remove_safe(player, storage.crashed_ship_items) + util.remove_safe(player, storage.crashed_debris_items) + player.character.get_main_inventory().sort_and_merge() + + storage.crash_site_cutscene_active = true + crash_site.create_cutscene(player, { -5, -4 }) +end + + +Init.events[defines.events.on_player_created] = function(event) + migrate_0_9_6(event) + storage.init = storage.init or {} + + if storage.init[event.player_index] then + return + end + + storage.init[event.player_index] = true + init_player(event) + init_freeplay(event) +end + + +-- Watch Nauvis being visited for the first time +Init.events[defines.events.on_player_changed_surface] = function(event) + local player = game.get_player(event.player_index) + if player and player.surface.name == "nauvis" then + storage.nauvis_visited = true + end +end + + +-- End intro and show starting message +Init.events[defines.events.on_cutscene_waypoint_reached] = function(event) + if not storage.crash_site_cutscene_active then + return + end + if not crash_site.is_crash_site_cutscene(event) then + return + end + + local player = game.get_player(event.player_index) + player.exit_cutscene() + + if storage.skip_intro then + return + end + + local intro_message = storage.custom_intro_message or { "msg-intro-space-age" } + + if game.is_multiplayer() then + player.print(intro_message) + else + game.show_message_dialog { text = intro_message } + end +end + + +-- Cancel intro +Init.events["crash-site-skip-cutscene"] = function(event) + if not storage.crash_site_cutscene_active then + return + end + if event.player_index ~= 1 then + return + end + local player = game.get_player(event.player_index) + if player.controller_type == defines.controllers.cutscene then + player.exit_cutscene() + end +end + +Init.events[defines.events.on_cutscene_cancelled] = function(event) + if not storage.crash_site_cutscene_active then + return + end + if event.player_index ~= 1 then + return + end + storage.crash_site_cutscene_active = nil + local player = game.get_player(event.player_index) + if player.gui.screen.skip_cutscene_label then + player.gui.screen.skip_cutscene_label.destroy() + end + if player.character then + player.character.destructible = true + end + player.zoom = 1.5 +end + +return Init diff --git a/lignumis/script/to-nauvis.lua b/lignumis/script/to-nauvis.lua index cbf8739..884d4ac 100644 --- a/lignumis/script/to-nauvis.lua +++ b/lignumis/script/to-nauvis.lua @@ -1,7 +1,14 @@ local crash_site = require("crash-site") local util = require("util") -local e = defines.events +-- Transition from Lignumis to Nauvis with the provisional rocket silo + +local ToNauvis = { + events = {} +} + + +-- Chart the starting area for the player local function chart_starting_area(surface, player) local r = 200 local force = player.force @@ -9,35 +16,58 @@ local function chart_starting_area(surface, player) force.chart(surface, { { origin.x - r, origin.y - r }, { origin.x + r, origin.y + r } }) end -local function travel_to_nauvis() + +-- Initialize Nauvis +local function init_nauvis() local nauvis = game.planets["nauvis"].create_surface() nauvis.request_to_generate_chunks({ 0, 0 }, 3) nauvis.force_generate_chunk_requests() + nauvis.daytime = 0.7 +end + +-- Teleport all players to Nauvis and show welcoe message +local function teleport_players() + local nauvis = game.planets["nauvis"].surface for _, player in pairs(game.players) do if player.surface.name == "lignumis" then - player.teleport(nauvis.find_non_colliding_position("character", { 0, 0 }, 0, 1) --[[@as MapPosition]], - "nauvis") + player.teleport(nauvis.find_non_colliding_position("character", { 0, 0 }, 0, 1), "nauvis") chart_starting_area(nauvis, player) player.print("Oh no, not again. But... Welcome to Nauvis!") end end - - nauvis.daytime = 0.7 - - if remote.interfaces.freeplay then - local ship_items = { ["burner-mining-drill"] = 5, ["stone-furnace"] = 5, ["burner-assembling-machine"] = 2, ["burner-agricultural-tower"] = 4, ["wood-lab"] = 4 } - local debris_items = { ["wood-darts-magazine"] = 20, ["wood"] = 20, ["lumber"] = 20 } - local crashed_ship_parts = remote.call("freeplay", "get_ship_parts") - - crash_site.create_crash_site(nauvis, { -5, -6 }, ship_items, debris_items, table.deepcopy(crashed_ship_parts)) - end end -script.on_event(e.on_rocket_launched, function(event) - local rocket_silo = event.rocket_silo - if rocket_silo.name == "provisional-rocket-silo" then - --rocket_silo.destroy() - travel_to_nauvis() + +-- Initialize the Nauvis freeplay scenario +local function init_freeplay() + if not remote.interfaces.freeplay then + return end -end) + + local nauvis = game.planets["nauvis"].surface + local ship_items = { + ["burner-mining-drill"] = 5, + ["stone-furnace"] = 5, + ["burner-assembling-machine"] = 2, + ["burner-agricultural-tower"] = 4, + ["wood-lab"] = 4 + } + local debris_items = { ["wood-darts-magazine"] = 20, ["wood"] = 20, ["lumber"] = 20 } + local crashed_ship_parts = remote.call("freeplay", "get_ship_parts") + + crash_site.create_crash_site(nauvis, { -5, -6 }, ship_items, debris_items, table.deepcopy(crashed_ship_parts)) +end + + +ToNauvis.events[defines.events.on_rocket_launched] = function(event) + if not event.rocket_silo.name == "provisional-rocket-silo" then + return + end + + init_nauvis() + teleport_players() + init_freeplay() +end + +return ToNauvis \ No newline at end of file