diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2022-07-23 12:43:43 +0200 |
|---|---|---|
| committer | octorock <79596758+octorock@users.noreply.github.com> | 2022-07-25 22:45:55 +0200 |
| commit | 852effa474c159398014da736ade6f0fea454de7 (patch) | |
| tree | 97da22c4758ca4156dc9fb7ac123c7a3b0a9e9f5 /src/object/lightRay.c | |
| parent | ccba86d292a0e4c8a0e07325ac4fb25e5a58dc89 (diff) | |
Rename objects
Diffstat (limited to 'src/object/lightRay.c')
| -rw-r--r-- | src/object/lightRay.c | 337 |
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; +} |
