1
0
mirror of https://github.com/Oarcinae/FactorioScenarioMultiplayerSpawn.git synced 2024-12-12 10:13:58 +02:00
FactorioScenarioMultiplayer.../lib/oarc_tests.lua
Oarcinae 4cd397f815 Add basic support for Vulcanus secondary spawns.
Have a workaround for demolishers that tracks them and destroys them if they are too close to the spawn. Can definitely be abused, but good enough for now. Fixed issue with joiners being teleported unexpectedly when rerolling a secondary spawn. Removed some old commented out code in utils. Tweak default danger radius to be smaller based on feedback. Fix fuild resources and sharing entities not moving when scaling spawn size. Added locale for welcome home ground text.
2024-11-19 20:59:25 -05:00

318 lines
10 KiB
Lua

local mod_gui = require("mod-gui")
---Test out all the fonts available in the game.
---@param player LuaPlayer
---@return nil
function TestFonts(player)
local font_list = {
"compi",
"compilatron-message-font",
"count-font",
"default",
"default-bold",
"default-dialog-button",
"default-dropdown",
"default-game",
"default-large",
"default-large-bold",
"default-large-semibold",
"default-listbox",
"default-semibold",
"default-small",
"default-small-bold",
"default-small-semibold",
"default-tiny-bold",
"heading-1",
"heading-2",
"heading-3",
"locale-pick",
"scenario-message-dialog",
"technology-slot-level-font",
"var",
}
local test_frame = player.gui.screen.add{type="frame", name="font_test_frame", direction="vertical"}
for _,font in pairs(font_list) do
local test_text = test_frame.add{type="label", caption=font}
test_text.style.font = font
end
test_frame.auto_center = true
end
function ClearTestFonts(player)
if player.gui.screen.font_test_frame then
player.gui.screen.font_test_frame.destroy()
end
end
---Test out all the button styles available in the game.
---@param player LuaPlayer
---@return nil
function TestButtons(player)
local button_styles = {
"back_button",
"big_slot_button",
-- "blueprint_drop_slot_button",
"blueprint_record_selection_button",
"blueprint_record_slot_button",
"browse_games_gui_toggle_favorite_off_button",
"browse_games_gui_toggle_favorite_on_button",
"cancel_close_button",
-- "character_gui_entity_button",
"choose_chat_icon_button",
"choose_chat_icon_in_textbox_button",
"close_button",
"compact_slot_sized_button",
"confirm_button",
"confirm_double_arrow_button",
"confirm_in_load_game_button",
"control_settings_button",
"control_settings_section_button",
"current_research_info_button",
"dark_button",
"dark_rounded_button",
"dialog_button",
"drop_target_button",
"dropdown_button",
"entity_variation_button",
"forward_button",
"frame_action_button",
"frame_button",
"green_button",
"highlighted_tool_button",
"inventory_limit_slot_button",
"left_slider_button",
"locomotive_minimap_button",
"logistic_slot_button",
"map_generator_close_preview_button",
"map_generator_confirm_button",
"map_generator_preview_button",
"map_view_add_button",
"map_view_options_button",
"menu_button",
"mini_button",
"mod_gui_button",
"not_working_weapon_button",
"open_armor_button",
"other_settings_gui_button",
"quick_bar_page_button",
"quick_bar_slot_button",
"recipe_slot_button",
"red_back_button",
"red_button",
"red_confirm_button",
"red_logistic_slot_button",
"red_slot_button",
"research_queue_cancel_button",
"right_slider_button",
"rounded_button",
"shortcut_bar_button",
"shortcut_bar_expand_button",
"side_menu_button",
"slider_button",
"slot_button",
"slot_sized_button",
"station_train_status_button",
"statistics_slot_button",
"tile_variation_button",
"tip_notice_button",
"tip_notice_close_button",
"tool_bar_open_button",
"tool_button",
"tracking_off_button",
"tracking_on_button",
"train_schedule_action_button",
"train_schedule_add_station_button",
"train_schedule_add_wait_condition_button",
"train_schedule_comparison_type_button",
"train_schedule_condition_time_selection_button",
"train_schedule_delete_button",
"train_schedule_fulfilled_delete_button",
"train_schedule_fulfilled_item_select_button",
"train_schedule_item_select_button",
"train_schedule_temporary_station_delete_button",
"train_status_button",
-- "train_stop_entity_button",
-- "wide_entity_button",
"working_weapon_button",
"yellow_logistic_slot_button",
}
local test_frame = player.gui.screen.add{type="scroll-pane", name="button_test_frame", direction="vertical"}
-- test_frame.auto_center = true
test_frame.vertical_scroll_policy = "auto"
test_frame.style.maximal_height = 800
for _,button_style in pairs(button_styles) do
local test_button = test_frame.add
{
type="button",
caption=button_style,
style=button_style
}
end
end
function ClearTestButtons(player)
if player.gui.screen.button_test_frame then
player.gui.screen.button_test_frame.destroy()
end
end
function SetNauvisChunksGenerated()
local nauvis = game.surfaces["nauvis"]
for x = -100, 100, 1 do
for y = -100, 100, 1 do
nauvis.set_chunk_generated_status({x=x, y=y}, defines.chunk_generated_status.entities)
end
end
end
function FlagEnemyForce(player, enemy_force_name)
local enemy_force = game.forces[enemy_force_name]
player.force.set_friend(enemy_force, true)
player.force.set_cease_fire(enemy_force, true)
end
function UnflagEnemyForce(player, enemy_force_name)
local enemy_force = game.forces[enemy_force_name]
player.force.set_friend(enemy_force, false)
player.force.set_cease_fire(enemy_force, false)
end
function CreateTestSurfaces()
game.create_surface("vulcanus")
game.create_surface("fulgora")
game.create_surface("gleba")
game.create_surface("aquilo")
end
---Searchs a 3x3 chunk around the map origin for "cargo-pod-container" entities and if they are on the same force
---as the player it will teleport the cargo pod to the player. This is meant to be a temporary work around since I don't
---know how to detect the cargo pod that is associated with the player or when it is sent/landed.
---@param player LuaPlayer
---@return nil
function DudeWheresMyCargoPod(player)
if not player.character then
player.print({ "oarc-character-invalid" })
return
end
local surface = player.character.surface
local radius = CHUNK_SIZE*3
local search_area = {{-radius,-radius},{radius,radius}}
local pods = surface.find_entities_filtered{area=search_area, name="cargo-pod-container", force=player.force}
if #pods == 0 then
player.print({ "oarc-no-cargo-pods" })
return
end
for _,cargo_pod in pairs(pods) do
local new_position = surface.find_non_colliding_position("cargo-pod-container", player.character.position, CHUNK_SIZE, 1)
if new_position == nil then
player.print({ "oarc-teleport-cargo-pod-fail" })
return
end
cargo_pod.teleport(new_position)
player.print({ "oarc-teleport-cargo-pod-success" })
end
end
---Allow players to reroll their spawn point, dangerous because this doesn't do a lot of checks.
---@param player LuaPlayer
---@return nil
function RerollSpawn(player)
-- Make sure character is valid
if not player.character then
log("ERROR - RerollSpawn - No valid character for player: " .. player.name)
return
end
-- Ensure we still have their previous spawn choices
local spawn_choices = storage.spawn_choices[player.name]
if (spawn_choices == nil) then
log("ERROR - RerollSpawn - No spawn choices for player: " .. player.name)
return
end
-- If it is a buddy spawn, tell them we don't support this:
if (spawn_choices.buddy ~= nil) then
player.print({ "oarc-no-reroll-buddy-spawn" })
return
end
local surface = player.character.surface
local surface_name = surface.name
-- Confirm there is AN existing spawn point for this player on this surface
if (storage.unique_spawns[surface_name] == nil or storage.unique_spawns[surface_name][player.name] == nil) then
log("ERROR - RerollSpawn - Can't reroll? No existing spawn for " .. player.name)
return
end
-- Save a copy of the previous spawn point
local old_spawn_point = table.deepcopy(storage.unique_spawns[surface_name][player.name])
-- Find a new spawn point
local spawn_position = FindUngeneratedCoordinates(surface_name, spawn_choices.distance, 3)
-- If that fails, just throw a warning and don't spawn them. They can try again.
if ((spawn_position.x == 0) and (spawn_position.y == 0)) then
player.print({ "oarc-no-ungenerated-land-error" })
return
end
-- Remove the old spawn point
if (storage.ocfg.regrowth.enable_abandoned_base_cleanup) then
log("Removing base: " .. spawn_position.x .. "," .. spawn_position.y .. " on surface: " .. surface_name)
-- Clear an area around the spawn that SHOULD not include any other bases.
local clear_radius = storage.ocfg.gameplay.minimum_distance_to_existing_chunks - 2 -- Bring in a bit for safety.
RegrowthMarkAreaForRemoval(surface_name, old_spawn_point.position, clear_radius)
TriggerCleanup()
script.raise_event("oarc-mod-on-spawn-remove-request", {spawn_data = old_spawn_point})
end
-- Queue spawn generation and the player.
local delayed_spawn = GenerateNewSpawn(player.name, surface_name, spawn_position, spawn_choices, old_spawn_point.primary)
QueuePlayerForSpawn(player.name, delayed_spawn)
-- Send them to the holding pen
SafeTeleport(player, game.surfaces[HOLDING_PEN_SURFACE_NAME], {x=0,y=0})
-- Queue joiners too (if they are on this surface?)
for _,joiner in pairs(old_spawn_point.joiners) do
local joiner_player = game.players[joiner]
if (joiner_player ~= nil) and joiner_player.surface.name == surface_name then
QueuePlayerForSpawn(joiner, delayed_spawn)
SafeTeleport(game.players[joiner], game.surfaces[HOLDING_PEN_SURFACE_NAME], {x=0,y=0})
end
end
-- Announce
SendBroadcastMsg({"", { "oarc-spawn-rerolled", player.name, surface.name }, " ", GetGPStext(surface.name, spawn_position)})
end