diff options
Diffstat (limited to 'src/d')
| -rw-r--r-- | src/d/d_message.cpp | 21 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_control_game.cpp | 696 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_help.cpp | 12 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_map_markers.cpp | 2 | ||||
| -rw-r--r-- | src/d/lyt/d_lyt_pause.cpp | 4 | ||||
| -rw-r--r-- | src/d/lyt/meter/d_lyt_meter.cpp | 2 | ||||
| -rw-r--r-- | src/d/lyt/meter/d_lyt_meter_cross_btn.cpp | 5 | ||||
| -rw-r--r-- | src/d/lyt/msg_window/d_lyt_msg_window.cpp | 2 |
8 files changed, 719 insertions, 25 deletions
diff --git a/src/d/d_message.cpp b/src/d/d_message.cpp index f2343080..a031544e 100644 --- a/src/d/d_message.cpp +++ b/src/d/d_message.cpp @@ -431,13 +431,13 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { case 6: mapEvent = dLytMapMain_c::MAP_EVENT_FIELD_MAP_CHANGE_8; break; case 7: mapEvent = dLytMapMain_c::MAP_EVENT_GODDESS_CUBE; break; } - dMessage_c::getInstance()->setField_0x32C(mapEvent); + dMessage_c::getInstance()->setMapEvent(mapEvent); dMessage_c::getInstance()->setField_0x329(true); if (dMessage_c::getInstance()->getInMapEvent() == false) { dMessage_c::getInstance()->setInMapEvent(true); dMessage_c::getInstance()->clearLightPillarRelatedArgs(); - if (dLytControlGame_c::getInstance()->isStateNormalOrNotInEvent()) { - dLytControlGame_c::getInstance()->somehowRelatedToEnteringLightPillars( + if (dLytControlGame_c::getInstance()->isStateNotNormalOrInEvent()) { + dLytControlGame_c::getInstance()->openMapEvent( mapEvent, arg1, arg2 ); } @@ -450,18 +450,19 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { case EVENT_END_MAP_EVENT: { // TODO what do these modes do? if (params1n2 == 1) { + // Close map if (!dLytControlGame_c::getInstance()->isNotInStateMap()) { - dLytControlGame_c::getInstance()->fn_802CCD40(true); + dLytControlGame_c::getInstance()->setMapEventDone(true); } } else if (params1n2 == 2) { dMessage_c::getInstance()->setField_0x330(1); - if (dMessage_c::getInstance()->getField_0x32C() != 4 && - dMessage_c::getInstance()->getField_0x32C() != 12) { + if (dMessage_c::getInstance()->getMapEvent() != dLytMapMain_c::MAP_EVENT_DUNGEON_MAP_GET && + dMessage_c::getInstance()->getMapEvent() != dLytMapMain_c::MAP_EVENT_MAX) { dMessage_c::getInstance()->setField_0x32A(1); } } else { - if (dMessage_c::getInstance()->getField_0x32C() != 4 && - dMessage_c::getInstance()->getField_0x32C() != 12) { + if (dMessage_c::getInstance()->getMapEvent() != dLytMapMain_c::MAP_EVENT_DUNGEON_MAP_GET && + dMessage_c::getInstance()->getMapEvent() != dLytMapMain_c::MAP_EVENT_MAX) { dMessage_c::getInstance()->setField_0x32A(1); } } @@ -517,7 +518,7 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { break; case EVENT_DEMO_COLLECTION_SCREEN: if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { - dLytControlGame_c::getInstance()->openCollectionScreenDemo(); + dLytControlGame_c::getInstance()->openPauseDemo(); } break; } @@ -1767,7 +1768,7 @@ void dMessage_c::init() { mInMapEvent = false; field_0x329 = 0; field_0x32A = 0; - sInstance->setField_0x32C(12); + sInstance->setMapEvent(dLytMapMain_c::MAP_EVENT_MAX); field_0x330 = 0; } diff --git a/src/d/lyt/d_lyt_control_game.cpp b/src/d/lyt/d_lyt_control_game.cpp index 23c96f7d..357bc1ee 100644 --- a/src/d/lyt/d_lyt_control_game.cpp +++ b/src/d/lyt/d_lyt_control_game.cpp @@ -1,14 +1,706 @@ #include "d/lyt/d_lyt_control_game.h" #include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/a/d_a_player.h" +#include "d/d_base.h" +#include "d/d_cs_game.h" +#include "d/d_d2d.h" +#include "d/d_heap.h" +#include "d/d_message.h" +#include "d/d_rawarchive.h" +#include "d/d_sc_game.h" +#include "d/d_stage.h" +#include "d/d_stage_mgr.h" +#include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d_lyt_draw_mark.h" +#include "d/lyt/d_lyt_help.h" +#include "d/lyt/d_lyt_map.h" +#include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_lyt_pause.h" +#include "d/lyt/meter/d_lyt_meter.h" +#include "d/snd/d_snd_player_mgr.h" +#include "d/snd/d_snd_source_mgr.h" +#include "d/t/d_t_map_mark.h" +#include "f/f_base.h" +#include "f/f_manager.h" #include "f/f_profile_name.h" +#include "m/m2d.h" +#include "m/m_vec.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" +#include "toBeSorted/d_beacon.h" +#include "toBeSorted/event_manager.h" +#include "toBeSorted/raii_ptr.h" -SPECIAL_BASE_PROFILE(LYT_CONTROL_GAME, dLytControlGame_c, fProfile::LYT_CONTROL_GAME, 0x9, 96); +class dLytControlGame_HIO_c { +public: + dLytControlGame_HIO_c(); + virtual ~dLytControlGame_HIO_c(); -dLytControlGame_c::dLytControlGame_c() : mStateMgr(*this), field_0x15C24(0), field_0x15C28(0) { + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ s16 field_0x0C; + /* 0x0E */ u8 field_0x0E; + /* 0x0F */ u8 field_0x0F; +}; + +dLytControlGame_HIO_c sHio; + +dLytControlGame_HIO_c::dLytControlGame_HIO_c() : field_0x04(300.0f), field_0x08(1.0f), field_0x0E(1), field_0x0F(0) { + field_0x0C = 0x1F4; +} +dLytControlGame_HIO_c::~dLytControlGame_HIO_c() {} + +SPECIAL_BASE_PROFILE(LYT_CONTROL_GAME, dLytControlGame_c, fProfile::LYT_CONTROL_GAME, 0x2A9, 0x19); + +dLytControlGame_c *dLytControlGame_c::sInstance; + +STATE_DEFINE(dLytControlGame_c, Normal); +STATE_DEFINE(dLytControlGame_c, Pause_SetRes); +STATE_DEFINE(dLytControlGame_c, Pause_SyncRes); +STATE_DEFINE(dLytControlGame_c, Pause); +STATE_DEFINE(dLytControlGame_c, Pause_DelRes); +STATE_DEFINE(dLytControlGame_c, Map_SetRes); +STATE_DEFINE(dLytControlGame_c, Map_SyncRes); +STATE_DEFINE(dLytControlGame_c, Map); +STATE_DEFINE(dLytControlGame_c, Map_DelRes); + +void dLytControlGame_c::initializeState_Normal() {} +void dLytControlGame_c::executeState_Normal() {} +void dLytControlGame_c::finalizeState_Normal() {} + +static const char *const sMenuPause = "MenuPause"; +static const char *const sMap2D = "Map2D"; +static const char *const sMapField = "MapField"; +static const char *const sMapSky = "MapSky"; +static const char *const sCommonArrow = "CommonArrow"; + +void dLytControlGame_c::initializeState_Pause_SetRes() { + dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_PAUSE); + dBase_c::s_NextExecuteControlFlags |= BASE_PROP_0x1; + static const char *sLytArcs[] = {sMenuPause, sCommonArrow}; + mLytArcControl.set(sLytArcs, ARRAY_LENGTH(sLytArcs)); +} +void dLytControlGame_c::executeState_Pause_SetRes() { + mLytArcControl.load(nullptr); + mStateMgr.changeState(StateID_Pause_SyncRes); +} +void dLytControlGame_c::finalizeState_Pause_SetRes() {} + +void dLytControlGame_c::initializeState_Pause_SyncRes() {} +void dLytControlGame_c::executeState_Pause_SyncRes() { + if (!mLytArcControl.allLoaded()) { + return; + } + if (mpHelp != nullptr) { + return; + } + mStateMgr.changeState(StateID_Pause); +} +void dLytControlGame_c::finalizeState_Pause_SyncRes() {} + +void dLytControlGame_c::initializeState_Pause() { + dBase_c::createBase(fProfile::LYT_PAUSE, this, 0, OTHER); + if (dLytPauseMgr_c::GetInstance() == nullptr) { + return; + } + dLytPauseMgr_c::GetInstance()->inRequest(); + if (dCsGame_c::GetInstance()->shouldDraw()) { + dCsGame_c::GetInstance()->offNextCursor(); + } + mCommand = CMD_NONE; +} +void dLytControlGame_c::executeState_Pause() { + if (dLytPauseMgr_c::GetInstance() != nullptr && !dLytPauseMgr_c::GetInstance()->isActive()) { + mStateMgr.changeState(StateID_Pause_DelRes); + } +} +void dLytControlGame_c::finalizeState_Pause() {} + +void dLytControlGame_c::initializeState_Pause_DelRes() {} +void dLytControlGame_c::executeState_Pause_DelRes() { + if (!mLytArcControl.release()) { + return; + } + if (dLytPauseMgr_c::GetInstance() != nullptr) { + dLytPauseMgr_c::GetInstance()->deleteRequest(); + } + dSndSourceMgr_c::GetInstance()->fn_803852F0(); + mStateMgr.changeState(StateID_Normal); +} +void dLytControlGame_c::finalizeState_Pause_DelRes() { + dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_NONE); +} + +void dLytControlGame_c::initializeState_Map_SetRes() { + // Not sure if this is the right enum + if (!EventManager::isInEvent() || mMapEvent == dLytMapMain_c::MAP_EVENT_11) { + dBase_c::s_NextExecuteControlFlags |= BASE_PROP_0x10; + } + dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_MAP_INIT); +} +void dLytControlGame_c::executeState_Map_SetRes() { + LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(sMap2D, nullptr); + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(sMapSky, nullptr); + } else { + LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(sMapField, nullptr); + } + mStateMgr.changeState(StateID_Map_SyncRes); +} +void dLytControlGame_c::finalizeState_Map_SetRes() {} + +void dLytControlGame_c::initializeState_Map_SyncRes() {} +void dLytControlGame_c::executeState_Map_SyncRes() { + dArcResult_e result1 = LayoutArcManager::GetInstance()->ensureLoaded1(sMap2D); + dArcResult_e result2; + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + result2 = LayoutArcManager::GetInstance()->ensureLoaded1(sMapSky); + } else { + result2 = LayoutArcManager::GetInstance()->ensureLoaded1(sMapField); + } + if (result1 == D_ARC_RESULT_OK && result2 == D_ARC_RESULT_OK) { + mStateMgr.changeState(StateID_Map); + } +} +void dLytControlGame_c::finalizeState_Map_SyncRes() {} + +void dLytControlGame_c::setMapEventDone(bool b) { + mpMap->setMapEventDone(b); +} + +void dLytControlGame_c::initializeState_Map() { + mpMap = new (dHeap::layoutEx2Heap.heap) dLytMap_c(); + mpMap->build(); + mpMap->startMapEvent(mMapEvent, mMapEventArg1, mMapEventArg2); + dLytMapGlobal_c::GetInstance()->setInMapEvent(mMapEvent != dLytMapMain_c::MAP_EVENT_NONE); +} +void dLytControlGame_c::executeState_Map() { + if (dLytMap_c::GetInstance()->isOpen()) { + if (dLytMeter_c::GetInstance()->getMeterField_0x13750() != dLytMeterMain_c::MODE_MAP) { + dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_MAP); + if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_PLUS_BTN_NOTICE)) { + StoryflagManager::sInstance->unsetFlag(STORYFLAG_PLUS_BTN_NOTICE); + } + } + if (dLytMeter_c::GetInstance()->getBasicPosition() != dLytMeterMain_c::POSITION_MAP) { + dLytMeter_c::GetInstance()->setBasicPosition(dLytMeterMain_c::POSITION_MAP); + } + } + + if (mpMap->checkClose()) { + mpMap->close(); + if (dMessage_c::getInstance()->getField_0x330()) { + checkForBeaconNextToMark(); + } + mStateMgr.changeState(StateID_Map_DelRes); + } + + if (mpMap->isMapIntroDone()) { + mStateMgr.changeState(StateID_Map_DelRes); + } + mpMap->execute(); +} +void dLytControlGame_c::finalizeState_Map() {} + +void dLytControlGame_c::initializeState_Map_DelRes() {} +void dLytControlGame_c::executeState_Map_DelRes() { + // Maybe an inline + if (dLytMap_c::GetInstance()->isVisible()) { + mpMap->execute(); + return; + } + + dArcResult_e result1 = LayoutArcManager::GetInstance()->ensureLoaded1(sMap2D); + dArcResult_e result2; + + if (result1 != D_ARC_RESULT_ERROR_NOT_FOUND) { + if (result1 != D_ARC_RESULT_OK) { + return; + } + if (LayoutArcManager::GetInstance()->decrement(sMap2D)) { + if (mpMap != nullptr) { + mpMap->remove(); + mpMap.destruct(); + m2d::setLytAllocator(); + } + dSndSourceMgr_c::GetInstance()->fn_803852F0(); + mStateMgr.changeState(StateID_Normal); + } + } + + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + result2 = LayoutArcManager::GetInstance()->ensureLoaded1(sMapSky); + } else { + result2 = LayoutArcManager::GetInstance()->ensureLoaded1(sMapField); + } + + if (result2 != D_ARC_RESULT_ERROR_NOT_FOUND) { + if (result2 != D_ARC_RESULT_OK) { + return; + } + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + LayoutArcManager::GetInstance()->decrement(sMapSky); + } else { + LayoutArcManager::GetInstance()->decrement(sMapField); + } + } +} +void dLytControlGame_c::finalizeState_Map_DelRes() { + dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_NONE); + dLytMeter_c::GetInstance()->setBasicPosition(dLytMeterMain_c::POSITION_NORMAL); + dMessage_c::getInstance()->setMapEvent(dLytMapMain_c::MAP_EVENT_MAX); +} + +dLytControlGame_c::dLytControlGame_c() : mStateMgr(*this), mCommand(CMD_NONE), mHelpTextIndex(0) { sInstance = this; } dLytControlGame_c::~dLytControlGame_c() { sInstance = nullptr; } + +int dLytControlGame_c::create() { + if (dStage_c::GetInstance() == nullptr) { + return NOT_READY; + } + dLytMap_c::initMapState(); + mMeter.build(); + mMsgWindow.build(); + mSimpleWindow.build(); + mWipe.build(); + + dBase_c::createBase(fProfile::LYT_ENEMY_ICON, this, 0, OTHER); + dBase_c::createBase(fProfile::LYT_DROP_LINE, this, 0, OTHER); + dBase_c::createBase(fProfile::LYT_FORCE_LINE, this, 0, OTHER); + dBase_c::createBase(fProfile::LYT_SAVE_MGR, this, 0, OTHER); + + if (dScGame_c::currentSpawnInfo.stageName == "F103_1" || dScGame_c::currentSpawnInfo.stageName == "t_tkm26" || + dScGame_c::currentSpawnInfo.stageName == "F103" || dScGame_c::currentSpawnInfo.stageName == "t_tkm24") { + dBase_c::createBase(fProfile::LYT_SUIRYU_SCORE, this, 0, OTHER); + dBase_c::createBase(fProfile::LYT_SUIRYU_SCORE_COMP, this, 0, OTHER); + } else if (dScGame_c::isCurrentStage("B301")) { + dBase_c::createBase(fProfile::LYT_DEMO_DOWSING, this, 0, OTHER); + } + + mCommand = CMD_NONE; + mHelpTextIndex = 0; + + StoryflagManager *mgr = StoryflagManager::sInstance; + + mCurrentPauseDisp = mgr->getCounterOrFlag(STORYFLAG_ON_COLLECTION_SCREEN); + mPauseDisp00Tab = mgr->getCounterOrFlag(STORYFLAG_SAVED_DISP00_TAB); + + field_0x15C66 = 0; + mIsPauseDemo = false; + + mItemForPauseDemo = 0; + mPickupItemCount = 0; + mItemCountForPauseDemo = 0; + mPauseDemoDisp = 0; + + mStateMgr.changeState(StateID_Normal); + + mpHelp = nullptr; + mpDrawMark = nullptr; + + field_0x15C54 = 0; + field_0x15C58 = 0; + + return SUCCEEDED; +} + +int dLytControlGame_c::doDelete() { + if (!releaseRes()) { + return NOT_READY; + } + if (!decrementRes()) { + return NOT_READY; + } + mMsgWindow.remove(); + mSimpleWindow.remove(); + mMeter.remove(); + mWipe.remove(); + if (mpHelp != nullptr) { + mpHelp->remove(); + delete mpHelp; + mpHelp = nullptr; + } + if (mpDrawMark != nullptr) { + mpDrawMark->remove(); + delete mpDrawMark; + mpDrawMark = nullptr; + } + + if (mpMap != nullptr) { + mpMap->remove(); + mpMap.destruct(); + m2d::setLytAllocator(); + } + + return SUCCEEDED; +} + +int dLytControlGame_c::execute() { + if (!isInSomeMapState()) { + mFootprintsMgr.setFootstepMinDistSq(sHio.field_0x04 * sHio.field_0x04); + mFootprintsMgr.execute(); + } + + if (*mStateMgr.getStateID() == StateID_Normal) { + fn_802CFA90(); + } else { + if (dCsGame_c::GetInstance() != nullptr) { + dCsGame_c::GetInstance()->setField_0x9A2(true); + } + } + + if (mpDrawMark != nullptr) { + if (field_0x15C54 == 0) { + mpDrawMark->setField_0x941(1); + } + mpDrawMark->execute(); + if (mpDrawMark->getField_0x940() != 0) { + mpDrawMark->remove(); + delete mpDrawMark; + mpDrawMark = nullptr; + } + } else { + if (field_0x15C54 != 0) { + mpDrawMark = new dLytDrawMark_c(); + mpDrawMark->build(field_0x15C58); + } + } + + mMeter.execute(); + mMsgWindow.execute(); + mSimpleWindow.execute(); + mWipe.execute(); + + if (mpHelp != nullptr) { + mpHelp->execute(); + + if (dLytHelp_c::GetInstance() != nullptr) { + if (mpHelp->isStateEnd()) { + mpHelp->remove(); + delete mpHelp; + mpHelp = nullptr; + } + } + } + + mStateMgr.executeState(); + + return SUCCEEDED; +} + +int dLytControlGame_c::draw() { + mMeter.draw(); + // okay + if (dLytMap_c::GetInstance() != nullptr && dLytMap_c::GetInstance() != nullptr) { + mpMap->draw(); + } + mMsgWindow.draw(); + mSimpleWindow.addToDrawList(); + mWipe.draw(); + if (mpHelp != nullptr) { + mpHelp->draw(); + } + if (mpDrawMark != nullptr) { + mpDrawMark->draw(); + } + return SUCCEEDED; +} + +bool dLytControlGame_c::checkStoryflag(s32 flag) const { + return StoryflagManager::sInstance->getCounterOrFlag(flag); +} + +void dLytControlGame_c::fn_802CFA90() { + if (mCommand != CMD_NONE) { + if (dLytMeter_c::GetInstance()->itemSelectFn800EFDF0(true) || + dLytMeter_c::GetInstance()->minusBtnFn800F7600() || dLytMeter_c::GetInstance()->dowsingFn800FE4B0()) { + mCommand = CMD_NONE; + return; + } + + if (!mIsEvent && !EventManager::fn_8009F990() && mCommand != CMD_HELP) { + mCommand = CMD_NONE; + } + } + + if (mCommand == CMD_MAP) { + if (mMapEvent == dLytMapMain_c::MAP_EVENT_SAVE_OBJ) { + mCommand = CMD_NONE; + } + bool b = false; + if (dLytMap_c::GetInstance() != nullptr) { + b = dLytMap_c::GetInstance()->isVisible(); + } + + if (!b) { + mStateMgr.changeState(StateID_Map_SetRes); + dSndPlayerMgr_c::GetInstance()->enterMap(); + dSndSourceMgr_c::GetInstance()->fn_803852B0(); + hideHelp(); + dLytMeter_c::setPlusBtnCall(false); + } + mCommand = CMD_NONE; + } + + if (mCommand == CMD_PAUSE) { + mStateMgr.changeState(StateID_Pause_SetRes); + dSndPlayerMgr_c::GetInstance()->enterMenu(); + dSndSourceMgr_c::GetInstance()->fn_803852B0(); + hideHelp(); + mCommand = CMD_NONE; + } + + if (mCommand == CMD_HELP) { + if (mpHelp == nullptr) { + mpHelp = new dLytHelp_c(); + mpHelp->build(); + } + if (dLytHelp_c::GetInstance() != nullptr) { + mpHelp->setText(mHelpTextIndex); + mCommand = CMD_NONE; + } + } +} + +void dLytControlGame_c::hideHelp() { + if (dLytHelp_c::GetInstance() != nullptr) { + mpHelp->requestOut(); + } +} + +void dLytControlGame_c::changeHelpText(s32 textIndex) { + if (dLytHelp_c::GetInstance() != nullptr) { + mpHelp->changeText(textIndex); + } +} + +bool dLytControlGame_c::isStateNotNormalOrInEvent() const { + if (*mStateMgr.getStateID() != StateID_Normal) { + return false; + } + return EventManager::isInEvent(); +} + +bool dLytControlGame_c::isInSomeMapState() const { + bool ret = false; + const sStateIDIf_c &id = *mStateMgr.getStateID(); + if (id == StateID_Map_SetRes || id == StateID_Map_SyncRes || id == StateID_Map || id == StateID_Map_DelRes) { + ret = true; + } + return ret; +} + +bool dLytControlGame_c::isNotInStateMap() const { + return !(*mStateMgr.getStateID() == StateID_Map); +} + +bool dLytControlGame_c::fn_802CFF60() const { + bool ret = false; + const sStateIDIf_c &id = *mStateMgr.getStateID(); + if (id == StateID_Map_SetRes || id == StateID_Map_SyncRes) { + ret = true; + } + return ret; +} + +void dLytControlGame_c::openMap() { + mCommand = CMD_MAP; + mMapEvent = dLytMapMain_c::MAP_EVENT_NONE; + mIsEvent = false; +} + +void dLytControlGame_c::openMapEvent(s32 mapEvent, s32 arg1, s32 arg2) { + mCommand = CMD_MAP; + mMapEvent = mapEvent; + mIsEvent = true; + mMapEventArg1 = arg1; + mMapEventArg2 = arg2; + + if (mapEvent != dLytMapMain_c::MAP_EVENT_SAVE_OBJ) { + return; + } + + bool showStatueSelect = true; + u8 exitId = 0; + + if (dAcPy_c::GetLinkM()->getPosition().z > -78700.0f && dAcPy_c::GetLinkM()->getPosition().z < -76700.0f) { + mMapEventArg1 = dLytMapMain_c::SURFACE_PROVINCE_ELDIN; + if (!checkStoryflag(STORYFLAG_ELDIN_DISCOVERED)) { + exitId = 1; + showStatueSelect = false; + } + } else if (dAcPy_c::GetLinkM()->getPosition().z > 62800.0f && dAcPy_c::GetLinkM()->getPosition().z < 64800) { + mMapEventArg1 = dLytMapMain_c::SURFACE_PROVINCE_LANAYRU; + if (!checkStoryflag(STORYFLAG_LANAYRU_DISCOVERED)) { + exitId = 2; + showStatueSelect = false; + } + } else { + mMapEventArg1 = dLytMapMain_c::SURFACE_PROVINCE_FARON; + if (!checkStoryflag(STORYFLAG_FARON_DISCOVERED)) { + exitId = 0; + showStatueSelect = false; + } + } + + if (mMapEventArg1 == dLytMapMain_c::SURFACE_PROVINCE_FARON && checkStoryflag(STORYFLAG_HARP_CUTSCENE) && + !checkStoryflag(STORYFLAG_GROOSE_LANDS_IN_FARON)) { + // Forced descent to Sealed Grounds with Groose + exitId = 15; + showStatueSelect = false; + } else if (mMapEventArg1 == dLytMapMain_c::SURFACE_PROVINCE_ELDIN && + checkStoryflag(STORYFLAG_ELDIN_VOLCANO_CAN_ERUPT) && !checkStoryflag(STORYFLAG_BOKO_BASE_BEATEN)) { + // Forced descent to Boko Base + exitId = 8; + showStatueSelect = false; + } else if (mMapEventArg1 == dLytMapMain_c::SURFACE_PROVINCE_ELDIN && + checkStoryflag(STORYFLAG_SCRAPPER_HAS_WATER_BASIN) && + !checkStoryflag(STORYFLAG_SUMMIT_BIG_FROG_WATERED) && + !checkStoryflag(STORYFLAG_WATER_BASIN_ESCORT_STARTED)) { + // Forced descent to Eldin entry with Scrapper and the water basin + exitId = 1; + showStatueSelect = false; + } else if (checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && !checkStoryflag(STORYFLAG_WATER_DRAGON_SOTH_PART)) { + // TODO: When is this condition hit? showStatueSelect is only false here if we haven't discovered a surface + // province, but with Levias beaten we should've set foot in each province + showStatueSelect = true; + } + + if (!showStatueSelect) { + dScGame_c::GetInstance()->triggerExit(dAcPy_c::GetLink()->mRoomID, exitId); + mCommand = CMD_NONE; + } +} + +void dLytControlGame_c::openPause() { + if (canOpenPause() == true) { + mCommand = CMD_PAUSE; + mIsEvent = false; + mIsPauseDemo = false; + } +} + +extern "C" dAcBase_c *getCurrentEventActor(); + +void dLytControlGame_c::openPauseDemo() { + if (canOpenPause() == true) { + dAcItem_c *item = static_cast<dAcItem_c *>(getCurrentEventActor()); + if (item != nullptr) { + mItemForPauseDemo = item->getItemId_i(); + mCommand = CMD_PAUSE; + mIsEvent = true; + mIsPauseDemo = true; + if (mItemForPauseDemo == ITEM_EXTRA_WALLET) { + mPauseDemoDisp = dLytPauseMgr_c::DISP_00_INVENTORY; + } else { + mPauseDemoDisp = dLytPauseMgr_c::DISP_01_COLLECTION; + } + mItemCountForPauseDemo = dAcItem_c::getCollectionCurrentCount(); + mPickupItemCount = item->getQuantity() != 0 ? item->getQuantity() : 1; + } + } +} + +void dLytControlGame_c::openHelp(s32 textIndex) { + if (dLytMeter_c::GetInstance()->itemSelectFn800EFDF0(true) || dLytMeter_c::GetInstance()->minusBtnFn800F7600() || + dLytMeter_c::GetInstance()->dowsingFn800FE4B0()) { + return; + } + + if (mpHelp == nullptr) { + mCommand = CMD_HELP; + mIsEvent = false; + mHelpTextIndex = textIndex; + } +} + +bool dLytControlGame_c::releaseRes() { + return mLytArcControl.release(); +} + +bool dLytControlGame_c::decrementRes() { + dArcResult_e result1 = LayoutArcManager::GetInstance()->ensureLoaded2(sMap2D); + if (result1 != D_ARC_RESULT_ERROR_NOT_FOUND) { + if (result1 != D_ARC_RESULT_OK) { + return false; + } + LayoutArcManager::GetInstance()->decrement(sMap2D); + } + + dArcResult_e result2; + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + result2 = LayoutArcManager::GetInstance()->ensureLoaded2(sMapSky); + } else { + result2 = LayoutArcManager::GetInstance()->ensureLoaded2(sMapField); + } + if (result2 != D_ARC_RESULT_ERROR_NOT_FOUND) { + if (result2 != D_ARC_RESULT_OK) { + return false; + } + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + LayoutArcManager::GetInstance()->decrement(sMapSky); + } else { + LayoutArcManager::GetInstance()->decrement(sMapField); + } + } + + return true; +} + +void dLytControlGame_c::fn_802D04F0() { + field_0x15C66 = 0; + d2d::defaultSet(); +} + +bool dLytControlGame_c::canOpenPause() { + if (dLytMeter_c::GetInstance()->itemSelectFn800EFDF0(true) || dLytMeter_c::GetInstance()->minusBtnFn800F7600() || + dLytMeter_c::GetInstance()->dowsingFn800FE4B0()) { + return false; + } + + if (mpHelp == nullptr || mpHelp->isWaiting()) { + return true; + } + + return false; +} + +void dLytControlGame_c::checkForBeaconNextToMark() { + fBase_c *base = nullptr; + bool found = false; + mVec3_c markPos; + while ((base = fManager_c::searchBaseByGroupType(STAGE, base)) != nullptr) { + if (base->mProfileName == fProfile::T_MAP_MARK) { + dTgMapMark_c *mark = static_cast<dTgMapMark_c *>(base); + if (!mark->checkActorProperty(dAcBase_c::AC_PROP_0x100) && mark->rotz_shift0_0xf == 0) { + found = true; + markPos = mark->mPosition; + } + } + } + + if (found) { + for (u32 i = 0; i < 5; i++) { + const mVec3_c *pos = getBeaconPosition(i); + if (pos != nullptr) { + mVec3_c diff = markPos - *pos; + if (diff.mag() <= sHio.field_0x0C) { + SceneflagManager::sInstance->setFlag(0x3F, 0x18); + } + } + } + } +} + +void dLytControlGame_c::resetFootsteps() { + mFootprintsMgr.reset(); +} diff --git a/src/d/lyt/d_lyt_help.cpp b/src/d/lyt/d_lyt_help.cpp index 1de1a71b..3ebfdf7f 100644 --- a/src/d/lyt/d_lyt_help.cpp +++ b/src/d/lyt/d_lyt_help.cpp @@ -345,7 +345,7 @@ void dLytHelp_c::finalizeState_None() {} void dLytHelp_c::initializeState_In() {} void dLytHelp_c::executeState_In() { if (mpMain->isIdle()) { - field_0x3C2 = true; + mIsWaiting = true; mpMain->modeRequestWait(); mStateMgr.changeState(StateID_Wait); field_0x3C8 = 0; @@ -355,7 +355,7 @@ void dLytHelp_c::finalizeState_In() {} void dLytHelp_c::initializeState_Wait() {} void dLytHelp_c::executeState_Wait() { - if (dPad::getDownTrig2() || dPad::getDownTrigMinus() || dPad::getDownTrigB() || field_0x3C1) { + if (dPad::getDownTrig2() || dPad::getDownTrigMinus() || dPad::getDownTrigB() || mOutRequest) { mpMain->modeRequestOut(); dSndPlayerMgr_c::GetInstance()->leaveHelp(); dLytMeter_c::GetInstance()->setHelpOpen(false); @@ -381,7 +381,7 @@ void dLytHelp_c::finalizeState_End() {} bool dLytHelp_c::setText(s32 textIndex) { if (*mStateMgr.getStateID() == StateID_None) { field_0x3C0 = true; - field_0x3C1 = false; + mOutRequest = false; if (textIndex <= ARRAY_LENGTH(sHelpTextKeys) - 1) { mTextIndex = textIndex; } else { @@ -497,7 +497,7 @@ void dLytHelp_c::changeText(s32 textIndex) { mpMain->setText(mTextIndex); } else if (mTextIndex != textIndex) { mTextIndex = textIndex; - field_0x3C1 = true; + mOutRequest = true; } } @@ -509,8 +509,8 @@ bool dLytHelp_c::build() { mpMain->build(&mResAcc); mStateMgr.changeState(StateID_None); field_0x3C0 = false; - field_0x3C1 = false; - field_0x3C2 = false; + mOutRequest = false; + mIsWaiting = false; mTextIndex = -1; field_0x3C8 = 0; m2d::setLytAllocator(); diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index d07d235a..4cb3abc2 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -1538,7 +1538,7 @@ void dLytMapIcon01_c::setupStageDrawCommands() { while ((ac = static_cast<dAcBase_c *>(fManager_c::searchBaseByGroupType(fBase_c::STAGE, ac))) != nullptr) { setupTgMapMarkDrawCommand(ac); - if (dLytMapGlobal_c::GetInstance()->getField_0x54()) { + if (dLytMapGlobal_c::GetInstance()->isInMapEvent()) { setupTgMapInstDrawCommand(ac); } diff --git a/src/d/lyt/d_lyt_pause.cpp b/src/d/lyt/d_lyt_pause.cpp index aa6cc565..8b11b9a8 100644 --- a/src/d/lyt/d_lyt_pause.cpp +++ b/src/d/lyt/d_lyt_pause.cpp @@ -559,7 +559,7 @@ void dLytPauseMgr_c::initializeState_None() { mPrevSelectionId = 0; field_0x083C = false; field_0x083D = false; - field_0x0836 = false; + mIsActive = false; field_0x0837 = false; field_0x0838 = false; mIsNavLeft = false; @@ -830,7 +830,7 @@ void dLytPauseMgr_c::finalizeState_Out() { void dLytPauseMgr_c::inRequest() { mInRequest = true; - field_0x0836 = 1; + mIsActive = true; } bool dLytPauseMgr_c::isStateWait() const { diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp index 3d7382b7..8c962391 100644 --- a/src/d/lyt/meter/d_lyt_meter.cpp +++ b/src/d/lyt/meter/d_lyt_meter.cpp @@ -1088,7 +1088,7 @@ bool dLytMeterMain_c::fn_800D56B0() { } if ((EventManager::isInEvent() && field_0x1377E == 0 && dAcPy_c::GetLink()->getCurrentAction() != 0x8C && - dMessage_c::getInstance()->getField_0x32C() == 0xC) || + dMessage_c::getInstance()->getMapEvent() == dLytMapMain_c::MAP_EVENT_MAX) || mHelpOpen) { return true; } diff --git a/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp b/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp index 34c25f6e..4144671b 100644 --- a/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp @@ -5,6 +5,7 @@ #include "d/d_message.h" #include "d/flag/storyflag_manager.h" #include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_map.h" #include "d/lyt/d_lyt_unknowns.h" #include "d/lyt/meter/d_lyt_meter.h" #include "d/snd/d_snd_small_effect_mgr.h" @@ -172,8 +173,8 @@ void dLytMeterCrossBtnParts_c::execute(bool bIsVisible) { mpLyt->calc(); } - if ((EventManager::isInEvent() && dMessage_c::getInstance()->getField_0x32C() == 12 && !checkIsInSkykeepPuzzle() && - !dLytMeter_c::GetInstance()->fn_800D5670()) || + if ((EventManager::isInEvent() && dMessage_c::getInstance()->getMapEvent() == dLytMapMain_c::MAP_EVENT_MAX && + !checkIsInSkykeepPuzzle() && !dLytMeter_c::GetInstance()->fn_800D5670()) || ((dLytMeter_c::getItemSelect0x75A2() && (mIndex != 1 || mCurrentIcon != 0)) || !bIsVisible)) { field_0x7C = 0; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window.cpp b/src/d/lyt/msg_window/d_lyt_msg_window.cpp index 7e3971c4..cd26b754 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window.cpp @@ -562,7 +562,7 @@ void dLytMsgWindow_c::finalizeState_MapOpen() {} void dLytMsgWindow_c::initializeState_WaitKeyMapClose() {} void dLytMsgWindow_c::executeState_WaitKeyMapClose() { if ((dPad::getDownTrigB() || dPad::getDownTrigPlus()) && !dLytControlGame_c::getInstance()->isNotInStateMap()) { - dLytControlGame_c::getInstance()->fn_802CCD40(true); + dLytControlGame_c::getInstance()->setMapEventDone(true); mStateMgr.changeState(StateID_MapClose); } } |
