home *** CD-ROM | disk | FTP | other *** search
/ FMI Superhry 1 / Superhry-I.bin / bonus / doom / programs / dmwbsp / source / idbsp.c < prev    next >
C/C++ Source or Header  |  1994-06-04  |  6KB  |  301 lines

  1. /*
  2.     IDBSP.C - version 1.0 (06/03/94)
  3.     (c) 1994 Ron Rossbach (ej070@cleveland.freenet.edu)
  4.  
  5.     This program is a mostly direct port of id's BSP compiler to MS-DOS.  In the
  6.     words of John Carmack - "This code was written and evolved ... so it's
  7.     probably not the cleanest thing in the world."  Program was compiled with
  8.     DJGPP v1.11 (that's "DJ's port of GCC" version 1.11, which means GCC v2.5.7)
  9.  
  10.     Inquiries, comments, etc. are always welcome at the above address.
  11.  
  12.     Use and distribution of this code permitted according to the terms of the
  13.     GNU General Public License.  Please give credit where credit is due (namely
  14.     to id for releasing the code in the first place!)
  15.  
  16.     Please do not use this code to develop modified levels for the shareware
  17.     version of DOOM.
  18. */
  19.  
  20. #include "idbsp.h"
  21.  
  22. WADFILE    wad_i;
  23.  
  24. void BSPMain(FILE *pDWD,boolean overwrite);
  25.  
  26. int main(int argc, char **argv)
  27. {
  28.     char szDWDName[81], szWADName[81];
  29.     FILE *pDWD;
  30.     boolean overwrite;
  31.  
  32.     printf("** IDBSP - id's node builder for DOOM, version 1.0 **"
  33.     "\nDOS port (c) 1994 Ron Rossbach (ej070@cleveland.freenet.edu)"
  34.     "\n\nDOOM is a registered trademark of id Software, Inc."
  35.     "\n\nid will not provide technical support for this program."
  36.     "\n\nSee the accompanying README for terms of use, distribution, etc.");
  37.  
  38.     if (argc < 2 || argc > 3)
  39.         {
  40.         printf("\n\nUsage: \"idbsp dwdfile [wadfile]\""
  41.         "\nDefault is TMP.WAD if wadfile not specified");
  42.         Error("\nExiting....");
  43.         }
  44.  
  45.     strcpy(szDWDName, argv[1]);
  46.  
  47.     if (argc == 3)
  48.         strcpy(szWADName, argv[2]);
  49.     else
  50.         strcpy(szWADName,"tmp.wad");
  51.  
  52.     printf("\nDWD File: %s\nWAD File: %s\n", szDWDName, szWADName);
  53.  
  54.     if ((pDWD = fopen(szDWDName, "r")) == NULL)
  55.     {
  56.         printf("\nCannot open DWD file");
  57.         return 0;
  58.     }
  59.  
  60.     if ((wad_i.handle = fopen(szWADName, "rb+")) == NULL)
  61.         {
  62.         wad_i.handle = fopen(szWADName, "wb");
  63.         if (wad_i.handle == NULL)
  64.             Error("\nCannot open WAD file %s",szWADName);
  65.         overwrite = true;
  66.         }
  67.     else
  68.         {
  69.         printf("\n\nWAD file %s already exists.  Overwrite? (y/n): ", szWADName);
  70.         if (toupper(getchar()) == 'Y')
  71.             {
  72.             overwrite = true;
  73.             fclose(wad_i.handle);
  74.             wad_i.handle = fopen(szWADName, "wb");
  75.             }
  76.         else
  77.             overwrite = false;
  78.         }
  79.  
  80.     wad_i.pathname = (char *)SafeMalloc(strlen(szWADName) + 1);
  81.  
  82.     if (wad_i.pathname == NULL)
  83.     {
  84.         printf("\nERROR: wad_i.pathname: malloc");
  85.         fclose(pDWD);
  86.         fclose(wad_i.handle);
  87.         return 0;
  88.     }
  89.  
  90.     strcpy(wad_i.pathname, szWADName);
  91.  
  92.     BSPMain(pDWD, overwrite);
  93.  
  94.     fclose(pDWD);
  95.     fclose(wad_i.handle);
  96.  
  97.     return 0;
  98. }
  99.  
  100.  
  101. void BSPMain(FILE *pDWD, boolean overwrite)
  102. {
  103.     int version, episode, level;
  104.     long size;
  105.     char tmp[81],tmpname[81],dirname[9];
  106.  
  107.     printf("\noverwrite = %d\n",overwrite);
  108.     if (overwrite)
  109.         initNew();
  110.     else
  111.         initFromFile();
  112.  
  113.     if (!fscanf (pDWD, "WorldServer version %d\n", &version) || version != 4)
  114.         Error ("LoadDoomMap: not a version 4 doom map");
  115.  
  116.     printf ( "Loading version 4 doom map\n");
  117.  
  118.     while (fgets(tmp, 81, pDWD) != NULL)
  119.         {
  120.         if (sscanf(tmp,"level:E%dM%d",&episode,&level) == 2)
  121.             {
  122.                     /* Handle Map Level */
  123.             sprintf(tmp,"E%dM%d",episode,level);
  124.             printf("\nBuilding Map Level %s",tmp);
  125.             addName(tmp,0,0);
  126.             printf("\nLoading DWD file.....");
  127.             LoadDoomMap(pDWD);
  128.             printf("\nBuilding BSP....");
  129.             DrawMap();
  130.             BuildBSP();
  131.             printf("\nSaving WAD file.....");
  132.             SaveDoomMap();
  133.             SaveBlocks();
  134.             /* Free storage */
  135.             FreeGlobalStorage();
  136.             }
  137.                     /* Handle other resources */
  138.         if (sscanf(tmp,"%s :%d",dirname,&size) == 2)
  139.             {
  140.             strcpy(tmp,dirname);
  141.             strcpy(tmpname,tmp);
  142.             strcat(tmpname,".lmp");
  143.             printf("\nAdding resource %s",tmpname);
  144.             AddFromFile(tmp, size, tmpname);
  145.             }
  146.         }
  147.  
  148.     printf("\nWriting directory.....");
  149.     writeDirectory();
  150.  
  151.     return;
  152. }
  153.  
  154. void AddFromFile(char *resname, int size, char *fname)
  155. {
  156.     void *p;
  157.     FILE *f;
  158.  
  159.     p = (void *)SafeMalloc(size);
  160.     if ((f=fopen(fname,"rb")) == NULL)
  161.         Error("\nAddFromFile: could not open file %s\n", fname);
  162.  
  163.     fread(p, size, 1, f);
  164.     addName(resname, p, size);
  165.     fclose(f);
  166.     free(p);
  167. }
  168.  
  169. void FreeGlobalStorage(void)
  170. {
  171.  /*    free(segstore_i->data); */
  172.     free(linestore_i->data);
  173.     free(thingstore_i->data);
  174.     free(secstore_i->data);
  175.     free(mapvertexstore_i->data);
  176.     free(subsecstore_i->data);
  177.     free(maplinestore_i->data);
  178.     free(nodestore_i->data);
  179.     free(mapthingstore_i->data);
  180.     free(ldefstore_i->data);
  181.     free(sdefstore_i->data);
  182. /*    free(secdefstore_i->data); */
  183. /*    free(bchains); */
  184. /*    free(blines); */
  185. /*    free(segstore_i); */
  186.     free(linestore_i);
  187.     free(thingstore_i);
  188.     free(secstore_i);
  189.     free(mapvertexstore_i);
  190.     free(subsecstore_i);
  191.     free(maplinestore_i);
  192.     free(nodestore_i);
  193.     free(mapthingstore_i);
  194.     free(ldefstore_i);
  195.     free(sdefstore_i);
  196. /*    free(secdefstore_i); */
  197. }
  198.  
  199. void progress(void)
  200. {
  201.     char *s="/-\\|/-\\|";
  202.     static unsigned char pcnt=0;
  203.  
  204.     if((pcnt&15) == 0)
  205.         {
  206.         printf("%c\b",s[((pcnt)/16)&7]);
  207.         fflush(stdout);
  208.         }
  209.     pcnt++;
  210. }
  211.  
  212. void Error (char *error, ...)
  213. {
  214.     va_list argptr;
  215.     va_start (argptr,error);
  216.     vprintf (error,argptr);
  217.     va_end (argptr);
  218.     printf ("\n");
  219.     exit (1);
  220. }
  221.  
  222. void *SafeMalloc(unsigned size)
  223. {
  224.     void *ret = (void *)malloc(size);
  225.     if (!ret)
  226.         Error("\nSafeMalloc: Failed to allocate %u bytes",size);
  227.  
  228.     return ret;
  229. }
  230.  
  231. void *SafeCalloc(unsigned num, unsigned size)
  232. {
  233.     void *ret = (void *)calloc(num,size);
  234.     if (!ret)
  235.         Error("\nSafeCalloc: Failed to allocate %u of %u bytes",num,size);
  236.  
  237.     return ret;
  238. }
  239.  
  240. #ifdef __BIG_ENDIAN__
  241. short   LittleShort (short l)
  242. {
  243.     byte    b1,b2;
  244.     b1 = l&255;
  245.     b2 = (l>>8)&255;
  246.     return (b1<<8) + b2;
  247. }
  248.  
  249. short   BigShort (short l)
  250. {
  251.     return l;
  252. }
  253.  
  254. long    LittleLong (long l)
  255. {
  256.     byte    b1,b2,b3,b4;
  257.     b1 = l&255;
  258.     b2 = (l>>8)&255;
  259.     b3 = (l>>16)&255;
  260.     b4 = (l>>24)&255;
  261.     return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
  262. }
  263.  
  264. long    BigLong (long l)
  265. {
  266.     return l;
  267. }
  268.  
  269. #else
  270.  
  271. short   BigShort (short l)
  272. {
  273.     byte    b1,b2;
  274.     b1 = l&255;
  275.     b2 = (l>>8)&255;
  276.     return (b1<<8) + b2;
  277. }
  278.  
  279. short   LittleShort (short l)
  280. {
  281.     return l;
  282. }
  283.  
  284. long    BigLong (long l)
  285. {
  286.     byte    b1,b2,b3,b4;
  287.     b1 = l&255;
  288.     b2 = (l>>8)&255;
  289.     b3 = (l>>16)&255;
  290.     b4 = (l>>24)&255;
  291.     return ((long)b1<<24) + ((long)b2<<16) + ((long)b3<<8) + b4;
  292. }
  293.  
  294. long    LittleLong (long l)
  295. {
  296.     return l;
  297. }
  298.  
  299. #endif
  300.  
  301.