Skip to content

Commit

Permalink
ai adjustment for the more frequent running and base fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
veden committed Feb 20, 2021
1 parent 5ebc3b2 commit 7172745
Show file tree
Hide file tree
Showing 11 changed files with 76 additions and 110 deletions.
1 change: 1 addition & 0 deletions Upgrade.lua
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@ function upgrade.attempt(universe)
universe.aiPointsScaler = settings.global["rampant--aiPointsScaler"].value
universe.aiNocturnalMode = settings.global["rampant--permanentNocturnal"].value

universe.mapIterator = nil
universe.retreatThreshold = 0
universe.rallyThreshold = 0
universe.formSquadThreshold = 0
Expand Down
4 changes: 3 additions & 1 deletion changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,16 @@ Date: 06. 02. 2021
- Increased builder squad cost to 400
- Decreased siege ai state chance to 15% at peak temperament
- Halved AI temperament rate of change
- Increased ai state duration minimum to 10 and maximum to 25 minutes
Bugfixes:
- Fixed suicide and nuclear enemies explosion centered on target instead self
- Fixed process spawners reading missing globals
- Fixed potential desync in squad attack movement
- Fixed potential desync in unit group creation event
- Fixed potential desync in building native tables
- Fixed find entity upgrade incorrectly calculating evolution
- Fixed bug with the mod new game+
- Fixed bug with the mod new game+
- Fixed existing spawner upgrading in place over time

---------------------------------------------------------------------------------------------------
Version: 1.0.2
Expand Down
24 changes: 11 additions & 13 deletions control.lua
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,6 @@ local function prepMap(surface)
end

map.processedChunks = 0
map.mapIterator = nil
map.processQueue = {}
map.processIndex = 1
map.cleanupIndex = 1
Expand Down Expand Up @@ -365,7 +364,7 @@ local function prepMap(surface)
end
end

processPendingChunks(map, tick, universe)
processPendingChunks(map, tick, true)
end

local function onConfigChanged()
Expand Down Expand Up @@ -777,7 +776,7 @@ local function onUsedCapsule(event)
map.position2Top.y = event.position.y-0.75
map.position2Bottom.x = event.position.x+0.75
map.position2Bottom.y = event.position.y+0.75
local cliffs = surface.find_entities_filtered(map.cliffQuery)
local cliffs = surface.find_entities_filtered(universe.cliffQuery)
for i=1,#cliffs do
entityForPassScan(map, cliffs[i])
end
Expand Down Expand Up @@ -959,7 +958,6 @@ local function onForceMerged(event)
end

local function onSurfaceCreated(event)
print("new surface", event.surface_index)
prepMap(game.surfaces[event.surface_index])
end

Expand Down Expand Up @@ -1009,37 +1007,37 @@ script.on_event(defines.events.on_tick,
end

if (pick == 0) then
processPendingChunks(map, tick, universe)
processPendingChunks(map, tick)
processScanChunks(map)
elseif (pick == 1) then
processPlayers(gameRef.connected_players, map, tick)
cleanUpMapTables(map, tick)
elseif (pick == 2) then
processMap(map, tick)
universe.processedChunks = universe.processedChunks + PROCESS_QUEUE_SIZE
planning(map, gameRef.forces.enemy.evolution_factor, tick)
if universe.NEW_ENEMIES then
recycleBases(map, tick)
end
cleanUpMapTables(map, tick)
elseif (pick == 1) then
processPlayers(gameRef.connected_players, map, tick)
elseif (pick == 2) then
processMap(map, tick)
elseif (pick == 3) then
processStaticMap(map)
disperseVictoryScent(map)
cleanSquads(map)
processVengence(map)
elseif (pick == 4) then
scanResourceMap(map, tick)
processVengence(map)
elseif (pick == 5) then
scanEnemyMap(map, tick)
processSpawners(map, tick)
temperamentPlanner(map)
elseif (pick == 6) then
scanPlayerMap(map, tick)
processNests(map, tick)
temperamentPlanner(map)
end

processActiveNests(map, tick)

-- game.print({"", "--dispatch4 ", profiler, ", ", game.tick, " ", mRandom()})
-- game.print({"", "--dispatch4 ", profiler, ", ", pick, ", ", game.tick, " ", mRandom()})
end)

script.on_event(defines.events.on_surface_deleted, onSurfaceDeleted)
Expand Down
1 change: 0 additions & 1 deletion libs/AIAttackWave.lua
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ function aiAttackWave.formSettlers(map, chunk)
10,
universe.expansionMaxDistance)


local scaledWaveSize = settlerWaveScaling(universe)
universe.formGroupCommand.group = squad.group
universe.formCommand.unit_count = scaledWaveSize
Expand Down
105 changes: 35 additions & 70 deletions libs/AIPlanning.lua
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ function aiPlanning.planning(map, evolution_factor, tick)

local attackWaveMaxSize = universe.attackWaveMaxSize
universe.retreatThreshold = linearInterpolation(evolution_factor,
RETREAT_MOVEMENT_PHEROMONE_LEVEL_MIN,
RETREAT_MOVEMENT_PHEROMONE_LEVEL_MAX)
RETREAT_MOVEMENT_PHEROMONE_LEVEL_MIN,
RETREAT_MOVEMENT_PHEROMONE_LEVEL_MAX)
universe.rallyThreshold = BASE_RALLY_CHANCE + (evolution_factor * BONUS_RALLY_CHANCE)
universe.formSquadThreshold = mMax((0.20 * evolution_factor), 0.05)

Expand All @@ -87,19 +87,19 @@ function aiPlanning.planning(map, evolution_factor, tick)
end

universe.settlerWaveSize = linearInterpolation(evolution_factor ^ 1.66667,
universe.expansionMinSize,
universe.expansionMaxSize)
universe.expansionMinSize,
universe.expansionMaxSize)
universe.settlerWaveDeviation = (universe.settlerWaveSize * 0.33)

universe.settlerCooldown = mFloor(linearInterpolation(evolution_factor ^ 1.66667,
universe.expansionMaxTime,
universe.expansionMinTime))
universe.expansionMaxTime,
universe.expansionMinTime))

universe.unitRefundAmount = AI_UNIT_REFUND * evolution_factor
universe.kamikazeThreshold = NO_RETREAT_BASE_PERCENT + (evolution_factor * NO_RETREAT_EVOLUTION_BONUS_MAX)

local points = mFloor((AI_POINT_GENERATOR_AMOUNT * mRandom()) + (map.activeNests * 0.25) +
(((AI_POINT_GENERATOR_AMOUNT * 0.7) * (evolution_factor ^ 2.5)) * universe.aiPointsScaler))
local points = mFloor((AI_POINT_GENERATOR_AMOUNT * mRandom()) + (map.activeNests * 0.028702) +
(((AI_POINT_GENERATOR_AMOUNT * 0.080367) * (evolution_factor ^ 2.5)) * universe.aiPointsScaler))

if (map.state == AI_STATE_ONSLAUGHT) then
points = points * 2
Expand Down Expand Up @@ -128,17 +128,11 @@ function aiPlanning.planning(map, evolution_factor, tick)
if universe.raidAIToggle then
if (roll < 0.85) then
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
else
map.state = AI_STATE_RAIDING
end
else
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
end
end
elseif (map.temperament < 0.20) then -- 0.05 - 0.2
Expand All @@ -152,26 +146,17 @@ function aiPlanning.planning(map, evolution_factor, tick)
if universe.raidAIToggle then
if (roll < 0.95) then
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
else
map.state = AI_STATE_RAIDING
end
else
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
end
end
elseif (map.temperament < 0.4) then -- 0.2 - 0.4
if (universe.enabledMigration) then
if (roll < 0.2) then
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
elseif (roll < 0.8) then
map.state = AI_STATE_MIGRATING
else
Expand All @@ -180,28 +165,19 @@ function aiPlanning.planning(map, evolution_factor, tick)
else
if (roll < 0.6) then
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
else
map.state = AI_STATE_PEACEFUL
end
end
elseif (map.temperament < 0.6) then -- 0.4 - 0.6
if (roll < 0.5) then
if (roll < 0.4) then
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
else
map.state = AI_STATE_PEACEFUL
end
elseif (map.temperament < 0.8) then -- 0.6 - 0.8
if (roll < 0.6) then
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
elseif (roll < 0.8) then
map.state = AI_STATE_ONSLAUGHT
else
Expand All @@ -217,9 +193,6 @@ function aiPlanning.planning(map, evolution_factor, tick)
map.state = AI_STATE_RAIDING
else
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
end
elseif (universe.enabledMigration) then
if (roll < 0.15) then
Expand All @@ -228,9 +201,6 @@ function aiPlanning.planning(map, evolution_factor, tick)
map.state = AI_STATE_ONSLAUGHT
else
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
end
elseif (universe.raidAIToggle) then
if (roll < 0.4) then
Expand All @@ -239,18 +209,12 @@ function aiPlanning.planning(map, evolution_factor, tick)
map.state = AI_STATE_RAIDING
else
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
end
else
if (roll < 0.6) then
map.state = AI_STATE_ONSLAUGHT
else
map.state = AI_STATE_AGGRESSIVE
map.canAttackTick = randomTickEvent(tick,
AGGRESSIVE_CAN_ATTACK_WAIT_MIN_DURATION,
AGGRESSIVE_CAN_ATTACK_WAIT_MAX_DURATION)
end
end
end
Expand Down Expand Up @@ -286,39 +250,39 @@ function aiPlanning.temperamentPlanner(map)
local delta = 0

if activeNests > 0 then
local val = (0.375 * activeNests)
local val = (0.021695 * activeNests)
delta = delta + val
else
delta = delta - 0.25
delta = delta - 0.014463
end

if destroyPlayerBuildings > 0 then
if currentTemperament > 0 then
delta = delta - (0.25 * destroyPlayerBuildings)
delta = delta - (0.014463 * destroyPlayerBuildings)
else
delta = delta + (0.25 * destroyPlayerBuildings)
delta = delta + (0.014463 * destroyPlayerBuildings)
end
end

if activeRaidNests > 0 then
local val = (0.003825 * activeRaidNests)
local val = (0.000221 * activeRaidNests)
delta = delta - val
else
delta = delta - 0.125
delta = delta - 0.007232
end

if lostEnemyUnits > 0 then
local multipler
if map.evolutionLevel < 0.3 then
multipler = 0.0005
multipler = 0.000434
elseif map.evolutionLevel < 0.5 then
multipler = 0.000385
multipler = 0.000217
elseif map.evolutionLevel < 0.7 then
multipler = 0.00025
multipler = 0.000108
elseif map.evolutionLevel < 0.9 then
multipler = 0.00012
multipler = 0.000054
elseif map.evolutionLevel < 0.9 then
multipler = 0.00006
multipler = 0.000027
end
local val = (multipler * lostEnemyUnits)
if (currentTemperament > 0) then
Expand All @@ -329,7 +293,7 @@ function aiPlanning.temperamentPlanner(map)
end

if lostEnemyBuilding > 0 then
local val = (1.25 * lostEnemyBuilding)
local val = (0.072317 * lostEnemyBuilding)
if (currentTemperament > 0) then
delta = delta - val
else
Expand All @@ -338,35 +302,33 @@ function aiPlanning.temperamentPlanner(map)
end

if (builtEnemyBuilding > 0) then
local val = (0.075 * builtEnemyBuilding)
local val = (0.004339 * builtEnemyBuilding)
if (currentTemperament > 0) then
delta = delta - val
else
delta = delta + val
end
else
delta = delta - 0.125
delta = delta - 0.007232
end

if (rocketLaunched > 0) then
local val = (5 * rocketLaunched)
local val = (0.289268 * rocketLaunched)
delta = delta + val
end

if (ionCannonBlasts > 0) then
local val = (2.5 * ionCannonBlasts)
local val = (0.144634 * ionCannonBlasts)
delta = delta + val
end

if (artilleryBlasts > 0) then
local val = (2.5 * artilleryBlasts)
local val = (0.144634 * artilleryBlasts)
delta = delta + val
end

-- print("temperament", map.activeNests, map.activeRaidNests, map.destroyPlayerBuildings,
-- map.lostEnemyUnits,
-- map.lostEnemyBuilding, map.rocketLaunched, map.builtEnemyBuilding, map.ionCannonBlasts,
-- map.artilleryBlasts)
map.temperamentScore = mMin(10000, mMax(-10000, currentTemperament + delta))
map.temperament = ((map.temperamentScore + 10000) * 0.00005)

-- map.destroyPlayerBuildings = 0
-- map.lostEnemyUnits = 0
Expand All @@ -376,11 +338,14 @@ function aiPlanning.temperamentPlanner(map)
-- map.ionCannonBlasts = 0
-- map.artilleryBlasts = 0

map.temperamentScore = mMin(10000, mMax(-10000, currentTemperament + delta))
map.temperament = ((map.temperamentScore + 10000) * 0.00005)
-- if game.tick % 240 == 0 then
-- print("temperament", map.activeNests, map.activeRaidNests, map.destroyPlayerBuildings,
-- map.lostEnemyUnits, map.lostEnemyBuilding, map.rocketLaunched, map.builtEnemyBuilding,
-- map.ionCannonBlasts, map.artilleryBlasts)

-- print("tempResult", map.temperament, map.temperamentScore)
-- print("--")
-- print("tempResult", map.temperament, map.temperamentScore, map.points, map.state, map.surface.index)
-- print("--")
-- end
end

aiPlanningG = aiPlanning
Expand Down
Loading

0 comments on commit 7172745

Please sign in to comment.