1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-10 00:43:27 +02:00
ComfyFactorio/maps/biter_battles_v2/main.lua
MewMew 913d42d6d8 Update
added tooltip for current biter health and damage bonus
moved science gui button, to prevent cut off threat values for spectators
reverted to old biter health boost method
spawners and worms gain health boost too
reduced trees in spawn area 
increased tree generation randomness overall
bigger biter area, less worms
border to biter lands tweaked
biter area starts at ~y512
side area worm turrets start to appear at the same distance as the biter area starts
chunks that are discovered north are mirrored to south as well
biters will try to attack from different angles
removed some console spam
2020-04-13 06:31:39 +02:00

193 lines
6.6 KiB
Lua

-- Biter Battles v2 -- by MewMew
require "on_tick_schedule"
local Biter_health_booster = require "modules.biter_health_booster"
local Ai = require "maps.biter_battles_v2.ai"
local Biters_landfill = require "maps.biter_battles_v2.biters_landfill"
local Chat = require "maps.biter_battles_v2.chat"
local Combat_balance = require "maps.biter_battles_v2.combat_balance"
local Game_over = require "maps.biter_battles_v2.game_over"
local Gui = require "maps.biter_battles_v2.gui"
local Init = require "maps.biter_battles_v2.init"
local Map_info = require "maps.biter_battles_v2.map_info"
local Mirror_terrain = require "maps.biter_battles_v2.mirror_terrain"
local No_turret_creep = require "maps.biter_battles_v2.no_turret_creep"
local Team_manager = require "maps.biter_battles_v2.team_manager"
local Terrain = require "maps.biter_battles_v2.terrain"
require "maps.biter_battles_v2.map_settings_tab"
require "maps.biter_battles_v2.sciencelogs_tab"
require "modules.spawners_contain_biters"
require "modules.mineable_wreckage_yields_scrap"
require "modules.custom_death_messages"
local function on_player_joined_game(event)
local surface = game.surfaces["biter_battles"]
local player = game.players[event.player_index]
if player.online_time == 0 then
player.spectator = true
player.force = game.forces.spectator
if surface.is_chunk_generated({0,0}) then
player.teleport(surface.find_non_colliding_position("character", {0,0}, 3, 0.5), surface)
else
player.teleport({0,0}, surface)
end
player.character.destructible = false
game.permissions.get_group("spectator").add_player(player)
end
Map_info.player_joined_game(player)
Team_manager.draw_top_toggle_button(player)
end
local function on_gui_click(event)
local player = game.players[event.player_index]
local element = event.element
if not element then return end
if not element.valid then return end
if Map_info.gui_click(player, element) then return end
Team_manager.gui_click(event)
end
local function on_research_finished(event)
Combat_balance.research_finished(event)
end
local function on_console_chat(event)
Chat.share(event)
end
local function on_built_entity(event)
No_turret_creep.deny_building(event)
end
local function on_robot_built_entity(event)
No_turret_creep.deny_building(event)
Terrain.deny_construction_bots(event)
end
local function on_entity_died(event)
local entity = event.entity
if not entity.valid then return end
if Ai.subtract_threat(entity) then Gui.refresh_threat() end
if Biters_landfill.entity_died(entity) then return end
Game_over.silo_death(event)
end
--Prevent Players from damaging Rocket Silos
local function on_entity_damaged(event)
local entity = event.entity
if not entity.valid then return end
if entity.force.index > 5 then return end
local cause = event.cause
if cause then
if cause.type == "unit" then return end
end
if entity.name ~= "rocket-silo" then return end
entity.health = entity.health + event.final_damage_amount
end
local tick_minute_functions = {
[300 * 1] = Ai.raise_evo,
[300 * 2] = Ai.destroy_inactive_biters,
[300 * 3 + 30 * 0] = Ai.pre_main_attack, -- setup for main_attack
[300 * 3 + 30 * 1] = Ai.perform_main_attack, -- call perform_main_attack 7 times on different ticks
[300 * 3 + 30 * 2] = Ai.perform_main_attack, -- some of these might do nothing (if there are no wave left)
[300 * 3 + 30 * 3] = Ai.perform_main_attack,
[300 * 3 + 30 * 4] = Ai.perform_main_attack,
[300 * 3 + 30 * 5] = Ai.perform_main_attack,
[300 * 3 + 30 * 6] = Ai.perform_main_attack,
[300 * 3 + 30 * 7] = Ai.perform_main_attack,
[300 * 3 + 30 * 8] = Ai.post_main_attack,
[300 * 4] = Ai.send_near_biters_to_silo,
[300 * 5] = Ai.wake_up_sleepy_groups,
[300 * 7] = Game_over.restart_idle_map,
}
local function on_tick()
Mirror_terrain.ticking_work()
local tick = game.tick
if tick % 60 == 0 then
global.bb_threat["north_biters"] = global.bb_threat["north_biters"] + global.bb_threat_income["north_biters"]
global.bb_threat["south_biters"] = global.bb_threat["south_biters"] + global.bb_threat_income["south_biters"]
end
if tick % 180 == 0 then Gui.refresh() end
if tick % 300 == 0 then
Gui.spy_fish()
if global.bb_game_won_by_team then
Game_over.reveal_map()
Game_over.server_restart()
return
end
end
if tick % 30 == 0 then
local key = tick % 3600
if tick_minute_functions[key] then tick_minute_functions[key]() end
end
end
local function on_marked_for_deconstruction(event)
if not event.entity.valid then return end
if event.entity.name == "fish" then event.entity.cancel_deconstruction(game.players[event.player_index].force.name) end
end
local function on_player_built_tile(event)
local player = game.players[event.player_index]
Terrain.restrict_landfill(player.surface, player, event.tiles)
end
local function on_robot_built_tile(event)
Terrain.restrict_landfill(event.robot.surface, event.robot.get_inventory(defines.inventory.robot_cargo), event.tiles)
end
local function on_chunk_generated(event)
Terrain.generate(event)
Mirror_terrain.add_chunks(event)
end
local function on_init()
Init.settings()
Init.surface()
Init.forces()
Team_manager.init()
local surface = game.surfaces["biter_battles"]
surface.request_to_generate_chunks({x = 0, y = -256}, 8)
surface.force_generate_chunk_requests()
Terrain.generate_north_silo(surface)
end
local Event = require 'utils.event'
Event.add(defines.events.on_built_entity, on_built_entity)
Event.add(defines.events.on_chunk_generated, on_chunk_generated)
Event.add(defines.events.on_console_chat, on_console_chat)
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_gui_click, on_gui_click)
Event.add(defines.events.on_marked_for_deconstruction, on_marked_for_deconstruction)
Event.add(defines.events.on_player_built_tile, on_player_built_tile)
Event.add(defines.events.on_player_joined_game, on_player_joined_game)
Event.add(defines.events.on_research_finished, on_research_finished)
Event.add(defines.events.on_robot_built_entity, on_robot_built_entity)
Event.add(defines.events.on_robot_built_tile, on_robot_built_tile)
Event.add(defines.events.on_tick, on_tick)
Event.on_init(on_init)
Event.add_event_filter(defines.events.on_entity_damaged, {filter = "name", name = "rocket-silo"})
Event.add_event_filter(defines.events.on_entity_damaged, {filter = "type", type = "unit"})
Event.add_event_filter(defines.events.on_entity_damaged, {filter = "type", type = "unit-spawner"})
Event.add_event_filter(defines.events.on_entity_damaged, {filter = "type", type = "turret"})
require "maps.biter_battles_v2.spec_spy"
require "maps.biter_battles_v2.difficulty_vote"