# HG changeset patch # User tron # Date 2004-12-13 18:33:47 # Node ID 7b88424d9971cd837eef7e7281103fea033b9da9 # Parent 7669f81ab73a89b16b8f242094cd6b21144984cd (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. (; diff --git a/viewport.c b/viewport.c --- 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); } }