home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume11 / blockbuster / part01 / stage.c < prev    next >
C/C++ Source or Header  |  1990-08-10  |  4KB  |  159 lines

  1. /*
  2.  * File:       stage.c
  3.  * Author:     Eric Van Gestel
  4.  *
  5.  * For:                blockbuster
  6.  */
  7.  
  8. #include "blockbuster.h"
  9. #include "bricks.h"
  10.  
  11. void
  12. get_stage(  )
  13. {
  14.     FILE           *fd;
  15.     char            buf[MAX_COL + 3], stg[STAGEFILE_LENGTH];
  16.     register int    row, col, tmp;
  17.     register char   code;
  18.  
  19.     nbricks = 0;
  20.     score_incr = 1;
  21.     loop_nhits = 0;
  22.     last_busted_brick = NULL;
  23.  
  24.     /* open next stage file */
  25.     if ( !( fd = fopen( sprintf( stg, STAGEFILE, playground, stage_nb ),
  26.                 "r" ) ) ) {
  27.         perror( "Can't open stage" );
  28.         exit( 1 );
  29.     }
  30.     /* clear msg */
  31.     for ( tmp = 0; tmp < MSG_HEIGHT; tmp++ )
  32.         pw_vector( msg_win, 0, tmp, STAGE_WIDTH_IN_PIXELS - 1, tmp,
  33.                PIX_CLR, 1 );
  34.  
  35.     /* read stage name */
  36.     fscanf( fd, "%s\n", stage_name );
  37.     for ( tmp = 0; stage_name[tmp]; tmp++ )
  38.         if ( stage_name[tmp] == '_' )
  39.             stage_name[tmp] = ' ';
  40.     for (  /* tmp = tmp */ ; tmp < NAME_LENGTH - 1; tmp++ )
  41.         stage_name[tmp] = ' ';
  42.     stage_name[NAME_LENGTH - 1] = '\0';
  43.     msg1( OFFSET_SPEED, stage_name );
  44.  
  45.     /* read pallet dimensions */
  46.     fscanf( fd, "%d%d\n", &pallet_lengthI, &pallet_heightI );
  47.     if ( pallet_lengthI < SHORT_PALLET_LENGTH ||
  48.          pallet_lengthI > LONG_PALLET_LENGTH ||
  49.          pallet_heightI < pallet_lengthI ||
  50.          pallet_heightI > MAX_PALLET_HEIGHT ) {
  51.         perror( "Inconsistent pallet dimensions" );
  52.         exit( 1 );
  53.     }
  54.     /* modify for difficulty level */
  55.     pallet_lengthI -= ( pallet_modif * pallet_lengthI ) / PALLET_DENOMINATOR;
  56.     if ( pallet_lengthI < MIN_PALLET_LENGTH )
  57.         pallet_lengthI = MIN_PALLET_LENGTH;
  58.     if ( pallet_lengthI > MAX_PALLET_LENGTH )
  59.         pallet_lengthI = MAX_PALLET_LENGTH;
  60.     if ( pallet_heightI < pallet_lengthI )
  61.         pallet_heightI = pallet_lengthI;
  62.     pallet_length = ( double ) pallet_lengthI;
  63.     pallet_height = ( double ) pallet_heightI;
  64.  
  65.     /* read stage map */
  66.     for ( row = 0; row <= MAX_ROW; row++ ) {
  67.         if ( !fgets( buf, MAX_COL + 3, fd ) ) {
  68.             perror( "Can't read stage" );
  69.             exit( 1 );
  70.         }
  71.         for ( col = 0; col <= MAX_COL; col++ ) {
  72.             code = buf[col];
  73.             if ( IS_HIT_BRICK( code ) )
  74.                 nbricks++;
  75.             switch ( code ) {
  76.             case '/':
  77.                 launch_quadrant = NE;
  78.                 launch_row = row;
  79.                 launch_col = col;
  80.                 launch_x = ( double ) ( COL_X( col + 1 ) );
  81.                 launch_y = ( double ) ( ROW_Y( row ) );
  82.                 break;
  83.             case '\\':
  84.                 launch_quadrant = NW;
  85.                 launch_row = row;
  86.                 launch_col = col;
  87.                 launch_x = ( double ) ( COL_X( col ) );
  88.                 launch_y = ( double ) ( ROW_Y( row ) );
  89.                 break;
  90.             case '^':
  91.                 emit_row = row;
  92.                 emit_col = col;
  93.             }
  94.             stage[row][col].code = code;
  95.             stage[row][col].nhits = 0;
  96.         }
  97.     }
  98.     fclose( fd );
  99.  
  100.     /* draw new stage */
  101.     for ( row = 0; row <= MAX_ROW; row++ ) {
  102.         draw_brick0( row, 0 );
  103.         for ( col = 1; col < MAX_COL; col++ )
  104.             draw_brick( row, col );
  105.         draw_brick0( row, MAX_COL );
  106.     }
  107.  
  108.     /* reset pallet location */
  109.     pallet_y = ( double ) ( pallet_yI = PALLET_MAX_Y + 4 );
  110.     pallet_row = MAX_ROW - 1;
  111.     draw_pallet(  );
  112.  
  113.     /* ready ? */
  114.     msg0( OFFSET_BALLS,
  115.           "Press right mouse button when ready; R1 to save.%7c", ' ' );
  116. }
  117.  
  118. void
  119. new_stage(  )
  120. {
  121.     FILE           *fd;
  122.     register int    stage_index, stage_nb_tmp;
  123.     char        buf[STAGEFILE_LENGTH], buf2[2*STAGEFILE_LENGTH];
  124.  
  125.     /* go faster or make the pallet smaller */
  126.     if ( launch_speed < MAX_SPEED )
  127.         launch_speed += SPEED_INCR;
  128.     else
  129.         pallet_modif += PALLET_INCR;
  130.  
  131.     /* determine stage number */
  132.     if ( !nb_stages ) {
  133.         /* read number of available stages */
  134.         if ( !( fd = fopen( sprintf( buf, NB_STAGESFILE, playground ),
  135.                     "r" ) ) ) {
  136.             perror( sprintf( buf2, "Can't open number of stages file <%s>",
  137.                      buf ) );
  138.             exit( 1 );
  139.         }
  140.         fscanf( fd, "%d", &nb_stages );
  141.         fclose( fd );
  142.         /* clear stages memory */
  143.         for ( stage_nb_tmp = 0; stage_nb_tmp < MAX_NB_STAGES; )
  144.             stages[stage_nb_tmp++] = FALSE;
  145.     }
  146.     /* search for stage index'th available stage number */
  147.     stage_index = ( int ) ( random(  ) ) % nb_stages--;
  148.     if ( stage_index < 0 )
  149.         stage_index = -stage_index;
  150.     for ( stage_nb = 0; stages[stage_nb]; )
  151.         stage_nb++;
  152.     while ( stage_index-- ) {
  153.         while ( stages[++stage_nb] );
  154.     }
  155.     stages[stage_nb] = TRUE;
  156.  
  157.     get_stage(  );
  158. }
  159.