diff --git a/asm/object/object10.s b/asm/object/object10.s deleted file mode 100644 index 66f067d2..00000000 --- a/asm/object/object10.s +++ /dev/null @@ -1,652 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object10 -Object10: @ 0x08084824 - push {lr} - ldr r2, _08084838 @ =gUnk_08120560 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08084838: .4byte gUnk_08120560 - - thumb_func_start sub_0808483C -sub_0808483C: @ 0x0808483C - push {r4, r5, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x19] - movs r0, #0x3f - ands r0, r1 - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r2] - ldrh r2, [r4, #0x2e] - movs r1, #0x10 - rsbs r1, r1, #0 - adds r0, r1, #0 - ands r0, r2 - movs r2, #8 - orrs r0, r2 - strh r0, [r4, #0x2e] - ldrh r0, [r4, #0x32] - ands r1, r0 - orrs r1, r2 - strh r1, [r4, #0x32] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _080848C0 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r5, r4, #0 - adds r5, #0x74 - strh r1, [r5] - adds r0, r4, #0 - movs r1, #8 - bl InitializeAnimation - ldr r0, _080848C4 @ =0x00004016 - ldrh r1, [r5] - adds r4, #0x38 - ldrb r2, [r4] - bl SetTile - movs r0, #0x89 - lsls r0, r0, #1 - bl SoundReq - pop {r4, r5, pc} - .align 2, 0 -_080848C0: .4byte gRoomControls -_080848C4: .4byte 0x00004016 - - thumb_func_start sub_080848C8 -sub_080848C8: @ 0x080848C8 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, _08084980 @ =gPlayerState - adds r0, #0xa0 - ldrb r0, [r0] - cmp r0, #5 - bne _08084994 - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x45 - movs r5, #1 - strb r5, [r0] - movs r0, #2 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x11] - subs r0, #0x12 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r4, #0x11] - ldr r0, _08084984 @ =gUnk_08120574 - str r0, [r4, #0x48] - ldrb r1, [r4, #0xa] - adds r1, #1 - lsls r0, r1, #4 - subs r0, r0, r1 - strb r0, [r4, #0xf] - ldr r2, _08084988 @ =gPlayerEntity - ldrh r0, [r4, #0x2e] - ldrh r1, [r2, #0x2e] - subs r0, r0, r1 - adds r3, r4, #0 - adds r3, #0x78 - strh r0, [r3] - ldrh r1, [r4, #0x32] - ldrh r0, [r2, #0x32] - subs r1, r1, r0 - adds r0, r4, #0 - adds r0, #0x7a - strh r1, [r0] - ldrh r0, [r3] - cmp r0, #0 - beq _0808493C - lsls r0, r1, #0x10 - cmp r0, #0 - beq _0808493C - ldr r0, _0808498C @ =gPlayerClones - ldrb r1, [r4, #0xa] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r0, [r1] - str r5, [r0, #0x70] -_0808493C: - ldr r0, _08084990 @ =0x00000315 - adds r1, r4, #0 - adds r1, #0x74 - ldrh r1, [r1] - adds r2, r4, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl sub_08000152 - ldrb r1, [r4, #0xa] - adds r1, #1 - ldr r0, _08084980 @ =gPlayerState - ldr r0, [r0, #0x2c] - adds r0, #0x68 - ldrb r3, [r0] - movs r0, #1 - movs r2, #0 - bl sub_08077CF8 - str r0, [r4, #0x54] - cmp r0, #0 - beq _0808496A - str r4, [r0, #0x50] -_0808496A: - adds r0, r4, #0 - bl sub_0801766C - adds r0, r4, #0 - bl sub_0806FDA0 - adds r0, r4, #0 - bl sub_080849D8 - b _080849D6 - .align 2, 0 -_08084980: .4byte gPlayerState -_08084984: .4byte gUnk_08120574 -_08084988: .4byte gPlayerEntity -_0808498C: .4byte gPlayerClones -_08084990: .4byte 0x00000315 -_08084994: - cmp r0, #4 - beq _080849C4 - ldr r0, _080849BC @ =0x00000315 - adds r1, r4, #0 - adds r1, #0x74 - ldrh r1, [r1] - adds r2, r4, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl sub_08000152 - ldr r1, _080849C0 @ =gPlayerClones - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r1 - movs r1, #0 - str r1, [r0] - bl DeleteThisEntity - b _080849D6 - .align 2, 0 -_080849BC: .4byte 0x00000315 -_080849C0: .4byte gPlayerClones -_080849C4: - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] -_080849D6: - pop {r4, r5, pc} - - thumb_func_start sub_080849D8 -sub_080849D8: @ 0x080849D8 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xf] - adds r1, r0, #0 - cmp r1, #1 - bne _080849EE - movs r0, #0x76 - bl SoundReq - ldrb r0, [r4, #0xf] - b _080849F2 -_080849EE: - cmp r1, #0 - beq _080849F6 -_080849F2: - subs r0, #1 - strb r0, [r4, #0xf] -_080849F6: - ldr r2, _08084A3C @ =gPlayerState - adds r3, r2, #0 - adds r3, #0xa0 - ldrb r0, [r3] - cmp r0, #5 - beq _08084A04 - b _08084AF8 -_08084A04: - ldr r0, _08084A40 @ =gPlayerClones - ldrb r1, [r4, #0xa] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r0, [r1] - cmp r0, #0 - beq _08084AF8 - adds r0, r2, #0 - adds r0, #0xa8 - ldrb r0, [r0] - cmp r0, #0x13 - beq _08084AF8 - adds r0, r4, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - beq _08084AF8 - ldr r5, _08084A44 @ =gPlayerEntity - adds r0, r5, #0 - adds r0, #0x3d - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - ble _08084A48 - movs r0, #1 - strb r0, [r3] - b _08084AF8 - .align 2, 0 -_08084A3C: .4byte gPlayerState -_08084A40: .4byte gPlayerClones -_08084A44: .4byte gPlayerEntity -_08084A48: - adds r0, r4, #0 - bl sub_080B1AA8 - adds r0, r4, #0 - bl sub_08084B1C - adds r0, r4, #0 - adds r0, #0x78 - ldrh r0, [r0] - ldrh r1, [r5, #0x2e] - adds r0, r0, r1 - strh r0, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x7a - ldrh r0, [r0] - ldrh r5, [r5, #0x32] - adds r0, r0, r5 - strh r0, [r4, #0x32] - adds r0, r4, #0 - bl sub_08084CAC - adds r0, r4, #0 - bl sub_080085B0 - ldrh r2, [r4, #0x2a] - ldr r1, _08084AB8 @ =0x00006666 - adds r0, r1, #0 - ands r0, r2 - cmp r0, r1 - beq _08084AEA - movs r3, #0 - ldr r5, _08084ABC @ =gUnk_0812056C - ldrh r1, [r5] - adds r0, r1, #0 - ands r0, r2 - cmp r1, r0 - beq _08084AA6 - adds r2, r5, #0 -_08084A94: - adds r2, #2 - adds r3, #1 - cmp r3, #3 - bhi _08084AA6 - ldrh r1, [r2] - ldrh r0, [r4, #0x2a] - ands r0, r1 - cmp r1, r0 - bne _08084A94 -_08084AA6: - cmp r3, #4 - bne _08084AC0 - movs r0, #0 - strb r0, [r4, #0xe] - ldrb r1, [r4, #0x18] - subs r0, #4 - ands r0, r1 - movs r1, #1 - b _08084ADE - .align 2, 0 -_08084AB8: .4byte 0x00006666 -_08084ABC: .4byte gUnk_0812056C -_08084AC0: - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08084AE4 - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - beq _08084AEA - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 -_08084ADE: - orrs r0, r1 - strb r0, [r4, #0x18] - b _08084B16 -_08084AE4: - movs r0, #0x1e - strb r0, [r4, #0xe] - b _08084B16 -_08084AEA: - ldr r0, _08084AF4 @ =gPlayerState - adds r0, #0xa0 - movs r1, #1 - strb r1, [r0] - b _08084B16 - .align 2, 0 -_08084AF4: .4byte gPlayerState -_08084AF8: - bl DeleteClones - adds r0, r4, #0 - movs r1, #0x30 - movs r2, #0 - bl CreateFx - ldr r0, [r4, #0x54] - bl DeleteEntity - ldr r0, _08084B18 @ =0x0000018F - bl SoundReq - bl DeleteThisEntity -_08084B16: - pop {r4, r5, pc} - .align 2, 0 -_08084B18: .4byte 0x0000018F - - thumb_func_start sub_08084B1C -sub_08084B1C: @ 0x08084B1C - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r4, r0, #0 - ldr r3, _08084CA4 @ =gPlayerEntity - ldrb r0, [r3, #0x10] - strb r0, [r4, #0x10] - adds r0, r3, #0 - adds r0, #0x60 - ldrh r1, [r0] - adds r0, r4, #0 - adds r0, #0x60 - strh r1, [r0] - ldrb r0, [r3, #0x1e] - strb r0, [r4, #0x1e] - adds r0, r3, #0 - adds r0, #0x5b - ldrb r0, [r0] - adds r1, r4, #0 - adds r1, #0x5b - strb r0, [r1] - ldrh r0, [r3, #0x12] - strh r0, [r4, #0x12] - ldrb r0, [r3, #0x15] - strb r0, [r4, #0x15] - ldrb r0, [r3, #0x14] - strb r0, [r4, #0x14] - ldrb r0, [r3, #0x18] - movs r1, #1 - mov r8, r1 - movs r1, #0x40 - ands r1, r0 - ldrb r2, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - mov sb, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] - ldrb r1, [r3, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r4, #0x19] - movs r7, #0x3f - adds r0, r7, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r0, r3, #0 - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - movs r0, #0x29 - adds r0, r0, r4 - mov ip, r0 - movs r6, #7 - lsrs r1, r1, #0x1d - ldrb r2, [r0] - movs r0, #8 - rsbs r0, r0, #0 - mov sl, r0 - ands r0, r2 - orrs r0, r1 - mov r1, ip - strb r0, [r1] - ldrb r1, [r3, #0x1b] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r4, #0x1b] - adds r0, r7, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x1b] - adds r0, r3, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - adds r0, r3, #0 - adds r0, #0x3b - ldrb r0, [r0] - adds r1, r4, #0 - adds r1, #0x3b - strb r0, [r1] - adds r0, r3, #0 - adds r0, #0x3f - ldrb r0, [r0] - adds r1, #4 - strb r0, [r1] - adds r0, r3, #0 - adds r0, #0x3c - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x3c - strb r1, [r0] - adds r0, r3, #0 - adds r0, #0x40 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x40 - strb r1, [r0] - ldr r1, [r4, #0x54] - adds r0, r4, #0 - bl CopyPosition - ldr r5, _08084CA8 @ =gPlayerState - ldrb r0, [r5, #4] - cmp r0, #0 - beq _08084C6A - ldr r1, [r4, #0x54] - ldr r0, [r5, #0x2c] - adds r0, #0x44 - ldrb r0, [r0] - adds r1, #0x44 - strb r0, [r1] - ldr r1, [r4, #0x54] - ldr r0, [r5, #0x2c] - ldrb r0, [r0, #0x1e] - strb r0, [r1, #0x1e] - ldr r3, [r4, #0x54] - ldr r0, [r5, #0x2c] - ldrb r1, [r0, #0x18] - lsls r1, r1, #0x19 - lsrs r1, r1, #0x1f - mov r0, r8 - ands r1, r0 - lsls r1, r1, #6 - ldrb r2, [r3, #0x18] - mov r0, sb - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x18] - ldr r3, [r4, #0x54] - ldr r0, [r5, #0x2c] - ldrb r1, [r0, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r3, #0x19] - adds r0, r7, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x19] - ldr r2, [r4, #0x54] - ldr r0, [r5, #0x2c] - adds r0, #0x29 - ldrb r0, [r0] - lsls r0, r0, #0x1d - lsrs r0, r0, #0x1d - adds r2, #0x29 - ands r6, r0 - ldrb r1, [r2] - mov r0, sl - ands r0, r1 - orrs r0, r6 - strb r0, [r2] - ldr r1, [r4, #0x54] - ldrb r0, [r1, #0x18] - lsls r0, r0, #0x19 - cmp r0, #0 - bge _08084C6A - ldr r1, [r1, #0x48] - ldrb r0, [r1] - rsbs r0, r0, #0 - strb r0, [r1] -_08084C6A: - adds r0, r4, #0 - movs r1, #0 - movs r2, #0 - bl sub_0806FEBC - adds r0, r4, #0 - movs r1, #1 - movs r2, #0 - bl sub_0806FEBC - adds r0, r4, #0 - movs r1, #2 - adds r2, r4, #0 - bl sub_0806FEBC - adds r0, r4, #0 - movs r1, #3 - movs r2, #0 - bl sub_0806FEBC - ldr r0, [r4, #0x54] - adds r1, r4, #0 - bl sub_08078E84 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08084CA4: .4byte gPlayerEntity -_08084CA8: .4byte gPlayerState - - thumb_func_start sub_08084CAC -sub_08084CAC: @ 0x08084CAC - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - ldr r6, _08084D18 @ =gPlayerClones - ldrb r0, [r5, #0xa] - lsls r0, r0, #2 - adds r0, r0, r6 - ldr r0, [r0] - ldr r0, [r0, #0x70] - cmp r0, #0 - bne _08084D32 - ldrb r0, [r5, #0x14] - movs r2, #6 - ands r2, r0 - lsls r2, r2, #1 - ldr r0, _08084D1C @ =gUnk_080B4468 - adds r2, r2, r0 - movs r1, #0x2e - ldrsh r0, [r5, r1] - movs r3, #0 - ldrsh r1, [r2, r3] - adds r0, r0, r1 - ldr r4, _08084D20 @ =gRoomControls - ldrh r1, [r4, #6] - subs r0, r0, r1 - asrs r0, r0, #4 - movs r3, #0x3f - ands r0, r3 - movs r7, #0x32 - ldrsh r1, [r5, r7] - movs r7, #2 - ldrsh r2, [r2, r7] - adds r1, r1, r2 - ldrh r2, [r4, #8] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r3 - lsls r1, r1, #6 - orrs r0, r1 - adds r1, r5, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl GetTileType - bl sub_080B1B54 - cmp r0, #0x72 - bne _08084D24 - ldr r2, [r6] - movs r1, #1 - ldrb r5, [r5, #0xa] - lsls r1, r5 - ldr r0, [r2, #0x6c] - orrs r0, r1 - b _08084D30 - .align 2, 0 -_08084D18: .4byte gPlayerClones -_08084D1C: .4byte gUnk_080B4468 -_08084D20: .4byte gRoomControls -_08084D24: - ldr r2, [r6] - movs r1, #1 - ldrb r5, [r5, #0xa] - lsls r1, r5 - ldr r0, [r2, #0x6c] - bics r0, r1 -_08084D30: - str r0, [r2, #0x6c] -_08084D32: - pop {r4, r5, r6, r7, pc} diff --git a/assets/assets.json b/assets/assets.json index 48bcb6a2..d7eaee43 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -42665,16 +42665,6 @@ "size": 56, "type": "animation" }, - { - "path": "object10/gUnk_0812056C.bin", - "start": 1181036, - "size": 8 - }, - { - "path": "object10/gUnk_08120574.bin", - "start": 1181044, - "size": 8 - }, { "path": "animations/gSpriteAnimations_Railtrack_0.bin", "start": 1181156, diff --git a/data/const/object/object10.s b/data/const/object/object10.s deleted file mode 100644 index ea6d7265..00000000 --- a/data/const/object/object10.s +++ /dev/null @@ -1,16 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08120560:: @ 08120560 - .4byte sub_0808483C - .4byte sub_080848C8 - .4byte sub_080849D8 - -gUnk_0812056C:: @ 0812056C - .incbin "object10/gUnk_0812056C.bin" - -gUnk_08120574:: @ 08120574 - .incbin "object10/gUnk_08120574.bin" diff --git a/include/functions.h b/include/functions.h index f6bc2bc4..2ba07a82 100644 --- a/include/functions.h +++ b/include/functions.h @@ -255,4 +255,5 @@ extern void sub_080ADD70(void); extern bool32 sub_080AE4CC(Entity*, u32, u32, u32); extern void sub_080AE58C(Entity*, u32, u32); extern void sub_080AF284(void); +extern bool32 sub_080B1B54(u32); #endif diff --git a/include/object.h b/include/object.h index f6f7f5c5..5d6cb713 100644 --- a/include/object.h +++ b/include/object.h @@ -46,7 +46,7 @@ typedef enum { OBJECT_D, OBJECT_E, SPECIAL_FX, - OBJECT_10, + PLAYER_CLONE, OBJECT_11, OBJECT_12, RAILTRACK, @@ -242,7 +242,7 @@ void ChestSpawner(); void ObjectD(); void ObjectE(); void SpecialFx(); -void Object10(); +void PlayerClone(); void Object11(); void Object12(); void Railtrack(); diff --git a/linker.ld b/linker.ld index e39f434f..eeb7506b 100644 --- a/linker.ld +++ b/linker.ld @@ -636,7 +636,7 @@ SECTIONS { src/object/objectD.o(.text); src/object/objectE.o(.text); src/object/specialFx.o(.text); - asm/object/object10.o(.text); + src/object/playerClone.o(.text); src/object/object11.o(.text); src/object/object12.o(.text); src/object/railtrack.o(.text); @@ -1354,7 +1354,7 @@ SECTIONS { data/animations/object/objectD.o(.rodata); src/object/specialFx.o(.rodata); data/animations/object/specialFx.o(.rodata); - data/const/object/object10.o(.rodata); + src/object/playerClone.o(.rodata); src/object/object11.o(.rodata); src/object/object12.o(.rodata); data/const/object/railtrack.o(.rodata); diff --git a/src/object.c b/src/object.c index caddaddc..da1eb312 100644 --- a/src/object.c +++ b/src/object.c @@ -18,7 +18,7 @@ void (*const gObjectFunctions[])(Entity*) = { [OBJECT_D] = ObjectD, [OBJECT_E] = ObjectE, [SPECIAL_FX] = SpecialFx, - [OBJECT_10] = Object10, + [PLAYER_CLONE] = PlayerClone, [OBJECT_11] = Object11, [OBJECT_12] = Object12, [RAILTRACK] = Railtrack, diff --git a/src/object/playerClone.c b/src/object/playerClone.c new file mode 100644 index 00000000..eee252ae --- /dev/null +++ b/src/object/playerClone.c @@ -0,0 +1,187 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "room.h" +#include "asm.h" +#include "sound.h" +#include "player.h" +#include "functions.h" +#include "effects.h" + +typedef struct { + Entity base; + u8 filler[0x4]; + u32 unk6c; + u32 unk70; + u16 tilePos; + u16 unk76; + u16 unk78; + u16 unk7a; +} PlayerCloneEntity; + +extern Entity* sub_08077CF8(u32 subtype, u32 form, u32 parameter, u32 unk); +extern const s16 gUnk_080B4468[]; + +void PlayerClone_Init(PlayerCloneEntity*); +void PlayerClone_Action1(PlayerCloneEntity*); +void PlayerClone_Action2(PlayerCloneEntity*); +void sub_08084B1C(PlayerCloneEntity*); +void sub_08084CAC(PlayerCloneEntity*); + +void PlayerClone(Entity* this) { + static void (*const actionFuncs[])(PlayerCloneEntity*) = { + PlayerClone_Init, + PlayerClone_Action1, + PlayerClone_Action2, + }; + + actionFuncs[this->action]((PlayerCloneEntity*)this); +} + +void PlayerClone_Init(PlayerCloneEntity* this) { + super->action = 1; + super->spriteRendering.b3 = 2; + super->spritePriority.b0 = 4; + super->x.HALF.HI = (super->x.HALF.HI & 0xfff0) | 8; + super->y.HALF.HI = (super->y.HALF.HI & 0xfff0) | 8; + this->tilePos = COORD_TO_TILE(super); + InitializeAnimation(super, 8); + SetTile(0x4016, this->tilePos, super->collisionLayer); + SoundReq(SFX_112); +} + +const u16 PlayerCloneCollisions[] = { 0x2206, 0x6044, 0x4460, 0x622 }; + +void PlayerClone_Action1(PlayerCloneEntity* this) { + static const Hitbox PlayerCloneHitbox = { 0, -3, { 5, 3, 3, 5 }, 6, 6 }; + + if (gPlayerState.chargeState.action == 5) { + super->spriteSettings.draw = 1; + super->health = 1; + super->action = 2; + super->updatePriority = 6; + super->hitbox = (Hitbox*)&PlayerCloneHitbox; + super->field_0xf = (super->type + 1) * 15; + this->unk78 = super->x.HALF.HI - gPlayerEntity.x.HALF.HI; + this->unk7a = super->y.HALF.HI - gPlayerEntity.y.HALF.HI; + if ((this->unk78 != 0) && (this->unk7a != 0)) { + ((PlayerCloneEntity*)gPlayerClones[super->type])->unk70 = 1; + } + sub_08000152(0x315, this->tilePos, super->collisionLayer); + super->child = sub_08077CF8(1, super->type + 1, 0, ((GenericEntity*)gPlayerState.item)->field_0x68.HALF.LO); + if (super->child != NULL) { + super->child->parent = super; + } + sub_0801766C(super); + sub_0806FDA0(super); + PlayerClone_Action2(this); + } else if (gPlayerState.chargeState.action != 4) { + sub_08000152(0x315, this->tilePos, super->collisionLayer); + gPlayerClones[super->type] = NULL; + DeleteThisEntity(); + } else { + super->spriteSettings.draw ^= 1; + } +} + +void PlayerClone_Action2(PlayerCloneEntity* this) { + u32 index; + + if (super->field_0xf == 1) { + SoundReq(SFX_PLY_VO2); + super->field_0xf--; + } else if (super->field_0xf != 0) { + super->field_0xf--; + } + + if (gPlayerState.chargeState.action == 5 && gPlayerClones[super->type] != NULL && gPlayerState.framestate != 19 && + super->health != 0) { + if (gPlayerEntity.iframes >= 1) { + gPlayerState.chargeState.action = 1; + } else { + sub_080B1AA8(super); + sub_08084B1C(this); + super->x.HALF.HI = gPlayerEntity.x.HALF.HI + this->unk78; + super->y.HALF.HI = gPlayerEntity.y.HALF.HI + this->unk7a; + sub_08084CAC(this); + sub_080085B0(super); + if ((super->collisions & 0x6666) != 0x6666) { + for (index = 0; index <= 3; index++) { + if (PlayerCloneCollisions[index] == (PlayerCloneCollisions[index] & super->collisions)) { + break; + } + } + + if (index == 4) { + super->actionDelay = 0; + super->spriteSettings.draw = 1; + return; + } else { + if (super->actionDelay != 0) { + if (--super->actionDelay != 0) { + super->spriteSettings.draw ^= 1; + return; + } + } else { + super->actionDelay = 30; + return; + } + } + } + gPlayerState.chargeState.action = 1; + return; + } + } + DeleteClones(); + CreateFx(super, FX_SPARKLE_SECRET, 0); + DeleteEntity(super->child); + SoundReq(SFX_18F); + DeleteThisEntity(); +} + +void sub_08084B1C(PlayerCloneEntity* this) { + super->flags = gPlayerEntity.flags; + super->spriteVramOffset = gPlayerEntity.spriteVramOffset; + super->frameIndex = gPlayerEntity.frameIndex; + super->frameSpriteSettings = gPlayerEntity.frameSpriteSettings; + super->spriteIndex = gPlayerEntity.spriteIndex; + super->direction = gPlayerEntity.direction; + super->animationState = gPlayerEntity.animationState; + super->spriteSettings.flipX = gPlayerEntity.spriteSettings.flipX; + super->spriteRendering.b3 = gPlayerEntity.spriteRendering.b3; + super->spritePriority.b0 = gPlayerEntity.spritePriority.b0; + super->spriteOrientation.flipY = gPlayerEntity.spriteOrientation.flipY; + super->collisionLayer = gPlayerEntity.collisionLayer; + super->flags2 = gPlayerEntity.flags2; + super->hitType = gPlayerEntity.hitType; + super->field_0x3c = gPlayerEntity.field_0x3c; + super->hurtType = gPlayerEntity.hurtType; + CopyPosition(super, super->child); + if (gPlayerState.field_0x3[1] != 0) { + super->child->damage = gPlayerState.item->damage; + super->child->frameIndex = gPlayerState.item->frameIndex; + super->child->spriteSettings.flipX = gPlayerState.item->spriteSettings.flipX; + super->child->spriteRendering.b3 = gPlayerState.item->spriteRendering.b3; + super->child->spritePriority.b0 = gPlayerState.item->spritePriority.b0; + if (super->child->spriteSettings.flipX) { + super->child->hitbox->offset_x = -super->child->hitbox->offset_x; + } + } + sub_0806FEBC(super, 0, 0); + sub_0806FEBC(super, 1, 0); + sub_0806FEBC(super, 2, super); + sub_0806FEBC(super, 3, 0); + sub_08078E84(super->child, super); +} + +void sub_08084CAC(PlayerCloneEntity* this) { + const s16* ptr; + + if (((PlayerCloneEntity*)gPlayerClones[super->type])->unk70 == 0) { + ptr = &gUnk_080B4468[super->animationState & 6]; + if (sub_080B1B54(GetTileType(COORD_TO_TILE_OFFSET(super, -ptr[0], -ptr[1]), super->collisionLayer)) == 0x72) { + ((PlayerCloneEntity*)gPlayerClones[0])->unk6c |= (1 << super->type); + } else { + ((PlayerCloneEntity*)gPlayerClones[0])->unk6c &= ~(1 << super->type); + } + } +} diff --git a/src/player.c b/src/player.c index 5f15068c..252c178c 100644 --- a/src/player.c +++ b/src/player.c @@ -3501,7 +3501,7 @@ void SurfaceAction_CloneTile(Entity* this) { break; } if (n > i) { - Entity* e = CreateObjectWithParent(this, OBJECT_10, i, 0); + Entity* e = CreateObjectWithParent(this, PLAYER_CLONE, i, 0); gPlayerClones[i] = e; if (e != NULL) { CopyPosition(this, e);