mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-26 22:56:43 +02:00
e91b6a352f
Change global -> storage Rework how rendering works Game prototypes are now stored inside 'prototypes.#' Renamed entity names
232 lines
7.9 KiB
Lua
232 lines
7.9 KiB
Lua
--luacheck: ignore
|
|
-- Map by Kyte & MewMew
|
|
|
|
require 'maps.wave_of_death.intro'
|
|
require 'modules.biter_evasion_hp_increaser'
|
|
require 'modules.custom_death_messages'
|
|
require 'modules.dangerous_goods'
|
|
|
|
local event = require 'utils.event'
|
|
require 'utils.table'
|
|
local init = require 'maps.wave_of_death.init'
|
|
local on_chunk_generated = require 'maps.wave_of_death.terrain'
|
|
local ai = require 'maps.wave_of_death.ai'
|
|
local game_status = require 'maps.wave_of_death.game_status'
|
|
|
|
function soft_teleport(player, destination)
|
|
local surface = game.surfaces['wave_of_death']
|
|
local pos = surface.find_non_colliding_position('character', destination, 8, 0.5)
|
|
if not pos then
|
|
player.teleport(destination, surface)
|
|
end
|
|
player.teleport(pos, surface)
|
|
end
|
|
|
|
local function spectate_button(player)
|
|
if player.gui.top.spectate_button then
|
|
return
|
|
end
|
|
local button = player.gui.top.add({ type = 'button', name = 'spectate_button', caption = 'Spectate' })
|
|
button.style.font = 'default-bold'
|
|
button.style.font_color = { r = 0.0, g = 0.0, b = 0.0 }
|
|
button.style.minimal_height = 38
|
|
button.style.minimal_width = 38
|
|
button.style.top_padding = 2
|
|
button.style.left_padding = 4
|
|
button.style.right_padding = 4
|
|
button.style.bottom_padding = 2
|
|
end
|
|
|
|
local function create_spectate_confirmation(player)
|
|
if player.gui.center.spectate_confirmation_frame then
|
|
return
|
|
end
|
|
local frame = player.gui.center.add({ type = 'frame', name = 'spectate_confirmation_frame', caption = 'Are you sure you want to spectate? This can not be undone.' })
|
|
frame.style.font = 'default'
|
|
frame.style.font_color = { r = 0.3, g = 0.65, b = 0.3 }
|
|
frame.add({ type = 'button', name = 'confirm_spectate', caption = 'Spectate' })
|
|
frame.add({ type = 'button', name = 'cancel_spectate', caption = 'Cancel' })
|
|
end
|
|
|
|
local button_colors = {
|
|
[1] = { r = 0.0, g = 0.0, b = 0.38 },
|
|
[2] = { r = 0.38, g = 0.0, b = 0.0 },
|
|
[3] = { r = 0.0, g = 0.38, b = 0.0 },
|
|
[4] = { r = 0.25, g = 0.0, b = 0.35 }
|
|
}
|
|
|
|
function create_lane_buttons(player)
|
|
for i = 1, 4, 1 do
|
|
if player.gui.top['button_lane_' .. i] then
|
|
player.gui.top['button_lane_' .. i].destroy()
|
|
end
|
|
local caption = 'Wave #' .. storage.wod_lane[i].current_wave - 1
|
|
if storage.wod_lane[i].game_lost == true then
|
|
caption = 'Out'
|
|
end
|
|
local button = player.gui.top.add({ type = 'button', name = 'button_lane_' .. i, caption = caption, tooltip = 'Lane ' .. i .. ' stats' })
|
|
button.style.font = 'default-bold'
|
|
button.style.font_color = button_colors[i]
|
|
button.style.minimal_height = 38
|
|
button.style.minimal_width = 70
|
|
button.style.top_padding = 2
|
|
button.style.left_padding = 4
|
|
button.style.right_padding = 4
|
|
button.style.bottom_padding = 2
|
|
end
|
|
end
|
|
|
|
local function autojoin_lane(player)
|
|
local lowest_player_count = 256
|
|
local lane_number
|
|
local lane_numbers = { 1, 2, 3, 4 }
|
|
table.shuffle_table(lane_numbers)
|
|
|
|
for _, number in pairs(lane_numbers) do
|
|
if #game.forces[number].connected_players < lowest_player_count and storage.wod_lane[number].game_lost == false then
|
|
lowest_player_count = #game.forces[number].connected_players
|
|
lane_number = number
|
|
end
|
|
end
|
|
|
|
player.force = game.forces[lane_number]
|
|
soft_teleport(player, game.forces[player.force.name].get_spawn_position(game.surfaces['wave_of_death']))
|
|
player.insert({ name = 'pistol', count = 1 })
|
|
player.insert({ name = 'firearm-magazine', count = 16 })
|
|
player.insert({ name = 'iron-plate', count = 128 })
|
|
player.insert({ name = 'iron-gear-wheel', count = 32 })
|
|
end
|
|
|
|
local function on_player_joined_game(event)
|
|
init()
|
|
|
|
local player = game.players[event.player_index]
|
|
spectate_button(player)
|
|
create_lane_buttons(player)
|
|
|
|
if storage.lobby_active and #game.connected_players < 4 then
|
|
if game.tick ~= 0 then
|
|
soft_teleport(player, game.forces.player.get_spawn_position(game.surfaces['wave_of_death']))
|
|
end
|
|
game.print('Waiting for ' .. 4 - #game.connected_players .. ' more players to join.', { r = 0, g = 170, b = 0 })
|
|
return
|
|
end
|
|
|
|
if storage.lobby_active then
|
|
for _, p in pairs(game.connected_players) do
|
|
autojoin_lane(p)
|
|
end
|
|
storage.lobby_active = false
|
|
return
|
|
end
|
|
|
|
if player.online_time == 0 then
|
|
autojoin_lane(player)
|
|
return
|
|
end
|
|
|
|
if storage.wod_lane[tonumber(player.force.name)].game_lost == true then
|
|
player.character.die()
|
|
end
|
|
end
|
|
|
|
local function on_entity_damaged(event)
|
|
ai.prevent_friendly_fire(event)
|
|
end
|
|
|
|
local function on_entity_died(event)
|
|
if not event.entity.valid then
|
|
return
|
|
end
|
|
ai.spawn_spread_wave(event)
|
|
game_status.has_lane_lost(event)
|
|
end
|
|
|
|
local function on_player_rotated_entity(event)
|
|
ai.trigger_new_wave(event)
|
|
end
|
|
|
|
local function on_tick(event)
|
|
if game.tick % 300 ~= 0 then
|
|
return
|
|
end
|
|
|
|
for i = 1, 4, 1 do
|
|
game.forces[i].chart(game.surfaces['wave_of_death'], { { -288, -420 }, { 352, 64 } })
|
|
end
|
|
|
|
game_status.restart_server()
|
|
|
|
if game.tick == 300 then
|
|
for _, p in pairs(game.connected_players) do
|
|
soft_teleport(p, game.forces.player.get_spawn_position(game.surfaces['wave_of_death']))
|
|
end
|
|
end
|
|
end
|
|
|
|
local function on_gui_click(event)
|
|
if not event then
|
|
return
|
|
end
|
|
if not event.element then
|
|
return
|
|
end
|
|
if not event.element.valid then
|
|
return
|
|
end
|
|
local player = game.players[event.element.player_index]
|
|
if event.element.name == 'cancel_spectate' then
|
|
player.gui.center['spectate_confirmation_frame'].destroy()
|
|
return
|
|
end
|
|
if event.element.name == 'confirm_spectate' then
|
|
player.gui.center['spectate_confirmation_frame'].destroy()
|
|
game.permissions.get_group('spectator').add_player(player)
|
|
if player.force.name == 'player' then
|
|
return
|
|
end
|
|
player.force = game.forces.player
|
|
if player.character then
|
|
player.character.die()
|
|
end
|
|
return
|
|
end
|
|
if event.element.name == 'spectate_button' then
|
|
if player.gui.center['spectate_confirmation_frame'] then
|
|
player.gui.center['spectate_confirmation_frame'].destroy()
|
|
else
|
|
create_spectate_confirmation(player)
|
|
end
|
|
return
|
|
end
|
|
end
|
|
|
|
--Flamethrower Turret Nerf
|
|
local function on_research_finished(event)
|
|
local research = event.research
|
|
local force_name = research.force.name
|
|
if research.name == 'flamethrower' then
|
|
if not storage.flamethrower_damage then
|
|
storage.flamethrower_damage = {}
|
|
end
|
|
storage.flamethrower_damage[force_name] = -0.25
|
|
game.forces[force_name].set_turret_attack_modifier('flamethrower-turret', storage.flamethrower_damage[force_name])
|
|
game.forces[force_name].set_ammo_damage_modifier('flamethrower', storage.flamethrower_damage[force_name])
|
|
end
|
|
|
|
if string.sub(research.name, 0, 18) == 'refined-flammables' then
|
|
storage.flamethrower_damage[force_name] = storage.flamethrower_damage[force_name] + 0.05
|
|
game.forces[force_name].set_turret_attack_modifier('flamethrower-turret', storage.flamethrower_damage[force_name])
|
|
game.forces[force_name].set_ammo_damage_modifier('flamethrower', storage.flamethrower_damage[force_name])
|
|
end
|
|
end
|
|
|
|
event.add(defines.events.on_research_finished, on_research_finished)
|
|
event.add(defines.events.on_gui_click, on_gui_click)
|
|
event.add(defines.events.on_tick, on_tick)
|
|
event.add(defines.events.on_chunk_generated, on_chunk_generated)
|
|
event.add(defines.events.on_entity_damaged, on_entity_damaged)
|
|
event.add(defines.events.on_entity_died, on_entity_died)
|
|
event.add(defines.events.on_player_joined_game, on_player_joined_game)
|
|
event.add(defines.events.on_player_rotated_entity, on_player_rotated_entity)
|