diff --git a/asm/object/object9.s b/asm/object/object9.s deleted file mode 100644 index 2cbdec01..00000000 --- a/asm/object/object9.s +++ /dev/null @@ -1,300 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object9 -Object9: @ 0x0808386C - push {r4, lr} - adds r4, r0, #0 - ldr r0, _080838C8 @ =gPlayerState - adds r0, #0x27 - ldrb r1, [r0] - rsbs r0, r1, #0 - orrs r0, r1 - lsrs r2, r0, #0x1f - ldr r0, _080838CC @ =gFuseInfo - ldrb r0, [r0] - cmp r0, #2 - bgt _08083894 - cmp r0, #0 - blt _08083894 - ldr r0, _080838D0 @ =gMessage - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - beq _080838AC -_08083894: - ldr r0, _080838D4 @ =gUnk_03003DF0 - ldr r0, [r0, #4] - ldrb r0, [r0, #3] - cmp r0, #0x32 - bne _080838AA - movs r0, #0x32 - bl CheckKinstoneFused - movs r2, #0 - cmp r0, #0 - beq _080838AC -_080838AA: - movs r2, #1 -_080838AC: - cmp r2, #0 - beq _080838B6 - adds r0, r4, #0 - bl sub_080838DC -_080838B6: - ldr r0, _080838D8 @ =gUnk_0811F754 - ldrb r1, [r4, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 - pop {r4, pc} - .align 2, 0 -_080838C8: .4byte gPlayerState -_080838CC: .4byte gFuseInfo -_080838D0: .4byte gMessage -_080838D4: .4byte gUnk_03003DF0 -_080838D8: .4byte gUnk_0811F754 - - thumb_func_start sub_080838DC -sub_080838DC: @ 0x080838DC - ldrb r2, [r0, #0x18] - movs r1, #4 - rsbs r1, r1, #0 - ands r1, r2 - strb r1, [r0, #0x18] - ldrb r2, [r0, #0x1b] - movs r3, #0x3f - adds r1, r3, #0 - ands r1, r2 - movs r2, #0x40 - orrs r1, r2 - strb r1, [r0, #0x1b] - ldrb r1, [r0, #0x19] - ands r3, r1 - strb r3, [r0, #0x19] - adds r3, r0, #0 - adds r3, #0x29 - ldrb r2, [r3] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r2 - strb r1, [r3] - movs r2, #0 - movs r1, #4 - strb r1, [r0, #0xe] - str r2, [r0, #0x54] - strb r2, [r0, #0xc] - bx lr - - thumb_func_start sub_08083914 -sub_08083914: @ 0x08083914 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x26 - ldrb r0, [r0] - cmp r0, #1 - beq _08083942 - adds r0, r4, #0 - movs r1, #1 - movs r2, #1 - bl LoadSwapGFX - adds r0, r4, #0 - adds r0, #0x60 - ldrh r1, [r0] - subs r1, #0x10 - strh r1, [r0] - ldr r1, _08083958 @ =0x01027820 - movs r0, #1 - bl sub_080ADDD8 - adds r0, r4, #0 - bl sub_080838DC -_08083942: - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x10] - movs r0, #0x20 - orrs r0, r1 - strb r0, [r4, #0x10] - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority - pop {r4, pc} - .align 2, 0 -.ifdef EU -_08083958: .4byte 0x010277E0 -.else -_08083958: .4byte 0x01027820 -.endif - - thumb_func_start sub_0808395C -sub_0808395C: @ 0x0808395C - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xe] - cmp r0, #0 - beq _0808396C - subs r0, #1 - strb r0, [r2, #0xe] - b _08083992 -_0808396C: - ldr r3, _08083994 @ =gUnk_03003DF0 - ldr r0, [r3, #4] - ldr r1, [r0, #8] - cmp r1, #0 - beq _08083992 - ldrb r0, [r0, #3] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x63 - bhi _08083992 - str r1, [r2, #0x54] - ldrb r0, [r3, #3] - adds r1, r2, #0 - adds r1, #0x39 - strb r0, [r1] - adds r0, r2, #0 - bl sub_08083A40 -_08083992: - pop {pc} - .align 2, 0 -_08083994: .4byte gUnk_03003DF0 - - thumb_func_start sub_08083998 -sub_08083998: @ 0x08083998 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #1 - beq _080839C8 - ldr r0, _080839C4 @ =gUnk_03003DF0 - ldr r2, [r0, #4] - ldrb r0, [r2, #3] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x63 - bhi _080839BA - ldr r1, [r4, #0x54] - ldr r0, [r2, #8] - cmp r1, r0 - beq _080839C8 -_080839BA: - adds r0, r4, #0 - bl sub_080838DC - b _08083A32 - .align 2, 0 -_080839C4: .4byte gUnk_03003DF0 -_080839C8: - ldr r1, [r4, #0x54] - ldr r0, [r1, #0x2c] - str r0, [r4, #0x2c] - ldr r0, [r1, #0x30] - str r0, [r4, #0x30] - ldr r0, [r1, #0x34] - str r0, [r4, #0x34] - adds r1, r4, #0 - adds r1, #0x5a - ldrb r0, [r1] - cmp r0, #1 - bne _08083A2C - movs r0, #0 - strb r0, [r1] - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _080839F8 - ldr r0, _080839F4 @ =gUnk_03003DF0 - ldr r0, [r0, #4] - ldrb r0, [r0, #3] - b _080839FA - .align 2, 0 -_080839F4: .4byte gUnk_03003DF0 -_080839F8: - ldrb r0, [r4, #0xb] -_080839FA: - lsls r0, r0, #3 - ldr r1, _08083A34 @ =gUnk_080C9CBC - adds r0, r0, r1 - ldrb r2, [r0, #6] - movs r1, #1 - ands r1, r2 - ldrb r3, [r4, #0x1a] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r3 - orrs r0, r1 - strb r0, [r4, #0x1a] - ldr r0, _08083A38 @ =gUnk_0811F744 - lsls r2, r2, #2 - adds r2, r2, r0 - ldr r1, [r2] - lsrs r2, r1, #0x1f - ldr r0, _08083A3C @ =0x00FFFFFF - ands r1, r0 - orrs r1, r2 - adds r0, #1 - orrs r1, r0 - movs r0, #0 - bl sub_080ADDD8 -_08083A2C: - adds r0, r4, #0 - bl GetNextFrame -_08083A32: - pop {r4, pc} - .align 2, 0 -_08083A34: .4byte gUnk_080C9CBC -_08083A38: .4byte gUnk_0811F744 -_08083A3C: .4byte 0x00FFFFFF - - thumb_func_start sub_08083A40 -sub_08083A40: @ 0x08083A40 - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - movs r0, #2 - strb r0, [r4, #0xc] - ldr r0, [r4, #0x54] - ldr r1, _08083A70 @ =gPlayerEntity - movs r3, #0x2e - ldrsh r2, [r0, r3] - movs r3, #0x2e - ldrsh r0, [r1, r3] - cmp r2, r0 - ble _08083A74 - movs r1, #0 - adds r2, r4, #0 - adds r2, #0x62 - movs r0, #8 - b _08083A7C - .align 2, 0 -_08083A70: .4byte gPlayerEntity -_08083A74: - movs r1, #1 - adds r2, r4, #0 - adds r2, #0x62 - movs r0, #0xf8 -_08083A7C: - strb r0, [r2] - adds r2, r4, #0 - adds r2, #0x63 - movs r0, #0xee - strb r0, [r2] - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_08083998 - pop {r4, pc} diff --git a/assets/assets.json b/assets/assets.json index 68b02a16..c579cdea 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -42176,27 +42176,6 @@ "size": 55, "type": "animation" }, - { - "path": "object9/gUnk_0811F744_EU.bin", - "variants": [ - "EU" - ], - "starts": { - "EU": 1175180 - }, - "size": 16 - }, - { - "path": "object9/gUnk_0811F744_1_USA-JP-DEMO_USA-DEMO_JP.bin", - "variants": [ - "USA", - "JP", - "DEMO_USA", - "DEMO_JP" - ], - "start": 1177412, - "size": 16 - }, { "path": "animations/gSpriteAnimations_ChestSpawner_0.bin", "start": 1177784, diff --git a/data/const/object/object9.s b/data/const/object/object9.s deleted file mode 100644 index 3af04d2d..00000000 --- a/data/const/object/object9.s +++ /dev/null @@ -1,18 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0811F744:: @ 0811F744 -.ifdef EU - @ TODO only small differences - .incbin "object9/gUnk_0811F744_EU.bin" -.else - .incbin "object9/gUnk_0811F744_1_USA-JP-DEMO_USA-DEMO_JP.bin" -.endif - -gUnk_0811F754:: @ 0811F754 - .4byte sub_08083914 - .4byte sub_0808395C - .4byte sub_08083998 diff --git a/linker.ld b/linker.ld index 0f11858f..ba0ed04e 100644 --- a/linker.ld +++ b/linker.ld @@ -629,7 +629,7 @@ SECTIONS { src/object/ezloCap.o(.text); src/object/blockPushed.o(.text); src/object/lockedDoor.o(.text); - asm/object/object9.o(.text); + src/object/object9.o(.text); src/object/objectA.o(.text); src/object/objectB.o(.text); src/object/chestSpawner.o(.text); @@ -1345,7 +1345,7 @@ SECTIONS { data/animations/object/ezloCap.o(.rodata); src/object/blockPushed.o(.rodata); src/object/lockedDoor.o(.rodata); - data/const/object/object9.o(.rodata); + src/object/object9.o(.rodata); data/animations/object/object9.o(.rodata); src/object/objectB.o(.rodata); src/object/chestSpawner.o(.rodata); diff --git a/src/object/object9.c b/src/object/object9.c new file mode 100644 index 00000000..a3286f79 --- /dev/null +++ b/src/object/object9.c @@ -0,0 +1,156 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "message.h" +#include "kinstone.h" +#include "common.h" +#include "functions.h" + +// typedef struct { +// Entity base; +// u8 filler[0x18]; +// u16 tilePos; +// } Object81Entity; + +extern void sub_080ADDD8(u32, u32); +void sub_080838DC(Entity*); +void sub_08083A40(Entity*); +void Object9_Init(Entity*); +void Object9_Action1(Entity*); +void Object9_Action2(Entity*); + +#ifdef EU +static const s32 gUnk_0811F744[] = { + 0x00027940, + 0x00027B40, + 0x00027D40, + 0x00027F40, +}; +#else +static const s32 gUnk_0811F744[] = { + 0x00027980, + 0x00027B80, + 0x00027D80, + 0x00027F80, +}; +#endif + +void Object9(Entity* this) { + static void (*const gUnk_0811F754[])(Entity*) = { + Object9_Init, + Object9_Action1, + Object9_Action2, + }; + + u32 uVar2 = gPlayerState.field_0x27[0] > 0; + + switch (gFuseInfo._0) { + case 0: + case 1: + case 2: + if ((gMessage.doTextBox & 0x7f) != 0) { + default: + if (gUnk_03003DF0.unk_4[3] == 50) { + if (CheckKinstoneFused(0x32) == 0) { + uVar2 = 0; + break; + } + } + uVar2 = 1; + } + break; + } + + if (uVar2) { + sub_080838DC(this); + } + gUnk_0811F754[this->action](this); +} + +void sub_080838DC(Entity* this) { + this->spriteSettings.draw = 0; + this->spriteOrientation.flipY = 1; + this->spriteRendering.b3 = 0; + this->spritePriority.b0 = 0; + this->actionDelay = 4; + this->child = NULL; + this->action = 0; +} + +void Object9_Init(Entity* this) { + if (this->spriteAnimation[0] != 1) { + LoadSwapGFX(this, 1, 1); + this->spriteVramOffset -= 0x10; +#ifdef EU + sub_080ADDD8(1, 0x10277e0); +#else + sub_080ADDD8(1, 0x1027820); +#endif + sub_080838DC(this); + } + this->action = 1; + this->flags |= ENT_PERSIST; + SetDefaultPriority(this, 6); +} + +void Object9_Action1(Entity* this) { + if (this->actionDelay) { + this->actionDelay--; + } else { + if ((*(Entity**)(gUnk_03003DF0.unk_4 + 8) != NULL) && ((u8)(gUnk_03003DF0.unk_4[3] - 1) < 100)) { + this->child = *(Entity**)(gUnk_03003DF0.unk_4 + 8); + this->interactType = gUnk_03003DF0.unk_3; + sub_08083A40(this); + } + } +} + +void Object9_Action2(Entity* this) { + u32 bVar1; + u32 bVar2; + u32 bVar3; + u32 temp; + u32 temp2; + struct_080C9CBC* ptr; + + if ((this->type != 1) && + (((u8)(gUnk_03003DF0.unk_4[3] - 1) >= 100 || (this->child != *(Entity**)(gUnk_03003DF0.unk_4 + 8))))) { + sub_080838DC(this); + } else { + this->x = this->child->x; + this->y = this->child->y; + this->z = this->child->z; + if (this->frame == 1) { + this->frame = 0; + if (this->type == 0) { + bVar2 = gUnk_03003DF0.unk_4[3]; + } else { + bVar2 = this->type2; + } + ptr = gUnk_080C9CBC + bVar2; + bVar1 = ptr->_5[0]; + bVar3 = bVar1 & 1; + this->palette.b.b0 = bVar3; + temp = gUnk_0811F744[bVar1] < 0; + temp2 = (gUnk_0811F744[bVar1] & 0xffffff) | temp; + sub_080ADDD8(0, temp2 | 0x1000000); + } + GetNextFrame(this); + } +} + +void sub_08083A40(Entity* this) { + u32 bVar1; + + this->spriteSettings.draw = 1; + this->action = 2; + if (this->child->x.HALF.HI > gPlayerEntity.x.HALF.HI) { + bVar1 = 0; + this->spriteOffsetX = 8; + } else { + bVar1 = 1; + this->spriteOffsetX = -8; + } + this->spriteOffsetY = -18; + InitializeAnimation(this, bVar1); + Object9_Action2(this); +}