diff --git a/asm/code_080A29BC.s b/asm/code_080A29BC.s index 37276f4b..928762f3 100644 --- a/asm/code_080A29BC.s +++ b/asm/code_080A29BC.s @@ -4,125 +4,6 @@ .syntax unified .text - - thumb_func_start sub_080A29BC -sub_080A29BC: @ 0x080A29BC - push {lr} - movs r1, #2 - movs r2, #0 - bl CreateFx - pop {pc} - - thumb_func_start sub_080A29C8 -sub_080A29C8: @ 0x080A29C8 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r5, r1, #0 - adds r6, r2, #0 - movs r0, #0xf - movs r1, #2 - movs r2, #0 - bl CreateObject - adds r2, r0, #0 - cmp r2, #0 - beq _080A29F4 - ldr r1, _080A29F8 @ =gRoomControls - ldrh r0, [r1, #6] - adds r0, r0, r4 - strh r0, [r2, #0x2e] - ldrh r0, [r1, #8] - adds r0, r0, r5 - strh r0, [r2, #0x32] - adds r0, r2, #0 - adds r0, #0x38 - strb r6, [r0] -_080A29F4: - pop {r4, r5, r6, pc} - .align 2, 0 -_080A29F8: .4byte gRoomControls - - thumb_func_start sub_080A29FC -sub_080A29FC: @ 0x080A29FC - push {lr} - movs r1, #0x11 - movs r2, #0 - bl CreateFx - pop {pc} - - thumb_func_start sub_080A2A08 -sub_080A2A08: @ 0x080A2A08 - push {lr} - movs r1, #6 - movs r2, #0 - bl CreateFx - pop {pc} - - thumb_func_start sub_080A2A14 -sub_080A2A14: @ 0x080A2A14 - push {lr} - movs r1, #0xb - movs r2, #0 - bl CreateFx - pop {pc} - - thumb_func_start sub_080A2A20 -sub_080A2A20: @ 0x080A2A20 - push {r4, lr} - adds r4, r1, #0 - adds r3, r2, #0 - movs r1, #0 - adds r2, r4, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _080A2A38 - movs r0, #5 - strb r0, [r1, #0xe] -_080A2A38: - adds r0, r1, #0 - pop {r4, pc} - - thumb_func_start sub_080A2A3C -sub_080A2A3C: @ 0x080A2A3C - push {r4, r5, r6, lr} - adds r4, r1, #0 - adds r5, r2, #0 - adds r6, r3, #0 - movs r1, #0 - adds r2, r4, #0 - adds r3, r5, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _080A2A5E - movs r0, #5 - strb r0, [r1, #0xe] - adds r0, r1, #0 - adds r0, #0x86 - strh r6, [r0] -_080A2A5E: - adds r0, r1, #0 - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_080A2A64 -sub_080A2A64: @ 0x080A2A64 - push {lr} - movs r1, #0x20 - movs r2, #0 - bl CreateFx - adds r2, r0, #0 - cmp r2, #0 - beq _080A2A80 - adds r3, r2, #0 - adds r3, #0x29 - ldrb r0, [r3] - movs r1, #7 - orrs r0, r1 - strb r0, [r3] -_080A2A80: - adds r0, r2, #0 - pop {pc} thumb_func_start sub_080A2A84 sub_080A2A84: @ 0x080A2A84 diff --git a/asm/object49.s b/asm/object49.s index 4fa846a4..1fdfafa3 100644 --- a/asm/object49.s +++ b/asm/object49.s @@ -6,223 +6,6 @@ .text - - thumb_func_start Object49 -Object49: @ 0x0808F0A0 - push {lr} - ldr r2, _0808F0B4 @ =gUnk_08121E5C - ldrb r1, [r0, #0xa] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808F0B4: .4byte gUnk_08121E5C - - thumb_func_start sub_0808F0B8 -sub_0808F0B8: @ 0x0808F0B8 - push {lr} - ldr r2, _0808F0CC @ =gUnk_08121E88 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808F0CC: .4byte gUnk_08121E88 - - thumb_func_start sub_0808F0D0 -sub_0808F0D0: @ 0x0808F0D0 - push {r4, r5, r6, lr} - adds r5, r0, #0 - movs r1, #0x49 - movs r2, #2 - movs r3, #0 - bl CreateObjectWithParent - str r0, [r5, #0x54] - cmp r0, #0 - bne _0808F0E8 - bl DeleteThisEntity -_0808F0E8: - movs r6, #1 - strb r6, [r5, #0xc] - ldr r0, _0808F148 @ =0x0000FF40 - strh r0, [r5, #0x36] - bl Random - adds r4, r0, #0 - movs r0, #0x3f - ands r4, r0 - bl Random - ands r0, r6 - cmp r0, #0 - beq _0808F106 - rsbs r4, r4, #0 -_0808F106: - ldr r0, [r5, #0x50] - ldrh r0, [r0, #0x2e] - adds r0, r0, r4 - strh r0, [r5, #0x2e] - bl Random - adds r4, r0, #0 - movs r0, #0x1f - ands r4, r0 - bl Random - ands r0, r6 - cmp r0, #0 - beq _0808F124 - rsbs r4, r4, #0 -_0808F124: - ldr r0, [r5, #0x50] - ldrh r0, [r0, #0x32] - adds r0, r0, r4 - strh r0, [r5, #0x32] - movs r0, #0x90 - lsls r0, r0, #2 - str r0, [r5, #0x74] - movs r0, #0xa0 - lsls r0, r0, #1 - str r0, [r5, #0x78] - adds r0, r5, #0 - movs r1, #3 - bl InitializeAnimation - adds r0, r5, #0 - bl sub_0808F14C - pop {r4, r5, r6, pc} - .align 2, 0 -_0808F148: .4byte 0x0000FF40 - - thumb_func_start sub_0808F14C -sub_0808F14C: @ 0x0808F14C - push {r4, lr} - adds r4, r0, #0 - bl sub_0808F2B0 - movs r1, #0x80 - lsls r1, r1, #6 - adds r0, r4, #0 - bl sub_08003FC4 - cmp r0, #0 - bne _0808F16E - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x84 - bl PlaySFX -_0808F16E: - pop {r4, pc} - - thumb_func_start sub_0808F170 -sub_0808F170: @ 0x0808F170 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x74] - subs r0, #0x20 - str r0, [r4, #0x74] - ldr r1, [r4, #0x78] - adds r1, #0x20 - str r1, [r4, #0x78] - adds r0, r4, #0 - movs r2, #8 - movs r3, #2 - bl sub_0806FCF4 - ldr r1, [r4, #0x78] - ldr r0, _0808F1A0 @ =0x000001FF - cmp r1, r0 - bls _0808F198 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] -_0808F198: - adds r0, r4, #0 - bl sub_0808F2B0 - pop {r4, pc} - .align 2, 0 -_0808F1A0: .4byte 0x000001FF - - thumb_func_start sub_0808F1A4 -sub_0808F1A4: @ 0x0808F1A4 - push {r4, lr} - adds r4, r0, #0 - ldr r1, [r4, #0x78] - adds r1, #0x10 - str r1, [r4, #0x78] - ldr r0, [r4, #0x74] - adds r0, #0x10 - str r0, [r4, #0x74] - adds r0, r4, #0 - movs r2, #8 - movs r3, #2 - bl sub_0806FCF4 - ldr r1, [r4, #0x78] - ldr r0, _0808F1D4 @ =0x000003FF - cmp r1, r0 - bls _0808F1D8 - ldr r1, [r4, #0x54] - movs r0, #0xff - strb r0, [r1, #0xc] - bl DeleteThisEntity - b _0808F1DE - .align 2, 0 -_0808F1D4: .4byte 0x000003FF -_0808F1D8: - adds r0, r4, #0 - bl sub_0808F2B0 -_0808F1DE: - pop {r4, pc} - - thumb_func_start sub_0808F1E0 -sub_0808F1E0: @ 0x0808F1E0 - push {lr} - ldr r2, _0808F1F4 @ =gUnk_08121E98 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808F1F4: .4byte gUnk_08121E98 - - thumb_func_start sub_0808F1F8 -sub_0808F1F8: @ 0x0808F1F8 - push {r4, lr} - adds r4, r0, #0 - ldrb r2, [r4, #0x19] - movs r0, #3 - orrs r2, r0 - strb r2, [r4, #0x19] - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - ldr r3, [r4, #0x50] - ldrb r1, [r3, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - movs r0, #0x3f - ands r2, r0 - orrs r2, r1 - strb r2, [r4, #0x19] - ldrb r1, [r3, #0x1b] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r4, #0x1b] - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x1b] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_0808F244 - pop {r4, pc} - thumb_func_start sub_0808F244 sub_0808F244: @ 0x0808F244 push {r4, lr} diff --git a/asm/object86.s b/asm/object86.s deleted file mode 100644 index cfa2b565..00000000 --- a/asm/object86.s +++ /dev/null @@ -1,181 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object86 -Object86: @ 0x08099DB8 - push {lr} - ldr r2, _08099DCC @ =gUnk_081237F8 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08099DCC: .4byte gUnk_081237F8 - - thumb_func_start sub_08099DD0 -sub_08099DD0: @ 0x08099DD0 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r0, #0x38 - movs r6, #0 - movs r5, #1 - strb r5, [r0] - ldrb r0, [r4, #0x19] - movs r1, #0xc0 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - strb r6, [r4, #0xd] - movs r0, #0x46 - bl GetInventoryValue - cmp r0, #0 - beq _08099E04 - movs r0, #4 - strb r0, [r4, #0xc] - strb r6, [r4, #0x1e] - b _08099E0E -_08099E04: - strb r5, [r4, #0xc] - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation -_08099E0E: - pop {r4, r5, r6, pc} - - thumb_func_start sub_08099E10 -sub_08099E10: @ 0x08099E10 - push {r4, r5, lr} - adds r4, r0, #0 - movs r0, #0x74 - bl CheckLocalFlag - cmp r0, #0 - beq _08099E54 - adds r0, r4, #0 - bl GetNextFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - adds r5, r0, #0 - cmp r1, #1 - bne _08099E3E - ldrb r0, [r4, #0xd] - cmp r0, #0 - bne _08099E3E - strb r0, [r5] - adds r0, r4, #0 - bl sub_08099ECC -_08099E3E: - ldrb r1, [r5] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08099E54 - movs r0, #2 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation -_08099E54: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08099E58 -sub_08099E58: @ 0x08099E58 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r2, r4, #0 - adds r2, #0x5a - ldrb r1, [r2] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08099E88 - movs r0, #0x7f - ands r0, r1 - strb r0, [r2] - ldrb r0, [r4, #0xe] - adds r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #3 - bne _08099E88 - strb r0, [r4, #0xc] - movs r0, #4 - strb r0, [r4, #0x1e] -_08099E88: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08099E8C -sub_08099E8C: @ 0x08099E8C - push {r4, lr} - adds r4, r0, #0 - ldr r1, _08099EC4 @ =gLinkEntity - movs r2, #0xc - movs r3, #0xc - bl sub_080041A0 - cmp r0, #0 - beq _08099EC2 - ldrb r0, [r4, #0xd] - cmp r0, #0 - bne _08099EB2 - adds r0, r4, #0 - bl sub_08099ECC - adds r0, r4, #0 - movs r1, #0x1e - bl sub_0805E4E0 -_08099EB2: - movs r0, #0x75 - bl CheckLocalFlag - cmp r0, #0 - beq _08099EC2 - movs r0, #7 - bl sub_0805B390 -_08099EC2: - pop {r4, pc} - .align 2, 0 -_08099EC4: .4byte gLinkEntity - - thumb_func_start nullsub_534 -nullsub_534: @ 0x08099EC8 - bx lr - .align 2, 0 - - thumb_func_start sub_08099ECC -sub_08099ECC: @ 0x08099ECC - push {r4, lr} - movs r4, #0 - movs r1, #1 - strb r1, [r0, #0xd] - ldr r1, _08099EF4 @ =gLinkEntity - bl CopyPosition - ldr r2, _08099EF8 @ =gLinkState - movs r0, #3 - strb r0, [r2, #0xc] - adds r0, r2, #0 - adds r0, #0x38 - strb r4, [r0] - ldr r0, [r2, #0x30] - movs r1, #0x80 - lsls r1, r1, #8 - orrs r0, r1 - str r0, [r2, #0x30] - pop {r4, pc} - .align 2, 0 -_08099EF4: .4byte gLinkEntity -_08099EF8: .4byte gLinkState diff --git a/include/entity.h b/include/entity.h index afa1cc24..677b7d6c 100644 --- a/include/entity.h +++ b/include/entity.h @@ -1,3 +1,4 @@ +// clang-format off #ifndef ENTITY_H #define ENTITY_H @@ -39,118 +40,115 @@ union SplitHWord { } PACKED; typedef struct Entity { - u32* field_0x0; - u32* field_0x4; - EntityType entityType; - u8 action; - u8 previousActionFlag; - u8 actionDelay; - u8 field_0xf; - u8 flags; - u8 scriptedScene : 4; - u8 scriptedScene2 : 4; - s16 spriteTileSize; - u8 animationState; - u8 direction; - u8 possibleBool; - u8 field_0x17; - union { - u8 raw; - struct { - u8 ss0 : 2; - u8 ss2 : 1; - u8 ss3 : 1; - u8 ss4 : 1; - u8 ss5 : 1; - u8 ss6 : 1; - u8 ss7 : 1; - } PACKED b; - } PACKED spriteSettings; - - struct { - u8 b0 : 2; - u8 b1 : 2; - u8 b2 : 2; - u8 b3 : 2; - } PACKED spriteOrder; - - u8 palette; - struct { - u8 b0 : 4; - u8 b1 : 2; - u8 b2 : 2; - } PACKED spriteOrientation; - u8 filler[1]; - u8 field_0x1d; - u8 frameIndex; - u8 lastFrameIndex; - s32 field_0x20; - s16 nonPlanarMovement; - u8 spriteAnimation[3]; - struct { - u8 b0 : 3; - u8 b1 : 3; - u8 b2 : 2; - } PACKED ticks; - u16 collisions; - union SplitWord x; - union SplitWord y; - union SplitWord height; // todo - u8 collisionLayer; - s8 interactType; - u8 field_0x3a; - u8 flags2; - u8 field_0x3c; - u8 field_0x3d; - u8 field_0x3e; - u8 damageType; - u8 field_0x40; - u8 bitfield; - u8 field_0x42; - u8 field_0x43; - u8 field_0x44; - u8 currentHealth; - s16 field_0x46; - BoundingBox* boundingBox; - u8 field_0x4c; - u8 field_0x4d; - u8 field_0x4e; - u8 field_0x4f; - struct Entity* parent; - struct Entity* attachedEntity; - u8 animIndex; - u8 frameDuration; - union { - u8 all; - struct { - u8 f0 : 1; - u8 f1 : 5; - u8 f2 : 1; - u8 f3 : 1; - } PACKED b; - } PACKED frames; - u8 frameSpriteSettings; - Frame* animPtr; - u16 spriteVramOffset; - u8 spriteOffsetX; - u8 spriteOffsetY; - u32* otherEntity; - u8 field_0x68; - u8 field_0x69; - union SplitHWord field_0x6a; - u8 field_0x6c; - u8 field_0x6d; - u8 filler4[6]; - u16 field_0x74; - u16 field_0x76; - union SplitHWord field_0x78; - u16 field_0x7a; - union SplitWord field_0x7c; - u16 field_0x80; - u16 field_0x82; - union SplitHWord cutsceneBeh; - u16 field_0x86; - + /*0x00*/ u32* field_0x0; + /*0x04*/ u32* field_0x4; + /*0x08*/ EntityType entityType; + /*0x0c*/ u8 action; + /*0x0d*/ u8 previousActionFlag; + /*0x0e*/ u8 actionDelay; + /*0x0f*/ u8 field_0xf; + /*0x10*/ u8 flags; + /*0x11*/ u8 scriptedScene : 4; + /* */ u8 scriptedScene2 : 4; + /*0x12*/ s16 spriteTileSize; + /*0x14*/ u8 animationState; + /*0x15*/ u8 direction; + /*0x16*/ u8 possibleBool; + /*0x17*/ u8 field_0x17; + /*0x18*/ union { + /* */ u8 raw; + /* */ struct { + /* */ u8 ss0 : 2; + /* */ u8 ss2 : 1; + /* */ u8 ss3 : 1; + /* */ u8 ss4 : 1; + /* */ u8 ss5 : 1; + /* */ u8 ss6 : 1; + /* */ u8 ss7 : 1; + /* */ } PACKED b; + /* */ } PACKED spriteSettings; + /*0x19*/ struct { + /* */ u8 b0 : 2; + /* */ u8 b1 : 2; + /* */ u8 b2 : 2; + /* */ u8 b3 : 2; + /* */ } PACKED spriteOrder; + /*0x1a*/ u8 palette; + /*0x1b*/ struct { + /* */ u8 b0 : 4; + /* */ u8 b1 : 2; + /* */ u8 b2 : 2; + /* */ } PACKED spriteOrientation; + /*0x1c*/ u8 filler[1]; + /*0x1d*/ u8 field_0x1d; + /*0x1e*/ u8 frameIndex; + /*0x1f*/ u8 lastFrameIndex; + /*0x20*/ s32 field_0x20; + /*0x24*/ s16 nonPlanarMovement; + /*0x26*/ u8 spriteAnimation[3]; + /*0x29*/ struct { + /* */ u8 b0 : 3; + /* */ u8 b1 : 3; + /* */ u8 b2 : 2; + /* */ } PACKED ticks; + /*0x2a*/ u16 collisions; + /*0x2c*/ union SplitWord x; + /*0x30*/ union SplitWord y; + /*0x34*/ union SplitWord height; // todo + /*0x38*/ u8 collisionLayer; + /*0x39*/ s8 interactType; + /*0x3a*/ u8 field_0x3a; + /*0x3b*/ u8 flags2; + /*0x3c*/ u8 field_0x3c; + /*0x3d*/ u8 hurtBlinkTime; + /*0x3e*/ u8 field_0x3e; + /*0x3f*/ u8 damageType; + /*0x40*/ u8 field_0x40; + /*0x41*/ u8 bitfield; + /*0x42*/ u8 field_0x42; + /*0x43*/ u8 field_0x43; + /*0x44*/ u8 field_0x44; + /*0x45*/ u8 currentHealth; + /*0x46*/ s16 field_0x46; + /*0x48*/ BoundingBox* boundingBox; + /*0x4c*/ u8 field_0x4c; + /*0x4d*/ u8 field_0x4d; + /*0x4e*/ u8 field_0x4e; + /*0x4f*/ u8 field_0x4f; + /*0x50*/ struct Entity* parent; + /*0x54*/ struct Entity* attachedEntity; + /*0x58*/ u8 animIndex; + /*0x59*/ u8 frameDuration; + /*0x5a*/ union { + /* */ u8 all; + /* */ struct { + /* */ u8 f0 : 1; + /* */ u8 f1 : 5; + /* */ u8 f2 : 1; + /* */ u8 f3 : 1; + /* */ } PACKED b; + /* */ } PACKED frames; + /*0x5b*/ u8 frameSpriteSettings; + /*0x5c*/ Frame* animPtr; + /*0x60*/ u16 spriteVramOffset; + /*0x62*/ u8 spriteOffsetX; + /*0x64*/ u8 spriteOffsetY; + /*0x64*/ u32* otherEntity; + /*0x68*/ u8 field_0x68; + /*0x69*/ u8 field_0x69; + /*0x6a*/ union SplitHWord field_0x6a; + /*0x6c*/ u8 field_0x6c; + /*0x6d*/ u8 field_0x6d; + /*0x6e*/ u8 filler4[6]; + /*0x74*/ u16 field_0x74; + /*0x76*/ u16 field_0x76; + /*0x78*/ union SplitHWord field_0x78; + /*0x7a*/ u16 field_0x7a; + /*0x7c*/ union SplitWord field_0x7c; + /*0x80*/ u16 field_0x80; + /*0x82*/ u16 field_0x82; + /*0x84*/ union SplitHWord cutsceneBeh; + /*0x86*/ u16 field_0x86; } Entity; #define COORD_TO_TILE(entity) \ diff --git a/linker.ld b/linker.ld index 4a36d0c4..a74be327 100644 --- a/linker.ld +++ b/linker.ld @@ -729,6 +729,7 @@ SECTIONS { src/heartContainer.o(.text); asm/heartContainer.o(.text); asm/object48.o(.text); + src/object49.o(.text); asm/object49.o(.text); asm/backgroundCloud.o(.text); asm/object4B.o(.text); @@ -789,7 +790,7 @@ SECTIONS { asm/bigPushableLever.o(.text); asm/smallIceBlock.o(.text); asm/bigIceBlock.o(.text); - asm/object86.o(.text); + src/object86.o(.text); asm/object87.o(.text); asm/macroBook.o(.text); asm/object89.o(.text); @@ -858,6 +859,7 @@ SECTIONS { src/createObject.o(.text); src/createObjectWithParent.o(.text); asm/createFx.o(.text); + src/code_080A29BC.o(.text); asm/code_080A29BC.o(.text); asm/playSFX.o(.text); asm/code_080A3480.o(.text); diff --git a/src/code_080A29BC.c b/src/code_080A29BC.c new file mode 100644 index 00000000..0e093ab3 --- /dev/null +++ b/src/code_080A29BC.c @@ -0,0 +1,69 @@ +#include "global.h" +#include "entity.h" +#include "room.h" + +void sub_080A29BC(Entity *parent) +{ + CreateFx(parent, 2, 0); +} + +void sub_080A29C8(s32 xOff, s32 yOff, u32 layer) +{ + Entity *pEVar1; + + pEVar1 = CreateObject(0xf, 2, 0); + if (pEVar1 != NULL) { + pEVar1->x.HALF.HI = gRoomControls.roomOriginX + xOff; + pEVar1->y.HALF.HI = gRoomControls.roomOriginY + yOff; + pEVar1->collisionLayer = layer; + } +} + +void sub_080A29FC(Entity *parent) +{ + CreateFx(parent, 0x11, 0); +} + +void sub_080A2A08(Entity *parent) +{ + CreateFx(parent, 0x6, 0); +} + +void sub_080A2A14(Entity *parent) +{ + CreateFx(parent, 0xb, 0); +} + +Entity * sub_080A2A20(Entity *parent, u32 form, u32 parameter) +{ + Entity *pEVar1; + + pEVar1 = CreateObjectWithParent(parent, 0, form, parameter); + if (pEVar1 != NULL) { + pEVar1->actionDelay = 5; + } + return pEVar1; +} + +Entity * sub_080A2A3C(Entity *parent, u32 form, u32 subtype, u32 param_4) +{ + Entity *ent; + + ent = CreateObjectWithParent(parent, 0, form, subtype); + if (ent != NULL) { + ent->actionDelay = 5; + ent->field_0x86 = param_4; + } + return ent; +} + +Entity * sub_080A2A64(Entity *parent) +{ + Entity *pEVar1; + + pEVar1 = CreateFx(parent, 0x20, 0); + if (pEVar1 != NULL) { + pEVar1->ticks.b0 = 7; + } + return pEVar1; +} \ No newline at end of file diff --git a/src/object49.c b/src/object49.c new file mode 100644 index 00000000..3489f9e6 --- /dev/null +++ b/src/object49.c @@ -0,0 +1,102 @@ +#include "global.h" +#include "entity.h" + +extern u32 Random(void); +extern void sub_0808F2B0(Entity*); +extern u32 sub_08003FC4(Entity*, u32); +void sub_0808F14C(Entity*); +extern void PlaySFX(u32); +extern void sub_0806FCF4(Entity*, u32, u32, u32); +extern void sub_0808F244(Entity*); + +extern void (*const gUnk_08121E5C[])(Entity*); +extern void (*const gUnk_08121E88[])(Entity*); +extern void (*const gUnk_08121E98[])(Entity*); + +void Object49(Entity* this) { + gUnk_08121E5C[this->entityType.form](this); +} + +void sub_0808F0B8(Entity* this) { + gUnk_08121E88[this->action](this); +} + +void sub_0808F0D0(Entity* this) { + u32 offsetX; + u32 offsetY; + Entity* ent; + u32 uVar3; + + ent = CreateObjectWithParent(this, 0x49, 2, 0); + this->attachedEntity = ent; + if (ent == NULL) { + DeleteThisEntity(); + } + this->action = 1; + this->height.HALF.HI = -0xc0; + offsetX = Random() % 64; + if ((Random() & 1) != 0) { + offsetX = -offsetX; + } + this->x.HALF.HI = this->parent->x.HALF.HI + offsetX; + offsetY = Random() % 32; + if ((Random() & 1) != 0) { + offsetY = -offsetY; + } + this->y.HALF.HI = this->parent->y.HALF.HI + offsetY; + *(u32*)&this->field_0x74 = 0x240; + *(u32*)&this->field_0x78 = 0x140; + InitializeAnimation(this, 3); + sub_0808F14C(this); +} + +void sub_0808F14C(Entity* this) { + sub_0808F2B0(this); + if (sub_08003FC4(this, 0x2000) == 0) { + this->action++; + PlaySFX(0x84); + } +} + +void sub_0808F170(Entity *this) +{ + *(u32 *)&this->field_0x74 -= 0x20; + *(u32 *)&this->field_0x78 += 0x20; + sub_0806FCF4(this, *(u32 *)&this->field_0x78, 8, 2); + if (*(u32 *)&this->field_0x78 > 0x1ff) { + this->action++; + } + sub_0808F2B0(this); +} + +void sub_0808F1A4(Entity *this) +{ + *(u32 *)&this->field_0x78 += 0x10; + *(u32 *)&this->field_0x74 += 0x10; + sub_0806FCF4(this, *(u32 *)&this->field_0x78, 8, 2); + if (*(u32 *)&this->field_0x78 > 0x3ff) { + this->attachedEntity->action = 0xff; + DeleteThisEntity(); + } + else { + sub_0808F2B0(this); + } +} + +void sub_0808F1E0(Entity *this) +{ + gUnk_08121E98[this->action](this); +} + +void sub_0808F1F8(Entity *this) +{ + u8 bVar1; + + this->spriteOrder.b0 = 3; + this->action++; + this->spriteOrder.b3 = this->parent->spriteOrder.b3; + this->spriteOrientation.b2 = this->parent->spriteOrientation.b2; + this->ticks.b0 = 7; + InitializeAnimation(this, 1); + sub_0808F244(this); +} \ No newline at end of file diff --git a/src/object86.c b/src/object86.c new file mode 100644 index 00000000..78800531 --- /dev/null +++ b/src/object86.c @@ -0,0 +1,81 @@ +#include "global.h" +#include "entity.h" +#include "link.h" +#include "flags.h" + +extern u32 sub_080041A0(Entity*, Entity*, u32, u32); +void sub_08099ECC(Entity*); +extern void sub_0805E4E0(Entity*, u32); +extern void sub_0805B390(u32); +extern void CopyPosition(Entity*, Entity*); + +extern void (*const gUnk_081237F8[])(Entity*); + +void Object86(Entity* this) { + gUnk_081237F8[this->action](this); +} + +void sub_08099DD0(Entity* this) { + this->collisionLayer = 1; + this->spriteOrder.b3 = 3; + this->ticks.b0 = 7; + this->previousActionFlag = 0; + if (GetInventoryValue(0x46)) { + this->action = 4; + this->frameIndex = 0; + } else { + this->action = 1; + InitializeAnimation(this, 0); + } +} + +void sub_08099E10(Entity* this) { + if (CheckLocalFlag(0x74)) { + GetNextFrame(this); + if ((this->frames.all == 1) && (this->previousActionFlag == 0)) { + this->frames.all = 0; + sub_08099ECC(this); + } + if (this->frames.b.f3) { + this->action = 2; + InitializeAnimation(this, 1); + } + } +} + +void sub_08099E58(Entity *this) +{ + GetNextFrame(this); + if (this->frames.b.f3) { + this->frames.b.f3 = 0; + this->actionDelay++; + if (this->actionDelay == 3) { + this->action = 3; + this->frameIndex = 4; + } + } +} + +void sub_08099E8C(Entity *this) +{ + if (sub_080041A0(this, &gLinkEntity, 0xc, 0xc)) { + if (this->previousActionFlag == 0) { + sub_08099ECC(this); + sub_0805E4E0(this, 0x1e); + } + if (CheckLocalFlag(0x75)) { + sub_0805B390(0x7); + } + } +} + +void nullsub_534(Entity* this) {} + +void sub_08099ECC(Entity *this) +{ + this->previousActionFlag = 1; + CopyPosition(this, &gLinkEntity); + gLinkState.linkAction = 3; + gLinkState.filler12[4] = 0; + gLinkState.flags.all |= 0x8000; +}