Merge branch 'pk3-directory-start' into 'next'

Don't skip the first directory entry of PK3 if it's a file

See merge request STJr/SRB2!764
This commit is contained in:
James R 2020-04-09 19:49:44 -04:00
commit 4e7283c833
4 changed files with 30 additions and 22 deletions

View File

@ -721,14 +721,12 @@ Rloadflats (INT32 i, INT32 w)
} }
else else
{ {
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0); texstart = W_CheckNumForMarkerStartPwad("F_START", (UINT16)w, 0);
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart); texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
} }
if (!( texstart == INT16_MAX || texend == INT16_MAX )) if (!( texstart == INT16_MAX || texend == INT16_MAX ))
{ {
texstart++; // Do not count the first marker
// Work through each lump between the markers in the WAD. // Work through each lump between the markers in the WAD.
for (j = 0; j < (texend - texstart); j++) for (j = 0; j < (texend - texstart); j++)
{ {
@ -841,7 +839,7 @@ Rloadtextures (INT32 i, INT32 w)
} }
else else
{ {
texstart = W_CheckNumForNamePwad(TX_START, (UINT16)w, 0); texstart = W_CheckNumForMarkerStartPwad(TX_START, (UINT16)w, 0);
texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0); texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0);
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0); texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
if (texturesLumpPos != INT16_MAX) if (texturesLumpPos != INT16_MAX)
@ -850,8 +848,6 @@ Rloadtextures (INT32 i, INT32 w)
if (!( texstart == INT16_MAX || texend == INT16_MAX )) if (!( texstart == INT16_MAX || texend == INT16_MAX ))
{ {
texstart++; // Do not count the first marker
// Work through each lump between the markers in the WAD. // Work through each lump between the markers in the WAD.
for (j = 0; j < (texend - texstart); j++) for (j = 0; j < (texend - texstart); j++)
{ {
@ -958,14 +954,12 @@ void R_LoadTextures(void)
} }
else else
{ {
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0); texstart = W_CheckNumForMarkerStartPwad("F_START", (UINT16)w, 0);
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart); texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
} }
if (!( texstart == INT16_MAX || texend == INT16_MAX )) if (!( texstart == INT16_MAX || texend == INT16_MAX ))
{ {
texstart++; // Do not count the first marker
// PK3s have subfolders, so we can't just make a simple sum // PK3s have subfolders, so we can't just make a simple sum
if (wadfiles[w]->type == RET_PK3) if (wadfiles[w]->type == RET_PK3)
{ {
@ -998,15 +992,13 @@ void R_LoadTextures(void)
} }
else else
{ {
texstart = W_CheckNumForNamePwad(TX_START, (UINT16)w, 0); texstart = W_CheckNumForMarkerStartPwad(TX_START, (UINT16)w, 0);
texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0); texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0);
} }
if (texstart == INT16_MAX || texend == INT16_MAX) if (texstart == INT16_MAX || texend == INT16_MAX)
continue; continue;
texstart++; // Do not count the first marker
// PK3s have subfolders, so we can't just make a simple sum // PK3s have subfolders, so we can't just make a simple sum
if (wadfiles[w]->type == RET_PK3) if (wadfiles[w]->type == RET_PK3)
{ {
@ -1592,9 +1584,9 @@ lumpnum_t R_GetFlatNumForName(const char *name)
switch (wadfiles[i]->type) switch (wadfiles[i]->type)
{ {
case RET_WAD: case RET_WAD:
if ((start = W_CheckNumForNamePwad("F_START", (UINT16)i, 0)) == INT16_MAX) if ((start = W_CheckNumForMarkerStartPwad("F_START", (UINT16)i, 0)) == INT16_MAX)
{ {
if ((start = W_CheckNumForNamePwad("FF_START", (UINT16)i, 0)) == INT16_MAX) if ((start = W_CheckNumForMarkerStartPwad("FF_START", (UINT16)i, 0)) == INT16_MAX)
continue; continue;
else if ((end = W_CheckNumForNamePwad("FF_END", (UINT16)i, start)) == INT16_MAX) else if ((end = W_CheckNumForNamePwad("FF_END", (UINT16)i, start)) == INT16_MAX)
continue; continue;

View File

@ -428,9 +428,9 @@ void R_AddSpriteDefs(UINT16 wadnum)
switch (wadfiles[wadnum]->type) switch (wadfiles[wadnum]->type)
{ {
case RET_WAD: case RET_WAD:
start = W_CheckNumForNamePwad("S_START", wadnum, 0); start = W_CheckNumForMarkerStartPwad("S_START", wadnum, 0);
if (start == INT16_MAX) if (start == INT16_MAX)
start = W_CheckNumForNamePwad("SS_START", wadnum, 0); //deutex compatib. start = W_CheckNumForMarkerStartPwad("SS_START", wadnum, 0); //deutex compatib.
end = W_CheckNumForNamePwad("S_END",wadnum,start); end = W_CheckNumForNamePwad("S_END",wadnum,start);
if (end == INT16_MAX) if (end == INT16_MAX)
@ -452,8 +452,6 @@ void R_AddSpriteDefs(UINT16 wadnum)
start = 0; //let say S_START is lump 0 start = 0; //let say S_START is lump 0
} }
else
start++; // just after S_START
if (end == INT16_MAX || start >= end) if (end == INT16_MAX || start >= end)
{ {

View File

@ -194,7 +194,6 @@ static inline void W_LoadDehackedLumpsPK3(UINT16 wadnum, boolean mainfile)
if (posStart != INT16_MAX) if (posStart != INT16_MAX)
{ {
posEnd = W_CheckNumForFolderEndPK3("Lua/", wadnum, posStart); posEnd = W_CheckNumForFolderEndPK3("Lua/", wadnum, posStart);
posStart++; // first "lump" will be "Lua/" folder itself, so ignore it
for (; posStart < posEnd; posStart++) for (; posStart < posEnd; posStart++)
LUA_LoadLump(wadnum, posStart); LUA_LoadLump(wadnum, posStart);
} }
@ -204,7 +203,6 @@ static inline void W_LoadDehackedLumpsPK3(UINT16 wadnum, boolean mainfile)
{ {
posEnd = W_CheckNumForFolderEndPK3("SOC/", wadnum, posStart); posEnd = W_CheckNumForFolderEndPK3("SOC/", wadnum, posStart);
posStart++; // first "lump" will be "SOC/" folder itself, so ignore it
for(; posStart < posEnd; posStart++) for(; posStart < posEnd; posStart++)
{ {
lumpinfo_t *lump_p = &wadfiles[wadnum]->lumpinfo[posStart]; lumpinfo_t *lump_p = &wadfiles[wadnum]->lumpinfo[posStart];
@ -914,16 +912,33 @@ UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump)
return INT16_MAX; return INT16_MAX;
} }
UINT16
W_CheckNumForMarkerStartPwad (const char *name, UINT16 wad, UINT16 startlump)
{
UINT16 marker;
marker = W_CheckNumForNamePwad(name, wad, startlump);
if (marker != INT16_MAX)
marker++; // Do not count the first marker
return marker;
}
// Look for the first lump from a folder. // Look for the first lump from a folder.
UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlump) UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlump)
{ {
size_t name_length;
INT32 i; INT32 i;
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump; lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
name_length = strlen(name);
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++) for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
{ {
if (strnicmp(name, lump_p->name2, strlen(name)) == 0) if (strnicmp(name, lump_p->name2, name_length) == 0)
{
/* SLADE is special and puts a single directory entry. Skip that. */
if (strlen(lump_p->name2) == name_length)
i++;
break; break;
} }
}
return i; return i;
} }
@ -1025,7 +1040,7 @@ lumpnum_t W_CheckNumForMap(const char *name)
else else
continue; continue;
// Now look for the specified map. // Now look for the specified map.
for (++lumpNum; lumpNum < end; lumpNum++) for (; lumpNum < end; lumpNum++)
if (!strnicmp(name, (wadfiles[i]->lumpinfo + lumpNum)->name, 8)) if (!strnicmp(name, (wadfiles[i]->lumpinfo + lumpNum)->name, 8))
return (i<<16) + lumpNum; return (i<<16) + lumpNum;
} }

View File

@ -156,6 +156,9 @@ const char *W_CheckNameForNum(lumpnum_t lumpnum);
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump); // checks only in one pwad UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump); // checks only in one pwad
/* Find the first lump after F_START for instance. */
UINT16 W_CheckNumForMarkerStartPwad(const char *name, UINT16 wad, UINT16 startlump);
UINT16 W_CheckNumForFullNamePK3(const char *name, UINT16 wad, UINT16 startlump); UINT16 W_CheckNumForFullNamePK3(const char *name, UINT16 wad, UINT16 startlump);
UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlump); UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlump);
UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump); UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump);