Differential D4343 Diff 19161 ps/trunk/binaries/data/mods/public/simulation/ai/petra/victoryManager.js
Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/binaries/data/mods/public/simulation/ai/petra/victoryManager.js
Show First 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | for (let evt of events.Create) | ||||
// Let's get a few units from other bases to build the wonder. | // Let's get a few units from other bases to build the wonder. | ||||
let base = gameState.ai.HQ.getBaseByID(ent.getMetadata(PlayerID, "base")); | let base = gameState.ai.HQ.getBaseByID(ent.getMetadata(PlayerID, "base")); | ||||
let builders = gameState.ai.HQ.bulkPickWorkers(gameState, base, 10); | let builders = gameState.ai.HQ.bulkPickWorkers(gameState, base, 10); | ||||
if (builders) | if (builders) | ||||
for (let worker of builders.values()) | for (let worker of builders.values()) | ||||
{ | { | ||||
worker.setMetadata(PlayerID, "base", base.ID); | worker.setMetadata(PlayerID, "base", base.ID); | ||||
worker.setMetadata(PlayerID, "subrole", "builder"); | worker.setMetadata(PlayerID, "subrole", PETRA.Worker.SUBROLE_BUILDER); | ||||
worker.setMetadata(PlayerID, "target-foundation", ent.id()); | worker.setMetadata(PlayerID, "target-foundation", ent.id()); | ||||
} | } | ||||
} | } | ||||
for (let evt of events.ConstructionFinished) | for (let evt of events.ConstructionFinished) | ||||
{ | { | ||||
if (!evt || !evt.newentity) | if (!evt || !evt.newentity) | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | for (let evt of events.Attacked) | ||||
hero.garrisonEmergency = true; | hero.garrisonEmergency = true; | ||||
} | } | ||||
} | } | ||||
for (let evt of events.TrainingFinished) | for (let evt of events.TrainingFinished) | ||||
for (let entId of evt.entities) | for (let entId of evt.entities) | ||||
{ | { | ||||
let ent = gameState.getEntityById(entId); | let ent = gameState.getEntityById(entId); | ||||
if (ent && ent.isOwn(PlayerID) && ent.getMetadata(PlayerID, "role") == "criticalEntHealer") | if (ent && ent.isOwn(PlayerID) && ent.getMetadata(PlayerID, "role") === PETRA.Worker.ROLE_CRITICAL_ENT_HEALER) | ||||
this.assignGuardToCriticalEnt(gameState, ent); | this.assignGuardToCriticalEnt(gameState, ent); | ||||
} | } | ||||
for (let evt of events.Garrison) | for (let evt of events.Garrison) | ||||
{ | { | ||||
if (!this.criticalEnts.has(evt.entity)) | if (!this.criticalEnts.has(evt.entity)) | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | for (let evt of events.UnGarrison) | ||||
if (!this.guardEnts.has(evt.entity) && !this.criticalEnts.has(evt.entity)) | if (!this.guardEnts.has(evt.entity) && !this.criticalEnts.has(evt.entity)) | ||||
continue; | continue; | ||||
let ent = gameState.getEntityById(evt.entity); | let ent = gameState.getEntityById(evt.entity); | ||||
if (!ent) | if (!ent) | ||||
continue; | continue; | ||||
// If this ent travelled to a criticalEnt's accessValue, try again to assign as a guard | // If this ent travelled to a criticalEnt's accessValue, try again to assign as a guard | ||||
if ((ent.getMetadata(PlayerID, "role") == "criticalEntHealer" || | if ((ent.getMetadata(PlayerID, "role") === PETRA.Worker.ROLE_CRITICAL_ENT_HEALER || | ||||
ent.getMetadata(PlayerID, "role") == "criticalEntGuard") && !this.guardEnts.get(evt.entity)) | ent.getMetadata(PlayerID, "role") === PETRA.Worker.ROLE_CRITICAL_ENT_GUARD) && !this.guardEnts.get(evt.entity)) | ||||
{ | { | ||||
this.assignGuardToCriticalEnt(gameState, ent, ent.getMetadata(PlayerID, "guardedEnt")); | this.assignGuardToCriticalEnt(gameState, ent, ent.getMetadata(PlayerID, "guardedEnt")); | ||||
continue; | continue; | ||||
} | } | ||||
if (!this.criticalEnts.has(evt.entity)) | if (!this.criticalEnts.has(evt.entity)) | ||||
continue; | continue; | ||||
▲ Show 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | if (gameState.ai.HQ.saveResources || queues.healer.hasQueuedUnits() || | ||||
this.guardEnts.size > Math.min(gameState.getPopulationMax() / 10, gameState.getPopulation() / 4)) | this.guardEnts.size > Math.min(gameState.getPopulationMax() / 10, gameState.getPopulation() / 4)) | ||||
return; | return; | ||||
for (let data of this.criticalEnts.values()) | for (let data of this.criticalEnts.values()) | ||||
{ | { | ||||
if (data.healersAssigned === undefined || data.healersAssigned >= this.healersPerCriticalEnt) | if (data.healersAssigned === undefined || data.healersAssigned >= this.healersPerCriticalEnt) | ||||
continue; | continue; | ||||
let template = gameState.applyCiv("units/{civ}/support_healer_b"); | let template = gameState.applyCiv("units/{civ}/support_healer_b"); | ||||
queues.healer.addPlan(new PETRA.TrainingPlan(gameState, template, { "role": "criticalEntHealer", "base": 0 }, 1, 1)); | queues.healer.addPlan(new PETRA.TrainingPlan(gameState, template, { "role": PETRA.Worker.ROLE_CRITICAL_ENT_HEALER, "base": 0 }, 1, 1)); | ||||
return; | return; | ||||
} | } | ||||
}; | }; | ||||
/** | /** | ||||
* Try to keep some military units guarding any criticalEnts, if we can afford it. | * Try to keep some military units guarding any criticalEnts, if we can afford it. | ||||
* If we have too low a population and require units for other needs, remove guards so they can be reassigned. | * If we have too low a population and require units for other needs, remove guards so they can be reassigned. | ||||
* TODO: Swap citizen soldier guards with champions if they become available. | * TODO: Swap citizen soldier guards with champions if they become available. | ||||
*/ | */ | ||||
PETRA.VictoryManager.prototype.manageCriticalEntGuards = function(gameState) | PETRA.VictoryManager.prototype.manageCriticalEntGuards = function(gameState) | ||||
{ | { | ||||
let numWorkers = gameState.getOwnEntitiesByRole("worker", true).length; | let numWorkers = gameState.getOwnEntitiesByRole(PETRA.Worker.ROLE_WORKER, true).length; | ||||
if (numWorkers < 20) | if (numWorkers < 20) | ||||
{ | { | ||||
for (let data of this.criticalEnts.values()) | for (let data of this.criticalEnts.values()) | ||||
{ | { | ||||
for (let guardId of data.guards.keys()) | for (let guardId of data.guards.keys()) | ||||
{ | { | ||||
let guardEnt = gameState.getEntityById(guardId); | let guardEnt = gameState.getEntityById(guardId); | ||||
if (!guardEnt || !guardEnt.hasClass("CitizenSoldier") || | if (!guardEnt || !guardEnt.hasClass("CitizenSoldier") || | ||||
guardEnt.getMetadata(PlayerID, "role") != "criticalEntGuard") | guardEnt.getMetadata(PlayerID, "role") !== PETRA.Worker.ROLE_CRITICAL_ENT_GUARD) | ||||
continue; | continue; | ||||
guardEnt.removeGuard(); | guardEnt.removeGuard(); | ||||
guardEnt.setMetadata(PlayerID, "plan", -1); | guardEnt.setMetadata(PlayerID, "plan", -1); | ||||
guardEnt.setMetadata(PlayerID, "role", undefined); | guardEnt.setMetadata(PlayerID, "role", undefined); | ||||
this.guardEnts.delete(guardId); | this.guardEnts.delete(guardId); | ||||
--data.guardsAssigned; | --data.guardsAssigned; | ||||
▲ Show 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | if (guardEnt.getMetadata(PlayerID, "plan") !== undefined || | ||||
checkForSameAccess && (!guardEnt.position() || !criticalEnt.position() || | checkForSameAccess && (!guardEnt.position() || !criticalEnt.position() || | ||||
PETRA.getLandAccess(gameState, criticalEnt) != PETRA.getLandAccess(gameState, guardEnt))) | PETRA.getLandAccess(gameState, criticalEnt) != PETRA.getLandAccess(gameState, guardEnt))) | ||||
return false; | return false; | ||||
if (!this.assignGuardToCriticalEnt(gameState, guardEnt, criticalEnt.id())) | if (!this.assignGuardToCriticalEnt(gameState, guardEnt, criticalEnt.id())) | ||||
return false; | return false; | ||||
guardEnt.setMetadata(PlayerID, "plan", -2); | guardEnt.setMetadata(PlayerID, "plan", -2); | ||||
guardEnt.setMetadata(PlayerID, "role", "criticalEntGuard"); | guardEnt.setMetadata(PlayerID, "role", PETRA.Worker.ROLE_CRITICAL_ENT_GUARD); | ||||
return true; | return true; | ||||
}; | }; | ||||
PETRA.VictoryManager.prototype.pickCriticalEntRetreatLocation = function(gameState, criticalEnt, emergency) | PETRA.VictoryManager.prototype.pickCriticalEntRetreatLocation = function(gameState, criticalEnt, emergency) | ||||
{ | { | ||||
gameState.ai.HQ.defenseManager.garrisonAttackedUnit(gameState, criticalEnt, emergency); | gameState.ai.HQ.defenseManager.garrisonAttackedUnit(gameState, criticalEnt, emergency); | ||||
let plan = criticalEnt.getMetadata(PlayerID, "plan"); | let plan = criticalEnt.getMetadata(PlayerID, "plan"); | ||||
▲ Show 20 Lines • Show All 79 Lines • ▼ Show 20 Lines | if (guardEnt.getMetadata(PlayerID, "guardedEnt") != criticalEntId) | ||||
guardEnt.setMetadata(PlayerID, "guardedEnt", criticalEntId); | guardEnt.setMetadata(PlayerID, "guardedEnt", criticalEntId); | ||||
let guardEntAccess = PETRA.getLandAccess(gameState, guardEnt); | let guardEntAccess = PETRA.getLandAccess(gameState, guardEnt); | ||||
let criticalEntAccess = PETRA.getLandAccess(gameState, criticalEnt); | let criticalEntAccess = PETRA.getLandAccess(gameState, criticalEnt); | ||||
if (guardEntAccess == criticalEntAccess) | if (guardEntAccess == criticalEntAccess) | ||||
{ | { | ||||
let queued = PETRA.returnResources(gameState, guardEnt); | let queued = PETRA.returnResources(gameState, guardEnt); | ||||
guardEnt.guard(criticalEnt, queued); | guardEnt.guard(criticalEnt, queued); | ||||
let guardRole = guardEnt.getMetadata(PlayerID, "role") == "criticalEntHealer" ? "healer" : "guard"; | const guardRole = guardEnt.getMetadata(PlayerID, "role") === PETRA.Worker.ROLE_CRITICAL_ENT_HEALER ? "healer" : "guard"; | ||||
this.criticalEnts.get(criticalEntId).guards.set(guardEnt.id(), guardRole); | this.criticalEnts.get(criticalEntId).guards.set(guardEnt.id(), guardRole); | ||||
// Switch this guard ent to the criticalEnt's base | // Switch this guard ent to the criticalEnt's base | ||||
if (criticalEnt.hasClass("Structure") && criticalEnt.getMetadata(PlayerID, "base") !== undefined) | if (criticalEnt.hasClass("Structure") && criticalEnt.getMetadata(PlayerID, "base") !== undefined) | ||||
guardEnt.setMetadata(PlayerID, "base", criticalEnt.getMetadata(PlayerID, "base")); | guardEnt.setMetadata(PlayerID, "base", criticalEnt.getMetadata(PlayerID, "base")); | ||||
} | } | ||||
else | else | ||||
gameState.ai.HQ.navalManager.requireTransport(gameState, guardEnt, guardEntAccess, criticalEntAccess, criticalEnt.position()); | gameState.ai.HQ.navalManager.requireTransport(gameState, guardEnt, guardEntAccess, criticalEntAccess, criticalEnt.position()); | ||||
▲ Show 20 Lines • Show All 184 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator