1
0
mirror of https://github.com/veden/Rampant.git synced 2025-01-20 02:59:47 +02:00
Rampant/libs/AIDefense.lua

110 lines
4.3 KiB
Lua
Raw Normal View History

local aiDefense = {}
-- imports
local constants = require("Constants")
local mapUtils = require("MapUtils")
local unitGroupUtils = require("UnitGroupUtils")
local neighborUtils = require("NeighborUtils")
-- constants
2016-10-14 17:00:18 -07:00
local MOVEMENT_PHEROMONE = constants.MOVEMENT_PHEROMONE
local PLAYER_PHEROMONE = constants.PLAYER_PHEROMONE
2016-10-14 17:00:18 -07:00
local BASE_PHEROMONE = constants.BASE_PHEROMONE
2016-10-14 17:00:18 -07:00
local RETREAT_MOVEMENT_PHEROMONE_LEVEL = constants.RETREAT_MOVEMENT_PHEROMONE_LEVEL
local ENEMY_BASE_GENERATOR = constants.ENEMY_BASE_GENERATOR
local HALF_CHUNK_SIZE = constants.HALF_CHUNK_SIZE
local SQUAD_RETREATING = constants.SQUAD_RETREATING
local SQUAD_SUICIDE_HUNT = constants.SQUAD_SUICIDE_HUNT
local SQUAD_SUICIDE_RAID = constants.SQUAD_SUICIDE_RAID
local RETREAT_FILTER = constants.RETREAT_FILTER
-- imported functions
local getChunkByPosition = mapUtils.getChunkByPosition
local getNeighborChunksWithDirection = mapUtils.getNeighborChunksWithDirection
local findNearBySquad = unitGroupUtils.findNearBySquad
2016-09-14 10:53:49 -07:00
local addSquadMovementPenalty = unitGroupUtils.addSquadMovementPenalty
local createSquad = unitGroupUtils.createSquad
local membersToSquad = unitGroupUtils.membersToSquad
local scoreNeighborsWithDirection = neighborUtils.scoreNeighborsWithDirection
2016-10-30 20:24:14 -07:00
local canMoveChunkDirection = mapUtils.canMoveChunkDirection
-- module code
local function validRetreatLocation(x, chunk, neighborChunk)
2016-10-30 20:24:14 -07:00
return canMoveChunkDirection(x, chunk, neighborChunk)
end
local function scoreRetreatLocation(position, squad, neighborChunk, surface)
2016-10-14 17:00:18 -07:00
local safeScore = -neighborChunk[BASE_PHEROMONE] + neighborChunk[MOVEMENT_PHEROMONE]
2016-10-30 20:24:14 -07:00
local dangerScore = surface.get_pollution(position) + (neighborChunk[PLAYER_PHEROMONE] * 25) + (neighborChunk[ENEMY_BASE_GENERATOR] * 6)
return safeScore - dangerScore
end
function aiDefense.retreatUnits(position, squad, regionMap, surface, natives)
local chunk = getChunkByPosition(regionMap, position.x, position.y)
2016-10-14 17:00:18 -07:00
if (chunk ~= nil) and (chunk[MOVEMENT_PHEROMONE] > -(game.evolution_factor * RETREAT_MOVEMENT_PHEROMONE_LEVEL)) then
local performRetreat = false
local enemiesToSquad
if (squad == nil) then
enemiesToSquad = surface.find_enemy_units(position, 15)
if (#enemiesToSquad > 1) then
performRetreat = true
end
elseif squad.group.valid and (squad.status ~= SQUAD_RETREATING) and (squad.status ~= SQUAD_SUICIDE_HUNT) and (squad.status ~= SQUAD_SUICIDE_RAID) then
if (#squad.group.members > 1) then
performRetreat = true
end
end
if performRetreat then
local retreatPosition = {x=0, y=0}
local exitPath,_ = scoreNeighborsWithDirection(chunk,
getNeighborChunksWithDirection(regionMap, chunk.cX, chunk.cY),
validRetreatLocation,
scoreRetreatLocation,
nil,
surface,
retreatPosition)
if (exitPath ~= nil) then
-- retreatPosition = positionDirectionToChunkCorner(exitDirection, exitPath)
retreatPosition.x = exitPath.pX + HALF_CHUNK_SIZE
retreatPosition.y = exitPath.pY + HALF_CHUNK_SIZE
-- in order for units in a group attacking to retreat, we have to create a new group and give the command to join
-- to each unit, this is the only way I have found to have snappy mid battle retreats even after 0.14.4
local newSquad = findNearBySquad(natives, retreatPosition, HALF_CHUNK_SIZE, RETREAT_FILTER)
if (newSquad == nil) then
newSquad = createSquad(retreatPosition, surface, natives)
newSquad.status = SQUAD_RETREATING
newSquad.cycles = 6
end
if (enemiesToSquad ~= nil) then
membersToSquad(newSquad, enemiesToSquad, false)
else
membersToSquad(newSquad, squad.group.members, true)
2016-09-14 10:53:49 -07:00
newSquad.penalties = squad.penalties
if squad.rabid then
newSquad.rabid = true
end
end
2016-09-14 10:53:49 -07:00
addSquadMovementPenalty(newSquad, chunk.cX, chunk.cY)
end
end
end
end
return aiDefense