Refactor and tweak afterimages, clean up drift release (closes #98)

I pinky promise I did NOT break drifting
This commit is contained in:
GenericHeroGuy 2025-09-16 21:08:32 +02:00
parent 6b6594e430
commit 33348e7c92
3 changed files with 77 additions and 108 deletions

View file

@ -280,6 +280,10 @@ typedef enum
khud_splitcolor, // Skincolor of the leading player
khud_splitposition, // Who are we comparing to?
// Drifting
khud_afterimagetime, // tics left for displaying afterimage
khud_afterimagevalue, // what value the drift ended at
NUMKARTHUD
} karthudtype_t;

View file

@ -5936,9 +5936,6 @@ static INT32 driftskins[] =
SKINCOLOR_VIOLET,
};
static INT32 afterval[MAXPLAYERS];
static tic_t aftertime[MAXPLAYERS];
enum driftgauge_e
{
DGAUGE_NONE = 0,
@ -6049,22 +6046,10 @@ static UINT8 driftrainbow[] = {
static UINT8 wifibars[] = { 6, 11, 16, 21 };
void K_ResetAfterImageValues(void)
{
for (INT32 i = 0; i < MAXPLAYERS; i++)
{
afterval[i] = 0;
aftertime[i] = 0;
}
}
// Based off https://github.com/GenericHeroGuy/ringracers-scripts/blob/master/src/sglua/Lua/HUD/driftgauge.lua
// Original script by GenericHeroGuy, graphics by Spee
void K_DrawDriftGauge(void)
{
// Reset stuff on level load
if (leveltime <= 1)
K_ResetAfterImageValues();
// Actually have it enabled?
if (!cv_driftgauge.value)
return;
@ -6105,12 +6090,6 @@ void K_DrawDriftGauge(void)
if (cv_driftgauge.value == DGAUGE_LEGACYSMALL)
basex += 10*FRACUNIT;
INT32 afterimage = max(0, (INT32)(aftertime[stplyrnum] - leveltime));
if (afterimage)
goto doafterimage;
else if (!stplyr->drift)
return;
INT32 driftval = K_GetKartDriftSparkValue(stplyr);
INT32 driftcharge = min(driftval*4, stplyr->driftcharge);
boolean rainbow = driftcharge >= driftval*4;
@ -6118,6 +6097,15 @@ void K_DrawDriftGauge(void)
const UINT8 backlevel = rainbow ? 4 : max(0, level - 1);
UINT8 *cmap = R_GetTranslationColormap(TC_RAINBOW, rainbow ? 1 + (leveltime % FIRSTSUPERCOLOR) : driftskins[level], GTC_CACHE);
INT32 afterimage = stplyr->karthud[khud_afterimagetime];
if (!stplyr->drift)
{
if (afterimage)
goto doafterimage;
else
return;
}
if (basepatch)
{
UINT8 *backcmap, *basecmap = K_UseColorHud() ? R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE) : NULL;
@ -6206,11 +6194,11 @@ void K_DrawDriftGauge(void)
doafterimage:;
// right, also draw a cool number
INT32 charge = afterimage ? afterval[stplyrnum] : driftcharge*100 / driftval;
INT32 charge = (afterimage ? stplyr->karthud[khud_afterimagevalue] : driftcharge)*100 / driftval;
if (afterimage)
{
flags |= V_TRANSLUCENT*2 - (V_10TRANS * (aftertime[stplyrnum] - leveltime));
cmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_SILVER, GTC_CACHE);
flags |= V_TRANSLUCENT*2 - (V_10TRANS * afterimage);
cmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_GREY, GTC_CACHE);
}
if (gauge->meterfont == OPPRNK_FONT)
@ -6240,15 +6228,4 @@ doafterimage:;
meterfont,
va("%03d", charge)
);*/
// and trigger the afterimage
if (afterimage)
;
else if (stplyr->pflags & PF_DRIFTEND)
{
afterval[stplyrnum] = charge;
aftertime[stplyrnum] = leveltime + 10;
}
else
aftertime[stplyrnum] = 0;
}

View file

@ -6191,6 +6191,9 @@ void K_KartPlayerHUDUpdate(player_t *player)
}
else
player->karthud[khud_cardanimation] = 0;
if (player->karthud[khud_afterimagetime])
player->karthud[khud_afterimagetime]--;
}
#undef RINGANIM_DELAYMAX
@ -8609,13 +8612,16 @@ UINT8 K_GetKartDriftSparkStageForValue(const player_t *player, INT32 value)
{
const INT32 dsv = K_GetKartDriftSparkValue(player);
if (value < 0)
return 0;
switch (value / dsv)
{
case 0: return 0;
default: return 1;
case 1: return 1;
case 2: return 2;
case 3: return K_PurpleDriftActive() ? 3 : 2;
case 4: return 4;
default: return 4;
}
}
@ -8660,10 +8666,8 @@ static void K_KartDrift(player_t *player, boolean onground)
{
fixed_t minspeed = (10 * player->mo->scale);
fixed_t driftadditive = 24;
INT32 dsone = K_GetKartDriftSparkValue(player);
INT32 dstwo = dsone*2;
INT32 dsthree = K_PurpleDriftActive() ? dsone*3 : dsone*4;
INT32 dsfour = dsone*4;
const INT32 dsv = K_GetKartDriftSparkValue(player);
const UINT8 driftstage = K_GetKartDriftSparkStageForValue(player, player->driftcharge);
UINT16 buttons = K_GetKartButtons(player);
// Grown players taking yellow spring panels will go below minspeed for one tic,
@ -8676,73 +8680,60 @@ static void K_KartDrift(player_t *player, boolean onground)
// Holding the Jump button will enable drifting.
// Drift Release (Moved here so you can't "chain" drifts)
if ((player->drift != -5 && player->drift != 5)
&& player->driftcharge < dsone
&& onground)
if (player->drift != -5 && player->drift != 5)
{
player->driftcharge = 0;
}
else if ((player->drift != -5 && player->drift != 5)
&& (player->driftcharge >= dsone && player->driftcharge < dstwo)
&& onground)
{
if (player->driftboost < 20)
player->driftboost = 20;
S_StartSound(player->mo, sfx_s23c);
K_SpawnDriftEFX(player, 1);
player->driftcharge = 0;
}
else if ((player->drift != -5 && player->drift != 5)
&& (player->driftcharge >= dstwo && player->driftcharge < dsthree)
&& onground)
{
if (player->driftboost < 50)
player->driftboost = 50;
if (driftstage && onground)
{
UINT8 boost = 0;
if (cv_kartdriftsounds.value)
S_StartSound(player->mo, sfx_kc5b);
S_StartSound(player->mo, sfx_s23c);
if (!cv_kartdriftsounds.value || driftstage < 3)
S_StartSound(player->mo, sfx_s23c);
K_SpawnDriftEFX(player, 2);
player->driftcharge = 0;
}
else if ((player->drift != -5 && player->drift != 5)
&& player->driftcharge < dsfour
&& onground)
{
if (player->driftboost < 80)
player->driftboost = 80;
if (cv_kartdriftsounds.value)
{
S_StartSound(player->mo, sfx_kc5b);
S_StartSound(player->mo, sfx_kc3c);
S_StartSound(player->mo, sfx_s3k47);
}
else
{
S_StartSound(player->mo, sfx_s23c);
}
K_SpawnDriftEFX(player, 3);
player->driftcharge = 0;
}
else if ((player->drift != -5 && player->drift != 5)
&& player->driftcharge >= dsfour
&& onground)
{
if (player->driftboost < 125)
player->driftboost = 125;
if (cv_kartdriftsounds.value)
{
S_StartSound(player->mo, sfx_kc5b);
S_StartSound(player->mo, sfx_kc4d);
}
else
{
S_StartSound(player->mo, sfx_s23c);
switch (driftstage)
{
case 1:
boost = 20;
break;
case 2:
boost = 50;
if (cv_kartdriftsounds.value)
S_StartSound(player->mo, sfx_kc5b);
break;
case 3:
boost = 80;
if (cv_kartdriftsounds.value)
{
S_StartSound(player->mo, sfx_kc5b);
S_StartSound(player->mo, sfx_kc3c);
S_StartSound(player->mo, sfx_s3k47);
}
break;
case 4:
boost = 125;
if (cv_kartdriftsounds.value)
{
S_StartSound(player->mo, sfx_kc5b);
S_StartSound(player->mo, sfx_kc4d);
}
break;
}
if (player->driftboost < boost)
player->driftboost = boost;
K_SpawnDriftEFX(player, driftstage);
}
K_SpawnDriftEFX(player, 4);
player->driftcharge = 0;
// afterimage, when you release the drift
if (player->pflags & PF_DRIFTEND || (!onground && player->driftcharge))
{
if (!player->karthud[khud_afterimagetime])
player->karthud[khud_afterimagevalue] = min(player->driftcharge, dsv*4);
player->karthud[khud_afterimagetime] = 10;
}
if (onground)
player->driftcharge = 0;
}
// Drifting: left or right?
@ -8811,10 +8802,7 @@ static void K_KartDrift(player_t *player, boolean onground)
player->pflags |= PF_GETSPARKS;
// Sound whenever you get a different tier of sparks
if ((player->driftcharge < dsone && player->driftcharge+driftadditive >= dsone)
|| (player->driftcharge < dstwo && player->driftcharge+driftadditive >= dstwo)
|| (player->driftcharge < dsthree && player->driftcharge+driftadditive >= dsthree)
|| (player->driftcharge < dsfour && player->driftcharge+driftadditive >= dsfour))
if (driftstage < K_GetKartDriftSparkStageForValue(player, player->driftcharge+driftadditive))
{
if (P_IsDisplayPlayer(player)) // UGHGHGH...
S_StartSoundAtVolume(player->mo, sfx_s3ka2, 192); // Ugh...
@ -8829,7 +8817,7 @@ static void K_KartDrift(player_t *player, boolean onground)
// Spawn Sparks regardless of size
if (!P_PlayerInPain(player) && player->drift != 0)
{
if (player->driftcharge >= dsone)
if (driftstage)
K_SpawnDriftSparks(player);
}