diff --git a/maps/mountain_fortress_v2/main.lua b/maps/mountain_fortress_v2/main.lua index b83f6076..d5d42452 100644 --- a/maps/mountain_fortress_v2/main.lua +++ b/maps/mountain_fortress_v2/main.lua @@ -3,8 +3,8 @@ require "functions.soft_reset" require "functions.basic_markets" -require "modules.wave_defense.main" require "modules.rpg" +require "modules.wave_defense.main" require "modules.biters_yield_coins" require "modules.no_deconstruction_of_neutral_entities" require "modules.shotgun_buff" @@ -14,9 +14,7 @@ require "modules.rocks_heal_over_time" require "modules.rocks_yield_ore_veins" require "modules.spawners_contain_biters" require "maps.mountain_fortress_v2.market" -require "modules.rpg" -require "modules.wave_defense.main" -require "maps.mountain_fortress_v2.terrain" +local level_depth = require "maps.mountain_fortress_v2.terrain" require "maps.mountain_fortress_v2.flamethrower_nerf" local BiterRolls = require "modules.wave_defense.biter_rolls" local Reset = require "functions.soft_reset" @@ -93,15 +91,8 @@ function Public.reset_map() WD.reset_wave_defense() wave_defense_table.surface_index = global.active_surface_index wave_defense_table.target = global.locomotive_cargo - wave_defense_table.side_target_search_radius = 768 - wave_defense_table.unit_group_command_step_length = 32 wave_defense_table.nest_building_density = 32 - wave_defense_table.threat_gain_multiplier = 3 wave_defense_table.game_lost = false - - --for _, p in pairs(game.connected_players) do - -- if p.character then p.character.disable_flashlight() end - --end end local function protect_train(event) @@ -150,6 +141,11 @@ local function hidden_biter(entity) end end +local function hidden_worm(entity) + BiterRolls.wave_defense_set_worm_raffle(math.sqrt(entity.position.x ^ 2 + entity.position.y ^ 2) * 0.33) + entity.surface.create_entity({name = BiterRolls.wave_defense_roll_worm_name(), position = entity.position}) +end + local function hidden_biter_pet(event) if math.random(1, 2048) ~= 1 then return end BiterRolls.wave_defense_set_unit_raffle(math.sqrt(event.entity.position.x ^ 2 + event.entity.position.y ^ 2) * 0.33) @@ -168,17 +164,50 @@ local function hidden_treasure(event) Treasure(event.entity.surface, event.entity.position) end +local projectiles = {"grenade", "explosive-rocket", "grenade", "explosive-rocket", "explosive-cannon-projectile"} +local function angry_tree(entity, cause) + if entity.type ~= "tree" then return end + if math.abs(entity.position.y) < level_depth * 2 then return end + if math.random(1,2) == 1 then hidden_biter(entity) end + if math.random(1,2) == 1 then hidden_worm(entity) end + + local position = false + if cause then + if cause.valid then + position = cause.position + end + end + if not position then position = {entity.position.x + (-20 + math.random(0, 40)), entity.position.y + (-20 + math.random(0, 40))} end + + entity.surface.create_entity({ + name = projectiles[math.random(1, 5)], + position = entity.position, + force = "neutral", + source = entity.position, + target = position, + max_range = 64, + speed = 0.10 + }) +end + local function on_player_mined_entity(event) if not event.entity.valid then return end - if event.entity.force.index == 3 then - if event.entity.type ~= "simple-entity" then return end + if event.entity.force.index ~= 3 then return end + + if event.entity.type == "simple-entity" then if math.random(1,32) == 1 then hidden_biter(event.entity) return end + if math.random(1,512) == 1 then + hidden_worm(entity) + return + end hidden_biter_pet(event) - hidden_treasure(event) + hidden_treasure(event) end + + angry_tree(event.entity, game.players[event.player_index].character) end local function on_entity_died(event) @@ -202,10 +231,17 @@ local function on_entity_died(event) if event.cause.force.index == 2 or event.cause.force.index == 3 then return end end end + if event.entity.force.index == 3 then - if math.random(1,8) == 1 then + local r_max = 15 - math.floor(math.abs(event.entity.position.y) / (level_depth * 0.5)) + if r_max < 3 then r_max = 3 end + if math.random(1,r_max) == 1 then hidden_biter(event.entity) end + + if math.random(1,256) == 1 then hidden_worm(event.entity) end + + angry_tree(event.entity, event.cause) end end @@ -227,15 +263,16 @@ end local function set_difficulty() local wave_defense_table = WD.get_table() - --20 Players for maximum difficulty + + wave_defense_table.threat_gain_multiplier = 2 + #game.connected_players * 0.1 + --20 Players for fastest wave_interval wave_defense_table.wave_interval = 3600 - #game.connected_players * 90 - if wave_defense_table.wave_interval < 1800 then wave_defense_table.wave_interval = 1800 end + if wave_defense_table.wave_interval < 1800 then wave_defense_table.wave_interval = 1800 end end local function on_player_joined_game(event) local player = game.players[event.player_index] - --if player.character then player.character.disable_flashlight() end - + set_difficulty() local surface = game.surfaces[global.active_surface_index] @@ -260,12 +297,10 @@ local function on_player_joined_game(event) global.player_modifiers[player.index].character_mining_speed_modifier["mountain_fortress"] = 0.5 Modifier.update_player_modifiers(player) end ---[[ -local function on_player_respawned(event) - local player = game.players[event.player_index] - if player.character then player.character.disable_flashlight() end + +local function on_player_left_game(event) + set_difficulty() end -]] local function on_init() local T = Map.Pop_info() @@ -307,10 +342,10 @@ local event = require 'utils.event' event.on_init(on_init) 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_left_game, on_player_left_game) event.add(defines.events.on_player_mined_entity, on_player_mined_entity) event.add(defines.events.on_research_finished, on_research_finished) -event.add(defines.events.on_player_joined_game, on_player_joined_game) ---event.add(defines.events.on_player_respawned, on_player_respawned) require "modules.rocks_yield_ore" diff --git a/maps/mountain_fortress_v2/terrain.lua b/maps/mountain_fortress_v2/terrain.lua index fda8c3d1..18d437cc 100644 --- a/maps/mountain_fortress_v2/terrain.lua +++ b/maps/mountain_fortress_v2/terrain.lua @@ -676,4 +676,6 @@ end local event = require 'utils.event' event.on_nth_tick(4, process_chunk_queue) -event.add(defines.events.on_chunk_generated, on_chunk_generated) \ No newline at end of file +event.add(defines.events.on_chunk_generated, on_chunk_generated) + +return level_depth \ No newline at end of file diff --git a/modules/biter_health_booster.lua b/modules/biter_health_booster.lua index 55617b19..64d79416 100644 --- a/modules/biter_health_booster.lua +++ b/modules/biter_health_booster.lua @@ -55,7 +55,7 @@ local function on_entity_damaged(event) if event.cause then if event.cause.valid then - event.entity.die(event.entity.force, event.cause) + event.entity.die(event.cause.force, event.cause) return end end diff --git a/modules/rpg.lua b/modules/rpg.lua index fecbd74d..86c9e037 100644 --- a/modules/rpg.lua +++ b/modules/rpg.lua @@ -483,20 +483,20 @@ local function on_gui_click(event) if event.button == defines.mouse_button_type.right then for a = 1, 5, 1 do - if global.rpg[player.index].points_to_distribute <= 0 then draw_gui(player, false) return end + if global.rpg[player.index].points_to_distribute <= 0 then draw_gui(player, true) return end global.rpg[player.index].points_to_distribute = global.rpg[player.index].points_to_distribute - 1 global.rpg[player.index][index] = global.rpg[player.index][index] + 1 update_player_stats(player) end - draw_gui(player, false) + draw_gui(player, true) return end - if global.rpg[player.index].points_to_distribute <= 0 then draw_gui(player, false) return end + if global.rpg[player.index].points_to_distribute <= 0 then draw_gui(player, true) return end global.rpg[player.index].points_to_distribute = global.rpg[player.index].points_to_distribute - 1 global.rpg[player.index][index] = global.rpg[player.index][index] + 1 update_player_stats(player) - draw_gui(player, false) + draw_gui(player, true) end local xp_yield = { diff --git a/modules/wave_defense/main.lua b/modules/wave_defense/main.lua index 7be9758c..1d1c0096 100644 --- a/modules/wave_defense/main.lua +++ b/modules/wave_defense/main.lua @@ -1,13 +1,11 @@ require "modules.biter_health_booster" local BiterRolls = require "modules.wave_defense.biter_rolls" +local SideTargets = require "modules.wave_defense.side_targets" local ThreatEvent = require "modules.wave_defense.threat_events" local update_gui = require "modules.wave_defense.gui" local threat_values = require "modules.wave_defense.threat_values" local WD = require "modules.wave_defense.table" local event = require 'utils.event' -local side_target_types = {"accumulator", "assembling-machine", "beacon", "boiler", "container", "furnace", "lamp", "lab", "logistic-container", "mining-drill", "container", "pump", "radar", "reactor", "roboport", "rocket-silo", "solar-panel", "storage-tank",} ---local side_target_types = {"assembling-machine", "electric-pole", "furnace", "mining-drill", "pump", "radar", "reactor", "roboport"} - local Public = {} local function debug_print(msg) @@ -72,87 +70,6 @@ local function get_random_close_spawner(surface) return spawner end -local function set_side_target_list() - local wave_defense_table = WD.get_table() - local surface = game.surfaces[wave_defense_table.surface_index] - local position = false - local force = false - - if wave_defense_table.target then - if wave_defense_table.target.valid then - position = wave_defense_table.target.position - force = wave_defense_table.target.force - end - end - - if not position then - local r = math.random(1, #game.connected_players) - position = {x = game.connected_players[r].position.x, y = game.connected_players[r].position.y} - force = game.connected_players[r].force - end - - wave_defense_table.side_targets = surface.find_entities_filtered({ - area = { - {position.x - wave_defense_table.side_target_search_radius, position.y - wave_defense_table.side_target_search_radius}, - {position.x + wave_defense_table.side_target_search_radius, position.y + wave_defense_table.side_target_search_radius} - }, - force = force, - type = side_target_types, - }) - - debug_print("set_side_target_list -- " .. #wave_defense_table.side_targets .. " targets around position x" .. position.x .. " y" .. position.y .. " saved.") -end - -local function get_side_target() - local wave_defense_table = WD.get_table() - if math.random(1, 2) == 1 then - local surface = game.surfaces[wave_defense_table.surface_index] - local characters = surface.find_entities_filtered({name = "character"}) - if not characters[1] then return false end - local character = characters[math.random(1, #characters)] - if not character.valid then return false end - return character - end - - if not wave_defense_table.side_targets then return false end - if #wave_defense_table.side_targets < 2 then return false end - local side_target = wave_defense_table.side_targets[math_random(1,#wave_defense_table.side_targets)] - if not side_target then return false end - if not side_target.valid then return false end - for _ = 1, 4, 1 do - local new_target = wave_defense_table.side_targets[math.random(1,#wave_defense_table.side_targets)] - if new_target then - if new_target.valid then - local side_target_distance = (wave_defense_table.target.position.x - side_target.position.x) ^ 2 + (wave_defense_table.target.position.y - side_target.position.y) ^ 2 - local new_target_distance = (wave_defense_table.target.position.x - new_target.position.x) ^ 2 + (wave_defense_table.target.position.y - new_target.position.y) ^ 2 - if new_target_distance > side_target_distance then side_target = new_target end - end - end - end - debug_print("get_side_target -- " .. side_target.name .. " at position x" .. side_target.position.x .. " y" .. side_target.position.y .. " selected.") - return side_target -end - ---[[ -local function set_main_target() - if wave_defense_table.target then - if wave_defense_table.target.valid then return end - end - local characters = {} - for i = 1, #game.connected_players, 1 do - if game.connected_players[i].character then - if game.connected_players[i].character.valid then - if game.connected_players[i].surface.index == wave_defense_table.surface_index then - characters[#characters + 1] = game.connected_players[i].character - end - end - end - end - if #characters == 0 then return end - wave_defense_table.target = characters[math.random(1, #characters)] -end -]] - local function set_main_target() local wave_defense_table = WD.get_table() if wave_defense_table.target then @@ -279,13 +196,10 @@ local function get_commmands(group) local group_position = {x = group.position.x, y = group.position.y} local step_length = wave_defense_table.unit_group_command_step_length - if math.random(1,3) ~= 1 then - local side_target = false - for _ = 1, 3, 1 do - side_target = get_side_target() - if side_target then break end - end + if math.random(1,2) == 1 then + local side_target = SideTargets.get_side_target() if side_target then + debug_print("get_side_target -- " .. side_target.name .. " at position x" .. side_target.position.x .. " y" .. side_target.position.y .. " selected.") local target_position = side_target.position local distance_to_target = math.floor(math.sqrt((target_position.x - group_position.x) ^ 2 + (target_position.y - group_position.y) ^ 2)) local steps = math.floor(distance_to_target / step_length) + 1 @@ -410,19 +324,8 @@ local function spawn_unit_group() local biter = spawn_biter(surface) if not biter then break end unit_group.add_member(biter) - end - --command_unit_group(unit_group) - - table.insert(wave_defense_table.unit_groups, unit_group) - --[[ - for i = 1, #wave_defense_table.unit_groups, 1 do - if not wave_defense_table.unit_groups[i] then - wave_defense_table.unit_groups[i] = unit_group - return true - end - end - wave_defense_table.unit_groups[#wave_defense_table.unit_groups + 1] = unit_group - ]] + end + table.insert(wave_defense_table.unit_groups, unit_group) return true end @@ -440,7 +343,6 @@ local tick_tasks = { [120] = give_commands_to_unit_groups, [150] = ThreatEvent.build_nest, [180] = ThreatEvent.build_worm, - [1800] = set_side_target_list, [3600] = time_out_biters, [7200] = refresh_active_unit_threat, } diff --git a/modules/wave_defense/side_targets.lua b/modules/wave_defense/side_targets.lua new file mode 100644 index 00000000..82a829f0 --- /dev/null +++ b/modules/wave_defense/side_targets.lua @@ -0,0 +1,52 @@ +local WD = require "modules.wave_defense.table" +local Public = {} +local side_target_types = { + ["assembling-machine"] = true, + ["accumulator"] = true, + ["boiler"] = true, + ["furnace"] = true, + ["lab"] = true, + ["mining-drill"] = true, + ["radar"] = true, + ["reactor"] = true, + ["roboport"] = true, + ["rocket-silo"] = true, + ["solar-panel"] = true, +} + +local function get_random_target(wave_defense_table) + local r = math.random(1, #wave_defense_table.side_targets) + if not wave_defense_table.side_targets[r] then table.remove(wave_defense_table.side_targets, r) return end + if not wave_defense_table.side_targets[r].valid then table.remove(wave_defense_table.side_targets, r) return end + return wave_defense_table.side_targets[r] +end + +function Public.get_side_target() + local wave_defense_table = WD.get_table() + for _ = 1, 1024, 1 do + if #wave_defense_table.side_targets == 0 then return false end + local target = get_random_target(wave_defense_table) + if target then return target end + end +end + +local function add_entity(entity) + local wave_defense_table = WD.get_table() + table.insert(wave_defense_table.side_targets, entity) +end + +local function on_built_entity(event) + if not side_target_types[event.created_entity.type] then return end + add_entity(event.created_entity) +end + +local function on_robot_built_entity(event) + if not side_target_types[event.created_entity.type] then return end + add_entity(event.created_entity) +end + +local event = require 'utils.event' +event.add(defines.events.on_built_entity, on_built_entity) +event.add(defines.events.on_robot_built_entity, on_robot_built_entity) + +return Public \ No newline at end of file diff --git a/modules/wave_defense/table.lua b/modules/wave_defense/table.lua index 7a9927a9..65161fcc 100644 --- a/modules/wave_defense/table.lua +++ b/modules/wave_defense/table.lua @@ -21,26 +21,25 @@ function Public.reset_wave_defense() wave_defense.get_random_close_spawner_attempts = 5 wave_defense.group_size = 2 wave_defense.last_wave = game.tick - wave_defense.max_active_biters = 1024 - wave_defense.max_active_unit_groups = 6 + wave_defense.max_active_biters = 1280 + wave_defense.max_active_unit_groups = 8 wave_defense.max_biter_age = 3600 * 60 - wave_defense.max_group_size = 192 + wave_defense.max_group_size = 200 wave_defense.nest_building_chance = 4 wave_defense.nest_building_density = 64 wave_defense.next_wave = game.tick + 3600 * 15 wave_defense.side_targets = {} - wave_defense.side_target_search_radius = 768 - wave_defense.simple_entity_shredding_cost_modifier = 0.01 + wave_defense.simple_entity_shredding_cost_modifier = 0.005 wave_defense.spawn_position = {x = 0, y = 64} wave_defense.spitter_raffle = {} wave_defense.surface_index = 1 wave_defense.target = nil wave_defense.threat = 0 + wave_defense.threat_gain_multiplier = 2 wave_defense.threat_log = {} wave_defense.threat_log_index = 0 - wave_defense.threat_gain_multiplier = 2 wave_defense.unit_group_command_delay = 3600 * 15 - wave_defense.unit_group_command_step_length = 32 + wave_defense.unit_group_command_step_length = 80 wave_defense.unit_group_last_command = {} wave_defense.unit_groups = {} wave_defense.wave_interval = 3600