home *** CD-ROM | disk | FTP | other *** search
/ Doom 2 Explosion / Doom2Explosion.bin / doom2exp / programs / ibsp101s / idbsp.c < prev    next >
C/C++ Source or Header  |  1994-08-05  |  7KB  |  324 lines

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