summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-03-09 10:07:44 +0100
committerGitHub <noreply@github.com>2025-03-09 10:07:44 +0100
commitc6b8a2dbaf85fef6d847b613eb2972b207ca77c4 (patch)
tree90bbd89cc6e4632349622d94b69d0482b9fbb21d /src
parent3461afd2b89de4db997726ce99c9c188677e03c4 (diff)
parentc176c969a4586d9ad4f535176ba85c2a2bb4e06e (diff)
Merge pull request #124 from robojumper/d_sc_game_title
dScTitle_c OK, dScGame_c about halfway
Diffstat (limited to 'src')
-rw-r--r--src/REL/d/a/obj/d_a_obj_sun_light.cpp6
-rw-r--r--src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp10
-rw-r--r--src/REL/d/d_s_boot.cpp4
-rw-r--r--src/REL/d/t/d_t_genki_dws_tgt.cpp7
-rw-r--r--src/d/a/d_a_base.cpp4
-rw-r--r--src/d/col/bg/d_bg_s.cpp6
-rw-r--r--src/d/col/bg/d_bg_w.cpp4
-rw-r--r--src/d/col/bg/d_bg_w_kcol.cpp8
-rw-r--r--src/d/col/cc/d_cc_s.cpp5
-rw-r--r--src/d/d_sc_game.cpp325
-rw-r--r--src/d/d_sc_title.cpp218
-rw-r--r--src/d/lyt/meter/d_lyt_meter.cpp33
-rw-r--r--src/d/tg/d_t_switch.cpp6
-rw-r--r--src/toBeSorted/arc_managers/layout_arc_manager.cpp4
-rw-r--r--src/toBeSorted/file_manager.cpp4
-rw-r--r--src/toBeSorted/scgame.cpp5
-rw-r--r--src/toBeSorted/time_area_mgr.cpp4
17 files changed, 593 insertions, 60 deletions
diff --git a/src/REL/d/a/obj/d_a_obj_sun_light.cpp b/src/REL/d/a/obj/d_a_obj_sun_light.cpp
index 8922d5f0..6f141c95 100644
--- a/src/REL/d/a/obj/d_a_obj_sun_light.cpp
+++ b/src/REL/d/a/obj/d_a_obj_sun_light.cpp
@@ -1,9 +1,9 @@
#include "d/a/obj/d_a_obj_sun_light.h"
+#include "d/d_sc_game.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "toBeSorted/arc_managers/current_stage_arc_manager.h"
#include "toBeSorted/room_manager.h"
-#include "toBeSorted/scgame.h"
SPECIAL_ACTOR_PROFILE(OBJ_SUN_LIGHT, dAcOsunLight_c, fProfile::OBJ_SUN_LIGHT, 0x0219, 0, 3);
@@ -58,7 +58,5 @@ void dAcOsunLight_c::executeState_Wait() {}
void dAcOsunLight_c::finalizeState_Wait() {}
bool dAcOsunLight_c::isDay() {
- // return !ScGame::currentSpawnInfo.isNight();
- // TODO TempFix?
- return !(u8)ScGame::currentSpawnInfo.night;
+ return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::DAY;
}
diff --git a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp
index 618eaf3b..a57d07c3 100644
--- a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp
+++ b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp
@@ -2,11 +2,11 @@
#include "d/a/d_a_item.h"
#include "d/col/cc/d_cc_s.h"
+#include "d/d_sc_game.h"
#include "d/flag/storyflag_manager.h"
#include "toBeSorted/attention.h"
#include "toBeSorted/event.h"
#include "toBeSorted/event_manager.h"
-#include "toBeSorted/scgame.h"
SPECIAL_ACTOR_PROFILE(OBJ_TOD3_STONE, dAcOtoD3StoneFigure_c, fProfile::OBJ_TOD3_STONE, 0x1B3, 0, 0);
@@ -117,14 +117,14 @@ int dAcOtoD3StoneFigure_c::actorExecute() {
}
int dAcOtoD3StoneFigure_c::draw() {
- if (ScGame::currentSpawnInfo.layer != 0x12) {
+ if (dScGame_c::currentSpawnInfo.layer != 0x12) {
drawModelType1(&mMdl);
}
return SUCCEEDED;
}
void dAcOtoD3StoneFigure_c::initializeState_OneEye() {
- if (ScGame::currentSpawnInfo.night == 1) {
+ if (dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT) {
rotation.y.mVal += -0x8000;
updateMatrix();
mMdl.setLocalMtx(mWorldMtx);
@@ -133,9 +133,9 @@ void dAcOtoD3StoneFigure_c::initializeState_OneEye() {
void dAcOtoD3StoneFigure_c::executeState_OneEye() {
if (EventManager::isInEvent(this, "D3OpenStart")) {
- ScGame::sInstance->triggerExit(roomid, mExitId);
+ dScGame_c::sInstance->triggerExit(roomid, mExitId);
} else {
- if (hasStoneOfTrials() && ScGame::currentSpawnInfo.night != 1) {
+ if (hasStoneOfTrials() && dScGame_c::currentSpawnInfo.getTimeOfDay() != SpawnInfo::NIGHT) {
// These are interaction related
-0.0f;
AttentionManager::sInstance->addExamineTalkTarget(*this, 1, 300.0f, 50.0f, -100.0f, 100.0f);
diff --git a/src/REL/d/d_s_boot.cpp b/src/REL/d/d_s_boot.cpp
index 4942cc38..996fe31f 100644
--- a/src/REL/d/d_s_boot.cpp
+++ b/src/REL/d/d_s_boot.cpp
@@ -23,6 +23,7 @@
#include "toBeSorted/arc_managers/layout_arc_manager.h"
#include "toBeSorted/arc_managers/oarc_manager.h"
#include "toBeSorted/hbm.h"
+#include "toBeSorted/some_gxf_thing.h"
#include "toBeSorted/reload_color_fader.h"
sFPhase<dScBoot_c>::phaseCallback dScBoot_c::sCallbacks[] = {&dScBoot_c::cb1, &dScBoot_c::cb2, &dScBoot_c::cb3,
@@ -44,7 +45,6 @@ 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);
@@ -520,7 +520,7 @@ void dScBoot_c::executeState_Strap() {
void dScBoot_c::finalizeState_Strap() {
// TODO
- SOME_GFX_THING[9] = 1;
+ SomeGfxThing::setField0x09(1);
}
void dScBoot_c::initializeState_Connect() {
diff --git a/src/REL/d/t/d_t_genki_dws_tgt.cpp b/src/REL/d/t/d_t_genki_dws_tgt.cpp
index bdee8025..ef184152 100644
--- a/src/REL/d/t/d_t_genki_dws_tgt.cpp
+++ b/src/REL/d/t/d_t_genki_dws_tgt.cpp
@@ -1,16 +1,15 @@
#include "d/t/d_t_genki_dws_tgt.h"
-#include "toBeSorted/room_manager.h"
+#include "d/d_sc_game.h"
#include "d/flag/sceneflag_manager.h"
#include "d/flag/storyflag_manager.h"
-#include "toBeSorted/scgame.h"
-
+#include "toBeSorted/room_manager.h"
SPECIAL_ACTOR_PROFILE(TAG_GENKI_DOWSING_TARGET, dTgGenkiDwsTgt_c, fProfile::TAG_GENKI_DOWSING_TARGET, 0x02A5, 0, 0);
int dTgGenkiDwsTgt_c::create() {
u16 batQuestActivated = StoryflagManager::sInstance->getCounterOrFlag(304);
- if (batQuestActivated == 0 || !ScGame::sInstance->currentSpawnInfo.isNight()) {
+ if (batQuestActivated == 0 || !dScGame_c::sInstance->currentSpawnInfo.isNight()) {
return FAILED;
}
diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp
index 600ae9c3..b4bed28c 100644
--- a/src/d/a/d_a_base.cpp
+++ b/src/d/a/d_a_base.cpp
@@ -3,6 +3,7 @@
#include "d/a/d_a_player.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/d_heap.h"
+#include "d/d_sc_game.h"
#include "d/flag/enemyflag_manager.h"
#include "f/f_list_nd.h"
#include "m/m_vec.h"
@@ -10,7 +11,6 @@
#include "toBeSorted/event_manager.h"
#include "toBeSorted/file_manager.h"
#include "toBeSorted/room_manager.h"
-#include "toBeSorted/scgame.h"
#include "toBeSorted/special_item_drop_mgr.h"
// .sdata
@@ -232,7 +232,7 @@ bool dAcBase_c::restorePosRotFromCopy() {
// 8002cf10
u32 dAcBase_c::itemDroppingAndGivingRelated(mVec3_c *spawnPos, int subtype) {
- if (ScGame::currentSpawnInfo.trial == 1) {
+ if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
return 0;
}
diff --git a/src/d/col/bg/d_bg_s.cpp b/src/d/col/bg/d_bg_s.cpp
index 7b43718f..b23d869e 100644
--- a/src/d/col/bg/d_bg_s.cpp
+++ b/src/d/col/bg/d_bg_s.cpp
@@ -10,8 +10,8 @@
#include "d/col/c/c_bg_s_shdw_draw.h"
#include "d/col/c/c_m3d.h"
#include "d/col/c/c_partition.h"
+#include "d/d_sc_game.h"
#include "toBeSorted/arc_managers/oarc_manager.h"
-#include "toBeSorted/scgame.h"
const char *MAP_SOLID_MATERIAL_NAMES[31] = {
0,
@@ -409,7 +409,7 @@ void dBgS::Ct() {
mInSkyKeep = false;
for (int i = 0; i < 8; ++i) {
- if (ScGame::isCurrentStage(SKYKEEP_STAGE_NAMES[i])) {
+ if (dScGame_c::isCurrentStage(SKYKEEP_STAGE_NAMES[i])) {
mInSkyKeep = true;
return;
}
@@ -575,7 +575,7 @@ int dBgS::GetPolyAtt1(cBgS_PolyInfo const &info) {
// TODO: Map to Enums And Cleanup??
int dBgS::GetMapCode(int att0, int att1, bool bAlt) {
- if (bAlt && ScGame::currentSpawnInfo.trial == 1) {
+ if (bAlt && dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
return 0x1E;
}
if (att0 == 4 && att1 == 1) {
diff --git a/src/d/col/bg/d_bg_w.cpp b/src/d/col/bg/d_bg_w.cpp
index 77695657..4c2ef77d 100644
--- a/src/d/col/bg/d_bg_w.cpp
+++ b/src/d/col/bg/d_bg_w.cpp
@@ -6,7 +6,7 @@
#include "d/col/c/c_bg_s_chk.h"
#include "d/col/c/c_bg_s_lin_chk.h"
#include "d/col/c/c_bg_s_shdw_draw.h"
-#include "toBeSorted/scgame.h"
+#include "d/d_sc_game.h"
bool cBgW::sLineCheck;
bool cBgW::sGndCheck;
@@ -855,7 +855,7 @@ bool dBgW::GetMapCode(int polyIdx, int *pOut) {
bool target = GetZTargetThrough(info);
if (att0 >= 0x20) {
*pOut = dBgS::GetMapCode(att0 - 0x20, att1, target);
- if (Chk0x24_0x20() && ScGame::currentSpawnInfo.trial == 1) {
+ if (Chk0x24_0x20() && dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
*pOut = 0x1E;
}
return false;
diff --git a/src/d/col/bg/d_bg_w_kcol.cpp b/src/d/col/bg/d_bg_w_kcol.cpp
index 5da42405..ce27c650 100644
--- a/src/d/col/bg/d_bg_w_kcol.cpp
+++ b/src/d/col/bg/d_bg_w_kcol.cpp
@@ -3,7 +3,7 @@
#include "d/col/bg/d_bg_s.h"
#include "d/col/bg/d_bg_s_gnd_chk.h"
#include "d/col/bg/d_bg_s_lin_chk.h"
-#include "toBeSorted/scgame.h"
+#include "d/d_sc_game.h"
char STAGE_FS_A[] = "D201";
char STAGE_FS_B[] = "D201_1";
@@ -518,7 +518,7 @@ void dBgWKCol::DrawOnMap(int idx, bool param2) {
if (param2) {
// FS Room 9 /* Spiral Staircase */
- if (GetRoomId() == 9 && (ScGame::isCurrentStage(STAGE_FS_A) || ScGame::isCurrentStage(STAGE_FS_B))) {
+ if (GetRoomId() == 9 && (dScGame_c::isCurrentStage(STAGE_FS_A) || dScGame_c::isCurrentStage(STAGE_FS_B))) {
int all = mMapRelated[idx].mCount;
mVec3_c AB, CA, BC;
mVec3_c v0, v1, v2;
@@ -646,13 +646,13 @@ void dBgWKCol::DrawOnMap(int idx, bool param2) {
f32 yPos = (bnd->GetMinP()->y + bnd->GetMaxP()->y) * 0.5f;
// Sandship
- if (GetRoomId() == 15 && ScGame::isCurrentStage(STAGE_SSH)) {
+ if (GetRoomId() == 15 && dScGame_c::isCurrentStage(STAGE_SSH)) {
yPos = 0.0f;
}
if (idx == 0x12 /* Abyss `Common/tex/naraku.bti`)*/) {
yPos -= 1.0f;
}
- if (ScGame::isCurrentStage(STAGE_FS_A) || ScGame::isCurrentStage(STAGE_FS_B)) {
+ if (dScGame_c::isCurrentStage(STAGE_FS_A) || dScGame_c::isCurrentStage(STAGE_FS_B)) {
int room = GetRoomId();
/* FS Room 9 - Spiral Staircse */
if (room == 9) {
diff --git a/src/d/col/cc/d_cc_s.cpp b/src/d/col/cc/d_cc_s.cpp
index 8889c876..01f1d9e2 100644
--- a/src/d/col/cc/d_cc_s.cpp
+++ b/src/d/col/cc/d_cc_s.cpp
@@ -6,6 +6,7 @@
#include "d/col/c/c_m3d_g_aab.h"
#include "f/f_base.h"
#include "rvl/MTX/mtx.h"
+#include "toBeSorted/stage_manager.h"
dCcS *dCcS::sInstance;
@@ -167,11 +168,11 @@ void dCcS::ClearArea() {
mAreaCount = 0;
}
-extern "C" void *STAGE_MANAGER;
+
extern "C" bool fn_8019A7A0(void *stg, f32 *, f32 *);
void dCcS::AdjustHitPos() {
f32 x, z;
- if (STAGE_MANAGER && fn_8019A7A0(STAGE_MANAGER, &x, &z)) {
+ if (dStageMgr_c::GetInstance() != nullptr && fn_8019A7A0(dStageMgr_c::GetInstance(), &x, &z)) {
for (cCcD_Obj **obj = mpObj; obj < mpObj + mObjCount; ++obj) {
(*obj)->AdjustHitPos(x, z);
(*obj)->GetShapeAttr()->TranslateXZ(x, z);
diff --git a/src/d/d_sc_game.cpp b/src/d/d_sc_game.cpp
new file mode 100644
index 00000000..d85b57a6
--- /dev/null
+++ b/src/d/d_sc_game.cpp
@@ -0,0 +1,325 @@
+#include "d/d_sc_game.h"
+
+#include "common.h"
+#include "d/d_base.h"
+#include "d/flag/storyflag_manager.h"
+#include "f/f_base.h"
+#include "f/f_profile_name.h"
+#include "m/m_fader_base.h"
+#include "m/m_vec.h"
+#include "s/s_FPhase.h"
+#include "s/s_State.hpp"
+#include "toBeSorted/arc_managers/layout_arc_manager.h"
+#include "toBeSorted/arc_managers/oarc_manager.h"
+#include "toBeSorted/file_manager.h"
+#include "toBeSorted/minigame_mgr.h"
+#include "toBeSorted/music_mgrs.h"
+#include "toBeSorted/room_manager.h"
+#include "toBeSorted/some_gxf_thing.h"
+#include "toBeSorted/stage_manager.h"
+
+#include <cstring>
+
+SPECIAL_BASE_PROFILE(GAME, dScGame_c, fProfile::GAME, 0x4, 0x6F9);
+
+STATE_VIRTUAL_DEFINE(dScGame_c, Stanby);
+STATE_VIRTUAL_DEFINE(dScGame_c, Action);
+
+SpawnInfo dScGame_c::currentSpawnInfo;
+SpawnInfo dScGame_c::nextSpawnInfo(dScGame_c::currentSpawnInfo);
+
+dScGame_c *dScGame_c::sInstance;
+u32 dScGame_c::sUpdateFrameCount;
+u8 dScGame_c::sCurrentLayer;
+u8 dScGame_c::sReloaderType;
+bool dScGame_c::sCopyFileBToCurrentAfterRespawn;
+bool dScGame_c::sDoSomethingWithFileAOnTransition;
+bool dScGame_c::sPreventClearingSomeFlag;
+
+sFPhase<dScGame_c>::phaseCallback dScGame_c::sCallbacks[] = {
+ &dScGame_c::cb1, &dScGame_c::cb2, &dScGame_c::cb3, nullptr
+};
+
+void dScGame_c::someGfxThingCallback() {
+ dScGame_c *scGame = dScGame_c::GetInstance();
+ scGame->somethingWithScreen();
+ scGame->mFader.draw();
+}
+
+dScGame_c::dScGame_c()
+ : mPhases(this, sCallbacks),
+ mStateMgr(*this),
+ mStageMgrRef(nullptr),
+ mScreen1(0x85),
+ mScreen2(0x89),
+ field_0x228(0),
+ mReloadTrigger(fProfile::PROFILE_MAX) {
+ resetLinkState();
+ mBeedleShopState = 0;
+ mLastAreaType = 6;
+ mType0PosFlag = 0;
+ mSavePromptFlag = false;
+ mPreventSaveRespawnInfo = true;
+ sInstance = this;
+ currentSpawnInfo.reset();
+}
+
+int dScGame_c::create() {
+ sFPhaseBase::sFPhaseState phaseResult = mPhases.step();
+ if (phaseResult != sFPhaseBase::PHASE_ALL_DONE) {
+ return NOT_READY;
+ }
+
+ SomeGfxThing::setDrawCallback(someGfxThingCallback);
+ return SUCCEEDED;
+}
+
+int dScGame_c::doDelete() {
+ MinigameManager::destroy();
+ mRelCtrl.do_unlink();
+ mLayoutCtrl.release();
+
+ return SUCCEEDED;
+}
+
+int dScGame_c::execute() {
+ mFader.calc();
+ mStateMgr.executeState();
+ MinigameManager::execute();
+
+ return SUCCEEDED;
+}
+
+int dScGame_c::draw() {
+ mScreen1.addToDrawList();
+ mScreen2.addToDrawList();
+
+ return SUCCEEDED;
+}
+
+void dScGame_c::deleteReady() {
+ SomeGfxThing::setDrawCallback(nullptr);
+}
+
+sFPhaseBase::sFPhaseState dScGame_c::cb1() {
+ mFader.create();
+ mFader.setFrames(15, 15);
+ mFader.setTypes(1, 1);
+ mFader.initForLyt();
+ mRelCtrl.do_link();
+ mLayoutCtrl.load(nullptr);
+
+ return sFPhaseBase::PHASE_NEXT;
+}
+
+sFPhaseBase::sFPhaseState dScGame_c::cb2() {
+ if (!mRelCtrl.do_link()) {
+ return sFPhaseBase::PHASE_RETRY;
+ }
+
+ if (OarcManager::sInstance->ensureAllEntriesLoaded()) {
+ return sFPhaseBase::PHASE_RETRY;
+ }
+
+ if (LayoutArcManager::sInstance->ensureAllEntriesLoaded()) {
+ return sFPhaseBase::PHASE_RETRY;
+ }
+
+ MinigameManager::create();
+ setReloadTrigger(fProfile::STAGE_MANAGER);
+ mStateMgr.changeState(StateID_Stanby);
+ return sFPhaseBase::PHASE_NEXT;
+}
+
+sFPhaseBase::sFPhaseState dScGame_c::cb3() {
+ if (checkChildProcessCreateState()) {
+ return sFPhaseBase::PHASE_RETRY;
+ }
+ return sFPhaseBase::PHASE_NEXT;
+}
+
+void dScGame_c::initializeState_Stanby() {
+ setProcControlFlag(ROOT_DISABLE_EXECUTE | ROOT_DISABLE_DRAW);
+ if (mReloadTrigger == fProfile::STAGE_MANAGER) {
+ copySpawnNextToCurrent();
+ }
+ dBase_c *base = dBase_c::createBase(mReloadTrigger, this, 0, OTHER);
+ mStageMgrRef.link(base);
+ mReloadTrigger = fProfile::PROFILE_MAX;
+}
+
+void dScGame_c::executeState_Stanby() {
+ mStateMgr.changeState(StateID_Action);
+}
+
+void dScGame_c::finalizeState_Stanby() {}
+
+void dScGame_c::initializeState_Action() {
+ mFader.fadeIn();
+}
+
+void dScGame_c::executeState_Action() {
+ if (mFader.isStatus(mFaderBase_c::FADED_OUT)) {
+ if (attemptDelete()) {
+ mStateMgr.changeState(StateID_Stanby);
+ }
+ } else if (mReloadTrigger != fProfile::PROFILE_MAX) {
+ mFader.fadeOut();
+ fn_80362150(ENEMY_SOUND_MGR, mFader.getFadeOutFrame());
+ }
+}
+
+void dScGame_c::finalizeState_Action() {}
+
+void dScGame_c::somethingWithScreen() {}
+
+void dScGame_c::setRespawnInfo(const mVec3_c &linkPos, const mAng3_c &linkRot, bool unk) {
+ bool isInThunderDragonTrial = MinigameManager::isInMinigameState(MinigameManager::TRIAL_TIME_ATTACK) ||
+ MinigameManager::isInMinigameState(MinigameManager::BOSS_RUSH) ?
+ true :
+ false;
+ bool isInHordeFight = isCurrentStage("F403") && !StoryflagManager::sInstance->getFlag(134);
+ s32 areaType = dStageMgr_c::GetInstance()->getAreaType();
+ if (mPreventSaveRespawnInfo != true && !isInThunderDragonTrial && !isInHordeFight &&
+ (areaType != 2 && !isCurrentStage("B100_1") && !sPreventClearingSomeFlag &&
+ (areaType != 1 || (mLastAreaType != 1 && mLastAreaType != 2)))) {
+ FileManager::sInstance->setT3Info(linkPos, linkRot);
+ if (mLastAreaType != 5 && unk) {
+ StoryflagManager::sInstance->unsetFlag(752);
+ }
+ }
+
+ if (!isInThunderDragonTrial && isCurrentStage("B400") && mLastAreaType != 2) {
+ FileManager::sInstance->copyCurrentToFileB();
+ }
+ sPreventClearingSomeFlag = 0;
+ mPreventSaveRespawnInfo = false;
+ mLastAreaType = areaType;
+}
+
+const LinkReloadInfo &dScGame_c::getLinkReloadInfo() const {
+ return mReloadInfo;
+}
+
+bool dScGame_c::attemptDelete() {
+ if (mStageMgrRef.p_owner == nullptr) {
+ return true;
+ } else {
+ if (!mStageMgrRef.p_owner->delete_request) {
+ mStageMgrRef.p_owner->deleteRequest();
+ }
+ return false;
+ }
+}
+
+bool dScGame_c::setReloadTrigger(fProfile::PROFILE_NAME_e trigger) {
+ if (mReloadTrigger != fProfile::PROFILE_MAX) {
+ return false;
+ }
+ mReloadTrigger = trigger;
+ return true;
+}
+
+void dScGame_c::setSpawnInfo(u8 roomid, const mVec3_c &pos, mAng rot) {
+ mSpawnInfo.setSpawnData(currentSpawnInfo.stageName, roomid, sCurrentLayer, 0, pos, rot);
+}
+
+const SpawnInfoExt &dScGame_c::getSpawnInfo() const {
+ return mSpawnInfo;
+}
+
+void dScGame_c::clearSpawnInfo() {
+ mSpawnInfo.setSpawnData("", 0, 0, 0, mVec3_c::Zero, 0);
+}
+
+extern "C" void processEventFlags();
+void dScGame_c::triggerExit(s32 room, u8 exitIndex, s32 forcedNight, s32 forcedTrial) {
+ processEventFlags();
+ // TODO
+}
+
+void SpawnInfoExt::setSpawnData(
+ const char *i_stageName, u8 i_roomid, u8 i_layer, u8 i_entrance, const mVec3_c &pos, mAng rot
+) {
+ setData(
+ i_stageName, i_roomid, i_layer, i_entrance, dScGame_c::currentSpawnInfo.night,
+ dScGame_c::currentSpawnInfo.trial, 0, 15, -1
+ );
+ mType0Pos = pos;
+ mType0RotY = rot;
+}
+
+void LinkReloadInfo::set(u8 roomid, const mVec3_c &pos, mAng rot, u32 flags) {
+ mRoomId = roomid;
+ mPosition = pos;
+ mRotY = rot;
+ mUnkFlags = flags;
+ mType0CsFlag = 1;
+}
+
+bool dScGame_c::isCurrentStage(const char *stage) {
+ return dScGame_c::currentSpawnInfo.stageName == stage;
+}
+
+extern "C" void fn_801BB9C0();
+extern "C" void *lbl_80575688;
+extern "C" void fn_801909A0(void *);
+extern "C" void maybeResetSkykeepPuzzle(bool);
+
+void dScGame_c::copySpawnNextToCurrent() {
+ if (sDoSomethingWithFileAOnTransition == true) {
+ fn_801BB9C0();
+ sDoSomethingWithFileAOnTransition = false;
+ }
+ if (std::strncmp(currentSpawnInfo.stageName, nextSpawnInfo.stageName, 2)) {
+ fn_801909A0(lbl_80575688);
+ }
+ currentSpawnInfo = nextSpawnInfo;
+ sCurrentLayer = currentSpawnInfo.layer;
+ maybeResetSkykeepPuzzle(false);
+}
+
+void dScGame_c::actuallyTriggerEntrance(
+ const char *stageName, u8 roomid, u8 layer, u8 entrance, int forcedNight, int forcedTrial, u8 transitionType,
+ u16 transitionFadeFrames, s8 field0x28
+) {
+ s32 trial, night;
+ if (forcedTrial == 2) {
+ trial = currentSpawnInfo.trial;
+ } else {
+ trial = forcedTrial;
+ }
+
+ if (forcedNight == 2) {
+ night = currentSpawnInfo.night;
+ } else {
+ night = forcedNight;
+ }
+
+ nextSpawnInfo.setData(
+ stageName, roomid, layer, entrance, night, trial, transitionType, transitionFadeFrames, field0x28
+ );
+
+ if (dScGame_c::GetInstance() != nullptr) {
+ dScGame_c::GetInstance()->setFadeInType(transitionType);
+ dScGame_c::GetInstance()->setFadeOutType(transitionType);
+ dScGame_c::GetInstance()->setFaderFrames(transitionFadeFrames);
+ dScGame_c::GetInstance()->resetLinkState();
+ dScGame_c::GetInstance()->setBeedleShopState(0);
+ }
+}
+
+void SpawnInfo::setData(
+ const char *i_stageName, u8 i_roomid, u8 i_layer, u8 i_entrance, s32 i_night, s32 i_trial, u8 i_transitionType,
+ u16 i_fadeFrames, s8 i_field0x28
+) {
+ stageName = i_stageName;
+ room = i_roomid;
+ layer = i_layer;
+ entrance = i_entrance;
+ night = i_night;
+ trial = i_trial;
+ transitionType = i_transitionType;
+ transitionFadeFrames = i_fadeFrames;
+ unk = i_field0x28;
+}
diff --git a/src/d/d_sc_title.cpp b/src/d/d_sc_title.cpp
new file mode 100644
index 00000000..07f227a2
--- /dev/null
+++ b/src/d/d_sc_title.cpp
@@ -0,0 +1,218 @@
+#include "d/d_sc_title.h"
+
+#include "common.h"
+#include "d/d_heap.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/reload_color_fader.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_80575688;
+extern "C" void fn_801907F0(void *);
+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));
+ fn_801907F0(lbl_80575688);
+ 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::sInstance->clearTempFileData();
+ FileManager::sInstance->initFile(1);
+ fn_80052D50(lbl_805750D8);
+ lbl_80575787 = 0;
+ field_0x2AC = 0;
+}
+
+dScTitle_c::~dScTitle_c() {
+ sInstance = nullptr;
+}
+
+extern "C" u32 TITLE_SCREEN_CHANGE;
+extern "C" void fn_80059450();
+extern "C" void fn_80058C90(s32);
+extern "C" void fn_80015E40();
+extern "C" const char *getUsedLanguageString();
+
+static const char *const sFileSelect = "FileSelect";
+static const char *const sSkb = "SoftwareKeyboard";
+
+int dScTitle_c::create() {
+ int ret = dScGame_c::create();
+ if (ret == SUCCEEDED && ReloadColorFader::GetInstance()->field_0x0C == 1) {
+ if (field_0x2AC == 0) {
+ ReloadColorFader::GetInstance()->fn_80067EF0(0);
+ if (checkAllSaveFilesEmpty() != true) {
+ TITLE_SCREEN_CHANGE = 0;
+ }
+ field_0x2AC = 1;
+ ret = NOT_READY;
+ } else {
+ ReloadColorFader::GetInstance()->fn_80067EF0(1);
+ }
+ }
+
+ if (ret == SUCCEEDED) {
+ dSys::setFrameRate(2);
+ dSys::setClearColor(mColor(0x00000000));
+ fn_80059450();
+ fn_80058C90(0);
+ fn_80015E40();
+ field_0x2AD = 0;
+ LayoutArcManager::sInstance->loadLayoutArcFromDisk(sFileSelect, nullptr);
+ LayoutArcManager::sInstance->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", getUsedLanguageString(), "normal_02.brfnt");
+ mDvd_toMainRam_normal_c::create2(&mpSkbFont, fntPath, 0, dHeap::work2Heap.heap);
+ fn_8035E310(BGM_MGR);
+ }
+
+ return ret;
+}
+
+int dScTitle_c::execute() {
+ mFader.calc();
+ mStateMgr.executeState();
+ return SUCCEEDED;
+}
+
+extern "C" void fn_80015E80();
+
+int dScTitle_c::doDelete() {
+ // TODO return codes
+ int result;
+ result = LayoutArcManager::sInstance->ensureLoaded2(sFileSelect);
+ if (result != -2) {
+ if (result != 0) {
+ return NOT_READY;
+ }
+ LayoutArcManager::sInstance->decrement(sFileSelect);
+ }
+
+ result = LayoutArcManager::sInstance->ensureLoaded2(sSkb);
+ if (result != -2) {
+ if (result != 0) {
+ return NOT_READY;
+ }
+ LayoutArcManager::sInstance->decrement(sSkb);
+ }
+
+ // TODO here's the other half of the ::destroy fakematch...
+ if (mpSkbArc->mStatus != 0) {
+ mDvd_command_c::destroy((mDvd_command_c **)&mpSkbArc);
+ } else {
+ return NOT_READY;
+ }
+
+ if (mpSkbFont->mStatus != 0) {
+ mDvd_command_c::destroy((mDvd_command_c **)&mpSkbFont);
+ } else {
+ return NOT_READY;
+ }
+
+ dScGame_c::doDelete();
+ fn_80015E80();
+ return SUCCEEDED;
+}
+
+int dScTitle_c::draw() {
+ dScGame_c::draw();
+ return SUCCEEDED;
+}
+
+extern "C" u32 TITLE_SCREEN_CHANGE;
+void dScTitle_c::loadTitleScreen(u32 params) {
+ FileManager::sInstance->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::sInstance;
+ 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;
+}
diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp
index ef9eaf92..302892bd 100644
--- a/src/d/lyt/meter/d_lyt_meter.cpp
+++ b/src/d/lyt/meter/d_lyt_meter.cpp
@@ -1,11 +1,13 @@
// clang-format off
#include "common.h"
+#include "d/d_sc_game.h"
+#include "d/d_sc_title.h"
#include "d/lyt/d_lyt_area_caption.h"
#include "d/lyt/d_lyt_meter_configuration.h"
#include "d/lyt/d_window.h"
#include "d/lyt/meter/d_lyt_meter.h"
+#include "toBeSorted/stage_manager.h"
#include "toBeSorted/arc_managers/layout_arc_manager.h"
-#include "toBeSorted/scgame.h"
// clang-format on
static dLytMeterConfiguration_c sConf;
@@ -277,7 +279,6 @@ void floats2() {
dLytMeter_c::dLytMeter_c() {}
#pragma dont_inline reset
-extern "C" void *GLOBAL_TITLE_RELOADER;
extern "C" void fn_800D97E0(int i);
extern "C" void fn_800D9800(int i);
extern "C" void fn_801B2D10(void *);
@@ -322,10 +323,6 @@ static const d2d::LytBrlanMapping meterBrlanMap[] = {
{"basicPosition_00_rupyPosition.brlan", "G_rupyPosi_00"},
};
-extern "C" void *STAGE_MANAGER;
-extern "C" bool StageManager__isAreaTypeSky(void *stageMgr);
-extern "C" bool StageManager__isAreaTypeDungeon(void *stageMgr);
-
bool dLytMeter_c::build(d2d::ResAccIf_c *resAcc) {
mLyt.setResAcc(resAcc);
mLyt.build("basicPosition_00.brlyt", nullptr);
@@ -341,7 +338,7 @@ bool dLytMeter_c::build(d2d::ResAccIf_c *resAcc) {
// out G_shield_00
mShield.setContainerGroup(&mAnmGroups[28]);
- if (GLOBAL_TITLE_RELOADER == nullptr) {
+ if (dScTitle_c::sInstance == nullptr) {
mp1Button = new dLytMeter1Button_c();
mp2Button = new dLytMeter2Button_c();
} else {
@@ -406,7 +403,7 @@ bool dLytMeter_c::build(d2d::ResAccIf_c *resAcc) {
mpTimerPart2 = nullptr;
}
- if (GLOBAL_TITLE_RELOADER == nullptr && StageManager__isAreaTypeSky(STAGE_MANAGER)) {
+ if (dScTitle_c::sInstance == nullptr && dStageMgr_c::GetInstance()->isAreaTypeSky()) {
mpSkyGauge = new dLytSkyGauge_c();
mpSkyGauge->build(resAcc);
@@ -417,38 +414,38 @@ bool dLytMeter_c::build(d2d::ResAccIf_c *resAcc) {
mpBirdGauge = nullptr;
}
- if (ScGame::currentSpawnInfo.stageName == "F401") {
+ if (dScGame_c::currentSpawnInfo.stageName == "F401") {
mpBossGauge = new dLytBossGauge_c();
mpBossGauge->build();
} else {
mpBossGauge = nullptr;
}
- if (ScGame::isCurrentStage("F200") || ScGame::isCurrentStage("F210") || ScGame::isCurrentStage("F211")) {
+ if (dScGame_c::isCurrentStage("F200") || dScGame_c::isCurrentStage("F210") || dScGame_c::isCurrentStage("F211")) {
mpKakeraKey = new dLytMeterKakeraKey_c();
mpKakeraKey->build(resAcc);
} else {
mpKakeraKey = nullptr;
}
- if (!StageManager__isAreaTypeDungeon(STAGE_MANAGER) || ScGame::currentSpawnInfo.stageName == "F100_1" ||
- ScGame::currentSpawnInfo.stageName == "F103_1") {
+ if (!dStageMgr_c::GetInstance()->isAreaTypeDungeon() || dScGame_c::currentSpawnInfo.stageName == "F100_1" ||
+ dScGame_c::currentSpawnInfo.stageName == "F103_1") {
mpBossKey = nullptr;
} else {
mpBossKey = new dLytMeterBossKey_c();
mpBossKey->build(resAcc);
}
- if (StageManager__isAreaTypeDungeon(STAGE_MANAGER) &&
- (!(ScGame::currentSpawnInfo.stageName == "F100_1") && !(ScGame::currentSpawnInfo.stageName == "F103_1")) ||
- ScGame::currentSpawnInfo.stageName == "F302" || ScGame::currentSpawnInfo.stageName == "F302") {
+ if (dStageMgr_c::GetInstance()->isAreaTypeDungeon() &&
+ (!(dScGame_c::currentSpawnInfo.stageName == "F100_1") && !(dScGame_c::currentSpawnInfo.stageName == "F103_1")) ||
+ dScGame_c::currentSpawnInfo.stageName == "F302" || dScGame_c::currentSpawnInfo.stageName == "F302") {
mpSmallKey = new dLytMeterSmallKey_c();
mpSmallKey->build(resAcc);
} else {
mpSmallKey = nullptr;
}
- if (GLOBAL_TITLE_RELOADER != nullptr) {
+ if (dScTitle_c::sInstance != nullptr) {
mpDrink = nullptr;
} else {
mpDrink = new dLytMeterDrink_c();
@@ -597,7 +594,7 @@ dLytMeterContainer_c::dLytMeterContainer_c() {
bool dLytMeterContainer_c::build() {
void *data = LayoutArcManager::sInstance->getLoadedData("DoButton");
mResAcc.attach(data, "");
- if (GLOBAL_TITLE_RELOADER != nullptr) {
+ if (dScTitle_c::sInstance != nullptr) {
mpEventSkip = nullptr;
} else {
mpEventSkip = new dLytMeterEventSkip_c();
@@ -609,7 +606,7 @@ bool dLytMeterContainer_c::build() {
dLytAreaCaption_c::create();
mMeter.build(&mResAcc);
- if (GLOBAL_TITLE_RELOADER != nullptr) {
+ if (dScTitle_c::sInstance != nullptr) {
mpDoButton = nullptr;
mpDoButtonRelated = nullptr;
mpBirdRelated = nullptr;
diff --git a/src/d/tg/d_t_switch.cpp b/src/d/tg/d_t_switch.cpp
index 22e358fc..f3385cf8 100644
--- a/src/d/tg/d_t_switch.cpp
+++ b/src/d/tg/d_t_switch.cpp
@@ -1,9 +1,9 @@
#include "d/t/d_t_switch.h"
+#include "d/d_sc_game.h"
#include "d/flag/sceneflag_manager.h"
#include "s/s_Math.h"
#include "toBeSorted/event.h"
-#include "toBeSorted/scgame.h"
SPECIAL_ACTOR_PROFILE(SW_TAG, dTgSw_c, fProfile::SW_TAG, 0x24, 0, 0);
@@ -35,7 +35,7 @@ int dTgSw_c::create() {
mTrigSceneFlagIdEnd += (params >> 0x1C);
}
- if (ScGame::isCurrentStage("D201")) {
+ if (dScGame_c::isCurrentStage("D201")) {
if (roomid == 4) {
if (!SceneflagManager::sInstance->checkBoolFlag(roomid, 0x2F)) {
SceneflagManager::sInstance->unsetFlag(roomid, mSetSceneFlagId);
@@ -107,7 +107,7 @@ bool dTgSw_c::isPuzzleSolved() {
}
bool dTgSw_c::isLmfBossKeyPuzzle() {
- return ScGame::isCurrentStage("D300_1") && roomid == 8 && mSetSceneFlagId == 0x1C;
+ return dScGame_c::isCurrentStage("D300_1") && roomid == 8 && mSetSceneFlagId == 0x1C;
}
void dTgSw_c::initializeState_OnWait() {
diff --git a/src/toBeSorted/arc_managers/layout_arc_manager.cpp b/src/toBeSorted/arc_managers/layout_arc_manager.cpp
index b94dec1a..fd146e26 100644
--- a/src/toBeSorted/arc_managers/layout_arc_manager.cpp
+++ b/src/toBeSorted/arc_managers/layout_arc_manager.cpp
@@ -28,8 +28,8 @@ int LayoutArcManager::ensureLoaded1(const char *object) {
return mArcTable.ensureLoadedMaybe2(object);
}
-void LayoutArcManager::ensureLoaded2(const char *object) {
- mArcTable.ensureLoadedMaybe(object);
+int LayoutArcManager::ensureLoaded2(const char *object) {
+ return mArcTable.ensureLoadedMaybe(object);
}
bool LayoutArcManager::hasEntry(const char *object) {
diff --git a/src/toBeSorted/file_manager.cpp b/src/toBeSorted/file_manager.cpp
index 30853c27..8554415a 100644
--- a/src/toBeSorted/file_manager.cpp
+++ b/src/toBeSorted/file_manager.cpp
@@ -447,7 +447,7 @@ extern "C" void fn_800C01F0(); // todo flag managers
}
}
}
-/* 80011370 */ bool FileManager::isFileEmpty(int fileNum) {}
+/* 80011370 */ bool FileManager::isFileEmpty(u8 fileNum) {}
/* 80011390 */ bool FileManager::isFileDirty(int fileNum) {}
/* 800113B0 */ u8 FileManager::get_0xA84C() {}
/* 800113C0 */ bool FileManager::checkRegionCode() {}
@@ -464,5 +464,5 @@ bool FileManager::isFileInactive() const {
return false;
}
/* 80011500 */ void FileManager::setPlayerInfoFileA() {}
-/* 800115E0 */ void FileManager::setT3Info(mVec3_c *pos, mAng3_c *rot) {}
+/* 800115E0 */ void FileManager::setT3Info(const mVec3_c &pos, const mAng3_c &rot) {}
/* 800116C0 */ void FileManager::getRegionVersion(char *out) {}
diff --git a/src/toBeSorted/scgame.cpp b/src/toBeSorted/scgame.cpp
deleted file mode 100644
index 47c8875e..00000000
--- a/src/toBeSorted/scgame.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "toBeSorted/scgame.h"
-
-SpawnInfo ScGame::currentSpawnInfo = {};
-SpawnInfo ScGame::nextSpawnInfo = {};
-ScGame* ScGame::sInstance = nullptr;
diff --git a/src/toBeSorted/time_area_mgr.cpp b/src/toBeSorted/time_area_mgr.cpp
index 4c79ef7a..6a177e74 100644
--- a/src/toBeSorted/time_area_mgr.cpp
+++ b/src/toBeSorted/time_area_mgr.cpp
@@ -1,8 +1,8 @@
#include "toBeSorted/time_area_mgr.h"
#include "d/d_heap.h"
+#include "d/d_sc_game.h"
#include "nw4r/g3d/g3d_obj.h"
-#include "toBeSorted/scgame.h"
dTimeAreaMgr_c::dTimeAreaMgr_c() {
sInstance = this;
@@ -17,7 +17,7 @@ bool dTimeAreaMgr_c::init() {
mProcA.create(&mAllocator);
mProcB.create(&mAllocator);
mAllocator.adjustFrmHeap();
- mIsInLanayruMiningFacility = ScGame::isCurrentStage("D300") || ScGame::isCurrentStage("D300_1");
+ mIsInLanayruMiningFacility = dScGame_c::isCurrentStage("D300") || dScGame_c::isCurrentStage("D300_1");
return true;
}