mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-01-08 00:39:30 +02:00
177 lines
6.0 KiB
Lua
177 lines
6.0 KiB
Lua
--luacheck: ignore
|
|
local Public = {}
|
|
local math_random = math.random
|
|
|
|
local starting_items = {['iron-plate'] = 32, ['iron-gear-wheel'] = 16, ['stone'] = 20, ['pistol'] = 1, ['firearm-magazine'] = 16}
|
|
|
|
function Public.reset_forces()
|
|
for _, force_name in pairs({'west', 'east'}) do
|
|
global.map_forces[force_name].unit_health_boost = 1
|
|
global.map_forces[force_name].unit_count = 0
|
|
global.map_forces[force_name].units = {}
|
|
global.map_forces[force_name].player_count = 0
|
|
local force = game.forces[force_name]
|
|
force.reset()
|
|
force.share_chart = true
|
|
force.research_queue_enabled = true
|
|
force.technologies['artillery'].enabled = false
|
|
force.technologies['artillery-shell-range-1'].enabled = false
|
|
force.technologies['artillery-shell-speed-1'].enabled = false
|
|
force.technologies['land-mine'].enabled = false
|
|
end
|
|
game.forces.west.set_friend('spectator', true)
|
|
game.forces.east.set_friend('spectator', true)
|
|
game.forces.west.set_spawn_position({-210, 0}, game.surfaces.nauvis)
|
|
game.forces.east.set_spawn_position({210, 0}, game.surfaces.nauvis)
|
|
end
|
|
|
|
function Public.create_forces()
|
|
game.create_force('west')
|
|
game.create_force('east')
|
|
game.create_force('spectator')
|
|
game.forces.spectator.set_friend('west', true)
|
|
game.forces.spectator.set_friend('east', true)
|
|
for _, force_name in pairs({'west', 'east'}) do
|
|
global.map_forces[force_name].max_unit_count = 1280
|
|
end
|
|
local surface = game.surfaces.nauvis
|
|
game.forces.spectator.set_spawn_position({0, -128}, surface)
|
|
end
|
|
|
|
function Public.assign_random_force_to_active_players()
|
|
local player_indexes = {}
|
|
for _, player in pairs(game.connected_players) do
|
|
if player.force.name ~= 'spectator' then
|
|
player_indexes[#player_indexes + 1] = player.index
|
|
end
|
|
end
|
|
if #player_indexes > 1 then
|
|
table.shuffle_table(player_indexes)
|
|
end
|
|
local a = math_random(0, 1)
|
|
for key, player_index in pairs(player_indexes) do
|
|
if key % 2 == a then
|
|
game.players[player_index].force = game.forces.west
|
|
else
|
|
game.players[player_index].force = game.forces.east
|
|
end
|
|
end
|
|
end
|
|
|
|
function Public.assign_force_to_player(player)
|
|
player.spectator = false
|
|
if math_random(1, 2) == 1 then
|
|
if #game.forces.east.connected_players > #game.forces.west.connected_players then
|
|
player.force = game.forces.west
|
|
else
|
|
player.force = game.forces.east
|
|
end
|
|
else
|
|
if #game.forces.east.connected_players < #game.forces.west.connected_players then
|
|
player.force = game.forces.east
|
|
else
|
|
player.force = game.forces.west
|
|
end
|
|
end
|
|
end
|
|
|
|
function Public.teleport_player_to_spawn(player)
|
|
local surface = game.surfaces.nauvis
|
|
local position
|
|
if player.force.name == 'spectator' then
|
|
position = player.force.get_spawn_position(surface)
|
|
position = {x = (position.x - 160) + math_random(0, 320), y = (position.y - 16) + math_random(0, 32)}
|
|
else
|
|
position = surface.find_non_colliding_position('character', player.force.get_spawn_position(surface), 48, 1)
|
|
if not position then
|
|
position = player.force.get_spawn_position(surface)
|
|
end
|
|
end
|
|
player.teleport(position, surface)
|
|
end
|
|
|
|
function Public.add_player_to_team(player)
|
|
if player.character then
|
|
if player.character.valid then
|
|
player.character.destroy()
|
|
end
|
|
end
|
|
player.character = nil
|
|
player.set_controller({type = defines.controllers.god})
|
|
player.create_character()
|
|
for item, amount in pairs(starting_items) do
|
|
player.insert({name = item, count = amount})
|
|
end
|
|
global.map_forces[player.force.name].player_count = global.map_forces[player.force.name].player_count + 1
|
|
end
|
|
|
|
function Public.set_player_to_spectator(player)
|
|
if player.character and player.character.valid then
|
|
player.character.die()
|
|
end
|
|
player.force = game.forces.spectator
|
|
player.character = nil
|
|
player.spectator = true
|
|
player.set_controller({type = defines.controllers.spectator})
|
|
end
|
|
|
|
function Public.spawn_players(hatchery)
|
|
if game.tick % 90 ~= 0 then
|
|
return
|
|
end
|
|
game.print('spawning characters', {150, 150, 150})
|
|
local surface = game.surfaces.nauvis
|
|
for _, player in pairs(game.connected_players) do
|
|
if player.force.name ~= 'spectator' then
|
|
Public.assign_force_to_player(player)
|
|
Public.add_player_to_team(player)
|
|
Public.teleport_player_to_spawn(player)
|
|
end
|
|
end
|
|
hatchery.gamestate = 'rejoin_question'
|
|
print(hatchery.gamestate)
|
|
end
|
|
|
|
function Public.init(hatchery)
|
|
game.reset_time_played()
|
|
Public.reset_forces()
|
|
|
|
for _, player in pairs(game.forces.spectator.players) do
|
|
Public.teleport_player_to_spawn(player)
|
|
end
|
|
|
|
for _, player in pairs(game.forces.west.players) do
|
|
if player.connected then
|
|
if player.character and player.character.valid then
|
|
player.character.destroy()
|
|
end
|
|
player.character = nil
|
|
player.spectator = true
|
|
player.set_controller({type = defines.controllers.spectator})
|
|
player.force = game.forces.player
|
|
Public.teleport_player_to_spawn(player)
|
|
else
|
|
player.force = game.forces.player
|
|
end
|
|
end
|
|
|
|
for _, player in pairs(game.forces.east.players) do
|
|
if player.connected then
|
|
if player.character and player.character.valid then
|
|
player.character.destroy()
|
|
end
|
|
player.character = nil
|
|
player.spectator = true
|
|
player.set_controller({type = defines.controllers.spectator})
|
|
player.force = game.forces.player
|
|
Public.teleport_player_to_spawn(player)
|
|
else
|
|
player.force = game.forces.player
|
|
end
|
|
end
|
|
hatchery.gamestate = 'reset_nauvis'
|
|
print(hatchery.gamestate)
|
|
end
|
|
|
|
return Public
|