Ticket #995: ticket995_trampling_4.diff

File ticket995_trampling_4.diff, 6.2 KB (added by bb, 8 years ago)

should clean all rubbish...

  • binaries/data/mods/public/simulation/components/Auras.js

     
    3737                    "</choice>" +
    3838                "</element>" +
    3939                modificationSchema +
     40                "<optional>" + 
     41                    "<element name='StateMultiplier' a:help='Multipliers for states'>" +
     42                        "<oneOrMore>" +
     43                            "<element a:help='UnitAI state'>" +
     44                                "<anyName/><data type='decimal'/>" +
     45                            "</element>" +
     46                        "</oneOrMore>" +                       
     47                    "</element>" +
     48                "</optional>"  +
    4049                "<optional>" +
    4150                    "<element name='AuraName' a:help='name to display in the GUI'>" +
    4251                        "<text/>" +
     
    7180    var auraNames = this.GetAuraNames();
    7281    this.auras = {};
    7382    this.affectedPlayers = {};
    74     for (var name in this.template)
     83    for (let name in this.template)
    7584    {
    7685        this.affectedPlayers[name] = []; // will be calculated on ownership change
    7786        var aura = {};
     
    7887        aura.affects = this.template[name].Affects;
    7988        if (this.template[name].AffectedPlayers)
    8089            aura.affectedPlayers = this.template[name].AffectedPlayers.split(/\s+/);
     90        if (this.template[name].StateMultiplier)
     91            aura.stateMultiplier = this.template[name].StateMultiplier
    8192        this.auras[name] = aura;
    8293    }
    8394};
     
    164175    }
    165176};
    166177
     178Auras.prototype.GetStateMultiplier = function(name)
     179{
     180    let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
     181    if (!cmpUnitAI || !this.auras[name].stateMultiplier)
     182        return 1.0;
     183
     184    let action = cmpUnitAI.GetCurrentState().split(".").pop();
     185    if (this.auras[name].stateMultiplier[action])
     186        return this.auras[name].stateMultiplier[action];
     187    return 1.0;
     188};
     189
    167190Auras.prototype.HasFormationAura = function()
    168191{
    169192    return this.GetAuraNames().some(n => this.IsFormationAura(n));
     
    210233    return this.GetType(name) == "global";
    211234};
    212235
     236Auras.prototype.HasStateMultiplier = function()
     237{
     238    return this.GetAuraNames().some(n => !this.IsStateMultiplier(n));
     239};
     240
     241Auras.prototype.IsStateMultiplier = function(name)
     242{
     243    return !this.auras[name].stateMultiplier;
     244};
     245
    213246/**
    214247 * clean all bonuses. Remove the old ones and re-apply the new ones
    215248 */
     
    378411
    379412Auras.prototype.ApplyBonus = function(name, ents)
    380413{
    381     var validEnts = this.GiveMembersWithValidClass(name, ents);
     414    let validEnts = this.GiveMembersWithValidClass(name, ents);
    382415    if (!validEnts.length)
    383416        return;
    384417    this[name].targetUnits = this[name].targetUnits.concat(validEnts);
    385     var modifications = this.GetModifications(name);
    386     var cmpAuraManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AuraManager);
    387     for each (let mod in modifications)
    388         cmpAuraManager.ApplyBonus(mod.value, validEnts, mod, this.GetModifierIdentifier(name, mod));
    389     // update status bars if this has an icon
    390     if (!this.GetOverlayIcon(name))
     418    let modifications = this.GetModifications(name);
     419    let cmpAuraManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AuraManager);
     420    let modNumber = 0;
     421    for (let mod in modifications)
     422    {
     423        let data = {};
     424        if (modifications[mod].add)
     425            data.add = modifications[mod].add * this.GetStateMultiplier(name);
     426        if (modifications[mod].multiply)
     427            data.multiply = modifications[mod].multiply * this.GetStateMultiplier(name);
     428        if ((!modifications[mod].add || data.add == 0) && (!modifications[mod].multiply || data.multiply == 1))
     429            continue;
     430        cmpAuraManager.ApplyBonus(modifications[mod].value, validEnts, data, this.GetModifierIdentifier(name, modifications[mod]));
     431        ++modNumber;
     432    }
     433
     434    // update status bars if this has an icon and a bonus is applied
     435    if (!this.GetOverlayIcon(name) || modNumber == 0)
    391436        return;
    392437    for (let ent of validEnts)
    393438    {
    394         var cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
     439        let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
    395440        if (cmpStatusBars)
    396441            cmpStatusBars.AddAuraSource(this.entity, name);
    397442    }
  • binaries/data/mods/public/simulation/components/StatusBars.js

     
    7272
    7373StatusBars.prototype.RemoveAuraSource = function(source, auraName)
    7474{
     75    if (!this.auraSources[source])
     76        return;
    7577    let names = this.auraSources[source];
    7678    names.splice(names.indexOf(auraName), 1);
    7779    this.RegenerateSprites();
  • binaries/data/mods/public/simulation/helpers/FSM.js

     
    383383
    384384    obj.fsmStateName = nextStateName;
    385385    obj.FsmStateNameChanged(obj.fsmStateName);
     386
     387    let cmpAuras = Engine.QueryInterface(obj.entity, IID_Auras);
     388    if (cmpAuras && cmpAuras.HasStateMultiplier())
     389        cmpAuras.Clean();
    386390};
    387391
    388392Engine.RegisterGlobal("FSM", FSM);
  • binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml

     
    1919      <wood>100</wood>
    2020    </Resources>
    2121  </Cost>
     22  <Auras>
     23    <Aura1>
     24      <Type>range</Type>
     25      <Radius>5</Radius>
     26      <Affects>Human</Affects>
     27      <AffectedPlayers>Enemy</AffectedPlayers>
     28      <Modifications>
     29        <Health.RegenRate> <Add>-1</Add> </Health.RegenRate>
     30      </Modifications>
     31      <StateMultiplier>
     32        <IDLE>0</IDLE>
     33        <WALKING>2.0</WALKING>
     34        <APPROACHING>2.0</APPROACHING>
     35      </StateMultiplier>
     36      <AuraName>Trample</AuraName>
     37      <AuraDescription>Tramples all nearby enemy's</AuraDescription>
     38      <OverlayIcon>art/textures/ui/session/auras/attack_bonus.png</OverlayIcon>
     39    </Aura1>
     40  </Auras>
    2241  <Identity>
    2342    <VisibleClasses datatype="tokens">Ranged Archer</VisibleClasses>
    2443    <GenericName>Champion Cavalry Archer.</GenericName>