Skip to content

Commit 694ca9e

Browse files
[Paladin] Change J/HoW again. Divine Resonance for Ret
1 parent d5cb27e commit 694ca9e

File tree

3 files changed

+153
-37
lines changed

3 files changed

+153
-37
lines changed

engine/class_modules/paladin/sc_paladin.cpp

Lines changed: 136 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,24 +1424,19 @@ void judgment_base_t::impact(action_state_t* s)
14241424
trigger_hammer_and_anvil( p(), s, hammer_and_anvil, HAA_JUDGMENT );
14251425
}
14261426

1427-
judgment_t::judgment_t( paladin_t* p, util::string_view name, util::string_view options_str, double mul, bool bg )
1428-
: judgment_base_t( p, name, options_str, p->find_class_spell( "Judgment" ) )
1427+
judgment_t::judgment_t( paladin_t* p, util::string_view name, util::string_view options_str, const spell_data_t* s )
1428+
: judgment_base_t( p, name, options_str, s )
14291429
{
14301430
// no weapon multiplier
14311431
weapon_multiplier = 0.0;
14321432
may_block = may_parry = may_dodge = false;
1433-
base_multiplier *= mul;
14341433
// force effect 1 to be used for direct ratios
14351434
parse_effect_data( data().effectN( 1 ) );
14361435

1437-
// todo - what's the point of this?
1438-
[[maybe_unused]] auto j = p->find_class_spell( "Judgment" );
1439-
14401436
if ( p->cooldowns.judgment == nullptr )
14411437
p->cooldowns.judgment = cooldown;
14421438
else
14431439
cooldown = p->cooldowns.judgment;
1444-
background = bg;
14451440
}
14461441

14471442
proc_types judgment_t::proc_type() const
@@ -1476,14 +1471,11 @@ struct judgment_ret_t : public judgment_t
14761471
{
14771472
int holy_power_generation;
14781473

1479-
judgment_ret_t( paladin_t* p, util::string_view name, util::string_view options_str, double mul = 1.0,
1480-
bool bg = false )
1481-
: judgment_t( p, name, options_str ),
1474+
judgment_ret_t( paladin_t* p, util::string_view name, util::string_view options_str, const spell_data_t* s )
1475+
: judgment_t( p, name, options_str, s ),
14821476
holy_power_generation( as<int>( p->find_spell( 220637 )->effectN( 1 ).base_value() ) )
14831477
{
14841478
parse_options( options_str );
1485-
base_multiplier *= mul;
1486-
background = bg;
14871479

14881480
if ( p->talents.blessed_champion->ok() )
14891481
{
@@ -1497,6 +1489,12 @@ struct judgment_ret_t : public judgment_t
14971489

14981490
if ( p()->spec.judgment_3->ok() )
14991491
p()->resource_gain( RESOURCE_HOLY_POWER, holy_power_generation, p()->gains.judgment );
1492+
1493+
if ( !background && p()->specialization() == PALADIN_RETRIBUTION && p()->buffs.divine_resonance->up() )
1494+
{
1495+
p()->active.divine_resonance_ret->execute_on_target( execute_state->target );
1496+
p()->buffs.divine_resonance->decrement();
1497+
}
15001498
}
15011499

15021500
void impact( action_state_t* s ) override
@@ -1516,21 +1514,65 @@ struct judgment_ret_t : public judgment_t
15161514
}
15171515
}
15181516
};
1519-
1520-
struct judgment_divine_exaction_t :public judgment_ret_t
1517+
struct divine_toll_judgment_ret_t :judgment_ret_t
1518+
{
1519+
divine_toll_judgment_ret_t( paladin_t* p ) : judgment_ret_t( p, "divine_toll_judgment", "", p->spells.judgment_ret_dt )
1520+
{
1521+
background = true;
1522+
aoe = 1; // Divine Toll's Judgments don't cleave further
1523+
}
1524+
};
1525+
struct divine_resonance_judgment_t :judgment_ret_t
1526+
{
1527+
divine_resonance_judgment_t(paladin_t* p) : judgment_ret_t(p, "divine_resonance_judgment", "", p->spells.judgment_ret)
1528+
{
1529+
background = true;
1530+
base_multiplier *= p->buffs.divine_resonance->data().effectN( 2 ).percent();
1531+
}
1532+
};
1533+
struct divine_exaction_judgment_t : public judgment_ret_t
1534+
{
1535+
divine_exaction_judgment_t( paladin_t* p ) : judgment_ret_t( p, "judgment_de", "", p->spells.judgment_ret_dt )
1536+
{
1537+
background = true;
1538+
aoe = 1; // DE's Hammer of Wrath's don't cleave further
1539+
base_multiplier *= p->talents.templar.divine_exaction->effectN( 2 ).percent();
1540+
}
1541+
};
1542+
struct divine_toll_hammer_of_wrath_ret_t : hammer_of_wrath_t
1543+
{
1544+
divine_toll_hammer_of_wrath_ret_t( paladin_t* p )
1545+
: hammer_of_wrath_t( p, "divine_toll_hammer_of_wrath", "", p->spells.hammer_of_wrath_ret_dt )
1546+
{
1547+
background = true;
1548+
aoe = 1; // Divine Toll's Hammer of Wraths don't cleave further
1549+
}
1550+
};
1551+
struct divine_resonance_hammer_of_wrath_t :hammer_of_wrath_t
1552+
{
1553+
divine_resonance_hammer_of_wrath_t(paladin_t* p)
1554+
: hammer_of_wrath_t( p, "divine_resonance_hammer_of_wrath", "" , p->spells.hammer_of_wrath_ret )
1555+
{
1556+
background = true;
1557+
base_multiplier *= p->buffs.divine_resonance->data().effectN( 2 ).percent();
1558+
}
1559+
};
1560+
struct divine_exaction_hammer_of_wrath_t :public hammer_of_wrath_t
15211561
{
1522-
judgment_divine_exaction_t(paladin_t* p) : judgment_ret_t(p, "judgment_de", "", p->talents.templar.divine_exaction->effectN(2).percent(), true)
1562+
divine_exaction_hammer_of_wrath_t(paladin_t* p)
1563+
: hammer_of_wrath_t(p, "hammer_of_wrath_de", "", p->spells.hammer_of_wrath_ret_dt)
15231564
{
15241565
background = true;
1566+
aoe = 1; // DE's Hammer of Wrath's don't cleave further
1567+
base_multiplier *= p->talents.templar.divine_exaction->effectN( 2 ).percent();
15251568
}
15261569
};
15271570

1528-
hammer_of_wrath_t::hammer_of_wrath_t( paladin_t* p, util::string_view name, util::string_view options_str, double mul, bool bg )
1529-
: judgment_base_t( p, name, options_str, p->find_spell( 1241413 ) ),
1571+
hammer_of_wrath_t::hammer_of_wrath_t( paladin_t* p, util::string_view name, util::string_view options_str, const spell_data_t* s )
1572+
: judgment_base_t( p, name, options_str, s ),
15301573
echo( nullptr )
15311574
{
15321575
parse_options( options_str );
1533-
base_multiplier *= mul;
15341576
if ( p->talents.adjudication->ok() )
15351577
{
15361578
add_child( p->active.background_blessed_hammer );
@@ -1548,7 +1590,7 @@ hammer_of_wrath_t::hammer_of_wrath_t( paladin_t* p, util::string_view name, util
15481590

15491591
if ( p->talents.herald_of_the_sun.second_sunrise->ok() )
15501592
{
1551-
echo = new hammer_of_wrath_t( p, "Hammer of Wrath Echo", "" );
1593+
echo = new hammer_of_wrath_t( p, "Hammer of Wrath Echo", "", s );
15521594
echo->base_multiplier = base_multiplier;
15531595
echo->aoe = aoe;
15541596
echo->base_aoe_multiplier = base_aoe_multiplier;
@@ -1563,7 +1605,17 @@ hammer_of_wrath_t::hammer_of_wrath_t( paladin_t* p, util::string_view name, util
15631605
else
15641606
cooldown = p->cooldowns.judgment;
15651607
}
1566-
background = bg;
1608+
}
1609+
1610+
void hammer_of_wrath_t::execute()
1611+
{
1612+
judgment_base_t::execute();
1613+
1614+
if ( !background && p()->specialization() == PALADIN_RETRIBUTION && p()->buffs.divine_resonance->up() )
1615+
{
1616+
p()->active.divine_resonance_ret_how->execute_on_target( execute_state->target );
1617+
p()->buffs.divine_resonance->decrement();
1618+
}
15671619
}
15681620

15691621
void hammer_of_wrath_t::impact( action_state_t* s )
@@ -1623,8 +1675,16 @@ void paladin_t::trigger_greater_judgment( paladin_td_t* targetdata, bool remove_
16231675
}
16241676
struct divine_toll_t : public paladin_spell_t
16251677
{
1678+
divine_toll_judgment_ret_t* judgment;
1679+
divine_exaction_judgment_t* judgment_de;
1680+
divine_toll_hammer_of_wrath_ret_t* how;
1681+
divine_exaction_hammer_of_wrath_t* how_de;
16261682
divine_toll_t( paladin_t* p, util::string_view options_str )
1627-
: paladin_spell_t( "divine_toll", p, p->talents.divine_toll )
1683+
: paladin_spell_t( "divine_toll", p, p->talents.divine_toll ),
1684+
judgment( nullptr ),
1685+
judgment_de( nullptr ),
1686+
how( nullptr ),
1687+
how_de( nullptr )
16281688
{
16291689
parse_options( options_str );
16301690

@@ -1635,10 +1695,24 @@ struct divine_toll_t : public paladin_spell_t
16351695
{
16361696
add_child( p->active.divine_resonance );
16371697
}
1698+
else if ( p->specialization() == PALADIN_RETRIBUTION )
1699+
{
1700+
judgment = new divine_toll_judgment_ret_t( p );
1701+
add_child( judgment );
1702+
how = new divine_toll_hammer_of_wrath_ret_t( p );
1703+
add_child( how );
1704+
}
16381705
if ( p->talents.templar.divine_exaction->ok() )
16391706
{
1640-
add_child( p->specialization() == PALADIN_PROTECTION ? p->active.divine_exaction_prot
1641-
: p->active.divine_exaction_ret );
1707+
if ( p->specialization() == PALADIN_PROTECTION )
1708+
add_child( p->active.divine_exaction_prot );
1709+
else if ( p->specialization() == PALADIN_RETRIBUTION )
1710+
{
1711+
judgment_de = new divine_exaction_judgment_t( p );
1712+
how_de = new divine_exaction_hammer_of_wrath_t( p );
1713+
add_child( judgment_de );
1714+
add_child( how_de );
1715+
}
16421716
}
16431717
if ( p->talents.templar.divine_hammer->ok() )
16441718
{
@@ -1652,8 +1726,17 @@ struct divine_toll_t : public paladin_spell_t
16521726

16531727
if ( result_is_hit( s->result ) )
16541728
{
1655-
p()->active.divine_toll->set_target( s->target );
1656-
p()->active.divine_toll->execute();
1729+
if (p()->specialization() == PALADIN_RETRIBUTION )
1730+
{
1731+
if ( p()->buffs.hammer_of_wrath->up() )
1732+
how->execute_on_target( s->target );
1733+
else
1734+
judgment->execute_on_target( s->target );
1735+
}
1736+
else
1737+
{
1738+
p()->active.divine_toll->execute_on_target( s->target );
1739+
}
16571740
}
16581741
}
16591742

@@ -1682,8 +1765,19 @@ struct divine_toll_t : public paladin_spell_t
16821765
}
16831766
if ( p()->talents.templar.divine_exaction->ok() )
16841767
{
1685-
action_t* a = p()->specialization() == PALADIN_RETRIBUTION ? p()->active.divine_exaction_ret
1686-
: p()->active.divine_exaction_prot;
1768+
action_t* a = nullptr;
1769+
if ( p()->specialization() == PALADIN_RETRIBUTION )
1770+
{
1771+
// ToDo Fluttershy: Find out state after 300ms?
1772+
if ( p()->buffs.hammer_of_wrath->up() )
1773+
a = how_de;
1774+
else
1775+
a = judgment_de;
1776+
}
1777+
else if ( p()->specialization() == PALADIN_PROTECTION )
1778+
{
1779+
a = p()->active.divine_exaction_prot;
1780+
}
16871781
for ( int i = 0; i < p()->talents.templar.divine_exaction->effectN( 1 ).base_value(); i++ )
16881782
{
16891783
make_event<delayed_execute_event_t>( *sim, p(), a, execute_state->target, 300_ms * ( i + 1 ) );
@@ -3171,10 +3265,10 @@ void paladin_t::create_actions()
31713265
else if ( specialization() == PALADIN_RETRIBUTION )
31723266
{
31733267
paladin_t::create_ret_actions();
3174-
active.divine_toll =
3175-
new judgment_ret_t( this, "judgment_dt", "", 1.0 + find_spell( 220637 )->effectN( 1 ).base_value(), true );
3176-
if ( talents.templar.divine_exaction->ok() )
3177-
active.divine_exaction_ret = new judgment_divine_exaction_t( this );
3268+
active.divine_toll = new divine_toll_judgment_ret_t( this );
3269+
active.divine_toll_how = new divine_toll_hammer_of_wrath_ret_t( this );
3270+
active.divine_resonance_ret = new divine_resonance_judgment_t( this );
3271+
active.divine_resonance_ret_how = new divine_resonance_hammer_of_wrath_t( this );
31783272
}
31793273

31803274
if ( talents.avenging_wrath->ok() )
@@ -3282,13 +3376,18 @@ action_t* paladin_t::create_action( util::string_view name, util::string_view op
32823376
if ( name == "lay_on_hands" )
32833377
return new lay_on_hands_t( this, options_str );
32843378
if ( name == "hammer_of_wrath" )
3285-
return new hammer_of_wrath_t( this, "hammer_of_wrath", options_str );
3379+
{
3380+
if ( specialization() == PALADIN_PROTECTION )
3381+
return new hammer_of_wrath_t( this, "hammer_of_wrath", options_str, find_spell( 1241413 ) );
3382+
else if ( specialization() == PALADIN_RETRIBUTION )
3383+
return new hammer_of_wrath_t( this, "hammer_of_wrath", options_str, find_spell( 24275 ) );
3384+
}
32863385
if ( name == "judgment" )
32873386
{
32883387
if ( specialization() == PALADIN_PROTECTION )
3289-
return new judgment_t( this, "judgment", options_str );
3388+
return new judgment_t( this, "judgment", options_str, find_spell( 275779 ) );
32903389
else if ( specialization() == PALADIN_RETRIBUTION )
3291-
return new judgment_ret_t( this, "judgment", options_str );
3390+
return new judgment_ret_t( this, "judgment", options_str, find_spell( 20271 ) );
32923391
}
32933392
if ( name == "devotion_aura" )
32943393
return new devotion_aura_t( this, options_str );
@@ -3512,7 +3611,10 @@ void paladin_t::create_buffs()
35123611
this->active.divine_resonance->schedule_execute();
35133612
} );
35143613
else
3614+
{
35153615
buffs.divine_resonance = make_buff( this, "divine_resonance", find_spell( 1266308 ) );
3616+
buffs.divine_resonance->set_initial_stack( buffs.divine_resonance->max_stack() );
3617+
}
35163618

35173619
buffs.hammer_of_wrath = make_buff( this, "hammer_of_wrath", find_spell( 1277026 ) );
35183620

engine/class_modules/paladin/sc_paladin.hpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,11 @@ struct paladin_t : public player_t
113113

114114
// Covenant stuff
115115
action_t* divine_toll;
116+
action_t* divine_toll_how;
116117
action_t* divine_resonance;
118+
action_t* divine_resonance_ret;
119+
action_t* divine_resonance_ret_how;
117120
action_t* divine_exaction_prot;
118-
action_t* divine_exaction_ret;
119121

120122
// talent stuff
121123
action_t* background_cons;
@@ -427,6 +429,11 @@ struct paladin_t : public player_t
427429
const spell_data_t* blaze_of_glory;
428430
const spell_data_t* light_within;
429431

432+
// More Hammer of Wrath spell data for Ret
433+
const spell_data_t* judgment_ret;
434+
const spell_data_t* judgment_ret_dt;
435+
const spell_data_t* hammer_of_wrath_ret;
436+
const spell_data_t* hammer_of_wrath_ret_dt;
430437
} spells;
431438

432439
struct rppms_t {
@@ -1730,21 +1737,24 @@ struct judgment_base_t : public paladin_melee_attack_t
17301737
void impact( action_state_t* s ) override;
17311738
void execute();
17321739
};
1740+
17331741
struct hammer_of_wrath_t : public judgment_base_t
17341742
{
17351743
private:
17361744
hammer_of_wrath_t* echo;
17371745

17381746
public:
1739-
hammer_of_wrath_t( paladin_t* p, util::string_view name, util::string_view options_str, double mul = 1.0, bool bg = false );
1747+
hammer_of_wrath_t( paladin_t* p, util::string_view name, util::string_view options_str, const spell_data_t* s = spell_data_t::nil());
17401748
void impact( action_state_t* s ) override;
17411749
double composite_target_multiplier( player_t* target ) const override;
17421750
bool action_ready() override;
1751+
void execute() override;
17431752
};
17441753

17451754
struct judgment_t : public judgment_base_t
17461755
{
1747-
judgment_t( paladin_t* p, util::string_view name, util::string_view options_str, double mul = 1.0, bool bg = false );
1756+
judgment_t( paladin_t* p, util::string_view name, util::string_view options_str,
1757+
const spell_data_t* s = spell_data_t::nil() );
17481758

17491759
proc_types proc_type() const override;
17501760
void execute() override;

engine/class_modules/paladin/sc_paladin_retribution.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,10 @@ void paladin_t::init_spells_retribution()
11211121
spells.highlords_judgment_hidden = find_spell( 449198 );
11221122
spells.light_within = find_spell( 1261160 );
11231123
spells.expurgation = find_spell( 383346 );
1124+
spells.judgment_ret = find_spell( 20271 );
1125+
spells.judgment_ret_dt = find_spell( 20271 ); // Should be 406957, but that's not in spell data
1126+
spells.hammer_of_wrath_ret = find_spell( 24275 );
1127+
spells.hammer_of_wrath_ret_dt = find_spell( 1279408 );
11241128
}
11251129

11261130
// Action Priority List Generation

0 commit comments

Comments
 (0)