summaryrefslogtreecommitdiff
authorandyq <andyq>2002-12-11 17:58:53 (UTC)
committer andyq <andyq>2002-12-11 17:58:53 (UTC)
commitf4865ac8e114baedd13c95160631e4574da9dc84 (patch) (side-by-side diff)
treeecc74f212ffde8b9733ad6a7dd9e2360717917ef
parent676f39d78772b19d11471db55ece82262278f942 (diff)
downloadopie-f4865ac8e114baedd13c95160631e4574da9dc84.zip
opie-f4865ac8e114baedd13c95160631e4574da9dc84.tar.gz
opie-f4865ac8e114baedd13c95160631e4574da9dc84.tar.bz2
Added check for no replay file on loading and fixed bugs where you could screw up the replay by pressing stuff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/sfcave/sfcave.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/noncore/games/sfcave/sfcave.cpp b/noncore/games/sfcave/sfcave.cpp
index 93f5f82..d551afe 100644
--- a/noncore/games/sfcave/sfcave.cpp
+++ b/noncore/games/sfcave/sfcave.cpp
@@ -733,364 +733,373 @@ void SFCave :: handleKeys()
}
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;
}
}
else
{
switch( e->key() )
{
case Qt::Key_Up:
case Qt::Key_F9:
case Qt::Key_Space:
- if ( !press )
+ 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;
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 ( press )
+ 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:
- saveReplay();
+ if ( state == STATE_CRASHED )
+ saveReplay();
break;
case Qt::Key_L:
- loadReplay();
+ if ( state == STATE_CRASHED )
+ loadReplay();
break;
default:
e->ignore();
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;
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_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_";
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" );
+ 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