summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/games/sfcave/sfcave.cpp374
-rw-r--r--noncore/games/sfcave/sfcave.h42
2 files changed, 371 insertions, 45 deletions
diff --git a/noncore/games/sfcave/sfcave.cpp b/noncore/games/sfcave/sfcave.cpp
index 931f393..8b9c844 100644
--- a/noncore/games/sfcave/sfcave.cpp
+++ b/noncore/games/sfcave/sfcave.cpp
@@ -6,2 +6,3 @@
#include <qpe/qpeapplication.h>
+#include <qpe/config.h>
#else
@@ -12,5 +13,51 @@
-#define CAPTION "SFCave 1.6 by AndyQ"
+#define CAPTION "SFCave 1.7 by AndyQ"
+
+// States
+#define STATE_BOSS 0
+#define STATE_RUNNING 1
+#define STATE_CRASHED 2
+#define STATE_NEWGAME 3
+#define STATE_MENU 4
+
+// 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
+
+// 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 NR_GAME_DIFFICULTIES 3
+#define NR_GAME_TYPES 3
+
+#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"
+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];
+
bool movel;
+
int main( int argc, char *argv[] )
@@ -35,3 +82,3 @@ int main( int argc, char *argv[] )
- Main app( speed );
+ SFCave app( speed );
a.setMainWidget( &app );
@@ -42,4 +89,5 @@ int main( int argc, char *argv[] )
-Main :: Main( int spd, QWidget *w, char *name )
+SFCave :: SFCave( int spd, QWidget *w, char *name )
: QMainWindow( w, name )
+
{
@@ -55,4 +103,9 @@ Main :: Main( int spd, QWidget *w, char *name )
-// printf( "width %d, height %d\n", sWidth, sHeight );
-// printf( "segSize = %d\n", segSize );
+ currentMenuNr = 0;
+ nrMenuOptions[0] = 3;
+ nrMenuOptions[1] = 3;
+ currentMenuOption[0] = 0;
+ currentMenuOption[1] = 0;
+ currentGameType = 0;
+ currentGameDifficulty = 0;
@@ -60,3 +113,12 @@ Main :: Main( int spd, QWidget *w, char *name )
- highestScore = 0;
+#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 );
+ currentGameType = cfg.readNumEntry( "gameType", 0 );
+ currentGameDifficulty = cfg.readNumEntry( "difficulty", 0 );
+#endif
speed = spd; // Change to 2 for PC
@@ -75,3 +137,3 @@ Main :: Main( int spd, QWidget *w, char *name )
-Main :: ~Main()
+SFCave :: ~SFCave()
{
@@ -79,3 +141,3 @@ Main :: ~Main()
-void Main :: start()
+void SFCave :: start()
{
@@ -85,3 +147,3 @@ void Main :: start()
-int Main :: nextInt( int range )
+int SFCave :: nextInt( int range )
{
@@ -90,6 +152,6 @@ int Main :: nextInt( int range )
-void Main :: setUp()
+void SFCave :: setUp()
{
- state = STATE_CRASHED;
- prevState = STATE_CRASHED;
+ state = STATE_MENU;
+ prevState = STATE_MENU;
@@ -107,2 +169,5 @@ void Main :: setUp()
blockHeight = 70;
+ gapHeight = 125;
+ gateDistance = 75;
+ nextGate = nextInt( 50 ) + gateDistance;
@@ -122,3 +187,3 @@ void Main :: setUp()
-void Main :: run()
+void SFCave :: run()
{
@@ -128,2 +193,5 @@ void Main :: run()
{
+ case STATE_MENU:
+ displayMenu();
+ break;
case STATE_NEWGAME:
@@ -148,3 +216,7 @@ void Main :: run()
- if ( ++nrFrames % 500 == 0 )
+ // Apply Game rules
+ nrFrames ++;
+ if ( CURRENT_GAME_TYPE == SFCAVE_GAME )
+ {
+ if ( nrFrames % 500 == 0 )
{
@@ -162,8 +234,35 @@ void Main :: run()
addBlock();
+ }
+ else if ( CURRENT_GAME_TYPE == GATES_GAME )
+ {
+ // Slightly random gap distance
+ if ( nrFrames >= nextGate )
+ {
+ nextGate = nrFrames + nextInt( 50 ) + gateDistance;
+ addGate();
+ }
+
+ if ( nrFrames % 500 == 0 )
+ {
+ if ( gapHeight > 75 )
+ gapHeight -= 5;
+ }
+ }
+ else if ( CURRENT_GAME_TYPE == FLY_GAME )
+ {
+ }
+
- // if ( false )
if ( checkCollision() )
{
- if ( score > highestScore )
- highestScore = score;
+ if ( score > highestScore[currentGameType] )
+ highestScore[currentGameType] = score;
+
+#ifdef QWS
+ Config cfg( "sfcave" );
+ cfg.setGroup( "settings" );
+ QString key = "highScore_";
+ key += CURRENT_GAME_TYPE;
+ cfg.writeEntry( key, highestScore[currentGameType] );
+#endif
@@ -184,3 +283,3 @@ void Main :: run()
-bool Main :: checkCollision()
+bool SFCave :: checkCollision()
{
@@ -200,3 +299,3 @@ bool Main :: checkCollision()
-void Main :: moveLandscape()
+void SFCave :: moveLandscape()
{
@@ -228,3 +327,3 @@ void Main :: moveLandscape()
-void Main :: addBlock()
+void SFCave :: addBlock()
{
@@ -239,5 +338,32 @@ void Main :: addBlock()
blocks[i].setRect( x, y, blockWidth, blockHeight );
-// printf( "Added block @ %d %d\n", x, y );
-// printf( "mapTop = %d, mapBottom = %d", mapTop[50], mapBottom[50] );
+ 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);
+
+ // 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 b2Height = mapBottom[50] - y2;
+
+
+ blocks[i].setRect( x1, y1, blockWidth, b1Height );
+ blocks[i+1].setRect( x2, y2, blockWidth, b2Height );
@@ -248,3 +374,3 @@ void Main :: addBlock()
-void Main :: setPoint( int point )
+void SFCave :: setPoint( int point )
{
@@ -269,3 +395,3 @@ void Main :: setPoint( int point )
-void Main :: drawBoss()
+void SFCave :: drawBoss()
{
@@ -276,3 +402,3 @@ void Main :: drawBoss()
-void Main :: draw()
+void SFCave :: draw()
{
@@ -282,2 +408,3 @@ void Main :: draw()
QPainter p( offscreen );
+ QFontMetrics fm = p.fontMetrics();
p.setPen( Qt::white );
@@ -308,3 +435,3 @@ void Main :: draw()
QString s;
- s.sprintf( "score %06d high score %06d", score, highestScore );
+ s.sprintf( "score %06d high score %06d", score, highestScore[currentGameType] );
p.drawText( 5, 10, s );
@@ -326,3 +453,10 @@ void Main :: draw()
if ( crashLineLength >= 15 || crashLineLength == -1 )
- p.drawText( 70, 140, QString( "Press down to start" ) );
+ {
+ 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
@@ -336,3 +470,3 @@ void Main :: draw()
-void Main :: handleKeys()
+void SFCave :: handleKeys()
{
@@ -384,3 +518,63 @@ void Main :: handleKeys()
-void Main :: keyPressEvent( QKeyEvent *e )
+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
{
@@ -393,2 +587,7 @@ void Main :: keyPressEvent( QKeyEvent *e )
break;
+ case Qt::Key_M:
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+ if ( state == STATE_CRASHED && crashLineLength >= 15 || crashLineLength == -1 )
+ state = STATE_MENU;
default:
@@ -398,4 +597,10 @@ void Main :: keyPressEvent( QKeyEvent *e )
}
+}
-void Main :: keyReleaseEvent( QKeyEvent *e )
+void SFCave :: keyReleaseEvent( QKeyEvent *e )
+{
+ if ( state == STATE_MENU )
+ {
+ }
+ else
{
@@ -403,3 +608,2 @@ void Main :: keyReleaseEvent( QKeyEvent *e )
{
- case Qt::Key_Up:
case Qt::Key_F9:
@@ -408,2 +612,6 @@ void Main :: keyReleaseEvent( QKeyEvent *e )
break;
+
+ case Qt::Key_Up:
+ press = false;
+
case Qt::Key_R:
@@ -416,2 +624,4 @@ void Main :: keyReleaseEvent( QKeyEvent *e )
movel = true;
+ break;
+
default:
@@ -421 +631,103 @@ void Main :: keyReleaseEvent( QKeyEvent *e )
}
+
+}
+
+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_QUIT:
+ QApplication::exit();
+ break;
+ }
+
+ break;
+ }
+
+ case MENU_OPTIONS_MENU:
+ {
+ switch( currentMenuOption[currentMenuNr] )
+ {
+ case MENU_GAME_TYPE:
+ break;
+
+ case MENU_GAME_DIFFICULTY:
+ 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;
+ }
+ }
+} \ No newline at end of file
diff --git a/noncore/games/sfcave/sfcave.h b/noncore/games/sfcave/sfcave.h
index 18eeef9..b19d147 100644
--- a/noncore/games/sfcave/sfcave.h
+++ b/noncore/games/sfcave/sfcave.h
@@ -10,11 +10,6 @@
#define MAPSIZE 52
-#define BLOCKSIZE 5
+#define BLOCKSIZE 6
#define TRAILSIZE 30
-#define STATE_BOSS 0
-#define STATE_RUNNING 1
-#define STATE_CRASHED 2
-#define STATE_NEWGAME 3
-
-class Main : public QMainWindow
+class SFCave : public QMainWindow
{
@@ -29,2 +24,3 @@ public:
int blockHeight;
+ int gapHeight;
int state;
@@ -34,2 +30,16 @@ public:
+ int gateDistance;
+ int nextGate;
+ int lastGateBottomY;
+
+ static QString menuOptions[2][5];
+ int currentMenuNr;
+ int nrMenuOptions[2];
+ int currentMenuOption[2];
+
+ static QString dificultyOption[3];
+ static QString gameTypes[3];
+ int currentGameType;
+ int currentGameDifficulty;
+
QPixmap *offscreen;
@@ -38,9 +48,9 @@ public:
int score;
- int highestScore;
+ int highestScore[3];
- int mapTop[52];
- int mapBottom[52];
- QRect blocks[5];
+ int mapTop[MAPSIZE];
+ int mapBottom[MAPSIZE];
+ QRect blocks[BLOCKSIZE];
QRect user;
- QPoint trail[30];
+ QPoint trail[TRAILSIZE];
@@ -57,4 +67,4 @@ public:
- Main( int speed = 3, QWidget *p = 0, char *name = 0 );
- ~Main();
+ SFCave( int speed = 3, QWidget *p = 0, char *name = 0 );
+ ~SFCave();
void start();
@@ -65,2 +75,3 @@ public:
void addBlock();
+ void addGate();
void setPoint( int point );
@@ -70,2 +81,5 @@ public:
+ void displayMenu();
+ void dealWithMenuSelection();
+
void keyPressEvent( QKeyEvent *e );