Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
Show First 20 Lines • Show All 1,601 Lines • ▼ Show 20 Lines | "GUARD": { | ||||
if (!this.TargetIsAlive(this.isGuardOf)) | if (!this.TargetIsAlive(this.isGuardOf)) | ||||
{ | { | ||||
this.FinishOrder(); | this.FinishOrder(); | ||||
return; | return; | ||||
} | } | ||||
// Adapt the speed to the one of the target if needed | // Adapt the speed to the one of the target if needed | ||||
let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | ||||
if (cmpObstructionManager.IsInTargetRange(this.entity, this.isGuardOf, 0, 3 * this.guardRange, true)) | if (cmpObstructionManager.IsInTargetRange(this.entity, this.isGuardOf, 0, 3 * this.guardRange, false)) | ||||
{ | { | ||||
let cmpUnitAI = Engine.QueryInterface(this.isGuardOf, IID_UnitAI); | let cmpUnitAI = Engine.QueryInterface(this.isGuardOf, IID_UnitAI); | ||||
if (cmpUnitAI) | if (cmpUnitAI) | ||||
{ | { | ||||
let speed = cmpUnitAI.GetWalkSpeed(); | let speed = cmpUnitAI.GetWalkSpeed(); | ||||
if (speed < this.GetWalkSpeed()) | if (speed < this.GetWalkSpeed()) | ||||
this.SetSpeedMultiplier(speed / this.GetWalkSpeed()); | this.SetSpeedMultiplier(speed / this.GetWalkSpeed()); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 2,650 Lines • ▼ Show 20 Lines | else if (data.min || data.max) | ||||
return this.CheckPointRangeExplicit(data.x, data.z, data.min || -1, data.max || -1); | return this.CheckPointRangeExplicit(data.x, data.z, data.min || -1, data.max || -1); | ||||
return this.CheckPointRangeExplicit(data.x, data.z, 0, 0); | return this.CheckPointRangeExplicit(data.x, data.z, 0, 0); | ||||
}; | }; | ||||
UnitAI.prototype.CheckPointRangeExplicit = function(x, z, min, max) | UnitAI.prototype.CheckPointRangeExplicit = function(x, z, min, max) | ||||
{ | { | ||||
let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | ||||
return cmpObstructionManager.IsInPointRange(this.entity, x, z, min, max, true); | return cmpObstructionManager.IsInPointRange(this.entity, x, z, min, max, false); | ||||
}; | }; | ||||
UnitAI.prototype.CheckTargetRange = function(target, iid, type) | UnitAI.prototype.CheckTargetRange = function(target, iid, type) | ||||
{ | { | ||||
var cmpRanged = Engine.QueryInterface(this.entity, iid); | var cmpRanged = Engine.QueryInterface(this.entity, iid); | ||||
if (!cmpRanged) | if (!cmpRanged) | ||||
return false; | return false; | ||||
var range = cmpRanged.GetRange(type); | var range = cmpRanged.GetRange(type); | ||||
let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | ||||
return cmpObstructionManager.IsInTargetRange(this.entity, target, range.min, range.max, true); | return cmpObstructionManager.IsInTargetRange(this.entity, target, range.min, range.max, false); | ||||
}; | }; | ||||
/** | /** | ||||
* Check if the target is inside the attack range | * Check if the target is inside the attack range | ||||
* For melee attacks, this goes straigt to the regular range calculation | * For melee attacks, this goes straigt to the regular range calculation | ||||
* For ranged attacks, the parabolic formula is used to accout for bigger ranges | * For ranged attacks, the parabolic formula is used to accout for bigger ranges | ||||
* when the target is lower, and smaller ranges when the target is higher | * when the target is lower, and smaller ranges when the target is higher | ||||
*/ | */ | ||||
Show All 32 Lines | UnitAI.prototype.CheckTargetAttackRange = function(target, type) | ||||
var h = s.y-t.y+range.elevationBonus; | var h = s.y-t.y+range.elevationBonus; | ||||
var maxRangeSq = 2*range.max*(h + range.max/2); | var maxRangeSq = 2*range.max*(h + range.max/2); | ||||
if (maxRangeSq < 0) | if (maxRangeSq < 0) | ||||
return false; | return false; | ||||
let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | ||||
return cmpObstructionManager.IsInTargetRange(this.entity, target, range.min, Math.sqrt(maxRangeSq), true); | return cmpObstructionManager.IsInTargetRange(this.entity, target, range.min, Math.sqrt(maxRangeSq), false); | ||||
}; | }; | ||||
UnitAI.prototype.CheckTargetRangeExplicit = function(target, min, max) | UnitAI.prototype.CheckTargetRangeExplicit = function(target, min, max) | ||||
{ | { | ||||
let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | ||||
return cmpObstructionManager.IsInTargetRange(this.entity, target, min, max, true); | return cmpObstructionManager.IsInTargetRange(this.entity, target, min, max, false); | ||||
}; | }; | ||||
UnitAI.prototype.CheckGarrisonRange = function(target) | UnitAI.prototype.CheckGarrisonRange = function(target) | ||||
{ | { | ||||
var cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder); | var cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder); | ||||
if (!cmpGarrisonHolder) | if (!cmpGarrisonHolder) | ||||
return false; | return false; | ||||
var range = cmpGarrisonHolder.GetLoadingRange(); | var range = cmpGarrisonHolder.GetLoadingRange(); | ||||
var cmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction); | var cmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction); | ||||
if (cmpObstruction) | if (cmpObstruction) | ||||
range.max += cmpObstruction.GetUnitRadius()*1.5; // multiply by something larger than sqrt(2) | range.max += cmpObstruction.GetUnitRadius()*1.5; // multiply by something larger than sqrt(2) | ||||
let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); | ||||
return cmpObstructionManager.IsInTargetRange(this.entity, target, range.min, range.max, true); | return cmpObstructionManager.IsInTargetRange(this.entity, target, range.min, range.max, false); | ||||
}; | }; | ||||
/** | /** | ||||
* Returns true if the target entity is visible through the FoW/SoD. | * Returns true if the target entity is visible through the FoW/SoD. | ||||
*/ | */ | ||||
UnitAI.prototype.CheckTargetVisible = function(target) | UnitAI.prototype.CheckTargetVisible = function(target) | ||||
{ | { | ||||
var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); | var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); | ||||
▲ Show 20 Lines • Show All 1,521 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator