Skip to content

Commit bd3acf8

Browse files
authored
Merge pull request #104 from wowsims/feature/paladin
Retribution / Protection implementation
2 parents 387632f + cf2ac43 commit bd3acf8

139 files changed

Lines changed: 11643 additions & 5339 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

assets/database/db.json

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18034,7 +18034,6 @@
1803418034
{"id":740,"name":"Tranquility","icon":"spell_nature_tranquility","hasBuff":true},
1803518035
{"id":768,"name":"Cat Form","icon":"ability_druid_catform","hasBuff":true},
1803618036
{"id":770,"name":"Faerie Fire","icon":"spell_nature_faeriefire","hasBuff":true},
18037-
{"id":779,"name":"Swipe","icon":"inv_misc_monsterclaw_03"},
1803818037
{"id":879,"name":"Exorcism","icon":"spell_holy_excorcism_02"},
1803918038
{"id":1079,"name":"Rip","icon":"ability_ghoulfrenzy","hasBuff":true},
1804018039
{"id":1130,"name":"Hunter's Mark","icon":"ability_hunter_snipershot","hasBuff":true},
@@ -18212,6 +18211,7 @@
1821218211
{"id":20035,"name":"Enchant 2H Weapon - Major Spirit","icon":"inv_misc_note_01"},
1821318212
{"id":20036,"name":"Enchant 2H Weapon - Major Intellect","icon":"inv_misc_note_01"},
1821418213
{"id":20066,"name":"Repentance","icon":"spell_holy_prayerofhealing","hasBuff":true},
18214+
{"id":20154,"name":"Seal of Righteousness","icon":"spell_holy_righteousnessaura","hasBuff":true},
1821518215
{"id":20164,"name":"Seal of Justice","icon":"spell_holy_sealofwrath","hasBuff":true},
1821618216
{"id":20165,"name":"Seal of Insight","icon":"spell_holy_healingaura","hasBuff":true},
1821718217
{"id":20167,"name":"Seal of Insight","icon":"spell_holy_healingaura"},
@@ -18250,6 +18250,7 @@
1825018250
{"id":24165,"name":"Hoodoo Hex","icon":"spell_shadow_impphaseshift"},
1825118251
{"id":24167,"name":"Prophetic Aura","icon":"spell_holy_holyprotection"},
1825218252
{"id":24168,"name":"Animist's Caress","icon":"spell_nature_reincarnation"},
18253+
{"id":24275,"name":"Hammer of Wrath","icon":"spell_paladin_hammerofwrath"},
1825318254
{"id":24302,"name":"Eternium Fishing Line","icon":"inv_fabric_mageweave_02"},
1825418255
{"id":24420,"name":"Zandalar Signet of Serenity","icon":"spell_holy_powerwordshield"},
1825518256
{"id":24421,"name":"Zandalar Signet of Mojo","icon":"inv_jewelry_ring_46"},
@@ -18264,6 +18265,7 @@
1826418265
{"id":25084,"name":"Enchant Cloak - Subtlety","icon":"inv_misc_note_01"},
1826518266
{"id":25086,"name":"Enchant Cloak - Dodge","icon":"inv_misc_note_01"},
1826618267
{"id":25780,"name":"Righteous Fury","icon":"spell_holy_sealoffury","hasBuff":true},
18268+
{"id":25956,"name":"Sanctity of Battle","icon":"inv_sword_136","hasBuff":true},
1826718269
{"id":26016,"name":"Vindication","icon":"spell_holy_vindication","hasBuff":true},
1826818270
{"id":26023,"name":"Pursuit of Justice","icon":"ability_paladin_veneration","hasBuff":true},
1826918271
{"id":26297,"name":"Berserking","icon":"racial_troll_berserk","hasBuff":true},
@@ -18327,6 +18329,10 @@
1832718329
{"id":31372,"name":"Runic Spellthread","icon":"spell_nature_astralrecalgroup"},
1832818330
{"id":31661,"name":"Dragon's Breath","icon":"inv_misc_head_dragon_01","hasBuff":true},
1832918331
{"id":31687,"name":"Summon Water Elemental","icon":"spell_frost_summonwaterelemental_2"},
18332+
{"id":31801,"name":"Seal of Truth","icon":"spell_holy_sealofvengeance","hasBuff":true},
18333+
{"id":31803,"name":"Censure","icon":"spell_holy_sealofvengeance","hasBuff":true},
18334+
{"id":31821,"name":"Devotion Aura","icon":"spell_holy_auramastery","hasBuff":true},
18335+
{"id":31850,"name":"Ardent Defender","icon":"spell_holy_ardentdefender","hasBuff":true},
1833018336
{"id":31884,"name":"Avenging Wrath","icon":"spell_holy_avenginewrath","hasBuff":true},
1833118337
{"id":31935,"name":"Avenger's Shield","icon":"spell_holy_avengersshield","hasBuff":true},
1833218338
{"id":32379,"name":"Shadow Word: Death","icon":"spell_shadow_demonicfortitude"},
@@ -18386,6 +18392,7 @@
1838618392
{"id":35495,"name":"Nethercleft Leg Armor","icon":"inv_misc_armorkit_25"},
1838718393
{"id":36554,"name":"Shadowstep","icon":"ability_rogue_shadowstep","hasBuff":true},
1838818394
{"id":42231,"name":"Hurricane","icon":"spell_nature_cyclone"},
18395+
{"id":42463,"name":"Seal of Truth","icon":"spell_holy_sealofvengeance"},
1838918396
{"id":42620,"name":"Enchant Weapon - Greater Agility","icon":"inv_misc_note_01"},
1839018397
{"id":42687,"name":"Adamantite Weapon Chain","icon":"spell_frost_chainsofice"},
1839118398
{"id":42974,"name":"Enchant Weapon - Executioner","icon":"inv_misc_note_01"},
@@ -18473,8 +18480,11 @@
1847318480
{"id":53344,"name":"Rune of the Fallen Crusader","icon":"trade_engraving"},
1847418481
{"id":53351,"name":"Kill Shot","icon":"ability_hunter_assassinate2"},
1847518482
{"id":53376,"name":"Sanctified Wrath","icon":"ability_paladin_sanctifiedwrath","hasBuff":true},
18483+
{"id":53385,"name":"Divine Storm","icon":"ability_paladin_divinestorm"},
18484+
{"id":53503,"name":"Sword of Light","icon":"ability_paladin_sheathoflight","hasBuff":true},
1847618485
{"id":53592,"name":"Guarded by the Light","icon":"ability_paladin_touchedbylight","hasBuff":true},
18477-
{"id":54428,"name":"Divine Plea","icon":"spell_holy_aspiration","hasBuff":true},
18486+
{"id":53595,"name":"Hammer of the Righteous","icon":"ability_paladin_hammeroftherighteous"},
18487+
{"id":53600,"name":"Shield of the Righteous","icon":"ability_paladin_shieldofvengeance"},
1847818488
{"id":54446,"name":"Rune of Swordbreaking","icon":"trade_engraving"},
1847918489
{"id":54447,"name":"Rune of Spellbreaking","icon":"trade_engraving"},
1848018490
{"id":54637,"name":"Blood of the North","icon":"inv_weapon_shortblade_79","hasBuff":true},
@@ -18516,6 +18526,7 @@
1851618526
{"id":58129,"name":"Inscription of Kings","icon":"spell_holy_sealofwisdom"},
1851718527
{"id":58410,"name":"Master Poisoner","icon":"ability_creature_poison_06","hasBuff":true},
1851818528
{"id":58413,"name":"Savage Combat","icon":"ability_creature_disease_03","hasBuff":true},
18529+
{"id":59578,"name":"The Art of War","icon":"ability_paladin_artofwar","hasBuff":true},
1851918530
{"id":59619,"name":"Enchant Weapon - Accuracy","icon":"inv_misc_enchantedscroll"},
1852018531
{"id":59621,"name":"Enchant Weapon - Berserking","icon":"inv_misc_enchantedscroll"},
1852118532
{"id":59625,"name":"Enchant Weapon - Black Magic","icon":"inv_misc_enchantedscroll"},
@@ -18550,7 +18561,6 @@
1855018561
{"id":61119,"name":"Master's Inscription of the Pinnacle","icon":"trade_engraving"},
1855118562
{"id":61120,"name":"Master's Inscription of the Storm","icon":"trade_engraving"},
1855218563
{"id":61468,"name":"Diamond-cut Refractor Scope","icon":"ability_hunter_rapidregeneration"},
18553-
{"id":62078,"name":"Swipe","icon":"inv_misc_monsterclaw_03"},
1855418564
{"id":62158,"name":"Rune of the Stoneskin Gargoyle","icon":"trade_engraving"},
1855518565
{"id":62201,"name":"Titanium Plating","icon":"inv_shield_19"},
1855618566
{"id":62256,"name":"Enchant Bracer - Major Stamina","icon":"inv_misc_enchantedscroll"},
@@ -18567,6 +18577,7 @@
1856718577
{"id":64441,"name":"Enchant Weapon - Blade Ward","icon":"inv_misc_enchantedscroll"},
1856818578
{"id":64579,"name":"Enchant Weapon - Blood Draining","icon":"inv_misc_enchantedscroll"},
1856918579
{"id":65855,"name":"Insect Swarm","icon":"spell_nature_insectswarm","hasBuff":true},
18580+
{"id":66235,"name":"Ardent Defender","icon":"spell_holy_holybolt"},
1857018581
{"id":67839,"name":"Mind Amplification Dish","icon":"trade_engraving"},
1857118582
{"id":70164,"name":"Rune of the Nerubian Carapace","icon":"trade_engraving"},
1857218583
{"id":71692,"name":"Enchant Gloves - Angler","icon":"inv_enchant_formulagood_01"},
@@ -18630,7 +18641,7 @@
1863018641
{"id":75175,"name":"Darkglow Embroidery","icon":"trade_engraving"},
1863118642
{"id":75178,"name":"Swordguard Embroidery","icon":"trade_engraving"},
1863218643
{"id":76659,"name":"Mastery: Wild Quiver","icon":"ability_hunter_wildquiver","hasBuff":true},
18633-
{"id":76672,"name":"Mastery: Hand of Light","icon":"ability_paladin_blessedhands","hasBuff":true},
18644+
{"id":76671,"name":"Mastery: Divine Bulwark","icon":"spell_holy_holyprotection","hasBuff":true},
1863418645
{"id":76808,"name":"Mastery: Executioner","icon":"inv_axe_06","hasBuff":true},
1863518646
{"id":76857,"name":"Mastery: Critical Block","icon":"ability_warrior_criticalblock","hasBuff":true},
1863618647
{"id":76858,"name":"Opportunity Strike","icon":"ability_backstab"},
@@ -18665,12 +18676,15 @@
1866518676
{"id":84425,"name":"Cardboard Assassin","icon":"trade_engraving"},
1866618677
{"id":84427,"name":"Grounded Plasma Shield","icon":"trade_engraving"},
1866718678
{"id":84839,"name":"Vengeance","icon":"spell_shadow_charm","hasBuff":true},
18679+
{"id":84963,"name":"Inquisition","icon":"spell_paladin_inquisition","hasBuff":true},
1866818680
{"id":85007,"name":"Fur Lining - Stamina","icon":"trade_engraving"},
1866918681
{"id":85008,"name":"Fur Lining - Agility","icon":"trade_engraving"},
1867018682
{"id":85009,"name":"Fur Lining - Strength","icon":"trade_engraving"},
1867118683
{"id":85010,"name":"Fur Lining - Intellect","icon":"trade_engraving"},
1867218684
{"id":85256,"name":"Templar's Verdict","icon":"spell_paladin_templarsverdict"},
18685+
{"id":85416,"name":"Grand Crusader","icon":"inv_helmet_74","hasBuff":true},
1867318686
{"id":85499,"name":"Speed of Light","icon":"ability_paladin_speedoflight","hasBuff":true},
18687+
{"id":85673,"name":"Word of Glory","icon":"inv_helmet_96"},
1867418688
{"id":85804,"name":"Selfless Healer","icon":"ability_paladin_gaurdedbythelight","hasBuff":true},
1867518689
{"id":86091,"name":"Nethermancy","icon":"inv_enchant_essencenetherlarge","hasBuff":true},
1867618690
{"id":86172,"name":"Divine Purpose","icon":"spell_holy_divinepurpose","hasBuff":true},
@@ -18682,6 +18696,9 @@
1868218696
{"id":86524,"name":"Plate Specialization","icon":"inv_chest_plate12"},
1868318697
{"id":86525,"name":"Plate Specialization","icon":"inv_chest_plate12"},
1868418698
{"id":86529,"name":"Mail Specialization","icon":"inv_chest_chain_11"},
18699+
{"id":86659,"name":"Guardian of Ancient Kings","icon":"spell_holy_heroism","hasBuff":true},
18700+
{"id":86669,"name":"Guardian of Ancient Kings","icon":"spell_holy_heroism","hasBuff":true},
18701+
{"id":86698,"name":"Guardian of Ancient Kings","icon":"spell_holy_heroism","hasBuff":true},
1868518702
{"id":86700,"name":"Ancient Power","icon":"ability_paladin_blessedhands","hasBuff":true},
1868618703
{"id":86704,"name":"Ancient Fury","icon":"ability_paladin_sanctifiedwrath"},
1868718704
{"id":86847,"name":"Inscription of Unbreakable Quartz","icon":"inv_misc_gem_crystal_01"},
@@ -18696,6 +18713,7 @@
1869618713
{"id":86949,"name":"Cauterize","icon":"spell_fire_rune","hasBuff":true},
1869718714
{"id":87160,"name":"Surge of Darkness","icon":"ability_priest_surgeofdarkness","hasBuff":true},
1869818715
{"id":87172,"name":"Long Arm of the Law","icon":"ability_paladin_longarmofthelaw","hasBuff":true},
18716+
{"id":88263,"name":"Hammer of the Righteous","icon":"ability_paladin_hammeroftherighteous"},
1869918717
{"id":88747,"name":"Wild Mushroom","icon":"druid_ability_wildmushroom_a"},
1870018718
{"id":88751,"name":"Wild Mushroom: Detonate","icon":"druid_ability_wildmushroom_b"},
1870118719
{"id":89744,"name":"Wizardry","icon":"inv_enchant_essencemagiclarge","hasBuff":true},
@@ -18719,6 +18737,7 @@
1871918737
{"id":100780,"name":"Jab","icon":"ability_monk_jab"},
1872018738
{"id":100784,"name":"Blackout Kick","icon":"ability_monk_roundhousekick"},
1872118739
{"id":100787,"name":"Tiger Palm","icon":"ability_monk_tigerpalm"},
18740+
{"id":101423,"name":"Seal of Righteousness","icon":"spell_holy_righteousnessaura"},
1872218741
{"id":101546,"name":"Spinning Crane Kick","icon":"ability_monk_cranekick_new","hasBuff":true},
1872318742
{"id":101598,"name":"Drakehide Leg Armor","icon":"inv_misc_cataclysmarmorkit_08"},
1872418743
{"id":102051,"name":"Frostjaw","icon":"ability_mage_frostjaw","hasBuff":true},
@@ -18767,6 +18786,7 @@
1876718786
{"id":104445,"name":"Enchant Off-Hand - Major Intellect","icon":"inv_misc_enchantedscroll"},
1876818787
{"id":105593,"name":"Fist of Justice","icon":"spell_holy_fistofjustice","hasBuff":true},
1876918788
{"id":105622,"name":"Clemency","icon":"ability_paladin_clemency","hasBuff":true},
18789+
{"id":105805,"name":"Sanctuary","icon":"spell_nature_lightningshield","hasBuff":true},
1877018790
{"id":105809,"name":"Holy Avenger","icon":"ability_paladin_holyavenger","hasBuff":true},
1877118791
{"id":106707,"name":"Faerie Swarm","icon":"spell_druid_swarm","hasBuff":true},
1877218792
{"id":106731,"name":"Incarnation","icon":"spell_druid_incarnation","hasBuff":true},
@@ -18866,6 +18886,7 @@
1886618886
{"id":114163,"name":"Eternal Flame","icon":"inv_torch_thrown","hasBuff":true},
1886718887
{"id":114165,"name":"Holy Prism","icon":"spell_paladin_holyprism"},
1886818888
{"id":114556,"name":"Purgatory","icon":"inv_misc_shadowegg","hasBuff":true},
18889+
{"id":114637,"name":"Bastion of Glory","icon":"achievement_dungeon_ulduarraid_misc_03","hasBuff":true},
1886918890
{"id":114923,"name":"Nether Tempest","icon":"spell_mage_nethertempest","hasBuff":true},
1887018891
{"id":115008,"name":"Chi Torpedo","icon":"ability_monk_quitornado","hasBuff":true},
1887118892
{"id":115069,"name":"Stance of the Sturdy Ox","icon":"monk_stance_drunkenox","hasBuff":true},
@@ -18908,6 +18929,7 @@
1890818929
{"id":118636,"name":"Power Guard","icon":"ability_warrior_shieldbash","hasBuff":true},
1890918930
{"id":118675,"name":"Crouching Tiger, Hidden Chimera","icon":"ability_hunter_pet_chimera","hasBuff":true},
1891018931
{"id":118864,"name":"Combo Breaker: Tiger Palm","icon":"ability_monk_palmstrike","hasBuff":true},
18932+
{"id":119072,"name":"Holy Wrath","icon":"spell_holy_weaponmastery","hasBuff":true},
1891118933
{"id":119381,"name":"Leg Sweep","icon":"ability_monk_legsweep","hasBuff":true},
1891218934
{"id":119392,"name":"Charging Ox Wave","icon":"ability_monk_chargingoxwave","hasBuff":true},
1891318935
{"id":119582,"name":"Purifying Brew","icon":"inv_misc_beer_06"},
@@ -18997,6 +19019,7 @@
1899719019
{"id":131862,"name":"Cerulean Spellthread","icon":"inv_misc_thread_eternium"},
1899819020
{"id":131863,"name":"Pearlescent Spellthread","icon":"inv_bracer_69"},
1899919021
{"id":131894,"name":"A Murder of Crows","icon":"ability_hunter_murderofcrows","hasBuff":true},
19022+
{"id":132403,"name":"Shield of the Righteous","icon":"ability_paladin_shieldofvengeance","hasBuff":true},
1900019023
{"id":132469,"name":"Typhoon","icon":"ability_druid_typhoon"},
1900119024
{"id":134871,"name":"Enchant Cloak - PvP Power","icon":"trade_engraving"},
1900219025
{"id":136336,"name":"Stance of the Wise Serpent","icon":"monk_stance_wiseserpent","hasBuff":true},

proto/apl.proto

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ message APLAction {
8585
}
8686
}
8787

88-
// NextIndex: 101
88+
// NextIndex: 102
8989
message APLValue {
9090
UUID uuid = 87;
9191

@@ -215,6 +215,7 @@ message APLValue {
215215
APLValueMonkCurrentChi monk_current_chi = 95;
216216
APLValueMonkMaxChi monk_max_chi = 96;
217217
APLValueBrewmasterMonkCurrentStaggerPercent brewmaster_monk_current_stagger_percent = 100;
218+
APLValueProtectionPaladinDamageTakenLastGlobal protection_paladin_damage_taken_last_global = 101;
218219
}
219220
}
220221

@@ -700,3 +701,4 @@ message APLValueShamanFireElementalDuration {}
700701
message APLValueMonkCurrentChi {}
701702
message APLValueMonkMaxChi {}
702703
message APLValueBrewmasterMonkCurrentStaggerPercent {}
704+
message APLValueProtectionPaladinDamageTakenLastGlobal {}

proto/common.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ message IndividualBuffs {
503503
// Other Buffs
504504
int32 unholy_frenzy_count = 12;
505505
TristateEffect tricks_of_the_trade = 101; // "Regular" = Glyphed, "Improved" = un-Glyphed
506-
int32 divine_guardian_count = 23;
506+
int32 devotion_aura_count = 23;
507507
int32 pain_suppression_count = 24;
508508
int32 hand_of_sacrifice_count = 25;
509509
int32 guardian_spirit_count = 26;

proto/monk.proto

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package proto;
33

44
option go_package = "./proto";
55

6-
import "common.proto";
76
// DO NOT REMOVE THE COMMENTS
87
// BEGIN GENERATED
98
// MonkTalents message.

proto/paladin.proto

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,6 @@ enum Blessings {
8787
BlessingOfMight = 2;
8888
}
8989

90-
enum PaladinAura {
91-
Devotion = 0;
92-
Retribution = 1;
93-
Resistance = 2;
94-
}
95-
9690
enum PaladinSeal {
9791
Truth = 0;
9892
Justice = 1;
@@ -102,8 +96,6 @@ enum PaladinSeal {
10296

10397
message PaladinOptions {
10498
PaladinSeal seal = 2;
105-
PaladinAura aura = 3;
106-
bool snapshot_guardian = 4;
10799
}
108100

109101
message RetributionPaladin {

sim/common/cata/other_effects.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ func init() {
279279
},
280280
})
281281

282-
character.AddDynamicDamageTakenModifier(func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) {
282+
character.AddDynamicDamageTakenModifier(func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult, isPeriodic bool) {
283283
if absorbAura.IsActive() && result.Damage > 0 && totalAbsorbed < maxShieldStrength {
284284
remainingAbsorb := maxShieldStrength - totalAbsorbed
285285
absorbedDamage := min(result.Damage*0.2, remainingAbsorb)

sim/core/aura.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,22 @@ func (aura *Aura) ExpiresAt() time.Duration {
253253
return aura.expires
254254
}
255255

256+
// Adds a handler to be called OnInit, in addition to any current handlers.
257+
// We then return the Aura for chaining
258+
func (aura *Aura) ApplyOnInit(newOnInit OnInit) *Aura {
259+
oldOnInit := aura.OnInit
260+
if oldOnInit == nil {
261+
aura.OnInit = newOnInit
262+
} else {
263+
aura.OnInit = func(aura *Aura, sim *Simulation) {
264+
oldOnInit(aura, sim)
265+
newOnInit(aura, sim)
266+
}
267+
}
268+
269+
return aura
270+
}
271+
256272
// Adds a handler to be called OnGain, in addition to any current handlers.
257273
func (aura *Aura) ApplyOnGain(newOnGain OnGain) *Aura {
258274
oldOnGain := aura.OnGain
@@ -268,6 +284,20 @@ func (aura *Aura) ApplyOnGain(newOnGain OnGain) *Aura {
268284
return aura
269285
}
270286

287+
func (aura *Aura) AttachDependentAura(sibling *Aura) *Aura {
288+
return aura.ApplyOnGain(func(aura *Aura, sim *Simulation) {
289+
sibling.Activate(sim)
290+
}).ApplyOnExpire(func(aura *Aura, sim *Simulation) {
291+
sibling.Deactivate(sim)
292+
}).ApplyOnStacksChange(func(aura *Aura, sim *Simulation, oldStacks, newStacks int32) {
293+
if sibling.MaxStacks == 0 {
294+
return
295+
}
296+
297+
sibling.SetStacks(sim, newStacks)
298+
})
299+
}
300+
271301
// Adds a handler to be called OnExpire, in addition to any current handlers.
272302
func (aura *Aura) ApplyOnExpire(newOnExpire OnExpire) *Aura {
273303
oldOnExpire := aura.OnExpire
@@ -283,6 +313,22 @@ func (aura *Aura) ApplyOnExpire(newOnExpire OnExpire) *Aura {
283313
return aura
284314
}
285315

316+
// Adds a handler to be called OnStacksChange, in addition to any current handlers.
317+
// We then return the Aura for chaining
318+
func (aura *Aura) ApplyOnStacksChange(newOnStacksChange OnStacksChange) *Aura {
319+
oldOnStacksChange := aura.OnStacksChange
320+
if oldOnStacksChange == nil {
321+
aura.OnStacksChange = newOnStacksChange
322+
} else {
323+
aura.OnStacksChange = func(aura *Aura, sim *Simulation, oldStacks int32, newStacks int32) {
324+
oldOnStacksChange(aura, sim, oldStacks, newStacks)
325+
newOnStacksChange(aura, sim, oldStacks, newStacks)
326+
}
327+
}
328+
329+
return aura
330+
}
331+
286332
type AuraFactory func(*Simulation) *Aura
287333

288334
// Callback for doing something on reset.

0 commit comments

Comments
 (0)