From 147d0964d8d8cddc4749f301692d495cd9b6f49a Mon Sep 17 00:00:00 2001 From: Tauwasser Date: Sun, 24 Jun 2018 23:09:15 +0200 Subject: hram: rename hTextErrno to hEventID Signed-off-by: Tauwasser --- home/text.asm | 2 +- hram.asm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/home/text.asm b/home/text.asm index b3cd75c..d528d08 100644 --- a/home/text.asm +++ b/home/text.asm @@ -232,7 +232,7 @@ NullChar:: ; 00:0f66 ret .Text: - deciram hTextErrno, 1, 2 + deciram hEventID, 1, 2 text "エラー" done diff --git a/hram.asm b/hram.asm index 676a6e5..9d8da3f 100644 --- a/hram.asm +++ b/hram.asm @@ -66,8 +66,8 @@ UNION hTextBoxCursorBlinkInterval:: ds 2 ; ffaf NEXTU - ds 1 ; TODO -hTextErrno:: db ; ffb0 +hEventCollisionException:: db ; ffaf +hEventID:: db ;; ffb0 NEXTU -- cgit v1.2.3 From 57481cc9421d2ea830480d3c1cb5b9f5c7d907aa Mon Sep 17 00:00:00 2001 From: Tauwasser Date: Sun, 24 Jun 2018 23:10:16 +0200 Subject: home/copy2: rename Function0d02 to RedrawPlayerSprite Signed-off-by: Tauwasser --- engine/events/field_moves.asm | 2 +- home/copy2.asm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/events/field_moves.asm b/engine/events/field_moves.asm index 49729d2..f6e53a3 100755 --- a/engine/events/field_moves.asm +++ b/engine/events/field_moves.asm @@ -248,7 +248,7 @@ SurfScript: ; 03:5145 call MenuTextBoxBackup ld a, PLAYER_SURF ld [wPlayerState], a - call Function0d02 + call RedrawPlayerSprite call PlayMapMusic call MovePlayerIntoWater call Function1fea diff --git a/home/copy2.asm b/home/copy2.asm index 9baad62..7274d8d 100644 --- a/home/copy2.asm +++ b/home/copy2.asm @@ -2,7 +2,7 @@ INCLUDE "constants.asm" SECTION "Video Copy functions", ROM0[$0D02] -Function0d02:: +RedrawPlayerSprite:: jpab Function14000 LoadFont:: ; 00:0d0a -- cgit v1.2.3 From 906ea8bdfcf024cb5011948a319764047f8fa41f Mon Sep 17 00:00:00 2001 From: Tauwasser Date: Sun, 24 Jun 2018 23:15:07 +0200 Subject: engine: disassemble player movement (WIP) Signed-off-by: Tauwasser --- constants.asm | 2 + constants/collision_constants.asm | 128 ++++ constants/metatile_constants.asm | 32 + data/collision/collision_type_table.bin | Bin 0 -> 256 bytes engine/overworld/player_movement.asm | 1115 +++++++++++++++++++++++++++++++ home/map.asm | 2 +- shim.sym | 1 - wram.asm | 9 +- 8 files changed, 1286 insertions(+), 3 deletions(-) create mode 100644 constants/collision_constants.asm create mode 100644 constants/metatile_constants.asm create mode 100644 data/collision/collision_type_table.bin create mode 100644 engine/overworld/player_movement.asm diff --git a/constants.asm b/constants.asm index c559622..9da5ddc 100644 --- a/constants.asm +++ b/constants.asm @@ -24,6 +24,8 @@ INCLUDE "constants/landmark_constants.asm" INCLUDE "constants/map_constants.asm" INCLUDE "constants/map_setup_constants.asm" INCLUDE "constants/tileset_constants.asm" +INCLUDE "constants/collision_constants.asm" +INCLUDE "constants/metatile_constants.asm" INCLUDE "constants/map_data_constants.asm" INCLUDE "constants/script_constants.asm" diff --git a/constants/collision_constants.asm b/constants/collision_constants.asm new file mode 100644 index 0000000..580d397 --- /dev/null +++ b/constants/collision_constants.asm @@ -0,0 +1,128 @@ +; collision IDs are built like this: +; 76543210 +; \__/|\_/ +; | | \-- SubType +; | \---- Flag +; \------ Type +; +; What exactly flag means or if it +; means anything is up to Type. +; Old Types: +; ??? +; New Types: +; 0 - Regular 8 - ??? +; 1 - Trees, Grass etc. 9 - Special Talk Action +; 2 - Water A - Jump Action +; 3 - Water 2 B - unused +; 4 - Land C - unused +; 5 - Land 2 D - unused +; 6 - ??? E - unused +; 7 - Warps F - unused + +COLLISION_TYPE_MASK EQU $f0 +COLLISION_SUBTYPE_MASK EQU $07 +COLLISION_WATER_SUBTYPE_MASK EQU $03 + +COLLISION_FLAG EQU $08 + +; old collision constants + +OLD_COLLISION_TYPE_REGULAR EQU $00 +OLD_COLLISION_TYPE_SCENERY EQU $10 +OLD_COLLISION_TYPE_WATER EQU $20 +OLD_COLLISION_TYPE_WATER2 EQU $40 + +OLD_COLLISION_WALKABLE EQU $00 +OLD_COLLISION_SOLID EQU $01 +OLD_COLLISION_FLOOR EQU $03 +OLD_COLLISION_WALL EQU $04 + +OLD_COLLISION_LEDGE EQU $11 + +OLD_COLLISION_WATER2_S EQU $40 + +OLD_COLLISION_ROCK EQU $51 + +OLD_COLLISION_CARPED EQU $60 +OLD_COLLISION_DOOR EQU $61 + +OLD_COLLISION_SIGNPOST EQU $70 +OLD_COLLISION_SHOP_SIGN EQU $71 +OLD_COLLISION_MART_ITEM EQU $72 +OLD_COLLISION_COUNTER EQU $73 + +OLD_COLLISION_CUT_TREE EQU $80 +OLD_COLLISION_GRASS EQU $82 + +; new collision constants + +COLLISION_TYPE_REGULAR EQU $00 +COLLISION_TYPE_SCENERY EQU $10 +COLLISION_TYPE_WATER EQU $20 +COLLISION_TYPE_WATER2 EQU $30 +COLLISION_TYPE_LAND EQU $40 +COLLISION_TYPE_LAND2 EQU $50 +COLLISION_TYPE_UNK EQU $60 +COLLISION_TYPE_WARPS EQU $70 +COLLISION_TYPE_UNKN2 EQU $80 +COLLISION_TYPE_SPECIAL EQU $90 +COLLISION_TYPE_JUMP EQU $A0 + +COLLISION_WALKABLE EQU $00 +COLLISION_SOLID EQU $07 +COLLISION_CUT_TREE EQU $12 +COLLISION_GRASS EQU $18 + +; water collisions + +COLLISION_WATER EQU $21 +COLLISION_WATERFALL EQU $22 +COLLISION_WATER_SOLID EQU $27 + +; water collisions 2 +COLLISION_WATER2_E EQU $30 +COLLISION_WATER2_W EQU $31 +COLLISION_WATER2_N EQU $32 +COLLISION_WATER2_S EQU $33 +; $34..$37 will behave like COLLISION_WATER2_E..COLLISION_WATER2_S + +; land collisions +COLLISION_LAND_SLOW EQU $40 +COLLISION_LAND_E EQU $41 +COLLISION_LAND_W EQU $42 +COLLISION_LAND_N EQU $43 +COLLISION_LAND_S EQU $44 +; $45..$47 will behave like COLLISION_LAND_E + +; land collisions 2 +COLLISION_LAND2_E EQU $50 +COLLISION_LAND2_W EQU $51 +COLLISION_LAND2_N EQU $52 +COLLISION_LAND2_S EQU $53 +; $54..$57 will behave like COLLISION_LAND2_E + + +; warp collisions +COLLISION_CARPET EQU $70 +COLLISION_DOOR EQU $71 +COLLISION_STEPS EQU $72 + +; special collisions +COLLISION_COUNTER EQU $90 +COLLISION_BOOKCASE EQU $91 +COLLISION_PC EQU $93 +COLLISION_RADIO EQU $94 +COLLISION_SIGNPOST EQU $95 +COLLISION_STRAIGHT_SIGNPOST EQU $97 + +; jump collisions +; perform jump in marked direction, else +; regular walking +COLLISION_JUMP_E EQU $a0 +COLLISION_JUMP_W EQU $a1 +COLLISION_JUMP_N EQU $a2 +COLLISION_JUMP_S EQU $a3 +COLLISION_JUMP_SE EQU $a4 +COLLISION_JUMP_SW EQU $a5 +COLLISION_JUMP_NE EQU $a6 +COLLISION_JUMP_NW EQU $a7 diff --git a/constants/metatile_constants.asm b/constants/metatile_constants.asm new file mode 100644 index 0000000..8d86ac5 --- /dev/null +++ b/constants/metatile_constants.asm @@ -0,0 +1,32 @@ + +; all outside tileset share certain metatiles +; this is used in overworld code when editing the map +; D - dirt +; L - lawn +; T - small tree +; C - cut tree +; G - grass +METATILE_GROUND EQU $01 ; DD + ; DD +METATILE_LAWN EQU $04 ; LL + ; LL +METATILE_SMALL_TREES_N EQU $25 ; TT + ; LL +METATILE_SMALL_TREES_W EQU $28 ; TL + ; TL +METATILE_SMALL_TREES_E EQU $2a ; LT + ; LT +METATILE_CUT_SE_TREES_N EQU $30 ; TT + ; LC +METATILE_CUT_NW_TREES_E EQU $31 ; CT + ; LT +METATILE_CUT_NE_TREE_NW EQU $32 ; TC + ; LL +METATILE_CUT_NE_TREE_SE EQU $33 ; LC + ; LT +METATILE_SMALL_TREE_NW EQU $34 ; TL + ; LL +METATILE_SMALL_TREE_SE EQU $35 ; TL + ; LL +METATILE_GRASS EQU $3b ; GG + ; GG diff --git a/data/collision/collision_type_table.bin b/data/collision/collision_type_table.bin new file mode 100644 index 0000000..c70e2bd Binary files /dev/null and b/data/collision/collision_type_table.bin differ diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm new file mode 100644 index 0000000..44938aa --- /dev/null +++ b/engine/overworld/player_movement.asm @@ -0,0 +1,1115 @@ +INCLUDE "constants.asm" + +SECTION "Player Movement", ROMX[$4000], BANK[$3] + +OverworldMovementCheck:: + jp _OverworldMovementCheck + +UnusedOverworldMovementCheck:: + ld a, $01 + ldh [hEventCollisionException], a + ld a, [wPlayerDirection] + and a + jr z, _SetPlayerIdle ; player movement is disabled + ldh a, [hJoyState] + ld d, a + ld hl, wce63 + bit 1, [hl] + jr z, .skip_debug_move + bit B_BUTTON_F, d + jp nz, CheckMovementDebug +.skip_debug_move + ld a, [wPlayerState] + cp PLAYER_SKATE + jp z, OldCheckMovementSkateboard + cp PLAYER_SURF + jp z, OldCheckMovementSurf + jp CheckMovementWalkOrBike +_SetPlayerIdle: + ld a, $2a +_SetPlayerAnimation: + ld [wcb77], a + ld a, [wPlayerLastMapX] + ld [wPlayerStandingMapX], a + ld a, [wPlayerLastMapY] + ld [wPlayerStandingMapY], a + and a + ret + +CheckMovementWalkOrBike: + call _CheckMovementWalkOrBike + jp _SetPlayerAnimation + +_CheckMovementWalkOrBike: + ld a, d + and (D_DOWN | D_UP | D_LEFT | D_RIGHT) + jp z, .done + ld a, d + bit D_DOWN_F, a + jp nz, .moveDown + bit D_UP_F, a + jp nz, .moveUp + bit D_LEFT_F, a + jp nz, .moveLeft + bit D_RIGHT_F, a + jr nz, .moveRight +.done: + ld a, $2a + ret +.moveRight: + ld a, [wPlayerLastMapX] + inc a + ld [wPlayerStandingMapX], a + call _CheckPlayerObjectCollision + jr c, .faceRight + call IsPlayerCollisionTileSolid + jr nc, .canMoveRight + jr .faceRight +.canMoveRight + ld a, [wPlayerState] + cp PLAYER_BIKE + ld a, $0f + ret z + ld a, $0b + ret +.faceRight: + ld a, $03 + ret + +.moveLeft: + ld a, [wPlayerLastMapX] + dec a + ld [wPlayerStandingMapX], a + call _CheckPlayerObjectCollision + jr c, .faceLeft + call IsPlayerCollisionTileSolid + jr nc, .canMoveLeft + jr .faceLeft +.canMoveLeft + ld a, [wPlayerState] + cp PLAYER_BIKE + ld a, $0e + ret z + ld a, $0a + ret +.faceLeft: + ld a, $02 + ret + +.moveDown: + ld a, [wPlayerLastMapY] + inc a + ld [wPlayerStandingMapY], a + call _CheckPlayerObjectCollision + jr c, .faceDown + call IsPlayerCollisionTileSolid + jr nc, .canMoveDown + cp OLD_COLLISION_LEDGE + jr nz, .faceDown +.jumpDown: + ld a, $18 + ret +.canMoveDown + ld a, [wPlayerState] + cp PLAYER_BIKE + ld a, $0c + ret z + ld a, $08 + ret +.faceDown: + ld a, $00 + ret + +.moveUp: + ld a, [wPlayerLastMapY] + dec a + ld [wPlayerStandingMapY], a + call _CheckPlayerObjectCollision + jr c, .faceUp + call IsPlayerCollisionTileSolid + jr nc, .canMoveUp + jr .faceUp +.canMoveUp + ld a, [wPlayerState] + cp PLAYER_BIKE + ld a, $0d + ret z + ld a, $09 + ret +.faceUp: + ld a, $01 + ret + +CheckMovementDebug:: + ld a, d + call _CheckMovementDebug + jp _SetPlayerAnimation + +_CheckMovementDebug: + bit D_DOWN_F, a + jr nz, .moveDown + bit D_UP_F, a + jr nz, .moveUp + bit D_LEFT_F, a + jr nz, .moveLeft + bit D_RIGHT_F, a + jr nz, .moveRight +.idle: + ld a, $2a + ret +.moveDown: + ld a, [wTileDown] + cp $ff + ld a, $0c + ret nz + ld a, $19 + ret +.moveUp: + ld a, [wTileUp] + cp $ff + ld a, $0d + ret nz + ld a, $18 + ret +.moveLeft: + ld a, [wTileLeft] + cp $ff + ld a, $0e + ret nz + ld a, $1b + ret +.moveRight: + ld a, [wTileRight] + cp $ff + ld a, $0f + ret nz + ld a, $1a + ret + +OldCheckMovementSkateboard:: + call _OldCheckMovementSkateboard + jp _SetPlayerAnimation + +_OldCheckMovementSkateboard: + ld a, [wSkatingDirection] + cp $ff + jp z, .skateStand + push de + ld e, a + ld d, $00 + ld hl, .skateMovementTable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + pop de + jp hl +.skateMovementTable: + dw .skateDown + dw .skateUp + dw .skateLeft + dw .skateRight + +.skateStand: + ld a, d + and (D_DOWN | D_UP | D_LEFT | D_RIGHT) + jp z, .done + bit D_DOWN_F, d + jp nz, .skateDown + bit D_UP_F, d + jp nz, .skateUp + bit D_LEFT_F, d + jp nz, .skateLeft + bit D_RIGHT_F, d + jp nz, .skateRight +.done: + ld a, $ff + ld [wSkatingDirection], a + ld a, $2a + ret + +.skateDown: + ld a, [wPlayerLastMapY] + inc a + ld [wPlayerStandingMapY], a + ld a, $00 + ld [wSkatingDirection], a + call _CheckPlayerObjectCollision + jr c, .skateDownCollision + call IsPlayerCollisionTileSolid + jr nc, .canSkateDown + cp OLD_COLLISION_LEDGE + jr z, .skateJumpDown + cp (OLD_COLLISION_ROCK | COLLISION_FLAG) + jr nz, .skateDownCollision +.skateJumpDown: + ld a, $1c + ret +.canSkateDown: + call OldIsTileCollisionGrass + jr z, .skateDownSlowly + ld a, $0c + ret +.skateDownSlowly: + ld a, $08 + ret +.skateDownCollision: + ld a, $ff + ld [wSkatingDirection], a + ld a, $00 + ret + +.skateUp: + ld a, [wPlayerLastMapY] + dec a + ld [wPlayerStandingMapY], a + ld a, $01 + ld [wSkatingDirection], a + call _CheckPlayerObjectCollision + jr c, .skateUpCollision + call IsPlayerCollisionTileSolid + jr nc, .canSkateUp + cp $59 + jr nz, .skateUpCollision +.skateJumpUp: + ld a, $1d + ret +.canSkateUp: + call OldIsTileCollisionGrass + jr z, .skateUpSlowly + ld a, $0d + ret +.skateUpSlowly: + ld a, $09 + ret +.skateUpCollision: + ld a, $ff + ld [wSkatingDirection], a + ld a, $01 + ret + +.skateLeft: + ld a, [wPlayerLastMapX] + dec a + ld [wPlayerStandingMapX], a + ld a, $02 + ld [wSkatingDirection], a + call _CheckPlayerObjectCollision + jr c, .skateLeftCollision + call IsPlayerCollisionTileSolid + jr nc, .canSkateLeft + cp $59 + jr nz, .skateLeftCollision +.skateJumpLeft: + ld a, $1e + ret +.canSkateLeft: + call OldIsTileCollisionGrass + jr z, .skateLeftSlowly + ld a, $0e + ret +.skateLeftSlowly: + ld a, $0a + ret +.skateLeftCollision: + ld a, $ff + ld [wSkatingDirection], a + ld a, $02 + ret + +.skateRight: + ld a, [wPlayerLastMapX] + inc a + ld [wPlayerStandingMapX], a + ld a, $03 + ld [wSkatingDirection], a + call _CheckPlayerObjectCollision + jr c, .skateRightCollision + call IsPlayerCollisionTileSolid + jr nc, .canSkateRight + cp $59 + jr nz, .skateRightCollision +.skateJumpRight: + ld a, $1f + ret +.canSkateRight: + call OldIsTileCollisionGrass + jr z, .skateRightSlowly + ld a, $0f + ret +.skateRightSlowly: + ld a, $0b + ret +.skateRightCollision: + ld a, $ff + ld [wSkatingDirection], a + ld a, $03 + ret + +OldIsTileCollisionGrass:: +; Check whether collision ID in a is +; grass +; Result: +; nz - not grass +; z - grass + cp $82 + ret z + cp $83 + ret z + cp $8a + ret z + cp $8b + ret + +OldCheckMovementSurf:: + call _OldCheckMovementSurf + jp _SetPlayerAnimation + +_OldCheckMovementSurf: + ld a, d + and (D_DOWN | D_UP | D_LEFT | D_RIGHT) + bit D_DOWN_F, a + jp nz, .trySurfDown + bit D_UP_F, a + jp nz, .trySurfUp + bit D_LEFT_F, a + jp nz, .trySurfLeft + bit D_RIGHT_F, a + jr nz, .trySurfRight +.idle: + ld a, $2a + ret + +.trySurfDown: + ld a, [wPlayerLastMapY] + inc a + ld [wPlayerStandingMapY], a + call _CheckPlayerObjectCollision + jr c, .faceDown + 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. + call OldIsTileCollisionWater + jr c, .faceDown +.surfDown: + ld a, $08 + ret +.faceDown: + ld a, $00 + ret +.surfDownLand: + call SetPlayerStateWalk + ld a, $04 + ret + +.trySurfUp: + ld a, [wPlayerLastMapY] + dec a + ld [wPlayerStandingMapY], a + call _CheckPlayerObjectCollision + jr c, .faceUp + 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. + call OldIsTileCollisionWater + jr c, .faceUp +.surfUp: + ld a, $09 + ret +.faceUp: + ld a, $01 + ret +.surfUpLand: + call SetPlayerStateWalk + ld a, $05 + ret + +.trySurfLeft: + ld a, [wPlayerLastMapX] + dec a + ld [wPlayerStandingMapX], a + call _CheckPlayerObjectCollision + jr c, .faceLeft + 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. + call OldIsTileCollisionWater + jr c, .faceLeft +.surfLeft: + ld a, $0a + ret +.faceLeft: + ld a, $02 + ret +.surfLeftLand + call SetPlayerStateWalk + ld a, $06 + ret + +.trySurfRight + ld a, [wPlayerLastMapX] + inc a + ld [wPlayerStandingMapX], a + call _CheckPlayerObjectCollision + jr c, .faceRight + call IsPlayerCollisionTileSolid + jr nc, .surfRightLand ; 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 + ret +.faceRight: + ld a, $03 + ret +.surfRightLand + call SetPlayerStateWalk + ld a, $07 + ret + +OldIsTileCollisionWater:: ; c2ee (3:42ee) +; Check if collision ID in a is water +; Input: +; a - collision ID +; Result: +; c - water +; nc - not water + and COLLISION_TYPE_MASK + cp OLD_COLLISION_TYPE_WATER + ret z + cp OLD_COLLISION_TYPE_WATER2 + ret z + scf + ret + +SetPlayerStateWalk:: + push bc + ld a, PLAYER_NORMAL + ld [wPlayerState], a + call RedrawPlayerSprite + pop bc + ret + +IsPlayerCollisionTileSolid:: +; Return whether the collision under player's feet +; is solid/sometimes solid or non-solid. +; Clobbers: a +; Results: +; a - collision ID under player's feet +; nc - non-solid +; c - solid/sometimes solid + push de + ld bc, wPlayerStruct + ld hl, $775a + ld a, $01 + call FarCall_hl + ld a, e + pop de + ret + +_CheckPlayerObjectCollision:: +; 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 + pop de + ret nc + jp _CheckCompanionObjectCollision + +_CheckCompanionObjectCollision:: +; Marks the object struct pointed to by hl +; as having collided with player object. +; If object struct (as identified by hEventID) +; is companion, cancel collision on 5th frames. +; Result: +; nc - no collision +; c - collision + ld hl, (wPlayerFlags + 1) - wPlayerStruct + add hl, bc + set 1, [hl] ; mark object as having collided with player + ldh a, [hEventID] + cp $02 + jr z, .isCompanion + xor a + ld [wCompanionCollisionFrameCounter], a + scf + ret +.isCompanion + ld a, [wCompanionCollisionFrameCounter] + inc a + cp $05 + ld [wCompanionCollisionFrameCounter], a + jr z, .cancelCollision + scf + ret +.cancelCollision + xor a + ld [wCompanionCollisionFrameCounter], a + ret + +_OverworldMovementCheck:: + ld a, $01 + ldh [hEventCollisionException], a + ld a, [wPlayerDirection] + and a + jp z, _SetPlayerIdle + ldh a, [hJoyState] + ld d, a + ld hl, wce63 + bit 1, [hl] + jr z, .skip_debug_move + bit B_BUTTON_F, d + jp nz, CheckMovementDebug +.skip_debug_move + call .checkMovementRelease + jp _SetPlayerAnimation + +.checkMovementRelease: + ld a, [wPlayerState] + cp PLAYER_SKATE + jp z, OldCheckMovementSkateboard ; FIXME: OldCheckMovementSkateboard already calls _SetPlayerAnimation + ; The skateboard doesn't work, because it uses the current + ; coordinate as player animation. + cp PLAYER_SURF + jp z, CheckMovementSurf + jp CheckMovementWalk + +CheckMovementWalk:: + ld a, [wPlayerStandingTile] + swap a + and LOW((COLLISION_TYPE_MASK >> 4) | (COLLISION_TYPE_MASK << 4)) + ld hl, .walkingCollisionTable + jp CallJumptable + +.walkingCollisionTable: + dw CheckMovementWalkRegular ; regular + dw CheckMovementWalkSolid ; trees, grass, etc. + dw CheckMovementWalkSolid ; water + dw CheckMovementWalkSolid ; water current + dw CheckMovementWalkLand ; slowdown and fixed movement + dw CheckMovementWalkLand2 ; fixed movement + dw CheckMovementWalkRegular ; ??? + dw CheckMovementWalkWarp ; warps + dw CheckMovementWalkMisc ; ??? + dw CheckMovementWalkSpecial ; counters, signposts, book cases + dw CheckMovementWalkJump ; jumps + dw CheckMovementWalkRegular ; unused -- movement prohibit not yet implemented + dw CheckMovementWalkRegular ; unused + dw CheckMovementWalkRegular ; unused + dw CheckMovementWalkRegular ; unused + dw CheckMovementWalkRegular ; unused + +_MovementDone: + ld a, $2a + ret + +CheckMovementWalkSolid:: + jp CheckMovementWalkRegular + +CheckMovementWalkLand:: + ld a, [wPlayerStandingTile] + and COLLISION_SUBTYPE_MASK + jr nz, .slowdown + call CheckMovementWalkRegular + call .slowMovementDown + ret +.slowdown + ld b, $08 + cp (COLLISION_LAND_S & COLLISION_SUBTYPE_MASK) + jr z, .slowdownDone + ld b, $09 + cp (COLLISION_LAND_N & COLLISION_SUBTYPE_MASK) + jr z, .slowdownDone + ld b, $0a + cp (COLLISION_LAND_W & COLLISION_SUBTYPE_MASK) + jr z, .slowdownDone + ld b, $0b + cp (COLLISION_LAND_E & COLLISION_SUBTYPE_MASK) + jr z, .slowdownDone + ; fall-through --> map other codes to COLLISION_LAND_E +.slowdownDone + 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 + ld a, b + ret + +CheckMovementWalkLand2:: + ld a, [wPlayerStandingTile] + and COLLISION_SUBTYPE_MASK + ld b, $08 + cp (COLLISION_LAND2_S & COLLISION_SUBTYPE_MASK) + jr z, .done + ld b, $09 + cp (COLLISION_LAND2_N & COLLISION_SUBTYPE_MASK) + jr z, .done + ld b, $0a + cp (COLLISION_LAND2_W & COLLISION_SUBTYPE_MASK) + jr z, .done + ld b, $0b + cp (COLLISION_LAND2_E & COLLISION_SUBTYPE_MASK) + jr z, .done + ; fall-through --> map other codes to COLLISION_LAND2_E +.done + ld a, b + ret + +UnusedCheckMovementWalk60:: + jp CheckMovementWalkRegular + +CheckMovementWalkWarp:: + ld a, [wPlayerStandingTile] + and COLLISION_SUBTYPE_MASK + jr z, .exitWarpDpadDirection + cp $01 + jr z, .exitWarpDownNoBoundsCheck + ld a, [wPlayerStandingTile] + cp $7a + jr z, .exitWarpDownNoBoundsCheck + jp CheckMovementWalkRegular +.exitWarpDownNoBoundsCheck + ld a, $08 + ret +.exitWarpDpadDirection + ldh a, [hJoyState] + bit D_DOWN_F, a + jr nz, .exitWarpDown + bit D_UP_F, a + jr nz, .exitWarpUp + bit D_LEFT_F, a + jr nz, .exitWarpLeft + bit D_RIGHT_F, a + jr nz, .exitWarpRight + jp _MovementDone +.exitWarpDown + ld a, [wTileDown] + cp $ff + jp nz, CheckMovementWalkRegular + call z, _ReportMovementOutOfBounds +.faceDown: + ld a, $00 + ret +.exitWarpUp + ld a, [wTileUp] + cp $ff + jp nz, CheckMovementWalkRegular + call z, _ReportMovementOutOfBounds +.faceUp: + ld a, $01 + ret +.exitWarpLeft + ld a, [wTileLeft] + cp $ff + jp nz, CheckMovementWalkRegular + call z, _ReportMovementOutOfBounds +.faceLeft: + ld a, $02 + ret +.exitWarpRight + ld a, [wTileRight] + cp $ff + jp nz, CheckMovementWalkRegular + call z, _ReportMovementOutOfBounds +.faceRight: + ld a, $03 + ret + +_ReportMovementOutOfBounds:: + ret + +CheckMovementWalkMisc:: + jp CheckMovementWalkRegular + +CheckMovementWalkSpecial:: + jp CheckMovementWalkRegular + +CheckMovementWalkRegular:: + ldh a, [hJoyState] + bit D_DOWN_F, a + jp nz, TryWalkDown + bit D_UP_F, a + jp nz, TryWalkUp + bit D_LEFT_F, a + jp nz, TryWalkLeft + bit D_RIGHT_F, a + jp nz, TryWalkRight + jp _MovementDone + +CheckMovementWalkJump: + ldh a, [hJoyState] + bit D_DOWN_F, a + jr nz, .checkJumpDown + bit D_UP_F, a + jr nz, .checkJumpUp + bit D_LEFT_F, a + jr nz, .checkJumpLeft + bit D_RIGHT_F, a + jr nz, .checkJumpRight + jp _MovementDone +.checkJumpDown: + ld a, [wPlayerStandingTile] + and COLLISION_SUBTYPE_MASK + cp (COLLISION_JUMP_S & COLLISION_SUBTYPE_MASK) + jr z, .jumpDown + cp (COLLISION_JUMP_SE & COLLISION_SUBTYPE_MASK) + jr z, .jumpDown + cp (COLLISION_JUMP_SW & COLLISION_SUBTYPE_MASK) + jr z, .jumpDown + jp TryWalkDown +.jumpDown: + ld a, $18 + ret +.checkJumpUp: + ld a, [wPlayerStandingTile] + and COLLISION_SUBTYPE_MASK + cp (COLLISION_JUMP_N & COLLISION_SUBTYPE_MASK) + jr z, .jumpUp + cp (COLLISION_JUMP_NE & COLLISION_SUBTYPE_MASK) + jr z, .jumpUp + cp (COLLISION_JUMP_NW & COLLISION_SUBTYPE_MASK) + jr z, .jumpUp + jp TryWalkUp +.jumpUp: + ld a, $19 + ret +.checkJumpLeft: + ld a, [wPlayerStandingTile] + and COLLISION_SUBTYPE_MASK + cp (COLLISION_JUMP_W & COLLISION_SUBTYPE_MASK) + jr z, .jumpLeft + cp (COLLISION_JUMP_SW & COLLISION_SUBTYPE_MASK) + jr z, .jumpLeft + cp (COLLISION_JUMP_NW & COLLISION_SUBTYPE_MASK) + jr z, .jumpLeft + jp TryWalkLeft +.jumpLeft: + ld a, $1a + ret +.checkJumpRight + ld a, [wPlayerStandingTile] + and COLLISION_SUBTYPE_MASK + cp (COLLISION_JUMP_E & COLLISION_SUBTYPE_MASK) + jr z, .jumpRight + cp (COLLISION_JUMP_SE & COLLISION_SUBTYPE_MASK) + jr z, .jumpRight + cp (COLLISION_JUMP_NE & COLLISION_SUBTYPE_MASK) + jr z, .jumpRight + jp TryWalkRight +.jumpRight + ld a, $1b + ret + +TryWalkDown:: + ld d, 0 + ld e, 1 + call _CheckObjectCollision + jr c, .faceDown + ld a, [wTileDown] + call CheckCollisionSolid + jr c, .faceDown +.moveDown: + ld a, $08 + ret +.faceDown: + ld a, $00 + ret + +TryWalkUp:: + ld d, 0 + ld e, -1 + call _CheckObjectCollision + jr c, .faceUp + ld a, [wTileUp] + call CheckCollisionSolid + jr c, .faceUp +.moveUp: + ld a, $09 + ret +.faceUp: + ld a, $01 + ret + +TryWalkLeft:: + ld d, -1 + ld e, 0 + call _CheckObjectCollision + jr c, .faceLeft + ld a, [wTileLeft] + call CheckCollisionSolid + jr c, .faceLeft +.moveLeft: + ld a, $0a + ret +.faceLeft: + ld a, $02 + ret + +TryWalkRight:: + ld d, 1 + ld e, 0 + call _CheckObjectCollision + jr c, .faceRight + ld a, [wTileRight] + call CheckCollisionSolid + jr c, .faceRight +.moveRight: + ld a, $0b + ret +.faceRight: + ld a, $03 + ret + +CheckMovementSurf:: + ld a, [wPlayerStandingTile] + swap a + and LOW((COLLISION_TYPE_MASK >> 4) | (COLLISION_TYPE_MASK << 4)) + ld hl, .surfCollisionTable + jp CallJumptable + +.surfCollisionTable + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfWater + dw CheckMovementSurfWater2 + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + dw CheckMovementSurfRegular + +CheckMovementSurfRegular:: + ldh a, [hJoyState] + bit D_DOWN_F, a + jp nz, TrySurfDown + bit D_UP_F, a + jp nz, TrySurfUp + bit D_LEFT_F, a + jp nz, TrySurfLeft + bit D_RIGHT_F, a + jp nz, TrySurfRight + jp _MovementDone + +CheckMovementSurfWater:: + ld a, [wPlayerStandingTile] + and COLLISION_SUBTYPE_MASK + cp (COLLISION_WATERFALL & COLLISION_SUBTYPE_MASK) + jr nz, CheckMovementSurfRegular +.waterfall: + ld a, $0c + ret + +CheckMovementSurfWater2:: + ld a, [wPlayerStandingTile] + and COLLISION_WATER_SUBTYPE_MASK + ld d, $0b + jr z, .done ; COLLISION_WATER2_E + ld d, $0a + cp (COLLISION_WATER2_W & COLLISION_WATER_SUBTYPE_MASK) + jr z, .done + ld d, $09 + cp (COLLISION_WATER2_N & COLLISION_WATER_SUBTYPE_MASK) + jr z, .done + ld d, $08 + cp (COLLISION_WATER2_S & COLLISION_WATER_SUBTYPE_MASK) + jr z, .done + ; fall-through --> no aliasing due to mask +.done + ld a, d + ret + +TrySurfDown: + ld d, 0 + ld e, 1 + call _CheckObjectCollision + jr c, .faceDown + ld a, [wTileDown] + call CheckCollisionSometimesSolid + jr c, .faceDown ; 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 + ret +.faceDown: + ld a, $00 + ret + +TrySurfUp: + ld d, 0 + ld e, -1 + call _CheckObjectCollision + jr c, .faceUp + ld a, [wTileUp] + call CheckCollisionSometimesSolid + jr c, .faceUp ; 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 + ret +.faceUp: + ld a, $01 + ret + +TrySurfLeft: + ld d, -1 + ld e, 0 + call _CheckObjectCollision + jr c, .faceLeft + ld a, [wTileLeft] + call CheckCollisionSometimesSolid + jr c, .faceLeft ; 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 + ret +.faceLeft: + ld a, $02 + ret + +TrySurfRight: + ld d, 1 + ld e, 0 + call _CheckObjectCollision + jr c, .faceRight + ld a, [wTileRight] + call CheckCollisionSometimesSolid + jr c, .faceRight ; 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 + ret +.faceRight: + ld a, $03 + ret +SurfDismount: + jp SetPlayerStateWalk + +_CheckObjectCollision:: +; Check if coordinates relative +; to player collide with another object +; Clobbers: +; a, hl +; Input: +; de - Relative coords x, y +; Output: +; nc - no collision +; c - collision +; hEventID - Event ID of colliding event + ld a, $01 + ldh [hEventCollisionException], a + ld a, [wPlayerStandingMapX] + add d + ld d, a + ld a, [wPlayerStandingMapY] + add e + ld e, a + ld hl, $77dd + ld a, $01 + call FarCall_hl + ret nc + jp _CheckCompanionObjectCollision + +CheckCollisionSolid:: +; Checks whether collision ID in a +; is solid or not. +; Clobbers: +; hl +; Input: +; a - collision ID +; Result: +; a - collision type +; c - solid +; nc - not solid + call GetCollisionType + and a + ret z + scf + ret + +GetCollisionType:: +; Get collision type for collision ID in a +; Clobbers: hl +; Input: +; a - collision ID +; Result: +; a - collision type +; 00 - not solid +; 01 - sometimes solid (cut tree, water etc.) +; 0F - always solid + push de + ld hl, .collisionTypeTable + ld e, a + ld d, $00 + add hl, de + ld a, [hl] + pop de + ret + +.collisionTypeTable: +INCBIN "data/collision/collision_type_table.bin" + +_UnusedReturnFalse:: + xor a + ret + +_UnusedReturnTrue:: + xor a + scf + ret + +CheckCollisionSometimesSolid:: +; Checks whether collision ID in a +; is sometimes, always or never solid. +; Clobbers: +; hl +; Input: +; a - collision ID +; Result: +; c - always solid +; nc - sometimes not solid, check a +; a - result +; 00 - sometimes solid +; 01 - never solid + call GetCollisionType + cp $01 + jr z, .sometimesSolid + and a + jr z, .solid + jr .alwaysSolid +.sometimesSolid: + xor a + ret +.solid: + ld a, $01 + and a + ret +.alwaysSolid: + scf + ret diff --git a/home/map.asm b/home/map.asm index 8105781..8c03d9f 100644 --- a/home/map.asm +++ b/home/map.asm @@ -1679,7 +1679,7 @@ Function2b87:: call GetJoypad call OverworldStartButtonCheck ret nz - callab Functionc000 + callab OverworldMovementCheck call Function2ba8 jr nc, .asm_2b87 callba Function824c diff --git a/shim.sym b/shim.sym index 8390904..da80057 100644 --- a/shim.sym +++ b/shim.sym @@ -58,7 +58,6 @@ 02:528B Function928b 02:5695 CheckSGB -03:4000 Functionc000 03:47D5 SpawnPoints 03:488D Tilesets 03:54E6 Functiond4e6 diff --git a/wram.asm b/wram.asm index b196ac4..62a4a23 100644 --- a/wram.asm +++ b/wram.asm @@ -343,7 +343,10 @@ wMovementBufferObject:: db ; cc3b wMovementBuffer:: ; cc3f ds 55 -SECTION "CC9C", WRAM0[$CC9C] +SECTION "CC9A", WRAM0[$CC9A] + +wSkatingDirection:: db ; cc9a +wCompanionCollisionFrameCounter:: db ; cc9b wUnknownWordcc9c:: ; cc9c dw @@ -735,6 +738,10 @@ wRivalsName:: ds 6 ; d258 SECTION "PlayerState", WRAM0[$D264] wPlayerState:: db ; d264 +; 00 - walking +; 01 - bicycle +; 02 - skateboard +; 04 - surfing SECTION "D4AB", WRAM0[$D4A9] -- cgit v1.2.3 From 3c966f7df4170f58f8274f444977c5a29225d9be Mon Sep 17 00:00:00 2001 From: Pokeglitch Date: Mon, 25 Jun 2018 22:43:31 -0400 Subject: Disassembled all routines related to sprite movement/collisions. Added in constants --- constants.asm | 1 + constants/collision_constants.asm | 4 + constants/map_object_constants.asm | 4 + constants/metatile_constants.asm | 1 - constants/movement_constants.asm | 44 ++ constants/sprite_constants.asm | 2 + data/sprites/sprites.asm | 102 --- engine/overworld/object_collision.asm | 157 +++++ engine/overworld/player_movement.asm | 1123 ++++++++++++++++++--------------- engine/sprites/sprites.asm | 155 +++++ home/copy2.asm | 2 +- home/map.asm | 16 +- home/map_objects.asm | 26 +- home/tileset.asm | 20 +- hram.asm | 12 +- macros/wram.asm | 4 +- shim.sym | 2 - wram.asm | 5 +- 18 files changed, 1029 insertions(+), 651 deletions(-) create mode 100755 constants/movement_constants.asm delete mode 100644 data/sprites/sprites.asm create mode 100755 engine/overworld/object_collision.asm create mode 100644 engine/sprites/sprites.asm 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/data/sprites/sprites.asm b/data/sprites/sprites.asm deleted file mode 100644 index b901b7a..0000000 --- a/data/sprites/sprites.asm +++ /dev/null @@ -1,102 +0,0 @@ -INCLUDE "constants.asm" - -SECTION "OverworldSprites", ROMX[$423B], BANK[$05] - -overworld_sprite: MACRO -; pointer, length, bank - dw \1 - db \2 tiles, BANK(\1) -ENDM - -OverworldSprites:: - overworld_sprite GoldSpriteGFX, 12 - overworld_sprite GoldBikeSpriteGFX, 12 - overworld_sprite GoldSkateboardSpriteGFX, 12 - overworld_sprite SilverSpriteGFX, 12 - overworld_sprite OkidoSpriteGFX, 12 - overworld_sprite RedSpriteGFX, 12 - overworld_sprite BlueSpriteGFX, 12 - overworld_sprite MasakiSpriteGFX, 12 - overworld_sprite ElderSpriteGFX, 12 - overworld_sprite SakakiSpriteGFX, 12 - overworld_sprite GantetsuSpriteGFX, 12 - overworld_sprite MomSpriteGFX, 12 - overworld_sprite SilversMomSpriteGFX, 12 - overworld_sprite RedsMomSpriteGFX, 12 - overworld_sprite RedsMomSpriteGFX, 12 - overworld_sprite NanamiSpriteGFX, 12 - overworld_sprite EvilOkidoSpriteGFX, 12 - overworld_sprite KikukoSpriteGFX, 12 - overworld_sprite HayatoSpriteGFX, 12 - overworld_sprite TsukushiSpriteGFX, 12 - overworld_sprite TsukushiSpriteGFX, 12 - overworld_sprite EnokiSpriteGFX, 12 - overworld_sprite MikanSpriteGFX, 12 - overworld_sprite MikanSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerMSpriteGFX, 12 - overworld_sprite CooltrainerFSpriteGFX, 12 - overworld_sprite BugCatcherBoySpriteGFX, 12 - overworld_sprite TwinSpriteGFX, 12 - overworld_sprite YoungsterSpriteGFX, 12 - overworld_sprite LassSpriteGFX, 12 - overworld_sprite TeacherSpriteGFX, 12 - overworld_sprite GirlSpriteGFX, 12 - overworld_sprite SuperNerdSpriteGFX, 12 - overworld_sprite RockerSpriteGFX, 12 - overworld_sprite PokefanMSpriteGFX, 12 - overworld_sprite PokefanFSpriteGFX, 12 - overworld_sprite GrampsSpriteGFX, 12 - overworld_sprite GrannySpriteGFX, 12 - overworld_sprite SwimmerMSpriteGFX, 12 - overworld_sprite SwimmerFSpriteGFX, 12 - overworld_sprite RocketMSpriteGFX, 12 - overworld_sprite RocketMSpriteGFX, 12 - overworld_sprite RocketMSpriteGFX, 12 - overworld_sprite RocketFSpriteGFX, 12 - overworld_sprite NurseSpriteGFX, 12 - overworld_sprite LinkReceptionistSpriteGFX, 12 - overworld_sprite ClerkSpriteGFX, 12 - overworld_sprite FisherSpriteGFX, 12 - overworld_sprite FishingGuruSpriteGFX, 12 - overworld_sprite ScientistSpriteGFX, 12 - overworld_sprite MediumSpriteGFX, 12 - overworld_sprite SageSpriteGFX, 12 - overworld_sprite FrowningManSpriteGFX, 12 - overworld_sprite GentlemanSpriteGFX, 12 - overworld_sprite BlackbeltSpriteGFX, 12 - overworld_sprite ReceptionistSpriteGFX, 12 - overworld_sprite OfficerSpriteGFX, 12 - overworld_sprite CaptainSpriteGFX, 12 - overworld_sprite CaptainSpriteGFX, 12 - overworld_sprite CaptainSpriteGFX, 12 - overworld_sprite MohawkSpriteGFX, 12 - overworld_sprite GymGuySpriteGFX, 12 - overworld_sprite SailorSpriteGFX, 12 - overworld_sprite HelmetSpriteGFX, 12 - overworld_sprite BurglarSpriteGFX, 12 - overworld_sprite SidonSpriteGFX, 12 - overworld_sprite PippiSpriteGFX, 12 - overworld_sprite PoppoSpriteGFX, 12 - overworld_sprite LizardonSpriteGFX, 12 - overworld_sprite KabigonSpriteGFX, 4 - overworld_sprite PawouSpriteGFX, 12 - overworld_sprite NyorobonSpriteGFX, 12 - overworld_sprite LaplaceSpriteGFX, 12 - overworld_sprite PokeBallSpriteGFX, 4 - overworld_sprite PokedexSpriteGFX, 4 - overworld_sprite PaperSpriteGFX, 4 - overworld_sprite OldLinkReceptionistSpriteGFX, 4 - overworld_sprite OldLinkReceptionistSpriteGFX, 4 - overworld_sprite EggSpriteGFX, 4 - overworld_sprite BoulderSpriteGFX, 4 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/engine/sprites/sprites.asm b/engine/sprites/sprites.asm new file mode 100644 index 0000000..a1dc401 --- /dev/null +++ b/engine/sprites/sprites.asm @@ -0,0 +1,155 @@ +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 +; pointer, length, bank + dw \1 + db \2 tiles, BANK(\1) +ENDM + +OverworldSprites:: + overworld_sprite GoldSpriteGFX, 12 + overworld_sprite GoldBikeSpriteGFX, 12 + overworld_sprite GoldSkateboardSpriteGFX, 12 + overworld_sprite SilverSpriteGFX, 12 + overworld_sprite OkidoSpriteGFX, 12 + overworld_sprite RedSpriteGFX, 12 + overworld_sprite BlueSpriteGFX, 12 + overworld_sprite MasakiSpriteGFX, 12 + overworld_sprite ElderSpriteGFX, 12 + overworld_sprite SakakiSpriteGFX, 12 + overworld_sprite GantetsuSpriteGFX, 12 + overworld_sprite MomSpriteGFX, 12 + overworld_sprite SilversMomSpriteGFX, 12 + overworld_sprite RedsMomSpriteGFX, 12 + overworld_sprite RedsMomSpriteGFX, 12 + overworld_sprite NanamiSpriteGFX, 12 + overworld_sprite EvilOkidoSpriteGFX, 12 + overworld_sprite KikukoSpriteGFX, 12 + overworld_sprite HayatoSpriteGFX, 12 + overworld_sprite TsukushiSpriteGFX, 12 + overworld_sprite TsukushiSpriteGFX, 12 + overworld_sprite EnokiSpriteGFX, 12 + overworld_sprite MikanSpriteGFX, 12 + overworld_sprite MikanSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerMSpriteGFX, 12 + overworld_sprite CooltrainerFSpriteGFX, 12 + overworld_sprite BugCatcherBoySpriteGFX, 12 + overworld_sprite TwinSpriteGFX, 12 + overworld_sprite YoungsterSpriteGFX, 12 + overworld_sprite LassSpriteGFX, 12 + overworld_sprite TeacherSpriteGFX, 12 + overworld_sprite GirlSpriteGFX, 12 + overworld_sprite SuperNerdSpriteGFX, 12 + overworld_sprite RockerSpriteGFX, 12 + overworld_sprite PokefanMSpriteGFX, 12 + overworld_sprite PokefanFSpriteGFX, 12 + overworld_sprite GrampsSpriteGFX, 12 + overworld_sprite GrannySpriteGFX, 12 + overworld_sprite SwimmerMSpriteGFX, 12 + overworld_sprite SwimmerFSpriteGFX, 12 + overworld_sprite RocketMSpriteGFX, 12 + overworld_sprite RocketMSpriteGFX, 12 + overworld_sprite RocketMSpriteGFX, 12 + overworld_sprite RocketFSpriteGFX, 12 + overworld_sprite NurseSpriteGFX, 12 + overworld_sprite LinkReceptionistSpriteGFX, 12 + overworld_sprite ClerkSpriteGFX, 12 + overworld_sprite FisherSpriteGFX, 12 + overworld_sprite FishingGuruSpriteGFX, 12 + overworld_sprite ScientistSpriteGFX, 12 + overworld_sprite MediumSpriteGFX, 12 + overworld_sprite SageSpriteGFX, 12 + overworld_sprite FrowningManSpriteGFX, 12 + overworld_sprite GentlemanSpriteGFX, 12 + overworld_sprite BlackbeltSpriteGFX, 12 + overworld_sprite ReceptionistSpriteGFX, 12 + overworld_sprite OfficerSpriteGFX, 12 + overworld_sprite CaptainSpriteGFX, 12 + overworld_sprite CaptainSpriteGFX, 12 + overworld_sprite CaptainSpriteGFX, 12 + overworld_sprite MohawkSpriteGFX, 12 + overworld_sprite GymGuySpriteGFX, 12 + overworld_sprite SailorSpriteGFX, 12 + overworld_sprite HelmetSpriteGFX, 12 + overworld_sprite BurglarSpriteGFX, 12 + overworld_sprite SidonSpriteGFX, 12 + overworld_sprite PippiSpriteGFX, 12 + overworld_sprite PoppoSpriteGFX, 12 + overworld_sprite LizardonSpriteGFX, 12 + overworld_sprite KabigonSpriteGFX, 4 + overworld_sprite PawouSpriteGFX, 12 + overworld_sprite NyorobonSpriteGFX, 12 + overworld_sprite LaplaceSpriteGFX, 12 + overworld_sprite PokeBallSpriteGFX, 4 + overworld_sprite PokedexSpriteGFX, 4 + overworld_sprite PaperSpriteGFX, 4 + overworld_sprite OldLinkReceptionistSpriteGFX, 4 + overworld_sprite OldLinkReceptionistSpriteGFX, 4 + overworld_sprite EggSpriteGFX, 4 + overworld_sprite BoulderSpriteGFX, 4 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] diff --git a/hram.asm b/hram.asm index 9d8da3f..1803496 100644 --- a/hram.asm +++ b/hram.asm @@ -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 diff --git a/shim.sym b/shim.sym index da80057..104b756 100644 --- a/shim.sym +++ b/shim.sym @@ -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 diff --git a/wram.asm b/wram.asm index 62a4a23..999dac1 100644 --- a/wram.asm +++ b/wram.asm @@ -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 -- cgit v1.2.3 From 2dfc7fc635b13291588ba8aae65fd0ece7211799 Mon Sep 17 00:00:00 2001 From: Pokeglitch Date: Mon, 25 Jun 2018 22:55:48 -0400 Subject: Moved CollisionTypeTable to separate file --- data/collision/collision_type_table.asm | 69 ++++++++++++++++++++++++++++++++ data/collision/collision_type_table.bin | Bin 256 -> 0 bytes engine/overworld/player_movement.asm | 68 +------------------------------ 3 files changed, 71 insertions(+), 66 deletions(-) create mode 100755 data/collision/collision_type_table.asm delete mode 100644 data/collision/collision_type_table.bin diff --git a/data/collision/collision_type_table.asm b/data/collision/collision_type_table.asm new file mode 100755 index 0000000..aa53802 --- /dev/null +++ b/data/collision/collision_type_table.asm @@ -0,0 +1,69 @@ +INCLUDE "constants.asm" + +SECTION "Collision Type Table", ROMX[$4664], BANK[$3] + +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 diff --git a/data/collision/collision_type_table.bin b/data/collision/collision_type_table.bin deleted file mode 100644 index c70e2bd..0000000 Binary files a/data/collision/collision_type_table.bin and /dev/null differ diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm index 0fcd6e9..f425e69 100644 --- a/engine/overworld/player_movement.asm +++ b/engine/overworld/player_movement.asm @@ -1080,72 +1080,8 @@ GetCollisionType:: pop de ret -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 - +SECTION "Rest of Player Movement", ROMX[$4764], BANK[$3] + _UnusedReturnFalse:: ; 03:4764 xor a ret -- cgit v1.2.3