Index: ps/trunk/binaries/data/mods/public/gui/session/selection_panels.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/session/selection_panels.js +++ ps/trunk/binaries/data/mods/public/gui/session/selection_panels.js @@ -292,24 +292,20 @@ 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 @@ 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"); Index: ps/trunk/binaries/data/mods/public/simulation/components/Formation.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/Formation.js +++ ps/trunk/binaries/data/mods/public/simulation/components/Formation.js @@ -7,8 +7,12 @@ "" + "" + "" + - "" + - "" + + "" + + "" + + ""+ + "2"+ + ""+ + "" + "" + "" + "" + @@ -319,16 +323,16 @@ 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 @@ // 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; Index: ps/trunk/binaries/data/mods/public/simulation/components/GuiInterface.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/GuiInterface.js +++ ps/trunk/binaries/data/mods/public/simulation/components/GuiInterface.js @@ -264,7 +264,9 @@ "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); Index: ps/trunk/binaries/data/mods/public/simulation/components/Identity.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/Identity.js +++ ps/trunk/binaries/data/mods/public/simulation/components/Identity.js @@ -104,6 +104,11 @@ this.phenotype = "default"; }; +Identity.prototype.HasSomeFormation = function() +{ + return this.GetFormationsList().length > 0; +}; + Identity.prototype.GetCiv = function() { return this.template.Civ; Index: ps/trunk/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js +++ ps/trunk/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js @@ -544,7 +544,9 @@ 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 @@ "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, Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/athen.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/athen.json +++ ps/trunk/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": Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/cart.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/cart.json +++ ps/trunk/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": Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/kush.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/kush.json +++ ps/trunk/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": Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/mace.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/mace.json +++ ps/trunk/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" ], Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/pers.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/pers.json +++ ps/trunk/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": Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/ptol.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/ptol.json +++ ps/trunk/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" ], Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/rome.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/rome.json +++ ps/trunk/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" ], Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/sele.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/sele.json +++ ps/trunk/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" ], Index: ps/trunk/binaries/data/mods/public/simulation/data/civs/spart.json =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/data/civs/spart.json +++ ps/trunk/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": Index: ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/null.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/null.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/null.xml @@ -3,5 +3,6 @@ formations/null.png None + Index: ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/skirmish.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/skirmish.xml +++ ps/trunk/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 Index: ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/syntagma.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/syntagma.xml +++ ps/trunk/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 Index: ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/testudo.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/testudo.xml +++ ps/trunk/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 Index: ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/wedge.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/special/formations/wedge.xml +++ ps/trunk/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 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_formation.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_formation.xml +++ ps/trunk/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