Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pk3 support + improved filesystem abstraction #337

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Quake/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ OBJS = strlcat.o \
crc.o \
cvar.o \
cfgfile.o \
filesys.o \
host.o \
host_cmd.o \
mathlib.o \
Expand Down
1 change: 1 addition & 0 deletions Quake/Makefile.w32
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ OBJS = strlcat.o \
crc.o \
cvar.o \
cfgfile.o \
filesys.o \
host.o \
host_cmd.o \
mathlib.o \
Expand Down
1 change: 1 addition & 0 deletions Quake/Makefile.w64
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ OBJS = strlcat.o \
crc.o \
cvar.o \
cfgfile.o \
filesys.o \
host.o \
host_cmd.o \
mathlib.o \
Expand Down
2 changes: 1 addition & 1 deletion Quake/bgmusic.c
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ void BGM_PlayCDtrack (byte track, qboolean looping)
// goto _next;
q_snprintf(tmp, sizeof(tmp), "%s/track%02d.%s",
MUSIC_DIRNAME, (int)track, handler->ext);
if (! COM_FileExists(tmp, &path_id))
if (!QFS_FileExists(tmp, &path_id))
goto _next;
if (path_id > prev_id)
{
Expand Down
52 changes: 9 additions & 43 deletions Quake/cfgfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@

#include "quakedef.h"


static fshandle_t *cfg_file;

/*
===================
CFG_ReadCvars
Expand All @@ -35,12 +32,17 @@ the num_vars argument must be the exact number of strings in the
array, otherwise I have nothing against going out of bounds.
===================
*/
void CFG_ReadCvars (const char **vars, int num_vars)
void CFG_ReadCvars (const char *cfg_name, const char **vars, int num_vars)
{
char buff[1024], *tmp;
int i, j;
qfshandle_t *cfg_file;

if (!cfg_file || num_vars < 1)
if (num_vars < 1)
return;

cfg_file = QFS_OpenFile (cfg_name, NULL);
if (!cfg_file)
return;

j = 0;
Expand All @@ -52,7 +54,7 @@ void CFG_ReadCvars (const char **vars, int num_vars)
// writes to the config file. although I'm trying to be as
// much cautious as possible, if the user screws it up by
// editing it, it's his fault.
if (FS_fgets(buff, sizeof(buff), cfg_file))
if (QFS_GetLine (cfg_file, buff, sizeof(buff)))
{
// remove end-of-line characters
while (buff[i])
Expand Down Expand Up @@ -104,9 +106,7 @@ void CFG_ReadCvars (const char **vars, int num_vars)
if (j == num_vars)
break;

} while (!FS_feof(cfg_file) && !FS_ferror(cfg_file));

FS_rewind (cfg_file);
} while (!QFS_Eof (cfg_file));
}

/*
Expand Down Expand Up @@ -139,37 +139,3 @@ void CFG_ReadCvarOverrides (const char **vars, int num_vars)
}
}
}

void CFG_CloseConfig (void)
{
if (cfg_file)
{
FS_fclose(cfg_file);
Z_Free(cfg_file);
cfg_file = NULL;
}
}

int CFG_OpenConfig (const char *cfg_name)
{
FILE *f;
long length;
qboolean pak;

CFG_CloseConfig ();

length = (long) COM_FOpenFile (cfg_name, &f, NULL);
pak = file_from_pak;
if (length == -1)
return -1;

cfg_file = (fshandle_t *) Z_Malloc(sizeof(fshandle_t));
cfg_file->file = f;
cfg_file->start = ftell(f);
cfg_file->pos = 0;
cfg_file->length = length;
cfg_file->pak = pak;

return 0;
}

9 changes: 1 addition & 8 deletions Quake/cfgfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,7 @@
#ifndef __CFGFILE_H
#define __CFGFILE_H

int CFG_OpenConfig (const char *cfg_name);
// opens the given config file. only one open config file is
// kept: previosly opened one, if any, will be closed.

void CFG_CloseConfig (void);
// closes the currently open config file.

void CFG_ReadCvars (const char **vars, int num_vars);
void CFG_ReadCvars (const char *cfg_name, const char **vars, int num_vars);
// reads the values of cvars in the given list from the opened
// config file.

Expand Down
54 changes: 25 additions & 29 deletions Quake/cl_demo.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,12 @@ void CL_StopPlayback (void)
if (!cls.demoplayback)
return;

fclose (cls.demofile);
QFS_CloseFile (cls.inpdemo);
cls.demoplayback = false;
cls.demopaused = false;
cls.demospeed = 1.f;
cls.demofile = NULL;
cls.inpdemo = NULL;
cls.demofilesize = 0;
cls.demofilestart = 0;
cls.demofilename[0] = '\0';
cls.state = ca_disconnected;

Expand All @@ -137,14 +136,14 @@ static void CL_WriteDemoMessage (void)
float f;

len = LittleLong (net_message.cursize);
fwrite (&len, 4, 1, cls.demofile);
fwrite (&len, 4, 1, cls.outpdemo);
for (i = 0; i < 3; i++)
{
f = LittleFloat (cl.viewangles[i]);
fwrite (&f, 4, 1, cls.demofile);
fwrite (&f, 4, 1, cls.outpdemo);
}
fwrite (net_message.data, net_message.cursize, 1, cls.demofile);
fflush (cls.demofile);
fwrite (net_message.data, net_message.cursize, 1, cls.outpdemo);
fflush (cls.outpdemo);
}

/*
Expand Down Expand Up @@ -257,7 +256,7 @@ static qboolean CL_NextDemoFrame (void)
demoframe_t newframe;

memset (&newframe, 0, sizeof (newframe));
newframe.fileofs = Sys_ftell (cls.demofile);
newframe.fileofs = QFS_Tell (cls.inpdemo);
newframe.intermission = cl.intermission;
newframe.forceunderwater = cl.forceunderwater;
VEC_PUSH (demo_rewind.frames, newframe);
Expand All @@ -276,7 +275,7 @@ static qboolean CL_NextDemoFrame (void)
return false;

lastframe = &demo_rewind.frames[framecount - 1];
Sys_fseek (cls.demofile, lastframe->fileofs, SEEK_SET);
QFS_Seek (cls.inpdemo, lastframe->fileofs, SEEK_SET);

if (framecount == 1)
demo_rewind.backstop = true;
Expand Down Expand Up @@ -448,20 +447,20 @@ static int CL_GetDemoMessage (void)
if (!CL_NextDemoFrame ())
return 0;

if (fread (&net_message.cursize, 4, 1, cls.demofile) != 1)
if (QFS_ReadFile (cls.inpdemo, &net_message.cursize, 4) != 4)
goto readerror;
VectorCopy (cl.mviewangles[0], cl.mviewangles[1]);
for (i = 0 ; i < 3 ; i++)
{
if (fread (&f, 4, 1, cls.demofile) != 1)
if (QFS_ReadFile (cls.inpdemo, &f, 4) != 4)
goto readerror;
cl.mviewangles[0][i] = LittleFloat (f);
}

net_message.cursize = LittleLong (net_message.cursize);
if (net_message.cursize > MAX_MSGLEN)
Sys_Error ("Demo message > MAX_MSGLEN");
if (fread (net_message.data, net_message.cursize, 1, cls.demofile) != 1)
if (QFS_ReadFile (cls.inpdemo, net_message.data, net_message.cursize) != (size_t)net_message.cursize)
{
readerror:
CL_StopPlayback ();
Expand Down Expand Up @@ -538,8 +537,8 @@ void CL_Stop_f (void)
CL_WriteDemoMessage ();

// finish up
fclose (cls.demofile);
cls.demofile = NULL;
fclose (cls.outpdemo);
cls.outpdemo = NULL;
cls.demorecording = false;
Con_Printf ("Completed demo\n");

Expand Down Expand Up @@ -629,15 +628,15 @@ void CL_Record_f (void)
Con_LinkPrintf (name, "%s", relname);
Con_SafePrintf (".\n");

cls.demofile = Sys_fopen (name, "wb");
if (!cls.demofile)
cls.outpdemo = Sys_fopen (name, "wb");
if (!cls.outpdemo)
{
Con_Printf ("ERROR: couldn't create %s\n", relname);
return;
}

cls.forcetrack = track;
fprintf (cls.demofile, "%i\n", cls.forcetrack);
fprintf (cls.outpdemo, "%i\n", cls.forcetrack);
q_strlcpy (cls.demofilename, name, sizeof (cls.demofilename));

cls.demorecording = true;
Expand Down Expand Up @@ -760,6 +759,7 @@ play [demoname]
void CL_PlayDemo_f (void)
{
char name[MAX_OSPATH];
char linebuf[32];

if (cmd_source != src_command)
return;
Expand All @@ -779,22 +779,19 @@ void CL_PlayDemo_f (void)

Con_Printf ("Playing demo from %s.\n", name);

COM_FOpenFile (name, &cls.demofile, NULL);
if (!cls.demofile)
cls.inpdemo = QFS_FOpenFile (name, NULL);
if (!cls.inpdemo)
{
Con_Printf ("ERROR: couldn't open %s\n", name);
cls.demonum = -1; // stop demo loop
return;
}

// ZOID, fscanf is evil
// O.S.: if a space character e.g. 0x20 (' ') follows '\n',
// fscanf skips that byte too and screws up further reads.
// fscanf (cls.demofile, "%i\n", &cls.forcetrack);
if (fscanf (cls.demofile, "%i", &cls.forcetrack) != 1 || fgetc (cls.demofile) != '\n')
if (QFS_GetLine (cls.inpdemo, linebuf, sizeof(linebuf)) == 0
|| sscanf (linebuf, "%i", &cls.forcetrack) != 1)
{
fclose (cls.demofile);
cls.demofile = NULL;
QFS_CloseFile (cls.inpdemo);
cls.inpdemo = NULL;
cls.demonum = -1; // stop demo loop
Con_Printf ("ERROR: demo \"%s\" is invalid\n", name);
return;
Expand All @@ -810,8 +807,7 @@ void CL_PlayDemo_f (void)
q_strlcpy (cls.demofilename, name, sizeof (cls.demofilename));
cls.state = ca_connected;
cls.demoloop = Cmd_Argc () >= 3 ? Q_atoi (Cmd_Argv (2)) != 0 : false;
cls.demofilestart = Sys_ftell (cls.demofile);
cls.demofilesize = com_filesize;
cls.demofilesize = QFS_FileSize (cls.inpdemo);

// if this is a player-initiated demo, get rid of the console
if (cls.demonum == -1 && key_dest == key_console)
Expand Down Expand Up @@ -858,7 +854,7 @@ void CL_TimeDemo_f (void)
}

CL_PlayDemo_f ();
if (!cls.demofile)
if (!cls.inpdemo)
return;

// cls.td_starttime will be grabbed at the second frame of the demo, so
Expand Down
4 changes: 2 additions & 2 deletions Quake/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,8 @@ typedef struct
qboolean timedemo;
int forcetrack; // -1 = use normal cd track
char demofilename[MAX_OSPATH];
FILE *demofile;
qfileofs_t demofilestart; // for demos in pak files
qfshandle_t *inpdemo;
FILE *outpdemo;
qfileofs_t demofilesize;
int td_lastframe; // to meter out one message a frame
int td_startframe; // host_framecount at start
Expand Down
4 changes: 2 additions & 2 deletions Quake/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,15 +303,15 @@ void Cmd_Exec_f (void)
// "exec config.cfg pls" will execute config.cfg
if (Cmd_Argc () == 2 && !strcmp (path, "config.cfg"))
{
f = (const char *)COM_LoadHunkFile (CONFIG_NAME, NULL);
f = (const char *)QFS_LoadHunkFile (CONFIG_NAME, NULL, NULL);
if (f)
{
path = CONFIG_NAME;
goto exec;
}
}

f = (const char *)COM_LoadHunkFile (path, NULL);
f = (const char *)QFS_LoadHunkFile (path, NULL, NULL);
if (!f && !strcmp(Cmd_Argv(1), "default.cfg")) {
f = default_cfg; /* see above.. */
}
Expand Down
Loading