summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/games/sfcave/sfcave.cpp101
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
@@ -9,11 +9,12 @@
#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
@@ -136,6 +137,10 @@ SFCave :: SFCave( int spd, QWidget *w, char *name )
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;
@@ -683,10 +688,19 @@ void SFCave :: draw()
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 = "Press r to replay";
+ p.drawText( (sWidth/2) - (fm.width( text )/2), 150, text );
- text = "or press OK for menu";
- p.drawText( (sWidth/2) - (fm.width( text )/2), 155, 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 ++;
@@ -867,6 +881,14 @@ void SFCave :: keyReleaseEvent( QKeyEvent *e )
if ( state == STATE_CRASHED )
state = STATE_NEWGAME;
break;
+
+ case Qt::Key_S:
+ saveReplay();
+ break;
+
+ case Qt::Key_L:
+ loadReplay();
+ break;
default:
e->ignore();
break;
@@ -1001,3 +1023,74 @@ void SFCave :: saveScore()
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