diff --git a/data/levels.dat b/data/levels.dat index d59c117..18b57da 100644 --- a/data/levels.dat +++ b/data/levels.dat @@ -45,3 +45,4 @@ 405,level405.dat,Pitfalls 109,level109.dat,THE END SO FAR 99,level99.dat,TEST LEVEL +406,level406.dat,NEW LEVEL diff --git a/data/sprites/platform.png b/data/sprites/platform.png index 9ac64ae..af4aed4 100644 Binary files a/data/sprites/platform.png and b/data/sprites/platform.png differ diff --git a/data/world1/level42.dat b/data/world1/level42.dat index 4963a04..48108ca 100644 --- a/data/world1/level42.dat +++ b/data/world1/level42.dat @@ -45,7 +45,7 @@ exitdir 1 57,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,0,0,0,0,0,0,0,0,0,0,0,0,0,57, 57,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,0,0,0,0,0,0,0,0,0,0,0,0,0,57, 57,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,0,0,0,0,0,0,0,0,0,0,0,0,0,57, -57,58,58,58,58,58,58,58,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,58,58,58,58,58,58,58,57, +57,58,58,58,58,58,60,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,0,59,58,58,58,58,58,57, 57,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,0,0,0,0,0,0,0,0,0,0,0,0,0,57, 57,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,0,0,0,0,0,0,0,0,0,0,0,0,0,57, 57,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,0,0,0,0,0,0,0,0,0,0,0,0,0,57, diff --git a/defs.h b/defs.h index 8f37cba..836a268 100644 --- a/defs.h +++ b/defs.h @@ -465,6 +465,12 @@ #define P_RANDOM 131 #define P_PLATFORM 132 + +#define PLATFORMDELAY 4 +#define PLATFORM_ACCEL 0.5 // how fast platforms accelerate/decellerate +#define PLATFORM_MINSPEED 0.3 +#define PLATFORM_MAXSPEED 3 + // cards #define CARDFONTX 4 #define CARDFONTY 6 @@ -823,6 +829,7 @@ typedef struct sprite_s { int timer3; // int timer4; // int watertimer; // + double dbltimer; int frame; diff --git a/rc.c b/rc.c index 76b02b3..0c25575 100644 --- a/rc.c +++ b/rc.c @@ -2972,32 +2972,79 @@ int movesprite(sprite_t *s) { } } else if (s->id == P_PLATFORM) { // moving platform + // timer1 tells whether we are at top speed double dstx,dsty; int rv; if (s->numwaypoints > 0) { sprite_t *s2; double oldx,oldy,xdiff,ydiff; + double slowpoint; + + slowpoint = ((double)TILEW*2.5); + //slowpoint = (0.10 * s->dbltimer); // 10% of full distance oldx = s->x; oldy = s->y; // move torwaeds next waypoints + + dstx = s->wayx[s->curwaypoint]; dsty = s->wayy[s->curwaypoint]; - rv = moveto(s,dstx,dsty,getspeed(s),getspeed(s)); + + if (s->dbltimer == -1) { // haven't set full distance yet + s->dbltimer = getdistance(s->x,s->y,dstx,dsty); + if (s->dbltimer > slowpoint*2) { + s->timer1 = 0; // at top speed + } else { + s->timer1 = 1; + } + } + + rv = moveto(s,dstx,dsty,s->speed,s->speed); + + // remember how far we moved + xdiff = s->x - oldx; + ydiff = s->y - oldy; // got there? - if (rv) { + if (rv == 0) { // go to next waypoint s->curwaypoint++; if (s->curwaypoint >= s->numwaypoints) { s->curwaypoint = 0; } + // recalc total distance + dstx = s->wayx[s->curwaypoint]; + dsty = s->wayy[s->curwaypoint]; + s->dbltimer = getdistance(s->x,s->y,dstx,dsty); + } else { + // adjust speed + if (timer % PLATFORMDELAY == 0) { + double maxspeed = getspeed(s); + + if ((rv <= slowpoint) && (s->timer1 <= 0)) { // getting close... + // slow down + s->timer1 = -1; + if (s->speed > PLATFORM_MINSPEED) { + s->speed -= PLATFORM_ACCEL; + if (s->speed < PLATFORM_MINSPEED) s->speed = PLATFORM_MINSPEED; + } + } else if (s->speed < maxspeed) { + // speed up + s->timer1 = 1; // speeding up + s->speed += PLATFORM_ACCEL; + if (s->speed > maxspeed) s->speed = maxspeed; + } + // reached top speed? + if (s->speed >= maxspeed) { + if (rv > slowpoint*2) { + s->timer1 = 0; // at top speed + } + } + } } - // remember how far we moved - xdiff = s->x - oldx; - ydiff = s->y - oldy; // move anything on top of us by the same amount for (s2 = sprite ; s2 ; s2 = s2->next) { @@ -4140,7 +4187,7 @@ double getspeed(sprite_t *s ) { } else if (id == P_KINGRAT) { speed = 1.5; } else if (id == P_PLATFORM) { - speed = 2; + speed = PLATFORM_MAXSPEED; } if (isinwater(s) && (s->id != P_FISH)) { @@ -6365,15 +6412,17 @@ void channeldone(int channel) { // move player towards new position -// return true if we're there +// return distance left int moveto(sprite_t *p, int dstx, int dsty, double xspeed, double yspeed) { double ang,xs,ys; + int distanceleft; int therex = B_FALSE,therey = B_FALSE; // figure out angle to player ang = atan2(dsty - p->y, dstx - p->x); xs = (cos(ang) * xspeed); ys = (sin(ang) * yspeed); + if (p->x < dstx) { p->x += xs; if (p->x >= dstx) { @@ -6405,9 +6454,12 @@ int moveto(sprite_t *p, int dstx, int dsty, double xspeed, double yspeed) { therey = B_TRUE; } - if (therex && therey) return B_TRUE; + // figure out distance to target + distanceleft = getdistance(p->x,p->y,dstx,dsty); - return B_FALSE; + if (therex && therey) return 0; + + return distanceleft; } // grabs area behind a sprite into a temp buffer @@ -9478,3 +9530,12 @@ int easymode(void) { return B_FALSE; } + +double getdistance(double x1, double y1, double x2, double y2) { + double xdis,ydis; + xdis = abs(x1 - x2); + ydis = abs(y1 - y2); + if ((xdis == 0) && (ydis == 0)) { + return 0; + } else return sqrt((xdis*xdis) + (ydis*ydis)); +} diff --git a/rc.h b/rc.h index b7de957..7fd3005 100644 --- a/rc.h +++ b/rc.h @@ -108,3 +108,4 @@ int easymode(void); int uncaughtmonsters(void); void swimup(sprite_t *pl); void swimdown(sprite_t *pl); +double getdistance(double x1, double y1, double x2, double y2); diff --git a/shared.c b/shared.c index dc80598..4f50d14 100644 --- a/shared.c +++ b/shared.c @@ -612,7 +612,12 @@ void setdefaults(sprite_t *s) { s->armour = B_FALSE; } } else { - s->speed = 1; + if (s->id == P_PLATFORM) { + s->speed = PLATFORM_MAXSPEED; + } else { + s->speed = 1; + } + s->armour = B_FALSE; s->netsticky = B_FALSE; s->doublejump = B_FALSE; @@ -654,6 +659,7 @@ void setdefaults(sprite_t *s) { s->timer2 = 0; s->timer3 = 0; s->timer4 = 0; + s->dbltimer = -1; s->dropping = 0; s->dropx = -1; s->dropy = -1;