diff --git a/engine/player/unique_gear_midnight.cpp b/engine/player/unique_gear_midnight.cpp index 76dc1dc5739..345da2beee3 100644 --- a/engine/player/unique_gear_midnight.cpp +++ b/engine/player/unique_gear_midnight.cpp @@ -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( "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( 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( 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( 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( 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( 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( std::lround( effect.driver()->effectN( 3 ).average( effect ) / totem_decrement ) ) ); + auto totem = create_buff( effect.player, "brittle_torga_totem", + effect.player->find_spell( 1292300 ) ) + ->add_stat_from_effect_type( A_MOD_RATING, totem_decrement ) + ->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 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 @@ -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