pokecrystal-board/engine/overworld/player_step.asm

290 lines
4.1 KiB
NASM

_HandlePlayerStep::
ld a, [wPlayerStepFlags]
and a
ret z
bit PLAYERSTEP_START_F, a
jr nz, .update_overworld_map
bit PLAYERSTEP_STOP_F, a
jr nz, .update_player_coords
bit PLAYERSTEP_CONTINUE_F, a
jr nz, .finish
ret
.update_overworld_map
ld a, 4
ld [wHandlePlayerStep], a
call UpdateOverworldMap
jr .finish
.update_player_coords
call UpdatePlayerCoords
jr .finish
.finish
call HandlePlayerStep
ld a, [wPlayerStepVectorX]
ld d, a
ld a, [wPlayerStepVectorY]
ld e, a
ld a, [wPlayerBGMapOffsetX]
sub d
ld [wPlayerBGMapOffsetX], a
ld a, [wPlayerBGMapOffsetY]
sub e
ld [wPlayerBGMapOffsetY], a
ret
ScrollScreen::
ld a, [wPlayerStepVectorX]
ld d, a
ld a, [wPlayerStepVectorY]
ld e, a
ldh a, [hSCX]
add d
ldh [hSCX], a
ldh a, [hSCY]
add e
ldh [hSCY], a
ret
HandlePlayerStep:
ld hl, wHandlePlayerStep
ld a, [hl]
and a
ret z
dec [hl]
ld a, [hl]
ld hl, .Jumptable
rst JumpTable
ret
.Jumptable:
dw GetMovementPermissions
dw BufferScreen
dw .mobile
dw .fail2
; The rest are never used. Ever.
dw .fail1
dw .fail1
dw .fail1
dw .fail1
dw .fail1
dw .fail1
dw .fail1
.fail1
ret
.mobile
ret
.fail2
ret
UpdatePlayerCoords:
ld a, [wPlayerStepDirection]
and a
jr nz, .check_step_down
ld hl, wYCoord
inc [hl]
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret nz
ld hl, wViewMapModeDisplacementY
inc [hl]
ret
.check_step_down
cp UP
jr nz, .check_step_left
ld hl, wYCoord
dec [hl]
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret nz
ld hl, wViewMapModeDisplacementY
dec [hl]
ret
.check_step_left
cp LEFT
jr nz, .check_step_right
ld hl, wXCoord
dec [hl]
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret nz
ld hl, wViewMapModeDisplacementX
dec [hl]
ret
.check_step_right
cp RIGHT
ret nz
ld hl, wXCoord
inc [hl]
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret nz
ld hl, wViewMapModeDisplacementX
inc [hl]
ret
UpdateOverworldMap:
ld a, [wPlayerStepDirection]
and a
jr z, .step_down
cp UP
jr z, .step_up
cp LEFT
jr z, .step_left
cp RIGHT
jr z, .step_right
ret
.step_down
call .ScrollOverworldMapDown
call LoadScreenTilemap
call ScrollMapDown
ret
.step_up
call .ScrollOverworldMapUp
call LoadScreenTilemap
call ScrollMapUp
ret
.step_left
call .ScrollOverworldMapLeft
call LoadScreenTilemap
call ScrollMapLeft
ret
.step_right
call .ScrollOverworldMapRight
call LoadScreenTilemap
call ScrollMapRight
ret
.ScrollOverworldMapDown:
ld a, [wBGMapAnchor]
add 2 * BG_MAP_WIDTH
ld [wBGMapAnchor], a
jr nc, .not_overflowed
ld a, [wBGMapAnchor + 1]
inc a
and %11
or HIGH(vBGMap0)
ld [wBGMapAnchor + 1], a
.not_overflowed
ld hl, wPlayerMetatileY
inc [hl]
ld a, [hl]
cp 2 ; was 1
jr nz, .done_down
ld [hl], 0
call .ScrollMapDataDown
.done_down
ret
.ScrollMapDataDown:
ld hl, wOverworldMapAnchor
ld a, [wMapWidth]
add 3 * 2 ; surrounding tiles
add [hl]
ld [hli], a
ret nc
inc [hl]
ret
.ScrollOverworldMapUp:
ld a, [wBGMapAnchor]
sub 2 * BG_MAP_WIDTH
ld [wBGMapAnchor], a
jr nc, .not_underflowed
ld a, [wBGMapAnchor + 1]
dec a
and %11
or HIGH(vBGMap0)
ld [wBGMapAnchor + 1], a
.not_underflowed
ld hl, wPlayerMetatileY
dec [hl]
ld a, [hl]
cp -1 ; was 0
jr nz, .done_up
ld [hl], $1
call .ScrollMapDataUp
.done_up
ret
.ScrollMapDataUp:
ld hl, wOverworldMapAnchor
ld a, [wMapWidth]
add 3 * 2 ; surrounding tiles
ld b, a
ld a, [hl]
sub b
ld [hli], a
ret nc
dec [hl]
ret
.ScrollOverworldMapLeft:
ld a, [wBGMapAnchor]
ld e, a
and $e0
ld d, a
ld a, e
sub $2
and $1f
or d
ld [wBGMapAnchor], a
ld hl, wPlayerMetatileX
dec [hl]
ld a, [hl]
cp -1
jr nz, .done_left
ld [hl], 1
call .ScrollMapDataLeft
.done_left
ret
.ScrollMapDataLeft:
ld hl, wOverworldMapAnchor
ld a, [hl]
sub 1
ld [hli], a
ret nc
dec [hl]
ret
.ScrollOverworldMapRight:
ld a, [wBGMapAnchor]
ld e, a
and $e0
ld d, a
ld a, e
add $2
and $1f
or d
ld [wBGMapAnchor], a
ld hl, wPlayerMetatileX
inc [hl]
ld a, [hl]
cp 2
jr nz, .done_right
ld [hl], 0
call .ScrollMapDataRight
.done_right
ret
.ScrollMapDataRight:
ld hl, wOverworldMapAnchor
ld a, [hl]
add 1
ld [hli], a
ret nc
inc [hl]
ret