1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-06 00:23:49 +02:00
ComfyFactorio/maps/junkyard_pvp/main.lua
Gerkiz e91b6a352f 2.0 changes
Change global -> storage
Rework how rendering works
Game prototypes are now stored inside 'prototypes.#'
Renamed entity names
2024-10-22 21:47:11 +02:00

252 lines
8.9 KiB
Lua

--luacheck: ignore
local Gui = require 'utils.gui'
local Map_score = require 'modules.map_score'
local Terrain = require 'maps.junkyard_pvp.terrain'
local MapGui = require 'maps.junkyard_pvp.gui'
require 'maps.junkyard_pvp.surrounded_by_worms'
require 'modules.flashlight_toggle_button'
require 'modules.rocks_heal_over_time'
require 'maps.junkyard_pvp.share_chat'
require 'modules.mineable_wreckage_yields_scrap'
local Team = require 'maps.junkyard_pvp.team'
local Reset = require 'utils.functions.soft_reset'
local Map = require 'modules.map_info'
local math_random = math.random
local Public = {}
local map_gen_settings = {
['seed'] = 1,
['water'] = 1,
['starting_area'] = 1,
['cliff_settings'] = { cliff_elevation_interval = 0, cliff_elevation_0 = 0 },
['default_enable_all_autoplace_controls'] = false,
['autoplace_settings'] = {
['entity'] = { treat_missing_as_default = false },
['tile'] = { treat_missing_as_default = false },
['decorative'] = { treat_missing_as_default = false }
}
}
local function set_player_colors()
for _, player in pairs(game.forces.west.players) do
player.color = { 50, 255, 50 }
end
for _, player in pairs(game.forces.east.players) do
player.color = { 50, 50, 255 }
end
end
function Public.reset_map()
Terrain.create_mirror_surface()
if not storage.active_surface_index then
storage.active_surface_index = game.create_surface('pvp_junkyard', map_gen_settings).index
else
storage.active_surface_index = Reset.soft_reset_map(game.surfaces[storage.active_surface_index], map_gen_settings, Team.starting_items).index
end
local surface = game.surfaces[storage.active_surface_index]
surface.request_to_generate_chunks({ 0, 0 }, 6)
surface.force_generate_chunk_requests()
game.forces.spectator.set_spawn_position({ 0, -128 }, surface)
game.forces.west.set_spawn_position({ -85, 5 }, surface)
game.forces.east.set_spawn_position({ 85, 5 }, surface)
Team.set_force_attributes()
Team.assign_random_force_to_active_players()
for _, player in pairs(game.connected_players) do
Team.teleport_player_to_active_surface(player)
end
for _, player in pairs(game.forces.spectator.connected_players) do
player.character.destroy()
Team.set_player_to_spectator(player)
end
for _, player in pairs(game.forces.spectator.players) do
MapGui.rejoin_question(player)
end
set_player_colors()
end
local function on_entity_died(event)
local entity = event.entity
if not entity.valid then
return
end
if storage.game_reset_tick then
return
end
if entity.name ~= 'cargo-wagon' then
return
end
if entity == storage.map_forces.east.cargo_wagon or entity == storage.map_forces.west.cargo_wagon then
if entity.force.name == 'east' then
game.print('East lost their cargo-wagon.', { 100, 100, 100 })
game.print(string.upper('>>>> West team has won the game!!! <<<<'), { 250, 120, 0 })
game.forces.east.play_sound { path = 'utility/game_lost', volume_modifier = 0.85 }
game.forces.west.play_sound { path = 'utility/game_won', volume_modifier = 0.85 }
for _, player in pairs(game.forces.west.connected_players) do
if storage.map_forces.east.player_count > 0 then
Map_score.set_score(player, Map_score.get_score(player) + 1)
end
end
else
game.print('West lost their cargo-wagon.', { 100, 100, 100 })
game.print(string.upper('>>>> East team has won the game!!! <<<<'), { 250, 120, 0 })
game.forces.west.play_sound { path = 'utility/game_lost', volume_modifier = 0.85 }
game.forces.east.play_sound { path = 'utility/game_won', volume_modifier = 0.85 }
for _, player in pairs(game.forces.east.connected_players) do
if storage.map_forces.west.player_count > 0 then
Map_score.set_score(player, Map_score.get_score(player) + 1)
end
end
end
game.print('Next round starting in 60 seconds..', { 150, 150, 150 })
for _, player in pairs(game.forces.spectator.connected_players) do
player.play_sound { path = 'utility/game_won', volume_modifier = 0.85 }
end
storage.game_reset_tick = game.tick + 3600
game.delete_surface('mirror_terrain')
for _, player in pairs(game.connected_players) do
for _, child in pairs(player.gui.left.children) do
child.destroy()
end
Gui.call_existing_tab(player, 'Map Scores')
end
end
end
local function on_player_joined_game(event)
local player = game.players[event.player_index]
local surface = game.surfaces[storage.active_surface_index]
set_player_colors()
MapGui.spectate_button(player)
if player.surface.index ~= storage.active_surface_index then
if player.force.name == 'spectator' then
Team.set_player_to_spectator(player)
Team.teleport_player_to_active_surface(player)
return
end
Team.assign_force_to_player(player)
Team.teleport_player_to_active_surface(player)
Team.put_player_into_random_team(player)
set_player_colors()
end
end
local function set_player_spawn_and_refill_fish()
for key, force in pairs(storage.map_forces) do
local cargo_wagon = force.cargo_wagon
if cargo_wagon then
if cargo_wagon.valid then
local surface = cargo_wagon.surface
--fill fish in cargo wagon
cargo_wagon.get_inventory(defines.inventory.cargo_wagon).insert({ name = 'raw-fish', count = math.random(1, 2) })
--set player spawn to cargo wagon position
local position = surface.find_non_colliding_position('stone-furnace', cargo_wagon.position, 16, 2)
if not position then
return
end
game.forces[key].set_spawn_position({ x = position.x, y = position.y }, surface)
--set fish chart tag
if force.fish_tag then
if force.fish_tag.valid then
force.fish_tag.destroy()
end
end
force.fish_tag =
cargo_wagon.force.add_chart_tag(
surface,
{
icon = { type = 'item', name = 'raw-fish' },
position = cargo_wagon.position,
text = ' '
}
)
end
end
end
end
local function on_console_command(event)
set_player_colors()
end
local function tick()
local game_tick = game.tick
if game_tick % 240 == 0 then
local surface = game.surfaces[storage.active_surface_index]
local area = { { -256, -127 }, { 255, 128 } }
game.forces.west.chart(surface, area)
game.forces.east.chart(surface, area)
end
if storage.game_reset_tick then
if storage.game_reset_tick < game_tick then
storage.game_reset_tick = nil
Public.reset_map()
end
return
end
if game_tick % 1800 == 0 then
set_player_spawn_and_refill_fish()
end
end
local function on_init()
game.difficulty_settings.technology_price_multiplier = 0.25
game.map_settings.enemy_evolution.destroy_factor = 0
game.map_settings.enemy_evolution.pollution_factor = 0
game.map_settings.enemy_evolution.time_factor = 0
game.map_settings.enemy_expansion.enabled = false
game.map_settings.pollution.enabled = false
storage.map_forces = {
['west'] = {},
['east'] = {}
}
local T = Map.Pop_info()
T.main_caption = 'Junkyard PVP'
T.sub_caption = 'a playground made of scrap'
T.text =
table.concat(
{
'The opponent team wants your fish cargo!\n',
'\n',
'Destroy their cargo wagon to win the round!\n',
'\n'
--"Sometimes you will encounter impassable dark chasms or ponds.\n",
--"Some explosives may cause parts of the ceiling to crumble, filling the void, creating new ways.\n",
--"All they need is a container and a well aimed shot.\n",
}
)
T.main_caption_color = { r = 150, g = 0, b = 255 }
T.sub_caption_color = { r = 0, g = 250, b = 150 }
storage.rocks_yield_ore_base_amount = 150
Team.create_forces()
Public.reset_map()
end
local event = require 'utils.event'
event.on_init(on_init)
event.on_nth_tick(60, tick)
event.add(defines.events.on_console_command, on_console_command)
event.add(defines.events.on_entity_died, on_entity_died)
event.add(defines.events.on_player_joined_game, on_player_joined_game)
require 'modules.rocks_yield_ore'