Ticket #995: ticket995_trampling_5.diff

File ticket995_trampling_5.diff, 11.7 KB (added by bb, 8 years ago)

included elephants and a bit of balancing

  • 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/>" +
     
    7079    this.templateName = cmpTemplateManager.GetCurrentTemplateName(this.entity);
    7180    this.auras = {};
    7281    this.affectedPlayers = {};
    73     for (var name in this.template)
     82    for (let name in this.template)
    7483    {
    7584        this.affectedPlayers[name] = []; // will be calculated on ownership change
    7685        var aura = {};
     
    7786        aura.affects = this.template[name].Affects;
    7887        if (this.template[name].AffectedPlayers)
    7988            aura.affectedPlayers = this.template[name].AffectedPlayers.split(/\s+/);
     89        if (this.template[name].StateMultiplier)
     90            aura.stateMultiplier = this.template[name].StateMultiplier
    8091        this.auras[name] = aura;
    8192    }
    8293};
     
    160171    }
    161172};
    162173
     174Auras.prototype.GetStateMultiplier = function(name)
     175{
     176    let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
     177    if (!cmpUnitAI || !this.auras[name].stateMultiplier)
     178        return 1.0;
     179
     180    let action = cmpUnitAI.GetCurrentState().split(".").pop();
     181    if (this.auras[name].stateMultiplier[action])
     182        return this.auras[name].stateMultiplier[action];
     183    return 1.0;
     184};
     185
    163186Auras.prototype.HasFormationAura = function()
    164187{
    165188    return this.GetAuraNames().some(n => this.IsFormationAura(n));
     
    206229    return this.GetType(name) == "global";
    207230};
    208231
     232Auras.prototype.HasStateMultiplier = function()
     233{
     234    return this.GetAuraNames().some(n => !this.IsStateMultiplier(n));
     235};
     236
     237Auras.prototype.IsStateMultiplier = function(name)
     238{
     239    return !this.auras[name].stateMultiplier;
     240};
     241
    209242/**
    210243 * clean all bonuses. Remove the old ones and re-apply the new ones
    211244 */
     
    374407
    375408Auras.prototype.ApplyBonus = function(name, ents)
    376409{
    377     var validEnts = this.GiveMembersWithValidClass(name, ents);
     410    let validEnts = this.GiveMembersWithValidClass(name, ents);
    378411    if (!validEnts.length)
    379412        return;
    380413
    381414    this[name].targetUnits = this[name].targetUnits.concat(validEnts);
    382     var modifications = this.GetModifications(name);
    383     var cmpAuraManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AuraManager);
     415    let modifications = this.GetModifications(name);
     416    let cmpAuraManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_AuraManager);
     417    let modNumber = 0;
     418    for (let mod in modifications)
     419    {
     420        let data = {};
     421        if (modifications[mod].add)
     422            data.add = modifications[mod].add * this.GetStateMultiplier(name);
     423        if (modifications[mod].multiply)
     424            data.multiply = modifications[mod].multiply * this.GetStateMultiplier(name);
     425        if ((!modifications[mod].add || data.add == 0) && (!modifications[mod].multiply || data.multiply == 1))
     426            continue;
     427        cmpAuraManager.ApplyBonus(modifications[mod].value, validEnts, data, this.GetModifierIdentifier(name, modifications[mod]));
     428        ++modNumber;
     429    }
    384430
    385     for (let mod of modifications)
    386         cmpAuraManager.ApplyBonus(mod.value, validEnts, mod, this.GetModifierIdentifier(name, mod));
    387 
    388     // update status bars if this has an icon
    389     if (!this.GetOverlayIcon(name))
     431    // update status bars if this has an icon and a bonus is applied
     432    if (!this.GetOverlayIcon(name) || modNumber == 0)
    390433        return;
    391434
    392435    for (let ent of validEnts)
    393436    {
    394         var cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
     437        let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
    395438        if (cmpStatusBars)
    396439            cmpStatusBars.AddAuraSource(this.entity, name);
    397440    }
  • 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/gaia/fauna_elephant_african_bush.xml

     
    3333      </Bonuses>
    3434    </Charge>
    3535  </Attack>
     36  <Auras>
     37    <Aura1>
     38      <Type>range</Type>
     39      <Radius>7</Radius>
     40      <Affects>Human</Affects>
     41      <AffectedPlayers>Enemy</AffectedPlayers>
     42      <Modifications>
     43        <Health.RegenRate> <Add>-1</Add> </Health.RegenRate>
     44      </Modifications>
     45      <StateMultiplier>
     46        <IDLE>0</IDLE>
     47        <WALKING>2.0</WALKING>
     48        <APPROACHING>2.0</APPROACHING>
     49      </StateMultiplier>
     50      <AuraName>Trample</AuraName>
     51      <AuraDescription>Tramples all nearby enemy's</AuraDescription>
     52      <OverlayIcon>art/textures/ui/session/auras/attack_bonus.png</OverlayIcon>
     53    </Aura1>
     54  </Auras>
    3655  <Footprint>
    3756    <Circle radius="3.65"/>
    3857    <Height>3.0</Height>
  • binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_asian.xml

     
    3333      </Bonuses>
    3434    </Charge>
    3535  </Attack>
     36  <Auras>
     37    <Aura1>
     38      <Type>range</Type>
     39      <Radius>7</Radius>
     40      <Affects>Human</Affects>
     41      <AffectedPlayers>Enemy</AffectedPlayers>
     42      <Modifications>
     43        <Health.RegenRate> <Add>-1.5</Add> </Health.RegenRate>
     44      </Modifications>
     45      <StateMultiplier>
     46        <IDLE>0</IDLE>
     47        <WALKING>2.0</WALKING>
     48        <APPROACHING>2.0</APPROACHING>
     49      </StateMultiplier>
     50      <AuraName>Trample</AuraName>
     51      <AuraDescription>Tramples all nearby enemy's</AuraDescription>
     52      <OverlayIcon>art/textures/ui/session/auras/attack_bonus.png</OverlayIcon>
     53    </Aura1>
     54  </Auras>
    3655  <Footprint>
    3756    <Circle radius="2.8"/>
    3857    <Height>3.0</Height>
  • binaries/data/mods/public/simulation/templates/gaia/fauna_elephant_north_african.xml

     
    2020      </Bonuses>
    2121    </Melee>
    2222  </Attack>
     23  <Auras>
     24    <Aura1>
     25      <Type>range</Type>
     26      <Radius>7</Radius>
     27      <Affects>Human</Affects>
     28      <AffectedPlayers>Enemy</AffectedPlayers>
     29      <Modifications>
     30        <Health.RegenRate> <Add>-1.5</Add> </Health.RegenRate>
     31      </Modifications>
     32      <StateMultiplier>
     33        <IDLE>0</IDLE>
     34        <WALKING>2.0</WALKING>
     35        <APPROACHING>2.0</APPROACHING>
     36      </StateMultiplier>
     37      <AuraName>Trample</AuraName>
     38      <AuraDescription>Tramples all nearby enemy's</AuraDescription>
     39      <OverlayIcon>art/textures/ui/session/auras/attack_bonus.png</OverlayIcon>
     40    </Aura1>
     41  </Auras>
    2342  <Footprint>
    2443    <Circle radius="2.6"/>
    2544    <Height>2.7</Height>
  • binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml

     
    1414      <PreferredClasses datatype="tokens">Human</PreferredClasses>
    1515    </Ranged>
    1616  </Attack>
     17  <Auras>
     18    <Aura1>
     19      <Type>range</Type>
     20      <Radius>8</Radius>
     21      <Affects>Human</Affects>
     22      <AffectedPlayers>Enemy</AffectedPlayers>
     23      <Modifications>
     24        <Health.RegenRate> <Add>-4.5</Add> </Health.RegenRate>
     25      </Modifications>
     26      <StateMultiplier>
     27        <IDLE>0</IDLE>
     28        <WALKING>2.0</WALKING>
     29        <APPROACHING>2.0</APPROACHING>
     30      </StateMultiplier>
     31      <AuraName>Trample</AuraName>
     32      <AuraDescription>Tramples all nearby enemy's</AuraDescription>
     33      <OverlayIcon>art/textures/ui/session/auras/attack_bonus.png</OverlayIcon>
     34    </Aura1>
     35  </Auras>
    1736  <Cost>
    1837    <Resources>
    1938      <wood>100</wood>
  • binaries/data/mods/public/simulation/templates/template_unit_champion_elephant.xml

     
    55    <Pierce>8</Pierce>
    66    <Crush>25</Crush>
    77  </Armour>
     8  <Auras>
     9    <Aura1>
     10      <Type>range</Type>
     11      <Radius>7</Radius>
     12      <Affects>Human</Affects>
     13      <AffectedPlayers>Enemy</AffectedPlayers>
     14      <Modifications>
     15        <Health.RegenRate> <Add>-2</Add> </Health.RegenRate>
     16      </Modifications>
     17      <StateMultiplier>
     18        <IDLE>0</IDLE>
     19        <WALKING>2.0</WALKING>
     20        <APPROACHING>2.0</APPROACHING>
     21      </StateMultiplier>
     22      <AuraName>Trample</AuraName>
     23      <AuraDescription>Tramples all nearby enemy's</AuraDescription>
     24      <OverlayIcon>art/textures/ui/session/auras/attack_bonus.png</OverlayIcon>
     25    </Aura1>
     26  </Auras>
    827  <Cost>
    928    <Population>3</Population>
    1029    <BuildTime>20</BuildTime>
  • binaries/data/mods/public/simulation/templates/units/maur_elephant_archer_b.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22<Entity parent="template_unit_cavalry_ranged_archer">
     3  <Auras>
     4    <Aura1>
     5      <Type>range</Type>
     6      <Radius>7</Radius>
     7      <Affects>Human</Affects>
     8      <AffectedPlayers>Enemy</AffectedPlayers>
     9      <Modifications>
     10        <Health.RegenRate> <Add>-1.5</Add> </Health.RegenRate>
     11      </Modifications>
     12      <StateMultiplier>
     13        <IDLE>0</IDLE>
     14        <WALKING>2.0</WALKING>
     15        <APPROACHING>2.0</APPROACHING>
     16      </StateMultiplier>
     17      <AuraName>Trample</AuraName>
     18      <AuraDescription>Tramples all nearby enemy's</AuraDescription>
     19      <OverlayIcon>art/textures/ui/session/auras/attack_bonus.png</OverlayIcon>
     20    </Aura1>
     21  </Auras>
    322  <Footprint replace="">
    423    <Circle radius="3.5"/>
    524    <Height>8.0</Height>