summaryrefslogtreecommitdiff
path: root/src/object
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-02-11 21:52:13 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-02-12 22:50:59 +0100
commit891d99bab4cf7e1afd5d3ccbaea058d1ed17ea4c (patch)
tree1e60b03644b18b871e8213afaa1d71442cfe821e /src/object
parent16d8e144888299dc2804579ad4b6c77bef8bd5bb (diff)
Decompile EzloCap
Diffstat (limited to 'src/object')
-rw-r--r--src/object/ezloCap.c301
1 files changed, 301 insertions, 0 deletions
diff --git a/src/object/ezloCap.c b/src/object/ezloCap.c
new file mode 100644
index 00000000..e36a09cf
--- /dev/null
+++ b/src/object/ezloCap.c
@@ -0,0 +1,301 @@
+/**
+ * @file ezloCap.c
+ * @ingroup Objects
+ *
+ * @brief Ezlo Cap object
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "object.h"
+#include "functions.h"
+#include "message.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u8 unk_68[0x1a];
+ /*0x82*/ u16 unk_82;
+ /*0x84*/ ScriptExecutionContext* unk_84;
+} EzloCapEntity;
+
+void sub_08082D20(EzloCapEntity*, ScriptExecutionContext*);
+void sub_08082C5C(EzloCapEntity*);
+void EzloCap_Type0Init(EzloCapEntity*);
+void EzloCap_Type0Action1(EzloCapEntity*);
+void EzloCap_Type1Action1(EzloCapEntity*);
+void EzloCap_ScriptedInit(EzloCapEntity*);
+void EzloCap_ScriptedAction1(EzloCapEntity*);
+void EzloCap_ScriptedAction2(EzloCapEntity*);
+void EzloCap_ScriptedAction3(EzloCapEntity*);
+
+void EzloCap(EzloCapEntity* this) {
+ static void (*const EzloCap_Type0Actions[])(EzloCapEntity*) = {
+ EzloCap_Type0Init,
+ EzloCap_Type0Action1,
+ };
+ static void (*const EzloCap_Type1Actions[])(EzloCapEntity*) = {
+ EzloCap_Type0Init,
+ EzloCap_Type1Action1,
+ };
+ static void (*const EzloCap_ScriptedActions[])(EzloCapEntity*) = {
+ EzloCap_ScriptedInit,
+ EzloCap_ScriptedAction1,
+ EzloCap_ScriptedAction2,
+ EzloCap_ScriptedAction3,
+ };
+ void (*ppuVar1[0])(EzloCapEntity*);
+
+ if ((super->flags & ENT_SCRIPTED) != 0) {
+ EzloCap_ScriptedActions[super->action](this);
+ } else {
+ if (super->type == 0) {
+ EzloCap_Type0Actions[super->action](this);
+ } else {
+ EzloCap_Type1Actions[super->action](this);
+ }
+ }
+}
+
+void EzloCap_Type0Init(EzloCapEntity* this) {
+ super->updatePriority = 6;
+ super->spriteRendering.b3 = gPlayerEntity.spriteRendering.b3;
+ super->spritePriority.b0 = gPlayerEntity.spritePriority.b0 - 1;
+ super->palette.b.b0 = gPlayerEntity.palette.b.b0;
+ super->collisionLayer = gPlayerEntity.collisionLayer;
+ super->action = 1;
+ if (gPlayerEntity.animationState == 2) {
+ super->spriteSettings.flipX = 1;
+ }
+ LoadSwapGFX(super, 1, 3);
+ if (super->type == 0) {
+ super->field_0xf = 7;
+ InitAnimationForceUpdate(super, 7);
+ SoundReq(SFX_F3);
+ } else {
+ super->actionDelay = 0;
+ super->field_0xf = 0xa;
+ super->y.HALF.HI -= 0xe;
+ InitAnimationForceUpdate(super, 0x14);
+ }
+}
+
+void EzloCap_Type0Action1(EzloCapEntity* this) {
+ static const u8 gUnk_0811F16C[] = { 4, 0, 2, 6, 10, 8, 9, 5, 1, 0, 0, 0 };
+ u32 tmp = gPlayerEntity.palette.b.b0;
+ super->palette.b.b0 = tmp;
+ if ((gMessage.doTextBox & 0x7f) == 0) {
+ DeleteEntity(super);
+ return;
+ }
+ if ((gMessage.doTextBox & 0x7f) != 5) {
+ if (((gMessage.unk == 0xa) || (gMessage.unk == 0)) || ((gMessage.unk & 0xf) > 9)) {
+ if (super->animIndex != (super->field_0xf | 3)) {
+ InitAnimationForceUpdate(super, super->field_0xf | 3);
+ return;
+ }
+ } else {
+ if ((gMessage.unk & 0x80) != 0) {
+ if ((super->frame & 0x90) != 0) {
+ super->field_0xf = gUnk_0811F16C[(s32)Random() % 9];
+ InitAnimationForceUpdate(super, super->field_0xf);
+ return;
+ }
+ } else {
+ if (super->animIndex != gUnk_0811F16C[gMessage.unk]) {
+ super->field_0xf = gUnk_0811F16C[gMessage.unk];
+ InitAnimationForceUpdate(super, super->field_0xf);
+ return;
+ }
+ }
+ }
+ }
+ if (super->animIndex > 7) {
+ super->actionDelay = 1;
+ } else {
+ super->actionDelay = 0;
+ }
+ UpdateAnimationSingleFrame(super);
+}
+
+void EzloCap_Type1Action1(EzloCapEntity* this) {
+ static const u32 gUnk_0811F178[] = { 16, 12, 12, 16, 20 };
+ Entity* obj;
+ u32 tmp;
+
+ if ((gPlayerState.flags & PL_MINISH) != 0) {
+ DeleteThisEntity();
+ }
+ UpdateAnimationSingleFrame(super);
+ if (super->subAction == 0) {
+ if (super->field_0xf-- == 0) {
+ super->actionDelay++;
+ super->field_0xf = 0xa;
+ tmp = super->actionDelay - 1;
+ obj = CreateObjectWithParent(super, OBJECT_79, tmp, 0);
+ super->child = obj;
+ if (obj != NULL) {
+ if (tmp == 0) {
+ super->parent = obj;
+ } else {
+ obj->parent = super->parent;
+ }
+ }
+ if (super->actionDelay == 6) {
+ super->subAction = 3;
+ super->actionDelay = 0x3c;
+ super->parent->type2 = 1;
+ InitAnimationForceUpdate(super, 0x1c);
+ } else {
+ InitAnimationForceUpdate(super, gUnk_0811F178[super->actionDelay - 1]);
+ if (super->actionDelay > 2) {
+ super->spriteSettings.flipX = 1;
+ }
+ }
+ }
+ } else if ((super->frame & 0x80) != 0) {
+ super->actionDelay = Random() & 3;
+ if (super->actionDelay != 0) {
+ super->spriteSettings.flipX = Random() & 1;
+ InitAnimationForceUpdate(super, super->actionDelay + 0x1b);
+ }
+ }
+}
+
+void EzloCap_ScriptedInit(EzloCapEntity* this) {
+ super->updatePriority = 2;
+ super->palette.b.b0 = gPlayerEntity.palette.b.b0;
+ super->collisionLayer = gPlayerEntity.collisionLayer;
+ super->spritePriority.b1 = 3;
+ super->spriteSettings.shadow = 1;
+ super->action = 1;
+ LoadSwapGFX(super, 1, 3);
+ InitAnimationForceUpdate(super, 0xc);
+ this->unk_82 = 0;
+ ExecuteScript(super, this->unk_84);
+ sub_08082D20(this, this->unk_84);
+ if (gPlayerEntity.animationState == 2) {
+ super->spriteSettings.flipX = 1;
+ }
+ sub_08082C5C(this);
+}
+
+void EzloCap_ScriptedAction1(EzloCapEntity* this) {
+ ExecuteScript(super, this->unk_84);
+ sub_08082D20(this, this->unk_84);
+ if (super->action < 2) {
+ sub_08082C5C(this);
+ }
+}
+
+void sub_08082C5C(EzloCapEntity* this) {
+ static const u8 gUnk_0811F18C[] = { 12, 20, 16, 20 };
+ switch (super->subAction) {
+ case 0:
+ if (super->animIndex != 0x17) {
+ InitAnimationForceUpdate(super, 0x17);
+ return;
+ }
+ break;
+ case 1:
+ if (super->animIndex != 0x18) {
+ InitAnimationForceUpdate(super, 0x18);
+ return;
+ }
+ break;
+ case 2:
+ if ((super->frame & 0x80) != 0) {
+ InitAnimationForceUpdate(super, gUnk_0811F18C[Random() & 3] + (Random() & 3));
+ return;
+ }
+ break;
+ case 3:
+ if (super->animIndex != 0x13) {
+ InitAnimationForceUpdate(super, 0x13);
+ return;
+ }
+ break;
+ case 4:
+ if (super->animIndex != 0x1a) {
+ InitAnimationForceUpdate(super, 0x1a);
+ return;
+ }
+ }
+ GravityUpdate(super, 0x2000);
+ UpdateAnimationSingleFrame(super);
+}
+
+void sub_08082D20(EzloCapEntity* this, ScriptExecutionContext* context) {
+ while (context->postScriptActions != 0) {
+ u32 tmp = (~context->postScriptActions + 1) & context->postScriptActions;
+ context->postScriptActions ^= tmp;
+ switch (tmp) {
+ case 1 << 0x00:
+ super->subAction = 0;
+ break;
+ case 1 << 0x01:
+ super->subAction = 1;
+ break;
+ case 1 << 0x02:
+ super->subAction = 2;
+ break;
+ case 1 << 0x03:
+ super->subAction = 3;
+ break;
+ case 1 << 0x08:
+ super->spriteSettings.draw = 0;
+ break;
+ case 1 << 0x07:
+ super->spriteSettings.draw = 1;
+ break;
+ case 1 << 0x11:
+ super->spriteSettings.flipX ^= 1;
+ break;
+ case 1 << 0x06:
+ DeleteThisEntity();
+ // fallthrough
+ case 1 << 0x14:
+ super->action = 2;
+ super->subAction = 0;
+ return;
+ case 1 << 0x15:
+ super->subAction = 4;
+ super->spriteOffsetX = 4;
+ break;
+ case 1 << 0x16:
+ super->action = 3;
+ super->subAction = 0;
+ super->spriteOffsetX = 4;
+ InitAnimationForceUpdate(super, 0x1b);
+ return;
+ }
+ }
+}
+
+void EzloCap_ScriptedAction2(EzloCapEntity* this) {
+ ExecuteScript(super, this->unk_84);
+ GravityUpdate(super, 0x1800);
+ switch (super->subAction) {
+ case 0:
+ if (super->zVelocity < 0) {
+ super->subAction = 1;
+ }
+ break;
+ case 1:
+ if (super->z.HALF.HI > -10) {
+ gActiveScriptInfo.syncFlags |= 2;
+ DeleteThisEntity();
+ }
+ break;
+ }
+ UpdateAnimationSingleFrame(super);
+}
+
+void EzloCap_ScriptedAction3(EzloCapEntity* this) {
+ UpdateAnimationSingleFrame(super);
+ if ((super->frame & 0x80) != 0) {
+ super->action = 1;
+ super->subAction = 0;
+ super->spriteOffsetX = 0;
+ InitAnimationForceUpdate(super, 0x17);
+ }
+}