1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-28 23:06:38 +02:00
ComfyFactorio/maps/island_troopers/enemies.lua
Gerkiz e91b6a352f 2.0 changes
Change global -> storage
Rework how rendering works
Game prototypes are now stored inside 'prototypes.#'
Renamed entity names
2024-10-22 21:47:11 +02:00

197 lines
7.4 KiB
Lua

--luacheck: ignore
local Difficulty = require 'modules.difficulty_vote'
local Public = {}
local difficulties_votes = {
[1] = { amount_modifier = 0.52, strength_modifier = 0.40, boss_modifier = 0.7 },
[2] = { amount_modifier = 0.76, strength_modifier = 0.65, boss_modifier = 0.8 },
[3] = { amount_modifier = 0.92, strength_modifier = 0.85, boss_modifier = 0.9 },
[4] = { amount_modifier = 1.00, strength_modifier = 1.00, boss_modifier = 1.0 },
[5] = { amount_modifier = 1.16, strength_modifier = 1.25, boss_modifier = 1.1 },
[6] = { amount_modifier = 1.48, strength_modifier = 1.75, boss_modifier = 1.2 },
[7] = { amount_modifier = 2.12, strength_modifier = 2.50, boss_modifier = 1.3 }
}
local function get_biter()
local max_chance = 0
for k, v in pairs(storage.biter_chances) do
max_chance = max_chance + v
end
local r = math.random(1, max_chance)
local current_chance = 0
for k, v in pairs(storage.biter_chances) do
current_chance = current_chance + v
if r <= current_chance then
return k
end
end
end
local function get_worm()
local max_chance = 0
for k, v in pairs(storage.worm_chances) do
max_chance = max_chance + v
end
local r = math.random(1, max_chance)
local current_chance = 0
for k, v in pairs(storage.worm_chances) do
current_chance = current_chance + v
if r <= current_chance then
return k
end
end
end
local function set_biter_chances(level)
storage.biter_chances = {
['small-biter'] = 500 - level * 10,
['small-spitter'] = 500 - level * 10,
['medium-biter'] = level * 10,
['medium-spitter'] = level * 10,
['big-biter'] = 0,
['big-spitter'] = 0,
['behemoth-biter'] = 0,
['behemoth-spitter'] = 0
}
if level > 25 then
storage.biter_chances['big-biter'] = (level - 25) * 25
storage.biter_chances['big-spitter'] = (level - 25) * 25
end
if level > 50 then
storage.biter_chances['behemoth-biter'] = (level - 50) * 50
storage.biter_chances['behemoth-spitter'] = (level - 50) * 50
end
for k, v in pairs(storage.biter_chances) do
if storage.biter_chances[k] < 0 then
storage.biter_chances[k] = 0
end
end
end
local function set_worm_chances(level)
storage.worm_chances = {
['small-worm-turret'] = 500 - level * 10,
['medium-worm-turret'] = level * 10,
['big-worm-turret'] = 0,
['behemoth-worm-turret'] = 0
}
if level > 25 then
storage.worm_chances['big-worm-turret'] = (level - 25) * 25
storage.worm_chances['big-worm-turret'] = (level - 25) * 25
end
if level > 50 then
storage.worm_chances['behemoth-worm-turret'] = (level - 50) * 50
storage.worm_chances['behemoth-worm-turret'] = (level - 50) * 50
end
for k, v in pairs(storage.worm_chances) do
if storage.worm_chances[k] < 0 then
storage.worm_chances[k] = 0
end
end
end
local function is_boss_stage()
if storage.current_stage == 1 then
return false
end
if storage.current_stage == #storage.stages - 1 then
return true
end
if #storage.stages < 6 then
return false
end
if storage.current_stage == math.floor(#storage.stages * 0.5) then
return true
end
end
function Public.add_enemies(surface, tiles)
local Diff = Difficulty.get()
table.shuffle_table(tiles)
if is_boss_stage() then
set_biter_chances(math.floor((storage.current_level * difficulties_votes[Diff.difficulty_vote_index].strength_modifier) + 15))
local boss_count = math.random(1, math.floor(storage.current_level * 0.5) + 1)
if boss_count > 16 then
boss_count = 16
end
for k, tile in pairs(tiles) do
if surface.can_place_entity({ name = 'small-biter', position = tile.position, force = 'enemy' }) then
local unit = surface.create_entity({ name = get_biter(), position = tile.position, force = 'enemy' })
unit.ai_settings.allow_destroy_when_commands_fail = false
unit.ai_settings.allow_try_return_to_spawner = false
add_boss_unit(unit, (3 + storage.current_level * 0.2) * difficulties_votes[Diff.difficulty_vote_index].boss_modifier, 0.55)
storage.alive_boss_enemy_count = storage.alive_boss_enemy_count + 1
storage.alive_boss_enemy_entities[unit.unit_number] = unit
storage.alive_enemies = storage.alive_enemies + 1
boss_count = boss_count - 1
if boss_count == 0 then
break
end
end
end
end
if storage.current_level > 2 then
if math.random(1, 5) == 1 or is_boss_stage() then
local evolution = (storage.current_level * 2 * difficulties_votes[Diff.difficulty_vote_index].strength_modifier) * 0.01
if evolution > 1 then
evolution = 1
end
game.forces.enemy_spawners.evolution_factor = evolution
local count = math.random(1, math.ceil(storage.current_level * 0.10))
if count > 5 then
count = 5
end
for k, tile in pairs(tiles) do
if surface.can_place_entity({ name = 'biter-spawner', position = tile.position, force = 'enemy_spawners' }) then
surface.create_entity({ name = 'biter-spawner', position = tile.position, force = 'enemy_spawners' })
storage.alive_enemies = storage.alive_enemies + 1
count = count - 1
if count == 0 then
break
end
end
end
end
end
if math.random(1, 4) == 1 or is_boss_stage() then
set_worm_chances(storage.current_level)
local worm_count = math.random(1, math.ceil(storage.current_level * 0.5))
if worm_count > 32 then
worm_count = 32
end
for k, tile in pairs(tiles) do
if surface.can_place_entity({ name = 'big-worm-turret', position = tile.position, force = 'enemy' }) then
surface.create_entity({ name = get_worm(), position = tile.position, force = 'enemy' })
storage.alive_enemies = storage.alive_enemies + 1
worm_count = worm_count - 1
if worm_count == 0 then
break
end
end
end
end
set_biter_chances(math.floor(storage.current_level * difficulties_votes[Diff.difficulty_vote_index].strength_modifier) + 1)
local amount = ((storage.current_level * 25) / #storage.stages) * storage.current_stage
amount = amount * difficulties_votes[Diff.difficulty_vote_index].amount_modifier
for k, tile in pairs(tiles) do
if surface.can_place_entity({ name = 'small-biter', position = tile.position, force = 'enemy' }) then
local unit = surface.create_entity({ name = get_biter(), position = tile.position, force = 'enemy' })
unit.ai_settings.allow_destroy_when_commands_fail = false
unit.ai_settings.allow_try_return_to_spawner = false
storage.alive_enemies = storage.alive_enemies + 1
amount = amount - 1
end
if amount <= 0 then
break
end
end
update_stage_gui()
end
return Public