R_GetLocalRandomSkin

Randomisation of unlocked characters only for
    - Intro ticker taunt
    - Waiting Players NO WAY? NO WAY!
This commit is contained in:
toaster 2023-04-02 19:11:03 +01:00
parent 37e7b82b8b
commit 92d3392c97
3 changed files with 42 additions and 12 deletions

View file

@ -456,7 +456,7 @@ void F_IntroTicker(void)
else if (finalecount == 47)
{
// Need to use M_Random otherwise it always uses the same sound
INT32 rskin = M_RandomKey(numskins);
UINT32 rskin = R_GetLocalRandomSkin();
UINT8 rtaunt = M_RandomKey(2);
sfxenum_t rsound = skins[rskin].soundsid[SKSKBST1+rtaunt];
S_StartSound(NULL, rsound);
@ -2282,7 +2282,7 @@ void F_StartWaitingPlayers(void)
{
#ifdef NOWAY
INT32 i;
INT32 randskin;
UINT32 randskin;
spritedef_t *sprdef;
spriteframe_t *sprframe;
#endif
@ -2291,7 +2291,7 @@ void F_StartWaitingPlayers(void)
finalecount = 0;
#ifdef NOWAY
randskin = M_RandomKey(numskins);
randskin = R_GetLocalRandomSkin();
if (waitcolormap)
Z_Free(waitcolormap);

View file

@ -284,6 +284,25 @@ boolean R_SkinUsable(INT32 playernum, INT32 skinnum, boolean demoskins)
return (boolean)(gamedata->unlocked[i]);
}
// Returns a random unlocked skin ID.
UINT32 R_GetLocalRandomSkin(void)
{
UINT8 i, usableskins = 0;
UINT8 grabskins[MAXSKINS];
for (i = 0; i < numskins; i++)
{
if (!R_SkinUsable(-1, i, false))
continue;
grabskins[usableskins++] = i;
}
if (!usableskins)
I_Error("R_GetLocalRandomSkin: No valid skins to pick from!?");
return grabskins[M_RandomKey(usableskins)];
}
// returns true if the skin name is found (loaded from pwad)
// warning return -1 if not found
INT32 R_SkinAvailable(const char *name)

View file

@ -101,23 +101,34 @@ extern skin_t skins[MAXSKINS];
extern CV_PossibleValue_t Forceskin_cons_t[];
/// Function prototypes
void R_InitSkins(void);
// Loading
void R_InitSkins(void);
void R_AddSkins(UINT16 wadnum, boolean mainfile);
void R_PatchSkins(UINT16 wadnum, boolean mainfile);
// Access
INT32 R_SkinAvailable(const char *name);
boolean R_SkinUsable(INT32 playernum, INT32 skinnum, boolean demoskins);
UINT8 *R_GetSkinAvailabilities(boolean demolock, boolean forbots);
// Setting
void SetPlayerSkin(INT32 playernum,const char *skinname);
void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002
// Set backup
INT32 GetSkinNumClosestToStats(UINT8 kartspeed, UINT8 kartweight, UINT32 flags, boolean unlock);
UINT8 R_BotDefaultSkin(void);
// Heavy Magician
void SetFakePlayerSkin(player_t* player, INT32 skinnum);
void SetRandomFakePlayerSkin(player_t* player, boolean fast);
void ClearFakePlayerSkin(player_t* player);
boolean R_SkinUsable(INT32 playernum, INT32 skinnum, boolean demoskins);
INT32 GetSkinNumClosestToStats(UINT8 kartspeed, UINT8 kartweight, UINT32 flags, boolean unlock);
UINT8 *R_GetSkinAvailabilities(boolean demolock, boolean forbots);
INT32 R_SkinAvailable(const char *name);
UINT8 R_BotDefaultSkin(void);
void R_PatchSkins(UINT16 wadnum, boolean mainfile);
void R_AddSkins(UINT16 wadnum, boolean mainfile);
// Visual flair
UINT32 R_GetLocalRandomSkin(void);
// Sprite2
UINT8 P_GetSkinSprite2(skin_t *skin, UINT8 spr2, player_t *player);
#ifdef __cplusplus