From dce2bdc1596b68bb4a9e9c9ed43b99a57fbde915 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 20 Mar 2022 05:39:30 +0200 Subject: [PATCH] Decompile the rest of bird --- asm/object/bird.s | 698 --------------------------------------- data/const/object/bird.s | 34 -- linker.ld | 3 +- src/object/bird.c | 305 +++++++++++++++-- 4 files changed, 282 insertions(+), 758 deletions(-) delete mode 100644 asm/object/bird.s delete mode 100644 data/const/object/bird.s diff --git a/asm/object/bird.s b/asm/object/bird.s deleted file mode 100644 index fce0c464..00000000 --- a/asm/object/bird.s +++ /dev/null @@ -1,698 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_0809D1F0 -sub_0809D1F0: @ 0x0809D1F0 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r5, r0, #0 - ldrb r0, [r5, #0xc] - mov sb, r0 - cmp r0, #0 - beq _0809D224 - cmp r0, #1 - beq _0809D2B0 - bl sub_08078B48 - ldr r2, _0809D220 @ =gPlayerEntity - ldrb r1, [r2, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2, #0x18] - movs r1, #0x68 - adds r1, r1, r5 - mov r8, r1 - b _0809D3A8 - .align 2, 0 -_0809D220: .4byte gPlayerEntity -_0809D224: - ldrb r1, [r5, #0xe] - cmp r1, #0 - beq _0809D234 - movs r0, #0xff - strb r0, [r5, #0x1e] - subs r0, r1, #1 - strb r0, [r5, #0xe] - b _0809D488 -_0809D234: - movs r1, #1 - strb r1, [r5, #0xc] - mov r2, sb - str r2, [r5, #0x20] - ldr r0, _0809D2A0 @ =0xFFEC0000 - str r0, [r5, #0x34] - movs r0, #0xc0 - lsls r0, r0, #1 - strh r0, [r5, #0x24] - movs r0, #8 - strb r0, [r5, #0x15] - adds r0, r5, #0 - adds r0, #0x38 - strb r1, [r0] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] - ldrb r2, [r5, #0x19] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r2 - strb r0, [r5, #0x19] - ldrb r0, [r5, #0x1b] - ands r1, r0 - movs r0, #0x40 - orrs r1, r0 - strb r1, [r5, #0x1b] - ldr r0, _0809D2A4 @ =gRoomControls - ldrh r0, [r0, #0xa] - strh r0, [r5, #0x2e] - ldr r0, _0809D2A8 @ =gPlayerEntity - ldrh r0, [r0, #0x32] - strh r0, [r5, #0x32] - mov r3, sb - str r3, [r5, #0x54] - adds r0, r5, #0 - movs r1, #6 - bl SetDefaultPriority - adds r0, r5, #0 - movs r1, #0 - bl InitAnimationForceUpdate - ldr r0, _0809D2AC @ =0x00000123 - bl SoundReq - movs r0, #0x68 - adds r0, r0, r5 - mov r8, r0 - b _0809D3A8 - .align 2, 0 -_0809D2A0: .4byte 0xFFEC0000 -_0809D2A4: .4byte gRoomControls -_0809D2A8: .4byte gPlayerEntity -_0809D2AC: .4byte 0x00000123 -_0809D2B0: - ldr r6, _0809D430 @ =gPlayerEntity - adds r0, r6, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r5, #0 - adds r0, #0x38 - strb r1, [r0] - ldrh r0, [r5, #0x24] - adds r0, #8 - strh r0, [r5, #0x24] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r1, #0xc0 - lsls r1, r1, #2 - mov sl, r1 - cmp r0, sl - ble _0809D2D6 - mov r2, sl - strh r2, [r5, #0x24] -_0809D2D6: - ldrb r1, [r6, #0x10] - movs r0, #0x80 - ands r0, r1 - movs r3, #0x68 - adds r3, r3, r5 - mov r8, r3 - cmp r0, #0 - beq _0809D3A8 - ldr r0, _0809D434 @ =gMessage - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _0809D3A8 - ldrb r0, [r6, #0xc] - cmp r0, #0x1c - beq _0809D3A8 - cmp r0, #6 - beq _0809D3A8 - cmp r0, #9 - beq _0809D3A8 - ldr r7, _0809D438 @ =gPlayerState - adds r0, r7, #0 - adds r0, #0xa8 - ldrb r0, [r0] - cmp r0, #0x18 - beq _0809D3A8 - cmp r0, #0xb - beq _0809D3A8 - cmp r0, #8 - beq _0809D3A8 - bl sub_08079F8C - cmp r0, #0 - beq _0809D3A8 - adds r0, r5, #0 - adds r1, r6, #0 - movs r2, #0xe - movs r3, #0xe - bl EntityInRectRadius - cmp r0, #0 - beq _0809D3A8 - movs r1, #0x36 - ldrsh r0, [r6, r1] - movs r2, #0x36 - ldrsh r1, [r5, r2] - subs r0, r0, r1 - subs r0, #8 - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0x1f - bhi _0809D3A8 - adds r0, r6, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - beq _0809D3A8 - movs r0, #0x95 - movs r1, #0xa - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _0809D3A8 - str r4, [r5, #0x54] - movs r0, #2 - strb r0, [r5, #0xc] - movs r0, #8 - strb r0, [r5, #0xe] - mov r3, sl - strh r3, [r5, #0x24] - movs r0, #0xe0 - lsls r0, r0, #8 - mov r1, r8 - strh r0, [r1] - bl sub_08079184 - bl sub_08078B48 - bl ResetPlayerAnimationAndAction - bl sub_08077B20 - adds r0, r7, #0 - adds r0, #0x26 - movs r2, #0 - strb r2, [r0] - strb r2, [r7, #2] - ldrb r1, [r6, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r6, #0x10] - ldrb r1, [r6, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r6, #0x18] - ldr r1, _0809D43C @ =gPriorityHandler - movs r0, #6 - strb r0, [r1] - ldr r0, _0809D440 @ =gUnk_02034490 - mov r3, sb - strb r3, [r0] -_0809D3A8: - adds r0, r5, #0 - bl LinearMoveUpdate - mov r0, r8 - movs r2, #0 - ldrsh r1, [r0, r2] - adds r0, r5, #0 - bl GravityUpdate - adds r0, r5, #0 - bl UpdateAnimationSingleFrame - ldr r4, [r5, #0x54] - cmp r4, #0 - beq _0809D454 - ldr r2, _0809D430 @ =gPlayerEntity - movs r3, #0x2e - ldrsh r1, [r2, r3] - movs r3, #0x2e - ldrsh r0, [r5, r3] - subs r0, #8 - cmp r1, r0 - bge _0809D3DA - movs r0, #0 - strb r0, [r5, #0xe] -_0809D3DA: - ldrb r0, [r5, #0xe] - cmp r0, #0 - bne _0809D448 - ldr r2, _0809D444 @ =0xFFF80000 - adds r0, r5, #0 - adds r1, r4, #0 - movs r3, #0 - bl PositionRelative - ldrh r0, [r4, #0x36] - adds r0, #0x18 - strh r0, [r4, #0x36] - adds r0, r5, #0 - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - adds r3, r4, #0 - adds r3, #0x29 - lsrs r1, r1, #0x1d - ldrb r2, [r3] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - ldrb r2, [r5, #0x19] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r3, [r4, #0x19] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r3 - orrs r0, r2 - strb r0, [r4, #0x19] - ldrb r0, [r5, #0x1b] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r4, #0x1b] - ands r1, r2 - orrs r1, r0 - strb r1, [r4, #0x1b] - b _0809D454 - .align 2, 0 -_0809D430: .4byte gPlayerEntity -_0809D434: .4byte gMessage -_0809D438: .4byte gPlayerState -_0809D43C: .4byte gPriorityHandler -_0809D440: .4byte gUnk_02034490 -_0809D444: .4byte 0xFFF80000 -_0809D448: - subs r0, #1 - strb r0, [r5, #0xe] - adds r0, r2, #0 - adds r1, r4, #0 - bl CopyPosition -_0809D454: - adds r0, r5, #0 - bl CheckOnScreen - cmp r0, #0 - bne _0809D488 - ldrb r0, [r5, #0xc] - cmp r0, #2 - bne _0809D478 - ldr r0, _0809D494 @ =gSave - ldr r1, [r0, #0x40] - movs r2, #0x80 - lsls r2, r2, #0x15 - orrs r1, r2 - str r1, [r0, #0x40] - movs r0, #9 - movs r1, #0 - bl MenuFadeIn -_0809D478: - ldr r4, [r5, #0x54] - cmp r4, #0 - beq _0809D484 - adds r0, r4, #0 - bl DeleteEntityAny -_0809D484: - bl DeleteThisEntity -_0809D488: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0809D494: .4byte gSave - - thumb_func_start sub_0809D498 -sub_0809D498: @ 0x0809D498 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r0, #0 - ldrb r0, [r5, #0xc] - cmp r0, #0 - bne _0809D548 - movs r2, #1 - movs r3, #1 - strb r3, [r5, #0xc] - ldrb r1, [r5, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - orrs r0, r2 - strb r0, [r5, #0x18] - ldr r0, _0809D534 @ =0xFFFD8000 - str r0, [r5, #0x20] - ldr r0, _0809D538 @ =0xFFB4C000 - str r0, [r5, #0x34] - adds r4, r5, #0 - adds r4, #0x68 - movs r0, #0xf0 - lsls r0, r0, #8 - strh r0, [r4] - movs r0, #0xc0 - lsls r0, r0, #2 - strh r0, [r5, #0x24] - movs r0, #8 - strb r0, [r5, #0x15] - adds r0, r5, #0 - adds r0, #0x38 - strb r3, [r0] - adds r6, r5, #0 - adds r6, #0x29 - ldrb r1, [r6] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r6] - ldrb r2, [r5, #0x19] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r2 - strb r0, [r5, #0x19] - ldrb r0, [r5, #0x1b] - ands r1, r0 - movs r0, #0x40 - orrs r1, r0 - strb r1, [r5, #0x1b] - adds r0, r5, #0 - movs r1, #6 - bl SetDefaultPriority - ldr r0, _0809D53C @ =gRoomControls - ldrh r0, [r0, #0xa] - strh r0, [r5, #0x2e] - ldr r0, _0809D540 @ =gPlayerEntity - ldrh r0, [r0, #0x32] - strh r0, [r5, #0x32] - ldr r0, _0809D544 @ =0x00000123 - bl SoundReq - ldrb r1, [r6] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #0x10 - orrs r0, r1 - strb r0, [r6] - adds r0, r5, #0 - movs r1, #0 - bl InitAnimationForceUpdate - bl sub_08078B48 - adds r7, r4, #0 - b _0809D62E - .align 2, 0 -_0809D534: .4byte 0xFFFD8000 -_0809D538: .4byte 0xFFB4C000 -_0809D53C: .4byte gRoomControls -_0809D540: .4byte gPlayerEntity -_0809D544: .4byte 0x00000123 -_0809D548: - adds r7, r5, #0 - adds r7, #0x68 - cmp r0, #1 - bne _0809D62E - ldr r6, _0809D658 @ =gPlayerEntity - ldrb r1, [r6, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - mov r8, r0 - ands r0, r1 - strb r0, [r6, #0x18] - ldr r4, [r5, #0x54] - cmp r4, #0 - beq _0809D5B0 - ldr r2, _0809D65C @ =0xFFF80000 - adds r0, r5, #0 - adds r1, r4, #0 - movs r3, #0 - bl PositionRelative - ldrh r0, [r4, #0x36] - adds r0, #0x18 - strh r0, [r4, #0x36] - adds r0, r5, #0 - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - adds r3, r4, #0 - adds r3, #0x29 - lsrs r1, r1, #0x1d - ldrb r2, [r3] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - ldrb r2, [r5, #0x19] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r3, [r4, #0x19] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r3 - orrs r0, r2 - strb r0, [r4, #0x19] - ldrb r0, [r5, #0x1b] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r4, #0x1b] - ands r1, r2 - orrs r1, r0 - strb r1, [r4, #0x1b] -_0809D5B0: - bl sub_08078B48 - ldr r3, _0809D660 @ =gRoomControls - movs r1, #0xa - ldrsh r0, [r3, r1] - adds r0, #0x78 - movs r2, #0x2e - ldrsh r1, [r5, r2] - cmp r0, r1 - bge _0809D62E - ldrb r0, [r5, #0xc] - adds r0, #1 - strb r0, [r5, #0xc] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #8 - orrs r0, r1 - strb r0, [r2] - cmp r4, #0 - beq _0809D5E6 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] -_0809D5E6: - str r6, [r3, #0x30] - ldrb r1, [r6, #0x18] - mov r0, r8 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r6, #0x18] - bl ResetPlayerAnimationAndAction - bl ResetPlayerEventPriority - ldr r1, _0809D664 @ =gUnk_02034490 - movs r0, #0 - strb r0, [r1] - movs r0, #0x52 - bl CheckGlobalFlag - cmp r0, #0 - bne _0809D62E - movs r0, #0x69 - movs r1, #0 - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _0809D62E - ldr r1, _0809D668 @ =script_EzloTalkOcarina - bl StartCutscene - adds r1, r4, #0 - adds r1, #0x84 - str r0, [r1] - movs r0, #0x52 - bl SetGlobalFlag -_0809D62E: - adds r0, r5, #0 - bl LinearMoveUpdate - movs r0, #0 - ldrsh r1, [r7, r0] - adds r0, r5, #0 - bl GravityUpdate - adds r0, r5, #0 - bl UpdateAnimationSingleFrame - adds r0, r5, #0 - bl CheckOnScreen - cmp r0, #0 - bne _0809D652 - bl DeleteThisEntity -_0809D652: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0809D658: .4byte gPlayerEntity -_0809D65C: .4byte 0xFFF80000 -_0809D660: .4byte gRoomControls -_0809D664: .4byte gUnk_02034490 -_0809D668: .4byte script_EzloTalkOcarina - - thumb_func_start sub_0809D66C -sub_0809D66C: @ 0x0809D66C - push {r4, lr} - adds r4, r0, #0 - ldr r0, _0809D694 @ =gPlayerEntity - ldrb r1, [r0, #0x1a] - lsls r1, r1, #0x1c - lsrs r1, r1, #0x1c - ldrb r2, [r4, #0x1a] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x1a] - ldrb r0, [r4, #0xc] - cmp r0, #1 - beq _0809D6EC - cmp r0, #1 - bgt _0809D698 - cmp r0, #0 - beq _0809D6A2 - b _0809D6FE - .align 2, 0 -_0809D694: .4byte gPlayerEntity -_0809D698: - cmp r0, #2 - beq _0809D6F4 - cmp r0, #3 - beq _0809D6FA - b _0809D6FE -_0809D6A2: - movs r3, #1 - movs r2, #1 - strb r2, [r4, #0xc] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - orrs r0, r3 - strb r0, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x38 - strb r2, [r0] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] - ldrb r2, [r4, #0x19] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r2 - strb r0, [r4, #0x19] - ldrb r0, [r4, #0x1b] - ands r1, r0 - movs r0, #0x40 - orrs r1, r0 - strb r1, [r4, #0x1b] - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority - adds r0, r4, #0 - movs r1, #0xe0 - bl InitAnimationForceUpdate -_0809D6EC: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - b _0809D6FE -_0809D6F4: - movs r0, #3 - strb r0, [r4, #0xc] - b _0809D6FE -_0809D6FA: - bl DeleteThisEntity -_0809D6FE: - pop {r4, pc} - - thumb_func_start CreateBird -CreateBird: @ 0x0809D700 - push {r4, lr} - sub sp, #4 -.ifdef EU - bl AreaIsOverworld @ TODO correct function? -.else - bl AreaAllowsWarp -.endif - cmp r0, #0 - beq _0809D732 - movs r0, #0 - str r0, [sp] - movs r0, #6 - movs r1, #0x95 - movs r2, #6 - movs r3, #8 - bl FindEntity - adds r4, r0, #0 - cmp r4, #0 - bne _0809D732 - movs r0, #0x95 - movs r1, #8 - movs r2, #0 - bl CreateObject - cmp r0, #0 - beq _0809D732 - strb r4, [r0, #0xe] -_0809D732: - add sp, #4 - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809D738 -sub_0809D738: @ 0x0809D738 - push {r4, lr} - movs r0, #0x95 - movs r1, #9 - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _0809D77C - ldr r1, _0809D774 @ =gRoomControls - movs r0, #0 - str r0, [r1, #0x30] - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority - bl SetPlayerEventPriority - movs r0, #0x95 - movs r1, #0xa - movs r2, #0 - bl CreateObject - cmp r0, #0 - beq _0809D76C - str r0, [r4, #0x54] -_0809D76C: - ldr r1, _0809D778 @ =gUnk_02034490 - movs r0, #1 - strb r0, [r1] - b _0809D780 - .align 2, 0 -_0809D774: .4byte gRoomControls -_0809D778: .4byte gUnk_02034490 -_0809D77C: - bl ResetPlayerAnimationAndAction -_0809D780: - pop {r4, pc} - .align 2, 0 diff --git a/data/const/object/bird.s b/data/const/object/bird.s deleted file mode 100644 index c07b7eb7..00000000 --- a/data/const/object/bird.s +++ /dev/null @@ -1,34 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08123EC0:: @ 08123EC0 - .4byte sub_0809CF3C - .4byte sub_0809D030 - .4byte sub_0809D0F4 - .4byte sub_0809D178 - .4byte sub_0809D178 - .4byte sub_0809D178 - .4byte sub_0809D178 - .4byte sub_0809D178 - .4byte sub_0809D1F0 - .4byte sub_0809D498 - .4byte sub_0809D66C - -gUnk_08123EEC:: @ 08123EEC - .4byte sub_0809CF54 - .4byte sub_0809CFEC - -gUnk_08123EF4:: @ 08123EF4 - .4byte sub_0809D048 - .4byte sub_0809D06C - -gUnk_08123EFC:: @ 08123EFC - .4byte sub_0809D084 - .4byte sub_0809D0AC - -gUnk_08123F04:: @ 08123F04 - .4byte sub_0809D10C - .4byte sub_0809D130 diff --git a/linker.ld b/linker.ld index 49fa4f9a..de00a06e 100644 --- a/linker.ld +++ b/linker.ld @@ -773,7 +773,6 @@ SECTIONS { src/object/lamp.o(.text); src/object/windTribeFlag.o(.text); src/object/bird.o(.text); - asm/object/bird.o(.text); src/object/object96.o(.text); src/object/keyStealingTakkuri.o(.text); src/object/object98.o(.text); @@ -1523,7 +1522,7 @@ SECTIONS { data/animations/object/bakerOven.o(.rodata); src/object/lamp.o(.rodata); data/animations/object/lamp.o(.rodata); - data/const/object/bird.o(.rodata); + src/object/bird.o(.rodata); data/animations/object/bird.o(.rodata); src/object/object96.o(.rodata); src/object/keyStealingTakkuri.o(.rodata); diff --git a/src/object/bird.c b/src/object/bird.c index f16d46b5..3cb75c4b 100644 --- a/src/object/bird.c +++ b/src/object/bird.c @@ -2,22 +2,45 @@ #include "object.h" #include "functions.h" #include "item.h" +#include "message.h" +#include "game.h" -extern void (*const gUnk_08123EC0[])(Entity*); -extern void (*const gUnk_08123EEC[])(Entity*); -extern void (*const gUnk_08123EF4[])(Entity*); -extern void (*const gUnk_08123EFC[])(Entity*); -extern void (*const gUnk_08123F04[])(Entity*); +extern u16 script_EzloTalkOcarina[]; + +void Bird_Type0(Entity*); +void Bird_Type1(Entity*); +void Bird_Type2(Entity*); +void Bird_Type3(Entity*); +void Bird_Type8(Entity*); +void Bird_Type9(Entity*); +void Bird_Type10(Entity*); +void Bird_Type0_Init(Entity*); +void Bird_Type0_Action1(Entity*); +void Bird_Type1_Init(Entity*); +void Bird_Type1_Action1(Entity*); +void Bird_Type1_Action1_Subaction0(Entity*); +void Bird_Type1_Action1_Subaction1(Entity*); +void Bird_Type2_Init(Entity*); +void Bird_Type2_Action1(Entity*); void Bird(Entity* this) { - gUnk_08123EC0[this->type](this); + static void (*const typeFuncs[])(Entity*) = { + Bird_Type0, Bird_Type1, Bird_Type2, Bird_Type3, Bird_Type3, Bird_Type3, + Bird_Type3, Bird_Type3, Bird_Type8, Bird_Type9, Bird_Type10, + }; + typeFuncs[this->type](this); } -void sub_0809CF3C(Entity* this) { - gUnk_08123EEC[this->action](this); +void Bird_Type0(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + Bird_Type0_Init, + Bird_Type0_Action1, + }; + + actionFuncs[this->action](this); } -void sub_0809CF54(Entity* this) { +void Bird_Type0_Init(Entity* this) { Entity* target; this->action++; @@ -42,8 +65,7 @@ void sub_0809CF54(Entity* this) { } } -void sub_0809CFEC(Entity* this) { - +void Bird_Type0_Action1(Entity* this) { LinearMoveUpdate(this); GravityUpdate(this, *(s16*)&this->field_0x68.HWORD); if (this->actionDelay != 0) { @@ -56,22 +78,30 @@ void sub_0809CFEC(Entity* this) { UpdateAnimationSingleFrame(this); } -void sub_0809D030(Entity* this) { - gUnk_08123EF4[this->action](this); +void Bird_Type1(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + Bird_Type1_Init, + Bird_Type1_Action1, + }; + actionFuncs[this->action](this); } -void sub_0809D048(Entity* this) { +void Bird_Type1_Init(Entity* this) { this->action++; this->collisionLayer = 1; UpdateSpriteForCollisionLayer(this); InitAnimationForceUpdate(this, 0x17); } -void sub_0809D06C(Entity* this) { - gUnk_08123EFC[this->subAction](this); +void Bird_Type1_Action1(Entity* this) { + static void (*const subActionFuncs[])(Entity*) = { + Bird_Type1_Action1_Subaction0, + Bird_Type1_Action1_Subaction1, + }; + subActionFuncs[this->subAction](this); } -void sub_0809D084(Entity* this) { +void Bird_Type1_Action1_Subaction0(Entity* this) { u32 temp; if (this->parent != NULL) { @@ -85,7 +115,7 @@ void sub_0809D084(Entity* this) { } } -void sub_0809D0AC(Entity* this) { +void Bird_Type1_Action1_Subaction1(Entity* this) { Entity* fx; if (sub_080044EC(this, 0x1800) < 2) { @@ -102,28 +132,32 @@ void sub_0809D0AC(Entity* this) { } } -void sub_0809D0F4(Entity* this) { - gUnk_08123F04[this->action](this); +void Bird_Type2(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + Bird_Type2_Init, + Bird_Type2_Action1, + }; + actionFuncs[this->action](this); } -void sub_0809D10C(Entity* this) { +void Bird_Type2_Init(Entity* this) { this->action++; this->collisionLayer = 1; UpdateSpriteForCollisionLayer(this); InitAnimationForceUpdate(this, 0x17); } -void sub_0809D130(Entity* this) { +void Bird_Type2_Action1(Entity* this) { if ((gPlayerState.flags & PL_MINISH) != 0) { sub_0800445C(this); } else if (IsCollidingPlayer(this) != 0) { - CreateItemEntity(0x17, 0, 0); + CreateItemEntity(ITEM_OCARINA, 0, 0); gSave.windcrests |= 0x10000000; DeleteThisEntity(); } } -void sub_0809D178(Entity* this) { +void Bird_Type3(Entity* this) { if (this->action == 0) { this->action++; @@ -131,6 +165,7 @@ void sub_0809D178(Entity* this) { UpdateSpriteForCollisionLayer(this); this->frame = 0x80; } + if ((this->frame & ANIM_DONE) != 0) { InitializeAnimation(this, Random() & 3); this->frameDuration = (Random() & 0xf) + 0x10; @@ -142,3 +177,225 @@ void sub_0809D178(Entity* this) { GetNextFrame(this); } } + +void Bird_Type8(Entity* this) { + Entity* pEVar5; + + switch (this->action) { + case 0: + if (this->actionDelay != 0) { + this->frameIndex = 0xff; + this->actionDelay--; + return; + } + this->action = 1; + this->zVelocity = 0; + this->z.WORD = Q_16_16(-20.0); + this->speed = 0x180; + this->direction = 8; + this->collisionLayer = 1; + this->spritePriority.b0 = 0; + this->spriteRendering.b3 = 0; + this->spriteOrientation.flipY = 1; + this->x.HALF.HI = gRoomControls.scroll_x; + this->y.HALF.HI = gPlayerEntity.y.HALF.HI; + this->child = NULL; + SetDefaultPriority(this, 6); + InitAnimationForceUpdate(this, 0); + SoundReq(0x123); + break; + case 1: + this->collisionLayer = gPlayerEntity.collisionLayer; + this->speed += 8; + if (this->speed > 0x300) { + this->speed = 0x300; + } + + if ((gPlayerEntity.flags & 0x80) != 0 && (gMessage.doTextBox & 0x7f) == 0 && gPlayerEntity.action != 28 && + gPlayerEntity.action != 6 && gPlayerEntity.action != 9 && gPlayerState.framestate != 24 && + gPlayerState.framestate != 11 && gPlayerState.framestate != 8 && sub_08079F8C() && + (EntityInRectRadius(this, &gPlayerEntity, 0xe, 0xe))) { + s32 z = gPlayerEntity.z.HALF.HI - this->z.HALF.HI - 8; + if ((u16)z < 0x20 && gPlayerEntity.health != 0) { + pEVar5 = CreateObject(0x95, 10, 0); + if (pEVar5 != NULL) { + this->child = pEVar5; + this->action = 2; + this->actionDelay = 8; + this->speed = 0x300; + this->field_0x68.HWORD = 0xe000; + sub_08079184(); + sub_08078B48(); + ResetPlayerAnimationAndAction(); + sub_08077B20(); + gPlayerState.swim_state = 0; + gPlayerState.jump_status = 0; + gPlayerEntity.flags &= 0x7f; + gPlayerEntity.spriteSettings.draw = 0; + gPriorityHandler.sys_priority = 6; + gUnk_02034490.unk0 = 1; + } + } + } + break; + default: + sub_08078B48(); + gPlayerEntity.spriteSettings.draw = 0; + break; + } + LinearMoveUpdate(this); + GravityUpdate(this, (s16)this->field_0x68.HWORD); + UpdateAnimationSingleFrame(this); + pEVar5 = this->child; + if (pEVar5 != NULL) { + if (gPlayerEntity.x.HALF.HI < this->x.HALF.HI - 8) { + this->actionDelay = 0; + } + + if (this->actionDelay == 0) { + PositionRelative(this, pEVar5, 0xfff80000, 0); + pEVar5->z.HALF.HI += 0x18; + pEVar5->spritePriority.b0 = this->spritePriority.b0; + pEVar5->spriteRendering.b3 = this->spriteRendering.b3; + pEVar5->spriteOrientation.flipY = this->spriteOrientation.flipY; + } else { + this->actionDelay--; + CopyPosition(&gPlayerEntity, pEVar5); + } + } + + if (CheckOnScreen(this) == 0) { + if (this->action == 2) { + gSave.windcrests |= 0x10000000; + MenuFadeIn(9, 0); + } + pEVar5 = this->child; + if (pEVar5 != NULL) { + DeleteEntityAny(pEVar5); + } + DeleteThisEntity(); + } +} + +void Bird_Type9(Entity* this) { + Entity* pEVar1; + Entity* child; + + if (this->action == 0) { + this->action = 1; + this->spriteSettings.draw = 1; + this->zVelocity = -0x28000; + this->z.WORD = 0xffb4c000; + this->field_0x68.HWORD = 0xf000; + this->speed = 0x300; + this->direction = 8; + this->collisionLayer = 1; + this->spritePriority.b0 = 0; + this->spriteRendering.b3 = 0; + this->spriteOrientation.flipY = 1; + ; + SetDefaultPriority(this, 6); + this->x.HALF.HI = gRoomControls.scroll_x; + this->y.HALF.HI = gPlayerEntity.y.HALF.HI; + SoundReq(SFX_123); + this->spritePriority.b1 = 2; + InitAnimationForceUpdate(this, 0); + sub_08078B48(); + } else if (this->action == 1) { + gPlayerEntity.spriteSettings.draw = 0; + child = this->child; + if (child != NULL) { + PositionRelative(this, child, Q_16_16(-8), 0); + child->z.HALF.HI += 0x18; + child->spritePriority.b0 = this->spritePriority.b0; + child->spriteRendering.b3 = this->spriteRendering.b3; + child->spriteOrientation.flipY = this->spriteOrientation.flipY; + } + sub_08078B48(); + if (gRoomControls.scroll_x + 0x78 < this->x.HALF.HI) { + this->action++; + this->spritePriority.b1 = 1; + if (child != NULL) { + child->action++; + } + gRoomControls.camera_target = &gPlayerEntity; + gPlayerEntity.spriteSettings.draw = 1; + ResetPlayerAnimationAndAction(); + ResetPlayerEventPriority(); + gUnk_02034490.unk0 = 0; + if (!CheckGlobalFlag(WARP_1ST)) { + pEVar1 = CreateObject(OBJECT_69, 0, 0); + if (pEVar1 != NULL) { + *(ScriptExecutionContext**)&pEVar1->cutsceneBeh = StartCutscene(pEVar1, script_EzloTalkOcarina); + SetGlobalFlag(WARP_1ST); + } + } + } + } + LinearMoveUpdate(this); + GravityUpdate(this, (short)this->field_0x68.HWORD); + UpdateAnimationSingleFrame(this); + if (!CheckOnScreen(this)) { + DeleteThisEntity(); + } +} + +void Bird_Type10(Entity* this) { + this->palette.b.b0 = gPlayerEntity.palette.b.b0; + switch (this->action) { + case 0: + this->action = 1; + this->spriteSettings.draw = 1; + this->collisionLayer = 1; + this->spritePriority.b0 = 0; + this->spriteRendering.b3 = 0; + this->spriteOrientation.flipY = 1; + SetDefaultPriority(this, 6); + InitAnimationForceUpdate(this, 0xe0); + case 1: + UpdateAnimationSingleFrame(this); + break; + case 2: + this->action = 3; + break; + case 3: + DeleteThisEntity(); + break; + } +} + +void CreateBird(void) { + Entity* birdEnt; + +#ifndef EU + if (AreaAllowsWarp()) { +#else + if (AreaIsOverworld()) { +#endif + if (!FindEntity(OBJECT, BIRD, 6, 8, 0)) { + birdEnt = CreateObject(BIRD, 8, 0); + if (birdEnt != NULL) { + birdEnt->actionDelay = 0; + } + } + } +} + +void sub_0809D738(void) { + Entity* pEVar1; + Entity* pEVar2; + + pEVar1 = CreateObject(BIRD, 9, 0); + if (pEVar1 != NULL) { + gRoomControls.camera_target = NULL; + SetDefaultPriority(pEVar1, 6); + SetPlayerEventPriority(); + pEVar2 = CreateObject(BIRD, 10, 0); + if (pEVar2 != NULL) { + pEVar1->child = pEVar2; + } + gUnk_02034490.unk0 = 1; + } else { + ResetPlayerAnimationAndAction(); + } +}