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).
This commit is contained in:
toaster 2021-02-14 21:48:55 +00:00
parent 4993d2ce39
commit b66965185a
5 changed files with 21 additions and 18 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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;
}
//