Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/ai/petra/defenseManager.js
Show First 20 Lines • Show All 470 Lines • ▼ Show 20 Lines | for (let evt of events.Attacked) | ||||
if (!target || !target.position()) | if (!target || !target.position()) | ||||
continue; | continue; | ||||
let attacker = gameState.getEntityById(evt.attacker); | let attacker = gameState.getEntityById(evt.attacker); | ||||
if (attacker && gameState.isEntityOwn(attacker) && gameState.isEntityEnemy(target) && !attacker.hasClass("Ship")) | if (attacker && gameState.isEntityOwn(attacker) && gameState.isEntityEnemy(target) && !attacker.hasClass("Ship")) | ||||
{ | { | ||||
// If enemies are in range of one of our defensive structures, garrison it for arrow multiplier | // If enemies are in range of one of our defensive structures, garrison it for arrow multiplier | ||||
if (attacker.position() && attacker.isGarrisonHolder() && attacker.getArrowMultiplier()) | if (attacker.position() && attacker.isGarrisonHolder() && attacker.getArrowMultiplier()) | ||||
this.garrisonRangedUnitsInside(gameState, attacker, {"attacker": target}); | this.garrisonUnitsInside(gameState, attacker, {"attacker": target}); | ||||
} | } | ||||
if (!gameState.isEntityOwn(target)) | if (!gameState.isEntityOwn(target)) | ||||
continue; | continue; | ||||
// If attacked by one of our allies (he must trying to recover capture points), do not react | // If attacked by one of our allies (he must trying to recover capture points), do not react | ||||
if (attacker && gameState.isEntityAlly(attacker)) | if (attacker && gameState.isEntityAlly(attacker)) | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | if (target.hasClass("Siege") && !target.hasClass("Melee") && | ||||
this.garrisonSiegeUnit(gameState, target); | this.garrisonSiegeUnit(gameState, target); | ||||
continue; | continue; | ||||
} | } | ||||
if (!attacker || !attacker.position()) | if (!attacker || !attacker.position()) | ||||
continue; | continue; | ||||
if (target.isGarrisonHolder() && target.getArrowMultiplier()) | if (target.isGarrisonHolder() && target.getArrowMultiplier()) | ||||
this.garrisonRangedUnitsInside(gameState, target, {"attacker": attacker}); | this.garrisonUnitsInside(gameState, target, {"attacker": attacker}); | ||||
} | } | ||||
}; | }; | ||||
m.DefenseManager.prototype.garrisonRangedUnitsInside = function(gameState, target, data) | m.DefenseManager.prototype.garrisonUnitsInside = function(gameState, target, data) | ||||
{ | { | ||||
let minGarrison = data.min ? data.min : target.garrisonMax(); | let minGarrison = data.min ? data.min : target.garrisonMax(); | ||||
let typeGarrison = data.type ? data.type : "protection"; | let typeGarrison = data.type ? data.type : "protection"; | ||||
if (gameState.ai.HQ.garrisonManager.numberOfGarrisonedUnits(target) >= minGarrison) | if (gameState.ai.HQ.garrisonManager.numberOfGarrisonedUnits(target) >= minGarrison) | ||||
return; | return; | ||||
if (target.hitpoints() < target.garrisonEjectHealth() * target.maxHitpoints()) | if (target.hitpoints() < target.garrisonEjectHealth() * target.maxHitpoints()) | ||||
return; | return; | ||||
if (data.attacker) | if (data.attacker) | ||||
{ | { | ||||
let attackTypes = target.attackTypes(); | let attackTypes = target.attackTypes(); | ||||
if (!attackTypes || attackTypes.indexOf("Ranged") === -1) | if (!attackTypes || attackTypes.indexOf("Ranged") === -1) | ||||
return; | return; | ||||
let dist = API3.SquareVectorDistance(data.attacker.position(), target.position()); | let dist = API3.SquareVectorDistance(data.attacker.position(), target.position()); | ||||
let range = target.attackRange("Ranged").max; | let range = target.attackRange("Ranged").max; | ||||
if (dist >= range*range) | if (dist >= range*range) | ||||
return; | return; | ||||
} | } | ||||
let index = gameState.ai.accessibility.getAccessValue(target.position()); | let index = gameState.ai.accessibility.getAccessValue(target.position()); | ||||
let garrisonManager = gameState.ai.HQ.garrisonManager; | let garrisonManager = gameState.ai.HQ.garrisonManager; | ||||
let garrisonArrowClasses = target.getGarrisonArrowClasses(); | let garrisonArrowClasses = target.getGarrisonArrowClasses(); | ||||
let units = gameState.getOwnUnits().filter(ent => MatchesClassList(ent.classes(), garrisonArrowClasses)).filterNearest(target.position()); | let units = gameState.getOwnUnits().filter(ent => MatchesClassList(ent.classes(), garrisonArrowClasses)).filterNearest(target.position()); | ||||
let allowMelee = gameState.ai.HQ.garrisonManager.allowMelee(target); | |||||
if (allowMelee === undefined) | |||||
{ | |||||
// Should be kept in sync with garrisonManager to avoid garrisoning-ungarrisoning some units | |||||
if (data.attacker) | |||||
allowMelee = data.attacker.hasClass("Structure") ? data.attacker.attackRange("Ranged") : !m.isSiegeUnit(data.attacker); | |||||
else | |||||
allowMelee = true; | |||||
} | |||||
for (let ent of units.values()) | for (let ent of units.values()) | ||||
{ | { | ||||
if (garrisonManager.numberOfGarrisonedUnits(target) >= minGarrison) | if (garrisonManager.numberOfGarrisonedUnits(target) >= minGarrison) | ||||
break; | break; | ||||
if (!ent.position()) | if (!ent.position()) | ||||
continue; | continue; | ||||
if (typeGarrison !== "decay" && !allowMelee && ent.attackTypes().indexOf("Melee") !== -1) | |||||
continue; | |||||
if (ent.getMetadata(PlayerID, "transport") !== undefined) | if (ent.getMetadata(PlayerID, "transport") !== undefined) | ||||
continue; | continue; | ||||
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)) | ||||
continue; | continue; | ||||
if (ent.getMetadata(PlayerID, "plan") !== undefined && ent.getMetadata(PlayerID, "plan") >= 0) | if (ent.getMetadata(PlayerID, "plan") !== undefined && ent.getMetadata(PlayerID, "plan") >= 0) | ||||
{ | { | ||||
let subrole = ent.getMetadata(PlayerID, "subrole"); | let subrole = ent.getMetadata(PlayerID, "subrole"); | ||||
▲ Show 20 Lines • Show All 133 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator