Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/components/UnitAI.js
Show First 20 Lines • Show All 3,779 Lines • ▼ Show 20 Lines | UnitAI.prototype.SetupLOSRangeQuery = function(enable = true) | ||||
if (!cmpPlayer) | if (!cmpPlayer) | ||||
return; | return; | ||||
let players = cmpPlayer.GetEnemies(); | let players = cmpPlayer.GetEnemies(); | ||||
if (!players.length) | if (!players.length) | ||||
return; | return; | ||||
let range = this.GetQueryRange(IID_Vision); | let range = this.GetQueryRange(IID_Vision); | ||||
this.losRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, range.min, range.max, players, IID_Identity, cmpRangeManager.GetEntityFlagMask("normal")); | // Do not compensate for entity sizes: LOS doesn't, and UnitAI relies on that. | ||||
this.losRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, | |||||
range.min, range.max, players, IID_Identity, | |||||
cmpRangeManager.GetEntityFlagMask("normal"), false); | |||||
if (enable) | if (enable) | ||||
cmpRangeManager.EnableActiveQuery(this.losRangeQuery); | cmpRangeManager.EnableActiveQuery(this.losRangeQuery); | ||||
}; | }; | ||||
/** | /** | ||||
* Set up a range query for all own or ally units within LOS range | * Set up a range query for all own or ally units within LOS range | ||||
* which can be healed. | * which can be healed. | ||||
Show All 12 Lines | UnitAI.prototype.SetupHealRangeQuery = function(enable = true) | ||||
let cmpPlayer = QueryOwnerInterface(this.entity); | let cmpPlayer = QueryOwnerInterface(this.entity); | ||||
// If we are being destructed (owner == -1), creating a range query is pointless. | // If we are being destructed (owner == -1), creating a range query is pointless. | ||||
if (!cmpPlayer) | if (!cmpPlayer) | ||||
return; | return; | ||||
let players = cmpPlayer.GetAllies(); | let players = cmpPlayer.GetAllies(); | ||||
let range = this.GetQueryRange(IID_Heal); | let range = this.GetQueryRange(IID_Heal); | ||||
this.losHealRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, range.min, range.max, players, IID_Health, cmpRangeManager.GetEntityFlagMask("injured")); | // Do not compensate for entity sizes: LOS doesn't, and UnitAI relies on that. | ||||
this.losHealRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, | |||||
range.min, range.max, players, IID_Health, | |||||
cmpRangeManager.GetEntityFlagMask("injured"), false); | |||||
if (enable) | if (enable) | ||||
cmpRangeManager.EnableActiveQuery(this.losHealRangeQuery); | cmpRangeManager.EnableActiveQuery(this.losHealRangeQuery); | ||||
}; | }; | ||||
/** | /** | ||||
* Set up a range query for all enemy and gaia units within range | * Set up a range query for all enemy and gaia units within range | ||||
* which can be attacked. | * which can be attacked. | ||||
Show All 15 Lines | if (!cmpPlayer) | ||||
return; | return; | ||||
// TODO: How to handle neutral players - Special query to attack military only? | // TODO: How to handle neutral players - Special query to attack military only? | ||||
let players = cmpPlayer.GetEnemies(); | let players = cmpPlayer.GetEnemies(); | ||||
if (!players.length) | if (!players.length) | ||||
return; | return; | ||||
let range = this.GetQueryRange(IID_Attack); | let range = this.GetQueryRange(IID_Attack); | ||||
this.losAttackRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, range.min, range.max, players, IID_Resistance, cmpRangeManager.GetEntityFlagMask("normal")); | // Do not compensate for entity sizes: LOS doesn't, and UnitAI relies on that. | ||||
this.losAttackRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, | |||||
range.min, range.max, players, IID_Resistance, | |||||
cmpRangeManager.GetEntityFlagMask("normal"), false); | |||||
if (enable) | if (enable) | ||||
cmpRangeManager.EnableActiveQuery(this.losAttackRangeQuery); | cmpRangeManager.EnableActiveQuery(this.losAttackRangeQuery); | ||||
}; | }; | ||||
//// FSM linkage functions //// | //// FSM linkage functions //// | ||||
▲ Show 20 Lines • Show All 568 Lines • ▼ Show 20 Lines | UnitAI.prototype.FindNearbyResource = function(position, filter) | ||||
// We accept resources owned by Gaia or any player | // We accept resources owned by Gaia or any player | ||||
let players = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayers(); | let players = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayers(); | ||||
let range = 64; // TODO: what's a sensible number? | let range = 64; // TODO: what's a sensible number? | ||||
let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); | let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); | ||||
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | ||||
let nearby = cmpRangeManager.ExecuteQueryAroundPos(position, 0, range, players, IID_ResourceSupply); | let nearby = cmpRangeManager.ExecuteQueryAroundPos(position, 0, range, players, IID_ResourceSupply, true); | ||||
Silier: this should be false, there is visibile check | |||||
return nearby.find(ent => { | return nearby.find(ent => { | ||||
if (!this.CanGather(ent) || !this.CheckTargetVisible(ent)) | if (!this.CanGather(ent) || !this.CheckTargetVisible(ent)) | ||||
return false; | return false; | ||||
let cmpResourceSupply = Engine.QueryInterface(ent, IID_ResourceSupply); | let cmpResourceSupply = Engine.QueryInterface(ent, IID_ResourceSupply); | ||||
let type = cmpResourceSupply.GetType(); | let type = cmpResourceSupply.GetType(); | ||||
let amount = cmpResourceSupply.GetCurrentAmount(); | let amount = cmpResourceSupply.GetCurrentAmount(); | ||||
let template = cmpTemplateManager.GetCurrentTemplateName(ent); | let template = cmpTemplateManager.GetCurrentTemplateName(ent); | ||||
Show All 22 Lines | UnitAI.prototype.FindNearestDropsite = function(genericType) | ||||
let bestDropsite; | let bestDropsite; | ||||
let bestDist = Infinity; | let bestDist = Infinity; | ||||
// Maximum distance a point on an obstruction can be from the center of the obstruction. | // Maximum distance a point on an obstruction can be from the center of the obstruction. | ||||
let maxDifference = 40; | let maxDifference = 40; | ||||
let owner = cmpOwnership.GetOwner(); | let owner = cmpOwnership.GetOwner(); | ||||
let cmpPlayer = QueryOwnerInterface(this.entity); | let cmpPlayer = QueryOwnerInterface(this.entity); | ||||
let players = cmpPlayer && cmpPlayer.HasSharedDropsites() ? cmpPlayer.GetMutualAllies() : [owner]; | let players = cmpPlayer && cmpPlayer.HasSharedDropsites() ? cmpPlayer.GetMutualAllies() : [owner]; | ||||
let nearestDropsites = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).ExecuteQuery(this.entity, 0, -1, players, IID_ResourceDropsite); | let nearestDropsites = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).ExecuteQuery(this.entity, 0, -1, players, IID_ResourceDropsite); | ||||
Not Done Inline Actions?? Silier: ?? | |||||
let isShip = Engine.QueryInterface(this.entity, IID_Identity).HasClass("Ship"); | let isShip = Engine.QueryInterface(this.entity, IID_Identity).HasClass("Ship"); | ||||
let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | ||||
for (let dropsite of nearestDropsites) | for (let dropsite of nearestDropsites) | ||||
{ | { | ||||
// Ships are unable to reach land dropsites and shouldn't attempt to do so. | // Ships are unable to reach land dropsites and shouldn't attempt to do so. | ||||
if (isShip && !Engine.QueryInterface(dropsite, IID_Identity).HasClass("Naval")) | if (isShip && !Engine.QueryInterface(dropsite, IID_Identity).HasClass("Naval")) | ||||
continue; | continue; | ||||
Show All 33 Lines | UnitAI.prototype.FindNearbyFoundation = function(position) | ||||
let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); | let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); | ||||
if (!cmpOwnership || cmpOwnership.GetOwner() == INVALID_PLAYER) | if (!cmpOwnership || cmpOwnership.GetOwner() == INVALID_PLAYER) | ||||
return undefined; | return undefined; | ||||
let players = [cmpOwnership.GetOwner()]; | let players = [cmpOwnership.GetOwner()]; | ||||
let range = 64; // TODO: what's a sensible number? | let range = 64; // TODO: what's a sensible number? | ||||
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | ||||
let nearby = cmpRangeManager.ExecuteQueryAroundPos(position, 0, range, players, IID_Foundation); | let nearby = cmpRangeManager.ExecuteQueryAroundPos(position, 0, range, players, IID_Foundation, true); | ||||
wraitiiAuthorUnsubmitted Done Inline Actionssame here most likely wraitii: same here most likely | |||||
// Skip foundations that are already complete. (This matters since | // Skip foundations that are already complete. (This matters since | ||||
// we process the ConstructionFinished message before the foundation | // we process the ConstructionFinished message before the foundation | ||||
// we're working on has been deleted.) | // we're working on has been deleted.) | ||||
return nearby.find(ent => !Engine.QueryInterface(ent, IID_Foundation).IsFinished()); | return nearby.find(ent => !Engine.QueryInterface(ent, IID_Foundation).IsFinished()); | ||||
}; | }; | ||||
/** | /** | ||||
▲ Show 20 Lines • Show All 2,013 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); | let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); | ||||
if (!cmpOwnership) | if (!cmpOwnership) | ||||
return; | return; | ||||
let owner = cmpOwnership.GetOwner(); | let owner = cmpOwnership.GetOwner(); | ||||
if (owner == INVALID_PLAYER) | if (owner == INVALID_PLAYER) | ||||
return; | return; | ||||
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | ||||
let nearby = cmpRangeManager.ExecuteQuery(this.entity, 0, range, [owner], IID_UnitAI); | let nearby = cmpRangeManager.ExecuteQuery(this.entity, 0, range, [owner], IID_UnitAI, true); | ||||
wraitiiAuthorUnsubmitted Done Inline Actionsthis one is fine wraitii: this one is fine | |||||
for (let i = 0; i < nearby.length; ++i) | for (let i = 0; i < nearby.length; ++i) | ||||
{ | { | ||||
let cmpUnitAI = Engine.QueryInterface(nearby[i], IID_UnitAI); | let cmpUnitAI = Engine.QueryInterface(nearby[i], IID_UnitAI); | ||||
cmpUnitAI[funcname].apply(cmpUnitAI, args); | cmpUnitAI[funcname].apply(cmpUnitAI, args); | ||||
} | } | ||||
}; | }; | ||||
/** | /** | ||||
Show All 15 Lines |
Wildfire Games · Phabricator
this should be false, there is visibile check