@@ -76,6 +76,9 @@ paladin_t::paladin_t( sim_t* sim, util::string_view name, race_e r )
7676 cooldowns.second_sunrise_icd = get_cooldown ( " second_sunrise_icd" );
7777 cooldowns.second_sunrise_icd ->duration = find_spell ( 431474 )->internal_cooldown ();
7878
79+ cooldowns.walk_into_light_icd = get_cooldown ( " walk_into_light_icd" );
80+ cooldowns.walk_into_light_icd ->duration = find_spell ( 1263782 )->internal_cooldown ();
81+
7982 cooldowns.art_of_war = get_cooldown ( " art_of_war" );
8083 cooldowns.art_of_war ->duration = find_spell ( 406064 )->internal_cooldown ();
8184
@@ -267,7 +270,6 @@ avenging_wrath_t::avenging_wrath_t( paladin_t* p )
267270 : paladin_spell_t ( " avenging_wrath" , p, p->find_spell ( 454351 ) )
268271{
269272 background = true ;
270- is_proc_background = true ;
271273 harmful = false ;
272274}
273275
@@ -285,7 +287,6 @@ avenging_wrath_t::avenging_wrath_t( paladin_t* p, util::string_view options_str
285287 background = true ;
286288
287289 harmful = false ;
288- is_proc_background = false ;
289290}
290291
291292action_state_t * avenging_wrath_t::new_state ()
@@ -296,21 +297,25 @@ action_state_t* avenging_wrath_t::new_state()
296297void avenging_wrath_t::execute ()
297298{
298299 paladin_spell_t::execute ();
299- if ( is_proc_background )
300- return ;
301300
302301 p ()->buffs .avenging_wrath ->trigger ();
303302 if ( p ()->talents .lightsmith .blessing_of_the_forge ->ok () )
304303 p ()->buffs .lightsmith .blessing_of_the_forge ->execute ();
305304
306- if ( p ()->talents .herald_of_the_sun .suns_avatar ->ok () )
307- p ()->apply_avatar_dawnlights ();
308-
309305 if ( p ()->talents .empyrean_legacy ->ok () )
310306 p ()->buffs .empyrean_legacy ->trigger ();
311307
312308 if ( p ()->talents .hammer_of_wrath ->ok () )
313309 p ()->buffs .hammer_of_wrath ->trigger ();
310+
311+ if ( p ()->talents .herald_of_the_sun .walk_into_light ->ok () &&
312+ p ()->rng ().roll ( p ()->talents .herald_of_the_sun .walk_into_light ->effectN ( 1 ).percent () ) )
313+ {
314+ p ()->resource_gain ( RESOURCE_HOLY_POWER,
315+ as<int >( p ()->talents .herald_of_the_sun .walk_into_light ->effectN ( 2 ).base_value () ),
316+ p ()->gains .hp_walk_into_light );
317+ p ()->buffs .herald_of_the_sun .blessing_of_anshe ->trigger ();
318+ }
314319}
315320
316321// Consecration =============================================================
@@ -1648,6 +1653,11 @@ void hammer_of_wrath_t::execute()
16481653 p ()->active .divine_resonance_ret_how ->execute_on_target ( execute_state->target );
16491654 p ()->buffs .divine_resonance ->decrement ();
16501655 }
1656+ if (p ()->talents .herald_of_the_sun .walk_into_light ->ok () && p ()->wings_up () && p ()->cooldowns .walk_into_light_icd ->up ())
1657+ {
1658+ p ()->active .blade_of_justice ->execute_on_target ( execute_state->target );
1659+ p ()->cooldowns .walk_into_light_icd ->start ();
1660+ }
16511661}
16521662
16531663void hammer_of_wrath_t::impact ( action_state_t * s )
@@ -2920,17 +2930,27 @@ struct dawnlight_aoe_t : public paladin_spell_t
29202930
29212931struct dawnlight_t : public paladin_spell_t
29222932{
2933+ struct suns_avatar_dmg_t : public paladin_spell_t
2934+ {
2935+ suns_avatar_dmg_t ( paladin_t * p ) : paladin_spell_t ( " suns_avatar" , p, p->find_spell ( 431911 ) )
2936+ {
2937+ background = true ;
2938+ aoe = -1 ;
2939+ reduced_aoe_targets = p->talents .herald_of_the_sun .suns_avatar ->effectN ( 6 ).base_value ();
2940+ }
2941+ };
29232942 dawnlight_aoe_t * aoe_action;
2943+ suns_avatar_dmg_t * suns_avatar;
29242944
2925- dawnlight_t ( paladin_t * p ) :
2926- paladin_spell_t ( " dawnlight" , p, p->find_spell ( 431380 ) ),
2927- aoe_action( new dawnlight_aoe_t ( p ) )
2928-
2945+ dawnlight_t ( paladin_t * p )
2946+ : paladin_spell_t( " dawnlight" , p, p->find_spell ( 431380 ) ),
2947+ aoe_action( new dawnlight_aoe_t ( p ) ),
2948+ suns_avatar( new suns_avatar_dmg_t ( p ) )
29292949 {
2930- background = true ;
2950+ background = true ;
29312951 affected_by.highlords_judgment = true ;
2932- tick_may_crit = true ;
2933- dot_behavior = dot_behavior_e::DOT_EXTEND; // per bolas test Aug 21 2024
2952+ tick_may_crit = true ;
2953+ dot_behavior = dot_behavior_e::DOT_EXTEND; // per bolas test Aug 21 2024
29342954 }
29352955
29362956 void execute () override
@@ -2942,14 +2962,6 @@ struct dawnlight_t : public paladin_spell_t
29422962
29432963 if ( p ()->buffs .herald_of_the_sun .morning_star ->up () )
29442964 p ()->buffs .herald_of_the_sun .morning_star ->expire ();
2945-
2946- if ( p ()->talents .herald_of_the_sun .suns_avatar ->ok () )
2947- {
2948- if ( ( !p ()->buffs .herald_of_the_sun .suns_avatar ->up () ) && p ()->buffs .avenging_wrath ->up () )
2949- {
2950- p ()->buffs .herald_of_the_sun .suns_avatar ->trigger ();
2951- }
2952- }
29532965 }
29542966
29552967 double composite_persistent_multiplier ( const action_state_t * s ) const override
@@ -2962,42 +2974,19 @@ struct dawnlight_t : public paladin_spell_t
29622974 return cpm;
29632975 }
29642976
2965- double dot_duration_pct_multiplier ( const action_state_t * s ) const override
2966- {
2967- double mul = paladin_spell_t::dot_duration_pct_multiplier ( s );
2968-
2969- if ( p ()->talents .herald_of_the_sun .suns_avatar ->ok () )
2970- {
2971- if ( p ()->buffs .avenging_wrath ->up () )
2972- {
2973- mul *= 1.0 + p ()->talents .herald_of_the_sun .suns_avatar ->effectN ( 5 ).percent ();
2974- }
2975- }
2976-
2977- return mul;
2978- }
2979-
29802977 void tick ( dot_t * d ) override
29812978 {
29822979 paladin_spell_t::tick ( d );
29832980
29842981 aoe_action->base_dd_min = aoe_action->base_dd_max = d->state ->result_amount * p ()->spells .herald_of_the_sun .dawnlight_aoe_metadata ->effectN ( 1 ).percent ();
29852982 aoe_action->execute_on_target ( d->target );
2983+ suns_avatar->execute_on_target ( d->target );
29862984 }
29872985
29882986 void last_tick ( dot_t * d ) override
29892987 {
29902988 paladin_spell_t::last_tick ( d );
29912989
2992- unsigned num_dawnlights = p ()->get_active_dots ( d );
2993- if ( num_dawnlights == 0 )
2994- {
2995- if ( p ()->talents .herald_of_the_sun .suns_avatar ->ok () )
2996- {
2997- p ()->buffs .herald_of_the_sun .suns_avatar ->expire ();
2998- }
2999- }
3000-
30012990 if ( p ()->talents .herald_of_the_sun .lingering_radiance ->ok () )
30022991 {
30032992 paladin_td_t * target_data = td ( d->target );
@@ -3006,75 +2995,6 @@ struct dawnlight_t : public paladin_spell_t
30062995 }
30072996};
30082997
3009- void paladin_t::apply_avatar_dawnlights ()
3010- {
3011- if ( !talents.herald_of_the_sun .suns_avatar ->ok () )
3012- return ;
3013-
3014- unsigned num_dawnlights = (unsigned ) as<int >( talents.herald_of_the_sun .suns_avatar ->effectN ( 3 ).base_value () );
3015-
3016- // per bolas Aug 21 2024. Can't seem to find this in spelldata
3017- if ( !talents.crusade ->ok () )
3018- num_dawnlights = 2 ;
3019- if ( talents.radiant_glory ->ok () )
3020- num_dawnlights = 1 ;
3021-
3022- std::vector<player_t *> tl_candidates;
3023- std::vector<player_t *> tl_yes_dawnlight;
3024- for ( auto * t : sim->target_non_sleeping_list )
3025- {
3026- if ( t->is_enemy () )
3027- {
3028- auto * dawnlight = active.dawnlight ->get_dot ( t );
3029- if ( dawnlight->is_ticking () )
3030- tl_yes_dawnlight.push_back ( t );
3031- else
3032- tl_candidates.push_back ( t );
3033- }
3034- }
3035-
3036- if ( tl_candidates.size () < num_dawnlights )
3037- {
3038- auto needed = num_dawnlights - tl_candidates.size ();
3039-
3040- std::stable_sort ( tl_yes_dawnlight.begin (), tl_yes_dawnlight.end (), [this ]( player_t * a, player_t * b ){
3041- auto * dla = active.dawnlight ->get_dot ( a );
3042- auto * dlb = active.dawnlight ->get_dot ( b );
3043- return dla->remains () < dlb->remains ();
3044- } );
3045-
3046- auto have = tl_yes_dawnlight.size ();
3047- auto num_extra = have < needed ? have : needed;
3048-
3049- for ( auto i = 0u ; i < num_extra; i++ )
3050- tl_candidates.push_back ( tl_yes_dawnlight[ i ] );
3051- }
3052-
3053- auto have_total = tl_candidates.size ();
3054- if ( num_dawnlights < have_total )
3055- have_total = num_dawnlights;
3056-
3057- for ( auto i = 0u ; i < have_total; i++ )
3058- {
3059- active.dawnlight ->execute_on_target ( tl_candidates[ i ] );
3060- }
3061-
3062- if ( bugs && have_total > 0 && talents.radiant_glory ->ok () )
3063- {
3064- active.dawnlight ->execute_on_target ( tl_candidates[ 0 ] );
3065- }
3066- }
3067-
3068- struct suns_avatar_dmg_t : public paladin_spell_t
3069- {
3070- suns_avatar_dmg_t ( paladin_t * p ) : paladin_spell_t ( " suns_avatar" , p, p->find_spell ( 431911 ) )
3071- {
3072- background = true ;
3073- aoe = -1 ;
3074- reduced_aoe_targets = p->talents .herald_of_the_sun .suns_avatar ->effectN ( 6 ).base_value ();
3075- }
3076- };
3077-
30782998// ==========================================================================
30792999// End Attacks
30803000// ==========================================================================
@@ -3349,10 +3269,6 @@ void paladin_t::create_actions()
33493269 {
33503270 active.dawnlight = new dawnlight_t ( this );
33513271 }
3352- if ( talents.herald_of_the_sun .suns_avatar ->ok () )
3353- {
3354- active.suns_avatar_dmg = new suns_avatar_dmg_t ( this );
3355- }
33563272
33573273 active.shield_of_vengeance_damage = new shield_of_vengeance_proc_t ( this );
33583274
@@ -3535,6 +3451,7 @@ void paladin_t::init_gains()
35353451 gains.hp_divine_toll = get_gain ( " divine_toll" );
35363452 gains.hp_crusading_strikes = get_gain ( " crusading_strikes" );
35373453 gains.hp_glory_of_the_vanguard_2 = get_gain ( " glory_of_the_vanguard" );
3454+ gains.hp_walk_into_light = get_gain ( " walk_into_light" );
35383455
35393456 gains.hp_judge_jury_and_executioner_refund = get_gain ( " judge_jury_and_executioner_refund" );
35403457}
@@ -3760,35 +3677,7 @@ void paladin_t::create_buffs()
37603677 buffs.herald_of_the_sun .solar_grace = make_buff ( this , " solar_grace" , find_spell ( 439841 ) )
37613678 -> add_invalidate ( CACHE_HASTE )
37623679 -> set_stack_behavior ( buff_stack_behavior::ASYNCHRONOUS );
3763- buffs.herald_of_the_sun .dawnlight = make_buff ( this , " dawnlight" , find_spell ( 431522 ) );
3764- buffs.herald_of_the_sun .suns_avatar = make_buff ( this , " suns_avatar" , find_spell ( 431907 ) )
3765- ->set_tick_callback ( [ this ]( buff_t *, int , timespan_t ) {
3766- active.suns_avatar_dmg ->execute_on_target ( target );
3767- });
3768-
3769- buffs.herald_of_the_sun .solar_wrath = make_buff ( this , " solar_wrath" , find_spell ( 1236972 ) )
3770- ->set_expire_callback ( [ this ]( buff_t *, double , timespan_t ) {
3771- if ( !( buffs.avenging_wrath ->up () ) )
3772- buffs.herald_of_the_sun .suns_avatar ->expire ();
3773- } );
3774-
3775- if ( sets->has_set_bonus ( HERO_HERALD_OF_THE_SUN, TWW3, B4 ) && talents.herald_of_the_sun .dawnlight ->ok () )
3776- {
3777- auto solar_wrath_dawnlight_stacks = sets->set ( HERO_HERALD_OF_THE_SUN, TWW3, B4 )->effectN ( 2 ).base_value ();
3778- if ( talents.radiant_glory ->ok () )
3779- solar_wrath_dawnlight_stacks -= sets->set ( HERO_HERALD_OF_THE_SUN, TWW3, B4 )->effectN ( 5 ).base_value ();
3780- else if ( talents.crusade ->ok () )
3781- solar_wrath_dawnlight_stacks += sets->set ( HERO_HERALD_OF_THE_SUN, TWW3, B4 )->effectN ( 4 ).base_value ();
3782-
3783- buffs.herald_of_the_sun .solar_wrath ->set_stack_change_callback (
3784- [ this , solar_wrath_dawnlight_stacks ]( buff_t *, int , int new_ ) {
3785- if ( new_ )
3786- {
3787- buffs.herald_of_the_sun .dawnlight ->trigger ( as<int >( solar_wrath_dawnlight_stacks ) );
3788- }
3789- } );
3790- }
3791-
3680+ buffs.herald_of_the_sun .dawnlight = make_buff ( this , " dawnlight" , find_spell ( 431522 ) )->set_chance ( 1.0 );
37923681 buffs.vanguard = make_buff ( this , " vanguard" , find_spell ( 1268810 ) );
37933682 buffs.valor = make_buff ( this , " valor" , find_spell ( 1269179 ) );
37943683 buffs.light_blessed_shield =
0 commit comments