Ticket #3468: 3468.diff

File 3468.diff, 12.0 KB (added by Stan, 9 years ago)

Added patch is splitted from #3177's patch by Itms thus assigning the ticket to him.

  • binaries/data/mods/public/gui/session/selection_details.js

     
    111111        });
    112112    }
    113113
    114     // TODO: Stamina
     114    // Stamina
     115    let player = Engine.GetPlayerID();
     116    if (entState.stamina && (entState.player == player || g_DevSettings.controlAll))
     117    {
     118        let unitStaminaBar = Engine.GetGUIObjectByName("staminaBar");
     119        let staminaSize = unitStaminaBar.size;
     120        staminaSize.rright = 100*Math.max(0, Math.min(1, entState.stamina.stamina / entState.stamina.maxStamina));
     121        unitStaminaBar.size = staminaSize;
     122 
     123        Engine.GetGUIObjectByName("staminaStats").caption = sprintf(translate("%(stamina)s / %(maxStamina)s"), {
     124            stamina: Math.ceil(entState.stamina.stamina),
     125            maxStamina: entState.stamina.maxStamina
     126        });
     127        Engine.GetGUIObjectByName("staminaSection").hidden = false;
     128    }
     129    else
     130        Engine.GetGUIObjectByName("staminaSection").hidden = true;
    115131
    116132    // Experience
    117133    Engine.GetGUIObjectByName("experience").hidden = !entState.promotion;
     
    295311    var maxCapturePoints = 0;
    296312    var capturePoints = (new Array(9)).fill(0);
    297313    var playerID = 0;
     314    let averageStamina = 0;
     315    let maxStamina = 0;
    298316
    299317    for (let i = 0; i < selection.length; i++)
    300318    {
     
    312330            maxCapturePoints += entState.maxCapturePoints;
    313331            capturePoints = entState.capturePoints.map(function(v, i) { return v + capturePoints[i]; });
    314332        }
     333        if (entState.stamina)
     334        {
     335            averageStamina += entState.stamina.stamina;
     336            maxStamina += entState.stamina.maxStamina;
     337        }
    315338    }
    316339
    317340    Engine.GetGUIObjectByName("healthMultiple").hidden = averageHealth <= 0;
     
    357380        Engine.GetGUIObjectByName("captureMultiple").tooltip = capturePointsTooltip;
    358381    }
    359382
    360     // TODO: Stamina
    361     // Engine.GetGUIObjectByName("staminaBarMultiple");
     383    if (averageStamina > 0)
     384    {
     385        let unitStaminaBar = Engine.GetGUIObjectByName("staminaBarMultiple");
     386        let staminaSize = unitStaminaBar.size;   
     387        staminaSize.rtop = 100-100*Math.max(0, Math.min(1, averageStamina / maxStamina));
     388        unitStaminaBar.size = staminaSize;
     389 
     390        let staminaLabel = "[font=\"sans-bold-13\"]" + translate("Stamina:") + "[/font]"
     391        let stamina = sprintf(translate("%(label)s %(current)s / %(max)s"), { label: staminaLabel, current: averageStamina, max: maxStamina });
     392        let staminaMultiple = Engine.GetGUIObjectByName("staminaMultiple");
     393        staminaMultiple.tooltip = stamina;
     394        staminaMultiple.hidden = false;
     395    }
     396    else
     397    {
     398        Engine.GetGUIObjectByName("staminaMultiple").hidden = true;
     399    }
    362400
    363401    Engine.GetGUIObjectByName("numberOfUnits").caption = selection.length;
    364402
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    238238        "rallyPoint": null,
    239239        "resourceCarrying": null,
    240240        "rotation": null,
     241        "stamina": null,
    241242        "trader": null,
    242243        "unitAI": null,
    243244        "visibility": null,
     
    410411            "hasRaisedAlert": cmpAlertRaiser.HasRaisedAlert(),
    411412        };
    412413    }
    413 
     414    var cmpStamina = Engine.QueryInterface(ent, IID_Stamina);
     415   
     416    if (cmpStamina)
     417    {
     418        ret.stamina = {
     419            "stamina": cmpStamina.GetStamina(),
     420            "maxStamina": cmpStamina.GetMaxStamina(),
     421        };
     422    }
     423   
    414424    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    415425    ret.visibility = cmpRangeManager.GetLosVisibility(ent, player);
    416426
  • binaries/data/mods/public/simulation/components/interfaces/Stamina.js

     
    11Engine.RegisterInterface("Stamina");
     2
     3
     4// Message of the form { "from": 100, "to", 90 },
     5// sent whenever stamina changes.
     6Engine.RegisterMessageType("StaminaChanged");
     7 No newline at end of file
  • binaries/data/mods/public/simulation/components/Stamina.js

     
    11function Stamina() {}
    22
    33Stamina.prototype.Schema =
    4     "<element name='Max' a:help='Maximum stamina (msecs of running)'>" +
    5         "<data type='positiveInteger'/>" +
    6     "</element>";
     4    "<element name='Max' a:help='Maximum stamina'>" +
     5        "<ref name='nonNegativeDecimal'/>" +
     6    "</element>" +
     7    "<element name='RegenRate' a:help='Stamina regeneration rate per second.'>" +
     8        "<ref name='nonNegativeDecimal'/>" +
     9    "</element>" +
     10    "<optional>" +
     11        "<element name='Initial' a:help='Initial stamina. Default if unspecified is equal to 0'>" +
     12            "<ref name='nonNegativeDecimal'/>" +
     13        "</element>" +
     14    "</optional>";
    715
    8 /*
    9  * TODO: this all needs to be designed and implemented
    10  */
    11 
    12 Engine.RegisterComponentType(IID_Stamina, "Stamina", Stamina);
     16Stamina.prototype.Init = function()
     17{
     18    this.maxStamina = +this.template.Max;
     19    this.regenRate = +this.template.RegenRate;
     20 
     21    this.stamina = +(this.template.Initial || 0);
     22 
     23    this.CheckRegenTimer();
     24};
     25 
     26Stamina.prototype.GetStamina = function()
     27{
     28    return this.stamina;
     29};
     30 
     31Stamina.prototype.GetMaxStamina = function()
     32{
     33    return this.maxStamina;
     34};
     35 
     36Stamina.prototype.CheckRegenTimer = function()
     37{
     38    if ((this.stamina == this.maxStamina && this.regenRate > 0) || (this.stamina == 0 && this.regenRate < 0))
     39    {
     40        // We don't need to regenerate stamina
     41        if (this.regenTimer)
     42        {
     43            var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
     44            cmpTimer.CancelTimer(this.regenTimer);
     45            this.regenTimer = undefined;
     46        }
     47        return;
     48    }
     49 
     50    // We need to regenerate, enable a timer if one doesn't exist
     51    if (this.regenTimer)
     52        return;
     53 
     54    var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
     55    this.regenTimer = cmpTimer.SetInterval(this.entity, IID_Stamina, "UpdateStamina", 1000, 1000, null);
     56};
     57 
     58Stamina.prototype.ToggleStaminaConsumer = function(enabled, costRate)
     59{
     60    if (costRate >= 0)
     61    {
     62        warn("Activated stamina consumer with wrong cost");
     63        return;
     64    }
     65 
     66    if (enabled)
     67    {
     68        if (this.regenRate > 0)
     69            this.regenRate = 0;
     70        this.regenRate += costRate;
     71    }
     72    else
     73    {
     74        this.regenRate -= costRate;
     75        if (this.regenRate >= 0)
     76            this.regenRate = +this.template.RegenRate;
     77    }
     78    this.CheckRegenTimer();
     79};
     80 
     81Stamina.prototype.UpdateStamina = function()
     82{
     83    if (this.regenRate == 0)
     84        return;
     85 
     86    let oldStamina = this.stamina;
     87    this.stamina += this.regenRate;
     88    if (this.stamina > this.maxStamina)
     89        this.stamina = this.maxStamina;
     90 
     91    Engine.PostMessage(this.entity, MT_StaminaChanged, { "from": oldStamina, "to": this.stamina });
     92};
     93 
     94Stamina.prototype.OnStaminaChanged = function(msg)
     95{
     96    this.CheckRegenTimer();
     97};
     98 
     99Engine.RegisterComponentType(IID_Stamina, "Stamina", Stamina);
  • binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml

     
    9191  </Sound>
    9292  <Stamina>
    9393    <Max>2000</Max>
     94    <RegenRate>20</RegenRate>
     95    <Initial>1000</Initial>
    9496  </Stamina>
    9597  <StatusBars>
    9698    <HeightOffset>6.5</HeightOffset>
  • binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry.xml

     
    5555    </SoundGroups>
    5656  </Sound>
    5757  <Stamina>
    58     <Max>2500</Max>
     58    <Max>2500</Max>4
     59    <RegenRate>20</RegenRate>
     60    <Initial>1000</Initial>
    5961  </Stamina>
    6062  <StatusBars>
    6163    <HeightOffset>6.5</HeightOffset>
  • binaries/data/mods/public/simulation/templates/template_unit_champion_elephant.xml

     
    5555  </Sound>
    5656  <Stamina>
    5757    <Max>2500</Max>
     58    <RegenRate>20</RegenRate>
     59    <Initial>1000</Initial>
    5860  </Stamina>
    5961  <StatusBars>
    6062    <HeightOffset>6.5</HeightOffset>
  • binaries/data/mods/public/simulation/templates/template_unit_champion_infantry.xml

     
    4646  </Sound>
    4747  <Stamina>
    4848    <Max>1500</Max>
     49    <RegenRate>20</RegenRate>
    4950  </Stamina>
    5051  <UnitMotion>
    5152    <WalkSpeed>8.5</WalkSpeed>
  • binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry.xml

     
    4747  </Sound>
    4848  <Stamina>
    4949    <Max>2500</Max>
     50    <RegenRate>20</RegenRate>
     51    <Initial>1000</Initial>
    5052  </Stamina>
    5153  <StatusBars>
    5254    <HeightOffset>6.5</HeightOffset>
  • binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_pikeman.xml

     
    3333    <wood>10</wood>
    3434    <metal>10</metal>
    3535  </Loot>
    36   <Stamina>
    37     <Max>1200</Max>
    38   </Stamina>
    3936  <UnitMotion>
    4037    <WalkSpeed>8.5</WalkSpeed>
    4138    <Run>
  • binaries/data/mods/public/simulation/templates/template_unit_infantry.xml

     
    120120  </Sound>
    121121  <Stamina>
    122122    <Max>1000</Max>
     123    <RegenRate>15</RegenRate>
    123124  </Stamina>
    124125  <UnitMotion>
    125126    <WalkSpeed>9</WalkSpeed>
  • binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml

     
    9595  </Sound>
    9696  <Stamina>
    9797    <Max>500</Max>
     98    <RegenRate>5</RegenRate>
    9899  </Stamina>
    99100  <UnitAI>
    100101    <AlertReactiveLevel>1</AlertReactiveLevel>