summaryrefslogtreecommitdiff
path: root/noncore/games/sfcave/sfcave.cpp
authorandyq <andyq>2002-12-07 18:07:27 (UTC)
committer andyq <andyq>2002-12-07 18:07:27 (UTC)
commit25debd07f03e4a1b21047ee5d49a3dd811d8352a (patch) (unidiff)
treec25eaa7d0423e733772412bf097e1ab577362fc0 /noncore/games/sfcave/sfcave.cpp
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 (limited to 'noncore/games/sfcave/sfcave.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/games/sfcave/sfcave.cpp341
1 files changed, 282 insertions, 59 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
@@ -9,16 +9,23 @@
9#include <qapplication.h> 9#include <qapplication.h>
10#endif 10#endif
11 11
12#include "helpwindow.h"
12#include "sfcave.h" 13#include "sfcave.h"
13 14
14#define CAPTION "SFCave 1.7 by AndyQ" 15#define CAPTION "SFCave 1.8 by AndyQ"
16
17#define UP_THRUST 0.6
18#define NO_THRUST 0.8
19#define MAX_DOWN_THRUST 4.0
20#define MAX_UP_THRUST -3.5
15 21
16// States 22// States
17#define STATE_BOSS 0 23#define STATE_BOSS 0
18#define STATE_RUNNING 1 24#define STATE_RUNNING 1
19#define STATE_CRASHED 2 25#define STATE_CRASHING 2
20#define STATE_NEWGAME 3 26#define STATE_CRASHED 3
21#define STATE_MENU 4 27#define STATE_NEWGAME 4
28#define STATE_MENU 5
22 29
23// Menus 30// Menus
24#define MENU_MAIN_MENU 0 31#define MENU_MAIN_MENU 0
@@ -27,20 +34,22 @@
27// Main Menu Options 34// Main Menu Options
28#define MENU_START_GAME 0 35#define MENU_START_GAME 0
29#define MENU_OPTIONS 1 36#define MENU_OPTIONS 1
30#define MENU_QUIT 2 37#define MENU_HELP 2
38#define MENU_QUIT 3
31 39
32// Option Menu Options 40// Option Menu Options
33#define MENU_GAME_TYPE 0 41#define MENU_GAME_TYPE 0
34#define MENU_GAME_DIFFICULTY 1 42#define MENU_GAME_DIFFICULTY 1
35#define MENU_BACK 2 43#define MENU_CLEAR_HIGHSCORES 2
36 44#define MENU_BACK 3
37QString SFCave::menuOptions[2][5] = { { "Start Game", "Options", "Quit", "", "" },
38 { "Game Type - %s", "Game Difficulty - %s", "Back", "", "" } };
39 45
40 46
41#define NR_GAME_DIFFICULTIES 3 47#define NR_GAME_DIFFICULTIES 3
42#define NR_GAME_TYPES 3 48#define NR_GAME_TYPES 3
43 49
50#define DIFICULTY_EASY 0
51#define DIFICULTY_NORMAL 1
52#define DIFICULTY_HARD 2
44#define EASY "Easy" 53#define EASY "Easy"
45#define NORMAL "Normal" 54#define NORMAL "Normal"
46#define HARD "Hard" 55#define HARD "Hard"
@@ -51,11 +60,39 @@ QString SFCave::menuOptions[2][5] = { { "Start Game", "Options", "Quit", "", ""
51#define SFCAVE_GAME "SFCave" 60#define SFCAVE_GAME "SFCave"
52#define GATES_GAME "Gates" 61#define GATES_GAME "Gates"
53#define FLY_GAME "Fly" 62#define FLY_GAME "Fly"
63#define CURRENT_GAME_TYPE gameTypes[currentGameType]
64#define CURRENT_GAME_DIFFICULTY difficultyOption[currentGameDifficulty];
65
54QString SFCave::dificultyOption[] = { EASY, NORMAL, HARD }; 66QString SFCave::dificultyOption[] = { EASY, NORMAL, HARD };
55QString SFCave::gameTypes[] = { SFCAVE_GAME, GATES_GAME, FLY_GAME }; 67QString SFCave::gameTypes[] = { SFCAVE_GAME, GATES_GAME, FLY_GAME };
56 68
57#define CURRENT_GAME_TYPE gameTypes[currentGameType] 69QString SFCave::menuOptions[2][5] = { { "Start Game", "Options", "Help", "Quit", "" },
58#define CURRENT_GAME_DIFFICULTY difficultyOption[currentGameDifficulty]; 70 { "Game Type - %s", "Game Difficulty - %s", "Clear High Scores for this game", "Back", "" } };
71
72#define UP_THRUST 0.6
73#define NO_THRUST 0.8
74#define MAX_DOWN_THRUST 4.0
75#define MAX_UP_THRUST -3.5
76double SFCave::UpThrustVals[3][3] = {{ 0.6, 0.6, 0.6 }, // SFCave
77 { 0.6, 0.6, 0.8 }, // Gates
78 { 0.4, 0.7, 1.0 } }; // Fly
79
80double SFCave::DownThrustVals[3][3] = {{ 0.8, 0.8, 0.8 }, // SFCave
81 { 0.8, 0.8, 1.0 }, // Gates
82 { 0.4, 0.7, 1.0 } }; // Fly
83
84double SFCave::MaxUpThrustVals[3][3] = {{ -3.5, -3.5, -3.5 }, // SFCave
85 { -3.5, -4.0, -5.0 }, // Gates
86 { -3.5, -4.0, -5.0 } }; // Fly
87
88double SFCave::MaxDownThrustVals[3][3] = {{ 4.0, 4.0, 4.0 }, // SFCave
89 { 4.0, 5.0, 5.5 }, // Gates
90 { 3.5, 4.0, 5.0 } }; // Fly
91
92int SFCave::initialGateGaps[] = { 75, 50, 25 };
93
94int SFCave::nrMenuOptions[2] = { 4, 4 };
95int SFCave ::currentMenuOption[2] = { 0, 0 };
59 96
60bool movel; 97bool movel;
61 98
@@ -63,7 +100,6 @@ bool movel;
63int main( int argc, char *argv[] ) 100int main( int argc, char *argv[] )
64{ 101{
65 movel = true; 102 movel = true;
66
67#ifdef QWS 103#ifdef QWS
68 QPEApplication a( argc, argv ); 104 QPEApplication a( argc, argv );
69#else 105#else
@@ -102,22 +138,23 @@ SFCave :: SFCave( int spd, QWidget *w, char *name )
102 segSize = sWidth/(MAPSIZE-1)+1; 138 segSize = sWidth/(MAPSIZE-1)+1;
103 139
104 currentMenuNr = 0; 140 currentMenuNr = 0;
105 nrMenuOptions[0] = 3;
106 nrMenuOptions[1] = 3;
107 currentMenuOption[0] = 0;
108 currentMenuOption[1] = 0;
109 currentGameType = 0; 141 currentGameType = 0;
110 currentGameDifficulty = 0; 142 currentGameDifficulty = 0;
111 143
112 setCaption( CAPTION ); 144 setCaption( CAPTION );
145 showScoreZones = false;
113 146
114#ifdef QWS 147#ifdef QWS
115 Config cfg( "sfcave" ); 148 Config cfg( "sfcave" );
116 cfg.setGroup( "settings" ); 149 cfg.setGroup( "settings" );
117 QString key = "highScore_"; 150 QString key = "highScore_";
118 highestScore[SFCAVE_GAME_TYPE] = cfg.readNumEntry( key + SFCAVE_GAME, 0 ); 151
119 highestScore[GATES_GAME_TYPE] = cfg.readNumEntry( key + GATES_GAME, 0 ); 152 for ( int i = 0 ; i < 3 ; ++i )
120 highestScore[FLY_GAME_TYPE] = cfg.readNumEntry( key + FLY_GAME, 0 ); 153 {
154 for ( int j = 0 ; j < 3 ; ++j )
155 highestScore[i][j] = cfg.readNumEntry( key + gameTypes[i] + "_" + dificultyOption[j], 0 );
156 }
157
121 currentGameType = cfg.readNumEntry( "gameType", 0 ); 158 currentGameType = cfg.readNumEntry( "gameType", 0 );
122 currentGameDifficulty = cfg.readNumEntry( "difficulty", 0 ); 159 currentGameDifficulty = cfg.readNumEntry( "difficulty", 0 );
123#endif 160#endif
@@ -157,17 +194,39 @@ void SFCave :: setUp()
157 194
158 score = 0; 195 score = 0;
159 offset = 0; 196 offset = 0;
160 maxHeight = 50;
161 nrFrames = 0; 197 nrFrames = 0;
162 dir = 1; 198 dir = 1;
163 thrust = 0; 199 thrust = 0;
200
201 if ( CURRENT_GAME_TYPE == SFCAVE_GAME )
202 {
203 thrustUp = UpThrustVals[SFCAVE_GAME_TYPE][currentGameDifficulty];;
204 noThrust = DownThrustVals[SFCAVE_GAME_TYPE][currentGameDifficulty];;
205 maxUpThrust = MaxUpThrustVals[SFCAVE_GAME_TYPE][currentGameDifficulty];;
206 maxDownThrust = MaxDownThrustVals[SFCAVE_GAME_TYPE][currentGameDifficulty];;
207 }
208 else if ( CURRENT_GAME_TYPE == GATES_GAME )
209 {
210 thrustUp = UpThrustVals[GATES_GAME_TYPE][currentGameDifficulty];;
211 noThrust = DownThrustVals[GATES_GAME_TYPE][currentGameDifficulty];;
212 maxUpThrust = MaxUpThrustVals[GATES_GAME_TYPE][currentGameDifficulty];;
213 maxDownThrust = MaxDownThrustVals[GATES_GAME_TYPE][currentGameDifficulty];;
214 }
215 else
216 {
217 thrustUp = UpThrustVals[FLY_GAME_TYPE][currentGameDifficulty];
218 noThrust = DownThrustVals[FLY_GAME_TYPE][currentGameDifficulty];
219 maxUpThrust = MaxUpThrustVals[FLY_GAME_TYPE][currentGameDifficulty];
220 maxDownThrust = MaxDownThrustVals[FLY_GAME_TYPE][currentGameDifficulty];
221 }
222
164 crashLineLength = 0; 223 crashLineLength = 0;
165 224
166 user.setRect( 50, sWidth/2, 4, 4 ); 225 user.setRect( 50, sWidth/2, 4, 4 );
167 226
168 blockWidth = 20; 227 blockWidth = 20;
169 blockHeight = 70; 228 blockHeight = 70;
170 gapHeight = 125; 229 gapHeight = initialGateGaps[currentGameDifficulty];
171 gateDistance = 75; 230 gateDistance = 75;
172 nextGate = nextInt( 50 ) + gateDistance; 231 nextGate = nextInt( 50 ) + gateDistance;
173 232
@@ -177,18 +236,28 @@ void SFCave :: setUp()
177 trail[i].setY( 0 ); 236 trail[i].setY( 0 );
178 } 237 }
179 238
239 if ( CURRENT_GAME_TYPE != FLY_GAME )
240 {
241 maxHeight = 50;
242
180 mapTop[0] = (int)(nextInt(50)) + 5; 243 mapTop[0] = (int)(nextInt(50)) + 5;
244 mapBottom[0] = (int)(nextInt(50)) + 5;
181 for ( int i = 1 ; i < MAPSIZE ; ++i ) 245 for ( int i = 1 ; i < MAPSIZE ; ++i )
182 setPoint( i ); 246 setPoint( i );
247 }
248 else
249 {
250 maxHeight = 100;
183 251
252 for ( int i = 0 ; i < MAPSIZE ; ++i )
253 mapBottom[i] = sHeight - 10;
254 }
184 for ( int i = 0 ; i < BLOCKSIZE ; ++i ) 255 for ( int i = 0 ; i < BLOCKSIZE ; ++i )
185 blocks[i].setY( -1 ); 256 blocks[i].setY( -1 );
186} 257}
187 258
188void SFCave :: run() 259void SFCave :: run()
189{ 260{
190 //running = true;
191 //setUp();
192 switch ( state ) 261 switch ( state )
193 { 262 {
194 case STATE_MENU: 263 case STATE_MENU:
@@ -203,21 +272,37 @@ void SFCave :: run()
203 drawBoss(); 272 drawBoss();
204 break; 273 break;
205 274
275 case STATE_CRASHING:
206 case STATE_CRASHED: 276 case STATE_CRASHED:
207 draw(); 277 draw();
208 break; 278 break;
209 279
210 case STATE_RUNNING: 280 case STATE_RUNNING:
211 { 281 {
212 if ( nrFrames % 5 == 0 )
213 score ++;
214 if ( nrFrames % 2 == 0 ) 282 if ( nrFrames % 2 == 0 )
215 handleKeys(); 283 handleKeys();
216 284
217 // Apply Game rules 285 // Apply Game rules
218 nrFrames ++; 286 nrFrames ++;
219 if ( CURRENT_GAME_TYPE == SFCAVE_GAME ) 287 if ( CURRENT_GAME_TYPE == SFCAVE_GAME )
288 handleGameSFCave();
289 else if ( CURRENT_GAME_TYPE == GATES_GAME )
290 handleGameGates();
291 else if ( CURRENT_GAME_TYPE == FLY_GAME )
292 handleGameFly();
293
294 draw();
295 break;
296 }
297 }
298}
299
300void SFCave :: handleGameSFCave()
220 { 301 {
302 // Update score
303 if ( nrFrames % 5 == 0 )
304 score ++;
305
221 if ( nrFrames % 500 == 0 ) 306 if ( nrFrames % 500 == 0 )
222 { 307 {
223 if ( maxHeight < sHeight - 100 ) 308 if ( maxHeight < sHeight - 100 )
@@ -232,9 +317,30 @@ void SFCave :: run()
232 317
233 if ( nrFrames % 100 == 0 ) 318 if ( nrFrames % 100 == 0 )
234 addBlock(); 319 addBlock();
320
321 if ( checkCollision() )
322 {
323 if ( score > highestScore[currentGameType][currentGameDifficulty] )
324 {
325 highestScore[currentGameType][currentGameDifficulty] = score;
326 saveScore();
235 } 327 }
236 else if ( CURRENT_GAME_TYPE == GATES_GAME ) 328 state = STATE_CRASHING;
329 }
330 else
331 {
332 moveLandscape();
333 }
334
335}
336
337
338void SFCave :: handleGameGates()
237 { 339 {
340 // Update score
341 if ( nrFrames % 5 == 0 )
342 score ++;
343
238 // Slightly random gap distance 344 // Slightly random gap distance
239 if ( nrFrames >= nextGate ) 345 if ( nrFrames >= nextGate )
240 { 346 {
@@ -247,43 +353,107 @@ void SFCave :: run()
247 if ( gapHeight > 75 ) 353 if ( gapHeight > 75 )
248 gapHeight -= 5; 354 gapHeight -= 5;
249 } 355 }
356
357 if ( checkCollision() )
358 {
359 if ( score > highestScore[currentGameType][currentGameDifficulty] )
360 {
361 highestScore[currentGameType][currentGameDifficulty] = score;
362 saveScore();
363 }
364 state = STATE_CRASHING;
250 } 365 }
251 else if ( CURRENT_GAME_TYPE == FLY_GAME ) 366 else
252 { 367 {
368 moveLandscape();
253 } 369 }
254 370
371}
255 372
256 if ( checkCollision() ) 373void SFCave :: handleGameFly()
257 { 374 {
258 if ( score > highestScore[currentGameType] ) 375 if ( nrFrames % 4 == 0 )
259 highestScore[currentGameType] = score; 376 {
377 // Update score
378 // get distance between landscape and ship
379 int diff = mapBottom[10] - user.y();
260 380
261#ifdef QWS 381 // the closer the difference is to 0 means more points
262 Config cfg( "sfcave" ); 382 if ( diff < 10 )
263 cfg.setGroup( "settings" ); 383 score += 5;
264 QString key = "highScore_"; 384 else if ( diff < 20 )
265 key += CURRENT_GAME_TYPE; 385 score += 3;
266 cfg.writeEntry( key, highestScore[currentGameType] ); 386 else if ( diff < 30 )
267#endif 387 score += 2;
388 else if ( diff < 40 )
389 score += 1;
390 }
268 391
269 state = STATE_CRASHED; 392 if ( checkFlyGameCollision() )
393 {
394 if ( score > highestScore[currentGameType][currentGameDifficulty] )
395 {
396 highestScore[currentGameType][currentGameDifficulty] = score;
397 saveScore();
398 }
399 state = STATE_CRASHING;
270 } 400 }
271 else 401 else
272 { 402 {
273 if ( movel ) 403 moveFlyGameLandscape();
274 moveLandscape(); 404 }
275 //movel = false;
276 } 405 }
277 406
278 draw(); 407bool SFCave :: checkFlyGameCollision()
279 break; 408{
409 if ( (user.y() + user.width()) >= mapBottom[11] )
410 return true;
411
412 return false;
280 } 413 }
414
415void SFCave :: moveFlyGameLandscape()
416{
417 offset++;
418
419 if ( offset >= segSize )
420 {
421 offset = 0;
422 for ( int i = 0 ; i < MAPSIZE-speed ; ++i )
423 mapBottom[i] = mapBottom[i+speed];
424
425 for ( int i = speed ; i > 0 ; --i )
426 setFlyPoint( MAPSIZE-i );
281 } 427 }
282} 428}
283 429
430void SFCave :: setFlyPoint( int point )
431{
432 static int fly_difficulty_levels[] = { 5, 10, 15 };
433 if ( nextInt(100) >= 75 )
434 dir *= -1;
435
436 int prevPoint = mapBottom[point-1];
437
438 int nextPoint = prevPoint + (dir * nextInt( fly_difficulty_levels[currentGameDifficulty] ) );
439
440 if ( nextPoint > sHeight )
441 {
442 nextPoint = sHeight;
443 dir *= -1;
444 }
445 else if ( nextPoint < maxHeight )
446 {
447 nextPoint = maxHeight;
448 dir *= 1;
449 }
450
451 mapBottom[point] = nextPoint;
452}
453
284bool SFCave :: checkCollision() 454bool SFCave :: checkCollision()
285{ 455{
286 if ( (user.y() + user.width()) >= mapBottom[10] || user.y() <= mapTop[10] ) 456 if ( (user.y() + user.width()) >= mapBottom[11] || user.y() <= mapTop[11] )
287 return true; 457 return true;
288 458
289 for ( int i = 0 ; i < BLOCKSIZE ; ++i ) 459 for ( int i = 0 ; i < BLOCKSIZE ; ++i )
@@ -350,7 +520,7 @@ void SFCave :: addGate()
350 { 520 {
351 int x1 = sWidth; 521 int x1 = sWidth;
352 int y1 = mapTop[50]; 522 int y1 = mapTop[50];
353 int b1Height = nextInt(mapBottom[50] - mapTop[50] - gateDistance); 523 int b1Height = nextInt(mapBottom[50] - mapTop[50] - gapHeight);
354 524
355 // See if height between last gate and this one is too big 525 // See if height between last gate and this one is too big
356 if ( b1Height - 200 > lastGateBottomY ) 526 if ( b1Height - 200 > lastGateBottomY )
@@ -360,7 +530,7 @@ void SFCave :: addGate()
360 lastGateBottomY = b1Height; 530 lastGateBottomY = b1Height;
361 531
362 int x2 = sWidth; 532 int x2 = sWidth;
363 int y2 = y1 + b1Height + gateDistance; 533 int y2 = y1 + b1Height + gapHeight;
364 int b2Height = mapBottom[50] - y2; 534 int b2Height = mapBottom[50] - y2;
365 535
366 536
@@ -389,7 +559,7 @@ void SFCave :: setPoint( int point )
389 dir *= -1; 559 dir *= -1;
390 } 560 }
391 561
392 mapBottom[point] = sHeight - (maxHeight - mapBottom[point]); 562// mapBottom[point] = sHeight - (maxHeight - mapBottom[point]);
393 mapBottom[point] = sHeight - (maxHeight - mapTop[point]); 563 mapBottom[point] = sHeight - (maxHeight - mapTop[point]);
394} 564}
395 565
@@ -411,10 +581,28 @@ void SFCave :: draw()
411 581
412 for ( int i = 0 ; i < MAPSIZE -3; ++i ) 582 for ( int i = 0 ; i < MAPSIZE -3; ++i )
413 { 583 {
584 // Only display top landscape if not running FLY_GAME
585 if ( CURRENT_GAME_TYPE != FLY_GAME )
414 p.drawLine( (i*segSize) - (offset*speed), mapTop[i], ((i+1)*segSize)-(offset*speed), mapTop[i+1] ); 586 p.drawLine( (i*segSize) - (offset*speed), mapTop[i], ((i+1)*segSize)-(offset*speed), mapTop[i+1] );
587
415 p.drawLine( (i*segSize) - (offset*speed), mapBottom[i], ((i+1)*segSize)-(offset*speed), mapBottom[i+1] ); 588 p.drawLine( (i*segSize) - (offset*speed), mapBottom[i], ((i+1)*segSize)-(offset*speed), mapBottom[i+1] );
589
590 if ( CURRENT_GAME_TYPE == FLY_GAME && showScoreZones )
591 {
592 p.setPen( Qt::red );
593 p.drawLine( (i*segSize) - (offset*speed), mapBottom[i]-10, ((i+1)*segSize)-(offset*speed), mapBottom[i+1]-10 );
594 p.drawLine( (i*segSize) - (offset*speed), mapBottom[i]-20, ((i+1)*segSize)-(offset*speed), mapBottom[i+1]-20 );
595 p.drawLine( (i*segSize) - (offset*speed), mapBottom[i]-30, ((i+1)*segSize)-(offset*speed), mapBottom[i+1]-30 );
596 p.drawLine( (i*segSize) - (offset*speed), mapBottom[i]-40, ((i+1)*segSize)-(offset*speed), mapBottom[i+1]-40 );
597 p.setPen( Qt::white );
598 }
416 } 599 }
417 600
601 // Uncomment this to show user segment (usful for checking collision boundary with landscape
602// p.setPen( Qt::red );
603// p.drawLine( (11*segSize) - (offset*speed), 0, ((11)*segSize)-(offset*speed), sHeight );
604// p.setPen( Qt::white );
605
418 // Draw user 606 // Draw user
419 p.drawRect( user ); 607 p.drawRect( user );
420 608
@@ -433,11 +621,11 @@ void SFCave :: draw()
433 621
434 // draw score 622 // draw score
435 QString s; 623 QString s;
436 s.sprintf( "score %06d high score %06d", score, highestScore[currentGameType] ); 624 s.sprintf( "score %06d high score %06d", score, highestScore[currentGameType][currentGameDifficulty] );
437 p.drawText( 5, 10, s ); 625 p.drawText( 5, 10, s );
438 626
439 627
440 if ( state == STATE_CRASHED ) 628 if ( state == STATE_CRASHING || state == STATE_CRASHED )
441 { 629 {
442 // add next crash line 630 // add next crash line
443 631
@@ -450,14 +638,16 @@ void SFCave :: draw()
450 } 638 }
451 } 639 }
452 640
453 if ( crashLineLength >= 15 || crashLineLength == -1 ) 641 if ( state == STATE_CRASHING && crashLineLength >= 15 ) //|| crashLineLength == -1) )
642 state = STATE_CRASHED;
643
644 if ( state == STATE_CRASHED )
454 { 645 {
455 QString text = "Press up or down to start"; 646 QString text = "Press up or down to start";
456 p.drawText( (sWidth/2) - (fm.width( text )/2), 140, text ); 647 p.drawText( (sWidth/2) - (fm.width( text )/2), 140, text );
457 648
458 text = "or press OK for menu"; 649 text = "or press OK for menu";
459 p.drawText( (sWidth/2) - (fm.width( text )/2), 155, text ); 650 p.drawText( (sWidth/2) - (fm.width( text )/2), 155, text );
460// p.drawText( 70, 140, QString( "Press down to start" ) );
461 } 651 }
462 else 652 else
463 crashLineLength ++; 653 crashLineLength ++;
@@ -492,14 +682,14 @@ void SFCave :: handleKeys()
492 if ( speed <= 3 ) 682 if ( speed <= 3 )
493 { 683 {
494 if ( press ) 684 if ( press )
495 thrust -= 0.6; 685 thrust -= thrustUp;
496 else 686 else
497 thrust += 0.8; 687 thrust += noThrust;
498 688
499 if ( thrust > 4.0 ) 689 if ( thrust > maxDownThrust )
500 thrust = 4.0; 690 thrust = maxDownThrust;
501 else if ( thrust < -3.5 ) 691 else if ( thrust < maxUpThrust )
502 thrust = -3.5; 692 thrust = maxUpThrust;
503 } 693 }
504 else 694 else
505 { 695 {
@@ -588,8 +778,14 @@ void SFCave :: keyPressEvent( QKeyEvent *e )
588 case Qt::Key_M: 778 case Qt::Key_M:
589 case Qt::Key_Return: 779 case Qt::Key_Return:
590 case Qt::Key_Enter: 780 case Qt::Key_Enter:
591 if ( state == STATE_CRASHED && crashLineLength >= 15 || crashLineLength == -1 ) 781 if ( state == STATE_CRASHED )
592 state = STATE_MENU; 782 state = STATE_MENU;
783 break;
784
785 case Qt::Key_Z:
786 showScoreZones = !showScoreZones;
787 break;
788
593 default: 789 default:
594 e->ignore(); 790 e->ignore();
595 break; 791 break;
@@ -616,7 +812,7 @@ void SFCave :: keyReleaseEvent( QKeyEvent *e )
616 812
617 case Qt::Key_R: 813 case Qt::Key_R:
618 case Qt::Key_Down: 814 case Qt::Key_Down:
619 if ( state == STATE_CRASHED && crashLineLength >= 15 || crashLineLength == -1 ) 815 if ( state == STATE_CRASHED )
620 { 816 {
621 state = STATE_NEWGAME; 817 state = STATE_NEWGAME;
622 } 818 }
@@ -697,6 +893,15 @@ void SFCave :: dealWithMenuSelection()
697 currentMenuOption[currentMenuNr] = 0; 893 currentMenuOption[currentMenuNr] = 0;
698 break; 894 break;
699 895
896 case MENU_HELP:
897 {
898 // Display Help Menu
899 HelpWindow *dlg = new HelpWindow( this );
900 dlg->exec();
901 delete dlg;
902 break;
903 }
904
700 case MENU_QUIT: 905 case MENU_QUIT:
701 QApplication::exit(); 906 QApplication::exit();
702 break; 907 break;
@@ -715,6 +920,11 @@ void SFCave :: dealWithMenuSelection()
715 case MENU_GAME_DIFFICULTY: 920 case MENU_GAME_DIFFICULTY:
716 break; 921 break;
717 922
923 case MENU_CLEAR_HIGHSCORES:
924 for ( int i = 0 ; i < 3 ; ++i )
925 highestScore[currentGameType][i] = 0;
926 break;
927
718 case MENU_BACK: 928 case MENU_BACK:
719 currentMenuNr = MENU_MAIN_MENU; 929 currentMenuNr = MENU_MAIN_MENU;
720 930
@@ -731,3 +941,16 @@ void SFCave :: dealWithMenuSelection()
731 } 941 }
732 } 942 }
733} \ No newline at end of file 943} \ No newline at end of file
944
945void SFCave :: saveScore()
946{
947#ifdef QWS
948 Config cfg( "sfcave" );
949 cfg.setGroup( "settings" );
950 QString key = "highScore_";
951
952 cfg.writeEntry( key + gameTypes[currentGameType] + "_" + dificultyOption[currentGameDifficulty], highestScore[currentGameType][currentGameDifficulty] );
953 key += CURRENT_GAME_TYPE;
954 cfg.writeEntry( key, highestScore[currentGameType] );
955#endif
956}