diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index f0c6a0d3..269a388a 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -541,7 +541,11 @@ toBeSorted/bigboss_model_math_stuff.cpp: .sbss start:0x80575410 end:0x80575418 toBeSorted/actor_event_flow_manager_related.cpp: - .text start:0x800C3900 end:0x800C447C align:16 + .text start:0x800C3900 end:0x800C3AEC align:16 + +toBeSorted/d_flow_mgr.cpp: + .text start:0x800C3AF0 end:0x800C447C align:16 + .data start:0x80511B18 end:0x80511B30 d/d_lyt_base.cpp: .text start:0x800C4480 end:0x800C4690 align:16 @@ -909,12 +913,16 @@ d/lyt/d_lyt_auto_explain.cpp: .sdata2 start:0x80579F10 end:0x80579F28 .bss start:0x805AF2F0 end:0x805AF3F0 +d/lyt/d_lyt_map_global.cpp: + .text start:0x8012D190 end:0x8012D4A8 align:16 + .sbss start:0x805754A0 end:0x805754A8 + .sdata2 start:0x80579F28 end:0x80579F30 + d/lyt/d_lyt_map_capture.cpp: - .text start:0x8012D190 end:0x8012DC28 align:16 + .text start:0x8012D4B0 end:0x8012DC28 align:16 .ctors start:0x804DB768 end:0x804DB76C .data start:0x8051EA08 end:0x8051EAE0 - .sbss start:0x805754A0 end:0x805754A8 - .sdata2 start:0x80579F28 end:0x80579F40 + .sdata2 start:0x80579F30 end:0x80579F40 .bss start:0x805AF3F0 end:0x805AF470 d/lyt/d_lyt_map.cpp: @@ -1223,11 +1231,13 @@ d/a/d_a_door_base.cpp: .data start:0x80528F20 end:0x80528FB0 .sbss start:0x80575668 end:0x80575670 -d/lyt/d_lyt_map_popup.cpp: +d/lyt/d_lyt_map_markers.cpp: .text start:0x801792D0 end:0x80189F9C align:16 .rodata start:0x804E9AD0 end:0x804E9CB0 .data start:0x80528FB0 end:0x8052A880 + .sdata start:0x80572BB0 end:0x80572D08 .sbss start:0x80575670 end:0x80575678 + .sdata2 start:0x8057AC78 end:0x8057ACF0 d/d_pouch.cpp: .text start:0x80189FA0 end:0x8018B4A4 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8910b507..60f7ca4b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -180,7 +180,7 @@ fn_80007E60 = .text:0x80007E60; // type:function size:0xF8 fn_80007F60 = .text:0x80007F60; // type:function size:0x68 fn_80007FD0 = .text:0x80007FD0; // type:function size:0x7C fn_80008050 = .text:0x80008050; // type:function size:0x350 -fn_800083A0 = .text:0x800083A0; // type:function size:0x40 +__dt__14dFlowMgrBase_cFv = .text:0x800083A0; // type:function size:0x40 fn_800083E0 = .text:0x800083E0; // type:function size:0x18 fn_80008400 = .text:0x80008400; // type:function size:0x118 fn_80008520 = .text:0x80008520; // type:function size:0x68 @@ -2484,7 +2484,7 @@ getLinkSoundRelated = .text:0x8005BDA0; // type:function size:0xC fn_8005BDB0 = .text:0x8005BDB0; // type:function size:0xE8 unsetRegionBasedFlagsMaybe = .text:0x8005BEA0; // type:function size:0x100 getEarringsColor__17daPlayerActBase_cFv = .text:0x8005BFA0; // type:function size:0xB0 -getLinkTunicSubtype = .text:0x8005C050; // type:function size:0xC +getCurrentTunicType__17daPlayerActBase_cFv = .text:0x8005C050; // type:function size:0xC getCurrentSwordType = .text:0x8005C060; // type:function size:0xAC updateCurrentSword__17daPlayerActBase_cFv = .text:0x8005C110; // type:function size:0x24 doesPlayerHaveSword = .text:0x8005C140; // type:function size:0x1C @@ -3555,7 +3555,7 @@ fn_8009DFE0 = .text:0x8009DFE0; // type:function size:0x54 fn_8009E040 = .text:0x8009E040; // type:function size:0x54 fn_8009E0A0 = .text:0x8009E0A0; // type:function size:0x6C fn_8009E110 = .text:0x8009E110; // type:function size:0x14 -mainEventManagerUpdate = .text:0x8009E130; // type:function size:0x9A4 +execute__12EventManagerFv = .text:0x8009E130; // type:function size:0x9A4 fn_8009EAE0 = .text:0x8009EAE0; // type:function size:0x4 fn_8009EAF0 = .text:0x8009EAF0; // type:function size:0xC fn_8009EB00 = .text:0x8009EB00; // type:function size:0xC @@ -3850,7 +3850,7 @@ setMessageWithGlobalTextProcessorAndMsbtInfo__10dTextBox_cFP8MsbtInfoPCcPwUl = . setTextWithGlobalTextProcessor__10dTextBox_cFPCw = .text:0x800AF930; // type:function size:0x50 GetLineWidth__10dTextBox_cCFPf = .text:0x800AF980; // type:function size:0x1E4 GetLinesHeight__10dTextBox_cCFv = .text:0x800AFB70; // type:function size:0x1A4 -GetUnkWidthRatio__10dTextBox_cCFv = .text:0x800AFD20; // type:function size:0x3C +getLineDrawWidth__10dTextBox_cCFv = .text:0x800AFD20; // type:function size:0x3C resizeTextToFit__10dTextBox_cFf = .text:0x800AFD60; // type:function size:0xC8 init__10dTextBox_cFv = .text:0x800AFE30; // type:function size:0x204 hasDynamicText__10dTextBox_cFv = .text:0x800B0040; // type:function size:0x278 @@ -4270,8 +4270,8 @@ fn_800C3820 = .text:0x800C3820; // type:function size:0x80 fn_800C38A0 = .text:0x800C38A0; // type:function size:0x58 fn_800C3900 = .text:0x800C3900; // type:function size:0xD0 fn_800C39D0 = .text:0x800C39D0; // type:function size:0x11C -fn_800C3AF0 = .text:0x800C3AF0; // type:function size:0x1C -ActorEventFlowManagerRelated__triggerEventEntryPoint = .text:0x800C3B10; // type:function size:0xF8 +__ct__14dFlowMgrBase_cFP7dFlow_c = .text:0x800C3AF0; // type:function size:0x1C +triggerEntryPoint__14dFlowMgrBase_cFllUcUc = .text:0x800C3B10; // type:function size:0xF8 fn_800C3C10 = .text:0x800C3C10; // type:function size:0xE8 fn_800C3D00 = .text:0x800C3D00; // type:function size:0x78 fn_800C3D80 = .text:0x800C3D80; // type:function size:0xC @@ -4279,15 +4279,15 @@ 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 fn_800C41B0 = .text:0x800C41B0; // type:function size:0xBC fn_800C4270 = .text:0x800C4270; // type:function size:0x54 fn_800C42D0 = .text:0x800C42D0; // type:function size:0xF8 -fn_800C43D0 = .text:0x800C43D0; // type:function size:0x48 -fn_800C4420 = .text:0x800C4420; // type:function size:0x5C +__ct__10dFlowMgr_cFv = .text:0x800C43D0; // type:function size:0x48 +__dt__10dFlowMgr_cFv = .text:0x800C4420; // type:function size:0x5C __ct__10dLytBase_cFv = .text:0x800C4480; // type:function size:0x54 __dt__10dLytBase_cFv = .text:0x800C44E0; // type:function size:0x94 allocateLytWork1Heap__10dLytBase_cFPCcb = .text:0x800C4580; // type:function size:0xB4 @@ -7474,54 +7474,54 @@ getTextBox__17dLytAutoExplain_cFv = .text:0x8012CD50; // type:function size:0x8 __sinit_\d_lyt_auto_explain_cpp = .text:0x8012CD60; // type:function size:0x338 scope:local __dt__32sFStateID_c<17dLytAutoExplain_c>Fv = .text:0x8012D0A0; // type:function size:0x58 scope:weak isSameName__32sFStateID_c<17dLytAutoExplain_c>CFPCc = .text:0x8012D100; // type:function size:0x88 scope:weak -fn_8012D190 = .text:0x8012D190; // type:function size:0x68 -fn_8012D200 = .text:0x8012D200; // type:function size:0x108 -projectForMapMaybe = .text:0x8012D310; // type:function size:0x18 -fn_8012D330 = .text:0x8012D330; // type:function size:0x1C -fn_8012D350 = .text:0x8012D350; // type:function size:0x1C -fn_8012D370 = .text:0x8012D370; // type:function size:0x1C -fn_8012D390 = .text:0x8012D390; // type:function size:0x118 -LytMapCapture__stateRenderingWaitEnter = .text:0x8012D4B0; // type:function size:0x4 -LytMapCapture__stateRenderingWaitUpdate = .text:0x8012D4C0; // type:function size:0x70 +__ct__15dLytMapGlobal_cFv = .text:0x8012D190; // type:function size:0x68 +projectOntoMap__15dLytMapGlobal_cCFR7mVec2_cRC7mVec3_cRC7mVec3_cRC7mVec3_cRC4mAngff = .text:0x8012D200; // type:function size:0x108 +projectOntoMap__15dLytMapGlobal_cCFR7mVec2_cRC7mVec3_c = .text:0x8012D310; // type:function size:0x18 +unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_c = .text:0x8012D330; // type:function size:0x1C +unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC4mAng = .text:0x8012D350; // type:function size:0x1C +unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC7mVec3_cRC4mAng = .text:0x8012D370; // type:function size:0x1C +unprojectFromMap__15dLytMapGlobal_cCFR7mVec3_cRC7mVec2_cRC7mVec2_cRC7mVec3_cRC7mVec3_cRC4mAngff = .text:0x8012D390; // type:function size:0x118 +initializeState_RenderingWait__16dLytMapCapture_cFv = .text:0x8012D4B0; // type:function size:0x4 +executeState_RenderingWait__16dLytMapCapture_cFv = .text:0x8012D4C0; // type:function size:0x70 changeState__85sStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8012D530; // type:function size:0x10 -LytMapCapture__stateRenderingWaitLeave = .text:0x8012D540; // type:function size:0x4 -LytMapCapture__stateRenderingWaitStep2Enter = .text:0x8012D550; // type:function size:0x4 -LytMapCapture__stateRenderingWaitStep2Update = .text:0x8012D560; // type:function size:0x94 -LytMapCapture__stateRenderingWaitStep2Leave = .text:0x8012D600; // type:function size:0x4 +finalizeState_RenderingWait__16dLytMapCapture_cFv = .text:0x8012D540; // type:function size:0x4 +initializeState_RenderingWaitStep2__16dLytMapCapture_cFv = .text:0x8012D550; // type:function size:0x4 +executeState_RenderingWaitStep2__16dLytMapCapture_cFv = .text:0x8012D560; // type:function size:0x94 +finalizeState_RenderingWaitStep2__16dLytMapCapture_cFv = .text:0x8012D600; // type:function size:0x4 fn_8012D610 = .text:0x8012D610; // type:function size:0x5C fn_8012D670 = .text:0x8012D670; // type:function size:0x5C fn_8012D6D0 = .text:0x8012D6D0; // type:function size:0x20 fn_8012D6F0 = .text:0x8012D6F0; // type:function size:0xE4 -fn_8012D7E0 = .text:0x8012D7E0; // type:function size:0x10 -fn_8012D7F0 = .text:0x8012D7F0; // type:function size:0x8 +execute__16dLytMapCapture_cFv = .text:0x8012D7E0; // type:function size:0x10 +isBusyRendering__16dLytMapCapture_cCFv = .text:0x8012D7F0; // type:function size:0x8 fn_8012D800 = .text:0x8012D800; // type:function size:0xEC -fn_8012D8F0 = .text:0x8012D8F0; // type:function size:0x30 -fn_8012D920 = .text:0x8012D920; // type:function size:0x30 -fn_8012D950 = .text:0x8012D950; // type:function size:0x30 -LytMapCapture__initStates = .text:0x8012D980; // type:function size:0x1C0 -LytMapCapture__dtor = .text:0x8012DB40; // type:function size:0x58 -fn_8012DBA0 = .text:0x8012DBA0; // type:function size:0x88 +finalizeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D8F0; // type:function size:0x30 +executeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D920; // type:function size:0x30 +initializeState__31sFStateID_c<16dLytMapCapture_c>CFR16dLytMapCapture_c = .text:0x8012D950; // type:function size:0x30 +__sinit_\d_lyt_map_capture_cpp = .text:0x8012D980; // type:function size:0x1C0 +__dt__31sFStateID_c<16dLytMapCapture_c>Fv = .text:0x8012DB40; // type:function size:0x58 +isSameName__31sFStateID_c<16dLytMapCapture_c>CFPCc = .text:0x8012DBA0; // type:function size:0x88 __ct__13dLytMap_HIO_cFv = .text:0x8012DC30; // type:function size:0xEC __dt__13dLytMap_HIO_cFv = .text:0x8012DD20; // type:function size:0x40 -fn_8012DD60 = .text:0x8012DD60; // type:function size:0x17C -fn_8012DEE0 = .text:0x8012DEE0; // type:function size:0x70 -fn_8012DF50 = .text:0x8012DF50; // type:function size:0x20 -fn_8012DF70 = .text:0x8012DF70; // type:function size:0x18 -fn_8012DF90 = .text:0x8012DF90; // type:function size:0xF0 -fn_8012E080 = .text:0x8012E080; // type:function size:0x8 -fn_8012E090 = .text:0x8012E090; // type:function size:0x1A0 -fn_8012E230 = .text:0x8012E230; // type:function size:0x8 -fn_8012E240 = .text:0x8012E240; // type:function size:0xA0 -fn_8012E2E0 = .text:0x8012E2E0; // type:function size:0x8 -fn_8012E2F0 = .text:0x8012E2F0; // type:function size:0x204 -fn_8012E500 = .text:0x8012E500; // type:function size:0xC -fn_8012E510 = .text:0x8012E510; // type:function size:0x1F0 -fn_8012E700 = .text:0x8012E700; // type:function size:0x68 -fn_8012E770 = .text:0x8012E770; // type:function size:0x4 -fn_8012E780 = .text:0x8012E780; // type:function size:0x14 -fn_8012E7A0 = .text:0x8012E7A0; // type:function size:0x24 -fn_8012E7D0 = .text:0x8012E7D0; // type:function size:0x3C -fn_8012E810 = .text:0x8012E810; // type:function size:0x24 +init__21dMapFootPrintsQueue_cFv = .text:0x8012DD60; // type:function size:0x17C +addStep__21dMapFootPrintsQueue_cFRC7mVec3_cRC4mAng = .text:0x8012DEE0; // type:function size:0x70 +getFirst__21dMapFootPrintsQueue_cCFv = .text:0x8012DF50; // type:function size:0x20 +getNext__21dMapFootPrintsQueue_cCFPC18dMapFootPrintEntry = .text:0x8012DF70; // type:function size:0x18 +execute__19dMapFootPrintsMgr_cFv = .text:0x8012DF90; // type:function size:0xF0 +__ct__4mAngFs = .text:0x8012E080; // type:function size:0x8 +__ct__19dLytMapFootPrints_cFP15dLytMapGlobal_c = .text:0x8012E090; // type:function size:0x1A0 +getGlobal__19dLytMapFootPrints_cCFv = .text:0x8012E230; // type:function size:0x8 +build__19dLytMapFootPrints_cFPQ23d2d10ResAccIf_c = .text:0x8012E240; // type:function size:0xA0 +remove__19dLytMapFootPrints_cFv = .text:0x8012E2E0; // type:function size:0x8 +execute__19dLytMapFootPrints_cFv = .text:0x8012E2F0; // type:function size:0x204 +__ct__7mVec2_cFff = .text:0x8012E500; // type:function size:0xC +draw__19dLytMapFootPrints_cFv = .text:0x8012E510; // type:function size:0x1F0 +build__16dLytMapPutIcon_cFPQ23d2d10ResAccIf_c = .text:0x8012E700; // type:function size:0x68 +remove__16dLytMapPutIcon_cFv = .text:0x8012E770; // type:function size:0x4 +execute__16dLytMapPutIcon_cFv = .text:0x8012E780; // type:function size:0x14 +draw__16dLytMapPutIcon_cFv = .text:0x8012E7A0; // type:function size:0x24 +setPosition__16dLytMapPutIcon_cFRC7mVec2_c = .text:0x8012E7D0; // type:function size:0x3C +setScale__16dLytMapPutIcon_cFf = .text:0x8012E810; // type:function size:0x24 initializeState_Wait__16dLytMapPinIcon_cFv = .text:0x8012E840; // type:function size:0x14 executeState_Wait__16dLytMapPinIcon_cFv = .text:0x8012E860; // type:function size:0x58 changeState__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8012E8C0; // type:function size:0x10 @@ -7538,18 +7538,18 @@ finalizeState_ToUnselect__16dLytMapPinIcon_cFv = .text:0x8012EAE0; // type:funct initializeState_Remove__16dLytMapPinIcon_cFv = .text:0x8012EAF0; // type:function size:0x4 executeState_Remove__16dLytMapPinIcon_cFv = .text:0x8012EB00; // type:function size:0x18 finalizeState_Remove__16dLytMapPinIcon_cFv = .text:0x8012EB20; // type:function size:0x4 -fn_8012EB30 = .text:0x8012EB30; // type:function size:0xF8 -fn_8012EC30 = .text:0x8012EC30; // type:function size:0x80 -fn_8012ECB0 = .text:0x8012ECB0; // type:function size:0x10C -fn_8012EDC0 = .text:0x8012EDC0; // type:function size:0x2C +updatePosition__16dLytMapPinIcon_cFv = .text:0x8012EB30; // type:function size:0xF8 +checkPointedAt__16dLytMapPinIcon_cFv = .text:0x8012EC30; // type:function size:0x80 +setPosition__16dLytMapPinIcon_cFRC7mVec3_c = .text:0x8012ECB0; // type:function size:0x10C +removeBeacon__16dLytMapPinIcon_cFv = .text:0x8012EDC0; // type:function size:0x2C __dt__16dLytMapPinIcon_cFv = .text:0x8012EDF0; // type:function size:0x110 __dt__55sFStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c>Fv = .text:0x8012EF00; // type:function size:0xA4 __dt__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012EFB0; // type:function size:0xA0 __dt__32sFStateFct_c<16dLytMapPinIcon_c>Fv = .text:0x8012F050; // type:function size:0x6C __dt__29sFState_c<16dLytMapPinIcon_c>Fv = .text:0x8012F0C0; // type:function size:0x58 -fn_8012F120 = .text:0x8012F120; // type:function size:0x8 +getGlobal__16dLytMapPinIcon_cCFv = .text:0x8012F120; // type:function size:0x8 build__16dLytMapPinIcon_cFPQ23d2d10ResAccIf_c = .text:0x8012F130; // type:function size:0x17C -fn_8012F2B0 = .text:0x8012F2B0; // type:function size:0x6C +setScale__16dLytMapPinIcon_cFf = .text:0x8012F2B0; // type:function size:0x6C remove__16dLytMapPinIcon_cFv = .text:0x8012F320; // type:function size:0x60 execute__16dLytMapPinIcon_cFv = .text:0x8012F380; // type:function size:0xE4 executeState__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012F470; // type:function size:0x10 @@ -7565,24 +7565,24 @@ finalizeState_Select__25dLytMapPinIconAggregate_cFv = .text:0x8012F760; // type: initializeState_Remove__25dLytMapPinIconAggregate_cFv = .text:0x8012F770; // type:function size:0x4 executeState_Remove__25dLytMapPinIconAggregate_cFv = .text:0x8012F780; // type:function size:0x24 finalizeState_Remove__25dLytMapPinIconAggregate_cFv = .text:0x8012F7B0; // type:function size:0x4 -fn_8012F7C0 = .text:0x8012F7C0; // type:function size:0x94 -fn_8012F860 = .text:0x8012F860; // type:function size:0x5C -fn_8012F8C0 = .text:0x8012F8C0; // type:function size:0x4C -fn_8012F910 = .text:0x8012F910; // type:function size:0x1C -fn_8012F930 = .text:0x8012F930; // type:function size:0x68 -fn_8012F9A0 = .text:0x8012F9A0; // type:function size:0x1C -fn_8012F9C0 = .text:0x8012F9C0; // type:function size:0x5C -fn_8012FA20 = .text:0x8012FA20; // type:function size:0xA8 -fn_8012FAD0 = .text:0x8012FAD0; // type:function size:0x50 -fn_8012FB20 = .text:0x8012FB20; // type:function size:0xA8 +findNewBeaconId__25dLytMapPinIconAggregate_cFPl = .text:0x8012F7C0; // type:function size:0x94 +setScale__25dLytMapPinIconAggregate_cFf = .text:0x8012F860; // type:function size:0x5C +updatePosition__25dLytMapPinIconAggregate_cFv = .text:0x8012F8C0; // type:function size:0x4C +setUnk__25dLytMapPinIconAggregate_cFP16LytMap0x80520B5C = .text:0x8012F910; // type:function size:0x1C +setPosition__25dLytMapPinIconAggregate_cFlRC7mVec3_c = .text:0x8012F930; // type:function size:0x68 +unsetAll__25dLytMapPinIconAggregate_cFv = .text:0x8012F9A0; // type:function size:0x1C +getNumSetPins__25dLytMapPinIconAggregate_cCFv = .text:0x8012F9C0; // type:function size:0x5C +build__25dLytMapPinIconAggregate_cFPQ23d2d10ResAccIf_c = .text:0x8012FA20; // type:function size:0xA8 +remove__25dLytMapPinIconAggregate_cFv = .text:0x8012FAD0; // type:function size:0x50 +execute__25dLytMapPinIconAggregate_cFv = .text:0x8012FB20; // type:function size:0xA8 executeState__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012FBD0; // type:function size:0x10 -fn_8012FBE0 = .text:0x8012FBE0; // type:function size:0x50 -fn_8012FC30 = .text:0x8012FC30; // type:function size:0x18 +draw__25dLytMapPinIconAggregate_cFv = .text:0x8012FBE0; // type:function size:0x50 +init__17dLytMapFloorBtn_cFv = .text:0x8012FC30; // type:function size:0x18 changeState__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8012FC50; // type:function size:0x10 -fn_8012FC60 = .text:0x8012FC60; // type:function size:0x10 +execute__17dLytMapFloorBtn_cFv = .text:0x8012FC60; // type:function size:0x10 executeState__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8012FC70; // type:function size:0x10 -fn_8012FC80 = .text:0x8012FC80; // type:function size:0xB4 -fn_8012FD40 = .text:0x8012FD40; // type:function size:0xAC +directlyDecide__17dLytMapFloorBtn_cFv = .text:0x8012FC80; // type:function size:0xB4 +directlyUndecide__17dLytMapFloorBtn_cFv = .text:0x8012FD40; // type:function size:0xAC initializeState_Wait__17dLytMapFloorBtn_cFv = .text:0x8012FDF0; // type:function size:0x4 executeState_Wait__17dLytMapFloorBtn_cFv = .text:0x8012FE00; // type:function size:0xA0 finalizeState_Wait__17dLytMapFloorBtn_cFv = .text:0x8012FEA0; // type:function size:0x4 @@ -7616,26 +7616,26 @@ __dt__56sFStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c>Fv = .text:0x801 __dt__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80130800; // type:function size:0xA0 __dt__33sFStateFct_c<17dLytMapFloorBtn_c>Fv = .text:0x801308A0; // type:function size:0x6C __dt__30sFState_c<17dLytMapFloorBtn_c>Fv = .text:0x80130910; // type:function size:0x58 -__dt__20LytMapFourAnimGroupsFv = .text:0x80130970; // type:function size:0xA0 +__dt__24dLytMapFloorBtnAnmGroupsFv = .text:0x80130970; // type:function size:0xA0 __dt__59sFStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c>Fv = .text:0x80130A10; // type:function size:0xA4 __dt__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80130AC0; // type:function size:0xA0 __dt__36sFStateFct_c<20dLytMapFloorBtnMgr_c>Fv = .text:0x80130B60; // type:function size:0x6C __dt__33sFState_c<20dLytMapFloorBtnMgr_c>Fv = .text:0x80130BD0; // type:function size:0x58 -fn_80130C30 = .text:0x80130C30; // type:function size:0x300 +build__20dLytMapFloorBtnMgr_cFPQ23d2d10ResAccIf_c = .text:0x80130C30; // type:function size:0x300 changeState__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80130F30; // type:function size:0x10 -fn_80130F40 = .text:0x80130F40; // type:function size:0xB4 -fn_80131000 = .text:0x80131000; // type:function size:0x2D4 +remove__20dLytMapFloorBtnMgr_cFv = .text:0x80130F40; // type:function size:0xB4 +execute__20dLytMapFloorBtnMgr_cFv = .text:0x80131000; // type:function size:0x2D4 getStateID__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801312E0; // type:function size:0x10 executeState__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801312F0; // type:function size:0x10 -fn_80131300 = .text:0x80131300; // type:function size:0xF0 -fn_801313F0 = .text:0x801313F0; // type:function size:0x58 -fn_80131450 = .text:0x80131450; // type:function size:0x8 -fn_80131460 = .text:0x80131460; // type:function size:0xC4 -fn_80131530 = .text:0x80131530; // type:function size:0x5C -fn_80131590 = .text:0x80131590; // type:function size:0x1D8 +checkPointedAtBtn__20dLytMapFloorBtnMgr_cFv = .text:0x80131300; // type:function size:0xF0 +getPointedAtBtnIdx__20dLytMapFloorBtnMgr_cCFv = .text:0x801313F0; // type:function size:0x58 +isUsingPointerNav__20dLytMapFloorBtnMgr_cCFv = .text:0x80131450; // type:function size:0x8 +resetFloor__20dLytMapFloorBtnMgr_cFl = .text:0x80131460; // type:function size:0xC4 +decideSelectedFloor__20dLytMapFloorBtnMgr_cFv = .text:0x80131530; // type:function size:0x5C +canDecideFloor__20dLytMapFloorBtnMgr_cCFv = .text:0x80131590; // type:function size:0x1D8 getStateID__86sStateMgr_c<17dLytMapFloorBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80131770; // type:function size:0x10 -fn_80131780 = .text:0x80131780; // type:function size:0x50 -fn_801317D0 = .text:0x801317D0; // type:function size:0x27C +getCurrentFloor__20dLytMapFloorBtnMgr_cCFv = .text:0x80131780; // type:function size:0x50 +init__20dLytMapFloorBtnMgr_cFlll = .text:0x801317D0; // type:function size:0x27C initializeState_Invisible__20dLytMapFloorBtnMgr_cFv = .text:0x80131A50; // type:function size:0x4 executeState_Invisible__20dLytMapFloorBtnMgr_cFv = .text:0x80131A60; // type:function size:0x4 finalizeState_Invisible__20dLytMapFloorBtnMgr_cFv = .text:0x80131A70; // type:function size:0x4 @@ -7664,11 +7664,11 @@ finalizeState_WaitInvalid__18dLytMapPopupInfo_cFv = .text:0x80131ED0; // type:fu initializeState_Out__18dLytMapPopupInfo_cFv = .text:0x80131EE0; // type:function size:0xC executeState_Out__18dLytMapPopupInfo_cFv = .text:0x80131EF0; // type:function size:0x6C finalizeState_Out__18dLytMapPopupInfo_cFv = .text:0x80131F60; // type:function size:0x4 -fn_80131F70 = .text:0x80131F70; // type:function size:0xB0 -fn_80132020 = .text:0x80132020; // type:function size:0x4C -fn_80132070 = .text:0x80132070; // type:function size:0x94 +build__18dLytMapPopupInfo_cFPQ23d2d10ResAccIf_c = .text:0x80131F70; // type:function size:0xB0 +remove__18dLytMapPopupInfo_cFv = .text:0x80132020; // type:function size:0x4C +execute__18dLytMapPopupInfo_cFv = .text:0x80132070; // type:function size:0x94 executeState__87sStateMgr_c<18dLytMapPopupInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80132110; // type:function size:0x10 -fn_80132120 = .text:0x80132120; // type:function size:0x14 +draw__18dLytMapPopupInfo_cFv = .text:0x80132120; // type:function size:0x14 initializeState_Invisible__24dLytMapSavePopupAction_cFv = .text:0x80132140; // type:function size:0x4 executeState_Invisible__24dLytMapSavePopupAction_cFv = .text:0x80132150; // type:function size:0x28 changeState__93sStateMgr_c<24dLytMapSavePopupAction_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80132180; // type:function size:0x10 @@ -7682,18 +7682,18 @@ finalizeState_Wait__24dLytMapSavePopupAction_cFv = .text:0x80132340; // type:fun initializeState_Out__24dLytMapSavePopupAction_cFv = .text:0x80132350; // type:function size:0x7C executeState_Out__24dLytMapSavePopupAction_cFv = .text:0x801323D0; // type:function size:0xB4 finalizeState_Out__24dLytMapSavePopupAction_cFv = .text:0x80132490; // type:function size:0x4 -fn_801324A0 = .text:0x801324A0; // type:function size:0x10 +execute__24dLytMapSavePopupAction_cFv = .text:0x801324A0; // type:function size:0x10 executeState__93sStateMgr_c<24dLytMapSavePopupAction_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801324B0; // type:function size:0x10 -fn_801324C0 = .text:0x801324C0; // type:function size:0x10 -fn_801324D0 = .text:0x801324D0; // type:function size:0x78 -fn_80132550 = .text:0x80132550; // type:function size:0xD0 -fn_80132620 = .text:0x80132620; // type:function size:0x4C -fn_80132670 = .text:0x80132670; // type:function size:0x94 -fn_80132710 = .text:0x80132710; // type:function size:0x318 +init__24dLytMapSavePopupAction_cFPQ23d2d10AnmGroup_c = .text:0x801324C0; // type:function size:0x10 +hide__24dLytMapSavePopupAction_cFv = .text:0x801324D0; // type:function size:0x78 +build__18dLytMapSavePopup_cFPQ23d2d10ResAccIf_c = .text:0x80132550; // type:function size:0xD0 +remove__18dLytMapSavePopup_cFv = .text:0x80132620; // type:function size:0x4C +execute__18dLytMapSavePopup_cFv = .text:0x80132670; // type:function size:0x94 +draw__18dLytMapSavePopup_cFv = .text:0x80132710; // type:function size:0x318 getStateID__93sStateMgr_c<24dLytMapSavePopupAction_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80132A30; // type:function size:0x10 -fn_80132A40 = .text:0x80132A40; // type:function size:0xC -fn_80132A50 = .text:0x80132A50; // type:function size:0xA4 -fn_80132B00 = .text:0x80132B00; // type:function size:0x10 +set__18dLytMapSavePopup_cFPPQ34nw4r3lyt8Boundingl = .text:0x80132A40; // type:function size:0xC +setStatueLabel__18dLytMapSavePopup_cFPCc = .text:0x80132A50; // type:function size:0xA4 +hide__18dLytMapSavePopup_cFl = .text:0x80132B00; // type:function size:0x10 initializeState_Invisible__20dLytMapSaveCaption_cFv = .text:0x80132B10; // type:function size:0x4 executeState_Invisible__20dLytMapSaveCaption_cFv = .text:0x80132B20; // type:function size:0x4 finalizeState_Invisible__20dLytMapSaveCaption_cFv = .text:0x80132B30; // type:function size:0x4 @@ -7707,14 +7707,14 @@ finalizeState_Wait__20dLytMapSaveCaption_cFv = .text:0x80132CC0; // type:functio initializeState_Out__20dLytMapSaveCaption_cFv = .text:0x80132CD0; // type:function size:0x48 executeState_Out__20dLytMapSaveCaption_cFv = .text:0x80132D20; // type:function size:0x90 finalizeState_Out__20dLytMapSaveCaption_cFv = .text:0x80132DB0; // type:function size:0x4 -fn_80132DC0 = .text:0x80132DC0; // type:function size:0xB0 -fn_80132E70 = .text:0x80132E70; // type:function size:0x4C -fn_80132EC0 = .text:0x80132EC0; // type:function size:0xA0 +build__20dLytMapSaveCaption_cFPQ23d2d10ResAccIf_c = .text:0x80132DC0; // type:function size:0xB0 +remove__20dLytMapSaveCaption_cFv = .text:0x80132E70; // type:function size:0x4C +execute__20dLytMapSaveCaption_cFv = .text:0x80132EC0; // type:function size:0xA0 executeState__89sStateMgr_c<20dLytMapSaveCaption_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80132F60; // type:function size:0x10 -fn_80132F70 = .text:0x80132F70; // type:function size:0x6C +draw__20dLytMapSaveCaption_cFv = .text:0x80132F70; // type:function size:0x6C getStateID__89sStateMgr_c<20dLytMapSaveCaption_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80132FE0; // type:function size:0x10 -fn_80132FF0 = .text:0x80132FF0; // type:function size:0xA0 -fn_80133090 = .text:0x80133090; // type:function size:0x19C +setType__20dLytMapSaveCaption_cFl = .text:0x80132FF0; // type:function size:0xA0 +setLabel__20dLytMapSaveCaption_cFPCc = .text:0x80133090; // type:function size:0x19C initializeState_Wait__16dLytMapSaveObj_cFv = .text:0x80133230; // type:function size:0x4 executeState_Wait__16dLytMapSaveObj_cFv = .text:0x80133240; // type:function size:0x78 changeState__85sStateMgr_c<16dLytMapSaveObj_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801332C0; // type:function size:0x10 @@ -7731,26 +7731,26 @@ finalizeState_ToWait__16dLytMapSaveObj_cFv = .text:0x80133570; // type:function initializeState_Decide__16dLytMapSaveObj_cFv = .text:0x80133580; // type:function size:0x4 executeState_Decide__16dLytMapSaveObj_cFv = .text:0x80133590; // type:function size:0x90 finalizeState_Decide__16dLytMapSaveObj_cFv = .text:0x80133620; // type:function size:0x4 -fn_80133630 = .text:0x80133630; // type:function size:0x20 -fn_80133650 = .text:0x80133650; // type:function size:0xC -fn_80133660 = .text:0x80133660; // type:function size:0xB0 -fn_80133710 = .text:0x80133710; // type:function size:0xF8 -fn_80133810 = .text:0x80133810; // type:function size:0x4C -fn_80133860 = .text:0x80133860; // type:function size:0x54 +setPosition__16dLytMapSaveObj_cFRC7mVec3_c = .text:0x80133630; // type:function size:0x20 +setAlpha__16dLytMapSaveObj_cFUc = .text:0x80133650; // type:function size:0xC +init__16dLytMapSaveObj_cFv = .text:0x80133660; // type:function size:0xB0 +build__16dLytMapSaveObj_cFPQ23d2d10ResAccIf_c = .text:0x80133710; // type:function size:0xF8 +remove__16dLytMapSaveObj_cFv = .text:0x80133810; // type:function size:0x4C +execute__16dLytMapSaveObj_cFv = .text:0x80133860; // type:function size:0x54 executeState__85sStateMgr_c<16dLytMapSaveObj_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801338C0; // type:function size:0x10 -fn_801338D0 = .text:0x801338D0; // type:function size:0x60 +draw__16dLytMapSaveObj_cFv = .text:0x801338D0; // type:function size:0x60 __ct__13dLytMapMain_cFv = .text:0x80133930; // type:function size:0x358 -fn_80133C90 = .text:0x80133C90; // type:function size:0x1C -fn_80133CB0 = .text:0x80133CB0; // type:function size:0x40 +__ct__16LytMap0x80520B5CFv = .text:0x80133C90; // type:function size:0x1C +__dt__16LytMap0x80520B5CFv = .text:0x80133CB0; // type:function size:0x40 __ct__16dLytMapCapture_cFv = .text:0x80133CF0; // type:function size:0xE0 __dt__29sFState_c<16dLytMapCapture_c>Fv = .text:0x80133DD0; // type:function size:0x58 __dt__32sFStateFct_c<16dLytMapCapture_c>Fv = .text:0x80133E30; // type:function size:0x6C __dt__85sStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80133EA0; // type:function size:0xA0 __dt__55sFStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c>Fv = .text:0x80133F40; // type:function size:0xA4 __dt__16dLytMapCapture_cFv = .text:0x80133FF0; // type:function size:0xB4 -__ct__20dLytMapFloorBtnMgr_cFPv = .text:0x801340B0; // type:function size:0x178 -__ct__20LytMapFourAnimGroupsFv = .text:0x80134230; // type:function size:0x140 -__ct__Q23d2d11dLytStructDFv = .text:0x80134370; // type:function size:0x48 +__ct__20dLytMapFloorBtnMgr_cFP15dLytMapGlobal_c = .text:0x801340B0; // type:function size:0x178 +__ct__24dLytMapFloorBtnAnmGroupsFv = .text:0x80134230; // type:function size:0x140 +__ct__20dCursorHitCheckLyt_cFv = .text:0x80134370; // type:function size:0x48 __ct__17dLytMapFloorBtn_cFv = .text:0x801343C0; // type:function size:0xAC __ct__25dLytMapPinIconAggregate_cFv = .text:0x80134470; // type:function size:0xF0 __dt__38sFState_c<25dLytMapPinIconAggregate_c>Fv = .text:0x80134560; // type:function size:0x58 @@ -7759,23 +7759,23 @@ __dt__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFState __dt__64sFStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c>Fv = .text:0x801346D0; // type:function size:0xA4 __ct__16dLytMapPinIcon_cFv = .text:0x80134780; // type:function size:0x134 __dt__25dLytMapPinIconAggregate_cFv = .text:0x801348C0; // type:function size:0xCC -fn_80134990 = .text:0x80134990; // type:function size:0x464 -fn_80134E00 = .text:0x80134E00; // type:function size:0x74 -fn_80134E80 = .text:0x80134E80; // type:function size:0x10 -fn_80134E90 = .text:0x80134E90; // type:function size:0x40 -fn_80134ED0 = .text:0x80134ED0; // type:function size:0x4 -fn_80134EE0 = .text:0x80134EE0; // type:function size:0x40 -fn_80134F20 = .text:0x80134F20; // type:function size:0x10 -fn_80134F30 = .text:0x80134F30; // type:function size:0x40 -fn_80134F70 = .text:0x80134F70; // type:function size:0xBC -fn_80135030 = .text:0x80135030; // type:function size:0x4 -fn_80135040 = .text:0x80135040; // type:function size:0x40 -fn_80135080 = .text:0x80135080; // type:function size:0x74 -fn_80135100 = .text:0x80135100; // type:function size:0x108 -fn_80135210 = .text:0x80135210; // type:function size:0x234 -fn_80135450 = .text:0x80135450; // type:function size:0x78 -fn_801354D0 = .text:0x801354D0; // type:function size:0x54 -fn_80135530 = .text:0x80135530; // type:function size:0x5C +__ct__16dLytMapMarkers_cFv = .text:0x80134990; // type:function size:0x464 +__dt__14dLytMapPopup_cFv = .text:0x80134E00; // type:function size:0x74 +__ct__17dLytMapPopupStateFv = .text:0x80134E80; // type:function size:0x10 +__dt__17dLytMapPopupStateFv = .text:0x80134E90; // type:function size:0x40 +__ct__24dLytMapIcon01DrawCommandFv = .text:0x80134ED0; // type:function size:0x4 +__dt__24dLytMapIcon01DrawCommandFv = .text:0x80134EE0; // type:function size:0x40 +__ct__18dLytMapPopupConfigFv = .text:0x80134F20; // type:function size:0x10 +__dt__18dLytMapPopupConfigFv = .text:0x80134F30; // type:function size:0x40 +__dt__15dLytMapIcon01_cFv = .text:0x80134F70; // type:function size:0xBC +__ct__24dLytMapIcon00DrawCommandFv = .text:0x80135030; // type:function size:0x4 +__dt__24dLytMapIcon00DrawCommandFv = .text:0x80135040; // type:function size:0x40 +__dt__14dLytMapPlace_cFv = .text:0x80135080; // type:function size:0x74 +__dt__15dLytMapIcon00_cFv = .text:0x80135100; // type:function size:0x108 +__dt__16dLytMapMarkers_cFv = .text:0x80135210; // type:function size:0x234 +__dt__19dLytMapFootPrints_cFv = .text:0x80135450; // type:function size:0x78 +__ct__16dLytMapPutIcon_cFv = .text:0x801354D0; // type:function size:0x54 +__dt__16dLytMapPutIcon_cFv = .text:0x80135530; // type:function size:0x5C __ct__16dLytMapSaveObj_cFv = .text:0x80135590; // type:function size:0xC8 __dt__29sFState_c<16dLytMapSaveObj_c>Fv = .text:0x80135660; // type:function size:0x58 __dt__32sFStateFct_c<16dLytMapSaveObj_c>Fv = .text:0x801356C0; // type:function size:0x6C @@ -7804,52 +7804,52 @@ __dt__26sFState_c<13dLytMapMain_c>Fv = .text:0x801363A0; // type:function size:0 __dt__29sFStateFct_c<13dLytMapMain_c>Fv = .text:0x80136400; // type:function size:0x6C __dt__82sStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80136470; // type:function size:0xA0 __dt__52sFStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c>Fv = .text:0x80136510; // type:function size:0xA4 -fn_801365C0 = .text:0x801365C0; // type:function size:0x4 -fn_801365D0 = .text:0x801365D0; // type:function size:0x40 +__ct__26dLytMapBoundingWorldBoundsFv = .text:0x801365C0; // type:function size:0x4 +__dt__26dLytMapBoundingWorldBoundsFv = .text:0x801365D0; // type:function size:0x40 __dt__13dLytMapMain_cFv = .text:0x80136610; // type:function size:0x608 -fn_80136C20 = .text:0x80136C20; // type:function size:0xC -fn_80136C30 = .text:0x80136C30; // type:function size:0xC8 -fn_80136D00 = .text:0x80136D00; // type:function size:0x6CC +getGlobal__13dLytMapMain_cFv = .text:0x80136C20; // type:function size:0xC +loadTextboxes__13dLytMapMain_cFv = .text:0x80136C30; // type:function size:0xC8 +build__13dLytMapMain_cFv = .text:0x80136D00; // type:function size:0x6CC changeState__82sStateMgr_c<13dLytMapMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801373D0; // type:function size:0x10 -fn_801373E0 = .text:0x801373E0; // type:function size:0xAC -fn_80137490 = .text:0x80137490; // type:function size:0x2E8 -fn_80137780 = .text:0x80137780; // type:function size:0x15C -fn_801378E0 = .text:0x801378E0; // type:function size:0x838 +loadStageProperties__13dLytMapMain_cFv = .text:0x801373E0; // type:function size:0xAC +setupStage__13dLytMapMain_cFv = .text:0x80137490; // type:function size:0x2E8 +remove__13dLytMapMain_cFv = .text:0x80137780; // type:function size:0x15C +execute__13dLytMapMain_cFv = .text:0x801378E0; // type:function size:0x838 getStateID__94sStateMgr_c<25dLytMapPinIconAggregate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80138120; // type:function size:0x10 draw__13dLytMapMain_cFv = .text:0x80138130; // type:function size:0x238 -fn_80138370 = .text:0x80138370; // type:function size:0x138 -fn_801384B0 = .text:0x801384B0; // type:function size:0x5C -fn_80138510 = .text:0x80138510; // type:function size:0x140 -fn_80138650 = .text:0x80138650; // type:function size:0x1E0 -fn_80138830 = .text:0x80138830; // type:function size:0x254 -fn_80138A90 = .text:0x80138A90; // type:function size:0x8C -fn_80138B20 = .text:0x80138B20; // type:function size:0x110 -fn_80138C30 = .text:0x80138C30; // type:function size:0x38 -fn_80138C70 = .text:0x80138C70; // type:function size:0xA4 -fn_80138D20 = .text:0x80138D20; // type:function size:0x5C -fn_80138D80 = .text:0x80138D80; // type:function size:0xB0 -fn_80138E30 = .text:0x80138E30; // type:function size:0xD4 -fn_80138F10 = .text:0x80138F10; // type:function size:0xA0 -fn_80138FB0 = .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 -fn_80139F00 = .text:0x80139F00; // type:function size:0x44 -fn_80139F50 = .text:0x80139F50; // type:function size:0xE8 -fn_8013A040 = .text:0x8013A040; // type:function size:0x3C -fn_8013A080 = .text:0x8013A080; // type:function size:0xE8 -fn_8013A170 = .text:0x8013A170; // type:function size:0xA84 -fn_8013AC00 = .text:0x8013AC00; // type:function size:0x4 -fn_8013AC10 = .text:0x8013AC10; // type:function size:0x138 -fn_8013AD50 = .text:0x8013AD50; // type:function size:0x370 -fn_8013B0C0 = .text:0x8013B0C0; // type:function size:0x28C +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 +canCenterCursor__13dLytMapMain_cCFl = .text:0x80138830; // type:function size:0x254 +needsNav__13dLytMapMain_cCFl = .text:0x80138A90; // type:function size:0x8C +getSelectedSaveObjIdx__13dLytMapMain_cCFv = .text:0x80138B20; // type:function size:0x110 +isPaneVisible__13dLytMapMain_cCFPQ34nw4r3lyt4Pane = .text:0x80138C30; // type:function size:0x38 +setSaveObjsVisible__13dLytMapMain_cFb = .text:0x80138C70; // type:function size:0xA4 +setSaveObjPanePtrs__13dLytMapMain_cFv = .text:0x80138D20; // type:function size:0x5C +initSaveObjs__13dLytMapMain_cFv = .text:0x80138D80; // type:function size:0xB0 +isPointingAtMainMap__13dLytMapMain_cCFv = .text:0x80138E30; // type:function size:0xD4 +canPlaceBeacons__13dLytMapMain_cFl = .text:0x80138F10; // type:function size:0xA0 +canResetPosition__13dLytMapMain_cCFlb = .text:0x80138FB0; // type:function size:0xA4 +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 +setCursorType__13dLytMapMain_cFv = .text:0x8013AC10; // type:function size:0x138 +fn_8013AD50__13dLytMapMain_cFv = .text:0x8013AD50; // type:function size:0x370 +calculateBoundingWorldHitboxes__13dLytMapMain_cFv = .text:0x8013B0C0; // type:function size:0x28C fn_8013B350 = .text:0x8013B350; // type:function size:0x10 initializeState_Invisible__13dLytMapMain_cFv = .text:0x8013B360; // type:function size:0x4 executeState_Invisible__13dLytMapMain_cFv = .text:0x8013B370; // type:function size:0x4 @@ -7857,16 +7857,16 @@ 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 -fn_8013C760 = .text:0x8013C760; // type:function size:0x100 -fn_8013C860 = .text:0x8013C860; // type:function size:0x1C -fn_8013C880 = .text:0x8013C880; // type:function size:0x64 -fn_8013C8F0 = .text:0x8013C8F0; // type:function size:0x644 -fn_8013CF40 = .text:0x8013CF40; // type:function size:0x54C +getAreaGroup__13dLytMapMain_cCFl = .text:0x8013C6B0; // type:function size:0xA8 +getRoomType__13dLytMapMain_cCFv = .text:0x8013C760; // type:function size:0x100 +canChangeFloor__13dLytMapMain_cCFl = .text:0x8013C860; // type:function size:0x1C +shouldDrawFootprints__13dLytMapMain_cCFv = .text:0x8013C880; // type:function size:0x64 +zoomIn__13dLytMapMain_cFv = .text:0x8013C8F0; // type:function size:0x644 +zoomOut__13dLytMapMain_cFv = .text:0x8013CF40; // type:function size:0x54C initializeState_Active__13dLytMapMain_cFv = .text:0x8013D490; // type:function size:0x4 executeState_Active__13dLytMapMain_cFv = .text:0x8013D4A0; // type:function size:0x65C finalizeState_Active__13dLytMapMain_cFv = .text:0x8013DB00; // type:function size:0x10 @@ -7888,7 +7888,7 @@ finalizeState_ChgDispAreaMode_Map__13dLytMapMain_cFv = .text:0x8013F2A0; // type initializeState_ChgDispAreaMode_WA__13dLytMapMain_cFv = .text:0x8013F2B0; // type:function size:0x594 executeState_ChgDispAreaMode_WA__13dLytMapMain_cFv = .text:0x8013F850; // type:function size:0x2CC finalizeState_ChgDispAreaMode_WA__13dLytMapMain_cFv = .text:0x8013FB20; // type:function size:0x50 -fn_8013FB70 = .text:0x8013FB70; // type:function size:0xC0 +fn_8013FB70__13dLytMapMain_cFRC7mVec3_cf = .text:0x8013FB70; // type:function size:0xC0 initializeState_ChgDispAreaMode_CsrRot__13dLytMapMain_cFv = .text:0x8013FC30; // type:function size:0x3C0 executeState_ChgDispAreaMode_CsrRot__13dLytMapMain_cFv = .text:0x8013FFF0; // type:function size:0x388 finalizeState_ChgDispAreaMode_CsrRot__13dLytMapMain_cFv = .text:0x80140380; // type:function size:0x4 @@ -7899,12 +7899,10 @@ initializeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x80140580; / executeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x801405C0; // type:function size:0xF4 finalizeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x801406C0; // type:function size:0x4 initializeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406D0; // type:function size:0x20 -executeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406F0; // type:function size:0x3C -fn_8014072C = .text:0x8014072C; // type:function size:0x4 +executeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406F0; // type:function size:0x40 finalizeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x80140730; // type:function size:0x4 initializeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140740; // type:function size:0x38 -executeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140780; // type:function size:0x34 -fn_801407B4 = .text:0x801407B4; // type:function size:0x4 +executeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140780; // type:function size:0x38 finalizeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x801407C0; // type:function size:0x4 initializeState_EventSwBankSmall_Step3__13dLytMapMain_cFv = .text:0x801407D0; // type:function size:0x18 executeState_EventSwBankSmall_Step3__13dLytMapMain_cFv = .text:0x801407F0; // type:function size:0x28 @@ -7921,10 +7919,9 @@ finalizeState_EventMapIntro_Step3__13dLytMapMain_cFv = .text:0x80140B10; // type initializeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B20; // type:function size:0x18 executeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B40; // type:function size:0x38 finalizeState_EventMapIntro_Step4__13dLytMapMain_cFv = .text:0x80140B80; // type:function size:0x4 -fn_80140B90 = .text:0x80140B90; // type:function size:0xBC +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:0x34 -fn_80140CA4 = .text:0x80140CA4; // type:function size:0x4 +executeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140C70; // type:function size:0x38 finalizeState_EventDungeonMapGet_Step1__13dLytMapMain_cFv = .text:0x80140CB0; // type:function size:0x4 initializeState_EventDungeonMapGet_Step2__13dLytMapMain_cFv = .text:0x80140CC0; // type:function size:0x68 executeState_EventDungeonMapGet_Step2__13dLytMapMain_cFv = .text:0x80140D30; // type:function size:0x12C @@ -7933,22 +7930,19 @@ initializeState_EventDungeonMapGet_Step3__13dLytMapMain_cFv = .text:0x80140E70; executeState_EventDungeonMapGet_Step3__13dLytMapMain_cFv = .text:0x80140E90; // type:function size:0x28 finalizeState_EventDungeonMapGet_Step3__13dLytMapMain_cFv = .text:0x80140EC0; // type:function size:0x4 initializeState_EventFieldMapChange_Step1__13dLytMapMain_cFv = .text:0x80140ED0; // type:function size:0x18 -executeState_EventFieldMapChange_Step1__13dLytMapMain_cFv = .text:0x80140EF0; // type:function size:0x34 -fn_80140F24 = .text:0x80140F24; // type:function size:0x4 +executeState_EventFieldMapChange_Step1__13dLytMapMain_cFv = .text:0x80140EF0; // type:function size:0x38 finalizeState_EventFieldMapChange_Step1__13dLytMapMain_cFv = .text:0x80140F30; // type:function size:0x4 initializeState_EventFieldMapChange_Step2__13dLytMapMain_cFv = .text:0x80140F40; // type:function size:0x28 executeState_EventFieldMapChange_Step2__13dLytMapMain_cFv = .text:0x80140F70; // type:function size:0xBC finalizeState_EventFieldMapChange_Step2__13dLytMapMain_cFv = .text:0x80141030; // type:function size:0x4 initializeState_EventFieldMapChange_Step3__13dLytMapMain_cFv = .text:0x80141040; // type:function size:0x18 -executeState_EventFieldMapChange_Step3__13dLytMapMain_cFv = .text:0x80141060; // type:function size:0x58 -fn_801410B8 = .text:0x801410B8; // type:function size:0x4 +executeState_EventFieldMapChange_Step3__13dLytMapMain_cFv = .text:0x80141060; // type:function size:0x5C finalizeState_EventFieldMapChange_Step3__13dLytMapMain_cFv = .text:0x801410C0; // type:function size:0x4 initializeState_EventFieldMapChange_Step4__13dLytMapMain_cFv = .text:0x801410D0; // type:function size:0x4 executeState_EventFieldMapChange_Step4__13dLytMapMain_cFv = .text:0x801410E0; // type:function size:0x4 finalizeState_EventFieldMapChange_Step4__13dLytMapMain_cFv = .text:0x801410F0; // type:function size:0x4 initializeState_EventForestMapChange_Step1__13dLytMapMain_cFv = .text:0x80141100; // type:function size:0x18 -executeState_EventForestMapChange_Step1__13dLytMapMain_cFv = .text:0x80141120; // type:function size:0x34 -fn_80141154 = .text:0x80141154; // type:function size:0x4 +executeState_EventForestMapChange_Step1__13dLytMapMain_cFv = .text:0x80141120; // type:function size:0x38 finalizeState_EventForestMapChange_Step1__13dLytMapMain_cFv = .text:0x80141160; // type:function size:0x4 initializeState_EventForestMapChange_Step2__13dLytMapMain_cFv = .text:0x80141170; // type:function size:0x6C executeState_EventForestMapChange_Step2__13dLytMapMain_cFv = .text:0x801411E0; // type:function size:0x12C @@ -7963,11 +7957,10 @@ initializeState_EventSignalAdd_Step2__13dLytMapMain_cFv = .text:0x80141400; // t executeState_EventSignalAdd_Step2__13dLytMapMain_cFv = .text:0x80141420; // type:function size:0x90 finalizeState_EventSignalAdd_Step2__13dLytMapMain_cFv = .text:0x801414B0; // type:function size:0x4 initializeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x801414C0; // type:function size:0x18 -executeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x801414E0; // type:function size:0x34 -fn_80141514 = .text:0x80141514; // type:function size:0x4 +executeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x801414E0; // type:function size:0x38 finalizeState_EventSignalAdd_Step3__13dLytMapMain_cFv = .text:0x80141520; // type:function size:0x4 -fn_80141530 = .text:0x80141530; // type:function size:0x48 -findGoddessChestWithStoryflag = .text:0x80141580; // type:function size:0x94 +fn_80141530__13dLytMapMain_cCFv = .text:0x80141530; // type:function size:0x48 +findGoddessChestForStoryflag__13dLytMapMain_cCFl = .text:0x80141580; // type:function size:0x94 initializeState_EventGoddessCube_Step1__13dLytMapMain_cFv = .text:0x80141620; // type:function size:0x10 executeState_EventGoddessCube_Step1__13dLytMapMain_cFv = .text:0x80141630; // type:function size:0x44 finalizeState_EventGoddessCube_Step1__13dLytMapMain_cFv = .text:0x80141680; // type:function size:0x10 @@ -7977,41 +7970,41 @@ finalizeState_EventGoddessCube_Step2__13dLytMapMain_cFv = .text:0x80141E40; // t initializeState_EventGoddessCube_Step3__13dLytMapMain_cFv = .text:0x80141E50; // type:function size:0x4 executeState_EventGoddessCube_Step3__13dLytMapMain_cFv = .text:0x80141E60; // type:function size:0x18 finalizeState_EventGoddessCube_Step3__13dLytMapMain_cFv = .text:0x80141E80; // type:function size:0x4 -checkStoryflag = .text:0x80141E90; // type:function size:0x44 +checkStoryflag__13dLytMapMain_cCFl = .text:0x80141E90; // type:function size:0x44 initializeState_EventSaveObjMsgWindow__13dLytMapMain_cFv = .text:0x80141EE0; // type:function size:0x90 executeState_EventSaveObjMsgWindow__13dLytMapMain_cFv = .text:0x80141F70; // type:function size:0x54 finalizeState_EventSaveObjMsgWindow__13dLytMapMain_cFv = .text:0x80141FD0; // type:function size:0x4 -whatBirdStatuesToShow = .text:0x80141FE0; // type:function size:0x1D4 +displaySaveObjs__13dLytMapMain_cFv = .text:0x80141FE0; // type:function size:0x1D4 initializeState_EventSaveObjSelect__13dLytMapMain_cFv = .text:0x801421C0; // type:function size:0x4 executeState_EventSaveObjSelect__13dLytMapMain_cFv = .text:0x801421D0; // type:function size:0x278 getStateID__85sStateMgr_c<16dLytMapSaveObj_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80142450; // type:function size:0x10 finalizeState_EventSaveObjSelect__13dLytMapMain_cFv = .text:0x80142460; // type:function size:0x4 -getStatueSelectDestinationStruct = .text:0x80142470; // type:function size:0xEC +getSaveObjDefinition__13dLytMapMain_cCFll = .text:0x80142470; // type:function size:0xEC initializeState_EventSaveObjConfirmMsgWindow__13dLytMapMain_cFv = .text:0x80142560; // type:function size:0x18 executeState_EventSaveObjConfirmMsgWindow__13dLytMapMain_cFv = .text:0x80142580; // type:function size:0x19C finalizeState_EventSaveObjConfirmMsgWindow__13dLytMapMain_cFv = .text:0x80142720; // type:function size:0x4 initializeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142730; // type:function size:0x4 executeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142740; // type:function size:0x4 finalizeState_EventSaveObjDecide__13dLytMapMain_cFv = .text:0x80142750; // type:function size:0x4 -fn_80142760 = .text:0x80142760; // type:function size:0x190 -fn_801428F0 = .text:0x801428F0; // type:function size:0xB4 +checkCursorPointedAtMap__13dLytMapMain_cFv = .text:0x80142760; // type:function size:0x190 +dLytMapMain_vt0x10__13dLytMapMain_cFv = .text:0x801428F0; // type:function size:0xB4 fn_801429B0 = .text:0x801429B0; // type:function size:0x1D8 fn_80142B90 = .text:0x80142B90; // type:function size:0xEC -fn_80142C80 = .text:0x80142C80; // type:function size:0x8C -fn_80142D10 = .text:0x80142D10; // type:function size:0x80 -fn_80142D90 = .text:0x80142D90; // type:function size:0x170 -fn_80142F00 = .text:0x80142F00; // type:function size:0x158 -fn_80143060 = .text:0x80143060; // type:function size:0xBC -fn_80143120 = .text:0x80143120; // type:function size:0xC0 -fn_801431E0 = .text:0x801431E0; // type:function size:0x11C -fn_80143300 = .text:0x80143300; // type:function size:0x54 -fn_80143360 = .text:0x80143360; // type:function size:0x1D4 -fn_80143540 = .text:0x80143540; // type:function size:0x374 -fn_801438C0 = .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_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 +fn_80143060__13dLytMapMain_cFR7mVec3_cRC7mVec3_cRC7mVec3_cRC4mAng = .text:0x80143060; // type:function size:0xBC +fn_80143120__13dLytMapMain_cFl = .text:0x80143120; // type:function size:0xC0 +fn_801431E0__13dLytMapMain_cFv = .text:0x801431E0; // type:function size:0x11C +fn_80143300__13dLytMapMain_cFv = .text:0x80143300; // type:function size:0x54 +fn_80143360__13dLytMapMain_cFv = .text:0x80143360; // type:function size:0x1D4 +checkScroll__13dLytMapMain_cFv = .text:0x80143540; // type:function size:0x374 +build__9dLytMap_cFv = .text:0x801438C0; // type:function size:0x6C +remove__9dLytMap_cFv = .text:0x80143930; // type:function size:0x60 +execute__9dLytMap_cFv = .text:0x80143990; // type:function size:0x4C +draw__9dLytMap_cFv = .text:0x801439E0; // type:function size:0x4C +fadeOut__9dLytMap_cFv = .text:0x80143A30; // type:function size:0x70 getName__20dLytMapFloorBtnMgr_cCFv = .text:0x80143AA0; // type:function size:0x8 getLyt__20dLytMapFloorBtnMgr_cFv = .text:0x80143AB0; // type:function size:0x8 getPane__20dLytMapFloorBtnMgr_cFv = .text:0x80143AC0; // type:function size:0x8 @@ -9894,46 +9887,46 @@ fn_80179240 = .text:0x80179240; // type:function size:0x4 fn_80179250 = .text:0x80179250; // type:function size:0x34 fn_80179290 = .text:0x80179290; // type:function size:0x18 ActorDoorBase__initList = .text:0x801792B0; // type:function size:0x14 -checkHasMap = .text:0x801792D0; // type:function size:0x68 -projectForMapMaybe2 = .text:0x80179340; // type:function size:0x2C -fn_80179370 = .text:0x80179370; // type:function size:0x16C -fn_801794E0 = .text:0x801794E0; // type:function size:0x58 -fn_80179540 = .text:0x80179540; // type:function size:0x104 -fn_80179650 = .text:0x80179650; // type:function size:0xA8 -fn_80179700 = .text:0x80179700; // type:function size:0xB4 -fn_801797C0 = .text:0x801797C0; // type:function size:0x94 -fn_80179860 = .text:0x80179860; // type:function size:0x3C -fn_801798A0 = .text:0x801798A0; // type:function size:0x94 -fn_80179940 = .text:0x80179940; // type:function size:0xD4 -fn_80179A20 = .text:0x80179A20; // type:function size:0xF4 -fn_80179B20 = .text:0x80179B20; // type:function size:0xAC -fn_80179BD0 = .text:0x80179BD0; // type:function size:0x234 -fn_80179E10 = .text:0x80179E10; // type:function size:0x58 -fn_80179E70 = .text:0x80179E70; // type:function size:0xBC -fn_80179F30 = .text:0x80179F30; // type:function size:0xA8 -fn_80179FE0 = .text:0x80179FE0; // type:function size:0xB4 -fn_8017A0A0 = .text:0x8017A0A0; // type:function size:0x3C +checkHasMap__Fv = .text:0x801792D0; // type:function size:0x68 +projectOntoMap__FRC7mVec3_cR7mVec2_c = .text:0x80179340; // type:function size:0x2C +build__14dLytMapPopup_cFPQ23d2d10ResAccIf_c = .text:0x80179370; // type:function size:0x16C +remove__14dLytMapPopup_cFv = .text:0x801794E0; // type:function size:0x58 +execute__14dLytMapPopup_cFv = .text:0x80179540; // type:function size:0x104 +draw__14dLytMapPopup_cFv = .text:0x80179650; // type:function size:0xA8 +setLabel__14dLytMapPopup_cFPCc = .text:0x80179700; // type:function size:0xB4 +realizeText__14dLytMapPopup_cFv = .text:0x801797C0; // type:function size:0x94 +getTextRenderWidth__14dLytMapPopup_cCFv = .text:0x80179860; // type:function size:0x3C +setInout__14dLytMapPopup_cFf = .text:0x801798A0; // type:function size:0x94 +setInitialState__14dLytMapPopup_cFv = .text:0x80179940; // type:function size:0xD4 +updateScale__14dLytMapPopup_cFv = .text:0x80179A20; // type:function size:0xF4 +checkMapMode__14dLytMapPopup_cFv = .text:0x80179B20; // type:function size:0xAC +build__14dLytMapPlace_cFPQ23d2d10ResAccIf_c = .text:0x80179BD0; // type:function size:0x234 +remove__14dLytMapPlace_cFv = .text:0x80179E10; // type:function size:0x58 +execute__14dLytMapPlace_cFv = .text:0x80179E70; // type:function size:0xBC +draw__14dLytMapPlace_cFv = .text:0x80179F30; // type:function size:0xA8 +setLabel__14dLytMapPlace_cFPCc = .text:0x80179FE0; // type:function size:0xB4 +realize__14dLytMapPlace_cFv = .text:0x8017A0A0; // type:function size:0x3C fn_8017A0E0 = .text:0x8017A0E0; // type:function size:0x2A8 -fn_8017A390 = .text:0x8017A390; // type:function size:0x84 +setInout__14dLytMapPlace_cFf = .text:0x8017A390; // type:function size:0x84 fn_8017A420 = .text:0x8017A420; // type:function size:0x78 -fn_8017A4A0 = .text:0x8017A4A0; // type:function size:0x94 -fn_8017A540 = .text:0x8017A540; // type:function size:0x11C -fn_8017A660 = .text:0x8017A660; // type:function size:0xF4 -fn_8017A760 = .text:0x8017A760; // type:function size:0x78 -fn_8017A7E0 = .text:0x8017A7E0; // type:function size:0x78 -fn_8017A860 = .text:0x8017A860; // type:function size:0x138 -fn_8017A9A0 = .text:0x8017A9A0; // type:function size:0x688 -fn_8017B030 = .text:0x8017B030; // type:function size:0x70 -fn_8017B0A0 = .text:0x8017B0A0; // type:function size:0x2B8 -fn_8017B360 = .text:0x8017B360; // type:function size:0x704 -fn_8017BA70 = .text:0x8017BA70; // type:function size:0x4FC -setMapIcons = .text:0x8017BF70; // type:function size:0x2C8 -fn_8017C240 = .text:0x8017C240; // type:function size:0x98 -fn_8017C2E0 = .text:0x8017C2E0; // type:function size:0xA0 -fn_8017C380 = .text:0x8017C380; // type:function size:0xA0 -forGoddessStatueOnSkyFieldMap = .text:0x8017C420; // type:function size:0x74 -fn_8017C4A0 = .text:0x8017C4A0; // type:function size:0xA0 -fn_8017C540 = .text:0x8017C540; // type:function size:0x1C +setColor__14dLytMapPlace_cFUl = .text:0x8017A4A0; // type:function size:0x94 +setInitialState__14dLytMapPlace_cFv = .text:0x8017A540; // type:function size:0x11C +updateScale__14dLytMapPlace_cFv = .text:0x8017A660; // type:function size:0xF4 +realizeText__14dLytMapPlace_cFv = .text:0x8017A760; // type:function size:0x78 +realizeTextSize__14dLytMapPlace_cFv = .text:0x8017A7E0; // type:function size:0x78 +realizeBgSize__14dLytMapPlace_cFv = .text:0x8017A860; // type:function size:0x138 +build__15dLytMapIcon01_cFPQ23d2d10ResAccIf_c = .text:0x8017A9A0; // type:function size:0x688 +remove__15dLytMapIcon01_cFv = .text:0x8017B030; // type:function size:0x70 +execute__15dLytMapIcon01_cFv = .text:0x8017B0A0; // type:function size:0x2B8 +draw__15dLytMapIcon01_cFv = .text:0x8017B360; // type:function size:0x704 +resetDrawCommands__15dLytMapIcon01_cFv = .text:0x8017BA70; // type:function size:0x4FC +loadFlags__15dLytMapIcon01_cFv = .text:0x8017BF70; // type:function size:0x2C8 +setLinkTunic__15dLytMapIcon01_cFl = .text:0x8017C240; // type:function size:0x98 +setAreaLight__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C2E0; // type:function size:0xA0 +setCloud__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C380; // type:function size:0xA0 +setGoddessStatue__15dLytMapIcon01_cFUl = .text:0x8017C420; // type:function size:0x74 +setSaveObj__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C4A0; // type:function size:0xA0 +setTerry__15dLytMapIcon01_cFb = .text:0x8017C540; // type:function size:0x1C fn_8017C560 = .text:0x8017C560; // type:function size:0x80 fn_8017C5E0 = .text:0x8017C5E0; // type:function size:0x80 fn_8017C660 = .text:0x8017C660; // type:function size:0x80 @@ -9949,52 +9942,52 @@ fn_8017CAF0 = .text:0x8017CAF0; // type:function size:0xC fn_8017CB00 = .text:0x8017CB00; // type:function size:0xC fn_8017CB10 = .text:0x8017CB10; // type:function size:0xC fn_8017CB20 = .text:0x8017CB20; // type:function size:0xC -fn_8017CB30 = .text:0x8017CB30; // type:function size:0xB8 -fn_8017CBF0 = .text:0x8017CBF0; // type:function size:0xB8 -fn_8017CCB0 = .text:0x8017CCB0; // type:function size:0xAC -fn_8017CD60 = .text:0x8017CD60; // type:function size:0xAC -fn_8017CE10 = .text:0x8017CE10; // type:function size:0x150 -fn_8017CF60 = .text:0x8017CF60; // type:function size:0xFC -fn_8017D060 = .text:0x8017D060; // type:function size:0xF4 -fn_8017D160 = .text:0x8017D160; // type:function size:0x17C -fn_8017D2E0 = .text:0x8017D2E0; // type:function size:0xB4 -fn_8017D3A0 = .text:0x8017D3A0; // type:function size:0xB4 -fn_8017D460 = .text:0x8017D460; // type:function size:0x3E4 -fn_8017D850 = .text:0x8017D850; // type:function size:0x3F4 -fn_8017DC50 = .text:0x8017DC50; // type:function size:0x398 -fn_8017DFF0 = .text:0x8017DFF0; // type:function size:0x478 -fn_8017E470 = .text:0x8017E470; // type:function size:0x2B0 -fn_8017E720 = .text:0x8017E720; // type:function size:0x190 -fn_8017E8B0 = .text:0x8017E8B0; // type:function size:0xFC -fn_8017E9B0 = .text:0x8017E9B0; // type:function size:0xA20 -fn_8017F3D0 = .text:0x8017F3D0; // type:function size:0x110 -fn_8017F4E0 = .text:0x8017F4E0; // type:function size:0x1C0 -fn_8017F6A0 = .text:0x8017F6A0; // type:function size:0x1D8 -fn_8017F880 = .text:0x8017F880; // type:function size:0xA8 -fn_8017F930 = .text:0x8017F930; // type:function size:0x268 -fn_8017FBA0 = .text:0x8017FBA0; // type:function size:0x954 -fn_80180500 = .text:0x80180500; // type:function size:0x750 -fn_80180C50 = .text:0x80180C50; // type:function size:0x1C8 -fn_80180E20 = .text:0x80180E20; // type:function size:0x134 -fn_80180F60 = .text:0x80180F60; // type:function size:0x240 -fn_801811A0 = .text:0x801811A0; // type:function size:0x50 -fn_801811F0 = .text:0x801811F0; // type:function size:0x14C -fn_80181340 = .text:0x80181340; // type:function size:0x1B8 -fn_80181500 = .text:0x80181500; // type:function size:0xC8 -fn_801815D0 = .text:0x801815D0; // type:function size:0x130 -fn_80181700 = .text:0x80181700; // type:function size:0x178 -fn_80181880 = .text:0x80181880; // type:function size:0xC4 -fn_80181950 = .text:0x80181950; // type:function size:0x30 -fn_80181980 = .text:0x80181980; // type:function size:0x64 -fn_801819F0 = .text:0x801819F0; // type:function size:0xB0 -fn_80181AA0 = .text:0x80181AA0; // type:function size:0x11C -fn_80181BC0 = .text:0x80181BC0; // type:function size:0x78 -fn_80181C40 = .text:0x80181C40; // type:function size:0x94 -fn_80181CE0 = .text:0x80181CE0; // type:function size:0x68C -fn_80182370 = .text:0x80182370; // type:function size:0x78 -fn_801823F0 = .text:0x801823F0; // type:function size:0x28C -fn_80182680 = .text:0x80182680; // type:function size:0x8C8 -fn_80182F50 = .text:0x80182F50; // type:function size:0x42C +drawWithAnimIn__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Panef = .text:0x8017CB30; // type:function size:0xB8 +drawWithAnimOut__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Panef = .text:0x8017CBF0; // type:function size:0xB8 +drawFullyIn__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017CCB0; // type:function size:0xAC +checkMapMode__15dLytMapIcon01_cFv = .text:0x8017CD60; // type:function size:0xAC +setupActorDrawCommands__15dLytMapIcon01_cFv = .text:0x8017CE10; // type:function size:0x150 +setupNpcKenseiDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017CF60; // type:function size:0xFC +setupTboxDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D060; // type:function size:0xF4 +setupTboxDrawCommandClosed__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D160; // type:function size:0x17C +setupTboxDrawCommandOpen__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D2E0; // type:function size:0xB4 +setupTboxDrawCommandGoddessClosed__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D3A0; // type:function size:0xB4 +setupObjShutterDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D460; // type:function size:0x3E4 +setupObjDoorDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D850; // type:function size:0x3F4 +setupObjSaveDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017DC50; // type:function size:0x398 +setupObjLightLineDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017DFF0; // type:function size:0x478 +setupNpcBNusiDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E470; // type:function size:0x2B0 +setupObjTerryShopDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E720; // type:function size:0x190 +setupObjRoAtTargetDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E8B0; // type:function size:0xFC +setupObjD3DummyDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E9B0; // type:function size:0xA20 +setupObjSealedDoorDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F3D0; // type:function size:0x110 +setupObjHarpHintDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F4E0; // type:function size:0x1C0 +setupNpcBeeDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F6A0; // type:function size:0x1D8 +setupStageDrawCommands__15dLytMapIcon01_cFv = .text:0x8017F880; // type:function size:0xA8 +setupTgMapMarkDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F930; // type:function size:0x268 +setupTgMapMarkDrawCommand1__15dLytMapIcon01_cFP12dTgMapMark_c = .text:0x8017FBA0; // type:function size:0x954 +setupTgMapMarkDrawCommand2__15dLytMapIcon01_cFP12dTgMapMark_c = .text:0x80180500; // type:function size:0x750 +setupTgMapInstDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180C50; // type:function size:0x1C8 +setupTgForceGetFlagDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180E20; // type:function size:0x134 +setupTgInsectDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180F60; // type:function size:0x240 +setupLinkDrawCommand__15dLytMapIcon01_cFv = .text:0x801811A0; // type:function size:0x50 +setupLinkDrawCommand1__15dLytMapIcon01_cFP7dAcPy_c = .text:0x801811F0; // type:function size:0x14C +setupLinkDrawCommand2__15dLytMapIcon01_cFv = .text:0x80181340; // type:function size:0x1B8 +setupCloudBigDrawCommand__15dLytMapIcon01_cFv = .text:0x80181500; // type:function size:0xC8 +setupTriforceDrawCommands__15dLytMapIcon01_cFv = .text:0x801815D0; // type:function size:0x130 +updateScale__15dLytMapIcon01_cFv = .text:0x80181700; // type:function size:0x178 +fn_80181880__15dLytMapIcon01_cCFPQ34nw4r3lyt4PanePQ34nw4r3lyt4PaneR7mVec2_c = .text:0x80181880; // type:function size:0xC4 +recordAnimVisState__15dLytMapIcon01_cFv = .text:0x80181950; // type:function size:0x30 +transitionAnims__15dLytMapIcon01_cFv = .text:0x80181980; // type:function size:0x64 +checkBoundingPointing__15dLytMapIcon01_cFv = .text:0x801819F0; // type:function size:0xB0 +sortPanes__15dLytMapIcon01_cFv = .text:0x80181AA0; // type:function size:0x11C +isPointingAtBounding__15dLytMapIcon01_cCFPQ34nw4r3lyt4Pane = .text:0x80181BC0; // type:function size:0x78 +fn_80181C40__15dLytMapIcon01_cFv = .text:0x80181C40; // type:function size:0x94 +build__15dLytMapIcon00_cFPQ23d2d10ResAccIf_c = .text:0x80181CE0; // type:function size:0x68C +remove__15dLytMapIcon00_cFv = .text:0x80182370; // type:function size:0x78 +execute__15dLytMapIcon00_cFv = .text:0x801823F0; // type:function size:0x28C +draw__15dLytMapIcon00_cFv = .text:0x80182680; // type:function size:0x8C8 +resetDrawCommands__15dLytMapIcon00_cFv = .text:0x80182F50; // type:function size:0x42C checksDungeonCompletionFlags = .text:0x80183380; // type:function size:0x1C0 fn_80183540 = .text:0x80183540; // type:function size:0x8 fn_80183550 = .text:0x80183550; // type:function size:0x8 @@ -10062,15 +10055,15 @@ fn_80189530 = .text:0x80189530; // type:function size:0x80 fn_801895B0 = .text:0x801895B0; // type:function size:0x114 fn_801896D0 = .text:0x801896D0; // type:function size:0x78 fn_80189750 = .text:0x80189750; // type:function size:0x74 -fn_801897D0 = .text:0x801897D0; // type:function size:0x168 -fn_80189940 = .text:0x80189940; // type:function size:0x8C -fn_801899D0 = .text:0x801899D0; // type:function size:0xEC -fn_80189AC0 = .text:0x80189AC0; // type:function size:0x68 -fn_80189B30 = .text:0x80189B30; // type:function size:0x50 +build__16dLytMapMarkers_cFPQ23d2d10ResAccIf_c = .text:0x801897D0; // type:function size:0x168 +remove__16dLytMapMarkers_cFv = .text:0x80189940; // type:function size:0x8C +execute__16dLytMapMarkers_cFv = .text:0x801899D0; // type:function size:0xEC +draw__16dLytMapMarkers_cFv = .text:0x80189AC0; // type:function size:0x68 +setIslandNamesOn__16dLytMapMarkers_cFb = .text:0x80189B30; // type:function size:0x50 fn_80189B80 = .text:0x80189B80; // type:function size:0x4 -fn_80189B90 = .text:0x80189B90; // type:function size:0x27C -fn_80189E10 = .text:0x80189E10; // type:function size:0xF4 -fn_80189F10 = .text:0x80189F10; // type:function size:0x8C +drawPopups__16dLytMapMarkers_cFv = .text:0x80189B90; // type:function size:0x27C +resetPopups__16dLytMapMarkers_cFv = .text:0x80189E10; // type:function size:0xF4 +loadPopups__16dLytMapMarkers_cFv = .text:0x80189F10; // type:function size:0x8C getPouchSlotCount__Fb = .text:0x80189FA0; // type:function size:0x6C isPouchItem = .text:0x8018A010; // type:function size:0x88 isItemShield__Fl = .text:0x8018A0A0; // type:function size:0x18 @@ -10108,11 +10101,11 @@ fn_8018B230 = .text:0x8018B230; // type:function size:0x74 ActorLink__handleHotPumpkinSoup = .text:0x8018B2B0; // type:function size:0xE4 fn_8018B3A0 = .text:0x8018B3A0; // type:function size:0x80 shouldDropItemForChance = .text:0x8018B420; // type:function size:0x84 -getBeaconCount = .text:0x8018B4B0; // type:function size:0x44 -fn_8018B500 = .text:0x8018B500; // type:function size:0x40 +getMaxBeaconCount__Fv = .text:0x8018B4B0; // type:function size:0x44 +doesStageForbidBeaconPlacement__Fv = .text:0x8018B500; // type:function size:0x40 getBeaconPositionByIndex = .text:0x8018B540; // type:function size:0x60 -placeBeacon = .text:0x8018B5A0; // type:function size:0x7C -placeBeaconButCheckGround = .text:0x8018B620; // type:function size:0x194 +setBeaconPosition__FPC7mVec3_cUl = .text:0x8018B5A0; // type:function size:0x7C +setBeaconPositionChecked__FPC7mVec3_cUl = .text:0x8018B620; // type:function size:0x194 fn_8018B7C0 = .text:0x8018B7C0; // type:function size:0x40 fn_8018B800 = .text:0x8018B800; // type:function size:0x24 fn_8018B830 = .text:0x8018B830; // type:function size:0x4 @@ -10420,11 +10413,11 @@ GoddessChestsOpenedCounter__getMaxGoddessChests = .text:0x80194820; // type:func GoddessChestsOpenedCounter__init = .text:0x80194830; // type:function size:0x3C angleToRotate = .text:0x80194870; // type:function size:0x194 fn_80194A10 = .text:0x80194A10; // type:function size:0xC -fn_80194A20 = .text:0x80194A20; // type:function size:0xC -fn_80194A30 = .text:0x80194A30; // type:function size:0x24 +getStatueType__10dAcOSave_cCFv = .text:0x80194A20; // type:function size:0xC +getStatueNameId__10dAcOSave_cCFv = .text:0x80194A30; // type:function size:0x24 fn_80194A60 = .text:0x80194A60; // type:function size:0x2C fn_80194A90 = .text:0x80194A90; // type:function size:0x58 -fn_80194AF0 = .text:0x80194AF0; // type:function size:0x28 +checkStatueFlag__10dAcOSave_cCFv = .text:0x80194AF0; // type:function size:0x28 fn_80194B20 = .text:0x80194B20; // type:function size:0x8 fn_80194B30 = .text:0x80194B30; // type:function size:0x44 fn_80194B80 = .text:0x80194B80; // type:function size:0x8 @@ -10579,12 +10572,12 @@ 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 +getSTIFRoomType__11dStageMgr_cCFv = .text:0x80199B40; // type:function size:0x1C fn_80199B60 = .text:0x80199B60; // type:function size:0xC fn_80199B70 = .text:0x80199B70; // type:function size:0x1C fn_80199B90 = .text:0x80199B90; // type:function size:0x3A8 @@ -10728,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 @@ -10975,8 +10968,8 @@ fadeOut__8dStage_cFlUs = .text:0x801B3DB0; // type:function size:0xA8 forceFadeOut__8dStage_cFv = .text:0x801B3E60; // type:function size:0x40 forceFadeIn__8dStage_cFv = .text:0x801B3EA0; // type:function size:0x40 fn_801B3EE0__8dStage_cFv = .text:0x801B3EE0; // type:function size:0x3C -fn_801B3F20 = .text:0x801B3F20; // type:function size:0x8 -fn_801B3F30 = .text:0x801B3F30; // type:function size:0x8 +fn_801B3F20__8dStage_cFv = .text:0x801B3F20; // type:function size:0x8 +fn_801B3F30__8dStage_cFv = .text:0x801B3F30; // type:function size:0x8 drawMap__8dStage_cFP6mMtx_ci = .text:0x801B3F40; // type:function size:0x90 RoomManager__getRMPLForRoom = .text:0x801B3FD0; // type:function size:0x34 getFlagPositionForRoomVisit__FiPUsPUs = .text:0x801B4010; // type:function size:0x34 @@ -11009,7 +11002,7 @@ fn_801B4C90 = .text:0x801B4C90; // type:function size:0x1C fn_801B4CB0 = .text:0x801B4CB0; // type:function size:0x1C fn_801B4CD0 = .text:0x801B4CD0; // type:function size:0x78 fn_801B4D50 = .text:0x801B4D50; // type:function size:0x1BC -fn_801B4F10 = .text:0x801B4F10; // type:function size:0x1AC +fn_801B4F10__10MapRelatedCFlRC7mVec3_c = .text:0x801B4F10; // type:function size:0x1AC fn_801B50C0 = .text:0x801B50C0; // type:function size:0xB8 fn_801B5180 = .text:0x801B5180; // type:function size:0x7F0 fn_801B5970 = .text:0x801B5970; // type:function size:0x38 @@ -13507,7 +13500,7 @@ AcItem__isLifeTreeFruit = .text:0x80251060; // type:function size:0x8 AcItem__isItemAnyRupee = .text:0x80251070; // type:function size:0x34 AcItem__isItemAnyTear = .text:0x802510B0; // type:function size:0x8 AcItem__isBombRefill = .text:0x802510C0; // type:function size:0x8 -AcItem__isAnyTriforce = .text:0x802510D0; // type:function size:0x8 +isTriforce__9dAcItem_cCFv = .text:0x802510D0; // type:function size:0x8 fn_802510E0 = .text:0x802510E0; // type:function size:0x44 fn_80251130 = .text:0x80251130; // type:function size:0x44 fn_80251180 = .text:0x80251180; // type:function size:0x44 @@ -31161,8 +31154,8 @@ lbl_80510D84 = .data:0x80510D84; // type:object size:0xC StoryflagManager__STORYFLAG_DEFINITIONS = .data:0x80510D90; // type:object size:0x964 ItemflagManager__ITEMFLAG_DEFINITIONS = .data:0x805116F4; // type:object size:0x3FC DungeonflagManager__FLAG_DEFINITIONS = .data:0x80511AF0; // type:object size:0x28 -lbl_80511B18 = .data:0x80511B18; // type:object size:0xC -lbl_80511B24 = .data:0x80511B24; // type:object size:0xC +__vt__10dFlowMgr_c = .data:0x80511B18; // type:object size:0xC +__vt__14dFlowMgrBase_c = .data:0x80511B24; // type:object size:0xC ActorLytBase__vtable = .data:0x80511B30; // type:object size:0x50 lbl_80511B80 = .data:0x80511B80; // type:object size:0x1C lbl_80511B9C = .data:0x80511B9C; // type:object size:0xC @@ -33466,15 +33459,15 @@ __vt__17dLytAutoExplain_c = .data:0x8051E870; // type:object size:0x44 __vt__32sFStateID_c<17dLytAutoExplain_c> = .data:0x8051E9D4; // type:object size:0x34 scope:weak lbl_8051EA08 = .data:0x8051EA08; // type:object size:0xA0 data:4byte lbl_8051EAA8 = .data:0x8051EAA8; // type:object size:0x38 -lbl_8051EAE0 = .data:0x8051EAE0; // type:object size:0x14 -lbl_8051EAF4 = .data:0x8051EAF4; // type:object size:0xC +lbl_8051EAE0 = .data:0x8051EAE0; // type:object size:0x13 data:string +lbl_8051EAF4 = .data:0x8051EAF4; // type:object size:0x9 data:string lbl_8051EB00 = .data:0x8051EB00; // type:object size:0x14 data:string lbl_8051EB14 = .data:0x8051EB14; // type:object size:0x1C lbl_8051EB30 = .data:0x8051EB30; // type:object size:0xC lbl_8051EB3C = .data:0x8051EB3C; // type:object size:0x1C lbl_8051EB58 = .data:0x8051EB58; // type:object size:0x1C lbl_8051EB74 = .data:0x8051EB74; // type:object size:0xC -lbl_8051EB80 = .data:0x8051EB80; // type:object size:0xC +lbl_8051EB80 = .data:0x8051EB80; // type:object size:0xA data:string lbl_8051EB8C = .data:0x8051EB8C; // type:object size:0x10 lbl_8051EB9C = .data:0x8051EB9C; // type:object size:0x10 lbl_8051EBAC = .data:0x8051EBAC; // type:object size:0x10 @@ -33500,8 +33493,10 @@ lbl_8051ED54 = .data:0x8051ED54; // type:object size:0xC lbl_8051ED60 = .data:0x8051ED60; // type:object size:0x10 lbl_8051ED70 = .data:0x8051ED70; // type:object size:0xC lbl_8051ED7C = .data:0x8051ED7C; // type:object size:0x10 -lbl_8051ED8C = .data:0x8051ED8C; // type:object size:0x64 -lbl_8051EDF0 = .data:0x8051EDF0; // type:object size:0xC +lbl_8051ED8C = .data:0x8051ED8C; // type:object size:0x9 data:string +lbl_8051ED98 = .data:0x8051ED98; // type:object size:0x40 +lbl_8051EDD8 = .data:0x8051EDD8; // type:object size:0x15 data:string +lbl_8051EDF0 = .data:0x8051EDF0; // type:object size:0x9 data:string lbl_8051EDFC = .data:0x8051EDFC; // type:object size:0xC lbl_8051EE08 = .data:0x8051EE08; // type:object size:0xC lbl_8051EE14 = .data:0x8051EE14; // type:object size:0xC @@ -33513,10 +33508,10 @@ lbl_8051EE7C = .data:0x8051EE7C; // type:object size:0xC lbl_8051EE88 = .data:0x8051EE88; // type:object size:0x1C lbl_8051EEA4 = .data:0x8051EEA4; // type:object size:0x1C data:string lbl_8051EEC0 = .data:0x8051EEC0; // type:object size:0xC -lbl_8051EECC = .data:0x8051EECC; // type:object size:0x1C +lbl_8051EECC = .data:0x8051EECC; // type:object size:0x16 data:string lbl_8051EEE8 = .data:0x8051EEE8; // type:object size:0x18 data:string lbl_8051EF00 = .data:0x8051EF00; // type:object size:0x18 data:string -lbl_8051EF18 = .data:0x8051EF18; // type:object size:0x14 +lbl_8051EF18 = .data:0x8051EF18; // type:object size:0x12 data:string lbl_8051EF2C = .data:0x8051EF2C; // type:object size:0xC data:string lbl_8051EF38 = .data:0x8051EF38; // type:object size:0xC lbl_8051EF44 = .data:0x8051EF44; // type:object size:0xC @@ -33529,8 +33524,8 @@ lbl_8051EFCC = .data:0x8051EFCC; // type:object size:0xC data:string lbl_8051EFD8 = .data:0x8051EFD8; // type:object size:0x20 lbl_8051EFF8 = .data:0x8051EFF8; // type:object size:0x20 lbl_8051F018 = .data:0x8051F018; // type:object size:0x18 data:string -lbl_8051F030 = .data:0x8051F030; // type:object size:0x10 -lbl_8051F040 = .data:0x8051F040; // type:object size:0x10 +lbl_8051F030 = .data:0x8051F030; // type:object size:0xE data:string +lbl_8051F040 = .data:0x8051F040; // type:object size:0xD data:string lbl_8051F050 = .data:0x8051F050; // type:object size:0x24 lbl_8051F074 = .data:0x8051F074; // type:object size:0x10 lbl_8051F084 = .data:0x8051F084; // type:object size:0x24 @@ -33735,13 +33730,30 @@ lbl_8051FE84 = .data:0x8051FE84; // type:object size:0xC lbl_8051FE90 = .data:0x8051FE90; // type:object size:0xC lbl_8051FE9C = .data:0x8051FE9C; // type:object size:0x28 lbl_8051FEC4 = .data:0x8051FEC4; // type:object size:0x10 -lbl_8051FED4 = .data:0x8051FED4; // type:object size:0x104 -lbl_8051FFD8 = .data:0x8051FFD8; // type:object size:0x10 -lbl_8051FFE8 = .data:0x8051FFE8; // type:object size:0x10 +lbl_8051FED4 = .data:0x8051FED4; // type:object size:0xE data:string +lbl_8051FEE4 = .data:0x8051FEE4; // type:object size:0xD data:string +lbl_8051FEF4 = .data:0x8051FEF4; // type:object size:0x9 data:string +lbl_8051FF00 = .data:0x8051FF00; // type:object size:0x9 data:string +lbl_8051FF0C = .data:0x8051FF0C; // type:object size:0xB data:string +lbl_8051FF18 = .data:0x8051FF18; // type:object size:0xD data:string +lbl_8051FF28 = .data:0x8051FF28; // type:object size:0x10 data:string +lbl_8051FF38 = .data:0x8051FF38; // type:object size:0xA data:string +lbl_8051FF44 = .data:0x8051FF44; // type:object size:0xC data:string +lbl_8051FF50 = .data:0x8051FF50; // type:object size:0xD data:string +lbl_8051FF60 = .data:0x8051FF60; // type:object size:0xF data:string +lbl_8051FF70 = .data:0x8051FF70; // type:object size:0xE data:string +lbl_8051FF80 = .data:0x8051FF80; // type:object size:0xE data:string +lbl_8051FF90 = .data:0x8051FF90; // type:object size:0xC data:string +lbl_8051FF9C = .data:0x8051FF9C; // type:object size:0xC data:string +lbl_8051FFA8 = .data:0x8051FFA8; // type:object size:0xD data:string +lbl_8051FFB8 = .data:0x8051FFB8; // type:object size:0xD data:string +lbl_8051FFC8 = .data:0x8051FFC8; // type:object size:0xE data:string +lbl_8051FFD8 = .data:0x8051FFD8; // type:object size:0xD data:string +lbl_8051FFE8 = .data:0x8051FFE8; // type:object size:0xD data:string jumptable_8051FFF8 = .data:0x8051FFF8; // type:object size:0x30 scope:local lbl_80520028 = .data:0x80520028; // type:object size:0xC lbl_80520034 = .data:0x80520034; // type:object size:0xC data:string -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 @@ -33840,7 +33852,7 @@ __vt__57sFStateMgr_c<18dLytMapPopupInfo_c,20sStateMethodUsr_FI_c> = .data:0x8052 __vt__87sStateMgr_c<18dLytMapPopupInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80520848; // type:object size:0x30 __vt__34sFStateFct_c<18dLytMapPopupInfo_c> = .data:0x80520878; // type:object size:0x14 __vt__31sFState_c<18dLytMapPopupInfo_c> = .data:0x80520890; // type:object size:0x18 -lbl_805208A8 = .data:0x805208A8; // type:object size:0x10 +__vt__14dLytMapFader_c = .data:0x805208A8; // type:object size:0x10 __vt__20dLytMapFloorBtnMgr_c = .data:0x805208B8; // type:object size:0x38 __vt__59sFStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c> = .data:0x805208F0; // type:object size:0x30 __vt__89sStateMgr_c<20dLytMapFloorBtnMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80520920; // type:object size:0x30 @@ -33860,11 +33872,11 @@ __vt__55sFStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c> = .data:0x80520A __vt__85sStateMgr_c<16dLytMapPinIcon_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80520AF0; // type:object size:0x30 __vt__32sFStateFct_c<16dLytMapPinIcon_c> = .data:0x80520B20; // type:object size:0x14 __vt__29sFState_c<16dLytMapPinIcon_c> = .data:0x80520B38; // type:object size:0x18 -lbl_80520B50 = .data:0x80520B50; // type:object size:0xC -lbl_80520B5C = .data:0x80520B5C; // type:object size:0xC -lbl_80520B68 = .data:0x80520B68; // type:object size:0xC -lbl_80520B74 = .data:0x80520B74; // type:object size:0xC -lbl_80520B80 = .data:0x80520B80; // type:object size:0xC +__vt__16dLytMapPutIcon_c = .data:0x80520B50; // type:object size:0xC +__vt__16LytMap0x80520B5C = .data:0x80520B5C; // type:object size:0xC +__vt__19dLytMapFootPrints_c = .data:0x80520B68; // type:object size:0xC +__vt__14dLytMapPlace_c = .data:0x80520B74; // type:object size:0xC +__vt__14dLytMapPopup_c = .data:0x80520B80; // type:object size:0xC __vt__16dLytMapCapture_c = .data:0x80520B8C; // type:object size:0xC __vt__55sFStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c> = .data:0x80520B98; // type:object size:0x30 __vt__85sStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80520BC8; // type:object size:0x30 @@ -35074,7 +35086,7 @@ lbl_80529008 = .data:0x80529008; // type:object size:0xC lbl_80529014 = .data:0x80529014; // type:object size:0xC lbl_80529020 = .data:0x80529020; // type:object size:0xC data:string lbl_8052902C = .data:0x8052902C; // type:object size:0xC -lbl_80529038 = .data:0x80529038; // type:object size:0x14 +lbl_80529038 = .data:0x80529038; // type:object size:0x12 data:string lbl_8052904C = .data:0x8052904C; // type:object size:0x1C lbl_80529068 = .data:0x80529068; // type:object size:0x18 data:string lbl_80529080 = .data:0x80529080; // type:object size:0x18 data:string @@ -35082,7 +35094,9 @@ lbl_80529098 = .data:0x80529098; // type:object size:0xC lbl_805290A4 = .data:0x805290A4; // type:object size:0x18 lbl_805290BC = .data:0x805290BC; // type:object size:0xC lbl_805290C8 = .data:0x805290C8; // type:object size:0xC -lbl_805290D4 = .data:0x805290D4; // type:object size:0x2C +lbl_805290D4 = .data:0x805290D4; // type:object size:0xB data:string +lbl_805290E0 = .data:0x805290E0; // type:object size:0xC +lbl_805290EC = .data:0x805290EC; // type:object size:0x12 data:string lbl_80529100 = .data:0x80529100; // type:object size:0xC lbl_8052910C = .data:0x8052910C; // type:object size:0x14 lbl_80529120 = .data:0x80529120; // type:object size:0x20 data:string @@ -35350,9 +35364,9 @@ lbl_8052A6D0 = .data:0x8052A6D0; // type:object size:0x88 jumptable_8052A758 = .data:0x8052A758; // type:object size:0xA4 scope:local lbl_8052A7FC = .data:0x8052A7FC; // type:object size:0xC lbl_8052A808 = .data:0x8052A808; // type:object size:0x18 -lbl_8052A820 = .data:0x8052A820; // type:object size:0x20 -LytDungeonBokoBaseIcons__vtable = .data:0x8052A840; // type:object size:0x20 -lbl_8052A860 = .data:0x8052A860; // type:object size:0x20 +__vt__16dLytMapMarkers_c = .data:0x8052A820; // type:object size:0x20 +__vt__15dLytMapIcon00_c = .data:0x8052A840; // type:object size:0x20 +__vt__15dLytMapIcon01_c = .data:0x8052A860; // type:object size:0x20 lbl_8052A880 = .data:0x8052A880; // type:object size:0x10 lbl_8052A890 = .data:0x8052A890; // type:object size:0xC8 lbl_8052A958 = .data:0x8052A958; // type:object size:0x68 @@ -40089,18 +40103,18 @@ lbl_80572734 = .sdata:0x80572734; // type:object size:0x8 lbl_8057273C = .sdata:0x8057273C; // type:object size:0x8 lbl_80572744 = .sdata:0x80572744; // type:object size:0x8 lbl_8057274C = .sdata:0x8057274C; // type:object size:0x4 data:4byte -lbl_80572750 = .sdata:0x80572750; // type:object size:0x8 -lbl_80572758 = .sdata:0x80572758; // type:object size:0x8 +lbl_80572750 = .sdata:0x80572750; // type:object size:0x5 data:string +lbl_80572758 = .sdata:0x80572758; // type:object size:0x5 data:string lbl_80572760 = .sdata:0x80572760; // type:object size:0x8 data:4byte lbl_80572768 = .sdata:0x80572768; // type:object size:0x8 data:4byte -lbl_80572770 = .sdata:0x80572770; // type:object size:0x8 +lbl_80572770 = .sdata:0x80572770; // type:object size:0x5 data:string lbl_80572778 = .sdata:0x80572778; // type:object size:0x8 data:wstring lbl_80572780 = .sdata:0x80572780; // type:object size:0x4 data:4byte lbl_80572784 = .sdata:0x80572784; // type:object size:0x4 data:4byte -lbl_80572788 = .sdata:0x80572788; // type:object size:0x8 -lbl_80572790 = .sdata:0x80572790; // type:object size:0x8 -lbl_80572798 = .sdata:0x80572798; // type:object size:0x8 -lbl_805727A0 = .sdata:0x805727A0; // type:object size:0x8 +lbl_80572788 = .sdata:0x80572788; // type:object size:0x6 data:string +lbl_80572790 = .sdata:0x80572790; // type:object size:0x6 data:string +lbl_80572798 = .sdata:0x80572798; // type:object size:0x6 data:string +lbl_805727A0 = .sdata:0x805727A0; // type:object size:0x6 data:string lbl_805727A8 = .sdata:0x805727A8; // type:object size:0x8 lbl_805727B0 = .sdata:0x805727B0; // type:object size:0x8 lbl_805727B8 = .sdata:0x805727B8; // type:object size:0x8 @@ -40121,10 +40135,10 @@ lbl_80572828 = .sdata:0x80572828; // type:object size:0x8 lbl_80572830 = .sdata:0x80572830; // type:object size:0x8 lbl_80572838 = .sdata:0x80572838; // type:object size:0x8 lbl_80572840 = .sdata:0x80572840; // type:object size:0x8 -lbl_80572848 = .sdata:0x80572848; // type:object size:0x8 +lbl_80572848 = .sdata:0x80572848; // type:object size:0x6 data:string lbl_80572850 = .sdata:0x80572850; // type:object size:0x4 -lbl_80572854 = .sdata:0x80572854; // type:object size:0x8 -lbl_8057285C = .sdata:0x8057285C; // type:object size:0xC +lbl_80572854 = .sdata:0x80572854; // type:object size:0x7 data:string +lbl_8057285C = .sdata:0x8057285C; // type:object size:0x7 data:string @LOCAL@build__10dLytNote_cFPQ23d2d10ResAccIf_c@sPaneName = .sdata:0x80572868; // type:object size:0x4 scope:local data:4byte @8144 = .sdata:0x80572870; // type:object size:0x1 scope:local data:string @24731 = .sdata:0x80572878; // type:object size:0x1 scope:local @@ -41943,7 +41957,7 @@ sInstance__15dLytMsgWindow_c = .sbss:0x80575488; // type:object size:0x4 data:4b lbl_8057548C = .sbss:0x8057548C; // type:object size:0x4 data:4byte CURRENT_ACTOR_EVENT_FLOW_MANAGER = .sbss:0x80575490; // type:object size:0x8 data:4byte sInstance__18dLytSimpleWindow_c = .sbss:0x80575498; // type:object size:0x8 data:4byte -lbl_805754A0 = .sbss:0x805754A0; // type:object size:0x8 data:4byte +sInstance__15dLytMapGlobal_c = .sbss:0x805754A0; // type:object size:0x8 data:4byte sMapFaderColor = .sbss:0x805754A8; // type:object size:0x4 data:byte lbl_805754AC = .sbss:0x805754AC; // type:object size:0x1 data:byte sInstance__9dLytMap_c = .sbss:0x805754B0; // type:object size:0x8 data:4byte diff --git a/configure.py b/configure.py index 086b1e71..d27a75cf 100644 --- a/configure.py +++ b/configure.py @@ -488,6 +488,7 @@ config.libs = [ Object(Matching, "d/flag/flag_managers.cpp"), Object(NonMatching, "toBeSorted/bigboss_model_math_stuff.cpp"), Object(NonMatching, "toBeSorted/actor_event_flow_manager_related.cpp"), + Object(NonMatching, "toBeSorted/d_flow_mgr.cpp"), Object(NonMatching, "d/d_lyt_base.cpp"), Object(NonMatching, "toBeSorted/unk_npc_path_stuff_1.cpp"), Object(NonMatching, "toBeSorted/unk_npc_path_stuff_2.cpp"), @@ -524,9 +525,9 @@ config.libs = [ Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window.cpp"), Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp"), Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_common.cpp"), - Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window_talk.cpp"), - Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window_link.cpp"), - Object(NonMatching, "d/lyt/msg_window/d_lyt_msg_window_get.cpp"), + Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_talk.cpp"), + Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_link.cpp"), + Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_get.cpp"), Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_sword.cpp"), Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_wood.cpp"), Object(Matching, "d/lyt/msg_window/d_lyt_msg_window_stone.cpp"), @@ -534,6 +535,7 @@ config.libs = [ Object(NonMatching, "d/lyt/msg_window/d_lyt_simple_window.cpp"), Object(Matching, "d/lyt/d_lyt_auto_caption.cpp"), Object(Matching, "d/lyt/d_lyt_auto_explain.cpp"), + Object(Matching, "d/lyt/d_lyt_map_global.cpp"), Object(NonMatching, "d/lyt/d_lyt_map_capture.cpp"), Object(NonMatching, "d/lyt/d_lyt_map.cpp"), Object(Matching, "d/lyt/d_lyt_note.cpp"), @@ -576,7 +578,7 @@ config.libs = [ Object(Matching, "d/lyt/d_screen_fader.cpp"), Object(NonMatching, "d/a/d_a_bird_base.cpp"), Object(NonMatching, "d/a/d_a_door_base.cpp"), - Object(NonMatching, "d/lyt/d_lyt_map_popup.cpp"), + Object(NonMatching, "d/lyt/d_lyt_map_markers.cpp"), Object(NonMatching, "d/d_pouch.cpp"), Object(NonMatching, "toBeSorted/d_beacon.cpp"), Object(NonMatching, "toBeSorted/d_underground.cpp"), diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 505bd7ab..0997fb68 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -79,6 +79,7 @@ public: static bool isRupee(ITEM_ID item); static bool isKeyPiece(ITEM_ID item); static bool isTreasure(ITEM_ID item); + bool isTriforce() const; static bool getItemGetEventName(u16 item, const char **outName); static void itemGetEventStart(dAcBase_c *); diff --git a/include/d/a/obj/d_a_obj_save.h b/include/d/a/obj/d_a_obj_save.h index 0c5a7e6e..9f2222a3 100644 --- a/include/d/a/obj/d_a_obj_save.h +++ b/include/d/a/obj/d_a_obj_save.h @@ -17,6 +17,16 @@ public: STATE_FUNC_DECLARE(dAcOSave_c, LightShaft); STATE_FUNC_DECLARE(dAcOSave_c, Escape); + bool checkStatueFlag() const; + u32 getStatueType() const; + u32 getStatueNameId() const; + + enum StatueType { + TYPE_NORMAL = 0, + TYPE_OVERWORLD = 1, + TYPE_DUNGEON = 2, + }; + private: /* 0x??? */ STATE_MGR_DECLARE(dAcOSave_c); }; diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index b3c95053..93f8a7f9 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -64,6 +64,14 @@ public: STATE_FUNC_DECLARE(dAcTbox_c, Wait); STATE_FUNC_DECLARE(dAcTbox_c, GoddessWait); + u8 getVariant() const { + return mVariant; + } + + bool hasBeenOpened() const { + return mHasBeenOpened; + } + private: static f32 getSomeRate(); bool initBgW(dBgW &bg, const char *arcName, const char *fileName); diff --git a/include/d/d_bzs_types.h b/include/d/d_bzs_types.h index 638d98e0..74ae0e29 100644 --- a/include/d/d_bzs_types.h +++ b/include/d/d_bzs_types.h @@ -193,9 +193,9 @@ 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; + /* 0x11 */ u8 roomType; /* 0x12 */ s8 mapNameId; /* 0x13 */ u8 field_0x13; }; diff --git a/include/d/d_camera.h b/include/d/d_camera.h index 5dbb0f61..ef2cf73d 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -1,12 +1,16 @@ #ifndef D_CAMERA_H #define D_CAMERA_H +#include "common.h" #include "d/d_base.h" #include "m/m_vec.h" 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: @@ -29,13 +33,33 @@ 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; } + UNKWORD getField_0xDA8() const { + return field_0xDA8; + } + bool isUnderwater() const; f32 getUnderwaterDepth() const; + void fn_8019E430(); + void fn_8019E410(); + mAng fn_8019E3B0() const; + private: /* 0x068 */ u8 _0x068[0x6C - 0x068]; /* 0x06C */ mVec3_c mPositionMaybe; @@ -44,7 +68,9 @@ private: /* 0xD98 */ void *field_0xD98; /* 0xD9C */ u8 _0xD9C[0xDA0 - 0xD9C]; /* 0xDA0 */ void *field_0xDA0; - /* 0xDA4 */ u8 _0xDA4[0xDB0 - 0xDA4]; + /* 0xDA4 */ void *field_0xDA4; + /* 0xDA8 */ UNKWORD field_0xDA8; + /* 0xDAC */ u8 _0xDAC[0xDB0 - 0xDAC]; /* 0xDB0 */ f32 mScreenShakeIntensity; }; diff --git a/include/d/d_cs_game.h b/include/d/d_cs_game.h index 4bc75e4b..b064844f 100644 --- a/include/d/d_cs_game.h +++ b/include/d/d_cs_game.h @@ -75,6 +75,10 @@ public: mpResAcc = resAcc; } + void setPriorityDraw(u8 priority) { + mLyt.setPriority(priority); + } + private: /* 0x0C */ m2d::ResAccIf_c *mpResAcc; /* 0x10 */ d2d::LytBase_c mLyt; @@ -96,6 +100,10 @@ public: mpResAcc = resAcc; } + void setPriorityDraw(u8 priority) { + mLyt.setPriority(priority); + } + private: /* 0x0C */ m2d::ResAccIf_c *mpResAcc; /* 0x10 */ d2d::LytBase_c mLyt; @@ -344,6 +352,10 @@ public: mpResAcc = resAcc; } + void setPriorityDraw(u8 priority) { + mLyt.setPriority(priority); + } + void changeState(const sFStateID_c &newState); void pachinkoSetCharging(bool charging, f32 progress); @@ -356,6 +368,7 @@ public: void bowAimStart(); void bowReady(); + private: STATE_FUNC_DECLARE(lytItemCursor_c, Invisible); STATE_FUNC_DECLARE(lytItemCursor_c, Bow); @@ -431,6 +444,20 @@ public: mNextCursorActive = false; } + dCursorHitCheck_c *getCursorHit() const { + return mCursorIf.getHit(); + } + + dCursorInterfaceGame_c *getCursorIf() { + return &mCursorIf; + } + + void setPriorityDraw(u8 priority) { + mLyt1.setPriorityDraw(priority); + mLyt2.setPriorityDraw(priority); + mCursor.setPriorityDraw(priority); + } + private: static dCsGame_c *sInstance; bool isForcedHidden() const; diff --git a/include/d/d_cursor_hit_check.h b/include/d/d_cursor_hit_check.h index ae69f28b..e6f49718 100644 --- a/include/d/d_cursor_hit_check.h +++ b/include/d/d_cursor_hit_check.h @@ -95,6 +95,10 @@ public: mHasCalculatedBoundingData = false; } + const dCsCheckLyt_BoundingData *getBoundingData() const { + return mpBoundingData; + } + private: void countBoundings(nw4r::lyt::Pane *); void gatherBoundings(dCsCheckLyt_BoundingData **pEnd, nw4r::lyt::Pane *); diff --git a/include/d/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_player_act.h b/include/d/d_player_act.h index b358835f..cf1c9236 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -641,10 +641,12 @@ public: static bool isOutOfStamina(); static f32 getStamina(); + static s32 getCurrentTunicType(); static s32 getCurrentSwordType(); static const char *getSwordName(s32); static s32 getCurrentlyEquippedShieldType(); + static const mColor &getEarringsColor(); static mVec3_c sPos1; diff --git a/include/d/d_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.h b/include/d/d_stage.h index d68d64b8..b0de4c98 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -67,18 +67,36 @@ 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; + } + + void setField_0x1E8(u8 v) { + field_0x1E8 = v; + } + + void setField_0x1EF(u8 v) { + field_0x1EF = v; + } + void init(MapRelated *); void fn_801b4900(); void fn_801B4B80(u32 mapParams, const mVec3_c ¢er, const mVec3_c &size); void fn_801B4C70(const mVec3_c &); void fn_801B50C0(s32); + const mVec3_c &fn_801B4CB0() const; + s32 fn_801B4F10(s32 roomid, const mVec3_c &position) const; }; // OBJ NAME: STAGE @@ -128,6 +146,10 @@ public: return sInstance; } + MapRelated *getMapRelated() { + return &mMapRelated; + } + bool isFadedOut() const { return mFader.isStatus(mFaderBase_c::FADED_OUT); } @@ -141,6 +163,8 @@ public: } bool fn_801B3EE0(); + void fn_801B3F20(); + void fn_801B3F30(); private: dRoom_c *createRoom(int roomid, bool flag0x40); @@ -154,7 +178,7 @@ private: /* 0x0068 */ sFPhase mPhase; /* 0x007C */ dRoomTable_c rooms; /* 0x017C */ dFader_c mFader; - /* 0x01A0 */ MapRelated mapRelated; + /* 0x01A0 */ MapRelated mMapRelated; /* 0x0394 */ u8 _0x394[0x39C - 0x394]; /* 0x039C */ u32 loaded_entities[2047]; /* 0x2398 */ s8 curr_room_id; diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index 57aad744..68d47f3f 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -59,17 +59,45 @@ 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_CAVES = 9, + STIF_AREA_LANAYRU_SAND_SEA = 10, + STIF_AREA_LANAYRU_GORGE = 11, + }; + + // room is a not great name since this is really stage-wide... + enum StifRoomType_e { + STIF_ROOMTYPE_FIELD = 0, + STIF_ROOMTYPE_DUNGEON = 1, + STIF_ROOMTYPE_SKYLOFT = 2, + STIF_ROOMTYPE_BOSS_HOUSE = 3, + STIF_ROOMTYPE_SKYFIELD = 4, + }; + + s32 getSTIFArea() const; + bool isSTIFAreaFaron() const; + bool isSTIFAreaEldin() const; + 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 getSTIFRoomType() const; + s32 getAreaType() const; s32 getMapNameId() const; diff --git a/include/d/flag/storyflag_map.h b/include/d/flag/storyflag_map.h index 7e6b6743..5ebbc965 100644 --- a/include/d/flag/storyflag_map.h +++ b/include/d/flag/storyflag_map.h @@ -96,7 +96,7 @@ enum StoryFlags_e { * 3 / Water Dragon's Lair layer 3 / Behind The Temple layer 7)] Story Flag #16 (0x0010) - JP 805ACD5B 0x02 / US * 805A9ADB 0x02 */ - STORYFLAG_16, + STORYFLAG_WATER_DRAGON_SOTH_PART, /** [Triforce Completed] * Story Flag #17 (0x0011) - JP 805ACD5B 0x04 / US 805A9ADB 0x04 @@ -247,17 +247,17 @@ enum StoryFlags_e { /** [Faron light pillar] * Story Flag #46 (0x002E) - JP 805ACD67 0x80 / US 805A9AE7 0x80 */ - STORYFLAG_46, + STORYFLAG_FARON_PILLAR_OPENED, /** [Eldin light pillar] * Story Flag #47 (0x002F) - JP 805ACD66 0x01 / US 805A9AE6 0x01 */ - STORYFLAG_47, + STORYFLAG_ELDIN_PILLAR_OPENED, /** [Lanayru light pillar (Eldin Volcano, Digging Mitts Cave, FS Entrance, Volcano Summit Waterfall layer 2 / * Lanayru Mines layer 1 / Temple of Time layer 1)] Story Flag #48 (0x0030) - JP 805ACD66 0x02 / US 805A9AE6 0x02 */ - STORYFLAG_48, + STORYFLAG_LANAYRU_PILLAR_OPENED, /** [Talk to Headmaster to learn about Windmills] * Story Flag #49 (0x0031) - JP 805ACD66 0x04 / US 805A9AE6 0x04 @@ -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 @@ -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 @@ -703,7 +703,7 @@ enum StoryFlags_e { * Screen) (Faron Woods, Deep Woods, Inside Great Tree layer 1)] Story Flag #137 (0x0089) - JP 805ACD64 0x80 / US * 805A9AE4 0x80 */ - STORYFLAG_137, + STORYFLAG_FARON_DISCOVERED, /** [Cutscene near sealed temple entrance first time in sealed grounds (Sealed Temple layer 1)] * Story Flag #138 (0x008A) - JP 805ACD67 0x01 / US 805A9AE7 0x01 @@ -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 @@ -928,12 +928,12 @@ enum StoryFlags_e { /** [Eldin Volcano Introductory Cutscene (Eldin Layer 1 only) (if set it activates Statue select screen on entering * Eldin Pillar)] Story Flag #182 (0x00B6) - JP 805ACD66 0x20 / US 805A9AE6 0x20 */ - STORYFLAG_182, + STORYFLAG_ELDIN_DISCOVERED, /** [Earth Temple Introductory Cutscene] * Story Flag #183 (0x00B7) - JP 805ACD66 0x40 / US 805A9AE6 0x40 */ - STORYFLAG_183, + STORYFLAG_EARTH_TEMPLE_DISCOVERED, /** [Impa Cutscene at Bridge in Eldin] * Story Flag #184 (0x00B8) - JP 805ACD66 0x80 / US 805A9AE6 0x80 @@ -968,7 +968,7 @@ enum StoryFlags_e { /** [Lanayru Mines Introductory Cutscene (Lanayru Desert layer 1)] * Story Flag #190 (0x00BE) - JP 805ACD6D 0x80 / US 805A9AED 0x80 */ - STORYFLAG_190, + STORYFLAG_LANAYRU_DISCOVERED, /** [(not implemented yet -- 7F62)] * Story Flag #191 (0x00BF) - JP from 805ACE57 0x40 to 805ACE56 0x01 / US from 805A9BD7 0x40 to 805A9BD6 0x01 @@ -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 @@ -1155,7 +1155,7 @@ enum StoryFlags_e { /** [First Goddess Cube (Unlocks ability to skyward strike Goddess Cubes)] * Story Flag #227 (0x00E3) - JP 805ACD72 0x20 / US 805A9AF2 0x20 */ - STORYFLAG_227, + STORYFLAG_FIRST_GODDESS_CUBE, /** [Goddess Cube near Skyview Entrance] * Story Flag #228 (0x00E4) - JP 805ACD72 0x40 / US 805A9AF2 0x40 @@ -1425,7 +1425,7 @@ enum StoryFlags_e { /** [Land on Fun Fun Island for first time (name on map appears)] * Story Flag #281 (0x0119) - JP 805ACD7B 0x08 / US 805A9AFB 0x08 */ - STORYFLAG_281, + STORYFLAG_FUN_FUN_ISLAND_DISCOVERED, /** [Land on Lumpy Pumpkin Island for first time (name on map appears)] * Story Flag #282 (0x011A) - JP 805ACD7B 0x10 / US 805A9AFB 0x10 @@ -1435,7 +1435,7 @@ enum StoryFlags_e { /** [Talk to Beedle on his island for first time (name on map appears)] * Story Flag #283 (0x011B) - JP 805ACD7B 0x20 / US 805A9AFB 0x20 */ - STORYFLAG_283, + STORYFLAG_BEEDLE_ISLAND_DISCOVERED, /** [Land on Bamboo Island for first time (name on map appears)] * Story Flag #284 (0x011C) - JP 805ACD7B 0x40 / US 805A9AFB 0x40 @@ -1450,7 +1450,7 @@ enum StoryFlags_e { /** [Talk to Strich at Bug Heaven for first time (name on map appears)] * Story Flag #286 (0x011E) - JP 805ACD7A 0x01 / US 805A9AFA 0x01 */ - STORYFLAG_286, + STORYFLAG_BUG_HAVEN_DISCOVERED, /** [] * Story Flag #287 (0x011F) - JP 805ACD7A 0x02 / US 805A9AFA 0x02 @@ -1460,7 +1460,7 @@ enum StoryFlags_e { /** [Bilocyte fight triggered] * Story Flag #288 (0x0120) - JP 805ACD7A 0x04 / US 805A9AFA 0x04 */ - STORYFLAG_288, + STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED, /** [Owlan's wooden shield] * Story Flag #289 (0x0121) - JP 805ACD7A 0x08 / US 805A9AFA 0x08 @@ -1917,7 +1917,7 @@ enum StoryFlags_e { /** [Thunderhead entered for first time] * Story Flag #379 (0x017B) - JP 805ACD85 0x02 / US 805A9B05 0x02 */ - STORYFLAG_379, + STORYFLAG_THUNDERHEAD_ENTERED, /** [Parrow gives his Crystal Sidequest (to find Orielle)] * Story Flag #380 (0x017C) - JP 805ACD8A 0x40 / US 805A9B0A 0x40 @@ -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,12 +2652,12 @@ 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 */ - STORYFLAG_527, + STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED, /** [Finishing a Silent Realm for the First time] * Story Flag #528 (0x0210) - JP 805ACD94 0x20 / US 805A9B14 0x20 @@ -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 @@ -3568,7 +3568,7 @@ enum StoryFlags_e { /** [Enter Beedle's Shop for first time] * Story Flag #709 (0x02C5) - JP 805ACDA2 0x80 / US 805A9B22 0x80 */ - STORYFLAG_709, + STORYFLAG_BEEDLE_SHOP_ENTERED, /** [Sets after Treasure dowsing] * Story Flag #710 (0x02C6) - JP 805ACDA5 0x01 / US 805A9B25 0x01 diff --git a/include/d/lyt/d2d.h b/include/d/lyt/d2d.h index 14c92b78..7030b9b4 100644 --- a/include/d/lyt/d2d.h +++ b/include/d/lyt/d2d.h @@ -73,10 +73,10 @@ public: } protected: - Layout_c mLayout; - nw4r::lyt::DrawInfo mDrawInfo; - m2d::ResAccIf_c *mpResAcc; - u32 mFlags; + /* 0x10 */ Layout_c mLayout; + /* 0x30 */ nw4r::lyt::DrawInfo mDrawInfo; + /* 0x84 */ m2d::ResAccIf_c *mpResAcc; + /* 0x88 */ u32 mFlags; }; /** @@ -252,6 +252,10 @@ struct AnmGroupBase_c { return mpFrameCtrl->getRate(); } + inline bool isBound() const { + return (mFlags & ANMGROUP_FLAG_BOUND) != 0; + } + inline bool isEnabled() const { return (mFlags & ANMGROUP_FLAG_ENABLE) != 0; } diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index 52098e3c..110e0c03 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -2,6 +2,7 @@ #define D_LYT_CONTROL_GAME_H #include "d/d_base.h" +#include "d/lyt/d_lyt_map.h" #include "s/s_State.hpp" class dLytControlGame_c : public dBase_c { @@ -18,6 +19,10 @@ public: void fn_802CCD40(bool); void fn_802D04F0(); + const dMapFootPrintsQueue_c *getFootprintsQueue() const { + return mFootprintsMgr.getQueue(); + } + static dLytControlGame_c *getInstance() { return sInstance; } @@ -70,7 +75,11 @@ public: private: /* 0x00068 */ UI_STATE_MGR_DECLARE(dLytControlGame_c); - /* 0x000A4 */ u8 _0x000A4[0x15C2C - 0x000A4]; + /* 0x000A4 */ u8 _0x000A4[0x15850 - 0x000A4]; + + /* 0x15850 */ dMapFootPrintsMgr_c mFootprintsMgr; + + /* 0x15C24 */ u8 _0x15C24[0x15C2C - 0x15C24]; /* 0x15C2C */ s32 mCurrentPauseDisp; /* 0x15C30 */ s32 mPauseDisp00Tab; diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h index 283a01e8..fedd5d13 100644 --- a/include/d/lyt/d_lyt_map.h +++ b/include/d/lyt/d_lyt_map.h @@ -3,13 +3,135 @@ #include "common.h" #include "d/d_cursor_hit_check.h" +#include "d/d_message.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_map_capture.h" +#include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_lyt_map_markers.h" +#include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" #include "egg/core/eggColorFader.h" +#include "egg/core/eggFader.h" #include "m/m2d.h" +#include "m/m_angle.h" #include "m/m_vec.h" #include "nw4r/lyt/lyt_bounding.h" +#include "nw4r/lyt/lyt_group.h" +#include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" +#include "toBeSorted/d_flow_mgr.h" + +// TODO - this file uses a lot of `friend` classes because the necessary +// inlines might mess up weak function order. Let's get the order right +// first before introducing more problems... + +class dAcTbox_c; + +/** Bird Statue Definition (StatueSelectDestination) */ +struct dMapSaveObjDefinition { + /* 0x00 */ const char *stageName; + /* 0x04 */ u8 room; + /* 0x05 */ u8 layer; + /* 0x06 */ u8 entrance; + /* 0x08 */ s32 type; + /* 0x0C */ const char *statueLabel; +}; + +/** Something for making sure re-opening the map opens it in a similar state as when it was last closed */ +struct dMapSavedDataEntry { + /* 0x00 */ s32 mapMode; + /* 0x04 */ bool mapUpDirection; + /* 0x05 */ bool mapUpDirectionAfterZoomToDetail; + /* 0x06 */ bool isValid; +}; + +struct dMapSavedData { + /* 0x00 */ dMapSavedDataEntry entries[/* dLytMapMain_c::ROOMTYPE_MAX */ 6]; + /* 0x30 */ bool showIslandNames; +}; + +struct dMapFootPrintEntry { + /* 0x00 */ dMapFootPrintEntry *pPrev; + /* 0x04 */ dMapFootPrintEntry *pNext; + /* 0x08 */ mVec3_c position; + /* 0x14 */ mAng rotation; +}; + +/** Generic footprints queue */ +class dMapFootPrintsQueue_c { +public: + void init(); + void addStep(const mVec3_c &pos, const mAng &rot); + dMapFootPrintEntry *getFirst() const; + dMapFootPrintEntry *getNext(const dMapFootPrintEntry *it) const; + + bool isEmpty() const { + return mCount == 0; + } + +private: + /* 0x000 */ dMapFootPrintEntry mEntries[40]; + /* 0x3C0 */ dMapFootPrintEntry *mpFirst; + /* 0x3C4 */ dMapFootPrintEntry *mpLast; + /* 0x3C8 */ u32 mCount; +}; + +/** Records Link's footsteps */ +class dMapFootPrintsMgr_c { +public: + dMapFootPrintsMgr_c() { + mQueue.init(); + } + virtual ~dMapFootPrintsMgr_c() {} + + void execute(); + + const dMapFootPrintsQueue_c *getQueue() const { + return &mQueue; + } + +private: + /* 0x004 */ dMapFootPrintsQueue_c mQueue; + /* 0x3D0 */ f32 mMinStepDistanceSq; +}; + +/** 2D UI - Map - Link footprint markers */ +class dLytMapFootPrints_c { +public: + dLytMapFootPrints_c(dLytMapGlobal_c *global); + virtual ~dLytMapFootPrints_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + void draw(); + + void setVisible(bool visible) { + mVisible = visible; + } + + void setField_0x198(f32 f) { + field_0x198 = f; + } + + void setField_0x19C(f32 f) { + field_0x19C = f; + } + +private: + dLytMapGlobal_c *getGlobal() const; + + /* 0x004 */ dLytMapGlobal_c *mpGlobal; + /* 0x008 */ d2d::dLytSub mLyt; + /* 0x09C */ nw4r::lyt::Pane *mpPane; + /* 0x0A0 */ f32 field_0xA0; + /* 0x0A4 */ mVec2_c mFootprintPositions[30]; + /* 0x194 */ u16 mMaxNumSteps; + /* 0x196 */ u16 mCurrentNumSteps; + /* 0x198 */ f32 field_0x198; + /* 0x19C */ f32 field_0x19C; + /* 0x1A0 */ bool mVisible; +}; struct LytMap0x80520B5C { LytMap0x80520B5C() : field_0x04(false), field_0x05(false) {} @@ -19,14 +141,44 @@ struct LytMap0x80520B5C { bool field_0x05; }; -struct LytMapFourAnimGroups { - /* 0x00 */ d2d::AnmGroup_c mGroup1; - /* 0x40 */ d2d::AnmGroup_c mGroup2; - /* 0x80 */ d2d::AnmGroup_c mGroup3; - /* 0xC0 */ d2d::AnmGroup_c mGroup4; + +/** 2D UI - Map - beacon preview icon following the cursor */ +class dLytMapPutIcon_c { +public: + dLytMapPutIcon_c() : mVisible(false), field_0x98(0.0f, 0.0f) {} + virtual ~dLytMapPutIcon_c() {} + + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void setPosition(const mVec2_c &pos); + void setScale(f32 scale); + + void setVisible(bool visible) { + mVisible = visible; + } + +private: + /* 0x04 */ d2d::LytBase_c mLyt; + /* 0x94 */ bool mVisible; + /* 0x98 */ mVec2_c field_0x98; }; -// Size 0x1E0 +struct dLytMapFloorBtnAnmGroups { + /* 0x00 */ d2d::AnmGroup_c mLoop; + /* 0x40 */ d2d::AnmGroup_c mOnOff; + /* 0x80 */ d2d::AnmGroup_c mDecide; + /* 0xC0 */ d2d::AnmGroup_c mOnOffLight; +}; + +struct dLytMapBoundingWorldBounds { + /* 0x00 */ mVec3_c min; + /* 0x0C */ mVec3_c max; +}; + +/** 2D UI - Map - a placed down beacon */ class dLytMapPinIcon_c { public: friend class dLytMapPinIconAggregate_c; @@ -35,12 +187,12 @@ public: : mStateMgr(*this, sStateID::null), mpBounding(nullptr), field_0x1BC(0), - field_0x1C0(0.0f, 0.0f, 0.0f), - field_0x1CC(0), + mPosition(0.0f, 0.0f, 0.0f), + mIsSet(false), field_0x1D0(nullptr), field_0x1D4(0), mIndex(0), - field_0x1DC(0) {} + mLoopFrame(0) {} virtual ~dLytMapPinIcon_c(); bool build(d2d::ResAccIf_c *resAcc); @@ -48,7 +200,10 @@ public: bool draw(); bool execute(); - void fn_8012EC30(); + void updatePosition(); + void checkPointedAt(); + void setPosition(const mVec3_c &pos); + void setScale(f32 scale); bool isSelect() const { return *mStateMgr.getStateID() == dLytMapPinIcon_c::StateID_ToSelect || @@ -66,58 +221,78 @@ public: STATE_FUNC_DECLARE(dLytMapPinIcon_c, Remove); private: + void removeBeacon(); + + dLytMapGlobal_c *getGlobal() const; + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapPinIcon_c); /* 0x040 */ d2d::LytBase_c mLyt; /* 0x0D0 */ d2d::AnmGroup_c mAnmGroups[3]; /* 0x190 */ dCursorHitCheckLyt_c mCsHitCheck; /* 0x1B8 */ nw4r::lyt::Bounding *mpBounding; /* 0x1BC */ UNKWORD field_0x1BC; - /* 0x1C0 */ mVec3_c field_0x1C0; - /* 0x1CC */ u8 field_0x1CC; + /* 0x1C0 */ mVec3_c mPosition; + /* 0x1CC */ bool mIsSet; /* 0x1D0 */ LytMap0x80520B5C *field_0x1D0; /* 0x1D4 */ UNKWORD field_0x1D4; /* 0x1D8 */ s32 mIndex; - /* 0x1DC */ UNKWORD field_0x1DC; + /* 0x1DC */ UNKWORD mLoopFrame; }; class dLytMapPinIconAggregate_c { + friend class dLytMapMain_c; + public: dLytMapPinIconAggregate_c() : mStateMgr(*this, sStateID::null) { field_0x9A0 = nullptr; - field_0x9A4 = 0; - field_0x9A8 = 0; + mLoopFrame = 0; + mLoopFrameMax = 0; for (int i = 0; i < 5; i++) { mPins[i].mIndex = i; } } virtual ~dLytMapPinIconAggregate_c() {} + bool build(d2d::ResAccIf_c *resAcc); bool remove(); + bool execute(); + bool draw(); + + void setScale(f32 scale); + void updatePosition(); + void setUnk(LytMap0x80520B5C *unk); + bool setPosition(s32 index, const mVec3_c &position); + void unsetAll(); + u32 getNumSetPins() const; STATE_FUNC_DECLARE(dLytMapPinIconAggregate_c, Wait); STATE_FUNC_DECLARE(dLytMapPinIconAggregate_c, Select); STATE_FUNC_DECLARE(dLytMapPinIconAggregate_c, Remove); private: + bool findNewBeaconId(s32 *pOutId); + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapPinIconAggregate_c); /* 0x040 */ dLytMapPinIcon_c mPins[5]; /* 0x9A0 */ LytMap0x80520B5C *field_0x9A0; - /* 0x9A4 */ UNKWORD field_0x9A4; - /* 0x9A8 */ UNKWORD field_0x9A8; + /* 0x9A4 */ s32 mLoopFrame; + /* 0x9A8 */ s32 mLoopFrameMax; }; // Size 0x50 class dLytMapFloorBtn_c { + friend class dLytMapFloorBtnMgr_c; + public: dLytMapFloorBtn_c() : mStateMgr(*this, sStateID::null), - field_0x3C(0), - field_0x40(0), + mpOwnerLyt(nullptr), + mpAnmGroups(nullptr), field_0x44(0), - field_0x48(0), - field_0x4C(0), - field_0x4D(0) {} + mpBounding(nullptr), + mSelected(false), + mDecided(false) {} ~dLytMapFloorBtn_c() {} STATE_FUNC_DECLARE(dLytMapFloorBtn_c, Wait); @@ -130,26 +305,37 @@ public: STATE_FUNC_DECLARE(dLytMapFloorBtn_c, SelectInDecide); STATE_FUNC_DECLARE(dLytMapFloorBtn_c, DecideToSelectInDecide); + void init(); + void execute(); + + bool build(d2d::ResAccIf_c *resAcc); + + void directlyDecide(); + void directlyUndecide(); + private: /* 0x00 */ UI_STATE_MGR_DECLARE(dLytMapFloorBtn_c); - /* 0x3C */ UNKWORD field_0x3C; - /* 0x40 */ UNKWORD field_0x40; + /* 0x3C */ d2d::LytBase_c *mpOwnerLyt; + /* 0x40 */ dLytMapFloorBtnAnmGroups *mpAnmGroups; /* 0x44 */ UNKWORD field_0x44; - /* 0x48 */ UNKWORD field_0x48; - /* 0x4C */ u8 field_0x4C; - /* 0x4D */ u8 field_0x4D; + /* 0x48 */ nw4r::lyt::Bounding *mpBounding; + /* 0x4C */ bool mSelected; + /* 0x4D */ bool mDecided; }; class dLytMapFloorBtnMgr_c : public d2d::dSubPane { + friend class dLytMapMain_c; + public: - dLytMapFloorBtnMgr_c(void *arg) : field_0x008(arg), field_0x51C(nullptr), mStateMgr(*this, sStateID::null) { - field_0x700 = 1; - field_0x704 = 0; - field_0x708 = 0; + dLytMapFloorBtnMgr_c(dLytMapGlobal_c *global) + : mpGlobal(global), mpPane(nullptr), mStateMgr(*this, sStateID::null) { + mNumFloors = 1; + mBaseFloorOffset = 0; + mSelectedBtnIdx = 0; field_0x70C = 4; - field_0x710 = 0; - field_0x711 = 0; - field_0x712 = 0; + mPointerVisible = false; + mPrevPointerVisible = false; + mForceNoNav = false; } virtual ~dLytMapFloorBtnMgr_c(); @@ -169,26 +355,77 @@ public: STATE_FUNC_DECLARE(dLytMapFloorBtnMgr_c, Invisible); STATE_FUNC_DECLARE(dLytMapFloorBtnMgr_c, Wait); + void init(s32 numFloors, s32 baseFloorOffset, s32 selectedFloor); + + bool canDecideFloor() const; + void decideSelectedFloor(); + s32 getCurrentFloor() const; + s32 getPointedAtBtnIdx() const; + + bool hasPointedAtABtnIdx() const { + return getPointedAtBtnIdx() >= 0; + } + + void resetFloor(s32 newFloorBtn); + bool isUsingPointerNav() const; + + void setForceNoNav(bool b) { + mForceNoNav = b; + } + + void checkPointedAtBtn(); + private: - /* 0x008 */ void *field_0x008; + /* 0x008 */ dLytMapGlobal_c *mpGlobal; /* 0x00C */ UI_STATE_MGR_DECLARE(dLytMapFloorBtnMgr_c); /* 0x048 */ d2d::dLytSub mLyt; /* 0x0DC */ d2d::AnmGroup_c mAnmGroups[1]; - /* 0x11C */ LytMapFourAnimGroups mMoreGroups[4]; - /* 0x51C */ void *field_0x51C; + /* 0x11C */ dLytMapFloorBtnAnmGroups mBtnGroups[4]; + /* 0x51C */ nw4r::lyt::Pane *mpPane; /* 0x520 */ dCursorHitCheckLyt_c mCsHitChecks[4]; /* 0x5C0 */ dLytMapFloorBtn_c mFloorBtns[4]; - /* 0x700 */ UNKWORD field_0x700; - /* 0x704 */ UNKWORD field_0x704; - /* 0x708 */ UNKWORD field_0x708; + /* 0x700 */ s32 mNumFloors; + /* 0x704 */ s32 mBaseFloorOffset; + /* 0x708 */ s32 mSelectedBtnIdx; /* 0x70C */ UNKWORD field_0x70C; - /* 0x710 */ u8 field_0x710; - /* 0x711 */ u8 field_0x711; - /* 0x712 */ u8 field_0x712; + /* 0x710 */ bool mPointerVisible; + /* 0x711 */ bool mPrevPointerVisible; + /* 0x712 */ bool mForceNoNav; +}; + +// Made up name +class dLytMapFader_c : public m2d::Base_c { +public: + dLytMapFader_c(); + virtual ~dLytMapFader_c(); + /* vt 0x0C */ virtual void draw() override; + + void calc(); + + bool isVisible() const { + return mIsVisible; + } + + void setVisible(bool v) { + mIsVisible = v; + } + + void fadeOut() { + mFader.setStatus(EGG::Fader::STATUS_PREPARE_OUT); + mFader.setFrame(15); + mFader.fadeOut(); + } + +public: + /* 0x10 */ EGG::ColorFader mFader; + /* 0x34 */ u8 _0x34[0x38 - 0x34]; + /* 0x38 */ bool mIsVisible; }; // Size 0x4C class dLytMapPopupInfo_c { + friend class dLytMapMain_c; + public: dLytMapPopupInfo_c() : mStateMgr(*this, sStateID::null) {} @@ -198,6 +435,11 @@ public: STATE_FUNC_DECLARE(dLytMapPopupInfo_c, WaitInvalid); STATE_FUNC_DECLARE(dLytMapPopupInfo_c, Out); + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + private: /* 0x000 */ UI_STATE_MGR_DECLARE(dLytMapPopupInfo_c); /* 0x03C */ d2d::LytBase_c mLyt; @@ -206,32 +448,59 @@ private: // Size 0x4C class dLytMapSavePopupAction_c { + friend class dLytMapSavePopup_c; + public: - dLytMapSavePopupAction_c() : mStateMgr(*this, sStateID::null), field_0x44(0.0f), field_0x48(0) {} + dLytMapSavePopupAction_c() : mStateMgr(*this, sStateID::null), mInOutFrame(0.0f), mInRequest(false) {} STATE_FUNC_DECLARE(dLytMapSavePopupAction_c, Invisible); STATE_FUNC_DECLARE(dLytMapSavePopupAction_c, In); STATE_FUNC_DECLARE(dLytMapSavePopupAction_c, Wait); STATE_FUNC_DECLARE(dLytMapSavePopupAction_c, Out); + void execute(); + void init(d2d::AnmGroup_c *pGroups); + void hide(); + private: /* 0x00 */ UI_STATE_MGR_DECLARE(dLytMapSavePopupAction_c); - /* 0x44 */ f32 field_0x44; - /* 0x48 */ u8 field_0x48; + /* 0x3C */ d2d::AnmGroup_c *mpAnmGroupInOut; + /* 0x40 */ d2d::AnmGroup_c *mpAnmGroupInput; + /* 0x44 */ f32 mInOutFrame; + /* 0x48 */ bool mInRequest; }; // Assumed name class dLytMapSavePopup_c { public: - dLytMapSavePopup_c() {} + dLytMapSavePopup_c() : mStatueNum(0), mpStatueBoundings(nullptr), mCurrentlyInStatue(-1) {} + + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void set(nw4r::lyt::Bounding **pStatueBoundings, s32 count); + void hide(s32 statueIdx); + + void setCurrentStatue(s32 idx) { + mCurrentlyInStatue = idx; + } private: + f32 setStatueLabel(const char *label); + /* 0x000 */ d2d::LytBase_c mLyt; /* 0x090 */ d2d::AnmGroup_c mAnmGroups[2]; /* 0x110 */ dLytMapSavePopupAction_c mActions[12]; + /* 0x4A0 */ s32 mStatueNum; + /* 0x4A4 */ nw4r::lyt::Bounding **mpStatueBoundings; + /* 0x4A8 */ s32 mCurrentlyInStatue; }; class dLytMapSaveCaption_c { + friend class dLytMapMain_c; + public: dLytMapSaveCaption_c() : mStateMgr(*this, sStateID::null) {} @@ -240,6 +509,14 @@ public: STATE_FUNC_DECLARE(dLytMapSaveCaption_c, Wait); STATE_FUNC_DECLARE(dLytMapSaveCaption_c, Out); + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void setType(s32 type); + void setLabel(const char *label); + private: /* 0x000 */ UI_STATE_MGR_DECLARE(dLytMapSaveCaption_c); /* 0x03C */ d2d::LytBase_c mLyt; @@ -248,8 +525,12 @@ private: // Size 0x190 class dLytMapSaveObj_c { + friend class dLytMapMain_c; + public: - dLytMapSaveObj_c() : mStateMgr(*this, sStateID::null), field_0x18C(0), field_0x18D(0), field_0x18E(0) {} + dLytMapSaveObj_c() + : mStateMgr(*this, sStateID::null), mSelectRequest(false), mDecideRequest(false), mDecideFinished(false) {} + ~dLytMapSaveObj_c() {} STATE_FUNC_DECLARE(dLytMapSaveObj_c, Wait); STATE_FUNC_DECLARE(dLytMapSaveObj_c, ToSelect); @@ -257,13 +538,22 @@ public: STATE_FUNC_DECLARE(dLytMapSaveObj_c, ToWait); STATE_FUNC_DECLARE(dLytMapSaveObj_c, Decide); + void build(d2d::ResAccIf_c *resAcc); + void remove(); + void execute(); + void draw(); + + void setPosition(const mVec3_c &position); + void setAlpha(u8 alpha); + void init(); + private: /* 0x000 */ UI_STATE_MGR_DECLARE(dLytMapSaveObj_c); /* 0x03C */ d2d::LytBase_c mLyt; /* 0x0CC */ d2d::AnmGroup_c mAnmGroups[3]; - /* 0x18C */ u8 field_0x18C; - /* 0x18D */ u8 field_0x18D; - /* 0x18E */ u8 field_0x18E; + /* 0x18C */ bool mSelectRequest; + /* 0x18D */ bool mDecideRequest; + /* 0x18E */ bool mDecideFinished; }; class dLytMapMain_c : public m2d::Base_c { @@ -276,11 +566,19 @@ public: virtual void dLytMapMain_vt0x10(); void build(); + 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; STATE_FUNC_DECLARE(dLytMapMain_c, Invisible); STATE_FUNC_DECLARE(dLytMapMain_c, RenderingWait); @@ -323,61 +621,275 @@ 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 + + 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, + }; + + enum RoomType_e { + ROOMTYPE_FIELD = 0, + ROOMTYPE_DUNGEON = 1, + ROOMTYPE_SKYLOFT = 2, + ROOMTYPE_BOSS_HOUSE = 3, + ROOMTYPE_SKYFIELD = 4, + ROOMTYPE_SKYFIELD_INTERIOR = 5, + ROOMTYPE_MAX = 6, + }; + + dLytMapGlobal_c *getGlobal(); + void checkScroll(); + bool needsNav(s32 mapMode) const; + bool canZoomOut(s32 mapMode) const; + bool canZoomIn(s32 mapMode) const; + bool canResetPosition(s32 mapMode, bool) const; + bool canChangeUpDirection(s32 mapMode, bool) const; + bool canCenterCursor(s32 mapMode) const; + bool canCenterCursor1(s32 mapMode) const; + bool canPlaceBeacons(s32 mapMode); + bool canChangeFloor(s32 mapMode) const; + bool isPointingAtMainMap() const; + + void loadStageProperties(); + s32 getAreaGroup(s32 stifArea) const; + s32 getRoomType() const; + + s32 getSelectedSaveObjIdx() const; + + f32 fn_80142D90(s32); + void fn_80142F00(mVec3_c &, s32 mapMode, bool, const mVec3_c &, const mAng &); + void fn_8013FB70(const mVec3_c &, f32); + bool fn_80141530() const; + bool fn_80142D10(s32, bool, mAng &); + void fn_80143060(mVec3_c &, const mVec3_c &, const mVec3_c &, const mAng &); + 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(); + void zoomOut(); + + void clearButtonMessages(); + void setButtonMessages(s32 currentMapMode, bool currentUpDirection, s32 nextMapMode, bool nextUpDirection); + void setCursorType(); + + void setupFlags(); + void setupStage(); + void setupEvent(s32 event, s32 arg1, s32 arg2); + void close(); + + void loadTextboxes(); + + void saveMapState(); + void initMapState(); + void loadMapState(); + + void checkCursorPointedAtMap(); + + void calculateBoundingWorldHitboxes(); + + dAcTbox_c *findGoddessChestForStoryflag(s32 flag) const; + bool checkStoryflag(s32 flag) const; + void displaySaveObjs(); + bool isPaneVisible(nw4r::lyt::Pane *pane) const; + void setSaveObjsVisible(bool visible); + void setSaveObjPanePtrs(); + void initSaveObjs(); + + u8 getRoomAlpha(s32 roomid) const; + + static dMapSavedData sSavedMapData; + static const dMapSavedData sDefaultMapData; + + 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 */ u8 field_0x004C[0x00A4 - 0x004C]; - /* 0x00A4 */ u8 field_0x00A4[0x010C - 0x00A4]; + /* 0x004C */ dFlowMgrBase_c mFlowMgr; + /* 0x00A4 */ dFlow_c mFlow; + /* 0x0108 */ UNKWORD field_0x0108; /* 0x010C */ d2d::LytBase_c mLyt; /* 0x019C */ d2d::AnmGroup_c mAnmGroups[54]; /* 0x0F1C */ LytMap0x80520B5C field_0xF1C; /* 0x0F24 */ dLytMapCapture_c mMapCapture; /* 0x0FA0 */ dLytMapFloorBtnMgr_c mFloorBtnMgr; /* 0x16B4 */ dLytMapPinIconAggregate_c mPinIconAggregate; - + /* 0x2060 */ dLytMapMarkers_c mMarkers; + /* 0x64C0 */ dLytMapFootPrints_c mFootPrints; + /* 0x6664 */ dLytMapPutIcon_c mPutIcon; /* 0x6704 */ dLytMapSaveObj_c mSaveObjs[12]; /* 0x79C4 */ dLytMapSaveCaption_c mSaveCaption; - /* 0x0000 */ dLytMapSavePopup_c mSavePopup; + /* 0x7BD0 */ dLytMapSavePopup_c mSavePopup; /* 0x807C */ dLytMapPopupInfo_c mPopupInfo; + /* 0x8208 */ dTextBox_c *mpNumberTextBox; + /* 0x820C */ dTextBox_c *mpNumberTextBoxS; + /* 0x8210 */ nw4r::lyt::Pane *mpNoroshiPane; + /* 0x8214 */ nw4r::lyt::Pane *mpScaleFramePane; + /* 0x8218 */ dWindow_c *mpWakuWindow; + /* 0x821C */ nw4r::lyt::Bounding *mpSaveObjBoundingsFaron[10]; + /* 0x8244 */ nw4r::lyt::Bounding *mpSaveObjBoundingsEldin[6]; + /* 0x825C */ nw4r::lyt::Bounding *mpSaveObjBoundingsLanayru[12]; /* 0x828C */ mVec3_c field_0x828C[12]; - /* 0x832C */ dCursorHitCheckLyt_c field_0x832C[33]; + /* 0x831C */ nw4r::lyt::Bounding **mpCurrentSaveObjBoundings; + /* 0x8320 */ u32 mNumSaveObjs; + + /* 0x8324 */ u8 _0x8324[0x8328 - 0x8324]; + + /* 0x8328 */ d2d::AnmGroup_c *mpInOutAnmGroup; + + // TODO - it appears the map abuses these hit check things + // to calculate Lyt bounding boxes, and it stores the + // results in 0x8948... + /* 0x832C */ dCursorHitCheckLyt_c mHitChecks[33]; + + /* 0x8854 */ nw4r::lyt::Pane *mpPanes[11]; + /* 0x8880 */ d2d::AnmGroup_c *field_0x8880[11]; // ??? + /* 0x88AC */ UNKWORD field_0x88AC; + /* 0x88B0 */ nw4r::lyt::Pane *mpDungeonPanes[7]; + /* 0x88CC */ nw4r::lyt::Pane *mpDungeonPics[7]; + + /* 0x88E8 */ nw4r::lyt::Pane *mpPaneBgAll01; + /* 0x88EC */ nw4r::lyt::Pane *mpPaneBgAll02; + /* 0x88F0 */ nw4r::lyt::Pane *mpPaneAll01; + /* 0x88F4 */ nw4r::lyt::Pane *mpPaneAll02; + /* 0x88F8 */ nw4r::lyt::Pane *mpPaneRotate00; + /* 0x88FC */ nw4r::lyt::Pane *mpPaneRotate01; + /* 0x8900 */ nw4r::lyt::Pane *mpAllPane; /* 0x8904 */ mVec3_c field_0x8904; /* 0x8910 */ mVec3_c field_0x8910; /* 0x891C */ mVec3_c field_0x891C; - - /* 0x8928 */ u8 _0x8928[0x8930 - 0x8928]; - + /* 0x8928 */ mVec2_c field_0x8928; /* 0x8930 */ mVec3_c field_0x8930; /* 0x893C */ mVec3_c field_0x893C; - /* 0x8948 */ u8 idkfixmelater[0x4BC0]; - /* 0x8C94 */ s32 field_0x8C94; + /* 0x8948 */ dLytMapBoundingWorldBounds mBoundingWorldBounds[33]; - // ... + /* 0x8C60 */ s32 mMaxBeaconCount; + /* 0x8C64 */ s32 field_0x8C64; + /* 0x8C68 */ s32 mRoomType; + /* 0x8C6C */ s32 mAreaGroup; + /* 0x8C70 */ u32 field_0x8C70; + /* 0x8C74 */ u8 _0x8C74[0x8C7C - 0x8C74]; + /* 0x8C7C */ f32 field_0x8C7C; + /* 0x8C80 */ f32 field_0x8C80; + + /* 0x8C84 */ u8 field_0x8C84; + + /* 0x8C88 */ f32 field_0x8C88; + /* 0x8C8C */ f32 field_0x8C8C; + /* 0x8C90 */ bool mMapUpDirection; + /* 0x8C91 */ bool mNextMapUpDirection; + /* 0x8C92 */ bool mMapUpDirectionAfterZoomToDetail; + /* 0x8C93 */ u8 field_0x8C93; + /* 0x8C94 */ s32 mMapEvent; + /* 0x8C98 */ s32 mNextMapEvent; + /* 0x8C9C */ s32 mMapEventArg1; + /* 0x8CA0 */ s32 mMapEventArg2; + + /* 0x8CA4 */ s32 mCurrentMapMode; + /* 0x8CA8 */ s32 mNextMapMode; + + /* 0x8CAC */ u8 field_0x8CAC; + /* 0x8CAD */ bool mDoCameraTransition; + /* 0x8CAE */ bool field_0x8CAE; + + /* 0x8CB0 */ u32 mEventTimer; + /* 0x8CB4 */ UNKWORD field_0x8CB4; + /* 0x8CB8 */ u32 field_0x8CB8; + /* 0x8CBC */ nw4r::lyt::Bounding *mpMapBounding; + /* 0x8CC0 */ bool mPointerOnMap; + /* 0x8CC1 */ bool mPointerCanPlaceBeacon; /* 0x8CC4 */ mVec3_c field_0x8CC4; /* 0x8CD0 */ mVec3_c field_0x8CD0; /* 0x8CDC */ mVec3_c field_0x8CDC; /* 0x8CE8 */ mVec3_c field_0x8CE8; /* 0x8CF4 */ mVec3_c field_0x8CF4; - /* 0x8D00 */ mVec3_c field_0x8D00; - /* 0x8D0C */ mVec3_c field_0x8D0C; + /* 0x8D00 */ mVec3_c mMapScroll; + /* 0x8D0C */ mVec3_c mPlayerPos; /* 0x8D18 */ mVec3_c field_0x8D18; - /* 0x8D24 */ mVec3_c field_0x8D24; - - /* 0x8DC8 */ UNKWORD field_0x8DC8; -}; - -// Made up name -class dLytMapFader_c : public m2d::Base_c { -public: - dLytMapFader_c(); - virtual ~dLytMapFader_c(); - /* vt 0x0C */ virtual void draw() override; - - void calc(); - -private: - /* 0x10 */ EGG::ColorFader mFader; + /* 0x8D24 */ mVec3_c mGoddessChestWorldPosition; + /* 0x8D30 */ mVec2_c field_0x8D30; + /* 0x8D38 */ mVec2_c field_0x8D38; + /* 0x8D40 */ f32 field_0x8D40; + /* 0x8D44 */ mAng field_0x8D44; + /* 0x8D46 */ mAng field_0x8D46; + /* 0x8D48 */ mAng field_0x8D48; + /* 0x8D4C */ f32 field_0x8D4C; + /* 0x8D50 */ f32 field_0x8D50; + /* 0x8D54 */ s32 mNumTitleLines; + /* 0x8D58 */ s32 mCurrentFloor; + /* 0x8D5C */ UNKWORD mNumFloors; + /* 0x8D60 */ s32 mBaseFloorOffset; + /* 0x8D64 */ s32 field_0x8D64; + /* 0x8D68 */ mAng field_0x8D68; + /* 0x8D6A */ bool mEventCanceled; // set at 0x8009e2d4 + /* 0x8D6B */ bool mEventDone; + /* 0x8D6C */ nw4r::lyt::Pane *mpRegionPane1; + /* 0x8D70 */ nw4r::lyt::Pane *mpRegionPane2; + /* 0x8D74 */ nw4r::lyt::Pane *mpZoomInOutPane; + /* 0x8D78 */ f32 field_0x8D78; + /* 0x8D7C */ f32 field_0x8D7C; + /* 0x8D80 */ f32 field_0x8D80; + /* 0x8D84 */ f32 field_0x8D84; + /* 0x8D88 */ f32 field_0x8D88; + /* 0x8D8C */ nw4r::lyt::Group *mpPriorityGroups[2]; + /* 0x8D94 */ d2d::SubPaneList mSubpaneList; + /* 0x8DA0 */ d2d::SubPaneListNode mSubpane; + /* 0x8DB0 */ UNKWORD field_0x8DB0; + /* 0x8DB4 */ bool mNavEnabled; + /* 0x8DB5 */ bool mDrawScaleFrame; + /* 0x8DB8 */ s32 mDisplayedBeaconCount; + /* 0x8DBC */ bool mShowIslandNames; + /* 0x8DBD */ bool field_0x8DBD; + /* 0x8DBE */ u8 mMapChangeAlpha; + /* 0x8DBF */ bool mIsVisible; + /* 0x8DC0 */ UNKWORD field_0x8DC0; + /* 0x8DC4 */ UNKWORD field_0x8DC4; + /* 0x8DC8 */ dLytMapGlobal_c mGlobal; }; // Size 0x91FC, inline ctor at 802ccd88 @@ -398,36 +910,49 @@ 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 build(); + bool remove(); + bool execute(); + bool draw(); - bool isSomeMapFieldEq2Or4Or5Or6() const { - return mMapMain.field_0x8C94 == 2 || mMapMain.field_0x8C94 == 4 || mMapMain.field_0x8C94 == 5 || - mMapMain.field_0x8C94 == 6; + 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 { - return mMapMain.field_0x8C94 == 10; + 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.mMapEventArg1, statueIdx); + } + + void fadeOut(); + private: /* 0x0004 */ d2d::ResAccIf_c mResAcc; /* 0x0374 */ dLytMapMain_c mMapMain; + /* 0x91A4 */ u8 _0x91A4[0x91C0 - 0x91A4]; + /* 0x91C0 */ dLytMapFader_c mMapFader; static dLytMap_c *sInstance; }; diff --git a/include/d/lyt/d_lyt_map_capture.h b/include/d/lyt/d_lyt_map_capture.h index 92d533a5..fd44a144 100644 --- a/include/d/lyt/d_lyt_map_capture.h +++ b/include/d/lyt/d_lyt_map_capture.h @@ -2,17 +2,17 @@ #define D_LYT_MAP_CAPTURE_H #include "common.h" +#include "nw4r/lyt/lyt_picture.h" #include "s/s_State.hpp" #include "s/s_StateID.hpp" class dLytMapCapture_c { public: - dLytMapCapture_c() :mStateMgr(*this, sStateID::null) { - field_0x040 = 0; + dLytMapCapture_c() :mStateMgr(*this, sStateID::null), mpPicture(nullptr) { field_0x070 = 0.0f; field_0x074 = 0.0f; - field_0x078 = 0; - field_0x079 = 0; + mRenderRequest = false; + mIsBusyRendering = false; field_0x06C = 0.0f; field_0x068 = 0.0f; field_0x064 = 0.0f; @@ -23,16 +23,30 @@ public: STATE_FUNC_DECLARE(dLytMapCapture_c, RenderingWait); STATE_FUNC_DECLARE(dLytMapCapture_c, RenderingWaitStep2); + void renderRequest() { + mRenderRequest = true; + } + + void setPicture(nw4r::lyt::Picture *pic) { + mpPicture = pic; + } + + void execute(); + bool isBusyRendering() const; + private: + void fn_8012D6F0(); + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMapCapture_c); - /* 0x040*/ UNKWORD field_0x040; + /* 0x040 */ nw4r::lyt::Picture *mpPicture; + /* 0x044 */ u8 _0x040[0x064 - 0x044]; /* 0x064 */ f32 field_0x064; /* 0x068 */ f32 field_0x068; /* 0x06C */ f32 field_0x06C; /* 0x070 */ f32 field_0x070; /* 0x074 */ f32 field_0x074; - /* 0x078 */ u8 field_0x078; - /* 0x079 */ u8 field_0x079; + /* 0x078 */ bool mRenderRequest; + /* 0x079 */ bool mIsBusyRendering; }; #endif diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h new file mode 100644 index 00000000..fb0b25bf --- /dev/null +++ b/include/d/lyt/d_lyt_map_global.h @@ -0,0 +1,225 @@ +#ifndef D_LYT_MAP_GLOBAL_H +#define D_LYT_MAP_GLOBAL_H + +#include "common.h" +#include "m/m_angle.h" +#include "m/m_vec.h" + +class dLytMapGlobal_c { +public: + dLytMapGlobal_c(); + ~dLytMapGlobal_c() { + sInstance = nullptr; + } + + enum MapMode_e { + MAPMODE_WORLD = 0, + // aka area + MAPMODE_PROVINCE = 1, + // aka area + MAPMODE_WORLD_SKY = 2, + // aka course + MAPMODE_STAGE = 3, + // aka detail + MAPMODE_ZOOM = 4, + }; + + static dLytMapGlobal_c *GetInstance() { + return sInstance; + } + + const mVec3_c &getMapScroll() const { + return mMapScroll; + } + + void setMapScroll(const mVec3_c &v) { + mMapScroll = v; + } + + void setField_0x0C(const mVec2_c &v) { + field_0x0C = v; + } + + const mVec2_c &getField_0x20() const { + return field_0x20; + } + + void setField_0x20(const mVec2_c &v) { + field_0x20 = v; + } + + const mVec2_c &getField_0x28() const { + return field_0x28; + } + + void setField_0x28(const mVec2_c &v) { + field_0x28 = v; + } + + void setMapRotationCenter(const mVec3_c &v) { + mMapRotationCenter = v; + } + + const mVec3_c &getMapRotationCenter() const { + return mMapRotationCenter; + } + + const mAng &getMapRotation() const { + return mMapRotation; + } + + void setMapRotation(const mAng &rot) { + mMapRotation = rot; + } + + const mVec3_c &getPlayerPos() const { + return mPlayerPosition; + } + + u8 getField_0x55() const { + return field_0x55; + } + + void setField_0x55(u8 v) { + field_0x55 = v; + } + + const mAng &getField_0x56() const { + return field_0x56; + } + + u8 getAlpha() const { + return mAlpha; + } + + void setAlpha(u8 alpha) { + mAlpha = alpha; + } + + s32 getCurrentMapMode() const { + return mCurrentMapMode; + } + + void setCurrentMapMode(s32 mode) { + mCurrentMapMode = mode; + } + + s32 getNextMapMode() const { + return mNextMapMode; + } + + void setNextMapMode(s32 mode) { + mNextMapMode = mode; + } + + f32 getZoomFrame() const { + return mZoomFrame; + } + + void setZoomFrame(f32 v) { + mZoomFrame = v; + } + + void setField_0x58(f32 v) { + field_0x58 = v; + } + + f32 getField_0x58() const { + return field_0x58; + } + + f32 getField_0x44() const { + return field_0x44; + } + + void setField_0x44(f32 v) { + field_0x44 = v; + } + + s32 getFloor() const { + return mFloor; + } + + void setFloor(s32 floor) { + mFloor = floor; + } + + u8 getField_0x4C() const { + return field_0x4C; + } + + void setField_0x4C(u8 v) { + field_0x4C = v; + } + + u8 getField_0x4D() const { + return field_0x4D; + } + + void setField_0x4D(u8 v) { + field_0x4D = v; + } + + u8 getField_0x4F() const { + return field_0x4F; + } + + void setField_0x4F(u8 v) { + field_0x4F = v; + } + + s32 getMapEvent() const { + return mMapEvent; + } + + void setMapEvent(s32 v) { + mMapEvent = v; + } + + u8 getField_0x54() const { + return field_0x54; + } + + void projectOntoMap(mVec2_c &result, const mVec3_c &position) const; + void unprojectFromMap(mVec3_c &result, const mVec2_c &position) const; + void unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const; + void unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mVec3_c &v2, const mAng &rot) const; + +private: + static dLytMapGlobal_c *sInstance; + + void projectOntoMap( + mVec2_c &result, const mVec3_c &position, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter, + const mAng &rot, f32 f1, f32 f2 + ) const; + + void unprojectFromMap( + mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &mapScroll, + const mVec3_c &mapRotationCenter, const mAng &rot, f32 f1, f32 f2 + ) const; + + /* 0x00 */ mVec3_c mMapScroll; + /* 0x0C */ mVec2_c field_0x0C; + /* 0x14 */ mVec3_c mMapRotationCenter; + /* 0x20 */ mVec2_c field_0x20; + /* 0x28 */ mVec2_c field_0x28; + /* 0x30 */ mVec3_c mPlayerPosition; + /* 0x3C */ mAng mMapRotation; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ f32 field_0x44; + /* 0x48 */ s32 mFloor; + /* 0x4C */ u8 field_0x4C; + /* 0x4D */ u8 field_0x4D; + /* 0x4E */ u8 mAlpha; + /* 0x4F */ u8 field_0x4F; + /* 0x50 */ s32 mMapEvent; + /* 0x54 */ u8 field_0x54; + /* 0x55 */ u8 field_0x55; + /* 0x56 */ mAng field_0x56; + /* 0x58 */ f32 field_0x58; + /* 0x5C */ s32 mCurrentMapMode; + /* 0x60 */ s32 mNextMapMode; + /* 0x64 */ f32 mZoomFrame; ///< 0.0f when zoomed out, 1.0f when zoomed in +}; + +#endif diff --git a/include/d/lyt/d_lyt_map_markers.h b/include/d/lyt/d_lyt_map_markers.h new file mode 100644 index 00000000..948b2ac7 --- /dev/null +++ b/include/d/lyt/d_lyt_map_markers.h @@ -0,0 +1,520 @@ +#ifndef D_LYT_MAP_MARKERS_H +#define D_LYT_MAP_MARKERS_H + +#include "d/d_cursor_hit_check.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" +#include "m/m_angle.h" +#include "m/m_vec.h" +#include "nw4r/lyt/lyt_bounding.h" +#include "nw4r/lyt/lyt_pane.h" +#include "sized_string.h" + +class dAcBase_c; +class dAcTbox_c; +class dAcPy_c; +class dTgMapMark_c; + +// Size: 0x1C +struct dLytMapPopupState { +public: + dLytMapPopupState() : textPos(0.0f, 0.0f) {} + ~dLytMapPopupState() {} + + /* 0x00 */ f32 inAnimFrame; + /* 0x04 */ mVec2_c textPos; + /* 0x0C */ mVec2_c boundingPos; + /* 0x14 */ bool visible; + /* 0x15 */ u8 objId; + /* 0x18 */ const char *labelPrefix; +}; + +/** + * Since a map has a dynamic number of actors, the layout + * doesn't actually contain multiple panes for each icon - + * instead it contains one copy per icon, and then the custom + * draw function simply reads a bunch of draw commands to position + * and draw the panes, potentially using a pane multiple times. + * + * Size: 0xC + */ +struct dLytMapIcon01DrawCommand { +public: + dLytMapIcon01DrawCommand() {} + ~dLytMapIcon01DrawCommand() {} + + /* 0x00 */ mVec2_c position; + /* 0x08 */ mAng rotation; + /* 0x0A */ u8 paneIdx; + /* 0x0B */ u8 passIdx; +}; + +// Size: 0x20 +struct dLytMapPopupConfig { +public: + dLytMapPopupConfig() : textPos(0.0f, 0.0f) {} + ~dLytMapPopupConfig() {} + + /* 0x00 */ s32 cmdIdx; + /* 0x04 */ nw4r::lyt::Bounding *bounding; + /* 0x08 */ mVec2_c textPos; + /* 0x10 */ mVec2_c boundingPos; + /* 0x18 */ bool pointedAt; + /* 0x19 */ u8 objId; + /* 0x1C */ const char *labelPrefix; +}; + +/** + * Copy of dLytMapIcon01DrawCommand + * + * Size: 0xC + */ +struct dLytMapIcon00DrawCommand { +public: + dLytMapIcon00DrawCommand() {} + ~dLytMapIcon00DrawCommand() {} + + /* 0x00 */ mVec2_c position; + /* 0x08 */ mAng rotation; + /* 0x0A */ u8 paneIdx; + /* 0x0B */ u8 passIdx; +}; + +/** + * Since map icons are completely virtual, we need to separately + * track animation state if there are special in/out animations. + * + * Size: 0x10 + */ +struct dLytMapIconAnimState { +public: + // no ctor/dtor + + /* 0x00 */ s32 cmdIndex; + /* 0x04 */ f32 frame; + /* 0x08 */ bool animIn; + /* 0x09 */ bool animOut; + /* 0x0A */ bool visible; + /* 0x0B */ bool prevVisible; + /* 0x0C */ bool render; +}; + +/** 2D UI - Map - Popup text that appears when pointing at certain points of interest */ +class dLytMapPopup_c { +public: + dLytMapPopup_c() + : mLabel("MAP_00"), + mModeCheckResult(MODE_MAX), + field_0x178(0), + mMaxScale(0.0f), + field_0x180(0), + field_0x184(0) {} + virtual ~dLytMapPopup_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + void draw(); + + void setLabel(const char *label); + void realizeText(); + void setInout(f32 value); + f32 getTextRenderWidth() const; + + f32 getInAnimDuration() const { + return mAnm[1].getLastFrame(); + } + + void setPosition(const mVec2_c &pos) { + mPosition = pos; + } + +private: + enum ModeCheck_e { + MODE_TRANSITION_TO_ZOOM = 2, + MODE_TRANSITION_TO_STAGE = 3, + MODE_STABLE_STAGE = 4, + MODE_STABLE_ZOOM = 5, + MODE_MAX = 6, + }; + + void setInitialState(); + + void checkMapMode(); + void updateScale(); + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[2]; + /* 0x114 */ SizedString<0x40> mLabel; + /* 0x154 */ nw4r::lyt::Pane *mpPanes[2]; + /* 0x15C */ dTextBox_c *mpTextboxes[2]; + /* 0x164 */ dWindow_c *mpWindow[1]; + /* 0x168 */ dTextBox_c *mpSizeBox[1]; + /* 0x16C */ s32 mModeCheckResult; + /* 0x170 */ mVec2_c mPosition; + /* 0x178 */ u8 field_0x178; + /* 0x17C */ f32 mMaxScale; + /* 0x180 */ UNKWORD field_0x180; + /* 0x184 */ UNKWORD field_0x184; +}; + +/** 2D UI - Map - Text holding area names (on the world/province view, or exits on the stage view) */ +class dLytMapPlace_c { +public: + dLytMapPlace_c() + : mLabel("MAP_02"), mModeCheckResult(MODE_MAX), field_0x1C0(0.0f), field_0x1C4(0.0f), mMaxScale(0.0f) {} + virtual ~dLytMapPlace_c() {} + + bool build(d2d::ResAccIf_c *resAcc); + bool remove(); + bool execute(); + void draw(); + + void setLabel(const char *label); + void setInout(f32 value); + void setColor(u32 value); + + void realize(); + +private: + enum ModeCheck_e { + MODE_TRANSITION_TO_ZOOM = 2, + MODE_TRANSITION_TO_STAGE = 3, + MODE_STABLE_STAGE = 4, + MODE_STABLE_ZOOM = 5, + MODE_MAX = 6, + }; + + void realizeText(); + void setInitialState(); + void updateScale(); + void realizeTextSize(); + void realizeBgSize(); + + /* 0x004 */ d2d::LytBase_c mLyt; + /* 0x094 */ d2d::AnmGroup_c mAnm[3]; + /* 0x154 */ SizedString<0x40> mLabel; + /* 0x194 */ nw4r::lyt::Pane *mpPanes[2]; + /* 0x19C */ nw4r::lyt::Pane *mpBgPanes[3]; + /* 0x1A8 */ dTextBox_c *mpTextboxes[3]; + /* 0x1B4 */ dWindow_c *mpWindow[1]; + /* 0x1B8 */ dTextBox_c *mpSizeBox[1]; + /* 0x1BC */ s32 mModeCheckResult; + /* 0x1C0 */ f32 field_0x1C0; + /* 0x1C4 */ f32 field_0x1C4; + /* 0x1C8 */ mVec2_c field_0x1C8; + /* 0x1D0 */ u8 _0x1D0[0x1D8 - 0x1D0]; + /* 0x1D8 */ f32 mMaxScale; +}; + +class dLytMapIcon01_c : public m2d::Base_c { + friend class dLytMapMarkers_c; + +public: + dLytMapIcon01_c() + : field_0x000D(0), + mShowIslandNames(false), + mModeCheckResult(MODE_MAX), + field_0x0C70(0), + field_0x0C83(0), + field_0x0C84(0), + field_0x1838(0.0f), + field_0x183C(0.0f), + field_0x1840(0.0f), + field_0x1844(false), + field_0x1845(0), + field_0x1848(0), + field_0x184C(false), + field_0x184D(false) {} + virtual void draw() override; + virtual bool build(d2d::ResAccIf_c *resAcc); + virtual bool remove(); + virtual bool execute(); + virtual void resetDrawCommands(); + +private: + enum ModeCheck_e { + MODE_TRANSITION_TO_ZOOM = 2, + MODE_TRANSITION_TO_STAGE = 3, + MODE_STABLE_STAGE = 4, + MODE_STABLE_ZOOM = 5, + MODE_MAX = 6, + }; + + void setupActorDrawCommands(); + void setupStageDrawCommands(); + void setupLinkDrawCommand(); + void setupLinkDrawCommand1(dAcPy_c *ac); + void setupLinkDrawCommand2(); + void setupCloudBigDrawCommand(); + void setupTriforceDrawCommands(); + + void sortPanes(); + + void setupTboxDrawCommand(dAcBase_c *actor); + void setupTboxDrawCommandGoddessClosed(dAcTbox_c *box); + void setupTboxDrawCommandOpen(dAcTbox_c *box); + void setupTboxDrawCommandClosed(dAcTbox_c *box); + void setupNpcKenseiDrawCommand(dAcBase_c *actor); + void setupObjShutterDrawCommand(dAcBase_c *actor); + void setupObjDoorDrawCommand(dAcBase_c *actor); + void setupObjSaveDrawCommand(dAcBase_c *actor); + void setupObjLightLineDrawCommand(dAcBase_c *actor); + void setupNpcBNusiDrawCommand(dAcBase_c *actor); + void setupObjTerryShopDrawCommand(dAcBase_c *actor); + void setupObjRoAtTargetDrawCommand(dAcBase_c *actor); + void setupObjD3DummyDrawCommand(dAcBase_c *actor); + void setupObjSealedDoorDrawCommand(dAcBase_c *actor); + void setupObjHarpHintDrawCommand(dAcBase_c *actor); + void setupNpcBeeDrawCommand(dAcBase_c *actor); + + void setupTgMapMarkDrawCommand(dAcBase_c *actor); + void setupTgMapMarkDrawCommand1(dTgMapMark_c *actor); + void setupTgMapMarkDrawCommand2(dTgMapMark_c *actor); + void setupTgMapInstDrawCommand(dAcBase_c *actor); + void setupTgForceGetFlagDrawCommand(dAcBase_c *actor); + void setupTgInsectDrawCommand(dAcBase_c *actor); + + void setLinkTunic(s32 type); + void setGoddessStatue(u32 present); + void setTerry(bool present); + void setAreaLight(u32 color, nw4r::lyt::Pane *pane); + void setCloud(u32 alpha, nw4r::lyt::Pane *pane); + void setSaveObj(u32 color, nw4r::lyt::Pane *pane); + + void drawWithAnimIn(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame); + void drawWithAnimOut(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame); + void drawFullyIn(u32 paneIdx, nw4r::lyt::Pane *pane); + + void fn_80181C40(); + + void fn_80181880(nw4r::lyt::Pane *, nw4r::lyt::Pane *, mVec2_c &) const; + + void checkMapMode(); + void loadFlags(); + void updateScale(); + + void recordAnimVisState(); + void transitionAnims(); + void checkBoundingPointing(); + bool isPointingAtBounding(nw4r::lyt::Pane *pane) const; + + /* 0x000D */ u8 field_0x000D; + /* 0x000E */ bool mShowIslandNames; + /* 0x0010 */ nw4r::lyt::Bounding *mpBoundings[59]; + /* 0x00FC */ nw4r::lyt::Pane *mpSpecialPanes[27]; + /* 0x0168 */ nw4r::lyt::Pane *mpSpecialPictures[27]; + /* 0x01D4 */ nw4r::lyt::Pane *mpTerryOnOffPane; + /* 0x01D8 */ d2d::ResAccIf_c *mpResAcc; + /* 0x01DC */ d2d::LytBase_c mLyt; + /* 0x026C */ d2d::AnmGroup_c mAnm[18]; + /* 0x06EC */ nw4r::lyt::Pane *mpPanes[42]; + /* 0x0794 */ dCursorHitCheckLyt_c mCsHitCheck; + /* 0x07BC */ dLytMapIcon01DrawCommand mCommands[100]; + /* 0x0C6C */ s32 mModeCheckResult; + /* 0x0C70 */ s32 field_0x0C70; + /* 0x0C74 */ bool mFunFunIslandDiscovered; + /* 0x0C75 */ bool mLumpyPumkpinDiscovered; + /* 0x0C76 */ bool mBeedleIslandDiscovered; + /* 0x0C77 */ bool mBambooIslandDiscovered; + /* 0x0C78 */ bool mIsleOfSongsDiscovered; + /* 0x0C79 */ bool mBugHavenDiscovered; + /* 0x0C7A */ bool mBilocyteFightTriggered; + /* 0x0C7B */ bool mFaronPillarOpened; + /* 0x0C7C */ bool mFaronDiscovered; + /* 0x0C7D */ bool mEldinPillarOpened; + /* 0x0C7E */ bool mEldinDiscovered; + /* 0x0C7F */ bool mLanayruPillarOpened; + /* 0x0C80 */ bool mLanaryuDiscovered; + /* 0x0C81 */ bool mThunderheadEntered; + /* 0x0C82 */ bool mBeedleShopEntered; + /* 0x0C83 */ u8 field_0x0C83; + /* 0x0C84 */ u8 field_0x0C84; + /* 0x0C85 */ u8 field_0x0C85[100]; + /* 0x0CE9 */ u8 mPassIdxes[35]; + /* 0x0D0C */ s32 mCurrentFloor; + /* 0x0D10 */ s32 mLastFloor; + /* 0x0D14 */ u8 mNumCommandsPerPass[35]; + /* 0x0D37 */ u8 mNumCommands; + + /* 0x0D38 */ u8 _0x0D38[0x0D3A - 0x0D38]; + + /* 0x0D3A */ mAng field_0x0D3A; + + /* 0x0D3C */ u8 _0x0D3C[0x0D40 - 0x0D3C]; + + /* 0x0D40 */ mVec2_c field_0x0D40; + /* 0x0D48 */ u8 field_0x0D48; + /* 0x0D49 */ u8 field_0x0D49; + /* 0x0D4A */ u8 field_0x0D4A; + /* 0x0D4B */ u8 field_0x0D4B[100]; // ??? + + /* 0x0DAF */ u8 _0x0DAF[0x0E13 - 0x0DAF]; + + /* 0x0E13 */ u8 field_0x0E13; + /* 0x0E14 */ dLytMapPopupConfig mPopupConfigs[56]; + /* 0x1514 */ dLytMapIconAnimState mIconAnims[50]; + /* 0x1834 */ s32 mNumAnims; + /* 0x1838 */ f32 field_0x1838; + /* 0x183C */ f32 field_0x183C; + /* 0x1840 */ f32 field_0x1840; + /* 0x1844 */ bool field_0x1844; + /* 0x1845 */ u8 field_0x1845; + + /* 0x1848 */ UNKWORD field_0x1848; + + /* 0x184C */ bool field_0x184C; + /* 0x184D */ bool field_0x184D; +}; + +class dLytMapIcon00_c : public m2d::Base_c { +public: + dLytMapIcon00_c() + : mModeCheckResult(MODE_MAX), + field_0x0E4C(0), + field_0x0E59(0), + field_0x0E5A(0), + field_0x13A6(0), + field_0x13A7(0), + field_0x1CD0(0.0f, 0.0f, 0.0f), + field_0x1CDC(0), + field_0x1CDD(0), + field_0x1CDE(0), + field_0x1CE0(0), + field_0x1CE4(0), + field_0x1CE5(0), + field_0x1CE6(0), + field_0x1CE7(0) {} + + virtual void draw() override; + virtual bool build(d2d::ResAccIf_c *resAcc); + virtual bool remove(); + virtual bool execute(); + virtual void resetDrawCommands(); + +private: + enum ModeCheck_e { + MODE_TRANSITION_TO_ZOOM = 2, + MODE_TRANSITION_TO_STAGE = 3, + MODE_STABLE_STAGE = 4, + MODE_STABLE_ZOOM = 5, + MODE_MAX = 6, + }; + + void fn_80189750(); + + /* 0x0010 */ u8 _0x0010[0x0104 - 0x0010]; + + /* 0x0104 */ d2d::LytBase_c mLyt; + /* 0x0194 */ d2d::AnmGroup_c mAnm[29]; + + /* 0x08D4 */ u8 _0x08D4[0x0970 - 0x08D4]; + + /* 0x0970 */ dCursorHitCheckLyt_c mCsHitCheck; + /* 0x0998 */ dLytMapIcon00DrawCommand mCommands[100]; + /* 0x0E48 */ s32 mModeCheckResult; + /* 0x0E4C */ UNKWORD field_0x0E4C; + /* 0x0E50 */ u8 field_0x0E50; + /* 0x0E51 */ u8 field_0x0E51; + /* 0x0E52 */ u8 field_0x0E52; + /* 0x0E53 */ u8 field_0x0E53; + /* 0x0E54 */ u8 field_0x0E54; + /* 0x0E55 */ u8 field_0x0E55; + /* 0x0E56 */ u8 field_0x0E56; + /* 0x0E57 */ u8 field_0x0E57; + /* 0x0E58 */ u8 field_0x0E58; + /* 0x0E59 */ u8 field_0x0E59; + /* 0x0E59 */ u8 field_0x0E5A; + /* 0x0E5B */ u8 field_0x0E5B[100]; + + /* 0x0EC0 */ u8 _0x0EC0[0x0EE4 - 0x0EC0]; + + /* 0x0EE4 */ s32 mNumCommands; + /* 0x0EE8 */ s32 field_0x0EE8; + /* 0x0EEC */ u8 field_0x0EEC[36]; + + /* 0x0F10 */ u8 _0x0F10[0x0F20 - 0x0F10]; + + /* 0x0F20 */ u8 field_0x0F20[100]; + + /* 0x0F84 */ mVec3_c field_0x0F84[77]; + + /* 0x1320 */ u8 _0x1320[0x1331 - 0x1320]; + + /* 0x1331 */ u8 mNumCommandsPerPass[17]; + /* 0x1342 */ u8 field_0x1342[100]; + /* 0x13A6 */ u8 field_0x13A6; + /* 0x13A6 */ u8 field_0x13A7; + /* 0x13A8 */ u8 field_0x13A8[100]; + /* 0x140C */ u8 field_0x140C; + /* 0x1410 */ dLytMapPopupConfig mPopupConfigs[30]; + /* 0x17D0 */ dLytMapPlace_c mPlace; + /* 0x19B8 */ dLytMapIconAnimState mIconAnims[50]; + /* 0x1CCC */ s32 mNumAnims; + /* 0x1CD0 */ mVec3_c field_0x1CD0; + /* 0x1CDC */ u8 field_0x1CDC; + /* 0x1CDD */ u8 field_0x1CDD; + /* 0x1CDE */ u8 field_0x1CDE; + /* 0x1CE0 */ UNKWORD field_0x1CE0; + /* 0x1CE4 */ u8 field_0x1CE4; + /* 0x1CE5 */ u8 field_0x1CE5; + /* 0x1CE6 */ u8 field_0x1CE6; + /* 0x1CE7 */ u8 field_0x1CE7; +}; + +class dLytMapMarkers_c : public m2d::Base_c { +public: + dLytMapMarkers_c() + : mShowIslandNames(false), field_0x0702(0), field_0x0703(0), field_0x0704(0.0f), mNumPopups(0) {} + virtual ~dLytMapMarkers_c() {} + virtual void draw() override; + virtual bool build(d2d::ResAccIf_c *resAcc); + virtual bool remove(); + virtual bool execute(); + + void setIslandNamesOn(bool on); + void drawPopups(); + + void setField_0x6F4(const mVec2_c &v) { + field_0x06F4 = v; + } + + void setField_0x0702(u8 v) { + field_0x0702 = v; + } + + void setField_0x0703(u8 v) { + field_0x0703 = v; + } + + f32 getField_0x0704() const { + return field_0x0704; + } + + void setLinkRot(const mAng3_c &rot) { + mLinkRot = rot; + } + +private: + void resetPopups(); + void loadPopups(); + + /* 0x0010 */ d2d::ResAccIf_c mResAcc00; + /* 0x0380 */ d2d::ResAccIf_c mResAcc01; + + /* 0x06F0 */ bool mShowIslandNames; + /* 0x06F4 */ mVec2_c field_0x06F4; + /* 0x06FC */ mAng3_c mLinkRot; + /* 0x0702 */ u8 field_0x0702; + /* 0x0702 */ u8 field_0x0703; + /* 0x0704 */ f32 field_0x0704; + /* 0x0708 */ dLytMapPopup_c mMapPopup; + /* 0x0890 */ s32 mNumPopups; + /* 0x0894 */ dLytMapPopupState mPopups[60]; + /* 0x0F24 */ const dLytMapPopupConfig *mpPopupConfigs; + /* 0x0F28 */ dLytMapIcon01_c mIcon01; + /* 0x2778 */ dLytMapIcon00_c mIcon00; +}; + +#endif diff --git a/include/d/lyt/d_textbox.h b/include/d/lyt/d_textbox.h index 35669923..c96aafcf 100644 --- a/include/d/lyt/d_textbox.h +++ b/include/d/lyt/d_textbox.h @@ -21,7 +21,7 @@ public: f32 GetLineWidth(f32 *pOutSpacing) const; f32 GetLinesHeight() const; - f32 GetUnkWidthRatio() const; + f32 getLineDrawWidth() const; void setLytBase(d2d::LytBase_c *lytBase) { mpLytBase = lytBase; diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index dcb5bd2f..26f36e5a 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -60,6 +60,8 @@ enum MeterFlag_e { METER_BTN_Z = 0x800, METER_BTN_0x1000 = 0x1000, + METER_BTN_0x4000 = 0x4000, + METER_BTN_CROSS = METER_BTN_CROSS_UP | METER_BTN_CROSS_DOWN | METER_BTN_CROSS_LEFT | METER_BTN_CROSS_RIGHT, }; diff --git a/include/m/m2d.h b/include/m/m2d.h index 8be7f6da..c51b47dd 100644 --- a/include/m/m2d.h +++ b/include/m/m2d.h @@ -112,7 +112,7 @@ public: return mEndFrame; } -// There's at least 1 file where the obvious way of writing +// There are at least 2 files where the obvious way of writing // it seems to require accessing some members directly, without // inlines. I want to discourage direct access though, so // putting the ability behind an explicit define. We don't diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 393a047a..310d8d61 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -17,6 +17,10 @@ struct mAng { return *this; } + void setF(const f32 &f) { + mVal = f; + } + static mAng atan2s(f32 a, f32 b) { return mAng(cM::atan2s(a, b)); } diff --git a/include/m/m_vec.h b/include/m/m_vec.h index 852ba68b..30beb68c 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -300,6 +300,9 @@ public: mVec2_c(const EGG::Vector2f &other) { set(other.x, other.y); } + mVec2_c(const nw4r::math::VEC2 &other) { + set(other.x, other.y); + } mVec2_c(f32 fx, f32 fy) { set(fx, fy); } diff --git a/include/nw4r/lyt/lyt_types.h b/include/nw4r/lyt/lyt_types.h index 73eea22f..707062f3 100644 --- a/include/nw4r/lyt/lyt_types.h +++ b/include/nw4r/lyt/lyt_types.h @@ -1,9 +1,11 @@ #ifndef NW4R_LYT_TYPES_H #define NW4R_LYT_TYPES_H -#include "nw4r/math.h" // IWYU pragma: export #include "nw4r/ut/ut_LinkList.h" #include "nw4r/ut/ut_algorithm.h" + +#include "nw4r/math.h" // IWYU pragma: export + #include "rvl/GX.h" // IWYU pragma: export namespace nw4r { @@ -31,8 +33,10 @@ inline bool TestBit(T bits, int index) { } template inline void SetBit(T *bits, int pos, bool val) { - T mask = ~T(1 << pos); - *bits = T((*bits & mask)) | (val << pos); + T mask = 1 << pos; + + *bits &= ~mask; + *bits |= val ? mask : 0; } template diff --git a/include/toBeSorted/d_beacon.h b/include/toBeSorted/d_beacon.h new file mode 100644 index 00000000..b963d98a --- /dev/null +++ b/include/toBeSorted/d_beacon.h @@ -0,0 +1,22 @@ +#ifndef D_BEACON_H +#define D_BEACON_H + +#include "m/m_vec.h" + +u32 getMaxBeaconCount(); + +/** + * When passed a position, sets the beacon with the given index to the position. + * When position is nullptr, removes the beacon. + */ +void setBeaconPosition(const mVec3_c *position, u32 beaconIndex); + +/** + * Sets a beacon position similar to `setBeaconPosition`, but corrects the ground level + */ +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/d_flow_mgr.h b/include/toBeSorted/d_flow_mgr.h new file mode 100644 index 00000000..25784a23 --- /dev/null +++ b/include/toBeSorted/d_flow_mgr.h @@ -0,0 +1,31 @@ +#ifndef D_FLOW_MGR_H +#define D_FLOW_MGR_H + +#include "common.h" +#include "d/d_message.h" +#include "sized_string.h" + +class dFlowMgrBase_c { +public: + dFlowMgrBase_c(dFlow_c *flow); + virtual ~dFlowMgrBase_c() {} + + void triggerEntryPoint(s32 labelPart1, s32 labelPart2, u8 p4, u8 p5); + bool checkFinished(); + +private: + /* 0x04 */ dFlow_c *mpFlow; + /* 0x08 */ u8 _0x08[0x14 - 0x08]; + /* 0x14 */ SizedString<0x40> field_0x14; + /* 0x54 */ u8 field_0x54; +}; + +class dFlowMgr_c : public dFlowMgrBase_c { +public: + dFlowMgr_c(); + +private: + /* 0x58 */ dFlow_c mFlow; +}; + +#endif diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index c9a89c2c..6eda3f7d 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -19,6 +19,8 @@ public: static bool canSkipCurrentEvent(); static dAcBase_c *getMainActorInEvent(); + static void execute(); + static EventManager *sInstance; static bool isInEvent() { diff --git a/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/include/toBeSorted/misc_actor.h b/include/toBeSorted/misc_actor.h index 081734e1..4024e1bc 100644 --- a/include/toBeSorted/misc_actor.h +++ b/include/toBeSorted/misc_actor.h @@ -1,6 +1,11 @@ #ifndef MISC_ACTOR_H #define MISC_ACTOR_H +// TODO - this header might be unnecessary; a lot of functions in +// the split corresponding to this header clearly are REL functions +// that were moved to the DOL because they need to be called from the DOL. +// So ideally all of these declarations were moved to REL class definitions... + bool checkIsInSkykeepPuzzle(); void restoreSkykeepPuzzleFromGlobal(); diff --git a/src/d/d_cs_game.cpp b/src/d/d_cs_game.cpp index 5159c763..77bf266a 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 c4490b60..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: @@ -710,7 +712,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 { @@ -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/d_stage.cpp b/src/d/d_stage.cpp index b86ba605..9e8fde25 100644 --- a/src/d/d_stage.cpp +++ b/src/d/d_stage.cpp @@ -70,7 +70,7 @@ int dStage_c::create() { pcam++; } - if (mapRelated.field_0x1EB == 0) { + if (mMapRelated.field_0x1EB == 0) { mVec3_c min, max; for (s32 i = 0; i < MAX_ROOM_NUMBER - 1; i++) { dRoom_c *room = getRoom(i); @@ -89,11 +89,11 @@ int dStage_c::create() { max.y += 6000.0f; mVec3_c size = max - min; mVec3_c center = mVec3_c(min.x + size.x * 0.5f, min.y, min.z + size.z * 0.5f); - mapRelated.fn_801B4B80(0, center, size); + mMapRelated.fn_801B4B80(0, center, size); mVec3_c v = mVec3_c(10000.0f, 10000.0f, 100000.0f); - mapRelated.fn_801B4C70(v); + mMapRelated.fn_801B4C70(v); } - mapRelated.fn_801B50C0(0); + mMapRelated.fn_801B50C0(0); fn_80028A80(); return SUCCEEDED; diff --git a/src/d/lyt/d_lyt_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 6e008c36..ef795225 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -1,14 +1,59 @@ -#include "d/lyt/d_lyt_map.h" +// clang-format off +// vtable order +#define NEED_DIRECT_FRAMECTRL_ACCESS +#include "c/c_math.h" +#include "d/d_player_act.h" +#include "d/snd/d_snd_player_mgr.h" +#include "toBeSorted/minigame_mgr.h" +#include "c/c_lib.h" #include "common.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_tbox.h" +#include "d/d_base.h" +#include "d/d_cs_base.h" +#include "d/d_cs_game.h" #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" +#include "d/d_player.h" +#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" +#include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_lyt_map.h" +#include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_lyt_unknowns.h" +#include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" +#include "d/lyt/meter/d_lyt_meter.h" +#include "d/lyt/msg_window/d_lyt_msg_window.h" +#include "d/snd/d_snd_small_effect_mgr.h" #include "egg/core/eggColorFader.h" +#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" +#include "nw4r/lyt/lyt_group.h" +#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_types.h" +#include "s/s_StateInterfaces.hpp" #include "sized_string.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" +#include "toBeSorted/d_beacon.h" +#include "toBeSorted/event_manager.h" + +// clang-format on struct dLytMap_HIO_c { dLytMap_HIO_c(); @@ -16,7 +61,7 @@ struct dLytMap_HIO_c { /* 0x04 */ f32 field_0x04; /* 0x08 */ f32 field_0x08; - /* 0x0C */ f32 field_0x0C; + /* 0x0C */ f32 mFootstepsScale; /* 0x10 */ f32 field_0x10; /* 0x14 */ f32 field_0x14; /* 0x18 */ u8 field_0x18; @@ -37,9 +82,13 @@ struct dLytMap_HIO_c { /* 0x27 */ u8 field_0x27; /* 0x28 */ u8 field_0x28; /* 0x29 */ u8 field_0x29; - /* 0x2A */ u8 field_0x2A; + /* 0x2A */ u8 mFootstepsAlpha; /* 0x2B */ u8 field_0x2B; /* 0x2C */ f32 field_0x2C; + + f32 getField_0x04() const { + return field_0x04; + } }; dLytMap_HIO_c sHio; @@ -68,13 +117,222 @@ dLytMap_HIO_c::dLytMap_HIO_c() { field_0x28 = 0x5A; field_0x29 = 0x5; field_0x08 = 10.0f; - field_0x0C = 0.4f; - field_0x2A = 0x80; + mFootstepsScale = 0.4f; + mFootstepsAlpha = 0x80; field_0x2B = 10; } dLytMap_HIO_c::~dLytMap_HIO_c() {} +inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { + return mVec3_c(v.x, v.y, 0.0f); +} + +void dMapFootPrintsQueue_c::init() { + int j = ARRAY_LENGTH(mEntries) - 1; + for (int i = 0; i < (int)ARRAY_LENGTH(mEntries); i++) { + mEntries[i].position.set(0.0f, 0.0f, 0.0f); + mEntries[i].pNext = &mEntries[j]; + mEntries[j].pPrev = &mEntries[i]; + j = i; + } + + mpFirst = &mEntries[0]; + mpLast = &mEntries[0]; + mCount = 0; +} + +void dMapFootPrintsQueue_c::addStep(const mVec3_c &pos, const mAng &rot) { + mpLast->position = pos; + mpLast->rotation = rot; + if (mpFirst == mpLast && mCount == ARRAY_LENGTH(mEntries)) { + mpFirst = mpFirst->pPrev; + } + mpLast = mpLast->pPrev; + if (mCount < ARRAY_LENGTH(mEntries)) { + mCount++; + } +} + +dMapFootPrintEntry *dMapFootPrintsQueue_c::getFirst() const { + if (mCount == 0) { + return nullptr; + } + return mpLast->pNext; +} + +dMapFootPrintEntry *dMapFootPrintsQueue_c::getNext(const dMapFootPrintEntry *it) const { + dMapFootPrintEntry *ret = nullptr; + if (it != mpFirst) { + ret = it->pNext; + } + return ret; +} + +void dMapFootPrintsMgr_c::execute() { + dAcPy_c *link = getLinkPtr(); + const mVec3_c &linkPos = link->mPosition; + if (mQueue.isEmpty()) { + mQueue.addStep(linkPos, link->mRotation.y); + } else { + mVec3_c lastPos = mQueue.getFirst()->position; + mVec3_c diff = mVec3_c(linkPos - lastPos); + f32 absXZ = diff.squareMagXZ(); + mAng rot = diff.atan2sX_Z(); + if (absXZ >= mMinStepDistanceSq) { + mQueue.addStep(linkPos, rot); + } + } +} + +dLytMapFootPrints_c::dLytMapFootPrints_c(dLytMapGlobal_c *global) + : mpGlobal(global), + mpPane(nullptr), + field_0xA0(0.0f), + mMaxNumSteps(ARRAY_LENGTH(mFootprintPositions)), + mCurrentNumSteps(0), + field_0x198(0.0f), + field_0x19C(0.0f), + mVisible(false) { + for (int i = 0; i < (int)ARRAY_LENGTH(mFootprintPositions); i++) { + mFootprintPositions[i].set(0.0f, 0.0f); + } +} + +dLytMapGlobal_c *dLytMapFootPrints_c::getGlobal() const { + return mpGlobal; +} + +bool dLytMapFootPrints_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("footPrint_00.brlyt", nullptr); + nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); + root->SetVisible(false); + root->SetAlpha(0); + root->SetInfluencedAlpha(true); + mpPane = mLyt.findPane("P_all_01"); + mLyt.calc(); + field_0xA0 = 1.0f; + return true; +} + +bool dLytMapFootPrints_c::remove() { + return true; +} + +bool dLytMapFootPrints_c::execute() { + dLytMapGlobal_c *global = getGlobal(); + u8 globalAlpha = global->getAlpha(); + nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); + if (globalAlpha != 0) { + root->SetVisible(true); + root->SetAlpha(globalAlpha); + } else { + root->SetVisible(false); + root->SetAlpha(0); + } + const dMapFootPrintsQueue_c *queue = dLytControlGame_c::getInstance()->getFootprintsQueue(); + mVec2_c playerPos; + global->projectOntoMap(playerPos, global->getPlayerPos()); + mMaxNumSteps = sHio.field_0x2B; + + const dMapFootPrintEntry *it = queue->getFirst(); + int i = 0; + + for (; it != nullptr; it = queue->getNext(it)) { + mVec2_c footstepPos; + global->projectOntoMap(footstepPos, it->position); + mVec2_c diff; + diff = footstepPos - playerPos; + f32 dist = diff.length(); + + for (f32 step = dist / global->getField_0x44(); step >= sHio.field_0x08 / field_0x198; + step /= global->getField_0x44()) { + f32 tmp = (sHio.field_0x08 / field_0x198) / step; + + mVec2_c v = mVec2_c((footstepPos - playerPos) * tmp + playerPos); + mFootprintPositions[i] = v; + if (++i >= mMaxNumSteps) { + break; + } + playerPos = v; + diff = footstepPos - playerPos; + step = diff.length(); + } + if (i >= mMaxNumSteps) { + break; + } + } + mCurrentNumSteps = i; + return true; +} + +void dLytMapFootPrints_c::draw() { + if (!mVisible) { + return; + } + + dLytMapGlobal_c *global = getGlobal(); + u8 globalAlpha = global->getAlpha(); + if (globalAlpha == 0) { + return; + } + + // TODO - GPR regswap between pane and mFootprintPositions[i] + nw4r::lyt::Pane *pane = mLyt.getLayout()->GetRootPane(); + + f32 scale = field_0x19C * sHio.mFootstepsScale; + mVec2_c scaleV = mVec2_c(scale, scale); + mpPane->SetScale(scaleV); + + f32 globalAlphaF = globalAlpha; + + for (int i = 0; i < mCurrentNumSteps; i++) { + mVec2_c pos = mVec2_c(global->getField_0x20() + mFootprintPositions[i]); + pane->SetTranslate(vec2ToVec3XY(pos)); + + // TODO - FPR regswaps, maybe fewer temps would work + f32 constantAlpha = sHio.mFootstepsAlpha / 255.0f; + f32 alpha = globalAlphaF * field_0x19C; + int range = mMaxNumSteps; + f32 fadingFactor = ((f32)(range - i) / (f32)range); + pane->SetAlpha(alpha * fadingFactor * constantAlpha); + + pane->CalculateMtx(mLyt.getDrawInfo()); + pane->Draw(mLyt.getDrawInfo()); + } +} + +void dLytMapPutIcon_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPutIcon_00.brlyt", nullptr); + mVisible = true; + mLyt.calc(); +} + +void dLytMapPutIcon_c::remove() { + // no-op +} + +void dLytMapPutIcon_c::execute() { + mLyt.calc(); +} + +void dLytMapPutIcon_c::draw() { + if (mVisible) { + mLyt.draw(); + } +} + +void dLytMapPutIcon_c::setPosition(const mVec2_c &pos) { + mVec3_c pos3 = vec2ToVec3XY(mVec2_c(pos)); + mLyt.getLayout()->GetRootPane()->SetTranslate(pos3); +} + +void dLytMapPutIcon_c::setScale(f32 scale) { + mLyt.getLayout()->GetRootPane()->SetScale(mVec2_c(scale, scale)); +} + STATE_DEFINE(dLytMapPinIcon_c, Wait); STATE_DEFINE(dLytMapPinIcon_c, ToSelect); STATE_DEFINE(dLytMapPinIcon_c, Select); @@ -182,6 +440,7 @@ void dLytMapFader_c::draw() { #define LYT_MAP_PIN_ICON_ANIM_SCALE 0 #define LYT_MAP_PIN_ICON_ANIM_ERASE 1 #define LYT_MAP_PIN_ICON_ANIM_LOOP 2 +#define LYT_MAP_PIN_ICON_NUM_ANIMS 3 void dLytMapPinIcon_c::initializeState_Wait() { mLyt.calc(); @@ -195,7 +454,7 @@ void dLytMapPinIcon_c::executeState_Wait() { return; } - if (field_0x1CC == 0) { + if (!mIsSet) { return; } @@ -208,7 +467,7 @@ void dLytMapPinIcon_c::executeState_Wait() { void dLytMapPinIcon_c::finalizeState_Wait() {} void dLytMapPinIcon_c::initializeState_ToSelect() { - d2d::AnmGroup_c *m = &mAnmGroups[1]; + d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; m->bind(false); m->setFrame(0.0f); } @@ -220,7 +479,33 @@ void dLytMapPinIcon_c::finalizeState_ToSelect() { } void dLytMapPinIcon_c::initializeState_Select() {} -void dLytMapPinIcon_c::executeState_Select() {} +void dLytMapPinIcon_c::executeState_Select() { + if (field_0x1D0->field_0x05 && dPad::getDownTrigC()) { + removeBeacon(); + field_0x1D0->field_0x04 = false; + d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; + if (m->isBound()) { + m->unbind(); + } + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_REMOVE); + mStateMgr.changeState(StateID_Remove); + return; + } + + if (field_0x1BC == 0) { + d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; + m->bind(false); + m->setFrame(0.0f); + mLyt.calc(); + m->unbind(); + mStateMgr.changeState(StateID_ToUnselect); + } else { + d2d::AnmGroup_c *m = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; + if (m->isBound()) { + m->play(); + } + } +} void dLytMapPinIcon_c::finalizeState_Select() {} void dLytMapPinIcon_c::initializeState_ToUnselect() {} @@ -237,16 +522,80 @@ void dLytMapPinIcon_c::executeState_Remove() { } void dLytMapPinIcon_c::finalizeState_Remove() {} +void dLytMapPinIcon_c::updatePosition() { + dLytMapGlobal_c *global = getGlobal(); + if (mIsSet) { + mVec2_c pos2d; + global->projectOntoMap(pos2d, mPosition); + pos2d += global->getField_0x20(); + mVec3_c translate3d = vec2ToVec3XY(pos2d); + mLyt.getLayout()->GetRootPane()->SetTranslate(translate3d); + } + + bool vis = mIsSet; + mLyt.getLayout()->GetRootPane()->SetVisible(mIsSet); + if (mpBounding != nullptr) { + mpBounding->SetVisible(vis); + } + + mLyt.getLayout()->GetRootPane()->SetAlpha(global->getAlpha()); + mLyt.getLayout()->GetRootPane()->SetInfluencedAlpha(true); + mLyt.calc(); +} + +void dLytMapPinIcon_c::checkPointedAt() { + field_0x1BC = 0; + dCursorHitCheck_c *chk = dCsGame_c::GetInstance()->getCursorHit(); + if (chk != nullptr && chk->getType() == 'lyt ' && + static_cast(chk)->getHitPane() == mpBounding) { + field_0x1BC = 1; + } +} + +void dLytMapPinIcon_c::setPosition(const mVec3_c &pos) { + d2d::AnmGroup_c *anm; + + mPosition = pos; + dLytMapGlobal_c *global = getGlobal(); + mVec2_c pos2d; + global->projectOntoMap(pos2d, pos); + pos2d += global->getField_0x20(); + mVec3_c translate3d = vec2ToVec3XY(mVec2_c(pos2d)); + + mLyt.getLayout()->GetRootPane()->SetTranslate(translate3d); + mLyt.getLayout()->GetRootPane()->SetVisible(true); + + anm = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_ERASE]; + + anm->bind(false); + anm->setFrame(0.0f); + mLyt.calc(); + anm->unbind(); + mIsSet = true; +} + +void dLytMapPinIcon_c::removeBeacon() { + mIsSet = false; + if (mpBounding != nullptr) { + mpBounding->SetVisible(false); + } + setBeaconPosition(nullptr, mIndex); +} + dLytMapPinIcon_c::~dLytMapPinIcon_c() { if (dCsMgr_c::GetInstance()->isRegist(&mCsHitCheck)) { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); } } +dLytMapGlobal_c *dLytMapPinIcon_c::getGlobal() const { + return dLytMapGlobal_c::GetInstance(); +} + static const d2d::LytBrlanMapping sMapPinIconBrlanMap[] = { {"mapPutIcon_00_scale.brlan", "G_scale_00"}, {"mapPutIcon_00_erase.brlan", "G_scale_00"}, - { "mapPutIcon_00_loop.brlan", "G_scale_00"}, + { "mapPutIcon_00_loop.brlan", "G_loop_00"}, }; bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { @@ -255,7 +604,7 @@ bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { d2d::AnmGroup_c *pAnmGroups = mAnmGroups; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { pAnmGroups[i].init(sMapPinIconBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapPinIconBrlanMap[i].mName); pAnmGroups[i].bind(false); pAnmGroups[i].setFrame(0.0f); @@ -263,7 +612,7 @@ bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { mLyt.calc(); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { pAnmGroups[i].unbind(); } @@ -278,25 +627,41 @@ bool dLytMapPinIcon_c::build(d2d::ResAccIf_c *resAcc) { mStateMgr.changeState(StateID_Wait); field_0x1BC = 0; - field_0x1CC = 0; - field_0x1DC = 0; + mIsSet = false; + mLoopFrame = 0; return true; } bool dLytMapPinIcon_c::remove() { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < LYT_MAP_PIN_ICON_NUM_ANIMS; i++) { mAnmGroups[i].remove(); } return true; } +void dLytMapPinIcon_c::setScale(f32 scale) { + // TODO - probably inlines + f32 frame = mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].getLastFrame(); + d2d::AnmGroup_c *grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE]; + grp->setFrame(scale * frame); + mLyt.calc(); +} + bool dLytMapPinIcon_c::execute() { - fn_8012EC30(); + checkPointedAt(); mStateMgr.executeState(); field_0x1BC = 0; - mAnmGroups[2].setFrame(field_0x1DC); - // TODO something MapCapture + d2d::AnmGroup_c *grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP]; + grp->setFrame(mLoopFrame); + + // TODO - probably inlines + dLytMapGlobal_c *global = getGlobal(); + f32 frame = mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE].getLastFrame(); + grp = &mAnmGroups[LYT_MAP_PIN_ICON_ANIM_SCALE]; + f32 tmp = global->getZoomFrame(); + grp->setFrame(tmp * frame); + mLyt.calc(); mCsHitCheck.resetCachedHitboxes(); mCsHitCheck.execute(); @@ -310,7 +675,7 @@ bool dLytMapPinIcon_c::draw() { void dLytMapPinIconAggregate_c::initializeState_Wait() {} void dLytMapPinIconAggregate_c::executeState_Wait() { - for (int i = 0; i < 5; i++) { + for (int i = 0; i < (int)ARRAY_LENGTH(mPins); i++) { if (mPins[i].isSelect()) { mStateMgr.changeState(StateID_Select); } @@ -321,7 +686,7 @@ void dLytMapPinIconAggregate_c::finalizeState_Wait() {} void dLytMapPinIconAggregate_c::initializeState_Select() {} void dLytMapPinIconAggregate_c::executeState_Select() { bool anyRemove = false; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < (int)ARRAY_LENGTH(mPins); i++) { if (mPins[i].isRemove()) { mStateMgr.changeState(StateID_Remove); anyRemove = true; @@ -332,7 +697,7 @@ void dLytMapPinIconAggregate_c::executeState_Select() { if (!anyRemove) { bool allSelect = true; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < (int)ARRAY_LENGTH(mPins); i++) { if (mPins[i].isSelect()) { allSelect = false; break; @@ -353,42 +718,621 @@ void dLytMapPinIconAggregate_c::executeState_Remove() { } void dLytMapPinIconAggregate_c::finalizeState_Remove() {} +bool dLytMapPinIconAggregate_c::findNewBeaconId(s32 *pOutId) { + bool ret = false; + for (s32 idx = 0; idx < getMaxBeaconCount(); idx++) { + s32 existingIndex = mPins[idx].mIndex; + if (!mPins[idx].mIsSet) { + // If we have an unused id, use that + *pOutId = idx; + ret = true; + break; + } + + // Otherwise use the lowest id ("oldest beacon"?) + if (existingIndex < *pOutId) { + *pOutId = existingIndex; + } + } + + return ret; +} + +void dLytMapPinIconAggregate_c::setScale(f32 scale) { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].setScale(scale); + } +} + +void dLytMapPinIconAggregate_c::updatePosition() { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].updatePosition(); + } +} + +void dLytMapPinIconAggregate_c::setUnk(LytMap0x80520B5C *unk) { + field_0x9A0 = unk; + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].field_0x1D0 = unk; + } +} + +bool dLytMapPinIconAggregate_c::setPosition(s32 index, const mVec3_c &position) { + bool ret = false; + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + if (mPins[idx].mIndex == index) { + mPins[idx].setPosition(position); + ret = true; + break; + } + } + return ret; +} + +void dLytMapPinIconAggregate_c::unsetAll() { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].mIsSet = false; + } +} + +u32 dLytMapPinIconAggregate_c::getNumSetPins() const { + s32 num = 0; + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + if (mPins[idx].mIsSet) { + num++; + } + } + return num; +} + +bool dLytMapPinIconAggregate_c::build(d2d::ResAccIf_c *resAcc) { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].build(resAcc); + } + mLoopFrame = 0; + mLoopFrameMax = mPins[0].mAnmGroups[LYT_MAP_PIN_ICON_ANIM_LOOP].getAnimDuration(); + mStateMgr.changeState(StateID_Wait); + return true; +} + +bool dLytMapPinIconAggregate_c::remove() { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].remove(); + } + return true; +} + +bool dLytMapPinIconAggregate_c::execute() { + mLoopFrame++; + if (mLoopFrame > mLoopFrameMax) { + mLoopFrame = 0; + } + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].mLoopFrame = mLoopFrame; + mPins[idx].execute(); + } + mStateMgr.executeState(); + return true; +} + +bool dLytMapPinIconAggregate_c::draw() { + for (int idx = 0; idx < (int)ARRAY_LENGTH(mPins); idx++) { + mPins[idx].draw(); + } + return true; +} + +void dLytMapFloorBtn_c::init() { + mStateMgr.changeState(StateID_Wait); +} + +void dLytMapFloorBtn_c::execute() { + mStateMgr.executeState(); +} + +void dLytMapFloorBtn_c::directlyDecide() { + if (mpAnmGroups->mOnOff.isBound()) { + mpAnmGroups->mOnOff.unbind(); + } + if (mpAnmGroups->mDecide.isBound()) { + mpAnmGroups->mDecide.unbind(); + } + mpAnmGroups->mOnOffLight.bind(false); + mpAnmGroups->mOnOffLight.setToEnd(); + mpOwnerLyt->calc(); + mpAnmGroups->mOnOffLight.unbind(); +} + +void dLytMapFloorBtn_c::directlyUndecide() { + if (mpAnmGroups->mOnOffLight.isBound()) { + mpAnmGroups->mOnOffLight.unbind(); + } + if (mpAnmGroups->mDecide.isBound()) { + mpAnmGroups->mDecide.unbind(); + } + mpAnmGroups->mOnOff.bind(false); + mpAnmGroups->mOnOff.setFrame(0.0f); + mpOwnerLyt->calc(); + mpAnmGroups->mOnOff.unbind(); +} + void dLytMapFloorBtn_c::initializeState_Wait() {} -void dLytMapFloorBtn_c::executeState_Wait() {} +void dLytMapFloorBtn_c::executeState_Wait() { + if (mSelected) { + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); + mpAnmGroups->mOnOff.bind(false); + mpAnmGroups->mOnOff.setFrame(0.0f); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_FLOOR); + mStateMgr.changeState(StateID_ToSelect); + } +} void dLytMapFloorBtn_c::finalizeState_Wait() {} void dLytMapFloorBtn_c::initializeState_ToSelect() {} -void dLytMapFloorBtn_c::executeState_ToSelect() {} +void dLytMapFloorBtn_c::executeState_ToSelect() { + if (mpAnmGroups->mOnOff.isEndReached()) { + mpOwnerLyt->calc(); + mpAnmGroups->mOnOff.unbind(); + mStateMgr.changeState(StateID_Select); + } +} void dLytMapFloorBtn_c::finalizeState_ToSelect() {} void dLytMapFloorBtn_c::initializeState_Select() {} -void dLytMapFloorBtn_c::executeState_Select() {} +void dLytMapFloorBtn_c::executeState_Select() { + if (!mSelected) { + mpAnmGroups->mOnOff.bind(false); + mpAnmGroups->mOnOff.setBackward(); + mpAnmGroups->mOnOff.setToStart(); + mStateMgr.changeState(StateID_ToWait); + } else if (mDecided) { + mpAnmGroups->mDecide.bind(false); + mpAnmGroups->mDecide.setFrame(0.0f); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_SELECT_FLOOR); + mStateMgr.changeState(StateID_ToSelectInDecide); + } +} void dLytMapFloorBtn_c::finalizeState_Select() {} void dLytMapFloorBtn_c::initializeState_ToWait() {} -void dLytMapFloorBtn_c::executeState_ToWait() {} +void dLytMapFloorBtn_c::executeState_ToWait() { + if (mpAnmGroups->mOnOff.isStop2()) { + mpOwnerLyt->calc(); + mpAnmGroups->mOnOff.unbind(); + mStateMgr.changeState(StateID_Wait); + } +} void dLytMapFloorBtn_c::finalizeState_ToWait() {} void dLytMapFloorBtn_c::initializeState_ToSelectInDecide() {} -void dLytMapFloorBtn_c::executeState_ToSelectInDecide() {} +void dLytMapFloorBtn_c::executeState_ToSelectInDecide() { + if (mpAnmGroups->mDecide.isStop2()) { + mpOwnerLyt->calc(); + mpAnmGroups->mDecide.unbind(); + mStateMgr.changeState(StateID_SelectInDecide); + } +} void dLytMapFloorBtn_c::finalizeState_ToSelectInDecide() {} void dLytMapFloorBtn_c::initializeState_SelectInDecide() {} -void dLytMapFloorBtn_c::executeState_SelectInDecide() {} +void dLytMapFloorBtn_c::executeState_SelectInDecide() { + if (!mSelected) { + mpAnmGroups->mOnOffLight.bind(false); + mpAnmGroups->mOnOffLight.setToStart(); + mStateMgr.changeState(StateID_ToDecide); + } +} void dLytMapFloorBtn_c::finalizeState_SelectInDecide() {} void dLytMapFloorBtn_c::initializeState_ToDecide() {} -void dLytMapFloorBtn_c::executeState_ToDecide() {} +void dLytMapFloorBtn_c::executeState_ToDecide() { + if (mpAnmGroups->mOnOffLight.isStop2()) { + mpAnmGroups->mOnOffLight.unbind(); + mpOwnerLyt->calc(); + mStateMgr.changeState(StateID_Decide); + } +} void dLytMapFloorBtn_c::finalizeState_ToDecide() {} void dLytMapFloorBtn_c::initializeState_Decide() {} -void dLytMapFloorBtn_c::executeState_Decide() {} +void dLytMapFloorBtn_c::executeState_Decide() { + if (mSelected) { + mpAnmGroups->mOnOffLight.bind(false); + mpAnmGroups->mOnOffLight.setBackward(); + mpAnmGroups->mOnOffLight.setToStart(); + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_FLOOR); + mStateMgr.changeState(StateID_DecideToSelectInDecide); + } else if (!mDecided) { + mpAnmGroups->mOnOff.bind(false); + mpAnmGroups->mOnOff.setFrame(0.0f); + mpOwnerLyt->getLayout()->Animate(0); + mpOwnerLyt->calc(); + mpAnmGroups->mOnOff.unbind(); + mStateMgr.changeState(StateID_Wait); + } +} void dLytMapFloorBtn_c::finalizeState_Decide() {} void dLytMapFloorBtn_c::initializeState_DecideToSelectInDecide() {} -void dLytMapFloorBtn_c::executeState_DecideToSelectInDecide() {} +void dLytMapFloorBtn_c::executeState_DecideToSelectInDecide() { + if (mpAnmGroups->mOnOffLight.isStop2()) { + mpOwnerLyt->calc(); + mpAnmGroups->mOnOffLight.unbind(); + mStateMgr.changeState(StateID_SelectInDecide); + } +} void dLytMapFloorBtn_c::finalizeState_DecideToSelectInDecide() {} +static const char *sFloorBtnBoundings[] = { + "B_choices_00", + "B_choices_01", + "B_choices_02", + "B_choices_03", +}; + +static const char *sFloorBtnText[] = { + "T_text_00", + "T_text_01", + "T_text_02", + "T_text_03", +}; + +static const char *sFloorBtnTextS[] = { + "T_textS_00", + "T_textS_01", + "T_textS_02", + "T_textS_03", +}; + +static const d2d::LytBrlanMapping brlanMapFloorBtnMgr[] = { + {"mapFloorBtn_00_btnV.brlan", "G_btnV_00"}, +}; + +#define MAP_FLOOR_BTN_MGR_ANIM_BTNV 0 +#define MAP_FLOOR_BTN_MGR_NUM_ANIMS 1 + +static const char *brlanListFloorBtn[] = { + "mapFloorBtn_00_btnLoop.brlan", + "mapFloorBtn_00_btnOnOffNormal.brlan", + "mapFloorBtn_00_btnDecideNormal.brlan", + "mapFloorBtn_00_btnOnOffLight.brlan", +}; + +static const char *groupListFloorBtn[][4] = { + {"G_btnLoop_00", "G_btn_00", "G_btn_00", "G_btn_00"}, + {"G_btnLoop_01", "G_btn_01", "G_btn_01", "G_btn_01"}, + {"G_btnLoop_02", "G_btn_02", "G_btn_02", "G_btn_02"}, + {"G_btnLoop_03", "G_btn_03", "G_btn_03", "G_btn_03"}, +}; + +#define MAP_FLOOR_BTN_MGR_NUM_BTNS 4 + +bool dLytMapFloorBtnMgr_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapFloorBtn_00.brlyt", nullptr); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_ANIMS; i++) { + mAnmGroups[i].init(brlanMapFloorBtnMgr[i].mFile, resAcc, mLyt.getLayout(), brlanMapFloorBtnMgr[i].mName); + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mLoop.init(brlanListFloorBtn[0], resAcc, mLyt.getLayout(), groupListFloorBtn[i][0]); + mBtnGroups[i].mOnOff.init(brlanListFloorBtn[1], resAcc, mLyt.getLayout(), groupListFloorBtn[i][1]); + mBtnGroups[i].mDecide.init(brlanListFloorBtn[2], resAcc, mLyt.getLayout(), groupListFloorBtn[i][2]); + mBtnGroups[i].mOnOffLight.init(brlanListFloorBtn[3], resAcc, mLyt.getLayout(), groupListFloorBtn[i][3]); + } + + nw4r::lyt::Bounding *bounding; + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + bounding = mLyt.findBounding(sFloorBtnBoundings[i]); + mFloorBtns[i].init(); + mFloorBtns[i].mpBounding = bounding; + bounding->SetVisible(false); + mCsHitChecks[i].init(bounding, 0x2, 0, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitChecks[i]); + } + + mpPane = mLyt.findPane("N_all_00"); + mpPane->SetInfluencedAlpha(true); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].mpOwnerLyt = &mLyt; + mFloorBtns[i].mpAnmGroups = &mBtnGroups[i]; + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mOnOff.bind(false); + mBtnGroups[i].mOnOff.setFrame(0.0f); + } + + mLyt.getLayout()->Animate(0); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mOnOff.unbind(); + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mLoop.bind(false); + } + + mLyt.calc(); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mCsHitChecks[i].resetCachedHitboxes(); + mCsHitChecks[i].execute(); + } + + mPointerVisible = false; + mPrevPointerVisible = false; + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].mSelected = false; + } + + mStateMgr.changeState(StateID_Invisible); + + return true; +} + +bool dLytMapFloorBtnMgr_c::remove() { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[i]); + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mOnOff.remove(); + mBtnGroups[i].mLoop.remove(); + mBtnGroups[i].mDecide.remove(); + mBtnGroups[i].mOnOffLight.remove(); + } + // not removing our own anm group... + + dPadNav::setNavEnabled(false, false); + + return true; +} + +bool dLytMapFloorBtnMgr_c::execute() { + field_0x70C = 4; + if (*mStateMgr.getStateID() != StateID_Invisible) { + if (mPointerVisible) { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].execute(); + } + mStateMgr.executeState(); + } else { + // Determine the currently active floor + s32 activeBtn = 0; + s32 direction = dPadNav::getFSStickNavDirection(); + if (mPointerVisible != mPrevPointerVisible) { + // We just turned off pointing, so make the decided button the selected one too + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (mFloorBtns[i].mDecided) { + activeBtn = i; + } + } + } else { + // Normal handling - pointing off, selected button stays selected + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (mFloorBtns[i].mSelected) { + activeBtn = i; + } + } + } + + // Handle navigation + if (activeBtn > 0 && (direction == dPadNav::FS_STICK_UP || direction == dPadNav::FS_STICK_UP_RIGHT || + direction == dPadNav::FS_STICK_UP_LEFT)) { + activeBtn--; + } + + if (activeBtn < mNumFloors - 1 && + (direction == dPadNav::FS_STICK_DOWN || direction == dPadNav::FS_STICK_DOWN_RIGHT || + direction == dPadNav::FS_STICK_DOWN_LEFT)) { + activeBtn++; + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (i == activeBtn) { + mFloorBtns[i].mSelected = true; + if (dCsBase_c::GetInstance() != nullptr) { + dCsBase_c::GetInstance()->setCursorStickTargetPane(mFloorBtns[i].mpBounding); + } + } else { + mFloorBtns[i].mSelected = false; + } + } + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].execute(); + } + } + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mBtnGroups[i].mLoop.play(); + if (mBtnGroups[i].mOnOff.isBound()) { + mBtnGroups[i].mOnOff.play(); + } + if (mBtnGroups[i].mDecide.isBound()) { + mBtnGroups[i].mDecide.play(); + } + if (mBtnGroups[i].mOnOffLight.isBound()) { + mBtnGroups[i].mOnOffLight.play(); + } + } + } + mLyt.calc(); + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mCsHitChecks[i].resetCachedHitboxes(); + mCsHitChecks[i].execute(); + } + + return true; +} + +void dLytMapFloorBtnMgr_c::checkPointedAtBtn() { + mPrevPointerVisible = mPointerVisible; + mPointerVisible = dPadNav::isPointerVisible(); + if (mForceNoNav) { + dPadNav::stopFSStickNav(); + mPointerVisible = true; + } + + if (mPointerVisible) { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + mFloorBtns[i].mSelected = false; + } + + dCursorHitCheck_c *chk = dCsGame_c::GetInstance()->getCursorHit(); + if (chk != nullptr && chk->getType() == 'lyt ') { + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (chk == &mCsHitChecks[i]) { + mFloorBtns[i].mSelected = true; + } + } + } + } +} + +s32 dLytMapFloorBtnMgr_c::getPointedAtBtnIdx() const { + s32 idx = -1; + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (mFloorBtns[i].mSelected) { + idx = i; + break; + } + } + return idx; +} + +bool dLytMapFloorBtnMgr_c::isUsingPointerNav() const { + return mPointerVisible; +} + +void dLytMapFloorBtnMgr_c::resetFloor(s32 newFloorBtn) { + mFloorBtns[mSelectedBtnIdx].mDecided = false; + mFloorBtns[mSelectedBtnIdx].directlyUndecide(); + mFloorBtns[mSelectedBtnIdx].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Wait); + + mFloorBtns[newFloorBtn].mDecided = true; + mFloorBtns[newFloorBtn].directlyDecide(); + mFloorBtns[newFloorBtn].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Decide); + + mSelectedBtnIdx = newFloorBtn; +} + +void dLytMapFloorBtnMgr_c::decideSelectedFloor() { + for (int i = 0; i < mNumFloors; i++) { + if (mFloorBtns[i].mSelected) { + if (i != mSelectedBtnIdx) { + mFloorBtns[mSelectedBtnIdx].mDecided = false; + mFloorBtns[i].mDecided = true; + } + mSelectedBtnIdx = i; + } + } +} + +bool dLytMapFloorBtnMgr_c::canDecideFloor() const { + bool ret = false; + + s32 idx = getPointedAtBtnIdx(); + if (idx >= 0) { + // When pointing at a button that is thus selected but not yet decided, + // we can decide on that button if it's not busy animating... + if (!mFloorBtns[idx].mDecided) { + if (mFloorBtns[idx].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Select)) { + bool busy = mFloorBtns[idx].mpAnmGroups->mOnOff.isBound() || + mFloorBtns[idx].mpAnmGroups->mDecide.isBound() || + mFloorBtns[idx].mpAnmGroups->mOnOffLight.isBound(); + if (!busy) { + ret = true; + } + } + } + } + + for (int i = 0; i < mNumFloors; i++) { + // But if any other button is animating and in a changing state, also forbid + if (i != idx) { + bool busy = mFloorBtns[i].mpAnmGroups->mOnOff.isBound() || mFloorBtns[i].mpAnmGroups->mDecide.isBound() || + mFloorBtns[i].mpAnmGroups->mOnOffLight.isBound(); + + if (busy) { + if (!mFloorBtns[i].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Wait) && + !mFloorBtns[i].mStateMgr.isState(dLytMapFloorBtn_c::StateID_Decide)) { + ret = false; + break; + } + } + } + } + + return ret; +} + +s32 dLytMapFloorBtnMgr_c::getCurrentFloor() const { + s32 ret = -1; + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + if (mFloorBtns[i].mDecided) { + ret = i; + } + } + return mBaseFloorOffset - ret; +} + +// What it says on the tin +static const char *sFloorBtnLabels[] = { + "FLOOR_F3", "FLOOR_F2", "FLOOR_F1", "FLOOR_B1", "FLOOR_B2", "FLOOR_B3", +}; + +void dLytMapFloorBtnMgr_c::init(s32 numFloors, s32 baseFloorOffset, s32 selectedFloor) { + mNumFloors = numFloors; + mBaseFloorOffset = baseFloorOffset; + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + bool visible = i < mNumFloors && mNumFloors >= 2; + mLyt.findPane(sFloorBtnBoundings[i])->SetVisible(visible); + } + + if (mNumFloors >= 2) { + mLyt.getLayout()->GetRootPane()->SetVisible(true); + mAnmGroups[0].bind(false); + mAnmGroups[0].setFrame(mNumFloors - 2); + + for (int i = 0; i < MAP_FLOOR_BTN_MGR_NUM_BTNS; i++) { + bool visible = i < mNumFloors && mNumFloors >= 2; + mLyt.findPane(sFloorBtnBoundings[i])->SetVisible(visible); + if (visible) { + int labelIdx = (2 - mBaseFloorOffset) + i; + dTextBox_c *textBox = mLyt.getTextBox(sFloorBtnText[i]); + textBox->setMessageWithGlobalTextProcessor2(sFloorBtnLabels[labelIdx], nullptr); + textBox = mLyt.getTextBox(sFloorBtnTextS[i]); + textBox->setMessageWithGlobalTextProcessor2(sFloorBtnLabels[labelIdx], nullptr); + } + } + + // Floor buttons are descending but selectedFloor is ascending + s32 tmp = -(selectedFloor - baseFloorOffset); + mSelectedBtnIdx = tmp; + mFloorBtns[tmp].mDecided = true; + mFloorBtns[tmp].mStateMgr.changeState(dLytMapFloorBtn_c::StateID_Decide); + + // TODO probably an inline + d2d::AnmGroup_c &anm = mBtnGroups[tmp].mOnOffLight; + + anm.bind(false); + mBtnGroups[tmp].mOnOffLight.setToEnd(); + mLyt.getLayout()->Animate(0); + mLyt.calc(); + anm.unbind(); + if (mAnmGroups[0].bind(false)) { + mAnmGroups[0].unbind(); + } + } else { + mLyt.getLayout()->GetRootPane()->SetVisible(false); + } +} + void dLytMapFloorBtnMgr_c::initializeState_Invisible() {} void dLytMapFloorBtnMgr_c::executeState_Invisible() {} void dLytMapFloorBtnMgr_c::finalizeState_Invisible() {} @@ -406,99 +1350,2337 @@ dLytMapFloorBtnMgr_c::~dLytMapFloorBtnMgr_c() { dPadNav::setNavEnabled(false, false); } +#define MAP_POPUP_INFO_ANIM_IN 0 +#define MAP_POPUP_INFO_ANIM_OUT 1 +#define MAP_POPUP_INFO_ANIM_INPUT 2 + +#define MAP_POPUP_INFO_NUM_ANIMS 3 + void dLytMapPopupInfo_c::initializeState_Invisible() {} void dLytMapPopupInfo_c::executeState_Invisible() {} void dLytMapPopupInfo_c::finalizeState_Invisible() {} -void dLytMapPopupInfo_c::initializeState_In() {} -void dLytMapPopupInfo_c::executeState_In() {} +void dLytMapPopupInfo_c::initializeState_In() { + mAnmGroups[MAP_POPUP_INFO_ANIM_IN].bind(false); +} +void dLytMapPopupInfo_c::executeState_In() { + if (mAnmGroups[MAP_POPUP_INFO_ANIM_IN].isEndReached()) { + mLyt.calc(); + mAnmGroups[MAP_POPUP_INFO_ANIM_IN].unbind(); + mStateMgr.changeState(StateID_Wait); + } +} void dLytMapPopupInfo_c::finalizeState_In() {} void dLytMapPopupInfo_c::initializeState_Wait() {} -void dLytMapPopupInfo_c::executeState_Wait() {} +void dLytMapPopupInfo_c::executeState_Wait() { + if (dLytMsgWindow_c::getInstance()->isVisible()) { + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].bind(false); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setForward(); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setToStart(); + mStateMgr.changeState(StateID_WaitInvalid); + } else if (mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].isStop2()) { + mLyt.calc(); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].unbind(); + } +} void dLytMapPopupInfo_c::finalizeState_Wait() {} void dLytMapPopupInfo_c::initializeState_WaitInvalid() {} -void dLytMapPopupInfo_c::executeState_WaitInvalid() {} +void dLytMapPopupInfo_c::executeState_WaitInvalid() { + if (!dLytMsgWindow_c::getInstance()->isVisible()) { + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].bind(false); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setBackward(); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].setToStart(); + mStateMgr.changeState(StateID_Wait); + } else if (mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].isStop2()) { + mLyt.calc(); + mAnmGroups[MAP_POPUP_INFO_ANIM_INPUT].unbind(); + } +} void dLytMapPopupInfo_c::finalizeState_WaitInvalid() {} -void dLytMapPopupInfo_c::initializeState_Out() {} -void dLytMapPopupInfo_c::executeState_Out() {} +void dLytMapPopupInfo_c::initializeState_Out() { + mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].bind(false); +} +void dLytMapPopupInfo_c::executeState_Out() { + if (mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].isEndReached()) { + mLyt.calc(); + mAnmGroups[MAP_POPUP_INFO_ANIM_OUT].unbind(); + } +} void dLytMapPopupInfo_c::finalizeState_Out() {} +static const d2d::LytBrlanMapping sMapPopupInfoBrlanMap[] = { + { "mapPopupInfo_00_in.brlan", "G_inOut_00"}, + { "mapPopupInfo_00_out.brlan", "G_inOut_00"}, + {"mapPopupInfo_00_inPut.brlan", "G_input_00"}, +}; + +void dLytMapPopupInfo_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPopupInfo_00.brlyt", nullptr); + for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { + mAnmGroups[i].init(sMapPopupInfoBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapPopupInfoBrlanMap[i].mName); + } + mStateMgr.changeState(StateID_Invisible); +} + +void dLytMapPopupInfo_c::remove() { + for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } +} + +void dLytMapPopupInfo_c::execute() { + mStateMgr.executeState(); + mLyt.calc(); + for (int i = 0; i < MAP_POPUP_INFO_NUM_ANIMS; i++) { + if (mAnmGroups[i].isBound()) { + mAnmGroups[i].play(); + } + } +} + +void dLytMapPopupInfo_c::draw() { + mLyt.draw(); +} + +#define MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT 0 +#define MAP_SAVE_POPUP_ACTION_ANIM_INPUT 1 + +#define MAP_SAVE_POPUP_ACTION_NUM_ANIMS 2 + void dLytMapSavePopupAction_c::initializeState_Invisible() {} -void dLytMapSavePopupAction_c::executeState_Invisible() {} +void dLytMapSavePopupAction_c::executeState_Invisible() { + if (mInRequest) { + mStateMgr.changeState(StateID_In); + } +} void dLytMapSavePopupAction_c::finalizeState_Invisible() {} -void dLytMapSavePopupAction_c::initializeState_In() {} -void dLytMapSavePopupAction_c::executeState_In() {} +void dLytMapSavePopupAction_c::initializeState_In() { + // TODO - explain why this seems unnecessarily complicated + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setForward(); + mpAnmGroupInOut->setToStart(); + mInOutFrame = mpAnmGroupInOut->getFrame(); + mpAnmGroupInOut->unbind(); +} +void dLytMapSavePopupAction_c::executeState_In() { + // TODO - explain why this seems unnecessarily complicated + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setFrame(mInOutFrame); + mpAnmGroupInOut->play(); + if (mpAnmGroupInOut->isEndReached()) { + mStateMgr.changeState(StateID_Wait); + } + mInOutFrame = mpAnmGroupInOut->getFrame(); + mpAnmGroupInOut->unbind(); +} void dLytMapSavePopupAction_c::finalizeState_In() {} void dLytMapSavePopupAction_c::initializeState_Wait() {} -void dLytMapSavePopupAction_c::executeState_Wait() {} +void dLytMapSavePopupAction_c::executeState_Wait() { + if (!mInRequest) { + mStateMgr.changeState(StateID_Out); + } +} void dLytMapSavePopupAction_c::finalizeState_Wait() {} -void dLytMapSavePopupAction_c::initializeState_Out() {} -void dLytMapSavePopupAction_c::executeState_Out() {} +void dLytMapSavePopupAction_c::initializeState_Out() { + // TODO - explain why this seems unnecessarily complicated + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setBackward(); + mpAnmGroupInOut->setToStart(); + mInOutFrame = mpAnmGroupInOut->getFrame(); + mpAnmGroupInOut->unbind(); +} +void dLytMapSavePopupAction_c::executeState_Out() { + // TODO - explain why this seems unnecessarily complicated + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setBackward(); + mpAnmGroupInOut->setFrame(mInOutFrame); + mpAnmGroupInOut->play(); + if (mpAnmGroupInOut->isStop2()) { + mStateMgr.changeState(StateID_Wait); + } + mInOutFrame = mpAnmGroupInOut->getFrame(); + mpAnmGroupInOut->unbind(); +} void dLytMapSavePopupAction_c::finalizeState_Out() {} +void dLytMapSavePopupAction_c::execute() { + mStateMgr.executeState(); +} + +void dLytMapSavePopupAction_c::init(d2d::AnmGroup_c *pGroups) { + mpAnmGroupInOut = &pGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT]; + mpAnmGroupInput = &pGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT]; +} + +void dLytMapSavePopupAction_c::hide() { + mpAnmGroupInOut->bind(false); + mpAnmGroupInOut->setFrame(0.0f); + mpAnmGroupInOut->unbind(); + mStateMgr.changeState(StateID_Invisible); +} + +static const d2d::LytBrlanMapping sMapSavePopupActionBrlanMap[] = { + {"mapPopup_00_inOut.brlan", "G_inOut_00"}, + {"mapPopup_00_scale.brlan", "G_scale_00"}, +}; + +void dLytMapSavePopup_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPopup_00.brlyt", nullptr); + for (int i = 0; i < MAP_SAVE_POPUP_ACTION_NUM_ANIMS; i++) { + mAnmGroups[i].init( + sMapSavePopupActionBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSavePopupActionBrlanMap[i].mName + ); + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mActions); i++) { + mActions[i].init(mAnmGroups); + mActions[i].mStateMgr.changeState(dLytMapSavePopupAction_c::StateID_Invisible); + } +} + +void dLytMapSavePopup_c::remove() { + for (int i = 0; i < MAP_SAVE_POPUP_ACTION_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } +} + +void dLytMapSavePopup_c::execute() { + for (int i = 0; i < mStatueNum; i++) { + mActions[i].mInRequest = mCurrentlyInStatue == i; + } + + for (int i = 0; i < mStatueNum; i++) { + mActions[i].execute(); + } +} + +void dLytMapSavePopup_c::draw() { + nw4r::lyt::Bounding *pBounding; + + f32 scaleX = mLyt.getDrawInfo().GetLocationAdjustScale().x; + nw4r::lyt::Pane *rootPane = mLyt.getLayout()->GetRootPane(); + for (int i = 0; i < mStatueNum; i++) { + const sStateIDIf_c *stateID = mActions[i].mStateMgr.getStateID(); + if (*stateID != dLytMapSavePopupAction_c::StateID_Invisible) { + pBounding = mpStatueBoundings[i]; + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].bind(false); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].setFrame(30.0f); + const dMapSaveObjDefinition *def = dLytMap_c::GetInstance()->getSaveObjDefinition(i); + f32 width = setStatueLabel(def->statueLabel); + + f32 allScaleX = mLyt.findPane("N_all_00")->GetScale().x; + // TODO fadds regswap + f32 x = pBounding->GetGlobalMtx()._03 + (0.5f * width * allScaleX * scaleX) + sHio.field_0x04; + f32 y = pBounding->GetGlobalMtx()._13; + mVec2_c translate2d(x, y); + mVec3_c translate = vec2ToVec3XY(translate2d); + rootPane->SetTranslate(translate); + + if (*stateID == dLytMapSavePopupAction_c::StateID_In) { + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setFrame(mActions[i].mInOutFrame); + mLyt.calc(); + mLyt.draw(); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); + } else if (*stateID == dLytMapSavePopupAction_c::StateID_Wait) { + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setToEnd(); + mLyt.calc(); + mLyt.draw(); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); + } else if (*stateID == dLytMapSavePopupAction_c::StateID_Out) { + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].bind(false); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setBackward(); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].setFrame(mActions[i].mInOutFrame); + mLyt.calc(); + mLyt.draw(); + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_IN_OUT].unbind(); + } + mAnmGroups[MAP_SAVE_POPUP_ACTION_ANIM_INPUT].unbind(); + } + } +} + +void dLytMapSavePopup_c::set(nw4r::lyt::Bounding **pStatueBoundings, s32 count) { + mpStatueBoundings = pStatueBoundings; + mStatueNum = count; +} + +f32 dLytMapSavePopup_c::setStatueLabel(const char *label) { + static const char *sTPopupS = "T_popupS_00"; + static const char *sTPopup = "T_popup_00"; + static const char *sBg = "W_bgP_00"; + dTextBox_c *textBox; + + textBox = mLyt.getTextBox(sTPopupS); + textBox->setMessageWithGlobalTextProcessor2(label, nullptr); + textBox->GetLineWidth(nullptr); + textBox = mLyt.getTextBox(sTPopup); + textBox->setMessageWithGlobalTextProcessor2(label, nullptr); + + dWindow_c *w = mLyt.getWindow(sBg); + w->UpdateSize(textBox, 60.0f); + return w->GetSize().width; +} + +void dLytMapSavePopup_c::hide(s32 statueIdx) { + mActions[statueIdx].hide(); +} + +#define MAP_SAVE_CAPTION_ANIM_TYPE 0 +#define MAP_SAVE_CAPTION_ANIM_TEXTLINE 1 +#define MAP_SAVE_CAPTION_ANIM_IN 2 +#define MAP_SAVE_CAPTION_ANIM_LOOP 3 +#define MAP_SAVE_CAPTION_ANIM_OUT 4 + +#define MAP_SAVE_CAPTION_NUM_ANIMS 5 + void dLytMapSaveCaption_c::initializeState_Invisible() {} void dLytMapSaveCaption_c::executeState_Invisible() {} void dLytMapSaveCaption_c::finalizeState_Invisible() {} -void dLytMapSaveCaption_c::initializeState_In() {} -void dLytMapSaveCaption_c::executeState_In() {} +void dLytMapSaveCaption_c::initializeState_In() { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].setFrame(0.0f); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].setFrame(0.0f); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].unbind(); +} +void dLytMapSaveCaption_c::executeState_In() { + if (mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].isEndReached()) { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].bind(false); + mLyt.calc(); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].unbind(); + mStateMgr.changeState(StateID_In); + } +} void dLytMapSaveCaption_c::finalizeState_In() {} void dLytMapSaveCaption_c::initializeState_Wait() {} void dLytMapSaveCaption_c::executeState_Wait() {} void dLytMapSaveCaption_c::finalizeState_Wait() {} -void dLytMapSaveCaption_c::initializeState_Out() {} -void dLytMapSaveCaption_c::executeState_Out() {} +void dLytMapSaveCaption_c::initializeState_Out() { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].setFrame(0.0f); +} +void dLytMapSaveCaption_c::executeState_Out() { + if (mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].isEndReached()) { + mLyt.calc(); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_OUT].unbind(); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_LOOP].unbind(); + mStateMgr.changeState(StateID_Invisible); + } +} void dLytMapSaveCaption_c::finalizeState_Out() {} +static const d2d::LytBrlanMapping sMapSaveCaptionBrlanMap[] = { + { "mapSaveCaption_00_type.brlan", "G_type_00"}, + {"mapSaveCaption_00_textLine.brlan", "G_textLine_00"}, + { "mapSaveCaption_00_in.brlan", "G__inOut_00"}, + { "mapSaveCaption_00_loop.brlan", "G_loop_00"}, + { "mapSaveCaption_00_out.brlan", "G__inOut_00"}, +}; + +void dLytMapSaveCaption_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapSaveCaption_00.brlyt", nullptr); + for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { + mAnmGroups[i].init( + sMapSaveCaptionBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSaveCaptionBrlanMap[i].mName + ); + } + + mStateMgr.changeState(StateID_Invisible); +} + +void dLytMapSaveCaption_c::remove() { + for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } +} + +void dLytMapSaveCaption_c::execute() { + mStateMgr.executeState(); + for (int i = 0; i < MAP_SAVE_CAPTION_NUM_ANIMS; i++) { + if (mAnmGroups[i].isBound()) { + mAnmGroups[i].play(); + } + } + mLyt.calc(); +} + +void dLytMapSaveCaption_c::draw() { + if (*mStateMgr.getStateID() != StateID_Invisible) { + mLyt.draw(); + } +} + +void dLytMapSaveCaption_c::setType(s32 type) { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].setFrame(type); + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TYPE].unbind(); +} + +void dLytMapSaveCaption_c::setLabel(const char *label) { + mLyt.getTextBox("T_captionS_00")->setMessageWithGlobalTextProcessor2(label, nullptr); + mLyt.getTextBox("T_caption_00")->setMessageWithGlobalTextProcessor2(label, nullptr); + // ok + const char *tmp = "T_captionS_00"; + dTextBox_c *box = mLyt.getTextBox(tmp); + // Setting message twice... + box->setMessageWithGlobalTextProcessor2(label, nullptr); + + f32 width = box->GetLineWidth(nullptr); + const wchar_t *text = dMessage_c::getTextMessageByLabel(label, true, nullptr, 0); + s32 lines = box->calcTextLines(text, dMessage_c::getGlobalTagProcessor()); + + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].bind(false); + if (width < 226.0f) { + if (lines == 1) { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(0.0f); + } else { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(1.0f); + } + } else { + if (lines == 1) { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(2.0f); + } else { + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].setFrame(3.0f); + } + } + + mLyt.getLayout()->Animate(0); + mLyt.calc(); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_TEXTLINE].unbind(); +} + +#define MAP_SAVE_OBJ_ANIM_ON_OFF 0 +#define MAP_SAVE_OBJ_ANIM_DECIDE 1 +#define MAP_SAVE_OBJ_ANIM_LOOP 2 + +#define MAP_SAVE_OBJ_NUM_ANIMS 3 + void dLytMapSaveObj_c::initializeState_Wait() {} -void dLytMapSaveObj_c::executeState_Wait() {} +void dLytMapSaveObj_c::executeState_Wait() { + if (mSelectRequest) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setForward(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setFrame(0.0f); + mStateMgr.changeState(StateID_ToSelect); + } +} void dLytMapSaveObj_c::finalizeState_Wait() {} void dLytMapSaveObj_c::initializeState_ToSelect() {} -void dLytMapSaveObj_c::executeState_ToSelect() {} +void dLytMapSaveObj_c::executeState_ToSelect() { + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isEndReached()) { + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_POINT_START_POINT); + mLyt.calc(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); + mStateMgr.changeState(StateID_Select); + } + + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isBound()) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].play(); + } +} void dLytMapSaveObj_c::finalizeState_ToSelect() {} void dLytMapSaveObj_c::initializeState_Select() {} -void dLytMapSaveObj_c::executeState_Select() {} +void dLytMapSaveObj_c::executeState_Select() { + if (!mSelectRequest) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setBackward(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setToStart(); + mDecideRequest = false; + mStateMgr.changeState(StateID_ToWait); + } else if (mDecideRequest) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_DECIDE_START_POINT); + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].bind(false); + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].setFrame(0.0f); + mStateMgr.changeState(StateID_Decide); + } +} void dLytMapSaveObj_c::finalizeState_Select() {} void dLytMapSaveObj_c::initializeState_ToWait() {} -void dLytMapSaveObj_c::executeState_ToWait() {} +void dLytMapSaveObj_c::executeState_ToWait() { + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isStop2()) { + mLyt.calc(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); + mStateMgr.changeState(StateID_Select); + } + + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].isBound()) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].play(); + } +} void dLytMapSaveObj_c::finalizeState_ToWait() {} void dLytMapSaveObj_c::initializeState_Decide() {} -void dLytMapSaveObj_c::executeState_Decide() {} +void dLytMapSaveObj_c::executeState_Decide() { + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].isEndReached()) { + mLyt.calc(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].unbind(); + mDecideFinished = true; + } + + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].isBound()) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].play(); + } +} void dLytMapSaveObj_c::finalizeState_Decide() {} -#pragma dont_inline on -dLytMapMain_c::dLytMapMain_c() : mStateMgr(*this), mFloorBtnMgr(&field_0x8DC8) {} -#pragma dont_inline reset - -dLytMapMain_c::~dLytMapMain_c() {} - -void dLytMapMain_c::draw() {} - -void dLytMap_c::build() { - d2d::setLytAllocator(); - void *data = LayoutArcManager::GetInstance()->getLoadedData("Map2D"); - mResAcc.attach(data, ""); - mMapMain.build(); - m2d::setLytAllocator(); - mMapMain.setPriority(0x86); - // TODO there's another thing here at 0x91C0 +void dLytMapSaveObj_c::setPosition(const mVec3_c &position) { + mLyt.getLayout()->GetRootPane()->SetTranslate(position); } -void lytMapusesSizedWString() { - static SizedWString<0x20> sString; - sString.sprintf(L"%ld", 0); +void dLytMapSaveObj_c::setAlpha(u8 alpha) { + mLyt.getLayout()->GetRootPane()->SetAlpha(alpha); +} + +void dLytMapSaveObj_c::init() { + mSelectRequest = false; + mDecideRequest = false; + mDecideFinished = false; + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].bind(false); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].setFrame(0.0f); + mLyt.calc(); + mAnmGroups[MAP_SAVE_OBJ_ANIM_ON_OFF].unbind(); + + mAnmGroups[MAP_SAVE_OBJ_ANIM_DECIDE].setFrame(0.0f); + mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].bind(false); + + mStateMgr.changeState(StateID_Wait); +} + +static const d2d::LytBrlanMapping sMapSaveObjBrlanMap[] = { + { "mapSaveObj_00_saveObjOnOff.brlan", "G_saveBtn_00"}, + {"mapSaveObj_00_saveObjDecide.brlan", "G_saveBtn_00"}, + { "mapSaveObj_00_saveObjLoop.brlan", "G_saveBtnLoop_00"}, +}; + +void dLytMapSaveObj_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapSaveObj_00.brlyt", nullptr); + for (int i = 0; i < MAP_SAVE_OBJ_NUM_ANIMS; i++) { + mAnmGroups[i].init(sMapSaveObjBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapSaveObjBrlanMap[i].mName); + } + + mLyt.getLayout()->GetRootPane()->SetInfluencedAlpha(true); + + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].bind(false); + mAnmGroups[MAP_SAVE_CAPTION_ANIM_IN].setFrame(0.0f); + mLyt.calc(); + + mStateMgr.changeState(StateID_Wait); +} + +void dLytMapSaveObj_c::remove() { + for (int i = 0; i < MAP_SAVE_OBJ_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } +} + +void dLytMapSaveObj_c::execute() { + mStateMgr.executeState(); + if (mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].isBound()) { + mAnmGroups[MAP_SAVE_OBJ_ANIM_LOOP].play(); + } +} + +void dLytMapSaveObj_c::draw() { + nw4r::lyt::Pane *root = mLyt.getLayout()->GetRootPane(); + // @bug calc should be in execute... + mLyt.calc(); + root->Draw(mLyt.getDrawInfo()); +} + +#pragma dont_inline on +dLytMapMain_c::dLytMapMain_c() + : mStateMgr(*this), + mFlowMgr(&mFlow), + mFloorBtnMgr(&mGlobal), + mFootPrints(&mGlobal), + mAreaGroup(0), + mMapUpDirectionAfterZoomToDetail(true), + field_0x8C93(0), + mMapEvent(MAP_EVENT_NONE), + mNextMapEvent(MAP_EVENT_NONE), + field_0x8CAC(0), + field_0x8D38(0.0f, 0.0f), + field_0x8D40(1.0f), + field_0x8D44(0), + field_0x8D46(0), + field_0x8D48(0), + field_0x8D4C(0.0f), + field_0x8D50(0.0f), + mCurrentFloor(0), + mNumFloors(1), + mBaseFloorOffset(0), + field_0x8D64(0), + field_0x8D68(0), + mEventCanceled(false), + mEventDone(false), + mpRegionPane1(nullptr), + mpRegionPane2(nullptr), + field_0x8DB0(0), + mNavEnabled(false), + mDrawScaleFrame(false), + mDisplayedBeaconCount(0), + mShowIslandNames(false), + field_0x8DBD(0), + mMapChangeAlpha(0), + mIsVisible(false), + field_0x8DC0(-1), + field_0x8DC4(0) { + field_0x8D78 = 0.0f; + field_0x8D7C = 0.0f; + field_0x8D80 = 0.0f; + field_0x8D84 = 0.0f; + field_0x8D88 = 0.0f; +} +#pragma dont_inline reset + +dLytMapMain_c::~dLytMapMain_c() { + for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { + if (dCsMgr_c::GetInstance()->isRegist(&mHitChecks[i])) { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mHitChecks[i]); + } + } +} + +dLytMapGlobal_c *dLytMapMain_c::getGlobal() { + return &mGlobal; +} + +dMapSavedData dLytMapMain_c::sSavedMapData = { + { + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + }, + false +}; + +const dMapSavedData dLytMapMain_c::sDefaultMapData = { + { + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + {dLytMapGlobal_c::MAPMODE_STAGE, 1, 1, 0}, + }, + false +}; + +static const char *const sTextboxLabelMapping[][2] = { + { "T_sNameS_00", "MAP_00"}, + { "T_sName_00", "MAP_00"}, + { "T_pNameS_00", "MAP_01"}, + { "T_pName_00", "MAP_01"}, + { "T_pNameS_01", "MAP_01"}, + { "T_fNameS_00", "MAP_02"}, + { "T_fName_00", "MAP_02"}, + { "T_fNameS_01", "MAP_02"}, + { "T_nFnameS_00", "MAP_03"}, + { "T_nFname_00", "MAP_03"}, + { "T_nFnameS_01", "MAP_03"}, + { "T_lNameS_00", "MAP_04"}, + { "T_lName_00", "MAP_04"}, + { "T_lNameS_01", "MAP_04"}, + { "T_sVnameS_00", "MAP_05"}, + { "T_sVname_00", "MAP_05"}, + { "T_sVnameS_01", "MAP_05"}, + { "T_nVnameS_00", "MAP_06"}, + { "T_nVname_00", "MAP_06"}, + { "T_nVnameS_01", "MAP_06"}, + { "T_dNameS_01", "MAP_08"}, + { "T_dName_01", "MAP_08"}, + { "T_dNameS_00", "MAP_08"}, + { "T_dNameS_02", "MAP_07"}, + { "T_dName_02", "MAP_07"}, + { "T_dNameS_03", "MAP_07"}, + { "T_gNameS_01", "MAP_10"}, + { "T_gName_01", "MAP_10"}, + { "T_gNameS_04", "MAP_10"}, + { "T_gNameS_00", "MAP_09"}, + { "T_gName_00", "MAP_09"}, + { "T_gNameS_03", "MAP_09"}, + { "T_gNameS_02", "MAP_40"}, + { "T_gName_02", "MAP_40"}, + { "T_gNameS_05", "MAP_40"}, + { "T_lastDs_00", "MAP_17"}, + { "T_lastD_00", "MAP_17"}, + { "T_pampkinNS_00", "MAP_27"}, + { "T_pampkinN_00", "MAP_27"}, + { "T_teryNS_00", "MAP_28"}, + { "T_teryN_00", "MAP_28"}, + { "T_tikurinNS_00", "MAP_29"}, + { "T_tikurinN_00", "MAP_29"}, + { "T_musiNS_00", "MAP_31"}, + { "T_musiN_00", "MAP_31"}, + { "T_utaNS_00", "MAP_30"}, + { "T_utaN_00", "MAP_30"}, + { "T_ruretouNS_00", "MAP_26"}, + { "T_ruretouN_00", "MAP_26"}, + { "T_toForestS_00", "MAP_58"}, + { "T_toForest_00", "MAP_58"}, + {"T_toVolcanoS_00", "MAP_59"}, + { "T_toVolcano_00", "MAP_59"}, + { "T_toDesertS_00", "MAP_60"}, + { "T_toDesert_00", "MAP_60"}, + { "T_fD1s_00", "MAP_11"}, + { "T_fD1_00", "MAP_11"}, + { "T_fD2s_00", "MAP_14"}, + { "T_fD2_00", "MAP_14"}, + { "T_vD2s_00", "MAP_16"}, + { "T_vD2_00", "MAP_16"}, + { "T_vD1s_00", "MAP_12"}, + { "T_vD1_00", "MAP_12"}, + { "T_dD1s_00", "MAP_13"}, + { "T_dD1_00", "MAP_13"}, + { "T_dD2s_00", "MAP_15"}, + { "T_dD2_00", "MAP_15"}, + { "T_lastDs_00", "MAP_17"}, + { "T_lastD_00", "MAP_17"}, +}; + +static const char *sHyliasRealmMapLabel = "MAP_64"; + +void dLytMapMain_c::loadTextboxes() { + bool hyliasRealm = dScGame_c::isCurrentStage("F403") || dScGame_c::isCurrentStage("F404"); + for (int i = 0; i < (int)ARRAY_LENGTH(sTextboxLabelMapping); i++) { + dTextBox_c *box = mLyt.getTextBox(sTextboxLabelMapping[i][0]); + if (hyliasRealm && (i == 2 || i == 3 || i == 4)) { + // Replace "Sealed Grounds" with "Hylia's Realm" + box->setMessageWithGlobalTextProcessor2(sHyliasRealmMapLabel, nullptr); + } else { + box->setMessageWithGlobalTextProcessor2(sTextboxLabelMapping[i][1], nullptr); + } + } +} +static const d2d::LytBrlanMapping sMapMainBrlanMap[] = { + { "map_00_in.brlan", "G_inOut_00"}, + { "map_00_titleOnOff.brlan", "G_titleOnOff_00"}, + { "map_00_nOnOff.brlan", "G_nOnOff_00"}, + { "map_00_mapV.brlan", "G_mapV_00"}, + { "map_00_worldState.brlan", "G_worldState"}, + { "map_00_player2patten.brlan", "G_2Pattern_00"}, + { "map_00_rotate.brlan", "G_rotate_00"}, + { "map_00_out.brlan", "G_inOut_00"}, + { "map_00_mapDraw.brlan", "G_plainC_00"}, + { "map_00_mapDraw.brlan", "G_forestC_00"}, + { "map_00_mapDraw.brlan", "G_nForestC_00"}, + { "map_00_mapDraw.brlan", "G_sVolcanoC_00"}, + { "map_00_mapDraw.brlan", "G_mineC_00"}, + { "map_00_mapDraw.brlan", "G_desertC_00"}, + { "map_00_mapDraw.brlan", "G_lakeC_00"}, + { "map_00_mapDraw.brlan", "G_glenC_00"}, + { "map_00_mapDraw.brlan", "G_seaC_00"}, + { "map_00_mapDraw.brlan", "G_nVolcanoC_00"}, + { "map_00_mapDraw.brlan", "G_glenC_01"}, + { "map_00_skyLoftUpDown.brlan", "G_skyloftUD_00"}, + {"map_00_LinkPositionLight.brlan", "G_linkPointL_00"}, + { "map_00_mapZinForest.brlan", "G_ZoomInOut_00"}, + { "map_00_zoomWakuIn.brlan", "G_zoomWaku_00"}, + { "map_00_zoomWakuOut.brlan", "G_zoomWaku_00"}, + { "map_00_mapZoutForest.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZinPlant.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutPlant.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInPlant.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZoutPlant.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZinDesert.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZoutDesert.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZinVolcano.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZoutVolcano.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutForest.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutDesert.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutVolcano.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInForest.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInDesert.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInVolcano.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInSkyMap.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutSkyMap.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInSkyMap2.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutSkyMap2.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaInSkyCorse.brlan", "G_ZoomInOut_00"}, + { "map_00_mapZaOutSkyCorse.brlan", "G_ZoomInOut_00"}, + { "map_00_sunRote.brlan", "G_sun_00"}, + { "map_00_inNoCam.brlan", "G_inOut_00"}, + { "map_00_outNoCam.brlan", "G_inOut_00"}, + { "map_00_cloudLoop.brlan", "G_cloudLoop_00"}, + { "map_00_lightLoop.brlan", "G_lightLoop_00"}, + { "map_00_nushiLoop.brlan", "G_nushiLoop_00"}, + { "map_00_type.brlan", "G_type_00"}, + { "map_00_kumoPattern.brlan", "G_kumoPattern_00"}, + { "map_00_titleLine.brlan", "G_textLine_00"}, +}; + +#define MAP_MAIN_ANIM_IN 0 +#define MAP_MAIN_ANIM_TITLE_ON_OFF 1 +#define MAP_MAIN_ANIM_N_ON_OFF 2 +#define MAP_MAIN_ANIM_MAP_V 3 +#define MAP_MAIN_ANIM_WORLD_STATE 4 +#define MAP_MAIN_ANIM_PLAYER_2_PATTERN 5 +#define MAP_MAIN_ANIM_ROTATE 6 +#define MAP_MAIN_ANIM_OUT 7 +#define MAP_MAIN_ANIM_DRAW_PLAIN 8 +#define MAP_MAIN_ANIM_DRAW_FOREST 9 +#define MAP_MAIN_ANIM_DRAW_N_FOREST 10 +#define MAP_MAIN_ANIM_DRAW_S_VOLCANO 11 +#define MAP_MAIN_ANIM_DRAW_MINE 12 +#define MAP_MAIN_ANIM_DRAW_DESERT 13 +#define MAP_MAIN_ANIM_DRAW_LAKE 14 +#define MAP_MAIN_ANIM_DRAW_GLEN_00 15 +#define MAP_MAIN_ANIM_DRAW_SEA 16 +#define MAP_MAIN_ANIM_DRAW_N_VOLCANO 17 +#define MAP_MAIN_ANIM_DRAW_GLEN_01 18 +#define MAP_MAIN_ANIM_SKYLOFT_UP_DOWN 19 +#define MAP_MAIN_ANIM_LINK_POSITION_LIGHT 20 + +#define MAP_MAIN_ANIM_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 +#define MAP_MAIN_ANIM_CLOUD_LOOP 48 +#define MAP_MAIN_ANIM_LIGHT_LOOP 49 +#define MAP_MAIN_ANIM_NUSHI_LOOP 50 +#define MAP_MAIN_ANIM_TYPE 51 +#define MAP_MAIN_ANIM_KUMO_PATTERN 52 +#define MAP_MAIN_ANIM_TITE_LINE 53 + +#define MAP_MAIN_NUM_ANIMS 54 + +static const char *sGroupName = "G_ref_00"; + +static const char *sBoundingNames[] = { + "B_noroshi_00", "B_houkoul_00", "B_remoCon_00", "B_nunchaku_00", "B_tittle_00", "B_saveIcon_00", + "B_saveIcon_01", "B_saveIcon_02", "B_saveIcon_03", "B_saveIcon_04", "B_saveIcon_05", "B_saveIcon_06", + "B_saveIcon_07", "B_saveIcon_08", "B_saveIcon_28", "B_saveIcon_10", "B_saveIcon_11", "B_saveIcon_12", + "B_saveIcon_13", "B_saveIcon_14", "B_saveIcon_15", "B_saveIcon_16", "B_saveIcon_17", "B_saveIcon_18", + "B_saveIcon_19", "B_saveIcon_20", "B_saveIcon_21", "B_saveIcon_22", "B_saveIcon_23", "B_saveIcon_24", + "B_saveIcon_25", "B_saveIcon_26", "B_saveIcon_27", +}; + +#define MAP_MAIN_NUM_BOUNDINGS_NORMAL 5 +#define MAP_MAIN_OFFSET_BOUNDINGS_SAVEICON 5 +#define MAP_MAIN_NUM_BOUNDINGS_SAVEICON 28 + +#define MAP_MAIN_NUM_BOUNDINGS 33 + +static const char *sPaneNames[] = { + "N_pName_00", "N_fName_00", "N_nFname_00", "N_sVname_00", "N_dName_02", "N_dName_00", + "N_lName_00", "N_gName_02", "N_gName_01", "N_nVname_00", "N_gName_00", +}; + +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 *sDungeonPicNames[] = { + "P_fD1_00", "P_vD1_00", "P_dD1_00", "P_fD2_00", "P_dD2_00", "P_vD2_00", "P_lastD_00", +}; + +static const char *sPriorityGroupNames[] = { + "G_priority_00", + "G_priority_02", +}; + +void dLytMapMain_c::build() { + mIsVisible = 0; + field_0x8DB0 = 0; + if (dScGame_c::isCurrentStage("F102")) { + // awesome but unnecessary + field_0x8DB0 = 0; + } + + dStage_c::GetInstance()->fn_801B3F20(); + d2d::ResAccIf_c *resAcc = dLytMap_c::getResAcc(); + mLyt.setResAcc(resAcc); + mLyt.build("map_00.brlyt", nullptr); + getGlobal()->setField_0x28(mLyt.getDrawInfo().GetLocationAdjustScale()); + + for (int i = 0; i < MAP_MAIN_NUM_ANIMS; i++) { + mAnmGroups[i].init(sMapMainBrlanMap[i].mFile, resAcc, mLyt.getLayout(), sMapMainBrlanMap[i].mName); + } + + mFloorBtnMgr.build(resAcc); + mSubpane.mpLytPane = &mFloorBtnMgr; + mSubpaneList.PushBack(&mSubpane); + + d2d::dSubPane::linkMeters(mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName), &mSubpaneList); + mFootPrints.build(resAcc); + mMarkers.build(resAcc); + + mPinIconAggregate.build(resAcc); + mPutIcon.build(resAcc); + + for (int i = 0; i < (int)ARRAY_LENGTH(mSaveObjs); i++) { + mSaveObjs[i].build(resAcc); + } + + mSaveCaption.build(resAcc); + mSavePopup.build(resAcc); + mPopupInfo.build(resAcc); + + mAnmGroups[MAP_MAIN_ANIM_IN].bind(false); + mAnmGroups[MAP_MAIN_ANIM_IN].setToEnd(); + mLyt.calc(); + + for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) { + nw4r::lyt::Bounding *b = mLyt.findBounding(sBoundingNames[i]); + b->SetVisible(false); + // TODO - bird statues + if (i >= 5 && i < 15) { + mpSaveObjBoundingsFaron[i - 5] = b; + } else if (i >= 15 && i < 21) { + mpSaveObjBoundingsEldin[i - 15] = b; + } else if (i >= 21 && i < 33) { + mpSaveObjBoundingsLanayru[i - 21] = b; + } + + mHitChecks[i].init(b, 0x02, 2, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mHitChecks[i]); + } + + for (int i = 0; i < (int)ARRAY_LENGTH(sBoundingNames); i++) { + mHitChecks[i].resetCachedHitboxes(); + mHitChecks[i].execute(); + } + + mpMapBounding = mLyt.findBounding("B_map_00"); + nw4r::lyt::Size t(1.0f, 1.0f); + mpMapBounding->SetSize(t); + mVec3_c boundingPos = mpMapBounding->GetTranslate(); + mVec2_c boundingPos2 = mVec2_c(boundingPos.x, boundingPos.y); + dLytMapGlobal_c *global = getGlobal(); + global->setField_0x20(boundingPos2); + + mMapCapture.setPicture(mLyt.findPicture("P_map_00")); + nw4r::lyt::Pane *limitBounding = mLyt.findPane("B_limit_00"); + const nw4r::lyt::Size &sz = limitBounding->GetSize(); + field_0x8D30.x = sz.width - 1.0f; + field_0x8D30.y = sz.height - 1.0f; + field_0x8D38.x = sz.width; + field_0x8D38.y = sz.height; + field_0x8D38.x *= mLyt.getDrawInfo().GetLocationAdjustScale().x; + mpAllPane = mLyt.findPane("N_all_00"); + mpNoroshiPane = mLyt.findPane("N_noroshi_00"); + mpScaleFramePane = mLyt.findPane("N_scaleFlame_00"); + mpWakuWindow = mLyt.getWindow("W_waku_01"); + + for (int i = 0; i < (int)ARRAY_LENGTH(sPaneNames); i++) { + if (sPaneNames[i] != nullptr) { + mpPanes[i] = mLyt.findPane(sPaneNames[i]); + } else { + mpPanes[i] = nullptr; + } + } + + for (int i = 0; i < (int)ARRAY_LENGTH(sDungeonPaneNames); i++) { + if (sDungeonPaneNames[i] != nullptr) { + mpDungeonPanes[i] = mLyt.findPane(sDungeonPaneNames[i]); + } else { + mpDungeonPanes[i] = nullptr; + } + + if (sDungeonPicNames[i] != nullptr) { + mpDungeonPics[i] = mLyt.findPane(sDungeonPicNames[i]); + } else { + mpDungeonPics[i] = nullptr; + } + } + + mpNumberTextBox = mLyt.getTextBox("T_number_00"); + mpNumberTextBoxS = mLyt.getTextBox("T_numberS_00"); + mpZoomInOutPane = mLyt.findPane("N_zoomInOut_00"); + + for (int i = 0; i < (int)ARRAY_LENGTH(sPriorityGroupNames); i++) { + mpPriorityGroups[i] = mLyt.findGroupByName(sPriorityGroupNames[i]); + } + + mMarkers.setField_0x6F4(boundingPos2); + + mPinIconAggregate.setUnk(&field_0xF1C); + + mpPaneBgAll01 = mLyt.findPane("N_mapBgAll_01"); + mpPaneBgAll02 = mLyt.findPane("N_mapBgAll_02"); + mpPaneAll01 = mLyt.findPane("N_mapAll_01"); + mpPaneAll02 = mLyt.findPane("N_mapAll_02"); + field_0x8928.x = mpPaneBgAll01->GetGlobalMtx()._03; + field_0x8928.y = mpPaneBgAll01->GetGlobalMtx()._13; + mpPaneRotate00 = mLyt.findPane("N_rotateP_00"); + mpPaneRotate01 = mLyt.findPane("N_rotateP_01"); + + nw4r::lyt::Pane *bgAll = mLyt.findPane("N_mapBgAll_00"); + + mVec2_c v1(bgAll->GetGlobalMtx()._03, bgAll->GetGlobalMtx()._13); + mVec2_c tmp = v1 - global->getField_0x20(); + global->setField_0x0C(tmp); + + field_0x8C88 = mAnmGroups[MAP_MAIN_ANIM_IN].getFrameCtrl()->mEndFrame - 1.0f; + mAnmGroups[MAP_MAIN_ANIM_IN].unbind(); + + mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false); + field_0x8C8C = mAnmGroups[MAP_MAIN_ANIM_OUT].getLastFrame(); + mAnmGroups[MAP_MAIN_ANIM_OUT].unbind(); + field_0x8CAC = 0; + mDisplayedBeaconCount = getMaxBeaconCount(); + mStateMgr.changeState(StateID_Invisible); + getGlobal()->setFloor(0); + mNavEnabled = false; + mCurrentFloor = 0; + mNumFloors = 1; + mBaseFloorOffset = 0; + field_0x8D64 = 0; + fn_80143300(); +} + +void dLytMapMain_c::loadStageProperties() { + mAreaGroup = getAreaGroup(dStageMgr_c::GetInstance()->getSTIFArea()); + mRoomType = getRoomType(); + + // Yes, it does need to be written this way, otherwise the catch-all else + // branch is collapsed with the other ones. + + if (mRoomType == ROOMTYPE_FIELD) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + return; + } + + if (mRoomType == ROOMTYPE_DUNGEON) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + return; + } + + if (mRoomType == ROOMTYPE_SKYLOFT) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + return; + } + + if (mRoomType == ROOMTYPE_BOSS_HOUSE) { + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + return; + } + + mCurrentMapMode = dLytMapGlobal_c::MAPMODE_STAGE; +} + +void dLytMapMain_c::setupStage() { + loadStageProperties(); + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + mLyt.findPane("N_skyloft_00")->SetVisible(false); + } + + mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].bind(false); + if (dAcPy_c::getCurrentTunicType() == 1) { + mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].setFrame(1.0f); + } else { + mAnmGroups[MAP_MAIN_ANIM_PLAYER_2_PATTERN].setFrame(0.0f); + } + + if (mRoomType == ROOMTYPE_SKYLOFT || + (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR || + mRoomType == ROOMTYPE_DUNGEON))) { + mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].bind(false); + } + + s32 type = 0; + mAnmGroups[MAP_MAIN_ANIM_TYPE].bind(false); + if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) { + type = 8; + } else if (mAreaGroup == AREAGROUP_FARON || mAreaGroup == AREAGROUP_SEALED_GROUNDS) { + if (dStageMgr_c::GetInstance()->getSTIFArea() == dStageMgr_c::STIF_AREA_SEALED_GROUNDS) { + type = 7; + } else if (mRoomType == ROOMTYPE_FIELD) { + type = 1; + } else { + type = 2; + } + } else if (mAreaGroup == AREAGROUP_ELDIN) { + if (mRoomType == ROOMTYPE_FIELD) { + type = 3; + } else { + type = 4; + } + } else if (mAreaGroup == AREAGROUP_LANAYRU) { + if (mRoomType == ROOMTYPE_FIELD) { + type = 5; + } else { + type = 6; + } + } else if (mAreaGroup == AREAGROUP_SKY) { + if (dStageMgr_c::GetInstance()->getSTIFRoomType() == dStageMgr_c::STIF_ROOMTYPE_DUNGEON) { + type = 11; + } else { + // TODO - probably an enum but this matches too + type = 9; + if (dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT) { + type = 10; + } + } + } + mAnmGroups[MAP_MAIN_ANIM_TYPE].setFrame(type); + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_TYPE].unbind(); + + field_0x8C7C = 0.0f; + field_0x8C80 = 0.0f; + mAnmGroups[MAP_MAIN_ANIM_IN].bind(false); + mAnmGroups[MAP_MAIN_ANIM_IN].setFrame(0.0f); + mAnmGroups[MAP_MAIN_ANIM_MAP_V].bind(false); + fn_801431E0(); + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_MAP_V].unbind(); + mAnmGroups[MAP_MAIN_ANIM_IN].unbind(); + if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + mLyt.findPane("N_houkoul_00")->SetVisible(false); + } + if (mMapEvent != MAP_EVENT_SAVE_OBJ) { + loadTextboxes(); + } + fn_8013AD50(); +} + +void dLytMapMain_c::remove() { + for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mHitChecks[i]); + } + + for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) { + d2d::dSubPane *subPane = it->mpLytPane; + if (subPane != nullptr) { + nw4r::lyt::Pane *parent = subPane->getPane()->GetParent(); + parent->RemoveChild(subPane->getPane()); + } + } + mPopupInfo.remove(); + mSavePopup.remove(); + mSaveCaption.remove(); + for (int i = 0; i < (int)ARRAY_LENGTH(mSaveObjs); i++) { + mSaveObjs[i].remove(); + } + mFloorBtnMgr.remove(); + mFootPrints.remove(); + mMarkers.remove(); + mPinIconAggregate.remove(); + mPutIcon.remove(); + for (int i = 0; i < MAP_MAIN_NUM_ANIMS; i++) { + mAnmGroups[i].remove(); + } + dStage_c::GetInstance()->fn_801B3F30(); +} + +void dLytMapMain_c::execute() { + if ((*mStateMgr.getStateID() == StateID_Invisible)) { + return; + } + + if ((*mStateMgr.getStateID() == StateID_RenderingWait)) { + mStateMgr.executeState(); + mMapCapture.execute(); + return; + } + + field_0xF1C.field_0x05 = 0; + dLytMapGlobal_c *global = getGlobal(); + mDrawScaleFrame = false; + mPointerOnMap = false; + mPointerCanPlaceBeacon = false; + checkCursorPointedAtMap(); + + if (dPad::getDownTrigDown() && canCenterCursor(mCurrentMapMode) && canCenterCursor(mNextMapMode)) { + dPad::ex_c::getInstance()->centerCursor(mPad::getCurrentCoreID(), true); + } + + if (mRoomType == ROOMTYPE_DUNGEON && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mFloorBtnMgr.setForceNoNav(true); + } else { + mFloorBtnMgr.setForceNoNav(false); + } + + mFloorBtnMgr.checkPointedAtBtn(); + mStateMgr.executeState(); + if (*mStateMgr.getStateID() != StateID_ResetPosWithFloorChange) { + mFloorBtnMgr.execute(); + } + + s32 beaconId = -1; + field_0x8DBD = false; + if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && canPlaceBeacons(mCurrentMapMode) && + canPlaceBeacons(mNextMapMode)) { + bool exhaustedPins = mPinIconAggregate.getNumSetPins() >= getMaxBeaconCount(); + if (!exhaustedPins && mPointerCanPlaceBeacon && + *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select && + isPointingAtMainMap()) { + mPinIconAggregate.findNewBeaconId(&beaconId); + if (beaconId >= 0) { + field_0x8DBD = true; + } + } + } + + if (field_0x8DBD) { + mPutIcon.setPosition(dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); + mPutIcon.setScale(1.0f); + mPutIcon.setVisible(true); + } else { + mPutIcon.setVisible(false); + } + + static SizedWString<0x20> buf; + buf.sprintf(L"%ld", (mDisplayedBeaconCount - mPinIconAggregate.getNumSetPins()) % 10); + mpNumberTextBox->setTextWithGlobalTextProcessor(buf, nullptr); + mpNumberTextBoxS->setTextWithGlobalTextProcessor(buf, nullptr); + + if (canChangeFloor(mCurrentMapMode) && canChangeFloor(mNextMapMode)) { + const sStateIDIf_c *state = mStateMgr.getStateID(); + if (*state != StateID_FloorChange && *state != StateID_RenderingWait && + *state != StateID_ResetPosWithFloorChange) { + mMapCapture.renderRequest(); + } + } + + mMapCapture.execute(); + fn_80143360(); + global->setCurrentMapMode(mCurrentMapMode); + global->setNextMapMode(mNextMapMode); + mFootPrints.setVisible(shouldDrawFootprints()); + + f32 f1 = 1.0f; + if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR) { + // why does everyone clamp things differently ??? + f32 tmp = global->getField_0x58(); + if (tmp < 0.0f) { + tmp = 0.0f; + } else if (tmp > 1.0f) { + tmp = 1.0f; + } + f1 = tmp; + } + f32 f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM); + if (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + f2 = fn_80142D90(dLytMapGlobal_c::MAPMODE_STAGE); + } + mFootPrints.setField_0x198(f2); + mFootPrints.setField_0x19C(f1); + mFootPrints.execute(); + setCursorType(); + + if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && + (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + global->setField_0x4D(1); + } else { + global->setField_0x4D(0); + } + + if (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_5 || + mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE || mMapEvent == MAP_EVENT_SW_BANK_SMALL) { + clearButtonMessages(); + } else { + setButtonMessages(mCurrentMapMode, mMapUpDirection, mNextMapMode, mNextMapUpDirection); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY && mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_SUN_ROTE].play(); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].play(); + } + mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].play(); + } + + switch (mCurrentMapMode) { + case dLytMapGlobal_c::MAPMODE_PROVINCE: { + if (mpRegionPane1 != nullptr) { + mpRegionPane1->SetVisible(true); + } + if (mpRegionPane2 != nullptr) { + mpRegionPane2->SetVisible(true); + } + + if (mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_LINK_POSITION_LIGHT].play(); + } + break; + } + case dLytMapGlobal_c::MAPMODE_WORLD: { + if (mpRegionPane1 != nullptr) { + mpRegionPane1->SetVisible(false); + } + if (mpRegionPane2 != nullptr) { + mpRegionPane2->SetVisible(false); + } + break; + } + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + if (mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].play(); + } + if (mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].isBound()) { + mAnmGroups[MAP_MAIN_ANIM_NUSHI_LOOP].play(); + } + } + + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + bool visible = + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE; + setSaveObjsVisible(visible); + mPopupInfo.executeState_Invisible(); + } + mSaveCaption.execute(); + mPutIcon.execute(); + + mLyt.calc(); + + u8 alpha = 0; + if (mpAllPane->IsVisible()) { + alpha = mpAllPane->GetAlpha(); + } + global->setAlpha(alpha); + fn_80143300(); + mPinIconAggregate.setScale(global->getZoomFrame()); + mMarkers.execute(); + + if (mNextMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_5 || mNextMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8) { + mStateMgr.changeState(StateID_EventFieldMapChange_Step1); + mMapEvent = mNextMapEvent; + mNextMapEvent = 0; + } + mMaxBeaconCount = 0; +} + +void dLytMapMain_c::draw() { + if (!mIsVisible) { + return; + } + + dLytMapGlobal_c *global = getGlobal(); + fn_80143120(1); + mLyt.draw(); + if (shouldDrawFootprints() && mCurrentFloor == global->getFloor()) { + mFootPrints.draw(); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM || + mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mMarkers.draw(); + } + + if (mRoomType != ROOMTYPE_BOSS_HOUSE && mRoomType != ROOMTYPE_SKYFIELD_INTERIOR && + mMapEvent != MAP_EVENT_SW_BANK_SMALL) { + mPinIconAggregate.draw(); + } + + fn_80143120(0); + + if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) && + (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { + mpZoomInOutPane->SetVisible(false); + } else { + mpZoomInOutPane->SetVisible(true); + } + + mpScaleFramePane->SetVisible(mDrawScaleFrame ? true : false); + mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo()); + if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && + mMapEvent == MAP_EVENT_SAVE_OBJ) { + initSaveObjs(); + } + fn_80143120(-2); + mMarkers.drawPopups(); + mPutIcon.draw(); + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + mPopupInfo.draw(); + } + + if (*mStateMgr.getStateID() == StateID_EventSaveObjSelect) { + mSavePopup.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; + s32 end; + if (mAreaGroup == AREAGROUP_FARON) { + start = 5; + end = 14; + has = true; + } else if (mAreaGroup == AREAGROUP_ELDIN) { + start = 15; + end = 20; + has = true; + } else if (mAreaGroup == AREAGROUP_LANAYRU) { + start = 21; + end = 32; + has = true; + } + + if (!has) { + // @bug this should probably return -1 but it doesn't matter + return 0; + } + + s32 idx = -1; + dCursorHitCheck_c *d = dCsGame_c::GetInstance()->getCursorHit(); + if (d != nullptr && d->getType() == 'lyt ') { + for (int i = start; i <= end; i++) { + if (d == &mHitChecks[i]) { + idx = i - start; + break; + } + } + } + + return idx; +} + +bool dLytMapMain_c::isPaneVisible(nw4r::lyt::Pane *pane) const { + bool ret = true; + while (pane != nullptr) { + if (!pane->IsVisible() || pane->GetAlpha() == 0) { + ret = false; + break; + } + pane = pane->GetParent(); + } + return ret; +} + +void dLytMapMain_c::setSaveObjsVisible(bool visible) { + nw4r::lyt::Pane *p; + nw4r::lyt::Bounding **ptrs = mpCurrentSaveObjBoundings; + for (int i = 0; i < mNumSaveObjs; i++) { + p = ptrs[i]; + if (visible) { + // This makes like no sense - the isPaneVisible check ensures + // that the pane is already visible when we enter the branch... + if (p != nullptr && p != nullptr && isPaneVisible(p)) { + p->SetVisible(true); + } + } else { + p->SetVisible(false); + } + } +} + +void dLytMapMain_c::setSaveObjPanePtrs() { + nw4r::lyt::Bounding **p = nullptr; + u32 count = 0; + if (mMapEventArg1 == SURFACE_PROVINCE_FARON) { + p = mpSaveObjBoundingsFaron; + count = ARRAY_LENGTH(mpSaveObjBoundingsFaron); + } else if (mMapEventArg1 == SURFACE_PROVINCE_ELDIN) { + p = mpSaveObjBoundingsEldin; + count = ARRAY_LENGTH(mpSaveObjBoundingsEldin); + } else if (mMapEventArg1 == SURFACE_PROVINCE_LANAYRU) { + p = mpSaveObjBoundingsLanayru; + count = ARRAY_LENGTH(mpSaveObjBoundingsLanayru); + } + mNumSaveObjs = count; + mpCurrentSaveObjBoundings = p; + mSavePopup.set(mpCurrentSaveObjBoundings, mNumSaveObjs); +} + +void dLytMapMain_c::initSaveObjs() { + nw4r::lyt::Bounding **ptrs = mpCurrentSaveObjBoundings; + nw4r::lyt::Bounding *p; + for (u32 i = 0; i < mNumSaveObjs; i++) { + p = *ptrs; + if (p->IsVisible()) { + mVec3_c pos(p->GetGlobalMtx()._03, p->GetGlobalMtx()._13, 0.0f); + mSaveObjs[i].setPosition(pos); + mSaveObjs[i].setAlpha(p->GetGlobalAlpha()); + mSaveObjs[i].draw(); + } + ptrs++; + } +} + +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.isValid = true; + data.mapMode = mCurrentMapMode; + data.mapUpDirection = mMapUpDirection; + data.mapUpDirectionAfterZoomToDetail = mMapUpDirectionAfterZoomToDetail; + sSavedMapData.showIslandNames = mShowIslandNames; +} + +void dLytMapMain_c::initMapState() { + for (int i = 0; i < 6; i++) { + 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 = + sDefaultMapData.entries[i].mapUpDirectionAfterZoomToDetail; + } + sSavedMapData.showIslandNames = sDefaultMapData.showIslandNames; +} + +void dLytMapMain_c::loadMapState() { + mCurrentMapMode = sSavedMapData.entries[mRoomType].mapMode; + mMapUpDirection = sSavedMapData.entries[mRoomType].mapUpDirection; + mMapUpDirectionAfterZoomToDetail = sSavedMapData.entries[mRoomType].mapUpDirectionAfterZoomToDetail; + mShowIslandNames = sSavedMapData.showIslandNames; +} + +void dLytMapMain_c::clearButtonMessages() { + // @bug this clears flags 16k times + for (int i = 0; i <= METER_BTN_0x4000; i++) { + dLytMeter_c::GetInstance()->clearFlags(i); + } +} + +void dLytMapMain_c::setButtonMessages( + s32 currentMapMode, bool currentUpDirection, s32 nextMapMode, bool nextUpDirection +) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_BG, LytDoButtonRelated::ACT_IE_NONE); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); + + if (canCenterCursor(currentMapMode) || canCenterCursor(nextMapMode)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_DOWN); + LytDoButtonRelated::setCrossDown(LytDoButtonRelated::ACT_IE_ETC_CENTER, true); + } + + // TODO - some of these parts directly access members instead of using function args... + + // TODO - canCenterCursor1 looks like an inline that somehow failed to get inlined (it's emitted right after this + // function...) + if (canCenterCursor1(mCurrentMapMode) && canCenterCursor1(mNextMapMode) && canPlaceBeacons(mCurrentMapMode) && + canPlaceBeacons(mNextMapMode)) { + if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_C); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_ETC_ADD_BEACON); + } else if (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_C); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_C, LytDoButtonRelated::ACT_IE_ETC_REMOVE_BEACON); + } else if (!(*mStateMgr.getStateID() == StateID_In) && !(*mStateMgr.getStateID() == StateID_Out)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); + } + } + + if (canZoomOut(currentMapMode) && canZoomOut(nextMapMode)) { + if ((mRoomType == ROOMTYPE_FIELD && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) || + (mRoomType == ROOMTYPE_SKYLOFT && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || + (mRoomType == ROOMTYPE_SKYFIELD && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || + (mRoomType == ROOMTYPE_BOSS_HOUSE && currentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) || + (mRoomType == ROOMTYPE_SKYFIELD_INTERIOR && currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || + (mRoomType == ROOMTYPE_DUNGEON && currentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_WORLD_MAP); + } else { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_LEFT); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_L, LytDoButtonRelated::ACT_IE_ETC_ZOOM_OUT); + + if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_ZOOM_OUT); + } + } + } + + if (canZoomIn(currentMapMode) && canZoomIn(nextMapMode)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_RIGHT); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_CROSS_R, LytDoButtonRelated::ACT_IE_ETC_ZOOM_IN); + + if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && nextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_ZOOM_IN); + } + } + + // Directly accessing members instead of using function args... + if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_NUN_STK); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SELECT_FLOOR); + + if (mFloorBtnMgr.hasPointedAtABtnIdx() && mFloorBtnMgr.canDecideFloor()) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY); + } + } + + if (canChangeUpDirection(currentMapMode, currentUpDirection) && + canChangeUpDirection(nextMapMode, nextUpDirection)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); + + if (!currentUpDirection) { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_ROTATE_MAP); + } else { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_ROTATE_MAP_2); + } + } + + switch (mRoomType) { + case ROOMTYPE_SKYLOFT: { + if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); + LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (canResetPosition(mCurrentMapMode, mMapUpDirection)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL + ); + } else { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); + } + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + } + break; + } + case ROOMTYPE_FIELD: + case ROOMTYPE_SKYFIELD: { + if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); + LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (canResetPosition(mCurrentMapMode, mMapUpDirection)) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); + LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL + ); + } else { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_NONE); + } + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + } + + if (mRoomType == ROOMTYPE_SKYFIELD && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_Z); + if (mShowIslandNames) { + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_HIDE_ISLAND_NAME + ); + } else { + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_Z, LytDoButtonRelated::ACT_IE_ETC_SHOW_ISLAND_NAME + ); + } + } + break; + } + case ROOMTYPE_DUNGEON: { + if (currentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + dLytMeter_c::GetInstance()->setFlags(METER_BTN_CROSS_UP); + LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_ETC_CURRENT_LOCATION, true); + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x1000); + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_NUN_STK, LytDoButtonRelated::ACT_IE_ETC_SCROLL); + + if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx()) { + if (mFloorBtnMgr.canDecideFloor()) { + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY + ); + } else { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); + } + } + + dLytMeter_c::GetInstance()->setFlags(METER_BTN_0x4000); + + } else if (currentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx()) { + if (mFloorBtnMgr.canDecideFloor()) { + LytDoButtonRelated::set( + LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_ETC_DISPLAY + ); + } else { + LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); + } + } + } + break; + } + } +} + +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 || + ((mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON) && mPointerOnMap)) || + (mPointerCanPlaceBeacon && isPointingAtMainMap()) || + (*mPinIconAggregate.mStateMgr.getStateID() == dLytMapPinIconAggregate_c::StateID_Select) || + (needsNav(mCurrentMapMode) && needsNav(mNextMapMode) && mFloorBtnMgr.hasPointedAtABtnIdx())) { + dCsGame_c::GetInstance()->pointerDefSet(); + } else { + dCsGame_c::GetInstance()->pointerCatSet(); + } + } +} + +void dLytMapMain_c::calculateBoundingWorldHitboxes() { + dLytMapGlobal_c *global = getGlobal(); + f32 sc = global->getField_0x28().x; + f32 f1 = field_0x8D40 * global->getField_0x44(); + f32 f2 = f1 * sc; + mAng rot = global->getField_0x56(); + + for (int i = 0; i <= MAP_MAIN_NUM_BOUNDINGS_NORMAL - 1; i++) { + mVec3_c v1; + mVec3_c v2; + + f32 v1x = (f32)mHitChecks[i].getBoundingData()->mMinX; + f32 v2x = (f32)mHitChecks[i].getBoundingData()->mMaxX; + f32 v1z = (f32)mHitChecks[i].getBoundingData()->mMaxY; + f32 v2z = (f32)mHitChecks[i].getBoundingData()->mMinY; + + v1.x = v1x / f2; + v1.y = 0.0f; + v1.z = -v1z / f1; + + v2.x = v2x / f2; + v2.y = 0.0f; + v2.z = -v2z / f1; + + v1.rotY(rot); + v2.rotY(rot); + + // Looks like this is manually unprojecting the UI element + // hitbox corners? + s16 v = rot.mVal; + if (v == 0) { + // 0° rotation + mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v1.x; + mBoundingWorldBounds[i].min.y = 0.0f; + mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v1.z; + + mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v2.x; + mBoundingWorldBounds[i].max.y = 0.0f; + mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v2.z; + } else if (v == 0x4000) { + // 90° rotation + mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v1.x; + mBoundingWorldBounds[i].min.y = 0.0f; + mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v2.z; + + mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v2.x; + mBoundingWorldBounds[i].max.y = 0.0f; + mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v1.z; + } else if (v == -0x8000) { + // 180° rotation + mBoundingWorldBounds[i].min.x = field_0x8CC4.x + v2.x; + mBoundingWorldBounds[i].min.y = 0.0f; + mBoundingWorldBounds[i].min.z = field_0x8CC4.z + v2.z; + + mBoundingWorldBounds[i].max.x = field_0x8CC4.x + v1.x; + mBoundingWorldBounds[i].max.y = 0.0f; + mBoundingWorldBounds[i].max.z = field_0x8CC4.z + v1.z; + } + } } void dLytMapMain_c::initializeState_Invisible() {} @@ -509,32 +3691,1180 @@ void dLytMapMain_c::initializeState_RenderingWait() {} void dLytMapMain_c::executeState_RenderingWait() {} void dLytMapMain_c::finalizeState_RenderingWait() {} -void dLytMapMain_c::initializeState_In() {} -void dLytMapMain_c::executeState_In() {} -void dLytMapMain_c::finalizeState_In() {} +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 +}; + +extern const s32 unkPadding[]; +const s32 unkPadding[14] = {0}; + +// Not sure what the second number means +static const s32 sFlags2RenameMe[][2] = { + { STORYFLAG_FARON_DISCOVERED, 5}, + { 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 (mMapEvent == MAP_EVENT_DUNGEON_MAP_GET || mMapEvent == MAP_EVENT_FOREST_MAP_CHANGE) { + mMapChangeAlpha = 0; + } else { + mMapChangeAlpha = 0xFF; + } + mEventDone = false; + mEventCanceled = false; + + 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 (mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_BOSS_HOUSE) { + 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 (mMapEvent == MAP_EVENT_MAP_INTRO) { + 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 (mRoomType == ROOMTYPE_SKYLOFT || + (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { + grpZIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_IN_SKY_MAP_2]; + grpZAIn = &mAnmGroups[MAP_MAIN_ANIM_MAP_ZA_OUT_SKY_COURSE]; + } + + mAnmGroups[MAP_MAIN_ANIM_SKYLOFT_UP_DOWN].bind(false); + mAnmGroups[MAP_MAIN_ANIM_CLOUD_LOOP].bind(false); + mAnmGroups[MAP_MAIN_ANIM_LIGHT_LOOP].bind(false); + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + 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 (mMapEvent == MAP_EVENT_SW_BANK_SMALL) { + 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(mNumTitleLines - 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 (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + 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 (mRoomType == ROOMTYPE_SKYFIELD) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mMarkers.setIslandNamesOn(mShowIslandNames); + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mMarkers.setIslandNamesOn(false); + } + } +} + +void dLytMapMain_c::initializeState_In() { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + displaySaveObjs(); + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + mPopupInfo.mStateMgr.changeState(dLytMapPopupInfo_c::StateID_In); + } + } + + if (mDoCameraTransition || mMapEvent == MAP_EVENT_MAP_INTRO) { + mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN]; + } else { + mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_IN_NO_CAM]; + } + + field_0x8C88 = mpInOutAnmGroup->getLastFrame(); + mpInOutAnmGroup->bind(false); + mpInOutAnmGroup->setFrame(0.0f); + mPinIconAggregate.setScale(getGlobal()->getZoomFrame()); +} +void dLytMapMain_c::executeState_In() { + mIsVisible = 1; + + dLytMapGlobal_c *global = getGlobal(); + if ((!mDoCameraTransition || !field_0x8C84) && mDoCameraTransition) { + return; + } + + f32 ratio = (mpInOutAnmGroup->getFrame() / mpInOutAnmGroup->getLastFrame()); + + f32 f1 = fn_80142D90(mCurrentMapMode) * 2.0f; + f32 f2 = fn_80142D90(mCurrentMapMode); + f32 f3 = cLib::easeOut(ratio, 3.0f); + global->setField_0x44(f1 + f3 * (f2 - f1)); + + mVec3_c v1; + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || + mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + fn_80142F00(v1, mCurrentMapMode, true, global->getMapRotationCenter(), global->getField_0x56()); + } else { + fn_80142F00(v1, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + } + global->setMapScroll(v1); + if (mpInOutAnmGroup->isEndReached()) { + dCsGame_c::GetInstance()->setPriorityDraw(0x8A); + mLyt.getLayout()->Animate(0); + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_IN].unbind(); + mpInOutAnmGroup->unbind(); + for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { + mHitChecks[i].resetCachedHitboxes(); + mHitChecks[i].execute(); + } + + switch (mMapEvent) { + default: { + mFloorBtnMgr.mStateMgr.changeState(dLytMapFloorBtnMgr_c::StateID_Wait); + mStateMgr.changeState(StateID_Active); + break; + } + case MAP_EVENT_SW_BANK_SMALL: { + mStateMgr.changeState(StateID_EventSwBankSmall_Step1); + break; + } + case MAP_EVENT_MAP_INTRO: { + mStateMgr.changeState(StateID_EventMapIntro_Step1); + break; + } + case MAP_EVENT_DUNGEON_MAP_GET: { + mStateMgr.changeState(StateID_EventDungeonMapGet_Step1); + break; + } + case MAP_EVENT_FIELD_MAP_CHANGE_5: + case MAP_EVENT_FIELD_MAP_CHANGE_8: { + mStateMgr.changeState(StateID_EventFieldMapChange_Step1); + break; + } + case MAP_EVENT_FOREST_MAP_CHANGE: { + mStateMgr.changeState(StateID_EventForestMapChange_Step1); + break; + } + case MAP_EVENT_SIGNAL_ADD: { + mStateMgr.changeState(StateID_EventSignalAdd_Step1); + break; + } + case MAP_EVENT_GODDESS_CUBE: { + mStateMgr.changeState(StateID_EventGoddessCube_Step1); + break; + } + case MAP_EVENT_SAVE_OBJ: { + displaySaveObjs(); + mStateMgr.changeState(StateID_EventSaveObjMsgWindow); + break; + } + } + } + + if (mpInOutAnmGroup->isBound()) { + mpInOutAnmGroup->play(); + } +} +void dLytMapMain_c::finalizeState_In() { + if (fn_80141530()) { + dBase_c::s_NextExecuteControlFlags |= dBase_c::BASE_PROP_0x10; + } + dBase_c::s_DrawControlFlags |= dBase_c::BASE_PROP_0x10; +} + +s32 dLytMapMain_c::getAreaGroup(s32 stifArea) const { + s32 ret = AREAGROUP_MAX; + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + 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; + } + } 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; +} + +s32 dLytMapMain_c::getRoomType() const { + s32 ret = ROOMTYPE_FIELD; + s32 stifRoomType = dStageMgr_c::GetInstance()->getSTIFRoomType(); + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + ret = ROOMTYPE_FIELD; + } + + if (dScGame_c::isCurrentStage("F011r") || + (dScGame_c::isCurrentStage("F002r") && dScGame_c::currentSpawnInfo.isNight()) || + dScGame_c::isCurrentStage("F010r") || dScGame_c::isCurrentStage("F019r")) { + ret = ROOMTYPE_SKYFIELD_INTERIOR; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_FIELD) { + ret = ROOMTYPE_FIELD; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_DUNGEON) { + ret = ROOMTYPE_DUNGEON; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_SKYLOFT) { + ret = ROOMTYPE_SKYLOFT; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_BOSS_HOUSE) { + ret = ROOMTYPE_BOSS_HOUSE; + } else if (stifRoomType == dStageMgr_c::STIF_ROOMTYPE_SKYFIELD) { + ret = ROOMTYPE_SKYFIELD; + } + return ret; +} + +void dLytMapMain_c::zoomIn() { + if (mRoomType == ROOMTYPE_SKYLOFT || + (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + if (dPad::getDownTrigRight()) { + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { + mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); + + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); + } else { + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } + } else if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { + mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); + + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); + } else { + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } + } else if (mRoomType == ROOMTYPE_FIELD) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigRight() || dPad::getDownTrigA()) { + mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); + + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); + } else { + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } + } else if (mRoomType == ROOMTYPE_DUNGEON) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigRight() || (!mFloorBtnMgr.hasPointedAtABtnIdx() && dPad::getDownTrigA())) { + mNextMapUpDirection = mMapUpDirectionAfterZoomToDetail; + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); + + if (mPointerOnMap && (mNumFloors < 2 || !mFloorBtnMgr.hasPointedAtABtnIdx())) { + mStateMgr.changeState(StateID_ChgDispAreaMode_CsrRot); + } else { + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } + } else if (mRoomType == ROOMTYPE_BOSS_HOUSE) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigRight()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_COURSE); + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } + } +} + +void dLytMapMain_c::zoomOut() { + if (mRoomType == ROOMTYPE_SKYLOFT || + (mAreaGroup == AREAGROUP_SKY && (mRoomType == ROOMTYPE_BOSS_HOUSE || mRoomType == ROOMTYPE_DUNGEON))) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_WORLD_SKY) { + if (dPad::getDownTrigLeft()) { + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD_SKY; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { + mMapUpDirectionAfterZoomToDetail = mMapUpDirection; + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mNextMapUpDirection = true; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); + + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } else if (mRoomType == ROOMTYPE_SKYFIELD || mRoomType == ROOMTYPE_SKYFIELD_INTERIOR) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { + mMapUpDirectionAfterZoomToDetail = mMapUpDirection; + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mNextMapUpDirection = true; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); + + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } else if (mRoomType == ROOMTYPE_FIELD) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (dPad::getDownTrigLeft() || dPad::getDownTrigA()) { + mMapUpDirectionAfterZoomToDetail = mMapUpDirection; + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mNextMapUpDirection = true; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); + + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } else if (mRoomType == ROOMTYPE_DUNGEON) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + if (dPad::getDownTrigLeft() || (!mFloorBtnMgr.hasPointedAtABtnIdx() && dPad::getDownTrigA())) { + mMapUpDirectionAfterZoomToDetail = mMapUpDirection; + mNextMapMode = dLytMapGlobal_c::MAPMODE_STAGE; + mNextMapUpDirection = true; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_COURSE); + + mStateMgr.changeState(StateID_ChgDispAreaMode_MapRot); + } + } + } else if (mRoomType == ROOMTYPE_BOSS_HOUSE) { + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_WORLD); + mNextMapMode = dLytMapGlobal_c::MAPMODE_WORLD; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } else if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + if (dPad::getDownTrigLeft()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMOUT_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + } + } +} void dLytMapMain_c::initializeState_Active() {} -void dLytMapMain_c::executeState_Active() {} -void dLytMapMain_c::finalizeState_Active() {} +void dLytMapMain_c::executeState_Active() { + dLytMapGlobal_c *global = getGlobal(); + if (dMessage_c::getInstance()->getInMapEvent()) { + return; + } -void dLytMapMain_c::initializeState_Out() {} -void dLytMapMain_c::executeState_Out() {} + if (mRoomType == ROOMTYPE_SKYFIELD && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && dPad::getDownTrigZ()) { + if (mShowIslandNames) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_OFF); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ISLAND_NAME_ON); + } + mShowIslandNames = !mShowIslandNames; + mMarkers.setIslandNamesOn(mShowIslandNames); + } + checkScroll(); + + if (needsNav(mCurrentMapMode) && needsNav(mNextMapMode)) { + if (!mNavEnabled) { + dPadNav::setNavEnabled(true, false); + mNavEnabled = true; + } + if (mFloorBtnMgr.canDecideFloor() && dPad::getDownTrigA()) { + mFloorBtnMgr.decideSelectedFloor(); + field_0x8C64 = mFloorBtnMgr.getCurrentFloor(); + global->setFloor(field_0x8C64); + mStateMgr.changeState(StateID_FloorChange); + } + } else { + if (mNavEnabled) { + dPadNav::setNavEnabled(false, false); + mNavEnabled = false; + } + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + canZoomIn(dLytMapGlobal_c::MAPMODE_STAGE)) { + 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); + fn_8013FB70(field_0x8CF4, getGlobal()->getField_0x44() / tmp); + mDrawScaleFrame = true; + } else { + // Cannot zoom in around cursor, use the player pos + f32 tmp = fn_80142D90(dLytMapGlobal_c::MAPMODE_ZOOM); + f32 val = getGlobal()->getField_0x44() / tmp; + fn_8013FB70(getGlobal()->getPlayerPos(), val); + mDrawScaleFrame = true; + } + } + + if (field_0x8DBD && *mPinIconAggregate.mStateMgr.getStateID() != dLytMapPinIconAggregate_c::StateID_Select && + dPad::getDownTrigC() && mPointerCanPlaceBeacon) { + s32 id = -1; + mPinIconAggregate.findNewBeaconId(&id); + if (id >= 0) { + mVec3_c pos3d; + dLytMapGlobal_c *global = getGlobal(); + global->unprojectFromMap(pos3d, dCsGame_c::GetInstance()->getCursorIf()->getCursorPos()); + mPinIconAggregate.setPosition(id, pos3d); + setBeaconPositionChecked(&pos3d, id); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_SET); + } + } else if ((dPad::getDownTrigLeft() && canZoomOut(mCurrentMapMode)) || + (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && + canZoomOut(mCurrentMapMode))) { + zoomOut(); + } else if ((dPad::getDownTrigRight() && canZoomIn(mCurrentMapMode)) || + (dPad::getDownTrigA() && mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && + canZoomIn(mCurrentMapMode))) { + zoomIn(); + } else if ((mRoomType == ROOMTYPE_FIELD || mRoomType == ROOMTYPE_DUNGEON || mRoomType == ROOMTYPE_SKYLOFT || + mRoomType == ROOMTYPE_SKYFIELD) && + canResetPosition(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigUp()) { + mVec3_c pos; + fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + f32 distSq = global->getMapScroll().squareDistanceToXZ(pos); + if (mCurrentFloor != global->getFloor()) { + mFloorBtnMgr.resetFloor(-(mCurrentFloor - mBaseFloorOffset)); + global->setFloor(mCurrentFloor); + mStateMgr.changeState(StateID_ResetPosWithFloorChange); + } else if (distSq >= 1.0f) { + mStateMgr.changeState(StateID_ResetPos); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_NOT_MOVE); + } + } else if (canChangeUpDirection(mCurrentMapMode, mMapUpDirection) && dPad::getDownTrigZ()) { + mStateMgr.changeState(StateID_ChgMapUpDirection); + } + + if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) || + (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) { + field_0xF1C.field_0x05 = true; + } + + mPinIconAggregate.execute(); + + for (int idx = 0; idx < (int)ARRAY_LENGTH(mHitChecks); idx++) { + mHitChecks[idx].resetCachedHitboxes(); + mHitChecks[idx].execute(); + } +} +void dLytMapMain_c::finalizeState_Active() { + mDrawScaleFrame = false; +} + +void dLytMapMain_c::initializeState_Out() { + if (mMapEvent == MAP_EVENT_SAVE_OBJ) { + mPopupInfo.mStateMgr.changeState(StateID_Out); + } + dLytMeter_c::GetInstance()->setMeterField_0x13750(0); + if (mDoCameraTransition || mMapEvent == MAP_EVENT_MAP_INTRO) { + mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT]; + } else { + mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT_NO_CAM]; + } + + mpInOutAnmGroup->bind(false); + mpInOutAnmGroup->setFrame(0.0f); + field_0x8C8C = mpInOutAnmGroup->getLastFrame(); + + if (fn_80141530()) { + dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; + } + + dPadNav::setNavEnabled(false, false); +} +void dLytMapMain_c::executeState_Out() { + if (mpInOutAnmGroup->isEndReached()) { + 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(); + mIsVisible = 0; + mStateMgr.changeState(StateID_Invisible); + } + } + + if (mpInOutAnmGroup->isBound()) { + mpInOutAnmGroup->play(); + } +} void dLytMapMain_c::finalizeState_Out() {} -void dLytMapMain_c::initializeState_FloorChange() {} -void dLytMapMain_c::executeState_FloorChange() {} +void dLytMapMain_c::initializeState_FloorChange() { + mMapCapture.renderRequest(); +} +void dLytMapMain_c::executeState_FloorChange() { + if (!mMapCapture.isBusyRendering()) { + mStateMgr.changeState(StateID_Active); + dPadNav::stopFSStickNav(); + } +} void dLytMapMain_c::finalizeState_FloorChange() {} -void dLytMapMain_c::initializeState_ChgMapUpDirection() {} -void dLytMapMain_c::executeState_ChgMapUpDirection() {} +void dLytMapMain_c::initializeState_ChgMapUpDirection() { + mNextMapUpDirection = !mMapUpDirection; + field_0x8D44 = getGlobal()->getMapRotation(); + + if (mMapEvent == MAP_EVENT_MAP_INTRO) { + field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000); + mNextMapUpDirection = false; + } else { + fn_80142D10(mCurrentMapMode, mNextMapUpDirection, field_0x8D46); + } + (void)getGlobal(); + dLytMapGlobal_c *global = getGlobal(); + mPlayerPos = global->getPlayerPos(); + mVec2_c v(0.0f, 0.0f); + global->unprojectFromMap(mMapScroll, v, field_0x8D44); + global->setMapRotationCenter(mPlayerPos); + const mVec3_c ¢er = global->getMapRotationCenter(); + fn_80143060(mPlayerPos, mPlayerPos, center, field_0x8D46); + fn_80143060(mMapScroll, mMapScroll, center, field_0x8D44); + global->setMapScroll(mMapScroll); + field_0x8C70 = 0; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_CHANGE_DIRECT); +} +void dLytMapMain_c::executeState_ChgMapUpDirection() { + if (mMapEvent == MAP_EVENT_MAP_INTRO && mEventCanceled) { + forceOut(); + } else { + dLytMapGlobal_c *global = getGlobal(); + f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1B, 2.0f); + + // Lerps + + // TODO stack and reg swaps + global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); + + mVec3_c actualPos = (mPlayerPos - mMapScroll) * factor + mMapScroll; + global->setMapScroll(actualPos); + + if (field_0x8C70 >= sHio.field_0x1B) { + mLyt.calc(); + mMapUpDirection = mNextMapUpDirection; + if (mMapEvent == MAP_EVENT_MAP_INTRO) { + mStateMgr.changeState(StateID_EventMapIntro_Step4); + } else { + mStateMgr.changeState(StateID_Active); + } + } else { + field_0x8C70++; + } + + if (mMapEvent == MAP_EVENT_MAP_INTRO) { + EventManager::execute(); + } + } +} void dLytMapMain_c::finalizeState_ChgMapUpDirection() {} -void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() {} -void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() {} +void dLytMapMain_c::initializeState_ChgDispAreaMode_MapRot() { + dLytMapGlobal_c *global = getGlobal(); + mMapScroll = global->getMapScroll(); + field_0x8D50 = global->getField_0x44(); + field_0x8D44 = global->getMapRotation(); + + field_0x8D4C = fn_80142D90(mNextMapMode); + if (mMapEvent == MAP_EVENT_MAP_INTRO) { + field_0x8D46 = dAcPy_c::GetLink()->mRotation.y + mAng(0x8000); + mNextMapUpDirection = false; + } else { + mNextMapUpDirection = fn_80142D10(mNextMapMode, mNextMapUpDirection, field_0x8D46); + } + + fn_80142F00(mPlayerPos, mNextMapMode, mNextMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + field_0x8C70 = 0; + + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + global->setZoomFrame(1.0f); + global->setField_0x58(field_0x8D50 / field_0x8D4C); + } else { + global->setZoomFrame(0.0f); + global->setField_0x58(1.0f); + } + + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && !mNextMapUpDirection) { + mVec2_c v(0.0f, 0.0f); + global->unprojectFromMap(mMapScroll, v, field_0x8D44); + mVec3_c v2 = mPlayerPos; + global->setMapRotationCenter(v2); + dLytMapGlobal_c *global2 = getGlobal(); + const mVec3_c ¢er = global2->getMapRotationCenter(); + fn_80143060(mPlayerPos, v2, center, field_0x8D46); + mVec3_c v3 = mMapScroll; + fn_80143060(mMapScroll, v3, center, field_0x8D44); + mVec3_c v4 = mMapScroll; + global2->setMapScroll(v4); + } else { + mVec2_c v(0.0f, 0.0f); + global->unprojectFromMap(mMapScroll, v, field_0x8D44); + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mPlayerPos = field_0x8CC4; + } else { + mPlayerPos = global->getPlayerPos(); + } + + global->setMapRotationCenter(mMapScroll); + mVec3_c v2 = mPlayerPos; + dLytMapGlobal_c *global2 = getGlobal(); + const mVec3_c ¢er = global2->getMapRotationCenter(); + fn_80143060(mPlayerPos, v2, center, field_0x8D46); + mVec3_c v3 = mMapScroll; + fn_80143060(mMapScroll, v3, center, field_0x8D44); + mVec3_c v4 = mMapScroll; + global2->setMapScroll(v4); + } + + mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false); + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mMarkers.setIslandNamesOn(false); + } + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mMarkers.setIslandNamesOn(mShowIslandNames); + } + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mVec2_c v(global->getField_0x20().x, global->getField_0x20().y); + global->unprojectFromMap(field_0x8CF4, v); + } +} +void dLytMapMain_c::executeState_ChgDispAreaMode_MapRot() { + if (mMapEvent == MAP_EVENT_MAP_INTRO && mEventCanceled) { + forceOut(); + } else { + dLytMapGlobal_c *global = getGlobal(); + f32 f1 = (f32)field_0x8C70 / sHio.field_0x1B; + f32 factor = cLib::easeInOut(f1, 2.0f); + + f32 f2, f3; + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + f32 ratio = field_0x8D50 / field_0x8D4C; + f1 = 1.0f - f1; + f2 = ratio + (1.0f - ratio) * factor; + f3 = 1.0f - factor; + } else { + f32 ratio = field_0x8D4C / field_0x8D50; + f2 = ratio + (1.0f - ratio) * (1.0f - factor); + f3 = factor; + } + global->setZoomFrame(f1); + global->setField_0x58(f2); + + // TODO - there is tons of dead code here + + // Lerps + f32 f4 = field_0x8D50 + factor * (field_0x8D4C - field_0x8D50); + global->setField_0x44(f4); + + // TODO stack and reg swaps + global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); + + mVec3_c actualPos; + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + actualPos = (mPlayerPos - mMapScroll) * (1.0f - factor) * (1.0f / (f4 / field_0x8D50)) + mMapScroll; + } else { + actualPos = (mPlayerPos - mMapScroll) * (1.0f - factor) * (1.0f / (f4 / field_0x8D50)) + mMapScroll; + } + + global->setMapScroll(actualPos); + + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM && mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + fn_8013FB70(field_0x8CF4, f4 / field_0x8D50); + mDrawScaleFrame = true; + } + + // TODO dead code + f32 length = mAnmGroups[MAP_MAIN_ANIM_ROTATE].getLastFrame(); + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(length - f3 * length); + + if (field_0x8C70 >= sHio.field_0x1C) { + if (mMapEvent == MAP_EVENT_MAP_INTRO && field_0x0108 > 0) { + field_0x0108--; + } else { + mDrawScaleFrame = false; + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind(); + mDrawScaleFrame = false; + mMapUpDirection = mNextMapUpDirection; + global->setMapRotation(field_0x8D46); + global->setField_0x44(field_0x8D4C); + global->setMapScroll(mPlayerPos); + + if (mMapEvent == MAP_EVENT_MAP_INTRO) { + mStateMgr.changeState(StateID_EventMapIntro_Step4); + } else { + mStateMgr.changeState(StateID_Active); + mCurrentMapMode = mNextMapMode; + } + } + } else { + field_0x8C70++; + } + if (mMapEvent == MAP_EVENT_MAP_INTRO) { + EventManager::execute(); + } + } +} void dLytMapMain_c::finalizeState_ChgDispAreaMode_MapRot() {} void dLytMapMain_c::initializeState_ChgDispAreaMode_Map() {} -void dLytMapMain_c::executeState_ChgDispAreaMode_Map() {} +void dLytMapMain_c::executeState_ChgDispAreaMode_Map() { + // Won't attempt this until the dead code in executeState_ChgDispAreaMode_MapRot is solved +} void dLytMapMain_c::finalizeState_ChgDispAreaMode_Map() {} void dLytMapMain_c::initializeState_ChgDispAreaMode_WA() {} @@ -545,118 +4875,953 @@ void dLytMapMain_c::initializeState_ChgDispAreaMode_CsrRot() {} void dLytMapMain_c::executeState_ChgDispAreaMode_CsrRot() {} void dLytMapMain_c::finalizeState_ChgDispAreaMode_CsrRot() {} -void dLytMapMain_c::initializeState_ResetPos() {} -void dLytMapMain_c::executeState_ResetPos() {} +void dLytMapMain_c::initializeState_ResetPos() { + dLytMapGlobal_c *global = getGlobal(); + field_0x8C70 = 0; + mMapScroll = global->getMapScroll(); + fn_80142F00(mPlayerPos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + field_0x8C70 = 0; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_START); +} +void dLytMapMain_c::executeState_ResetPos() { + dLytMapGlobal_c *global = getGlobal(); + f32 factor = cLib::easeOut((f32)field_0x8C70 / sHio.field_0x1A, 2.0f); + mVec3_c pos = (mPlayerPos - mMapScroll) * factor + mMapScroll; + global->setMapScroll(pos); + dSndSmallEffectMgr_c::GetInstance()->holdSound(SE_S_MAP_RESET_LV); + if (field_0x8C70 >= sHio.field_0x1A) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_RESET_END); + mStateMgr.changeState(StateID_Active); + } else { + field_0x8C70++; + } +} void dLytMapMain_c::finalizeState_ResetPos() {} -void dLytMapMain_c::initializeState_ResetPosWithFloorChange() {} -void dLytMapMain_c::executeState_ResetPosWithFloorChange() {} +void dLytMapMain_c::initializeState_ResetPosWithFloorChange() { + dPadNav::stopFSStickNav(); + mMapCapture.renderRequest(); +} +void dLytMapMain_c::executeState_ResetPosWithFloorChange() { + if (mMapCapture.isBusyRendering()) { + return; + } + dLytMapGlobal_c *global = getGlobal(); + mVec3_c pos; + fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56()); + if (global->getMapScroll().squareDistanceToXZ(pos) >= 1.0f) { + mStateMgr.changeState(StateID_ResetPos); + } else { + mStateMgr.changeState(StateID_Active); + } +} void dLytMapMain_c::finalizeState_ResetPosWithFloorChange() {} -void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() {} -void dLytMapMain_c::executeState_EventSwBankSmall_Step1() {} +void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() { + mEventTimer = sHio.field_0x1D; + field_0x8CB4 = 0; +} +void dLytMapMain_c::executeState_EventSwBankSmall_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + return; + } + + mMarkers.setField_0x0703(1); + mStateMgr.changeState(StateID_EventSwBankSmall_Step2); +} void dLytMapMain_c::finalizeState_EventSwBankSmall_Step1() {} -void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() {} -void dLytMapMain_c::executeState_EventSwBankSmall_Step2() {} +void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() { + mEventTimer = mMarkers.getField_0x0704(); +} +void dLytMapMain_c::executeState_EventSwBankSmall_Step2() { + if (mEventTimer != 0) { + mEventTimer--; + return; + } + mStateMgr.changeState(StateID_EventSwBankSmall_Step3); +} void dLytMapMain_c::finalizeState_EventSwBankSmall_Step2() {} -void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() {} -void dLytMapMain_c::executeState_EventSwBankSmall_Step3() {} +void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() { + mEventTimer = sHio.field_0x1E; +} +void dLytMapMain_c::executeState_EventSwBankSmall_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + return; + } + + mEventDone = true; +} void dLytMapMain_c::finalizeState_EventSwBankSmall_Step3() {} -void dLytMapMain_c::initializeState_EventMapIntro_Step1() {} -void dLytMapMain_c::executeState_EventMapIntro_Step1() {} +void dLytMapMain_c::initializeState_EventMapIntro_Step1() { + mEventTimer = sHio.field_0x1F; +} +void dLytMapMain_c::executeState_EventMapIntro_Step1() { + if (mEventCanceled) { + forceOut(); + return; + } + + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_EventMapIntro_Step2); + } + EventManager::execute(); +} void dLytMapMain_c::finalizeState_EventMapIntro_Step1() {} -void dLytMapMain_c::initializeState_EventMapIntro_Step2() {} -void dLytMapMain_c::executeState_EventMapIntro_Step2() {} +void dLytMapMain_c::initializeState_EventMapIntro_Step2() { + if (field_0x8880[field_0x88AC] != nullptr) { + field_0x8880[field_0x88AC]->bind(false); + field_0x8880[field_0x88AC]->setFrame(0.0f); + mLyt.calc(); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_WORLD_EXTEND); + } +} +void dLytMapMain_c::executeState_EventMapIntro_Step2() { + if (mEventCanceled) { + forceOut(); + return; + } + + if (field_0x8880[field_0x88AC] != nullptr) { + if (field_0x8880[field_0x88AC]->isEndReached()) { + field_0x8880[field_0x88AC]->unbind(); + mStateMgr.changeState(StateID_EventMapIntro_Step3); + } else { + field_0x8880[field_0x88AC]->play(); + } + } else { + mStateMgr.changeState(StateID_EventMapIntro_Step3); + } + + EventManager::execute(); +} void dLytMapMain_c::finalizeState_EventMapIntro_Step2() {} -void dLytMapMain_c::initializeState_EventMapIntro_Step3() {} -void dLytMapMain_c::executeState_EventMapIntro_Step3() {} +void dLytMapMain_c::initializeState_EventMapIntro_Step3() { + mEventTimer = 0; +} +void dLytMapMain_c::executeState_EventMapIntro_Step3() { + if (mEventCanceled) { + forceOut(); + return; + } + + if (mEventTimer != 0) { + mEventTimer--; + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_AREA); + mNextMapMode = dLytMapGlobal_c::MAPMODE_PROVINCE; + field_0x0108 = sHio.field_0x20; + mStateMgr.changeState(StateID_ChgDispAreaMode_WA); + } + EventManager::execute(); +} void dLytMapMain_c::finalizeState_EventMapIntro_Step3() {} -void dLytMapMain_c::initializeState_EventMapIntro_Step4() {} -void dLytMapMain_c::executeState_EventMapIntro_Step4() {} +void dLytMapMain_c::initializeState_EventMapIntro_Step4() { + mEventTimer = sHio.field_0x21; +} +void dLytMapMain_c::executeState_EventMapIntro_Step4() { + if (mEventCanceled) { + forceOut(); + return; + } + + if (mEventTimer != 0) { + mEventTimer--; + } else { + mEventDone = true; + } + EventManager::execute(); +} void dLytMapMain_c::finalizeState_EventMapIntro_Step4() {} -void dLytMapMain_c::initializeState_EventDungeonMapGet_Step1() {} -void dLytMapMain_c::executeState_EventDungeonMapGet_Step1() {} +void dLytMapMain_c::forceOut() { + mAnmGroups[MAP_MAIN_ANIM_OUT].bind(false); + mAnmGroups[MAP_MAIN_ANIM_OUT].setToEnd(); + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_OUT].unbind(); + dBase_c::s_NextExecuteControlFlags &= ~dBase_c::BASE_PROP_0x10; + dBase_c::s_DrawControlFlags &= ~dBase_c::BASE_PROP_0x10; + dScGame_c::getCamera(0)->doFn_80093360(); + dScGame_c::getCamera(0)->fn_8019E430(); + mStateMgr.changeState(StateID_Invisible); +} + +void dLytMapMain_c::initializeState_EventDungeonMapGet_Step1() { + mEventTimer = sHio.field_0x22; +} +void dLytMapMain_c::executeState_EventDungeonMapGet_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_EventDungeonMapGet_Step2); + } +} void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step1() {} -void dLytMapMain_c::initializeState_EventDungeonMapGet_Step2() {} -void dLytMapMain_c::executeState_EventDungeonMapGet_Step2() {} +void dLytMapMain_c::initializeState_EventDungeonMapGet_Step2() { + mEventTimer = sHio.field_0x23; + field_0x8CB4 = sHio.field_0x24; + field_0x8CB8 = mMarkers.getField_0x0704(); + mMapChangeAlpha = 0; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); +} +void dLytMapMain_c::executeState_EventDungeonMapGet_Step2() { + dLytMapGlobal_c *global = getGlobal(); + if (mEventTimer != 0 || field_0x8CB4 != 0 || field_0x8CB8 != 0) { + if (mEventTimer != 0) { + mEventTimer--; + } + u8 alpha = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; + global->setField_0x4F(alpha); + mMapChangeAlpha = alpha; + if (field_0x8CB4 != 0) { + field_0x8CB4--; + } else { + mMarkers.setField_0x0702(1); + if (field_0x8CB8 != 0) { + field_0x8CB8--; + } + } + } else { + global->setField_0x4C(0); + mStateMgr.changeState(StateID_EventDungeonMapGet_Step3); + } +} void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step2() {} -void dLytMapMain_c::initializeState_EventDungeonMapGet_Step3() {} -void dLytMapMain_c::executeState_EventDungeonMapGet_Step3() {} +void dLytMapMain_c::initializeState_EventDungeonMapGet_Step3() { + mEventTimer = sHio.field_0x25; +} +void dLytMapMain_c::executeState_EventDungeonMapGet_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mEventDone = true; + } +} void dLytMapMain_c::finalizeState_EventDungeonMapGet_Step3() {} -void dLytMapMain_c::initializeState_EventFieldMapChange_Step1() {} -void dLytMapMain_c::executeState_EventFieldMapChange_Step1() {} +void dLytMapMain_c::initializeState_EventFieldMapChange_Step1() { + mEventTimer = sHio.field_0x26; +} +void dLytMapMain_c::executeState_EventFieldMapChange_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_EventFieldMapChange_Step2); + } +} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step1() {} -void dLytMapMain_c::initializeState_EventFieldMapChange_Step2() {} -void dLytMapMain_c::executeState_EventFieldMapChange_Step2() {} +void dLytMapMain_c::initializeState_EventFieldMapChange_Step2() { + mEventTimer = sHio.field_0x27; + mMapChangeAlpha = 0; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); +} +void dLytMapMain_c::executeState_EventFieldMapChange_Step2() { + dStage_c *stage = dStage_c::GetInstance(); + u32 duration = sHio.field_0x27; + if (mEventTimer != 0) { + u8 u1 = (f32)(duration - mEventTimer) / (f32)duration * 255.0f; + stage->getMapRelated()->setField_0x1E8(u1); + mEventTimer--; + } else { + stage->getMapRelated()->setField_0x1E8(0); + stage->getMapRelated()->setField_0x1EF(1); + mStateMgr.changeState(StateID_EventFieldMapChange_Step3); + } +} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step2() {} -void dLytMapMain_c::initializeState_EventFieldMapChange_Step3() {} -void dLytMapMain_c::executeState_EventFieldMapChange_Step3() {} +void dLytMapMain_c::initializeState_EventFieldMapChange_Step3() { + mEventTimer = sHio.field_0x28; +} +void dLytMapMain_c::executeState_EventFieldMapChange_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + } else if (mMapEvent == MAP_EVENT_FIELD_MAP_CHANGE_8) { + mStateMgr.changeState(StateID_Active); + } else { + mStateMgr.changeState(StateID_EventFieldMapChange_Step4); + } +} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step3() {} void dLytMapMain_c::initializeState_EventFieldMapChange_Step4() {} void dLytMapMain_c::executeState_EventFieldMapChange_Step4() {} void dLytMapMain_c::finalizeState_EventFieldMapChange_Step4() {} -void dLytMapMain_c::initializeState_EventForestMapChange_Step1() {} -void dLytMapMain_c::executeState_EventForestMapChange_Step1() {} +void dLytMapMain_c::initializeState_EventForestMapChange_Step1() { + mEventTimer = sHio.field_0x22; +} +void dLytMapMain_c::executeState_EventForestMapChange_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_EventForestMapChange_Step2); + } +} void dLytMapMain_c::finalizeState_EventForestMapChange_Step1() {} -void dLytMapMain_c::initializeState_EventForestMapChange_Step2() {} -void dLytMapMain_c::executeState_EventForestMapChange_Step2() {} +void dLytMapMain_c::initializeState_EventForestMapChange_Step2() { + mEventTimer = sHio.field_0x23; + field_0x8CB4 = sHio.field_0x24; + field_0x8CB8 = mMarkers.getField_0x0704(); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_EXTEND); + mMapChangeAlpha = 0; +} +void dLytMapMain_c::executeState_EventForestMapChange_Step2() { + dLytMapGlobal_c *global = getGlobal(); + if (mEventTimer != 0 || field_0x8CB4 != 0 || field_0x8CB8 != 0) { + if (mEventTimer != 0) { + mEventTimer--; + } + u8 alpha = (1.0f - (f32)mEventTimer / sHio.field_0x23) * 255.0f; + global->setField_0x4F(alpha); + mMapChangeAlpha = alpha; + if (field_0x8CB4 != 0) { + field_0x8CB4--; + } else { + mMarkers.setField_0x0702(1); + if (field_0x8CB8 != 0) { + field_0x8CB8--; + } + } + } else { + global->setField_0x4C(0); + mStateMgr.changeState(StateID_EventForestMapChange_Step3); + } +} void dLytMapMain_c::finalizeState_EventForestMapChange_Step2() {} -void dLytMapMain_c::initializeState_EventForestMapChange_Step3() {} -void dLytMapMain_c::executeState_EventForestMapChange_Step3() {} +void dLytMapMain_c::initializeState_EventForestMapChange_Step3() { + mEventTimer = sHio.field_0x25; +} +void dLytMapMain_c::executeState_EventForestMapChange_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mEventDone = true; + } +} void dLytMapMain_c::finalizeState_EventForestMapChange_Step3() {} void dLytMapMain_c::initializeState_EventSignalAdd_Step1() {} -void dLytMapMain_c::executeState_EventSignalAdd_Step1() {} +void dLytMapMain_c::executeState_EventSignalAdd_Step1() { + if (mDisplayedBeaconCount != getMaxBeaconCount()) { + mStateMgr.changeState(StateID_EventSignalAdd_Step2); + } +} void dLytMapMain_c::finalizeState_EventSignalAdd_Step1() {} -void dLytMapMain_c::initializeState_EventSignalAdd_Step2() {} -void dLytMapMain_c::executeState_EventSignalAdd_Step2() {} +void dLytMapMain_c::initializeState_EventSignalAdd_Step2() { + mEventTimer = sHio.field_0x29; +} +void dLytMapMain_c::executeState_EventSignalAdd_Step2() { + if (mDisplayedBeaconCount == getMaxBeaconCount()) { + mStateMgr.changeState(StateID_EventSignalAdd_Step3); + } else if (--mEventTimer == 0) { + mEventTimer = sHio.field_0x29; + mDisplayedBeaconCount++; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_BEACON_COUNT_UP); + } +} void dLytMapMain_c::finalizeState_EventSignalAdd_Step2() {} -void dLytMapMain_c::initializeState_EventSignalAdd_Step3() {} -void dLytMapMain_c::executeState_EventSignalAdd_Step3() {} +void dLytMapMain_c::initializeState_EventSignalAdd_Step3() { + mEventTimer = sHio.field_0x25; +} +void dLytMapMain_c::executeState_EventSignalAdd_Step3() { + if (mEventTimer != 0) { + mEventTimer--; + } else { + mStateMgr.changeState(StateID_Active); + } +} void dLytMapMain_c::finalizeState_EventSignalAdd_Step3() {} -void dLytMapMain_c::initializeState_EventGoddessCube_Step1() {} -void dLytMapMain_c::executeState_EventGoddessCube_Step1() {} -void dLytMapMain_c::finalizeState_EventGoddessCube_Step1() {} +bool dLytMapMain_c::fn_80141530() const { + return EventManager::isInEvent() && mMapEvent != MAP_EVENT_11; +} -void dLytMapMain_c::initializeState_EventGoddessCube_Step2() {} -void dLytMapMain_c::executeState_EventGoddessCube_Step2() {} +dAcTbox_c *dLytMapMain_c::findGoddessChestForStoryflag(s32 flag) const { + dAcTbox_c *ret = nullptr; + fBase_c *it = nullptr; + while ((it = fManager_c::searchBaseByGroupType(fBase_c::ACTOR, it)) != nullptr) { + if (it->mProfileName == fProfile::TBOX) { + dAcTbox_c *box = static_cast(it); + if (box->getVariant() == dAcTbox_c::GODDESS) { + u16 boxFlag = box->getParams2Lower(); + if (flag == boxFlag) { + ret = box; + break; + } + } + } + } + return ret; +} + +void dLytMapMain_c::initializeState_EventGoddessCube_Step1() { + mEventTimer = 30; +} +void dLytMapMain_c::executeState_EventGoddessCube_Step1() { + if (mEventTimer != 0) { + mEventTimer--; + } + if (mEventTimer == 0) { + mStateMgr.changeState(StateID_Active); + } +} +void dLytMapMain_c::finalizeState_EventGoddessCube_Step1() { + mEventTimer = 50; +} + +void dLytMapMain_c::initializeState_EventGoddessCube_Step2() { + dAcTbox_c *box = findGoddessChestForStoryflag(STORYFLAG_FIRST_GODDESS_CUBE); + mGoddessChestWorldPosition = box->getPosition(); + mNextMapMode = dLytMapGlobal_c::MAPMODE_ZOOM; + dLytMapGlobal_c *global = getGlobal(); + mMapScroll = global->getMapScroll(); + field_0x8D50 = global->getField_0x44(); + field_0x8D44 = global->getMapRotation(); + field_0x8D4C = fn_80142D90(mNextMapMode); + fn_80142D10(mNextMapMode, mNextMapUpDirection, field_0x8D46); + mVec3_c center = mGoddessChestWorldPosition; + mVec2_c result(0.0f, 0.0f); + global->unprojectFromMap(mMapScroll, result, field_0x8D44); + global->setMapRotationCenter(center); + + mVec3_c offset(field_0x8CD0.x * 0.5f, 0.0f, field_0x8CD0.z * 0.5f); + offset.rotY(-global->getField_0x56()); + if (offset.x < 0.0f) { + offset.x = -offset.x; + } + if (offset.z < 0.0f) { + offset.z = -offset.z; + } + + mVec3_c diff1(field_0x8CC4.x - offset.x, 0.0f, field_0x8CC4.z - offset.z); + mVec3_c diff2(field_0x8CC4.x + offset.x, 0.0f, field_0x8CC4.z + offset.z); + + if (mPlayerPos.x < diff1.x) { + mPlayerPos.x = diff1.x; + } + if (mPlayerPos.z < diff1.z) { + mPlayerPos.z = diff1.z; + } + if (mPlayerPos.x > diff2.x) { + mPlayerPos.x = diff2.x; + } + if (mPlayerPos.z > diff2.z) { + mPlayerPos.z = diff2.z; + } + const mVec3_c &c = global->getMapRotationCenter(); + fn_80143060(mPlayerPos, center, c, field_0x8D46); + mVec3_c tmp = mMapScroll; + fn_80143060(mMapScroll, tmp, c, field_0x8D44); + fn_80143060(field_0x8D18, center, global->getPlayerPos(), field_0x8D46); + + global->setMapScroll(mMapScroll); + const mVec2_c &csPos = dCsGame_c::GetInstance()->getCursorIf()->getCursorPos(); + global->unprojectFromMap(field_0x8CF4, csPos); + fn_8013FB70(field_0x8CF4, field_0x8D50 / field_0x8D4C); + mpScaleFramePane->SetVisible(true); + field_0x8C70 = 0; + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + global->setZoomFrame(1.0f); + global->setField_0x58(field_0x8D50 / field_0x8D4C); + } else { + global->setZoomFrame(0.0f); + global->setField_0x58(1.0f); + } + mAnmGroups[MAP_MAIN_ANIM_ROTATE].bind(false); + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } + + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mMarkers.setIslandNamesOn(false); + } + + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + mMarkers.setIslandNamesOn(mShowIslandNames); + } + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ZOOMIN_TO_DETAIL); +} +void dLytMapMain_c::executeState_EventGoddessCube_Step2() { + dLytMapGlobal_c *global = getGlobal(); + f32 f1 = (f32)field_0x8C70 / sHio.field_0x1C; + f32 factor = cLib::easeInOut(f1, 2.0f); + + f32 f2, f3; + if (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE) { + f32 ratio = field_0x8D50 / field_0x8D4C; + f1 = 1.0f - f1; + f2 = ratio + (1.0f - ratio) * factor; + f3 = 1.0f - factor; + } else { + f32 ratio = field_0x8D4C / field_0x8D50; + f2 = ratio + (1.0f - ratio) * (1.0f - factor); + f3 = factor; + } + global->setZoomFrame(f1); + global->setField_0x58(f2); + + // unused + mVec3_c tmp = mMapScroll; + // unused + mVec3_c tmp2 = mPlayerPos; + + // Lerps + f32 f4 = field_0x8D50 + factor * (field_0x8D4C - field_0x8D50); + global->setField_0x44(f4); + + // TODO stack and reg swaps + global->setMapRotation(factor * mAng(field_0x8D46 - field_0x8D44) + field_0x8D44); + + f32 length = mAnmGroups[MAP_MAIN_ANIM_ROTATE].getLastFrame(); + + // unused - the f1 store is here so that the fcmpu isn't optimized away + if (field_0x8C7C - field_0x8C80) { + f1 = 0.0f; + } + + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(length - f3 * length); + + global->setMapScroll(mPlayerPos + (mMapScroll - mPlayerPos) * (1.0f / (f4 / field_0x8D50)) * (1.0f - factor)); + + fn_8013FB70(field_0x8CF4, f4 / field_0x8D4C); + + mpScaleFramePane->SetVisible(true); + if (field_0x8C70 >= sHio.field_0x1C) { + mpScaleFramePane->SetVisible(false); + if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setToEnd(); + } else { + mAnmGroups[MAP_MAIN_ANIM_ROTATE].setFrame(0.0f); + } + mLyt.calc(); + mAnmGroups[MAP_MAIN_ANIM_ROTATE].unbind(); + mMapUpDirection = mNextMapUpDirection; + global->setMapRotation(field_0x8D46); + global->setField_0x44(field_0x8D4C); + global->setMapScroll(field_0x8D18); + if (dAcPy_c::LINK != nullptr) { + global->setMapRotationCenter(global->getPlayerPos()); + } + mCurrentMapMode = mNextMapMode; + mStateMgr.changeState(StateID_EventGoddessCube_Step3); + } else { + field_0x8C70++; + } +} void dLytMapMain_c::finalizeState_EventGoddessCube_Step2() {} void dLytMapMain_c::initializeState_EventGoddessCube_Step3() {} -void dLytMapMain_c::executeState_EventGoddessCube_Step3() {} +void dLytMapMain_c::executeState_EventGoddessCube_Step3() { + mStateMgr.changeState(StateID_Active); +} void dLytMapMain_c::finalizeState_EventGoddessCube_Step3() {} -void dLytMapMain_c::initializeState_EventSaveObjMsgWindow() {} -void dLytMapMain_c::executeState_EventSaveObjMsgWindow() {} +bool dLytMapMain_c::checkStoryflag(s32 flag) const { + return StoryflagManager::sInstance->getFlag(flag); +} + +void dLytMapMain_c::initializeState_EventSaveObjMsgWindow() { + if (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." + mFlowMgr.triggerEntryPoint(4, 18, 0, 0); + } else { + // "It is possible to descend to a specific..." / "Point to your preferred descent area..." + mFlowMgr.triggerEntryPoint(4, 19, 0, 0); + } +} +void dLytMapMain_c::executeState_EventSaveObjMsgWindow() { + if (mFlowMgr.checkFinished()) { + mStateMgr.changeState(StateID_EventSaveObjSelect); + } +} void dLytMapMain_c::finalizeState_EventSaveObjMsgWindow() {} +enum dLytMapSaveObjFlagKind { + SAVE_OBJ_FLAG_KIND_SCENEFLAG = 0, + SAVE_OBJ_FLAG_KIND_STORYFLAG = 1, +}; + +struct dLytMapSaveObjFlagDefinition { + /* 0x00 */ dLytMapSaveObjFlagKind flagType; + // I wanted designated initializers but MWCC doesn't have them... + /* 0x04 */ union { + struct { + /* 0x04 */ u16 flagArea; + /* 0x06 */ u16 sceneFlag; + }; + struct { + /* 0x04 */ s16 storyFlag; + /* 0x06 */ u16 _padding; + }; + }; +}; + +static const dLytMapSaveObjFlagDefinition sSaveObjFlagsFaron[] = { + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 10, 31}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_800}, + {SAVE_OBJ_FLAG_KIND_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}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 2, 33}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_FARON_DISCOVERED}, +}; + +static const dLytMapSaveObjFlagDefinition sSaveObjFlagsEldin[] = { + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_804}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_805}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_806}, + {SAVE_OBJ_FLAG_KIND_STORYFLAG, STORYFLAG_807}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 5, 101}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 15, 114}, +}; + +static const dLytMapSaveObjFlagDefinition sSaveObjFlagsLanayru[] = { + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 68}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 66}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 51}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 67}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 2}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 77}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 7, 78}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 10}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 28}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 85}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 8, 84}, + {SAVE_OBJ_FLAG_KIND_SCENEFLAG, 9, 12}, +}; + +void dLytMapMain_c::displaySaveObjs() { + for (int i = 0; i < mNumSaveObjs; i++) { + mSaveObjs[i].init(); + } + + s32 numFlags = ARRAY_LENGTH(sSaveObjFlagsFaron); + nw4r::lyt::Bounding **pBoundings = mpSaveObjBoundingsFaron; + const dLytMapSaveObjFlagDefinition *flagSet = sSaveObjFlagsFaron; + switch (mMapEventArg1) { + case SURFACE_PROVINCE_ELDIN: { + pBoundings = mpSaveObjBoundingsEldin; + flagSet = sSaveObjFlagsEldin; + numFlags = ARRAY_LENGTH(sSaveObjFlagsEldin); + break; + } + case SURFACE_PROVINCE_LANAYRU: { + pBoundings = mpSaveObjBoundingsLanayru; + flagSet = sSaveObjFlagsLanayru; + numFlags = ARRAY_LENGTH(sSaveObjFlagsLanayru); + break; + } + } + + bool isInFaronSothMode = false; + bool isInFaronFloodedMode = false; + + if (mMapEventArg1 == SURFACE_PROVINCE_FARON) { + if (checkStoryflag(STORYFLAG_LEVIAS_FIGHT_DEFEATED) && + !checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED)) { + isInFaronSothMode = true; + } else if (checkStoryflag(STORYFLAG_FLOODED_FARON_WOODS_DISCOVERED) && + !checkStoryflag(STORYFLAG_WATER_DRAGON_SOTH_PART)) { + isInFaronFloodedMode = true; + } + } + + for (int i = 0; i < numFlags; i++) { + bool visible = false; + if (isInFaronSothMode) { + if (i == 0 || i == 9) { + visible = true; + } + } else if (isInFaronFloodedMode) { + if (i == 0 || i == 4 || i == 9) { + visible = true; + } + } else if (flagSet[i].flagType == SAVE_OBJ_FLAG_KIND_SCENEFLAG) { + visible = SceneflagManager::sInstance->checkSceneflagGlobal(flagSet[i].flagArea, flagSet[i].sceneFlag); + } else if (flagSet[i].flagType == SAVE_OBJ_FLAG_KIND_STORYFLAG) { + visible = checkStoryflag(flagSet[i].storyFlag); + } + // TODO - SetVisible clrlwi + pBoundings[i]->SetVisible(visible); + } +} + void dLytMapMain_c::initializeState_EventSaveObjSelect() {} -void dLytMapMain_c::executeState_EventSaveObjSelect() {} +void dLytMapMain_c::executeState_EventSaveObjSelect() { + mSavePopup.setCurrentStatue(-1); + s32 currentSelected = getSelectedSaveObjIdx(); + + bool anyDecide = false; + for (int i = 0; i < mNumSaveObjs; i++) { + if (mSaveObjs[i].mStateMgr.isState(dLytMapSaveObj_c::StateID_Decide)) { + anyDecide = true; + } + } + + for (int i = 0; i < mNumSaveObjs; i++) { + mSaveObjs[i].mSelectRequest = false; + if (currentSelected == i && !anyDecide) { + mSaveObjs[i].mSelectRequest = true; + if (!mSaveObjs[i].mDecideRequest) { + mSavePopup.setCurrentStatue(i); + } + } + mSaveObjs[i].execute(); + bool select = false; + if (mSaveObjs[i].mSelectRequest) { + if (*mSaveObjs[i].mStateMgr.getStateID() == dLytMapSaveObj_c::StateID_Select) { + select = true; + } + } + + if (select && dPad::getDownTrigA()) { + mSaveObjs[i].mDecideRequest = true; + mSavePopup.setCurrentStatue(-1); + mSavePopup.hide(i); + } + } + + field_0x8DC0 = currentSelected; + + bool found = false; + s32 statueIdx = 0; + for (int i = 0; i < mNumSaveObjs; i++) { + if (mSaveObjs[i].mDecideFinished) { + found = true; + statueIdx = i; + break; + } + } + + if (found) { + const dMapSaveObjDefinition *def = getSaveObjDefinition(mMapEventArg1, statueIdx); + mSaveCaption.setLabel(def->statueLabel); + mSaveCaption.setType(def->type); + mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_In); + mStateMgr.changeState(StateID_EventSaveObjConfirmMsgWindow); + } else { + mSavePopup.execute(); + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mHitChecks); i++) { + mHitChecks[i].resetCachedHitboxes(); + mHitChecks[i].execute(); + } +} void dLytMapMain_c::finalizeState_EventSaveObjSelect() {} -void dLytMapMain_c::initializeState_EventSaveObjConfirmMsgWindow() {} -void dLytMapMain_c::executeState_EventSaveObjConfirmMsgWindow() {} +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() { + 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 < mNumSaveObjs; i++) { + if (mSaveObjs[i].mDecideFinished) { + statueIdx = i; + break; + } + } + + 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 + ); + dScGame_c::GetInstance()->setTargetingScreenPrio(0x8B); + dLytMap_c::GetInstance()->fadeOut(); + mStateMgr.changeState(StateID_EventSaveObjDecide); + mSaveCaption.mStateMgr.changeState(dLytMapSaveCaption_c::StateID_Out); + } else { + // cancel + for (int i = 0; i < mNumSaveObjs; 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() {} void dLytMapMain_c::executeState_EventSaveObjDecide() {} void dLytMapMain_c::finalizeState_EventSaveObjDecide() {} + +void dLytMapMain_c::checkCursorPointedAtMap() { + const mVec2_c *pos2d; + dLytMapGlobal_c *global = getGlobal(); + bool pointerOnMap = true; + bool canPlaceBeacon = true; + + pos2d = &dCsGame_c::GetInstance()->getCursorIf()->getCursorPos(); + mVec3_c pos3d(0.0f, 0.0f, 0.0f); + global->unprojectFromMap(pos3d, *pos2d, global->getMapRotation()); + + f32 tmp = global->getField_0x28().x * 368.0f; + f32 nTmp = -tmp; + if (pos2d->x > tmp || pos2d->x < nTmp || pos2d->y > 209.0f || pos2d->y < -193.0f) { + // Pointer off screen? + pointerOnMap = false; + canPlaceBeacon = false; + } + + if (pointerOnMap && (pos3d.x < field_0x8930.x || pos3d.x > field_0x893C.x || pos3d.z < field_0x8930.z || + pos3d.z > field_0x893C.z)) { + // Pointer too close to the edge? + canPlaceBeacon = false; + } + + if (pointerOnMap) { + for (int i = 0; i < MAP_MAIN_NUM_BOUNDINGS_NORMAL; i++) { + if (pos3d.x >= mBoundingWorldBounds[i].min.x && pos3d.x <= mBoundingWorldBounds[i].max.x && + pos3d.z >= mBoundingWorldBounds[i].min.z && pos3d.z <= mBoundingWorldBounds[i].max.z) { + // Cannot place beacon when hovering over UI element (remocon, ...) + canPlaceBeacon = false; + break; + } + } + } + + mPointerOnMap = pointerOnMap; + mPointerCanPlaceBeacon = canPlaceBeacon; +} + +dLytMap_c *dLytMap_c::sInstance; + +bool dLytMap_c::build() { + d2d::setLytAllocator(); + void *data = LayoutArcManager::GetInstance()->getLoadedData("Map2D"); + mResAcc.attach(data, ""); + mMapMain.build(); + m2d::setLytAllocator(); + mMapMain.setPriority(0x86); + mMapFader.setPriority(0x8A); + return true; +} + +bool dLytMap_c::remove() { + d2d::setLytAllocator(); + mMapMain.remove(); + mResAcc.detach(); + dCsGame_c::GetInstance()->setPriorityDraw(0x88); + dScGame_c::GetInstance()->setTargetingScreenPrio(0x85); + return true; +} + +bool dLytMap_c::execute() { + mMapMain.execute(); + if (mMapFader.isVisible()) { + mMapFader.calc(); + } + return true; +} + +bool dLytMap_c::draw() { + mMapMain.addToDrawList(); + if (mMapFader.isVisible()) { + mMapFader.addToDrawList(); + } + return true; +} + +void dLytMap_c::fadeOut() { + mMapFader.setVisible(true); + mMapFader.fadeOut(); +} diff --git a/src/d/lyt/d_lyt_map_capture.cpp b/src/d/lyt/d_lyt_map_capture.cpp new file mode 100644 index 00000000..46686efc --- /dev/null +++ b/src/d/lyt/d_lyt_map_capture.cpp @@ -0,0 +1,32 @@ +#include "d/lyt/d_lyt_map_capture.h" +#include "common.h" +#include "d/d_stage.h" + +STATE_DEFINE(dLytMapCapture_c, RenderingWait); +STATE_DEFINE(dLytMapCapture_c, RenderingWaitStep2); + +void dLytMapCapture_c::initializeState_RenderingWait() {} +void dLytMapCapture_c::executeState_RenderingWait() { + if (mRenderRequest && !mIsBusyRendering) { + fn_8012D6F0(); + mRenderRequest = false; + mIsBusyRendering = true; + mStateMgr.changeState(StateID_RenderingWaitStep2); + } +} +void dLytMapCapture_c::finalizeState_RenderingWait() {} + +void dLytMapCapture_c::initializeState_RenderingWaitStep2() {} +void dLytMapCapture_c::executeState_RenderingWaitStep2() { + if (mIsBusyRendering && dStage_c::GetInstance() != nullptr && !dStage_c::GetInstance()->getMapRelated()->getField_0x1EE()) { + mIsBusyRendering = false; + if (mRenderRequest) { + fn_8012D6F0(); + mRenderRequest = false; + mIsBusyRendering = true; + } else { + mStateMgr.changeState(StateID_RenderingWait); + } + } +} +void dLytMapCapture_c::finalizeState_RenderingWaitStep2() {} diff --git a/src/d/lyt/d_lyt_map_global.cpp b/src/d/lyt/d_lyt_map_global.cpp new file mode 100644 index 00000000..405f9d15 --- /dev/null +++ b/src/d/lyt/d_lyt_map_global.cpp @@ -0,0 +1,87 @@ +#include "d/lyt/d_lyt_map_global.h" + +#include "m/m_vec.h" + +dLytMapGlobal_c *dLytMapGlobal_c::sInstance; + +dLytMapGlobal_c::dLytMapGlobal_c() + : mMapScroll(0.0f, 0.0f, 0.0f), + field_0x0C(0.0f, 0.0f), + mMapRotationCenter(0.0f, 0.0f, 0.0f), + field_0x20(0.0f, 0.0f), + field_0x28(0.0f, 0.0f), + mMapRotation(0), + field_0x40(1.0f), + field_0x44(1.0f), + mFloor(0), + field_0x4C(0), + field_0x4D(0), + mAlpha(0), + field_0x4F(0), + mMapEvent(0) { + sInstance = this; +} + +void dLytMapGlobal_c::projectOntoMap( + mVec2_c &result, const mVec3_c &position, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter, const mAng &rot, + f32 f1, f32 f2 +) const { + // Initializing like this fixes regswaps, even if it's not needed... + mVec3_c work(0.0f, 0.0f, 0.0f); + + work.x = position.x - mapRotationCenter.x; + work.z = position.z - mapRotationCenter.z; + work.y = 0.0f; + work.rotY(-rot); + + work.x += mapRotationCenter.x - mapScroll.x; + work.z += mapRotationCenter.z - mapScroll.z; + + work.x *= f2 * f1; + work.z *= f2 * f1; + work.x *= field_0x28.x; + + result.x = work.x; + result.y = -work.z; +} + +void dLytMapGlobal_c::projectOntoMap(mVec2_c &result, const mVec3_c &position) const { + projectOntoMap(result, position, mMapScroll, mMapRotationCenter, mMapRotation, field_0x44, field_0x40); +} + +void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position) const { + unprojectFromMap( + result, position, field_0x20, mMapScroll, mMapRotationCenter, mMapRotation, field_0x44, field_0x40 + ); +} + +void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const { + unprojectFromMap(result, position, field_0x20, mMapScroll, mMapRotationCenter, rot, field_0x44, field_0x40); +} + +void dLytMapGlobal_c::unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mVec3_c &v2, const mAng &rot) + const { + unprojectFromMap(result, position, field_0x20, v2, mMapRotationCenter, rot, field_0x44, field_0x40); +} + +void dLytMapGlobal_c::unprojectFromMap( + mVec3_c &result, const mVec2_c &position, const mVec2_c &v1, const mVec3_c &mapScroll, const mVec3_c &mapRotationCenter, + const mAng &rot, f32 f1, f32 f2 +) const { + mVec3_c work(0.0f, 0.0f, 0.0f); + + f1 *= f2; + f32 tmp = 1.0f / f1; + mVec2_c diff = position - v1; + + work.x = diff.x * tmp * (1.0f / field_0x28.x); + work.z = -diff.y * tmp; + + work = work + mapScroll; + + work = work - mapRotationCenter; + work.rotY(rot); + work += mapRotationCenter; + + result = work; +} diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp new file mode 100644 index 00000000..07b48e47 --- /dev/null +++ b/src/d/lyt/d_lyt_map_markers.cpp @@ -0,0 +1,1919 @@ +#include "d/lyt/d_lyt_map_markers.h" + +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_save.h" +#include "d/a/obj/d_a_obj_tbox.h" +#include "d/d_cs_base.h" +#include "d/d_cursor_hit_check.h" +#include "d/d_gfx.h" +#include "d/d_message.h" +#include "d/d_player.h" +#include "d/d_player_act.h" +#include "d/d_sc_game.h" +#include "d/d_stage.h" +#include "d/d_stage_mgr.h" +#include "d/flag/dungeonflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_map.h" +#include "d/lyt/d_lyt_map_global.h" +#include "d/lyt/d_window.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "m/m_vec.h" +#include "nw4r/lyt/lyt_bounding.h" +#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_types.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" + +inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { + return mVec3_c(v.x, v.y, 0.0f); +} + +static bool checkHasMap() { + return DungeonflagManager::sInstance->getCounterOrFlag(2, 8); +} + +static bool projectOntoMap(const mVec3_c &position, mVec2_c &result) { + dLytMapGlobal_c::GetInstance()->projectOntoMap(result, position); + return true; +} + +static const d2d::LytBrlanMapping brlanMapMapPopup[] = { + {"mapPopup_00_scale.brlan", "G_scale_00"}, + {"mapPopup_00_inOut.brlan", "G_inOut_00"}, +}; + +#define MAP_POPUP_ANIM_SCALE 0 +#define MAP_POPUP_ANIM_INOUT 1 +#define MAP_POPUP_NUM_ANIMS 2 + +static const char *sMapPopupPaneNames[] = { + "N_all_00", + "N_inOut_00", +}; + +#define MAP_POPUP_PANE_ALL 0 +#define MAP_POPUP_PANE_IN_OUT 1 +#define MAP_POPUP_NUM_PANES 2 + +static const char *sMapPopupTextboxNames[] = { + "T_popup_00", + "T_popupS_00", +}; + +#define MAP_POPUP_NUM_TEXTBOXES 2 + +static const char *sMapPopupSizeBoxNames[] = {"W_bgP_00"}; + +bool dLytMapPopup_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPopup_00.brlyt", nullptr); + + for (int i = 0; i < MAP_POPUP_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapMapPopup[i].mFile, resAcc, mLyt.getLayout(), brlanMapMapPopup[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + mAnm[i].setAnimEnable(false); + } + + for (int i = 0; i < MAP_POPUP_NUM_PANES; i++) { + mpPanes[i] = mLyt.findPane(sMapPopupPaneNames[i]); + } + + for (int i = 0; i < MAP_POPUP_NUM_TEXTBOXES; i++) { + mpTextboxes[i] = mLyt.getTextBox(sMapPopupTextboxNames[i]); + } + + for (int i = 0; i < 1; i++) { + mpWindow[i] = mLyt.getWindow(sMapPopupSizeBoxNames[i]); + mpSizeBox[i] = mLyt.getSizeBoxInWindow(sMapPopupSizeBoxNames[i]); + } + + realizeText(); + setInitialState(); + + mMaxScale = mAnm[MAP_POPUP_ANIM_SCALE].getLastFrame(); + + return true; +} + +bool dLytMapPopup_c::remove() { + for (int i = 0; i < MAP_POPUP_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + return true; +} + +bool dLytMapPopup_c::execute() { + checkMapMode(); + updateScale(); + if (mAnm[MAP_POPUP_ANIM_INOUT].isEnabled()) { + if (mAnm[MAP_POPUP_ANIM_INOUT].isStop2()) { + if (mAnm[MAP_POPUP_ANIM_INOUT].isPlayingForwardsOnce()) { + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(false); + } + if (mAnm[MAP_POPUP_ANIM_INOUT].isPlayingBackwardsOnce()) { + field_0x178 = 0; + field_0x180 = 0x30; + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(false); + } + } + } + + for (int i = 0; i < MAP_POPUP_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + return true; +} + +void dLytMapPopup_c::draw() { + u8 alpha = dLytMapGlobal_c::GetInstance()->getAlpha(); + mpPanes[MAP_POPUP_PANE_ALL]->SetAlpha(alpha); + mpPanes[MAP_POPUP_PANE_ALL]->SetTranslate(vec2ToVec3XY(mPosition)); + mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); + mpPanes[MAP_POPUP_PANE_ALL]->CalculateMtx(mLyt.getDrawInfo()); + mpPanes[MAP_POPUP_PANE_ALL]->Draw(mLyt.getDrawInfo()); +} + +void dLytMapPopup_c::setLabel(const char *label) { + mLabel = label; +} + +void dLytMapPopup_c::realizeText() { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mLabel, true, nullptr, 0); + if (text != nullptr) { + for (int i = 0; i < MAP_POPUP_NUM_TEXTBOXES; i++) { + mpTextboxes[i]->setTextWithGlobalTextProcessor(text); + } + mpWindow[0]->UpdateSize(mpSizeBox[0], 32.0f); + } +} + +void dLytMapPopup_c::setInout(f32 value) { + if (0.0f <= value && value <= mAnm[MAP_POPUP_ANIM_INOUT].getLastFrame()) { + mAnm[MAP_POPUP_ANIM_INOUT].setFrame(value); + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(true); + mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(false); + } +} + +f32 dLytMapPopup_c::getTextRenderWidth() const { + f32 lineWidth = mpTextboxes[0]->getLineDrawWidth(); + return lineWidth * mpPanes[MAP_POPUP_PANE_ALL]->GetScale().x; +} + +void dLytMapPopup_c::setInitialState() { + mAnm[MAP_POPUP_ANIM_SCALE].setRate(1.0f); + mAnm[MAP_POPUP_ANIM_SCALE].setForwardOnce(); + mAnm[MAP_POPUP_ANIM_SCALE].setToStart(); + mAnm[MAP_POPUP_ANIM_SCALE].setAnimEnable(true); + + mAnm[MAP_POPUP_ANIM_INOUT].setRate(1.0f); + mAnm[MAP_POPUP_ANIM_INOUT].setBackwardsOnce(); + mAnm[MAP_POPUP_ANIM_INOUT].setToEnd2(); + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(true); + + mLyt.calc(); + + mAnm[MAP_POPUP_ANIM_INOUT].setAnimEnable(false); + mAnm[MAP_POPUP_ANIM_SCALE].setAnimEnable(false); +} + +void dLytMapPopup_c::updateScale() { + f32 frame = 0.0f; + f32 zoomFrame = dLytMapGlobal_c::GetInstance()->getZoomFrame(); + + switch (mModeCheckResult) { + case MODE_TRANSITION_TO_ZOOM: frame = mMaxScale * zoomFrame; break; + case MODE_TRANSITION_TO_STAGE: frame = mMaxScale * zoomFrame; break; + case MODE_STABLE_STAGE: frame = 0.0f; break; + case MODE_STABLE_ZOOM: frame = mMaxScale; break; + } + + if (mMaxScale < frame) { + frame = mMaxScale; + } else if (frame < 0.0f) { + frame = 0.0f; + } + + mAnm[MAP_POPUP_ANIM_SCALE].setAnimEnable(true); + mAnm[MAP_POPUP_ANIM_SCALE].setFrame(frame); + mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); + mAnm[MAP_POPUP_ANIM_SCALE].setAnimEnable(false); +} + +void dLytMapPopup_c::checkMapMode() { + s32 current = dLytMapGlobal_c::GetInstance()->getCurrentMapMode(); + s32 next = dLytMapGlobal_c::GetInstance()->getNextMapMode(); + + if (current == dLytMapGlobal_c::MAPMODE_PROVINCE && next == dLytMapGlobal_c::MAPMODE_ZOOM) { + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_ZOOM && next == dLytMapGlobal_c::MAPMODE_PROVINCE) { + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_STAGE && next == dLytMapGlobal_c::MAPMODE_ZOOM) { + mModeCheckResult = MODE_TRANSITION_TO_ZOOM; + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_ZOOM && next == dLytMapGlobal_c::MAPMODE_STAGE) { + mModeCheckResult = MODE_TRANSITION_TO_STAGE; + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_PROVINCE) { + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_STAGE) { + mModeCheckResult = MODE_STABLE_STAGE; + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_ZOOM) { + mModeCheckResult = MODE_STABLE_ZOOM; + return; + } +} + +static const d2d::LytBrlanMapping brlanMapMapPlace[] = { + { "mapPlace_00_in.brlan", "G_inOut_00"}, + {"mapPlace_00_scale.brlan", "G_scale_00"}, + {"mapPlace_00_color.brlan", "G_color_00"}, +}; + +#define MAP_PLACE_ANIM_IN 0 +#define MAP_PLACE_ANIM_SCALE 1 +#define MAP_PLACE_ANIM_COLOR 2 + +#define MAP_PLACE_NUM_ANIMS 3 + +static const char *sMapPlacePaneNames[] = { + "N_all_00", + "N_all_01", +}; + +#define MAP_PLACE_PANE_ALL_00 0 +#define MAP_PLACE_PANE_ALL_01 1 +#define MAP_PLACE_NUM_PANES 2 + +static const char *sMapPlaceBgPaneNames[] = { + "P_bg_00", + "P_bg_01", + "P_bg_02", +}; + +#define MAP_PLACE_PANE_BG_00 0 +#define MAP_PLACE_PANE_BG_01 1 +#define MAP_PLACE_PANE_BG_02 2 +#define MAP_PLACE_NUM_BG_PANES 3 + +static const char *sMapPlaceTextboxNames[] = { + "T_area_00", + "T_areaS_00", + "T_areaS_01", +}; + +#define MAP_PLACE_NUM_TEXTBOXES 3 + +static const char *sMapPlaceSizeBoxNames[] = {"W_bgP_00"}; + +bool dLytMapPlace_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("mapPlace_00.brlyt", nullptr); + + for (int i = 0; i < MAP_PLACE_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapMapPlace[i].mFile, resAcc, mLyt.getLayout(), brlanMapMapPlace[i].mName); + mAnm[i].bind(false); + mAnm[i].setRate(1.0f); + mAnm[i].setAnimEnable(false); + } + + for (int i = 0; i < MAP_PLACE_NUM_PANES; i++) { + mpPanes[i] = mLyt.findPane(sMapPlacePaneNames[i]); + } + + for (int i = 0; i < MAP_PLACE_NUM_BG_PANES; i++) { + mpBgPanes[i] = mLyt.findPane(sMapPlaceBgPaneNames[i]); + } + + for (int i = 0; i < MAP_PLACE_NUM_TEXTBOXES; i++) { + mpTextboxes[i] = mLyt.getTextBox(sMapPlaceTextboxNames[i]); + } + + for (int i = 0; i < 1; i++) { + mpWindow[i] = mLyt.getWindow(sMapPlaceSizeBoxNames[i]); + mpSizeBox[i] = mLyt.getSizeBoxInWindow(sMapPlaceSizeBoxNames[i]); + } + + realizeText(); + + f32 windowWidth = mpWindow[0]->GetSize().width; + f32 w1 = mpBgPanes[0]->GetSize().width; + f32 w2 = mpBgPanes[1]->GetSize().width; + f32 w3 = mpBgPanes[2]->GetSize().width; + + f32 lineWidth = mpTextboxes[0]->GetLineWidth(nullptr); + + f32 bgWidth = (w1 + w2 + w3); + field_0x1C4 = windowWidth - lineWidth; + field_0x1C0 = windowWidth - bgWidth; + + realizeTextSize(); + realizeBgSize(); + setInitialState(); + + mMaxScale = mAnm[MAP_PLACE_ANIM_SCALE].getLastFrame(); + + return true; +} + +bool dLytMapPlace_c::remove() { + for (int i = 0; i < MAP_PLACE_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + return true; +} + +bool dLytMapPlace_c::execute() { + if (mAnm[MAP_PLACE_ANIM_IN].isEnabled() && mAnm[MAP_PLACE_ANIM_IN].isStop2()) { + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(false); + } + for (int i = 0; i < MAP_PLACE_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + mLyt.calc(); + return true; +} + +void dLytMapPlace_c::draw() { + mpPanes[MAP_PLACE_PANE_ALL_00]->SetAlpha(dLytMapGlobal_c::GetInstance()->getAlpha()); + mpPanes[MAP_PLACE_PANE_ALL_00]->SetTranslate(vec2ToVec3XY(field_0x1C8)); + mpPanes[MAP_PLACE_PANE_ALL_00]->Animate(0); + mpPanes[MAP_PLACE_PANE_ALL_00]->CalculateMtx(mLyt.getDrawInfo()); + mpPanes[MAP_PLACE_PANE_ALL_00]->Draw(mLyt.getDrawInfo()); +} + +void dLytMapPlace_c::setLabel(const char *label) { + mLabel = label; +} + +void dLytMapPlace_c::realize() { + realizeText(); + realizeTextSize(); + realizeBgSize(); +} + +void dLytMapPlace_c::setInout(f32 value) { + if (/* 0.0f <= value && */ value <= mAnm[MAP_PLACE_ANIM_IN].getLastFrame()) { + mAnm[MAP_PLACE_ANIM_IN].setFrame(value); + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(true); + mpPanes[MAP_POPUP_PANE_ALL]->Animate(0); + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(false); + } +} + +void dLytMapPlace_c::setColor(u32 value) { + f32 frame = value; + mAnm[MAP_PLACE_ANIM_COLOR].setAnimEnable(true); + mAnm[MAP_PLACE_ANIM_COLOR].setFrame(frame); + mpPanes[MAP_PLACE_PANE_ALL_00]->Animate(0); + mAnm[MAP_PLACE_ANIM_COLOR].setAnimEnable(false); +} + +void dLytMapPlace_c::setInitialState() { + mAnm[MAP_PLACE_ANIM_COLOR].setRate(1.0f); + mAnm[MAP_PLACE_ANIM_COLOR].setForwardOnce(); + mAnm[MAP_PLACE_ANIM_COLOR].setToStart(); + mAnm[MAP_PLACE_ANIM_COLOR].setAnimEnable(true); + + mAnm[MAP_PLACE_ANIM_SCALE].setRate(1.0f); + mAnm[MAP_PLACE_ANIM_SCALE].setForwardOnce(); + mAnm[MAP_PLACE_ANIM_SCALE].setToStart(); + mAnm[MAP_PLACE_ANIM_SCALE].setAnimEnable(true); + + mAnm[MAP_PLACE_ANIM_IN].setRate(1.0f); + mAnm[MAP_PLACE_ANIM_IN].setForwardOnce(); + mAnm[MAP_PLACE_ANIM_IN].setToEnd2(); + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(true); + + mLyt.calc(); + + mAnm[MAP_PLACE_ANIM_IN].setAnimEnable(false); + mAnm[MAP_PLACE_ANIM_SCALE].setAnimEnable(false); + mAnm[MAP_PLACE_ANIM_COLOR].setAnimEnable(false); +} + +void dLytMapPlace_c::updateScale() { + // @bug mModeCheckResult is never set + f32 frame = 0.0f; + f32 zoomFrame = dLytMapGlobal_c::GetInstance()->getZoomFrame(); + + switch (mModeCheckResult) { + case MODE_TRANSITION_TO_ZOOM: frame = mMaxScale * zoomFrame; break; + case MODE_TRANSITION_TO_STAGE: frame = mMaxScale * zoomFrame; break; + case MODE_STABLE_STAGE: frame = 0.0f; break; + case MODE_STABLE_ZOOM: frame = mMaxScale; break; + } + + if (mMaxScale < frame) { + frame = mMaxScale; + } else if (frame < 0.0f) { + frame = 0.0f; + } + + mAnm[MAP_PLACE_ANIM_SCALE].setAnimEnable(true); + mAnm[MAP_PLACE_ANIM_SCALE].setFrame(frame); + mpPanes[MAP_PLACE_PANE_ALL_01]->Animate(0); + mAnm[MAP_PLACE_ANIM_SCALE].setAnimEnable(false); +} + +void dLytMapPlace_c::realizeText() { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mLabel, true, nullptr, 0); + if (text != nullptr) { + for (int i = 0; i < MAP_PLACE_NUM_TEXTBOXES; i++) { + mpTextboxes[i]->setTextWithGlobalTextProcessor(text); + } + } +} + +void dLytMapPlace_c::realizeTextSize() { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mLabel, true, nullptr, 0); + if (text != nullptr) { + mpWindow[0]->UpdateSize(mpSizeBox[0], 0.0f); + nw4r::lyt::Size size(mpWindow[0]->GetSize()); + size.width += field_0x1C4; + mpWindow[0]->SetSize(size); + } +} + +static const d2d::LytBrlanMapping brlanMapMapIcon01[] = { + { "mapIcon_01_player2pattern.brlan", "G_2pattern_00"}, + { "mapIcon_01_playerLoop.brlan", "G_playerLoop_00"}, + { "mapIcon_01_scale.brlan", "G_scale_00"}, + { "mapIcon_01_nusiAnim.brlan", "G_nusiLoop_00"}, + { "mapIcon_01_areaLoop.brlan", "G_areaLoop_00"}, + { "mapIcon_01_areaColor.brlan", "G_areaColor_00"}, + { "mapIcon_01_cloudLoop.brlan", "G_cloudBLoop_00"}, + { "mapIcon_01_cloudAlpha.brlan", "G_cloudBAlpha_00"}, + { "mapIcon_01_loop.brlan", "G_loop_00"}, + { "mapIcon_01_goddessOnOff.brlan", "G_goddess_00"}, + {"mapIcon_01_saveObjectColor.brlan", "G_saveColor_00"}, + { "mapIcon_01_iconOut.brlan", "G_tresInOut_00"}, + { "mapIcon_01_iconOut.brlan", "G_markInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_tresInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_markInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_doorInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_saveInOut_00"}, + { "mapIcon_01_iconIn.brlan", "G_forceInOut_00"}, +}; + +#define MAP_ICON_01_ANIM_PLAYER_2_PATTERN 0 +#define MAP_ICON_01_ANIM_PLAYER_LOOP 1 +#define MAP_ICON_01_ANIM_SCALE 2 +#define MAP_ICON_01_ANIM_NUSI_ANIM 3 +#define MAP_ICON_01_ANIM_AREA_LOOP 4 +#define MAP_ICON_01_ANIM_AREA_COLOR 5 +#define MAP_ICON_01_ANIM_CLOUD_LOOP 6 +#define MAP_ICON_01_ANIM_CLOUD_ALPHA 7 +#define MAP_ICON_01_ANIM_LOOP 8 +#define MAP_ICON_01_ANIM_GODDESS_ON_OFF 9 +#define MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR 10 +#define MAP_ICON_01_ANIM_TRES_OUT 11 +#define MAP_ICON_01_ANIM_MARK_OUT 12 +#define MAP_ICON_01_ANIM_TRES_IN 13 +#define MAP_ICON_01_ANIM_MARK_IN 14 +#define MAP_ICON_01_ANIM_DOOR_IN 15 +#define MAP_ICON_01_ANIM_SAVE_IN 16 +#define MAP_ICON_01_ANIM_FORCE_IN 17 +#define MAP_ICON_01_NUM_ANIMS 18 + +static const char *sPaneNamesIcon01[] = { + "N_treasure_00", "N_mark_000", "N_door_000", "N_saveIcon_00", "N_triforce_00", "N_player_000", + "N_player_01", "N_start_000", "N_sword_00", "N_shizuku_00", "N_shizuku_01", "N_goddessC_00", + "N_terryShop_00", "N_cloudBig_000", "N_treasure_01", "N_areaLight_00", "N_nusi_00", "N_doorKey_00", + "N_target_00", "N_mushi_00", "N_seekerIcon_00", "N_doddess_00", "N_domitory_00", "N_shop_00", + "N_mHusband_00", "N_mWife_00", "N_tool_00", "N_keep_00", "N_junk_00", "N_fortune_00", + "N_ruletou_000", "N_pampkin_000", "N_tery_000", "N_tikurin_000", "N_uta_000", "N_musi_000", + "N_skyloft_000", "N_roulette_00", "N_takegiri_00", "N_kobunB_00", "N_sebasun_00", "N_commonIcon_00", +}; + +#define MAP_ICON_01_PANE_TREASURE_00 0 +#define MAP_ICON_01_PANE_MARK_000 1 +#define MAP_ICON_01_PANE_DOOR_000 2 +#define MAP_ICON_01_PANE_SAVEICON_00 3 +#define MAP_ICON_01_PANE_TRIFORCE_00 4 +#define MAP_ICON_01_PANE_PLAYER_000 5 +#define MAP_ICON_01_PANE_PLAYER_01 6 +#define MAP_ICON_01_PANE_START_000 7 +#define MAP_ICON_01_PANE_SWORD_00 8 +#define MAP_ICON_01_PANE_SHIZUKU_00 9 +#define MAP_ICON_01_PANE_SHIZUKU_01 10 +#define MAP_ICON_01_PANE_GODDESSC_00 11 +#define MAP_ICON_01_PANE_TERRYSHOP_00 12 +#define MAP_ICON_01_PANE_CLOUDBIG_000 13 +#define MAP_ICON_01_PANE_TREASURE_01 14 +#define MAP_ICON_01_PANE_AREALIGHT_00 15 +#define MAP_ICON_01_PANE_NUSI_00 16 +#define MAP_ICON_01_PANE_DOORKEY_00 17 +#define MAP_ICON_01_PANE_TARGET_00 18 +#define MAP_ICON_01_PANE_MUSHI_00 19 +#define MAP_ICON_01_PANE_SEEKERICON_00 20 +#define MAP_ICON_01_PANE_DODDESS_00 21 +#define MAP_ICON_01_PANE_DOMITORY_00 22 +#define MAP_ICON_01_PANE_SHOP_00 23 +#define MAP_ICON_01_PANE_MHUSBAND_00 24 +#define MAP_ICON_01_PANE_MWIFE_00 25 +#define MAP_ICON_01_PANE_TOOL_00 26 +#define MAP_ICON_01_PANE_KEEP_00 27 +#define MAP_ICON_01_PANE_JUNK_00 28 +#define MAP_ICON_01_PANE_FORTUNE_00 29 +#define MAP_ICON_01_PANE_RULETOU_000 30 +#define MAP_ICON_01_PANE_PAMPKIN_000 31 +#define MAP_ICON_01_PANE_TERY_000 32 +#define MAP_ICON_01_PANE_TIKURIN_000 33 +#define MAP_ICON_01_PANE_UTA_000 34 +#define MAP_ICON_01_PANE_MUSI_000 35 +#define MAP_ICON_01_PANE_SKYLOFT_000 36 +#define MAP_ICON_01_PANE_ROULETTE_00 37 +#define MAP_ICON_01_PANE_TAKEGIRI_00 38 +#define MAP_ICON_01_PANE_KOBUNB_00 39 +#define MAP_ICON_01_PANE_SEBASUN_00 40 +#define MAP_ICON_01_PANE_COMMONICON_00 41 + +#define MAP_ICON_01_NUM_PANES 42 + +static const char *sMapIcon01BoundingNames[] = { + "B_doddess_00", "B_domitory_00", "B_shop_00", "B_mHusband_00", "B_mWife_00", "B_tool_00", + "B_keep_00", "B_junk_00", "B_fortune_00", "B_ruletou_00", "B_pampkin_00", "B_tery_00", + "B_tikurin_00", "B_uta_01", "B_musi_01", "B_skyloft_01", "B_roulette_00", "B_takegiri_00", + "B_kobunB_00", "B_sebasun_00", "B_uta_00", "B_musi_00", "B_skyloft_00", "B_nusi_00", + "B_terryShop_00", "B_seekerStone_00", "B_commonIcon_00", "B_commonIcon_01", "B_commonIcon_02", "B_commonIcon_03", + "B_commonIcon_04", "B_commonIcon_05", "B_commonIcon_06", "B_commonIcon_07", "B_commonIcon_08", "B_commonIcon_09", + "B_commonIcon_10", "B_commonIcon_11", "B_commonIcon_12", "B_commonIcon_13", "B_commonIcon_14", "B_commonIcon_15", + "B_commonIcon_16", "B_commonIcon_17", "B_commonIcon_18", "B_commonIcon_19", "B_commonIcon_20", "B_commonIcon_21", + "B_commonIcon_22", "B_commonIcon_23", "B_commonIcon_24", "B_commonIcon_25", "B_commonIcon_26", "B_commonIcon_27", + "B_commonIcon_28", "B_commonIcon_29", "B_saveIcon_00", "B_mushi_00", "B_areaLight_00", +}; + +#define MAP_ICON_01_BOUNDING_DODDESS_00 0 +#define MAP_ICON_01_BOUNDING_DOMITORY_00 1 +#define MAP_ICON_01_BOUNDING_SHOP_00 2 +#define MAP_ICON_01_BOUNDING_MHUSBAND_00 3 +#define MAP_ICON_01_BOUNDING_MWIFE_00 4 +#define MAP_ICON_01_BOUNDING_TOOL_00 5 +#define MAP_ICON_01_BOUNDING_KEEP_00 6 +#define MAP_ICON_01_BOUNDING_JUNK_00 7 +#define MAP_ICON_01_BOUNDING_FORTUNE_00 8 +#define MAP_ICON_01_BOUNDING_RULETOU_00 9 +#define MAP_ICON_01_BOUNDING_PAMPKIN_00 10 +#define MAP_ICON_01_BOUNDING_TERY_00 11 +#define MAP_ICON_01_BOUNDING_TIKURIN_00 12 +#define MAP_ICON_01_BOUNDING_UTA_01 13 +#define MAP_ICON_01_BOUNDING_MUSI_01 14 +#define MAP_ICON_01_BOUNDING_SKYLOFT_01 15 +#define MAP_ICON_01_BOUNDING_ROULETTE_00 16 +#define MAP_ICON_01_BOUNDING_TAKEGIRI_00 17 +#define MAP_ICON_01_BOUNDING_KOBUNB_00 18 +#define MAP_ICON_01_BOUNDING_SEBASUN_00 19 +#define MAP_ICON_01_BOUNDING_UTA_00 20 +#define MAP_ICON_01_BOUNDING_MUSI_00 21 +#define MAP_ICON_01_BOUNDING_SKYLOFT_00 22 +#define MAP_ICON_01_BOUNDING_NUSI_00 23 +#define MAP_ICON_01_BOUNDING_TERRYSHOP_00 24 +#define MAP_ICON_01_BOUNDING_SEEKERSTONE_00 25 +#define MAP_ICON_01_BOUNDING_COMMONICON_00 26 +#define MAP_ICON_01_BOUNDING_COMMONICON_01 27 +#define MAP_ICON_01_BOUNDING_COMMONICON_02 28 +#define MAP_ICON_01_BOUNDING_COMMONICON_03 29 +#define MAP_ICON_01_BOUNDING_COMMONICON_04 30 +#define MAP_ICON_01_BOUNDING_COMMONICON_05 31 +#define MAP_ICON_01_BOUNDING_COMMONICON_06 32 +#define MAP_ICON_01_BOUNDING_COMMONICON_07 33 +#define MAP_ICON_01_BOUNDING_COMMONICON_08 34 +#define MAP_ICON_01_BOUNDING_COMMONICON_09 35 +#define MAP_ICON_01_BOUNDING_COMMONICON_10 36 +#define MAP_ICON_01_BOUNDING_COMMONICON_11 37 +#define MAP_ICON_01_BOUNDING_COMMONICON_12 38 +#define MAP_ICON_01_BOUNDING_COMMONICON_13 39 +#define MAP_ICON_01_BOUNDING_COMMONICON_14 40 +#define MAP_ICON_01_BOUNDING_COMMONICON_15 41 +#define MAP_ICON_01_BOUNDING_COMMONICON_16 42 +#define MAP_ICON_01_BOUNDING_COMMONICON_17 43 +#define MAP_ICON_01_BOUNDING_COMMONICON_18 44 +#define MAP_ICON_01_BOUNDING_COMMONICON_19 45 +#define MAP_ICON_01_BOUNDING_COMMONICON_20 46 +#define MAP_ICON_01_BOUNDING_COMMONICON_21 47 +#define MAP_ICON_01_BOUNDING_COMMONICON_22 48 +#define MAP_ICON_01_BOUNDING_COMMONICON_23 49 +#define MAP_ICON_01_BOUNDING_COMMONICON_24 50 +#define MAP_ICON_01_BOUNDING_COMMONICON_25 51 +#define MAP_ICON_01_BOUNDING_COMMONICON_26 52 +#define MAP_ICON_01_BOUNDING_COMMONICON_27 53 +#define MAP_ICON_01_BOUNDING_COMMONICON_28 54 +#define MAP_ICON_01_BOUNDING_COMMONICON_29 55 +#define MAP_ICON_01_BOUNDING_SAVEICON_00 56 +#define MAP_ICON_01_BOUNDING_MUSHI_00 57 +#define MAP_ICON_01_BOUNDING_AREALIGHT_00 58 + +#define MAP_ICON_01_BOUNDING_COMMONICON_LAST (MAP_ICON_01_BOUNDING_COMMONICON_29 + 1) + +#define MAP_ICON_01_NUM_BOUNDINGS 59 + +static const char *sMapIcon01SpecialPaneNames[] = { + "N_doddess_000", "N_domitory_000", "N_shop_000", "N_mHusband_000", "N_mWife_000", "N_tool_000", + "N_keep_000", "N_junk_000", "N_fortune_000", "N_ruletou_000", "N_pampkin_000", "N_tery_000", + "N_tikurin_000", "N_uta_000", "N_musi_000", "N_skyloft_02", "N_roulette_01", "N_takegiri_01", + "N_kobunB_01", "N_sebasun_01", "N_commonIcon_000", "N_saveIcon_000", "N_areaLight_01", "N_nusi_000", + "N_terryShop_01", "N_seekerIcon_01", "N_mushi_01", +}; + +#define MAP_ICON_01_SPECIAL_PANE_DODDESS_000 0 +#define MAP_ICON_01_SPECIAL_PANE_DOMITORY_000 1 +#define MAP_ICON_01_SPECIAL_PANE_SHOP_000 2 +#define MAP_ICON_01_SPECIAL_PANE_MHUSBAND_000 3 +#define MAP_ICON_01_SPECIAL_PANE_MWIFE_000 4 +#define MAP_ICON_01_SPECIAL_PANE_TOOL_000 5 +#define MAP_ICON_01_SPECIAL_PANE_KEEP_000 6 +#define MAP_ICON_01_SPECIAL_PANE_JUNK_000 7 +#define MAP_ICON_01_SPECIAL_PANE_FORTUNE_000 8 +#define MAP_ICON_01_SPECIAL_PANE_RULETOU_000 9 +#define MAP_ICON_01_SPECIAL_PANE_PAMPKIN_000 10 +#define MAP_ICON_01_SPECIAL_PANE_TERY_000 11 +#define MAP_ICON_01_SPECIAL_PANE_TIKURIN_000 12 +#define MAP_ICON_01_SPECIAL_PANE_UTA_000 13 +#define MAP_ICON_01_SPECIAL_PANE_MUSI_000 14 +#define MAP_ICON_01_SPECIAL_PANE_SKYLOFT_02 15 +#define MAP_ICON_01_SPECIAL_PANE_ROULETTE_01 16 +#define MAP_ICON_01_SPECIAL_PANE_TAKEGIRI_01 17 +#define MAP_ICON_01_SPECIAL_PANE_KOBUNB_01 18 +#define MAP_ICON_01_SPECIAL_PANE_SEBASUN_01 19 +#define MAP_ICON_01_SPECIAL_PANE_COMMONICON_000 20 +#define MAP_ICON_01_SPECIAL_PANE_SAVEICON_000 21 +#define MAP_ICON_01_SPECIAL_PANE_AREALIGHT_01 22 +#define MAP_ICON_01_SPECIAL_PANE_NUSI_000 23 +#define MAP_ICON_01_SPECIAL_PANE_TERRYSHOP_01 24 +#define MAP_ICON_01_SPECIAL_PANE_SEEKERICON_01 25 +#define MAP_ICON_01_SPECIAL_PANE_MUSHI_01 26 + +#define MAP_ICON_01_NUM_SPECIAL_PANES 27 + +static const char *sMapIcon01SpecialPictureNames[] = { + "P_doddess_00", "P_domitory_00", "P_shop_00", "P_mHusband_00", "P_mWife_00", "P_tool_00", "P_keep_00", + "P_junk_00", "P_fortune_00", "P_ruletou_00", "P_pampkin_00", "P_tery_00", "P_tikurin_00", "P_uta_00", + "P_musi_00", "P_skyloft_00", "P_icon_01", "P_icon_02", "P_icon_00", "P_icon_04", "P_commonIcon_00", + "P_saveIcon_01", "P_light_00_00", "P_nusi_00", "P_terry_01", "P_seeker_00", "P_mushi_00", + +}; + +#define MAP_ICON_01_SPECIAL_PICTURE_DODDESS_00 0 +#define MAP_ICON_01_SPECIAL_PICTURE_DOMITORY_00 1 +#define MAP_ICON_01_SPECIAL_PICTURE_SHOP_00 2 +#define MAP_ICON_01_SPECIAL_PICTURE_MHUSBAND_00 3 +#define MAP_ICON_01_SPECIAL_PICTURE_MWIFE_00 4 +#define MAP_ICON_01_SPECIAL_PICTURE_TOOL_00 5 +#define MAP_ICON_01_SPECIAL_PICTURE_KEEP_00 6 +#define MAP_ICON_01_SPECIAL_PICTURE_JUNK_00 7 +#define MAP_ICON_01_SPECIAL_PICTURE_FORTUNE_00 8 +#define MAP_ICON_01_SPECIAL_PICTURE_RULETOU_00 9 +#define MAP_ICON_01_SPECIAL_PICTURE_PAMPKIN_00 10 +#define MAP_ICON_01_SPECIAL_PICTURE_TERY_00 11 +#define MAP_ICON_01_SPECIAL_PICTURE_TIKURIN_00 12 +#define MAP_ICON_01_SPECIAL_PICTURE_UTA_00 13 +#define MAP_ICON_01_SPECIAL_PICTURE_MUSI_00 14 +#define MAP_ICON_01_SPECIAL_PICTURE_SKYLOFT_00 15 +#define MAP_ICON_01_SPECIAL_PICTURE_ICON_01 16 +#define MAP_ICON_01_SPECIAL_PICTURE_ICON_02 17 +#define MAP_ICON_01_SPECIAL_PICTURE_ICON_00 18 +#define MAP_ICON_01_SPECIAL_PICTURE_ICON_04 19 +#define MAP_ICON_01_SPECIAL_PICTURE_COMMONICON_00 20 +#define MAP_ICON_01_SPECIAL_PICTURE_SAVEICON_01 21 +#define MAP_ICON_01_SPECIAL_PICTURE_LIGHT_00_00 22 +#define MAP_ICON_01_SPECIAL_PICTURE_NUSI_00 23 +#define MAP_ICON_01_SPECIAL_PICTURE_TERRY_01 24 +#define MAP_ICON_01_SPECIAL_PICTURE_SEEKER_00 25 +#define MAP_ICON_01_SPECIAL_PICTURE_MUSHI_00 26 + +#define MAP_ICON_01_NUM_SPECIAL_PICTURES 27 + +static const char *sSaveObjPrefix = "SAVEOBJ_NAME_"; +static const char *sTerryOnOff = "N_terryOnOff_00"; + +bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) { + field_0x1848 = 30; + mCurrentFloor = dLytMapGlobal_c::GetInstance()->getFloor(); + field_0x0C83 = dLytMapGlobal_c::GetInstance()->getField_0x4F(); + field_0x0C84 = dLytMapGlobal_c::GetInstance()->getField_0x4C(); + mLastFloor = mCurrentFloor; + mpResAcc = resAcc; + mLyt.setResAcc(resAcc); + mLyt.build("mapIcon_01.brlyt", nullptr); + for (int i = 0; i < MAP_ICON_01_NUM_ANIMS; i++) { + mAnm[i].init(brlanMapMapIcon01[i].mFile, mpResAcc, mLyt.getLayout(), brlanMapMapIcon01[i].mName); + mAnm[i].bind(false); + } + + if (daPlayerActBase_c::getCurrentTunicType() == 1) { + setLinkTunic(1); + } else { + setLinkTunic(0); + } + + // TODO bunch of setters + + if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_TRIFORCE_COMPLETE)) { + setGoddessStatue(false); + } else { + setGoddessStatue(true); + } + + for (int i = 0; i < MAP_ICON_01_NUM_PANES; i++) { + mpPanes[i] = mLyt.findPane(sPaneNamesIcon01[i]); + } + + for (int i = 0; i < MAP_ICON_01_NUM_BOUNDINGS; i++) { + mpBoundings[i] = mLyt.findBounding(sMapIcon01BoundingNames[i]); + } + + // TODO - why 56 and not 59 + for (int i = 0; i < MAP_ICON_01_BOUNDING_COMMONICON_LAST; i++) { + mPopupConfigs[i].bounding = mpBoundings[i]; + } + + for (int i = 0; i < MAP_ICON_01_NUM_BOUNDINGS; i++) { + mpBoundings[i]->SetVisible(false); + } + + mLyt.calc(); + + for (int i = 0; i < MAP_ICON_01_NUM_SPECIAL_PANES; i++) { + mpSpecialPanes[i] = mLyt.findPane(sMapIcon01SpecialPaneNames[i]); + } + + for (int i = 0; i < MAP_ICON_01_NUM_SPECIAL_PICTURES; i++) { + mpSpecialPictures[i] = mLyt.findPane(sMapIcon01SpecialPictureNames[i]); + } + + mpTerryOnOffPane = mLyt.findPane(sTerryOnOff); + setTerry(false); + + for (int i = 0; i < 35; i++) { + mPassIdxes[i] = i; + } + + checkMapMode(); + loadFlags(); + + for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { + mIconAnims[i].cmdIndex = ARRAY_LENGTH(mCommands); + mIconAnims[i].frame = 0.0f; + mIconAnims[i].animIn = false; + mIconAnims[i].animOut = false; + mIconAnims[i].visible = false; + mIconAnims[i].prevVisible = false; + mIconAnims[i].render = false; + } + + setupActorDrawCommands(); + setupStageDrawCommands(); + setupLinkDrawCommand(); + if (field_0x0C70 == 1) { + setupTriforceDrawCommands(); + } + + if (field_0x0C70 == 4) { + setupCloudBigDrawCommand(); + } + + recordAnimVisState(); + transitionAnims(); + sortPanes(); + + mCsHitCheck.init(mLyt.getLayout()->GetRootPane(), 0x1, 0, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); + resetDrawCommands(); + return true; +} + +bool dLytMapIcon01_c::remove() { + for (int i = 0; i < MAP_ICON_01_NUM_ANIMS; i++) { + mAnm[i].unbind(); + mAnm[i].remove(); + } + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); + return true; +} + +bool dLytMapIcon01_c::execute() { + for (int i = 0; i < MAP_ICON_01_ANIM_FORCE_IN + 1 - MAP_ICON_01_ANIM_TRES_OUT; i++) { + if (mAnm[MAP_ICON_01_ANIM_TRES_OUT + i].isEnabled() && mAnm[MAP_ICON_01_ANIM_TRES_OUT + i].isStop2()) { + mAnm[MAP_ICON_01_ANIM_TRES_OUT + i].setAnimEnable(false); + } + } + resetDrawCommands(); + checkMapMode(); + loadFlags(); + + mCurrentFloor = dLytMapGlobal_c::GetInstance()->getFloor(); + field_0x0C83 = dLytMapGlobal_c::GetInstance()->getField_0x4F(); + field_0x0C84 = dLytMapGlobal_c::GetInstance()->getField_0x4C(); + + updateScale(); + setupActorDrawCommands(); + setupStageDrawCommands(); + setupLinkDrawCommand(); + if (field_0x0C70 == 1) { + setupTriforceDrawCommands(); + } + + if (field_0x0C70 == 4) { + setupCloudBigDrawCommand(); + } + + for (int i = 0; i < MAP_ICON_01_NUM_ANIMS; i++) { + if (mAnm[i].isEnabled()) { + mAnm[i].play(); + } + } + + if (dLytMapGlobal_c::GetInstance()->getField_0x4D() && + dLytMapGlobal_c::GetInstance()->getMapEvent() != dLytMapMain_c::MAP_EVENT_SAVE_OBJ) { + checkBoundingPointing(); + } + + mCsHitCheck.resetCachedHitboxes(); + mCsHitCheck.execute(); + + transitionAnims(); + recordAnimVisState(); + + if (!field_0x1844) { + field_0x1844 = true; + if (field_0x0C84 == 0) { + for (int i = 0; i < 50; i++) { + mIconAnims[i].animIn = false; + mIconAnims[i].animOut = false; + } + } + } + + return true; +} + +void dLytMapIcon01_c::draw() { + // TODO - tons of GPR regswaps, mAng nonsense, otherwise OK + mAng mapRot = dLytMapGlobal_c::GetInstance()->getMapRotation(); + // Maybe compiler-generated + u8 *idxes = mPassIdxes; + for (int pass = 0; pass < 35; pass++, idxes++) { + s32 idx = *idxes; + if (mNumCommandsPerPass[idx]) { + for (int cmd = 0; cmd < mNumCommands; cmd++) { + // Maybe compiler-generated + const mAng &commandRot = mCommands[cmd].rotation; + if (idx == mCommands[cmd].passIdx) { + s32 paneIdx = mCommands[cmd].paneIdx; + nw4r::lyt::Pane *pane = mpPanes[paneIdx]; + switch (paneIdx) { + case MAP_ICON_01_PANE_PLAYER_000: { + mVec3_c rotate(0.0f, 0.0f, 0.0f); + if (dLytMapGlobal_c::GetInstance()->getField_0x55() != 0) { + dAcPy_c *link = getLinkPtr(); + rotate.z = (link->vt_0x19C() + link->mRotation.y + (-mapRot)).degree2(); + } else { + rotate.z = (field_0x0D3A + (-mapRot)).degree2(); + } + pane->SetRotate(rotate); + pane = pane->GetParent(); + break; + } + case MAP_ICON_01_PANE_DOOR_000: + case MAP_ICON_01_PANE_START_000: { + mVec3_c rotate(0.0f, 0.0f, ((-mapRot) + commandRot).degree2()); + pane->SetRotate(rotate); + pane = mpPanes[paneIdx]->GetParent(); + break; + } + case MAP_ICON_01_PANE_MARK_000: + case MAP_ICON_01_PANE_RULETOU_000: + case MAP_ICON_01_PANE_PAMPKIN_000: + case MAP_ICON_01_PANE_TERY_000: + case MAP_ICON_01_PANE_TIKURIN_000: + case MAP_ICON_01_PANE_UTA_000: + case MAP_ICON_01_PANE_MUSI_000: + case MAP_ICON_01_PANE_SKYLOFT_000: { + mVec3_c rotate(0.0f, 0.0f, (-mapRot).degree2()); + pane->SetRotate(rotate); + pane = mpPanes[paneIdx]->GetParent(); + break; + } + case MAP_ICON_01_PANE_AREALIGHT_00: { + if (field_0x0D48 != ARRAY_LENGTH(mCommands) && field_0x0D48 == cmd) { + setAreaLight(0, pane); + } else if (field_0x0D49 != ARRAY_LENGTH(mCommands) && field_0x0D49 == cmd) { + setAreaLight(1, pane); + } else if (field_0x0D4A != ARRAY_LENGTH(mCommands) && field_0x0D4A == cmd) { + setAreaLight(2, pane); + } + break; + } + case MAP_ICON_01_PANE_SAVEICON_00: { + if (field_0x0D4B[cmd] != ARRAY_LENGTH(mCommands)) { + setSaveObj(field_0x0D4B[cmd], pane); + } + break; + } + } + + if (paneIdx == MAP_ICON_01_PANE_CLOUDBIG_000) { + if (dScGame_c::isCurrentStage("F020")) { + if (mThunderheadEntered) { + setCloud(1, pane); + } else { + setCloud(0, pane); + } + } else if (dScGame_c::isCurrentStage("F023")) { + setCloud(2, pane); + } + mVec3_c rotate(0.0f, 0.0f, (-mapRot).degree2()); + pane->SetRotate(rotate); + pane = mpPanes[paneIdx]->GetParent(); + } + + u8 alpha = dLytMapGlobal_c::GetInstance()->getAlpha(); + bool found = false; + int i = 0; + for (; i < mNumAnims; i++) { + if (cmd == mIconAnims[i].cmdIndex) { + found = true; + break; + } + } + + if (found == true) { + if (field_0x0C84 && mIconAnims[i].animIn == true) { + if (field_0x1845 == 1) { + mIconAnims[i].visible = true; + mIconAnims[i].animIn = true; + } else { + mIconAnims[i].visible = false; + mIconAnims[i].animIn = false; + } + } + + if (mCurrentFloor != mLastFloor) { + mIconAnims[i].animIn = false; + mIconAnims[i].animOut = false; + } + + if (mIconAnims[i].animIn) { + f32 f = mIconAnims[i].frame; + if (f <= field_0x1838) { + drawWithAnimIn(paneIdx, pane, f); + mIconAnims[i].frame += 1.0f; + mIconAnims[i].render = true; + if (!field_0x184C) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ICON_APPEAR); + field_0x184C = true; + } + } else { + mIconAnims[i].animIn = false; + mIconAnims[i].render = true; + field_0x184C = false; + } + } else if (mIconAnims[i].animOut) { + f32 f = mIconAnims[i].frame; + if (f <= field_0x183C) { + drawWithAnimOut(paneIdx, pane, f); + mIconAnims[i].frame += 1.0f; + mIconAnims[i].render = true; + } else { + mIconAnims[i].animOut = false; + mIconAnims[i].render = true; + } + } else if (mIconAnims[i].visible) { + drawFullyIn(paneIdx, pane); + mIconAnims[i].render = true; + } + + if (mIconAnims[i].render == true) { + pane->SetAlpha(alpha); + pane->SetTranslate(vec2ToVec3XY(mCommands[cmd].position + field_0x0D40)); + pane->Animate(0); + pane->CalculateMtx(mLyt.getDrawInfo()); + pane->Draw(mLyt.getDrawInfo()); + } + } else { + // No animation data - simply draw + pane->SetAlpha(alpha); + pane->SetTranslate(vec2ToVec3XY(mCommands[cmd].position + field_0x0D40)); + pane->Animate(0); + pane->CalculateMtx(mLyt.getDrawInfo()); + pane->Draw(mLyt.getDrawInfo()); + } + } + } + } + } + + mVec2_c v2(0.0f, 0.0f); + for (int i = 0; i < field_0x0E13; i++) { + if (mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) { + v2 = mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].boundingPos; + mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate( + vec2ToVec3XY(v2 + field_0x0D40) + ); + mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo()); + mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo()); + } + } + + mLastFloor = mCurrentFloor; +} + +static const char *sMapPrefix = "MAP_"; + +void dLytMapIcon01_c::resetDrawCommands() { + for (int i = 0; i < (int)ARRAY_LENGTH(mCommands); i++) { + mCommands[i].position.set(0.0f, 0.0f); + mCommands[i].rotation.setF(0.0f); + mCommands[i].paneIdx = MAP_ICON_01_NUM_PANES; + mCommands[i].passIdx = 35; + field_0x0D4B[i] = ARRAY_LENGTH(mCommands); + field_0x0C85[i] = 0; + } + + mCurrentFloor = 0; + + for (int i = 0; i < (int)ARRAY_LENGTH(mNumCommandsPerPass); i++) { + mNumCommandsPerPass[i] = 0; + } + + mNumCommands = 0; + + for (int i = 0; i < (int)ARRAY_LENGTH(mPopupConfigs); i++) { + mPopupConfigs[i].cmdIdx = ARRAY_LENGTH(mCommands); + mPopupConfigs[i].boundingPos.set(0.0f, 0.0f); + mPopupConfigs[i].textPos.set(0.0f, 0.0f); + mPopupConfigs[i].pointedAt = false; + mPopupConfigs[i].objId = 0; + mPopupConfigs[i].labelPrefix = sMapPrefix; + } + + field_0x0E13 = 0; + field_0x0C83 = 0; + field_0x0C84 = 0; + + fn_80181C40(); + + field_0x0D48 = ARRAY_LENGTH(mCommands); + field_0x0D49 = ARRAY_LENGTH(mCommands); + field_0x0D4A = ARRAY_LENGTH(mCommands); + + mFunFunIslandDiscovered = false; + mLumpyPumkpinDiscovered = false; + mBeedleIslandDiscovered = false; + mBambooIslandDiscovered = false; + mIsleOfSongsDiscovered = false; + mBugHavenDiscovered = false; + mBilocyteFightTriggered = false; + mFaronPillarOpened = false; + mFaronDiscovered = false; + mEldinPillarOpened = false; + mEldinDiscovered = false; + mLanayruPillarOpened = false; + mLanaryuDiscovered = false; + mThunderheadEntered = false; + mBeedleShopEntered = false; + + for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { + mIconAnims[i].render = false; + } + + mNumAnims = 0; +} + +void dLytMapIcon01_c::loadFlags() { + StoryflagManager *mgr = StoryflagManager::sInstance; + mFunFunIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_FUN_FUN_ISLAND_DISCOVERED); + mLumpyPumkpinDiscovered = mgr->getCounterOrFlag(STORYFLAG_LUMPY_PUMPKIN_DISCOVERED); + mBeedleIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_BEEDLE_ISLAND_DISCOVERED); + mBambooIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_BAMBOO_ISLAND_DISCOVERED); + mIsleOfSongsDiscovered = mgr->getCounterOrFlag(STORYFLAG_ISLE_OF_SONGS_DISCOVERED); + mBugHavenDiscovered = mgr->getCounterOrFlag(STORYFLAG_BUG_HAVEN_DISCOVERED); + mBilocyteFightTriggered = mgr->getCounterOrFlag(STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED); + mFaronPillarOpened = mgr->getCounterOrFlag(STORYFLAG_FARON_PILLAR_OPENED); + mFaronDiscovered = mgr->getCounterOrFlag(STORYFLAG_FARON_DISCOVERED); + mEldinPillarOpened = mgr->getCounterOrFlag(STORYFLAG_ELDIN_PILLAR_OPENED); + mEldinDiscovered = mgr->getCounterOrFlag(STORYFLAG_ELDIN_DISCOVERED); + mLanayruPillarOpened = mgr->getCounterOrFlag(STORYFLAG_LANAYRU_PILLAR_OPENED); + mLanaryuDiscovered = mgr->getCounterOrFlag(STORYFLAG_LANAYRU_DISCOVERED); + mThunderheadEntered = mgr->getCounterOrFlag(STORYFLAG_THUNDERHEAD_ENTERED); + mBeedleShopEntered = mgr->getCounterOrFlag(STORYFLAG_BEEDLE_SHOP_ENTERED); +} + +void dLytMapIcon01_c::setLinkTunic(s32 type) { + f32 frame = 0.0f; + switch (type) { + case 1: frame = 0.0f; break; + case 0: frame = 1.0f; break; + } + + mAnm[MAP_ICON_01_ANIM_PLAYER_2_PATTERN].setAnimEnable(true); + mAnm[MAP_ICON_01_ANIM_PLAYER_2_PATTERN].setFrame(frame); + mLyt.calc(); + mAnm[MAP_ICON_01_ANIM_PLAYER_2_PATTERN].setAnimEnable(false); +} + +void dLytMapIcon01_c::setAreaLight(u32 color, nw4r::lyt::Pane *pane) { + f32 frame = color; + mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setAnimEnable(true); + mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setFrame(frame); + pane->Animate(0); + mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setAnimEnable(false); +} + +void dLytMapIcon01_c::setCloud(u32 alpha, nw4r::lyt::Pane *pane) { + f32 frame = alpha; + mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setAnimEnable(true); + mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setFrame(frame); + pane->Animate(0); + mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setAnimEnable(false); +} + +void dLytMapIcon01_c::setGoddessStatue(u32 present) { + f32 frame = 0.0f; + if (!present) { + frame = 1.0f; + } + mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setFrame(frame); + mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setAnimEnable(true); + mLyt.calc(); + mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setAnimEnable(false); +} + +void dLytMapIcon01_c::setSaveObj(u32 color, nw4r::lyt::Pane *pane) { + f32 frame = color; + mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setAnimEnable(true); + mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setFrame(frame); + pane->Animate(0); + mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setAnimEnable(false); +} + +void dLytMapIcon01_c::setTerry(bool present) { + mpTerryOnOffPane->SetVisible(present); +} + +void dLytMapIcon01_c::drawWithAnimIn(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame) { + if (paneIdx == MAP_ICON_01_PANE_DOORKEY_00) { + paneIdx = MAP_ICON_01_PANE_DOOR_000; + } + + // NOTE: Treasure/Mark/Door/Save/Triforce order is the same between anims and panes + u8 anmIdx = paneIdx - MAP_ICON_01_PANE_TREASURE_00 + MAP_ICON_01_ANIM_TRES_IN; + + if (frame <= mAnm[anmIdx].getLastFrame()) { + mAnm[anmIdx].setFrame(frame); + // Maybe inlines/macros + d2d::AnmGroup_c &anm = mAnm[anmIdx]; + anm.setAnimEnable(true); + pane->Animate(0); + anm.setAnimEnable(false); + } +} + +void dLytMapIcon01_c::drawWithAnimOut(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame) { + if (paneIdx == MAP_ICON_01_PANE_DOORKEY_00) { + paneIdx = MAP_ICON_01_PANE_DOOR_000; + } + + // NOTE: Treasure/Mark/Door/Save/Triforce order is the same between anims and panes + u8 anmIdx = paneIdx - MAP_ICON_01_PANE_TREASURE_00 + MAP_ICON_01_ANIM_TRES_OUT; + + if (frame <= mAnm[anmIdx].getLastFrame()) { + mAnm[anmIdx].setFrame(frame); + // Maybe inlines/macros + d2d::AnmGroup_c &anm = mAnm[anmIdx]; + anm.setAnimEnable(true); + pane->Animate(0); + anm.setAnimEnable(false); + } +} + +void dLytMapIcon01_c::drawFullyIn(u32 paneIdx, nw4r::lyt::Pane *pane) { + if (paneIdx == MAP_ICON_01_PANE_DOORKEY_00) { + paneIdx = MAP_ICON_01_PANE_DOOR_000; + } + + // NOTE: Treasure/Mark/Door/Save/Triforce order is the same between anims and panes + u8 anmIdx = paneIdx - MAP_ICON_01_PANE_TREASURE_00 + MAP_ICON_01_ANIM_TRES_IN; + + mAnm[anmIdx].setToEnd2(); + // Maybe inlines/macros + d2d::AnmGroup_c &anm = mAnm[anmIdx]; + anm.setAnimEnable(true); + pane->Animate(0); + anm.setAnimEnable(false); +} + +void dLytMapIcon01_c::checkMapMode() { + s32 current = dLytMapGlobal_c::GetInstance()->getCurrentMapMode(); + s32 next = dLytMapGlobal_c::GetInstance()->getNextMapMode(); + + if (current == dLytMapGlobal_c::MAPMODE_PROVINCE && next == dLytMapGlobal_c::MAPMODE_ZOOM) { + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_ZOOM && next == dLytMapGlobal_c::MAPMODE_PROVINCE) { + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_STAGE && next == dLytMapGlobal_c::MAPMODE_ZOOM) { + mModeCheckResult = MODE_TRANSITION_TO_ZOOM; + return; + } + + if (current == dLytMapGlobal_c::MAPMODE_ZOOM && next == dLytMapGlobal_c::MAPMODE_STAGE) { + mModeCheckResult = MODE_TRANSITION_TO_STAGE; + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_PROVINCE) { + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_STAGE) { + mModeCheckResult = MODE_STABLE_STAGE; + return; + } + + if (current == next && current == dLytMapGlobal_c::MAPMODE_ZOOM) { + mModeCheckResult = MODE_STABLE_ZOOM; + return; + } +} + +void dLytMapIcon01_c::setupActorDrawCommands() { + dAcBase_c *ac = nullptr; + while ((ac = static_cast(fManager_c::searchBaseByGroupType(fBase_c::ACTOR, ac))) != nullptr) { + if (field_0x0C70 == 4 && mBilocyteFightTriggered) { + setupNpcBNusiDrawCommand(ac); + } + + if (field_0x0C70 == 1 && checkHasMap()) { + setupObjD3DummyDrawCommand(ac); + } + + if (dScGame_c::currentSpawnInfo.getTimeOfDay() != SpawnInfo::NIGHT) { + setupObjTerryShopDrawCommand(ac); + } + + setupTboxDrawCommand(ac); + setupObjShutterDrawCommand(ac); + setupObjDoorDrawCommand(ac); + setupObjSealedDoorDrawCommand(ac); + setupObjHarpHintDrawCommand(ac); + + if (field_0x184D) { + setupNpcBeeDrawCommand(ac); + } + + setupNpcKenseiDrawCommand(ac); + setupObjSaveDrawCommand(ac); + setupObjLightLineDrawCommand(ac); + setupObjRoAtTargetDrawCommand(ac); + + if (mNumCommands >= ARRAY_LENGTH(mCommands)) { + break; + } + } +} + +void dLytMapIcon01_c::setupNpcKenseiDrawCommand(dAcBase_c *actor) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { + if (actor->mProfileName == fProfile::NPC_KENSEI && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && + mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(actor->mPosition, pos); + mCommands[mNumCommands].passIdx = 18; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_SWORD_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[18]++; + mNumCommands++; + } + } +} + +void dLytMapIcon01_c::setupTboxDrawCommand(dAcBase_c *actor) { + if (actor->mProfileName == fProfile::TBOX && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && + mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { + dAcTbox_c *box = static_cast(actor); + if (box->getVariant() == dAcTbox_c::GODDESS) { + u16 flag = box->getParams2Lower(); + if (StoryflagManager::sInstance->getCounterOrFlag(flag) != 0 && box->hasBeenOpened() != true) { + setupTboxDrawCommandGoddessClosed(box); + } + } else if (box->hasBeenOpened() != true) { + if (field_0x0C70 == 1) { + setupTboxDrawCommandClosed(box); + } + } else { + setupTboxDrawCommandOpen(box); + } + } +} + +void dLytMapIcon01_c::setupTboxDrawCommandClosed(dAcTbox_c *box) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(box->mPosition, pos); + mCommands[mNumCommands].passIdx = 17; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_TREASURE_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + if (checkHasMap()) { + if (field_0x0C84) { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = true; + mIconAnims[mNumAnims].animIn = true; + } else { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = true; + mIconAnims[mNumAnims].animIn = false; + } + } else { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = false; + } + + mNumAnims++; + mNumCommandsPerPass[17]++; + mNumCommands++; + } +} + +void dLytMapIcon01_c::setupTboxDrawCommandOpen(dAcTbox_c *box) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(box->mPosition, pos); + mCommands[mNumCommands].passIdx = 17; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_TREASURE_01; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[17]++; + mNumCommands++; + } +} + +void dLytMapIcon01_c::setupTboxDrawCommandGoddessClosed(dAcTbox_c *box) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(box->mPosition, pos); + mCommands[mNumCommands].passIdx = 28; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_GODDESSC_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[28]++; + mNumCommands++; + } +} + +void dLytMapIcon01_c::setupObjShutterDrawCommand(dAcBase_c *actor) { + // TODO - needs door classes +} + +void dLytMapIcon01_c::setupObjDoorDrawCommand(dAcBase_c *actor) { + // TODO - needs door classes +} + +void dLytMapIcon01_c::setupObjSaveDrawCommand(dAcBase_c *actor) { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { + if (actor->mProfileName == fProfile::OBJ_SAVE && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) && + mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) { + dAcOSave_c *save = static_cast(actor); + + bool b1 = false; + bool b2 = false; + bool activated = save->checkStatueFlag(); + if (field_0x0C70 == 1) { + if (checkHasMap()) { + if (field_0x0C84) { + if (!activated) { + b1 = true; + b2 = true; + } else { + b1 = true; + } + } else { + b1 = true; + } + } else if (activated) { + b1 = true; + } + } else if (activated) { + b1 = true; + } + + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(actor->mPosition, pos); + mCommands[mNumCommands].passIdx = 9; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_SAVEICON_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + if (b1) { + if (save->getStatueType() == dAcOSave_c::TYPE_NORMAL) { + field_0x0D4B[mNumCommands] = 0; + } else if (save->getStatueType() == dAcOSave_c::TYPE_OVERWORLD) { + field_0x0D4B[mNumCommands] = 1; + } else if (save->getStatueType() == dAcOSave_c::TYPE_DUNGEON) { + field_0x0D4B[mNumCommands] = 2; + } else { + field_0x0D4B[mNumCommands] = 0; + } + + if (b2) { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = true; + mIconAnims[mNumAnims].animIn = true; + } else { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = true; + mIconAnims[mNumAnims].animIn = false; + } + } else { + mIconAnims[mNumAnims].cmdIndex = mNumCommands; + mIconAnims[mNumAnims].visible = false; + mIconAnims[mNumAnims].animIn = false; + } + + if (field_0x0C70 != 4 && mIconAnims[mNumAnims].visible == true && + field_0x0E13 < MAP_ICON_01_BOUNDING_COMMONICON_LAST - MAP_ICON_01_BOUNDING_COMMONICON_00) { + s32 idx = field_0x0E13 + MAP_ICON_01_BOUNDING_COMMONICON_00; + u32 id = save->getStatueNameId(); + mPopupConfigs[idx].cmdIdx = mNumCommands; + mPopupConfigs[idx].boundingPos.x = pos.x; + mPopupConfigs[idx].boundingPos.y = pos.y; + mPopupConfigs[idx].objId = id; + mPopupConfigs[idx].labelPrefix = sSaveObjPrefix; + nw4r::lyt::Bounding *b = mPopupConfigs[idx].bounding; + nw4r::lyt::Size bSize = mpBoundings[MAP_ICON_01_BOUNDING_SAVEICON_00]->GetSize(); + b->SetSize(bSize); + mVec2_c textPos(0.0f, 0.0f); + fn_80181880( + mpSpecialPictures[MAP_ICON_01_SPECIAL_PICTURE_SAVEICON_01], + mpSpecialPanes[MAP_ICON_01_SPECIAL_PANE_SAVEICON_000], textPos + ); + + mPopupConfigs[idx].textPos.x = textPos.x; + mPopupConfigs[idx].textPos.y = textPos.y; + mPopupConfigs[idx].bounding->SetVisible(true); + field_0x0E13++; + } + + mNumAnims++; + mNumCommandsPerPass[9]++; + mNumCommands++; + } + } +} + +void dLytMapIcon01_c::setupObjLightLineDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupNpcBNusiDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjTerryShopDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjRoAtTargetDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjD3DummyDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjSealedDoorDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupObjHarpHintDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupNpcBeeDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupStageDrawCommands() { + dAcBase_c *ac = nullptr; + while ((ac = static_cast(fManager_c::searchBaseByGroupType(fBase_c::STAGE, ac))) != nullptr) { + setupTgMapMarkDrawCommand(ac); + + if (dLytMapGlobal_c::GetInstance()->getField_0x54()) { + setupTgMapInstDrawCommand(ac); + } + + setupTgForceGetFlagDrawCommand(ac); + + if (field_0x184D) { + setupTgInsectDrawCommand(ac); + } + + if (mNumCommands >= ARRAY_LENGTH(mCommands)) { + break; + } + } +} + +void dLytMapIcon01_c::setupTgMapMarkDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgMapMarkDrawCommand1(dTgMapMark_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgMapMarkDrawCommand2(dTgMapMark_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgMapInstDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgForceGetFlagDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupTgInsectDrawCommand(dAcBase_c *actor) { + // TODO - ... +} + +void dLytMapIcon01_c::setupLinkDrawCommand() { + if (dAcPy_c::GetLinkM() != nullptr) { + setupLinkDrawCommand1(dAcPy_c::GetLinkM()); + + if (dLytMapGlobal_c::GetInstance()->getMapEvent() != dLytMapMain_c::MAP_EVENT_MAP_INTRO) { + setupLinkDrawCommand2(); + } + } +} + +void dLytMapIcon01_c::setupLinkDrawCommand1(dAcPy_c *ac) { + // TODO - ... +} + +void dLytMapIcon01_c::setupLinkDrawCommand2() { + // TODO - ... +} + +void dLytMapIcon01_c::setupCloudBigDrawCommand() { + if (mNumCommands < ARRAY_LENGTH(mCommands)) { + mVec3_c thunderHeadPos(-135210.0f, 0.0f, -84790.0f); + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(thunderHeadPos, pos); + mCommands[mNumCommands].passIdx = 31; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_CLOUDBIG_000; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[31]++; + mNumCommands++; + } +} + +void dLytMapIcon01_c::setupTriforceDrawCommands() { + dAcObjBase_c *ac = nullptr; + while ((ac = dAcObjBase_c::getNextObject(&dAcItem_c::sItemList, ac)) != nullptr) { + if (static_cast(ac)->isTriforce() && !ac->checkActorProperty(dAcBase_c::AC_PROP_0x100) && + mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(ac->mRoomID, ac->mPosition)) { + // @bug mNumCommands not checked? + mVec2_c pos(0.0f, 0.0f); + projectOntoMap(ac->mPosition, pos); + mCommands[mNumCommands].passIdx = 23; + mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_TRIFORCE_00; + mCommands[mNumCommands].position.x = pos.x; + mCommands[mNumCommands].position.y = pos.y; + + mNumCommandsPerPass[23]++; + mNumCommands++; + } + } +} + +void dLytMapIcon01_c::fn_80181880(nw4r::lyt::Pane *a, nw4r::lyt::Pane *b, mVec2_c &result) const { + // TODO - maybe equivalent but floating point hell + // Ignoring the get16x9to4x3WidthScaleF stuff this basically does + // (a->translate + a->parent->translate) * b->scale + (Ex * a->size * a->scale * b->scale / 2.0f) + mVec2_c scaleA = a->GetScale(); + mVec2_c scaleB = b->GetScale(); + + mVec3_c parentTranslateA = a->GetParent()->GetTranslate(); + parentTranslateA.x /= dGfx_c::get16x9to4x3WidthScaleF(); + + mVec3_c translateA = a->GetTranslate(); + translateA.x /= dGfx_c::get16x9to4x3WidthScaleF(); + translateA.x += parentTranslateA.x; + translateA.x *= scaleB.x; + translateA.y += parentTranslateA.y; + translateA.y *= scaleB.y; + + nw4r::lyt::Size sizeA = a->GetSize(); + sizeA.width /= dGfx_c::get16x9to4x3WidthScaleF(); + sizeA.width *= scaleA.x; + sizeA.width *= scaleB.x; + sizeA.height *= scaleA.y; + sizeA.height *= scaleB.y; + + translateA.x += (sizeA.width / 2.0f); + + result.x = translateA.x; + result.y = translateA.y; +} + +void dLytMapIcon01_c::recordAnimVisState() { + for (int i = 0; i < mNumAnims; i++) { + mIconAnims[i].prevVisible = mIconAnims[i].visible; + } +} + +void dLytMapIcon01_c::transitionAnims() { + for (int i = 0; i < mNumAnims; i++) { + if (mIconAnims[i].visible != mIconAnims[i].prevVisible) { + if (mIconAnims[i].prevVisible == true) { + mIconAnims[i].animIn = false; + mIconAnims[i].animOut = true; + } else if (mIconAnims[i].visible == true) { + mIconAnims[i].animIn = true; + mIconAnims[i].animOut = false; + } + } + } +} + +void dLytMapIcon01_c::checkBoundingPointing() { + for (int i = 0; i < MAP_ICON_01_BOUNDING_COMMONICON_LAST; i++) { + if (mPopupConfigs[i].bounding->IsVisible() && isPointingAtBounding(mPopupConfigs[i].bounding)) { + if (i == MAP_ICON_01_BOUNDING_UTA_00) { + mPopupConfigs[MAP_ICON_01_BOUNDING_UTA_01].pointedAt = true; + } else if (i == MAP_ICON_01_BOUNDING_MUSI_00) { + mPopupConfigs[MAP_ICON_01_BOUNDING_MUSI_01].pointedAt = true; + } else if (i == MAP_ICON_01_BOUNDING_SKYLOFT_00) { + mPopupConfigs[MAP_ICON_01_BOUNDING_SKYLOFT_01].pointedAt = true; + } else { + mPopupConfigs[i].pointedAt = true; + } + } + } +} + +bool dLytMapIcon01_c::isPointingAtBounding(nw4r::lyt::Pane *pane) const { + dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); + if (d != nullptr && d->getType() == 'lyt ' && static_cast(d)->getHitPane() == pane) { + return true; + } + return false; +} + +void dLytMapIcon01_c::fn_80181C40() { + for (int i = 0; i < MAP_ICON_01_BOUNDING_COMMONICON_LAST; i++) { + mpBoundings[i]->SetVisible(false); + } +} + +bool dLytMapIcon00_c::build(d2d::ResAccIf_c *resAcc) { + // TODO - ... + return true; +} + +bool dLytMapIcon00_c::remove() { + // TODO - ... + return true; +} + +bool dLytMapIcon00_c::execute() { + // TODO - ... + return true; +} + +void dLytMapIcon00_c::draw() { + // TODO - ... +} + +void dLytMapIcon00_c::resetDrawCommands() { + for (int i = 0; i < (int)ARRAY_LENGTH(mCommands); i++) { + mCommands[i].position.set(0.0f, 0.0f); + mCommands[i].rotation.setF(0.0f); + mCommands[i].paneIdx = 39; + mCommands[i].passIdx = 35; + field_0x0F20[i] = ARRAY_LENGTH(mCommands); + field_0x13A8[i] = 0; + field_0x1342[i] = 0; + field_0x0E5B[i] = 0; + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mNumCommandsPerPass); i++) { + mNumCommandsPerPass[i] = 0; + } + + field_0x13A7 = 0; + mNumCommands = 0; + + for (int i = 0; i < 36; i++) { + field_0x0EEC[i] = 0; + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mPopupConfigs); i++) { + mPopupConfigs[i].cmdIdx = ARRAY_LENGTH(mCommands); + mPopupConfigs[i].boundingPos.set(0.0f, 0.0f); + mPopupConfigs[i].textPos.set(0.0f, 0.0f); + mPopupConfigs[i].pointedAt = false; + mPopupConfigs[i].objId = 0; + mPopupConfigs[i].labelPrefix = sMapPrefix; + } + + field_0x140C = 0; + field_0x0E59 = 0; + field_0x0E5A = 0; + + fn_80189750(); + + field_0x0E50 = 0; + field_0x0E51 = 0; + field_0x0E52 = 0; + field_0x0E53 = 0; + field_0x0E54 = 0; + field_0x0E55 = 0; + field_0x0E56 = 0; + field_0x0E57 = 0; + field_0x0E58 = 0; + + for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) { + mIconAnims[i].render = false; + } + + mNumAnims = 0; + field_0x1CE4 = 0; +} + +static const char *sMapPopPrefix = "MAP_POP_"; + +bool dLytMapMarkers_c::build(d2d::ResAccIf_c *resAcc) { + mMapPopup.build(resAcc); + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + void *data = LayoutArcManager::GetInstance()->getLoadedData("MapSky"); + mResAcc01.attach(data, ""); + + // TODO - ... + + mIcon01.build(&mResAcc01); + } else { + void *data = LayoutArcManager::GetInstance()->getLoadedData("MapField"); + mResAcc00.attach(data, ""); + + // TODO - ... + + mIcon00.build(&mResAcc00); + } + return true; +} + +bool dLytMapMarkers_c::remove() { + mMapPopup.remove(); + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + mIcon01.remove(); + mResAcc01.detach(); + } else { + mIcon00.remove(); + mResAcc00.detach(); + } + // TODO - ... + return true; +} + +bool dLytMapMarkers_c::execute() { + return true; +} + +void dLytMapMarkers_c::draw() { + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + mIcon01.draw(); + } else { + mIcon00.draw(); + } +} + +void dLytMapMarkers_c::setIslandNamesOn(bool on) { + if (dStageMgr_c::GetInstance()->isSTIFAreaSky()) { + mShowIslandNames = on; + mIcon01.mShowIslandNames = on; + } +} + +void dLytMapMarkers_c::drawPopups() { + for (int i = 0; i < mNumPopups; i++) { + if (mPopups[i].visible) { + SizedString<0x40> label; + if (mPopups[i].objId == 0xFF) { + label.sprintf("SAVEOBJ_NAME_UNKNOWN"); + } else { + label.sprintf("%s%02d", mPopups[i].labelPrefix, mPopups[i].objId); + } + mMapPopup.setLabel(label); + mMapPopup.realizeText(); + f32 width = mMapPopup.getTextRenderWidth(); + + // TODO - probably equivalent but FPR, order, stack problems + mVec2_c boundingPos = mPopups[i].boundingPos; + mVec2_c textPos = mPopups[i].textPos; + mVec2_c pos = boundingPos + textPos + field_0x06F4; + pos.x += width / 2.0f; + + mMapPopup.setPosition(pos); + + mMapPopup.setInout(mPopups[i].inAnimFrame); + mMapPopup.draw(); + if (mPopups[i].inAnimFrame <= mMapPopup.getInAnimDuration()) { + mPopups[i].inAnimFrame += 1.0f; + } + if (mMapPopup.getInAnimDuration() <= mPopups[i].inAnimFrame) { + mPopups[i].inAnimFrame = mMapPopup.getInAnimDuration(); + } + } else if (0.0f < mPopups[i].inAnimFrame) { + SizedString<0x40> label; + if (mPopups[i].objId == 0xFF) { + label.sprintf("SAVEOBJ_NAME_UNKNOWN"); + } else { + label.sprintf("%s%02d", mPopups[i].labelPrefix, mPopups[i].objId); + } + mMapPopup.setLabel(label); + mMapPopup.realizeText(); + f32 width = mMapPopup.getTextRenderWidth(); + + // TODO - probably equivalent but FPR, order, stack problems + mVec2_c boundingPos = mPopups[i].boundingPos; + mVec2_c textPos = mPopups[i].textPos; + mVec2_c pos = boundingPos + textPos + field_0x06F4; + pos.x += width / 2.0f; + + mMapPopup.setPosition(pos); + + mPopups[i].inAnimFrame -= 1.0f; + mMapPopup.setInout(mPopups[i].inAnimFrame); + mMapPopup.draw(); + } + } +} + +void dLytMapMarkers_c::resetPopups() { + for (int i = 0; i < (int)ARRAY_LENGTH(mPopups); i++) { + mPopups[i].inAnimFrame = 0.0f; + mPopups[i].textPos.set(0.0f, 0.0f); + mPopups[i].boundingPos.set(0.0f, 0.0f); + mPopups[i].visible = false; + mPopups[i].objId = 0; + mPopups[i].labelPrefix = sMapPopPrefix; + } +} + +void dLytMapMarkers_c::loadPopups() { + for (int i = 0; i < mNumPopups; i++) { + // TODO - this looks weird + const mVec2_c &v = mpPopupConfigs[i].textPos; + mPopups[i].textPos.x = v.x; + mPopups[i].textPos.y = v.y; + mPopups[i].boundingPos = mpPopupConfigs[i].boundingPos; + mPopups[i].visible = mpPopupConfigs[i].pointedAt; + mPopups[i].objId = mpPopupConfigs[i].objId; + mPopups[i].labelPrefix = mpPopupConfigs[i].labelPrefix; + } +} diff --git a/src/d/lyt/d_textbox.cpp b/src/d/lyt/d_textbox.cpp index abc1ecaf..77ca6764 100644 --- a/src/d/lyt/d_textbox.cpp +++ b/src/d/lyt/d_textbox.cpp @@ -439,7 +439,7 @@ f32 dTextBox_c::GetLinesHeight() const { return totalHeight; } -f32 dTextBox_c::GetUnkWidthRatio() const { +f32 dTextBox_c::getLineDrawWidth() const { return GetLineWidth(nullptr) / dGfx_c::get16x9to4x3WidthScaleF(); } 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 35d987f9..7e3971c4 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); diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp index c878dab5..2c11626a 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_get.cpp @@ -176,18 +176,9 @@ bool dLytMsgWindowGet_c::execute() { } void dLytMsgWindowGet_c::draw() { - // NONMATCHING - // The instruction patterns here are the same that EGG::StateGX::Scoped - // generates, but there's no RAII to be found here. What's the missing - // link that makes the compiler generate these? - // When you fix this, fix other instances of this problem - // by searching for 91657b77 - bool bVis[5] = { - mpPanes[0]->IsVisible(), - mpPanes[1]->IsVisible(), - mpPanes[2]->IsVisible(), - mpPanes[3]->IsVisible(), - mpPanes[4]->IsVisible(), + bool bVis[5]; + for (int i = 0; i < 5; ++i) { + bVis[i] = mpPanes[i]->IsVisible(); }; mpPanes[0]->SetVisible(bVis[0]); @@ -207,11 +198,9 @@ void dLytMsgWindowGet_c::draw() { mLyt.draw(); - mpPanes[0]->SetVisible(bVis[0]); - mpPanes[1]->SetVisible(bVis[1]); - mpPanes[2]->SetVisible(bVis[2]); - mpPanes[3]->SetVisible(bVis[3]); - mpPanes[4]->SetVisible(bVis[4]); + for (int i = 0; i < 5; ++i) { + mpPanes[i]->SetVisible(bVis[i]); + }; } void dLytMsgWindowGet_c::open(dAcObjBase_c *obj, u32 param) { diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp index 12c9dc7b..11186160 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_link.cpp @@ -1,8 +1,8 @@ #include "d/lyt/msg_window/d_lyt_msg_window_link.h" #include "common.h" -#include "d/d_tag_processor.h" #include "d/d_lyt_hio.h" +#include "d/d_tag_processor.h" #include "d/lyt/d2d.h" #include "d/lyt/d_textbox.h" #include "d/lyt/msg_window/d_lyt_msg_window_common.h" @@ -17,10 +17,10 @@ STATE_DEFINE(dLytMsgWindowLink_c, Visible); STATE_DEFINE(dLytMsgWindowLink_c, Out); static const d2d::LytBrlanMapping brlanMap[] = { - { "linkWindow_00_in.brlan", "G_inOut_00"}, - { "linkWindow_00_out.brlan", "G_inOut_00"}, - {"linkWindow_00_position.brlan", "G_position_00"}, - {"linkWindow_00_loop.brlan", "G_loop_00"}, + { "linkWindow_00_in.brlan", "G_inOut_00"}, + { "linkWindow_00_out.brlan", "G_inOut_00"}, + {"linkWindow_00_position.brlan", "G_position_00"}, + { "linkWindow_00_loop.brlan", "G_loop_00"}, }; #define LINK_ANIM_IN 0 @@ -98,7 +98,7 @@ bool dLytMsgWindowLink_c::build(d2d::ResAccIf_c *resAcc1, d2d::ResAccIf_c *resAc mParam = 0; mOffset.x = mOffset.y = 0.0f; - + mWaitDelay = 0; mStateMgr.changeState(StateID_Invisible); @@ -239,16 +239,9 @@ bool dLytMsgWindowLink_c::execute() { } void dLytMsgWindowLink_c::draw() { - // NONMATCHING - // The instruction patterns here are the same that EGG::StateGX::Scoped - // generates, but there's no RAII to be found here. What's the missing - // link that makes the compiler generate these? - // When you fix this, fix other instances of this problem - // by searching for 91657b77 - bool bVis[3] = { - mpPanes[0]->IsVisible(), - mpPanes[1]->IsVisible(), - mpPanes[2]->IsVisible(), + bool bVis[3]; + for (int i = 0; i < 3; ++i) { + bVis[i] = mpPanes[i]->IsVisible(); }; mpPanes[0]->SetVisible(bVis[0]); @@ -266,9 +259,9 @@ void dLytMsgWindowLink_c::draw() { mLyt.draw(); - mpPanes[0]->SetVisible(bVis[0]); - mpPanes[1]->SetVisible(bVis[1]); - mpPanes[2]->SetVisible(bVis[2]); + for (int i = 0; i < 3; ++i) { + mpPanes[i]->SetVisible(bVis[i]); + }; } void dLytMsgWindowLink_c::open(dAcObjBase_c *obj, u32 param) { diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp index 66e226ea..beaa50f7 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_talk.cpp @@ -1,8 +1,8 @@ #include "d/lyt/msg_window/d_lyt_msg_window_talk.h" #include "common.h" -#include "d/d_tag_processor.h" #include "d/d_lyt_hio.h" +#include "d/d_tag_processor.h" #include "d/lyt/d2d.h" #include "d/lyt/d_textbox.h" #include "d/lyt/msg_window/d_lyt_msg_window_common.h" @@ -239,16 +239,9 @@ bool dLytMsgWindowTalk_c::execute() { } void dLytMsgWindowTalk_c::draw() { - // NONMATCHING - // The instruction patterns here are the same that EGG::StateGX::Scoped - // generates, but there's no RAII to be found here. What's the missing - // link that makes the compiler generate these? - // When you fix this, fix other instances of this problem - // by searching for 91657b77 - bool bVis[3] = { - mpPanes[0]->IsVisible(), - mpPanes[1]->IsVisible(), - mpPanes[2]->IsVisible(), + bool bVis[3]; + for (int i = 0; i < 3; ++i) { + bVis[i] = mpPanes[i]->IsVisible(); }; mpPanes[0]->SetVisible(bVis[0]); @@ -264,9 +257,9 @@ void dLytMsgWindowTalk_c::draw() { mLyt.draw(); - mpPanes[0]->SetVisible(bVis[0]); - mpPanes[1]->SetVisible(bVis[1]); - mpPanes[2]->SetVisible(bVis[2]); + for (int i = 0; i < 3; ++i) { + mpPanes[i]->SetVisible(bVis[i]); + }; } void dLytMsgWindowTalk_c::open(dAcObjBase_c *obj, u32 param) { diff --git a/src/toBeSorted/d_flow_mgr.cpp b/src/toBeSorted/d_flow_mgr.cpp new file mode 100644 index 00000000..b7b073ab --- /dev/null +++ b/src/toBeSorted/d_flow_mgr.cpp @@ -0,0 +1,5 @@ +#include "toBeSorted/d_flow_mgr.h" + +dFlowMgrBase_c::dFlowMgrBase_c(dFlow_c *flow): mpFlow(flow) {} + +dFlowMgr_c::dFlowMgr_c() : dFlowMgrBase_c(&mFlow) {} 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 {