Shipwright/soh/src/overlays/actors/ovl_Bg_Toki_Hikari/z_bg_toki_hikari.c

186 lines
6.3 KiB
C

/*
* File: z_bg_toki_hikari.c
* Overlay: ovl_Toki_Hikari
* Description: Temple of Time Windows
*/
#include "z_bg_toki_hikari.h"
#include "objects/object_toki_objects/object_toki_objects.h"
#define FLAGS ACTOR_FLAG_5
void BgTokiHikari_Init(Actor* thisx, GlobalContext* globalCtx);
void BgTokiHikari_Destroy(Actor* thisx, GlobalContext* globalCtx);
void BgTokiHikari_Update(Actor* thisx, GlobalContext* globalCtx);
void BgTokiHikari_Draw(Actor* thisx, GlobalContext* globalCtx);
void BgTokiHikari_DoNothing(BgTokiHikari* this, GlobalContext* globalCtx);
void func_808BA018(BgTokiHikari* this, GlobalContext* globalCtx);
void func_808BA204(BgTokiHikari* this, GlobalContext* globalCtx);
void func_808BA22C(BgTokiHikari* this, GlobalContext* globalCtx);
void func_808BA274(BgTokiHikari* this, GlobalContext* globalCtx);
void func_808BA2CC(BgTokiHikari* this, GlobalContext* globalCtx);
const ActorInit Bg_Toki_Hikari_InitVars = {
ACTOR_BG_TOKI_HIKARI,
ACTORCAT_BG,
FLAGS,
OBJECT_TOKI_OBJECTS,
sizeof(BgTokiHikari),
(ActorFunc)BgTokiHikari_Init,
(ActorFunc)BgTokiHikari_Destroy,
(ActorFunc)BgTokiHikari_Update,
(ActorFunc)BgTokiHikari_Draw,
NULL,
};
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 1000, ICHAIN_STOP),
};
void BgTokiHikari_Init(Actor* thisx, GlobalContext* globalCtx) {
BgTokiHikari* this = (BgTokiHikari*)thisx;
switch (this->actor.params) {
case 0:
Actor_ProcessInitChain(&this->actor, sInitChain);
this->actionFunc = BgTokiHikari_DoNothing;
break;
case 1:
if (!(gSaveContext.eventChkInf[4] & 0x800)) {
this->actionFunc = func_808BA204;
this->unk_14C = 0.0f;
} else {
Actor_Kill(&this->actor);
}
break;
}
}
void BgTokiHikari_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
void BgTokiHikari_DoNothing(BgTokiHikari* this, GlobalContext* globalCtx) {
}
void BgTokiHikari_Update(Actor* thisx, GlobalContext* globalCtx) {
BgTokiHikari* this = (BgTokiHikari*)thisx;
this->actionFunc(this, globalCtx);
}
void BgTokiHikari_Draw(Actor* thisx, GlobalContext* globalCtx) {
BgTokiHikari* this = (BgTokiHikari*)thisx;
switch (this->actor.params) {
case 0:
func_808BA018(this, globalCtx);
break;
case 1:
func_808BA2CC(this, globalCtx);
break;
}
}
void func_808BA018(BgTokiHikari* this, GlobalContext* globalCtx) {
s32 pad;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_80093D18(globalCtx->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (LINK_IS_ADULT) {
gSPDisplayList(POLY_OPA_DISP++, object_toki_objects_DL_008190);
} else {
gSPDisplayList(POLY_OPA_DISP++, object_toki_objects_DL_007E20);
func_80093D84(globalCtx->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 8,
Gfx_TexScroll(globalCtx->state.gfxCtx, 0, globalCtx->gameplayFrames % 128, 64, 32));
gSPSegment(POLY_XLU_DISP++, 9,
Gfx_TexScroll(globalCtx->state.gfxCtx, 0, globalCtx->gameplayFrames % 128, 64, 32));
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_toki_objects_DL_007EE0);
}
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
void func_808BA204(BgTokiHikari* this, GlobalContext* globalCtx) {
if (globalCtx->roomCtx.unk_74[1] != 0) {
this->actionFunc = func_808BA22C;
}
}
void func_808BA22C(BgTokiHikari* this, GlobalContext* globalCtx) {
if (this->unk_14C < 1.0f) {
this->unk_14C += 0.05f;
} else {
this->unk_14C = 1.0f;
this->actionFunc = func_808BA274;
}
}
void func_808BA274(BgTokiHikari* this, GlobalContext* globalCtx) {
if (this->unk_14C > 0.2f) {
this->unk_14C -= 0.025f;
} else {
this->unk_14C = 0.0f;
Actor_Kill(&this->actor);
}
}
void func_808BA2CC(BgTokiHikari* this, GlobalContext* globalCtx) {
s32 pad[2];
OPEN_DISPS(globalCtx->state.gfxCtx);
Matrix_Translate(0.0f, 276.0f, 1122.0f, MTXMODE_NEW);
Matrix_Scale(0.32f, 0.32f, this->unk_14C * 7.0f, MTXMODE_APPLY);
Matrix_RotateZ(M_PI, MTXMODE_APPLY);
func_80093D18(globalCtx->state.gfxCtx);
Matrix_Push();
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, this->unk_14C * 255.0f, (u8)(155.0f * this->unk_14C) + 100,
this->unk_14C * 255.0f, this->unk_14C * 255.0f);
gDPSetEnvColor(POLY_XLU_DISP++, (u8)(this->unk_14C * 155.0f) + 100, (u8)(255.0f * this->unk_14C), 0, 128);
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, -2 * (globalCtx->gameplayFrames & 0x7F), 0, 0x20, 0x40, 1,
(globalCtx->gameplayFrames & 0x7F) * 4, 0, 0x20, 0x40));
gSPDisplayList(POLY_XLU_DISP++, object_toki_objects_DL_000880);
Matrix_Pop();
Matrix_Push();
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)(this->unk_14C * 200.0f));
gDPSetEnvColor(POLY_XLU_DISP++, (u8)(this->unk_14C * 255.0f), (u8)(this->unk_14C * 255.0f),
(u8)(this->unk_14C * 255.0f), (u8)(200.0f * this->unk_14C));
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_toki_objects_DL_0009C0);
Matrix_Pop();
Matrix_Push();
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)(this->unk_14C * 200.0f));
gDPSetEnvColor(POLY_XLU_DISP++, (u8)(this->unk_14C * 255.0f), (u8)(this->unk_14C * 255.0f),
(u8)(this->unk_14C * 255.0f), (u8)(200.0f * this->unk_14C));
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayListOffset(POLY_XLU_DISP++, object_toki_objects_DL_0009C0, 10);
Matrix_Pop();
CLOSE_DISPS(globalCtx->state.gfxCtx);
}