Shipwright/soh/src/overlays/actors/ovl_En_Dy_Extra/z_en_dy_extra.c

129 lines
4.4 KiB
C

/*
* File: z_en_dy_extra.c
* Overlay: ovl_En_Dy_Extra
* Description: Spiral Beams (Great Fairy Fountains)
*/
#include "z_en_dy_extra.h"
#include "objects/object_dy_obj/object_dy_obj.h"
#include "vt.h"
#define FLAGS (ACTOR_FLAG_4 | ACTOR_FLAG_5)
void EnDyExtra_Init(Actor* thisx, GlobalContext* globalCtx);
void EnDyExtra_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnDyExtra_Update(Actor* thisx, GlobalContext* globalCtx);
void EnDyExtra_Draw(Actor* thisx, GlobalContext* globalCtx);
void EnDyExtra_WaitForTrigger(EnDyExtra* this, GlobalContext* globalCtx);
void EnDyExtra_FallAndKill(EnDyExtra* this, GlobalContext* globalCtx);
const ActorInit En_Dy_Extra_InitVars = {
ACTOR_EN_DY_EXTRA,
ACTORCAT_PROP,
FLAGS,
OBJECT_DY_OBJ,
sizeof(EnDyExtra),
(ActorFunc)EnDyExtra_Init,
(ActorFunc)EnDyExtra_Destroy,
(ActorFunc)EnDyExtra_Update,
(ActorFunc)EnDyExtra_Draw,
NULL,
};
void EnDyExtra_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
void EnDyExtra_Init(Actor* thisx, GlobalContext* globalCtx) {
EnDyExtra* this = (EnDyExtra*)thisx;
osSyncPrintf("\n\n");
// "Big fairy effect"
osSyncPrintf(VT_FGCOL(YELLOW) "☆☆☆☆☆ 大妖精効果 ☆☆☆☆☆ %d\n" VT_RST, this->actor.params);
this->type = this->actor.params;
this->scale.x = 0.025f;
this->scale.y = 0.039f;
this->scale.z = 0.025f;
this->unk_168 = this->actor.world.pos;
this->actor.gravity = -0.2f;
this->unk_158 = 1.0f;
this->timer = 60;
this->actionFunc = EnDyExtra_WaitForTrigger;
}
void EnDyExtra_WaitForTrigger(EnDyExtra* this, GlobalContext* globalCtx) {
Math_ApproachF(&this->actor.gravity, 0.0f, 0.1f, 0.005f);
if (this->actor.world.pos.y < -55.0f) {
this->actor.velocity.y = 0.0f;
}
if (this->timer == 0 && this->trigger != 0) {
this->timer = 200;
this->actionFunc = EnDyExtra_FallAndKill;
}
}
void EnDyExtra_FallAndKill(EnDyExtra* this, GlobalContext* globalCtx) {
Math_ApproachF(&this->actor.gravity, 0.0f, 0.1f, 0.005f);
if (this->timer == 0 || this->unk_158 < 0.02f) {
Actor_Kill(&this->actor);
return;
}
Math_ApproachZeroF(&this->unk_158, 0.03f, 0.05f);
if (this->actor.world.pos.y < -55.0f) {
this->actor.velocity.y = 0.0f;
}
}
void EnDyExtra_Update(Actor* thisx, GlobalContext* globalCtx) {
EnDyExtra* this = (EnDyExtra*)thisx;
if (this->timer != 0) {
this->timer--;
}
this->actor.scale.x = this->scale.x;
this->actor.scale.y = this->scale.y;
this->actor.scale.z = this->scale.z;
Audio_PlayActorSound2(&this->actor, NA_SE_PL_SPIRAL_HEAL_BEAM - SFX_FLAG);
this->actionFunc(this, globalCtx);
Actor_MoveForward(&this->actor);
}
void EnDyExtra_Draw(Actor* thisx, GlobalContext* globalCtx) {
static Color_RGBA8 primColors[] = { { 255, 255, 170, 255 }, { 255, 255, 170, 255 } };
static Color_RGBA8 envColors[] = { { 255, 100, 255, 255 }, { 100, 255, 255, 255 } };
static u8 D_809FFC50[] = { 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02,
0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x02 };
EnDyExtra* this = (EnDyExtra*)thisx;
s32 pad;
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
Vtx* vertices = ResourceMgr_LoadVtxByName(SEGMENTED_TO_VIRTUAL(gGreatFairySpiralBeamVtx));
s32 i;
u8 unk[3];
unk[0] = 0.0f;
unk[1] = (s8)(this->unk_158 * 240.0f);
unk[2] = (s8)(this->unk_158 * 255.0f);
for (i = 0; i < 27; i++) {
if (D_809FFC50[i]) {
vertices[i].v.cn[3] = unk[D_809FFC50[i]];
}
}
OPEN_DISPS(gfxCtx);
func_80093D84(globalCtx->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, globalCtx->state.frames * 2, 0, 0x20, 0x40, 1,
globalCtx->state.frames, globalCtx->state.frames * -8, 0x10, 0x10));
gDPPipeSync(POLY_XLU_DISP++);
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, primColors[this->type].r, primColors[this->type].g,
primColors[this->type].b, 255);
gDPSetEnvColor(POLY_XLU_DISP++, envColors[this->type].r, envColors[this->type].g, envColors[this->type].b, 128);
gSPDisplayList(POLY_XLU_DISP++, gGreatFairySpiralBeamDL);
CLOSE_DISPS(gfxCtx);
}