summaryrefslogtreecommitdiff
authorandyq <andyq>2002-12-07 18:07:27 (UTC)
committer andyq <andyq>2002-12-07 18:07:27 (UTC)
commit25debd07f03e4a1b21047ee5d49a3dd811d8352a (patch) (side-by-side diff)
treec25eaa7d0423e733772412bf097e1ab577362fc0
parent2e00687f66fadd9cc4c0f564b5f8ba108084d619 (diff)
downloadopie-25debd07f03e4a1b21047ee5d49a3dd811d8352a.zip
opie-25debd07f03e4a1b21047ee5d49a3dd811d8352a.tar.gz
opie-25debd07f03e4a1b21047ee5d49a3dd811d8352a.tar.bz2
Added dificculty levels to Fly and Gates, bug fixes (height checking), added help menu option and other features
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/sfcave/sfcave.cpp477
-rw-r--r--noncore/games/sfcave/sfcave.h26
2 files changed, 372 insertions, 131 deletions
diff --git a/noncore/games/sfcave/sfcave.cpp b/noncore/games/sfcave/sfcave.cpp
index 8b9c844..788606f 100644
--- a/noncore/games/sfcave/sfcave.cpp
+++ b/noncore/games/sfcave/sfcave.cpp
@@ -1,733 +1,956 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#ifdef QWS
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
#else
#include <qapplication.h>
#endif
+#include "helpwindow.h"
#include "sfcave.h"
-#define CAPTION "SFCave 1.7 by AndyQ"
+#define CAPTION "SFCave 1.8 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_CRASHED 2
-#define STATE_NEWGAME 3
-#define STATE_MENU 4
+#define STATE_CRASHING 2
+#define STATE_CRASHED 3
+#define STATE_NEWGAME 4
+#define STATE_MENU 5
// Menus
#define MENU_MAIN_MENU 0
#define MENU_OPTIONS_MENU 1
// Main Menu Options
#define MENU_START_GAME 0
#define MENU_OPTIONS 1
-#define MENU_QUIT 2
+#define MENU_HELP 2
+#define MENU_QUIT 3
// Option Menu Options
#define MENU_GAME_TYPE 0
-#define MENU_GAME_DIFFICULTY 1
-#define MENU_BACK 2
-
-QString SFCave::menuOptions[2][5] = { { "Start Game", "Options", "Quit", "", "" },
- { "Game Type - %s", "Game Difficulty - %s", "Back", "", "" } };
+#define MENU_GAME_DIFFICULTY 1
+#define MENU_CLEAR_HIGHSCORES 2
+#define MENU_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 };
-#define CURRENT_GAME_TYPE gameTypes[currentGameType]
-#define CURRENT_GAME_DIFFICULTY difficultyOption[currentGameDifficulty];
+QString SFCave::menuOptions[2][5] = { { "Start Game", "Options", "Help", "Quit", "" },
+ { "Game Type - %s", "Game Difficulty - %s", "Clear High Scores for this game", "Back", "" } };
+
+#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 )
{
#ifdef QWS
showMaximized();
#else
resize( 240, 284 );
#endif
sWidth = width();
sHeight = height();
segSize = sWidth/(MAPSIZE-1)+1;
currentMenuNr = 0;
- nrMenuOptions[0] = 3;
- nrMenuOptions[1] = 3;
- currentMenuOption[0] = 0;
- currentMenuOption[1] = 0;
currentGameType = 0;
currentGameDifficulty = 0;
setCaption( CAPTION );
+ showScoreZones = false;
#ifdef QWS
Config cfg( "sfcave" );
cfg.setGroup( "settings" );
QString key = "highScore_";
- highestScore[SFCAVE_GAME_TYPE] = cfg.readNumEntry( key + SFCAVE_GAME, 0 );
- highestScore[GATES_GAME_TYPE] = cfg.readNumEntry( key + GATES_GAME, 0 );
- highestScore[FLY_GAME_TYPE] = cfg.readNumEntry( key + FLY_GAME, 0 );
+
+ for ( int i = 0 ; i < 3 ; ++i )
+ {
+ for ( int j = 0 ; j < 3 ; ++j )
+ highestScore[i][j] = cfg.readNumEntry( key + gameTypes[i] + "_" + dificultyOption[j], 0 );
+ }
+
currentGameType = cfg.readNumEntry( "gameType", 0 );
currentGameDifficulty = cfg.readNumEntry( "difficulty", 0 );
#endif
speed = spd; // Change to 2 for PC
press = false;
offscreen = new QPixmap( sWidth, sHeight );
offscreen->fill( Qt::black );
setUp();
crashLineLength = -1;
gameTimer = new QTimer( this, "game timer" );
connect( gameTimer, SIGNAL( timeout() ),
this, SLOT( run() ) );
}
SFCave :: ~SFCave()
{
}
void SFCave :: start()
{
gameTimer->start( 10 );
}
int SFCave :: nextInt( int range )
{
return rand() % range;
}
void SFCave :: setUp()
{
state = STATE_MENU;
prevState = STATE_MENU;
score = 0;
offset = 0;
- maxHeight = 50;
nrFrames = 0;
dir = 1;
thrust = 0;
+
+ if ( CURRENT_GAME_TYPE == SFCAVE_GAME )
+ {
+ thrustUp = UpThrustVals[SFCAVE_GAME_TYPE][currentGameDifficulty];;
+ noThrust = DownThrustVals[SFCAVE_GAME_TYPE][currentGameDifficulty];;
+ maxUpThrust = MaxUpThrustVals[SFCAVE_GAME_TYPE][currentGameDifficulty];;
+ maxDownThrust = MaxDownThrustVals[SFCAVE_GAME_TYPE][currentGameDifficulty];;
+ }
+ else if ( CURRENT_GAME_TYPE == GATES_GAME )
+ {
+ thrustUp = UpThrustVals[GATES_GAME_TYPE][currentGameDifficulty];;
+ noThrust = DownThrustVals[GATES_GAME_TYPE][currentGameDifficulty];;
+ maxUpThrust = MaxUpThrustVals[GATES_GAME_TYPE][currentGameDifficulty];;
+ maxDownThrust = MaxDownThrustVals[GATES_GAME_TYPE][currentGameDifficulty];;
+ }
+ else
+ {
+ thrustUp = UpThrustVals[FLY_GAME_TYPE][currentGameDifficulty];
+ noThrust = DownThrustVals[FLY_GAME_TYPE][currentGameDifficulty];
+ maxUpThrust = MaxUpThrustVals[FLY_GAME_TYPE][currentGameDifficulty];
+ maxDownThrust = MaxDownThrustVals[FLY_GAME_TYPE][currentGameDifficulty];
+ }
+
crashLineLength = 0;
user.setRect( 50, sWidth/2, 4, 4 );
blockWidth = 20;
blockHeight = 70;
- gapHeight = 125;
+ gapHeight = initialGateGaps[currentGameDifficulty];
gateDistance = 75;
nextGate = nextInt( 50 ) + gateDistance;
for ( int i = 0 ; i < TRAILSIZE ; ++i )
{
trail[i].setX( -1 );
trail[i].setY( 0 );
}
- mapTop[0] = (int)(nextInt(50)) + 5;
- for ( int i = 1 ; i < MAPSIZE ; ++i )
- setPoint( i );
+ if ( CURRENT_GAME_TYPE != FLY_GAME )
+ {
+ maxHeight = 50;
+
+ mapTop[0] = (int)(nextInt(50)) + 5;
+ mapBottom[0] = (int)(nextInt(50)) + 5;
+ for ( int i = 1 ; i < MAPSIZE ; ++i )
+ setPoint( i );
+ }
+ else
+ {
+ maxHeight = 100;
+ for ( int i = 0 ; i < MAPSIZE ; ++i )
+ mapBottom[i] = sHeight - 10;
+ }
for ( int i = 0 ; i < BLOCKSIZE ; ++i )
blocks[i].setY( -1 );
}
void SFCave :: run()
{
- //running = true;
- //setUp();
- switch ( state )
+ switch ( state )
+ {
+ case STATE_MENU:
+ displayMenu();
+ break;
+ case STATE_NEWGAME:
+ setUp();
+ draw();
+ state = STATE_RUNNING;
+ break;
+ case STATE_BOSS:
+ drawBoss();
+ break;
+
+ case STATE_CRASHING:
+ case STATE_CRASHED:
+ draw();
+ break;
+
+ case STATE_RUNNING:
{
- case STATE_MENU:
- displayMenu();
- break;
- case STATE_NEWGAME:
- setUp();
- draw();
- state = STATE_RUNNING;
- break;
- case STATE_BOSS:
- drawBoss();
- break;
+ if ( nrFrames % 2 == 0 )
+ handleKeys();
+
+ // Apply Game rules
+ nrFrames ++;
+ if ( CURRENT_GAME_TYPE == SFCAVE_GAME )
+ handleGameSFCave();
+ else if ( CURRENT_GAME_TYPE == GATES_GAME )
+ handleGameGates();
+ else if ( CURRENT_GAME_TYPE == FLY_GAME )
+ handleGameFly();
+
+ draw();
+ break;
+ }
+ }
+}
- case STATE_CRASHED:
- draw();
- break;
+void SFCave :: handleGameSFCave()
+{
+ // Update score
+ if ( nrFrames % 5 == 0 )
+ score ++;
- case STATE_RUNNING:
- {
- if ( nrFrames % 5 == 0 )
- score ++;
- if ( nrFrames % 2 == 0 )
- handleKeys();
-
- // Apply Game rules
- nrFrames ++;
- if ( CURRENT_GAME_TYPE == SFCAVE_GAME )
- {
- if ( nrFrames % 500 == 0 )
- {
- if ( maxHeight < sHeight - 100 )
- {
- maxHeight += 10;
-
- // Reduce block height
- if ( maxHeight > sHeight - 150 )
- blockHeight -= 5;
- }
- }
+ if ( nrFrames % 500 == 0 )
+ {
+ if ( maxHeight < sHeight - 100 )
+ {
+ maxHeight += 10;
- if ( nrFrames % 100 == 0 )
- addBlock();
- }
- else if ( CURRENT_GAME_TYPE == GATES_GAME )
- {
- // Slightly random gap distance
- if ( nrFrames >= nextGate )
- {
- nextGate = nrFrames + nextInt( 50 ) + gateDistance;
- addGate();
- }
+ // Reduce block height
+ if ( maxHeight > sHeight - 150 )
+ blockHeight -= 5;
+ }
+ }
- if ( nrFrames % 500 == 0 )
- {
- if ( gapHeight > 75 )
- gapHeight -= 5;
- }
- }
- else if ( CURRENT_GAME_TYPE == FLY_GAME )
- {
- }
-
-
- if ( checkCollision() )
- {
- if ( score > highestScore[currentGameType] )
- highestScore[currentGameType] = score;
+ if ( nrFrames % 100 == 0 )
+ addBlock();
-#ifdef QWS
- Config cfg( "sfcave" );
- cfg.setGroup( "settings" );
- QString key = "highScore_";
- key += CURRENT_GAME_TYPE;
- cfg.writeEntry( key, highestScore[currentGameType] );
-#endif
+ if ( checkCollision() )
+ {
+ if ( score > highestScore[currentGameType][currentGameDifficulty] )
+ {
+ highestScore[currentGameType][currentGameDifficulty] = score;
+ saveScore();
+ }
+ state = STATE_CRASHING;
+ }
+ else
+ {
+ moveLandscape();
+ }
- state = STATE_CRASHED;
- }
- else
- {
- if ( movel )
- moveLandscape();
- //movel = false;
- }
+}
- draw();
- break;
- }
+
+void SFCave :: handleGameGates()
+{
+ // Update score
+ if ( nrFrames % 5 == 0 )
+ score ++;
+
+ // Slightly random gap distance
+ if ( nrFrames >= nextGate )
+ {
+ nextGate = nrFrames + nextInt( 50 ) + gateDistance;
+ addGate();
+ }
+
+ if ( nrFrames % 500 == 0 )
+ {
+ if ( gapHeight > 75 )
+ gapHeight -= 5;
+ }
+
+ if ( checkCollision() )
+ {
+ if ( score > highestScore[currentGameType][currentGameDifficulty] )
+ {
+ highestScore[currentGameType][currentGameDifficulty] = score;
+ saveScore();
+ }
+ state = STATE_CRASHING;
+ }
+ else
+ {
+ moveLandscape();
+ }
+
+}
+
+void SFCave :: handleGameFly()
+{
+ if ( nrFrames % 4 == 0 )
+ {
+ // Update score
+ // get distance between landscape and ship
+ int diff = mapBottom[10] - user.y();
+
+ // the closer the difference is to 0 means more points
+ if ( diff < 10 )
+ score += 5;
+ else if ( diff < 20 )
+ score += 3;
+ else if ( diff < 30 )
+ score += 2;
+ else if ( diff < 40 )
+ score += 1;
+ }
+
+ if ( checkFlyGameCollision() )
+ {
+ if ( score > highestScore[currentGameType][currentGameDifficulty] )
+ {
+ highestScore[currentGameType][currentGameDifficulty] = score;
+ saveScore();
}
+ state = STATE_CRASHING;
+ }
+ else
+ {
+ moveFlyGameLandscape();
+ }
+}
+
+bool SFCave :: checkFlyGameCollision()
+{
+ if ( (user.y() + user.width()) >= mapBottom[11] )
+ return true;
+
+ return false;
+}
+
+void SFCave :: moveFlyGameLandscape()
+{
+ offset++;
+
+ if ( offset >= segSize )
+ {
+ offset = 0;
+ for ( int i = 0 ; i < MAPSIZE-speed ; ++i )
+ mapBottom[i] = mapBottom[i+speed];
+
+ for ( int i = speed ; i > 0 ; --i )
+ setFlyPoint( MAPSIZE-i );
+ }
+}
+
+void SFCave :: setFlyPoint( int point )
+{
+ static int fly_difficulty_levels[] = { 5, 10, 15 };
+ if ( nextInt(100) >= 75 )
+ dir *= -1;
+
+ int prevPoint = mapBottom[point-1];
+
+ int nextPoint = prevPoint + (dir * nextInt( fly_difficulty_levels[currentGameDifficulty] ) );
+
+ if ( nextPoint > sHeight )
+ {
+ nextPoint = sHeight;
+ dir *= -1;
+ }
+ else if ( nextPoint < maxHeight )
+ {
+ nextPoint = maxHeight;
+ dir *= 1;
+ }
+
+ mapBottom[point] = nextPoint;
}
bool SFCave :: checkCollision()
{
- if ( (user.y() + user.width()) >= mapBottom[10] || user.y() <= mapTop[10] )
+ if ( (user.y() + user.width()) >= mapBottom[11] || user.y() <= mapTop[11] )
return true;
for ( int i = 0 ; i < BLOCKSIZE ; ++i )
{
if ( blocks[i].y() != -1 )
{
if ( blocks[i].intersects( user ) )
return true;
}
}
return false;
}
void SFCave :: moveLandscape()
{
offset++;
if ( offset >= segSize )
{
offset = 0;
for ( int i = 0 ; i < MAPSIZE-speed ; ++i )
{
mapTop[i] = mapTop[i+speed];
mapBottom[i] = mapBottom[i+speed];
}
for ( int i = speed ; i > 0 ; --i )
setPoint( MAPSIZE-i );
}
for ( int i = 0 ; i < BLOCKSIZE ; ++i )
{
if ( blocks[i].y() != -1 )
{
blocks[i].moveBy( -speed, 0 );
if ( blocks[i].x() + blocks[i].width() < 0 )
blocks[i].setY( -1 );
}
}
}
void SFCave :: addBlock()
{
for ( int i = 0 ; i < BLOCKSIZE ; ++i )
{
if ( blocks[i].y() == -1 )
{
int x = sWidth;
int y = mapTop[50] + (int)(nextInt(mapBottom[50] - mapTop[50] - blockHeight));
blocks[i].setRect( x, y, blockWidth, blockHeight );
break;
}
}
}
void SFCave :: addGate()
{
for ( int i = 0 ; i < BLOCKSIZE ; ++i )
{
if ( blocks[i].y() == -1 )
{
int x1 = sWidth;
int y1 = mapTop[50];
- int b1Height = nextInt(mapBottom[50] - mapTop[50] - gateDistance);
+ int b1Height = nextInt(mapBottom[50] - mapTop[50] - gapHeight);
// See if height between last gate and this one is too big
if ( b1Height - 200 > lastGateBottomY )
b1Height -= 25;
else if ( b1Height + 200 < lastGateBottomY )
b1Height += 25;
lastGateBottomY = b1Height;
int x2 = sWidth;
- int y2 = y1 + b1Height + gateDistance;
+ int y2 = y1 + b1Height + gapHeight;
int b2Height = mapBottom[50] - y2;
blocks[i].setRect( x1, y1, blockWidth, b1Height );
blocks[i+1].setRect( x2, y2, blockWidth, b2Height );
break;
}
}
}
void SFCave :: setPoint( int point )
{
if ( nextInt(100) >= 80 )
dir *= -1;
mapTop[point] = mapTop[point-1] + (dir * nextInt( 5 ) );
if ( mapTop[point] < 0 )
{
mapTop[point] = 0;
dir *= -1;
}
else if ( mapTop[point] >= maxHeight )
{
mapTop[point] = maxHeight;
dir *= -1;
}
- mapBottom[point] = sHeight - (maxHeight - mapBottom[point]);
+// mapBottom[point] = sHeight - (maxHeight - mapBottom[point]);
mapBottom[point] = sHeight - (maxHeight - mapTop[point]);
}
void SFCave :: drawBoss()
{
offscreen->fill( Qt::black );
bitBlt( this, 0, 0, offscreen, 0, 0, sWidth, sHeight, Qt::CopyROP, true );
}
void SFCave :: draw()
{
//printf( "Paint\n" );
offscreen->fill( Qt::black );
QPainter p( offscreen );
QFontMetrics fm = p.fontMetrics();
p.setPen( Qt::white );
for ( int i = 0 ; i < MAPSIZE -3; ++i )
{
- p.drawLine( (i*segSize) - (offset*speed), mapTop[i], ((i+1)*segSize)-(offset*speed), mapTop[i+1] );
+ // Only display top landscape if not running FLY_GAME
+ if ( CURRENT_GAME_TYPE != FLY_GAME )
+ p.drawLine( (i*segSize) - (offset*speed), mapTop[i], ((i+1)*segSize)-(offset*speed), mapTop[i+1] );
+
p.drawLine( (i*segSize) - (offset*speed), mapBottom[i], ((i+1)*segSize)-(offset*speed), mapBottom[i+1] );
+
+ if ( CURRENT_GAME_TYPE == FLY_GAME && showScoreZones )
+ {
+ p.setPen( Qt::red );
+ p.drawLine( (i*segSize) - (offset*speed), mapBottom[i]-10, ((i+1)*segSize)-(offset*speed), mapBottom[i+1]-10 );
+ p.drawLine( (i*segSize) - (offset*speed), mapBottom[i]-20, ((i+1)*segSize)-(offset*speed), mapBottom[i+1]-20 );
+ p.drawLine( (i*segSize) - (offset*speed), mapBottom[i]-30, ((i+1)*segSize)-(offset*speed), mapBottom[i+1]-30 );
+ p.drawLine( (i*segSize) - (offset*speed), mapBottom[i]-40, ((i+1)*segSize)-(offset*speed), mapBottom[i+1]-40 );
+ p.setPen( Qt::white );
+ }
}
+ // Uncomment this to show user segment (usful for checking collision boundary with landscape
+// p.setPen( Qt::red );
+// 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] );
+ s.sprintf( "score %06d high score %06d", score, highestScore[currentGameType][currentGameDifficulty] );
p.drawText( 5, 10, s );
- if ( state == STATE_CRASHED )
+ 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 ( crashLineLength >= 15 || crashLineLength == -1 )
+ 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 );
text = "or press OK for menu";
p.drawText( (sWidth/2) - (fm.width( text )/2), 155, text );
-// p.drawText( 70, 140, QString( "Press down to start" ) );
}
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 -= 0.6;
+ thrust -= thrustUp;
else
- thrust += 0.8;
+ thrust += noThrust;
- if ( thrust > 4.0 )
- thrust = 4.0;
- else if ( thrust < -3.5 )
- thrust = -3.5;
+ 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:
press = true;
break;
case Qt::Key_M:
case Qt::Key_Return:
case Qt::Key_Enter:
- if ( state == STATE_CRASHED && crashLineLength >= 15 || crashLineLength == -1 )
+ 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:
press = false;
break;
case Qt::Key_Up:
press = false;
case Qt::Key_R:
case Qt::Key_Down:
- if ( state == STATE_CRASHED && crashLineLength >= 15 || crashLineLength == -1 )
+ if ( state == STATE_CRASHED )
{
state = STATE_NEWGAME;
}
else
movel = true;
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:
+ 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;
}
}
-} \ No newline at end of file
+}
+
+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
+}
diff --git a/noncore/games/sfcave/sfcave.h b/noncore/games/sfcave/sfcave.h
index b19d147..69a0e13 100644
--- a/noncore/games/sfcave/sfcave.h
+++ b/noncore/games/sfcave/sfcave.h
@@ -1,90 +1,108 @@
#include <qmainwindow.h>
#include <qpainter.h>
#include <qpixmap.h>
#include <qpoint.h>
#include <qrect.h>
#include <qtimer.h>
#define MAPSIZE 52
#define BLOCKSIZE 6
#define TRAILSIZE 30
class SFCave : public QMainWindow
{
Q_OBJECT
public:
int sWidth;
int sHeight;
int segSize;
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];
int currentMenuNr;
- int nrMenuOptions[2];
- int currentMenuOption[2];
+ static int nrMenuOptions[2];
+ static int currentMenuOption[2];
static QString dificultyOption[3];
static QString gameTypes[3];
int currentGameType;
int currentGameDifficulty;
QPixmap *offscreen;
QTimer *gameTimer;
int score;
- int highestScore[3];
+ 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 bossMode;
+ bool showScoreZones;
bool press;
double thrust;
bool running;
SFCave( int speed = 3, QWidget *p = 0, char *name = 0 );
~SFCave();
void start();
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 displayMenu();
void dealWithMenuSelection();
void keyPressEvent( QKeyEvent *e );
void keyReleaseEvent( QKeyEvent *e );
+ void saveScore();
private slots:
void run();
};