aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--engine/slop_menu.asm94
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.