1
0
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:
MewMew 2019-10-29 11:26:59 +01:00
parent eb3302ab04
commit a88e476687
7 changed files with 133 additions and 143 deletions

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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 = {

View File

@ -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,
}

View 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

View File

@ -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