-rw-r--r-- | noncore/games/sfcave/sfcave.cpp | 101 |
1 files changed, 97 insertions, 4 deletions
diff --git a/noncore/games/sfcave/sfcave.cpp b/noncore/games/sfcave/sfcave.cpp index b5bc736..93f5f82 100644 --- a/noncore/games/sfcave/sfcave.cpp +++ b/noncore/games/sfcave/sfcave.cpp @@ -1,28 +1,29 @@ #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.8 by AndyQ" +#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 @@ -127,24 +128,28 @@ int main( int argc, char *argv[] ) 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; currentMenuNr = 0; currentGameType = 0; currentGameDifficulty = 0; setCaption( CAPTION ); showScoreZones = false; #ifdef QWS @@ -674,28 +679,37 @@ void SFCave :: draw() { 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), 140, text ); + 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 = "or press OK for menu"; - p.drawText( (sWidth/2) - (fm.width( text )/2), 155, 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() { @@ -858,24 +872,32 @@ void SFCave :: keyReleaseEvent( QKeyEvent *e ) 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: + saveReplay(); + break; + + case Qt::Key_L: + loadReplay(); + break; default: e->ignore(); break; } } } void SFCave :: displayMenu() { offscreen->fill( Qt::black ); @@ -992,12 +1014,83 @@ void SFCave :: dealWithMenuSelection() 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> <framenr> <framenr>....... + QString val; + val.sprintf( "%d ", currentSeed ); + + 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" ); + + // 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 ); +}
\ No newline at end of file |