diff options
author | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2020-03-28 10:11:45 +0800 |
---|---|---|
committer | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2020-03-28 10:11:45 +0800 |
commit | fd7abb3d73b69842723d073f0ad543cb38c77bf3 (patch) | |
tree | 0b5a58776e259662a0ed1383eabc4adb92b02e37 | |
parent | a473ca70a2ca5f3ca4a11a109533902c7605e7d4 (diff) |
bike
-rw-r--r-- | asm/bike.s | 897 | ||||
-rw-r--r-- | data/bike.s | 33 | ||||
-rw-r--r-- | include/bike.h | 28 | ||||
-rw-r--r-- | include/field_camera.h | 1 | ||||
-rw-r--r-- | include/field_player_avatar.h | 1 | ||||
-rw-r--r-- | include/metatile_behavior.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 4 | ||||
-rw-r--r-- | src/bike.c | 430 | ||||
-rw-r--r-- | src/field_camera.c | 4 | ||||
-rw-r--r-- | src/field_player_avatar.c | 2 | ||||
-rw-r--r-- | src/metatile_behavior.c | 2 |
11 files changed, 465 insertions, 939 deletions
diff --git a/asm/bike.s b/asm/bike.s deleted file mode 100644 index c8f65a03b..000000000 --- a/asm/bike.s +++ /dev/null @@ -1,897 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start MovePlayerOnBike -MovePlayerOnBike: @ 80BD09C - push {r4,lr} - sub sp, 0x4 - mov r3, sp - strb r0, [r3] - lsls r1, 16 - lsrs r1, 16 - lsls r2, 16 - lsrs r2, 16 - ldr r4, _080BD0D0 @ =gUnknown_83E7CFC - mov r0, sp - bl sub_80BD0D4 - lsls r0, 24 - lsrs r0, 22 - adds r0, r4 - mov r1, sp - ldrb r1, [r1] - ldr r2, [r0] - adds r0, r1, 0 - bl _call_via_r2 - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080BD0D0: .4byte gUnknown_83E7CFC - thumb_func_end MovePlayerOnBike - - thumb_func_start sub_80BD0D4 -sub_80BD0D4: @ 80BD0D4 - push {r4,lr} - lsls r1, 16 - lsrs r1, 16 - lsls r2, 16 - lsrs r2, 16 - ldr r4, _080BD0F8 @ =gUnknown_83E7D10 - ldr r3, _080BD0FC @ =gPlayerAvatar - ldrb r3, [r3, 0x8] - lsls r3, 2 - adds r3, r4 - ldr r3, [r3] - bl _call_via_r3 - lsls r0, 24 - lsrs r0, 24 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080BD0F8: .4byte gUnknown_83E7D10 -_080BD0FC: .4byte gPlayerAvatar - thumb_func_end sub_80BD0D4 - - thumb_func_start sub_80BD100 -sub_80BD100: @ 80BD100 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r6, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r10, r1 - lsls r2, 16 - lsrs r2, 16 - mov r9, r2 - ldr r5, _080BD15C @ =gPlayerAvatar - ldrb r0, [r5, 0x5] - lsls r4, r0, 3 - adds r4, r0 - lsls r4, 2 - ldr r0, _080BD160 @ =gObjectEvents - adds r4, r0 - bl GetPlayerMovementDirection - lsls r0, 24 - lsrs r7, r0, 24 - movs r0, 0 - mov r8, r0 - mov r0, r8 - strb r0, [r5, 0xA] - ldrb r0, [r4, 0x1E] - bl MetatileBehavior_IsCyclingRoadPullDownTile - cmp r0, 0x1 - bne _080BD176 - ldr r0, _080BD164 @ =gMain - ldrh r1, [r0, 0x2C] - movs r2, 0x2 - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080BD168 - strb r2, [r5, 0x8] - strb r2, [r5, 0x2] - ldrb r0, [r6] - cmp r0, 0x1 - bhi _080BD172 - movs r0, 0x3 - b _080BD1B6 - .align 2, 0 -_080BD15C: .4byte gPlayerAvatar -_080BD160: .4byte gObjectEvents -_080BD164: .4byte gMain -_080BD168: - ldrb r0, [r6] - cmp r0, 0 - beq _080BD17E - strb r2, [r5, 0x8] - strb r2, [r5, 0x2] -_080BD172: - movs r0, 0x4 - b _080BD1B6 -_080BD176: - ldrb r1, [r6] - adds r0, r1, 0 - cmp r0, 0 - bne _080BD18C -_080BD17E: - strb r7, [r6] - ldr r1, _080BD188 @ =gPlayerAvatar - movs r0, 0 - b _080BD1B4 - .align 2, 0 -_080BD188: .4byte gPlayerAvatar -_080BD18C: - cmp r0, r7 - beq _080BD1B0 - ldrb r0, [r5, 0x2] - cmp r0, 0x2 - beq _080BD1B0 - movs r0, 0x1 - strb r0, [r5, 0x8] - strb r1, [r5, 0x9] - mov r0, r8 - strb r0, [r5, 0x2] - adds r0, r6, 0 - mov r1, r10 - mov r2, r9 - bl sub_80BD0D4 - lsls r0, 24 - lsrs r0, 24 - b _080BD1B6 -_080BD1B0: - ldr r1, _080BD1C4 @ =gPlayerAvatar - movs r0, 0x2 -_080BD1B4: - strb r0, [r1, 0x2] -_080BD1B6: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080BD1C4: .4byte gPlayerAvatar - thumb_func_end sub_80BD100 - - thumb_func_start sub_80BD1C8 -sub_80BD1C8: @ 80BD1C8 - push {lr} - ldr r2, _080BD1E4 @ =gPlayerAvatar - ldrb r1, [r2, 0x9] - strb r1, [r0] - movs r1, 0 - movs r0, 0x1 - strb r0, [r2, 0x2] - strb r1, [r2, 0x8] - bl sub_80BD664 - movs r0, 0x1 - pop {r1} - bx r1 - .align 2, 0 -_080BD1E4: .4byte gPlayerAvatar - thumb_func_end sub_80BD1C8 - - thumb_func_start sub_80BD1E8 -sub_80BD1E8: @ 80BD1E8 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r6, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r9, r1 - lsls r2, 16 - lsrs r2, 16 - mov r8, r2 - bl GetPlayerMovementDirection - lsls r0, 24 - lsrs r5, r0, 24 - adds r7, r5, 0 - ldr r4, _080BD240 @ =gPlayerAvatar - ldrb r1, [r4, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080BD244 @ =gObjectEvents - adds r0, r1 - ldrb r0, [r0, 0x1E] - bl MetatileBehavior_IsCyclingRoadPullDownTile - adds r2, r0, 0 - cmp r2, 0x1 - bne _080BD25A - ldrb r1, [r6] - cmp r1, r5 - beq _080BD248 - movs r0, 0 - strb r2, [r4, 0x8] - strb r1, [r4, 0x9] - strb r0, [r4, 0x2] - adds r0, r6, 0 - mov r1, r9 - mov r2, r8 - bl sub_80BD0D4 - lsls r0, 24 - lsrs r0, 24 - b _080BD270 - .align 2, 0 -_080BD240: .4byte gPlayerAvatar -_080BD244: .4byte gObjectEvents -_080BD248: - movs r0, 0x2 - strb r0, [r4, 0x2] - strb r0, [r4, 0x8] - cmp r5, 0x1 - bhi _080BD256 - movs r0, 0x3 - b _080BD270 -_080BD256: - movs r0, 0x4 - b _080BD270 -_080BD25A: - movs r0, 0 - strb r0, [r4, 0x8] - ldrb r0, [r6] - cmp r0, 0 - beq _080BD26A - movs r0, 0x2 - strb r0, [r4, 0x2] - b _080BD270 -_080BD26A: - strb r7, [r6] - strb r0, [r4, 0x2] - movs r0, 0 -_080BD270: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80BD1E8 - - thumb_func_start sub_80BD27C -sub_80BD27C: @ 80BD27C - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl PlayerFaceDirection - pop {r0} - bx r0 - thumb_func_end sub_80BD27C - - thumb_func_start sub_80BD28C -sub_80BD28C: @ 80BD28C - push {r4,r5,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _080BD2C0 @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080BD2C4 @ =gObjectEvents - adds r5, r0, r1 - ldrb r1, [r5, 0x1E] - adds r0, r4, 0 - bl sub_80BD4F0 - lsls r0, 24 - cmp r0, 0 - bne _080BD2B2 - ldrb r0, [r5, 0x18] - lsrs r4, r0, 4 -_080BD2B2: - adds r0, r4, 0 - bl PlayerFaceDirection - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080BD2C0: .4byte gPlayerAvatar -_080BD2C4: .4byte gObjectEvents - thumb_func_end sub_80BD28C - - thumb_func_start sub_80BD2C8 -sub_80BD2C8: @ 80BD2C8 - push {r4-r6,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r6, r4, 0 - ldr r0, _080BD2F8 @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080BD2FC @ =gObjectEvents - adds r5, r0, r1 - ldrb r1, [r5, 0x1E] - adds r0, r4, 0 - bl sub_80BD4F0 - lsls r0, 24 - cmp r0, 0 - bne _080BD300 - ldrb r0, [r5, 0x18] - lsrs r0, 4 - bl sub_80BD27C - b _080BD350 - .align 2, 0 -_080BD2F8: .4byte gPlayerAvatar -_080BD2FC: .4byte gObjectEvents -_080BD300: - adds r0, r4, 0 - bl sub_80BD3A0 - lsls r0, 24 - lsrs r1, r0, 24 - movs r2, 0xFF - lsls r2, 24 - adds r0, r2 - lsrs r0, 24 - cmp r0, 0xA - bhi _080BD334 - cmp r1, 0x6 - bne _080BD322 - adds r0, r4, 0 - bl PlayerJumpLedge - b _080BD350 -_080BD322: - subs r0, r1, 0x5 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bls _080BD350 - adds r0, r4, 0 - bl PlayerOnBikeCollide - b _080BD350 -_080BD334: - cmp r1, 0xE - beq _080BD342 - adds r0, r4, 0 - bl PlayerIsMovingOnRockStairs - cmp r0, 0 - beq _080BD34A -_080BD342: - adds r0, r4, 0 - bl PlayerGoSpeed2 - b _080BD350 -_080BD34A: - adds r0, r6, 0 - bl PlayerRideWaterCurrent -_080BD350: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_80BD2C8 - - thumb_func_start sub_80BD358 -sub_80BD358: @ 80BD358 - push {lr} - movs r0, 0x1 - bl sub_80BD3A0 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _080BD370 - movs r0, 0x1 - bl sub_805C164 - b _080BD37A -_080BD370: - cmp r0, 0x6 - bne _080BD37A - movs r0, 0x1 - bl PlayerJumpLedge -_080BD37A: - pop {r0} - bx r0 - thumb_func_end sub_80BD358 - - thumb_func_start sub_80BD380 -sub_80BD380: @ 80BD380 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r4, 0 - bl sub_80BD3A0 - lsls r0, 24 - cmp r0, 0 - bne _080BD398 - adds r0, r4, 0 - bl PlayerGoSpeed1 -_080BD398: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80BD380 - - thumb_func_start sub_80BD3A0 -sub_80BD3A0: @ 80BD3A0 - push {r4-r6,lr} - sub sp, 0x8 - adds r6, r0, 0 - lsls r6, 24 - lsrs r6, 24 - ldr r0, _080BD404 @ =gPlayerAvatar - ldrb r0, [r0, 0x5] - lsls r4, r0, 3 - adds r4, r0 - lsls r4, 2 - ldr r0, _080BD408 @ =gObjectEvents - adds r4, r0 - ldrh r1, [r4, 0x10] - add r0, sp, 0x4 - strh r1, [r0] - ldrh r0, [r4, 0x12] - mov r5, sp - adds r5, 0x6 - strh r0, [r5] - adds r0, r6, 0 - add r1, sp, 0x4 - adds r2, r5, 0 - bl MoveCoords - add r0, sp, 0x4 - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r5, r2] - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - add r1, sp, 0x4 - movs r3, 0 - ldrsh r1, [r1, r3] - movs r3, 0 - ldrsh r2, [r5, r3] - str r0, [sp] - adds r0, r4, 0 - adds r3, r6, 0 - bl sub_80BD40C - lsls r0, 24 - lsrs r0, 24 - add sp, 0x8 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_080BD404: .4byte gPlayerAvatar -_080BD408: .4byte gObjectEvents - thumb_func_end sub_80BD3A0 - - thumb_func_start sub_80BD40C -sub_80BD40C: @ 80BD40C - push {r4-r6,lr} - sub sp, 0x4 - ldr r4, [sp, 0x14] - lsls r3, 24 - lsrs r3, 24 - lsls r4, 24 - lsrs r5, r4, 24 - adds r6, r5, 0 - lsls r1, 16 - asrs r1, 16 - lsls r2, 16 - asrs r2, 16 - str r5, [sp] - bl CheckForObjectEventCollision - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x4 - bhi _080BD456 - adds r0, r5, 0 - bl MetatileBehavior_IsCrackedIce - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080BD444 - movs r0, 0xE - b _080BD458 -_080BD444: - cmp r4, 0 - bne _080BD456 - adds r0, r6, 0 - bl sub_80BD4B8 - lsls r0, 24 - cmp r0, 0 - beq _080BD456 - movs r4, 0x2 -_080BD456: - adds r0, r4, 0 -_080BD458: - add sp, 0x4 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_80BD40C - - thumb_func_start sub_80BD460 -sub_80BD460: @ 80BD460 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_80BD4B8 - lsls r0, 24 - cmp r0, 0 - bne _080BD478 - ldr r0, _080BD47C @ =gMapHeader - ldrb r0, [r0, 0x17] - cmp r0, 0x8 - bne _080BD480 -_080BD478: - movs r0, 0x1 - b _080BD482 - .align 2, 0 -_080BD47C: .4byte gMapHeader -_080BD480: - movs r0, 0 -_080BD482: - pop {r1} - bx r1 - thumb_func_end sub_80BD460 - - thumb_func_start IsRunningDisallowed -IsRunningDisallowed: @ 80BD488 - push {lr} - lsls r0, 24 - lsrs r2, r0, 24 - ldr r0, _080BD4AC @ =gMapHeader - ldrb r1, [r0, 0x19] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080BD4A8 - adds r0, r2, 0 - bl sub_80BD4B8 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080BD4B0 -_080BD4A8: - movs r0, 0x1 - b _080BD4B2 - .align 2, 0 -_080BD4AC: .4byte gMapHeader -_080BD4B0: - movs r0, 0 -_080BD4B2: - pop {r1} - bx r1 - thumb_func_end IsRunningDisallowed - - thumb_func_start sub_80BD4B8 -sub_80BD4B8: @ 80BD4B8 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r4, 0 - bl MetatileBehavior_IsMB0A - lsls r0, 24 - cmp r0, 0 - bne _080BD4E2 - adds r0, r4, 0 - bl MetatileBehavior_ReturnFalse_9 - lsls r0, 24 - cmp r0, 0 - beq _080BD4E6 - bl PlayerGetZCoord - movs r1, 0x1 - ands r1, r0 - cmp r1, 0 - bne _080BD4E6 -_080BD4E2: - movs r0, 0x1 - b _080BD4E8 -_080BD4E6: - movs r0, 0 -_080BD4E8: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80BD4B8 - - thumb_func_start sub_80BD4F0 -sub_80BD4F0: @ 80BD4F0 - push {r4,r5,lr} - lsls r0, 24 - lsls r1, 24 - lsrs r4, r1, 24 - adds r5, r4, 0 - movs r1, 0xFD - lsls r1, 24 - adds r0, r1 - lsrs r0, 24 - cmp r0, 0x1 - bhi _080BD51A - adds r0, r4, 0 - bl MetatileBehavior_IsIsolatedVerticalRail - lsls r0, 24 - cmp r0, 0 - bne _080BD532 - adds r0, r4, 0 - bl MetatileBehavior_IsVerticalRail - b _080BD52C -_080BD51A: - adds r0, r5, 0 - bl MetatileBehavior_IsIsolatedHorizontalRail - lsls r0, 24 - cmp r0, 0 - bne _080BD532 - adds r0, r5, 0 - bl MetatileBehavior_IsHorizontalRail -_080BD52C: - lsls r0, 24 - cmp r0, 0 - beq _080BD536 -_080BD532: - movs r0, 0 - b _080BD538 -_080BD536: - movs r0, 0x1 -_080BD538: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80BD4F0 - - thumb_func_start sub_80BD540 -sub_80BD540: @ 80BD540 - push {r4,lr} - sub sp, 0x4 - ldr r0, _080BD57C @ =gPlayerAvatar - ldrb r1, [r0] - movs r0, 0x18 - ands r0, r1 - cmp r0, 0 - bne _080BD580 - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl PlayerGetDestCoords - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r4, r2] - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl sub_80BD4B8 - lsls r0, 24 - cmp r0, 0 - bne _080BD580 - movs r0, 0 - b _080BD582 - .align 2, 0 -_080BD57C: .4byte gPlayerAvatar -_080BD580: - movs r0, 0x1 -_080BD582: - add sp, 0x4 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80BD540 - - thumb_func_start player_should_look_direction_be_enforced_upon_movement -player_should_look_direction_be_enforced_upon_movement: @ 80BD58C - push {lr} - movs r0, 0x4 - bl TestPlayerAvatarFlags - lsls r0, 24 - cmp r0, 0 - beq _080BD5C0 - ldr r2, _080BD5B8 @ =gObjectEvents - ldr r0, _080BD5BC @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x1E] - bl MetatileBehavior_IsBumpySlope - lsls r0, 24 - cmp r0, 0 - beq _080BD5C0 - movs r0, 0 - b _080BD5C2 - .align 2, 0 -_080BD5B8: .4byte gObjectEvents -_080BD5BC: .4byte gPlayerAvatar -_080BD5C0: - movs r0, 0x1 -_080BD5C2: - pop {r1} - bx r1 - thumb_func_end player_should_look_direction_be_enforced_upon_movement - - thumb_func_start StartTransitionToFlipBikeState -StartTransitionToFlipBikeState: @ 80BD5C8 - push {r4,lr} - lsls r0, 24 - lsrs r2, r0, 24 - ldr r1, _080BD5F0 @ =gUnusedBikeCameraAheadPanback - movs r0, 0 - strb r0, [r1] - ldr r0, _080BD5F4 @ =gPlayerAvatar - ldrb r1, [r0] - movs r0, 0x6 - ands r0, r1 - cmp r0, 0 - beq _080BD5F8 - movs r0, 0x1 - bl SetPlayerAvatarTransitionFlags - bl Overworld_ClearSavedMusic - bl Overworld_PlaySpecialMapMusic - b _080BD618 - .align 2, 0 -_080BD5F0: .4byte gUnusedBikeCameraAheadPanback -_080BD5F4: .4byte gPlayerAvatar -_080BD5F8: - adds r0, r2, 0 - bl SetPlayerAvatarTransitionFlags - movs r4, 0x8D @ MUS_CYCLING - lsls r4, 1 @ MUS_CYCLING - adds r0, r4, 0 - bl sub_8056124 - cmp r0, 0 - beq _080BD618 - adds r0, r4, 0 - bl Overworld_SetSavedMusic - adds r0, r4, 0 - bl Overworld_ChangeMusicTo -_080BD618: - pop {r4} - pop {r0} - bx r0 - thumb_func_end StartTransitionToFlipBikeState - - thumb_func_start sub_80BD620 -sub_80BD620: @ 80BD620 - push {lr} - ldr r2, _080BD64C @ =gPlayerAvatar - movs r3, 0 - strb r3, [r2, 0x8] - strb r3, [r2, 0x9] - strb r3, [r2, 0xA] - strb r3, [r2, 0xB] - str r0, [r2, 0xC] - str r1, [r2, 0x10] - strh r3, [r2, 0x1C] - movs r1, 0 - adds r2, 0x14 -_080BD638: - adds r0, r1, r2 - strb r3, [r0] - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x7 - bls _080BD638 - pop {r0} - bx r0 - .align 2, 0 -_080BD64C: .4byte gPlayerAvatar - thumb_func_end sub_80BD620 - - thumb_func_start Bike_UpdateBikeCounterSpeed -Bike_UpdateBikeCounterSpeed: @ 80BD650 - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080BD660 @ =gPlayerAvatar - strb r0, [r2, 0xA] - lsrs r1, r0, 1 - adds r0, r1 - strb r0, [r2, 0xB] - bx lr - .align 2, 0 -_080BD660: .4byte gPlayerAvatar - thumb_func_end Bike_UpdateBikeCounterSpeed - - thumb_func_start sub_80BD664 -sub_80BD664: @ 80BD664 - ldr r1, _080BD670 @ =gPlayerAvatar - movs r0, 0 - strb r0, [r1, 0xA] - strb r0, [r1, 0xB] - bx lr - .align 2, 0 -_080BD670: .4byte gPlayerAvatar - thumb_func_end sub_80BD664 - - thumb_func_start GetPlayerSpeed -GetPlayerSpeed: @ 80BD674 - push {lr} - sub sp, 0x8 - ldr r1, _080BD69C @ =gUnknown_83E7D1C - mov r0, sp - movs r2, 0x6 - bl memcpy - ldr r2, _080BD6A0 @ =gPlayerAvatar - ldrb r1, [r2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080BD6A4 - ldrb r0, [r2, 0xA] - lsls r0, 1 - add r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - b _080BD6BE - .align 2, 0 -_080BD69C: .4byte gUnknown_83E7D1C -_080BD6A0: .4byte gPlayerAvatar -_080BD6A4: - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _080BD6B0 - movs r0, 0x3 - b _080BD6BE -_080BD6B0: - movs r0, 0x88 - ands r0, r1 - cmp r0, 0 - bne _080BD6BC - movs r0, 0x1 - b _080BD6BE -_080BD6BC: - movs r0, 0x2 -_080BD6BE: - add sp, 0x8 - pop {r1} - bx r1 - thumb_func_end GetPlayerSpeed - - thumb_func_start Bike_HandleBumpySlopeJump -Bike_HandleBumpySlopeJump: @ 80BD6C4 - push {r4,r5,lr} - sub sp, 0x4 - ldr r5, _080BD714 @ =gPlayerAvatar - ldrb r1, [r5] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _080BD70C - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl PlayerGetDestCoords - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r4, r2] - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl MetatileBehavior_IsBumpySlope - lsls r0, 24 - cmp r0, 0 - beq _080BD70C - movs r0, 0x2 - strb r0, [r5, 0x8] - bl GetPlayerMovementDirection - lsls r0, 24 - lsrs r0, 24 - bl nullsub_24 -_080BD70C: - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080BD714: .4byte gPlayerAvatar - thumb_func_end Bike_HandleBumpySlopeJump - - .align 2, 0 @ Don't pad with nop. diff --git a/data/bike.s b/data/bike.s deleted file mode 100644 index 0245f0206..000000000 --- a/data/bike.s +++ /dev/null @@ -1,33 +0,0 @@ -#include "constants/maps.h" -#include "constants/species.h" - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnknown_83E7CFC:: @ 83E7CFC - .4byte sub_80BD27C - .4byte sub_80BD28C - .4byte sub_80BD2C8 - .4byte sub_80BD358 - .4byte sub_80BD380 - -gUnknown_83E7D10:: @ 83E7D10 - .4byte sub_80BD100 - .4byte sub_80BD1C8 - .4byte sub_80BD1E8 - -gUnknown_83E7D1C:: @ 83E7D1C - .2byte 0x0001, 0x0002, 0x0004 - -gUnknown_83E7D22:: - .byte 4 - - .align 2 -gUnknown_83E7D24:: - .4byte 1, 2, 15, 15, gUnknown_83E7D22, gUnknown_83E7D22, 1 - .4byte 2, 2, 15, 15, gUnknown_83E7D22, gUnknown_83E7D22, 2 - .4byte 3, 2, 15, 15, gUnknown_83E7D22, gUnknown_83E7D22, 3 - .4byte 4, 2, 15, 15, gUnknown_83E7D22, gUnknown_83E7D22, 4 - diff --git a/include/bike.h b/include/bike.h index ad2bd999a..abffae435 100644 --- a/include/bike.h +++ b/include/bike.h @@ -1,11 +1,35 @@ #ifndef GUARD_BIKE_H #define GUARD_BIKE_H -void sub_80BD620(u32 unkC, u32 unk10); +// TODO: Do the constants make sense in FRLG? + +// Player speeds +enum +{ + SPEED_STANDING, + SPEED_NORMAL, + SPEED_FAST, + SPEED_FASTER, + SPEED_FASTEST, +}; + +// Acro bike states +enum +{ + ACRO_STATE_NORMAL, + ACRO_STATE_TURNING, + ACRO_STATE_WHEELIE_STANDING, + ACRO_STATE_BUNNY_HOP, + ACRO_STATE_WHEELIE_MOVING, + ACRO_STATE_SIDE_JUMP, + ACRO_STATE_TURN_JUMP, +}; + +void sub_80BD620(u32 directionHistory, u32 abStartSelectHistory); bool8 sub_80BD540(void); void StartTransitionToFlipBikeState(u8 flags); s16 GetPlayerSpeed(void); - +bool8 sub_80BD460(u8); void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys); bool32 IsRunningDisallowed(u8 metatileBehavior); void Bike_HandleBumpySlopeJump(void); diff --git a/include/field_camera.h b/include/field_camera.h index 2d1ce2ce9..43b93f291 100644 --- a/include/field_camera.h +++ b/include/field_camera.h @@ -20,6 +20,7 @@ struct CameraObject extern struct CameraObject gFieldCamera; extern u16 gTotalCameraPixelOffsetX; extern u16 gTotalCameraPixelOffsetY; +extern bool8 gBikeCameraAheadPanback; // Exported ROM declarations diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index 73109ae1e..edd1f4a77 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -60,5 +60,6 @@ void sub_805C260(void); void player_step(u8 direction, u16 newKeys, u16 heldKeys); bool32 PlayerIsMovingOnRockStairs(u8 direction); void sub_805BEB8(void); +void nullsub_24(u8 direction); #endif //GUARD_FIELD_PLAYER_AVATAR_H diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index a5f5a81b7..ac16bf18a 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -96,7 +96,7 @@ bool8 MetatileBehavior_IsUnionRoomWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsWater(u8 metatileBehavior); bool8 MetatileBehavior_IsFallWarp(u8 metatileBehavior); bool8 MetatileBehavior_ReturnFalse_13(u8 metatileBehavior); -bool8 MetatileBehavior_IsCyclingRoadPullDownTile(u8 metatileBehavior); +bool32 MetatileBehavior_IsCyclingRoadPullDownTile(u8 metatileBehavior); bool8 MetatileBehavior_IsCyclingRoadPullDownTileGrass(u8 metatileBehavior); bool8 MetatileBehavior_IsBumpySlope(u8 metatileBehavior); bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 metatileBehavior); diff --git a/ld_script.txt b/ld_script.txt index 3012e7066..abc4be60b 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -179,7 +179,7 @@ SECTIONS { src/normal.o(.text); src/battle_anim_utility_funcs.o(.text); src/battle_intro.o(.text); - asm/bike.o(.text); + src/bike.o(.text); src/easy_chat.o(.text); src/mon_markings.o(.text); src/mail.o(.text); @@ -497,7 +497,7 @@ SECTIONS { src/normal.o(.rodata); src/battle_anim_utility_funcs.o(.rodata); src/battle_intro.o(.rodata); - data/bike.o(.rodata); + src/bike.o(.rodata); src/easy_chat.o(.rodata); src/mon_markings.o(.rodata); src/mail.o(.rodata); diff --git a/src/bike.c b/src/bike.c new file mode 100644 index 000000000..064ba9f88 --- /dev/null +++ b/src/bike.c @@ -0,0 +1,430 @@ +#include "global.h" +#include "bike.h" +#include "field_player_avatar.h" +#include "metatile_behavior.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "field_camera.h" +#include "overworld.h" +#include "constants/map_types.h" +#include "constants/songs.h" + +static u8 sub_80BD0D4(u8 *, u16, u16); +static void sub_80BD664(void); +static u8 sub_80BD4F0(u8, u8); +static u8 sub_80BD3A0(u8); +static u8 sub_80BD40C(struct ObjectEvent *, s16, s16, u8, u8); +static bool8 sub_80BD4B8(u8); +static void sub_80BD27C(u8); +static void sub_80BD28C(u8); +static void sub_80BD2C8(u8); +static void sub_80BD358(u8); +static void sub_80BD380(u8); +static u8 sub_80BD100(u8 *, u16, u16); +static u8 sub_80BD1C8(u8 *, u16, u16); +static u8 sub_80BD1E8(u8 *, u16, u16); + +static void (*const gUnknown_83E7CFC[])(u8) = +{ + sub_80BD27C, + sub_80BD28C, + sub_80BD2C8, + sub_80BD358, + sub_80BD380, +}; + +static u8 (*const gUnknown_83E7D10[])(u8 *, u16, u16) = +{ + sub_80BD100, + sub_80BD1C8, + sub_80BD1E8, +}; + +void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) +{ + gUnknown_83E7CFC[sub_80BD0D4(&direction, newKeys, heldKeys)](direction); +} + +static u8 sub_80BD0D4(u8 *direction, u16 newKeys, u16 heldKeys) +{ + return gUnknown_83E7D10[gPlayerAvatar.acroBikeState](direction, newKeys, heldKeys); +} + +static u8 sub_80BD100(u8 *r6, u16 sl, u16 sb) +{ + struct ObjectEvent *r4 = &gObjectEvents[gPlayerAvatar.objectEventId]; + u8 r7 = GetPlayerMovementDirection(); + + gPlayerAvatar.bikeFrameCounter = 0; + if (MetatileBehavior_IsCyclingRoadPullDownTile(r4->currentMetatileBehavior) == TRUE) + { + if (!JOY_HELD(B_BUTTON)) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + gPlayerAvatar.runningState = 2; + if (*r6 < 2) + return 3; + else + return 4; + } + else + { + if (*r6 != 0) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + gPlayerAvatar.runningState = 2; + return 4; + } + else + { + goto _080BD17E; // for matching purpose + } + } + } + else + { + if (*r6 == 0) + { + _080BD17E: + *r6 = r7; + gPlayerAvatar.runningState = 0; + return 0; + } + else + { + if (*r6 != r7 && gPlayerAvatar.runningState != 2) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING; + gPlayerAvatar.newDirBackup = *r6; + gPlayerAvatar.runningState = 0; + return sub_80BD0D4(r6, sl, sb); + } + else + { + gPlayerAvatar.runningState = 2; + return 2; + } + } + } +} + +static u8 sub_80BD1C8(u8 *r0, UNUSED u16 r1, UNUSED u16 r2) +{ + *r0 = gPlayerAvatar.newDirBackup; + gPlayerAvatar.runningState = 1; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + sub_80BD664(); + return 1; +} + +static u8 sub_80BD1E8(u8 *r6, u16 sb, u16 r8) +{ + u8 r5 = GetPlayerMovementDirection(); + u8 r1 = gPlayerAvatar.objectEventId; + if (MetatileBehavior_IsCyclingRoadPullDownTile(r1[gObjectEvents].currentMetatileBehavior) == TRUE) + { + if (*r6 != r5) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING; + gPlayerAvatar.newDirBackup = *r6; + gPlayerAvatar.runningState = 0; + return sub_80BD0D4(r6, sb, r8); + } + else + { + gPlayerAvatar.runningState = 2; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + if (*r6 < 2) + return 3; + else + return 4; + } + } + else + { + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + if (*r6 == 0) + { + *r6 = r5; + gPlayerAvatar.runningState = 0; + return 0; + } + else + { + gPlayerAvatar.runningState = 2; + return 2; + } + } +} + +static void sub_80BD27C(u8 r0) +{ + PlayerFaceDirection(r0); +} + +static void sub_80BD28C(u8 r4) +{ + struct ObjectEvent *r5 = &gObjectEvents[gPlayerAvatar.objectEventId]; + + if (!sub_80BD4F0(r4, r5->currentMetatileBehavior)) + r4 = r5->movementDirection; + PlayerFaceDirection(r4); +} + +static void sub_80BD2C8(u8 r4) +{ + struct ObjectEvent *r5; + + r5 = &gObjectEvents[gPlayerAvatar.objectEventId]; + if (!sub_80BD4F0(r4, r5->currentMetatileBehavior)) + { + sub_80BD27C(r5->movementDirection); + } + else + { + u8 r1 = sub_80BD3A0(r4); + + if (r1 > 0 && r1 <= 11) + { + if (r1 == 6) + PlayerJumpLedge(r4); + else if (r1 != 5 && r1 != 6 && r1 != 7 && r1 != 8) + PlayerOnBikeCollide(r4); + } + else + { + + if (r1 == 14) + PlayerGoSpeed2(r4); + else if (PlayerIsMovingOnRockStairs(r4)) + PlayerGoSpeed2(r4); + else + PlayerRideWaterCurrent(r4); + } + } +} + +static void sub_80BD358(UNUSED u8 v) +{ + u8 r0 = sub_80BD3A0(1); + + if (r0 == 0) + sub_805C164(1); + else if (r0 == 6) + PlayerJumpLedge(1); +} + +static void sub_80BD380(u8 r4) +{ + if (sub_80BD3A0(r4) == 0) + PlayerGoSpeed1(r4); +} + +static u8 sub_80BD3A0(u8 r6) +{ + struct ObjectEvent *r4 = &gObjectEvents[gPlayerAvatar.objectEventId]; + s16 sp04, sp06; + u8 r0; + + sp04 = r4->currentCoords.x; + sp06 = r4->currentCoords.y; + MoveCoords(r6, &sp04, &sp06); + r0 = MapGridGetMetatileBehaviorAt(sp04, sp06); + return sub_80BD40C(r4, sp04, sp06, r6, r0); +} + +static u8 sub_80BD40C(struct ObjectEvent *r0, s16 r1, s16 r2, u8 r3, u8 r5) +{ + u8 r4 = CheckForObjectEventCollision(r0, r1, r2, r3, r5); + + if (r4 <= 4) + { + u8 r0 = MetatileBehavior_IsCrackedIce(r5); + if (r0 == TRUE) + return 14; + if (r4 == 0 && sub_80BD4B8(r5)) + r4 = 2; + } + return r4; +} + +bool8 sub_80BD460(u8 r0) +{ + if (sub_80BD4B8(r0)) + return TRUE; + if (gMapHeader.mapType != MAP_TYPE_INDOOR) + return FALSE; + else + return TRUE; +} + +bool32 IsRunningDisallowed(u8 metatileBehavior) +{ + if (!(gMapHeader.escapeRope & 2)) // wrong name? probably a bitfield. + return TRUE; + if (sub_80BD4B8(metatileBehavior) != TRUE) + return FALSE; + else + return TRUE; +} + +static bool8 sub_80BD4B8(u8 r4) +{ + if (MetatileBehavior_IsMB0A(r4)) + return TRUE; + if (!MetatileBehavior_ReturnFalse_9(r4)) + return FALSE; + if (PlayerGetZCoord() & 1) + return FALSE; + return TRUE; +} + +static bool8 sub_80BD4F0(u8 r0, u8 r4) +{ + if (r0 == DIR_EAST || r0 == DIR_WEST) + { + if (MetatileBehavior_IsIsolatedVerticalRail(r4) || MetatileBehavior_IsVerticalRail(r4)) + return FALSE; + } + else + { + if (MetatileBehavior_IsIsolatedHorizontalRail(r4) || MetatileBehavior_IsHorizontalRail(r4)) + return FALSE; + } + return TRUE; +} + +bool8 sub_80BD540(void) +{ + s16 sp00, sp02; + u8 r0; + + if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_UNDERWATER | PLAYER_AVATAR_FLAG_SURFING))) + { + PlayerGetDestCoords(&sp00, &sp02); + r0 = MapGridGetMetatileBehaviorAt(sp00, sp02); + if (!sub_80BD4B8(r0)) + return FALSE; + } + return TRUE; +} + +bool8 player_should_look_direction_be_enforced_upon_movement(void) +{ + if (TestPlayerAvatarFlags(PLAYER_AVATAR_STATE_UNDERWATER)) + { + if (MetatileBehavior_IsBumpySlope(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior)) + return FALSE; + } + return TRUE; +} + +void StartTransitionToFlipBikeState(u8 flags) +{ + gBikeCameraAheadPanback = FALSE; + if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + Overworld_ClearSavedMusic(); + Overworld_PlaySpecialMapMusic(); + } + else + { + SetPlayerAvatarTransitionFlags(flags); + if (sub_8056124(MUS_CYCLING)) + { + Overworld_SetSavedMusic(MUS_CYCLING); + Overworld_ChangeMusicTo(MUS_CYCLING); + } + } +} + +void sub_80BD620(u32 directionHistory, u32 abStartSelectHistory) +{ + u8 i; + + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + gPlayerAvatar.newDirBackup = 0; + gPlayerAvatar.bikeFrameCounter = 0; + gPlayerAvatar.bikeSpeed = SPEED_STANDING; + gPlayerAvatar.directionHistory = directionHistory; + gPlayerAvatar.abStartSelectHistory = abStartSelectHistory; + gPlayerAvatar.lastSpinTile = 0; + for (i = 0; i < NELEMS(gPlayerAvatar.dirTimerHistory); ++i) + gPlayerAvatar.dirTimerHistory[i] = 0; +} + +void Bike_UpdateBikeCounterSpeed(u8 counter) +{ + gPlayerAvatar.bikeFrameCounter = counter; + gPlayerAvatar.bikeSpeed = counter + (gPlayerAvatar.bikeFrameCounter >> 1); +} + +static void sub_80BD664(void) +{ + gPlayerAvatar.bikeFrameCounter = 0; + gPlayerAvatar.bikeSpeed = SPEED_STANDING; +} + +s16 GetPlayerSpeed(void) +{ + s16 exp[] = { 1, 2, 4 }; + + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + return exp[gPlayerAvatar.bikeFrameCounter]; + else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + return 3; + else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_WATERING)) + return 2; + else + return 1; +} + +void Bike_HandleBumpySlopeJump(void) +{ + s16 x, y; + u8 tileBehavior; + + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + { + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsBumpySlope(tileBehavior)) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + nullsub_24(GetPlayerMovementDirection()); + } + } +} + +static const u8 gUnknown_83E7D22 = 4; + +// unused +static const struct +{ + u32 unk00, unk04, unk08, unk0C; + const void *unk10, *unk14; + u32 unk18; +} gUnknown_83E7D24[] = +{ + { + 1, 2, 15, 15, + &gUnknown_83E7D22, &gUnknown_83E7D22, + 1, + }, + { + 2, 2, 15, 15, + &gUnknown_83E7D22, &gUnknown_83E7D22, + 2, + }, + { + 3, 2, 15, 15, + &gUnknown_83E7D22, &gUnknown_83E7D22, + 3, + }, + { + 4, 2, 15, 15, + &gUnknown_83E7D22, &gUnknown_83E7D22, + 4, + }, +}; diff --git a/src/field_camera.c b/src/field_camera.c index 40ab8f464..f383b2a27 100644 --- a/src/field_camera.c +++ b/src/field_camera.c @@ -7,7 +7,7 @@ #include "new_menu_helpers.h" #include "overworld.h" -EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE; +EWRAM_DATA bool8 gBikeCameraAheadPanback = FALSE; // Static type declarations struct FieldCameraOffset @@ -531,7 +531,7 @@ static void CameraPanningCB_PanAhead(void) { u8 var; - if (gUnusedBikeCameraAheadPanback == FALSE) + if (gBikeCameraAheadPanback == FALSE) { InstallCameraPanAheadCallback(); } diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 481e55578..0bc4910eb 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1350,7 +1350,7 @@ void sub_805CC2C(u8 direction) sub_8150498(2); } -void nullsub_24(void) +void nullsub_24(u8 direction) { } diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index c937a3b48..f75630802 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -664,7 +664,7 @@ bool8 MetatileBehavior_IsFallWarp(u8 metatileBehavior) bool8 MetatileBehavior_ReturnFalse_13(u8 metatileBehavior){ return FALSE; } -bool8 MetatileBehavior_IsCyclingRoadPullDownTile(u8 metatileBehavior) +bool32 MetatileBehavior_IsCyclingRoadPullDownTile(u8 metatileBehavior) { if(metatileBehavior >= MB_CYCLING_ROAD_PULL_DOWN && metatileBehavior <= MB_CYCLING_ROAD_PULL_DOWN_GRASS) return TRUE; |