From 3fddf8f0702d3fd0f7f43cc384ab0ca5eae21497 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sun, 27 Feb 2022 12:53:18 +0100 Subject: [PATCH] Decompile Whirlwind --- asm/object/whirlwind.s | 282 ------------------------------- data/const/object/whirlwind.s | 10 -- linker.ld | 4 +- src/enemy/mazaalBracelet.c | 1 - src/enemy/vaatiArm.c | 1 - src/object/bigIceBlock.c | 1 - src/object/bossDoor.c | 1 - src/object/fairy.c | 2 - src/object/lightableSwitch.c | 1 - src/object/minecart.c | 1 - src/object/objectA8.c | 1 - src/object/pot.c | 1 - src/object/pushableGrave.c | 2 - src/object/pushableStatue.c | 1 - src/object/rupee.c | 1 - src/object/whirlwind.c | 99 +++++++++++ src/object/windTribeTeleporter.c | 14 +- 17 files changed, 108 insertions(+), 315 deletions(-) delete mode 100644 asm/object/whirlwind.s delete mode 100644 data/const/object/whirlwind.s create mode 100644 src/object/whirlwind.c diff --git a/asm/object/whirlwind.s b/asm/object/whirlwind.s deleted file mode 100644 index fe9c3966..00000000 --- a/asm/object/whirlwind.s +++ /dev/null @@ -1,282 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Whirlwind -Whirlwind: @ 0x08092CA0 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x45 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - beq _08092CC0 - ldr r0, _08092CD4 @ =gUnk_020342F8 - subs r1, #1 - bl ReadBit - cmp r0, #0 - bne _08092CC0 - bl DeleteThisEntity -_08092CC0: - ldr r0, _08092CD8 @ =gUnk_081227F4 - 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 -_08092CD4: .4byte gUnk_020342F8 -_08092CD8: .4byte gUnk_081227F4 - - thumb_func_start sub_08092CDC -sub_08092CDC: @ 0x08092CDC - push {r4, lr} - adds r4, r0, #0 - movs r2, #1 - strb r2, [r4, #0xc] - ldr r0, _08092D48 @ =gUnk_080FD320 - str r0, [r4, #0x48] - ldrb r1, [r4, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - adds r0, r4, #0 - adds r0, #0x3f - strb r2, [r0] - adds r1, r4, #0 - adds r1, #0x3c - movs r0, #0x47 - strb r0, [r1] - adds r1, #4 - movs r0, #0x44 - strb r0, [r1] - subs r1, #5 - movs r0, #0x80 - strb r0, [r1] - ldrb r2, [r4, #0x1b] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r2 - movs r2, #0x40 - orrs r0, r2 - strb r0, [r4, #0x1b] - ldrb r0, [r4, #0x19] - ands r1, r0 - orrs r1, r2 - strb r1, [r4, #0x19] - ldrb r0, [r4, #0xa] - strb r0, [r4, #0x14] - lsls r0, r0, #3 - strb r0, [r4, #0x15] - movs r0, #0xe0 - lsls r0, r0, #3 - strh r0, [r4, #0x24] - ldrb r0, [r4, #0xb] - cmp r0, #1 - bne _08092D50 - ldr r1, _08092D4C @ =0x00000161 - adds r0, r4, #0 - bl ChangeObjPalette - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation - b _08092D5C - .align 2, 0 -_08092D48: .4byte gUnk_080FD320 -_08092D4C: .4byte 0x00000161 -_08092D50: - ldr r0, _08092D78 @ =0x0000FFE8 - strh r0, [r4, #0x36] - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation -_08092D5C: - ldrb r1, [r4, #0x10] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _08092D74 - adds r0, r4, #0 - bl sub_0807DD64 - adds r0, r4, #0 - movs r1, #0 - bl ExecuteScriptForEntity -_08092D74: - pop {r4, pc} - .align 2, 0 -_08092D78: .4byte 0x0000FFE8 - - thumb_func_start sub_08092D7C -sub_08092D7C: @ 0x08092D7C - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldrb r1, [r5, #0x10] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _08092D92 - adds r0, r5, #0 - movs r1, #0 - bl ExecuteScriptForEntity -_08092D92: - ldrb r0, [r5, #0x18] - lsls r0, r0, #0x1e - cmp r0, #0 - beq _08092E84 - adds r0, r5, #0 - bl GetNextFrame - ldr r6, _08092E04 @ =gPlayerState - ldr r0, [r6, #0x30] - movs r3, #0x80 - ands r0, r3 - cmp r0, #0 - bne _08092E84 - adds r0, r6, #0 - adds r0, #0x3c - ldrb r0, [r0] - cmp r0, #0 - bne _08092E84 - ldr r4, _08092E08 @ =gPlayerEntity - ldrb r2, [r4, #0xc] - cmp r2, #4 - beq _08092DC8 - ldrb r1, [r4, #0x10] - adds r0, r3, #0 - ands r0, r1 - cmp r0, #0 - beq _08092E84 -_08092DC8: - cmp r2, #6 - beq _08092E84 - adds r0, r5, #0 - adds r1, r4, #0 - movs r2, #0xc - movs r3, #0xc - bl sub_0800419C - cmp r0, #0 - beq _08092E84 - ldr r0, [r6, #0x30] - movs r1, #0x80 - lsls r1, r1, #0x11 - ands r0, r1 - cmp r0, #0 - bne _08092E0C - ldrb r0, [r4, #0xc] - cmp r0, #4 - beq _08092E0C - ldrb r0, [r5, #0xb] - cmp r0, #1 - beq _08092E16 - movs r0, #0x36 - ldrsh r1, [r4, r0] - movs r0, #0x10 - rsbs r0, r0, #0 - cmp r1, r0 - bgt _08092E84 - b _08092E16 - .align 2, 0 -_08092E04: .4byte gPlayerState -_08092E08: .4byte gPlayerEntity -_08092E0C: - ldr r0, _08092E88 @ =gPlayerEntity - movs r1, #0x36 - ldrsh r0, [r0, r1] - cmp r0, #0 - beq _08092E84 -_08092E16: - ldr r4, _08092E88 @ =gPlayerEntity - adds r0, r5, #0 - adds r1, r4, #0 - bl CopyPosition - adds r0, r5, #0 - bl sub_08004542 - adds r0, r4, #0 - bl sub_08004542 - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #1 - strb r0, [r1] - ldrb r1, [r4, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - ldr r1, _08092E8C @ =gPlayerState - movs r0, #0x1f - strb r0, [r1, #0xc] - ldrb r2, [r5, #0xb] - adds r0, r1, #0 - adds r0, #0x38 - strb r2, [r0] - adds r1, #0x39 - movs r0, #0xff - strb r0, [r1] - adds r4, #0x29 - ldrb r1, [r4] - lsls r1, r1, #0x1d - lsrs r1, r1, #0x1d - subs r1, #1 - adds r3, r5, #0 - adds r3, #0x29 - movs r0, #7 - ands r1, r0 - ldrb r2, [r3] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - ldrb r0, [r5, #0xc] - adds r0, #1 - strb r0, [r5, #0xc] - bl sub_08077B20 - ldr r0, _08092E90 @ =0x00000153 - bl SoundReq - movs r0, #0x79 - bl SoundReq -_08092E84: - pop {r4, r5, r6, pc} - .align 2, 0 -_08092E88: .4byte gPlayerEntity -_08092E8C: .4byte gPlayerState -_08092E90: .4byte 0x00000153 - - thumb_func_start sub_08092E94 -sub_08092E94: @ 0x08092E94 - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - ldr r1, _08092ED0 @ =gPlayerEntity - adds r0, r4, #0 - movs r2, #0xc - movs r3, #0xc - bl sub_0800419C - cmp r0, #0 - bne _08092ECE - adds r0, r4, #0 - bl ResetCollisionLayer - ldrb r2, [r4, #0x1b] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r2 - movs r2, #0x40 - orrs r0, r2 - strb r0, [r4, #0x1b] - ldrb r0, [r4, #0x19] - ands r1, r0 - orrs r1, r2 - strb r1, [r4, #0x19] - ldrb r0, [r4, #0xc] - subs r0, #1 - strb r0, [r4, #0xc] -_08092ECE: - pop {r4, pc} - .align 2, 0 -_08092ED0: .4byte gPlayerEntity diff --git a/data/const/object/whirlwind.s b/data/const/object/whirlwind.s deleted file mode 100644 index 7d09ae48..00000000 --- a/data/const/object/whirlwind.s +++ /dev/null @@ -1,10 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_081227F4:: @ 081227F4 - .4byte sub_08092CDC - .4byte sub_08092D7C - .4byte sub_08092E94 diff --git a/linker.ld b/linker.ld index 25bdf961..3dc07b11 100644 --- a/linker.ld +++ b/linker.ld @@ -740,7 +740,7 @@ SECTIONS { asm/object/object5B.o(.text); src/object/mask.o(.text); asm/object/houseDoorInterior.o(.text); - asm/object/whirlwind.o(.text); + src/object/whirlwind.o(.text); asm/object/objectBlockingStairs.o(.text); src/object/swordsmanNewsletter.o(.text); src/object/object61.o(.text); @@ -1483,7 +1483,7 @@ SECTIONS { data/const/object/object5B.o(.rodata); data/const/object/mask.o(.rodata); data/const/object/houseDoorInterior.o(.rodata); - data/const/object/whirlwind.o(.rodata); + src/object/whirlwind.o(.rodata); data/animations/object/whirlwind.o(.rodata); data/const/object/objectBlockingStairs.o(.rodata); data/const/object/swordsmanNewsletter.o(.rodata); diff --git a/src/enemy/mazaalBracelet.c b/src/enemy/mazaalBracelet.c index 62ca2401..5d3a04b8 100644 --- a/src/enemy/mazaalBracelet.c +++ b/src/enemy/mazaalBracelet.c @@ -93,7 +93,6 @@ void sub_0803B978(Entity*); void sub_0803BA6C(Entity*); void sub_0803BA80(Entity*); - void (*const MazaalBracelet_Functions[])(Entity*) = { MazaalBracelet_OnTick, MazaalBracelet_OnCollision, GenericKnockback, GenericDeath, GenericConfused, MazaalBracelet_OnGrabbed }; diff --git a/src/enemy/vaatiArm.c b/src/enemy/vaatiArm.c index 5e22575d..e4b6e5e4 100644 --- a/src/enemy/vaatiArm.c +++ b/src/enemy/vaatiArm.c @@ -171,7 +171,6 @@ const u16 gUnk_080D140E[] = { -0x6000, -0x5000, -0x4000 }; const u8 gUnk_080D1414[] = { 0, 0xc, 0xe, 0x10, 0x1c }; const u8 gUnk_080D1419[] = { 0, 0xa, 0xa, 0xa, 0x1c }; - void VaatiArm(Entity* this) { VaatiArm_Functions[GetNextFunction(this)](this); } diff --git a/src/object/bigIceBlock.c b/src/object/bigIceBlock.c index 13908bc7..916f83fa 100644 --- a/src/object/bigIceBlock.c +++ b/src/object/bigIceBlock.c @@ -20,7 +20,6 @@ typedef struct { /*0x86*/ u16 unk_86; } BigIceBlockEntity; - extern void (*const BigIceBlock_Actions[])(BigIceBlockEntity*); extern const u16 gUnk_081237B0[]; diff --git a/src/object/bossDoor.c b/src/object/bossDoor.c index 2719085a..5b1bd36d 100644 --- a/src/object/bossDoor.c +++ b/src/object/bossDoor.c @@ -26,7 +26,6 @@ typedef struct { /*0x86*/ u16 unk_86; } BossDoorEntity; - extern bool32 gUnk_02036BB8; extern const u8 gUnk_0811F740[]; diff --git a/src/object/fairy.c b/src/object/fairy.c index 44c3930e..3289562c 100644 --- a/src/object/fairy.c +++ b/src/object/fairy.c @@ -22,8 +22,6 @@ typedef struct { /*0x87*/ u8 unk_87; } FairyEntity; - - void sub_0808D76C(FairyEntity*); void sub_0808DAD0(FairyEntity*); void sub_0808DB2C(FairyEntity*); diff --git a/src/object/lightableSwitch.c b/src/object/lightableSwitch.c index 6594193a..ca63ad85 100644 --- a/src/object/lightableSwitch.c +++ b/src/object/lightableSwitch.c @@ -11,7 +11,6 @@ extern void (*const gUnk_081243B4[])(Entity*); extern void (*const gUnk_081243BC[])(Entity*); extern void (*const gUnk_081243C4[])(Entity*); - void LightableSwitch(Entity* this) { gUnk_081243B4[this->type](this); sub_0809EB30(this); diff --git a/src/object/minecart.c b/src/object/minecart.c index 2c49351b..7c7305b6 100644 --- a/src/object/minecart.c +++ b/src/object/minecart.c @@ -9,7 +9,6 @@ extern void sub_08091C0C(Entity*); extern void (*const gUnk_081223A8[])(Entity*); - extern const s8 gUnk_081223C8[]; extern const u32 gUnk_081223D8[]; diff --git a/src/object/objectA8.c b/src/object/objectA8.c index b2b37b7a..008a8d10 100644 --- a/src/object/objectA8.c +++ b/src/object/objectA8.c @@ -21,7 +21,6 @@ typedef struct { /*0x87*/ u8 unk_87; } ObjectA8Entity; - void sub_0809FECC(ObjectA8Entity*); bool32 sub_0809FE9C(ObjectA8Entity*); void ObjectA8_Init(ObjectA8Entity*); diff --git a/src/object/pot.c b/src/object/pot.c index 6808c48e..c67721a9 100644 --- a/src/object/pot.c +++ b/src/object/pot.c @@ -16,7 +16,6 @@ extern void (*const gUnk_0811F090[])(Entity*); extern void (*const gUnk_0811F0A8[])(Entity*); extern void (*const gUnk_0811F0C4[])(Entity*); - extern void sub_08078930(Entity*); extern void sub_08016A6C(Entity*); diff --git a/src/object/pushableGrave.c b/src/object/pushableGrave.c index 96bf5386..989f817e 100644 --- a/src/object/pushableGrave.c +++ b/src/object/pushableGrave.c @@ -27,8 +27,6 @@ typedef struct { /*0x86*/ u16 pushedFlag; } PushableGraveEntity; - - extern void (*const gUnk_081232AC[])(PushableGraveEntity*); extern const u8 gUnk_081232C0[]; extern const u16 PushableGrave_Tiles[]; diff --git a/src/object/pushableStatue.c b/src/object/pushableStatue.c index 8dbfdb41..824450fc 100644 --- a/src/object/pushableStatue.c +++ b/src/object/pushableStatue.c @@ -21,7 +21,6 @@ typedef struct { /*0x86*/ u16 unk_86; } PushableStatueEntity; - extern const s16 gUnk_080B4488[]; extern const s16 gUnk_080B4468[]; diff --git a/src/object/rupee.c b/src/object/rupee.c index cabcca81..5bf774e2 100644 --- a/src/object/rupee.c +++ b/src/object/rupee.c @@ -6,7 +6,6 @@ void sub_08086A6C(Entity*); void (*const gUnk_081206C4[])(Entity*); - // Main void Rupee(Entity* ent) { gUnk_081206C4[ent->action](ent); diff --git a/src/object/whirlwind.c b/src/object/whirlwind.c new file mode 100644 index 00000000..2315052e --- /dev/null +++ b/src/object/whirlwind.c @@ -0,0 +1,99 @@ +/** + * @file whirlwind.c + * @ingroup Objects + * + * @brief Whirlwind object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" +#include "area.h" +#include "hitbox.h" + +void Whirlwind_Init(Entity*); +void Whirlwind_Action1(Entity*); +void Whirlwind_Action2(Entity*); + +void Whirlwind(Entity* this) { + static void (*const Whirlwind_Actions[])(Entity*) = { + Whirlwind_Init, + Whirlwind_Action1, + Whirlwind_Action2, + }; + u32 tmp = this->health; + if (((tmp & 0x7f) != 0) && (ReadBit(gArea.filler5, tmp - 1) == 0)) { + DeleteThisEntity(); + } + Whirlwind_Actions[this->action](this); +} + +void Whirlwind_Init(Entity* this) { + this->action = 1; + this->hitbox = (Hitbox*)&gUnk_080FD320; + this->flags |= ENT_COLLIDE; + this->hitType = 1; + this->field_0x3c = 0x47; + this->hurtType = 0x44; + this->flags2 = 0x80; + this->spriteOrientation.flipY = 1; + this->spriteRendering.b3 = 1; + this->animationState = this->type; + this->direction = this->type << 3; + this->speed = 0x700; + if (this->type2 == 1) { + ChangeObjPalette(this, 0x161); + InitializeAnimation(this, 1); + } else { + this->z.HALF.HI = 0xffe8; + InitializeAnimation(this, 1); + } + if ((this->flags & ENT_SCRIPTED) != 0) { + sub_0807DD64(this); + ExecuteScriptForEntity(this, NULL); + } +} + +void Whirlwind_Action1(Entity* this) { + if ((this->flags & ENT_SCRIPTED) != 0) { + ExecuteScriptForEntity(this, NULL); + } + if (this->spriteSettings.draw != 0) { + GetNextFrame(this); + if ((((((gPlayerState.flags & PL_MINISH) == 0)) && (gPlayerState.field_0x3c[0] == 0)) && + ((gPlayerEntity.action == 4 || ((gPlayerEntity.flags & ENT_COLLIDE) != 0)))) && + ((gPlayerEntity.action != 6 && (sub_0800419C(this, &gPlayerEntity, 0xc, 0xc) != 0)))) { + if (((gPlayerState.flags & PL_PARACHUTE) == 0) && (gPlayerEntity.action != 4)) { + if ((this->type2 != 1) && (-0x10 < gPlayerEntity.z.HALF.HI)) { + return; + } + } else if (gPlayerEntity.z.HALF.HI == 0) { + return; + } + CopyPosition(this, &gPlayerEntity); + sub_08004542(this); + sub_08004542(&gPlayerEntity); + gPlayerEntity.collisionLayer = 1; + gPlayerEntity.flags |= ENT_COLLIDE; + gPlayerState.queued_action = 0x1f; + gPlayerState.field_0x38 = this->type2; + gPlayerState.field_0x39 = 0xff; + this->spritePriority.b0 = gPlayerEntity.spritePriority.b0 - 1; + this->action++; + sub_08077B20(); + SoundReq(SFX_153); + SoundReq(SFX_PLY_VO5); + } + } +} + +void Whirlwind_Action2(Entity* this) { + UpdateAnimationSingleFrame(this); + if (sub_0800419C(this, &gPlayerEntity, 0xc, 0xc) == 0) { + ResetCollisionLayer(this); + this->spriteOrientation.flipY = 1; + this->spriteRendering.b3 = 1; + this->action--; + } +} diff --git a/src/object/windTribeTeleporter.c b/src/object/windTribeTeleporter.c index 052d4d2e..7dd0e600 100644 --- a/src/object/windTribeTeleporter.c +++ b/src/object/windTribeTeleporter.c @@ -107,17 +107,17 @@ void WindTribeTeleporter_Action2(WindTribeTeleporterEntity* this) { break; default: if (--super->actionDelay == 0) { - #if defined(DEMO_JP) || defined(JP) || defined(EU) - #ifdef DEMO_JP - SetLocalFlag(0xfc); - #endif - DoExitTransition(&gUnk_0813ADEC[super->type2]); - #else +#if defined(DEMO_JP) || defined(JP) || defined(EU) +#ifdef DEMO_JP + SetLocalFlag(0xfc); +#endif + DoExitTransition(&gUnk_0813ADEC[super->type2]); +#else if (gRoomControls.area == 3) { SetLocalFlag(0xf9); } DoExitTransition(&gUnk_0813ADEC[super->type2]); - #endif +#endif } else { if ((gRoomTransition.frameCount & 1) == 0) { gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6;