Ticket #995: ticket995_trampling_3.diff

File ticket995_trampling_3.diff, 6.5 KB (added by bb, 8 years ago)

New version, allow actionmultipliers so an idle unit won't trample.

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

     
    3737                    "</choice>" +
    3838                "</element>" +
    3939                modificationSchema +
     40                "<optional>" + 
     41                    "<element name='ActionMultiplier' a:help='Multipliers for actions'>" +
     42                        "<oneOrMore>" +
     43                            "<element a:help='Name of the action in CAPS'>" +
     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/>" +
     
    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].ActionMultiplier)
     91            aura.actionMultiplier = this.template[name].ActionMultiplier
    8192        aura.modifications = [];
    82         for (var value in this.template[name].Modifications)
     93        for (let value in this.template[name].Modifications)
    8394        {
    8495            var mod = {};
    8596            mod.value = value.replace(/\./g, "/").replace(/\/\//g, ".");
    8697            if (this.template[name].Modifications[value].Add)
    8798                mod.add = +this.template[name].Modifications[value].Add;
    88             else if (this.template[name].Modifications[value].Multiply)
     99            if (this.template[name].Modifications[value].Multiply)
    89100                mod.multiply = +this.template[name].Modifications[value].Multiply;
    90101            aura.modifications.push(mod);
    91102        }
     
    170181    }
    171182};
    172183
     184Auras.prototype.GetActionMultiplier = function(name)
     185{
     186    let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
     187    if (!cmpUnitAI || !this.auras[name].actionMultiplier)
     188        return 1.0;
     189
     190    let action = cmpUnitAI.GetCurrentState().split(".").pop();
     191    if (this.auras[name].actionMultiplier[action])
     192        return this.auras[name].actionMultiplier[action];
     193    return 1.0;
     194};
     195
    173196Auras.prototype.HasFormationAura = function()
    174197{
    175198    return this.GetAuraNames().some(n => this.IsFormationAura(n));
     
    216239    return this.GetType(name) == "global";
    217240};
    218241
     242Auras.prototype.HasActionMultiplier = function()
     243{
     244    return this.GetAuraNames().some(n => !this.IsActionMultiplier(n));
     245};
     246
     247Auras.prototype.IsActionMultiplier = function(name)
     248{
     249    return !this.auras[name].actionMultiplier;
     250};
     251
    219252/**
    220253 * clean all bonuses. Remove the old ones and re-apply the new ones
    221254 */
     
    365398
    366399Auras.prototype.ApplyBonus = function(name, ents)
    367400{
    368     var validEnts = this.GiveMembersWithValidClass(name, ents);
     401    let validEnts = this.GiveMembersWithValidClass(name, ents);
    369402    if (!validEnts.length)
    370403        return;
     404
    371405    this[name].targetUnits = this[name].targetUnits.concat(validEnts);
    372     var modifications = this.GetModifications(name);
    373     var cmpAuraManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AuraManager);
    374     for each (let mod in modifications)
    375         cmpAuraManager.ApplyBonus(mod.value, validEnts, mod, this.templateName + "/" + name + "/" + mod.value);
    376     // update status bars if this has an icon
    377     if (!this.GetOverlayIcon(name))
     406    let modifications = this.GetModifications(name);
     407    let cmpAuraManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AuraManager);
     408    let modNumber = 0;
     409    for (let mod in modifications)
     410    {
     411        let data = {};
     412        if (modifications[mod].add)
     413            data.add = modifications[mod].add * this.GetActionMultiplier(name);
     414        if (modifications[mod].multiply)
     415            data.multiply = modifications[mod].multiply * this.GetActionMultiplier(name);
     416        if ((!modifications[mod].add || data.add == 0) && (!modifications[mod].multiply || data.multiply == 1))
     417            continue;
     418        cmpAuraManager.ApplyBonus(modifications[mod].value, validEnts, data, this.templateName + "/" + name + "/" + modifications[mod].value);
     419        modNumber++;
     420    };
     421
     422    // update status bars if this has an icon and a bonus is applied
     423    if (!this.GetOverlayIcon(name) || modNumber == 0)
    378424        return;
    379425    for (let ent of validEnts)
    380426    {
    381         var cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
     427        let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
    382428        if (cmpStatusBars)
    383429            cmpStatusBars.AddAuraSource(this.entity, name);
    384430    }
  • 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.HasActionMultiplier())
     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>100</Radius>
     26      <Affects>Human</Affects>
     27      <AffectedPlayers>Enemy</AffectedPlayers>
     28      <Modifications>
     29        <Health.RegenRate> <Add>-1</Add> </Health.RegenRate>
     30      </Modifications>
     31      <ActionMultiplier>
     32    <IDLE>0</IDLE>
     33        <WALKING>2.0</WALKING>
     34        <APPROACHING>2.0</APPROACHING>
     35      </ActionMultiplier>
     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>