diff --git a/src/f_finale.c b/src/f_finale.c index 3e595b61c..a39d020c0 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -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); diff --git a/src/r_skins.c b/src/r_skins.c index 7623f2232..212256c21 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -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) diff --git a/src/r_skins.h b/src/r_skins.h index 2319326fd..2770846f1 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -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