From 126e026babdebf58cf291211b65e81f4056360b7 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 12 Oct 2025 20:58:47 +0200 Subject: [PATCH] A bit --- config/SOUE01/symbols.txt | 2 +- include/d/d_cs_game.h | 19 +++++ include/d/lyt/d_lyt_map.h | 18 +++-- src/d/lyt/d_lyt_map.cpp | 141 ++++++++++++++++++++++++++++++++------ 4 files changed, 152 insertions(+), 28 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 0c18db81..1a4ee276 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7993,7 +7993,7 @@ fn_80142B90 = .text:0x80142B90; // type:function size:0xEC fn_80142C80 = .text:0x80142C80; // type:function size:0x8C fn_80142D10__13dLytMapMain_cFlbR4mAng = .text:0x80142D10; // type:function size:0x80 fn_80142D90__13dLytMapMain_cFl = .text:0x80142D90; // type:function size:0x170 -fn_80142F00__13dLytMapMain_cFR7mVec3_clUcRC7mVec3_cRC4mAng = .text:0x80142F00; // type:function size:0x158 +fn_80142F00__13dLytMapMain_cFR7mVec3_clbRC7mVec3_cRC4mAng = .text:0x80142F00; // type:function size:0x158 fn_80143060__13dLytMapMain_cFR7mVec3_cRC7mVec3_cRC7mVec3_cRC4mAng = .text:0x80143060; // type:function size:0xBC fn_80143120__13dLytMapMain_cFl = .text:0x80143120; // type:function size:0xC0 fn_801431E0__13dLytMapMain_cFv = .text:0x801431E0; // type:function size:0x11C diff --git a/include/d/d_cs_game.h b/include/d/d_cs_game.h index 11c1373b..c81cac9b 100644 --- a/include/d/d_cs_game.h +++ b/include/d/d_cs_game.h @@ -75,6 +75,10 @@ public: mpResAcc = resAcc; } + void setPriorityDraw(u8 priority) { + mLyt.setPriority(priority); + } + private: /* 0x0C */ m2d::ResAccIf_c *mpResAcc; /* 0x10 */ d2d::LytBase_c mLyt; @@ -96,6 +100,10 @@ public: mpResAcc = resAcc; } + void setPriorityDraw(u8 priority) { + mLyt.setPriority(priority); + } + private: /* 0x0C */ m2d::ResAccIf_c *mpResAcc; /* 0x10 */ d2d::LytBase_c mLyt; @@ -344,6 +352,10 @@ public: mpResAcc = resAcc; } + void setPriorityDraw(u8 priority) { + mLyt.setPriority(priority); + } + void changeState(const sFStateID_c &newState); void pachinkoSetCharging(bool charging, f32 progress); @@ -356,6 +368,7 @@ public: void bowAimStart(); void bowReady(); + private: STATE_FUNC_DECLARE(lytItemCursor_c, Invisible); STATE_FUNC_DECLARE(lytItemCursor_c, Bow); @@ -439,6 +452,12 @@ public: return &mCursorIf; } + void setPriorityDraw(u8 priority) { + mLyt1.setPriorityDraw(priority); + mLyt2.setPriorityDraw(priority); + mCursor.setPriorityDraw(priority); + } + private: static dCsGame_c *sInstance; bool isForcedHidden() const; diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index e1f6a1a6..103d7191 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -20,6 +20,10 @@ #include "s/s_State.hpp" #include "toBeSorted/d_flow_mgr.h" +// TODO - this file uses a lot of `friend` classes because the necessary +// inlines might mess up weak function order. Let's get the order right +// first before introducing more problems... + class dAcTbox_c; /** Bird Statue Definition (StatueSelectDestination) */ @@ -294,6 +298,8 @@ private: }; class dLytMapFloorBtnMgr_c : public d2d::dSubPane { + friend class dLytMapMain_c; + public: dLytMapFloorBtnMgr_c(dLytMapGlobal_c *global) : mpGlobal(global), mpPane(nullptr), mStateMgr(*this, sStateID::null) { @@ -342,8 +348,8 @@ public: } void checkPointedAtBtn(); -private: +private: /* 0x008 */ dLytMapGlobal_c *mpGlobal; /* 0x00C */ UI_STATE_MGR_DECLARE(dLytMapFloorBtnMgr_c); /* 0x048 */ d2d::dLytSub mLyt; @@ -619,7 +625,7 @@ private: MAP_EVENT_SIGNAL_ADD = 7, MAP_EVENT_FIELD_MAP_CHANGE_8 = 8, MAP_EVENT_GODDESS_CUBE = 9, - MAP_EVENT_SAVE_OBJ_MSG_WINDOW = 10, + MAP_EVENT_SAVE_OBJ = 10, MAP_EVENT_11 = 11, }; @@ -643,7 +649,7 @@ private: s32 getSelectedSaveObjIdx() const; f32 fn_80142D90(s32); - void fn_80142F00(mVec3_c &, s32 mapMode, u8, const mVec3_c &, const mAng &); + void fn_80142F00(mVec3_c &, s32 mapMode, bool, const mVec3_c &, const mAng &); void fn_8013FB70(const mVec3_c &, f32); bool fn_80141530() const; bool fn_80142D10(s32, bool, mAng &); @@ -723,7 +729,7 @@ private: /* 0x8324 */ u8 _0x8324[0x8328 - 0x8324]; - /* 0x8328 */ d2d::AnmGroup_c *mpOutAnmGroup; + /* 0x8328 */ d2d::AnmGroup_c *mpInOutAnmGroup; // TODO - it appears the map abuses these hit check things // to calculate Lyt bounding boxes, and it stores the @@ -762,7 +768,7 @@ private: /* 0x8C7C */ f32 field_0x8C7C; /* 0x8C80 */ f32 field_0x8C80; - /* 0x8C84 */ u8 _0x8C84[0x8C88 - 0x8C84]; + /* 0x8C84 */ u8 field_0x8C84; /* 0x8C88 */ f32 field_0x8C88; /* 0x8C8C */ f32 field_0x8C8C; @@ -892,7 +898,7 @@ public: } bool isSomeMapFieldEq10() const { - return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SAVE_OBJ_MSG_WINDOW; + return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SAVE_OBJ; } void lightPillarRelated(s32 p1, s32 p2, s32 p3) { diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index e7357640..8c3fb499 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -2400,7 +2400,7 @@ void dLytMapMain_c::loadStageProperties() { void dLytMapMain_c::setupStage() { loadStageProperties(); - if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { mLyt.findPane("N_skyloft_00")->SetVisible(false); } @@ -2468,7 +2468,7 @@ void dLytMapMain_c::setupStage() { if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { mLyt.findPane("N_houkoul_00")->SetVisible(false); } - if (mMapEvent != MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + if (mMapEvent != MAP_EVENT_SAVE_OBJ) { loadTextboxes(); } fn_8013AD50(); @@ -2659,7 +2659,7 @@ void dLytMapMain_c::execute() { } } - if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { bool visible = mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE; setSaveObjsVisible(visible); @@ -2721,13 +2721,13 @@ void dLytMapMain_c::draw() { mpScaleFramePane->SetVisible(mDrawScaleFrame ? true : false); mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo()); if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && - mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + mMapEvent == MAP_EVENT_SAVE_OBJ) { initSaveObjs(); } fn_80143120(-2); mMarkers.drawPopups(); mPutIcon.draw(); - if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { mPopupInfo.draw(); } @@ -3052,7 +3052,7 @@ void dLytMapMain_c::setButtonMessages( void dLytMapMain_c::setCursorType() { if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode)) { - if ((mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW || + if ((mMapEvent == MAP_EVENT_SAVE_OBJ || ((mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON) && mPointerOnMap)) || (mPointerCanPlaceBeacon && isPointingAtMainMap()) || (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) || @@ -3530,17 +3530,116 @@ void dLytMapMain_c::setupFlags() { } } -void dLytMapMain_c::initializeState_In() {} +void dLytMapMain_c::initializeState_In() { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + displaySaveObjs(); + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + mPopupInfo.mStateMgr.changeState(dLytMapPopupInfo_c::StateID_In); + } + } + + if (field_0x8CAD != 0 || mMapEvent == MAP_EVENT_MAP_INTRO) { + mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN]; + } else { + mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN_NO_CAM]; + } + + field_0x8C88 = mpInOutAnmGroup->getLastFrame(); + mpInOutAnmGroup->bind(false); + mpInOutAnmGroup->setFrame(0.0f); + mPinIconAggregate.setScale(getGlobal()->getZoomFrame()); +} void dLytMapMain_c::executeState_In() { field_0x8DBF = 1; + dLytMapGlobal_c *global = getGlobal(); - // TODO this should explain most of mMapEvent + if ((!field_0x8CAD || !field_0x8C84) && field_0x8CAD) { + return; + } + + f32 ratio = (mpInOutAnmGroup->getFrame() / mpInOutAnmGroup->getLastFrame()); + + f32 f1 = fn_80142D90(mCurrentMapMode) * 2.0f; + f32 f2 = fn_80142D90(mCurrentMapMode); + f32 f3 = cLib::easeOut(ratio, 3.0f); + global->setField_0x44(f1 + f3 * (f2 - f1)); + + mVec3_c v1; + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + fn_80142F00(v1, mCurrentMapMode, true, global->getMapRotationCenter(), global->getField_0x56()); + } else { + fn_80142F00(v1, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + } + global->setMapScroll(v1); + if (mpInOutAnmGroup->isEndReached()) { + dCsGame_c::GetInstance()->setPriorityDraw(0x8A); + mLyt.getLayout()->Animate(0); + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_IN].unbind(); + mpInOutAnmGroup->unbind(); + for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { + mHitChecks[i].resetCachedHitboxes(); + mHitChecks[i].execute(); + } + + switch (mMapEvent) { + default: { + mFloorBtnMgr.mStateMgr.changeState(dLytMapFloorBtnMgr_c::StateID_Wait); + mStateMgr.changeState(StateID_Active); + break; + } + case MAP_EVENT_SW_BANK_SMALL: { + mStateMgr.changeState(StateID_EventSwBankSmall_Step1); + break; + } + case MAP_EVENT_MAP_INTRO: { + mStateMgr.changeState(StateID_EventMapIntro_Step1); + break; + } + case MAP_EVENT_DUNGEON_MAP_GET: { + mStateMgr.changeState(StateID_EventDungeonMapGet_Step1); + break; + } + case MAP_EVENT_FIELD_MAP_CHANGE_5: + case MAP_EVENT_FIELD_MAP_CHANGE_8: { + mStateMgr.changeState(StateID_EventFieldMapChange_Step1); + break; + } + case MAP_EVENT_FOREST_MAP_CHANGE: { + mStateMgr.changeState(StateID_EventForestMapChange_Step1); + break; + } + case MAP_EVENT_SIGNAL_ADD: { + mStateMgr.changeState(StateID_EventSignalAdd_Step1); + break; + } + case MAP_EVENT_GODDESS_CUBE: { + mStateMgr.changeState(StateID_EventGoddessCube_Step1); + break; + } + case MAP_EVENT_SAVE_OBJ: { + displaySaveObjs(); + mStateMgr.changeState(StateID_EventSaveObjMsgWindow); + break; + } + } + } + + if (mpInOutAnmGroup->isBound()) { + mpInOutAnmGroup->play(); + } +} +void dLytMapMain_c::finalizeState_In() { + if (fn_80141530()) { + dBase_c::s_NextExecuteControlFlags |= dBase_c::BASE_PROP_0x10; + } + dBase_c::s_DrawControlFlags |= dBase_c::BASE_PROP_0x10; } -void dLytMapMain_c::finalizeState_In() {} s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { s32 ret = AREAGROUP_MAX; - if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { switch (mSurfaceProvince) { case SURFACE_PROVINCE_FARON: ret = AREAGROUP_FARON; break; case SURFACE_PROVINCE_ELDIN: ret = AREAGROUP_ELDIN; break; @@ -3569,7 +3668,7 @@ s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { s32 dLytMapMain_c::getRoomType() const { s32 ret = ROOMTYPE_FIELD; s32 stifRoomType = dStageMgr_c::GetInstance()->getSTIFRoomType(); - if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { ret = ROOMTYPE_FIELD; } @@ -3935,19 +4034,19 @@ void dLytMapMain_c::finalizeState_Active() { } void dLytMapMain_c::initializeState_Out() { - if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { mPopupInfo.mStateMgr.changeState(StateID_Out); } dLytMeter_c::GetInstance()->setMeterField_0x13750(0); if (field_0x8CAD || mMapEvent == MAP_EVENT_MAP_INTRO) { - mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT]; + mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT]; } else { - mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM]; + mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM]; } - mpOutAnmGroup->bind(false); - mpOutAnmGroup->setFrame(0.0f); - field_0x8C8C = mpOutAnmGroup->getLastFrame(); + mpInOutAnmGroup->bind(false); + mpInOutAnmGroup->setFrame(0.0f); + field_0x8C8C = mpInOutAnmGroup->getLastFrame(); if (fn_80141530()) { dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; @@ -3956,20 +4055,20 @@ void dLytMapMain_c::initializeState_Out() { dPadNav::setNavEnabled(false, false); } void dLytMapMain_c::executeState_Out() { - if (mpOutAnmGroup->isEndReached()) { + if (mpInOutAnmGroup->isEndReached()) { bool specialMode = isSomeFieldEq0Or1Or7Or9Or11(); // Kind of a weird way to write `specialMode || ... != 3 ` if ((specialMode && dScGame_c::getCamera(0)->getField_0xDA8() != 3) || !specialMode) { dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; mLyt.calc(); - mpOutAnmGroup->unbind(); + mpInOutAnmGroup->unbind(); field_0x8DBF = 0; mStateMgr.changeState(StateID_Invisible); } } - if (mpOutAnmGroup->isBound()) { - mpOutAnmGroup->play(); + if (mpInOutAnmGroup->isBound()) { + mpInOutAnmGroup->play(); } } void dLytMapMain_c::finalizeState_Out() {}