Files
ss/src/d/d_sc_title.cpp
T
2025-08-18 13:36:47 +02:00

215 lines
5.8 KiB
C++

#include "d/d_sc_title.h"
#include "common.h"
#include "d/d_dvd_unk.h"
#include "d/d_heap.h"
#include "d/d_message.h"
#include "d/d_pad.h"
#include "d/d_reset.h"
#include "d/d_sc_game.h"
#include "d/d_sys.h"
#include "f/f_base.h"
#include "f/f_profile_name.h"
#include "m/m_color.h"
#include "m/m_dvd.h"
#include "s/s_State.hpp"
#include "sized_string.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
#include "toBeSorted/file_manager.h"
#include "toBeSorted/music_mgrs.h"
#include "toBeSorted/save_related.h"
#include "toBeSorted/unk_save_time.h"
SPECIAL_BASE_PROFILE(TITLE, dScTitle_c, fProfile::TITLE, 0, 0);
dScTitle_c *dScTitle_c::sInstance;
bool dScTitle_c::sPreventEmptyFilesTitle;
extern "C" {
u8 lbl_80575785;
u8 lbl_80575786;
u8 lbl_80575787;
}
static u16 sModulesToLoad[] = {
// ??? not sure what these correspond to
0x229, 0x2B0, 0x2B6, 0x2AF, 0x2B7,
};
static const char *sLayoutArcsToLoad[] = {
"Title2D",
};
STATE_VIRTUAL_DEFINE(dScTitle_c, Stanby);
STATE_VIRTUAL_DEFINE(dScTitle_c, Action);
extern "C" void *lbl_805750D8;
extern "C" void fn_80052D50(void *);
dScTitle_c::dScTitle_c() {
sInstance = this;
mRelCtrl.set(sModulesToLoad, ARRAY_LENGTH(sModulesToLoad));
mLayoutCtrl.set(sLayoutArcsToLoad, ARRAY_LENGTH(sLayoutArcsToLoad));
SaveTimeRelated::GetInstance()->fn_801907F0();
if (checkAllSaveFilesEmpty() == true) {
actuallyTriggerEntrance("F000", 0, 26, 55, 0, 0, 0, 15, -1);
} else {
actuallyTriggerEntrance("F000", 0, 28, 48, 0, 0, 0, 15, -1);
}
FileManager::GetInstance()->clearTempFileData();
FileManager::GetInstance()->initFile(1);
dDvdUnk::FontUnk::GetInstance()->fn_80052D50();
lbl_80575787 = 0;
field_0x2AC = 0;
}
dScTitle_c::~dScTitle_c() {
sInstance = nullptr;
}
extern "C" u32 TITLE_SCREEN_CHANGE;
static const char *const sFileSelect = "FileSelect";
static const char *const sSkb = "SoftwareKeyboard";
int dScTitle_c::create() {
int ret = dScGame_c::create();
if (ret == SUCCEEDED && dReset::Manage_c::GetInstance()->isSoftReset()) {
if (field_0x2AC == 0) {
dReset::Manage_c::GetInstance()->FadeOutRequest(false);
if (checkAllSaveFilesEmpty() != true) {
TITLE_SCREEN_CHANGE = 0;
}
field_0x2AC = 1;
ret = NOT_READY;
} else {
dReset::Manage_c::GetInstance()->FadeOutRequest(true);
}
}
if (ret == SUCCEEDED) {
dSys_c::setFrameRate(2);
dSys_c::setClearColor(mColor(0x00000000));
dPad::ex_c::setAutoSleepTime();
dPad::ex_c::fn_80058C90(0);
SaveRelated::create();
field_0x2AD = 0;
LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(sFileSelect, nullptr);
LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(sSkb, nullptr);
mDvd_toMainRam_normal_c::create2(&mpSkbArc, "/SKB/sofkeybd.arc", 0, dHeap::work2Heap.heap);
SizedString<128> fntPath;
fntPath.sprintf("/US/Font/%s/%s", dMessage_c::getLanguageIdentifier(), "normal_02.brfnt");
mDvd_toMainRam_normal_c::create2(&mpSkbFont, fntPath, 0, dHeap::work2Heap.heap);
BGM_MGR->fn_8035E310();
}
return ret;
}
int dScTitle_c::execute() {
mFader.calc();
mStateMgr.executeState();
return SUCCEEDED;
}
int dScTitle_c::doDelete() {
int result;
result = LayoutArcManager::GetInstance()->ensureLoaded2(sFileSelect);
if (result != D_ARC_RESULT_ERROR_NOT_FOUND) {
if (result != D_ARC_RESULT_OK) {
return NOT_READY;
}
LayoutArcManager::GetInstance()->decrement(sFileSelect);
}
result = LayoutArcManager::GetInstance()->ensureLoaded2(sSkb);
if (result != D_ARC_RESULT_ERROR_NOT_FOUND) {
if (result != D_ARC_RESULT_OK) {
return NOT_READY;
}
LayoutArcManager::GetInstance()->decrement(sSkb);
}
// TODO here's the other half of the ::destroy fakematch...
if (mpSkbArc->isDone()) {
mDvd_command_c::destroy((mDvd_command_c **)&mpSkbArc);
} else {
return NOT_READY;
}
if (mpSkbFont->isDone()) {
mDvd_command_c::destroy((mDvd_command_c **)&mpSkbFont);
} else {
return NOT_READY;
}
dScGame_c::doDelete();
SaveRelated::remove();
return SUCCEEDED;
}
int dScTitle_c::draw() {
dScGame_c::draw();
return SUCCEEDED;
}
extern "C" u32 TITLE_SCREEN_CHANGE;
void dScTitle_c::loadTitleScreen(u32 params) {
FileManager::GetInstance()->updateEmptyFiles();
if (checkAllSaveFilesEmpty() == true && params != 1) {
params = 2;
}
TITLE_SCREEN_CHANGE = params;
setRootActor(fProfile::TITLE, params, 0, 0);
if (checkAllSaveFilesEmpty() == true) {
actuallyTriggerEntrance("F000", 0, 26, 55, 0, 0, 0, 15, -1);
} else {
actuallyTriggerEntrance("F000", 0, 28, 48, 0, 0, 0, 15, -1);
}
fn_80362150(ENEMY_SOUND_MGR, 30);
}
void dScTitle_c::setSomethingSkbRelated() {
if (sInstance != nullptr) {
sInstance->field_0x2AD = 1;
}
}
void dScTitle_c::initializeState_Stanby() {
dScGame_c::initializeState_Stanby();
}
void dScTitle_c::executeState_Stanby() {
dScGame_c::executeState_Stanby();
}
void dScTitle_c::finalizeState_Stanby() {
dScGame_c::finalizeState_Stanby();
}
void dScTitle_c::initializeState_Action() {
dScGame_c::initializeState_Action();
}
void dScTitle_c::executeState_Action() {
dScGame_c::executeState_Action();
}
void dScTitle_c::finalizeState_Action() {
dScGame_c::finalizeState_Action();
}
bool dScTitle_c::checkAllSaveFilesEmpty() {
FileManager *mgr = FileManager::GetInstance();
bool allEmpty = true;
for (int i = 0; i < 3; i++) {
if (!mgr->isFileEmpty(i)) {
allEmpty = false;
break;
}
}
if (!sPreventEmptyFilesTitle && allEmpty == true) {
return true;
}
return false;
}