rP22506 Introduced a infinite loop in which formation members keep receiving the order to formation walk to their proper position. This was due to this.formationOffset not being removed when in position.
Details
- Reviewers
Silier - Group Reviewers
Restricted Owners Package (Owns No Changed Paths) - Commits
- rP23217: Fix formation-walking infinite loop introduced in rP22506
Verify (by placing thought-out warnings, e.g. at Order.FormationWalk) that an entity in the right place in a formation does not keep receiving walking orders.
Diff Detail
- Repository
- rP 0 A.D. Public Repository
- Branch
- /ps/trunk
- Lint
Lint OK - Unit
No Unit Test Coverage - Build Status
Buildable 10016 Build 16926: Vulcan Build Jenkins Build 16925: Vulcan Build (Windows) Jenkins Build 16924: arc lint + arc unit
Event Timeline
Successful build - Chance fights ever on the side of the prudent.
Link to build: https://jenkins.wildfiregames.com/job/vs2015-differential/574/display/redirect
Successful build - Chance fights ever on the side of the prudent.
Linter detected issues: Executing section Source... Executing section JS... | | [NORMAL] ESLintBear (no-else-return): | | Unnecessary 'else' after 'return'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | 762| 762| this.FinishOrder(); | 763| 763| return; | 764| 764| } | 765| |- else | 766| |- { | | 765|+ | 767| 766| this.SetNextState("GARRISON.APPROACHING"); | 768| 767| return; | 769| |- } | | 768|+ | 770| 769| } | 771| 770| | 772| 771| this.SetNextState("GARRISON.GARRISONING"); | | [NORMAL] ESLintBear (key-spacing): | | Missing space before value for key 'GARRISON'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |1030|1030| }, |1031|1031| }, |1032|1032| |1033| |- "GARRISON":{ | |1033|+ "GARRISON": { |1034|1034| "enter": function() { |1035|1035| // If the garrisonholder should pickup, warn it so it can take needed action |1036|1036| var cmpGarrisonHolder = Engine.QueryInterface(this.order.data.target, IID_GarrisonHolder); | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |1982|1982| |1983|1983| "Attacked": function(msg) { |1984|1984| // If we are capturing and are attacked by something that we would not capture, attack that entity instead |1985| |- if (this.order.data.attackType == "Capture" && (this.GetStance().targetAttackersAlways || !this.order.data.force) |1986| |- && this.order.data.target != msg.data.attacker && this.GetBestAttackAgainst(msg.data.attacker, true) != "Capture") | |1985|+ if (this.order.data.attackType == "Capture" && (this.GetStance().targetAttackersAlways || !this.order.data.force) && | |1986|+ this.order.data.target != msg.data.attacker && this.GetBestAttackAgainst(msg.data.attacker, true) != "Capture") |1987|1987| this.RespondToTargetedEntities([msg.data.attacker]); |1988|1988| }, |1989|1989| }, | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |2710|2710| { |2711|2711| // The building was already finished/fully repaired before we arrived; |2712|2712| // let the ConstructionFinished handler handle this. |2713| |- this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget}); | |2713|+ this.OnGlobalConstructionFinished({ "entity": this.repairTarget, "newentity": this.repairTarget}); |2714|2714| return true; |2715|2715| } |2716|2716| | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |2710|2710| { |2711|2711| // The building was already finished/fully repaired before we arrived; |2712|2712| // let the ConstructionFinished handler handle this. |2713| |- this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget}); | |2713|+ this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget }); |2714|2714| return true; |2715|2715| } |2716|2716| | | [NORMAL] ESLintBear (indent): | | Expected indentation of 2 tabs but found 7. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3223|3223| "COMBAT": "INDIVIDUAL.COMBAT", // reuse the same combat behaviour for animals |3224|3224| |3225|3225| "WALKING": "INDIVIDUAL.WALKING", // reuse the same walking behaviour for animals |3226| |- // only used for domestic animals | |3226|+ // only used for domestic animals |3227|3227| }, |3228|3228| }; |3229|3229| | | [NORMAL] ESLintBear (no-unneeded-ternary): | | Unnecessary use of boolean literals in conditional expression. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3280|3280| |3281|3281| UnitAI.prototype.IsAnimal = function() |3282|3282| { |3283| |- return (this.template.NaturalBehaviour ? true : false); | |3283|+ return (!!this.template.NaturalBehaviour); |3284|3284| }; |3285|3285| |3286|3286| UnitAI.prototype.IsDangerousAnimal = function() | | [NORMAL] ESLintBear (comma-spacing): | | A space is required after ','. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3396|3396| { |3397|3397| let index = this.GetCurrentState().indexOf("."); |3398|3398| if (index != -1) |3399| |- this.UnitFsm.SwitchToNextState(this, this.GetCurrentState().slice(0,index)); | |3399|+ this.UnitFsm.SwitchToNextState(this, this.GetCurrentState().slice(0, index)); |3400|3400| this.Stop(false); |3401|3401| } |3402|3402| | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3452|3452| if (this.orderQueue[i].type != "PickupUnit" || this.orderQueue[i].data.target != msg.entity) |3453|3453| continue; |3454|3454| if (i == 0) |3455| |- this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg}); | |3455|+ this.UnitFsm.ProcessMessage(this, { "type": "PickupCanceled", "data": msg}); |3456|3456| else |3457|3457| this.orderQueue.splice(i, 1); |3458|3458| Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() }); | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3452|3452| if (this.orderQueue[i].type != "PickupUnit" || this.orderQueue[i].data.target != msg.entity) |3453|3453| continue; |3454|3454| if (i == 0) |3455| |- this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg}); | |3455|+ this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg }); |3456|3456| else |3457|3457| this.orderQueue.splice(i, 1); |3458|3458| Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() }); | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3536|3536| }; |3537|3537| |3538|3538| |3539| |-//// FSM linkage functions //// | |3539|+// // FSM linkage functions //// |3540|3540| |3541|3541| // Setting the next state to the current state will leave/re-enter the top-most substate. |3542|3542| UnitAI.prototype.SetNextState = function(state) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3706|3706| continue; |3707|3707| if (this.orderQueue[i].type == type) |3708|3708| continue; |3709| |- this.orderQueue.splice(i, 0, {"type": type, "data": data}); | |3709|+ this.orderQueue.splice(i, 0, { "type": type, "data": data}); |3710|3710| Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() }); |3711|3711| return; |3712|3712| } | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3706|3706| continue; |3707|3707| if (this.orderQueue[i].type == type) |3708|3708| continue; |3709| |- this.orderQueue.splice(i, 0, {"type": type, "data": data}); | |3709|+ this.orderQueue.splice(i, 0, {"type": type, "data": data }); |3710|3710| Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() }); |3711|3711| return; |3712|3712| } | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3877|3877| if (data.timerRepeat === undefined) |3878|3878| this.timer = undefined; |3879|3879| |3880| |- this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness}); | |3880|+ this.UnitFsm.ProcessMessage(this, { "type": "Timer", "data": data, "lateness": lateness}); |3881|3881| }; |3882|3882| |3883|3883| /** | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3877|3877| if (data.timerRepeat === undefined) |3878|3878| this.timer = undefined; |3879|3879| |3880| |- this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness}); | |3880|+ this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness }); |3881|3881| }; |3882|3882| |3883|3883| /** | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3922|3922| // TODO: This is a bit inefficient since every unit listens to every |3923|3923| // construction message - ideally we could scope it to only the one we're building |3924|3924| |3925| |- this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg}); | |3925|+ this.UnitFsm.ProcessMessage(this, { "type": "ConstructionFinished", "data": msg}); |3926|3926| }; |3927|3927| |3928|3928| UnitAI.prototype.OnGlobalEntityRenamed = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3922|3922| // TODO: This is a bit inefficient since every unit listens to every |3923|3923| // construction message - ideally we could scope it to only the one we're building |3924|3924| |3925| |- this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg}); | |3925|+ this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg }); |3926|3926| }; |3927|3927| |3928|3928| UnitAI.prototype.OnGlobalEntityRenamed = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3947|3947| |3948|3948| UnitAI.prototype.OnAttacked = function(msg) |3949|3949| { |3950| |- this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg}); | |3950|+ this.UnitFsm.ProcessMessage(this, { "type": "Attacked", "data": msg}); |3951|3951| }; |3952|3952| |3953|3953| UnitAI.prototype.OnGuardedAttacked = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3947|3947| |3948|3948| UnitAI.prototype.OnAttacked = function(msg) |3949|3949| { |3950| |- this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg}); | |3950|+ this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg }); |3951|3951| }; |3952|3952| |3953|3953| UnitAI.prototype.OnGuardedAttacked = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3952|3952| |3953|3953| UnitAI.prototype.OnGuardedAttacked = function(msg) |3954|3954| { |3955| |- this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data}); | |3955|+ this.UnitFsm.ProcessMessage(this, { "type": "GuardedAttacked", "data": msg.data}); |3956|3956| }; |3957|3957| |3958|3958| UnitAI.prototype.OnHealthChanged = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3952|3952| |3953|3953| UnitAI.prototype.OnGuardedAttacked = function(msg) |3954|3954| { |3955| |- this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data}); | |3955|+ this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data }); |3956|3956| }; |3957|3957| |3958|3958| UnitAI.prototype.OnHealthChanged = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3957|3957| |3958|3958| UnitAI.prototype.OnHealthChanged = function(msg) |3959|3959| { |3960| |- this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to}); | |3960|+ this.UnitFsm.ProcessMessage(this, { "type": "HealthChanged", "from": msg.from, "to": msg.to}); |3961|3961| }; |3962|3962| |3963|3963| UnitAI.prototype.OnRangeUpdate = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3957|3957| |3958|3958| UnitAI.prototype.OnHealthChanged = function(msg) |3959|3959| { |3960| |- this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to}); | |3960|+ this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to }); |3961|3961| }; |3962|3962| |3963|3963| UnitAI.prototype.OnRangeUpdate = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3963|3963| UnitAI.prototype.OnRangeUpdate = function(msg) |3964|3964| { |3965|3965| if (msg.tag == this.losRangeQuery) |3966| |- this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg}); | |3966|+ this.UnitFsm.ProcessMessage(this, { "type": "LosRangeUpdate", "data": msg}); |3967|3967| else if (msg.tag == this.losHealRangeQuery) |3968|3968| this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg}); |3969|3969| }; | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3963|3963| UnitAI.prototype.OnRangeUpdate = function(msg) |3964|3964| { |3965|3965| if (msg.tag == this.losRangeQuery) |3966| |- this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg}); | |3966|+ this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg }); |3967|3967| else if (msg.tag == this.losHealRangeQuery) |3968|3968| this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg}); |3969|3969| }; | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3965|3965| if (msg.tag == this.losRangeQuery) |3966|3966| this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg}); |3967|3967| else if (msg.tag == this.losHealRangeQuery) |3968| |- this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg}); | |3968|+ this.UnitFsm.ProcessMessage(this, { "type": "LosHealRangeUpdate", "data": msg}); |3969|3969| }; |3970|3970| |3971|3971| UnitAI.prototype.OnPackFinished = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3965|3965| if (msg.tag == this.losRangeQuery) |3966|3966| this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg}); |3967|3967| else if (msg.tag == this.losHealRangeQuery) |3968| |- this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg}); | |3968|+ this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg }); |3969|3969| }; |3970|3970| |3971|3971| UnitAI.prototype.OnPackFinished = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3970|3970| |3971|3971| UnitAI.prototype.OnPackFinished = function(msg) |3972|3972| { |3973| |- this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed}); | |3973|+ this.UnitFsm.ProcessMessage(this, { "type": "PackFinished", "packed": msg.packed}); |3974|3974| }; |3975|3975| |3976|3976| //// Helper functions to be called by the FSM //// | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3970|3970| |3971|3971| UnitAI.prototype.OnPackFinished = function(msg) |3972|3972| { |3973| |- this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed}); | |3973|+ this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed }); |3974|3974| }; |3975|3975| |3976|3976| //// Helper functions to be called by the FSM //// | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3973|3973| this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed}); |3974|3974| }; |3975|3975| |3976| |-//// Helper functions to be called by the FSM //// | |3976|+// // Helper functions to be called by the FSM //// |3977|3977| |3978|3978| UnitAI.prototype.GetWalkSpeed = function() |3979|3979| { | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4642|4642| UnitAI.prototype.AttackEntityInZone = function(ents) |4643|4643| { |4644|4644| var target = ents.find(target => |4645| |- this.CanAttack(target) |4646| |- && this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) | |4645|+ this.CanAttack(target) && | |4646|+ this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) |4647|4647| && (this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target)) |4648|4648| ); |4649|4649| if (!target) | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4643|4643| { |4644|4644| var target = ents.find(target => |4645|4645| this.CanAttack(target) |4646| |- && this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) |4647| |- && (this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target)) | |4646|+ && this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) && | |4647|+ (this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target)) |4648|4648| ); |4649|4649| if (!target) |4650|4650| return false; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before 'Engine'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4707|4707| // If we are guarding/escorting, don't abandon as long as the guarded unit is in target range of the attacker |4708|4708| if (this.isGuardOf) |4709|4709| { |4710| |- var cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI); | |4710|+ var cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI); |4711|4711| var cmpAttack = Engine.QueryInterface(target, IID_Attack); |4712|4712| if (cmpUnitAI && cmpAttack && |4713|4713| cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type))) | | [NORMAL] ESLintBear (indent): | | Expected indentation of 3 tabs but found 4. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4711|4711| var cmpAttack = Engine.QueryInterface(target, IID_Attack); |4712|4712| if (cmpUnitAI && cmpAttack && |4713|4713| cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type))) |4714| |- return false; | |4714|+ return false; |4715|4715| } |4716|4716| |4717|4717| // Stop if we're in hold-ground mode and it's too far from the holding point | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before 'Engine'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4749|4749| // If we are guarding/escorting, chase at least as long as the guarded unit is in target range of the attacker |4750|4750| if (this.isGuardOf) |4751|4751| { |4752| |- let cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI); | |4752|+ let cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI); |4753|4753| let cmpAttack = Engine.QueryInterface(target, IID_Attack); |4754|4754| if (cmpUnitAI && cmpAttack && |4755|4755| cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type))) | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4762|4762| return false; |4763|4763| }; |4764|4764| |4765| |-//// External interface functions //// | |4765|+// // External interface functions //// |4766|4766| |4767|4767| UnitAI.prototype.SetFormationController = function(ent) |4768|4768| { | | [NORMAL] ESLintBear (no-else-return): | | Unnecessary 'else' after 'return'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4918|4918| { |4919|4919| if (this.isGuardOf == target && this.order && this.order.type == "Guard") |4920|4920| return; |4921| |- else |4922| |- this.RemoveGuard(); | |4921|+ this.RemoveGuard(); |4923|4922| } |4924|4923| |4925|4924| this.AddOrder("Guard", { "target": target, "force": false }, queued); | | [NORMAL] ESLintBear (no-trailing-spaces): | | Trailing spaces not allowed. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5250|5250| this.workOrders.length && this.workOrders[0].type == "Trade") |5251|5251| { |5252|5252| let cmpTrader = Engine.QueryInterface(this.entity, IID_Trader); |5253| |- if (cmpTrader.HasBothMarkets() && | |5253|+ if (cmpTrader.HasBothMarkets() && |5254|5254| (cmpTrader.GetFirstMarket() == target && cmpTrader.GetSecondMarket() == source || |5255|5255| cmpTrader.GetFirstMarket() == source && cmpTrader.GetSecondMarket() == target)) |5256|5256| { | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5531|5531| { |5532|5532| var cmpIdentity = Engine.QueryInterface(targ, IID_Identity); |5533|5533| var targetClasses = this.order.data.targetClasses; |5534| |- if (targetClasses.attack && cmpIdentity |5535| |- && !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) | |5534|+ if (targetClasses.attack && cmpIdentity && | |5535|+ !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) |5536|5536| continue; |5537|5537| if (targetClasses.avoid && cmpIdentity |5538|5538| && MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5534|5534| if (targetClasses.attack && cmpIdentity |5535|5535| && !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) |5536|5536| continue; |5537| |- if (targetClasses.avoid && cmpIdentity |5538| |- && MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) | |5537|+ if (targetClasses.avoid && cmpIdentity && | |5538|+ MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) |5539|5539| continue; |5540|5540| // Only used by the AIs to prevent some choices of targets |5541|5541| if (targetClasses.vetoEntities && targetClasses.vetoEntities[targ]) | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5557|5557| { |5558|5558| var cmpIdentity = Engine.QueryInterface(targ, IID_Identity); |5559|5559| var targetClasses = this.order.data.targetClasses; |5560| |- if (cmpIdentity && targetClasses.attack |5561| |- && !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) | |5560|+ if (cmpIdentity && targetClasses.attack && | |5561|+ !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) |5562|5562| continue; |5563|5563| if (cmpIdentity && targetClasses.avoid |5564|5564| && MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5560|5560| if (cmpIdentity && targetClasses.attack |5561|5561| && !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) |5562|5562| continue; |5563| |- if (cmpIdentity && targetClasses.avoid |5564| |- && MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) | |5563|+ if (cmpIdentity && targetClasses.avoid && | |5564|+ MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) |5565|5565| continue; |5566|5566| // Only used by the AIs to prevent some choices of targets |5567|5567| if (targetClasses.vetoEntities && targetClasses.vetoEntities[targ]) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5717|5717| |5718|5718| UnitAI.prototype.SetHeldPosition = function(x, z) |5719|5719| { |5720| |- this.heldPosition = {"x": x, "z": z}; | |5720|+ this.heldPosition = { "x": x, "z": z}; |5721|5721| }; |5722|5722| |5723|5723| UnitAI.prototype.SetHeldPositionOnEntity = function(entity) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5717|5717| |5718|5718| UnitAI.prototype.SetHeldPosition = function(x, z) |5719|5719| { |5720| |- this.heldPosition = {"x": x, "z": z}; | |5720|+ this.heldPosition = {"x": x, "z": z }; |5721|5721| }; |5722|5722| |5723|5723| UnitAI.prototype.SetHeldPositionOnEntity = function(entity) | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5744|5744| return false; |5745|5745| }; |5746|5746| |5747| |-//// Helper functions //// | |5747|+// // Helper functions //// |5748|5748| |5749|5749| UnitAI.prototype.CanAttack = function(target) |5750|5750| { | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5948|5948| return cmpPack && cmpPack.IsPacking(); |5949|5949| }; |5950|5950| |5951| |-//// Formation specific functions //// | |5951|+// // Formation specific functions //// |5952|5952| |5953|5953| UnitAI.prototype.IsAttackingAsFormation = function() |5954|5954| { | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5953|5953| UnitAI.prototype.IsAttackingAsFormation = function() |5954|5954| { |5955|5955| var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack); |5956| |- return cmpAttack && cmpAttack.CanAttackAsFormation() |5957| |- && this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING"; | |5956|+ return cmpAttack && cmpAttack.CanAttackAsFormation() && | |5957|+ this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING"; |5958|5958| }; |5959|5959| |5960|5960| //// Animal specific functions //// | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5957|5957| && this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING"; |5958|5958| }; |5959|5959| |5960| |-//// Animal specific functions //// | |5960|+// // Animal specific functions //// |5961|5961| |5962|5962| UnitAI.prototype.MoveRandomly = function(distance) |5963|5963| { binaries/data/mods/public/simulation/components/UnitAI.js | 331| » » » return·true; | | [NORMAL] ESLintBear (consistent-return): | | Method 'Order.WalkToTarget' expected no return value. binaries/data/mods/public/simulation/components/UnitAI.js | 917| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js | 942| » » » "enter":·function(msg)·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js | 992| » » » » » return·true; | | [NORMAL] ESLintBear (consistent-return): | | Method 'enter' expected no return value. binaries/data/mods/public/simulation/components/UnitAI.js |1055| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1091| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1123| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1283| » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1343| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1518| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1540| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1572| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1726| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1776| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1854| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2031| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2147| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2422| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2455| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2561| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2627| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2666| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2877| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |3058| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |3782| » var·isWorkType·=·type·=>·type·==·"Gather"·||·type·==·"Trade"·||·type·==·"Repair"·||·type·==·"ReturnResource"; | | [NORMAL] ESLintBear (no-shadow): | | 'type' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |4629| » var·target·=·ents.find(target·=>·this.CanAttack(target)); | | [NORMAL] ESLintBear (no-shadow): | | 'target' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |4644| » var·target·=·ents.find(target·=> | | [NORMAL] ESLintBear (no-shadow): | | 'target' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |4690| » var·ent·=·ents.find(ent·=>·this.CanHeal(ent)); | | [NORMAL] ESLintBear (no-shadow): | | 'ent' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |4713| » » ····cmpAttack.GetAttackTypes().some(type·=>·cmpUnitAI.CheckTargetAttackRange(this.isGuardOf,·type))) | | [NORMAL] ESLintBear (no-shadow): | | 'type' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |1986| » » » » » » &&·this.order.data.target·!=·msg.data.attacker·&&·this.GetBestAttackAgainst(msg.data.attacker,·true)·!=·"Capture") | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |3744| » » var·order·=·{·"type":·type,·"data":·data·}; | | [NORMAL] JSHintBear: | | 'order' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |3813| » for·(var·i·=·0;·i·<·this.orderQueue.length;·++i) | | [NORMAL] JSHintBear: | | 'i' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |4646| » » &&·this.CheckTargetDistanceFromHeldPosition(target,·IID_Attack,·this.GetBestAttackAgainst(target,·true)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |4647| » » &&·(this.GetStance().respondChaseBeyondVision·||·this.CheckTargetIsInVisionRange(target)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5535| » » » » » » &&·!MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.attack)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5538| » » » » » » &&·MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.avoid)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5551| » var·targets·=·this.GetTargetsFromUnit(); | | [NORMAL] JSHintBear: | | 'targets' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5552| » for·(var·targ·of·targets) | | [NORMAL] JSHintBear: | | 'targ' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5558| » » » var·cmpIdentity·=·Engine.QueryInterface(targ,·IID_Identity); | | [NORMAL] JSHintBear: | | 'cmpIdentity' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5559| » » » var·targetClasses·=·this.order.data.targetClasses; | | [NORMAL] JSHintBear: | | 'targetClasses' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5561| » » » » &&·!MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.attack)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5564| » » » » &&·MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.avoid)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5639| » » var·cmpVision·=·Engine.QueryInterface(this.entity,·IID_Vision); | | [NORMAL] JSHintBear: | | 'cmpVision' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5642| » » var·range·=·cmpVision.GetRange(); | | [NORMAL] JSHintBear: | | 'range' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5647| » » var·cmpRanged·=·Engine.QueryInterface(this.entity,·iid); | | [NORMAL] JSHintBear: | | 'cmpRanged' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5650| » » var·range·=·iid·!==·IID_Attack·?·cmpRanged.GetRange()·:·cmpRanged.GetFullAttackRange(); | | [NORMAL] JSHintBear: | | 'range' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5651| » » var·cmpVision·=·Engine.QueryInterface(this.entity,·IID_Vision); | | [NORMAL] JSHintBear: | | 'cmpVision' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5661| » » var·cmpVision·=·Engine.QueryInterface(this.entity,·IID_Vision); | | [NORMAL] JSHintBear: | | 'cmpVision' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5664| » » var·range·=·cmpVision.GetRange(); | | [NORMAL] JSHintBear: | | 'range' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5957| » » &&·this.GetCurrentState()·==·"FORMATIONCONTROLLER.COMBAT.ATTACKING"; | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. Executing section cli...
Link to build: https://jenkins.wildfiregames.com/job/docker-differential/1088/display/redirect
binaries/data/mods/public/simulation/components/UnitAI.js | ||
---|---|---|
1333 | Could also be if(!cmpFormation) early return like above ? |
see inline comment
binaries/data/mods/public/simulation/components/UnitAI.js | ||
---|---|---|
1335 | does not need to be inside cmpFormation check, move it out pls |
Successful build - Chance fights ever on the side of the prudent.
Link to build: https://jenkins.wildfiregames.com/job/vs2015-differential/614/display/redirect
Successful build - Chance fights ever on the side of the prudent.
Linter detected issues: Executing section Source... Executing section JS... | | [NORMAL] ESLintBear (no-else-return): | | Unnecessary 'else' after 'return'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | 762| 762| this.FinishOrder(); | 763| 763| return; | 764| 764| } | 765| |- else | 766| |- { | | 765|+ | 767| 766| this.SetNextState("GARRISON.APPROACHING"); | 768| 767| return; | 769| |- } | | 768|+ | 770| 769| } | 771| 770| | 772| 771| this.SetNextState("GARRISON.GARRISONING"); | | [NORMAL] ESLintBear (key-spacing): | | Missing space before value for key 'GARRISON'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |1030|1030| }, |1031|1031| }, |1032|1032| |1033| |- "GARRISON":{ | |1033|+ "GARRISON": { |1034|1034| "enter": function() { |1035|1035| // If the garrisonholder should pickup, warn it so it can take needed action |1036|1036| var cmpGarrisonHolder = Engine.QueryInterface(this.order.data.target, IID_GarrisonHolder); | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |1981|1981| |1982|1982| "Attacked": function(msg) { |1983|1983| // If we are capturing and are attacked by something that we would not capture, attack that entity instead |1984| |- if (this.order.data.attackType == "Capture" && (this.GetStance().targetAttackersAlways || !this.order.data.force) |1985| |- && this.order.data.target != msg.data.attacker && this.GetBestAttackAgainst(msg.data.attacker, true) != "Capture") | |1984|+ if (this.order.data.attackType == "Capture" && (this.GetStance().targetAttackersAlways || !this.order.data.force) && | |1985|+ this.order.data.target != msg.data.attacker && this.GetBestAttackAgainst(msg.data.attacker, true) != "Capture") |1986|1986| this.RespondToTargetedEntities([msg.data.attacker]); |1987|1987| }, |1988|1988| }, | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |2709|2709| { |2710|2710| // The building was already finished/fully repaired before we arrived; |2711|2711| // let the ConstructionFinished handler handle this. |2712| |- this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget}); | |2712|+ this.OnGlobalConstructionFinished({ "entity": this.repairTarget, "newentity": this.repairTarget}); |2713|2713| return true; |2714|2714| } |2715|2715| | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |2709|2709| { |2710|2710| // The building was already finished/fully repaired before we arrived; |2711|2711| // let the ConstructionFinished handler handle this. |2712| |- this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget}); | |2712|+ this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget }); |2713|2713| return true; |2714|2714| } |2715|2715| | | [NORMAL] ESLintBear (indent): | | Expected indentation of 2 tabs but found 7. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3222|3222| "COMBAT": "INDIVIDUAL.COMBAT", // reuse the same combat behaviour for animals |3223|3223| |3224|3224| "WALKING": "INDIVIDUAL.WALKING", // reuse the same walking behaviour for animals |3225| |- // only used for domestic animals | |3225|+ // only used for domestic animals |3226|3226| }, |3227|3227| }; |3228|3228| | | [NORMAL] ESLintBear (no-unneeded-ternary): | | Unnecessary use of boolean literals in conditional expression. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3279|3279| |3280|3280| UnitAI.prototype.IsAnimal = function() |3281|3281| { |3282| |- return (this.template.NaturalBehaviour ? true : false); | |3282|+ return (!!this.template.NaturalBehaviour); |3283|3283| }; |3284|3284| |3285|3285| UnitAI.prototype.IsDangerousAnimal = function() | | [NORMAL] ESLintBear (comma-spacing): | | A space is required after ','. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3395|3395| { |3396|3396| let index = this.GetCurrentState().indexOf("."); |3397|3397| if (index != -1) |3398| |- this.UnitFsm.SwitchToNextState(this, this.GetCurrentState().slice(0,index)); | |3398|+ this.UnitFsm.SwitchToNextState(this, this.GetCurrentState().slice(0, index)); |3399|3399| this.Stop(false); |3400|3400| } |3401|3401| | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3451|3451| if (this.orderQueue[i].type != "PickupUnit" || this.orderQueue[i].data.target != msg.entity) |3452|3452| continue; |3453|3453| if (i == 0) |3454| |- this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg}); | |3454|+ this.UnitFsm.ProcessMessage(this, { "type": "PickupCanceled", "data": msg}); |3455|3455| else |3456|3456| this.orderQueue.splice(i, 1); |3457|3457| Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() }); | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3451|3451| if (this.orderQueue[i].type != "PickupUnit" || this.orderQueue[i].data.target != msg.entity) |3452|3452| continue; |3453|3453| if (i == 0) |3454| |- this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg}); | |3454|+ this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg }); |3455|3455| else |3456|3456| this.orderQueue.splice(i, 1); |3457|3457| Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() }); | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3535|3535| }; |3536|3536| |3537|3537| |3538| |-//// FSM linkage functions //// | |3538|+// // FSM linkage functions //// |3539|3539| |3540|3540| // Setting the next state to the current state will leave/re-enter the top-most substate. |3541|3541| UnitAI.prototype.SetNextState = function(state) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3705|3705| continue; |3706|3706| if (this.orderQueue[i].type == type) |3707|3707| continue; |3708| |- this.orderQueue.splice(i, 0, {"type": type, "data": data}); | |3708|+ this.orderQueue.splice(i, 0, { "type": type, "data": data}); |3709|3709| Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() }); |3710|3710| return; |3711|3711| } | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3705|3705| continue; |3706|3706| if (this.orderQueue[i].type == type) |3707|3707| continue; |3708| |- this.orderQueue.splice(i, 0, {"type": type, "data": data}); | |3708|+ this.orderQueue.splice(i, 0, {"type": type, "data": data }); |3709|3709| Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() }); |3710|3710| return; |3711|3711| } | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3876|3876| if (data.timerRepeat === undefined) |3877|3877| this.timer = undefined; |3878|3878| |3879| |- this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness}); | |3879|+ this.UnitFsm.ProcessMessage(this, { "type": "Timer", "data": data, "lateness": lateness}); |3880|3880| }; |3881|3881| |3882|3882| /** | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3876|3876| if (data.timerRepeat === undefined) |3877|3877| this.timer = undefined; |3878|3878| |3879| |- this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness}); | |3879|+ this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness }); |3880|3880| }; |3881|3881| |3882|3882| /** | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3921|3921| // TODO: This is a bit inefficient since every unit listens to every |3922|3922| // construction message - ideally we could scope it to only the one we're building |3923|3923| |3924| |- this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg}); | |3924|+ this.UnitFsm.ProcessMessage(this, { "type": "ConstructionFinished", "data": msg}); |3925|3925| }; |3926|3926| |3927|3927| UnitAI.prototype.OnGlobalEntityRenamed = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3921|3921| // TODO: This is a bit inefficient since every unit listens to every |3922|3922| // construction message - ideally we could scope it to only the one we're building |3923|3923| |3924| |- this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg}); | |3924|+ this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg }); |3925|3925| }; |3926|3926| |3927|3927| UnitAI.prototype.OnGlobalEntityRenamed = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3946|3946| |3947|3947| UnitAI.prototype.OnAttacked = function(msg) |3948|3948| { |3949| |- this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg}); | |3949|+ this.UnitFsm.ProcessMessage(this, { "type": "Attacked", "data": msg}); |3950|3950| }; |3951|3951| |3952|3952| UnitAI.prototype.OnGuardedAttacked = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3946|3946| |3947|3947| UnitAI.prototype.OnAttacked = function(msg) |3948|3948| { |3949| |- this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg}); | |3949|+ this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg }); |3950|3950| }; |3951|3951| |3952|3952| UnitAI.prototype.OnGuardedAttacked = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3951|3951| |3952|3952| UnitAI.prototype.OnGuardedAttacked = function(msg) |3953|3953| { |3954| |- this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data}); | |3954|+ this.UnitFsm.ProcessMessage(this, { "type": "GuardedAttacked", "data": msg.data}); |3955|3955| }; |3956|3956| |3957|3957| UnitAI.prototype.OnHealthChanged = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3951|3951| |3952|3952| UnitAI.prototype.OnGuardedAttacked = function(msg) |3953|3953| { |3954| |- this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data}); | |3954|+ this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data }); |3955|3955| }; |3956|3956| |3957|3957| UnitAI.prototype.OnHealthChanged = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3956|3956| |3957|3957| UnitAI.prototype.OnHealthChanged = function(msg) |3958|3958| { |3959| |- this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to}); | |3959|+ this.UnitFsm.ProcessMessage(this, { "type": "HealthChanged", "from": msg.from, "to": msg.to}); |3960|3960| }; |3961|3961| |3962|3962| UnitAI.prototype.OnRangeUpdate = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3956|3956| |3957|3957| UnitAI.prototype.OnHealthChanged = function(msg) |3958|3958| { |3959| |- this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to}); | |3959|+ this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to }); |3960|3960| }; |3961|3961| |3962|3962| UnitAI.prototype.OnRangeUpdate = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3962|3962| UnitAI.prototype.OnRangeUpdate = function(msg) |3963|3963| { |3964|3964| if (msg.tag == this.losRangeQuery) |3965| |- this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg}); | |3965|+ this.UnitFsm.ProcessMessage(this, { "type": "LosRangeUpdate", "data": msg}); |3966|3966| else if (msg.tag == this.losHealRangeQuery) |3967|3967| this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg}); |3968|3968| }; | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3962|3962| UnitAI.prototype.OnRangeUpdate = function(msg) |3963|3963| { |3964|3964| if (msg.tag == this.losRangeQuery) |3965| |- this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg}); | |3965|+ this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg }); |3966|3966| else if (msg.tag == this.losHealRangeQuery) |3967|3967| this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg}); |3968|3968| }; | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3964|3964| if (msg.tag == this.losRangeQuery) |3965|3965| this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg}); |3966|3966| else if (msg.tag == this.losHealRangeQuery) |3967| |- this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg}); | |3967|+ this.UnitFsm.ProcessMessage(this, { "type": "LosHealRangeUpdate", "data": msg}); |3968|3968| }; |3969|3969| |3970|3970| UnitAI.prototype.OnPackFinished = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3964|3964| if (msg.tag == this.losRangeQuery) |3965|3965| this.UnitFsm.ProcessMessage(this, {"type": "LosRangeUpdate", "data": msg}); |3966|3966| else if (msg.tag == this.losHealRangeQuery) |3967| |- this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg}); | |3967|+ this.UnitFsm.ProcessMessage(this, {"type": "LosHealRangeUpdate", "data": msg }); |3968|3968| }; |3969|3969| |3970|3970| UnitAI.prototype.OnPackFinished = function(msg) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3969|3969| |3970|3970| UnitAI.prototype.OnPackFinished = function(msg) |3971|3971| { |3972| |- this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed}); | |3972|+ this.UnitFsm.ProcessMessage(this, { "type": "PackFinished", "packed": msg.packed}); |3973|3973| }; |3974|3974| |3975|3975| //// Helper functions to be called by the FSM //// | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3969|3969| |3970|3970| UnitAI.prototype.OnPackFinished = function(msg) |3971|3971| { |3972| |- this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed}); | |3972|+ this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed }); |3973|3973| }; |3974|3974| |3975|3975| //// Helper functions to be called by the FSM //// | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |3972|3972| this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed}); |3973|3973| }; |3974|3974| |3975| |-//// Helper functions to be called by the FSM //// | |3975|+// // Helper functions to be called by the FSM //// |3976|3976| |3977|3977| UnitAI.prototype.GetWalkSpeed = function() |3978|3978| { | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4641|4641| UnitAI.prototype.AttackEntityInZone = function(ents) |4642|4642| { |4643|4643| var target = ents.find(target => |4644| |- this.CanAttack(target) |4645| |- && this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) | |4644|+ this.CanAttack(target) && | |4645|+ this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) |4646|4646| && (this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target)) |4647|4647| ); |4648|4648| if (!target) | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4642|4642| { |4643|4643| var target = ents.find(target => |4644|4644| this.CanAttack(target) |4645| |- && this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) |4646| |- && (this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target)) | |4645|+ && this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) && | |4646|+ (this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target)) |4647|4647| ); |4648|4648| if (!target) |4649|4649| return false; | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before 'Engine'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4706|4706| // If we are guarding/escorting, don't abandon as long as the guarded unit is in target range of the attacker |4707|4707| if (this.isGuardOf) |4708|4708| { |4709| |- var cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI); | |4709|+ var cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI); |4710|4710| var cmpAttack = Engine.QueryInterface(target, IID_Attack); |4711|4711| if (cmpUnitAI && cmpAttack && |4712|4712| cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type))) | | [NORMAL] ESLintBear (indent): | | Expected indentation of 3 tabs but found 4. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4710|4710| var cmpAttack = Engine.QueryInterface(target, IID_Attack); |4711|4711| if (cmpUnitAI && cmpAttack && |4712|4712| cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type))) |4713| |- return false; | |4713|+ return false; |4714|4714| } |4715|4715| |4716|4716| // Stop if we're in hold-ground mode and it's too far from the holding point | | [NORMAL] ESLintBear (no-multi-spaces): | | Multiple spaces found before 'Engine'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4748|4748| // If we are guarding/escorting, chase at least as long as the guarded unit is in target range of the attacker |4749|4749| if (this.isGuardOf) |4750|4750| { |4751| |- let cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI); | |4751|+ let cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI); |4752|4752| let cmpAttack = Engine.QueryInterface(target, IID_Attack); |4753|4753| if (cmpUnitAI && cmpAttack && |4754|4754| cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type))) | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4761|4761| return false; |4762|4762| }; |4763|4763| |4764| |-//// External interface functions //// | |4764|+// // External interface functions //// |4765|4765| |4766|4766| UnitAI.prototype.SetFormationController = function(ent) |4767|4767| { | | [NORMAL] ESLintBear (no-else-return): | | Unnecessary 'else' after 'return'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |4917|4917| { |4918|4918| if (this.isGuardOf == target && this.order && this.order.type == "Guard") |4919|4919| return; |4920| |- else |4921| |- this.RemoveGuard(); | |4920|+ this.RemoveGuard(); |4922|4921| } |4923|4922| |4924|4923| this.AddOrder("Guard", { "target": target, "force": false }, queued); | | [NORMAL] ESLintBear (no-trailing-spaces): | | Trailing spaces not allowed. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5249|5249| this.workOrders.length && this.workOrders[0].type == "Trade") |5250|5250| { |5251|5251| let cmpTrader = Engine.QueryInterface(this.entity, IID_Trader); |5252| |- if (cmpTrader.HasBothMarkets() && | |5252|+ if (cmpTrader.HasBothMarkets() && |5253|5253| (cmpTrader.GetFirstMarket() == target && cmpTrader.GetSecondMarket() == source || |5254|5254| cmpTrader.GetFirstMarket() == source && cmpTrader.GetSecondMarket() == target)) |5255|5255| { | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5530|5530| { |5531|5531| var cmpIdentity = Engine.QueryInterface(targ, IID_Identity); |5532|5532| var targetClasses = this.order.data.targetClasses; |5533| |- if (targetClasses.attack && cmpIdentity |5534| |- && !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) | |5533|+ if (targetClasses.attack && cmpIdentity && | |5534|+ !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) |5535|5535| continue; |5536|5536| if (targetClasses.avoid && cmpIdentity |5537|5537| && MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5533|5533| if (targetClasses.attack && cmpIdentity |5534|5534| && !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) |5535|5535| continue; |5536| |- if (targetClasses.avoid && cmpIdentity |5537| |- && MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) | |5536|+ if (targetClasses.avoid && cmpIdentity && | |5537|+ MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) |5538|5538| continue; |5539|5539| // Only used by the AIs to prevent some choices of targets |5540|5540| if (targetClasses.vetoEntities && targetClasses.vetoEntities[targ]) | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5556|5556| { |5557|5557| var cmpIdentity = Engine.QueryInterface(targ, IID_Identity); |5558|5558| var targetClasses = this.order.data.targetClasses; |5559| |- if (cmpIdentity && targetClasses.attack |5560| |- && !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) | |5559|+ if (cmpIdentity && targetClasses.attack && | |5560|+ !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) |5561|5561| continue; |5562|5562| if (cmpIdentity && targetClasses.avoid |5563|5563| && MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5559|5559| if (cmpIdentity && targetClasses.attack |5560|5560| && !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack)) |5561|5561| continue; |5562| |- if (cmpIdentity && targetClasses.avoid |5563| |- && MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) | |5562|+ if (cmpIdentity && targetClasses.avoid && | |5563|+ MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid)) |5564|5564| continue; |5565|5565| // Only used by the AIs to prevent some choices of targets |5566|5566| if (targetClasses.vetoEntities && targetClasses.vetoEntities[targ]) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required after '{'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5716|5716| |5717|5717| UnitAI.prototype.SetHeldPosition = function(x, z) |5718|5718| { |5719| |- this.heldPosition = {"x": x, "z": z}; | |5719|+ this.heldPosition = { "x": x, "z": z}; |5720|5720| }; |5721|5721| |5722|5722| UnitAI.prototype.SetHeldPositionOnEntity = function(entity) | | [NORMAL] ESLintBear (object-curly-spacing): | | A space is required before '}'. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5716|5716| |5717|5717| UnitAI.prototype.SetHeldPosition = function(x, z) |5718|5718| { |5719| |- this.heldPosition = {"x": x, "z": z}; | |5719|+ this.heldPosition = {"x": x, "z": z }; |5720|5720| }; |5721|5721| |5722|5722| UnitAI.prototype.SetHeldPositionOnEntity = function(entity) | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5743|5743| return false; |5744|5744| }; |5745|5745| |5746| |-//// Helper functions //// | |5746|+// // Helper functions //// |5747|5747| |5748|5748| UnitAI.prototype.CanAttack = function(target) |5749|5749| { | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5947|5947| return cmpPack && cmpPack.IsPacking(); |5948|5948| }; |5949|5949| |5950| |-//// Formation specific functions //// | |5950|+// // Formation specific functions //// |5951|5951| |5952|5952| UnitAI.prototype.IsAttackingAsFormation = function() |5953|5953| { | | [NORMAL] ESLintBear (operator-linebreak): | | '&&' should be placed at the end of the line. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5952|5952| UnitAI.prototype.IsAttackingAsFormation = function() |5953|5953| { |5954|5954| var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack); |5955| |- return cmpAttack && cmpAttack.CanAttackAsFormation() |5956| |- && this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING"; | |5955|+ return cmpAttack && cmpAttack.CanAttackAsFormation() && | |5956|+ this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING"; |5957|5957| }; |5958|5958| |5959|5959| //// Animal specific functions //// | | [NORMAL] ESLintBear (spaced-comment): | | Expected space or tab after '//' in comment. |----| | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js | |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js |5956|5956| && this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING"; |5957|5957| }; |5958|5958| |5959| |-//// Animal specific functions //// | |5959|+// // Animal specific functions //// |5960|5960| |5961|5961| UnitAI.prototype.MoveRandomly = function(distance) |5962|5962| { binaries/data/mods/public/simulation/components/UnitAI.js | 331| » » » return·true; | | [NORMAL] ESLintBear (consistent-return): | | Method 'Order.WalkToTarget' expected no return value. binaries/data/mods/public/simulation/components/UnitAI.js | 917| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js | 942| » » » "enter":·function(msg)·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js | 992| » » » » » return·true; | | [NORMAL] ESLintBear (consistent-return): | | Method 'enter' expected no return value. binaries/data/mods/public/simulation/components/UnitAI.js |1055| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1091| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1123| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1283| » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1342| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1517| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1539| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1571| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1725| » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1775| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |1853| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2030| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2146| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2421| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2454| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2560| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2626| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2665| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |2876| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |3057| » » » » "enter":·function()·{ | | [NORMAL] ESLintBear (consistent-return): | | Expected to return a value at the end of method 'enter'. binaries/data/mods/public/simulation/components/UnitAI.js |3781| » var·isWorkType·=·type·=>·type·==·"Gather"·||·type·==·"Trade"·||·type·==·"Repair"·||·type·==·"ReturnResource"; | | [NORMAL] ESLintBear (no-shadow): | | 'type' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |4628| » var·target·=·ents.find(target·=>·this.CanAttack(target)); | | [NORMAL] ESLintBear (no-shadow): | | 'target' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |4643| » var·target·=·ents.find(target·=> | | [NORMAL] ESLintBear (no-shadow): | | 'target' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |4689| » var·ent·=·ents.find(ent·=>·this.CanHeal(ent)); | | [NORMAL] ESLintBear (no-shadow): | | 'ent' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |4712| » » ····cmpAttack.GetAttackTypes().some(type·=>·cmpUnitAI.CheckTargetAttackRange(this.isGuardOf,·type))) | | [NORMAL] ESLintBear (no-shadow): | | 'type' is already declared in the upper scope. binaries/data/mods/public/simulation/components/UnitAI.js |1985| » » » » » » &&·this.order.data.target·!=·msg.data.attacker·&&·this.GetBestAttackAgainst(msg.data.attacker,·true)·!=·"Capture") | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |3743| » » var·order·=·{·"type":·type,·"data":·data·}; | | [NORMAL] JSHintBear: | | 'order' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |3812| » for·(var·i·=·0;·i·<·this.orderQueue.length;·++i) | | [NORMAL] JSHintBear: | | 'i' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |4645| » » &&·this.CheckTargetDistanceFromHeldPosition(target,·IID_Attack,·this.GetBestAttackAgainst(target,·true)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |4646| » » &&·(this.GetStance().respondChaseBeyondVision·||·this.CheckTargetIsInVisionRange(target)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5534| » » » » » » &&·!MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.attack)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5537| » » » » » » &&·MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.avoid)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5550| » var·targets·=·this.GetTargetsFromUnit(); | | [NORMAL] JSHintBear: | | 'targets' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5551| » for·(var·targ·of·targets) | | [NORMAL] JSHintBear: | | 'targ' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5557| » » » var·cmpIdentity·=·Engine.QueryInterface(targ,·IID_Identity); | | [NORMAL] JSHintBear: | | 'cmpIdentity' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5558| » » » var·targetClasses·=·this.order.data.targetClasses; | | [NORMAL] JSHintBear: | | 'targetClasses' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5560| » » » » &&·!MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.attack)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5563| » » » » &&·MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.avoid)) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/UnitAI.js |5638| » » var·cmpVision·=·Engine.QueryInterface(this.entity,·IID_Vision); | | [NORMAL] JSHintBear: | | 'cmpVision' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5641| » » var·range·=·cmpVision.GetRange(); | | [NORMAL] JSHintBear: | | 'range' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5646| » » var·cmpRanged·=·Engine.QueryInterface(this.entity,·iid); | | [NORMAL] JSHintBear: | | 'cmpRanged' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5649| » » var·range·=·iid·!==·IID_Attack·?·cmpRanged.GetRange()·:·cmpRanged.GetFullAttackRange(); | | [NORMAL] JSHintBear: | | 'range' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5650| » » var·cmpVision·=·Engine.QueryInterface(this.entity,·IID_Vision); | | [NORMAL] JSHintBear: | | 'cmpVision' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5660| » » var·cmpVision·=·Engine.QueryInterface(this.entity,·IID_Vision); | | [NORMAL] JSHintBear: | | 'cmpVision' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5663| » » var·range·=·cmpVision.GetRange(); | | [NORMAL] JSHintBear: | | 'range' is already defined. binaries/data/mods/public/simulation/components/UnitAI.js |5956| » » &&·this.GetCurrentState()·==·"FORMATIONCONTROLLER.COMBAT.ATTACKING"; | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. Executing section cli...
Link to build: https://jenkins.wildfiregames.com/job/docker-differential/1130/display/redirect
With this patched applied, I confirm formationmember in IDLE state now correctly reaches this.isIdle = true, which is important information for AI (Petra) and GUI.
As this is fixing reported issue and do not introduce invalid behaviour (no such was noticed while testing) I accept this patch and agree on to be committed.