A bit more work on PK3.

-Expanded folder recognition for PK3s. Some resources are still not loaded from them yet.
-Took a glimpse at how maps are loaded, since the flat recognition is rooted somewhere there; did nothing yet about it though.
-Working towards "generalizing" how new resources are handled. Some var and functionality redundancy is still present.
This commit is contained in:
Nevur 2017-05-06 16:52:53 +02:00
parent b60010f0f1
commit 8ef6d6fd9e
6 changed files with 200 additions and 54 deletions

View file

@ -543,10 +543,6 @@ static inline void P_LoadSubsectors(lumpnum_t lumpnum)
Z_Free(data);
}
//
// P_LoadSectors
//
//
// levelflats
//
@ -572,24 +568,21 @@ size_t P_PrecacheLevelFlats(void)
return flatmemory;
}
// help function for P_LoadSectors, find a flat in the active wad files,
// Auxiliary function. Find a flat in the active wad files,
// allocate an id for it, and set the levelflat (to speedup search)
//
INT32 P_AddLevelFlat(const char *flatname, levelflat_t *levelflat)
{
size_t i;
//
// first scan through the already found flats
//
// Scan through the already found flats, break if it matches.
for (i = 0; i < numlevelflats; i++, levelflat++)
if (strnicmp(levelflat->name,flatname,8)==0)
if (strnicmp(levelflat->name, flatname, 8) == 0)
break;
// that flat was already found in the level, return the id
// If there is no match, make room for a new flat.
if (i == numlevelflats)
{
// store the name
// Store the name.
strlcpy(levelflat->name, flatname, sizeof (levelflat->name));
strupr(levelflat->name);
@ -673,6 +666,8 @@ INT32 P_CheckLevelFlat(const char *flatname)
return (INT32)i;
}
// Sets up the ingame sectors structures.
// Lumpnum is the lumpnum of a SECTORS lump.
static void P_LoadSectors(lumpnum_t lumpnum)
{
UINT8 *data;
@ -681,21 +676,26 @@ static void P_LoadSectors(lumpnum_t lumpnum)
sector_t *ss;
levelflat_t *foundflats;
// We count how many sectors we got.
numsectors = W_LumpLength(lumpnum) / sizeof (mapsector_t);
if (numsectors <= 0)
I_Error("Level has no sectors");
// Allocate as much memory as we need into the global sectors table.
sectors = Z_Calloc(numsectors*sizeof (*sectors), PU_LEVEL, NULL);
data = W_CacheLumpNum(lumpnum,PU_STATIC);
//Fab : FIXME: allocate for whatever number of flats
// 512 different flats per level should be plenty
// Cache the data from the lump.
data = W_CacheLumpNum(lumpnum, PU_STATIC);
// Allocate a big chunk of memory as big as our MAXLEVELFLATS limit.
//Fab : FIXME: allocate for whatever number of flats - 512 different flats per level should be plenty
foundflats = calloc(MAXLEVELFLATS, sizeof (*foundflats));
if (foundflats == NULL)
I_Error("Ran out of memory while loading sectors\n");
numlevelflats = 0;
// For each counted sector, copy the sector raw data from our cache pointer ms, to the global table pointer ss.
ms = (mapsector_t *)data;
ss = sectors;
for (i = 0; i < numsectors; i++, ss++, ms++)
@ -703,9 +703,6 @@ static void P_LoadSectors(lumpnum_t lumpnum)
ss->floorheight = SHORT(ms->floorheight)<<FRACBITS;
ss->ceilingheight = SHORT(ms->ceilingheight)<<FRACBITS;
//
// flats
//
ss->floorpic = P_AddLevelFlat(ms->floorpic, foundflats);
ss->ceilingpic = P_AddLevelFlat(ms->ceilingpic, foundflats);
@ -3017,6 +3014,71 @@ boolean P_RunSOC(const char *socfilename)
return true;
}
#ifdef HAVE_BLUA
// Auxiliary function for PK3 loading - runs Lua scripts from range.
void P_LoadLuaScrRange(UINT16 wadnum, UINT16 first, UINT16 num)
{
for (; num > 0; num--, first++)
{
LUA_LoadLump(wadnum, first);
}
}
#endif
// Auxiliary function for PK3 loading - runs SOCs from range.
void P_LoadDehackRange(UINT16 wadnum, UINT16 first, UINT16 num)
{
for (; num > 0; num--, first++)
{
CONS_Printf(M_GetText("Loading SOC from %s\n"), wadfiles[wadnum]->filename);
DEH_LoadDehackedLumpPwad(wadnum, first);
}
}
// Auxiliary function for PK3 loading - looks for sound replacements.
// NOTE: it does not really add any new sound entry or anything.
void P_LoadSoundsRange(UINT16 wadnum, UINT16 first, UINT16 num)
{
size_t j;
lumpinfo_t *lumpinfo = wadfiles[wadnum]->lumpinfo + first;
for (; num > 0; num--, lumpinfo++)
{
// Let's check whether it's replacing an existing sound or it's a brand new one.
for (j = 1; j < NUMSFX; j++)
{
if (S_sfx[j].name && !strnicmp(S_sfx[j].name, lumpinfo->name + 2, 6))
{
// the sound will be reloaded when needed,
// since sfx->data will be NULL
CONS_Debug(DBG_SETUP, "Sound %.8s replaced\n", lumpinfo->name);
I_FreeSfx(&S_sfx[j]);
}
}
}
}
// Auxiliary function for PK3 loading - looks for sound replacements.
// NOTE: does nothing but print debug messages.
void P_LoadMusicsRange(UINT16 wadnum, UINT16 first, UINT16 num)
{
lumpinfo_t *lumpinfo = wadfiles[wadnum]->lumpinfo + first;
char *name;
for (; num > 0; num--, lumpinfo++)
{
name = lumpinfo->name;
if (name[0] == 'O' && name[1] == '_')
{
CONS_Debug(DBG_SETUP, "Music %.8s replaced\n", name);
}
else if (name[0] == 'D' && name[1] == '_')
{
CONS_Debug(DBG_SETUP, "Music %.8s replaced\n", name);
}
}
return;
}
//
// Add a wadfile to the active wad files,
// replace sounds, musics, patches, textures, sprites and maps
@ -3027,10 +3089,24 @@ boolean P_AddWadFile(const char *wadfilename, char **firstmapname)
UINT16 numlumps, wadnum;
INT16 firstmapreplaced = 0, num;
char *name;
char *fullName;
lumpinfo_t *lumpinfo;
boolean replacedcurrentmap = false;
// Vars to help us with the position start and amount of each resource type.
// Useful for PK3s since they use folders.
// WADs use markers for some resources, but others such as sounds are checked lump-by-lump anyway.
UINT16 luaPos, luaNum = 0;
UINT16 socPos, socNum = 0;
UINT16 sfxPos, sfxNum = 0;
UINT16 musPos, musNum = 0;
UINT16 sprPos, sprNum = 0;
UINT16 texPos, texNum = 0;
// UINT16 patPos, patNum = 0;
// UINT16 flaPos, flaNum = 0;
// UINT16 mapPos, mapNum = 0;
if ((numlumps = W_LoadWadFile(wadfilename)) == INT16_MAX)
{
CONS_Printf(M_GetText("Errors occured while loading %s; not added.\n"), wadfilename);
@ -3039,38 +3115,67 @@ boolean P_AddWadFile(const char *wadfilename, char **firstmapname)
else
wadnum = (UINT16)(numwadfiles-1);
lumpinfo = wadfiles[wadnum]->lumpinfo;
//
// search for sound replacements
//
switch(wadfiles[wadnum]->type)
{
case 2342342:
for (i = 0; i < numlumps; i++, lumpinfo++)
case RET_PK3:
{
name = lumpinfo->name;
fullName = lumpinfo->name2;
if (!strnicmp(fullName, "sounds", 6))
// Auxiliary function - input a folder name and gives us the resource markers positions.
void FindFolder(char *folName, UINT16 *start, UINT16 *end)
{
// We found a sound. Let's check whether it's replacing an existing sound or it's a brand new one.
for (j = 1; j < NUMSFX; j++)
if (!stricmp(lumpinfo->name2, folName))
{
if (S_sfx[j].name && !strnicmp(S_sfx[j].name, name, 6))
lumpinfo++;
*start = ++i;
for (i; i < numlumps; i++, lumpinfo++)
{
// the sound will be reloaded when needed,
// since sfx->data will be NULL
CONS_Debug(DBG_SETUP, "Sound %.8s replaced\n", name);
I_FreeSfx(&S_sfx[j]);
sreplaces++;
if (strnicmp(lumpinfo->name2, folName, strlen(folName)))
{
break;
}
}
lumpinfo--;
*end = i-- - *start;
CONS_Printf("Folder %s, first lump %lu, total: %lu.\n", folName, *start, *end);
return;
}
return;
}
// Look for the lumps that act as resource delimitation markers.
lumpinfo = wadfiles[wadnum]->lumpinfo;
for (i = 0; i < numlumps; i++, lumpinfo++)
{
FindFolder("Lua/", &luaPos, &luaNum);
FindFolder("Soc/", &socPos, &socNum);
FindFolder("Sounds/", &sfxPos, &sfxNum);
FindFolder("Music/", &musPos, &musNum);
FindFolder("Sprites/", &sprPos, &sprNum);
FindFolder("Textures/", &texPos, &texNum);
// FindFolder("Patches/", &patPos, &patNum);
// FindFolder("Flats/", &flaPos, &flaNum);
// FindFolder("Maps/", &mapPos, &mapNum);
}
// Update the detected resources.
// Note: ALWAYS load Lua scripts first, SOCs right after, and the remaining resources afterwards.
#ifdef HAVE_BLUA
if (luaNum) // Lua scripts.
P_LoadLuaScrRange(wadnum, luaPos, luaNum);
#endif
if (socNum) // SOCs.
P_LoadDehackRange(wadnum, socPos, socNum);
if (sfxNum) // Sounds. TODO: Function currently only updates already existing sounds, the rest is handled somewhere else.
P_LoadSoundsRange(wadnum, sfxPos, sfxNum);
if (musNum) // Music. TODO: Useless function right now.
P_LoadMusicsRange(wadnum, musPos, musNum);
if (sprNum) // Sprites.
R_LoadSpritsRange(wadnum, sprPos, sprNum);
if (texNum) // Textures. TODO: R_LoadTextures() does the folder positioning once again. New function maybe?
R_LoadTextures();
}
break;
default:
lumpinfo = wadfiles[wadnum]->lumpinfo;
for (i = 0; i < numlumps; i++, lumpinfo++)
{
name = lumpinfo->name;
@ -3101,6 +3206,18 @@ boolean P_AddWadFile(const char *wadfilename, char **firstmapname)
digmreplaces++;
}
}
//
// search for sprite replacements
//
R_AddSpriteDefs(wadnum);
// Reload it all anyway, just in case they
// added some textures but didn't insert a
// TEXTURE1/PNAMES/etc. list.
R_LoadTextures(); // numtexture changes
break;
}
if (!devparm && sreplaces)
@ -3110,16 +3227,6 @@ boolean P_AddWadFile(const char *wadfilename, char **firstmapname)
if (!devparm && digmreplaces)
CONS_Printf(M_GetText("%s digital musics replaced\n"), sizeu1(digmreplaces));
//
// search for sprite replacements
//
R_AddSpriteDefs(wadnum);
// Reload it all anyway, just in case they
// added some textures but didn't insert a
// TEXTURE1/PNAMES/etc. list.
R_LoadTextures(); // numtexture changes
// Reload ANIMATED / ANIMDEFS
P_InitPicAnims();

View file

@ -569,8 +569,8 @@ void R_LoadTextures(void)
{
if (wadfiles[w]->type == RET_PK3)
{
texstart = W_CheckNumForFullNamePK3("txturs/", (UINT16)w, 0) + 1;
texend = W_CheckNumForFolderEndPK3("txturs/", (UINT16)w, texstart);
texstart = W_CheckNumForFullNamePK3("textures/", (UINT16)w, 0) + 1;
texend = W_CheckNumForFolderEndPK3("textures/", (UINT16)w, texstart);
}
else
{
@ -620,8 +620,8 @@ void R_LoadTextures(void)
// Get the lump numbers for the markers in the WAD, if they exist.
if (wadfiles[w]->type == RET_PK3)
{
texstart = W_CheckNumForFullNamePK3("txturs/", (UINT16)w, 0) + 1;
texend = W_CheckNumForFolderEndPK3("txturs/", (UINT16)w, texstart);
texstart = W_CheckNumForFullNamePK3("textures/", (UINT16)w, 0) + 1;
texend = W_CheckNumForFolderEndPK3("textures/", (UINT16)w, texstart);
}
else
{

View file

@ -368,6 +368,38 @@ static boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef,
return true;
}
// Auxiliary function for PK3 loading - Loads sprites from a specified range.
void R_LoadSpritsRange(UINT16 wadnum, UINT16 first, UINT16 num)
{
size_t i, addsprites = 0;
char wadname[MAX_WADPATH];
//
// scan through lumps, for each sprite, find all the sprite frames
//
for (i = 0; i < numsprites; i++)
{
spritename = sprnames[i];
if (spritename[4] && wadnum >= (UINT16)spritename[4])
continue;
if (R_AddSingleSpriteDef(spritename, &sprites[i], wadnum, first, first + num + 1))
{
#ifdef HWRENDER
if (rendermode == render_opengl)
HWR_AddSpriteMD2(i);
#endif
// if a new sprite was added (not just replaced)
addsprites++;
#ifndef ZDEBUG
CONS_Debug(DBG_SETUP, "sprite %s set in pwad %d\n", spritename, wadnum);
#endif
}
}
nameonly(strcpy(wadname, wadfiles[wadnum]->filename));
CONS_Printf(M_GetText("%s added %d frames in %s sprites\n"), wadname, num, sizeu1(addsprites));
}
//
// Search for sprites replacements in a wad whose names are in namelist
//

View file

@ -50,6 +50,8 @@ void R_SortVisSprites(void);
//faB: find sprites in wadfile, replace existing, add new ones
// (only sprites from namelist are added or replaced)
void R_AddSpriteDefs(UINT16 wadnum);
void R_AddSpriteDefsRange(UINT16 wadnum, UINT16 start, UINT16 end);
#ifdef DELFILE
void R_DelSpriteDefs(UINT16 wadnum);

View file

@ -696,7 +696,10 @@ UINT16 W_LoadWadFile(const char *filename)
CONS_Printf(M_GetText("Added file %s (%u lumps)\n"), filename, numlumps);
wadfiles[numwadfiles] = wadfile;
numwadfiles++; // must come BEFORE W_LoadDehackedLumps, so any addfile called by COM_BufInsertText called by Lua doesn't overwrite what we just loaded
W_LoadDehackedLumps(numwadfiles-1);
// TODO: HACK ALERT - Load Lua & SOC stuff right here for WADs. Avoids crash on startup since WADs are loaded using W_InitMultipleFiles.
if (wadfile->type == RET_WAD)
W_LoadDehackedLumps(numwadfiles - 1);
W_InvalidateLumpnumCache();

View file

@ -99,6 +99,8 @@ UINT16 W_LoadWadFile(const char *filename);
void W_UnloadWadFile(UINT16 num);
#endif
static inline void W_LoadDehackedLumps(UINT16 wadnum);
// W_InitMultipleFiles returns 1 if all is okay, 0 otherwise,
// so that it stops with a message if a file was not found, but not if all is okay.
INT32 W_InitMultipleFiles(char **filenames);