From 6cc3cfaadcab3d1bb92496c081a92603ef1dd585 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 28 Sep 2025 01:33:33 +0200 Subject: [PATCH 01/20] d_lyt_map_global OK --- config/SOUE01/splits.txt | 10 ++-- config/SOUE01/symbols.txt | 20 +++---- configure.py | 1 + include/d/lyt/d2d.h | 4 ++ include/d/lyt/d_lyt_map.h | 8 ++- include/d/lyt/d_lyt_map_capture.h | 3 +- include/d/lyt/d_lyt_map_global.h | 53 +++++++++++++++++++ src/d/lyt/d_lyt_map.cpp | 41 +++++++++++--- src/d/lyt/d_lyt_map_global.cpp | 88 +++++++++++++++++++++++++++++++ 9 files changed, 206 insertions(+), 22 deletions(-) create mode 100644 include/d/lyt/d_lyt_map_global.h create mode 100644 src/d/lyt/d_lyt_map_global.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 56c714be..87539e84 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -908,12 +908,16 @@ d/lyt/d_lyt_auto_explain.cpp: .sdata2 start:0x80579F10 end:0x80579F28 .bss start:0x805AF2F0 end:0x805AF3F0 +d/lyt/d_lyt_map_global.cpp: + .text start:0x8012D190 end:0x8012D4A8 align:16 + .sbss start:0x805754A0 end:0x805754A8 + .sdata2 start:0x80579F28 end:0x80579F30 + d/lyt/d_lyt_map_capture.cpp: - .text start:0x8012D190 end:0x8012DC28 align:16 + .text start:0x8012D4B0 end:0x8012DC28 align:16 .ctors start:0x804DB768 end:0x804DB76C .data start:0x8051EA08 end:0x8051EAE0 - .sbss start:0x805754A0 end:0x805754A8 - .sdata2 start:0x80579F28 end:0x80579F40 + .sdata2 start:0x80579F30 end:0x80579F40 .bss start:0x805AF3F0 end:0x805AF470 d/lyt/d_lyt_map.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index ff5d9b53..c55ae48b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7474,13 +7474,13 @@ getTextBox__17dLytAutoExplain_cFv = .text:0x8012CD50; // type:function size:0x8 __sinit_\d_lyt_auto_explain_cpp = .text:0x8012CD60; // type:function size:0x338 scope:local __dt__32sFStateID_c<17dLytAutoExplain_c>Fv = .text:0x8012D0A0; // type:function size:0x58 scope:weak isSameName__32sFStateID_c<17dLytAutoExplain_c>CFPCc = .text:0x8012D100; // type:function size:0x88 scope:weak -fn_8012D190 = .text:0x8012D190; // type:function size:0x68 -fn_8012D200 = .text:0x8012D200; // type:function size:0x108 -projectForMapMaybe = .text:0x8012D310; // type:function size:0x18 -fn_8012D330 = .text:0x8012D330; // type:function size:0x1C -fn_8012D350 = .text:0x8012D350; // type:function size:0x1C -fn_8012D370 = .text:0x8012D370; // type:function size:0x1C -fn_8012D390 = .text:0x8012D390; // type:function size:0x118 +__ct__15dLytMapGlobal_cFv = .text:0x8012D190; // type:function size:0x68 +projectOntoMap__15dLytMapGlobal_cCFR7mVec2_cRC7mVec3_cRC7mVec3_cRC7mVec3_cRC4mAngff = .text:0x8012D200; // type:function size:0x108 +projectOntoMap__15dLytMapGlobal_cCFR7mVec2_cRC7mVec3_c = .text:0x8012D310; // type:function size:0x18 +unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_c = .text:0x8012D330; // type:function size:0x1C +unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC4mAng = .text:0x8012D350; // type:function size:0x1C +unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC7mVec3_cRC4mAng = .text:0x8012D370; // type:function size:0x1C +unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC7mVec2_cRC7mVec3_cRC7mVec3_cRC4mAngff = .text:0x8012D390; // type:function size:0x118 LytMapCapture__stateRenderingWaitEnter = .text:0x8012D4B0; // type:function size:0x4 LytMapCapture__stateRenderingWaitUpdate = .text:0x8012D4C0; // type:function size:0x70 changeState__85sStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8012D530; // type:function size:0x10 @@ -7541,7 +7541,7 @@ finalizeState_Remove__16dLytMapPinIcon_cFv = .text:0x8012EB20; // type:function fn_8012EB30 = .text:0x8012EB30; // type:function size:0xF8 fn_8012EC30 = .text:0x8012EC30; // type:function size:0x80 fn_8012ECB0 = .text:0x8012ECB0; // type:function size:0x10C -fn_8012EDC0 = .text:0x8012EDC0; // type:function size:0x2C +removeBeacon__16dLytMapPinIcon_cFv = .text:0x8012EDC0; // type:function size:0x2C __dt__16dLytMapPinIcon_cFv = .text:0x8012EDF0; // type:function size:0x110 __dt__55sFStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c>Fv = .text:0x8012EF00; // type:function size:0xA4 __dt__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012EFB0; // type:function size:0xA0 @@ -7750,7 +7750,7 @@ __dt__55sFStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c>Fv = .text:0x8013 __dt__16dLytMapCapture_cFv = .text:0x80133FF0; // type:function size:0xB4 __ct__20dLytMapFloorBtnMgr_cFPv = .text:0x801340B0; // type:function size:0x178 __ct__20LytMapFourAnimGroupsFv = .text:0x80134230; // type:function size:0x140 -__ct__Q23d2d11dLytStructDFv = .text:0x80134370; // type:function size:0x48 +__ct__20dCursorHitCheckLyt_cFv = .text:0x80134370; // type:function size:0x48 __ct__17dLytMapFloorBtn_cFv = .text:0x801343C0; // type:function size:0xAC __ct__25dLytMapPinIconAggregate_cFv = .text:0x80134470; // type:function size:0xF0 __dt__38sFState_c<25dLytMapPinIconAggregate_c>Fv = .text:0x80134560; // type:function size:0x58 @@ -41943,7 +41943,7 @@ sInstance__15dLytMsgWindow_c = .sbss:0x80575488; // type:object size:0x4 data:4b lbl_8057548C = .sbss:0x8057548C; // type:object size:0x4 data:4byte CURRENT_ACTOR_EVENT_FLOW_MANAGER = .sbss:0x80575490; // type:object size:0x8 data:4byte sInstance__18dLytSimpleWindow_c = .sbss:0x80575498; // type:object size:0x8 data:4byte -lbl_805754A0 = .sbss:0x805754A0; // type:object size:0x8 data:4byte +sInstance__15dLytMapGlobal_c = .sbss:0x805754A0; // type:object size:0x8 data:4byte sMapFaderColor = .sbss:0x805754A8; // type:object size:0x4 data:byte lbl_805754AC = .sbss:0x805754AC; // type:object size:0x1 data:byte sInstance__9dLytMap_c = .sbss:0x805754B0; // type:object size:0x8 data:4byte diff --git a/configure.py b/configure.py index 4c8acef2..3a0f39a0 100644 --- a/configure.py +++ b/configure.py @@ -534,6 +534,7 @@ config.libs = [ Object(NonMatching, "d/lyt/msg_window/d_lyt_simple_window.cpp"), Object(Matching, "d/lyt/d_lyt_auto_caption.cpp"), Object(Matching, "d/lyt/d_lyt_auto_explain.cpp"), + Object(Matching, "d/lyt/d_lyt_map_global.cpp"), Object(NonMatching, "d/lyt/d_lyt_map_capture.cpp"), Object(NonMatching, "d/lyt/d_lyt_map.cpp"), Object(Matching, "d/lyt/d_lyt_note.cpp"), diff --git a/include/d/lyt/d2d.h b/include/d/lyt/d2d.h index 14c92b78..6c057c22 100644 --- a/include/d/lyt/d2d.h +++ b/include/d/lyt/d2d.h @@ -252,6 +252,10 @@ struct AnmGroupBase_c { return mpFrameCtrl->getRate(); } + inline bool isBound() const { + return (mFlags & ANMGROUP_FLAG_BOUND) != 0; + } + inline bool isEnabled() const { return (mFlags & ANMGROUP_FLAG_ENABLE) != 0; } diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 283a01e8..7032e4fb 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -3,6 +3,7 @@ #include "common.h" #include "d/d_cursor_hit_check.h" +#include "d/d_message.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_map_capture.h" #include "egg/core/eggColorFader.h" @@ -66,6 +67,8 @@ public: STATE_FUNC_DECLARE(dLytMapPinIcon_c, Remove); private: + void removeBeacon(); + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapPinIcon_c); /* 0x040 */ d2d::LytBase_c mLyt; /* 0x0D0 */ d2d::AnmGroup_c mAnmGroups[3]; @@ -326,7 +329,8 @@ public: private: /* 0x0010 */ UI_STATE_MGR_DECLARE(dLytMapMain_c); /* 0x004C */ u8 field_0x004C[0x00A4 - 0x004C]; - /* 0x00A4 */ u8 field_0x00A4[0x010C - 0x00A4]; + /* 0x00A4 */ dFlow_c mFlow; + /* 0x0108 */ u8 _0x108[0x10C - 0x108]; /* 0x010C */ d2d::LytBase_c mLyt; /* 0x019C */ d2d::AnmGroup_c mAnmGroups[54]; /* 0x0F1C */ LytMap0x80520B5C field_0xF1C; @@ -349,7 +353,7 @@ private: /* 0x8930 */ mVec3_c field_0x8930; /* 0x893C */ mVec3_c field_0x893C; - /* 0x8948 */ u8 idkfixmelater[0x4BC0]; + /* 0x8948 */ u8 idkfixmelater[0x4BA0]; /* 0x8C94 */ s32 field_0x8C94; // ... diff --git a/include/d/lyt/d_lyt_map_capture.h b/include/d/lyt/d_lyt_map_capture.h index 92d533a5..974c095b 100644 --- a/include/d/lyt/d_lyt_map_capture.h +++ b/include/d/lyt/d_lyt_map_capture.h @@ -25,7 +25,8 @@ public: private: /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapCapture_c); - /* 0x040*/ UNKWORD field_0x040; + /* 0x040 */ UNKWORD field_0x040; + /* 0x044 */ u8 _0x040[0x064 - 0x044]; /* 0x064 */ f32 field_0x064; /* 0x068 */ f32 field_0x068; /* 0x06C */ f32 field_0x06C; diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h new file mode 100644 index 00000000..2e214df9 --- /dev/null +++ b/include/d/lyt/d_lyt_map_global.h @@ -0,0 +1,53 @@ +#ifndef D_LYT_MAP_GLOBAL_H +#define D_LYT_MAP_GLOBAL_H + +#include "m/m_angle.h" +#include "m/m_vec.h" + +class dLytMapGlobal_c { +public: + dLytMapGlobal_c(); + + static dLytMapGlobal_c *GetInstance() { + return sInstance; + } + + void projectOntoMap(mVec2_c &result, const mVec3_c &position) const; + void unprojectFromMap(mVec3_c &result, const mVec2_c &position) const; + void unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const; + void unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mVec3_c &v2, const mAng &rot) const; + +private: + static dLytMapGlobal_c *sInstance; + + void projectOntoMap( + mVec2_c &result, const mVec3_c &position, const mVec3_c &v1, const mVec3_c &mapRotationCenter, const mAng &rot, + f32 f1, f32 f2 + ) const; + + void unprojectFromMap( + mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &v2, + const mVec3_c &mapRotationCenter, const mAng &rot, f32 f1, f32 f2 + ) const; + + /* 0x00 */ mVec3_c field_0x00; + /* 0x0C */ mVec2_c field_0x0C; + /* 0x14 */ mVec3_c mMapRotationCenter; + /* 0x20 */ mVec2_c field_0x20; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ mVec3_c mPlayerPosition; + /* 0x3C */ mAng mMapRotation; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ f32 field_0x44; + /* 0x48 */ UNKWORD field_0x48; + /* 0x4C */ u8 field_0x4C; + /* 0x4D */ u8 field_0x4D; + /* 0x4E */ u8 field_0x4E; + /* 0x4F */ u8 field_0x4F; + /* 0x50 */ UNKWORD field_0x50; + /* 0x54 */ u8 _0x54[0x64 - 0x54]; + /* 0x60 */ f32 field_0x64; +}; + +#endif diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 6e008c36..0f05ed09 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -3,8 +3,10 @@ #include "common.h" #include "d/d_cursor_hit_check.h" #include "d/d_d2d.h" +#include "d/d_pad.h" #include "d/d_pad_nav.h" #include "d/lyt/d2d.h" +#include "d/snd/d_snd_small_effect_mgr.h" #include "egg/core/eggColorFader.h" #include "m/m_video.h" #include "sized_string.h" @@ -182,6 +184,7 @@ void dLytMapFader_c::draw() { #define LYT_MAP_PIN_ICON_ANIM_SCALE 0 #define LYT_MAP_PIN_ICON_ANIM_ERASE 1 #define LYT_MAP_PIN_ICON_ANIM_LOOP 2 +#define LYT_MAP_PIN_ICON_NUM_ANIMS 3 void dLytMapPinIcon_c::initializeState_Wait() { mLyt.calc(); @@ -208,7 +211,7 @@ void dLytMapPinIcon_c::executeState_Wait() { void dLytMapPinIcon_c::finalizeState_Wait() {} void dLytMapPinIcon_c::initializeState_ToSelect() { - d2d::AnmGroup_c *m = &mAnmGroups[1]; + d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; m->bind(false); m->setFrame(0.0f); } @@ -220,7 +223,33 @@ void dLytMapPinIcon_c::finalizeState_ToSelect() { } void dLytMapPinIcon_c::initializeState_Select() {} -void dLytMapPinIcon_c::executeState_Select() {} +void dLytMapPinIcon_c::executeState_Select() { + if (field_0x1D0->field_0x05 && dPad::getDownTrigC()) { + removeBeacon(); + field_0x1D0->field_0x04 = false; + d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; + if (m->isBound()) { + m->unbind(); + } + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_REMOVE); + mStateMgr.changeState(StateID_Remove); + return; + } + + if (field_0x1BC == 0) { + d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; + m->bind(false); + m->setFrame(0.0f); + mLyt.calc(); + m->unbind(); + mStateMgr.changeState(StateID_ToUnselect); + } else { + d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; + if (m->isBound()) { + m->play(); + } + } +} void dLytMapPinIcon_c::finalizeState_Select() {} void dLytMapPinIcon_c::initializeState_ToUnselect() {} @@ -255,7 +284,7 @@ bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { d2d::AnmGroup_c *pAnmGroups = mAnmGroups; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { pAnmGroups[i].init(sMapPinIconBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapPinIconBrlanMap[i].mName); pAnmGroups[i].bind(false); pAnmGroups[i].setFrame(0.0f); @@ -263,7 +292,7 @@ bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { mLyt.calc(); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { pAnmGroups[i].unbind(); } @@ -285,7 +314,7 @@ bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { bool dLytMapPinIcon_c::remove() { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { mAnmGroups[i].remove(); } return true; @@ -295,7 +324,7 @@ bool dLytMapPinIcon_c::execute() { fn_8012EC30(); mStateMgr.executeState(); field_0x1BC = 0; - mAnmGroups[2].setFrame(field_0x1DC); + mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP].setFrame(field_0x1DC); // TODO something MapCapture mLyt.calc(); mCsHitCheck.resetCachedHitboxes(); diff --git a/src/d/lyt/d_lyt_map_global.cpp b/src/d/lyt/d_lyt_map_global.cpp new file mode 100644 index 00000000..8f0f349a --- /dev/null +++ b/src/d/lyt/d_lyt_map_global.cpp @@ -0,0 +1,88 @@ +#include "d/lyt/d_lyt_map_global.h" + +#include "m/m_vec.h" + +dLytMapGlobal_c *dLytMapGlobal_c::sInstance; + +dLytMapGlobal_c::dLytMapGlobal_c() + : field_0x00(0.0f, 0.0f, 0.0f), + field_0x0C(0.0f, 0.0f), + mMapRotationCenter(0.0f, 0.0f, 0.0f), + field_0x20(0.0f, 0.0f), + field_0x28(0.0f), + field_0x2C(0.0f), + mMapRotation(0), + field_0x40(1.0f), + field_0x44(1.0f), + field_0x48(0), + field_0x4C(0), + field_0x4D(0), + field_0x4E(0), + field_0x4F(0), + field_0x50(0) { + sInstance = this; +} + +void dLytMapGlobal_c::projectOntoMap( + mVec2_c &result, const mVec3_c &position, const mVec3_c &v1, const mVec3_c &mapRotationCenter, const mAng &rot, + f32 f1, f32 f2 +) const { + // Initializing like this fixes regswaps, even if it's not needed... + mVec3_c work(0.0f, 0.0f, 0.0f); + + work.x = position.x - mapRotationCenter.x; + work.z = position.z - mapRotationCenter.z; + work.y = 0.0f; + work.rotY(-rot); + + work.x += mapRotationCenter.x - v1.x; + work.z += mapRotationCenter.z - v1.z; + + work.x *= f2 * f1; + work.z *= f2 * f1; + work.x *= field_0x28; + + result.x = work.x; + result.y = -work.z; +} + +void dLytMapGlobal_c::projectOntoMap(mVec2_c &result, const mVec3_c &position) const { + projectOntoMap(result, position, field_0x00, mMapRotationCenter, mMapRotation, field_0x44, field_0x40); +} + +void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position) const { + unprojectFromMap( + result, position, field_0x20, field_0x00, mMapRotationCenter, mMapRotation, field_0x44, field_0x40 + ); +} + +void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const { + unprojectFromMap(result, position, field_0x20, field_0x00, mMapRotationCenter, rot, field_0x44, field_0x40); +} + +void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mVec3_c &v2, const mAng &rot) + const { + unprojectFromMap(result, position, field_0x20, v2, mMapRotationCenter, rot, field_0x44, field_0x40); +} + +void dLytMapGlobal_c::unprojectFromMap( + mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &v2, const mVec3_c &mapRotationCenter, + const mAng &rot, f32 f1, f32 f2 +) const { + mVec3_c work(0.0f, 0.0f, 0.0f); + + f1 *= f2; + f32 tmp = 1.0f / f1; + mVec2_c diff = position - v1; + + work.x = diff.x * tmp * (1.0f / field_0x28); + work.z = -diff.y * tmp; + + work = work + v2; + + work = work - mapRotationCenter; + work.rotY(rot); + work += mapRotationCenter; + + result = work; +} From 9fec642c3f2f909b42b1f11b207ee69db3925efa Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 28 Sep 2025 23:37:11 +0200 Subject: [PATCH 02/20] Some footstep stuff --- config/SOUE01/splits.txt | 4 +- config/SOUE01/symbols.txt | 58 ++++---- configure.py | 2 +- include/d/lyt/d_lyt_control_game.h | 11 +- include/d/lyt/d_lyt_map.h | 160 +++++++++++++++++++-- include/d/lyt/d_lyt_map_global.h | 47 ++++++- include/d/lyt/d_lyt_map_markers.h | 53 +++++++ include/d/lyt/d_textbox.h | 2 +- include/toBeSorted/d_flow_mgr.h | 18 +++ src/d/lyt/d_lyt_map.cpp | 211 +++++++++++++++++++++++++++- src/d/lyt/d_lyt_map_global.cpp | 4 +- src/d/lyt/d_lyt_map_markers.cpp | 217 +++++++++++++++++++++++++++++ src/d/lyt/d_textbox.cpp | 2 +- 13 files changed, 730 insertions(+), 59 deletions(-) create mode 100644 include/d/lyt/d_lyt_map_markers.h create mode 100644 include/toBeSorted/d_flow_mgr.h create mode 100644 src/d/lyt/d_lyt_map_markers.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 87539e84..ad02c030 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1226,11 +1226,13 @@ d/a/d_a_door_base.cpp: .data start:0x80528F20 end:0x80528FB0 .sbss start:0x80575668 end:0x80575670 -d/lyt/d_lyt_map_popup.cpp: +d/lyt/d_lyt_map_markers.cpp: .text start:0x801792D0 end:0x80189F9C align:16 .rodata start:0x804E9AD0 end:0x804E9CB0 .data start:0x80528FB0 end:0x8052A880 + .sdata start:0x80572BB0 end:0x80572D08 .sbss start:0x80575670 end:0x80575678 + .sdata2 start:0x8057AC78 end:0x8057ACF0 d/d_pouch.cpp: .text start:0x80189FA0 end:0x8018B4A4 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index c55ae48b..e58d8816 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3850,7 +3850,7 @@ setMessageWithGlobalTextProcessorAndMsbtInfo__10dTextBox_cFP8MsbtInfoPCcPwUl = . setTextWithGlobalTextProcessor__10dTextBox_cFPCw = .text:0x800AF930; // type:function size:0x50 GetLineWidth__10dTextBox_cCFPf = .text:0x800AF980; // type:function size:0x1E4 GetLinesHeight__10dTextBox_cCFv = .text:0x800AFB70; // type:function size:0x1A4 -GetUnkWidthRatio__10dTextBox_cCFv = .text:0x800AFD20; // type:function size:0x3C +getLineDrawWidth__10dTextBox_cCFv = .text:0x800AFD20; // type:function size:0x3C resizeTextToFit__10dTextBox_cFf = .text:0x800AFD60; // type:function size:0xC8 init__10dTextBox_cFv = .text:0x800AFE30; // type:function size:0x204 hasDynamicText__10dTextBox_cFv = .text:0x800B0040; // type:function size:0x278 @@ -7503,19 +7503,19 @@ LytMapCapture__dtor = .text:0x8012DB40; // type:function size:0x58 fn_8012DBA0 = .text:0x8012DBA0; // type:function size:0x88 __ct__13dLytMap_HIO_cFv = .text:0x8012DC30; // type:function size:0xEC __dt__13dLytMap_HIO_cFv = .text:0x8012DD20; // type:function size:0x40 -fn_8012DD60 = .text:0x8012DD60; // type:function size:0x17C -fn_8012DEE0 = .text:0x8012DEE0; // type:function size:0x70 -fn_8012DF50 = .text:0x8012DF50; // type:function size:0x20 -fn_8012DF70 = .text:0x8012DF70; // type:function size:0x18 -fn_8012DF90 = .text:0x8012DF90; // type:function size:0xF0 -fn_8012E080 = .text:0x8012E080; // type:function size:0x8 -fn_8012E090 = .text:0x8012E090; // type:function size:0x1A0 -fn_8012E230 = .text:0x8012E230; // type:function size:0x8 -fn_8012E240 = .text:0x8012E240; // type:function size:0xA0 -fn_8012E2E0 = .text:0x8012E2E0; // type:function size:0x8 -fn_8012E2F0 = .text:0x8012E2F0; // type:function size:0x204 -fn_8012E500 = .text:0x8012E500; // type:function size:0xC -fn_8012E510 = .text:0x8012E510; // type:function size:0x1F0 +init__21dMapFootPrintsQueue_cFv = .text:0x8012DD60; // type:function size:0x17C +addStep__21dMapFootPrintsQueue_cFRC7mVec3_cRC4mAng = .text:0x8012DEE0; // type:function size:0x70 +getFirst__21dMapFootPrintsQueue_cCFv = .text:0x8012DF50; // type:function size:0x20 +getNext__21dMapFootPrintsQueue_cCFPC18dMapFootPrintEntry = .text:0x8012DF70; // type:function size:0x18 +execute__19dMapFootPrintsMgr_cFv = .text:0x8012DF90; // type:function size:0xF0 +__ct__4mAngFs = .text:0x8012E080; // type:function size:0x8 +__ct__19dLytMapFootPrints_cFP15dLytMapGlobal_c = .text:0x8012E090; // type:function size:0x1A0 +getGlobal__19dLytMapFootPrints_cCFv = .text:0x8012E230; // type:function size:0x8 +build__19dLytMapFootPrints_cFPQ23d2d10ResAccIf_c = .text:0x8012E240; // type:function size:0xA0 +remove__19dLytMapFootPrints_cFv = .text:0x8012E2E0; // type:function size:0x8 +execute__19dLytMapFootPrints_cFv = .text:0x8012E2F0; // type:function size:0x204 +__ct__7mVec2_cFff = .text:0x8012E500; // type:function size:0xC +draw__19dLytMapFootPrints_cFv = .text:0x8012E510; // type:function size:0x1F0 fn_8012E700 = .text:0x8012E700; // type:function size:0x68 fn_8012E770 = .text:0x8012E770; // type:function size:0x4 fn_8012E780 = .text:0x8012E780; // type:function size:0x14 @@ -7748,7 +7748,7 @@ __dt__32sFStateFct_c<16dLytMapCapture_c>Fv = .text:0x80133E30; // type:function __dt__85sStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80133EA0; // type:function size:0xA0 __dt__55sFStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c>Fv = .text:0x80133F40; // type:function size:0xA4 __dt__16dLytMapCapture_cFv = .text:0x80133FF0; // type:function size:0xB4 -__ct__20dLytMapFloorBtnMgr_cFPv = .text:0x801340B0; // type:function size:0x178 +__ct__20dLytMapFloorBtnMgr_cFP15dLytMapGlobal_c = .text:0x801340B0; // type:function size:0x178 __ct__20LytMapFourAnimGroupsFv = .text:0x80134230; // type:function size:0x140 __ct__20dCursorHitCheckLyt_cFv = .text:0x80134370; // type:function size:0x48 __ct__17dLytMapFloorBtn_cFv = .text:0x801343C0; // type:function size:0xAC @@ -9896,17 +9896,17 @@ fn_80179290 = .text:0x80179290; // type:function size:0x18 ActorDoorBase__initList = .text:0x801792B0; // type:function size:0x14 checkHasMap = .text:0x801792D0; // type:function size:0x68 projectForMapMaybe2 = .text:0x80179340; // type:function size:0x2C -fn_80179370 = .text:0x80179370; // type:function size:0x16C -fn_801794E0 = .text:0x801794E0; // type:function size:0x58 -fn_80179540 = .text:0x80179540; // type:function size:0x104 -fn_80179650 = .text:0x80179650; // type:function size:0xA8 -fn_80179700 = .text:0x80179700; // type:function size:0xB4 -fn_801797C0 = .text:0x801797C0; // type:function size:0x94 -fn_80179860 = .text:0x80179860; // type:function size:0x3C -fn_801798A0 = .text:0x801798A0; // type:function size:0x94 -fn_80179940 = .text:0x80179940; // type:function size:0xD4 -fn_80179A20 = .text:0x80179A20; // type:function size:0xF4 -fn_80179B20 = .text:0x80179B20; // type:function size:0xAC +build__14dLytMapPopup_cFPQ23d2d10ResAccIf_c = .text:0x80179370; // type:function size:0x16C +remove__14dLytMapPopup_cFv = .text:0x801794E0; // type:function size:0x58 +execute__14dLytMapPopup_cFv = .text:0x80179540; // type:function size:0x104 +draw__14dLytMapPopup_cFv = .text:0x80179650; // type:function size:0xA8 +setLabel__14dLytMapPopup_cFPCc = .text:0x80179700; // type:function size:0xB4 +realizeText__14dLytMapPopup_cFv = .text:0x801797C0; // type:function size:0x94 +getTextRenderWidth__14dLytMapPopup_cCFv = .text:0x80179860; // type:function size:0x3C +setInout__14dLytMapPopup_cFf = .text:0x801798A0; // type:function size:0x94 +setInitialState__14dLytMapPopup_cFv = .text:0x80179940; // type:function size:0xD4 +updateScale__14dLytMapPopup_cFv = .text:0x80179A20; // type:function size:0xF4 +checkMapMode__14dLytMapPopup_cFv = .text:0x80179B20; // type:function size:0xAC fn_80179BD0 = .text:0x80179BD0; // type:function size:0x234 fn_80179E10 = .text:0x80179E10; // type:function size:0x58 fn_80179E70 = .text:0x80179E70; // type:function size:0xBC @@ -33466,8 +33466,8 @@ __vt__17dLytAutoExplain_c = .data:0x8051E870; // type:object size:0x44 __vt__32sFStateID_c<17dLytAutoExplain_c> = .data:0x8051E9D4; // type:object size:0x34 scope:weak lbl_8051EA08 = .data:0x8051EA08; // type:object size:0xA0 data:4byte lbl_8051EAA8 = .data:0x8051EAA8; // type:object size:0x38 -lbl_8051EAE0 = .data:0x8051EAE0; // type:object size:0x14 -lbl_8051EAF4 = .data:0x8051EAF4; // type:object size:0xC +lbl_8051EAE0 = .data:0x8051EAE0; // type:object size:0x13 data:string +lbl_8051EAF4 = .data:0x8051EAF4; // type:object size:0x9 data:string lbl_8051EB00 = .data:0x8051EB00; // type:object size:0x14 data:string lbl_8051EB14 = .data:0x8051EB14; // type:object size:0x1C lbl_8051EB30 = .data:0x8051EB30; // type:object size:0xC @@ -35074,7 +35074,7 @@ lbl_80529008 = .data:0x80529008; // type:object size:0xC lbl_80529014 = .data:0x80529014; // type:object size:0xC lbl_80529020 = .data:0x80529020; // type:object size:0xC data:string lbl_8052902C = .data:0x8052902C; // type:object size:0xC -lbl_80529038 = .data:0x80529038; // type:object size:0x14 +lbl_80529038 = .data:0x80529038; // type:object size:0x12 data:string lbl_8052904C = .data:0x8052904C; // type:object size:0x1C lbl_80529068 = .data:0x80529068; // type:object size:0x18 data:string lbl_80529080 = .data:0x80529080; // type:object size:0x18 data:string diff --git a/configure.py b/configure.py index 3a0f39a0..920ba14f 100644 --- a/configure.py +++ b/configure.py @@ -577,7 +577,7 @@ config.libs = [ Object(Matching, "d/lyt/d_screen_fader.cpp"), Object(NonMatching, "d/a/d_a_bird_base.cpp"), Object(NonMatching, "d/a/d_a_door_base.cpp"), - Object(NonMatching, "d/lyt/d_lyt_map_popup.cpp"), + Object(NonMatching, "d/lyt/d_lyt_map_markers.cpp"), Object(NonMatching, "d/d_pouch.cpp"), Object(NonMatching, "toBeSorted/d_beacon.cpp"), Object(NonMatching, "toBeSorted/d_underground.cpp"), diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index 52098e3c..110e0c03 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -2,6 +2,7 @@ #define D_LYT_CONTROL_GAME_H #include "d/d_base.h" +#include "d/lyt/d_lyt_map.h" #include "s/s_State.hpp" class dLytControlGame_c : public dBase_c { @@ -18,6 +19,10 @@ public: void fn_802CCD40(bool); void fn_802D04F0(); + const dMapFootPrintsQueue_c *getFootprintsQueue() const { + return mFootprintsMgr.getQueue(); + } + static dLytControlGame_c *getInstance() { return sInstance; } @@ -70,7 +75,11 @@ public: private: /* 0x00068 */ UI_STATE_MGR_DECLARE(dLytControlGame_c); - /* 0x000A4 */ u8 _0x000A4[0x15C2C - 0x000A4]; + /* 0x000A4 */ u8 _0x000A4[0x15850 - 0x000A4]; + + /* 0x15850 */ dMapFootPrintsMgr_c mFootprintsMgr; + + /* 0x15C24 */ u8 _0x15C24[0x15C2C - 0x15C24]; /* 0x15C2C */ s32 mCurrentPauseDisp; /* 0x15C30 */ s32 mPauseDisp00Tab; diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 7032e4fb..95865bcb 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -6,11 +6,86 @@ #include "d/d_message.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_map_capture.h" +#include "d/lyt/d_lyt_map_global.h" #include "egg/core/eggColorFader.h" #include "m/m2d.h" +#include "m/m_angle.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_bounding.h" +#include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" +#include "toBeSorted/d_flow_mgr.h" + +struct dMapFootPrintEntry { + /* 0x00 */ dMapFootPrintEntry *pPrev; + /* 0x04 */ dMapFootPrintEntry *pNext; + /* 0x08 */ mVec3_c position; + /* 0x14 */ mAng rotation; +}; + +/** Generic footprints queue */ +class dMapFootPrintsQueue_c { +public: + void init(); + void addStep(const mVec3_c &pos, const mAng &rot); + dMapFootPrintEntry *getFirst() const; + dMapFootPrintEntry *getNext(const dMapFootPrintEntry *it) const; + + bool isEmpty() const { + return mCount == 0; + } + +private: + /* 0x000 */ dMapFootPrintEntry mEntries[40]; + /* 0x3C0 */ dMapFootPrintEntry *mpFirst; + /* 0x3C4 */ dMapFootPrintEntry *mpLast; + /* 0x3C8 */ u32 mCount; +}; + +/** Records Link's footsteps */ +class dMapFootPrintsMgr_c { +public: + dMapFootPrintsMgr_c() { + mQueue.init(); + } + virtual ~dMapFootPrintsMgr_c() {} + + void execute(); + + const dMapFootPrintsQueue_c *getQueue() const { + return &mQueue; + } + +private: + /* 0x004 */ dMapFootPrintsQueue_c mQueue; + /* 0x3D0 */ f32 mMinStepDistanceSq; +}; + +/** 2D UI - Map - Link footprint markers */ +class dLytMapFootPrints_c { +public: + dLytMapFootPrints_c(dLytMapGlobal_c *global); + virtual ~dLytMapFootPrints_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + void draw(); + +private: + dLytMapGlobal_c *getGlobal() const; + + /* 0x004 */ dLytMapGlobal_c *mpGlobal; + /* 0x008 */ d2d::dLytSub mLyt; + /* 0x09C */ nw4r::lyt::Pane *mpPane; + /* 0x0A0 */ f32 field_0xA0; + /* 0x0A4 */ mVec2_c mFootprintPositions[30]; + /* 0x194 */ u16 mMaxNumSteps; + /* 0x196 */ u16 mCurrentNumSteps; + /* 0x198 */ f32 field_0x198; + /* 0x19C */ f32 field_0x19C; + /* 0x1A0 */ u8 field_0x1A0; +}; struct LytMap0x80520B5C { LytMap0x80520B5C() : field_0x04(false), field_0x05(false) {} @@ -145,7 +220,8 @@ private: class dLytMapFloorBtnMgr_c : public d2d::dSubPane { public: - dLytMapFloorBtnMgr_c(void *arg) : field_0x008(arg), field_0x51C(nullptr), mStateMgr(*this, sStateID::null) { + dLytMapFloorBtnMgr_c(dLytMapGlobal_c *global) + : mpGlobal(global), field_0x51C(nullptr), mStateMgr(*this, sStateID::null) { field_0x700 = 1; field_0x704 = 0; field_0x708 = 0; @@ -173,7 +249,7 @@ public: STATE_FUNC_DECLARE(dLytMapFloorBtnMgr_c, Wait); private: - /* 0x008 */ void *field_0x008; + /* 0x008 */ dLytMapGlobal_c *mpGlobal; /* 0x00C */ UI_STATE_MGR_DECLARE(dLytMapFloorBtnMgr_c); /* 0x048 */ d2d::dLytSub mLyt; /* 0x0DC */ d2d::AnmGroup_c mAnmGroups[1]; @@ -269,6 +345,23 @@ private: /* 0x18E */ u8 field_0x18E; }; +class dLytMapDecoration_c { +public: + dLytMapDecoration_c() {} + virtual ~dLytMapDecoration_c() {} + // TODO, name made up +}; + +class dLytMapPutIcon { +public: + dLytMapPutIcon() {} + virtual ~dLytMapPutIcon() {} + // TODO, name made up + + /* 0x04 */ d2d::LytBase_c mLyt; + /* 0x98 */ mVec2_c field_0x98; +}; + class dLytMapMain_c : public m2d::Base_c { friend class dLytMap_c; @@ -328,9 +421,10 @@ public: private: /* 0x0010 */ UI_STATE_MGR_DECLARE(dLytMapMain_c); - /* 0x004C */ u8 field_0x004C[0x00A4 - 0x004C]; + /* 0x004C */ dFlowMgr_c mFlowMgr; + /* 0x0058 */ u8 _0x0058[0x00A4 - 0x0058]; /* 0x00A4 */ dFlow_c mFlow; - /* 0x0108 */ u8 _0x108[0x10C - 0x108]; + /* 0x0108 */ u8 _0x0108[0x010C - 0x0108]; /* 0x010C */ d2d::LytBase_c mLyt; /* 0x019C */ d2d::AnmGroup_c mAnmGroups[54]; /* 0x0F1C */ LytMap0x80520B5C field_0xF1C; @@ -338,25 +432,46 @@ private: /* 0x0FA0 */ dLytMapFloorBtnMgr_c mFloorBtnMgr; /* 0x16B4 */ dLytMapPinIconAggregate_c mPinIconAggregate; + /* 0x2060 */ dLytMapDecoration_c field_0x2060; + + /* 0x2064 */ u8 _0x2064[0x64C0 - 0x2064]; + + /* 0x64C0 */ dLytMapFootPrints_c mFootPrints; + + /* 0x6664 */ dLytMapPutIcon mPutIcon; + + /* 0x6700 */ u8 _0x6700[0x6704 - 0x6700]; + /* 0x6704 */ dLytMapSaveObj_c mSaveObjs[12]; /* 0x79C4 */ dLytMapSaveCaption_c mSaveCaption; - /* 0x0000 */ dLytMapSavePopup_c mSavePopup; + /* 0x7BD0 */ dLytMapSavePopup_c mSavePopup; + + /* 0x8010 */ u8 _0x7F84[0x807C - 0x8010]; + /* 0x807C */ dLytMapPopupInfo_c mPopupInfo; + + /* 0x8208 */ u8 _0x8208[0x828C - 0x8208]; + /* 0x828C */ mVec3_c field_0x828C[12]; + + /* 0x831C */ u8 _0x831C[0x832C - 0x831C]; + /* 0x832C */ dCursorHitCheckLyt_c field_0x832C[33]; + + /* 0x8854 */ u8 _0x8854[0x8904 - 0x8854]; + /* 0x8904 */ mVec3_c field_0x8904; /* 0x8910 */ mVec3_c field_0x8910; /* 0x891C */ mVec3_c field_0x891C; - - /* 0x8928 */ u8 _0x8928[0x8930 - 0x8928]; - + /* 0x8928 */ mVec2_c field_0x8928; /* 0x8930 */ mVec3_c field_0x8930; /* 0x893C */ mVec3_c field_0x893C; - /* 0x8948 */ u8 idkfixmelater[0x4BA0]; + /* 0x8948 */ u8 _0x8948[0x8C94 - 0x8948]; + /* 0x8C94 */ s32 field_0x8C94; - // ... + /* 0x8C98 */ u8 _0x8C98[0x8CC4 - 0x8C98]; /* 0x8CC4 */ mVec3_c field_0x8CC4; /* 0x8CD0 */ mVec3_c field_0x8CD0; @@ -367,8 +482,29 @@ private: /* 0x8D0C */ mVec3_c field_0x8D0C; /* 0x8D18 */ mVec3_c field_0x8D18; /* 0x8D24 */ mVec3_c field_0x8D24; - - /* 0x8DC8 */ UNKWORD field_0x8DC8; + /* 0x8D30 */ mVec2_c field_0x8D30; + /* 0x8D38 */ mVec2_c field_0x8D38; + /* 0x8D40 */ f32 field_0x8D40; + /* 0x8D44 */ mAng field_0x8D44; + /* 0x8D46 */ mAng field_0x8D46; + /* 0x8D48 */ mAng field_0x8D48; + /* 0x8D4C */ f32 field_0x8D4C; + /* 0x8D50 */ f32 field_0x8D50; + /* 0x8D54 */ u8 _0x8D54[0x8D58 - 0x8D54]; + /* 0x8D58 */ UNKWORD field_0x8D58; + /* 0x8D5C */ UNKWORD field_0x8D5C; + /* 0x8D60 */ UNKWORD field_0x8D60; + /* 0x8D64 */ UNKWORD field_0x8D64; + /* 0x8D68 */ mAng field_0x8D68; + /* 0x8D6A */ u8 field_0x8D6A; + /* 0x8D6B */ u8 field_0x8D6B; + /* 0x8D6C */ UNKWORD field_0x8D6C; + /* 0x8D70 */ UNKWORD field_0x8D70; + /* 0x8D74 */ u8 _0x8D74[0x8D94 - 0x8D74]; + /* 0x8D94 */ d2d::SubPaneList mSubpaneList; + /* 0x8DA0 */ d2d::SubPaneListNode mSubpane; + /* 0x8DB0 */ u8 _0x8DB0[0x8DC8 - 0x8DB0]; + /* 0x8DC8 */ dLytMapGlobal_c mGlobal; }; // Made up name diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index 2e214df9..7480478d 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -8,10 +8,47 @@ class dLytMapGlobal_c { public: dLytMapGlobal_c(); + enum MapMode_e { + MAPMODE_WORLD = 0, + MAPMODE_PROVINCE = 1, + MAPMODE_STAGE = 3, + MAPMODE_ZOOM = 4, + + // There probably are more special-purpose modes... + }; + static dLytMapGlobal_c *GetInstance() { return sInstance; } + const mVec2_c& getField_0x20() const { + return field_0x20; + } + + const mVec3_c& getPlayerPos() const { + return mPlayerPosition; + } + + u8 getAlpha() const { + return mAlpha; + } + + s32 getCurrentMapMode() const { + return mCurrentMapMode; + } + + s32 getNextMapMode() const { + return mNextMapMode; + } + + f32 getZoomFrame() const { + return mZoomFrame; + } + + f32 getField_0x44() const { + return field_0x44; + } + void projectOntoMap(mVec2_c &result, const mVec3_c &position) const; void unprojectFromMap(mVec3_c &result, const mVec2_c &position) const; void unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const; @@ -40,14 +77,16 @@ private: /* 0x3C */ mAng mMapRotation; /* 0x40 */ f32 field_0x40; /* 0x44 */ f32 field_0x44; - /* 0x48 */ UNKWORD field_0x48; + /* 0x48 */ UNKWORD mLevel; /* 0x4C */ u8 field_0x4C; /* 0x4D */ u8 field_0x4D; - /* 0x4E */ u8 field_0x4E; + /* 0x4E */ u8 mAlpha; /* 0x4F */ u8 field_0x4F; /* 0x50 */ UNKWORD field_0x50; - /* 0x54 */ u8 _0x54[0x64 - 0x54]; - /* 0x60 */ f32 field_0x64; + /* 0x54 */ u8 _0x54[0x5C - 0x54]; + /* 0x5C */ s32 mCurrentMapMode; + /* 0x60 */ s32 mNextMapMode; + /* 0x64 */ f32 mZoomFrame; ///< 0.0f when zoomed out, 1.0f when zoomed in }; #endif diff --git a/include/d/lyt/d_lyt_map_markers.h b/include/d/lyt/d_lyt_map_markers.h new file mode 100644 index 00000000..dd73bc00 --- /dev/null +++ b/include/d/lyt/d_lyt_map_markers.h @@ -0,0 +1,53 @@ +#ifndef D_LYT_MAP_MARKERS_H +#define D_LYT_MAP_MARKERS_H + +#include "d/lyt/d2d.h" +#include "d/lyt/d_textbox.h" +#include "m/m_vec.h" +#include "nw4r/lyt/lyt_pane.h" +#include "sized_string.h" + +/** 2D UI - Map - Popup text that appears when pointing at certain points of interest */ +class dLytMapPopup_c { +public: + dLytMapPopup_c() {} + virtual ~dLytMapPopup_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + void draw(); + + void setLabel(const char *label); + void setInout(f32 value); + f32 getTextRenderWidth() const; + +private: + enum ModeCheck_e { + MODE_TRANSITION_TO_ZOOM = 2, + MODE_TRANSITION_TO_STAGE = 3, + MODE_STABLE_STAGE = 4, + MODE_STABLE_ZOOM = 5, + }; + + void realizeText(); + void setInitialState(); + + void checkMapMode(); + void updateScale(); + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[2]; + /* 0x114 */ SizedString<0x40> mLabel; + /* 0x154 */ nw4r::lyt::Pane *mpPanes[2]; + /* 0x15C */ dTextBox_c *mpTextboxes[2]; + /* 0x164 */ dWindow_c *mpWindow[1]; + /* 0x168 */ dTextBox_c *mpSizeBox[1]; + /* 0x16C */ s32 mModeCheckResult; + /* 0x170 */ mVec2_c mPosition; + /* 0x178 */ u8 field_0x178; + /* 0x17C */ f32 mMaxScale; + /* 0x180 */ UNKWORD field_0x180; +}; + +#endif diff --git a/include/d/lyt/d_textbox.h b/include/d/lyt/d_textbox.h index e92c39a8..5b647533 100644 --- a/include/d/lyt/d_textbox.h +++ b/include/d/lyt/d_textbox.h @@ -21,7 +21,7 @@ public: f32 GetLineWidth(f32 *pOutSpacing) const; f32 GetLinesHeight() const; - f32 GetUnkWidthRatio() const; + f32 getLineDrawWidth() const; void setLytBase(d2d::LytBase_c *lytBase) { mpLytBase = lytBase; diff --git a/include/toBeSorted/d_flow_mgr.h b/include/toBeSorted/d_flow_mgr.h new file mode 100644 index 00000000..2c7e1c9f --- /dev/null +++ b/include/toBeSorted/d_flow_mgr.h @@ -0,0 +1,18 @@ +#ifndef D_FLOW_MGR_H +#define D_FLOW_MGR_H + +#include "common.h" + +class dFlow_c; + +class dFlowMgr_c { +public: + dFlowMgr_c(dFlow_c *flow); + virtual ~dFlowMgr_c() {} + +private: + /* 0x04 */ dFlow_c *mpFlow; + /* 0x08 */ u8 field_0x05; +}; + +#endif diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 0f05ed09..5cd9fcbb 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -1,14 +1,20 @@ #include "d/lyt/d_lyt_map.h" #include "common.h" +#include "d/a/d_a_player.h" #include "d/d_cursor_hit_check.h" #include "d/d_d2d.h" #include "d/d_pad.h" #include "d/d_pad_nav.h" +#include "d/d_player.h" #include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_lyt_map_global.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "egg/core/eggColorFader.h" +#include "m/m_vec.h" #include "m/m_video.h" +#include "nw4r/lyt/lyt_pane.h" #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" @@ -18,7 +24,7 @@ struct dLytMap_HIO_c { /* 0x04 */ f32 field_0x04; /* 0x08 */ f32 field_0x08; - /* 0x0C */ f32 field_0x0C; + /* 0x0C */ f32 mFootstepsScale; /* 0x10 */ f32 field_0x10; /* 0x14 */ f32 field_0x14; /* 0x18 */ u8 field_0x18; @@ -39,7 +45,7 @@ struct dLytMap_HIO_c { /* 0x27 */ u8 field_0x27; /* 0x28 */ u8 field_0x28; /* 0x29 */ u8 field_0x29; - /* 0x2A */ u8 field_0x2A; + /* 0x2A */ u8 mFootstepsAlpha; /* 0x2B */ u8 field_0x2B; /* 0x2C */ f32 field_0x2C; }; @@ -70,13 +76,192 @@ dLytMap_HIO_c::dLytMap_HIO_c() { field_0x28 = 0x5A; field_0x29 = 0x5; field_0x08 = 10.0f; - field_0x0C = 0.4f; - field_0x2A = 0x80; + mFootstepsScale = 0.4f; + mFootstepsAlpha = 0x80; field_0x2B = 10; } dLytMap_HIO_c::~dLytMap_HIO_c() {} +void dMapFootPrintsQueue_c::init() { + int j = ARRAY_LENGTH(mEntries) - 1; + for (int i = 0; i < (int)ARRAY_LENGTH(mEntries); i++) { + mEntries[i].position.set(0.0f, 0.0f, 0.0f); + mEntries[i].pNext = &mEntries[j]; + mEntries[j].pPrev = &mEntries[i]; + j = i; + } + + mpFirst = &mEntries[0]; + mpLast = &mEntries[0]; + mCount = 0; +} + +void dMapFootPrintsQueue_c::addStep(const mVec3_c &pos, const mAng &rot) { + mpLast->position = pos; + mpLast->rotation = rot; + if (mpFirst == mpLast && mCount == ARRAY_LENGTH(mEntries)) { + mpFirst = mpFirst->pPrev; + } + mpLast = mpLast->pPrev; + if (mCount < ARRAY_LENGTH(mEntries)) { + mCount++; + } +} + +dMapFootPrintEntry *dMapFootPrintsQueue_c::getFirst() const { + if (mCount == 0) { + return nullptr; + } + return mpLast->pNext; +} + +dMapFootPrintEntry *dMapFootPrintsQueue_c::getNext(const dMapFootPrintEntry *it) const { + dMapFootPrintEntry *ret = nullptr; + if (it != mpFirst) { + ret = it->pNext; + } + return ret; +} + +void dMapFootPrintsMgr_c::execute() { + dAcPy_c *link = getLinkPtr(); + const mVec3_c &linkPos = link->mPosition; + if (mQueue.isEmpty()) { + mQueue.addStep(linkPos, link->mRotation.y); + } else { + mVec3_c lastPos = mQueue.getFirst()->position; + mVec3_c diff = mVec3_c(linkPos - lastPos); + f32 absXZ = diff.squareMagXZ(); + mAng rot = diff.atan2sX_Z(); + if (absXZ >= mMinStepDistanceSq) { + mQueue.addStep(linkPos, rot); + } + } +} + +// here seems to be mAng::mAng(s16) { ... } + +dLytMapFootPrints_c::dLytMapFootPrints_c(dLytMapGlobal_c *global) + : mpGlobal(global), + mpPane(nullptr), + field_0xA0(0.0f), + mMaxNumSteps(ARRAY_LENGTH(mFootprintPositions)), + mCurrentNumSteps(0), + field_0x198(0.0f), + field_0x19C(0.0f), + field_0x1A0(0) { + for (int i = 0; i < (int)ARRAY_LENGTH(mFootprintPositions); i++) { + mFootprintPositions[i].set(0.0f, 0.0f); + } +} + +dLytMapGlobal_c *dLytMapFootPrints_c::getGlobal() const { + return mpGlobal; +} + +bool dLytMapFootPrints_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("footPrint_00.brlyt", nullptr); + nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); + root->SetVisible(false); + root->SetAlpha(0); + root->SetInfluencedAlpha(true); + mpPane = mLyt.findPane("P_all_01"); + mLyt.calc(); + field_0xA0 = 1.0f; + return true; +} + +bool dLytMapFootPrints_c::remove() { + return true; +} + +bool dLytMapFootPrints_c::execute() { + dLytMapGlobal_c *global = getGlobal(); + u8 globalAlpha = global->getAlpha(); + nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); + if (globalAlpha != 0) { + root->SetVisible(true); + root->SetAlpha(globalAlpha); + } else { + root->SetVisible(false); + root->SetAlpha(0); + } + const dMapFootPrintsQueue_c *queue = dLytControlGame_c::getInstance()->getFootprintsQueue(); + mVec2_c playerPos; + global->projectOntoMap(playerPos, global->getPlayerPos()); + mMaxNumSteps = sHio.field_0x2B; + + const dMapFootPrintEntry *it = queue->getFirst(); + int i = 0; + + for (; it != nullptr; it = queue->getNext(it)) { + mVec2_c footstepPos; + global->projectOntoMap(footstepPos, it->position); + mVec2_c diff; + diff = footstepPos - playerPos; + f32 dist = diff.length(); + + for (f32 step = dist / global->getField_0x44(); step >= sHio.field_0x08 / field_0x198; + step /= global->getField_0x44()) { + f32 tmp = (sHio.field_0x08 / field_0x198) / step; + + mVec2_c v = mVec2_c((footstepPos - playerPos) * tmp + playerPos); + mFootprintPositions[i] = v; + if (++i >= mMaxNumSteps) { + break; + } + playerPos = v; + diff = footstepPos - playerPos; + step = diff.length(); + } + if (i >= mMaxNumSteps) { + break; + } + } + mCurrentNumSteps = i; + return true; +} + +// here seems to be mVec2_c::mVec2_c(f32, f32) { ... } + +void dLytMapFootPrints_c::draw() { + if (!field_0x1A0) { + return; + } + + dLytMapGlobal_c *global = getGlobal(); + u8 globalAlpha = global->getAlpha(); + if (globalAlpha == 0) { + return; + } + + // TODO - GPR regswap between pane and mFootprintPositions[i] + nw4r::lyt::Pane *pane = mLyt.getLayout()->GetRootPane(); + + f32 scale = field_0x19C * sHio.mFootstepsScale; + mVec2_c scaleV = mVec2_c(scale, scale); + mpPane->SetScale(scaleV); + + f32 globalAlphaF = globalAlpha; + + for (int i = 0; i < mCurrentNumSteps; i++) { + mVec2_c pos = mVec2_c(global->getField_0x20() + mFootprintPositions[i]); + pane->SetTranslate(mVec3_c(pos.x, pos.y, 0.0f)); + + // TODO - FPR regswaps, maybe fewer temps would work + f32 constantAlpha = sHio.mFootstepsAlpha / 255.0f; + f32 alpha = globalAlphaF * field_0x19C; + int range = mMaxNumSteps; + f32 fadingFactor = ((f32)(range - i) / (f32)range); + pane->SetAlpha(alpha * fadingFactor * constantAlpha); + + pane->CalculateMtx(mLyt.getDrawInfo()); + pane->Draw(mLyt.getDrawInfo()); + } +} + STATE_DEFINE(dLytMapPinIcon_c, Wait); STATE_DEFINE(dLytMapPinIcon_c, ToSelect); STATE_DEFINE(dLytMapPinIcon_c, Select); @@ -246,8 +431,8 @@ void dLytMapPinIcon_c::executeState_Select() { } else { d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; if (m->isBound()) { - m->play(); - } + m->play(); + } } } void dLytMapPinIcon_c::finalizeState_Select() {} @@ -508,7 +693,19 @@ void dLytMapSaveObj_c::executeState_Decide() {} void dLytMapSaveObj_c::finalizeState_Decide() {} #pragma dont_inline on -dLytMapMain_c::dLytMapMain_c() : mStateMgr(*this), mFloorBtnMgr(&field_0x8DC8) {} +dLytMapMain_c::dLytMapMain_c() + : mStateMgr(*this), + mFlowMgr(&mFlow), + mFloorBtnMgr(&mGlobal), + mFootPrints(&mGlobal), + field_0x8D38(0.0f, 0.0f), + field_0x8D40(1.0f), + field_0x8D44(0), + field_0x8D46(0), + field_0x8D48(0), + field_0x8D4C(0.0f), + field_0x8D50(0.0f), + field_0x8D68(0) {} #pragma dont_inline reset dLytMapMain_c::~dLytMapMain_c() {} diff --git a/src/d/lyt/d_lyt_map_global.cpp b/src/d/lyt/d_lyt_map_global.cpp index 8f0f349a..5785ecb3 100644 --- a/src/d/lyt/d_lyt_map_global.cpp +++ b/src/d/lyt/d_lyt_map_global.cpp @@ -14,10 +14,10 @@ dLytMapGlobal_c::dLytMapGlobal_c() mMapRotation(0), field_0x40(1.0f), field_0x44(1.0f), - field_0x48(0), + mLevel(0), field_0x4C(0), field_0x4D(0), - field_0x4E(0), + mAlpha(0), field_0x4F(0), field_0x50(0) { sInstance = this; diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp new file mode 100644 index 00000000..56ae532e --- /dev/null +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -0,0 +1,217 @@ +#include "d/lyt/d_lyt_map_markers.h" + +#include "common.h" +#include "d/d_message.h" +#include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_window.h" +#include "m/m_vec.h" + +static const d2d::LytBrlanMapping brlanMapMapPopup[] = { + {"mapPopup_00_scale.brlan", "G_scale_00"}, + {"mapPopup_00_inOut.brlan", "G_inOut_00"}, +}; + +#define MAP_POPUP_ANIM_SCALE 0 +#define MAP_POPUP_ANIM_INOUT 1 +#define MAP_POPUP_NUM_ANIMS 2 + +static const char *sMapPopupPaneNames[] = { + "N_all_00", + "N_inOut_00", +}; + +#define MAP_POPUP_PANE_ALL 0 +#define MAP_POPUP_PANE_IN_OUT 1 +#define MAP_POPUP_NUM_PANES 2 + +static const char *sMapPopupTextboxNames[] = { + "T_popup_00", + "T_popupS_00", +}; + +#define MAP_POPUP_NUM_TEXTBOXES 2 + +static const char *sMapPopupSizeBoxNames[] = {"W_bgP_00"}; + +bool dLytMapPopup_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPopup_00.brlyt", nullptr); + + for (int i = 0; i < MAP_POPUP_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapMapPopup[i].mFile, resAcc, mLyt.getLayout(), brlanMapMapPopup[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + mAnm[i].setAnimEnable(false); + } + + for (int i = 0; i < MAP_POPUP_NUM_PANES; i++) { + mpPanes[i] = mLyt.findPane(sMapPopupPaneNames[i]); + } + + for (int i = 0; i < MAP_POPUP_NUM_TEXTBOXES; i++) { + mpTextboxes[i] = mLyt.getTextBox(sMapPopupTextboxNames[i]); + } + + for (int i = 0; i < 1; i++) { + mpWindow[i] = mLyt.getWindow(sMapPopupSizeBoxNames[i]); + mpSizeBox[i] = mLyt.getSizeBoxInWindow(sMapPopupSizeBoxNames[i]); + } + + realizeText(); + setInitialState(); + + mMaxScale = mAnm[MAP_POPUP_ANIM_SCALE].getLastFrame(); + + return true; +} + +bool dLytMapPopup_c::remove() { + for (int i = 0; i < MAP_POPUP_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + return true; +} + +bool dLytMapPopup_c::execute() { + checkMapMode(); + updateScale(); + if (mAnm[MAP_POPUP_ANIM_INOUT].isEnabled()) { + if (mAnm[MAP_POPUP_ANIM_INOUT].isStop2()) { + if (mAnm[MAP_POPUP_ANIM_INOUT].isPlayingForwardsOnce()) { + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(false); + } + if (mAnm[MAP_POPUP_ANIM_INOUT].isPlayingBackwardsOnce()) { + field_0x178 = 0; + field_0x180 = 0x30; + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(false); + } + } + } + + for (int i = 0; i < MAP_POPUP_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + return true; +} + +void dLytMapPopup_c::draw() { + u8 alpha = dLytMapGlobal_c::GetInstance()->getAlpha(); + mpPanes[MAP_POPUP_PANE_ALL]->SetAlpha(alpha); + mVec3_c pos; + pos.x = mPosition.x; + pos.y = mPosition.y; + pos.z = 0.0f; + mpPanes[MAP_POPUP_PANE_ALL]->SetTranslate(pos); + mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); + mpPanes[MAP_POPUP_PANE_ALL]->CalculateMtx(mLyt.getDrawInfo()); + mpPanes[MAP_POPUP_PANE_ALL]->Draw(mLyt.getDrawInfo()); +} + +void dLytMapPopup_c::setLabel(const char *label) { + mLabel = label; +} + +void dLytMapPopup_c::realizeText() { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mLabel, true, nullptr, 0); + if (text != nullptr) { + for (int i = 0; i < MAP_POPUP_NUM_TEXTBOXES; i++) { + mpTextboxes[i]->setTextWithGlobalTextProcessor(text); + } + mpWindow[0]->UpdateSize(mpSizeBox[0], 32.0f); + } +} + +void dLytMapPopup_c::setInout(f32 value) { + if (0.0f <= value && value <= mAnm[MAP_POPUP_ANIM_INOUT].getLastFrame()) { + mAnm[MAP_POPUP_ANIM_INOUT].setFrame(value); + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(true); + mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(false); + } +} + +f32 dLytMapPopup_c::getTextRenderWidth() const { + f32 lineWidth = mpTextboxes[0]->getLineDrawWidth(); + return lineWidth * mpPanes[MAP_POPUP_PANE_ALL]->GetScale().x; +} + +void dLytMapPopup_c::setInitialState() { + mAnm[MAP_POPUP_ANIM_SCALE].setRate(1.0f); + mAnm[MAP_POPUP_ANIM_SCALE].setForwardOnce(); + mAnm[MAP_POPUP_ANIM_SCALE].setToStart(); + mAnm[MAP_POPUP_ANIM_SCALE].setAnimEnable(true); + + mAnm[MAP_POPUP_ANIM_INOUT].setRate(1.0f); + mAnm[MAP_POPUP_ANIM_INOUT].setBackwardsOnce(); + mAnm[MAP_POPUP_ANIM_INOUT].setToEnd2(); + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(true); + + mLyt.calc(); + + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(false); + mAnm[MAP_POPUP_ANIM_SCALE].setAnimEnable(false); +} + +void dLytMapPopup_c::updateScale() { + f32 frame = 0.0f; + f32 zoomFrame = dLytMapGlobal_c::GetInstance()->getZoomFrame(); + + switch (mModeCheckResult) { + case MODE_TRANSITION_TO_ZOOM: frame = mMaxScale * zoomFrame; break; + case MODE_TRANSITION_TO_STAGE: frame = mMaxScale * zoomFrame; break; + case MODE_STABLE_STAGE: frame = 0.0f; break; + case MODE_STABLE_ZOOM: frame = mMaxScale; break; + } + + if (mMaxScale < frame) { + frame = mMaxScale; + } else if (frame < 0.0f) { + frame = 0.0f; + } + + mAnm[MAP_POPUP_ANIM_SCALE].setAnimEnable(true); + mAnm[MAP_POPUP_ANIM_SCALE].setFrame(frame); + mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); + mAnm[MAP_POPUP_ANIM_SCALE].setAnimEnable(false); +} + +void dLytMapPopup_c::checkMapMode() { + s32 current = dLytMapGlobal_c::GetInstance()->getCurrentMapMode(); + s32 next = dLytMapGlobal_c::GetInstance()->getNextMapMode(); + + if (current == dLytMapGlobal_c::MAPMODE_PROVINCE && next == dLytMapGlobal_c::MAPMODE_ZOOM) { + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_ZOOM && next == dLytMapGlobal_c::MAPMODE_PROVINCE) { + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_STAGE && next == dLytMapGlobal_c::MAPMODE_ZOOM) { + mModeCheckResult = MODE_TRANSITION_TO_ZOOM; + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_ZOOM && next == dLytMapGlobal_c::MAPMODE_STAGE) { + mModeCheckResult = MODE_TRANSITION_TO_STAGE; + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_PROVINCE) { + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_STAGE) { + mModeCheckResult = MODE_STABLE_STAGE; + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_ZOOM) { + mModeCheckResult = MODE_STABLE_ZOOM; + return; + } +} diff --git a/src/d/lyt/d_textbox.cpp b/src/d/lyt/d_textbox.cpp index 7f77feb6..adab6a3d 100644 --- a/src/d/lyt/d_textbox.cpp +++ b/src/d/lyt/d_textbox.cpp @@ -439,7 +439,7 @@ f32 dTextBox_c::GetLinesHeight() const { return totalHeight; } -f32 dTextBox_c::GetUnkWidthRatio() const { +f32 dTextBox_c::getLineDrawWidth() const { return GetLineWidth(nullptr) / dGfx_c::get16x9to4x3WidthScaleF(); } From fc44994c91e682092a79afdc7d31547779bbb2b6 Mon Sep 17 00:00:00 2001 From: robojumper Date: Tue, 30 Sep 2025 19:32:30 +0200 Subject: [PATCH 03/20] more map --- config/SOUE01/splits.txt | 6 +- config/SOUE01/symbols.txt | 76 +++--- configure.py | 1 + include/d/d_cs_game.h | 4 + include/d/lyt/d_lyt_map.h | 126 ++++++--- include/d/lyt/d_lyt_map_global.h | 8 +- include/toBeSorted/d_beacon.h | 14 + include/toBeSorted/d_flow_mgr.h | 22 +- src/d/lyt/d_lyt_map.cpp | 448 ++++++++++++++++++++++++++++++- src/toBeSorted/d_flow_mgr.cpp | 5 + 10 files changed, 610 insertions(+), 100 deletions(-) create mode 100644 include/toBeSorted/d_beacon.h create mode 100644 src/toBeSorted/d_flow_mgr.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index ad02c030..02984ca5 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -540,7 +540,11 @@ toBeSorted/bigboss_model_math_stuff.cpp: .sbss start:0x80575410 end:0x80575418 toBeSorted/actor_event_flow_manager_related.cpp: - .text start:0x800C3900 end:0x800C447C align:16 + .text start:0x800C3900 end:0x800C3AEC align:16 + +toBeSorted/d_flow_mgr.cpp: + .text start:0x800C3AF0 end:0x800C447C align:16 + .data start:0x80511B18 end:0x80511B30 d/d_lyt_base.cpp: .text start:0x800C4480 end:0x800C4690 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index e58d8816..3f699681 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -180,7 +180,7 @@ fn_80007E60 = .text:0x80007E60; // type:function size:0xF8 fn_80007F60 = .text:0x80007F60; // type:function size:0x68 fn_80007FD0 = .text:0x80007FD0; // type:function size:0x7C fn_80008050 = .text:0x80008050; // type:function size:0x350 -fn_800083A0 = .text:0x800083A0; // type:function size:0x40 +__dt__14dFlowMgrBase_cFv = .text:0x800083A0; // type:function size:0x40 fn_800083E0 = .text:0x800083E0; // type:function size:0x18 fn_80008400 = .text:0x80008400; // type:function size:0x118 fn_80008520 = .text:0x80008520; // type:function size:0x68 @@ -4270,7 +4270,7 @@ fn_800C3820 = .text:0x800C3820; // type:function size:0x80 fn_800C38A0 = .text:0x800C38A0; // type:function size:0x58 fn_800C3900 = .text:0x800C3900; // type:function size:0xD0 fn_800C39D0 = .text:0x800C39D0; // type:function size:0x11C -fn_800C3AF0 = .text:0x800C3AF0; // type:function size:0x1C +__ct__14dFlowMgrBase_cFP7dFlow_c = .text:0x800C3AF0; // type:function size:0x1C ActorEventFlowManagerRelated__triggerEventEntryPoint = .text:0x800C3B10; // type:function size:0xF8 fn_800C3C10 = .text:0x800C3C10; // type:function size:0xE8 fn_800C3D00 = .text:0x800C3D00; // type:function size:0x78 @@ -4286,8 +4286,8 @@ fn_800C40F0 = .text:0x800C40F0; // type:function size:0xB4 fn_800C41B0 = .text:0x800C41B0; // type:function size:0xBC fn_800C4270 = .text:0x800C4270; // type:function size:0x54 fn_800C42D0 = .text:0x800C42D0; // type:function size:0xF8 -fn_800C43D0 = .text:0x800C43D0; // type:function size:0x48 -fn_800C4420 = .text:0x800C4420; // type:function size:0x5C +__ct__10dFlowMgr_cFv = .text:0x800C43D0; // type:function size:0x48 +__dt__10dFlowMgr_cFv = .text:0x800C4420; // type:function size:0x5C __ct__10dLytBase_cFv = .text:0x800C4480; // type:function size:0x54 __dt__10dLytBase_cFv = .text:0x800C44E0; // type:function size:0x94 allocateLytWork1Heap__10dLytBase_cFPCcb = .text:0x800C4580; // type:function size:0xB4 @@ -7516,12 +7516,12 @@ remove__19dLytMapFootPrints_cFv = .text:0x8012E2E0; // type:function size:0x8 execute__19dLytMapFootPrints_cFv = .text:0x8012E2F0; // type:function size:0x204 __ct__7mVec2_cFff = .text:0x8012E500; // type:function size:0xC draw__19dLytMapFootPrints_cFv = .text:0x8012E510; // type:function size:0x1F0 -fn_8012E700 = .text:0x8012E700; // type:function size:0x68 -fn_8012E770 = .text:0x8012E770; // type:function size:0x4 -fn_8012E780 = .text:0x8012E780; // type:function size:0x14 -fn_8012E7A0 = .text:0x8012E7A0; // type:function size:0x24 -fn_8012E7D0 = .text:0x8012E7D0; // type:function size:0x3C -fn_8012E810 = .text:0x8012E810; // type:function size:0x24 +build__16dLytMapPutIcon_cFPQ23d2d10ResAccIf_c = .text:0x8012E700; // type:function size:0x68 +remove__16dLytMapPutIcon_cFv = .text:0x8012E770; // type:function size:0x4 +execute__16dLytMapPutIcon_cFv = .text:0x8012E780; // type:function size:0x14 +draw__16dLytMapPutIcon_cFv = .text:0x8012E7A0; // type:function size:0x24 +setPosition__16dLytMapPutIcon_cFRC7mVec2_c = .text:0x8012E7D0; // type:function size:0x3C +setScale__16dLytMapPutIcon_cFf = .text:0x8012E810; // type:function size:0x24 initializeState_Wait__16dLytMapPinIcon_cFv = .text:0x8012E840; // type:function size:0x14 executeState_Wait__16dLytMapPinIcon_cFv = .text:0x8012E860; // type:function size:0x58 changeState__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8012E8C0; // type:function size:0x10 @@ -7538,18 +7538,18 @@ finalizeState_ToUnselect__16dLytMapPinIcon_cFv = .text:0x8012EAE0; // type:funct initializeState_Remove__16dLytMapPinIcon_cFv = .text:0x8012EAF0; // type:function size:0x4 executeState_Remove__16dLytMapPinIcon_cFv = .text:0x8012EB00; // type:function size:0x18 finalizeState_Remove__16dLytMapPinIcon_cFv = .text:0x8012EB20; // type:function size:0x4 -fn_8012EB30 = .text:0x8012EB30; // type:function size:0xF8 -fn_8012EC30 = .text:0x8012EC30; // type:function size:0x80 -fn_8012ECB0 = .text:0x8012ECB0; // type:function size:0x10C +updatePosition__16dLytMapPinIcon_cFv = .text:0x8012EB30; // type:function size:0xF8 +checkPointedAt__16dLytMapPinIcon_cFv = .text:0x8012EC30; // type:function size:0x80 +setPosition__16dLytMapPinIcon_cFRC7mVec3_c = .text:0x8012ECB0; // type:function size:0x10C removeBeacon__16dLytMapPinIcon_cFv = .text:0x8012EDC0; // type:function size:0x2C __dt__16dLytMapPinIcon_cFv = .text:0x8012EDF0; // type:function size:0x110 __dt__55sFStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c>Fv = .text:0x8012EF00; // type:function size:0xA4 __dt__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012EFB0; // type:function size:0xA0 __dt__32sFStateFct_c<16dLytMapPinIcon_c>Fv = .text:0x8012F050; // type:function size:0x6C __dt__29sFState_c<16dLytMapPinIcon_c>Fv = .text:0x8012F0C0; // type:function size:0x58 -fn_8012F120 = .text:0x8012F120; // type:function size:0x8 +getGlobal__16dLytMapPinIcon_cCFv = .text:0x8012F120; // type:function size:0x8 build__16dLytMapPinIcon_cFPQ23d2d10ResAccIf_c = .text:0x8012F130; // type:function size:0x17C -fn_8012F2B0 = .text:0x8012F2B0; // type:function size:0x6C +setScale__16dLytMapPinIcon_cFf = .text:0x8012F2B0; // type:function size:0x6C remove__16dLytMapPinIcon_cFv = .text:0x8012F320; // type:function size:0x60 execute__16dLytMapPinIcon_cFv = .text:0x8012F380; // type:function size:0xE4 executeState__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012F470; // type:function size:0x10 @@ -7565,21 +7565,21 @@ finalizeState_Select__25dLytMapPinIconAggregate_cFv = .text:0x8012F760; // type: initializeState_Remove__25dLytMapPinIconAggregate_cFv = .text:0x8012F770; // type:function size:0x4 executeState_Remove__25dLytMapPinIconAggregate_cFv = .text:0x8012F780; // type:function size:0x24 finalizeState_Remove__25dLytMapPinIconAggregate_cFv = .text:0x8012F7B0; // type:function size:0x4 -fn_8012F7C0 = .text:0x8012F7C0; // type:function size:0x94 -fn_8012F860 = .text:0x8012F860; // type:function size:0x5C -fn_8012F8C0 = .text:0x8012F8C0; // type:function size:0x4C -fn_8012F910 = .text:0x8012F910; // type:function size:0x1C -fn_8012F930 = .text:0x8012F930; // type:function size:0x68 -fn_8012F9A0 = .text:0x8012F9A0; // type:function size:0x1C -fn_8012F9C0 = .text:0x8012F9C0; // type:function size:0x5C -fn_8012FA20 = .text:0x8012FA20; // type:function size:0xA8 -fn_8012FAD0 = .text:0x8012FAD0; // type:function size:0x50 -fn_8012FB20 = .text:0x8012FB20; // type:function size:0xA8 +findNewBeaconId__25dLytMapPinIconAggregate_cFPl = .text:0x8012F7C0; // type:function size:0x94 +setScale__25dLytMapPinIconAggregate_cFf = .text:0x8012F860; // type:function size:0x5C +updatePosition__25dLytMapPinIconAggregate_cFv = .text:0x8012F8C0; // type:function size:0x4C +setUnk__25dLytMapPinIconAggregate_cFP16LytMap0x80520B5C = .text:0x8012F910; // type:function size:0x1C +setPosition__25dLytMapPinIconAggregate_cFlRC7mVec3_c = .text:0x8012F930; // type:function size:0x68 +unsetAll__25dLytMapPinIconAggregate_cFv = .text:0x8012F9A0; // type:function size:0x1C +getNumSetPins__25dLytMapPinIconAggregate_cCFv = .text:0x8012F9C0; // type:function size:0x5C +build__25dLytMapPinIconAggregate_cFPQ23d2d10ResAccIf_c = .text:0x8012FA20; // type:function size:0xA8 +remove__25dLytMapPinIconAggregate_cFv = .text:0x8012FAD0; // type:function size:0x50 +execute__25dLytMapPinIconAggregate_cFv = .text:0x8012FB20; // type:function size:0xA8 executeState__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012FBD0; // type:function size:0x10 -fn_8012FBE0 = .text:0x8012FBE0; // type:function size:0x50 -fn_8012FC30 = .text:0x8012FC30; // type:function size:0x18 +draw__25dLytMapPinIconAggregate_cFv = .text:0x8012FBE0; // type:function size:0x50 +init__17dLytMapFloorBtn_cFv = .text:0x8012FC30; // type:function size:0x18 changeState__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8012FC50; // type:function size:0x10 -fn_8012FC60 = .text:0x8012FC60; // type:function size:0x10 +execute__17dLytMapFloorBtn_cFv = .text:0x8012FC60; // type:function size:0x10 executeState__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012FC70; // type:function size:0x10 fn_8012FC80 = .text:0x8012FC80; // type:function size:0xB4 fn_8012FD40 = .text:0x8012FD40; // type:function size:0xAC @@ -7616,15 +7616,15 @@ __dt__56sFStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c>Fv = .text:0x801 __dt__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80130800; // type:function size:0xA0 __dt__33sFStateFct_c<17dLytMapFloorBtn_c>Fv = .text:0x801308A0; // type:function size:0x6C __dt__30sFState_c<17dLytMapFloorBtn_c>Fv = .text:0x80130910; // type:function size:0x58 -__dt__20LytMapFourAnimGroupsFv = .text:0x80130970; // type:function size:0xA0 +__dt__24dLytMapFloorBtnAnmGroupsFv = .text:0x80130970; // type:function size:0xA0 __dt__59sFStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c>Fv = .text:0x80130A10; // type:function size:0xA4 __dt__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80130AC0; // type:function size:0xA0 __dt__36sFStateFct_c<20dLytMapFloorBtnMgr_c>Fv = .text:0x80130B60; // type:function size:0x6C __dt__33sFState_c<20dLytMapFloorBtnMgr_c>Fv = .text:0x80130BD0; // type:function size:0x58 -fn_80130C30 = .text:0x80130C30; // type:function size:0x300 +build__20dLytMapFloorBtnMgr_cFPQ23d2d10ResAccIf_c = .text:0x80130C30; // type:function size:0x300 changeState__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80130F30; // type:function size:0x10 -fn_80130F40 = .text:0x80130F40; // type:function size:0xB4 -fn_80131000 = .text:0x80131000; // type:function size:0x2D4 +remove__20dLytMapFloorBtnMgr_cFv = .text:0x80130F40; // type:function size:0xB4 +execute__20dLytMapFloorBtnMgr_cFv = .text:0x80131000; // type:function size:0x2D4 getStateID__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801312E0; // type:function size:0x10 executeState__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801312F0; // type:function size:0x10 fn_80131300 = .text:0x80131300; // type:function size:0xF0 @@ -7749,7 +7749,7 @@ __dt__85sStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13s __dt__55sFStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c>Fv = .text:0x80133F40; // type:function size:0xA4 __dt__16dLytMapCapture_cFv = .text:0x80133FF0; // type:function size:0xB4 __ct__20dLytMapFloorBtnMgr_cFP15dLytMapGlobal_c = .text:0x801340B0; // type:function size:0x178 -__ct__20LytMapFourAnimGroupsFv = .text:0x80134230; // type:function size:0x140 +__ct__24dLytMapFloorBtnAnmGroupsFv = .text:0x80134230; // type:function size:0x140 __ct__20dCursorHitCheckLyt_cFv = .text:0x80134370; // type:function size:0x48 __ct__17dLytMapFloorBtn_cFv = .text:0x801343C0; // type:function size:0xAC __ct__25dLytMapPinIconAggregate_cFv = .text:0x80134470; // type:function size:0xF0 @@ -10108,10 +10108,10 @@ fn_8018B230 = .text:0x8018B230; // type:function size:0x74 ActorLink__handleHotPumpkinSoup = .text:0x8018B2B0; // type:function size:0xE4 fn_8018B3A0 = .text:0x8018B3A0; // type:function size:0x80 shouldDropItemForChance = .text:0x8018B420; // type:function size:0x84 -getBeaconCount = .text:0x8018B4B0; // type:function size:0x44 +getBeaconCount__Fv = .text:0x8018B4B0; // type:function size:0x44 fn_8018B500 = .text:0x8018B500; // type:function size:0x40 getBeaconPositionByIndex = .text:0x8018B540; // type:function size:0x60 -placeBeacon = .text:0x8018B5A0; // type:function size:0x7C +setBeaconPosition__FPC7mVec3_cUl = .text:0x8018B5A0; // type:function size:0x7C placeBeaconButCheckGround = .text:0x8018B620; // type:function size:0x194 fn_8018B7C0 = .text:0x8018B7C0; // type:function size:0x40 fn_8018B800 = .text:0x8018B800; // type:function size:0x24 @@ -31161,8 +31161,8 @@ lbl_80510D84 = .data:0x80510D84; // type:object size:0xC StoryflagManager__STORYFLAG_DEFINITIONS = .data:0x80510D90; // type:object size:0x964 ItemflagManager__ITEMFLAG_DEFINITIONS = .data:0x805116F4; // type:object size:0x3FC DungeonflagManager__FLAG_DEFINITIONS = .data:0x80511AF0; // type:object size:0x28 -lbl_80511B18 = .data:0x80511B18; // type:object size:0xC -lbl_80511B24 = .data:0x80511B24; // type:object size:0xC +__vt__10dFlowMgr_c = .data:0x80511B18; // type:object size:0xC +__vt__14dFlowMgrBase_c = .data:0x80511B24; // type:object size:0xC ActorLytBase__vtable = .data:0x80511B30; // type:object size:0x50 lbl_80511B80 = .data:0x80511B80; // type:object size:0x1C lbl_80511B9C = .data:0x80511B9C; // type:object size:0xC @@ -33474,7 +33474,7 @@ lbl_8051EB30 = .data:0x8051EB30; // type:object size:0xC lbl_8051EB3C = .data:0x8051EB3C; // type:object size:0x1C lbl_8051EB58 = .data:0x8051EB58; // type:object size:0x1C lbl_8051EB74 = .data:0x8051EB74; // type:object size:0xC -lbl_8051EB80 = .data:0x8051EB80; // type:object size:0xC +lbl_8051EB80 = .data:0x8051EB80; // type:object size:0xA data:string lbl_8051EB8C = .data:0x8051EB8C; // type:object size:0x10 lbl_8051EB9C = .data:0x8051EB9C; // type:object size:0x10 lbl_8051EBAC = .data:0x8051EBAC; // type:object size:0x10 diff --git a/configure.py b/configure.py index 920ba14f..8aca9664 100644 --- a/configure.py +++ b/configure.py @@ -488,6 +488,7 @@ config.libs = [ Object(Matching, "d/flag/flag_managers.cpp"), Object(NonMatching, "toBeSorted/bigboss_model_math_stuff.cpp"), Object(NonMatching, "toBeSorted/actor_event_flow_manager_related.cpp"), + Object(NonMatching, "toBeSorted/d_flow_mgr.cpp"), Object(NonMatching, "d/d_lyt_base.cpp"), Object(NonMatching, "toBeSorted/unk_npc_path_stuff_1.cpp"), Object(NonMatching, "toBeSorted/unk_npc_path_stuff_2.cpp"), diff --git a/include/d/d_cs_game.h b/include/d/d_cs_game.h index 0498a9a7..b8dd9831 100644 --- a/include/d/d_cs_game.h +++ b/include/d/d_cs_game.h @@ -431,6 +431,10 @@ public: mNextCursorActive = false; } + dCursorHitCheck_c *getCursorHit() const { + return mCursorIf.getHit(); + } + 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 95865bcb..7b420a56 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -95,14 +95,20 @@ struct LytMap0x80520B5C { bool field_0x05; }; -struct LytMapFourAnimGroups { - /* 0x00 */ d2d::AnmGroup_c mGroup1; - /* 0x40 */ d2d::AnmGroup_c mGroup2; - /* 0x80 */ d2d::AnmGroup_c mGroup3; - /* 0xC0 */ d2d::AnmGroup_c mGroup4; +struct dLytMapFloorBtnAnmGroups { + /* 0x00 */ d2d::AnmGroup_c mLoop; + /* 0x40 */ d2d::AnmGroup_c mOnOff; + /* 0x80 */ d2d::AnmGroup_c mDecide; + /* 0xC0 */ d2d::AnmGroup_c mOnOffLight; }; -// Size 0x1E0 +// Ostensibly a bounding box for lyt elements +struct LytMapTwoVecs { + /* 0x00 */ mVec3_c field_0x00; + /* 0x0C */ mVec3_c field_0x0C; +}; + +/** 2D UI - Map - a placed down beacon */ class dLytMapPinIcon_c { public: friend class dLytMapPinIconAggregate_c; @@ -111,12 +117,12 @@ public: : mStateMgr(*this, sStateID::null), mpBounding(nullptr), field_0x1BC(0), - field_0x1C0(0.0f, 0.0f, 0.0f), - field_0x1CC(0), + mPosition(0.0f, 0.0f, 0.0f), + mIsSet(false), field_0x1D0(nullptr), field_0x1D4(0), mIndex(0), - field_0x1DC(0) {} + mLoopFrame(0) {} virtual ~dLytMapPinIcon_c(); bool build(d2d::ResAccIf_c *resAcc); @@ -124,7 +130,10 @@ public: bool draw(); bool execute(); - void fn_8012EC30(); + void updatePosition(); + void checkPointedAt(); + void setPosition(const mVec3_c &pos); + void setScale(f32 scale); bool isSelect() const { return *mStateMgr.getStateID() == dLytMapPinIcon_c::StateID_ToSelect || @@ -144,56 +153,71 @@ public: private: void removeBeacon(); + dLytMapGlobal_c *getGlobal() const; + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapPinIcon_c); /* 0x040 */ d2d::LytBase_c mLyt; /* 0x0D0 */ d2d::AnmGroup_c mAnmGroups[3]; /* 0x190 */ dCursorHitCheckLyt_c mCsHitCheck; /* 0x1B8 */ nw4r::lyt::Bounding *mpBounding; /* 0x1BC */ UNKWORD field_0x1BC; - /* 0x1C0 */ mVec3_c field_0x1C0; - /* 0x1CC */ u8 field_0x1CC; + /* 0x1C0 */ mVec3_c mPosition; + /* 0x1CC */ bool mIsSet; /* 0x1D0 */ LytMap0x80520B5C *field_0x1D0; /* 0x1D4 */ UNKWORD field_0x1D4; /* 0x1D8 */ s32 mIndex; - /* 0x1DC */ UNKWORD field_0x1DC; + /* 0x1DC */ UNKWORD mLoopFrame; }; class dLytMapPinIconAggregate_c { public: dLytMapPinIconAggregate_c() : mStateMgr(*this, sStateID::null) { field_0x9A0 = nullptr; - field_0x9A4 = 0; - field_0x9A8 = 0; + mLoopFrame = 0; + mLoopFrameMax = 0; for (int i = 0; i < 5; i++) { mPins[i].mIndex = i; } } virtual ~dLytMapPinIconAggregate_c() {} + bool build(d2d::ResAccIf_c *resAcc); bool remove(); + bool execute(); + bool draw(); + + void setScale(f32 scale); + void updatePosition(); + void setUnk(LytMap0x80520B5C *unk); + bool setPosition(s32 index, const mVec3_c &position); + void unsetAll(); + s32 getNumSetPins() const; STATE_FUNC_DECLARE(dLytMapPinIconAggregate_c, Wait); STATE_FUNC_DECLARE(dLytMapPinIconAggregate_c, Select); STATE_FUNC_DECLARE(dLytMapPinIconAggregate_c, Remove); private: + bool findNewBeaconId(s32 *pOutId); + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapPinIconAggregate_c); /* 0x040 */ dLytMapPinIcon_c mPins[5]; /* 0x9A0 */ LytMap0x80520B5C *field_0x9A0; - /* 0x9A4 */ UNKWORD field_0x9A4; - /* 0x9A8 */ UNKWORD field_0x9A8; + /* 0x9A4 */ s32 mLoopFrame; + /* 0x9A8 */ s32 mLoopFrameMax; }; // Size 0x50 class dLytMapFloorBtn_c { + friend class dLytMapFloorBtnMgr_c; public: dLytMapFloorBtn_c() : mStateMgr(*this, sStateID::null), - field_0x3C(0), - field_0x40(0), + mpOwnerLyt(nullptr), + mpAnmGroups(nullptr), field_0x44(0), - field_0x48(0), + mpBounding(nullptr), field_0x4C(0), field_0x4D(0) {} ~dLytMapFloorBtn_c() {} @@ -208,12 +232,17 @@ public: STATE_FUNC_DECLARE(dLytMapFloorBtn_c, SelectInDecide); STATE_FUNC_DECLARE(dLytMapFloorBtn_c, DecideToSelectInDecide); + void init(); + void execute(); + + bool build(d2d::ResAccIf_c *resAcc); + private: /* 0x00 */ UI_STATE_MGR_DECLARE(dLytMapFloorBtn_c); - /* 0x3C */ UNKWORD field_0x3C; - /* 0x40 */ UNKWORD field_0x40; + /* 0x3C */ d2d::LytBase_c *mpOwnerLyt; + /* 0x40 */ dLytMapFloorBtnAnmGroups *mpAnmGroups; /* 0x44 */ UNKWORD field_0x44; - /* 0x48 */ UNKWORD field_0x48; + /* 0x48 */ nw4r::lyt::Bounding *mpBounding; /* 0x4C */ u8 field_0x4C; /* 0x4D */ u8 field_0x4D; }; @@ -221,7 +250,7 @@ private: class dLytMapFloorBtnMgr_c : public d2d::dSubPane { public: dLytMapFloorBtnMgr_c(dLytMapGlobal_c *global) - : mpGlobal(global), field_0x51C(nullptr), mStateMgr(*this, sStateID::null) { + : mpGlobal(global), mpPane(nullptr), mStateMgr(*this, sStateID::null) { field_0x700 = 1; field_0x704 = 0; field_0x708 = 0; @@ -253,8 +282,8 @@ private: /* 0x00C */ UI_STATE_MGR_DECLARE(dLytMapFloorBtnMgr_c); /* 0x048 */ d2d::dLytSub mLyt; /* 0x0DC */ d2d::AnmGroup_c mAnmGroups[1]; - /* 0x11C */ LytMapFourAnimGroups mMoreGroups[4]; - /* 0x51C */ void *field_0x51C; + /* 0x11C */ dLytMapFloorBtnAnmGroups mBtnGroups[4]; + /* 0x51C */ nw4r::lyt::Pane *mpPane; /* 0x520 */ dCursorHitCheckLyt_c mCsHitChecks[4]; /* 0x5C0 */ dLytMapFloorBtn_c mFloorBtns[4]; /* 0x700 */ UNKWORD field_0x700; @@ -295,6 +324,7 @@ public: private: /* 0x00 */ UI_STATE_MGR_DECLARE(dLytMapSavePopupAction_c); + /* 0x3C */ u8 _0x3C[0x44 - 0x3C]; /* 0x44 */ f32 field_0x44; /* 0x48 */ u8 field_0x48; }; @@ -302,12 +332,15 @@ private: // Assumed name class dLytMapSavePopup_c { public: - dLytMapSavePopup_c() {} + dLytMapSavePopup_c() : field_0x4A0(0), field_0x4A4(0), field_0x4A8(-1) {} private: /* 0x000 */ d2d::LytBase_c mLyt; /* 0x090 */ d2d::AnmGroup_c mAnmGroups[2]; /* 0x110 */ dLytMapSavePopupAction_c mActions[12]; + /* 0x4A0 */ UNKWORD field_0x4A0; + /* 0x4A4 */ UNKWORD field_0x4A4; + /* 0x4A8 */ UNKWORD field_0x4A8; }; class dLytMapSaveCaption_c { @@ -345,21 +378,31 @@ private: /* 0x18E */ u8 field_0x18E; }; +// TODO, name made up class dLytMapDecoration_c { public: dLytMapDecoration_c() {} virtual ~dLytMapDecoration_c() {} - // TODO, name made up }; -class dLytMapPutIcon { +/** 2D UI - Map - beacon preview icon following the cursor */ +class dLytMapPutIcon_c { public: - dLytMapPutIcon() {} - virtual ~dLytMapPutIcon() {} - // TODO, name made up + dLytMapPutIcon_c() {} + virtual ~dLytMapPutIcon_c() {} + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void setPosition(const mVec2_c &pos); + void setScale(f32 scale); + +private: /* 0x04 */ d2d::LytBase_c mLyt; - /* 0x98 */ mVec2_c field_0x98; + /* 0x94 */ bool mVisible; + /* 0x95 */ u8 _0x95[0x9C - 0x95]; }; class dLytMapMain_c : public m2d::Base_c { @@ -421,8 +464,7 @@ public: private: /* 0x0010 */ UI_STATE_MGR_DECLARE(dLytMapMain_c); - /* 0x004C */ dFlowMgr_c mFlowMgr; - /* 0x0058 */ u8 _0x0058[0x00A4 - 0x0058]; + /* 0x004C */ dFlowMgrBase_c mFlowMgr; /* 0x00A4 */ dFlow_c mFlow; /* 0x0108 */ u8 _0x0108[0x010C - 0x0108]; /* 0x010C */ d2d::LytBase_c mLyt; @@ -438,16 +480,13 @@ private: /* 0x64C0 */ dLytMapFootPrints_c mFootPrints; - /* 0x6664 */ dLytMapPutIcon mPutIcon; + /* 0x6664 */ dLytMapPutIcon_c mPutIcon; /* 0x6700 */ u8 _0x6700[0x6704 - 0x6700]; /* 0x6704 */ dLytMapSaveObj_c mSaveObjs[12]; /* 0x79C4 */ dLytMapSaveCaption_c mSaveCaption; /* 0x7BD0 */ dLytMapSavePopup_c mSavePopup; - - /* 0x8010 */ u8 _0x7F84[0x807C - 0x8010]; - /* 0x807C */ dLytMapPopupInfo_c mPopupInfo; /* 0x8208 */ u8 _0x8208[0x828C - 0x8208]; @@ -456,6 +495,9 @@ private: /* 0x831C */ u8 _0x831C[0x832C - 0x831C]; + // TODO - it appears the map abuses these hit check things + // to calculate Lyt bounding boxes, and it stores the + // results in 0x8948... /* 0x832C */ dCursorHitCheckLyt_c field_0x832C[33]; /* 0x8854 */ u8 _0x8854[0x8904 - 0x8854]; @@ -467,8 +509,10 @@ private: /* 0x8930 */ mVec3_c field_0x8930; /* 0x893C */ mVec3_c field_0x893C; - /* 0x8948 */ u8 _0x8948[0x8C94 - 0x8948]; - + /* 0x8948 */ LytMapTwoVecs field_0x8948[33]; + + /* 0x8C60 */ u8 _0x8C60[0x8C94 - 0x8C60]; + /* 0x8C94 */ s32 field_0x8C94; /* 0x8C98 */ u8 _0x8C98[0x8CC4 - 0x8C98]; diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index 7480478d..a9b742a5 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -1,12 +1,16 @@ #ifndef D_LYT_MAP_GLOBAL_H #define D_LYT_MAP_GLOBAL_H +#include "common.h" #include "m/m_angle.h" #include "m/m_vec.h" class dLytMapGlobal_c { public: dLytMapGlobal_c(); + ~dLytMapGlobal_c() { + sInstance = nullptr; + } enum MapMode_e { MAPMODE_WORLD = 0, @@ -21,11 +25,11 @@ public: return sInstance; } - const mVec2_c& getField_0x20() const { + const mVec2_c &getField_0x20() const { return field_0x20; } - const mVec3_c& getPlayerPos() const { + const mVec3_c &getPlayerPos() const { return mPlayerPosition; } diff --git a/include/toBeSorted/d_beacon.h b/include/toBeSorted/d_beacon.h new file mode 100644 index 00000000..71631457 --- /dev/null +++ b/include/toBeSorted/d_beacon.h @@ -0,0 +1,14 @@ +#ifndef D_BEACON_H +#define D_BEACON_H + +#include "m/m_vec.h" + +u32 getBeaconCount(); + +/** + * When passed a position, sets the beacon with the given index to the position. + * When position is nullptr, removes the beacon. + */ +void setBeaconPosition(const mVec3_c *position, u32 beaconIndex); + +#endif diff --git a/include/toBeSorted/d_flow_mgr.h b/include/toBeSorted/d_flow_mgr.h index 2c7e1c9f..e1834154 100644 --- a/include/toBeSorted/d_flow_mgr.h +++ b/include/toBeSorted/d_flow_mgr.h @@ -2,17 +2,27 @@ #define D_FLOW_MGR_H #include "common.h" +#include "d/d_message.h" +#include "sized_string.h" -class dFlow_c; - -class dFlowMgr_c { +class dFlowMgrBase_c { public: - dFlowMgr_c(dFlow_c *flow); - virtual ~dFlowMgr_c() {} + dFlowMgrBase_c(dFlow_c *flow); + virtual ~dFlowMgrBase_c() {} private: /* 0x04 */ dFlow_c *mpFlow; - /* 0x08 */ u8 field_0x05; + /* 0x08 */ u8 _0x08[0x14 - 0x08]; + /* 0x14 */ SizedString<0x40> field_0x14; + /* 0x54 */ u8 field_0x54; +}; + +class dFlowMgr_c : public dFlowMgrBase_c { +public: + dFlowMgr_c(); + +private: + /* 0x58 */ dFlow_c mFlow; }; #endif diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 5cd9fcbb..cf2c122a 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -2,6 +2,8 @@ #include "common.h" #include "d/a/d_a_player.h" +#include "d/d_cs_base.h" +#include "d/d_cs_game.h" #include "d/d_cursor_hit_check.h" #include "d/d_d2d.h" #include "d/d_pad.h" @@ -14,9 +16,11 @@ #include "egg/core/eggColorFader.h" #include "m/m_vec.h" #include "m/m_video.h" +#include "nw4r/lyt/lyt_bounding.h" #include "nw4r/lyt/lyt_pane.h" #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" +#include "toBeSorted/d_beacon.h" struct dLytMap_HIO_c { dLytMap_HIO_c(); @@ -83,6 +87,10 @@ dLytMap_HIO_c::dLytMap_HIO_c() { dLytMap_HIO_c::~dLytMap_HIO_c() {} +inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { + return mVec3_c(v.x, v.y, 0.0f); +} + void dMapFootPrintsQueue_c::init() { int j = ARRAY_LENGTH(mEntries) - 1; for (int i = 0; i < (int)ARRAY_LENGTH(mEntries); i++) { @@ -140,8 +148,6 @@ void dMapFootPrintsMgr_c::execute() { } } -// here seems to be mAng::mAng(s16) { ... } - dLytMapFootPrints_c::dLytMapFootPrints_c(dLytMapGlobal_c *global) : mpGlobal(global), mpPane(nullptr), @@ -224,8 +230,6 @@ bool dLytMapFootPrints_c::execute() { return true; } -// here seems to be mVec2_c::mVec2_c(f32, f32) { ... } - void dLytMapFootPrints_c::draw() { if (!field_0x1A0) { return; @@ -244,11 +248,13 @@ void dLytMapFootPrints_c::draw() { mVec2_c scaleV = mVec2_c(scale, scale); mpPane->SetScale(scaleV); + // rgb(104, 222, 222) + // rgb(0, 255, 255) f32 globalAlphaF = globalAlpha; for (int i = 0; i < mCurrentNumSteps; i++) { mVec2_c pos = mVec2_c(global->getField_0x20() + mFootprintPositions[i]); - pane->SetTranslate(mVec3_c(pos.x, pos.y, 0.0f)); + pane->SetTranslate(vec2ToVec3XY(pos)); // TODO - FPR regswaps, maybe fewer temps would work f32 constantAlpha = sHio.mFootstepsAlpha / 255.0f; @@ -262,6 +268,36 @@ void dLytMapFootPrints_c::draw() { } } +void dLytMapPutIcon_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPutIcon_00.brlyt", nullptr); + mVisible = true; + mLyt.calc(); +} + +void dLytMapPutIcon_c::remove() { + // no-op +} + +void dLytMapPutIcon_c::execute() { + mLyt.calc(); +} + +void dLytMapPutIcon_c::draw() { + if (mVisible) { + mLyt.draw(); + } +} + +void dLytMapPutIcon_c::setPosition(const mVec2_c &pos) { + mVec3_c pos3 = vec2ToVec3XY(mVec2_c(pos)); + mLyt.getLayout()->GetRootPane()->SetTranslate(pos3); +} + +void dLytMapPutIcon_c::setScale(f32 scale) { + mLyt.getLayout()->GetRootPane()->SetScale(mVec2_c(scale, scale)); +} + STATE_DEFINE(dLytMapPinIcon_c, Wait); STATE_DEFINE(dLytMapPinIcon_c, ToSelect); STATE_DEFINE(dLytMapPinIcon_c, Select); @@ -383,7 +419,7 @@ void dLytMapPinIcon_c::executeState_Wait() { return; } - if (field_0x1CC == 0) { + if (!mIsSet) { return; } @@ -451,12 +487,76 @@ void dLytMapPinIcon_c::executeState_Remove() { } void dLytMapPinIcon_c::finalizeState_Remove() {} +void dLytMapPinIcon_c::updatePosition() { + dLytMapGlobal_c *global = getGlobal(); + if (mIsSet) { + mVec2_c pos2d; + global->projectOntoMap(pos2d, mPosition); + pos2d += global->getField_0x20(); + mVec3_c translate3d = vec2ToVec3XY(pos2d); + mLyt.getLayout()->GetRootPane()->SetTranslate(translate3d); + } + + bool vis = mIsSet; + mLyt.getLayout()->GetRootPane()->SetVisible(mIsSet); + if (mpBounding != nullptr) { + mpBounding->SetVisible(vis); + } + + mLyt.getLayout()->GetRootPane()->SetAlpha(global->getAlpha()); + mLyt.getLayout()->GetRootPane()->SetInfluencedAlpha(true); + mLyt.calc(); +} + +void dLytMapPinIcon_c::checkPointedAt() { + field_0x1BC = 0; + dCursorHitCheck_c *chk = dCsGame_c::GetInstance()->getCursorHit(); + if (chk != nullptr && chk->getType() == 'lyt ' && + static_cast(chk)->getHitPane() == mpBounding) { + field_0x1BC = 1; + } +} + +void dLytMapPinIcon_c::setPosition(const mVec3_c &pos) { + d2d::AnmGroup_c *anm; + + mPosition = pos; + dLytMapGlobal_c *global = getGlobal(); + mVec2_c pos2d; + global->projectOntoMap(pos2d, pos); + pos2d += global->getField_0x20(); + mVec3_c translate3d = vec2ToVec3XY(mVec2_c(pos2d)); + + mLyt.getLayout()->GetRootPane()->SetTranslate(translate3d); + mLyt.getLayout()->GetRootPane()->SetVisible(true); + + anm = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; + + anm->bind(false); + anm->setFrame(0.0f); + mLyt.calc(); + anm->unbind(); + mIsSet = true; +} + +void dLytMapPinIcon_c::removeBeacon() { + mIsSet = false; + if (mpBounding != nullptr) { + mpBounding->SetVisible(false); + } + setBeaconPosition(nullptr, mIndex); +} + dLytMapPinIcon_c::~dLytMapPinIcon_c() { if (dCsMgr_c::GetInstance()->isRegist(&mCsHitCheck)) { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); } } +dLytMapGlobal_c *dLytMapPinIcon_c::getGlobal() const { + return dLytMapGlobal_c::GetInstance(); +} + static const d2d::LytBrlanMapping sMapPinIconBrlanMap[] = { {"mapPutIcon_00_scale.brlan", "G_scale_00"}, {"mapPutIcon_00_erase.brlan", "G_scale_00"}, @@ -492,8 +592,8 @@ bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { mStateMgr.changeState(StateID_Wait); field_0x1BC = 0; - field_0x1CC = 0; - field_0x1DC = 0; + mIsSet = false; + mLoopFrame = 0; return true; } @@ -505,12 +605,28 @@ bool dLytMapPinIcon_c::remove() { return true; } +void dLytMapPinIcon_c::setScale(f32 scale) { + // TODO - probably inlines + f32 frame = mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].getLastFrame(); + d2d::AnmGroup_c *grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE]; + grp->setFrame(scale * frame); + mLyt.calc(); +} + bool dLytMapPinIcon_c::execute() { - fn_8012EC30(); + checkPointedAt(); mStateMgr.executeState(); field_0x1BC = 0; - mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP].setFrame(field_0x1DC); - // TODO something MapCapture + d2d::AnmGroup_c *grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP]; + grp->setFrame(mLoopFrame); + + // TODO - probably inlines + dLytMapGlobal_c *global = getGlobal(); + f32 frame = mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].getLastFrame(); + grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE]; + f32 tmp = global->getZoomFrame(); + grp->setFrame(tmp * frame); + mLyt.calc(); mCsHitCheck.resetCachedHitboxes(); mCsHitCheck.execute(); @@ -567,6 +683,118 @@ void dLytMapPinIconAggregate_c::executeState_Remove() { } void dLytMapPinIconAggregate_c::finalizeState_Remove() {} +bool dLytMapPinIconAggregate_c::findNewBeaconId(s32 *pOutId) { + bool ret = false; + for (s32 idx = 0; idx < getBeaconCount(); idx++) { + s32 existingIndex = mPins[idx].mIndex; + if (!mPins[idx].mIsSet) { + // If we have an unused id, use that + *pOutId = idx; + ret = true; + break; + } + + // Otherwise use the lowest id ("oldest beacon"?) + if (existingIndex < *pOutId) { + *pOutId = existingIndex; + } + } + + return ret; +} + +void dLytMapPinIconAggregate_c::setScale(f32 scale) { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].setScale(scale); + } +} + +void dLytMapPinIconAggregate_c::updatePosition() { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].updatePosition(); + } +} + +void dLytMapPinIconAggregate_c::setUnk(LytMap0x80520B5C *unk) { + field_0x9A0 = unk; + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].field_0x1D0 = unk; + } +} + +bool dLytMapPinIconAggregate_c::setPosition(s32 index, const mVec3_c &position) { + bool ret = false; + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + if (mPins[idx].mIndex == index) { + mPins[idx].setPosition(position); + ret = true; + break; + } + } + return ret; +} + +void dLytMapPinIconAggregate_c::unsetAll() { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].mIsSet = false; + } +} + +s32 dLytMapPinIconAggregate_c::getNumSetPins() const { + s32 num = 0; + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + if (mPins[idx].mIsSet) { + num++; + } + } + return num; +} + +bool dLytMapPinIconAggregate_c::build(d2d::ResAccIf_c *resAcc) { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].build(resAcc); + } + mLoopFrame = 0; + mLoopFrameMax = mPins[0].mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP].getAnimDuration(); + mStateMgr.changeState(StateID_Wait); + return true; +} + +bool dLytMapPinIconAggregate_c::remove() { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].remove(); + } + return true; +} + +bool dLytMapPinIconAggregate_c::execute() { + mLoopFrame++; + if (mLoopFrame > mLoopFrameMax) { + mLoopFrame = 0; + } + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].mLoopFrame = mLoopFrame; + mPins[idx].execute(); + } + mStateMgr.executeState(); + return true; +} + +bool dLytMapPinIconAggregate_c::draw() { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].draw(); + } + return true; +} + +void dLytMapFloorBtn_c::init() { + mStateMgr.changeState(StateID_Wait); +} + +void dLytMapFloorBtn_c::execute() { + mStateMgr.executeState(); +} + void dLytMapFloorBtn_c::initializeState_Wait() {} void dLytMapFloorBtn_c::executeState_Wait() {} void dLytMapFloorBtn_c::finalizeState_Wait() {} @@ -603,6 +831,196 @@ void dLytMapFloorBtn_c::initializeState_DecideToSelectInDecide() {} void dLytMapFloorBtn_c::executeState_DecideToSelectInDecide() {} void dLytMapFloorBtn_c::finalizeState_DecideToSelectInDecide() {} +static const d2d::LytBrlanMapping brlanMapFloorBtnMgr[] = { + {"mapFloorBtn_00_btnV.brlan", "G_btnV_00"}, +}; + +#define MAP_FLOOR_BTN_MGR_ANIM_BTNV 0 +#define MAP_FLOOR_BTN_MGR_NUM_ANIMS 1 + +static const char *brlanListFloorBtn[] = { + "mapFloorBtn_00_btnLoop.brlan", + "mapFloorBtn_00_btnOnOffNormal.brlan", + "mapFloorBtn_00_btnDecideNormal.brlan", + "mapFloorBtn_00_btnOnOffLight.brlan", +}; + +static const char *groupListFloorBtn[][4] = { + {"G_btnLoop_00", "G_btn_00", "G_btn_00", "G_btn_00"}, + {"G_btnLoop_01", "G_btn_01", "G_btn_01", "G_btn_01"}, + {"G_btnLoop_02", "G_btn_02", "G_btn_02", "G_btn_02"}, + {"G_btnLoop_03", "G_btn_03", "G_btn_03", "G_btn_03"}, +}; + +static const char *sFloorBtnBoundings[] = { + "B_choices_00", + "B_choices_01", + "B_choices_02", + "B_choices_03", +}; + +#define MAP_FLOOR_BTN_MGR_NUM_BTNS 4 + +bool dLytMapFloorBtnMgr_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapFloorBtn_00.brlyt", nullptr); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_ANIMS; i++) { + mAnmGroups[i].init(brlanMapFloorBtnMgr[i].mFile, resAcc, mLyt.getLayout(), brlanMapFloorBtnMgr[i].mName); + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mLoop.init(brlanListFloorBtn[0], resAcc, mLyt.getLayout(), groupListFloorBtn[i][0]); + mBtnGroups[i].mOnOff.init(brlanListFloorBtn[1], resAcc, mLyt.getLayout(), groupListFloorBtn[i][1]); + mBtnGroups[i].mDecide.init(brlanListFloorBtn[2], resAcc, mLyt.getLayout(), groupListFloorBtn[i][2]); + mBtnGroups[i].mOnOffLight.init(brlanListFloorBtn[3], resAcc, mLyt.getLayout(), groupListFloorBtn[i][3]); + } + + nw4r::lyt::Bounding *bounding; + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + bounding = mLyt.findBounding(sFloorBtnBoundings[i]); + mFloorBtns[i].init(); + mFloorBtns[i].mpBounding = bounding; + bounding->SetVisible(false); + mCsHitChecks[i].init(bounding, 0x2, 0, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitChecks[i]); + } + + mpPane = mLyt.findPane("N_all_00"); + mpPane->SetInfluencedAlpha(true); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].mpOwnerLyt = &mLyt; + mFloorBtns[i].mpAnmGroups = &mBtnGroups[i]; + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mOnOff.bind(false); + mBtnGroups[i].mOnOff.setFrame(0.0f); + } + + mLyt.getLayout()->Animate(0); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mOnOff.unbind(); + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mLoop.bind(false); + } + + mLyt.calc(); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mCsHitChecks[i].resetCachedHitboxes(); + mCsHitChecks[i].execute(); + } + + field_0x710 = 0; + field_0x711 = 0; + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].field_0x4C = 0; + } + + mStateMgr.changeState(StateID_Invisible); + + return true; +} + +bool dLytMapFloorBtnMgr_c::remove() { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[i]); + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mOnOff.remove(); + mBtnGroups[i].mLoop.remove(); + mBtnGroups[i].mDecide.remove(); + mBtnGroups[i].mOnOffLight.remove(); + } + // not removing our own anm group... + + dPadNav::setNavEnabled(false, false); + + return true; +} + +bool dLytMapFloorBtnMgr_c::execute() { + field_0x70C = 4; + if (*mStateMgr.getStateID() != StateID_Invisible) { + if (field_0x710) { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].execute(); + } + mStateMgr.executeState(); + } else { + // Determine the currently active floor + s32 activeBtn = 0; + s32 direction = dPadNav::getFSStickNavDirection(); + if (field_0x710 != field_0x711) { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (mFloorBtns[i].field_0x4D) { + activeBtn = i; + } + } + } else { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (mFloorBtns[i].field_0x4C) { + activeBtn = i; + } + } + } + + // Handle navigation + if (activeBtn > 0 && (direction == dPadNav::FS_STICK_UP || direction == dPadNav::FS_STICK_UP_RIGHT || + direction == dPadNav::FS_STICK_UP_LEFT)) { + activeBtn--; + } + + if (activeBtn < field_0x700 - 1 && + (direction == dPadNav::FS_STICK_DOWN || direction == dPadNav::FS_STICK_DOWN_RIGHT || + direction == dPadNav::FS_STICK_DOWN_LEFT)) { + activeBtn++; + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (i == activeBtn) { + mFloorBtns[i].field_0x4C = 1; + if (dCsBase_c::GetInstance() != nullptr) { + dCsBase_c::GetInstance()->setCursorStickTargetPane(mFloorBtns[i].mpBounding); + } + } else { + mFloorBtns[i].field_0x4C = 0; + } + } + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].execute(); + } + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mLoop.play(); + if (mBtnGroups[i].mOnOff.isBound()) { + mBtnGroups[i].mOnOff.play(); + } + if (mBtnGroups[i].mDecide.isBound()) { + mBtnGroups[i].mDecide.play(); + } + if (mBtnGroups[i].mOnOffLight.isBound()) { + mBtnGroups[i].mOnOffLight.play(); + } + } + } + mLyt.calc(); + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mCsHitChecks[i].resetCachedHitboxes(); + mCsHitChecks[i].execute(); + } + + return true; +} + void dLytMapFloorBtnMgr_c::initializeState_Invisible() {} void dLytMapFloorBtnMgr_c::executeState_Invisible() {} void dLytMapFloorBtnMgr_c::finalizeState_Invisible() {} @@ -708,7 +1126,13 @@ dLytMapMain_c::dLytMapMain_c() field_0x8D68(0) {} #pragma dont_inline reset -dLytMapMain_c::~dLytMapMain_c() {} +dLytMapMain_c::~dLytMapMain_c() { + for (int i = 0; i < (int)ARRAY_LENGTH(field_0x832C); i++) { + if (dCsMgr_c::GetInstance()->isRegist(&field_0x832C[i])) { + dCsMgr_c::GetInstance()->unregistCursorTarget(&field_0x832C[i]); + } + } +} void dLytMapMain_c::draw() {} diff --git a/src/toBeSorted/d_flow_mgr.cpp b/src/toBeSorted/d_flow_mgr.cpp new file mode 100644 index 00000000..b7b073ab --- /dev/null +++ b/src/toBeSorted/d_flow_mgr.cpp @@ -0,0 +1,5 @@ +#include "toBeSorted/d_flow_mgr.h" + +dFlowMgrBase_c::dFlowMgrBase_c(dFlow_c *flow): mpFlow(flow) {} + +dFlowMgr_c::dFlowMgr_c() : dFlowMgrBase_c(&mFlow) {} From 3af8f03e78a56701d300a8c8f2639615c6cdc4ad Mon Sep 17 00:00:00 2001 From: robojumper Date: Tue, 30 Sep 2025 23:55:21 +0200 Subject: [PATCH 04/20] more map --- config/SOUE01/symbols.txt | 48 ++-- include/d/d_cs_game.h | 4 + include/d/lyt/d_lyt_map.h | 98 +++++++-- include/d/lyt/d_lyt_map_global.h | 29 ++- include/toBeSorted/d_beacon.h | 7 +- src/d/lyt/d_lyt_map.cpp | 366 ++++++++++++++++++++++++++++--- src/d/lyt/d_lyt_map_global.cpp | 2 +- 7 files changed, 474 insertions(+), 80 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 3f699681..6ceb1bd8 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7581,8 +7581,8 @@ init__17dLytMapFloorBtn_cFv = .text:0x8012FC30; // type:function size:0x18 changeState__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8012FC50; // type:function size:0x10 execute__17dLytMapFloorBtn_cFv = .text:0x8012FC60; // type:function size:0x10 executeState__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012FC70; // type:function size:0x10 -fn_8012FC80 = .text:0x8012FC80; // type:function size:0xB4 -fn_8012FD40 = .text:0x8012FD40; // type:function size:0xAC +directlyDecide__17dLytMapFloorBtn_cFv = .text:0x8012FC80; // type:function size:0xB4 +directlyUndecide__17dLytMapFloorBtn_cFv = .text:0x8012FD40; // type:function size:0xAC initializeState_Wait__17dLytMapFloorBtn_cFv = .text:0x8012FDF0; // type:function size:0x4 executeState_Wait__17dLytMapFloorBtn_cFv = .text:0x8012FE00; // type:function size:0xA0 finalizeState_Wait__17dLytMapFloorBtn_cFv = .text:0x8012FEA0; // type:function size:0x4 @@ -7627,15 +7627,15 @@ remove__20dLytMapFloorBtnMgr_cFv = .text:0x80130F40; // type:function size:0xB4 execute__20dLytMapFloorBtnMgr_cFv = .text:0x80131000; // type:function size:0x2D4 getStateID__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801312E0; // type:function size:0x10 executeState__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801312F0; // type:function size:0x10 -fn_80131300 = .text:0x80131300; // type:function size:0xF0 -fn_801313F0 = .text:0x801313F0; // type:function size:0x58 +checkPointedAtBtn__20dLytMapFloorBtnMgr_cFv = .text:0x80131300; // type:function size:0xF0 +getPointedAtBtnIdx__20dLytMapFloorBtnMgr_cCFv = .text:0x801313F0; // type:function size:0x58 fn_80131450 = .text:0x80131450; // type:function size:0x8 -fn_80131460 = .text:0x80131460; // type:function size:0xC4 -fn_80131530 = .text:0x80131530; // type:function size:0x5C -fn_80131590 = .text:0x80131590; // type:function size:0x1D8 +resetFloor__20dLytMapFloorBtnMgr_cFl = .text:0x80131460; // type:function size:0xC4 +decideSelectedFloor__20dLytMapFloorBtnMgr_cFv = .text:0x80131530; // type:function size:0x5C +canDecideFloor__20dLytMapFloorBtnMgr_cCFv = .text:0x80131590; // type:function size:0x1D8 getStateID__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80131770; // type:function size:0x10 -fn_80131780 = .text:0x80131780; // type:function size:0x50 -fn_801317D0 = .text:0x801317D0; // type:function size:0x27C +getCurrentFloor__20dLytMapFloorBtnMgr_cCFv = .text:0x80131780; // type:function size:0x50 +init__20dLytMapFloorBtnMgr_cFlll = .text:0x801317D0; // type:function size:0x27C initializeState_Invisible__20dLytMapFloorBtnMgr_cFv = .text:0x80131A50; // type:function size:0x4 executeState_Invisible__20dLytMapFloorBtnMgr_cFv = .text:0x80131A60; // type:function size:0x4 finalizeState_Invisible__20dLytMapFloorBtnMgr_cFv = .text:0x80131A70; // type:function size:0x4 @@ -7807,7 +7807,7 @@ __dt__52sFStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c>Fv = .text:0x8013651 fn_801365C0 = .text:0x801365C0; // type:function size:0x4 fn_801365D0 = .text:0x801365D0; // type:function size:0x40 __dt__13dLytMapMain_cFv = .text:0x80136610; // type:function size:0x608 -fn_80136C20 = .text:0x80136C20; // type:function size:0xC +getGlobal__13dLytMapMain_cFv = .text:0x80136C20; // type:function size:0xC fn_80136C30 = .text:0x80136C30; // type:function size:0xC8 fn_80136D00 = .text:0x80136D00; // type:function size:0x6CC changeState__82sStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801373D0; // type:function size:0x10 @@ -7818,11 +7818,11 @@ fn_801378E0 = .text:0x801378E0; // type:function size:0x838 getStateID__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80138120; // type:function size:0x10 draw__13dLytMapMain_cFv = .text:0x80138130; // type:function size:0x238 fn_80138370 = .text:0x80138370; // type:function size:0x138 -fn_801384B0 = .text:0x801384B0; // type:function size:0x5C -fn_80138510 = .text:0x80138510; // type:function size:0x140 -fn_80138650 = .text:0x80138650; // type:function size:0x1E0 +canChangeUpDirection__13dLytMapMain_cCFlUc = .text:0x801384B0; // type:function size:0x5C +canZoomIn__13dLytMapMain_cCFl = .text:0x80138510; // type:function size:0x140 +canZoomOut__13dLytMapMain_cCFl = .text:0x80138650; // type:function size:0x1E0 fn_80138830 = .text:0x80138830; // type:function size:0x254 -fn_80138A90 = .text:0x80138A90; // type:function size:0x8C +needsNav__13dLytMapMain_cCFl = .text:0x80138A90; // type:function size:0x8C fn_80138B20 = .text:0x80138B20; // type:function size:0x110 fn_80138C30 = .text:0x80138C30; // type:function size:0x38 fn_80138C70 = .text:0x80138C70; // type:function size:0xA4 @@ -7830,7 +7830,7 @@ fn_80138D20 = .text:0x80138D20; // type:function size:0x5C fn_80138D80 = .text:0x80138D80; // type:function size:0xB0 fn_80138E30 = .text:0x80138E30; // type:function size:0xD4 fn_80138F10 = .text:0x80138F10; // type:function size:0xA0 -fn_80138FB0 = .text:0x80138FB0; // type:function size:0xA4 +canResetPosition__13dLytMapMain_cCFlUc = .text:0x80138FB0; // type:function size:0xA4 fn_80139060 = .text:0x80139060; // type:function size:0x28 isOpenMaybe__13dLytMapMain_cCFv = .text:0x80139090; // type:function size:0x478 fn_80139510 = .text:0x80139510; // type:function size:0xA8 @@ -7865,8 +7865,8 @@ fn_8013C6B0 = .text:0x8013C6B0; // type:function size:0xA8 fn_8013C760 = .text:0x8013C760; // type:function size:0x100 fn_8013C860 = .text:0x8013C860; // type:function size:0x1C fn_8013C880 = .text:0x8013C880; // type:function size:0x64 -fn_8013C8F0 = .text:0x8013C8F0; // type:function size:0x644 -fn_8013CF40 = .text:0x8013CF40; // type:function size:0x54C +zoomIn__13dLytMapMain_cFv = .text:0x8013C8F0; // type:function size:0x644 +zoomOut__13dLytMapMain_cFv = .text:0x8013CF40; // type:function size:0x54C initializeState_Active__13dLytMapMain_cFv = .text:0x8013D490; // type:function size:0x4 executeState_Active__13dLytMapMain_cFv = .text:0x8013D4A0; // type:function size:0x65C finalizeState_Active__13dLytMapMain_cFv = .text:0x8013DB00; // type:function size:0x10 @@ -8006,7 +8006,7 @@ fn_80143120 = .text:0x80143120; // type:function size:0xC0 fn_801431E0 = .text:0x801431E0; // type:function size:0x11C fn_80143300 = .text:0x80143300; // type:function size:0x54 fn_80143360 = .text:0x80143360; // type:function size:0x1D4 -fn_80143540 = .text:0x80143540; // type:function size:0x374 +checkScroll__13dLytMapMain_cFv = .text:0x80143540; // type:function size:0x374 fn_801438C0 = .text:0x801438C0; // type:function size:0x6C fn_80143930 = .text:0x80143930; // type:function size:0x60 fn_80143990 = .text:0x80143990; // type:function size:0x4C @@ -10066,7 +10066,7 @@ fn_801897D0 = .text:0x801897D0; // type:function size:0x168 fn_80189940 = .text:0x80189940; // type:function size:0x8C fn_801899D0 = .text:0x801899D0; // type:function size:0xEC fn_80189AC0 = .text:0x80189AC0; // type:function size:0x68 -fn_80189B30 = .text:0x80189B30; // type:function size:0x50 +setIslandNamesOn__19dLytMapDecoration_cFb = .text:0x80189B30; // type:function size:0x50 fn_80189B80 = .text:0x80189B80; // type:function size:0x4 fn_80189B90 = .text:0x80189B90; // type:function size:0x27C fn_80189E10 = .text:0x80189E10; // type:function size:0xF4 @@ -10108,11 +10108,11 @@ fn_8018B230 = .text:0x8018B230; // type:function size:0x74 ActorLink__handleHotPumpkinSoup = .text:0x8018B2B0; // type:function size:0xE4 fn_8018B3A0 = .text:0x8018B3A0; // type:function size:0x80 shouldDropItemForChance = .text:0x8018B420; // type:function size:0x84 -getBeaconCount__Fv = .text:0x8018B4B0; // type:function size:0x44 +getMaxBeaconCount__Fv = .text:0x8018B4B0; // type:function size:0x44 fn_8018B500 = .text:0x8018B500; // type:function size:0x40 getBeaconPositionByIndex = .text:0x8018B540; // type:function size:0x60 setBeaconPosition__FPC7mVec3_cUl = .text:0x8018B5A0; // type:function size:0x7C -placeBeaconButCheckGround = .text:0x8018B620; // type:function size:0x194 +setBeaconPositionChecked__FPC7mVec3_cUl = .text:0x8018B620; // type:function size:0x194 fn_8018B7C0 = .text:0x8018B7C0; // type:function size:0x40 fn_8018B800 = .text:0x8018B800; // type:function size:0x24 fn_8018B830 = .text:0x8018B830; // type:function size:0x4 @@ -33500,8 +33500,10 @@ lbl_8051ED54 = .data:0x8051ED54; // type:object size:0xC lbl_8051ED60 = .data:0x8051ED60; // type:object size:0x10 lbl_8051ED70 = .data:0x8051ED70; // type:object size:0xC lbl_8051ED7C = .data:0x8051ED7C; // type:object size:0x10 -lbl_8051ED8C = .data:0x8051ED8C; // type:object size:0x64 -lbl_8051EDF0 = .data:0x8051EDF0; // type:object size:0xC +lbl_8051ED8C = .data:0x8051ED8C; // type:object size:0x9 data:string +lbl_8051ED98 = .data:0x8051ED98; // type:object size:0x40 +lbl_8051EDD8 = .data:0x8051EDD8; // type:object size:0x15 data:string +lbl_8051EDF0 = .data:0x8051EDF0; // type:object size:0x9 data:string lbl_8051EDFC = .data:0x8051EDFC; // type:object size:0xC lbl_8051EE08 = .data:0x8051EE08; // type:object size:0xC lbl_8051EE14 = .data:0x8051EE14; // type:object size:0xC diff --git a/include/d/d_cs_game.h b/include/d/d_cs_game.h index b8dd9831..11c1373b 100644 --- a/include/d/d_cs_game.h +++ b/include/d/d_cs_game.h @@ -435,6 +435,10 @@ public: return mCursorIf.getHit(); } + dCursorInterfaceGame_c *getCursorIf() { + return &mCursorIf; + } + 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 7b420a56..6ca15fb8 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -170,6 +170,8 @@ private: }; class dLytMapPinIconAggregate_c { + friend class dLytMapMain_c; + public: dLytMapPinIconAggregate_c() : mStateMgr(*this, sStateID::null) { field_0x9A0 = nullptr; @@ -211,6 +213,7 @@ private: // Size 0x50 class dLytMapFloorBtn_c { friend class dLytMapFloorBtnMgr_c; + public: dLytMapFloorBtn_c() : mStateMgr(*this, sStateID::null), @@ -218,8 +221,8 @@ public: mpAnmGroups(nullptr), field_0x44(0), mpBounding(nullptr), - field_0x4C(0), - field_0x4D(0) {} + mSelected(false), + mDecided(false) {} ~dLytMapFloorBtn_c() {} STATE_FUNC_DECLARE(dLytMapFloorBtn_c, Wait); @@ -237,27 +240,30 @@ public: bool build(d2d::ResAccIf_c *resAcc); + void directlyDecide(); + void directlyUndecide(); + private: /* 0x00 */ UI_STATE_MGR_DECLARE(dLytMapFloorBtn_c); /* 0x3C */ d2d::LytBase_c *mpOwnerLyt; /* 0x40 */ dLytMapFloorBtnAnmGroups *mpAnmGroups; /* 0x44 */ UNKWORD field_0x44; /* 0x48 */ nw4r::lyt::Bounding *mpBounding; - /* 0x4C */ u8 field_0x4C; - /* 0x4D */ u8 field_0x4D; + /* 0x4C */ bool mSelected; + /* 0x4D */ bool mDecided; }; class dLytMapFloorBtnMgr_c : public d2d::dSubPane { public: dLytMapFloorBtnMgr_c(dLytMapGlobal_c *global) : mpGlobal(global), mpPane(nullptr), mStateMgr(*this, sStateID::null) { - field_0x700 = 1; - field_0x704 = 0; - field_0x708 = 0; + mNumFloors = 1; + mBaseFloorOffset = 0; + mSelectedBtnIdx = 0; field_0x70C = 4; - field_0x710 = 0; - field_0x711 = 0; - field_0x712 = 0; + field_0x710 = false; + field_0x711 = false; + field_0x712 = false; } virtual ~dLytMapFloorBtnMgr_c(); @@ -277,7 +283,22 @@ public: STATE_FUNC_DECLARE(dLytMapFloorBtnMgr_c, Invisible); STATE_FUNC_DECLARE(dLytMapFloorBtnMgr_c, Wait); + void init(s32 numFloors, s32 baseFloorOffset, s32 selectedFloor); + + bool canDecideFloor() const; + void decideSelectedFloor(); + s32 getCurrentFloor() const; + s32 getPointedAtBtnIdx() const; + + bool hasPointedAtABtnIdx() const { + return getPointedAtBtnIdx() >= 0; + } + + void resetFloor(s32 newFloor); + private: + void checkPointedAtBtn(); + /* 0x008 */ dLytMapGlobal_c *mpGlobal; /* 0x00C */ UI_STATE_MGR_DECLARE(dLytMapFloorBtnMgr_c); /* 0x048 */ d2d::dLytSub mLyt; @@ -286,13 +307,13 @@ private: /* 0x51C */ nw4r::lyt::Pane *mpPane; /* 0x520 */ dCursorHitCheckLyt_c mCsHitChecks[4]; /* 0x5C0 */ dLytMapFloorBtn_c mFloorBtns[4]; - /* 0x700 */ UNKWORD field_0x700; - /* 0x704 */ UNKWORD field_0x704; - /* 0x708 */ UNKWORD field_0x708; + /* 0x700 */ s32 mNumFloors; + /* 0x704 */ s32 mBaseFloorOffset; + /* 0x708 */ s32 mSelectedBtnIdx; /* 0x70C */ UNKWORD field_0x70C; - /* 0x710 */ u8 field_0x710; - /* 0x711 */ u8 field_0x711; - /* 0x712 */ u8 field_0x712; + /* 0x710 */ bool field_0x710; + /* 0x711 */ bool field_0x711; + /* 0x712 */ bool field_0x712; }; // Size 0x4C @@ -383,6 +404,8 @@ class dLytMapDecoration_c { public: dLytMapDecoration_c() {} virtual ~dLytMapDecoration_c() {} + + void setIslandNamesOn(bool on); }; /** 2D UI - Map - beacon preview icon following the cursor */ @@ -463,6 +486,21 @@ public: STATE_FUNC_DECLARE(dLytMapMain_c, EventSaveObjDecide); private: + dLytMapGlobal_c *getGlobal(); + void checkScroll(); + bool needsNav(s32 mapMode) const; + bool canZoomOut(s32 mapMode) const; + bool canZoomIn(s32 mapMode) const; + bool canResetPosition(s32 mapMode, u8) const; + bool canChangeUpDirection(s32 mapMode, u8) const; + + f32 fn_80142D90(s32); + void fn_80142F00(mVec3_c &, s32 mapMode, u8, const mVec3_c &, const mAng &); + void fn_8013FB70(const mVec3_c&, f32); + + void zoomOut(); + void zoomIn(); + /* 0x0010 */ UI_STATE_MGR_DECLARE(dLytMapMain_c); /* 0x004C */ dFlowMgrBase_c mFlowMgr; /* 0x00A4 */ dFlow_c mFlow; @@ -511,12 +549,24 @@ private: /* 0x8948 */ LytMapTwoVecs field_0x8948[33]; - /* 0x8C60 */ u8 _0x8C60[0x8C94 - 0x8C60]; + /* 0x8C60 */ s32 mMaxBeaconCount; + /* 0x8C64 */ s32 field_0x8C64; + /* 0x8C68 */ s32 field_0x8C68; + /* 0x8C6C */ u8 _0x8C6C[0x8C90 - 0x8C6C]; + + /* 0x8C90 */ u8 field_0x8C90; /* 0x8C94 */ s32 field_0x8C94; - /* 0x8C98 */ u8 _0x8C98[0x8CC4 - 0x8C98]; + /* 0x8C98 */ u8 _0x8C98[0x8CA4 - 0x8C98]; + /* 0x8CA4 */ s32 field_0x8CA4; + /* 0x8CA8 */ s32 field_0x8CA8; + + /* 0x8CAC */ u8 _0x8CAC[0x8CC0 - 0x8CAC]; + + /* 0x8CC0 */ bool field_0x8CC0; + /* 0x8CC1 */ bool field_0x8CC1; /* 0x8CC4 */ mVec3_c field_0x8CC4; /* 0x8CD0 */ mVec3_c field_0x8CD0; /* 0x8CDC */ mVec3_c field_0x8CDC; @@ -535,9 +585,9 @@ private: /* 0x8D4C */ f32 field_0x8D4C; /* 0x8D50 */ f32 field_0x8D50; /* 0x8D54 */ u8 _0x8D54[0x8D58 - 0x8D54]; - /* 0x8D58 */ UNKWORD field_0x8D58; + /* 0x8D58 */ s32 field_0x8D58; /* 0x8D5C */ UNKWORD field_0x8D5C; - /* 0x8D60 */ UNKWORD field_0x8D60; + /* 0x8D60 */ s32 field_0x8D60; /* 0x8D64 */ UNKWORD field_0x8D64; /* 0x8D68 */ mAng field_0x8D68; /* 0x8D6A */ u8 field_0x8D6A; @@ -547,7 +597,13 @@ private: /* 0x8D74 */ u8 _0x8D74[0x8D94 - 0x8D74]; /* 0x8D94 */ d2d::SubPaneList mSubpaneList; /* 0x8DA0 */ d2d::SubPaneListNode mSubpane; - /* 0x8DB0 */ u8 _0x8DB0[0x8DC8 - 0x8DB0]; + /* 0x8DB0 */ u8 _0x8DB0[0x8DB4 - 0x8DB0]; + /* 0x8DB4 */ bool mNavEnabled; + /* 0x8DB4 */ bool field_0x8DB5; + /* 0x8DB6 */ u8 _0x8DB6[0x8DBC - 0x8DB6]; + /* 0x8DBC */ bool mIslandNamesOn; + /* 0x8DBD */ bool field_0x8DBD; + /* 0x8DBE */ u8 _0x8DBE[0x8DC8 - 0x8DBE]; /* 0x8DC8 */ dLytMapGlobal_c mGlobal; }; diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index a9b742a5..646bac8a 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -15,24 +15,35 @@ public: enum MapMode_e { MAPMODE_WORLD = 0, MAPMODE_PROVINCE = 1, + MAPMODE_WORLD_SKY = 2, MAPMODE_STAGE = 3, MAPMODE_ZOOM = 4, - - // There probably are more special-purpose modes... }; static dLytMapGlobal_c *GetInstance() { return sInstance; } + const mVec3_c &getField_0x00() const { + return field_0x00; + } + const mVec2_c &getField_0x20() const { return field_0x20; } + const mVec3_c &getMapRotationCenter() const { + return mMapRotationCenter; + } + const mVec3_c &getPlayerPos() const { return mPlayerPosition; } + const mAng &getField_0x56() const { + return field_0x56; + } + u8 getAlpha() const { return mAlpha; } @@ -53,6 +64,14 @@ public: return field_0x44; } + s32 getFloor() const { + return mFloor; + } + + void setFloor(s32 floor) { + mFloor = floor; + } + void projectOntoMap(mVec2_c &result, const mVec3_c &position) const; void unprojectFromMap(mVec3_c &result, const mVec2_c &position) const; void unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const; @@ -81,13 +100,15 @@ private: /* 0x3C */ mAng mMapRotation; /* 0x40 */ f32 field_0x40; /* 0x44 */ f32 field_0x44; - /* 0x48 */ UNKWORD mLevel; + /* 0x48 */ s32 mFloor; /* 0x4C */ u8 field_0x4C; /* 0x4D */ u8 field_0x4D; /* 0x4E */ u8 mAlpha; /* 0x4F */ u8 field_0x4F; /* 0x50 */ UNKWORD field_0x50; - /* 0x54 */ u8 _0x54[0x5C - 0x54]; + /* 0x54 */ u8 _0x54[0x56 - 0x54]; + /* 0x56 */ mAng field_0x56; + /* 0x58 */ u8 _0x58[0x5C - 0x58]; /* 0x5C */ s32 mCurrentMapMode; /* 0x60 */ s32 mNextMapMode; /* 0x64 */ f32 mZoomFrame; ///< 0.0f when zoomed out, 1.0f when zoomed in diff --git a/include/toBeSorted/d_beacon.h b/include/toBeSorted/d_beacon.h index 71631457..27efce6a 100644 --- a/include/toBeSorted/d_beacon.h +++ b/include/toBeSorted/d_beacon.h @@ -3,7 +3,7 @@ #include "m/m_vec.h" -u32 getBeaconCount(); +u32 getMaxBeaconCount(); /** * When passed a position, sets the beacon with the given index to the position. @@ -11,4 +11,9 @@ u32 getBeaconCount(); */ void setBeaconPosition(const mVec3_c *position, u32 beaconIndex); +/** + * Sets a beacon position similar to `setBeaconPosition`, but corrects the ground level + */ +void setBeaconPositionChecked(const mVec3_c *position, u32 beaconIndex); + #endif diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index cf2c122a..cd1f6491 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -6,16 +6,20 @@ #include "d/d_cs_game.h" #include "d/d_cursor_hit_check.h" #include "d/d_d2d.h" +#include "d/d_message.h" #include "d/d_pad.h" #include "d/d_pad_nav.h" #include "d/d_player.h" +#include "d/d_rumble.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_textbox.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "egg/core/eggColorFader.h" #include "m/m_vec.h" #include "m/m_video.h" +#include "nw4r/g3d/g3d_obj.h" #include "nw4r/lyt/lyt_bounding.h" #include "nw4r/lyt/lyt_pane.h" #include "sized_string.h" @@ -248,8 +252,6 @@ void dLytMapFootPrints_c::draw() { mVec2_c scaleV = mVec2_c(scale, scale); mpPane->SetScale(scaleV); - // rgb(104, 222, 222) - // rgb(0, 255, 255) f32 globalAlphaF = globalAlpha; for (int i = 0; i < mCurrentNumSteps; i++) { @@ -560,7 +562,7 @@ dLytMapGlobal_c *dLytMapPinIcon_c::getGlobal() const { static const d2d::LytBrlanMapping sMapPinIconBrlanMap[] = { {"mapPutIcon_00_scale.brlan", "G_scale_00"}, {"mapPutIcon_00_erase.brlan", "G_scale_00"}, - { "mapPutIcon_00_loop.brlan", "G_scale_00"}, + { "mapPutIcon_00_loop.brlan", "G_loop_00"}, }; bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { @@ -685,7 +687,7 @@ void dLytMapPinIconAggregate_c::finalizeState_Remove() {} bool dLytMapPinIconAggregate_c::findNewBeaconId(s32 *pOutId) { bool ret = false; - for (s32 idx = 0; idx < getBeaconCount(); idx++) { + for (s32 idx = 0; idx < getMaxBeaconCount(); idx++) { s32 existingIndex = mPins[idx].mIndex; if (!mPins[idx].mIsSet) { // If we have an unused id, use that @@ -795,42 +797,161 @@ void dLytMapFloorBtn_c::execute() { mStateMgr.executeState(); } +void dLytMapFloorBtn_c::directlyDecide() { + if (mpAnmGroups->mOnOff.isBound()) { + mpAnmGroups->mOnOff.unbind(); + } + if (mpAnmGroups->mDecide.isBound()) { + mpAnmGroups->mDecide.unbind(); + } + mpAnmGroups->mOnOffLight.bind(false); + mpAnmGroups->mOnOffLight.setToEnd(); + mpOwnerLyt->calc(); + mpAnmGroups->mOnOffLight.unbind(); +} + +void dLytMapFloorBtn_c::directlyUndecide() { + if (mpAnmGroups->mOnOffLight.isBound()) { + mpAnmGroups->mOnOffLight.unbind(); + } + if (mpAnmGroups->mDecide.isBound()) { + mpAnmGroups->mDecide.unbind(); + } + mpAnmGroups->mOnOff.bind(false); + mpAnmGroups->mOnOff.setFrame(0.0f); + mpOwnerLyt->calc(); + mpAnmGroups->mOnOff.unbind(); +} + void dLytMapFloorBtn_c::initializeState_Wait() {} -void dLytMapFloorBtn_c::executeState_Wait() {} +void dLytMapFloorBtn_c::executeState_Wait() { + if (mSelected) { + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); + mpAnmGroups->mOnOff.bind(false); + mpAnmGroups->mOnOff.setFrame(0.0f); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_FLOOR); + mStateMgr.changeState(StateID_ToSelect); + } +} void dLytMapFloorBtn_c::finalizeState_Wait() {} void dLytMapFloorBtn_c::initializeState_ToSelect() {} -void dLytMapFloorBtn_c::executeState_ToSelect() {} +void dLytMapFloorBtn_c::executeState_ToSelect() { + if (mpAnmGroups->mOnOff.isEndReached()) { + mpOwnerLyt->calc(); + mpAnmGroups->mOnOff.unbind(); + mStateMgr.changeState(StateID_Select); + } +} void dLytMapFloorBtn_c::finalizeState_ToSelect() {} void dLytMapFloorBtn_c::initializeState_Select() {} -void dLytMapFloorBtn_c::executeState_Select() {} +void dLytMapFloorBtn_c::executeState_Select() { + if (!mSelected) { + mpAnmGroups->mOnOff.bind(false); + mpAnmGroups->mOnOff.setBackward(); + mpAnmGroups->mOnOff.setToStart(); + mStateMgr.changeState(StateID_ToWait); + } else if (mDecided) { + mpAnmGroups->mDecide.bind(false); + mpAnmGroups->mDecide.setFrame(0.0f); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_SELECT_FLOOR); + mStateMgr.changeState(StateID_ToSelectInDecide); + } +} void dLytMapFloorBtn_c::finalizeState_Select() {} void dLytMapFloorBtn_c::initializeState_ToWait() {} -void dLytMapFloorBtn_c::executeState_ToWait() {} +void dLytMapFloorBtn_c::executeState_ToWait() { + if (mpAnmGroups->mOnOff.isStop2()) { + mpOwnerLyt->calc(); + mpAnmGroups->mOnOff.unbind(); + mStateMgr.changeState(StateID_Wait); + } +} void dLytMapFloorBtn_c::finalizeState_ToWait() {} void dLytMapFloorBtn_c::initializeState_ToSelectInDecide() {} -void dLytMapFloorBtn_c::executeState_ToSelectInDecide() {} +void dLytMapFloorBtn_c::executeState_ToSelectInDecide() { + if (mpAnmGroups->mDecide.isStop2()) { + mpOwnerLyt->calc(); + mpAnmGroups->mDecide.unbind(); + mStateMgr.changeState(StateID_SelectInDecide); + } +} void dLytMapFloorBtn_c::finalizeState_ToSelectInDecide() {} void dLytMapFloorBtn_c::initializeState_SelectInDecide() {} -void dLytMapFloorBtn_c::executeState_SelectInDecide() {} +void dLytMapFloorBtn_c::executeState_SelectInDecide() { + if (!mSelected) { + mpAnmGroups->mOnOffLight.bind(false); + mpAnmGroups->mOnOffLight.setToStart(); + mStateMgr.changeState(StateID_ToDecide); + } +} void dLytMapFloorBtn_c::finalizeState_SelectInDecide() {} void dLytMapFloorBtn_c::initializeState_ToDecide() {} -void dLytMapFloorBtn_c::executeState_ToDecide() {} +void dLytMapFloorBtn_c::executeState_ToDecide() { + if (mpAnmGroups->mOnOffLight.isStop2()) { + mpAnmGroups->mOnOffLight.unbind(); + mpOwnerLyt->calc(); + mStateMgr.changeState(StateID_Decide); + } +} void dLytMapFloorBtn_c::finalizeState_ToDecide() {} void dLytMapFloorBtn_c::initializeState_Decide() {} -void dLytMapFloorBtn_c::executeState_Decide() {} +void dLytMapFloorBtn_c::executeState_Decide() { + if (mSelected) { + mpAnmGroups->mOnOffLight.bind(false); + mpAnmGroups->mOnOffLight.setBackward(); + mpAnmGroups->mOnOffLight.setToStart(); + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_FLOOR); + mStateMgr.changeState(StateID_DecideToSelectInDecide); + } else if (!mDecided) { + mpAnmGroups->mOnOff.bind(false); + mpAnmGroups->mOnOff.setFrame(0.0f); + mpOwnerLyt->getLayout()->Animate(0); + mpOwnerLyt->calc(); + mpAnmGroups->mOnOff.unbind(); + mStateMgr.changeState(StateID_Wait); + } +} void dLytMapFloorBtn_c::finalizeState_Decide() {} void dLytMapFloorBtn_c::initializeState_DecideToSelectInDecide() {} -void dLytMapFloorBtn_c::executeState_DecideToSelectInDecide() {} +void dLytMapFloorBtn_c::executeState_DecideToSelectInDecide() { + if (mpAnmGroups->mOnOffLight.isStop2()) { + mpOwnerLyt->calc(); + mpAnmGroups->mOnOffLight.unbind(); + mStateMgr.changeState(StateID_SelectInDecide); + } +} void dLytMapFloorBtn_c::finalizeState_DecideToSelectInDecide() {} +static const char *sFloorBtnBoundings[] = { + "B_choices_00", + "B_choices_01", + "B_choices_02", + "B_choices_03", +}; + +static const char *sFloorBtnText[] = { + "T_text_00", + "T_text_01", + "T_text_02", + "T_text_03", +}; + +static const char *sFloorBtnTextS[] = { + "T_textS_00", + "T_textS_01", + "T_textS_02", + "T_textS_03", +}; + static const d2d::LytBrlanMapping brlanMapFloorBtnMgr[] = { {"mapFloorBtn_00_btnV.brlan", "G_btnV_00"}, }; @@ -852,13 +973,6 @@ static const char *groupListFloorBtn[][4] = { {"G_btnLoop_03", "G_btn_03", "G_btn_03", "G_btn_03"}, }; -static const char *sFloorBtnBoundings[] = { - "B_choices_00", - "B_choices_01", - "B_choices_02", - "B_choices_03", -}; - #define MAP_FLOOR_BTN_MGR_NUM_BTNS 4 bool dLytMapFloorBtnMgr_c::build(d2d::ResAccIf_c *resAcc) { @@ -916,11 +1030,11 @@ bool dLytMapFloorBtnMgr_c::build(d2d::ResAccIf_c *resAcc) { mCsHitChecks[i].execute(); } - field_0x710 = 0; - field_0x711 = 0; + field_0x710 = false; + field_0x711 = false; for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { - mFloorBtns[i].field_0x4C = 0; + mFloorBtns[i].mSelected = false; } mStateMgr.changeState(StateID_Invisible); @@ -960,13 +1074,13 @@ bool dLytMapFloorBtnMgr_c::execute() { s32 direction = dPadNav::getFSStickNavDirection(); if (field_0x710 != field_0x711) { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { - if (mFloorBtns[i].field_0x4D) { + if (mFloorBtns[i].mDecided) { activeBtn = i; } } } else { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { - if (mFloorBtns[i].field_0x4C) { + if (mFloorBtns[i].mSelected) { activeBtn = i; } } @@ -974,11 +1088,11 @@ bool dLytMapFloorBtnMgr_c::execute() { // Handle navigation if (activeBtn > 0 && (direction == dPadNav::FS_STICK_UP || direction == dPadNav::FS_STICK_UP_RIGHT || - direction == dPadNav::FS_STICK_UP_LEFT)) { + direction == dPadNav::FS_STICK_UP_LEFT)) { activeBtn--; } - if (activeBtn < field_0x700 - 1 && + if (activeBtn < mNumFloors - 1 && (direction == dPadNav::FS_STICK_DOWN || direction == dPadNav::FS_STICK_DOWN_RIGHT || direction == dPadNav::FS_STICK_DOWN_LEFT)) { activeBtn++; @@ -986,12 +1100,12 @@ bool dLytMapFloorBtnMgr_c::execute() { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (i == activeBtn) { - mFloorBtns[i].field_0x4C = 1; + mFloorBtns[i].mSelected = true; if (dCsBase_c::GetInstance() != nullptr) { dCsBase_c::GetInstance()->setCursorStickTargetPane(mFloorBtns[i].mpBounding); } } else { - mFloorBtns[i].field_0x4C = 0; + mFloorBtns[i].mSelected = false; } } for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { @@ -1021,6 +1135,93 @@ bool dLytMapFloorBtnMgr_c::execute() { return true; } +void dLytMapFloorBtnMgr_c::checkPointedAtBtn() { + field_0x711 = field_0x710; + field_0x710 = dPadNav::isPointerVisible(); + if (field_0x712) { + dPadNav::stopFSStickNav(); + field_0x710 = true; + } + + if (field_0x710) { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].mSelected = false; + } + + dCursorHitCheck_c *chk = dCsGame_c::GetInstance()->getCursorHit(); + if (chk != nullptr && chk->getType() == 'lyt ') { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (chk == &mCsHitChecks[i]) { + mFloorBtns[i].mSelected = true; + } + } + } + } +} + +s32 dLytMapFloorBtnMgr_c::getPointedAtBtnIdx() const { + s32 idx = -1; + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (mFloorBtns[i].mSelected) { + idx = i; + break; + } + } + return idx; +} + +// What it says on the tin +static const char *sFloorBtnLabels[] = { + "FLOOR_F3", "FLOOR_F2", "FLOOR_F1", "FLOOR_B1", "FLOOR_B2", "FLOOR_B3", +}; + +void dLytMapFloorBtnMgr_c::init(s32 numFloors, s32 baseFloorOffset, s32 selectedFloor) { + mNumFloors = numFloors; + mBaseFloorOffset = baseFloorOffset; + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + bool visible = i < mNumFloors && mNumFloors >= 2; + mLyt.findPane(sFloorBtnBoundings[i])->SetVisible(visible); + } + + if (mNumFloors >= 2) { + mLyt.getLayout()->GetRootPane()->SetVisible(true); + mAnmGroups[0].bind(false); + mAnmGroups[0].setFrame(mNumFloors - 2); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + bool visible = i < mNumFloors && mNumFloors >= 2; + mLyt.findPane(sFloorBtnBoundings[i])->SetVisible(visible); + if (visible) { + int labelIdx = (2 - mBaseFloorOffset) + i; + dTextBox_c *textBox = mLyt.getTextBox(sFloorBtnText[i]); + textBox->setMessageWithGlobalTextProcessor2(sFloorBtnLabels[labelIdx], nullptr); + textBox = mLyt.getTextBox(sFloorBtnTextS[i]); + textBox->setMessageWithGlobalTextProcessor2(sFloorBtnLabels[labelIdx], nullptr); + } + } + + // Floor buttons are descending but selectedFloor is ascending + s32 tmp = -(selectedFloor - baseFloorOffset); + mSelectedBtnIdx = tmp; + mFloorBtns[tmp].mDecided = true; + mFloorBtns[tmp].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Decide); + + // TODO probably an inline + d2d::AnmGroup_c &anm = mBtnGroups[tmp].mOnOffLight; + + anm.bind(false); + mBtnGroups[tmp].mOnOffLight.setToEnd(); + mLyt.getLayout()->Animate(0); + mLyt.calc(); + anm.unbind(); + if (mAnmGroups[0].bind(false)) { + mAnmGroups[0].unbind(); + } + } else { + mLyt.getLayout()->GetRootPane()->SetVisible(false); + } +} + void dLytMapFloorBtnMgr_c::initializeState_Invisible() {} void dLytMapFloorBtnMgr_c::executeState_Invisible() {} void dLytMapFloorBtnMgr_c::finalizeState_Invisible() {} @@ -1134,6 +1335,10 @@ dLytMapMain_c::~dLytMapMain_c() { } } +dLytMapGlobal_c *dLytMapMain_c::getGlobal() { + return &mGlobal; +} + void dLytMapMain_c::draw() {} void dLytMap_c::build() { @@ -1164,7 +1369,108 @@ void dLytMapMain_c::executeState_In() {} void dLytMapMain_c::finalizeState_In() {} void dLytMapMain_c::initializeState_Active() {} -void dLytMapMain_c::executeState_Active() {} +void dLytMapMain_c::executeState_Active() { + dLytMapGlobal_c *global = getGlobal(); + if (dMessage_c::getInstance()->getField_0x328()) { + return; + } + + // TODO figure out and double check numbers + if (field_0x8C68 == 4 && field_0x8CA4 == dLytMapGlobal_c::MAPMODE_STAGE && + field_0x8CA8 == dLytMapGlobal_c::MAPMODE_STAGE && dPad::getDownTrigZ()) { + if (mIslandNamesOn) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_OFF); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_ON); + } + mIslandNamesOn = !mIslandNamesOn; + field_0x2060.setIslandNamesOn(mIslandNamesOn); + } + checkScroll(); + + if (needsNav(field_0x8CA4) && needsNav(field_0x8CA8)) { + if (!mNavEnabled) { + dPadNav::setNavEnabled(true, false); + mNavEnabled = true; + } + if (mFloorBtnMgr.canDecideFloor() && dPad::getDownTrigA()) { + mFloorBtnMgr.decideSelectedFloor(); + field_0x8C64 = mFloorBtnMgr.getCurrentFloor(); + global->setFloor(field_0x8C64); + mStateMgr.changeState(StateID_FloorChange); + } + } else { + if (mNavEnabled) { + dPadNav::setNavEnabled(false, false); + mNavEnabled = false; + } + } + + if (field_0x8CA4 == dLytMapGlobal_c::MAPMODE_STAGE && field_0x8CA8 == dLytMapGlobal_c::MAPMODE_STAGE && + canZoomIn(dLytMapGlobal_c::MAPMODE_STAGE)) { + if (field_0x8CC0 && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + const mVec3_c &pos = global->getPlayerPos(); + getGlobal()->unprojectFromMap(field_0x8CF4, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); + f32 tmp = fn_80142D90(4); + fn_8013FB70(field_0x8CF4, getGlobal()->getField_0x44() / tmp); + field_0x8DB5 = true; + } else { + f32 tmp = fn_80142D90(4); + f32 val = getGlobal()->getField_0x44() / tmp; + fn_8013FB70(getGlobal()->getPlayerPos(), val); + field_0x8DB5 = true; + } + } + + if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select && + dPad::getDownTrigC() && field_0x8CC1) { + s32 id = -1; + mPinIconAggregate.findNewBeaconId(&id); + if (id >= 0) { + mVec3_c pos3d; + dLytMapGlobal_c *global = getGlobal(); + global->unprojectFromMap(pos3d, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); + mPinIconAggregate.setPosition(id, pos3d); + setBeaconPositionChecked(&pos3d, id); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_SET); + } + } else if ((dPad::getDownTrigLeft() && canZoomOut(field_0x8CA4)) || + (dPad::getDownTrigA() && field_0x8CA4 == dLytMapGlobal_c::MAPMODE_ZOOM && canZoomOut(field_0x8CA4))) { + zoomOut(); + } else if ((dPad::getDownTrigRight() && canZoomIn(field_0x8CA4)) || + (dPad::getDownTrigA() && field_0x8CA4 == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(field_0x8CA4))) { + zoomIn(); + } else if ((field_0x8C68 == dLytMapGlobal_c::MAPMODE_WORLD || field_0x8C68 == dLytMapGlobal_c::MAPMODE_PROVINCE || + field_0x8C68 == dLytMapGlobal_c::MAPMODE_WORLD_SKY || field_0x8C68 == dLytMapGlobal_c::MAPMODE_ZOOM) && + canResetPosition(field_0x8CA4, field_0x8C90) && dPad::getDownTrigUp()) { + mVec3_c pos; + fn_80142F00(pos, field_0x8CA4, field_0x8C90, global->getMapRotationCenter(), global->getField_0x56()); + f32 distSq = global->getField_0x00().squareDistanceToXZ(pos); + if (field_0x8D58 != global->getFloor()) { + mFloorBtnMgr.resetFloor(-(field_0x8D58 - field_0x8D60)); + global->setFloor(field_0x8D58); + mStateMgr.changeState(StateID_ResetPosWithFloorChange); + } else if (distSq >= 1.0f) { + mStateMgr.changeState(StateID_ResetPos); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_NOT_MOVE); + } + } else if (canChangeUpDirection(field_0x8CA4, field_0x8C90) && dPad::getDownTrigZ()) { + mStateMgr.changeState(StateID_ChgMapUpDirection); + } + + if ((field_0x8CA4 == dLytMapGlobal_c::MAPMODE_STAGE && field_0x8CA8 == dLytMapGlobal_c::MAPMODE_STAGE) || + (field_0x8CA4 == dLytMapGlobal_c::MAPMODE_ZOOM && field_0x8CA8 == dLytMapGlobal_c::MAPMODE_ZOOM)) { + field_0xF1C.field_0x05 = true; + } + + mPinIconAggregate.execute(); + + for (int idx = 0; idx < (int)ARRAY_LENGTH(field_0x832C); idx++) { + field_0x832C[idx].resetCachedHitboxes(); + field_0x832C[idx].execute(); + } +} void dLytMapMain_c::finalizeState_Active() {} void dLytMapMain_c::initializeState_Out() {} diff --git a/src/d/lyt/d_lyt_map_global.cpp b/src/d/lyt/d_lyt_map_global.cpp index 5785ecb3..18d8d611 100644 --- a/src/d/lyt/d_lyt_map_global.cpp +++ b/src/d/lyt/d_lyt_map_global.cpp @@ -14,7 +14,7 @@ dLytMapGlobal_c::dLytMapGlobal_c() mMapRotation(0), field_0x40(1.0f), field_0x44(1.0f), - mLevel(0), + mFloor(0), field_0x4C(0), field_0x4D(0), mAlpha(0), From cf6bc521bde2c4f01944a4eacb7896f380c3402c Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 2 Oct 2025 13:41:05 +0200 Subject: [PATCH 05/20] more map --- config/SOUE01/symbols.txt | 58 ++--- include/d/d_stage.h | 11 +- include/d/lyt/d_lyt_map.h | 78 +++++-- include/d/lyt/d_lyt_map_capture.h | 10 +- src/d/d_stage.cpp | 8 +- src/d/lyt/d_lyt_map.cpp | 375 ++++++++++++++++++++++++++++-- src/d/lyt/d_lyt_map_capture.cpp | 32 +++ 7 files changed, 498 insertions(+), 74 deletions(-) create mode 100644 src/d/lyt/d_lyt_map_capture.cpp diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 6ceb1bd8..ed3a8426 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7481,13 +7481,13 @@ unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_c = .text:0x8012D330; // unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC4mAng = .text:0x8012D350; // type:function size:0x1C unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC7mVec3_cRC4mAng = .text:0x8012D370; // type:function size:0x1C unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC7mVec2_cRC7mVec3_cRC7mVec3_cRC4mAngff = .text:0x8012D390; // type:function size:0x118 -LytMapCapture__stateRenderingWaitEnter = .text:0x8012D4B0; // type:function size:0x4 -LytMapCapture__stateRenderingWaitUpdate = .text:0x8012D4C0; // type:function size:0x70 +initializeState_RenderingWait__16dLytMapCapture_cFv = .text:0x8012D4B0; // type:function size:0x4 +executeState_RenderingWait__16dLytMapCapture_cFv = .text:0x8012D4C0; // type:function size:0x70 changeState__85sStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8012D530; // type:function size:0x10 -LytMapCapture__stateRenderingWaitLeave = .text:0x8012D540; // type:function size:0x4 -LytMapCapture__stateRenderingWaitStep2Enter = .text:0x8012D550; // type:function size:0x4 -LytMapCapture__stateRenderingWaitStep2Update = .text:0x8012D560; // type:function size:0x94 -LytMapCapture__stateRenderingWaitStep2Leave = .text:0x8012D600; // type:function size:0x4 +finalizeState_RenderingWait__16dLytMapCapture_cFv = .text:0x8012D540; // type:function size:0x4 +initializeState_RenderingWaitStep2__16dLytMapCapture_cFv = .text:0x8012D550; // type:function size:0x4 +executeState_RenderingWaitStep2__16dLytMapCapture_cFv = .text:0x8012D560; // type:function size:0x94 +finalizeState_RenderingWaitStep2__16dLytMapCapture_cFv = .text:0x8012D600; // type:function size:0x4 fn_8012D610 = .text:0x8012D610; // type:function size:0x5C fn_8012D670 = .text:0x8012D670; // type:function size:0x5C fn_8012D6D0 = .text:0x8012D6D0; // type:function size:0x20 @@ -7495,12 +7495,12 @@ fn_8012D6F0 = .text:0x8012D6F0; // type:function size:0xE4 fn_8012D7E0 = .text:0x8012D7E0; // type:function size:0x10 fn_8012D7F0 = .text:0x8012D7F0; // type:function size:0x8 fn_8012D800 = .text:0x8012D800; // type:function size:0xEC -fn_8012D8F0 = .text:0x8012D8F0; // type:function size:0x30 -fn_8012D920 = .text:0x8012D920; // type:function size:0x30 -fn_8012D950 = .text:0x8012D950; // type:function size:0x30 -LytMapCapture__initStates = .text:0x8012D980; // type:function size:0x1C0 -LytMapCapture__dtor = .text:0x8012DB40; // type:function size:0x58 -fn_8012DBA0 = .text:0x8012DBA0; // type:function size:0x88 +finalizeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D8F0; // type:function size:0x30 +executeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D920; // type:function size:0x30 +initializeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D950; // type:function size:0x30 +__sinit_\d_lyt_map_capture_cpp = .text:0x8012D980; // type:function size:0x1C0 +__dt__31sFStateID_c<16dLytMapCapture_c>Fv = .text:0x8012DB40; // type:function size:0x58 +isSameName__31sFStateID_c<16dLytMapCapture_c>CFPCc = .text:0x8012DBA0; // type:function size:0x88 __ct__13dLytMap_HIO_cFv = .text:0x8012DC30; // type:function size:0xEC __dt__13dLytMap_HIO_cFv = .text:0x8012DD20; // type:function size:0x40 init__21dMapFootPrintsQueue_cFv = .text:0x8012DD60; // type:function size:0x17C @@ -7629,7 +7629,7 @@ getStateID__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStat executeState__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801312F0; // type:function size:0x10 checkPointedAtBtn__20dLytMapFloorBtnMgr_cFv = .text:0x80131300; // type:function size:0xF0 getPointedAtBtnIdx__20dLytMapFloorBtnMgr_cCFv = .text:0x801313F0; // type:function size:0x58 -fn_80131450 = .text:0x80131450; // type:function size:0x8 +isUsingPointerNav__20dLytMapFloorBtnMgr_cCFv = .text:0x80131450; // type:function size:0x8 resetFloor__20dLytMapFloorBtnMgr_cFl = .text:0x80131460; // type:function size:0xC4 decideSelectedFloor__20dLytMapFloorBtnMgr_cFv = .text:0x80131530; // type:function size:0x5C canDecideFloor__20dLytMapFloorBtnMgr_cCFv = .text:0x80131590; // type:function size:0x1D8 @@ -7664,11 +7664,11 @@ finalizeState_WaitInvalid__18dLytMapPopupInfo_cFv = .text:0x80131ED0; // type:fu initializeState_Out__18dLytMapPopupInfo_cFv = .text:0x80131EE0; // type:function size:0xC executeState_Out__18dLytMapPopupInfo_cFv = .text:0x80131EF0; // type:function size:0x6C finalizeState_Out__18dLytMapPopupInfo_cFv = .text:0x80131F60; // type:function size:0x4 -fn_80131F70 = .text:0x80131F70; // type:function size:0xB0 -fn_80132020 = .text:0x80132020; // type:function size:0x4C -fn_80132070 = .text:0x80132070; // type:function size:0x94 +build__18dLytMapPopupInfo_cFPQ23d2d10ResAccIf_c = .text:0x80131F70; // type:function size:0xB0 +remove__18dLytMapPopupInfo_cFv = .text:0x80132020; // type:function size:0x4C +execute__18dLytMapPopupInfo_cFv = .text:0x80132070; // type:function size:0x94 executeState__87sStateMgr_c<18dLytMapPopupInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80132110; // type:function size:0x10 -fn_80132120 = .text:0x80132120; // type:function size:0x14 +draw__18dLytMapPopupInfo_cFv = .text:0x80132120; // type:function size:0x14 initializeState_Invisible__24dLytMapSavePopupAction_cFv = .text:0x80132140; // type:function size:0x4 executeState_Invisible__24dLytMapSavePopupAction_cFv = .text:0x80132150; // type:function size:0x28 changeState__93sStateMgr_c<24dLytMapSavePopupAction_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80132180; // type:function size:0x10 @@ -7682,18 +7682,18 @@ finalizeState_Wait__24dLytMapSavePopupAction_cFv = .text:0x80132340; // type:fun initializeState_Out__24dLytMapSavePopupAction_cFv = .text:0x80132350; // type:function size:0x7C executeState_Out__24dLytMapSavePopupAction_cFv = .text:0x801323D0; // type:function size:0xB4 finalizeState_Out__24dLytMapSavePopupAction_cFv = .text:0x80132490; // type:function size:0x4 -fn_801324A0 = .text:0x801324A0; // type:function size:0x10 +execute__24dLytMapSavePopupAction_cFv = .text:0x801324A0; // type:function size:0x10 executeState__93sStateMgr_c<24dLytMapSavePopupAction_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801324B0; // type:function size:0x10 -fn_801324C0 = .text:0x801324C0; // type:function size:0x10 -fn_801324D0 = .text:0x801324D0; // type:function size:0x78 -fn_80132550 = .text:0x80132550; // type:function size:0xD0 -fn_80132620 = .text:0x80132620; // type:function size:0x4C -fn_80132670 = .text:0x80132670; // type:function size:0x94 -fn_80132710 = .text:0x80132710; // type:function size:0x318 +init__24dLytMapSavePopupAction_cFPQ23d2d10AnmGroup_c = .text:0x801324C0; // type:function size:0x10 +hide__24dLytMapSavePopupAction_cFv = .text:0x801324D0; // type:function size:0x78 +build__18dLytMapSavePopup_cFPQ23d2d10ResAccIf_c = .text:0x80132550; // type:function size:0xD0 +remove__18dLytMapSavePopup_cFv = .text:0x80132620; // type:function size:0x4C +execute__18dLytMapSavePopup_cFv = .text:0x80132670; // type:function size:0x94 +draw__18dLytMapSavePopup_cFv = .text:0x80132710; // type:function size:0x318 getStateID__93sStateMgr_c<24dLytMapSavePopupAction_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80132A30; // type:function size:0x10 -fn_80132A40 = .text:0x80132A40; // type:function size:0xC -fn_80132A50 = .text:0x80132A50; // type:function size:0xA4 -fn_80132B00 = .text:0x80132B00; // type:function size:0x10 +set__18dLytMapSavePopup_cFPPQ34nw4r3lyt8Boundingl = .text:0x80132A40; // type:function size:0xC +setStatueLabel__18dLytMapSavePopup_cFPCc = .text:0x80132A50; // type:function size:0xA4 +hide__18dLytMapSavePopup_cFl = .text:0x80132B00; // type:function size:0x10 initializeState_Invisible__20dLytMapSaveCaption_cFv = .text:0x80132B10; // type:function size:0x4 executeState_Invisible__20dLytMapSaveCaption_cFv = .text:0x80132B20; // type:function size:0x4 finalizeState_Invisible__20dLytMapSaveCaption_cFv = .text:0x80132B30; // type:function size:0x4 @@ -33515,10 +33515,10 @@ lbl_8051EE7C = .data:0x8051EE7C; // type:object size:0xC lbl_8051EE88 = .data:0x8051EE88; // type:object size:0x1C lbl_8051EEA4 = .data:0x8051EEA4; // type:object size:0x1C data:string lbl_8051EEC0 = .data:0x8051EEC0; // type:object size:0xC -lbl_8051EECC = .data:0x8051EECC; // type:object size:0x1C +lbl_8051EECC = .data:0x8051EECC; // type:object size:0x16 data:string lbl_8051EEE8 = .data:0x8051EEE8; // type:object size:0x18 data:string lbl_8051EF00 = .data:0x8051EF00; // type:object size:0x18 data:string -lbl_8051EF18 = .data:0x8051EF18; // type:object size:0x14 +lbl_8051EF18 = .data:0x8051EF18; // type:object size:0x12 data:string lbl_8051EF2C = .data:0x8051EF2C; // type:object size:0xC data:string lbl_8051EF38 = .data:0x8051EF38; // type:object size:0xC lbl_8051EF44 = .data:0x8051EF44; // type:object size:0xC diff --git a/include/d/d_stage.h b/include/d/d_stage.h index d68d64b8..07c25499 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -74,11 +74,16 @@ public: /* 0x1F0 */ u8 field_0x1F0; public: + u8 getField_0x1EE() const { + return field_0x1EE; + } + void init(MapRelated *); void fn_801b4900(); void fn_801B4B80(u32 mapParams, const mVec3_c ¢er, const mVec3_c &size); void fn_801B4C70(const mVec3_c &); void fn_801B50C0(s32); + const mVec3_c &fn_801B4CB0() const; }; // OBJ NAME: STAGE @@ -128,6 +133,10 @@ public: return sInstance; } + MapRelated *getMapRelated() { + return &mMapRelated; + } + bool isFadedOut() const { return mFader.isStatus(mFaderBase_c::FADED_OUT); } @@ -154,7 +163,7 @@ private: /* 0x0068 */ sFPhase mPhase; /* 0x007C */ dRoomTable_c rooms; /* 0x017C */ dFader_c mFader; - /* 0x01A0 */ MapRelated mapRelated; + /* 0x01A0 */ MapRelated mMapRelated; /* 0x0394 */ u8 _0x394[0x39C - 0x394]; /* 0x039C */ u32 loaded_entities[2047]; /* 0x2398 */ s8 curr_room_id; diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 6ca15fb8..cee9f4ce 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -16,6 +16,16 @@ #include "s/s_State.hpp" #include "toBeSorted/d_flow_mgr.h" +/** Bird Statue Definition (StatueSelectDestination) */ +struct dMapSaveDefinition { + /* 0x00 */ const char *stageName; + /* 0x04 */ u8 room; + /* 0x05 */ u8 layer; + /* 0x06 */ u8 enrance; + /* 0x08 */ UNKWORD field_0x08; + /* 0x0C */ const char *statueLabel; +}; + struct dMapFootPrintEntry { /* 0x00 */ dMapFootPrintEntry *pPrev; /* 0x04 */ dMapFootPrintEntry *pNext; @@ -261,8 +271,8 @@ public: mBaseFloorOffset = 0; mSelectedBtnIdx = 0; field_0x70C = 4; - field_0x710 = false; - field_0x711 = false; + mPointerVisible = false; + mPrevPointerVisible = false; field_0x712 = false; } virtual ~dLytMapFloorBtnMgr_c(); @@ -294,7 +304,8 @@ public: return getPointedAtBtnIdx() >= 0; } - void resetFloor(s32 newFloor); + void resetFloor(s32 newFloorBtn); + bool isUsingPointerNav() const; private: void checkPointedAtBtn(); @@ -311,8 +322,8 @@ private: /* 0x704 */ s32 mBaseFloorOffset; /* 0x708 */ s32 mSelectedBtnIdx; /* 0x70C */ UNKWORD field_0x70C; - /* 0x710 */ bool field_0x710; - /* 0x711 */ bool field_0x711; + /* 0x710 */ bool mPointerVisible; + /* 0x711 */ bool mPrevPointerVisible; /* 0x712 */ bool field_0x712; }; @@ -327,6 +338,11 @@ public: STATE_FUNC_DECLARE(dLytMapPopupInfo_c, WaitInvalid); STATE_FUNC_DECLARE(dLytMapPopupInfo_c, Out); + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + private: /* 0x000 */ UI_STATE_MGR_DECLARE(dLytMapPopupInfo_c); /* 0x03C */ d2d::LytBase_c mLyt; @@ -335,33 +351,50 @@ private: // Size 0x4C class dLytMapSavePopupAction_c { + friend class dLytMapSavePopup_c; + public: - dLytMapSavePopupAction_c() : mStateMgr(*this, sStateID::null), field_0x44(0.0f), field_0x48(0) {} + dLytMapSavePopupAction_c() : mStateMgr(*this, sStateID::null), mInOutFrame(0.0f), mInRequest(false) {} STATE_FUNC_DECLARE(dLytMapSavePopupAction_c, Invisible); STATE_FUNC_DECLARE(dLytMapSavePopupAction_c, In); STATE_FUNC_DECLARE(dLytMapSavePopupAction_c, Wait); STATE_FUNC_DECLARE(dLytMapSavePopupAction_c, Out); + void execute(); + void init(d2d::AnmGroup_c *pGroups); + void hide(); + private: /* 0x00 */ UI_STATE_MGR_DECLARE(dLytMapSavePopupAction_c); - /* 0x3C */ u8 _0x3C[0x44 - 0x3C]; - /* 0x44 */ f32 field_0x44; - /* 0x48 */ u8 field_0x48; + /* 0x3C */ d2d::AnmGroup_c *mpAnmGroupInOut; + /* 0x40 */ d2d::AnmGroup_c *mpAnmGroupInput; + /* 0x44 */ f32 mInOutFrame; + /* 0x48 */ bool mInRequest; }; // Assumed name class dLytMapSavePopup_c { public: - dLytMapSavePopup_c() : field_0x4A0(0), field_0x4A4(0), field_0x4A8(-1) {} + dLytMapSavePopup_c() : mStatueNum(0), mpStatueBoundings(nullptr), mCurrentlyInStatue(-1) {} + + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void set(nw4r::lyt::Bounding **pStatueBoundings, s32 count); + void hide(s32 statueIdx); private: + f32 setStatueLabel(const char *label); + /* 0x000 */ d2d::LytBase_c mLyt; /* 0x090 */ d2d::AnmGroup_c mAnmGroups[2]; /* 0x110 */ dLytMapSavePopupAction_c mActions[12]; - /* 0x4A0 */ UNKWORD field_0x4A0; - /* 0x4A4 */ UNKWORD field_0x4A4; - /* 0x4A8 */ UNKWORD field_0x4A8; + /* 0x4A0 */ s32 mStatueNum; + /* 0x4A4 */ nw4r::lyt::Bounding **mpStatueBoundings; + /* 0x4A8 */ s32 mCurrentlyInStatue; }; class dLytMapSaveCaption_c { @@ -444,6 +477,8 @@ public: bool fn_80139EA0() const; void lightPillarRelated(s32, s32, s32); + const dMapSaveDefinition *getSaveDefinition(s32 province, s32 statueIdx) const; + STATE_FUNC_DECLARE(dLytMapMain_c, Invisible); STATE_FUNC_DECLARE(dLytMapMain_c, RenderingWait); STATE_FUNC_DECLARE(dLytMapMain_c, In); @@ -496,7 +531,7 @@ private: f32 fn_80142D90(s32); void fn_80142F00(mVec3_c &, s32 mapMode, u8, const mVec3_c &, const mAng &); - void fn_8013FB70(const mVec3_c&, f32); + void fn_8013FB70(const mVec3_c &, f32); void zoomOut(); void zoomIn(); @@ -527,8 +562,11 @@ private: /* 0x7BD0 */ dLytMapSavePopup_c mSavePopup; /* 0x807C */ dLytMapPopupInfo_c mPopupInfo; - /* 0x8208 */ u8 _0x8208[0x828C - 0x8208]; + /* 0x8208 */ u8 _0x8208[0x821C - 0x8208]; + /* 0x821C */ nw4r::lyt::Bounding **field_0x821C[10]; + /* 0x8244 */ nw4r::lyt::Bounding **field_0x8244[6]; + /* 0x825C */ nw4r::lyt::Bounding **field_0x825C[12]; /* 0x828C */ mVec3_c field_0x828C[12]; /* 0x831C */ u8 _0x831C[0x832C - 0x831C]; @@ -558,7 +596,11 @@ private: /* 0x8C90 */ u8 field_0x8C90; /* 0x8C94 */ s32 field_0x8C94; - /* 0x8C98 */ u8 _0x8C98[0x8CA4 - 0x8C98]; + /* 0x8C98 */ u8 _0x8C98[0x8C9C - 0x8C98]; + + /* 0x8C9C */ UNKWORD field_0x8C9C; + + /* 0x8CA0 */ u8 _0x8CA0[0x8CA4 - 0x8CA0]; /* 0x8CA4 */ s32 field_0x8CA4; /* 0x8CA8 */ s32 field_0x8CA8; @@ -665,6 +707,10 @@ public: mMapMain.lightPillarRelated(p1, p2, p3); } + const dMapSaveDefinition *getSaveDefinition(s32 statueIdx) const { + return mMapMain.getSaveDefinition(mMapMain.field_0x8C9C, statueIdx); + } + private: /* 0x0004 */ d2d::ResAccIf_c mResAcc; /* 0x0374 */ dLytMapMain_c mMapMain; diff --git a/include/d/lyt/d_lyt_map_capture.h b/include/d/lyt/d_lyt_map_capture.h index 974c095b..723d8c16 100644 --- a/include/d/lyt/d_lyt_map_capture.h +++ b/include/d/lyt/d_lyt_map_capture.h @@ -11,8 +11,8 @@ public: field_0x040 = 0; field_0x070 = 0.0f; field_0x074 = 0.0f; - field_0x078 = 0; - field_0x079 = 0; + mRenderRequest = false; + mIsBusyRendering = false; field_0x06C = 0.0f; field_0x068 = 0.0f; field_0x064 = 0.0f; @@ -24,6 +24,8 @@ public: STATE_FUNC_DECLARE(dLytMapCapture_c, RenderingWaitStep2); private: + void fn_8012D6F0(); + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapCapture_c); /* 0x040 */ UNKWORD field_0x040; /* 0x044 */ u8 _0x040[0x064 - 0x044]; @@ -32,8 +34,8 @@ private: /* 0x06C */ f32 field_0x06C; /* 0x070 */ f32 field_0x070; /* 0x074 */ f32 field_0x074; - /* 0x078 */ u8 field_0x078; - /* 0x079 */ u8 field_0x079; + /* 0x078 */ bool mRenderRequest; + /* 0x079 */ bool mIsBusyRendering; }; #endif diff --git a/src/d/d_stage.cpp b/src/d/d_stage.cpp index b86ba605..9e8fde25 100644 --- a/src/d/d_stage.cpp +++ b/src/d/d_stage.cpp @@ -70,7 +70,7 @@ int dStage_c::create() { pcam++; } - if (mapRelated.field_0x1EB == 0) { + if (mMapRelated.field_0x1EB == 0) { mVec3_c min, max; for (s32 i = 0; i < MAX_ROOM_NUMBER - 1; i++) { dRoom_c *room = getRoom(i); @@ -89,11 +89,11 @@ int dStage_c::create() { max.y += 6000.0f; mVec3_c size = max - min; mVec3_c center = mVec3_c(min.x + size.x * 0.5f, min.y, min.z + size.z * 0.5f); - mapRelated.fn_801B4B80(0, center, size); + mMapRelated.fn_801B4B80(0, center, size); mVec3_c v = mVec3_c(10000.0f, 10000.0f, 100000.0f); - mapRelated.fn_801B4C70(v); + mMapRelated.fn_801B4C70(v); } - mapRelated.fn_801B50C0(0); + mMapRelated.fn_801B50C0(0); fn_80028A80(); return SUCCEEDED; diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index cd1f6491..f9690327 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -15,6 +15,8 @@ #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_map_global.h" #include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" +#include "d/lyt/msg_window/d_lyt_msg_window.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "egg/core/eggColorFader.h" #include "m/m_vec.h" @@ -22,6 +24,8 @@ #include "nw4r/g3d/g3d_obj.h" #include "nw4r/lyt/lyt_bounding.h" #include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_window.h" +#include "s/s_StateInterfaces.hpp" #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" #include "toBeSorted/d_beacon.h" @@ -56,6 +60,10 @@ struct dLytMap_HIO_c { /* 0x2A */ u8 mFootstepsAlpha; /* 0x2B */ u8 field_0x2B; /* 0x2C */ f32 field_0x2C; + + f32 getField_0x04() const { + return field_0x04; + } }; dLytMap_HIO_c sHio; @@ -1030,8 +1038,8 @@ bool dLytMapFloorBtnMgr_c::build(d2d::ResAccIf_c *resAcc) { mCsHitChecks[i].execute(); } - field_0x710 = false; - field_0x711 = false; + mPointerVisible = false; + mPrevPointerVisible = false; for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mFloorBtns[i].mSelected = false; @@ -1063,7 +1071,7 @@ bool dLytMapFloorBtnMgr_c::remove() { bool dLytMapFloorBtnMgr_c::execute() { field_0x70C = 4; if (*mStateMgr.getStateID() != StateID_Invisible) { - if (field_0x710) { + if (mPointerVisible) { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mFloorBtns[i].execute(); } @@ -1072,13 +1080,15 @@ bool dLytMapFloorBtnMgr_c::execute() { // Determine the currently active floor s32 activeBtn = 0; s32 direction = dPadNav::getFSStickNavDirection(); - if (field_0x710 != field_0x711) { + if (mPointerVisible != mPrevPointerVisible) { + // We just turned off pointing, so make the decided button the selected one too for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (mFloorBtns[i].mDecided) { activeBtn = i; } } } else { + // Normal handling - pointing off, selected button stays selected for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { if (mFloorBtns[i].mSelected) { activeBtn = i; @@ -1136,14 +1146,14 @@ bool dLytMapFloorBtnMgr_c::execute() { } void dLytMapFloorBtnMgr_c::checkPointedAtBtn() { - field_0x711 = field_0x710; - field_0x710 = dPadNav::isPointerVisible(); + mPrevPointerVisible = mPointerVisible; + mPointerVisible = dPadNav::isPointerVisible(); if (field_0x712) { dPadNav::stopFSStickNav(); - field_0x710 = true; + mPointerVisible = true; } - if (field_0x710) { + if (mPointerVisible) { for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { mFloorBtns[i].mSelected = false; } @@ -1170,6 +1180,82 @@ s32 dLytMapFloorBtnMgr_c::getPointedAtBtnIdx() const { return idx; } +bool dLytMapFloorBtnMgr_c::isUsingPointerNav() const { + return mPointerVisible; +} + +void dLytMapFloorBtnMgr_c::resetFloor(s32 newFloorBtn) { + mFloorBtns[mSelectedBtnIdx].mDecided = false; + mFloorBtns[mSelectedBtnIdx].directlyUndecide(); + mFloorBtns[mSelectedBtnIdx].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Wait); + + mFloorBtns[newFloorBtn].mDecided = true; + mFloorBtns[newFloorBtn].directlyDecide(); + mFloorBtns[newFloorBtn].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Decide); + + mSelectedBtnIdx = newFloorBtn; +} + +void dLytMapFloorBtnMgr_c::decideSelectedFloor() { + for (int i = 0; i < mNumFloors; i++) { + if (mFloorBtns[i].mSelected) { + if (i != mSelectedBtnIdx) { + mFloorBtns[mSelectedBtnIdx].mDecided = false; + mFloorBtns[i].mDecided = true; + } + mSelectedBtnIdx = i; + } + } +} + +bool dLytMapFloorBtnMgr_c::canDecideFloor() const { + bool ret = false; + + s32 idx = getPointedAtBtnIdx(); + if (idx >= 0) { + // When pointing at a button that is thus selected but not yet decided, + // we can decide on that button if it's not busy animating... + if (!mFloorBtns[idx].mDecided) { + if (mFloorBtns[idx].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Select)) { + bool busy = mFloorBtns[idx].mpAnmGroups->mOnOff.isBound() || + mFloorBtns[idx].mpAnmGroups->mDecide.isBound() || + mFloorBtns[idx].mpAnmGroups->mOnOffLight.isBound(); + if (!busy) { + ret = true; + } + } + } + } + + for (int i = 0; i < mNumFloors; i++) { + // But if any other button is animating and in a changing state, also forbid + if (i != idx) { + bool busy = mFloorBtns[i].mpAnmGroups->mOnOff.isBound() || mFloorBtns[i].mpAnmGroups->mDecide.isBound() || + mFloorBtns[i].mpAnmGroups->mOnOffLight.isBound(); + + if (busy) { + if (!mFloorBtns[i].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Wait) && + !mFloorBtns[i].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Decide)) { + ret = false; + break; + } + } + } + } + + return ret; +} + +s32 dLytMapFloorBtnMgr_c::getCurrentFloor() const { + s32 ret = -1; + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (mFloorBtns[i].mDecided) { + ret = i; + } + } + return mBaseFloorOffset - ret; +} + // What it says on the tin static const char *sFloorBtnLabels[] = { "FLOOR_F3", "FLOOR_F2", "FLOOR_F1", "FLOOR_B1", "FLOOR_B2", "FLOOR_B3", @@ -1239,42 +1325,291 @@ dLytMapFloorBtnMgr_c::~dLytMapFloorBtnMgr_c() { dPadNav::setNavEnabled(false, false); } +#define MAP_POPUP_INFO_ANIM_IN 0 +#define MAP_POPUP_INFO_ANIM_OUT 1 +#define MAP_POPUP_INFO_ANIM_INPUT 2 + +#define MAP_POPUP_INFO_NUM_ANIMS 3 + void dLytMapPopupInfo_c::initializeState_Invisible() {} void dLytMapPopupInfo_c::executeState_Invisible() {} void dLytMapPopupInfo_c::finalizeState_Invisible() {} -void dLytMapPopupInfo_c::initializeState_In() {} -void dLytMapPopupInfo_c::executeState_In() {} +void dLytMapPopupInfo_c::initializeState_In() { + mAnmGroups[MAP_POPUP_INFO_ANIM_IN].bind(false); +} +void dLytMapPopupInfo_c::executeState_In() { + if (mAnmGroups[MAP_POPUP_INFO_ANIM_IN].isEndReached()) { + mLyt.calc(); + mAnmGroups[MAP_POPUP_INFO_ANIM_IN].unbind(); + mStateMgr.changeState(StateID_Wait); + } +} void dLytMapPopupInfo_c::finalizeState_In() {} void dLytMapPopupInfo_c::initializeState_Wait() {} -void dLytMapPopupInfo_c::executeState_Wait() {} +void dLytMapPopupInfo_c::executeState_Wait() { + if (dLytMsgWindow_c::getInstance()->isVisible()) { + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].bind(false); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setForward(); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setToStart(); + mStateMgr.changeState(StateID_WaitInvalid); + } else if (mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].isStop2()) { + mLyt.calc(); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].unbind(); + } +} void dLytMapPopupInfo_c::finalizeState_Wait() {} void dLytMapPopupInfo_c::initializeState_WaitInvalid() {} -void dLytMapPopupInfo_c::executeState_WaitInvalid() {} +void dLytMapPopupInfo_c::executeState_WaitInvalid() { + if (!dLytMsgWindow_c::getInstance()->isVisible()) { + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].bind(false); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setBackward(); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setToStart(); + mStateMgr.changeState(StateID_Wait); + } else if (mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].isStop2()) { + mLyt.calc(); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].unbind(); + } +} void dLytMapPopupInfo_c::finalizeState_WaitInvalid() {} -void dLytMapPopupInfo_c::initializeState_Out() {} -void dLytMapPopupInfo_c::executeState_Out() {} +void dLytMapPopupInfo_c::initializeState_Out() { + mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].bind(false); +} +void dLytMapPopupInfo_c::executeState_Out() { + if (mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].isEndReached()) { + mLyt.calc(); + mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].unbind(); + } +} void dLytMapPopupInfo_c::finalizeState_Out() {} +static const d2d::LytBrlanMapping sMapPopupInfoBrlanMap[] = { + { "mapPopupInfo_00_in.brlan", "G_inOut_00"}, + { "mapPopupInfo_00_out.brlan", "G_inOut_00"}, + {"mapPopupInfo_00_inPut.brlan", "G_input_00"}, +}; + +void dLytMapPopupInfo_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPopupInfo_00.brlyt", nullptr); + for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { + mAnmGroups[i].init(sMapPopupInfoBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapPopupInfoBrlanMap[i].mName); + } + mStateMgr.changeState(StateID_Invisible); +} + +void dLytMapPopupInfo_c::remove() { + for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } +} + +void dLytMapPopupInfo_c::execute() { + mStateMgr.executeState(); + mLyt.calc(); + for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { + if (mAnmGroups[i].isBound()) { + mAnmGroups[i].play(); + } + } +} + +void dLytMapPopupInfo_c::draw() { + mLyt.draw(); +} + +#define MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT 0 +#define MAP_SAVE_POPUP_ACTION_ANIM_INPUT 1 + +#define MAP_SAVE_POPUP_ACTION_NUM_ANIMS 2 + void dLytMapSavePopupAction_c::initializeState_Invisible() {} -void dLytMapSavePopupAction_c::executeState_Invisible() {} +void dLytMapSavePopupAction_c::executeState_Invisible() { + if (mInRequest) { + mStateMgr.changeState(StateID_In); + } +} void dLytMapSavePopupAction_c::finalizeState_Invisible() {} -void dLytMapSavePopupAction_c::initializeState_In() {} -void dLytMapSavePopupAction_c::executeState_In() {} +void dLytMapSavePopupAction_c::initializeState_In() { + // TODO - explain why this seems unnecessarily complicated + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setForward(); + mpAnmGroupInOut->setToStart(); + mInOutFrame = mpAnmGroupInOut->getFrame(); + mpAnmGroupInOut->unbind(); +} +void dLytMapSavePopupAction_c::executeState_In() { + // TODO - explain why this seems unnecessarily complicated + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setFrame(mInOutFrame); + mpAnmGroupInOut->play(); + if (mpAnmGroupInOut->isEndReached()) { + mStateMgr.changeState(StateID_Wait); + } + mInOutFrame = mpAnmGroupInOut->getFrame(); + mpAnmGroupInOut->unbind(); +} void dLytMapSavePopupAction_c::finalizeState_In() {} void dLytMapSavePopupAction_c::initializeState_Wait() {} -void dLytMapSavePopupAction_c::executeState_Wait() {} +void dLytMapSavePopupAction_c::executeState_Wait() { + if (!mInRequest) { + mStateMgr.changeState(StateID_Out); + } +} void dLytMapSavePopupAction_c::finalizeState_Wait() {} -void dLytMapSavePopupAction_c::initializeState_Out() {} -void dLytMapSavePopupAction_c::executeState_Out() {} +void dLytMapSavePopupAction_c::initializeState_Out() { + // TODO - explain why this seems unnecessarily complicated + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setBackward(); + mpAnmGroupInOut->setToStart(); + mInOutFrame = mpAnmGroupInOut->getFrame(); + mpAnmGroupInOut->unbind(); +} +void dLytMapSavePopupAction_c::executeState_Out() { + // TODO - explain why this seems unnecessarily complicated + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setBackward(); + mpAnmGroupInOut->setFrame(mInOutFrame); + mpAnmGroupInOut->play(); + if (mpAnmGroupInOut->isStop2()) { + mStateMgr.changeState(StateID_Wait); + } + mInOutFrame = mpAnmGroupInOut->getFrame(); + mpAnmGroupInOut->unbind(); +} void dLytMapSavePopupAction_c::finalizeState_Out() {} +void dLytMapSavePopupAction_c::execute() { + mStateMgr.executeState(); +} + +void dLytMapSavePopupAction_c::init(d2d::AnmGroup_c *pGroups) { + mpAnmGroupInOut = &pGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT]; + mpAnmGroupInput = &pGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT]; +} + +void dLytMapSavePopupAction_c::hide() { + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setFrame(0.0f); + mpAnmGroupInOut->unbind(); + mStateMgr.changeState(StateID_Invisible); +} + +static const d2d::LytBrlanMapping sMapSavePopupActionBrlanMap[] = { + {"mapPopup_00_inOut.brlan", "G_inOut_00"}, + {"mapPopup_00_scale.brlan", "G_scale_00"}, +}; + +void dLytMapSavePopup_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPopup_00.brlyt", nullptr); + for (int i = 0; i < MAP_SAVE_POPUP_ACTION_NUM_ANIMS; i++) { + mAnmGroups[i].init( + sMapSavePopupActionBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSavePopupActionBrlanMap[i].mName + ); + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mActions); i++) { + mActions[i].init(mAnmGroups); + mActions[i].mStateMgr.changeState(dLytMapSavePopupAction_c::StateID_Invisible); + } +} + +void dLytMapSavePopup_c::remove() { + for (int i = 0; i < MAP_SAVE_POPUP_ACTION_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } +} + +void dLytMapSavePopup_c::execute() { + for (int i = 0; i < mStatueNum; i++) { + mActions[i].mInRequest = mCurrentlyInStatue == i; + } + + for (int i = 0; i < mStatueNum; i++) { + mActions[i].execute(); + } +} + +void dLytMapSavePopup_c::draw() { + nw4r::lyt::Bounding *pBounding; + + f32 scaleX = mLyt.getDrawInfo().GetLocationAdjustScale().x; + nw4r::lyt::Pane *rootPane = mLyt.getLayout()->GetRootPane(); + for (int i = 0; i < mStatueNum; i++) { + const sStateIDIf_c *stateID = mActions[i].mStateMgr.getStateID(); + if (*stateID != dLytMapSavePopupAction_c::StateID_Invisible) { + pBounding = mpStatueBoundings[i]; + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].bind(false); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].setFrame(30.0f); + const dMapSaveDefinition *def = dLytMap_c::GetInstance()->getSaveDefinition(i); + f32 width = setStatueLabel(def->statueLabel); + + f32 allScaleX = mLyt.findPane("N_all_00")->GetScale().x; + // TODO fadds regswap + f32 x = pBounding->GetGlobalMtx()._03 + (0.5f * width * allScaleX * scaleX) + sHio.field_0x04; + f32 y = pBounding->GetGlobalMtx()._13; + mVec2_c translate2d(x, y); + mVec3_c translate = vec2ToVec3XY(translate2d); + rootPane->SetTranslate(translate); + + if (*stateID == dLytMapSavePopupAction_c::StateID_In) { + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setFrame(mActions[i].mInOutFrame); + mLyt.calc(); + mLyt.draw(); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); + } else if (*stateID == dLytMapSavePopupAction_c::StateID_Wait) { + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setToEnd(); + mLyt.calc(); + mLyt.draw(); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); + } else if (*stateID == dLytMapSavePopupAction_c::StateID_Out) { + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setBackward(); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setFrame(mActions[i].mInOutFrame); + mLyt.calc(); + mLyt.draw(); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); + } + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].unbind(); + } + } +} + +void dLytMapSavePopup_c::set(nw4r::lyt::Bounding **pStatueBoundings, s32 count) { + mpStatueBoundings = pStatueBoundings; + mStatueNum = count; +} + +f32 dLytMapSavePopup_c::setStatueLabel(const char *label) { + static const char *sTPopupS = "T_popupS_00"; + static const char *sTPopup = "T_popup_00"; + static const char *sBg = "W_bgP_00"; + dTextBox_c *textBox; + + textBox = mLyt.getTextBox(sTPopupS); + textBox->setMessageWithGlobalTextProcessor2(label, nullptr); + textBox->GetLineWidth(nullptr); + textBox = mLyt.getTextBox(sTPopup); + textBox->setMessageWithGlobalTextProcessor2(label, nullptr); + + dWindow_c *w = mLyt.getWindow(sBg); + w->UpdateSize(textBox, 60.0f); + return w->GetSize().width; +} + +void dLytMapSavePopup_c::hide(s32 statueIdx) { + mActions[statueIdx].hide(); +} + void dLytMapSaveCaption_c::initializeState_Invisible() {} void dLytMapSaveCaption_c::executeState_Invisible() {} void dLytMapSaveCaption_c::finalizeState_Invisible() {} diff --git a/src/d/lyt/d_lyt_map_capture.cpp b/src/d/lyt/d_lyt_map_capture.cpp new file mode 100644 index 00000000..46686efc --- /dev/null +++ b/src/d/lyt/d_lyt_map_capture.cpp @@ -0,0 +1,32 @@ +#include "d/lyt/d_lyt_map_capture.h" +#include "common.h" +#include "d/d_stage.h" + +STATE_DEFINE(dLytMapCapture_c, RenderingWait); +STATE_DEFINE(dLytMapCapture_c, RenderingWaitStep2); + +void dLytMapCapture_c::initializeState_RenderingWait() {} +void dLytMapCapture_c::executeState_RenderingWait() { + if (mRenderRequest && !mIsBusyRendering) { + fn_8012D6F0(); + mRenderRequest = false; + mIsBusyRendering = true; + mStateMgr.changeState(StateID_RenderingWaitStep2); + } +} +void dLytMapCapture_c::finalizeState_RenderingWait() {} + +void dLytMapCapture_c::initializeState_RenderingWaitStep2() {} +void dLytMapCapture_c::executeState_RenderingWaitStep2() { + if (mIsBusyRendering && dStage_c::GetInstance() != nullptr && !dStage_c::GetInstance()->getMapRelated()->getField_0x1EE()) { + mIsBusyRendering = false; + if (mRenderRequest) { + fn_8012D6F0(); + mRenderRequest = false; + mIsBusyRendering = true; + } else { + mStateMgr.changeState(StateID_RenderingWait); + } + } +} +void dLytMapCapture_c::finalizeState_RenderingWaitStep2() {} From d26b0af2ce4043d22d104b9d64b1538eca8a0caf Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 2 Oct 2025 23:56:16 +0200 Subject: [PATCH 06/20] more map --- config/SOUE01/symbols.txt | 52 +-- include/d/d_stage.h | 1 + include/d/lyt/d2d.h | 8 +- include/d/lyt/d_lyt_map.h | 104 ++++-- include/d/lyt/d_lyt_map_global.h | 7 +- include/m/m_vec.h | 3 + src/d/lyt/d_lyt_map.cpp | 575 ++++++++++++++++++++++++++++++- src/d/lyt/d_lyt_map_global.cpp | 7 +- 8 files changed, 681 insertions(+), 76 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index ed3a8426..58a9bc3d 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7707,14 +7707,14 @@ finalizeState_Wait__20dLytMapSaveCaption_cFv = .text:0x80132CC0; // type:functio initializeState_Out__20dLytMapSaveCaption_cFv = .text:0x80132CD0; // type:function size:0x48 executeState_Out__20dLytMapSaveCaption_cFv = .text:0x80132D20; // type:function size:0x90 finalizeState_Out__20dLytMapSaveCaption_cFv = .text:0x80132DB0; // type:function size:0x4 -fn_80132DC0 = .text:0x80132DC0; // type:function size:0xB0 -fn_80132E70 = .text:0x80132E70; // type:function size:0x4C -fn_80132EC0 = .text:0x80132EC0; // type:function size:0xA0 +build__20dLytMapSaveCaption_cFPQ23d2d10ResAccIf_c = .text:0x80132DC0; // type:function size:0xB0 +remove__20dLytMapSaveCaption_cFv = .text:0x80132E70; // type:function size:0x4C +execute__20dLytMapSaveCaption_cFv = .text:0x80132EC0; // type:function size:0xA0 executeState__89sStateMgr_c<20dLytMapSaveCaption_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80132F60; // type:function size:0x10 -fn_80132F70 = .text:0x80132F70; // type:function size:0x6C +draw__20dLytMapSaveCaption_cFv = .text:0x80132F70; // type:function size:0x6C getStateID__89sStateMgr_c<20dLytMapSaveCaption_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80132FE0; // type:function size:0x10 -fn_80132FF0 = .text:0x80132FF0; // type:function size:0xA0 -fn_80133090 = .text:0x80133090; // type:function size:0x19C +setType__20dLytMapSaveCaption_cFl = .text:0x80132FF0; // type:function size:0xA0 +setLabel__20dLytMapSaveCaption_cFPCc = .text:0x80133090; // type:function size:0x19C initializeState_Wait__16dLytMapSaveObj_cFv = .text:0x80133230; // type:function size:0x4 executeState_Wait__16dLytMapSaveObj_cFv = .text:0x80133240; // type:function size:0x78 changeState__85sStateMgr_c<16dLytMapSaveObj_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801332C0; // type:function size:0x10 @@ -7731,17 +7731,17 @@ finalizeState_ToWait__16dLytMapSaveObj_cFv = .text:0x80133570; // type:function initializeState_Decide__16dLytMapSaveObj_cFv = .text:0x80133580; // type:function size:0x4 executeState_Decide__16dLytMapSaveObj_cFv = .text:0x80133590; // type:function size:0x90 finalizeState_Decide__16dLytMapSaveObj_cFv = .text:0x80133620; // type:function size:0x4 -fn_80133630 = .text:0x80133630; // type:function size:0x20 -fn_80133650 = .text:0x80133650; // type:function size:0xC -fn_80133660 = .text:0x80133660; // type:function size:0xB0 -fn_80133710 = .text:0x80133710; // type:function size:0xF8 -fn_80133810 = .text:0x80133810; // type:function size:0x4C -fn_80133860 = .text:0x80133860; // type:function size:0x54 +setPosition__16dLytMapSaveObj_cFRC7mVec3_c = .text:0x80133630; // type:function size:0x20 +setAlpha__16dLytMapSaveObj_cFUc = .text:0x80133650; // type:function size:0xC +init__16dLytMapSaveObj_cFv = .text:0x80133660; // type:function size:0xB0 +build__16dLytMapSaveObj_cFPQ23d2d10ResAccIf_c = .text:0x80133710; // type:function size:0xF8 +remove__16dLytMapSaveObj_cFv = .text:0x80133810; // type:function size:0x4C +execute__16dLytMapSaveObj_cFv = .text:0x80133860; // type:function size:0x54 executeState__85sStateMgr_c<16dLytMapSaveObj_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801338C0; // type:function size:0x10 -fn_801338D0 = .text:0x801338D0; // type:function size:0x60 +draw__16dLytMapSaveObj_cFv = .text:0x801338D0; // type:function size:0x60 __ct__13dLytMapMain_cFv = .text:0x80133930; // type:function size:0x358 -fn_80133C90 = .text:0x80133C90; // type:function size:0x1C -fn_80133CB0 = .text:0x80133CB0; // type:function size:0x40 +__ct__16LytMap0x80520B5CFv = .text:0x80133C90; // type:function size:0x1C +__dt__16LytMap0x80520B5CFv = .text:0x80133CB0; // type:function size:0x40 __ct__16dLytMapCapture_cFv = .text:0x80133CF0; // type:function size:0xE0 __dt__29sFState_c<16dLytMapCapture_c>Fv = .text:0x80133DD0; // type:function size:0x58 __dt__32sFStateFct_c<16dLytMapCapture_c>Fv = .text:0x80133E30; // type:function size:0x6C @@ -7774,8 +7774,8 @@ fn_80135080 = .text:0x80135080; // type:function size:0x74 fn_80135100 = .text:0x80135100; // type:function size:0x108 fn_80135210 = .text:0x80135210; // type:function size:0x234 fn_80135450 = .text:0x80135450; // type:function size:0x78 -fn_801354D0 = .text:0x801354D0; // type:function size:0x54 -fn_80135530 = .text:0x80135530; // type:function size:0x5C +__ct__16dLytMapPutIcon_cFv = .text:0x801354D0; // type:function size:0x54 +__dt__16dLytMapPutIcon_cFv = .text:0x80135530; // type:function size:0x5C __ct__16dLytMapSaveObj_cFv = .text:0x80135590; // type:function size:0xC8 __dt__29sFState_c<16dLytMapSaveObj_c>Fv = .text:0x80135660; // type:function size:0x58 __dt__32sFStateFct_c<16dLytMapSaveObj_c>Fv = .text:0x801356C0; // type:function size:0x6C @@ -7808,8 +7808,8 @@ fn_801365C0 = .text:0x801365C0; // type:function size:0x4 fn_801365D0 = .text:0x801365D0; // type:function size:0x40 __dt__13dLytMapMain_cFv = .text:0x80136610; // type:function size:0x608 getGlobal__13dLytMapMain_cFv = .text:0x80136C20; // type:function size:0xC -fn_80136C30 = .text:0x80136C30; // type:function size:0xC8 -fn_80136D00 = .text:0x80136D00; // type:function size:0x6CC +loadTextboxes__13dLytMapMain_cFv = .text:0x80136C30; // type:function size:0xC8 +build__13dLytMapMain_cFv = .text:0x80136D00; // type:function size:0x6CC changeState__82sStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801373D0; // type:function size:0x10 fn_801373E0 = .text:0x801373E0; // type:function size:0xAC fn_80137490 = .text:0x80137490; // type:function size:0x2E8 @@ -7841,9 +7841,9 @@ fn_801396A0 = .text:0x801396A0; // type:function size:0xA4 fn_80139750 = .text:0x80139750; // type:function size:0x5E8 fn_80139D40 = .text:0x80139D40; // type:function size:0x15C fn_80139EA0__13dLytMapMain_cCFv = .text:0x80139EA0; // type:function size:0x58 -fn_80139F00 = .text:0x80139F00; // type:function size:0x44 -fn_80139F50 = .text:0x80139F50; // type:function size:0xE8 -fn_8013A040 = .text:0x8013A040; // type:function size:0x3C +saveUnkMapData__13dLytMapMain_cFv = .text:0x80139F00; // type:function size:0x44 +initUnkMapData__13dLytMapMain_cFv = .text:0x80139F50; // type:function size:0xE8 +loadUnkMapData__13dLytMapMain_cFv = .text:0x8013A040; // type:function size:0x3C fn_8013A080 = .text:0x8013A080; // type:function size:0xE8 fn_8013A170 = .text:0x8013A170; // type:function size:0xA84 fn_8013AC00 = .text:0x8013AC00; // type:function size:0x4 @@ -33531,8 +33531,8 @@ lbl_8051EFCC = .data:0x8051EFCC; // type:object size:0xC data:string lbl_8051EFD8 = .data:0x8051EFD8; // type:object size:0x20 lbl_8051EFF8 = .data:0x8051EFF8; // type:object size:0x20 lbl_8051F018 = .data:0x8051F018; // type:object size:0x18 data:string -lbl_8051F030 = .data:0x8051F030; // type:object size:0x10 -lbl_8051F040 = .data:0x8051F040; // type:object size:0x10 +lbl_8051F030 = .data:0x8051F030; // type:object size:0xE data:string +lbl_8051F040 = .data:0x8051F040; // type:object size:0xD data:string lbl_8051F050 = .data:0x8051F050; // type:object size:0x24 lbl_8051F074 = .data:0x8051F074; // type:object size:0x10 lbl_8051F084 = .data:0x8051F084; // type:object size:0x24 @@ -40091,8 +40091,8 @@ lbl_80572734 = .sdata:0x80572734; // type:object size:0x8 lbl_8057273C = .sdata:0x8057273C; // type:object size:0x8 lbl_80572744 = .sdata:0x80572744; // type:object size:0x8 lbl_8057274C = .sdata:0x8057274C; // type:object size:0x4 data:4byte -lbl_80572750 = .sdata:0x80572750; // type:object size:0x8 -lbl_80572758 = .sdata:0x80572758; // type:object size:0x8 +lbl_80572750 = .sdata:0x80572750; // type:object size:0x5 data:string +lbl_80572758 = .sdata:0x80572758; // type:object size:0x5 data:string lbl_80572760 = .sdata:0x80572760; // type:object size:0x8 data:4byte lbl_80572768 = .sdata:0x80572768; // type:object size:0x8 data:4byte lbl_80572770 = .sdata:0x80572770; // type:object size:0x8 diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 07c25499..d714f3dd 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -150,6 +150,7 @@ public: } bool fn_801B3EE0(); + void fn_801B3F20(); private: dRoom_c *createRoom(int roomid, bool flag0x40); diff --git a/include/d/lyt/d2d.h b/include/d/lyt/d2d.h index 6c057c22..7030b9b4 100644 --- a/include/d/lyt/d2d.h +++ b/include/d/lyt/d2d.h @@ -73,10 +73,10 @@ public: } protected: - Layout_c mLayout; - nw4r::lyt::DrawInfo mDrawInfo; - m2d::ResAccIf_c *mpResAcc; - u32 mFlags; + /* 0x10 */ Layout_c mLayout; + /* 0x30 */ nw4r::lyt::DrawInfo mDrawInfo; + /* 0x84 */ m2d::ResAccIf_c *mpResAcc; + /* 0x88 */ u32 mFlags; }; /** diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index cee9f4ce..44b2a0c9 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -17,7 +17,7 @@ #include "toBeSorted/d_flow_mgr.h" /** Bird Statue Definition (StatueSelectDestination) */ -struct dMapSaveDefinition { +struct dMapSaveObjDefinition { /* 0x00 */ const char *stageName; /* 0x04 */ u8 room; /* 0x05 */ u8 layer; @@ -26,6 +26,19 @@ struct dMapSaveDefinition { /* 0x0C */ const char *statueLabel; }; +/** Something for making sure re-opening the map opens it in a similar state as when it was last closed */ +struct dMapSavedDataEntry { + /* 0x00 */ s32 mapMode; + /* 0x04 */ u8 mapUpDirection; + /* 0x05 */ u8 field_0x05; + /* 0x06 */ u8 field_0x06; +}; + +struct dMapSavedData { + /* 0x00 */ dMapSavedDataEntry entries[6]; + /* 0x30 */ bool islandNamesOn; +}; + struct dMapFootPrintEntry { /* 0x00 */ dMapFootPrintEntry *pPrev; /* 0x04 */ dMapFootPrintEntry *pNext; @@ -406,6 +419,14 @@ public: STATE_FUNC_DECLARE(dLytMapSaveCaption_c, Wait); STATE_FUNC_DECLARE(dLytMapSaveCaption_c, Out); + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void setType(s32 type); + void setLabel(const char *label); + private: /* 0x000 */ UI_STATE_MGR_DECLARE(dLytMapSaveCaption_c); /* 0x03C */ d2d::LytBase_c mLyt; @@ -415,7 +436,8 @@ private: // Size 0x190 class dLytMapSaveObj_c { public: - dLytMapSaveObj_c() : mStateMgr(*this, sStateID::null), field_0x18C(0), field_0x18D(0), field_0x18E(0) {} + dLytMapSaveObj_c() + : mStateMgr(*this, sStateID::null), mSelectRequest(false), mDecideRequest(false), mDecideFinished(false) {} STATE_FUNC_DECLARE(dLytMapSaveObj_c, Wait); STATE_FUNC_DECLARE(dLytMapSaveObj_c, ToSelect); @@ -423,13 +445,22 @@ public: STATE_FUNC_DECLARE(dLytMapSaveObj_c, ToWait); STATE_FUNC_DECLARE(dLytMapSaveObj_c, Decide); + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void setPosition(const mVec3_c &position); + void setAlpha(u8 alpha); + void init(); + private: /* 0x000 */ UI_STATE_MGR_DECLARE(dLytMapSaveObj_c); /* 0x03C */ d2d::LytBase_c mLyt; /* 0x0CC */ d2d::AnmGroup_c mAnmGroups[3]; - /* 0x18C */ u8 field_0x18C; - /* 0x18D */ u8 field_0x18D; - /* 0x18E */ u8 field_0x18E; + /* 0x18C */ bool mSelectRequest; + /* 0x18D */ bool mDecideRequest; + /* 0x18E */ bool mDecideFinished; }; // TODO, name made up @@ -444,7 +475,7 @@ public: /** 2D UI - Map - beacon preview icon following the cursor */ class dLytMapPutIcon_c { public: - dLytMapPutIcon_c() {} + dLytMapPutIcon_c() : mVisible(false), field_0x98(0.0f, 0.0f) {} virtual ~dLytMapPutIcon_c() {} void build(d2d::ResAccIf_c *resAcc); @@ -458,7 +489,7 @@ public: private: /* 0x04 */ d2d::LytBase_c mLyt; /* 0x94 */ bool mVisible; - /* 0x95 */ u8 _0x95[0x9C - 0x95]; + /* 0x98 */ mVec2_c field_0x98; }; class dLytMapMain_c : public m2d::Base_c { @@ -477,7 +508,7 @@ public: bool fn_80139EA0() const; void lightPillarRelated(s32, s32, s32); - const dMapSaveDefinition *getSaveDefinition(s32 province, s32 statueIdx) const; + const dMapSaveObjDefinition *getSaveObjDefinition(s32 province, s32 statueIdx) const; STATE_FUNC_DECLARE(dLytMapMain_c, Invisible); STATE_FUNC_DECLARE(dLytMapMain_c, RenderingWait); @@ -536,6 +567,15 @@ private: void zoomOut(); void zoomIn(); + void loadTextboxes(); + + void saveUnkMapData(); + void initUnkMapData(); + void loadUnkMapData(); + + static dMapSavedData sSavedMapData; + static const dMapSavedData sDefaultMapData; + /* 0x0010 */ UI_STATE_MGR_DECLARE(dLytMapMain_c); /* 0x004C */ dFlowMgrBase_c mFlowMgr; /* 0x00A4 */ dFlow_c mFlow; @@ -554,9 +594,6 @@ private: /* 0x64C0 */ dLytMapFootPrints_c mFootPrints; /* 0x6664 */ dLytMapPutIcon_c mPutIcon; - - /* 0x6700 */ u8 _0x6700[0x6704 - 0x6700]; - /* 0x6704 */ dLytMapSaveObj_c mSaveObjs[12]; /* 0x79C4 */ dLytMapSaveCaption_c mSaveCaption; /* 0x7BD0 */ dLytMapSavePopup_c mSavePopup; @@ -564,9 +601,9 @@ private: /* 0x8208 */ u8 _0x8208[0x821C - 0x8208]; - /* 0x821C */ nw4r::lyt::Bounding **field_0x821C[10]; - /* 0x8244 */ nw4r::lyt::Bounding **field_0x8244[6]; - /* 0x825C */ nw4r::lyt::Bounding **field_0x825C[12]; + /* 0x821C */ nw4r::lyt::Bounding *field_0x821C[10]; + /* 0x8244 */ nw4r::lyt::Bounding *field_0x8244[6]; + /* 0x825C */ nw4r::lyt::Bounding *field_0x825C[12]; /* 0x828C */ mVec3_c field_0x828C[12]; /* 0x831C */ u8 _0x831C[0x832C - 0x831C]; @@ -591,13 +628,16 @@ private: /* 0x8C64 */ s32 field_0x8C64; /* 0x8C68 */ s32 field_0x8C68; - /* 0x8C6C */ u8 _0x8C6C[0x8C90 - 0x8C6C]; + /* 0x8C6C */ UNKWORD field_0x8C6C; + + /* 0x8C70 */ u8 _0x8C70[0x8C90 - 0x8C70]; /* 0x8C90 */ u8 field_0x8C90; + /* 0x8C91 */ u8 field_0x8C91; + /* 0x8C92 */ u8 field_0x8C92; + /* 0x8C93 */ u8 field_0x8C93; /* 0x8C94 */ s32 field_0x8C94; - - /* 0x8C98 */ u8 _0x8C98[0x8C9C - 0x8C98]; - + /* 0x8C98 */ UNKWORD field_0x8C98; /* 0x8C9C */ UNKWORD field_0x8C9C; /* 0x8CA0 */ u8 _0x8CA0[0x8CA4 - 0x8CA0]; @@ -605,8 +645,11 @@ private: /* 0x8CA4 */ s32 field_0x8CA4; /* 0x8CA8 */ s32 field_0x8CA8; - /* 0x8CAC */ u8 _0x8CAC[0x8CC0 - 0x8CAC]; + /* 0x8CAC */ u8 field_0x8CAC; + /* 0x8CAD */ u8 _0x8CAC[0x8CBC - 0x8CAD]; + + /* 0x8CBC */ nw4r::lyt::Bounding *mpMapBounding; /* 0x8CC0 */ bool field_0x8CC0; /* 0x8CC1 */ bool field_0x8CC1; /* 0x8CC4 */ mVec3_c field_0x8CC4; @@ -636,16 +679,25 @@ private: /* 0x8D6B */ u8 field_0x8D6B; /* 0x8D6C */ UNKWORD field_0x8D6C; /* 0x8D70 */ UNKWORD field_0x8D70; - /* 0x8D74 */ u8 _0x8D74[0x8D94 - 0x8D74]; + /* 0x8D74 */ u8 _0x8D74[0x8D78 - 0x8D74]; + /* 0x8D78 */ f32 field_0x8D78; + /* 0x8D7C */ f32 field_0x8D7C; + /* 0x8D80 */ f32 field_0x8D80; + /* 0x8D84 */ f32 field_0x8D84; + /* 0x8D88 */ f32 field_0x8D88; + /* 0x8D8C */ u8 _0x8D8C[0x8D94 - 0x8D8C]; /* 0x8D94 */ d2d::SubPaneList mSubpaneList; /* 0x8DA0 */ d2d::SubPaneListNode mSubpane; - /* 0x8DB0 */ u8 _0x8DB0[0x8DB4 - 0x8DB0]; + /* 0x8DB0 */ UNKWORD field_0x8DB0; /* 0x8DB4 */ bool mNavEnabled; - /* 0x8DB4 */ bool field_0x8DB5; - /* 0x8DB6 */ u8 _0x8DB6[0x8DBC - 0x8DB6]; + /* 0x8DB5 */ bool field_0x8DB5; + /* 0x8DB8 */ UNKWORD field_0x8DB8; /* 0x8DBC */ bool mIslandNamesOn; /* 0x8DBD */ bool field_0x8DBD; - /* 0x8DBE */ u8 _0x8DBE[0x8DC8 - 0x8DBE]; + /* 0x8DBE */ u8 field_0x8DBE; + /* 0x8DBF */ u8 field_0x8DBF; + /* 0x8DC0 */ UNKWORD field_0x8DC0; + /* 0x8DC4 */ UNKWORD field_0x8DC4; /* 0x8DC8 */ dLytMapGlobal_c mGlobal; }; @@ -707,8 +759,8 @@ public: mMapMain.lightPillarRelated(p1, p2, p3); } - const dMapSaveDefinition *getSaveDefinition(s32 statueIdx) const { - return mMapMain.getSaveDefinition(mMapMain.field_0x8C9C, statueIdx); + const dMapSaveObjDefinition *getSaveObjDefinition(s32 statueIdx) const { + return mMapMain.getSaveObjDefinition(mMapMain.field_0x8C9C, statueIdx); } private: diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index 646bac8a..cd858428 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -32,6 +32,10 @@ public: return field_0x20; } + void setField_0x28(const mVec2_c &v) { + field_0x28 = v; + } + const mVec3_c &getMapRotationCenter() const { return mMapRotationCenter; } @@ -94,8 +98,7 @@ private: /* 0x0C */ mVec2_c field_0x0C; /* 0x14 */ mVec3_c mMapRotationCenter; /* 0x20 */ mVec2_c field_0x20; - /* 0x28 */ f32 field_0x28; - /* 0x2C */ f32 field_0x2C; + /* 0x28 */ mVec2_c field_0x28; /* 0x30 */ mVec3_c mPlayerPosition; /* 0x3C */ mAng mMapRotation; /* 0x40 */ f32 field_0x40; diff --git a/include/m/m_vec.h b/include/m/m_vec.h index 852ba68b..30beb68c 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -300,6 +300,9 @@ public: mVec2_c(const EGG::Vector2f &other) { set(other.x, other.y); } + mVec2_c(const nw4r::math::VEC2 &other) { + set(other.x, other.y); + } mVec2_c(f32 fx, f32 fy) { set(fx, fy); } diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index f9690327..0f5d0079 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -11,6 +11,8 @@ #include "d/d_pad_nav.h" #include "d/d_player.h" #include "d/d_rumble.h" +#include "d/d_sc_game.h" +#include "d/d_stage.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_map_global.h" @@ -21,10 +23,10 @@ #include "egg/core/eggColorFader.h" #include "m/m_vec.h" #include "m/m_video.h" -#include "nw4r/g3d/g3d_obj.h" #include "nw4r/lyt/lyt_bounding.h" +#include "nw4r/lyt/lyt_group.h" #include "nw4r/lyt/lyt_pane.h" -#include "nw4r/lyt/lyt_window.h" +#include "nw4r/lyt/lyt_types.h" #include "s/s_StateInterfaces.hpp" #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" @@ -1548,7 +1550,7 @@ void dLytMapSavePopup_c::draw() { pBounding = mpStatueBoundings[i]; mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].bind(false); mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].setFrame(30.0f); - const dMapSaveDefinition *def = dLytMap_c::GetInstance()->getSaveDefinition(i); + const dMapSaveObjDefinition *def = dLytMap_c::GetInstance()->getSaveObjDefinition(i); f32 width = setStatueLabel(def->statueLabel); f32 allScaleX = mLyt.findPane("N_all_00")->GetScale().x; @@ -1600,7 +1602,7 @@ f32 dLytMapSavePopup_c::setStatueLabel(const char *label) { textBox->GetLineWidth(nullptr); textBox = mLyt.getTextBox(sTPopup); textBox->setMessageWithGlobalTextProcessor2(label, nullptr); - + dWindow_c *w = mLyt.getWindow(sBg); w->UpdateSize(textBox, 60.0f); return w->GetSize().width; @@ -1610,48 +1612,297 @@ void dLytMapSavePopup_c::hide(s32 statueIdx) { mActions[statueIdx].hide(); } +#define MAP_SAVE_CAPTION_ANIM_TYPE 0 +#define MAP_SAVE_CAPTION_ANIM_TEXTLINE 1 +#define MAP_SAVE_CAPTION_ANIM_IN 2 +#define MAP_SAVE_CAPTION_ANIM_LOOP 3 +#define MAP_SAVE_CAPTION_ANIM_OUT 4 + +#define MAP_SAVE_CAPTION_NUM_ANIMS 5 + void dLytMapSaveCaption_c::initializeState_Invisible() {} void dLytMapSaveCaption_c::executeState_Invisible() {} void dLytMapSaveCaption_c::finalizeState_Invisible() {} -void dLytMapSaveCaption_c::initializeState_In() {} -void dLytMapSaveCaption_c::executeState_In() {} +void dLytMapSaveCaption_c::initializeState_In() { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].setFrame(0.0f); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].setFrame(0.0f); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].unbind(); +} +void dLytMapSaveCaption_c::executeState_In() { + if (mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].isEndReached()) { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].bind(false); + mLyt.calc(); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].unbind(); + mStateMgr.changeState(StateID_In); + } +} void dLytMapSaveCaption_c::finalizeState_In() {} void dLytMapSaveCaption_c::initializeState_Wait() {} void dLytMapSaveCaption_c::executeState_Wait() {} void dLytMapSaveCaption_c::finalizeState_Wait() {} -void dLytMapSaveCaption_c::initializeState_Out() {} -void dLytMapSaveCaption_c::executeState_Out() {} +void dLytMapSaveCaption_c::initializeState_Out() { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].setFrame(0.0f); +} +void dLytMapSaveCaption_c::executeState_Out() { + if (mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].isEndReached()) { + mLyt.calc(); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].unbind(); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].unbind(); + mStateMgr.changeState(StateID_Invisible); + } +} void dLytMapSaveCaption_c::finalizeState_Out() {} +static const d2d::LytBrlanMapping sMapSaveCaptionBrlanMap[] = { + { "mapSaveCaption_00_type.brlan", "G_type_00"}, + {"mapSaveCaption_00_textLine.brlan", "G_textLine_00"}, + { "mapSaveCaption_00_in.brlan", "G__inOut_00"}, + { "mapSaveCaption_00_loop.brlan", "G_loop_00"}, + { "mapSaveCaption_00_out.brlan", "G__inOut_00"}, +}; + +void dLytMapSaveCaption_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapSaveCaption_00.brlyt", nullptr); + for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { + mAnmGroups[i].init( + sMapSaveCaptionBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSaveCaptionBrlanMap[i].mName + ); + } + + mStateMgr.changeState(StateID_Invisible); +} + +void dLytMapSaveCaption_c::remove() { + for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } +} + +void dLytMapSaveCaption_c::execute() { + mStateMgr.executeState(); + for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { + if (mAnmGroups[i].isBound()) { + mAnmGroups[i].play(); + } + } + mLyt.calc(); +} + +void dLytMapSaveCaption_c::draw() { + if (*mStateMgr.getStateID() != StateID_Invisible) { + mLyt.draw(); + } +} + +void dLytMapSaveCaption_c::setType(s32 type) { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].setFrame(type); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].unbind(); +} + +void dLytMapSaveCaption_c::setLabel(const char *label) { + mLyt.getTextBox("T_captionS_00")->setMessageWithGlobalTextProcessor2(label, nullptr); + mLyt.getTextBox("T_caption_00")->setMessageWithGlobalTextProcessor2(label, nullptr); + // ok + const char *tmp = "T_captionS_00"; + dTextBox_c *box = mLyt.getTextBox(tmp); + // Setting message twice... + box->setMessageWithGlobalTextProcessor2(label, nullptr); + + f32 width = box->GetLineWidth(nullptr); + const wchar_t *text = dMessage_c::getTextMessageByLabel(label, true, nullptr, 0); + s32 lines = box->calcTextLines(text, dMessage_c::getGlobalTagProcessor()); + + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].bind(false); + if (width < 226.0f) { + if (lines == 1) { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(0.0f); + } else { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(1.0f); + } + } else { + if (lines == 1) { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(2.0f); + } else { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(3.0f); + } + } + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].unbind(); +} + +#define MAP_SAVE_OBJ_ANIM_ON_OFF 0 +#define MAP_SAVE_OBJ_ANIM_DECIDE 1 +#define MAP_SAVE_OBJ_ANIM_LOOP 2 + +#define MAP_SAVE_OBJ_NUM_ANIMS 3 + void dLytMapSaveObj_c::initializeState_Wait() {} -void dLytMapSaveObj_c::executeState_Wait() {} +void dLytMapSaveObj_c::executeState_Wait() { + if (mSelectRequest) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setForward(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setFrame(0.0f); + mStateMgr.changeState(StateID_ToSelect); + } +} void dLytMapSaveObj_c::finalizeState_Wait() {} void dLytMapSaveObj_c::initializeState_ToSelect() {} -void dLytMapSaveObj_c::executeState_ToSelect() {} +void dLytMapSaveObj_c::executeState_ToSelect() { + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isEndReached()) { + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_START_POINT); + mLyt.calc(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); + mStateMgr.changeState(StateID_Select); + } + + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isBound()) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].play(); + } +} void dLytMapSaveObj_c::finalizeState_ToSelect() {} void dLytMapSaveObj_c::initializeState_Select() {} -void dLytMapSaveObj_c::executeState_Select() {} +void dLytMapSaveObj_c::executeState_Select() { + if (!mSelectRequest) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setBackward(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setToStart(); + mDecideRequest = false; + mStateMgr.changeState(StateID_ToWait); + } else if (mDecideRequest) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_DECIDE_START_POINT); + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].bind(false); + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].setFrame(0.0f); + mStateMgr.changeState(StateID_Decide); + } +} void dLytMapSaveObj_c::finalizeState_Select() {} void dLytMapSaveObj_c::initializeState_ToWait() {} -void dLytMapSaveObj_c::executeState_ToWait() {} +void dLytMapSaveObj_c::executeState_ToWait() { + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isStop2()) { + mLyt.calc(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); + mStateMgr.changeState(StateID_Select); + } + + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isBound()) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].play(); + } +} void dLytMapSaveObj_c::finalizeState_ToWait() {} void dLytMapSaveObj_c::initializeState_Decide() {} -void dLytMapSaveObj_c::executeState_Decide() {} +void dLytMapSaveObj_c::executeState_Decide() { + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].isEndReached()) { + mLyt.calc(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].unbind(); + mDecideFinished = true; + } + + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].isBound()) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].play(); + } +} void dLytMapSaveObj_c::finalizeState_Decide() {} +void dLytMapSaveObj_c::setPosition(const mVec3_c &position) { + mLyt.getLayout()->GetRootPane()->SetTranslate(position); +} + +void dLytMapSaveObj_c::setAlpha(u8 alpha) { + mLyt.getLayout()->GetRootPane()->SetAlpha(alpha); +} + +void dLytMapSaveObj_c::init() { + mSelectRequest = false; + mDecideRequest = false; + mDecideFinished = false; + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setFrame(0.0f); + mLyt.calc(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); + + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].setFrame(0.0f); + mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].bind(false); + + mStateMgr.changeState(StateID_Wait); +} + +static const d2d::LytBrlanMapping sMapSaveObjBrlanMap[] = { + { "mapSaveObj_00_saveObjOnOff.brlan", "G_saveBtn_00"}, + {"mapSaveObj_00_saveObjDecide.brlan", "G_saveBtn_00"}, + { "mapSaveObj_00_saveObjLoop.brlan", "G_saveBtnLoop_00"}, +}; + +void dLytMapSaveObj_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapSaveObj_00.brlyt", nullptr); + for (int i = 0; i < MAP_SAVE_OBJ_NUM_ANIMS; i++) { + mAnmGroups[i].init(sMapSaveObjBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSaveObjBrlanMap[i].mName); + } + + mLyt.getLayout()->GetRootPane()->SetInfluencedAlpha(true); + + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].setFrame(0.0f); + mLyt.calc(); + + mStateMgr.changeState(StateID_Wait); +} + +void dLytMapSaveObj_c::remove() { + for (int i = 0; i < MAP_SAVE_OBJ_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } +} + +void dLytMapSaveObj_c::execute() { + mStateMgr.executeState(); + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].isBound()) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].play(); + } +} + +void dLytMapSaveObj_c::draw() { + nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); + // @bug calc should be in execute... + mLyt.calc(); + root->Draw(mLyt.getDrawInfo()); +} + #pragma dont_inline on dLytMapMain_c::dLytMapMain_c() : mStateMgr(*this), mFlowMgr(&mFlow), mFloorBtnMgr(&mGlobal), mFootPrints(&mGlobal), + field_0x8C6C(0), + field_0x8C92(1), + field_0x8C93(0), + field_0x8C94(0), + field_0x8C98(0), + field_0x8CAC(0), field_0x8D38(0.0f, 0.0f), field_0x8D40(1.0f), field_0x8D44(0), @@ -1659,7 +1910,31 @@ dLytMapMain_c::dLytMapMain_c() field_0x8D48(0), field_0x8D4C(0.0f), field_0x8D50(0.0f), - field_0x8D68(0) {} + field_0x8D58(0), + field_0x8D5C(1), + field_0x8D60(0), + field_0x8D64(0), + field_0x8D68(0), + field_0x8D6A(0), + field_0x8D6B(0), + field_0x8D6C(0), + field_0x8D70(0), + field_0x8DB0(0), + mNavEnabled(false), + field_0x8DB5(false), + field_0x8DB8(0), + mIslandNamesOn(false), + field_0x8DBD(0), + field_0x8DBE(0), + field_0x8DBF(0), + field_0x8DC0(-1), + field_0x8DC4(0) { + field_0x8D78 = 0.0f; + field_0x8D7C = 0.0f; + field_0x8D80 = 0.0f; + field_0x8D84 = 0.0f; + field_0x8D88 = 0.0f; +} #pragma dont_inline reset dLytMapMain_c::~dLytMapMain_c() { @@ -1674,6 +1949,252 @@ dLytMapGlobal_c *dLytMapMain_c::getGlobal() { return &mGlobal; } +dMapSavedData dLytMapMain_c::sSavedMapData = { + { + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + }, + false +}; + +const dMapSavedData dLytMapMain_c::sDefaultMapData = { + { + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + }, + false +}; + +static const char *const sTextboxLabelMapping[][2] = { + { "T_sNameS_00", "MAP_00"}, + { "T_sName_00", "MAP_00"}, + { "T_pNameS_00", "MAP_01"}, + { "T_pName_00", "MAP_01"}, + { "T_pNameS_01", "MAP_01"}, + { "T_fNameS_00", "MAP_02"}, + { "T_fName_00", "MAP_02"}, + { "T_fNameS_01", "MAP_02"}, + { "T_nFnameS_00", "MAP_03"}, + { "T_nFname_00", "MAP_03"}, + { "T_nFnameS_01", "MAP_03"}, + { "T_lNameS_00", "MAP_04"}, + { "T_lName_00", "MAP_04"}, + { "T_lNameS_01", "MAP_04"}, + { "T_sVnameS_00", "MAP_05"}, + { "T_sVname_00", "MAP_05"}, + { "T_sVnameS_01", "MAP_05"}, + { "T_nVnameS_00", "MAP_06"}, + { "T_nVname_00", "MAP_06"}, + { "T_nVnameS_01", "MAP_06"}, + { "T_dNameS_01", "MAP_08"}, + { "T_dName_01", "MAP_08"}, + { "T_dNameS_00", "MAP_08"}, + { "T_dNameS_02", "MAP_07"}, + { "T_dName_02", "MAP_07"}, + { "T_dNameS_03", "MAP_07"}, + { "T_gNameS_01", "MAP_10"}, + { "T_gName_01", "MAP_10"}, + { "T_gNameS_04", "MAP_10"}, + { "T_gNameS_00", "MAP_09"}, + { "T_gName_00", "MAP_09"}, + { "T_gNameS_03", "MAP_09"}, + { "T_gNameS_02", "MAP_40"}, + { "T_gName_02", "MAP_40"}, + { "T_gNameS_05", "MAP_40"}, + { "T_lastDs_00", "MAP_17"}, + { "T_lastD_00", "MAP_17"}, + { "T_pampkinNS_00", "MAP_27"}, + { "T_pampkinN_00", "MAP_27"}, + { "T_teryNS_00", "MAP_28"}, + { "T_teryN_00", "MAP_28"}, + { "T_tikurinNS_00", "MAP_29"}, + { "T_tikurinN_00", "MAP_29"}, + { "T_musiNS_00", "MAP_31"}, + { "T_musiN_00", "MAP_31"}, + { "T_utaNS_00", "MAP_30"}, + { "T_utaN_00", "MAP_30"}, + { "T_ruretouNS_00", "MAP_26"}, + { "T_ruretouN_00", "MAP_26"}, + { "T_toForestS_00", "MAP_58"}, + { "T_toForest_00", "MAP_58"}, + {"T_toVolcanoS_00", "MAP_59"}, + { "T_toVolcano_00", "MAP_59"}, + { "T_toDesertS_00", "MAP_60"}, + { "T_toDesert_00", "MAP_60"}, + { "T_fD1s_00", "MAP_11"}, + { "T_fD1_00", "MAP_11"}, + { "T_fD2s_00", "MAP_14"}, + { "T_fD2_00", "MAP_14"}, + { "T_vD2s_00", "MAP_16"}, + { "T_vD2_00", "MAP_16"}, + { "T_vD1s_00", "MAP_12"}, + { "T_vD1_00", "MAP_12"}, + { "T_dD1s_00", "MAP_13"}, + { "T_dD1_00", "MAP_13"}, + { "T_dD2s_00", "MAP_15"}, + { "T_dD2_00", "MAP_15"}, + { "T_lastDs_00", "MAP_17"}, + { "T_lastD_00", "MAP_17"}, +}; + +static const char *sHyliasRealmMapLabel = "MAP_64"; + +void dLytMapMain_c::loadTextboxes() { + bool hyliasRealm = dScGame_c::isCurrentStage("F403") || dScGame_c::isCurrentStage("F404"); + for (int i = 0; i < (int)ARRAY_LENGTH(sTextboxLabelMapping); i++) { + dTextBox_c *box = mLyt.getTextBox(sTextboxLabelMapping[i][0]); + if (hyliasRealm && (i == 2 || i == 3 || i == 4)) { + // Replace "Sealed Grounds" with "Hylia's Realm" + box->setMessageWithGlobalTextProcessor2(sHyliasRealmMapLabel, nullptr); + } else { + box->setMessageWithGlobalTextProcessor2(sTextboxLabelMapping[i][1], nullptr); + } + } +} +static const d2d::LytBrlanMapping sMapMainBrlanMap[] = { + { "map_00_in.brlan", "G_inOut_00"}, + { "map_00_titleOnOff.brlan", "G_titleOnOff_00"}, + { "map_00_nOnOff.brlan", "G_nOnOff_00"}, + { "map_00_mapV.brlan", "G_mapV_00"}, + { "map_00_worldState.brlan", "G_worldState"}, + { "map_00_player2patten.brlan", "G_2Pattern_00"}, + { "map_00_rotate.brlan", "G_rotate_00"}, + { "map_00_out.brlan", "G_inOut_00"}, + { "map_00_mapDraw.brlan", "G_plainC_00"}, + { "map_00_mapDraw.brlan", "G_forestC_00"}, + { "map_00_mapDraw.brlan", "G_nForestC_00"}, + { "map_00_mapDraw.brlan", "G_sVolcanoC_00"}, + { "map_00_mapDraw.brlan", "G_mineC_00"}, + { "map_00_mapDraw.brlan", "G_desertC_00"}, + { "map_00_mapDraw.brlan", "G_lakeC_00"}, + { "map_00_mapDraw.brlan", "G_glenC_00"}, + { "map_00_mapDraw.brlan", "G_seaC_00"}, + { "map_00_mapDraw.brlan", "G_nVolcanoC_00"}, + { "map_00_mapDraw.brlan", "G_glenC_01"}, + { "map_00_skyLoftUpDown.brlan", "G_skyloftUD_00"}, + {"map_00_LinkPositionLight.brlan", "G_linkPointL_00"}, + { "map_00_mapZinForest.brlan", "G_ZoomInOut_00"}, + { "map_00_zoomWakuIn.brlan", "G_zoomWaku_00"}, + { "map_00_zoomWakuOut.brlan", "G_zoomWaku_00"}, + { "map_00_mapZoutForest.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZinPlant.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutPlant.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInPlant.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZoutPlant.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZinDesert.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZoutDesert.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZinVolcano.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZoutVolcano.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutForest.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutDesert.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutVolcano.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInForest.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInDesert.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInVolcano.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInSkyMap.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutSkyMap.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInSkyMap2.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutSkyMap2.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInSkyCorse.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutSkyCorse.brlan", "G_ZoomInOut_00"}, + { "map_00_sunRote.brlan", "G_sun_00"}, + { "map_00_inNoCam.brlan", "G_inOut_00"}, + { "map_00_outNoCam.brlan", "G_inOut_00"}, + { "map_00_cloudLoop.brlan", "G_cloudLoop_00"}, + { "map_00_lightLoop.brlan", "G_lightLoop_00"}, + { "map_00_nushiLoop.brlan", "G_nushiLoop_00"}, + { "map_00_type.brlan", "G_type_00"}, + { "map_00_kumoPattern.brlan", "G_kumoPattern_00"}, + { "map_00_titleLine.brlan", "G_textLine_00"}, +}; + +#define MAP_MAIN_ANIM_IN 0 + +static const char *sGroupName = "G_ref_00"; + +static const char *sBoundingNames[] = { + "B_noroshi_00", "B_houkoul_00", "B_remoCon_00", "B_nunchaku_00", "B_tittle_00", "B_saveIcon_00", + "B_saveIcon_01", "B_saveIcon_02", "B_saveIcon_03", "B_saveIcon_04", "B_saveIcon_05", "B_saveIcon_06", + "B_saveIcon_07", "B_saveIcon_08", "B_saveIcon_28", "B_saveIcon_10", "B_saveIcon_11", "B_saveIcon_12", + "B_saveIcon_13", "B_saveIcon_14", "B_saveIcon_15", "B_saveIcon_16", "B_saveIcon_17", "B_saveIcon_18", + "B_saveIcon_19", "B_saveIcon_20", "B_saveIcon_21", "B_saveIcon_22", "B_saveIcon_23", "B_saveIcon_24", + "B_saveIcon_25", "B_saveIcon_26", "B_saveIcon_27", +}; + +void dLytMapMain_c::build() { + field_0x8DBF = 0; + field_0x8DB0 = 0; + if (dScGame_c::isCurrentStage("F102")) { + // awesome but unnecessary + field_0x8DB0 = 0; + } + + dStage_c::GetInstance()->fn_801B3F20(); + d2d::ResAccIf_c *resAcc = dLytMap_c::getResAcc(); + mLyt.setResAcc(resAcc); + mLyt.build("map_00.brlyt", nullptr); + mVec2_c scale = mLyt.getDrawInfo().GetLocationAdjustScale(); + getGlobal()->setField_0x28(scale); + + // TODO define + for (int i = 0; i < 54; i++) { + mAnmGroups[i].init(sMapMainBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapMainBrlanMap[i].mName); + } + + mFloorBtnMgr.build(resAcc); + mSubpane.mpLytPane = &mFloorBtnMgr; + mSubpaneList.PushBack(&mSubpane); + + d2d::dSubPane::linkMeters(mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName), &mSubpaneList); + mFootPrints.build(resAcc); + + mPinIconAggregate.build(resAcc); + mPutIcon.build(resAcc); + + for (int i = 0; i < (int)ARRAY_LENGTH(mSaveObjs); i++) { + mSaveObjs[i].build(resAcc); + } + + mSaveCaption.build(resAcc); + mSavePopup.build(resAcc); + mPopupInfo.build(resAcc); + + mAnmGroups[MAP_MAIN_ANIM_IN].bind(false); + mAnmGroups[MAP_MAIN_ANIM_IN].setToEnd(); + mLyt.calc(); + + for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) { + nw4r::lyt::Bounding *b = mLyt.findBounding(sBoundingNames[i]); + b->SetVisible(false); + if (i >= 5 && i < 15) { + field_0x821C[i - 5] = b; + } else if (i >= 15 && i < 21) { + field_0x8244[i - 15] = b; + } else if (i >= 21 && i < 33) { + field_0x825C[i - 21] = b; + } + + field_0x832C[i].init(b, 0x02, 2, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&field_0x832C[i]); + } + + for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) { + field_0x832C[i].resetCachedHitboxes(); + field_0x832C[i].execute(); + } + + mpMapBounding = mLyt.findBounding("B_map_00"); + mpMapBounding->SetScale(mVec2_c(1.0f, 1.0f)); +} + void dLytMapMain_c::draw() {} void dLytMap_c::build() { @@ -1691,6 +2212,32 @@ void lytMapusesSizedWString() { sString.sprintf(L"%ld", 0); } +void dLytMapMain_c::saveUnkMapData() { + dMapSavedDataEntry &data = sSavedMapData.entries[field_0x8C68]; + data.field_0x06 = 1; + data.mapMode = field_0x8CA4; + data.mapUpDirection = field_0x8C90; + data.field_0x05 = field_0x8C92; + sSavedMapData.islandNamesOn = mIslandNamesOn; +} + +void dLytMapMain_c::initUnkMapData() { + for (int i = 0; i < 6; i++) { + sSavedMapData.entries[i].field_0x06 = sDefaultMapData.entries[i].field_0x06; + sSavedMapData.entries[i].mapMode = sDefaultMapData.entries[i].mapMode; + sSavedMapData.entries[i].mapUpDirection = sDefaultMapData.entries[i].mapUpDirection; + sSavedMapData.entries[i].field_0x05 = sDefaultMapData.entries[i].field_0x05; + } + sSavedMapData.islandNamesOn = sDefaultMapData.islandNamesOn; +} + +void dLytMapMain_c::loadUnkMapData() { + field_0x8CA4 = sSavedMapData.entries[field_0x8C68].mapMode; + field_0x8C90 = sSavedMapData.entries[field_0x8C68].mapUpDirection; + field_0x8C92 = sSavedMapData.entries[field_0x8C68].field_0x05; + mIslandNamesOn = sSavedMapData.islandNamesOn; +} + void dLytMapMain_c::initializeState_Invisible() {} void dLytMapMain_c::executeState_Invisible() {} void dLytMapMain_c::finalizeState_Invisible() {} diff --git a/src/d/lyt/d_lyt_map_global.cpp b/src/d/lyt/d_lyt_map_global.cpp index 18d8d611..057f6e8e 100644 --- a/src/d/lyt/d_lyt_map_global.cpp +++ b/src/d/lyt/d_lyt_map_global.cpp @@ -9,8 +9,7 @@ dLytMapGlobal_c::dLytMapGlobal_c() field_0x0C(0.0f, 0.0f), mMapRotationCenter(0.0f, 0.0f, 0.0f), field_0x20(0.0f, 0.0f), - field_0x28(0.0f), - field_0x2C(0.0f), + field_0x28(0.0f, 0.0f), mMapRotation(0), field_0x40(1.0f), field_0x44(1.0f), @@ -40,7 +39,7 @@ void dLytMapGlobal_c::projectOntoMap( work.x *= f2 * f1; work.z *= f2 * f1; - work.x *= field_0x28; + work.x *= field_0x28.x; result.x = work.x; result.y = -work.z; @@ -75,7 +74,7 @@ void dLytMapGlobal_c::unprojectFromMap( f32 tmp = 1.0f / f1; mVec2_c diff = position - v1; - work.x = diff.x * tmp * (1.0f / field_0x28); + work.x = diff.x * tmp * (1.0f / field_0x28.x); work.z = -diff.y * tmp; work = work + v2; From 4fc5280807cc0a3e32e93f67acc5beedb41c24eb Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 3 Oct 2025 23:40:06 +0200 Subject: [PATCH 07/20] more map --- config/SOUE01/symbols.txt | 24 +- include/d/d_camera.h | 9 +- include/d/lyt/d_lyt_map.h | 80 +++-- include/d/lyt/d_lyt_map_capture.h | 16 +- include/d/lyt/d_lyt_map_global.h | 50 ++- include/m/m2d.h | 2 +- include/toBeSorted/event_manager.h | 2 + src/d/lyt/d_lyt_map.cpp | 546 ++++++++++++++++++++++++++--- src/d/lyt/d_lyt_map_global.cpp | 18 +- 9 files changed, 649 insertions(+), 98 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 58a9bc3d..2bf566c0 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3555,7 +3555,7 @@ fn_8009DFE0 = .text:0x8009DFE0; // type:function size:0x54 fn_8009E040 = .text:0x8009E040; // type:function size:0x54 fn_8009E0A0 = .text:0x8009E0A0; // type:function size:0x6C fn_8009E110 = .text:0x8009E110; // type:function size:0x14 -mainEventManagerUpdate = .text:0x8009E130; // type:function size:0x9A4 +execute__12EventManagerFv = .text:0x8009E130; // type:function size:0x9A4 fn_8009EAE0 = .text:0x8009EAE0; // type:function size:0x4 fn_8009EAF0 = .text:0x8009EAF0; // type:function size:0xC fn_8009EB00 = .text:0x8009EB00; // type:function size:0xC @@ -7493,7 +7493,7 @@ fn_8012D670 = .text:0x8012D670; // type:function size:0x5C fn_8012D6D0 = .text:0x8012D6D0; // type:function size:0x20 fn_8012D6F0 = .text:0x8012D6F0; // type:function size:0xE4 fn_8012D7E0 = .text:0x8012D7E0; // type:function size:0x10 -fn_8012D7F0 = .text:0x8012D7F0; // type:function size:0x8 +isBusyRendering__16dLytMapCapture_cCFv = .text:0x8012D7F0; // type:function size:0x8 fn_8012D800 = .text:0x8012D800; // type:function size:0xEC finalizeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D8F0; // type:function size:0x30 executeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D920; // type:function size:0x30 @@ -7864,7 +7864,7 @@ finalizeState_In__13dLytMapMain_cFv = .text:0x8013C670; // type:function size:0x fn_8013C6B0 = .text:0x8013C6B0; // type:function size:0xA8 fn_8013C760 = .text:0x8013C760; // type:function size:0x100 fn_8013C860 = .text:0x8013C860; // type:function size:0x1C -fn_8013C880 = .text:0x8013C880; // type:function size:0x64 +shouldDrawFootprints__13dLytMapMain_cCFv = .text:0x8013C880; // type:function size:0x64 zoomIn__13dLytMapMain_cFv = .text:0x8013C8F0; // type:function size:0x644 zoomOut__13dLytMapMain_cFv = .text:0x8013CF40; // type:function size:0x54C initializeState_Active__13dLytMapMain_cFv = .text:0x8013D490; // type:function size:0x4 @@ -7888,7 +7888,7 @@ finalizeState_ChgDispAreaMode_Map__13dLytMapMain_cFv = .text:0x8013F2A0; // type initializeState_ChgDispAreaMode_WA__13dLytMapMain_cFv = .text:0x8013F2B0; // type:function size:0x594 executeState_ChgDispAreaMode_WA__13dLytMapMain_cFv = .text:0x8013F850; // type:function size:0x2CC finalizeState_ChgDispAreaMode_WA__13dLytMapMain_cFv = .text:0x8013FB20; // type:function size:0x50 -fn_8013FB70 = .text:0x8013FB70; // type:function size:0xC0 +fn_8013FB70__13dLytMapMain_cFRC7mVec3_cf = .text:0x8013FB70; // type:function size:0xC0 initializeState_ChgDispAreaMode_CsrRot__13dLytMapMain_cFv = .text:0x8013FC30; // type:function size:0x3C0 executeState_ChgDispAreaMode_CsrRot__13dLytMapMain_cFv = .text:0x8013FFF0; // type:function size:0x388 finalizeState_ChgDispAreaMode_CsrRot__13dLytMapMain_cFv = .text:0x80140380; // type:function size:0x4 @@ -7921,7 +7921,7 @@ finalizeState_EventMapIntro_Step3__13dLytMapMain_cFv = .text:0x80140B10; // type initializeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B20; // type:function size:0x18 executeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B40; // type:function size:0x38 finalizeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B80; // type:function size:0x4 -fn_80140B90 = .text:0x80140B90; // type:function size:0xBC +fn_80140B90__13dLytMapMain_cFv = .text:0x80140B90; // type:function size:0xBC initializeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140C50; // type:function size:0x18 executeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140C70; // type:function size:0x34 fn_80140CA4 = .text:0x80140CA4; // type:function size:0x4 @@ -7966,7 +7966,7 @@ initializeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x801414C0; // t executeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x801414E0; // type:function size:0x34 fn_80141514 = .text:0x80141514; // type:function size:0x4 finalizeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x80141520; // type:function size:0x4 -fn_80141530 = .text:0x80141530; // type:function size:0x48 +fn_80141530__13dLytMapMain_cCFv = .text:0x80141530; // type:function size:0x48 findGoddessChestWithStoryflag = .text:0x80141580; // type:function size:0x94 initializeState_EventGoddessCube_Step1__13dLytMapMain_cFv = .text:0x80141620; // type:function size:0x10 executeState_EventGoddessCube_Step1__13dLytMapMain_cFv = .text:0x80141630; // type:function size:0x44 @@ -7998,13 +7998,13 @@ fn_801428F0 = .text:0x801428F0; // type:function size:0xB4 fn_801429B0 = .text:0x801429B0; // type:function size:0x1D8 fn_80142B90 = .text:0x80142B90; // type:function size:0xEC fn_80142C80 = .text:0x80142C80; // type:function size:0x8C -fn_80142D10 = .text:0x80142D10; // type:function size:0x80 -fn_80142D90 = .text:0x80142D90; // type:function size:0x170 -fn_80142F00 = .text:0x80142F00; // type:function size:0x158 -fn_80143060 = .text:0x80143060; // type:function size:0xBC +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_80143060__13dLytMapMain_cFR7mVec3_cRC7mVec3_cRC7mVec3_cRC4mAng = .text:0x80143060; // type:function size:0xBC fn_80143120 = .text:0x80143120; // type:function size:0xC0 fn_801431E0 = .text:0x801431E0; // type:function size:0x11C -fn_80143300 = .text:0x80143300; // type:function size:0x54 +fn_80143300__13dLytMapMain_cFv = .text:0x80143300; // type:function size:0x54 fn_80143360 = .text:0x80143360; // type:function size:0x1D4 checkScroll__13dLytMapMain_cFv = .text:0x80143540; // type:function size:0x374 fn_801438C0 = .text:0x801438C0; // type:function size:0x6C @@ -10975,7 +10975,7 @@ fadeOut__8dStage_cFlUs = .text:0x801B3DB0; // type:function size:0xA8 forceFadeOut__8dStage_cFv = .text:0x801B3E60; // type:function size:0x40 forceFadeIn__8dStage_cFv = .text:0x801B3EA0; // type:function size:0x40 fn_801B3EE0__8dStage_cFv = .text:0x801B3EE0; // type:function size:0x3C -fn_801B3F20 = .text:0x801B3F20; // type:function size:0x8 +fn_801B3F20__8dStage_cFv = .text:0x801B3F20; // type:function size:0x8 fn_801B3F30 = .text:0x801B3F30; // type:function size:0x8 drawMap__8dStage_cFP6mMtx_ci = .text:0x801B3F40; // type:function size:0x90 RoomManager__getRMPLForRoom = .text:0x801B3FD0; // type:function size:0x34 diff --git a/include/d/d_camera.h b/include/d/d_camera.h index 5dbb0f61..b8d8771b 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -1,6 +1,7 @@ #ifndef D_CAMERA_H #define D_CAMERA_H +#include "common.h" #include "d/d_base.h" #include "m/m_vec.h" @@ -33,6 +34,10 @@ public: mScreenShakeIntensity = val; } + UNKWORD getField_0xDA8() const { + return field_0xDA8; + } + bool isUnderwater() const; f32 getUnderwaterDepth() const; @@ -44,7 +49,9 @@ private: /* 0xD98 */ void *field_0xD98; /* 0xD9C */ u8 _0xD9C[0xDA0 - 0xD9C]; /* 0xDA0 */ void *field_0xDA0; - /* 0xDA4 */ u8 _0xDA4[0xDB0 - 0xDA4]; + /* 0xDA4 */ u8 _0xDA4[0xDA8 - 0xDA4]; + /* 0xDA8 */ UNKWORD field_0xDA8; + /* 0xDAC */ u8 _0xDAC[0xDB0 - 0xDAC]; /* 0xDB0 */ f32 mScreenShakeIntensity; }; diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 44b2a0c9..63222b91 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -7,11 +7,14 @@ #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_map_capture.h" #include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" #include "egg/core/eggColorFader.h" #include "m/m2d.h" #include "m/m_angle.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_bounding.h" +#include "nw4r/lyt/lyt_group.h" #include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" #include "toBeSorted/d_flow_mgr.h" @@ -29,7 +32,7 @@ struct dMapSaveObjDefinition { /** Something for making sure re-opening the map opens it in a similar state as when it was last closed */ struct dMapSavedDataEntry { /* 0x00 */ s32 mapMode; - /* 0x04 */ u8 mapUpDirection; + /* 0x04 */ bool mapUpDirection; /* 0x05 */ u8 field_0x05; /* 0x06 */ u8 field_0x06; }; @@ -342,6 +345,7 @@ private: // Size 0x4C class dLytMapPopupInfo_c { + friend class dLytMapMain_c; public: dLytMapPopupInfo_c() : mStateMgr(*this, sStateID::null) {} @@ -464,12 +468,15 @@ private: }; // TODO, name made up -class dLytMapDecoration_c { +class dLytMapDecoration_c : public m2d::Base_c { public: dLytMapDecoration_c() {} virtual ~dLytMapDecoration_c() {} + virtual void draw() override; + virtual void build(d2d::ResAccIf_c *resAcc); void setIslandNamesOn(bool on); + void fn_80189B90(); }; /** 2D UI - Map - beacon preview icon following the cursor */ @@ -563,6 +570,14 @@ private: f32 fn_80142D90(s32); void fn_80142F00(mVec3_c &, s32 mapMode, u8, const mVec3_c &, const mAng &); void fn_8013FB70(const mVec3_c &, f32); + bool fn_80141530() const; + bool fn_80142D10(s32, bool, mAng &); + void fn_80143060(mVec3_c &, const mVec3_c &, const mVec3_c &, const mAng &); + void fn_80140B90(); + void fn_80143300(); + void fn_80143120(s32); + void fn_80138D80(); + bool shouldDrawFootprints() const; void zoomOut(); void zoomIn(); @@ -576,10 +591,14 @@ private: static dMapSavedData sSavedMapData; static const dMapSavedData sDefaultMapData; + bool isSomeFieldEq0Or1Or7Or9Or11() const { + return field_0x8C94 == 0 || field_0x8C94 == 1 || field_0x8C94 == 7 || field_0x8C94 == 9 || field_0x8C94 == 11; + } + /* 0x0010 */ UI_STATE_MGR_DECLARE(dLytMapMain_c); /* 0x004C */ dFlowMgrBase_c mFlowMgr; /* 0x00A4 */ dFlow_c mFlow; - /* 0x0108 */ u8 _0x0108[0x010C - 0x0108]; + /* 0x0108 */ UNKWORD field_0x0108; /* 0x010C */ d2d::LytBase_c mLyt; /* 0x019C */ d2d::AnmGroup_c mAnmGroups[54]; /* 0x0F1C */ LytMap0x80520B5C field_0xF1C; @@ -589,7 +608,7 @@ private: /* 0x2060 */ dLytMapDecoration_c field_0x2060; - /* 0x2064 */ u8 _0x2064[0x64C0 - 0x2064]; + /* 0x2070 */ u8 _0x2070[0x64C0 - 0x2070]; /* 0x64C0 */ dLytMapFootPrints_c mFootPrints; @@ -598,23 +617,39 @@ private: /* 0x79C4 */ dLytMapSaveCaption_c mSaveCaption; /* 0x7BD0 */ dLytMapSavePopup_c mSavePopup; /* 0x807C */ dLytMapPopupInfo_c mPopupInfo; - - /* 0x8208 */ u8 _0x8208[0x821C - 0x8208]; - + /* 0x8208 */ dTextBox_c *mpNumberTextBox; + /* 0x820C */ dTextBox_c *mpNumberTextBoxS; + /* 0x8210 */ nw4r::lyt::Pane *mpNoroshiPane; + /* 0x8214 */ nw4r::lyt::Pane *mpScaleFlamePane; + /* 0x8218 */ dWindow_c *mpWakuWindow; /* 0x821C */ nw4r::lyt::Bounding *field_0x821C[10]; /* 0x8244 */ nw4r::lyt::Bounding *field_0x8244[6]; /* 0x825C */ nw4r::lyt::Bounding *field_0x825C[12]; /* 0x828C */ mVec3_c field_0x828C[12]; - /* 0x831C */ u8 _0x831C[0x832C - 0x831C]; + /* 0x831C */ u8 _0x831C[0x8328 - 0x831C]; + + /* 0x8328 */ d2d::AnmGroup_c *mpOutAnmGroup; // TODO - it appears the map abuses these hit check things // to calculate Lyt bounding boxes, and it stores the // results in 0x8948... - /* 0x832C */ dCursorHitCheckLyt_c field_0x832C[33]; + /* 0x832C */ dCursorHitCheckLyt_c mHitChecks[33]; - /* 0x8854 */ u8 _0x8854[0x8904 - 0x8854]; + /* 0x8854 */ nw4r::lyt::Pane *mpPanes[11]; + /* 0x8880 */ u8 _0x8880[0x88B0 - 0x8880]; + + /* 0x88B0 */ nw4r::lyt::Pane *mpUnkPanes1[7]; + /* 0x88CC */ nw4r::lyt::Pane *mpUnkPanes2[7]; + + /* 0x88E8 */ nw4r::lyt::Pane *mpPaneBgAll01; + /* 0x88EC */ nw4r::lyt::Pane *mpPaneBgAll02; + /* 0x88F0 */ nw4r::lyt::Pane *mpPaneAll01; + /* 0x88F4 */ nw4r::lyt::Pane *mpPaneAll02; + /* 0x88F8 */ nw4r::lyt::Pane *mpPaneRotate00; + /* 0x88FC */ nw4r::lyt::Pane *mpPaneRotate01; + /* 0x8900 */ nw4r::lyt::Pane *mpAllPane; /* 0x8904 */ mVec3_c field_0x8904; /* 0x8910 */ mVec3_c field_0x8910; /* 0x891C */ mVec3_c field_0x891C; @@ -627,13 +662,15 @@ private: /* 0x8C60 */ s32 mMaxBeaconCount; /* 0x8C64 */ s32 field_0x8C64; /* 0x8C68 */ s32 field_0x8C68; - /* 0x8C6C */ UNKWORD field_0x8C6C; + /* 0x8C70 */ u32 field_0x8C70; - /* 0x8C70 */ u8 _0x8C70[0x8C90 - 0x8C70]; + /* 0x8C74 */ u8 _0x8C74[0x8C88 - 0x8C74]; - /* 0x8C90 */ u8 field_0x8C90; - /* 0x8C91 */ u8 field_0x8C91; + /* 0x8C88 */ f32 field_0x8C88; + /* 0x8C8C */ f32 field_0x8C8C; + /* 0x8C90 */ bool mMapUpDirection; + /* 0x8C91 */ bool mNextMapUpDirection; /* 0x8C92 */ u8 field_0x8C92; /* 0x8C93 */ u8 field_0x8C93; /* 0x8C94 */ s32 field_0x8C94; @@ -642,12 +679,13 @@ private: /* 0x8CA0 */ u8 _0x8CA0[0x8CA4 - 0x8CA0]; - /* 0x8CA4 */ s32 field_0x8CA4; - /* 0x8CA8 */ s32 field_0x8CA8; + /* 0x8CA4 */ s32 mCurrentMapMode; + /* 0x8CA8 */ s32 mNextMapMode; /* 0x8CAC */ u8 field_0x8CAC; + /* 0x8CAD */ u8 field_0x8CAD; - /* 0x8CAD */ u8 _0x8CAC[0x8CBC - 0x8CAD]; + /* 0x8CAE */ u8 _0x8CAE[0x8CBC - 0x8CAE]; /* 0x8CBC */ nw4r::lyt::Bounding *mpMapBounding; /* 0x8CC0 */ bool field_0x8CC0; @@ -657,8 +695,8 @@ private: /* 0x8CDC */ mVec3_c field_0x8CDC; /* 0x8CE8 */ mVec3_c field_0x8CE8; /* 0x8CF4 */ mVec3_c field_0x8CF4; - /* 0x8D00 */ mVec3_c field_0x8D00; - /* 0x8D0C */ mVec3_c field_0x8D0C; + /* 0x8D00 */ mVec3_c mMapScroll; + /* 0x8D0C */ mVec3_c mPlayerPos; /* 0x8D18 */ mVec3_c field_0x8D18; /* 0x8D24 */ mVec3_c field_0x8D24; /* 0x8D30 */ mVec2_c field_0x8D30; @@ -679,13 +717,13 @@ private: /* 0x8D6B */ u8 field_0x8D6B; /* 0x8D6C */ UNKWORD field_0x8D6C; /* 0x8D70 */ UNKWORD field_0x8D70; - /* 0x8D74 */ u8 _0x8D74[0x8D78 - 0x8D74]; + /* 0x8D74 */ nw4r::lyt::Pane *mpZoomInOutPane; /* 0x8D78 */ f32 field_0x8D78; /* 0x8D7C */ f32 field_0x8D7C; /* 0x8D80 */ f32 field_0x8D80; /* 0x8D84 */ f32 field_0x8D84; /* 0x8D88 */ f32 field_0x8D88; - /* 0x8D8C */ u8 _0x8D8C[0x8D94 - 0x8D8C]; + /* 0x8D8C */ nw4r::lyt::Group *mpPriorityGroups[2]; /* 0x8D94 */ d2d::SubPaneList mSubpaneList; /* 0x8DA0 */ d2d::SubPaneListNode mSubpane; /* 0x8DB0 */ UNKWORD field_0x8DB0; diff --git a/include/d/lyt/d_lyt_map_capture.h b/include/d/lyt/d_lyt_map_capture.h index 723d8c16..6fe457d1 100644 --- a/include/d/lyt/d_lyt_map_capture.h +++ b/include/d/lyt/d_lyt_map_capture.h @@ -2,13 +2,13 @@ #define D_LYT_MAP_CAPTURE_H #include "common.h" +#include "nw4r/lyt/lyt_picture.h" #include "s/s_State.hpp" #include "s/s_StateID.hpp" class dLytMapCapture_c { public: - dLytMapCapture_c() :mStateMgr(*this, sStateID::null) { - field_0x040 = 0; + dLytMapCapture_c() :mStateMgr(*this, sStateID::null), mpPicture(nullptr) { field_0x070 = 0.0f; field_0x074 = 0.0f; mRenderRequest = false; @@ -23,11 +23,21 @@ public: STATE_FUNC_DECLARE(dLytMapCapture_c, RenderingWait); STATE_FUNC_DECLARE(dLytMapCapture_c, RenderingWaitStep2); + void renderRequest() { + mRenderRequest = true; + } + + void setPicture(nw4r::lyt::Picture *pic) { + mpPicture = pic; + } + + bool isBusyRendering() const; + private: void fn_8012D6F0(); /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapCapture_c); - /* 0x040 */ UNKWORD field_0x040; + /* 0x040 */ nw4r::lyt::Picture *mpPicture; /* 0x044 */ u8 _0x040[0x064 - 0x044]; /* 0x064 */ f32 field_0x064; /* 0x068 */ f32 field_0x068; diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index cd858428..64c29f52 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -24,22 +24,46 @@ public: return sInstance; } - const mVec3_c &getField_0x00() const { - return field_0x00; + const mVec3_c &getMapScroll() const { + return mMapScroll; + } + + void setMapScroll(const mVec3_c &v) { + mMapScroll = v; + } + + void setField_0x0C(const mVec2_c &v) { + field_0x0C = v; } const mVec2_c &getField_0x20() const { return field_0x20; } + void setField_0x20(const mVec2_c &v) { + field_0x20 = v; + } + void setField_0x28(const mVec2_c &v) { field_0x28 = v; } + void setMapRotationCenter(const mVec3_c &v) { + mMapRotationCenter = v; + } + const mVec3_c &getMapRotationCenter() const { return mMapRotationCenter; } + const mAng &getMapRotation() const { + return mMapRotation; + } + + void setMapRotation(const mAng &rot) { + mMapRotation = rot; + } + const mVec3_c &getPlayerPos() const { return mPlayerPosition; } @@ -64,10 +88,22 @@ public: return mZoomFrame; } + void setZoomFrame(f32 v) { + mZoomFrame = v; + } + + void setField_0x58(f32 v) { + field_0x58 = v; + } + f32 getField_0x44() const { return field_0x44; } + void setField_0x44(f32 v) { + field_0x44 = v; + } + s32 getFloor() const { return mFloor; } @@ -85,16 +121,16 @@ private: static dLytMapGlobal_c *sInstance; void projectOntoMap( - mVec2_c &result, const mVec3_c &position, const mVec3_c &v1, const mVec3_c &mapRotationCenter, const mAng &rot, - f32 f1, f32 f2 + mVec2_c &result, const mVec3_c &position, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter, + const mAng &rot, f32 f1, f32 f2 ) const; void unprojectFromMap( - mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &v2, + mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter, const mAng &rot, f32 f1, f32 f2 ) const; - /* 0x00 */ mVec3_c field_0x00; + /* 0x00 */ mVec3_c mMapScroll; /* 0x0C */ mVec2_c field_0x0C; /* 0x14 */ mVec3_c mMapRotationCenter; /* 0x20 */ mVec2_c field_0x20; @@ -111,7 +147,7 @@ private: /* 0x50 */ UNKWORD field_0x50; /* 0x54 */ u8 _0x54[0x56 - 0x54]; /* 0x56 */ mAng field_0x56; - /* 0x58 */ u8 _0x58[0x5C - 0x58]; + /* 0x58 */ f32 field_0x58; /* 0x5C */ s32 mCurrentMapMode; /* 0x60 */ s32 mNextMapMode; /* 0x64 */ f32 mZoomFrame; ///< 0.0f when zoomed out, 1.0f when zoomed in diff --git a/include/m/m2d.h b/include/m/m2d.h index 8be7f6da..c51b47dd 100644 --- a/include/m/m2d.h +++ b/include/m/m2d.h @@ -112,7 +112,7 @@ public: return mEndFrame; } -// There's at least 1 file where the obvious way of writing +// There are at least 2 files where the obvious way of writing // it seems to require accessing some members directly, without // inlines. I want to discourage direct access though, so // putting the ability behind an explicit define. We don't diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index c9a89c2c..6eda3f7d 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -19,6 +19,8 @@ public: static bool canSkipCurrentEvent(); static dAcBase_c *getMainActorInEvent(); + static void execute(); + static EventManager *sInstance; static bool isInEvent() { diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 0f5d0079..5054382d 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -1,7 +1,10 @@ +#define NEED_DIRECT_FRAMECTRL_ACCESS #include "d/lyt/d_lyt_map.h" +#include "c/c_lib.h" #include "common.h" #include "d/a/d_a_player.h" +#include "d/d_base.h" #include "d/d_cs_base.h" #include "d/d_cs_game.h" #include "d/d_cursor_hit_check.h" @@ -18,6 +21,7 @@ #include "d/lyt/d_lyt_map_global.h" #include "d/lyt/d_textbox.h" #include "d/lyt/d_window.h" +#include "d/lyt/meter/d_lyt_meter.h" #include "d/lyt/msg_window/d_lyt_msg_window.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "egg/core/eggColorFader.h" @@ -31,6 +35,7 @@ #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" #include "toBeSorted/d_beacon.h" +#include "toBeSorted/event_manager.h" struct dLytMap_HIO_c { dLytMap_HIO_c(); @@ -1938,9 +1943,9 @@ dLytMapMain_c::dLytMapMain_c() #pragma dont_inline reset dLytMapMain_c::~dLytMapMain_c() { - for (int i = 0; i < (int)ARRAY_LENGTH(field_0x832C); i++) { - if (dCsMgr_c::GetInstance()->isRegist(&field_0x832C[i])) { - dCsMgr_c::GetInstance()->unregistCursorTarget(&field_0x832C[i]); + for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { + if (dCsMgr_c::GetInstance()->isRegist(&mHitChecks[i])) { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mHitChecks[i]); } } } @@ -2117,6 +2122,36 @@ static const d2d::LytBrlanMapping sMapMainBrlanMap[] = { }; #define MAP_MAIN_ANIM_IN 0 +#define MAP_MAIN_ANIM_TITLE_ON_OFF 1 +#define MAP_MAIN_ANIM_N_ON_OFF 2 +#define MAP_MAIN_ANIM_MAP_V 3 +#define MAP_MAIN_ANIM_WORLD_STATE 4 +#define MAP_MAIN_ANIM_PLAYER_2_PATTERN 5 +#define MAP_MAIN_ANIM_ROTATE 6 +#define MAP_MAIN_ANIM_OUT 7 +#define MAP_MAIN_ANIM_DRAW_PLAIN 8 +#define MAP_MAIN_ANIM_DRAW_FOREST 9 +#define MAP_MAIN_ANIM_DRAW_N_FOREST 10 +#define MAP_MAIN_ANIM_DRAW_S_VOLCANO 11 +#define MAP_MAIN_ANIM_DRAW_MINE 12 +#define MAP_MAIN_ANIM_DRAW_DESERT 13 +#define MAP_MAIN_ANIM_DRAW_LAKE 14 +#define MAP_MAIN_ANIM_DRAW_GLEN_00 15 +#define MAP_MAIN_ANIM_DRAW_SEA 16 +#define MAP_MAIN_ANIM_DRAW_N_VOLCANO 17 +#define MAP_MAIN_ANIM_DRAW_GLEN_01 18 +#define MAP_MAIN_ANIM_SKYLOFT_UP_DOWN 19 +#define MAP_MAIN_ANIM_LINK_POSITION_LIGHT 20 + +#define MAP_MAIN_ANIM_SUN_ROTE 45 +#define MAP_MAIN_ANIM_IN_NO_CAM 46 +#define MAP_MAIN_ANIM_OUT_NO_CAM 47 +#define MAP_MAIN_ANIM_CLOUD_LOOK 48 +#define MAP_MAIN_ANIM_LIGHT_LOOP 49 +#define MAP_MAIN_ANIM_NUSHI_LOOP 50 +#define MAP_MAIN_ANIM_TYPE 51 +#define MAP_MAIN_ANIM_KUMO_PATTERN 52 +#define MAP_MAIN_ANIM_TITE_LINE 53 static const char *sGroupName = "G_ref_00"; @@ -2129,6 +2164,24 @@ static const char *sBoundingNames[] = { "B_saveIcon_25", "B_saveIcon_26", "B_saveIcon_27", }; +static const char *sPaneNames[] = { + "N_pName_00", "N_fName_00", "N_nFname_00", "N_sVname_00", "N_dName_02", "N_dName_00", + "N_lName_00", "N_gName_02", "N_gName_01", "N_nVname_00", "N_gName_00", +}; + +static const char *sPaneNamesUnk1[] = { + "N_fD1_00", "N_vD1_00", "N_dD1_00", "N_fD2_00", "N_dD2_00", "N_vD2_00", "N_lastD_00", +}; + +static const char *sPaneNamesUnk2[] = { + "P_fD1_00", "P_vD1_00", "P_dD1_00", "P_fD2_00", "P_dD2_00", "P_vD2_00", "P_lastD_00", +}; + +static const char *sPriorityGroupNames[] = { + "G_priority_00", + "G_priority_02", +}; + void dLytMapMain_c::build() { field_0x8DBF = 0; field_0x8DB0 = 0; @@ -2141,8 +2194,7 @@ void dLytMapMain_c::build() { d2d::ResAccIf_c *resAcc = dLytMap_c::getResAcc(); mLyt.setResAcc(resAcc); mLyt.build("map_00.brlyt", nullptr); - mVec2_c scale = mLyt.getDrawInfo().GetLocationAdjustScale(); - getGlobal()->setField_0x28(scale); + getGlobal()->setField_0x28(mLyt.getDrawInfo().GetLocationAdjustScale()); // TODO define for (int i = 0; i < 54; i++) { @@ -2155,6 +2207,7 @@ void dLytMapMain_c::build() { d2d::dSubPane::linkMeters(mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName), &mSubpaneList); mFootPrints.build(resAcc); + field_0x2060.build(resAcc); mPinIconAggregate.build(resAcc); mPutIcon.build(resAcc); @@ -2182,20 +2235,149 @@ void dLytMapMain_c::build() { field_0x825C[i - 21] = b; } - field_0x832C[i].init(b, 0x02, 2, 0); - dCsMgr_c::GetInstance()->registCursorTarget(&field_0x832C[i]); + mHitChecks[i].init(b, 0x02, 2, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mHitChecks[i]); } for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) { - field_0x832C[i].resetCachedHitboxes(); - field_0x832C[i].execute(); + mHitChecks[i].resetCachedHitboxes(); + mHitChecks[i].execute(); } mpMapBounding = mLyt.findBounding("B_map_00"); - mpMapBounding->SetScale(mVec2_c(1.0f, 1.0f)); + nw4r::lyt::Size t(1.0f, 1.0f); + mpMapBounding->SetSize(t); + mVec3_c boundingPos = mpMapBounding->GetTranslate(); + mVec2_c boundingPos2 = mVec2_c(boundingPos.x, boundingPos.y); + dLytMapGlobal_c *global = getGlobal(); + global->setField_0x20(boundingPos2); + + mMapCapture.setPicture(mLyt.findPicture("P_map_00")); + nw4r::lyt::Pane *limitBounding = mLyt.findPane("B_limit_00"); + const nw4r::lyt::Size &sz = limitBounding->GetSize(); + field_0x8D30.x = sz.width - 1.0f; + field_0x8D30.y = sz.height - 1.0f; + field_0x8D38.x = sz.width; + field_0x8D38.y = sz.height; + field_0x8D38.x *= mLyt.getDrawInfo().GetLocationAdjustScale().x; + mpAllPane = mLyt.findPane("N_all_00"); + mpNoroshiPane = mLyt.findPane("N_noroshi_00"); + mpScaleFlamePane = mLyt.findPane("N_scaleFlame_00"); + mpWakuWindow = mLyt.getWindow("W_waku_01"); + + for (int i = 0; i < (int)ARRAY_LENGTH(sPaneNames); i++) { + if (sPaneNames[i] != nullptr) { + mpPanes[i] = mLyt.findPane(sPaneNames[i]); + } else { + mpPanes[i] = nullptr; + } + } + + for (int i = 0; i < (int)ARRAY_LENGTH(sPaneNamesUnk1); i++) { + if (sPaneNamesUnk1[i] != nullptr) { + mpUnkPanes1[i] = mLyt.findPane(sPaneNamesUnk1[i]); + } else { + mpUnkPanes1[i] = nullptr; + } + + if (sPaneNamesUnk2[i] != nullptr) { + mpUnkPanes2[i] = mLyt.findPane(sPaneNamesUnk2[i]); + } else { + mpUnkPanes2[i] = nullptr; + } + } + + mpNumberTextBox = mLyt.getTextBox("T_number_00"); + mpNumberTextBoxS = mLyt.getTextBox("T_numberS_00"); + mpZoomInOutPane = mLyt.findPane("N_zoomInOut_00"); + + for (int i = 0; i < (int)ARRAY_LENGTH(sPriorityGroupNames); i++) { + mpPriorityGroups[i] = mLyt.findGroupByName(sPriorityGroupNames[i]); + } + + // TODO + ((mVec2_c*)(_0x2070 + 0x6E4))->set(boundingPos2.x, boundingPos2.y); + + mPinIconAggregate.setUnk(&field_0xF1C); + + mpPaneBgAll01 = mLyt.findPane("N_mapBgAll_01"); + mpPaneBgAll02 = mLyt.findPane("N_mapBgAll_02"); + mpPaneAll01 = mLyt.findPane("N_mapAll_01"); + mpPaneAll02 = mLyt.findPane("N_mapAll_02"); + field_0x8928.x = mpPaneBgAll01->GetGlobalMtx()._03; + field_0x8928.y = mpPaneBgAll01->GetGlobalMtx()._13; + mpPaneRotate00 = mLyt.findPane("N_rotateP_00"); + mpPaneRotate01 = mLyt.findPane("N_rotateP_01"); + + nw4r::lyt::Pane *bgAll = mLyt.findPane("N_mapBgAll_00"); + + mVec2_c v1(bgAll->GetGlobalMtx()._03, bgAll->GetGlobalMtx()._13); + mVec2_c tmp = v1 - global->getField_0x20(); + global->setField_0x0C(tmp); + + field_0x8C88 = mAnmGroups[MAP_MAIN_ANIM_IN].getFrameCtrl()->mEndFrame - 1.0f; + mAnmGroups[MAP_MAIN_ANIM_IN].unbind(); + + mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false); + field_0x8C8C = mAnmGroups[MAP_MAIN_ANIM_OUT].getLastFrame(); + mAnmGroups[MAP_MAIN_ANIM_OUT].unbind(); + field_0x8CAC = 0; + field_0x8DB8 = getMaxBeaconCount(); + mStateMgr.changeState(StateID_Invisible); + getGlobal()->setFloor(0); + mNavEnabled = false; + field_0x8D58 = 0; + field_0x8D5C = 1; + field_0x8D60 = 0; + field_0x8D64 = 0; + fn_80143300(); } -void dLytMapMain_c::draw() {} +void dLytMapMain_c::draw() { + if (!field_0x8DBF) { + return; + } + + dLytMapGlobal_c *global = getGlobal(); + fn_80143120(1); + mLyt.draw(); + if (shouldDrawFootprints() && field_0x8D58 == global->getFloor()) { + mFootPrints.draw(); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM || mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + field_0x2060.draw(); + } + + if (field_0x8C68 != 3 && field_0x8C68 != 5 && field_0x8C94 != 2) { + mPinIconAggregate.draw(); + } + + fn_80143120(0); + + if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) && (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { + mpZoomInOutPane->SetVisible(false); + } else { + mpZoomInOutPane->SetVisible(true); + } + + mpScaleFlamePane->SetVisible(field_0x8DB5 ? true : false); + mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo()); + if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && field_0x8C94 == 10) { + fn_80138D80(); + } + fn_80143120(-2); + field_0x2060.fn_80189B90(); + mPutIcon.draw(); + if (field_0x8C94 == 10) { + mPopupInfo.draw(); + } + + if (*mStateMgr.getStateID() == StateID_EventSaveObjSelect) { + mSavePopup.draw(); + } + mSaveCaption.draw(); +} void dLytMap_c::build() { d2d::setLytAllocator(); @@ -2215,8 +2397,8 @@ void lytMapusesSizedWString() { void dLytMapMain_c::saveUnkMapData() { dMapSavedDataEntry &data = sSavedMapData.entries[field_0x8C68]; data.field_0x06 = 1; - data.mapMode = field_0x8CA4; - data.mapUpDirection = field_0x8C90; + data.mapMode = mCurrentMapMode; + data.mapUpDirection = mMapUpDirection; data.field_0x05 = field_0x8C92; sSavedMapData.islandNamesOn = mIslandNamesOn; } @@ -2232,8 +2414,8 @@ void dLytMapMain_c::initUnkMapData() { } void dLytMapMain_c::loadUnkMapData() { - field_0x8CA4 = sSavedMapData.entries[field_0x8C68].mapMode; - field_0x8C90 = sSavedMapData.entries[field_0x8C68].mapUpDirection; + mCurrentMapMode = sSavedMapData.entries[field_0x8C68].mapMode; + mMapUpDirection = sSavedMapData.entries[field_0x8C68].mapUpDirection; field_0x8C92 = sSavedMapData.entries[field_0x8C68].field_0x05; mIslandNamesOn = sSavedMapData.islandNamesOn; } @@ -2258,8 +2440,8 @@ void dLytMapMain_c::executeState_Active() { } // TODO figure out and double check numbers - if (field_0x8C68 == 4 && field_0x8CA4 == dLytMapGlobal_c::MAPMODE_STAGE && - field_0x8CA8 == dLytMapGlobal_c::MAPMODE_STAGE && dPad::getDownTrigZ()) { + if (field_0x8C68 == 4 && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && dPad::getDownTrigZ()) { if (mIslandNamesOn) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_OFF); } else { @@ -2270,7 +2452,7 @@ void dLytMapMain_c::executeState_Active() { } checkScroll(); - if (needsNav(field_0x8CA4) && needsNav(field_0x8CA8)) { + if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode)) { if (!mNavEnabled) { dPadNav::setNavEnabled(true, false); mNavEnabled = true; @@ -2288,7 +2470,7 @@ void dLytMapMain_c::executeState_Active() { } } - if (field_0x8CA4 == dLytMapGlobal_c::MAPMODE_STAGE && field_0x8CA8 == dLytMapGlobal_c::MAPMODE_STAGE && + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(dLytMapGlobal_c::MAPMODE_STAGE)) { if (field_0x8CC0 && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { const mVec3_c &pos = global->getPlayerPos(); @@ -2316,18 +2498,20 @@ void dLytMapMain_c::executeState_Active() { setBeaconPositionChecked(&pos3d, id); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_SET); } - } else if ((dPad::getDownTrigLeft() && canZoomOut(field_0x8CA4)) || - (dPad::getDownTrigA() && field_0x8CA4 == dLytMapGlobal_c::MAPMODE_ZOOM && canZoomOut(field_0x8CA4))) { + } else if ((dPad::getDownTrigLeft() && canZoomOut(mCurrentMapMode)) || + (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && canZoomOut(mCurrentMapMode) + )) { zoomOut(); - } else if ((dPad::getDownTrigRight() && canZoomIn(field_0x8CA4)) || - (dPad::getDownTrigA() && field_0x8CA4 == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(field_0x8CA4))) { + } else if ((dPad::getDownTrigRight() && canZoomIn(mCurrentMapMode)) || + (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(mCurrentMapMode) + )) { zoomIn(); } else if ((field_0x8C68 == dLytMapGlobal_c::MAPMODE_WORLD || field_0x8C68 == dLytMapGlobal_c::MAPMODE_PROVINCE || field_0x8C68 == dLytMapGlobal_c::MAPMODE_WORLD_SKY || field_0x8C68 == dLytMapGlobal_c::MAPMODE_ZOOM) && - canResetPosition(field_0x8CA4, field_0x8C90) && dPad::getDownTrigUp()) { + canResetPosition(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigUp()) { mVec3_c pos; - fn_80142F00(pos, field_0x8CA4, field_0x8C90, global->getMapRotationCenter(), global->getField_0x56()); - f32 distSq = global->getField_0x00().squareDistanceToXZ(pos); + fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + f32 distSq = global->getMapScroll().squareDistanceToXZ(pos); if (field_0x8D58 != global->getFloor()) { mFloorBtnMgr.resetFloor(-(field_0x8D58 - field_0x8D60)); global->setFloor(field_0x8D58); @@ -2337,42 +2521,297 @@ void dLytMapMain_c::executeState_Active() { } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_NOT_MOVE); } - } else if (canChangeUpDirection(field_0x8CA4, field_0x8C90) && dPad::getDownTrigZ()) { + } else if (canChangeUpDirection(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigZ()) { mStateMgr.changeState(StateID_ChgMapUpDirection); } - if ((field_0x8CA4 == dLytMapGlobal_c::MAPMODE_STAGE && field_0x8CA8 == dLytMapGlobal_c::MAPMODE_STAGE) || - (field_0x8CA4 == dLytMapGlobal_c::MAPMODE_ZOOM && field_0x8CA8 == dLytMapGlobal_c::MAPMODE_ZOOM)) { + if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || + (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { field_0xF1C.field_0x05 = true; } mPinIconAggregate.execute(); - for (int idx = 0; idx < (int)ARRAY_LENGTH(field_0x832C); idx++) { - field_0x832C[idx].resetCachedHitboxes(); - field_0x832C[idx].execute(); + for (int idx = 0; idx < (int)ARRAY_LENGTH(mHitChecks); idx++) { + mHitChecks[idx].resetCachedHitboxes(); + mHitChecks[idx].execute(); } } -void dLytMapMain_c::finalizeState_Active() {} +void dLytMapMain_c::finalizeState_Active() { + field_0x8DB5 = false; +} -void dLytMapMain_c::initializeState_Out() {} -void dLytMapMain_c::executeState_Out() {} +void dLytMapMain_c::initializeState_Out() { + if (field_0x8C94 == 10) { + mPopupInfo.mStateMgr.changeState(StateID_Out); + } + dLytMeter_c::GetInstance()->setMeterField_0x13750(0); + if (field_0x8CAD || field_0x8C94 == 3) { + mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT]; + } else { + mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM]; + } + + mpOutAnmGroup->bind(false); + mpOutAnmGroup->setFrame(0.0f); + field_0x8C8C = mpOutAnmGroup->getLastFrame(); + + if (fn_80141530()) { + dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; + } + + dPadNav::setNavEnabled(false, false); +} +void dLytMapMain_c::executeState_Out() { + if (mpOutAnmGroup->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(); + field_0x8DBF = 0; + mStateMgr.changeState(StateID_Invisible); + } + } + + if (mpOutAnmGroup->isBound()) { + mpOutAnmGroup->play(); + } +} void dLytMapMain_c::finalizeState_Out() {} -void dLytMapMain_c::initializeState_FloorChange() {} -void dLytMapMain_c::executeState_FloorChange() {} +void dLytMapMain_c::initializeState_FloorChange() { + mMapCapture.renderRequest(); +} +void dLytMapMain_c::executeState_FloorChange() { + if (!mMapCapture.isBusyRendering()) { + mStateMgr.changeState(StateID_Active); + dPadNav::stopFSStickNav(); + } +} void dLytMapMain_c::finalizeState_FloorChange() {} -void dLytMapMain_c::initializeState_ChgMapUpDirection() {} -void dLytMapMain_c::executeState_ChgMapUpDirection() {} +void dLytMapMain_c::initializeState_ChgMapUpDirection() { + mNextMapUpDirection = !mMapUpDirection; + field_0x8D44 = getGlobal()->getMapRotation(); + + if (field_0x8C94 == 3) { + field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000); + mNextMapUpDirection = false; + } else { + fn_80142D10(mCurrentMapMode, mNextMapUpDirection, field_0x8D46); + } + (void)getGlobal(); + dLytMapGlobal_c *global = getGlobal(); + mPlayerPos = global->getPlayerPos(); + mVec2_c v(0.0f, 0.0f); + global->unprojectFromMap(mMapScroll, v, field_0x8D44); + global->setMapRotationCenter(mPlayerPos); + const mVec3_c ¢er = global->getMapRotationCenter(); + fn_80143060(mPlayerPos, mPlayerPos, center, field_0x8D46); + fn_80143060(mMapScroll, mMapScroll, center, field_0x8D44); + global->setMapScroll(mMapScroll); + field_0x8C70 = 0; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_CHANGE_DIRECT); +} +void dLytMapMain_c::executeState_ChgMapUpDirection() { + if (field_0x8C94 == 3 && field_0x8D6A) { + fn_80140B90(); + } else { + dLytMapGlobal_c *global = getGlobal(); + f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1B, 2.0f); + + // Lerps + + // TODO stack and reg swaps + global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); + + mVec3_c actualPos = (mPlayerPos - mMapScroll) * factor + mMapScroll; + global->setMapScroll(actualPos); + + if (field_0x8C70 >= sHio.field_0x1B) { + mLyt.calc(); + mMapUpDirection = mNextMapUpDirection; + if (field_0x8C94 == 3) { + mStateMgr.changeState(StateID_EventMapIntro_Step4); + } else { + mStateMgr.changeState(StateID_Active); + } + } else { + field_0x8C70++; + } + + if (field_0x8C94 == 3) { + EventManager::execute(); + } + } +} void dLytMapMain_c::finalizeState_ChgMapUpDirection() {} -void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() {} -void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() {} +void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() { + dLytMapGlobal_c *global = getGlobal(); + mMapScroll = global->getMapScroll(); + field_0x8D50 = global->getField_0x44(); + field_0x8D44 = global->getMapRotation(); + + field_0x8D4C = fn_80142D90(mNextMapMode); + if (field_0x8C94 == 3) { + field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000); + mNextMapUpDirection = false; + } else { + mNextMapUpDirection = fn_80142D10(mNextMapMode, mNextMapUpDirection, field_0x8D46); + } + + fn_80142F00(mPlayerPos, mNextMapMode, mNextMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + field_0x8C70 = 0; + + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + global->setZoomFrame(1.0f); + global->setField_0x58(field_0x8D50 / field_0x8D4C); + } else { + global->setZoomFrame(0.0f); + global->setField_0x58(1.0f); + } + + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && !mNextMapUpDirection) { + mVec2_c v(0.0f, 0.0f); + global->unprojectFromMap(mMapScroll, v, field_0x8D44); + mVec3_c v2 = mPlayerPos; + global->setMapRotationCenter(v2); + dLytMapGlobal_c *global2 = getGlobal(); + const mVec3_c ¢er = global2->getMapRotationCenter(); + fn_80143060(mPlayerPos, v2, center, field_0x8D46); + mVec3_c v3 = mMapScroll; + fn_80143060(mMapScroll, v3, center, field_0x8D44); + mVec3_c v4 = mMapScroll; + global2->setMapScroll(v4); + } else { + mVec2_c v(0.0f, 0.0f); + global->unprojectFromMap(mMapScroll, v, field_0x8D44); + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mPlayerPos = field_0x8CC4; + } else { + mPlayerPos = global->getPlayerPos(); + } + + global->setMapRotationCenter(mMapScroll); + mVec3_c v2 = mPlayerPos; + dLytMapGlobal_c *global2 = getGlobal(); + const mVec3_c ¢er = global2->getMapRotationCenter(); + fn_80143060(mPlayerPos, v2, center, field_0x8D46); + mVec3_c v3 = mMapScroll; + fn_80143060(mMapScroll, v3, center, field_0x8D44); + mVec3_c v4 = mMapScroll; + global2->setMapScroll(v4); + } + + mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false); + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + field_0x2060.setIslandNamesOn(false); + } + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + field_0x2060.setIslandNamesOn(mIslandNamesOn); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mVec2_c v(global->getField_0x20().x, global->getField_0x20().y); + global->unprojectFromMap(field_0x8CF4, v); + } +} +void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { + if (field_0x8C94 == 3 && field_0x8D6A) { + fn_80140B90(); + } else { + dLytMapGlobal_c *global = getGlobal(); + f32 f1 = (f32)field_0x8C70 / sHio.field_0x1B; + f32 factor = cLib::easeInOut(f1, 2.0f); + + f32 f2, f3; + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + f32 ratio = field_0x8D50 / field_0x8D4C; + f1 = 1.0f - f1; + f2 = ratio + (1.0f - ratio) * factor; + f3 = 1.0f - factor; + } else { + f32 ratio = field_0x8D4C / field_0x8D50; + f2 = ratio + (1.0f - ratio) * (1.0f - factor); + f3 = factor; + } + global->setZoomFrame(f1); + global->setField_0x58(f2); + + // TODO - there is tons of dead code here + + // Lerps + f32 f4 = field_0x8D50 + factor * (field_0x8D4C - field_0x8D50); + global->setField_0x44(f4); + + // TODO stack and reg swaps + global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); + + mVec3_c actualPos; + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + actualPos = (mPlayerPos - mMapScroll) * (1.0f - factor) * (1.0f / (f4 / field_0x8D50)) + mMapScroll; + } else { + actualPos = (mPlayerPos - mMapScroll) * (1.0f - factor) * (1.0f / (f4 / field_0x8D50)) + mMapScroll; + } + + global->setMapScroll(actualPos); + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + fn_8013FB70(field_0x8CF4, f4 / field_0x8D50); + field_0x8DB5 = true; + } + + // TODO dead code + f32 length = mAnmGroups[MAP_MAIN_ANIM_ROTATE].getLastFrame(); + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(length - f3 * length); + + if (field_0x8C70 >= sHio.field_0x1C) { + if (field_0x8C94 == 3 && field_0x0108 > 0) { + field_0x0108--; + } else { + field_0x8DB5 = false; + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind(); + field_0x8DB5 = false; + mMapUpDirection = mNextMapUpDirection; + global->setMapRotation(field_0x8D46); + global->setField_0x44(field_0x8D4C); + global->setMapScroll(mPlayerPos); + + if (field_0x8C94 == 3) { + mStateMgr.changeState(StateID_EventMapIntro_Step4); + } else { + mStateMgr.changeState(StateID_Active); + mCurrentMapMode = mNextMapMode; + } + } + } else { + field_0x8C70++; + } + if (field_0x8C94 == 3) { + EventManager::execute(); + } + } +} void dLytMapMain_c::finalizeState_ChgDispAreaMode_MapRot() {} void dLytMapMain_c::initializeState_ChgDispAreaMode_Map() {} -void dLytMapMain_c::executeState_ChgDispAreaMode_Map() {} +void dLytMapMain_c::executeState_ChgDispAreaMode_Map() { + // Won't attempt this until the dead code in executeState_ChgDispAreaMode_MapRot is solved +} void dLytMapMain_c::finalizeState_ChgDispAreaMode_Map() {} void dLytMapMain_c::initializeState_ChgDispAreaMode_WA() {} @@ -2383,8 +2822,27 @@ void dLytMapMain_c::initializeState_ChgDispAreaMode_CsrRot() {} void dLytMapMain_c::executeState_ChgDispAreaMode_CsrRot() {} void dLytMapMain_c::finalizeState_ChgDispAreaMode_CsrRot() {} -void dLytMapMain_c::initializeState_ResetPos() {} -void dLytMapMain_c::executeState_ResetPos() {} +void dLytMapMain_c::initializeState_ResetPos() { + dLytMapGlobal_c *global = getGlobal(); + field_0x8C70 = 0; + mMapScroll = global->getMapScroll(); + fn_80142F00(mPlayerPos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + field_0x8C70 = 0; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_START); +} +void dLytMapMain_c::executeState_ResetPos() { + dLytMapGlobal_c *global = getGlobal(); + f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1A, 2.0f); + mVec3_c pos = (mPlayerPos - mMapScroll) * factor + mMapScroll; + global->setMapScroll(pos); + dSndSmallEffectMgr_c::GetInstance()->holdSound(SE_S_MAP_RESET_LV); + if (field_0x8C70 >= sHio.field_0x1A) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_END); + mStateMgr.changeState(StateID_Active); + } else { + field_0x8C70++; + } +} void dLytMapMain_c::finalizeState_ResetPos() {} void dLytMapMain_c::initializeState_ResetPosWithFloorChange() {} diff --git a/src/d/lyt/d_lyt_map_global.cpp b/src/d/lyt/d_lyt_map_global.cpp index 057f6e8e..f09cd68e 100644 --- a/src/d/lyt/d_lyt_map_global.cpp +++ b/src/d/lyt/d_lyt_map_global.cpp @@ -5,7 +5,7 @@ dLytMapGlobal_c *dLytMapGlobal_c::sInstance; dLytMapGlobal_c::dLytMapGlobal_c() - : field_0x00(0.0f, 0.0f, 0.0f), + : mMapScroll(0.0f, 0.0f, 0.0f), field_0x0C(0.0f, 0.0f), mMapRotationCenter(0.0f, 0.0f, 0.0f), field_0x20(0.0f, 0.0f), @@ -23,7 +23,7 @@ dLytMapGlobal_c::dLytMapGlobal_c() } void dLytMapGlobal_c::projectOntoMap( - mVec2_c &result, const mVec3_c &position, const mVec3_c &v1, const mVec3_c &mapRotationCenter, const mAng &rot, + mVec2_c &result, const mVec3_c &position, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter, const mAng &rot, f32 f1, f32 f2 ) const { // Initializing like this fixes regswaps, even if it's not needed... @@ -34,8 +34,8 @@ void dLytMapGlobal_c::projectOntoMap( work.y = 0.0f; work.rotY(-rot); - work.x += mapRotationCenter.x - v1.x; - work.z += mapRotationCenter.z - v1.z; + work.x += mapRotationCenter.x - mapScroll.x; + work.z += mapRotationCenter.z - mapScroll.z; work.x *= f2 * f1; work.z *= f2 * f1; @@ -46,17 +46,17 @@ void dLytMapGlobal_c::projectOntoMap( } void dLytMapGlobal_c::projectOntoMap(mVec2_c &result, const mVec3_c &position) const { - projectOntoMap(result, position, field_0x00, mMapRotationCenter, mMapRotation, field_0x44, field_0x40); + projectOntoMap(result, position, mMapScroll, mMapRotationCenter, mMapRotation, field_0x44, field_0x40); } void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position) const { unprojectFromMap( - result, position, field_0x20, field_0x00, mMapRotationCenter, mMapRotation, field_0x44, field_0x40 + result, position, field_0x20, mMapScroll, mMapRotationCenter, mMapRotation, field_0x44, field_0x40 ); } void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const { - unprojectFromMap(result, position, field_0x20, field_0x00, mMapRotationCenter, rot, field_0x44, field_0x40); + unprojectFromMap(result, position, field_0x20, mMapScroll, mMapRotationCenter, rot, field_0x44, field_0x40); } void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mVec3_c &v2, const mAng &rot) @@ -65,7 +65,7 @@ void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, } void dLytMapGlobal_c::unprojectFromMap( - mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &v2, const mVec3_c &mapRotationCenter, + mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter, const mAng &rot, f32 f1, f32 f2 ) const { mVec3_c work(0.0f, 0.0f, 0.0f); @@ -77,7 +77,7 @@ void dLytMapGlobal_c::unprojectFromMap( work.x = diff.x * tmp * (1.0f / field_0x28.x); work.z = -diff.y * tmp; - work = work + v2; + work = work + mapScroll; work = work - mapRotationCenter; work.rotY(rot); From c9513165d6f7f41916c56bc65c24fa9bff569a71 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 5 Oct 2025 00:45:02 +0200 Subject: [PATCH 08/20] help --- config/SOUE01/symbols.txt | 108 +-- include/d/a/obj/d_a_obj_tbox.h | 8 + include/d/d_player_act.h | 2 + include/d/d_stage.h | 1 + include/d/lyt/d_lyt_map.h | 17 +- include/d/lyt/d_lyt_map_global.h | 7 +- include/d/lyt/d_lyt_map_markers.h | 298 ++++++++- include/m/m_angle.h | 4 + src/d/lyt/d_lyt_map.cpp | 15 +- src/d/lyt/d_lyt_map_markers.cpp | 1017 +++++++++++++++++++++++++++++ 10 files changed, 1399 insertions(+), 78 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 2bf566c0..3052cd3b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2484,7 +2484,7 @@ getLinkSoundRelated = .text:0x8005BDA0; // type:function size:0xC fn_8005BDB0 = .text:0x8005BDB0; // type:function size:0xE8 unsetRegionBasedFlagsMaybe = .text:0x8005BEA0; // type:function size:0x100 getEarringsColor__17daPlayerActBase_cFv = .text:0x8005BFA0; // type:function size:0xB0 -getLinkTunicSubtype = .text:0x8005C050; // type:function size:0xC +getCurrentTunicType__17daPlayerActBase_cFv = .text:0x8005C050; // type:function size:0xC getCurrentSwordType = .text:0x8005C060; // type:function size:0xAC updateCurrentSword__17daPlayerActBase_cFv = .text:0x8005C110; // type:function size:0x24 doesPlayerHaveSword = .text:0x8005C140; // type:function size:0x1C @@ -7759,21 +7759,21 @@ __dt__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFState __dt__64sFStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c>Fv = .text:0x801346D0; // type:function size:0xA4 __ct__16dLytMapPinIcon_cFv = .text:0x80134780; // type:function size:0x134 __dt__25dLytMapPinIconAggregate_cFv = .text:0x801348C0; // type:function size:0xCC -fn_80134990 = .text:0x80134990; // type:function size:0x464 -fn_80134E00 = .text:0x80134E00; // type:function size:0x74 -fn_80134E80 = .text:0x80134E80; // type:function size:0x10 -fn_80134E90 = .text:0x80134E90; // type:function size:0x40 -fn_80134ED0 = .text:0x80134ED0; // type:function size:0x4 -fn_80134EE0 = .text:0x80134EE0; // type:function size:0x40 -fn_80134F20 = .text:0x80134F20; // type:function size:0x10 -fn_80134F30 = .text:0x80134F30; // type:function size:0x40 -fn_80134F70 = .text:0x80134F70; // type:function size:0xBC -fn_80135030 = .text:0x80135030; // type:function size:0x4 -fn_80135040 = .text:0x80135040; // type:function size:0x40 -fn_80135080 = .text:0x80135080; // type:function size:0x74 -fn_80135100 = .text:0x80135100; // type:function size:0x108 -fn_80135210 = .text:0x80135210; // type:function size:0x234 -fn_80135450 = .text:0x80135450; // type:function size:0x78 +__ct__16dLytMapMarkers_cFv = .text:0x80134990; // type:function size:0x464 +__dt__14dLytMapPopup_cFv = .text:0x80134E00; // type:function size:0x74 +__ct__13MapUnkStruct1Fv = .text:0x80134E80; // type:function size:0x10 +__dt__13MapUnkStruct1Fv = .text:0x80134E90; // type:function size:0x40 +__ct__13MapUnkStruct2Fv = .text:0x80134ED0; // type:function size:0x4 +__dt__13MapUnkStruct2Fv = .text:0x80134EE0; // type:function size:0x40 +__ct__13MapUnkStruct3Fv = .text:0x80134F20; // type:function size:0x10 +__dt__13MapUnkStruct3Fv = .text:0x80134F30; // type:function size:0x40 +__dt__15dLytMapIcon01_cFv = .text:0x80134F70; // type:function size:0xBC +__ct__13MapUnkStruct4Fv = .text:0x80135030; // type:function size:0x4 +__dt__13MapUnkStruct4Fv = .text:0x80135040; // type:function size:0x40 +__dt__14dLytMapPlace_cFv = .text:0x80135080; // type:function size:0x74 +__dt__15dLytMapIcon00_cFv = .text:0x80135100; // type:function size:0x108 +__dt__16dLytMapMarkers_cFv = .text:0x80135210; // type:function size:0x234 +__dt__19dLytMapFootPrints_cFv = .text:0x80135450; // type:function size:0x78 __ct__16dLytMapPutIcon_cFv = .text:0x801354D0; // type:function size:0x54 __dt__16dLytMapPutIcon_cFv = .text:0x80135530; // type:function size:0x5C __ct__16dLytMapSaveObj_cFv = .text:0x80135590; // type:function size:0xC8 @@ -9907,31 +9907,31 @@ setInout__14dLytMapPopup_cFf = .text:0x801798A0; // type:function size:0x94 setInitialState__14dLytMapPopup_cFv = .text:0x80179940; // type:function size:0xD4 updateScale__14dLytMapPopup_cFv = .text:0x80179A20; // type:function size:0xF4 checkMapMode__14dLytMapPopup_cFv = .text:0x80179B20; // type:function size:0xAC -fn_80179BD0 = .text:0x80179BD0; // type:function size:0x234 -fn_80179E10 = .text:0x80179E10; // type:function size:0x58 -fn_80179E70 = .text:0x80179E70; // type:function size:0xBC -fn_80179F30 = .text:0x80179F30; // type:function size:0xA8 -fn_80179FE0 = .text:0x80179FE0; // type:function size:0xB4 -fn_8017A0A0 = .text:0x8017A0A0; // type:function size:0x3C +build__14dLytMapPlace_cFPQ23d2d10ResAccIf_c = .text:0x80179BD0; // type:function size:0x234 +remove__14dLytMapPlace_cFv = .text:0x80179E10; // type:function size:0x58 +execute__14dLytMapPlace_cFv = .text:0x80179E70; // type:function size:0xBC +draw__14dLytMapPlace_cFv = .text:0x80179F30; // type:function size:0xA8 +setLabel__14dLytMapPlace_cFPCc = .text:0x80179FE0; // type:function size:0xB4 +realize__14dLytMapPlace_cFv = .text:0x8017A0A0; // type:function size:0x3C fn_8017A0E0 = .text:0x8017A0E0; // type:function size:0x2A8 -fn_8017A390 = .text:0x8017A390; // type:function size:0x84 +setInout__14dLytMapPlace_cFf = .text:0x8017A390; // type:function size:0x84 fn_8017A420 = .text:0x8017A420; // type:function size:0x78 -fn_8017A4A0 = .text:0x8017A4A0; // type:function size:0x94 -fn_8017A540 = .text:0x8017A540; // type:function size:0x11C -fn_8017A660 = .text:0x8017A660; // type:function size:0xF4 -fn_8017A760 = .text:0x8017A760; // type:function size:0x78 -fn_8017A7E0 = .text:0x8017A7E0; // type:function size:0x78 -fn_8017A860 = .text:0x8017A860; // type:function size:0x138 -fn_8017A9A0 = .text:0x8017A9A0; // type:function size:0x688 -fn_8017B030 = .text:0x8017B030; // type:function size:0x70 -fn_8017B0A0 = .text:0x8017B0A0; // type:function size:0x2B8 -fn_8017B360 = .text:0x8017B360; // type:function size:0x704 -fn_8017BA70 = .text:0x8017BA70; // type:function size:0x4FC +setColor__14dLytMapPlace_cFUl = .text:0x8017A4A0; // type:function size:0x94 +setInitialState__14dLytMapPlace_cFv = .text:0x8017A540; // type:function size:0x11C +updateScale__14dLytMapPlace_cFv = .text:0x8017A660; // type:function size:0xF4 +realizeText__14dLytMapPlace_cFv = .text:0x8017A760; // type:function size:0x78 +realizeTextSize__14dLytMapPlace_cFv = .text:0x8017A7E0; // type:function size:0x78 +realizeBgSize__14dLytMapPlace_cFv = .text:0x8017A860; // type:function size:0x138 +build__15dLytMapIcon01_cFPQ23d2d10ResAccIf_c = .text:0x8017A9A0; // type:function size:0x688 +remove__15dLytMapIcon01_cFv = .text:0x8017B030; // type:function size:0x70 +execute__15dLytMapIcon01_cFv = .text:0x8017B0A0; // type:function size:0x2B8 +draw__15dLytMapIcon01_cFv = .text:0x8017B360; // type:function size:0x704 +resetDrawCommands__15dLytMapIcon01_cFv = .text:0x8017BA70; // type:function size:0x4FC setMapIcons = .text:0x8017BF70; // type:function size:0x2C8 -fn_8017C240 = .text:0x8017C240; // type:function size:0x98 +setLinkTunic__15dLytMapIcon01_cFl = .text:0x8017C240; // type:function size:0x98 fn_8017C2E0 = .text:0x8017C2E0; // type:function size:0xA0 fn_8017C380 = .text:0x8017C380; // type:function size:0xA0 -forGoddessStatueOnSkyFieldMap = .text:0x8017C420; // type:function size:0x74 +setGoddessStatue__15dLytMapIcon01_cFb = .text:0x8017C420; // type:function size:0x74 fn_8017C4A0 = .text:0x8017C4A0; // type:function size:0xA0 fn_8017C540 = .text:0x8017C540; // type:function size:0x1C fn_8017C560 = .text:0x8017C560; // type:function size:0x80 @@ -9949,16 +9949,16 @@ fn_8017CAF0 = .text:0x8017CAF0; // type:function size:0xC fn_8017CB00 = .text:0x8017CB00; // type:function size:0xC fn_8017CB10 = .text:0x8017CB10; // type:function size:0xC fn_8017CB20 = .text:0x8017CB20; // type:function size:0xC -fn_8017CB30 = .text:0x8017CB30; // type:function size:0xB8 -fn_8017CBF0 = .text:0x8017CBF0; // type:function size:0xB8 -fn_8017CCB0 = .text:0x8017CCB0; // type:function size:0xAC -fn_8017CD60 = .text:0x8017CD60; // type:function size:0xAC -fn_8017CE10 = .text:0x8017CE10; // type:function size:0x150 +drawWithAnimIn = .text:0x8017CB30; // type:function size:0xB8 +drawWithAnimOut = .text:0x8017CBF0; // type:function size:0xB8 +drawFullyIn = .text:0x8017CCB0; // type:function size:0xAC +checkMapMode__15dLytMapIcon01_cFv = .text:0x8017CD60; // type:function size:0xAC +setupActorDrawCommands__15dLytMapIcon01_cFv = .text:0x8017CE10; // type:function size:0x150 fn_8017CF60 = .text:0x8017CF60; // type:function size:0xFC -fn_8017D060 = .text:0x8017D060; // type:function size:0xF4 -fn_8017D160 = .text:0x8017D160; // type:function size:0x17C -fn_8017D2E0 = .text:0x8017D2E0; // type:function size:0xB4 -fn_8017D3A0 = .text:0x8017D3A0; // type:function size:0xB4 +setupTboxDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D060; // type:function size:0xF4 +setupTboxDrawCommandClosed__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D160; // type:function size:0x17C +setupTboxDrawCommandOpen__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D2E0; // type:function size:0xB4 +setupTboxDrawCommandGoddessClosed__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D3A0; // type:function size:0xB4 fn_8017D460 = .text:0x8017D460; // type:function size:0x3E4 fn_8017D850 = .text:0x8017D850; // type:function size:0x3F4 fn_8017DC50 = .text:0x8017DC50; // type:function size:0x398 @@ -9970,18 +9970,18 @@ fn_8017E9B0 = .text:0x8017E9B0; // type:function size:0xA20 fn_8017F3D0 = .text:0x8017F3D0; // type:function size:0x110 fn_8017F4E0 = .text:0x8017F4E0; // type:function size:0x1C0 fn_8017F6A0 = .text:0x8017F6A0; // type:function size:0x1D8 -fn_8017F880 = .text:0x8017F880; // type:function size:0xA8 +setupStageDrawCommands__15dLytMapIcon01_cFv = .text:0x8017F880; // type:function size:0xA8 fn_8017F930 = .text:0x8017F930; // type:function size:0x268 fn_8017FBA0 = .text:0x8017FBA0; // type:function size:0x954 fn_80180500 = .text:0x80180500; // type:function size:0x750 fn_80180C50 = .text:0x80180C50; // type:function size:0x1C8 fn_80180E20 = .text:0x80180E20; // type:function size:0x134 fn_80180F60 = .text:0x80180F60; // type:function size:0x240 -fn_801811A0 = .text:0x801811A0; // type:function size:0x50 +setupLinkDrawCommand__15dLytMapIcon01_cFv = .text:0x801811A0; // type:function size:0x50 fn_801811F0 = .text:0x801811F0; // type:function size:0x14C fn_80181340 = .text:0x80181340; // type:function size:0x1B8 fn_80181500 = .text:0x80181500; // type:function size:0xC8 -fn_801815D0 = .text:0x801815D0; // type:function size:0x130 +setupTriforceDrawCommands__15dLytMapIcon01_cFv = .text:0x801815D0; // type:function size:0x130 fn_80181700 = .text:0x80181700; // type:function size:0x178 fn_80181880 = .text:0x80181880; // type:function size:0xC4 fn_80181950 = .text:0x80181950; // type:function size:0x30 @@ -9989,7 +9989,7 @@ fn_80181980 = .text:0x80181980; // type:function size:0x64 fn_801819F0 = .text:0x801819F0; // type:function size:0xB0 fn_80181AA0 = .text:0x80181AA0; // type:function size:0x11C fn_80181BC0 = .text:0x80181BC0; // type:function size:0x78 -fn_80181C40 = .text:0x80181C40; // type:function size:0x94 +fn_80181C40__15dLytMapIcon01_cFv = .text:0x80181C40; // type:function size:0x94 fn_80181CE0 = .text:0x80181CE0; // type:function size:0x68C fn_80182370 = .text:0x80182370; // type:function size:0x78 fn_801823F0 = .text:0x801823F0; // type:function size:0x28C @@ -10066,7 +10066,7 @@ fn_801897D0 = .text:0x801897D0; // type:function size:0x168 fn_80189940 = .text:0x80189940; // type:function size:0x8C fn_801899D0 = .text:0x801899D0; // type:function size:0xEC fn_80189AC0 = .text:0x80189AC0; // type:function size:0x68 -setIslandNamesOn__19dLytMapDecoration_cFb = .text:0x80189B30; // type:function size:0x50 +setIslandNamesOn__16dLytMapMarkers_cFb = .text:0x80189B30; // type:function size:0x50 fn_80189B80 = .text:0x80189B80; // type:function size:0x4 fn_80189B90 = .text:0x80189B90; // type:function size:0x27C fn_80189E10 = .text:0x80189E10; // type:function size:0xF4 @@ -11009,7 +11009,7 @@ fn_801B4C90 = .text:0x801B4C90; // type:function size:0x1C fn_801B4CB0 = .text:0x801B4CB0; // type:function size:0x1C fn_801B4CD0 = .text:0x801B4CD0; // type:function size:0x78 fn_801B4D50 = .text:0x801B4D50; // type:function size:0x1BC -fn_801B4F10 = .text:0x801B4F10; // type:function size:0x1AC +fn_801B4F10__10MapRelatedCFlRC7mVec3_c = .text:0x801B4F10; // type:function size:0x1AC fn_801B50C0 = .text:0x801B50C0; // type:function size:0xB8 fn_801B5180 = .text:0x801B5180; // type:function size:0x7F0 fn_801B5970 = .text:0x801B5970; // type:function size:0x38 @@ -33866,7 +33866,7 @@ lbl_80520B50 = .data:0x80520B50; // type:object size:0xC lbl_80520B5C = .data:0x80520B5C; // type:object size:0xC lbl_80520B68 = .data:0x80520B68; // type:object size:0xC lbl_80520B74 = .data:0x80520B74; // type:object size:0xC -lbl_80520B80 = .data:0x80520B80; // type:object size:0xC +__vt__14dLytMapPopup_c = .data:0x80520B80; // type:object size:0xC __vt__16dLytMapCapture_c = .data:0x80520B8C; // type:object size:0xC __vt__55sFStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c> = .data:0x80520B98; // type:object size:0x30 __vt__85sStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80520BC8; // type:object size:0x30 @@ -35353,8 +35353,8 @@ jumptable_8052A758 = .data:0x8052A758; // type:object size:0xA4 scope:local lbl_8052A7FC = .data:0x8052A7FC; // type:object size:0xC lbl_8052A808 = .data:0x8052A808; // type:object size:0x18 lbl_8052A820 = .data:0x8052A820; // type:object size:0x20 -LytDungeonBokoBaseIcons__vtable = .data:0x8052A840; // type:object size:0x20 -lbl_8052A860 = .data:0x8052A860; // type:object size:0x20 +__vt__15dLytMapIcon00_c = .data:0x8052A840; // type:object size:0x20 +__vt__15dLytMapIcon01_c = .data:0x8052A860; // type:object size:0x20 lbl_8052A880 = .data:0x8052A880; // type:object size:0x10 lbl_8052A890 = .data:0x8052A890; // type:object size:0xC8 lbl_8052A958 = .data:0x8052A958; // type:object size:0x68 diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index b3c95053..93f8a7f9 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -64,6 +64,14 @@ public: STATE_FUNC_DECLARE(dAcTbox_c, Wait); STATE_FUNC_DECLARE(dAcTbox_c, GoddessWait); + u8 getVariant() const { + return mVariant; + } + + bool hasBeenOpened() const { + return mHasBeenOpened; + } + private: static f32 getSomeRate(); bool initBgW(dBgW &bg, const char *arcName, const char *fileName); diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index b06ba8fa..29eb2763 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -636,10 +636,12 @@ public: static bool isOutOfStamina(); static f32 getStamina(); + static s32 getCurrentTunicType(); static s32 getCurrentSwordType(); static const char *getSwordName(s32); static s32 getCurrentlyEquippedShieldType(); + static const mColor &getEarringsColor(); static mVec3_c sPos1; diff --git a/include/d/d_stage.h b/include/d/d_stage.h index d714f3dd..5d48f917 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -84,6 +84,7 @@ public: void fn_801B4C70(const mVec3_c &); void fn_801B50C0(s32); const mVec3_c &fn_801B4CB0() const; + s32 fn_801B4F10(s32 roomid, const mVec3_c &position) const; }; // OBJ NAME: STAGE diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 63222b91..33bb92c1 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -9,6 +9,7 @@ #include "d/lyt/d_lyt_map_global.h" #include "d/lyt/d_textbox.h" #include "d/lyt/d_window.h" +#include "d/lyt/d_lyt_map_markers.h" #include "egg/core/eggColorFader.h" #include "m/m2d.h" #include "m/m_angle.h" @@ -467,17 +468,6 @@ private: /* 0x18E */ bool mDecideFinished; }; -// TODO, name made up -class dLytMapDecoration_c : public m2d::Base_c { -public: - dLytMapDecoration_c() {} - virtual ~dLytMapDecoration_c() {} - virtual void draw() override; - virtual void build(d2d::ResAccIf_c *resAcc); - - void setIslandNamesOn(bool on); - void fn_80189B90(); -}; /** 2D UI - Map - beacon preview icon following the cursor */ class dLytMapPutIcon_c { @@ -605,10 +595,9 @@ private: /* 0x0F24 */ dLytMapCapture_c mMapCapture; /* 0x0FA0 */ dLytMapFloorBtnMgr_c mFloorBtnMgr; /* 0x16B4 */ dLytMapPinIconAggregate_c mPinIconAggregate; + /* 0x2060 */ dLytMapMarkers_c mMarkers; - /* 0x2060 */ dLytMapDecoration_c field_0x2060; - - /* 0x2070 */ u8 _0x2070[0x64C0 - 0x2070]; + /* 0x5F54 */ u8 _0x5F54[0x64C0 - 0x5F54]; /* 0x64C0 */ dLytMapFootPrints_c mFootPrints; diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index 64c29f52..d5e14f60 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -68,6 +68,10 @@ public: return mPlayerPosition; } + u8 getField_0x55() const { + return field_0x55; + } + const mAng &getField_0x56() const { return field_0x56; } @@ -145,7 +149,8 @@ private: /* 0x4E */ u8 mAlpha; /* 0x4F */ u8 field_0x4F; /* 0x50 */ UNKWORD field_0x50; - /* 0x54 */ u8 _0x54[0x56 - 0x54]; + /* 0x54 */ u8 field_0x54; + /* 0x55 */ u8 field_0x55; /* 0x56 */ mAng field_0x56; /* 0x58 */ f32 field_0x58; /* 0x5C */ s32 mCurrentMapMode; diff --git a/include/d/lyt/d_lyt_map_markers.h b/include/d/lyt/d_lyt_map_markers.h index dd73bc00..1a995f65 100644 --- a/include/d/lyt/d_lyt_map_markers.h +++ b/include/d/lyt/d_lyt_map_markers.h @@ -1,16 +1,100 @@ #ifndef D_LYT_MAP_MARKERS_H #define D_LYT_MAP_MARKERS_H +#include "d/d_cursor_hit_check.h" #include "d/lyt/d2d.h" #include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" +#include "m/m_angle.h" #include "m/m_vec.h" +#include "nw4r/lyt/lyt_bounding.h" #include "nw4r/lyt/lyt_pane.h" #include "sized_string.h" +class dAcBase_c; +class dAcTbox_c; + +// Size: 0x1C +struct MapUnkStruct1 { +public: + MapUnkStruct1() {} + ~MapUnkStruct1() {} + + /* 0x00 */ u8 _0x00[0x1C]; +}; + +/** + * Since a map has a dynamic number of actors, the layout + * doesn't actually contain multiple panes for each icon - + * instead it contains one copy per icon, and then the custom + * draw function simply reads a bunch of draw commands to position + * and draw the panes, potentially using a pane multiple times. + * + * Size: 0xC + */ +struct dLytMapIcon01DrawCommand { +public: + dLytMapIcon01DrawCommand() {} + ~dLytMapIcon01DrawCommand() {} + + /* 0x00 */ mVec2_c position; + /* 0x08 */ mAng rotation; + /* 0x0A */ u8 paneIdx; + /* 0x0B */ u8 passIdx; +}; + +// Size: 0x20 +struct MapUnkStruct3 { +public: + MapUnkStruct3() {} + ~MapUnkStruct3() {} + + /* 0x00 */ UNKWORD field_0x00; + /* 0x04 */ nw4r::lyt::Bounding *bounding; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 field_0x0C; + /* 0x10 */ mVec2_c field_0x10; + /* 0x18 */ u8 field_0x18; + /* 0x19 */ u8 field_0x19; + /* 0x1C */ const char *field_0x1C; +}; + +// Size: 0xC +struct MapUnkStruct4 { +public: + MapUnkStruct4() {} + ~MapUnkStruct4() {} + + /* 0x00 */ f32 field_0x00; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ u16 field_0x08; + /* 0x0A */ u8 field_0x0A; + /* 0x0B */ u8 field_0x0B; +}; + +/** + * Since map icons are completely virtual, we need to separately + * track animation state if there are special in/out animations. + * + * Size: 0x10 + */ +struct dLytMapIconAnimState { +public: + // no ctor/dtor + + /* 0x00 */ UNKWORD cmdIndex; + /* 0x04 */ f32 frame; + /* 0x08 */ u8 animIn; + /* 0x09 */ u8 animOut; + /* 0x0A */ u8 idleVisible; + /* 0x0B */ u8 field_0x0B; + /* 0x0C */ bool visible; +}; + /** 2D UI - Map - Popup text that appears when pointing at certain points of interest */ class dLytMapPopup_c { public: - dLytMapPopup_c() {} + dLytMapPopup_c() : mLabel("MAP_00") {} virtual ~dLytMapPopup_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -50,4 +134,216 @@ private: /* 0x180 */ UNKWORD field_0x180; }; +/** 2D UI - Map - Text holding area names (on the world/province view, or exits on the stage view) */ +class dLytMapPlace_c { +public: + dLytMapPlace_c() {} + virtual ~dLytMapPlace_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + void draw(); + + void setLabel(const char *label); + void setInout(f32 value); + void setColor(u32 value); + + void realize(); + +private: + enum ModeCheck_e { + MODE_TRANSITION_TO_ZOOM = 2, + MODE_TRANSITION_TO_STAGE = 3, + MODE_STABLE_STAGE = 4, + MODE_STABLE_ZOOM = 5, + }; + + void realizeText(); + void setInitialState(); + void updateScale(); + void realizeTextSize(); + void realizeBgSize(); + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[3]; + /* 0x154 */ SizedString<0x40> mLabel; + /* 0x194 */ nw4r::lyt::Pane *mpPanes[2]; + /* 0x19C */ nw4r::lyt::Pane *mpBgPanes[3]; + /* 0x1A8 */ dTextBox_c *mpTextboxes[3]; + /* 0x1B4 */ dWindow_c *mpWindow[1]; + /* 0x1B8 */ dTextBox_c *mpSizeBox[1]; + /* 0x1BC */ s32 mModeCheckResult; + /* 0x1C0 */ f32 field_0x1C0; + /* 0x1C4 */ f32 field_0x1C4; + /* 0x1C8 */ mVec2_c field_0x1C8; + /* 0x1D0 */ u8 _0x1D0[0x1D8 - 0x1D0]; + /* 0x1D8 */ f32 mMaxScale; +}; + +class dLytMapIcon00_c : public m2d::Base_c { +public: + dLytMapIcon00_c() {} + +private: + /* 0x0104 */ d2d::LytBase_c mLyt; + /* 0x0194 */ d2d::AnmGroup_c mAnm[29]; + /* 0x0970 */ dCursorHitCheckLyt_c mCsHitCheck; + /* 0x0998 */ MapUnkStruct4 mUnk4[100]; + /* 0x0E5B */ u8 field_0x0E5B[100]; + /* 0x0F20 */ u8 field_0x0F20[100]; + /* 0x0F84 */ mVec3_c field_0x0F84[77]; + /* 0x1342 */ u8 field_0x1342[100]; + /* 0x13A8 */ u8 field_0x13A8[100]; + /* 0x1410 */ MapUnkStruct3 mUnk3[30]; + /* 0x1D70 */ dLytMapPlace_c mPlace; +}; + +class dLytMapIcon01_c : public m2d::Base_c { +public: + dLytMapIcon01_c() {} + virtual void draw() override; + virtual bool build(d2d::ResAccIf_c *resAcc); + virtual bool remove(); + virtual bool execute(); + virtual void resetDrawCommands(); + +private: + enum ModeCheck_e { + MODE_TRANSITION_TO_ZOOM = 2, + MODE_TRANSITION_TO_STAGE = 3, + MODE_STABLE_STAGE = 4, + MODE_STABLE_ZOOM = 5, + }; + + void setupActorDrawCommands(); + void setupStageDrawCommands(); + void setupLinkDrawCommand(); + void setupTriforceDrawCommands(); + void setupUnkDrawCommand(); + + void sortDrawCommands(); + + void setupTboxDrawCommand(dAcBase_c *actor); + void setupTboxDrawCommandGoddessClosed(dAcTbox_c *box); + void setupTboxDrawCommandOpen(dAcTbox_c *box); + void setupTboxDrawCommandClosed(dAcTbox_c *box); + + void setLinkTunic(s32 type); + void setGoddessStatue(bool present); + void setTerry(bool present); + void drawAreaLight(s32 color, nw4r::lyt::Pane *pane); + void drawSaveObj(s32 color, nw4r::lyt::Pane *pane); + void drawCloud(s32 alpha, nw4r::lyt::Pane *pane); + + void drawWithAnimIn(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame); + void drawWithAnimOut(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame); + void drawFullyIn(u32 paneIdx, nw4r::lyt::Pane *pane); + void fn_80181C40(); + + void checkMapMode(); + void loadFlags(); + + /* 0x0010 */ nw4r::lyt::Bounding *mpBoundings[59]; + /* 0x00FC */ nw4r::lyt::Pane *mpSpecialPanes[27]; + /* 0x0168 */ nw4r::lyt::Pane *mpSpecialPictures[27]; + /* 0x01D4 */ nw4r::lyt::Pane *mpTerryOnOffPane; + /* 0x01D8 */ d2d::ResAccIf_c *mpResAcc; + /* 0x01DC */ d2d::LytBase_c mLyt; + /* 0x026C */ d2d::AnmGroup_c mAnm[18]; + /* 0x06EC */ nw4r::lyt::Pane *mpPanes[42]; + /* 0x0794 */ dCursorHitCheckLyt_c mCsHitCheck; + /* 0x07BC */ dLytMapIcon01DrawCommand mCommands[100]; + /* 0x0C6C */ s32 mModeCheckResult; + /* 0x0C70 */ s32 field_0x0C70; + + /* 0x0C74 */ u8 field_0x0C74; + /* 0x0C75 */ u8 field_0x0C75; + /* 0x0C76 */ u8 field_0x0C76; + /* 0x0C77 */ u8 field_0x0C77; + /* 0x0C78 */ u8 field_0x0C78; + /* 0x0C79 */ u8 field_0x0C79; + /* 0x0C7A */ u8 field_0x0C7A; + /* 0x0C7B */ u8 field_0x0C7B; + /* 0x0C7C */ u8 field_0x0C7C; + /* 0x0C7D */ u8 field_0x0C7D; + /* 0x0C7E */ u8 field_0x0C7E; + /* 0x0C7F */ u8 field_0x0C7F; + /* 0x0C80 */ u8 field_0x0C80; + /* 0x0C81 */ u8 field_0x0C81; + /* 0x0C82 */ u8 field_0x0C82; + /* 0x0C83 */ u8 field_0x0C83; + /* 0x0C84 */ u8 field_0x0C84; + /* 0x0C85 */ u8 field_0x0C85[100]; + /* 0x0CE9 */ u8 mPassIdxes[35]; + /* 0x0D0C */ s32 field_0xD0C; + /* 0x0D10 */ s32 field_0xD10; + /* 0x0D14 */ u8 mNumCommandsPerPass[35]; + /* 0x0D37 */ u8 mNumCommands; + + /* 0x0D38 */ u8 _0x0D38[0x0D3A - 0x0D38]; + + /* 0x0D3A */ mAng field_0x0D3A; + + /* 0x0D3C */ u8 _0x0D3C[0x0D40 - 0x0D3C]; + + /* 0x0D40 */ mVec2_c field_0x0D40; + /* 0x0D48 */ u8 field_0x0D48; + /* 0x0D49 */ u8 field_0x0D49; + /* 0x0D4A */ u8 field_0x0D4A; + /* 0x0D4B */ u8 field_0x0D4B[100]; // ??? + + /* 0x0DAF */ u8 _0x0DAF[0x0E13 - 0x0DAF]; + + /* 0x0E13 */ u8 field_0x0E13; + /* 0x0E14 */ MapUnkStruct3 mUnk3[56]; + /* 0x1514 */ dLytMapIconAnimState mIconAnims[50]; + /* 0x1834 */ s32 mNumAnims; + /* 0x1838 */ f32 field_0x1838; + /* 0x183C */ f32 field_0x183C; + + /* 0x1840 */ u8 _0x183C[0x1845 - 0x1840]; + + /* 0x1845 */ u8 field_0x1845; + + /* 0x1846 */ u8 _0x1846[0x184C - 0x1846]; + + /* 0x184C */ bool field_0x184C; +}; + +// TODO, name made up +class dLytMapMarkers_c : public m2d::Base_c { +public: + dLytMapMarkers_c() : field_0x6F0(0), field_0x0702(0), field_0x0703(0), field_0x0704(0.0f) {} + virtual ~dLytMapMarkers_c() {} + virtual void draw() override; + virtual void build(d2d::ResAccIf_c *resAcc); + + void setIslandNamesOn(bool on); + void fn_80189B90(); + + void setField_0x6F4(const mVec2_c &v) { + field_0x06F4 = v; + } + +private: + /* 0x0010 */ d2d::ResAccIf_c mResAcc1; + /* 0x0380 */ d2d::ResAccIf_c mResAcc2; + + /* 0x06F0 */ u8 field_0x6F0; + /* 0x06F4 */ mVec2_c field_0x06F4; + + /* 0x06FC */ u8 _0x6FC[0x0702 - 0x06FC]; + + /* 0x0702 */ u8 field_0x0702; + /* 0x0702 */ u8 field_0x0703; + /* 0x0704 */ f32 field_0x0704; + /* 0x0708 */ dLytMapPopup_c mMapPopup; + /* 0x088C */ u8 _0x088C[0x0894 - 0x088C]; + /* 0x0894 */ MapUnkStruct1 mUnk1[60]; + + /* 0x0F30 */ dLytMapIcon01_c mIcon01; + /* 0x2780 */ dLytMapIcon00_c mIcon00; +}; + #endif diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 1ef491a7..96a93851 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -17,6 +17,10 @@ struct mAng { return *this; } + void setF(const f32 &f) { + mVal = f; + } + static mAng atan2s(f32 a, f32 b) { return mAng(cM::atan2s(a, b)); } diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 5054382d..97380752 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -2207,7 +2207,7 @@ void dLytMapMain_c::build() { d2d::dSubPane::linkMeters(mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName), &mSubpaneList); mFootPrints.build(resAcc); - field_0x2060.build(resAcc); + mMarkers.build(resAcc); mPinIconAggregate.build(resAcc); mPutIcon.build(resAcc); @@ -2295,8 +2295,7 @@ void dLytMapMain_c::build() { mpPriorityGroups[i] = mLyt.findGroupByName(sPriorityGroupNames[i]); } - // TODO - ((mVec2_c*)(_0x2070 + 0x6E4))->set(boundingPos2.x, boundingPos2.y); + mMarkers.setField_0x6F4(boundingPos2); mPinIconAggregate.setUnk(&field_0xF1C); @@ -2346,7 +2345,7 @@ void dLytMapMain_c::draw() { } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM || mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { - field_0x2060.draw(); + mMarkers.draw(); } if (field_0x8C68 != 3 && field_0x8C68 != 5 && field_0x8C94 != 2) { @@ -2367,7 +2366,7 @@ void dLytMapMain_c::draw() { fn_80138D80(); } fn_80143120(-2); - field_0x2060.fn_80189B90(); + mMarkers.fn_80189B90(); mPutIcon.draw(); if (field_0x8C94 == 10) { mPopupInfo.draw(); @@ -2448,7 +2447,7 @@ void dLytMapMain_c::executeState_Active() { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_ON); } mIslandNamesOn = !mIslandNamesOn; - field_0x2060.setIslandNamesOn(mIslandNamesOn); + mMarkers.setIslandNamesOn(mIslandNamesOn); } checkScroll(); @@ -2713,10 +2712,10 @@ void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); } if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { - field_0x2060.setIslandNamesOn(false); + mMarkers.setIslandNamesOn(false); } if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { - field_0x2060.setIslandNamesOn(mIslandNamesOn); + mMarkers.setIslandNamesOn(mIslandNamesOn); } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index 56ae532e..72e11718 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -1,10 +1,38 @@ #include "d/lyt/d_lyt_map_markers.h" #include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_tbox.h" +#include "d/d_cursor_hit_check.h" #include "d/d_message.h" +#include "d/d_player.h" +#include "d/d_player_act.h" +#include "d/d_sc_game.h" +#include "d/d_stage.h" +#include "d/flag/dungeonflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d2d.h" #include "d/lyt/d_lyt_map_global.h" #include "d/lyt/d_window.h" +#include "d/snd/d_snd_small_effect_mgr.h" #include "m/m_vec.h" +#include "nw4r/lyt/lyt_bounding.h" +#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_types.h" + +inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { + return mVec3_c(v.x, v.y, 0.0f); +} + +static bool checkHasMap() { + return DungeonflagManager::sInstance->getCounterOrFlag(2, 8); +} + +static bool projectOntoMap(const mVec3_c &position, mVec2_c &result) { + dLytMapGlobal_c::GetInstance()->projectOntoMap(result, position); + return true; +} static const d2d::LytBrlanMapping brlanMapMapPopup[] = { {"mapPopup_00_scale.brlan", "G_scale_00"}, @@ -215,3 +243,992 @@ void dLytMapPopup_c::checkMapMode() { return; } } + +static const d2d::LytBrlanMapping brlanMapMapPlace[] = { + { "mapPlace_00_in.brlan", "G_inOut_00"}, + {"mapPlace_00_scale.brlan", "G_scale_00"}, + {"mapPlace_00_color.brlan", "G_color_00"}, +}; + +#define MAP_PLACE_ANIM_IN 0 +#define MAP_PLACE_ANIM_SCALE 1 +#define MAP_PLACE_ANIM_COLOR 2 + +#define MAP_PLACE_NUM_ANIMS 3 + +static const char *sMapPlacePaneNames[] = { + "N_all_00", + "N_all_01", +}; + +#define MAP_PLACE_PANE_ALL_00 0 +#define MAP_PLACE_PANE_ALL_01 1 +#define MAP_PLACE_NUM_PANES 2 + +static const char *sMapPlaceBgPaneNames[] = { + "P_bg_00", + "P_bg_01", + "P_bg_02", +}; + +#define MAP_PLACE_PANE_BG_00 0 +#define MAP_PLACE_PANE_BG_01 1 +#define MAP_PLACE_PANE_BG_02 2 +#define MAP_PLACE_NUM_BG_PANES 3 + +static const char *sMapPlaceTextboxNames[] = { + "T_area_00", + "T_areaS_00", + "T_areaS_01", +}; + +#define MAP_PLACE_NUM_TEXTBOXES 3 + +static const char *sMapPlaceSizeBoxNames[] = {"W_bgP_00"}; + +bool dLytMapPlace_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPlace_00.brlyt", nullptr); + + for (int i = 0; i < MAP_PLACE_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapMapPlace[i].mFile, resAcc, mLyt.getLayout(), brlanMapMapPlace[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + mAnm[i].setAnimEnable(false); + } + + for (int i = 0; i < MAP_PLACE_NUM_PANES; i++) { + mpPanes[i] = mLyt.findPane(sMapPlacePaneNames[i]); + } + + for (int i = 0; i < MAP_PLACE_NUM_BG_PANES; i++) { + mpBgPanes[i] = mLyt.findPane(sMapPlaceBgPaneNames[i]); + } + + for (int i = 0; i < MAP_PLACE_NUM_TEXTBOXES; i++) { + mpTextboxes[i] = mLyt.getTextBox(sMapPlaceTextboxNames[i]); + } + + for (int i = 0; i < 1; i++) { + mpWindow[i] = mLyt.getWindow(sMapPlaceSizeBoxNames[i]); + mpSizeBox[i] = mLyt.getSizeBoxInWindow(sMapPlaceSizeBoxNames[i]); + } + + realizeText(); + + f32 windowWidth = mpWindow[0]->GetSize().width; + f32 w1 = mpBgPanes[0]->GetSize().width; + f32 w2 = mpBgPanes[1]->GetSize().width; + f32 w3 = mpBgPanes[2]->GetSize().width; + + f32 lineWidth = mpTextboxes[0]->GetLineWidth(nullptr); + + f32 bgWidth = (w1 + w2 + w3); + field_0x1C4 = windowWidth - lineWidth; + field_0x1C0 = windowWidth - bgWidth; + + realizeTextSize(); + realizeBgSize(); + setInitialState(); + + mMaxScale = mAnm[MAP_PLACE_ANIM_SCALE].getLastFrame(); + + return true; +} + +bool dLytMapPlace_c::remove() { + for (int i = 0; i < MAP_PLACE_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + return true; +} + +bool dLytMapPlace_c::execute() { + if (mAnm[MAP_PLACE_ANIM_IN].isEnabled() && mAnm[MAP_PLACE_ANIM_IN].isStop2()) { + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(false); + } + for (int i = 0; i < MAP_PLACE_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + return true; +} + +void dLytMapPlace_c::draw() { + mpPanes[MAP_PLACE_PANE_ALL_00]->SetAlpha(dLytMapGlobal_c::GetInstance()->getAlpha()); + mpPanes[MAP_PLACE_PANE_ALL_00]->SetTranslate(vec2ToVec3XY(field_0x1C8)); + mpPanes[MAP_PLACE_PANE_ALL_00]->Animate(0); + mpPanes[MAP_PLACE_PANE_ALL_00]->CalculateMtx(mLyt.getDrawInfo()); + mpPanes[MAP_PLACE_PANE_ALL_00]->Draw(mLyt.getDrawInfo()); +} + +void dLytMapPlace_c::setLabel(const char *label) { + mLabel = label; +} + +void dLytMapPlace_c::realize() { + realizeText(); + realizeTextSize(); + realizeBgSize(); +} + +void dLytMapPlace_c::setInout(f32 value) { + if (/* 0.0f <= value && */ value <= mAnm[MAP_PLACE_ANIM_IN].getLastFrame()) { + mAnm[MAP_PLACE_ANIM_IN].setFrame(value); + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(true); + mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(false); + } +} + +void dLytMapPlace_c::setColor(u32 value) { + f32 frame = value; + mAnm[MAP_PLACE_ANIM_COLOR].setAnimEnable(true); + mAnm[MAP_PLACE_ANIM_COLOR].setFrame(frame); + mpPanes[MAP_PLACE_PANE_ALL_00]->Animate(0); + mAnm[MAP_PLACE_ANIM_COLOR].setAnimEnable(false); +} + +void dLytMapPlace_c::setInitialState() { + mAnm[MAP_PLACE_ANIM_COLOR].setRate(1.0f); + mAnm[MAP_PLACE_ANIM_COLOR].setForwardOnce(); + mAnm[MAP_PLACE_ANIM_COLOR].setToStart(); + mAnm[MAP_PLACE_ANIM_COLOR].setAnimEnable(true); + + mAnm[MAP_PLACE_ANIM_SCALE].setRate(1.0f); + mAnm[MAP_PLACE_ANIM_SCALE].setForwardOnce(); + mAnm[MAP_PLACE_ANIM_SCALE].setToStart(); + mAnm[MAP_PLACE_ANIM_SCALE].setAnimEnable(true); + + mAnm[MAP_PLACE_ANIM_IN].setRate(1.0f); + mAnm[MAP_PLACE_ANIM_IN].setForwardOnce(); + mAnm[MAP_PLACE_ANIM_IN].setToEnd2(); + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(true); + + mLyt.calc(); + + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(false); + mAnm[MAP_PLACE_ANIM_SCALE].setAnimEnable(false); + mAnm[MAP_PLACE_ANIM_COLOR].setAnimEnable(false); +} + +void dLytMapPlace_c::updateScale() { + // @bug mModeCheckResult is never set + f32 frame = 0.0f; + f32 zoomFrame = dLytMapGlobal_c::GetInstance()->getZoomFrame(); + + switch (mModeCheckResult) { + case MODE_TRANSITION_TO_ZOOM: frame = mMaxScale * zoomFrame; break; + case MODE_TRANSITION_TO_STAGE: frame = mMaxScale * zoomFrame; break; + case MODE_STABLE_STAGE: frame = 0.0f; break; + case MODE_STABLE_ZOOM: frame = mMaxScale; break; + } + + if (mMaxScale < frame) { + frame = mMaxScale; + } else if (frame < 0.0f) { + frame = 0.0f; + } + + mAnm[MAP_PLACE_ANIM_SCALE].setAnimEnable(true); + mAnm[MAP_PLACE_ANIM_SCALE].setFrame(frame); + mpPanes[MAP_PLACE_PANE_ALL_01]->Animate(0); + mAnm[MAP_PLACE_ANIM_SCALE].setAnimEnable(false); +} + +void dLytMapPlace_c::realizeText() { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mLabel, true, nullptr, 0); + if (text != nullptr) { + for (int i = 0; i < MAP_PLACE_NUM_TEXTBOXES; i++) { + mpTextboxes[i]->setTextWithGlobalTextProcessor(text); + } + } +} + +void dLytMapPlace_c::realizeTextSize() { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mLabel, true, nullptr, 0); + if (text != nullptr) { + mpWindow[0]->UpdateSize(mpSizeBox[0], 0.0f); + nw4r::lyt::Size size(mpWindow[0]->GetSize()); + size.width += field_0x1C4; + mpWindow[0]->SetSize(size); + } +} + +static const d2d::LytBrlanMapping brlanMapMapIcon01[] = { + { "mapIcon_01_player2pattern.brlan", "G_2pattern_00"}, + { "mapIcon_01_playerLoop.brlan", "G_playerLoop_00"}, + { "mapIcon_01_scale.brlan", "G_scale_00"}, + { "mapIcon_01_nusiAnim.brlan", "G_nusiLoop_00"}, + { "mapIcon_01_areaLoop.brlan", "G_areaLoop_00"}, + { "mapIcon_01_areaColor.brlan", "G_areaColor_00"}, + { "mapIcon_01_cloudLoop.brlan", "G_cloudBLoop_00"}, + { "mapIcon_01_cloudAlpha.brlan", "G_cloudBAlpha_00"}, + { "mapIcon_01_loop.brlan", "G_loop_00"}, + { "mapIcon_01_goddessOnOff.brlan", "G_goddess_00"}, + {"mapIcon_01_saveObjectColor.brlan", "G_saveColor_00"}, + { "mapIcon_01_iconOut.brlan", "G_tresInOut_00"}, + { "mapIcon_01_iconOut.brlan", "G_markInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_tresInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_markInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_doorInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_saveInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_forceInOut_00"}, +}; + +#define MAP_ICON_01_ANIM_PLAYER_2_PATTERN 0 +#define MAP_ICON_01_ANIM_PLAYER_LOOP 1 +#define MAP_ICON_01_ANIM_SCALE 2 +#define MAP_ICON_01_ANIM_NUSI_ANIM 3 +#define MAP_ICON_01_ANIM_AREA_LOOP 4 +#define MAP_ICON_01_ANIM_AREA_COLOR 5 +#define MAP_ICON_01_ANIM_CLOUD_LOOP 6 +#define MAP_ICON_01_ANIM_CLOUD_ALPHA 7 +#define MAP_ICON_01_ANIM_LOOP 8 +#define MAP_ICON_01_ANIM_GODDESS_ON_OFF 9 +#define MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR 10 +#define MAP_ICON_01_ANIM_TRES_OUT 11 +#define MAP_ICON_01_ANIM_MARK_OUT 12 +#define MAP_ICON_01_ANIM_TRES_IN 13 +#define MAP_ICON_01_ANIM_MARK_IN 14 +#define MAP_ICON_01_ANIM_DOOR_IN 15 +#define MAP_ICON_01_ANIM_SAVE_IN 16 +#define MAP_ICON_01_ANIM_FORCE_IN 17 +#define MAP_ICON_01_NUM_ANIMS 18 + +static const char *sPaneNamesIcon01[] = { + "N_treasure_00", "N_mark_000", "N_door_000", "N_saveIcon_00", "N_triforce_00", "N_player_000", + "N_player_01", "N_start_000", "N_sword_00", "N_shizuku_00", "N_shizuku_01", "N_goddessC_00", + "N_terryShop_00", "N_cloudBig_000", "N_treasure_01", "N_areaLight_00", "N_nusi_00", "N_doorKey_00", + "N_target_00", "N_mushi_00", "N_seekerIcon_00", "N_doddess_00", "N_domitory_00", "N_shop_00", + "N_mHusband_00", "N_mWife_00", "N_tool_00", "N_keep_00", "N_junk_00", "N_fortune_00", + "N_ruletou_000", "N_pampkin_000", "N_tery_000", "N_tikurin_000", "N_uta_000", "N_musi_000", + "N_skyloft_000", "N_roulette_00", "N_takegiri_00", "N_kobunB_00", "N_sebasun_00", "N_commonIcon_00", +}; + +#define MAP_ICON_01_PANE_TREASURE_00 0 +#define MAP_ICON_01_PANE_MARK_000 1 +#define MAP_ICON_01_PANE_DOOR_000 2 +#define MAP_ICON_01_PANE_SAVEICON_00 3 +#define MAP_ICON_01_PANE_TRIFORCE_00 4 +#define MAP_ICON_01_PANE_PLAYER_000 5 +#define MAP_ICON_01_PANE_PLAYER_01 6 +#define MAP_ICON_01_PANE_START_000 7 +#define MAP_ICON_01_PANE_SWORD_00 8 +#define MAP_ICON_01_PANE_SHIZUKU_00 9 +#define MAP_ICON_01_PANE_SHIZUKU_01 10 +#define MAP_ICON_01_PANE_GODDESSC_00 11 +#define MAP_ICON_01_PANE_TERRYSHOP_00 12 +#define MAP_ICON_01_PANE_CLOUDBIG_000 13 +#define MAP_ICON_01_PANE_TREASURE_01 14 +#define MAP_ICON_01_PANE_AREALIGHT_00 15 +#define MAP_ICON_01_PANE_NUSI_00 16 +#define MAP_ICON_01_PANE_DOORKEY_00 17 +#define MAP_ICON_01_PANE_TARGET_00 18 +#define MAP_ICON_01_PANE_MUSHI_00 19 +#define MAP_ICON_01_PANE_SEEKERICON_00 20 +#define MAP_ICON_01_PANE_DODDESS_00 21 +#define MAP_ICON_01_PANE_DOMITORY_00 22 +#define MAP_ICON_01_PANE_SHOP_00 23 +#define MAP_ICON_01_PANE_MHUSBAND_00 24 +#define MAP_ICON_01_PANE_MWIFE_00 25 +#define MAP_ICON_01_PANE_TOOL_00 26 +#define MAP_ICON_01_PANE_KEEP_00 27 +#define MAP_ICON_01_PANE_JUNK_00 28 +#define MAP_ICON_01_PANE_FORTUNE_00 29 +#define MAP_ICON_01_PANE_RULETOU_000 30 +#define MAP_ICON_01_PANE_PAMPKIN_000 31 +#define MAP_ICON_01_PANE_TERY_000 32 +#define MAP_ICON_01_PANE_TIKURIN_000 33 +#define MAP_ICON_01_PANE_UTA_000 34 +#define MAP_ICON_01_PANE_MUSI_000 35 +#define MAP_ICON_01_PANE_SKYLOFT_000 36 +#define MAP_ICON_01_PANE_ROULETTE_00 37 +#define MAP_ICON_01_PANE_TAKEGIRI_00 38 +#define MAP_ICON_01_PANE_KOBUNB_00 39 +#define MAP_ICON_01_PANE_SEBASUN_00 40 +#define MAP_ICON_01_PANE_COMMONICON_00 41 + +#define MAP_ICON_01_NUM_PANES 42 + +static const char *sMapIcon01BoundingNames[] = { + "B_doddess_00", "B_domitory_00", "B_shop_00", "B_mHusband_00", "B_mWife_00", "B_tool_00", + "B_keep_00", "B_junk_00", "B_fortune_00", "B_ruletou_00", "B_pampkin_00", "B_tery_00", + "B_tikurin_00", "B_uta_01", "B_musi_01", "B_skyloft_01", "B_roulette_00", "B_takegiri_00", + "B_kobunB_00", "B_sebasun_00", "B_uta_00", "B_musi_00", "B_skyloft_00", "B_nusi_00", + "B_terryShop_00", "B_seekerStone_00", "B_commonIcon_00", "B_commonIcon_01", "B_commonIcon_02", "B_commonIcon_03", + "B_commonIcon_04", "B_commonIcon_05", "B_commonIcon_06", "B_commonIcon_07", "B_commonIcon_08", "B_commonIcon_09", + "B_commonIcon_10", "B_commonIcon_11", "B_commonIcon_12", "B_commonIcon_13", "B_commonIcon_14", "B_commonIcon_15", + "B_commonIcon_16", "B_commonIcon_17", "B_commonIcon_18", "B_commonIcon_19", "B_commonIcon_20", "B_commonIcon_21", + "B_commonIcon_22", "B_commonIcon_23", "B_commonIcon_24", "B_commonIcon_25", "B_commonIcon_26", "B_commonIcon_27", + "B_commonIcon_28", "B_commonIcon_29", "B_saveIcon_00", "B_mushi_00", "B_areaLight_00", +}; + +#define MAP_ICON_01_BOUNDING_DODDESS_00 0 +#define MAP_ICON_01_BOUNDING_DOMITORY_00 1 +#define MAP_ICON_01_BOUNDING_SHOP_00 2 +#define MAP_ICON_01_BOUNDING_MHUSBAND_00 3 +#define MAP_ICON_01_BOUNDING_MWIFE_00 4 +#define MAP_ICON_01_BOUNDING_TOOL_00 5 +#define MAP_ICON_01_BOUNDING_KEEP_00 6 +#define MAP_ICON_01_BOUNDING_JUNK_00 7 +#define MAP_ICON_01_BOUNDING_FORTUNE_00 8 +#define MAP_ICON_01_BOUNDING_RULETOU_00 9 +#define MAP_ICON_01_BOUNDING_PAMPKIN_00 10 +#define MAP_ICON_01_BOUNDING_TERY_00 11 +#define MAP_ICON_01_BOUNDING_TIKURIN_00 12 +#define MAP_ICON_01_BOUNDING_UTA_01 13 +#define MAP_ICON_01_BOUNDING_MUSI_01 14 +#define MAP_ICON_01_BOUNDING_SKYLOFT_01 15 +#define MAP_ICON_01_BOUNDING_ROULETTE_00 16 +#define MAP_ICON_01_BOUNDING_TAKEGIRI_00 17 +#define MAP_ICON_01_BOUNDING_KOBUNB_00 18 +#define MAP_ICON_01_BOUNDING_SEBASUN_00 19 +#define MAP_ICON_01_BOUNDING_UTA_00 20 +#define MAP_ICON_01_BOUNDING_MUSI_00 21 +#define MAP_ICON_01_BOUNDING_SKYLOFT_00 22 +#define MAP_ICON_01_BOUNDING_NUSI_00 23 +#define MAP_ICON_01_BOUNDING_TERRYSHOP_00 24 +#define MAP_ICON_01_BOUNDING_SEEKERSTONE_00 25 +#define MAP_ICON_01_BOUNDING_COMMONICON_00 26 +#define MAP_ICON_01_BOUNDING_COMMONICON_01 27 +#define MAP_ICON_01_BOUNDING_COMMONICON_02 28 +#define MAP_ICON_01_BOUNDING_COMMONICON_03 29 +#define MAP_ICON_01_BOUNDING_COMMONICON_04 30 +#define MAP_ICON_01_BOUNDING_COMMONICON_05 31 +#define MAP_ICON_01_BOUNDING_COMMONICON_06 32 +#define MAP_ICON_01_BOUNDING_COMMONICON_07 33 +#define MAP_ICON_01_BOUNDING_COMMONICON_08 34 +#define MAP_ICON_01_BOUNDING_COMMONICON_09 35 +#define MAP_ICON_01_BOUNDING_COMMONICON_10 36 +#define MAP_ICON_01_BOUNDING_COMMONICON_11 37 +#define MAP_ICON_01_BOUNDING_COMMONICON_12 38 +#define MAP_ICON_01_BOUNDING_COMMONICON_13 39 +#define MAP_ICON_01_BOUNDING_COMMONICON_14 40 +#define MAP_ICON_01_BOUNDING_COMMONICON_15 41 +#define MAP_ICON_01_BOUNDING_COMMONICON_16 42 +#define MAP_ICON_01_BOUNDING_COMMONICON_17 43 +#define MAP_ICON_01_BOUNDING_COMMONICON_18 44 +#define MAP_ICON_01_BOUNDING_COMMONICON_19 45 +#define MAP_ICON_01_BOUNDING_COMMONICON_20 46 +#define MAP_ICON_01_BOUNDING_COMMONICON_21 47 +#define MAP_ICON_01_BOUNDING_COMMONICON_22 48 +#define MAP_ICON_01_BOUNDING_COMMONICON_23 49 +#define MAP_ICON_01_BOUNDING_COMMONICON_24 50 +#define MAP_ICON_01_BOUNDING_COMMONICON_25 51 +#define MAP_ICON_01_BOUNDING_COMMONICON_26 52 +#define MAP_ICON_01_BOUNDING_COMMONICON_27 53 +#define MAP_ICON_01_BOUNDING_COMMONICON_28 54 +#define MAP_ICON_01_BOUNDING_COMMONICON_29 55 +#define MAP_ICON_01_BOUNDING_SAVEICON_00 56 +#define MAP_ICON_01_BOUNDING_MUSHI_00 57 +#define MAP_ICON_01_BOUNDING_AREALIGHT_00 58 + +#define MAP_ICON_01_NUM_BOUNDINGS 59 + +static const char *sMapIcon01SpecialPaneNames[] = { + "N_doddess_000", "N_domitory_000", "N_shop_000", "N_mHusband_000", "N_mWife_000", "N_tool_000", + "N_keep_000", "N_junk_000", "N_fortune_000", "N_ruletou_000", "N_pampkin_000", "N_tery_000", + "N_tikurin_000", "N_uta_000", "N_musi_000", "N_skyloft_02", "N_roulette_01", "N_takegiri_01", + "N_kobunB_01", "N_sebasun_01", "N_commonIcon_000", "N_saveIcon_000", "N_areaLight_01", "N_nusi_000", + "N_terryShop_01", "N_seekerIcon_01", "N_mushi_01", +}; + +#define MAP_ICON_01_SPECIAL_PANE_DODDESS_000 0 +#define MAP_ICON_01_SPECIAL_PANE_DOMITORY_000 1 +#define MAP_ICON_01_SPECIAL_PANE_SHOP_000 2 +#define MAP_ICON_01_SPECIAL_PANE_MHUSBAND_000 3 +#define MAP_ICON_01_SPECIAL_PANE_MWIFE_000 4 +#define MAP_ICON_01_SPECIAL_PANE_TOOL_000 5 +#define MAP_ICON_01_SPECIAL_PANE_KEEP_000 6 +#define MAP_ICON_01_SPECIAL_PANE_JUNK_000 7 +#define MAP_ICON_01_SPECIAL_PANE_FORTUNE_000 8 +#define MAP_ICON_01_SPECIAL_PANE_RULETOU_000 9 +#define MAP_ICON_01_SPECIAL_PANE_PAMPKIN_000 10 +#define MAP_ICON_01_SPECIAL_PANE_TERY_000 11 +#define MAP_ICON_01_SPECIAL_PANE_TIKURIN_000 12 +#define MAP_ICON_01_SPECIAL_PANE_UTA_000 13 +#define MAP_ICON_01_SPECIAL_PANE_MUSI_000 14 +#define MAP_ICON_01_SPECIAL_PANE_SKYLOFT_02 15 +#define MAP_ICON_01_SPECIAL_PANE_ROULETTE_01 16 +#define MAP_ICON_01_SPECIAL_PANE_TAKEGIRI_01 17 +#define MAP_ICON_01_SPECIAL_PANE_KOBUNB_01 18 +#define MAP_ICON_01_SPECIAL_PANE_SEBASUN_01 19 +#define MAP_ICON_01_SPECIAL_PANE_COMMONICON_000 20 +#define MAP_ICON_01_SPECIAL_PANE_SAVEICON_000 21 +#define MAP_ICON_01_SPECIAL_PANE_AREALIGHT_01 22 +#define MAP_ICON_01_SPECIAL_PANE_NUSI_000 23 +#define MAP_ICON_01_SPECIAL_PANE_TERRYSHOP_01 24 +#define MAP_ICON_01_SPECIAL_PANE_SEEKERICON_01 25 +#define MAP_ICON_01_SPECIAL_PANE_MUSHI_01 26 + +#define MAP_ICON_01_NUM_SPECIAL_PANES 27 + +static const char *sMapIcon01SpecialPictureNames[] = { + "P_doddess_00", "P_domitory_00", "P_shop_00", "P_mHusband_00", "P_mWife_00", "P_tool_00", "P_keep_00", + "P_junk_00", "P_fortune_00", "P_ruletou_00", "P_pampkin_00", "P_tery_00", "P_tikurin_00", "P_uta_00", + "P_musi_00", "P_skyloft_00", "P_icon_01", "P_icon_02", "P_icon_00", "P_icon_04", "P_commonIcon_00", + "P_saveIcon_01", "P_light_00_00", "P_nusi_00", "P_terry_01", "P_seeker_00", "P_mushi_00", + +}; + +#define MAP_ICON_01_SPECIAL_PICTURE_DODDESS_00 0 +#define MAP_ICON_01_SPECIAL_PICTURE_DOMITORY_00 1 +#define MAP_ICON_01_SPECIAL_PICTURE_SHOP_00 2 +#define MAP_ICON_01_SPECIAL_PICTURE_MHUSBAND_00 3 +#define MAP_ICON_01_SPECIAL_PICTURE_MWIFE_00 4 +#define MAP_ICON_01_SPECIAL_PICTURE_TOOL_00 5 +#define MAP_ICON_01_SPECIAL_PICTURE_KEEP_00 6 +#define MAP_ICON_01_SPECIAL_PICTURE_JUNK_00 7 +#define MAP_ICON_01_SPECIAL_PICTURE_FORTUNE_00 8 +#define MAP_ICON_01_SPECIAL_PICTURE_RULETOU_00 9 +#define MAP_ICON_01_SPECIAL_PICTURE_PAMPKIN_00 10 +#define MAP_ICON_01_SPECIAL_PICTURE_TERY_00 11 +#define MAP_ICON_01_SPECIAL_PICTURE_TIKURIN_00 12 +#define MAP_ICON_01_SPECIAL_PICTURE_UTA_00 13 +#define MAP_ICON_01_SPECIAL_PICTURE_MUSI_00 14 +#define MAP_ICON_01_SPECIAL_PICTURE_SKYLOFT_00 15 +#define MAP_ICON_01_SPECIAL_PICTURE_ICON_01 16 +#define MAP_ICON_01_SPECIAL_PICTURE_ICON_02 17 +#define MAP_ICON_01_SPECIAL_PICTURE_ICON_00 18 +#define MAP_ICON_01_SPECIAL_PICTURE_ICON_04 19 +#define MAP_ICON_01_SPECIAL_PICTURE_COMMONICON_00 20 +#define MAP_ICON_01_SPECIAL_PICTURE_SAVEICON_01 21 +#define MAP_ICON_01_SPECIAL_PICTURE_LIGHT_00_00 22 +#define MAP_ICON_01_SPECIAL_PICTURE_NUSI_00 23 +#define MAP_ICON_01_SPECIAL_PICTURE_TERRY_01 24 +#define MAP_ICON_01_SPECIAL_PICTURE_SEEKER_00 25 +#define MAP_ICON_01_SPECIAL_PICTURE_MUSHI_00 26 + +#define MAP_ICON_01_NUM_SPECIAL_PICTURES 27 + +static const char *sTerryOnOff = "N_terryOnOff_00"; + +bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) { + // TODO - ... + mpResAcc = resAcc; + mLyt.setResAcc(resAcc); + mLyt.build("mapIcon_01.brlyt", nullptr); + for (int i = 0; i < MAP_ICON_01_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapMapIcon01[i].mFile, mpResAcc, mLyt.getLayout(), brlanMapMapIcon01[i].mName); + mAnm[i].bind(false); + } + + if (daPlayerActBase_c::getCurrentTunicType() == 1) { + setLinkTunic(1); + } else { + setLinkTunic(0); + } + + // TODO bunch of setters + + if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_TRIFORCE_COMPLETE)) { + setGoddessStatue(false); + } else { + setGoddessStatue(true); + } + + for (int i = 0; i < MAP_ICON_01_NUM_PANES; i++) { + mpPanes[i] = mLyt.findPane(sPaneNamesIcon01[i]); + } + + for (int i = 0; i < MAP_ICON_01_NUM_BOUNDINGS; i++) { + mpBoundings[i] = mLyt.findBounding(sMapIcon01BoundingNames[i]); + } + + // TODO - why 56 and not 59 + for (int i = 0; i < 56; i++) { + mUnk3[i].bounding = mpBoundings[i]; + } + + for (int i = 0; i < MAP_ICON_01_NUM_BOUNDINGS; i++) { + mpBoundings[i]->SetVisible(false); + } + + mLyt.calc(); + + for (int i = 0; i < MAP_ICON_01_NUM_SPECIAL_PANES; i++) { + mpSpecialPanes[i] = mLyt.findPane(sMapIcon01SpecialPaneNames[i]); + } + + for (int i = 0; i < MAP_ICON_01_NUM_SPECIAL_PICTURES; i++) { + mpSpecialPictures[i] = mLyt.findPane(sMapIcon01SpecialPictureNames[i]); + } + + mpTerryOnOffPane = mLyt.findPane(sTerryOnOff); + setTerry(false); + + for (int i = 0; i < 35; i++) { + mPassIdxes[i] = i; + } + + checkMapMode(); + + for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { + mIconAnims[i].cmdIndex = 100; + mIconAnims[i].frame = 0.0f; + mIconAnims[i].animIn = false; + mIconAnims[i].animOut = false; + mIconAnims[i].idleVisible = false; + mIconAnims[i].field_0x0B = 0; + mIconAnims[i].visible = false; + } + + setupActorDrawCommands(); + setupStageDrawCommands(); + setupLinkDrawCommand(); + + if (field_0x0C70 == 1) { + setupTriforceDrawCommands(); + } + + if (field_0x0C70 == 4) { + setupUnkDrawCommand(); + } + + // TODO - ... + + sortDrawCommands(); + + mCsHitCheck.init(mLyt.getLayout()->GetRootPane(), 0x1, 0, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); + resetDrawCommands(); + return true; +} + +bool dLytMapIcon01_c::remove() { + for (int i = 0; i < MAP_ICON_01_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); + return true; +} + +bool dLytMapIcon01_c::execute() { + for (int i = 0; i < MAP_ICON_01_ANIM_FORCE_IN + 1 - MAP_ICON_01_ANIM_TRES_OUT; i++) { + if (mAnm[MAP_ICON_01_ANIM_TRES_OUT + i].isEnabled() && mAnm[MAP_ICON_01_ANIM_TRES_OUT + i].isStop2()) { + mAnm[MAP_ICON_01_ANIM_TRES_OUT + i].setAnimEnable(false); + } + } + mLyt.calc(); + checkMapMode(); + loadFlags(); + + return true; +} + +void dLytMapIcon01_c::draw() { + // TODO - tons of GPR regswaps, mAng nonsense, otherwise OK + mAng mapRot = dLytMapGlobal_c::GetInstance()->getMapRotation(); + // Maybe compiler-generated + u8 *idxes = mPassIdxes; + for (int pass = 0; pass < 35; pass++, idxes++) { + u8 idx = *idxes; + if (mNumCommandsPerPass[idx]) { + for (int cmd = 0; cmd < mNumCommands; cmd++) { + // Maybe compiler-generated + const mAng &commandRot = mCommands[cmd].rotation; + // Suspicious cast + if (idx == (int)mCommands[cmd].passIdx) { + s32 paneIdx = mCommands[cmd].paneIdx; + nw4r::lyt::Pane *pane = mpPanes[paneIdx]; + switch (paneIdx) { + case MAP_ICON_01_PANE_PLAYER_000: { + mVec3_c rotate(0.0f, 0.0f, 0.0f); + if (dLytMapGlobal_c::GetInstance()->getField_0x55() != 0) { + dAcPy_c *link = getLinkPtr(); + rotate.z = (link->vt_0x19C() + link->mRotation.y + (-mapRot)).degree2(); + } else { + rotate.z = (field_0x0D3A + (-mapRot)).degree2(); + } + pane->SetRotate(rotate); + pane = pane->GetParent(); + break; + } + case MAP_ICON_01_PANE_DOOR_000: + case MAP_ICON_01_PANE_START_000: { + mVec3_c rotate(0.0f, 0.0f, ((-mapRot) + commandRot).degree2()); + pane->SetRotate(rotate); + pane = mpPanes[paneIdx]->GetParent(); + break; + } + case MAP_ICON_01_PANE_MARK_000: + case MAP_ICON_01_PANE_RULETOU_000: + case MAP_ICON_01_PANE_PAMPKIN_000: + case MAP_ICON_01_PANE_TERY_000: + case MAP_ICON_01_PANE_TIKURIN_000: + case MAP_ICON_01_PANE_UTA_000: + case MAP_ICON_01_PANE_MUSI_000: + case MAP_ICON_01_PANE_SKYLOFT_000: { + mVec3_c rotate(0.0f, 0.0f, (-mapRot).degree2()); + pane->SetRotate(rotate); + pane = mpPanes[paneIdx]->GetParent(); + break; + } + case MAP_ICON_01_PANE_AREALIGHT_00: { + if (field_0x0D48 != 100 && field_0x0D48 == cmd) { + drawAreaLight(0, pane); + } else if (field_0x0D49 != 100 && field_0x0D49 == cmd) { + drawAreaLight(1, pane); + } else if (field_0x0D4A != 100 && field_0x0D4A == cmd) { + drawAreaLight(2, pane); + } + break; + } + case MAP_ICON_01_PANE_SAVEICON_00: { + if (field_0x0D4B[cmd] != 100) { + drawSaveObj(field_0x0D4B[cmd], pane); + } + break; + } + } + + if (paneIdx == MAP_ICON_01_PANE_CLOUDBIG_000) { + if (dScGame_c::isCurrentStage("F020")) { + if (field_0x0C81) { + drawCloud(1, pane); + } else { + drawCloud(0, pane); + } + } else if (dScGame_c::isCurrentStage("F023")) { + drawCloud(2, pane); + } + mVec3_c rotate(0.0f, 0.0f, (-mapRot).degree2()); + pane->SetRotate(rotate); + pane = mpPanes[paneIdx]->GetParent(); + } + + u8 alpha = dLytMapGlobal_c::GetInstance()->getAlpha(); + bool found = false; + int i = 0; + for (; i < mNumAnims; i++) { + if (cmd == mIconAnims[i].cmdIndex) { + found = true; + break; + } + } + + if (found == true) { + if (field_0x0C84 && mIconAnims[i].animIn == true) { + if (field_0x1845 == 1) { + mIconAnims[i].idleVisible = true; + mIconAnims[i].animIn = true; + } else { + mIconAnims[i].idleVisible = false; + mIconAnims[i].animIn = false; + } + } + + if (field_0xD0C != field_0xD10) { + mIconAnims[i].animIn = false; + mIconAnims[i].animOut = false; + } + + if (mIconAnims[i].animIn) { + f32 f = mIconAnims[i].frame; + if (f <= field_0x1838) { + drawWithAnimIn(paneIdx, pane, f); + mIconAnims[i].frame += 1.0f; + mIconAnims[i].visible = true; + if (!field_0x184C) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ICON_APPEAR); + field_0x184C = true; + } + } else { + mIconAnims[i].animIn = false; + mIconAnims[i].visible = true; + field_0x184C = false; + } + } else if (mIconAnims[i].animOut) { + f32 f = mIconAnims[i].frame; + if (f <= field_0x183C) { + drawWithAnimOut(paneIdx, pane, f); + mIconAnims[i].frame += 1.0f; + mIconAnims[i].visible = true; + } else { + mIconAnims[i].animOut = false; + mIconAnims[i].visible = true; + } + } else if (mIconAnims[i].idleVisible) { + drawFullyIn(paneIdx, pane); + mIconAnims[i].visible = true; + } + + if (mIconAnims[i].visible == true) { + pane->SetAlpha(alpha); + pane->SetTranslate(vec2ToVec3XY(mCommands[cmd].position + field_0x0D40)); + pane->Animate(0); + pane->CalculateMtx(mLyt.getDrawInfo()); + pane->Draw(mLyt.getDrawInfo()); + } + } else { + // No animation data - simply draw + pane->SetAlpha(alpha); + pane->SetTranslate(vec2ToVec3XY(mCommands[cmd].position + field_0x0D40)); + pane->Animate(0); + pane->CalculateMtx(mLyt.getDrawInfo()); + pane->Draw(mLyt.getDrawInfo()); + } + } + } + } + } + + mVec2_c v2(0.0f, 0.0f); + for (int i = 0; i < field_0x0E13; i++) { + if (mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) { + v2 = mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].field_0x10; + mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(vec2ToVec3XY(v2 + field_0x0D40)); + mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo()); + mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo()); + } + } + + field_0xD10 = field_0xD0C; +} + +static const char *sMapPrefix = "MAP_"; + +void dLytMapIcon01_c::resetDrawCommands() { + for (int i = 0; i < (int)ARRAY_LENGTH(mCommands); i++) { + mCommands[i].position.set(0.0f, 0.0f); + mCommands[i].rotation.setF(0.0f); + mCommands[i].paneIdx = MAP_ICON_01_NUM_PANES; + mCommands[i].passIdx = 35; + field_0x0D4B[i] = 100; + field_0x0C85[i] = 0; + } + + field_0xD0C = 0; + + for (int i = 0; i < (int)ARRAY_LENGTH(mNumCommandsPerPass); i++) { + mNumCommandsPerPass[i] = 0; + } + + mNumCommands = 0; + + for (int i = 0; i < (int)ARRAY_LENGTH(mUnk3); i++) { + mUnk3[i].field_0x00 = 100; + mUnk3[i].field_0x10.set(0.0f, 0.0f); + mUnk3[i].field_0x08 = 0.0f; + mUnk3[i].field_0x0C = 0.0f; + mUnk3[i].field_0x18 = 0; + mUnk3[i].field_0x19 = 0; + mUnk3[i].field_0x1C = sMapPrefix; + } + + field_0x0E13 = 0; + field_0x0C83 = 0; + field_0x0C84 = 0; + + fn_80181C40(); + + field_0x0D48 = 100; + field_0x0D49 = 100; + field_0x0D4A = 100; + + field_0x0C74 = 0; + field_0x0C75 = 0; + field_0x0C76 = 0; + field_0x0C77 = 0; + field_0x0C78 = 0; + field_0x0C79 = 0; + field_0x0C7A = 0; + field_0x0C7B = 0; + field_0x0C7C = 0; + field_0x0C7D = 0; + field_0x0C7E = 0; + field_0x0C7F = 0; + field_0x0C80 = 0; + field_0x0C81 = 0; + field_0x0C82 = 0; + + for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { + mIconAnims[i].visible = 0; + } + + mNumAnims = 0; +} + +void dLytMapIcon01_c::setLinkTunic(s32 type) { + f32 frame = 0.0f; + switch (type) { + case 1: frame = 0.0f; break; + case 0: frame = 1.0f; break; + } + + mAnm[MAP_ICON_01_ANIM_PLAYER_2_PATTERN].setAnimEnable(true); + mAnm[MAP_ICON_01_ANIM_PLAYER_2_PATTERN].setFrame(frame); + mLyt.calc(); + mAnm[MAP_ICON_01_ANIM_PLAYER_2_PATTERN].setAnimEnable(false); +} + +void dLytMapIcon01_c::drawWithAnimIn(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame) { + if (paneIdx == MAP_ICON_01_PANE_DOORKEY_00) { + paneIdx = MAP_ICON_01_PANE_DOOR_000; + } + + // NOTE: Treasure/Mark/Door/Save/Triforce order is the same between anims and panes + u8 anmIdx = paneIdx - MAP_ICON_01_PANE_TREASURE_00 + MAP_ICON_01_ANIM_TRES_IN; + + if (frame <= mAnm[anmIdx].getLastFrame()) { + mAnm[anmIdx].setFrame(frame); + // Maybe inlines/macros + d2d::AnmGroup_c &anm = mAnm[anmIdx]; + anm.setAnimEnable(true); + pane->Animate(0); + anm.setAnimEnable(false); + } +} + +void dLytMapIcon01_c::drawWithAnimOut(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame) { + if (paneIdx == MAP_ICON_01_PANE_DOORKEY_00) { + paneIdx = MAP_ICON_01_PANE_DOOR_000; + } + + // NOTE: Treasure/Mark/Door/Save/Triforce order is the same between anims and panes + u8 anmIdx = paneIdx - MAP_ICON_01_PANE_TREASURE_00 + MAP_ICON_01_ANIM_TRES_OUT; + + if (frame <= mAnm[anmIdx].getLastFrame()) { + mAnm[anmIdx].setFrame(frame); + // Maybe inlines/macros + d2d::AnmGroup_c &anm = mAnm[anmIdx]; + anm.setAnimEnable(true); + pane->Animate(0); + anm.setAnimEnable(false); + } +} + +void dLytMapIcon01_c::drawFullyIn(u32 paneIdx, nw4r::lyt::Pane *pane) { + if (paneIdx == MAP_ICON_01_PANE_DOORKEY_00) { + paneIdx = MAP_ICON_01_PANE_DOOR_000; + } + + // NOTE: Treasure/Mark/Door/Save/Triforce order is the same between anims and panes + u8 anmIdx = paneIdx - MAP_ICON_01_PANE_TREASURE_00 + MAP_ICON_01_ANIM_TRES_IN; + + mAnm[anmIdx].setToEnd2(); + // Maybe inlines/macros + d2d::AnmGroup_c &anm = mAnm[anmIdx]; + anm.setAnimEnable(true); + pane->Animate(0); + anm.setAnimEnable(false); +} + +void dLytMapIcon01_c::checkMapMode() { + s32 current = dLytMapGlobal_c::GetInstance()->getCurrentMapMode(); + s32 next = dLytMapGlobal_c::GetInstance()->getNextMapMode(); + + if (current == dLytMapGlobal_c::MAPMODE_PROVINCE && next == dLytMapGlobal_c::MAPMODE_ZOOM) { + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_ZOOM && next == dLytMapGlobal_c::MAPMODE_PROVINCE) { + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_STAGE && next == dLytMapGlobal_c::MAPMODE_ZOOM) { + mModeCheckResult = MODE_TRANSITION_TO_ZOOM; + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_ZOOM && next == dLytMapGlobal_c::MAPMODE_STAGE) { + mModeCheckResult = MODE_TRANSITION_TO_STAGE; + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_PROVINCE) { + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_STAGE) { + mModeCheckResult = MODE_STABLE_STAGE; + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_ZOOM) { + mModeCheckResult = MODE_STABLE_ZOOM; + return; + } +} + +void dLytMapIcon01_c::setupTboxDrawCommand(dAcBase_c *actor) { + if (actor->mProfileName == fProfile::TBOX && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && + field_0xD0C == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { + dAcTbox_c *box = static_cast(actor); + if (box->getVariant() == dAcTbox_c::GODDESS) { + u16 flag = box->getParams2Lower(); + if (StoryflagManager::sInstance->getCounterOrFlag(flag) != 0 && box->hasBeenOpened() != true) { + setupTboxDrawCommandGoddessClosed(box); + } + } else if (box->hasBeenOpened() != true) { + if (field_0x0C70 == 1) { + setupTboxDrawCommandClosed(box); + } + } else { + setupTboxDrawCommandOpen(box); + } + } +} + +void dLytMapIcon01_c::setupTboxDrawCommandClosed(dAcTbox_c *box) { + if (mNumCommands < 100) { + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(box->mPosition, pos); + mCommands[mNumCommands].passIdx = 17; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_TREASURE_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + if (checkHasMap()) { + if (field_0x0C84) { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].idleVisible = true; + mIconAnims[mNumAnims].animIn = true; + } else { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].idleVisible = true; + mIconAnims[mNumAnims].animIn = false; + } + } else { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].idleVisible = false; + } + + mNumAnims++; + mNumCommandsPerPass[17]++; + mNumCommands++; + } +} + +void dLytMapIcon01_c::setupTboxDrawCommandOpen(dAcTbox_c *box) { + if (mNumCommands < 100) { + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(box->mPosition, pos); + mCommands[mNumCommands].passIdx = 17; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_TREASURE_01; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[17]++; + mNumCommands++; + } +} + +void dLytMapIcon01_c::setupTboxDrawCommandGoddessClosed(dAcTbox_c *box) { + if (mNumCommands < 100) { + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(box->mPosition, pos); + mCommands[mNumCommands].passIdx = 28; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_GODDESSC_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[28]++; + mNumCommands++; + } +} From baa508795496e8c13b5e8648d219f7f37b029fd6 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 5 Oct 2025 01:27:09 +0200 Subject: [PATCH 09/20] apply --- config/SOUE01/symbols.txt | 16 ++++++++-------- src/d/lyt/d_lyt_map_markers.cpp | 5 ++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 3052cd3b..4ad206c6 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -9894,8 +9894,8 @@ fn_80179240 = .text:0x80179240; // type:function size:0x4 fn_80179250 = .text:0x80179250; // type:function size:0x34 fn_80179290 = .text:0x80179290; // type:function size:0x18 ActorDoorBase__initList = .text:0x801792B0; // type:function size:0x14 -checkHasMap = .text:0x801792D0; // type:function size:0x68 -projectForMapMaybe2 = .text:0x80179340; // type:function size:0x2C +checkHasMap__Fv = .text:0x801792D0; // type:function size:0x68 +projectOntoMap__FRC7mVec3_cR7mVec2_c = .text:0x80179340; // type:function size:0x2C build__14dLytMapPopup_cFPQ23d2d10ResAccIf_c = .text:0x80179370; // type:function size:0x16C remove__14dLytMapPopup_cFv = .text:0x801794E0; // type:function size:0x58 execute__14dLytMapPopup_cFv = .text:0x80179540; // type:function size:0x104 @@ -9929,10 +9929,10 @@ draw__15dLytMapIcon01_cFv = .text:0x8017B360; // type:function size:0x704 resetDrawCommands__15dLytMapIcon01_cFv = .text:0x8017BA70; // type:function size:0x4FC setMapIcons = .text:0x8017BF70; // type:function size:0x2C8 setLinkTunic__15dLytMapIcon01_cFl = .text:0x8017C240; // type:function size:0x98 -fn_8017C2E0 = .text:0x8017C2E0; // type:function size:0xA0 -fn_8017C380 = .text:0x8017C380; // type:function size:0xA0 +drawAreaLight__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C2E0; // type:function size:0xA0 +drawCloud__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C380; // type:function size:0xA0 setGoddessStatue__15dLytMapIcon01_cFb = .text:0x8017C420; // type:function size:0x74 -fn_8017C4A0 = .text:0x8017C4A0; // type:function size:0xA0 +drawSaveObj__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C4A0; // type:function size:0xA0 fn_8017C540 = .text:0x8017C540; // type:function size:0x1C fn_8017C560 = .text:0x8017C560; // type:function size:0x80 fn_8017C5E0 = .text:0x8017C5E0; // type:function size:0x80 @@ -9949,9 +9949,9 @@ fn_8017CAF0 = .text:0x8017CAF0; // type:function size:0xC fn_8017CB00 = .text:0x8017CB00; // type:function size:0xC fn_8017CB10 = .text:0x8017CB10; // type:function size:0xC fn_8017CB20 = .text:0x8017CB20; // type:function size:0xC -drawWithAnimIn = .text:0x8017CB30; // type:function size:0xB8 -drawWithAnimOut = .text:0x8017CBF0; // type:function size:0xB8 -drawFullyIn = .text:0x8017CCB0; // type:function size:0xAC +drawWithAnimIn__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Panef = .text:0x8017CB30; // type:function size:0xB8 +drawWithAnimOut__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Panef = .text:0x8017CBF0; // type:function size:0xB8 +drawFullyIn__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017CCB0; // type:function size:0xAC checkMapMode__15dLytMapIcon01_cFv = .text:0x8017CD60; // type:function size:0xAC setupActorDrawCommands__15dLytMapIcon01_cFv = .text:0x8017CE10; // type:function size:0x150 fn_8017CF60 = .text:0x8017CF60; // type:function size:0xFC diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index 72e11718..7c866d6b 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -827,13 +827,12 @@ void dLytMapIcon01_c::draw() { // Maybe compiler-generated u8 *idxes = mPassIdxes; for (int pass = 0; pass < 35; pass++, idxes++) { - u8 idx = *idxes; + s32 idx = *idxes; if (mNumCommandsPerPass[idx]) { for (int cmd = 0; cmd < mNumCommands; cmd++) { // Maybe compiler-generated const mAng &commandRot = mCommands[cmd].rotation; - // Suspicious cast - if (idx == (int)mCommands[cmd].passIdx) { + if (idx == mCommands[cmd].passIdx) { s32 paneIdx = mCommands[cmd].paneIdx; nw4r::lyt::Pane *pane = mpPanes[paneIdx]; switch (paneIdx) { From c46b2ba5e19651bb209cdf13578f8a671bf8cc09 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 5 Oct 2025 23:40:42 +0200 Subject: [PATCH 10/20] Scaffold markers --- config/SOUE01/symbols.txt | 130 +++-- include/d/a/d_a_item.h | 1 + include/d/a/obj/d_a_obj_save.h | 10 + include/d/flag/storyflag_map.h | 24 +- include/d/lyt/d_lyt_map.h | 11 +- include/d/lyt/d_lyt_map_global.h | 20 + include/d/lyt/d_lyt_map_markers.h | 351 +++++++++---- include/toBeSorted/misc_actor.h | 5 + src/d/lyt/d_lyt_map.cpp | 78 ++- src/d/lyt/d_lyt_map_markers.cpp | 819 +++++++++++++++++++++++++++--- 10 files changed, 1194 insertions(+), 255 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 4ad206c6..f81c848c 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7761,15 +7761,15 @@ __ct__16dLytMapPinIcon_cFv = .text:0x80134780; // type:function size:0x134 __dt__25dLytMapPinIconAggregate_cFv = .text:0x801348C0; // type:function size:0xCC __ct__16dLytMapMarkers_cFv = .text:0x80134990; // type:function size:0x464 __dt__14dLytMapPopup_cFv = .text:0x80134E00; // type:function size:0x74 -__ct__13MapUnkStruct1Fv = .text:0x80134E80; // type:function size:0x10 -__dt__13MapUnkStruct1Fv = .text:0x80134E90; // type:function size:0x40 -__ct__13MapUnkStruct2Fv = .text:0x80134ED0; // type:function size:0x4 -__dt__13MapUnkStruct2Fv = .text:0x80134EE0; // type:function size:0x40 -__ct__13MapUnkStruct3Fv = .text:0x80134F20; // type:function size:0x10 -__dt__13MapUnkStruct3Fv = .text:0x80134F30; // type:function size:0x40 +__ct__17dLytMapPopupStateFv = .text:0x80134E80; // type:function size:0x10 +__dt__17dLytMapPopupStateFv = .text:0x80134E90; // type:function size:0x40 +__ct__24dLytMapIcon01DrawCommandFv = .text:0x80134ED0; // type:function size:0x4 +__dt__24dLytMapIcon01DrawCommandFv = .text:0x80134EE0; // type:function size:0x40 +__ct__18dLytMapPopupConfigFv = .text:0x80134F20; // type:function size:0x10 +__dt__18dLytMapPopupConfigFv = .text:0x80134F30; // type:function size:0x40 __dt__15dLytMapIcon01_cFv = .text:0x80134F70; // type:function size:0xBC -__ct__13MapUnkStruct4Fv = .text:0x80135030; // type:function size:0x4 -__dt__13MapUnkStruct4Fv = .text:0x80135040; // type:function size:0x40 +__ct__24dLytMapIcon00DrawCommandFv = .text:0x80135030; // type:function size:0x4 +__dt__24dLytMapIcon00DrawCommandFv = .text:0x80135040; // type:function size:0x40 __dt__14dLytMapPlace_cFv = .text:0x80135080; // type:function size:0x74 __dt__15dLytMapIcon00_cFv = .text:0x80135100; // type:function size:0x108 __dt__16dLytMapMarkers_cFv = .text:0x80135210; // type:function size:0x234 @@ -7899,12 +7899,10 @@ initializeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x80140580; / executeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x801405C0; // type:function size:0xF4 finalizeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x801406C0; // type:function size:0x4 initializeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406D0; // type:function size:0x20 -executeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406F0; // type:function size:0x3C -fn_8014072C = .text:0x8014072C; // type:function size:0x4 +executeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406F0; // type:function size:0x40 finalizeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x80140730; // type:function size:0x4 initializeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140740; // type:function size:0x38 -executeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140780; // type:function size:0x34 -fn_801407B4 = .text:0x801407B4; // type:function size:0x4 +executeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140780; // type:function size:0x38 finalizeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x801407C0; // type:function size:0x4 initializeState_EventSwBankSmall_Step3__13dLytMapMain_cFv = .text:0x801407D0; // type:function size:0x18 executeState_EventSwBankSmall_Step3__13dLytMapMain_cFv = .text:0x801407F0; // type:function size:0x28 @@ -9927,13 +9925,13 @@ remove__15dLytMapIcon01_cFv = .text:0x8017B030; // type:function size:0x70 execute__15dLytMapIcon01_cFv = .text:0x8017B0A0; // type:function size:0x2B8 draw__15dLytMapIcon01_cFv = .text:0x8017B360; // type:function size:0x704 resetDrawCommands__15dLytMapIcon01_cFv = .text:0x8017BA70; // type:function size:0x4FC -setMapIcons = .text:0x8017BF70; // type:function size:0x2C8 +loadFlags__15dLytMapIcon01_cFv = .text:0x8017BF70; // type:function size:0x2C8 setLinkTunic__15dLytMapIcon01_cFl = .text:0x8017C240; // type:function size:0x98 -drawAreaLight__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C2E0; // type:function size:0xA0 -drawCloud__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C380; // type:function size:0xA0 -setGoddessStatue__15dLytMapIcon01_cFb = .text:0x8017C420; // type:function size:0x74 -drawSaveObj__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C4A0; // type:function size:0xA0 -fn_8017C540 = .text:0x8017C540; // type:function size:0x1C +setAreaLight__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C2E0; // type:function size:0xA0 +setCloud__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C380; // type:function size:0xA0 +setGoddessStatue__15dLytMapIcon01_cFUl = .text:0x8017C420; // type:function size:0x74 +setSaveObj__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C4A0; // type:function size:0xA0 +setTerry__15dLytMapIcon01_cFb = .text:0x8017C540; // type:function size:0x1C fn_8017C560 = .text:0x8017C560; // type:function size:0x80 fn_8017C5E0 = .text:0x8017C5E0; // type:function size:0x80 fn_8017C660 = .text:0x8017C660; // type:function size:0x80 @@ -9954,47 +9952,47 @@ drawWithAnimOut__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Panef = .text:0x8017CBF0; // t drawFullyIn__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017CCB0; // type:function size:0xAC checkMapMode__15dLytMapIcon01_cFv = .text:0x8017CD60; // type:function size:0xAC setupActorDrawCommands__15dLytMapIcon01_cFv = .text:0x8017CE10; // type:function size:0x150 -fn_8017CF60 = .text:0x8017CF60; // type:function size:0xFC +setupNpcKenseiDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017CF60; // type:function size:0xFC setupTboxDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D060; // type:function size:0xF4 setupTboxDrawCommandClosed__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D160; // type:function size:0x17C setupTboxDrawCommandOpen__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D2E0; // type:function size:0xB4 setupTboxDrawCommandGoddessClosed__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D3A0; // type:function size:0xB4 -fn_8017D460 = .text:0x8017D460; // type:function size:0x3E4 -fn_8017D850 = .text:0x8017D850; // type:function size:0x3F4 -fn_8017DC50 = .text:0x8017DC50; // type:function size:0x398 -fn_8017DFF0 = .text:0x8017DFF0; // type:function size:0x478 -fn_8017E470 = .text:0x8017E470; // type:function size:0x2B0 -fn_8017E720 = .text:0x8017E720; // type:function size:0x190 -fn_8017E8B0 = .text:0x8017E8B0; // type:function size:0xFC -fn_8017E9B0 = .text:0x8017E9B0; // type:function size:0xA20 -fn_8017F3D0 = .text:0x8017F3D0; // type:function size:0x110 -fn_8017F4E0 = .text:0x8017F4E0; // type:function size:0x1C0 -fn_8017F6A0 = .text:0x8017F6A0; // type:function size:0x1D8 +setupObjShutterDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D460; // type:function size:0x3E4 +setupObjDoorDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D850; // type:function size:0x3F4 +setupObjSaveDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017DC50; // type:function size:0x398 +setupObjLightLineDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017DFF0; // type:function size:0x478 +setupNpcBNusiDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E470; // type:function size:0x2B0 +setupObjTerryShopDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E720; // type:function size:0x190 +setupObjRoAtTargetDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E8B0; // type:function size:0xFC +setupObjD3DummyDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E9B0; // type:function size:0xA20 +setupObjSealedDoorDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F3D0; // type:function size:0x110 +setupObjHarpHintDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F4E0; // type:function size:0x1C0 +setupNpcBeeDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F6A0; // type:function size:0x1D8 setupStageDrawCommands__15dLytMapIcon01_cFv = .text:0x8017F880; // type:function size:0xA8 -fn_8017F930 = .text:0x8017F930; // type:function size:0x268 -fn_8017FBA0 = .text:0x8017FBA0; // type:function size:0x954 -fn_80180500 = .text:0x80180500; // type:function size:0x750 -fn_80180C50 = .text:0x80180C50; // type:function size:0x1C8 -fn_80180E20 = .text:0x80180E20; // type:function size:0x134 -fn_80180F60 = .text:0x80180F60; // type:function size:0x240 +setupTgMapMarkDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F930; // type:function size:0x268 +setupTgMapMarkDrawCommand1__15dLytMapIcon01_cFP12dTgMapMark_c = .text:0x8017FBA0; // type:function size:0x954 +setupTgMapMarkDrawCommand2__15dLytMapIcon01_cFP12dTgMapMark_c = .text:0x80180500; // type:function size:0x750 +setupTgMapInstDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180C50; // type:function size:0x1C8 +setupTgForceGetFlagDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180E20; // type:function size:0x134 +setupTgInsectDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180F60; // type:function size:0x240 setupLinkDrawCommand__15dLytMapIcon01_cFv = .text:0x801811A0; // type:function size:0x50 -fn_801811F0 = .text:0x801811F0; // type:function size:0x14C -fn_80181340 = .text:0x80181340; // type:function size:0x1B8 -fn_80181500 = .text:0x80181500; // type:function size:0xC8 +setupLinkDrawCommand1__15dLytMapIcon01_cFP7dAcPy_c = .text:0x801811F0; // type:function size:0x14C +setupLinkDrawCommand2__15dLytMapIcon01_cFv = .text:0x80181340; // type:function size:0x1B8 +setupCloudBigDrawCommand__15dLytMapIcon01_cFv = .text:0x80181500; // type:function size:0xC8 setupTriforceDrawCommands__15dLytMapIcon01_cFv = .text:0x801815D0; // type:function size:0x130 -fn_80181700 = .text:0x80181700; // type:function size:0x178 -fn_80181880 = .text:0x80181880; // type:function size:0xC4 -fn_80181950 = .text:0x80181950; // type:function size:0x30 -fn_80181980 = .text:0x80181980; // type:function size:0x64 -fn_801819F0 = .text:0x801819F0; // type:function size:0xB0 -fn_80181AA0 = .text:0x80181AA0; // type:function size:0x11C -fn_80181BC0 = .text:0x80181BC0; // type:function size:0x78 +updateScale__15dLytMapIcon01_cFv = .text:0x80181700; // type:function size:0x178 +fn_80181880__15dLytMapIcon01_cCFPQ34nw4r3lyt4PanePQ34nw4r3lyt4PaneR7mVec2_c = .text:0x80181880; // type:function size:0xC4 +recordAnimVisState__15dLytMapIcon01_cFv = .text:0x80181950; // type:function size:0x30 +transitionAnims__15dLytMapIcon01_cFv = .text:0x80181980; // type:function size:0x64 +checkBoundingPointing__15dLytMapIcon01_cFv = .text:0x801819F0; // type:function size:0xB0 +sortPanes__15dLytMapIcon01_cFv = .text:0x80181AA0; // type:function size:0x11C +isPointingAtBounding__15dLytMapIcon01_cCFPQ34nw4r3lyt4Pane = .text:0x80181BC0; // type:function size:0x78 fn_80181C40__15dLytMapIcon01_cFv = .text:0x80181C40; // type:function size:0x94 -fn_80181CE0 = .text:0x80181CE0; // type:function size:0x68C -fn_80182370 = .text:0x80182370; // type:function size:0x78 -fn_801823F0 = .text:0x801823F0; // type:function size:0x28C -fn_80182680 = .text:0x80182680; // type:function size:0x8C8 -fn_80182F50 = .text:0x80182F50; // type:function size:0x42C +build__15dLytMapIcon00_cFPQ23d2d10ResAccIf_c = .text:0x80181CE0; // type:function size:0x68C +remove__15dLytMapIcon00_cFv = .text:0x80182370; // type:function size:0x78 +execute__15dLytMapIcon00_cFv = .text:0x801823F0; // type:function size:0x28C +draw__15dLytMapIcon00_cFv = .text:0x80182680; // type:function size:0x8C8 +resetDrawCommands__15dLytMapIcon00_cFv = .text:0x80182F50; // type:function size:0x42C checksDungeonCompletionFlags = .text:0x80183380; // type:function size:0x1C0 fn_80183540 = .text:0x80183540; // type:function size:0x8 fn_80183550 = .text:0x80183550; // type:function size:0x8 @@ -10062,15 +10060,15 @@ fn_80189530 = .text:0x80189530; // type:function size:0x80 fn_801895B0 = .text:0x801895B0; // type:function size:0x114 fn_801896D0 = .text:0x801896D0; // type:function size:0x78 fn_80189750 = .text:0x80189750; // type:function size:0x74 -fn_801897D0 = .text:0x801897D0; // type:function size:0x168 -fn_80189940 = .text:0x80189940; // type:function size:0x8C -fn_801899D0 = .text:0x801899D0; // type:function size:0xEC -fn_80189AC0 = .text:0x80189AC0; // type:function size:0x68 +build__16dLytMapMarkers_cFPQ23d2d10ResAccIf_c = .text:0x801897D0; // type:function size:0x168 +remove__16dLytMapMarkers_cFv = .text:0x80189940; // type:function size:0x8C +execute__16dLytMapMarkers_cFv = .text:0x801899D0; // type:function size:0xEC +draw__16dLytMapMarkers_cFv = .text:0x80189AC0; // type:function size:0x68 setIslandNamesOn__16dLytMapMarkers_cFb = .text:0x80189B30; // type:function size:0x50 fn_80189B80 = .text:0x80189B80; // type:function size:0x4 -fn_80189B90 = .text:0x80189B90; // type:function size:0x27C -fn_80189E10 = .text:0x80189E10; // type:function size:0xF4 -fn_80189F10 = .text:0x80189F10; // type:function size:0x8C +drawPopups__16dLytMapMarkers_cFv = .text:0x80189B90; // type:function size:0x27C +resetPopups__16dLytMapMarkers_cFv = .text:0x80189E10; // type:function size:0xF4 +loadPopups__16dLytMapMarkers_cFv = .text:0x80189F10; // type:function size:0x8C getPouchSlotCount__Fb = .text:0x80189FA0; // type:function size:0x6C isPouchItem = .text:0x8018A010; // type:function size:0x88 isItemShield__Fl = .text:0x8018A0A0; // type:function size:0x18 @@ -10420,11 +10418,11 @@ GoddessChestsOpenedCounter__getMaxGoddessChests = .text:0x80194820; // type:func GoddessChestsOpenedCounter__init = .text:0x80194830; // type:function size:0x3C angleToRotate = .text:0x80194870; // type:function size:0x194 fn_80194A10 = .text:0x80194A10; // type:function size:0xC -fn_80194A20 = .text:0x80194A20; // type:function size:0xC -fn_80194A30 = .text:0x80194A30; // type:function size:0x24 +getStatueType__10dAcOSave_cCFv = .text:0x80194A20; // type:function size:0xC +getStatueNameId__10dAcOSave_cCFv = .text:0x80194A30; // type:function size:0x24 fn_80194A60 = .text:0x80194A60; // type:function size:0x2C fn_80194A90 = .text:0x80194A90; // type:function size:0x58 -fn_80194AF0 = .text:0x80194AF0; // type:function size:0x28 +checkStatueFlag__10dAcOSave_cCFv = .text:0x80194AF0; // type:function size:0x28 fn_80194B20 = .text:0x80194B20; // type:function size:0x8 fn_80194B30 = .text:0x80194B30; // type:function size:0x44 fn_80194B80 = .text:0x80194B80; // type:function size:0x8 @@ -13507,7 +13505,7 @@ AcItem__isLifeTreeFruit = .text:0x80251060; // type:function size:0x8 AcItem__isItemAnyRupee = .text:0x80251070; // type:function size:0x34 AcItem__isItemAnyTear = .text:0x802510B0; // type:function size:0x8 AcItem__isBombRefill = .text:0x802510C0; // type:function size:0x8 -AcItem__isAnyTriforce = .text:0x802510D0; // type:function size:0x8 +isTriforce__9dAcItem_cCFv = .text:0x802510D0; // type:function size:0x8 fn_802510E0 = .text:0x802510E0; // type:function size:0x44 fn_80251130 = .text:0x80251130; // type:function size:0x44 fn_80251180 = .text:0x80251180; // type:function size:0x44 @@ -33865,7 +33863,7 @@ __vt__29sFState_c<16dLytMapPinIcon_c> = .data:0x80520B38; // type:object size:0x lbl_80520B50 = .data:0x80520B50; // type:object size:0xC lbl_80520B5C = .data:0x80520B5C; // type:object size:0xC lbl_80520B68 = .data:0x80520B68; // type:object size:0xC -lbl_80520B74 = .data:0x80520B74; // type:object size:0xC +__vt__14dLytMapPlace_c = .data:0x80520B74; // type:object size:0xC __vt__14dLytMapPopup_c = .data:0x80520B80; // type:object size:0xC __vt__16dLytMapCapture_c = .data:0x80520B8C; // type:object size:0xC __vt__55sFStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c> = .data:0x80520B98; // type:object size:0x30 @@ -35352,7 +35350,7 @@ lbl_8052A6D0 = .data:0x8052A6D0; // type:object size:0x88 jumptable_8052A758 = .data:0x8052A758; // type:object size:0xA4 scope:local lbl_8052A7FC = .data:0x8052A7FC; // type:object size:0xC lbl_8052A808 = .data:0x8052A808; // type:object size:0x18 -lbl_8052A820 = .data:0x8052A820; // type:object size:0x20 +__vt__16dLytMapMarkers_c = .data:0x8052A820; // type:object size:0x20 __vt__15dLytMapIcon00_c = .data:0x8052A840; // type:object size:0x20 __vt__15dLytMapIcon01_c = .data:0x8052A860; // type:object size:0x20 lbl_8052A880 = .data:0x8052A880; // type:object size:0x10 @@ -40125,8 +40123,8 @@ lbl_80572838 = .sdata:0x80572838; // type:object size:0x8 lbl_80572840 = .sdata:0x80572840; // type:object size:0x8 lbl_80572848 = .sdata:0x80572848; // type:object size:0x8 lbl_80572850 = .sdata:0x80572850; // type:object size:0x4 -lbl_80572854 = .sdata:0x80572854; // type:object size:0x8 -lbl_8057285C = .sdata:0x8057285C; // type:object size:0xC +lbl_80572854 = .sdata:0x80572854; // type:object size:0x7 data:string +lbl_8057285C = .sdata:0x8057285C; // type:object size:0x7 data:string @LOCAL@build__10dLytNote_cFPQ23d2d10ResAccIf_c@sPaneName = .sdata:0x80572868; // type:object size:0x4 scope:local data:4byte @8144 = .sdata:0x80572870; // type:object size:0x1 scope:local data:string @24731 = .sdata:0x80572878; // type:object size:0x1 scope:local diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index e0a6ae91..91bfba42 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -79,6 +79,7 @@ public: static bool isRupee(ITEM_ID item); static bool isKeyPiece(ITEM_ID item); static bool isTreasure(ITEM_ID item); + bool isTriforce() const; static bool getItemGetEventName(u16 item, const char **outName); static void itemGetEventStart(dAcBase_c *); diff --git a/include/d/a/obj/d_a_obj_save.h b/include/d/a/obj/d_a_obj_save.h index 0c5a7e6e..9f2222a3 100644 --- a/include/d/a/obj/d_a_obj_save.h +++ b/include/d/a/obj/d_a_obj_save.h @@ -17,6 +17,16 @@ public: STATE_FUNC_DECLARE(dAcOSave_c, LightShaft); STATE_FUNC_DECLARE(dAcOSave_c, Escape); + bool checkStatueFlag() const; + u32 getStatueType() const; + u32 getStatueNameId() const; + + enum StatueType { + TYPE_NORMAL = 0, + TYPE_OVERWORLD = 1, + TYPE_DUNGEON = 2, + }; + private: /* 0x??? */ STATE_MGR_DECLARE(dAcOSave_c); }; diff --git a/include/d/flag/storyflag_map.h b/include/d/flag/storyflag_map.h index 7e6b6743..759bf0ef 100644 --- a/include/d/flag/storyflag_map.h +++ b/include/d/flag/storyflag_map.h @@ -247,17 +247,17 @@ enum StoryFlags_e { /** [Faron light pillar] * Story Flag #46 (0x002E) - JP 805ACD67 0x80 / US 805A9AE7 0x80 */ - STORYFLAG_46, + STORYFLAG_FARON_PILLAR_OPENED, /** [Eldin light pillar] * Story Flag #47 (0x002F) - JP 805ACD66 0x01 / US 805A9AE6 0x01 */ - STORYFLAG_47, + STORYFLAG_ELDIN_PILLAR_OPENED, /** [Lanayru light pillar (Eldin Volcano, Digging Mitts Cave, FS Entrance, Volcano Summit Waterfall layer 2 / * Lanayru Mines layer 1 / Temple of Time layer 1)] Story Flag #48 (0x0030) - JP 805ACD66 0x02 / US 805A9AE6 0x02 */ - STORYFLAG_48, + STORYFLAG_LANAYRU_PILLAR_OPENED, /** [Talk to Headmaster to learn about Windmills] * Story Flag #49 (0x0031) - JP 805ACD66 0x04 / US 805A9AE6 0x04 @@ -703,7 +703,7 @@ enum StoryFlags_e { * Screen) (Faron Woods, Deep Woods, Inside Great Tree layer 1)] Story Flag #137 (0x0089) - JP 805ACD64 0x80 / US * 805A9AE4 0x80 */ - STORYFLAG_137, + STORYFLAG_FARON_DISCOVERED, /** [Cutscene near sealed temple entrance first time in sealed grounds (Sealed Temple layer 1)] * Story Flag #138 (0x008A) - JP 805ACD67 0x01 / US 805A9AE7 0x01 @@ -928,7 +928,7 @@ enum StoryFlags_e { /** [Eldin Volcano Introductory Cutscene (Eldin Layer 1 only) (if set it activates Statue select screen on entering * Eldin Pillar)] Story Flag #182 (0x00B6) - JP 805ACD66 0x20 / US 805A9AE6 0x20 */ - STORYFLAG_182, + STORYFLAG_ELDIN_DISCOVERED, /** [Earth Temple Introductory Cutscene] * Story Flag #183 (0x00B7) - JP 805ACD66 0x40 / US 805A9AE6 0x40 @@ -968,7 +968,7 @@ enum StoryFlags_e { /** [Lanayru Mines Introductory Cutscene (Lanayru Desert layer 1)] * Story Flag #190 (0x00BE) - JP 805ACD6D 0x80 / US 805A9AED 0x80 */ - STORYFLAG_190, + STORYFLAG_LANAYRU_DISCOVERED, /** [(not implemented yet -- 7F62)] * Story Flag #191 (0x00BF) - JP from 805ACE57 0x40 to 805ACE56 0x01 / US from 805A9BD7 0x40 to 805A9BD6 0x01 @@ -1425,7 +1425,7 @@ enum StoryFlags_e { /** [Land on Fun Fun Island for first time (name on map appears)] * Story Flag #281 (0x0119) - JP 805ACD7B 0x08 / US 805A9AFB 0x08 */ - STORYFLAG_281, + STORYFLAG_FUN_FUN_ISLAND_DISCOVERED, /** [Land on Lumpy Pumpkin Island for first time (name on map appears)] * Story Flag #282 (0x011A) - JP 805ACD7B 0x10 / US 805A9AFB 0x10 @@ -1435,7 +1435,7 @@ enum StoryFlags_e { /** [Talk to Beedle on his island for first time (name on map appears)] * Story Flag #283 (0x011B) - JP 805ACD7B 0x20 / US 805A9AFB 0x20 */ - STORYFLAG_283, + STORYFLAG_BEEDLE_ISLAND_DISCOVERED, /** [Land on Bamboo Island for first time (name on map appears)] * Story Flag #284 (0x011C) - JP 805ACD7B 0x40 / US 805A9AFB 0x40 @@ -1450,7 +1450,7 @@ enum StoryFlags_e { /** [Talk to Strich at Bug Heaven for first time (name on map appears)] * Story Flag #286 (0x011E) - JP 805ACD7A 0x01 / US 805A9AFA 0x01 */ - STORYFLAG_286, + STORYFLAG_BUG_HAVEN_DISCOVERED, /** [] * Story Flag #287 (0x011F) - JP 805ACD7A 0x02 / US 805A9AFA 0x02 @@ -1460,7 +1460,7 @@ enum StoryFlags_e { /** [Bilocyte fight triggered] * Story Flag #288 (0x0120) - JP 805ACD7A 0x04 / US 805A9AFA 0x04 */ - STORYFLAG_288, + STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED, /** [Owlan's wooden shield] * Story Flag #289 (0x0121) - JP 805ACD7A 0x08 / US 805A9AFA 0x08 @@ -1917,7 +1917,7 @@ enum StoryFlags_e { /** [Thunderhead entered for first time] * Story Flag #379 (0x017B) - JP 805ACD85 0x02 / US 805A9B05 0x02 */ - STORYFLAG_379, + STORYFLAG_THUNDERHEAD_ENTERED, /** [Parrow gives his Crystal Sidequest (to find Orielle)] * Story Flag #380 (0x017C) - JP 805ACD8A 0x40 / US 805A9B0A 0x40 @@ -3568,7 +3568,7 @@ enum StoryFlags_e { /** [Enter Beedle's Shop for first time] * Story Flag #709 (0x02C5) - JP 805ACDA2 0x80 / US 805A9B22 0x80 */ - STORYFLAG_709, + STORYFLAG_BEEDLE_SHOP_ENTERED, /** [Sets after Treasure dowsing] * Story Flag #710 (0x02C6) - JP 805ACDA5 0x01 / US 805A9B25 0x01 diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 33bb92c1..82aab81b 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -596,11 +596,7 @@ private: /* 0x0FA0 */ dLytMapFloorBtnMgr_c mFloorBtnMgr; /* 0x16B4 */ dLytMapPinIconAggregate_c mPinIconAggregate; /* 0x2060 */ dLytMapMarkers_c mMarkers; - - /* 0x5F54 */ u8 _0x5F54[0x64C0 - 0x5F54]; - /* 0x64C0 */ dLytMapFootPrints_c mFootPrints; - /* 0x6664 */ dLytMapPutIcon_c mPutIcon; /* 0x6704 */ dLytMapSaveObj_c mSaveObjs[12]; /* 0x79C4 */ dLytMapSaveCaption_c mSaveCaption; @@ -674,7 +670,12 @@ private: /* 0x8CAC */ u8 field_0x8CAC; /* 0x8CAD */ u8 field_0x8CAD; - /* 0x8CAE */ u8 _0x8CAE[0x8CBC - 0x8CAE]; + /* 0x8CAE */ u8 _0x8CAE[0x8CB0 - 0x8CAE]; + + /* 0x8CB0 */ u32 field_0x8CB0; + /* 0x8CB4 */ UNKWORD field_0x8CB4; + + /* 0x8CB8 */ u8 _0x8CB8[0x8CBC - 0x8CB8]; /* 0x8CBC */ nw4r::lyt::Bounding *mpMapBounding; /* 0x8CC0 */ bool field_0x8CC0; diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index d5e14f60..c11584f4 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -116,6 +116,26 @@ public: mFloor = floor; } + u8 getField_0x4C() const { + return field_0x4C; + } + + u8 getField_0x4D() const { + return field_0x4D; + } + + u8 getField_0x4F() const { + return field_0x4F; + } + + UNKWORD getField_0x50() const { + return field_0x50; + } + + u8 getField_0x54() const { + return field_0x54; + } + void projectOntoMap(mVec2_c &result, const mVec3_c &position) const; void unprojectFromMap(mVec3_c &result, const mVec2_c &position) const; void unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const; diff --git a/include/d/lyt/d_lyt_map_markers.h b/include/d/lyt/d_lyt_map_markers.h index 1a995f65..b95d627b 100644 --- a/include/d/lyt/d_lyt_map_markers.h +++ b/include/d/lyt/d_lyt_map_markers.h @@ -13,14 +13,21 @@ class dAcBase_c; class dAcTbox_c; +class dAcPy_c; +class dTgMapMark_c; // Size: 0x1C -struct MapUnkStruct1 { +struct dLytMapPopupState { public: - MapUnkStruct1() {} - ~MapUnkStruct1() {} + dLytMapPopupState() : textPos(0.0f, 0.0f) {} + ~dLytMapPopupState() {} - /* 0x00 */ u8 _0x00[0x1C]; + /* 0x00 */ f32 inAnimFrame; + /* 0x04 */ mVec2_c textPos; + /* 0x0C */ mVec2_c boundingPos; + /* 0x14 */ bool visible; + /* 0x15 */ u8 objId; + /* 0x18 */ const char *labelPrefix; }; /** @@ -44,32 +51,34 @@ public: }; // Size: 0x20 -struct MapUnkStruct3 { +struct dLytMapPopupConfig { public: - MapUnkStruct3() {} - ~MapUnkStruct3() {} + dLytMapPopupConfig() : textPos(0.0f, 0.0f) {} + ~dLytMapPopupConfig() {} - /* 0x00 */ UNKWORD field_0x00; + /* 0x00 */ s32 cmdIdx; /* 0x04 */ nw4r::lyt::Bounding *bounding; - /* 0x08 */ f32 field_0x08; - /* 0x0C */ f32 field_0x0C; - /* 0x10 */ mVec2_c field_0x10; - /* 0x18 */ u8 field_0x18; - /* 0x19 */ u8 field_0x19; - /* 0x1C */ const char *field_0x1C; + /* 0x08 */ mVec2_c textPos; + /* 0x10 */ mVec2_c boundingPos; + /* 0x18 */ bool pointedAt; + /* 0x19 */ u8 objId; + /* 0x1C */ const char *labelPrefix; }; -// Size: 0xC -struct MapUnkStruct4 { +/** + * Copy of dLytMapIcon01DrawCommand + * + * Size: 0xC + */ +struct dLytMapIcon00DrawCommand { public: - MapUnkStruct4() {} - ~MapUnkStruct4() {} + dLytMapIcon00DrawCommand() {} + ~dLytMapIcon00DrawCommand() {} - /* 0x00 */ f32 field_0x00; - /* 0x04 */ f32 field_0x04; - /* 0x08 */ u16 field_0x08; - /* 0x0A */ u8 field_0x0A; - /* 0x0B */ u8 field_0x0B; + /* 0x00 */ mVec2_c position; + /* 0x08 */ mAng rotation; + /* 0x0A */ u8 paneIdx; + /* 0x0B */ u8 passIdx; }; /** @@ -82,19 +91,25 @@ struct dLytMapIconAnimState { public: // no ctor/dtor - /* 0x00 */ UNKWORD cmdIndex; + /* 0x00 */ s32 cmdIndex; /* 0x04 */ f32 frame; - /* 0x08 */ u8 animIn; - /* 0x09 */ u8 animOut; - /* 0x0A */ u8 idleVisible; - /* 0x0B */ u8 field_0x0B; - /* 0x0C */ bool visible; + /* 0x08 */ bool animIn; + /* 0x09 */ bool animOut; + /* 0x0A */ bool visible; + /* 0x0B */ bool prevVisible; + /* 0x0C */ bool render; }; /** 2D UI - Map - Popup text that appears when pointing at certain points of interest */ class dLytMapPopup_c { public: - dLytMapPopup_c() : mLabel("MAP_00") {} + dLytMapPopup_c() + : mLabel("MAP_00"), + mModeCheckResult(MODE_MAX), + field_0x178(0), + mMaxScale(0.0f), + field_0x180(0), + field_0x184(0) {} virtual ~dLytMapPopup_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -103,18 +118,27 @@ public: void draw(); void setLabel(const char *label); + void realizeText(); void setInout(f32 value); f32 getTextRenderWidth() const; + f32 getInAnimDuration() const { + return mAnm[1].getLastFrame(); + } + + void setPosition(const mVec2_c &pos) { + mPosition = pos; + } + private: enum ModeCheck_e { MODE_TRANSITION_TO_ZOOM = 2, MODE_TRANSITION_TO_STAGE = 3, MODE_STABLE_STAGE = 4, MODE_STABLE_ZOOM = 5, + MODE_MAX = 6, }; - void realizeText(); void setInitialState(); void checkMapMode(); @@ -132,12 +156,14 @@ private: /* 0x178 */ u8 field_0x178; /* 0x17C */ f32 mMaxScale; /* 0x180 */ UNKWORD field_0x180; + /* 0x184 */ UNKWORD field_0x184; }; /** 2D UI - Map - Text holding area names (on the world/province view, or exits on the stage view) */ class dLytMapPlace_c { public: - dLytMapPlace_c() {} + dLytMapPlace_c() + : mLabel("MAP_02"), mModeCheckResult(MODE_MAX), field_0x1C0(0.0f), field_0x1C4(0.0f), mMaxScale(0.0f) {} virtual ~dLytMapPlace_c() {} bool build(d2d::ResAccIf_c *resAcc); @@ -157,6 +183,7 @@ private: MODE_TRANSITION_TO_STAGE = 3, MODE_STABLE_STAGE = 4, MODE_STABLE_ZOOM = 5, + MODE_MAX = 6, }; void realizeText(); @@ -181,27 +208,25 @@ private: /* 0x1D8 */ f32 mMaxScale; }; -class dLytMapIcon00_c : public m2d::Base_c { -public: - dLytMapIcon00_c() {} - -private: - /* 0x0104 */ d2d::LytBase_c mLyt; - /* 0x0194 */ d2d::AnmGroup_c mAnm[29]; - /* 0x0970 */ dCursorHitCheckLyt_c mCsHitCheck; - /* 0x0998 */ MapUnkStruct4 mUnk4[100]; - /* 0x0E5B */ u8 field_0x0E5B[100]; - /* 0x0F20 */ u8 field_0x0F20[100]; - /* 0x0F84 */ mVec3_c field_0x0F84[77]; - /* 0x1342 */ u8 field_0x1342[100]; - /* 0x13A8 */ u8 field_0x13A8[100]; - /* 0x1410 */ MapUnkStruct3 mUnk3[30]; - /* 0x1D70 */ dLytMapPlace_c mPlace; -}; - class dLytMapIcon01_c : public m2d::Base_c { + friend class dLytMapMarkers_c; + public: - dLytMapIcon01_c() {} + dLytMapIcon01_c() + : field_0x000D(0), + mShowIslandNames(false), + mModeCheckResult(MODE_MAX), + field_0x0C70(0), + field_0x0C83(0), + field_0x0C84(0), + field_0x1838(0.0f), + field_0x183C(0.0f), + field_0x1840(0.0f), + field_0x1844(false), + field_0x1845(0), + field_0x1848(0), + field_0x184C(false), + field_0x184D(false) {} virtual void draw() override; virtual bool build(d2d::ResAccIf_c *resAcc); virtual bool remove(); @@ -214,36 +239,69 @@ private: MODE_TRANSITION_TO_STAGE = 3, MODE_STABLE_STAGE = 4, MODE_STABLE_ZOOM = 5, + MODE_MAX = 6, }; void setupActorDrawCommands(); void setupStageDrawCommands(); void setupLinkDrawCommand(); + void setupLinkDrawCommand1(dAcPy_c *ac); + void setupLinkDrawCommand2(); + void setupCloudBigDrawCommand(); void setupTriforceDrawCommands(); - void setupUnkDrawCommand(); - void sortDrawCommands(); + void sortPanes(); void setupTboxDrawCommand(dAcBase_c *actor); void setupTboxDrawCommandGoddessClosed(dAcTbox_c *box); void setupTboxDrawCommandOpen(dAcTbox_c *box); void setupTboxDrawCommandClosed(dAcTbox_c *box); + void setupNpcKenseiDrawCommand(dAcBase_c *actor); + void setupObjShutterDrawCommand(dAcBase_c *actor); + void setupObjDoorDrawCommand(dAcBase_c *actor); + void setupObjSaveDrawCommand(dAcBase_c *actor); + void setupObjLightLineDrawCommand(dAcBase_c *actor); + void setupNpcBNusiDrawCommand(dAcBase_c *actor); + void setupObjTerryShopDrawCommand(dAcBase_c *actor); + void setupObjRoAtTargetDrawCommand(dAcBase_c *actor); + void setupObjD3DummyDrawCommand(dAcBase_c *actor); + void setupObjSealedDoorDrawCommand(dAcBase_c *actor); + void setupObjHarpHintDrawCommand(dAcBase_c *actor); + void setupNpcBeeDrawCommand(dAcBase_c *actor); + + void setupTgMapMarkDrawCommand(dAcBase_c *actor); + void setupTgMapMarkDrawCommand1(dTgMapMark_c *actor); + void setupTgMapMarkDrawCommand2(dTgMapMark_c *actor); + void setupTgMapInstDrawCommand(dAcBase_c *actor); + void setupTgForceGetFlagDrawCommand(dAcBase_c *actor); + void setupTgInsectDrawCommand(dAcBase_c *actor); void setLinkTunic(s32 type); - void setGoddessStatue(bool present); + void setGoddessStatue(u32 present); void setTerry(bool present); - void drawAreaLight(s32 color, nw4r::lyt::Pane *pane); - void drawSaveObj(s32 color, nw4r::lyt::Pane *pane); - void drawCloud(s32 alpha, nw4r::lyt::Pane *pane); + void setAreaLight(u32 color, nw4r::lyt::Pane *pane); + void setCloud(u32 alpha, nw4r::lyt::Pane *pane); + void setSaveObj(u32 color, nw4r::lyt::Pane *pane); void drawWithAnimIn(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame); void drawWithAnimOut(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame); void drawFullyIn(u32 paneIdx, nw4r::lyt::Pane *pane); + void fn_80181C40(); + void fn_80181880(nw4r::lyt::Pane *, nw4r::lyt::Pane *, mVec2_c &) const; + void checkMapMode(); void loadFlags(); + void updateScale(); + void recordAnimVisState(); + void transitionAnims(); + void checkBoundingPointing(); + bool isPointingAtBounding(nw4r::lyt::Pane *pane) const; + + /* 0x000D */ u8 field_0x000D; + /* 0x000E */ bool mShowIslandNames; /* 0x0010 */ nw4r::lyt::Bounding *mpBoundings[59]; /* 0x00FC */ nw4r::lyt::Pane *mpSpecialPanes[27]; /* 0x0168 */ nw4r::lyt::Pane *mpSpecialPictures[27]; @@ -256,28 +314,27 @@ private: /* 0x07BC */ dLytMapIcon01DrawCommand mCommands[100]; /* 0x0C6C */ s32 mModeCheckResult; /* 0x0C70 */ s32 field_0x0C70; - - /* 0x0C74 */ u8 field_0x0C74; - /* 0x0C75 */ u8 field_0x0C75; - /* 0x0C76 */ u8 field_0x0C76; - /* 0x0C77 */ u8 field_0x0C77; - /* 0x0C78 */ u8 field_0x0C78; - /* 0x0C79 */ u8 field_0x0C79; - /* 0x0C7A */ u8 field_0x0C7A; - /* 0x0C7B */ u8 field_0x0C7B; - /* 0x0C7C */ u8 field_0x0C7C; - /* 0x0C7D */ u8 field_0x0C7D; - /* 0x0C7E */ u8 field_0x0C7E; - /* 0x0C7F */ u8 field_0x0C7F; - /* 0x0C80 */ u8 field_0x0C80; - /* 0x0C81 */ u8 field_0x0C81; - /* 0x0C82 */ u8 field_0x0C82; + /* 0x0C74 */ bool mFunFunIslandDiscovered; + /* 0x0C75 */ bool mLumpyPumkpinDiscovered; + /* 0x0C76 */ bool mBeedleIslandDiscovered; + /* 0x0C77 */ bool mBambooIslandDiscovered; + /* 0x0C78 */ bool mIsleOfSongsDiscovered; + /* 0x0C79 */ bool mBugHavenDiscovered; + /* 0x0C7A */ bool mBilocyteFightTriggered; + /* 0x0C7B */ bool mFaronPillarOpened; + /* 0x0C7C */ bool mFaronDiscovered; + /* 0x0C7D */ bool mEldinPillarOpened; + /* 0x0C7E */ bool mEldinDiscovered; + /* 0x0C7F */ bool mLanayruPillarOpened; + /* 0x0C80 */ bool mLanaryuDiscovered; + /* 0x0C81 */ bool mThunderheadEntered; + /* 0x0C82 */ bool mBeedleShopEntered; /* 0x0C83 */ u8 field_0x0C83; /* 0x0C84 */ u8 field_0x0C84; /* 0x0C85 */ u8 field_0x0C85[100]; /* 0x0CE9 */ u8 mPassIdxes[35]; - /* 0x0D0C */ s32 field_0xD0C; - /* 0x0D10 */ s32 field_0xD10; + /* 0x0D0C */ s32 mCurrentFloor; + /* 0x0D10 */ s32 mLastFloor; /* 0x0D14 */ u8 mNumCommandsPerPass[35]; /* 0x0D37 */ u8 mNumCommands; @@ -296,41 +353,149 @@ private: /* 0x0DAF */ u8 _0x0DAF[0x0E13 - 0x0DAF]; /* 0x0E13 */ u8 field_0x0E13; - /* 0x0E14 */ MapUnkStruct3 mUnk3[56]; + /* 0x0E14 */ dLytMapPopupConfig mPopupConfigs[56]; /* 0x1514 */ dLytMapIconAnimState mIconAnims[50]; /* 0x1834 */ s32 mNumAnims; /* 0x1838 */ f32 field_0x1838; /* 0x183C */ f32 field_0x183C; - - /* 0x1840 */ u8 _0x183C[0x1845 - 0x1840]; - + /* 0x1840 */ f32 field_0x1840; + /* 0x1844 */ bool field_0x1844; /* 0x1845 */ u8 field_0x1845; - /* 0x1846 */ u8 _0x1846[0x184C - 0x1846]; + /* 0x1848 */ UNKWORD field_0x1848; /* 0x184C */ bool field_0x184C; + /* 0x184D */ bool field_0x184D; +}; + +class dLytMapIcon00_c : public m2d::Base_c { +public: + dLytMapIcon00_c() + : mModeCheckResult(MODE_MAX), + field_0x0E4C(0), + field_0x0E59(0), + field_0x0E5A(0), + field_0x13A6(0), + field_0x13A7(0), + field_0x1CD0(0.0f, 0.0f, 0.0f), + field_0x1CDC(0), + field_0x1CDD(0), + field_0x1CDE(0), + field_0x1CE0(0), + field_0x1CE4(0), + field_0x1CE5(0), + field_0x1CE6(0), + field_0x1CE7(0) {} + + virtual void draw() override; + virtual bool build(d2d::ResAccIf_c *resAcc); + virtual bool remove(); + virtual bool execute(); + virtual void resetDrawCommands(); + +private: + enum ModeCheck_e { + MODE_TRANSITION_TO_ZOOM = 2, + MODE_TRANSITION_TO_STAGE = 3, + MODE_STABLE_STAGE = 4, + MODE_STABLE_ZOOM = 5, + MODE_MAX = 6, + }; + + void fn_80189750(); + + /* 0x0010 */ u8 _0x0010[0x0104 - 0x0010]; + + /* 0x0104 */ d2d::LytBase_c mLyt; + /* 0x0194 */ d2d::AnmGroup_c mAnm[29]; + + /* 0x08D4 */ u8 _0x08D4[0x0970 - 0x08D4]; + + /* 0x0970 */ dCursorHitCheckLyt_c mCsHitCheck; + /* 0x0998 */ dLytMapIcon00DrawCommand mCommands[100]; + /* 0x0E48 */ s32 mModeCheckResult; + /* 0x0E4C */ UNKWORD field_0x0E4C; + /* 0x0E50 */ u8 field_0x0E50; + /* 0x0E51 */ u8 field_0x0E51; + /* 0x0E52 */ u8 field_0x0E52; + /* 0x0E53 */ u8 field_0x0E53; + /* 0x0E54 */ u8 field_0x0E54; + /* 0x0E55 */ u8 field_0x0E55; + /* 0x0E56 */ u8 field_0x0E56; + /* 0x0E57 */ u8 field_0x0E57; + /* 0x0E58 */ u8 field_0x0E58; + /* 0x0E59 */ u8 field_0x0E59; + /* 0x0E59 */ u8 field_0x0E5A; + /* 0x0E5B */ u8 field_0x0E5B[100]; + + /* 0x0EC0 */ u8 _0x0EC0[0x0EE4 - 0x0EC0]; + + /* 0x0EE4 */ s32 mNumCommands; + /* 0x0EE8 */ s32 field_0x0EE8; + /* 0x0EEC */ u8 field_0x0EEC[36]; + + /* 0x0F10 */ u8 _0x0F10[0x0F20 - 0x0F10]; + + /* 0x0F20 */ u8 field_0x0F20[100]; + + /* 0x0F84 */ mVec3_c field_0x0F84[77]; + + /* 0x1320 */ u8 _0x1320[0x1331 - 0x1320]; + + /* 0x1331 */ u8 mNumCommandsPerPass[17]; + /* 0x1342 */ u8 field_0x1342[100]; + /* 0x13A6 */ u8 field_0x13A6; + /* 0x13A6 */ u8 field_0x13A7; + /* 0x13A8 */ u8 field_0x13A8[100]; + /* 0x140C */ u8 field_0x140C; + /* 0x1410 */ dLytMapPopupConfig mPopupConfigs[30]; + /* 0x17D0 */ dLytMapPlace_c mPlace; + /* 0x19B8 */ dLytMapIconAnimState mIconAnims[50]; + /* 0x1CCC */ s32 mNumAnims; + /* 0x1CD0 */ mVec3_c field_0x1CD0; + /* 0x1CDC */ u8 field_0x1CDC; + /* 0x1CDD */ u8 field_0x1CDD; + /* 0x1CDE */ u8 field_0x1CDE; + /* 0x1CE0 */ UNKWORD field_0x1CE0; + /* 0x1CE4 */ u8 field_0x1CE4; + /* 0x1CE5 */ u8 field_0x1CE5; + /* 0x1CE6 */ u8 field_0x1CE6; + /* 0x1CE7 */ u8 field_0x1CE7; }; -// TODO, name made up class dLytMapMarkers_c : public m2d::Base_c { public: - dLytMapMarkers_c() : field_0x6F0(0), field_0x0702(0), field_0x0703(0), field_0x0704(0.0f) {} + dLytMapMarkers_c() + : mShowIslandNames(false), field_0x0702(0), field_0x0703(0), field_0x0704(0.0f), mNumPopups(0) {} virtual ~dLytMapMarkers_c() {} virtual void draw() override; - virtual void build(d2d::ResAccIf_c *resAcc); + virtual bool build(d2d::ResAccIf_c *resAcc); + virtual bool remove(); + virtual bool execute(); void setIslandNamesOn(bool on); - void fn_80189B90(); + void drawPopups(); void setField_0x6F4(const mVec2_c &v) { field_0x06F4 = v; } -private: - /* 0x0010 */ d2d::ResAccIf_c mResAcc1; - /* 0x0380 */ d2d::ResAccIf_c mResAcc2; + void setField_0x0703(u8 v) { + field_0x0703 = v; + } - /* 0x06F0 */ u8 field_0x6F0; + f32 getField_0x0704() const { + return field_0x0704; + } + +private: + void resetPopups(); + void loadPopups(); + + /* 0x0010 */ d2d::ResAccIf_c mResAcc00; + /* 0x0380 */ d2d::ResAccIf_c mResAcc01; + + /* 0x06F0 */ bool mShowIslandNames; /* 0x06F4 */ mVec2_c field_0x06F4; /* 0x06FC */ u8 _0x6FC[0x0702 - 0x06FC]; @@ -339,11 +504,11 @@ private: /* 0x0702 */ u8 field_0x0703; /* 0x0704 */ f32 field_0x0704; /* 0x0708 */ dLytMapPopup_c mMapPopup; - /* 0x088C */ u8 _0x088C[0x0894 - 0x088C]; - /* 0x0894 */ MapUnkStruct1 mUnk1[60]; - - /* 0x0F30 */ dLytMapIcon01_c mIcon01; - /* 0x2780 */ dLytMapIcon00_c mIcon00; + /* 0x0890 */ s32 mNumPopups; + /* 0x0894 */ dLytMapPopupState mPopups[60]; + /* 0x0F24 */ const dLytMapPopupConfig *mpPopupConfigs; + /* 0x0F28 */ dLytMapIcon01_c mIcon01; + /* 0x2778 */ dLytMapIcon00_c mIcon00; }; #endif diff --git a/include/toBeSorted/misc_actor.h b/include/toBeSorted/misc_actor.h index 081734e1..4024e1bc 100644 --- a/include/toBeSorted/misc_actor.h +++ b/include/toBeSorted/misc_actor.h @@ -1,6 +1,11 @@ #ifndef MISC_ACTOR_H #define MISC_ACTOR_H +// TODO - this header might be unnecessary; a lot of functions in +// the split corresponding to this header clearly are REL functions +// that were moved to the DOL because they need to be called from the DOL. +// So ideally all of these declarations were moved to REL class definitions... + bool checkIsInSkykeepPuzzle(); void restoreSkykeepPuzzleFromGlobal(); diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 97380752..29f03e66 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -2296,7 +2296,7 @@ void dLytMapMain_c::build() { } mMarkers.setField_0x6F4(boundingPos2); - + mPinIconAggregate.setUnk(&field_0xF1C); mpPaneBgAll01 = mLyt.findPane("N_mapBgAll_01"); @@ -2344,17 +2344,19 @@ void dLytMapMain_c::draw() { mFootPrints.draw(); } - if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM || mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM || + mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mMarkers.draw(); } if (field_0x8C68 != 3 && field_0x8C68 != 5 && field_0x8C94 != 2) { mPinIconAggregate.draw(); } - + fn_80143120(0); - if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) && (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { + if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) && + (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { mpZoomInOutPane->SetVisible(false); } else { mpZoomInOutPane->SetVisible(true); @@ -2362,11 +2364,12 @@ void dLytMapMain_c::draw() { mpScaleFlamePane->SetVisible(field_0x8DB5 ? true : false); mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo()); - if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && field_0x8C94 == 10) { + if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && + field_0x8C94 == 10) { fn_80138D80(); } fn_80143120(-2); - mMarkers.fn_80189B90(); + mMarkers.drawPopups(); mPutIcon.draw(); if (field_0x8C94 == 10) { mPopupInfo.draw(); @@ -2844,23 +2847,68 @@ void dLytMapMain_c::executeState_ResetPos() { } void dLytMapMain_c::finalizeState_ResetPos() {} -void dLytMapMain_c::initializeState_ResetPosWithFloorChange() {} -void dLytMapMain_c::executeState_ResetPosWithFloorChange() {} +void dLytMapMain_c::initializeState_ResetPosWithFloorChange() { + dPadNav::stopFSStickNav(); + mMapCapture.renderRequest(); +} +void dLytMapMain_c::executeState_ResetPosWithFloorChange() { + if (mMapCapture.isBusyRendering()) { + return; + } + dLytMapGlobal_c *global = getGlobal(); + mVec3_c pos; + fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + if (global->getMapScroll().squareDistanceToXZ(pos) >= 1.0f) { + mStateMgr.changeState(StateID_ResetPos); + } else { + mStateMgr.changeState(StateID_Active); + } +} void dLytMapMain_c::finalizeState_ResetPosWithFloorChange() {} -void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() {} -void dLytMapMain_c::executeState_EventSwBankSmall_Step1() {} +void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() { + field_0x8CB0 = sHio.field_0x1D; + field_0x8CB4 = 0; +} +void dLytMapMain_c::executeState_EventSwBankSmall_Step1() { + if (field_0x8CB0 != 0) { + field_0x8CB0--; + return; + } + + mMarkers.setField_0x0703(1); + mStateMgr.changeState(StateID_EventSwBankSmall_Step2); +} void dLytMapMain_c::finalizeState_EventSwBankSmall_Step1() {} -void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() {} -void dLytMapMain_c::executeState_EventSwBankSmall_Step2() {} +void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() { + field_0x8CB0 = mMarkers.getField_0x0704(); +} +void dLytMapMain_c::executeState_EventSwBankSmall_Step2() { + if (field_0x8CB0 != 0) { + field_0x8CB0--; + return; + } + mStateMgr.changeState(StateID_EventSwBankSmall_Step3); +} void dLytMapMain_c::finalizeState_EventSwBankSmall_Step2() {} -void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() {} -void dLytMapMain_c::executeState_EventSwBankSmall_Step3() {} +void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() { + field_0x8CB0 = sHio.field_0x1E; +} +void dLytMapMain_c::executeState_EventSwBankSmall_Step3() { + if (field_0x8CB0 != 0) { + field_0x8CB0--; + return; + } + + field_0x8D6B = 1; +} void dLytMapMain_c::finalizeState_EventSwBankSmall_Step3() {} -void dLytMapMain_c::initializeState_EventMapIntro_Step1() {} +void dLytMapMain_c::initializeState_EventMapIntro_Step1() { + field_0x8CB0 = sHio.field_0x1F; +} void dLytMapMain_c::executeState_EventMapIntro_Step1() {} void dLytMapMain_c::finalizeState_EventMapIntro_Step1() {} diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index 7c866d6b..41863ddf 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -2,24 +2,34 @@ #include "common.h" #include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" #include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_save.h" #include "d/a/obj/d_a_obj_tbox.h" +#include "d/d_cs_base.h" #include "d/d_cursor_hit_check.h" +#include "d/d_gfx.h" #include "d/d_message.h" #include "d/d_player.h" #include "d/d_player_act.h" #include "d/d_sc_game.h" #include "d/d_stage.h" +#include "d/d_stage_mgr.h" #include "d/flag/dungeonflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_map_global.h" #include "d/lyt/d_window.h" #include "d/snd/d_snd_small_effect_mgr.h" +#include "f/f_base.h" +#include "f/f_manager.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_bounding.h" #include "nw4r/lyt/lyt_pane.h" #include "nw4r/lyt/lyt_types.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { return mVec3_c(v.x, v.y, 0.0f); @@ -627,6 +637,8 @@ static const char *sMapIcon01BoundingNames[] = { #define MAP_ICON_01_BOUNDING_MUSHI_00 57 #define MAP_ICON_01_BOUNDING_AREALIGHT_00 58 +#define MAP_ICON_01_BOUNDING_COMMONICON_LAST (MAP_ICON_01_BOUNDING_COMMONICON_29 + 1) + #define MAP_ICON_01_NUM_BOUNDINGS 59 static const char *sMapIcon01SpecialPaneNames[] = { @@ -705,10 +717,15 @@ static const char *sMapIcon01SpecialPictureNames[] = { #define MAP_ICON_01_NUM_SPECIAL_PICTURES 27 +static const char *sSaveObjPrefix = "SAVEOBJ_NAME_"; static const char *sTerryOnOff = "N_terryOnOff_00"; bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) { - // TODO - ... + field_0x1848 = 30; + mCurrentFloor = dLytMapGlobal_c::GetInstance()->getFloor(); + field_0x0C83 = dLytMapGlobal_c::GetInstance()->getField_0x4F(); + field_0x0C84 = dLytMapGlobal_c::GetInstance()->getField_0x4C(); + mLastFloor = mCurrentFloor; mpResAcc = resAcc; mLyt.setResAcc(resAcc); mLyt.build("mapIcon_01.brlyt", nullptr); @@ -740,8 +757,8 @@ bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) { } // TODO - why 56 and not 59 - for (int i = 0; i < 56; i++) { - mUnk3[i].bounding = mpBoundings[i]; + for (int i = 0; i < MAP_ICON_01_BOUNDING_COMMONICON_LAST; i++) { + mPopupConfigs[i].bounding = mpBoundings[i]; } for (int i = 0; i < MAP_ICON_01_NUM_BOUNDINGS; i++) { @@ -766,32 +783,32 @@ bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) { } checkMapMode(); + loadFlags(); for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { mIconAnims[i].cmdIndex = 100; mIconAnims[i].frame = 0.0f; mIconAnims[i].animIn = false; mIconAnims[i].animOut = false; - mIconAnims[i].idleVisible = false; - mIconAnims[i].field_0x0B = 0; mIconAnims[i].visible = false; + mIconAnims[i].prevVisible = false; + mIconAnims[i].render = false; } setupActorDrawCommands(); setupStageDrawCommands(); setupLinkDrawCommand(); - if (field_0x0C70 == 1) { setupTriforceDrawCommands(); } if (field_0x0C70 == 4) { - setupUnkDrawCommand(); + setupCloudBigDrawCommand(); } - // TODO - ... - - sortDrawCommands(); + recordAnimVisState(); + transitionAnims(); + sortPanes(); mCsHitCheck.init(mLyt.getLayout()->GetRootPane(), 0x1, 0, 0); dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); @@ -814,10 +831,52 @@ bool dLytMapIcon01_c::execute() { mAnm[MAP_ICON_01_ANIM_TRES_OUT + i].setAnimEnable(false); } } - mLyt.calc(); + resetDrawCommands(); checkMapMode(); loadFlags(); + mCurrentFloor = dLytMapGlobal_c::GetInstance()->getFloor(); + field_0x0C83 = dLytMapGlobal_c::GetInstance()->getField_0x4F(); + field_0x0C84 = dLytMapGlobal_c::GetInstance()->getField_0x4C(); + + updateScale(); + setupActorDrawCommands(); + setupStageDrawCommands(); + setupLinkDrawCommand(); + if (field_0x0C70 == 1) { + setupTriforceDrawCommands(); + } + + if (field_0x0C70 == 4) { + setupCloudBigDrawCommand(); + } + + for (int i = 0; i < MAP_ICON_01_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + if (dLytMapGlobal_c::GetInstance()->getField_0x4D() && dLytMapGlobal_c::GetInstance()->getField_0x50() != 10) { + checkBoundingPointing(); + } + + mCsHitCheck.resetCachedHitboxes(); + mCsHitCheck.execute(); + + transitionAnims(); + recordAnimVisState(); + + if (!field_0x1844) { + field_0x1844 = true; + if (field_0x0C84 == 0) { + for (int i = 0; i < 50; i++) { + mIconAnims[i].animIn = false; + mIconAnims[i].animOut = false; + } + } + } + return true; } @@ -870,17 +929,17 @@ void dLytMapIcon01_c::draw() { } case MAP_ICON_01_PANE_AREALIGHT_00: { if (field_0x0D48 != 100 && field_0x0D48 == cmd) { - drawAreaLight(0, pane); + setAreaLight(0, pane); } else if (field_0x0D49 != 100 && field_0x0D49 == cmd) { - drawAreaLight(1, pane); + setAreaLight(1, pane); } else if (field_0x0D4A != 100 && field_0x0D4A == cmd) { - drawAreaLight(2, pane); + setAreaLight(2, pane); } break; } case MAP_ICON_01_PANE_SAVEICON_00: { if (field_0x0D4B[cmd] != 100) { - drawSaveObj(field_0x0D4B[cmd], pane); + setSaveObj(field_0x0D4B[cmd], pane); } break; } @@ -888,13 +947,13 @@ void dLytMapIcon01_c::draw() { if (paneIdx == MAP_ICON_01_PANE_CLOUDBIG_000) { if (dScGame_c::isCurrentStage("F020")) { - if (field_0x0C81) { - drawCloud(1, pane); + if (mThunderheadEntered) { + setCloud(1, pane); } else { - drawCloud(0, pane); + setCloud(0, pane); } } else if (dScGame_c::isCurrentStage("F023")) { - drawCloud(2, pane); + setCloud(2, pane); } mVec3_c rotate(0.0f, 0.0f, (-mapRot).degree2()); pane->SetRotate(rotate); @@ -914,15 +973,15 @@ void dLytMapIcon01_c::draw() { if (found == true) { if (field_0x0C84 && mIconAnims[i].animIn == true) { if (field_0x1845 == 1) { - mIconAnims[i].idleVisible = true; + mIconAnims[i].visible = true; mIconAnims[i].animIn = true; } else { - mIconAnims[i].idleVisible = false; + mIconAnims[i].visible = false; mIconAnims[i].animIn = false; } } - if (field_0xD0C != field_0xD10) { + if (mCurrentFloor != mLastFloor) { mIconAnims[i].animIn = false; mIconAnims[i].animOut = false; } @@ -932,14 +991,14 @@ void dLytMapIcon01_c::draw() { if (f <= field_0x1838) { drawWithAnimIn(paneIdx, pane, f); mIconAnims[i].frame += 1.0f; - mIconAnims[i].visible = true; + mIconAnims[i].render = true; if (!field_0x184C) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ICON_APPEAR); field_0x184C = true; } } else { mIconAnims[i].animIn = false; - mIconAnims[i].visible = true; + mIconAnims[i].render = true; field_0x184C = false; } } else if (mIconAnims[i].animOut) { @@ -947,17 +1006,17 @@ void dLytMapIcon01_c::draw() { if (f <= field_0x183C) { drawWithAnimOut(paneIdx, pane, f); mIconAnims[i].frame += 1.0f; - mIconAnims[i].visible = true; + mIconAnims[i].render = true; } else { mIconAnims[i].animOut = false; - mIconAnims[i].visible = true; + mIconAnims[i].render = true; } - } else if (mIconAnims[i].idleVisible) { + } else if (mIconAnims[i].visible) { drawFullyIn(paneIdx, pane); - mIconAnims[i].visible = true; + mIconAnims[i].render = true; } - if (mIconAnims[i].visible == true) { + if (mIconAnims[i].render == true) { pane->SetAlpha(alpha); pane->SetTranslate(vec2ToVec3XY(mCommands[cmd].position + field_0x0D40)); pane->Animate(0); @@ -979,15 +1038,16 @@ void dLytMapIcon01_c::draw() { mVec2_c v2(0.0f, 0.0f); for (int i = 0; i < field_0x0E13; i++) { - if (mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) { - v2 = mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].field_0x10; - mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(vec2ToVec3XY(v2 + field_0x0D40)); - mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo()); - mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo()); + if (mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) { + v2 = mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].boundingPos; + mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(vec2ToVec3XY(v2 + field_0x0D40) + ); + mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo()); + mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo()); } } - field_0xD10 = field_0xD0C; + mLastFloor = mCurrentFloor; } static const char *sMapPrefix = "MAP_"; @@ -1002,7 +1062,7 @@ void dLytMapIcon01_c::resetDrawCommands() { field_0x0C85[i] = 0; } - field_0xD0C = 0; + mCurrentFloor = 0; for (int i = 0; i < (int)ARRAY_LENGTH(mNumCommandsPerPass); i++) { mNumCommandsPerPass[i] = 0; @@ -1010,14 +1070,13 @@ void dLytMapIcon01_c::resetDrawCommands() { mNumCommands = 0; - for (int i = 0; i < (int)ARRAY_LENGTH(mUnk3); i++) { - mUnk3[i].field_0x00 = 100; - mUnk3[i].field_0x10.set(0.0f, 0.0f); - mUnk3[i].field_0x08 = 0.0f; - mUnk3[i].field_0x0C = 0.0f; - mUnk3[i].field_0x18 = 0; - mUnk3[i].field_0x19 = 0; - mUnk3[i].field_0x1C = sMapPrefix; + for (int i = 0; i < (int)ARRAY_LENGTH(mPopupConfigs); i++) { + mPopupConfigs[i].cmdIdx = 100; + mPopupConfigs[i].boundingPos.set(0.0f, 0.0f); + mPopupConfigs[i].textPos.set(0.0f, 0.0f); + mPopupConfigs[i].pointedAt = false; + mPopupConfigs[i].objId = 0; + mPopupConfigs[i].labelPrefix = sMapPrefix; } field_0x0E13 = 0; @@ -1030,29 +1089,48 @@ void dLytMapIcon01_c::resetDrawCommands() { field_0x0D49 = 100; field_0x0D4A = 100; - field_0x0C74 = 0; - field_0x0C75 = 0; - field_0x0C76 = 0; - field_0x0C77 = 0; - field_0x0C78 = 0; - field_0x0C79 = 0; - field_0x0C7A = 0; - field_0x0C7B = 0; - field_0x0C7C = 0; - field_0x0C7D = 0; - field_0x0C7E = 0; - field_0x0C7F = 0; - field_0x0C80 = 0; - field_0x0C81 = 0; - field_0x0C82 = 0; + mFunFunIslandDiscovered = false; + mLumpyPumkpinDiscovered = false; + mBeedleIslandDiscovered = false; + mBambooIslandDiscovered = false; + mIsleOfSongsDiscovered = false; + mBugHavenDiscovered = false; + mBilocyteFightTriggered = false; + mFaronPillarOpened = false; + mFaronDiscovered = false; + mEldinPillarOpened = false; + mEldinDiscovered = false; + mLanayruPillarOpened = false; + mLanaryuDiscovered = false; + mThunderheadEntered = false; + mBeedleShopEntered = false; for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { - mIconAnims[i].visible = 0; + mIconAnims[i].render = false; } mNumAnims = 0; } +void dLytMapIcon01_c::loadFlags() { + StoryflagManager *mgr = StoryflagManager::sInstance; + mFunFunIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_FUN_FUN_ISLAND_DISCOVERED); + mLumpyPumkpinDiscovered = mgr->getCounterOrFlag(STORYFLAG_LUMPY_PUMPKIN_DISCOVERED); + mBeedleIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_BEEDLE_ISLAND_DISCOVERED); + mBambooIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_BAMBOO_ISLAND_DISCOVERED); + mIsleOfSongsDiscovered = mgr->getCounterOrFlag(STORYFLAG_ISLE_OF_SONGS_DISCOVERED); + mBugHavenDiscovered = mgr->getCounterOrFlag(STORYFLAG_BUG_HAVEN_DISCOVERED); + mBilocyteFightTriggered = mgr->getCounterOrFlag(STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED); + mFaronPillarOpened = mgr->getCounterOrFlag(STORYFLAG_FARON_PILLAR_OPENED); + mFaronDiscovered = mgr->getCounterOrFlag(STORYFLAG_FARON_DISCOVERED); + mEldinPillarOpened = mgr->getCounterOrFlag(STORYFLAG_ELDIN_PILLAR_OPENED); + mEldinDiscovered = mgr->getCounterOrFlag(STORYFLAG_ELDIN_DISCOVERED); + mLanayruPillarOpened = mgr->getCounterOrFlag(STORYFLAG_LANAYRU_PILLAR_OPENED); + mLanaryuDiscovered = mgr->getCounterOrFlag(STORYFLAG_LANAYRU_DISCOVERED); + mThunderheadEntered = mgr->getCounterOrFlag(STORYFLAG_THUNDERHEAD_ENTERED); + mBeedleShopEntered = mgr->getCounterOrFlag(STORYFLAG_BEEDLE_SHOP_ENTERED); +} + void dLytMapIcon01_c::setLinkTunic(s32 type) { f32 frame = 0.0f; switch (type) { @@ -1066,6 +1144,49 @@ void dLytMapIcon01_c::setLinkTunic(s32 type) { mAnm[MAP_ICON_01_ANIM_PLAYER_2_PATTERN].setAnimEnable(false); } +void dLytMapIcon01_c::setAreaLight(u32 color, nw4r::lyt::Pane *pane) { + f32 frame = color; + mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setAnimEnable(true); + mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setFrame(frame); + pane->Animate(0); + mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setAnimEnable(false); +} + +void dLytMapIcon01_c::setCloud(u32 alpha, nw4r::lyt::Pane *pane) { + f32 frame = alpha; + mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setAnimEnable(true); + mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setFrame(frame); + pane->Animate(0); + mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setAnimEnable(false); +} + +void dLytMapIcon01_c::setGoddessStatue(u32 present) { + f32 frame = 0.0f; + if (!present) { + frame = 1.0f; + } + mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setFrame(frame); + mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setAnimEnable(true); + mLyt.calc(); + mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setAnimEnable(false); +} + +void dLytMapIcon01_c::setSaveObj(u32 color, nw4r::lyt::Pane *pane) { + f32 frame = color; + mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setAnimEnable(true); + mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setFrame(frame); + pane->Animate(0); + mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setAnimEnable(false); +} + +void dLytMapIcon01_c::setTerry(bool present) { + // NONMATCHING + // Additional clrlwi here... + // When you fix this, maybe also fix other instances of this problem + // by searching for 91657b77 + mpTerryOnOffPane->SetVisible(present); +} + void dLytMapIcon01_c::drawWithAnimIn(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame) { if (paneIdx == MAP_ICON_01_PANE_DOORKEY_00) { paneIdx = MAP_ICON_01_PANE_DOOR_000; @@ -1155,9 +1276,62 @@ void dLytMapIcon01_c::checkMapMode() { } } +void dLytMapIcon01_c::setupActorDrawCommands() { + dAcBase_c *ac = nullptr; + while ((ac = static_cast(fManager_c::searchBaseByGroupType(fBase_c::ACTOR, ac))) != nullptr) { + if (field_0x0C70 == 4 && mBilocyteFightTriggered) { + setupNpcBNusiDrawCommand(ac); + } + + if (field_0x0C70 == 1 && checkHasMap()) { + setupObjD3DummyDrawCommand(ac); + } + + if (dScGame_c::currentSpawnInfo.getTimeOfDay() != SpawnInfo::NIGHT) { + setupObjTerryShopDrawCommand(ac); + } + + setupTboxDrawCommand(ac); + setupObjShutterDrawCommand(ac); + setupObjDoorDrawCommand(ac); + setupObjSealedDoorDrawCommand(ac); + setupObjHarpHintDrawCommand(ac); + + if (field_0x184D) { + setupNpcKenseiDrawCommand(ac); + } + + setupNpcBeeDrawCommand(ac); + setupObjSaveDrawCommand(ac); + setupObjLightLineDrawCommand(ac); + setupObjRoAtTargetDrawCommand(ac); + + if (mNumCommands >= 100) { + break; + } + } +} + +void dLytMapIcon01_c::setupNpcKenseiDrawCommand(dAcBase_c *actor) { + if (mNumCommands < 100) { + if (actor->mProfileName == fProfile::NPC_KENSEI && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && + mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(actor->mPosition, pos); + mCommands[mNumCommands].passIdx = 18; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_SWORD_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[18]++; + mNumCommands++; + } + } +} + void dLytMapIcon01_c::setupTboxDrawCommand(dAcBase_c *actor) { if (actor->mProfileName == fProfile::TBOX && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && - field_0xD0C == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { + mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { dAcTbox_c *box = static_cast(actor); if (box->getVariant() == dAcTbox_c::GODDESS) { u16 flag = box->getParams2Lower(); @@ -1186,16 +1360,16 @@ void dLytMapIcon01_c::setupTboxDrawCommandClosed(dAcTbox_c *box) { if (checkHasMap()) { if (field_0x0C84) { mIconAnims[mNumAnims].cmdIndex = mNumCommands; - mIconAnims[mNumAnims].idleVisible = true; + mIconAnims[mNumAnims].visible = true; mIconAnims[mNumAnims].animIn = true; } else { mIconAnims[mNumAnims].cmdIndex = mNumCommands; - mIconAnims[mNumAnims].idleVisible = true; + mIconAnims[mNumAnims].visible = true; mIconAnims[mNumAnims].animIn = false; } } else { mIconAnims[mNumAnims].cmdIndex = mNumCommands; - mIconAnims[mNumAnims].idleVisible = false; + mIconAnims[mNumAnims].visible = false; } mNumAnims++; @@ -1231,3 +1405,520 @@ void dLytMapIcon01_c::setupTboxDrawCommandGoddessClosed(dAcTbox_c *box) { mNumCommands++; } } + +void dLytMapIcon01_c::setupObjShutterDrawCommand(dAcBase_c *actor) { + // TODO - needs door classes +} + +void dLytMapIcon01_c::setupObjDoorDrawCommand(dAcBase_c *actor) { + // TODO - needs door classes +} + +void dLytMapIcon01_c::setupObjSaveDrawCommand(dAcBase_c *actor) { + if (mNumCommands < 100) { + if (actor->mProfileName == fProfile::OBJ_SAVE && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && + mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { + dAcOSave_c *save = static_cast(actor); + + bool b1 = false; + bool b2 = false; + bool activated = save->checkStatueFlag(); + if (field_0x0C70 == 1) { + if (checkHasMap()) { + if (field_0x0C84) { + if (!activated) { + b1 = true; + b2 = true; + } else { + b1 = true; + } + } else { + b1 = true; + } + } else if (activated) { + b1 = true; + } + } else if (activated) { + b1 = true; + } + + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(actor->mPosition, pos); + mCommands[mNumCommands].passIdx = 9; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_SAVEICON_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + if (b1) { + if (save->getStatueType() == dAcOSave_c::TYPE_NORMAL) { + field_0x0D4B[mNumCommands] = 0; + } else if (save->getStatueType() == dAcOSave_c::TYPE_OVERWORLD) { + field_0x0D4B[mNumCommands] = 1; + } else if (save->getStatueType() == dAcOSave_c::TYPE_DUNGEON) { + field_0x0D4B[mNumCommands] = 2; + } else { + field_0x0D4B[mNumCommands] = 0; + } + + if (b2) { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = true; + mIconAnims[mNumAnims].animIn = true; + } else { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = true; + mIconAnims[mNumAnims].animIn = false; + } + } else { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = false; + mIconAnims[mNumAnims].animIn = false; + } + + if (field_0x0C70 != 4 && mIconAnims[mNumAnims].visible == true && + field_0x0E13 < MAP_ICON_01_BOUNDING_COMMONICON_LAST - MAP_ICON_01_BOUNDING_COMMONICON_00) { + s32 idx = field_0x0E13 + MAP_ICON_01_BOUNDING_COMMONICON_00; + u32 id = save->getStatueNameId(); + mPopupConfigs[idx].cmdIdx = mNumCommands; + mPopupConfigs[idx].boundingPos.x = pos.x; + mPopupConfigs[idx].boundingPos.y = pos.y; + mPopupConfigs[idx].objId = id; + mPopupConfigs[idx].labelPrefix = sSaveObjPrefix; + nw4r::lyt::Bounding *b = mPopupConfigs[idx].bounding; + nw4r::lyt::Size bSize = mpBoundings[MAP_ICON_01_BOUNDING_SAVEICON_00]->GetSize(); + b->SetSize(bSize); + mVec2_c textPos(0.0f, 0.0f); + fn_80181880( + mpSpecialPictures[MAP_ICON_01_SPECIAL_PICTURE_SAVEICON_01], + mpSpecialPanes[MAP_ICON_01_SPECIAL_PANE_SAVEICON_000], textPos + ); + + mPopupConfigs[idx].textPos.x = textPos.x; + mPopupConfigs[idx].textPos.y = textPos.y; + mPopupConfigs[idx].bounding->SetVisible(true); + field_0x0E13++; + } + + mNumAnims++; + mNumCommandsPerPass[9]++; + mNumCommands++; + } + } +} + +void dLytMapIcon01_c::setupObjLightLineDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupNpcBNusiDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjTerryShopDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjRoAtTargetDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjD3DummyDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjSealedDoorDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjHarpHintDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupNpcBeeDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupStageDrawCommands() { + dAcBase_c *ac = nullptr; + while ((ac = static_cast(fManager_c::searchBaseByGroupType(fBase_c::STAGE, ac))) != nullptr) { + setupTgMapMarkDrawCommand(ac); + + if (dLytMapGlobal_c::GetInstance()->getField_0x54()) { + setupTgMapInstDrawCommand(ac); + } + + setupTgForceGetFlagDrawCommand(ac); + + if (field_0x184D) { + setupTgInsectDrawCommand(ac); + } + + if (mNumCommands >= 100) { + break; + } + } +} + +void dLytMapIcon01_c::setupTgMapMarkDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgMapMarkDrawCommand1(dTgMapMark_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgMapMarkDrawCommand2(dTgMapMark_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgMapInstDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgForceGetFlagDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgInsectDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupLinkDrawCommand() { + if (dAcPy_c::GetLinkM() != nullptr) { + setupLinkDrawCommand1(dAcPy_c::GetLinkM()); + + if (dLytMapGlobal_c::GetInstance()->getField_0x50() != 3) { + setupLinkDrawCommand2(); + } + } +} + +void dLytMapIcon01_c::setupLinkDrawCommand1(dAcPy_c *ac) { + // TODO - ... +} + +void dLytMapIcon01_c::setupLinkDrawCommand2() { + // TODO - ... +} + +void dLytMapIcon01_c::setupCloudBigDrawCommand() { + if (mNumCommands < 100) { + mVec3_c thunderHeadPos(-135210.0f, 0.0f, -84790.0f); + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(thunderHeadPos, pos); + mCommands[mNumCommands].passIdx = 31; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_CLOUDBIG_000; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[31]++; + mNumCommands++; + } +} + +void dLytMapIcon01_c::setupTriforceDrawCommands() { + dAcObjBase_c *ac = nullptr; + while ((ac = dAcObjBase_c::getNextObject(&dAcItem_c::sItemList, ac)) != nullptr) { + if (static_cast(ac)->isTriforce() && !ac->checkActorProperty(dAcBase_c::AC_PROP_0x100) && + mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(ac->mRoomID, ac->mPosition)) { + // @bug mNumCommands not checked? + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(ac->mPosition, pos); + mCommands[mNumCommands].passIdx = 23; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_TRIFORCE_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[23]++; + mNumCommands++; + } + } +} + +void dLytMapIcon01_c::fn_80181880(nw4r::lyt::Pane *a, nw4r::lyt::Pane *b, mVec2_c &result) const { + // TODO - maybe equivalent but floating point hell + // Ignoring the get16x9to4x3WidthScaleF stuff this basically does + // (a->translate + a->parent->translate) * b->scale + (Ex * a->size * a->scale * b->scale / 2.0f) + mVec2_c scaleA = a->GetScale(); + mVec2_c scaleB = b->GetScale(); + + mVec3_c parentTranslateA = a->GetParent()->GetTranslate(); + parentTranslateA.x /= dGfx_c::get16x9to4x3WidthScaleF(); + + mVec3_c translateA = a->GetTranslate(); + translateA.x /= dGfx_c::get16x9to4x3WidthScaleF(); + translateA.x += parentTranslateA.x; + translateA.x *= scaleB.x; + translateA.y += parentTranslateA.y; + translateA.y *= scaleB.y; + + nw4r::lyt::Size sizeA = a->GetSize(); + sizeA.width /= dGfx_c::get16x9to4x3WidthScaleF(); + sizeA.width *= scaleA.x; + sizeA.width *= scaleB.x; + sizeA.height *= scaleA.y; + sizeA.height *= scaleB.y; + + translateA.x += (sizeA.width / 2.0f); + + result.x = translateA.x; + result.y = translateA.y; +} + +void dLytMapIcon01_c::recordAnimVisState() { + for (int i = 0; i < mNumAnims; i++) { + mIconAnims[i].prevVisible = mIconAnims[i].visible; + } +} + +void dLytMapIcon01_c::transitionAnims() { + for (int i = 0; i < mNumAnims; i++) { + if (mIconAnims[i].visible != mIconAnims[i].prevVisible) { + if (mIconAnims[i].prevVisible == true) { + mIconAnims[i].animIn = false; + mIconAnims[i].animOut = true; + } else if (mIconAnims[i].visible == true) { + mIconAnims[i].animIn = true; + mIconAnims[i].animOut = false; + } + } + } +} + +void dLytMapIcon01_c::checkBoundingPointing() { + for (int i = 0; i < MAP_ICON_01_BOUNDING_COMMONICON_LAST; i++) { + if (mPopupConfigs[i].bounding->IsVisible() && isPointingAtBounding(mPopupConfigs[i].bounding)) { + if (i == MAP_ICON_01_BOUNDING_UTA_00) { + mPopupConfigs[MAP_ICON_01_BOUNDING_UTA_01].pointedAt = true; + } else if (i == MAP_ICON_01_BOUNDING_MUSI_00) { + mPopupConfigs[MAP_ICON_01_BOUNDING_MUSI_01].pointedAt = true; + } else if (i == MAP_ICON_01_BOUNDING_SKYLOFT_00) { + mPopupConfigs[MAP_ICON_01_BOUNDING_SKYLOFT_01].pointedAt = true; + } else { + mPopupConfigs[i].pointedAt = true; + } + } + } +} + +bool dLytMapIcon01_c::isPointingAtBounding(nw4r::lyt::Pane *pane) const { + dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); + if (d != nullptr && d->getType() == 'lyt ' && static_cast(d)->getHitPane() == pane) { + return true; + } + return false; +} + +void dLytMapIcon01_c::fn_80181C40() { + for (int i = 0; i < MAP_ICON_01_BOUNDING_COMMONICON_LAST; i++) { + mpBoundings[i]->SetVisible(false); + } +} + +bool dLytMapIcon00_c::build(d2d::ResAccIf_c *resAcc) { + // TODO - ... + return true; +} + +bool dLytMapIcon00_c::remove() { + // TODO - ... + return true; +} + +bool dLytMapIcon00_c::execute() { + // TODO - ... + return true; +} + +void dLytMapIcon00_c::draw() { + // TODO - ... +} + +void dLytMapIcon00_c::resetDrawCommands() { + for (int i = 0; i < (int)ARRAY_LENGTH(mCommands); i++) { + mCommands[i].position.set(0.0f, 0.0f); + mCommands[i].rotation.setF(0.0f); + mCommands[i].paneIdx = 39; + mCommands[i].passIdx = 35; + field_0x0F20[i] = 100; + field_0x13A8[i] = 0; + field_0x1342[i] = 0; + field_0x0E5B[i] = 0; + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mNumCommandsPerPass); i++) { + mNumCommandsPerPass[i] = 0; + } + + field_0x13A7 = 0; + mNumCommands = 0; + + for (int i = 0; i < 36; i++) { + field_0x0EEC[i] = 0; + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mPopupConfigs); i++) { + mPopupConfigs[i].cmdIdx = 100; + mPopupConfigs[i].boundingPos.set(0.0f, 0.0f); + mPopupConfigs[i].textPos.set(0.0f, 0.0f); + mPopupConfigs[i].pointedAt = false; + mPopupConfigs[i].objId = 0; + mPopupConfigs[i].labelPrefix = sMapPrefix; + } + + field_0x140C = 0; + field_0x0E59 = 0; + field_0x0E5A = 0; + + fn_80189750(); + + field_0x0E50 = 0; + field_0x0E51 = 0; + field_0x0E52 = 0; + field_0x0E53 = 0; + field_0x0E54 = 0; + field_0x0E55 = 0; + field_0x0E56 = 0; + field_0x0E57 = 0; + field_0x0E58 = 0; + + for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { + mIconAnims[i].render = false; + } + + mNumAnims = 0; + field_0x1CE4 = 0; +} + +static const char *sMapPopPrefix = "MAP_POP_"; + +bool dLytMapMarkers_c::build(d2d::ResAccIf_c *resAcc) { + mMapPopup.build(resAcc); + if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + void *data = LayoutArcManager::GetInstance()->getLoadedData("MapSky"); + mResAcc01.attach(data, ""); + + // TODO - ... + + mIcon01.build(&mResAcc01); + } else { + void *data = LayoutArcManager::GetInstance()->getLoadedData("MapField"); + mResAcc00.attach(data, ""); + + // TODO - ... + + mIcon00.build(&mResAcc00); + } + return true; +} + +bool dLytMapMarkers_c::remove() { + mMapPopup.remove(); + if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + mIcon01.remove(); + mResAcc01.detach(); + } else { + mIcon00.remove(); + mResAcc00.detach(); + } + // TODO - ... + return true; +} + +bool dLytMapMarkers_c::execute() { + return true; +} + +void dLytMapMarkers_c::draw() { + if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + mIcon01.draw(); + } else { + mIcon00.draw(); + } +} + +void dLytMapMarkers_c::setIslandNamesOn(bool on) { + if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + mShowIslandNames = on; + mIcon01.mShowIslandNames = on; + } +} + +void dLytMapMarkers_c::drawPopups() { + for (int i = 0; i < mNumPopups; i++) { + if (mPopups[i].visible) { + SizedString<0x40> label; + if (mPopups[i].objId == 0xFF) { + label.sprintf("SAVEOBJ_NAME_UNKNOWN"); + } else { + label.sprintf("%s%02d", mPopups[i].labelPrefix, mPopups[i].objId); + } + mMapPopup.setLabel(label); + mMapPopup.realizeText(); + f32 width = mMapPopup.getTextRenderWidth(); + + // TODO - probably equivalent but FPR, order, stack problems + mVec2_c boundingPos = mPopups[i].boundingPos; + mVec2_c textPos = mPopups[i].textPos; + mVec2_c pos = boundingPos + textPos + field_0x06F4; + pos.x += width / 2.0f; + + mMapPopup.setPosition(pos); + + mMapPopup.setInout(mPopups[i].inAnimFrame); + mMapPopup.draw(); + if (mPopups[i].inAnimFrame <= mMapPopup.getInAnimDuration()) { + mPopups[i].inAnimFrame += 1.0f; + } + if (mMapPopup.getInAnimDuration() <= mPopups[i].inAnimFrame) { + mPopups[i].inAnimFrame = mMapPopup.getInAnimDuration(); + } + } else if (0.0f < mPopups[i].inAnimFrame) { + SizedString<0x40> label; + if (mPopups[i].objId == 0xFF) { + label.sprintf("SAVEOBJ_NAME_UNKNOWN"); + } else { + label.sprintf("%s%02d", mPopups[i].labelPrefix, mPopups[i].objId); + } + mMapPopup.setLabel(label); + mMapPopup.realizeText(); + f32 width = mMapPopup.getTextRenderWidth(); + + // TODO - probably equivalent but FPR, order, stack problems + mVec2_c boundingPos = mPopups[i].boundingPos; + mVec2_c textPos = mPopups[i].textPos; + mVec2_c pos = boundingPos + textPos + field_0x06F4; + pos.x += width / 2.0f; + + mMapPopup.setPosition(pos); + + mPopups[i].inAnimFrame -= 1.0f; + mMapPopup.setInout(mPopups[i].inAnimFrame); + mMapPopup.draw(); + } + } +} + +void dLytMapMarkers_c::resetPopups() { + for (int i = 0; i < (int)ARRAY_LENGTH(mPopups); i++) { + mPopups[i].inAnimFrame = 0.0f; + mPopups[i].textPos.set(0.0f, 0.0f); + mPopups[i].boundingPos.set(0.0f, 0.0f); + mPopups[i].visible = false; + mPopups[i].objId = 0; + mPopups[i].labelPrefix = sMapPopPrefix; + } +} + +void dLytMapMarkers_c::loadPopups() { + for (int i = 0; i < mNumPopups; i++) { + // TODO - this looks weird + const mVec2_c &v = mpPopupConfigs[i].textPos; + mPopups[i].textPos.x = v.x; + mPopups[i].textPos.y = v.y; + mPopups[i].boundingPos = mpPopupConfigs[i].boundingPos; + mPopups[i].visible = mpPopupConfigs[i].pointedAt; + mPopups[i].objId = mpPopupConfigs[i].objId; + mPopups[i].labelPrefix = mpPopupConfigs[i].labelPrefix; + } +} From a7ab2f6fee5eeb545d29fed66381262a163b6f98 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 9 Oct 2025 00:13:54 +0200 Subject: [PATCH 11/20] Map more --- config/SOUE01/symbols.txt | 24 +- include/d/d_camera.h | 9 +- include/d/d_cursor_hit_check.h | 4 + include/d/lyt/d_lyt_map.h | 53 ++- include/d/lyt/d_lyt_map_global.h | 8 + include/d/lyt/meter/d_lyt_meter.h | 2 + src/d/lyt/d_lyt_map.cpp | 683 ++++++++++++++++++++++++++++-- 7 files changed, 719 insertions(+), 64 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f81c848c..b0972835 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7818,19 +7818,19 @@ fn_801378E0 = .text:0x801378E0; // type:function size:0x838 getStateID__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80138120; // type:function size:0x10 draw__13dLytMapMain_cFv = .text:0x80138130; // type:function size:0x238 fn_80138370 = .text:0x80138370; // type:function size:0x138 -canChangeUpDirection__13dLytMapMain_cCFlUc = .text:0x801384B0; // type:function size:0x5C +canChangeUpDirection__13dLytMapMain_cCFlb = .text:0x801384B0; // type:function size:0x5C canZoomIn__13dLytMapMain_cCFl = .text:0x80138510; // type:function size:0x140 canZoomOut__13dLytMapMain_cCFl = .text:0x80138650; // type:function size:0x1E0 -fn_80138830 = .text:0x80138830; // type:function size:0x254 +canCenterCursor__13dLytMapMain_cCFl = .text:0x80138830; // type:function size:0x254 needsNav__13dLytMapMain_cCFl = .text:0x80138A90; // type:function size:0x8C fn_80138B20 = .text:0x80138B20; // type:function size:0x110 fn_80138C30 = .text:0x80138C30; // type:function size:0x38 fn_80138C70 = .text:0x80138C70; // type:function size:0xA4 fn_80138D20 = .text:0x80138D20; // type:function size:0x5C fn_80138D80 = .text:0x80138D80; // type:function size:0xB0 -fn_80138E30 = .text:0x80138E30; // type:function size:0xD4 -fn_80138F10 = .text:0x80138F10; // type:function size:0xA0 -canResetPosition__13dLytMapMain_cCFlUc = .text:0x80138FB0; // type:function size:0xA4 +isPointingAtMainMap__13dLytMapMain_cCFv = .text:0x80138E30; // type:function size:0xD4 +canPlaceBeacons__13dLytMapMain_cCFl = .text:0x80138F10; // type:function size:0xA0 +canResetPosition__13dLytMapMain_cCFlb = .text:0x80138FB0; // type:function size:0xA4 fn_80139060 = .text:0x80139060; // type:function size:0x28 isOpenMaybe__13dLytMapMain_cCFv = .text:0x80139090; // type:function size:0x478 fn_80139510 = .text:0x80139510; // type:function size:0xA8 @@ -7844,12 +7844,12 @@ fn_80139EA0__13dLytMapMain_cCFv = .text:0x80139EA0; // type:function size:0x58 saveUnkMapData__13dLytMapMain_cFv = .text:0x80139F00; // type:function size:0x44 initUnkMapData__13dLytMapMain_cFv = .text:0x80139F50; // type:function size:0xE8 loadUnkMapData__13dLytMapMain_cFv = .text:0x8013A040; // type:function size:0x3C -fn_8013A080 = .text:0x8013A080; // type:function size:0xE8 -fn_8013A170 = .text:0x8013A170; // type:function size:0xA84 -fn_8013AC00 = .text:0x8013AC00; // type:function size:0x4 -fn_8013AC10 = .text:0x8013AC10; // type:function size:0x138 +clearButtonMessages__13dLytMapMain_cFv = .text:0x8013A080; // type:function size:0xE8 +setButtonMessages__13dLytMapMain_cFlblb = .text:0x8013A170; // type:function size:0xA84 +canCenterCursor1__13dLytMapMain_cCFl = .text:0x8013AC00; // type:function size:0x4 +setCursorType__13dLytMapMain_cFv = .text:0x8013AC10; // type:function size:0x138 fn_8013AD50 = .text:0x8013AD50; // type:function size:0x370 -fn_8013B0C0 = .text:0x8013B0C0; // type:function size:0x28C +fn_8013B0C0__13dLytMapMain_cFv = .text:0x8013B0C0; // type:function size:0x28C fn_8013B350 = .text:0x8013B350; // type:function size:0x10 initializeState_Invisible__13dLytMapMain_cFv = .text:0x8013B360; // type:function size:0x4 executeState_Invisible__13dLytMapMain_cFv = .text:0x8013B370; // type:function size:0x4 @@ -7991,7 +7991,7 @@ finalizeState_EventSaveObjConfirmMsgWindow__13dLytMapMain_cFv = .text:0x80142720 initializeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142730; // type:function size:0x4 executeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142740; // type:function size:0x4 finalizeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142750; // type:function size:0x4 -fn_80142760 = .text:0x80142760; // type:function size:0x190 +checkCursorPointedAtMap__13dLytMapMain_cFv = .text:0x80142760; // type:function size:0x190 fn_801428F0 = .text:0x801428F0; // type:function size:0xB4 fn_801429B0 = .text:0x801429B0; // type:function size:0x1D8 fn_80142B90 = .text:0x80142B90; // type:function size:0xEC @@ -8005,7 +8005,7 @@ fn_801431E0 = .text:0x801431E0; // type:function size:0x11C fn_80143300__13dLytMapMain_cFv = .text:0x80143300; // type:function size:0x54 fn_80143360 = .text:0x80143360; // type:function size:0x1D4 checkScroll__13dLytMapMain_cFv = .text:0x80143540; // type:function size:0x374 -fn_801438C0 = .text:0x801438C0; // type:function size:0x6C +build__9dLytMap_cFv = .text:0x801438C0; // type:function size:0x6C fn_80143930 = .text:0x80143930; // type:function size:0x60 fn_80143990 = .text:0x80143990; // type:function size:0x4C fn_801439E0 = .text:0x801439E0; // type:function size:0x4C diff --git a/include/d/d_camera.h b/include/d/d_camera.h index b8d8771b..5df35c1d 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -8,6 +8,7 @@ extern "C" bool fn_80081FE0(void *, const char *); extern "C" bool fn_800918E0(void *, s32, s16); extern "C" void fn_80080960(void *, s32, s32, s8, s32); +extern "C" void fn_80093360(void *); class dCamera_c : public dBase_c { public: @@ -30,6 +31,10 @@ public: return fn_800918E0(field_0xDA0, a1, a2); } + void doFn_80093360() { + fn_80093360(field_0xDA4); + } + void setScreenShakeIntensity(f32 val) { mScreenShakeIntensity = val; } @@ -41,6 +46,8 @@ public: bool isUnderwater() const; f32 getUnderwaterDepth() const; + void fn_8019E430(); + private: /* 0x068 */ u8 _0x068[0x6C - 0x068]; /* 0x06C */ mVec3_c mPositionMaybe; @@ -49,7 +56,7 @@ private: /* 0xD98 */ void *field_0xD98; /* 0xD9C */ u8 _0xD9C[0xDA0 - 0xD9C]; /* 0xDA0 */ void *field_0xDA0; - /* 0xDA4 */ u8 _0xDA4[0xDA8 - 0xDA4]; + /* 0xDA4 */ void *field_0xDA4; /* 0xDA8 */ UNKWORD field_0xDA8; /* 0xDAC */ u8 _0xDAC[0xDB0 - 0xDAC]; /* 0xDB0 */ f32 mScreenShakeIntensity; diff --git a/include/d/d_cursor_hit_check.h b/include/d/d_cursor_hit_check.h index ae69f28b..e6f49718 100644 --- a/include/d/d_cursor_hit_check.h +++ b/include/d/d_cursor_hit_check.h @@ -95,6 +95,10 @@ public: mHasCalculatedBoundingData = false; } + const dCsCheckLyt_BoundingData *getBoundingData() const { + return mpBoundingData; + } + private: void countBoundings(nw4r::lyt::Pane *); void gatherBoundings(dCsCheckLyt_BoundingData **pEnd, nw4r::lyt::Pane *); diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 82aab81b..f79e50d0 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -7,9 +7,9 @@ #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_map_capture.h" #include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_lyt_map_markers.h" #include "d/lyt/d_textbox.h" #include "d/lyt/d_window.h" -#include "d/lyt/d_lyt_map_markers.h" #include "egg/core/eggColorFader.h" #include "m/m2d.h" #include "m/m_angle.h" @@ -34,13 +34,13 @@ struct dMapSaveObjDefinition { struct dMapSavedDataEntry { /* 0x00 */ s32 mapMode; /* 0x04 */ bool mapUpDirection; - /* 0x05 */ u8 field_0x05; + /* 0x05 */ bool mapUpDirectionAfterZoomToDetail; /* 0x06 */ u8 field_0x06; }; struct dMapSavedData { /* 0x00 */ dMapSavedDataEntry entries[6]; - /* 0x30 */ bool islandNamesOn; + /* 0x30 */ bool showIslandNames; }; struct dMapFootPrintEntry { @@ -347,6 +347,7 @@ private: // Size 0x4C class dLytMapPopupInfo_c { friend class dLytMapMain_c; + public: dLytMapPopupInfo_c() : mStateMgr(*this, sStateID::null) {} @@ -468,7 +469,6 @@ private: /* 0x18E */ bool mDecideFinished; }; - /** 2D UI - Map - beacon preview icon following the cursor */ class dLytMapPutIcon_c { public: @@ -554,8 +554,12 @@ private: bool needsNav(s32 mapMode) const; bool canZoomOut(s32 mapMode) const; bool canZoomIn(s32 mapMode) const; - bool canResetPosition(s32 mapMode, u8) const; - bool canChangeUpDirection(s32 mapMode, u8) const; + bool canResetPosition(s32 mapMode, bool) const; + bool canChangeUpDirection(s32 mapMode, bool) const; + bool canCenterCursor(s32 mapMode) const; + bool canCenterCursor1(s32 mapMode) const; + bool canPlaceBeacons(s32 mapMode) const; + bool isPointingAtMainMap() const; f32 fn_80142D90(s32); void fn_80142F00(mVec3_c &, s32 mapMode, u8, const mVec3_c &, const mAng &); @@ -569,8 +573,12 @@ private: void fn_80138D80(); bool shouldDrawFootprints() const; - void zoomOut(); void zoomIn(); + void zoomOut(); + + void clearButtonMessages(); + void setButtonMessages(s32 currentMapMode, bool currentUpDirection, s32 nextMapMode, bool nextUpDirection); + void setCursorType(); void loadTextboxes(); @@ -578,6 +586,10 @@ private: void initUnkMapData(); void loadUnkMapData(); + void checkCursorPointedAtMap(); + + void fn_8013B0C0(); + static dMapSavedData sSavedMapData; static const dMapSavedData sDefaultMapData; @@ -605,14 +617,16 @@ private: /* 0x8208 */ dTextBox_c *mpNumberTextBox; /* 0x820C */ dTextBox_c *mpNumberTextBoxS; /* 0x8210 */ nw4r::lyt::Pane *mpNoroshiPane; - /* 0x8214 */ nw4r::lyt::Pane *mpScaleFlamePane; + /* 0x8214 */ nw4r::lyt::Pane *mpScaleFramePane; /* 0x8218 */ dWindow_c *mpWakuWindow; /* 0x821C */ nw4r::lyt::Bounding *field_0x821C[10]; /* 0x8244 */ nw4r::lyt::Bounding *field_0x8244[6]; /* 0x825C */ nw4r::lyt::Bounding *field_0x825C[12]; /* 0x828C */ mVec3_c field_0x828C[12]; + /* 0x831C */ UNKWORD field_0x831C; + /* 0x8320 */ UNKWORD field_0x8320; - /* 0x831C */ u8 _0x831C[0x8328 - 0x831C]; + /* 0x8324 */ u8 _0x8324[0x8328 - 0x8324]; /* 0x8328 */ d2d::AnmGroup_c *mpOutAnmGroup; @@ -622,12 +636,11 @@ private: /* 0x832C */ dCursorHitCheckLyt_c mHitChecks[33]; /* 0x8854 */ nw4r::lyt::Pane *mpPanes[11]; - - /* 0x8880 */ u8 _0x8880[0x88B0 - 0x8880]; - + /* 0x8880 */ d2d::AnmGroup_c *field_0x8880[11]; // ??? + /* 0x88AC */ UNKWORD field_0x88AC; /* 0x88B0 */ nw4r::lyt::Pane *mpUnkPanes1[7]; /* 0x88CC */ nw4r::lyt::Pane *mpUnkPanes2[7]; - + /* 0x88E8 */ nw4r::lyt::Pane *mpPaneBgAll01; /* 0x88EC */ nw4r::lyt::Pane *mpPaneBgAll02; /* 0x88F0 */ nw4r::lyt::Pane *mpPaneAll01; @@ -647,7 +660,7 @@ private: /* 0x8C60 */ s32 mMaxBeaconCount; /* 0x8C64 */ s32 field_0x8C64; /* 0x8C68 */ s32 field_0x8C68; - /* 0x8C6C */ UNKWORD field_0x8C6C; + /* 0x8C6C */ s32 field_0x8C6C; /* 0x8C70 */ u32 field_0x8C70; /* 0x8C74 */ u8 _0x8C74[0x8C88 - 0x8C74]; @@ -656,7 +669,7 @@ private: /* 0x8C8C */ f32 field_0x8C8C; /* 0x8C90 */ bool mMapUpDirection; /* 0x8C91 */ bool mNextMapUpDirection; - /* 0x8C92 */ u8 field_0x8C92; + /* 0x8C92 */ bool mMapUpDirectionAfterZoomToDetail; /* 0x8C93 */ u8 field_0x8C93; /* 0x8C94 */ s32 field_0x8C94; /* 0x8C98 */ UNKWORD field_0x8C98; @@ -678,8 +691,8 @@ private: /* 0x8CB8 */ u8 _0x8CB8[0x8CBC - 0x8CB8]; /* 0x8CBC */ nw4r::lyt::Bounding *mpMapBounding; - /* 0x8CC0 */ bool field_0x8CC0; - /* 0x8CC1 */ bool field_0x8CC1; + /* 0x8CC0 */ bool mPointerOnMap; + /* 0x8CC1 */ bool mPointerCanPlaceBeacon; /* 0x8CC4 */ mVec3_c field_0x8CC4; /* 0x8CD0 */ mVec3_c field_0x8CD0; /* 0x8CDC */ mVec3_c field_0x8CDC; @@ -703,7 +716,7 @@ private: /* 0x8D60 */ s32 field_0x8D60; /* 0x8D64 */ UNKWORD field_0x8D64; /* 0x8D68 */ mAng field_0x8D68; - /* 0x8D6A */ u8 field_0x8D6A; + /* 0x8D6A */ u8 field_0x8D6A; // set at 0x8009e2d4 /* 0x8D6B */ u8 field_0x8D6B; /* 0x8D6C */ UNKWORD field_0x8D6C; /* 0x8D70 */ UNKWORD field_0x8D70; @@ -718,9 +731,9 @@ private: /* 0x8DA0 */ d2d::SubPaneListNode mSubpane; /* 0x8DB0 */ UNKWORD field_0x8DB0; /* 0x8DB4 */ bool mNavEnabled; - /* 0x8DB5 */ bool field_0x8DB5; + /* 0x8DB5 */ bool mDrawScaleFrame; /* 0x8DB8 */ UNKWORD field_0x8DB8; - /* 0x8DBC */ bool mIslandNamesOn; + /* 0x8DBC */ bool mShowIslandNames; /* 0x8DBD */ bool field_0x8DBD; /* 0x8DBE */ u8 field_0x8DBE; /* 0x8DBF */ u8 field_0x8DBF; diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index c11584f4..bab821d0 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -14,9 +14,13 @@ public: enum MapMode_e { MAPMODE_WORLD = 0, + // aka area MAPMODE_PROVINCE = 1, + // aka area MAPMODE_WORLD_SKY = 2, + // aka course MAPMODE_STAGE = 3, + // aka detail MAPMODE_ZOOM = 4, }; @@ -44,6 +48,10 @@ public: field_0x20 = v; } + const mVec2_c &getField_0x28() const { + return field_0x28; + } + void setField_0x28(const mVec2_c &v) { field_0x28 = v; } diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index a5826546..ce4465b2 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -60,6 +60,8 @@ enum MeterFlag_e { METER_BTN_Z = 0x800, METER_BTN_0x1000 = 0x1000, + METER_BTN_0x4000 = 0x4000, + METER_BTN_CROSS = METER_BTN_CROSS_UP | METER_BTN_CROSS_DOWN | METER_BTN_CROSS_LEFT | METER_BTN_CROSS_RIGHT, }; diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 29f03e66..08a5fed3 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -19,6 +19,7 @@ #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_lyt_unknowns.h" #include "d/lyt/d_textbox.h" #include "d/lyt/d_window.h" #include "d/lyt/meter/d_lyt_meter.h" @@ -1903,7 +1904,7 @@ dLytMapMain_c::dLytMapMain_c() mFloorBtnMgr(&mGlobal), mFootPrints(&mGlobal), field_0x8C6C(0), - field_0x8C92(1), + mMapUpDirectionAfterZoomToDetail(true), field_0x8C93(0), field_0x8C94(0), field_0x8C98(0), @@ -1926,9 +1927,9 @@ dLytMapMain_c::dLytMapMain_c() field_0x8D70(0), field_0x8DB0(0), mNavEnabled(false), - field_0x8DB5(false), + mDrawScaleFrame(false), field_0x8DB8(0), - mIslandNamesOn(false), + mShowIslandNames(false), field_0x8DBD(0), field_0x8DBE(0), field_0x8DBF(0), @@ -2164,6 +2165,12 @@ static const char *sBoundingNames[] = { "B_saveIcon_25", "B_saveIcon_26", "B_saveIcon_27", }; +#define MAP_MAIN_NUM_BOUNDINGS_NORMAL 5 +#define MAP_MAIN_OFFSET_BOUNDINGS_SAVEICON 5 +#define MAP_MAIN_NUM_BOUNDINGS_SAVEICON 28 + +#define MAP_MAIN_NUM_BOUNDINGS 33 + static const char *sPaneNames[] = { "N_pName_00", "N_fName_00", "N_nFname_00", "N_sVname_00", "N_dName_02", "N_dName_00", "N_lName_00", "N_gName_02", "N_gName_01", "N_nVname_00", "N_gName_00", @@ -2227,6 +2234,7 @@ void dLytMapMain_c::build() { for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) { nw4r::lyt::Bounding *b = mLyt.findBounding(sBoundingNames[i]); b->SetVisible(false); + // TODO - bird statues if (i >= 5 && i < 15) { field_0x821C[i - 5] = b; } else if (i >= 15 && i < 21) { @@ -2262,7 +2270,7 @@ void dLytMapMain_c::build() { field_0x8D38.x *= mLyt.getDrawInfo().GetLocationAdjustScale().x; mpAllPane = mLyt.findPane("N_all_00"); mpNoroshiPane = mLyt.findPane("N_noroshi_00"); - mpScaleFlamePane = mLyt.findPane("N_scaleFlame_00"); + mpScaleFramePane = mLyt.findPane("N_scaleFlame_00"); mpWakuWindow = mLyt.getWindow("W_waku_01"); for (int i = 0; i < (int)ARRAY_LENGTH(sPaneNames); i++) { @@ -2362,7 +2370,7 @@ void dLytMapMain_c::draw() { mpZoomInOutPane->SetVisible(true); } - mpScaleFlamePane->SetVisible(field_0x8DB5 ? true : false); + mpScaleFramePane->SetVisible(mDrawScaleFrame ? true : false); mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo()); if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && field_0x8C94 == 10) { @@ -2401,8 +2409,8 @@ void dLytMapMain_c::saveUnkMapData() { data.field_0x06 = 1; data.mapMode = mCurrentMapMode; data.mapUpDirection = mMapUpDirection; - data.field_0x05 = field_0x8C92; - sSavedMapData.islandNamesOn = mIslandNamesOn; + data.mapUpDirectionAfterZoomToDetail = mMapUpDirectionAfterZoomToDetail; + sSavedMapData.showIslandNames = mShowIslandNames; } void dLytMapMain_c::initUnkMapData() { @@ -2410,16 +2418,277 @@ void dLytMapMain_c::initUnkMapData() { sSavedMapData.entries[i].field_0x06 = sDefaultMapData.entries[i].field_0x06; sSavedMapData.entries[i].mapMode = sDefaultMapData.entries[i].mapMode; sSavedMapData.entries[i].mapUpDirection = sDefaultMapData.entries[i].mapUpDirection; - sSavedMapData.entries[i].field_0x05 = sDefaultMapData.entries[i].field_0x05; + sSavedMapData.entries[i].mapUpDirectionAfterZoomToDetail = + sDefaultMapData.entries[i].mapUpDirectionAfterZoomToDetail; } - sSavedMapData.islandNamesOn = sDefaultMapData.islandNamesOn; + sSavedMapData.showIslandNames = sDefaultMapData.showIslandNames; } void dLytMapMain_c::loadUnkMapData() { mCurrentMapMode = sSavedMapData.entries[field_0x8C68].mapMode; mMapUpDirection = sSavedMapData.entries[field_0x8C68].mapUpDirection; - field_0x8C92 = sSavedMapData.entries[field_0x8C68].field_0x05; - mIslandNamesOn = sSavedMapData.islandNamesOn; + mMapUpDirectionAfterZoomToDetail = sSavedMapData.entries[field_0x8C68].mapUpDirectionAfterZoomToDetail; + mShowIslandNames = sSavedMapData.showIslandNames; +} + +void dLytMapMain_c::clearButtonMessages() { + for (int i = 0; i <= METER_BTN_0x4000; i++) { + dLytMeter_c::GetInstance()->clearFlags(i); + } +} + +void dLytMapMain_c::setButtonMessages( + s32 currentMapMode, bool currentUpDirection, s32 nextMapMode, bool nextUpDirection +) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_BG, LytDoButtonRelated::ACT_IE_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); + + if (canCenterCursor(currentMapMode) || canCenterCursor(nextMapMode)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_DOWN); + LytDoButtonRelated::setCrossDown(LytDoButtonRelated::ACT_IE_ETC_CENTER, true); + } + + // TODO - some of these parts directly access members instead of using function args... + + // TODO - canCenterCursor1 looks like an inline that somehow failed to get inlined (it's emitted right after this + // function...) + if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && canPlaceBeacons(mCurrentMapMode) && + canPlaceBeacons(mNextMapMode)) { + if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_C); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_ETC_ADD_BEACON); + } else if (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_C); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_ETC_REMOVE_BEACON); + } else if (!(*mStateMgr.getStateID() == StateID_In) && !(*mStateMgr.getStateID() == StateID_Out)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); + } + } + + if (canZoomOut(currentMapMode) && canZoomOut(nextMapMode)) { + if ((field_0x8C68 == 0 && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) || + (field_0x8C68 == 2 && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || + (field_0x8C68 == 4 && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || + (field_0x8C68 == 3 && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || + (field_0x8C68 == 5 && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || + (field_0x8C68 == 1 && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_WORLD_MAP); + } else { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_ZOOM_OUT); + + if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_ZOOM_OUT); + } + } + } + + if (canZoomIn(currentMapMode) && canZoomIn(nextMapMode)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_RIGHT); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_R, LytDoButtonRelated::ACT_IE_ETC_ZOOM_IN); + + if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && nextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_ZOOM_IN); + } + } + + // Directly accessing members instead of using function args... + if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SELECT_FLOOR); + + if (mFloorBtnMgr.hasPointedAtABtnIdx() && mFloorBtnMgr.canDecideFloor()) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY); + } + } + + if (canChangeUpDirection(currentMapMode, currentUpDirection) && + canChangeUpDirection(nextMapMode, nextUpDirection)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); + + if (!currentUpDirection) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_ROTATE_MAP); + } else { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_ROTATE_MAP_2); + } + } + + switch (field_0x8C68) { + case 2: { + if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); + LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (canResetPosition(mCurrentMapMode, mMapUpDirection)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL + ); + } else { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); + } + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + } + break; + } + case 0: + case 4: { + if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); + LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (canResetPosition(mCurrentMapMode, mMapUpDirection)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); + LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL + ); + } else { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); + } + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + } + + if (field_0x8C68 == 4 && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); + if (mShowIslandNames) { + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_HIDE_ISLAND_NAME + ); + } else { + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_SHOW_ISLAND_NAME + ); + } + } + break; + } + case 1: { + if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); + LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); + + if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx()) { + if (mFloorBtnMgr.canDecideFloor()) { + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY + ); + } else { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); + } + } + + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + + } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx()) { + if (mFloorBtnMgr.canDecideFloor()) { + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY + ); + } else { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); + } + } + } + break; + } + } +} + +void dLytMapMain_c::setCursorType() { + if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode)) { + if ((field_0x8C94 == 10 || ((field_0x8C68 == 3 || field_0x8C68 == 1) && mPointerOnMap)) || + (mPointerCanPlaceBeacon && isPointingAtMainMap()) || + (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) || + (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx())) { + dCsGame_c::GetInstance()->pointerDefSet(); + } else { + dCsGame_c::GetInstance()->pointerCatSet(); + } + } +} + +void dLytMapMain_c::fn_8013B0C0() { + dLytMapGlobal_c *global = getGlobal(); + // TODO - FPR Regswaps + f32 f1 = field_0x8D40 * global->getField_0x44(); + f32 f2 = f1 * global->getField_0x28().x; + mAng rot = global->getField_0x56(); + + for (int i = 0; i <= MAP_MAIN_NUM_BOUNDINGS_NORMAL - 1; i++) { + mVec3_c v1; + mVec3_c v2; + + f32 v1x = (f32)mHitChecks[i].getBoundingData()->mMinX; + f32 v2x = (f32)mHitChecks[i].getBoundingData()->mMaxX; + f32 v1z = (f32)mHitChecks[i].getBoundingData()->mMaxY; + f32 v2z = (f32)mHitChecks[i].getBoundingData()->mMinY; + + v1.x = v1x / f2; + v1.y = 0.0f; + v1.z = -v1z / f1; + + v2.x = v2x / f2; + v2.y = 0.0f; + v2.z = -v2z / f1; + + v1.rotY(rot); + v2.rotY(rot); + + // Looks like this is manually unprojecting the UI element + // hitbox corners? + s16 v = rot.mVal; + if (v == 0) { + // 0° rotation + field_0x8948[i].field_0x00.x = field_0x8CC4.x + v1.x; + field_0x8948[i].field_0x00.y = 0.0f; + field_0x8948[i].field_0x00.z = field_0x8CC4.z + v1.z; + + field_0x8948[i].field_0x0C.x = field_0x8CC4.x + v2.x; + field_0x8948[i].field_0x0C.y = 0.0f; + field_0x8948[i].field_0x0C.z = field_0x8CC4.z + v2.z; + } else if (v == 0x4000) { + // 90° rotation + field_0x8948[i].field_0x00.x = field_0x8CC4.x + v1.x; + field_0x8948[i].field_0x00.y = 0.0f; + field_0x8948[i].field_0x00.z = field_0x8CC4.z + v2.z; + + field_0x8948[i].field_0x0C.x = field_0x8CC4.x + v2.x; + field_0x8948[i].field_0x0C.y = 0.0f; + field_0x8948[i].field_0x0C.z = field_0x8CC4.z + v1.z; + } else if (v == -0x8000) { + // 180° rotation + field_0x8948[i].field_0x00.x = field_0x8CC4.x + v2.x; + field_0x8948[i].field_0x00.y = 0.0f; + field_0x8948[i].field_0x00.z = field_0x8CC4.z + v2.z; + + field_0x8948[i].field_0x0C.x = field_0x8CC4.x + v1.x; + field_0x8948[i].field_0x0C.y = 0.0f; + field_0x8948[i].field_0x0C.z = field_0x8CC4.z + v1.z; + } + } } void dLytMapMain_c::initializeState_Invisible() {} @@ -2434,6 +2703,238 @@ void dLytMapMain_c::initializeState_In() {} void dLytMapMain_c::executeState_In() {} void dLytMapMain_c::finalizeState_In() {} +void dLytMapMain_c::zoomIn() { + if (field_0x8C68 == 2 || (field_0x8C6C == 1 && (field_0x8C68 == 3 || field_0x8C68 == 1))) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + if (dPad::getDownTrigRight()) { + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { + mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); + + if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); + } else { + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } + } else if (field_0x8C68 == 4 || field_0x8C68 == 5) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { + mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); + + if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); + } else { + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } + } else if (field_0x8C68 == 0) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { + mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); + + if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); + } else { + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } + } else if (field_0x8C68 == 1) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigRight() || (!mFloorBtnMgr.hasPointedAtABtnIdx() && dPad::getDownTrigA())) { + mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); + + if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); + } else { + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } + } else if (field_0x8C68 == 3) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } + } +} + +void dLytMapMain_c::zoomOut() { + if (field_0x8C68 == 2 || (field_0x8C6C == 1 && (field_0x8C68 == 3 || field_0x8C68 == 1))) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + if (dPad::getDownTrigLeft()) { + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { + mMapUpDirectionAfterZoomToDetail = mMapUpDirection; + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mNextMapUpDirection = true; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); + + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } else if (field_0x8C68 == 4 || field_0x8C68 == 5) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { + mMapUpDirectionAfterZoomToDetail = mMapUpDirection; + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mNextMapUpDirection = true; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); + + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } else if (field_0x8C68 == 0) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { + mMapUpDirectionAfterZoomToDetail = mMapUpDirection; + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mNextMapUpDirection = true; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); + + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } else if (field_0x8C68 == 1) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (dPad::getDownTrigLeft() || (!mFloorBtnMgr.hasPointedAtABtnIdx() && dPad::getDownTrigA())) { + mMapUpDirectionAfterZoomToDetail = mMapUpDirection; + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mNextMapUpDirection = true; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); + + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } else if (field_0x8C68 == 3) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } + } +} + void dLytMapMain_c::initializeState_Active() {} void dLytMapMain_c::executeState_Active() { dLytMapGlobal_c *global = getGlobal(); @@ -2444,13 +2945,13 @@ void dLytMapMain_c::executeState_Active() { // TODO figure out and double check numbers if (field_0x8C68 == 4 && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && dPad::getDownTrigZ()) { - if (mIslandNamesOn) { + if (mShowIslandNames) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_OFF); } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_ON); } - mIslandNamesOn = !mIslandNamesOn; - mMarkers.setIslandNamesOn(mIslandNamesOn); + mShowIslandNames = !mShowIslandNames; + mMarkers.setIslandNamesOn(mShowIslandNames); } checkScroll(); @@ -2474,22 +2975,23 @@ void dLytMapMain_c::executeState_Active() { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(dLytMapGlobal_c::MAPMODE_STAGE)) { - if (field_0x8CC0 && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { - const mVec3_c &pos = global->getPlayerPos(); + if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + // Can zoom in around cursor, use the cursor pos getGlobal()->unprojectFromMap(field_0x8CF4, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); f32 tmp = fn_80142D90(4); fn_8013FB70(field_0x8CF4, getGlobal()->getField_0x44() / tmp); - field_0x8DB5 = true; + mDrawScaleFrame = true; } else { + // Cannot zoom in around cursor, use the player pos f32 tmp = fn_80142D90(4); f32 val = getGlobal()->getField_0x44() / tmp; fn_8013FB70(getGlobal()->getPlayerPos(), val); - field_0x8DB5 = true; + mDrawScaleFrame = true; } } if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select && - dPad::getDownTrigC() && field_0x8CC1) { + dPad::getDownTrigC() && mPointerCanPlaceBeacon) { s32 id = -1; mPinIconAggregate.findNewBeaconId(&id); if (id >= 0) { @@ -2540,7 +3042,7 @@ void dLytMapMain_c::executeState_Active() { } } void dLytMapMain_c::finalizeState_Active() { - field_0x8DB5 = false; + mDrawScaleFrame = false; } void dLytMapMain_c::initializeState_Out() { @@ -2718,7 +3220,7 @@ void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() { mMarkers.setIslandNamesOn(false); } if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { - mMarkers.setIslandNamesOn(mIslandNamesOn); + mMarkers.setIslandNamesOn(mShowIslandNames); } if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { @@ -2768,7 +3270,7 @@ void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { fn_8013FB70(field_0x8CF4, f4 / field_0x8D50); - field_0x8DB5 = true; + mDrawScaleFrame = true; } // TODO dead code @@ -2779,7 +3281,7 @@ void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { if (field_0x8C94 == 3 && field_0x0108 > 0) { field_0x0108--; } else { - field_0x8DB5 = false; + mDrawScaleFrame = false; if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); } else { @@ -2787,7 +3289,7 @@ void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { } mLyt.calc(); mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind(); - field_0x8DB5 = false; + mDrawScaleFrame = false; mMapUpDirection = mNextMapUpDirection; global->setMapRotation(field_0x8D46); global->setField_0x44(field_0x8D4C); @@ -2909,21 +3411,101 @@ void dLytMapMain_c::finalizeState_EventSwBankSmall_Step3() {} void dLytMapMain_c::initializeState_EventMapIntro_Step1() { field_0x8CB0 = sHio.field_0x1F; } -void dLytMapMain_c::executeState_EventMapIntro_Step1() {} +void dLytMapMain_c::executeState_EventMapIntro_Step1() { + if (field_0x8D6A) { + fn_80140B90(); + return; + } + + if (field_0x8CB0 != 0) { + field_0x8CB0--; + } else { + mStateMgr.changeState(StateID_EventMapIntro_Step2); + } + EventManager::execute(); +} void dLytMapMain_c::finalizeState_EventMapIntro_Step1() {} -void dLytMapMain_c::initializeState_EventMapIntro_Step2() {} -void dLytMapMain_c::executeState_EventMapIntro_Step2() {} +void dLytMapMain_c::initializeState_EventMapIntro_Step2() { + if (field_0x8880[field_0x88AC] != nullptr) { + field_0x8880[field_0x88AC]->bind(false); + field_0x8880[field_0x88AC]->setFrame(0.0f); + mLyt.calc(); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_WORLD_EXTEND); + } +} +void dLytMapMain_c::executeState_EventMapIntro_Step2() { + if (field_0x8D6A) { + fn_80140B90(); + return; + } + + if (field_0x8880[field_0x88AC] != nullptr) { + if (field_0x8880[field_0x88AC]->isEndReached()) { + field_0x8880[field_0x88AC]->unbind(); + mStateMgr.changeState(StateID_EventMapIntro_Step3); + } else { + field_0x8880[field_0x88AC]->play(); + } + } else { + mStateMgr.changeState(StateID_EventMapIntro_Step3); + } + + EventManager::execute(); +} void dLytMapMain_c::finalizeState_EventMapIntro_Step2() {} -void dLytMapMain_c::initializeState_EventMapIntro_Step3() {} -void dLytMapMain_c::executeState_EventMapIntro_Step3() {} +void dLytMapMain_c::initializeState_EventMapIntro_Step3() { + field_0x8CB0 = 0; +} +void dLytMapMain_c::executeState_EventMapIntro_Step3() { + if (field_0x8D6A) { + fn_80140B90(); + return; + } + + if (field_0x8CB0 != 0) { + field_0x8CB0--; + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + field_0x0108 = sHio.field_0x20; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + EventManager::execute(); +} void dLytMapMain_c::finalizeState_EventMapIntro_Step3() {} -void dLytMapMain_c::initializeState_EventMapIntro_Step4() {} -void dLytMapMain_c::executeState_EventMapIntro_Step4() {} +void dLytMapMain_c::initializeState_EventMapIntro_Step4() { + field_0x8CB0 = sHio.field_0x21; +} +void dLytMapMain_c::executeState_EventMapIntro_Step4() { + if (field_0x8D6A) { + fn_80140B90(); + return; + } + + if (field_0x8CB0 != 0) { + field_0x8CB0--; + } else { + field_0x8D6B = 1; + } + EventManager::execute(); +} void dLytMapMain_c::finalizeState_EventMapIntro_Step4() {} +void dLytMapMain_c::fn_80140B90() { + mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false); + mAnmGroups[MAP_MAIN_ANIM_OUT].setToEnd(); + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_OUT].unbind(); + dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; + dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10; + dScGame_c::getCamera(0)->doFn_80093360(); + dScGame_c::getCamera(0)->fn_8019E430(); + mStateMgr.changeState(StateID_Invisible); +} + void dLytMapMain_c::initializeState_EventDungeonMapGet_Step1() {} void dLytMapMain_c::executeState_EventDungeonMapGet_Step1() {} void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step1() {} @@ -3003,3 +3585,42 @@ void dLytMapMain_c::finalizeState_EventSaveObjConfirmMsgWindow() {} void dLytMapMain_c::initializeState_EventSaveObjDecide() {} void dLytMapMain_c::executeState_EventSaveObjDecide() {} void dLytMapMain_c::finalizeState_EventSaveObjDecide() {} + +void dLytMapMain_c::checkCursorPointedAtMap() { + const mVec2_c *pos2d; + dLytMapGlobal_c *global = getGlobal(); + bool pointerOnMap = true; + bool canPlaceBeacon = true; + + pos2d = &dCsGame_c::GetInstance()->getCursorIf()->getCursorPos(); + mVec3_c pos3d(0.0f, 0.0f, 0.0f); + global->unprojectFromMap(pos3d, *pos2d, global->getMapRotation()); + + f32 tmp = global->getField_0x28().x * 368.0f; + f32 nTmp = -tmp; + if (pos2d->x > tmp || pos2d->x < nTmp || pos2d->y > 209.0f || pos2d->y < -193.0f) { + // Pointer off screen? + pointerOnMap = false; + canPlaceBeacon = false; + } + + if (pointerOnMap && (pos3d.x < field_0x8930.x || pos3d.x > field_0x893C.x || pos3d.z < field_0x8930.z || + pos3d.z > field_0x893C.z)) { + // Pointer too close to the edge? + canPlaceBeacon = false; + } + + if (pointerOnMap) { + for (int i = 0; i < MAP_MAIN_NUM_BOUNDINGS_NORMAL; i++) { + if (pos3d.x >= field_0x8948[i].field_0x00.x && pos3d.x <= field_0x8948[i].field_0x0C.x && + pos3d.z >= field_0x8948[i].field_0x00.z && pos3d.z <= field_0x8948[i].field_0x0C.z) { + // Cannot place beacon when hovering over UI element (remocon, ...) + canPlaceBeacon = false; + break; + } + } + } + + mPointerOnMap = pointerOnMap; + mPointerCanPlaceBeacon = canPlaceBeacon; +} From 6d7a7007c057a5fbbdc88f12f44aab6ec7a8d030 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 10 Oct 2025 01:05:19 +0200 Subject: [PATCH 12/20] more --- config/SOUE01/symbols.txt | 29 +- include/d/d_stage.h | 8 + include/d/flag/storyflag_map.h | 4 +- include/d/lyt/d_lyt_map.h | 52 +- include/d/lyt/d_lyt_map_global.h | 8 + include/d/lyt/d_lyt_map_markers.h | 4 + include/toBeSorted/d_flow_mgr.h | 3 + src/d/lyt/d_lyt_map.cpp | 585 +++++++++++++++--- src/d/lyt/d_lyt_map_markers.cpp | 2 +- src/d/lyt/msg_window/d_lyt_msg_window_get.cpp | 1 + .../lyt/msg_window/d_lyt_msg_window_link.cpp | 1 + .../lyt/msg_window/d_lyt_msg_window_talk.cpp | 1 + 12 files changed, 577 insertions(+), 121 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index b0972835..776b8b0b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4271,7 +4271,7 @@ fn_800C38A0 = .text:0x800C38A0; // type:function size:0x58 fn_800C3900 = .text:0x800C3900; // type:function size:0xD0 fn_800C39D0 = .text:0x800C39D0; // type:function size:0x11C __ct__14dFlowMgrBase_cFP7dFlow_c = .text:0x800C3AF0; // type:function size:0x1C -ActorEventFlowManagerRelated__triggerEventEntryPoint = .text:0x800C3B10; // type:function size:0xF8 +triggerEntryPoint__14dFlowMgrBase_cFllUcUc = .text:0x800C3B10; // type:function size:0xF8 fn_800C3C10 = .text:0x800C3C10; // type:function size:0xE8 fn_800C3D00 = .text:0x800C3D00; // type:function size:0x78 fn_800C3D80 = .text:0x800C3D80; // type:function size:0xC @@ -7823,7 +7823,7 @@ canZoomIn__13dLytMapMain_cCFl = .text:0x80138510; // type:function size:0x140 canZoomOut__13dLytMapMain_cCFl = .text:0x80138650; // type:function size:0x1E0 canCenterCursor__13dLytMapMain_cCFl = .text:0x80138830; // type:function size:0x254 needsNav__13dLytMapMain_cCFl = .text:0x80138A90; // type:function size:0x8C -fn_80138B20 = .text:0x80138B20; // type:function size:0x110 +getSelectedSaveObjIdx__13dLytMapMain_cCFv = .text:0x80138B20; // type:function size:0x110 fn_80138C30 = .text:0x80138C30; // type:function size:0x38 fn_80138C70 = .text:0x80138C70; // type:function size:0xA4 fn_80138D20 = .text:0x80138D20; // type:function size:0x5C @@ -7849,7 +7849,7 @@ setButtonMessages__13dLytMapMain_cFlblb = .text:0x8013A170; // type:function siz canCenterCursor1__13dLytMapMain_cCFl = .text:0x8013AC00; // type:function size:0x4 setCursorType__13dLytMapMain_cFv = .text:0x8013AC10; // type:function size:0x138 fn_8013AD50 = .text:0x8013AD50; // type:function size:0x370 -fn_8013B0C0__13dLytMapMain_cFv = .text:0x8013B0C0; // type:function size:0x28C +calculateBoundingWorldHitboxes__13dLytMapMain_cFv = .text:0x8013B0C0; // type:function size:0x28C fn_8013B350 = .text:0x8013B350; // type:function size:0x10 initializeState_Invisible__13dLytMapMain_cFv = .text:0x8013B360; // type:function size:0x4 executeState_Invisible__13dLytMapMain_cFv = .text:0x8013B370; // type:function size:0x4 @@ -7921,8 +7921,7 @@ executeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B40; // type: finalizeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B80; // type:function size:0x4 fn_80140B90__13dLytMapMain_cFv = .text:0x80140B90; // type:function size:0xBC initializeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140C50; // type:function size:0x18 -executeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140C70; // type:function size:0x34 -fn_80140CA4 = .text:0x80140CA4; // type:function size:0x4 +executeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140C70; // type:function size:0x38 finalizeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140CB0; // type:function size:0x4 initializeState_EventDungeonMapGet_Step2__13dLytMapMain_cFv = .text:0x80140CC0; // type:function size:0x68 executeState_EventDungeonMapGet_Step2__13dLytMapMain_cFv = .text:0x80140D30; // type:function size:0x12C @@ -7931,22 +7930,19 @@ initializeState_EventDungeonMapGet_Step3__13dLytMapMain_cFv = .text:0x80140E70; executeState_EventDungeonMapGet_Step3__13dLytMapMain_cFv = .text:0x80140E90; // type:function size:0x28 finalizeState_EventDungeonMapGet_Step3__13dLytMapMain_cFv = .text:0x80140EC0; // type:function size:0x4 initializeState_EventFieldMapChange_Step1__13dLytMapMain_cFv = .text:0x80140ED0; // type:function size:0x18 -executeState_EventFieldMapChange_Step1__13dLytMapMain_cFv = .text:0x80140EF0; // type:function size:0x34 -fn_80140F24 = .text:0x80140F24; // type:function size:0x4 +executeState_EventFieldMapChange_Step1__13dLytMapMain_cFv = .text:0x80140EF0; // type:function size:0x38 finalizeState_EventFieldMapChange_Step1__13dLytMapMain_cFv = .text:0x80140F30; // type:function size:0x4 initializeState_EventFieldMapChange_Step2__13dLytMapMain_cFv = .text:0x80140F40; // type:function size:0x28 executeState_EventFieldMapChange_Step2__13dLytMapMain_cFv = .text:0x80140F70; // type:function size:0xBC finalizeState_EventFieldMapChange_Step2__13dLytMapMain_cFv = .text:0x80141030; // type:function size:0x4 initializeState_EventFieldMapChange_Step3__13dLytMapMain_cFv = .text:0x80141040; // type:function size:0x18 -executeState_EventFieldMapChange_Step3__13dLytMapMain_cFv = .text:0x80141060; // type:function size:0x58 -fn_801410B8 = .text:0x801410B8; // type:function size:0x4 +executeState_EventFieldMapChange_Step3__13dLytMapMain_cFv = .text:0x80141060; // type:function size:0x5C finalizeState_EventFieldMapChange_Step3__13dLytMapMain_cFv = .text:0x801410C0; // type:function size:0x4 initializeState_EventFieldMapChange_Step4__13dLytMapMain_cFv = .text:0x801410D0; // type:function size:0x4 executeState_EventFieldMapChange_Step4__13dLytMapMain_cFv = .text:0x801410E0; // type:function size:0x4 finalizeState_EventFieldMapChange_Step4__13dLytMapMain_cFv = .text:0x801410F0; // type:function size:0x4 initializeState_EventForestMapChange_Step1__13dLytMapMain_cFv = .text:0x80141100; // type:function size:0x18 -executeState_EventForestMapChange_Step1__13dLytMapMain_cFv = .text:0x80141120; // type:function size:0x34 -fn_80141154 = .text:0x80141154; // type:function size:0x4 +executeState_EventForestMapChange_Step1__13dLytMapMain_cFv = .text:0x80141120; // type:function size:0x38 finalizeState_EventForestMapChange_Step1__13dLytMapMain_cFv = .text:0x80141160; // type:function size:0x4 initializeState_EventForestMapChange_Step2__13dLytMapMain_cFv = .text:0x80141170; // type:function size:0x6C executeState_EventForestMapChange_Step2__13dLytMapMain_cFv = .text:0x801411E0; // type:function size:0x12C @@ -7961,11 +7957,10 @@ initializeState_EventSignalAdd_Step2__13dLytMapMain_cFv = .text:0x80141400; // t executeState_EventSignalAdd_Step2__13dLytMapMain_cFv = .text:0x80141420; // type:function size:0x90 finalizeState_EventSignalAdd_Step2__13dLytMapMain_cFv = .text:0x801414B0; // type:function size:0x4 initializeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x801414C0; // type:function size:0x18 -executeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x801414E0; // type:function size:0x34 -fn_80141514 = .text:0x80141514; // type:function size:0x4 +executeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x801414E0; // type:function size:0x38 finalizeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x80141520; // type:function size:0x4 fn_80141530__13dLytMapMain_cCFv = .text:0x80141530; // type:function size:0x48 -findGoddessChestWithStoryflag = .text:0x80141580; // type:function size:0x94 +findGoddessChestForStoryflag__13dLytMapMain_cCFl = .text:0x80141580; // type:function size:0x94 initializeState_EventGoddessCube_Step1__13dLytMapMain_cFv = .text:0x80141620; // type:function size:0x10 executeState_EventGoddessCube_Step1__13dLytMapMain_cFv = .text:0x80141630; // type:function size:0x44 finalizeState_EventGoddessCube_Step1__13dLytMapMain_cFv = .text:0x80141680; // type:function size:0x10 @@ -7975,16 +7970,16 @@ finalizeState_EventGoddessCube_Step2__13dLytMapMain_cFv = .text:0x80141E40; // t initializeState_EventGoddessCube_Step3__13dLytMapMain_cFv = .text:0x80141E50; // type:function size:0x4 executeState_EventGoddessCube_Step3__13dLytMapMain_cFv = .text:0x80141E60; // type:function size:0x18 finalizeState_EventGoddessCube_Step3__13dLytMapMain_cFv = .text:0x80141E80; // type:function size:0x4 -checkStoryflag = .text:0x80141E90; // type:function size:0x44 +checkStoryflag__13dLytMapMain_cCFl = .text:0x80141E90; // type:function size:0x44 initializeState_EventSaveObjMsgWindow__13dLytMapMain_cFv = .text:0x80141EE0; // type:function size:0x90 executeState_EventSaveObjMsgWindow__13dLytMapMain_cFv = .text:0x80141F70; // type:function size:0x54 finalizeState_EventSaveObjMsgWindow__13dLytMapMain_cFv = .text:0x80141FD0; // type:function size:0x4 -whatBirdStatuesToShow = .text:0x80141FE0; // type:function size:0x1D4 +displaySaveObjs__13dLytMapMain_cFv = .text:0x80141FE0; // type:function size:0x1D4 initializeState_EventSaveObjSelect__13dLytMapMain_cFv = .text:0x801421C0; // type:function size:0x4 executeState_EventSaveObjSelect__13dLytMapMain_cFv = .text:0x801421D0; // type:function size:0x278 getStateID__85sStateMgr_c<16dLytMapSaveObj_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80142450; // type:function size:0x10 finalizeState_EventSaveObjSelect__13dLytMapMain_cFv = .text:0x80142460; // type:function size:0x4 -getStatueSelectDestinationStruct = .text:0x80142470; // type:function size:0xEC +getSaveObjDefinition__13dLytMapMain_cCFll = .text:0x80142470; // type:function size:0xEC initializeState_EventSaveObjConfirmMsgWindow__13dLytMapMain_cFv = .text:0x80142560; // type:function size:0x18 executeState_EventSaveObjConfirmMsgWindow__13dLytMapMain_cFv = .text:0x80142580; // type:function size:0x19C finalizeState_EventSaveObjConfirmMsgWindow__13dLytMapMain_cFv = .text:0x80142720; // type:function size:0x4 diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 5d48f917..9608dd07 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -78,6 +78,14 @@ public: return field_0x1EE; } + void setField_0x1E8(u8 v) { + field_0x1E8 = v; + } + + void setField_0x1EF(u8 v) { + field_0x1EF = v; + } + void init(MapRelated *); void fn_801b4900(); void fn_801B4B80(u32 mapParams, const mVec3_c ¢er, const mVec3_c &size); diff --git a/include/d/flag/storyflag_map.h b/include/d/flag/storyflag_map.h index 759bf0ef..11c5a099 100644 --- a/include/d/flag/storyflag_map.h +++ b/include/d/flag/storyflag_map.h @@ -96,7 +96,7 @@ enum StoryFlags_e { * 3 / Water Dragon's Lair layer 3 / Behind The Temple layer 7)] Story Flag #16 (0x0010) - JP 805ACD5B 0x02 / US * 805A9ADB 0x02 */ - STORYFLAG_16, + STORYFLAG_WATER_DRAGON_SOTH_PART, /** [Triforce Completed] * Story Flag #17 (0x0011) - JP 805ACD5B 0x04 / US 805A9ADB 0x04 @@ -2657,7 +2657,7 @@ enum StoryFlags_e { /** [Flooded Faron Woods Introductory Cutscene] * Story Flag #527 (0x020F) - JP 805ACD94 0x10 / US 805A9B14 0x10 */ - STORYFLAG_527, + STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED, /** [Finishing a Silent Realm for the First time] * Story Flag #528 (0x0210) - JP 805ACD94 0x20 / US 805A9B14 0x20 diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index f79e50d0..8a0551d6 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -20,13 +20,15 @@ #include "s/s_State.hpp" #include "toBeSorted/d_flow_mgr.h" +class dAcTbox_c; + /** Bird Statue Definition (StatueSelectDestination) */ struct dMapSaveObjDefinition { /* 0x00 */ const char *stageName; /* 0x04 */ u8 room; /* 0x05 */ u8 layer; - /* 0x06 */ u8 enrance; - /* 0x08 */ UNKWORD field_0x08; + /* 0x06 */ u8 entrance; + /* 0x08 */ s32 type; /* 0x0C */ const char *statueLabel; }; @@ -129,10 +131,9 @@ struct dLytMapFloorBtnAnmGroups { /* 0xC0 */ d2d::AnmGroup_c mOnOffLight; }; -// Ostensibly a bounding box for lyt elements -struct LytMapTwoVecs { - /* 0x00 */ mVec3_c field_0x00; - /* 0x0C */ mVec3_c field_0x0C; +struct dLytMapBoundingWorldBounds { + /* 0x00 */ mVec3_c min; + /* 0x0C */ mVec3_c max; }; /** 2D UI - Map - a placed down beacon */ @@ -405,6 +406,10 @@ public: void set(nw4r::lyt::Bounding **pStatueBoundings, s32 count); void hide(s32 statueIdx); + void setCurrentStatue(s32 idx) { + mCurrentlyInStatue = idx; + } + private: f32 setStatueLabel(const char *label); @@ -417,6 +422,8 @@ private: }; class dLytMapSaveCaption_c { + friend class dLytMapMain_c; + public: dLytMapSaveCaption_c() : mStateMgr(*this, sStateID::null) {} @@ -441,6 +448,8 @@ private: // Size 0x190 class dLytMapSaveObj_c { + friend class dLytMapMain_c; + public: dLytMapSaveObj_c() : mStateMgr(*this, sStateID::null), mSelectRequest(false), mDecideRequest(false), mDecideFinished(false) {} @@ -549,6 +558,13 @@ public: STATE_FUNC_DECLARE(dLytMapMain_c, EventSaveObjDecide); private: + // TODO - used elsewhere? + enum Province_e { + PROVINCE_FARON = 0, + PROVINCE_ELDIN = 1, + PROVINCE_LANAYRU = 2, + }; + dLytMapGlobal_c *getGlobal(); void checkScroll(); bool needsNav(s32 mapMode) const; @@ -561,6 +577,8 @@ private: bool canPlaceBeacons(s32 mapMode) const; bool isPointingAtMainMap() const; + s32 getSelectedSaveObjIdx() const; + f32 fn_80142D90(s32); void fn_80142F00(mVec3_c &, s32 mapMode, u8, const mVec3_c &, const mAng &); void fn_8013FB70(const mVec3_c &, f32); @@ -588,7 +606,11 @@ private: void checkCursorPointedAtMap(); - void fn_8013B0C0(); + void calculateBoundingWorldHitboxes(); + + dAcTbox_c *findGoddessChestForStoryflag(s32 flag) const; + bool checkStoryflag(s32 flag) const; + void displaySaveObjs(); static dMapSavedData sSavedMapData; static const dMapSavedData sDefaultMapData; @@ -624,7 +646,7 @@ private: /* 0x825C */ nw4r::lyt::Bounding *field_0x825C[12]; /* 0x828C */ mVec3_c field_0x828C[12]; /* 0x831C */ UNKWORD field_0x831C; - /* 0x8320 */ UNKWORD field_0x8320; + /* 0x8320 */ u32 field_0x8320; /* 0x8324 */ u8 _0x8324[0x8328 - 0x8324]; @@ -655,7 +677,7 @@ private: /* 0x8930 */ mVec3_c field_0x8930; /* 0x893C */ mVec3_c field_0x893C; - /* 0x8948 */ LytMapTwoVecs field_0x8948[33]; + /* 0x8948 */ dLytMapBoundingWorldBounds mBoundingWorldBounds[33]; /* 0x8C60 */ s32 mMaxBeaconCount; /* 0x8C64 */ s32 field_0x8C64; @@ -673,7 +695,7 @@ private: /* 0x8C93 */ u8 field_0x8C93; /* 0x8C94 */ s32 field_0x8C94; /* 0x8C98 */ UNKWORD field_0x8C98; - /* 0x8C9C */ UNKWORD field_0x8C9C; + /* 0x8C9C */ s32 mProvince; /* 0x8CA0 */ u8 _0x8CA0[0x8CA4 - 0x8CA0]; @@ -685,11 +707,9 @@ private: /* 0x8CAE */ u8 _0x8CAE[0x8CB0 - 0x8CAE]; - /* 0x8CB0 */ u32 field_0x8CB0; + /* 0x8CB0 */ u32 mEventTimer; /* 0x8CB4 */ UNKWORD field_0x8CB4; - - /* 0x8CB8 */ u8 _0x8CB8[0x8CBC - 0x8CB8]; - + /* 0x8CB8 */ u32 field_0x8CB8; /* 0x8CBC */ nw4r::lyt::Bounding *mpMapBounding; /* 0x8CC0 */ bool mPointerOnMap; /* 0x8CC1 */ bool mPointerCanPlaceBeacon; @@ -732,7 +752,7 @@ private: /* 0x8DB0 */ UNKWORD field_0x8DB0; /* 0x8DB4 */ bool mNavEnabled; /* 0x8DB5 */ bool mDrawScaleFrame; - /* 0x8DB8 */ UNKWORD field_0x8DB8; + /* 0x8DB8 */ s32 mDisplayedBeaconCount; /* 0x8DBC */ bool mShowIslandNames; /* 0x8DBD */ bool field_0x8DBD; /* 0x8DBE */ u8 field_0x8DBE; @@ -801,7 +821,7 @@ public: } const dMapSaveObjDefinition *getSaveObjDefinition(s32 statueIdx) const { - return mMapMain.getSaveObjDefinition(mMapMain.field_0x8C9C, statueIdx); + return mMapMain.getSaveObjDefinition(mMapMain.mProvince, statueIdx); } private: diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index bab821d0..63a464f7 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -128,6 +128,10 @@ public: return field_0x4C; } + void setField_0x4C(u8 v) { + field_0x4C = v; + } + u8 getField_0x4D() const { return field_0x4D; } @@ -136,6 +140,10 @@ public: return field_0x4F; } + void setField_0x4F(u8 v) { + field_0x4F = v; + } + UNKWORD getField_0x50() const { return field_0x50; } diff --git a/include/d/lyt/d_lyt_map_markers.h b/include/d/lyt/d_lyt_map_markers.h index b95d627b..35113431 100644 --- a/include/d/lyt/d_lyt_map_markers.h +++ b/include/d/lyt/d_lyt_map_markers.h @@ -480,6 +480,10 @@ public: field_0x06F4 = v; } + void setField_0x0702(u8 v) { + field_0x0702 = v; + } + void setField_0x0703(u8 v) { field_0x0703 = v; } diff --git a/include/toBeSorted/d_flow_mgr.h b/include/toBeSorted/d_flow_mgr.h index e1834154..25784a23 100644 --- a/include/toBeSorted/d_flow_mgr.h +++ b/include/toBeSorted/d_flow_mgr.h @@ -10,6 +10,9 @@ public: dFlowMgrBase_c(dFlow_c *flow); virtual ~dFlowMgrBase_c() {} + void triggerEntryPoint(s32 labelPart1, s32 labelPart2, u8 p4, u8 p5); + bool checkFinished(); + private: /* 0x04 */ dFlow_c *mpFlow; /* 0x08 */ u8 _0x08[0x14 - 0x08]; diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 08a5fed3..488fd050 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -4,6 +4,7 @@ #include "c/c_lib.h" #include "common.h" #include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_tbox.h" #include "d/d_base.h" #include "d/d_cs_base.h" #include "d/d_cs_game.h" @@ -16,6 +17,8 @@ #include "d/d_rumble.h" #include "d/d_sc_game.h" #include "d/d_stage.h" +#include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_map_global.h" @@ -26,6 +29,9 @@ #include "d/lyt/msg_window/d_lyt_msg_window.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "egg/core/eggColorFader.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" #include "m/m_vec.h" #include "m/m_video.h" #include "nw4r/lyt/lyt_bounding.h" @@ -1928,7 +1934,7 @@ dLytMapMain_c::dLytMapMain_c() field_0x8DB0(0), mNavEnabled(false), mDrawScaleFrame(false), - field_0x8DB8(0), + mDisplayedBeaconCount(0), mShowIslandNames(false), field_0x8DBD(0), field_0x8DBE(0), @@ -2329,7 +2335,7 @@ void dLytMapMain_c::build() { field_0x8C8C = mAnmGroups[MAP_MAIN_ANIM_OUT].getLastFrame(); mAnmGroups[MAP_MAIN_ANIM_OUT].unbind(); field_0x8CAC = 0; - field_0x8DB8 = getMaxBeaconCount(); + mDisplayedBeaconCount = getMaxBeaconCount(); mStateMgr.changeState(StateID_Invisible); getGlobal()->setFloor(0); mNavEnabled = false; @@ -2389,14 +2395,41 @@ void dLytMapMain_c::draw() { mSaveCaption.draw(); } -void dLytMap_c::build() { - d2d::setLytAllocator(); - void *data = LayoutArcManager::GetInstance()->getLoadedData("Map2D"); - mResAcc.attach(data, ""); - mMapMain.build(); - m2d::setLytAllocator(); - mMapMain.setPriority(0x86); - // TODO there's another thing here at 0x91C0 +s32 dLytMapMain_c::getSelectedSaveObjIdx() const { + bool has = false; + s32 start; + s32 end; + if (field_0x8C6C == 2) { + start = 5; + end = 14; + has = true; + } else if (field_0x8C6C == 3) { + start = 15; + end = 20; + has = true; + } else if (field_0x8C6C == 4) { + start = 21; + end = 32; + has = true; + } + + if (!has) { + // @bug this should probably return -1 but it doesn't matter + return 0; + } + + s32 idx = -1; + dCursorHitCheck_c *d = dCsGame_c::GetInstance()->getCursorHit(); + if (d != nullptr && d->getType() == 'lyt ') { + for (int i = start; i <= end; i++) { + if (d == &mHitChecks[i]) { + idx = i - start; + break; + } + } + } + + return idx; } void lytMapusesSizedWString() { @@ -2432,6 +2465,7 @@ void dLytMapMain_c::loadUnkMapData() { } void dLytMapMain_c::clearButtonMessages() { + // @bug this clears flags 16k times for (int i = 0; i <= METER_BTN_0x4000; i++) { dLytMeter_c::GetInstance()->clearFlags(i); } @@ -2630,26 +2664,26 @@ void dLytMapMain_c::setCursorType() { } } -void dLytMapMain_c::fn_8013B0C0() { +void dLytMapMain_c::calculateBoundingWorldHitboxes() { dLytMapGlobal_c *global = getGlobal(); - // TODO - FPR Regswaps + f32 sc = global->getField_0x28().x; f32 f1 = field_0x8D40 * global->getField_0x44(); - f32 f2 = f1 * global->getField_0x28().x; + f32 f2 = f1 * sc; mAng rot = global->getField_0x56(); for (int i = 0; i <= MAP_MAIN_NUM_BOUNDINGS_NORMAL - 1; i++) { mVec3_c v1; mVec3_c v2; - f32 v1x = (f32)mHitChecks[i].getBoundingData()->mMinX; - f32 v2x = (f32)mHitChecks[i].getBoundingData()->mMaxX; + f32 v1x = (f32)mHitChecks[i].getBoundingData()->mMinX; + f32 v2x = (f32)mHitChecks[i].getBoundingData()->mMaxX; f32 v1z = (f32)mHitChecks[i].getBoundingData()->mMaxY; f32 v2z = (f32)mHitChecks[i].getBoundingData()->mMinY; v1.x = v1x / f2; v1.y = 0.0f; v1.z = -v1z / f1; - + v2.x = v2x / f2; v2.y = 0.0f; v2.z = -v2z / f1; @@ -2662,31 +2696,31 @@ void dLytMapMain_c::fn_8013B0C0() { s16 v = rot.mVal; if (v == 0) { // 0° rotation - field_0x8948[i].field_0x00.x = field_0x8CC4.x + v1.x; - field_0x8948[i].field_0x00.y = 0.0f; - field_0x8948[i].field_0x00.z = field_0x8CC4.z + v1.z; + mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v1.x; + mBoundingWorldBounds[i].min.y = 0.0f; + mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v1.z; - field_0x8948[i].field_0x0C.x = field_0x8CC4.x + v2.x; - field_0x8948[i].field_0x0C.y = 0.0f; - field_0x8948[i].field_0x0C.z = field_0x8CC4.z + v2.z; + mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v2.x; + mBoundingWorldBounds[i].max.y = 0.0f; + mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v2.z; } else if (v == 0x4000) { // 90° rotation - field_0x8948[i].field_0x00.x = field_0x8CC4.x + v1.x; - field_0x8948[i].field_0x00.y = 0.0f; - field_0x8948[i].field_0x00.z = field_0x8CC4.z + v2.z; + mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v1.x; + mBoundingWorldBounds[i].min.y = 0.0f; + mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v2.z; - field_0x8948[i].field_0x0C.x = field_0x8CC4.x + v2.x; - field_0x8948[i].field_0x0C.y = 0.0f; - field_0x8948[i].field_0x0C.z = field_0x8CC4.z + v1.z; + mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v2.x; + mBoundingWorldBounds[i].max.y = 0.0f; + mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v1.z; } else if (v == -0x8000) { // 180° rotation - field_0x8948[i].field_0x00.x = field_0x8CC4.x + v2.x; - field_0x8948[i].field_0x00.y = 0.0f; - field_0x8948[i].field_0x00.z = field_0x8CC4.z + v2.z; + mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v2.x; + mBoundingWorldBounds[i].min.y = 0.0f; + mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v2.z; - field_0x8948[i].field_0x0C.x = field_0x8CC4.x + v1.x; - field_0x8948[i].field_0x0C.y = 0.0f; - field_0x8948[i].field_0x0C.z = field_0x8CC4.z + v1.z; + mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v1.x; + mBoundingWorldBounds[i].max.y = 0.0f; + mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v1.z; } } } @@ -3369,12 +3403,12 @@ void dLytMapMain_c::executeState_ResetPosWithFloorChange() { void dLytMapMain_c::finalizeState_ResetPosWithFloorChange() {} void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() { - field_0x8CB0 = sHio.field_0x1D; + mEventTimer = sHio.field_0x1D; field_0x8CB4 = 0; } void dLytMapMain_c::executeState_EventSwBankSmall_Step1() { - if (field_0x8CB0 != 0) { - field_0x8CB0--; + if (mEventTimer != 0) { + mEventTimer--; return; } @@ -3384,11 +3418,11 @@ void dLytMapMain_c::executeState_EventSwBankSmall_Step1() { void dLytMapMain_c::finalizeState_EventSwBankSmall_Step1() {} void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() { - field_0x8CB0 = mMarkers.getField_0x0704(); + mEventTimer = mMarkers.getField_0x0704(); } void dLytMapMain_c::executeState_EventSwBankSmall_Step2() { - if (field_0x8CB0 != 0) { - field_0x8CB0--; + if (mEventTimer != 0) { + mEventTimer--; return; } mStateMgr.changeState(StateID_EventSwBankSmall_Step3); @@ -3396,11 +3430,11 @@ void dLytMapMain_c::executeState_EventSwBankSmall_Step2() { void dLytMapMain_c::finalizeState_EventSwBankSmall_Step2() {} void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() { - field_0x8CB0 = sHio.field_0x1E; + mEventTimer = sHio.field_0x1E; } void dLytMapMain_c::executeState_EventSwBankSmall_Step3() { - if (field_0x8CB0 != 0) { - field_0x8CB0--; + if (mEventTimer != 0) { + mEventTimer--; return; } @@ -3409,7 +3443,7 @@ void dLytMapMain_c::executeState_EventSwBankSmall_Step3() { void dLytMapMain_c::finalizeState_EventSwBankSmall_Step3() {} void dLytMapMain_c::initializeState_EventMapIntro_Step1() { - field_0x8CB0 = sHio.field_0x1F; + mEventTimer = sHio.field_0x1F; } void dLytMapMain_c::executeState_EventMapIntro_Step1() { if (field_0x8D6A) { @@ -3417,8 +3451,8 @@ void dLytMapMain_c::executeState_EventMapIntro_Step1() { return; } - if (field_0x8CB0 != 0) { - field_0x8CB0--; + if (mEventTimer != 0) { + mEventTimer--; } else { mStateMgr.changeState(StateID_EventMapIntro_Step2); } @@ -3456,7 +3490,7 @@ void dLytMapMain_c::executeState_EventMapIntro_Step2() { void dLytMapMain_c::finalizeState_EventMapIntro_Step2() {} void dLytMapMain_c::initializeState_EventMapIntro_Step3() { - field_0x8CB0 = 0; + mEventTimer = 0; } void dLytMapMain_c::executeState_EventMapIntro_Step3() { if (field_0x8D6A) { @@ -3464,8 +3498,8 @@ void dLytMapMain_c::executeState_EventMapIntro_Step3() { return; } - if (field_0x8CB0 != 0) { - field_0x8CB0--; + if (mEventTimer != 0) { + mEventTimer--; } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; @@ -3477,7 +3511,7 @@ void dLytMapMain_c::executeState_EventMapIntro_Step3() { void dLytMapMain_c::finalizeState_EventMapIntro_Step3() {} void dLytMapMain_c::initializeState_EventMapIntro_Step4() { - field_0x8CB0 = sHio.field_0x21; + mEventTimer = sHio.field_0x21; } void dLytMapMain_c::executeState_EventMapIntro_Step4() { if (field_0x8D6A) { @@ -3485,8 +3519,8 @@ void dLytMapMain_c::executeState_EventMapIntro_Step4() { return; } - if (field_0x8CB0 != 0) { - field_0x8CB0--; + if (mEventTimer != 0) { + mEventTimer--; } else { field_0x8D6B = 1; } @@ -3506,79 +3540,450 @@ void dLytMapMain_c::fn_80140B90() { mStateMgr.changeState(StateID_Invisible); } -void dLytMapMain_c::initializeState_EventDungeonMapGet_Step1() {} -void dLytMapMain_c::executeState_EventDungeonMapGet_Step1() {} +void dLytMapMain_c::initializeState_EventDungeonMapGet_Step1() { + mEventTimer = sHio.field_0x22; +} +void dLytMapMain_c::executeState_EventDungeonMapGet_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_EventDungeonMapGet_Step2); + } +} void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step1() {} -void dLytMapMain_c::initializeState_EventDungeonMapGet_Step2() {} -void dLytMapMain_c::executeState_EventDungeonMapGet_Step2() {} +void dLytMapMain_c::initializeState_EventDungeonMapGet_Step2() { + mEventTimer = sHio.field_0x23; + field_0x8CB4 = sHio.field_0x24; + field_0x8CB8 = mMarkers.getField_0x0704(); + field_0x8DBE = 0; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); +} +void dLytMapMain_c::executeState_EventDungeonMapGet_Step2() { + dLytMapGlobal_c *global = getGlobal(); + if (mEventTimer != 0 || field_0x8CB4 != 0 || field_0x8CB8 != 0) { + if (mEventTimer != 0) { + mEventTimer--; + } + u8 u1 = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; + global->setField_0x4F(u1); + field_0x8DBE = u1; + if (field_0x8CB4 != 0) { + field_0x8CB4--; + } else { + mMarkers.setField_0x0702(1); + if (field_0x8CB8 != 0) { + field_0x8CB8--; + } + } + } else { + global->setField_0x4C(0); + mStateMgr.changeState(StateID_EventDungeonMapGet_Step3); + } +} void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step2() {} -void dLytMapMain_c::initializeState_EventDungeonMapGet_Step3() {} -void dLytMapMain_c::executeState_EventDungeonMapGet_Step3() {} +void dLytMapMain_c::initializeState_EventDungeonMapGet_Step3() { + mEventTimer = sHio.field_0x25; +} +void dLytMapMain_c::executeState_EventDungeonMapGet_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + field_0x8D6B = 1; + } +} void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step3() {} -void dLytMapMain_c::initializeState_EventFieldMapChange_Step1() {} -void dLytMapMain_c::executeState_EventFieldMapChange_Step1() {} +void dLytMapMain_c::initializeState_EventFieldMapChange_Step1() { + mEventTimer = sHio.field_0x26; +} +void dLytMapMain_c::executeState_EventFieldMapChange_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_EventFieldMapChange_Step2); + } +} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step1() {} -void dLytMapMain_c::initializeState_EventFieldMapChange_Step2() {} -void dLytMapMain_c::executeState_EventFieldMapChange_Step2() {} +void dLytMapMain_c::initializeState_EventFieldMapChange_Step2() { + mEventTimer = sHio.field_0x27; + field_0x8DBE = 0; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); +} +void dLytMapMain_c::executeState_EventFieldMapChange_Step2() { + dStage_c *stage = dStage_c::GetInstance(); + u32 duration = sHio.field_0x27; + if (mEventTimer != 0) { + u8 u1 = (f32)(duration - mEventTimer) / (f32)duration * 255.0f; + stage->getMapRelated()->setField_0x1E8(u1); + mEventTimer--; + } else { + stage->getMapRelated()->setField_0x1E8(0); + stage->getMapRelated()->setField_0x1EF(1); + mStateMgr.changeState(StateID_EventFieldMapChange_Step3); + } +} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step2() {} -void dLytMapMain_c::initializeState_EventFieldMapChange_Step3() {} -void dLytMapMain_c::executeState_EventFieldMapChange_Step3() {} +void dLytMapMain_c::initializeState_EventFieldMapChange_Step3() { + mEventTimer = sHio.field_0x28; +} +void dLytMapMain_c::executeState_EventFieldMapChange_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + } else if (field_0x8C94 == 8) { + mStateMgr.changeState(StateID_Active); + } else { + mStateMgr.changeState(StateID_EventFieldMapChange_Step4); + } +} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step3() {} void dLytMapMain_c::initializeState_EventFieldMapChange_Step4() {} void dLytMapMain_c::executeState_EventFieldMapChange_Step4() {} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step4() {} -void dLytMapMain_c::initializeState_EventForestMapChange_Step1() {} -void dLytMapMain_c::executeState_EventForestMapChange_Step1() {} +void dLytMapMain_c::initializeState_EventForestMapChange_Step1() { + mEventTimer = sHio.field_0x22; +} +void dLytMapMain_c::executeState_EventForestMapChange_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_EventForestMapChange_Step2); + } +} void dLytMapMain_c::finalizeState_EventForestMapChange_Step1() {} -void dLytMapMain_c::initializeState_EventForestMapChange_Step2() {} -void dLytMapMain_c::executeState_EventForestMapChange_Step2() {} +void dLytMapMain_c::initializeState_EventForestMapChange_Step2() { + mEventTimer = sHio.field_0x23; + field_0x8CB4 = sHio.field_0x24; + field_0x8CB8 = mMarkers.getField_0x0704(); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); + field_0x8DBE = 0; +} +void dLytMapMain_c::executeState_EventForestMapChange_Step2() { + dLytMapGlobal_c *global = getGlobal(); + if (mEventTimer != 0 || field_0x8CB4 != 0 || field_0x8CB8 != 0) { + if (mEventTimer != 0) { + mEventTimer--; + } + u8 u1 = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; + global->setField_0x4F(u1); + field_0x8DBE = u1; + if (field_0x8CB4 != 0) { + field_0x8CB4--; + } else { + mMarkers.setField_0x0702(1); + if (field_0x8CB8 != 0) { + field_0x8CB8--; + } + } + } else { + global->setField_0x4C(0); + mStateMgr.changeState(StateID_EventForestMapChange_Step3); + } +} void dLytMapMain_c::finalizeState_EventForestMapChange_Step2() {} -void dLytMapMain_c::initializeState_EventForestMapChange_Step3() {} -void dLytMapMain_c::executeState_EventForestMapChange_Step3() {} +void dLytMapMain_c::initializeState_EventForestMapChange_Step3() { + mEventTimer = sHio.field_0x25; +} +void dLytMapMain_c::executeState_EventForestMapChange_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + field_0x8D6B = 1; + } +} void dLytMapMain_c::finalizeState_EventForestMapChange_Step3() {} void dLytMapMain_c::initializeState_EventSignalAdd_Step1() {} -void dLytMapMain_c::executeState_EventSignalAdd_Step1() {} +void dLytMapMain_c::executeState_EventSignalAdd_Step1() { + if (mDisplayedBeaconCount != getMaxBeaconCount()) { + mStateMgr.changeState(StateID_EventSignalAdd_Step2); + } +} void dLytMapMain_c::finalizeState_EventSignalAdd_Step1() {} -void dLytMapMain_c::initializeState_EventSignalAdd_Step2() {} -void dLytMapMain_c::executeState_EventSignalAdd_Step2() {} +void dLytMapMain_c::initializeState_EventSignalAdd_Step2() { + mEventTimer = sHio.field_0x29; +} +void dLytMapMain_c::executeState_EventSignalAdd_Step2() { + if (mDisplayedBeaconCount == getMaxBeaconCount()) { + mStateMgr.changeState(StateID_EventSignalAdd_Step3); + } else if (--mEventTimer == 0) { + mEventTimer = sHio.field_0x29; + mDisplayedBeaconCount++; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_COUNT_UP); + } +} void dLytMapMain_c::finalizeState_EventSignalAdd_Step2() {} -void dLytMapMain_c::initializeState_EventSignalAdd_Step3() {} -void dLytMapMain_c::executeState_EventSignalAdd_Step3() {} +void dLytMapMain_c::initializeState_EventSignalAdd_Step3() { + mEventTimer = sHio.field_0x25; +} +void dLytMapMain_c::executeState_EventSignalAdd_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_Active); + } +} void dLytMapMain_c::finalizeState_EventSignalAdd_Step3() {} -void dLytMapMain_c::initializeState_EventGoddessCube_Step1() {} -void dLytMapMain_c::executeState_EventGoddessCube_Step1() {} -void dLytMapMain_c::finalizeState_EventGoddessCube_Step1() {} +bool dLytMapMain_c::fn_80141530() const { + return EventManager::isInEvent() && field_0x8C94 != 11; +} + +dAcTbox_c *dLytMapMain_c::findGoddessChestForStoryflag(s32 flag) const { + dAcTbox_c *ret = nullptr; + fBase_c *it = nullptr; + while ((it = fManager_c::searchBaseByGroupType(fBase_c::ACTOR, it)) != nullptr) { + if (it->mProfileName == fProfile::TBOX) { + dAcTbox_c *box = static_cast(it); + if (box->getVariant() == dAcTbox_c::GODDESS) { + u16 boxFlag = box->getParams2Lower(); + if (flag == boxFlag) { + ret = box; + break; + } + } + } + } + return ret; +} + +void dLytMapMain_c::initializeState_EventGoddessCube_Step1() { + mEventTimer = 30; +} +void dLytMapMain_c::executeState_EventGoddessCube_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + } + if (mEventTimer == 0) { + mStateMgr.changeState(StateID_Active); + } +} +void dLytMapMain_c::finalizeState_EventGoddessCube_Step1() { + mEventTimer = 50; +} void dLytMapMain_c::initializeState_EventGoddessCube_Step2() {} void dLytMapMain_c::executeState_EventGoddessCube_Step2() {} void dLytMapMain_c::finalizeState_EventGoddessCube_Step2() {} void dLytMapMain_c::initializeState_EventGoddessCube_Step3() {} -void dLytMapMain_c::executeState_EventGoddessCube_Step3() {} +void dLytMapMain_c::executeState_EventGoddessCube_Step3() { + mStateMgr.changeState(StateID_Active); +} void dLytMapMain_c::finalizeState_EventGoddessCube_Step3() {} -void dLytMapMain_c::initializeState_EventSaveObjMsgWindow() {} -void dLytMapMain_c::executeState_EventSaveObjMsgWindow() {} +bool dLytMapMain_c::checkStoryflag(s32 flag) const { + return StoryflagManager::sInstance->getFlag(flag); +} + +void dLytMapMain_c::initializeState_EventSaveObjMsgWindow() { + if (mProvince == PROVINCE_FARON && checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && + !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { + // "A report, Master. An unusual phenomenon is taking place in Faron Woods, making it impossible to descend + // directly into them at the moment." + mFlowMgr.triggerEntryPoint(4, 18, 0, 0); + } else { + // "It is possible to descend to a specific..." / "Point to your preferred descent area..." + mFlowMgr.triggerEntryPoint(4, 19, 0, 0); + } +} +void dLytMapMain_c::executeState_EventSaveObjMsgWindow() { + if (mFlowMgr.checkFinished()) { + mStateMgr.changeState(StateID_EventSaveObjSelect); + } +} void dLytMapMain_c::finalizeState_EventSaveObjMsgWindow() {} +enum dLytMapSaveObjFlagKind { + SAVE_OBJ_FLAG_KIND_SCENEFLAG = 0, + SAVE_OBJ_FLAG_KIND_STORYFLAG = 1, +}; + +struct dLytMapSaveObjFlagDefinition { + /* 0x00 */ dLytMapSaveObjFlagKind flagType; + // I wanted designated initializers but MWCC doesn't have them... + /* 0x04 */ union { + struct { + /* 0x04 */ u16 flagArea; + /* 0x06 */ u16 sceneFlag; + }; + struct { + /* 0x04 */ s16 storyFlag; + /* 0x06 */ u16 _padding; + }; + }; +}; + +static const dLytMapSaveObjFlagDefinition sSaveObjFlagsFaron[] = { + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 10, 31}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_800}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, STORYFLAG_801}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, STORYFLAG_802}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, STORYFLAG_803}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 1, 104}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 1, 103}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 2, 32}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 2, 33}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_FARON_DISCOVERED}, +}; + +static const dLytMapSaveObjFlagDefinition sSaveObjFlagsEldin[] = { + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_804}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_805}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_806}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, STORYFLAG_807}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 5, 101}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 15, 114}, +}; + +static const dLytMapSaveObjFlagDefinition sSaveObjFlagsLanayru[] = { + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 68}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 66}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 51}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 67}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 2}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 77}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 78}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 10}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 28}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 85}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 84}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 9, 12}, +}; + +void dLytMapMain_c::displaySaveObjs() { + for (int i = 0; i < field_0x8320; i++) { + mSaveObjs[i].init(); + } + + s32 numFlags = ARRAY_LENGTH(sSaveObjFlagsFaron); + nw4r::lyt::Bounding **pBoundings = field_0x821C; + const dLytMapSaveObjFlagDefinition *flagSet = sSaveObjFlagsFaron; + switch (mProvince) { + case PROVINCE_ELDIN: { + pBoundings = field_0x8244; + flagSet = sSaveObjFlagsEldin; + numFlags = ARRAY_LENGTH(sSaveObjFlagsEldin); + break; + } + case PROVINCE_LANAYRU: { + pBoundings = field_0x825C; + flagSet = sSaveObjFlagsLanayru; + numFlags = ARRAY_LENGTH(sSaveObjFlagsLanayru); + break; + } + } + + bool isInFaronSothMode = false; + bool isInFaronFloodedMode = false; + + if (mProvince == PROVINCE_FARON) { + if (checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && + !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { + isInFaronSothMode = true; + } else if (checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED) && + !checkStoryflag(STORYFLAG_WATER_DRAGON_SOTH_PART)) { + isInFaronFloodedMode = true; + } + } + + for (int i = 0; i < numFlags; i++) { + bool visible = false; + if (isInFaronSothMode) { + if (i == 0 || i == 9) { + visible = true; + } + } else if (isInFaronFloodedMode) { + if (i == 0 || i == 4 || i == 9) { + visible = true; + } + } else if (flagSet[i].flagType == SAVE_OBJ_FLAG_KIND_SCENEFLAG) { + visible = SceneflagManager::sInstance->checkSceneflagGlobal(flagSet[i].flagArea, flagSet[i].sceneFlag); + } else if (flagSet[i].flagType == SAVE_OBJ_FLAG_KIND_STORYFLAG) { + visible = checkStoryflag(flagSet[i].storyFlag); + } + // TODO - SetVisible clrlwi + pBoundings[i]->SetVisible(visible); + } +} + void dLytMapMain_c::initializeState_EventSaveObjSelect() {} -void dLytMapMain_c::executeState_EventSaveObjSelect() {} +void dLytMapMain_c::executeState_EventSaveObjSelect() { + mSavePopup.setCurrentStatue(-1); + s32 currentSelected = getSelectedSaveObjIdx(); + + bool anyDecide = false; + for (int i = 0; i < field_0x8320; i++) { + if (mSaveObjs[i].mStateMgr.isState(dLytMapSaveObj_c::StateID_Decide)) { + anyDecide = true; + } + } + + for (int i = 0; i < field_0x8320; i++) { + mSaveObjs[i].mSelectRequest = false; + if (currentSelected == i && !anyDecide) { + mSaveObjs[i].mSelectRequest = true; + if (!mSaveObjs[i].mDecideRequest) { + mSavePopup.setCurrentStatue(i); + } + } + mSaveObjs[i].execute(); + bool select = false; + if (mSaveObjs[i].mSelectRequest) { + if (*mSaveObjs[i].mStateMgr.getStateID() == dLytMapSaveObj_c::StateID_Select) { + select = true; + } + } + + if (select && dPad::getDownTrigA()) { + mSaveObjs[i].mDecideRequest = true; + mSavePopup.setCurrentStatue(-1); + mSavePopup.hide(i); + } + } + + field_0x8DC0 = currentSelected; + + bool found = false; + s32 statueIdx = 0; + for (int i = 0; i < field_0x8320; i++) { + if (mSaveObjs[i].mDecideFinished) { + found = true; + statueIdx = i; + break; + } + } + + if (found) { + const dMapSaveObjDefinition *def = getSaveObjDefinition(mProvince, statueIdx); + mSaveCaption.setLabel(def->statueLabel); + mSaveCaption.setType(def->type); + mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_In); + mStateMgr.changeState(StateID_EventSaveObjConfirmMsgWindow); + } else { + mSavePopup.execute(); + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { + mHitChecks[i].resetCachedHitboxes(); + mHitChecks[i].execute(); + } +} void dLytMapMain_c::finalizeState_EventSaveObjSelect() {} -void dLytMapMain_c::initializeState_EventSaveObjConfirmMsgWindow() {} +void dLytMapMain_c::initializeState_EventSaveObjConfirmMsgWindow() { + // "Descend into this area? [1]Yes.[2-]No." + mFlowMgr.triggerEntryPoint(4, 17, 0, 0); +} void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() {} void dLytMapMain_c::finalizeState_EventSaveObjConfirmMsgWindow() {} @@ -3612,8 +4017,8 @@ void dLytMapMain_c::checkCursorPointedAtMap() { if (pointerOnMap) { for (int i = 0; i < MAP_MAIN_NUM_BOUNDINGS_NORMAL; i++) { - if (pos3d.x >= field_0x8948[i].field_0x00.x && pos3d.x <= field_0x8948[i].field_0x0C.x && - pos3d.z >= field_0x8948[i].field_0x00.z && pos3d.z <= field_0x8948[i].field_0x0C.z) { + if (pos3d.x >= mBoundingWorldBounds[i].min.x && pos3d.x <= mBoundingWorldBounds[i].max.x && + pos3d.z >= mBoundingWorldBounds[i].min.z && pos3d.z <= mBoundingWorldBounds[i].max.z) { // Cannot place beacon when hovering over UI element (remocon, ...) canPlaceBeacon = false; break; @@ -3624,3 +4029,13 @@ void dLytMapMain_c::checkCursorPointedAtMap() { mPointerOnMap = pointerOnMap; mPointerCanPlaceBeacon = canPlaceBeacon; } + +void dLytMap_c::build() { + d2d::setLytAllocator(); + void *data = LayoutArcManager::GetInstance()->getLoadedData("Map2D"); + mResAcc.attach(data, ""); + mMapMain.build(); + m2d::setLytAllocator(); + mMapMain.setPriority(0x86); + // TODO there's another thing here at 0x91C0 +} diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index 41863ddf..7db716a5 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -1181,7 +1181,7 @@ void dLytMapIcon01_c::setSaveObj(u32 color, nw4r::lyt::Pane *pane) { void dLytMapIcon01_c::setTerry(bool present) { // NONMATCHING - // Additional clrlwi here... + // TODO - SetVisible clrlwi // When you fix this, maybe also fix other instances of this problem // by searching for 91657b77 mpTerryOnOffPane->SetVisible(present); diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp index d595badc..4274e323 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp @@ -177,6 +177,7 @@ bool dLytMsgWindowGet_c::execute() { void dLytMsgWindowGet_c::draw() { // NONMATCHING + // TODO - SetVisible clrlwi // The instruction patterns here are the same that EGG::StateGX::Scoped // generates, but there's no RAII to be found here. What's the missing // link that makes the compiler generate these? diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp index 7b03ef4b..6564a7f3 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp @@ -240,6 +240,7 @@ bool dLytMsgWindowLink_c::execute() { void dLytMsgWindowLink_c::draw() { // NONMATCHING + // TODO - SetVisible clrlwi // The instruction patterns here are the same that EGG::StateGX::Scoped // generates, but there's no RAII to be found here. What's the missing // link that makes the compiler generate these? diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp index 30adeeab..8f9cde37 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp @@ -240,6 +240,7 @@ bool dLytMsgWindowTalk_c::execute() { void dLytMsgWindowTalk_c::draw() { // NONMATCHING + // TODO - SetVisible clrlwi // The instruction patterns here are the same that EGG::StateGX::Scoped // generates, but there's no RAII to be found here. What's the missing // link that makes the compiler generate these? From 631d950d13fb73b2f7ec7fd53d25df4edaa8479b Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 10 Oct 2025 22:36:37 +0200 Subject: [PATCH 13/20] More, documentation --- config/SOUE01/symbols.txt | 16 +- include/d/d_bzs_types.h | 2 +- include/d/d_sc_game.h | 7 +- include/d/d_stage_mgr.h | 33 +- include/d/flag/storyflag_map.h | 32 +- include/d/lyt/d_lyt_map.h | 45 ++- include/d/lyt/d_lyt_map_global.h | 4 + src/d/d_message.cpp | 2 +- src/d/lyt/d_lyt_area_caption.cpp | 10 +- src/d/lyt/d_lyt_map.cpp | 599 +++++++++++++++++++++++++++++-- src/d/lyt/d_lyt_map_markers.cpp | 8 +- src/toBeSorted/fi_context.cpp | 3 +- 12 files changed, 675 insertions(+), 86 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 776b8b0b..24138cbc 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4279,7 +4279,7 @@ fn_800C3D90 = .text:0x800C3D90; // type:function size:0x10 fn_800C3DA0 = .text:0x800C3DA0; // type:function size:0xB4 fn_800C3E60 = .text:0x800C3E60; // type:function size:0x2C fn_800C3E90 = .text:0x800C3E90; // type:function size:0x24 -ActorEventFlowManagerRelated__checkEventFinished = .text:0x800C3EC0; // type:function size:0x20C +checkFinished__14dFlowMgrBase_cFv = .text:0x800C3EC0; // type:function size:0x20C vt_0x34__11dFlowBase_cFv = .text:0x800C40D0; // type:function size:0x4 fn_800C40E0 = .text:0x800C40E0; // type:function size:0xC fn_800C40F0 = .text:0x800C40F0; // type:function size:0xB4 @@ -7857,11 +7857,11 @@ finalizeState_Invisible__13dLytMapMain_cFv = .text:0x8013B380; // type:function initializeState_RenderingWait__13dLytMapMain_cFv = .text:0x8013B390; // type:function size:0xC0 executeState_RenderingWait__13dLytMapMain_cFv = .text:0x8013B450; // type:function size:0x64 finalizeState_RenderingWait__13dLytMapMain_cFv = .text:0x8013B4C0; // type:function size:0x4 -fn_8013B4D0 = .text:0x8013B4D0; // type:function size:0xD20 +setupFlags__13dLytMapMain_cFv = .text:0x8013B4D0; // type:function size:0xD20 initializeState_In__13dLytMapMain_cFv = .text:0x8013C1F0; // type:function size:0xF4 executeState_In__13dLytMapMain_cFv = .text:0x8013C2F0; // type:function size:0x380 finalizeState_In__13dLytMapMain_cFv = .text:0x8013C670; // type:function size:0x40 -fn_8013C6B0 = .text:0x8013C6B0; // type:function size:0xA8 +getAreaGroup__13dLytMapMain_cCFl = .text:0x8013C6B0; // type:function size:0xA8 fn_8013C760 = .text:0x8013C760; // type:function size:0x100 fn_8013C860 = .text:0x8013C860; // type:function size:0x1C shouldDrawFootprints__13dLytMapMain_cCFv = .text:0x8013C880; // type:function size:0x64 @@ -8004,7 +8004,7 @@ build__9dLytMap_cFv = .text:0x801438C0; // type:function size:0x6C fn_80143930 = .text:0x80143930; // type:function size:0x60 fn_80143990 = .text:0x80143990; // type:function size:0x4C fn_801439E0 = .text:0x801439E0; // type:function size:0x4C -fn_80143A30 = .text:0x80143A30; // type:function size:0x70 +fn_80143A30__9dLytMap_cFv = .text:0x80143A30; // type:function size:0x70 getName__20dLytMapFloorBtnMgr_cCFv = .text:0x80143AA0; // type:function size:0x8 getLyt__20dLytMapFloorBtnMgr_cFv = .text:0x80143AB0; // type:function size:0x8 getPane__20dLytMapFloorBtnMgr_cFv = .text:0x80143AC0; // type:function size:0x8 @@ -10572,10 +10572,10 @@ isAreaTypeSky__11dStageMgr_cCFv = .text:0x80199970; // type:function size:0x2C isAreaTypeOverworldOrSkyloft__11dStageMgr_cCFv = .text:0x801999A0; // type:function size:0x3C isAreaTypeDungeonOrBoss__11dStageMgr_cCFv = .text:0x801999E0; // type:function size:0x3C getMapNameId__11dStageMgr_cCFv = .text:0x80199A20; // type:function size:0x20 -getSTIFbyte4__11dStageMgr_cCFv = .text:0x80199A40; // type:function size:0x20 -isSTIFbyte4_2or3or4__11dStageMgr_cCFv = .text:0x80199A60; // type:function size:0x3C -isSTIFbyte4_5or6__11dStageMgr_cCFv = .text:0x80199AA0; // type:function size:0x3C -isSTIFbyte4_7or8or9or10or11__11dStageMgr_cCFv = .text:0x80199AE0; // type:function size:0x3C +getSTIFArea__11dStageMgr_cCFv = .text:0x80199A40; // type:function size:0x20 +isSTIFAreaFaron__11dStageMgr_cCFv = .text:0x80199A60; // type:function size:0x3C +isSTIFAreaEldin__11dStageMgr_cCFv = .text:0x80199AA0; // type:function size:0x3C +isSTIFAreaLanayru__11dStageMgr_cCFv = .text:0x80199AE0; // type:function size:0x3C getSTIFunk1__11dStageMgr_cCFv = .text:0x80199B20; // type:function size:0x20 StageManager__getSTIFunk3 = .text:0x80199B40; // type:function size:0x1C fn_80199B60 = .text:0x80199B60; // type:function size:0xC diff --git a/include/d/d_bzs_types.h b/include/d/d_bzs_types.h index 638d98e0..9b31058c 100644 --- a/include/d/d_bzs_types.h +++ b/include/d/d_bzs_types.h @@ -193,7 +193,7 @@ struct STIF { /* 0x08 */ f32 defaultCullingDistance; /* 0x0C */ u16 flagIndex; /* 0x0E */ u8 areaType; - /* 0x0F */ u8 field_0x0F; + /* 0x0F */ u8 area; /* 0x10 */ u8 field_0x10; /* 0x11 */ u8 field_0x11; /* 0x12 */ s8 mapNameId; diff --git a/include/d/d_sc_game.h b/include/d/d_sc_game.h index 01b0f7bc..af9973dd 100644 --- a/include/d/d_sc_game.h +++ b/include/d/d_sc_game.h @@ -135,7 +135,8 @@ public: void triggerExit(s32 room, u16 exitIndex, s32 forcedNight = 2, s32 forcedTrial = 2); void triggerEntrance( - const char *stageName, u8 roomid, u8 layer, u8 entrance, int forcedNight = SpawnInfo::RETAIN_TOD, int forcedTrial = SpawnInfo::RETAIN_TRIAL, u8 transitionType = dFader_c::FADER_BLACK, + const char *stageName, u8 roomid, u8 layer, u8 entrance, int forcedNight = SpawnInfo::RETAIN_TOD, + int forcedTrial = SpawnInfo::RETAIN_TRIAL, u8 transitionType = dFader_c::FADER_BLACK, u16 transitionFadeFrames = 15, s8 field0x28 = -1 ); // void triggerEntrance(const char *stageName, u8 room, ); @@ -213,6 +214,10 @@ public: return mScreen1.fn_801BBEC0(); } + void setTargetingScreenPrio(u8 prio) { + mScreen1.setPriority(prio); + } + static bool sCopyFileBToCurrentAfterRespawn; static bool sDoSomethingWithFileAOnTransition; static bool sPreventClearingSomeFlag; diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index 57aad744..a455b10a 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -59,15 +59,32 @@ public: bool isAreaTypeOverworldOrSkyloft() const; s32 getSTIFunk1() const; - s32 getSTIFbyte4() const; - bool isSTIFbyte4_2or3or4() const; - bool isSTIFbyte4_5or6() const; - bool isSTIFbyte4_7or8or9or10or11() const; - bool isSTIFbyte4_1() const { - return getSTIFbyte4() == 1; + // Individually revealed areas on the main world map + enum StifArea_e { + STIF_AREA_SKY = 0, + // also applies to isle of songs, goddess statue + STIF_AREA_SEALED_GROUNDS = 1, + STIF_AREA_FARON_WOODS = 2, + STIF_AREA_DEEP_WOODS = 3, + STIF_AREA_LAKE_FLORIA = 4, + STIF_AREA_VOLCANO_SOUTH = 5, + STIF_AREA_VOLCANO_NORTH = 6, + STIF_AREA_LANAYRU_MINE = 7, + STIF_AREA_LANAYRU_DESERT = 8, + STIF_AREA_LANAYRU_SAND_SEA = 9, + STIF_AREA_LANAYRU_CAVES = 10, + STIF_AREA_LANAYRU_GORGE = 11, + }; + + s32 getSTIFArea() const; + bool isSTIFAreaFaron() const; + bool isSTIFAreaEldin() const; + bool isSTIFAreaLanayru() const; + bool isSTIFAreaSealedGrounds() const { + return getSTIFArea() == STIF_AREA_SEALED_GROUNDS; } - bool isSTIFbyte4_0() const { - return getSTIFbyte4() == 0; + bool isSTIFAreaSky() const { + return getSTIFArea() == STIF_AREA_SKY; } s32 getAreaType() const; diff --git a/include/d/flag/storyflag_map.h b/include/d/flag/storyflag_map.h index 11c5a099..56acd19d 100644 --- a/include/d/flag/storyflag_map.h +++ b/include/d/flag/storyflag_map.h @@ -452,17 +452,17 @@ enum StoryFlags_e { /** [Faron Woods introductory cutscene (Behind The Temple layer 2)] * Story Flag #87 (0x0057) - JP 805ACD6C 0x02 / US 805A9AEC 0x02 */ - STORYFLAG_87, + STORYFLAG_FARON_WOODS_DISCOVERED, /** [Lake Floria Introductory Cutscene] * Story Flag #88 (0x0058) - JP 805ACD6C 0x04 / US 805A9AEC 0x04 */ - STORYFLAG_88, + STORYFLAG_LAKE_FLORIA_DISCOVERED, /** [Skyview Introductory cutscene] * Story Flag #89 (0x0059) - JP 805ACD6C 0x08 / US 805A9AEC 0x08 */ - STORYFLAG_89, + STORYFLAG_SKYVIEW_DISCOVERED, /** [Sets after the Robot upgrades your Beetle] * Story Flag #90 (0x005A) - JP 805ACD6F 0x80 / US 805A9AEF 0x80 @@ -472,12 +472,12 @@ enum StoryFlags_e { /** [Deep Woods Introductory cutscene] * Story Flag #91 (0x005B) - JP 805ACD71 0x01 / US 805A9AF1 0x01 */ - STORYFLAG_91, + STORYFLAG_DEEP_WOODS_DISCOVERED, /** [Lanayru Desert Introductory Cutscene] * Story Flag #92 (0x005C) - JP 805ACD71 0x02 / US 805A9AF1 0x02 */ - STORYFLAG_92, + STORYFLAG_LANAYRU_DESERT_DISCOVERED, /** [Faron's Trial Gate Fi Singing Cutscene] * Story Flag #93 (0x005D) - JP 805ACD71 0x04 / US 805A9AF1 0x04 @@ -793,17 +793,17 @@ enum StoryFlags_e { /** [Ancient Cistern Introductory Cutscene (lilypad outside AC appears) (Outside AC layer 2)] * Story Flag #155 (0x009B) - JP 805ACD60 0x02 / US 805A9AE0 0x02 */ - STORYFLAG_155, + STORYFLAG_ANCIENT_CISTERN_DISCOVERED, /** [Sandship Introductory Cutscene] * Story Flag #156 (0x009C) - JP 805ACD60 0x04 / US 805A9AE0 0x04 */ - STORYFLAG_156, + STORYFLAG_SANDSHIP_DISCOVERED, /** [Ancient Harbour Introductory Cutscene] * Story Flag #157 (0x009D) - JP 805ACD60 0x08 / US 805A9AE0 0x08 */ - STORYFLAG_157, + STORYFLAG_ANCIENT_HARBOR_DISCOVERED, /** [First Time in Sand Sea] * Story Flag #158 (0x009E) - JP 805ACD60 0x10 / US 805A9AE0 0x10 @@ -813,7 +813,7 @@ enum StoryFlags_e { /** [Sky Keep Introductory Cutscene] * Story Flag #159 (0x009F) - JP 805ACD60 0x20 / US 805A9AE0 0x20 */ - STORYFLAG_159, + STORYFLAG_SKY_KEEP_DISCOVERED, /** [Mogma Mitts restricted by Bokoblin Base] * Story Flag #160 (0x00A0) - JP 805ACD60 0x80 / US 805A9AE0 0x80 @@ -883,7 +883,7 @@ enum StoryFlags_e { /** [Fire Sanctuary Introductory Cutscene] * Story Flag #173 (0x00AD) - JP 805ACD62 0x10 / US 805A9AE2 0x10 */ - STORYFLAG_173, + STORYFLAG_FIRE_SANCTUARY_DISCOVERED, /** [] * Story Flag #174 (0x00AE) - JP 805ACD62 0x20 / US 805A9AE2 0x20 @@ -933,7 +933,7 @@ enum StoryFlags_e { /** [Earth Temple Introductory Cutscene] * Story Flag #183 (0x00B7) - JP 805ACD66 0x40 / US 805A9AE6 0x40 */ - STORYFLAG_183, + STORYFLAG_EARTH_TEMPLE_DISCOVERED, /** [Impa Cutscene at Bridge in Eldin] * Story Flag #184 (0x00B8) - JP 805ACD66 0x80 / US 805A9AE6 0x80 @@ -1075,7 +1075,7 @@ enum StoryFlags_e { /** [LMF Introductory Cutscene (The loading zone to LMF now exists AND the opened Lanayru Gate of Time now appears * in the Harp Cutscene)] Story Flag #211 (0x00D3) - JP 805ACD70 0x80 / US 805A9AF0 0x80 */ - STORYFLAG_211, + STORYFLAG_LMF_DISCOVERED, /** [] * Story Flag #212 (0x00D4) - JP 805ACD73 0x01 / US 805A9AF3 0x01 @@ -2327,7 +2327,7 @@ enum StoryFlags_e { /** [Panning Camera Cutscene in Lanayru Caves showing crawlspace to Lanayru Gorge] * Story Flag #461 (0x01CD) - JP 805ACD8C 0x20 / US 805A9B0C 0x20 */ - STORYFLAG_461, + STORYFLAG_LANAYRU_CAVES_DISCOVERED, /** [Set when Thunder Dragon teaches SotH part] * Story Flag #462 (0x01CE) - JP 805ACD8C 0x40 / US 805A9B0C 0x40 @@ -2442,7 +2442,7 @@ enum StoryFlags_e { /** [Goddess Statue falling onto the Sealed Grounds Cutscene] * Story Flag #484 (0x01E4) - JP 805ACD90 0x04 / US 805A9B10 0x04 */ - STORYFLAG_484, + STORYFLAG_GODDESS_STATUE_FALLEN, /** [Groose goes back to the Groosenator after defeating Imp 3] * Story Flag #485 (0x01E5) - JP 805ACD90 0x08 / US 805A9B10 0x08 @@ -2652,7 +2652,7 @@ enum StoryFlags_e { /** [Lanayru Gorge Introductory Cutscene] * Story Flag #526 (0x020E) - JP 805ACD94 0x08 / US 805A9B14 0x08 */ - STORYFLAG_526, + STORYFLAG_LANAYRU_GORGE_DISCOVERED, /** [Flooded Faron Woods Introductory Cutscene] * Story Flag #527 (0x020F) - JP 805ACD94 0x10 / US 805A9B14 0x10 @@ -2833,7 +2833,7 @@ enum StoryFlags_e { /** [Volcano Summit Introductory Cutscene] * Story Flag #562 (0x0232) - JP 805ACD99 0x08 / US 805A9B19 0x08 */ - STORYFLAG_562, + STORYFLAG_VOLCANO_SUMMIT_DISCOVERED, /** [(not implemented yet -- 74B3)] * Story Flag #563 (0x0233) - JP from 805ACE40 0x08 to 805ACE40 0x40 / US from 805A9BC0 0x08 to 805A9BC0 0x40 diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 8a0551d6..89b0e35e 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -492,6 +492,10 @@ public: void setPosition(const mVec2_c &pos); void setScale(f32 scale); + void setVisible(bool visible) { + mVisible = visible; + } + private: /* 0x04 */ d2d::LytBase_c mLyt; /* 0x94 */ bool mVisible; @@ -558,11 +562,20 @@ public: STATE_FUNC_DECLARE(dLytMapMain_c, EventSaveObjDecide); private: - // TODO - used elsewhere? - enum Province_e { - PROVINCE_FARON = 0, - PROVINCE_ELDIN = 1, - PROVINCE_LANAYRU = 2, + // TODO - need to come up with better names + enum SurfaceProvince_e { + SURFACE_PROVINCE_FARON = 0, + SURFACE_PROVINCE_ELDIN = 1, + SURFACE_PROVINCE_LANAYRU = 2, + }; + + enum AreaGroup_e { + AREAGROUP_SKY = 1, + AREAGROUP_FARON = 2, + AREAGROUP_ELDIN = 3, + AREAGROUP_LANAYRU = 4, + AREAGROUP_SEALED_GROUNDS = 5, + AREAGROUP_MAX = 6, }; dLytMapGlobal_c *getGlobal(); @@ -577,6 +590,8 @@ private: bool canPlaceBeacons(s32 mapMode) const; bool isPointingAtMainMap() const; + s32 getAreaGroup(s32 stifArea) const; + s32 getSelectedSaveObjIdx() const; f32 fn_80142D90(s32); @@ -598,6 +613,8 @@ private: void setButtonMessages(s32 currentMapMode, bool currentUpDirection, s32 nextMapMode, bool nextUpDirection); void setCursorType(); + void setupFlags(); + void loadTextboxes(); void saveUnkMapData(); @@ -660,8 +677,8 @@ private: /* 0x8854 */ nw4r::lyt::Pane *mpPanes[11]; /* 0x8880 */ d2d::AnmGroup_c *field_0x8880[11]; // ??? /* 0x88AC */ UNKWORD field_0x88AC; - /* 0x88B0 */ nw4r::lyt::Pane *mpUnkPanes1[7]; - /* 0x88CC */ nw4r::lyt::Pane *mpUnkPanes2[7]; + /* 0x88B0 */ nw4r::lyt::Pane *mpDungeonPanes[7]; + /* 0x88CC */ nw4r::lyt::Pane *mpDungeonPics[7]; /* 0x88E8 */ nw4r::lyt::Pane *mpPaneBgAll01; /* 0x88EC */ nw4r::lyt::Pane *mpPaneBgAll02; @@ -682,7 +699,7 @@ private: /* 0x8C60 */ s32 mMaxBeaconCount; /* 0x8C64 */ s32 field_0x8C64; /* 0x8C68 */ s32 field_0x8C68; - /* 0x8C6C */ s32 field_0x8C6C; + /* 0x8C6C */ s32 mAreaGroup; /* 0x8C70 */ u32 field_0x8C70; /* 0x8C74 */ u8 _0x8C74[0x8C88 - 0x8C74]; @@ -695,7 +712,7 @@ private: /* 0x8C93 */ u8 field_0x8C93; /* 0x8C94 */ s32 field_0x8C94; /* 0x8C98 */ UNKWORD field_0x8C98; - /* 0x8C9C */ s32 mProvince; + /* 0x8C9C */ s32 mSurfaceProvince; /* 0x8CA0 */ u8 _0x8CA0[0x8CA4 - 0x8CA0]; @@ -730,7 +747,7 @@ private: /* 0x8D48 */ mAng field_0x8D48; /* 0x8D4C */ f32 field_0x8D4C; /* 0x8D50 */ f32 field_0x8D50; - /* 0x8D54 */ u8 _0x8D54[0x8D58 - 0x8D54]; + /* 0x8D54 */ s32 field_0x8D54; /* 0x8D58 */ s32 field_0x8D58; /* 0x8D5C */ UNKWORD field_0x8D5C; /* 0x8D60 */ s32 field_0x8D60; @@ -738,8 +755,8 @@ private: /* 0x8D68 */ mAng field_0x8D68; /* 0x8D6A */ u8 field_0x8D6A; // set at 0x8009e2d4 /* 0x8D6B */ u8 field_0x8D6B; - /* 0x8D6C */ UNKWORD field_0x8D6C; - /* 0x8D70 */ UNKWORD field_0x8D70; + /* 0x8D6C */ nw4r::lyt::Pane *mpRegionPane1; + /* 0x8D70 */ nw4r::lyt::Pane *mpRegionPane2; /* 0x8D74 */ nw4r::lyt::Pane *mpZoomInOutPane; /* 0x8D78 */ f32 field_0x8D78; /* 0x8D7C */ f32 field_0x8D7C; @@ -821,9 +838,11 @@ public: } const dMapSaveObjDefinition *getSaveObjDefinition(s32 statueIdx) const { - return mMapMain.getSaveObjDefinition(mMapMain.mProvince, statueIdx); + return mMapMain.getSaveObjDefinition(mMapMain.mSurfaceProvince, statueIdx); } + void fn_80143A30(); + private: /* 0x0004 */ d2d::ResAccIf_c mResAcc; /* 0x0374 */ dLytMapMain_c mMapMain; diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index 63a464f7..ba74cf78 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -88,6 +88,10 @@ public: return mAlpha; } + void setAlpha(u8 alpha) { + mAlpha = alpha; + } + s32 getCurrentMapMode() const { return mCurrentMapMode; } diff --git a/src/d/d_message.cpp b/src/d/d_message.cpp index c4490b60..ce1b290f 100644 --- a/src/d/d_message.cpp +++ b/src/d/d_message.cpp @@ -710,7 +710,7 @@ bool dFlow_c::handleMessage() { if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_BOSS_RUSH_ACTIVE)) { // "When you require my analysis..." v = 200; - } else if (dStageMgr_c::GetInstance()->getSTIFbyte4() == 0) { + } else if (dStageMgr_c::GetInstance()->getSTIFArea() == dStageMgr_c::STIF_AREA_SKY) { // Sky rumor v = cM::rndInt(30); } else { diff --git a/src/d/lyt/d_lyt_area_caption.cpp b/src/d/lyt/d_lyt_area_caption.cpp index db56ea34..d59208ac 100644 --- a/src/d/lyt/d_lyt_area_caption.cpp +++ b/src/d/lyt/d_lyt_area_caption.cpp @@ -135,15 +135,15 @@ void dLytAreaCaptionParts_c::executeState_Wait() { if (field_0x54C) { field_0x54C = false; s32 typeFrame = 0; - if (dStageMgr_c::GetInstance()->isSTIFbyte4_2or3or4()) { + if (dStageMgr_c::GetInstance()->isSTIFAreaFaron()) { typeFrame = 1; - } else if (dStageMgr_c::GetInstance()->isSTIFbyte4_5or6()) { + } else if (dStageMgr_c::GetInstance()->isSTIFAreaEldin()) { typeFrame = 2; - } else if (dStageMgr_c::GetInstance()->isSTIFbyte4_7or8or9or10or11()) { + } else if (dStageMgr_c::GetInstance()->isSTIFAreaLanayru()) { typeFrame = 3; - } else if (dStageMgr_c::GetInstance()->isSTIFbyte4_1()) { + } else if (dStageMgr_c::GetInstance()->isSTIFAreaSealedGrounds()) { typeFrame = 4; - } else if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + } else if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { typeFrame = 5; } diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 488fd050..999b7bca 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -10,6 +10,7 @@ #include "d/d_cs_game.h" #include "d/d_cursor_hit_check.h" #include "d/d_d2d.h" +#include "d/d_fader.h" #include "d/d_message.h" #include "d/d_pad.h" #include "d/d_pad_nav.h" @@ -17,6 +18,7 @@ #include "d/d_rumble.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/d2d.h" @@ -1909,7 +1911,7 @@ dLytMapMain_c::dLytMapMain_c() mFlowMgr(&mFlow), mFloorBtnMgr(&mGlobal), mFootPrints(&mGlobal), - field_0x8C6C(0), + mAreaGroup(0), mMapUpDirectionAfterZoomToDetail(true), field_0x8C93(0), field_0x8C94(0), @@ -1929,8 +1931,8 @@ dLytMapMain_c::dLytMapMain_c() field_0x8D68(0), field_0x8D6A(0), field_0x8D6B(0), - field_0x8D6C(0), - field_0x8D70(0), + mpRegionPane1(nullptr), + mpRegionPane2(nullptr), field_0x8DB0(0), mNavEnabled(false), mDrawScaleFrame(false), @@ -2150,6 +2152,24 @@ static const d2d::LytBrlanMapping sMapMainBrlanMap[] = { #define MAP_MAIN_ANIM_SKYLOFT_UP_DOWN 19 #define MAP_MAIN_ANIM_LINK_POSITION_LIGHT 20 +#define MAP_MAIN_ANIM_MAP_Z_IN_FOREST 21 +#define MAP_MAIN_ANIM_MAP_Z_WAKU_IN 22 + +#define MAP_MAIN_ANIM_MAP_Z_IN_PLANT 25 + +#define MAP_MAIN_ANIM_MAP_ZA_IN_PLANT 27 + +#define MAP_MAIN_ANIM_MAP_Z_IN_DESERT 29 + +#define MAP_MAIN_ANIM_MAP_Z_IN_VOLCANO 31 + +#define MAP_MAIN_ANIM_MAP_ZA_IN_FOREST 36 +#define MAP_MAIN_ANIM_MAP_ZA_IN_DESERT 37 +#define MAP_MAIN_ANIM_MAP_ZA_IN_VOLCANO 38 + +#define MAP_MAIN_ANIM_MAP_ZA_IN_SKY_MAP_2 41 +#define MAP_MAIN_ANIM_MAP_ZA_OUT_SKY_COURSE 44 + #define MAP_MAIN_ANIM_SUN_ROTE 45 #define MAP_MAIN_ANIM_IN_NO_CAM 46 #define MAP_MAIN_ANIM_OUT_NO_CAM 47 @@ -2182,11 +2202,11 @@ static const char *sPaneNames[] = { "N_lName_00", "N_gName_02", "N_gName_01", "N_nVname_00", "N_gName_00", }; -static const char *sPaneNamesUnk1[] = { +static const char *sDungeonPaneNames[] = { "N_fD1_00", "N_vD1_00", "N_dD1_00", "N_fD2_00", "N_dD2_00", "N_vD2_00", "N_lastD_00", }; -static const char *sPaneNamesUnk2[] = { +static const char *sDungeonPicNames[] = { "P_fD1_00", "P_vD1_00", "P_dD1_00", "P_fD2_00", "P_dD2_00", "P_vD2_00", "P_lastD_00", }; @@ -2287,17 +2307,17 @@ void dLytMapMain_c::build() { } } - for (int i = 0; i < (int)ARRAY_LENGTH(sPaneNamesUnk1); i++) { - if (sPaneNamesUnk1[i] != nullptr) { - mpUnkPanes1[i] = mLyt.findPane(sPaneNamesUnk1[i]); + for (int i = 0; i < (int)ARRAY_LENGTH(sDungeonPaneNames); i++) { + if (sDungeonPaneNames[i] != nullptr) { + mpDungeonPanes[i] = mLyt.findPane(sDungeonPaneNames[i]); } else { - mpUnkPanes1[i] = nullptr; + mpDungeonPanes[i] = nullptr; } - if (sPaneNamesUnk2[i] != nullptr) { - mpUnkPanes2[i] = mLyt.findPane(sPaneNamesUnk2[i]); + if (sDungeonPicNames[i] != nullptr) { + mpDungeonPics[i] = mLyt.findPane(sDungeonPicNames[i]); } else { - mpUnkPanes2[i] = nullptr; + mpDungeonPics[i] = nullptr; } } @@ -2399,15 +2419,15 @@ s32 dLytMapMain_c::getSelectedSaveObjIdx() const { bool has = false; s32 start; s32 end; - if (field_0x8C6C == 2) { + if (mAreaGroup == AREAGROUP_FARON) { start = 5; end = 14; has = true; - } else if (field_0x8C6C == 3) { + } else if (mAreaGroup == AREAGROUP_ELDIN) { start = 15; end = 20; has = true; - } else if (field_0x8C6C == 4) { + } else if (mAreaGroup == AREAGROUP_LANAYRU) { start = 21; end = 32; has = true; @@ -2733,12 +2753,436 @@ void dLytMapMain_c::initializeState_RenderingWait() {} void dLytMapMain_c::executeState_RenderingWait() {} void dLytMapMain_c::finalizeState_RenderingWait() {} +struct dLytMapStoryflagPaneMapping { + /* 0x00 */ s32 storyFlag; + /* 0x04 */ const char *paneName; +}; + +static const dLytMapStoryflagPaneMapping sStoryflagPaneMap[] = { + { STORYFLAG_FARON_PILLAR_OPENED, "N_forestP_00"}, + { STORYFLAG_ELDIN_PILLAR_OPENED, "N_volcanoP_00"}, + { STORYFLAG_LANAYRU_PILLAR_OPENED, "N_desertP_00"}, + { STORYFLAG_FARON_DISCOVERED, "N_toForest_00"}, + { STORYFLAG_ELDIN_DISCOVERED, "N_toVolcano_00"}, + { STORYFLAG_LANAYRU_DISCOVERED, "N_toDesert_00"}, + { STORYFLAG_ISLE_OF_SONGS_DISCOVERED, "N_utaN_00"}, + {STORYFLAG_FUN_FUN_ISLAND_DISCOVERED, "N_ruretouN_00"}, + { STORYFLAG_LUMPY_PUMPKIN_DISCOVERED, "N_pampkinN_00"}, + { STORYFLAG_BEEDLE_ISLAND_DISCOVERED, "N_teryN_00"}, + { STORYFLAG_BAMBOO_ISLAND_DISCOVERED, "N_tikurinN_00"}, + { STORYFLAG_BUG_HAVEN_DISCOVERED, "N_musiN_00"}, + { STORYFLAG_ISLE_OF_SONGS_DISCOVERED, "N_utaI_00"}, + {STORYFLAG_FUN_FUN_ISLAND_DISCOVERED, "N_ruretouI_00"}, + { STORYFLAG_LUMPY_PUMPKIN_DISCOVERED, "N_pampkinI_00"}, + { STORYFLAG_BEEDLE_ISLAND_DISCOVERED, "N_teryI_00"}, + { STORYFLAG_BAMBOO_ISLAND_DISCOVERED, "N_tikurinI_00"}, + { STORYFLAG_BUG_HAVEN_DISCOVERED, "N_musiI_00"}, + {STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED, "N_nushi_00"}, +}; + +// 255 is a placeholder for "no flag", despite it corresponding to an actual story flag... +static const s32 sFlagsRenameMe[] = { + 255, STORYFLAG_FARON_PILLAR_OPENED, STORYFLAG_ELDIN_PILLAR_OPENED, STORYFLAG_LANAYRU_PILLAR_OPENED, + STORYFLAG_THUNDERHEAD_ENTERED +}; + +// Not sure what the second number means +static const s32 sFlags2RenameMe[][2] = { + { STORYFLAG_FARON_DISCOVERED, 5}, + { STORYFLAG_FARON_WOODS_DISCOVERED, 2}, + { STORYFLAG_DEEP_WOODS_DISCOVERED, 2}, + { STORYFLAG_ELDIN_DISCOVERED, 3}, + { STORYFLAG_LANAYRU_DISCOVERED, 4}, + {STORYFLAG_LANAYRU_DESERT_DISCOVERED, 4}, + { STORYFLAG_LAKE_FLORIA_DISCOVERED, 2}, + { STORYFLAG_LANAYRU_CAVES_DISCOVERED, 4}, + {STORYFLAG_ANCIENT_HARBOR_DISCOVERED, 4}, + {STORYFLAG_VOLCANO_SUMMIT_DISCOVERED, 3}, + { STORYFLAG_LANAYRU_GORGE_DISCOVERED, 4}, +}; + +static const s32 sDungeonDiscoveredFlags[] = { + STORYFLAG_SKYVIEW_DISCOVERED, STORYFLAG_EARTH_TEMPLE_DISCOVERED, STORYFLAG_LMF_DISCOVERED, + STORYFLAG_ANCIENT_CISTERN_DISCOVERED, STORYFLAG_SANDSHIP_DISCOVERED, STORYFLAG_FIRE_SANCTUARY_DISCOVERED, + STORYFLAG_SKY_KEEP_DISCOVERED, +}; + +static const char *sAreaPicNamesL[] = { + "P_plainL_00", "P_forestL_00", "P_nForestL_00", "P_sVolcanoL_00", "P_mineL_00", "P_desertL_00", + "P_lakeL_00", "P_glenL_00", "P_seaL_00", "P_nVolcanoL_00", "P_skyloftL_00", "P_glenL_01", +}; + +static const char *sAreaPicNamesLink[] = { + "P_plainLink_00", "P_forestLink_00", "P_nForestLink_00", "P_sVolLink_00", "P_mineLink_00", "P_desertLink_00", + "P_lakeLink_00", "P_glenLink_00", "P_seaLink_00", "P_nVolLink_00", "P_skyloftLink_00", "P_glenLink_01", +}; + +#define MAP_MAIN_AREA_PIC_PLAIN 0 +#define MAP_MAIN_AREA_PIC_FOREST 1 +#define MAP_MAIN_AREA_PIC_N_FOREST 2 +#define MAP_MAIN_AREA_PIC_S_VOLCANO 3 +#define MAP_MAIN_AREA_PIC_MINE 4 +#define MAP_MAIN_AREA_PIC_DESERT 5 +#define MAP_MAIN_AREA_PIC_LACE 6 +#define MAP_MAIN_AREA_PIC_GLEN_00 7 +#define MAP_MAIN_AREA_PIC_SEA 8 +#define MAP_MAIN_AREA_PIC_N_VOLCANO 9 +#define MAP_MAIN_AREA_PIC_SKYLOFT 10 +#define MAP_MAIN_AREA_PIC_GLEN_01 11 + +#define MAP_MAIN_NUM_AREA_PICS 12 + +void dLytMapMain_c::setupFlags() { + if (field_0x8C94 == 4 || field_0x8C94 == 6) { + field_0x8DBE = 0; + } else { + field_0x8DBE = -1; + } + field_0x8D6B = 0; + field_0x8D6A = 0; + + mpAllPane->SetVisible(true); + s32 currentRegion; + switch (dStageMgr_c::GetInstance()->getSTIFArea()) { + default: currentRegion = MAP_MAIN_AREA_PIC_SKYLOFT; break; + case dStageMgr_c::STIF_AREA_SEALED_GROUNDS: currentRegion = MAP_MAIN_AREA_PIC_PLAIN; break; + case dStageMgr_c::STIF_AREA_FARON_WOODS: currentRegion = MAP_MAIN_AREA_PIC_FOREST; break; + case dStageMgr_c::STIF_AREA_DEEP_WOODS: currentRegion = MAP_MAIN_AREA_PIC_N_FOREST; break; + case dStageMgr_c::STIF_AREA_LAKE_FLORIA: currentRegion = MAP_MAIN_AREA_PIC_LACE; break; + case dStageMgr_c::STIF_AREA_VOLCANO_SOUTH: currentRegion = MAP_MAIN_AREA_PIC_S_VOLCANO; break; + case dStageMgr_c::STIF_AREA_VOLCANO_NORTH: currentRegion = MAP_MAIN_AREA_PIC_N_VOLCANO; break; + case dStageMgr_c::STIF_AREA_LANAYRU_MINE: currentRegion = MAP_MAIN_AREA_PIC_MINE; break; + case dStageMgr_c::STIF_AREA_LANAYRU_DESERT: currentRegion = MAP_MAIN_AREA_PIC_DESERT; break; + case dStageMgr_c::STIF_AREA_LANAYRU_SAND_SEA: currentRegion = MAP_MAIN_AREA_PIC_SEA; break; + case dStageMgr_c::STIF_AREA_LANAYRU_CAVES: currentRegion = MAP_MAIN_AREA_PIC_GLEN_00; break; + case dStageMgr_c::STIF_AREA_LANAYRU_GORGE: currentRegion = MAP_MAIN_AREA_PIC_GLEN_01; break; + } + // TODO - regswap between i and ok + for (int i = 0; i < (int)ARRAY_LENGTH(sStoryflagPaneMap); i++) { + nw4r::lyt::Pane *p = mLyt.findPane(sStoryflagPaneMap[i].paneName); + bool ok = StoryflagManager::sInstance->getFlag(sStoryflagPaneMap[i].storyFlag) != 0; + if (i >= 0 && i < 6 && (dScGame_c::isCurrentStage("F403") || dScGame_c::isCurrentStage("F404"))) { + // If we're in the past, light pillars aren't a thing + ok = false; + } + if (ok) { + p->SetVisible(true); + } else { + p->SetVisible(false); + } + } + + if (StoryflagManager::sInstance->getFlag(STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED)) { + mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].bind(false); + } + mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].bind(false); + + f32 titleLineFrame = 4.0f; + // TODO - lots of regswaps + for (int i = ARRAY_LENGTH(sFlagsRenameMe) - 1; i >= 0; i--) { + s32 flag = sFlagsRenameMe[i]; + // This might be an inline... + bool doBreak = true; + bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag); + if (!flagSet && flag != 255) { + doBreak = false; + } + if (doBreak) { + break; + } + titleLineFrame -= 1.0f; + } + mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].setFrame(titleLineFrame); + mAnmGroups[MAP_MAIN_ANIM_MAP_V].bind(false); + if (field_0x8C68 == 1 || field_0x8C68 == 3) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_MAP_V].setFrame(3.0f); + } + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mAnmGroups[MAP_MAIN_ANIM_MAP_V].setFrame(2.0f); + } + } + + field_0x8880[0] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_PLAIN]; + field_0x8880[1] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_FOREST]; + field_0x8880[2] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_N_FOREST]; + field_0x8880[3] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_S_VOLCANO]; + field_0x8880[4] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_MINE]; + field_0x8880[5] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_DESERT]; + field_0x8880[6] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_LAKE]; + field_0x8880[7] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_GLEN_01]; + field_0x8880[8] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_SEA]; + field_0x8880[9] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_N_VOLCANO]; + field_0x8880[10] = &mAnmGroups[MAP_MAIN_ANIM_DRAW_GLEN_00]; + + for (int i = 0; i < (int)ARRAY_LENGTH(field_0x8880); i++) { + if (field_0x8880[i] != nullptr) { + field_0x8880[i]->bind(false); + field_0x8880[i]->setToEnd(); + } + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mpPanes); i++) { + if (mpPanes[i] != nullptr) { + mpPanes[i]->SetVisible(true); + } + } + + field_0x88AC = -1; + + for (int i = ARRAY_LENGTH(sFlags2RenameMe) - 1; i >= 0; i--) { + s32 flag = sFlags2RenameMe[i][0]; + bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag); + if (flagSet) { + field_0x88AC = i; + break; + } + if (mpPanes[i] != nullptr) { + mpPanes[i]->SetVisible(false); + } + if (field_0x8880[i] != nullptr) { + field_0x8880[i]->setFrame(0.0f); + } + } + + if (field_0x8C94 == 3) { + if (field_0x88AC < 0) { + field_0x88AC = 0; + } + if (field_0x88AC >= 0) { + if (mpPanes[field_0x88AC] != nullptr) { + mpPanes[field_0x88AC]->SetVisible(true); + } + if (field_0x8880[field_0x88AC] != nullptr) { + field_0x8880[field_0x88AC]->setFrame(0.0f); + } + } + } + + for (int i = 0; i < (int)ARRAY_LENGTH(sDungeonDiscoveredFlags); i++) { + if (mpDungeonPanes[i] != nullptr) { + mpDungeonPanes[i]->SetVisible(true); + } + if (mpDungeonPics[i] != nullptr) { + mpDungeonPics[i]->SetVisible(true); + } + } + + for (int i = ARRAY_LENGTH(sDungeonDiscoveredFlags) - 1; i >= 0; i--) { + s32 flag = sDungeonDiscoveredFlags[i]; + bool flagSet = flag != 255 && StoryflagManager::sInstance->getCounterOrFlag(flag); + if (flagSet) { + break; + } + if (mpDungeonPanes[i] != nullptr) { + mpDungeonPanes[i]->SetVisible(false); + } + if (mpDungeonPics[i] != nullptr) { + mpDungeonPics[i]->SetVisible(false); + } + } + + if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_TRIFORCE_COMPLETE) && + !dScGame_c::isCurrentStage("F403") && !dScGame_c::isCurrentStage("F404")) { + if (mpDungeonPanes[6] != nullptr) { + mpDungeonPanes[6]->SetVisible(false); + } + if (mpDungeonPics[6] != nullptr) { + mpDungeonPics[6]->SetVisible(false); + } + } + + mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].bind(false); + + if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_TRIFORCE_COMPLETE) && + !dScGame_c::isCurrentStage("F403") && !dScGame_c::isCurrentStage("F404")) { + mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].setFrame(1.0f); + } else { + mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].setFrame(0.0f); + } + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + if (mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_WORLD_STATE].unbind(); + } + + for (int i = 0; i < 11; i++) { + if (field_0x8880[i] != nullptr) { + field_0x8880[i]->unbind(); + } + } + + mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].bind(false); + mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false); + + d2d::AnmGroup_c *grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_FOREST]; + d2d::AnmGroup_c *grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_FOREST]; + d2d::AnmGroup_c *grpZWakuIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_WAKU_IN]; + if (mAreaGroup == AREAGROUP_SEALED_GROUNDS) { + grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_PLANT]; + grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_PLANT]; + } else if (mAreaGroup == AREAGROUP_ELDIN) { + grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_VOLCANO]; + grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_VOLCANO]; + } else if (mAreaGroup == AREAGROUP_LANAYRU) { + grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_Z_IN_DESERT]; + grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_DESERT]; + } + + if (field_0x8C68 == 2 || (mAreaGroup == AREAGROUP_SKY && (field_0x8C68 == 3 || field_0x8C68 == 1))) { + grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_SKY_MAP_2]; + grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_OUT_SKY_COURSE]; + } + + mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].bind(false); + mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOK].bind(false); + mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].bind(false); + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + grpZAIn->bind(false); + grpZAIn->setFrame(0.0f); + grpZWakuIn->bind(false); + grpZWakuIn->setToEnd(); + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + grpZAIn->bind(false); + grpZAIn->setToEnd(); + // no group1->bind(false) ? + grpZIn->setToEnd(); + grpZWakuIn->bind(false); + grpZWakuIn->setFrame(0.0f); + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + grpZIn->bind(false); + grpZIn->setFrame(0.0f); + grpZWakuIn->bind(false); + grpZWakuIn->setFrame(0.0f); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } + + if (field_0x8C94 == 2) { + mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].bind(false); + mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setToEnd(); + } else { + mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].bind(false); + mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].bind(false); + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setFrame(0.0f); + mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].setToEnd(); + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setToEnd(); + mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].setFrame(0.0f); + } + } + + mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].bind(false); + mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].setFrame(field_0x8D54 - 1); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].unbind(); + if (mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].unbind(); + } + if (mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_TITLE_ON_OFF].unbind(); + } + if (grpZIn->isBound()) { + grpZIn->unbind(); + } + if (grpZAIn->isBound()) { + grpZAIn->unbind(); + } + if (grpZWakuIn->isBound()) { + grpZWakuIn->unbind(); + } + mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind(); + mpAllPane->SetVisible(false); + if (mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].unbind(); + } + getGlobal()->setAlpha(0); + // we had JUST set this to invisible... + mpAllPane->SetVisible(true); + mpRegionPane1 = nullptr; + for (int i = 0; i < MAP_MAIN_NUM_AREA_PICS; i++) { + nw4r::lyt::Pane *p1 = mLyt.findPane(sAreaPicNamesL[i]); + nw4r::lyt::Pane *p2 = mLyt.findPane(sAreaPicNamesLink[i]); + if (i == currentRegion) { + p1->SetVisible(true); + p2->SetVisible(true); + mpRegionPane1 = p1; + // TODO - was this meant to be p2? + mpRegionPane2 = p1; + } else { + p1->SetVisible(false); + p2->SetVisible(false); + } + } + + if (field_0x8C68 == 4 || field_0x8C68 == 5) { + mLyt.findPane("P_skyloftLink_00")->SetVisible(false); + } + + if (canPlaceBeacons(mCurrentMapMode) && canPlaceBeacons(mNextMapMode)) { + mPutIcon.setVisible(true); + mpNoroshiPane->SetVisible(true); + } else { + mpNoroshiPane->SetVisible(false); + mPutIcon.setVisible(false); + } + + if (field_0x8C68 == 4) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mMarkers.setIslandNamesOn(mShowIslandNames); + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mMarkers.setIslandNamesOn(false); + } + } +} + void dLytMapMain_c::initializeState_In() {} void dLytMapMain_c::executeState_In() {} void dLytMapMain_c::finalizeState_In() {} +s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { + s32 ret = AREAGROUP_MAX; + if (field_0x8C94 == 10) { + switch (mSurfaceProvince) { + case SURFACE_PROVINCE_FARON: ret = AREAGROUP_FARON; break; + case SURFACE_PROVINCE_ELDIN: ret = AREAGROUP_ELDIN; break; + case SURFACE_PROVINCE_LANAYRU: ret = AREAGROUP_LANAYRU; break; + } + } else { + switch (stifArea) { + case dStageMgr_c::STIF_AREA_SKY: ret = AREAGROUP_SKY; break; + case dStageMgr_c::STIF_AREA_SEALED_GROUNDS: ret = AREAGROUP_SEALED_GROUNDS; break; + case dStageMgr_c::STIF_AREA_FARON_WOODS: + case dStageMgr_c::STIF_AREA_DEEP_WOODS: + case dStageMgr_c::STIF_AREA_LAKE_FLORIA: ret = AREAGROUP_FARON; break; + case dStageMgr_c::STIF_AREA_VOLCANO_SOUTH: + case dStageMgr_c::STIF_AREA_VOLCANO_NORTH: ret = AREAGROUP_ELDIN; break; + case dStageMgr_c::STIF_AREA_LANAYRU_MINE: + case dStageMgr_c::STIF_AREA_LANAYRU_DESERT: + case dStageMgr_c::STIF_AREA_LANAYRU_SAND_SEA: + case dStageMgr_c::STIF_AREA_LANAYRU_CAVES: + case dStageMgr_c::STIF_AREA_LANAYRU_GORGE: ret = AREAGROUP_LANAYRU; break; + } + } + + return ret; +} + void dLytMapMain_c::zoomIn() { - if (field_0x8C68 == 2 || (field_0x8C6C == 1 && (field_0x8C68 == 3 || field_0x8C68 == 1))) { + if (field_0x8C68 == 2 || (mAreaGroup == AREAGROUP_SKY && (field_0x8C68 == 3 || field_0x8C68 == 1))) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); @@ -2860,7 +3304,7 @@ void dLytMapMain_c::zoomIn() { } void dLytMapMain_c::zoomOut() { - if (field_0x8C68 == 2 || (field_0x8C6C == 1 && (field_0x8C68 == 3 || field_0x8C68 == 1))) { + if (field_0x8C68 == 2 || (mAreaGroup == AREAGROUP_SKY && (field_0x8C68 == 3 || field_0x8C68 == 1))) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { if (dPad::getDownTrigLeft()) { mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; @@ -3786,7 +4230,7 @@ bool dLytMapMain_c::checkStoryflag(s32 flag) const { } void dLytMapMain_c::initializeState_EventSaveObjMsgWindow() { - if (mProvince == PROVINCE_FARON && checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && + if (mSurfaceProvince == SURFACE_PROVINCE_FARON && checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { // "A report, Master. An unusual phenomenon is taking place in Faron Woods, making it impossible to descend // directly into them at the moment." @@ -3826,9 +4270,9 @@ struct dLytMapSaveObjFlagDefinition { static const dLytMapSaveObjFlagDefinition sSaveObjFlagsFaron[] = { {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 10, 31}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_800}, - {SAVE_OBJ_FLAG_KIND_SCENEFLAG, STORYFLAG_801}, - {SAVE_OBJ_FLAG_KIND_SCENEFLAG, STORYFLAG_802}, - {SAVE_OBJ_FLAG_KIND_SCENEFLAG, STORYFLAG_803}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_801}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_802}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_803}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 1, 104}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 1, 103}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 2, 32}, @@ -3840,7 +4284,7 @@ static const dLytMapSaveObjFlagDefinition sSaveObjFlagsEldin[] = { {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_804}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_805}, {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_806}, - {SAVE_OBJ_FLAG_KIND_SCENEFLAG, STORYFLAG_807}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_807}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 5, 101}, {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 15, 114}, }; @@ -3868,14 +4312,14 @@ void dLytMapMain_c::displaySaveObjs() { s32 numFlags = ARRAY_LENGTH(sSaveObjFlagsFaron); nw4r::lyt::Bounding **pBoundings = field_0x821C; const dLytMapSaveObjFlagDefinition *flagSet = sSaveObjFlagsFaron; - switch (mProvince) { - case PROVINCE_ELDIN: { + switch (mSurfaceProvince) { + case SURFACE_PROVINCE_ELDIN: { pBoundings = field_0x8244; flagSet = sSaveObjFlagsEldin; numFlags = ARRAY_LENGTH(sSaveObjFlagsEldin); break; } - case PROVINCE_LANAYRU: { + case SURFACE_PROVINCE_LANAYRU: { pBoundings = field_0x825C; flagSet = sSaveObjFlagsLanayru; numFlags = ARRAY_LENGTH(sSaveObjFlagsLanayru); @@ -3886,7 +4330,7 @@ void dLytMapMain_c::displaySaveObjs() { bool isInFaronSothMode = false; bool isInFaronFloodedMode = false; - if (mProvince == PROVINCE_FARON) { + if (mSurfaceProvince == SURFACE_PROVINCE_FARON) { if (checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { isInFaronSothMode = true; @@ -3964,7 +4408,7 @@ void dLytMapMain_c::executeState_EventSaveObjSelect() { } if (found) { - const dMapSaveObjDefinition *def = getSaveObjDefinition(mProvince, statueIdx); + const dMapSaveObjDefinition *def = getSaveObjDefinition(mSurfaceProvince, statueIdx); mSaveCaption.setLabel(def->statueLabel); mSaveCaption.setType(def->type); mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_In); @@ -3980,11 +4424,110 @@ void dLytMapMain_c::executeState_EventSaveObjSelect() { } void dLytMapMain_c::finalizeState_EventSaveObjSelect() {} +static const dMapSaveObjDefinition sFaronSaveObjs[] = { + { "F400", 0, 0, 10, 4, "SAVEOBJ_NAME_00"}, + { "F100", 0, 0, 50, 1, "SAVEOBJ_NAME_01"}, + { "F100", 0, 0, 51, 1, "SAVEOBJ_NAME_02"}, + { "F100", 0, 0, 52, 1, "SAVEOBJ_NAME_03"}, + { "F100", 0, 0, 53, 1, "SAVEOBJ_NAME_04"}, + { "F101", 0, 0, 13, 1, "SAVEOBJ_NAME_05"}, + { "F101", 0, 0, 14, 1, "SAVEOBJ_NAME_06"}, + { "F102", 3, 0, 2, 1, "SAVEOBJ_NAME_07"}, + {"F102_1", 0, 0, 5, 1, "SAVEOBJ_NAME_08"}, + { "F401", 1, 0, 8, 4, "SAVEOBJ_NAME_28"}, +}; +static const dMapSaveObjDefinition sFloodedFaronSaveObj = {"F103", 0, 0, 9, 1, "SAVEOBJ_NAME_09"}; +static const dMapSaveObjDefinition sFaronLoweredGoddessStatueSaveObj = {"F406", 1, 0, 5, 4, "SAVEOBJ_NAME_29"}; +static const dMapSaveObjDefinition sEldinSaveObjs[] = { + { "F200", 0, 0, 2, 2, "SAVEOBJ_NAME_10"}, + { "F200", 2, 0, 6, 2, "SAVEOBJ_NAME_11"}, + { "F200", 2, 0, 7, 2, "SAVEOBJ_NAME_12"}, + { "F200", 4, 0, 7, 2, "SAVEOBJ_NAME_13"}, + {"F201_3", 0, 0, 3, 2, "SAVEOBJ_NAME_14"}, + { "D201", 10, 0, 2, 2, "SAVEOBJ_NAME_15"}, +}; + +static const dMapSaveObjDefinition sLanayruSaveObjs[] = { + {"F300_1", 0, 0, 2, 3, "SAVEOBJ_NAME_16"}, + { "F300", 0, 0, 15, 3, "SAVEOBJ_NAME_17"}, + { "F300", 0, 0, 16, 3, "SAVEOBJ_NAME_18"}, + { "F300", 0, 0, 17, 3, "SAVEOBJ_NAME_19"}, + { "F300", 0, 0, 18, 3, "SAVEOBJ_NAME_20"}, + {"F300_4", 0, 0, 16, 3, "SAVEOBJ_NAME_21"}, + {"F300_4", 0, 0, 17, 3, "SAVEOBJ_NAME_22"}, + { "F301", 0, 0, 10, 3, "SAVEOBJ_NAME_23"}, + {"F301_3", 0, 0, 10, 3, "SAVEOBJ_NAME_24"}, + {"F301_4", 0, 0, 10, 3, "SAVEOBJ_NAME_25"}, + {"F301_6", 0, 0, 10, 3, "SAVEOBJ_NAME_26"}, + { "F302", 0, 0, 12, 3, "SAVEOBJ_NAME_27"}, +}; + +const dMapSaveObjDefinition *dLytMapMain_c::getSaveObjDefinition(s32 province, s32 index) const { + const dMapSaveObjDefinition *ret = nullptr; + switch (province) { + case SURFACE_PROVINCE_FARON: { + if (index == 4 && checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED) && + !checkStoryflag(STORYFLAG_WATER_DRAGON_SOTH_PART)) { + ret = &sFloodedFaronSaveObj; + } else if (index == 9 && checkStoryflag(STORYFLAG_GODDESS_STATUE_FALLEN)) { + ret = &sFaronLoweredGoddessStatueSaveObj; + } else { + ret = &sFaronSaveObjs[index]; + } + break; + } + case SURFACE_PROVINCE_ELDIN: { + ret = &sEldinSaveObjs[index]; + break; + } + case SURFACE_PROVINCE_LANAYRU: { + ret = &sLanayruSaveObjs[index]; + break; + } + } + return ret; +} + void dLytMapMain_c::initializeState_EventSaveObjConfirmMsgWindow() { // "Descend into this area? [1]Yes.[2-]No." mFlowMgr.triggerEntryPoint(4, 17, 0, 0); } -void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() {} +void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() { + if (!mFlowMgr.checkFinished()) { + return; + } + + if (dLytMsgWindow_c::getInstance()->getTextOptionSelection() == 0) { + // confirm + dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; + dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10; + s32 idx = 0; + s32 statueIdx = -1; + for (int i = 0; i < field_0x8320; i++) { + if (mSaveObjs[i].mDecideFinished) { + statueIdx = i; + break; + } + } + + const dMapSaveObjDefinition *def = getSaveObjDefinition(mSurfaceProvince, statueIdx); + dScGame_c::GetInstance()->triggerEntrance( + def->stageName, def->room, def->layer, def->entrance, SpawnInfo::RETAIN_TOD, SpawnInfo::RETAIN_TRIAL, + dFader_c::FADER_GREY + ); + dScGame_c::GetInstance()->setTargetingScreenPrio(0x8B); + dLytMap_c::GetInstance()->fn_80143A30(); + mStateMgr.changeState(StateID_EventSaveObjDecide); + mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out); + } else { + // cancel + for (int i = 0; i < field_0x8320; i++) { + mSaveObjs[i].init(); + } + mStateMgr.changeState(StateID_EventSaveObjSelect); + mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out); + } +} void dLytMapMain_c::finalizeState_EventSaveObjConfirmMsgWindow() {} void dLytMapMain_c::initializeState_EventSaveObjDecide() {} diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index 7db716a5..8029e73d 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -1794,7 +1794,7 @@ static const char *sMapPopPrefix = "MAP_POP_"; bool dLytMapMarkers_c::build(d2d::ResAccIf_c *resAcc) { mMapPopup.build(resAcc); - if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { void *data = LayoutArcManager::GetInstance()->getLoadedData("MapSky"); mResAcc01.attach(data, ""); @@ -1814,7 +1814,7 @@ bool dLytMapMarkers_c::build(d2d::ResAccIf_c *resAcc) { bool dLytMapMarkers_c::remove() { mMapPopup.remove(); - if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { mIcon01.remove(); mResAcc01.detach(); } else { @@ -1830,7 +1830,7 @@ bool dLytMapMarkers_c::execute() { } void dLytMapMarkers_c::draw() { - if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { mIcon01.draw(); } else { mIcon00.draw(); @@ -1838,7 +1838,7 @@ void dLytMapMarkers_c::draw() { } void dLytMapMarkers_c::setIslandNamesOn(bool on) { - if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) { + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { mShowIslandNames = on; mIcon01.mShowIslandNames = on; } diff --git a/src/toBeSorted/fi_context.cpp b/src/toBeSorted/fi_context.cpp index e3b60191..c8e6eec8 100644 --- a/src/toBeSorted/fi_context.cpp +++ b/src/toBeSorted/fi_context.cpp @@ -404,7 +404,8 @@ void FiContext::prepareFiCallOptions() { } mFiButtonOptions[0] = KEN8_Advice; - if (dStageMgr_c::GetInstance()->getSTIFbyte4() == 0 && !isInAnySkyKeepRoom() && !isInLeviasFightMaybe()) { + if (dStageMgr_c::GetInstance()->getSTIFArea() == dStageMgr_c::STIF_AREA_SKY && !isInAnySkyKeepRoom() && + !isInLeviasFightMaybe()) { // In the Sky, show play time mFiButtonOptions[1] = KEN8_PlayTime; } else { From d8c41fdce4d806ad297d116f325ee9f2eaf7ed74 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 11 Oct 2025 00:04:22 +0200 Subject: [PATCH 14/20] Figuring out more things --- config/SOUE01/symbols.txt | 24 ++--- include/d/d_bzs_types.h | 2 +- include/d/d_stage_mgr.h | 11 ++ include/d/lyt/d_lyt_map.h | 30 +++++- src/d/lyt/d_lyt_map.cpp | 214 +++++++++++++++++++++++++++++++------- 5 files changed, 228 insertions(+), 53 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 24138cbc..fc0186e7 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7804,17 +7804,17 @@ __dt__26sFState_c<13dLytMapMain_c>Fv = .text:0x801363A0; // type:function size:0 __dt__29sFStateFct_c<13dLytMapMain_c>Fv = .text:0x80136400; // type:function size:0x6C __dt__82sStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80136470; // type:function size:0xA0 __dt__52sFStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c>Fv = .text:0x80136510; // type:function size:0xA4 -fn_801365C0 = .text:0x801365C0; // type:function size:0x4 -fn_801365D0 = .text:0x801365D0; // type:function size:0x40 +__ct__26dLytMapBoundingWorldBoundsFv = .text:0x801365C0; // type:function size:0x4 +__dt__26dLytMapBoundingWorldBoundsFv = .text:0x801365D0; // type:function size:0x40 __dt__13dLytMapMain_cFv = .text:0x80136610; // type:function size:0x608 getGlobal__13dLytMapMain_cFv = .text:0x80136C20; // type:function size:0xC loadTextboxes__13dLytMapMain_cFv = .text:0x80136C30; // type:function size:0xC8 build__13dLytMapMain_cFv = .text:0x80136D00; // type:function size:0x6CC changeState__82sStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801373D0; // type:function size:0x10 -fn_801373E0 = .text:0x801373E0; // type:function size:0xAC -fn_80137490 = .text:0x80137490; // type:function size:0x2E8 -fn_80137780 = .text:0x80137780; // type:function size:0x15C -fn_801378E0 = .text:0x801378E0; // type:function size:0x838 +loadStageProperties__13dLytMapMain_cFv = .text:0x801373E0; // type:function size:0xAC +setupStage__13dLytMapMain_cFv = .text:0x80137490; // type:function size:0x2E8 +remove__13dLytMapMain_cFv = .text:0x80137780; // type:function size:0x15C +execute__13dLytMapMain_cFv = .text:0x801378E0; // type:function size:0x838 getStateID__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80138120; // type:function size:0x10 draw__13dLytMapMain_cFv = .text:0x80138130; // type:function size:0x238 fn_80138370 = .text:0x80138370; // type:function size:0x138 @@ -7862,7 +7862,7 @@ initializeState_In__13dLytMapMain_cFv = .text:0x8013C1F0; // type:function size: executeState_In__13dLytMapMain_cFv = .text:0x8013C2F0; // type:function size:0x380 finalizeState_In__13dLytMapMain_cFv = .text:0x8013C670; // type:function size:0x40 getAreaGroup__13dLytMapMain_cCFl = .text:0x8013C6B0; // type:function size:0xA8 -fn_8013C760 = .text:0x8013C760; // type:function size:0x100 +getRoomType__13dLytMapMain_cCFv = .text:0x8013C760; // type:function size:0x100 fn_8013C860 = .text:0x8013C860; // type:function size:0x1C shouldDrawFootprints__13dLytMapMain_cCFv = .text:0x8013C880; // type:function size:0x64 zoomIn__13dLytMapMain_cFv = .text:0x8013C8F0; // type:function size:0x644 @@ -10577,7 +10577,7 @@ isSTIFAreaFaron__11dStageMgr_cCFv = .text:0x80199A60; // type:function size:0x3C isSTIFAreaEldin__11dStageMgr_cCFv = .text:0x80199AA0; // type:function size:0x3C isSTIFAreaLanayru__11dStageMgr_cCFv = .text:0x80199AE0; // type:function size:0x3C getSTIFunk1__11dStageMgr_cCFv = .text:0x80199B20; // type:function size:0x20 -StageManager__getSTIFunk3 = .text:0x80199B40; // type:function size:0x1C +getSTIFRoomType__11dStageMgr_cCFv = .text:0x80199B40; // type:function size:0x1C fn_80199B60 = .text:0x80199B60; // type:function size:0xC fn_80199B70 = .text:0x80199B70; // type:function size:0x1C fn_80199B90 = .text:0x80199B90; // type:function size:0x3A8 @@ -40092,10 +40092,10 @@ lbl_80572770 = .sdata:0x80572770; // type:object size:0x8 lbl_80572778 = .sdata:0x80572778; // type:object size:0x8 data:wstring lbl_80572780 = .sdata:0x80572780; // type:object size:0x4 data:4byte lbl_80572784 = .sdata:0x80572784; // type:object size:0x4 data:4byte -lbl_80572788 = .sdata:0x80572788; // type:object size:0x8 -lbl_80572790 = .sdata:0x80572790; // type:object size:0x8 -lbl_80572798 = .sdata:0x80572798; // type:object size:0x8 -lbl_805727A0 = .sdata:0x805727A0; // type:object size:0x8 +lbl_80572788 = .sdata:0x80572788; // type:object size:0x6 data:string +lbl_80572790 = .sdata:0x80572790; // type:object size:0x6 data:string +lbl_80572798 = .sdata:0x80572798; // type:object size:0x6 data:string +lbl_805727A0 = .sdata:0x805727A0; // type:object size:0x6 data:string lbl_805727A8 = .sdata:0x805727A8; // type:object size:0x8 lbl_805727B0 = .sdata:0x805727B0; // type:object size:0x8 lbl_805727B8 = .sdata:0x805727B8; // type:object size:0x8 diff --git a/include/d/d_bzs_types.h b/include/d/d_bzs_types.h index 9b31058c..74ae0e29 100644 --- a/include/d/d_bzs_types.h +++ b/include/d/d_bzs_types.h @@ -195,7 +195,7 @@ struct STIF { /* 0x0E */ u8 areaType; /* 0x0F */ u8 area; /* 0x10 */ u8 field_0x10; - /* 0x11 */ u8 field_0x11; + /* 0x11 */ u8 roomType; /* 0x12 */ s8 mapNameId; /* 0x13 */ u8 field_0x13; }; diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index a455b10a..65534302 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -76,6 +76,15 @@ public: STIF_AREA_LANAYRU_GORGE = 11, }; + // room is a not great name since this is really stage-wide... + enum StifRoomType_e { + STIF_ROOMTYPE_FIELD = 0, + STIF_ROOMTYPE_DUNGEON = 1, + STIF_ROOMTYPE_SKYLOFT = 2, + STIF_ROOMTYPE_BOSS_HOUSE = 3, + STIF_ROOMTYPE_SKYFIELD = 4, + }; + s32 getSTIFArea() const; bool isSTIFAreaFaron() const; bool isSTIFAreaEldin() const; @@ -87,6 +96,8 @@ public: return getSTIFArea() == STIF_AREA_SKY; } + s32 getSTIFRoomType() const; + s32 getAreaType() const; s32 getMapNameId() const; diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 89b0e35e..c0dab772 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -41,7 +41,7 @@ struct dMapSavedDataEntry { }; struct dMapSavedData { - /* 0x00 */ dMapSavedDataEntry entries[6]; + /* 0x00 */ dMapSavedDataEntry entries[/* dLytMapMain_c::ROOMTYPE_MAX */ 6]; /* 0x30 */ bool showIslandNames; }; @@ -512,6 +512,8 @@ public: virtual void dLytMapMain_vt0x10(); void build(); + void remove(); + void execute(); bool isNotInvisible() const; bool isOpenMaybe() const; @@ -562,7 +564,8 @@ public: STATE_FUNC_DECLARE(dLytMapMain_c, EventSaveObjDecide); private: - // TODO - need to come up with better names + // TODO - need to come up with better names for all of these enums and concepts + enum SurfaceProvince_e { SURFACE_PROVINCE_FARON = 0, SURFACE_PROVINCE_ELDIN = 1, @@ -578,6 +581,16 @@ private: AREAGROUP_MAX = 6, }; + enum RoomType_e { + ROOMTYPE_FIELD = 0, + ROOMTYPE_DUNGEON = 1, + ROOMTYPE_SKYLOFT = 2, + ROOMTYPE_BOSS_HOUSE = 3, + ROOMTYPE_SKYFIELD = 4, + ROOMTYPE_SKYFIELD_INTERIOR = 5, + ROOMTYPE_MAX = 6, + }; + dLytMapGlobal_c *getGlobal(); void checkScroll(); bool needsNav(s32 mapMode) const; @@ -590,7 +603,9 @@ private: bool canPlaceBeacons(s32 mapMode) const; bool isPointingAtMainMap() const; + void loadStageProperties(); s32 getAreaGroup(s32 stifArea) const; + s32 getRoomType() const; s32 getSelectedSaveObjIdx() const; @@ -604,6 +619,8 @@ private: void fn_80143300(); void fn_80143120(s32); void fn_80138D80(); + void fn_801431E0(); + void fn_8013AD50(); bool shouldDrawFootprints() const; void zoomIn(); @@ -614,6 +631,7 @@ private: void setCursorType(); void setupFlags(); + void setupStage(); void loadTextboxes(); @@ -698,11 +716,15 @@ private: /* 0x8C60 */ s32 mMaxBeaconCount; /* 0x8C64 */ s32 field_0x8C64; - /* 0x8C68 */ s32 field_0x8C68; + /* 0x8C68 */ s32 mRoomType; /* 0x8C6C */ s32 mAreaGroup; /* 0x8C70 */ u32 field_0x8C70; - /* 0x8C74 */ u8 _0x8C74[0x8C88 - 0x8C74]; + /* 0x8C74 */ u8 _0x8C74[0x8C7C - 0x8C74]; + /* 0x8C7C */ f32 field_0x8C7C; + /* 0x8C80 */ f32 field_0x8C80; + + /* 0x8C84 */ u8 _0x8C84[0x8C88 - 0x8C84]; /* 0x8C88 */ f32 field_0x8C88; /* 0x8C8C */ f32 field_0x8C8C; diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 999b7bca..b9c7107d 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -2366,6 +2366,120 @@ void dLytMapMain_c::build() { fn_80143300(); } +void dLytMapMain_c::loadStageProperties() { + mAreaGroup = getAreaGroup(dStageMgr_c::GetInstance()->getSTIFArea()); + mRoomType = getRoomType(); + + // Yes, it does need to be written this way, otherwise the catch-all else + // branch is collapsed with the other ones. + + if (mRoomType == ROOMTYPE_FIELD) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + return; + } + + if (mRoomType == ROOMTYPE_DUNGEON) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + return; + } + + if (mRoomType == ROOMTYPE_SKYLOFT) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + return; + } + + if (mRoomType == ROOMTYPE_BOSS_HOUSE) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + return; + } + + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; +} + +void dLytMapMain_c::setupStage() { + loadStageProperties(); + if (field_0x8C94 == 10) { + mLyt.findPane("N_skyloft_00")->SetVisible(false); + } + + mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].bind(false); + if (dAcPy_c::getCurrentTunicType() == 1) { + mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].setFrame(1.0f); + } else { + mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].setFrame(0.0f); + } + + if (mRoomType == ROOMTYPE_SKYLOFT || + (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR || + mRoomType == ROOMTYPE_DUNGEON))) { + mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].bind(false); + } + + s32 type = 0; + mAnmGroups[MAP_MAIN_ANIM_TYPE].bind(false); + if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) { + type = 8; + } else if (mAreaGroup == AREAGROUP_FARON || mAreaGroup == AREAGROUP_SEALED_GROUNDS) { + if (dStageMgr_c::GetInstance()->getSTIFArea() == dStageMgr_c::STIF_AREA_SEALED_GROUNDS) { + type = 7; + } else if (mRoomType == ROOMTYPE_FIELD) { + type = 1; + } else { + type = 2; + } + } else if (mAreaGroup == AREAGROUP_ELDIN) { + if (mRoomType == ROOMTYPE_FIELD) { + type = 3; + } else { + type = 4; + } + } else if (mAreaGroup == AREAGROUP_LANAYRU) { + if (mRoomType == ROOMTYPE_FIELD) { + type = 5; + } else { + type = 6; + } + } else if (mAreaGroup == AREAGROUP_SKY) { + if (dStageMgr_c::GetInstance()->getSTIFRoomType() == dStageMgr_c::STIF_ROOMTYPE_DUNGEON) { + type = 11; + } else { + // TODO - probably an enum but this matches too + type = 9; + if (dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT) { + type = 10; + } + } + } + mAnmGroups[MAP_MAIN_ANIM_TYPE].setFrame(type); + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_TYPE].unbind(); + + field_0x8C7C = 0.0f; + field_0x8C80 = 0.0f; + mAnmGroups[MAP_MAIN_ANIM_IN].bind(false); + mAnmGroups[MAP_MAIN_ANIM_IN].setFrame(0.0f); + mAnmGroups[MAP_MAIN_ANIM_MAP_V].bind(false); + fn_801431E0(); + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_MAP_V].unbind(); + mAnmGroups[MAP_MAIN_ANIM_IN].unbind(); + if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + mLyt.findPane("N_houkoul_00")->SetVisible(false); + } + if (field_0x8C94 != 10) { + loadTextboxes(); + } + fn_8013AD50(); +} + +void dLytMapMain_c::remove() { + // TODO - ... +} + +void dLytMapMain_c::execute() { + // TODO - ... +} + void dLytMapMain_c::draw() { if (!field_0x8DBF) { return; @@ -2383,7 +2497,7 @@ void dLytMapMain_c::draw() { mMarkers.draw(); } - if (field_0x8C68 != 3 && field_0x8C68 != 5 && field_0x8C94 != 2) { + if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR && field_0x8C94 != 2) { mPinIconAggregate.draw(); } @@ -2458,7 +2572,7 @@ void lytMapusesSizedWString() { } void dLytMapMain_c::saveUnkMapData() { - dMapSavedDataEntry &data = sSavedMapData.entries[field_0x8C68]; + dMapSavedDataEntry &data = sSavedMapData.entries[mRoomType]; data.field_0x06 = 1; data.mapMode = mCurrentMapMode; data.mapUpDirection = mMapUpDirection; @@ -2478,9 +2592,9 @@ void dLytMapMain_c::initUnkMapData() { } void dLytMapMain_c::loadUnkMapData() { - mCurrentMapMode = sSavedMapData.entries[field_0x8C68].mapMode; - mMapUpDirection = sSavedMapData.entries[field_0x8C68].mapUpDirection; - mMapUpDirectionAfterZoomToDetail = sSavedMapData.entries[field_0x8C68].mapUpDirectionAfterZoomToDetail; + mCurrentMapMode = sSavedMapData.entries[mRoomType].mapMode; + mMapUpDirection = sSavedMapData.entries[mRoomType].mapUpDirection; + mMapUpDirectionAfterZoomToDetail = sSavedMapData.entries[mRoomType].mapUpDirectionAfterZoomToDetail; mShowIslandNames = sSavedMapData.showIslandNames; } @@ -2524,12 +2638,12 @@ void dLytMapMain_c::setButtonMessages( } if (canZoomOut(currentMapMode) && canZoomOut(nextMapMode)) { - if ((field_0x8C68 == 0 && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) || - (field_0x8C68 == 2 && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || - (field_0x8C68 == 4 && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || - (field_0x8C68 == 3 && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || - (field_0x8C68 == 5 && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || - (field_0x8C68 == 1 && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE)) { + if ((mRoomType == ROOMTYPE_FIELD && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) || + (mRoomType == ROOMTYPE_SKYLOFT && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || + (mRoomType == ROOMTYPE_SKYFIELD && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || + (mRoomType == ROOMTYPE_BOSS_HOUSE && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || + (mRoomType == ROOMTYPE_SKYFIELD_INTERIOR && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || + (mRoomType == ROOMTYPE_DUNGEON && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE)) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT); LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_WORLD_MAP); } else { @@ -2575,8 +2689,8 @@ void dLytMapMain_c::setButtonMessages( } } - switch (field_0x8C68) { - case 2: { + switch (mRoomType) { + case ROOMTYPE_SKYLOFT: { if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); @@ -2598,8 +2712,8 @@ void dLytMapMain_c::setButtonMessages( } break; } - case 0: - case 4: { + case ROOMTYPE_FIELD: + case ROOMTYPE_SKYFIELD: { if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); @@ -2621,7 +2735,7 @@ void dLytMapMain_c::setButtonMessages( dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); } - if (field_0x8C68 == 4 && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + if (mRoomType == ROOMTYPE_SKYFIELD && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); if (mShowIslandNames) { @@ -2636,7 +2750,7 @@ void dLytMapMain_c::setButtonMessages( } break; } - case 1: { + case ROOMTYPE_DUNGEON: { if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); @@ -2673,7 +2787,8 @@ void dLytMapMain_c::setButtonMessages( void dLytMapMain_c::setCursorType() { if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode)) { - if ((field_0x8C94 == 10 || ((field_0x8C68 == 3 || field_0x8C68 == 1) && mPointerOnMap)) || + if ((field_0x8C94 == 10 || + ((mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON) && mPointerOnMap)) || (mPointerCanPlaceBeacon && isPointingAtMainMap()) || (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) || (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx())) { @@ -2894,7 +3009,7 @@ void dLytMapMain_c::setupFlags() { } mAnmGroups[MAP_MAIN_ANIM_KUMO_PATTERN].setFrame(titleLineFrame); mAnmGroups[MAP_MAIN_ANIM_MAP_V].bind(false); - if (field_0x8C68 == 1 || field_0x8C68 == 3) { + if (mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_BOSS_HOUSE) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { mAnmGroups[MAP_MAIN_ANIM_MAP_V].setFrame(3.0f); } @@ -3030,7 +3145,8 @@ void dLytMapMain_c::setupFlags() { grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_DESERT]; } - if (field_0x8C68 == 2 || (mAreaGroup == AREAGROUP_SKY && (field_0x8C68 == 3 || field_0x8C68 == 1))) { + if (mRoomType == ROOMTYPE_SKYLOFT || + (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_SKY_MAP_2]; grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_OUT_SKY_COURSE]; } @@ -3128,7 +3244,7 @@ void dLytMapMain_c::setupFlags() { } } - if (field_0x8C68 == 4 || field_0x8C68 == 5) { + if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { mLyt.findPane("P_skyloftLink_00")->SetVisible(false); } @@ -3140,7 +3256,7 @@ void dLytMapMain_c::setupFlags() { mPutIcon.setVisible(false); } - if (field_0x8C68 == 4) { + if (mRoomType == ROOMTYPE_SKYFIELD) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { mMarkers.setIslandNamesOn(mShowIslandNames); } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { @@ -3181,8 +3297,34 @@ s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { return ret; } +s32 dLytMapMain_c::getRoomType() const { + s32 ret = ROOMTYPE_FIELD; + s32 stifRoomType = dStageMgr_c::GetInstance()->getSTIFRoomType(); + if (field_0x8C94 == 10) { + ret = ROOMTYPE_FIELD; + } + + if (dScGame_c::isCurrentStage("F011r") || + (dScGame_c::isCurrentStage("F002r") && dScGame_c::currentSpawnInfo.isNight()) || + dScGame_c::isCurrentStage("F010r") || dScGame_c::isCurrentStage("F019r")) { + ret = ROOMTYPE_SKYFIELD_INTERIOR; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_FIELD) { + ret = ROOMTYPE_FIELD; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_DUNGEON) { + ret = ROOMTYPE_DUNGEON; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_SKYLOFT) { + ret = ROOMTYPE_SKYLOFT; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_BOSS_HOUSE) { + ret = ROOMTYPE_BOSS_HOUSE; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_SKYFIELD) { + ret = ROOMTYPE_SKYFIELD; + } + return ret; +} + void dLytMapMain_c::zoomIn() { - if (field_0x8C68 == 2 || (mAreaGroup == AREAGROUP_SKY && (field_0x8C68 == 3 || field_0x8C68 == 1))) { + if (mRoomType == ROOMTYPE_SKYLOFT || + (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); @@ -3208,7 +3350,7 @@ void dLytMapMain_c::zoomIn() { } } } - } else if (field_0x8C68 == 4 || field_0x8C68 == 5) { + } else if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); @@ -3234,7 +3376,7 @@ void dLytMapMain_c::zoomIn() { } } } - } else if (field_0x8C68 == 0) { + } else if (mRoomType == ROOMTYPE_FIELD) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); @@ -3260,7 +3402,7 @@ void dLytMapMain_c::zoomIn() { } } } - } else if (field_0x8C68 == 1) { + } else if (mRoomType == ROOMTYPE_DUNGEON) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); @@ -3286,7 +3428,7 @@ void dLytMapMain_c::zoomIn() { } } } - } else if (field_0x8C68 == 3) { + } else if (mRoomType == ROOMTYPE_BOSS_HOUSE) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { if (dPad::getDownTrigRight()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); @@ -3304,7 +3446,8 @@ void dLytMapMain_c::zoomIn() { } void dLytMapMain_c::zoomOut() { - if (field_0x8C68 == 2 || (mAreaGroup == AREAGROUP_SKY && (field_0x8C68 == 3 || field_0x8C68 == 1))) { + if (mRoomType == ROOMTYPE_SKYLOFT || + (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { if (dPad::getDownTrigLeft()) { mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; @@ -3327,7 +3470,7 @@ void dLytMapMain_c::zoomOut() { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } - } else if (field_0x8C68 == 4 || field_0x8C68 == 5) { + } else if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); @@ -3350,7 +3493,7 @@ void dLytMapMain_c::zoomOut() { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } - } else if (field_0x8C68 == 0) { + } else if (mRoomType == ROOMTYPE_FIELD) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); @@ -3373,7 +3516,7 @@ void dLytMapMain_c::zoomOut() { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } - } else if (field_0x8C68 == 1) { + } else if (mRoomType == ROOMTYPE_DUNGEON) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); @@ -3396,7 +3539,7 @@ void dLytMapMain_c::zoomOut() { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); } } - } else if (field_0x8C68 == 3) { + } else if (mRoomType == ROOMTYPE_BOSS_HOUSE) { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { if (dPad::getDownTrigLeft()) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); @@ -3420,8 +3563,7 @@ void dLytMapMain_c::executeState_Active() { return; } - // TODO figure out and double check numbers - if (field_0x8C68 == 4 && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + if (mRoomType == ROOMTYPE_SKYFIELD && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && dPad::getDownTrigZ()) { if (mShowIslandNames) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_OFF); @@ -3488,8 +3630,8 @@ void dLytMapMain_c::executeState_Active() { (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(mCurrentMapMode) )) { zoomIn(); - } else if ((field_0x8C68 == dLytMapGlobal_c::MAPMODE_WORLD || field_0x8C68 == dLytMapGlobal_c::MAPMODE_PROVINCE || - field_0x8C68 == dLytMapGlobal_c::MAPMODE_WORLD_SKY || field_0x8C68 == dLytMapGlobal_c::MAPMODE_ZOOM) && + } else if ((mRoomType == ROOMTYPE_FIELD || mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_SKYLOFT || + mRoomType == ROOMTYPE_SKYFIELD) && canResetPosition(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigUp()) { mVec3_c pos; fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); From 39fb08d58c7e39d88f48da03d9abbcfed012f961 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 11 Oct 2025 22:36:33 +0200 Subject: [PATCH 15/20] A few funcs --- config/SOUE01/symbols.txt | 45 ++-- include/d/d_stage.h | 1 + include/d/lyt/d_lyt_map.h | 73 ++++-- include/d/lyt/d_lyt_map_capture.h | 5 +- include/d/lyt/d_lyt_map_global.h | 16 ++ src/d/lyt/d_lyt_map.cpp | 381 +++++++++++++++++++++++++----- 6 files changed, 433 insertions(+), 88 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index fc0186e7..f627f789 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7492,7 +7492,7 @@ fn_8012D610 = .text:0x8012D610; // type:function size:0x5C fn_8012D670 = .text:0x8012D670; // type:function size:0x5C fn_8012D6D0 = .text:0x8012D6D0; // type:function size:0x20 fn_8012D6F0 = .text:0x8012D6F0; // type:function size:0xE4 -fn_8012D7E0 = .text:0x8012D7E0; // type:function size:0x10 +execute__16dLytMapCapture_cFv = .text:0x8012D7E0; // type:function size:0x10 isBusyRendering__16dLytMapCapture_cCFv = .text:0x8012D7F0; // type:function size:0x8 fn_8012D800 = .text:0x8012D800; // type:function size:0xEC finalizeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D8F0; // type:function size:0x30 @@ -7824,10 +7824,10 @@ canZoomOut__13dLytMapMain_cCFl = .text:0x80138650; // type:function size:0x1E0 canCenterCursor__13dLytMapMain_cCFl = .text:0x80138830; // type:function size:0x254 needsNav__13dLytMapMain_cCFl = .text:0x80138A90; // type:function size:0x8C getSelectedSaveObjIdx__13dLytMapMain_cCFv = .text:0x80138B20; // type:function size:0x110 -fn_80138C30 = .text:0x80138C30; // type:function size:0x38 -fn_80138C70 = .text:0x80138C70; // type:function size:0xA4 -fn_80138D20 = .text:0x80138D20; // type:function size:0x5C -fn_80138D80 = .text:0x80138D80; // type:function size:0xB0 +isPaneVisible__13dLytMapMain_cCFPQ34nw4r3lyt4Pane = .text:0x80138C30; // type:function size:0x38 +setSaveObjsVisible__13dLytMapMain_cFb = .text:0x80138C70; // type:function size:0xA4 +setSaveObjPanePtrs__13dLytMapMain_cFv = .text:0x80138D20; // type:function size:0x5C +initSaveObjs__13dLytMapMain_cFv = .text:0x80138D80; // type:function size:0xB0 isPointingAtMainMap__13dLytMapMain_cCFv = .text:0x80138E30; // type:function size:0xD4 canPlaceBeacons__13dLytMapMain_cCFl = .text:0x80138F10; // type:function size:0xA0 canResetPosition__13dLytMapMain_cCFlb = .text:0x80138FB0; // type:function size:0xA4 @@ -7848,7 +7848,7 @@ clearButtonMessages__13dLytMapMain_cFv = .text:0x8013A080; // type:function size setButtonMessages__13dLytMapMain_cFlblb = .text:0x8013A170; // type:function size:0xA84 canCenterCursor1__13dLytMapMain_cCFl = .text:0x8013AC00; // type:function size:0x4 setCursorType__13dLytMapMain_cFv = .text:0x8013AC10; // type:function size:0x138 -fn_8013AD50 = .text:0x8013AD50; // type:function size:0x370 +fn_8013AD50__13dLytMapMain_cFv = .text:0x8013AD50; // type:function size:0x370 calculateBoundingWorldHitboxes__13dLytMapMain_cFv = .text:0x8013B0C0; // type:function size:0x28C fn_8013B350 = .text:0x8013B350; // type:function size:0x10 initializeState_Invisible__13dLytMapMain_cFv = .text:0x8013B360; // type:function size:0x4 @@ -7863,7 +7863,7 @@ executeState_In__13dLytMapMain_cFv = .text:0x8013C2F0; // type:function size:0x3 finalizeState_In__13dLytMapMain_cFv = .text:0x8013C670; // type:function size:0x40 getAreaGroup__13dLytMapMain_cCFl = .text:0x8013C6B0; // type:function size:0xA8 getRoomType__13dLytMapMain_cCFv = .text:0x8013C760; // type:function size:0x100 -fn_8013C860 = .text:0x8013C860; // type:function size:0x1C +canChangeFloor__13dLytMapMain_cCFl = .text:0x8013C860; // type:function size:0x1C shouldDrawFootprints__13dLytMapMain_cCFv = .text:0x8013C880; // type:function size:0x64 zoomIn__13dLytMapMain_cFv = .text:0x8013C8F0; // type:function size:0x644 zoomOut__13dLytMapMain_cFv = .text:0x8013CF40; // type:function size:0x54C @@ -7996,9 +7996,9 @@ fn_80142D90__13dLytMapMain_cFl = .text:0x80142D90; // type:function size:0x170 fn_80142F00__13dLytMapMain_cFR7mVec3_clUcRC7mVec3_cRC4mAng = .text:0x80142F00; // type:function size:0x158 fn_80143060__13dLytMapMain_cFR7mVec3_cRC7mVec3_cRC7mVec3_cRC4mAng = .text:0x80143060; // type:function size:0xBC fn_80143120 = .text:0x80143120; // type:function size:0xC0 -fn_801431E0 = .text:0x801431E0; // type:function size:0x11C +fn_801431E0__13dLytMapMain_cFv = .text:0x801431E0; // type:function size:0x11C fn_80143300__13dLytMapMain_cFv = .text:0x80143300; // type:function size:0x54 -fn_80143360 = .text:0x80143360; // type:function size:0x1D4 +fn_80143360__13dLytMapMain_cFv = .text:0x80143360; // type:function size:0x1D4 checkScroll__13dLytMapMain_cFv = .text:0x80143540; // type:function size:0x374 build__9dLytMap_cFv = .text:0x801438C0; // type:function size:0x6C fn_80143930 = .text:0x80143930; // type:function size:0x60 @@ -10969,7 +10969,7 @@ forceFadeOut__8dStage_cFv = .text:0x801B3E60; // type:function size:0x40 forceFadeIn__8dStage_cFv = .text:0x801B3EA0; // type:function size:0x40 fn_801B3EE0__8dStage_cFv = .text:0x801B3EE0; // type:function size:0x3C fn_801B3F20__8dStage_cFv = .text:0x801B3F20; // type:function size:0x8 -fn_801B3F30 = .text:0x801B3F30; // type:function size:0x8 +fn_801B3F30__8dStage_cFv = .text:0x801B3F30; // type:function size:0x8 drawMap__8dStage_cFP6mMtx_ci = .text:0x801B3F40; // type:function size:0x90 RoomManager__getRMPLForRoom = .text:0x801B3FD0; // type:function size:0x34 getFlagPositionForRoomVisit__FiPUsPUs = .text:0x801B4010; // type:function size:0x34 @@ -33730,9 +33730,26 @@ lbl_8051FE84 = .data:0x8051FE84; // type:object size:0xC lbl_8051FE90 = .data:0x8051FE90; // type:object size:0xC lbl_8051FE9C = .data:0x8051FE9C; // type:object size:0x28 lbl_8051FEC4 = .data:0x8051FEC4; // type:object size:0x10 -lbl_8051FED4 = .data:0x8051FED4; // type:object size:0x104 -lbl_8051FFD8 = .data:0x8051FFD8; // type:object size:0x10 -lbl_8051FFE8 = .data:0x8051FFE8; // type:object size:0x10 +lbl_8051FED4 = .data:0x8051FED4; // type:object size:0xE data:string +lbl_8051FEE4 = .data:0x8051FEE4; // type:object size:0xD data:string +lbl_8051FEF4 = .data:0x8051FEF4; // type:object size:0x9 data:string +lbl_8051FF00 = .data:0x8051FF00; // type:object size:0x9 data:string +lbl_8051FF0C = .data:0x8051FF0C; // type:object size:0xB data:string +lbl_8051FF18 = .data:0x8051FF18; // type:object size:0xD data:string +lbl_8051FF28 = .data:0x8051FF28; // type:object size:0x10 data:string +lbl_8051FF38 = .data:0x8051FF38; // type:object size:0xA data:string +lbl_8051FF44 = .data:0x8051FF44; // type:object size:0xC data:string +lbl_8051FF50 = .data:0x8051FF50; // type:object size:0xD data:string +lbl_8051FF60 = .data:0x8051FF60; // type:object size:0xF data:string +lbl_8051FF70 = .data:0x8051FF70; // type:object size:0xE data:string +lbl_8051FF80 = .data:0x8051FF80; // type:object size:0xE data:string +lbl_8051FF90 = .data:0x8051FF90; // type:object size:0xC data:string +lbl_8051FF9C = .data:0x8051FF9C; // type:object size:0xC data:string +lbl_8051FFA8 = .data:0x8051FFA8; // type:object size:0xD data:string +lbl_8051FFB8 = .data:0x8051FFB8; // type:object size:0xD data:string +lbl_8051FFC8 = .data:0x8051FFC8; // type:object size:0xE data:string +lbl_8051FFD8 = .data:0x8051FFD8; // type:object size:0xD data:string +lbl_8051FFE8 = .data:0x8051FFE8; // type:object size:0xD data:string jumptable_8051FFF8 = .data:0x8051FFF8; // type:object size:0x30 scope:local lbl_80520028 = .data:0x80520028; // type:object size:0xC lbl_80520034 = .data:0x80520034; // type:object size:0xC data:string @@ -40088,7 +40105,7 @@ lbl_80572750 = .sdata:0x80572750; // type:object size:0x5 data:string lbl_80572758 = .sdata:0x80572758; // type:object size:0x5 data:string lbl_80572760 = .sdata:0x80572760; // type:object size:0x8 data:4byte lbl_80572768 = .sdata:0x80572768; // type:object size:0x8 data:4byte -lbl_80572770 = .sdata:0x80572770; // type:object size:0x8 +lbl_80572770 = .sdata:0x80572770; // type:object size:0x5 data:string lbl_80572778 = .sdata:0x80572778; // type:object size:0x8 data:wstring lbl_80572780 = .sdata:0x80572780; // type:object size:0x4 data:4byte lbl_80572784 = .sdata:0x80572784; // type:object size:0x4 data:4byte diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 9608dd07..7744ae15 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -160,6 +160,7 @@ public: bool fn_801B3EE0(); void fn_801B3F20(); + void fn_801B3F30(); private: dRoom_c *createRoom(int roomid, bool flag0x40); diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index c0dab772..ddad8a60 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -101,6 +101,18 @@ public: bool execute(); void draw(); + void setVisible(bool visible) { + mVisible = visible; + } + + void setField_0x198(f32 f) { + field_0x198 = f; + } + + void setField_0x19C(f32 f) { + field_0x19C = f; + } + private: dLytMapGlobal_c *getGlobal() const; @@ -113,7 +125,7 @@ private: /* 0x196 */ u16 mCurrentNumSteps; /* 0x198 */ f32 field_0x198; /* 0x19C */ f32 field_0x19C; - /* 0x1A0 */ u8 field_0x1A0; + /* 0x1A0 */ bool mVisible; }; struct LytMap0x80520B5C { @@ -221,7 +233,7 @@ public: void setUnk(LytMap0x80520B5C *unk); bool setPosition(s32 index, const mVec3_c &position); void unsetAll(); - s32 getNumSetPins() const; + u32 getNumSetPins() const; STATE_FUNC_DECLARE(dLytMapPinIconAggregate_c, Wait); STATE_FUNC_DECLARE(dLytMapPinIconAggregate_c, Select); @@ -291,7 +303,7 @@ public: field_0x70C = 4; mPointerVisible = false; mPrevPointerVisible = false; - field_0x712 = false; + mForceNoNav = false; } virtual ~dLytMapFloorBtnMgr_c(); @@ -325,8 +337,12 @@ public: void resetFloor(s32 newFloorBtn); bool isUsingPointerNav() const; -private: + void setForceNoNav(bool b) { + mForceNoNav = b; + } + void checkPointedAtBtn(); +private: /* 0x008 */ dLytMapGlobal_c *mpGlobal; /* 0x00C */ UI_STATE_MGR_DECLARE(dLytMapFloorBtnMgr_c); @@ -342,7 +358,7 @@ private: /* 0x70C */ UNKWORD field_0x70C; /* 0x710 */ bool mPointerVisible; /* 0x711 */ bool mPrevPointerVisible; - /* 0x712 */ bool field_0x712; + /* 0x712 */ bool mForceNoNav; }; // Size 0x4C @@ -591,6 +607,22 @@ private: ROOMTYPE_MAX = 6, }; + enum MapEvent_e { + MAP_EVENT_NONE = 0, + MAP_EVENT_1 = 1, + // ??? + MAP_EVENT_SW_BANK_SMALL = 2, + MAP_EVENT_MAP_INTRO = 3, + MAP_EVENT_DUNGEON_MAP_GET = 4, + MAP_EVENT_FIELD_MAP_CHANGE_5 = 5, + MAP_EVENT_FOREST_MAP_CHANGE = 6, + 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_11 = 11, + }; + dLytMapGlobal_c *getGlobal(); void checkScroll(); bool needsNav(s32 mapMode) const; @@ -601,6 +633,7 @@ private: bool canCenterCursor(s32 mapMode) const; bool canCenterCursor1(s32 mapMode) const; bool canPlaceBeacons(s32 mapMode) const; + bool canChangeFloor(s32 mapMode) const; bool isPointingAtMainMap() const; void loadStageProperties(); @@ -621,6 +654,7 @@ private: void fn_80138D80(); void fn_801431E0(); void fn_8013AD50(); + void fn_80143360(); bool shouldDrawFootprints() const; void zoomIn(); @@ -646,12 +680,17 @@ private: dAcTbox_c *findGoddessChestForStoryflag(s32 flag) const; bool checkStoryflag(s32 flag) const; void displaySaveObjs(); + bool isPaneVisible(nw4r::lyt::Pane *pane) const; + void setSaveObjsVisible(bool visible); + void setSaveObjPanePtrs(); + void initSaveObjs(); static dMapSavedData sSavedMapData; static const dMapSavedData sDefaultMapData; bool isSomeFieldEq0Or1Or7Or9Or11() const { - return field_0x8C94 == 0 || field_0x8C94 == 1 || field_0x8C94 == 7 || field_0x8C94 == 9 || field_0x8C94 == 11; + return mMapEvent == MAP_EVENT_NONE || mMapEvent == MAP_EVENT_1 || mMapEvent == MAP_EVENT_SIGNAL_ADD || + mMapEvent == MAP_EVENT_GODDESS_CUBE || mMapEvent == MAP_EVENT_11; } /* 0x0010 */ UI_STATE_MGR_DECLARE(dLytMapMain_c); @@ -676,12 +715,12 @@ private: /* 0x8210 */ nw4r::lyt::Pane *mpNoroshiPane; /* 0x8214 */ nw4r::lyt::Pane *mpScaleFramePane; /* 0x8218 */ dWindow_c *mpWakuWindow; - /* 0x821C */ nw4r::lyt::Bounding *field_0x821C[10]; - /* 0x8244 */ nw4r::lyt::Bounding *field_0x8244[6]; - /* 0x825C */ nw4r::lyt::Bounding *field_0x825C[12]; + /* 0x821C */ nw4r::lyt::Bounding *mpSaveObjBoundingsFaron[10]; + /* 0x8244 */ nw4r::lyt::Bounding *mpSaveObjBoundingsEldin[6]; + /* 0x825C */ nw4r::lyt::Bounding *mpSaveObjBoundingsLanayru[12]; /* 0x828C */ mVec3_c field_0x828C[12]; - /* 0x831C */ UNKWORD field_0x831C; - /* 0x8320 */ u32 field_0x8320; + /* 0x831C */ nw4r::lyt::Bounding **mpCurrentSaveObjBoundings; + /* 0x8320 */ u32 mNumSaveObjs; /* 0x8324 */ u8 _0x8324[0x8328 - 0x8324]; @@ -732,8 +771,8 @@ private: /* 0x8C91 */ bool mNextMapUpDirection; /* 0x8C92 */ bool mMapUpDirectionAfterZoomToDetail; /* 0x8C93 */ u8 field_0x8C93; - /* 0x8C94 */ s32 field_0x8C94; - /* 0x8C98 */ UNKWORD field_0x8C98; + /* 0x8C94 */ s32 mMapEvent; + /* 0x8C98 */ s32 mNextMapEvent; /* 0x8C9C */ s32 mSurfaceProvince; /* 0x8CA0 */ u8 _0x8CA0[0x8CA4 - 0x8CA0]; @@ -847,12 +886,14 @@ public: void build(); bool isSomeMapFieldEq2Or4Or5Or6() const { - return mMapMain.field_0x8C94 == 2 || mMapMain.field_0x8C94 == 4 || mMapMain.field_0x8C94 == 5 || - mMapMain.field_0x8C94 == 6; + return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SW_BANK_SMALL || + mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_DUNGEON_MAP_GET || + mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_FIELD_MAP_CHANGE_5 || + mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_FOREST_MAP_CHANGE; } bool isSomeMapFieldEq10() const { - return mMapMain.field_0x8C94 == 10; + return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SAVE_OBJ_MSG_WINDOW; } void lightPillarRelated(s32 p1, s32 p2, s32 p3) { diff --git a/include/d/lyt/d_lyt_map_capture.h b/include/d/lyt/d_lyt_map_capture.h index 6fe457d1..fd44a144 100644 --- a/include/d/lyt/d_lyt_map_capture.h +++ b/include/d/lyt/d_lyt_map_capture.h @@ -26,11 +26,12 @@ public: void renderRequest() { mRenderRequest = true; } - + void setPicture(nw4r::lyt::Picture *pic) { mpPicture = pic; } - + + void execute(); bool isBusyRendering() const; private: diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index ba74cf78..fddf7bcc 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -96,10 +96,18 @@ public: return mCurrentMapMode; } + void setCurrentMapMode(s32 mode) { + mCurrentMapMode = mode; + } + s32 getNextMapMode() const { return mNextMapMode; } + void setNextMapMode(s32 mode) { + mNextMapMode = mode; + } + f32 getZoomFrame() const { return mZoomFrame; } @@ -112,6 +120,10 @@ public: field_0x58 = v; } + f32 getField_0x58() const { + return field_0x58; + } + f32 getField_0x44() const { return field_0x44; } @@ -140,6 +152,10 @@ public: return field_0x4D; } + void setField_0x4D(u8 v) { + field_0x4D = v; + } + u8 getField_0x4F() const { return field_0x4F; } diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index b9c7107d..76acf752 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -1,6 +1,6 @@ +#include "c/c_math.h" +#include "m/m_pad.h" #define NEED_DIRECT_FRAMECTRL_ACCESS -#include "d/lyt/d_lyt_map.h" - #include "c/c_lib.h" #include "common.h" #include "d/a/d_a_player.h" @@ -23,6 +23,7 @@ #include "d/flag/storyflag_manager.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_lyt_map.h" #include "d/lyt/d_lyt_map_global.h" #include "d/lyt/d_lyt_unknowns.h" #include "d/lyt/d_textbox.h" @@ -184,7 +185,7 @@ dLytMapFootPrints_c::dLytMapFootPrints_c(dLytMapGlobal_c *global) mCurrentNumSteps(0), field_0x198(0.0f), field_0x19C(0.0f), - field_0x1A0(0) { + mVisible(false) { for (int i = 0; i < (int)ARRAY_LENGTH(mFootprintPositions); i++) { mFootprintPositions[i].set(0.0f, 0.0f); } @@ -259,7 +260,7 @@ bool dLytMapFootPrints_c::execute() { } void dLytMapFootPrints_c::draw() { - if (!field_0x1A0) { + if (!mVisible) { return; } @@ -766,7 +767,7 @@ void dLytMapPinIconAggregate_c::unsetAll() { } } -s32 dLytMapPinIconAggregate_c::getNumSetPins() const { +u32 dLytMapPinIconAggregate_c::getNumSetPins() const { s32 num = 0; for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { if (mPins[idx].mIsSet) { @@ -1164,7 +1165,7 @@ bool dLytMapFloorBtnMgr_c::execute() { void dLytMapFloorBtnMgr_c::checkPointedAtBtn() { mPrevPointerVisible = mPointerVisible; mPointerVisible = dPadNav::isPointerVisible(); - if (field_0x712) { + if (mForceNoNav) { dPadNav::stopFSStickNav(); mPointerVisible = true; } @@ -1914,8 +1915,8 @@ dLytMapMain_c::dLytMapMain_c() mAreaGroup(0), mMapUpDirectionAfterZoomToDetail(true), field_0x8C93(0), - field_0x8C94(0), - field_0x8C98(0), + mMapEvent(MAP_EVENT_NONE), + mNextMapEvent(MAP_EVENT_NONE), field_0x8CAC(0), field_0x8D38(0.0f, 0.0f), field_0x8D40(1.0f), @@ -2173,13 +2174,15 @@ static const d2d::LytBrlanMapping sMapMainBrlanMap[] = { #define MAP_MAIN_ANIM_SUN_ROTE 45 #define MAP_MAIN_ANIM_IN_NO_CAM 46 #define MAP_MAIN_ANIM_OUT_NO_CAM 47 -#define MAP_MAIN_ANIM_CLOUD_LOOK 48 +#define MAP_MAIN_ANIM_CLOUD_LOOP 48 #define MAP_MAIN_ANIM_LIGHT_LOOP 49 #define MAP_MAIN_ANIM_NUSHI_LOOP 50 #define MAP_MAIN_ANIM_TYPE 51 #define MAP_MAIN_ANIM_KUMO_PATTERN 52 #define MAP_MAIN_ANIM_TITE_LINE 53 +#define MAP_MAIN_NUM_ANIMS 54 + static const char *sGroupName = "G_ref_00"; static const char *sBoundingNames[] = { @@ -2229,8 +2232,7 @@ void dLytMapMain_c::build() { mLyt.build("map_00.brlyt", nullptr); getGlobal()->setField_0x28(mLyt.getDrawInfo().GetLocationAdjustScale()); - // TODO define - for (int i = 0; i < 54; i++) { + for (int i = 0; i < MAP_MAIN_NUM_ANIMS; i++) { mAnmGroups[i].init(sMapMainBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapMainBrlanMap[i].mName); } @@ -2262,11 +2264,11 @@ void dLytMapMain_c::build() { b->SetVisible(false); // TODO - bird statues if (i >= 5 && i < 15) { - field_0x821C[i - 5] = b; + mpSaveObjBoundingsFaron[i - 5] = b; } else if (i >= 15 && i < 21) { - field_0x8244[i - 15] = b; + mpSaveObjBoundingsEldin[i - 15] = b; } else if (i >= 21 && i < 33) { - field_0x825C[i - 21] = b; + mpSaveObjBoundingsLanayru[i - 21] = b; } mHitChecks[i].init(b, 0x02, 2, 0); @@ -2398,7 +2400,7 @@ void dLytMapMain_c::loadStageProperties() { void dLytMapMain_c::setupStage() { loadStageProperties(); - if (field_0x8C94 == 10) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { mLyt.findPane("N_skyloft_00")->SetVisible(false); } @@ -2466,18 +2468,223 @@ void dLytMapMain_c::setupStage() { if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { mLyt.findPane("N_houkoul_00")->SetVisible(false); } - if (field_0x8C94 != 10) { + if (mMapEvent != MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { loadTextboxes(); } fn_8013AD50(); } void dLytMapMain_c::remove() { - // TODO - ... + for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mHitChecks[i]); + } + + for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) { + d2d::dSubPane *subPane = it->mpLytPane; + if (subPane != nullptr) { + nw4r::lyt::Pane *parent = subPane->getPane()->GetParent(); + parent->RemoveChild(subPane->getPane()); + } + } + mPopupInfo.remove(); + mSavePopup.remove(); + mSaveCaption.remove(); + for (int i = 0; i < (int)ARRAY_LENGTH(mSaveObjs); i++) { + mSaveObjs[i].remove(); + } + mFloorBtnMgr.remove(); + mFootPrints.remove(); + mMarkers.remove(); + mPinIconAggregate.remove(); + mPutIcon.remove(); + for (int i = 0; i < MAP_MAIN_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } + dStage_c::GetInstance()->fn_801B3F30(); } void dLytMapMain_c::execute() { - // TODO - ... + if ((*mStateMgr.getStateID() == StateID_Invisible)) { + return; + } + + if ((*mStateMgr.getStateID() == StateID_RenderingWait)) { + mStateMgr.executeState(); + mMapCapture.execute(); + return; + } + + field_0xF1C.field_0x05 = 0; + dLytMapGlobal_c *global = getGlobal(); + mDrawScaleFrame = false; + mPointerOnMap = false; + mPointerCanPlaceBeacon = false; + checkCursorPointedAtMap(); + + if (dPad::getDownTrigDown() && canCenterCursor(mCurrentMapMode) && canCenterCursor(mNextMapMode)) { + dPad::ex_c::getInstance()->centerCursor(mPad::getCurrentCoreID(), true); + } + + if (mRoomType == ROOMTYPE_DUNGEON && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mFloorBtnMgr.setForceNoNav(true); + } else { + mFloorBtnMgr.setForceNoNav(false); + } + + mFloorBtnMgr.checkPointedAtBtn(); + mStateMgr.executeState(); + if (*mStateMgr.getStateID() != StateID_ResetPosWithFloorChange) { + mFloorBtnMgr.execute(); + } + + s32 beaconId = -1; + field_0x8DBD = false; + if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && canPlaceBeacons(mCurrentMapMode) && + canPlaceBeacons(mNextMapMode)) { + bool exhaustedPins = mPinIconAggregate.getNumSetPins() >= getMaxBeaconCount(); + if (!exhaustedPins && mPointerCanPlaceBeacon && + *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select && + isPointingAtMainMap()) { + mPinIconAggregate.findNewBeaconId(&beaconId); + if (beaconId >= 0) { + field_0x8DBD = true; + } + } + } + + if (field_0x8DBD) { + mPutIcon.setPosition(dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); + mPutIcon.setScale(1.0f); + mPutIcon.setVisible(true); + } else { + mPutIcon.setVisible(false); + } + + static SizedWString<0x20> buf; + buf.sprintf(L"%ld", (mDisplayedBeaconCount - mPinIconAggregate.getNumSetPins()) % 10); + mpNumberTextBox->setTextWithGlobalTextProcessor(buf, nullptr); + mpNumberTextBoxS->setTextWithGlobalTextProcessor(buf, nullptr); + + if (canChangeFloor(mCurrentMapMode) && canChangeFloor(mNextMapMode)) { + const sStateIDIf_c *state = mStateMgr.getStateID(); + if (*state != StateID_FloorChange && *state != StateID_RenderingWait && + *state != StateID_ResetPosWithFloorChange) { + mMapCapture.renderRequest(); + } + } + + mMapCapture.execute(); + fn_80143360(); + global->setCurrentMapMode(mCurrentMapMode); + global->setNextMapMode(mNextMapMode); + mFootPrints.setVisible(shouldDrawFootprints()); + + f32 f1 = 1.0f; + if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR) { + // why does everyone clamp things differently ??? + f32 tmp = global->getField_0x58(); + if (tmp < 0.0f) { + tmp = 0.0f; + } else if (tmp > 1.0f) { + tmp = 1.0f; + } + f1 = tmp; + } + f32 f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM); + if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); + } + mFootPrints.setField_0x198(f2); + mFootPrints.setField_0x19C(f1); + mFootPrints.execute(); + setCursorType(); + + if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && + (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + global->setField_0x4D(1); + } else { + global->setField_0x4D(0); + } + + if (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_5 || + mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE || mMapEvent == MAP_EVENT_SW_BANK_SMALL) { + clearButtonMessages(); + } else { + setButtonMessages(mCurrentMapMode, mMapUpDirection, mNextMapMode, mNextMapUpDirection); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY && mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].play(); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].play(); + } + mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].play(); + } + + switch (mCurrentMapMode) { + case dLytMapGlobal_c::MAPMODE_PROVINCE: { + if (mpRegionPane1 != nullptr) { + mpRegionPane1->SetVisible(true); + } + if (mpRegionPane2 != nullptr) { + mpRegionPane2->SetVisible(true); + } + + if (mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].play(); + } + break; + } + case dLytMapGlobal_c::MAPMODE_WORLD: { + if (mpRegionPane1 != nullptr) { + mpRegionPane1->SetVisible(false); + } + if (mpRegionPane2 != nullptr) { + mpRegionPane2->SetVisible(false); + } + break; + } + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + if (mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].play(); + } + if (mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].play(); + } + } + + if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { + bool visible = + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE; + setSaveObjsVisible(visible); + mPopupInfo.executeState_Invisible(); + } + mSaveCaption.execute(); + mPutIcon.execute(); + + mLyt.calc(); + + u8 alpha = 0; + if (mpAllPane->IsVisible()) { + alpha = mpAllPane->GetAlpha(); + } + global->setAlpha(alpha); + fn_80143300(); + mPinIconAggregate.setScale(global->getZoomFrame()); + mMarkers.execute(); + + if (mNextMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_5 || mNextMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8) { + mStateMgr.changeState(StateID_EventFieldMapChange_Step1); + mMapEvent = mNextMapEvent; + mNextMapEvent = 0; + } + mMaxBeaconCount = 0; } void dLytMapMain_c::draw() { @@ -2497,7 +2704,8 @@ void dLytMapMain_c::draw() { mMarkers.draw(); } - if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR && field_0x8C94 != 2) { + if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR && + mMapEvent != MAP_EVENT_SW_BANK_SMALL) { mPinIconAggregate.draw(); } @@ -2513,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) && - field_0x8C94 == 10) { + mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { fn_80138D80(); } fn_80143120(-2); mMarkers.drawPopups(); mPutIcon.draw(); - if (field_0x8C94 == 10) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { mPopupInfo.draw(); } @@ -2566,9 +2774,66 @@ s32 dLytMapMain_c::getSelectedSaveObjIdx() const { return idx; } -void lytMapusesSizedWString() { - static SizedWString<0x20> sString; - sString.sprintf(L"%ld", 0); +bool dLytMapMain_c::isPaneVisible(nw4r::lyt::Pane *pane) const { + bool ret = true; + while (pane != nullptr) { + if (!pane->IsVisible() || pane->GetAlpha() == 0) { + ret = false; + break; + } + pane = pane->GetParent(); + } + return ret; +} + +void dLytMapMain_c::setSaveObjsVisible(bool visible) { + nw4r::lyt::Pane *p; + nw4r::lyt::Bounding **ptrs = mpCurrentSaveObjBoundings; + for (int i = 0; i < mNumSaveObjs; i++) { + p = ptrs[i]; + if (visible) { + // This makes like no sense - the isPaneVisible check ensures + // that the pane is already visible when we enter the branch... + if (p != nullptr && p != nullptr && isPaneVisible(p)) { + p->SetVisible(true); + } + } else { + p->SetVisible(false); + } + } +} + +void dLytMapMain_c::setSaveObjPanePtrs() { + nw4r::lyt::Bounding **p = nullptr; + u32 count = 0; + if (mSurfaceProvince == SURFACE_PROVINCE_FARON) { + p = mpSaveObjBoundingsFaron; + count = ARRAY_LENGTH(mpSaveObjBoundingsFaron); + } else if (mSurfaceProvince == SURFACE_PROVINCE_ELDIN) { + p = mpSaveObjBoundingsEldin; + count = ARRAY_LENGTH(mpSaveObjBoundingsEldin); + } else if (mSurfaceProvince == SURFACE_PROVINCE_LANAYRU) { + p = mpSaveObjBoundingsLanayru; + count = ARRAY_LENGTH(mpSaveObjBoundingsLanayru); + } + mNumSaveObjs = count; + mpCurrentSaveObjBoundings = p; + mSavePopup.set(mpCurrentSaveObjBoundings, mNumSaveObjs); +} + +void dLytMapMain_c::initSaveObjs() { + nw4r::lyt::Bounding **ptrs = mpCurrentSaveObjBoundings; + nw4r::lyt::Bounding *p; + for (u32 i = 0; i < mNumSaveObjs; i++) { + p = *ptrs; + if (p->IsVisible()) { + mVec3_c pos(p->GetGlobalMtx()._03, p->GetGlobalMtx()._13, 0.0f); + mSaveObjs[i].setPosition(pos); + mSaveObjs[i].setAlpha(p->GetGlobalAlpha()); + mSaveObjs[i].draw(); + } + ptrs++; + } } void dLytMapMain_c::saveUnkMapData() { @@ -2787,7 +3052,7 @@ void dLytMapMain_c::setButtonMessages( void dLytMapMain_c::setCursorType() { if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode)) { - if ((field_0x8C94 == 10 || + if ((mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW || ((mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON) && mPointerOnMap)) || (mPointerCanPlaceBeacon && isPointingAtMainMap()) || (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) || @@ -2948,7 +3213,7 @@ static const char *sAreaPicNamesLink[] = { #define MAP_MAIN_NUM_AREA_PICS 12 void dLytMapMain_c::setupFlags() { - if (field_0x8C94 == 4 || field_0x8C94 == 6) { + if (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE) { field_0x8DBE = 0; } else { field_0x8DBE = -1; @@ -3060,7 +3325,7 @@ void dLytMapMain_c::setupFlags() { } } - if (field_0x8C94 == 3) { + if (mMapEvent == MAP_EVENT_MAP_INTRO) { if (field_0x88AC < 0) { field_0x88AC = 0; } @@ -3152,7 +3417,7 @@ void dLytMapMain_c::setupFlags() { } mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].bind(false); - mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOK].bind(false); + mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].bind(false); mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].bind(false); if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { @@ -3181,7 +3446,7 @@ void dLytMapMain_c::setupFlags() { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); } - if (field_0x8C94 == 2) { + if (mMapEvent == MAP_EVENT_SW_BANK_SMALL) { mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].bind(false); mAnmGroups[MAP_MAIN_ANIM_N_ON_OFF].setToEnd(); } else { @@ -3266,12 +3531,16 @@ void dLytMapMain_c::setupFlags() { } void dLytMapMain_c::initializeState_In() {} -void dLytMapMain_c::executeState_In() {} +void dLytMapMain_c::executeState_In() { + field_0x8DBF = 1; + dLytMapGlobal_c *global = getGlobal(); + // TODO this should explain most of mMapEvent +} void dLytMapMain_c::finalizeState_In() {} s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { s32 ret = AREAGROUP_MAX; - if (field_0x8C94 == 10) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { switch (mSurfaceProvince) { case SURFACE_PROVINCE_FARON: ret = AREAGROUP_FARON; break; case SURFACE_PROVINCE_ELDIN: ret = AREAGROUP_ELDIN; break; @@ -3300,7 +3569,7 @@ s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { s32 dLytMapMain_c::getRoomType() const { s32 ret = ROOMTYPE_FIELD; s32 stifRoomType = dStageMgr_c::GetInstance()->getSTIFRoomType(); - if (field_0x8C94 == 10) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { ret = ROOMTYPE_FIELD; } @@ -3598,12 +3867,12 @@ void dLytMapMain_c::executeState_Active() { if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { // Can zoom in around cursor, use the cursor pos getGlobal()->unprojectFromMap(field_0x8CF4, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); - f32 tmp = fn_80142D90(4); + f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); fn_8013FB70(field_0x8CF4, getGlobal()->getField_0x44() / tmp); mDrawScaleFrame = true; } else { // Cannot zoom in around cursor, use the player pos - f32 tmp = fn_80142D90(4); + f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); f32 val = getGlobal()->getField_0x44() / tmp; fn_8013FB70(getGlobal()->getPlayerPos(), val); mDrawScaleFrame = true; @@ -3666,11 +3935,11 @@ void dLytMapMain_c::finalizeState_Active() { } void dLytMapMain_c::initializeState_Out() { - if (field_0x8C94 == 10) { + if (mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { mPopupInfo.mStateMgr.changeState(StateID_Out); } dLytMeter_c::GetInstance()->setMeterField_0x13750(0); - if (field_0x8CAD || field_0x8C94 == 3) { + if (field_0x8CAD || mMapEvent == MAP_EVENT_MAP_INTRO) { mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT]; } else { mpOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM]; @@ -3720,7 +3989,7 @@ void dLytMapMain_c::initializeState_ChgMapUpDirection() { mNextMapUpDirection = !mMapUpDirection; field_0x8D44 = getGlobal()->getMapRotation(); - if (field_0x8C94 == 3) { + if (mMapEvent == MAP_EVENT_MAP_INTRO) { field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000); mNextMapUpDirection = false; } else { @@ -3740,7 +4009,7 @@ void dLytMapMain_c::initializeState_ChgMapUpDirection() { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_CHANGE_DIRECT); } void dLytMapMain_c::executeState_ChgMapUpDirection() { - if (field_0x8C94 == 3 && field_0x8D6A) { + if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x8D6A) { fn_80140B90(); } else { dLytMapGlobal_c *global = getGlobal(); @@ -3757,7 +4026,7 @@ void dLytMapMain_c::executeState_ChgMapUpDirection() { if (field_0x8C70 >= sHio.field_0x1B) { mLyt.calc(); mMapUpDirection = mNextMapUpDirection; - if (field_0x8C94 == 3) { + if (mMapEvent == MAP_EVENT_MAP_INTRO) { mStateMgr.changeState(StateID_EventMapIntro_Step4); } else { mStateMgr.changeState(StateID_Active); @@ -3766,7 +4035,7 @@ void dLytMapMain_c::executeState_ChgMapUpDirection() { field_0x8C70++; } - if (field_0x8C94 == 3) { + if (mMapEvent == MAP_EVENT_MAP_INTRO) { EventManager::execute(); } } @@ -3780,7 +4049,7 @@ void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() { field_0x8D44 = global->getMapRotation(); field_0x8D4C = fn_80142D90(mNextMapMode); - if (field_0x8C94 == 3) { + if (mMapEvent == MAP_EVENT_MAP_INTRO) { field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000); mNextMapUpDirection = false; } else { @@ -3849,7 +4118,7 @@ void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() { } } void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { - if (field_0x8C94 == 3 && field_0x8D6A) { + if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x8D6A) { fn_80140B90(); } else { dLytMapGlobal_c *global = getGlobal(); @@ -3898,7 +4167,7 @@ void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(length - f3 * length); if (field_0x8C70 >= sHio.field_0x1C) { - if (field_0x8C94 == 3 && field_0x0108 > 0) { + if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x0108 > 0) { field_0x0108--; } else { mDrawScaleFrame = false; @@ -3915,7 +4184,7 @@ void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { global->setField_0x44(field_0x8D4C); global->setMapScroll(mPlayerPos); - if (field_0x8C94 == 3) { + if (mMapEvent == MAP_EVENT_MAP_INTRO) { mStateMgr.changeState(StateID_EventMapIntro_Step4); } else { mStateMgr.changeState(StateID_Active); @@ -3925,7 +4194,7 @@ void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { } else { field_0x8C70++; } - if (field_0x8C94 == 3) { + if (mMapEvent == MAP_EVENT_MAP_INTRO) { EventManager::execute(); } } @@ -4219,7 +4488,7 @@ void dLytMapMain_c::initializeState_EventFieldMapChange_Step3() { void dLytMapMain_c::executeState_EventFieldMapChange_Step3() { if (mEventTimer != 0) { mEventTimer--; - } else if (field_0x8C94 == 8) { + } else if (mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8) { mStateMgr.changeState(StateID_Active); } else { mStateMgr.changeState(StateID_EventFieldMapChange_Step4); @@ -4321,7 +4590,7 @@ void dLytMapMain_c::executeState_EventSignalAdd_Step3() { void dLytMapMain_c::finalizeState_EventSignalAdd_Step3() {} bool dLytMapMain_c::fn_80141530() const { - return EventManager::isInEvent() && field_0x8C94 != 11; + return EventManager::isInEvent() && mMapEvent != MAP_EVENT_11; } dAcTbox_c *dLytMapMain_c::findGoddessChestForStoryflag(s32 flag) const { @@ -4447,22 +4716,22 @@ static const dLytMapSaveObjFlagDefinition sSaveObjFlagsLanayru[] = { }; void dLytMapMain_c::displaySaveObjs() { - for (int i = 0; i < field_0x8320; i++) { + for (int i = 0; i < mNumSaveObjs; i++) { mSaveObjs[i].init(); } s32 numFlags = ARRAY_LENGTH(sSaveObjFlagsFaron); - nw4r::lyt::Bounding **pBoundings = field_0x821C; + nw4r::lyt::Bounding **pBoundings = mpSaveObjBoundingsFaron; const dLytMapSaveObjFlagDefinition *flagSet = sSaveObjFlagsFaron; switch (mSurfaceProvince) { case SURFACE_PROVINCE_ELDIN: { - pBoundings = field_0x8244; + pBoundings = mpSaveObjBoundingsEldin; flagSet = sSaveObjFlagsEldin; numFlags = ARRAY_LENGTH(sSaveObjFlagsEldin); break; } case SURFACE_PROVINCE_LANAYRU: { - pBoundings = field_0x825C; + pBoundings = mpSaveObjBoundingsLanayru; flagSet = sSaveObjFlagsLanayru; numFlags = ARRAY_LENGTH(sSaveObjFlagsLanayru); break; @@ -4508,13 +4777,13 @@ void dLytMapMain_c::executeState_EventSaveObjSelect() { s32 currentSelected = getSelectedSaveObjIdx(); bool anyDecide = false; - for (int i = 0; i < field_0x8320; i++) { + for (int i = 0; i < mNumSaveObjs; i++) { if (mSaveObjs[i].mStateMgr.isState(dLytMapSaveObj_c::StateID_Decide)) { anyDecide = true; } } - for (int i = 0; i < field_0x8320; i++) { + for (int i = 0; i < mNumSaveObjs; i++) { mSaveObjs[i].mSelectRequest = false; if (currentSelected == i && !anyDecide) { mSaveObjs[i].mSelectRequest = true; @@ -4541,7 +4810,7 @@ void dLytMapMain_c::executeState_EventSaveObjSelect() { bool found = false; s32 statueIdx = 0; - for (int i = 0; i < field_0x8320; i++) { + for (int i = 0; i < mNumSaveObjs; i++) { if (mSaveObjs[i].mDecideFinished) { found = true; statueIdx = i; @@ -4645,7 +4914,7 @@ void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() { dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10; s32 idx = 0; s32 statueIdx = -1; - for (int i = 0; i < field_0x8320; i++) { + for (int i = 0; i < mNumSaveObjs; i++) { if (mSaveObjs[i].mDecideFinished) { statueIdx = i; break; @@ -4663,7 +4932,7 @@ void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() { mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out); } else { // cancel - for (int i = 0; i < field_0x8320; i++) { + for (int i = 0; i < mNumSaveObjs; i++) { mSaveObjs[i].init(); } mStateMgr.changeState(StateID_EventSaveObjSelect); From 67dff946f2e9bf250084c463618e9a70629bb892 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 11 Oct 2025 22:40:47 +0200 Subject: [PATCH 16/20] fixes --- config/SOUE01/symbols.txt | 2 +- include/d/lyt/d_lyt_map.h | 1 - src/d/lyt/d_lyt_map.cpp | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f627f789..0c18db81 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7995,7 +7995,7 @@ fn_80142D10__13dLytMapMain_cFlbR4mAng = .text:0x80142D10; // type:function size: fn_80142D90__13dLytMapMain_cFl = .text:0x80142D90; // type:function size:0x170 fn_80142F00__13dLytMapMain_cFR7mVec3_clUcRC7mVec3_cRC4mAng = .text:0x80142F00; // type:function size:0x158 fn_80143060__13dLytMapMain_cFR7mVec3_cRC7mVec3_cRC7mVec3_cRC4mAng = .text:0x80143060; // type:function size:0xBC -fn_80143120 = .text:0x80143120; // type:function size:0xC0 +fn_80143120__13dLytMapMain_cFl = .text:0x80143120; // type:function size:0xC0 fn_801431E0__13dLytMapMain_cFv = .text:0x801431E0; // type:function size:0x11C fn_80143300__13dLytMapMain_cFv = .text:0x80143300; // type:function size:0x54 fn_80143360__13dLytMapMain_cFv = .text:0x80143360; // type:function size:0x1D4 diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index ddad8a60..e1f6a1a6 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -651,7 +651,6 @@ private: void fn_80140B90(); void fn_80143300(); void fn_80143120(s32); - void fn_80138D80(); void fn_801431E0(); void fn_8013AD50(); void fn_80143360(); diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 76acf752..e7357640 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -2722,7 +2722,7 @@ void dLytMapMain_c::draw() { mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo()); if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && mMapEvent == MAP_EVENT_SAVE_OBJ_MSG_WINDOW) { - fn_80138D80(); + initSaveObjs(); } fn_80143120(-2); mMarkers.drawPopups(); @@ -3867,12 +3867,12 @@ void dLytMapMain_c::executeState_Active() { if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { // Can zoom in around cursor, use the cursor pos getGlobal()->unprojectFromMap(field_0x8CF4, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); - f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); + f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM); fn_8013FB70(field_0x8CF4, getGlobal()->getField_0x44() / tmp); mDrawScaleFrame = true; } else { // Cannot zoom in around cursor, use the player pos - f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); + f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM); f32 val = getGlobal()->getField_0x44() / tmp; fn_8013FB70(getGlobal()->getPlayerPos(), val); mDrawScaleFrame = true; From 126e026babdebf58cf291211b65e81f4056360b7 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 12 Oct 2025 20:58:47 +0200 Subject: [PATCH 17/20] 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() {} From ec6979b2113ec0b028110e198cc8bdbda719d4de Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 17 Oct 2025 21:24:27 +0200 Subject: [PATCH 18/20] More --- config/SOUE01/symbols.txt | 44 +- include/d/d_camera.h | 12 + include/d/d_message.h | 18 +- include/d/d_stage.h | 6 +- include/d/flag/storyflag_map.h | 2 +- include/d/lyt/d_lyt_map.h | 121 ++-- include/d/lyt/d_lyt_map_global.h | 14 +- include/d/lyt/d_lyt_map_markers.h | 8 +- include/toBeSorted/d_beacon.h | 3 + include/toBeSorted/event_manager_util.h | 10 +- src/d/d_cs_game.cpp | 4 +- src/d/d_message.cpp | 40 +- src/d/d_pad.cpp | 2 +- src/d/lyt/d_lyt_map.cpp | 703 +++++++++++++++++++--- src/d/lyt/d_lyt_map_global.cpp | 2 +- src/d/lyt/d_lyt_map_markers.cpp | 8 +- src/d/lyt/meter/d_lyt_meter.cpp | 6 +- src/d/lyt/msg_window/d_lyt_msg_window.cpp | 2 +- 18 files changed, 803 insertions(+), 202 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 1a4ee276..2c008acb 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7817,7 +7817,7 @@ remove__13dLytMapMain_cFv = .text:0x80137780; // type:function size:0x15C execute__13dLytMapMain_cFv = .text:0x801378E0; // type:function size:0x838 getStateID__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80138120; // type:function size:0x10 draw__13dLytMapMain_cFv = .text:0x80138130; // type:function size:0x238 -fn_80138370 = .text:0x80138370; // type:function size:0x138 +checkClose__13dLytMapMain_cCFv = .text:0x80138370; // type:function size:0x138 canChangeUpDirection__13dLytMapMain_cCFlb = .text:0x801384B0; // type:function size:0x5C canZoomIn__13dLytMapMain_cCFl = .text:0x80138510; // type:function size:0x140 canZoomOut__13dLytMapMain_cCFl = .text:0x80138650; // type:function size:0x1E0 @@ -7829,21 +7829,21 @@ setSaveObjsVisible__13dLytMapMain_cFb = .text:0x80138C70; // type:function size: setSaveObjPanePtrs__13dLytMapMain_cFv = .text:0x80138D20; // type:function size:0x5C initSaveObjs__13dLytMapMain_cFv = .text:0x80138D80; // type:function size:0xB0 isPointingAtMainMap__13dLytMapMain_cCFv = .text:0x80138E30; // type:function size:0xD4 -canPlaceBeacons__13dLytMapMain_cCFl = .text:0x80138F10; // type:function size:0xA0 +canPlaceBeacons__13dLytMapMain_cFl = .text:0x80138F10; // type:function size:0xA0 canResetPosition__13dLytMapMain_cCFlb = .text:0x80138FB0; // type:function size:0xA4 -fn_80139060 = .text:0x80139060; // type:function size:0x28 -isOpenMaybe__13dLytMapMain_cCFv = .text:0x80139090; // type:function size:0x478 -fn_80139510 = .text:0x80139510; // type:function size:0xA8 -fn_801395C0 = .text:0x801395C0; // type:function size:0x64 -isNotInvisible__13dLytMapMain_cCFv = .text:0x80139630; // type:function size:0x4C -lightPillarRelated__13dLytMapMain_cFlll = .text:0x80139680; // type:function size:0x14 -fn_801396A0 = .text:0x801396A0; // type:function size:0xA4 -fn_80139750 = .text:0x80139750; // type:function size:0x5E8 -fn_80139D40 = .text:0x80139D40; // type:function size:0x15C -fn_80139EA0__13dLytMapMain_cCFv = .text:0x80139EA0; // type:function size:0x58 -saveUnkMapData__13dLytMapMain_cFv = .text:0x80139F00; // type:function size:0x44 -initUnkMapData__13dLytMapMain_cFv = .text:0x80139F50; // type:function size:0xE8 -loadUnkMapData__13dLytMapMain_cFv = .text:0x8013A040; // type:function size:0x3C +isMapIntroDone__13dLytMapMain_cCFv = .text:0x80139060; // type:function size:0x28 +isOpen__13dLytMapMain_cCFv = .text:0x80139090; // type:function size:0x478 +getRoomAlpha__13dLytMapMain_cCFl = .text:0x80139510; // type:function size:0xA8 +canOpen__13dLytMapMain_cCFv = .text:0x801395C0; // type:function size:0x64 +isVisible__13dLytMapMain_cCFv = .text:0x80139630; // type:function size:0x4C +queueMapEvent__13dLytMapMain_cFlll = .text:0x80139680; // type:function size:0x14 +startMapEvent__13dLytMapMain_cFlll = .text:0x801396A0; // type:function size:0xA4 +setupEvent__13dLytMapMain_cFlll = .text:0x80139750; // type:function size:0x5E8 +close__13dLytMapMain_cFv = .text:0x80139D40; // type:function size:0x15C +isVisibleNoIntro__13dLytMapMain_cCFv = .text:0x80139EA0; // type:function size:0x58 +saveMapState__13dLytMapMain_cFv = .text:0x80139F00; // type:function size:0x44 +initMapState__13dLytMapMain_cFv = .text:0x80139F50; // type:function size:0xE8 +loadMapState__13dLytMapMain_cFv = .text:0x8013A040; // type:function size:0x3C clearButtonMessages__13dLytMapMain_cFv = .text:0x8013A080; // type:function size:0xE8 setButtonMessages__13dLytMapMain_cFlblb = .text:0x8013A170; // type:function size:0xA84 canCenterCursor1__13dLytMapMain_cCFl = .text:0x8013AC00; // type:function size:0x4 @@ -7919,7 +7919,7 @@ finalizeState_EventMapIntro_Step3__13dLytMapMain_cFv = .text:0x80140B10; // type initializeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B20; // type:function size:0x18 executeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B40; // type:function size:0x38 finalizeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B80; // type:function size:0x4 -fn_80140B90__13dLytMapMain_cFv = .text:0x80140B90; // type:function size:0xBC +forceOut__13dLytMapMain_cFv = .text:0x80140B90; // type:function size:0xBC initializeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140C50; // type:function size:0x18 executeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140C70; // type:function size:0x38 finalizeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140CB0; // type:function size:0x4 @@ -7990,7 +7990,7 @@ checkCursorPointedAtMap__13dLytMapMain_cFv = .text:0x80142760; // type:function fn_801428F0 = .text:0x801428F0; // type:function size:0xB4 fn_801429B0 = .text:0x801429B0; // type:function size:0x1D8 fn_80142B90 = .text:0x80142B90; // type:function size:0xEC -fn_80142C80 = .text:0x80142C80; // type:function size:0x8C +fn_80142C80__13dLytMapMain_cFl = .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_clbRC7mVec3_cRC4mAng = .text:0x80142F00; // type:function size:0x158 @@ -10102,7 +10102,7 @@ ActorLink__handleHotPumpkinSoup = .text:0x8018B2B0; // type:function size:0xE4 fn_8018B3A0 = .text:0x8018B3A0; // type:function size:0x80 shouldDropItemForChance = .text:0x8018B420; // type:function size:0x84 getMaxBeaconCount__Fv = .text:0x8018B4B0; // type:function size:0x44 -fn_8018B500 = .text:0x8018B500; // type:function size:0x40 +doesStageForbidBeaconPlacement__Fv = .text:0x8018B500; // type:function size:0x40 getBeaconPositionByIndex = .text:0x8018B540; // type:function size:0x60 setBeaconPosition__FPC7mVec3_cUl = .text:0x8018B5A0; // type:function size:0x7C setBeaconPositionChecked__FPC7mVec3_cUl = .text:0x8018B620; // type:function size:0x194 @@ -10721,10 +10721,10 @@ fn_8019E1F0 = .text:0x8019E1F0; // type:function size:0x10 fn_8019E200 = .text:0x8019E200; // type:function size:0x18C fn_8019E390 = .text:0x8019E390; // type:function size:0xC getCameraYRot = .text:0x8019E3A0; // type:function size:0x8 -fn_8019E3B0 = .text:0x8019E3B0; // type:function size:0xC +fn_8019E3B0__9dCamera_cCFv = .text:0x8019E3B0; // type:function size:0xC fn_8019E3C0 = .text:0x8019E3C0; // type:function size:0x44 -fn_8019E410 = .text:0x8019E410; // type:function size:0x1C -fn_8019E430 = .text:0x8019E430; // type:function size:0x18 +fn_8019E410__9dCamera_cFv = .text:0x8019E410; // type:function size:0x1C +fn_8019E430__9dCamera_cFv = .text:0x8019E430; // type:function size:0x18 fn_8019E450 = .text:0x8019E450; // type:function size:0x7C fn_8019E4D0 = .text:0x8019E4D0; // type:function size:0x5C fn_8019E530 = .text:0x8019E530; // type:function size:0x130 @@ -33753,7 +33753,7 @@ lbl_8051FFE8 = .data:0x8051FFE8; // type:object size:0xD data:string jumptable_8051FFF8 = .data:0x8051FFF8; // type:object size:0x30 scope:local lbl_80520028 = .data:0x80520028; // type:object size:0xC lbl_80520034 = .data:0x80520034; // type:object size:0xC data:string -lbl_80520040 = .data:0x80520040; // type:object size:0xC +lbl_80520040 = .data:0x80520040; // type:object size:0x9 data:string jumptable_8052004C = .data:0x8052004C; // type:object size:0x30 scope:local lbl_8052007C = .data:0x8052007C; // type:object size:0x10 lbl_8052008C = .data:0x8052008C; // type:object size:0x10 diff --git a/include/d/d_camera.h b/include/d/d_camera.h index 5df35c1d..ef2cf73d 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -8,7 +8,9 @@ extern "C" bool fn_80081FE0(void *, const char *); extern "C" bool fn_800918E0(void *, s32, s16); extern "C" void fn_80080960(void *, s32, s32, s8, s32); +extern "C" void fn_80093340(void *); extern "C" void fn_80093360(void *); +extern "C" void fn_80093380(void *); class dCamera_c : public dBase_c { public: @@ -31,10 +33,18 @@ public: return fn_800918E0(field_0xDA0, a1, a2); } + void doFn_80093340() { + fn_80093340(field_0xDA4); + } + void doFn_80093360() { fn_80093360(field_0xDA4); } + void doFn_80093380() { + fn_80093380(field_0xDA4); + } + void setScreenShakeIntensity(f32 val) { mScreenShakeIntensity = val; } @@ -47,6 +57,8 @@ public: f32 getUnderwaterDepth() const; void fn_8019E430(); + void fn_8019E410(); + mAng fn_8019E3B0() const; private: /* 0x068 */ u8 _0x068[0x6C - 0x068]; diff --git a/include/d/d_message.h b/include/d/d_message.h index b832faad..a0729e2c 100644 --- a/include/d/d_message.h +++ b/include/d/d_message.h @@ -86,9 +86,9 @@ protected: EVENT_SET_TEMPFLAG = 28, EVENT_UNSET_TEMPFLAG = 29, - EVENT_LIGHT_PILLAR_30 = 30, + EVENT_START_MAP_EVENT = 30, - EVENT_LIGHT_PILLAR_34 = 34, + EVENT_END_MAP_EVENT = 34, EVENT_SET_STORYFLAG_217 = 37, EVENT_DEMO_METER_ITEM_SELECT = 38, @@ -227,10 +227,6 @@ public: void init(); void reset(); - bool getField_0x328() const { - return field_0x328; - } - bool getField_0x329() const { return field_0x329; } @@ -243,8 +239,12 @@ public: field_0x2FC = val; } - void setField_0x328(u8 val) { - field_0x328 = val; + bool getInMapEvent() const { + return mInMapEvent; + } + + void setInMapEvent(bool val) { + mInMapEvent = val; } s32 getField_0x32C() const { @@ -362,7 +362,7 @@ private: /* 0x300 */ u32 field_0x300[10]; - /* 0x328 */ bool field_0x328; + /* 0x328 */ bool mInMapEvent; /* 0x329 */ bool field_0x329; /* 0x32A */ bool field_0x32A; diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 7744ae15..b0de4c98 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -67,13 +67,17 @@ public: /* 0x1E9 */ u8 field_0x1E9; /* 0x1EA */ s8 field_0x1EA; /* 0x1EB */ u8 field_0x1EB; - /* 0x1EC */ u8 field_0x1EC; + /* 0x1EC */ s8 field_0x1EC; /* 0x1ED */ u8 field_0x1ED; /* 0x1EE */ u8 field_0x1EE; /* 0x1EF */ u8 field_0x1EF; /* 0x1F0 */ u8 field_0x1F0; public: + s8 getField_0x1EC() const { + return field_0x1EC; + } + u8 getField_0x1EE() const { return field_0x1EE; } diff --git a/include/d/flag/storyflag_map.h b/include/d/flag/storyflag_map.h index 56acd19d..b7d58a31 100644 --- a/include/d/flag/storyflag_map.h +++ b/include/d/flag/storyflag_map.h @@ -667,7 +667,7 @@ enum StoryFlags_e { /** [Meeting Impa cutscene] * Story Flag #130 (0x0082) - JP 805ACD64 0x01 / US 805A9AE4 0x01 */ - STORYFLAG_130, + STORYFLAG_IMPA_MET, /** [Imp 1 defeated (Skyloft layers 4&5)] * Story Flag #131 (0x0083) - JP 805ACD64 0x02 / US 805A9AE4 0x02 diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 103d7191..f3c938ff 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -41,7 +41,7 @@ struct dMapSavedDataEntry { /* 0x00 */ s32 mapMode; /* 0x04 */ bool mapUpDirection; /* 0x05 */ bool mapUpDirectionAfterZoomToDetail; - /* 0x06 */ u8 field_0x06; + /* 0x06 */ bool isValid; }; struct dMapSavedData { @@ -537,10 +537,14 @@ public: void remove(); void execute(); - bool isNotInvisible() const; - bool isOpenMaybe() const; - bool fn_80139EA0() const; - void lightPillarRelated(s32, s32, s32); + bool checkClose() const; + + bool isOpen() const; + bool canOpen() const; + bool isVisible() const; + void queueMapEvent(s32 mapEvent, s32 surfaceProvince, s32 c); + void startMapEvent(s32 mapEvent, s32 surfaceProvince, s32 c); + bool isVisibleNoIntro() const; const dMapSaveObjDefinition *getSaveObjDefinition(s32 province, s32 statueIdx) const; @@ -585,6 +589,23 @@ public: STATE_FUNC_DECLARE(dLytMapMain_c, EventSaveObjConfirmMsgWindow); STATE_FUNC_DECLARE(dLytMapMain_c, EventSaveObjDecide); + enum MapEvent_e { + MAP_EVENT_NONE = 0, + MAP_EVENT_1 = 1, + // ??? + MAP_EVENT_SW_BANK_SMALL = 2, + MAP_EVENT_MAP_INTRO = 3, + MAP_EVENT_DUNGEON_MAP_GET = 4, + MAP_EVENT_FIELD_MAP_CHANGE_5 = 5, + MAP_EVENT_FOREST_MAP_CHANGE = 6, + MAP_EVENT_SIGNAL_ADD = 7, + MAP_EVENT_FIELD_MAP_CHANGE_8 = 8, + MAP_EVENT_GODDESS_CUBE = 9, + /** arg1 = surface province */ + MAP_EVENT_SAVE_OBJ = 10, + MAP_EVENT_11 = 11, + }; + private: // TODO - need to come up with better names for all of these enums and concepts @@ -613,22 +634,6 @@ private: ROOMTYPE_MAX = 6, }; - enum MapEvent_e { - MAP_EVENT_NONE = 0, - MAP_EVENT_1 = 1, - // ??? - MAP_EVENT_SW_BANK_SMALL = 2, - MAP_EVENT_MAP_INTRO = 3, - MAP_EVENT_DUNGEON_MAP_GET = 4, - MAP_EVENT_FIELD_MAP_CHANGE_5 = 5, - MAP_EVENT_FOREST_MAP_CHANGE = 6, - MAP_EVENT_SIGNAL_ADD = 7, - MAP_EVENT_FIELD_MAP_CHANGE_8 = 8, - MAP_EVENT_GODDESS_CUBE = 9, - MAP_EVENT_SAVE_OBJ = 10, - MAP_EVENT_11 = 11, - }; - dLytMapGlobal_c *getGlobal(); void checkScroll(); bool needsNav(s32 mapMode) const; @@ -638,7 +643,7 @@ private: bool canChangeUpDirection(s32 mapMode, bool) const; bool canCenterCursor(s32 mapMode) const; bool canCenterCursor1(s32 mapMode) const; - bool canPlaceBeacons(s32 mapMode) const; + bool canPlaceBeacons(s32 mapMode); bool canChangeFloor(s32 mapMode) const; bool isPointingAtMainMap() const; @@ -654,12 +659,14 @@ private: bool fn_80141530() const; bool fn_80142D10(s32, bool, mAng &); void fn_80143060(mVec3_c &, const mVec3_c &, const mVec3_c &, const mAng &); - void fn_80140B90(); + void forceOut(); void fn_80143300(); void fn_80143120(s32); void fn_801431E0(); void fn_8013AD50(); void fn_80143360(); + void fn_80142C80(s32); + bool isMapIntroDone() const; bool shouldDrawFootprints() const; void zoomIn(); @@ -671,12 +678,14 @@ private: void setupFlags(); void setupStage(); + void setupEvent(s32 event, s32 arg1, s32 arg2); + void close(); void loadTextboxes(); - void saveUnkMapData(); - void initUnkMapData(); - void loadUnkMapData(); + void saveMapState(); + void initMapState(); + void loadMapState(); void checkCursorPointedAtMap(); @@ -690,14 +699,22 @@ private: void setSaveObjPanePtrs(); void initSaveObjs(); + u8 getRoomAlpha(s32 roomid) const; + static dMapSavedData sSavedMapData; static const dMapSavedData sDefaultMapData; - bool isSomeFieldEq0Or1Or7Or9Or11() const { + bool isMapEventEq0Or1Or7Or9Or11() const { return mMapEvent == MAP_EVENT_NONE || mMapEvent == MAP_EVENT_1 || mMapEvent == MAP_EVENT_SIGNAL_ADD || mMapEvent == MAP_EVENT_GODDESS_CUBE || mMapEvent == MAP_EVENT_11; } + bool isMapEventEq1Or7Or8Or9Or11() const { + return mMapEvent == MAP_EVENT_1 || mMapEvent == MAP_EVENT_SIGNAL_ADD || + mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8 || mMapEvent == MAP_EVENT_GODDESS_CUBE || + mMapEvent == MAP_EVENT_11; + } + /* 0x0010 */ UI_STATE_MGR_DECLARE(dLytMapMain_c); /* 0x004C */ dFlowMgrBase_c mFlowMgr; /* 0x00A4 */ dFlow_c mFlow; @@ -778,17 +795,15 @@ private: /* 0x8C93 */ u8 field_0x8C93; /* 0x8C94 */ s32 mMapEvent; /* 0x8C98 */ s32 mNextMapEvent; - /* 0x8C9C */ s32 mSurfaceProvince; - - /* 0x8CA0 */ u8 _0x8CA0[0x8CA4 - 0x8CA0]; + /* 0x8C9C */ s32 mMapEventArg1; + /* 0x8CA0 */ s32 mMapEventArg2; /* 0x8CA4 */ s32 mCurrentMapMode; /* 0x8CA8 */ s32 mNextMapMode; /* 0x8CAC */ u8 field_0x8CAC; - /* 0x8CAD */ u8 field_0x8CAD; - - /* 0x8CAE */ u8 _0x8CAE[0x8CB0 - 0x8CAE]; + /* 0x8CAD */ bool mDoCameraTransition; + /* 0x8CAE */ bool field_0x8CAE; /* 0x8CB0 */ u32 mEventTimer; /* 0x8CB4 */ UNKWORD field_0x8CB4; @@ -813,14 +828,14 @@ private: /* 0x8D48 */ mAng field_0x8D48; /* 0x8D4C */ f32 field_0x8D4C; /* 0x8D50 */ f32 field_0x8D50; - /* 0x8D54 */ s32 field_0x8D54; - /* 0x8D58 */ s32 field_0x8D58; - /* 0x8D5C */ UNKWORD field_0x8D5C; - /* 0x8D60 */ s32 field_0x8D60; - /* 0x8D64 */ UNKWORD field_0x8D64; + /* 0x8D54 */ s32 mNumTitleLines; + /* 0x8D58 */ s32 mCurrentFloor; + /* 0x8D5C */ UNKWORD mNumFloors; + /* 0x8D60 */ s32 mBaseFloorOffset; + /* 0x8D64 */ s32 field_0x8D64; /* 0x8D68 */ mAng field_0x8D68; - /* 0x8D6A */ u8 field_0x8D6A; // set at 0x8009e2d4 - /* 0x8D6B */ u8 field_0x8D6B; + /* 0x8D6A */ bool mEventCanceled; // set at 0x8009e2d4 + /* 0x8D6B */ bool mEventDone; /* 0x8D6C */ nw4r::lyt::Pane *mpRegionPane1; /* 0x8D70 */ nw4r::lyt::Pane *mpRegionPane2; /* 0x8D74 */ nw4r::lyt::Pane *mpZoomInOutPane; @@ -838,8 +853,8 @@ private: /* 0x8DB8 */ s32 mDisplayedBeaconCount; /* 0x8DBC */ bool mShowIslandNames; /* 0x8DBD */ bool field_0x8DBD; - /* 0x8DBE */ u8 field_0x8DBE; - /* 0x8DBF */ u8 field_0x8DBF; + /* 0x8DBE */ u8 mMapChangeAlpha; + /* 0x8DBF */ bool mIsVisible; /* 0x8DC0 */ UNKWORD field_0x8DC0; /* 0x8DC4 */ UNKWORD field_0x8DC4; /* 0x8DC8 */ dLytMapGlobal_c mGlobal; @@ -876,37 +891,37 @@ public: return sInstance; } - bool isNotInvisible() const { - return mMapMain.isNotInvisible(); + bool isVisible() const { + return mMapMain.isVisible(); } - bool isOpenMaybe() const { - return mMapMain.isOpenMaybe(); + bool isOpen() const { + return mMapMain.isOpen(); } - bool getFn_80139EA0() const { - return mMapMain.fn_80139EA0(); + bool isVisibleNoIntro() const { + return mMapMain.isVisibleNoIntro(); } void build(); - bool isSomeMapFieldEq2Or4Or5Or6() const { + bool isMapEventEq2Or4Or5Or6() const { return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SW_BANK_SMALL || mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_DUNGEON_MAP_GET || mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_FIELD_MAP_CHANGE_5 || mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_FOREST_MAP_CHANGE; } - bool isSomeMapFieldEq10() const { + bool isMapEventSaveObj() const { return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SAVE_OBJ; } - void lightPillarRelated(s32 p1, s32 p2, s32 p3) { - mMapMain.lightPillarRelated(p1, p2, p3); + void queueMapEvent(s32 mapEvent, s32 arg1, s32 arg2) { + mMapMain.queueMapEvent(mapEvent, arg1, arg2); } const dMapSaveObjDefinition *getSaveObjDefinition(s32 statueIdx) const { - return mMapMain.getSaveObjDefinition(mMapMain.mSurfaceProvince, statueIdx); + return mMapMain.getSaveObjDefinition(mMapMain.mMapEventArg1, statueIdx); } void fn_80143A30(); diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h index fddf7bcc..fb0b25bf 100644 --- a/include/d/lyt/d_lyt_map_global.h +++ b/include/d/lyt/d_lyt_map_global.h @@ -80,6 +80,10 @@ public: return field_0x55; } + void setField_0x55(u8 v) { + field_0x55 = v; + } + const mAng &getField_0x56() const { return field_0x56; } @@ -164,8 +168,12 @@ public: field_0x4F = v; } - UNKWORD getField_0x50() const { - return field_0x50; + s32 getMapEvent() const { + return mMapEvent; + } + + void setMapEvent(s32 v) { + mMapEvent = v; } u8 getField_0x54() const { @@ -204,7 +212,7 @@ private: /* 0x4D */ u8 field_0x4D; /* 0x4E */ u8 mAlpha; /* 0x4F */ u8 field_0x4F; - /* 0x50 */ UNKWORD field_0x50; + /* 0x50 */ s32 mMapEvent; /* 0x54 */ u8 field_0x54; /* 0x55 */ u8 field_0x55; /* 0x56 */ mAng field_0x56; diff --git a/include/d/lyt/d_lyt_map_markers.h b/include/d/lyt/d_lyt_map_markers.h index 35113431..948b2ac7 100644 --- a/include/d/lyt/d_lyt_map_markers.h +++ b/include/d/lyt/d_lyt_map_markers.h @@ -492,6 +492,10 @@ public: return field_0x0704; } + void setLinkRot(const mAng3_c &rot) { + mLinkRot = rot; + } + private: void resetPopups(); void loadPopups(); @@ -501,9 +505,7 @@ private: /* 0x06F0 */ bool mShowIslandNames; /* 0x06F4 */ mVec2_c field_0x06F4; - - /* 0x06FC */ u8 _0x6FC[0x0702 - 0x06FC]; - + /* 0x06FC */ mAng3_c mLinkRot; /* 0x0702 */ u8 field_0x0702; /* 0x0702 */ u8 field_0x0703; /* 0x0704 */ f32 field_0x0704; diff --git a/include/toBeSorted/d_beacon.h b/include/toBeSorted/d_beacon.h index 27efce6a..b963d98a 100644 --- a/include/toBeSorted/d_beacon.h +++ b/include/toBeSorted/d_beacon.h @@ -16,4 +16,7 @@ void setBeaconPosition(const mVec3_c *position, u32 beaconIndex); */ void setBeaconPositionChecked(const mVec3_c *position, u32 beaconIndex); +/** Checks whether the current stage is ineligible for beacon placement */ +bool doesStageForbidBeaconPlacement(); + #endif diff --git a/include/toBeSorted/event_manager_util.h b/include/toBeSorted/event_manager_util.h index 9d38951f..d2f4670b 100644 --- a/include/toBeSorted/event_manager_util.h +++ b/include/toBeSorted/event_manager_util.h @@ -32,15 +32,15 @@ inline bool EventManagerIsInMap() { } inline bool EventManagerIsMapOpen() { - return EventManagerIsInMap() && dLytMap_c::GetInstance()->isOpenMaybe(); + return EventManagerIsInMap() && dLytMap_c::GetInstance()->isOpen(); } -inline bool EventManagerIsMapOpenAndMessage() { - return EventManagerIsMapOpen() && !dMessage_c::getInstance()->getField_0x328(); +inline bool EventManagerIsMapOpenNormal() { + return EventManagerIsMapOpen() && !dMessage_c::getInstance()->getInMapEvent(); } -inline bool EventManagerIsMapOpenAnd0x9008Eq10() { - return EventManagerIsMapOpen() && dLytMap_c::GetInstance()->isSomeMapFieldEq10(); +inline bool EventManagerIsMapEventSaveObj() { + return EventManagerIsMapOpen() && dLytMap_c::GetInstance()->isMapEventSaveObj(); } #endif diff --git a/src/d/d_cs_game.cpp b/src/d/d_cs_game.cpp index f16dfd7e..e3572e2e 100644 --- a/src/d/d_cs_game.cpp +++ b/src/d/d_cs_game.cpp @@ -257,7 +257,7 @@ bool dCsGame_c::shouldDraw() const { bool dCsGame_c::isForcedHidden() const { return ( EventManagerNotDrawControl0x80() && EventManagerNotSkyKeepPuzzle() && EventManagerNotInShop() && - EventManagerNotInDeposit() && !EventManagerIsMapOpenAndMessage() && !EventManagerIsMapOpenAnd0x9008Eq10() + EventManagerNotInDeposit() && !EventManagerIsMapOpenNormal() && !EventManagerIsMapEventSaveObj() ); } @@ -338,7 +338,7 @@ mVec2_c &dCursorInterfaceGame_c::getCursorPos() { f32 f3 = sHio.field_0x10 + 4.0f; f32 f4 = sHio.field_0x0C + -15.0f; - if (dLytMap_c::GetInstance() != nullptr && dLytMap_c::GetInstance()->isOpenMaybe()) { + if (dLytMap_c::GetInstance() != nullptr && dLytMap_c::GetInstance()->isOpen()) { if (pos.x < -f0 + f4) { pos.x = -f0 + f4; } diff --git a/src/d/d_message.cpp b/src/d/d_message.cpp index ce1b290f..f2343080 100644 --- a/src/d/d_message.cpp +++ b/src/d/d_message.cpp @@ -417,35 +417,37 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { dStageMgr_c::GetInstance()->getFlagIndex(); SceneflagManager::sInstance->unsetTempflag_i(0x3F, (params1n2 >> 16) & 0xFFFF); break; - case EVENT_LIGHT_PILLAR_30: { + case EVENT_START_MAP_EVENT: { s8 p4 = (params1n2 >> 24) & 0xFF; s8 p1 = params1n2 & 0xFF; - s8 p3 = (params1n2 >> 16) & 0xFF; - s8 p2 = (params1n2 >> 8) & 0xFF; - s32 val = 1; + s8 arg1 = (params1n2 >> 16) & 0xFF; + s8 arg2 = (params1n2 >> 8) & 0xFF; + s32 mapEvent = 1; switch (p1) { - case 1: val = 4; break; - case 2: val = 3; break; - case 3: val = 5; break; - case 5: val = 7; break; - case 6: val = 8; break; - case 7: val = 9; break; + case 1: mapEvent = dLytMapMain_c::MAP_EVENT_DUNGEON_MAP_GET; break; + case 2: mapEvent = dLytMapMain_c::MAP_EVENT_MAP_INTRO; break; + case 3: mapEvent = dLytMapMain_c::MAP_EVENT_FIELD_MAP_CHANGE_5; break; + case 5: mapEvent = dLytMapMain_c::MAP_EVENT_SIGNAL_ADD; break; + 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(val); + dMessage_c::getInstance()->setField_0x32C(mapEvent); dMessage_c::getInstance()->setField_0x329(true); - if (dMessage_c::getInstance()->getField_0x328() == 0) { - dMessage_c::getInstance()->setField_0x328(1); + if (dMessage_c::getInstance()->getInMapEvent() == false) { + dMessage_c::getInstance()->setInMapEvent(true); dMessage_c::getInstance()->clearLightPillarRelatedArgs(); if (dLytControlGame_c::getInstance()->isStateNormalOrNotInEvent()) { - dLytControlGame_c::getInstance()->somehowRelatedToEnteringLightPillars(val, p3, p2); + dLytControlGame_c::getInstance()->somehowRelatedToEnteringLightPillars( + mapEvent, arg1, arg2 + ); } } else { - dLytMap_c::GetInstance()->lightPillarRelated(val, p3, p2); + dLytMap_c::GetInstance()->queueMapEvent(mapEvent, arg1, arg2); } dMessage_c::getInstance()->storeLightPillarRelatedArg(p4); break; } - case EVENT_LIGHT_PILLAR_34: { + case EVENT_END_MAP_EVENT: { // TODO what do these modes do? if (params1n2 == 1) { if (!dLytControlGame_c::getInstance()->isNotInStateMap()) { @@ -463,7 +465,7 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { dMessage_c::getInstance()->setField_0x32A(1); } } - dMessage_c::getInstance()->setField_0x328(0); + dMessage_c::getInstance()->setInMapEvent(false); break; } case EVENT_SET_STORYFLAG_217: @@ -1127,7 +1129,7 @@ bool dFlow_c::advanceUntil(s32 searchType, s32 searchParam3, s32 *pOutParams1n2) case EVENT_LOAD_FI_FLOW: case EVENT_COUNTER_THRESHOLD: case 27: keepGoing = handleEvent(); continue; - case EVENT_LIGHT_PILLAR_34: + case EVENT_END_MAP_EVENT: if (element->params1n2 == 2) { keepGoing = false; continue; @@ -1762,7 +1764,7 @@ void dMessage_c::executeMinigame() { void dMessage_c::init() { clearLightPillarRelatedArgs(); // Probably inlines - field_0x328 = 0; + mInMapEvent = false; field_0x329 = 0; field_0x32A = 0; sInstance->setField_0x32C(12); diff --git a/src/d/d_pad.cpp b/src/d/d_pad.cpp index 8736812a..3b5b8791 100644 --- a/src/d/d_pad.cpp +++ b/src/d/d_pad.cpp @@ -498,7 +498,7 @@ void ex_c::fn_80056790(s32 chan) { f32 f; if (dScGame_c::GetInstance() != nullptr && dLytMap_c::GetInstance() != nullptr && - !dLytMap_c::GetInstance()->isNotInvisible()) { + !dLytMap_c::GetInstance()->isVisible()) { f = dScGame_c::GetInstance()->targetingScreenFn_801BBEC0(); } else { f = 1.0f; diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 8c3fb499..91e459d5 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -1,5 +1,7 @@ #include "c/c_math.h" -#include "m/m_pad.h" +#include "d/d_player_act.h" +#include "d/snd/d_snd_player_mgr.h" +#include "toBeSorted/minigame_mgr.h" #define NEED_DIRECT_FRAMECTRL_ACCESS #include "c/c_lib.h" #include "common.h" @@ -35,6 +37,7 @@ #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" +#include "m/m_pad.h" #include "m/m_vec.h" #include "m/m_video.h" #include "nw4r/lyt/lyt_bounding.h" @@ -1925,13 +1928,13 @@ dLytMapMain_c::dLytMapMain_c() field_0x8D48(0), field_0x8D4C(0.0f), field_0x8D50(0.0f), - field_0x8D58(0), - field_0x8D5C(1), - field_0x8D60(0), + mCurrentFloor(0), + mNumFloors(1), + mBaseFloorOffset(0), field_0x8D64(0), field_0x8D68(0), - field_0x8D6A(0), - field_0x8D6B(0), + mEventCanceled(false), + mEventDone(false), mpRegionPane1(nullptr), mpRegionPane2(nullptr), field_0x8DB0(0), @@ -1940,8 +1943,8 @@ dLytMapMain_c::dLytMapMain_c() mDisplayedBeaconCount(0), mShowIslandNames(false), field_0x8DBD(0), - field_0x8DBE(0), - field_0x8DBF(0), + mMapChangeAlpha(0), + mIsVisible(true), field_0x8DC0(-1), field_0x8DC4(0) { field_0x8D78 = 0.0f; @@ -2219,7 +2222,7 @@ static const char *sPriorityGroupNames[] = { }; void dLytMapMain_c::build() { - field_0x8DBF = 0; + mIsVisible = 0; field_0x8DB0 = 0; if (dScGame_c::isCurrentStage("F102")) { // awesome but unnecessary @@ -2361,9 +2364,9 @@ void dLytMapMain_c::build() { mStateMgr.changeState(StateID_Invisible); getGlobal()->setFloor(0); mNavEnabled = false; - field_0x8D58 = 0; - field_0x8D5C = 1; - field_0x8D60 = 0; + mCurrentFloor = 0; + mNumFloors = 1; + mBaseFloorOffset = 0; field_0x8D64 = 0; fn_80143300(); } @@ -2600,7 +2603,7 @@ void dLytMapMain_c::execute() { setCursorType(); if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && - (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { global->setField_0x4D(1); } else { global->setField_0x4D(0); @@ -2688,14 +2691,14 @@ void dLytMapMain_c::execute() { } void dLytMapMain_c::draw() { - if (!field_0x8DBF) { + if (!mIsVisible) { return; } dLytMapGlobal_c *global = getGlobal(); fn_80143120(1); mLyt.draw(); - if (shouldDrawFootprints() && field_0x8D58 == global->getFloor()) { + if (shouldDrawFootprints() && mCurrentFloor == global->getFloor()) { mFootPrints.draw(); } @@ -2737,6 +2740,219 @@ void dLytMapMain_c::draw() { mSaveCaption.draw(); } +bool dLytMapMain_c::checkClose() const { + bool ret = false; + const sStateIDIf_c &stateID = *mStateMgr.getStateID(); + switch (mMapEvent) { + case MAP_EVENT_NONE: + case MAP_EVENT_11: { + if (stateID == StateID_Active && (dPad::getDownTrigPlus() || dPad::getDownTrigB())) { + ret = true; + } + break; + } + case MAP_EVENT_1: + case MAP_EVENT_MAP_INTRO: + case MAP_EVENT_DUNGEON_MAP_GET: + case MAP_EVENT_FOREST_MAP_CHANGE: + case MAP_EVENT_SIGNAL_ADD: + case MAP_EVENT_FIELD_MAP_CHANGE_8: + case MAP_EVENT_GODDESS_CUBE: + case MAP_EVENT_SAVE_OBJ: { + if (mEventDone) { + ret = true; + } + break; + } + case MAP_EVENT_FIELD_MAP_CHANGE_5: { + if (stateID == StateID_EventFieldMapChange_Step4 && mEventDone) { + ret = true; + } + break; + } + case MAP_EVENT_SW_BANK_SMALL: { + if (stateID == StateID_EventSwBankSmall_Step3 && mEventDone) { + ret = true; + } + break; + } + } + + return ret; +} + +bool dLytMapMain_c::canChangeUpDirection(s32 mapMode, bool upDirection) const { + bool ret = false; + if (mapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + switch (mRoomType) { + case ROOMTYPE_FIELD: ret = true; break; + case ROOMTYPE_DUNGEON: ret = true; break; + case ROOMTYPE_SKYLOFT: ret = true; break; + case ROOMTYPE_SKYFIELD: ret = true; break; + } + } + + return ret; +} + +bool dLytMapMain_c::canZoomIn(s32 mapMode) const { + bool ret = false; + switch (mMapEvent) { + case MAP_EVENT_SIGNAL_ADD: + case MAP_EVENT_FIELD_MAP_CHANGE_8: + case MAP_EVENT_GODDESS_CUBE: + case MAP_EVENT_NONE: + case MAP_EVENT_1: + case MAP_EVENT_11: { + if (mRoomType == ROOMTYPE_SKYLOFT) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD || mapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || + mapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + ret = true; + } + } else if (mAreaGroup == AREAGROUP_SKY && mRoomType == ROOMTYPE_BOSS_HOUSE) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD || mapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + ret = true; + } + } else if (mAreaGroup == AREAGROUP_SKY && mRoomType == ROOMTYPE_DUNGEON) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD || mapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || + mapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_SKYFIELD) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD || mapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_FIELD) { + if (mapMode == dLytMapGlobal_c::MAPMODE_STAGE || mapMode == dLytMapGlobal_c::MAPMODE_WORLD || + mapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_DUNGEON) { + if (mapMode == dLytMapGlobal_c::MAPMODE_STAGE || mapMode == dLytMapGlobal_c::MAPMODE_WORLD || + mapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_BOSS_HOUSE) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD || mapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + ret = true; + } + } + break; + } + } + + return ret; +} + +bool dLytMapMain_c::canZoomOut(s32 mapMode) const { + if (!StoryflagManager::sInstance->getFlag(STORYFLAG_FARON_DISCOVERED) && + ((mRoomType == ROOMTYPE_SKYLOFT && mapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || + mRoomType != ROOMTYPE_SKYLOFT && mapMode == dLytMapGlobal_c::MAPMODE_STAGE)) { + return false; + } + + bool ret = false; + + if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) { + if (mapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + return true; + } + } else { + switch (mMapEvent) { + case MAP_EVENT_SIGNAL_ADD: + case MAP_EVENT_FIELD_MAP_CHANGE_8: + case MAP_EVENT_GODDESS_CUBE: + case MAP_EVENT_NONE: + case MAP_EVENT_1: + case MAP_EVENT_11: { + if (mRoomType == ROOMTYPE_SKYLOFT) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || mapMode == dLytMapGlobal_c::MAPMODE_STAGE || + mapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + ret = true; + } + } else if (mAreaGroup == AREAGROUP_SKY && mRoomType == ROOMTYPE_BOSS_HOUSE) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || mapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + ret = true; + } + } else if (mAreaGroup == AREAGROUP_SKY && mRoomType == ROOMTYPE_DUNGEON) { + if (mapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || mapMode == dLytMapGlobal_c::MAPMODE_STAGE || + mapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_SKYFIELD) { + if (mapMode == dLytMapGlobal_c::MAPMODE_STAGE || mapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_FIELD) { + if (mapMode == dLytMapGlobal_c::MAPMODE_ZOOM || mapMode == dLytMapGlobal_c::MAPMODE_STAGE || + mapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_DUNGEON) { + if (mapMode == dLytMapGlobal_c::MAPMODE_ZOOM || mapMode == dLytMapGlobal_c::MAPMODE_STAGE || + mapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_BOSS_HOUSE) { + if (mapMode == dLytMapGlobal_c::MAPMODE_STAGE || mapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + ret = true; + } + } else if (mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + if (mapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + ret = true; + } + } + break; + } + } + } + + return ret; +} + +bool dLytMapMain_c::canCenterCursor(s32 mapMode) const { + bool ret = false; + const sStateIDIf_c &stateID = *mStateMgr.getStateID(); + + if ((stateID != StateID_Invisible && stateID != StateID_RenderingWait && stateID != StateID_In && + stateID != StateID_Out && stateID != StateID_EventSaveObjConfirmMsgWindow && + stateID != StateID_EventSaveObjDecide && stateID != StateID_EventSaveObjMsgWindow)) { + if ((mMapEvent == MAP_EVENT_SIGNAL_ADD || mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8 || + mMapEvent == MAP_EVENT_GODDESS_CUBE || mMapEvent == MAP_EVENT_NONE || mMapEvent == MAP_EVENT_1 || + mMapEvent == MAP_EVENT_11) && + (mapMode == dLytMapGlobal_c::MAPMODE_STAGE || mapMode == dLytMapGlobal_c::MAPMODE_ZOOM) && + (!EventManager::isInEvent() || + // TODO - why is this being double checked? + ((EventManager::isInEvent() && !dMessage_c::getInstance()->getInMapEvent()) || + (EventManager::isInEvent() && !dMessage_c::getInstance()->getInMapEvent()))) && + (!needsNav(mapMode) || !mFloorBtnMgr.hasPointedAtABtnIdx() || mFloorBtnMgr.isUsingPointerNav())) { + ret = true; + } + if (mMapEvent == MAP_EVENT_SAVE_OBJ && mapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + ret = true; + } + } + return ret; +} + +bool dLytMapMain_c::needsNav(s32 mapMode) const { + bool ret = false; + + // TODO - Why is this checking mCurrentMapMode + if (mNumFloors >= 2 && + (mMapEvent == MAP_EVENT_NONE || mMapEvent == MAP_EVENT_1 || mMapEvent == MAP_EVENT_SIGNAL_ADD) && + (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || + (mapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mFloorBtnMgr.hasPointedAtABtnIdx()))) { + ret = true; + } + + return ret; +} + s32 dLytMapMain_c::getSelectedSaveObjIdx() const { bool has = false; s32 start; @@ -2806,13 +3022,13 @@ void dLytMapMain_c::setSaveObjsVisible(bool visible) { void dLytMapMain_c::setSaveObjPanePtrs() { nw4r::lyt::Bounding **p = nullptr; u32 count = 0; - if (mSurfaceProvince == SURFACE_PROVINCE_FARON) { + if (mMapEventArg1 == SURFACE_PROVINCE_FARON) { p = mpSaveObjBoundingsFaron; count = ARRAY_LENGTH(mpSaveObjBoundingsFaron); - } else if (mSurfaceProvince == SURFACE_PROVINCE_ELDIN) { + } else if (mMapEventArg1 == SURFACE_PROVINCE_ELDIN) { p = mpSaveObjBoundingsEldin; count = ARRAY_LENGTH(mpSaveObjBoundingsEldin); - } else if (mSurfaceProvince == SURFACE_PROVINCE_LANAYRU) { + } else if (mMapEventArg1 == SURFACE_PROVINCE_LANAYRU) { p = mpSaveObjBoundingsLanayru; count = ARRAY_LENGTH(mpSaveObjBoundingsLanayru); } @@ -2836,18 +3052,351 @@ void dLytMapMain_c::initSaveObjs() { } } -void dLytMapMain_c::saveUnkMapData() { +bool dLytMapMain_c::isPointingAtMainMap() const { + bool ret = true; + dCursorHitCheck_c *d = dCsGame_c::GetInstance()->getCursorHit(); + if (d != nullptr && d->getType() == 'lyt ') { + for (int i = 0; i < MAP_MAIN_NUM_BOUNDINGS_NORMAL; i++) { + if (d == &mHitChecks[i]) { + ret = false; + break; + } + } + } + return ret; +} + +bool dLytMapMain_c::canPlaceBeacons(s32 mapMode) { + switch (mMapEvent) { + case 7: + case 8: + case 9: + case 0: + case 1: { + if (!StoryflagManager::sInstance->getFlag(STORYFLAG_IMPA_MET)) { + // Impa introduces beacons + return false; + } + break; + } + default: return false; + } + bool ret = false; + if (!doesStageForbidBeaconPlacement() && + (mapMode == dLytMapGlobal_c::MAPMODE_STAGE || mapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { + ret = true; + } + return ret; +} + +bool dLytMapMain_c::canResetPosition(s32 mapMode, bool mapUpDirection) const { + return (mMapEvent == MAP_EVENT_NONE && ((mapMode == dLytMapGlobal_c::MAPMODE_ZOOM) || + (mapMode == dLytMapGlobal_c::MAPMODE_STAGE && mapUpDirection == false))) || + (isMapEventEq1Or7Or8Or9Or11() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM); +} + +bool dLytMapMain_c::isMapIntroDone() const { + return mMapEvent == MAP_EVENT_MAP_INTRO && mEventDone; +} + +bool dLytMapMain_c::isOpen() const { + const sStateIDIf_c &stateID = *mStateMgr.getStateID(); + + return stateID == StateID_Active || stateID == StateID_ChgMapUpDirection || stateID == StateID_FloorChange || + stateID == StateID_ChgDispAreaMode_Map || stateID == StateID_ChgDispAreaMode_MapRot || + stateID == StateID_ChgDispAreaMode_WA || stateID == StateID_ChgDispAreaMode_CsrRot || + stateID == StateID_ResetPos || stateID == StateID_ResetPosWithFloorChange || + stateID == StateID_EventSwBankSmall_Step1 || stateID == StateID_EventSwBankSmall_Step2 || + stateID == StateID_EventSwBankSmall_Step3 || stateID == StateID_EventMapIntro_Step1 || + stateID == StateID_EventMapIntro_Step2 || stateID == StateID_EventMapIntro_Step3 || + stateID == StateID_EventMapIntro_Step4 || stateID == StateID_EventDungeonMapGet_Step1 || + stateID == StateID_EventDungeonMapGet_Step2 || stateID == StateID_EventDungeonMapGet_Step3 || + stateID == StateID_EventFieldMapChange_Step1 || stateID == StateID_EventFieldMapChange_Step2 || + stateID == StateID_EventFieldMapChange_Step3 || stateID == StateID_EventFieldMapChange_Step4 || + stateID == StateID_EventSignalAdd_Step1 || stateID == StateID_EventSignalAdd_Step2 || + stateID == StateID_EventSignalAdd_Step3 || stateID == StateID_EventGoddessCube_Step1 || + stateID == StateID_EventGoddessCube_Step2 || stateID == StateID_EventGoddessCube_Step3 || + stateID == StateID_EventSaveObjMsgWindow || stateID == StateID_EventSaveObjSelect || + stateID == StateID_EventSaveObjConfirmMsgWindow || stateID == StateID_EventSaveObjDecide; +} + +u8 dLytMapMain_c::getRoomAlpha(s32 roomid) const { + u8 ret = 0xFF; + + if (dStageMgr_c::GetInstance()->isAreaTypeDungeonOrBoss()) { + if (!dStage_c::GetInstance()->hasVisitedRoom(roomid)) { + ret = mMapChangeAlpha; + } + } else { + // Lake Floria interior + if (mMapEvent == 6 && dScGame_c::isCurrentStage("F102") && (roomid == 3 || roomid == 4)) { + ret = mMapChangeAlpha; + } + } + return ret; +} + +bool dLytMapMain_c::canOpen() const { + if (dStage_c::GetInstance() != nullptr) { + if (*mStateMgr.getStateID() == StateID_Invisible) { + return true; + } + } + return false; +} + +bool dLytMapMain_c::isVisible() const { + return !(*mStateMgr.getStateID() == StateID_Invisible); +} + +void dLytMapMain_c::queueMapEvent(s32 mapEvent, s32 arg1, s32 arg2) { + mNextMapEvent = mapEvent; + mMapEventArg1 = arg1; + mMapEventArg2 = arg2; +} + +void dLytMapMain_c::startMapEvent(s32 mapEvent, s32 arg1, s32 arg2) { + if (canOpen()) { + mMapEvent = mapEvent; + mMapEventArg1 = arg1; + mMapEventArg2 = arg2; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_OPEN_PAPER_NOISE); + dLytMapGlobal_c *global = getGlobal(); + global->setMapEvent(mMapEvent); + mStateMgr.changeState(StateID_RenderingWait); + } +} + +static const char *sTitle00 = "T_title_00"; +static const char *sTitleS00 = "T_titleS_00"; + +void dLytMapMain_c::setupEvent(s32 event, s32 arg1, s32 arg2) { + mRoomType = getRoomType(); + dAcPy_c *link = dAcPy_c::GetLinkM(); + if (link->checkActionFlagsCont(0x40)) { + field_0x8CAE = true; + } else { + field_0x8CAE = false; + } + + mMarkers.setLinkRot(link->getRotation()); + // TODO - mAng nonsense? + field_0x8D68 = dScGame_c::getCamera(0)->fn_8019E3B0(); + mpAllPane->SetVisible(false); + getGlobal()->setField_0x55(field_0x8CAE); + mDoCameraTransition = false; + switch (event) { + case MAP_EVENT_NONE: { + if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR && field_0x8CAE) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + mNextMapMode = mCurrentMapMode; + mMapUpDirection = false; + mDoCameraTransition = true; + } else { + if (!sSavedMapData.entries[mRoomType].isValid) { + if (MinigameManager::isInMinigameState(MinigameManager::SPIRAL_CHARGE_TUTORIAL)) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + fn_80142C80(mCurrentMapMode); + // TODO - regswap (???) + mMapUpDirection = false; + mDoCameraTransition = true; + } else { + loadMapState(); + if (mRoomType == ROOMTYPE_SKYFIELD) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mMapUpDirection = true; + } else if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mMapUpDirection = true; + } + if (mMapUpDirection == false) { + mDoCameraTransition = true; + } + } + } else { + loadMapState(); + if (mMapUpDirection == false) { + mDoCameraTransition = true; + } + } + if (link->checkActionFlags(daPlayerActBase_c::FLG0_CRAWLING)) { + mDoCameraTransition = false; + } + } + if (mRoomType == ROOMTYPE_DUNGEON) { + mDoCameraTransition = false; + } + break; + } + case MAP_EVENT_1: + case MAP_EVENT_SIGNAL_ADD: + case MAP_EVENT_GODDESS_CUBE: + case MAP_EVENT_11: { + // why does everyone clamp things differently ??? + s32 tmp = arg1; + if (arg1 > mBaseFloorOffset) { + tmp = mBaseFloorOffset; + } else if (tmp < field_0x8D64) { + tmp = field_0x8D64; + } + getGlobal()->setFloor(tmp); + switch (arg2) { + case -2: mCurrentMapMode = dLytMapGlobal_c::MAPMODE_WORLD; break; + case -1: + if (mRoomType == ROOMTYPE_SKYLOFT) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY; + } else { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + } + break; + case 0: mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; break; + case 1: mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; break; + } + mMapUpDirection = true; + mDoCameraTransition = false; + break; + } + case MAP_EVENT_MAP_INTRO: { + if (mRoomType == ROOMTYPE_SKYLOFT) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY; + } else { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + } + mMapUpDirection = true; + mDoCameraTransition = false; + break; + } + case MAP_EVENT_DUNGEON_MAP_GET: + case MAP_EVENT_FOREST_MAP_CHANGE: { + dLytMapGlobal_c *global = getGlobal(); + global->setField_0x4C(1); + global->setField_0x4F(0); + // fall-through + } + case MAP_EVENT_SW_BANK_SMALL: { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mMapUpDirection = true; + mDoCameraTransition = false; + break; + } + case MAP_EVENT_FIELD_MAP_CHANGE_5: + case MAP_EVENT_FIELD_MAP_CHANGE_8: { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mMapUpDirection = true; + mDoCameraTransition = false; + break; + } + case MAP_EVENT_SAVE_OBJ: { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mMapUpDirection = true; + mDoCameraTransition = false; + break; + } + } + + mNextMapUpDirection = mMapUpDirection; + mNextMapMode = mCurrentMapMode; + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + mDoCameraTransition = false; + } + + if (mDoCameraTransition) { + dScGame_c::getCamera(0)->doFn_80093380(); + } else { + dScGame_c::getCamera(0)->doFn_80093360(); + dScGame_c::getCamera(0)->doFn_80093340(); + } + dScGame_c::getCamera(0)->fn_8019E410(); + dLytMapMain_vt0x10(); + s32 floor = dStage_c::GetInstance()->getMapRelated()->getField_0x1EC(); + mCurrentFloor = floor; + if (event != MAP_EVENT_1 && event != MAP_EVENT_SIGNAL_ADD) { + getGlobal()->setFloor(floor); + } + mFloorBtnMgr.init(mNumFloors, mBaseFloorOffset, getGlobal()->getFloor()); + s32 mapLabelNumber = dStageMgr_c::GetInstance()->getMapNameId(); + if (mapLabelNumber >= 0) { + SizedString<16> label; + label.sprintf("MAP_%02d", mapLabelNumber); + dTextBox_c *box = mLyt.getTextBox(sTitle00); + box->setMessageWithGlobalTextProcessor2(label, nullptr); + const wchar_t *t2 = dMessage_c::getTextMessageByLabel(label, 1, nullptr, 0); + mNumTitleLines = box->calcTextLines(t2, dMessage_c::getGlobalTagProcessor()); + // instruction swap... + box = mLyt.getTextBox(sTitleS00); + box->setMessageWithGlobalTextProcessor2(label, nullptr); + } + getGlobal()->setCurrentMapMode(mCurrentMapMode); + getGlobal()->setNextMapMode(mNextMapMode); + + if (dStageMgr_c::GetInstance()->getSTIFRoomType() != dStageMgr_c::STIF_ROOMTYPE_BOSS_HOUSE && + (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE)) { + getGlobal()->setZoomFrame(0.0f); + getGlobal()->setField_0x58(1.0f); + } else { + f32 f1 = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); + f32 f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM); + getGlobal()->setZoomFrame(1.0f); + getGlobal()->setField_0x58(f2 / f1); + } + field_0x8C84 = 0; + (void)getLinkPtr(); +} + +void dLytMapMain_c::close() { + dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10; + mDoCameraTransition = false; + if (mMapEvent == MAP_EVENT_NONE) { + if (mRoomType == ROOMTYPE_FIELD || mRoomType == ROOMTYPE_SKYLOFT) { + if (!field_0x8CAE && !mMapUpDirection) { + mDoCameraTransition = true; + } + } else if (mRoomType == ROOMTYPE_DUNGEON && !field_0x8CAE && !mMapUpDirection) { + mDoCameraTransition = false; + dScGame_c::getCamera(0)->doFn_80093340(); + } + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + mDoCameraTransition = false; + } + + if (mDoCameraTransition) { + dScGame_c::getCamera(0)->doFn_80093380(); + } else { + dScGame_c::getCamera(0)->doFn_80093360(); + } + + if (mMapEvent == MAP_EVENT_NONE) { + saveMapState(); + } + + mEventDone = false; + dScGame_c::getCamera(0)->fn_8019E430(); + + dSndPlayerMgr_c::GetInstance()->leaveMap(); + mStateMgr.changeState(StateID_Out); +} + +bool dLytMapMain_c::isVisibleNoIntro() const { + return isVisible() && mMapEvent != MAP_EVENT_MAP_INTRO; +} + +void dLytMapMain_c::saveMapState() { dMapSavedDataEntry &data = sSavedMapData.entries[mRoomType]; - data.field_0x06 = 1; + data.isValid = true; data.mapMode = mCurrentMapMode; data.mapUpDirection = mMapUpDirection; data.mapUpDirectionAfterZoomToDetail = mMapUpDirectionAfterZoomToDetail; sSavedMapData.showIslandNames = mShowIslandNames; } -void dLytMapMain_c::initUnkMapData() { +void dLytMapMain_c::initMapState() { for (int i = 0; i < 6; i++) { - sSavedMapData.entries[i].field_0x06 = sDefaultMapData.entries[i].field_0x06; + sSavedMapData.entries[i].isValid = sDefaultMapData.entries[i].isValid; sSavedMapData.entries[i].mapMode = sDefaultMapData.entries[i].mapMode; sSavedMapData.entries[i].mapUpDirection = sDefaultMapData.entries[i].mapUpDirection; sSavedMapData.entries[i].mapUpDirectionAfterZoomToDetail = @@ -2856,7 +3405,7 @@ void dLytMapMain_c::initUnkMapData() { sSavedMapData.showIslandNames = sDefaultMapData.showIslandNames; } -void dLytMapMain_c::loadUnkMapData() { +void dLytMapMain_c::loadMapState() { mCurrentMapMode = sSavedMapData.entries[mRoomType].mapMode; mMapUpDirection = sSavedMapData.entries[mRoomType].mapUpDirection; mMapUpDirectionAfterZoomToDetail = sSavedMapData.entries[mRoomType].mapUpDirectionAfterZoomToDetail; @@ -3050,6 +3599,10 @@ void dLytMapMain_c::setButtonMessages( } } +bool dLytMapMain_c::canCenterCursor1(s32 mapMode) const { + return canCenterCursor(mapMode); +} + void dLytMapMain_c::setCursorType() { if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode)) { if ((mMapEvent == MAP_EVENT_SAVE_OBJ || @@ -3214,12 +3767,12 @@ static const char *sAreaPicNamesLink[] = { void dLytMapMain_c::setupFlags() { if (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE) { - field_0x8DBE = 0; + mMapChangeAlpha = 0; } else { - field_0x8DBE = -1; + mMapChangeAlpha = 0xFF; } - field_0x8D6B = 0; - field_0x8D6A = 0; + mEventDone = false; + mEventCanceled = false; mpAllPane->SetVisible(true); s32 currentRegion; @@ -3464,7 +4017,7 @@ void dLytMapMain_c::setupFlags() { } mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].bind(false); - mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].setFrame(field_0x8D54 - 1); + mAnmGroups[MAP_MAIN_ANIM_TITE_LINE].setFrame(mNumTitleLines - 1); mLyt.getLayout()->Animate(0); mLyt.calc(); @@ -3538,7 +4091,7 @@ void dLytMapMain_c::initializeState_In() { } } - if (field_0x8CAD != 0 || mMapEvent == MAP_EVENT_MAP_INTRO) { + if (mDoCameraTransition || mMapEvent == MAP_EVENT_MAP_INTRO) { mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN]; } else { mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN_NO_CAM]; @@ -3550,10 +4103,10 @@ void dLytMapMain_c::initializeState_In() { mPinIconAggregate.setScale(getGlobal()->getZoomFrame()); } void dLytMapMain_c::executeState_In() { - field_0x8DBF = 1; + mIsVisible = 1; dLytMapGlobal_c *global = getGlobal(); - if ((!field_0x8CAD || !field_0x8C84) && field_0x8CAD) { + if ((!mDoCameraTransition || !field_0x8C84) && mDoCameraTransition) { return; } @@ -3640,7 +4193,7 @@ void dLytMapMain_c::finalizeState_In() { s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { s32 ret = AREAGROUP_MAX; if (mMapEvent == MAP_EVENT_SAVE_OBJ) { - switch (mSurfaceProvince) { + switch (mMapEventArg1) { case SURFACE_PROVINCE_FARON: ret = AREAGROUP_FARON; break; case SURFACE_PROVINCE_ELDIN: ret = AREAGROUP_ELDIN; break; case SURFACE_PROVINCE_LANAYRU: ret = AREAGROUP_LANAYRU; break; @@ -3711,7 +4264,7 @@ void dLytMapMain_c::zoomIn() { mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); - if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); } else { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); @@ -3737,7 +4290,7 @@ void dLytMapMain_c::zoomIn() { mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); - if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); } else { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); @@ -3763,7 +4316,7 @@ void dLytMapMain_c::zoomIn() { mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); - if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); } else { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); @@ -3789,7 +4342,7 @@ void dLytMapMain_c::zoomIn() { mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); - if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); } else { mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); @@ -3927,7 +4480,7 @@ void dLytMapMain_c::zoomOut() { void dLytMapMain_c::initializeState_Active() {} void dLytMapMain_c::executeState_Active() { dLytMapGlobal_c *global = getGlobal(); - if (dMessage_c::getInstance()->getField_0x328()) { + if (dMessage_c::getInstance()->getInMapEvent()) { return; } @@ -3963,7 +4516,7 @@ void dLytMapMain_c::executeState_Active() { if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(dLytMapGlobal_c::MAPMODE_STAGE)) { - if (mPointerOnMap && (field_0x8D5C < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { // Can zoom in around cursor, use the cursor pos getGlobal()->unprojectFromMap(field_0x8CF4, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM); @@ -4004,9 +4557,9 @@ void dLytMapMain_c::executeState_Active() { mVec3_c pos; fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); f32 distSq = global->getMapScroll().squareDistanceToXZ(pos); - if (field_0x8D58 != global->getFloor()) { - mFloorBtnMgr.resetFloor(-(field_0x8D58 - field_0x8D60)); - global->setFloor(field_0x8D58); + if (mCurrentFloor != global->getFloor()) { + mFloorBtnMgr.resetFloor(-(mCurrentFloor - mBaseFloorOffset)); + global->setFloor(mCurrentFloor); mStateMgr.changeState(StateID_ResetPosWithFloorChange); } else if (distSq >= 1.0f) { mStateMgr.changeState(StateID_ResetPos); @@ -4038,7 +4591,7 @@ void dLytMapMain_c::initializeState_Out() { mPopupInfo.mStateMgr.changeState(StateID_Out); } dLytMeter_c::GetInstance()->setMeterField_0x13750(0); - if (field_0x8CAD || mMapEvent == MAP_EVENT_MAP_INTRO) { + if (mDoCameraTransition || mMapEvent == MAP_EVENT_MAP_INTRO) { mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT]; } else { mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM]; @@ -4056,13 +4609,13 @@ void dLytMapMain_c::initializeState_Out() { } void dLytMapMain_c::executeState_Out() { if (mpInOutAnmGroup->isEndReached()) { - bool specialMode = isSomeFieldEq0Or1Or7Or9Or11(); + bool specialMode = isMapEventEq0Or1Or7Or9Or11(); // 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(); mpInOutAnmGroup->unbind(); - field_0x8DBF = 0; + mIsVisible = 0; mStateMgr.changeState(StateID_Invisible); } } @@ -4108,8 +4661,8 @@ void dLytMapMain_c::initializeState_ChgMapUpDirection() { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_CHANGE_DIRECT); } void dLytMapMain_c::executeState_ChgMapUpDirection() { - if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x8D6A) { - fn_80140B90(); + if (mMapEvent == MAP_EVENT_MAP_INTRO && mEventCanceled) { + forceOut(); } else { dLytMapGlobal_c *global = getGlobal(); f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1B, 2.0f); @@ -4217,8 +4770,8 @@ void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() { } } void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { - if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x8D6A) { - fn_80140B90(); + if (mMapEvent == MAP_EVENT_MAP_INTRO && mEventCanceled) { + forceOut(); } else { dLytMapGlobal_c *global = getGlobal(); f32 f1 = (f32)field_0x8C70 / sHio.field_0x1B; @@ -4392,7 +4945,7 @@ void dLytMapMain_c::executeState_EventSwBankSmall_Step3() { return; } - field_0x8D6B = 1; + mEventDone = true; } void dLytMapMain_c::finalizeState_EventSwBankSmall_Step3() {} @@ -4400,8 +4953,8 @@ void dLytMapMain_c::initializeState_EventMapIntro_Step1() { mEventTimer = sHio.field_0x1F; } void dLytMapMain_c::executeState_EventMapIntro_Step1() { - if (field_0x8D6A) { - fn_80140B90(); + if (mEventCanceled) { + forceOut(); return; } @@ -4423,8 +4976,8 @@ void dLytMapMain_c::initializeState_EventMapIntro_Step2() { } } void dLytMapMain_c::executeState_EventMapIntro_Step2() { - if (field_0x8D6A) { - fn_80140B90(); + if (mEventCanceled) { + forceOut(); return; } @@ -4447,8 +5000,8 @@ void dLytMapMain_c::initializeState_EventMapIntro_Step3() { mEventTimer = 0; } void dLytMapMain_c::executeState_EventMapIntro_Step3() { - if (field_0x8D6A) { - fn_80140B90(); + if (mEventCanceled) { + forceOut(); return; } @@ -4468,21 +5021,21 @@ void dLytMapMain_c::initializeState_EventMapIntro_Step4() { mEventTimer = sHio.field_0x21; } void dLytMapMain_c::executeState_EventMapIntro_Step4() { - if (field_0x8D6A) { - fn_80140B90(); + if (mEventCanceled) { + forceOut(); return; } if (mEventTimer != 0) { mEventTimer--; } else { - field_0x8D6B = 1; + mEventDone = true; } EventManager::execute(); } void dLytMapMain_c::finalizeState_EventMapIntro_Step4() {} -void dLytMapMain_c::fn_80140B90() { +void dLytMapMain_c::forceOut() { mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false); mAnmGroups[MAP_MAIN_ANIM_OUT].setToEnd(); mLyt.calc(); @@ -4510,7 +5063,7 @@ void dLytMapMain_c::initializeState_EventDungeonMapGet_Step2() { mEventTimer = sHio.field_0x23; field_0x8CB4 = sHio.field_0x24; field_0x8CB8 = mMarkers.getField_0x0704(); - field_0x8DBE = 0; + mMapChangeAlpha = 0; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); } void dLytMapMain_c::executeState_EventDungeonMapGet_Step2() { @@ -4519,9 +5072,9 @@ void dLytMapMain_c::executeState_EventDungeonMapGet_Step2() { if (mEventTimer != 0) { mEventTimer--; } - u8 u1 = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; - global->setField_0x4F(u1); - field_0x8DBE = u1; + u8 alpha = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; + global->setField_0x4F(alpha); + mMapChangeAlpha = alpha; if (field_0x8CB4 != 0) { field_0x8CB4--; } else { @@ -4544,7 +5097,7 @@ void dLytMapMain_c::executeState_EventDungeonMapGet_Step3() { if (mEventTimer != 0) { mEventTimer--; } else { - field_0x8D6B = 1; + mEventDone = true; } } void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step3() {} @@ -4563,7 +5116,7 @@ void dLytMapMain_c::finalizeState_EventFieldMapChange_Step1() {} void dLytMapMain_c::initializeState_EventFieldMapChange_Step2() { mEventTimer = sHio.field_0x27; - field_0x8DBE = 0; + mMapChangeAlpha = 0; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); } void dLytMapMain_c::executeState_EventFieldMapChange_Step2() { @@ -4616,7 +5169,7 @@ void dLytMapMain_c::initializeState_EventForestMapChange_Step2() { field_0x8CB4 = sHio.field_0x24; field_0x8CB8 = mMarkers.getField_0x0704(); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); - field_0x8DBE = 0; + mMapChangeAlpha = 0; } void dLytMapMain_c::executeState_EventForestMapChange_Step2() { dLytMapGlobal_c *global = getGlobal(); @@ -4624,9 +5177,9 @@ void dLytMapMain_c::executeState_EventForestMapChange_Step2() { if (mEventTimer != 0) { mEventTimer--; } - u8 u1 = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; - global->setField_0x4F(u1); - field_0x8DBE = u1; + u8 alpha = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; + global->setField_0x4F(alpha); + mMapChangeAlpha = alpha; if (field_0x8CB4 != 0) { field_0x8CB4--; } else { @@ -4649,7 +5202,7 @@ void dLytMapMain_c::executeState_EventForestMapChange_Step3() { if (mEventTimer != 0) { mEventTimer--; } else { - field_0x8D6B = 1; + mEventDone = true; } } void dLytMapMain_c::finalizeState_EventForestMapChange_Step3() {} @@ -4740,7 +5293,7 @@ bool dLytMapMain_c::checkStoryflag(s32 flag) const { } void dLytMapMain_c::initializeState_EventSaveObjMsgWindow() { - if (mSurfaceProvince == SURFACE_PROVINCE_FARON && checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && + if (mMapEventArg1 == SURFACE_PROVINCE_FARON && checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { // "A report, Master. An unusual phenomenon is taking place in Faron Woods, making it impossible to descend // directly into them at the moment." @@ -4822,7 +5375,7 @@ void dLytMapMain_c::displaySaveObjs() { s32 numFlags = ARRAY_LENGTH(sSaveObjFlagsFaron); nw4r::lyt::Bounding **pBoundings = mpSaveObjBoundingsFaron; const dLytMapSaveObjFlagDefinition *flagSet = sSaveObjFlagsFaron; - switch (mSurfaceProvince) { + switch (mMapEventArg1) { case SURFACE_PROVINCE_ELDIN: { pBoundings = mpSaveObjBoundingsEldin; flagSet = sSaveObjFlagsEldin; @@ -4840,7 +5393,7 @@ void dLytMapMain_c::displaySaveObjs() { bool isInFaronSothMode = false; bool isInFaronFloodedMode = false; - if (mSurfaceProvince == SURFACE_PROVINCE_FARON) { + if (mMapEventArg1 == SURFACE_PROVINCE_FARON) { if (checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { isInFaronSothMode = true; @@ -4918,7 +5471,7 @@ void dLytMapMain_c::executeState_EventSaveObjSelect() { } if (found) { - const dMapSaveObjDefinition *def = getSaveObjDefinition(mSurfaceProvince, statueIdx); + const dMapSaveObjDefinition *def = getSaveObjDefinition(mMapEventArg1, statueIdx); mSaveCaption.setLabel(def->statueLabel); mSaveCaption.setType(def->type); mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_In); @@ -5020,7 +5573,7 @@ void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() { } } - const dMapSaveObjDefinition *def = getSaveObjDefinition(mSurfaceProvince, statueIdx); + const dMapSaveObjDefinition *def = getSaveObjDefinition(mMapEventArg1, statueIdx); dScGame_c::GetInstance()->triggerEntrance( def->stageName, def->room, def->layer, def->entrance, SpawnInfo::RETAIN_TOD, SpawnInfo::RETAIN_TRIAL, dFader_c::FADER_GREY diff --git a/src/d/lyt/d_lyt_map_global.cpp b/src/d/lyt/d_lyt_map_global.cpp index f09cd68e..405f9d15 100644 --- a/src/d/lyt/d_lyt_map_global.cpp +++ b/src/d/lyt/d_lyt_map_global.cpp @@ -18,7 +18,7 @@ dLytMapGlobal_c::dLytMapGlobal_c() field_0x4D(0), mAlpha(0), field_0x4F(0), - field_0x50(0) { + mMapEvent(0) { sInstance = this; } diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index 8029e73d..b3b2a335 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -19,6 +19,7 @@ #include "d/flag/dungeonflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_map.h" #include "d/lyt/d_lyt_map_global.h" #include "d/lyt/d_window.h" #include "d/snd/d_snd_small_effect_mgr.h" @@ -857,7 +858,8 @@ bool dLytMapIcon01_c::execute() { } } - if (dLytMapGlobal_c::GetInstance()->getField_0x4D() && dLytMapGlobal_c::GetInstance()->getField_0x50() != 10) { + if (dLytMapGlobal_c::GetInstance()->getField_0x4D() && + dLytMapGlobal_c::GetInstance()->getMapEvent() != dLytMapMain_c::MAP_EVENT_SAVE_OBJ) { checkBoundingPointing(); } @@ -1587,7 +1589,7 @@ void dLytMapIcon01_c::setupLinkDrawCommand() { if (dAcPy_c::GetLinkM() != nullptr) { setupLinkDrawCommand1(dAcPy_c::GetLinkM()); - if (dLytMapGlobal_c::GetInstance()->getField_0x50() != 3) { + if (dLytMapGlobal_c::GetInstance()->getMapEvent() != dLytMapMain_c::MAP_EVENT_MAP_INTRO) { setupLinkDrawCommand2(); } } @@ -1862,7 +1864,7 @@ void dLytMapMarkers_c::drawPopups() { mVec2_c textPos = mPopups[i].textPos; mVec2_c pos = boundingPos + textPos + field_0x06F4; pos.x += width / 2.0f; - + mMapPopup.setPosition(pos); mMapPopup.setInout(mPopups[i].inAnimFrame); diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp index f66b5021..abfcb738 100644 --- a/src/d/lyt/meter/d_lyt_meter.cpp +++ b/src/d/lyt/meter/d_lyt_meter.cpp @@ -996,7 +996,7 @@ bool dLytMeterMain_c::remove() { void dLytMeterMain_c::fn_800D5290() { dLytMeter_c *meter = dLytMeter_c::GetInstance(); - if (dLytMap_c::GetInstance() != nullptr && !dLytMap_c::GetInstance()->isSomeMapFieldEq2Or4Or5Or6()) { + if (dLytMap_c::GetInstance() != nullptr && !dLytMap_c::GetInstance()->isMapEventEq2Or4Or5Or6()) { meter->setFlags(METER_BTN_PLUS); } @@ -1008,7 +1008,7 @@ void dLytMeterMain_c::fn_800D5290() { } bool dLytMeterMain_c::fn_800D5350() { - if (mBasicPosition == POSITION_MAP && dMessage_c::getInstance()->getField_0x328()) { + if (mBasicPosition == POSITION_MAP && dMessage_c::getInstance()->getInMapEvent()) { return true; } return false; @@ -1093,7 +1093,7 @@ bool dLytMeterMain_c::fn_800D56B0() { return true; } - if (dLytMap_c::GetInstance() != nullptr && !dLytMap_c::GetInstance()->getFn_80139EA0()) { + if (dLytMap_c::GetInstance() != nullptr && !dLytMap_c::GetInstance()->isVisibleNoIntro()) { return true; } 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 4e08a12a..5f22b420 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window.cpp @@ -551,7 +551,7 @@ void dLytMsgWindow_c::finalizeState_WaitKeySelectQuestion() {} void dLytMsgWindow_c::initializeState_MapOpen() {} void dLytMsgWindow_c::executeState_MapOpen() { - if ((dLytMap_c::GetInstance() != nullptr && dLytMap_c::GetInstance()->isOpenMaybe()) || + if ((dLytMap_c::GetInstance() != nullptr && dLytMap_c::GetInstance()->isOpen()) || !dLytControlGame_c::getInstance()->isInSomeMapState()) { dMessage_c::getInstance()->setField_0x329(0); mStateMgr.changeState(StateID_Invisible); From e4098b04fdc624ea66e222a3ef146c0321efa99c Mon Sep 17 00:00:00 2001 From: robojumper Date: Wed, 12 Nov 2025 22:38:05 +0100 Subject: [PATCH 19/20] Small cleanup --- config/SOUE01/symbols.txt | 24 ++-- include/d/d_stage_mgr.h | 4 +- include/d/flag/storyflag_map.h | 2 +- include/d/lyt/d_lyt_map.h | 104 +++++++++++------- src/d/lyt/d_lyt_map.cpp | 195 +++++++++++++++++++++++++++++++-- 5 files changed, 268 insertions(+), 61 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 2c008acb..be3722f1 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -7987,7 +7987,7 @@ initializeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142730; // typ executeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142740; // type:function size:0x4 finalizeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142750; // type:function size:0x4 checkCursorPointedAtMap__13dLytMapMain_cFv = .text:0x80142760; // type:function size:0x190 -fn_801428F0 = .text:0x801428F0; // type:function size:0xB4 +dLytMapMain_vt0x10__13dLytMapMain_cFv = .text:0x801428F0; // type:function size:0xB4 fn_801429B0 = .text:0x801429B0; // type:function size:0x1D8 fn_80142B90 = .text:0x80142B90; // type:function size:0xEC fn_80142C80__13dLytMapMain_cFl = .text:0x80142C80; // type:function size:0x8C @@ -8001,10 +8001,10 @@ fn_80143300__13dLytMapMain_cFv = .text:0x80143300; // type:function size:0x54 fn_80143360__13dLytMapMain_cFv = .text:0x80143360; // type:function size:0x1D4 checkScroll__13dLytMapMain_cFv = .text:0x80143540; // type:function size:0x374 build__9dLytMap_cFv = .text:0x801438C0; // type:function size:0x6C -fn_80143930 = .text:0x80143930; // type:function size:0x60 -fn_80143990 = .text:0x80143990; // type:function size:0x4C -fn_801439E0 = .text:0x801439E0; // type:function size:0x4C -fn_80143A30__9dLytMap_cFv = .text:0x80143A30; // type:function size:0x70 +remove__9dLytMap_cFv = .text:0x80143930; // type:function size:0x60 +execute__9dLytMap_cFv = .text:0x80143990; // type:function size:0x4C +draw__9dLytMap_cFv = .text:0x801439E0; // type:function size:0x4C +fadeOut__9dLytMap_cFv = .text:0x80143A30; // type:function size:0x70 getName__20dLytMapFloorBtnMgr_cCFv = .text:0x80143AA0; // type:function size:0x8 getLyt__20dLytMapFloorBtnMgr_cFv = .text:0x80143AB0; // type:function size:0x8 getPane__20dLytMapFloorBtnMgr_cFv = .text:0x80143AC0; // type:function size:0x8 @@ -33852,7 +33852,7 @@ __vt__57sFStateMgr_c<18dLytMapPopupInfo_c,20sStateMethodUsr_FI_c> = .data:0x8052 __vt__87sStateMgr_c<18dLytMapPopupInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80520848; // type:object size:0x30 __vt__34sFStateFct_c<18dLytMapPopupInfo_c> = .data:0x80520878; // type:object size:0x14 __vt__31sFState_c<18dLytMapPopupInfo_c> = .data:0x80520890; // type:object size:0x18 -lbl_805208A8 = .data:0x805208A8; // type:object size:0x10 +__vt__14dLytMapFader_c = .data:0x805208A8; // type:object size:0x10 __vt__20dLytMapFloorBtnMgr_c = .data:0x805208B8; // type:object size:0x38 __vt__59sFStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c> = .data:0x805208F0; // type:object size:0x30 __vt__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80520920; // type:object size:0x30 @@ -33872,9 +33872,9 @@ __vt__55sFStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c> = .data:0x80520A __vt__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80520AF0; // type:object size:0x30 __vt__32sFStateFct_c<16dLytMapPinIcon_c> = .data:0x80520B20; // type:object size:0x14 __vt__29sFState_c<16dLytMapPinIcon_c> = .data:0x80520B38; // type:object size:0x18 -lbl_80520B50 = .data:0x80520B50; // type:object size:0xC -lbl_80520B5C = .data:0x80520B5C; // type:object size:0xC -lbl_80520B68 = .data:0x80520B68; // type:object size:0xC +__vt__16dLytMapPutIcon_c = .data:0x80520B50; // type:object size:0xC +__vt__16LytMap0x80520B5C = .data:0x80520B5C; // type:object size:0xC +__vt__19dLytMapFootPrints_c = .data:0x80520B68; // type:object size:0xC __vt__14dLytMapPlace_c = .data:0x80520B74; // type:object size:0xC __vt__14dLytMapPopup_c = .data:0x80520B80; // type:object size:0xC __vt__16dLytMapCapture_c = .data:0x80520B8C; // type:object size:0xC @@ -35094,7 +35094,9 @@ lbl_80529098 = .data:0x80529098; // type:object size:0xC lbl_805290A4 = .data:0x805290A4; // type:object size:0x18 lbl_805290BC = .data:0x805290BC; // type:object size:0xC lbl_805290C8 = .data:0x805290C8; // type:object size:0xC -lbl_805290D4 = .data:0x805290D4; // type:object size:0x2C +lbl_805290D4 = .data:0x805290D4; // type:object size:0xB data:string +lbl_805290E0 = .data:0x805290E0; // type:object size:0xC +lbl_805290EC = .data:0x805290EC; // type:object size:0x12 data:string lbl_80529100 = .data:0x80529100; // type:object size:0xC lbl_8052910C = .data:0x8052910C; // type:object size:0x14 lbl_80529120 = .data:0x80529120; // type:object size:0x20 data:string @@ -40133,7 +40135,7 @@ lbl_80572828 = .sdata:0x80572828; // type:object size:0x8 lbl_80572830 = .sdata:0x80572830; // type:object size:0x8 lbl_80572838 = .sdata:0x80572838; // type:object size:0x8 lbl_80572840 = .sdata:0x80572840; // type:object size:0x8 -lbl_80572848 = .sdata:0x80572848; // type:object size:0x8 +lbl_80572848 = .sdata:0x80572848; // type:object size:0x6 data:string lbl_80572850 = .sdata:0x80572850; // type:object size:0x4 lbl_80572854 = .sdata:0x80572854; // type:object size:0x7 data:string lbl_8057285C = .sdata:0x8057285C; // type:object size:0x7 data:string diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index 65534302..68d47f3f 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -71,8 +71,8 @@ public: STIF_AREA_VOLCANO_NORTH = 6, STIF_AREA_LANAYRU_MINE = 7, STIF_AREA_LANAYRU_DESERT = 8, - STIF_AREA_LANAYRU_SAND_SEA = 9, - STIF_AREA_LANAYRU_CAVES = 10, + STIF_AREA_LANAYRU_CAVES = 9, + STIF_AREA_LANAYRU_SAND_SEA = 10, STIF_AREA_LANAYRU_GORGE = 11, }; diff --git a/include/d/flag/storyflag_map.h b/include/d/flag/storyflag_map.h index b7d58a31..5ebbc965 100644 --- a/include/d/flag/storyflag_map.h +++ b/include/d/flag/storyflag_map.h @@ -1155,7 +1155,7 @@ enum StoryFlags_e { /** [First Goddess Cube (Unlocks ability to skyward strike Goddess Cubes)] * Story Flag #227 (0x00E3) - JP 805ACD72 0x20 / US 805A9AF2 0x20 */ - STORYFLAG_227, + STORYFLAG_FIRST_GODDESS_CUBE, /** [Goddess Cube near Skyview Entrance] * Story Flag #228 (0x00E4) - JP 805ACD72 0x40 / US 805A9AF2 0x40 diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index f3c938ff..fedd5d13 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -11,6 +11,7 @@ #include "d/lyt/d_textbox.h" #include "d/lyt/d_window.h" #include "egg/core/eggColorFader.h" +#include "egg/core/eggFader.h" #include "m/m2d.h" #include "m/m_angle.h" #include "m/m_vec.h" @@ -140,6 +141,31 @@ struct LytMap0x80520B5C { bool field_0x05; }; + +/** 2D UI - Map - beacon preview icon following the cursor */ +class dLytMapPutIcon_c { +public: + dLytMapPutIcon_c() : mVisible(false), field_0x98(0.0f, 0.0f) {} + virtual ~dLytMapPutIcon_c() {} + + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void setPosition(const mVec2_c &pos); + void setScale(f32 scale); + + void setVisible(bool visible) { + mVisible = visible; + } + +private: + /* 0x04 */ d2d::LytBase_c mLyt; + /* 0x94 */ bool mVisible; + /* 0x98 */ mVec2_c field_0x98; +}; + struct dLytMapFloorBtnAnmGroups { /* 0x00 */ d2d::AnmGroup_c mLoop; /* 0x40 */ d2d::AnmGroup_c mOnOff; @@ -367,6 +393,35 @@ private: /* 0x712 */ bool mForceNoNav; }; +// Made up name +class dLytMapFader_c : public m2d::Base_c { +public: + dLytMapFader_c(); + virtual ~dLytMapFader_c(); + /* vt 0x0C */ virtual void draw() override; + + void calc(); + + bool isVisible() const { + return mIsVisible; + } + + void setVisible(bool v) { + mIsVisible = v; + } + + void fadeOut() { + mFader.setStatus(EGG::Fader::STATUS_PREPARE_OUT); + mFader.setFrame(15); + mFader.fadeOut(); + } + +public: + /* 0x10 */ EGG::ColorFader mFader; + /* 0x34 */ u8 _0x34[0x38 - 0x34]; + /* 0x38 */ bool mIsVisible; +}; + // Size 0x4C class dLytMapPopupInfo_c { friend class dLytMapMain_c; @@ -475,6 +530,7 @@ class dLytMapSaveObj_c { public: dLytMapSaveObj_c() : mStateMgr(*this, sStateID::null), mSelectRequest(false), mDecideRequest(false), mDecideFinished(false) {} + ~dLytMapSaveObj_c() {} STATE_FUNC_DECLARE(dLytMapSaveObj_c, Wait); STATE_FUNC_DECLARE(dLytMapSaveObj_c, ToSelect); @@ -500,30 +556,6 @@ private: /* 0x18E */ bool mDecideFinished; }; -/** 2D UI - Map - beacon preview icon following the cursor */ -class dLytMapPutIcon_c { -public: - dLytMapPutIcon_c() : mVisible(false), field_0x98(0.0f, 0.0f) {} - virtual ~dLytMapPutIcon_c() {} - - void build(d2d::ResAccIf_c *resAcc); - void remove(); - void execute(); - void draw(); - - void setPosition(const mVec2_c &pos); - void setScale(f32 scale); - - void setVisible(bool visible) { - mVisible = visible; - } - -private: - /* 0x04 */ d2d::LytBase_c mLyt; - /* 0x94 */ bool mVisible; - /* 0x98 */ mVec2_c field_0x98; -}; - class dLytMapMain_c : public m2d::Base_c { friend class dLytMap_c; @@ -819,7 +851,7 @@ private: /* 0x8D00 */ mVec3_c mMapScroll; /* 0x8D0C */ mVec3_c mPlayerPos; /* 0x8D18 */ mVec3_c field_0x8D18; - /* 0x8D24 */ mVec3_c field_0x8D24; + /* 0x8D24 */ mVec3_c mGoddessChestWorldPosition; /* 0x8D30 */ mVec2_c field_0x8D30; /* 0x8D38 */ mVec2_c field_0x8D38; /* 0x8D40 */ f32 field_0x8D40; @@ -860,19 +892,6 @@ private: /* 0x8DC8 */ dLytMapGlobal_c mGlobal; }; -// Made up name -class dLytMapFader_c : public m2d::Base_c { -public: - dLytMapFader_c(); - virtual ~dLytMapFader_c(); - /* vt 0x0C */ virtual void draw() override; - - void calc(); - -private: - /* 0x10 */ EGG::ColorFader mFader; -}; - // Size 0x91FC, inline ctor at 802ccd88 class dLytMap_c { public: @@ -903,7 +922,10 @@ public: return mMapMain.isVisibleNoIntro(); } - void build(); + bool build(); + bool remove(); + bool execute(); + bool draw(); bool isMapEventEq2Or4Or5Or6() const { return mMapMain.mMapEvent == dLytMapMain_c::MAP_EVENT_SW_BANK_SMALL || @@ -924,11 +946,13 @@ public: return mMapMain.getSaveObjDefinition(mMapMain.mMapEventArg1, statueIdx); } - void fn_80143A30(); + void fadeOut(); private: /* 0x0004 */ d2d::ResAccIf_c mResAcc; /* 0x0374 */ dLytMapMain_c mMapMain; + /* 0x91A4 */ u8 _0x91A4[0x91C0 - 0x91A4]; + /* 0x91C0 */ dLytMapFader_c mMapFader; static dLytMap_c *sInstance; }; diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index 91e459d5..ba3a0aff 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -1,8 +1,11 @@ +// clang-format off +// vtable order +#define NEED_DIRECT_FRAMECTRL_ACCESS + #include "c/c_math.h" #include "d/d_player_act.h" #include "d/snd/d_snd_player_mgr.h" #include "toBeSorted/minigame_mgr.h" -#define NEED_DIRECT_FRAMECTRL_ACCESS #include "c/c_lib.h" #include "common.h" #include "d/a/d_a_player.h" @@ -50,6 +53,8 @@ #include "toBeSorted/d_beacon.h" #include "toBeSorted/event_manager.h" +// clang-format on + struct dLytMap_HIO_c { dLytMap_HIO_c(); virtual ~dLytMap_HIO_c(); @@ -1944,7 +1949,7 @@ dLytMapMain_c::dLytMapMain_c() mShowIslandNames(false), field_0x8DBD(0), mMapChangeAlpha(0), - mIsVisible(true), + mIsVisible(false), field_0x8DC0(-1), field_0x8DC4(0) { field_0x8D78 = 0.0f; @@ -3719,6 +3724,9 @@ static const s32 sFlagsRenameMe[] = { STORYFLAG_THUNDERHEAD_ENTERED }; +extern const s32 unkPadding[]; +const s32 unkPadding[14] = {0}; + // Not sure what the second number means static const s32 sFlags2RenameMe[][2] = { { STORYFLAG_FARON_DISCOVERED, 5}, @@ -5278,8 +5286,148 @@ void dLytMapMain_c::finalizeState_EventGoddessCube_Step1() { mEventTimer = 50; } -void dLytMapMain_c::initializeState_EventGoddessCube_Step2() {} -void dLytMapMain_c::executeState_EventGoddessCube_Step2() {} +void dLytMapMain_c::initializeState_EventGoddessCube_Step2() { + dAcTbox_c *box = findGoddessChestForStoryflag(STORYFLAG_FIRST_GODDESS_CUBE); + mGoddessChestWorldPosition = box->getPosition(); + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dLytMapGlobal_c *global = getGlobal(); + mMapScroll = global->getMapScroll(); + field_0x8D50 = global->getField_0x44(); + field_0x8D44 = global->getMapRotation(); + field_0x8D4C = fn_80142D90(mNextMapMode); + fn_80142D10(mNextMapMode, mNextMapUpDirection, field_0x8D46); + mVec3_c center = mGoddessChestWorldPosition; + mVec2_c result(0.0f, 0.0f); + global->unprojectFromMap(mMapScroll, result, field_0x8D44); + global->setMapRotationCenter(center); + + mVec3_c offset(field_0x8CD0.x * 0.5f, 0.0f, field_0x8CD0.z * 0.5f); + offset.rotY(-global->getField_0x56()); + if (offset.x < 0.0f) { + offset.x = -offset.x; + } + if (offset.z < 0.0f) { + offset.z = -offset.z; + } + + mVec3_c diff1(field_0x8CC4.x - offset.x, 0.0f, field_0x8CC4.z - offset.z); + mVec3_c diff2(field_0x8CC4.x + offset.x, 0.0f, field_0x8CC4.z + offset.z); + + if (mPlayerPos.x < diff1.x) { + mPlayerPos.x = diff1.x; + } + if (mPlayerPos.z < diff1.z) { + mPlayerPos.z = diff1.z; + } + if (mPlayerPos.x > diff2.x) { + mPlayerPos.x = diff2.x; + } + if (mPlayerPos.z > diff2.z) { + mPlayerPos.z = diff2.z; + } + const mVec3_c &c = global->getMapRotationCenter(); + fn_80143060(mPlayerPos, center, c, field_0x8D46); + mVec3_c tmp = mMapScroll; + fn_80143060(mMapScroll, tmp, c, field_0x8D44); + fn_80143060(field_0x8D18, center, global->getPlayerPos(), field_0x8D46); + + global->setMapScroll(mMapScroll); + const mVec2_c &csPos = dCsGame_c::GetInstance()->getCursorIf()->getCursorPos(); + global->unprojectFromMap(field_0x8CF4, csPos); + fn_8013FB70(field_0x8CF4, field_0x8D50 / field_0x8D4C); + mpScaleFramePane->SetVisible(true); + field_0x8C70 = 0; + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + global->setZoomFrame(1.0f); + global->setField_0x58(field_0x8D50 / field_0x8D4C); + } else { + global->setZoomFrame(0.0f); + global->setField_0x58(1.0f); + } + mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false); + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } + + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mMarkers.setIslandNamesOn(false); + } + + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mMarkers.setIslandNamesOn(mShowIslandNames); + } + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); +} +void dLytMapMain_c::executeState_EventGoddessCube_Step2() { + dLytMapGlobal_c *global = getGlobal(); + f32 f1 = (f32)field_0x8C70 / sHio.field_0x1C; + f32 factor = cLib::easeInOut(f1, 2.0f); + + f32 f2, f3; + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + f32 ratio = field_0x8D50 / field_0x8D4C; + f1 = 1.0f - f1; + f2 = ratio + (1.0f - ratio) * factor; + f3 = 1.0f - factor; + } else { + f32 ratio = field_0x8D4C / field_0x8D50; + f2 = ratio + (1.0f - ratio) * (1.0f - factor); + f3 = factor; + } + global->setZoomFrame(f1); + global->setField_0x58(f2); + + // unused + mVec3_c tmp = mMapScroll; + // unused + mVec3_c tmp2 = mPlayerPos; + + // Lerps + f32 f4 = field_0x8D50 + factor * (field_0x8D4C - field_0x8D50); + global->setField_0x44(f4); + + + // TODO stack and reg swaps + global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); + + f32 length = mAnmGroups[MAP_MAIN_ANIM_ROTATE].getLastFrame(); + + // unused - the f1 store is here so that the fcmpu isn't optimized away + if (field_0x8C7C - field_0x8C80) { + f1 = 0.0f; + } + + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(length - f3 * length); + + global->setMapScroll(mPlayerPos + (mMapScroll - mPlayerPos) * (1.0f / (f4 / field_0x8D50)) * (1.0f - factor)); + + fn_8013FB70(field_0x8CF4, f4 / field_0x8D4C); + + mpScaleFramePane->SetVisible(true); + if (field_0x8C70 >= sHio.field_0x1C) { + mpScaleFramePane->SetVisible(false); + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind(); + mMapUpDirection = mNextMapUpDirection; + global->setMapRotation(field_0x8D46); + global->setField_0x44(field_0x8D4C); + global->setMapScroll(field_0x8D18); + if (dAcPy_c::LINK != nullptr) { + global->setMapRotationCenter(global->getPlayerPos()); + } + mCurrentMapMode = mNextMapMode; + mStateMgr.changeState(StateID_EventGoddessCube_Step3); + } else { + field_0x8C70++; + } +} void dLytMapMain_c::finalizeState_EventGoddessCube_Step2() {} void dLytMapMain_c::initializeState_EventGoddessCube_Step3() {} @@ -5579,7 +5727,7 @@ void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() { dFader_c::FADER_GREY ); dScGame_c::GetInstance()->setTargetingScreenPrio(0x8B); - dLytMap_c::GetInstance()->fn_80143A30(); + dLytMap_c::GetInstance()->fadeOut(); mStateMgr.changeState(StateID_EventSaveObjDecide); mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out); } else { @@ -5636,12 +5784,45 @@ void dLytMapMain_c::checkCursorPointedAtMap() { mPointerCanPlaceBeacon = canPlaceBeacon; } -void dLytMap_c::build() { +dLytMap_c *dLytMap_c::sInstance; + +bool dLytMap_c::build() { d2d::setLytAllocator(); void *data = LayoutArcManager::GetInstance()->getLoadedData("Map2D"); mResAcc.attach(data, ""); mMapMain.build(); m2d::setLytAllocator(); mMapMain.setPriority(0x86); - // TODO there's another thing here at 0x91C0 + mMapFader.setPriority(0x8A); + return true; +} + +bool dLytMap_c::remove() { + d2d::setLytAllocator(); + mMapMain.remove(); + mResAcc.detach(); + dCsGame_c::GetInstance()->setPriorityDraw(0x88); + dScGame_c::GetInstance()->setTargetingScreenPrio(0x85); + return true; +} + +bool dLytMap_c::execute() { + mMapMain.execute(); + if (mMapFader.isVisible()) { + mMapFader.calc(); + } + return true; +} + +bool dLytMap_c::draw() { + mMapMain.addToDrawList(); + if (mMapFader.isVisible()) { + mMapFader.addToDrawList(); + } + return true; +} + +void dLytMap_c::fadeOut() { + mMapFader.setVisible(true); + mMapFader.fadeOut(); } From 9cae4869105d4b891f4d483f9bddd146e93eb989 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Fri, 14 Nov 2025 00:18:43 -0500 Subject: [PATCH 20/20] Minor Fixups and SetVisible Fixed --- configure.py | 6 +- include/nw4r/lyt/lyt_types.h | 10 +++- src/d/lyt/d_lyt_map.cpp | 17 +++--- src/d/lyt/d_lyt_map_markers.cpp | 57 ++++++++----------- src/d/lyt/msg_window/d_lyt_msg_window_get.cpp | 24 ++------ .../lyt/msg_window/d_lyt_msg_window_link.cpp | 32 ++++------- .../lyt/msg_window/d_lyt_msg_window_talk.cpp | 22 +++---- 7 files changed, 68 insertions(+), 100 deletions(-) diff --git a/configure.py b/configure.py index 8aca9664..46e81efc 100644 --- a/configure.py +++ b/configure.py @@ -525,9 +525,9 @@ config.libs = [ Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window.cpp"), Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp"), Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_common.cpp"), - Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window_talk.cpp"), - Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window_link.cpp"), - Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window_get.cpp"), + Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_talk.cpp"), + Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_link.cpp"), + Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_get.cpp"), Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_sword.cpp"), Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_wood.cpp"), Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_stone.cpp"), diff --git a/include/nw4r/lyt/lyt_types.h b/include/nw4r/lyt/lyt_types.h index 73eea22f..707062f3 100644 --- a/include/nw4r/lyt/lyt_types.h +++ b/include/nw4r/lyt/lyt_types.h @@ -1,9 +1,11 @@ #ifndef NW4R_LYT_TYPES_H #define NW4R_LYT_TYPES_H -#include "nw4r/math.h" // IWYU pragma: export #include "nw4r/ut/ut_LinkList.h" #include "nw4r/ut/ut_algorithm.h" + +#include "nw4r/math.h" // IWYU pragma: export + #include "rvl/GX.h" // IWYU pragma: export namespace nw4r { @@ -31,8 +33,10 @@ inline bool TestBit(T bits, int index) { } template inline void SetBit(T *bits, int pos, bool val) { - T mask = ~T(1 << pos); - *bits = T((*bits & mask)) | (val << pos); + T mask = 1 << pos; + + *bits &= ~mask; + *bits |= val ? mask : 0; } template diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index ba3a0aff..ef795225 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -675,7 +675,7 @@ bool dLytMapPinIcon_c::draw() { void dLytMapPinIconAggregate_c::initializeState_Wait() {} void dLytMapPinIconAggregate_c::executeState_Wait() { - for (int i = 0; i < 5; i++) { + for (int i = 0; i < (int)ARRAY_LENGTH(mPins); i++) { if (mPins[i].isSelect()) { mStateMgr.changeState(StateID_Select); } @@ -686,7 +686,7 @@ void dLytMapPinIconAggregate_c::finalizeState_Wait() {} void dLytMapPinIconAggregate_c::initializeState_Select() {} void dLytMapPinIconAggregate_c::executeState_Select() { bool anyRemove = false; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < (int)ARRAY_LENGTH(mPins); i++) { if (mPins[i].isRemove()) { mStateMgr.changeState(StateID_Remove); anyRemove = true; @@ -697,7 +697,7 @@ void dLytMapPinIconAggregate_c::executeState_Select() { if (!anyRemove) { bool allSelect = true; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < (int)ARRAY_LENGTH(mPins); i++) { if (mPins[i].isSelect()) { allSelect = false; break; @@ -4552,12 +4552,12 @@ void dLytMapMain_c::executeState_Active() { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_SET); } } else if ((dPad::getDownTrigLeft() && canZoomOut(mCurrentMapMode)) || - (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && canZoomOut(mCurrentMapMode) - )) { + (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && + canZoomOut(mCurrentMapMode))) { zoomOut(); } else if ((dPad::getDownTrigRight() && canZoomIn(mCurrentMapMode)) || - (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && canZoomIn(mCurrentMapMode) - )) { + (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + canZoomIn(mCurrentMapMode))) { zoomIn(); } else if ((mRoomType == ROOMTYPE_FIELD || mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_SKYLOFT || mRoomType == ROOMTYPE_SKYFIELD) && @@ -5388,7 +5388,6 @@ void dLytMapMain_c::executeState_EventGoddessCube_Step2() { f32 f4 = field_0x8D50 + factor * (field_0x8D4C - field_0x8D50); global->setField_0x44(f4); - // TODO stack and reg swaps global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); @@ -5398,7 +5397,7 @@ void dLytMapMain_c::executeState_EventGoddessCube_Step2() { if (field_0x8C7C - field_0x8C80) { f1 = 0.0f; } - + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(length - f3 * length); global->setMapScroll(mPlayerPos + (mMapScroll - mPlayerPos) * (1.0f / (f4 / field_0x8D50)) * (1.0f - factor)); diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp index b3b2a335..07b48e47 100644 --- a/src/d/lyt/d_lyt_map_markers.cpp +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -140,11 +140,7 @@ bool dLytMapPopup_c::execute() { void dLytMapPopup_c::draw() { u8 alpha = dLytMapGlobal_c::GetInstance()->getAlpha(); mpPanes[MAP_POPUP_PANE_ALL]->SetAlpha(alpha); - mVec3_c pos; - pos.x = mPosition.x; - pos.y = mPosition.y; - pos.z = 0.0f; - mpPanes[MAP_POPUP_PANE_ALL]->SetTranslate(pos); + mpPanes[MAP_POPUP_PANE_ALL]->SetTranslate(vec2ToVec3XY(mPosition)); mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); mpPanes[MAP_POPUP_PANE_ALL]->CalculateMtx(mLyt.getDrawInfo()); mpPanes[MAP_POPUP_PANE_ALL]->Draw(mLyt.getDrawInfo()); @@ -787,7 +783,7 @@ bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) { loadFlags(); for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { - mIconAnims[i].cmdIndex = 100; + mIconAnims[i].cmdIndex = ARRAY_LENGTH(mCommands); mIconAnims[i].frame = 0.0f; mIconAnims[i].animIn = false; mIconAnims[i].animOut = false; @@ -930,17 +926,17 @@ void dLytMapIcon01_c::draw() { break; } case MAP_ICON_01_PANE_AREALIGHT_00: { - if (field_0x0D48 != 100 && field_0x0D48 == cmd) { + if (field_0x0D48 != ARRAY_LENGTH(mCommands) && field_0x0D48 == cmd) { setAreaLight(0, pane); - } else if (field_0x0D49 != 100 && field_0x0D49 == cmd) { + } else if (field_0x0D49 != ARRAY_LENGTH(mCommands) && field_0x0D49 == cmd) { setAreaLight(1, pane); - } else if (field_0x0D4A != 100 && field_0x0D4A == cmd) { + } else if (field_0x0D4A != ARRAY_LENGTH(mCommands) && field_0x0D4A == cmd) { setAreaLight(2, pane); } break; } case MAP_ICON_01_PANE_SAVEICON_00: { - if (field_0x0D4B[cmd] != 100) { + if (field_0x0D4B[cmd] != ARRAY_LENGTH(mCommands)) { setSaveObj(field_0x0D4B[cmd], pane); } break; @@ -1042,7 +1038,8 @@ void dLytMapIcon01_c::draw() { for (int i = 0; i < field_0x0E13; i++) { if (mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) { v2 = mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].boundingPos; - mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(vec2ToVec3XY(v2 + field_0x0D40) + mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate( + vec2ToVec3XY(v2 + field_0x0D40) ); mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo()); mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo()); @@ -1060,7 +1057,7 @@ void dLytMapIcon01_c::resetDrawCommands() { mCommands[i].rotation.setF(0.0f); mCommands[i].paneIdx = MAP_ICON_01_NUM_PANES; mCommands[i].passIdx = 35; - field_0x0D4B[i] = 100; + field_0x0D4B[i] = ARRAY_LENGTH(mCommands); field_0x0C85[i] = 0; } @@ -1073,7 +1070,7 @@ void dLytMapIcon01_c::resetDrawCommands() { mNumCommands = 0; for (int i = 0; i < (int)ARRAY_LENGTH(mPopupConfigs); i++) { - mPopupConfigs[i].cmdIdx = 100; + mPopupConfigs[i].cmdIdx = ARRAY_LENGTH(mCommands); mPopupConfigs[i].boundingPos.set(0.0f, 0.0f); mPopupConfigs[i].textPos.set(0.0f, 0.0f); mPopupConfigs[i].pointedAt = false; @@ -1087,9 +1084,9 @@ void dLytMapIcon01_c::resetDrawCommands() { fn_80181C40(); - field_0x0D48 = 100; - field_0x0D49 = 100; - field_0x0D4A = 100; + field_0x0D48 = ARRAY_LENGTH(mCommands); + field_0x0D49 = ARRAY_LENGTH(mCommands); + field_0x0D4A = ARRAY_LENGTH(mCommands); mFunFunIslandDiscovered = false; mLumpyPumkpinDiscovered = false; @@ -1182,10 +1179,6 @@ void dLytMapIcon01_c::setSaveObj(u32 color, nw4r::lyt::Pane *pane) { } void dLytMapIcon01_c::setTerry(bool present) { - // NONMATCHING - // TODO - SetVisible clrlwi - // When you fix this, maybe also fix other instances of this problem - // by searching for 91657b77 mpTerryOnOffPane->SetVisible(present); } @@ -1300,22 +1293,22 @@ void dLytMapIcon01_c::setupActorDrawCommands() { setupObjHarpHintDrawCommand(ac); if (field_0x184D) { - setupNpcKenseiDrawCommand(ac); + setupNpcBeeDrawCommand(ac); } - setupNpcBeeDrawCommand(ac); + setupNpcKenseiDrawCommand(ac); setupObjSaveDrawCommand(ac); setupObjLightLineDrawCommand(ac); setupObjRoAtTargetDrawCommand(ac); - if (mNumCommands >= 100) { + if (mNumCommands >= ARRAY_LENGTH(mCommands)) { break; } } } void dLytMapIcon01_c::setupNpcKenseiDrawCommand(dAcBase_c *actor) { - if (mNumCommands < 100) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { if (actor->mProfileName == fProfile::NPC_KENSEI && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { mVec2_c pos(0.0f, 0.0f); @@ -1351,7 +1344,7 @@ void dLytMapIcon01_c::setupTboxDrawCommand(dAcBase_c *actor) { } void dLytMapIcon01_c::setupTboxDrawCommandClosed(dAcTbox_c *box) { - if (mNumCommands < 100) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { mVec2_c pos(0.0f, 0.0f); projectOntoMap(box->mPosition, pos); mCommands[mNumCommands].passIdx = 17; @@ -1381,7 +1374,7 @@ void dLytMapIcon01_c::setupTboxDrawCommandClosed(dAcTbox_c *box) { } void dLytMapIcon01_c::setupTboxDrawCommandOpen(dAcTbox_c *box) { - if (mNumCommands < 100) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { mVec2_c pos(0.0f, 0.0f); projectOntoMap(box->mPosition, pos); mCommands[mNumCommands].passIdx = 17; @@ -1395,7 +1388,7 @@ void dLytMapIcon01_c::setupTboxDrawCommandOpen(dAcTbox_c *box) { } void dLytMapIcon01_c::setupTboxDrawCommandGoddessClosed(dAcTbox_c *box) { - if (mNumCommands < 100) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { mVec2_c pos(0.0f, 0.0f); projectOntoMap(box->mPosition, pos); mCommands[mNumCommands].passIdx = 28; @@ -1417,7 +1410,7 @@ void dLytMapIcon01_c::setupObjDoorDrawCommand(dAcBase_c *actor) { } void dLytMapIcon01_c::setupObjSaveDrawCommand(dAcBase_c *actor) { - if (mNumCommands < 100) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { if (actor->mProfileName == fProfile::OBJ_SAVE && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { dAcOSave_c *save = static_cast(actor); @@ -1555,7 +1548,7 @@ void dLytMapIcon01_c::setupStageDrawCommands() { setupTgInsectDrawCommand(ac); } - if (mNumCommands >= 100) { + if (mNumCommands >= ARRAY_LENGTH(mCommands)) { break; } } @@ -1604,7 +1597,7 @@ void dLytMapIcon01_c::setupLinkDrawCommand2() { } void dLytMapIcon01_c::setupCloudBigDrawCommand() { - if (mNumCommands < 100) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { mVec3_c thunderHeadPos(-135210.0f, 0.0f, -84790.0f); mVec2_c pos(0.0f, 0.0f); projectOntoMap(thunderHeadPos, pos); @@ -1742,7 +1735,7 @@ void dLytMapIcon00_c::resetDrawCommands() { mCommands[i].rotation.setF(0.0f); mCommands[i].paneIdx = 39; mCommands[i].passIdx = 35; - field_0x0F20[i] = 100; + field_0x0F20[i] = ARRAY_LENGTH(mCommands); field_0x13A8[i] = 0; field_0x1342[i] = 0; field_0x0E5B[i] = 0; @@ -1760,7 +1753,7 @@ void dLytMapIcon00_c::resetDrawCommands() { } for (int i = 0; i < (int)ARRAY_LENGTH(mPopupConfigs); i++) { - mPopupConfigs[i].cmdIdx = 100; + mPopupConfigs[i].cmdIdx = ARRAY_LENGTH(mCommands); mPopupConfigs[i].boundingPos.set(0.0f, 0.0f); mPopupConfigs[i].textPos.set(0.0f, 0.0f); mPopupConfigs[i].pointedAt = false; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp index 4274e323..4c1c206e 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp @@ -176,19 +176,9 @@ bool dLytMsgWindowGet_c::execute() { } void dLytMsgWindowGet_c::draw() { - // NONMATCHING - // TODO - SetVisible clrlwi - // The instruction patterns here are the same that EGG::StateGX::Scoped - // generates, but there's no RAII to be found here. What's the missing - // link that makes the compiler generate these? - // When you fix this, fix other instances of this problem - // by searching for 91657b77 - bool bVis[5] = { - mpPanes[0]->IsVisible(), - mpPanes[1]->IsVisible(), - mpPanes[2]->IsVisible(), - mpPanes[3]->IsVisible(), - mpPanes[4]->IsVisible(), + bool bVis[5]; + for (int i = 0; i < 5; ++i) { + bVis[i] = mpPanes[i]->IsVisible(); }; mpPanes[0]->SetVisible(bVis[0]); @@ -208,11 +198,9 @@ void dLytMsgWindowGet_c::draw() { mLyt.draw(); - mpPanes[0]->SetVisible(bVis[0]); - mpPanes[1]->SetVisible(bVis[1]); - mpPanes[2]->SetVisible(bVis[2]); - mpPanes[3]->SetVisible(bVis[3]); - mpPanes[4]->SetVisible(bVis[4]); + for (int i = 0; i < 5; ++i) { + mpPanes[i]->SetVisible(bVis[i]); + }; } void dLytMsgWindowGet_c::open(dAcObjBase_c *obj, u32 param) { diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp index 6564a7f3..d47b6a72 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp @@ -1,8 +1,8 @@ #include "d/lyt/msg_window/d_lyt_msg_window_link.h" #include "common.h" -#include "d/d_tag_processor.h" #include "d/d_lyt_hio.h" +#include "d/d_tag_processor.h" #include "d/lyt/d2d.h" #include "d/lyt/d_textbox.h" #include "d/lyt/msg_window/d_lyt_msg_window_common.h" @@ -17,10 +17,10 @@ STATE_DEFINE(dLytMsgWindowLink_c, Visible); STATE_DEFINE(dLytMsgWindowLink_c, Out); static const d2d::LytBrlanMapping brlanMap[] = { - { "linkWindow_00_in.brlan", "G_inOut_00"}, - { "linkWindow_00_out.brlan", "G_inOut_00"}, - {"linkWindow_00_position.brlan", "G_position_00"}, - {"linkWindow_00_loop.brlan", "G_loop_00"}, + { "linkWindow_00_in.brlan", "G_inOut_00"}, + { "linkWindow_00_out.brlan", "G_inOut_00"}, + {"linkWindow_00_position.brlan", "G_position_00"}, + { "linkWindow_00_loop.brlan", "G_loop_00"}, }; #define LINK_ANIM_IN 0 @@ -98,7 +98,7 @@ bool dLytMsgWindowLink_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAc mParam = 0; mOffset.x = mOffset.y = 0.0f; - + mWaitDelay = 0; mStateMgr.changeState(StateID_Invisible); @@ -239,17 +239,9 @@ bool dLytMsgWindowLink_c::execute() { } void dLytMsgWindowLink_c::draw() { - // NONMATCHING - // TODO - SetVisible clrlwi - // The instruction patterns here are the same that EGG::StateGX::Scoped - // generates, but there's no RAII to be found here. What's the missing - // link that makes the compiler generate these? - // When you fix this, fix other instances of this problem - // by searching for 91657b77 - bool bVis[3] = { - mpPanes[0]->IsVisible(), - mpPanes[1]->IsVisible(), - mpPanes[2]->IsVisible(), + bool bVis[3]; + for (int i = 0; i < 3; ++i) { + bVis[i] = mpPanes[i]->IsVisible(); }; mpPanes[0]->SetVisible(bVis[0]); @@ -267,9 +259,9 @@ void dLytMsgWindowLink_c::draw() { mLyt.draw(); - mpPanes[0]->SetVisible(bVis[0]); - mpPanes[1]->SetVisible(bVis[1]); - mpPanes[2]->SetVisible(bVis[2]); + for (int i = 0; i < 3; ++i) { + mpPanes[i]->SetVisible(bVis[i]); + }; } void dLytMsgWindowLink_c::open(dAcObjBase_c *obj, u32 param) { diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp index 8f9cde37..5c89d671 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp @@ -1,8 +1,8 @@ #include "d/lyt/msg_window/d_lyt_msg_window_talk.h" #include "common.h" -#include "d/d_tag_processor.h" #include "d/d_lyt_hio.h" +#include "d/d_tag_processor.h" #include "d/lyt/d2d.h" #include "d/lyt/d_textbox.h" #include "d/lyt/msg_window/d_lyt_msg_window_common.h" @@ -239,17 +239,9 @@ bool dLytMsgWindowTalk_c::execute() { } void dLytMsgWindowTalk_c::draw() { - // NONMATCHING - // TODO - SetVisible clrlwi - // The instruction patterns here are the same that EGG::StateGX::Scoped - // generates, but there's no RAII to be found here. What's the missing - // link that makes the compiler generate these? - // When you fix this, fix other instances of this problem - // by searching for 91657b77 - bool bVis[3] = { - mpPanes[0]->IsVisible(), - mpPanes[1]->IsVisible(), - mpPanes[2]->IsVisible(), + bool bVis[3]; + for (int i = 0; i < 3; ++i) { + bVis[i] = mpPanes[i]->IsVisible(); }; mpPanes[0]->SetVisible(bVis[0]); @@ -265,9 +257,9 @@ void dLytMsgWindowTalk_c::draw() { mLyt.draw(); - mpPanes[0]->SetVisible(bVis[0]); - mpPanes[1]->SetVisible(bVis[1]); - mpPanes[2]->SetVisible(bVis[2]); + for (int i = 0; i < 3; ++i) { + mpPanes[i]->SetVisible(bVis[i]); + }; } void dLytMsgWindowTalk_c::open(dAcObjBase_c *obj, u32 param) {