diff --git a/data/hiscores.db b/data/hiscores.db index 091ed91..a66cdbb 100644 Binary files a/data/hiscores.db and b/data/hiscores.db differ diff --git a/defs.h b/defs.h index 31b475c..aaebe35 100644 --- a/defs.h +++ b/defs.h @@ -90,6 +90,8 @@ #define TEXTSIZE_HURRY 50 #define TEXTSIZE_PAUSED 50 #define TEXTSIZE_GAMEOVER 50 +#define TEXTSIZE_CONTINUE 50 +#define TEXTSIZE_CONTINUECOUNTER 50 #define TEXTSIZE_HISCORE 16 #define TEXTSIZE_ENDING 16 #define TEXTSIZE_CREDITS 16 @@ -102,6 +104,8 @@ #define TT_INTROTEXT 3 #define TT_GAMEOVER 4 #define TT_ENDING 5 +#define TT_CONTINUE 6 +#define TT_CONTINUECOUNTER 7 // intro states @@ -141,6 +145,8 @@ #define ENDTEXTTIME 200 #define GAMEOVERDELAY 200 +#define CONTINUECOUNTERDELAY 20 // 1 sec +#define CONTINUEDELAY (CONTINUECOUNTERDELAY * 10 * 3) // 10 secs #define POKERDELAY 170 #define ICEDRIPSPEED 0.5 @@ -837,6 +843,7 @@ enum SPELL { #define LV_GAMEOVER 8 // No lives left. #define LV_DOPOKER 9 // Got a full set of cards! #define LV_HELPFREEZE 10 // Freeze after help text +#define LV_CONTINUE 11 // Asking player whether to use a credit to continue // movement types #define MV_NONE 0 // didn't move diff --git a/rc.c b/rc.c index 24e6d46..ea94149 100644 --- a/rc.c +++ b/rc.c @@ -1641,7 +1641,6 @@ void nextlevel(void) { /* in case we skipped the level due to a powerup etc */ levelcomplete = LV_NEXTLEV; - // disable "forcegold" (comes form magic lamp) unless we got // if on this level if (forcegold) { @@ -7480,10 +7479,22 @@ void movetext(void) { } else if (t->state == t->delay) { t->size -= TEXTSPEED; if (t->size <= 3) { + if ((t->type == TT_CONTINUECOUNTER) && (levelcomplete == LV_CONTINUE)) { + int num; + // next countdown. + num = atoi(t->txt); + if (num > 1) { + char buf[4]; + sprintf(buf, "%d",num - 1); + addoutlinetext(320,240 + 50,TEXTSIZE_CONTINUECOUNTER,buf,&red,&black,CONTINUECOUNTERDELAY,TT_CONTINUECOUNTER); + } else { + startgameover(); + } + } if ((t->type == TT_GAMEOVER) && (levelcomplete == LV_GAMEOVER)) { // start game over timer gameovertime = gtime; - } + } if (t->type == TT_INTROTEXT) { introstate = IS_JUMP; } @@ -10900,12 +10911,15 @@ void checksprites(void) { } if (alldead) { - if (levelcomplete != LV_GAMEOVER) { - // special type - when it expires, gameover timer will start - addoutlinetext(320,240,TEXTSIZE_GAMEOVER,"Game Over",&red,&black,GAMEOVERDELAY,TT_GAMEOVER); - levelcomplete = LV_GAMEOVER; - stopmusic(); - playfx(FX_GAMEOVER); + if ((levelcomplete != LV_GAMEOVER) && (levelcomplete != LV_CONTINUE)) { + if (credits >= 1) { + // start continue timer + addoutlinetext(320,240 - 50,TEXTSIZE_CONTINUE,"Continue?",&red,&black,CONTINUEDELAY,TT_CONTINUE); + addoutlinetext(320,240 + 50,TEXTSIZE_CONTINUECOUNTER,"10",&red,&black,CONTINUECOUNTERDELAY,TT_CONTINUECOUNTER); + levelcomplete = LV_CONTINUE; + } else { + startgameover(); + } } } } else { @@ -12206,7 +12220,7 @@ if (cheat) { sprintf(tempm, "Cheat!"); if (player) { //player->powerup = PW_MAGNET; - player->powerup = PW_RAYGUN; + player->lives = 2; player->netmax = 4; // all nets player->netbig = B_TRUE; // big net player->speed = PLAYERFAST; // fast @@ -12214,8 +12228,8 @@ if (cheat) { player->doublejump = B_TRUE; player->hasbell = B_TRUE; player->umbrella = B_TRUE; - player->armour = B_TRUE; - player->id = P_ARMOUR; // change how the player looks + //player->armour = B_TRUE; + //player->id = P_ARMOUR; // change how the player looks player->hasmask = B_TRUE; addoutlinetext(player->x,player->y - player->img->h/2, TEXTSIZE_POINTS, tempm,&white,&black,POINTSDELAY,TT_NORM); } @@ -12394,6 +12408,49 @@ if (cheat) { } } } + } else if (levelcomplete == LV_CONTINUE) { + int docontinue = B_FALSE; + if (keydown(0, SDLK_1)) { + if (player && (credits >= 1)) { + // lose credit and go back to start of world. + credits--; + if (player) { + playfx(FX_EXTRALIFE); + // go back to start of world + docontinue = B_TRUE; + } + } + } + if (keydown(0, SDLK_2)) { + if (player2 && (credits >= 1)) { + // lose credit and go back to start of world. + credits--; + if (player2) { + playfx(FX_EXTRALIFE); + // go back to start of world + docontinue = B_TRUE; + } + } + } + + if (docontinue) { + // one before the level we want to go to + curlevelnum = (curlevelnum / 20) * 20; + + // set player defaults + if (player) { + setdefaults(player); + player->lives = INITPLAYERLIVES; + player->score = 0; + } + if (player2) { + setdefaults(player2); + player2->lives = INITPLAYERLIVES; + player2->score = 0; + } + + nextlevel(); + } } @@ -13419,6 +13476,14 @@ void startgame(void) { timer = 0; } +void startgameover(void) { + // special type - when it expires, gameover timer will start + addoutlinetext(320,240,TEXTSIZE_GAMEOVER,"Game Over",&red,&black,GAMEOVERDELAY,TT_GAMEOVER); + levelcomplete = LV_GAMEOVER; + stopmusic(); + playfx(FX_GAMEOVER); +} + void uncatch(sprite_t *s) { if (s->caughtby) { diff --git a/rc.h b/rc.h index 4b75161..24aea78 100644 --- a/rc.h +++ b/rc.h @@ -102,6 +102,7 @@ void trytoshoot(sprite_t *pl); void docannoneffect(sprite_t *pp); void dotitlescreen(void); void startgame(void); +void startgameover(void); void uncatch(sprite_t *s); void makeinvuln(sprite_t *s); void handletitleinput(int whichplayer, int key); diff --git a/todo b/todo index aa0ffbf..8dd1855 100644 --- a/todo +++ b/todo @@ -1,28 +1,33 @@ + - animate players hanging from umbrellas ? -- if drawing a score text on the same location as another score text, - delay it by a little ? - make points worth chasing for something more than a high schore - bonus level teleport appears on next level once you reach a certain amount of points ? - Figure out POINT VALUES? - 1-13 - 233k + Test games to figure out good point values. + Level 1-13 - 233k points + Cutoffs for special stuff: 500k? 1m? + 5m? + 15m? + 30m? - - bonus levels: - ..triple walk speed? - ..spike boots to jump on monsters - ..50% chance to skip two levels each time? - .. shortcut to skip directly to start of next world? + - bonus levels which give Diamonds which give random effect: + - triple walk speed + - spike boots to jump on monsters + - from now on, 50% chance to skip two levels each time + - shortcut to skip directly to start of next world + + - Collecting all the diamonds gives something special ? - Make level editor work again in opengl - add help to level editor! -- top left tile is always blank?? +- why is top left tile is always blank? - New powerups: - until end of level @@ -37,8 +42,7 @@ - Draw graphics for between-level sequences. - draw and scan ? - - had a plan for this somewhere, i think in an old omnioutliner doc - CODE: + PLAN: - [ ] instrad of cloud coming, wipe screen - [ ] moviescript(): - [ ] picture filename @@ -116,6 +120,8 @@ l 86 - earlier (dificulty easier than other castle levels before it) + delay animated spikes until at least world 2 ? + - New tiles - destroyable tile - when a net hits it, it explodes into 4 pieces. don't come back. @@ -127,13 +133,12 @@ - falling icicle (regrows) + - for snow world - secret levels/worlds - totally underwater with currents towards spikes - all moving platforms -- Make 'credits' let you continue... but from the start of the world and with 0 points - - sound delays after long play - new level ideas