Merge branch 'skinlimit' into 'master'

Increase skin limit to 1024

See merge request kart-krew-dev/ring-racers-internal!2743
This commit is contained in:
Oni VelocitOni 2025-08-23 05:03:58 +00:00
commit 3f7ae9dd23
27 changed files with 282 additions and 217 deletions

View file

@ -1645,7 +1645,7 @@ bool CallFunc_PlayerSkin(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::
&& (info->mo != NULL && P_MobjWasRemoved(info->mo) == false) && (info->mo != NULL && P_MobjWasRemoved(info->mo) == false)
&& (info->mo->player != NULL)) && (info->mo->player != NULL))
{ {
UINT8 skin = info->mo->player->skin; UINT16 skin = info->mo->player->skin;
thread->dataStk.push(~env->getString( skins[skin]->name )->idx); thread->dataStk.push(~env->getString( skins[skin]->name )->idx);
return false; return false;
} }

View file

@ -1208,7 +1208,7 @@ static void SV_SendPlayerInfo(INT32 node)
netbuffer->u.playerinfo[i].score = LONG(players[i].score); netbuffer->u.playerinfo[i].score = LONG(players[i].score);
netbuffer->u.playerinfo[i].timeinserver = SHORT((UINT16)(players[i].jointime / TICRATE)); netbuffer->u.playerinfo[i].timeinserver = SHORT((UINT16)(players[i].jointime / TICRATE));
netbuffer->u.playerinfo[i].skin = (UINT8)(players[i].skin); netbuffer->u.playerinfo[i].deprecated_skin = 0xFF;
// Extra data // Extra data
netbuffer->u.playerinfo[i].data = 0; //players[i].skincolor; netbuffer->u.playerinfo[i].data = 0; //players[i].skincolor;
@ -3863,7 +3863,7 @@ static void Got_RemovePlayer(const UINT8 **p, INT32 playernum)
static void Got_AddBot(const UINT8 **p, INT32 playernum) static void Got_AddBot(const UINT8 **p, INT32 playernum)
{ {
INT16 newplayernum; INT16 newplayernum;
UINT8 skinnum = 0; UINT16 skinnum = 0;
UINT8 difficulty = DIFFICULTBOT; UINT8 difficulty = DIFFICULTBOT;
botStyle_e style = BOT_STYLE_NORMAL; botStyle_e style = BOT_STYLE_NORMAL;
@ -3879,7 +3879,7 @@ static void Got_AddBot(const UINT8 **p, INT32 playernum)
} }
newplayernum = READUINT8(*p); newplayernum = READUINT8(*p);
skinnum = READUINT8(*p); skinnum = READUINT16(*p);
difficulty = READUINT8(*p); difficulty = READUINT8(*p);
style = READUINT8(*p); style = READUINT8(*p);
@ -4050,11 +4050,11 @@ static boolean SV_AddWaitingPlayers(SINT8 node, UINT8 *availabilities,
} }
/*-------------------------------------------------- /*--------------------------------------------------
boolean K_AddBotFromServer(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *p) boolean K_AddBotFromServer(UINT16 skin, UINT8 difficulty, botStyle_e style, UINT8 *p)
See header file for description. See header file for description.
--------------------------------------------------*/ --------------------------------------------------*/
boolean K_AddBotFromServer(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *p) boolean K_AddBotFromServer(UINT16 skin, UINT8 difficulty, botStyle_e style, UINT8 *p)
{ {
UINT8 newplayernum = *p; UINT8 newplayernum = *p;
@ -4095,7 +4095,7 @@ boolean K_AddBotFromServer(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8
if (server) if (server)
{ {
UINT8 buf[4]; UINT8 buf[5];
UINT8 *buf_p = buf; UINT8 *buf_p = buf;
WRITEUINT8(buf_p, newplayernum); WRITEUINT8(buf_p, newplayernum);
@ -4105,7 +4105,7 @@ boolean K_AddBotFromServer(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8
skin = numskins; skin = numskins;
} }
WRITEUINT8(buf_p, skin); WRITEUINT16(buf_p, skin);
if (difficulty < 1) if (difficulty < 1)
{ {
@ -4555,8 +4555,7 @@ static void HandleConnect(SINT8 node)
/// \todo fix this !!! /// \todo fix this !!!
return; // restart the while return; // restart the while
} }
//if (gamestate != GS_LEVEL) // GS_INTERMISSION, etc?
// SV_SendPlayerConfigs(node); // send bare minimum player info
G_SetGamestate(backupstate); G_SetGamestate(backupstate);
DEBFILE("new node joined\n"); DEBFILE("new node joined\n");
} }

View file

@ -348,23 +348,12 @@ struct plrinfo
char name[MAXPLAYERNAME+1]; char name[MAXPLAYERNAME+1];
UINT8 address[4]; // sending another string would run us up against MAXPACKETLENGTH UINT8 address[4]; // sending another string would run us up against MAXPACKETLENGTH
UINT8 team; UINT8 team;
UINT8 skin; UINT8 deprecated_skin;
UINT8 data; // Color is first four bits, hasflag, isit and issuper have one bit each, the last is unused. UINT8 data; // Color is first four bits, hasflag, isit and issuper have one bit each, the last is unused.
UINT32 score; UINT32 score;
UINT16 timeinserver; // In seconds. UINT16 timeinserver; // In seconds.
} ATTRPACK; } ATTRPACK;
// Shortest player information for join during intermission.
struct plrconfig
{
char name[MAXPLAYERNAME+1];
UINT8 skin;
UINT16 color;
UINT32 pflags;
UINT32 score;
UINT8 team;
} ATTRPACK;
struct filesneededconfig_pak struct filesneededconfig_pak
{ {
INT32 first; INT32 first;
@ -470,7 +459,6 @@ struct doomdata_t
askinfo_pak askinfo; // 61 bytes askinfo_pak askinfo; // 61 bytes
msaskinfo_pak msaskinfo; // 22 bytes msaskinfo_pak msaskinfo; // 22 bytes
plrinfo playerinfo[MSCOMPAT_MAXPLAYERS];// 576 bytes(?) plrinfo playerinfo[MSCOMPAT_MAXPLAYERS];// 576 bytes(?)
plrconfig playerconfig[MAXPLAYERS]; // (up to) 528 bytes(?)
INT32 filesneedednum; // 4 bytes INT32 filesneedednum; // 4 bytes
filesneededconfig_pak filesneededcfg; // ??? bytes filesneededconfig_pak filesneededcfg; // ??? bytes
netinfo_pak netinfo; // Don't believe their lies netinfo_pak netinfo; // Don't believe their lies
@ -634,7 +622,7 @@ void SV_StopServer(void);
void SV_ResetServer(void); void SV_ResetServer(void);
/*-------------------------------------------------- /*--------------------------------------------------
boolean K_AddBotFromServer(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *newplayernum); boolean K_AddBotFromServer(UINT16 skin, UINT8 difficulty, botStyle_e style, UINT8 *newplayernum);
Adds a new bot, using a server-sided packet sent to all clients. Adds a new bot, using a server-sided packet sent to all clients.
Using regular K_AddBot wherever possible is better, but this is kept Using regular K_AddBot wherever possible is better, but this is kept
@ -651,7 +639,7 @@ void SV_ResetServer(void);
true if a bot can be added via a packet later, otherwise false. true if a bot can be added via a packet later, otherwise false.
--------------------------------------------------*/ --------------------------------------------------*/
boolean K_AddBotFromServer(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *p); boolean K_AddBotFromServer(UINT16 skin, UINT8 difficulty, botStyle_e style, UINT8 *p);
void CL_AddSplitscreenPlayer(void); void CL_AddSplitscreenPlayer(void);
void CL_RemoveSplitscreenPlayer(UINT8 p); void CL_RemoveSplitscreenPlayer(UINT8 p);

View file

@ -1048,13 +1048,13 @@ static void SendNameAndColor(const UINT8 n)
CleanupPlayerName(playernum, cv_playername[n].zstring); CleanupPlayerName(playernum, cv_playername[n].zstring);
} }
char buf[MAXPLAYERNAME+12]; char buf[MAXPLAYERNAME+13];
char *p = buf; char *p = buf;
// Finally write out the complete packet and send it off. // Finally write out the complete packet and send it off.
WRITESTRINGN(p, cv_playername[n].zstring, MAXPLAYERNAME); WRITESTRINGN(p, cv_playername[n].zstring, MAXPLAYERNAME);
WRITEUINT16(p, sendColor); WRITEUINT16(p, sendColor);
WRITEUINT8(p, (UINT8)cv_skin[n].value); WRITEUINT16(p, (UINT16)cv_skin[n].value);
if (horngoner) if (horngoner)
{ {
WRITEINT16(p, (-1)); WRITEINT16(p, (-1));
@ -1135,7 +1135,7 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
player_t *p = &players[playernum]; player_t *p = &players[playernum];
char name[MAXPLAYERNAME+1]; char name[MAXPLAYERNAME+1];
UINT16 color, followercolor; UINT16 color, followercolor;
UINT8 skin; UINT16 skin;
INT16 follower; INT16 follower;
UINT8 i; UINT8 i;
@ -1164,7 +1164,7 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
READSTRINGN(*cp, name, MAXPLAYERNAME); READSTRINGN(*cp, name, MAXPLAYERNAME);
color = READUINT16(*cp); color = READUINT16(*cp);
skin = READUINT8(*cp); skin = READUINT16(*cp);
follower = READINT16(*cp); follower = READINT16(*cp);
followercolor = READUINT16(*cp); followercolor = READUINT16(*cp);

View file

@ -694,8 +694,8 @@ struct player_t
INT32 skin; INT32 skin;
UINT8 availabilities[MAXAVAILABILITY]; UINT8 availabilities[MAXAVAILABILITY];
UINT8 fakeskin; // ironman UINT16 fakeskin; // ironman
UINT8 lastfakeskin; UINT16 lastfakeskin;
UINT8 kartspeed; // Kart speed stat between 1 and 9 UINT8 kartspeed; // Kart speed stat between 1 and 9
UINT8 kartweight; // Kart weight stat between 1 and 9 UINT8 kartweight; // Kart weight stat between 1 and 9

View file

@ -170,9 +170,10 @@ extern char logfilename[1024];
#define MAXSPLITSCREENPLAYERS 4 // Max number of players on a single computer #define MAXSPLITSCREENPLAYERS 4 // Max number of players on a single computer
#define MAXGAMEPADS (MAXSPLITSCREENPLAYERS * 2) // Number of gamepads we'll be allowing #define MAXGAMEPADS (MAXSPLITSCREENPLAYERS * 2) // Number of gamepads we'll be allowing
#define MAXSKINS UINT8_MAX #define MAXSKINS 1024
#define SKINNAMESIZE 16 #define SKINNAMESIZE 16
#define MAXAVAILABILITY ((MAXSKINS + 7)/8) #define MAXSKINUNAVAILABLE 128
#define MAXAVAILABILITY (MAXSKINUNAVAILABLE / 8)
#define COLORRAMPSIZE 16 #define COLORRAMPSIZE 16
#define MAXCOLORNAME 32 #define MAXCOLORNAME 32

View file

@ -145,7 +145,7 @@ extern unloaded_skin_t *unloadedskins;
struct skinreference_t struct skinreference_t
{ {
unloaded_skin_t *unloaded; unloaded_skin_t *unloaded;
UINT8 id; UINT16 id;
}; };
// mapvisited is now a set of flags that says what we've done in the map. // mapvisited is now a set of flags that says what we've done in the map.

View file

@ -98,11 +98,15 @@ tic_t demostarttime; // for comparative timing purposes
static constexpr DemoBufferSizes get_buffer_sizes(UINT16 version) static constexpr DemoBufferSizes get_buffer_sizes(UINT16 version)
{ {
// These sizes are compatible as of version 0x000A if (version < 0x0010)
return {21, 16, 32, 32};
// These sizes are compatible as of version 0x0010
static_assert(MAXPLAYERNAME == 21); static_assert(MAXPLAYERNAME == 21);
static_assert(SKINNAMESIZE == 16); static_assert(SKINNAMESIZE == 16);
static_assert(MAXCOLORNAME == 32); static_assert(MAXCOLORNAME == 32);
return {21, 16, 32}; static_assert(MAXAVAILABILITY == 16);
return {21, 16, 32, 16};
} }
static DemoBufferSizes g_buffer_sizes; static DemoBufferSizes g_buffer_sizes;
@ -138,7 +142,8 @@ static struct {
INT32 health; INT32 health;
// EZT_STATDATA // EZT_STATDATA
UINT8 skinid, kartspeed, kartweight; UINT16 skinid;
UINT8 kartspeed, kartweight;
UINT32 charflags; UINT32 charflags;
UINT8 desyncframes; // Don't try to resync unless we've been off for two frames, to monkeypatch a few trouble spots UINT8 desyncframes; // Don't try to resync unless we've been off for two frames, to monkeypatch a few trouble spots
@ -169,11 +174,14 @@ demoghost *ghosts = NULL;
// - Slope physics changed with a scaling fix // - Slope physics changed with a scaling fix
// - 0x000C (Ring Racers v2.2) // - 0x000C (Ring Racers v2.2)
// - 0x000D (Ring Racers v2.3) // - 0x000D (Ring Racers v2.3)
// - 0x000E (Ring Racers v2.4 in-dev before DYNSLOPE thinker change)
// - 0x000F (Ring Racers v2.4) // Currently supported:
// - 0x000E (Ring Racers 2.4 staff ghosts part 1 - initial recordings)
// - 0x000F (Ring Racers 2.4 staff ghosts part 2 - dynslopes thinker fix)
// - 0x0010 (Ring Racers 2.4 staff ghosts part 3 - skinlimit raise. don't say we never did anythin for 'ya)
#define MINDEMOVERSION 0x000E #define MINDEMOVERSION 0x000E
#define DEMOVERSION 0x000F #define DEMOVERSION 0x0010
boolean G_CompatLevel(UINT16 level) boolean G_CompatLevel(UINT16 level)
{ {
@ -330,6 +338,8 @@ void G_ReadDemoExtraData(void)
{ {
players[p].availabilities[i] = READUINT8(demobuf.p); players[p].availabilities[i] = READUINT8(demobuf.p);
} }
if (g_buffer_sizes.availability > static_cast<size_t>(i))
demobuf.p += (g_buffer_sizes.availability - i);
players[p].bot = !!(READUINT8(demobuf.p)); players[p].bot = !!(READUINT8(demobuf.p));
if (players[p].bot) if (players[p].bot)
@ -389,13 +399,17 @@ void G_ReadDemoExtraData(void)
} }
if (extradata & DXD_SKIN) if (extradata & DXD_SKIN)
{ {
UINT8 skinid; UINT16 skinid;
// Skin // Skin
skinid = READUINT8(demobuf.p); if (demo.version >= 0x0010)
skinid = READUINT16(demobuf.p);
else
skinid = READUINT8(demobuf.p);
if (skinid >= demo.numskins) if (skinid >= demo.numskins)
skinid = 0; skinid = 0;
ghostext[p].skinid = demo.currentskinid[p] = skinid; ghostext[p].skinid = demo.currentskinid[p] = skinid;
SetPlayerSkinByNum(p, skinid); SetPlayerSkinByNum(p, skinid);
@ -537,7 +551,7 @@ void G_WriteDemoExtraData(void)
if (demo_extradata[i] & DXD_SKIN) if (demo_extradata[i] & DXD_SKIN)
{ {
// Skin // Skin
WRITEUINT8(demobuf.p, players[i].skin); WRITEUINT16(demobuf.p, players[i].skin);
} }
if (demo_extradata[i] & DXD_COLOR) if (demo_extradata[i] & DXD_COLOR)
{ {
@ -922,14 +936,14 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
} }
if (ghost->player && ( if (ghost->player && (
ghostext[playernum].skinid != (UINT8)(((skin_t *)ghost->skin)->skinnum) || ghostext[playernum].skinid != (UINT16)(((skin_t *)ghost->skin)->skinnum) ||
ghostext[playernum].kartspeed != ghost->player->kartspeed || ghostext[playernum].kartspeed != ghost->player->kartspeed ||
ghostext[playernum].kartweight != ghost->player->kartweight || ghostext[playernum].kartweight != ghost->player->kartweight ||
ghostext[playernum].charflags != ghost->player->charflags ghostext[playernum].charflags != ghost->player->charflags
)) ))
{ {
ghostext[playernum].flags |= EZT_STATDATA; ghostext[playernum].flags |= EZT_STATDATA;
ghostext[playernum].skinid = (UINT8)(((skin_t *)ghost->skin)->skinnum); ghostext[playernum].skinid = (UINT16)(((skin_t *)ghost->skin)->skinnum);
ghostext[playernum].kartspeed = ghost->player->kartspeed; ghostext[playernum].kartspeed = ghost->player->kartspeed;
ghostext[playernum].kartweight = ghost->player->kartweight; ghostext[playernum].kartweight = ghost->player->kartweight;
ghostext[playernum].charflags = ghost->player->charflags; ghostext[playernum].charflags = ghost->player->charflags;
@ -984,7 +998,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
} }
if (ghostext[playernum].flags & EZT_STATDATA) if (ghostext[playernum].flags & EZT_STATDATA)
{ {
WRITEUINT8(demobuf.p,ghostext[playernum].skinid); WRITEUINT16(demobuf.p,ghostext[playernum].skinid);
WRITEUINT8(demobuf.p,ghostext[playernum].kartspeed); WRITEUINT8(demobuf.p,ghostext[playernum].kartspeed);
WRITEUINT8(demobuf.p,ghostext[playernum].kartweight); WRITEUINT8(demobuf.p,ghostext[playernum].kartweight);
WRITEUINT32(demobuf.p, ghostext[playernum].charflags); WRITEUINT32(demobuf.p, ghostext[playernum].charflags);
@ -1013,7 +1027,7 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
if (ghost->player->followmobj->colorized) if (ghost->player->followmobj->colorized)
followtic |= FZT_COLORIZED; followtic |= FZT_COLORIZED;
if (followtic & FZT_SKIN) if (followtic & FZT_SKIN)
WRITEUINT8(demobuf.p,(UINT8)(((skin_t *)(ghost->player->followmobj->skin))->skinnum)); WRITEUINT16(demobuf.p,(UINT16)(((skin_t *)(ghost->player->followmobj->skin))->skinnum));
oldghost[playernum].flags2 |= MF2_AMBUSH; oldghost[playernum].flags2 |= MF2_AMBUSH;
} }
@ -1160,9 +1174,18 @@ void G_ConsGhostTic(INT32 playernum)
} }
if (xziptic & EZT_STATDATA) if (xziptic & EZT_STATDATA)
{ {
ghostext[playernum].skinid = READUINT8(demobuf.p); UINT16 skinid;
if (ghostext[playernum].skinid >= demo.numskins)
ghostext[playernum].skinid = 0; // Skin
if (demo.version >= 0x0010)
skinid = READUINT16(demobuf.p);
else
skinid = READUINT8(demobuf.p);
if (skinid >= demo.numskins)
skinid = 0;
ghostext[playernum].skinid = skinid;
ghostext[playernum].kartspeed = READUINT8(demobuf.p); ghostext[playernum].kartspeed = READUINT8(demobuf.p);
ghostext[playernum].kartweight = READUINT8(demobuf.p); ghostext[playernum].kartweight = READUINT8(demobuf.p);
ghostext[playernum].charflags = READUINT32(demobuf.p); ghostext[playernum].charflags = READUINT32(demobuf.p);
@ -1176,7 +1199,11 @@ void G_ConsGhostTic(INT32 playernum)
{ {
demobuf.p += sizeof(INT16); demobuf.p += sizeof(INT16);
if (followtic & FZT_SKIN) if (followtic & FZT_SKIN)
{
demobuf.p++; demobuf.p++;
if (demo.version >= 0x0010)
demobuf.p++;
}
} }
if (followtic & FZT_SCALE) if (followtic & FZT_SCALE)
demobuf.p += sizeof(fixed_t); demobuf.p += sizeof(fixed_t);
@ -1247,7 +1274,7 @@ void G_ConsGhostTic(INT32 playernum)
if (players[playernum].kartspeed != ghostext[playernum].kartspeed if (players[playernum].kartspeed != ghostext[playernum].kartspeed
|| players[playernum].kartweight != ghostext[playernum].kartweight || players[playernum].kartweight != ghostext[playernum].kartweight
|| players[playernum].charflags != ghostext[playernum].charflags || || players[playernum].charflags != ghostext[playernum].charflags ||
demo.skinlist[ghostext[playernum].skinid].mapping != (UINT8)(((skin_t *)testmo->skin)->skinnum)) demo.skinlist[ghostext[playernum].skinid].mapping != (UINT16)(((skin_t *)testmo->skin)->skinnum))
{ {
if (demosynced) if (demosynced)
{ {
@ -1289,7 +1316,7 @@ void G_GhostTicker(void)
continue; continue;
} }
// Pause jhosts that cross until the timer starts. // Pause jhosts that cross until the timer starts.
if (g->attackstart != INT32_MAX && leveltime < starttime && leveltime >= g->attackstart && G_TimeAttackStart()) if (g->attackstart != UINT32_MAX && leveltime < starttime && leveltime >= g->attackstart && G_TimeAttackStart())
{ {
continue; continue;
} }
@ -1333,7 +1360,7 @@ fadeghost:
ziptic = READUINT8(g->p); ziptic = READUINT8(g->p);
if (ziptic & DXD_JOINDATA) if (ziptic & DXD_JOINDATA)
{ {
g->p += MAXAVAILABILITY; g->p += g->sizes.availability;
if (READUINT8(g->p) != 0) if (READUINT8(g->p) != 0)
I_Error("Ghost is not a record attack ghost (bot JOINDATA)"); I_Error("Ghost is not a record attack ghost (bot JOINDATA)");
} }
@ -1349,7 +1376,11 @@ fadeghost:
} }
} }
if (ziptic & DXD_SKIN) if (ziptic & DXD_SKIN)
{
g->p++; // We _could_ read this info, but it shouldn't change anything in record attack... g->p++; // We _could_ read this info, but it shouldn't change anything in record attack...
if (g->version >= 0x0010)
g->p++;
}
if (ziptic & DXD_COLOR) if (ziptic & DXD_COLOR)
g->p += g->sizes.color_name; // Same tbh g->p += g->sizes.color_name; // Same tbh
if (ziptic & DXD_NAME) if (ziptic & DXD_NAME)
@ -1511,9 +1542,17 @@ fadeghost:
g->p += 1 + 1 + 4; // itemtype, itemamount, health g->p += 1 + 1 + 4; // itemtype, itemamount, health
if (xziptic & EZT_STATDATA) if (xziptic & EZT_STATDATA)
{ {
UINT8 skinid = READUINT8(g->p); UINT16 skinid;
// Skin
if (g->version >= 0x0010)
skinid = READUINT16(g->p);
else
skinid = READUINT8(g->p);
if (skinid >= g->numskins) if (skinid >= g->numskins)
skinid = 0; skinid = 0;
g->mo->skin = skins[g->skinlist[skinid].mapping]; g->mo->skin = skins[g->skinlist[skinid].mapping];
g->p += 6; // kartspeed, kartweight, charflags g->p += 6; // kartspeed, kartweight, charflags
} }
@ -1549,7 +1588,14 @@ fadeghost:
follow->colorized = true; follow->colorized = true;
if (followtic & FZT_SKIN) if (followtic & FZT_SKIN)
follow->skin = skins[READUINT8(g->p)]; {
UINT16 id;
if (g->version >= 0x0010)
id = READUINT16(g->p);
else
id = READUINT8(g->p);
follow->skin = skins[id];
}
} }
if (follow) if (follow)
{ {
@ -1618,10 +1664,10 @@ skippedghosttic:
I_Error("Ghost is not a record attack ghost GHOSTEND"); //@TODO lmao don't blow up like this I_Error("Ghost is not a record attack ghost GHOSTEND"); //@TODO lmao don't blow up like this
// If the timer started, skip ahead until the ghost starts too. // If the timer started, skip ahead until the ghost starts too.
if (!fastforward && attacktimingstarted && g->attackstart != INT32_MAX && leveltime < g->attackstart && G_TimeAttackStart()) if (!fastforward && attacktimingstarted && g->attackstart != UINT32_MAX && leveltime < g->attackstart && G_TimeAttackStart())
{ {
fastforward = g->attackstart - leveltime; fastforward = g->attackstart - leveltime;
g->attackstart = INT32_MAX; g->attackstart = UINT32_MAX;
} }
if (fastforward) if (fastforward)
@ -1871,10 +1917,10 @@ static UINT8 G_CheckDemoExtraFiles(savebuffer_t *info, boolean quick)
static void G_SaveDemoSkins(UINT8 **pp, const DemoBufferSizes &psizes) static void G_SaveDemoSkins(UINT8 **pp, const DemoBufferSizes &psizes)
{ {
UINT8 i; UINT16 i;
UINT8 *availabilitiesbuffer = R_GetSkinAvailabilities(true, -1); UINT8 *availabilitiesbuffer = R_GetSkinAvailabilities(true, -1);
WRITEUINT8((*pp), numskins); WRITEUINT16((*pp), numskins);
for (i = 0; i < numskins; i++) for (i = 0; i < numskins; i++)
{ {
// Skinname, for first attempt at identification. // Skinname, for first attempt at identification.
@ -1892,9 +1938,10 @@ static void G_SaveDemoSkins(UINT8 **pp, const DemoBufferSizes &psizes)
} }
} }
static democharlist_t *G_LoadDemoSkins(const DemoBufferSizes &psizes, savebuffer_t *info, UINT8 *worknumskins, boolean getclosest) static democharlist_t *G_LoadDemoSkins(const DemoBufferSizes &psizes, savebuffer_t *info, UINT16 *worknumskins, boolean getclosest)
{ {
UINT8 i, byte, shif; UINT16 i;
UINT8 byte, shif;
democharlist_t *skinlist = NULL; democharlist_t *skinlist = NULL;
if (P_SaveBufferRemaining(info) < 1) if (P_SaveBufferRemaining(info) < 1)
@ -1902,7 +1949,11 @@ static democharlist_t *G_LoadDemoSkins(const DemoBufferSizes &psizes, savebuffer
return NULL; return NULL;
} }
(*worknumskins) = READUINT8(info->p); if (psizes.availability == 32) // version isn't accessible here
(*worknumskins) = READUINT8(info->p);
else
(*worknumskins) = READUINT16(info->p);
if (!(*worknumskins)) if (!(*worknumskins))
return NULL; return NULL;
@ -1943,18 +1994,18 @@ static democharlist_t *G_LoadDemoSkins(const DemoBufferSizes &psizes, savebuffer
if (result != -1) if (result != -1)
{ {
skinlist[i].mapping = (UINT8)result; skinlist[i].mapping = (UINT16)result;
} }
} }
if (P_SaveBufferRemaining(info) < psizes.availability)
{
Z_Free(skinlist);
return NULL;
}
for (byte = 0; byte < MAXAVAILABILITY; byte++) for (byte = 0; byte < MAXAVAILABILITY; byte++)
{ {
if (P_SaveBufferRemaining(info) < 1)
{
Z_Free(skinlist);
return NULL;
}
UINT8 availabilitiesbuffer = READUINT8(info->p); UINT8 availabilitiesbuffer = READUINT8(info->p);
for (shif = 0; shif < 8; shif++) for (shif = 0; shif < 8; shif++)
@ -1971,15 +2022,22 @@ static democharlist_t *G_LoadDemoSkins(const DemoBufferSizes &psizes, savebuffer
} }
} }
if (psizes.availability > static_cast<size_t>(byte))
info->p += (psizes.availability - byte);
return skinlist; return skinlist;
} }
static void G_SkipDemoSkins(UINT8 **pp, const DemoBufferSizes& psizes) static void G_SkipDemoSkins(UINT8 **pp, const DemoBufferSizes& psizes)
{ {
UINT8 demonumskins; UINT16 demonumskins;
UINT8 i; UINT16 i;
if (psizes.availability == 32) // version isn't accessible here
demonumskins = READUINT8((*pp));
else
demonumskins = READUINT16((*pp));
demonumskins = READUINT8((*pp));
for (i = 0; i < demonumskins; ++i) for (i = 0; i < demonumskins; ++i)
{ {
(*pp) += psizes.skin_name; // name (*pp) += psizes.skin_name; // name
@ -1988,7 +2046,7 @@ static void G_SkipDemoSkins(UINT8 **pp, const DemoBufferSizes& psizes)
(*pp) += 4; // flags (*pp) += 4; // flags
} }
(*pp) += MAXAVAILABILITY; (*pp) += psizes.availability;
} }
void G_BeginRecording(void) void G_BeginRecording(void)
@ -2086,7 +2144,7 @@ void G_BeginRecording(void)
// If special attack-start timing applies, we need to know where to skip the ghost to // If special attack-start timing applies, we need to know where to skip the ghost to
demoattack_p = demobuf.p; demoattack_p = demobuf.p;
WRITEUINT32(demobuf.p, INT32_MAX); WRITEUINT32(demobuf.p, UINT32_MAX);
demosplits_p = demobuf.p; demosplits_p = demobuf.p;
for (i = 0; i < MAXSPLITS; i++) for (i = 0; i < MAXSPLITS; i++)
@ -2164,8 +2222,8 @@ void G_BeginRecording(void)
} }
// Skin (now index into demo.skinlist) // Skin (now index into demo.skinlist)
WRITEUINT8(demobuf.p, player->skin); WRITEUINT16(demobuf.p, player->skin);
WRITEUINT8(demobuf.p, player->lastfakeskin); WRITEUINT16(demobuf.p, player->lastfakeskin);
WRITEUINT8(demobuf.p, player->team); WRITEUINT8(demobuf.p, player->team);
@ -2305,10 +2363,6 @@ void G_SetDemoCheckpointTiming(player_t *player, tic_t time, UINT8 checkpoint)
if (points <= MAXSPLITS) if (points <= MAXSPLITS)
endtime = g->splits[points-1]; endtime = g->splits[points-1];
// Staff ghost oopsie. Fuckin, uh,
if (endtime == INT32_MAX)
endtime = UINT32_MAX;
if (lowestend > oldbest) // Not losing to any ghost if (lowestend > oldbest) // Not losing to any ghost
{ {
// Not currently losing to a ghost // Not currently losing to a ghost
@ -2488,15 +2542,10 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname)
} p += 12; // DEMOHEADER } p += 12; // DEMOHEADER
p++; // VERSION p++; // VERSION
p++; // SUBVERSION p++; // SUBVERSION
oldversion = READUINT16(p); oldversion = READUINT16(p); // demoversion
switch(oldversion) // demoversion if (oldversion < MINDEMOVERSION || oldversion > DEMOVERSION)
{ {
case 0x000E: // too old, cannot support.
/* fallthru */
case DEMOVERSION: // latest always supported
break;
// too old, cannot support.
default:
CONS_Alert(CONS_NOTICE, M_GetText("File '%s' invalid format. It will be overwritten.\n"), oldname); CONS_Alert(CONS_NOTICE, M_GetText("File '%s' invalid format. It will be overwritten.\n"), oldname);
Z_Free(buffer); Z_Free(buffer);
return UINT8_MAX; return UINT8_MAX;
@ -2601,7 +2650,8 @@ void G_LoadDemoInfo(menudemo_t *pdemo, boolean allownonmultiplayer)
{ {
savebuffer_t info = {0}; savebuffer_t info = {0};
UINT8 *extrainfo_p; UINT8 *extrainfo_p;
UINT8 version, subversion, worknumskins; UINT8 version, subversion;
UINT16 worknumskins;
UINT16 pdemoflags; UINT16 pdemoflags;
democharlist_t *skinlist = NULL; democharlist_t *skinlist = NULL;
UINT16 pdemoversion, count; UINT16 pdemoversion, count;
@ -2639,27 +2689,22 @@ void G_LoadDemoInfo(menudemo_t *pdemo, boolean allownonmultiplayer)
subversion = READUINT8(info.p); subversion = READUINT8(info.p);
pdemoversion = READUINT16(info.p); pdemoversion = READUINT16(info.p);
switch(pdemoversion) if (pdemoversion < MINDEMOVERSION || pdemoversion > DEMOVERSION)
{ {
case 0x000E: // too old, cannot support.
/* fallthru */
case DEMOVERSION: // latest always supported
if (P_SaveBufferRemaining(&info) < 64)
{
goto corrupt;
}
// demo title
M_Memcpy(pdemo->title, info.p, 64);
info.p += 64;
break;
// too old, cannot support.
default:
CONS_Alert(CONS_ERROR, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemo->filepath); CONS_Alert(CONS_ERROR, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemo->filepath);
goto badreplay; goto badreplay;
} }
if (P_SaveBufferRemaining(&info) < 64)
{
goto corrupt;
}
// demo title
M_Memcpy(pdemo->title, info.p, 64);
info.p += 64;
if (version != VERSION || subversion != SUBVERSION) if (version != VERSION || subversion != SUBVERSION)
pdemo->type = MD_OUTDATED; pdemo->type = MD_OUTDATED;
@ -2882,7 +2927,8 @@ void G_DoPlayDemoEx(const char *defdemoname, lumpnum_t deflumpnum)
char msg[1024]; char msg[1024];
boolean spectator, bot; boolean spectator, bot;
UINT8 slots[MAXPLAYERS], lastfakeskin[MAXPLAYERS]; UINT8 slots[MAXPLAYERS];
UINT16 lastfakeskin[MAXPLAYERS];
#if defined(SKIPERRORS) && !defined(DEVELOP) #if defined(SKIPERRORS) && !defined(DEVELOP)
// RR: Don't print warnings for staff ghosts, since they'll inevitably // RR: Don't print warnings for staff ghosts, since they'll inevitably
@ -3038,14 +3084,9 @@ void G_DoPlayDemoEx(const char *defdemoname, lumpnum_t deflumpnum)
version = READUINT8(demobuf.p); version = READUINT8(demobuf.p);
subversion = READUINT8(demobuf.p); subversion = READUINT8(demobuf.p);
demo.version = READUINT16(demobuf.p); demo.version = READUINT16(demobuf.p);
switch(demo.version) if (demo.version < MINDEMOVERSION || demo.version > DEMOVERSION)
{ {
case 0x000E: // too old, cannot support.
/* fallthru */
case DEMOVERSION: // latest always supported
break;
// too old, cannot support.
default:
snprintf(msg, 1024, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemoname); snprintf(msg, 1024, M_GetText("%s is an incompatible replay format and cannot be played.\n"), pdemoname);
CONS_Alert(CONS_ERROR, "%s", msg); CONS_Alert(CONS_ERROR, "%s", msg);
M_StartMessage("Demo Playback", msg, NULL, MM_NOTHING, NULL, "Return to Menu"); M_StartMessage("Demo Playback", msg, NULL, MM_NOTHING, NULL, "Return to Menu");
@ -3363,13 +3404,24 @@ void G_DoPlayDemoEx(const char *defdemoname, lumpnum_t deflumpnum)
{ {
availabilities[p][i] = READUINT8(demobuf.p); availabilities[p][i] = READUINT8(demobuf.p);
} }
if (g_buffer_sizes.availability > static_cast<size_t>(i))
demobuf.p += (g_buffer_sizes.availability - i);
// Skin // Skin
demo.currentskinid[p] = READUINT8(demobuf.p); if (demo.version >= 0x0010)
{
demo.currentskinid[p] = READUINT16(demobuf.p);
lastfakeskin[p] = READUINT16(demobuf.p);
}
else
{
demo.currentskinid[p] = READUINT8(demobuf.p);
lastfakeskin[p] = READUINT8(demobuf.p);
}
if (demo.currentskinid[p] >= demo.numskins) if (demo.currentskinid[p] >= demo.numskins)
demo.currentskinid[p] = 0; demo.currentskinid[p] = 0;
lastfakeskin[p] = READUINT8(demobuf.p);
players[p].team = READUINT8(demobuf.p); players[p].team = READUINT8(demobuf.p);
@ -3510,7 +3562,7 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname)
UINT16 initialskin = 0; UINT16 initialskin = 0;
UINT16 initialcolor = 0; UINT16 initialcolor = 0;
skin_t *ghskin = skins[0]; skin_t *ghskin = skins[0];
UINT8 worknumskins; UINT16 worknumskins;
UINT32 num_classes; UINT32 num_classes;
democharlist_t *skinlist = NULL; democharlist_t *skinlist = NULL;
@ -3528,14 +3580,10 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname)
p++; // SUBVERSION p++; // SUBVERSION
ghostversion = READUINT16(p); ghostversion = READUINT16(p);
switch(ghostversion)
if (ghostversion < MINDEMOVERSION || ghostversion > DEMOVERSION)
{ {
case 0x000E: // too old, cannot support.
/* fallthru */
case DEMOVERSION: // latest always supported
break;
// too old, cannot support.
default:
CONS_Alert(CONS_NOTICE, M_GetText("Ghost %s: Demo version incompatible.\n"), defdemoname); CONS_Alert(CONS_NOTICE, M_GetText("Ghost %s: Demo version incompatible.\n"), defdemoname);
P_SaveBufferFree(buffer); P_SaveBufferFree(buffer);
return; return;
@ -3618,6 +3666,21 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname)
splits[i] = READUINT32(p); splits[i] = READUINT32(p);
} }
if (ghostversion < 0x0010)
{
// Staff ghost oopsie. Fuckin, uh,
if (attackstart == INT32_MAX)
attackstart = UINT32_MAX;
for (i = 0; i < MAXSPLITS; i++)
{
if (splits[i] != INT32_MAX)
continue;
splits[i] = UINT32_MAX;
}
}
// net var data // net var data
count = READUINT16(p); count = READUINT16(p);
while (count--) while (count--)
@ -3655,18 +3718,26 @@ void G_AddGhost(savebuffer_t *buffer, const char *defdemoname)
// Player name (TODO: Display this somehow if it doesn't match cv_playername!) // Player name (TODO: Display this somehow if it doesn't match cv_playername!)
p += copy_fixed_buf(name, p, ghostsizes.player_name); p += copy_fixed_buf(name, p, ghostsizes.player_name);
p += MAXAVAILABILITY; p += ghostsizes.availability;
// Skin // Skin
i = READUINT8(p); if (ghostversion >= 0x0010)
{
i = READUINT16(p);
p += 2; // lastfakeskin
}
else
{
i = READUINT8(p);
p++; // lastfakeskin
}
if (i < worknumskins) if (i < worknumskins)
{ {
ghskin = skins[skinlist[i].mapping]; ghskin = skins[skinlist[i].mapping];
initialskin = skinlist[i].mapping; initialskin = skinlist[i].mapping;
} }
p++; // lastfakeskin
p++; // team p++; // team
// Color // Color
@ -3794,7 +3865,7 @@ staffbrief_t *G_GetStaffGhostBrief(UINT8 *buffer)
{ {
UINT8 *p = buffer; UINT8 *p = buffer;
UINT16 ghostversion; UINT16 ghostversion;
UINT16 flags; UINT16 flags, count;
UINT32 num_classes; UINT32 num_classes;
INT32 i; INT32 i;
staffbrief_t temp = {0}; staffbrief_t temp = {0};
@ -3814,16 +3885,10 @@ staffbrief_t *G_GetStaffGhostBrief(UINT8 *buffer)
p++; // SUBVERSION p++; // SUBVERSION
ghostversion = READUINT16(p); ghostversion = READUINT16(p);
switch(ghostversion) if (ghostversion < MINDEMOVERSION || ghostversion > DEMOVERSION)
{ {
case 0x000E:
/* fallthru */
case DEMOVERSION: // latest always supported
break;
// too old, cannot support. // too old, cannot support.
default: goto fail;
goto fail;
} }
p += 64; // full demo title p += 64; // full demo title
@ -3867,9 +3932,8 @@ staffbrief_t *G_GetStaffGhostBrief(UINT8 *buffer)
for (i = 0; i < MAXSPLITS; i++) for (i = 0; i < MAXSPLITS; i++)
p += 4; // splits p += 4; // splits
// Ehhhh don't need ghostversion here (?) so I'll reuse the var here count = READUINT16(p);
ghostversion = READUINT16(p); while (count--)
while (ghostversion--)
{ {
SKIPSTRING(p); SKIPSTRING(p);
SKIPSTRING(p); SKIPSTRING(p);

View file

@ -32,7 +32,7 @@ struct StandingJson
{ {
uint8_t ranking; uint8_t ranking;
String name; String name;
uint8_t demoskin; uint16_t demoskin;
String skincolor; String skincolor;
uint32_t timeorscore; uint32_t timeorscore;
@ -71,7 +71,7 @@ extern tic_t demostarttime;
struct democharlist_t { struct democharlist_t {
char name[SKINNAMESIZE+1]; char name[SKINNAMESIZE+1];
UINT32 namehash; UINT32 namehash;
UINT8 mapping; // No, this isn't about levels. It maps to loaded character ID. UINT16 mapping; // No, this isn't about levels. It maps to loaded character ID.
UINT8 kartspeed; UINT8 kartspeed;
UINT8 kartweight; UINT8 kartweight;
UINT32 flags; UINT32 flags;
@ -97,9 +97,9 @@ struct demovars_s {
boolean freecam; boolean freecam;
UINT8 numskins; UINT16 numskins;
democharlist_t *skinlist; democharlist_t *skinlist;
UINT8 currentskinid[MAXPLAYERS]; UINT16 currentskinid[MAXPLAYERS];
const savebuffer_t *buffer; // debug, valid only if recording or playback const savebuffer_t *buffer; // debug, valid only if recording or playback
}; };
@ -129,7 +129,7 @@ struct menudemo_t {
struct { struct {
UINT8 ranking; UINT8 ranking;
char name[MAXPLAYERNAME+1]; char name[MAXPLAYERNAME+1];
UINT8 skin, color; UINT16 skin, color;
UINT32 timeorscore; UINT32 timeorscore;
} standings[MAXPLAYERS]; } standings[MAXPLAYERS];
}; };
@ -194,6 +194,7 @@ struct DemoBufferSizes
size_t player_name; size_t player_name;
size_t skin_name; size_t skin_name;
size_t color_name; size_t color_name;
size_t availability;
}; };
// Your naming conventions are stupid and useless. // Your naming conventions are stupid and useless.
@ -205,7 +206,7 @@ struct demoghost {
UINT16 initialcolor; UINT16 initialcolor;
UINT8 fadein; UINT8 fadein;
UINT16 version; UINT16 version;
UINT8 numskins; UINT16 numskins;
tic_t attackstart; tic_t attackstart;
tic_t splits[MAXSPLITS]; tic_t splits[MAXSPLITS];
boolean done; boolean done;

View file

@ -2261,8 +2261,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
UINT16 skincolor; UINT16 skincolor;
INT32 skin; INT32 skin;
UINT8 availabilities[MAXAVAILABILITY]; UINT8 availabilities[MAXAVAILABILITY];
UINT8 fakeskin; UINT16 fakeskin;
UINT8 lastfakeskin; UINT16 lastfakeskin;
tic_t jointime; tic_t jointime;
@ -5229,7 +5229,7 @@ void G_DirtyGameData(void)
// Can be called by the startup code or the menu task. // Can be called by the startup code or the menu task.
// //
#define SAV_VERSIONMINOR 6 #define SAV_VERSIONMINOR 7
void G_LoadGame(void) void G_LoadGame(void)
{ {

View file

@ -49,7 +49,7 @@
extern "C" consvar_t cv_forcebots; extern "C" consvar_t cv_forcebots;
/*-------------------------------------------------- /*--------------------------------------------------
void K_SetNameForBot(UINT8 playerNum, UINT8 skinnum) void K_SetNameForBot(UINT8 playerNum, const char *realname)
See header file for description. See header file for description.
--------------------------------------------------*/ --------------------------------------------------*/
@ -102,11 +102,11 @@ void K_SetNameForBot(UINT8 newplayernum, const char *realname)
} }
/*-------------------------------------------------- /*--------------------------------------------------
void K_SetBot(UINT8 playerNum, UINT8 skinnum, UINT8 difficulty, botStyle_e style) void K_SetBot(UINT8 playerNum, UINT16 skinnum, UINT8 difficulty, botStyle_e style)
See header file for description. See header file for description.
--------------------------------------------------*/ --------------------------------------------------*/
void K_SetBot(UINT8 newplayernum, UINT8 skinnum, UINT8 difficulty, botStyle_e style) void K_SetBot(UINT8 newplayernum, UINT16 skinnum, UINT8 difficulty, botStyle_e style)
{ {
CONS_Debug(DBG_NETPLAY, "addbot: %d\n", newplayernum); CONS_Debug(DBG_NETPLAY, "addbot: %d\n", newplayernum);
@ -199,11 +199,11 @@ void K_SetBot(UINT8 newplayernum, UINT8 skinnum, UINT8 difficulty, botStyle_e st
} }
/*-------------------------------------------------- /*--------------------------------------------------
boolean K_AddBot(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *p) boolean K_AddBot(UINT16 skin, UINT8 difficulty, botStyle_e style, UINT8 *p)
See header file for description. See header file for description.
--------------------------------------------------*/ --------------------------------------------------*/
boolean K_AddBot(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *p) boolean K_AddBot(UINT16 skin, UINT8 difficulty, botStyle_e style, UINT8 *p)
{ {
UINT8 newplayernum = *p; UINT8 newplayernum = *p;
@ -239,16 +239,16 @@ boolean K_AddBot(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *p)
--------------------------------------------------*/ --------------------------------------------------*/
void K_UpdateMatchRaceBots(void) void K_UpdateMatchRaceBots(void)
{ {
const UINT8 defaultbotskin = R_BotDefaultSkin(); const UINT16 defaultbotskin = R_BotDefaultSkin();
UINT8 difficulty; UINT8 difficulty;
UINT8 pmax = (dedicated ? MAXPLAYERS-1 : MAXPLAYERS); UINT8 pmax = (dedicated ? MAXPLAYERS-1 : MAXPLAYERS);
UINT8 numplayers = 0; UINT8 numplayers = 0;
UINT8 numbots = 0; UINT8 numbots = 0;
UINT8 numwaiting = 0; UINT8 numwaiting = 0;
SINT8 wantedbots = 0; SINT8 wantedbots = 0;
UINT8 usableskins = 0, skincount = (demo.playback ? demo.numskins : numskins);; UINT16 usableskins = 0, skincount = (demo.playback ? demo.numskins : numskins);;
UINT8 grabskins[MAXSKINS+1]; UINT16 grabskins[MAXSKINS+1];
UINT8 i; UINT16 i;
// Init usable bot skins list // Init usable bot skins list
for (i = 0; i < skincount; i++) for (i = 0; i < skincount; i++)
@ -387,11 +387,11 @@ void K_UpdateMatchRaceBots(void)
while (numbots < wantedbots) while (numbots < wantedbots)
{ {
UINT8 skinnum = defaultbotskin; UINT16 skinnum = defaultbotskin;
if (usableskins > 0) if (usableskins > 0)
{ {
UINT8 index = P_RandomKey(PR_BOTS, usableskins); UINT16 index = P_RandomKey(PR_BOTS, usableskins);
skinnum = grabskins[index]; skinnum = grabskins[index];
grabskins[index] = grabskins[--usableskins]; grabskins[index] = grabskins[--usableskins];
} }

View file

@ -182,7 +182,7 @@ fixed_t K_DistanceOfLineFromPoint(fixed_t v1x, fixed_t v1y, fixed_t v2x, fixed_t
/*-------------------------------------------------- /*--------------------------------------------------
boolean K_AddBot(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *p); boolean K_AddBot(UINT16 skin, UINT8 difficulty, botStyle_e style, UINT8 *p);
Adds a new bot, using code intended to run on all clients. Adds a new bot, using code intended to run on all clients.
@ -197,7 +197,7 @@ fixed_t K_DistanceOfLineFromPoint(fixed_t v1x, fixed_t v1y, fixed_t v2x, fixed_t
true if a bot was added, otherwise false. true if a bot was added, otherwise false.
--------------------------------------------------*/ --------------------------------------------------*/
boolean K_AddBot(UINT8 skin, UINT8 difficulty, botStyle_e style, UINT8 *p); boolean K_AddBot(UINT16 skin, UINT8 difficulty, botStyle_e style, UINT8 *p);
// NOT AVAILABLE FOR LUA // NOT AVAILABLE FOR LUA
@ -222,7 +222,7 @@ void K_SetNameForBot(UINT8 newplayernum, const char *realname);
/*-------------------------------------------------- /*--------------------------------------------------
void K_SetBot(UINT8 newplayernum, UINT8 skinnum, UINT8 difficulty, botStyle_e style); void K_SetBot(UINT8 newplayernum, UINT16 skinnum, UINT8 difficulty, botStyle_e style);
Sets a player ID to be a new bot directly. Invoked directly Sets a player ID to be a new bot directly. Invoked directly
by K_AddBot, and indirectly by K_AddBotFromServer by sending by K_AddBot, and indirectly by K_AddBotFromServer by sending
@ -238,7 +238,7 @@ void K_SetNameForBot(UINT8 newplayernum, const char *realname);
None None
--------------------------------------------------*/ --------------------------------------------------*/
void K_SetBot(UINT8 newplayernum, UINT8 skinnum, UINT8 difficulty, botStyle_e style); void K_SetBot(UINT8 newplayernum, UINT16 skinnum, UINT8 difficulty, botStyle_e style);
/*-------------------------------------------------- /*--------------------------------------------------

View file

@ -215,7 +215,7 @@ void K_AssignFoes(void)
--------------------------------------------------*/ --------------------------------------------------*/
void K_InitGrandPrixBots(void) void K_InitGrandPrixBots(void)
{ {
const UINT8 defaultbotskin = R_BotDefaultSkin(); const UINT16 defaultbotskin = R_BotDefaultSkin();
const UINT8 startingdifficulty = K_BotStartingDifficulty(grandprixinfo.gamespeed); const UINT8 startingdifficulty = K_BotStartingDifficulty(grandprixinfo.gamespeed);
UINT8 difficultylevels[MAXPLAYERS]; UINT8 difficultylevels[MAXPLAYERS];
@ -226,14 +226,14 @@ void K_InitGrandPrixBots(void)
UINT8 numplayers = 0; UINT8 numplayers = 0;
UINT8 competitors[MAXSPLITSCREENPLAYERS]; UINT8 competitors[MAXSPLITSCREENPLAYERS];
UINT8 usableskins, skincount = (demo.playback ? demo.numskins : numskins);; UINT16 usableskins, skincount = (demo.playback ? demo.numskins : numskins);;
UINT8 grabskins[MAXSKINS+1]; UINT16 grabskins[MAXSKINS+1];
UINT8 botskinlist[MAXPLAYERS]; UINT16 botskinlist[MAXPLAYERS];
UINT8 botskinlistpos = 0; UINT8 botskinlistpos = 0;
UINT8 newplayernum = 0; UINT8 newplayernum = 0;
UINT8 i, j; UINT16 i, j;
memset(competitors, MAXPLAYERS, sizeof (competitors)); memset(competitors, MAXPLAYERS, sizeof (competitors));
memset(botskinlist, defaultbotskin, sizeof (botskinlist)); memset(botskinlist, defaultbotskin, sizeof (botskinlist));
@ -314,10 +314,10 @@ void K_InitGrandPrixBots(void)
INT32 rivalnum = R_SkinAvailable(rivalname); INT32 rivalnum = R_SkinAvailable(rivalname);
// Intentionally referenced before (currently dummied out) unlock check. Such a tease! // Intentionally referenced before (currently dummied out) unlock check. Such a tease!
if (rivalnum != -1 && grabskins[(UINT8)rivalnum] != MAXSKINS) if (rivalnum != -1 && grabskins[(UINT16)rivalnum] != MAXSKINS)
{ {
botskinlist[botskinlistpos++] = (UINT8)rivalnum; botskinlist[botskinlistpos++] = (UINT8)rivalnum;
grabskins[(UINT8)rivalnum] = MAXSKINS; grabskins[(UINT16)rivalnum] = MAXSKINS;
} }
} }
} }
@ -345,11 +345,11 @@ void K_InitGrandPrixBots(void)
{ {
while (botskinlistpos < wantedbots) while (botskinlistpos < wantedbots)
{ {
UINT8 skinnum = defaultbotskin; UINT16 skinnum = defaultbotskin;
if (usableskins > 0) if (usableskins > 0)
{ {
UINT8 index = P_RandomKey(PR_BOTS, usableskins); UINT16 index = P_RandomKey(PR_BOTS, usableskins);
skinnum = grabskins[index]; skinnum = grabskins[index];
grabskins[index] = grabskins[--usableskins]; grabskins[index] = grabskins[--usableskins];
} }
@ -781,7 +781,7 @@ static boolean CompareReplacements(player_t *a, player_t *b)
--------------------------------------------------*/ --------------------------------------------------*/
void K_RetireBots(void) void K_RetireBots(void)
{ {
UINT8 i; UINT16 i;
if (grandprixinfo.gp == true if (grandprixinfo.gp == true
&& grandprixinfo.eventmode != GPEVENT_NONE) && grandprixinfo.eventmode != GPEVENT_NONE)
@ -931,11 +931,11 @@ void K_RetireBots(void)
// Okay, now this is essentially the original contents of K_RetireBots with cpp swag // Okay, now this is essentially the original contents of K_RetireBots with cpp swag
const UINT8 defaultbotskin = R_BotDefaultSkin(); const UINT16 defaultbotskin = R_BotDefaultSkin();
SINT8 newDifficulty; SINT8 newDifficulty;
UINT8 usableskins, skincount = (demo.playback ? demo.numskins : numskins); UINT16 usableskins, skincount = (demo.playback ? demo.numskins : numskins);
UINT8 grabskins[MAXSKINS+1]; UINT16 grabskins[MAXSKINS+1];
// Handle adjusting difficulty for new bots // Handle adjusting difficulty for new bots
{ {
@ -1009,11 +1009,11 @@ void K_RetireBots(void)
// Replace nocontested bots. // Replace nocontested bots.
for (player_t *bot : bots) for (player_t *bot : bots)
{ {
UINT8 skinnum = defaultbotskin; UINT16 skinnum = defaultbotskin;
if (usableskins > 0) if (usableskins > 0)
{ {
UINT8 index = P_RandomKey(PR_BOTS, usableskins); UINT16 index = P_RandomKey(PR_BOTS, usableskins);
skinnum = grabskins[index]; skinnum = grabskins[index];
grabskins[index] = grabskins[--usableskins]; grabskins[index] = grabskins[--usableskins];
} }

View file

@ -2795,7 +2795,7 @@ void PositionFacesInfo::draw_1p()
INT32 i, j; INT32 i, j;
INT32 bumperx, emeraldx; INT32 bumperx, emeraldx;
INT32 xoff, yoff, flipflag = 0; INT32 xoff, yoff, flipflag = 0;
UINT8 workingskin; UINT16 workingskin;
UINT8 *colormap; UINT8 *colormap;
UINT32 skinflags; UINT32 skinflags;
@ -3542,7 +3542,7 @@ static void K_drawKartDuelScores(void)
// minirankings shamelessly copypasted because i know that shit works already // minirankings shamelessly copypasted because i know that shit works already
// and SURELY we will never need to use this somewhere else, right? // and SURELY we will never need to use this somewhere else, right?
UINT8 workingskin; UINT16 workingskin;
UINT8 *colormap; UINT8 *colormap;
INT32 xoff, yoff, flipflag, skinflags; INT32 xoff, yoff, flipflag, skinflags;
@ -5957,7 +5957,7 @@ static void K_drawKartMinimap(void)
INT32 minimaptrans; INT32 minimaptrans;
INT32 splitflags; INT32 splitflags;
UINT8 skin = 0; UINT16 skin = 0;
UINT8 *colormap = NULL; UINT8 *colormap = NULL;
SINT8 localplayers[MAXSPLITSCREENPLAYERS]; SINT8 localplayers[MAXSPLITSCREENPLAYERS];

View file

@ -2863,7 +2863,7 @@ static void K_RegularVoiceTimers(player_t *player)
player->karthud[khud_tauntvoices] = 4*TICRATE; player->karthud[khud_tauntvoices] = 4*TICRATE;
} }
static UINT8 K_ObjectToSkinIDForSounds(mobj_t *source) static UINT16 K_ObjectToSkinIDForSounds(mobj_t *source)
{ {
if (source->player) if (source->player)
return source->player->skin; return source->player->skin;
@ -2876,7 +2876,7 @@ static UINT8 K_ObjectToSkinIDForSounds(mobj_t *source)
static void K_PlayGenericTastefulTaunt(mobj_t *source, sfxenum_t sfx_id) static void K_PlayGenericTastefulTaunt(mobj_t *source, sfxenum_t sfx_id)
{ {
UINT8 skinid = K_ObjectToSkinIDForSounds(source); UINT16 skinid = K_ObjectToSkinIDForSounds(source);
if (skinid >= numskins) if (skinid >= numskins)
return; return;
@ -2915,7 +2915,7 @@ void K_PlayBoostTaunt(mobj_t *source)
void K_PlayOvertakeSound(mobj_t *source) void K_PlayOvertakeSound(mobj_t *source)
{ {
UINT8 skinid = K_ObjectToSkinIDForSounds(source); UINT16 skinid = K_ObjectToSkinIDForSounds(source);
if (skinid >= numskins) if (skinid >= numskins)
return; return;
@ -2940,7 +2940,7 @@ void K_PlayOvertakeSound(mobj_t *source)
static void K_PlayGenericCombatSound(mobj_t *source, mobj_t *other, sfxenum_t sfx_id) static void K_PlayGenericCombatSound(mobj_t *source, mobj_t *other, sfxenum_t sfx_id)
{ {
UINT8 skinid = K_ObjectToSkinIDForSounds(source); UINT16 skinid = K_ObjectToSkinIDForSounds(source);
if (skinid >= numskins) if (skinid >= numskins)
return; return;
@ -3010,7 +3010,7 @@ void K_TryHurtSoundExchange(mobj_t *victim, mobj_t *attacker)
void K_PlayPowerGloatSound(mobj_t *source) void K_PlayPowerGloatSound(mobj_t *source)
{ {
UINT8 skinid = K_ObjectToSkinIDForSounds(source); UINT16 skinid = K_ObjectToSkinIDForSounds(source);
if (skinid >= numskins) if (skinid >= numskins)
return; return;
@ -3028,7 +3028,7 @@ void K_PlayPowerGloatSound(mobj_t *source)
// MOVED so we don't have to extern K_ObjectToSkinID // MOVED so we don't have to extern K_ObjectToSkinID
void P_PlayVictorySound(mobj_t *source) void P_PlayVictorySound(mobj_t *source)
{ {
UINT8 skinid = K_ObjectToSkinIDForSounds(source); UINT16 skinid = K_ObjectToSkinIDForSounds(source);
if (skinid >= numskins) if (skinid >= numskins)
return; return;

View file

@ -793,7 +793,7 @@ UINT16 M_GetColorAfter(setup_player_colors_t *colors, UINT16 value, INT32 amount
extern struct setup_chargrid_s { extern struct setup_chargrid_s {
INT16 skinlist[MAXCLONES]; INT16 skinlist[MAXCLONES];
UINT8 numskins; UINT16 numskins;
} setup_chargrid[9][9]; } setup_chargrid[9][9];
extern UINT8 setup_followercategories[MAXFOLLOWERCATEGORIES][2]; extern UINT8 setup_followercategories[MAXFOLLOWERCATEGORIES][2];
@ -1512,7 +1512,7 @@ void M_Statistics(INT32 choice);
void M_DrawStatistics(void); void M_DrawStatistics(void);
boolean M_StatisticsInputs(INT32 ch); boolean M_StatisticsInputs(INT32 ch);
void M_DrawCharacterIconAndEngine(INT32 x, INT32 y, UINT8 skin, UINT8 *colormap, UINT8 baseskin); void M_DrawCharacterIconAndEngine(INT32 x, INT32 y, UINT16 skin, UINT8 *colormap, UINT16 baseskin);
fixed_t M_DrawCupWinData(INT32 rankx, INT32 ranky, cupheader_t *cup, UINT8 difficulty, boolean flash, boolean statsmode); fixed_t M_DrawCupWinData(INT32 rankx, INT32 ranky, cupheader_t *cup, UINT8 difficulty, boolean flash, boolean statsmode);
#define MAXWRONGPLAYER MAXSPLITSCREENPLAYERS #define MAXWRONGPLAYER MAXSPLITSCREENPLAYERS
@ -1523,7 +1523,7 @@ extern struct wrongwarp_s {
tic_t delaytowrongplayer; tic_t delaytowrongplayer;
struct wrongplayer_s struct wrongplayer_s
{ {
UINT8 skin; UINT16 skin;
INT16 across; INT16 across;
boolean spinout; boolean spinout;
} wrongplayers[MAXWRONGPLAYER]; } wrongplayers[MAXWRONGPLAYER];

View file

@ -3057,7 +3057,7 @@ fixed_t M_DrawCupWinData(INT32 rankx, INT32 ranky, cupheader_t *cup, UINT8 diffi
} }
else else
{ {
UINT8 skin = windata->best_skin.id; UINT16 skin = windata->best_skin.id;
colormap = R_GetTranslationColormap(skin, skins[skin]->prefcolor, GTC_MENUCACHE); colormap = R_GetTranslationColormap(skin, skins[skin]->prefcolor, GTC_MENUCACHE);
@ -7163,7 +7163,7 @@ drawborder:
#define challengetransparentstrength 8 #define challengetransparentstrength 8
void M_DrawCharacterIconAndEngine(INT32 x, INT32 y, UINT8 skin, UINT8 *colormap, UINT8 baseskin) void M_DrawCharacterIconAndEngine(INT32 x, INT32 y, UINT16 skin, UINT8 *colormap, UINT16 baseskin)
{ {
V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT, V_DrawFixedPatch(x*FRACUNIT, y*FRACUNIT,
FRACUNIT, FRACUNIT,

View file

@ -45,7 +45,7 @@ struct gpRank_t
UINT8 totalPlayers; UINT8 totalPlayers;
UINT8 position; UINT8 position;
UINT8 skin; UINT16 skin;
UINT32 winPoints; UINT32 winPoints;
UINT32 totalPoints; UINT32 totalPoints;

View file

@ -522,7 +522,7 @@ void level_tally_t::Init(player_t *player)
// It'd be neat to add all of the grade sounds, // It'd be neat to add all of the grade sounds,
// but not this close to release // but not this close to release
UINT8 skinid = player->skin; UINT16 skinid = player->skin;
if (skinid >= numskins || R_CanShowSkinInDemo(skinid) == false) if (skinid >= numskins || R_CanShowSkinInDemo(skinid) == false)
; ;
else if (rank < GRADE_C) else if (rank < GRADE_C)

View file

@ -3813,6 +3813,11 @@ INT32 M_UnlockableSkinNum(unlockable_t *unlock)
skinnum = R_SkinAvailableEx(unlock->stringVar, false); skinnum = R_SkinAvailableEx(unlock->stringVar, false);
if (skinnum != -1) if (skinnum != -1)
{ {
if (skinnum >= MAXSKINUNAVAILABLE)
{
CONS_Alert(CONS_WARNING,"Unlockable ID %s: Skin %s (id %d) is greater than %u, and will not be locked in this session.", sizeu1((unlock-unlockables)+1), unlock->stringVar, skinnum, MAXSKINUNAVAILABLE);
}
unlock->stringVarCache = skinnum; unlock->stringVarCache = skinnum;
return skinnum; return skinnum;
} }

View file

@ -406,6 +406,8 @@ void M_CharacterSelect(INT32 choice)
// Gets the selected follower's state for a given setup player. // Gets the selected follower's state for a given setup player.
static void M_GetFollowerState(setup_player_t *p) static void M_GetFollowerState(setup_player_t *p)
{ {
if (p->followern < 0 || p->followern >= numfollowers)
return;
p->follower_state = &states[followers[p->followern].followstate]; p->follower_state = &states[followers[p->followern].followstate];

View file

@ -175,7 +175,7 @@ static boolean P_UnArchivePlayer(savebuffer_t *save)
memset(&savedata.bots, 0, sizeof(savedata.bots)); memset(&savedata.bots, 0, sizeof(savedata.bots));
UINT8 pid; UINT8 pid;
const UINT8 defaultbotskin = R_BotDefaultSkin(); const UINT16 defaultbotskin = R_BotDefaultSkin();
while ((pid = READUINT8(save->p)) < MAXPLAYERS) while ((pid = READUINT8(save->p)) < MAXPLAYERS)
{ {
@ -260,8 +260,8 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT8(save->p, players[i].availabilities[j]); WRITEUINT8(save->p, players[i].availabilities[j]);
} }
WRITEUINT8(save->p, players[i].fakeskin); WRITEUINT16(save->p, players[i].fakeskin);
WRITEUINT8(save->p, players[i].lastfakeskin); WRITEUINT16(save->p, players[i].lastfakeskin);
WRITEUINT16(save->p, players[i].prefcolor); WRITEUINT16(save->p, players[i].prefcolor);
WRITEINT32(save->p, players[i].prefskin); WRITEINT32(save->p, players[i].prefskin);
@ -988,8 +988,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].availabilities[j] = READUINT8(save->p); players[i].availabilities[j] = READUINT8(save->p);
} }
players[i].fakeskin = READUINT8(save->p); players[i].fakeskin = READUINT16(save->p);
players[i].lastfakeskin = READUINT8(save->p); players[i].lastfakeskin = READUINT16(save->p);
players[i].prefcolor = READUINT16(save->p); players[i].prefcolor = READUINT16(save->p);
players[i].prefskin = READINT32(save->p); players[i].prefskin = READINT32(save->p);
@ -3537,7 +3537,7 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
if (diff2 & MD2_CVMEM) if (diff2 & MD2_CVMEM)
WRITEINT32(save->p, mobj->cvmem); WRITEINT32(save->p, mobj->cvmem);
if (diff2 & MD2_SKIN) if (diff2 & MD2_SKIN)
WRITEUINT8(save->p, (UINT8)((skin_t *)mobj->skin)->skinnum); WRITEUINT16(save->p, (UINT16)((skin_t *)mobj->skin)->skinnum);
if (diff2 & MD2_COLOR) if (diff2 & MD2_COLOR)
WRITEUINT16(save->p, mobj->color); WRITEUINT16(save->p, mobj->color);
if (diff2 & MD2_EXTVAL1) if (diff2 & MD2_EXTVAL1)
@ -4836,7 +4836,7 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
if (diff2 & MD2_CVMEM) if (diff2 & MD2_CVMEM)
mobj->cvmem = READINT32(save->p); mobj->cvmem = READINT32(save->p);
if (diff2 & MD2_SKIN) if (diff2 & MD2_SKIN)
mobj->skin = skins[READUINT8(save->p)]; mobj->skin = skins[READUINT16(save->p)];
if (diff2 & MD2_COLOR) if (diff2 & MD2_COLOR)
mobj->color = READUINT16(save->p); mobj->color = READUINT16(save->p);
if (diff2 & MD2_EXTVAL1) if (diff2 & MD2_EXTVAL1)
@ -6436,7 +6436,7 @@ static inline void P_ArchiveMisc(savebuffer_t *save)
WRITEUINT8(save->p, rank->totalPlayers); WRITEUINT8(save->p, rank->totalPlayers);
WRITEUINT8(save->p, rank->position); WRITEUINT8(save->p, rank->position);
WRITEUINT8(save->p, rank->skin); WRITEUINT16(save->p, rank->skin);
WRITEUINT32(save->p, rank->winPoints); WRITEUINT32(save->p, rank->winPoints);
WRITEUINT32(save->p, rank->totalPoints); WRITEUINT32(save->p, rank->totalPoints);
@ -6702,7 +6702,7 @@ static boolean P_UnArchiveSPGame(savebuffer_t *save)
rank->totalPlayers = READUINT8(save->p); rank->totalPlayers = READUINT8(save->p);
rank->position = READUINT8(save->p); rank->position = READUINT8(save->p);
rank->skin = READUINT8(save->p); rank->skin = READUINT16(save->p);
rank->winPoints = READUINT32(save->p); rank->winPoints = READUINT32(save->p);
rank->totalPoints = READUINT32(save->p); rank->totalPoints = READUINT32(save->p);

View file

@ -43,7 +43,7 @@ mobj_t *P_FindNewPosition(UINT32 oldposition);
struct savedata_bot_s struct savedata_bot_s
{ {
boolean valid; boolean valid;
UINT8 skin; UINT16 skin;
UINT8 difficulty; UINT8 difficulty;
boolean rival; boolean rival;
boolean foe; boolean foe;
@ -56,7 +56,7 @@ struct savedata_t
SINT8 lives; SINT8 lives;
UINT16 totalring; UINT16 totalring;
UINT8 skin; UINT16 skin;
UINT16 skincolor; UINT16 skincolor;
INT32 followerskin; INT32 followerskin;
UINT16 followercolor; UINT16 followercolor;

View file

@ -139,7 +139,7 @@ static void Sk_SetDefaultValue(skin_t *skin)
// Grab the default skin // Grab the default skin
#define DEFAULTBOTSKINNAME "eggrobo" #define DEFAULTBOTSKINNAME "eggrobo"
UINT8 R_BotDefaultSkin(void) UINT16 R_BotDefaultSkin(void)
{ {
static INT32 defaultbotskin = -1; static INT32 defaultbotskin = -1;
@ -157,7 +157,7 @@ UINT8 R_BotDefaultSkin(void)
} }
} }
return (UINT8)defaultbotskin; return (UINT16)defaultbotskin;
} }
#undef DEFAULTBOTSKINNAME #undef DEFAULTBOTSKINNAME
@ -205,7 +205,7 @@ UINT8 *R_GetSkinAvailabilities(boolean demolock, INT32 botforcecharacter)
skinid = M_UnlockableSkinNum(&unlockables[i]); skinid = M_UnlockableSkinNum(&unlockables[i]);
if (skinid < 0 || skinid >= MAXSKINS) if (skinid < 0 || skinid >= MAXSKINUNAVAILABLE)
continue; continue;
if ((forbots if ((forbots
@ -250,6 +250,12 @@ boolean R_SkinUsable(INT32 playernum, INT32 skinnum, boolean demoskins)
return true; return true;
} }
if (skinnum >= MAXSKINUNAVAILABLE)
{
// Keeping our packet size nice and sane in the wake of MAXSKINS increase
return true;
}
// Determine if this character is supposed to be unlockable or not // Determine if this character is supposed to be unlockable or not
if (useplayerstruct && demo.playback) if (useplayerstruct && demo.playback)
{ {
@ -308,8 +314,8 @@ boolean R_CanShowSkinInDemo(INT32 skinnum)
// Returns a random unlocked skin ID. // Returns a random unlocked skin ID.
UINT32 R_GetLocalRandomSkin(void) UINT32 R_GetLocalRandomSkin(void)
{ {
UINT8 i, usableskins = 0; UINT16 i, usableskins = 0;
UINT8 grabskins[MAXSKINS]; UINT16 grabskins[MAXSKINS];
for (i = 0; i < numskins; i++) for (i = 0; i < numskins; i++)
{ {
@ -512,8 +518,8 @@ void SetFakePlayerSkin(player_t* player, INT32 skinid)
void SetRandomFakePlayerSkin(player_t* player, boolean fast, boolean instant) void SetRandomFakePlayerSkin(player_t* player, boolean fast, boolean instant)
{ {
INT32 i; INT32 i;
UINT8 usableskins = 0, maxskinpick; UINT16 usableskins = 0, maxskinpick;
UINT8 grabskins[MAXSKINS]; UINT16 grabskins[MAXSKINS];
maxskinpick = (demo.playback ? demo.numskins : numskins); maxskinpick = (demo.playback ? demo.numskins : numskins);
@ -594,7 +600,7 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast, boolean instant)
// Return to base skin from an SF_IRONMAN randomization // Return to base skin from an SF_IRONMAN randomization
void ClearFakePlayerSkin(player_t* player) void ClearFakePlayerSkin(player_t* player)
{ {
UINT8 skinid; UINT16 skinid;
UINT32 flags; UINT32 flags;
if (demo.playback) if (demo.playback)

View file

@ -39,7 +39,7 @@ extern "C" {
struct skin_t struct skin_t
{ {
char name[SKINNAMESIZE+1]; // name of skin char name[SKINNAMESIZE+1]; // name of skin
UINT8 skinnum; UINT16 skinnum;
UINT32 namehash; // quickncasehash(->name, SKINNAMESIZE) UINT32 namehash; // quickncasehash(->name, SKINNAMESIZE)
UINT16 wadnum; UINT16 wadnum;
skinflags_t flags; skinflags_t flags;
@ -125,7 +125,7 @@ void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002
// Set backup // Set backup
INT32 GetSkinNumClosestToStats(UINT8 kartspeed, UINT8 kartweight, UINT32 flags, boolean unlock); INT32 GetSkinNumClosestToStats(UINT8 kartspeed, UINT8 kartweight, UINT32 flags, boolean unlock);
UINT8 R_BotDefaultSkin(void); UINT16 R_BotDefaultSkin(void);
// Heavy Magician // Heavy Magician
void SetFakePlayerSkin(player_t* player, INT32 skinnum); void SetFakePlayerSkin(player_t* player, INT32 skinnum);

View file

@ -73,7 +73,6 @@ TYPEDEF (serverrefuse_pak);
TYPEDEF (askinfo_pak); TYPEDEF (askinfo_pak);
TYPEDEF (msaskinfo_pak); TYPEDEF (msaskinfo_pak);
TYPEDEF (plrinfo); TYPEDEF (plrinfo);
TYPEDEF (plrconfig);
TYPEDEF (filesneededconfig_pak); TYPEDEF (filesneededconfig_pak);
TYPEDEF (doomdata_t); TYPEDEF (doomdata_t);
TYPEDEF (serverelem_t); TYPEDEF (serverelem_t);

View file

@ -1055,7 +1055,7 @@ void Y_RoundQueueDrawer(y_data_t *standings, INT32 offset, boolean doanimations,
UINT8 *colormap = NULL, *oppositemap = NULL; UINT8 *colormap = NULL, *oppositemap = NULL;
fixed_t playerx = 0, playery = 0; fixed_t playerx = 0, playery = 0;
UINT8 pskin = MAXSKINS; UINT16 pskin = MAXSKINS;
UINT16 pcolor = SKINCOLOR_WHITE; UINT16 pcolor = SKINCOLOR_WHITE;
if (standings->mainplayer == MAXPLAYERS) if (standings->mainplayer == MAXPLAYERS)