diff --git a/asm/objectA2.s b/asm/objectA2.s deleted file mode 100644 index 4be6e53f..00000000 --- a/asm/objectA2.s +++ /dev/null @@ -1,244 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ObjectA2 -ObjectA2: @ 0x0809F2F8 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0809F314 @ =gUnk_081246F4 - 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 GetNextFrame - pop {r4, pc} - .align 2, 0 -_0809F314: .4byte gUnk_081246F4 - - thumb_func_start sub_0809F318 -sub_0809F318: @ 0x0809F318 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0 - bl InitializeAnimation - bl Random - movs r1, #0x10 - ands r1, r0 - cmp r1, #0 - beq _0809F336 - ldrb r0, [r4, #0x18] - movs r1, #0x40 - orrs r0, r1 - strb r0, [r4, #0x18] -_0809F336: - movs r0, #0x28 - strh r0, [r4, #0x2e] - movs r0, #0x48 - strh r0, [r4, #0x32] - ldr r0, _0809F36C @ =0x0000FFB0 - strh r0, [r4, #0x36] - ldrb r1, [r4, #0x1b] - movs r0, #0x3f - ands r0, r1 - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x1b] - movs r0, #1 - strb r0, [r4, #0xc] - ldr r1, _0809F370 @ =gUnk_08124704 - ldrb r0, [r4, #0xa] - adds r0, r0, r1 - ldrb r1, [r0] - adds r0, r4, #0 - bl sub_0801D2B4 - adds r0, r4, #0 - movs r1, #7 - bl sub_0805E3A0 - pop {r4, pc} - .align 2, 0 -_0809F36C: .4byte 0x0000FFB0 -_0809F370: .4byte gUnk_08124704 - - thumb_func_start sub_0809F374 -sub_0809F374: @ 0x0809F374 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F69C - movs r0, #0x80 - lsls r0, r0, #0x12 - ldrb r0, [r0, #7] - cmp r0, #1 - bhi _0809F3AE - movs r1, #0x80 - lsls r1, r1, #6 - adds r0, r4, #0 - bl sub_080044EC - cmp r0, #1 - bhi _0809F3C0 - movs r0, #0 - str r0, [r4, #0x34] - movs r0, #2 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation - movs r0, #0xc3 - lsls r0, r0, #1 - bl PlaySFX - b _0809F3E6 -_0809F3AE: - movs r1, #0x80 - lsls r1, r1, #6 - adds r0, r4, #0 - bl sub_080044EC - cmp r0, #0 - beq _0809F3C8 - cmp r0, #1 - beq _0809F3D4 -_0809F3C0: - ldrb r0, [r4, #0xe] - adds r0, #1 - strb r0, [r4, #0xe] - b _0809F3E6 -_0809F3C8: - movs r0, #2 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation -_0809F3D4: - movs r0, #0 - strb r0, [r4, #0xe] - adds r0, r4, #0 - bl sub_0809F448 - movs r0, #0xc3 - lsls r0, r0, #1 - bl PlaySFX -_0809F3E6: - pop {r4, pc} - - thumb_func_start sub_0809F3E8 -sub_0809F3E8: @ 0x0809F3E8 - push {lr} - adds r2, r0, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0809F404 - movs r0, #3 - strb r0, [r2, #0xc] - adds r0, r2, #0 - movs r1, #2 - bl InitializeAnimation -_0809F404: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0809F408 -sub_0809F408: @ 0x0809F408 - push {lr} - adds r2, r0, #0 - adds r1, r2, #0 - adds r1, #0x5a - ldrb r0, [r1] - cmp r0, #9 - beq _0809F41C - cmp r0, #0x80 - beq _0809F438 - b _0809F442 -_0809F41C: - movs r0, #0 - strb r0, [r1] - adds r0, r2, #0 - movs r1, #0x43 - movs r2, #0 - bl CreateFx - ldr r1, _0809F434 @ =gMenu - movs r0, #1 - strb r0, [r1] - b _0809F442 - .align 2, 0 -_0809F434: .4byte gMenu -_0809F438: - ldr r1, _0809F444 @ =gMenu - movs r0, #1 - strb r0, [r1, #4] - bl DeleteThisEntity -_0809F442: - pop {pc} - .align 2, 0 -_0809F444: .4byte gMenu - - thumb_func_start sub_0809F448 -sub_0809F448: @ 0x0809F448 - push {r4, r5, r6, r7, lr} - adds r6, r0, #0 - bl Random - adds r5, r0, #0 - ldrb r0, [r6, #0xf] - lsls r2, r0, #1 - ldr r1, _0809F474 @ =gUnk_08124708 - adds r7, r2, r1 - adds r0, #1 - strb r0, [r6, #0xf] - ldr r1, [r6, #0x2c] - movs r0, #0xa0 - lsls r0, r0, #0xe - subs r4, r0, r1 - ldrb r0, [r7] - cmp r0, #0 - beq _0809F478 - cmp r0, #1 - beq _0809F492 - b _0809F49C - .align 2, 0 -_0809F474: .4byte gUnk_08124708 -_0809F478: - movs r1, #0xc0 - lsls r1, r1, #0xd - adds r0, r5, #0 - bl __modsi3 - adds r4, r0, #0 - movs r0, #0x80 - lsls r0, r0, #0x11 - ands r0, r5 - cmp r0, #0 - beq _0809F49C - rsbs r4, r4, #0 - b _0809F49C -_0809F492: - ldr r0, _0809F4BC @ =0xFFF80000 - adds r1, r4, r0 - ldr r0, _0809F4C0 @ =0x000FFFFF - ands r0, r5 - adds r4, r1, r0 -_0809F49C: - adds r0, r4, #0 - cmp r4, #0 - bge _0809F4A4 - rsbs r0, r4, #0 -_0809F4A4: - ldrb r1, [r7, #1] - lsls r1, r1, #8 - bl __divsi3 - strh r0, [r6, #0x24] - adds r0, r4, #0 - movs r1, #0 - bl sub_080045DA - lsrs r0, r0, #3 - strb r0, [r6, #0x15] - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0809F4BC: .4byte 0xFFF80000 -_0809F4C0: .4byte 0x000FFFFF diff --git a/linker.ld b/linker.ld index ddbdd4c5..8029ba57 100644 --- a/linker.ld +++ b/linker.ld @@ -842,7 +842,7 @@ SECTIONS { asm/fan.o(.text); asm/objectA0.o(.text); src/object/palaceArchway.o(.text); - asm/objectA2.o(.text); + src/object/objectA2.o(.text); src/object/cloud.o(.text); src/object/minishLight.o(.text); asm/objectA5.o(.text); diff --git a/src/object/objectA2.c b/src/object/objectA2.c new file mode 100644 index 00000000..0e0337fb --- /dev/null +++ b/src/object/objectA2.c @@ -0,0 +1,108 @@ +#include "global.h" +#include "object.h" +#include "menu.h" +#include "structures.h" +#include "functions.h" + +extern void (* const gUnk_081246F4[])(Entity*); +extern const u8 gUnk_08124704[]; + +typedef struct { + u8 unk_0; + u8 unk_1; +} PACKED struct_08124708; + +extern const struct_08124708 gUnk_08124708[]; + +void sub_0809F448(Entity*); + +void ObjectA2(Entity* this) { + gUnk_081246F4[this->action](this); + GetNextFrame(this); +} + +void sub_0809F318(Entity* this) { + InitializeAnimation(this, 0); + if (Random() & 0x10) { + this->spriteSettings.b.flipX = 1; + } + this->x.HALF.HI = 0x28; + this->y.HALF.HI = 0x48; + this->height.HALF.HI = 0xFFB0; + this->spriteOrientation.flipY = 2; + this->action = 1; + sub_0801D2B4(this, gUnk_08124704[this->entityType.form]); + sub_0805E3A0(this, 7); +} + +void sub_0809F374(Entity* this) { + sub_0806F69C(this); + if (gUnk_02000000->gameLanguage < 2) { + if (sub_080044EC(this, 0x2000) < 2) { + this->height.WORD = 0; + this->action = 2; + InitializeAnimation(this, 1); + PlaySFX(0x186); + } else { + this->actionDelay++; + } + } else { + switch (sub_080044EC(this, 0x2000)) { + default: + this->actionDelay++; + break; + case 0: + this->action = 2; + InitializeAnimation(this, 1); + //fall through + case 1: + this->actionDelay = 0; + sub_0809F448(this); + PlaySFX(0x186); + } + } +} + +void sub_0809F3E8(Entity* this) { + if (this->frames.b.f3) { + this->action = 3; + InitializeAnimation(this, 2); + } +} + +void sub_0809F408(Entity* this) { + switch (this->frames.all) { + case 9: + this->frames.all = 0; + CreateFx(this, 0x43, 0); + gMenu.field_0x0 = 1; + break; + case 0x80: + gMenu.field_0x4 = 1; + DeleteThisEntity(); + } +} + +extern u32 sub_080045DA(s32, u32); + +void sub_0809F448(Entity* this) { + s32 tmp; + int rand = Random(); + const struct_08124708 *tmp2 = &gUnk_08124708[this->field_0xf]; + this->field_0xf++; + tmp = 0x280000 - this->x.WORD; + + switch (tmp2->unk_0) { + case 0: + tmp = rand % 0x180000; + if (rand & 0x1000000) { + tmp = -tmp; + } + break; + case 1: + tmp += -0x80000 + (rand & 0xFFFFF); + break; + } + this->nonPlanarMovement = (tmp > 0 ? tmp : -tmp) / (tmp2->unk_1 << 8); + this->direction = sub_080045DA(tmp, 0) >> 3; +}