/* * game.c * */ #include "Bomber.h" #include #include #include "sound.h" #ifdef DEBUG # define D(debug) debug #else # define D(debug) #endif /* Bombenzahl = Größe * Level * BOMB_FACTOR */ #define BOMB_FACTOR 0.07 /* GesamtZeit = TIME_FACTOR * Bombenzahl */ #define TIME_FACTOR (8 - 2*spiel_level) /*------------------------- Externe Daten...*/ extern int time_counter, flag_counter; /*------------------------- Daten dieses Moduls...*/ int size_x, size_y, spiel_level=0, practice_mode=0, rest_felder=0, gesamtzeit=0; UBYTE *spielfeld = NULL; /* * Codierung eines Feldes (bitweise geodert): * 128 = verdeckt * 64 = Flagge * 32 = Bombe * 16 = Markierung für 'Fläche freilegen' * 0..15 = Anzahl benachbarter Bomben * */ /*------------------------- Code-Deklarationen...*/ extern void stop_timer( void ); extern void window_sizing( BOOL ); extern void draw_field( int x, int y, UBYTE inhalt ); extern void clear_spielfeld( void ); extern void count_down( void ); extern void change_flagcounter( int wert ); extern void sound_play( int ); extern void highscore_eintrag( int x, int y, int zeit, int level ); /*------------------------- Code-Definitionen...*/ void init_game( void ) { // Bis jetzt nix zu initialisieren... // bleibt wahrscheinlich auch so... } void free_spielfeld( void ) { if( spielfeld ) { FreeMem( spielfeld, size_x*size_y ); spielfeld = NULL; } } void close_game( void ) { free_spielfeld(); } void spielende( void ) { int x, y; UBYTE *inhalt = spielfeld; // CountDown stoppen stop_timer(); // Alle noch bedeckten Felder anzeigen for( y=0; y3 || y>2) ) { // Bombe setzen *s = 32; --i; // Umgebungsfelderinhalte erhöhen if( x ) { INC( s-1 ); // links if( y ) INC( s-1-size_x ); // links oben if( y<(size_y-1) ) INC( s-1+size_x ); // links unten } if( x<(size_x-1) ) { INC( s+1 ); // rechts if( y ) INC( s+1-size_x ); // rechts oben if( y<(size_y-1) ) INC( s+1+size_x ); // rechts unten } if( y ) INC( s-size_x ); // oben if( y<(size_y-1) ) INC( s+size_x ); // unten } } // Felder bedecken s = spielfeld; i = j; while( i-- ) { *s++ |= 128; } // Anfangsfläche freilegen: (0,0) sicher frei (s.o.) uncover_flaeche( 0, 0 ); // Rest des Spielfelds aufbauen s = spielfeld; for( i=0; i Feld freilegen */ *inhalt &= 15; draw_field( x, y, *inhalt ); change_flagcounter( +1 ); } /* Zeitstrafe: 5% von gesamtzeit */ time_counter -= 0.05 * gesamtzeit; if( time_counter < 1 ) time_counter = 1; } }