Ticket #697: units_promotion_2011_04_24.diff

File units_promotion_2011_04_24.diff, 61.1 KB (added by fcxSanya, 13 years ago)
  • binaries/data/mods/public/gui/session/selection.js

     
    193193// Update the selection to take care of changes (like units that have been killed)
    194194EntitySelection.prototype.update = function()
    195195{
     196    this.checkRenamedEntities();
    196197    for each (var ent in this.selected)
    197198    {
    198199        var entState = GetEntityState(ent);
     
    221222    }
    222223};
    223224
     225/**
     226 * Update selection if some selected entities was renamed
     227 * (in case of unit promotion or finishing building structure)
     228 */
     229EntitySelection.prototype.checkRenamedEntities = function()
     230{
     231    var renamedEntities = Engine.GuiInterfaceCall("GetRenamedEntities", true);
     232    if (renamedEntities.length > 0)
     233    {
     234        var removeFromSelectionList = [];
     235        var addToSelectionList = [];
     236        for each (var renamedEntity in renamedEntities)
     237        {
     238            if (this.selected[renamedEntity.entity])
     239            {
     240                removeFromSelectionList.push(renamedEntity.entity);
     241                addToSelectionList.push(renamedEntity.newentity);
     242            }
     243        }
     244        this.removeList(removeFromSelectionList);
     245        this.addList(addToSelectionList);
     246    }
     247}
     248
    224249EntitySelection.prototype.addList = function(ents)
    225250{
    226251    var selectionSize = this.toList().length;
  • binaries/data/mods/public/gui/session/session.xml

     
    522522                        <object type="image" sprite="resourceForeground" ghost="true" name="resourceBar"/>
    523523                        <object type="image" sprite="statsBarShader" ghost="true"/>
    524524                    </object>
     525                   
     526                    <!-- Experience bar -->
     527                    <object size="46 0 58 100%" type="image" name="experience" tooltip="XP" tooltip_style="snToolTip">
     528                        <object type="image" sprite="experienceBackground" ghost="true"/>
     529                        <object type="image" sprite="experienceForeground" ghost="true" name="experienceBar"/>
     530                        <object type="image" sprite="statsBarShader" ghost="true"/>
     531                    </object>
    525532                </object>
    526533               
    527534                <!-- Specific Name -->
  • binaries/data/mods/public/gui/session/selection_details.js

     
    6565    {
    6666        getGUIObjectByName("health").hidden = true;
    6767    }
     68   
     69    // Experience
     70    if (entState.promotion)
     71    {
     72        var experienceBar = getGUIObjectByName("experienceBar");
     73        var experienceSize = experienceBar.size;
     74        experienceSize.rtop = 100 - 100 * Math.max(0, Math.min(1, 1.0 * entState.promotion.curr / entState.promotion.req));
     75        experienceBar.size = experienceSize;
     76 
     77        var experience = "[font=\"serif-bold-13\"]XP [/font]" + entState.promotion.curr;
     78        if (entState.promotion.curr < entState.promotion.req) experience += "/" + entState.promotion.req;
     79        getGUIObjectByName("experience").tooltip = experience;
     80        getGUIObjectByName("experience").hidden = false;
     81    }
     82    else
     83    {
     84        getGUIObjectByName("experience").hidden = true;
     85    }
    6886
    6987    // Resource stats
    7088    var resources = "";
  • binaries/data/mods/public/gui/session/sprites.xml

     
    714714    <sprite name="staminaForeground">
    715715        <image backcolor="blue"/>
    716716    </sprite>
     717   
     718    <sprite name="experienceBackground">
     719        <image backcolor="darkgray"/>
     720    </sprite>
    717721
     722    <sprite name="experienceForeground">
     723        <image backcolor="white"/>
     724    </sprite>
     725
    718726    <!-- ================================  ================================ -->
    719727    <!-- Chat -->
    720728    <!-- ================================  ================================ -->
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    2020    this.placementEntity = undefined; // = undefined or [templateName, entityID]
    2121    this.rallyPoints = undefined;
    2222    this.notifications = [];
     23    this.renamedEntities = [];
    2324};
    2425
    2526/*
     
    9192    return ret;
    9293};
    9394
     95GuiInterface.prototype.GetRenamedEntities = function(player, clearList)
     96{
     97    var result = this.renamedEntities.slice();
     98    if (clearList) this.renamedEntities = [];
     99    return result; 
     100};
     101
    94102GuiInterface.prototype.GetEntityState = function(player, ent)
    95103{
    96104    var cmpTempMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
     
    210218        };
    211219    }
    212220   
     221    var cmpPromotion = Engine.QueryInterface(ent, IID_Promotion);
     222    if (cmpPromotion)
     223    {
     224        ret.promotion = {
     225            "curr": cmpPromotion.GetCurrentXp(),
     226            "req": cmpPromotion.GetRequiredXp()
     227        };
     228    }
     229   
    213230    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    214231    ret.visibility = cmpRangeManager.GetLosVisibility(ent, player);
    215232
     
    501518    cmpRangeManager.SetDebugOverlay(enabled);
    502519};
    503520
     521GuiInterface.prototype.OnGlobalEntityRenamed = function(msg)
     522{
     523    this.renamedEntities.push(msg);
     524}
     525
    504526// List the GuiInterface functions that can be safely called by GUI scripts.
    505527// (GUI scripts are non-deterministic and untrusted, so these functions must be
    506528// appropriately careful. They are called with a first argument "player", which is
     
    510532   
    511533    "GetSimulationState": 1,
    512534    "GetExtendedSimulationState": 1,
     535    "GetRenamedEntities": 1,
    513536    "GetEntityState": 1,
    514537    "GetTemplateData": 1,
    515538    "GetNextNotification": 1,
  • binaries/data/mods/public/simulation/components/Foundation.js

     
    196196        Engine.PostMessage(this.entity, MT_ConstructionFinished,
    197197            { "entity": this.entity, "newentity": building });
    198198
     199        Engine.BroadcastMessage(MT_EntityRenamed, { entity: this.entity, newentity: building });
     200           
    199201        Engine.DestroyEntity(this.entity);
    200202    }
    201203};
  • binaries/data/mods/public/simulation/components/ResourceGatherer.js

     
    8686};
    8787
    8888/**
     89 * Used to instantly give resources to unit
     90 * @param resources The same structure as returned form GetCarryingStatus
     91 */
     92ResourceGatherer.prototype.GiveResources = function(resources)
     93{
     94    for each (var resource in resources)
     95    {
     96        this.carrying[resource.type] = +(resource.amount);
     97    }   
     98};
     99
     100/**
    89101 * Returns the generic type of one particular resource this unit is
    90102 * currently carrying, or undefined if none.
    91103 */
  • binaries/data/mods/public/simulation/components/Loot.js

     
    1717        "<element name='metal'><data type='nonNegativeInteger'/></element>" +
    1818    "</optional>";
    1919
    20 /*
    21  * TODO: this all needs to be designed and implemented
    22  */
    23 
    2420Loot.prototype.Serialize = null; // we have no dynamic state to save
    2521
     22Loot.prototype.GetXp = function()
     23{
     24    return this.template.xp;
     25};
     26 
     27Loot.prototype.GetResources = function()
     28{
     29    return {
     30        "food": +(this.template.food || 0),
     31        "wood": +(this.template.wood || 0),
     32        "metal": +(this.template.metal || 0),   
     33        "stone": +(this.template.stone || 0)
     34    };
     35};
     36
    2637Engine.RegisterComponentType(IID_Loot, "Loot", Loot);
  • binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js

     
    55Engine.LoadComponentScript("interfaces/GarrisonHolder.js");
    66Engine.LoadComponentScript("interfaces/Health.js");
    77Engine.LoadComponentScript("interfaces/Identity.js");
     8Engine.LoadComponentScript("interfaces/Promotion.js");
    89Engine.LoadComponentScript("interfaces/RallyPoint.js");
    910Engine.LoadComponentScript("interfaces/ResourceDropsite.js");
    1011Engine.LoadComponentScript("interfaces/ResourceGatherer.js");
  • binaries/data/mods/public/simulation/components/Identity.js

     
    115115
    116116Identity.prototype.GetRank = function()
    117117{
    118     if (this.template.Rank)
    119         return this.template.Rank;
    120     return "";
     118    return (this.template.Rank || "");
    121119};
    122120
    123121Identity.prototype.GetClassesList = function()
  • binaries/data/mods/public/simulation/components/UnitAI.js

     
    110110        // ignore
    111111    },
    112112
     113    "EntityRenamed": function(msg) {
     114        // ignore
     115    },
     116
    113117    // Formation handlers:
    114118
    115119    "FormationLeave": function(msg) {
     
    305309            this.SetNextState("INDIVIDUAL.GARRISON.GARRISONED");
    306310        }
    307311    },
     312   
     313    "Order.Cheering": function(msg) {
     314        this.SetNextState("INDIVIDUAL.CHEERING");
     315    },
    308316
    309317    // States for the special entity representing a group of units moving in formation:
    310318    "FORMATIONCONTROLLER": {
     
    412420                error("Animal got moved into INDIVIDUAL.* state");
    413421        },
    414422
    415         "Attacked": function(msg) {
     423        "Attacked": function(msg) {     
    416424            if (this.GetStance().targetAttackers)
    417425            {
    418426                this.RespondToTargetedEntities([msg.data.attacker]);
     
    533541        },
    534542
    535543        "COMBAT": {
     544            "EntityRenamed": function(msg) {
     545                if (this.order.data.target == msg.entity)
     546                    this.order.data.target = msg.newentity;
     547            },
     548
    536549            "Attacked": function(msg) {
    537550                // If we're already in combat mode, ignore anyone else
    538551                // who's attacking us
     
    980993            },
    981994        },
    982995
     996        "CHEERING": {
     997            "enter": function() {
     998                // Unit is invulnerable while cheering
     999                var cmpDamageReceiver = Engine.QueryInterface(this.entity, IID_DamageReceiver);
     1000                cmpDamageReceiver.SetInvulnerability(true);
     1001                this.SelectAnimation("promotion");
     1002                this.StartTimer(4000, 4000);
     1003                return false;
     1004            },
     1005           
     1006            "leave": function() {   
     1007                this.StopTimer();
     1008                var cmpDamageReceiver = Engine.QueryInterface(this.entity, IID_DamageReceiver);
     1009                cmpDamageReceiver.SetInvulnerability(false);
     1010            },
     1011           
     1012            "Timer": function(msg) {
     1013                this.FinishOrder();
     1014            },
     1015        },
    9831016    },
    9841017
    9851018    "ANIMAL": {
     
    13221355UnitAI.prototype.PushOrderFront = function(type, data)
    13231356{
    13241357    var order = { "type": type, "data": data };
    1325     this.orderQueue.unshift(order);
    1326 
    1327     this.order = order;
    1328     UnitFsm.ProcessMessage(this, {"type": "Order."+this.order.type, "data": this.order.data});
     1358    // If current order is cheering then add new order after it
     1359    if (this.order && this.order.type == "Cheering")
     1360    {
     1361        var cheeringOrder = this.orderQueue.shift();
     1362        this.orderQueue.unshift(cheeringOrder, order); 
     1363    }
     1364    else
     1365    {
     1366        this.orderQueue.unshift(order);
     1367        this.order = order;
     1368        UnitFsm.ProcessMessage(this, {"type": "Order."+this.order.type, "data": this.order.data});
     1369    }
    13291370};
    13301371
    13311372UnitAI.prototype.ReplaceOrder = function(type, data)
    13321373{
    1333     this.orderQueue = [];
    1334     this.PushOrder(type, data);
     1374    // If current order is cheering then add new order after it
     1375    if (this.order && this.order.type == "Cheering")
     1376    {
     1377        var order = { "type": type, "data": data };
     1378        var cheeringOrder = this.orderQueue.shift();
     1379        this.orderQueue = [ cheeringOrder, order ];
     1380    }
     1381    else
     1382    {
     1383        this.orderQueue = [];
     1384        this.PushOrder(type, data);
     1385    }
    13351386};
    13361387
     1388UnitAI.prototype.GetOrders = function()
     1389{
     1390    return this.orderQueue.slice();
     1391}
     1392
     1393UnitAI.prototype.AddOrders = function(orders)
     1394{
     1395    for each (var order in orders)
     1396    {
     1397        this.PushOrder(order.type, order.data);
     1398    }
     1399}
     1400
    13371401UnitAI.prototype.TimerHandler = function(data, lateness)
    13381402{
    13391403    // Reset the timer
     
    14011465    UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg});
    14021466};
    14031467
     1468UnitAI.prototype.OnGlobalEntityRenamed = function(msg)
     1469{
     1470    UnitFsm.ProcessMessage(this, {"type": "EntityRenamed", "entity": msg.entity, "newentity": msg.newentity}); 
     1471}
     1472
    14041473UnitAI.prototype.OnAttacked = function(msg)
    14051474{
    14061475    UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg});
     
    19071976    this.AddOrder("Repair", { "target": target, "autocontinue": autocontinue }, queued);
    19081977};
    19091978
     1979UnitAI.prototype.Cheer = function()
     1980{
     1981    this.AddOrder("Cheering", null, false);
     1982};
     1983
    19101984UnitAI.prototype.SetStance = function(stance)
    19111985{
    19121986    if (g_Stances[stance])
  • binaries/data/mods/public/simulation/components/Looter.js

     
    33Looter.prototype.Schema =
    44    "<empty/>";
    55   
    6 /*
    7  * TODO: this all needs to be designed and implemented
     6/**
     7 * Try to collect loot from target entity
    88 */
    9  
     9Looter.prototype.Collect = function(targetEntity)
     10{
     11    var cmpLoot = Engine.QueryInterface(targetEntity, IID_Loot);
     12    if (!cmpLoot) return;
     13   
     14    var xp = cmpLoot.GetXp();
     15    if (xp > 0)
     16    {
     17        var cmpPromotion = Engine.QueryInterface(this.entity, IID_Promotion);
     18        if (cmpPromotion) cmpPromotion.IncreaseXp(xp);
     19    }
     20    var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
     21    cmpPlayer.AddResources(cmpLoot.GetResources());
     22}
     23
    1024Engine.RegisterComponentType(IID_Looter, "Looter", Looter);
    1125
  • binaries/data/mods/public/simulation/components/Armour.js

     
    1919
    2020Armour.prototype.Init = function()
    2121{
     22    this.invulnerable = false;
    2223};
    2324
    2425Armour.prototype.Serialize = null; // we have no dynamic state to save
    2526
     27Armour.prototype.SetInvulnerability = function(invulnerability)
     28{
     29    this.invulnerable = invulnerability;
     30};
     31
    2632Armour.prototype.TakeDamage = function(hack, pierce, crush)
    2733{
     34    if (this.invulnerable) return { "killed": false };
    2835    // Adjust damage values based on armour
    2936    var adjHack = Math.max(0, hack - this.template.Hack);
    3037    var adjPierce = Math.max(0, pierce - this.template.Pierce);
  • binaries/data/mods/public/simulation/components/Attack.js

     
    211211
    212212/**
    213213 * Called when some units kills something (another unit, building, animal etc)
    214  * update player statistics only for now
    215214 */
    216215Attack.prototype.TargetKilled = function(killerEntity, targetEntity)
    217216{
     
    219218    if (cmpKillerPlayerStatisticsTracker) cmpKillerPlayerStatisticsTracker.KilledEntity(targetEntity);
    220219    var cmpTargetPlayerStatisticsTracker = QueryOwnerInterface(targetEntity, IID_StatisticsTracker);
    221220    if (cmpTargetPlayerStatisticsTracker) cmpTargetPlayerStatisticsTracker.LostEntity(targetEntity);
     221
     222    // if unit can collect loot, lets try to collect it
     223    var cmpLooter = Engine.QueryInterface(killerEntity, IID_Looter);
     224    if (cmpLooter)
     225    {
     226        cmpLooter.Collect(targetEntity);
     227    }
    222228}
    223229
    224230/**
  • binaries/data/mods/public/simulation/components/Promotion.js

     
    44    "<element name='Entity'>" +
    55        "<text/>" +
    66    "</element>" +
    7     "<element name='Req'>" +
     7    "<element name='RequiredXp'>" +
    88        "<data type='positiveInteger'/>" +
    99    "</element>";
    1010
    11 /*
    12  * TODO: this all needs to be designed and implemented
    13  */
     11Promotion.prototype.Init = function()
     12{
     13    this.currentXp = 0;
     14}
     15   
     16Promotion.prototype.GetRequiredXp = function()
     17{
     18    return +(this.template.RequiredXp);
     19};
    1420
     21Promotion.prototype.GetCurrentXp = function()
     22{
     23    return +(this.currentXp || 0);
     24};
     25
     26Promotion.prototype.GetPromotedTemplateName = function()
     27{
     28    return this.template.Entity;
     29}
     30
     31Promotion.prototype.Promote = function(promotedTemplateName)
     32{
     33    // Create promoted unit entity
     34    var promotedUnitEntity = Engine.AddEntity(promotedTemplateName);
     35       
     36    // Copy parameters from current entity to promoted one
     37    var cmpCurrentUnitPosition = Engine.QueryInterface(this.entity, IID_Position);
     38    var cmpPromotedUnitPosition = Engine.QueryInterface(promotedUnitEntity, IID_Position);
     39    if (cmpCurrentUnitPosition.IsInWorld())
     40    {   
     41        var pos = cmpCurrentUnitPosition.GetPosition2D();
     42        cmpPromotedUnitPosition.JumpTo(pos.x, pos.y);
     43    }
     44    var rot = cmpCurrentUnitPosition.GetRotation();
     45    cmpPromotedUnitPosition.SetYRotation(rot.y);
     46    cmpPromotedUnitPosition.SetXZRotation(rot.x, rot.z);
     47    var heightOffset = cmpCurrentUnitPosition.GetHeightOffset();
     48    cmpPromotedUnitPosition.SetHeightOffset(heightOffset);
     49   
     50    var cmpCurrentUnitOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
     51    var cmpPromotedUnitOwnership = Engine.QueryInterface(promotedUnitEntity, IID_Ownership);
     52    cmpPromotedUnitOwnership.SetOwner(cmpCurrentUnitOwnership.GetOwner());
     53
     54    var cmpPromotedUnitPromotion = Engine.QueryInterface(promotedUnitEntity, IID_Promotion);
     55    if (cmpPromotedUnitPromotion)
     56        cmpPromotedUnitPromotion.IncreaseXp(this.currentXp);
     57       
     58    var cmpCurrentUnitResourceGatherer = Engine.QueryInterface(this.entity, IID_ResourceGatherer);
     59    var cmpPromotedUnitResourceGatherer = Engine.QueryInterface(promotedUnitEntity, IID_ResourceGatherer);
     60    if (cmpCurrentUnitResourceGatherer && cmpPromotedUnitResourceGatherer)
     61    {
     62        var carriedResorces = cmpCurrentUnitResourceGatherer.GetCarryingStatus();
     63        cmpPromotedUnitResourceGatherer.GiveResources(carriedResorces);
     64    }
     65   
     66    var cmpCurrentUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
     67    var cmpPromotedUnitAI = Engine.QueryInterface(promotedUnitEntity, IID_UnitAI);
     68    cmpPromotedUnitAI.Cheer();
     69    var orders = cmpCurrentUnitAI.GetOrders();
     70    cmpPromotedUnitAI.AddOrders(orders);
     71   
     72    Engine.BroadcastMessage(MT_EntityRenamed, { entity: this.entity, newentity: promotedUnitEntity });
     73   
     74    // Destroy current entity
     75    Engine.DestroyEntity(this.entity);
     76}
     77
     78Promotion.prototype.IncreaseXp = function(amount)
     79{
     80    this.currentXp += +(amount);
     81
     82    if (this.currentXp >= this.template.RequiredXp)
     83    {
     84        var promotionTemplate = this.template; 
     85        do
     86        {
     87            this.currentXp -= promotionTemplate.RequiredXp;
     88            var promotedTemplateName = promotionTemplate.Entity;
     89            var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
     90            var template = cmpTemplateManager.GetTemplate(promotedTemplateName);
     91            promotionTemplate = template.Promotion || null;
     92        }
     93        while (promotionTemplate != null && this.currentXp >= promotionTemplate.RequiredXp);
     94        this.Promote(promotedTemplateName);
     95    }
     96}
     97
    1598Engine.RegisterComponentType(IID_Promotion, "Promotion", Promotion);
  • binaries/data/mods/public/simulation/components/Formation.js

     
    286286        this.RemoveMembers([msg.entity]);
    287287};
    288288
     289Formation.prototype.OnGlobalEntityRenamed = function(msg)
     290{
     291    if (this.members[msg.entity])
     292    {
     293        this.members.splice(this.members.indexOf(msg.entity), 1);   
     294        this.members.push(msg.newentity);   
     295
     296        var cmpOldUnitAI = Engine.QueryInterface(msg.entity, IID_UnitAI);
     297        cmpOldUnitAI.SetFormationController(INVALID_ENTITY);
     298
     299        var cmpNewUnitAI = Engine.QueryInterface(msg.newentity, IID_UnitAI);
     300        cmpNewUnitAI.SetFormationController(this.entity);
     301    }
     302}
     303
    289304Engine.RegisterComponentType(IID_Formation, "Formation", Formation);
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_javelinist_b.xml

     
    88    <Icon>units/hele_infantry_javelinist.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>hele_infantry_javelinist_a</Entity>
     11    <Entity>units/hele_infantry_javelinist_a</Entity>
    1212  </Promotion>
    1313  <Cost>
    1414    <Resources>
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_javelinist_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/hele_infantry_javelinist_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    2219  <VisualActor>
    2320    <Actor>units/hellenes/infantry_javelinist_e.xml</Actor>
    2421  </VisualActor>
     22  <Promotion disable=""/>
    2523</Entity>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_javelinist_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>celt_cavalry_javelinist_e</Entity>
     7    <Entity>units/celt_cavalry_javelinist_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_javelinist_b.xml

     
    88    <Icon>units/celt_cavalry_javelinist.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>celt_cavalry_javelinist_a</Entity>
     11    <Entity>units/celt_cavalry_javelinist_a</Entity>
    1212  </Promotion>
    1313  <Armour>
    1414    <Hack>2.0</Hack>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_javelinist_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/celt_cavalry_javelinist_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    2926  <VisualActor>
    3027    <Actor>units/celts/cavalry_javelinist_e.xml</Actor>
    3128  </VisualActor>
     29  <Promotion disable=""/>
    3230</Entity>
  • binaries/data/mods/public/simulation/templates/units/rome_legionnaire_marian.xml

     
    99    <Icon>units/rome_super_legion_marian.png</Icon>
    1010  </Identity>
    1111  <Promotion>
    12     <Entity>rome_legionnaire_imperial</Entity>
    13     <Req>500</Req>
     12    <Entity>units/rome_legionnaire_imperial</Entity>
     13    <RequiredXp>500</RequiredXp>
    1414  </Promotion>
    1515  <VisualActor>
    1616    <Actor>units/romans/super_unit_3.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_spearman_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>hele_infantry_spearman_e</Entity>
     7    <Entity>units/hele_infantry_spearman_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_spearman_b.xml

     
    88    <Icon>units/hele_infantry_spearman.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>hele_infantry_spearman_a</Entity>
     11    <Entity>units/hele_infantry_spearman_a</Entity>
    1212  </Promotion>
    1313  <Cost>
    1414    <Resources>
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_spearman_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/hele_infantry_spearman_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    3330  <VisualActor>
    3431    <Actor>units/hellenes/infantry_spearman_e.xml</Actor>
    3532  </VisualActor>
    36  
     33  <Promotion disable=""/>
    3734</Entity>
  • binaries/data/mods/public/simulation/templates/units/hele_cavalry_javelinist_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>hele_cavalry_javelinist_e</Entity>
     7    <Entity>units/hele_cavalry_javelinist_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/hele_cavalry_javelinist_b.xml

     
    88    <Icon>units/hele_cavalry_javelinist.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>hele_cavalry_javelinist_a</Entity>
     11    <Entity>units/hele_cavalry_javelinist_a</Entity>
    1212  </Promotion>
    1313  <Vision>
    1414    <Range>110</Range>
  • binaries/data/mods/public/simulation/templates/units/celt_infantry_javelinist_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>celt_infantry_javelinist_e</Entity>
     7    <Entity>units/celt_infantry_javelinist_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/celt_infantry_javelinist_b.xml

     
    88    <Icon>units/celt_infantry_javelinist.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>celt_infantry_javelinist_a</Entity>
     11    <Entity>units/celt_infantry_javelinist_a</Entity>
    1212  </Promotion>
    1313  <Armour>
    1414    <Hack>2.0</Hack>
  • binaries/data/mods/public/simulation/templates/units/hele_cavalry_javelinist_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/hele_cavalry_javelinist_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    2926  <VisualActor>
    3027    <Actor>units/hellenes/cavalry_javelinist_e.xml</Actor>
    3128  </VisualActor>
    32 
     29  <Promotion disable=""/>
    3330</Entity>
  • binaries/data/mods/public/simulation/templates/units/celt_infantry_javelinist_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/celt_infantry_javelinist_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    2926  <VisualActor>
    3027    <Actor>units/celts/infantry_javelinist_e.xml</Actor>
    3128  </VisualActor>
     29  <Promotion disable=""/>
    3230</Entity>
  • binaries/data/mods/public/simulation/templates/units/mace_hypaspist.xml

     
    88    <Icon>units/macedonian_hypaspist.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>mace_argyraspis</Entity>
    12     <Req>500</Req>
     11    <Entity>units/mace_argyraspis</Entity>
     12    <RequiredXp>500</RequiredXp>
    1313  </Promotion>
    1414  <Cost>
    1515    <Resources>
  • binaries/data/mods/public/simulation/templates/units/iber_infantry_javelinist_a.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/iber_infantry_javelinist_b">
    33  <Promotion>
    4     <Entity>iber_infantry_javelinist_e</Entity>
     4    <Entity>units/iber_infantry_javelinist_e</Entity>
    55  </Promotion>
    66  <VisualActor>
    77    <Actor>units/iberians/infantry_javelinist_a.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/iber_infantry_javelinist_b.xml

     
    77    <Icon>units/cart_cavalry_javelinist.png</Icon>
    88  </Identity>
    99  <Promotion>
    10     <Entity>iber_infantry_javelinist_a</Entity>
     10    <Entity>units/iber_infantry_javelinist_a</Entity>
    1111  </Promotion>
    1212  <VisualActor>
    1313    <Actor>units/iberians/infantry_javelinist_b.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/celt_infantry_spearman_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>celt_infantry_spearman_e</Entity>
     7    <Entity>units/celt_infantry_spearman_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/celt_infantry_spearman_b.xml

     
    88    <Icon>units/celt_infantry_spearman.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>celt_infantry_spearman_a</Entity>
     11    <Entity>units/celt_infantry_spearman_a</Entity>
    1212  </Promotion>
    1313  <Armour>
    1414    <Hack>3.0</Hack>
  • binaries/data/mods/public/simulation/templates/units/iber_infantry_swordsman_a.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/iber_infantry_swordsman_b">
    33  <Promotion>
    4     <Entity>iber_infantry_swordsman_e</Entity>
     4    <Entity>units/iber_infantry_swordsman_e</Entity>
    55  </Promotion>
    66  <VisualActor>
    77    <Actor>units/iberians/infantry_swordsman_a.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/iber_cavalry_spearman_a.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/iber_cavalry_spearman_b">
    33  <Promotion>
    4     <Entity>iber_cavalry_spearman_e</Entity>
     4    <Entity>units/iber_cavalry_spearman_e</Entity>
    55  </Promotion>
    66  <VisualActor>
    77    <Actor>units/iberians/cavalry_spearman_a.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/iber_infantry_swordsman_b.xml

     
    77    <History>The Iberians were master sword-smiths and the falcata was their greatest creation. Wielded by superb swordsmen equipped with light armor and a buckler known as a caetra, they caused untold carnage. Thanks to this Iberian infantry were fast and agile unlike many of their opponents and could bite hard when they attacked. Their skill with sword and buckler were legendary, allowing them to go toe-to-toe with heavy infantry.</History>
    88  </Identity>
    99  <Promotion>
    10     <Entity>iber_infantry_swordsman_a</Entity>
     10    <Entity>units/iber_infantry_swordsman_a</Entity>
    1111  </Promotion>
    1212  <VisualActor>
    1313    <Actor>units/iberians/infantry_swordsman_b.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/iber_cavalry_spearman_b.xml

     
    77    <History>Armed like the light infantry, Iberian cavalry were often pursued as mercenaries, especially by the Carthaginians. Mounted on excellent horses and wielding high-grade swords they were capable of taking on heavy or light cavalry. As with all Iberians armor was scarce, but they wore the ubiquitous sinew caps made famous by the peoples of the peninsula.</History>
    88  </Identity>
    99  <Promotion>
    10     <Entity>iber_cavalry_spearman_a</Entity>
     10    <Entity>units/iber_cavalry_spearman_a</Entity>
    1111  </Promotion>
    1212  <VisualActor>
    1313    <Actor>units/iberians/cavalry_spearman_b.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/hele_cavalry_swordsman_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>hele_cavalry_swordsman_e</Entity>
     7    <Entity>units/hele_cavalry_swordsman_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/celt_infantry_spearman_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/celt_infantry_spearman_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    3330  <VisualActor>
    3431    <Actor>units/celts/infantry_spearman_e.xml</Actor>
    3532  </VisualActor>
     33  <Promotion disable=""/>
    3634</Entity>
  • binaries/data/mods/public/simulation/templates/units/hele_cavalry_swordsman_b.xml

     
    88    <Icon>units/hele_cavalry_swordsman.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>hele_cavalry_swordsman_a</Entity>
     11    <Entity>units/hele_cavalry_swordsman_a</Entity>
    1212  </Promotion>
    1313  <Vision>
    1414    <Range>110</Range>
  • binaries/data/mods/public/simulation/templates/units/hele_cavalry_swordsman_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/hele_cavalry_swordsman_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    3128  <VisualActor>
    3229    <Actor>units/hellenes/cavalry_swordsman_e.xml</Actor>
    3330  </VisualActor>
    34 
     31  <Promotion disable=""/>
    3532</Entity>
  • binaries/data/mods/public/simulation/templates/units/iber_infantry_slinger_a.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/iber_infantry_slinger_b">
    33  <Promotion>
    4     <Entity>iber_infantry_slinger_e</Entity>
     4    <Entity>units/iber_infantry_slinger_e</Entity>
    55  </Promotion>
    66  <VisualActor>
    77    <Actor>units/iberians/infantry_slinger_a.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/iber_infantry_slinger_b.xml

     
    77    <History>Iberian slingers were the undisputed masters of the weapon and extracted a high toll of the enemy. Going into combat scantily clad at best, the slinger carried three slings tied around his waist, each of a different length allowing him to attack opponents from all ranges. Unlike other cultures, the Iberian slingers threw rocks instead of specially made lead shot.</History>
    88  </Identity>
    99  <Promotion>
    10     <Entity>iber_infantry_slinger_a</Entity>
     10    <Entity>units/iber_infantry_slinger_a</Entity>
    1111  </Promotion>
    1212  <VisualActor>
    1313    <Actor>units/iberians/infantry_slinger_b.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/iber_infantry_spearman_a.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/iber_infantry_spearman_b">
    33  <Promotion>
    4     <Entity>iber_infantry_spearman_e</Entity>
     4    <Entity>units/iber_infantry_spearman_e</Entity>
    55  </Promotion>
    66  <VisualActor>
    77    <Actor>units/iberians/infantry_spearman_a.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/iber_infantry_spearman_b.xml

     
    77    <History>A long-bladed spear was a chief melee weapon of the Iberian infantry, often used after the javelins had been thrown. Typically carried by infantry know as scutarii for their long oval body shields, the spearmen would close in formation to attack their opponents. Usually lightly armored, they were quick and had a ferocious reputation.</History>
    88  </Identity>
    99  <Promotion>
    10     <Entity>iber_infantry_spearman_a</Entity>
     10    <Entity>units/iber_infantry_spearman_a</Entity>
    1111  </Promotion>
    1212  <VisualActor>
    1313    <Actor>units/iberians/infantry_spearman_b.xml</Actor>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_spearman_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>celt_cavalry_spearman_e</Entity>
     7    <Entity>units/celt_cavalry_spearman_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_spearman_b.xml

     
    1010    <Icon>units/celt_cavalry_spearman.png</Icon>
    1111  </Identity>
    1212  <Promotion>
    13     <Entity>celt_cavalry_spearman_a</Entity>
     13    <Entity>units/celt_cavalry_spearman_a</Entity>
    1414  </Promotion>
    1515  <Cost>
    1616    <BuildTime>10</BuildTime>
  • binaries/data/mods/public/simulation/templates/units/rome_legionnaire_imperial.xml

     
    88    <Icon>units/rome_super_legion_imperial.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>rome_centurio_imperial</Entity>
    12     <Req>700</Req>
     11    <Entity>units/rome_centurio_imperial</Entity>
     12    <RequiredXp>700</RequiredXp>
    1313  </Promotion>
    1414  <Armour>
    1515    <Hack>10.0</Hack>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_spearman_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/celt_cavalry_spearman_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    2825  <VisualActor>
    2926    <Actor>units/celts/cavalry_spearman_e.xml</Actor>
    3027  </VisualActor>
     28  <Promotion disable=""/>
    3129</Entity>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_swordsman_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>celt_cavalry_swordsman_e</Entity>
     7    <Entity>units/celt_cavalry_swordsman_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_swordsman_b.xml

     
    88    <Icon>units/celt_cavalry_swordsman.png</Icon>
    99  </Identity>
    1010  <Promotion>
    11     <Entity>celt_cavalry_swordsman_a</Entity>
     11    <Entity>units/celt_cavalry_swordsman_a</Entity>
    1212  </Promotion>
    1313  <Armour>
    1414    <Hack>3.0</Hack>
  • binaries/data/mods/public/simulation/templates/units/celt_cavalry_swordsman_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/celt_cavalry_swordsman_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    3128  <VisualActor>
    3229    <Actor>units/celts/cavalry_swordsman_e.xml</Actor>
    3330  </VisualActor>
     31  <Promotion disable=""/>
    3432</Entity>
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_archer_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>hele_infantry_archer_e</Entity>
     7    <Entity>units/hele_infantry_archer_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_archer_b.xml

     
    99    <Icon>units/hele_infantry_archer.png</Icon>
    1010  </Identity>
    1111  <Promotion>
    12     <Entity>hele_infantry_archer_a</Entity>
     12    <Entity>units/hele_infantry_archer_a</Entity>
    1313  </Promotion>
    1414  <Cost>
    1515    <Resources>
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_javelinist_a.xml

     
    44    <Rank>Advanced</Rank>
    55  </Identity>
    66  <Promotion>
    7     <Entity>hele_infantry_javelinist_e</Entity>
     7    <Entity>units/hele_infantry_javelinist_e</Entity>
    88  </Promotion>
    99  <ResourceGatherer>
    1010    <BaseSpeed>0.75</BaseSpeed>
  • binaries/data/mods/public/simulation/templates/units/hele_infantry_archer_e.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="units/hele_infantry_archer_a">
    3   <Identity>
    4     <Rank>Elite</Rank>
    5   </Identity>
    63  <ResourceGatherer>
    74    <BaseSpeed>0.5</BaseSpeed>
    85  </ResourceGatherer>
     
    3330  <VisualActor>
    3431    <Actor>units/hellenes/infantry_archer_e.xml</Actor>
    3532  </VisualActor>
     33  <Promotion disable=""/>
    3634</Entity>
  • binaries/data/mods/public/simulation/templates/template_unit_infantry.xml

     
    66    <Rank>Basic</Rank>
    77  </Identity>
    88  <Promotion>
    9     <Req>600</Req>
     9    <RequiredXp>600</RequiredXp>
    1010  </Promotion>
    1111  <Cost>
    1212    <BuildTime>9</BuildTime>
  • binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml

     
    66    <Rank>Basic</Rank>
    77  </Identity>
    88  <Promotion>
    9     <Req>900</Req>
     9    <RequiredXp>900</RequiredXp>
    1010  </Promotion>
    1111  <Position>
    1212    <Anchor>pitch</Anchor>
  • binaries/data/mods/public/simulation/templates/template_unit.xml

     
    9191    <Range>24</Range>
    9292    <RetainInFog>false</RetainInFog>
    9393    <AlwaysVisible>false</AlwaysVisible>
    94   </Vision>
     94    </Vision>
     95  <Looter/>
    9596  <VisualActor>
    9697    <SilhouetteDisplay>true</SilhouetteDisplay>
    9798    <SilhouetteOccluder>false</SilhouetteOccluder>
  • binaries/data/mods/public/art/actors/units/hellenes/infantry_spearman_a.xml

    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
    Cannot display: file marked as a binary type.
    svn:mime-type = application/octet-stream
     
    2727        <animation file="infantry/general/death/inf_04.psa" name="Death" speed="400"/>
    2828        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    2929        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     30        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3031      </animations>
    3132      <mesh>skeletal/m_tunic_short.dae</mesh>
    3233      <props>
  • binaries/data/mods/public/art/actors/units/hellenes/infantry_spearman_e.xml

     
    2727        <animation file="infantry/general/death/inf_04.psa" name="Death" speed="400"/>
    2828        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    2929        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     30        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3031      </animations>
    3132      <mesh>skeletal/m_tunic_short.dae</mesh>
    3233      <props>
  • binaries/data/mods/public/art/actors/units/hellenes/infantry_archer_a.xml

     
    2828        <animation file="infantry/general/death/inf_04.psa" name="Death" speed="400"/>
    2929        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    3030        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     31        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3132      </animations>
    3233      <mesh>skeletal/m_tunic_short.dae</mesh>
    3334      <props>
  • binaries/data/mods/public/art/actors/units/hellenes/infantry_javelinist_a.xml

     
    3030        <animation file="infantry/general/death/inf_05.psa" name="Death" speed="600"/>
    3131        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    3232        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     33        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3334      </animations>
    3435      <props>
    3536        <prop actor="props/units/heads/floppy_b.xml" attachpoint="helmet"/>
  • binaries/data/mods/public/art/actors/units/hellenes/infantry_archer_e.xml

     
    2727        <animation file="infantry/general/death/inf_04.psa" name="Death" speed="400"/>
    2828        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    2929        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     30        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3031      </animations>
    3132      <mesh>skeletal/m_tunic_long.dae</mesh>
    3233      <props>
  • binaries/data/mods/public/art/actors/units/hellenes/infantry_javelinist_e.xml

     
    3030        <animation file="infantry/general/death/inf_05.psa" name="Death" speed="600"/>
    3131        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    3232        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     33        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3334      </animations>
    3435      <mesh>skeletal/m_tunic_long.dae</mesh>
    3536      <props>
  • binaries/data/mods/public/art/actors/units/celts/infantry_spearman_a.xml

     
    3030        <animation file="infantry/general/death/inf_04.psa" name="Death" speed="400"/>
    3131        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    3232        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     33        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3334      </animations>
    3435      <mesh>skeletal/m_pants_celt.dae</mesh>
    3536      <props>
  • binaries/data/mods/public/art/actors/units/celts/infantry_spearman_e.xml

     
    3131        <animation file="infantry/general/death/inf_04.psa" name="Death" speed="400"/>
    3232        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    3333        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     34        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3435      </animations>
    3536      <mesh>skeletal/m_pants_celt.dae</mesh>
    3637      <props>
  • binaries/data/mods/public/art/actors/units/celts/infantry_javelinist_a.xml

     
    3333        <animation file="infantry/general/death/inf_04.psa" name="Death" speed="400"/>
    3434        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    3535        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     36        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3637      </animations>
    3738      <mesh>skeletal/m_pants.dae</mesh>
    3839      <props>
  • binaries/data/mods/public/art/actors/units/celts/infantry_javelinist_e.xml

     
    3131        <animation file="infantry/general/death/inf_04.psa" name="Death" speed="400"/>
    3232        <animation file="infantry/general/death/inf_06.psa" name="Death" speed="500"/>
    3333        <animation file="infantry/general/death/inf_07.psa" name="Death" speed="400"/>
     34        <animation file="biped/inf_salute_c.psa" name="Promotion" speed="288"/>
    3435      </animations>
    3536      <mesh>skeletal/m_tights.dae</mesh>
    3637      <props>
  • binaries/data/mods/public/art/actors/units/celts/super_unit_1.xml

     
    44  <group>
    55    <variant frequency="1" name="Base">
    66      <animations>
    7         <animation file="biped/not used/inf_salute_a.psa" name="Idle" speed="302"/>
    8         <animation file="biped/not used/inf_salute_b.psa" name="Idle" speed="291"/>
    9         <animation file="biped/not used/inf_salute_c.psa" name="Idle" speed="288"/>
    10         <animation file="biped/not used/inf_salute_d.psa" name="Idle" speed="296"/>
    11         <animation file="biped/not used/inf_salute_e.psa" name="Idle" speed="311"/>
     7        <animation file="biped/inf_salute_a.psa" name="Idle" speed="302"/>
     8        <animation file="biped/inf_salute_b.psa" name="Idle" speed="291"/>
     9        <animation file="biped/inf_salute_c.psa" name="Idle" speed="288"/>
     10        <animation file="biped/inf_salute_d.psa" name="Idle" speed="296"/>
     11        <animation file="biped/inf_salute_e.psa" name="Idle" speed="311"/>
    1212        <animation file="biped/walk_spearshield.psa" name="Walk" speed="120"/>
    1313        <animation file="infantry/sword/move/run/isw_s_off_01.psa" name="Run" speed="40"/>
    1414        <animation event="0.5" file="infantry/sword/attack/isw_s_em_04.psa" name="Attack" speed="80"/>