summaryrefslogtreecommitdiff
path: root/src/object/lightRay.c
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-07-23 12:43:43 +0200
committeroctorock <79596758+octorock@users.noreply.github.com>2022-07-25 22:45:55 +0200
commit852effa474c159398014da736ade6f0fea454de7 (patch)
tree97da22c4758ca4156dc9fb7ac123c7a3b0a9e9f5 /src/object/lightRay.c
parentccba86d292a0e4c8a0e07325ac4fb25e5a58dc89 (diff)
Rename objects
Diffstat (limited to 'src/object/lightRay.c')
-rw-r--r--src/object/lightRay.c337
1 files changed, 337 insertions, 0 deletions
diff --git a/src/object/lightRay.c b/src/object/lightRay.c
new file mode 100644
index 00000000..4aae9aac
--- /dev/null
+++ b/src/object/lightRay.c
@@ -0,0 +1,337 @@
+/**
+ * @file lightRay.c
+ * @ingroup Objects
+ *
+ * @brief Light Ray object
+ */
+#define NENT_DEPRECATED
+#include "functions.h"
+#include "global.h"
+#include "object.h"
+#include "screen.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u16 unk_68;
+ /*0x6a*/ u16 unk_6a;
+} LightRayEntity;
+
+extern void sub_0805AAF0(u32);
+
+void sub_0809B97C(LightRayEntity*, u32);
+bool32 sub_0809BE78(LightRayEntity*);
+void LightRay_Type0(LightRayEntity*);
+void LightRay_Type1(LightRayEntity*);
+void LightRay_Type2(LightRayEntity*);
+void LightRay_Type3(LightRayEntity*);
+void LightRay_Type4(LightRayEntity*);
+
+void LightRay(LightRayEntity* this) {
+ static void (*const LightRay_Types[])(LightRayEntity*) = {
+ LightRay_Type0, LightRay_Type1, LightRay_Type2, LightRay_Type3, LightRay_Type4,
+ };
+ LightRay_Types[super->type](this);
+}
+
+void LightRay_Type0(LightRayEntity* this) {
+ u32 tmp;
+ RequestPriorityDuration(super, 30);
+ switch (super->action) {
+ case 0:
+ super->action = 1;
+ super->timer = 60;
+ super->subtimer = 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->timer != 0) {
+ super->timer--;
+ } else {
+ if (super->subtimer < 0x20) {
+ if ((gRoomTransition.frameCount & 0x1fU) == 0) {
+ SoundReq(SFX_133);
+ }
+ if ((gRoomTransition.frameCount & 3U) == 0) {
+ sub_0809B97C(this, ++super->subtimer);
+ }
+ } else {
+ super->action = 2;
+ super->timer = 60;
+ gScreen.lcd.displayControl &= 0xdfff;
+ gRoomControls.camera_target = &gPlayerEntity;
+ SoundReq(SFX_134);
+ }
+ }
+ break;
+ case 2:
+ if (--super->timer == 0) {
+ gScreen.lcd.displayControl |= 0x4800;
+ gRoomControls.unk5 = 4;
+ (super->parent)->subAction = 1;
+ DeleteThisEntity();
+ }
+ break;
+ }
+}
+
+void sub_0809B97C(LightRayEntity* 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 LightRay_Type1(LightRayEntity* this) {
+ u32 tmp;
+
+ RequestPriorityDuration(super, 30);
+ switch (super->action) {
+ case 0:
+ super->action = 1;
+ super->timer = 60;
+ super->subtimer = 32;
+ 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->timer != 0) {
+ super->timer--;
+ } else {
+ if (super->subtimer != 0) {
+ if ((gRoomTransition.frameCount & 0x1fU) == 0) {
+ SoundReq(SFX_133);
+ }
+ if ((gRoomTransition.frameCount & 3U) == 0) {
+ sub_0809B97C(this, --super->subtimer);
+ }
+ } else {
+ super->action = 2;
+ super->timer = 60;
+ gRoomControls.camera_target = &gPlayerEntity;
+ SoundReq(SFX_134);
+ }
+ }
+ break;
+ case 2:
+ if (--super->timer == 0) {
+ gRoomControls.unk5 = 4;
+ gScreen.lcd.displayControl &= 0xd7ff;
+ (super->parent)->subAction = 1;
+ DeleteThisEntity();
+ }
+ break;
+ }
+}
+
+void LightRay_Type2(LightRayEntity* this) {
+ u32 tmp;
+
+ RequestPriorityDuration(super, 10);
+ switch (super->action) {
+ case 0:
+ super->action++;
+ super->timer = 60;
+ super->subtimer = 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->timer != 0) {
+ if (--super->timer == 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++;
+ }
+ } else {
+ super->action = 2;
+ super->timer = 30;
+ 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->timer == 0)) {
+ super->timer = 120;
+ super->action = 3;
+ SetLocalFlag(0x35);
+ SoundReq(SFX_SECRET);
+ }
+ break;
+ case 3:
+ if (--super->timer == 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 LightRay_Type3(LightRayEntity* this) {
+ u32 tmp;
+
+ RequestPriorityDuration(super, 30);
+ switch (super->action) {
+ case 0:
+ super->action = 1;
+ super->timer = 60;
+ super->subtimer = 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->timer != 0) {
+ if (--super->timer == 0) {
+ SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 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->timer = 120;
+ gScreen.lcd.displayControl = (gScreen.lcd.displayControl & 0xdfff) | 0x4800;
+ SetLocalFlag(0x37);
+ SoundReq(SFX_134);
+ }
+ }
+ }
+ break;
+ case 2:
+ if (--super->timer == 0) {
+ (super->parent)->subAction = 1;
+ DeleteThisEntity();
+ }
+ break;
+ }
+}
+
+void LightRay_Type4(LightRayEntity* this) {
+ u32 tmp;
+ RequestPriorityDuration(super, 30);
+ switch (super->action) {
+ case 0:
+ super->action = 1;
+ super->timer = 60;
+ super->subtimer = 128;
+ 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->timer != 0) {
+ super->timer--;
+ } else {
+ if (--super->subtimer != 0) {
+ if ((gRoomTransition.frameCount & 0x1fU) == 0) {
+ SoundReq(SFX_133);
+ }
+ } else {
+ super->action = 2;
+ super->timer = 60;
+ gRoomControls.camera_target = &gPlayerEntity;
+ SoundReq(SFX_134);
+ }
+ }
+ break;
+ case 2:
+ if (--super->timer == 0) {
+ gRoomControls.unk5 = 4;
+ (super->parent)->subAction = 1;
+ DeleteThisEntity();
+ }
+ }
+}
+
+bool32 sub_0809BE78(LightRayEntity* 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;
+}