summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2022-02-16 00:15:08 -0800
committerGitHub <noreply@github.com>2022-02-16 00:15:08 -0800
commit910d35254be24f08fa172f94caa2e7d18717d0b2 (patch)
tree93b10f82310bc48c02a9fcc2a6ad4a1667bf7896 /src
parent712ca6fc915a0aaef582e38871931f1de8796056 (diff)
parentae19c4df96150bf2fbc7ab8d08dc723470a8f294 (diff)
Merge pull request #381 from octorock/object8E
Diffstat (limited to 'src')
-rw-r--r--src/object/object8E.c338
1 files changed, 338 insertions, 0 deletions
diff --git a/src/object/object8E.c b/src/object/object8E.c
new file mode 100644
index 00000000..2c0ce508
--- /dev/null
+++ b/src/object/object8E.c
@@ -0,0 +1,338 @@
+/**
+ * @file object8E.c
+ * @ingroup Objects
+ *
+ * @brief Object8E object
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "object.h"
+#include "functions.h"
+#include "screen.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u16 unk_68;
+ /*0x6a*/ u16 unk_6a;
+} Object8EEntity;
+
+extern void sub_0805AAF0(u32);
+
+void sub_0809B97C(Object8EEntity*, u32);
+bool32 sub_0809BE78(Object8EEntity*);
+void Object8E_Type0(Object8EEntity*);
+void Object8E_Type1(Object8EEntity*);
+void Object8E_Type2(Object8EEntity*);
+void Object8E_Type3(Object8EEntity*);
+void Object8E_Type4(Object8EEntity*);
+
+void Object8E(Object8EEntity* this) {
+ static void (*const Object8E_Types[])(Object8EEntity*) = {
+ Object8E_Type0, Object8E_Type1, Object8E_Type2, Object8E_Type3, Object8E_Type4,
+ };
+ Object8E_Types[super->type](this);
+}
+
+void Object8E_Type0(Object8EEntity* this) {
+ u32 tmp;
+ RequestPriorityDuration(super, 0x1e);
+ switch (super->action) {
+ case 0:
+ super->action = 1;
+ super->actionDelay = 0x3c;
+ super->field_0xf = 0;
+ gRoomControls.camera_target = super;
+ gRoomControls.unk5 = 1;
+ if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
+ tmp = 2;
+ } else {
+ tmp = 6;
+ }
+ gPlayerEntity.animationState = tmp;
+ gScreen.lcd.displayControl = (gScreen.lcd.displayControl & 0xbfff) | 0x2800;
+ gScreen.controls.window0HorizontalDimensions = 0;
+ gScreen.controls.window0VerticalDimensions = 0xa0;
+ break;
+ case 1:
+ if (super->actionDelay != 0) {
+ super->actionDelay--;
+ } else {
+ if (super->field_0xf < 0x20) {
+ if ((gRoomTransition.frameCount & 0x1fU) == 0) {
+ SoundReq(SFX_133);
+ }
+ if ((gRoomTransition.frameCount & 3U) == 0) {
+ sub_0809B97C(this, ++super->field_0xf);
+ }
+ } else {
+ super->action = 2;
+ super->actionDelay = 0x3c;
+ gScreen.lcd.displayControl &= 0xdfff;
+ gRoomControls.camera_target = &gPlayerEntity;
+ SoundReq(SFX_134);
+ }
+ }
+ break;
+ case 2:
+ if (--super->actionDelay == 0) {
+ gScreen.lcd.displayControl |= 0x4800;
+ gRoomControls.unk5 = 4;
+ (super->parent)->subAction = 1;
+ DeleteThisEntity();
+ }
+ break;
+ }
+}
+
+void sub_0809B97C(Object8EEntity* this, u32 param_2) {
+ s32 tmp1;
+ s32 tmp2;
+
+ tmp2 = super->x.HALF.HI - gRoomControls.scroll_x;
+ tmp1 = tmp2 - param_2;
+ tmp2 += param_2;
+ if (tmp1 < 0) {
+ tmp1 = 0;
+ }
+ if (0xf0 < tmp1) {
+ tmp1 = 0xf0;
+ }
+ if (tmp2 < 0) {
+ tmp2 = 0;
+ }
+ if (0xf0 < tmp2) {
+ tmp2 = 0xf0;
+ }
+ gScreen.controls.window0HorizontalDimensions = (tmp1 << 8) | tmp2;
+}
+
+void Object8E_Type1(Object8EEntity* this) {
+ u32 tmp;
+
+ RequestPriorityDuration(super, 0x1e);
+ switch (super->action) {
+ case 0:
+ super->action = 1;
+ super->actionDelay = 0x3c;
+ super->field_0xf = 0x20;
+ gRoomControls.camera_target = super;
+ gRoomControls.unk5 = 1;
+ if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
+ tmp = 2;
+ } else {
+ tmp = 6;
+ }
+ gPlayerEntity.animationState = tmp;
+ gScreen.lcd.displayControl = (gScreen.lcd.displayControl & 0xbfff) | 0x2000;
+ gScreen.controls.window0HorizontalDimensions = 0xf0;
+ gScreen.controls.window0VerticalDimensions = 0xa0;
+ break;
+ case 1:
+ if (super->actionDelay != 0) {
+ super->actionDelay--;
+ } else {
+ if (super->field_0xf != 0) {
+ if ((gRoomTransition.frameCount & 0x1fU) == 0) {
+ SoundReq(SFX_133);
+ }
+ if ((gRoomTransition.frameCount & 3U) == 0) {
+ sub_0809B97C(this, --super->field_0xf);
+ }
+ } else {
+ super->action = 2;
+ super->actionDelay = 0x3c;
+ gRoomControls.camera_target = &gPlayerEntity;
+ SoundReq(SFX_134);
+ }
+ }
+ break;
+ case 2:
+ if (--super->actionDelay == 0) {
+ gRoomControls.unk5 = 4;
+ gScreen.lcd.displayControl &= 0xd7ff;
+ (super->parent)->subAction = 1;
+ DeleteThisEntity();
+ }
+ break;
+ }
+}
+
+void Object8E_Type2(Object8EEntity* this) {
+ u32 tmp;
+
+ RequestPriorityDuration(super, 10);
+ switch (super->action) {
+ case 0:
+ super->action++;
+ super->actionDelay = 0x3c;
+ super->field_0xf = 0;
+ gRoomControls.camera_target = super;
+ gRoomControls.unk5 = 1;
+ if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
+ tmp = 2;
+ } else {
+ tmp = 6;
+ }
+ gPlayerEntity.animationState = tmp;
+ gScreen.controls.window0HorizontalDimensions = 0x60;
+ gScreen.controls.window0VerticalDimensions = 0xa0;
+ break;
+ case 1:
+ if (sub_0809BE78(this)) {
+ if (super->actionDelay != 0) {
+ if (--super->actionDelay == 0) {
+ gScreen.lcd.displayControl = (gScreen.lcd.displayControl & 0xbfff) | 0x2800;
+ }
+ } else {
+ if (gScreen.controls.window0HorizontalDimensions < 0xe0) {
+ if ((gRoomTransition.frameCount & 0x1fU) == 0) {
+ SoundReq(SFX_133);
+ }
+ if ((gRoomTransition.frameCount & 1U) == 0) {
+ gScreen.controls.window0HorizontalDimensions += 1;
+ }
+ } else {
+ super->action = 2;
+ super->actionDelay = 0x1e;
+ gScreen.lcd.displayControl = (gScreen.lcd.displayControl & 0xdfff) | 0x4800;
+ super->x.HALF.HI += 0x68;
+ super->y.HALF.HI += 0x28;
+ SoundReq(SFX_134);
+ }
+ }
+ }
+ break;
+ case 2:
+ if (sub_0809BE78(this) && (--super->actionDelay == 0)) {
+ super->actionDelay = 0x78;
+ super->action = 3;
+ SetLocalFlag(0x35);
+ SoundReq(SFX_SECRET);
+ }
+ break;
+ case 3:
+ if (--super->actionDelay == 0) {
+ super->action = 4;
+ gRoomControls.camera_target = &gPlayerEntity;
+ gRoomControls.unk5 = 2;
+ }
+ break;
+ case 4:
+ if (sub_0809BE78(this)) {
+ gRoomControls.unk5 = 4;
+ (super->parent)->subAction = 1;
+ SetRoomFlag(100);
+ DeleteThisEntity();
+ }
+ }
+}
+
+void Object8E_Type3(Object8EEntity* this) {
+ u32 tmp;
+
+ RequestPriorityDuration(super, 0x1e);
+ switch (super->action) {
+ case 0:
+ super->action = 1;
+ super->actionDelay = 0x3c;
+ super->field_0xf = 0;
+ gRoomControls.camera_target = super;
+ gRoomControls.unk5 = 1;
+ if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
+ tmp = 2;
+ } else {
+ tmp = 6;
+ }
+ gPlayerEntity.animationState = tmp;
+ gScreen.controls.window0HorizontalDimensions = 0x80f0;
+ gScreen.controls.window0VerticalDimensions = 0xa0;
+ super->subAction = 0x80;
+ break;
+ case 1:
+ if (sub_0809BE78(this)) {
+ if (super->actionDelay != 0) {
+ if (--super->actionDelay == 0) {
+ SetFade(6, 8);
+ sub_0805AAF0(3);
+ gScreen.lcd.displayControl = (gScreen.lcd.displayControl & 0xbfff) | 0x2800;
+ }
+ } else {
+ if (super->subAction != 0) {
+ if ((gRoomTransition.frameCount & 0x1fU) == 0) {
+ SoundReq(SFX_133);
+ }
+ if ((gRoomTransition.frameCount & 1U) == 0) {
+ super->subAction--;
+ gScreen.controls.window0HorizontalDimensions = super->subAction << 8 | 0xf0;
+ }
+ } else {
+ super->action = 2;
+ super->actionDelay = 0x78;
+ gScreen.lcd.displayControl = (gScreen.lcd.displayControl & 0xdfff) | 0x4800;
+ SetLocalFlag(0x37);
+ SoundReq(SFX_134);
+ }
+ }
+ }
+ break;
+ case 2:
+ if (--super->actionDelay == 0) {
+ (super->parent)->subAction = 1;
+ DeleteThisEntity();
+ }
+ break;
+ }
+}
+
+void Object8E_Type4(Object8EEntity* this) {
+ u32 tmp;
+ RequestPriorityDuration(super, 0x1e);
+ switch (super->action) {
+ case 0:
+ super->action = 1;
+ super->actionDelay = 0x3c;
+ super->field_0xf = 0x80;
+ gRoomControls.camera_target = super;
+ gRoomControls.unk5 = 1;
+ if (super->x.HALF.HI > gPlayerEntity.x.HALF.HI) {
+ tmp = 2;
+ } else {
+ tmp = 6;
+ }
+ gPlayerEntity.animationState = tmp;
+ break;
+ case 1:
+ if (super->actionDelay != 0) {
+ super->actionDelay--;
+ } else {
+ if (--super->field_0xf != 0) {
+ if ((gRoomTransition.frameCount & 0x1fU) == 0) {
+ SoundReq(SFX_133);
+ }
+ } else {
+ super->action = 2;
+ super->actionDelay = 0x3c;
+ gRoomControls.camera_target = &gPlayerEntity;
+ SoundReq(SFX_134);
+ }
+ }
+ break;
+ case 2:
+ if (--super->actionDelay == 0) {
+ gRoomControls.unk5 = 4;
+ (super->parent)->subAction = 1;
+ DeleteThisEntity();
+ }
+ }
+}
+
+bool32 sub_0809BE78(Object8EEntity* this) {
+ bool32 result = FALSE;
+ if (this->unk_68 == gRoomControls.scroll_x && this->unk_6a == gRoomControls.scroll_y) {
+ result = TRUE;
+ }
+ this->unk_68 = gRoomControls.scroll_x;
+ this->unk_6a = gRoomControls.scroll_y;
+ return result;
+}