1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-10 00:43:27 +02:00
ComfyFactorio/modules/wave_defense/table.lua

495 lines
14 KiB
Lua
Raw Normal View History

2019-10-28 18:38:36 +02:00
local Global = require 'utils.global'
2023-09-20 21:37:45 +02:00
local Core = require 'utils.core'
2019-10-28 18:38:36 +02:00
local Event = require 'utils.event'
2023-11-14 01:36:48 +02:00
local this = {
pause_waves_custom_callback = nil
}
2019-10-28 18:38:36 +02:00
local Public = {}
Public.events = {
on_wave_created = Event.generate_event_name('on_wave_created'),
on_unit_group_created = Event.generate_event_name('on_unit_group_created'),
on_evolution_factor_changed = Event.generate_event_name('on_evolution_factor_changed'),
on_game_reset = Event.generate_event_name('on_game_reset'),
on_target_aquired = Event.generate_event_name('on_target_aquired'),
2023-08-10 14:29:05 +02:00
on_entity_created = Event.generate_event_name('on_entity_created'),
on_biters_evolved = Event.generate_event_name('on_biters_evolved'),
on_spawn_unit_group = Event.generate_event_name('on_spawn_unit_group')
}
local insert = table.insert
2019-10-28 18:38:36 +02:00
Global.register(
2020-08-09 20:23:45 +02:00
this,
2019-10-28 18:38:36 +02:00
function(tbl)
2020-08-09 20:23:45 +02:00
this = tbl
2019-10-28 18:38:36 +02:00
end
)
Public.group_size_modifier_raffle = {}
local group_size_chances = {
{4, 0.4},
{5, 0.5},
{6, 0.6},
{7, 0.7},
{8, 0.8},
{9, 0.9},
{10, 1},
{9, 1.1},
{8, 1.2},
{7, 1.3},
{6, 1.4},
{5, 1.5},
{4, 1.6},
{3, 1.7},
{2, 1.8}
}
for _, v in pairs(group_size_chances) do
for _ = 1, v[1], 1 do
insert(Public.group_size_modifier_raffle, v[2])
end
end
Public.group_size_modifier_raffle_size = #Public.group_size_modifier_raffle
2019-10-28 18:38:36 +02:00
function Public.reset_wave_defense()
2020-08-09 20:23:45 +02:00
this.boss_wave = false
this.boss_wave_warning = false
this.boost_spawner_sizes_wave_is_above = 1000
this.boost_units_when_wave_is_above = 200
this.boost_bosses_when_wave_is_above = 50
2020-08-09 20:23:45 +02:00
this.side_target_count = 0
this.active_biter_count = 0
this.active_biter_threat = 0
this.average_unit_group_size = 24
2020-08-09 20:23:45 +02:00
this.biter_raffle = {}
2023-06-18 14:17:55 +02:00
this.debug = false
2021-11-14 14:02:00 +02:00
this.debug_health = false
2023-06-17 23:31:40 +02:00
this.disable_spawn_near_target = true
2022-06-26 22:37:41 +02:00
this.log_wave_to_discord = true
2021-10-29 00:06:35 +02:00
this.paused = false
2022-09-07 21:37:15 +02:00
this.pause_without_votes = true
2023-04-18 22:38:03 +02:00
this.pause_wave_in_ticks = 18000 -- 5 minutes
2020-08-09 20:23:45 +02:00
this.game_lost = false
this.get_random_close_spawner_attempts = 5
this.group_size = 2
this.last_wave = game.tick
2023-09-23 23:00:51 +02:00
this.final_battle = false
2020-08-09 20:23:45 +02:00
this.max_active_biters = 1280
this.max_active_unit_groups = 32
2020-08-09 20:23:45 +02:00
this.max_biter_age = 3600 * 60
this.nest_building_density = 48
2021-11-23 21:28:23 +02:00
this.next_wave = game.tick + 3600 * 20
2021-11-22 21:16:33 +02:00
this.enable_grace_time = {
2021-11-28 22:20:23 +02:00
enabled = true,
2021-11-22 21:16:33 +02:00
set = nil
}
2020-08-09 20:23:45 +02:00
this.side_targets = {}
this.simple_entity_shredding_cost_modifier = 0.009
2020-08-09 20:23:45 +02:00
this.spawn_position = {x = 0, y = 64}
this.spitter_raffle = {}
this.surface_index = 1
this.target = nil
this.threat = 0
this.threat_gain_multiplier = 2
this.threat_log = {}
this.threat_log_index = 0
2021-11-28 21:42:38 +02:00
this.tick_to_spawn_unit_groups = 200 -- this defines how often we spawn a unit group
this.unit_groups_size = 0
this.index = 0
this.random_group = nil
this.unit_group_command_delay = 3600 * 20
this.unit_group_command_step_length = 15
this.search_side_targets = {'simple-entity', 'tree', 'car', 'spider-vehicle', 'character'}
2020-08-09 20:23:45 +02:00
this.wave_interval = 3600
2020-10-24 14:46:14 +02:00
this.wave_enforced = false
2020-08-09 20:23:45 +02:00
this.wave_number = 0
this.worm_building_chance = 3
this.worm_building_density = 16
this.worm_raffle = {}
this.alert_boss_wave = false
2020-10-22 13:32:18 +02:00
this.remove_entities = false
this.pause_waves = {
index = 0
}
this.enable_random_spawn_positions = false
2020-11-17 13:45:47 +02:00
this.enable_side_target = false
2020-08-09 20:23:45 +02:00
this.enable_threat_log = true
2020-11-01 17:43:58 +02:00
this.disable_threat_below_zero = false
2020-08-09 20:23:45 +02:00
this.check_collapse_position = true
2020-11-18 16:24:22 +02:00
this.resolve_pathing = true
2021-02-04 21:21:48 +02:00
this.increase_damage_per_wave = false
2021-02-10 22:21:29 +02:00
this.increase_boss_health_per_wave = true
this.increase_average_unit_group_size = false
this.increase_max_active_unit_groups = false
2021-02-10 22:21:29 +02:00
this.increase_health_per_wave = false
this.fill_tiles_so_biter_can_path = true
this.modified_unit_health = {
2021-11-20 21:04:13 +02:00
current_value = 1.2,
limit_value = 150,
2021-11-22 21:16:33 +02:00
health_increase_per_boss_wave = 0.5 -- wave % 25 == 0 at wave 2k boost is at 41.2
}
this.modified_boss_unit_health = {
2021-11-22 21:16:33 +02:00
current_value = 2,
limit_value = 500,
2021-11-22 21:16:33 +02:00
health_increase_per_boss_wave = 4 -- wave % 25 == 0 at wave 2k boost is at 322
}
2021-11-28 21:42:38 +02:00
this.generated_units = {
active_biters = {},
unit_groups = {},
unit_group_last_command = {},
unit_group_pos = {
index = 0,
positions = {}
},
nests = {}
}
this.unit_settings = {
scale_units_by_health = {
['small-biter'] = 1,
2021-12-06 11:19:08 +02:00
['medium-biter'] = 0.75,
['big-biter'] = 0.5,
['behemoth-biter'] = 0.25,
2021-11-28 21:42:38 +02:00
['small-spitter'] = 1,
2021-12-06 11:19:08 +02:00
['medium-spitter'] = 0.75,
['big-spitter'] = 0.5,
['behemoth-spitter'] = 0.25
2021-11-28 21:42:38 +02:00
}
}
this.worm_unit_settings = {
-- note that final health modifier isn't lower than 1
2021-12-06 17:22:25 +02:00
scale_units_by_health = {
2022-06-10 22:06:35 +02:00
['land-mine'] = 0.5, -- not active as of now
['gun-turret'] = 0.5, -- not active as of now
['flamethrower-turret'] = 0.4, -- not active as of now
['artillery-turret'] = 0.25, -- not active as of now
2021-12-06 17:22:25 +02:00
['small-worm-turret'] = 0.8,
['medium-worm-turret'] = 0.6,
['big-worm-turret'] = 0.3,
['behemoth-worm-turret'] = 0.3
2021-12-06 17:22:25 +02:00
}
}
this.valid_enemy_forces = {
['enemy'] = true,
['aggressors'] = true,
['aggressors_frenzy'] = true
}
2019-10-28 18:38:36 +02:00
end
2023-06-17 23:31:40 +02:00
function Public.debug_print(msg)
if not this.debug then
return
end
log('WaveDefense: ' .. msg)
end
function Public.debug_print_health(msg)
if not this.debug then
return
end
log('[HEALTHBOOSTER]: ' .. msg)
end
2021-11-22 21:16:33 +02:00
--- This gets values from our table
-- @param key <string>
2020-07-24 17:33:28 +02:00
function Public.get(key)
if key then
2020-08-09 20:23:45 +02:00
return this[key]
2020-07-24 17:33:28 +02:00
else
2020-08-09 20:23:45 +02:00
return this
2020-07-24 17:33:28 +02:00
end
2019-10-28 18:38:36 +02:00
end
2021-11-22 21:16:33 +02:00
--- This sets values to our table
-- use with caution.
-- @param key <string>
-- @param value <string/boolean/int>
2020-11-15 20:23:54 +02:00
function Public.set(key, value)
if key and (value or value == false or value == 'nil') then
if value == 'nil' then
this[key] = nil
else
this[key] = value
end
2020-11-15 20:23:54 +02:00
return this[key]
2020-11-17 13:45:47 +02:00
elseif key then
return this[key]
2020-07-24 17:33:28 +02:00
else
2020-08-09 20:23:45 +02:00
return this
2020-07-24 17:33:28 +02:00
end
end
2021-11-22 21:16:33 +02:00
--- Legacy, to be removed
2020-07-24 17:33:28 +02:00
Public.get_table = Public.get
2021-11-22 21:16:33 +02:00
--- This gets the status of the current wave
-- @param <null>
2020-06-24 15:41:44 +02:00
function Public.get_wave()
2020-08-09 20:23:45 +02:00
return this.wave_number
2020-06-07 13:33:24 +02:00
end
2021-11-22 21:16:33 +02:00
--- This gets the status of disable_threat_below_zero
-- @param <null>
2020-11-01 17:43:58 +02:00
function Public.get_disable_threat_below_zero()
return this.disable_threat_below_zero
end
2021-11-22 21:16:33 +02:00
--- This sets if we should disable threat below zero
-- @param <boolean>
2020-11-17 13:45:47 +02:00
function Public.set_disable_threat_below_zero(boolean)
if (boolean or boolean == false) then
this.disable_threat_below_zero = boolean
2020-11-01 17:43:58 +02:00
end
return this.disable_threat_below_zero
end
2021-11-22 21:16:33 +02:00
--- This gets the status of alert_boss_wave
-- @param <null>
2020-10-30 23:05:05 +02:00
function Public.get_alert_boss_wave()
return this.get_alert_boss_wave
end
2021-11-22 21:16:33 +02:00
--- This sets if we should alert the players
-- when we spawn a boss wave
-- @param <boolean>
2020-11-17 13:45:47 +02:00
function Public.alert_boss_wave(boolean)
if (boolean or boolean == false) then
this.alert_boss_wave = boolean
2020-06-07 13:33:24 +02:00
end
2020-08-09 20:23:45 +02:00
return this.alert_boss_wave
2020-06-07 13:33:24 +02:00
end
2021-11-22 21:16:33 +02:00
--- This sets the spawning position of where
-- we will spawn the entities.
-- @param <tbl>
2020-11-17 13:45:47 +02:00
function Public.set_spawn_position(tbl)
if type(tbl) == 'table' then
this.spawn_position = tbl
2020-08-21 13:56:01 +02:00
else
2020-11-17 13:45:47 +02:00
error('Tbl must be of type table.')
2020-08-21 13:56:01 +02:00
end
return this.spawn_position
end
2021-11-22 21:16:33 +02:00
--- This sets if we should remove colliding entities
-- when we spawn entities.
-- @param <boolean>
2020-11-17 13:45:47 +02:00
function Public.remove_entities(boolean)
if (boolean or boolean == false) then
this.remove_entities = boolean
2020-08-04 12:10:15 +02:00
end
2020-08-09 20:23:45 +02:00
return this.remove_entities
end
2021-11-22 21:16:33 +02:00
--- This sets if the threat gui should be present for the players
-- Warning - this creates a lot of entries in the global table
-- and makes save/load heavy.
-- @param <boolean>
2020-11-17 13:45:47 +02:00
function Public.enable_threat_log(boolean)
if (boolean or boolean == false) then
this.enable_threat_log = boolean
2020-08-09 20:23:45 +02:00
end
return this.enable_threat_log
end
--- This sets if random spawn positions should be enabled.
-- @param <boolean>
function Public.enable_random_spawn_positions(boolean)
if (boolean or boolean == false) then
this.enable_random_spawn_positions = boolean
end
return this.enable_random_spawn_positions
end
2021-11-22 21:16:33 +02:00
--- This sets if we should spawn the unit near collapse
-- That is, if collapse module is enabled
-- @param <boolean>
2020-11-17 13:45:47 +02:00
function Public.check_collapse_position(boolean)
if (boolean or boolean == false) then
this.check_collapse_position = boolean
2020-08-09 20:23:45 +02:00
end
return this.check_collapse_position
2020-08-04 12:10:15 +02:00
end
2021-11-22 21:16:33 +02:00
--- This sets if the units/bosses should try to pick side-targets.
-- @param <boolean>
2020-11-17 13:45:47 +02:00
function Public.enable_side_target(boolean)
if (boolean or boolean == false) then
this.enable_side_target = boolean
end
return this.enable_side_target
end
2021-11-22 21:16:33 +02:00
--- This sets if the units health should increase.
-- @param <boolean>
function Public.increase_health_per_wave(boolean)
if (boolean or boolean == false) then
this.increase_health_per_wave = boolean
end
return this.increase_health_per_wave
end
--- This sets if the average unit group size should increase.
-- @param <boolean>
function Public.increase_average_unit_group_size(boolean)
if (boolean or boolean == false) then
this.increase_average_unit_group_size = boolean
end
return this.increase_average_unit_group_size
end
--- This sets if the max unit groups should increase.
-- @param <boolean>
function Public.increase_max_active_unit_groups(boolean)
if (boolean or boolean == false) then
this.increase_max_active_unit_groups = boolean
end
return this.increase_max_active_unit_groups
end
2021-11-22 21:16:33 +02:00
--- This sets if the bosses health should increase.
-- @param <boolean>
2021-02-10 22:21:29 +02:00
function Public.increase_boss_health_per_wave(boolean)
2020-11-17 13:45:47 +02:00
if (boolean or boolean == false) then
2021-02-10 22:21:29 +02:00
this.increase_boss_health_per_wave = boolean
2020-11-17 13:45:47 +02:00
end
2021-02-10 22:21:29 +02:00
return this.increase_boss_health_per_wave
2020-11-17 13:45:47 +02:00
end
2021-11-22 21:16:33 +02:00
--- This checks if units are stuck, if they are - act.
-- @param <boolean>
2020-11-18 16:24:22 +02:00
function Public.resolve_pathing(boolean)
if (boolean or boolean == false) then
this.resolve_pathing = boolean
end
return this.resolve_pathing
end
2021-11-22 21:16:33 +02:00
--- Enables non-placeable tiles to be switched to placable-tiles.
-- @param <boolean>
function Public.fill_tiles_so_biter_can_path(boolean)
if (boolean or boolean == false) then
this.fill_tiles_so_biter_can_path = boolean
end
return this.fill_tiles_so_biter_can_path
end
2021-11-22 21:16:33 +02:00
--- Sets the wave defense units damage increase.
-- @param <boolean>
2021-02-04 21:21:48 +02:00
function Public.increase_damage_per_wave(boolean)
if (boolean or boolean == false) then
this.increase_damage_per_wave = boolean
end
return this.increase_damage_per_wave
end
2021-11-22 21:16:33 +02:00
--- Sets the wave defense units health at start current.
-- @param <int>
2021-11-20 21:04:13 +02:00
function Public.set_normal_unit_current_health(int)
this.modified_unit_health.current_value = int or 1.2
end
2021-11-22 21:16:33 +02:00
--- Sets the wave defense boss health increment.
-- @param <int>
2021-11-20 21:04:13 +02:00
function Public.set_boss_unit_current_health(int)
this.modified_boss_unit_health.current_value = int or 2
end
2021-11-22 21:16:33 +02:00
--- Sets the wave defense units health at start current.
-- @param <int>
function Public.set_unit_health_increment_per_wave(int)
2021-11-22 21:16:33 +02:00
this.modified_unit_health.health_increase_per_boss_wave = int or 0.5
2021-11-20 21:04:13 +02:00
end
2021-11-22 21:16:33 +02:00
--- Sets the wave defense boss health increment.
-- @param <int>
function Public.set_boss_health_increment_per_wave(int)
2021-11-22 21:16:33 +02:00
this.modified_boss_unit_health.health_increase_per_boss_wave = int or 4
2021-11-20 21:04:13 +02:00
end
2021-11-28 21:42:38 +02:00
--- Sets when we should spawn a unit_group.
-- @param <int> in ticks
function Public.set_tick_to_spawn_unit_groups(int)
this.tick_to_spawn_unit_groups = int or 200
end
2023-04-18 22:38:03 +02:00
--- Sets the pause length in ticks.
-- @param <int> in ticks
function Public.set_pause_wave_in_ticks(int)
this.pause_wave_in_ticks = int or 18000
end
2021-11-22 21:16:33 +02:00
--- Pauses the wave defense module
-- @param null
2021-10-29 00:06:35 +02:00
function Public.pause(boolean)
this.paused = boolean or false
end
2023-08-10 14:29:05 +02:00
--- Completely disables wave defense module
-- @param null
function Public.disable_spawning_biters(boolean)
this.game_lost = boolean or false
end
2023-09-20 21:37:45 +02:00
---Removes the player wave defense gui
function Public.nuke_wave_gui()
Core.iter_players(
function(player)
if player.gui.top.wave_defense and player.gui.top.wave_defense.valid then
player.gui.top.wave_defense.destroy()
end
end
)
end
2023-11-14 01:36:48 +02:00
--- Sets a custom callback whenever the pause_waves func is run
function Public.set_pause_waves_custom_callback(value)
this.pause_waves_custom_callback = value or nil
end
--- Gets a custom callback
function Public.get_pause_waves_custom_callback()
return this.pause_waves_custom_callback or nil
end
2021-11-14 14:02:00 +02:00
--- Toggle debug - when you need to troubleshoot.
2021-11-22 21:16:33 +02:00
-- @param <null>
2021-11-14 14:02:00 +02:00
function Public.toggle_debug()
if this.debug then
this.debug = false
else
this.debug = true
end
return this.debug
end
--- Toggle debug - when you need to troubleshoot.
2021-11-22 21:16:33 +02:00
-- @param <null>
2021-11-14 14:02:00 +02:00
function Public.toggle_debug_health()
if this.debug_health then
this.debug_health = false
else
this.debug_health = true
end
return this.debug_health
end
2021-11-22 21:16:33 +02:00
--- Toggle grace time, for when you want to waves to start instantly
-- @param <boolean>
function Public.enable_grace_time(boolean)
this.enable_grace_time.enabled = boolean or false
return this.debug_health
2019-10-28 18:38:36 +02:00
end
2020-10-30 23:05:05 +02:00
-- Event.on_nth_tick(30, Public.debug_module)
2021-11-22 21:16:33 +02:00
Event.on_init(
function()
Public.reset_wave_defense()
end
)
2019-10-28 18:38:36 +02:00
return Public