summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortron <tron@openttd.org>2004-12-13 18:33:47 +0000
committertron <tron@openttd.org>2004-12-13 18:33:47 +0000
commitd1d33372ff7606898ca0de68604636cd89047e7d (patch)
tree58e6619f7a46c8bdb588ce26f60b95433179e56e
parentd6e4999f1f3ac9e581c14eab64452da0881387d6 (diff)
downloadopenttd-d1d33372ff7606898ca0de68604636cd89047e7d.tar.xz
(svn r1063) Improve scrolling limits a bit. You now can scroll further away from the map at the NW and NE edge.
Hopefully this new code is also a bit more comprehensible than the old. (;
-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);
}
}