From 263c968cc8238c0927b351b0d52c2902f2de1f79 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 2 Nov 2023 11:24:54 +0000 Subject: [PATCH] Fix the Hanagumi Hall ring vent overflow The way the cap was being handled was kind of messed up, and was trying to subtract your existing Super Ring count. But because the datatype doesn't support negative numbers, it rolled under to approx UINT16_MAX! Fix the datatypes and add the extra over-range check to prevent this from happening again. --- src/k_kart.c | 6 +++++- src/k_kart.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1af666237..92c378774 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3650,7 +3650,7 @@ angle_t K_MomentumAngleReal(const mobj_t *mo) } } -void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload) +void K_AwardPlayerRings(player_t *player, UINT16 rings, boolean overload) { UINT16 superring; @@ -3661,7 +3661,11 @@ void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload) /* capped at 20 rings */ if ((totalrings + rings) > 20) + { + if (totalrings >= 20) + return; // woah dont let that go negative buster rings = (20 - totalrings); + } } superring = player->superring + rings; diff --git a/src/k_kart.h b/src/k_kart.h index cbaf17554..7a4424f08 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -105,7 +105,7 @@ void K_KartPlayerAfterThink(player_t *player); angle_t K_MomentumAngleEx(const mobj_t *mo, const fixed_t threshold); angle_t K_MomentumAngleReal(const mobj_t *mo); #define K_MomentumAngle(mo) K_MomentumAngleEx(mo, 6 * mo->scale) -void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload); +void K_AwardPlayerRings(player_t *player, UINT16 rings, boolean overload); void K_DoInstashield(player_t *player); void K_DoPowerClash(mobj_t *t1, mobj_t *t2); void K_DoGuardBreak(mobj_t *t1, mobj_t *t2);