From 29bacb4ff3bce7b3086946e804dc3928403810ed Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Fri, 11 Mar 2022 17:08:30 +0100 Subject: [PATCH] Decompile Object30 --- asm/object/object30.s | 207 ----------------------------------- assets/assets.json | 5 - data/const/object/object30.s | 13 --- linker.ld | 4 +- src/object/object30.c | 114 +++++++++++++++++++ 5 files changed, 116 insertions(+), 227 deletions(-) delete mode 100644 asm/object/object30.s delete mode 100644 data/const/object/object30.s create mode 100644 src/object/object30.c diff --git a/asm/object/object30.s b/asm/object/object30.s deleted file mode 100644 index 6e3caadb..00000000 --- a/asm/object/object30.s +++ /dev/null @@ -1,207 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object30 -Object30: @ 0x0808A850 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0808A86C @ =gUnk_08121188 - 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 sub_08080CB4 - pop {r4, pc} - .align 2, 0 -_0808A86C: .4byte gUnk_08121188 - - thumb_func_start sub_0808A870 -sub_0808A870: @ 0x0808A870 - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xa] - cmp r0, #1 - beq _0808A8BE - cmp r0, #1 - bgt _0808A884 - cmp r0, #0 - beq _0808A896 - b _0808A8C4 -_0808A884: - cmp r0, #3 - bgt _0808A8C4 - adds r0, r5, #0 - bl sub_0808A968 - adds r0, r5, #0 - bl sub_0808A8E0 - b _0808A8C4 -_0808A896: - adds r0, r5, #0 - adds r0, #0x38 - ldrb r0, [r0] - bl GetLayerByIndex - adds r4, r0, #0 - adds r0, r5, #0 - bl sub_0806F798 - lsls r0, r0, #1 - adds r0, #4 - adds r4, r4, r0 - str r4, [r5, #0x6c] - ldrh r1, [r4] - adds r0, r5, #0 - adds r0, #0x68 - strh r1, [r0] - movs r0, #1 - strb r0, [r5, #0xc] - b _0808A8C4 -_0808A8BE: - adds r0, r5, #0 - bl sub_0808A968 -_0808A8C4: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0808A8C8 -sub_0808A8C8: @ 0x0808A8C8 - push {lr} - adds r2, r0, #0 - adds r0, #0x68 - ldr r1, [r2, #0x6c] - ldrh r0, [r0] - ldrh r1, [r1] - cmp r0, r1 - beq _0808A8DE - adds r0, r2, #0 - bl sub_0808A968 -_0808A8DE: - pop {pc} - - thumb_func_start sub_0808A8E0 -sub_0808A8E0: @ 0x0808A8E0 - push {r4, lr} - adds r4, r0, #0 - ldrb r2, [r4, #0xa] - cmp r2, #0 - beq _0808A8F0 - cmp r2, #1 - beq _0808A930 - b _0808A954 -_0808A8F0: - ldr r0, [r4, #0x70] - cmp r0, #0 - beq _0808A930 - ldr r3, [r4, #0x20] - cmp r3, #0 - bge _0808A926 - movs r0, #0x36 - ldrsh r1, [r4, r0] - movs r0, #8 - rsbs r0, r0, #0 - cmp r1, r0 - ble _0808A90C - str r2, [r4, #0x70] - b _0808A926 -_0808A90C: - ldr r0, _0808A918 @ =0xFFFFC000 - cmp r3, r0 - bge _0808A920 - ldr r0, _0808A91C @ =0xFFFFFC00 - b _0808A924 - .align 2, 0 -_0808A918: .4byte 0xFFFFC000 -_0808A91C: .4byte 0xFFFFFC00 -_0808A920: - movs r0, #0x80 - lsls r0, r0, #3 -_0808A924: - str r0, [r4, #0x70] -_0808A926: - ldr r1, [r4, #0x70] - adds r0, r4, #0 - bl GravityUpdate - b _0808A962 -_0808A930: - ldr r2, _0808A964 @ =gUnk_08121194 - ldrb r0, [r4, #0xf] - adds r1, r0, #1 - strb r1, [r4, #0xf] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x1b - movs r1, #7 - ands r0, r1 - adds r0, r0, r2 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - strh r0, [r4, #0x36] - adds r0, r4, #0 - bl IsCollidingPlayer - cmp r0, #0 - beq _0808A962 -_0808A954: - ldrb r1, [r4, #0xb] - movs r0, #0x5c - movs r2, #0 - bl CreateItemEntity - bl DeleteThisEntity -_0808A962: - pop {r4, pc} - .align 2, 0 -_0808A964: .4byte gUnk_08121194 - - thumb_func_start sub_0808A968 -sub_0808A968: @ 0x0808A968 - push {r4, lr} - adds r4, r0, #0 - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0x1e - strb r0, [r4, #0xe] - ldrb r1, [r4, #0x18] - subs r0, #0x22 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - movs r0, #0xa0 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #0x18 - orrs r0, r1 - strb r0, [r2] - ldrb r1, [r4, #0x18] - movs r0, #0x31 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r4, #0x18] - adds r2, #0x13 - ldrb r1, [r2] - movs r0, #0x10 - orrs r0, r1 - strb r0, [r2] - ldr r0, _0808A9C0 @ =gUnk_08121C58 - str r0, [r4, #0x48] - adds r0, r4, #0 - movs r1, #2 - bl SetDefaultPriority - movs r0, #0xa0 - lsls r0, r0, #6 - str r0, [r4, #0x70] - pop {r4, pc} - .align 2, 0 -_0808A9C0: .4byte gUnk_08121C58 diff --git a/assets/assets.json b/assets/assets.json index f078caa0..3c2f8496 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -43118,11 +43118,6 @@ "size": 4, "type": "animation" }, - { - "path": "object30/gUnk_08121194.bin", - "start": 1184148, - "size": 8 - }, { "path": "animations/gSpriteAnimations_PullableMushroom_0.bin", "start": 1184260, diff --git a/data/const/object/object30.s b/data/const/object/object30.s deleted file mode 100644 index ef30fe28..00000000 --- a/data/const/object/object30.s +++ /dev/null @@ -1,13 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08121188:: @ 08121188 - .4byte sub_0808A870 - .4byte sub_0808A8C8 - .4byte sub_0808A8E0 - -gUnk_08121194:: @ 08121194 - .incbin "object30/gUnk_08121194.bin" diff --git a/linker.ld b/linker.ld index 9ac4e952..114e6c18 100644 --- a/linker.ld +++ b/linker.ld @@ -668,7 +668,7 @@ SECTIONS { src/object/smoke.o(.text); src/object/pushableRock.o(.text); src/object/hittableLever.o(.text); - asm/object/object30.o(.text); + src/object/object30.o(.text); src/object/frozenFlower.o(.text); src/object/pullableMushroom.o(.text); src/object/bollard.o(.text); @@ -1395,7 +1395,7 @@ SECTIONS { src/object/pushableRock.o(.rodata); data/animations/object/pushableRock.o(.rodata); src/object/hittableLever.o(.rodata); - data/const/object/object30.o(.rodata); + src/object/object30.o(.rodata); data/const/object/object31.o(.rodata); src/object/pullableMushroom.o(.rodata); data/animations/object/pullableMushroom.o(.rodata); diff --git a/src/object/object30.c b/src/object/object30.c new file mode 100644 index 00000000..dca304b4 --- /dev/null +++ b/src/object/object30.c @@ -0,0 +1,114 @@ +/** + * @file object30.c + * @ingroup Objects + * + * @brief Object30 object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" +#include "item.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u16 unk_68; + /*0x6a*/ u16 unk_6a; + /*0x6c*/ u16* unk_6c; + /*0x70*/ u32 unk_70; +} Object30Entity; + +extern u32 sub_0806F798(Entity*); +extern const Hitbox gUnk_08121C58; + +void Object30_Init(Object30Entity*); +void Object30_Action1(Object30Entity*); +void Object30_Action2(Object30Entity*); +void sub_0808A968(Object30Entity*); + +void Object30(Object30Entity* this) { + static void (*const Object30_Actions[])(Object30Entity*) = { + Object30_Init, + Object30_Action1, + Object30_Action2, + }; + Object30_Actions[super->action](this); + sub_08080CB4(super); +} + +void Object30_Init(Object30Entity* this) { + LayerStruct* data; + const u16* ptr; + switch (super->type) { + case 0: + data = GetLayerByIndex(super->collisionLayer); + ptr = &data->mapData[sub_0806F798(super)]; + this->unk_6c = (u16*)ptr; + this->unk_68 = ptr[0]; + super->action = 1; + break; + case 1: + sub_0808A968(this); + break; + case 2: + case 3: + sub_0808A968(this); + Object30_Action2(this); + break; + } +} + +void Object30_Action1(Object30Entity* this) { + if (this->unk_68 != this->unk_6c[0]) { + sub_0808A968(this); + } +} + +void Object30_Action2(Object30Entity* this) { + static const u8 gUnk_08121194[] = { + 249, 248, 247, 246, 245, 246, 247, 248, + }; + u8 tmp; + switch (super->type) { + case 0: + if (this->unk_70 != 0) { + if (super->zVelocity < 0) { + if (super->z.HALF.HI > -8) { + this->unk_70 = 0; + } else { + if (super->zVelocity < -0x4000) { + this->unk_70 = -0x400; + } else { + this->unk_70 = 0x400; + } + } + } + GravityUpdate(super, this->unk_70); + return; + } + // fallthrough + case 1: + tmp = gUnk_08121194[(super->field_0xf++ >> 3) & 7]; + super->z.HALF.HI = tmp << 0x18 >> 0x18; + if (!IsCollidingPlayer(super)) { + return; + } + break; + } + CreateItemEntity(ITEM_KINSTONE, (u32)super->type2, 0); + DeleteThisEntity(); +} + +void sub_0808A968(Object30Entity* this) { + super->action = 2; + super->actionDelay = 0x1e; + super->spriteSettings.draw = 1; + super->zVelocity = 0x28000; + super->spritePriority.b1 = 3; + super->spriteSettings.shadow = 0; + super->field_0x3c |= 0x10; + super->hitbox = (Hitbox*)&gUnk_08121C58; + SetDefaultPriority(super, 2); + this->unk_70 = 0x2800; +}