home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 December / PCWKCD1296.iso / sharewar / quake106 / utils / qfiles / qfiles.c next >
C/C++ Source or Header  |  1996-09-12  |  5KB  |  252 lines

  1.  
  2. #include "cmdlib.h"
  3.  
  4. #define    MAX_SOUNDS        1024
  5. #define    MAX_MODELS        1024
  6. #define    MAX_FILES        1024
  7.  
  8. #define    MAX_DATA_PATH    64
  9.  
  10.  
  11. char        precache_sounds[MAX_SOUNDS][MAX_DATA_PATH];
  12. int            precache_sounds_block[MAX_SOUNDS];
  13. int            numsounds;
  14.  
  15. char        precache_models[MAX_MODELS][MAX_DATA_PATH];
  16. int            precache_models_block[MAX_SOUNDS];
  17. int            nummodels;
  18.  
  19. char        precache_files[MAX_FILES][MAX_DATA_PATH];
  20. int            precache_files_block[MAX_SOUNDS];
  21. int            numfiles;
  22.  
  23.  
  24. typedef struct
  25. {
  26.     char    name[56];
  27.     int        filepos, filelen;
  28. } packfile_t;
  29.  
  30. typedef struct
  31. {
  32.     char    id[4];
  33.     int        dirofs;
  34.     int        dirlen;
  35. } packheader_t;
  36.  
  37. packfile_t    pfiles[4096], *pf;
  38. FILE        *packhandle;
  39. int            packbytes;
  40.  
  41.  
  42. /*
  43. ===========
  44. PackFile
  45.  
  46. Copy a file into the pak file
  47. ===========
  48. */
  49. void PackFile (char *src, char *name)
  50. {
  51.     FILE    *in;
  52.     int        remaining, count;
  53.     char    buf[4096];
  54.     
  55.     if ( (byte *)pf - (byte *)pfiles > sizeof(pfiles) )
  56.         Error ("Too many files in pak file");
  57.     
  58.     in = SafeOpenRead (src);
  59.     remaining = filelength (in);
  60.  
  61.     pf->filepos = LittleLong (ftell (packhandle));
  62.     pf->filelen = LittleLong (remaining);
  63.     strcpy (pf->name, name);
  64.     printf ("%64s : %7i\n", pf->name, remaining);
  65.  
  66.     packbytes += remaining;
  67.     
  68.     while (remaining)
  69.     {
  70.         if (remaining < sizeof(buf))
  71.             count = remaining;
  72.         else
  73.             count = sizeof(buf);
  74.         SafeRead (in, buf, count);
  75.         SafeWrite (packhandle, buf, count);
  76.         remaining -= count;
  77.     }
  78.  
  79.     fclose (in);
  80.     pf++;
  81. }
  82.  
  83.  
  84. /*
  85. ===========
  86. CopyQFiles
  87. ===========
  88. */
  89. void CopyQFiles (int blocknum)
  90. {
  91.     int        i, p;
  92.     char    srcfile[1024];
  93.     char    destfile[1024];
  94.     char    name[1024];
  95.     packheader_t    header;
  96.     int        dirlen;
  97.     unsigned short        crc;
  98.  
  99.     // create a pak file
  100.     pf = pfiles;
  101.  
  102.     sprintf (destfile, "%spak%i.pak", gamedir, blocknum);
  103.     packhandle = SafeOpenWrite (destfile);
  104.     SafeWrite (packhandle, &header, sizeof(header));    
  105.     
  106.     blocknum++;
  107.  
  108.     for (i=0 ; i<numsounds ; i++)
  109.     {
  110.         if (precache_sounds_block[i] != blocknum)
  111.             continue;
  112.         sprintf (name, "sound/%s", precache_sounds[i]);
  113.         sprintf (srcfile,"%s%s",gamedir, name);
  114.         PackFile (srcfile, name);
  115.     }
  116.     for (i=0 ; i<nummodels ; i++)
  117.     {
  118.         if (precache_models_block[i] != blocknum)
  119.             continue;
  120.         sprintf (srcfile,"%s%s",gamedir, precache_models[i]);
  121.         PackFile (srcfile, precache_models[i]);
  122.     }
  123.     for (i=0 ; i<numfiles ; i++)
  124.     {
  125.         if (precache_files_block[i] != blocknum)
  126.             continue;
  127.         sprintf (srcfile,"%s%s",gamedir, precache_files[i]);
  128.         PackFile (srcfile, precache_files[i]);
  129.     }
  130.     
  131.     header.id[0] = 'P';
  132.     header.id[1] = 'A';
  133.     header.id[2] = 'C';
  134.     header.id[3] = 'K';
  135.     dirlen = (byte *)pf - (byte *)pfiles;
  136.     header.dirofs = LittleLong(ftell (packhandle));
  137.     header.dirlen = LittleLong(dirlen);
  138.     
  139.     SafeWrite (packhandle, pfiles, dirlen);
  140.  
  141.     fseek (packhandle, 0, SEEK_SET);
  142.     SafeWrite (packhandle, &header, sizeof(header));
  143.     fclose (packhandle);    
  144.  
  145. // do a crc of the file
  146.     CRC_Init (&crc);
  147.     for (i=0 ; i<dirlen ; i++)
  148.         CRC_ProcessByte (&crc, ((byte *)pfiles)[i]);
  149.  
  150.     i = pf - pfiles;
  151.     printf ("%i files packed in %i bytes (%i crc)\n",i, packbytes, crc);
  152. }
  153.  
  154.  
  155. /*
  156. =================
  157. BspModels
  158.  
  159. Runs qbsp and light on all of the models with a .bsp extension
  160. =================
  161. */
  162. void BspModels (void)
  163. {
  164.     int        p;
  165.     int        i;
  166.     char    *m;
  167.     char    cmd[1024];
  168.     char    name[256];
  169.  
  170.     for (i=0 ; i<nummodels ; i++)
  171.     {
  172.         m = precache_models[i];
  173.         if (strcmp(m+strlen(m)-4, ".bsp"))
  174.             continue;
  175.         strcpy (name, m);
  176.         name[strlen(m)-4] = 0;
  177.  
  178.         sprintf (cmd, "qbsp %s%s",gamedir, name);
  179.         system (cmd);
  180.         sprintf (cmd, "light -extra %s%s", gamedir, name);
  181.         system (cmd);
  182.     }
  183. }
  184.  
  185. /*
  186. =============
  187. ReadFiles
  188. =============
  189. */
  190. int ReadFiles (void)
  191. {
  192.     FILE    *f;
  193.     int        i;
  194.  
  195.     f = SafeOpenRead ("files.dat");
  196.  
  197.     fscanf (f, "%i\n", &numsounds);
  198.     for (i=0 ; i<numsounds ; i++)
  199.         fscanf (f, "%i %s\n", &precache_sounds_block[i],
  200.             precache_sounds[i]);
  201.  
  202.     fscanf (f, "%i\n", &nummodels);
  203.     for (i=0 ; i<nummodels ; i++)
  204.         fscanf (f, "%i %s\n", &precache_models_block[i],
  205.             precache_models[i]);
  206.  
  207.     fscanf (f, "%i\n", &numfiles);
  208.     for (i=0 ; i<numfiles ; i++)
  209.         fscanf (f, "%i %s\n", &precache_files_block[i],
  210.             precache_files[i]);
  211.  
  212.     fclose (f);
  213.  
  214.     printf ("%3i sounds\n", numsounds);
  215.     printf ("%3i models\n", nummodels);
  216.     printf ("%3i files\n", numfiles);
  217. }
  218.  
  219.  
  220. /*
  221. =============
  222. main
  223. =============
  224. */
  225. int main (int argc, char **argv)
  226. {
  227.     if (argc == 1)
  228.     {
  229.         printf ("qfiles -pak <0 / 1> : build a .pak file\n");
  230.         printf ("qfiles -bspmodels : regenerates all brush models\n");
  231.         exit (1);
  232.     }
  233.  
  234.     SetQdirFromPath ("");
  235.  
  236.     ReadFiles ();
  237.  
  238.     if (!strcmp (argv[1], "-pak"))
  239.     {
  240.         CopyQFiles (atoi(argv[2]));
  241.     }
  242.     else if (!strcmp (argv[1], "-bspmodels"))
  243.     {
  244.         BspModels ();
  245.     }
  246.     else
  247.         Error ("unknown command: %s", argv[1]);
  248.  
  249.     return 0;
  250. }
  251.  
  252.