-rw-r--r-- | noncore/games/sfcave/sfcave.cpp | 367 | ||||
-rw-r--r-- | noncore/games/sfcave/sfcave.h | 10 |
2 files changed, 219 insertions, 158 deletions
diff --git a/noncore/games/sfcave/sfcave.cpp b/noncore/games/sfcave/sfcave.cpp index d551afe..0160d34 100644 --- a/noncore/games/sfcave/sfcave.cpp +++ b/noncore/games/sfcave/sfcave.cpp @@ -1,146 +1,156 @@ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #ifdef QWS #include <qpe/qpeapplication.h> #include <qpe/config.h> #else #include <qapplication.h> #endif #include <qdir.h> #include "helpwindow.h" #include "sfcave.h" #define CAPTION "SFCave 1.10 by AndyQ" #define UP_THRUST 0.6 #define NO_THRUST 0.8 #define MAX_DOWN_THRUST 4.0 #define MAX_UP_THRUST -3.5 // States #define STATE_BOSS 0 #define STATE_RUNNING 1 #define STATE_CRASHING 2 #define STATE_CRASHED 3 #define STATE_NEWGAME 4 #define STATE_MENU 5 #define STATE_REPLAY 6 // Menus #define MENU_MAIN_MENU 0 #define MENU_OPTIONS_MENU 1 +#define MENU_REPLAY_MENU 2 // Main Menu Options #define MENU_START_GAME 0 -#define MENU_OPTIONS 1 -#define MENU_HELP 2 -#define MENU_QUIT 3 +#define MENU_REPLAY 1 +#define MENU_OPTIONS 2 +#define MENU_HELP 3 +#define MENU_QUIT 4 // Option Menu Options #define MENU_GAME_TYPE 0 #define MENU_GAME_DIFFICULTY 1 #define MENU_CLEAR_HIGHSCORES 2 #define MENU_BACK 3 +// Replay Menu Options +#define MENU_REPLAY_START 0 +#define MENU_REPLAY_LOAD 1 +#define MENU_REPLAY_SAVE 2 +#define MENU_REPLAY_BACK 3 + #define NR_GAME_DIFFICULTIES 3 #define NR_GAME_TYPES 3 #define DIFICULTY_EASY 0 #define DIFICULTY_NORMAL 1 #define DIFICULTY_HARD 2 #define EASY "Easy" #define NORMAL "Normal" #define HARD "Hard" #define SFCAVE_GAME_TYPE 0 #define GATES_GAME_TYPE 1 #define FLY_GAME_TYPE 2 #define SFCAVE_GAME "SFCave" #define GATES_GAME "Gates" #define FLY_GAME "Fly" #define CURRENT_GAME_TYPE gameTypes[currentGameType] #define CURRENT_GAME_DIFFICULTY difficultyOption[currentGameDifficulty]; QString SFCave::dificultyOption[] = { EASY, NORMAL, HARD }; QString SFCave::gameTypes[] = { SFCAVE_GAME, GATES_GAME, FLY_GAME }; -QString SFCave::menuOptions[2][5] = { { "Start Game", "Options", "Help", "Quit", "" }, - { "Game Type - %s", "Game Difficulty - %s", "Clear High Scores for this game", "Back", "" } }; +QString SFCave::menuOptions[NR_MENUS][MAX_MENU_OPTIONS] = { { "Start Game", "Replays", "Options", "Help", "Quit", "", "", "" }, + { "Game Type - %s", "Game Difficulty - %s", "Clear High Scores for this game", "Back", "", "", "", "" }, + { "Play Reply", "Load Replay", "Save Replay", "Back", "", "", "", "" } }; +int SFCave::nrMenuOptions[NR_MENUS] = { 5, 4, 4 }; +int SFCave ::currentMenuOption[NR_MENUS] = { 0, 0, 0 }; + #define UP_THRUST 0.6 #define NO_THRUST 0.8 #define MAX_DOWN_THRUST 4.0 #define MAX_UP_THRUST -3.5 double SFCave::UpThrustVals[3][3] = {{ 0.6, 0.6, 0.6 }, // SFCave { 0.6, 0.6, 0.8 }, // Gates { 0.4, 0.7, 1.0 } }; // Fly double SFCave::DownThrustVals[3][3] = {{ 0.8, 0.8, 0.8 }, // SFCave { 0.8, 0.8, 1.0 }, // Gates { 0.4, 0.7, 1.0 } }; // Fly double SFCave::MaxUpThrustVals[3][3] = {{ -3.5, -3.5, -3.5 }, // SFCave { -3.5, -4.0, -5.0 }, // Gates { -3.5, -4.0, -5.0 } }; // Fly double SFCave::MaxDownThrustVals[3][3] = {{ 4.0, 4.0, 4.0 }, // SFCave { 4.0, 5.0, 5.5 }, // Gates { 3.5, 4.0, 5.0 } }; // Fly int SFCave::initialGateGaps[] = { 75, 50, 25 }; -int SFCave::nrMenuOptions[2] = { 4, 4 }; -int SFCave ::currentMenuOption[2] = { 0, 0 }; bool movel; int main( int argc, char *argv[] ) { movel = true; #ifdef QWS QPEApplication a( argc, argv ); #else QApplication a( argc, argv ); #endif int speed = 3; for ( int i = 0 ; i < argc ; ++i ) { if ( strcmp( argv[i], "-s" ) == 0 ) { if ( i+1 < argc ) speed = atoi( argv[i+1] ); } } SFCave app( speed ); a.setMainWidget( &app ); app.show(); app.start(); a.exec(); } SFCave :: SFCave( int spd, QWidget *w, char *name ) : QMainWindow( w, name ) { replayIt = 0; #ifdef QWS showMaximized(); #else resize( 240, 284 ); #endif replayFile = QDir::home().path(); replayFile += "/sfcave.replay"; printf( "%s\n", (const char *)replayFile ); sWidth = width(); sHeight = height(); segSize = sWidth/(MAPSIZE-1)+1; @@ -647,459 +657,508 @@ void SFCave :: draw() // p.drawLine( (11*segSize) - (offset*speed), 0, ((11)*segSize)-(offset*speed), sHeight ); // p.setPen( Qt::white ); // Draw user p.drawRect( user ); // Draw trails for ( int i = 0 ; i < TRAILSIZE ; ++i ) if ( trail[i].x() >= 0 ) p.drawRect( trail[i].x(), trail[i].y(), 2, 2 ); // Draw blocks for ( int i = 0 ; i < BLOCKSIZE ; ++i ) if ( blocks[i].y() != -1 ) { p.fillRect( blocks[i], Qt::black ); p.drawRect( blocks[i] ); } // draw score QString s; s.sprintf( "score %06d high score %06d", score, highestScore[currentGameType][currentGameDifficulty] ); p.drawText( 5, 10, s ); if ( state == STATE_CRASHING || state == STATE_CRASHED ) { // add next crash line if ( crashLineLength != -1 ) { for ( int i = 0 ; i < 36 ; ++i ) { int x = (int)(user.x() + (crashLineLength+nextInt(10)) * cos( (M_PI/180) * (10.0 * i) ) ); int y = (int)(user.y() + (crashLineLength+nextInt(10)) * sin( (M_PI/180) * (10.0 * i) ) ); p.drawLine( user.x(), user.y(), x, y ); } } if ( state == STATE_CRASHING && crashLineLength >= 15 ) //|| crashLineLength == -1) ) state = STATE_CRASHED; if ( state == STATE_CRASHED ) { QString text = "Press up or down to start"; p.drawText( (sWidth/2) - (fm.width( text )/2), 120, text ); text = "Press OK for menu"; p.drawText( (sWidth/2) - (fm.width( text )/2), 135, text ); - +/* text = "Press r to replay"; p.drawText( (sWidth/2) - (fm.width( text )/2), 150, text ); text = "Press s to save the replay"; p.drawText( (sWidth/2) - (fm.width( text )/2), 165, text ); text = "Press r to load a saved replay"; p.drawText( (sWidth/2) - (fm.width( text )/2), 180, text ); +*/ } else crashLineLength ++; } p.end(); bitBlt( this, 0, 0, offscreen, 0, 0, sWidth, sHeight, Qt::CopyROP, true ); //printf( "endpaint\n" ); } void SFCave :: handleKeys() { // Find enpty trail and move others bool done = false; for ( int i = 0 ; i < TRAILSIZE ; ++i ) { if ( trail[i].x() < 0 ) { if ( !done ) { trail[i].setX( user.x() - 5 ); trail[i].setY( user.y() ); done = true; } } else { trail[i].setX( trail[i].x() - (2) ); } } if ( speed <= 3 ) { if ( press ) thrust -= thrustUp; else thrust += noThrust; if ( thrust > maxDownThrust ) thrust = maxDownThrust; else if ( thrust < maxUpThrust ) thrust = maxUpThrust; } else { if ( press ) thrust -= 0.5; else thrust += 0.8; if ( thrust > 5.0 ) thrust = 5.0; else if ( thrust < -3.5 ) thrust = -3.5; } user.moveBy( 0, (int)thrust ); } void SFCave :: keyPressEvent( QKeyEvent *e ) { if ( state == STATE_MENU ) - { - switch( e->key() ) - { - case Qt::Key_Down: - currentMenuOption[currentMenuNr] ++; - if ( menuOptions[currentMenuNr][currentMenuOption[currentMenuNr]] == "" ) - currentMenuOption[currentMenuNr] = 0; - break; - case Qt::Key_Up: - currentMenuOption[currentMenuNr] --; - if ( currentMenuOption[currentMenuNr] < 0 ) - currentMenuOption[currentMenuNr] = nrMenuOptions[currentMenuNr]-1; - break; - - case Qt::Key_Left: - if ( currentMenuNr == MENU_OPTIONS_MENU ) - { - if ( currentMenuOption[currentMenuNr] == MENU_GAME_TYPE ) - { - currentGameType --; - if ( currentGameType < 0 ) - currentGameType = NR_GAME_TYPES - 1; - } - else if ( currentMenuOption[currentMenuNr] == MENU_GAME_DIFFICULTY ) - { - currentGameDifficulty --; - if ( currentGameDifficulty < 0 ) - currentGameDifficulty = NR_GAME_DIFFICULTIES - 1; - } - } - break; - - case Qt::Key_Right: - if ( currentMenuNr == MENU_OPTIONS_MENU ) - { - if ( currentMenuOption[currentMenuNr] == MENU_GAME_TYPE ) - { - currentGameType ++; - if ( currentGameType == NR_GAME_TYPES ) - currentGameType = 0; - } - else if ( currentMenuOption[currentMenuNr] == MENU_GAME_DIFFICULTY ) - { - currentGameDifficulty ++; - if ( currentGameDifficulty == NR_GAME_DIFFICULTIES ) - currentGameDifficulty = 0; - } - } - break; - - case Qt::Key_Space: - case Qt::Key_Return: - case Qt::Key_Enter: - dealWithMenuSelection(); - break; - } - } + handleMenuKeys( e ); else { switch( e->key() ) { case Qt::Key_Up: case Qt::Key_F9: case Qt::Key_Space: if ( !replay && !press ) { press = true; replayList.append( new int( nrFrames ) ); } break; case Qt::Key_M: case Qt::Key_Return: case Qt::Key_Enter: if ( state == STATE_CRASHED ) + { state = STATE_MENU; + currentMenuNr = 0; + currentMenuOption[currentMenuNr] = 0; + } break; case Qt::Key_Z: showScoreZones = !showScoreZones; break; default: e->ignore(); break; } } } void SFCave :: keyReleaseEvent( QKeyEvent *e ) { if ( state == STATE_MENU ) { } else { switch( e->key() ) { case Qt::Key_F9: case Qt::Key_Space: case Qt::Key_Up: if ( !replay && press ) { press = false; replayList.append( new int( nrFrames ) ); } break; case Qt::Key_R: if ( state == STATE_CRASHED ) { state = STATE_REPLAY; } break; case Qt::Key_Down: if ( state == STATE_CRASHED ) state = STATE_NEWGAME; break; case Qt::Key_S: if ( state == STATE_CRASHED ) saveReplay(); break; case Qt::Key_L: if ( state == STATE_CRASHED ) loadReplay(); break; default: e->ignore(); break; } } } + +void SFCave :: saveScore() +{ +#ifdef QWS + Config cfg( "sfcave" ); + cfg.setGroup( "settings" ); + QString key = "highScore_"; + + cfg.writeEntry( key + gameTypes[currentGameType] + "_" + dificultyOption[currentGameDifficulty], highestScore[currentGameType][currentGameDifficulty] ); + key += CURRENT_GAME_TYPE; + cfg.writeEntry( key, highestScore[currentGameType] ); +#endif +} + +void SFCave :: saveReplay() +{ + FILE *out; + out = fopen( (const char *)replayFile, "w" ); + if ( !out ) + { + printf( "Couldn't write to /home/root/sfcave.replay\n" ); + return; + } + + // Build up string of values + // Format is:: <landscape seed> <game type> <difficulty> <framenr> <framenr>....... + QString val; + val.sprintf( "%d %d %d ", currentSeed, currentGameType, currentGameDifficulty ); + + QListIterator<int> it( replayList ); + while( it.current() ) + { + QString tmp; + tmp.sprintf( "%d ", (*it.current()) ); + val += tmp; + + ++it; + } + val += "\n"; + + QString line; + line.sprintf( "%d\n", val.length() ); + fwrite( (const char *)line, 1, line.length(), out ); + + fwrite( (const char *)val, 1, val.length(), out ); + + fclose( out ); + + printf( "Replay saved to %s\n", (const char *)replayFile ); + +} + +void SFCave :: loadReplay() +{ + FILE *in = fopen( (const char *)replayFile, "r" ); + + if ( in == 0 ) + { + printf( "Couldn't load replay file!\n" ); + return; + } + + // Read next line - contains the size of the options + char line[10+1]; + fgets( line, 10, in ); + + int length = -1; + sscanf( line, "%d", &length ); + char *data = new char[length+1]; + + fread( data, 1, length, in ); +// printf( "data - %s", data ); + + QString sep = " "; + QStringList list = QStringList::split( sep, QString( data ) ); + + // print it out + QStringList::Iterator it = list.begin(); + currentSeed = (*it).toInt(); + ++it; + currentGameType = (*it).toInt(); + ++it; + currentGameDifficulty = (*it).toInt(); + ++it; + + replayList.clear(); + for ( ; it != list.end(); ++it ) + { + int v = (*it).toInt(); + replayList.append( new int( v ) ); + } + + delete data; + + fclose( in ); + + printf( "Replay loaded from %s\n", (const char *)replayFile ); +} + + +//--------------- MENU CODE --------------------- +void SFCave :: handleMenuKeys( QKeyEvent *e ) +{ + switch( e->key() ) + { + case Qt::Key_Down: + currentMenuOption[currentMenuNr] ++; + if ( menuOptions[currentMenuNr][currentMenuOption[currentMenuNr]] == "" ) + currentMenuOption[currentMenuNr] = 0; + break; + case Qt::Key_Up: + currentMenuOption[currentMenuNr] --; + if ( currentMenuOption[currentMenuNr] < 0 ) + currentMenuOption[currentMenuNr] = nrMenuOptions[currentMenuNr]-1; + break; + + case Qt::Key_Left: + if ( currentMenuNr == MENU_OPTIONS_MENU ) + { + if ( currentMenuOption[currentMenuNr] == MENU_GAME_TYPE ) + { + currentGameType --; + if ( currentGameType < 0 ) + currentGameType = NR_GAME_TYPES - 1; + } + else if ( currentMenuOption[currentMenuNr] == MENU_GAME_DIFFICULTY ) + { + currentGameDifficulty --; + if ( currentGameDifficulty < 0 ) + currentGameDifficulty = NR_GAME_DIFFICULTIES - 1; + } + } + break; + + case Qt::Key_Right: + if ( currentMenuNr == MENU_OPTIONS_MENU ) + { + if ( currentMenuOption[currentMenuNr] == MENU_GAME_TYPE ) + { + currentGameType ++; + if ( currentGameType == NR_GAME_TYPES ) + currentGameType = 0; + } + else if ( currentMenuOption[currentMenuNr] == MENU_GAME_DIFFICULTY ) + { + currentGameDifficulty ++; + if ( currentGameDifficulty == NR_GAME_DIFFICULTIES ) + currentGameDifficulty = 0; + } + } + break; + + case Qt::Key_Space: + case Qt::Key_Return: + case Qt::Key_Enter: + dealWithMenuSelection(); + break; + } +} + void SFCave :: displayMenu() { offscreen->fill( Qt::black ); QPainter p( offscreen ); p.setPen( Qt::white ); QFont f( "Helvetica", 16 ); p.setFont( f ); QFontMetrics fm = p.fontMetrics(); QString text = "SFCave"; p.drawText( (sWidth/2) - (fm.width( text )/2), 60, text ); text = "Written by Andy Qua"; p.drawText( (sWidth/2) - (fm.width( text )/2), 85, text ); // Draw options - int pos = 170; + int pos = 140; for ( int i = 0 ; menuOptions[currentMenuNr][i] != "" ; ++i, pos += 25 ) { if ( currentMenuOption[currentMenuNr] == i ) p.setPen( Qt::yellow ); else p.setPen( Qt::white ); QString text; if ( menuOptions[currentMenuNr][i].find( "%s" ) != -1 ) { QString val; if ( i == MENU_GAME_TYPE ) val = gameTypes[currentGameType]; else val = dificultyOption[currentGameDifficulty]; text.sprintf( (const char *)menuOptions[currentMenuNr][i], (const char *)val ); } else text = menuOptions[currentMenuNr][i]; p.drawText( (sWidth/2) - (fm.width( text )/2), pos, text ); } p.end(); bitBlt( this, 0, 0, offscreen, 0, 0, sWidth, sHeight, Qt::CopyROP, true ); } void SFCave :: dealWithMenuSelection() { switch( currentMenuNr ) { case MENU_MAIN_MENU: { switch( currentMenuOption[currentMenuNr] ) { case MENU_START_GAME: state = STATE_NEWGAME; break; + case MENU_REPLAY: + currentMenuNr = MENU_REPLAY_MENU; + currentMenuOption[currentMenuNr] = 0; + break; + case MENU_OPTIONS: currentMenuNr = MENU_OPTIONS_MENU; currentMenuOption[currentMenuNr] = 0; break; case MENU_HELP: { // Display Help Menu HelpWindow *dlg = new HelpWindow( this ); dlg->exec(); delete dlg; break; } - + case MENU_QUIT: QApplication::exit(); break; } break; } case MENU_OPTIONS_MENU: { switch( currentMenuOption[currentMenuNr] ) { case MENU_GAME_TYPE: break; - + case MENU_GAME_DIFFICULTY: break; case MENU_CLEAR_HIGHSCORES: for ( int i = 0 ; i < 3 ; ++i ) highestScore[currentGameType][i] = 0; break; - + case MENU_BACK: currentMenuNr = MENU_MAIN_MENU; #ifdef QWS Config cfg( "sfcave" ); cfg.setGroup( "settings" ); cfg.writeEntry( "difficulty", currentGameDifficulty ); cfg.writeEntry( "gameType", currentGameType ); #endif break; } break; } - } -} -void SFCave :: saveScore() -{ -#ifdef QWS - Config cfg( "sfcave" ); - cfg.setGroup( "settings" ); - QString key = "highScore_"; + case MENU_REPLAY_MENU: + { + switch( currentMenuOption[currentMenuNr] ) + { + case MENU_REPLAY_START: + if ( currentSeed != 0 ) + state = STATE_REPLAY; + // Display No Replay + break; - cfg.writeEntry( key + gameTypes[currentGameType] + "_" + dificultyOption[currentGameDifficulty], highestScore[currentGameType][currentGameDifficulty] ); - key += CURRENT_GAME_TYPE; - cfg.writeEntry( key, highestScore[currentGameType] ); -#endif -} + case MENU_REPLAY_LOAD: + loadReplay(); + break; -void SFCave :: saveReplay() -{ - FILE *out; - out = fopen( (const char *)replayFile, "w" ); - if ( !out ) - { - printf( "Couldn't write to /home/root/sfcave.replay\n" ); - return; - } + case MENU_REPLAY_SAVE: + saveReplay(); + break; - // Build up string of values - // Format is:: <landscape seed> <framenr> <framenr>....... - QString val; - val.sprintf( "%d ", currentSeed ); - - QListIterator<int> it( replayList ); - while( it.current() ) - { - QString tmp; - tmp.sprintf( "%d ", (*it.current()) ); - val += tmp; + case MENU_REPLAY_BACK: + currentMenuNr = MENU_MAIN_MENU; + break; - ++it; + } + } } - val += "\n"; - - QString line; - line.sprintf( "%d\n", val.length() ); - fwrite( (const char *)line, 1, line.length(), out ); - fwrite( (const char *)val, 1, val.length(), out ); - - fclose( out ); - - printf( "Replay saved to %s\n", (const char *)replayFile ); - } -void SFCave :: loadReplay() -{ - FILE *in = fopen( (const char *)replayFile, "r" ); - - if ( in == 0 ) - { - printf( "Couldn't load replay file!\n" ); - return; - } - // Read size of next line - char line[10+1]; - fgets( line, 10, in ); - - int length = -1; - sscanf( line, "%d", &length ); - char *data = new char[length+1]; - - fread( data, 1, length, in ); - - QString sep = " "; - QStringList list = QStringList::split( sep, QString( data ) ); - - // print it out - QStringList::Iterator it = list.begin(); - currentSeed = (*it).toInt(); - ++it; - - replayList.clear(); - for ( ; it != list.end(); ++it ) - { - int v = (*it).toInt(); - replayList.append( new int( v ) ); - } - - delete data; - - fclose( in ); - - printf( "Replay loaded from %s\n", (const char *)replayFile ); -}
\ No newline at end of file diff --git a/noncore/games/sfcave/sfcave.h b/noncore/games/sfcave/sfcave.h index 238a615..65e5ae4 100644 --- a/noncore/games/sfcave/sfcave.h +++ b/noncore/games/sfcave/sfcave.h @@ -1,121 +1,123 @@ #include <qmainwindow.h> #include <qpainter.h> #include <qpixmap.h> #include <qpoint.h> #include <qrect.h> #include <qtimer.h> #include <qlist.h> #include "random.h" #define MAPSIZE 52 #define BLOCKSIZE 6 #define TRAILSIZE 30 - +#define NR_MENUS 3 +#define MAX_MENU_OPTIONS 8 class SFCave : public QMainWindow { Q_OBJECT public: int sWidth; int sHeight; int segSize; int currentSeed; QList<int> replayList; QListIterator<int> *replayIt; bool replay; QString replayFile; int blockWidth; int blockHeight; int gapHeight; int state; int prevState; int speed; int crashLineLength; static double UpThrustVals[3][3]; static double DownThrustVals[3][3]; static double MaxUpThrustVals[3][3]; static double MaxDownThrustVals[3][3]; static int initialGateGaps[]; double thrustUp; double noThrust; double maxUpThrust; double maxDownThrust; int gateDistance; int nextGate; int lastGateBottomY; - static QString menuOptions[2][5]; + static QString menuOptions[NR_MENUS][MAX_MENU_OPTIONS]; int currentMenuNr; - static int nrMenuOptions[2]; - static int currentMenuOption[2]; + static int nrMenuOptions[NR_MENUS]; + static int currentMenuOption[NR_MENUS]; static QString dificultyOption[3]; static QString gameTypes[3]; int currentGameType; int currentGameDifficulty; QPixmap *offscreen; QTimer *gameTimer; int score; int highestScore[3][3]; int mapTop[MAPSIZE]; int mapBottom[MAPSIZE]; QRect blocks[BLOCKSIZE]; QRect user; QPoint trail[TRAILSIZE]; int offset; int maxHeight; int nrFrames; int dir; bool showScoreZones; bool press; double thrust; bool running; SFCave( int speed = 3, QWidget *p = 0, char *name = 0 ); ~SFCave(); void start(); void setSeed( int seed ); int nextInt( int range ); void setUp(); void handleGameSFCave(); void handleGameGates(); void handleGameFly(); bool checkFlyGameCollision(); void moveFlyGameLandscape(); void setFlyPoint( int point ); bool checkCollision(); void moveLandscape(); void addBlock(); void addGate(); void setPoint( int point ); void drawBoss(); void draw(); void handleKeys(); + void handleMenuKeys( QKeyEvent * e ); void displayMenu(); void dealWithMenuSelection(); void keyPressEvent( QKeyEvent *e ); void keyReleaseEvent( QKeyEvent *e ); void saveScore(); void saveReplay(); void loadReplay(); private slots: void run(); }; |