We now take the square root of the ship's velocity, instead of just half.
This appears to put it nicely in the middle of the hole left by the
explosion, whatever speed you are going.
Also, you now have control over your ship during the DEAD_PAUSE; so it fades
in, and is invulnerable until it becomes fully opaque. Note that the dead
pause is still the same length as it was before.
+ float xscroll = screendx * t_frame;
+ float yscroll = screendy * t_frame;
for(i=0; i<N_DUST_MOTES; i++) {
motes[i].x -= xscroll / (1.3 + motes[i].z);
motes[i].y -= yscroll / (1.3 + motes[i].z);
for(i=0; i<N_DUST_MOTES; i++) {
motes[i].x -= xscroll / (1.3 + motes[i].z);
motes[i].y -= yscroll / (1.3 + motes[i].z);
extern char *initerror;
extern float screendx, screendy;
extern char *initerror;
extern float screendx, screendy;
-extern float xscroll, yscroll;
-extern float yscroll;
-extern float scrollvel;
// All movement is based on t_frame.
// All speeds are pixels/tick, with 20 ticks per second.
// All movement is based on t_frame.
// All speeds are pixels/tick, with 20 ticks per second.
struct ship ship = { SHIP, 0, NULL, XSIZE/2, YSIZE/2, SCREENDXMIN, 0.0 };
float screendx = SCREENDXMIN, screendy = 0.0;
struct ship ship = { SHIP, 0, NULL, XSIZE/2, YSIZE/2, SCREENDXMIN, 0.0 };
float screendx = SCREENDXMIN, screendy = 0.0;
float back_dist;
// all movement is based on t_frame.
float back_dist;
// all movement is based on t_frame.
if(bdot[i].life<0) { bdot[i].active = 0; continue; }
// move and clip
if(bdot[i].life<0) { bdot[i].active = 0; continue; }
// move and clip
- bdot[i].x += bdot[i].dx*t_frame - xscroll;
- bdot[i].y += bdot[i].dy*t_frame - yscroll;
+ bdot[i].x += (bdot[i].dx - screendx)*t_frame;
+ bdot[i].y += (bdot[i].dy - screendy)*t_frame;
if(bdot[i].x < 0 || bdot[i].x >= XSIZE || bdot[i].y < 0 || bdot[i].y >= YSIZE) {
bdot[i].active = 0;
continue;
if(bdot[i].x < 0 || bdot[i].x >= XSIZE || bdot[i].y < 0 || bdot[i].y >= YSIZE) {
bdot[i].active = 0;
continue;
for(i = 0; i<MAXENGINEDOTS; i++) {
if(!edot[i].active) continue;
for(i = 0; i<MAXENGINEDOTS; i++) {
if(!edot[i].active) continue;
- edot[i].x += edot[i].dx*t_frame - xscroll;
- edot[i].y += edot[i].dy*t_frame - yscroll;
+ edot[i].x += (edot[i].dx - screendx)*t_frame;
+ edot[i].y += (edot[i].dy - screendy)*t_frame;
edot[i].life -= t_frame*3;
if(edot[i].life < 0
|| edot[i].x<0 || edot[i].x >= XSIZE
edot[i].life -= t_frame*3;
if(edot[i].life < 0
|| edot[i].x<0 || edot[i].x >= XSIZE
screendx += tmp * t_frame/12;
// taper off so we don't hit the barrier abruptly.
// (if we would hit in < 2 seconds, adjust to 2 seconds).
screendx += tmp * t_frame/12;
// taper off so we don't hit the barrier abruptly.
// (if we would hit in < 2 seconds, adjust to 2 seconds).
- if(back_dist + (screendx - SCREENDXMIN)*TO_TICKS(2) < 0) {
+ if(back_dist + (screendx - SCREENDXMIN)*TO_TICKS(2) < 0)
screendx = SCREENDXMIN - (back_dist/TO_TICKS(2));
screendx = SCREENDXMIN - (back_dist/TO_TICKS(2));
back_dist += (screendx - SCREENDXMIN)*t_frame;
if(opt_max_lead >= 0) back_dist = min(back_dist, opt_max_lead);
back_dist += (screendx - SCREENDXMIN)*t_frame;
if(opt_max_lead >= 0) back_dist = min(back_dist, opt_max_lead);
- xscroll = screendx * t_frame;
- yscroll = screendy * t_frame;
-
- bangx += bangdx*t_frame - xscroll;
- bangy += bangdy*t_frame - yscroll;
+ bangx += (bangdx - screendx)*t_frame;
+ bangy += (bangdy - screendy)*t_frame;
play_sound(SOUND_BANG); // Play the explosion sound
bangx = ship.x; bangy = ship.y; bangdx = ship.dx; bangdy = ship.dy;
new_bang_dots(ship.x,ship.y,ship.dx,ship.dy,ship.image);
play_sound(SOUND_BANG); // Play the explosion sound
bangx = ship.x; bangy = ship.y; bangdx = ship.dx; bangdy = ship.dy;
new_bang_dots(ship.x,ship.y,ship.dx,ship.dy,ship.image);
- ship.dx *= 0.5; ship.dy *= 0.5;
- if(ship.dx < SCREENDXMIN) ship.dx = SCREENDXMIN;
- if(--ship.lives <= 0) {
+
+ if(--ship.lives) {
+ state = DEAD_PAUSE;
+ state_timeout = DEAD_PAUSE_LENGTH;
+ ship.dx = (ship.dx < 0) ? -sqrt(-ship.dx) : sqrt(ship.dx);
+ ship.dy = (ship.dy < 0) ? -sqrt(-ship.dy) : sqrt(ship.dy);
+ if(ship.dx < SCREENDXMIN) ship.dx = SCREENDXMIN;
+ } else {
state = GAME_OVER;
ship.dx = SCREENDXMIN; ship.dy = 0;
state_timeout = 200.0;
fadetimer = 0.0;
faderate = t_frame;
state = GAME_OVER;
ship.dx = SCREENDXMIN; ship.dy = 0;
state_timeout = 200.0;
fadetimer = 0.0;
faderate = t_frame;
- } else {
- state = DEAD_PAUSE;
- state_timeout = DEAD_PAUSE_LENGTH;
|| state == GAME_OVER)) {
reset_sprites();
reset_rocks();
|| state == GAME_OVER)) {
reset_sprites();
reset_rocks();
+ screendx = SCREENDXMIN; screendy = 0;
ship.x = XSIZE/2.2; ship.y = YSIZE/2;
ship.dx = screendx; ship.dy = screendy;
ship.x = XSIZE/2.2; ship.y = YSIZE/2;
ship.dx = screendx; ship.dy = screendy;