2019-02-16 06:17:30 +02:00
|
|
|
if aiPlanningG then
|
|
|
|
return aiPlanningG
|
|
|
|
end
|
2016-10-15 02:00:18 +02:00
|
|
|
local aiPlanning = {}
|
|
|
|
|
|
|
|
-- imports
|
|
|
|
|
|
|
|
local constants = require("Constants")
|
|
|
|
local mathUtils = require("MathUtils")
|
2019-03-10 00:47:35 +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
|
2018-02-10 09:57:04 +02:00
|
|
|
local AI_STATE_RAIDING = constants.AI_STATE_RAIDING
|
2018-02-14 10:28:42 +02:00
|
|
|
local AI_STATE_MIGRATING = constants.AI_STATE_MIGRATING
|
2019-02-09 07:48:00 +02:00
|
|
|
local AI_STATE_ONSLAUGHT = constants.AI_STATE_ONSLAUGHT
|
2018-02-19 06:18:04 +02:00
|
|
|
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
|
|
|
|
|
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
|
|
|
|
2016-10-15 02:00:18 +02:00
|
|
|
-- imported functions
|
|
|
|
|
|
|
|
local randomTickEvent = mathUtils.randomTickEvent
|
|
|
|
|
2018-02-14 10:28:42 +02:00
|
|
|
local linearInterpolation = mathUtils.linearInterpolation
|
|
|
|
|
2017-06-16 03:30:26 +02:00
|
|
|
local mFloor = math.floor
|
|
|
|
|
2017-07-01 06:36:23 +02:00
|
|
|
local mRandom = math.random
|
|
|
|
|
2016-10-15 02:00:18 +02:00
|
|
|
local mMax = math.max
|
|
|
|
|
|
|
|
-- module code
|
|
|
|
|
2019-03-10 00:47:35 +02:00
|
|
|
function aiPlanning.planning(natives, evolution_factor, tick)
|
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)
|
2018-02-14 10:28:42 +02:00
|
|
|
|
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)
|
2019-02-03 08:01:28 +02:00
|
|
|
|
2018-02-14 10:28:42 +02:00
|
|
|
natives.settlerWaveSize = linearInterpolation(evolution_factor ^ 1.66667, natives.expansionMinSize, natives.expansionMaxSize)
|
2019-02-06 08:25:43 +02:00
|
|
|
natives.settlerWaveDeviation = (natives.settlerWaveSize * 0.50)
|
|
|
|
|
2018-02-17 05:31:29 +02:00
|
|
|
natives.settlerCooldown = mFloor(linearInterpolation(evolution_factor ^ 1.66667, natives.expansionMinTime, natives.expansionMaxTime))
|
2019-02-03 08:01:28 +02:00
|
|
|
|
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)
|
2018-01-21 09:42:47 +02:00
|
|
|
|
|
|
|
local points = mFloor((AI_POINT_GENERATOR_AMOUNT * mRandom()) + ((AI_POINT_GENERATOR_AMOUNT * 0.7) * (evolution_factor ^ 2.5)) * natives.aiPointsScaler)
|
2019-02-03 08:01:28 +02:00
|
|
|
|
2019-02-09 07:48:00 +02:00
|
|
|
if (natives.state == AI_STATE_ONSLAUGHT) then
|
|
|
|
points = points * 2
|
|
|
|
end
|
|
|
|
|
2018-01-21 09:42:47 +02:00
|
|
|
natives.baseIncrement = points
|
2019-02-03 08:01:28 +02:00
|
|
|
|
2016-10-15 02:00:18 +02:00
|
|
|
if (natives.points < maxPoints) then
|
2018-01-21 09:42:47 +02:00
|
|
|
natives.points = natives.points + points
|
2016-10-15 02:00:18 +02:00
|
|
|
end
|
2019-02-03 08:01:28 +02:00
|
|
|
|
2016-10-15 02:00:18 +02:00
|
|
|
if (natives.temperamentTick == tick) then
|
2017-07-01 06:36:23 +02:00
|
|
|
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
|
2019-04-06 05:01:46 +02:00
|
|
|
local roll = mRandom() * mMax(1 - evolution_factor, 0.15) * natives.aiAggressiveness
|
2016-10-15 02:00:18 +02:00
|
|
|
if (roll > natives.temperament) then
|
|
|
|
natives.state = AI_STATE_PEACEFUL
|
|
|
|
else
|
2018-02-10 09:57:04 +02:00
|
|
|
roll = mRandom()
|
2019-03-10 00:52:27 +02:00
|
|
|
if (roll < 0.65) then
|
2018-02-19 06:18:04 +02:00
|
|
|
natives.state = AI_STATE_AGGRESSIVE
|
2019-02-11 08:14:17 +02:00
|
|
|
elseif ((natives.enabledMigration) and (natives.expansion) and (roll < 0.75)) then
|
2018-02-14 10:28:42 +02:00
|
|
|
natives.state = AI_STATE_MIGRATING
|
2019-02-11 08:14:17 +02:00
|
|
|
elseif ((natives.siegeAIToggle) and (natives.expansion) and (roll < 0.80)) then
|
2018-02-19 06:18:04 +02:00
|
|
|
natives.state = AI_STATE_SIEGE
|
2019-02-09 07:48:00 +02:00
|
|
|
elseif ((natives.onslaughtAIToggle) and (roll < 0.85)) then
|
|
|
|
natives.state = AI_STATE_ONSLAUGHT
|
2018-08-01 07:04:28 +02:00
|
|
|
elseif ((natives.raidAIToggle) and (evolution_factor >= 0.04)) then
|
2018-02-10 09:57:04 +02:00
|
|
|
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
|
2018-02-10 09:57:04 +02:00
|
|
|
end
|
2016-10-15 02:00:18 +02:00
|
|
|
end
|
|
|
|
natives.stateTick = randomTickEvent(tick, AI_MIN_STATE_DURATION, AI_MAX_STATE_DURATION)
|
2017-04-22 01:33:17 +02:00
|
|
|
end
|
|
|
|
|
2016-10-15 02:00:18 +02:00
|
|
|
end
|
|
|
|
|
2019-02-16 06:17:30 +02:00
|
|
|
aiPlanningG = aiPlanning
|
2016-10-15 02:00:18 +02:00
|
|
|
return aiPlanning
|