diff --git a/Quake/cl_demo.c b/Quake/cl_demo.c index 7cd5c937..fb92b133 100644 --- a/Quake/cl_demo.c +++ b/Quake/cl_demo.c @@ -297,7 +297,7 @@ void CL_PlayDemo_f (void) COM_DefaultExtension (name, ".dem"); Con_Printf ("Playing demo from %s.\n", name); - COM_FOpenFile (name, &cls.demofile); + COM_FOpenFile (name, &cls.demofile, NULL); if (!cls.demofile) { Con_Printf ("ERROR: couldn't open.\n"); diff --git a/Quake/cmd.c b/Quake/cmd.c index 18580e0f..37cc4ff4 100644 --- a/Quake/cmd.c +++ b/Quake/cmd.c @@ -259,7 +259,7 @@ void Cmd_Exec_f (void) } mark = Hunk_LowMark (); - f = (char *)COM_LoadHunkFile (Cmd_Argv(1)); + f = (char *)COM_LoadHunkFile (Cmd_Argv(1), NULL); if (!f) { Con_Printf ("couldn't exec %s\n",Cmd_Argv(1)); diff --git a/Quake/common.c b/Quake/common.c index b9fff84e..09db0231 100644 --- a/Quake/common.c +++ b/Quake/common.c @@ -1109,7 +1109,7 @@ void COM_CheckRegistered (void) unsigned short check[128]; int i; - COM_OpenFile("gfx/pop.lmp", &h); + COM_OpenFile("gfx/pop.lmp", &h, NULL); static_registered = 0; if (h == -1) @@ -1366,6 +1366,9 @@ int file_from_pak; // ZOID: global indicating that file came from a pak typedef struct searchpath_s { + unsigned int path_id; // identifier assigned to the game directory + // Note that /game1 and + // /game1 have the same id. char filename[MAX_OSPATH]; pack_t *pack; // only one of filename / pack will be used struct searchpath_s *next; @@ -1450,7 +1453,8 @@ Finds the file in the search path. Sets com_filesize and one of handle or file =========== */ -static int COM_FindFile (const char *filename, int *handle, FILE **file) +static int COM_FindFile (const char *filename, int *handle, FILE **file, + unsigned int *path_id) { searchpath_t *search; char netpath[MAX_OSPATH]; @@ -1492,6 +1496,8 @@ static int COM_FindFile (const char *filename, int *handle, FILE **file) } file_from_pak = 1; com_filesize = pak->files[i].filelen; + if (path_id) + *path_id = search->path_id; return com_filesize; } } @@ -1512,6 +1518,8 @@ static int COM_FindFile (const char *filename, int *handle, FILE **file) // Sys_Printf ("FindFile: %s\n",netpath); com_filesize = Sys_FileOpenRead (netpath, &i); + if (path_id) + *path_id = search->path_id; if (handle) *handle = i; else @@ -1544,9 +1552,9 @@ returns a handle and a length it may actually be inside a pak file =========== */ -int COM_OpenFile (const char *filename, int *handle) +int COM_OpenFile (const char *filename, int *handle, unsigned int *path_id) { - return COM_FindFile (filename, handle, NULL); + return COM_FindFile (filename, handle, NULL, path_id); } /* @@ -1557,9 +1565,9 @@ If the requested file is inside a packfile, a new FILE * will be opened into the file. =========== */ -int COM_FOpenFile (const char *filename, FILE **file) +int COM_FOpenFile (const char *filename, FILE **file, unsigned int *path_id) { - return COM_FindFile (filename, NULL, file); + return COM_FindFile (filename, NULL, file, path_id); } /* @@ -1601,7 +1609,7 @@ static byte *loadbuf; static cache_user_t *loadcache; static int loadsize; -byte *COM_LoadFile (const char *path, int usehunk) +byte *COM_LoadFile (const char *path, int usehunk, unsigned int *path_id) { int h; byte *buf; @@ -1611,7 +1619,7 @@ byte *COM_LoadFile (const char *path, int usehunk) buf = NULL; // quiet compiler warning // look for it in the filesystem or pack files - len = COM_OpenFile (path, &h); + len = COM_OpenFile (path, &h, path_id); if (h == -1) return NULL; @@ -1662,35 +1670,35 @@ byte *COM_LoadFile (const char *path, int usehunk) return buf; } -byte *COM_LoadHunkFile (const char *path) +byte *COM_LoadHunkFile (const char *path, unsigned int *path_id) { - return COM_LoadFile (path, LOADFILE_HUNK); + return COM_LoadFile (path, LOADFILE_HUNK, path_id); } -byte *COM_LoadZoneFile (const char *path) +byte *COM_LoadZoneFile (const char *path, unsigned int *path_id) { - return COM_LoadFile (path, LOADFILE_ZONE); + return COM_LoadFile (path, LOADFILE_ZONE, path_id); } -byte *COM_LoadTempFile (const char *path) +byte *COM_LoadTempFile (const char *path, unsigned int *path_id) { - return COM_LoadFile (path, LOADFILE_TEMPHUNK); + return COM_LoadFile (path, LOADFILE_TEMPHUNK, path_id); } -void COM_LoadCacheFile (const char *path, struct cache_user_s *cu) +void COM_LoadCacheFile (const char *path, struct cache_user_s *cu, unsigned int *path_id) { loadcache = cu; - COM_LoadFile (path, LOADFILE_CACHE); + COM_LoadFile (path, LOADFILE_CACHE, path_id); } // uses temp hunk if larger than bufsize -byte *COM_LoadStackFile (const char *path, void *buffer, int bufsize) +byte *COM_LoadStackFile (const char *path, void *buffer, int bufsize, unsigned int *path_id) { byte *buf; loadbuf = (byte *)buffer; loadsize = bufsize; - buf = COM_LoadFile (path, LOADFILE_STACK); + buf = COM_LoadFile (path, LOADFILE_STACK, path_id); return buf; } @@ -1698,13 +1706,13 @@ byte *COM_LoadStackFile (const char *path, void *buffer, int bufsize) // loads into a previously allocated buffer. if space is insufficient // or the buffer is NULL, loads onto the hunk. bufsize is the actual // size (without the +1). -byte *COM_LoadBufFile (const char *path, void *buffer, int *bufsize) +byte *COM_LoadBufFile (const char *path, void *buffer, int *bufsize, unsigned int *path_id) { byte *buf; loadbuf = (byte *)buffer; loadsize = (*bufsize) + 1; - buf = COM_LoadFile (path, LOADFILE_BUF); + buf = COM_LoadFile (path, LOADFILE_BUF, path_id); *bufsize = (buf == NULL) ? 0 : com_filesize; if (loadbuf && buf && buf != loadbuf) Sys_Printf("LoadBufFile: insufficient buffer for %s not used.\n", path); @@ -1713,9 +1721,9 @@ byte *COM_LoadBufFile (const char *path, void *buffer, int *bufsize) } // returns malloc'd memory -byte *COM_LoadMallocFile (const char *path) +byte *COM_LoadMallocFile (const char *path, unsigned int *path_id) { - return COM_LoadFile (path, LOADFILE_MALLOC); + return COM_LoadFile (path, LOADFILE_MALLOC, path_id); } @@ -1801,14 +1809,21 @@ COM_AddGameDirectory -- johnfitz -- modified based on topaz's tutorial void COM_AddGameDirectory (const char *dir) { int i; + unsigned int path_id; searchpath_t *search; pack_t *pak; char pakfile[MAX_OSPATH]; strcpy (com_gamedir, dir); + // assign a path_id to this game directory + if (com_searchpaths) + path_id = com_searchpaths->path_id << 1; + else path_id = 1U; + // add the directory to the search path search = (searchpath_t *) Z_Malloc(sizeof(searchpath_t)); + search->path_id = path_id; strcpy (search->filename, dir); search->next = com_searchpaths; com_searchpaths = search; @@ -1821,6 +1836,7 @@ void COM_AddGameDirectory (const char *dir) if (!pak) break; search = (searchpath_t *) Z_Malloc(sizeof(searchpath_t)); + search->path_id = path_id; search->pack = pak; search->next = com_searchpaths; com_searchpaths = search; diff --git a/Quake/common.h b/Quake/common.h index c067b31b..1e5538d3 100644 --- a/Quake/common.h +++ b/Quake/common.h @@ -186,28 +186,31 @@ extern char com_gamedir[MAX_OSPATH]; extern int file_from_pak; // global indicating that file came from a pak void COM_WriteFile (const char *filename, const void *data, int len); -int COM_OpenFile (const char *filename, int *hndl); -int COM_FOpenFile (const char *filename, FILE **file); +int COM_OpenFile (const char *filename, int *handle, unsigned int *path_id); +int COM_FOpenFile (const char *filename, FILE **file, unsigned int *path_id); void COM_CloseFile (int h); // these procedures open a file using COM_FindFile and loads it into a proper // buffer. the buffer is allocated with a total size of com_filesize + 1. the // procedures differ by their buffer allocation method. -byte *COM_LoadStackFile (const char *path, void *buffer, int bufsize); +byte *COM_LoadStackFile (const char *path, void *buffer, int bufsize, + unsigned int *path_id); // uses the specified stack stack buffer with the specified size // of bufsize. if bufsize is too short, uses temp hunk. the bufsize // must include the +1 -byte *COM_LoadTempFile (const char *path); +byte *COM_LoadTempFile (const char *path, unsigned int *path_id); // allocates the buffer on the temp hunk. -byte *COM_LoadHunkFile (const char *path); +byte *COM_LoadHunkFile (const char *path, unsigned int *path_id); // allocates the buffer on the hunk. -byte *COM_LoadZoneFile (const char *path); +byte *COM_LoadZoneFile (const char *path, unsigned int *path_id); // allocates the buffer on the zone. -void COM_LoadCacheFile (const char *path, struct cache_user_s *cu); +void COM_LoadCacheFile (const char *path, struct cache_user_s *cu, + unsigned int *path_id); // uses cache mem for allocating the buffer. -byte *COM_LoadMallocFile (const char *path); +byte *COM_LoadMallocFile (const char *path, unsigned int *path_id); // allocates the buffer on the system mem (malloc). -byte *COM_LoadBufFile (const char *path, void *buffer, int *bufsize); +byte *COM_LoadBufFile (const char *path, void *buffer, int *bufsize, + unsigned int *path_id); // uses the specified pre-allocated buffer with bufsize + 1 size. // bufsize is the actual expected size (without the + 1). if the // space is too short or the buffer is NULL, loads onto the hunk. diff --git a/Quake/gl_draw.c b/Quake/gl_draw.c index adc44675..321da1c7 100644 --- a/Quake/gl_draw.c +++ b/Quake/gl_draw.c @@ -288,7 +288,7 @@ qpic_t *Draw_CachePic (const char *path) // // load the pic from disk // - dat = (qpic_t *)COM_LoadTempFile (path); + dat = (qpic_t *)COM_LoadTempFile (path, NULL); if (!dat) Sys_Error ("Draw_CachePic: failed to load %s", path); SwapPic (dat); @@ -322,7 +322,7 @@ extern char *get_conback(void); static qboolean have_mod_conback; void Draw_CheckConback (void) { - have_mod_conback = (COM_LoadTempFile("gfx/conback.lmp") != NULL); + have_mod_conback = (COM_LoadTempFile("gfx/conback.lmp", NULL) != NULL); } qpic_t *Draw_ConbackPic (void) { diff --git a/Quake/gl_model.c b/Quake/gl_model.c index 88e57ddc..3fce61b7 100644 --- a/Quake/gl_model.c +++ b/Quake/gl_model.c @@ -277,7 +277,7 @@ model_t *Mod_LoadModel (model_t *mod, qboolean crash) // // load the file // - buf = COM_LoadStackFile (mod->name, stackbuf, sizeof(stackbuf)); + buf = COM_LoadStackFile (mod->name, stackbuf, sizeof(stackbuf), NULL); if (!buf) { if (crash) @@ -640,7 +640,7 @@ void Mod_LoadLighting (lump_t *l) COM_StripExtension(litfilename, litfilename); strcat(litfilename, ".lit"); mark = Hunk_LowMark(); - data = (byte*) COM_LoadHunkFile (litfilename); + data = (byte*) COM_LoadHunkFile (litfilename, NULL); if (data) { if (data[0] == 'Q' && data[1] == 'L' && data[2] == 'I' && data[3] == 'T') diff --git a/Quake/gl_texmgr.c b/Quake/gl_texmgr.c index 03242cee..9f0b626a 100644 --- a/Quake/gl_texmgr.c +++ b/Quake/gl_texmgr.c @@ -431,7 +431,7 @@ void TexMgr_LoadPalette (void) int i, mark; FILE *f; - COM_FOpenFile ("gfx/palette.lmp", &f); + COM_FOpenFile ("gfx/palette.lmp", &f, NULL); if (!f) Sys_Error ("Couldn't load gfx/palette.lmp"); @@ -1228,7 +1228,7 @@ void TexMgr_ReloadImage (gltexture_t *glt, int shirt, int pants) if (glt->source_file[0] && glt->source_offset) { //lump inside file - data = COM_LoadHunkFile (glt->source_file); + data = COM_LoadHunkFile (glt->source_file, NULL); if (!data) goto invalid; data += glt->source_offset; diff --git a/Quake/host.c b/Quake/host.c index 03b06869..9fd7cb00 100644 --- a/Quake/host.c +++ b/Quake/host.c @@ -834,7 +834,7 @@ void Host_Init (quakeparms_t *parms) if (cls.state != ca_dedicated) { - host_colormap = (byte *)COM_LoadHunkFile ("gfx/colormap.lmp"); + host_colormap = (byte *)COM_LoadHunkFile ("gfx/colormap.lmp", NULL); if (!host_colormap) Sys_Error ("Couldn't load gfx/colormap.lmp"); diff --git a/Quake/host_cmd.c b/Quake/host_cmd.c index 989bc75d..b0b78d67 100644 --- a/Quake/host_cmd.c +++ b/Quake/host_cmd.c @@ -59,6 +59,7 @@ void Host_Quit_f (void) //============================================================================== // Declarations shared with common.c: +// FIXME: **** CLEAN THIS MESS!!! *** typedef struct { char name[MAX_QPATH]; @@ -75,6 +76,9 @@ typedef struct pack_s typedef struct searchpath_s { + unsigned int path_id; // identifier assigned to the game directory + // Note that /game1 and + // /game1 have the same id. char filename[MAX_OSPATH]; pack_t *pack; // only one of filename / pack will be used struct searchpath_s *next; @@ -129,6 +133,7 @@ Host_Game_f void Host_Game_f (void) { int i; + unsigned int path_id; searchpath_t *search = com_searchpaths; pack_t *pak; char pakfile[MAX_OSPATH]; //FIXME: it's confusing to use this string for two different things @@ -172,7 +177,12 @@ void Host_Game_f (void) if (Q_strcasecmp(Cmd_Argv(1), GAMENAME)) //game is not id1 { + // assign a path_id to this game directory + if (com_searchpaths) + path_id = com_searchpaths->path_id << 1; + else path_id = 1U; search = (searchpath_t *) Z_Malloc(sizeof(searchpath_t)); + search->path_id = path_id; strcpy (search->filename, pakfile); search->next = com_searchpaths; com_searchpaths = search; @@ -185,6 +195,7 @@ void Host_Game_f (void) if (!pak) break; search = (searchpath_t *) Z_Malloc(sizeof(searchpath_t)); + search->path_id = path_id; search->pack = pak; search->next = com_searchpaths; com_searchpaths = search; @@ -876,7 +887,7 @@ void Host_Changelevel_f (void) //johnfitz -- check for client having map before anything else sprintf (level, "maps/%s.bsp", Cmd_Argv(1)); - if (COM_OpenFile (level, &i) == -1) + if (COM_OpenFile (level, &i, NULL) == -1) Host_Error ("cannot find map %s", level); //johnfitz diff --git a/Quake/image.c b/Quake/image.c index c6e9e556..c9b112de 100644 --- a/Quake/image.c +++ b/Quake/image.c @@ -38,12 +38,12 @@ byte *Image_LoadImage (char *name, int *width, int *height) FILE *f; sprintf (loadfilename, "%s.tga", name); - COM_FOpenFile (loadfilename, &f); + COM_FOpenFile (loadfilename, &f, NULL); if (f) return Image_LoadTGA (f, width, height); sprintf (loadfilename, "%s.pcx", name); - COM_FOpenFile (loadfilename, &f); + COM_FOpenFile (loadfilename, &f, NULL); if (f) return Image_LoadPCX (f, width, height); diff --git a/Quake/pr_edict.c b/Quake/pr_edict.c index 085ab615..03017e09 100644 --- a/Quake/pr_edict.c +++ b/Quake/pr_edict.c @@ -1026,7 +1026,7 @@ void PR_LoadProgs (void) CRC_Init (&pr_crc); - progs = (dprograms_t *)COM_LoadHunkFile ("progs.dat"); + progs = (dprograms_t *)COM_LoadHunkFile ("progs.dat", NULL); if (!progs) Sys_Error ("PR_LoadProgs: couldn't load progs.dat"); Con_DPrintf ("Programs occupy %iK.\n", com_filesize/1024); diff --git a/Quake/r_part.c b/Quake/r_part.c index 0acbe4af..e957fb9c 100644 --- a/Quake/r_part.c +++ b/Quake/r_part.c @@ -270,7 +270,7 @@ void R_ReadPointFile_f (void) sprintf (name,"maps/%s.pts", sv.name); - COM_FOpenFile (name, &f); + COM_FOpenFile (name, &f, NULL); if (!f) { Con_Printf ("couldn't open %s\n", name); diff --git a/Quake/snd_mem.c b/Quake/snd_mem.c index b9cf7bb9..7e11887e 100644 --- a/Quake/snd_mem.c +++ b/Quake/snd_mem.c @@ -113,7 +113,7 @@ sfxcache_t *S_LoadSound (sfx_t *s) // Con_Printf ("loading %s\n",namebuffer); - data = COM_LoadStackFile(namebuffer, stackbuf, sizeof(stackbuf)); + data = COM_LoadStackFile(namebuffer, stackbuf, sizeof(stackbuf), NULL); if (!data) { diff --git a/Quake/wad.c b/Quake/wad.c index fc887f89..fdda2018 100644 --- a/Quake/wad.c +++ b/Quake/wad.c @@ -76,7 +76,7 @@ void W_LoadWadFile (void) //johnfitz -- filename is now hard-coded for honesty //TODO: use cache_alloc if (wad_base) free (wad_base); - wad_base = COM_LoadMallocFile (filename); + wad_base = COM_LoadMallocFile (filename, NULL); if (!wad_base) Sys_Error ("W_LoadWadFile: couldn't load %s", filename);