Files
tww/src/d/d_gameover.cpp
T
2025-05-31 23:53:05 -04:00

466 lines
14 KiB
C++

//
// Generated by dtk
// Translation Unit: d_gameover.cpp
//
#include "d/d_gameover.h"
#include "d/d_meter.h"
#include "d/d_procname.h"
#include "d/d_priority.h"
#include "m_Do/m_Do_graphic.h"
#include "m_Do/m_Do_mtx.h"
#include "m_Do/m_Do_Reset.h"
#include "JSystem/J2DGraph/J2DOrthoGraph.h"
/* 8018E1CC-8018E4B4 .text draw__24dDlst_Gameover_CAPTURE_cFv */
void dDlst_Gameover_CAPTURE_c::draw() {
GXTexObj texObj;
GXSetTexCopySrc(0, 0, 640, 480);
GXSetTexCopyDst(320, 240, GX_TF_RGB565, GX_TRUE);
GXCopyTex(mDoGph_gInf_c::getZbufferTex(), GX_FALSE);
GXPixModeSync();
GXInitTexObj(&texObj, mDoGph_gInf_c::getFrameBufferTex(), 320, 240, (GXTexFmt)mDoGph_gInf_c::getFrameBufferTimg()->format, GX_CLAMP, GX_CLAMP, GX_FALSE);
GXInitTexObjLOD(&texObj, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1);
GXLoadTexObj(&texObj, GX_TEXMAP0);
GXSetNumChans(0);
GXSetNumTexGens(1);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
GXSetNumTevStages(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_NONE, GX_BL_ZERO, GX_BL_ZERO, GX_LO_OR);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetFogRangeAdj(GX_FALSE, 0, NULL);
GXSetCullMode(GX_CULL_NONE);
GXSetDither(GX_TRUE);
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(cMtx_getIdentity(), GX_PNMTX0);
GXSetCurrentMtx(0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S8, 0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s8(0, 0, -5);
GXTexCoord2s8(0, 0);
GXPosition3s8(1, 0, -5);
GXTexCoord2s8(1, 0);
GXPosition3s8(1, 1, -5);
GXTexCoord2s8(1, 1);
GXPosition3s8(0, 1, -5);
GXTexCoord2s8(0, 1);
GXEnd();
}
/* 8018E4B4-8018E77C .text _create__11dGameover_cFv */
cPhs_State dGameover_c::_create() {
cPhs_State rt = dComIfG_resLoad(&mPhs, "Gover");
if (dMenu_flag() || (dComIfGp_isHeapLockFlag() != 0 && dComIfGp_isHeapLockFlag() != 4) || dComIfGp_getMesgStatus() != 0)
return cPhs_INIT_e;
if (rt == cPhs_COMPLEATE_e) {
dComIfGs_addDeathCount();
dRes_info_c* resInfo = dComIfG_getObjectResInfo("Gover");
JUT_ASSERT(VERSION_SELECT(0x9c, 0x9c, 0xa0, 0xa0), resInfo != NULL);
mpHeap = dComIfGp_getExpHeap2D();
dComIfGp_setHeapLockFlag(4);
JKRHeap* oldHeap = mDoExt_setCurrentHeap(mpHeap);
dgo_scrn_c = new dDlst_GameOverScrnDraw_c();
dgo_scrn_c->setScreen("gameover.blo", resInfo->getArchive());
dMs_c = new dMenu_save_c();
JUT_ASSERT(VERSION_SELECT(0xa7, 0xa7, 0xb6, 0xb6), dMs_c != NULL);
dMs_c->setUseType(2);
dMs_c->_create();
dgo_capture_c = new dDlst_Gameover_CAPTURE_c();
JUT_ASSERT(VERSION_SELECT(0xac, 0xac, 0xbb, 0xbb), dgo_capture_c != NULL);
mDoExt_setCurrentHeap(oldHeap);
} else {
return rt;
}
field_0x114 = 90;
field_0x116 = g_menuHIO.field_0xb6;
mAnimeStart = false;
return cPhs_COMPLEATE_e;
}
/* 8018E77C-8018E9D4 .text _execute__11dGameover_cFv */
BOOL dGameover_c::_execute() {
JKRHeap* oldHeap = mDoExt_setCurrentHeap(mpHeap);
if (mState == 3) {
if (dMs_c->_open()) {
mState = 4;
dComIfGs_setLife(12);
}
} else if (mState == 4) {
dMs_c->_move();
if (dMs_c->getSaveStatus() == 3)
mState = 5;
} else if (mState == 5) {
if (dMs_c->_close()) {
if (dMs_c->getEndStatus() == 0) {
dComIfGp_setGameoverStatus(3);
dMenu_flagSet(0);
mDoRst::onReset();
} else if (dMs_c->getEndStatus() == 1) {
dComIfGp_setGameoverStatus(2);
dMenu_flagSet(0);
}
dgo_scrn_c->stopEmitter1();
mState = 6;
}
} else if (mState != 6 && mAnimeStart) {
if (field_0x114 == 90) {
if (dgo_scrn_c->animeOpen() == 1) {
cXyz zero(0.0f, 0.0f, 0.0f);
dgo_scrn_c->setEmitter0(zero);
dgo_scrn_c->setEmitter1(zero);
field_0x114--;
}
} else if (field_0x114 > 0) {
field_0x114--;
if (field_0x114 == 0)
dgo_scrn_c->valueInit();
} else {
if (dgo_scrn_c->animeClose() == 1) {
dgo_scrn_c->stopEmitter0();
if (field_0x116-- <= 0) {
mState = 3;
dMenu_flagSet(1);
}
}
}
}
mDoExt_setCurrentHeap(oldHeap);
return TRUE;
}
/* 8018E9D4-8018EA58 .text _draw__11dGameover_cFv */
BOOL dGameover_c::_draw() {
if (dgo_capture_c != NULL && dMenu_flag())
dComIfGd_set2DOpa(dgo_capture_c);
dComIfGd_set2DOpa(dgo_scrn_c);
dMs_c->_draw2();
return TRUE;
}
/* 8018EA58-8018EB54 .text _delete__11dGameover_cFv */
BOOL dGameover_c::_delete() {
JKRHeap* oldHeap = mDoExt_setCurrentHeap(mpHeap);
dgo_scrn_c->deleteScreen();
delete dgo_scrn_c;
dMs_c->_delete();
delete dMs_c;
delete dgo_capture_c;
mpHeap->freeAll();
dComIfGp_offHeapLockFlag();
mDoExt_setCurrentHeap(oldHeap);
dComIfG_resDelete(&mPhs, "Gover");
return TRUE;
}
/* 8018EB54-8018EB68 .text deleteCheck__11dGameover_cFv */
BOOL dGameover_c::deleteCheck() {
return mState == 6;
}
#if VERSION <= VERSION_JPN
static const s16 dGover_tex_number = 8;
#else
static s16 dGover_tex_number = 8;
#endif
/* 8018EB68-8018EC9C .text setScreen__24dDlst_GameOverScrnDraw_cFPCcP10JKRArchive */
void dDlst_GameOverScrnDraw_c::setScreen(const char* filename, JKRArchive* arc) {
scrn = new J2DScreen();
scrn->set(filename, arc);
const static u32 labelt[] = {
'txg',
'txa',
'txm',
'txe1',
'txo',
'txv',
'txe2',
'txr',
};
for (s32 i = 0; i < dGover_tex_number; i++)
fopMsgM_setPaneData(&letter[i], scrn->search(labelt[i]));
fopMsgM_setPaneData(&blak, scrn->search('blak'));
blak.mInitAlpha = 0xFF;
}
/* 8018EC9C-8018ECD8 .text valueInit__24dDlst_GameOverScrnDraw_cFv */
void dDlst_GameOverScrnDraw_c::valueInit() {
field_0x32c = dGover_tex_number;
field_0x330 = 0;
for (s32 i = 0; i < dGover_tex_number; i++)
letter[i].mUserArea = 0;
}
/* 8018ECD8-8018EEC8 .text animeOpen__24dDlst_GameOverScrnDraw_cFv */
BOOL dDlst_GameOverScrnDraw_c::animeOpen() {
const static f32 x[8] = {
-175.0f, -130.0f, -80.0f, -30.0f,
32.0f, 75.0f, 120.0f, 160.0f
};
u8 var_r31 = 0;
s16 var_r30 = -1;
if (field_0x32c >= 0) {
if (field_0x330 != 0) {
field_0x330 -= 1;
} else {
s32 rand = cM_rndF(field_0x32c);
if (rand >= field_0x32c - 1) {
rand = field_0x32c - 1;
}
for (int i = 0; i < dGover_tex_number; i++) {
if (letter[i].mUserArea == 0) {
if (rand == 0) {
anime1(i);
var_r30 = i;
break;
} else {
rand -= 1;
}
}
}
field_0x32c -= 1;
field_0x330 = (field_0x32c * field_0x32c) / 5;
}
}
for (int i = 0; i < dGover_tex_number; i++) {
if (letter[i].mUserArea >= 0 && letter[i].mUserArea < 9) {
if (letter[i].mUserArea >= 1 && var_r30 != i) {
anime1(i);
if (letter[i].mUserArea == 5) {
cXyz temp(x[i], 50.0f, 0.0f);
dComIfGp_particle_set2Dfore(dPa_name::ID_COMMON_002E, &temp);
}
}
var_r31 = 1;
}
}
return var_r31 == 0 ? TRUE : FALSE;
}
/* 8018EEC8-8018F05C .text animeClose__24dDlst_GameOverScrnDraw_cFv */
BOOL dDlst_GameOverScrnDraw_c::animeClose() {
u8 var_r31 = 0;
s16 var_r30 = -1;
if (field_0x32c >= 0) {
if (field_0x330 != 0) {
field_0x330 = 0;
} else {
s32 rand = cM_rndF(field_0x32c);
if (rand >= field_0x32c - 1) {
rand = field_0x32c - 1;
}
for (int i = 0; i < dGover_tex_number; i++) {
if (letter[i].mUserArea == 0) {
if (rand == 0) {
anime2(i);
var_r30 = i;
break;
} else {
rand -= 1;
}
}
}
field_0x330 = (s32)cM_rndF(3.0f) + 1;
if (field_0x330 >= 3) {
field_0x330 = 3;
}
field_0x32c -= 1;
}
}
for (int i = 0; i < dGover_tex_number; i++) {
if (letter[i].mUserArea >= 0 && letter[i].mUserArea < 7) {
if (letter[i].mUserArea >= 1 && var_r30 != i) {
anime2(i);
}
var_r31 = 1;
}
}
return var_r31 == 0 ? TRUE : FALSE;
}
/* 8018F05C-8018F0CC .text setEmitter0__24dDlst_GameOverScrnDraw_cF4cXyz */
void dDlst_GameOverScrnDraw_c::setEmitter0(cXyz pos) {
mpEmitter0 = dComIfGp_particle_set2Dfore(dPa_name::ID_COMMON_002F, &pos);
}
/* 8018F0CC-8018F13C .text setEmitter1__24dDlst_GameOverScrnDraw_cF4cXyz */
void dDlst_GameOverScrnDraw_c::setEmitter1(cXyz pos) {
mpEmitter1 = dComIfGp_particle_set2DmenuFore(dPa_name::ID_COMMON_0030, &pos);
}
/* 8018F13C-8018F334 .text anime1__24dDlst_GameOverScrnDraw_cFi */
BOOL dDlst_GameOverScrnDraw_c::anime1(int idx) {
BOOL ret = FALSE;
if (letter[idx].mUserArea < 5) {
if (letter[idx].mUserArea == 0)
fopMsgM_setInitAlpha(&letter[idx]);
letter[idx].mUserArea++;
f32 y = (1.0f - acc(5, letter[idx].mUserArea, 0)) * -288.0f;
fopMsgM_paneTrans(&letter[idx], 0.0f, y);
} else if (letter[idx].mUserArea < 7) {
letter[idx].mUserArea++;
f32 y = acc(2, letter[idx].mUserArea - 5, 0) * -9.0f;
fopMsgM_paneTrans(&letter[idx], 0.0f, y);
} else if (letter[idx].mUserArea < 9) {
letter[idx].mUserArea++;
f32 y = (1.0f - acc(2, letter[idx].mUserArea - 7, 0)) * -9.0f;
fopMsgM_paneTrans(&letter[idx], 0.0f, y);
if (letter[idx].mUserArea == 9)
mDoAud_seStart(JA_SE_EXIT_GAME_OVER);
}
if (letter[idx].mUserArea == 9)
ret = TRUE;
return ret;
}
/* 8018F334-8018F4A8 .text anime2__24dDlst_GameOverScrnDraw_cFi */
BOOL dDlst_GameOverScrnDraw_c::anime2(int idx) {
static const s16 rot[6] = {
40, 30, 20,
-20, -30, -40
};
BOOL ret = FALSE;
if (letter[idx].mUserArea < 7) {
if (letter[idx].mUserArea == 0) {
s32 rand = cM_rndF(6.0f);
if (rand > 5) {
rand = 5;
}
mRotate[idx] = rot[rand];
}
letter[idx].mUserArea += 1;
f32 y = letter[idx].mUserArea / 7.0f;
f32 y2 = (f32)letter[idx].mUserArea * (f32)letter[idx].mUserArea / 49.0f;
setRotate(&letter[idx], (f32)mRotate[idx] * (1.0f - y));
fopMsgM_paneTrans(&letter[idx], 0.0f, y2 * 244.0f);
}
if (letter[idx].mUserArea == 7) {
fopMsgM_setNowAlphaZero(&letter[idx]);
ret = TRUE;
}
return ret;
}
/* 8018F4A8-8018F548 .text setRotate__24dDlst_GameOverScrnDraw_cFP18fopMsgM_pane_classf */
void dDlst_GameOverScrnDraw_c::setRotate(fopMsgM_pane_class* pane, f32 angle) {
pane->pane->rotate((s32)(pane->mSize.x / 2), (s32)(pane->mSize.y / 2), ROTATE_Z, angle);
}
/* 8018F548-8018F5EC .text draw__24dDlst_GameOverScrnDraw_cFv */
void dDlst_GameOverScrnDraw_c::draw() {
for (s32 i = 0; i < dGover_tex_number; i++)
fopMsgM_setAlpha(&letter[i]);
fopMsgM_setNowAlpha(&blak, mAlpha);
fopMsgM_setAlpha(&blak);
J2DOrthoGraph* port = dComIfGp_getCurrentGrafPort();
port->setPort();
scrn->draw(0.0f, 0.0f, port);
}
/* 8018F5EC-8018F60C .text dGameover_Draw__FP11dGameover_c */
static BOOL dGameover_Draw(dGameover_c* i_this) {
return i_this->_draw();
}
/* 8018F60C-8018F62C .text dGameover_Execute__FP11dGameover_c */
static BOOL dGameover_Execute(dGameover_c* i_this) {
return i_this->_execute();
}
/* 8018F62C-8018F634 .text dGameover_IsDelete__FP11dGameover_c */
static BOOL dGameover_IsDelete(dGameover_c* i_this) {
return TRUE;
}
/* 8018F634-8018F654 .text dGameover_Delete__FP11dGameover_c */
static BOOL dGameover_Delete(dGameover_c* i_this) {
return i_this->_delete();
}
/* 8018F654-8018F674 .text dGameover_Create__FP9msg_class */
static cPhs_State dGameover_Create(msg_class* i_this) {
return ((dGameover_c*)i_this)->_create();
}
msg_method_class l_dGameover_Method = {
(process_method_func)dGameover_Create,
(process_method_func)dGameover_Delete,
(process_method_func)dGameover_Execute,
(process_method_func)dGameover_IsDelete,
(process_method_func)dGameover_Draw,
};
msg_process_profile_definition g_profile_GAMEOVER = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 12,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_GAMEOVER,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(dGameover_c),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopMsg_Method,
/* Priority */ PRIO_GAMEOVER,
/* Msg SubMtd */ &l_dGameover_Method,
};