- [+] change net colouring

- [+] draw sprite for end of netting
- [+] add starfield zooming up at end to make it obvious you're falling
- [+] blackcloud bugs:
    - [+] shouldn't be killed by headcrush
    - [+] shouldn't be moved by platforms
    - [+] shouldn't bounce on trampolines
This commit is contained in:
Rob Pearce 2013-08-27 12:59:20 +00:00
parent b8bc4af6f0
commit 49bdea060d
6 changed files with 128 additions and 54 deletions

BIN
data/sprites/net.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

7
defs.h
View File

@ -496,7 +496,7 @@ enum SPELL {
#define S_SLOPE 2 #define S_SLOPE 2
// Sprite types // Sprite types
#define MAXPTYPES 179 #define MAXPTYPES 181
#define P_PLAYER 0 #define P_PLAYER 0
#define P_RAT 1 #define P_RAT 1
#define P_CHEESE 2 #define P_CHEESE 2
@ -681,7 +681,8 @@ enum SPELL {
#define P_FALLINGBRICK 176 #define P_FALLINGBRICK 176
#define P_BIGCHEST 177 #define P_BIGCHEST 177
#define P_FIREUP 178 #define P_FIREUP 178
#define P_NET 179
#define P_UPSTAR 180
#define FLY_FLYTIME 150 #define FLY_FLYTIME 150
#define FLY_WALKTIME 300 #define FLY_WALKTIME 300
@ -759,6 +760,8 @@ enum SPELL {
#define PW_ENDGAME 54 #define PW_ENDGAME 54
#define MINUPSTARS 50
#define GUNNERSPEED 2.5 // speed crosshair moves in gunner mode #define GUNNERSPEED 2.5 // speed crosshair moves in gunner mode
#define GUNNERDELAY 10 // how fast gunner powerup shoots #define GUNNERDELAY 10 // how fast gunner powerup shoots

View File

@ -97,9 +97,11 @@ SDL_Color red;
SDL_Color black; SDL_Color black;
SDL_Color blue; SDL_Color blue;
SDL_Color white; SDL_Color white;
SDL_Color white2;
SDL_Color green; SDL_Color green;
SDL_Color purple; SDL_Color purple;
SDL_Color yellow; SDL_Color yellow;
SDL_Color orange;
#endif #endif

70
rc.c
View File

@ -29,8 +29,6 @@
#include "shared.h" #include "shared.h"
#include "rc.h" #include "rc.h"
FPSmanager manager; FPSmanager manager;
SDL_Surface *temps; SDL_Surface *temps;
SDL_Surface *screen; SDL_Surface *screen;
@ -190,6 +188,7 @@ SDL_Color purple = {200, 0, 200, 0};
SDL_Color brown = {166, 97, 7, 0}; SDL_Color brown = {166, 97, 7, 0};
SDL_Color brown2 = {116, 47, 0, 0}; SDL_Color brown2 = {116, 47, 0, 0};
SDL_Color white = {255, 255, 255, 0}; SDL_Color white = {255, 255, 255, 0};
SDL_Color white2 = {150, 150, 150, 0};
SDL_Color grey = {210, 210, 210, 0}; SDL_Color grey = {210, 210, 210, 0};
SDL_Color grey2 = {90, 90, 90, 0}; SDL_Color grey2 = {90, 90, 90, 0};
SDL_Color green = {0, 255, 0, 0}; SDL_Color green = {0, 255, 0, 0};
@ -1150,6 +1149,9 @@ printf("timer = %d\n",timer);
ss->xs = 0; ss->xs = 0;
ss->ys = rand() % 2; ss->ys = rand() % 2;
} }
if (countsprites(P_UPSTAR) < MINUPSTARS) {
addupstar();
}
if (endgame == EG_FADETOBLACK) { if (endgame == EG_FADETOBLACK) {
int val; int val;
@ -2361,6 +2363,8 @@ void checkcollideplatform(sprite_t *s) {
// only monsters and players and fruits can be on platforms // only monsters and players and fruits can be on platforms
if (!ismonster(s2->id) && (!isplayer(s2)) && (!isfruit(s2->id))) { if (!ismonster(s2->id) && (!isplayer(s2)) && (!isfruit(s2->id))) {
continue; continue;
} else if (s2->id == P_BLACKCLOUD) {
continue;
} }
if (s2->onplatform == s) { if (s2->onplatform == s) {
@ -2549,7 +2553,6 @@ void checkcollide(sprite_t *s) {
s2->caughtstate = C_NETTING; s2->caughtstate = C_NETTING;
s->netcaught++; s->netcaught++;
// special case for whitetail // special case for whitetail
if (s2->id == P_WSPIDER) { if (s2->id == P_WSPIDER) {
s2->timer2 = 0; s2->timer2 = 0;
@ -2809,7 +2812,6 @@ int movesprite(sprite_t *s) {
return B_FALSE; return B_FALSE;
} }
if (levelcomplete == LV_INIT) { if (levelcomplete == LV_INIT) {
// most things can't move in this state // most things can't move in this state
//if ((s->id != P_PUFF) && (s != player)) { //if ((s->id != P_PUFF) && (s != player)) {
@ -3489,6 +3491,18 @@ int movesprite(sprite_t *s) {
// die // die
s->dead = D_FINAL; s->dead = D_FINAL;
} }
} else if (s->id == P_UPSTAR) { // star at endgame
double oldy;
// rise to top of screen then die
oldy = s->y;
s->y = s->y - (s->ys*2);
// if off screen
if (s->y <= 0) {
// die
s->dead = D_FINAL;
}
} else if (s->id == P_BUBBLE) { // bubble effect } else if (s->id == P_BUBBLE) { // bubble effect
tiletype_t *tt; tiletype_t *tt;
// float up, die when we leave the water // float up, die when we leave the water
@ -5343,7 +5357,7 @@ int movesprite(sprite_t *s) {
s2->y += ydiff; s2->y += ydiff;
// check if s2's head has hit something // check if s2's head has hit something
if (preroof && isroofabove(s2) && (ydiff < 0)) { if (preroof && isroofabove(s2) && (ydiff < 0) && (s2->id != P_BLACKCLOUD)) {
if (isplayer(s2)) { if (isplayer(s2)) {
die(s2); die(s2);
printf("DB: killed by head crush\n"); fflush(stdout); printf("DB: killed by head crush\n"); fflush(stdout);
@ -7934,6 +7948,7 @@ void drawscore(void) {
} }
// level # // level #
if (globpowerup != PW_ENDGAME) {
sprintf(tempm, "Level %d-%d",getcurworld(), getcurlevel()); sprintf(tempm, "Level %d-%d",getcurworld(), getcurlevel());
/* shadow */ /* shadow */
score = TTF_RenderText_Solid(font[TEXTSIZE_SCORE], tempm, black); score = TTF_RenderText_Solid(font[TEXTSIZE_SCORE], tempm, black);
@ -7951,6 +7966,7 @@ void drawscore(void) {
area.h = 0; area.h = 0;
SDL_BlitSurface(score, NULL, screen, &area); SDL_BlitSurface(score, NULL, screen, &area);
SDL_FreeSurface(score); SDL_FreeSurface(score);
}
drawcredits(); drawcredits();
@ -8145,6 +8161,8 @@ void drawnetting(sprite_t *s) {
s->netystart = s->nety - 3; s->netystart = s->nety - 3;
if (s->netdir == 1) { if (s->netdir == 1) {
area.x = s->netxstart + TILEW/2; area.x = s->netxstart + TILEW/2;
} else { } else {
@ -8161,7 +8179,11 @@ void drawnetting(sprite_t *s) {
dis = (int)s->img->h / (int)(netsleft+1) + 1; dis = (int)s->img->h / (int)(netsleft+1) + 1;
for (y = dis; y < s->img->h; y += dis) { for (y = dis; y < s->img->h; y += dis) {
SDL_Rect endarea;
SDL_Surface *netim;
yy = s->y - s->img->h; yy = s->y - s->img->h;
yy += y; yy += y;
@ -8169,15 +8191,22 @@ void drawnetting(sprite_t *s) {
if (s->netsticky) { if (s->netsticky) {
drawdotline16(screen,sx,s->nety,xx,yy,orange,yellow); drawdotline16(screen,sx,s->nety,xx,yy,orange,yellow);
} else { } else {
drawline(screen,sx,s->nety,xx,yy,white); drawdotline16(screen,sx,s->nety,xx,yy,white,white2);
} }
// add sparkle // add sparkle
xx = s->x + s->netdir*s->netlen; xx = s->x + s->netdir*s->netlen;
if (levelcomplete != LV_HELPFREEZE) { if (levelcomplete != LV_HELPFREEZE) {
addsprite(P_SPARKLE, xx + (rand() % 14) - 7, yy + (rand() % 8) - 4, "sparkle"); addsprite(P_SPARKLE, xx + (rand() % 14) - 7, yy + (rand() % 8) - 4, "sparkle");
} }
netim = imageset[P_NET].img[(s->netdir == 1) ? 0 : 1];
endarea.x = xx;
endarea.y = yy - (netim->h/2);
SDL_BlitSurface(netim, NULL, screen, &endarea);
} }
//drawline(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety-3,white); //drawline(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety-3,white);
//drawline(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety,white); //drawline(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety,white);
//drawline(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety+3,white); //drawline(screen,sx,s->nety,s->x + s->netdir*s->netlen,s->nety+3,white);
@ -8200,7 +8229,7 @@ void drawnetting(sprite_t *s) {
col2 = &yellow; col2 = &yellow;
} else { } else {
col1 = &white; col1 = &white;
col2 = &white; col2 = &white2;
} }
/* middle dotline */ /* middle dotline */
@ -8565,6 +8594,7 @@ void dogravity(sprite_t *s) {
} }
// if we were on a trampoline and are now not, it releases */ // if we were on a trampoline and are now not, it releases */
if (s->id != P_BLACKCLOUD) {
tt = gettileat(s->x,s->y,&tilex,&tiley); tt = gettileat(s->x,s->y,&tilex,&tiley);
if (s->ontramp) { if (s->ontramp) {
if (s->trampy == tiley) { if (s->trampy == tiley) {
@ -8586,7 +8616,7 @@ void dogravity(sprite_t *s) {
s->trampy = -1; s->trampy = -1;
} }
} }
}
if (s->dead) return; if (s->dead) return;
@ -9599,7 +9629,7 @@ int dofruiteffect(sprite_t *pp, sprite_t *s) {
} }
return B_TRUE; return B_TRUE;
} else if (s->id == P_BIGCHEST) { // trigger endgame! } else if (s->id == P_BIGCHEST) { // trigger endgame!
int tx,ty; int tx,ty,i;
sprite_t *s2,*nexts; sprite_t *s2,*nexts;
endgame = EG_FRUITFALL; endgame = EG_FRUITFALL;
endtexttimer = 0; endtexttimer = 0;
@ -9617,6 +9647,12 @@ int dofruiteffect(sprite_t *pp, sprite_t *s) {
} }
globpowerup = PW_ENDGAME; globpowerup = PW_ENDGAME;
globtimer = 0; globtimer = 0;
// add initial stars
for (i = 0; i < MINUPSTARS; i++) {
sprite_t *ss;
ss = addupstar();
ss->y = (rand() % (480-(TILEH*2))) + TILEH;
}
// all tiles become fruit // all tiles become fruit
for (ty = 0 ; ty < LEVELH; ty++) { for (ty = 0 ; ty < LEVELH; ty++) {
for (tx = 0 ; tx < LEVELW; tx++) { for (tx = 0 ; tx < LEVELW; tx++) {
@ -10772,6 +10808,18 @@ char *addcommas(char *buffer, long num) {
return buffer; return buffer;
} }
sprite_t *addupstar(void) {
sprite_t *ss;
int x,y;
// spawn a new star
x = (rand() % (640-(TILEW*2))) + TILEW;
y = 480;
ss = addsprite(P_UPSTAR, x, y, "upstar");
ss->xs = 0;
ss->ys = (rand() % 4)+1;
return ss;
}
int addscore(sprite_t *s, long amt) { int addscore(sprite_t *s, long amt) {
int oldscore; int oldscore;
oldscore = s->score; oldscore = s->score;
@ -12208,7 +12256,8 @@ if (cheat) {
playfx(FX_POWERUP); playfx(FX_POWERUP);
sprintf(tempm, "Cheat!"); sprintf(tempm, "Cheat!");
if (player) { if (player) {
player->powerup = PW_MAGNET; //player->powerup = PW_MAGNET;
player->powerup = PW_RAYGUN;
player->netmax = 4; // all nets player->netmax = 4; // all nets
player->netbig = B_TRUE; // big net player->netbig = B_TRUE; // big net
player->speed = 2; // fast player->speed = 2; // fast
@ -12596,7 +12645,6 @@ void trytoslam(sprite_t *pl) {
} }
void trytoshoot(sprite_t *pl) { void trytoshoot(sprite_t *pl) {
if (pl->caughtby) return; if (pl->caughtby) return;
if ((!pl->netting) && (!pl->slamming)) { if ((!pl->netting) && (!pl->slamming)) {

1
rc.h
View File

@ -55,6 +55,7 @@ int counttextoftype(int wanttype);
int getpoints(int id); int getpoints(int id);
int isladder(int tid); int isladder(int tid);
char *addcommas(char *buffer, long num); char *addcommas(char *buffer, long num);
sprite_t *addupstar(void);
int addscore(sprite_t *s, long amt); int addscore(sprite_t *s, long amt);
void extralife(sprite_t *s); void extralife(sprite_t *s);
void doice(void); void doice(void);

View File

@ -1982,13 +1982,15 @@ int loadimagesets(void) {
} }
// sparkles // sparkles + endgame stars
for (i = 0; i < SPARKLEFRAMES; i++) { for (i = 0; i < SPARKLEFRAMES; i++) {
char name[SMALLBUFLEN]; char name[SMALLBUFLEN];
sprintf(name, "sprites/sparkle%d.png",i); sprintf(name, "sprites/sparkle%d.png",i);
loadspriteimage(P_SPARKLE,i, name); loadspriteimage(P_SPARKLE,i, name);
loadspriteimage(P_UPSTAR, i, name);
} }
imageset[P_SPARKLE].numimages = SPARKLEFRAMES; imageset[P_SPARKLE].numimages = SPARKLEFRAMES;
imageset[P_UPSTAR].numimages = SPARKLEFRAMES;
loadspriteimage(P_BUBBLE,F_WALK1, "sprites/bubble.png"); loadspriteimage(P_BUBBLE,F_WALK1, "sprites/bubble.png");
imageset[P_BUBBLE].numimages = 1; imageset[P_BUBBLE].numimages = 1;
@ -2029,6 +2031,11 @@ int loadimagesets(void) {
loadspriteimage(P_SONAR,9, "sprites/sonar1.png"); loadspriteimage(P_SONAR,9, "sprites/sonar1.png");
imageset[P_SONAR].numimages = 10; imageset[P_SONAR].numimages = 10;
loadspriteimage(P_NET,0, "sprites/net.png");
// manually do flipped one
imageset[P_NET].img[1] = rotozoomSurfaceXY(imageset[P_NET].img[0], 0, -1,1,0);
imageset[P_NET].numimages = 2;
// manual angry image for black cloud // manual angry image for black cloud
origi = imageset[P_BLACKCLOUD].img[0]; origi = imageset[P_BLACKCLOUD].img[0];
@ -2248,6 +2255,9 @@ void drawsprite(sprite_t *s) {
frame = F_WALK1; frame = F_WALK1;
} else if (s->id == P_METEOR) { } else if (s->id == P_METEOR) {
frame = F_WALK1; frame = F_WALK1;
} else if (s->id == P_UPSTAR) {
// frame based on speed
frame = (s->ys - 1);
} else if (s->id == P_STAR) { } else if (s->id == P_STAR) {
frame = s->timer1; frame = s->timer1;
} else if (s->id == P_MASK) { } else if (s->id == P_MASK) {
@ -2664,12 +2674,17 @@ void drawsprite(sprite_t *s) {
if ((s->caughtby) && (s->caughtstate == 2)){ if ((s->caughtby) && (s->caughtstate == 2)){
// only if we're on the screen // only if we're on the screen
if ((s->y >= 0) && (s->y <= 480)) { if ((s->y >= 0) && (s->y <= 480)) {
drawline(screen, s->x,s->y - s->img->h, SDL_Color *col1 = &white,*col2 = &white2;
s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); if (s->caughtby->netsticky) {
drawline(screen, s->x,s->y - (s->img->h/2), col1 = &orange;
s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); col2 = &yellow;
drawline(screen, s->x,s->y, }
s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), white); drawdotline16(screen, s->x,s->y - s->img->h,
s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), *col1, *col2);
drawdotline16(screen, s->x,s->y - (s->img->h/2),
s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), *col1,*col2);
drawdotline16(screen, s->x,s->y,
s->caughtby->x,s->caughtby->y-(s->caughtby->img->h/2), *col1,*col2);
} }
} }
@ -2972,6 +2987,7 @@ int isplatform(int id) {
int iseffect(int id) { int iseffect(int id) {
switch (id) { switch (id) {
case P_UPSTAR:
case P_PUFF: case P_PUFF:
case P_SPARKLE: case P_SPARKLE:
case P_SMASH: case P_SMASH:
@ -2997,6 +3013,7 @@ int iseffect(int id) {
case P_WINGRIGHT: case P_WINGRIGHT:
case P_BIGUMBRELLA: case P_BIGUMBRELLA:
case P_SMALLANCHOR: case P_SMALLANCHOR:
case P_NET:
return B_TRUE; return B_TRUE;
} }
@ -3827,6 +3844,9 @@ int isnettable(sprite_t *s) {
// return starting health for a given boss type // return starting health for a given boss type
int getbosshealth(int mid) { int getbosshealth(int mid) {
if (cheat) {
return 1;
}
switch (mid) { switch (mid) {
case P_KINGRAT: case P_KINGRAT:
return 8; return 8;