Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/ai/petra/defenseManager.js
Show First 20 Lines • Show All 245 Lines • ▼ Show 20 Lines | if (ent.hasClass("Animal")) | ||||
if (!orders || !orders.length || !orders[0].target) | if (!orders || !orders.length || !orders[0].target) | ||||
continue; | continue; | ||||
let target = gameState.getEntityById(orders[0].target); | let target = gameState.getEntityById(orders[0].target); | ||||
if (!target || !gameState.isPlayerAlly(target.owner())) | if (!target || !gameState.isPlayerAlly(target.owner())) | ||||
continue; | continue; | ||||
} | } | ||||
// TODO what to do for ships ? | // TODO what to do for ships ? | ||||
if (ent.hasClass("Ship") || ent.hasClass("Trader")) | if (ent.hasClasses(["Ship", "Trader"])) | ||||
continue; | continue; | ||||
// Check if unit is dangerous "a priori". | // Check if unit is dangerous "a priori". | ||||
if (this.isDangerous(gameState, ent)) | if (this.isDangerous(gameState, ent)) | ||||
this.makeIntoArmy(gameState, ent.id()); | this.makeIntoArmy(gameState, ent.id()); | ||||
} | } | ||||
if (i != 0 || this.armies.length > 1 || gameState.ai.HQ.numActiveBases() == 0) | if (i != 0 || this.armies.length > 1 || gameState.ai.HQ.numActiveBases() == 0) | ||||
▲ Show 20 Lines • Show All 160 Lines • ▼ Show 20 Lines | PETRA.DefenseManager.prototype.assignDefenders = function(gameState) | ||||
let potentialDefenders = []; | let potentialDefenders = []; | ||||
gameState.getOwnUnits().forEach(function(ent) { | gameState.getOwnUnits().forEach(function(ent) { | ||||
if (!ent.position()) | if (!ent.position()) | ||||
return; | return; | ||||
if (ent.getMetadata(PlayerID, "plan") == -2 || ent.getMetadata(PlayerID, "plan") == -3) | if (ent.getMetadata(PlayerID, "plan") == -2 || ent.getMetadata(PlayerID, "plan") == -3) | ||||
return; | return; | ||||
if (ent.hasClass("Support") || ent.attackTypes() === undefined) | if (ent.hasClass("Support") || ent.attackTypes() === undefined) | ||||
return; | return; | ||||
if (ent.hasClass("StoneThrower")) | if (ent.hasClasses(["StoneThrower", "Support", "FishingBoat"])) | ||||
return; | |||||
if (ent.hasClass("FishingBoat") || ent.hasClass("Trader")) | |||||
return; | return; | ||||
if (ent.getMetadata(PlayerID, "transport") !== undefined || | if (ent.getMetadata(PlayerID, "transport") !== undefined || | ||||
ent.getMetadata(PlayerID, "transporter") !== undefined) | ent.getMetadata(PlayerID, "transporter") !== undefined) | ||||
return; | return; | ||||
if (gameState.ai.HQ.victoryManager.criticalEnts.has(ent.id())) | if (gameState.ai.HQ.victoryManager.criticalEnts.has(ent.id())) | ||||
return; | return; | ||||
if (ent.getMetadata(PlayerID, "plan") !== undefined && ent.getMetadata(PlayerID, "plan") != -1) | if (ent.getMetadata(PlayerID, "plan") !== undefined && ent.getMetadata(PlayerID, "plan") != -1) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 177 Lines • ▼ Show 20 Lines | if (plan !== undefined && plan >= 0) | ||||
let attack = gameState.ai.HQ.attackManager.getPlan(plan); | let attack = gameState.ai.HQ.attackManager.getPlan(plan); | ||||
if (attack && attack.state != "unexecuted") | if (attack && attack.state != "unexecuted") | ||||
continue; | continue; | ||||
} | } | ||||
// Signal this attacker to our defense manager, except if we are in enemy territory. | // Signal this attacker to our defense manager, except if we are in enemy territory. | ||||
// TODO treat ship attack. | // TODO treat ship attack. | ||||
if (attacker && attacker.position() && attacker.getMetadata(PlayerID, "PartOfArmy") === undefined && | if (attacker && attacker.position() && attacker.getMetadata(PlayerID, "PartOfArmy") === undefined && | ||||
!attacker.hasClass("Structure") && !attacker.hasClass("Ship")) | !attacker.hasClasses(["Structure", "Ship"])) | ||||
{ | { | ||||
let territoryOwner = this.territoryMap.getOwner(attacker.position()); | let territoryOwner = this.territoryMap.getOwner(attacker.position()); | ||||
if (territoryOwner == 0 || gameState.isPlayerAlly(territoryOwner)) | if (territoryOwner == 0 || gameState.isPlayerAlly(territoryOwner)) | ||||
this.makeIntoArmy(gameState, attacker.id()); | this.makeIntoArmy(gameState, attacker.id()); | ||||
} | } | ||||
if (target.getMetadata(PlayerID, "PartOfArmy") !== undefined) | if (target.getMetadata(PlayerID, "PartOfArmy") !== undefined) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | if (target.hasClass("Unit") && attacker.hasClass("Unit")) | ||||
let orderData = target.unitAIOrderData(); | let orderData = target.unitAIOrderData(); | ||||
let currentTarget = orderData && orderData.length && orderData[0].target ? | let currentTarget = orderData && orderData.length && orderData[0].target ? | ||||
gameState.getEntityById(orderData[0].target) : undefined; | gameState.getEntityById(orderData[0].target) : undefined; | ||||
if (currentTarget) | if (currentTarget) | ||||
{ | { | ||||
let unitAIState = target.unitAIState(); | let unitAIState = target.unitAIState(); | ||||
let unitAIStateOrder = unitAIState ? unitAIState.split(".")[1] : ""; | let unitAIStateOrder = unitAIState ? unitAIState.split(".")[1] : ""; | ||||
if (unitAIStateOrder == "COMBAT" && (currentTarget == attacker.id() || | if (unitAIStateOrder == "COMBAT" && (currentTarget == attacker.id() || | ||||
!currentTarget.hasClass("Structure") && !currentTarget.hasClass("Support"))) | !currentTarget.hasClasses(["Structure", "Support"]))) | ||||
continue; | continue; | ||||
if (unitAIStateOrder == "REPAIR" && currentTarget.hasDefensiveFire()) | if (unitAIStateOrder == "REPAIR" && currentTarget.hasDefensiveFire()) | ||||
continue; | continue; | ||||
if (unitAIStateOrder == "COMBAT" && !PETRA.isSiegeUnit(currentTarget) && | if (unitAIStateOrder == "COMBAT" && !PETRA.isSiegeUnit(currentTarget) && | ||||
gameState.ai.HQ.capturableTargets.has(orderData[0].target)) | gameState.ai.HQ.capturableTargets.has(orderData[0].target)) | ||||
{ | { | ||||
// Take the nearest unit also attacking this structure to help us. | // Take the nearest unit also attacking this structure to help us. | ||||
let capturableTarget = gameState.ai.HQ.capturableTargets.get(orderData[0].target); | let capturableTarget = gameState.ai.HQ.capturableTargets.get(orderData[0].target); | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | if (allowMelee === undefined) | ||||
if (data.attacker) | if (data.attacker) | ||||
allowMelee = data.attacker.hasClass("Structure") ? data.attacker.attackRange("Ranged") : !PETRA.isSiegeUnit(data.attacker); | allowMelee = data.attacker.hasClass("Structure") ? data.attacker.attackRange("Ranged") : !PETRA.isSiegeUnit(data.attacker); | ||||
else | else | ||||
allowMelee = true; | allowMelee = true; | ||||
} | } | ||||
let units = gameState.getOwnUnits().filter(ent => { | let units = gameState.getOwnUnits().filter(ent => { | ||||
if (!ent.position()) | if (!ent.position()) | ||||
return false; | return false; | ||||
if (!MatchesClassList(ent.classes(), garrisonArrowClasses)) | if (!ent.hasClasses(garrisonArrowClasses)) | ||||
return false; | return false; | ||||
if (typeGarrison != "decay" && !allowMelee && ent.attackTypes().indexOf("Melee") != -1) | if (typeGarrison != "decay" && !allowMelee && ent.attackTypes().indexOf("Melee") != -1) | ||||
return false; | return false; | ||||
if (ent.getMetadata(PlayerID, "transport") !== undefined) | if (ent.getMetadata(PlayerID, "transport") !== undefined) | ||||
return false; | return false; | ||||
let army = ent.getMetadata(PlayerID, "PartOfArmy") ? this.getArmy(ent.getMetadata(PlayerID, "PartOfArmy")) : undefined; | let army = ent.getMetadata(PlayerID, "PartOfArmy") ? this.getArmy(ent.getMetadata(PlayerID, "PartOfArmy")) : undefined; | ||||
if (!army && (ent.getMetadata(PlayerID, "plan") == -2 || ent.getMetadata(PlayerID, "plan") == -3)) | if (!army && (ent.getMetadata(PlayerID, "plan") == -2 || ent.getMetadata(PlayerID, "plan") == -3)) | ||||
return false; | return false; | ||||
Show All 35 Lines | PETRA.DefenseManager.prototype.garrisonSiegeUnit = function(gameState, unit) | ||||
let distmin = Math.min(); | let distmin = Math.min(); | ||||
let nearest; | let nearest; | ||||
let unitAccess = PETRA.getLandAccess(gameState, unit); | let unitAccess = PETRA.getLandAccess(gameState, unit); | ||||
let garrisonManager = gameState.ai.HQ.garrisonManager; | let garrisonManager = gameState.ai.HQ.garrisonManager; | ||||
for (let ent of gameState.getAllyStructures().values()) | for (let ent of gameState.getAllyStructures().values()) | ||||
{ | { | ||||
if (!ent.isGarrisonHolder()) | if (!ent.isGarrisonHolder()) | ||||
continue; | continue; | ||||
if (!MatchesClassList(unit.classes(), ent.garrisonableClasses())) | if (!unit.hasClasses(ent.garrisonableClasses())) | ||||
continue; | continue; | ||||
if (garrisonManager.numberOfGarrisonedSlots(ent) >= ent.garrisonMax()) | if (garrisonManager.numberOfGarrisonedSlots(ent) >= ent.garrisonMax()) | ||||
continue; | continue; | ||||
if (ent.hitpoints() < ent.garrisonEjectHealth() * ent.maxHitpoints()) | if (ent.hitpoints() < ent.garrisonEjectHealth() * ent.maxHitpoints()) | ||||
continue; | continue; | ||||
if (PETRA.getLandAccess(gameState, ent) != unitAccess) | if (PETRA.getLandAccess(gameState, ent) != unitAccess) | ||||
continue; | continue; | ||||
let dist = API3.SquareVectorDistance(ent.position(), unit.position()); | let dist = API3.SquareVectorDistance(ent.position(), unit.position()); | ||||
Show All 19 Lines | PETRA.DefenseManager.prototype.garrisonAttackedUnit = function(gameState, unit, emergency = false) | ||||
let unitAccess = PETRA.getLandAccess(gameState, unit); | let unitAccess = PETRA.getLandAccess(gameState, unit); | ||||
let garrisonManager = gameState.ai.HQ.garrisonManager; | let garrisonManager = gameState.ai.HQ.garrisonManager; | ||||
for (let ent of gameState.getAllyStructures().values()) | for (let ent of gameState.getAllyStructures().values()) | ||||
{ | { | ||||
if (!ent.isGarrisonHolder()) | if (!ent.isGarrisonHolder()) | ||||
continue; | continue; | ||||
if (!emergency && !ent.buffHeal()) | if (!emergency && !ent.buffHeal()) | ||||
continue; | continue; | ||||
if (!MatchesClassList(unit.classes(), ent.garrisonableClasses())) | if (!unit.hasClasses(ent.garrisonableClasses())) | ||||
continue; | continue; | ||||
if (garrisonManager.numberOfGarrisonedSlots(ent) >= ent.garrisonMax() && | if (garrisonManager.numberOfGarrisonedSlots(ent) >= ent.garrisonMax() && | ||||
(!emergency || !ent.garrisoned().length)) | (!emergency || !ent.garrisoned().length)) | ||||
continue; | continue; | ||||
if (ent.hitpoints() < ent.garrisonEjectHealth() * ent.maxHitpoints()) | if (ent.hitpoints() < ent.garrisonEjectHealth() * ent.maxHitpoints()) | ||||
continue; | continue; | ||||
if (PETRA.getLandAccess(gameState, ent) != unitAccess) | if (PETRA.getLandAccess(gameState, ent) != unitAccess) | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 89 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator