From 9c2e9d78933bec2601f9908e9506e561bed8df13 Mon Sep 17 00:00:00 2001 From: Angen Date: Mon, 27 Jan 2020 17:49:06 +0000 Subject: [PATCH] Enforce formation required member count Disband formation with less memebers than required. Do not allow one member in formation. Show only formations entities actually are allowed to form. (do not show wedge for infantry) Differential Revision: https://code.wildfiregames.com/D1462 Fixes: #5119 Comments by: elexis, bb, temple, Stan, Freagarach This was SVN commit r23450. --- .../public/gui/session/selection_panels.js | 15 ++++++--------- .../public/simulation/components/Formation.js | 18 +++++++++++------- .../simulation/components/GuiInterface.js | 4 +++- .../public/simulation/components/Identity.js | 5 +++++ .../components/tests/test_GuiInterface.js | 8 ++++++-- .../public/simulation/data/civs/athen.json | 2 +- .../mods/public/simulation/data/civs/cart.json | 2 +- .../mods/public/simulation/data/civs/kush.json | 2 +- .../mods/public/simulation/data/civs/mace.json | 2 +- .../mods/public/simulation/data/civs/pers.json | 2 +- .../mods/public/simulation/data/civs/ptol.json | 2 +- .../mods/public/simulation/data/civs/rome.json | 2 +- .../mods/public/simulation/data/civs/sele.json | 2 +- .../public/simulation/data/civs/spart.json | 2 +- .../templates/special/formations/null.xml | 1 + .../templates/special/formations/skirmish.xml | 2 +- .../templates/special/formations/syntagma.xml | 2 +- .../templates/special/formations/testudo.xml | 2 +- .../templates/special/formations/wedge.xml | 2 +- .../templates/template_formation.xml | 4 ++-- 20 files changed, 47 insertions(+), 34 deletions(-) diff --git a/binaries/data/mods/public/gui/session/selection_panels.js b/binaries/data/mods/public/gui/session/selection_panels.js index cad0944d93..a962c21c7b 100644 --- a/binaries/data/mods/public/gui/session/selection_panels.js +++ b/binaries/data/mods/public/gui/session/selection_panels.js @@ -292,24 +292,20 @@ g_SelectionPanels.Formation = { if (unitEntStates.some(state => !hasClass(state, "Unit"))) return []; + if (unitEntStates.every(state => !state.identity || !state.identity.hasSomeFormation)) + return []; + if (!g_AvailableFormations.has(unitEntStates[0].player)) g_AvailableFormations.set(unitEntStates[0].player, Engine.GuiInterfaceCall("GetAvailableFormations", unitEntStates[0].player)); - let availableFormations = g_AvailableFormations.get(unitEntStates[0].player); - - // Hide the panel if all formations are disabled - if (availableFormations.some(formation => canMoveSelectionIntoFormation(formation))) - return availableFormations; - - return []; + return g_AvailableFormations.get(unitEntStates[0].player).filter(formation => unitEntStates.some(state => !!state.identity && state.identity.formations.indexOf(formation) != -1)); }, "setupButton": function(data) { if (!g_FormationsInfo.has(data.item)) g_FormationsInfo.set(data.item, Engine.GuiInterfaceCall("GetFormationInfoFromTemplate", { "templateName": data.item })); - let formationInfo = g_FormationsInfo.get(data.item); - let formationOk = canMoveSelectionIntoFormation(data.item); + let formationOk = data.item == "special/formations/null" || canMoveSelectionIntoFormation(data.item); let unitIds = data.unitEntStates.map(state => state.id); let formationSelected = Engine.GuiInterfaceCall("IsFormationSelected", { "ents": unitIds, @@ -320,6 +316,7 @@ g_SelectionPanels.Formation = { performFormation(unitIds, data.item); }; + let formationInfo = g_FormationsInfo.get(data.item); let tooltip = translate(formationInfo.name); if (!formationOk && formationInfo.tooltip) tooltip += "\n" + coloredText(translate(formationInfo.tooltip), "red"); diff --git a/binaries/data/mods/public/simulation/components/Formation.js b/binaries/data/mods/public/simulation/components/Formation.js index fcdd80433e..95cd7cd69d 100644 --- a/binaries/data/mods/public/simulation/components/Formation.js +++ b/binaries/data/mods/public/simulation/components/Formation.js @@ -7,8 +7,12 @@ Formation.prototype.Schema = "" + "" + "" + - "" + - "" + + "" + + "" + + ""+ + "2"+ + ""+ + "" + "" + "" + "" + @@ -319,16 +323,16 @@ Formation.prototype.RemoveMembers = function(ents, renamed = false) this.members = this.members.filter(function(e) { return ents.indexOf(e) == -1; }); this.inPosition = this.inPosition.filter(function(e) { return ents.indexOf(e) == -1; }); - for (var ent of ents) + for (let ent of ents) { - var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); + let cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); cmpUnitAI.UpdateWorkOrders(); cmpUnitAI.SetFormationController(INVALID_ENTITY); } - for (var ent of this.formationMembersWithAura) + for (let ent of this.formationMembersWithAura) { - var cmpAuras = Engine.QueryInterface(ent, IID_Auras); + let cmpAuras = Engine.QueryInterface(ent, IID_Auras); cmpAuras.RemoveFormationAura(ents); // the unit with the aura is also removed from the formation @@ -340,7 +344,7 @@ Formation.prototype.RemoveMembers = function(ents, renamed = false) // If there's nobody left, destroy the formation // unless this is a rename where we can have 0 members temporarily. - if (this.members.length == 0 && !renamed) + if (this.members.length < +this.template.RequiredMemberCount && !renamed) { Engine.DestroyEntity(this.entity); return; diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js index fd3c51b9dc..bbebb97620 100644 --- a/binaries/data/mods/public/simulation/components/GuiInterface.js +++ b/binaries/data/mods/public/simulation/components/GuiInterface.js @@ -264,7 +264,9 @@ GuiInterface.prototype.GetEntityState = function(player, ent) "classes": cmpIdentity.GetClassesList(), "visibleClasses": cmpIdentity.GetVisibleClassesList(), "selectionGroupName": cmpIdentity.GetSelectionGroupName(), - "canDelete": !cmpIdentity.IsUndeletable() + "canDelete": !cmpIdentity.IsUndeletable(), + "hasSomeFormation": cmpIdentity.HasSomeFormation(), + "formations": cmpIdentity.GetFormationsList(), }; let cmpPosition = Engine.QueryInterface(ent, IID_Position); diff --git a/binaries/data/mods/public/simulation/components/Identity.js b/binaries/data/mods/public/simulation/components/Identity.js index 8e204595c0..0626e52321 100644 --- a/binaries/data/mods/public/simulation/components/Identity.js +++ b/binaries/data/mods/public/simulation/components/Identity.js @@ -104,6 +104,11 @@ Identity.prototype.Init = function() this.phenotype = "default"; }; +Identity.prototype.HasSomeFormation = function() +{ + return this.GetFormationsList().length > 0; +}; + Identity.prototype.GetCiv = function() { return this.template.Civ; diff --git a/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js b/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js index ec12da5641..c6e5c207c1 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js +++ b/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js @@ -544,7 +544,9 @@ AddMock(10, IID_Identity, { GetRank: function() { return "foo"; }, GetSelectionGroupName: function() { return "Selection Group Name"; }, HasClass: function() { return true; }, - IsUndeletable: function() { return false; } + IsUndeletable: function() { return false; }, + HasSomeFormation: function() { return false; }, + GetFormationsList: function() { return []; }, }); AddMock(10, IID_Position, { @@ -574,7 +576,9 @@ TS_ASSERT_UNEVAL_EQUALS(cmp.GetEntityState(-1, 10), { "classes": ["class1", "class2"], "visibleClasses": ["class3", "class4"], "selectionGroupName": "Selection Group Name", - "canDelete": true + "canDelete": true, + "hasSomeFormation": false, + "formations": [], }, "position": {x:1, y:2, z:3}, "hitpoints": 50, diff --git a/binaries/data/mods/public/simulation/data/civs/athen.json b/binaries/data/mods/public/simulation/data/civs/athen.json index 97afb03b49..ce16a83a48 100644 --- a/binaries/data/mods/public/simulation/data/civs/athen.json +++ b/binaries/data/mods/public/simulation/data/civs/athen.json @@ -145,9 +145,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/phalanx" ], "AINames": diff --git a/binaries/data/mods/public/simulation/data/civs/cart.json b/binaries/data/mods/public/simulation/data/civs/cart.json index daead2ca0d..4b6876c37d 100644 --- a/binaries/data/mods/public/simulation/data/civs/cart.json +++ b/binaries/data/mods/public/simulation/data/civs/cart.json @@ -149,9 +149,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/phalanx" ], "AINames": diff --git a/binaries/data/mods/public/simulation/data/civs/kush.json b/binaries/data/mods/public/simulation/data/civs/kush.json index 98317b6929..cfbcf3dd47 100644 --- a/binaries/data/mods/public/simulation/data/civs/kush.json +++ b/binaries/data/mods/public/simulation/data/civs/kush.json @@ -141,9 +141,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/syntagma" ], "AINames": diff --git a/binaries/data/mods/public/simulation/data/civs/mace.json b/binaries/data/mods/public/simulation/data/civs/mace.json index 2a811b03bd..0e434b81b5 100644 --- a/binaries/data/mods/public/simulation/data/civs/mace.json +++ b/binaries/data/mods/public/simulation/data/civs/mace.json @@ -141,9 +141,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/phalanx", "special/formations/syntagma" ], diff --git a/binaries/data/mods/public/simulation/data/civs/pers.json b/binaries/data/mods/public/simulation/data/civs/pers.json index ababe12634..42a1f787ff 100644 --- a/binaries/data/mods/public/simulation/data/civs/pers.json +++ b/binaries/data/mods/public/simulation/data/civs/pers.json @@ -141,9 +141,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/phalanx" ], "AINames": diff --git a/binaries/data/mods/public/simulation/data/civs/ptol.json b/binaries/data/mods/public/simulation/data/civs/ptol.json index dbf3457e31..1148447cad 100644 --- a/binaries/data/mods/public/simulation/data/civs/ptol.json +++ b/binaries/data/mods/public/simulation/data/civs/ptol.json @@ -150,9 +150,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/phalanx", "special/formations/syntagma" ], diff --git a/binaries/data/mods/public/simulation/data/civs/rome.json b/binaries/data/mods/public/simulation/data/civs/rome.json index f70552528b..844380c830 100644 --- a/binaries/data/mods/public/simulation/data/civs/rome.json +++ b/binaries/data/mods/public/simulation/data/civs/rome.json @@ -126,9 +126,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/testudo", "special/formations/anti_cavalry" ], diff --git a/binaries/data/mods/public/simulation/data/civs/sele.json b/binaries/data/mods/public/simulation/data/civs/sele.json index 2293732028..19879a40d3 100644 --- a/binaries/data/mods/public/simulation/data/civs/sele.json +++ b/binaries/data/mods/public/simulation/data/civs/sele.json @@ -149,9 +149,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/phalanx", "special/formations/syntagma" ], diff --git a/binaries/data/mods/public/simulation/data/civs/spart.json b/binaries/data/mods/public/simulation/data/civs/spart.json index b0bdc8d4cf..119249cedb 100644 --- a/binaries/data/mods/public/simulation/data/civs/spart.json +++ b/binaries/data/mods/public/simulation/data/civs/spart.json @@ -141,9 +141,9 @@ "special/formations/column_open", "special/formations/line_open", "special/formations/flank", + "special/formations/battle_line", "special/formations/skirmish", "special/formations/wedge", - "special/formations/battle_line", "special/formations/phalanx" ], "AINames": diff --git a/binaries/data/mods/public/simulation/templates/special/formations/null.xml b/binaries/data/mods/public/simulation/templates/special/formations/null.xml index 6c94dabfb9..0d13c1b96a 100644 --- a/binaries/data/mods/public/simulation/templates/special/formations/null.xml +++ b/binaries/data/mods/public/simulation/templates/special/formations/null.xml @@ -3,5 +3,6 @@ formations/null.png None + diff --git a/binaries/data/mods/public/simulation/templates/special/formations/skirmish.xml b/binaries/data/mods/public/simulation/templates/special/formations/skirmish.xml index e0c8cfcb1d..49f158b493 100644 --- a/binaries/data/mods/public/simulation/templates/special/formations/skirmish.xml +++ b/binaries/data/mods/public/simulation/templates/special/formations/skirmish.xml @@ -2,7 +2,7 @@ formations/skirmish.png - Requires a Ranged Soldier. + At least 2 units are required (only ranged). Skirmish true 2 diff --git a/binaries/data/mods/public/simulation/templates/special/formations/syntagma.xml b/binaries/data/mods/public/simulation/templates/special/formations/syntagma.xml index b06867e110..00a8189d39 100644 --- a/binaries/data/mods/public/simulation/templates/special/formations/syntagma.xml +++ b/binaries/data/mods/public/simulation/templates/special/formations/syntagma.xml @@ -3,7 +3,7 @@ formations/syntagma.png 16 - Requires at least 16 Infantry Pikemen. + At least 16 units are required (only pike infantry). Hero Champion Elite Advanced Basic Syntagma square diff --git a/binaries/data/mods/public/simulation/templates/special/formations/testudo.xml b/binaries/data/mods/public/simulation/templates/special/formations/testudo.xml index 1f4c23d9ff..ef7782807f 100644 --- a/binaries/data/mods/public/simulation/templates/special/formations/testudo.xml +++ b/binaries/data/mods/public/simulation/templates/special/formations/testudo.xml @@ -3,7 +3,7 @@ formations/testudo.png 16 - Requires at least 16 Melee Infantry. + At least 16 units are required (only melee infantry). Hero Champion Elite Advanced Basic Testudo square diff --git a/binaries/data/mods/public/simulation/templates/special/formations/wedge.xml b/binaries/data/mods/public/simulation/templates/special/formations/wedge.xml index 53014d4ce1..691c7df5a0 100644 --- a/binaries/data/mods/public/simulation/templates/special/formations/wedge.xml +++ b/binaries/data/mods/public/simulation/templates/special/formations/wedge.xml @@ -3,7 +3,7 @@ formations/wedge.png 6 - Requires at least 6 Cavalry. + At least 6 units are required (only cavalry). Wedge triangle true diff --git a/binaries/data/mods/public/simulation/templates/template_formation.xml b/binaries/data/mods/public/simulation/templates/template_formation.xml index 61ce02033d..76a41f7650 100644 --- a/binaries/data/mods/public/simulation/templates/template_formation.xml +++ b/binaries/data/mods/public/simulation/templates/template_formation.xml @@ -21,8 +21,8 @@ --> - 1 - + 2 + At least 2 units are required. 1 square Hero Champion Cavalry Melee Ranged