From 65a4f33b6fd84b976f63e5d48da3c88bb84075a0 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 12 Mar 2023 14:41:15 +0000 Subject: [PATCH] R_GetEngineClass Before unlockable conditions dependent on Engine Class are added, standardise the system. - enum constant in r_skins.h from A-I + J - Engine Class J is for SF_IRONMAN - The Joker in the pack of cards - Also immediately after I in the alphabet - It's a Jape that works on multiple levels - Integrate into K_UpdateEngineSounds - Ignores Engine Class J - Show the Engine Class in character select extrainfo mode, even in situations character name would have been the only thing shown --- src/k_kart.c | 14 ++------------ src/k_menudraw.c | 18 +++++++++++++----- src/r_skins.c | 19 +++++++++++++++++++ src/r_skins.h | 19 +++++++++++++++++++ 4 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index c32a67091..ebb85f2dc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7152,7 +7152,7 @@ static void K_UpdateEngineSounds(player_t *player) const UINT16 buttons = K_GetKartButtons(player); - INT32 class, s, w; // engine class number + INT32 class; // engine class number UINT8 volume = 255; fixed_t volumedampen = FRACUNIT; @@ -7167,17 +7167,7 @@ static void K_UpdateEngineSounds(player_t *player) return; } - s = (player->kartspeed - 1) / 3; - w = (player->kartweight - 1) / 3; - -#define LOCKSTAT(stat) \ - if (stat < 0) { stat = 0; } \ - if (stat > 2) { stat = 2; } - LOCKSTAT(s); - LOCKSTAT(w); -#undef LOCKSTAT - - class = s + (3*w); + class = R_GetEngineClass(player->kartspeed, player->kartweight, 0); // there are no unique sounds for ENGINECLASS_J #if 0 if ((leveltime % 8) != ((player-players) % 8)) // Per-player offset, to make engines sound distinct! diff --git a/src/k_menudraw.c b/src/k_menudraw.c index eb0cf5e00..4a2ed788c 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -1488,23 +1488,31 @@ static void M_DrawCharSelectPreview(UINT8 num) if (p->showextra == true) { + INT32 randomskin = 0; switch (p->mdepth) { - case CSSTEP_CHARS: // Character Select grid - V_DrawThinString(x-3, y+2, V_6WIDTHSPACE, va("Speed %u - Weight %u", p->gridx+1, p->gridy+1)); - break; case CSSTEP_ALTS: // Select clone case CSSTEP_READY: if (p->clonenum < setup_chargrid[p->gridx][p->gridy].numskins && setup_chargrid[p->gridx][p->gridy].skinlist[p->clonenum] < numskins) { - V_DrawThinString(x-3, y+2, V_6WIDTHSPACE, + V_DrawThinString(x-3, y+12, V_6WIDTHSPACE, skins[setup_chargrid[p->gridx][p->gridy].skinlist[p->clonenum]].name); + randomskin = (skins[setup_chargrid[p->gridx][p->gridy].skinlist[p->clonenum]].flags & SF_IRONMAN); } else { - V_DrawThinString(x-3, y+2, V_6WIDTHSPACE, va("BAD CLONENUM %u", p->clonenum)); + V_DrawThinString(x-3, y+12, V_6WIDTHSPACE, va("BAD CLONENUM %u", p->clonenum)); } + /* FALLTHRU */ + case CSSTEP_CHARS: // Character Select grid + V_DrawThinString(x-3, y+2, V_6WIDTHSPACE, va("Class %c (s %c - w %c)", + ('A' + R_GetEngineClass(p->gridx+1, p->gridy+1, randomskin)), + (randomskin + ? '?' : ('1'+p->gridx)), + (randomskin + ? '?' : ('1'+p->gridy)) + )); break; case CSSTEP_COLORS: // Select color if (p->color < numskincolors) diff --git a/src/r_skins.c b/src/r_skins.c index 317729b16..7623f2232 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -299,6 +299,25 @@ INT32 R_SkinAvailable(const char *name) return -1; } +// Returns engine class dependent on skin properties +engineclass_t R_GetEngineClass(SINT8 speed, SINT8 weight, skinflags_t flags) +{ + if (flags & SF_IRONMAN) + return ENGINECLASS_J; + + speed = (speed - 1) / 3; + weight = (weight - 1) / 3; + +#define LOCKSTAT(stat) \ + if (stat < 0) { stat = 0; } \ + if (stat > 2) { stat = 2; } + LOCKSTAT(speed); + LOCKSTAT(weight); +#undef LOCKSTAT + + return (speed + (3*weight)); +} + // Auxillary function that actually sets the skin static void SetSkin(player_t *player, INT32 skinnum) { diff --git a/src/r_skins.h b/src/r_skins.h index 692c91619..2319326fd 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -75,6 +75,25 @@ enum facepatches { NUMFACES }; +typedef enum { + ENGINECLASS_A, + ENGINECLASS_B, + ENGINECLASS_C, + + ENGINECLASS_D, + ENGINECLASS_E, + ENGINECLASS_F, + + ENGINECLASS_G, + ENGINECLASS_H, + ENGINECLASS_I, + + ENGINECLASS_J + +} engineclass_t; + +engineclass_t R_GetEngineClass(SINT8 speed, SINT8 weight, skinflags_t flags); + /// Externs extern INT32 numskins; extern skin_t skins[MAXSKINS];