Kith's Assault Rework

Discussion in 'Class Discussion' started by Kith, May 17, 2012.

  1. Kith
    • Development Team
    • Designer

    Kith NOTD Staff: Anti-Fun Wizard Skeleton

    Well, it is setting him apart. The Assault's theme of DPS is crits. Many, many crits. Rifleman has jack of all trades DPS, and Opsmando has burst damage. There are other DPS classes, yes, but they branch out into different things (SubMM being burst/movement, CEngi being sustained/minion, so on and so forth).

    The merits of Overwatch over Total Annihilation are that Overwatch has the Assault continue doing what he's been doing for the entire tree: More dakka, better dakka. Total Annihilation was cool, but he was essentially pulling a Missile Pod out of nowhere and blowing things up.

    Also, even now, the Combat Engineer doesn't outdamage the Arms Assault unless Overdrive is active, and I'd daresay that it's fair to leave T3s out of the comparison at this time because the Assault's is so non-conducive to increasing his DPS. Once this goes through, the Arms Assault Assault will be capable of outdamaging the Combat Engineer with ease, which I'm perfectly fine with (considering that the Combat Engineer has way more mobility than the Arms Assault does).
  2. Seeky

    Seeky New Member

    Give a slight bump to critical multiplier when Overwatch is active, say 2.5x.
  3. Kith
    • Development Team
    • Designer

    Kith NOTD Staff: Anti-Fun Wizard Skeleton

    Can't be done, at least, not with the way that they're coded in NOTD (and changing it is equivalent to performing a complete skeletal replacement surgery on a person - technically possible, but ultimately prohibitively expensive and is probably going to lead to patient death in one way or another).

    That's why the crit chance increase is there instead.
  4. Lord NiteShade
    • Wiki Founder
    • Community Leader

    Lord NiteShade NOTD Staff: Wiki Founder/TeamSpeak Admin

    Criticals damage multiplier is easily adjustable. When you make it using data. These trigger based criticals on the other hand are an entirely different beast...

    Here you go, tweak this and we'll talk modifying crits.
    Code:
    //--------------------------------------------------------------------------------------------------
    // Trigger: Critical Strike
    //--------------------------------------------------------------------------------------------------
    bool gt_CriticalStrike_Func (bool testConds, bool runActions) {
        // Variable Declarations
        unit lv_attackingUnit;
        unit lv_attackedUnit;
        int lv_ownerofAttackingUnit;
        string lv_classofAttackingUnit;
        int lv_criticalTalentLevel;
        int lv_criticalTalentLevel2;
        fixed lv_damage;
        int lv_critTextTag;
        fixed lv_critTextHeightOffset;
        int lv_heroLevel;
        string lv_damagingEffect;
        fixed lv_criticalStrikeDamage;
        int lv_rankofHero;
    
        // Variable Initialization
        lv_attackingUnit = EventUnitDamageSourceUnit();
        lv_attackedUnit = EventUnit();
        lv_ownerofAttackingUnit = gf_NOTDOwnerofUnit(lv_attackingUnit);
        lv_classofAttackingUnit = UnitGetType(lv_attackingUnit);
        lv_criticalTalentLevel = gv_talentLevel[1][lv_ownerofAttackingUnit];
        lv_criticalTalentLevel2 = gv_talentLevel[2][lv_ownerofAttackingUnit];
        lv_damage = EventUnitDamageAmount();
        lv_critTextTag = c_textTagNone;
        lv_critTextHeightOffset = 1.5;
        lv_heroLevel = UnitLevel(lv_attackingUnit);
        lv_damagingEffect = EventUnitDamageEffect();
        lv_criticalStrikeDamage = lv_damage;
        lv_rankofHero = UnitLevel(lv_attackingUnit);
    
        // Conditions
        if (testConds) {
            if (!((UnitGroupHasUnit(gv_marines, lv_attackingUnit) == true))) {
                return false;
            }
    
            if (!((((EventUnitDamageEffect() != "CombatKnifeDamage") && (EventUnitDamageEffect() != "CombatKnifeDamagevsDemetersCocoon") && ((((lv_classofAttackingUnit == "Rifleman") || (lv_classofAttackingUnit == "GhostLaserLines")) && (RandomFixed(0.0, 100.0) <= ((IntToFixed(lv_criticalTalentLevel) * 10.0) + (IntToFixed(gv_statsPerception4[lv_ownerofAttackingUnit]) / 1.0)))) || ((lv_classofAttackingUnit == "TychusChaingun") && (((UnitHasBehavior(lv_attackingUnit, "ConcentratedFireLevel1") == false) && (UnitHasBehavior(lv_attackingUnit, "ConcentratedFireLevel2") == false) && (UnitHasBehavior(lv_attackingUnit, "ConcentratedFireLevel3") == false) && (RandomFixed(0.0, 100.0) <= ((IntToFixed(lv_criticalTalentLevel2) * 10.0) + (IntToFixed(gv_statsPerception4[lv_ownerofAttackingUnit]) / 1.0)))) || ((UnitHasBehavior(lv_attackingUnit, "ConcentratedFireLevel1") == true) && (lv_criticalTalentLevel2 > 0) && (RandomFixed(0.0, 100.0) <= (((IntToFixed(lv_criticalTalentLevel2) * 10.0) + 5.0) + (IntToFixed(gv_statsPerception4[lv_ownerofAttackingUnit]) / 1.0)))) || ((UnitHasBehavior(lv_attackingUnit, "ConcentratedFireLevel2") == true) && (lv_criticalTalentLevel2 > 0) && (RandomFixed(0.0, 100.0) <= (((IntToFixed(lv_criticalTalentLevel2) * 10.0) + 10.0) + (IntToFixed(gv_statsPerception4[lv_ownerofAttackingUnit]) / 1.0)))) || ((UnitHasBehavior(lv_attackingUnit, "ConcentratedFireLevel3") == true) && (lv_criticalTalentLevel2 > 0) && (RandomFixed(0.0, 100.0) <= (((IntToFixed(lv_criticalTalentLevel2) * 10.0) + 15.0) + (IntToFixed(gv_statsPerception4[lv_ownerofAttackingUnit]) / 1.0)))))) || ((lv_classofAttackingUnit != "Rifleman") && (lv_classofAttackingUnit != "GhostLaserLines") && (lv_classofAttackingUnit != "TychusChaingun") && (RandomFixed(0.0, 100.0) <= IntToFixed(gv_statsPerception4[lv_ownerofAttackingUnit]))))) || (((EventUnitDamageEffect() == "CombatKnifeDamage") || (EventUnitDamageEffect() == "CombatKnifeDamagevsDemetersCocoon")) && (RandomFixed(0.0, 100.0) <= (IntToFixed(lv_heroLevel) * 3.0)))))) {
                return false;
            }
        }
    
        // Actions
        if (!runActions) {
            return true;
        }
    
        if (((lv_damagingEffect == "OSOKLevel1BaseDamage") || (lv_damagingEffect == "OSOKLevel2BaseDamage") || (lv_damagingEffect == "OSOKLevel3BaseDamage") || (lv_damagingEffect == "PrecisionShotLevel1Damage") || (lv_damagingEffect == "PrecisionShotLevel2Damage"))) {
            lv_criticalStrikeDamage=lv_criticalStrikeDamage / 2.0;
        }
        else {
        }
        if ((UnitGetPropertyFixed(lv_attackedUnit, c_unitPropLife, c_unitPropCurrent) > 0.0)) {
            UnitCreateEffectUnit(lv_attackingUnit, "CriticalStrike", lv_attackedUnit);
            UnitCreateEffectUnit(lv_attackingUnit, "ApplyCriticalStrikeDummy", lv_attackedUnit);
            if ((UnitHasBehavior(lv_attackingUnit, "BloodFrenzyLevel1") == true)) {
                UnitBehaviorAdd(lv_attackedUnit, "BloodFrenzyLevel1Stun", lv_attackingUnit, 1);
            }
            else {
            }
            if ((UnitHasBehavior(lv_attackingUnit, "BloodFrenzyLevel2") == true)) {
                UnitBehaviorAdd(lv_attackedUnit, "BloodFrenzyLevel2Stun", lv_attackingUnit, 1);
            }
            else {
            }
        }
        else {
        }
        CatalogFieldValueSet(c_gameCatalogEffect, "CriticalStrike", "Amount", lv_ownerofAttackingUnit, FixedToString(lv_criticalStrikeDamage, c_fixedPrecisionAny));
        TextTagCreate((FixedToText((lv_damage + lv_criticalStrikeDamage), 0) + StringExternal("Param/Value/296CE093")), 20, UnitGetPosition(lv_attackingUnit), 1.5, true, true, PlayerGroupActive());
        lv_critTextTag = TextTagLastCreated();
        TextTagSetColor(TextTagLastCreated(), c_textTagColorText, Color(100.00, 0.00, 0.00));
        TextTagAttachToUnit(lv_critTextTag, lv_attackingUnit, lv_critTextHeightOffset);
        TextTagSetVelocity(lv_critTextTag, 0.5, 90.0);
        Wait(1.0, c_timeGame);
        TextTagDestroy(lv_critTextTag);
        return true;
    }
    
    //--------------------------------------------------------------------------------------------------
    void gt_CriticalStrike_Init () {
        gt_CriticalStrike = TriggerCreate("gt_CriticalStrike_Func");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "P38ScytheGuassPistol");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "GuassRifle");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "Chaingun");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "Shotgun");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "LaserRifleDamage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "Crowbar2");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "InfernalFlameThrower");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "FlameThrowerLevel2");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "FlameThrowerLevel3");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "C10CanisterRifle");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "BarrettM112");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "MP9A2SubMachineGun");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "M5PulseRifle");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "ScoutGround");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "HK420AssaultRifle");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "L3GrenadeExplosion");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "StingerMK3Damage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "OSOKLevel1BaseDamage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "OSOKLevel2BaseDamage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "OSOKLevel3BaseDamage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "CombatKnifeDamage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "CombatKnifeDamagevsDemetersCocoon");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "PrecisionShotLevel2Damage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "PrecisionShotLevel1Damage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "GrenadeLevel1Damage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "GrenadeLevel2Damage");
        TriggerAddEventUnitDamaged(gt_CriticalStrike, null, c_unitDamageTypeAny, c_unitDamageEither, "RepulseDamage");
    }
  5. Kith
    • Development Team
    • Designer

    Kith NOTD Staff: Anti-Fun Wizard Skeleton

    And it's not made with data, so. It's gonna stay as it is. Besides, between the damage bonus and the crit rate increase, I don't think Harvester needs more damage buffs.
  6. Lord NiteShade
    • Wiki Founder
    • Community Leader

    Lord NiteShade NOTD Staff: Wiki Founder/TeamSpeak Admin

    Yup.

    Also, if Assault end's up with multiple critical behaviors, of different damage values, they combine.

    Currently ALL crits are 2x damage, with varying percentages. The editor merely adds these values, up to 100%, obviously. Any overkill critical percentage (if we ever reached that stage), from 101% to 1 billion %, doesnt count. It just caps back down to 100%. The only time it would matter is if something caused "critical chance loss" or something similar.

    Anyways, if you have percentages with different damage multipliers, they are calculated separately. If you have a 50% chance to do 2x Damage, and a 50% chance to do 3x damage, they can and will overlap, and you end up with "super-crits" that do 6x damage. That sort of damage scaling can easily throw off core damage balance and radically overpower the class. All the more reason to avoid it.
  7. ArcanePariah
    • Development Team
    • Map Developer

    ArcanePariah Miracle Worker

    I feel that the stun damage is too high. I want it to have minor damage, but not turn into, get Charge, farm all the zombies and whore every little man mob. Yes I understand he is a tank, but is leveling REALLY that hard? Giving him Crowbar or Shotgun already makes him farm pretty well. May have to playtest it first, and lower the damage. I would like the focus be on the stun/mobility, not the damage/whoring potential.

    Harvester of Sorrow name is... it feels off. Since it's giving a massive damage and crit bonus chance, I would expect the name to include rage,fury,concentrated or something like that to indicate a hardened focus on firing and dishing out massive damage. Focus/Concentrated Fire already are taken, so maybe something like Steady Fury? Not very good with naming stuff.

    I'm assuming assault energy regen is low enough that he can not sustain Harvester forever (ala Combat Rifleman Bloodlust). It does feel like that assault should be able to keep up 2 skills most of the time, which is good, and be able to burst and do all 3 for a very short time (basically 30 seconds of Harvester). The damage bonus might be too high on certain weapons, so that might need toning down in favor of higher crit rates (so like -10% dmg, +5% crits).

    I do feel cautious about the super high crit chances though. Although blood frenzy can not be sustained indefinetly, it may be (with high enough crits, we may already be there), "just good enough" and supplant Engineer Boom Headshot, in terms of stunning. The engineer has the advantage of it being a true stun, and also the armor reduction does boost team wide dps, along with infinite sustainability. However the catch is assault can stun lock a boss, engineer can not, and for most mobs, 30 seconds is more then long enough to decimate the majority of them.

    In short, with all the nerfs to engie (a bunch) and all theses buffs to assault, is assault DPS higher then engie now? More fundamentally, should a base class dps exceed another more advanced class, and require less skill to do so?
  8. Lord NiteShade
    • Wiki Founder
    • Community Leader

    Lord NiteShade NOTD Staff: Wiki Founder/TeamSpeak Admin

    The Combat Engineer requires skill? Since when. Engineer needs a rework as well, he's FAR too much passive dps, and his damage skills are iffy in their mechanics, but ridiculous when they do decide to work. Assault should outdamage Engineer, it's a tradeoff of speed vs power. Engineer can literally kite and kill any mob he feels like, and being able to stunlock them at the drop of a hat. Assault is a turret, once he sets up, he does so with the intent to not move for a while.
  9. ArcanePariah
    • Development Team
    • Map Developer

    ArcanePariah Miracle Worker

    Kith's working on that, but currently the engineer passive dps has been nerfed repeatedly. IMA got 25% nerf, X-1 Bot got nearly 70% damage nerf (it was doing double and had higher attack speed). Moreover, the X-1 bot requires skill/micro to use since you have to use all the X-1 actives to make it useful dps wise and to keep it alive, while in addition keeping your faster engie alive as well, since they naturally spread out. Overall the engineer requires much more micro to keep his bot alive, for massively reduced damage of the past. Only saving grace is OD, without it, Engineer wouldn't even be dps much anymore, mostly just utility.

    If Harvester is put it, assault will also be able to stun lock ANYTHING he feels like at the drop of a hat, while remaining mobile.

    IIRC, Kith intended for assault to be superior to all but engineer and opcomm in dps, out pacing in raw dps the SMM/AMM/Crofl. The buffs to assault may be pushing things slightly too far. On paper, the assault arms becomes a very attractive substitute on paper to opcomm because of his stunlock utlity. Imagine if you will, if Cengy BHS stunned bosses. It would be instantly be considered vastly OP, since 2 Cengy's could take on ANY boss. Arm's (especially an over leveled in to charge arms) is approaching the same possibility, 2 of them rotating T2 + Frenzy could literally stunlock every boss, and not care. Hell Arms can almost stunlock queen for the vast majority of her fight as is with any form of energy support. With Harvester, Arms could probably solo queen, tell the tank go get lunch.

    In short, I like the raw dps increases in straight damage and crits, but possible need to re examine blood frenzy crits = stun, since the increasing crits boos the assault utility, making him a silver bullet, who can handle any situation on his own. Also IMO a base class should only be able to exceed a more powerful class DPS only through superior micro/skill, not by virtue of pressing A B C. As it stands, Engineer banks all his powerhouse DPS on one skill, his T3, the rest on the way is minor in comparision. Assault requires very little micro in comparision, for nearly the same utility, and approaching the same dps.
  10. Lord NiteShade
    • Wiki Founder
    • Community Leader

    Lord NiteShade NOTD Staff: Wiki Founder/TeamSpeak Admin

    That would justify the movespeed losses he used to have on active skills. At least Blood/Overwatch should have ms reducs, since they turn you into tower style dps. Concen fire is really the only skill you use "on the move" aside from the current charge.
  11. Ryan III

    Ryan III Well-Known Member

    How about another name for over watch?
    Fire and fury
    Odin's Fury
    Battle Cry
    Ignite the fire
    The last stand
    That's all I have for now
  12. Blaqk
    • Development Team
    • Webmaster/Liaison

    Blaqk NOTD Staff: Bugs, Pugs, and Scruggs

    Obvious name is Ragnarok. There's also a voiced quote "Ragnarock and roll!"
  13. Ryan III

    Ryan III Well-Known Member

    How could i have forgotten that?
  14. Kith
    • Development Team
    • Designer

    Kith NOTD Staff: Anti-Fun Wizard Skeleton

    Charge's damage will remain as it is for the time being. If it turns out it deals too much damage, we'll tone it down. Also, the name stays. You will not take my song references from me. )<

    Anyhow. At no point have I ever stated that the Combat Engineer should out-DPS the Assault, and as a matter of fact, the current power level that the CEngi is at is perfect in my opinion. He has way more mobility, permastun whenever he wants (for mobs), and a large portion of his DPS does not consume ammo in any way. I have zero problems with the Assault being able to out-DPS him, considering that the advanced classes are supposed to be different, not better.

    The Assault's critstun is what sets him apart. They're ministuns, so focus-stunning something down is goinng to require a lot of concentrated effort, even with the increased crit rate of Harvester, in addition to burning a vast majority of his energy. Yes, his DPS will be powerful and his ministuns are going to be awesome for shutting down bosses, but he's going to require a lot of management if he wants his energy to last for any significant amount of time.

    As for movespeed. I would be perfectly fine with the Assault losing MS once he brings out the more powerful abilities, so my suggestion is this:
    No more MS loss on Concentrated Fire (because it's the T1 meant for general use, the skill is in not wasting your energy because the duration lasts longer than the cooldown)
    20% MS loss during Blood Frenzy (trading movespeed for ministuns and damage)
    10% MS loss during Harvester of Sorrow (trading movespeed for lots of damage and potential disables (because as you'll notice, Harvester has no disable properties of its own)

    What do you guys think? On the whole, it's a 30% MS loss, which is a vast consequence when you consider the Assault no longer has Charge to get him out of trouble. It's not something that will get you killed instantly, but it'll definitely make players think.
  15. Ryan III

    Ryan III Well-Known Member

    charge works both ways, it can get you out, or get you killed.

    Lol you got overwatch from a song?
  16. Lord NiteShade
    • Wiki Founder
    • Community Leader

    Lord NiteShade NOTD Staff: Wiki Founder/TeamSpeak Admin

    [video=youtube]http://www.youtube.com/watch?v=YyQDr4ZBvAA[/video]
  17. Kith
    • Development Team
    • Designer

    Kith NOTD Staff: Anti-Fun Wizard Skeleton

    I put in at least one song reference per rework. Invaders Must Die, No Quarter, March of the Machine, Dogs of War, Dogs, The Final Cut, Fire Up, so on and so forth. If I've touched it and there's a new skill or a name change, there's a song reference.
  18. MSluiter

    MSluiter Member

    I’m a little concerned about the usefulness of charge on the Protection tree. Typically the stuff you want to stun, you are stunning because you don’t want to tank it, so charging into the middle of it might not be the best idea. Charge on Protection could be more fun, but possibly less useful in “stun” situations.

    Things you typically stun and don’t want to run into: Tartarus (beaslings, banelings, blindlings, and you usually try and stun when his back is to the team), Ere2 (summoning minions or running), Agrons, Devourers, Banelings, Beaslings, Dome mobs at C/D. These are the thing you really don’t want to get hit by anyway. Not to mention Protection Assault and a medic go hand and hand and it’s going to be much harder to heal/shield when the Assault is jumping all over the place. Just something to consider.

    Arms, I’m not too concerned about. Just don’t go too crazy with the DPS. Also, there is still the issue of energy. Super shallow pool and slow ass regen.
  19. Kith
    • Development Team
    • Designer

    Kith NOTD Staff: Anti-Fun Wizard Skeleton

    I use Charge a lot. I'm one of those Assaults that shuns the Chaingun and prefers the Shotgun, so to say that I get a lot of close combat is something of an understatement. I can personally attest that it is possible to sideswipe banelings and not get hit by their splash damage upon dying. The reason for this is that the banelings get knocked back first, then register the damage and die. Considering the current "sit in one spot and be invulnerable" status of the Assault, I wouldn't mind some more skill being involved to bring a more active playstyle to our big blue dope.
  20. Lord NiteShade
    • Wiki Founder
    • Community Leader

    Lord NiteShade NOTD Staff: Wiki Founder/TeamSpeak Admin

    Charge reminds me of something from DragonballZ, you can zip in and out in an instant. If you just click a point and watch your character facetank, you're using the skill poorly. I can make up to 3 rapid course corrections per charge, which looks like a lightning bolt. A 90 degree turn to get in, and get out, is plenty sufficient to deal stun, and gtfo.

Share This Page