From dd81c3a59cb66f00c1c5a82283e00db01fcf7577 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 14 Mar 2022 12:44:46 +0200 Subject: [PATCH] Decompile object79 --- asm/object/object79.s | 256 ----------------------------------- assets/assets.json | 5 - data/const/object/object79.s | 13 -- linker.ld | 4 +- src/object/object79.c | 113 ++++++++++++++++ 5 files changed, 115 insertions(+), 276 deletions(-) delete mode 100644 asm/object/object79.s delete mode 100644 data/const/object/object79.s create mode 100644 src/object/object79.c diff --git a/asm/object/object79.s b/asm/object/object79.s deleted file mode 100644 index 1ff61a07..00000000 --- a/asm/object/object79.s +++ /dev/null @@ -1,256 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object79 -Object79: @ 0x08097F84 - push {r4, lr} - adds r4, r0, #0 - ldr r0, _08097FAC @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08097F98 - bl DeleteThisEntity -_08097F98: - ldr r0, _08097FB0 @ =gUnk_08123410 - 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 -_08097FAC: .4byte gPlayerState -_08097FB0: .4byte gUnk_08123410 - - thumb_func_start sub_08097FB4 -sub_08097FB4: @ 0x08097FB4 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - adds r0, #1 - movs r1, #0 - strb r0, [r4, #0xc] - movs r2, #0 - strh r1, [r4, #0x24] - str r1, [r4, #0x6c] - adds r1, r4, #0 - adds r1, #0x7a - movs r0, #0x90 - lsls r0, r0, #5 - strh r0, [r1] - strb r2, [r4, #0xe] - movs r0, #0x1e - strb r0, [r4, #0xf] - ldr r1, _08098014 @ =gUnk_0812341C - ldrb r0, [r4, #0xa] - adds r0, r0, r1 - ldrb r0, [r0] - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - movs r0, #0x80 - lsls r0, r0, #6 - str r0, [r4, #0x74] - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08098018 - adds r1, r4, #0 - adds r1, #0x7e - movs r0, #0x40 - strh r0, [r1] - adds r0, r4, #0 - movs r1, #1 - movs r2, #0 - bl LoadSwapGFX - ldrb r1, [r4, #0xa] - adds r0, r4, #0 - bl InitAnimationForceUpdate - b _08098032 - .align 2, 0 -_08098014: .4byte gUnk_0812341C -_08098018: - ldr r0, [r4, #0x50] - adds r0, #0x60 - ldrh r1, [r0] - adds r0, r4, #0 - adds r0, #0x60 - strh r1, [r0] - ldr r2, [r4, #0x50] - ldrb r1, [r4, #0xa] - movs r0, #0xd - muls r0, r1, r0 - ldrb r2, [r2, #0x1e] - adds r0, r0, r2 - strb r0, [r4, #0x1e] -_08098032: - adds r0, r4, #0 - bl sub_08098130 - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809803C -sub_0809803C: @ 0x0809803C - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r5, [r4, #0xa] - cmp r5, #0 - bne _08098070 - bl UpdateAnimationSingleFrame - ldrb r0, [r4, #0xb] - cmp r0, #0 - beq _08098082 - ldr r0, _0809806C @ =gPlayerEntity - strb r5, [r0, #0xf] - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #1 - bl InitAnimationForceUpdate - movs r0, #0xbc - lsls r0, r0, #1 - bl SoundReq - b _08098082 - .align 2, 0 -_0809806C: .4byte gPlayerEntity -_08098070: - ldr r2, [r4, #0x50] - ldrb r1, [r4, #0xa] - movs r0, #0xd - muls r0, r1, r0 - ldrb r1, [r2, #0x1e] - adds r0, r0, r1 - strb r0, [r4, #0x1e] - ldrb r0, [r2, #0xc] - strb r0, [r4, #0xc] -_08098082: - pop {r4, r5, pc} - - thumb_func_start sub_08098084 -sub_08098084: @ 0x08098084 - push {r4, lr} - adds r4, r0, #0 - ldr r1, [r4, #0x6c] - movs r0, #0xa0 - lsls r0, r0, #0xd - cmp r1, r0 - bls _080980A8 - ldr r0, _080980A4 @ =gPlayerState - ldr r1, [r0, #0x30] - movs r2, #0x80 - orrs r1, r2 - str r1, [r0, #0x30] - bl DeleteThisEntity - b _0809812E - .align 2, 0 -_080980A4: .4byte gPlayerState -_080980A8: - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _080980D8 - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - adds r2, r4, #0 - adds r2, #0x7e - ldrh r0, [r2] - subs r0, #1 - strh r0, [r2] - lsls r0, r0, #0x10 - ldr r1, _080980D4 @ =0xFFFF0000 - cmp r0, r1 - bne _080980E6 - movs r0, #0x40 - strh r0, [r2] - movs r0, #0xbc - lsls r0, r0, #1 - bl SoundReq - b _080980E6 - .align 2, 0 -_080980D4: .4byte 0xFFFF0000 -_080980D8: - ldr r2, [r4, #0x50] - ldrb r1, [r4, #0xa] - movs r0, #0xd - muls r0, r1, r0 - ldrb r2, [r2, #0x1e] - adds r0, r0, r2 - strb r0, [r4, #0x1e] -_080980E6: - ldr r0, [r4, #0x6c] - movs r1, #0xa0 - lsls r1, r1, #5 - adds r0, r0, r1 - str r0, [r4, #0x6c] - ldr r0, [r4, #0x70] - ldr r1, [r4, #0x74] - adds r0, r0, r1 - str r0, [r4, #0x70] - adds r2, r4, #0 - adds r2, #0x72 - ldrh r1, [r2] - movs r0, #0x1f - ands r0, r1 - strh r0, [r2] - ldr r0, [r4, #0x74] - movs r1, #0xa0 - lsls r1, r1, #1 - adds r0, r0, r1 - str r0, [r4, #0x74] - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _08098128 - movs r0, #0x1e - strb r0, [r4, #0xf] - ldrb r0, [r4, #0xe] - movs r1, #1 - eors r0, r1 - strb r0, [r4, #0xe] -_08098128: - adds r0, r4, #0 - bl sub_08098130 -_0809812E: - pop {r4, pc} - - thumb_func_start sub_08098130 -sub_08098130: @ 0x08098130 - push {r4, lr} - adds r4, r0, #0 - ldr r0, _08098160 @ =gPlayerEntity - adds r1, r4, #0 - bl CopyPosition - adds r0, r4, #0 - adds r0, #0x72 - ldrh r0, [r0] - strb r0, [r4, #0x15] - adds r0, r4, #0 - adds r0, #0x7a - ldrh r0, [r0] - strh r0, [r4, #0x24] - adds r0, r4, #0 - bl LinearMoveUpdate - ldr r0, [r4, #0x30] - ldr r1, _08098164 @ =0xFFEC0000 - adds r0, r0, r1 - ldr r1, [r4, #0x6c] - adds r0, r0, r1 - str r0, [r4, #0x30] - pop {r4, pc} - .align 2, 0 -_08098160: .4byte gPlayerEntity -_08098164: .4byte 0xFFEC0000 diff --git a/assets/assets.json b/assets/assets.json index ad11d8b5..68b02a16 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44525,11 +44525,6 @@ "size": 40, "type": "animation" }, - { - "path": "object79/gUnk_0812341C.bin", - "start": 1192988, - "size": 6 - }, { "path": "animations/gSpriteAnimations_PushableLever_0.bin", "start": 1193140, diff --git a/data/const/object/object79.s b/data/const/object/object79.s deleted file mode 100644 index 179b2d69..00000000 --- a/data/const/object/object79.s +++ /dev/null @@ -1,13 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08123410:: @ 08123410 - .4byte sub_08097FB4 - .4byte sub_0809803C - .4byte sub_08098084 - -gUnk_0812341C:: @ 0812341C - .incbin "object79/gUnk_0812341C.bin" diff --git a/linker.ld b/linker.ld index 2c10036d..4656311e 100644 --- a/linker.ld +++ b/linker.ld @@ -743,7 +743,7 @@ SECTIONS { src/object/object74.o(.text); src/object/bell.o(.text); src/object/macroDecorations.o(.text); - asm/object/object79.o(.text); + src/object/object79.o(.text); src/object/steam.o(.text); src/object/pushableLever.o(.text); src/object/macroShoes.o(.text); @@ -1486,7 +1486,7 @@ SECTIONS { data/const/object/bell.o(.rodata); data/animations/object/bell.o(.rodata); src/object/macroDecorations.o(.rodata); - data/const/object/object79.o(.rodata); + src/object/object79.o(.rodata); data/animations/object/object79.o(.rodata); src/object/steam.o(.rodata); src/object/pushableLever.o(.rodata); diff --git a/src/object/object79.c b/src/object/object79.c new file mode 100644 index 00000000..52480738 --- /dev/null +++ b/src/object/object79.c @@ -0,0 +1,113 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "player.h" +#include "functions.h" +#include "sound.h" + +typedef struct { + Entity base; + u8 filler[0x4]; + u32 unk6c; + union SplitWord objDir; + u32 unk74; + u16 unk78; + u16 unk7a; + u16 unk7c; + s16 unk7e; +} Object79Entity; + +void Object79_Init(Object79Entity*); +void Object79_Action1(Object79Entity*); +void Object79_Action2(Object79Entity*); +void sub_08098130(Object79Entity*); + +void Object79(Entity* this) { + static void (*const actionFuncs[])(Object79Entity*) = { + Object79_Init, + Object79_Action1, + Object79_Action2, + }; + + if ((gPlayerState.flags & PL_MINISH) != 0) { + DeleteThisEntity(); + } + + actionFuncs[this->action]((Object79Entity*)this); +} + +void Object79_Init(Object79Entity* this) { + static const u8 Object79_Directions[] = { DirectionSouthWest, DirectionWest, DirectionNorthWest, + DirectionNorthEast, DirectionEast, DirectionSouthEast }; + super->action++; + super->speed = 0; + this->unk6c = 0; + this->unk7a = 0x1200; + super->actionDelay = 0; + super->field_0xf = 30; + this->objDir.HALF.HI = Object79_Directions[super->type]; + this->unk74 = 0x2000; + SetDefaultPriority(super, 6); + if (super->type == 0) { + this->unk7e = 0x40; + LoadSwapGFX(super, 1, 0); + InitAnimationForceUpdate(super, super->type); + } else { + Entity* parent; + super->spriteVramOffset = super->parent->spriteVramOffset; + parent = super->parent; + super->frameIndex = super->type * 13 + parent->frameIndex; + } + sub_08098130(this); +} + +void Object79_Action1(Object79Entity* this) { + if (super->type == 0) { + UpdateAnimationSingleFrame(super); + if (super->type2 != 0) { + gPlayerEntity.field_0xf = 0; + super->action++; + InitAnimationForceUpdate(super, 1); + SoundReq(SFX_178); + } + } else { + Entity* parent = super->parent; + super->frameIndex = super->type * 13 + parent->frameIndex; + super->action = parent->action; + } +} + +void Object79_Action2(Object79Entity* this) { + if (this->unk6c >= 0x140001) { + gPlayerState.flags |= PL_MINISH; + DeleteThisEntity(); + } else { + if (super->type == 0) { + UpdateAnimationSingleFrame(super); + if (--this->unk7e << 16 == -0x10000) { + this->unk7e = 0x40; + SoundReq(SFX_178); + } + } else { + Entity* parent = super->parent; + super->frameIndex = super->type * 13 + parent->frameIndex; + } + this->unk6c += 0x1400; + this->objDir.WORD += this->unk74; + this->objDir.HALF.HI = DirectionNormalize(this->objDir.HALF.HI); + this->unk74 += 0x140; + if (--super->field_0xf == 0xff) { + super->field_0xf = 30; + super->actionDelay ^= 1; + } + sub_08098130(this); + } +} + +void sub_08098130(Object79Entity* this) { + CopyPosition(&gPlayerEntity, super); + super->direction = this->objDir.HALF.HI; + super->speed = this->unk7a; + LinearMoveUpdate(super); + super->y.WORD -= 0x140000; + super->y.WORD += this->unk6c; +}