Fix Skin unlocks at the beginning of replays

- DXD_JOINDATA: Actually correctly write demo data
- SetPlayerSkinByNum, bot skin iteration code: Use demo skinlist index instead of actual skin ID
This commit is contained in:
toaster 2024-03-04 16:54:36 +00:00 committed by James R
parent e7fed5d7b5
commit 2bfcfeb560
4 changed files with 27 additions and 23 deletions

View file

@ -317,8 +317,8 @@ void G_ReadDemoExtraData(void)
skinid = READUINT8(demobuf.p);
if (skinid >= demo.numskins)
skinid = 0;
SetPlayerSkinByNum(p, demo.skinlist[skinid].mapping);
demo.currentskinid[p] = skinid;
ghostext[p].skinid = demo.currentskinid[p] = skinid;
SetPlayerSkinByNum(p, skinid);
players[p].kartspeed = ghostext[p].kartspeed = demo.skinlist[skinid].kartspeed;
players[p].kartweight = ghostext[p].kartweight = demo.skinlist[skinid].kartweight;
@ -424,7 +424,7 @@ void G_WriteDemoExtraData(void)
{
for (j = 0; j < MAXAVAILABILITY; j++)
{
WRITEUINT8(demobuf.p, players[i].availabilities[i]);
WRITEUINT8(demobuf.p, players[i].availabilities[j]);
}
WRITEUINT8(demobuf.p, (UINT8)players[i].bot);
@ -3354,12 +3354,9 @@ void G_DoPlayDemo(const char *defdemoname)
// Skin
i = READUINT8(demobuf.p);
if (i >= demo.numskins)
i = 0;
SetPlayerSkinByNum(p, demo.skinlist[i].mapping);
demo.currentskinid[p] = ghostext[p].skinid = i;
demo.currentskinid[p] = READUINT8(demobuf.p);
if (demo.currentskinid[p] >= demo.numskins)
demo.currentskinid[p] = 0;
lastfakeskin[p] = READUINT8(demobuf.p);
// Color
@ -3442,6 +3439,15 @@ void G_DoPlayDemo(const char *defdemoname)
UINT8 j;
p = slots[i];
for (j = 0; j < MAXAVAILABILITY; j++)
{
players[p].availabilities[j] = availabilities[p][j];
}
ghostext[p].skinid = demo.currentskinid[p];
SetPlayerSkinByNum(p, demo.currentskinid[p]);
if (players[p].mo)
{
players[p].mo->color = players[p].skincolor;
@ -3457,11 +3463,6 @@ void G_DoPlayDemo(const char *defdemoname)
players[p].kartweight = ghostext[p].kartweight = demo.skinlist[demo.currentskinid[p]].kartweight;
players[p].charflags = ghostext[p].charflags = demo.skinlist[demo.currentskinid[p]].flags;
players[p].lastfakeskin = lastfakeskin[p];
for (j = 0; j < MAXAVAILABILITY; j++)
{
players[p].availabilities[j] = availabilities[p][j];
}
}
demo.deferstart = true;

View file

@ -177,12 +177,12 @@ void K_UpdateMatchRaceBots(void)
UINT8 numbots = 0;
UINT8 numwaiting = 0;
SINT8 wantedbots = 0;
UINT8 usableskins = 0;
UINT8 usableskins = 0, skincount = (demo.playback ? demo.numskins : numskins);;
UINT8 grabskins[MAXSKINS+1];
UINT8 i;
// Init usable bot skins list
for (i = 0; i < numskins; i++)
for (i = 0; i < skincount; i++)
{
grabskins[usableskins++] = i;
}

View file

@ -133,7 +133,7 @@ void K_InitGrandPrixBots(void)
UINT8 numplayers = 0;
UINT8 competitors[MAXSPLITSCREENPLAYERS];
UINT8 usableskins;
UINT8 usableskins, skincount = (demo.playback ? demo.numskins : numskins);;
UINT8 grabskins[MAXSKINS+1];
UINT8 botskinlist[MAXPLAYERS];
@ -146,7 +146,7 @@ void K_InitGrandPrixBots(void)
memset(botskinlist, defaultbotskin, sizeof (botskinlist));
// Init usable bot skins list
for (usableskins = 0; usableskins < numskins; usableskins++)
for (usableskins = 0; usableskins < skincount; usableskins++)
{
grabskins[usableskins] = usableskins;
}
@ -671,7 +671,7 @@ void K_RetireBots(void)
const UINT8 defaultbotskin = R_BotDefaultSkin();
SINT8 newDifficulty;
UINT8 usableskins;
UINT8 usableskins, skincount = (demo.playback ? demo.numskins : numskins);
UINT8 grabskins[MAXSKINS+1];
UINT8 i;
@ -687,7 +687,7 @@ void K_RetireBots(void)
}
// Init usable bot skins list
for (usableskins = 0; usableskins < numskins; usableskins++)
for (usableskins = 0; usableskins < skincount; usableskins++)
{
grabskins[usableskins] = usableskins;
}

View file

@ -226,7 +226,7 @@ UINT8 *R_GetSkinAvailabilities(boolean demolock, INT32 botforcecharacter)
boolean R_SkinUsable(INT32 playernum, INT32 skinnum, boolean demoskins)
{
boolean needsunlocked = false;
boolean useplayerstruct = (Playing() && playernum != -1);
boolean useplayerstruct = ((Playing() || demo.playback) && playernum != -1);
UINT16 i;
INT32 skinid;
@ -357,6 +357,9 @@ engineclass_t R_GetEngineClass(SINT8 speed, SINT8 weight, skinflags_t flags)
// Auxillary function that actually sets the skin
static void SetSkin(player_t *player, INT32 skinnum)
{
if (demo.playback)
skinnum = demo.skinlist[skinnum].mapping;
skin_t *skin = &skins[skinnum];
player->skin = skinnum;
@ -404,9 +407,9 @@ static void SetSkin(player_t *player, INT32 skinnum)
// (If your mod locked them all, then you kinda stupid)
static INT32 GetPlayerDefaultSkin(INT32 playernum)
{
INT32 i;
INT32 i, skincount = (demo.playback ? demo.numskins : numskins);
for (i = 0; i < numskins; i++)
for (i = 0; i < skincount; i++)
{
if (R_SkinUsable(playernum, i, false))
{