@@ -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
31413226namespace 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