Skip to content
86 changes: 86 additions & 0 deletions engine/player/unique_gear_midnight.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3118,6 +3118,91 @@ void vile_vial_of_volatile_venom( special_effect_t& effect )
effect.has_use_buff_override = true;
effect.execute_action = create_proc_action<vile_vial_of_volatile_venom_t>( "empowering_venom", effect );
}

// Gebbo's Bottomless Bag
// 1292291 driver
// e1 seashell (1292299) : crit, ramps up over duration (also a self-dot via e5, ignored)
// e2 scroll (1306870) : mastery, decaying to 0 over duration
// e3 totem (1292300) : vers, starting bank
// e4 gralstone (1308012) : haste
// e6 salmon (1308013) : all 4 secondaries
// e7 voidfin (1308014) : all 4 secondaries, debuff
// e8 totem (1292300) : vers, per-cast decrement
void gebbos_bottomless_bag( special_effect_t& effect )
{
constexpr int default_ticks = 12;

auto salmon = create_buff<stat_buff_t>( effect.player, "50lb_midnight_salmon",
effect.player->find_spell( 1308013 ) );
for ( auto s : secondary_ratings )
salmon->add_stat( s, effect.driver()->effectN( 6 ).average( effect ) );

auto gralstone = create_buff<stat_buff_t>( effect.player, "slick_and_slimy_gralstone",
effect.player->find_spell( 1308012 ) )
->add_stat_from_effect_type( A_MOD_RATING, effect.driver()->effectN( 4 ).average( effect ) );

auto voidfin = create_buff<stat_buff_t>( effect.player, "rotting_voidfin",
effect.player->find_spell( 1308014 ) );
for ( auto s : secondary_ratings )
voidfin->add_stat( s, -effect.driver()->effectN( 7 ).average( effect ) );

// reverse + period ticks the stacks down 1/sec, draining to 0 by the time it expires
auto scroll = create_buff<stat_buff_t>( effect.player, "tattered_tortollan_scroll",
effect.player->find_spell( 1306870 ) )
->add_stat_from_effect_type( A_MOD_RATING, effect.driver()->effectN( 2 ).average( effect ) / default_ticks )
->set_max_stack( default_ticks )
->set_reverse( true )
->set_period( 1_s );

// non-reverse + period ramps the stacks up 1/sec instead
auto seashell = create_buff<stat_buff_t>( effect.player, "seriously_sharp_seashell",
effect.player->find_spell( 1292299 ) )
->add_stat_from_effect_type( A_MOD_RATING, effect.driver()->effectN( 1 ).average( effect ) )
->set_max_stack( default_ticks )
->set_period( 1_s );

// drains per cast, until the bank is empty
auto totem_decrement = effect.driver()->effectN( 8 ).average( effect );
auto totem_stacks = std::max(
1, as<int>( std::lround( effect.driver()->effectN( 3 ).average( effect ) / totem_decrement ) ) );
auto totem = create_buff<stat_buff_t>( effect.player, "brittle_torga_totem",
effect.player->find_spell( 1292300 ) )
->add_stat( STAT_VERSATILITY_RATING, totem_decrement )
Comment thread
nyterage marked this conversation as resolved.
Outdated
->set_max_stack( totem_stacks )
->set_reverse( true );

struct totem_drain_cb_t : public dbc_proc_callback_t
{
buff_t* totem;

totem_drain_cb_t( const special_effect_t& e, buff_t* t ) : dbc_proc_callback_t( e.player, e ), totem( t )
{}

void execute( const spell_data_t*, player_t*, action_state_t* s ) override
{
if ( s && s->action && !s->action->background )
totem->decrement();
}
};

auto totem_drain = new special_effect_t( effect.player );
totem_drain->name_str = "brittle_torga_totem_drain";
totem_drain->spell_id = 1292300;
totem_drain->set_can_proc_from_procs( false );
effect.player->special_effects.push_back( totem_drain );

auto totem_drain_cb = new totem_drain_cb_t( *totem_drain, totem );
totem_drain_cb->activate_with_buff( totem, true );

std::array<buff_t*, 6> artifacts{ { salmon, gralstone, voidfin, scroll, seashell, totem } };

effect.player->callbacks.register_callback_execute_function(
effect.spell_id, [ artifacts ]( dbc_proc_callback_t*, const spell_data_t*, player_t* p, action_state_t* ) {
p->rng().range( artifacts )->trigger();
} );

new dbc_proc_callback_t( effect.player, effect );
}
} // namespace trinkets

namespace weapons
Expand Down Expand Up @@ -4158,6 +4243,7 @@ void register_special_effects()
set_min_version( wowv_t( 12, 1, 0 ) );
register_special_effect( 1293316, trinkets::vile_vial_of_volatile_venom );
register_special_effect( 1295179, DISABLED_EFFECT ); // Vile Vial of Volatile Venom equip driver
register_special_effect( 1292291, trinkets::gebbos_bottomless_bag );
reset_version_check();
// Weapons
register_special_effect( { 1253357, 1253359 }, weapons::torments_duality ); // umbral sabre & radiant foil
Expand Down
Loading