diff --git a/asm/non_matching/objectBD/sub_080A22C4.inc b/asm/non_matching/objectBD/sub_080A22C4.inc new file mode 100644 index 00000000..20ae077f --- /dev/null +++ b/asm/non_matching/objectBD/sub_080A22C4.inc @@ -0,0 +1,66 @@ + .syntax unified + push {r4, r5, lr} + adds r4, r0, #0 + ldrb r5, [r4, #0xc] + cmp r5, #0 + beq _080A22FC + cmp r5, #1 + beq _080A231C + ldrb r0, [r4, #0xe] + subs r0, #1 + strb r0, [r4, #0xe] + lsls r0, r0, #0x18 + cmp r0, #0 + bne _080A233E + movs r0, #8 + strb r0, [r4, #0xe] + ldrb r0, [r4, #0xf] + adds r0, #1 + movs r1, #3 + ands r0, r1 + strb r0, [r4, #0xf] + ldrb r1, [r4, #0xd] + adds r0, r1, r0 + strb r0, [r4, #0x1e] + lsls r1, r1, #0x18 + lsls r0, r0, #0x18 + cmp r1, r0 + bne _080A233E + b _080A233A +_080A22FC: + adds r0, r4, #0 + bl sub_080A2340 + movs r0, #8 + strb r0, [r4, #0xe] + strb r5, [r4, #0xf] + ldrb r0, [r4, #0x1e] + strb r0, [r4, #0xd] + bl Random + movs r1, #3 + ands r0, r1 + lsls r0, r0, #4 + adds r0, #0x1e + strh r0, [r4, #0x24] + b _080A233E +_080A231C: + ldrh r0, [r4, #0x24] + subs r0, #1 + strh r0, [r4, #0x24] + lsls r0, r0, #0x10 + cmp r0, #0 + bne _080A233E + bl Random + movs r1, #7 + ands r0, r1 + lsls r0, r0, #4 + adds r0, #0x1e + strh r0, [r4, #0x24] + movs r0, #2 + b _080A233C +_080A233A: + movs r0, #1 +_080A233C: + strb r0, [r4, #0xc] +_080A233E: + pop {r4, r5, pc} + .syntax divided diff --git a/asm/object/objectBD.s b/asm/object/objectBD.s deleted file mode 100644 index bd5c073d..00000000 --- a/asm/object/objectBD.s +++ /dev/null @@ -1,182 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ObjectBD -ObjectBD: @ 0x080A225C - push {lr} - ldr r2, _080A2270 @ =gUnk_0812503C - ldrb r1, [r0, #0xa] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_080A2270: .4byte gUnk_0812503C - - thumb_func_start sub_080A2274 -sub_080A2274: @ 0x080A2274 - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xc] - cmp r0, #0 - bne _080A22AE - adds r0, r1, #0 - bl sub_080A2340 - movs r0, #0xbd - movs r1, #1 - movs r2, #0 - bl CreateObject - movs r0, #0x80 - lsls r0, r0, #0x12 - ldrb r0, [r0, #7] - movs r1, #3 - cmp r0, #1 - bne _080A229C - movs r1, #2 -_080A229C: - movs r0, #0xbd - movs r2, #0 - bl CreateObject - movs r0, #0xbd - movs r1, #4 - movs r2, #0 - bl CreateObject -_080A22AE: - pop {pc} - - thumb_func_start sub_080A22B0 -sub_080A22B0: @ 0x080A22B0 - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xc] - cmp r0, #0 - bne _080A22C0 - adds r0, r1, #0 - bl sub_080A2340 -_080A22C0: - pop {pc} - .align 2, 0 - - thumb_func_start sub_080A22C4 -sub_080A22C4: @ 0x080A22C4 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r5, [r4, #0xc] - cmp r5, #0 - beq _080A22FC - cmp r5, #1 - beq _080A231C - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A233E - movs r0, #8 - strb r0, [r4, #0xe] - ldrb r0, [r4, #0xf] - adds r0, #1 - movs r1, #3 - ands r0, r1 - strb r0, [r4, #0xf] - ldrb r1, [r4, #0xd] - adds r0, r1, r0 - strb r0, [r4, #0x1e] - lsls r1, r1, #0x18 - lsls r0, r0, #0x18 - cmp r1, r0 - bne _080A233E - b _080A233A -_080A22FC: - adds r0, r4, #0 - bl sub_080A2340 - movs r0, #8 - strb r0, [r4, #0xe] - strb r5, [r4, #0xf] - ldrb r0, [r4, #0x1e] - strb r0, [r4, #0xd] - bl Random - movs r1, #3 - ands r0, r1 - lsls r0, r0, #4 - adds r0, #0x1e - strh r0, [r4, #0x24] - b _080A233E -_080A231C: - ldrh r0, [r4, #0x24] - subs r0, #1 - strh r0, [r4, #0x24] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _080A233E - bl Random - movs r1, #7 - ands r0, r1 - lsls r0, r0, #4 - adds r0, #0x1e - strh r0, [r4, #0x24] - movs r0, #2 - b _080A233C -_080A233A: - movs r0, #1 -_080A233C: - strb r0, [r4, #0xc] -_080A233E: - pop {r4, r5, pc} - - thumb_func_start sub_080A2340 -sub_080A2340: @ 0x080A2340 - ldrb r1, [r0, #0xa] - lsls r1, r1, #3 - ldr r2, _080A239C @ =gUnk_08125014 - adds r1, r1, r2 - ldrh r2, [r1] - strh r2, [r0, #0x2e] - ldrh r2, [r1, #2] - strh r2, [r0, #0x32] - ldrh r2, [r1, #4] - strb r2, [r0, #0x1e] - ldrb r1, [r1, #6] - movs r2, #0x29 - adds r2, r2, r0 - mov ip, r2 - movs r2, #7 - ands r2, r1 - mov r1, ip - ldrb r3, [r1] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r3 - orrs r1, r2 - mov r2, ip - strb r1, [r2] - ldrb r3, [r0, #0x19] - movs r2, #0x3f - adds r1, r2, #0 - ands r1, r3 - movs r3, #0x40 - orrs r1, r3 - strb r1, [r0, #0x19] - ldrb r1, [r0, #0x1b] - ands r2, r1 - orrs r2, r3 - strb r2, [r0, #0x1b] - ldrb r2, [r0, #0x18] - movs r1, #4 - rsbs r1, r1, #0 - ands r1, r2 - movs r2, #2 - orrs r1, r2 - strb r1, [r0, #0x18] - movs r1, #1 - strb r1, [r0, #0xc] - bx lr - .align 2, 0 -_080A239C: .4byte gUnk_08125014 diff --git a/assets/assets.json b/assets/assets.json index 8a554e60..48bcb6a2 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -45179,11 +45179,6 @@ "start": 1200144, "size": 4 }, - { - "path": "objectBD/gUnk_08125014.bin", - "start": 1200148, - "size": 40 - }, { "path": "animations/gSpriteAnimations_Pinwheel_0.bin", "start": 1200232, diff --git a/data/const/object/objectBD.s b/data/const/object/objectBD.s deleted file mode 100644 index 18665ac9..00000000 --- a/data/const/object/objectBD.s +++ /dev/null @@ -1,15 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08125014:: @ 08125014 - .incbin "objectBD/gUnk_08125014.bin" - -gUnk_0812503C:: @ 0812503C - .4byte sub_080A2274 - .4byte sub_080A22B0 - .4byte sub_080A22B0 - .4byte sub_080A22B0 - .4byte sub_080A22C4 diff --git a/linker.ld b/linker.ld index 3e2b630f..923631c2 100644 --- a/linker.ld +++ b/linker.ld @@ -813,7 +813,7 @@ SECTIONS { src/object/gyorgBossObject.o(.text); src/object/windcrest.o(.text); src/object/litArea.o(.text); - asm/object/objectBD.o(.text); + src/object/objectBD.o(.text); src/object/pinwheel.o(.text); src/object/objectBF.o(.text); src/object/enemyItem.o(.text); @@ -1567,7 +1567,7 @@ SECTIONS { data/const/object/objectB9.o(.rodata); src/object/gyorgBossObject.o(.rodata); data/const/object/windcrest.o(.rodata); - data/const/object/objectBD.o(.rodata); + src/object/objectBD.o(.rodata); data/const/object/pinwheel.o(.rodata); data/animations/object/pinwheel.o(.rodata); src/object/objectC1.o(.rodata); diff --git a/src/object/objectBD.c b/src/object/objectBD.c new file mode 100644 index 00000000..6e12c57c --- /dev/null +++ b/src/object/objectBD.c @@ -0,0 +1,112 @@ +/** + * @file objectBD.c + * @ingroup Objects + * + * @brief ObjectBD object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +void sub_080A2274(Entity*); +void sub_080A22B0(Entity*); +void sub_080A22C4(Entity*); +void sub_080A2340(Entity*); + +typedef struct { + u16 unk_0; + u16 unk_2; + u16 unk_4; + u8 unk_6; + u8 pad; +} struct_08125014; + +const struct_08125014 gUnk_08125014[] = { + { 120, 48, 16, 4, 0 }, { 136, 81, 22, 3, 0 }, { 190, 20, 25, 2, 0 }, { 192, 81, 26, 2, 0 }, { 32, 104, 27, 3, 0 }, +}; + +void ObjectBD(Entity* this) { + static void (*const gUnk_0812503C[])(Entity*) = { + sub_080A2274, sub_080A22B0, sub_080A22B0, sub_080A22B0, sub_080A22C4, + }; + gUnk_0812503C[this->type](this); +} + +void sub_080A2274(Entity* this) { + u32 addr; + u32 type; + + if (this->action == 0) { + sub_080A2340(this); + CreateObject(OBJECT_BD, 1, 0); + addr = 0x02000000; // TODO write to 0x2000007 + if (*(u8*)(addr + 7) == 1) { + type = 2; + } else { + type = 3; + } + CreateObject(OBJECT_BD, type, 0); + CreateObject(OBJECT_BD, 4, 0); + } +} + +void sub_080A22B0(Entity* this) { + if (this->action == 0) { + sub_080A2340(this); + } +} + +NONMATCH("asm/non_matching/objectBD/sub_080A22C4.inc", void sub_080A22C4(Entity* this)) { + u8 bVar1; + u8 uVar2; + s16 sVar3; + u32 uVar4; + u32 tmp1, tmp2, tmp3, tmp4; + + switch (this->action) { + case 0: + sub_080A2340(this); + this->actionDelay = 8; + this->field_0xf = 0; + this->subAction = this->frameIndex; + this->speed = (Random() & 3) * 0x10 + 0x1e; + break; + case 1: + if (--this->speed != 0) { + return; + } + this->speed = (Random() & 7) * 0x10 + 0x1e; + this->action = 2; + break; + default: + if (--this->actionDelay != 0) { + return; + } + this->actionDelay = 8; + this->field_0xf = tmp2 = (this->field_0xf + 1) & 3; + tmp3 = this->subAction; + tmp1 = tmp3 + tmp2; + this->frameIndex = tmp1; + if (tmp3 * 0x1000000 != tmp1 * 0x1000000) { + return; + } + this->action = 1; + break; + } +} +END_NONMATCH + +void sub_080A2340(Entity* this) { + const struct_08125014* ptr; + ptr = &gUnk_08125014[this->type]; + this->x.HALF.HI = ptr->unk_0; + this->y.HALF.HI = ptr->unk_2; + this->frameIndex = ptr->unk_4; + this->spritePriority.b0 = ptr->unk_6; + this->spriteRendering.b3 = 1; + this->spriteOrientation.flipY = 1; + this->spriteSettings.draw = 2; + this->action = 1; +}