Ring improvements

This commit is contained in:
NepDisk 2025-02-26 00:15:59 -05:00
parent a082850e56
commit d58d3877a7
9 changed files with 93 additions and 14 deletions

View file

@ -606,6 +606,9 @@ struct player_t
UINT8 ringdelay; // (0 to 3) - 3 tic delay between every ring usage
UINT16 ringboost; // Ring boost timer
UINT16 superring; // Spawn rings on top of you every tic!
UINT8 nextringaward; // When should we spawn our next superring ring?
UINT8 ringvolume; // When consuming lots of rings, lower the sound a little.
UINT8 ringtransparency; // When consuming lots of rings, fade out the rings again.
UINT8 curshield; // see kartshields_t
UINT8 bubblecool; // Bubble Shield use cooldown

View file

@ -562,9 +562,6 @@ extern int compuncommitted;
/// Camera always has noclip.
#define NOCLIPCAM
/// Other karma comeback modes
//#define OTHERKARMAMODES
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -2518,6 +2518,9 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
p->eggmanblame = -1;
p->nocontrol = nocontrol;
p->kickstartaccel = kickstartaccel;
p->ringvolume = 255;
p->ringtransparency = 255;
p->spectatorreentry = spectatorreentry;
p->grieftime = grieftime;

View file

@ -3510,21 +3510,25 @@ angle_t K_MomentumAngle(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;
if (!overload)
{
INT32 totalrings =
RINGTOTAL(player) + (player->superring / 3);
RINGTOTAL(player) + (player->superring);
/* 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 * 3);
superring = player->superring + rings;
/* check if not overflow */
if (superring > player->superring)
@ -6997,17 +7001,24 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->superring)
{
if (player->superring % 3 == 0)
player->nextringaward++;
UINT8 ringrate = 3 - min(2, player->superring / 20); // Used to consume fat stacks of cash faster.
if (player->nextringaward >= ringrate)
{
mobj_t *ring = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RING);
ring->extravalue1 = 1; // Ring collect animation timer
ring->angle = player->mo->angle; // animation angle
P_SetTarget(&ring->target, player->mo); // toucher for thinker
player->pickuprings++;
if (player->superring <= 3)
if (player->superring == 1)
ring->cvmem = 1; // play caching when collected
player->nextringaward = 0;
player->superring--;
}
player->superring--;
}
else
{
player->nextringaward = 99; // Next time we need to award superring, spawn the first one instantly.
}
// Start at lap 1 when using old checkpoint system just to be safe.
@ -7021,6 +7032,21 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->hyudorotimer)
player->hyudorotimer--;
if (player->ringvolume < MINRINGVOLUME)
player->ringvolume = MINRINGVOLUME;
else if (MAXRINGVOLUME - player->ringvolume < RINGVOLUMEREGEN)
player->ringvolume = MAXRINGVOLUME;
else
player->ringvolume += RINGVOLUMEREGEN;
// :D
if (player->ringtransparency < MINRINGTRANSPARENCY)
player->ringtransparency = MINRINGTRANSPARENCY;
else if (MAXRINGTRANSPARENCY - player->ringtransparency < RINGTRANSPARENCYREGEN)
player->ringtransparency = MAXRINGTRANSPARENCY;
else
player->ringtransparency += RINGTRANSPARENCYREGEN;
if (player->sadtimer)
player->sadtimer--;
@ -9025,6 +9051,20 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
{
mobj_t *ring = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_RING);
P_SetMobjState(ring, S_FASTRING1);
if (P_IsDisplayPlayer(player))
{
UINT8 startfade = 220;
UINT8 transfactor = 10 * (min(startfade, player->ringtransparency)) / startfade;
if (transfactor < 10)
{
transfactor = max(transfactor, 4);
ring->renderflags |= ((10-transfactor) << RF_TRANSSHIFT);
ring->renderflags |= RF_ADD;
}
}
player->ringtransparency -= RINGTRANSPARENCYUSEPENALTY;
ring->extravalue1 = 1; // Ring use animation timer
ring->extravalue2 = 1; // Ring use animation flag
ring->shadowscale = 0;

View file

@ -48,6 +48,17 @@ typedef enum
RESPAWNRS_PO,
} respawnresult_e;
#define MAXRINGVOLUME 255
#define MAXRINGTRANSPARENCY 255
#define MINRINGVOLUME 100
#define MINRINGTRANSPARENCY 100
#define RINGVOLUMECOLLECTPENALTY 3
#define RINGTRANSPARENCYCOLLECTPENALTY 0
#define RINGVOLUMEUSEPENALTY 15
#define RINGTRANSPARENCYUSEPENALTY 15
#define RINGVOLUMEREGEN 1
#define RINGTRANSPARENCYREGEN 3
angle_t K_ReflectAngle(angle_t angle, angle_t against, fixed_t maxspeed, fixed_t yourspeed);
void K_RegisterKartStuff(void);
@ -85,7 +96,7 @@ UINT8 K_RaceLapCount(INT16 mapNum);
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
void K_KartPlayerAfterThink(player_t *player);
angle_t K_MomentumAngle(mobj_t *mo);
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_BattleAwardHit(player_t *player, player_t *victim, mobj_t *inflictor, UINT8 bumpersRemoved);
void K_SpinPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 type);

View file

@ -330,12 +330,20 @@ static int player_get(lua_State *L)
lua_pushinteger(L, plr->ringboost);
else if (fastcmp(field,"superring"))
lua_pushinteger(L, plr->superring);
else if (fastcmp(field,"nextringaward"))
lua_pushinteger(L, plr->nextringaward);
else if (fastcmp(field,"ringvolume"))
lua_pushinteger(L, plr->ringvolume);
else if (fastcmp(field,"ringtransparency"))
lua_pushinteger(L, plr->ringtransparency);
else if (fastcmp(field,"curshield"))
lua_pushinteger(L, plr->curshield);
else if (fastcmp(field,"bubblecool"))
lua_pushinteger(L, plr->bubblecool);
else if (fastcmp(field,"bubbleblowup"))
lua_pushinteger(L, plr->bubbleblowup);
else if (fastcmp(field,"bubblepop"))
lua_pushinteger(L, plr->bubblepop);
else if (fastcmp(field,"flamedash"))
lua_pushinteger(L, plr->flamedash);
else if (fastcmp(field,"flamemeter"))
@ -733,12 +741,20 @@ static int player_set(lua_State *L)
plr->ringboost = luaL_checkinteger(L, 3);
else if (fastcmp(field,"superring"))
plr->superring = luaL_checkinteger(L, 3);
else if (fastcmp(field,"nextringaward"))
plr->nextringaward = luaL_checkinteger(L, 3);
else if (fastcmp(field,"ringvolume"))
plr->ringvolume = luaL_checkinteger(L, 3);
else if (fastcmp(field,"ringtransparency"))
plr->ringtransparency = luaL_checkinteger(L, 3);
else if (fastcmp(field,"curshield"))
plr->curshield = luaL_checkinteger(L, 3);
else if (fastcmp(field,"bubblecool"))
plr->bubblecool = luaL_checkinteger(L, 3);
else if (fastcmp(field,"bubbleblowup"))
plr->bubbleblowup = luaL_checkinteger(L, 3);
else if (fastcmp(field,"bubblepop"))
plr->bubblepop = luaL_checkinteger(L, 3);
else if (fastcmp(field,"flamedash"))
plr->flamedash = luaL_checkinteger(L, 3);
else if (fastcmp(field,"flamemeter"))

View file

@ -3581,7 +3581,9 @@ void A_AttractChase(mobj_t *actor)
// Base add is 3 tics for 9,9, adds 1 tic for each point closer to the 1,1 end
actor->target->player->ringboost += K_GetKartRingPower(actor->target->player, true) + 3;
S_StartSound(actor->target, sfx_s1b5);
S_StartSoundAtVolume(actor->target, sfx_s1b5, actor->target->player->ringvolume);
actor->target->player->ringvolume -= RINGVOLUMEUSEPENALTY;
P_KillMobj(actor, actor->target, actor->target, DMG_NORMAL);
return;
@ -3608,7 +3610,10 @@ void A_AttractChase(mobj_t *actor)
if (actor->cvmem) // caching
S_StartSound(actor->target, sfx_s1c5);
else
S_StartSound(actor->target, sfx_s227);
S_StartSoundAtVolume(actor->target, sfx_s227, actor->target->player->ringvolume);
actor->target->player->ringvolume -= RINGVOLUMECOLLECTPENALTY;
actor->target->player->ringtransparency -= RINGTRANSPARENCYCOLLECTPENALTY;
actor->target->player->pickuprings--;
P_RemoveMobj(actor);

View file

@ -116,9 +116,7 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon)
return false;
if ((gametyperules & GTR_BUMPERS) // No bumpers in Match
#ifndef OTHERKARMAMODES
&& !weapon
#endif
&& player->bumper <= 0)
return false;

View file

@ -299,6 +299,9 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT8(save->p, players[i].ringdelay);
WRITEUINT16(save->p, players[i].ringboost);
WRITEUINT16(save->p, players[i].superring);
WRITEUINT8(save->p, players[i].nextringaward);
WRITEUINT8(save->p, players[i].ringvolume);
WRITEUINT8(save->p, players[i].ringtransparency);
WRITEUINT8(save->p, players[i].curshield);
WRITEUINT8(save->p, players[i].bubblecool);
@ -601,6 +604,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].ringdelay = READUINT8(save->p);
players[i].ringboost = READUINT16(save->p);;
players[i].superring = READUINT16(save->p);
players[i].nextringaward = READUINT8(save->p);
players[i].ringvolume = READUINT8(save->p);
players[i].ringtransparency = READUINT8(save->p);
players[i].curshield = READUINT8(save->p);
players[i].bubblecool = READUINT8(save->p);