summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-02-27 13:42:37 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-02-27 13:44:06 +0100
commitbc4d9b6076bb8bcbbbe4aca049c4b425ccee743a (patch)
tree9ed95787aa61a00ec407f40512634604a2f1989b
parent3fddf8f0702d3fd0f7f43cc384ab0ca5eae21497 (diff)
Decompile FourElements
-rw-r--r--asm/object/fourElements.s370
-rw-r--r--assets/assets.json5
-rw-r--r--data/const/object/fourElements.s17
-rw-r--r--include/object.h2
-rw-r--r--linker.ld4
-rw-r--r--src/object/fourElements.c170
6 files changed, 173 insertions, 395 deletions
diff --git a/asm/object/fourElements.s b/asm/object/fourElements.s
deleted file mode 100644
index 598edaa5..00000000
--- a/asm/object/fourElements.s
+++ /dev/null
@@ -1,370 +0,0 @@
- .include "asm/macros.inc"
-
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
-
- thumb_func_start FourElements
-FourElements: @ 0x080A01C0
- push {r4, lr}
- adds r4, r0, #0
- ldr r1, _080A01DC @ =gUnk_08124898
- 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
-_080A01DC: .4byte gUnk_08124898
-
- thumb_func_start sub_080A01E0
-sub_080A01E0: @ 0x080A01E0
- push {r4, lr}
- adds r4, r0, #0
- movs r2, #1
- movs r3, #1
- strb r3, [r4, #0xc]
- ldrb r1, [r4, #0x18]
- movs r0, #4
- rsbs r0, r0, #0
- ands r0, r1
- orrs r0, r2
- strb r0, [r4, #0x18]
- adds r2, r4, #0
- adds r2, #0x29
- ldrb r1, [r2]
- movs r0, #0x39
- rsbs r0, r0, #0
- ands r0, r1
- movs r1, #0x10
- orrs r0, r1
- strb r0, [r2]
- ldrb r1, [r4, #0x19]
- movs r0, #0x3f
- ands r0, r1
- movs r1, #0x40
- orrs r0, r1
- strb r0, [r4, #0x19]
- ldr r0, _080A027C @ =gHitbox_6
- str r0, [r4, #0x48]
- ldr r0, _080A0280 @ =0x0000FF40
- strh r0, [r4, #0x36]
- adds r1, r4, #0
- adds r1, #0x6a
- movs r0, #0x40
- strb r0, [r1]
- ldrb r0, [r4, #0xa]
- cmp r0, #0x43
- bgt _080A0246
- cmp r0, #0x42
- bge _080A0246
- cmp r0, #0x40
- beq _080A0246
- cmp r0, #0x41
- bne _080A0246
- ldr r2, _080A0284 @ =gScreen
- ldrh r1, [r2]
- ldr r0, _080A0288 @ =0x0000FDFF
- ands r0, r1
- strh r0, [r2]
- adds r0, r4, #0
- adds r0, #0x38
- strb r3, [r0]
-_080A0246:
- ldr r0, _080A028C @ =script_PlayerGetElement
- bl StartPlayerScript
- ldr r1, _080A0284 @ =gScreen
- adds r2, r1, #0
- adds r2, #0x66
- movs r0, #0xc8
- lsls r0, r0, #3
- strh r0, [r2]
- adds r1, #0x68
- movs r0, #0x80
- lsls r0, r0, #5
- strh r0, [r1]
- bl sub_0805BC4C
- ldrb r2, [r4, #0xa]
- subs r2, #0x40
- adds r0, r4, #0
- movs r1, #0xad
- movs r3, #0
- bl CreateObjectWithParent
- cmp r0, #0
- beq _080A027A
- str r4, [r0, #0x50]
- str r0, [r4, #0x54]
-_080A027A:
- pop {r4, pc}
- .align 2, 0
-_080A027C: .4byte gHitbox_6
-_080A0280: .4byte 0x0000FF40
-_080A0284: .4byte gScreen
-_080A0288: .4byte 0x0000FDFF
-_080A028C: .4byte script_PlayerGetElement
-
- thumb_func_start sub_080A0290
-sub_080A0290: @ 0x080A0290
- push {r4, r5, lr}
- adds r4, r0, #0
- ldr r5, _080A02BC @ =gActiveScriptInfo
- ldr r0, [r5]
- movs r1, #4
- ands r0, r1
- cmp r0, #0
- beq _080A02CA
- adds r0, r4, #0
- bl sub_080A0424
- ldrh r2, [r4, #0x36]
- movs r0, #0x36
- ldrsh r1, [r4, r0]
- movs r0, #8
- rsbs r0, r0, #0
- cmp r1, r0
- bge _080A02C0
- adds r0, r2, #1
- strh r0, [r4, #0x36]
- b _080A02CA
- .align 2, 0
-_080A02BC: .4byte gActiveScriptInfo
-_080A02C0:
- movs r1, #2
- strb r1, [r4, #0xc]
- ldr r0, [r5]
- orrs r0, r1
- str r0, [r5]
-_080A02CA:
- pop {r4, r5, pc}
-
- thumb_func_start sub_080A02CC
-sub_080A02CC: @ 0x080A02CC
- push {r4, lr}
- adds r4, r0, #0
- bl sub_080A0424
- adds r0, r4, #0
- bl sub_080A0444
- adds r0, r4, #0
- bl IsCollidingPlayer
- cmp r0, #0
- beq _080A0342
- ldr r0, [r4, #0x54]
- bl DeleteEntity
- ldrb r1, [r4, #0x18]
- movs r0, #4
- rsbs r0, r0, #0
- ands r0, r1
- strb r0, [r4, #0x18]
- movs r2, #0
- movs r0, #3
- strb r0, [r4, #0xc]
- movs r0, #0x2d
- strb r0, [r4, #0xe]
- ldr r0, _080A0344 @ =gScreen
- adds r3, r0, #0
- adds r3, #0x66
- movs r1, #0xc8
- lsls r1, r1, #3
- strh r1, [r3]
- adds r0, #0x68
- strh r2, [r0]
- ldrb r0, [r4, #0xa]
- movs r1, #0
- movs r2, #1
- bl sub_080A7C18
- adds r0, r4, #0
- movs r1, #1
- bl sub_0808C650
- movs r0, #6
- movs r1, #2
- bl SetFade
- movs r0, #0xf8
- bl SoundReq
- movs r0, #0xa4
- lsls r0, r0, #1
- bl SoundReq
- movs r0, #5
- bl SoundReq
- ldr r0, _080A0348 @ =0x80110000
- bl SoundReq
-_080A0342:
- pop {r4, pc}
- .align 2, 0
-_080A0344: .4byte gScreen
-_080A0348: .4byte 0x80110000
-
- thumb_func_start sub_080A034C
-sub_080A034C: @ 0x080A034C
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0xe]
- cmp r0, #0
- beq _080A0378
- adds r0, r4, #0
- bl sub_080A0424
- ldrb r0, [r4, #0xe]
- subs r0, #1
- strb r0, [r4, #0xe]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _080A038C
- ldr r0, _080A0374 @ =gPlayerEntity
- movs r1, #0
- bl SetDefaultPriority
- b _080A038C
- .align 2, 0
-_080A0374: .4byte gPlayerEntity
-_080A0378:
- movs r0, #0
- movs r1, #0x3c
- bl RequestPriorityDuration
- bl sub_0808C67C
- cmp r0, #0
- beq _080A038C
- movs r0, #4
- strb r0, [r4, #0xc]
-_080A038C:
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_080A0390
-sub_080A0390: @ 0x080A0390
- push {r4, lr}
- adds r4, r0, #0
- movs r0, #0
- movs r1, #0x3c
- bl RequestPriorityDuration
- ldr r0, _080A03B4 @ =gFadeControl
- ldrb r0, [r0]
- cmp r0, #0
- bne _080A03B2
- movs r0, #5
- strb r0, [r4, #0xc]
- adds r1, r4, #0
- adds r1, #0x68
- movs r0, #0xd2
- lsls r0, r0, #1
- strh r0, [r1]
-_080A03B2:
- pop {r4, pc}
- .align 2, 0
-_080A03B4: .4byte gFadeControl
-
- thumb_func_start sub_080A03B8
-sub_080A03B8: @ 0x080A03B8
- push {r4, lr}
- adds r4, r0, #0
- movs r0, #0
- movs r1, #0xa
- bl RequestPriorityDuration
- adds r1, r4, #0
- adds r1, #0x68
- ldrh r0, [r1]
- subs r0, #1
- strh r0, [r1]
- lsls r0, r0, #0x10
- cmp r0, #0
- bne _080A03E4
- movs r0, #6
- strb r0, [r4, #0xc]
- ldrb r0, [r4, #0xa]
- bl sub_0805429C
- adds r1, r4, #0
- bl MessageNoOverlap
-_080A03E4:
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_080A03E8
-sub_080A03E8: @ 0x080A03E8
- push {lr}
- movs r0, #0
- movs r1, #0xa
- bl RequestPriorityDuration
- ldr r0, _080A041C @ =gMessage
- ldrb r1, [r0]
- movs r0, #0x7f
- ands r0, r1
- cmp r0, #0
- bne _080A041A
- movs r0, #0x5a
- bl SetPriorityTimer
- ldr r0, _080A0420 @ =gPlayerState
- adds r0, #0x8b
- movs r1, #1
- strb r1, [r0]
- bl sub_0807DF50
- movs r0, #0
- bl SetRoomFlag
- bl DeleteThisEntity
-_080A041A:
- pop {pc}
- .align 2, 0
-_080A041C: .4byte gMessage
-_080A0420: .4byte gPlayerState
-
- thumb_func_start sub_080A0424
-sub_080A0424: @ 0x080A0424
- push {lr}
- adds r1, r0, #0
- adds r1, #0x6a
- ldrb r0, [r1]
- subs r0, #1
- strb r0, [r1]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _080A0442
- movs r0, #0x40
- strb r0, [r1]
- movs r0, #0xbc
- lsls r0, r0, #1
- bl SoundReq
-_080A0442:
- pop {pc}
-
- thumb_func_start sub_080A0444
-sub_080A0444: @ 0x080A0444
- ldr r3, _080A0460 @ =gUnk_081248B4
- ldrb r1, [r0, #0xf]
- adds r2, r1, #1
- strb r2, [r0, #0xf]
- lsls r1, r1, #0x18
- lsrs r1, r1, #0x1b
- movs r2, #7
- ands r1, r2
- adds r1, r1, r3
- ldrb r1, [r1]
- lsls r1, r1, #0x18
- asrs r1, r1, #0x18
- strh r1, [r0, #0x36]
- bx lr
- .align 2, 0
-_080A0460: .4byte gUnk_081248B4
-
- thumb_func_start sub_080A0464
-sub_080A0464: @ 0x080A0464
- push {r4, r5, lr}
- adds r4, r0, #0
- adds r5, r1, #0
- movs r0, #6
- movs r1, #0xac
- movs r2, #6
- bl FindEntityByID
- cmp r0, #0
- beq _080A048A
- movs r1, #0x2e
- ldrsh r2, [r0, r1]
- movs r1, #0x32
- ldrsh r3, [r0, r1]
- adds r3, #0x18
- adds r0, r4, #0
- adds r1, r5, #0
- bl sub_0807DEDC
-_080A048A:
- pop {r4, r5, pc}
diff --git a/assets/assets.json b/assets/assets.json
index 4f09547f..b5b97d14 100644
--- a/assets/assets.json
+++ b/assets/assets.json
@@ -45363,11 +45363,6 @@
"type": "animation"
},
{
- "path": "fourElements/gUnk_081248B4.bin",
- "start": 1198260,
- "size": 8
- },
- {
"path": "animations/gSpriteAnimations_ObjectAF_0.bin",
"start": 1198288,
"size": 17,
diff --git a/data/const/object/fourElements.s b/data/const/object/fourElements.s
deleted file mode 100644
index 53555f3f..00000000
--- a/data/const/object/fourElements.s
+++ /dev/null
@@ -1,17 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .section .rodata
- .align 2
-
-gUnk_08124898:: @ 08124898
- .4byte sub_080A01E0
- .4byte sub_080A0290
- .4byte sub_080A02CC
- .4byte sub_080A034C
- .4byte sub_080A0390
- .4byte sub_080A03B8
- .4byte sub_080A03E8
-
-gUnk_081248B4:: @ 081248B4
- .incbin "fourElements/gUnk_081248B4.bin"
diff --git a/include/object.h b/include/object.h
index 25347073..67beae04 100644
--- a/include/object.h
+++ b/include/object.h
@@ -398,7 +398,7 @@ void ObjectA8();
void ObjectA9(Entity*);
void WaterfallOpening(Entity*);
void ObjectAB(Entity*);
-void FourElements(Entity*);
+void FourElements();
void ObjectAD(Entity*);
void FloatingBlock(Entity*);
void ObjectAF(Entity*);
diff --git a/linker.ld b/linker.ld
index 3dc07b11..2bf3377e 100644
--- a/linker.ld
+++ b/linker.ld
@@ -819,7 +819,7 @@ SECTIONS {
asm/object/objectA9.o(.text);
asm/object/waterfallOpening.o(.text);
asm/object/objectAB.o(.text);
- asm/object/fourElements.o(.text);
+ src/object/fourElements.o(.text);
asm/object/objectAD.o(.text);
src/object/floatingBlock.o(.text);
src/object/objectAF.o(.text);
@@ -1574,7 +1574,7 @@ SECTIONS {
data/const/object/waterfallOpening.o(.rodata);
data/const/object/objectAB.o(.rodata);
data/animations/object/objectAB.o(.rodata);
- data/const/object/fourElements.o(.rodata);
+ src/object/fourElements.o(.rodata);
data/const/object/objectAD.o(.rodata);
data/const/object/objectAF.o(.rodata);
data/animations/object/objectAF.o(.rodata);
diff --git a/src/object/fourElements.c b/src/object/fourElements.c
new file mode 100644
index 00000000..daecece1
--- /dev/null
+++ b/src/object/fourElements.c
@@ -0,0 +1,170 @@
+/**
+ * @file fourElements.c
+ * @ingroup Objects
+ *
+ * @brief Four Elements object
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "object.h"
+#include "functions.h"
+#include "hitbox.h"
+#include "screen.h"
+#include "message.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u16 unk_68;
+ /*0x6a*/ u8 unk_6a;
+} FourElementsEntity;
+
+extern u32 sub_0805429C(u32);
+extern void sub_0807DF50(void);
+
+extern u16 script_PlayerGetElement[];
+
+void FourElements_Init(FourElementsEntity*);
+void FourElements_Action1(FourElementsEntity*);
+void FourElements_Action2(FourElementsEntity*);
+void FourElements_Action3(FourElementsEntity*);
+void FourElements_Action4(FourElementsEntity*);
+void FourElements_Action5(FourElementsEntity*);
+void FourElements_Action6(FourElementsEntity*);
+void sub_080A0424(FourElementsEntity*);
+void sub_080A0444(FourElementsEntity*);
+
+void FourElements(FourElementsEntity* this) {
+ static void (*const FourElements_Actions[])(FourElementsEntity*) = {
+ FourElements_Init, FourElements_Action1, FourElements_Action2, FourElements_Action3,
+ FourElements_Action4, FourElements_Action5, FourElements_Action6,
+ };
+ FourElements_Actions[super->action](this);
+ sub_08080CB4(super);
+}
+
+void FourElements_Init(FourElementsEntity* this) {
+ Entity* objectAD;
+ super->action = 1;
+ super->spriteSettings.draw = 1;
+ super->spritePriority.b1 = 2;
+ super->spriteRendering.b3 = 1;
+ super->hitbox = (Hitbox*)&gHitbox_6;
+ super->z.HALF.HI = 0xff40;
+ this->unk_6a = 0x40;
+ switch (super->type) {
+ case 0x41:
+ gScreen.lcd.displayControl &= 0xfdff;
+ super->collisionLayer = 1;
+ break;
+ case 0x40:
+ case 0x42:
+ case 0x43:
+ break;
+ }
+ StartPlayerScript(script_PlayerGetElement);
+ gScreen.controls.layerFXControl = 0x640;
+ gScreen.controls.alphaBlend = 0x1000;
+ sub_0805BC4C();
+ objectAD = CreateObjectWithParent(super, OBJECT_AD, super->type - 0x40, 0);
+ if (objectAD != NULL) {
+ objectAD->parent = super;
+ super->child = objectAD;
+ }
+}
+
+void FourElements_Action1(FourElementsEntity* this) {
+ if ((gActiveScriptInfo.syncFlags & 4) != 0) {
+ sub_080A0424(this);
+ if (super->z.HALF.HI < -8) {
+ super->z.HALF.HI++;
+ } else {
+ super->action = 2;
+ gActiveScriptInfo.syncFlags |= 2;
+ }
+ }
+}
+
+void FourElements_Action2(FourElementsEntity* this) {
+ sub_080A0424(this);
+ sub_080A0444(this);
+ if (IsCollidingPlayer(super)) {
+ DeleteEntity(super->child);
+ super->spriteSettings.draw = 0;
+ super->action = 3;
+ super->actionDelay = 0x2d;
+ gScreen.controls.layerFXControl = 0x640;
+ gScreen.controls.alphaBlend = 0;
+ sub_080A7C18(super->type, 0, 1);
+ sub_0808C650(super, 1);
+ SetFade(6, 2);
+ SoundReq(SFX_F8);
+ SoundReq(SFX_148);
+ SoundReq(BGM_ELEMENT_GET);
+ SoundReq(SONG_BGM_0);
+ }
+}
+
+void FourElements_Action3(FourElementsEntity* this) {
+ if (super->actionDelay != 0) {
+ sub_080A0424(this);
+ if (--super->actionDelay == 0) {
+ SetDefaultPriority(&gPlayerEntity, 0);
+ }
+ } else {
+ RequestPriorityDuration(NULL, 0x3c);
+ if (sub_0808C67C()) {
+ super->action = 4;
+ }
+ }
+}
+
+void FourElements_Action4(FourElementsEntity* this) {
+ RequestPriorityDuration(NULL, 0x3c);
+ if (gFadeControl.active == 0) {
+ super->action = 5;
+ this->unk_68 = 0x1a4;
+ }
+}
+
+void FourElements_Action5(FourElementsEntity* this) {
+ u32 index;
+ RequestPriorityDuration(NULL, 10);
+ if (--this->unk_68 == 0) {
+ super->action = 6;
+ index = sub_0805429C(super->type);
+ MessageNoOverlap(index, super);
+ }
+}
+
+void FourElements_Action6(FourElementsEntity* this) {
+ RequestPriorityDuration(NULL, 10);
+ if ((gMessage.doTextBox & 0x7f) == 0) {
+ SetPriorityTimer(0x5a);
+ gPlayerState.controlMode = 1;
+ sub_0807DF50();
+ SetRoomFlag(0);
+ DeleteThisEntity();
+ }
+}
+
+void sub_080A0424(FourElementsEntity* this) {
+ if (--this->unk_6a == 0) {
+ this->unk_6a = 0x40;
+ SoundReq(SFX_178);
+ }
+}
+
+void sub_080A0444(FourElementsEntity* this) {
+ static const u8 gUnk_081248B4[] = {
+ 249, 248, 247, 246, 245, 246, 247, 248,
+ };
+ super->z.HALF.HI = gUnk_081248B4[(super->field_0xf++ >> 3) & 7] << 0x18 >> 0x18;
+}
+
+void sub_080A0464(FourElementsEntity* this, ScriptExecutionContext* context) {
+ Entity* element = FindEntityByID(6, FOUR_ELEMENTS, 6);
+ if (element != NULL) {
+ sub_0807DEDC(super, context, element->x.HALF.HI, element->y.HALF.HI + 0x18);
+ }
+}