From 597b20b9e5b6f4dc63eda075f738a66038d6838a Mon Sep 17 00:00:00 2001 From: Aaron Veden Date: Wed, 23 Feb 2022 21:04:34 -0800 Subject: [PATCH] FACTO-59: partial work towards independent bases --- Upgrade.lua | 24 ++++++--- control.lua | 121 ++++++++++++++++++++++-------------------- libs/AIAttackWave.lua | 81 ++++++++++++++-------------- libs/AIPlanning.lua | 1 + libs/BaseUtils.lua | 20 ++++--- libs/ChunkUtils.lua | 53 ++++++++---------- libs/MapProcessor.lua | 36 ++++++------- libs/MathUtils.lua | 2 +- libs/SquadDefense.lua | 4 +- 9 files changed, 176 insertions(+), 166 deletions(-) diff --git a/Upgrade.lua b/Upgrade.lua index 548719f..884c227 100644 --- a/Upgrade.lua +++ b/Upgrade.lua @@ -572,10 +572,6 @@ function upgrade.attempt(universe) universe.maps[mapId] = nil end end - - if universe.NEW_ENEMIES then - addBasesToAllEnemyStructures(universe, game.tick) - end end if global.version < 208 then global.version = 208 @@ -612,6 +608,22 @@ function upgrade.attempt(universe) universe.proxyEntityLookup = {} universe.vanillaEntityLookups = {} + end + if global.version < 210 then + global.version = 210 + + addBasesToAllEnemyStructures(universe, game.tick) + + local evoToTierMapping = {} + universe.evoToTierMapping = evoToTierMapping + + for i=1,10 do + evoToTierMapping[#evoToTierMapping+1] = (((i - 1) * 0.1) ^ 0.5) - 0.05 + end + + for chunkId in pairs(universe.vengenceQueue) do + universe.vengenceQueue[chunkId] = nil + end game.print("Rampant - Version 2.3.0") end @@ -685,8 +697,8 @@ function upgrade.prepMap(universe, surface) map.bases = {} map.baseIndex = 1 - map.baseIncrement = 0 - map.points = 0 + -- map.baseIncrement = 0 + -- map.points = 0 map.state = constants.AI_STATE_PEACEFUL map.squads = nil map.pendingAttack = nil diff --git a/control.lua b/control.lua index bb762b5..211c234 100644 --- a/control.lua +++ b/control.lua @@ -157,15 +157,19 @@ local function onIonCannonFired(event) if not map then return end - map.ionCannonBlasts = map.ionCannonBlasts + 1 - map.points = map.points + 4000 - if universe.aiPointsPrintGainsToChat then - game.print(map.surface.name .. ": Points: +" .. 4000 .. ". [Ion Cannon] Total: " .. string.format("%.2f", map.points)) - end local chunk = getChunkByPosition(map, event.position) if (chunk ~= -1) then - rallyUnits(chunk, map, event.tick) + local base = findNearbyBase(map, chunk) + if base then + base.ionCannonBlasts = base.ionCannonBlasts + 1 + rallyUnits(chunk, map, event.tick, base) + base.unitPoints = base.unitPoints + 4000 + if universe.aiPointsPrintGainsToChat then + game.print(map.surface.name .. ": Points: +" .. 4000 .. ". [Ion Cannon] Total: " .. + string.format("%.2f", base.points)) + end + end end end @@ -274,7 +278,6 @@ local function onConfigChanged() universe["ENEMY_SEED"] = settings.startup["rampant--enemySeed"].value universe["ENEMY_VARIATIONS"] = settings.startup["rampant--newEnemyVariations"].value - local usingNewEnemiesAlready = universe["NEW_ENEMIES"] universe["NEW_ENEMIES"] = settings.startup["rampant--newEnemies"].value if universe.NEW_ENEMIES then @@ -313,9 +316,7 @@ local function onConfigChanged() prepMap(universe, surface) end end - if (not usingNewEnemiesAlready) and universe.NEW_ENEMIES then - addBasesToAllEnemyStructures(universe, game.tick) - end + addBasesToAllEnemyStructures(universe, game.tick) end local function onBuild(event) @@ -405,10 +406,10 @@ local function onDeath(event) end map.lostEnemyUnits = map.lostEnemyUnits + 1 - map.points = map.points - UNIT_DEATH_POINT_COST - if universe.aiPointsPrintSpendingToChat then - game.print(map.surface.name .. ": Points: -" .. UNIT_DEATH_POINT_COST .. ". [Unit Lost] Total: " .. string.format("%.2f", map.points)) - end + -- map.points = map.points - UNIT_DEATH_POINT_COST + -- if universe.aiPointsPrintSpendingToChat then + -- game.print(map.surface.name .. ": Points: -" .. UNIT_DEATH_POINT_COST .. ". [Unit Lost] Total: " .. string.format("%.2f", map.points)) + -- end if (universe.random() < universe.rallyThreshold) and not surface.peaceful_mode then rallyUnits(chunk, map, tick) @@ -420,28 +421,31 @@ local function onDeath(event) else if event.force and (event.force.name ~= "enemy") then local rally = false - if (entityType == "unit-spawner") then - map.points = map.points + RECOVER_NEST_COST - if universe.aiPointsPrintGainsToChat then - game.print(map.surface.name .. ": Points: +" .. RECOVER_NEST_COST .. ". [Nest Lost] Total: " .. string.format("%.2f", map.points)) + if (chunk ~= -1) then + local base = findNearbyBase(map, chunk) + if (entityType == "unit-spawner") then + base.points = base.points + RECOVER_NEST_COST + if universe.aiPointsPrintGainsToChat then + game.print(map.surface.name .. ": Points: +" .. RECOVER_NEST_COST .. ". [Nest Lost] Total: " .. string.format("%.2f", base.points)) + end + rally = true + elseif (entityType == "turret") then + base.points = base.points + RECOVER_WORM_COST + if universe.aiPointsPrintGainsToChat then + game.print(map.surface.name .. ": Points: +" .. RECOVER_WORM_COST .. ". [Worm Lost] Total: " .. string.format("%.2f", base.points)) + end + rally = true end - rally = true - elseif (entityType == "turret") then - map.points = map.points + RECOVER_WORM_COST - if universe.aiPointsPrintGainsToChat then - game.print(map.surface.name .. ": Points: +" .. RECOVER_WORM_COST .. ". [Worm Lost] Total: " .. string.format("%.2f", map.points)) - end - rally = true - end - if (chunk ~= -1) and rally then - rallyUnits(chunk, map, tick) + if rally then + rallyUnits(chunk, map, tick, base) - if cause and cause.valid then - retreatUnits(chunk, - cause, - map, - tick, - RETREAT_SPAWNER_GRAB_RADIUS) + if cause and cause.valid then + retreatUnits(chunk, + cause, + map, + tick, + RETREAT_SPAWNER_GRAB_RADIUS) + end end end end @@ -486,17 +490,16 @@ local function onEnemyBaseBuild(event) map.activeSurface = true local chunk = getChunkByPosition(map, entity.position) if (chunk ~= -1) then - local base + local base = findNearbyBase(map, chunk) + if not base then + base = createBase(map, + chunk, + event.tick) + end + + registerEnemyBaseStructure(map, entity, event.tick, base) + if universe.NEW_ENEMIES then - base = findNearbyBase(map, chunk) - if not base then - base = createBase(map, - chunk, - event.tick) - end - - registerEnemyBaseStructure(map, entity, event.tick, base) - upgradeEntity(entity, base, map, @@ -620,10 +623,14 @@ local function onRocketLaunch(event) if not map then return end - map.rocketLaunched = map.rocketLaunched + 1 - map.points = map.points + 5000 - if universe.aiPointsPrintGainsToChat then - game.print(map.surface.name .. ": Points: +" .. 5000 .. ". [Rocket Launch] Total: " .. string.format("%.2f", map.points)) + local chunk = getChunkByPosition(entity.position) + if (chunk ~= -1) then + local base = findNearbyBase(map, chunk) + base.rocketLaunched = base.rocketLaunched + 1 + base.points = base.points + 5000 + if universe.aiPointsPrintGainsToChat then + game.print(map.surface.name .. ": Points: +" .. 5000 .. ". [Rocket Launch] Total: " .. string.format("%.2f", base.points)) + end end end end @@ -740,11 +747,9 @@ local function onUnitGroupCreated(event) squad = createSquad(nil, map, group, settler) universe.groupNumberToSquad[group.group_number] = squad - if universe.NEW_ENEMIES then - local chunk = getChunkByPosition(map, group.position) - if (chunk ~= -1) then - squad.base = findNearbyBase(map, chunk) - end + local chunk = getChunkByPosition(map, group.position) + if (chunk ~= -1) then + squad.base = findNearbyBase(map, chunk) end if settler then @@ -774,11 +779,9 @@ local function onUnitGroupCreated(event) squad = createSquad(nil, map, group, settler) universe.groupNumberToSquad[group.group_number] = squad - if universe.NEW_ENEMIES then - local chunk = getChunkByPosition(map, group.position) - if (chunk ~= -1) then - squad.base = findNearbyBase(map, chunk) - end + local chunk = getChunkByPosition(map, group.position) + if (chunk ~= -1) then + squad.base = findNearbyBase(map, chunk) end if settler then @@ -926,7 +929,7 @@ script.on_event(defines.events.on_tick, if (pick == 0) then processPendingChunks(universe, tick) processMapAIs(universe, gameRef.forces.enemy.evolution_factor, tick) - if map and universe.NEW_ENEMIES then + if map then recycleBases(map) end cleanUpMapTables(universe, tick) diff --git a/libs/AIAttackWave.lua b/libs/AIAttackWave.lua index 0b7cf47..0eaabb7 100644 --- a/libs/AIAttackWave.lua +++ b/libs/AIAttackWave.lua @@ -97,9 +97,9 @@ local function attackWaveScaling(universe) universe.random)) end -local function attackWaveValidCandidate(chunk, map) +local function attackWaveValidCandidate(chunk, map, base) local isValid = getNestActiveness(map, chunk) - if (map.state == AI_STATE_RAIDING) or (map.state == AI_STATE_SIEGE) or (map.state == AI_STATE_ONSLAUGHT) then + if (base.state == AI_STATE_RAIDING) or (base.state == AI_STATE_SIEGE) or (base.state == AI_STATE_ONSLAUGHT) then isValid = isValid + getRaidNestActiveness(map, chunk) end return (isValid > 0) @@ -177,8 +177,8 @@ local function visitPattern(o, cX, cY, distance) return startX, endX, stepX, startY, endY, stepY end -function aiAttackWave.rallyUnits(chunk, map, tick) - if ((tick - getRallyTick(map, chunk) > COOLDOWN_RALLY) and (map.points >= AI_VENGENCE_SQUAD_COST)) then +function aiAttackWave.rallyUnits(chunk, map, tick, base) + if ((tick - getRallyTick(map, chunk) > COOLDOWN_RALLY) and (base.unitPoints >= AI_VENGENCE_SQUAD_COST)) then setRallyTick(map, chunk, tick) local cX = chunk.x local cY = chunk.y @@ -193,7 +193,8 @@ function aiAttackWave.rallyUnits(chunk, map, tick) if not pack then pack = { v = 0, - map = map + map = map, + base = base } vengenceQueue[rallyChunk.id] = pack end @@ -207,11 +208,11 @@ function aiAttackWave.rallyUnits(chunk, map, tick) end end -function aiAttackWave.formSettlers(map, chunk) +function aiAttackWave.formSettlers(map, chunk, base) local universe = map.universe if (universe.builderCount < universe.AI_MAX_BUILDER_COUNT) and (map.random() < universe.formSquadThreshold) and - ((map.points - AI_SETTLER_COST) > 0) + ((base.unitPoints - AI_SETTLER_COST) > 0) then local surface = map.surface local squadPath, squadDirection @@ -244,23 +245,23 @@ function aiAttackWave.formSettlers(map, chunk) universe.formCommand.unit_count = scaledWaveSize local foundUnits = surface.set_multi_command(universe.formCommand) if (foundUnits > 0) then - if (map.state == AI_STATE_SIEGE) then - map.sentSiegeGroups = map.sentSiegeGroups + 1 + if (base.state == AI_STATE_SIEGE) then + base.sentSiegeGroups = base.sentSiegeGroups + 1 end - if universe.NEW_ENEMIES then - squad.base = findNearbyBase(map, chunk) - end + squad.base = base local kamikazeThreshold = calculateKamikazeSettlerThreshold(foundUnits, universe) - if map.state == AI_STATE_SIEGE then + if base.state == AI_STATE_SIEGE then kamikazeThreshold = kamikazeThreshold * 2.5 end squad.kamikaze = map.random() < kamikazeThreshold universe.builderCount = universe.builderCount + 1 - map.points = map.points - AI_SETTLER_COST + base.unitPoints = base.unitPoints - AI_SETTLER_COST if universe.aiPointsPrintSpendingToChat then - game.print(map.surface.name .. ": Points: -" .. AI_SETTLER_COST .. ". [Settler] Total: " .. string.format("%.2f", map.points) .. " [gps=" .. squadPosition.x .. "," .. squadPosition.y .. "]") + game.print(map.surface.name .. ": Points: -" .. AI_SETTLER_COST .. ". [Settler] Total: " .. + string.format("%.2f", base.unitPoints) .. " [gps=" .. squadPosition.x .. "," .. + squadPosition.y .. "]") end universe.groupNumberToSquad[squad.groupNumber] = squad else @@ -273,11 +274,11 @@ function aiAttackWave.formSettlers(map, chunk) end end -function aiAttackWave.formVengenceSquad(map, chunk) +function aiAttackWave.formVengenceSquad(map, chunk, base) local universe = map.universe if (universe.squadCount < universe.AI_MAX_SQUAD_COUNT) and (map.random() < universe.formSquadThreshold) and - ((map.points - AI_VENGENCE_SQUAD_COST) > 0) + ((base.unitPoints - AI_VENGENCE_SQUAD_COST) > 0) then local surface = map.surface local squadPath, squadDirection = scoreNeighborsForFormation(getNeighborChunks(map, chunk.x, chunk.y), @@ -302,15 +303,14 @@ function aiAttackWave.formVengenceSquad(map, chunk) universe.formCommand.unit_count = scaledWaveSize local foundUnits = surface.set_multi_command(universe.formCommand) if (foundUnits > 0) then - if universe.NEW_ENEMIES then - squad.base = findNearbyBase(map, chunk) - end + squad.base = base squad.kamikaze = map.random() < calculateKamikazeSquadThreshold(foundUnits, universe) universe.groupNumberToSquad[squad.groupNumber] = squad universe.squadCount = universe.squadCount + 1 - map.points = map.points - AI_VENGENCE_SQUAD_COST + base.unitPoints = base.unitPoints - AI_VENGENCE_SQUAD_COST if universe.aiPointsPrintSpendingToChat then - game.print(map.surface.name .. ": Points: -" .. AI_VENGENCE_SQUAD_COST .. ". [Vengence] Total: " .. string.format("%.2f", map.points) .. " [gps=" .. squadPosition.x .. "," .. squadPosition.y .. "]") + game.print(map.surface.name .. ": Points: -" .. AI_VENGENCE_SQUAD_COST .. ". [Vengence] Total: " .. + string.format("%.2f", base.unitPoints) .. " [gps=" .. squadPosition.x .. "," .. squadPosition.y .. "]") end else if (squad.group.valid) then @@ -322,11 +322,11 @@ function aiAttackWave.formVengenceSquad(map, chunk) end end -function aiAttackWave.formVengenceSettler(map, chunk) +function aiAttackWave.formVengenceSettler(map, chunk, base) local universe = map.universe if (universe.builderCount < universe.AI_MAX_BUILDER_COUNT) and (map.random() < universe.formSquadThreshold) and - ((map.points - AI_VENGENCE_SQUAD_COST) > 0) + ((base.unitPoints - AI_VENGENCE_SQUAD_COST) > 0) then local surface = map.surface local squadPath, squadDirection = scoreNeighborsForFormation(getNeighborChunks(map, chunk.x, chunk.y), @@ -351,15 +351,14 @@ function aiAttackWave.formVengenceSettler(map, chunk) universe.formCommand.unit_count = scaledWaveSize local foundUnits = surface.set_multi_command(universe.formCommand) if (foundUnits > 0) then - if universe.NEW_ENEMIES then - squad.base = findNearbyBase(map, chunk) - end + squad.base = base squad.kamikaze = map.random() < calculateKamikazeSettlerThreshold(foundUnits, universe) universe.groupNumberToSquad[squad.groupNumber] = squad universe.builderCount = universe.builderCount + 1 - map.points = map.points - AI_VENGENCE_SQUAD_COST + base.unitPoints = base.unitPoints - AI_VENGENCE_SQUAD_COST if universe.aiPointsPrintSpendingToChat then - game.print(map.surface.name .. ": Points: -" .. AI_VENGENCE_SQUAD_COST .. ". [Vengence Settlers] Total: " .. string.format("%.2f", map.points) .. " [gps=" .. squadPosition.x .. "," .. squadPosition.y .. "]") + game.print(map.surface.name .. ": Points: -" .. AI_VENGENCE_SQUAD_COST .. ". [Vengence Settlers] Total: " .. + string.format("%.2f", base.unitPoints) .. " [gps=" .. squadPosition.x .. "," .. squadPosition.y .. "]") end else if (squad.group.valid) then @@ -371,12 +370,12 @@ function aiAttackWave.formVengenceSettler(map, chunk) end end -function aiAttackWave.formSquads(map, chunk) +function aiAttackWave.formSquads(map, chunk, base) local universe = map.universe if (universe.squadCount < universe.AI_MAX_SQUAD_COUNT) and - attackWaveValidCandidate(chunk, map) and + attackWaveValidCandidate(chunk, map, base) and (map.random() < universe.formSquadThreshold) and - ((map.points - AI_SQUAD_COST) > 0) + ((base.unitPoints - AI_SQUAD_COST) > 0) then local surface = map.surface local squadPath, squadDirection = scoreNeighborsForFormation(getNeighborChunks(map, chunk.x, chunk.y), @@ -401,22 +400,22 @@ function aiAttackWave.formSquads(map, chunk) universe.formCommand.unit_count = scaledWaveSize local foundUnits = surface.set_multi_command(universe.formCommand) if (foundUnits > 0) then - if (map.state == AI_STATE_SIEGE) then - map.sentSiegeGroups = 0 + if (base.state == AI_STATE_SIEGE) then + base.sentSiegeGroups = 0 end - if universe.NEW_ENEMIES then - squad.base = findNearbyBase(map, chunk) - end + squad.base = base squad.kamikaze = map.random() < calculateKamikazeSquadThreshold(foundUnits, universe) - map.points = map.points - AI_SQUAD_COST + base.unitPoints = base.unitPoints - AI_SQUAD_COST universe.squadCount = universe.squadCount + 1 universe.groupNumberToSquad[squad.groupNumber] = squad - if (map.state == AI_STATE_AGGRESSIVE) then - map.sentAggressiveGroups = map.sentAggressiveGroups + 1 + if (base.state == AI_STATE_AGGRESSIVE) then + base.sentAggressiveGroups = base.sentAggressiveGroups + 1 end if universe.aiPointsPrintSpendingToChat then - game.print(map.surface.name .. ": Points: -" .. AI_SQUAD_COST .. ". [Squad] Total: " .. string.format("%.2f", map.points) .. " [gps=" .. squadPosition.x .. "," .. squadPosition.y .. "]") + game.print(map.surface.name .. ": Points: -" .. AI_SQUAD_COST .. ". [Squad] Total: " .. + string.format("%.2f", base.unitPoints) .. " [gps=" .. squadPosition.x .. "," .. + squadPosition.y .. "]") end else if (squad.group.valid) then diff --git a/libs/AIPlanning.lua b/libs/AIPlanning.lua index ba92986..c15189a 100644 --- a/libs/AIPlanning.lua +++ b/libs/AIPlanning.lua @@ -98,6 +98,7 @@ local function planning(map, evolution_factor, tick) end local maxOverflowPoints = maxPoints * 3 + universe.maxOverflowPoints = maxOverflowPoints local attackWaveMaxSize = universe.attackWaveMaxSize universe.retreatThreshold = linearInterpolation(evolution_factor, diff --git a/libs/BaseUtils.lua b/libs/BaseUtils.lua index 09182cb..77cf74f 100644 --- a/libs/BaseUtils.lua +++ b/libs/BaseUtils.lua @@ -52,12 +52,15 @@ local BASE_DISTANCE_TO_EVO_INDEX = constants.BASE_DISTANCE_TO_EVO_INDEX local CHUNK_SIZE = constants.CHUNK_SIZE +local BASE_PROCESS_INTERVAL = constants.BASE_PROCESS_INTERVAL + -- imported functions local setPositionXYInQuery = queryUtils.setPositionXYInQuery local randomTickEvent = mathUtils.randomTickEvent local euclideanDistancePoints = mathUtils.euclideanDistancePoints +local manhattenDistancePoints = mathUtils.manhattenDistancePoints local getChunkByPosition = mapUtils.getChunkByPosition @@ -106,7 +109,7 @@ function baseUtils.findNearbyBase(map, chunk) local bases = map.bases local closest = MAGIC_MAXIMUM_NUMBER for _, base in pairs(bases) do - local distance = euclideanDistancePoints(base.x, base.y, x, y) + local distance = manhattenDistancePoints(base.x, base.y, x, y) if (distance <= base.distanceThreshold) and (distance < closest) then closest = distance foundBase = base @@ -440,6 +443,10 @@ local function upgradeBaseBasedOnDamage(map, base) end function baseUtils.processBase(chunk, map, tick, base) + if ((tick - base.tick) <= BASE_PROCESS_INTERVAL) then + return + end + if not base.alignment[1] then return end @@ -512,10 +519,14 @@ function baseUtils.processBase(chunk, map, tick, base) end base.points = base.points + map.baseIncrement + base.unitPoints = base.unitPoints + map.baseIncrement if (base.points > universe.maxPoints) then base.points = universe.maxPoints end + if (base.unitPoints > universe.maxPoints) then + base.unitPoints = universe.unitPoints + end if (base.stateTick <= tick) then local roll = map.random() @@ -570,6 +581,7 @@ function baseUtils.createBase(map, chunk, tick) chunkCount = 0, createdTick = tick, points = 0, + unitPoints = 0, id = universe.baseId } universe.baseId = universe.baseId + 1 @@ -586,8 +598,6 @@ function baseUtils.rebuildNativeTables(universe, rg) universe.buildingSpaceLookup = buildingSpaceLookup local enemyAlignmentLookup = {} universe.enemyAlignmentLookup = enemyAlignmentLookup - local evoToTierMapping = {} - universe.evoToTierMapping = evoToTierMapping local upgradeLookup = {} universe.upgradeLookup = upgradeLookup local buildingEvolveLookup = {} @@ -601,10 +611,6 @@ function baseUtils.rebuildNativeTables(universe, rg) local vanillaEntityLookups = {} universe.vanillaEntityTypeLookup = vanillaEntityLookups - for i=1,10 do - evoToTierMapping[#evoToTierMapping+1] = (((i - 1) * 0.1) ^ 0.5) - 0.05 - end - buildingHiveTypeLookup["biter-spawner"] = "biter-spawner" buildingHiveTypeLookup["spitter-spawner"] = "spitter-spawner" buildingHiveTypeLookup["small-worm-turret"] = "turret" diff --git a/libs/ChunkUtils.lua b/libs/ChunkUtils.lua index 78fd533..42f9c5b 100644 --- a/libs/ChunkUtils.lua +++ b/libs/ChunkUtils.lua @@ -245,12 +245,12 @@ function chunkUtils.initialScan(chunk, map, tick) end if (#enemyBuildings > 0) then - if universe.NEW_ENEMIES then - local base = findNearbyBase(map, chunk) - if not base then - base = createBase(map, chunk, tick) - end + local base = findNearbyBase(map, chunk) + if not base then + base = createBase(map, chunk, tick) + end + if universe.NEW_ENEMIES then local unitList = surface.find_entities_filtered(universe.isFilteredEntitiesUnitQuery) for i=1,#unitList do local unit = unitList[i] @@ -271,7 +271,7 @@ function chunkUtils.initialScan(chunk, map, tick) else for i=1,#enemyBuildings do local building = enemyBuildings[i] - chunkUtils.registerEnemyBaseStructure(map, building, tick) + chunkUtils.registerEnemyBaseStructure(map, building, tick, base) end end end @@ -347,12 +347,9 @@ function chunkUtils.mapScanEnemyChunk(chunk, map, tick) for i=1,#HIVE_BUILDINGS_TYPES do counts[HIVE_BUILDINGS_TYPES[i]] = 0 end - local base - if universe.NEW_ENEMIES then - base = findNearbyBase(map, chunk) - if not base then - base = createBase(map, chunk, tick) - end + local base = findNearbyBase(map, chunk) + if not base then + base = createBase(map, chunk, tick) end for i=1,#buildings do local building = buildings[i] @@ -513,16 +510,14 @@ function chunkUtils.registerEnemyBaseStructure(map, entity, tick, incomingBase, if (chunk ~= -1) then if addFunc(map, chunk, entityUnitNumber) then added = true - if universe.NEW_ENEMIES then - local base = incomingBase + local base = incomingBase + if not base then + base = findNearbyBase(map, chunk) if not base then - base = findNearbyBase(map, chunk) - if not base then - base = createBase(map, chunk, tick) - end + base = createBase(map, chunk, tick) end - setChunkBase(map, chunk, base) end + setChunkBase(map, chunk, base) end if (hiveType == "spitter-spawner") or (hiveType == "biter-spawner") then processNestActiveness(map, chunk) @@ -572,17 +567,15 @@ function chunkUtils.unregisterEnemyBaseStructure(map, entity, damageType, skipCo end if removeFunc(map, chunk, entityUnitNumber) then removed = true - if map.universe.NEW_ENEMIES then - local base = getChunkBase(map, chunk) - if damageType and not usedBases[base.id] then - usedBases[base.id] = true - local damageTypeName = damageType.name - base.damagedBy[damageTypeName] = (base.damagedBy[damageTypeName] or 0) + 3 - base.deathEvents = base.deathEvents + 3 - end - if (getEnemyStructureCount(map, chunk) <= 0) then - removeChunkBase(map, chunk, base) - end + local base = getChunkBase(map, chunk) + if damageType and not usedBases[base.id] then + usedBases[base.id] = true + local damageTypeName = damageType.name + base.damagedBy[damageTypeName] = (base.damagedBy[damageTypeName] or 0) + 3 + base.deathEvents = base.deathEvents + 3 + end + if (getEnemyStructureCount(map, chunk) <= 0) then + removeChunkBase(map, chunk, base) end end end diff --git a/libs/MapProcessor.lua b/libs/MapProcessor.lua index 27c21af..4746e83 100644 --- a/libs/MapProcessor.lua +++ b/libs/MapProcessor.lua @@ -58,8 +58,6 @@ local COOLDOWN_DRAIN = constants.COOLDOWN_DRAIN local COOLDOWN_RALLY = constants.COOLDOWN_RALLY local COOLDOWN_RETREAT = constants.COOLDOWN_RETREAT -local BASE_PROCESS_INTERVAL = constants.BASE_PROCESS_INTERVAL - -- imported functions local removeChunkToNest = mapUtils.removeChunkToNest @@ -225,6 +223,7 @@ function mapProcessor.processPlayers(players, universe, tick) local playerChunk = getChunkByPosition(map, char.position) if (playerChunk ~= -1) then + local base = findNearbyBase(map, playerChunk) local vengence = allowingAttacks and (map.points >= AI_VENGENCE_SQUAD_COST) and ((getEnemyStructureCount(map, playerChunk) > 0) or @@ -247,7 +246,8 @@ function mapProcessor.processPlayers(players, universe, tick) if not pack then pack = { v = 0, - map = map + map = map, + base = base } universe.vengenceQueue[chunk.id] = pack end @@ -449,9 +449,9 @@ function mapProcessor.processVengence(universe) end local chunk = getChunkById(vengencePack.map, chunkId) if universe.enabledMigration and (universe.random() < 0.075) then - formVengenceSettler(map, chunk) + formVengenceSettler(map, chunk, vengencePack.base) else - formVengenceSquad(map, chunk) + formVengenceSquad(map, chunk, vengencePack.base) end end end @@ -477,12 +477,10 @@ function mapProcessor.processNests(universe, tick) processNestActiveness(map, chunk) queueNestSpawners(map, chunk, tick) - if universe.NEW_ENEMIES then - local base = getChunkBase(map, chunk) - if base and ((tick - base.tick) > BASE_PROCESS_INTERVAL) then - processBase(chunk, map, tick, base) - end - end + processBase(chunk, + map, + tick, + getChunkBase(map, chunk)) end end @@ -508,31 +506,31 @@ local function processSpawnersBody(universe, iterator, chunks) return end local state = chunkPack.map.state - if state == AI_STATE_PEACEFUL then + if base.state == AI_STATE_PEACEFUL then return end if iterator == "processMigrationIterator" then - if (state ~= AI_STATE_MIGRATING) and (state ~= AI_STATE_SIEGE) then + if (base.state ~= AI_STATE_MIGRATING) and (state ~= AI_STATE_SIEGE) then return end elseif iterator == "processActiveRaidSpawnerIterator" then - if (state == AI_STATE_AGGRESSIVE) or (state == AI_STATE_MIGRATING) then + if (base.state == AI_STATE_AGGRESSIVE) or (base.state == AI_STATE_MIGRATING) then return end elseif iterator == "processActiveSpawnerIterator" then - if (state == AI_STATE_MIGRATING) then + if (base.state == AI_STATE_MIGRATING) then return end end local chunk = getChunkById(map, chunkId) - local migrate = canMigrate(map) - local attack = canAttack(map) + local migrate = canMigrate(map, base) + local attack = canAttack(map, base) if migrate then - formSettlers(map, chunk) + formSettlers(map, chunk, base) end if attack then - formSquads(map, chunk) + formSquads(map, chunk, base) end end end diff --git a/libs/MathUtils.lua b/libs/MathUtils.lua index 7d5c5c0..77e3b42 100644 --- a/libs/MathUtils.lua +++ b/libs/MathUtils.lua @@ -136,7 +136,7 @@ function mathUtils.euclideanDistancePoints(x1, y1, x2, y2) return ((xs * xs) + (ys * ys)) ^ 0.5 end -function mathUtils.mahattenDistancePoints(x1, y1, x2, y2) +function mathUtils.manhattenDistancePoints(x1, y1, x2, y2) local xs = x1 - x2 local ys = y1 - y2 return mAbs(xs + ys) diff --git a/libs/SquadDefense.lua b/libs/SquadDefense.lua index 73216ca..680e160 100644 --- a/libs/SquadDefense.lua +++ b/libs/SquadDefense.lua @@ -143,9 +143,7 @@ function aiDefense.retreatUnits(chunk, cause, map, tick, radius) end if created then - if universe.NEW_ENEMIES then - newSquad.base = findNearbyBase(map, chunk) - end + newSquad.base = findNearbyBase(map, chunk) universe.groupNumberToSquad[newSquad.groupNumber] = newSquad universe.squadCount = universe.squadCount + 1 end