Allow use of credits to continue after all players are out of lives.

(will go back to the start of the world, and lose all points)
This commit is contained in:
Rob Pearce 2016-07-30 17:44:53 +12:00
parent 2cd7d417e7
commit ec44f15c35
5 changed files with 103 additions and 25 deletions

Binary file not shown.

7
defs.h
View File

@ -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

85
rc.c
View File

@ -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,6 +7479,18 @@ 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;
@ -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) {

1
rc.h
View File

@ -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);

33
todo
View File

@ -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