From 1941ba09b0c6ffa53861e9f1aef6972a083a6bf3 Mon Sep 17 00:00:00 2001 From: fickleheart Date: Sun, 24 Mar 2019 19:41:25 -0500 Subject: [PATCH] Use skin with closest stats if the expected one wasn't found This allows people to watch replays without the characters loaded, without making everyone be Sonic. --- src/g_game.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 608ab33ab..319c4a00b 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4855,6 +4855,26 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n) return dest; } +// Finds a skin with the closest stats if the expected skin doesn't exist. +static void FindClosestSkinForStats(UINT32 p, UINT8 kartspeed, UINT8 kartweight) +{ + INT32 i, closest_skin = 0; + UINT8 closest_stats = UINT8_MAX, stat_diff; + + for (i = 0; i < numskins; i++) + { + stat_diff = abs(skins[i].kartspeed - kartspeed) + abs(skins[i].kartweight - kartweight); + if (stat_diff < closest_stats) + { + closest_stats = stat_diff; + closest_skin = i; + } + } + + CONS_Printf("Using %s instead...\n", skins[closest_skin].name); + SetPlayerSkinByNum(p, closest_skin); +} + void G_ReadDemoExtraData(void) { INT32 p, extradata, i; @@ -4875,10 +4895,22 @@ void G_ReadDemoExtraData(void) } if (extradata & DXD_SKIN) { + UINT8 kartspeed, kartweight; + // Skin M_Memcpy(name, demo_p, 16); demo_p += 16; SetPlayerSkin(p, name); + + kartspeed = READUINT8(demo_p); + kartweight = READUINT8(demo_p); + + + if (stricmp(skins[players[p].skin].name, name) != 0) + FindClosestSkinForStats(p, kartspeed, kartweight); + + players[p].kartspeed = kartspeed; + players[p].kartweight = kartweight; } if (extradata & DXD_COLOR) { @@ -4999,6 +5031,9 @@ void G_WriteDemoExtraData(void) strncpy(name, skins[players[i].skin].name, 16); M_Memcpy(demo_p,name,16); demo_p += 16; + + WRITEUINT8(demo_p, skins[players[i].skin].kartspeed); + WRITEUINT8(demo_p, skins[players[i].skin].kartweight); } if (demo_extradata[i] & DXD_COLOR) { @@ -6981,6 +7016,9 @@ void G_DoPlayDemo(char *defdemoname) kartspeed[p] = READUINT8(demo_p); kartweight[p] = READUINT8(demo_p); + if (stricmp(skins[players[p].skin].name, skin) != 0) + FindClosestSkinForStats(p, kartspeed[p], kartweight[p]); + // Look for the next player p = READUINT8(demo_p); }