summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--viewport.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/viewport.c b/viewport.c
index dfe527da1..3259e286b 100644
--- a/viewport.c
+++ b/viewport.c
@@ -1276,28 +1276,39 @@ void UpdateViewportPosition(Window *w)
pt = MapXYZToViewport(vp, veh->x_pos, veh->y_pos, veh->z_pos);
SetViewportPosition(w, pt.x, pt.y);
} else {
+#if !defined(NEW_ROTATION)
+ int x;
+ int y;
+ int vx;
+ int vy;
+
+ // Center of the viewport is hot spot
+ x = WP(w,vp_d).scrollpos_x + vp->virtual_width / 2;
+ y = WP(w,vp_d).scrollpos_y + vp->virtual_height / 2;
+ // Convert viewport coordinates to map coordinates
+ // Calculation is scaled by 4 to avoid rounding errors
+ vx = -x + y * 2;
+ vy = x + y * 2;
+ // clamp to size of map
+ vx = clamp(vx, 0 * 4, TILE_X_MAX * 16 * 4);
+ vy = clamp(vy, 0 * 4, TILE_Y_MAX * 16 * 4);
+ // Convert map coordinates to viewport coordinates
+ x = (-vx + vy) / 2;
+ y = ( vx + vy) / 4;
+ // Set position
+ WP(w,vp_d).scrollpos_x = x - vp->virtual_width / 2;
+ WP(w,vp_d).scrollpos_y = y - vp->virtual_height / 2;
+#else
int x,y,t;
int err;
x = WP(w,vp_d).scrollpos_x >> 2;
y = WP(w,vp_d).scrollpos_y >> 1;
-#if !defined(NEW_ROTATION)
- t = x;
- x = y - t;
- y = y + t;
-
- // check if inside bounds?
- t = (-130) << vp->zoom;
- err = 0;
- if (y < t || y > (t += TILE_Y_MAX*16-1)) { y = t; err++; }
- if (x < (t=0) || x > (t=TILE_X_MAX*16-1) ) { x = t; err++; }
-#else
t = x;
x = x + y;
y = x - y;
err= 0;
-#endif
if (err != 0) {
/* coordinate remap */
@@ -1306,6 +1317,8 @@ void UpdateViewportPosition(Window *w)
WP(w,vp_d).scrollpos_x = pt.x & t;
WP(w,vp_d).scrollpos_y = pt.y & t;
}
+#endif
+
SetViewportPosition(w, WP(w,vp_d).scrollpos_x, WP(w,vp_d).scrollpos_y);
}
}