diff --git a/src/lua_baselib.c b/src/lua_baselib.c index b33db8728..c400f01c5 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1195,8 +1195,8 @@ static int lib_pGivePlayerRings(lua_State *L) INLEVEL if (!player) return LUA_ErrInvalid(L, "player_t"); - P_GivePlayerRings(player, num_rings); - return 0; + lua_pushinteger(L, P_GivePlayerRings(player, num_rings)); + return 1; } static int lib_pGivePlayerLives(lua_State *L) diff --git a/src/p_enemy.c b/src/p_enemy.c index a2c719609..c96bf979f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4186,10 +4186,8 @@ void A_AttractChase(mobj_t *actor) { if (actor->extravalue1 >= 16) { - if (actor->target->player->rings >= 20) + if (!P_GivePlayerRings(actor->target->player, 1)) // returns 0 if addition failed actor->target->player->kartstuff[k_ringboost] += K_GetKartRingPower(actor->target->player)+3; - else - P_GivePlayerRings(actor->target->player, 1); if (actor->cvmem) // caching S_StartSound(actor->target, sfx_s1c5); diff --git a/src/p_inter.c b/src/p_inter.c index 4371752c8..eb2cabc66 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2211,15 +2211,14 @@ void P_PlayerRingBurst(player_t *player, INT32 num_rings) if (K_GetShieldFromItem(player->kartstuff[k_itemtype]) != KSHIELD_NONE) return; - // 20 is the ring cap in kart + // 20 is the maximum number of rings that can be taken from you at once - half the span of your counter if (num_rings > 20) num_rings = 20; else if (num_rings <= 0) return; - num_fling_rings = min(num_rings, player->rings); - - P_GivePlayerRings(player, -num_rings); + num_rings = -P_GivePlayerRings(player, -num_rings); + num_fling_rings = num_rings+min(0, player->rings); // determine first angle fa = player->mo->angle + ((P_RandomByte() & 1) ? -ANGLE_90 : ANGLE_90); diff --git a/src/p_local.h b/src/p_local.h index c5eac863e..be4065466 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -167,7 +167,7 @@ boolean P_EndingMusic(player_t *player); void P_SpawnShieldOrb(player_t *player); void P_SwitchShield(player_t *player, UINT16 shieldtype); mobj_t *P_SpawnGhostMobj(mobj_t *mobj); -void P_GivePlayerRings(player_t *player, INT32 num_rings); +INT32 P_GivePlayerRings(player_t *player, INT32 num_rings); void P_GivePlayerSpheres(player_t *player, INT32 num_spheres); void P_GivePlayerLives(player_t *player, INT32 numlives); UINT8 P_GetNextEmerald(void); diff --git a/src/p_user.c b/src/p_user.c index e4785b249..963945c7a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -487,23 +487,29 @@ void P_ResetPlayer(player_t *player) // // Gives rings to the player, and does any special things required. // Call this function when you want to increment the player's health. +// Returns the number of rings successfully given (or taken). // -void P_GivePlayerRings(player_t *player, INT32 num_rings) +INT32 P_GivePlayerRings(player_t *player, INT32 num_rings) { + INT32 test; + if (!player->mo) - return; + return 0; if ((gametyperules & GTR_BUMPERS)) // No rings in Battle Mode - return; + return 0; + + test = player->rings + num_rings; + if (test > 20) // Caps at 20 rings, sorry! + num_rings -= (test-20); + else if (test < -20) // Chaotix ring debt! + num_rings -= (test+20); player->rings += num_rings; - //player->totalring += num_rings; // Used for GP lives later + //player->totalring += num_rings; // Used for GP lives later -- maybe you might want to move this earlier to discourage ring debt... - if (player->rings > 20) - player->rings = 20; // Caps at 20 rings, sorry! - else if (player->rings < -20) - player->rings = -20; // Chaotix ring debt! + return num_rings; } //