require "util"
require "util"
require "defines"
require "defines"
require ("config")
require ("config")
script.on_init(function() On_Init() end)
script.on_init(function() On_Init() end)
script.on_configuration_changed(function() On_Init() end)
script.on_configuration_changed(function() On_Init() end)
function On_Init()
function On_Init()
if not global.tick then
if not global.tick then
global.tick = game.tick
global.tick = game.tick
if not global.swarmQueue then
if not global.evoFactorFloor then
if not global.evoFactorFloor then
if game.evolution_factor > 0.995 then
if game.evolution_factor > 0.995 then
global.evoFactorFloor = 10
global.evoFactorFloor = 10
global.evoFactorFloor = math.floor(game.evolution_factor * 10)
global.evoFactorFloor = math.floor(game.evolution_factor * 10)
global.tick = global.tick + 1800
global.tick = global.tick + 1800
if game.entity_prototypes["young-berserk-biter"] then
if game.entity_prototypes["young-berserk-biter"] then
global.DytechDetected = true
global.DytechDetected = true
global.DytechDetected = false
global.DytechDetected = false
if game.entity_prototypes["small-biter-Mk2"] then
if game.entity_prototypes["small-biter-Mk2"] then
global.NatEvoDetected = true
global.NatEvoDetected = true
global.NatEvoDetected = false
global.NatEvoDetected = false
if game.entity_prototypes["bob-bigger-biter"] then
if game.entity_prototypes["bob-bigger-biter"] then
global.BobsEnemies126Detected = true
global.BobsEnemies126Detected = true
global.BobsEnemies126Detected = false
global.BobsEnemies126Detected = false
if game.entity_prototypes["bob-leviathan-biter"] then
if game.entity_prototypes["bob-leviathan-biter"] then
global.BobsEnemies127Detected = true
global.BobsEnemies127Detected = true
global.BobsEnemies127Detected = false
global.BobsEnemies127Detected = false
populateTables()
populateTables()
script.on_event(defines.events.on_entity_died, function(event)
script.on_event(defines.events.on_entity_died, function(event)
if not global.subEnemyNameTable[event.entity.name] then
if not global.subEnemyNameTable[event.entity.name] then
if global.tick < event.tick then
if global.tick < event.tick then
if game.evolution_factor > 0.995 then
if game.evolution_factor > 0.995 then
global.evoFactorFloor = 10
global.evoFactorFloor = 10
global.evoFactorFloor = math.floor(game.evolution_factor * 10)
global.evoFactorFloor = math.floor(game.evolution_factor * 10)
global.tick = global.tick + 1800
global.tick = global.tick + 1800
if (unitsSpawnUnitsOnDeath and event.entity.type == "unit") or (spawnersSpawnUnitsOnDeath and event.entity.type == "unit-spawner") then
if (unitsSpawnUnitsOnDeath and event.entity.type == "unit") or (spawnersSpawnUnitsOnDeath and event.entity.type == "unit-spawner") then
spawnSubEnemies(event.entity)
queueSubEnemies(event.entity)
function spawnSubEnemies(enemy)
function queueSubEnemies(enemy)
local subEnemyName = global.subEnemyNameTable[enemy.name]
local subEnemyName = global.subEnemyNameTable[enemy.name]
if global.subEnemyNameTable[enemy.name][global.evoFactorFloor] then
if global.subEnemyNameTable[enemy.name][global.evoFactorFloor] then
subEnemyName = global.subEnemyNameTable[enemy.name][global.evoFactorFloor]
subEnemyName = global.subEnemyNameTable[enemy.name][global.evoFactorFloor]
local number = global.subEnemyNumberTable[enemy.name][global.evoFactorFloor]
local number = global.subEnemyNumberTable[enemy.name][global.evoFactorFloor]
for i = 1, number do
for i = 1, number do
local subEnemyPosition = enemy.surface.find_non_colliding_position(subEnemyName, enemy.position, 2 + isSpawner(enemy), 0.5)
table.insert(global.swarmQueue, {surface = enemy.surface, name = subEnemyName, position = enemy.position, force = enemy.force, isspawner = isSpawner(enemy)})
if subEnemyPosition then
-- local subEnemyPosition = enemy.surface.find_non_colliding_position(subEnemyName, enemy.position, 2 + isSpawner(enemy), 0.5)
enemy.surface.create_entity({name = subEnemyName, position = subEnemyPosition, force = enemy.force})
-- if subEnemyPosition then
end
-- enemy.surface.create_entity({name = subEnemyName, position = subEnemyPosition, force = enemy.force})
function isSpawner(enemy)
function isSpawner(enemy)
if enemy.type == "unit-spawner" then
if enemy.type == "unit-spawner" then
script.on_event(defines.events.on_tick, function(event)
if #(global.swarmQueue) > 0 then
local spawnstodo = math.min(spawnsPerTick, #(global.swarmQueue))
newEnemy = table.remove(global.swarmQueue,1)
local subEnemyPosition = newEnemy.surface.find_non_colliding_position(newEnemy.name, newEnemy.position, 2 + newEnemy.isspawner, 0.5)
newEnemy.surface.create_entity({name = newEnemy.name, position = subEnemyPosition, force = newEnemy.force})
table.insert(global.swarmQueue, {surface = newEnemy.surface, name = newEnemy.name, position = newEnemy.position, force = newEnemy.force, spawner = newEnemy.spawner}) -- we'll try spawning this again later!