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
This commit is contained in:
toaster 2023-03-12 14:41:15 +00:00
parent 01f6eb71f5
commit 65a4f33b6f
4 changed files with 53 additions and 17 deletions

View file

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

View file

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

View file

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

View file

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