1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-24 03:47:58 +02:00
2024-07-02 19:01:41 +02:00

274 lines
8.6 KiB
Lua

local Public = require 'maps.mountain_fortress_v3.stateful.table'
local Event = require 'utils.event'
local WD = require 'modules.wave_defense.table'
local Beam = require 'modules.render_beam'
local RPG = require 'modules.rpg.main'
local BiterHealthBooster = require 'modules.biter_health_booster_v2'
Public.stateful_gui = require 'maps.mountain_fortress_v3.stateful.gui'
Public.stateful_blueprints = require 'maps.mountain_fortress_v3.stateful.blueprints'
local random = math.random
local valid_types = {
['unit'] = true,
['turret'] = true
}
---@param event EventData.on_entity_died
local function on_entity_died(event)
local entity = event.entity
if not entity or not entity.valid then
return
end
if not Public.valid_enemy_forces[entity.force.name] then
return
end
local objectives = Public.get_stateful('objectives')
local damage_type = event.damage_type
if not damage_type then
return
end
local killed_enemies = objectives.killed_enemies_type
if not killed_enemies then
return
end
if killed_enemies.damage_type ~= damage_type.name then
return
end
if valid_types[entity.type] then
killed_enemies.actual = killed_enemies.actual + 1
end
end
Event.add(
defines.events.on_research_finished,
function (event)
local research = event.research
if not research then
return
end
local name = research.name
local objectives = Public.get_stateful('objectives')
if not objectives then
return
end
if not objectives.research_level_selection then
return
end
if name == objectives.research_level_selection.name then
objectives.research_level_selection.research_count = objectives.research_level_selection.research_count + 1
end
end
)
Event.on_nth_tick(
150,
function ()
local final_battle = Public.get_stateful('final_battle')
if not final_battle then
return
end
local collection = Public.get_stateful('collection')
if not collection then
return
end
if collection.final_arena_disabled then
return
end
if collection.gather_time and collection.gather_time <= 0 and collection.survive_for and collection.survive_for > 0 then
local spawn_positions = table.deepcopy(Public.get_stateful('stateful_spawn_points'))
if not spawn_positions then
Public.set_stateful(
'stateful_spawn_points',
{
{ { x = -205, y = -37 }, { x = 195, y = 37 } },
{ { x = -205, y = -112 }, { x = 195, y = 112 } },
{ { x = -205, y = -146 }, { x = 195, y = 146 } },
{ { x = -205, y = -112 }, { x = 195, y = 112 } },
{ { x = -205, y = -72 }, { x = 195, y = 72 } },
{ { x = -205, y = -146 }, { x = 195, y = 146 } },
{ { x = -205, y = -37 }, { x = 195, y = 37 } },
{ { x = -205, y = -5 }, { x = 195, y = 5 } },
{ { x = -205, y = -23 }, { x = 195, y = 23 } },
{ { x = -205, y = -5 }, { x = 195, y = 5 } },
{ { x = -205, y = -72 }, { x = 195, y = 72 } },
{ { x = -205, y = -23 }, { x = 195, y = 23 } },
{ { x = -205, y = -54 }, { x = 195, y = 54 } },
{ { x = -205, y = -80 }, { x = 195, y = 80 } },
{ { x = -205, y = -54 }, { x = 195, y = 54 } },
{ { x = -205, y = -80 }, { x = 195, y = 80 } },
{ { x = -205, y = -103 }, { x = 195, y = 103 } },
{ { x = -205, y = -150 }, { x = 195, y = 150 } },
{ { x = -205, y = -103 }, { x = 195, y = 103 } },
{ { x = -205, y = -150 }, { x = 195, y = 150 } }
}
)
spawn_positions = Public.get_stateful('stateful_spawn_points')
end
local sizeof = #spawn_positions
local area = spawn_positions[random(1, sizeof)]
local locomotive = Public.get('locomotive')
if not locomotive or not locomotive.valid then
return
end
area[1].y = area[1].y + locomotive.position.y
area[2].y = area[2].y + locomotive.position.y
if random(1, 2) == 1 then
WD.set_spawn_position(area[1])
else
WD.set_spawn_position(area[2])
end
WD.set_main_target()
WD.build_worm_custom()
-- WD.place_custom_nest(locomotive.surface, area[1], 'aggressors_frenzy')
Event.raise(WD.events.on_spawn_unit_group_simple, { fs = true, bypass = true, random_bosses = true, scale = 32, force = 'aggressors_frenzy' })
return
end
if collection.survive_for and collection.survive_for == 0 then
if not collection.game_won then
collection.game_won = true
end
end
end
)
Event.add(
defines.events.on_player_crafted_item,
function (event)
local player = game.get_player(event.player_index)
if not player or not player.valid then
return
end
local item = event.item_stack
if not item or not item.valid_for_read then
return
end
local objectives = Public.get_stateful('objectives')
local handcrafted_items_any = objectives.handcrafted_items_any
if handcrafted_items_any then
handcrafted_items_any.actual = handcrafted_items_any.actual + item.count
end
local handcrafted_items = objectives.handcrafted_items
if handcrafted_items then
if item.name ~= handcrafted_items.name then
return
end
handcrafted_items.actual = handcrafted_items.actual + item.count
end
end
)
Event.add(
defines.events.on_rocket_launched,
function (event)
local rocket_inventory = event.rocket.get_inventory(defines.inventory.rocket)
local slot = rocket_inventory[1]
if slot and slot.valid and slot.valid_for_read then
local objectives = Public.get_stateful('objectives')
local launch_item = objectives.launch_item
if launch_item then
if slot.name ~= launch_item.name then
return
end
launch_item.actual = launch_item.actual + 1
end
end
end
)
Event.add(
RPG.events.on_spell_cast_success,
function (event)
local player = game.get_player(event.player_index)
if not player or not player.valid then
return
end
local spell_name = event.spell_name
local amount = event.amount
if not player.character or not player.character.valid then
return
end
local objectives = Public.get_stateful('objectives')
local cast_spell_any = objectives.cast_spell_any
if cast_spell_any then
cast_spell_any.actual = cast_spell_any.actual + amount
end
local cast_spell = objectives.cast_spell
if cast_spell then
if spell_name ~= cast_spell.name then
return
end
cast_spell.actual = cast_spell.actual + amount
end
end
)
Event.on_nth_tick(
14400,
function ()
local final_battle = Public.get_stateful('final_battle')
if not final_battle then
return
end
local collection = Public.get_stateful('collection')
if not collection then
return
end
if collection.final_arena_disabled then
return
end
local active_surface_index = Public.get('active_surface_index')
local surface = game.get_surface(active_surface_index)
if not surface or not surface.valid then
return
end
if collection.gather_time and collection.gather_time <= 0 and collection.survive_for > 0 then
Beam.new_beam(surface, game.tick + 350)
end
end
)
Event.add(defines.events.on_pre_player_died, Public.on_pre_player_died)
Event.add(Public.events.on_market_item_purchased, Public.on_market_item_purchased)
Event.add(BiterHealthBooster.events.custom_on_entity_died, on_entity_died)
Event.add(defines.events.on_entity_died, on_entity_died)
return Public