* Introduce SPR2_XTRA for face graphics, since the current system is prone to plenty of conflicts with modders if you're not careful.

* Fixed a bug where you'd see :nick: on the current character selection screen if you didn't have many skins loaded.
* Fixed a bug where character skins loaded in PK3s would attempt to load every single lump of the PK3, even if it wasn't in the same subfolder as the original S_SKIN, as a sprite into the player struct. Could stand to be ported to vanilla.

Requires new chars.kart, which was created using the help of the indev 2.2-based Kartmaker update which will be available shortly.
This commit is contained in:
toaster 2020-09-23 23:46:54 +01:00
parent efdb8e67d9
commit 23faef24d7
10 changed files with 64 additions and 71 deletions

View file

@ -742,6 +742,7 @@ char spr2names[NUMPLAYERSPRITES][5] =
"SPIN", // Spinout
"SQSH", // Squish
"SIGN", // Finish signpost
"XTRA", // Three Faces of Darkness
};
playersprite_t free_spr2 = SPR2_FIRSTFREESLOT;

View file

@ -1020,6 +1020,7 @@ typedef enum playersprite
SPR2_SPIN,
SPR2_SQSH,
SPR2_SIGN,
SPR2_XTRA,
SPR2_FIRSTFREESLOT,
SPR2_LASTFREESLOT = 0x7f,
NUMPLAYERSPRITES

View file

@ -25,9 +25,6 @@ enum skin {
skin_wadnum,
skin_flags,
skin_realname,
skin_facerank,
skin_facewant,
skin_facemmap,
// SRB2kart
skin_kartspeed,
skin_kartweight,
@ -48,9 +45,6 @@ static const char *const skin_opt[] = {
"wadnum",
"flags",
"realname",
"facerank",
"facewant",
"facemmap",
"kartspeed",
"kartweight",
"followitem",
@ -69,7 +63,6 @@ static int skin_get(lua_State *L)
{
skin_t *skin = *((skin_t **)luaL_checkudata(L, 1, META_SKIN));
enum skin field = luaL_checkoption(L, 2, NULL, skin_opt);
INT32 i;
// skins are always valid, only added, never removed
I_Assert(skin != NULL);
@ -93,24 +86,6 @@ static int skin_get(lua_State *L)
case skin_realname:
lua_pushstring(L, skin->realname);
break;
case skin_facerank:
for (i = 0; i < 8; i++)
if (!skin->facerank[i])
break;
lua_pushlstring(L, skin->facerank, i);
break;
case skin_facewant:
for (i = 0; i < 8; i++)
if (!skin->facewant[i])
break;
lua_pushlstring(L, skin->facewant, i);
break;
case skin_facemmap:
for (i = 0; i < 8; i++)
if (!skin->facemmap[i])
break;
lua_pushlstring(L, skin->facemmap, i);
break;
// SRB2kart
case skin_kartspeed:
lua_pushinteger(L, skin->kartspeed);

View file

@ -5601,7 +5601,7 @@ static void DrawReplayHutReplayInfo(void)
// Lat: 08/06/2020: For some reason missing skins have their value set to 255 (don't even ask me why I didn't write this)
// and for an even STRANGER reason this passes the first check below, so we're going to make sure that the skin here ISN'T 255 before we do anything stupid.
if (demolist[dir_on[menudepthleft]].standings[0].skin != 0xFF && W_CheckNumForName(skins[demolist[dir_on[menudepthleft]].standings[0].skin].facewant) != LUMPERROR)
if (demolist[dir_on[menudepthleft]].standings[0].skin != 0xFF)
{
patch = faceprefix[demolist[dir_on[menudepthleft]].standings[0].skin][FACE_WANTED];
colormap = R_GetTranslationColormap(
@ -5803,7 +5803,7 @@ static void M_DrawReplayStartMenu(void)
// Lat: 08/06/2020: For some reason missing skins have their value set to 255 (don't even ask me why I didn't write this)
// and for an even STRANGER reason this passes the first check below, so we're going to make sure that the skin here ISN'T 255 before we do anything stupid.
if (demolist[dir_on[menudepthleft]].standings[i].skin != 0xFF && W_CheckNumForName(skins[demolist[dir_on[menudepthleft]].standings[i].skin].facerank) != LUMPERROR)
if (demolist[dir_on[menudepthleft]].standings[i].skin != 0xFF)
{
patch = faceprefix[demolist[dir_on[menudepthleft]].standings[i].skin][FACE_RANK];
colormap = R_GetTranslationColormap(
@ -7795,7 +7795,6 @@ void M_DrawTimeAttackMenu(void)
y = currentMenu->y;
// Character face!
if (W_CheckNumForName(skins[cv_chooseskin.value-1].facewant) != LUMPERROR)
{
UINT8 *colormap = R_GetTranslationColormap(cv_chooseskin.value-1, cv_playercolor[0].value, GTC_MENUCACHE);
V_DrawMappedPatch(BASEVIDWIDTH-x - SHORT(faceprefix[cv_chooseskin.value-1][FACE_WANTED]->width), y, 0, faceprefix[cv_chooseskin.value-1][FACE_WANTED], colormap);
@ -9554,7 +9553,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
{
const INT32 icons = 4;
INT32 k = -icons;
INT16 col = setupm_fakeskin - icons;
INT16 col = (setupm_fakeskin - icons) % numskins;
INT32 x = BASEVIDWIDTH/2 - ((icons+1)*24) - 4;
fixed_t scale = FRACUNIT/2;
INT32 offx = 8, offy = 8;

View file

@ -109,9 +109,6 @@ static void Sk_SetDefaultValue(skin_t *skin)
skin->flags = 0;
strcpy(skin->realname, "Someone");
strncpy(skin->facerank, "PLAYRANK", 9);
strncpy(skin->facewant, "PLAYWANT", 9);
strncpy(skin->facemmap, "PLAYMMAP", 9);
skin->starttranscolor = 96;
skin->prefcolor = SKINCOLOR_GREEN;
skin->supercolor = SKINCOLOR_SUPERGOLD1;
@ -404,6 +401,8 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski
*lastlump = W_CheckNumForNamePwad("S_END",wadnum,*lump); // stop at S_END
// old wadding practices die hard -- stop at S_SKIN (or P_SKIN) or S_START if they come before S_END.
newlastlump = W_FindNextEmptyInPwad(wadnum,*lump);
if (newlastlump < *lastlump) *lastlump = newlastlump;
newlastlump = W_CheckForSkinMarkerInPwad(wadnum,*lump);
if (newlastlump < *lastlump) *lastlump = newlastlump;
newlastlump = W_CheckForPatchSkinMarkerInPwad(wadnum,*lump);
@ -411,7 +410,7 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski
newlastlump = W_CheckNumForNamePwad("S_START",wadnum,*lump);
if (newlastlump < *lastlump) *lastlump = newlastlump;
// ...and let's handle super, too
/*// ...and let's handle super, too
newlastlump = W_CheckNumForNamePwad("S_SUPER",wadnum,*lump);
if (newlastlump < *lastlump)
{
@ -422,7 +421,7 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski
newlastlump--;
*lastlump = newlastlump; // okay, make the normal sprite set loading end there
}
}*/
// load all sprite sets we are aware of... for normal stuff.
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
@ -629,21 +628,6 @@ void R_AddSkins(UINT16 wadnum)
STRBUFCPY(skin->realname, value);
SYMBOLCONVERT(skin->realname)
}
else if (!stricmp(stoken, "facerank"))
{
strupr(value);
strncpy(skin->facerank, value, sizeof skin->facerank);
}
else if (!stricmp(stoken, "facewant"))
{
strupr(value);
strncpy(skin->facewant, value, sizeof skin->facewant);
}
else if (!stricmp(stoken, "facemmap"))
{
strupr(value);
strncpy(skin->facemmap, value, sizeof skin->facemmap);
}
else if (!stricmp(stoken, "rivals"))
{
size_t len = strlen(value);
@ -799,21 +783,6 @@ void R_PatchSkins(UINT16 wadnum)
STRBUFCPY(skin->realname, value);
SYMBOLCONVERT(skin->realname)
}
else if (!stricmp(stoken, "facerank"))
{
STRBUFCPY(skin->facerank, value);
SYMBOLCONVERT(skin->facerank)
}
else if (!stricmp(stoken, "facewant"))
{
STRBUFCPY(skin->facewant, value);
SYMBOLCONVERT(skin->facewant)
}
else if (!stricmp(stoken, "facemmap"))
{
STRBUFCPY(skin->facemmap, value);
SYMBOLCONVERT(skin->facemmap)
}
else if (!stricmp(stoken, "rivals"))
{
size_t len = strlen(value);

View file

@ -37,7 +37,6 @@ typedef struct
skinflags_t flags;
char realname[SKINNAMESIZE+1]; // Display name for level completion.
char facerank[9], facewant[9], facemmap[9]; // Arbitrarily named patch lumps
// SRB2kart
UINT8 kartspeed;

View file

@ -366,11 +366,28 @@ void ST_LoadGraphics(void)
}
// made separate so that skins code can reload custom face graphics
void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 skinnum)
void ST_LoadFaceGraphics(INT32 skinnum)
{
faceprefix[skinnum][FACE_RANK] = W_CachePatchName(rankstr, PU_HUDGFX);
faceprefix[skinnum][FACE_WANTED] = W_CachePatchName(wantstr, PU_HUDGFX);
faceprefix[skinnum][FACE_MINIMAP] = W_CachePatchName(mmapstr, PU_HUDGFX);
#define FACE_MAX (FACE_MINIMAP+1)
spritedef_t *sprdef = &skins[skinnum].sprites[SPR2_XTRA];
spriteframe_t *sprframe;
UINT8 i = 0, maxer = min(sprdef->numframes, FACE_MAX);
while (i < maxer)
{
sprframe = &sprdef->spriteframes[i];
faceprefix[skinnum][i] = W_CachePatchNum(sprframe->lumppat[0], PU_HUDGFX);
i++;
}
if (i < FACE_MAX)
{
patch_t *missing = W_CachePatchName("MISSING", PU_HUDGFX);
while (i < FACE_MAX)
{
faceprefix[skinnum][i] = missing;
i++;
}
}
#undef FACE_MAX
}
void ST_ReloadSkinFaceGraphics(void)
@ -378,7 +395,7 @@ void ST_ReloadSkinFaceGraphics(void)
INT32 i;
for (i = 0; i < numskins; i++)
ST_LoadFaceGraphics(skins[i].facerank, skins[i].facewant, skins[i].facemmap, i);
ST_LoadFaceGraphics(i);
}
static inline void ST_InitData(void)

View file

@ -48,7 +48,7 @@ void ST_UnloadGraphics(void);
void ST_LoadGraphics(void);
// face load graphics, called when skin changes
void ST_LoadFaceGraphics(char *rankstr, char *wantstr, char *mmapstr, INT32 playernum);
void ST_LoadFaceGraphics(INT32 playernum);
void ST_ReloadSkinFaceGraphics(void);
void ST_doPaletteStuff(void);

View file

@ -921,6 +921,36 @@ const char *W_CheckNameForNum(lumpnum_t lumpnum)
return W_CheckNameForNumPwad(WADFILENUM(lumpnum),LUMPNUM(lumpnum));
}
//
// wadid is a wad number
// (Used for sprites loading)
//
// 'startlump' is the lump number to start the search
//
UINT16 W_FindNextEmptyInPwad(UINT16 wad, UINT16 startlump)
{
UINT16 i;
if (!TestValidLump(wad,0))
return INT16_MAX;
//
// scan forward
// start at 'startlump', useful parameter when there are multiple
// resources with the same name
//
if (startlump < wadfiles[wad]->numlumps)
{
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
if (!lump_p->size)
return i;
}
// not found.
return INT16_MAX;
}
//
// Same as the original, but checks in one pwad only.
// wadid is a wad number

View file

@ -158,6 +158,8 @@ INT32 W_InitMultipleFiles(char **filenames, boolean addons);
const char *W_CheckNameForNumPwad(UINT16 wad, UINT16 lump);
const char *W_CheckNameForNum(lumpnum_t lumpnum);
UINT16 W_FindNextEmptyInPwad(UINT16 wad, UINT16 startlump); // checks only in one pwad
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump); // checks only in one pwad
UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump);