diff options
| author | Ash Ketchum <no-reply@sl0p.foo> | 2026-07-15 15:01:08 +0200 |
|---|---|---|
| committer | Ash Ketchum <no-reply@sl0p.foo> | 2026-07-15 15:01:08 +0200 |
| commit | 1a494d70ad252b08185342cbfaae018740fcde30 (patch) | |
| tree | e0b3a8e1e78c835b9b68b4be30614811bafb5edb | |
| parent | EXPLORE: smooth hardware-scroll animation for in-map page moves (diff) | |
| download | pokeyellow-1a494d70ad252b08185342cbfaae018740fcde30.tar.gz pokeyellow-1a494d70ad252b08185342cbfaae018740fcde30.tar.xz pokeyellow-1a494d70ad252b08185342cbfaae018740fcde30.zip | |
EXPLORE: animate the approach to map edges instead of hard-jumping
At a map boundary, smooth-scroll the remaining (even) distance up to the
edge, then either cross into the connected map (one unavoidable instant
load) or, with no connection, stop smoothly at the edge. Previously any
edge move hard-jumped a whole screen; now only crossing from exactly on a
boundary snaps.
| -rw-r--r-- | engine/slop_menu.asm | 94 |
1 files changed, 62 insertions, 32 deletions
diff --git a/engine/slop_menu.asm b/engine/slop_menu.asm index acad203c..36654111 100644 --- a/engine/slop_menu.asm +++ b/engine/slop_menu.asm @@ -349,10 +349,7 @@ SlopExplore: ld a, [wYCoord] sub SLOP_PAGE_Y jp nc, .moveUp - ld hl, wNorthConnectedMap - ld de, wNorthConnectedMapYAlignment - ld a, 0 ; clamp target = top - jp .crossV + jp .edgeUp .ckDown bit B_PAD_DOWN, d jr z, .ckLeft @@ -364,20 +361,14 @@ SlopExplore: cp b jp c, .moveDown jp z, .moveDown - ld hl, wSouthConnectedMap - ld de, wSouthConnectedMapYAlignment - ld a, b ; clamp target = max Y - jp .crossV + jp .edgeDown .ckLeft bit B_PAD_LEFT, d jr z, .ckRight ld a, [wXCoord] sub SLOP_PAGE_X jp nc, .moveLeft - ld hl, wWestConnectedMap - ld de, wWestConnectedMapYAlignment - ld a, 0 - jp .crossH + jp .edgeLeft .ckRight bit B_PAD_RIGHT, d jp z, .input @@ -389,10 +380,7 @@ SlopExplore: cp b jp c, .moveRight jp z, .moveRight - ld hl, wEastConnectedMap - ld de, wEastConnectedMapYAlignment - ld a, b - jp .crossH + jp .edgeRight ; in-map page moves: smooth-scroll one screen, then just redraw the arrows ; (the scroll already left the destination view on screen in rotated VRAM). .moveUp @@ -411,13 +399,63 @@ SlopExplore: ld c, SLOP_PAGE_X call SlopScrollRight jp .renderArrows -; vertical cross (up/down): hl -> connected-map byte, de -> its YAlignment, -; a = Y to clamp to when there is no connection. +; ---- map-edge handling ---- +; A full page won't fit before the edge, so smooth-scroll the remaining (even) +; distance right up to the edge, then either cross into the connected map (one +; unavoidable instant load) or, if there's no connection that way, just stop at +; the edge. This keeps the motion smooth instead of hard-jumping a whole screen. +.edgeUp + ld a, [wYCoord] + and $fe ; even coords remaining to the top edge + jr z, .edgeUpCross + ld c, a + call SlopScrollUp +.edgeUpCross + ld hl, wNorthConnectedMap + ld de, wNorthConnectedMapYAlignment + jp .crossV +.edgeDown + ld a, [wCurrentMapHeight2] + dec a ; max Y + ld hl, wYCoord + sub [hl] ; maxY - wYCoord + and $fe + jr z, .edgeDownCross + ld c, a + call SlopScrollDown +.edgeDownCross + ld hl, wSouthConnectedMap + ld de, wSouthConnectedMapYAlignment + jp .crossV +.edgeLeft + ld a, [wXCoord] + and $fe + jr z, .edgeLeftCross + ld c, a + call SlopScrollLeft +.edgeLeftCross + ld hl, wWestConnectedMap + ld de, wWestConnectedMapYAlignment + jp .crossH +.edgeRight + ld a, [wCurrentMapWidth2] + dec a ; max X + ld hl, wXCoord + sub [hl] ; maxX - wXCoord + and $fe + jr z, .edgeRightCross + ld c, a + call SlopScrollRight +.edgeRightCross + ld hl, wEastConnectedMap + ld de, wEastConnectedMapYAlignment + jp .crossH +; vertical cross: hl -> connected-map byte, de -> its YAlignment. With no +; connection we're already scrolled to the edge, so just redraw the arrows. .crossV - ld b, a ld a, [hl] inc a - jr z, .clampY ; $ff -> no connection + jr z, .clampArrows ; $ff -> no connection ld a, [de] ; YAlignment -> new Y (absolute) ld c, a inc de @@ -432,17 +470,11 @@ SlopExplore: ld [wCurMap], a call LoadMapData jp .renderView -.clampY - ld a, b - ld [wYCoord], a - jp .renderView -; horizontal cross (left/right): hl -> connected-map byte, de -> its YAlignment, -; a = X to clamp to when there is no connection. +; horizontal cross: hl -> connected-map byte, de -> its YAlignment. .crossH - ld b, a ld a, [hl] inc a - jr z, .clampX + jr z, .clampArrows ld a, [de] ; YAlignment -> added to Y ld c, a inc de @@ -455,10 +487,8 @@ SlopExplore: ld [wCurMap], a call LoadMapData jp .renderView -.clampX - ld a, b - ld [wXCoord], a - jp .renderView +.clampArrows + jp .renderArrows ; ---- A: warp the player to the walkable tile nearest the screen centre ---- ; the centre tile is wTileMap(col 8,row 9) = coord (wYCoord,wXCoord); a coord ; offset (dy,dx) maps to wTileMap(8+2dx, 9+2dy). Scan outward for a passable tile. |
