diff --git a/asm/object/windTribeTeleporter.s b/asm/object/windTribeTeleporter.s deleted file mode 100644 index 4fe081a9..00000000 --- a/asm/object/windTribeTeleporter.s +++ /dev/null @@ -1,741 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start WindTribeTeleporter -WindTribeTeleporter: @ 0x080A0F24 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _080A0F40 @ =gUnk_08124C10 - ldrb r0, [r4, #0xc] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - adds r0, r4, #0 - bl sub_080A11E0 - pop {r4, pc} - .align 2, 0 -_080A0F40: .4byte gUnk_08124C10 - - thumb_func_start sub_080A0F44 -sub_080A0F44: @ 0x080A0F44 - push {r4, r5, r6, lr} - adds r5, r0, #0 - movs r6, #1 - strb r6, [r5, #0xc] - adds r1, r5, #0 - adds r1, #0x59 - movs r0, #8 - strb r0, [r1] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - ldr r0, _080A0FA8 @ =gHitbox_22 - str r0, [r5, #0x48] - adds r0, r5, #0 - movs r1, #6 - bl SetDefaultPriority - adds r0, r5, #0 - bl sub_080A11C0 - cmp r0, #0 - beq _080A0FA4 - ldr r1, _080A0FAC @ =gPlayerEntity - ldrh r0, [r5, #0x2e] - movs r4, #0 - strh r0, [r1, #0x2e] - ldrh r0, [r5, #0x32] - strh r0, [r1, #0x32] - movs r0, #3 - bl SetPlayerControl - bl sub_08078B48 - bl SetPlayerEventPriority - movs r0, #0x89 - lsls r0, r0, #1 - bl SoundReq - movs r0, #3 - strb r0, [r5, #0xc] - strb r4, [r5, #0xd] - adds r0, r5, #0 - adds r0, #0x68 - strb r6, [r0] -_080A0FA4: - pop {r4, r5, r6, pc} - .align 2, 0 -_080A0FA8: .4byte gHitbox_22 -_080A0FAC: .4byte gPlayerEntity - - thumb_func_start sub_080A0FB0 -sub_080A0FB0: @ 0x080A0FB0 - push {r4, r5, lr} - adds r5, r0, #0 - bl sub_080A11C0 - adds r1, r0, #0 - cmp r1, #0 - beq _080A0FF8 - adds r0, r5, #0 - adds r0, #0x68 - ldrb r0, [r0] - cmp r0, #0 - bne _080A0FFE - ldr r1, _080A0FF4 @ =gPlayerEntity - ldrh r0, [r5, #0x2e] - movs r4, #0 - strh r0, [r1, #0x2e] - ldrh r0, [r5, #0x32] - strh r0, [r1, #0x32] - movs r0, #3 - bl SetPlayerControl - bl sub_08078B48 - bl SetPlayerEventPriority - movs r0, #0x89 - lsls r0, r0, #1 - bl SoundReq - movs r0, #2 - strb r0, [r5, #0xc] - strb r4, [r5, #0xd] - b _080A0FFE - .align 2, 0 -_080A0FF4: .4byte gPlayerEntity -_080A0FF8: - adds r0, r5, #0 - adds r0, #0x68 - strb r1, [r0] -_080A0FFE: - pop {r4, r5, pc} - - thumb_func_start sub_080A1000 -sub_080A1000: @ 0x080A1000 -.ifdef DEMO_JP - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xd] - cmp r1, #1 - beq _080A0B52 - cmp r1, #1 - bgt _080A0B3C - cmp r1, #0 - beq _080A0B46 - b _080A0BB0 -_080A0B3C: - cmp r1, #2 - beq _080A0B60 - cmp r1, #3 - beq _080A0B8C - b _080A0BB0 -_080A0B46: - movs r0, #0x1e - strb r0, [r4, #0xe] - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - b _080A0BF0 -_080A0B52: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0BF0 - b _080A0B98 -_080A0B60: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0B7E - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0x1e - strb r0, [r4, #0xe] - adds r0, #0xf5 - bl SoundReq - b _080A0BF0 -_080A0B7E: - ldr r0, _080A0B88 @ =gRoomTransition - ldr r0, [r0] - movs r1, #7 - b _080A0BDE - .align 2, 0 -_080A0B88: .4byte gRoomTransition -_080A0B8C: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0BA4 -_080A0B98: - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0x1e - strb r0, [r4, #0xe] - b _080A0BF0 -_080A0BA4: - ldr r0, _080A0BAC @ =gRoomTransition - ldr r0, [r0] - b _080A0BDE - .align 2, 0 -_080A0BAC: .4byte gRoomTransition -_080A0BB0: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0BD8 - movs r0, #0xfc - bl SetLocalFlag - ldrb r1, [r4, #0xb] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - ldr r1, _080A0BD4 @ =0x0813AA10 - adds r0, r0, r1 - bl DoExitTransition - b _080A0BF0 - .align 2, 0 -_080A0BD4: .4byte 0x0813AA10 -_080A0BD8: - ldr r0, _080A0BF4 @ =gRoomTransition - ldr r0, [r0] - movs r1, #1 -_080A0BDE: - ands r0, r1 - cmp r0, #0 - bne _080A0BF0 - ldr r0, _080A0BF8 @ =gPlayerEntity - ldrb r1, [r0, #0x14] - adds r1, #2 - movs r2, #6 - ands r1, r2 - strb r1, [r0, #0x14] -_080A0BF0: - pop {r4, pc} - .align 2, 0 -_080A0BF4: .4byte gRoomTransition -_080A0BF8: .4byte gPlayerEntity - - -.else -.ifdef JP - push {lr} - adds r1, r0, #0 - ldrb r2, [r1, #0xd] - cmp r2, #1 - beq _080A0DF2 - cmp r2, #1 - bgt _080A0DDC - cmp r2, #0 - beq _080A0DE6 - b _080A0E50 -_080A0DDC: - cmp r2, #2 - beq _080A0E00 - cmp r2, #3 - beq _080A0E2C - b _080A0E50 -_080A0DE6: - movs r0, #0x1e - strb r0, [r1, #0xe] - ldrb r0, [r1, #0xd] - adds r0, #1 - strb r0, [r1, #0xd] - b _080A0E8C -_080A0DF2: - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0E8C - b _080A0E38 -_080A0E00: - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0E1E - ldrb r0, [r1, #0xd] - adds r0, #1 - strb r0, [r1, #0xd] - movs r0, #0x1e - strb r0, [r1, #0xe] - adds r0, #0xf5 - bl SoundReq - b _080A0E8C -_080A0E1E: - ldr r0, _080A0E28 @ =0x030010A0 - ldr r0, [r0] - movs r1, #7 - b _080A0E7A - .align 2, 0 -_080A0E28: .4byte 0x030010A0 -_080A0E2C: - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0E44 -_080A0E38: - ldrb r0, [r1, #0xd] - adds r0, #1 - strb r0, [r1, #0xd] - movs r0, #0x1e - strb r0, [r1, #0xe] - b _080A0E8C -_080A0E44: - ldr r0, _080A0E4C @ =0x030010A0 - ldr r0, [r0] - ands r0, r2 - b _080A0E7C - .align 2, 0 -_080A0E4C: .4byte 0x030010A0 -_080A0E50: - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0E74 - ldrb r1, [r1, #0xb] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - ldr r1, _080A0E70 @ =gUnk_0813ADEC - adds r0, r0, r1 - bl DoExitTransition - b _080A0E8C - .align 2, 0 -_080A0E70: .4byte gUnk_0813ADEC -_080A0E74: - ldr r0, _080A0E90 @ =0x030010A0 - ldr r0, [r0] - movs r1, #1 -_080A0E7A: - ands r0, r1 -_080A0E7C: - cmp r0, #0 - bne _080A0E8C - ldr r0, _080A0E94 @ =0x03001160 - ldrb r1, [r0, #0x14] - adds r1, #2 - movs r2, #6 - ands r1, r2 - strb r1, [r0, #0x14] -_080A0E8C: - pop {pc} - .align 2, 0 -_080A0E90: .4byte 0x030010A0 -_080A0E94: .4byte 0x03001160 -.else -.ifdef EU - push {lr} - adds r1, r0, #0 - ldrb r2, [r1, #0xd] - cmp r2, #1 - beq _080A0876 - cmp r2, #1 - bgt _080A0860 - cmp r2, #0 - beq _080A086A - b _080A08D4 -_080A0860: - cmp r2, #2 - beq _080A0884 - cmp r2, #3 - beq _080A08B0 - b _080A08D4 -_080A086A: - movs r0, #0x1e - strb r0, [r1, #0xe] - ldrb r0, [r1, #0xd] - adds r0, #1 - strb r0, [r1, #0xd] - b _080A0910 -_080A0876: - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0910 - b _080A08BC -_080A0884: - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A08A2 - ldrb r0, [r1, #0xd] - adds r0, #1 - strb r0, [r1, #0xd] - movs r0, #0x1e - strb r0, [r1, #0xe] - adds r0, #0xf5 - bl SoundReq - b _080A0910 -_080A08A2: - ldr r0, _080A08AC @ =gRoomTransition - ldr r0, [r0] - movs r1, #7 - b _080A08FE - .align 2, 0 -_080A08AC: .4byte gRoomTransition -_080A08B0: - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A08C8 -_080A08BC: - ldrb r0, [r1, #0xd] - adds r0, #1 - strb r0, [r1, #0xd] - movs r0, #0x1e - strb r0, [r1, #0xe] - b _080A0910 -_080A08C8: - ldr r0, _080A08D0 @ =gRoomTransition - ldr r0, [r0] - ands r0, r2 - b _080A0900 - .align 2, 0 -_080A08D0: .4byte gRoomTransition -_080A08D4: - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A08F8 - ldrb r1, [r1, #0xb] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - ldr r1, _080A08F4 @ =gUnk_0813ADEC - adds r0, r0, r1 - bl DoExitTransition - b _080A0910 - .align 2, 0 -_080A08F4: .4byte gUnk_0813ADEC -_080A08F8: - ldr r0, _080A0914 @ =gRoomTransition - ldr r0, [r0] - movs r1, #1 -_080A08FE: - ands r0, r1 -_080A0900: - cmp r0, #0 - bne _080A0910 - ldr r0, _080A0918 @ =gPlayerEntity - ldrb r1, [r0, #0x14] - adds r1, #2 - movs r2, #6 - ands r1, r2 - strb r1, [r0, #0x14] -_080A0910: - pop {pc} - .align 2, 0 -_080A0914: .4byte gRoomTransition -_080A0918: .4byte gPlayerEntity - -.else - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xd] - cmp r1, #1 - beq _080A102A - cmp r1, #1 - bgt _080A1014 - cmp r1, #0 - beq _080A101E - b _080A1088 -_080A1014: - cmp r1, #2 - beq _080A1038 - cmp r1, #3 - beq _080A1064 - b _080A1088 -_080A101E: - movs r0, #0x1e - strb r0, [r4, #0xe] - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - b _080A10D4 -_080A102A: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A10D4 - b _080A1070 -_080A1038: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A1056 - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0x1e - strb r0, [r4, #0xe] - adds r0, #0xf5 - bl SoundReq - b _080A10D4 -_080A1056: - ldr r0, _080A1060 @ =gRoomTransition - ldr r0, [r0] - movs r1, #7 - b _080A10C2 - .align 2, 0 -_080A1060: .4byte gRoomTransition -_080A1064: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A107C -_080A1070: - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0x1e - strb r0, [r4, #0xe] - b _080A10D4 -_080A107C: - ldr r0, _080A1084 @ =gRoomTransition - ldr r0, [r0] - b _080A10C2 - .align 2, 0 -_080A1084: .4byte gRoomTransition -_080A1088: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A10BC - ldr r0, _080A10B4 @ =gRoomControls - ldrb r0, [r0, #4] - cmp r0, #3 - bne _080A10A2 - movs r0, #0xf9 - bl SetLocalFlag -_080A10A2: - ldrb r1, [r4, #0xb] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #2 - ldr r1, _080A10B8 @ =gUnk_0813ADEC - adds r0, r0, r1 - bl DoExitTransition - b _080A10D4 - .align 2, 0 -_080A10B4: .4byte gRoomControls -_080A10B8: .4byte gUnk_0813ADEC -_080A10BC: - ldr r0, _080A10D8 @ =gRoomTransition - ldr r0, [r0] - movs r1, #1 -_080A10C2: - ands r0, r1 - cmp r0, #0 - bne _080A10D4 - ldr r0, _080A10DC @ =gPlayerEntity - ldrb r1, [r0, #0x14] - adds r1, #2 - movs r2, #6 - ands r1, r2 - strb r1, [r0, #0x14] -_080A10D4: - pop {r4, pc} - .align 2, 0 -_080A10D8: .4byte gRoomTransition -_080A10DC: .4byte gPlayerEntity -.endif -.endif -.endif - - thumb_func_start sub_080A10E0 -sub_080A10E0: @ 0x080A10E0 - push {r4, lr} - adds r2, r0, #0 - ldrb r1, [r2, #0xd] - cmp r1, #1 - beq _080A110E - cmp r1, #1 - bgt _080A10F4 - cmp r1, #0 - beq _080A10FE - b _080A1180 -_080A10F4: - cmp r1, #2 - beq _080A1124 - cmp r1, #3 - beq _080A1148 - b _080A1180 -_080A10FE: - movs r0, #1 - strb r0, [r2, #0xd] - movs r0, #0x1e - strb r0, [r2, #0xe] - adds r0, #0xf6 - bl SoundReq - b _080A11BA -_080A110E: - ldrb r0, [r2, #0xe] - subs r0, #1 - strb r0, [r2, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - beq _080A1130 - ldr r0, _080A1120 @ =gRoomTransition - ldr r0, [r0] - b _080A1162 - .align 2, 0 -_080A1120: .4byte gRoomTransition -_080A1124: - ldrb r0, [r2, #0xe] - subs r0, #1 - strb r0, [r2, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A113C -_080A1130: - ldrb r0, [r2, #0xd] - adds r0, #1 - strb r0, [r2, #0xd] - movs r0, #0x1e - strb r0, [r2, #0xe] - b _080A11BA -_080A113C: - ldr r0, _080A1144 @ =gRoomTransition - ldr r0, [r0] - movs r1, #3 - b _080A1162 - .align 2, 0 -_080A1144: .4byte gRoomTransition -_080A1148: - ldrb r0, [r2, #0xe] - subs r0, #1 - strb r0, [r2, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A115C - ldrb r0, [r2, #0xd] - adds r0, #1 - strb r0, [r2, #0xd] - b _080A11BA -_080A115C: - ldr r0, _080A1178 @ =gRoomTransition - ldr r0, [r0] - movs r1, #7 -_080A1162: - ands r0, r1 - cmp r0, #0 - bne _080A11BA - ldr r0, _080A117C @ =gPlayerEntity - ldrb r1, [r0, #0x14] - adds r1, #2 - movs r2, #6 - ands r1, r2 - strb r1, [r0, #0x14] - b _080A11BA - .align 2, 0 -_080A1178: .4byte gRoomTransition -_080A117C: .4byte gPlayerEntity -_080A1180: - ldr r4, _080A11A0 @ =gPlayerEntity - ldrb r3, [r4, #0x14] - cmp r3, #4 - beq _080A11A8 - ldr r0, _080A11A4 @ =gRoomTransition - ldr r0, [r0] - movs r1, #7 - ands r0, r1 - cmp r0, #0 - bne _080A11BA - adds r0, r3, #2 - movs r1, #6 - ands r0, r1 - strb r0, [r4, #0x14] - b _080A11BA - .align 2, 0 -_080A11A0: .4byte gPlayerEntity -_080A11A4: .4byte gRoomTransition -_080A11A8: - movs r0, #0 - movs r1, #1 - strb r1, [r2, #0xc] - strb r0, [r2, #0xd] - ldr r0, _080A11BC @ =gPlayerState - adds r0, #0x8b - strb r1, [r0] - bl ResetPlayerEventPriority -_080A11BA: - pop {r4, pc} - .align 2, 0 -_080A11BC: .4byte gPlayerState - - thumb_func_start sub_080A11C0 -sub_080A11C0: @ 0x080A11C0 - push {lr} - adds r1, r0, #0 - ldr r0, _080A11D8 @ =gPlayerEntity - movs r2, #0x36 - ldrsh r0, [r0, r2] - cmp r0, #0 - bne _080A11DC - adds r0, r1, #0 - bl IsCollidingPlayer - b _080A11DE - .align 2, 0 -_080A11D8: .4byte gPlayerEntity -_080A11DC: - movs r0, #0 -_080A11DE: - pop {pc} - - thumb_func_start sub_080A11E0 -sub_080A11E0: @ 0x080A11E0 - push {lr} - adds r2, r0, #0 - adds r1, r2, #0 - adds r1, #0x59 - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A1202 - movs r0, #8 - strb r0, [r1] - ldrb r0, [r2, #0x1e] - adds r0, #1 - movs r1, #3 - ands r0, r1 - strb r0, [r2, #0x1e] -_080A1202: - pop {pc} diff --git a/data/const/object/windTribeTeleporter.s b/data/const/object/windTribeTeleporter.s deleted file mode 100644 index 27e02207..00000000 --- a/data/const/object/windTribeTeleporter.s +++ /dev/null @@ -1,11 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08124C10:: @ 08124C10 - .4byte sub_080A0F44 - .4byte sub_080A0FB0 - .4byte sub_080A1000 - .4byte sub_080A10E0 diff --git a/include/object.h b/include/object.h index 2231dd7b..25347073 100644 --- a/include/object.h +++ b/include/object.h @@ -410,7 +410,7 @@ void ObjectB4(Entity*); void ObjectB5(Entity*); void ObjectB6(Entity*); void Well(Entity*); -void WindTribeTeleporter(Entity*); +void WindTribeTeleporter(); void ObjectB9(Entity*); void GyorgBossObject(Entity*); void Windcrest(Entity*); diff --git a/linker.ld b/linker.ld index ced8f611..25bdf961 100644 --- a/linker.ld +++ b/linker.ld @@ -831,7 +831,7 @@ SECTIONS { src/object/objectB5.o(.text); asm/object/objectB6.o(.text); src/object/well.o(.text); - asm/object/windTribeTeleporter.o(.text); + src/object/windTribeTeleporter.o(.text); asm/object/objectB9.o(.text); src/object/gyorgBossObject.o(.text); src/object/windcrest.o(.text); @@ -1587,7 +1587,7 @@ SECTIONS { data/const/object/objectB4.o(.rodata); data/animations/object/objectB4.o(.rodata); data/const/object/well.o(.rodata); - data/const/object/windTribeTeleporter.o(.rodata); + src/object/windTribeTeleporter.o(.rodata); data/const/object/objectB9.o(.rodata); src/object/gyorgBossObject.o(.rodata); data/const/object/windcrest.o(.rodata); diff --git a/src/object/windTribeTeleporter.c b/src/object/windTribeTeleporter.c new file mode 100644 index 00000000..052d4d2e --- /dev/null +++ b/src/object/windTribeTeleporter.c @@ -0,0 +1,195 @@ +/** + * @file windTribeTeleporter.c + * @ingroup Objects + * + * @brief WindTribeTeleporter object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" +#include "hitbox.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68; +} WindTribeTeleporterEntity; + +extern ScreenTransitionData gUnk_0813ADEC[]; + +void WindTribeTeleporter_Init(WindTribeTeleporterEntity*); +void WindTribeTeleporter_Action1(WindTribeTeleporterEntity*); +void WindTribeTeleporter_Action2(WindTribeTeleporterEntity*); +void WindTribeTeleporter_Action3(WindTribeTeleporterEntity*); +void sub_080A11E0(WindTribeTeleporterEntity*); +bool32 sub_080A11C0(WindTribeTeleporterEntity*); + +void WindTribeTeleporter(WindTribeTeleporterEntity* this) { + static void (*const WindTribeTeleporter_Actions[])(WindTribeTeleporterEntity*) = { + WindTribeTeleporter_Init, + WindTribeTeleporter_Action1, + WindTribeTeleporter_Action2, + WindTribeTeleporter_Action3, + }; + WindTribeTeleporter_Actions[super->action](this); + sub_080A11E0(this); +} + +void WindTribeTeleporter_Init(WindTribeTeleporterEntity* this) { + super->action = 1; + super->frameDuration = 8; + super->spritePriority.b0 = 7; + super->hitbox = (Hitbox*)&gHitbox_22; + SetDefaultPriority(super, 6); + if (sub_080A11C0(this)) { + gPlayerEntity.x.HALF.HI = super->x.HALF.HI; + gPlayerEntity.y.HALF.HI = super->y.HALF.HI; + SetPlayerControl(CONTROL_DISABLED); + sub_08078B48(); + SetPlayerEventPriority(); + SoundReq(SFX_112); + super->action = 3; + super->subAction = 0; + this->unk_68 = 1; + } +} + +void WindTribeTeleporter_Action1(WindTribeTeleporterEntity* this) { + if (sub_080A11C0(this)) { + if (this->unk_68 == 0) { + gPlayerEntity.x.HALF.HI = super->x.HALF.HI; + gPlayerEntity.y.HALF.HI = super->y.HALF.HI; + SetPlayerControl(CONTROL_DISABLED); + sub_08078B48(); + SetPlayerEventPriority(); + SoundReq(SFX_112); + super->action = 2; + super->subAction = 0; + } + } else { + this->unk_68 = 0; + } +} + +void WindTribeTeleporter_Action2(WindTribeTeleporterEntity* this) { + switch (super->subAction) { + case 0: + super->actionDelay = 0x1e; + super->subAction++; + break; + case 1: + if (--super->actionDelay == 0) { + super->subAction++; + super->actionDelay = 0x1e; + } + break; + case 2: + if (--super->actionDelay == 0) { + super->subAction++; + super->actionDelay = 0x1e; + SoundReq(SFX_113); + } else { + if ((gRoomTransition.frameCount & 7) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + case 3: + if (--super->actionDelay == 0) { + super->subAction++; + super->actionDelay = 0x1e; + } else { + if ((gRoomTransition.frameCount & 3) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + default: + if (--super->actionDelay == 0) { + #if defined(DEMO_JP) || defined(JP) || defined(EU) + #ifdef DEMO_JP + SetLocalFlag(0xfc); + #endif + DoExitTransition(&gUnk_0813ADEC[super->type2]); + #else + if (gRoomControls.area == 3) { + SetLocalFlag(0xf9); + } + DoExitTransition(&gUnk_0813ADEC[super->type2]); + #endif + } else { + if ((gRoomTransition.frameCount & 1) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + } +} + +void WindTribeTeleporter_Action3(WindTribeTeleporterEntity* this) { + switch (super->subAction) { + case 0: + super->subAction = 1; + super->actionDelay = 0x1e; + SoundReq(SFX_114); + break; + case 1: + if (--super->actionDelay != 0) { + if ((gRoomTransition.frameCount & 1) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } else { + super->subAction++; + super->actionDelay = 0x1e; + } + break; + case 2: + if (--super->actionDelay == 0) { + super->subAction++; + super->actionDelay = 0x1e; + } else { + if ((gRoomTransition.frameCount & 3) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + case 3: + if (--super->actionDelay == 0) { + super->subAction++; + } else { + if ((gRoomTransition.frameCount & 7) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + default: + if (gPlayerEntity.animationState != 4) { + if ((gRoomTransition.frameCount & 7U) != 0) { + return; + } + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } else { + super->action = 1; + super->subAction = 0; + gPlayerState.controlMode = 1; + ResetPlayerEventPriority(); + } + break; + } +} + +bool32 sub_080A11C0(WindTribeTeleporterEntity* this) { + if (gPlayerEntity.z.HALF.HI != 0) { + return FALSE; + } else { + return IsCollidingPlayer(super); + } +} + +void sub_080A11E0(WindTribeTeleporterEntity* this) { + if (--super->frameDuration == 0) { + super->frameDuration = 8; + super->frameIndex = (super->frameIndex + 1) & 3; + } +}