Shipwright/soh/src/overlays/actors/ovl_Demo_Ext/z_demo_ext.c

248 lines
7.4 KiB
C

/*
* File: z_demo_ext.c
* Overlay: Demo_Ext
* Description: Magic Vortex in Silver Gauntlets Cutscene
*/
#include "z_demo_ext.h"
#include "vt.h"
#include "objects/object_fhg/object_fhg.h"
#define FLAGS ACTOR_FLAG_4
typedef enum {
/* 0x00 */ EXT_WAIT,
/* 0x01 */ EXT_MAINTAIN,
/* 0x02 */ EXT_DISPELL
} DemoExtAction;
typedef enum {
/* 0x00 */ EXT_DRAW_NOTHING,
/* 0x01 */ EXT_DRAW_VORTEX
} DemoExtDrawMode;
void DemoExt_Init(Actor* thisx, GlobalContext* globalCtx);
void DemoExt_Destroy(Actor* thisx, GlobalContext* globalCtx);
void DemoExt_Update(Actor* thisx, GlobalContext* globalCtx);
void DemoExt_Draw(Actor* thisx, GlobalContext* globalCtx);
void DemoExt_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
void DemoExt_Init(Actor* thisx, GlobalContext* globalCtx) {
DemoExt* this = (DemoExt*)thisx;
this->scrollIncr[0] = 25;
this->scrollIncr[1] = 40;
this->scrollIncr[2] = 5;
this->scrollIncr[3] = 30;
this->primAlpha = kREG(28) + 255;
this->envAlpha = kREG(32) + 255;
this->scale.x = kREG(19) + 400.0f;
this->scale.y = kREG(20) + 100.0f;
this->scale.z = kREG(21) + 400.0f;
}
void DemoExt_PlayVortexSFX(DemoExt* this) {
if (this->alphaTimer <= (kREG(35) + 40.0f) - 15.0f) {
Audio_PlaySoundGeneral(NA_SE_EV_FANTOM_WARP_L - SFX_FLAG, &this->actor.projectedPos, 4, &D_801333E0,
&D_801333E0, &D_801333E8);
}
}
CsCmdActorAction* DemoExt_GetNpcAction(GlobalContext* globalCtx, s32 npcActionIndex) {
if (globalCtx->csCtx.state != CS_STATE_IDLE) {
return globalCtx->csCtx.npcActions[npcActionIndex];
}
return NULL;
}
void DemoExt_SetupWait(DemoExt* this) {
this->action = EXT_WAIT;
this->drawMode = EXT_DRAW_NOTHING;
}
void DemoExt_SetupMaintainVortex(DemoExt* this, GlobalContext* globalCtx) {
CsCmdActorAction* npcAction = DemoExt_GetNpcAction(globalCtx, 5);
if (npcAction != NULL) {
this->actor.world.pos.x = npcAction->startPos.x;
this->actor.world.pos.y = npcAction->startPos.y;
this->actor.world.pos.z = npcAction->startPos.z;
this->actor.world.rot.y = this->actor.shape.rot.y = npcAction->rot.y;
}
this->action = EXT_MAINTAIN;
this->drawMode = EXT_DRAW_VORTEX;
}
void DemoExt_SetupDispellVortex(DemoExt* this) {
this->action = EXT_DISPELL;
this->drawMode = EXT_DRAW_VORTEX;
}
void DemoExt_FinishClosing(DemoExt* this) {
this->alphaTimer += 1.0f;
if ((kREG(35) + 40.0f) <= this->alphaTimer) {
Actor_Kill(&this->actor);
}
}
void DemoExt_CheckCsMode(DemoExt* this, GlobalContext* globalCtx) {
CsCmdActorAction* csCmdNPCAction = DemoExt_GetNpcAction(globalCtx, 5);
s32 csAction;
s32 previousCsAction;
if (csCmdNPCAction != NULL) {
csAction = csCmdNPCAction->action;
previousCsAction = this->previousCsAction;
if (csAction != previousCsAction) {
switch (csAction) {
case 1:
DemoExt_SetupWait(this);
break;
case 2:
DemoExt_SetupMaintainVortex(this, globalCtx);
break;
case 3:
DemoExt_SetupDispellVortex(this);
break;
default:
// "Demo_Ext_Check_DemoMode: there is no such action!"
osSyncPrintf("Demo_Ext_Check_DemoMode:そんな動作は無い!!!!!!!!\n");
break;
}
this->previousCsAction = csAction;
}
}
}
void DemoExt_SetScrollAndRotation(DemoExt* this) {
s16* scrollIncr = this->scrollIncr;
s16* curScroll = this->curScroll;
s32 i;
for (i = 3; i != 0; i--) {
curScroll[i] += scrollIncr[i];
}
this->rotationPitch += (s16)(kREG(34) + 1000);
}
void DemoExt_SetColorsAndScales(DemoExt* this) {
Vec3f* scale = &this->scale;
f32 shrinkFactor;
shrinkFactor = ((kREG(35) + 40.0f) - this->alphaTimer) / (kREG(35) + 40.0f);
if (shrinkFactor < 0.0f) {
shrinkFactor = 0.0f;
}
this->primAlpha = (u32)(kREG(28) + 255) * shrinkFactor;
this->envAlpha = (u32)(kREG(32) + 255) * shrinkFactor;
scale->x = (kREG(19) + 400.0f) * shrinkFactor;
scale->y = (kREG(20) + 100.0f) * shrinkFactor;
scale->z = (kREG(21) + 400.0f) * shrinkFactor;
}
void DemoExt_Wait(DemoExt* this, GlobalContext* globalCtx) {
DemoExt_CheckCsMode(this, globalCtx);
}
void DemoExt_MaintainVortex(DemoExt* this, GlobalContext* globalCtx) {
DemoExt_PlayVortexSFX(this);
DemoExt_SetScrollAndRotation(this);
DemoExt_CheckCsMode(this, globalCtx);
}
void DemoExt_DispellVortex(DemoExt* this, GlobalContext* globalCtx) {
DemoExt_PlayVortexSFX(this);
DemoExt_SetScrollAndRotation(this);
DemoExt_SetColorsAndScales(this);
DemoExt_FinishClosing(this);
}
static DemoExtActionFunc sActionFuncs[] = {
DemoExt_Wait,
DemoExt_MaintainVortex,
DemoExt_DispellVortex,
};
void DemoExt_Update(Actor* thisx, GlobalContext* globalCtx) {
DemoExt* this = (DemoExt*)thisx;
if ((this->action < EXT_WAIT) || (this->action > EXT_DISPELL) || sActionFuncs[this->action] == NULL) {
// "Main mode is abnormal!"
osSyncPrintf(VT_FGCOL(RED) "メインモードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST);
} else {
sActionFuncs[this->action](this, globalCtx);
}
}
void DemoExt_DrawNothing(Actor* thisx, GlobalContext* globalCtx) {
}
void DemoExt_DrawVortex(Actor* thisx, GlobalContext* globalCtx) {
DemoExt* this = (DemoExt*)thisx;
Mtx* mtx;
GraphicsContext* gfxCtx;
s16* curScroll;
Vec3f* scale;
scale = &this->scale;
gfxCtx = globalCtx->state.gfxCtx;
mtx = Graph_Alloc(gfxCtx, sizeof(Mtx));
OPEN_DISPS(gfxCtx);
Matrix_Push();
Matrix_Scale(scale->x, scale->y, scale->z, MTXMODE_APPLY);
Matrix_RotateZYX((s16)(kREG(16) + 0x4000), this->rotationPitch, kREG(18), MTXMODE_APPLY);
Matrix_Translate(kREG(22), kREG(23), kREG(24), MTXMODE_APPLY);
MATRIX_TOMTX(mtx);
Matrix_Pop();
func_80093D84(gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, kREG(33) + 128, kREG(25) + 140, kREG(26) + 80, kREG(27) + 140, this->primAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, kREG(29) + 90, kREG(30) + 50, kREG(31) + 95, this->envAlpha);
curScroll = this->curScroll;
gSPSegment(
POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(gfxCtx, 0, curScroll[0], curScroll[1], 0x40, 0x40, 1, curScroll[2], curScroll[3], 0x40, 0x40));
gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gPhantomWarpDL);
gSPPopMatrix(POLY_XLU_DISP++, G_MTX_MODELVIEW);
CLOSE_DISPS(gfxCtx);
}
static DemoExtDrawFunc sDrawFuncs[] = {
DemoExt_DrawNothing,
DemoExt_DrawVortex,
};
void DemoExt_Draw(Actor* thisx, GlobalContext* globalCtx) {
DemoExt* this = (DemoExt*)thisx;
if ((this->drawMode < EXT_DRAW_NOTHING) || (this->drawMode > EXT_DRAW_VORTEX) ||
sDrawFuncs[this->drawMode] == NULL) {
// "Draw mode is abnormal!"
osSyncPrintf(VT_FGCOL(RED) "描画モードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST);
} else {
sDrawFuncs[this->drawMode](thisx, globalCtx);
}
}
const ActorInit Demo_Ext_InitVars = {
ACTOR_DEMO_EXT,
ACTORCAT_NPC,
FLAGS,
OBJECT_FHG,
sizeof(DemoExt),
(ActorFunc)DemoExt_Init,
(ActorFunc)DemoExt_Destroy,
(ActorFunc)DemoExt_Update,
(ActorFunc)DemoExt_Draw,
NULL,
};