mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-08-13 17:03:47 -04:00
a5df9dddf0
* First batch some overlay
* Almost all overlay
* effect & gamestate
* kaleido stuffs
* more overlay
* more left over from code folder
* remaining hardcoded line and file
* Open & Close _DISP __FILE__ & __LINE__ clean up
* Some if (1) {} remove
* LOG_xxxx __FILE__ , __LINE__ cleaned
* ASSERT macro __FILE__ __LINE__
* mtx without line/file in functions
* " if (1) {} " & "if (0) {}" and tab/white place
* LogUtils as macro
* GameState_, GameAlloc_, SystemArena_ & ZeldaArena_
* Revert "GameState_, GameAlloc_, SystemArena_ & ZeldaArena_"
This reverts commit 0d85caaf7e
.
* Like last commit but as macro
* Fix matrix not using macros
* use function not macro
* DebugArena_* functions
GameAlloc_MallocDebug
BgCheck_PosErrorCheck as macros
removed issues with ; in macro file
248 lines
7.4 KiB
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,
|
|
};
|