- tmp = shipy - (YSIZE / 2);
- tmp += shipdy * 25;
- tmp /= -25;
- tmp = ((screendy * (gamerate - 12)) + (tmp * gamerate)) / 12;
- screendy = -tmp;
- if(state == GAMEPLAY) {
- tmp = shipx - (XSIZE / 2);
- tmp += shipdx * 25;
- tmp /= -25;
- tmp = ((screendx * (gamerate - 12)) + (tmp * gamerate)) / 12;
- screendx = -tmp;
- } else screendx = 7.5;
-
- xscroll = screendx * gamerate;
- yscroll = screendy * gamerate;
-
- // INERTIA
- shipx += shipdx*gamerate - xscroll;
- shipy += shipdy*gamerate - yscroll;
-
- move_rocks();
-
-
- // BOUNCE X
- if(shipx<0 || shipx>XSIZE-surf_ship->w) {
- // BOUNCE from left and right wall
- shipx -= shipdx*gamerate;
- shipdx *= -0.99;
+ tmp = (ship.y+ship.dy*t_frame-YSCROLLTO)/25 + (ship.dy-screendy);
+ screendy += tmp * t_frame/12;
+ tmp = (ship.x+ship.dx*t_frame-XSCROLLTO)/25 + (ship.dx-screendx);
+ 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)
+ 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);
+
+ // move bang center
+ bangx += (bangdx - screendx)*t_frame;
+ bangy += (bangdy - screendy)*t_frame;
+
+ move_sprites();
+
+
+ // BOUNCE off left or right edge of screen
+ if(ship.x < 0 || ship.x+ship.w > XSIZE) {
+ ship.x -= (ship.dx-screendx)*t_frame;
+ ship.dx = screendx - (ship.dx-screendx)*opt_bounciness;