Decompile Whirlwind

This commit is contained in:
octorock 2022-02-27 12:53:18 +01:00
parent d37be75c49
commit 3fddf8f070
17 changed files with 108 additions and 315 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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 };

View File

@ -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);
}

View File

@ -20,7 +20,6 @@ typedef struct {
/*0x86*/ u16 unk_86;
} BigIceBlockEntity;
extern void (*const BigIceBlock_Actions[])(BigIceBlockEntity*);
extern const u16 gUnk_081237B0[];

View File

@ -26,7 +26,6 @@ typedef struct {
/*0x86*/ u16 unk_86;
} BossDoorEntity;
extern bool32 gUnk_02036BB8;
extern const u8 gUnk_0811F740[];

View File

@ -22,8 +22,6 @@ typedef struct {
/*0x87*/ u8 unk_87;
} FairyEntity;
void sub_0808D76C(FairyEntity*);
void sub_0808DAD0(FairyEntity*);
void sub_0808DB2C(FairyEntity*);

View File

@ -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);

View File

@ -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[];

View File

@ -21,7 +21,6 @@ typedef struct {
/*0x87*/ u8 unk_87;
} ObjectA8Entity;
void sub_0809FECC(ObjectA8Entity*);
bool32 sub_0809FE9C(ObjectA8Entity*);
void ObjectA8_Init(ObjectA8Entity*);

View File

@ -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*);

View File

@ -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[];

View File

@ -21,7 +21,6 @@ typedef struct {
/*0x86*/ u16 unk_86;
} PushableStatueEntity;
extern const s16 gUnk_080B4488[];
extern const s16 gUnk_080B4468[];

View File

@ -6,7 +6,6 @@ void sub_08086A6C(Entity*);
void (*const gUnk_081206C4[])(Entity*);
// Main
void Rupee(Entity* ent) {
gUnk_081206C4[ent->action](ent);

99
src/object/whirlwind.c Normal file
View File

@ -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--;
}
}

View File

@ -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;