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

144 lines
5.2 KiB
Lua
Raw Normal View History

2016-10-15 02:00:18 +02:00
local aiPlanning = {}
-- imports
local constants = require("Constants")
local mathUtils = require("MathUtils")
2017-05-28 06:50:37 +02:00
local aiPredicates = require("AIPredicates")
2017-06-01 03:46:53 +02:00
2016-10-15 02:00:18 +02:00
-- constants
2017-06-01 03:46:53 +02:00
local NO_RETREAT_BASE_PERCENT = constants.NO_RETREAT_BASE_PERCENT
local NO_RETREAT_EVOLUTION_BONUS_MAX = constants.NO_RETREAT_EVOLUTION_BONUS_MAX
2016-10-15 02:00:18 +02:00
local AI_STATE_PEACEFUL = constants.AI_STATE_PEACEFUL
local AI_STATE_AGGRESSIVE = constants.AI_STATE_AGGRESSIVE
local AI_STATE_RAIDING = constants.AI_STATE_RAIDING
local AI_STATE_MIGRATING = constants.AI_STATE_MIGRATING
2017-05-14 00:32:16 +02:00
local AI_STATE_NOCTURNAL = constants.AI_STATE_NOCTURNAL
local AI_STATE_SIEGE = constants.AI_STATE_SIEGE
2016-10-15 02:00:18 +02:00
2017-06-01 03:46:53 +02:00
local AI_UNIT_REFUND = constants.AI_UNIT_REFUND
2018-02-10 10:42:17 +02:00
local AI_MAX_OVERFLOW_POINTS = constants.AI_MAX_OVERFLOW_POINTS
2016-10-15 02:00:18 +02:00
local AI_MAX_POINTS = constants.AI_MAX_POINTS
local AI_POINT_GENERATOR_AMOUNT = constants.AI_POINT_GENERATOR_AMOUNT
local AI_MIN_STATE_DURATION = constants.AI_MIN_STATE_DURATION
local AI_MIN_TEMPERAMENT_DURATION = constants.AI_MIN_TEMPERAMENT_DURATION
local AI_MAX_STATE_DURATION = constants.AI_MAX_STATE_DURATION
local AI_MAX_TEMPERAMENT_DURATION = constants.AI_MAX_TEMPERAMENT_DURATION
2018-01-24 08:12:31 +02:00
-- local AI_MAX_SQUAD_COUNT = constants.AI_MAX_SQUAD_COUNT
2017-05-27 02:58:33 +02:00
2017-06-01 03:46:53 +02:00
local BASE_RALLY_CHANCE = constants.BASE_RALLY_CHANCE
local BONUS_RALLY_CHANCE = constants.BONUS_RALLY_CHANCE
2018-02-19 02:21:18 +02:00
local RETREAT_MOVEMENT_PHEROMONE_LEVEL_MIN = constants.RETREAT_MOVEMENT_PHEROMONE_LEVEL_MIN
local RETREAT_MOVEMENT_PHEROMONE_LEVEL_MAX = constants.RETREAT_MOVEMENT_PHEROMONE_LEVEL_MAX
2017-06-01 03:46:53 +02:00
local TICKS_A_MINUTE = constants.TICKS_A_MINUTE
2016-10-15 02:00:18 +02:00
-- imported functions
2017-05-28 06:50:37 +02:00
local canAttack = aiPredicates.canAttack
2017-05-14 00:32:16 +02:00
2016-10-15 02:00:18 +02:00
local randomTickEvent = mathUtils.randomTickEvent
local linearInterpolation = mathUtils.linearInterpolation
local mFloor = math.floor
local mRandom = math.random
2016-10-15 02:00:18 +02:00
local mMax = math.max
-- module code
2017-05-28 06:50:37 +02:00
local function isShockwaveReady(evolution_factor, natives, surface, tick, maxPoints)
return canAttack(natives, surface) and
(tick - natives.lastShakeMessage > TICKS_A_MINUTE * 5) and
2018-01-24 08:02:06 +02:00
((evolution_factor > 0.7) and (natives.points > maxPoints * 0.85) and (#natives.squads > 20))
2017-05-28 06:50:37 +02:00
end
function aiPlanning.planning(natives, evolution_factor, tick, surface, connectedPlayers)
2016-10-15 02:00:18 +02:00
local maxPoints = AI_MAX_POINTS * evolution_factor
2017-06-01 03:46:53 +02:00
2017-05-14 00:32:16 +02:00
if natives.aiNocturnalMode then
maxPoints = maxPoints * 0.85
end
2017-06-01 03:46:53 +02:00
local attackWaveMaxSize = natives.attackWaveMaxSize
2018-02-19 02:21:18 +02:00
natives.retreatThreshold = linearInterpolation(evolution_factor, RETREAT_MOVEMENT_PHEROMONE_LEVEL_MIN, RETREAT_MOVEMENT_PHEROMONE_LEVEL_MAX)
2017-06-01 03:46:53 +02:00
natives.rallyThreshold = BASE_RALLY_CHANCE + (evolution_factor * BONUS_RALLY_CHANCE)
natives.formSquadThreshold = mMax((0.25 * evolution_factor), 0.10)
2017-06-01 03:46:53 +02:00
natives.attackWaveSize = attackWaveMaxSize * (evolution_factor ^ 1.66667)
natives.attackWaveDeviation = (attackWaveMaxSize * 0.5) * 0.333
natives.attackWaveUpperBound = attackWaveMaxSize + (attackWaveMaxSize * 0.25)
natives.settlerWaveSize = linearInterpolation(evolution_factor ^ 1.66667, natives.expansionMinSize, natives.expansionMaxSize)
natives.settlerWaveDeviation = (natives.settlerWaveSize * 0.5) * 0.333
2018-02-17 05:31:29 +02:00
natives.settlerCooldown = mFloor(linearInterpolation(evolution_factor ^ 1.66667, natives.expansionMinTime, natives.expansionMaxTime))
2017-06-01 03:46:53 +02:00
natives.unitRefundAmount = AI_UNIT_REFUND * evolution_factor
natives.kamikazeThreshold = NO_RETREAT_BASE_PERCENT + (evolution_factor * NO_RETREAT_EVOLUTION_BONUS_MAX)
local threshold = natives.attackThresholdRange
natives.attackWaveThreshold = (threshold - (threshold * evolution_factor)) + natives.attackThresholdMin
local points = mFloor((AI_POINT_GENERATOR_AMOUNT * mRandom()) + ((AI_POINT_GENERATOR_AMOUNT * 0.7) * (evolution_factor ^ 2.5)) * natives.aiPointsScaler)
natives.baseIncrement = points
2017-06-01 03:46:53 +02:00
2016-10-15 02:00:18 +02:00
if (natives.points < maxPoints) then
natives.points = natives.points + points
2016-10-15 02:00:18 +02:00
end
if (natives.temperamentTick == tick) then
natives.temperament = mRandom()
2016-10-15 02:00:18 +02:00
natives.temperamentTick = randomTickEvent(tick, AI_MIN_TEMPERAMENT_DURATION, AI_MAX_TEMPERAMENT_DURATION)
end
if (natives.stateTick == tick) then
local roll = mRandom() * mMax(1 - evolution_factor, 0.15)
2016-10-15 02:00:18 +02:00
if (roll > natives.temperament) then
natives.state = AI_STATE_PEACEFUL
2017-06-01 03:46:53 +02:00
elseif natives.aiNocturnalMode then
2017-05-14 00:32:16 +02:00
natives.state = AI_STATE_NOCTURNAL
2016-10-15 02:00:18 +02:00
else
roll = mRandom()
if (roll < 0.70) then
natives.state = AI_STATE_AGGRESSIVE
elseif (roll < 0.75) then
natives.state = AI_STATE_MIGRATING
elseif (roll < 0.80) then
natives.state = AI_STATE_SIEGE
elseif ((natives.raidAIToggle) and (evolution_factor >= 0.04)) then
natives.state = AI_STATE_RAIDING
2018-02-10 10:42:17 +02:00
natives.points = natives.points + 1000
if (natives.points > AI_MAX_OVERFLOW_POINTS) then
natives.points = AI_MAX_OVERFLOW_POINTS
end
2018-06-08 08:52:39 +02:00
else
natives.state = AI_STATE_AGGRESSIVE
end
2016-10-15 02:00:18 +02:00
end
natives.stateTick = randomTickEvent(tick, AI_MIN_STATE_DURATION, AI_MAX_STATE_DURATION)
end
2017-05-28 06:50:37 +02:00
if isShockwaveReady(evolution_factor, natives, surface, tick, maxPoints) then
natives.lastShakeMessage = tick
for _, player in pairs(connectedPlayers) do
2018-02-10 10:42:17 +02:00
if player.mod_settings["rampant-attack-warning"].value then
player.print("Rampant: The ground begins to shake")
end
end
end
2017-06-01 03:46:53 +02:00
2016-10-15 02:00:18 +02:00
end
return aiPlanning