Merge pull request #314 from jiangzhengwenjz/bike

bike
This commit is contained in:
PikalaxALT
2020-03-28 16:32:09 -04:00
committed by GitHub
11 changed files with 461 additions and 939 deletions
-897
View File
@@ -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.
-33
View File
@@ -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
+26 -2
View File
@@ -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);
+1
View File
@@ -20,6 +20,7 @@ struct CameraObject
extern struct CameraObject gFieldCamera;
extern u16 gTotalCameraPixelOffsetX;
extern u16 gTotalCameraPixelOffsetY;
extern bool8 gBikeCameraAheadPanback;
// Exported ROM declarations
+1
View File
@@ -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
+1 -1
View File
@@ -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);
+2 -2
View File
@@ -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);
+426
View File
@@ -0,0 +1,426 @@
#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());
}
}
}
// R/S leftover
// the struct below is used for checking button combinations of the last input so that the acro can potentially perform a side/turn jump.
// its possible that at some point Game Freak intended for the acro bike to have more complex tricks: but only the acro jump combinations can be seen in the final ROM.
struct BikeHistoryInputInfo
{
u32 dirHistoryMatch; // the direction you need to press
u32 abStartSelectHistoryMatch; // the button you need to press
u32 dirHistoryMask; // mask applied so that way only the recent nybble (the recent input) is checked
u32 abStartSelectHistoryMask; // mask applied so that way only the recent nybble (the recent input) is checked
const u8 *dirTimerHistoryList; // list of timers to check for direction before the button+dir combination can be verified.
const u8 *abStartSelectHistoryList; // list of timers to check for buttons before the button+dir combination can be verified.
u32 direction; // direction to jump
};
// this is a list of timers to compare against later, terminated with 0. the only timer being compared against is 4 frames in this list.
static const u8 sAcroBikeJumpTimerList[] = {4, 0};
// this is a list of history inputs to do in order to do the check to retrieve a jump direction for acro bike. it seems to be an extensible list, so its possible that Game Freak may have intended for the Acro Bike to have more complex tricks at some point. The final list only has the acro jump.
static const struct BikeHistoryInputInfo sAcroBikeTricksList[] =
{
// the 0xF is a mask performed with each byte of the array in order to perform the check on only the last entry of the history list, otherwise the check wouldn't work as there can be 0xF0 as opposed to 0x0F.
{DIR_SOUTH, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_SOUTH},
{DIR_NORTH, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_NORTH},
{DIR_WEST, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_WEST},
{DIR_EAST, B_BUTTON, 0xF, 0xF, sAcroBikeJumpTimerList, sAcroBikeJumpTimerList, DIR_EAST},
};
+2 -2
View File
@@ -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();
}
+1 -1
View File
@@ -1350,7 +1350,7 @@ void sub_805CC2C(u8 direction)
sub_8150498(2);
}
void nullsub_24(void)
void nullsub_24(u8 direction)
{
}
+1 -1
View File
@@ -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;