diff --git a/src/k_kart.c b/src/k_kart.c index 062f093e3..49b41c449 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3435,6 +3435,29 @@ void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDam K_AddHitLag(mo2, finalTics, false); // mo2 is the inflictor, so don't use the damage property. } +void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload) +{ + UINT16 superring; + + if (!overload) + { + INT32 totalrings = + RINGTOTAL(player) + (player->superring / 3); + + /* capped at 20 rings */ + if ((totalrings + rings) > 20) + rings = (20 - totalrings); + } + + superring = player->superring + (rings * 3); + + /* overflow */ + if (superring < player->superring) + superring += (player->superring - superring); + + player->superring = superring; +} + void K_DoInstashield(player_t *player) { mobj_t *layera; @@ -10099,9 +10122,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } break; case KITEM_SUPERRING: - if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO && player->superring < (UINT16_MAX - (10*3))) + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) { - player->superring += (10*3); + K_AwardPlayerRings(player, 10, true); player->itemamount--; } break; diff --git a/src/k_kart.h b/src/k_kart.h index 5a6555db0..aaaf7f26f 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -67,6 +67,7 @@ void K_KartPlayerAfterThink(player_t *player); angle_t K_MomentumAngle(mobj_t *mo); void K_AddHitLag(mobj_t *mo, INT32 tics, boolean fromDamage); void K_SetHitLagForObjects(mobj_t *mo1, mobj_t *mo2, INT32 tics, boolean fromDamage); +void K_AwardPlayerRings(player_t *player, INT32 rings, boolean overload); void K_DoInstashield(player_t *player); void K_DoPowerClash(player_t *t1, player_t *t2); void K_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UINT8 bumpersRemoved); diff --git a/src/p_inter.c b/src/p_inter.c index 27455872d..3416c3996 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1403,7 +1403,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget // special behavior for ring capsules if (target->threshold == KITEM_SUPERRING) { - player->superring = min(player->superring + 5*target->movecount*3, UINT16_MAX); + K_AwardPlayerRings(player, 5 * target->movecount, true); break; }