diff --git a/src/d_player.h b/src/d_player.h index 70220414b..75002da11 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -747,7 +747,8 @@ struct player_t UINT8 sparkleanim; // (0 to 19) - Angle offset for ring sparkle animation UINT16 superring; // You were awarded rings, and have this many of them left to spawn on yourself. UINT8 nextringaward; // When should we spawn our next superring ring? - UINT16 ringvolume; // When consuming lots of rings, lower the sound a little. + UINT8 ringvolume; // When consuming lots of rings, lower the sound a little. + UINT8 ringtransparency; // When consuming lots of rings, fade out the rings again. UINT16 ringburst; // Queued number of rings to lose after hitlag ends UINT8 curshield; // see kartshields_t diff --git a/src/g_game.c b/src/g_game.c index d4c062fca..9e2c7d946 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2362,6 +2362,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->checkpointId = checkpointId; p->ringvolume = 255; + p->ringtransparency = 255; p->topAccel = MAXTOPACCEL; diff --git a/src/k_kart.c b/src/k_kart.c index f03344988..8fd2a8154 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8762,6 +8762,14 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) 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--; @@ -11772,6 +11780,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; diff --git a/src/k_kart.h b/src/k_kart.h index 2c5857b78..ad1132f61 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -47,10 +47,15 @@ Make sure this matches the actual number of states #define STUMBLE_AIRTIME TICRATE #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 #define MAXTOPACCEL (12*FRACUNIT) #define TOPACCELREGEN (FRACUNIT/16) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index ae4d93343..fe2291cab 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -385,6 +385,8 @@ static int player_get(lua_State *L) 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,"ringburst")) lua_pushinteger(L, plr->ringburst); else if (fastcmp(field,"curshield")) @@ -907,6 +909,8 @@ static int player_set(lua_State *L) 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,"ringburst")) plr->ringburst = luaL_checkinteger(L, 3); else if (fastcmp(field,"curshield")) diff --git a/src/p_enemy.c b/src/p_enemy.c index f5efa02bb..09fb44e81 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3862,6 +3862,7 @@ void A_AttractChase(mobj_t *actor) 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); diff --git a/src/p_saveg.c b/src/p_saveg.c index e1ed123f9..712a7d9d4 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -490,6 +490,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT16(save->p, players[i].superring); WRITEUINT8(save->p, players[i].nextringaward); WRITEUINT8(save->p, players[i].ringvolume); + WRITEUINT8(save->p, players[i].ringtransparency); WRITEUINT16(save->p, players[i].ringburst); WRITEUINT8(save->p, players[i].curshield); @@ -1063,6 +1064,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) 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].ringburst = READUINT16(save->p); players[i].curshield = READUINT8(save->p);