1
0
forked from 0ad/0ad

Move FormationName and Icon from cmpFormation to cmpIdentity.

Reduces duplication across components.
Allows to provide specific names and history for formations.

Differential revision: https://code.wildfiregames.com/D4476
Comments by: @bb, @Stan
Fixes #6400

This was SVN commit r26476.
This commit is contained in:
Freagarach 2022-02-24 06:51:07 +00:00
parent 422fbbee7f
commit b778caf146
21 changed files with 71 additions and 52 deletions

View File

@ -508,8 +508,6 @@
"splitOnWhitespace": true
},
"Tooltip": {},
"DisabledTooltip": {},
"FormationName": {},
"FromClass": {},
"Shape": {},
"Rank": {
@ -553,8 +551,6 @@
"splitOnWhitespace": true
},
"Tooltip": {},
"DisabledTooltip": {},
"FormationName": {},
"FromClass": {},
"Rank": {
"tagAsContext": true
@ -597,7 +593,6 @@
},
"Tooltip": {},
"DisabledTooltip": {},
"FormationName": {},
"FromClass": {},
"Rank": {
"tagAsContext": true

View File

@ -1,12 +1,6 @@
function Formation() {}
Formation.prototype.Schema =
"<element name='FormationName' a:help='Name of the formation.'>" +
"<text/>" +
"</element>" +
"<element name='Icon'>" +
"<text/>" +
"</element>" +
"<element name='RequiredMemberCount' a:help='Minimum number of entities the formation should contain (at least 2).'>" +
"<data type='integer'>" +
"<param name='minInclusive'>"+
@ -714,7 +708,7 @@ Formation.prototype.ComputeFormationOffsets = function(active, positions)
}
// Define special formations here.
if (this.template.FormationName == "Scatter")
if (this.template.FormationShape == "special" && Engine.QueryInterface(this.entity, IID_Identity).GetGenericName() == "Scatter")
{
let width = Math.sqrt(count) * (separation.width + separation.depth) * 2.5;

View File

@ -856,9 +856,9 @@ GuiInterface.prototype.GetFormationInfoFromTemplate = function(player, data)
return {};
return {
"name": template.Formation.FormationName,
"name": template.Identity.GenericName,
"tooltip": template.Formation.DisabledTooltip || "",
"icon": template.Formation.Icon
"icon": template.Identity.Icon
};
};

View File

@ -217,7 +217,6 @@ function TestFormationExiting(mode)
});
let controllerFormation = ConstructComponent(controller, "Formation", {
"FormationName": "Line Closed",
"FormationShape": "square",
"ShiftRows": "false",
"SortingClasses": "",
@ -391,7 +390,6 @@ function TestMoveIntoFormationWhileAttacking()
});
let controllerFormation = ConstructComponent(controller, "Formation", {
"FormationName": "Line Closed",
"FormationShape": "square",
"ShiftRows": "false",
"SortingClasses": "",

View File

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/testudo.png</Icon>
<RequiredMemberCount>16</RequiredMemberCount>
<DisabledTooltip>Melee Infantry only, requires at least 16.</DisabledTooltip>
<FormationName>Anti Cavalry</FormationName>
<FormationShape>square</FormationShape>
<UnitSeparationWidthMultiplier>0.50</UnitSeparationWidthMultiplier>
<UnitSeparationDepthMultiplier>0.37</UnitSeparationDepthMultiplier>
@ -22,4 +20,8 @@
<FormationAttack>
<CanAttackAsFormation>false</CanAttackAsFormation>
</FormationAttack>
<Identity>
<Icon>formations/testudo.png</Icon>
<GenericName>Anti Cavalry</GenericName>
</Identity>
</Entity>

View File

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/battle_line.png</Icon>
<FormationName>Battle Line</FormationName>
<SortingClasses>Cavalry Melee Ranged</SortingClasses>
<SortingOrder>fillFromTheSides</SortingOrder>
<ShiftRows>true</ShiftRows>
@ -11,4 +9,8 @@
<MaxRows>4</MaxRows>
<WidthDepthRatio>2</WidthDepthRatio>
</Formation>
<Identity>
<GenericName>Battle Line</GenericName>
<Icon>formations/battle_line.png</Icon>
</Identity>
</Entity>

View File

@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/box.png</Icon>
<RequiredMemberCount>4</RequiredMemberCount>
<DisabledTooltip>Requires at least 4 Soldiers or Siege engines.</DisabledTooltip>
<FormationName>Box</FormationName>
<FormationShape>square</FormationShape>
<SortingClasses>Melee Ranged</SortingClasses>
<SortingOrder>fillToTheCenter</SortingOrder>
</Formation>
<Identity>
<GenericName>Box</GenericName>
<Icon>formations/box.png</Icon>
</Identity>
</Entity>

View File

@ -1,11 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/column_closed.png</Icon>
<FormationName>Forced March</FormationName>
<UnitSeparationWidthMultiplier>0.75</UnitSeparationWidthMultiplier>
<UnitSeparationDepthMultiplier>1.0</UnitSeparationDepthMultiplier>
<MinColumns>3</MinColumns>
<MaxColumns>3</MaxColumns>
</Formation>
<Identity>
<GenericName>Forced March</GenericName>
<Icon>formations/column_closed.png</Icon>
</Identity>
</Entity>

View File

@ -1,11 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/column_open.png</Icon>
<FormationName>Column Open</FormationName>
<ShiftRows>true</ShiftRows>
<UnitSeparationWidthMultiplier>2</UnitSeparationWidthMultiplier>
<MaxColumns>2</MaxColumns>
<MinColumns>2</MinColumns>
</Formation>
<Identity>
<GenericName>Column Open</GenericName>
<Icon>formations/column_open.png</Icon>
</Identity>
</Entity>

View File

@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/flank.png</Icon>
<RequiredMemberCount>8</RequiredMemberCount>
<DisabledTooltip>Requires at least 8 Soldiers or Siege engines.</DisabledTooltip>
<FormationName>Flank</FormationName>
<FormationShape>square</FormationShape>
<ShiftRows>true</ShiftRows>
<CenterGap>12</CenterGap>
</Formation>
<Identity>
<GenericName>Flank</GenericName>
<Icon>formations/flank.png</Icon>
</Identity>
</Entity>

View File

@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/line_closed.png</Icon>
<FormationName>Close Order</FormationName>
<MinColumns>3</MinColumns>
<WidthDepthRatio>4</WidthDepthRatio>
<Sloppiness>0.25</Sloppiness>
</Formation>
<Identity>
<GenericName>Close Order</GenericName>
<Icon>formations/line_closed.png</Icon>
</Identity>
</Entity>

View File

@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/line_open.png</Icon>
<FormationName>Open Order</FormationName>
<UnitSeparationWidthMultiplier>1.5</UnitSeparationWidthMultiplier>
<UnitSeparationDepthMultiplier>1.5</UnitSeparationDepthMultiplier>
<WidthDepthRatio>4</WidthDepthRatio>
<MinColumns>3</MinColumns>
<Sloppiness>0.5</Sloppiness>
</Formation>
<Identity>
<GenericName>Open Order</GenericName>
<Icon>formations/line_open.png</Icon>
</Identity>
</Entity>

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/null.png</Icon>
<FormationName>None</FormationName>
<DisabledTooltip/>
</Formation>
<Identity>
<GenericName>None</GenericName>
<Icon>formations/null.png</Icon>
</Identity>
</Entity>

View File

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/phalanx.png</Icon>
<RequiredMemberCount>10</RequiredMemberCount>
<DisabledTooltip>Infantry Hoplites only, requires at least 10.</DisabledTooltip>
<FormationName>Phalanx</FormationName>
<UnitSeparationWidthMultiplier>0.6</UnitSeparationWidthMultiplier>
<UnitSeparationDepthMultiplier>0.6</UnitSeparationDepthMultiplier>
<WidthDepthRatio>4</WidthDepthRatio>
@ -21,4 +19,8 @@
<FormationAttack>
<CanAttackAsFormation>false</CanAttackAsFormation>
</FormationAttack>
<Identity>
<GenericName>Phalanx</GenericName>
<Icon>formations/phalanx.png</Icon>
</Identity>
</Entity>

View File

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/scatter.png</Icon>
<FormationName>Scatter</FormationName>
<FormationShape>special</FormationShape>
</Formation>
<Identity>
<GenericName>Scatter</GenericName>
<Icon>formations/scatter.png</Icon>
</Identity>
</Entity>

View File

@ -1,9 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/skirmish.png</Icon>
<DisabledTooltip>Ranged Soldiers only, requires at least 2.</DisabledTooltip>
<FormationName>Skirmish</FormationName>
<ShiftRows>true</ShiftRows>
<UnitSeparationWidthMultiplier>2</UnitSeparationWidthMultiplier>
<MaxRows>2</MaxRows>
@ -12,4 +10,8 @@
<FormationAttack>
<CanAttackAsFormation>false</CanAttackAsFormation>
</FormationAttack>
<Identity>
<GenericName>Skirmish</GenericName>
<Icon>formations/skirmish.png</Icon>
</Identity>
</Entity>

View File

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/syntagma.png</Icon>
<RequiredMemberCount>16</RequiredMemberCount>
<DisabledTooltip>Infantry Pikemen only, requires at least 16.</DisabledTooltip>
<SortingClasses>Hero Champion Elite Advanced Basic</SortingClasses>
<FormationName>Syntagma</FormationName>
<FormationShape>square</FormationShape>
<UnitSeparationWidthMultiplier>0.86</UnitSeparationWidthMultiplier>
<UnitSeparationDepthMultiplier>0.55</UnitSeparationDepthMultiplier>
@ -27,4 +25,8 @@
<FormationAttack>
<CanAttackAsFormation>false</CanAttackAsFormation>
</FormationAttack>
<Identity>
<GenericName>Syntagma</GenericName>
<Icon>formations/syntagma.png</Icon>
</Identity>
</Entity>

View File

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/testudo.png</Icon>
<RequiredMemberCount>16</RequiredMemberCount>
<DisabledTooltip>Melee Infantry only, requires at least 16.</DisabledTooltip>
<SortingClasses>Hero Champion Elite Advanced Basic</SortingClasses>
<FormationName>Testudo</FormationName>
<FormationShape>square</FormationShape>
<UnitSeparationWidthMultiplier>0.5</UnitSeparationWidthMultiplier>
<UnitSeparationDepthMultiplier>0.4</UnitSeparationDepthMultiplier>
@ -67,4 +65,8 @@
<FormationAttack>
<CanAttackAsFormation>false</CanAttackAsFormation>
</FormationAttack>
<Identity>
<GenericName>Testudo</GenericName>
<Icon>formations/testudo.png</Icon>
</Identity>
</Entity>

View File

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity parent="template_formation">
<Formation>
<Icon>formations/wedge.png</Icon>
<RequiredMemberCount>6</RequiredMemberCount>
<DisabledTooltip>Cavalry only, requires at least 6.</DisabledTooltip>
<FormationName>Wedge</FormationName>
<FormationShape>triangle</FormationShape>
<ShiftRows>true</ShiftRows>
<Sloppiness>0.25</Sloppiness>
@ -14,4 +12,8 @@
<FormationAttack>
<CanAttackAsFormation>false</CanAttackAsFormation>
</FormationAttack>
<Identity>
<GenericName>Wedge</GenericName>
<Icon>formations/wedge.png</Icon>
</Identity>
</Entity>

View File

@ -1,11 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity>
<!--
<Identity>
<Civ>gaia</Civ>
<GenericName>Formation</GenericName>
<Undeletable>true</Undeletable>
</Identity>
<Selectable>
<Overlay>
<Texture>
@ -31,6 +26,10 @@
<FormationAttack>
<CanAttackAsFormation>false</CanAttackAsFormation>
</FormationAttack>
<Identity>
<Civ/> <!-- Unused -->
<Undeletable>true</Undeletable>
</Identity>
<Obstruction>
<Unit/>
<Active>true</Active>

View File

@ -245,7 +245,10 @@ class CheckRefs:
if entity.find('Identity') is not None:
icon = entity.find('Identity').find('Icon')
if icon is not None and icon.text:
self.deps.append((str(fp), f'art/textures/ui/session/portraits/{icon.text}'))
if entity.find('Formation') is not None:
self.deps.append((str(fp), f'art/textures/ui/session/icons/{icon.text}'))
else:
self.deps.append((str(fp), f'art/textures/ui/session/portraits/{icon.text}'))
if entity.find('Heal') is not None and entity.find('Heal').find('RangeOverlay') is not None:
range_overlay = entity.find('Heal').find('RangeOverlay')
for tag in ('LineTexture', 'LineTextureMask'):