123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- #include "cmdlib.h"
- #define MAX_SOUNDS 1024
- #define MAX_MODELS 1024
- #define MAX_FILES 1024
- #define MAX_DATA_PATH 64
- char precache_sounds[MAX_SOUNDS][MAX_DATA_PATH];
- int precache_sounds_block[MAX_SOUNDS];
- int numsounds;
- char precache_models[MAX_MODELS][MAX_DATA_PATH];
- int precache_models_block[MAX_SOUNDS];
- int nummodels;
- char precache_files[MAX_FILES][MAX_DATA_PATH];
- int precache_files_block[MAX_SOUNDS];
- int numfiles;
- typedef struct
- {
- char name[56];
- int filepos, filelen;
- } packfile_t;
- typedef struct
- {
- char id[4];
- int dirofs;
- int dirlen;
- } packheader_t;
- packfile_t pfiles[4096], *pf;
- FILE *packhandle;
- int packbytes;
- /*
- ===========
- PackFile
- Copy a file into the pak file
- ===========
- */
- void PackFile (char *src, char *name)
- {
- FILE *in;
- int remaining, count;
- char buf[4096];
-
- if ( (byte *)pf - (byte *)pfiles > sizeof(pfiles) )
- Error ("Too many files in pak file");
-
- in = SafeOpenRead (src);
- remaining = filelength (in);
- pf->filepos = LittleLong (ftell (packhandle));
- pf->filelen = LittleLong (remaining);
- strcpy (pf->name, name);
- printf ("%64s : %7i\n", pf->name, remaining);
- packbytes += remaining;
-
- while (remaining)
- {
- if (remaining < sizeof(buf))
- count = remaining;
- else
- count = sizeof(buf);
- SafeRead (in, buf, count);
- SafeWrite (packhandle, buf, count);
- remaining -= count;
- }
- fclose (in);
- pf++;
- }
- /*
- ===========
- CopyQFiles
- ===========
- */
- void CopyQFiles (int blocknum)
- {
- int i, p;
- char srcfile[1024];
- char destfile[1024];
- char name[1024];
- packheader_t header;
- int dirlen;
- unsigned short crc;
- // create a pak file
- pf = pfiles;
- sprintf (destfile, "%spak%i.pak", gamedir, blocknum);
- packhandle = SafeOpenWrite (destfile);
- SafeWrite (packhandle, &header, sizeof(header));
-
- blocknum++;
- for (i=0 ; i<numsounds ; i++)
- {
- if (precache_sounds_block[i] != blocknum)
- continue;
- sprintf (name, "sound/%s", precache_sounds[i]);
- sprintf (srcfile,"%s%s",gamedir, name);
- PackFile (srcfile, name);
- }
- for (i=0 ; i<nummodels ; i++)
- {
- if (precache_models_block[i] != blocknum)
- continue;
- sprintf (srcfile,"%s%s",gamedir, precache_models[i]);
- PackFile (srcfile, precache_models[i]);
- }
- for (i=0 ; i<numfiles ; i++)
- {
- if (precache_files_block[i] != blocknum)
- continue;
- sprintf (srcfile,"%s%s",gamedir, precache_files[i]);
- PackFile (srcfile, precache_files[i]);
- }
-
- header.id[0] = 'P';
- header.id[1] = 'A';
- header.id[2] = 'C';
- header.id[3] = 'K';
- dirlen = (byte *)pf - (byte *)pfiles;
- header.dirofs = LittleLong(ftell (packhandle));
- header.dirlen = LittleLong(dirlen);
-
- SafeWrite (packhandle, pfiles, dirlen);
- fseek (packhandle, 0, SEEK_SET);
- SafeWrite (packhandle, &header, sizeof(header));
- fclose (packhandle);
- // do a crc of the file
- CRC_Init (&crc);
- for (i=0 ; i<dirlen ; i++)
- CRC_ProcessByte (&crc, ((byte *)pfiles)[i]);
- i = pf - pfiles;
- printf ("%i files packed in %i bytes (%i crc)\n",i, packbytes, crc);
- }
- /*
- =================
- BspModels
- Runs qbsp and light on all of the models with a .bsp extension
- =================
- */
- void BspModels (void)
- {
- int p;
- int i;
- char *m;
- char cmd[1024];
- char name[256];
- for (i=0 ; i<nummodels ; i++)
- {
- m = precache_models[i];
- if (strcmp(m+strlen(m)-4, ".bsp"))
- continue;
- strcpy (name, m);
- name[strlen(m)-4] = 0;
- sprintf (cmd, "qbsp %s%s",gamedir, name);
- system (cmd);
- sprintf (cmd, "light -extra %s%s", gamedir, name);
- system (cmd);
- }
- }
- /*
- =============
- ReadFiles
- =============
- */
- int ReadFiles (void)
- {
- FILE *f;
- int i;
- f = SafeOpenRead ("files.dat");
- fscanf (f, "%i\n", &numsounds);
- for (i=0 ; i<numsounds ; i++)
- fscanf (f, "%i %s\n", &precache_sounds_block[i],
- precache_sounds[i]);
- fscanf (f, "%i\n", &nummodels);
- for (i=0 ; i<nummodels ; i++)
- fscanf (f, "%i %s\n", &precache_models_block[i],
- precache_models[i]);
- fscanf (f, "%i\n", &numfiles);
- for (i=0 ; i<numfiles ; i++)
- fscanf (f, "%i %s\n", &precache_files_block[i],
- precache_files[i]);
- fclose (f);
- printf ("%3i sounds\n", numsounds);
- printf ("%3i models\n", nummodels);
- printf ("%3i files\n", numfiles);
- }
- /*
- =============
- main
- =============
- */
- int main (int argc, char **argv)
- {
- if (argc == 1)
- {
- printf ("qfiles -pak <0 / 1> : build a .pak file\n");
- printf ("qfiles -bspmodels : regenerates all brush models\n");
- exit (1);
- }
- SetQdirFromPath ("");
- ReadFiles ();
- if (!strcmp (argv[1], "-pak"))
- {
- CopyQFiles (atoi(argv[2]));
- }
- else if (!strcmp (argv[1], "-bspmodels"))
- {
- BspModels ();
- }
- else
- Error ("unknown command: %s", argv[1]);
- return 0;
- }
|