New cvar fs_basepath replaces -basedir param. It's a CVAR_ROM so you can

only set it from the cmdline (you now CAN set it from the cmdline BTW!),
it defaults to the current directory if you don't.

New cvar fs_sharepath.  Defaults to fs_basepath->string and is changed in
the same manner.  If you do change it, files in gamedirs under it will be
used first with basepath's files overriding them.

This allows you to keep your paks in a read-only location (cdrom or unix
/usr/share) and still be able to override those files and save configs.
This commit is contained in:
Joseph Carter 2000-04-18 09:24:29 +00:00
parent 80c33d051f
commit 3a8f38c217
4 changed files with 136 additions and 135 deletions

6
NEWS
View file

@ -48,7 +48,7 @@ QuakeForge 0.1.0
least-surprise principle. Set it to 0 if you want a qw-client like
HUD.
22 Jan 2000 - changes to command line option -game
22 Jan 2000 - changes to command line option -game [REMOVED!]
You may now specify multiple game directories with -game. If for
example you wanted to use the original registered game with MegaTF
on a new style binary you would use -game id1,megatf. It does work
@ -58,6 +58,10 @@ QuakeForge 0.1.0
One caveat: Most mods were designed to be the only one in use, it
may be a Bad Thing to mix certain mods with other mods.
NOTE: This feature has been removed because it can seriously cause
confusion to a game mod. The proper way to override part of
a game is to use different fs_basepath and fs_sharepath.
19 Jan 2000 - changes to cvar r_fog
Fog color is once again white. The r_fog cvar is now a control for
the fog density rather than a simple toggle control. Eric Windisch

View file

@ -581,9 +581,10 @@ Draw_Crosshair(void)
glTexEnvf ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
} else if (crosshair->value)
Draw_Character (scr_vrect.x + scr_vrect.width/2-4 + cl_crossx->value,
scr_vrect.y + scr_vrect.height/2-4 + cl_crossy->value,
'+');
Draw_Character (scr_vrect.x + scr_vrect.width/2-4
+ cl_crossx->value, scr_vrect.y
+ scr_vrect.height/2-4 + cl_crossy->value,
'+');
}

View file

@ -521,6 +521,8 @@ Host_InitDisplay ()
{
}
extern cvar_t *fs_basepath;
/*
Host_Init
@ -531,7 +533,8 @@ Host_Init (quakeparms_t *parms)
{
COM_InitArgv (parms->argc, parms->argv);
#ifdef QUAKEWORLD
#if 0
//#ifdef QUAKEWORLD
COM_AddParm ("-game");
COM_AddParm ("qw");
Sys_mkdir("qw");
@ -546,12 +549,17 @@ Host_Init (quakeparms_t *parms)
Sys_Error ("Only %4.1fMB of memory reported, can't execute game", parms->memsize / (float) 0x100000);
Memory_Init (parms->membase, parms->memsize);
CL_InitCvars();
SCR_InitCvars();
VID_InitCvars ();
Cbuf_Init ();
Cmd_Init ();
Cvar_Init ();
CL_InitCvars ();
SCR_InitCvars ();
VID_InitCvars ();
// FIXME: stuff only +set here, shouldn't stuff all commands --KB
Cmd_StuffCmds_f ();
Cbuf_Execute ();
V_Init ();
Chase_Init ();

View file

@ -74,6 +74,9 @@ QUAKE FILESYSTEM
char gamedirfile[MAX_OSPATH];
cvar_t *fs_basepath;
cvar_t *fs_sharepath;
#ifdef GENERATIONS
#include <unzip.h>
typedef unsigned char byte_t;
@ -123,7 +126,6 @@ typedef struct
#define MAX_FILES_IN_PACK 2048
char com_gamedir[MAX_OSPATH];
char com_basedir[MAX_OSPATH];
typedef struct searchpath_s
{
@ -136,11 +138,10 @@ searchpath_t *com_searchpaths;
searchpath_t *com_base_searchpaths; // without gamedirs
/*
================
COM_filelength
================
COM_filelength
*/
int COM_filelength (QFile *f)
int
COM_filelength (QFile *f)
{
int pos;
int end;
@ -153,7 +154,11 @@ int COM_filelength (QFile *f)
return end;
}
int COM_FileOpenRead (char *path, QFile **hndl)
/*
COM_FileOpenRead
*/
int
COM_FileOpenRead (char *path, QFile **hndl)
{
QFile *f;
@ -169,12 +174,10 @@ int COM_FileOpenRead (char *path, QFile **hndl)
}
/*
============
COM_Path_f
============
COM_Path_f
*/
void COM_Path_f (void)
void
COM_Path_f (void)
{
searchpath_t *s;
@ -277,14 +280,14 @@ COM_CreatePath ( char *path )
/*
===========
COM_CopyFile
COM_CopyFile
Copies a file over from the net to the local cache, creating any directories
needed. This is for the convenience of developers using ISDN from home.
===========
Copies a file over from the net to the local cache, creating any
directories needed. This is for the convenience of developers using
ISDN from home.
*/
void COM_CopyFile (char *netpath, char *cachepath)
void
COM_CopyFile (char *netpath, char *cachepath)
{
QFile *in, *out;
int remaining, count;
@ -311,8 +314,11 @@ void COM_CopyFile (char *netpath, char *cachepath)
Qclose (out);
}
QFile *COM_OpenRead(const char *path, int offs, int len)
/*
COM_OpenRead
*/
QFile *
COM_OpenRead (const char *path, int offs, int len)
{
int fd=open(path,O_RDONLY);
unsigned char id[2];
@ -342,17 +348,16 @@ QFile *COM_OpenRead(const char *path, int offs, int len)
return 0;
}
/*
===========
COM_FOpenFile
Finds the file in the search path.
Sets com_filesize and one of handle or file
===========
*/
int file_from_pak; // global indicating file came from pack file ZOID
int COM_FOpenFile (char *filename, QFile **gzfile)
/*
COM_FOpenFile
Finds the file in the search path.
Sets com_filesize and one of handle or file
*/
int
COM_FOpenFile (char *filename, QFile **gzfile)
{
searchpath_t *search;
char netpath[MAX_OSPATH];
@ -418,8 +423,6 @@ int COM_FOpenFile (char *filename, QFile **gzfile)
if(developer->value)
Sys_Printf ("FindFile: %s\n",netpath);
//*file = fopen (netpath, "rb");
//return COM_filelength (*file);
*gzfile=COM_OpenRead(netpath,-1,-1);
return com_filesize;
}
@ -433,18 +436,18 @@ int COM_FOpenFile (char *filename, QFile **gzfile)
return -1;
}
/*
============
COM_LoadFile
Filename are relative to the quake directory.
Allways appends a 0 byte to the loaded data.
============
*/
cache_user_t *loadcache;
byte *loadbuf;
int loadsize;
byte *COM_LoadFile (char *path, int usehunk)
/*
COM_LoadFile
Filename are relative to the quake directory.
Allways appends a 0 byte to the loaded data.
*/
byte *
COM_LoadFile (char *path, int usehunk)
{
QFile *h;
byte *buf;
@ -495,24 +498,28 @@ byte *COM_LoadFile (char *path, int usehunk)
return buf;
}
byte *COM_LoadHunkFile (char *path)
byte *
COM_LoadHunkFile (char *path)
{
return COM_LoadFile (path, 1);
}
byte *COM_LoadTempFile (char *path)
byte *
COM_LoadTempFile (char *path)
{
return COM_LoadFile (path, 2);
}
void COM_LoadCacheFile (char *path, struct cache_user_s *cu)
void
COM_LoadCacheFile (char *path, struct cache_user_s *cu)
{
loadcache = cu;
COM_LoadFile (path, 3);
}
// uses temp hunk if larger than bufsize
byte *COM_LoadStackFile (char *path, void *buffer, int bufsize)
byte *
COM_LoadStackFile (char *path, void *buffer, int bufsize)
{
byte *buf;
@ -524,16 +531,15 @@ byte *COM_LoadStackFile (char *path, void *buffer, int bufsize)
}
/*
=================
COM_LoadPackFile
COM_LoadPackFile
Takes an explicit (not game tree related) path to a pak file.
Takes an explicit (not game tree related) path to a pak file.
Loads the header and directory, adding the files at the beginning
of the list so they override previous pack files.
=================
Loads the header and directory, adding the files at the beginning
of the list so they override previous pack files.
*/
pack_t *COM_LoadPackFile (char *packfile)
pack_t *
COM_LoadPackFile (char *packfile)
{
dpackheader_t header;
int i;
@ -652,7 +658,8 @@ COM_pakzip_readfile(unzFile *pak, const char *path, uint_t bufsize, byte_t *buf)
}
pack_t *COM_LoadPackZipFile (char *packfile)
pack_t *
COM_LoadPackZipFile (char *packfile)
{
int i=0;
packfile_t *newfiles;
@ -723,6 +730,8 @@ COM_LoadGameDirectory(char *dir)
char **pakfiles = NULL;
int i = 0, bufsize = 0, count = 0;
Con_DPrintf ("COM_LoadGameDirectory (\"%s\")\n", dir);
pakfiles = malloc(FBLOCK_SIZE * sizeof(char *));
bufsize += FBLOCK_SIZE;
if (!pakfiles)
@ -798,14 +807,13 @@ COM_LoadGameDirectory_free:
}
/*
================
COM_AddGameDirectory
COM_AddDirectory
Sets com_gamedir, adds the directory to the head of the path,
then loads and adds pak1.pak pak2.pak ...
================
Sets com_gamedir, adds the directory to the head of the path,
then loads and adds pak1.pak pak2.pak ...
*/
void COM_AddGameDirectory (char *dir)
void
COM_AddDirectory (char *dir)
{
searchpath_t *search;
char *p;
@ -815,7 +823,6 @@ void COM_AddGameDirectory (char *dir)
else
strcpy(gamedirfile, dir);
strcpy (com_gamedir, dir);
Con_Printf ("com_gamedir changed to %s\n", com_gamedir);
//
// add the directory to the search path
@ -829,19 +836,37 @@ void COM_AddGameDirectory (char *dir)
// add any pak files in the format pak0.pak pak1.pak, ...
//
COM_LoadGameDirectory(dir);
COM_LoadGameDirectory (dir);
}
/*
================
COM_Gamedir
COM_AddGameDirectory
Sets the gamedir and path to a different directory.
================
FIXME: this is a wrapper for COM_AddDirectory (which used to be
this function) to have it load share and base paths. Whenver
someone goes through to clean up the fs code, this function should
merge with COM_AddGameDirectory.
*/
void COM_Gamedir (char *dir)
void
COM_AddGameDirectory (char *dir)
{
searchpath_t *search, *next;
Con_DPrintf ("COM_AddGameDirectory (\"%s/%s\"\n",
fs_sharepath->string, dir);
if (strcmp (fs_sharepath->string, fs_basepath->string) != 0)
COM_AddDirectory (va("%s/%s", fs_sharepath->string, dir));
COM_AddDirectory (va("%s/%s", fs_basepath->string, dir));
}
/*
COM_Gamedir
Sets the gamedir and path to a different directory.
*/
void
COM_Gamedir (char *dir)
{
searchpath_t *next;
if (strstr(dir, "..") || strstr(dir, "/")
|| strstr(dir, "\\") || strstr(dir, ":") )
@ -850,7 +875,7 @@ void COM_Gamedir (char *dir)
return;
}
if (!strcmp(gamedirfile, dir))
if (strcmp (gamedirfile, dir) == 0)
return; // still the same
strcpy (gamedirfile, dir);
@ -875,85 +900,48 @@ void COM_Gamedir (char *dir)
//
Cache_Flush ();
if (strcmp (dir, GAMENAME) == 0)
return;
#ifdef QUAKEWORLD
if (!strcmp(dir, GAMENAME) || !strcmp(dir, "qw"))
if (strcmp (dir, "qw") == 0)
return;
#endif
snprintf(com_gamedir, sizeof(com_gamedir), "%s/%s", com_basedir, dir);
//
// add the directory to the search path
//
#if 1
//search = Hunk_Alloc (sizeof(searchpath_t));
search = Z_Malloc (sizeof(searchpath_t));
strcpy (search->filename, dir);
search->next = com_searchpaths;
com_searchpaths = search;
#else
search = Z_Malloc (sizeof(searchpath_t));
strcpy (search->filename, com_gamedir);
search->next = com_searchpaths;
com_searchpaths = search;
#endif
//
// add any pak files in the format pak0.pak pak1.pak, ...
//
COM_LoadGameDirectory(dir);
COM_AddGameDirectory (dir);
}
/*
================
COM_InitFilesystem
================
COM_InitFilesystem
*/
void
COM_InitFilesystem ( void )
{
int i, len;
char *p;
char *games;
/*
-basedir <path>
Overrides the system supplied base directory
*/
i = COM_CheckParm ("-basedir");
if (i && i < com_argc-1)
strcpy (com_basedir, com_argv[i+1]);
else
strcpy (com_basedir, host_parms.basedir);
#ifdef UQUAKE
int i;
#endif
fs_basepath = Cvar_Get ("fs_basepath", ".", CVAR_ROM,
"the location of your game directories");
fs_sharepath = Cvar_Get ("fs_sharepath", fs_basepath->string,
CVAR_ROM, "read-only game directories");
/*
start up with GAMENAME by default
*/
COM_AddGameDirectory (va("%s/" GAMENAME, com_basedir) );
COM_AddGameDirectory (GAMENAME);
if (hipnotic)
COM_AddGameDirectory ("hipnotic");
if (rogue)
COM_AddGameDirectory ("rogue");
#ifdef QUAKEWORLD
COM_AddGameDirectory (va("%s/qw", com_basedir) );
#endif // QUAKEWORLD
if ( hipnotic ) {
COM_AddGameDirectory (va("%s/hipnotic", com_basedir) );
}
if ( rogue ) {
COM_AddGameDirectory (va("%s/rogue", com_basedir) );
}
COM_AddGameDirectory ("qw");
#elif UQUAKE
i = COM_CheckParm ("-game");
if (i && i < com_argc-1) {
len = strlen(com_argv[i+1]) + 1;
games = (char *) malloc(len);
strcpy(games, com_argv[i+1]);
for ( p = strtok(games, ",") ; p != NULL; p = strtok(NULL, ",")) {
COM_AddGameDirectory (va("%s/%s", com_basedir, p));
}
free(games);
}
if (i && i < com_argc-1)
COM_AddGameDirectory (com_argv[i+1]);
#endif
// any set gamedirs will be freed up to here
com_base_searchpaths = com_searchpaths;
}