diff --git a/engine/class_modules/sc_warrior.cpp b/engine/class_modules/sc_warrior.cpp
index 52ba2cdd522..826e93eef9d 100644
--- a/engine/class_modules/sc_warrior.cpp
+++ b/engine/class_modules/sc_warrior.cpp
@@ -285,11 +285,6 @@ struct warrior_t : public parse_player_effects_t
buff_t* thunder_blast;
buff_t* steadfast_as_the_peaks;
buff_t* burst_of_power;
-
- // TWW3 Tier
- buff_t* critical_conclusion; // Colossus 4pc Crit buff
- buff_t* deeper_wounds; // Colossus 4pc Deep Wounds and Rend amp
- buff_t* severe_thunder; // Mountain Thane 4pc Thunder Blast amp
} buff;
struct rppm_t
@@ -804,6 +799,7 @@ struct warrior_t : public parse_player_effects_t
struct shared_talents_t
{
player_talent_t avatar;
+ player_talent_t bladestorm;
player_talent_t ravager;
player_talent_t bloodsurge;
player_talent_t sudden_death;
@@ -1082,8 +1078,6 @@ struct warrior_action_t : public parse_action_effects_t
}
parse_effects( p()->buff.cut_to_the_bone );
- parse_effects( p()->buff.critical_conclusion );
- parse_effects( p()->buff.deeper_wounds );
parse_effects( p()->buff.celeritous_conclusion_crit );
}
@@ -1102,7 +1096,6 @@ struct warrior_action_t : public parse_action_effects_t
if ( p()->talents.mountain_thane.lightning_strikes->ok() )
{
parse_effects( p()->buff.burst_of_power, effect_mask_t( false ).enable( 2 ) );
- parse_effects( p()->buff.severe_thunder );
if ( p()->talents.mountain_thane.storm_surge->ok() )
parse_effects( p()->buff.avatar, effect_mask_t( false ).enable( 9, 10 ) );
@@ -1132,12 +1125,6 @@ struct warrior_action_t : public parse_action_effects_t
// Wrecked has a value of 10 in spelldata, but it needs to be interpreted as 1% per stack
parse_target_effects( d_fn( &warrior_td_t::debuffs_wrecked ),
p()->spell.wrecked_debuff, effect_mask_t( false ).enable( 2 ), p()->spell.wrecked_debuff->effectN( 2 ).base_value() / 1000 );
-
- if( p()->sets->has_set_bonus( HERO_COLOSSUS, TWW3, B2 ) )
- {
- parse_target_effects( d_fn( &warrior_td_t::debuffs_wrecked ),
- p()->spell.wrecked_debuff, effect_mask_t( false ).enable( 3 ), p()->spell.wrecked_debuff->effectN( 3 ).base_value() / 1000 );
- }
}
// Slayer
@@ -2435,10 +2422,6 @@ struct bloodthirst_t : public warrior_attack_t
{
warrior_attack_t::impact( s );
- // Delayed event to cancel the stack on any crit results
- if ( p()->talents.fury.bloodcraze->ok() && s->result == RESULT_CRIT )
- make_event( *p()->sim, [ this ] { p()->buff.bloodcraze->expire(); } );
-
if ( gushing_wound && s->result == RESULT_CRIT )
{
gushing_wound->execute_on_target( s->target );
@@ -2464,15 +2447,6 @@ struct bloodthirst_t : public warrior_attack_t
make_event( *p()->sim, [ this ] { p()->cooldown.bloodbath->reset( true );
p()->cooldown.bloodthirst->reset( true ); } );
}
-
- if ( p()->talents.slayer.reap_the_storm->ok() )
- {
- if ( p()->cooldown.reap_the_storm_icd->is_ready() && rng().roll( p()->talents.slayer.reap_the_storm->proc_chance() ) )
- {
- reap_the_storm->execute();
- p()->cooldown.reap_the_storm_icd->start();
- }
- }
}
void execute() override
@@ -2528,6 +2502,17 @@ struct bloodthirst_t : public warrior_attack_t
if ( p()->talents.fury.bloodborne->ok() )
p()->buff.bloodborne->trigger();
+
+ if ( p()->talents.slayer.reap_the_storm->ok() )
+ {
+ if ( p()->cooldown.reap_the_storm_icd->is_ready() && rng().roll( p()->talents.slayer.reap_the_storm->effectN( 3 ).percent() ) )
+ {
+ reap_the_storm->execute();
+ p()->cooldown.reap_the_storm_icd->start();
+ }
+ }
+
+ p()->buff.bloodcraze->expire();
}
bool ready() override
@@ -2684,11 +2669,6 @@ struct bloodbath_t : public warrior_attack_t
{
warrior_attack_t::impact( s );
- // Delayed event to cancel the stack on any crit results
- if ( p()->talents.fury.bloodcraze->ok() && s->result == RESULT_CRIT )
- make_event( *p()->sim, [ this ] { p()->buff.bloodcraze->expire(); } );
-
-
if ( gushing_wound && s->result == RESULT_CRIT )
{
gushing_wound->set_target( s->target );
@@ -2719,15 +2699,6 @@ struct bloodbath_t : public warrior_attack_t
make_event( *p()->sim, [ this ] { p()->cooldown.bloodbath->reset( true );
p()->cooldown.bloodthirst->reset( true ); } );
}
-
- if ( p()->talents.slayer.reap_the_storm->ok() )
- {
- if ( p()->cooldown.reap_the_storm_icd->is_ready() && rng().roll( p()->talents.slayer.reap_the_storm->proc_chance() ) )
- {
- reap_the_storm->execute();
- p()->cooldown.reap_the_storm_icd->start();
- }
- }
}
void execute() override
@@ -2777,6 +2748,17 @@ struct bloodbath_t : public warrior_attack_t
if ( p()->talents.fury.bloodborne->ok() )
p()->buff.bloodborne->trigger();
+
+ if ( p()->talents.slayer.reap_the_storm->ok() )
+ {
+ if ( p()->cooldown.reap_the_storm_icd->is_ready() && rng().roll( p()->talents.slayer.reap_the_storm->effectN( 3 ).percent() ) )
+ {
+ reap_the_storm->execute();
+ p()->cooldown.reap_the_storm_icd->start();
+ }
+ }
+
+ p()->buff.bloodcraze->expire();
}
bool ready() override
@@ -2892,9 +2874,16 @@ struct mortal_strike_t : public warrior_attack_t
p()->buff.fierce_followthrough->expire();
- p()->buff.critical_conclusion->expire();
-
p()->buff.celeritous_conclusion_crit->expire();
+
+ if ( p()->talents.slayer.reap_the_storm->ok() )
+ {
+ if ( p()->cooldown.reap_the_storm_icd->is_ready() && rng().roll( p()->talents.slayer.reap_the_storm->effectN( 3 ).percent() ) )
+ {
+ reap_the_storm->execute();
+ p()->cooldown.reap_the_storm_icd->start();
+ }
+ }
}
void impact( action_state_t* s ) override
@@ -2941,18 +2930,6 @@ struct mortal_strike_t : public warrior_attack_t
}
}
- if ( p()->talents.slayer.reap_the_storm->ok() )
- {
- if ( p()->cooldown.reap_the_storm_icd->is_ready() && rng().roll( p()->talents.slayer.reap_the_storm->proc_chance() ) )
- {
- reap_the_storm->execute();
- p()->cooldown.reap_the_storm_icd->start();
- }
- }
-
- if ( s->result == RESULT_CRIT && p()->sets->has_set_bonus( HERO_COLOSSUS, TWW3, B4 ) )
- p()->buff.deeper_wounds->trigger();
-
if ( s->result == RESULT_CRIT && p()->talents.colossus.cut_to_the_bone->ok() )
p()->buff.cut_to_the_bone->trigger();
@@ -3371,15 +3348,6 @@ struct cleave_t : public warrior_attack_t
{ // does this eat RPPM when switching from low -> high health target?
td( s->target )->debuffs_fatal_mark->trigger();
}
-
- if ( p()->talents.slayer.reap_the_storm->ok() )
- {
- if ( p()->cooldown.reap_the_storm_icd->is_ready() && execute_state->n_targets >= p()->talents.slayer.reap_the_storm->effectN( 2 ).base_value() && rng().roll( p()->talents.slayer.reap_the_storm->proc_chance() ) )
- {
- reap_the_storm->execute();
- p()->cooldown.reap_the_storm_icd->start();
- }
- }
}
void execute() override
@@ -3408,6 +3376,15 @@ struct cleave_t : public warrior_attack_t
}
p()->buff.colossal_might->trigger();
}
+
+ if ( p()->talents.slayer.reap_the_storm->ok() )
+ {
+ if ( p()->cooldown.reap_the_storm_icd->is_ready() && execute_state->n_targets >= p()->talents.slayer.reap_the_storm->effectN( 2 ).base_value() && rng().roll( p()->talents.slayer.reap_the_storm->effectN( 3 ).percent() ) )
+ {
+ reap_the_storm->execute();
+ p()->cooldown.reap_the_storm_icd->start();
+ }
+ }
}
};
@@ -3529,9 +3506,10 @@ struct demolish_t : public warrior_attack_t
warrior_attack_t::last_tick( d );
p()->buff.colossal_might->expire();
- if ( p()->sets->has_set_bonus( HERO_COLOSSUS, TWW3, B4 ) )
+ if ( p()->talents.colossus.celeritous_conclusion.ok() )
{
- p()->buff.critical_conclusion->trigger();
+ p()->buff.celeritous_conclusion_haste->trigger();
+ p()->buff.celeritous_conclusion_crit->trigger();
}
}
};
@@ -3580,7 +3558,6 @@ struct thunder_blast_t : public warrior_attack_t
double shield_slam_reset;
warrior_attack_t* rend;
action_t* lightning_strike;
- action_t* ionizing_strike;
double rend_target_cap;
double rend_targets_hit;
thunder_blast_t( warrior_t* p, util::string_view options_str )
@@ -3589,7 +3566,6 @@ struct thunder_blast_t : public warrior_attack_t
shield_slam_reset( p->talents.protection.strategist->effectN( 1 ).percent() ),
rend( nullptr ),
lightning_strike( nullptr ),
- ionizing_strike( nullptr ),
rend_target_cap( 0 ),
rend_targets_hit( 0 )
{
@@ -3615,12 +3591,6 @@ struct thunder_blast_t : public warrior_attack_t
add_child( lightning_strike );
}
- if ( p->sets->has_set_bonus( HERO_MOUNTAIN_THANE, TWW3, B2 ) )
- {
- ionizing_strike = get_action( "ionizing_strike", p );
- add_child( ionizing_strike );
- }
-
if ( p->talents.protection.strategist->ok() )
{
// For some reason on PTR strategist is referencing shield slam reset chance from devastator
@@ -3643,9 +3613,6 @@ struct thunder_blast_t : public warrior_attack_t
warrior_attack_t::execute();
- if ( p()->buff.severe_thunder->up() )
- p()->buff.severe_thunder->expire();
-
if ( rng().roll( shield_slam_reset ) )
{
p()->cooldown.shield_slam->reset( true );
@@ -3689,25 +3656,6 @@ struct thunder_blast_t : public warrior_attack_t
p()->buff.thunder_blast->decrement();
- if ( p()->sets->has_set_bonus( HERO_MOUNTAIN_THANE, TWW3, B2 ) && rng().roll( p()->sets->set( HERO_MOUNTAIN_THANE, TWW3, B2 )->effectN( 2 ).percent() ) )
- {
- size_t ionizing_bolt_target = 0;
- for ( int i = 0; i < p()->sets->set( HERO_MOUNTAIN_THANE, TWW3, B2 )->effectN( 1 ).base_value(); i++ )
- {
- ionizing_strike->execute_on_target( p()->sim->target_non_sleeping_list[ionizing_bolt_target] );
- ionizing_bolt_target++;
- if ( ionizing_bolt_target >= p()->sim->target_non_sleeping_list.size() )
- ionizing_bolt_target = 0;
- }
-
- if ( p()->sets->has_set_bonus( HERO_MOUNTAIN_THANE, TWW3, B4 ) )
- {
- p()->buff.thunder_blast->trigger();
- p()->cooldown.thunder_clap->reset( true );
- p()->buff.severe_thunder->trigger();
- }
- }
-
if ( p()->talents.mountain_thane.capacitance->ok() && p()->buff.avatar->up() )
p()->buff.avatar->extend_duration_or_trigger( p()->talents.mountain_thane.capacitance->effectN( 1 ).time_value() );
@@ -3966,12 +3914,6 @@ struct execute_arms_t : public warrior_attack_t
// For some reason on PTR strategist is referencing shield slam reset chance from devastator
shield_slam_reset = p->spell.devastator->effectN( 2 ).percent();
}
-
- if ( p->sets->has_set_bonus( HERO_SLAYER, TWW3, B2 ) )
- {
- slayers_strike = get_action( "slayers_strike_execute", p );
- add_child( slayers_strike );
- }
}
double tactician_cost() const override
@@ -4060,20 +4002,6 @@ struct execute_arms_t : public warrior_attack_t
p()->active.fatality->set_target( state->target );
p()->active.fatality->execute();
}
-
- if ( p()->buff.sudden_death -> up() )
- {
- if ( p()->sets->has_set_bonus( HERO_SLAYER, TWW3, B2 ) )
- {
- auto target_data = td( state->target );
- if ( slayers_strike && rng().roll( p()->sets->set( HERO_SLAYER, TWW3, B2 )->effectN( 2 ).percent() * target_data->debuffs_overwhelmed->check() ) )
- {
- // This is resolved after everything else happens
- slayers_strike->set_target( state-> target );
- slayers_strike->schedule_execute();
- }
- }
- }
}
bool target_ready( player_t* candidate_target ) override
@@ -4218,12 +4146,6 @@ struct execute_fury_t : public warrior_attack_t
lightning_strike = get_action( "lightning_strike_execute", p );
add_child( lightning_strike );
}
-
- if ( p->sets->has_set_bonus( HERO_SLAYER, TWW3, B2 ) )
- {
- slayers_strike = get_action("slayers_strike_execute", p );
- add_child( slayers_strike );
- }
}
// double cost() const override
@@ -4235,25 +4157,6 @@ struct execute_fury_t : public warrior_attack_t
// return c;
// }
- void impact( action_state_t* state ) override
- {
- warrior_attack_t::impact( state );
-
- if ( p()->buff.sudden_death -> up() )
- {
- if ( p()->sets->has_set_bonus( HERO_SLAYER, TWW3, B2 ) )
- {
- auto target_data = td( state->target );
- if ( slayers_strike && rng().roll( p()->sets->set( HERO_SLAYER, TWW3, B2 )->effectN( 2 ).percent() * target_data->debuffs_overwhelmed->check() ) )
- {
- // This is resolved after everything else happens
- slayers_strike->set_target( state->target );
- slayers_strike->schedule_execute();
- }
- }
- }
- }
-
void execute() override
{
warrior_attack_t::execute();
@@ -4627,11 +4530,9 @@ struct pummel_t : public warrior_attack_t
struct raging_blow_attack_t : public warrior_attack_t
{
int aoe_targets;
- action_t* reap_the_storm;
raging_blow_attack_t( warrior_t* p, const char* name, const spell_data_t* s )
: warrior_attack_t( name, p, s ),
- aoe_targets( as( p->spell.whirlwind_buff->effectN( 1 ).base_value() ) ),
- reap_the_storm( nullptr )
+ aoe_targets( as( p->spell.whirlwind_buff->effectN( 1 ).base_value() ) )
{
may_miss = may_dodge = may_parry = may_block = false;
dual = true;
@@ -4639,28 +4540,6 @@ struct raging_blow_attack_t : public warrior_attack_t
//base_multiplier *= 1.0 + p->talents.cruelty->effectN( 1 ).percent();
base_aoe_multiplier = p->spell.whirlwind_buff->effectN( 2 ).percent();
-
- // 85834 is Raging Blow OH
- if ( s->id() == 85384 && p->sets->has_set_bonus( HERO_SLAYER, TWW3, B4 ) )
- {
- reap_the_storm = get_action( "reap_the_storm_raging_blow", p );
- reap_the_storm->base_multiplier = p->sets->set( HERO_SLAYER, TWW3, B4 )->effectN( 3 ).percent();
- }
- }
-
- void impact ( action_state_t* s ) override
- {
- warrior_attack_t::impact( s );
-
- if ( reap_the_storm && p()->sets->has_set_bonus( HERO_SLAYER, TWW3, B4 ) && p()->cooldown.reap_the_storm_icd->is_ready() )
- {
- auto target_data = td( s->target );
- if ( rng().roll( p()->sets->set( HERO_SLAYER, TWW3, B4 )->effectN( 2 ).percent() * target_data->debuffs_overwhelmed->check() ) )
- {
- reap_the_storm->execute_on_target( s->target );
- p()->cooldown.reap_the_storm_icd->start();
- }
- }
}
int n_targets() const override
@@ -4806,40 +4685,15 @@ struct raging_blow_t : public warrior_attack_t
struct crushing_blow_attack_t : public warrior_attack_t
{
int aoe_targets;
- action_t* reap_the_storm;
crushing_blow_attack_t( warrior_t* p, const char* name, const spell_data_t* s )
: warrior_attack_t( name, p, s ),
- aoe_targets( as( p->spell.whirlwind_buff->effectN( 1 ).base_value() ) ),
- reap_the_storm( nullptr )
+ aoe_targets( as( p->spell.whirlwind_buff->effectN( 1 ).base_value() ) )
{
may_miss = may_dodge = may_parry = may_block = false;
dual = true;
background = true;
base_aoe_multiplier = p->spell.whirlwind_buff->effectN( 2 ).percent();
-
- // 335100 is Crushing Blow OH attack
- if ( s->id() == 335100 && p->sets->has_set_bonus( HERO_SLAYER, TWW3, B4 ) )
- {
- reap_the_storm = get_action( "reap_the_storm_crushing_blow", p );
- reap_the_storm->base_multiplier = p->sets->set( HERO_SLAYER, TWW3, B4 )->effectN( 3 ).percent();
- add_child( reap_the_storm );
- }
- }
-
- void impact ( action_state_t* s ) override
- {
- warrior_attack_t::impact( s );
-
- if ( reap_the_storm && p()->sets->has_set_bonus( HERO_SLAYER, TWW3, B4 ) && p()->cooldown.reap_the_storm_icd->is_ready() )
- {
- auto target_data = td( s->target );
- if ( rng().roll( p()->sets->set( HERO_SLAYER, TWW3, B4 )->effectN( 2 ).percent() * target_data->debuffs_overwhelmed->check() ) )
- {
- reap_the_storm->execute_on_target( s->target );
- p()->cooldown.reap_the_storm_icd->start();
- }
- }
}
int n_targets() const override
@@ -5149,13 +5003,11 @@ struct overpower_t : public warrior_attack_t
{
double battlelord_chance;
warrior_attack_t* dreadnaught;
- action_t* reap_the_storm;
overpower_t( warrior_t* p, util::string_view options_str )
: warrior_attack_t( "overpower", p, p->talents.arms.overpower ),
battlelord_chance( p->talents.arms.battlelord->proc_chance() ),
- dreadnaught( nullptr ),
- reap_the_storm( nullptr )
+ dreadnaught( nullptr )
{
parse_options( options_str );
may_block = may_parry = may_dodge = false;
@@ -5166,13 +5018,6 @@ struct overpower_t : public warrior_attack_t
dreadnaught = new dreadnaught_t( p );
add_child( dreadnaught );
}
-
- if ( p->sets->has_set_bonus( HERO_SLAYER, TWW3, B4 ) )
- {
- reap_the_storm = get_action( "reap_the_storm_overpower", p );
- reap_the_storm->base_multiplier = p->sets->set( HERO_SLAYER, TWW3, B4 )->effectN( 3 ).percent();
- add_child( reap_the_storm );
- }
}
void impact( action_state_t* s ) override
@@ -5184,16 +5029,6 @@ struct overpower_t : public warrior_attack_t
{
dreadnaught->execute_on_target( s->target );
}
-
- if ( reap_the_storm && p()->sets->has_set_bonus( HERO_SLAYER, TWW3, B4 ) && p()->cooldown.reap_the_storm_icd->is_ready() )
- {
- auto target_data = td( s->target );
- if ( rng().roll( p()->sets->set( HERO_SLAYER, TWW3, B4 )->effectN( 2 ).percent() * target_data->debuffs_overwhelmed->check() ) )
- {
- reap_the_storm->execute_on_target( s->target );
- p()->cooldown.reap_the_storm_icd->start();
- }
- }
}
void execute() override
@@ -5847,8 +5682,6 @@ struct shield_slam_t : public warrior_attack_t
p()->buff.thunder_blast->trigger();
}
- p()->buff.critical_conclusion->expire();
-
p()->buff.celeritous_conclusion_crit->expire();
}
@@ -5892,9 +5725,6 @@ struct shield_slam_t : public warrior_attack_t
make_event( *p()->sim, [ this ] { p()->cooldown.shield_slam->reset( true ); } );
}
- if ( state->result == RESULT_CRIT && p()->sets->has_set_bonus( HERO_COLOSSUS, TWW3, B4 ) )
- p()->buff.deeper_wounds->trigger();
-
if ( state->result == RESULT_CRIT && p()->talents.colossus.cut_to_the_bone->ok() )
p()->buff.cut_to_the_bone->trigger();
}
@@ -6851,7 +6681,7 @@ action_t* warrior_t::create_action( util::string_view name, util::string_view op
if ( name == "berserker_stance" )
return new berserker_stance_t( this, options_str );
if ( name == "bladestorm" )
- return new bladestorm_t( this, options_str, name, talents.slayer.unrelenting_onslaught->ok() ? find_spell( 446035 ) : find_spell( 227847 ) );
+ return new bladestorm_t( this, options_str, name, talents.slayer.unrelenting_onslaught->ok() && talents.shared.bladestorm.ok() ? find_spell( 446035 ) : talents.shared.bladestorm );
if ( name == "bloodthirst" )
return new bloodthirst_t( this, options_str );
if ( name == "bloodbath" )
@@ -7418,6 +7248,7 @@ void warrior_t::init_spells()
};
talents.shared.avatar = find_shared_talent( { &talents.arms.avatar, &talents.fury.avatar, &talents.protection.avatar } );
+ talents.shared.bladestorm = find_shared_talent( { &talents.arms.bladestorm, &talents.fury.bladestorm } );
talents.shared.ravager = find_shared_talent( { &talents.arms.ravager, &talents.protection.ravager } );
talents.shared.bloodsurge = find_shared_talent( { &talents.arms.bloodsurge, &talents.protection.bloodsurge } );
talents.shared.sudden_death = find_shared_talent( { &talents.arms.sudden_death, &talents.fury.sudden_death, &talents.protection.sudden_death } );
@@ -7862,7 +7693,7 @@ void warrior_t::create_buffs()
->set_default_value( find_spell( 202164 )->effectN( 1 ).percent() );
buff.bladestorm =
- make_buff( this, "bladestorm", talents.slayer.unrelenting_onslaught->ok() ? find_spell( 446035 ) : find_spell( 227847 ) )
+ make_buff( this, "bladestorm", talents.slayer.unrelenting_onslaught->ok() && talents.shared.bladestorm.ok() ? find_spell( 446035 ) : talents.shared.bladestorm )
->disable_ticking( true )
->set_cooldown( timespan_t::zero() );
@@ -7996,11 +7827,6 @@ void warrior_t::create_buffs()
->set_initial_stack( find_spell( 437121 )->max_stacks() )
->set_cooldown( talents.mountain_thane.burst_of_power -> internal_cooldown() )
->set_chance( talents.mountain_thane.burst_of_power->proc_chance() );
-
- // TWW3 Tier
- buff.critical_conclusion = make_buff( this, "critical_conclusion", find_spell( 1239144 ) ); // Colossus 4pc
- buff.deeper_wounds = make_buff( this, "deeper_wounds", find_spell( 1239153 ) ); // Colossus 4pc
- buff.severe_thunder = make_buff( this, "severe_thunder", find_spell( 1252096 ) ); // Mountain Thane 4pc
}
// warrior_t::init_special_effects() ====================================