@@ -436,6 +436,7 @@ struct mage_t final : public player_t
436
436
cooldown_t* comet_storm;
437
437
cooldown_t* cone_of_cold;
438
438
cooldown_t* dragons_breath;
439
+ cooldown_t* excess_frost;
439
440
cooldown_t* fire_blast;
440
441
cooldown_t* flurry;
441
442
cooldown_t* from_the_ashes;
@@ -2389,19 +2390,17 @@ struct mage_spell_t : public spell_t
2389
2390
frost->expire();
2390
2391
}
2391
2392
2392
- int fire_before = fire->check();
2393
- int frost_before = frost->check();
2394
-
2395
2393
if ( is_fire )
2396
2394
fire->trigger( empowerment ? fire->max_stack() : -1 );
2397
2395
2398
2396
if ( is_frost )
2399
2397
frost->trigger( empowerment ? frost->max_stack() : -1 );
2400
2398
2401
- if ( fire_before < fire->check() && fire->at_max_stacks() )
2399
+ if ( empowerment )
2400
+ {
2402
2401
p()->buffs.excess_fire->trigger();
2403
- if ( frost_before < frost->check() && frost->at_max_stacks() )
2404
2402
p()->buffs.excess_frost->trigger();
2403
+ }
2405
2404
2406
2405
// Frostfire spells don't seem to trigger Severe Temperatures
2407
2406
if ( !( is_fire && is_frost ) )
@@ -4301,6 +4300,9 @@ struct comet_storm_t final : public frost_mage_spell_t
4301
4300
{
4302
4301
frost_mage_spell_t::execute();
4303
4302
4303
+ if ( !isothermic )
4304
+ p()->buffs.excess_fire->trigger();
4305
+
4304
4306
if ( p()->action.isothermic_meteor )
4305
4307
p()->action.isothermic_meteor->execute_on_target( target );
4306
4308
}
@@ -4523,11 +4525,7 @@ struct fireball_t final : public fire_mage_spell_t
4523
4525
4524
4526
void impact( action_state_t* s ) override
4525
4527
{
4526
- // TODO: FFB is missing the "not a proc" attribute that other impact snapshot spells have
4527
- bool old_proc = frostfire ? true : proc;
4528
- std::swap( proc, old_proc );
4529
4528
fire_mage_spell_t::impact( s );
4530
- std::swap( proc, old_proc );
4531
4529
4532
4530
if ( result_is_hit( s->result ) )
4533
4531
{
@@ -4823,10 +4821,11 @@ struct flurry_bolt_t final : public frost_mage_spell_t
4823
4821
if ( !result_is_hit( s->result ) )
4824
4822
return;
4825
4823
4826
- if ( s->chain_target == 0 && p()->buffs.excess_frost->check() )
4824
+ if ( s->chain_target == 0 && p()->buffs.excess_frost->check() && p()->cooldowns.excess_frost->up() )
4827
4825
{
4828
4826
p()->action.excess_ice_nova->execute_on_target( s->target );
4829
4827
p()->buffs.excess_frost->decrement();
4828
+ p()->cooldowns.excess_frost->start( p()->buffs.excess_frost->data().internal_cooldown() );
4830
4829
}
4831
4830
4832
4831
trigger_winters_chill( s );
@@ -5056,11 +5055,7 @@ struct frostbolt_t final : public frost_mage_spell_t
5056
5055
5057
5056
void impact( action_state_t* s ) override
5058
5057
{
5059
- // TODO: FFB is missing the "not a proc" attribute that other impact snapshot spells have
5060
- bool old_proc = frostfire ? true : proc;
5061
- std::swap( proc, old_proc );
5062
5058
frost_mage_spell_t::impact( s );
5063
- std::swap( proc, old_proc );
5064
5059
5065
5060
if ( result_is_hit( s->result ) )
5066
5061
{
@@ -5536,6 +5531,7 @@ struct ice_lance_t final : public custom_state_spell_t<frost_mage_spell_t, ice_l
5536
5531
{
5537
5532
p()->action.frostfire_burst->execute_on_target( s->target );
5538
5533
p()->buffs.excess_fire->decrement();
5534
+ p()->buffs.excess_frost->trigger();
5539
5535
}
5540
5536
5541
5537
if ( frozen & FF_FINGERS_OF_FROST && frigid_pulse )
@@ -5724,10 +5720,12 @@ struct fire_blast_t final : public fire_mage_spell_t
5724
5720
5725
5721
if ( result_is_hit( s->result ) && s->chain_target == 0 )
5726
5722
{
5727
- if ( p()->buffs.excess_fire->check() )
5723
+ // As of 11.1, only triggers from Fire Blasts cast by Fire Mages.
5724
+ if ( p()->specialization() == MAGE_FIRE && p()->buffs.excess_fire->check() )
5728
5725
{
5729
5726
p()->action.frostfire_burst->execute_on_target( s->target );
5730
5727
p()->buffs.excess_fire->decrement();
5728
+ p()->buffs.excess_frost->trigger();
5731
5729
}
5732
5730
5733
5731
trigger_glorious_incandescence( s->target );
@@ -5943,10 +5941,12 @@ struct meteor_impact_t final : public fire_mage_spell_t
5943
5941
struct meteor_t final : public fire_mage_spell_t
5944
5942
{
5945
5943
timespan_t meteor_delay;
5944
+ const meteor_type type;
5946
5945
5947
- meteor_t( std::string_view n, mage_t* p, std::string_view options_str, meteor_type type = meteor_type::NORMAL ) :
5948
- fire_mage_spell_t( n, p, type == meteor_type::NORMAL ? p->talents.meteor : p->find_spell( 153561 ) ),
5949
- meteor_delay( p->find_spell( 177345 )->duration() )
5946
+ meteor_t( std::string_view n, mage_t* p, std::string_view options_str, meteor_type type_ = meteor_type::NORMAL ) :
5947
+ fire_mage_spell_t( n, p, type_ == meteor_type::NORMAL ? p->talents.meteor : p->find_spell( 153561 ) ),
5948
+ meteor_delay( p->find_spell( 177345 )->duration() ),
5949
+ type( type_ )
5950
5950
{
5951
5951
parse_options( options_str );
5952
5952
@@ -6001,6 +6001,9 @@ struct meteor_t final : public fire_mage_spell_t
6001
6001
{
6002
6002
fire_mage_spell_t::execute();
6003
6003
6004
+ if ( type != meteor_type::ISOTHERMIC )
6005
+ p()->buffs.excess_fire->trigger();
6006
+
6004
6007
if ( p()->action.isothermic_comet_storm )
6005
6008
p()->action.isothermic_comet_storm->execute_on_target( target );
6006
6009
}
@@ -6088,10 +6091,11 @@ struct phoenix_flames_splash_t final : public fire_mage_spell_t
6088
6091
6089
6092
if ( result_is_hit( s->result ) )
6090
6093
{
6091
- if ( s->chain_target == 0 && p()->buffs.excess_frost->check() )
6094
+ if ( s->chain_target == 0 && p()->buffs.excess_frost->check() && p()->cooldowns.excess_frost->up() )
6092
6095
{
6093
6096
p()->action.excess_ice_nova->execute_on_target( s->target );
6094
6097
p()->buffs.excess_frost->decrement();
6098
+ p()->cooldowns.excess_frost->start( p()->buffs.excess_frost->data().internal_cooldown() );
6095
6099
}
6096
6100
}
6097
6101
}
@@ -7565,6 +7569,7 @@ mage_t::mage_t( sim_t* sim, std::string_view name, race_e r ) :
7565
7569
cooldowns.combustion = get_cooldown( "combustion" );
7566
7570
cooldowns.comet_storm = get_cooldown( "comet_storm" );
7567
7571
cooldowns.cone_of_cold = get_cooldown( "cone_of_cold" );
7572
+ cooldowns.excess_frost = get_cooldown( "excess_frost_icd" );
7568
7573
cooldowns.dragons_breath = get_cooldown( "dragons_breath" );
7569
7574
cooldowns.fire_blast = get_cooldown( "fire_blast" );
7570
7575
cooldowns.flurry = get_cooldown( "flurry" );
0 commit comments