From b66965185ae692e669e32a0b96c303846f35212d Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 14 Feb 2021 21:48:55 +0000 Subject: [PATCH] Caltrop calstop (resolves #114). If a ring isn't lost from the counter, don't drop a caltrop. This is done by changing the function signature of P_GivePlayerRings to return the number of rings it has successfully given (or taken away) (which can differ from the rings provided to it). This change has been done for Lua as well. Super Ring absorbtion now uses this system too, so you only need to change one location to modify the maximum and minimum number of rings a player can have (as far as I am aware). --- src/lua_baselib.c | 4 ++-- src/p_enemy.c | 4 +--- src/p_inter.c | 7 +++---- src/p_local.h | 2 +- src/p_user.c | 22 ++++++++++++++-------- 5 files changed, 21 insertions(+), 18 deletions(-) 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; } //