home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / XBD2_SRC.ZIP / XBD2_SRC / XBDE.C < prev    next >
C/C++ Source or Header  |  1991-02-08  |  9KB  |  426 lines

  1. /*********************************************/
  2. /* you just keep on pushing my luck over the */
  3. /*           BOULDER       DASH            */
  4. /*                                    */
  5. /*      Jeroen Houttuin, ETH Zurich, 1990    */
  6. /*                                    */
  7. /*                                    */
  8. /*      PC-VGA version from :                */
  9. /*                                    */
  10. /*        Herve SOULARD, Paris, 1990        */
  11. /*                                    */
  12. /*********************************************/
  13.  
  14. #include <stdio.h>
  15. #include <graph.h>
  16.  
  17. #include "xbd.h"
  18.  
  19. #define    HEIGHT    16
  20. #define    WIDTH    16
  21.  
  22. #define    MAXPGM    23
  23.  
  24. char    curchar;
  25.  
  26. char    allPgms[NB_EDIT_PGM];
  27.  
  28.  
  29. Bool kbdHit(void)
  30.     if (*kbdPtrRead == *kbdPtrWrite)
  31.         return(FALSE);
  32.     else
  33.         return(TRUE);
  34. }
  35.  
  36. void getKbd(byte *TT,byte *T)
  37.     *T = *(kbdBuffer + *kbdPtrRead);
  38.     if (*T == 0x00 || *T == 0xE0) {
  39.         *T = *(kbdBuffer + *kbdPtrRead + 1);
  40.         *TT = 'F';
  41.     }
  42.     else
  43.         *TT = 'T';
  44.     *kbdPtrRead += 2;
  45.     if (*kbdPtrRead == 0x3E)
  46.         *kbdPtrRead = 0x1E;
  47. }
  48.  
  49.  
  50. void init_vars()
  51. {
  52.     levelnum = -1;
  53.     xin = 0;
  54.     yin = 0;
  55. }
  56.  
  57.  
  58. /* Save the current level back into a file.    The global variable */
  59. /* filename is used to determine the file name. */
  60.  
  61. void save_level()
  62. {
  63.     FILE          *levelfile;
  64.     char           buf[300];
  65.     register int       i, j;
  66.  
  67.     /* Open the data file */
  68.     levelfile = fopen(filename, "w");
  69.     if (levelfile == NULL) {
  70.         exit(1);
  71.     }
  72.     
  73.     /* Write out the size of the level.  Normal text is used so that */
  74.     /* levels can be easily copied across architectures. */
  75.     fprintf(levelfile, "%d %d %d %d %d %d %d %d %d %s\n", y, x,
  76.             speed, diareq, diapoints, extradiapoints, blobbreak, 
  77.             tinkdur, curtime, levname);
  78.     
  79.     /* Terminate the lines for writing out the horizontal level lines */
  80.     buf[x] = '\n';
  81.     buf[x + 1] = '\0';
  82.     
  83.     /* Iterate through each vertical position */
  84.     for (i = 0; i < y; ++i) {
  85.  
  86.         /* Copy each horizontal line into the output buffer */
  87.         for (j = 0; j < x; ++j)
  88.             buf[j] = field[i][j].content;
  89.         
  90.         /* Write the line out to the file */
  91.         fputs(buf, levelfile);
  92.     }
  93.     
  94.     /* Close the data file */
  95.     fclose(levelfile);
  96. }
  97.  
  98. int getIndex(char c)
  99. {
  100.     int i=0;
  101.     
  102.     while (allPgms[i] != c && i < NB_EDIT_PGM)
  103.         i++;
  104.     if (i == NB_EDIT_PGM)
  105.         return (-1);
  106.     else
  107.         return(i);
  108. }
  109.  
  110. void setCursor(xC,yC)
  111. int xC,yC;
  112. {
  113.     int x,y;
  114.  
  115.     _setcolor(15);
  116.     y = yC * HEIGHT;
  117.     x = xC * WIDTH;
  118.     _rectangle(_GBORDER, x, y, x + WIDTH -1, y + HEIGHT-1);
  119.     _setcolor(0);
  120.     _rectangle(_GBORDER, x+1, y+1, x + WIDTH-2, y + HEIGHT-2);
  121.  
  122. }
  123.  
  124.  
  125. void unsetCursor(xC,yC)
  126. int xC,yC;
  127. {
  128.     switch (field[yC][xC].content) {
  129.         case GRASS:
  130.             drawPgm(xC, yC, ggc, _GPSET);
  131.             break;
  132.         case    SPACE:
  133.             drawPgm(xC, yC, sgc, _GPSET);
  134.             break;
  135.         case PLAYER:
  136.             drawPgm(xC, yC, pgc, _GPSET);
  137.             break;
  138.         case WALL:
  139.             drawPgm(xC, yC, wgc, _GPSET);
  140.             break;
  141.         case MAGICWALL:
  142.             drawPgm(xC, yC, Wgc, _GPSET);
  143.             break;
  144.         case DIAMOND:
  145.             drawPgm(xC, yC, dgc, _GPSET);
  146.             break;
  147.         case BOULDER:
  148.             drawPgm(xC, yC, bgc, _GPSET);
  149.             break;
  150.         case EXPLOSION:
  151.             drawPgm(xC, yC, xgc, _GPSET);
  152.             break;
  153.         case LMONSTER:
  154.             drawPgm(xC, yC, lgc, _GPSET);
  155.             break;
  156.         case RMONSTER:
  157.             drawPgm(xC, yC, rgc, _GPSET);
  158.             break;
  159.         case NUCBAL:
  160.             drawPgm(xC, yC, ngc, _GPSET);
  161.             break;
  162.         case BLOB:
  163.             drawPgm(xC, yC, Bgc, _GPSET);
  164.             break;
  165.         case TINKLE:
  166.             drawPgm(xC, yC, tgc, _GPSET);
  167.             break;
  168.         case EATER:
  169.             drawPgm(xC, yC, egc, _GPSET);
  170.             break;
  171.         case EXIT:
  172.             drawPgm(xC, yC, Egc, _GPSET);
  173.             break;
  174.         case STEEL:
  175.             drawPgm(xC, yC, Sgc, _GPSET);
  176.             break;
  177.     }
  178. }
  179.  
  180. void showLocPgm(int xC, int yC)
  181. {
  182.     char c;
  183.     int i;
  184.     
  185.     c = field[yC][xC].content;
  186.     i = getIndex(c);
  187.     _setcolor(15);
  188.     _rectangle(_GFILLINTERIOR, 615, 22+(i*16), 625, 26+(i*16));
  189. }
  190.  
  191. void unShowLocPgm(int xC, int yC)
  192. {
  193.     char c;
  194.     int i;
  195.     
  196.     c = field[yC][xC].content;
  197.     i = getIndex(c);
  198.     _setcolor(0);
  199.     _rectangle(_GFILLINTERIOR, 615, 22+(i*16), 625, 26+(i*16));
  200. }
  201.  
  202. void drawAllPgm()
  203. {
  204.     drawPgm(37,  1, pgc, _GPSET); allPgms[0] = PLAYER;
  205.     drawPgm(37,  2, sgc, _GPSET); allPgms[1] = SPACE;
  206.     drawPgm(37,  3, lgc, _GPSET); allPgms[2] = LMONSTER;
  207.     drawPgm(37,  4, rgc, _GPSET); allPgms[3] = RMONSTER;
  208.     drawPgm(37,  5, ggc, _GPSET); allPgms[4] = GRASS;
  209.     drawPgm(37,  6, wgc, _GPSET);    allPgms[5] = WALL;
  210.     drawPgm(37,  7, Wgc, _GPSET);    allPgms[6] = MAGICWALL;
  211.     drawPgm(37,  8, dgc, _GPSET);    allPgms[7] = DIAMOND;
  212.     drawPgm(37,  9, Sgc, _GPSET);    allPgms[8] = STEEL;
  213.     drawPgm(37, 10, bgc, _GPSET);    allPgms[9] = BOULDER;
  214.     drawPgm(37, 11, xgc, _GPSET);    allPgms[10] = EXPLOSION;
  215.     drawPgm(37, 12, Egc, _GPSET);    allPgms[11] = EXIT;
  216.     drawPgm(37, 13, egc, _GPSET);    allPgms[12] = EATER;
  217.     drawPgm(37, 14, ngc, _GPSET);    allPgms[13] = NUCBAL;
  218.     drawPgm(37, 15, Bgc, _GPSET);    allPgms[14] = BLOB;
  219.     drawPgm(37, 16, tgc, _GPSET);    allPgms[15] = TINKLE;
  220. }
  221.  
  222.  
  223. /* Main routine for editing levels */
  224. void main(argc, argv)
  225. int    argc;
  226. char    **argv;
  227. {
  228.     register int        i, j;
  229.     int    tmp;
  230.     char    buf[50];
  231.     int    pX = 0,
  232.         pY = 0;
  233.  
  234.     int curPgm = 0;
  235.     
  236.     Bool end = FALSE;
  237.     byte    keyhit;
  238.     byte    keytype;
  239.  
  240.     init_vars();
  241.  
  242.     /* Read in command line options */
  243.     for (i = 1; i < argc; ++i) {
  244.         if (argv[i][0] == '-') {
  245.             
  246.             /* -w sets the level width */
  247.             if (argv[i][1] == 'w') {
  248.                 if (argv[i][2] == '\0' && i + 1 < argc) {
  249.                     sscanf(argv[i + 1], "%d", &xin);
  250.                     i++;
  251.                 } 
  252.                 else
  253.                     sscanf(argv[i] + 2, "%d", &xin);
  254.             }
  255.             
  256.             /* -h sets the level height */
  257.             else 
  258.                 if (argv[i][1] == 'h') {
  259.                     if (argv[i][2] == '\0' && i + 1 < argc) {
  260.                         sscanf(argv[i + 1], "%d", &yin);
  261.                         i++;
  262.                     } 
  263.                     else
  264.                         sscanf(argv[i] + 2, "%d", &yin);
  265.                 }
  266.                 
  267.                 /* -l sets the level number */
  268.                 else 
  269.                     if (argv[i][1] == 'l') {
  270.                         if (argv[i][2] == '\0' && i + 1 < argc) {
  271.                             sscanf(argv[i + 1], "%d", &levelnum);
  272.                             i++;
  273.                         } 
  274.                         else
  275.                             sscanf(argv[i] + 2, "%d", &levelnum);
  276.                     } 
  277.                     else    {
  278.                         printf("usage: xbde [-h <height>] [-w <width>] -l <level> \n");
  279.                         exit(1);
  280.                     }
  281.         }
  282.     }
  283.     
  284.     /* Make sure some value was chosen for the level number.    This */
  285.     /* discourages everybody editing the same level all the time. */
  286.     if (levelnum == -1) {
  287.         printf("usage: xbde [-h <height>] [-w <width>] -l <level> \n");
  288.         exit(1);
  289.     }
  290.     
  291.     /* Load in level data from file. */
  292.     init_level(levelnum);
  293.     
  294.     /* Start up X windows and create all graphics cursors */
  295.     xstart();
  296.  
  297.     load();
  298.     
  299.     make_gcs();
  300.     Egc = Egc2;
  301.     Wgc = Wgc2;
  302.     tgc = tgc3;
  303.     draw_field(TRUE);
  304.  
  305.  
  306.     drawAllPgm();
  307.     _setcolor(15);
  308.     _rectangle(_GFILLINTERIOR, 570, 22+(curPgm*16), 580, 26+(curPgm*16));
  309.     showLocPgm(pX,pY);
  310.  
  311.     
  312.     /* Main event loop */
  313.     while (!end) {
  314.         setCursor(pX, pY);
  315.         if (kbdHit()) {
  316.             getKbd(&keytype,&keyhit);
  317.             if (keytype == 'T') {
  318.                 switch (keyhit) {
  319.                     /* C erases the entire level */
  320.                     case K_C :
  321.                     case K_c :
  322.                         /* Replace level contents with space */
  323.                         for (i = 0; i < y; ++i)
  324.                             for (j = 0; j < x; ++j)
  325.                                 if ((i == 0) || (i == y - 1) 
  326.                                     || (j == 0) || (j == x - 1))
  327.                                     set_cell(i, j, STEEL);
  328.                                 else
  329.                                     set_cell(i, j, SPACE);
  330.                         /* Redraw empty level */
  331.                         draw_field(FALSE);
  332.                         showLocPgm(pX,pY);
  333.                         break;
  334.  
  335.                     case K_U :
  336.                     case K_u :
  337.                         save_level();
  338.                         break;
  339.  
  340.                     case K_ESC :
  341.                         end = TRUE;
  342.                         break;
  343.                         
  344.                     case K_SPACE :
  345.                         unShowLocPgm(pX,pY);
  346.                         set_cell(pY, pX, allPgms[curPgm]);
  347.                         showLocPgm(pX,pY);
  348.                         break;
  349.                         
  350.                     default :
  351.                         curchar = keyhit;
  352.                         break;
  353.                 }
  354.             }
  355.             else {
  356.                 switch (keyhit) {
  357.                     case K_PGUP :
  358.                         _setcolor(0);
  359.                         _rectangle(_GFILLINTERIOR, 570, 22+(curPgm*16),
  360.                                   580, 26+(curPgm*16));
  361.                         if (--curPgm < 0)
  362.                             curPgm = NB_EDIT_PGM - 1;
  363.                         _setcolor(15);
  364.                         _rectangle(_GFILLINTERIOR, 570, 22+(curPgm*16),
  365.                                   580, 26+(curPgm*16));
  366.                         break;
  367.  
  368.                     case K_PGDOWN :
  369.                         _setcolor(0);
  370.                         _rectangle(_GFILLINTERIOR, 570, 22+(curPgm*16),
  371.                                   580, 26+(curPgm*16));
  372.                         if (++curPgm >= NB_EDIT_PGM)
  373.                             curPgm = 0;
  374.                         _setcolor(15);
  375.                         _rectangle(_GFILLINTERIOR, 570, 22+(curPgm*16),
  376.                                   580, 26+(curPgm*16));
  377.                         break;
  378.  
  379.                     case K_LEFT :
  380.                         unsetCursor(pX,pY);
  381.                         unShowLocPgm(pX,pY);
  382.                         if (--pX < 0)
  383.                             pX = x-1;
  384.                         setCursor(pX,pY);
  385.                         showLocPgm(pX,pY);
  386.                         break;
  387.  
  388.                     case K_RIGHT :
  389.                         unsetCursor(pX,pY);
  390.                         unShowLocPgm(pX,pY);
  391.                         if (++pX >= x)
  392.                             pX = 0;
  393.                         setCursor(pX,pY);
  394.                         showLocPgm(pX,pY);
  395.                         break;
  396.  
  397.                     case K_UP :
  398.                         unsetCursor(pX,pY);
  399.                         unShowLocPgm(pX,pY);
  400.                         if (--pY < 0)
  401.                             pY = y-1;
  402.                         setCursor(pX,pY);
  403.                         showLocPgm(pX,pY);
  404.                         break;
  405.                         
  406.                     case K_DOWN :
  407.                         unShowLocPgm(pX,pY);
  408.                         unsetCursor(pX,pY);
  409.                         if (++pY >= y)
  410.                             pY = 0;
  411.                         showLocPgm(pX,pY);
  412.                         setCursor(pX,pY);
  413.                         break;
  414.                 }
  415.             }
  416.         }
  417.         unsetCursor(pX, pY);
  418.             
  419.     } 
  420.       
  421.     xend();
  422.     exit(0);
  423. }
  424.