diff --git a/engine/player/unique_gear_midnight.cpp b/engine/player/unique_gear_midnight.cpp index aa3769f2d2c..dc9ff5dec60 100644 --- a/engine/player/unique_gear_midnight.cpp +++ b/engine/player/unique_gear_midnight.cpp @@ -2956,6 +2956,71 @@ void tangle_of_vibrant_vines( special_effect_t& effect ) new dbc_proc_callback_t( effect.player, effect ); } + +// 1260633 driver +// 1260627 damage +// 1263141 absorb +void gloomspattered_dreadscale( special_effect_t& effect ) +{ + struct fractional_absorb_t : public absorb_buff_t + { + double absorb_fraction; + + fractional_absorb_t( player_t* player, std::string_view name, const spell_data_t* spell, + const item_t* item = nullptr ) + : absorb_buff_t( player, name, spell, item ), absorb_fraction( 1.0 ) + { + } + + double consume( double amount, action_state_t* state = nullptr ) override + { + return absorb_buff_t::consume( amount * absorb_fraction, state ); + } + + absorb_buff_t* set_absorb_fraction( double fraction ) + { + absorb_fraction = fraction; + return this; + } + }; + + struct gloomspattered_dreadscale_t : public generic_aoe_proc_t + { + buff_t* absorb; + double shield_amount; + + gloomspattered_dreadscale_t( const special_effect_t& effect ) + : generic_aoe_proc_t( effect, "gloomspattered_dreadscale", effect.driver(), true ), shield_amount( 0 ) + { + auto equip = find_special_effect( effect.player, 1260627 ); + assert( equip && "Gloom-Spattered Dreadscale missing equip effect" ); + + base_dd_min = base_dd_max = equip->driver()->effectN( 1 ).average( effect ); + + auto absorb_spell = effect.player->find_spell( 1263141 ); + absorb = create_buff( effect.player, name(), absorb_spell ) + ->set_absorb_fraction( absorb_spell->effectN( 2 ).percent() ) + ->set_absorb_source( effect.player->get_stats( "gloomspattered_dreadscale_absorb", this ) ); + } + + void execute() override + { + generic_aoe_proc_t::execute(); + + absorb->trigger( -1, shield_amount ); + shield_amount = 0; + } + + void impact( action_state_t* state ) override + { + generic_aoe_proc_t::impact( state ); + + shield_amount += state->result_amount; + } + }; + + effect.execute_action = create_proc_action( "gloomspattered_dreadscale", effect ); +} } // namespace trinkets namespace weapons @@ -3588,6 +3653,8 @@ void register_special_effects() register_special_effect( 1247311, DISABLED_EFFECT ); // Drum of Renewed Bonds on use register_special_effect( 1253120, trinkets::glorious_crusaders_keepsake ); register_special_effect( 1253112, trinkets::sylvan_wakrapuku ); + register_special_effect( 1260633, trinkets::gloomspattered_dreadscale ); + register_special_effect( 1260627, DISABLED_EFFECT ); // Gloom-Spattered Dreadscale Passive Driver // Weapons register_special_effect( { 1253357, 1253359 }, weapons::torments_duality ); // umbral sabre & radiant foil register_special_effect( 1266257, weapons::lightless_lament );