QFILES.C 4.5 KB

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