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