diff options
| author | robojumper <robojumper@gmail.com> | 2025-03-09 10:07:44 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-09 10:07:44 +0100 |
| commit | c6b8a2dbaf85fef6d847b613eb2972b207ca77c4 (patch) | |
| tree | 90bbd89cc6e4632349622d94b69d0482b9fbb21d /src | |
| parent | 3461afd2b89de4db997726ce99c9c188677e03c4 (diff) | |
| parent | c176c969a4586d9ad4f535176ba85c2a2bb4e06e (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.cpp | 6 | ||||
| -rw-r--r-- | src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp | 10 | ||||
| -rw-r--r-- | src/REL/d/d_s_boot.cpp | 4 | ||||
| -rw-r--r-- | src/REL/d/t/d_t_genki_dws_tgt.cpp | 7 | ||||
| -rw-r--r-- | src/d/a/d_a_base.cpp | 4 | ||||
| -rw-r--r-- | src/d/col/bg/d_bg_s.cpp | 6 | ||||
| -rw-r--r-- | src/d/col/bg/d_bg_w.cpp | 4 | ||||
| -rw-r--r-- | src/d/col/bg/d_bg_w_kcol.cpp | 8 | ||||
| -rw-r--r-- | src/d/col/cc/d_cc_s.cpp | 5 | ||||
| -rw-r--r-- | src/d/d_sc_game.cpp | 325 | ||||
| -rw-r--r-- | src/d/d_sc_title.cpp | 218 | ||||
| -rw-r--r-- | src/d/lyt/meter/d_lyt_meter.cpp | 33 | ||||
| -rw-r--r-- | src/d/tg/d_t_switch.cpp | 6 | ||||
| -rw-r--r-- | src/toBeSorted/arc_managers/layout_arc_manager.cpp | 4 | ||||
| -rw-r--r-- | src/toBeSorted/file_manager.cpp | 4 | ||||
| -rw-r--r-- | src/toBeSorted/scgame.cpp | 5 | ||||
| -rw-r--r-- | src/toBeSorted/time_area_mgr.cpp | 4 |
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; } |
