From 631d950d13fb73b2f7ec7fd53d25df4edaa8479b Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 10 Oct 2025 22:36:37 +0200 Subject: [PATCH] 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 {