mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-01-06 00:23:49 +02:00
280 lines
8.4 KiB
Lua
280 lines
8.4 KiB
Lua
require 'modules.biters_yield_ore'
|
|
require "modules.rocks_yield_ore_veins"
|
|
|
|
local Map_score = require "comfy_panel.map_score"
|
|
local Collapse = require "modules.collapse"
|
|
local Immersive_cargo_wagons = require "modules.immersive_cargo_wagons.main"
|
|
local Terrain = require 'maps.mountain_race.terrain'
|
|
local Team = require 'maps.mountain_race.team'
|
|
local Gui = require 'maps.mountain_race.gui'
|
|
local Global = require 'utils.global'
|
|
local Server = require 'utils.server'
|
|
|
|
local mountain_race = {}
|
|
Global.register(
|
|
mountain_race,
|
|
function(tbl)
|
|
mountain_race = tbl
|
|
end
|
|
)
|
|
|
|
local function on_chunk_generated(event)
|
|
local surface = event.surface
|
|
if surface.index ~= 1 then return end
|
|
local left_top = event.area.left_top
|
|
if left_top.y >= mountain_race.playfield_height or left_top.y < 0 or left_top.x < 0 then
|
|
Terrain.draw_out_of_map_chunk(surface, left_top)
|
|
return
|
|
end
|
|
Terrain.draw_terrain(surface, left_top)
|
|
end
|
|
|
|
local function on_entity_damaged(event)
|
|
end
|
|
|
|
local function on_entity_died(event)
|
|
local entity = event.entity
|
|
if not entity then return end
|
|
if not entity.valid then return end
|
|
if entity.name == "locomotive" then
|
|
if entity == mountain_race.locomotives.north then
|
|
mountain_race.victorious_team = "south"
|
|
mountain_race.gamestate = "game_over"
|
|
return
|
|
end
|
|
if entity == mountain_race.locomotives.south then
|
|
mountain_race.victorious_team = "north"
|
|
mountain_race.gamestate = "game_over"
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
local function on_player_died(event)
|
|
Team.update_spawn_positions(mountain_race)
|
|
end
|
|
|
|
local function on_player_joined_game(event)
|
|
Team.update_spawn_positions(mountain_race)
|
|
|
|
local player = game.players[event.player_index]
|
|
Gui.create_top_gui(player)
|
|
|
|
if game.tick == 0 then
|
|
if player.character then
|
|
if player.character.valid then
|
|
player.character.destroy()
|
|
end
|
|
end
|
|
player.character = nil
|
|
player.set_controller({type=defines.controllers.god})
|
|
return
|
|
end
|
|
|
|
Team.setup_player(mountain_race, player)
|
|
|
|
local surface = game.surfaces.nauvis
|
|
local tile = surface.get_tile(player.position)
|
|
if tile.valid then
|
|
if tile.name == "out-of-map" then
|
|
player.teleport(surface.find_non_colliding_position("character", player.force.get_spawn_position(surface), 64, 0.5), surface)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function on_research_finished(event)
|
|
local force = event.research.force
|
|
force.character_inventory_slots_bonus = force.mining_drill_productivity_bonus * 100 -- +10 Slots / level
|
|
|
|
local mining_speed_bonus = 1 + force.mining_drill_productivity_bonus * 10 -- +100% speed / level
|
|
if force.technologies["steel-axe"].researched then mining_speed_bonus = mining_speed_bonus + 1 end -- +100% speed for steel-axe research
|
|
force.manual_mining_speed_modifier = mining_speed_bonus
|
|
end
|
|
|
|
local function on_console_chat(event)
|
|
if not event.message then return end
|
|
if not event.player_index then return end
|
|
local player = game.players[event.player_index]
|
|
|
|
local color = {}
|
|
color = player.color
|
|
color.r = color.r * 0.6 + 0.35
|
|
color.g = color.g * 0.6 + 0.35
|
|
color.b = color.b * 0.6 + 0.35
|
|
color.a = 1
|
|
|
|
if player.force.name == "south" then
|
|
game.forces.north.print(player.name .. " (south): ".. event.message, color)
|
|
end
|
|
if player.force.name == "north" then
|
|
game.forces.south.print(player.name .. " (north): ".. event.message, color)
|
|
end
|
|
end
|
|
|
|
local function init(mountain_race)
|
|
if game.ticks_played % 120 ~= 30 then return end
|
|
game.print("game resetting..")
|
|
|
|
Immersive_cargo_wagons.reset()
|
|
|
|
Collapse.set_kill_entities(true)
|
|
Collapse.set_speed(8)
|
|
Collapse.set_amount(0)
|
|
Collapse.set_max_line_size(mountain_race.border_width + mountain_race.playfield_height * 2)
|
|
Collapse.set_surface(surface)
|
|
Collapse.set_position({0, 0})
|
|
Collapse.set_direction("east")
|
|
|
|
game.reset_time_played()
|
|
|
|
mountain_race.clone_x = 0
|
|
|
|
Team.configure_teams(mountain_race)
|
|
|
|
game.print("rerolling terrain..")
|
|
mountain_race.gamestate = "reroll_terrain"
|
|
end
|
|
|
|
local function prepare_terrain(mountain_race)
|
|
if game.ticks_played % 60 ~= 30 then return end
|
|
Terrain.clone_south_to_north(mountain_race)
|
|
|
|
if mountain_race.clone_x < 6 then return end
|
|
game.print("preparing spawn..")
|
|
mountain_race.gamestate = "prepare_spawn"
|
|
end
|
|
|
|
local function prepare_spawn(mountain_race)
|
|
if game.ticks_played % 60 ~= 0 then return end
|
|
Terrain.generate_spawn(mountain_race, "north")
|
|
Terrain.generate_spawn(mountain_race, "south")
|
|
game.print("spawning players..")
|
|
mountain_race.gamestate = "spawn_players"
|
|
end
|
|
|
|
local function spawn_players(mountain_race)
|
|
if game.ticks_played % 60 ~= 0 then return end
|
|
for _, player in pairs(game.players) do
|
|
player.force = game.forces.player
|
|
end
|
|
for _, player in pairs(game.connected_players) do
|
|
Team.setup_player(mountain_race, player)
|
|
end
|
|
|
|
mountain_race.reset_counter = mountain_race.reset_counter + 1
|
|
local message = "Mountain race #" .. mountain_race.reset_counter .. " has begun!"
|
|
game.print(message, {255, 155, 0})
|
|
Server.to_discord_bold(table.concat{'*** ', message, ' ***'})
|
|
mountain_race.gamestate = "game_in_progress"
|
|
end
|
|
|
|
local function set_collapse_speed(mountain_race)
|
|
if not mountain_race.locomotives.north then return end
|
|
if not mountain_race.locomotives.south then return end
|
|
local amount = math.abs(mountain_race.locomotives.north.position.x - mountain_race.locomotives.south.position.x)
|
|
amount = math.floor(amount / 64)
|
|
if amount < 0 then amount = 0 end
|
|
Collapse.set_amount(amount)
|
|
end
|
|
|
|
local function chart(mountain_race)
|
|
local surface = game.surfaces.nauvis
|
|
local north = game.forces.north
|
|
local south = game.forces.south
|
|
local r = 128
|
|
local p = north.get_spawn_position(surface)
|
|
local area = {{p.x - r, p.y - r}, {p.x + r, p.y + r}}
|
|
north.chart(surface, area)
|
|
south.chart(surface, area)
|
|
|
|
local p = south.get_spawn_position(surface)
|
|
local area = {{p.x - r, p.y - r}, {p.x + r, p.y + r}}
|
|
north.chart(surface, area)
|
|
south.chart(surface, area)
|
|
|
|
local p = Collapse.get_position()
|
|
local h = mountain_race.playfield_height + mountain_race.border_half_width
|
|
local area = {{p.x - 32, p.y - h}, {p.x + 32, p.y + h}}
|
|
north.chart(surface, area)
|
|
south.chart(surface, area)
|
|
end
|
|
|
|
local game_tasks = {
|
|
[15] = Gui.update_top_gui,
|
|
[30] = set_collapse_speed,
|
|
[60] = Terrain.clone_south_to_north,
|
|
[90] = chart,
|
|
}
|
|
|
|
local function game_in_progress(mountain_race)
|
|
local tick = game.ticks_played
|
|
if tick % 15 ~= 0 then return end
|
|
local task = tick % 120
|
|
if not game_tasks[task] then return end
|
|
game_tasks[task](mountain_race)
|
|
end
|
|
|
|
local function game_over(mountain_race)
|
|
local tick = game.ticks_played
|
|
if tick % 60 ~= 0 then return end
|
|
|
|
if not mountain_race.reset_countdown then
|
|
mountain_race.reset_countdown = 10
|
|
Collapse.set_amount(0)
|
|
local message = "Team " .. mountain_race.victorious_team .. " has won the race!"
|
|
game.print(message, {255, 155, 0})
|
|
Server.to_discord_bold(table.concat{'*** ', message, ' ***'})
|
|
|
|
for _, player in pairs(game.forces[mountain_race.victorious_team].connected_players) do
|
|
Map_score.set_score(player, Map_score.get_score(player) + 1)
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
mountain_race.reset_countdown = mountain_race.reset_countdown - 1
|
|
if mountain_race.reset_countdown <= 0 then
|
|
mountain_race.gamestate = "init"
|
|
mountain_race.reset_countdown = nil
|
|
end
|
|
end
|
|
|
|
local gamestates = {
|
|
["init"] = init,
|
|
["reroll_terrain"] = Terrain.reroll_terrain,
|
|
["generate_chunks"] = Terrain.generate_chunks,
|
|
["prepare_terrain"] = prepare_terrain,
|
|
["prepare_spawn"] = prepare_spawn,
|
|
["spawn_players"] = spawn_players,
|
|
["game_in_progress"] = game_in_progress,
|
|
["game_over"] = game_over,
|
|
}
|
|
|
|
local function on_tick()
|
|
gamestates[mountain_race.gamestate](mountain_race)
|
|
end
|
|
|
|
local function on_init()
|
|
game.difficulty_settings.technology_price_multiplier = 0.5
|
|
mountain_race.reset_counter = 0
|
|
mountain_race.gamestate = "init"
|
|
mountain_race.border_width = 32
|
|
mountain_race.border_half_width = mountain_race.border_width * 0.5
|
|
mountain_race.playfield_height = 128
|
|
mountain_race.locomotives = {}
|
|
Collapse.set_amount(0)
|
|
Team.init_teams()
|
|
end
|
|
|
|
local Event = require 'utils.event'
|
|
Event.on_init(on_init)
|
|
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_died, on_player_died)
|
|
Event.add(defines.events.on_research_finished, on_research_finished)
|
|
Event.add(defines.events.on_console_chat, on_console_chat)
|
|
|
|
require "modules.rocks_yield_ore" |