mirror of
https://github.com/zeldaret/ss
synced 2026-08-14 12:33:43 -04:00
d_scene OK (#114)
* d_scene OK * d_s_boot * Rename -> PROFILE_MAX * Some more ---------
This commit is contained in:
+544
-12
@@ -1,24 +1,556 @@
|
||||
#include "d/d_s_boot.h"
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(BOOT, dScBoot_c, fProfile::BOOT, 0x2A7, 0, 1174405120);
|
||||
#include "common.h"
|
||||
#include "d/d_base.h"
|
||||
#include "d/d_dylink.h"
|
||||
#include "d/d_font_manager.h"
|
||||
#include "d/d_heap.h"
|
||||
#include "d/d_scene.h"
|
||||
#include "d/d_sys.h"
|
||||
#include "d/lyt/d_lyt_battery.h"
|
||||
#include "f/f_base.h"
|
||||
#include "f/f_profile.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m2d.h"
|
||||
#include "m/m_dvd.h"
|
||||
#include "m/m_fader_base.h"
|
||||
#include "m/m_heap.h"
|
||||
#include "m/m_pad.h"
|
||||
#include "nw4r/ut/ut_ResFont.h"
|
||||
#include "rvl/TPL/TPL.h"
|
||||
#include "s/s_FPhase.h"
|
||||
#include "sized_string.h"
|
||||
#include "toBeSorted/arc_managers/layout_arc_manager.h"
|
||||
#include "toBeSorted/arc_managers/oarc_manager.h"
|
||||
#include "toBeSorted/hbm.h"
|
||||
#include "toBeSorted/reload_color_fader.h"
|
||||
|
||||
sFPhase<dScBoot_c>::phaseCallback dScBoot_c::sCallbacks[] = {&dScBoot_c::cb1, &dScBoot_c::cb2, &dScBoot_c::cb3,
|
||||
&dScBoot_c::cb4, &dScBoot_c::cb5, &dScBoot_c::cb9,
|
||||
&dScBoot_c::cb6, &dScBoot_c::cb7, &dScBoot_c::cb8,
|
||||
nullptr};
|
||||
|
||||
// 40 seconds
|
||||
#define SC_BOOT_STRAP_MAX_DURATION 1200
|
||||
// 2 seconds
|
||||
#define SC_BOOT_STRAP_MIN_DURATION 60
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::executeLoadPhase() {
|
||||
return mPhases.step();
|
||||
}
|
||||
|
||||
extern "C" u8 getUsedLanguageNTSCNum();
|
||||
extern "C" const char *getEventFlowFileNameByIndex(int, int);
|
||||
extern "C" const char *getUsedLanguageString();
|
||||
extern "C" u8 fn_80054F30();
|
||||
extern "C" nw4r::ut::ResFont *lbl_805750D8;
|
||||
extern "C" u8 *SOME_GFX_THING;
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb1() {
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("cursor", mHeap::g_archiveHeap);
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("CursorStick", mHeap::g_archiveHeap);
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("System2D", nullptr);
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("saveBannerU", nullptr);
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
SizedString<128> str;
|
||||
str.sprintf("%s/%s", getUsedLanguageString(), getEventFlowFileNameByIndex(i, 1));
|
||||
OarcManager::sInstance->loadObjectArcFromDisk(str, mHeap::g_archiveHeap);
|
||||
}
|
||||
OarcManager::sInstance->loadObjectArcFromDisk("System", mHeap::g_archiveHeap);
|
||||
return sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb2() {
|
||||
if (OarcManager::sInstance->ensureAllEntriesLoaded()) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
}
|
||||
if (LayoutArcManager::sInstance->ensureAllEntriesLoaded()) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
}
|
||||
|
||||
TPLPalette *tpl =
|
||||
static_cast<TPLPalette *>(LayoutArcManager::sInstance->getData("saveBannerU", "tmp/saveBanner.tpl"));
|
||||
TPLBind(tpl);
|
||||
|
||||
return sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb3() {
|
||||
return !dFontMng_c::create() ? sFPhaseBase::PHASE_RETRY : sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb4() {
|
||||
if (!fn_801967D0(getHBM())) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
}
|
||||
dHeap::HBMHeap.heap->disableAllocation();
|
||||
return sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
|
||||
u32 dScBoot_c::dvdCallback(void *data) {}
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb5() {
|
||||
if (mpDvdCallback == nullptr) {
|
||||
mpDvdCallback = mDvd_callback_c::createOrFail(&dvdCallback, nullptr);
|
||||
if (mpDvdCallback == nullptr) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
}
|
||||
}
|
||||
if (mpDvdCallback->mStatus == 0) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
} else {
|
||||
mpDvdCallback->do_delete();
|
||||
return sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
}
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb6() {
|
||||
dDyl::initRelsArc();
|
||||
OarcManager::sInstance->loadObjectArcFromDisk("JpaCommon", dHeap::workExHeap.heap);
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("Main2D", nullptr);
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("DoButton", nullptr);
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("MenuHelp", nullptr);
|
||||
u8 result = fn_80054F30();
|
||||
s32 gameOverType;
|
||||
if (result == 3) {
|
||||
gameOverType = 1;
|
||||
} else {
|
||||
gameOverType = result == 4 ? 2 : 0;
|
||||
}
|
||||
|
||||
if (gameOverType == 0) {
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("gameOver_01", nullptr);
|
||||
} else if (gameOverType == 1) {
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("gameOver_02", nullptr);
|
||||
} else {
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk("gameOver_03", nullptr);
|
||||
}
|
||||
|
||||
if (OarcManager::sInstance->checkIfObjectArcExistsOnDisk("ObjectPack")) {
|
||||
OarcManager::sInstance->loadObjectArcFromDisk("ObjectPack", mHeap::g_archiveHeap);
|
||||
} else {
|
||||
static const char *OBJECT_PACK_OARCS[] = {
|
||||
"Camera",
|
||||
"Common",
|
||||
"Alink",
|
||||
"PLCommonAnime",
|
||||
"PLCommonAnmSnd",
|
||||
"PLCompItem",
|
||||
"SwordGirl",
|
||||
"GrassA",
|
||||
"GrassB",
|
||||
"GrassC",
|
||||
"GrassD",
|
||||
"GrassE",
|
||||
"FlowerA00",
|
||||
"FlowerB00",
|
||||
"FlowerB01",
|
||||
"UI_Data",
|
||||
"GetBomb",
|
||||
"Zelda",
|
||||
"Zelda_face",
|
||||
"Zelda_handL",
|
||||
"Zelda_handR",
|
||||
"Zelda_hair",
|
||||
"Rival",
|
||||
"Bird_Link",
|
||||
"FX_WaterColumn",
|
||||
"GetBottleWater",
|
||||
"PutRupee",
|
||||
"GetRupee",
|
||||
"PutHeart",
|
||||
"GetHeart",
|
||||
"PutArrow",
|
||||
"GetArrow",
|
||||
"PutBombSet",
|
||||
"GetBombSet",
|
||||
"PutSeed",
|
||||
"GetSeed",
|
||||
"GetSozaiE",
|
||||
"GetSozaiI",
|
||||
"GetSozaiJ",
|
||||
"GetSozaiM",
|
||||
"PutFairy",
|
||||
"GetFairy",
|
||||
"GetBottleFairy",
|
||||
"TBoxNormalT",
|
||||
"TBoxSmallT",
|
||||
"TBoxBossT",
|
||||
"GoddessTBox",
|
||||
"FX_TBoxOpen",
|
||||
"InsectButterfly",
|
||||
"GetInsectButterfly",
|
||||
"FlowerHeart",
|
||||
"Tubo",
|
||||
"GetGenki",
|
||||
"PutHeartKakera",
|
||||
"GetHeartKakera",
|
||||
"GrassOcta",
|
||||
"Kanban",
|
||||
"KanbanTree",
|
||||
"SaveObjectA",
|
||||
"SaveObjectB",
|
||||
"SaveObjectC",
|
||||
"KibakoHang",
|
||||
"ShotMark",
|
||||
"GetBottleEmpty",
|
||||
"GoddessCube",
|
||||
"GetGuts",
|
||||
"PutGuts",
|
||||
"RockCarryMiddle",
|
||||
"RockCarrySmall",
|
||||
"RockRollB",
|
||||
"BRockWall00",
|
||||
"BRockWall",
|
||||
"BRockHole00",
|
||||
"Bee",
|
||||
"GetInsectBee",
|
||||
"MogumaMud",
|
||||
"FlowerBomb",
|
||||
"FenceBoko",
|
||||
"ShutterFencedAnim",
|
||||
"ShutterFenced00",
|
||||
"SwitchHit",
|
||||
"KanbanStone",
|
||||
"GetMap",
|
||||
"GetKeySmall",
|
||||
"PutKeySmall",
|
||||
"MoundShovel",
|
||||
"MudShovel",
|
||||
"HoleShovel",
|
||||
"WiiRemocon",
|
||||
"ShutterChain",
|
||||
"LockSmall",
|
||||
"GetBottleKinokoA",
|
||||
"GetBottleKinokoB",
|
||||
"DoorBoss",
|
||||
"SwitchWall",
|
||||
"Candle00",
|
||||
"SkyCmn",
|
||||
"Bc",
|
||||
};
|
||||
for (int i = 0; i < ARRAY_LENGTH(OBJECT_PACK_OARCS); i++) {
|
||||
OarcManager::sInstance->loadObjectArcFromDisk(OBJECT_PACK_OARCS[i], mHeap::g_archiveHeap);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO we think this is a ResFont but
|
||||
// the offset is larger than ResFont...
|
||||
((u8 *)lbl_805750D8)[0x2C] = 1;
|
||||
field_0x5DF = 1;
|
||||
return sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb7() {
|
||||
if (!dDyl::destroy()) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
}
|
||||
|
||||
static u16 profilesToLoad[] = {
|
||||
// ??? not sure what these correspond to
|
||||
0x278,
|
||||
0x279,
|
||||
0x1B0,
|
||||
0x1A9,
|
||||
};
|
||||
|
||||
bool allOk = true;
|
||||
for (int i = 0; i < ARRAY_LENGTH(profilesToLoad); i++) {
|
||||
if (!dDyl::isLinked(profilesToLoad[i]) && dDyl::tryLink(profilesToLoad[i]) != 1) {
|
||||
allOk = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!allOk) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
}
|
||||
|
||||
if (OarcManager::sInstance->ensureAllEntriesLoaded()) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
}
|
||||
|
||||
if (LayoutArcManager::sInstance->ensureAllEntriesLoaded()) {
|
||||
return sFPhaseBase::PHASE_RETRY;
|
||||
}
|
||||
|
||||
// TODO JParticle monkaS
|
||||
OarcManager::sInstance->getData("System", "dat/navi_table.dat");
|
||||
OarcManager::sInstance->getData("JpaCommon", "dat/Common.jpc");
|
||||
OarcManager::sInstance->getData("JpaCommon", "dat/Common.jpn");
|
||||
|
||||
return sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb8() {
|
||||
return sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
|
||||
sFPhaseBase::sFPhaseState dScBoot_c::cb9() {
|
||||
dBase_c::createRoot(fProfile::MESSAGE, 0, dBase_c::OTHER);
|
||||
dBase_c::createRoot(fProfile::C_BASE, 0, dBase_c::OTHER);
|
||||
|
||||
dLytBattery_c::create();
|
||||
return sFPhaseBase::PHASE_NEXT;
|
||||
}
|
||||
|
||||
SPECIAL_BASE_PROFILE(BOOT, dScBoot_c, fProfile::BOOT, 0x2A7, 0);
|
||||
|
||||
STATE_DEFINE(dScBoot_c, Init);
|
||||
STATE_DEFINE(dScBoot_c, Strap);
|
||||
STATE_DEFINE(dScBoot_c, Connect);
|
||||
STATE_DEFINE(dScBoot_c, Save);
|
||||
|
||||
dScBoot_c::dScBoot_c() : mStateMgr(*this, sStateID::null) {}
|
||||
dScBoot_c::~dScBoot_c() {}
|
||||
dScBoot_c::strap_c::strap_c() {
|
||||
SizedString<8> str;
|
||||
u8 langNum = getUsedLanguageNTSCNum();
|
||||
mArcName.mChars[0] = '\0';
|
||||
mStr2.mChars[0] = '\0';
|
||||
mStr3.mChars[0] = '\0';
|
||||
if (langNum == 3) {
|
||||
str = "F";
|
||||
} else if (langNum == 4) {
|
||||
str = "S";
|
||||
} else {
|
||||
str = "U";
|
||||
}
|
||||
// UB: Cannot pass object of non-POD type 'SizedString<8>' through variadic method
|
||||
mArcName.sprintf("strap%s", str);
|
||||
mStr2.sprintf("strap_00_%s.brlyt", str);
|
||||
mStr3.sprintf("strap_00_%s_loop.brlan", str);
|
||||
LayoutArcManager::sInstance->loadLayoutArcFromDisk(mArcName, dHeap::work2Heap.heap);
|
||||
field_0x4EC = 0;
|
||||
}
|
||||
|
||||
bool dScBoot_c::strap_c::create() {
|
||||
if (!field_0x4EC) {
|
||||
if (LayoutArcManager::sInstance->ensureLoaded1(mArcName)) {
|
||||
return false;
|
||||
}
|
||||
void *data = LayoutArcManager::sInstance->getLoadedData(mArcName);
|
||||
// HACK: Why does this use the m2d attach function?
|
||||
// Inlines break instruction scheduling, and I don't
|
||||
// want to undo shadowing...
|
||||
((m2d::ResAccIf_c *)&mResAcc)->attach(data, "");
|
||||
mLyt.setResAcc(&mResAcc);
|
||||
mLyt.build(mStr2, nullptr);
|
||||
mAnm.doSomething(mStr3, &mResAcc);
|
||||
mLyt.bind(&mAnm);
|
||||
field_0x4EC = 1;
|
||||
field_0x4EE = 0;
|
||||
field_0x4F0 = 0;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dScBoot_c::strap_c::remove() {
|
||||
mLyt.unbind(&mAnm);
|
||||
mAnm.destroySomething();
|
||||
// HACK: See above
|
||||
((m2d::ResAccIf_c *)&mResAcc)->detach();
|
||||
LayoutArcManager::sInstance->decrement(mArcName);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dScBoot_c::strap_c::execute() {
|
||||
// TODO Button mask
|
||||
if (field_0x4F0 == 0 && mPad::g_currentCore->downTrigger(0xF0F)) {
|
||||
field_0x4F0 = 1;
|
||||
}
|
||||
mAnm.play();
|
||||
mLyt.calc();
|
||||
if (field_0x4EE <= SC_BOOT_STRAP_MAX_DURATION) {
|
||||
field_0x4EE++;
|
||||
}
|
||||
if (!(field_0x4EE <= SC_BOOT_STRAP_MAX_DURATION) ||
|
||||
!(field_0x4EE <= SC_BOOT_STRAP_MIN_DURATION || field_0x4F0 == 0)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void dScBoot_c::strap_c::draw() {
|
||||
mLyt.addToDrawList();
|
||||
}
|
||||
|
||||
void dScBoot_c::strap_c::init() {
|
||||
mAnm.setFrame(0.0f);
|
||||
mLyt.calc();
|
||||
field_0x4EE = 0;
|
||||
field_0x4F0 = 0;
|
||||
}
|
||||
|
||||
dScBoot_c::dScBoot_c() : mStateMgr(*this, sStateID::null), mPhases(this, sCallbacks), mpDvdCallback(nullptr) {
|
||||
field_0x5DF = 0;
|
||||
sInstance = this;
|
||||
field_0x5E1 = 0;
|
||||
field_0x5E2 = 0;
|
||||
field_0x5E3 = 0;
|
||||
field_0x5E4 = 0;
|
||||
}
|
||||
|
||||
dScBoot_c::~dScBoot_c() {
|
||||
fn_80197560(getHBM(), 0);
|
||||
sInstance = nullptr;
|
||||
}
|
||||
|
||||
int dScBoot_c::create() {
|
||||
if (!mStrapScreen.create()) {
|
||||
return NOT_READY;
|
||||
};
|
||||
|
||||
mFader.create();
|
||||
mFader.setFadeInFrame(1);
|
||||
// TODO
|
||||
dSys::setFrameRate(1);
|
||||
mStateMgr.changeState(StateID_Init);
|
||||
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dScBoot_c::doDelete() {
|
||||
int removed = mStrapScreen.remove();
|
||||
sFPhaseBase::sFPhaseState phaseState = mPhases.step();
|
||||
if (!removed || phaseState != sFPhaseBase::PHASE_ALL_DONE) {
|
||||
return NOT_READY;
|
||||
}
|
||||
// TODO
|
||||
}
|
||||
|
||||
int dScBoot_c::execute() {
|
||||
mFader.calc();
|
||||
mStateMgr.executeState();
|
||||
sFPhaseBase::sFPhaseState state = executeLoadPhase();
|
||||
if (field_0x5DE == 0 && state == sFPhaseBase::PHASE_ALL_DONE) {
|
||||
field_0x5DE = 1;
|
||||
}
|
||||
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
int dScBoot_c::draw() {
|
||||
if (field_0x5E1 == 1) {
|
||||
mStrapScreen.draw();
|
||||
}
|
||||
|
||||
return SUCCEEDED;
|
||||
}
|
||||
|
||||
void dScBoot_c::deleteReady() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
void dScBoot_c::initializeState_Init() {
|
||||
field_0x5D4 = 0;
|
||||
field_0x5D8 = 0;
|
||||
field_0x5DC = 0;
|
||||
field_0x5DD = 0;
|
||||
field_0x5DE = 0;
|
||||
field_0x5E0 = 0;
|
||||
}
|
||||
|
||||
void dScBoot_c::executeState_Init() {
|
||||
mStateMgr.changeState(StateID_Strap);
|
||||
}
|
||||
|
||||
void dScBoot_c::initializeState_Init() {}
|
||||
void dScBoot_c::executeState_Init() {}
|
||||
void dScBoot_c::finalizeState_Init() {}
|
||||
void dScBoot_c::initializeState_Strap() {}
|
||||
void dScBoot_c::executeState_Strap() {}
|
||||
void dScBoot_c::finalizeState_Strap() {}
|
||||
void dScBoot_c::initializeState_Connect() {}
|
||||
void dScBoot_c::executeState_Connect() {}
|
||||
|
||||
void dScBoot_c::initializeState_Strap() {
|
||||
field_0x5D4 = 0;
|
||||
field_0x5E1 = 1;
|
||||
mFader.fadeIn();
|
||||
mFader.resetFrames();
|
||||
}
|
||||
|
||||
void dScBoot_c::executeState_Strap() {
|
||||
if (dScene_c::sFader.isStatus(mFaderBase_c::FADED_IN)) {
|
||||
switch (field_0x5D4) {
|
||||
case 0:
|
||||
if (!checkDone() && mFader.isNotStatus(mFaderBase_c::FADING_IN)) {
|
||||
field_0x5D4 = 1;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (!checkDone()) {
|
||||
bool ok = mStrapScreen.execute();
|
||||
if (ReloadColorFader::GetInstance()->field_0x0C == 1) {
|
||||
ok = false;
|
||||
}
|
||||
|
||||
if (ok) {
|
||||
field_0x5DC = 1;
|
||||
if (mFader.fadeOut() == true) {
|
||||
field_0x5D4 = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (!checkDone() && mFader.isNotStatus(mFaderBase_c::FADING_OUT)) {
|
||||
if (mFader.fadeIn() == true) {
|
||||
field_0x5D4 = 3;
|
||||
field_0x5E1 = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (!checkDone() && mFader.isNotStatus(mFaderBase_c::FADING_IN)) {
|
||||
mStateMgr.changeState(StateID_Connect);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
mFader.setStatus(mFaderBase_c::FADED_OUT);
|
||||
if (mFader.fadeIn() == true) {
|
||||
field_0x5E4 = 1;
|
||||
if (field_0x5DC != 0) {
|
||||
field_0x5E1 = 0;
|
||||
mStateMgr.changeState(StateID_Connect);
|
||||
} else {
|
||||
field_0x5D4 = 0;
|
||||
mStrapScreen.init();
|
||||
}
|
||||
fn_80197560(getHBM(), 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dScBoot_c::finalizeState_Strap() {
|
||||
// TODO
|
||||
SOME_GFX_THING[9] = 1;
|
||||
}
|
||||
|
||||
void dScBoot_c::initializeState_Connect() {
|
||||
field_0x5D4 = 0;
|
||||
dSys::setFrameRate(2);
|
||||
}
|
||||
|
||||
void dScBoot_c::executeState_Connect() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
void dScBoot_c::finalizeState_Connect() {}
|
||||
void dScBoot_c::initializeState_Save() {}
|
||||
void dScBoot_c::executeState_Save() {}
|
||||
|
||||
void dScBoot_c::initializeState_Save() {
|
||||
field_0x5D4 = 0;
|
||||
field_0x5D8 = 0;
|
||||
// TODO
|
||||
}
|
||||
|
||||
void dScBoot_c::executeState_Save() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
void dScBoot_c::finalizeState_Save() {}
|
||||
|
||||
bool dScBoot_c::checkDone() {
|
||||
if (field_0x5E3 == 1) {
|
||||
field_0x5E3 = 0;
|
||||
field_0x5D4 = 4;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
+2
-2
@@ -38,8 +38,8 @@ bool dFader_c::create() {
|
||||
|
||||
mFadeOutType = 0;
|
||||
mFadeInType = 0;
|
||||
field_0x20 = 0x1E;
|
||||
field_0x22 = 0x1E;
|
||||
mFadeInFrame = 0x1E;
|
||||
mFadeOutFrame = 0x1E;
|
||||
setFader(0);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
#include "d/d_scene.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/d_base.h"
|
||||
#include "f/f_base.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m_fader_base.h"
|
||||
#include "toBeSorted/reload_color_fader.h"
|
||||
|
||||
static u16 RootActorID = fProfile::PROFILE_MAX;
|
||||
static u32 RootActorParams = 0;
|
||||
static bool gameStateIsActive = true;
|
||||
|
||||
extern "C" u32 lbl_80574FA0;
|
||||
extern "C" u32 lbl_80574FA4;
|
||||
extern "C" void fn_801942F0(int, int);
|
||||
extern "C" void fn_80066D30(int);
|
||||
|
||||
dFader_c dScene_c::sFader;
|
||||
|
||||
dScene_c::dScene_c() {
|
||||
lbl_80574FA0 = 0;
|
||||
lbl_80574FA4 = 0;
|
||||
setProcControlFlag(ROOT_DISABLE_DRAW | ROOT_DISABLE_EXECUTE);
|
||||
fn_801942F0(0, 0);
|
||||
}
|
||||
|
||||
void dScene_c::postCreate(MAIN_STATE_e state) {
|
||||
if (state == SUCCESS) {
|
||||
ReloadColorFader::GetInstance()->fn_80067ED0();
|
||||
}
|
||||
dBase_c::postCreate(state);
|
||||
}
|
||||
|
||||
void dScene_c::postDelete(MAIN_STATE_e state) {
|
||||
if (state == SUCCESS) {
|
||||
gameStateIsActive = false;
|
||||
ReloadColorFader::GetInstance()->fn_80067F50();
|
||||
}
|
||||
dBase_c::postDelete(state);
|
||||
}
|
||||
|
||||
int dScene_c::preExecute() {
|
||||
if (dBase_c::preExecute() == NOT_READY) {
|
||||
return NOT_READY;
|
||||
} else if (RootActorID != fProfile::PROFILE_MAX) {
|
||||
if (sFader.isStatus(mFaderBase_c::FADED_IN)) {
|
||||
sFader.fadeOut();
|
||||
} else if (sFader.isStatus(mFaderBase_c::FADED_OUT)) {
|
||||
deleteRequest();
|
||||
resetFlags();
|
||||
fn_80066D30(-1);
|
||||
}
|
||||
return NOT_READY;
|
||||
} else {
|
||||
if ((proc_control & ROOT_DISABLE_EXECUTE)) {
|
||||
if (!checkChildProcessCreateState()) {
|
||||
clearProcControlFlag(ROOT_DISABLE_EXECUTE);
|
||||
clearProcControlFlag(ROOT_DISABLE_DRAW);
|
||||
}
|
||||
return NOT_READY;
|
||||
}
|
||||
if (sFader.isStatus(mFaderBase_c::FADED_OUT)) {
|
||||
sFader.fadeIn();
|
||||
}
|
||||
return SUCCEEDED;
|
||||
}
|
||||
}
|
||||
|
||||
void dScene_c::postExecute(MAIN_STATE_e status) {
|
||||
if (status != CANCELED) {
|
||||
ReloadColorFader::GetInstance()->fn_80067F00();
|
||||
}
|
||||
dBase_c::postExecute(status);
|
||||
if (proc_control & ROOT_DISABLE_EXECUTE) {
|
||||
lbl_80574FA0++;
|
||||
lbl_80574FA4++;
|
||||
}
|
||||
}
|
||||
|
||||
void dScene_c::staticCreate() {
|
||||
RootActorID = fProfile::BOOT;
|
||||
RootActorParams = 0;
|
||||
gameStateIsActive = false;
|
||||
}
|
||||
|
||||
dBase_c *dScene_c::staticExecute() {
|
||||
if (gameStateIsActive || RootActorID == fProfile::PROFILE_MAX) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
dBase_c *base = dBase_c::createRoot(RootActorID, RootActorParams, SCENE);
|
||||
if (base != nullptr) {
|
||||
RootActorID = fProfile::PROFILE_MAX;
|
||||
gameStateIsActive = true;
|
||||
return base;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void dScene_c::setRootActor(fProfile::PROFILE_NAME_e rootActor, u32 params, s32 fadeOutType, s32 fadeInType) {
|
||||
if (RootActorID != fProfile::PROFILE_MAX && rootActor != fProfile::TITLE) {
|
||||
return;
|
||||
}
|
||||
RootActorID = rootActor;
|
||||
RootActorParams = params;
|
||||
sFader.setTypes(fadeInType, fadeOutType);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
#include "s/s_FPhase.h"
|
||||
|
||||
// Not present in NSMBW
|
||||
|
||||
sFPhaseBaseBase::~sFPhaseBaseBase() {}
|
||||
sFPhaseBase::~sFPhaseBase() {}
|
||||
|
||||
sFPhaseBase::sFPhaseState sFPhaseBase::step() {
|
||||
if (!isFinalized()) {
|
||||
mState = callPhase();
|
||||
if (mState == PHASE_NEXT) {
|
||||
nextPhase();
|
||||
if (hasReachedEnd()) {
|
||||
mState = PHASE_ALL_DONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mState;
|
||||
}
|
||||
|
||||
void sFPhaseBase::reset() {
|
||||
onReset();
|
||||
mState = PHASE_INITIAL;
|
||||
}
|
||||
@@ -19,13 +19,14 @@ void CurrentStageArcManager::init(EGG::Heap *heap) {
|
||||
|
||||
bool CurrentStageArcManager::setStage(const char *newStage) {
|
||||
mStageName = newStage;
|
||||
|
||||
// UB: Cannot pass object of non-POD type 'SizedString<32>' through variadic method
|
||||
mCurrentLoadingStageArcName.sprintf("%s_stg_l0", mStageName);
|
||||
if (dRawArcEntry_c::checkArcExistsOnDisk(mCurrentLoadingStageArcName, getCurrentStageDirectory())) {
|
||||
return (bool)mArcTable.getArcOrLoadFromDisk(
|
||||
mCurrentLoadingStageArcName, getCurrentStageDirectory(), 0, dHeap::work2Heap.heap
|
||||
);
|
||||
} else {
|
||||
// UB: Cannot pass object of non-POD type 'SizedString<32>' through variadic method
|
||||
mCurrentLoadingStageArcName.sprintf("%s_stg", mStageName);
|
||||
return (bool)mArcTable.getArcOrLoadFromDisk(
|
||||
mCurrentLoadingStageArcName, getCurrentStageDirectory(), 0, dHeap::work2Heap.heap
|
||||
@@ -50,6 +51,7 @@ bool CurrentStageArcManager::loadFileFromExtraLayerArc(int layer) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// UB: Cannot pass object of non-POD type 'SizedString<32>' through variadic method
|
||||
mStageExtraLayerArcName.sprintf("%s_stg_l%d", mStageName, layer);
|
||||
if (dRawArcEntry_c::checkArcExistsOnDisk(mStageExtraLayerArcName, getCurrentStageDirectory())) {
|
||||
return (bool
|
||||
@@ -108,6 +110,7 @@ const char *CurrentStageArcManager::getCurrentStageDirectory() {
|
||||
static SizedString<32> s_roomArcTmp;
|
||||
|
||||
const char *CurrentStageArcManager::getRoomArcDirectory(int room) const {
|
||||
// UB: Cannot pass object of non-POD type 'const SizedString<32>' through variadic method
|
||||
s_roomArcTmp.sprintf("%s_r%02d", mStageName, room);
|
||||
return s_roomArcTmp;
|
||||
}
|
||||
|
||||
@@ -24,8 +24,8 @@ bool LayoutArcManager::loadLayoutArcFromDisk(const char *object, EGG::Heap *heap
|
||||
return mArcTable.getArcOrLoadFromDisk(object, "Layout", 0, heap);
|
||||
}
|
||||
|
||||
void LayoutArcManager::ensureLoaded1(const char *object) {
|
||||
mArcTable.ensureLoadedMaybe2(object);
|
||||
int LayoutArcManager::ensureLoaded1(const char *object) {
|
||||
return mArcTable.ensureLoadedMaybe2(object);
|
||||
}
|
||||
|
||||
void LayoutArcManager::ensureLoaded2(const char *object) {
|
||||
|
||||
Reference in New Issue
Block a user