Skip to content

Commit 2a8ce48

Browse files
authored
[Gear] Trinket - Gebbo's Bottomless Bag (#11530)
* [Gear] Trinket - Gebbo's Bottomless Bag
1 parent e78bd0f commit 2a8ce48

1 file changed

Lines changed: 86 additions & 0 deletions

File tree

engine/player/unique_gear_midnight.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3136,6 +3136,91 @@ void vile_vial_of_volatile_venom( special_effect_t& effect )
31363136
effect.execute_action = create_proc_action<vile_vial_of_volatile_venom_t>( "empowering_venom", effect );
31373137

31383138
}
3139+
3140+
// Gebbo's Bottomless Bag
3141+
// 1292291 driver
3142+
// e1 seashell (1292299) : crit, ramps up over duration (also a self-dot via e5, ignored)
3143+
// e2 scroll (1306870) : mastery, decaying to 0 over duration
3144+
// e3 totem (1292300) : vers, starting bank
3145+
// e4 gralstone (1308012) : haste
3146+
// e6 salmon (1308013) : all 4 secondaries
3147+
// e7 voidfin (1308014) : all 4 secondaries, debuff
3148+
// e8 totem (1292300) : vers, per-cast decrement
3149+
void gebbos_bottomless_bag( special_effect_t& effect )
3150+
{
3151+
constexpr int default_ticks = 12;
3152+
3153+
auto salmon = create_buff<stat_buff_t>( effect.player, "50lb_midnight_salmon",
3154+
effect.player->find_spell( 1308013 ) );
3155+
for ( auto s : secondary_ratings )
3156+
salmon->add_stat( s, effect.driver()->effectN( 6 ).average( effect ) );
3157+
3158+
auto gralstone = create_buff<stat_buff_t>( effect.player, "slick_and_slimy_gralstone",
3159+
effect.player->find_spell( 1308012 ) )
3160+
->add_stat_from_effect_type( A_MOD_RATING, effect.driver()->effectN( 4 ).average( effect ) );
3161+
3162+
auto voidfin = create_buff<stat_buff_t>( effect.player, "rotting_voidfin",
3163+
effect.player->find_spell( 1308014 ) );
3164+
for ( auto s : secondary_ratings )
3165+
voidfin->add_stat( s, -effect.driver()->effectN( 7 ).average( effect ) );
3166+
3167+
// reverse + period ticks the stacks down 1/sec, draining to 0 by the time it expires
3168+
auto scroll = create_buff<stat_buff_t>( effect.player, "tattered_tortollan_scroll",
3169+
effect.player->find_spell( 1306870 ) )
3170+
->add_stat_from_effect_type( A_MOD_RATING, effect.driver()->effectN( 2 ).average( effect ) / default_ticks )
3171+
->set_max_stack( default_ticks )
3172+
->set_reverse( true )
3173+
->set_period( 1_s );
3174+
3175+
// non-reverse + period ramps the stacks up 1/sec instead
3176+
auto seashell = create_buff<stat_buff_t>( effect.player, "seriously_sharp_seashell",
3177+
effect.player->find_spell( 1292299 ) )
3178+
->add_stat_from_effect_type( A_MOD_RATING, effect.driver()->effectN( 1 ).average( effect ) )
3179+
->set_max_stack( default_ticks )
3180+
->set_period( 1_s );
3181+
3182+
// drains per cast, until the bank is empty
3183+
auto totem_decrement = effect.driver()->effectN( 8 ).average( effect );
3184+
auto totem_stacks = std::max(
3185+
1, as<int>( std::lround( effect.driver()->effectN( 3 ).average( effect ) / totem_decrement ) ) );
3186+
auto totem = create_buff<stat_buff_t>( effect.player, "brittle_torga_totem",
3187+
effect.player->find_spell( 1292300 ) )
3188+
->add_stat_from_effect_type( A_MOD_RATING, totem_decrement )
3189+
->set_max_stack( totem_stacks )
3190+
->set_reverse( true );
3191+
3192+
struct totem_drain_cb_t : public dbc_proc_callback_t
3193+
{
3194+
buff_t* totem;
3195+
3196+
totem_drain_cb_t( const special_effect_t& e, buff_t* t ) : dbc_proc_callback_t( e.player, e ), totem( t )
3197+
{}
3198+
3199+
void execute( const spell_data_t*, player_t*, action_state_t* s ) override
3200+
{
3201+
if ( s && s->action && !s->action->background )
3202+
totem->decrement();
3203+
}
3204+
};
3205+
3206+
auto totem_drain = new special_effect_t( effect.player );
3207+
totem_drain->name_str = "brittle_torga_totem_drain";
3208+
totem_drain->spell_id = 1292300;
3209+
totem_drain->set_can_proc_from_procs( false );
3210+
effect.player->special_effects.push_back( totem_drain );
3211+
3212+
auto totem_drain_cb = new totem_drain_cb_t( *totem_drain, totem );
3213+
totem_drain_cb->activate_with_buff( totem, true );
3214+
3215+
std::array<buff_t*, 6> artifacts{ { salmon, gralstone, voidfin, scroll, seashell, totem } };
3216+
3217+
effect.player->callbacks.register_callback_execute_function(
3218+
effect.spell_id, [ artifacts ]( dbc_proc_callback_t*, const spell_data_t*, player_t* p, action_state_t* ) {
3219+
p->rng().range( artifacts )->trigger();
3220+
} );
3221+
3222+
new dbc_proc_callback_t( effect.player, effect );
3223+
}
31393224
} // namespace trinkets
31403225

31413226
namespace weapons
@@ -4177,6 +4262,7 @@ void register_special_effects()
41774262
register_special_effect( 1295058, trinkets::wavecallers_seastone );
41784263
register_special_effect( 1293316, trinkets::vile_vial_of_volatile_venom );
41794264
register_special_effect( 1295179, DISABLED_EFFECT ); // Vile Vial of Volatile Venom equip driver
4265+
register_special_effect( 1292291, trinkets::gebbos_bottomless_bag );
41804266
reset_version_check();
41814267
// Weapons
41824268
register_special_effect( { 1253357, 1253359 }, weapons::torments_duality ); // umbral sabre & radiant foil

0 commit comments

Comments
 (0)