I had been holding off on publishing this little tidbit until I had time to do a thorough presentation of how to clean up the balance problem. But now that this particular horse has left the barn, I suppose it's better to make this info available to those who might puzzle through it rather than wait till I have time to give a thorough explanation.
This animationdw trick is a great thing, and it's a big part of my ongoing rebalancing efforts. (And also a big delay because it means re-redoing all the weapon based skills in the vanilla game.) However, it introduces a big balance problem of its own: Triggering on-hit effects at a doubled rate is just stupidly, amazingly, game-breakingly overpowered. I've got a fix working, but it's quite involved.
To make weapon-based skills hit with both weapons, but not double-trigger on-hit effects, do the following: On the weapon-based skills: For damage-shape-based skills, simply add the same animation that already exists as the animationdw.
Missile-based skills do not work with this out of the box. The animationdw has no effect. You need to refactor the skill by using a [EXECUTE_SKILL] inside an [EVENT_MISSILEHIT] to invoke a secondary skill that actually deals the damage and has its own animationdw. Here' s a sample:
Spoiler (hover to show) [SKILL] <STRING>NAME:Wolfpack_Missle_Hit <TRANSLATE>DISPLAYNAME:Wolfpack Missle Hit <STRING>ACTIVATION_TYPE:PROC <STRING>TARGET_ALIGNMENT:EVIL <STRING>TARGET_TYPE:TARGET <STRING>ANIMATION:idle_short <STRING>ANIMATIONDW:idle_short <FLOAT>RANGE:100 <BOOL>CAN_PROC_FROM_SKILL:0 <FLOAT>FINDTARGETANGLE:360 <FLOAT>TURNRATEOVERRIDE:-1 <BOOL>HIDDEN:1 <BOOL>DONT_STOP_ON_DEATH:1 <BOOL>CAN_BE_SILENCED:0 <INTEGER64>UNIQUE_GUID:-2119659514815718862 [LEVEL1] [EVENT_START] <FLOAT>WEAPONDAMAGEPCT:5 <FLOAT>SOAKSCALEPCT:5 <FLOAT>CHARGESCALEPCT:10 <BOOL>USEDPS:1 <BOOL>APPLYEFFECTS:1 <BOOL>BUILD_CHARGE:1 [/EVENT_START] [/LEVEL1] .... [/SKILL]
As best I can tell, you can use any animation at all for the secondary skill because it will never actually play. But just to be safe I created a super-short animation that should be unnoticeable if the game does decide to play it in situations I don't know about yet:
Spoiler (hover to show) Add to HUM_M.ANIMATION and HUM_F.ANIMATION: [ANIMATION] <STRING>FILE:idle.skeleton <STRING>NAME:Idle_Short <FLOAT>DURATION:0.00001 [/ANIMATION]
On the player unit: Add the following two affixes to every class. (You can put this in base, but outlander needs its own copy because it overrides the base affix block).
Spoiler (hover to show) [AFFIX] <STRING>NAME:DW_ALTERNATOR <INTEGER>RANK:0 <INTEGER>MIN_SPAWN_RANGE:0 <INTEGER>MAX_SPAWN_RANGE:100 <FLOAT>DURATION:0 <INTEGER>WEIGHT:0 <INTEGER>SLOTS_OCCUPY:0 [EFFECT] <STRING>NAME:DW_ALTERNATOR <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:ALWAYS <STRING>TYPE:CAST SKILL ON MELEE SKILL STRIKE <BOOL>SAVE:true <BOOL>EXCLUSIVE:true <FLOAT>MIN:100 <FLOAT>MAX:100 [/EFFECT] [/AFFIX]
Spoiler (hover to show) [AFFIX] <STRING>NAME:DW_ALTERNATOR_RANGED <INTEGER>RANK:0 <INTEGER>MIN_SPAWN_RANGE:0 <INTEGER>MAX_SPAWN_RANGE:100 <FLOAT>DURATION:0 <INTEGER>WEIGHT:0 <INTEGER>SLOTS_OCCUPY:0 [EFFECT] <STRING>NAME:DW_ALTERNATOR <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:ALWAYS <STRING>TYPE:CAST SKILL ON RANGED SKILL STRIKE <BOOL>SAVE:true <BOOL>EXCLUSIVE:true <FLOAT>MIN:100 <FLOAT>MAX:100 [/EFFECT] [/AFFIX]
Create these custom stats: Spoiler (hover to show) [STAT] <STRING>NAME:dual_wield_alternate_state <INTEGER64>UNIQUE_GUID:-3914010760389292317 <TRANSLATE>DISPLAYNAME:dual_wield_alternate_state <STRING>TYPE:TYPE_INT <FLOAT>MAXVALUE:2 <FLOAT>INCREMENTVALUE:-2 <BOOL>REFRESHES:1 <FLOAT>DURATION:0.25 [/STAT]
Spoiler (hover to show) [STAT] <STRING>NAME:dual_wield_alternate_toggle <INTEGER64>UNIQUE_GUID:-2614573740340706565 <TRANSLATE>DISPLAYNAME:dual_wield_alternate_toggle <STRING>TYPE:TYPE_INT <FLOAT>MAXVALUE:1 [/STAT]
Create this ridiculously complex skill: Spoiler (hover to show) [SKILL] <STRING>NAME:DW_ALTERNATOR <TRANSLATE>DISPLAYNAME:Dual wield alternator <STRING>ACTIVATION_TYPE:NORMAL <STRING>TARGET_ALIGNMENT:EVIL <STRING>TARGET_TYPE:SELF <FLOAT>RANDOMRANGE:0 <FLOAT>RANGE:100 <FLOAT>TURNRATEOVERRIDE:0 <BOOL>HIDDEN:1 <BOOL>CAN_BE_SILENCED:0 <INTEGER64>UNIQUE_GUID:-3752619400822494624 [LEVEL1] <FLOAT>RANDOMRANGE:0 [EVENT_START] [EFFECTS] [EFFECT] <STRING>NAME:dual_wield_alternate_toggle <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:INSTANT <STRING>TYPE:SET STAT <FLOAT>MIN:0 <FLOAT>MAX:0 <FLOAT>CHANCE:100 [/EFFECT] [/EFFECTS] [/EVENT_START] [EVENT_START] [EFFECTS] <STRING>TARGET:SELF [EFFECT] <STRING>NAME:dual_wield_alternate_state <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:INSTANT <STRING>TYPE:SET STAT <FLOAT>MIN:0 <FLOAT>MAX:0 <FLOAT>CHANCE:100 [/EFFECT] [EFFECT] <STRING>NAME:dual_wield_alternate_toggle <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:INSTANT <STRING>TYPE:SET STAT <FLOAT>MIN:1 <FLOAT>MAX:1 <FLOAT>CHANCE:100 [/EFFECT] [/EFFECTS] [STATWATCHER] <STRING>STAT:CHARACTER DPS LEFTHAND <STRING>PRIMARY_TARGET_TYPE:SELF <STRING>SECONDARY_TARGET_TYPE:VALUE <STRING>WATCH_TYPE:EQUAL TO <FLOAT>SECONDARY_VALUE:0 [/STATWATCHER] [/EVENT_START] [EVENT_START] [EFFECTS] <STRING>TARGET:SELF [EFFECT] <STRING>NAME:dual_wield_alternate_state <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:INSTANT <STRING>TYPE:SET STAT <FLOAT>MIN:0 <FLOAT>MAX:0 <FLOAT>CHANCE:100 [/EFFECT] [EFFECT] <STRING>NAME:dual_wield_alternate_toggle <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:INSTANT <STRING>TYPE:SET STAT <FLOAT>MIN:1 <FLOAT>MAX:1 <FLOAT>CHANCE:100 [/EFFECT] [/EFFECTS] [STATWATCHER] <STRING>STAT:CHARACTER DPS RIGHTHAND <STRING>PRIMARY_TARGET_TYPE:SELF <STRING>SECONDARY_TARGET_TYPE:VALUE <STRING>WATCH_TYPE:EQUAL TO <FLOAT>SECONDARY_VALUE:0 [/STATWATCHER] [/EVENT_START] [EVENT_START] [EFFECTS] <STRING>TARGET:SELF [EFFECT] <STRING>NAME:dual_wield_alternate_state <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:INSTANT <STRING>TYPE:SET STAT <FLOAT>MIN:2 <FLOAT>MAX:2 <FLOAT>CHANCE:100 [/EFFECT] [EFFECT] <STRING>NAME:dual_wield_alternate_toggle <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:INSTANT <STRING>TYPE:SET STAT <FLOAT>MIN:1 <FLOAT>MAX:1 <FLOAT>CHANCE:100 [/EFFECT] [/EFFECTS] [STATWATCHER] <STRING>STAT:DUAL_WIELD_ALTERNATE_STATE <STRING>PRIMARY_TARGET_TYPE:SELF <STRING>SECONDARY_TARGET_TYPE:VALUE <STRING>WATCH_TYPE:NOT EQUAL TO <FLOAT>SECONDARY_VALUE:2 [/STATWATCHER] [STATWATCHER] <STRING>STAT:DUAL_WIELD_ALTERNATE_TOGGLE <STRING>PRIMARY_TARGET_TYPE:SELF <STRING>SECONDARY_TARGET_TYPE:VALUE <STRING>WATCH_TYPE:EQUAL TO <FLOAT>SECONDARY_VALUE:0 [/STATWATCHER] [/EVENT_START] [EVENT_START] [EFFECTS] [EFFECT] <STRING>NAME:DUAL_WIELD_ALTERNATE_STATE <STRING>ACTIVATION:DYNAMIC <STRING>DURATION:INSTANT <STRING>TYPE:SET STAT <FLOAT>MIN:1 <FLOAT>MAX:1 <FLOAT>CHANCE:100 [/EFFECT] [/EFFECTS] [STATWATCHER] <STRING>STAT:DUAL_WIELD_ALTERNATE_STATE <STRING>PRIMARY_TARGET_TYPE:SELF <STRING>SECONDARY_TARGET_TYPE:VALUE <STRING>WATCH_TYPE:NOT EQUAL TO <FLOAT>SECONDARY_VALUE:1 [/STATWATCHER] [STATWATCHER] <STRING>STAT:DUAL_WIELD_ALTERNATE_TOGGLE <STRING>PRIMARY_TARGET_TYPE:SELF <STRING>SECONDARY_TARGET_TYPE:VALUE <STRING>WATCH_TYPE:EQUAL TO <FLOAT>SECONDARY_VALUE:0 [/STATWATCHER] [/EVENT_START] [/LEVEL1] [/SKILL]
Don't muck with it. I've tested this very thoroughly and it works right 100% of the time. There's lots of changes that look like they should accomplish the same thing with less overhead and/or complexity, but they either don't work at all, or manifest subtle bugs (often due to utterly irrational quirks in the game engine). Trust me, I tried lots of variants. (More detail: I think there's some kind of use-before-initialize bug infecting the whole stat system that leads to crazy statwatcher results for no apparent reason in some situations.)
Inside EVERY triggerable skill: Add this statwatcher to the root [SKILL] block.
Spoiler (hover to show) [STATWATCHER] <STRING>STAT:DUAL_WIELD_ALTERNATE_STATE <STRING>PRIMARY_TARGET_TYPE:SELF <STRING>SECONDARY_TARGET_TYPE:VALUE <STRING>WATCH_TYPE:NOT EQUAL TO <FLOAT>SECONDARY_VALUE:2 [/STATWATCHER]
I know I've given basically zero explanation for why this works. Hopefully you can figure it out. If not, I'll have time to explain better in a month or so.