mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-02-03 13:12:11 +02:00
updates, fixes and angry trees
This commit is contained in:
parent
eb3302ab04
commit
a88e476687
@ -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"
|
||||
|
||||
|
@ -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)
|
||||
event.add(defines.events.on_chunk_generated, on_chunk_generated)
|
||||
|
||||
return level_depth
|
@ -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
|
||||
|
@ -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 = {
|
||||
|
@ -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,
|
||||
}
|
||||
|
52
modules/wave_defense/side_targets.lua
Normal file
52
modules/wave_defense/side_targets.lua
Normal file
@ -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
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user