diff options
-rw-r--r-- | asm/field_player_avatar.s | 1173 | ||||
-rw-r--r-- | asm/overworld.s | 2 | ||||
-rw-r--r-- | data/field_player_avatar.s | 31 | ||||
-rw-r--r-- | include/bike.h | 2 | ||||
-rw-r--r-- | include/event_object_movement.h | 11 | ||||
-rw-r--r-- | include/field_player_avatar.h | 5 | ||||
-rw-r--r-- | include/global.fieldmap.h | 27 | ||||
-rw-r--r-- | src/event_object_movement.c | 20 | ||||
-rw-r--r-- | src/field_player_avatar.c | 434 | ||||
-rw-r--r-- | src/naming_screen.c | 2 |
10 files changed, 476 insertions, 1231 deletions
diff --git a/asm/field_player_avatar.s b/asm/field_player_avatar.s index bd3cc0536..909c10647 100644 --- a/asm/field_player_avatar.s +++ b/asm/field_player_avatar.s @@ -5,1179 +5,6 @@ .text - thumb_func_start PlayerJumpLedge -PlayerJumpLedge: @ 805C23C - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0xA - bl PlaySE - adds r0, r4, 0 - bl GetJump2MovementAction - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x8 - bl PlayerSetAnimId - pop {r4} - pop {r0} - bx r0 - thumb_func_end PlayerJumpLedge - - thumb_func_start sub_805C260 -sub_805C260: @ 805C260 - push {lr} - movs r0, 0x9F - movs r1, 0 - bl PlayerSetAnimId - pop {r0} - bx r0 - thumb_func_end sub_805C260 - - thumb_func_start sub_805C270 -sub_805C270: @ 805C270 - push {r4,lr} - ldr r4, _0805C2AC @ =gPlayerAvatar - ldrb r0, [r4, 0x3] - cmp r0, 0x2 - beq _0805C27E - cmp r0, 0 - bne _0805C2A6 -_0805C27E: - bl player_should_look_direction_be_enforced_upon_movement - lsls r0, 24 - cmp r0, 0 - beq _0805C2A6 - ldr r2, _0805C2B0 @ =gObjectEvents - ldrb r1, [r4, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x18] - lsls r0, 28 - lsrs r0, 28 - bl GetFaceDirectionMovementAction - lsls r0, 24 - lsrs r0, 24 - bl PlayerForceSetHeldMovement -_0805C2A6: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0805C2AC: .4byte gPlayerAvatar -_0805C2B0: .4byte gObjectEvents - thumb_func_end sub_805C270 - - thumb_func_start PlayerGoSpin -PlayerGoSpin: @ 805C2B4 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_80640E4 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x3 - bl PlayerSetAnimId - pop {r0} - bx r0 - thumb_func_end PlayerGoSpin - - thumb_func_start sub_805C2CC -sub_805C2CC: @ 805C2CC - push {r4-r7,lr} - lsls r0, 24 - lsrs r6, r0, 24 - ldr r1, _0805C308 @ =sForcedMovementFuncs - ldr r0, [r1] - cmp r0, 0 - beq _0805C302 - adds r4, r1, 0 - adds r7, r4, 0 - movs r5, 0 -_0805C2E0: - ldr r1, [r4] - adds r0, r6, 0 - bl _call_via_r1 - lsls r0, 24 - cmp r0, 0 - beq _0805C2F8 - adds r0, r7, 0x4 - adds r0, r5, r0 - ldr r0, [r0] - bl _call_via_r0 -_0805C2F8: - adds r4, 0x8 - adds r5, 0x8 - ldr r0, [r4] - cmp r0, 0 - bne _0805C2E0 -_0805C302: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0805C308: .4byte sForcedMovementFuncs - thumb_func_end sub_805C2CC - - thumb_func_start sub_805C30C -sub_805C30C: @ 805C30C - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_80642F4 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x1 - bl PlayerSetAnimId - pop {r0} - bx r0 - thumb_func_end sub_805C30C - - thumb_func_start sub_805C324 -sub_805C324: @ 805C324 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_8064320 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x1 - bl PlayerSetAnimId - pop {r0} - bx r0 - thumb_func_end sub_805C324 - - thumb_func_start sub_805C33C -sub_805C33C: @ 805C33C - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_806434C - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x1 - bl PlayerSetAnimId - pop {r0} - bx r0 - thumb_func_end sub_805C33C - - thumb_func_start sub_805C354 -sub_805C354: @ 805C354 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0x1C - bl PlaySE - adds r0, r4, 0 - bl sub_8064378 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x1 - bl PlayerSetAnimId - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_805C354 - - thumb_func_start sub_805C378 -sub_805C378: @ 805C378 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0x1C - bl PlaySE - adds r0, r4, 0 - bl sub_80643A4 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x2 - bl PlayerSetAnimId - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_805C378 - - thumb_func_start sub_805C39C -sub_805C39C: @ 805C39C - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0x1C - bl PlaySE - adds r0, r4, 0 - bl sub_80643D0 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x8 - bl PlayerSetAnimId - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_805C39C - - thumb_func_start sub_805C3C0 -sub_805C3C0: @ 805C3C0 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0x1C - bl PlaySE - adds r0, r4, 0 - bl sub_8064168 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x1 - bl PlayerSetAnimId - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_805C3C0 - - thumb_func_start sub_805C3E4 -sub_805C3E4: @ 805C3E4 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0x7 - bl PlaySE - adds r0, r4, 0 - bl sub_80643FC - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x2 - bl PlayerSetAnimId - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_805C3E4 - - thumb_func_start sub_805C408 -sub_805C408: @ 805C408 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_8064428 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x2 - bl PlayerSetAnimId - pop {r0} - bx r0 - thumb_func_end sub_805C408 - - thumb_func_start sub_805C420 -sub_805C420: @ 805C420 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl sub_8064454 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x2 - bl PlayerSetAnimId - pop {r0} - bx r0 - thumb_func_end sub_805C420 - - thumb_func_start sub_805C438 -sub_805C438: @ 805C438 - push {r4-r6,lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r5, r0, 24 - adds r6, r5, 0 - ldr r2, _0805C4E8 @ =gObjectEvents - ldr r0, _0805C4EC @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r4, [r0, 0x1E] - ldr r1, _0805C4F0 @ =gUnknown_835B864 - subs r0, r5, 0x1 - lsls r0, 2 - adds r0, r1 - ldr r1, [r0] - adds r0, r4, 0 - bl _call_via_r1 - lsls r0, 24 - cmp r0, 0 - bne _0805C4DE - cmp r5, 0x3 - bne _0805C484 - adds r0, r4, 0 - bl MetatileBehavior_IsUnknownWarp6D - lsls r0, 24 - cmp r0, 0 - bne _0805C4DE - adds r0, r4, 0 - bl MetatileBehavior_IsUnknownWarp6F - lsls r0, 24 - cmp r0, 0 - bne _0805C4DE -_0805C484: - cmp r5, 0x4 - bne _0805C4A0 - adds r0, r4, 0 - bl MetatileBehavior_IsUnknownWarp6C - lsls r0, 24 - cmp r0, 0 - bne _0805C4DE - adds r0, r4, 0 - bl MetatileBehavior_IsUnknownWarp6E - lsls r0, 24 - cmp r0, 0 - bne _0805C4DE -_0805C4A0: - cmp r6, 0x2 - bne _0805C4D8 - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl PlayerGetDestCoords - movs r0, 0x2 - mov r1, sp - adds r2, r4, 0 - bl MoveCoords - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r4, r2] - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r4, 0 - bl MetatileBehavior_IsWarpDoor - lsls r0, 24 - cmp r0, 0 - bne _0805C4DE -_0805C4D8: - movs r0, 0x7 - bl PlaySE -_0805C4DE: - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0805C4E8: .4byte gObjectEvents -_0805C4EC: .4byte gPlayerAvatar -_0805C4F0: .4byte gUnknown_835B864 - thumb_func_end sub_805C438 - - thumb_func_start GetXYCoordsOneStepInFrontOfPlayer -GetXYCoordsOneStepInFrontOfPlayer: @ 805C4F4 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldr r3, _0805C530 @ =gObjectEvents - ldr r2, _0805C534 @ =gPlayerAvatar - ldrb r1, [r2, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r3 - ldrh r0, [r0, 0x10] - strh r0, [r4] - ldrb r1, [r2, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r3 - ldrh r0, [r0, 0x12] - strh r0, [r5] - bl GetPlayerFacingDirection - lsls r0, 24 - lsrs r0, 24 - adds r1, r4, 0 - adds r2, r5, 0 - bl MoveCoords - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0805C530: .4byte gObjectEvents -_0805C534: .4byte gPlayerAvatar - thumb_func_end GetXYCoordsOneStepInFrontOfPlayer - - thumb_func_start PlayerGetDestCoords -PlayerGetDestCoords: @ 805C538 - push {r4,r5,lr} - ldr r5, _0805C560 @ =gObjectEvents - ldr r4, _0805C564 @ =gPlayerAvatar - ldrb r3, [r4, 0x5] - lsls r2, r3, 3 - adds r2, r3 - lsls r2, 2 - adds r2, r5 - ldrh r2, [r2, 0x10] - strh r2, [r0] - ldrb r2, [r4, 0x5] - lsls r0, r2, 3 - adds r0, r2 - lsls r0, 2 - adds r0, r5 - ldrh r0, [r0, 0x12] - strh r0, [r1] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0805C560: .4byte gObjectEvents -_0805C564: .4byte gPlayerAvatar - thumb_func_end PlayerGetDestCoords - - thumb_func_start player_get_pos_including_state_based_drift -player_get_pos_including_state_based_drift: @ 805C568 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldr r0, _0805C5BC @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _0805C5C0 @ =gObjectEvents - adds r3, r0, r1 - ldrb r1, [r3] - movs r0, 0xC0 - ands r0, r1 - cmp r0, 0x40 - beq _0805C588 - b _0805C6B0 -_0805C588: - ldr r2, _0805C5C4 @ =gSprites - ldrb r1, [r3, 0x4] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - movs r1, 0x32 - ldrsh r0, [r0, r1] - cmp r0, 0 - beq _0805C59E - b _0805C6B0 -_0805C59E: - ldrh r0, [r3, 0x10] - strh r0, [r4] - ldrh r0, [r3, 0x12] - strh r0, [r5] - ldrb r0, [r3, 0x1C] - subs r0, 0x10 - cmp r0, 0x30 - bls _0805C5B0 - b _0805C6B0 -_0805C5B0: - lsls r0, 2 - ldr r1, _0805C5C8 @ =_0805C5CC - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0805C5BC: .4byte gPlayerAvatar -_0805C5C0: .4byte gObjectEvents -_0805C5C4: .4byte gSprites -_0805C5C8: .4byte _0805C5CC - .align 2, 0 -_0805C5CC: - .4byte _0805C690 - .4byte _0805C696 - .4byte _0805C6A0 - .4byte _0805C6A6 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C6B0 - .4byte _0805C690 - .4byte _0805C696 - .4byte _0805C6A0 - .4byte _0805C6A6 -_0805C690: - ldrh r0, [r5] - adds r0, 0x1 - b _0805C69A -_0805C696: - ldrh r0, [r5] - subs r0, 0x1 -_0805C69A: - strh r0, [r5] - movs r0, 0x1 - b _0805C6BC -_0805C6A0: - ldrh r0, [r4] - subs r0, 0x1 - b _0805C6AA -_0805C6A6: - ldrh r0, [r4] - adds r0, 0x1 -_0805C6AA: - strh r0, [r4] - movs r0, 0x1 - b _0805C6BC -_0805C6B0: - movs r1, 0x1 - negs r1, r1 - adds r0, r1, 0 - strh r0, [r4] - strh r0, [r5] - movs r0, 0 -_0805C6BC: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end player_get_pos_including_state_based_drift - - thumb_func_start GetPlayerFacingDirection -GetPlayerFacingDirection: @ 805C6C4 - ldr r2, _0805C6DC @ =gObjectEvents - ldr r0, _0805C6E0 @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x18] - lsls r0, 28 - lsrs r0, 28 - bx lr - .align 2, 0 -_0805C6DC: .4byte gObjectEvents -_0805C6E0: .4byte gPlayerAvatar - thumb_func_end GetPlayerFacingDirection - - thumb_func_start GetPlayerMovementDirection -GetPlayerMovementDirection: @ 805C6E4 - ldr r2, _0805C6F8 @ =gObjectEvents - ldr r0, _0805C6FC @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x18] - lsrs r0, 4 - bx lr - .align 2, 0 -_0805C6F8: .4byte gObjectEvents -_0805C6FC: .4byte gPlayerAvatar - thumb_func_end GetPlayerMovementDirection - - thumb_func_start PlayerGetZCoord -PlayerGetZCoord: @ 805C700 - ldr r2, _0805C714 @ =gObjectEvents - ldr r0, _0805C718 @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0xB] - lsrs r0, 4 - bx lr - .align 2, 0 -_0805C714: .4byte gObjectEvents -_0805C718: .4byte gPlayerAvatar - thumb_func_end PlayerGetZCoord - - thumb_func_start sub_805C71C -sub_805C71C: @ 805C71C - push {lr} - adds r3, r0, 0 - adds r2, r1, 0 - ldr r0, _0805C744 @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _0805C748 @ =gObjectEvents - adds r0, r1 - lsls r3, 16 - asrs r3, 16 - lsls r2, 16 - asrs r2, 16 - adds r1, r3, 0 - bl MoveObjectEventToMapCoords - pop {r0} - bx r0 - .align 2, 0 -_0805C744: .4byte gPlayerAvatar -_0805C748: .4byte gObjectEvents - thumb_func_end sub_805C71C - - thumb_func_start TestPlayerAvatarFlags -TestPlayerAvatarFlags: @ 805C74C - ldr r1, _0805C758 @ =gPlayerAvatar - ldrb r1, [r1] - ands r1, r0 - adds r0, r1, 0 - bx lr - .align 2, 0 -_0805C758: .4byte gPlayerAvatar - thumb_func_end TestPlayerAvatarFlags - - thumb_func_start sub_805C75C -sub_805C75C: @ 805C75C - ldr r0, _0805C764 @ =gPlayerAvatar - ldrb r0, [r0] - bx lr - .align 2, 0 -_0805C764: .4byte gPlayerAvatar - thumb_func_end sub_805C75C - - thumb_func_start GetPlayerAvatarObjectId -GetPlayerAvatarObjectId: @ 805C768 - ldr r0, _0805C770 @ =gPlayerAvatar - ldrb r0, [r0, 0x4] - bx lr - .align 2, 0 -_0805C770: .4byte gPlayerAvatar - thumb_func_end GetPlayerAvatarObjectId - - thumb_func_start sub_805C774 -sub_805C774: @ 805C774 - push {lr} - bl ForcedMovement_None - pop {r0} - bx r0 - thumb_func_end sub_805C774 - - thumb_func_start sub_805C780 -sub_805C780: @ 805C780 - push {r4,lr} - ldr r0, _0805C7C0 @ =gPlayerAvatar - ldrb r0, [r0, 0x5] - lsls r4, r0, 3 - adds r4, r0 - lsls r4, 2 - ldr r0, _0805C7C4 @ =gObjectEvents - adds r4, r0 - adds r0, r4, 0 - bl npc_clear_strange_bits - ldrb r1, [r4, 0x18] - lsls r1, 28 - lsrs r1, 28 - adds r0, r4, 0 - bl SetObjectEventDirection - movs r0, 0x6 - bl TestPlayerAvatarFlags - lsls r0, 24 - cmp r0, 0 - beq _0805C7B8 - bl Bike_HandleBumpySlopeJump - movs r0, 0 - bl Bike_UpdateBikeCounterSpeed -_0805C7B8: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0805C7C0: .4byte gPlayerAvatar -_0805C7C4: .4byte gObjectEvents - thumb_func_end sub_805C780 - - thumb_func_start sub_805C7C8 -sub_805C7C8: @ 805C7C8 - push {lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - bl GetPlayerAvatarGraphicsIdByStateIdAndGender - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end sub_805C7C8 - - thumb_func_start GetPlayerAvatarGraphicsIdByStateIdAndGender -GetPlayerAvatarGraphicsIdByStateIdAndGender: @ 805C7E0 - lsls r0, 24 - lsls r1, 24 - lsrs r1, 24 - ldr r2, _0805C7F4 @ =gUnknown_835B874 - lsrs r0, 23 - adds r1, r0 - adds r1, r2 - ldrb r0, [r1] - bx lr - .align 2, 0 -_0805C7F4: .4byte gUnknown_835B874 - thumb_func_end GetPlayerAvatarGraphicsIdByStateIdAndGender - - thumb_func_start GetHoennLinkPartnerGraphicsIdByGender -GetHoennLinkPartnerGraphicsIdByGender: @ 805C7F8 - lsls r0, 24 - lsrs r0, 24 - ldr r1, _0805C804 @ =gUnknown_835B880 - adds r0, r1 - ldrb r0, [r0] - bx lr - .align 2, 0 -_0805C804: .4byte gUnknown_835B880 - thumb_func_end GetHoennLinkPartnerGraphicsIdByGender - - thumb_func_start GetPlayerAvatarGraphicsIdByStateId -GetPlayerAvatarGraphicsIdByStateId: @ 805C808 - push {lr} - lsls r0, 24 - lsrs r0, 24 - ldr r1, _0805C820 @ =gPlayerAvatar - ldrb r1, [r1, 0x7] - bl GetPlayerAvatarGraphicsIdByStateIdAndGender - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - .align 2, 0 -_0805C820: .4byte gPlayerAvatar - thumb_func_end GetPlayerAvatarGraphicsIdByStateId - - thumb_func_start GetPlayerAvatarGenderByGraphicsId -GetPlayerAvatarGenderByGraphicsId: @ 805C824 - push {lr} - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0xB - bgt _0805C836 - cmp r0, 0x7 - blt _0805C836 - movs r0, 0x1 - b _0805C838 -_0805C836: - movs r0, 0 -_0805C838: - pop {r1} - bx r1 - thumb_func_end GetPlayerAvatarGenderByGraphicsId - - thumb_func_start PartyHasMonWithSurf -PartyHasMonWithSurf: @ 805C83C - push {r4,r5,lr} - movs r0, 0x8 - bl TestPlayerAvatarFlags - lsls r0, 24 - cmp r0, 0 - bne _0805C880 - movs r5, 0 - b _0805C866 -_0805C84E: - adds r0, r4, 0 - movs r1, 0x39 - bl MonKnowsMove - lsls r0, 24 - cmp r0, 0 - beq _0805C860 - movs r0, 0x1 - b _0805C882 -_0805C860: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 -_0805C866: - cmp r5, 0x5 - bhi _0805C880 - movs r0, 0x64 - adds r1, r5, 0 - muls r1, r0 - ldr r0, _0805C888 @ =gPlayerParty - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0xB - bl GetMonData - cmp r0, 0 - bne _0805C84E -_0805C880: - movs r0, 0 -_0805C882: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_0805C888: .4byte gPlayerParty - thumb_func_end PartyHasMonWithSurf - - thumb_func_start IsPlayerSurfingNorth -IsPlayerSurfingNorth: @ 805C88C - push {lr} - bl GetPlayerMovementDirection - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x2 - bne _0805C8AA - movs r0, 0x8 - bl TestPlayerAvatarFlags - lsls r0, 24 - cmp r0, 0 - beq _0805C8AA - movs r0, 0x1 - b _0805C8AC -_0805C8AA: - movs r0, 0 -_0805C8AC: - pop {r1} - bx r1 - thumb_func_end IsPlayerSurfingNorth - - thumb_func_start IsPlayerFacingSurfableFishableWater -IsPlayerFacingSurfableFishableWater: @ 805C8B0 - push {r4,r5,lr} - sub sp, 0x4 - ldr r0, _0805C924 @ =gPlayerAvatar - ldrb r0, [r0, 0x5] - lsls r4, r0, 3 - adds r4, r0 - lsls r4, 2 - ldr r0, _0805C928 @ =gObjectEvents - adds r4, r0 - ldrh r1, [r4, 0x10] - mov r0, sp - strh r1, [r0] - ldrh r0, [r4, 0x12] - mov r5, sp - adds r5, 0x2 - strh r0, [r5] - ldrb r0, [r4, 0x18] - lsls r0, 28 - lsrs r0, 28 - mov r1, sp - adds r2, r5, 0 - bl MoveCoords - mov r0, sp - movs r2, 0 - ldrsh r1, [r0, r2] - movs r0, 0 - ldrsh r2, [r5, r0] - ldrb r3, [r4, 0x18] - lsls r3, 28 - lsrs r3, 28 - adds r0, r4, 0 - bl GetCollisionAtCoords - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bne _0805C92C - bl PlayerGetZCoord - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bne _0805C92C - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r5, r2] - bl MetatileAtCoordsIsWaterTile - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _0805C92C - movs r0, 0x1 - b _0805C92E - .align 2, 0 -_0805C924: .4byte gPlayerAvatar -_0805C928: .4byte gObjectEvents -_0805C92C: - movs r0, 0 -_0805C92E: - add sp, 0x4 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end IsPlayerFacingSurfableFishableWater - - thumb_func_start MetatileAtCoordsIsWaterTile -MetatileAtCoordsIsWaterTile: @ 805C938 - push {lr} - lsls r0, 16 - asrs r0, 16 - lsls r1, 16 - asrs r1, 16 - movs r2, 0x1 - bl MapGridGetMetatileAttributeAt - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x2 - bl TestMetatileAttributeBit - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end MetatileAtCoordsIsWaterTile - - thumb_func_start ClearPlayerAvatarInfo -ClearPlayerAvatarInfo: @ 805C95C - push {lr} - ldr r0, _0805C96C @ =gPlayerAvatar - movs r1, 0 - movs r2, 0x20 - bl memset - pop {r0} - bx r0 - .align 2, 0 -_0805C96C: .4byte gPlayerAvatar - thumb_func_end ClearPlayerAvatarInfo - - thumb_func_start SetPlayerAvatarStateMask -SetPlayerAvatarStateMask: @ 805C970 - lsls r0, 24 - lsrs r0, 24 - ldr r3, _0805C984 @ =gPlayerAvatar - ldrb r2, [r3] - movs r1, 0xE0 - ands r1, r2 - orrs r0, r1 - strb r0, [r3] - bx lr - .align 2, 0 -_0805C984: .4byte gPlayerAvatar - thumb_func_end SetPlayerAvatarStateMask - - thumb_func_start GetPlayerAvatarStateTransitionByGraphicsId -GetPlayerAvatarStateTransitionByGraphicsId: @ 805C988 - push {r4-r6,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 24 - lsrs r1, 24 - movs r2, 0 - ldr r3, _0805C9B0 @ =gUnknown_835B882 - lsls r0, r1, 1 - adds r0, r1 - lsls r4, r0, 1 - adds r6, r3, 0x1 -_0805C99E: - lsls r0, r2, 1 - adds r1, r0, r4 - adds r0, r1, r3 - ldrb r0, [r0] - cmp r0, r5 - bne _0805C9B4 - adds r0, r1, r6 - ldrb r0, [r0] - b _0805C9C0 - .align 2, 0 -_0805C9B0: .4byte gUnknown_835B882 -_0805C9B4: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x2 - bls _0805C99E - movs r0, 0x1 -_0805C9C0: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end GetPlayerAvatarStateTransitionByGraphicsId - - thumb_func_start GetPlayerAvatarGraphicsIdByCurrentState -GetPlayerAvatarGraphicsIdByCurrentState: @ 805C9C8 - push {r4-r6,lr} - ldr r0, _0805C9F0 @ =gPlayerAvatar - ldrb r5, [r0] - movs r2, 0 - ldr r3, _0805C9F4 @ =gUnknown_835B882 - ldrb r1, [r0, 0x7] - lsls r0, r1, 1 - adds r0, r1 - lsls r4, r0, 1 - adds r6, r3, 0x1 -_0805C9DC: - lsls r0, r2, 1 - adds r1, r0, r4 - adds r0, r1, r6 - ldrb r0, [r0] - ands r0, r5 - cmp r0, 0 - beq _0805C9F8 - adds r0, r1, r3 - ldrb r0, [r0] - b _0805CA04 - .align 2, 0 -_0805C9F0: .4byte gPlayerAvatar -_0805C9F4: .4byte gUnknown_835B882 -_0805C9F8: - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x2 - bls _0805C9DC - movs r0, 0 -_0805CA04: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end GetPlayerAvatarGraphicsIdByCurrentState - - thumb_func_start SetPlayerAvatarExtraStateTransition -SetPlayerAvatarExtraStateTransition: @ 805CA0C - push {r4,r5,lr} - adds r4, r1, 0 - lsls r0, 24 - lsrs r0, 24 - lsls r4, 24 - lsrs r4, 24 - ldr r5, _0805CA38 @ =gPlayerAvatar - ldrb r1, [r5, 0x7] - bl GetPlayerAvatarStateTransitionByGraphicsId - lsls r0, 24 - lsrs r0, 24 - orrs r0, r4 - ldrb r1, [r5, 0x1] - orrs r0, r1 - strb r0, [r5, 0x1] - bl DoPlayerAvatarTransition - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0805CA38: .4byte gPlayerAvatar - thumb_func_end SetPlayerAvatarExtraStateTransition - - thumb_func_start InitPlayerAvatar -InitPlayerAvatar: @ 805CA3C - push {r4-r6,lr} - mov r6, r9 - mov r5, r8 - push {r5,r6} - sub sp, 0x18 - adds r4, r0, 0 - adds r5, r1, 0 - mov r9, r2 - mov r8, r3 - lsls r4, 16 - lsrs r4, 16 - lsls r5, 16 - lsrs r5, 16 - mov r0, r9 - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - mov r1, r8 - lsls r1, 24 - lsrs r1, 24 - mov r8, r1 - mov r1, sp - movs r0, 0xFF - strb r0, [r1] - movs r0, 0 - mov r1, r8 - bl GetPlayerAvatarGraphicsIdByStateIdAndGender - mov r1, sp - movs r3, 0 - strb r0, [r1, 0x1] - mov r0, sp - lsls r4, 16 - asrs r4, 16 - subs r4, 0x7 - movs r6, 0 - strh r4, [r0, 0x4] - lsls r5, 16 - asrs r5, 16 - subs r5, 0x7 - strh r5, [r0, 0x6] - strb r6, [r0, 0x8] - movs r0, 0xB - strb r0, [r1, 0x9] - mov r2, sp - ldrb r1, [r2, 0xA] - subs r0, 0x1B - ands r0, r1 - strb r0, [r2, 0xA] - mov r0, sp - strb r6, [r0, 0xA] - strh r3, [r0, 0xC] - strh r3, [r0, 0xE] - str r3, [sp, 0x10] - strh r3, [r0, 0x14] - bl SpawnSpecialObjectEvent - adds r5, r0, 0 - lsls r5, 24 - lsrs r5, 24 - lsls r4, r5, 3 - adds r4, r5 - lsls r4, 2 - ldr r0, _0805CAFC @ =gObjectEvents - adds r4, r0 - ldrb r0, [r4, 0x2] - movs r1, 0x1 - orrs r0, r1 - strb r0, [r4, 0x2] - bl CreateWarpArrowSprite - strb r0, [r4, 0x1B] - adds r0, r4, 0 - mov r1, r9 - bl ObjectEventTurn - bl ClearPlayerAvatarInfo - ldr r0, _0805CB00 @ =gPlayerAvatar - strb r6, [r0, 0x2] - strb r6, [r0, 0x3] - strb r5, [r0, 0x5] - ldrb r1, [r4, 0x4] - strb r1, [r0, 0x4] - mov r1, r8 - strb r1, [r0, 0x7] - movs r0, 0x21 - bl SetPlayerAvatarStateMask - add sp, 0x18 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0805CAFC: .4byte gObjectEvents -_0805CB00: .4byte gPlayerAvatar - thumb_func_end InitPlayerAvatar - thumb_func_start sub_805CB04 sub_805CB04: @ 805CB04 push {r4-r6,lr} diff --git a/asm/overworld.s b/asm/overworld.s index 6ab3ef811..f12288d23 100644 --- a/asm/overworld.s +++ b/asm/overworld.s @@ -7871,7 +7871,7 @@ sub_8058878: @ 8058878 lsls r1, 30 lsrs r1, 31 movs r0, 0 - bl sub_805C7C8 + bl GetRivalAvatarGraphicsIdByStateIdAndGender b _080588C6 .align 2, 0 _080588B4: .4byte gLinkPlayerObjectEvents diff --git a/data/field_player_avatar.s b/data/field_player_avatar.s index f7b7a3493..c7a03c7fe 100644 --- a/data/field_player_avatar.s +++ b/data/field_player_avatar.s @@ -3,37 +3,6 @@ .include "constants/constants.inc" .section .rodata .align 2 -gUnknown_835B864:: @ 835B864 - .4byte MetatileBehavior_IsSouthArrowWarp - .4byte MetatileBehavior_IsNorthArrowWarp - .4byte MetatileBehavior_IsWestArrowWarp - .4byte MetatileBehavior_IsEastArrowWarp - -gUnknown_835B874:: @ 835B874 - .byte OBJ_EVENT_GFX_RED_NORMAL, OBJ_EVENT_GFX_GREEN_NORMAL - .byte OBJ_EVENT_GFX_RED_BIKE, OBJ_EVENT_GFX_GREEN_BIKE - .byte OBJ_EVENT_GFX_RED_SURF, OBJ_EVENT_GFX_GREEN_SURF - .byte OBJ_EVENT_GFX_RED_ITEM, OBJ_EVENT_GFX_GREEN_ITEM - .byte OBJ_EVENT_GFX_RED_FISH, OBJ_EVENT_GFX_GREEN_FISH - .byte OBJ_EVENT_GFX_RED_ITEM_COPY, OBJ_EVENT_GFX_GREEN_ITEM_COPY - -gUnknown_835B880:: @ 835B880 - .byte OBJ_EVENT_GFX_RS_BRENDAN - .byte OBJ_EVENT_GFX_RS_MAY - -gUnknown_835B882:: @ 835B882 - @ Male - .byte OBJ_EVENT_GFX_RED_NORMAL, 0x01 - .byte OBJ_EVENT_GFX_RED_BIKE, 0x02 - .byte OBJ_EVENT_GFX_RED_SURF, 0x08 - @ Female - .byte OBJ_EVENT_GFX_GREEN_NORMAL, 0x01 - .byte OBJ_EVENT_GFX_GREEN_BIKE, 0x02 - .byte OBJ_EVENT_GFX_GREEN_SURF, 0x08 - -gUnknown_835B88E:: @ 835B88E - .byte OBJ_EVENT_GFX_RED_VS_SEEKER - .byte OBJ_EVENT_GFX_GREEN_VS_SEEKER gUnknown_835B890:: @ 835B890 .4byte MetatileBehavior_IsSouthArrowWarp diff --git a/include/bike.h b/include/bike.h index 154ffeeee..bdc61ecfe 100644 --- a/include/bike.h +++ b/include/bike.h @@ -8,5 +8,7 @@ s16 GetPlayerSpeed(void); void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys); bool32 IsRunningDisallowed(u8 metatileBehavior); +void Bike_HandleBumpySlopeJump(void); +void Bike_UpdateBikeCounterSpeed(u8 counter); #endif //GUARD_BIKE_H diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 8b2944578..12d3305e7 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -206,5 +206,16 @@ u8 sub_8064008(u32 direction); u8 GetPlayerRunMovementAction(u32 direction); u8 GetPlayerRunSlowMovementAction(u32 direction); u8 GetWalkSlowMovementAction(u32 direction); +u8 sub_80640E4(u32 direction); +u8 GetAcroWheelieFaceDirectionMovementAction(u32 direction); +u8 GetAcroPopWheelieFaceDirectionMovementAction(u32 direction); +u8 GetAcroEndWheelieFaceDirectionMovementAction(u32 direction); +u8 GetAcroWheelieHopFaceDirectionMovementAction(u32 direction); +u8 GetAcroWheelieHopDirectionMovementAction(u32 direction); +u8 GetAcroWheelieJumpDirectionMovementAction(u32 direction); +u8 GetJumpInPlaceTurnAroundMovementAction(u32 direction); +u8 GetAcroWheelieInPlaceDirectionMovementAction(u32 direction); +u8 GetAcroPopWheelieMoveDirectionMovementAction(u32 direction); +u8 GetAcroWheelieMoveDirectionMovementAction(u32 direction); #endif // GUARD_EVENT_OBJECT_MOVEMENT_H diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index 76271b5cf..7440bd0bd 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -36,8 +36,9 @@ bool32 sub_805DAD0(void); bool32 sub_805DC24(void); bool8 PartyHasMonWithSurf(void); bool8 IsPlayerSurfingNorth(void); -void player_get_pos_including_state_based_drift(s16 *x, s16 *y); +u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y); void sub_805CBE8(void); -u8 sub_805C7C8(u8 state, u8 gender); +u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender); +u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender); #endif //GUARD_FIELD_PLAYER_AVATAR_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index f5660a8a4..38391bf27 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -278,14 +278,25 @@ struct ObjectEventGraphicsInfo /*0x20*/ const union AffineAnimCmd *const *affineAnims; }; -#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << 0) -#define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << 1) -#define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << 2) -#define PLAYER_AVATAR_FLAG_SURFING (1 << 3) -#define PLAYER_AVATAR_FLAG_4 (1 << 4) -#define PLAYER_AVATAR_FLAG_FORCED_MVMT_DISABLED (1 << 5) -#define PLAYER_AVATAR_FLAG_MVMT_IS_FORCED (1 << 6) -#define PLAYER_AVATAR_FLAG_DASH (1 << 7) +enum { + PLAYER_AVATAR_STATE_NORMAL, + PLAYER_AVATAR_STATE_MACH_BIKE, + PLAYER_AVATAR_STATE_ACRO_BIKE, + PLAYER_AVATAR_STATE_SURFING, + PLAYER_AVATAR_STATE_UNDERWATER, + PLAYER_AVATAR_STATE_FIELD_MOVE, + PLAYER_AVATAR_STATE_FISHING, + PLAYER_AVATAR_STATE_WATERING, +}; + +#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << PLAYER_AVATAR_STATE_NORMAL) +#define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << PLAYER_AVATAR_STATE_MACH_BIKE) +#define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << PLAYER_AVATAR_STATE_ACRO_BIKE) +#define PLAYER_AVATAR_FLAG_SURFING (1 << PLAYER_AVATAR_STATE_SURFING) +#define PLAYER_AVATAR_FLAG_4 (1 << PLAYER_AVATAR_STATE_UNDERWATER) +#define PLAYER_AVATAR_FLAG_FORCED_MVMT_DISABLED (1 << PLAYER_AVATAR_STATE_FIELD_MOVE) +#define PLAYER_AVATAR_FLAG_MVMT_IS_FORCED (1 << PLAYER_AVATAR_STATE_FISHING) +#define PLAYER_AVATAR_FLAG_DASH (1 << PLAYER_AVATAR_STATE_WATERING) enum { diff --git a/src/event_object_movement.c b/src/event_object_movement.c index dbde0cb93..7fde3ff21 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -4628,7 +4628,7 @@ dirn_to_anim(GetPlayerRunSlowMovementAction, gUnknown_83A6528); dirn_to_anim(sub_80640E4, gUnknown_83A652D); dirn_to_anim(GetJump2MovementAction, gUnknown_83A6532); dirn_to_anim(GetJumpInPlaceMovementAction, gUnknown_83A6537); -dirn_to_anim(sub_8064168, gUnknown_83A653C); +dirn_to_anim(GetJumpInPlaceTurnAroundMovementAction, gUnknown_83A653C); dirn_to_anim(GetJumpMovementAction, gUnknown_83A6541); dirn_to_anim(sub_80641C0, gUnknown_83A6546); dirn_to_anim(sub_80641EC, gUnknown_83A654B); @@ -4642,15 +4642,15 @@ bool8 ObjectEventFaceOppositeDirection(struct ObjectEvent *objectEvent, u8 direc return ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetOppositeDirection(direction))); } -dirn_to_anim(sub_80642F4, gUnknown_83A6564); -dirn_to_anim(sub_8064320, gUnknown_83A6569); -dirn_to_anim(sub_806434C, gUnknown_83A656E); -dirn_to_anim(sub_8064378, gUnknown_83A6573); -dirn_to_anim(sub_80643A4, gUnknown_83A6578); -dirn_to_anim(sub_80643D0, gUnknown_83A657D); -dirn_to_anim(sub_80643FC, gUnknown_83A6582); -dirn_to_anim(sub_8064428, gUnknown_83A6587); -dirn_to_anim(sub_8064454, gUnknown_83A658C); +dirn_to_anim(GetAcroWheelieFaceDirectionMovementAction, gUnknown_83A6564); +dirn_to_anim(GetAcroPopWheelieFaceDirectionMovementAction, gUnknown_83A6569); +dirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, gUnknown_83A656E); +dirn_to_anim(GetAcroWheelieHopFaceDirectionMovementAction, gUnknown_83A6573); +dirn_to_anim(GetAcroWheelieHopDirectionMovementAction, gUnknown_83A6578); +dirn_to_anim(GetAcroWheelieJumpDirectionMovementAction, gUnknown_83A657D); +dirn_to_anim(GetAcroWheelieInPlaceDirectionMovementAction, gUnknown_83A6582); +dirn_to_anim(GetAcroPopWheelieMoveDirectionMovementAction, gUnknown_83A6587); +dirn_to_anim(GetAcroWheelieMoveDirectionMovementAction, gUnknown_83A658C); u8 GetOppositeDirection(u8 direction) { diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 61d6f930f..ae0ee6942 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -5,9 +5,11 @@ #include "event_object_movement.h" #include "fieldmap.h" #include "field_control_avatar.h" +#include "field_effect_helpers.h" #include "field_player_avatar.h" #include "metatile_behavior.h" #include "overworld.h" +#include "party_menu.h" #include "quest_log.h" #include "quest_log_player.h" #include "constants/event_object_movement.h" @@ -15,6 +17,8 @@ #include "constants/songs.h" #include "constants/flags.h" #include "constants/metatile_behaviors.h" +#include "constants/species.h" +#include "constants/moves.h" EWRAM_DATA struct ObjectEvent * gUnknown_2036E30 = NULL; EWRAM_DATA bool8 gUnknown_2036E34 = FALSE; @@ -77,15 +81,17 @@ void PlayerGoSpeed2(u8 direction); void PlayerGoSpeed1(u8 direction); void PlayerGoSlow(u8 direction); void PlayerRideWaterCurrent(u8 direction); -void sub_805C438(u8 direction); -void CreateStopSurfingTask(u8 direction); -void StartStrengthAnim(u8 objectEventId, u8 direction); void PlayerNotOnBikeCollide(u8 direction); void PlayerFaceDirection(u8 direction); void PlayerTurnInPlace(u8 direction); void PlayerJumpLedge(u8 direction); +void PlayCollisionSoundIfNotFacingWarp(u8 direction); void PlayerGoSpin(u8 direction); void sub_805C2CC(u8 metatileBehavior); +bool8 MetatileAtCoordsIsWaterTile(s16 x, s16 y); +bool8 player_should_look_direction_be_enforced_upon_movement(void); +void CreateStopSurfingTask(u8 direction); +void StartStrengthAnim(u8 objectEventId, u8 direction); void sub_805CC40(struct ObjectEvent * playerObjEvent); void DoPlayerMatJump(void); void DoPlayerMatSpin(void); @@ -840,13 +846,13 @@ void PlayerRunSlow(u8 direction) void PlayerOnBikeCollide(u8 direction) { - sub_805C438(direction); + PlayCollisionSoundIfNotFacingWarp(direction); PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(direction), 2); } void PlayerNotOnBikeCollide(u8 direction) { - sub_805C438(direction); + PlayCollisionSoundIfNotFacingWarp(direction); PlayerSetAnimId(GetStepInPlaceDelay32AnimId(direction), 2); } @@ -864,3 +870,421 @@ void PlayerTurnInPlace(u8 direction) { PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(direction), 1); } + +void PlayerJumpLedge(u8 direction) +{ + PlaySE(SE_DANSA); + PlayerSetAnimId(GetJump2MovementAction(direction), 8); +} + +void sub_805C260(void) +{ + PlayerSetAnimId(MOVEMENT_ACTION_0x9F, 0); +} + +void sub_805C270(void) +{ + if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING) + { + if (player_should_look_direction_be_enforced_upon_movement()) + PlayerForceSetHeldMovement(GetFaceDirectionMovementAction(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)); + } +} + +void PlayerGoSpin(u8 direction) +{ + PlayerSetAnimId(sub_80640E4(direction), 3); +} + +void sub_805C2CC(u8 metatileBehavior) +{ + int i; + + for (i = 0; sForcedMovementFuncs[i].unk0 != NULL; i++) + { + if (sForcedMovementFuncs[i].unk0(metatileBehavior)) + sForcedMovementFuncs[i].unk4(); + } +} + +void PlayerIdleWheelie(u8 direction) +{ + PlayerSetAnimId(GetAcroWheelieFaceDirectionMovementAction(direction), 1); +} + +void PlayerStartWheelie(u8 direction) +{ + PlayerSetAnimId(GetAcroPopWheelieFaceDirectionMovementAction(direction), 1); +} + +void PlayerEndWheelie(u8 direction) +{ + PlayerSetAnimId(GetAcroEndWheelieFaceDirectionMovementAction(direction), 1); +} + +void PlayerStandingHoppingWheelie(u8 direction) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(GetAcroWheelieHopFaceDirectionMovementAction(direction), 1); +} + +void PlayerMovingHoppingWheelie(u8 direction) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(GetAcroWheelieHopDirectionMovementAction(direction), 2); +} + +void PlayerLedgeHoppingWheelie(u8 direction) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(GetAcroWheelieJumpDirectionMovementAction(direction), 8); +} + +void PlayerAcroTurnJump(u8 direction) +{ + PlaySE(SE_JITE_PYOKO); + PlayerSetAnimId(GetJumpInPlaceTurnAroundMovementAction(direction), 1); +} + +void PlayerAcroWheelieCollide(u8 direction) +{ + PlaySE(SE_WALL_HIT); + PlayerSetAnimId(GetAcroWheelieInPlaceDirectionMovementAction(direction), 2); +} + +void sub_805C408(u8 direction) +{ + PlayerSetAnimId(GetAcroPopWheelieMoveDirectionMovementAction(direction), 2); +} + +void sub_805C420(u8 direction) +{ + PlayerSetAnimId(GetAcroWheelieMoveDirectionMovementAction(direction), 2); +} + +bool8 (*const sArrowWarpMetatileBehaviorChecks[])(u8) = { + MetatileBehavior_IsSouthArrowWarp, + MetatileBehavior_IsNorthArrowWarp, + MetatileBehavior_IsWestArrowWarp, + MetatileBehavior_IsEastArrowWarp +}; + +void PlayCollisionSoundIfNotFacingWarp(u8 direction) +{ + s16 x, y; + u8 metatileBehavior = gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior; + + if (!sArrowWarpMetatileBehaviorChecks[direction - 1](metatileBehavior)) + { + if (direction == DIR_WEST) + { + if (MetatileBehavior_IsUnknownWarp6D(metatileBehavior) || MetatileBehavior_IsUnknownWarp6F(metatileBehavior)) + return; + } + if (direction == DIR_EAST) + { + if (MetatileBehavior_IsUnknownWarp6C(metatileBehavior) || MetatileBehavior_IsUnknownWarp6E(metatileBehavior)) + return; + } + if (direction == DIR_NORTH) + { + PlayerGetDestCoords(&x, &y); + MoveCoords(DIR_NORTH, &x, &y); + metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsWarpDoor(metatileBehavior)) + return; + } + PlaySE(SE_WALL_HIT); + } +} + +void GetXYCoordsOneStepInFrontOfPlayer(s16 *x, s16 *y) +{ + *x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; + *y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; + MoveCoords(GetPlayerFacingDirection(), x, y); +} + +void PlayerGetDestCoords(s16 *x, s16 *y) +{ + *x = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; + *y = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; +} + +u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y) +{ + struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId]; + + if (object->heldMovementActive && !object->heldMovementFinished && !gSprites[object->spriteId].data[2]) + { + *x = object->currentCoords.x; + *y = object->currentCoords.y; + + switch (object->movementActionId) + { + case MOVEMENT_ACTION_WALK_NORMAL_DOWN: + case MOVEMENT_ACTION_PLAYER_RUN_DOWN: + (*y)++; + return TRUE; + case MOVEMENT_ACTION_WALK_NORMAL_UP: + case MOVEMENT_ACTION_PLAYER_RUN_UP: + (*y)--; + return TRUE; + case MOVEMENT_ACTION_WALK_NORMAL_LEFT: + case MOVEMENT_ACTION_PLAYER_RUN_LEFT: + (*x)--; + return TRUE; + case MOVEMENT_ACTION_WALK_NORMAL_RIGHT: + case MOVEMENT_ACTION_PLAYER_RUN_RIGHT: + (*x)++; + return TRUE; + } + } + + *x = -1; + *y = -1; + return FALSE; +} + +u8 GetPlayerFacingDirection(void) +{ + return gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; +} + +u8 GetPlayerMovementDirection(void) +{ + return gObjectEvents[gPlayerAvatar.objectEventId].movementDirection; +} + +u8 PlayerGetZCoord(void) +{ + return gObjectEvents[gPlayerAvatar.objectEventId].previousElevation; +} + +void MovePlayerToMapCoords(s16 x, s16 y) +{ + MoveObjectEventToMapCoords(&gObjectEvents[gPlayerAvatar.objectEventId], x, y); +} + +u8 TestPlayerAvatarFlags(u8 bm) +{ + return gPlayerAvatar.flags & bm; +} + +u8 GetPlayerAvatarFlags(void) +{ + return gPlayerAvatar.flags; +} + +u8 GetPlayerAvatarObjectId(void) +{ + return gPlayerAvatar.spriteId; +} + +void sub_805C774(void) +{ + ForcedMovement_None(); +} + +void sub_805C780(void) +{ + struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + + npc_clear_strange_bits(playerObjEvent); + SetObjectEventDirection(playerObjEvent, playerObjEvent->facingDirection); + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + Bike_HandleBumpySlopeJump(); + Bike_UpdateBikeCounterSpeed(0); + } +} + +const u8 sPlayerAvatarGfxIds[][2] = { + {OBJ_EVENT_GFX_RED_NORMAL, OBJ_EVENT_GFX_GREEN_NORMAL}, + {OBJ_EVENT_GFX_RED_BIKE, OBJ_EVENT_GFX_GREEN_BIKE}, + {OBJ_EVENT_GFX_RED_SURF, OBJ_EVENT_GFX_GREEN_SURF}, + {OBJ_EVENT_GFX_RED_ITEM, OBJ_EVENT_GFX_GREEN_ITEM}, + {OBJ_EVENT_GFX_RED_FISH, OBJ_EVENT_GFX_GREEN_FISH}, + {OBJ_EVENT_GFX_RED_ITEM_COPY, OBJ_EVENT_GFX_GREEN_ITEM_COPY}, +}; + +const u8 sHoennLinkPartnerGfxIds[] = { + OBJ_EVENT_GFX_RS_BRENDAN, + OBJ_EVENT_GFX_RS_MAY +}; + +u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +{ + return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gender); +} + +u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +{ + return sPlayerAvatarGfxIds[state][gender]; +} + +u8 GetHoennLinkPartnerGraphicsIdByGender(u8 gender) +{ + return sHoennLinkPartnerGfxIds[gender]; +} + +u8 GetPlayerAvatarGraphicsIdByStateId(u8 state) +{ + return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); +} + +u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) +{ + switch (gfxId) + { + case OBJ_EVENT_GFX_GREEN_NORMAL: + case OBJ_EVENT_GFX_GREEN_BIKE: + case OBJ_EVENT_GFX_GREEN_SURF: + case OBJ_EVENT_GFX_GREEN_ITEM: + case OBJ_EVENT_GFX_GREEN_FISH: + return FEMALE; + default: + return MALE; + } +} + +bool8 PartyHasMonWithSurf(void) +{ + u8 i; + + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + { + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) + break; + if (MonKnowsMove(&gPlayerParty[i], MOVE_SURF)) + return TRUE; + } + } + return FALSE; +} + +bool8 IsPlayerSurfingNorth(void) +{ + if (GetPlayerMovementDirection() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + return TRUE; + else + return FALSE; +} + +bool8 IsPlayerFacingSurfableFishableWater(void) +{ + struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + s16 x = playerObjEvent->currentCoords.x; + s16 y = playerObjEvent->currentCoords.y; + + MoveCoords(playerObjEvent->facingDirection, &x, &y); + if (GetCollisionAtCoords(playerObjEvent, x, y, playerObjEvent->facingDirection) == COLLISION_ELEVATION_MISMATCH + && PlayerGetZCoord() == 3 + && MetatileAtCoordsIsWaterTile(x, y) == TRUE) + return TRUE; + else + return FALSE; +} + +bool8 MetatileAtCoordsIsWaterTile(s16 x, s16 y) +{ + return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, METATILE_ATTRIBUTE_TERRAIN), TILE_TERRAIN_WATER); +} + +void ClearPlayerAvatarInfo(void) +{ + gPlayerAvatar = (struct PlayerAvatar){}; +} + +void SetPlayerAvatarStateMask(u8 flags) +{ + gPlayerAvatar.flags &= (PLAYER_AVATAR_FLAG_DASH | PLAYER_AVATAR_FLAG_MVMT_IS_FORCED | PLAYER_AVATAR_FLAG_FORCED_MVMT_DISABLED); + gPlayerAvatar.flags |= flags; +} + +const u8 gUnknown_835B882[][3][2] = { + // Male + { + {OBJ_EVENT_GFX_RED_NORMAL, PLAYER_AVATAR_FLAG_ON_FOOT}, + {OBJ_EVENT_GFX_RED_BIKE, PLAYER_AVATAR_FLAG_MACH_BIKE}, + {OBJ_EVENT_GFX_RED_SURF, PLAYER_AVATAR_FLAG_SURFING}, + }, + // Female + { + {OBJ_EVENT_GFX_GREEN_NORMAL, PLAYER_AVATAR_FLAG_ON_FOOT}, + {OBJ_EVENT_GFX_GREEN_BIKE, PLAYER_AVATAR_FLAG_MACH_BIKE}, + {OBJ_EVENT_GFX_GREEN_SURF, PLAYER_AVATAR_FLAG_SURFING}, + } +}; + +u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender) +{ + u8 i; + + for (i = 0; i < NELEMS(*gUnknown_835B882); i++) + { + if (gUnknown_835B882[gender][i][0] == graphicsId) + return gUnknown_835B882[gender][i][1]; + } + return 1; +} + +u8 GetPlayerAvatarGraphicsIdByCurrentState(void) +{ + u8 i; + u8 r5 = gPlayerAvatar.flags; + + for (i = 0; i < NELEMS(*gUnknown_835B882); i++) + { + if (gUnknown_835B882[gPlayerAvatar.gender][i][1] & r5) + return gUnknown_835B882[gPlayerAvatar.gender][i][0]; + } + return 0; +} + +const u8 gUnknown_835B88E[] = { + OBJ_EVENT_GFX_RED_VS_SEEKER, + OBJ_EVENT_GFX_GREEN_VS_SEEKER +}; + +void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 b) +{ + u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(graphicsId, gPlayerAvatar.gender); + + gPlayerAvatar.unk1 |= unk | b; + DoPlayerAvatarTransition(); +} + +void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) +{ + struct ObjectEventTemplate playerObjEventTemplate; + u8 objectEventId; + struct ObjectEvent *objectEvent; + + playerObjEventTemplate.localId = OBJ_EVENT_ID_PLAYER; + playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, gender); + playerObjEventTemplate.x = x - 7; + playerObjEventTemplate.y = y - 7; + playerObjEventTemplate.elevation = 0; + playerObjEventTemplate.movementType = MOVEMENT_TYPE_PLAYER; + playerObjEventTemplate.movementRangeX = 0; + playerObjEventTemplate.movementRangeY = 0; + playerObjEventTemplate.trainerType = 0; + playerObjEventTemplate.trainerRange_berryTreeId = 0; + playerObjEventTemplate.script = NULL; + playerObjEventTemplate.flagId = 0; + objectEventId = SpawnSpecialObjectEvent(&playerObjEventTemplate); + objectEvent = &gObjectEvents[objectEventId]; + objectEvent->isPlayer = 1; + objectEvent->warpArrowSpriteId = CreateWarpArrowSprite(); + ObjectEventTurn(objectEvent, direction); + ClearPlayerAvatarInfo(); + gPlayerAvatar.runningState = NOT_MOVING; + gPlayerAvatar.tileTransitionState = T_NOT_MOVING; + gPlayerAvatar.objectEventId = objectEventId; + gPlayerAvatar.spriteId = objectEvent->spriteId; + gPlayerAvatar.gender = gender; + SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_FORCED_MVMT_DISABLED | PLAYER_AVATAR_FLAG_ON_FOOT); +} diff --git a/src/naming_screen.c b/src/naming_screen.c index b8b121535..1a41c8c0b 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1300,7 +1300,7 @@ static void NamingScreen_CreatePlayerIcon(void) u8 rivalGfxId; u8 spriteId; - rivalGfxId = sub_805C7C8(0, sNamingScreenData->monSpecies); + rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, sNamingScreenData->monSpecies); spriteId = AddPseudoObjectEvent(rivalGfxId, SpriteCallbackDummy, 0x38, 0x25, 0); gSprites[spriteId].oam.priority = 3; StartSpriteAnim(&gSprites[spriteId], 4); |