mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-12 10:04:40 +02:00
26e1c28dc0
* Init Factorio 2.0 update * add credits * fix test module * I know luackeck, I know * Fixes * Fix bad event.player_index handling * Hotfixes * Remove all filter inserters * Migrate removed items * Deprecating spidertron control and landfill features
151 lines
3.9 KiB
Lua
151 lines
3.9 KiB
Lua
local Task = require 'utils.task'
|
|
local Token = require 'utils.token'
|
|
local Game = require 'utils.game'
|
|
local Global = require 'utils.global'
|
|
local Command = require 'utils.command'
|
|
local Toast = require 'features.gui.toast'
|
|
local RS = require 'map_gen.shared.redmew_surface'
|
|
local Color = require 'resources.color_presets'
|
|
local Ranks = require 'resources.ranks'
|
|
local Event = require 'utils.event'
|
|
local random = math.random
|
|
local Config = require 'config'
|
|
|
|
local duplicate_chance = Config.apocalypse.duplicate_chance
|
|
|
|
-- Local var
|
|
local Public = {}
|
|
|
|
-- Global vars
|
|
local second_run = {}
|
|
local primitives = {
|
|
apocalypse_now = nil
|
|
}
|
|
|
|
Global.register(
|
|
{
|
|
primitives = primitives,
|
|
second_run = second_run
|
|
},
|
|
function(tbl)
|
|
primitives = tbl.primitives
|
|
second_run = tbl.second_run
|
|
end
|
|
)
|
|
|
|
local name_map = {['behemoth-biter'] = true, ['behemoth-spitter'] = true}
|
|
|
|
local biter_died_token =
|
|
Token.register(
|
|
function(event)
|
|
local entity = event.entity
|
|
if not entity.valid then
|
|
return
|
|
end
|
|
|
|
local name = entity.name
|
|
if not name_map[name] then
|
|
return
|
|
end
|
|
|
|
local force_name = entity.force.name
|
|
if force_name ~= 'enemy' then
|
|
return
|
|
end
|
|
|
|
local surface = entity.surface
|
|
local create_entity = surface.create_entity
|
|
local position = entity.position
|
|
local spawn = {name = entity.name, force = 'enemy', position = position}
|
|
|
|
create_entity(spawn)
|
|
|
|
if random() > duplicate_chance then
|
|
return
|
|
end
|
|
|
|
local spawn_position = surface.find_non_colliding_position(name, position, 8, 1)
|
|
if not spawn_position then
|
|
return
|
|
end
|
|
|
|
spawn.position = spawn_position
|
|
create_entity(spawn)
|
|
end
|
|
)
|
|
|
|
local aliens = {
|
|
'behemoth-biter',
|
|
'behemoth-biter',
|
|
'behemoth-spitter',
|
|
'behemoth-spitter'
|
|
}
|
|
|
|
local biter_spawn_token =
|
|
Token.register(
|
|
function()
|
|
local surface
|
|
local player_force
|
|
local enemy_force = game.forces.enemy
|
|
|
|
surface = RS.get_surface()
|
|
player_force = game.forces.player
|
|
|
|
enemy_force.set_evolution_factor(1, surface)
|
|
|
|
local p_spawn = player_force.get_spawn_position(surface)
|
|
local group = surface.create_unit_group {position = p_spawn}
|
|
|
|
local create_entity = surface.create_entity
|
|
|
|
for i = 1, #aliens do
|
|
local spawn_pos = surface.find_non_colliding_position('behemoth-biter', p_spawn, 300, 1)
|
|
if spawn_pos then
|
|
local biter = create_entity({name = aliens[i], position = spawn_pos})
|
|
group.add_member(biter)
|
|
end
|
|
end
|
|
|
|
group.set_command({type = defines.command.attack_area, destination = {0, 0}, radius = 500})
|
|
Toast.toast_all_players(500, {'apocalypse.toast_message'})
|
|
|
|
Event.add_removable(defines.events.on_entity_died, biter_died_token)
|
|
end
|
|
)
|
|
|
|
--- Begins the apocalypse
|
|
function Public.begin_apocalypse(_, player)
|
|
local index
|
|
if player and player.valid then
|
|
index = player.index
|
|
elseif not player then
|
|
index = 0
|
|
end
|
|
|
|
-- Check if the apocalypse is happening or if it's the first run of the command.
|
|
if primitives.apocalypse_now then
|
|
Game.player_print({'apocalypse.apocalypse_already_running'}, Color.yellow)
|
|
return
|
|
elseif not second_run[index] then
|
|
second_run[index] = true
|
|
game.server_save('pre-apocalypse-' .. index)
|
|
Game.player_print({'apocalypse.run_twice'})
|
|
return
|
|
end
|
|
|
|
primitives.apocalypse_now = true
|
|
game.print({'apocalypse.apocalypse_begins'}, {color = Color.pink})
|
|
Task.set_timeout(1, biter_spawn_token, {})
|
|
end
|
|
|
|
Command.add(
|
|
'apocalypse',
|
|
{
|
|
description = {'command_description.apocalypse'},
|
|
required_rank = Ranks.admin
|
|
},
|
|
Public.begin_apocalypse
|
|
)
|
|
|
|
return Public
|