From 1c97c7b61f51255baa2a42c81a8cd8cb6ef9ea1b Mon Sep 17 00:00:00 2001 From: Paul Oliver Date: Mon, 14 Apr 2025 17:24:56 +0200 Subject: Prevents the player from exploring unvisible areas --- von-newmann-2/control.lua | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/von-newmann-2/control.lua b/von-newmann-2/control.lua index 27e1190..0283aa5 100644 --- a/von-newmann-2/control.lua +++ b/von-newmann-2/control.lua @@ -295,14 +295,77 @@ local function on_player_created(event) create_roboport(center, surface, player) end +local function on_player_changed_position(event) + -- Inspired by Brave New OARC. + -- This prevents exploration of non-visible areas of the map. + -- Player needs to install radars in order to explore. + + local player = game.players[event.player_index] + local chunk_size = 32 + + if prev_pos[event.player_index] == nil then + prev_pos[event.player_index] = player.position + end + + --print("x:", player.position.x, "y:", player.position.y, "prev_x:", prev_pos[event.player_index].x, "prev_y:", prev_pos[event.player_index].y) + + local pred_dim = function(pos, prev_pos) + local delta = pos - prev_pos + + if delta > 0 then + return pos + chunk_size * 2 + elseif delta < 0 then + return pos - chunk_size * 2 + end + + return pos + end + + local pred_x = pred_dim(player.position.x, prev_pos[event.player_index].x) + local pred_y = pred_dim(player.position.y, prev_pos[event.player_index].y) + + --print("pred_x:", pred_x, "pred_y:", pred_y) + + local get_player_surface = function() + if player.character then + return player.character.surface + else + return player.surface + end + end + + local to_chunk_coord = function(coord) + return math.floor(coord / chunk_size) + end + + if not player.force.is_chunk_visible(get_player_surface(), {to_chunk_coord(pred_x), to_chunk_coord(pred_y)}) then + -- teleport player to (possibly modified) prev_pos + player.teleport(prev_pos[event.player_index]) + player.print("Fog of War limit! Drop a radar to extend your reach.", {sound=defines.print_sound.never}) + end + + -- Teleport back to 0,0 if current position is not visible. + -- This prevents the player from getting stuck in case a radar is disabled or destroyed. + if not player.force.is_chunk_visible(get_player_surface(), {to_chunk_coord(player.position.x), to_chunk_coord(player.position.y)}) then + player.teleport({0, 0}) + player.print("Inside Fog of War! Was radar disabled or destroyed?") -- do play sound here + end + + -- save new player position + prev_pos[event.player_index] = player.position +end + script.on_init(function () if not remote.interfaces.freeplay then modEnabled = false return end + prev_pos = {} + remote.call("freeplay", "set_disable_crashsite", true) script.on_event(defines.events.on_player_created, on_player_created) + script.on_event(defines.events.on_player_changed_position, on_player_changed_position) script.on_configuration_changed(updateInventory) end) -- cgit v1.2.1