summaryrefslogtreecommitdiff
path: root/home/movement.asm
diff options
context:
space:
mode:
Diffstat (limited to 'home/movement.asm')
-rw-r--r--home/movement.asm208
1 files changed, 208 insertions, 0 deletions
diff --git a/home/movement.asm b/home/movement.asm
new file mode 100644
index 00000000..f962c831
--- /dev/null
+++ b/home/movement.asm
@@ -0,0 +1,208 @@
+InitMovementBuffer:: ; 1b1e
+ ld [wMovementBufferPerson], a
+ xor a
+ ld [wMovementBufferCount], a
+ ld a, $0 ; useless
+ ld [wd004], a
+ ld a, $7
+ ld [wd005], a
+ ld a, $d0
+ ld [wd006], a
+ ret
+; 1b35
+
+DecrementMovementBufferCount:: ; 1b35
+ ld a, [wMovementBufferCount]
+ and a
+ ret z
+ dec a
+ ld [wMovementBufferCount], a
+ ret
+; 1b3f
+
+AppendToMovementBuffer:: ; 1b3f
+ push hl
+ push de
+ ld hl, wMovementBufferCount
+ ld e, [hl]
+ inc [hl]
+ ld d, 0
+ ld hl, MovementBuffer
+ add hl, de
+ ld [hl], a
+ pop de
+ pop hl
+ ret
+; 1b50
+
+AppendToMovementBufferNTimes:: ; 1b50
+ push af
+ ld a, c
+ and a
+ jr nz, .okay
+ pop af
+ ret
+
+.okay
+ pop af
+.loop
+ call AppendToMovementBuffer
+ dec c
+ jr nz, .loop
+ ret
+; 1b5f
+
+ComputePathToWalkToPlayer:: ; 1b5f
+ push af
+; compare x coords, load left/right into h, and x distance into d
+ ld a, b
+ sub d
+ ld h, LEFT
+ jr nc, .got_x_distance
+ dec a
+ cpl
+ ld h, RIGHT
+
+.got_x_distance
+ ld d, a
+; compare y coords, load up/down into l, and y distance into e
+ ld a, c
+ sub e
+ ld l, UP
+ jr nc, .got_y_distance
+ dec a
+ cpl
+ ld l, DOWN
+
+.got_y_distance
+ ld e, a
+; if the x distance is less than the y distance, swap h and l, and swap d and e
+ cp d
+ jr nc, .done
+ ld a, h
+ ld h, l
+ ld l, a
+ ld a, d
+ ld d, e
+ ld e, a
+
+.done
+ pop af
+ ld b, a
+; Add movement in the longer direction first...
+ ld a, h
+ call .GetMovementData
+ ld c, d
+ call AppendToMovementBufferNTimes
+; ... then add the shorter direction.
+ ld a, l
+ call .GetMovementData
+ ld c, e
+ call AppendToMovementBufferNTimes
+ ret
+; 1b92
+
+.GetMovementData: ; 1b92
+ push de
+ push hl
+ ld l, b
+ ld h, 0
+rept 2
+ add hl, hl
+endr
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld de, .MovementData
+ add hl, de
+ ld a, [hl]
+ pop hl
+ pop de
+ ret
+; 1ba5
+
+.MovementData
+ slow_step_down
+ slow_step_up
+ slow_step_left
+ slow_step_right
+ step_down
+ step_up
+ step_left
+ step_right
+ big_step_down
+ big_step_up
+ big_step_left
+ big_step_right
+; 1bb1
+
+SetMenuAttributes:: ; 1bb1
+ push hl
+ push bc
+ ld hl, w2DMenuCursorInitY
+ ld b, $8
+.loop
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ld a, $1
+rept 2
+ ld [hli], a
+endr
+ xor a
+rept 3
+ ld [hli], a
+endr
+ pop bc
+ pop hl
+ ret
+; 1bc9
+
+StaticMenuJoypad:: ; 1bc9
+ callab _StaticMenuJoypad
+ call GetMenuJoypad
+ ret
+; 1bd3
+
+ScrollingMenuJoypad:: ; 1bd3
+ callab _ScrollingMenuJoypad
+ call GetMenuJoypad
+ ret
+; 1bdd
+
+GetMenuJoypad:: ; 1bdd
+ push bc
+ push af
+ ld a, [hJoyLast]
+ and D_PAD
+ ld b, a
+ ld a, [hJoyPressed]
+ and BUTTONS
+ or b
+ ld b, a
+ pop af
+ ld a, b
+ pop bc
+ ret
+; 1bee
+
+PlaceHollowCursor:: ; 1bee
+ ld hl, wCursorCurrentTile
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld [hl], "▷"
+ ret
+; 1bf7
+
+HideCursor:: ; 1bf7
+ ld hl, wCursorCurrentTile
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld [hl], " "
+ ret
+; 1c00
+