mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-18 15:32:33 +00:00
Merge branch 'refresh-spr2' into 'next'
[SUGOI] Refresh Sprite2s See merge request STJr/SRB2!1750
This commit is contained in:
commit
55d96daa28
4 changed files with 158 additions and 5 deletions
|
@ -188,6 +188,9 @@ static inline int lib_freeslot(lua_State *L)
|
|||
lua_remove(L, 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
R_RefreshSprite2();
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
@ -513,6 +513,8 @@ void readfreeslots(MYFILE *f)
|
|||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
Z_Free(s);
|
||||
|
||||
R_RefreshSprite2();
|
||||
}
|
||||
|
||||
void readthing(MYFILE *f, INT32 num)
|
||||
|
|
156
src/r_skins.c
156
src/r_skins.c
|
@ -499,7 +499,7 @@ static UINT16 W_CheckForPatchSkinMarkerInPwad(UINT16 wadid, UINT16 startlump)
|
|||
return INT16_MAX; // not found
|
||||
}
|
||||
|
||||
static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, skin_t *skin)
|
||||
static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, skin_t *skin, UINT8 start_spr2)
|
||||
{
|
||||
UINT16 newlastlump;
|
||||
UINT8 sprite2;
|
||||
|
@ -521,7 +521,7 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski
|
|||
{
|
||||
newlastlump++;
|
||||
// load all sprite sets we are aware of... for super!
|
||||
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
|
||||
for (sprite2 = start_spr2; sprite2 < free_spr2; sprite2++)
|
||||
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[FF_SPR2SUPER|sprite2], wadnum, newlastlump, *lastlump);
|
||||
|
||||
newlastlump--;
|
||||
|
@ -529,7 +529,7 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski
|
|||
}
|
||||
|
||||
// load all sprite sets we are aware of... for normal stuff.
|
||||
for (sprite2 = 0; sprite2 < free_spr2; sprite2++)
|
||||
for (sprite2 = start_spr2; sprite2 < free_spr2; sprite2++)
|
||||
R_AddSingleSpriteDef(spr2names[sprite2], &skin->sprites[sprite2], wadnum, *lump, *lastlump);
|
||||
|
||||
if (skin->sprites[0].numframes == 0)
|
||||
|
@ -795,7 +795,7 @@ next_token:
|
|||
free(buf2);
|
||||
|
||||
// Add sprites
|
||||
R_LoadSkinSprites(wadnum, &lump, &lastlump, skin);
|
||||
R_LoadSkinSprites(wadnum, &lump, &lastlump, skin, 0);
|
||||
//ST_LoadFaceGraphics(numskins); -- nah let's do this elsewhere
|
||||
|
||||
R_FlushTranslationColormapCache();
|
||||
|
@ -928,7 +928,7 @@ next_token:
|
|||
}
|
||||
|
||||
// Patch sprites
|
||||
R_LoadSkinSprites(wadnum, &lump, &lastlump, skin);
|
||||
R_LoadSkinSprites(wadnum, &lump, &lastlump, skin, 0);
|
||||
//ST_LoadFaceGraphics(skinnum); -- nah let's do this elsewhere
|
||||
|
||||
R_FlushTranslationColormapCache();
|
||||
|
@ -941,3 +941,149 @@ next_token:
|
|||
|
||||
#undef HUDNAMEWRITE
|
||||
#undef SYMBOLCONVERT
|
||||
|
||||
static UINT16 W_CheckForEitherSkinMarkerInPwad(UINT16 wadid, UINT16 startlump)
|
||||
{
|
||||
UINT16 i;
|
||||
const char *S_SKIN = "S_SKIN";
|
||||
const char *P_SKIN = "P_SKIN";
|
||||
lumpinfo_t *lump_p;
|
||||
|
||||
// scan forward, start at <startlump>
|
||||
if (startlump < wadfiles[wadid]->numlumps)
|
||||
{
|
||||
lump_p = wadfiles[wadid]->lumpinfo + startlump;
|
||||
for (i = startlump; i < wadfiles[wadid]->numlumps; i++, lump_p++)
|
||||
if (memcmp(lump_p->name,S_SKIN,6)==0 || memcmp(lump_p->name,P_SKIN,6)==0)
|
||||
return i;
|
||||
}
|
||||
return INT16_MAX; // not found
|
||||
}
|
||||
|
||||
static void R_RefreshSprite2ForWad(UINT16 wadnum, UINT8 start_spr2)
|
||||
{
|
||||
UINT16 lump, lastlump = 0;
|
||||
char *buf;
|
||||
char *buf2;
|
||||
char *stoken;
|
||||
char *value;
|
||||
size_t size;
|
||||
skin_t *skin;
|
||||
boolean noskincomplain;
|
||||
|
||||
//
|
||||
// search for all skin patch markers in pwad
|
||||
//
|
||||
|
||||
while ((lump = W_CheckForEitherSkinMarkerInPwad(wadnum, lastlump)) != INT16_MAX)
|
||||
{
|
||||
INT32 skinnum = 0;
|
||||
|
||||
// advance by default
|
||||
lastlump = lump + 1;
|
||||
|
||||
buf = W_CacheLumpNumPwad(wadnum, lump, PU_CACHE);
|
||||
size = W_LumpLengthPwad(wadnum, lump);
|
||||
|
||||
// for strtok
|
||||
buf2 = malloc(size+1);
|
||||
if (!buf2)
|
||||
I_Error("R_RefreshSprite2ForWad: No more free memory\n");
|
||||
M_Memcpy(buf2,buf,size);
|
||||
buf2[size] = '\0';
|
||||
|
||||
skin = NULL;
|
||||
noskincomplain = false;
|
||||
|
||||
/*
|
||||
Parse. Has more phases than the parser in R_AddSkins because it needs to have the patching name first (no default skin name is acceptible for patching, unlike skin creation)
|
||||
*/
|
||||
|
||||
stoken = strtok(buf2, "\r\n= ");
|
||||
while (stoken)
|
||||
{
|
||||
if ((stoken[0] == '/' && stoken[1] == '/')
|
||||
|| (stoken[0] == '#'))// skip comments
|
||||
{
|
||||
stoken = strtok(NULL, "\r\n"); // skip end of line
|
||||
goto next_token; // find the real next token
|
||||
}
|
||||
|
||||
value = strtok(NULL, "\r\n= ");
|
||||
|
||||
if (!value)
|
||||
I_Error("R_RefreshSprite2ForWad: syntax error in P_SKIN lump# %d(%s) in WAD %s\n", lump, W_CheckNameForNumPwad(wadnum,lump), wadfiles[wadnum]->filename);
|
||||
|
||||
if (!stricmp(stoken, "name"))
|
||||
{
|
||||
strlwr(value);
|
||||
skinnum = R_SkinAvailable(value);
|
||||
if (skinnum != -1)
|
||||
skin = &skins[skinnum];
|
||||
else
|
||||
{
|
||||
CONS_Debug(DBG_SETUP, "R_RefreshSprite2ForWad: unknown skin name in P_SKIN lump# %d(%s) in WAD %s\n", lump, W_CheckNameForNumPwad(wadnum,lump), wadfiles[wadnum]->filename);
|
||||
noskincomplain = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!skin)
|
||||
break;
|
||||
|
||||
next_token:
|
||||
stoken = strtok(NULL, "\r\n= ");
|
||||
}
|
||||
free(buf2);
|
||||
|
||||
if (!skin) // Didn't include a name parameter? What a waste.
|
||||
{
|
||||
if (!noskincomplain)
|
||||
CONS_Debug(DBG_SETUP, "R_RefreshSprite2ForWad: no skin name given in P_SKIN lump #%d (WAD %s)\n", lump, wadfiles[wadnum]->filename);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Update sprites, in the range of (start_spr2 - free_spr2-1)
|
||||
R_LoadSkinSprites(wadnum, &lump, &lastlump, skin, start_spr2);
|
||||
//R_FlushTranslationColormapCache(); // I don't think this is needed for what we're doing?
|
||||
}
|
||||
}
|
||||
|
||||
static playersprite_t old_spr2 = SPR2_FIRSTFREESLOT;
|
||||
void R_RefreshSprite2(void)
|
||||
{
|
||||
// Sprite2s being defined by custom wads can create situations where
|
||||
// a custom character might want to add support, but due to load order,
|
||||
// might not be defined in time.
|
||||
|
||||
// The trick where you load characters then level packs to keep savedata
|
||||
// in particular will practically garantuee a level pack can NEVER add custom animations,
|
||||
// because custom character's Sprite2s will not be added.
|
||||
|
||||
// So, go through every file, and reload the sprite2s that were added.
|
||||
|
||||
INT32 i;
|
||||
|
||||
if (old_spr2 > free_spr2)
|
||||
{
|
||||
#ifdef PARANOIA
|
||||
I_Error("R_RefreshSprite2: old_spr2 is too high?! (old_spr2: %d, free_spr2: %d)\n", old_spr2, free_spr2);
|
||||
#else
|
||||
// Just silently fix
|
||||
old_spr2 = free_spr2;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (old_spr2 == free_spr2)
|
||||
{
|
||||
// No sprite2s were added since the last time we did freeslots.
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < numwadfiles; i++)
|
||||
{
|
||||
R_RefreshSprite2ForWad(i, old_spr2);
|
||||
}
|
||||
|
||||
// Update previous value.
|
||||
old_spr2 = free_spr2;
|
||||
}
|
||||
|
|
|
@ -100,4 +100,6 @@ void R_PatchSkins(UINT16 wadnum, boolean mainfile);
|
|||
|
||||
UINT8 P_GetSkinSprite2(skin_t *skin, UINT8 spr2, player_t *player);
|
||||
|
||||
void R_RefreshSprite2(void);
|
||||
|
||||
#endif //__R_SKINS__
|
||||
|
|
Loading…
Reference in a new issue