Added intro sequence

This commit is contained in:
Rob Pearce 2008-11-21 00:14:26 +00:00
parent 9b11deec5f
commit cc94db97ea
17 changed files with 559 additions and 114 deletions

107
data/levels/intro.dat Normal file
View File

@ -0,0 +1,107 @@
bgfile sky1.png
bg 0
hurryup 30
help
endhelp
monsters
0 5 15
134 23 15
23 36 20
2 7 15
2 19 15
9 14 15
9 8 15
141 10 15
143 12 15
10 15 15
11 17 15
11 13 15
140 16 15
140 9 15
142 11 15
142 18 15
143 21 15
141 20 15
15 37 12
15 39 12
endmonsters
exitdir 1
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,74,0,74,0,74,0,74,0,0,0,0,0,0,0,0,0,0,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,74,0,74,0,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,0,0,0,0,0,0,0,0,0,0,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,0,0,0,0,0,0,0,0,0,0,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,0,0,0,0,0,0,0,0,0,0,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,0,0,0,0,0,0,0,0,0,0,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,74,0,0,0,0,0,0,0,0,0,0,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,74,0,0,0,0,0,0,0,0,0,0,0,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,0,0,0,0,0,0,0,0,0,0,0,0,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,0,0,0,0,0,0,0,0,0,35,1,1,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,74,0,0,0,0,0,0,0,0,0,0,42,4,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,0,0,0,0,0,0,0,0,0,0,0,4,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,0,0,0,0,0,0,0,0,0,0,0,4,
75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
74,74,74,74,74,74,74,74,74,74,74,74,74,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,
layer2
0,3,74
0,4,74
0,5,74
0,6,74
1,6,19
14,6,80
26,6,18
0,7,74
14,7,80
0,8,74
11,8,82
12,8,82
13,8,82
14,8,81
15,8,82
16,8,82
17,8,82
0,9,74
0,10,74
6,10,82
22,10,82
0,11,74
0,12,74
0,16,74
1,16,74
5,16,78
7,16,64
8,16,62
9,16,62
10,16,62
11,16,62
12,16,62
13,16,62
14,16,62
15,16,62
16,16,62
17,16,62
18,16,62
19,16,62
20,16,62
21,16,63
23,16,79
0,17,74
1,17,74
5,17,76
8,17,77
20,17,77
23,17,76

View File

@ -55,3 +55,4 @@
109,level109.dat,THE END SO FAR
99,level99.dat,TEST LEVEL
417,level417.dat,NEW LEVEL
0,intro.dat,INTRO

BIN
data/newtiles/castle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

BIN
data/newtiles/chairlegs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 B

BIN
data/newtiles/cord.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

BIN
data/newtiles/light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 B

BIN
data/newtiles/light2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

BIN
data/newtiles/tableleg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

View File

@ -487,3 +487,57 @@ file crightr0.png crightr1.png crightr2.png crightr3.png
animspeed 4
animsync
end
tile castle
id 4
solid 1
file newtiles/castle.png
end
tile castleback
id 5
solid 0
file newtiles/castleback.png
end
tile chairlegs
id 17
solid 2
file newtiles/chairlegs.png
end
tile tableleg
id 5
solid 0
file newtiles/tableleg.png
end
tile chairbackl
id 5
solid 0
file newtiles/chairbackl.png
end
tile chairbackr
id 5
solid 0
file newtiles/chairbackr.png
end
tile cord
id 5
solid 0
file newtiles/cord.png
end
tile light
id 5
solid 0
file newtiles/light.png
end
tile light2
id 5
solid 0
file newtiles/light2.png
end

23
defs.h
View File

@ -59,6 +59,7 @@
#define TEXTSIZE_TITLE2 16
#define TEXTSIZE_CREDIT 14
#define TEXTSIZE_LEVEL2 22
#define TEXTSIZE_YUM 24
#define TEXTSIZE_BIFF 26
#define TEXTSIZE_MULTI 26
#define TEXTSIZE_LEVEL 32
@ -75,7 +76,23 @@
#define TT_NORM 0
#define TT_HELP 1
#define TT_HELPSHADOW 2
#define TT_GAMEOVER 3
#define TT_INTROTEXT 3
#define TT_GAMEOVER 4
// intro states
#define IS_START 0
#define IS_YUM 1
#define IS_YUMWAIT 2
#define IS_JUMP 3
#define IS_RATS 4
#define IS_RATS2 5
#define IS_FINISH 6
// intro variables
#define INTRO_RATSPEED 12
#define INTRO_LEVELNUM 101
#define GAMEOVERWAIT 3 // # of seconds to wait before going back to title
@ -89,6 +106,7 @@
#define HURRYDELAY 50
#define LIFEDELAY 50
#define CLOVERDELAY 50
#define YUMDELAY 80
#define POKERMSGDELAY 80
#define LEVELWINDELAY 80
#define DIEDELAY 80
@ -207,7 +225,7 @@
// Limits
#define MAXLEVELS 100
#define MAXLEVELS 102
#define MAXMAPPINGS 50
#define MAXMONSTERSPERLEVEL 60
#define MAXLETTERHEIGHT 100
@ -865,6 +883,7 @@ typedef struct sprite_s {
// player and monster
struct sprite_s *onplatform;// are we on platform?
int antigrav; // don't fall
int lives; // only for player and bosses
int swimming; // are we in the water?
int falling; // are we falling?

6
edit.c
View File

@ -26,6 +26,8 @@ int selsprite = -1;
int modified = B_FALSE; // has the current level been modified since last save?
int allowfruits = B_FALSE;
int curlevelnum;
@ -92,6 +94,9 @@ int main (int argc, char **argv) {
} else if (!strcmp(argv[i], "-dump")) {
dumpinfo();
exit(1);
} else if (!strcmp(argv[i], "-c")) {
printf("allowing fruits\n");
allowfruits = B_TRUE;
} else if (!strcmp(argv[i], "-l")) {
if (++i >= argc) {
printf("Missing level number.\n");
@ -1134,6 +1139,7 @@ int isplacablesprite(int sid) {
if (sid == P_POWERUPPOS) return B_TRUE;
if (ismonster(sid) && (sid != P_BLACKCLOUD)) return B_TRUE;
if (isfruit(sid) == FT_GEM) return B_TRUE;
if (allowfruits && (isfruit(sid) == FT_FRUIT)) return B_TRUE;
return B_FALSE;
}

467
rc.c
View File

@ -36,6 +36,8 @@ SDL_Surface *credittext;
int globpowerup;
int globtimer;
int introstate;
TTF_Font *font[MAXLETTERHEIGHT];
char hiscoreserver[BUFLEN];
@ -514,6 +516,14 @@ int main (int argc, char **argv) {
}
}
/**********************************************
* Intro sequence
*/
if (inintro()) {
dointroseq();
}
/**********************************************
* Move onscreen text
*/
@ -697,8 +707,10 @@ int main (int argc, char **argv) {
// draw text
drawtext();
// draw score
drawscore();
if (!inintro()) {
// draw score
drawscore();
}
// draw boss health
if (boss) {
@ -1104,10 +1116,22 @@ void nextlevel(void) {
/* in case we skipped the level due to a powerup etc */
levelcomplete = LV_NEXTLEV;
/* go to next level */
curlevelnum++;
// this won't trigger on the first load of the intro
// becasue curlevelnum is decremented before this function
// is called. When the intro ENDs, the next line will
// be true.
if (curlevelnum == INTRO_LEVELNUM) {
curlevelnum = 1;
} else {
curlevelnum++;
}
if (!musicplaying || (curmusic == fastmusic)) {
playmusic(normalmusic);
if (curlevelnum != INTRO_LEVELNUM) {
playmusic(normalmusic);
}
}
// don't want the player flashing while scrolling
@ -1150,8 +1174,10 @@ void nextlevel(void) {
drawlevel();
// now the player gets invincibility
makeinvuln(player);
makeinvuln(player2);
if (!inintro()) {
makeinvuln(player);
makeinvuln(player2);
}
// phone is cancelled on boss levels
if (haspowerupany(PW_PHONE)) {
@ -1195,21 +1221,24 @@ void nextlevel(void) {
stopmusic();
playmusic(bossmusic);
} else {
if (curmusic != normalmusic) {
stopmusic();
playmusic(normalmusic);
if (curlevelnum != INTRO_LEVELNUM) {
if (curmusic != normalmusic) {
stopmusic();
playmusic(normalmusic);
}
}
}
level->iced = ICE_NONE;
level->icey = -1;
sprintf(msg, "Level %d-%d",getcurworld(), getcurlevel());
addoutlinetext(320,240-18,TEXTSIZE_LEVEL,msg,&white,&black,LEVELDELAY, TT_NORM);
if (!inintro()) {
sprintf(msg, "Level %d-%d",getcurworld(), getcurlevel());
addoutlinetext(320,240-18,TEXTSIZE_LEVEL,msg,&white,&black,LEVELDELAY, TT_NORM);
sprintf(msg, "\"%s\"", curlevel->name);
addoutlinetext(320,240+18,TEXTSIZE_LEVEL2,msg,&cyan,&black,LEVELDELAY, TT_NORM);
sprintf(msg, "\"%s\"", curlevel->name);
addoutlinetext(320,240+18,TEXTSIZE_LEVEL2,msg,&cyan,&black,LEVELDELAY, TT_NORM);
}
/* reset player stats */
if (player && player->lives > 0) {
@ -1601,6 +1630,8 @@ void checklevelend(void) {
sprite_t *s2;
int mcount;
if (inintro()) return;
if (!levelcomplete) {
mcount = 0;
/* any monsters left? */
@ -1945,6 +1976,12 @@ void checkcollide(sprite_t *s) {
s2->willbecome = P_DIAMOND;
}
}
} else if (inintro() && (s->id == P_RAT)) {
// collect fruits
if (isfruit(s2->id)) {
s2->dead = D_FINAL;
puffin(-1, s2->x, s2->y, "nothing", 0);
}
}
}
} // end for each sprite
@ -2715,104 +2752,113 @@ printf("jumping: %0.2f\n",s->jumpdir);
s->dir = s->owner->dir;
}
} else if (s->id == P_RAT) {
if (!s->falling) {
int move = B_FALSE;
int xdiff ,absxdiff;
tiletype_t *tunder;
if (inintro()) {
// move right FAST
double xpoint;
xpoint = (curlevel->powerupx * TILEW) + (TILEW/2);
if (s->x <= xpoint) {
movex(s, s->speed);
}
} else { // not in intro sequence
if (!s->falling) {
int move = B_FALSE;
int xdiff ,absxdiff;
tiletype_t *tunder;
/* distance to closest player */
xdiff = getxdisttoplayer(s);
absxdiff = abs(xdiff);
/* distance to closest player */
xdiff = getxdisttoplayer(s);
absxdiff = abs(xdiff);
// tile in front and below
tt = gettileat(s->x + s->dir*getspeed(s) + (s->dir * (s->img->w/2)),s->y + (TILEH/2),NULL,NULL);
// tile below
tunder = gettileat(s->x ,s->y + 1,NULL,NULL);
/* if there's a hole in front of us and below*/
if (tt->solid == S_NOTSOLID) {
// we're on a slope
if (tunder->solid == S_SLOPE) {
move = B_TRUE;
} else {
if (s->angry || boss) {
if ((player && (player->y > s->y)) || (player2 && (player2->y > s->y))) {
/* if player is below, fall off */
if (xdiff <= (TILEW*8)) {
// tile in front and below
tt = gettileat(s->x + s->dir*getspeed(s) + (s->dir * (s->img->w/2)),s->y + (TILEH/2),NULL,NULL);
// tile below
tunder = gettileat(s->x ,s->y + 1,NULL,NULL);
/* if there's a hole in front of us and below*/
if (tt->solid == S_NOTSOLID) {
// we're on a slope
if (tunder->solid == S_SLOPE) {
move = B_TRUE;
} else {
if (s->angry || boss) {
if ((player && (player->y > s->y)) || (player2 && (player2->y > s->y))) {
/* if player is below, fall off */
if (xdiff <= (TILEW*8)) {
move = B_TRUE;
}
} else if ((player && (player->y == s->y)) || (player2 && player2->y == s->y)) {
/* if player is at same level and close, jump */
if ((s->dir == D_RIGHT) && (xdiff > 0) && (xdiff <= (TILEW*7))) {
jump(s,D_RIGHT);
} else if ((s->dir == D_LEFT) && (xdiff < 0) && (xdiff >= -(TILEW*7))) {
jump(s,D_LEFT);
}
} else if (level->bottomopen && (s->y >= (480 - 100)) && isplayerabove(s)) {
// if near bottom of the screen and can fall through...
move = B_TRUE;
}
} else if ((player && (player->y == s->y)) || (player2 && player2->y == s->y)) {
/* if player is at same level and close, jump */
if ((s->dir == D_RIGHT) && (xdiff > 0) && (xdiff <= (TILEW*7))) {
jump(s,D_RIGHT);
} else if ((s->dir == D_LEFT) && (xdiff < 0) && (xdiff >= -(TILEW*7))) {
jump(s,D_LEFT);
}
} else if (level->bottomopen && (s->y >= (480 - 100)) && isplayerabove(s)) {
// if near bottom of the screen and can fall through...
move = B_TRUE;
}
}
} else {
move = B_TRUE;
}
} else {
move = B_TRUE;
}
/* either move or turn around */
if (move) {
rv = movex(s, s->dir*getspeed(s));
if (rv) {
/* if we couldn't move (hit a wall), turn */
/* either move or turn around */
if (move) {
rv = movex(s, s->dir*getspeed(s));
if (rv) {
/* if we couldn't move (hit a wall), turn */
s->dir = -s->dir;
}
} else {
s->dir = -s->dir;
}
} else {
s->dir = -s->dir;
}
if ((s->angry) || (boss)) {
if ((!s->jumping) && (!s->jumptimer)) {
if ((s->angry) || (boss)) {
if ((!s->jumping) && (!s->jumptimer)) {
/* if player is above us, jump */
if ( (player && (!player->dead) && (player->y < s->y)) ||
(player2 && (!player2->dead) && (player2->y < s->y))) {
if ((xdiff >= (TILEW*2)) && (xdiff <= (TILEW*3))) {
/* jump right */
jump(s, 1);
} else if ((xdiff <= -(TILEW*2)) && (xdiff >= -(TILEW*3))) {
/* jump left */
jump(s, -1);
} else if ((player && (s->y - player->y <= (TILEH*6))) ||
(player2 && (s->y - player2->y <= (TILEH*6)))) {
if ((xdiff >= 0) && (xdiff < (TILEW*2))) {
/* jump up */
jump(s, 0);
} else if ((xdiff <= 0) && (xdiff > -(TILEW*2))) {
/* jump up */
jump(s, 0);
/* if player is above us, jump */
if ( (player && (!player->dead) && (player->y < s->y)) ||
(player2 && (!player2->dead) && (player2->y < s->y))) {
if ((xdiff >= (TILEW*2)) && (xdiff <= (TILEW*3))) {
/* jump right */
jump(s, 1);
} else if ((xdiff <= -(TILEW*2)) && (xdiff >= -(TILEW*3))) {
/* jump left */
jump(s, -1);
} else if ((player && (s->y - player->y <= (TILEH*6))) ||
(player2 && (s->y - player2->y <= (TILEH*6)))) {
if ((xdiff >= 0) && (xdiff < (TILEW*2))) {
/* jump up */
jump(s, 0);
} else if ((xdiff <= 0) && (xdiff > -(TILEW*2))) {
/* jump up */
jump(s, 0);
}
} else {
/* jump whichever way we're facing */
/*
s->jumpdir = s->dir;
s->jumping = 1;
s->jumpspeed = 5;
*/
}
} else {
/* jump whichever way we're facing */
/*
s->jumpdir = s->dir;
s->jumping = 1;
s->jumpspeed = 5;
*/
}
}
}
}
} else { // falling
tiletype_t *tunder, *t2under;
} else { // falling
tiletype_t *tunder, *t2under;
// tile below
tunder = gettileat(s->x ,s->y,NULL,NULL);
t2under = gettileat(s->x ,s->y+s->img->h,NULL,NULL);
if ((tunder->solid == S_SLOPE) || (t2under->solid == S_SLOPE)) {
movex(s, s->dir*getspeed(s));
} else if (s->jumpdir) {
movex(s, s->jumpdir*getspeed(s));
// tile below
tunder = gettileat(s->x ,s->y,NULL,NULL);
t2under = gettileat(s->x ,s->y+s->img->h,NULL,NULL);
if ((tunder->solid == S_SLOPE) || (t2under->solid == S_SLOPE)) {
movex(s, s->dir*getspeed(s));
} else if (s->jumpdir) {
movex(s, s->jumpdir*getspeed(s));
}
}
}
} // end if inintro
} else if (s->id == P_SNAIL) {
if (!s->falling) {
int move = B_FALSE;
@ -4504,7 +4550,7 @@ void drawlevel(void) {
}
// draw player
if (curlevelnum != 1) {
if (curlevelnum != INTRO_LEVELNUM) {
if (player && player->lives > 0) {
drawsprite(player);
drawsprite(cloud);
@ -4521,7 +4567,7 @@ void drawlevel(void) {
SDL_framerateDelay(&manager);
// remove players
if (curlevelnum != 1) {
if (curlevelnum != INTRO_LEVELNUM) {
if (player && player->lives > 0) {
area.x = player->x - player->img->w/2;
area.y = player->y - player->img->h;
@ -4603,7 +4649,7 @@ void drawlevel(void) {
// draw player
if (curlevelnum != 1) {
if (curlevelnum != INTRO_LEVELNUM) {
if (player && player->lives > 0) {
drawsprite(player);
drawsprite(cloud);
@ -4620,7 +4666,7 @@ void drawlevel(void) {
SDL_framerateDelay(&manager);
// remove players
if (curlevelnum != 1) {
if (curlevelnum != INTRO_LEVELNUM) {
if (player && player->lives > 0) {
area.x = player->x - player->img->w/2;
area.y = player->y - player->img->h;
@ -4701,7 +4747,7 @@ void drawlevel(void) {
}
// draw player
if (curlevelnum != 1) {
if (curlevelnum != INTRO_LEVELNUM) {
if (player && player->lives > 0) {
drawsprite(player);
drawsprite(cloud);
@ -4719,7 +4765,7 @@ void drawlevel(void) {
// remove players
if (curlevelnum != 1) {
if (curlevelnum != INTRO_LEVELNUM) {
if (player && player->lives > 0) {
area.x = player->x - player->img->w/2;
area.y = player->y - player->img->h;
@ -4800,7 +4846,7 @@ void drawlevel(void) {
}
// draw player
if (curlevelnum != 1) {
if (curlevelnum != INTRO_LEVELNUM) {
if (player && player->lives > 0) {
drawsprite(player);
drawsprite(cloud);
@ -4817,7 +4863,7 @@ void drawlevel(void) {
SDL_framerateDelay(&manager);
// remove players
if (curlevelnum != 1) {
if (curlevelnum != INTRO_LEVELNUM) {
if (player && player->lives > 0) {
area.x = player->x - player->img->w/2;
area.y = player->y - player->img->h;
@ -4974,7 +5020,7 @@ void movetext(void) {
if (t->state == 0) {
t->size += TEXTSPEED;
if (t->size >= t->maxsize) {
if (t->type == TT_HELP) {
if (t->type == TT_HELP) {
// freeze
oldlevelcomplete = levelcomplete;
levelcomplete = LV_HELPFREEZE;
@ -4992,6 +5038,9 @@ void movetext(void) {
gameovertime = gtime;
}
killtext(t);
if (t->type == TT_INTROTEXT) {
introstate = IS_JUMP;
}
}
} else {
@ -5697,6 +5746,12 @@ int isonground(sprite_t *s) {
if (s->onplatform) {
return B_TRUE;
}
// antigrav?
if (s->antigrav) {
return B_TRUE;
}
/* get tile below sprite's feet */
if (isongroundpoint(s, s->x, s->y)) {
return B_TRUE;
@ -7829,11 +7884,14 @@ void moveallsprites(void) {
void checkcollideall(void) {
sprite_t *s;
/* check collisions for player and effects */
for (s = sprite ; s ; s = s->next) {
if (isplayer(s)) {
if (s->powerup != PW_GUNNER) {
checkcollide(s);
if (!inintro()) {
if (s->powerup != PW_GUNNER) {
checkcollide(s);
}
}
} else if (needscollisions(s->id)) {
if (isplatform(s->id)) {
@ -7843,6 +7901,8 @@ void checkcollideall(void) {
}
} else if ((s->id == P_BLACKCLOUD) && (globpowerup == PW_WHISTLE)) {
checkcollide(s);
} else if (inintro() && s->id == P_RAT) {
checkcollide(s);
}
}
}
@ -7873,8 +7933,13 @@ void checkwrap(sprite_t *s) {
if (!iseffect(s->id)) {
/* if we've fallen off the bottom... */
if (s->y > (480+s->img->h)) {
// move to top
s->y = -s->img->h;
if (inintro()) {
// die
s->dead = D_FINAL;
} else {
// move to top
s->y = -s->img->h;
}
}
/* if we've gone off the top */
if (s->y < -s->img->h) {
@ -9026,7 +9091,9 @@ if (cheat) {
/* ************************************************************
Player movement
************************************************************/
if ((!paused) && (!levelcomplete != LV_DOPOKER) ) {
if ((!inintro()) && !paused && (!levelcomplete != LV_DOPOKER) ) {
// is cloud touching the player?
if (levelcomplete == LV_CLOUD) {
sprite_t *c;
@ -9678,7 +9745,7 @@ void dotitlescreen(void) {
if ((htime > 0) && (htime % TTIME == 0)) {
if (titlemode == TS_INSERTCOIN) {
// INSERTCOIN -> NORMAL HISCORES
gethiscores(easymode());
if (wanthiscores) gethiscores(easymode());
titlemode = TS_HISCORES;
} else if (titlemode == TS_HISCORES) {
// next time, get other hiscores
@ -9770,6 +9837,9 @@ void startgame(void) {
curlevelnum = i;
}
}
} else {
// special intro level
curlevelnum = INTRO_LEVELNUM;
}
// allocate player
@ -9824,14 +9894,26 @@ void startgame(void) {
gtime = 0;
curlevelnum-- ; // since nextlevel() will increment it
// start intro
introstate = IS_START;
firstlevel = B_TRUE;
// start the first level
nextlevel();
firstlevel = B_FALSE;
flip();
// make players face the correct way
if (player) {
player->dir = D_RIGHT;
}
if (player2) {
player2->dir = D_LEFT;
}
// start timer
timer = 0;
}
@ -10970,3 +11052,170 @@ SDL_Color *getbgcolour (int id) {
return &black;
}
int inintro(void) {
if (curlevelnum == INTRO_LEVELNUM) return B_TRUE;
return B_FALSE;
}
void dointroseq(void) {
if (introstate == IS_START) {
if (gtime >= 1) {
introstate = IS_YUM;
}
} else if (introstate == IS_YUM) {
if (player) {
addoutlinetext(player->x,player->y - (player->img->h*1.5),TEXTSIZE_YUM,"Yum!",&white,&black,YUMDELAY, TT_INTROTEXT);
}
if (player2) {
addoutlinetext(player2->x,player2->y - (player2->img->h*1.5),TEXTSIZE_YUM,"Yum!",&white,&black,YUMDELAY, TT_INTROTEXT);
}
introstate = IS_YUMWAIT; // exits when yum text is gone
} else if (introstate == IS_JUMP) {
if (player) {
if (!player->jumping && !player->falling) {
jump(player, D_RIGHT);
player->jumpspeed = 7;
} else if (player->falling) {
movex(player, getspeed(player)/2);
}
}
if (player2) {
if (!player2->jumping && !player2->falling) {
jump(player2, D_LEFT);
player2->jumpspeed = 7;
} else if (player2->falling) {
movex(player2, -getspeed(player2)/2);
}
}
if ((player && player->falling) || (player2 && player2->falling)) {
sprite_t *newsp;
double startx,starty;
// add rats
startx = TILEW;
starty = (curlevel->p1y * TILEH) + TILEH-2;
puffin(-1, startx, starty, "nothing", 0);
newsp = addsprite(P_RAT, startx, starty, "intro_rat");
newsp->speed = INTRO_RATSPEED;
newsp->antigrav = B_TRUE;
introstate = IS_RATS;
playfx(FX_BOSSCHARGE);
}
} else if ((introstate == IS_RATS) || (introstate == IS_RATS2)) {
sprite_t *s;
double xpoint;
// keep moving until we hit the ground
if (player) {
if (player->falling) {
movex(player, getspeed(player));
}
if (introstate == IS_RATS2) {
// look around
if (timer % 15 == 0) {
player->dir = -player->dir;
}
}
}
if (player2) {
if (player2->falling) {
movex(player2, -getspeed(player2));
}
if (introstate == IS_RATS2) {
// look around
if (timer % 15 == 0) {
player2->dir = -player2->dir;
}
}
}
// add more rats
if (introstate != IS_RATS2) {
if (countmonsters(P_RAT) <= 4) {
if (timer % 5 == 0) {
sprite_t *newsp;
double startx,starty;
// add rats
startx = TILEW;
starty = (curlevel->p1y * TILEH) + TILEH-2;
puffin(-1, startx, starty, "nothing", 0);
newsp = addsprite(P_RAT, startx, starty, "intro_rat");
newsp->speed = INTRO_RATSPEED;
newsp->antigrav = B_TRUE;
}
}
}
// if rats are past p2 start point, they fall
xpoint = (curlevel->p2x * TILEW) + (TILEW/2);
for (s = sprite ; s ; s = s->next) {
if (ismonster(s->id)) {
if (s->x >= xpoint) {
s->antigrav = B_FALSE;
s->speed = (INTRO_RATSPEED / 2);
introstate = IS_RATS2;
}
}
}
// next state
if (countmonsters(-1) <= 0) {
introstate = IS_FINISH;
if (player) {
player->timer1 = 0;
player->timer2 = 0;
}
if (player2) {
player2->timer1 = 0;
player2->timer2 = 0;
}
}
} else if (introstate == IS_FINISH) {
int finished = B_FALSE;
// players jump up and down 3 times
if (player) {
if (isonground(player)) {
if (player->timer1 < 3) {
playfx(FX_JUMP);
player->jumping = 1;
player->jumpdir = 0;
player->jumpspeed = 2;
player->timer1++;
finished = B_FALSE;
}
} else {
if ((player->falling) && (player->timer1 >= 3)) {
finished = B_TRUE;
}
}
}
if (player2) {
if (isonground(player2)) {
if (player2->timer1 < 3) {
playfx(FX_JUMP);
player2->jumping = 1;
player2->jumpdir = 0;
player2->jumpspeed = 2;
player2->timer1++;
finished = B_FALSE;
}
} else {
if ((player2->falling) && (player2->timer1 >= 3)) {
finished = B_TRUE;
}
}
}
if (finished) {
if (levelcomplete == LV_INPROGRESS) {
// clouds come in
levelcomplete = LV_FINAL;
// don't delay
levelcompletetime = gtime;
gtime += 10;
}
}
}
}

2
rc.h
View File

@ -115,8 +115,10 @@ void doplayermovement(sprite_t *pl);
double getxdisttoplayer(sprite_t *s);
double getydisttoplayer(sprite_t *s);
int playersalive(void);
int inintro(void);
sprite_t *isplayerbelow(sprite_t *s);
sprite_t *isplayerabove(sprite_t *s);
sprite_t *isplayerright(sprite_t *s);
SDL_Color *getcolour(int id);
SDL_Color *getbgcolour(int id);
void dointroseq(void);

View File

@ -51,7 +51,12 @@ int loadlevel(int lnum, int wantmonsters) {
printf("Loading level %d-%d (seq %d) %s...",getworld(lnum), getlevel(lnum), lnum,levelentry[lnum].filename);
sprintf(filename,"%s/%s/%s",datadir,DIR_LEVELS,levelentry[lnum].filename);
if (lnum == 101) {
// special case for intro
sprintf(filename,"%s/%s/intro.dat",datadir,DIR_LEVELS);
} else {
sprintf(filename,"%s/%s/%s",datadir,DIR_LEVELS,levelentry[lnum].filename);
}
//filename = levelentry[lnum].filename;
f = fopen(filename,"rt");
@ -688,6 +693,8 @@ void setdefaults(sprite_t *s) {
s->onplatform = NULL;
s->antigrav = B_FALSE;
s->hasbell = B_FALSE;
s->gemboost = 1;
s->powerup = 0;