home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume19 / xblockbuster / patch02 / xbb.p2
Encoding:
Text File  |  1993-04-28  |  34.6 KB  |  1,216 lines

  1. diff -cr xblockbuster1.01/CHANGES xblockbuster1.02/CHANGES
  2. *** xblockbuster1.01/CHANGES    Sat Mar 20 03:26:53 1993
  3. --- xblockbuster1.02/CHANGES    Fri Apr  2 20:44:44 1993
  4. ***************
  5. *** 1,3 ****
  6. --- 1,49 ----
  7. + Changes from v1.01 to v1.02
  8. +   rand and srand are now used as defaults on HP machines.
  9. +   added whitepixel and blackpixel variables.  Will make changing the
  10. +   foreground/background color easier.
  11. +   cleaned up the code a bit so that it now compiles without any warnings
  12. +   with gcc -Wall.  It does give one warning in stagemm.c, however.
  13. +   added -display command line option.
  14. +   added -playground to command line arguements.  Previously,
  15. +   -playground was implicity assumed.  Now, if you want to use a different
  16. +   playground, you must give the -playground option.
  17. +   added -geometry command line option.  Only placement information is
  18. +   used, not size information (The size XBB comes up in is pretty much
  19. +   the mininum that can be used.  A larger window just has more white
  20. +   area around it, so isn't useful either.)
  21. +   'q' or 'Q' now quits the game immediately, without saving.
  22. +   MotionHints can now be used.  I found little difference having it
  23. +   turned on versus old style play (if running XBB on a remote host,
  24. +   more packets were transmitted with motionhints on than before.)  Turning
  25. +   it on may help performance on slow machines.  The definition is near
  26. +   the top of the xblockbuster.h file. (Patches by Harvey J "Max" Thompson,
  27. +   harveyt@sco.com)
  28. +   Cleaned up the window redraw code.  It should not do extra refreshes
  29. +   as it did before, and it should now re-write the top information also.
  30. +   Fixed the horizontal shift that is used when the ball gets into an
  31. +   infinite loop.  Under the previous method, it is possible that the
  32. +   ball would not be shifted at all in loops.  Also, if the ball was
  33. +   moving very slowly, the shift might be none.  Now, the ball will be
  34. +   moved at least a certain amount if the ball is moving slowly.
  35. +   Added -nopause command line option.  If this is selected, the game will
  36. +   continue when the pointer is moved outside the window.  This feature can
  37. +   also be toggled during the game with the 'p' key.
  38. +   Better error messages are now in place.  It will now give you some
  39. +   idea of what file it failed on.
  40.   Changes from v1.00 to v1.01
  41.   
  42.     Fixed the Imakefile so StageDir now works properly.
  43. diff -cr xblockbuster1.01/Imakefile xblockbuster1.02/Imakefile
  44. *** xblockbuster1.01/Imakefile    Mon Mar 22 20:18:02 1993
  45. --- xblockbuster1.02/Imakefile    Fri Apr  2 21:00:29 1993
  46. ***************
  47. *** 1,4 ****
  48. --- 1,9 ----
  49.   XCOMM $XConsortium: Imakefile,v 1.9 91/07/16 23:06:01 gildea Exp $
  50. + /* Change BINDIR and MANDIR (uncomment them first) if you want to install
  51. +  * XBlockBuster other than the standard BINDIR and MANDIR, as defined by
  52. +  * X11, on your system.
  53. +  */
  54.   /*       BINDIR = /usr/games/
  55.   */
  56.   /*       MANDIR = /usr/local/man/man6
  57. ***************
  58. *** 14,19 ****
  59. --- 19,25 ----
  60.   #endif
  61.   
  62.   STAGEDIR = StageDir
  63.   /* If your on a system V machine, add -DSYSV to DEFINES below */
  64.   
  65.           DEFINES = -DSTAGEDIR=\"$(STAGEDIR)\"
  66. Only in xblockbuster1.01: MANIFEST.BAK
  67. diff -cr xblockbuster1.01/README xblockbuster1.02/README
  68. *** xblockbuster1.01/README    Mon Mar 22 20:07:43 1993
  69. --- xblockbuster1.02/README    Tue Mar 30 20:19:06 1993
  70. ***************
  71. *** 15,20 ****
  72. --- 15,24 ----
  73.       If you are on a System V machine, -DSYSV will need to be added to the
  74.       DEFINES variable.
  75.   
  76. +     If XBlockBuster is seems slow, or is using a lot of network bandwidth,
  77. +     try defining (uncommenting) the MOTION_HINTS line near the top
  78. +     of xblockbuster.h. (see CHANGES file for more information.)
  79.       XBlockbuster can use the same playground that Blockbuster (the sunview
  80.       version) does.  If you want to use the same playground, set 
  81.       StageDir (Imakefile) or LIBDIR (Makefile.noIm) appropriately.
  82. ***************
  83. *** 24,33 ****
  84.       If you have already installed the stages file for xblockbuster, and
  85.       don't want to copy over them, change InstallLib in Imakefile to No.
  86.   
  87. !     The Imakefile, as distributed, should work fine (unless on System V).  You
  88. !     may still want to edit the Imakefile to change where the files will
  89. !     be installed.  Once you have edited the Imakefile to your satisfaction,
  90. !     all that is needed is:
  91.   
  92.       1) xmkmf
  93.       2) make
  94. --- 28,37 ----
  95.       If you have already installed the stages file for xblockbuster, and
  96.       don't want to copy over them, change InstallLib in Imakefile to No.
  97.   
  98. !     The Imakefile, as distributed, should work fine (unless on System V, 
  99. !     see above).  You may still want to edit the Imakefile to change where the
  100. !     files will be installed.  Once you have edited the Imakefile to your
  101. !     satisfaction, all that is needed is:
  102.   
  103.       1) xmkmf
  104.       2) make
  105. ***************
  106. *** 116,130 ****
  107.    Fix the BUGS as listed in the man page.
  108.   
  109.   NOTES:
  110. !     As far as I know, this should run on pretty much any system that
  111. ! has X installed.  However, I am limited to only running it on a sun 3/60,
  112. ! so that is all it has been tested under (X11R5).
  113.   
  114.       I will maintain it and release patches as required. 
  115.   
  116.       If you send me mail, please include a valid mail address as
  117.   part of your signature.  I have gotten at least a few letters where
  118. ! the mail address in the header was incorrect.
  119.   
  120.   Mark Wedel
  121.   master@cats.ucsc.edu
  122. --- 120,141 ----
  123.    Fix the BUGS as listed in the man page.
  124.   
  125.   NOTES:
  126. !     I have personally verified it works on the following:
  127.   
  128. +     sun 3/60, sunos 4.1.1 (both color and black & white)
  129. +     I have gotten reports it works on the following:
  130. +     SGI with IRIS 4.0.x
  131.       I will maintain it and release patches as required. 
  132.   
  133.       If you send me mail, please include a valid mail address as
  134.   part of your signature.  I have gotten at least a few letters where
  135. ! the mail address in the header was incorrect.  Also, please be
  136. ! sure to state the version you are using (this should appear
  137. ! in both the window header, and the file patchlevel.h)
  138.   
  139.   Mark Wedel
  140.   master@cats.ucsc.edu
  141. Common subdirectories: xblockbuster1.01/SKELS and xblockbuster1.02/SKELS
  142. Common subdirectories: xblockbuster1.01/STAGES and xblockbuster1.02/STAGES
  143. Common subdirectories: xblockbuster1.01/STAGES.try and xblockbuster1.02/STAGES.try
  144. Common subdirectories: xblockbuster1.01/STAGES.wacko and xblockbuster1.02/STAGES.wacko
  145. diff -cr xblockbuster1.01/balls_pallet.c xblockbuster1.02/balls_pallet.c
  146. *** xblockbuster1.01/balls_pallet.c    Fri Mar 19 02:12:30 1993
  147. --- xblockbuster1.02/balls_pallet.c    Fri Apr  2 17:48:36 1993
  148. ***************
  149. *** 52,59 ****
  150.           (int)( (ball)->x ) - 8, (int)( (ball)->y ) - 8, 1)
  151.   
  152.   /* Procedure to draw the pallet */
  153. ! void
  154. ! draw_pallet( gc )
  155.   GC gc;
  156.   {
  157.       XDrawLine( display, win, gc, pallet_xI - pallet_lengthI + 2, pallet_yI,
  158. --- 52,58 ----
  159.           (int)( (ball)->x ) - 8, (int)( (ball)->y ) - 8, 1)
  160.   
  161.   /* Procedure to draw the pallet */
  162. ! void draw_pallet( gc )
  163.   GC gc;
  164.   {
  165.       XDrawLine( display, win, gc, pallet_xI - pallet_lengthI + 2, pallet_yI,
  166. ***************
  167. *** 85,92 ****
  168.   
  169.   /* Procedure to show the speeds */
  170.   #define SX     OFFSET_SPEED + 70
  171. ! void
  172. ! show_speeds(  )
  173.   {
  174.       int             sp;
  175.   
  176. --- 84,90 ----
  177.   
  178.   /* Procedure to show the speeds */
  179.   #define SX     OFFSET_SPEED + 70
  180. ! void show_speeds(  )
  181.   {
  182.       int             sp;
  183.   
  184. ***************
  185. *** 202,212 ****
  186.       case 'U':        /* because it may undo another one */
  187.       case 'W':
  188.       case '%':
  189. !         if ( !( ++loop_nhits % LOOP_MAX ) )
  190. !             ball->x -=
  191. !                 ball->x_speed * ( double ) ( loop_nhits / LOOP_MAX ) + 1;
  192. !         /* horizontal shift, trying to get out of a bounce loop */
  193. !         /* negative to try to avoid leaving the stage */
  194.           break;
  195.       default:        /* non-solid brick */
  196.           loop_nhits = 0;
  197. --- 200,220 ----
  198.       case 'U':        /* because it may undo another one */
  199.       case 'W':
  200.       case '%':
  201. !         if ( !( ++loop_nhits % LOOP_MAX ) ) {
  202. !             double shift =  ( double ) ( loop_nhits / LOOP_MAX ) + 2.0;
  203. !             if (fabs(ball->x_speed)>1.0)
  204. !                     ball->x -= ball->x_speed * shift;
  205. !             else if (ball->x_speed<0) 
  206. !                 ball->x += shift;
  207. !             else ball->x -= shift;
  208. !         }
  209. !         /* horizontal shift, trying to get out of a bounce loop
  210. !          * The shift should be the opposite direction the ball
  211. !          * is moving, which hopefully will prevent it from leaving
  212. !          * the stage
  213. !          */
  214.           break;
  215.       default:        /* non-solid brick */
  216.           loop_nhits = 0;
  217. ***************
  218. *** 510,517 ****
  219.       }
  220.   }
  221.   
  222. ! void
  223. ! check_deflections(old_pallet_y )
  224.   double old_pallet_y;
  225.   {
  226.       if (ball1.quadrant) check_ball(&ball1,old_pallet_y);
  227. --- 518,524 ----
  228.       }
  229.   }
  230.   
  231. ! void check_deflections(old_pallet_y )
  232.   double old_pallet_y;
  233.   {
  234.       if (ball1.quadrant) check_ball(&ball1,old_pallet_y);
  235. diff -cr xblockbuster1.01/bricks.c xblockbuster1.02/bricks.c
  236. *** xblockbuster1.01/bricks.c    Tue Nov 17 22:39:17 1992
  237. --- xblockbuster1.02/bricks.c    Fri Apr  2 20:38:19 1993
  238. ***************
  239. *** 86,93 ****
  240.       char        option[30],*value;
  241.   
  242.       for (count=0; count<=NUM_BRICK_TYPES; count++) {
  243. !         brick_color[count].bg = WhitePixel(display, screen_num);
  244. !         brick_color[count].fg = BlackPixel(display, screen_num);
  245.       }
  246.   
  247.   
  248. --- 86,93 ----
  249.       char        option[30],*value;
  250.   
  251.       for (count=0; count<=NUM_BRICK_TYPES; count++) {
  252. !         brick_color[count].bg = whitepixel;
  253. !         brick_color[count].fg = blackpixel;
  254.       }
  255.   
  256.   
  257. ***************
  258. *** 101,107 ****
  259.   
  260.       cursor_pr = XCreateBitmapFromData(display,win,cursor_bits, 
  261.           cursor_width, cursor_height);
  262. !     exact_def.pixel = WhitePixel(display, screen_num);
  263.       XQueryColor(display, def_cmap, &exact_def);
  264.       cursor = XCreatePixmapCursor(display, cursor_pr, cursor_pr,
  265.           &exact_def, &exact_def, 0, 0);
  266. --- 101,107 ----
  267.   
  268.       cursor_pr = XCreateBitmapFromData(display,win,cursor_bits, 
  269.           cursor_width, cursor_height);
  270. !     exact_def.pixel = whitepixel;
  271.       XQueryColor(display, def_cmap, &exact_def);
  272.       cursor = XCreatePixmapCursor(display, cursor_pr, cursor_pr,
  273.           &exact_def, &exact_def, 0, 0);
  274. ***************
  275. *** 282,288 ****
  276.       case 'X':return ( brick_X_pr );
  277.   
  278.       default:
  279. !         perror( "Illegal map code" );
  280.           exit( 1 );
  281.       }
  282.   }
  283. --- 282,288 ----
  284.       case 'X':return ( brick_X_pr );
  285.   
  286.       default:
  287. !         fprintf(stderr, "Illegal map code, stage %s\n",stage_name );
  288.           exit( 1 );
  289.       }
  290.   }
  291. ***************
  292. *** 297,303 ****
  293.       case '\\':return ( launchNW0_pr );
  294.   
  295.       default:
  296. !         perror( "Illegal map code" );
  297.           exit( 1 );
  298.       };
  299.   }
  300. --- 297,303 ----
  301.       case '\\':return ( launchNW0_pr );
  302.   
  303.       default:
  304. !         fprintf(stderr, "Illegal map code, stage %s\n",stage_name );
  305.           exit( 1 );
  306.       };
  307.   }
  308. ***************
  309. *** 350,356 ****
  310.       case 'X':return(37);
  311.   
  312.       default:
  313. !         perror( "Illegal map code" );
  314.           exit( 1 );
  315.       }
  316.   }
  317. --- 350,356 ----
  318.       case 'X':return(37);
  319.   
  320.       default:
  321. !         fprintf(stderr, "Illegal map code, stage %s\n",stage_name );
  322.           exit( 1 );
  323.       }
  324.   }
  325. diff -cr xblockbuster1.01/deflection.c xblockbuster1.02/deflection.c
  326. *** xblockbuster1.01/deflection.c    Fri Oct 23 00:20:03 1992
  327. --- xblockbuster1.02/deflection.c    Wed Mar 24 17:42:12 1993
  328. ***************
  329. *** 15,22 ****
  330.   
  331.   #include "xblockbuster.h"
  332.   
  333. ! void
  334. ! brick_deflection( hit, ball )
  335.       register int    hit;    /* enumeration { HORIZONTAL, VERTICAL } */
  336.       register struct Ball *ball;
  337.   {
  338. --- 15,21 ----
  339.   
  340.   #include "xblockbuster.h"
  341.   
  342. ! void brick_deflection( hit, ball )
  343.       register int    hit;    /* enumeration { HORIZONTAL, VERTICAL } */
  344.       register struct Ball *ball;
  345.   {
  346. ***************
  347. *** 53,60 ****
  348.       }
  349.   }
  350.   
  351. ! void
  352. ! pallet_deflection( ball )
  353.       register struct Ball *ball;
  354.   {
  355.       double          excentricity, true_angle;
  356. --- 52,58 ----
  357.       }
  358.   }
  359.   
  360. ! void pallet_deflection( ball )
  361.       register struct Ball *ball;
  362.   {
  363.       double          excentricity, true_angle;
  364. ***************
  365. *** 111,117 ****
  366.               ball1.x < -pallet_length || ball1.x > pallet_length )
  367.                   break;
  368.               ball1.angle = ( ball1.angle / 45 ) * M_PI_4;
  369. !             pallet_deflection( &ball1 );
  370.               ball1.angle = ( ball1.angle * 45 ) / M_PI_4;
  371.               printf( "==> quadrant: %d  angle: %f\n", ball1.quadrant, ball1.angle );
  372.           };
  373. --- 109,115 ----
  374.               ball1.x < -pallet_length || ball1.x > pallet_length )
  375.                   break;
  376.               ball1.angle = ( ball1.angle / 45 ) * M_PI_4;
  377. !             pallet_deflection( ball1 );
  378.               ball1.angle = ( ball1.angle * 45 ) / M_PI_4;
  379.               printf( "==> quadrant: %d  angle: %f\n", ball1.quadrant, ball1.angle );
  380.           };
  381. Common subdirectories: xblockbuster1.01/icons and xblockbuster1.02/icons
  382. diff -cr xblockbuster1.01/patchlevel.h xblockbuster1.02/patchlevel.h
  383. *** xblockbuster1.01/patchlevel.h    Thu Mar 18 01:34:39 1993
  384. --- xblockbuster1.02/patchlevel.h    Fri Mar 26 01:21:39 1993
  385. ***************
  386. *** 1 ****
  387. ! #define VERSION    "XBlockBuster 1.01"
  388. --- 1 ----
  389. ! #define VERSION    "XBlockBuster 1.02"
  390. diff -cr xblockbuster1.01/save.c xblockbuster1.02/save.c
  391. *** xblockbuster1.01/save.c    Thu Mar 18 16:22:53 1993
  392. --- xblockbuster1.02/save.c    Fri Mar 26 01:10:59 1993
  393. ***************
  394. *** 9,16 ****
  395.   
  396.   #include "xblockbuster.h"
  397.   
  398. ! void
  399. ! start_up(  )
  400.   {
  401.       FILE           *fd;
  402.       char            sve[SAVEFILE_LENGTH];
  403. --- 9,15 ----
  404.   
  405.   #include "xblockbuster.h"
  406.   
  407. ! void start_up(  )
  408.   {
  409.       FILE           *fd;
  410.       char            sve[SAVEFILE_LENGTH];
  411. ***************
  412. *** 47,54 ****
  413.       }
  414.   }
  415.   
  416. ! void
  417. ! save(  )
  418.   {
  419.       FILE           *fd;
  420.       char            sve[SAVEFILE_LENGTH];
  421. --- 46,52 ----
  422.       }
  423.   }
  424.   
  425. ! void save(  )
  426.   {
  427.       FILE           *fd;
  428.       char            sve[SAVEFILE_LENGTH];
  429. ***************
  430. *** 65,71 ****
  431.            pallet_modif, launch_speed );
  432.       for ( stage_nb_tmp = 0; stage_nb_tmp < MAX_NB_STAGES; )
  433.           fprintf( fd, "%1d", stages[stage_nb_tmp++] );
  434. !     close( fd );
  435.   
  436.       show_score_board(  );    /* BYE !! */
  437.   }
  438. --- 63,69 ----
  439.            pallet_modif, launch_speed );
  440.       for ( stage_nb_tmp = 0; stage_nb_tmp < MAX_NB_STAGES; )
  441.           fprintf( fd, "%1d", stages[stage_nb_tmp++] );
  442. !     fclose( fd );
  443.   
  444.       show_score_board(  );    /* BYE !! */
  445.   }
  446. diff -cr xblockbuster1.01/score.c xblockbuster1.02/score.c
  447. *** xblockbuster1.01/score.c    Thu Mar 18 16:49:56 1993
  448. --- xblockbuster1.02/score.c    Wed Mar 24 18:46:51 1993
  449. ***************
  450. *** 34,44 ****
  451.   }
  452.   
  453.   
  454. ! void
  455. ! show_score_board(  )
  456.   {
  457.       register int    lows, s, ns,scorenum=0;
  458. !     int        update = FALSE,made_it = FALSE,width;
  459.       FILE           *fd;
  460.       char            buf[PATH_LENGTH];
  461.   
  462. --- 34,43 ----
  463.   }
  464.   
  465.   
  466. ! void show_score_board(  )
  467.   {
  468.       register int    lows, s, ns,scorenum=0;
  469. !     int        update = FALSE,made_it = FALSE,width=0;
  470.       FILE           *fd;
  471.       char            buf[PATH_LENGTH];
  472.   
  473. ***************
  474. *** 124,130 ****
  475.               else if (abs(score_board[s].balls_left)>0) width=1;
  476.   
  477.           
  478. !             sprintf( buf, "%7d %*.s(%*d) %c %8s ",
  479.                   score_board[s].score, (3-width),"    ",
  480.                   width, abs(score_board[s].balls_left),
  481.                   score_board[s].balls_left>0 ? ' ' : '+',
  482. --- 123,129 ----
  483.               else if (abs(score_board[s].balls_left)>0) width=1;
  484.   
  485.           
  486. !             sprintf( buf, "%7d %.*s(%*d) %c %8s ",
  487.                   score_board[s].score, (3-width),"    ",
  488.                   width, abs(score_board[s].balls_left),
  489.                   score_board[s].balls_left>0 ? ' ' : '+',
  490. ***************
  491. *** 150,156 ****
  492.               else if (balls_left >9) width=2;
  493.               else if (balls_left >0) width=1;
  494.           
  495. !             sprintf( buf, "%7d %*.s(%*d)   %8s ",
  496.                   score, (3-width),"    ",
  497.                   width, balls_left, login);
  498.           }
  499. --- 149,155 ----
  500.               else if (balls_left >9) width=2;
  501.               else if (balls_left >0) width=1;
  502.           
  503. !             sprintf( buf, "%7d %.*s(%*d)   %8s ",
  504.                   score, (3-width),"    ",
  505.                   width, balls_left, login);
  506.           }
  507. diff -cr xblockbuster1.01/stage.c xblockbuster1.02/stage.c
  508. *** xblockbuster1.01/stage.c    Sat Mar 20 03:27:18 1993
  509. --- xblockbuster1.02/stage.c    Fri Apr  2 20:42:25 1993
  510. ***************
  511. *** 8,20 ****
  512.   
  513.   #include "xblockbuster.h"
  514.   
  515. ! void
  516. ! get_stage(  )
  517.   {
  518.       FILE           *fd;
  519.       char            buf[MAX_COL + 3], stg[STAGEFILE_LENGTH];
  520.       register int    row, col, tmp;
  521.       register char   code;
  522.   
  523.       nbricks = 0;
  524.       score_incr = 1;
  525. --- 8,21 ----
  526.   
  527.   #include "xblockbuster.h"
  528.   
  529. ! void get_stage(  )
  530.   {
  531.       FILE           *fd;
  532.       char            buf[MAX_COL + 3], stg[STAGEFILE_LENGTH];
  533.       register int    row, col, tmp;
  534.       register char   code;
  535. +     extern int errno;
  536. +     extern char *sys_errlist[];
  537.   
  538.       nbricks = 0;
  539.       score_incr = 1;
  540. ***************
  541. *** 24,30 ****
  542.       /* open next stage file */
  543.       sprintf( stg, STAGEFILE, playground, stage_nb );
  544.       if ( !( fd = fopen(stg, "r"))) {
  545. !         perror( "Can't open stage" );
  546.           exit( 1 );
  547.       }
  548.       /* clear msg, but leave the top line so the bonus remains on screen */
  549. --- 25,32 ----
  550.       /* open next stage file */
  551.       sprintf( stg, STAGEFILE, playground, stage_nb );
  552.       if ( !( fd = fopen(stg, "r"))) {
  553. !         fprintf(stderr, "Can't open stage %d, error %s\n",
  554. !             stage_nb, sys_errlist[errno]);
  555.           exit( 1 );
  556.       }
  557.       /* clear msg, but leave the top line so the bonus remains on screen */
  558. ***************
  559. *** 118,125 ****
  560.   
  561.   }
  562.   
  563. ! void
  564. ! new_stage(  )
  565.   {
  566.       FILE           *fd;
  567.       register int    stage_index, stage_nb_tmp;
  568. --- 120,126 ----
  569.   
  570.   }
  571.   
  572. ! void new_stage(  )
  573.   {
  574.       FILE           *fd;
  575.       register int    stage_index, stage_nb_tmp;
  576. diff -cr xblockbuster1.01/stagemm.c xblockbuster1.02/stagemm.c
  577. *** xblockbuster1.01/stagemm.c    Sat Mar 13 00:55:57 1993
  578. --- xblockbuster1.02/stagemm.c    Wed Mar 24 19:53:04 1993
  579. ***************
  580. *** 32,38 ****
  581.       }
  582.       /* read stage name */
  583.       fscanf( fd, "%s\n", stage_name );
  584. !     printf( "%>>> %s:", stage_name );
  585.   
  586.       /* read pallet dimensions */
  587.       fscanf( fd, "%d%d\n", &pallet_lengthI, &pallet_heightI );
  588. --- 32,38 ----
  589.       }
  590.       /* read stage name */
  591.       fscanf( fd, "%s\n", stage_name );
  592. !     printf( ">>> %s:", stage_name );
  593.   
  594.       /* read pallet dimensions */
  595.       fscanf( fd, "%d%d\n", &pallet_lengthI, &pallet_heightI );
  596. Only in xblockbuster1.02: stagemm.o
  597. diff -cr xblockbuster1.01/xblockbuster.c xblockbuster1.02/xblockbuster.c
  598. *** xblockbuster1.01/xblockbuster.c    Mon Mar 22 01:02:53 1993
  599. --- xblockbuster1.02/xblockbuster.c    Wed Mar 31 19:27:01 1993
  600. ***************
  601. *** 26,36 ****
  602.   #include "icons/blockbuster.icon"
  603.   #include "patchlevel.h"
  604.   
  605. ! int timer_active=FALSE,    /* has the user started the ball? */
  606. ! window_active=FALSE;    /* is the pointer in the window? */
  607.   
  608.   void event_handler()
  609.   {
  610.       XEvent    e;
  611. --- 26,35 ----
  612.   #include "icons/blockbuster.icon"
  613.   #include "patchlevel.h"
  614.   
  615. ! int timer_active=FALSE;    /* has the user started the ball? */
  616. ! static char *disp=NULL, *play="default";
  617. ! static int winposx=0, winposy=0,geomask,no_pause=FALSE;
  618.   
  619.   void event_handler()
  620.   {
  621.       XEvent    e;
  622. ***************
  623. *** 39,44 ****
  624. --- 38,44 ----
  625.       char    keystr[2],str[10];
  626.       struct    timeval    tp,oldtp;
  627.       struct     timezone tzp;
  628. +     int    window_active=FALSE;    /* is the pointer in the window? */
  629.   
  630.       gettimeofday(&oldtp,&tzp);
  631.       draw_pallet(gc_xor);
  632. ***************
  633. *** 129,141 ****
  634. --- 129,164 ----
  635.                       "Not Saved...          ",
  636.                       23);
  637.               }
  638. +             else if ((keystr[0] == 'q' ) || (keystr[0]=='Q')) {
  639. +                 XCloseDisplay(display);
  640. +                 exit(0);
  641. +             }
  642. +             else if ((keystr[0] == 'p') || (keystr[0] =='P')) {
  643. +                 if (no_pause) no_pause=FALSE;
  644. +                 else no_pause=TRUE;
  645. +             }
  646.           break;
  647.   
  648.           case MotionNotify:
  649. + #ifdef MOTION_HINTS
  650. +             {
  651. +                 Window rw, cw;
  652. +                 int xw, yw, xr, yr, keys_buttons;
  653. +                 XQueryPointer(display,e.xmotion.window,
  654. +                     &rw, &cw, &xr, &yr, &xw, &yw,
  655. +                     &keys_buttons);
  656. +                 draw_pallet(gc_xor);        /* erase old pallet */
  657. +                 pallet_x = (double)(pallet_xI=xw);
  658. +                 mouse_yI = yw;
  659. +                 draw_pallet(gc_xor);        /* draw new one */
  660. +             }
  661. + #else
  662.               draw_pallet(gc_xor);    /* erase old pallet */
  663.               pallet_x = (double) (pallet_xI =e.xmotion.x);
  664.               mouse_yI = e.xmotion.y;
  665.               draw_pallet(gc_xor);    /* draw new one */
  666. + #endif
  667.               break;
  668.   
  669.           case EnterNotify:
  670. ***************
  671. *** 143,149 ****
  672.               break;
  673.   
  674.           case LeaveNotify:
  675. !             window_active = FALSE;
  676.               break;
  677.   
  678.           case Expose:
  679. --- 166,173 ----
  680.               break;
  681.   
  682.           case LeaveNotify:
  683. !             if (!no_pause)
  684. !                 window_active = FALSE;
  685.               break;
  686.   
  687.           case Expose:
  688. ***************
  689. *** 182,249 ****
  690.   }
  691.   
  692.   
  693. ! void get_playground( argc, argv )
  694. ! int argc;
  695. ! char *argv[];
  696.   {
  697.       DIR        *dirp;
  698.       struct direct    *dp;
  699.       struct stat    st;
  700. !     int        len, found;
  701.   
  702.       /* set default playground directory */
  703.       strcpy( playground, STAGEDIR );
  704.       strcat( playground, "/" );
  705.       /* check for additional arguments (specific playground) */
  706. !     if ( argc > 1 ) {
  707. !         if ( argv[1][0] == '-' ) {
  708. !             /* list available playgrounds */
  709. !             printf( "available playgrounds are:\n" );
  710. !             printf( "\tdefault\n" );
  711. !             dirp = opendir(STAGEDIR);
  712. !             for( dp=readdir( dirp ); dp!=NULL; dp=readdir( dirp ) ) {
  713. !                 if ( !strncmp( dp->d_name, "STAGES.", 7 ) )
  714. !                     printf( "\t%s\n", (dp->d_name)+7 );
  715. !             }
  716. !             closedir( dirp );
  717. !             exit( 0 );
  718. !         }
  719. !         /* it's a playground name or private directory */
  720. !         if( !strcmp( argv[1], "default" ) ) {
  721. !             /* just in case someone used default */
  722. !             strcat( playground, "STAGES" );
  723. !             return;
  724. !         }
  725. !         found = 0;
  726. !         len = strlen( argv[1] );
  727. !         dirp = opendir( STAGEDIR );
  728.           for( dp=readdir( dirp ); dp!=NULL; dp=readdir( dirp ) ) {
  729. !             if ( dp->d_namlen == len+7 &&
  730. !                  !strcmp( (dp->d_name)+7, argv[1] ) ) {
  731. !                 found++;
  732. !                 break;
  733. !             }
  734.           }
  735.           closedir( dirp );
  736. !         if ( found )
  737. !             strcat( playground, dp->d_name );
  738. !         else {
  739. !             /* private dir */
  740. !             strcpy( playground, argv[1] );
  741. !             stat( playground, &st );
  742. !             if( !(st.st_mode & S_IFDIR) ) {
  743. !                 printf( "private playground <%s> not a directory.\n",
  744. !                     playground );
  745. !                 exit( 1 );
  746. !             }
  747. !         }
  748. !     } else {
  749.           strcat( playground, "STAGES" );
  750.       }
  751.   }
  752. -                 
  753.   
  754.   /*** xblockbuster ***/
  755.   void main( argc, argv )
  756.       int             argc;
  757. --- 206,299 ----
  758.   }
  759.   
  760.   
  761. ! void get_playground()
  762.   {
  763.       DIR        *dirp;
  764.       struct direct    *dp;
  765.       struct stat    st;
  766. !     char        path[PATH_LENGTH];
  767. !     
  768.   
  769.       /* set default playground directory */
  770.       strcpy( playground, STAGEDIR );
  771.       strcat( playground, "/" );
  772. +     
  773.       /* check for additional arguments (specific playground) */
  774. !     if ((!strcmp(play,"list")) || (!strcmp(play,"help"))) {
  775. !         /* list available playgrounds */
  776. !         printf( "available playgrounds are:\n" );
  777. !         printf( "\tdefault\n" );
  778. !         dirp = opendir(STAGEDIR);
  779.           for( dp=readdir( dirp ); dp!=NULL; dp=readdir( dirp ) ) {
  780. !             if ( !strncmp( dp->d_name, "STAGES.", 7 ) )
  781. !                 printf( "\t%s\n", (dp->d_name)+7 );
  782.           }
  783.           closedir( dirp );
  784. !         exit( 0 );
  785. !     }
  786. !     /* it's a playground name or private directory */
  787. !     if( !strcmp( play, "default" ) ) {
  788. !         /* just in case someone used default */
  789.           strcat( playground, "STAGES" );
  790. +         return;
  791.       }
  792. +     sprintf(path,"%s/STAGES.%s",STAGEDIR,play);
  793. +     stat(path, &st);
  794. +     if (S_ISDIR(st.st_mode))
  795. +         strcpy(playground, path);
  796. +     else {    /* private dir */
  797. +         stat(play, &st);
  798. +         if (!S_ISDIR(st.st_mode)) {
  799. +             printf("Was not able to open playground %s.\n",play);
  800. +             exit(1);
  801. +         }
  802. +         else strcpy(playground,play);
  803. +     }
  804.   }
  805.   
  806. + void usage()
  807. + {
  808. +     printf("Valid option command line arguements are:\n\n");
  809. +     printf("   -display dispname     - destination display\n");
  810. +     printf("-playground playground   - playground to use\n\n");
  811. +     exit(0);
  812. + }
  813. + void parse_args(argc, argv)
  814. + int argc;
  815. + char *argv[];
  816. + {
  817. +     int    i,tmp;
  818. +     for (i=1; i<argc; i++) {
  819. +         if (!strcmp(argv[i],"-display"))
  820. +             if (++i==argc) usage();
  821. +             else disp = argv[i];
  822. +         else if (!strcmp(argv[i],"-playground"))
  823. +             if (++i==argc) usage();
  824. +             else play = argv[i];
  825. +         else if (!strcmp(argv[i],"-geometry")) {
  826. +             if (++i==argc) usage();
  827. +             else geomask = XParseGeometry(argv[i], &winposx,
  828. +                 &winposy, &tmp, &tmp);
  829. +         }
  830. +         else if (!strcmp(argv[i],"-nopause"))
  831. +             no_pause=TRUE;
  832. +         else usage();
  833. +     }
  834. + }
  835. + void do_geometry()
  836. + {
  837. +     if (geomask & XNegative) 
  838. +         winposx += WidthOfScreen(ScreenOfDisplay(display,screen_num))
  839. +              - STAGE_WIDTH_IN_PIXELS - BORDER_WIDTH*2;
  840. +     if (geomask & YNegative)
  841. +         winposy += HeightOfScreen(ScreenOfDisplay(display,screen_num))
  842. +              - STAGE_HEIGHT_IN_PIXELS - BORDER_WIDTH*2;
  843. + }
  844.   /*** xblockbuster ***/
  845.   void main( argc, argv )
  846.       int             argc;
  847. ***************
  848. *** 261,267 ****
  849.       /* who am i ? ['cuserid(3S)' is fooled by 'su(1)'] */
  850.       login = getpwuid( getuid(  ) )->pw_name;
  851.   
  852. !     if ((display=XOpenDisplay(NULL))==NULL) {
  853.           fprintf(stderr, "Unable to open display: %s\n",
  854.               XDisplayName(NULL));
  855.           exit(1);
  856. --- 311,320 ----
  857.       /* who am i ? ['cuserid(3S)' is fooled by 'su(1)'] */
  858.       login = getpwuid( getuid(  ) )->pw_name;
  859.   
  860. !     parse_args(argc, argv);
  861. !     get_playground();
  862. !     if ((display=XOpenDisplay(disp))==NULL) {
  863.           fprintf(stderr, "Unable to open display: %s\n",
  864.               XDisplayName(NULL));
  865.           exit(1);
  866. ***************
  867. *** 268,279 ****
  868.       }
  869.   
  870.       screen_num = DefaultScreen(display);
  871.       win = XCreateSimpleWindow(display, RootWindow(display, screen_num),
  872. !         0, 0, STAGE_WIDTH_IN_PIXELS, STAGE_HEIGHT_IN_PIXELS,
  873. !         0, 2, WhitePixel(display, screen_num));
  874.   
  875.       XSelectInput(display, win, ExposureMask | ButtonPressMask |
  876.           LeaveWindowMask | EnterWindowMask | KeyPressMask |
  877.           PointerMotionMask);
  878.   
  879.   
  880. --- 321,342 ----
  881.       }
  882.   
  883.       screen_num = DefaultScreen(display);
  884. +     do_geometry();
  885. +     whitepixel = WhitePixel(display, screen_num);
  886. +     blackpixel = BlackPixel(display, screen_num);
  887.       win = XCreateSimpleWindow(display, RootWindow(display, screen_num),
  888. !         winposx, winposy, STAGE_WIDTH_IN_PIXELS,
  889. !          STAGE_HEIGHT_IN_PIXELS, BORDER_WIDTH, blackpixel,
  890. !          whitepixel);
  891.   
  892.       XSelectInput(display, win, ExposureMask | ButtonPressMask |
  893.           LeaveWindowMask | EnterWindowMask | KeyPressMask |
  894. + #ifdef MOTION_HINTS
  895. +         PointerMotionHintMask |
  896. + #endif
  897.           PointerMotionMask);
  898.   
  899.   
  900. ***************
  901. *** 285,292 ****
  902.       font_height=font_info->max_bounds.ascent + font_info->max_bounds.descent +1;
  903.   
  904.   
  905. !     xgcvalues.foreground = BlackPixel(display, screen_num);
  906. !     xgcvalues.background = WhitePixel(display, screen_num);
  907.   
  908.       
  909.       xgcvalues.graphics_exposures = False;
  910. --- 348,355 ----
  911.       font_height=font_info->max_bounds.ascent + font_info->max_bounds.descent +1;
  912.   
  913.   
  914. !     xgcvalues.foreground = blackpixel;
  915. !     xgcvalues.background = whitepixel;
  916.   
  917.       
  918.       xgcvalues.graphics_exposures = False;
  919. ***************
  920. *** 341,348 ****
  921.       }
  922.   
  923.       size_hints.flags = PMinSize;
  924. !     size_hints.x = 0;
  925. !     size_hints.y = 0;
  926.       size_hints.height = STAGE_HEIGHT_IN_PIXELS;
  927.       size_hints.min_height = STAGE_HEIGHT_IN_PIXELS;
  928.       size_hints.width = STAGE_WIDTH_IN_PIXELS;
  929. --- 404,412 ----
  930.       }
  931.   
  932.       size_hints.flags = PMinSize;
  933. !     if (geomask!=0) size_hints.flags |= USPosition;
  934. !     size_hints.x = winposx;
  935. !     size_hints.y = winposy;
  936.       size_hints.height = STAGE_HEIGHT_IN_PIXELS;
  937.       size_hints.min_height = STAGE_HEIGHT_IN_PIXELS;
  938.       size_hints.width = STAGE_WIDTH_IN_PIXELS;
  939. ***************
  940. *** 364,370 ****
  941.       /* initialize random (used to determine next stage) */
  942.       SRAND( time( 0 ) );
  943.   
  944. -     get_playground( argc, argv );
  945.   
  946.       /* and off we go */
  947.       bricks_init();
  948. --- 428,433 ----
  949. ***************
  950. *** 382,388 ****
  951.   /* Most SysV's don't have a usleep.  Sone of them have select. */
  952.   
  953.   usleep( usecs )
  954. ! int usecs;
  955.       {
  956.       struct timeval timeout;
  957.   
  958. --- 445,451 ----
  959.   /* Most SysV's don't have a usleep.  Sone of them have select. */
  960.   
  961.   usleep( usecs )
  962. ! unsigned usecs;
  963.       {
  964.       struct timeval timeout;
  965.   
  966. diff -cr xblockbuster1.01/xblockbuster.h xblockbuster1.02/xblockbuster.h
  967. *** xblockbuster1.01/xblockbuster.h    Sat Mar 20 03:27:34 1993
  968. --- xblockbuster1.02/xblockbuster.h    Tue Mar 30 20:11:59 1993
  969. ***************
  970. *** 27,34 ****
  971. --- 27,42 ----
  972.   
  973.   #define FONT    "10x20"
  974.   
  975. + /* define if you want pointer motion hints used (read CHANGES file) */
  976. + /*#define MOTION_HINTS*/
  977. + #ifdef hpux
  978. + #define RAND() rand()
  979. + #define SRAND(n) srand(n)
  980. + #else
  981.   #define RAND() random()
  982.   #define SRAND(n) srandom(n)
  983. + #endif
  984.   
  985.   /* You may need to uncomment some of these if your system does not have
  986.    * them.  If you need to do so, please let me know, so I can put them
  987. ***************
  988. *** 51,58 ****
  989. --- 59,68 ----
  990.   GC        gc, gc_erase, gc_color,gc_xor;
  991.   XFontStruct    *font_info;
  992.   int        screen_num, font_width, font_height,extra_draw;
  993. + unsigned long    whitepixel, blackpixel;
  994.   
  995.   /*** windowing objects ***/
  996. + #define BORDER_WIDTH    2    /* borderwidth X puts around the window */
  997.   
  998.   #define BORDER         50
  999.   #define MSG_HEIGHT     font_height*2 + 4
  1000. ***************
  1001. *** 219,221 ****
  1002. --- 229,267 ----
  1003.   
  1004.   #define ITIMER_DELAY    5000
  1005.   
  1006. + /* Prototype some functions here */
  1007. + #ifdef __GNUC__
  1008. + void fclose(FILE *);                    /* system */
  1009. + void fprintf(FILE*, char *, ...);            /* system */
  1010. + void fscanf(FILE *, char *, ...);            /* system */
  1011. + int  gettimeofday(struct timeval*, struct timezone*);    /* system */
  1012. + void perror(char *);                    /* system */
  1013. + void printf(char *, ...);                /* system */
  1014. + void rewind(FILE *);                    /* system */
  1015. + int  strcasecmp(char *, char*);                /* system */
  1016. + time_t time(time_t*);                    /* system */
  1017. + void usleep(unsigned);                    /* system */
  1018. + int  RAND();                        /* system */
  1019. + void SRAND(int);                    /* system */
  1020. + void ball_init();                    /* balls_pallet.c */
  1021. + void check_deflections(double );            /* balls_pallet.c */
  1022. + void draw_all_balls();                    /* balls_pallet.c */
  1023. + void draw_pallet(GC);                    /* balls_pallet.c */
  1024. + void move_balls();                    /* balls_pallet.c */
  1025. + void print_balls();                    /* balls_pallet.c */
  1026. + void print_score();                    /* balls_pallet.c */
  1027. + void show_speeds();                    /* balls_paller.c */
  1028. + void bricks_init();                    /* bricks.c */
  1029. + void draw_brick(int, int ) ;                /* bricks.c */
  1030. + void draw_brick0(int, int ) ;                /* bricks.c */
  1031. + void brick_deflection( int, struct Ball* );        /* deflection.c */
  1032. + void pallet_deflection(struct Ball * );            /* deflection.c */
  1033. + void save();                        /* save.c */
  1034. + void start_up();                    /* save.c */
  1035. + void get_stage();                    /* stage.c */
  1036. + void new_stage(  );                    /* stage.c */
  1037. + void show_score_board(  );                /* score.c */
  1038. + #endif
  1039. diff -cr xblockbuster1.01/xblockbuster.man xblockbuster1.02/xblockbuster.man
  1040. *** xblockbuster1.01/xblockbuster.man    Tue Mar 23 00:32:13 1993
  1041. --- xblockbuster1.02/xblockbuster.man    Wed Mar 31 19:43:21 1993
  1042. ***************
  1043. *** 3,15 ****
  1044.   .SH NAME
  1045.   xblockbuster \- game
  1046.   .SH SYNOPSIS
  1047. ! .B xblockbuster
  1048. ! .I [play_ground]
  1049.   .SH DESCRIPTION
  1050. ! The play ground is either the anonymous public play ground (no argument),
  1051. ! a named public playground or a privately owned directory.
  1052. ! The list of available named public play grounds is obtained by giving "-"
  1053. ! as the play ground argument.
  1054.   .LP
  1055.   The object of the game is to collect as many points as possible by
  1056.   .I busting
  1057. --- 3,19 ----
  1058.   .SH NAME
  1059.   xblockbuster \- game
  1060.   .SH SYNOPSIS
  1061. ! .B xblockbuster -playground
  1062. ! .I play_ground
  1063. ! .B -display
  1064. ! .I display
  1065. ! .B -geometry
  1066. ! .I geometry
  1067. ! .B -nopause
  1068.   .SH DESCRIPTION
  1069. ! XBlockbuster is a variation of the break-out type games, only a bit more
  1070. ! complex in the type of bricks it has and effects the bricks have.  It is
  1071. ! X11 based.
  1072.   .LP
  1073.   The object of the game is to collect as many points as possible by
  1074.   .I busting
  1075. ***************
  1076. *** 45,54 ****
  1077.   LEFT moves it up one row, MIDDLE moves it all the way down again.
  1078.   Each ball is launched with the RIGHT mouse button.
  1079.   .LP
  1080. ! A stage can be halted by closing the window, or moving the pointer out
  1081. ! of the window.
  1082.   Be advised however, that the game will resume immediately upon opening the
  1083.   window.
  1084.   .LP
  1085.   During a game, the score, number of balls left and speeds are shown.
  1086.   The speeds are represented by up to 3 thin lines (one for each ball),
  1087. --- 49,60 ----
  1088.   LEFT moves it up one row, MIDDLE moves it all the way down again.
  1089.   Each ball is launched with the RIGHT mouse button.
  1090.   .LP
  1091. ! A stage can be halted by closing the window.
  1092.   Be advised however, that the game will resume immediately upon opening the
  1093.   window.
  1094. + If no-pause has not
  1095. + been selected (see below), moving the pointer out 
  1096. + of the XBlockBuster window will also stop the action.
  1097.   .LP
  1098.   During a game, the score, number of balls left and speeds are shown.
  1099.   The speeds are represented by up to 3 thin lines (one for each ball),
  1100. ***************
  1101. *** 63,68 ****
  1102. --- 69,111 ----
  1103.   The score board shows scores, number of balls left between parentheses if any
  1104.   and user name.
  1105.   Finally, an indication of your current pallet shrinkage is given.
  1106. + .LP
  1107. + At any time, 'q' or 'Q' may be pressed to quit the present game.  This quits
  1108. + the game immediately, so may be useful if your boss is closing in.  Also
  1109. + useful if you mess up on the first stage, and thus, continuing play of that
  1110. + game is no longer worth it.
  1111. + .LP
  1112. + \'P' or 'p' may be pressed during the game to toggle the no-pause option.
  1113. + When no-pause is active, the game will continue even when the mouse pointer
  1114. + is outside the window.  With it turned off, action stops once the mouse
  1115. + pointer is outside the window.
  1116. + .SH COMMAND LINE OPTIONS
  1117. + .TP 8
  1118. + -playground \fIplayground\fR
  1119. + This determines the playground to use.  Either the directory containing
  1120. + the score file, stages, and save directory can be given, or only the
  1121. + final part after the STAGES name can be given for public play grounds.
  1122. + By default, the standard playground will be used if this option is
  1123. + not given.
  1124. + To see a list of the public play grounds, enter \fIlist\fB as the 
  1125. + playground name.
  1126. + .TP
  1127. + -display \fIdisplay\fR
  1128. + This is the display to run XBlockBuster on.  If not otherwise specified,
  1129. + the DISPLAY environmental variable will be used to determine the 
  1130. + display to use.
  1131. + .TP
  1132. + -geometry \fIgeometry\fR
  1133. + This is the geometry to use for the XBlockBuster window.  Only the
  1134. + positioning, and not size, information is used.  If size information
  1135. + is given, it is just ignored.
  1136. + .TP
  1137. + -nopause
  1138. + Determines if no-pause mode is on by default when the game is started up.
  1139. + When no-pause mode is on, action continues if the mouse pointer is outside
  1140. + the XBlockBuster window.
  1141.   .SH NOTES
  1142.   .LP
  1143.   In order to avoid infinite loops
  1144. ***************
  1145. *** 93,99 ****
  1146.   during play.
  1147.   .SH "CREATION OF PLAY GROUNDS"
  1148.   A private play ground can be created in any directory.
  1149. ! The stages can be defined from the ascii map codes using any text editor
  1150.   They must be numbered consecutively from 0 with the total number
  1151.   (i.e., one more than the highest number) available in the file nb_stages.
  1152.   Furthermore a directory 'save' and an empty file 'scores' must be created.
  1153. --- 136,142 ----
  1154.   during play.
  1155.   .SH "CREATION OF PLAY GROUNDS"
  1156.   A private play ground can be created in any directory.
  1157. ! The stages can be defined from the ascii map codes using any text editor.
  1158.   They must be numbered consecutively from 0 with the total number
  1159.   (i.e., one more than the highest number) available in the file nb_stages.
  1160.   Furthermore a directory 'save' and an empty file 'scores' must be created.
  1161. ***************
  1162. *** 230,237 ****
  1163.   .SH BUGS
  1164.   When two balls hit the same brick simultaneously,
  1165.   one may leave a shadow on the stage.
  1166. - .LP
  1167. - Sometimes a ball image is left when the window is re-opened.
  1168.   .LP
  1169.   If the ball hits the bottom corners of the playing area, they will at times
  1170.   reflect back in a reverse direction, instead of reflecting downward and
  1171. --- 273,278 ----
  1172. Common subdirectories: xblockbuster1.01/STAGES/save and xblockbuster1.02/STAGES/save
  1173. Common subdirectories: xblockbuster1.01/STAGES.try/save and xblockbuster1.02/STAGES.try/save
  1174. Common subdirectories: xblockbuster1.01/STAGES.wacko/save and xblockbuster1.02/STAGES.wacko/save
  1175.