1
0
mirror of https://github.com/veden/Rampant.git synced 2025-01-05 22:53:24 +02:00
Rampant/libs/AIDefense.lua

111 lines
3.8 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
2017-01-20 07:58:36 +02:00
local RETREAT_GRAB_RADIUS = constants.RETREAT_GRAB_RADIUS
2016-10-15 02:00:18 +02:00
local MOVEMENT_PHEROMONE = constants.MOVEMENT_PHEROMONE
local PLAYER_PHEROMONE = constants.PLAYER_PHEROMONE
2016-10-15 02:00:18 +02:00
local BASE_PHEROMONE = constants.BASE_PHEROMONE
local ENEMY_BASE_GENERATOR = constants.ENEMY_BASE_GENERATOR
local HALF_CHUNK_SIZE = constants.HALF_CHUNK_SIZE
local SQUAD_RETREATING = constants.SQUAD_RETREATING
local RETREAT_FILTER = constants.RETREAT_FILTER
2017-04-22 01:14:04 +02:00
local RETREAT_TRIGGERED = constants.RETREAT_TRIGGERED
local INTERVAL_LOGIC = constants.INTERVAL_LOGIC
-- imported functions
local getNeighborChunksWithDirection = mapUtils.getNeighborChunksWithDirection
local findNearBySquad = unitGroupUtils.findNearBySquad
2016-09-14 19:53:49 +02:00
local addSquadMovementPenalty = unitGroupUtils.addSquadMovementPenalty
local createSquad = unitGroupUtils.createSquad
local membersToSquad = unitGroupUtils.membersToSquad
local scoreNeighborsWithDirection = neighborUtils.scoreNeighborsWithDirection
2016-10-31 05:24:14 +02:00
local canMoveChunkDirection = mapUtils.canMoveChunkDirection
-- module code
local function validRetreatLocation(x, chunk, neighborChunk)
2016-10-31 05:24:14 +02:00
return canMoveChunkDirection(x, chunk, neighborChunk)
end
local function scoreRetreatLocation(position, squad, neighborChunk, surface)
2016-10-15 02:00:18 +02:00
local safeScore = -neighborChunk[BASE_PHEROMONE] + neighborChunk[MOVEMENT_PHEROMONE]
2017-04-22 01:14:04 +02:00
local dangerScore = surface.get_pollution(position) + (neighborChunk[PLAYER_PHEROMONE] * 100) + (neighborChunk[ENEMY_BASE_GENERATOR] * 50)
return safeScore - dangerScore
end
2017-04-22 01:14:04 +02:00
function aiDefense.retreatUnits(chunk, squad, regionMap, surface, natives, tick)
if (tick - chunk[RETREAT_TRIGGERED] > INTERVAL_LOGIC) and (chunk[ENEMY_BASE_GENERATOR] == 0) then
2016-11-04 01:51:35 +02:00
local performRetreat = false
local enemiesToSquad
2016-11-04 01:51:35 +02:00
if (squad == nil) then
2017-01-20 07:58:36 +02:00
enemiesToSquad = surface.find_enemy_units({x=chunk.pX,
y=chunk.pY}, RETREAT_GRAB_RADIUS)
2016-11-04 01:51:35 +02:00
if (#enemiesToSquad > 0) then
performRetreat = true
end
elseif squad.group.valid and (squad.status ~= SQUAD_RETREATING) and not squad.kamikaze then
if (#squad.group.members > 1) then
performRetreat = true
end
end
2016-11-04 01:51:35 +02:00
if performRetreat then
2017-04-22 01:14:04 +02:00
chunk[RETREAT_TRIGGERED] = tick
local retreatPosition = {x=0, y=0}
2016-11-04 01:51:35 +02:00
local exitPath,_ = scoreNeighborsWithDirection(chunk,
getNeighborChunksWithDirection(regionMap, chunk.cX, chunk.cY),
validRetreatLocation,
scoreRetreatLocation,
nil,
surface,
2016-11-04 01:51:35 +02:00
retreatPosition,
false)
if (exitPath ~= nil) then
retreatPosition.x = exitPath.pX + HALF_CHUNK_SIZE
retreatPosition.y = exitPath.pY + HALF_CHUNK_SIZE
2016-11-04 01:51:35 +02:00
-- 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
2016-11-04 01:51:35 +02:00
local newSquad = findNearBySquad(natives, retreatPosition, HALF_CHUNK_SIZE, RETREAT_FILTER)
2016-11-04 01:51:35 +02:00
if (newSquad == nil) then
newSquad = createSquad(retreatPosition, surface, natives)
newSquad.status = SQUAD_RETREATING
newSquad.cycles = 4
end
2016-11-04 01:51:35 +02:00
if (enemiesToSquad ~= nil) then
membersToSquad(newSquad, enemiesToSquad, false)
else
membersToSquad(newSquad, squad.group.members, true)
2016-09-14 19:53:49 +02:00
newSquad.penalties = squad.penalties
if squad.rabid then
newSquad.rabid = true
end
2016-11-04 01:51:35 +02:00
end
2016-09-14 19:53:49 +02:00
addSquadMovementPenalty(newSquad, chunk.cX, chunk.cY)
2016-11-04 01:51:35 +02:00
end
end
end
end
return aiDefense