diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-11 21:52:13 +0100 |
|---|---|---|
| committer | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-12 22:50:59 +0100 |
| commit | 891d99bab4cf7e1afd5d3ccbaea058d1ed17ea4c (patch) | |
| tree | 1e60b03644b18b871e8213afaa1d71442cfe821e /src/object | |
| parent | 16d8e144888299dc2804579ad4b6c77bef8bd5bb (diff) | |
Decompile EzloCap
Diffstat (limited to 'src/object')
| -rw-r--r-- | src/object/ezloCap.c | 301 |
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); + } +} |
