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);