oot/src/overlays/gamestates/ovl_title/z_title.c

246 lines
7.2 KiB
C

/*
* File: z_title.c
* Overlay: ovl_title
* Description: Displays the Nintendo Logo
*/
#include "global.h"
#include "alloca.h"
#include "versions.h"
#if PLATFORM_N64
#include "n64dd.h"
#endif
#include "assets/textures/nintendo_rogo_static/nintendo_rogo_static.h"
// TODO
void func_800014E8_unknown(void);
s32 func_801C8090_unknown(void);
void func_801C7BC4_unknown(void);
s32 func_801C7ED0_unknown(void);
#if OOT_DEBUG
void ConsoleLogo_PrintBuildInfo(Gfx** gfxP) {
Gfx* gfx;
GfxPrint* printer;
gfx = *gfxP;
gfx = Gfx_SetupDL_28(gfx);
printer = alloca(sizeof(GfxPrint));
GfxPrint_Init(printer);
GfxPrint_Open(printer, gfx);
GfxPrint_SetColor(printer, 255, 155, 255, 255);
GfxPrint_SetPos(printer, 9, 21);
GfxPrint_Printf(printer, "NOT MARIO CLUB VERSION");
GfxPrint_SetColor(printer, 255, 255, 255, 255);
GfxPrint_SetPos(printer, 7, 23);
GfxPrint_Printf(printer, "[Creator:%s]", gBuildTeam);
GfxPrint_SetPos(printer, 7, 24);
GfxPrint_Printf(printer, "[Date:%s]", gBuildDate);
gfx = GfxPrint_Close(printer);
GfxPrint_Destroy(printer);
*gfxP = gfx;
}
#endif
void ConsoleLogo_Calc(ConsoleLogoState* this) {
#if PLATFORM_N64
if ((this->coverAlpha == 0) && (this->visibleDuration != 0)) {
this->unk_1D4--;
this->visibleDuration--;
if (this->unk_1D4 == 0) {
this->unk_1D4 = 400;
}
} else {
this->coverAlpha += this->addAlpha;
if (this->coverAlpha <= 0) {
this->coverAlpha = 0;
this->addAlpha = 3;
} else if (this->coverAlpha >= 255) {
this->coverAlpha = 255;
this->exit = true;
}
}
this->uls = this->ult & 0x7F;
this->ult++;
#else
this->exit = true;
#endif
}
void ConsoleLogo_SetupView(ConsoleLogoState* this, f32 x, f32 y, f32 z) {
View* view = &this->view;
Vec3f eye;
Vec3f lookAt;
Vec3f up;
eye.x = x;
eye.y = y;
eye.z = z;
up.x = up.z = 0.0f;
lookAt.x = lookAt.y = lookAt.z = 0.0f;
up.y = 1.0f;
View_SetPerspective(view, 30.0f, 10.0f, 12800.0f);
View_LookAt(view, &eye, &lookAt, &up);
View_Apply(view, VIEW_ALL);
}
void ConsoleLogo_Draw(ConsoleLogoState* this) {
static s16 sTitleRotY = 0;
static Lights1 sTitleLights = gdSPDefLights1(100, 100, 100, 255, 255, 255, 69, 69, 69);
u16 y;
u16 idx;
s32 pad1;
Vec3f v3;
Vec3f v1;
Vec3f v2;
s32 pad2[2];
OPEN_DISPS(this->state.gfxCtx, "../z_title.c", 395);
v3.x = 69;
v3.y = 69;
v3.z = 69;
v2.x = -4949.148;
v2.y = 4002.5417;
v1.x = 0;
v1.y = 0;
v1.z = 0;
v2.z = 1119.0837;
func_8002EABC(&v1, &v2, &v3, this->state.gfxCtx);
gSPSetLights1(POLY_OPA_DISP++, sTitleLights);
ConsoleLogo_SetupView(this, 0, 150.0, 300.0);
Gfx_SetupDL_25Opa(this->state.gfxCtx);
Matrix_Translate(-53.0, -5.0, 0, MTXMODE_NEW);
Matrix_Scale(1.0, 1.0, 1.0, MTXMODE_APPLY);
Matrix_RotateZYX(0, sTitleRotY, 0, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEW(this->state.gfxCtx, "../z_title.c", 424), G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, gNintendo64LogoDL);
Gfx_SetupDL_39Opa(this->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_CLD_SURF2);
gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, PRIMITIVE, ENV_ALPHA, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT,
COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 170, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 128);
gDPLoadMultiBlock(POLY_OPA_DISP++, nintendo_rogo_static_Tex_001800, 0x100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, 2, 11);
for (idx = 0, y = 94; idx < 16; idx++, y += 2) {
gDPLoadTextureBlock(POLY_OPA_DISP++, &((u8*)nintendo_rogo_static_Tex_000000)[0x180 * idx], G_IM_FMT_I,
G_IM_SIZ_8b, 192, 2, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gDPSetTileSize(POLY_OPA_DISP++, 1, this->uls, (this->ult & 0x7F) - (idx << 2), 0, 0);
gSPTextureRectangle(POLY_OPA_DISP++, 97 << 2, y << 2, 289 << 2, (y + 2) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10,
1 << 10);
}
Environment_FillScreen(this->state.gfxCtx, 0, 0, 0, (s16)this->coverAlpha, FILL_SCREEN_XLU);
sTitleRotY += 300;
CLOSE_DISPS(this->state.gfxCtx, "../z_title.c", 483);
}
void ConsoleLogo_Main(GameState* thisx) {
ConsoleLogoState* this = (ConsoleLogoState*)thisx;
OPEN_DISPS(this->state.gfxCtx, "../z_title.c", 494);
gSPSegment(POLY_OPA_DISP++, 0, NULL);
gSPSegment(POLY_OPA_DISP++, 1, this->staticSegment);
Gfx_SetupFrame(this->state.gfxCtx, 0, 0, 0);
ConsoleLogo_Calc(this);
ConsoleLogo_Draw(this);
#if OOT_DEBUG
if (gIsCtrlr2Valid) {
Gfx* gfx = POLY_OPA_DISP;
ConsoleLogo_PrintBuildInfo(&gfx);
POLY_OPA_DISP = gfx;
}
#endif
if (this->exit) {
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.natureAmbienceId = 0xFF;
gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN;
this->state.running = false;
SET_NEXT_GAMESTATE(&this->state, TitleSetup_Init, TitleSetupState);
}
CLOSE_DISPS(this->state.gfxCtx, "../z_title.c", 541);
}
void ConsoleLogo_Destroy(GameState* thisx) {
ConsoleLogoState* this = (ConsoleLogoState*)thisx;
#if PLATFORM_N64
if (this->unk_1E0) {
if (func_801C8090_unknown() != 0) {
func_800D31A0();
}
func_801C7BC4_unknown();
}
#endif
Sram_InitSram(&this->state, &this->sramCtx);
#if PLATFORM_N64
func_800014E8_unknown();
#endif
}
void ConsoleLogo_Init(GameState* thisx) {
u32 size = (uintptr_t)_nintendo_rogo_staticSegmentRomEnd - (uintptr_t)_nintendo_rogo_staticSegmentRomStart;
ConsoleLogoState* this = (ConsoleLogoState*)thisx;
#if PLATFORM_N64
if ((B_80121AE0 != 0) && ((u8)B_80121AE1 != 0) && (B_80121AE2 == 0)) {
if (func_801C7ED0_unknown() != 0) {
func_800D31A0();
}
this->unk_1E0 = true;
} else {
this->unk_1E0 = false;
}
#endif
this->staticSegment = GAME_STATE_ALLOC(&this->state, size, "../z_title.c", 611);
PRINTF("z_title.c\n");
ASSERT(this->staticSegment != NULL, "this->staticSegment != NULL", "../z_title.c", 614);
DMA_REQUEST_SYNC(this->staticSegment, (uintptr_t)_nintendo_rogo_staticSegmentRomStart, size, "../z_title.c", 615);
R_UPDATE_RATE = 1;
Matrix_Init(&this->state);
View_Init(&this->view, this->state.gfxCtx);
this->state.main = ConsoleLogo_Main;
this->state.destroy = ConsoleLogo_Destroy;
this->exit = false;
#if OOT_VERSION < GC_US
if (!(gPadMgr.validCtrlrsMask & 1)) {
gSaveContext.fileNum = 0xFEDC;
} else {
gSaveContext.fileNum = 0xFF;
}
#else
gSaveContext.fileNum = 0xFF;
#endif
Sram_Alloc(&this->state, &this->sramCtx);
this->ult = 0;
this->unk_1D4 = 0x14;
this->coverAlpha = 255;
this->addAlpha = -3;
this->visibleDuration = 0x3C;
}