diff options
author | Pokeglitch <pokeglitchx@gmail.com> | 2018-06-25 22:43:31 -0400 |
---|---|---|
committer | Pokeglitch <pokeglitchx@gmail.com> | 2018-06-25 22:43:31 -0400 |
commit | 3c966f7df4170f58f8274f444977c5a29225d9be (patch) | |
tree | f9600d107d608241fdfafe1d08dddc6a4e80ef0b | |
parent | 906ea8bdfcf024cb5011948a319764047f8fa41f (diff) |
Disassembled all routines related to sprite movement/collisions. Added in constants
-rw-r--r-- | constants.asm | 1 | ||||
-rw-r--r-- | constants/collision_constants.asm | 4 | ||||
-rw-r--r-- | constants/map_object_constants.asm | 4 | ||||
-rw-r--r-- | constants/metatile_constants.asm | 1 | ||||
-rwxr-xr-x | constants/movement_constants.asm | 44 | ||||
-rw-r--r-- | constants/sprite_constants.asm | 2 | ||||
-rwxr-xr-x | engine/overworld/object_collision.asm | 157 | ||||
-rw-r--r-- | engine/overworld/player_movement.asm | 1123 | ||||
-rw-r--r-- | engine/sprites/sprites.asm (renamed from data/sprites/sprites.asm) | 53 | ||||
-rw-r--r-- | home/copy2.asm | 2 | ||||
-rw-r--r-- | home/map.asm | 16 | ||||
-rw-r--r-- | home/map_objects.asm | 26 | ||||
-rw-r--r-- | home/tileset.asm | 20 | ||||
-rw-r--r-- | hram.asm | 12 | ||||
-rw-r--r-- | macros/wram.asm | 4 | ||||
-rw-r--r-- | shim.sym | 2 | ||||
-rw-r--r-- | wram.asm | 5 |
17 files changed, 927 insertions, 549 deletions
diff --git a/constants.asm b/constants.asm index 9da5ddc..7043c32 100644 --- a/constants.asm +++ b/constants.asm @@ -38,3 +38,4 @@ INCLUDE "constants/menu_constants.asm" INCLUDE "constants/wram_constants.asm" INCLUDE "constants/sgb_constants.asm" INCLUDE "constants/map_object_constants.asm" +INCLUDE "constants/movement_constants.asm" diff --git a/constants/collision_constants.asm b/constants/collision_constants.asm index 580d397..ebe3856 100644 --- a/constants/collision_constants.asm +++ b/constants/collision_constants.asm @@ -126,3 +126,7 @@ COLLISION_JUMP_SE EQU $a4 COLLISION_JUMP_SW EQU $a5 COLLISION_JUMP_NE EQU $a6 COLLISION_JUMP_NW EQU $a7 + +NEVER_SOLID EQU 0 +SOMETIMES_SOLID EQU 1 +ALWAYS_SOLID EQU 15 diff --git a/constants/map_object_constants.asm b/constants/map_object_constants.asm index c9bce93..81c52a3 100644 --- a/constants/map_object_constants.asm +++ b/constants/map_object_constants.asm @@ -70,3 +70,7 @@ MAPOBJECTTEMPLATE_SCRIPT_POINTER rb 1 ; 9 MAPOBJECTTEMPLATE_POINTER_HI rb 1 ; a MAPOBJECTTEMPLATE_EVENT_FLAG rw 1 ; b MAP_OBJECT_TEMPLATE_LENGTH SET _RS + +PLAYER_OBJECT_INDEX EQU 1 +COMPANION_OBJECT_INDEX EQU 2 +NUM_OBJECT_STRUCTS EQU 10 diff --git a/constants/metatile_constants.asm b/constants/metatile_constants.asm index 8d86ac5..88d54ab 100644 --- a/constants/metatile_constants.asm +++ b/constants/metatile_constants.asm @@ -1,4 +1,3 @@ - ; all outside tileset share certain metatiles ; this is used in overworld code when editing the map ; D - dirt diff --git a/constants/movement_constants.asm b/constants/movement_constants.asm new file mode 100755 index 0000000..f0c1a88 --- /dev/null +++ b/constants/movement_constants.asm @@ -0,0 +1,44 @@ + const_def
+ const FACE_DOWN ; $00
+ const FACE_UP ; $01
+ const FACE_LEFT ; $02
+ const FACE_RIGHT ; $03
+ const SLOW_STEP_DOWN ; $04
+ const SLOW_STEP_UP ; $05
+ const SLOW_STEP_LEFT ; $06
+ const SLOW_STEP_RIGHT ; $07
+ const STEP_DOWN ; $08
+ const STEP_UP ; $09
+ const STEP_LEFT ; $0a
+ const STEP_RIGHT ; $0b
+ const FAST_STEP_DOWN ; $0c
+ const FAST_STEP_UP ; $0d
+ const FAST_STEP_LEFT ; $0e
+ const FAST_STEP_RIGHT ; $0f
+ const FAST_STEP_DOWN2 ; $10
+ const FAST_STEP_UP2 ; $11
+ const FAST_STEP_LEFT2 ; $12
+ const FAST_STEP_RIGHT2 ; $13
+ const SLOW_JUMP_DOWN ; $14
+ const SLOW_JUMP_UP ; $15
+ const SLOW_JUMP_LEFT ; $16
+ const SLOW_JUMP_RIGHT ; $17
+ const JUMP_DOWN ; $18
+ const JUMP_UP ; $19
+ const JUMP_LEFT ; $1a
+ const JUMP_RIGHT ; $1b
+ const FAST_JUMP_DOWN ; $1c
+ const FAST_JUMP_UP ; $1d
+ const FAST_JUMP_LEFT ; $1e
+ const FAST_JUMP_RIGHT ; $1f
+ const FAST_JUMP_DOWN2 ; $20
+ const FAST_JUMP_UP2 ; $21
+ const FAST_JUMP_LEFT2 ; $22
+ const FAST_JUMP_RIGHT2 ; $23
+ const MOVEMENT_24 ; $24
+ const MOVEMENT_25 ; $25
+ const MOVEMENT_26 ; $26
+ const MOVEMENT_27 ; $27
+ const MOVEMENT_28 ; $28
+ const MOVEMENT_29 ; $29
+ const NO_MOVEMENT ; $2a
diff --git a/constants/sprite_constants.asm b/constants/sprite_constants.asm index 50b5d84..c53866b 100644 --- a/constants/sprite_constants.asm +++ b/constants/sprite_constants.asm @@ -91,3 +91,5 @@ const SPRITE_59 ; 59 duplicate SPRITE_OLD_LINK_RECEPTIONIST const SPRITE_EGG ; 5a const SPRITE_BOULDER ; 5b + +SPRITE_TILE_SIZE EQU 64 diff --git a/engine/overworld/object_collision.asm b/engine/overworld/object_collision.asm new file mode 100755 index 0000000..a04000b --- /dev/null +++ b/engine/overworld/object_collision.asm @@ -0,0 +1,157 @@ +INCLUDE "constants.asm"
+
+SECTION "GetSpritesNextTile", ROMX[$774a], BANK[$01]
+
+; Get the tile that the sprite will walk onto next
+GetSpritesNextTile: ; 01:774a
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld d, [hl]
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld e, [hl]
+ push bc
+ call GetCoordTile
+ pop bc
+ ret
+
+; Sets carry flag if the object (bc) next tile is a collision
+_IsObjectCollisionTileSolid: ; 01:775a
+ call GetSpritesNextTile
+ ld e, a
+ ld d, 0
+ ld hl, CollisionTypeTable
+ add hl, de
+ ld a, BANK(CollisionTypeTable)
+ call GetFarByte
+ and ALWAYS_SOLID ; also covers SOMETIMES_SOLID
+ ret z
+ scf
+ ret
+
+
+
+SECTION "_CheckObjectCollision", ROMX[$77dd], BANK[$01]
+
+; returns the carry flag if a sprite is at coords d, e
+; will not collide with sprite index stored in hEventCollisionException
+_CheckObjectCollision: ; 01:77dd
+ ld bc, wObjectStructs
+ xor a
+.loop
+ ldh [hObjectStructIndexBuffer], a
+ ld hl, OBJECT_SPRITE
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .check_last_position
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .check_last_position
+ ldh a, [hEventCollisionException]
+ ld l, a
+ ldh a, [hObjectStructIndexBuffer]
+ cp l
+ jr nz, .collision
+.check_last_position
+ ld hl, OBJECT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .next
+ ld hl, OBJECT_MAP_Y
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .next
+ ldh a, [hEventCollisionException]
+ ld l, a
+ ldh a, [hObjectStructIndexBuffer]
+ cp l
+ jr nz, .collision
+.next
+ ld hl, OBJECT_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ ldh a, [hObjectStructIndexBuffer]
+ inc a
+ cp NUM_OBJECT_STRUCTS
+ jr nz, .loop
+ and a
+ ret
+
+.collision
+ scf
+ ret
+
+SECTION "_CheckPlayerObjectCollision", ROMX[$7894], BANK[$01]
+
+; Sets the carry flag if the player will collide with another sprite's current or next position
+_CheckPlayerObjectCollision: ; 01:7894
+ ld a, [wPlayerNextMapX]
+ ld d, a
+ ld a, [wPlayerNextMapY]
+ ld e, a
+ ld bc, wObjectStructs
+ xor a
+
+.loop
+ ldh [hObjectStructIndexBuffer], a
+ ld hl, OBJECT_SPRITE
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next
+ ld hl, OBJECT_NEXT_MAP_Y
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .check_last_position
+ ld hl, OBJECT_NEXT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .check_last_position
+
+; skip the player sprite
+ ldh a, [hObjectStructIndexBuffer]
+ cp PLAYER_OBJECT_INDEX
+ jr z, .next
+ jr .collision
+
+.check_last_position
+ ld hl, OBJECT_MAP_Y
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .next
+ ld hl, OBJECT_MAP_X
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .next
+ jr .collision
+
+.next
+ ld hl, OBJECT_LENGTH
+ add hl, bc
+ ld b, h
+ ld c, l
+ ldh a, [hObjectStructIndexBuffer]
+ inc a
+ cp NUM_OBJECT_STRUCTS
+ jr nz, .loop
+ xor a
+ ret
+
+.collision
+ scf
+ ret
diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm index 44938aa..0fcd6e9 100644 --- a/engine/overworld/player_movement.asm +++ b/engine/overworld/player_movement.asm @@ -2,15 +2,15 @@ INCLUDE "constants.asm" SECTION "Player Movement", ROMX[$4000], BANK[$3] -OverworldMovementCheck:: +OverworldMovementCheck:: ; 03:4000 jp _OverworldMovementCheck -UnusedOverworldMovementCheck:: - ld a, $01 +UnusedOverworldMovementCheck:: ; 03:4003 + ld a, PLAYER_OBJECT_INDEX ldh [hEventCollisionException], a ld a, [wPlayerDirection] and a - jr z, _SetPlayerIdle ; player movement is disabled + jr z, SetPlayerIdle ; player movement is disabled ldh a, [hJoyState] ld d, a ld hl, wce63 @@ -21,183 +21,188 @@ UnusedOverworldMovementCheck:: .skip_debug_move ld a, [wPlayerState] cp PLAYER_SKATE - jp z, OldCheckMovementSkateboard + jp z, CheckMovementSkateboard cp PLAYER_SURF jp z, OldCheckMovementSurf jp CheckMovementWalkOrBike -_SetPlayerIdle: - ld a, $2a -_SetPlayerAnimation: - ld [wcb77], a + +SetPlayerIdle: ; 03:402c + ld a, NO_MOVEMENT + +SetPlayerMovement: ; 03:402e + ld [wPlayerMovement], a ld a, [wPlayerLastMapX] - ld [wPlayerStandingMapX], a + ld [wPlayerNextMapX], a ld a, [wPlayerLastMapY] - ld [wPlayerStandingMapY], a + ld [wPlayerNextMapY], a and a ret -CheckMovementWalkOrBike: +CheckMovementWalkOrBike: ; 03:403f call _CheckMovementWalkOrBike - jp _SetPlayerAnimation + jp SetPlayerMovement -_CheckMovementWalkOrBike: +_CheckMovementWalkOrBike: ; 03:4045 ld a, d - and (D_DOWN | D_UP | D_LEFT | D_RIGHT) - jp z, .done + and D_PAD + jp z, .idle ld a, d bit D_DOWN_F, a - jp nz, .moveDown + jp nz, .check_down bit D_UP_F, a - jp nz, .moveUp + jp nz, .check_up bit D_LEFT_F, a - jp nz, .moveLeft + jp nz, .check_left bit D_RIGHT_F, a - jr nz, .moveRight -.done: - ld a, $2a + jr nz, .check_right +.idle + ld a, NO_MOVEMENT ret -.moveRight: + +.check_right ld a, [wPlayerLastMapX] inc a - ld [wPlayerStandingMapX], a - call _CheckPlayerObjectCollision - jr c, .faceRight + ld [wPlayerNextMapX], a + call CheckPlayerObjectCollision + jr c, .face_right call IsPlayerCollisionTileSolid - jr nc, .canMoveRight - jr .faceRight -.canMoveRight + jr nc, .move_right + jr .face_right +.move_right ld a, [wPlayerState] cp PLAYER_BIKE - ld a, $0f + ld a, FAST_STEP_RIGHT ret z - ld a, $0b + ld a, STEP_RIGHT ret -.faceRight: - ld a, $03 +.face_right + ld a, FACE_RIGHT ret -.moveLeft: +.check_left: ld a, [wPlayerLastMapX] dec a - ld [wPlayerStandingMapX], a - call _CheckPlayerObjectCollision - jr c, .faceLeft + ld [wPlayerNextMapX], a + call CheckPlayerObjectCollision + jr c, .face_left call IsPlayerCollisionTileSolid - jr nc, .canMoveLeft - jr .faceLeft -.canMoveLeft + jr nc, .move_left + jr .face_left +.move_left ld a, [wPlayerState] cp PLAYER_BIKE - ld a, $0e + ld a, FAST_STEP_LEFT ret z - ld a, $0a + ld a, STEP_LEFT ret -.faceLeft: - ld a, $02 +.face_left + ld a, FACE_LEFT ret -.moveDown: +.check_down ld a, [wPlayerLastMapY] inc a - ld [wPlayerStandingMapY], a - call _CheckPlayerObjectCollision - jr c, .faceDown + ld [wPlayerNextMapY], a + call CheckPlayerObjectCollision + jr c, .face_down call IsPlayerCollisionTileSolid - jr nc, .canMoveDown + jr nc, .move_down cp OLD_COLLISION_LEDGE - jr nz, .faceDown -.jumpDown: - ld a, $18 + jr nz, .face_down + ld a, JUMP_DOWN ret -.canMoveDown +.move_down ld a, [wPlayerState] cp PLAYER_BIKE - ld a, $0c + ld a, FAST_STEP_DOWN ret z - ld a, $08 + ld a, STEP_DOWN ret -.faceDown: - ld a, $00 +.face_down + ld a, FACE_DOWN ret -.moveUp: +.check_up ld a, [wPlayerLastMapY] dec a - ld [wPlayerStandingMapY], a - call _CheckPlayerObjectCollision - jr c, .faceUp + ld [wPlayerNextMapY], a + call CheckPlayerObjectCollision + jr c, .face_up call IsPlayerCollisionTileSolid - jr nc, .canMoveUp - jr .faceUp -.canMoveUp + jr nc, .move_up + jr .face_up +.move_up ld a, [wPlayerState] cp PLAYER_BIKE - ld a, $0d + ld a, FAST_STEP_UP ret z - ld a, $09 + ld a, STEP_UP ret -.faceUp: - ld a, $01 +.face_up + ld a, FACE_UP ret -CheckMovementDebug:: +CheckMovementDebug:: ; 03:40eb ld a, d call _CheckMovementDebug - jp _SetPlayerAnimation + jp SetPlayerMovement -_CheckMovementDebug: +_CheckMovementDebug: ; 03:40f2 bit D_DOWN_F, a - jr nz, .moveDown + jr nz, .move_down bit D_UP_F, a - jr nz, .moveUp + jr nz, .move_up bit D_LEFT_F, a - jr nz, .moveLeft + jr nz, .move_left bit D_RIGHT_F, a - jr nz, .moveRight -.idle: - ld a, $2a + jr nz, .move_right + ld a, NO_MOVEMENT ret -.moveDown: + +.move_down ld a, [wTileDown] - cp $ff - ld a, $0c + cp -1 + ld a, FAST_STEP_DOWN ret nz - ld a, $19 + ld a, JUMP_UP ret -.moveUp: + +.move_up ld a, [wTileUp] - cp $ff - ld a, $0d + cp -1 + ld a, FAST_STEP_UP ret nz - ld a, $18 + ld a, JUMP_DOWN ret -.moveLeft: + +.move_left ld a, [wTileLeft] - cp $ff - ld a, $0e + cp -1 + ld a, FAST_STEP_LEFT ret nz - ld a, $1b + ld a, JUMP_RIGHT ret -.moveRight: + +.move_right ld a, [wTileRight] - cp $ff - ld a, $0f + cp -1 + ld a, FAST_STEP_RIGHT ret nz - ld a, $1a + ld a, JUMP_LEFT ret -OldCheckMovementSkateboard:: - call _OldCheckMovementSkateboard - jp _SetPlayerAnimation +CheckMovementSkateboard:: ; 03:4131 + call _CheckMovementSkateboard + jp SetPlayerMovement -_OldCheckMovementSkateboard: +_CheckMovementSkateboard: ; 03:4137 ld a, [wSkatingDirection] - cp $ff - jp z, .skateStand + cp STANDING + jp z, .not_moving push de ld e, a ld d, $00 - ld hl, .skateMovementTable + ld hl, .SkateMovementTable add hl, de add hl, de ld a, [hli] @@ -205,149 +210,161 @@ _OldCheckMovementSkateboard: ld l, a pop de jp hl -.skateMovementTable: - dw .skateDown - dw .skateUp - dw .skateLeft - dw .skateRight -.skateStand: +.SkateMovementTable ; 03:414d + dw CheckSkateDown + dw CheckSkateUp + dw CheckSkateLeft + dw CheckSkateRight + +.not_moving ; 03:4155 ld a, d - and (D_DOWN | D_UP | D_LEFT | D_RIGHT) - jp z, .done + and D_PAD + jp z, .idle bit D_DOWN_F, d - jp nz, .skateDown + jp nz, CheckSkateDown bit D_UP_F, d - jp nz, .skateUp + jp nz, CheckSkateUp bit D_LEFT_F, d - jp nz, .skateLeft + jp nz, CheckSkateLeft bit D_RIGHT_F, d - jp nz, .skateRight -.done: - ld a, $ff + jp nz, CheckSkateRight + +.idle + ld a, STANDING ld [wSkatingDirection], a - ld a, $2a + ld a, NO_MOVEMENT ret -.skateDown: +CheckSkateDown: ; 03:4177 ld a, [wPlayerLastMapY] inc a - ld [wPlayerStandingMapY], a - ld a, $00 + ld [wPlayerNextMapY], a + ld a, DOWN ld [wSkatingDirection], a - call _CheckPlayerObjectCollision - jr c, .skateDownCollision + call CheckPlayerObjectCollision + jr c, .collision call IsPlayerCollisionTileSolid - jr nc, .canSkateDown + jr nc, .can_skate cp OLD_COLLISION_LEDGE - jr z, .skateJumpDown + jr z, .jump cp (OLD_COLLISION_ROCK | COLLISION_FLAG) - jr nz, .skateDownCollision -.skateJumpDown: - ld a, $1c + jr nz, .collision + +.jump + ld a, FAST_JUMP_DOWN ret -.canSkateDown: + +.can_skate call OldIsTileCollisionGrass - jr z, .skateDownSlowly - ld a, $0c + jr z, .slow + ld a, FAST_STEP_DOWN ret -.skateDownSlowly: - ld a, $08 + +.slow + ld a, STEP_DOWN ret -.skateDownCollision: - ld a, $ff + +.collision + ld a, STANDING ld [wSkatingDirection], a - ld a, $00 + ld a, FACE_DOWN ret -.skateUp: +CheckSkateUp: ; 03:41ab ld a, [wPlayerLastMapY] dec a - ld [wPlayerStandingMapY], a - ld a, $01 + ld [wPlayerNextMapY], a + ld a, UP ld [wSkatingDirection], a - call _CheckPlayerObjectCollision - jr c, .skateUpCollision + call CheckPlayerObjectCollision + jr c, .collision call IsPlayerCollisionTileSolid - jr nc, .canSkateUp - cp $59 - jr nz, .skateUpCollision -.skateJumpUp: - ld a, $1d + jr nc, .can_skate + cp (OLD_COLLISION_ROCK | COLLISION_FLAG) + jr nz, .collision + ld a, FAST_JUMP_UP ret -.canSkateUp: + +.can_skate call OldIsTileCollisionGrass - jr z, .skateUpSlowly - ld a, $0d + jr z, .slow + ld a, FAST_STEP_UP ret -.skateUpSlowly: - ld a, $09 + +.slow + ld a, STEP_UP ret -.skateUpCollision: - ld a, $ff + +.collision + ld a, STANDING ld [wSkatingDirection], a - ld a, $01 + ld a, FACE_UP ret -.skateLeft: +CheckSkateLeft: ; 03:41db ld a, [wPlayerLastMapX] dec a - ld [wPlayerStandingMapX], a - ld a, $02 + ld [wPlayerNextMapX], a + ld a, LEFT ld [wSkatingDirection], a - call _CheckPlayerObjectCollision - jr c, .skateLeftCollision + call CheckPlayerObjectCollision + jr c, .collision call IsPlayerCollisionTileSolid - jr nc, .canSkateLeft - cp $59 - jr nz, .skateLeftCollision -.skateJumpLeft: - ld a, $1e + jr nc, .can_skate + cp (OLD_COLLISION_ROCK | COLLISION_FLAG) + jr nz, .collision + ld a, FAST_JUMP_LEFT ret -.canSkateLeft: + +.can_skate call OldIsTileCollisionGrass - jr z, .skateLeftSlowly - ld a, $0e + jr z, .slow + ld a, FAST_STEP_LEFT ret -.skateLeftSlowly: - ld a, $0a + +.slow + ld a, STEP_LEFT ret -.skateLeftCollision: - ld a, $ff + +.collision + ld a, STANDING ld [wSkatingDirection], a - ld a, $02 + ld a, FACE_LEFT ret -.skateRight: +CheckSkateRight: ; 03:420b ld a, [wPlayerLastMapX] inc a - ld [wPlayerStandingMapX], a - ld a, $03 + ld [wPlayerNextMapX], a + ld a, RIGHT ld [wSkatingDirection], a - call _CheckPlayerObjectCollision - jr c, .skateRightCollision + call CheckPlayerObjectCollision + jr c, .collision call IsPlayerCollisionTileSolid - jr nc, .canSkateRight - cp $59 - jr nz, .skateRightCollision -.skateJumpRight: - ld a, $1f + jr nc, .can_skate + cp (OLD_COLLISION_ROCK | COLLISION_FLAG) + jr nz, .collision + ld a, FAST_JUMP_RIGHT ret -.canSkateRight: + +.can_skate call OldIsTileCollisionGrass - jr z, .skateRightSlowly - ld a, $0f + jr z, .slow + ld a, FAST_STEP_RIGHT ret -.skateRightSlowly: - ld a, $0b + +.slow + ld a, STEP_RIGHT ret -.skateRightCollision: - ld a, $ff + +.collision + ld a, STANDING ld [wSkatingDirection], a - ld a, $03 + ld a, FACE_RIGHT ret -OldIsTileCollisionGrass:: +OldIsTileCollisionGrass:: ; 03:423b ; Check whether collision ID in a is ; grass ; Result: @@ -362,114 +379,109 @@ OldIsTileCollisionGrass:: cp $8b ret -OldCheckMovementSurf:: +OldCheckMovementSurf:: ; 03:4247 call _OldCheckMovementSurf - jp _SetPlayerAnimation + jp SetPlayerMovement -_OldCheckMovementSurf: +_OldCheckMovementSurf: ; 03:424d ld a, d - and (D_DOWN | D_UP | D_LEFT | D_RIGHT) + and D_PAD bit D_DOWN_F, a - jp nz, .trySurfDown + jp nz, .check_down bit D_UP_F, a - jp nz, .trySurfUp + jp nz, .check_up bit D_LEFT_F, a - jp nz, .trySurfLeft + jp nz, .check_left bit D_RIGHT_F, a - jr nz, .trySurfRight -.idle: - ld a, $2a + jr nz, .check_right + ld a, NO_MOVEMENT ret -.trySurfDown: +.check_down ld a, [wPlayerLastMapY] inc a - ld [wPlayerStandingMapY], a - call _CheckPlayerObjectCollision - jr c, .faceDown + ld [wPlayerNextMapY], a + call CheckPlayerObjectCollision + jr c, .face_down call IsPlayerCollisionTileSolid - jr nc, .surfDownLand ; FIXME: This assumes cut-trees are solid, which they aren't. - ; You can walk into them from water because of this. + jr nc, .exit_water_down ; FIXME: This assumes cut-trees are solid, which they aren't. + ; You can walk into them from water because of this. call OldIsTileCollisionWater - jr c, .faceDown -.surfDown: - ld a, $08 + jr c, .face_down + ld a, STEP_DOWN ret -.faceDown: - ld a, $00 +.face_down + ld a, FACE_DOWN ret -.surfDownLand: +.exit_water_down call SetPlayerStateWalk - ld a, $04 + ld a, SLOW_STEP_DOWN ret -.trySurfUp: +.check_up ld a, [wPlayerLastMapY] dec a - ld [wPlayerStandingMapY], a - call _CheckPlayerObjectCollision - jr c, .faceUp + ld [wPlayerNextMapY], a + call CheckPlayerObjectCollision + jr c, .face_up call IsPlayerCollisionTileSolid - jr nc, .surfUpLand ; FIXME: This assumes cut-trees are solid, which they aren't. - ; You can walk into them from water because of this. + jr nc, .exit_water_up ; FIXME: This assumes cut-trees are solid, which they aren't. + ; You can walk into them from water because of this. call OldIsTileCollisionWater - jr c, .faceUp -.surfUp: - ld a, $09 + jr c, .face_up + ld a, STEP_UP ret -.faceUp: - ld a, $01 +.face_up + ld a, FACE_UP ret -.surfUpLand: +.exit_water_up call SetPlayerStateWalk - ld a, $05 + ld a, SLOW_STEP_UP ret -.trySurfLeft: +.check_left ld a, [wPlayerLastMapX] dec a - ld [wPlayerStandingMapX], a - call _CheckPlayerObjectCollision - jr c, .faceLeft + ld [wPlayerNextMapX], a + call CheckPlayerObjectCollision + jr c, .face_left call IsPlayerCollisionTileSolid - jr nc, .surfLeftLand ; FIXME: This assumes cut-trees are solid, which they aren't. - ; You can walk into them from water because of this. + jr nc, .exit_water_left ; FIXME: This assumes cut-trees are solid, which they aren't. + ; You can walk into them from water because of this. call OldIsTileCollisionWater - jr c, .faceLeft -.surfLeft: - ld a, $0a + jr c, .face_left + ld a, STEP_LEFT ret -.faceLeft: - ld a, $02 +.face_left + ld a, FACE_LEFT ret -.surfLeftLand +.exit_water_left call SetPlayerStateWalk - ld a, $06 + ld a, SLOW_STEP_LEFT ret -.trySurfRight +.check_right ld a, [wPlayerLastMapX] inc a - ld [wPlayerStandingMapX], a - call _CheckPlayerObjectCollision - jr c, .faceRight + ld [wPlayerNextMapX], a + call CheckPlayerObjectCollision + jr c, .face_right call IsPlayerCollisionTileSolid - jr nc, .surfRightLand ; FIXME: This assumes cut-trees are solid, which they aren't. + jr nc, .exit_water_right ; FIXME: This assumes cut-trees are solid, which they aren't. ; You can walk into them from water because of this. call OldIsTileCollisionWater - jr c, .faceRight -.surfRight: - ld a, $0b + jr c, .face_right + ld a, STEP_RIGHT ret -.faceRight: - ld a, $03 +.face_right + ld a, FACE_RIGHT ret -.surfRightLand +.exit_water_right call SetPlayerStateWalk - ld a, $07 + ld a, SLOW_STEP_RIGHT ret -OldIsTileCollisionWater:: ; c2ee (3:42ee) +OldIsTileCollisionWater:: ; 03:42ee ; Check if collision ID in a is water ; Input: ; a - collision ID @@ -484,7 +496,7 @@ OldIsTileCollisionWater:: ; c2ee (3:42ee) scf ret -SetPlayerStateWalk:: +SetPlayerStateWalk:: ; 03:42f8 push bc ld a, PLAYER_NORMAL ld [wPlayerState], a @@ -492,7 +504,7 @@ SetPlayerStateWalk:: pop bc ret -IsPlayerCollisionTileSolid:: +IsPlayerCollisionTileSolid:: ; 03:4303 ; Return whether the collision under player's feet ; is solid/sometimes solid or non-solid. ; Clobbers: a @@ -502,64 +514,60 @@ IsPlayerCollisionTileSolid:: ; c - solid/sometimes solid push de ld bc, wPlayerStruct - ld hl, $775a - ld a, $01 - call FarCall_hl + callab _IsObjectCollisionTileSolid ld a, e pop de ret -_CheckPlayerObjectCollision:: +CheckPlayerObjectCollision:: ; 03:4312 ; Check whether player object currentl ; collides with any other object. ; Result: ; nc - no collision ; c - collision push de - ld hl, $7894 - ld a, $01 - call FarCall_hl + callab _CheckPlayerObjectCollision pop de ret nc - jp _CheckCompanionObjectCollision + jp CheckCompanionObjectCollision -_CheckCompanionObjectCollision:: +CheckCompanionObjectCollision:: ; 03:4320 ; Marks the object struct pointed to by hl ; as having collided with player object. -; If object struct (as identified by hEventID) +; If object struct (as identified by hObjectStructIndexBuffer) ; is companion, cancel collision on 5th frames. ; Result: ; nc - no collision ; c - collision - ld hl, (wPlayerFlags + 1) - wPlayerStruct + ld hl, OBJECT_FLAGS + 1 add hl, bc set 1, [hl] ; mark object as having collided with player - ldh a, [hEventID] - cp $02 - jr z, .isCompanion + ldh a, [hObjectStructIndexBuffer] + cp COMPANION_OBJECT_INDEX + jr z, .is_companion xor a ld [wCompanionCollisionFrameCounter], a scf ret -.isCompanion +.is_companion ld a, [wCompanionCollisionFrameCounter] inc a - cp $05 + cp 5 ld [wCompanionCollisionFrameCounter], a - jr z, .cancelCollision + jr z, .cancel_collision scf ret -.cancelCollision +.cancel_collision xor a ld [wCompanionCollisionFrameCounter], a ret -_OverworldMovementCheck:: - ld a, $01 +_OverworldMovementCheck:: ; 03:4344 + ld a, PLAYER_OBJECT_INDEX ldh [hEventCollisionException], a ld a, [wPlayerDirection] and a - jp z, _SetPlayerIdle + jp z, SetPlayerIdle ldh a, [hJoyState] ld d, a ld hl, wce63 @@ -567,28 +575,29 @@ _OverworldMovementCheck:: jr z, .skip_debug_move bit B_BUTTON_F, d jp nz, CheckMovementDebug + .skip_debug_move - call .checkMovementRelease - jp _SetPlayerAnimation + call GetPlayerMovementByState + jp SetPlayerMovement -.checkMovementRelease: +GetPlayerMovementByState: ; 03:4364 ld a, [wPlayerState] cp PLAYER_SKATE - jp z, OldCheckMovementSkateboard ; FIXME: OldCheckMovementSkateboard already calls _SetPlayerAnimation + jp z, CheckMovementSkateboard ; FIXME: CheckMovementSkateboard already calls SetPlayerMovement ; The skateboard doesn't work, because it uses the current ; coordinate as player animation. cp PLAYER_SURF jp z, CheckMovementSurf jp CheckMovementWalk -CheckMovementWalk:: +CheckMovementWalk:: ; 03:4374 ld a, [wPlayerStandingTile] swap a and LOW((COLLISION_TYPE_MASK >> 4) | (COLLISION_TYPE_MASK << 4)) - ld hl, .walkingCollisionTable + ld hl, .WalkingCollisionTable jp CallJumptable -.walkingCollisionTable: +.WalkingCollisionTable ; 03:4381 dw CheckMovementWalkRegular ; regular dw CheckMovementWalkSolid ; trees, grass, etc. dw CheckMovementWalkSolid ; water @@ -606,288 +615,288 @@ CheckMovementWalk:: dw CheckMovementWalkRegular ; unused dw CheckMovementWalkRegular ; unused -_MovementDone: - ld a, $2a +NoWalkMovement: ; 03:43a1 + ld a, NO_MOVEMENT ret -CheckMovementWalkSolid:: +CheckMovementWalkSolid:: ; 03:43a4 jp CheckMovementWalkRegular -CheckMovementWalkLand:: +CheckMovementWalkLand:: ; 03:43a7 ld a, [wPlayerStandingTile] and COLLISION_SUBTYPE_MASK - jr nz, .slowdown + jr nz, .force_movement call CheckMovementWalkRegular - call .slowMovementDown + call SlowDownMovementWalk ret -.slowdown - ld b, $08 + +.force_movement + ld b, STEP_DOWN cp (COLLISION_LAND_S & COLLISION_SUBTYPE_MASK) - jr z, .slowdownDone - ld b, $09 + jr z, .finish + ld b, STEP_UP cp (COLLISION_LAND_N & COLLISION_SUBTYPE_MASK) - jr z, .slowdownDone - ld b, $0a + jr z, .finish + ld b, STEP_LEFT cp (COLLISION_LAND_W & COLLISION_SUBTYPE_MASK) - jr z, .slowdownDone - ld b, $0b + jr z, .finish + ld b, STEP_RIGHT cp (COLLISION_LAND_E & COLLISION_SUBTYPE_MASK) - jr z, .slowdownDone + jr z, .finish ; fall-through --> map other codes to COLLISION_LAND_E -.slowdownDone +.finish ld a, b ret -.slowMovementDown: - ld b, $04 - cp $08 - jr z, .slowMovementDownDone - ld b, $05 - cp $09 - jr z, .slowMovementDownDone - ld b, $06 - cp $0a - jr z, .slowMovementDownDone - ld b, $07 - cp $0b - jr z, .slowMovementDownDone - ret -.slowMovementDownDone + +SlowDownMovementWalk: ; 03:43cf + ld b, SLOW_STEP_DOWN + cp STEP_DOWN + jr z, .finish + ld b, SLOW_STEP_UP + cp STEP_UP + jr z, .finish + ld b, SLOW_STEP_LEFT + cp STEP_LEFT + jr z, .finish + ld b, SLOW_STEP_RIGHT + cp STEP_RIGHT + jr z, .finish + ret +.finish ld a, b ret -CheckMovementWalkLand2:: +CheckMovementWalkLand2:: ; 03:43ea ld a, [wPlayerStandingTile] and COLLISION_SUBTYPE_MASK - ld b, $08 + ld b, STEP_DOWN cp (COLLISION_LAND2_S & COLLISION_SUBTYPE_MASK) - jr z, .done - ld b, $09 + jr z, .finish + ld b, STEP_UP cp (COLLISION_LAND2_N & COLLISION_SUBTYPE_MASK) - jr z, .done - ld b, $0a + jr z, .finish + ld b, STEP_LEFT cp (COLLISION_LAND2_W & COLLISION_SUBTYPE_MASK) - jr z, .done - ld b, $0b + jr z, .finish + ld b, STEP_RIGHT cp (COLLISION_LAND2_E & COLLISION_SUBTYPE_MASK) - jr z, .done + jr z, .finish ; fall-through --> map other codes to COLLISION_LAND2_E -.done +.finish ld a, b ret -UnusedCheckMovementWalk60:: +UnusedCheckMovementWalk60:: ; 03:4409 jp CheckMovementWalkRegular -CheckMovementWalkWarp:: +CheckMovementWalkWarp:: ; 03:440c ld a, [wPlayerStandingTile] and COLLISION_SUBTYPE_MASK - jr z, .exitWarpDpadDirection - cp $01 - jr z, .exitWarpDownNoBoundsCheck + jr z, .check_dpad + cp 1 + jr z, .move_down ld a, [wPlayerStandingTile] cp $7a - jr z, .exitWarpDownNoBoundsCheck + jr z, .move_down jp CheckMovementWalkRegular -.exitWarpDownNoBoundsCheck - ld a, $08 +.move_down + ld a, STEP_DOWN ret -.exitWarpDpadDirection + +.check_dpad ldh a, [hJoyState] bit D_DOWN_F, a - jr nz, .exitWarpDown + jr nz, .down bit D_UP_F, a - jr nz, .exitWarpUp + jr nz, .up bit D_LEFT_F, a - jr nz, .exitWarpLeft + jr nz, .left bit D_RIGHT_F, a - jr nz, .exitWarpRight - jp _MovementDone -.exitWarpDown + jr nz, .right + jp NoWalkMovement + +.down ld a, [wTileDown] - cp $ff + cp -1 jp nz, CheckMovementWalkRegular - call z, _ReportMovementOutOfBounds -.faceDown: - ld a, $00 + call z, .moved_out_of_bounds + ld a, FACE_DOWN ret -.exitWarpUp +.up ld a, [wTileUp] - cp $ff + cp -1 jp nz, CheckMovementWalkRegular - call z, _ReportMovementOutOfBounds -.faceUp: - ld a, $01 + call z, .moved_out_of_bounds + ld a, FACE_UP ret -.exitWarpLeft +.left ld a, [wTileLeft] - cp $ff + cp -1 jp nz, CheckMovementWalkRegular - call z, _ReportMovementOutOfBounds -.faceLeft: - ld a, $02 + call z, .moved_out_of_bounds + ld a, FACE_LEFT ret -.exitWarpRight +.right ld a, [wTileRight] - cp $ff + cp -1 jp nz, CheckMovementWalkRegular - call z, _ReportMovementOutOfBounds -.faceRight: - ld a, $03 + call z, .moved_out_of_bounds + ld a, FACE_RIGHT ret -_ReportMovementOutOfBounds:: +.moved_out_of_bounds ret -CheckMovementWalkMisc:: +CheckMovementWalkMisc:: ; 03:4472 jp CheckMovementWalkRegular -CheckMovementWalkSpecial:: +CheckMovementWalkSpecial:: ; 03:4475 jp CheckMovementWalkRegular -CheckMovementWalkRegular:: +CheckMovementWalkRegular:: ; 03:4478 ldh a, [hJoyState] bit D_DOWN_F, a - jp nz, TryWalkDown + jp nz, CheckWalkDown bit D_UP_F, a - jp nz, TryWalkUp + jp nz, CheckWalkUp bit D_LEFT_F, a - jp nz, TryWalkLeft + jp nz, CheckWalkLeft bit D_RIGHT_F, a - jp nz, TryWalkRight - jp _MovementDone + jp nz, CheckWalkRight + jp NoWalkMovement -CheckMovementWalkJump: +CheckMovementWalkJump: ; 03:4491 ldh a, [hJoyState] bit D_DOWN_F, a - jr nz, .checkJumpDown + jr nz, .down bit D_UP_F, a - jr nz, .checkJumpUp + jr nz, .up bit D_LEFT_F, a - jr nz, .checkJumpLeft + jr nz, .left bit D_RIGHT_F, a - jr nz, .checkJumpRight - jp _MovementDone -.checkJumpDown: + jr nz, .right + jp NoWalkMovement + +.down ld a, [wPlayerStandingTile] and COLLISION_SUBTYPE_MASK cp (COLLISION_JUMP_S & COLLISION_SUBTYPE_MASK) - jr z, .jumpDown + jr z, .jump_down cp (COLLISION_JUMP_SE & COLLISION_SUBTYPE_MASK) - jr z, .jumpDown + jr z, .jump_down cp (COLLISION_JUMP_SW & COLLISION_SUBTYPE_MASK) - jr z, .jumpDown - jp TryWalkDown -.jumpDown: - ld a, $18 + jr z, .jump_down + jp CheckWalkDown +.jump_down + ld a, JUMP_DOWN ret -.checkJumpUp: + +.up ld a, [wPlayerStandingTile] and COLLISION_SUBTYPE_MASK cp (COLLISION_JUMP_N & COLLISION_SUBTYPE_MASK) - jr z, .jumpUp + jr z, .jump_up cp (COLLISION_JUMP_NE & COLLISION_SUBTYPE_MASK) - jr z, .jumpUp + jr z, .jump_up cp (COLLISION_JUMP_NW & COLLISION_SUBTYPE_MASK) - jr z, .jumpUp - jp TryWalkUp -.jumpUp: - ld a, $19 + jr z, .jump_up + jp CheckWalkUp +.jump_up + ld a, JUMP_UP ret -.checkJumpLeft: + +.left ld a, [wPlayerStandingTile] and COLLISION_SUBTYPE_MASK cp (COLLISION_JUMP_W & COLLISION_SUBTYPE_MASK) - jr z, .jumpLeft + jr z, .jump_left cp (COLLISION_JUMP_SW & COLLISION_SUBTYPE_MASK) - jr z, .jumpLeft + jr z, .jump_left cp (COLLISION_JUMP_NW & COLLISION_SUBTYPE_MASK) - jr z, .jumpLeft - jp TryWalkLeft -.jumpLeft: - ld a, $1a + jr z, .jump_left + jp CheckWalkLeft +.jump_left + ld a, JUMP_LEFT ret -.checkJumpRight + +.right ld a, [wPlayerStandingTile] and COLLISION_SUBTYPE_MASK cp (COLLISION_JUMP_E & COLLISION_SUBTYPE_MASK) - jr z, .jumpRight + jr z, .jump_right cp (COLLISION_JUMP_SE & COLLISION_SUBTYPE_MASK) - jr z, .jumpRight + jr z, .jump_right cp (COLLISION_JUMP_NE & COLLISION_SUBTYPE_MASK) - jr z, .jumpRight - jp TryWalkRight -.jumpRight - ld a, $1b + jr z, .jump_right + jp CheckWalkRight +.jump_right + ld a, JUMP_RIGHT ret -TryWalkDown:: +CheckWalkDown:: ; 03:4502 ld d, 0 ld e, 1 - call _CheckObjectCollision - jr c, .faceDown + call CheckObjectCollision + jr c, .face_down ld a, [wTileDown] call CheckCollisionSolid - jr c, .faceDown -.moveDown: - ld a, $08 + jr c, .face_down + ld a, STEP_DOWN ret -.faceDown: - ld a, $00 +.face_down + ld a, FACE_DOWN ret -TryWalkUp:: +CheckWalkUp:: ; 03:4519 ld d, 0 ld e, -1 - call _CheckObjectCollision - jr c, .faceUp + call CheckObjectCollision + jr c, .face_up ld a, [wTileUp] call CheckCollisionSolid - jr c, .faceUp -.moveUp: - ld a, $09 + jr c, .face_up + ld a, STEP_UP ret -.faceUp: - ld a, $01 +.face_up + ld a, FACE_UP ret -TryWalkLeft:: +CheckWalkLeft:: ; 03:4530 ld d, -1 ld e, 0 - call _CheckObjectCollision - jr c, .faceLeft + call CheckObjectCollision + jr c, .face_left ld a, [wTileLeft] call CheckCollisionSolid - jr c, .faceLeft -.moveLeft: - ld a, $0a + jr c, .face_left + ld a, STEP_LEFT ret -.faceLeft: - ld a, $02 +.face_left + ld a, FACE_LEFT ret -TryWalkRight:: +CheckWalkRight:: ; 03:4547 ld d, 1 ld e, 0 - call _CheckObjectCollision - jr c, .faceRight + call CheckObjectCollision + jr c, .face_right ld a, [wTileRight] call CheckCollisionSolid - jr c, .faceRight -.moveRight: - ld a, $0b + jr c, .face_right + ld a, STEP_RIGHT ret -.faceRight: - ld a, $03 +.face_right + ld a, FACE_RIGHT ret -CheckMovementSurf:: +CheckMovementSurf:: ; 03:455e ld a, [wPlayerStandingTile] swap a and LOW((COLLISION_TYPE_MASK >> 4) | (COLLISION_TYPE_MASK << 4)) - ld hl, .surfCollisionTable + ld hl, .SurfCollisionTable jp CallJumptable -.surfCollisionTable +.SurfCollisionTable ; 03:456b dw CheckMovementSurfRegular dw CheckMovementSurfRegular dw CheckMovementSurfWater @@ -905,113 +914,114 @@ CheckMovementSurf:: dw CheckMovementSurfRegular dw CheckMovementSurfRegular -CheckMovementSurfRegular:: +CheckMovementSurfRegular:: ; 03:458b ldh a, [hJoyState] bit D_DOWN_F, a - jp nz, TrySurfDown + jp nz, CheckSurfDown bit D_UP_F, a - jp nz, TrySurfUp + jp nz, CheckSurfUp bit D_LEFT_F, a - jp nz, TrySurfLeft + jp nz, CheckSurfLeft bit D_RIGHT_F, a - jp nz, TrySurfRight - jp _MovementDone + jp nz, CheckSurfRight + jp NoWalkMovement -CheckMovementSurfWater:: +CheckMovementSurfWater:: ; 03:45a4 ld a, [wPlayerStandingTile] and COLLISION_SUBTYPE_MASK cp (COLLISION_WATERFALL & COLLISION_SUBTYPE_MASK) jr nz, CheckMovementSurfRegular -.waterfall: - ld a, $0c +; waterfall + ld a, FAST_STEP_DOWN ret -CheckMovementSurfWater2:: +CheckMovementSurfWater2:: ; 03:45b0 ld a, [wPlayerStandingTile] and COLLISION_WATER_SUBTYPE_MASK - ld d, $0b - jr z, .done ; COLLISION_WATER2_E - ld d, $0a + ld d, STEP_RIGHT + jr z, .finish ; COLLISION_WATER2_E + ld d, STEP_LEFT cp (COLLISION_WATER2_W & COLLISION_WATER_SUBTYPE_MASK) - jr z, .done - ld d, $09 + jr z, .finish + ld d, STEP_UP cp (COLLISION_WATER2_N & COLLISION_WATER_SUBTYPE_MASK) - jr z, .done - ld d, $08 + jr z, .finish + ld d, STEP_DOWN cp (COLLISION_WATER2_S & COLLISION_WATER_SUBTYPE_MASK) - jr z, .done + jr z, .finish ; fall-through --> no aliasing due to mask -.done +.finish ld a, d ret -TrySurfDown: +CheckSurfDown: ; 03:45cd ld d, 0 ld e, 1 - call _CheckObjectCollision - jr c, .faceDown + call CheckObjectCollision + jr c, .face_down ld a, [wTileDown] call CheckCollisionSometimesSolid - jr c, .faceDown ; FIXME: This assumes cut-trees are solid, which they aren't. + jr c, .face_down ; FIXME: This assumes cut-trees are solid, which they aren't. ; You can walk into them from water because of this. call nz, SurfDismount - ld a, $08 + ld a, STEP_DOWN ret -.faceDown: - ld a, $00 +.face_down + ld a, FACE_DOWN ret -TrySurfUp: +CheckSurfUp: ; 03:45e7 ld d, 0 ld e, -1 - call _CheckObjectCollision - jr c, .faceUp + call CheckObjectCollision + jr c, .face_up ld a, [wTileUp] call CheckCollisionSometimesSolid - jr c, .faceUp ; FIXME: This assumes cut-trees are solid, which they aren't. + jr c, .face_up ; FIXME: This assumes cut-trees are solid, which they aren't. ; You can walk into them from water because of this. call nz, SurfDismount - ld a, $09 + ld a, STEP_UP ret -.faceUp: - ld a, $01 +.face_up + ld a, FACE_UP ret -TrySurfLeft: +CheckSurfLeft: ; 03:4601 ld d, -1 ld e, 0 - call _CheckObjectCollision - jr c, .faceLeft + call CheckObjectCollision + jr c, .face_left ld a, [wTileLeft] call CheckCollisionSometimesSolid - jr c, .faceLeft ; FIXME: This assumes cut-trees are solid, which they aren't. + jr c, .face_left ; FIXME: This assumes cut-trees are solid, which they aren't. ; You can walk into them from water because of this. call nz, SurfDismount - ld a, $0a + ld a, STEP_LEFT ret -.faceLeft: - ld a, $02 +.face_left + ld a, FACE_LEFT ret -TrySurfRight: +CheckSurfRight: ; 03:461b ld d, 1 ld e, 0 - call _CheckObjectCollision - jr c, .faceRight + call CheckObjectCollision + jr c, .face_right ld a, [wTileRight] call CheckCollisionSometimesSolid - jr c, .faceRight ; FIXME: This assumes cut-trees are solid, which they aren't. + jr c, .face_right ; FIXME: This assumes cut-trees are solid, which they aren't. ; You can walk into them from water because of this. call nz, SurfDismount - ld a, $0b + ld a, STEP_RIGHT ret -.faceRight: - ld a, $03 +.face_right + ld a, FACE_RIGHT ret -SurfDismount: + +SurfDismount: ; 03:4635 jp SetPlayerStateWalk -_CheckObjectCollision:: +CheckObjectCollision:: ; 03:4638 ; Check if coordinates relative ; to player collide with another object ; Clobbers: @@ -1021,20 +1031,18 @@ _CheckObjectCollision:: ; Output: ; nc - no collision ; c - collision -; hEventID - Event ID of colliding event - ld a, $01 +; hObjectStructIndexBuffer - Event ID of colliding event + ld a, PLAYER_OBJECT_INDEX ldh [hEventCollisionException], a - ld a, [wPlayerStandingMapX] + ld a, [wPlayerNextMapX] add d ld d, a - ld a, [wPlayerStandingMapY] + ld a, [wPlayerNextMapY] add e ld e, a - ld hl, $77dd - ld a, $01 - call FarCall_hl + callab _CheckObjectCollision ret nc - jp _CheckCompanionObjectCollision + jp CheckCompanionObjectCollision CheckCollisionSolid:: ; Checks whether collision ID in a @@ -1064,27 +1072,90 @@ GetCollisionType:: ; 01 - sometimes solid (cut tree, water etc.) ; 0F - always solid push de - ld hl, .collisionTypeTable + ld hl, CollisionTypeTable ld e, a - ld d, $00 + ld d, 0 add hl, de ld a, [hl] pop de ret -.collisionTypeTable: -INCBIN "data/collision/collision_type_table.bin" - -_UnusedReturnFalse:: +CollisionTypeTable: ; 03:4664 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $00 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $04 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $08 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $0C + db NEVER_SOLID, NEVER_SOLID, SOMETIMES_SOLID, NEVER_SOLID ; $10 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $14 + db NEVER_SOLID, NEVER_SOLID, SOMETIMES_SOLID, NEVER_SOLID ; $18 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $1C + db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $20 + db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, ALWAYS_SOLID ; $24 + db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $28 + db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, ALWAYS_SOLID ; $30 + db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $34 + db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $38 + db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $3C + db SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID, SOMETIMES_SOLID ; $40 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $44 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $48 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $4C + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $50 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $54 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $58 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $5C + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $60 + db NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID, NEVER_SOLID ; $64 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $68 + db NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID, NEVER_SOLID ; $6C + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $70 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $74 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $78 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $7C + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $80 + db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $84 + db ALWAYS_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $88 + db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $8C + db ALWAYS_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $90 + db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $94 + db ALWAYS_SOLID, ALWAYS_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $98 + db ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID, ALWAYS_SOLID ; $9C + db ALWAYS_SOLID, ALWAYS_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $A0 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $A4 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $A8 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $AC + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B0 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B4 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $B8 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $BC + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C0 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C4 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $C8 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $CC + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D0 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D4 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $D8 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $DC + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E0 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E4 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $E8 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $EC + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F0 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F4 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $F8 + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, NEVER_SOLID ; $FC + db NEVER_SOLID, NEVER_SOLID, NEVER_SOLID, ALWAYS_SOLID ; $100 + +_UnusedReturnFalse:: ; 03:4764 xor a ret -_UnusedReturnTrue:: +_UnusedReturnTrue:: ; 03:4766 xor a scf ret -CheckCollisionSometimesSolid:: +CheckCollisionSometimesSolid:: ; 03:4769 ; Checks whether collision ID in a ; is sometimes, always or never solid. ; Clobbers: @@ -1098,18 +1169,58 @@ CheckCollisionSometimesSolid:: ; 00 - sometimes solid ; 01 - never solid call GetCollisionType - cp $01 - jr z, .sometimesSolid + cp SOMETIMES_SOLID + jr z, .sometimes_solid and a - jr z, .solid - jr .alwaysSolid -.sometimesSolid: + jr z, .never_solid + jr .always_solid +.sometimes_solid xor a ret -.solid: - ld a, $01 +.never_solid + ld a, 1 and a ret -.alwaysSolid: +.always_solid scf ret + + +SECTION "_RedrawPlayerSprite", ROMX[$4000], BANK[$05] + +_RedrawPlayerSprite: ; 05:4000 + call GetPlayerSprite + ld hl, vChars0 + call LoadOverworldSprite + ret + +GetPlayerSprite: ; 05:400a + ld a, [wPlayerState] + ld hl, PlayerSpriteTable + ld c, a +.loop + ld a, [hli] + cp c + jr z, .match + inc hl + cp -1 + jr nz, .loop + xor a + ld [wPlayerState], a + ld a, SPRITE_GOLD + jr .skip +.match + ld a, [hl] +.skip + ld [wUsedSprites], a + ld [wPlayerSprite], a + ld [wPlayerObjectSprite], a + ret + +PlayerSpriteTable: ; 03:402d +; state, sprite + db PLAYER_NORMAL, SPRITE_GOLD + db PLAYER_BIKE, SPRITE_GOLD_BIKE + db PLAYER_SKATE, SPRITE_GOLD_SKATEBOARD + db PLAYER_SURF, SPRITE_LAPLACE + db -1 diff --git a/data/sprites/sprites.asm b/engine/sprites/sprites.asm index b901b7a..a1dc401 100644 --- a/data/sprites/sprites.asm +++ b/engine/sprites/sprites.asm @@ -1,5 +1,58 @@ INCLUDE "constants.asm" +SECTION "LoadOverworldSprite", ROMX[$4150], BANK[$05] + +LoadOverworldSprite: ; 05:4150 + push af + call GetOverworldSpriteData + push bc + push hl + push de + ld a, [wcdaf] + bit 7, a + jr nz, .dont_copy + call Get2bpp +.dont_copy + pop de + ld hl, SPRITE_TILE_SIZE * 3 + add hl, de + ld d, h + ld e, l + pop hl + ld bc, vChars1 - vChars0 + add hl, bc + pop bc + pop af + call IsAnimatedSprite + ret c + ld a, [wcdaf] + bit 6, a + ret nz + call Get2bpp + ret + +; get the data for overworld sprite in a +; returns: gfx ptr in hl, length in c, bank in b +GetOverworldSpriteData: ; 05:417d + push hl + dec a + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld bc, OverworldSprites + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld c, [hl] + swap c + inc hl + ld b, [hl] + pop hl + ret + SECTION "OverworldSprites", ROMX[$423B], BANK[$05] overworld_sprite: MACRO diff --git a/home/copy2.asm b/home/copy2.asm index 7274d8d..e74ef8b 100644 --- a/home/copy2.asm +++ b/home/copy2.asm @@ -3,7 +3,7 @@ INCLUDE "constants.asm" SECTION "Video Copy functions", ROM0[$0D02] RedrawPlayerSprite:: - jpab Function14000 + jpab _RedrawPlayerSprite LoadFont:: ; 00:0d0a jpab LoadFontGraphics diff --git a/home/map.asm b/home/map.asm index 8c03d9f..21e41c8 100644 --- a/home/map.asm +++ b/home/map.asm @@ -448,8 +448,8 @@ FadeIn:: ; 23e5 ; This is not OverworldFadeIn, but I don't know what it is ret Function2407:: ; 00:2407 - ld a, $2a - ld [wcb77], a + ld a, NO_MOVEMENT + ld [wPlayerMovement], a xor a ld [wPlayerAction], a ld a, [wPlayerFacing] @@ -505,7 +505,7 @@ CheckMovingOffEdgeOfMap:: ; 245e ret .down - ld a, [wPlayerStandingMapY] + ld a, [wPlayerNextMapY] sub 4 ld b, a ld a, [wMapHeight] @@ -516,7 +516,7 @@ CheckMovingOffEdgeOfMap:: ; 245e ret .up - ld a, [wPlayerStandingMapY] + ld a, [wPlayerNextMapY] sub 4 cp -1 jr z, .ok @@ -524,7 +524,7 @@ CheckMovingOffEdgeOfMap:: ; 245e ret .left - ld a, [wPlayerStandingMapX] + ld a, [wPlayerNextMapX] sub 4 cp -1 jr z, .ok @@ -532,7 +532,7 @@ CheckMovingOffEdgeOfMap:: ; 245e ret .right - ld a, [wPlayerStandingMapX] + ld a, [wPlayerNextMapX] sub 4 ld b, a ld a, [wMapWidth] @@ -701,10 +701,10 @@ WarpCheck:: ; 259f ret GetDestinationWarpPointer: ; 25b9 - ld a, [wPlayerStandingMapY] + ld a, [wPlayerNextMapY] sub 4 ld d, a - ld a, [wPlayerStandingMapX] + ld a, [wPlayerNextMapX] sub 4 ld e, a ld a, [wCurrMapWarpCount] diff --git a/home/map_objects.asm b/home/map_objects.asm index 70cba50..cc82ef3 100644 --- a/home/map_objects.asm +++ b/home/map_objects.asm @@ -334,26 +334,34 @@ Function17cb:: call Bankswitch ret -Function17de:: +; sets carry flag if the sprite data includes "in-motion" sprites +IsAnimatedSprite:: ; 00:17de push hl push bc ld c, a - ld b, $ff - ld hl, .Data -.asm_17e6: ; 00:17e6 + ld b, -1 + ld hl, .NonAnimatedSprites +.loop ld a, [hli] cp b - jr z, .asm_17ee + jr z, .done cp c - jr nz, .asm_17e6 + jr nz, .loop scf -.asm_17ee: ; 00:17ee +.done pop bc pop hl ret -.Data: ; 00:17f1 - db $51, $55, $56, $57, $58, $5a, $5b, $ff +.NonAnimatedSprites: ; 00:17f1 + db SPRITE_KABIGON + db SPRITE_POKE_BALL + db SPRITE_POKEDEX + db SPRITE_PAPER + db SPRITE_OLD_LINK_RECEPTIONIST + db SPRITE_EGG + db SPRITE_BOULDER + db -1 Function17f9:: call GetMapObject diff --git a/home/tileset.asm b/home/tileset.asm index aabf249..4929159 100644 --- a/home/tileset.asm +++ b/home/tileset.asm @@ -50,7 +50,7 @@ RefreshPlayerCoords:: ; 2d74 ld a, [wXCoord] add a, 4 ld d, a - ld hl, wPlayerStandingMapX + ld hl, wPlayerNextMapX sub [hl] ld [hl], d ld hl, wPlayerObjectXCoord @@ -61,7 +61,7 @@ RefreshPlayerCoords:: ; 2d74 ld a, [wYCoord] add a, 4 ld e, a - ld hl, wPlayerStandingMapY + ld hl, wPlayerNextMapY sub [hl] ld [hl], e ld hl, wPlayerObjectYCoord @@ -211,18 +211,18 @@ SaveScreen:: ; 2df1 RefreshTiles:: ; 2e52 call .left_right call .up_down - ld a, [wPlayerStandingMapX] + ld a, [wPlayerNextMapX] ld d, a - ld a, [wPlayerStandingMapY] + ld a, [wPlayerNextMapY] ld e, a call GetCoordTile ld [wPlayerStandingTile], a ret .up_down ; 2e67 - ld a, [wPlayerStandingMapX] + ld a, [wPlayerNextMapX] ld d, a - ld a, [wPlayerStandingMapY] + ld a, [wPlayerNextMapY] ld e, a push de inc e @@ -235,9 +235,9 @@ RefreshTiles:: ; 2e52 ret .left_right ; 2e80 - ld a, [wPlayerStandingMapX] + ld a, [wPlayerNextMapX] ld d, a - ld a, [wPlayerStandingMapY] + ld a, [wPlayerNextMapY] ld e, a push de dec d @@ -270,10 +270,10 @@ GetFacingTileCoord:: ; 2e99 ld h, [hl] ld l, a - ld a, [wPlayerStandingMapX] + ld a, [wPlayerNextMapX] add a, d ld d, a - ld a, [wPlayerStandingMapY] + ld a, [wPlayerNextMapY] add a, e ld e, a ld a, [hl] @@ -79,17 +79,13 @@ hSpriteHeight:: ; ffb0 NEXTU -hConnectionStripLength:: ; ffaf - db -hConnectedMapWidth:: ; ffb0 - db +hConnectionStripLength:: db ; ffaf +hConnectedMapWidth:: db ; ffb0 NEXTU -hMapObjectIndexBuffer:: ; ffaf - db -hObjectStructIndexBuffer:: ; ffb0 - db +hMapObjectIndexBuffer:: db ; ffaf +hObjectStructIndexBuffer:: db ; ffb0 ENDU diff --git a/macros/wram.asm b/macros/wram.asm index da67ba5..4433267 100644 --- a/macros/wram.asm +++ b/macros/wram.asm @@ -275,8 +275,8 @@ object_struct: MACRO \1Facing:: ds 1 \1StandingTile:: ds 1 ; collision \1LastTile:: ds 1 ; collision -\1StandingMapX:: ds 1 -\1StandingMapY:: ds 1 +\1NextMapX:: ds 1 +\1NextMapY:: ds 1 \1LastMapX:: ds 1 \1LastMapY:: ds 1 \1ObjectInitX:: ds 1 @@ -81,8 +81,6 @@ 04:640B Function1240b 04:6C58 CheckRegisteredItem -05:4000 Function14000 -05:400A GetPlayerSprite 05:4036 RefreshSprites 05:404C CheckInteriorMap 05:405B AddIndoorSprites @@ -252,7 +252,7 @@ wVBCopyFarSize:: ds 1 ; cb71 wVBCopyFarSrc:: ds 2 ; cb72 wVBCopyFarDst:: ds 2 ; cb74 wVBCopyFarSrcBank:: ds 1 ; cb76 -wcb77:: db ; cb77 +wPlayerMovement:: db ; cb77 wMovementObject:: db ; cb78 ptrba wMovementData ; cb79 @@ -466,7 +466,8 @@ SECTION "CD9E", WRAM0 [$CD9E] wcd9e:: db -SECTION "CDB0", WRAM0 [$CDB0] +SECTION "CDAF", WRAM0 [$CDAF] +wcdaf:: db ; cdaf wcdb0:: ; bit 0 = has engaged NPC in dialogue (?) db |