2018-06-24 07:09:41 -07:00
|
|
|
DoPlayerMovement::
|
2015-12-29 10:15:58 -08:00
|
|
|
call .GetDPad
|
2016-05-14 09:28:00 -07:00
|
|
|
ld a, movement_step_sleep
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wMovementAnimation], a
|
2015-12-29 10:15:58 -08:00
|
|
|
xor a
|
2019-04-08 15:50:10 -07:00
|
|
|
ld [wWalkingIntoEdgeWarp], a
|
2015-12-29 10:15:58 -08:00
|
|
|
call .TranslateIntoMovement
|
|
|
|
ld c, a
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wMovementAnimation]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld [wPlayerNextMovement], a
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.GetDPad:
|
2023-10-18 08:46:57 -07:00
|
|
|
ldh a, [hCurBoardEvent]
|
|
|
|
cp BOARDEVENT_HANDLE_BOARD
|
|
|
|
jr nz, .not_auto_in_board
|
|
|
|
|
|
|
|
; compute direction according to space layout and save to wCurInput
|
|
|
|
farcall StepTowardsNextSpace
|
|
|
|
ret
|
|
|
|
|
|
|
|
.not_auto_in_board
|
2018-08-25 11:28:22 -07:00
|
|
|
ldh a, [hJoyDown]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wCurInput], a
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
; Standing downhill instead moves down.
|
2017-12-28 04:15:46 -08:00
|
|
|
ld hl, wBikeFlags
|
2018-01-22 10:57:44 -08:00
|
|
|
bit BIKEFLAGS_DOWNHILL_F, [hl]
|
2015-12-29 10:15:58 -08:00
|
|
|
ret z
|
|
|
|
ld c, a
|
|
|
|
and D_PAD
|
|
|
|
ret nz
|
|
|
|
ld a, c
|
|
|
|
or D_DOWN
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wCurInput], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.TranslateIntoMovement:
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wPlayerState]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp PLAYER_NORMAL
|
|
|
|
jr z, .Normal
|
|
|
|
cp PLAYER_SURF
|
|
|
|
jr z, .Surf
|
|
|
|
cp PLAYER_SURF_PIKA
|
|
|
|
jr z, .Surf
|
|
|
|
cp PLAYER_BIKE
|
|
|
|
jr z, .Normal
|
2017-12-15 20:29:42 -08:00
|
|
|
cp PLAYER_SKATE
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .Ice
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.Normal:
|
2015-12-29 10:15:58 -08:00
|
|
|
call .CheckForced
|
|
|
|
call .GetAction
|
|
|
|
call .CheckTile
|
|
|
|
ret c
|
|
|
|
call .CheckTurning
|
|
|
|
ret c
|
|
|
|
call .TryStep
|
|
|
|
ret c
|
|
|
|
call .TryJump
|
|
|
|
ret c
|
|
|
|
call .CheckWarp
|
|
|
|
ret c
|
|
|
|
jr .NotMoving
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.Surf:
|
2015-12-29 10:15:58 -08:00
|
|
|
call .CheckForced
|
|
|
|
call .GetAction
|
|
|
|
call .CheckTile
|
|
|
|
ret c
|
|
|
|
call .CheckTurning
|
|
|
|
ret c
|
|
|
|
call .TrySurf
|
|
|
|
ret c
|
|
|
|
jr .NotMoving
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.Ice:
|
2015-12-29 10:15:58 -08:00
|
|
|
call .CheckForced
|
|
|
|
call .GetAction
|
|
|
|
call .CheckTile
|
|
|
|
ret c
|
|
|
|
call .CheckTurning
|
|
|
|
ret c
|
|
|
|
call .TryStep
|
|
|
|
ret c
|
|
|
|
call .TryJump
|
|
|
|
ret c
|
|
|
|
call .CheckWarp
|
|
|
|
ret c
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp STANDING
|
|
|
|
jr z, .HitWall
|
|
|
|
call .BumpSound
|
2016-04-10 11:42:14 -07:00
|
|
|
.HitWall:
|
2015-12-29 10:15:58 -08:00
|
|
|
call .StandInPlace
|
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.NotMoving:
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp STANDING
|
|
|
|
jr z, .Standing
|
|
|
|
|
|
|
|
; Walking into an edge warp won't bump.
|
2019-04-08 15:50:10 -07:00
|
|
|
ld a, [wWalkingIntoEdgeWarp]
|
2015-12-29 10:15:58 -08:00
|
|
|
and a
|
|
|
|
jr nz, .CantMove
|
|
|
|
call .BumpSound
|
2016-04-10 11:42:14 -07:00
|
|
|
.CantMove:
|
2015-12-29 10:15:58 -08:00
|
|
|
call ._WalkInPlace
|
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.Standing:
|
2015-12-29 10:15:58 -08:00
|
|
|
call .StandInPlace
|
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckTile:
|
2015-12-29 10:15:58 -08:00
|
|
|
; Tiles such as waterfalls and warps move the player
|
|
|
|
; in a given direction, overriding input.
|
|
|
|
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerTile]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld c, a
|
|
|
|
call CheckWhirlpoolTile
|
2016-03-01 19:31:21 -08:00
|
|
|
jr c, .not_whirlpool
|
2019-11-03 11:30:33 -08:00
|
|
|
ld a, PLAYERMOVEMENT_FORCE_TURN
|
2015-12-29 10:15:58 -08:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2016-03-01 19:31:21 -08:00
|
|
|
.not_whirlpool
|
2015-12-29 10:15:58 -08:00
|
|
|
and $f0
|
2017-12-12 13:15:58 -08:00
|
|
|
cp HI_NYBBLE_CURRENT
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .water
|
2017-12-12 13:15:58 -08:00
|
|
|
cp HI_NYBBLE_WALK
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .land1
|
2017-12-12 13:15:58 -08:00
|
|
|
cp HI_NYBBLE_WALK_ALT
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .land2
|
2017-12-12 13:15:58 -08:00
|
|
|
cp HI_NYBBLE_WARPS
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .warps
|
2016-01-17 21:39:01 -08:00
|
|
|
jr .no_walk
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
.water
|
|
|
|
ld a, c
|
2018-01-16 14:27:50 -08:00
|
|
|
maskbits NUM_DIRECTIONS
|
2015-12-29 10:15:58 -08:00
|
|
|
ld c, a
|
|
|
|
ld b, 0
|
|
|
|
ld hl, .water_table
|
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wWalkingDirection], a
|
2016-01-17 21:39:01 -08:00
|
|
|
jr .continue_walk
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
.water_table
|
2017-12-12 13:15:58 -08:00
|
|
|
db RIGHT ; COLL_WATERFALL_RIGHT
|
|
|
|
db LEFT ; COLL_WATERFALL_LEFT
|
|
|
|
db UP ; COLL_WATERFALL_UP
|
|
|
|
db DOWN ; COLL_WATERFALL
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
.land1
|
|
|
|
ld a, c
|
|
|
|
and 7
|
|
|
|
ld c, a
|
|
|
|
ld b, 0
|
|
|
|
ld hl, .land1_table
|
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
|
|
|
cp STANDING
|
2016-01-17 21:39:01 -08:00
|
|
|
jr z, .no_walk
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wWalkingDirection], a
|
2016-01-17 21:39:01 -08:00
|
|
|
jr .continue_walk
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
.land1_table
|
2017-12-12 13:15:58 -08:00
|
|
|
db STANDING ; COLL_BRAKE
|
|
|
|
db RIGHT ; COLL_WALK_RIGHT
|
|
|
|
db LEFT ; COLL_WALK_LEFT
|
|
|
|
db UP ; COLL_WALK_UP
|
|
|
|
db DOWN ; COLL_WALK_DOWN
|
|
|
|
db STANDING ; COLL_BRAKE_45
|
|
|
|
db STANDING ; COLL_BRAKE_46
|
|
|
|
db STANDING ; COLL_BRAKE_47
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
.land2
|
|
|
|
ld a, c
|
|
|
|
and 7
|
|
|
|
ld c, a
|
|
|
|
ld b, 0
|
|
|
|
ld hl, .land2_table
|
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
|
|
|
cp STANDING
|
2016-01-17 21:39:01 -08:00
|
|
|
jr z, .no_walk
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wWalkingDirection], a
|
2016-01-17 21:39:01 -08:00
|
|
|
jr .continue_walk
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
.land2_table
|
2017-12-12 13:15:58 -08:00
|
|
|
db RIGHT ; COLL_WALK_RIGHT_ALT
|
|
|
|
db LEFT ; COLL_WALK_LEFT_ALT
|
|
|
|
db UP ; COLL_WALK_UP_ALT
|
|
|
|
db DOWN ; COLL_WALK_DOWN_ALT
|
|
|
|
db STANDING ; COLL_BRAKE_ALT
|
|
|
|
db STANDING ; COLL_BRAKE_55
|
|
|
|
db STANDING ; COLL_BRAKE_56
|
|
|
|
db STANDING ; COLL_BRAKE_57
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
.warps
|
|
|
|
ld a, c
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_DOOR
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .down
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_DOOR_79
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .down
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_STAIRCASE
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .down
|
2017-12-12 13:15:58 -08:00
|
|
|
cp COLL_CAVE
|
2016-01-17 21:39:01 -08:00
|
|
|
jr nz, .no_walk
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
.down
|
|
|
|
ld a, DOWN
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wWalkingDirection], a
|
2016-01-17 21:39:01 -08:00
|
|
|
jr .continue_walk
|
2015-12-29 10:15:58 -08:00
|
|
|
|
2016-01-17 21:39:01 -08:00
|
|
|
.no_walk
|
2015-12-29 10:15:58 -08:00
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2016-01-17 21:39:01 -08:00
|
|
|
.continue_walk
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, STEP_WALK
|
|
|
|
call .DoStep
|
2019-11-03 11:30:33 -08:00
|
|
|
ld a, PLAYERMOVEMENT_CONTINUE
|
2015-12-29 10:15:58 -08:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckTurning:
|
2015-12-29 10:15:58 -08:00
|
|
|
; If the player is turning, change direction first. This also lets
|
|
|
|
; the player change facing without moving by tapping a direction.
|
|
|
|
|
2016-05-14 10:46:14 -07:00
|
|
|
ld a, [wPlayerTurningDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp 0
|
2016-05-14 10:46:14 -07:00
|
|
|
jr nz, .not_turning
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp STANDING
|
2016-05-14 10:46:14 -07:00
|
|
|
jr z, .not_turning
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
ld e, a
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wPlayerDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
rrca
|
|
|
|
rrca
|
2018-01-16 14:27:50 -08:00
|
|
|
maskbits NUM_DIRECTIONS
|
2015-12-29 10:15:58 -08:00
|
|
|
cp e
|
2016-05-14 10:46:14 -07:00
|
|
|
jr z, .not_turning
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
ld a, STEP_TURN
|
|
|
|
call .DoStep
|
2019-11-03 11:30:33 -08:00
|
|
|
ld a, PLAYERMOVEMENT_TURN
|
2015-12-29 10:15:58 -08:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2016-05-14 10:46:14 -07:00
|
|
|
.not_turning
|
2015-12-29 10:15:58 -08:00
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.TryStep:
|
2015-12-29 10:15:58 -08:00
|
|
|
; Surfing actually calls .TrySurf directly instead of passing through here.
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wPlayerState]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp PLAYER_SURF
|
|
|
|
jr z, .TrySurf
|
|
|
|
cp PLAYER_SURF_PIKA
|
|
|
|
jr z, .TrySurf
|
|
|
|
|
|
|
|
call .CheckLandPerms
|
|
|
|
jr c, .bump
|
|
|
|
|
|
|
|
call .CheckNPC
|
|
|
|
and a
|
|
|
|
jr z, .bump
|
|
|
|
cp 2
|
|
|
|
jr z, .bump
|
|
|
|
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerTile]
|
2015-12-29 10:15:58 -08:00
|
|
|
call CheckIceTile
|
|
|
|
jr nc, .ice
|
|
|
|
|
|
|
|
; Downhill riding is slower when not moving down.
|
|
|
|
call .BikeCheck
|
|
|
|
jr nz, .walk
|
|
|
|
|
2017-12-28 04:15:46 -08:00
|
|
|
ld hl, wBikeFlags
|
2018-01-22 10:57:44 -08:00
|
|
|
bit BIKEFLAGS_DOWNHILL_F, [hl]
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .fast
|
|
|
|
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp DOWN
|
|
|
|
jr z, .fast
|
|
|
|
|
|
|
|
ld a, STEP_WALK
|
|
|
|
call .DoStep
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
.fast
|
|
|
|
ld a, STEP_BIKE
|
|
|
|
call .DoStep
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
.walk
|
|
|
|
ld a, STEP_WALK
|
|
|
|
call .DoStep
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
.ice
|
|
|
|
ld a, STEP_ICE
|
|
|
|
call .DoStep
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
.bump
|
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.TrySurf:
|
2015-12-29 10:15:58 -08:00
|
|
|
call .CheckSurfPerms
|
2019-04-08 15:50:10 -07:00
|
|
|
ld [wWalkingIntoLand], a
|
2015-12-29 10:15:58 -08:00
|
|
|
jr c, .surf_bump
|
|
|
|
|
|
|
|
call .CheckNPC
|
2019-04-08 15:50:10 -07:00
|
|
|
ld [wWalkingIntoNPC], a
|
2015-12-29 10:15:58 -08:00
|
|
|
and a
|
|
|
|
jr z, .surf_bump
|
|
|
|
cp 2
|
|
|
|
jr z, .surf_bump
|
|
|
|
|
2019-04-08 15:50:10 -07:00
|
|
|
ld a, [wWalkingIntoLand]
|
2015-12-29 10:15:58 -08:00
|
|
|
and a
|
|
|
|
jr nz, .ExitWater
|
|
|
|
|
|
|
|
ld a, STEP_WALK
|
|
|
|
call .DoStep
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.ExitWater:
|
2015-12-29 10:15:58 -08:00
|
|
|
call .GetOutOfWater
|
|
|
|
call PlayMapMusic
|
|
|
|
ld a, STEP_WALK
|
|
|
|
call .DoStep
|
2019-11-03 11:30:33 -08:00
|
|
|
ld a, PLAYERMOVEMENT_EXIT_WATER
|
2015-12-29 10:15:58 -08:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
.surf_bump
|
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.TryJump:
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerTile]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld e, a
|
|
|
|
and $f0
|
2017-12-12 13:15:58 -08:00
|
|
|
cp HI_NYBBLE_LEDGES
|
2015-12-29 10:15:58 -08:00
|
|
|
jr nz, .DontJump
|
|
|
|
|
|
|
|
ld a, e
|
|
|
|
and 7
|
|
|
|
ld e, a
|
|
|
|
ld d, 0
|
2020-10-04 16:43:28 -07:00
|
|
|
ld hl, .ledge_table
|
2015-12-29 10:15:58 -08:00
|
|
|
add hl, de
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wFacingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
and [hl]
|
|
|
|
jr z, .DontJump
|
|
|
|
|
|
|
|
ld de, SFX_JUMP_OVER_LEDGE
|
|
|
|
call PlaySFX
|
|
|
|
ld a, STEP_LEDGE
|
|
|
|
call .DoStep
|
2019-11-03 11:30:33 -08:00
|
|
|
ld a, PLAYERMOVEMENT_JUMP
|
2015-12-29 10:15:58 -08:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.DontJump:
|
2015-12-29 10:15:58 -08:00
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2020-10-04 16:43:28 -07:00
|
|
|
.ledge_table
|
2017-12-12 13:15:58 -08:00
|
|
|
db FACE_RIGHT ; COLL_HOP_RIGHT
|
|
|
|
db FACE_LEFT ; COLL_HOP_LEFT
|
|
|
|
db FACE_UP ; COLL_HOP_UP
|
|
|
|
db FACE_DOWN ; COLL_HOP_DOWN
|
|
|
|
db FACE_RIGHT | FACE_DOWN ; COLL_HOP_DOWN_RIGHT
|
|
|
|
db FACE_DOWN | FACE_LEFT ; COLL_HOP_DOWN_LEFT
|
|
|
|
db FACE_UP | FACE_RIGHT ; COLL_HOP_UP_RIGHT
|
|
|
|
db FACE_UP | FACE_LEFT ; COLL_HOP_UP_LEFT
|
2015-12-29 10:15:58 -08:00
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckWarp:
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingDirection]
|
2023-07-27 04:01:32 -07:00
|
|
|
cp STANDING
|
|
|
|
jr z, .not_warp
|
2015-12-29 10:15:58 -08:00
|
|
|
ld e, a
|
|
|
|
ld d, 0
|
|
|
|
ld hl, .EdgeWarps
|
|
|
|
add hl, de
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerTile]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp [hl]
|
|
|
|
jr nz, .not_warp
|
|
|
|
|
2019-04-08 15:50:10 -07:00
|
|
|
ld a, TRUE
|
|
|
|
ld [wWalkingIntoEdgeWarp], a
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
|
|
|
|
ld e, a
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wPlayerDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
rrca
|
|
|
|
rrca
|
2018-01-16 14:27:50 -08:00
|
|
|
maskbits NUM_DIRECTIONS
|
2015-12-29 10:15:58 -08:00
|
|
|
cp e
|
|
|
|
jr nz, .not_warp
|
|
|
|
call WarpCheck
|
|
|
|
jr nc, .not_warp
|
|
|
|
|
|
|
|
call .StandInPlace
|
|
|
|
scf
|
2019-11-03 11:30:33 -08:00
|
|
|
ld a, PLAYERMOVEMENT_WARP
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|
|
|
|
|
|
|
|
.not_warp
|
2019-11-03 11:30:33 -08:00
|
|
|
xor a ; PLAYERMOVEMENT_NORMAL
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.EdgeWarps:
|
2017-12-12 13:15:58 -08:00
|
|
|
db COLL_WARP_CARPET_DOWN
|
|
|
|
db COLL_WARP_CARPET_UP
|
|
|
|
db COLL_WARP_CARPET_LEFT
|
|
|
|
db COLL_WARP_CARPET_RIGHT
|
2015-12-29 10:15:58 -08:00
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.DoStep:
|
2015-12-29 10:15:58 -08:00
|
|
|
ld e, a
|
|
|
|
ld d, 0
|
|
|
|
ld hl, .Steps
|
|
|
|
add hl, de
|
|
|
|
add hl, de
|
|
|
|
ld a, [hli]
|
|
|
|
ld h, [hl]
|
|
|
|
ld l, a
|
|
|
|
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld e, a
|
|
|
|
cp STANDING
|
|
|
|
jp z, .StandInPlace
|
|
|
|
|
|
|
|
add hl, de
|
|
|
|
ld a, [hl]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wMovementAnimation], a
|
2015-12-29 10:15:58 -08:00
|
|
|
|
2016-05-14 10:46:14 -07:00
|
|
|
ld hl, .FinishFacing
|
2015-12-29 10:15:58 -08:00
|
|
|
add hl, de
|
|
|
|
ld a, [hl]
|
2016-05-14 10:46:14 -07:00
|
|
|
ld [wPlayerTurningDirection], a
|
2015-12-29 10:15:58 -08:00
|
|
|
|
2019-11-03 11:30:33 -08:00
|
|
|
ld a, PLAYERMOVEMENT_FINISH
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.Steps:
|
2021-03-03 19:22:41 -08:00
|
|
|
; entries correspond to STEP_* constants (see constants/map_object_constants.asm)
|
|
|
|
table_width 2, DoPlayerMovement.Steps
|
2015-12-29 10:15:58 -08:00
|
|
|
dw .SlowStep
|
|
|
|
dw .NormalStep
|
|
|
|
dw .FastStep
|
|
|
|
dw .JumpStep
|
|
|
|
dw .SlideStep
|
|
|
|
dw .TurningStep
|
|
|
|
dw .BackJumpStep
|
2016-05-14 10:46:14 -07:00
|
|
|
dw .FinishFacing
|
2021-03-03 19:22:41 -08:00
|
|
|
assert_table_length NUM_STEPS
|
2015-12-29 10:15:58 -08:00
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.SlowStep:
|
2016-05-14 10:46:14 -07:00
|
|
|
slow_step DOWN
|
|
|
|
slow_step UP
|
|
|
|
slow_step LEFT
|
|
|
|
slow_step RIGHT
|
2016-04-10 11:42:14 -07:00
|
|
|
.NormalStep:
|
2016-05-14 10:46:14 -07:00
|
|
|
step DOWN
|
|
|
|
step UP
|
|
|
|
step LEFT
|
|
|
|
step RIGHT
|
2016-04-10 11:42:14 -07:00
|
|
|
.FastStep:
|
2016-05-14 10:46:14 -07:00
|
|
|
big_step DOWN
|
|
|
|
big_step UP
|
|
|
|
big_step LEFT
|
|
|
|
big_step RIGHT
|
2016-04-10 11:42:14 -07:00
|
|
|
.JumpStep:
|
2016-05-14 10:46:14 -07:00
|
|
|
jump_step DOWN
|
|
|
|
jump_step UP
|
|
|
|
jump_step LEFT
|
|
|
|
jump_step RIGHT
|
2016-04-10 11:42:14 -07:00
|
|
|
.SlideStep:
|
2016-05-14 10:46:14 -07:00
|
|
|
fast_slide_step DOWN
|
|
|
|
fast_slide_step UP
|
|
|
|
fast_slide_step LEFT
|
|
|
|
fast_slide_step RIGHT
|
2016-04-10 11:42:14 -07:00
|
|
|
.BackJumpStep:
|
2016-05-14 10:46:14 -07:00
|
|
|
jump_step UP
|
|
|
|
jump_step DOWN
|
|
|
|
jump_step RIGHT
|
|
|
|
jump_step LEFT
|
2016-04-10 11:42:14 -07:00
|
|
|
.TurningStep:
|
2016-05-14 10:46:14 -07:00
|
|
|
turn_step DOWN
|
|
|
|
turn_step UP
|
|
|
|
turn_step LEFT
|
|
|
|
turn_step RIGHT
|
|
|
|
.FinishFacing:
|
2018-12-09 15:13:37 -08:00
|
|
|
db $80 | DOWN
|
|
|
|
db $80 | UP
|
|
|
|
db $80 | LEFT
|
|
|
|
db $80 | RIGHT
|
2015-12-29 10:15:58 -08:00
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.StandInPlace:
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, 0
|
2016-05-14 10:46:14 -07:00
|
|
|
ld [wPlayerTurningDirection], a
|
2016-05-14 09:28:00 -07:00
|
|
|
ld a, movement_step_sleep
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wMovementAnimation], a
|
2015-12-29 10:15:58 -08:00
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
._WalkInPlace:
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, 0
|
2016-05-14 10:46:14 -07:00
|
|
|
ld [wPlayerTurningDirection], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, movement_step_bump
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wMovementAnimation], a
|
2015-12-29 10:15:58 -08:00
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckForced:
|
2015-12-29 10:15:58 -08:00
|
|
|
; When sliding on ice, input is forced to remain in the same direction.
|
|
|
|
|
|
|
|
call CheckStandingOnIce
|
|
|
|
ret nc
|
|
|
|
|
2016-05-14 10:46:14 -07:00
|
|
|
ld a, [wPlayerTurningDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp 0
|
|
|
|
ret z
|
|
|
|
|
2018-01-16 14:27:50 -08:00
|
|
|
maskbits NUM_DIRECTIONS
|
2015-12-29 10:15:58 -08:00
|
|
|
ld e, a
|
|
|
|
ld d, 0
|
|
|
|
ld hl, .forced_dpad
|
|
|
|
add hl, de
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wCurInput]
|
2015-12-29 10:15:58 -08:00
|
|
|
and BUTTONS
|
|
|
|
or [hl]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wCurInput], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|
|
|
|
|
|
|
|
.forced_dpad
|
|
|
|
db D_DOWN, D_UP, D_LEFT, D_RIGHT
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.GetAction:
|
2015-12-29 10:15:58 -08:00
|
|
|
; Poll player input and update movement info.
|
|
|
|
|
2018-07-16 12:58:07 -07:00
|
|
|
ld hl, .action_table
|
|
|
|
ld de, .action_table_1_end - .action_table_1
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wCurInput]
|
2015-12-29 10:15:58 -08:00
|
|
|
bit D_DOWN_F, a
|
|
|
|
jr nz, .d_down
|
|
|
|
bit D_UP_F, a
|
|
|
|
jr nz, .d_up
|
|
|
|
bit D_LEFT_F, a
|
|
|
|
jr nz, .d_left
|
|
|
|
bit D_RIGHT_F, a
|
|
|
|
jr nz, .d_right
|
|
|
|
; Standing
|
|
|
|
jr .update
|
|
|
|
|
2020-04-30 08:27:32 -07:00
|
|
|
.d_down
|
|
|
|
add hl, de
|
|
|
|
.d_up
|
|
|
|
add hl, de
|
|
|
|
.d_left
|
|
|
|
add hl, de
|
|
|
|
.d_right
|
|
|
|
add hl, de
|
2015-12-29 10:15:58 -08:00
|
|
|
.update
|
|
|
|
ld a, [hli]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wWalkingDirection], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, [hli]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wFacingDirection], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, [hli]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wWalkingX], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, [hli]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wWalkingY], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, [hli]
|
|
|
|
ld h, [hl]
|
|
|
|
ld l, a
|
|
|
|
ld a, [hl]
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wWalkingTile], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|
|
|
|
|
2022-06-06 14:25:42 -07:00
|
|
|
MACRO player_action
|
2018-07-16 12:58:07 -07:00
|
|
|
; walk direction, facing, x movement, y movement, tile collision pointer
|
|
|
|
db \1, \2, \3, \4
|
|
|
|
dw \5
|
|
|
|
ENDM
|
|
|
|
|
|
|
|
.action_table:
|
|
|
|
.action_table_1
|
2022-09-12 06:15:44 -07:00
|
|
|
player_action STANDING, FACE_CURRENT, 0, 0, wPlayerTile
|
2018-07-16 12:58:07 -07:00
|
|
|
.action_table_1_end
|
|
|
|
player_action RIGHT, FACE_RIGHT, 1, 0, wTileRight
|
|
|
|
player_action LEFT, FACE_LEFT, -1, 0, wTileLeft
|
|
|
|
player_action UP, FACE_UP, 0, -1, wTileUp
|
|
|
|
player_action DOWN, FACE_DOWN, 0, 1, wTileDown
|
2015-12-29 10:15:58 -08:00
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckNPC:
|
2015-12-29 10:15:58 -08:00
|
|
|
; Returns 0 if there is an NPC in front that you can't move
|
|
|
|
; Returns 1 if there is no NPC in front
|
2022-11-07 18:27:09 -08:00
|
|
|
; Returns 2 if there is a movable NPC in front. The game actually treats
|
|
|
|
; this the same as an NPC in front (bump).
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, 0
|
2020-12-23 13:54:28 -08:00
|
|
|
ldh [hMapObjectIndex], a
|
2015-12-29 10:15:58 -08:00
|
|
|
; Load the next X coordinate into d
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerMapX]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld d, a
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingX]
|
2015-12-29 10:15:58 -08:00
|
|
|
add d
|
|
|
|
ld d, a
|
|
|
|
; Load the next Y coordinate into e
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerMapY]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld e, a
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingY]
|
2015-12-29 10:15:58 -08:00
|
|
|
add e
|
|
|
|
ld e, a
|
|
|
|
; Find an object struct with coordinates equal to d,e
|
2018-01-23 14:39:09 -08:00
|
|
|
ld bc, wObjectStructs ; redundant
|
2017-12-24 09:47:30 -08:00
|
|
|
farcall IsNPCAtCoord
|
2022-11-07 18:27:09 -08:00
|
|
|
jr nc, .no_npc
|
2015-12-29 10:15:58 -08:00
|
|
|
call .CheckStrengthBoulder
|
|
|
|
jr c, .no_bump
|
|
|
|
|
2022-11-07 18:27:09 -08:00
|
|
|
xor a ; bump
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|
|
|
|
|
2022-11-07 18:27:09 -08:00
|
|
|
.no_npc
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, 1
|
|
|
|
ret
|
|
|
|
|
|
|
|
.no_bump
|
|
|
|
ld a, 2
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckStrengthBoulder:
|
2017-12-28 04:15:46 -08:00
|
|
|
ld hl, wBikeFlags
|
2018-01-22 10:57:44 -08:00
|
|
|
bit BIKEFLAGS_STRENGTH_ACTIVE_F, [hl]
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .not_boulder
|
|
|
|
|
2022-09-12 06:15:44 -07:00
|
|
|
ld hl, OBJECT_WALKING
|
2015-12-29 10:15:58 -08:00
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
|
|
|
cp STANDING
|
|
|
|
jr nz, .not_boulder
|
|
|
|
|
|
|
|
ld hl, OBJECT_PALETTE
|
|
|
|
add hl, bc
|
2018-05-23 16:06:04 -07:00
|
|
|
bit STRENGTH_BOULDER_F, [hl]
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .not_boulder
|
|
|
|
|
|
|
|
ld hl, OBJECT_FLAGS2
|
|
|
|
add hl, bc
|
|
|
|
set 2, [hl]
|
|
|
|
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld d, a
|
|
|
|
ld hl, OBJECT_RANGE
|
|
|
|
add hl, bc
|
|
|
|
ld a, [hl]
|
2018-05-23 16:06:04 -07:00
|
|
|
and %11111100
|
2015-12-29 10:15:58 -08:00
|
|
|
or d
|
|
|
|
ld [hl], a
|
|
|
|
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
.not_boulder
|
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckLandPerms:
|
2015-12-29 10:15:58 -08:00
|
|
|
; Return 0 if walking onto land and tile permissions allow it.
|
|
|
|
; Otherwise, return carry.
|
|
|
|
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wTilePermissions]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld d, a
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wFacingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
and d
|
|
|
|
jr nz, .NotWalkable
|
|
|
|
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingTile]
|
2015-12-29 10:15:58 -08:00
|
|
|
call .CheckWalkable
|
|
|
|
jr c, .NotWalkable
|
|
|
|
|
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.NotWalkable:
|
2015-12-29 10:15:58 -08:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckSurfPerms:
|
2015-12-29 10:15:58 -08:00
|
|
|
; Return 0 if moving in water, or 1 if moving onto land.
|
|
|
|
; Otherwise, return carry.
|
|
|
|
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wTilePermissions]
|
2015-12-29 10:15:58 -08:00
|
|
|
ld d, a
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wFacingDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
and d
|
|
|
|
jr nz, .NotSurfable
|
|
|
|
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wWalkingTile]
|
2015-12-29 10:15:58 -08:00
|
|
|
call .CheckSurfable
|
|
|
|
jr c, .NotSurfable
|
|
|
|
|
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.NotSurfable:
|
2015-12-29 10:15:58 -08:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.BikeCheck:
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wPlayerState]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp PLAYER_BIKE
|
|
|
|
ret z
|
2017-12-15 20:29:42 -08:00
|
|
|
cp PLAYER_SKATE
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckWalkable:
|
2015-12-29 10:15:58 -08:00
|
|
|
; Return 0 if tile a is land. Otherwise, return carry.
|
|
|
|
|
|
|
|
call GetTileCollision
|
2020-02-13 16:01:47 -08:00
|
|
|
and a ; LAND_TILE
|
2015-12-29 10:15:58 -08:00
|
|
|
ret z
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.CheckSurfable:
|
2015-12-29 10:15:58 -08:00
|
|
|
; Return 0 if tile a is water, or 1 if land.
|
|
|
|
; Otherwise, return carry.
|
|
|
|
|
|
|
|
call GetTileCollision
|
2020-02-13 16:01:47 -08:00
|
|
|
cp WATER_TILE
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .Water
|
|
|
|
|
|
|
|
; Can walk back onto land from water.
|
2020-02-13 16:01:47 -08:00
|
|
|
and a ; LAND_TILE
|
2015-12-29 10:15:58 -08:00
|
|
|
jr z, .Land
|
|
|
|
|
|
|
|
jr .Neither
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.Water:
|
2015-12-29 10:15:58 -08:00
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.Land:
|
2015-12-29 10:15:58 -08:00
|
|
|
ld a, 1
|
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2016-04-10 11:42:14 -07:00
|
|
|
.Neither:
|
2015-12-29 10:15:58 -08:00
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.BumpSound:
|
2015-12-29 10:15:58 -08:00
|
|
|
call CheckSFX
|
|
|
|
ret c
|
|
|
|
ld de, SFX_BUMP
|
|
|
|
call PlaySFX
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
.GetOutOfWater:
|
2015-12-29 10:15:58 -08:00
|
|
|
push bc
|
|
|
|
ld a, PLAYER_NORMAL
|
2018-01-23 14:39:09 -08:00
|
|
|
ld [wPlayerState], a
|
2020-06-16 16:38:00 -07:00
|
|
|
call UpdatePlayerSprite ; UpdateSprites
|
2015-12-29 10:15:58 -08:00
|
|
|
pop bc
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
CheckStandingOnIce::
|
2016-05-14 10:46:14 -07:00
|
|
|
ld a, [wPlayerTurningDirection]
|
2015-12-29 10:15:58 -08:00
|
|
|
cp 0
|
|
|
|
jr z, .not_ice
|
|
|
|
cp $f0
|
|
|
|
jr z, .not_ice
|
2022-09-12 06:15:44 -07:00
|
|
|
ld a, [wPlayerTile]
|
2015-12-29 10:15:58 -08:00
|
|
|
call CheckIceTile
|
|
|
|
jr nc, .yep
|
2018-01-23 14:39:09 -08:00
|
|
|
ld a, [wPlayerState]
|
2017-12-15 20:29:42 -08:00
|
|
|
cp PLAYER_SKATE
|
2015-12-29 10:15:58 -08:00
|
|
|
jr nz, .not_ice
|
|
|
|
|
|
|
|
.yep
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
.not_ice
|
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2018-06-24 07:09:41 -07:00
|
|
|
StopPlayerForEvent::
|
2015-12-29 10:15:58 -08:00
|
|
|
ld hl, wPlayerNextMovement
|
2016-05-14 09:28:00 -07:00
|
|
|
ld a, movement_step_sleep
|
2015-12-29 10:15:58 -08:00
|
|
|
cp [hl]
|
|
|
|
ret z
|
|
|
|
|
|
|
|
ld [hl], a
|
|
|
|
ld a, 0
|
2016-05-14 10:46:14 -07:00
|
|
|
ld [wPlayerTurningDirection], a
|
2015-12-29 10:15:58 -08:00
|
|
|
ret
|