Skip to content

Commit dd63d4a

Browse files
committed
[Mage] Enlightened
1 parent 5f071c9 commit dd63d4a

File tree

1 file changed

+14
-75
lines changed

1 file changed

+14
-75
lines changed

engine/class_modules/sc_mage.cpp

+14-75
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,6 @@ struct mage_t final : public player_t
255255
// Events
256256
struct events_t
257257
{
258-
event_t* enlightened;
259258
event_t* flame_accelerant;
260259
event_t* icicle;
261260
event_t* merged_buff_execute;
@@ -337,8 +336,7 @@ struct mage_t final : public player_t
337336
buff_t* clearcasting;
338337
buff_t* clearcasting_channel; // Hidden buff which governs tick and channel time
339338
buff_t* concentration;
340-
buff_t* enlightened_damage;
341-
buff_t* enlightened_mana;
339+
buff_t* enlightened;
342340
buff_t* evocation;
343341
buff_t* high_voltage;
344342
buff_t* impetus;
@@ -564,7 +562,6 @@ struct mage_t final : public player_t
564562
{
565563
bool brain_freeze_active;
566564
bool fingers_of_frost_active;
567-
timespan_t last_enlightened_update;
568565
timespan_t gained_full_icicles;
569566
bool had_low_mana;
570567
bool trigger_ff_empowerment;
@@ -957,7 +954,6 @@ struct mage_t final : public player_t
957954
void add_precombat_buff_state( buff_t*, int, double, timespan_t ) override;
958955
void invalidate_cache( cache_e ) override;
959956
void init_resources( bool ) override;
960-
void do_dynamic_regen( bool = false ) override;
961957
void recalculate_resource_max( resource_e, gain_t* = nullptr ) override;
962958
void reset() override;
963959
std::unique_ptr<expr_t> create_expression( std::string_view ) override;
@@ -1036,7 +1032,6 @@ struct mage_t final : public player_t
10361032
void consume_burden_of_power();
10371033
void trigger_splinter( player_t* target, int count = -1 );
10381034
void trigger_time_manipulation();
1039-
void update_enlightened( bool double_regen = false );
10401035
};
10411036

10421037
namespace pets {
@@ -7239,25 +7234,6 @@ struct mage_event_t : public event_t
72397234
{ }
72407235
};
72417236

7242-
struct enlightened_event_t final : public mage_event_t
7243-
{
7244-
enlightened_event_t( mage_t& m, timespan_t delta_time ) :
7245-
mage_event_t( m, delta_time )
7246-
{ }
7247-
7248-
const char* name() const override
7249-
{ return "enlightened_event"; }
7250-
7251-
void execute() override
7252-
{
7253-
mage->events.enlightened = nullptr;
7254-
// Do a non-forced regen first to figure out if we have enough mana to swap the buffs.
7255-
mage->do_dynamic_regen();
7256-
mage->update_enlightened( true );
7257-
mage->events.enlightened = make_event<enlightened_event_t>( sim(), *mage, 2.0_s );
7258-
}
7259-
};
7260-
72617237
struct icicle_event_t final : public mage_event_t
72627238
{
72637239
player_t* target;
@@ -8360,12 +8336,14 @@ void mage_t::create_buffs()
83608336
->set_default_value_from_effect( 1 )
83618337
->set_activated( false )
83628338
->set_trigger_spell( talents.concentration );
8363-
buffs.enlightened_damage = make_buff( this, "enlightened_damage", find_spell( 321388 ) )
8364-
->set_default_value_from_effect( 1 )
8365-
->add_invalidate( CACHE_PLAYER_DAMAGE_MULTIPLIER );
8366-
buffs.enlightened_mana = make_buff( this, "enlightened_mana", find_spell( 321390 ) )
8367-
->set_default_value_from_effect( 1 )
8368-
->set_affects_regen( true );
8339+
buffs.enlightened = make_buff( this, "enlightened", find_spell( 1217242 ) )
8340+
->set_schools_from_effect( 4 )
8341+
->add_invalidate( CACHE_PLAYER_DAMAGE_MULTIPLIER )
8342+
->set_affects_regen( true )
8343+
->set_freeze_stacks( true ) // We want to bump the buff manually
8344+
->set_tick_callback( [ this ] ( buff_t* b, int, timespan_t )
8345+
{ b->bump( 0, resources.pct( RESOURCE_MANA ) ); } )
8346+
->set_chance( talents.enlightened.ok() );
83698347
buffs.evocation = make_buff( this, "evocation", find_spell( 12051 ) )
83708348
->set_default_value_from_effect( 1 )
83718349
->set_cooldown( 0_ms )
@@ -8776,8 +8754,9 @@ double mage_t::resource_regen_per_second( resource_e rt ) const
87768754
{
87778755
reg *= 1.0 + 0.01 * spec.arcane_mage->effectN( 4 ).average( this );
87788756
reg *= 1.0 + cache.mastery() * spec.savant->effectN( 4 ).mastery_value();
8779-
reg *= 1.0 + buffs.enlightened_mana->check_value();
87808757
reg *= 1.0 + buffs.evocation->check_value();
8758+
if ( buffs.enlightened->check() )
8759+
reg *= 1.0 + ( 1.0 - buffs.enlightened->check_value() ) * buffs.enlightened->data().effectN( 3 ).percent();
87818760
}
87828761

87838762
return reg;
@@ -8791,15 +8770,6 @@ void mage_t::invalidate_cache( cache_e c )
87918770
recalculate_resource_max( RESOURCE_MANA );
87928771
}
87938772

8794-
void mage_t::do_dynamic_regen( bool forced )
8795-
{
8796-
player_t::do_dynamic_regen( forced );
8797-
8798-
// Only update Enlightened buffs on resource updates that actually occur in game.
8799-
if ( forced && talents.enlightened.ok() )
8800-
make_event( *sim, [ this ] { update_enlightened(); } );
8801-
}
8802-
88038773
void mage_t::recalculate_resource_max( resource_e rt, gain_t* source )
88048774
{
88058775
double max = resources.max[ rt ];
@@ -8842,8 +8812,8 @@ double mage_t::composite_player_multiplier( school_e school ) const
88428812
{
88438813
double m = player_t::composite_player_multiplier( school );
88448814

8845-
if ( buffs.enlightened_damage->has_common_school( school ) )
8846-
m *= 1.0 + buffs.enlightened_damage->check_value();
8815+
if ( buffs.enlightened->check() && buffs.enlightened->has_common_school( school ) )
8816+
m *= 1.0 + buffs.enlightened->check_value() * buffs.enlightened->data().effectN( 2 ).percent();
88478817
if ( buffs.impetus->has_common_school( school ) )
88488818
m *= 1.0 + buffs.impetus->check_value();
88498819

@@ -9001,18 +8971,11 @@ void mage_t::arise()
90018971

90028972
buffs.flame_accelerant->trigger();
90038973
buffs.incanters_flow->trigger();
8974+
buffs.enlightened->trigger( -1, resources.pct( RESOURCE_MANA ) );
90048975

90058976
if ( options.initial_spellfire_spheres > 0 )
90068977
buffs.spellfire_sphere->trigger( options.initial_spellfire_spheres );
90078978

9008-
if ( talents.enlightened.ok() )
9009-
{
9010-
update_enlightened();
9011-
9012-
timespan_t first_tick = rng().real() * 2.0_s;
9013-
events.enlightened = make_event<events::enlightened_event_t>( *sim, *this, first_tick );
9014-
}
9015-
90168979
if ( talents.flame_accelerant.ok() )
90178980
{
90188981
timespan_t first_tick = rng().real() * talents.flame_accelerant->effectN( 1 ).period();
@@ -9335,30 +9298,6 @@ stat_e mage_t::convert_hybrid_stat( stat_e s ) const
93359298
}
93369299
}
93379300

9338-
void mage_t::update_enlightened( bool double_regen )
9339-
{
9340-
if ( !talents.enlightened.ok() )
9341-
return;
9342-
9343-
bool damage_buff = resources.pct( RESOURCE_MANA ) > talents.enlightened->effectN( 1 ).percent();
9344-
if ( damage_buff && !buffs.enlightened_damage->check() )
9345-
{
9346-
// Periodic mana regen happens twice whenever the mana regen buff from Enlightened expires.
9347-
if ( bugs && double_regen && sim->current_time() > state.last_enlightened_update )
9348-
regen( sim->current_time() - state.last_enlightened_update );
9349-
9350-
buffs.enlightened_damage->trigger();
9351-
buffs.enlightened_mana->expire();
9352-
}
9353-
else if ( !damage_buff && !buffs.enlightened_mana->check() )
9354-
{
9355-
buffs.enlightened_damage->expire();
9356-
buffs.enlightened_mana->trigger();
9357-
}
9358-
9359-
state.last_enlightened_update = sim->current_time();
9360-
}
9361-
93629301
action_t* mage_t::get_icicle()
93639302
{
93649303
action_t* a = nullptr;

0 commit comments

Comments
 (0)