#3154 closed defect (fixed)
Formations - Attack order fails by targeting the formation and not the individual unit
Reported by: | elexis | Owned by: | Itms |
---|---|---|---|
Priority: | Must Have | Milestone: | Alpha 19 |
Component: | UI & Simulation | Keywords: | |
Cc: | Patch: |
Description
In a game that started as 4v4, people disconnected without resigning, resigned & quit and changed displomacy multiple times. Also the private chat ("/msg <nickname> <text>") was used.
At turn 3120 player 1 and 3 issued non-queued attack commands:
turn 3120 500 cmd 1 {"type":"attack","entities":[164,4127,4128,4132,4133,4134,4135,4136,4403,4573,4633,4642,4672,4715,4727,4740,4806,4807,4808,4809,4810,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598],"target":4793,"queued":false} cmd 3 {"type":"attack","entities":[3720,4159,4161,4214,4216,4218,4789,4790,4791,4792,4793],"target":5593,"queued":false} end
This is when the following error message appeares:
WARNING: JavaScript warning: simulation/components/Player.js line 557 reference to undefined property this.diplomacy[id] WARNING: JavaScript warning: simulation/components/Player.js line 570 reference to undefined property this.diplomacy[id]
Which means that the error occurs in the return part of the following functions in Player.js:
/** * Check if given player is our enemy */ Player.prototype.IsEnemy = function(id) { return this.diplomacy[id] < 0; }; /** * Check if given player is neutral */ Player.prototype.IsNeutral = function(id) { return this.diplomacy[id] == 0; };
The error is reproducable by replaying the attached commands.txt file.
Additional Information: Player 1 = me was defeated after I deleted all units at turn 4175 (therefore no resign command in the logfile) Player 2 = left without resign shortly after turn 28 (looked like network timeout) Player 3+4 = remaining players alive as the game ended Player 5-8 resigned (turn 538, 956, 1435 and 2571)
Attachments (4)
Change History (15)
by , 9 years ago
Attachment: | commands.txt.7z added |
---|
comment:1 by , 9 years ago
When the error occurs, the id argument is -1. By adding the following code to Player.js...
if (id == -1) { var err = new Error(); error(err.stack); }
I could dump the following stack trace:
Player.prototype.IsNeutral@simulation/components/Player.js:571:10 IsOwnedByNeutralOfPlayer@simulation/helpers/Player.js:349:1 UnitAI.prototype.CanAttack@simulation/components/UnitAI.js:5571:1 UnitAI.prototype.Attack@simulation/components/UnitAI.js:4931:6 UnitAI.prototype.CallMemberFunction@simulation/components/UnitAI.js:5842:3 UnitAI.prototype.UnitFsmSpec.FORMATIONCONTROLLER["Order.Attack"]@simulation/components/UnitAI.js:844:47 FSM.prototype.ProcessMessage@simulation/helpers/FSM.js:274:29 UnitAI.prototype.PushOrder@simulation/components/UnitAI.js:3527:39 UnitAI.prototype.ReplaceOrder@simulation/components/UnitAI.js:3635:3 UnitAI.prototype.AddOrder@simulation/components/UnitAI.js:4769:3 UnitAI.prototype.Attack@simulation/components/UnitAI.js:4942:46 commands.attack/<@simulation/helpers/Commands.js:149:4 commands.attack@simulation/helpers/Commands.js:148:3 ProcessCommand@simulation/helpers/Commands.js:37:3
Also ignore the other error in the replay log:
Turn 3210 (500)... WARNING: JavaScript warning: simulation/components/Fogging.js line 160 reference to undefined property this.miraged[player]
Since that one is #3149.
comment:2 by , 9 years ago
Summary: | undefined property this.diplomacy[id] → [Formations] Attack order causes "undefined property this.diplomacy[id]" error |
---|
comment:3 by , 9 years ago
Milestone: | Alpha 19 → Backlog |
---|
by , 9 years ago
Attachment: | t3154_commands.txt_replaylog_alternative.7z added |
---|
I experienced this error on some more matches. This one also has it on turn 1084.
comment:4 by , 9 years ago
Priority: | Nice to Have → Should Have |
---|
by , 9 years ago
Attachment: | t3154_commands.txt_replaylog_alternative2.7z added |
---|
This one also has the error on turn 1155 and #3239 on turn 5591.
by , 9 years ago
Attachment: | t3154_commands.txt_replaylog_alternative3.7z added |
---|
Same error, only on turn 4433.
comment:5 by , 9 years ago
Milestone: | Backlog → Alpha 19 |
---|---|
Priority: | Should Have → Must Have |
comment:6 by , 9 years ago
This bug happens frequently. Moved to alpha19, hoping that someone wise will find the ticket and fix it.
comment:7 by , 9 years ago
Component: | Core engine → UI & Simulation |
---|---|
Summary: | [Formations] Attack order causes "undefined property this.diplomacy[id]" error → Formations - Attack order fails by targeting the formation and not the individual unit |
The target that was supposed to be attacked is owned by INVALID_PLAYER. I've added debug output to show the template and owner of all targets to be attacked:
UnitAI.prototype.CanAttack = function(target, forceResponse) { ... // DEBUG START var cmpOwnership_target = Engine.QueryInterface(target, IID_Ownership); if (!cmpOwnership_target) return false; var target_owner = cmpOwnership_target.GetOwner(); var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); var template = cmpTemplateManager.GetCurrentTemplateName(target); error("TEMPLATE OF " + target + " IS " + template); error("OWNER OF " + target + " IS " + target_owner); // DEBUG END // Verify that the target is an attackable resource supply like a domestic animal // or that it isn't owned by an ally of this entity's player or is responding to // an attack. var owner = cmpOwnership.GetOwner(); if (!this.MustKillGatherTarget(target) && !(IsOwnedByEnemyOfPlayer(owner, target) || IsOwnedByNeutralOfPlayer(owner, target) || (forceResponse && !IsOwnedByPlayer(owner, target)))) return false; return true; };
which reveals that somehow the attack order targets the formation and not the individual unit.
Attack orders that don't cause issues have the following output:
ERROR: TEMPLATE OF 2896 IS units/maur_infantry_archer_b ERROR: OWNER OF 2896 IS 2
while that bugged attack order produces that output:
ERROR: TEMPLATE OF 2982 IS formations/line_closed ERROR: OWNER OF 2982 IS -1
This is a very critical bug, since enemy units won't be attacked.
comment:8 by , 9 years ago
Ah, that makes it a very trivial bug too. It's probably just a matter of setting the ownership when creating a formatio. So in http://trac.wildfiregames.com/browser/ps/trunk/binaries/data/mods/public/simulation/components/Formation.js#L1005
comment:9 by , 9 years ago
This bug can be reproduced in a18 and svn by doing the following steps:
- Start a game with 2 players, either singleplayer or networked.
- Select some units of the first player. Make them passive, so that they won't auto-attack. Disable formation for them and put them back to line-closed. Move to the middle of the map.
- Select the other player with the change-perspective tool. Repeat 2. for that player. Attack the other player.
That error doesn't appear in every case but often. It also works when you don't change the unit stance, but its easier to reproduce with passive units.
Sometimes the error doesn't appear, but the units don't attack while being in range and told to attack.
comment:11 by , 9 years ago
Formations are disabled right now but they are fairly easy to reenable, so I fixed this because it was trivial and mods based on A19 might want to use formations (especially Delenda Est and Ancient Empires).
commands.txt and replay-log