summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-10-05 23:40:42 +0200
committerrobojumper <robojumper@gmail.com>2025-10-05 23:40:42 +0200
commitc46b2ba5e19651bb209cdf13578f8a671bf8cc09 (patch)
tree0c587a9084dbe6d7a089719372902bc4471fc58d
parentbaa508795496e8c13b5e8648d219f7f37b029fd6 (diff)
Scaffold markers
-rw-r--r--config/SOUE01/symbols.txt130
-rw-r--r--include/d/a/d_a_item.h1
-rw-r--r--include/d/a/obj/d_a_obj_save.h10
-rw-r--r--include/d/flag/storyflag_map.h24
-rw-r--r--include/d/lyt/d_lyt_map.h11
-rw-r--r--include/d/lyt/d_lyt_map_global.h20
-rw-r--r--include/d/lyt/d_lyt_map_markers.h353
-rw-r--r--include/toBeSorted/misc_actor.h5
-rw-r--r--src/d/lyt/d_lyt_map.cpp78
-rw-r--r--src/d/lyt/d_lyt_map_markers.cpp819
10 files changed, 1195 insertions, 256 deletions
diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt
index 4ad206c6..f81c848c 100644
--- a/config/SOUE01/symbols.txt
+++ b/config/SOUE01/symbols.txt
@@ -7761,15 +7761,15 @@ __ct__16dLytMapPinIcon_cFv = .text:0x80134780; // type:function size:0x134
__dt__25dLytMapPinIconAggregate_cFv = .text:0x801348C0; // type:function size:0xCC
__ct__16dLytMapMarkers_cFv = .text:0x80134990; // type:function size:0x464
__dt__14dLytMapPopup_cFv = .text:0x80134E00; // type:function size:0x74
-__ct__13MapUnkStruct1Fv = .text:0x80134E80; // type:function size:0x10
-__dt__13MapUnkStruct1Fv = .text:0x80134E90; // type:function size:0x40
-__ct__13MapUnkStruct2Fv = .text:0x80134ED0; // type:function size:0x4
-__dt__13MapUnkStruct2Fv = .text:0x80134EE0; // type:function size:0x40
-__ct__13MapUnkStruct3Fv = .text:0x80134F20; // type:function size:0x10
-__dt__13MapUnkStruct3Fv = .text:0x80134F30; // type:function size:0x40
+__ct__17dLytMapPopupStateFv = .text:0x80134E80; // type:function size:0x10
+__dt__17dLytMapPopupStateFv = .text:0x80134E90; // type:function size:0x40
+__ct__24dLytMapIcon01DrawCommandFv = .text:0x80134ED0; // type:function size:0x4
+__dt__24dLytMapIcon01DrawCommandFv = .text:0x80134EE0; // type:function size:0x40
+__ct__18dLytMapPopupConfigFv = .text:0x80134F20; // type:function size:0x10
+__dt__18dLytMapPopupConfigFv = .text:0x80134F30; // type:function size:0x40
__dt__15dLytMapIcon01_cFv = .text:0x80134F70; // type:function size:0xBC
-__ct__13MapUnkStruct4Fv = .text:0x80135030; // type:function size:0x4
-__dt__13MapUnkStruct4Fv = .text:0x80135040; // type:function size:0x40
+__ct__24dLytMapIcon00DrawCommandFv = .text:0x80135030; // type:function size:0x4
+__dt__24dLytMapIcon00DrawCommandFv = .text:0x80135040; // type:function size:0x40
__dt__14dLytMapPlace_cFv = .text:0x80135080; // type:function size:0x74
__dt__15dLytMapIcon00_cFv = .text:0x80135100; // type:function size:0x108
__dt__16dLytMapMarkers_cFv = .text:0x80135210; // type:function size:0x234
@@ -7899,12 +7899,10 @@ initializeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x80140580; /
executeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x801405C0; // type:function size:0xF4
finalizeState_ResetPosWithFloorChange__13dLytMapMain_cFv = .text:0x801406C0; // type:function size:0x4
initializeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406D0; // type:function size:0x20
-executeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406F0; // type:function size:0x3C
-fn_8014072C = .text:0x8014072C; // type:function size:0x4
+executeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x801406F0; // type:function size:0x40
finalizeState_EventSwBankSmall_Step1__13dLytMapMain_cFv = .text:0x80140730; // type:function size:0x4
initializeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140740; // type:function size:0x38
-executeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140780; // type:function size:0x34
-fn_801407B4 = .text:0x801407B4; // type:function size:0x4
+executeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x80140780; // type:function size:0x38
finalizeState_EventSwBankSmall_Step2__13dLytMapMain_cFv = .text:0x801407C0; // type:function size:0x4
initializeState_EventSwBankSmall_Step3__13dLytMapMain_cFv = .text:0x801407D0; // type:function size:0x18
executeState_EventSwBankSmall_Step3__13dLytMapMain_cFv = .text:0x801407F0; // type:function size:0x28
@@ -9927,13 +9925,13 @@ remove__15dLytMapIcon01_cFv = .text:0x8017B030; // type:function size:0x70
execute__15dLytMapIcon01_cFv = .text:0x8017B0A0; // type:function size:0x2B8
draw__15dLytMapIcon01_cFv = .text:0x8017B360; // type:function size:0x704
resetDrawCommands__15dLytMapIcon01_cFv = .text:0x8017BA70; // type:function size:0x4FC
-setMapIcons = .text:0x8017BF70; // type:function size:0x2C8
+loadFlags__15dLytMapIcon01_cFv = .text:0x8017BF70; // type:function size:0x2C8
setLinkTunic__15dLytMapIcon01_cFl = .text:0x8017C240; // type:function size:0x98
-drawAreaLight__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C2E0; // type:function size:0xA0
-drawCloud__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C380; // type:function size:0xA0
-setGoddessStatue__15dLytMapIcon01_cFb = .text:0x8017C420; // type:function size:0x74
-drawSaveObj__15dLytMapIcon01_cFlPQ34nw4r3lyt4Pane = .text:0x8017C4A0; // type:function size:0xA0
-fn_8017C540 = .text:0x8017C540; // type:function size:0x1C
+setAreaLight__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C2E0; // type:function size:0xA0
+setCloud__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C380; // type:function size:0xA0
+setGoddessStatue__15dLytMapIcon01_cFUl = .text:0x8017C420; // type:function size:0x74
+setSaveObj__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017C4A0; // type:function size:0xA0
+setTerry__15dLytMapIcon01_cFb = .text:0x8017C540; // type:function size:0x1C
fn_8017C560 = .text:0x8017C560; // type:function size:0x80
fn_8017C5E0 = .text:0x8017C5E0; // type:function size:0x80
fn_8017C660 = .text:0x8017C660; // type:function size:0x80
@@ -9954,47 +9952,47 @@ drawWithAnimOut__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Panef = .text:0x8017CBF0; // t
drawFullyIn__15dLytMapIcon01_cFUlPQ34nw4r3lyt4Pane = .text:0x8017CCB0; // type:function size:0xAC
checkMapMode__15dLytMapIcon01_cFv = .text:0x8017CD60; // type:function size:0xAC
setupActorDrawCommands__15dLytMapIcon01_cFv = .text:0x8017CE10; // type:function size:0x150
-fn_8017CF60 = .text:0x8017CF60; // type:function size:0xFC
+setupNpcKenseiDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017CF60; // type:function size:0xFC
setupTboxDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D060; // type:function size:0xF4
setupTboxDrawCommandClosed__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D160; // type:function size:0x17C
setupTboxDrawCommandOpen__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D2E0; // type:function size:0xB4
setupTboxDrawCommandGoddessClosed__15dLytMapIcon01_cFP9dAcTbox_c = .text:0x8017D3A0; // type:function size:0xB4
-fn_8017D460 = .text:0x8017D460; // type:function size:0x3E4
-fn_8017D850 = .text:0x8017D850; // type:function size:0x3F4
-fn_8017DC50 = .text:0x8017DC50; // type:function size:0x398
-fn_8017DFF0 = .text:0x8017DFF0; // type:function size:0x478
-fn_8017E470 = .text:0x8017E470; // type:function size:0x2B0
-fn_8017E720 = .text:0x8017E720; // type:function size:0x190
-fn_8017E8B0 = .text:0x8017E8B0; // type:function size:0xFC
-fn_8017E9B0 = .text:0x8017E9B0; // type:function size:0xA20
-fn_8017F3D0 = .text:0x8017F3D0; // type:function size:0x110
-fn_8017F4E0 = .text:0x8017F4E0; // type:function size:0x1C0
-fn_8017F6A0 = .text:0x8017F6A0; // type:function size:0x1D8
+setupObjShutterDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D460; // type:function size:0x3E4
+setupObjDoorDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017D850; // type:function size:0x3F4
+setupObjSaveDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017DC50; // type:function size:0x398
+setupObjLightLineDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017DFF0; // type:function size:0x478
+setupNpcBNusiDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E470; // type:function size:0x2B0
+setupObjTerryShopDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E720; // type:function size:0x190
+setupObjRoAtTargetDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E8B0; // type:function size:0xFC
+setupObjD3DummyDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017E9B0; // type:function size:0xA20
+setupObjSealedDoorDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F3D0; // type:function size:0x110
+setupObjHarpHintDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F4E0; // type:function size:0x1C0
+setupNpcBeeDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F6A0; // type:function size:0x1D8
setupStageDrawCommands__15dLytMapIcon01_cFv = .text:0x8017F880; // type:function size:0xA8
-fn_8017F930 = .text:0x8017F930; // type:function size:0x268
-fn_8017FBA0 = .text:0x8017FBA0; // type:function size:0x954
-fn_80180500 = .text:0x80180500; // type:function size:0x750
-fn_80180C50 = .text:0x80180C50; // type:function size:0x1C8
-fn_80180E20 = .text:0x80180E20; // type:function size:0x134
-fn_80180F60 = .text:0x80180F60; // type:function size:0x240
+setupTgMapMarkDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x8017F930; // type:function size:0x268
+setupTgMapMarkDrawCommand1__15dLytMapIcon01_cFP12dTgMapMark_c = .text:0x8017FBA0; // type:function size:0x954
+setupTgMapMarkDrawCommand2__15dLytMapIcon01_cFP12dTgMapMark_c = .text:0x80180500; // type:function size:0x750
+setupTgMapInstDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180C50; // type:function size:0x1C8
+setupTgForceGetFlagDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180E20; // type:function size:0x134
+setupTgInsectDrawCommand__15dLytMapIcon01_cFP9dAcBase_c = .text:0x80180F60; // type:function size:0x240
setupLinkDrawCommand__15dLytMapIcon01_cFv = .text:0x801811A0; // type:function size:0x50
-fn_801811F0 = .text:0x801811F0; // type:function size:0x14C
-fn_80181340 = .text:0x80181340; // type:function size:0x1B8
-fn_80181500 = .text:0x80181500; // type:function size:0xC8
+setupLinkDrawCommand1__15dLytMapIcon01_cFP7dAcPy_c = .text:0x801811F0; // type:function size:0x14C
+setupLinkDrawCommand2__15dLytMapIcon01_cFv = .text:0x80181340; // type:function size:0x1B8
+setupCloudBigDrawCommand__15dLytMapIcon01_cFv = .text:0x80181500; // type:function size:0xC8
setupTriforceDrawCommands__15dLytMapIcon01_cFv = .text:0x801815D0; // type:function size:0x130
-fn_80181700 = .text:0x80181700; // type:function size:0x178
-fn_80181880 = .text:0x80181880; // type:function size:0xC4
-fn_80181950 = .text:0x80181950; // type:function size:0x30
-fn_80181980 = .text:0x80181980; // type:function size:0x64
-fn_801819F0 = .text:0x801819F0; // type:function size:0xB0
-fn_80181AA0 = .text:0x80181AA0; // type:function size:0x11C
-fn_80181BC0 = .text:0x80181BC0; // type:function size:0x78
+updateScale__15dLytMapIcon01_cFv = .text:0x80181700; // type:function size:0x178
+fn_80181880__15dLytMapIcon01_cCFPQ34nw4r3lyt4PanePQ34nw4r3lyt4PaneR7mVec2_c = .text:0x80181880; // type:function size:0xC4
+recordAnimVisState__15dLytMapIcon01_cFv = .text:0x80181950; // type:function size:0x30
+transitionAnims__15dLytMapIcon01_cFv = .text:0x80181980; // type:function size:0x64
+checkBoundingPointing__15dLytMapIcon01_cFv = .text:0x801819F0; // type:function size:0xB0
+sortPanes__15dLytMapIcon01_cFv = .text:0x80181AA0; // type:function size:0x11C
+isPointingAtBounding__15dLytMapIcon01_cCFPQ34nw4r3lyt4Pane = .text:0x80181BC0; // type:function size:0x78
fn_80181C40__15dLytMapIcon01_cFv = .text:0x80181C40; // type:function size:0x94
-fn_80181CE0 = .text:0x80181CE0; // type:function size:0x68C
-fn_80182370 = .text:0x80182370; // type:function size:0x78
-fn_801823F0 = .text:0x801823F0; // type:function size:0x28C
-fn_80182680 = .text:0x80182680; // type:function size:0x8C8
-fn_80182F50 = .text:0x80182F50; // type:function size:0x42C
+build__15dLytMapIcon00_cFPQ23d2d10ResAccIf_c = .text:0x80181CE0; // type:function size:0x68C
+remove__15dLytMapIcon00_cFv = .text:0x80182370; // type:function size:0x78
+execute__15dLytMapIcon00_cFv = .text:0x801823F0; // type:function size:0x28C
+draw__15dLytMapIcon00_cFv = .text:0x80182680; // type:function size:0x8C8
+resetDrawCommands__15dLytMapIcon00_cFv = .text:0x80182F50; // type:function size:0x42C
checksDungeonCompletionFlags = .text:0x80183380; // type:function size:0x1C0
fn_80183540 = .text:0x80183540; // type:function size:0x8
fn_80183550 = .text:0x80183550; // type:function size:0x8
@@ -10062,15 +10060,15 @@ fn_80189530 = .text:0x80189530; // type:function size:0x80
fn_801895B0 = .text:0x801895B0; // type:function size:0x114
fn_801896D0 = .text:0x801896D0; // type:function size:0x78
fn_80189750 = .text:0x80189750; // type:function size:0x74
-fn_801897D0 = .text:0x801897D0; // type:function size:0x168
-fn_80189940 = .text:0x80189940; // type:function size:0x8C
-fn_801899D0 = .text:0x801899D0; // type:function size:0xEC
-fn_80189AC0 = .text:0x80189AC0; // type:function size:0x68
+build__16dLytMapMarkers_cFPQ23d2d10ResAccIf_c = .text:0x801897D0; // type:function size:0x168
+remove__16dLytMapMarkers_cFv = .text:0x80189940; // type:function size:0x8C
+execute__16dLytMapMarkers_cFv = .text:0x801899D0; // type:function size:0xEC
+draw__16dLytMapMarkers_cFv = .text:0x80189AC0; // type:function size:0x68
setIslandNamesOn__16dLytMapMarkers_cFb = .text:0x80189B30; // type:function size:0x50
fn_80189B80 = .text:0x80189B80; // type:function size:0x4
-fn_80189B90 = .text:0x80189B90; // type:function size:0x27C
-fn_80189E10 = .text:0x80189E10; // type:function size:0xF4
-fn_80189F10 = .text:0x80189F10; // type:function size:0x8C
+drawPopups__16dLytMapMarkers_cFv = .text:0x80189B90; // type:function size:0x27C
+resetPopups__16dLytMapMarkers_cFv = .text:0x80189E10; // type:function size:0xF4
+loadPopups__16dLytMapMarkers_cFv = .text:0x80189F10; // type:function size:0x8C
getPouchSlotCount__Fb = .text:0x80189FA0; // type:function size:0x6C
isPouchItem = .text:0x8018A010; // type:function size:0x88
isItemShield__Fl = .text:0x8018A0A0; // type:function size:0x18
@@ -10420,11 +10418,11 @@ GoddessChestsOpenedCounter__getMaxGoddessChests = .text:0x80194820; // type:func
GoddessChestsOpenedCounter__init = .text:0x80194830; // type:function size:0x3C
angleToRotate = .text:0x80194870; // type:function size:0x194
fn_80194A10 = .text:0x80194A10; // type:function size:0xC
-fn_80194A20 = .text:0x80194A20; // type:function size:0xC
-fn_80194A30 = .text:0x80194A30; // type:function size:0x24
+getStatueType__10dAcOSave_cCFv = .text:0x80194A20; // type:function size:0xC
+getStatueNameId__10dAcOSave_cCFv = .text:0x80194A30; // type:function size:0x24
fn_80194A60 = .text:0x80194A60; // type:function size:0x2C
fn_80194A90 = .text:0x80194A90; // type:function size:0x58
-fn_80194AF0 = .text:0x80194AF0; // type:function size:0x28
+checkStatueFlag__10dAcOSave_cCFv = .text:0x80194AF0; // type:function size:0x28
fn_80194B20 = .text:0x80194B20; // type:function size:0x8
fn_80194B30 = .text:0x80194B30; // type:function size:0x44
fn_80194B80 = .text:0x80194B80; // type:function size:0x8
@@ -13507,7 +13505,7 @@ AcItem__isLifeTreeFruit = .text:0x80251060; // type:function size:0x8
AcItem__isItemAnyRupee = .text:0x80251070; // type:function size:0x34
AcItem__isItemAnyTear = .text:0x802510B0; // type:function size:0x8
AcItem__isBombRefill = .text:0x802510C0; // type:function size:0x8
-AcItem__isAnyTriforce = .text:0x802510D0; // type:function size:0x8
+isTriforce__9dAcItem_cCFv = .text:0x802510D0; // type:function size:0x8
fn_802510E0 = .text:0x802510E0; // type:function size:0x44
fn_80251130 = .text:0x80251130; // type:function size:0x44
fn_80251180 = .text:0x80251180; // type:function size:0x44
@@ -33865,7 +33863,7 @@ __vt__29sFState_c<16dLytMapPinIcon_c> = .data:0x80520B38; // type:object size:0x
lbl_80520B50 = .data:0x80520B50; // type:object size:0xC
lbl_80520B5C = .data:0x80520B5C; // type:object size:0xC
lbl_80520B68 = .data:0x80520B68; // type:object size:0xC
-lbl_80520B74 = .data:0x80520B74; // type:object size:0xC
+__vt__14dLytMapPlace_c = .data:0x80520B74; // type:object size:0xC
__vt__14dLytMapPopup_c = .data:0x80520B80; // type:object size:0xC
__vt__16dLytMapCapture_c = .data:0x80520B8C; // type:object size:0xC
__vt__55sFStateMgr_c<16dLytMapCapture_c,20sStateMethodUsr_FI_c> = .data:0x80520B98; // type:object size:0x30
@@ -35352,7 +35350,7 @@ lbl_8052A6D0 = .data:0x8052A6D0; // type:object size:0x88
jumptable_8052A758 = .data:0x8052A758; // type:object size:0xA4 scope:local
lbl_8052A7FC = .data:0x8052A7FC; // type:object size:0xC
lbl_8052A808 = .data:0x8052A808; // type:object size:0x18
-lbl_8052A820 = .data:0x8052A820; // type:object size:0x20
+__vt__16dLytMapMarkers_c = .data:0x8052A820; // type:object size:0x20
__vt__15dLytMapIcon00_c = .data:0x8052A840; // type:object size:0x20
__vt__15dLytMapIcon01_c = .data:0x8052A860; // type:object size:0x20
lbl_8052A880 = .data:0x8052A880; // type:object size:0x10
@@ -40125,8 +40123,8 @@ lbl_80572838 = .sdata:0x80572838; // type:object size:0x8
lbl_80572840 = .sdata:0x80572840; // type:object size:0x8
lbl_80572848 = .sdata:0x80572848; // type:object size:0x8
lbl_80572850 = .sdata:0x80572850; // type:object size:0x4
-lbl_80572854 = .sdata:0x80572854; // type:object size:0x8
-lbl_8057285C = .sdata:0x8057285C; // type:object size:0xC
+lbl_80572854 = .sdata:0x80572854; // type:object size:0x7 data:string
+lbl_8057285C = .sdata:0x8057285C; // type:object size:0x7 data:string
@LOCAL@build__10dLytNote_cFPQ23d2d10ResAccIf_c@sPaneName = .sdata:0x80572868; // type:object size:0x4 scope:local data:4byte
@8144 = .sdata:0x80572870; // type:object size:0x1 scope:local data:string
@24731 = .sdata:0x80572878; // type:object size:0x1 scope:local
diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h
index e0a6ae91..91bfba42 100644
--- a/include/d/a/d_a_item.h
+++ b/include/d/a/d_a_item.h
@@ -79,6 +79,7 @@ public:
static bool isRupee(ITEM_ID item);
static bool isKeyPiece(ITEM_ID item);
static bool isTreasure(ITEM_ID item);
+ bool isTriforce() const;
static bool getItemGetEventName(u16 item, const char **outName);
static void itemGetEventStart(dAcBase_c *);
diff --git a/include/d/a/obj/d_a_obj_save.h b/include/d/a/obj/d_a_obj_save.h
index 0c5a7e6e..9f2222a3 100644
--- a/include/d/a/obj/d_a_obj_save.h
+++ b/include/d/a/obj/d_a_obj_save.h
@@ -17,6 +17,16 @@ public:
STATE_FUNC_DECLARE(dAcOSave_c, LightShaft);
STATE_FUNC_DECLARE(dAcOSave_c, Escape);
+ bool checkStatueFlag() const;
+ u32 getStatueType() const;
+ u32 getStatueNameId() const;
+
+ enum StatueType {
+ TYPE_NORMAL = 0,
+ TYPE_OVERWORLD = 1,
+ TYPE_DUNGEON = 2,
+ };
+
private:
/* 0x??? */ STATE_MGR_DECLARE(dAcOSave_c);
};
diff --git a/include/d/flag/storyflag_map.h b/include/d/flag/storyflag_map.h
index 7e6b6743..759bf0ef 100644
--- a/include/d/flag/storyflag_map.h
+++ b/include/d/flag/storyflag_map.h
@@ -247,17 +247,17 @@ enum StoryFlags_e {
/** [Faron light pillar]
* Story Flag #46 (0x002E) - JP 805ACD67 0x80 / US 805A9AE7 0x80
*/
- STORYFLAG_46,
+ STORYFLAG_FARON_PILLAR_OPENED,
/** [Eldin light pillar]
* Story Flag #47 (0x002F) - JP 805ACD66 0x01 / US 805A9AE6 0x01
*/
- STORYFLAG_47,
+ STORYFLAG_ELDIN_PILLAR_OPENED,
/** [Lanayru light pillar (Eldin Volcano, Digging Mitts Cave, FS Entrance, Volcano Summit Waterfall layer 2 /
* Lanayru Mines layer 1 / Temple of Time layer 1)] Story Flag #48 (0x0030) - JP 805ACD66 0x02 / US 805A9AE6 0x02
*/
- STORYFLAG_48,
+ STORYFLAG_LANAYRU_PILLAR_OPENED,
/** [Talk to Headmaster to learn about Windmills]
* Story Flag #49 (0x0031) - JP 805ACD66 0x04 / US 805A9AE6 0x04
@@ -703,7 +703,7 @@ enum StoryFlags_e {
* Screen) (Faron Woods, Deep Woods, Inside Great Tree layer 1)] Story Flag #137 (0x0089) - JP 805ACD64 0x80 / US
* 805A9AE4 0x80
*/
- STORYFLAG_137,
+ STORYFLAG_FARON_DISCOVERED,
/** [Cutscene near sealed temple entrance first time in sealed grounds (Sealed Temple layer 1)]
* Story Flag #138 (0x008A) - JP 805ACD67 0x01 / US 805A9AE7 0x01
@@ -928,7 +928,7 @@ enum StoryFlags_e {
/** [Eldin Volcano Introductory Cutscene (Eldin Layer 1 only) (if set it activates Statue select screen on entering
* Eldin Pillar)] Story Flag #182 (0x00B6) - JP 805ACD66 0x20 / US 805A9AE6 0x20
*/
- STORYFLAG_182,
+ STORYFLAG_ELDIN_DISCOVERED,
/** [Earth Temple Introductory Cutscene]
* Story Flag #183 (0x00B7) - JP 805ACD66 0x40 / US 805A9AE6 0x40
@@ -968,7 +968,7 @@ enum StoryFlags_e {
/** [Lanayru Mines Introductory Cutscene (Lanayru Desert layer 1)]
* Story Flag #190 (0x00BE) - JP 805ACD6D 0x80 / US 805A9AED 0x80
*/
- STORYFLAG_190,
+ STORYFLAG_LANAYRU_DISCOVERED,
/** [(not implemented yet -- 7F62)]
* Story Flag #191 (0x00BF) - JP from 805ACE57 0x40 to 805ACE56 0x01 / US from 805A9BD7 0x40 to 805A9BD6 0x01
@@ -1425,7 +1425,7 @@ enum StoryFlags_e {
/** [Land on Fun Fun Island for first time (name on map appears)]
* Story Flag #281 (0x0119) - JP 805ACD7B 0x08 / US 805A9AFB 0x08
*/
- STORYFLAG_281,
+ STORYFLAG_FUN_FUN_ISLAND_DISCOVERED,
/** [Land on Lumpy Pumpkin Island for first time (name on map appears)]
* Story Flag #282 (0x011A) - JP 805ACD7B 0x10 / US 805A9AFB 0x10
@@ -1435,7 +1435,7 @@ enum StoryFlags_e {
/** [Talk to Beedle on his island for first time (name on map appears)]
* Story Flag #283 (0x011B) - JP 805ACD7B 0x20 / US 805A9AFB 0x20
*/
- STORYFLAG_283,
+ STORYFLAG_BEEDLE_ISLAND_DISCOVERED,
/** [Land on Bamboo Island for first time (name on map appears)]
* Story Flag #284 (0x011C) - JP 805ACD7B 0x40 / US 805A9AFB 0x40
@@ -1450,7 +1450,7 @@ enum StoryFlags_e {
/** [Talk to Strich at Bug Heaven for first time (name on map appears)]
* Story Flag #286 (0x011E) - JP 805ACD7A 0x01 / US 805A9AFA 0x01
*/
- STORYFLAG_286,
+ STORYFLAG_BUG_HAVEN_DISCOVERED,
/** []
* Story Flag #287 (0x011F) - JP 805ACD7A 0x02 / US 805A9AFA 0x02
@@ -1460,7 +1460,7 @@ enum StoryFlags_e {
/** [Bilocyte fight triggered]
* Story Flag #288 (0x0120) - JP 805ACD7A 0x04 / US 805A9AFA 0x04
*/
- STORYFLAG_288,
+ STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED,
/** [Owlan's wooden shield]
* Story Flag #289 (0x0121) - JP 805ACD7A 0x08 / US 805A9AFA 0x08
@@ -1917,7 +1917,7 @@ enum StoryFlags_e {
/** [Thunderhead entered for first time]
* Story Flag #379 (0x017B) - JP 805ACD85 0x02 / US 805A9B05 0x02
*/
- STORYFLAG_379,
+ STORYFLAG_THUNDERHEAD_ENTERED,
/** [Parrow gives his Crystal Sidequest (to find Orielle)]
* Story Flag #380 (0x017C) - JP 805ACD8A 0x40 / US 805A9B0A 0x40
@@ -3568,7 +3568,7 @@ enum StoryFlags_e {
/** [Enter Beedle's Shop for first time]
* Story Flag #709 (0x02C5) - JP 805ACDA2 0x80 / US 805A9B22 0x80
*/
- STORYFLAG_709,
+ STORYFLAG_BEEDLE_SHOP_ENTERED,
/** [Sets after Treasure dowsing]
* Story Flag #710 (0x02C6) - JP 805ACDA5 0x01 / US 805A9B25 0x01
diff --git a/include/d/lyt/d_lyt_map.h b/include/d/lyt/d_lyt_map.h
index 33bb92c1..82aab81b 100644
--- a/include/d/lyt/d_lyt_map.h
+++ b/include/d/lyt/d_lyt_map.h
@@ -596,11 +596,7 @@ private:
/* 0x0FA0 */ dLytMapFloorBtnMgr_c mFloorBtnMgr;
/* 0x16B4 */ dLytMapPinIconAggregate_c mPinIconAggregate;
/* 0x2060 */ dLytMapMarkers_c mMarkers;
-
- /* 0x5F54 */ u8 _0x5F54[0x64C0 - 0x5F54];
-
/* 0x64C0 */ dLytMapFootPrints_c mFootPrints;
-
/* 0x6664 */ dLytMapPutIcon_c mPutIcon;
/* 0x6704 */ dLytMapSaveObj_c mSaveObjs[12];
/* 0x79C4 */ dLytMapSaveCaption_c mSaveCaption;
@@ -674,7 +670,12 @@ private:
/* 0x8CAC */ u8 field_0x8CAC;
/* 0x8CAD */ u8 field_0x8CAD;
- /* 0x8CAE */ u8 _0x8CAE[0x8CBC - 0x8CAE];
+ /* 0x8CAE */ u8 _0x8CAE[0x8CB0 - 0x8CAE];
+
+ /* 0x8CB0 */ u32 field_0x8CB0;
+ /* 0x8CB4 */ UNKWORD field_0x8CB4;
+
+ /* 0x8CB8 */ u8 _0x8CB8[0x8CBC - 0x8CB8];
/* 0x8CBC */ nw4r::lyt::Bounding *mpMapBounding;
/* 0x8CC0 */ bool field_0x8CC0;
diff --git a/include/d/lyt/d_lyt_map_global.h b/include/d/lyt/d_lyt_map_global.h
index d5e14f60..c11584f4 100644
--- a/include/d/lyt/d_lyt_map_global.h
+++ b/include/d/lyt/d_lyt_map_global.h
@@ -116,6 +116,26 @@ public:
mFloor = floor;
}
+ u8 getField_0x4C() const {
+ return field_0x4C;
+ }
+
+ u8 getField_0x4D() const {
+ return field_0x4D;
+ }
+
+ u8 getField_0x4F() const {
+ return field_0x4F;
+ }
+
+ UNKWORD getField_0x50() const {
+ return field_0x50;
+ }
+
+ u8 getField_0x54() const {
+ return field_0x54;
+ }
+
void projectOntoMap(mVec2_c &result, const mVec3_c &position) const;
void unprojectFromMap(mVec3_c &result, const mVec2_c &position) const;
void unprojectFromMap(mVec3_c &result, const mVec2_c &position, const mAng &rot) const;
diff --git a/include/d/lyt/d_lyt_map_markers.h b/include/d/lyt/d_lyt_map_markers.h
index 1a995f65..b95d627b 100644
--- a/include/d/lyt/d_lyt_map_markers.h
+++ b/include/d/lyt/d_lyt_map_markers.h
@@ -13,14 +13,21 @@
class dAcBase_c;
class dAcTbox_c;
+class dAcPy_c;
+class dTgMapMark_c;
// Size: 0x1C
-struct MapUnkStruct1 {
+struct dLytMapPopupState {
public:
- MapUnkStruct1() {}
- ~MapUnkStruct1() {}
-
- /* 0x00 */ u8 _0x00[0x1C];
+ 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;
};
/**
@@ -44,32 +51,34 @@ public:
};
// Size: 0x20
-struct MapUnkStruct3 {
+struct dLytMapPopupConfig {
public:
- MapUnkStruct3() {}
- ~MapUnkStruct3() {}
+ dLytMapPopupConfig() : textPos(0.0f, 0.0f) {}
+ ~dLytMapPopupConfig() {}
- /* 0x00 */ UNKWORD field_0x00;
+ /* 0x00 */ s32 cmdIdx;
/* 0x04 */ nw4r::lyt::Bounding *bounding;
- /* 0x08 */ f32 field_0x08;
- /* 0x0C */ f32 field_0x0C;
- /* 0x10 */ mVec2_c field_0x10;
- /* 0x18 */ u8 field_0x18;
- /* 0x19 */ u8 field_0x19;
- /* 0x1C */ const char *field_0x1C;
+ /* 0x08 */ mVec2_c textPos;
+ /* 0x10 */ mVec2_c boundingPos;
+ /* 0x18 */ bool pointedAt;
+ /* 0x19 */ u8 objId;
+ /* 0x1C */ const char *labelPrefix;
};
-// Size: 0xC
-struct MapUnkStruct4 {
+/**
+ * Copy of dLytMapIcon01DrawCommand
+ *
+ * Size: 0xC
+ */
+struct dLytMapIcon00DrawCommand {
public:
- MapUnkStruct4() {}
- ~MapUnkStruct4() {}
-
- /* 0x00 */ f32 field_0x00;
- /* 0x04 */ f32 field_0x04;
- /* 0x08 */ u16 field_0x08;
- /* 0x0A */ u8 field_0x0A;
- /* 0x0B */ u8 field_0x0B;
+ dLytMapIcon00DrawCommand() {}
+ ~dLytMapIcon00DrawCommand() {}
+
+ /* 0x00 */ mVec2_c position;
+ /* 0x08 */ mAng rotation;
+ /* 0x0A */ u8 paneIdx;
+ /* 0x0B */ u8 passIdx;
};
/**
@@ -82,19 +91,25 @@ struct dLytMapIconAnimState {
public:
// no ctor/dtor
- /* 0x00 */ UNKWORD cmdIndex;
+ /* 0x00 */ s32 cmdIndex;
/* 0x04 */ f32 frame;
- /* 0x08 */ u8 animIn;
- /* 0x09 */ u8 animOut;
- /* 0x0A */ u8 idleVisible;
- /* 0x0B */ u8 field_0x0B;
- /* 0x0C */ bool visible;
+ /* 0x08 */ bool animIn;
+ /* 0x09 */ bool animOut;
+ /* 0x0A */ bool visible;
+ /* 0x0B */ bool prevVisible;
+ /* 0x0C */ bool render;
};
/** 2D UI - Map - Popup text that appears when pointing at certain points of interest */
class dLytMapPopup_c {
public:
- dLytMapPopup_c() : mLabel("MAP_00") {}
+ dLytMapPopup_c()
+ : mLabel("MAP_00"),
+ mModeCheckResult(MODE_MAX),
+ field_0x178(0),
+ mMaxScale(0.0f),
+ field_0x180(0),
+ field_0x184(0) {}
virtual ~dLytMapPopup_c() {}
bool build(d2d::ResAccIf_c *resAcc);
@@ -103,18 +118,27 @@ public:
void draw();
void setLabel(const char *label);
+ void realizeText();
void setInout(f32 value);
f32 getTextRenderWidth() const;
+ f32 getInAnimDuration() const {
+ return mAnm[1].getLastFrame();
+ }
+
+ void setPosition(const mVec2_c &pos) {
+ mPosition = pos;
+ }
+
private:
enum ModeCheck_e {
MODE_TRANSITION_TO_ZOOM = 2,
MODE_TRANSITION_TO_STAGE = 3,
MODE_STABLE_STAGE = 4,
MODE_STABLE_ZOOM = 5,
+ MODE_MAX = 6,
};
- void realizeText();
void setInitialState();
void checkMapMode();
@@ -132,12 +156,14 @@ private:
/* 0x178 */ u8 field_0x178;
/* 0x17C */ f32 mMaxScale;
/* 0x180 */ UNKWORD field_0x180;
+ /* 0x184 */ UNKWORD field_0x184;
};
/** 2D UI - Map - Text holding area names (on the world/province view, or exits on the stage view) */
class dLytMapPlace_c {
public:
- dLytMapPlace_c() {}
+ dLytMapPlace_c()
+ : mLabel("MAP_02"), mModeCheckResult(MODE_MAX), field_0x1C0(0.0f), field_0x1C4(0.0f), mMaxScale(0.0f) {}
virtual ~dLytMapPlace_c() {}
bool build(d2d::ResAccIf_c *resAcc);
@@ -157,6 +183,7 @@ private:
MODE_TRANSITION_TO_STAGE = 3,
MODE_STABLE_STAGE = 4,
MODE_STABLE_ZOOM = 5,
+ MODE_MAX = 6,
};
void realizeText();
@@ -181,27 +208,25 @@ private:
/* 0x1D8 */ f32 mMaxScale;
};
-class dLytMapIcon00_c : public m2d::Base_c {
-public:
- dLytMapIcon00_c() {}
-
-private:
- /* 0x0104 */ d2d::LytBase_c mLyt;
- /* 0x0194 */ d2d::AnmGroup_c mAnm[29];
- /* 0x0970 */ dCursorHitCheckLyt_c mCsHitCheck;
- /* 0x0998 */ MapUnkStruct4 mUnk4[100];
- /* 0x0E5B */ u8 field_0x0E5B[100];
- /* 0x0F20 */ u8 field_0x0F20[100];
- /* 0x0F84 */ mVec3_c field_0x0F84[77];
- /* 0x1342 */ u8 field_0x1342[100];
- /* 0x13A8 */ u8 field_0x13A8[100];
- /* 0x1410 */ MapUnkStruct3 mUnk3[30];
- /* 0x1D70 */ dLytMapPlace_c mPlace;
-};
-
class dLytMapIcon01_c : public m2d::Base_c {
+ friend class dLytMapMarkers_c;
+
public:
- dLytMapIcon01_c() {}
+ dLytMapIcon01_c()
+ : field_0x000D(0),
+ mShowIslandNames(false),
+ mModeCheckResult(MODE_MAX),
+ field_0x0C70(0),
+ field_0x0C83(0),
+ field_0x0C84(0),
+ field_0x1838(0.0f),
+ field_0x183C(0.0f),
+ field_0x1840(0.0f),
+ field_0x1844(false),
+ field_0x1845(0),
+ field_0x1848(0),
+ field_0x184C(false),
+ field_0x184D(false) {}
virtual void draw() override;
virtual bool build(d2d::ResAccIf_c *resAcc);
virtual bool remove();
@@ -214,36 +239,69 @@ private:
MODE_TRANSITION_TO_STAGE = 3,
MODE_STABLE_STAGE = 4,
MODE_STABLE_ZOOM = 5,
+ MODE_MAX = 6,
};
void setupActorDrawCommands();
void setupStageDrawCommands();
void setupLinkDrawCommand();
+ void setupLinkDrawCommand1(dAcPy_c *ac);
+ void setupLinkDrawCommand2();
+ void setupCloudBigDrawCommand();
void setupTriforceDrawCommands();
- void setupUnkDrawCommand();
- void sortDrawCommands();
+ void sortPanes();
void setupTboxDrawCommand(dAcBase_c *actor);
void setupTboxDrawCommandGoddessClosed(dAcTbox_c *box);
void setupTboxDrawCommandOpen(dAcTbox_c *box);
void setupTboxDrawCommandClosed(dAcTbox_c *box);
+ void setupNpcKenseiDrawCommand(dAcBase_c *actor);
+ void setupObjShutterDrawCommand(dAcBase_c *actor);
+ void setupObjDoorDrawCommand(dAcBase_c *actor);
+ void setupObjSaveDrawCommand(dAcBase_c *actor);
+ void setupObjLightLineDrawCommand(dAcBase_c *actor);
+ void setupNpcBNusiDrawCommand(dAcBase_c *actor);
+ void setupObjTerryShopDrawCommand(dAcBase_c *actor);
+ void setupObjRoAtTargetDrawCommand(dAcBase_c *actor);
+ void setupObjD3DummyDrawCommand(dAcBase_c *actor);
+ void setupObjSealedDoorDrawCommand(dAcBase_c *actor);
+ void setupObjHarpHintDrawCommand(dAcBase_c *actor);
+ void setupNpcBeeDrawCommand(dAcBase_c *actor);
+
+ void setupTgMapMarkDrawCommand(dAcBase_c *actor);
+ void setupTgMapMarkDrawCommand1(dTgMapMark_c *actor);
+ void setupTgMapMarkDrawCommand2(dTgMapMark_c *actor);
+ void setupTgMapInstDrawCommand(dAcBase_c *actor);
+ void setupTgForceGetFlagDrawCommand(dAcBase_c *actor);
+ void setupTgInsectDrawCommand(dAcBase_c *actor);
void setLinkTunic(s32 type);
- void setGoddessStatue(bool present);
+ void setGoddessStatue(u32 present);
void setTerry(bool present);
- void drawAreaLight(s32 color, nw4r::lyt::Pane *pane);
- void drawSaveObj(s32 color, nw4r::lyt::Pane *pane);
- void drawCloud(s32 alpha, nw4r::lyt::Pane *pane);
+ void setAreaLight(u32 color, nw4r::lyt::Pane *pane);
+ void setCloud(u32 alpha, nw4r::lyt::Pane *pane);
+ void setSaveObj(u32 color, nw4r::lyt::Pane *pane);
void drawWithAnimIn(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame);
void drawWithAnimOut(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame);
void drawFullyIn(u32 paneIdx, nw4r::lyt::Pane *pane);
+
void fn_80181C40();
+ void fn_80181880(nw4r::lyt::Pane *, nw4r::lyt::Pane *, mVec2_c &) const;
+
void checkMapMode();
void loadFlags();
+ void updateScale();
+
+ void recordAnimVisState();
+ void transitionAnims();
+ void checkBoundingPointing();
+ bool isPointingAtBounding(nw4r::lyt::Pane *pane) const;
+ /* 0x000D */ u8 field_0x000D;
+ /* 0x000E */ bool mShowIslandNames;
/* 0x0010 */ nw4r::lyt::Bounding *mpBoundings[59];
/* 0x00FC */ nw4r::lyt::Pane *mpSpecialPanes[27];
/* 0x0168 */ nw4r::lyt::Pane *mpSpecialPictures[27];
@@ -256,28 +314,27 @@ private:
/* 0x07BC */ dLytMapIcon01DrawCommand mCommands[100];
/* 0x0C6C */ s32 mModeCheckResult;
/* 0x0C70 */ s32 field_0x0C70;
-
- /* 0x0C74 */ u8 field_0x0C74;
- /* 0x0C75 */ u8 field_0x0C75;
- /* 0x0C76 */ u8 field_0x0C76;
- /* 0x0C77 */ u8 field_0x0C77;
- /* 0x0C78 */ u8 field_0x0C78;
- /* 0x0C79 */ u8 field_0x0C79;
- /* 0x0C7A */ u8 field_0x0C7A;
- /* 0x0C7B */ u8 field_0x0C7B;
- /* 0x0C7C */ u8 field_0x0C7C;
- /* 0x0C7D */ u8 field_0x0C7D;
- /* 0x0C7E */ u8 field_0x0C7E;
- /* 0x0C7F */ u8 field_0x0C7F;
- /* 0x0C80 */ u8 field_0x0C80;
- /* 0x0C81 */ u8 field_0x0C81;
- /* 0x0C82 */ u8 field_0x0C82;
+ /* 0x0C74 */ bool mFunFunIslandDiscovered;
+ /* 0x0C75 */ bool mLumpyPumkpinDiscovered;
+ /* 0x0C76 */ bool mBeedleIslandDiscovered;
+ /* 0x0C77 */ bool mBambooIslandDiscovered;
+ /* 0x0C78 */ bool mIsleOfSongsDiscovered;
+ /* 0x0C79 */ bool mBugHavenDiscovered;
+ /* 0x0C7A */ bool mBilocyteFightTriggered;
+ /* 0x0C7B */ bool mFaronPillarOpened;
+ /* 0x0C7C */ bool mFaronDiscovered;
+ /* 0x0C7D */ bool mEldinPillarOpened;
+ /* 0x0C7E */ bool mEldinDiscovered;
+ /* 0x0C7F */ bool mLanayruPillarOpened;
+ /* 0x0C80 */ bool mLanaryuDiscovered;
+ /* 0x0C81 */ bool mThunderheadEntered;
+ /* 0x0C82 */ bool mBeedleShopEntered;
/* 0x0C83 */ u8 field_0x0C83;
/* 0x0C84 */ u8 field_0x0C84;
/* 0x0C85 */ u8 field_0x0C85[100];
/* 0x0CE9 */ u8 mPassIdxes[35];
- /* 0x0D0C */ s32 field_0xD0C;
- /* 0x0D10 */ s32 field_0xD10;
+ /* 0x0D0C */ s32 mCurrentFloor;
+ /* 0x0D10 */ s32 mLastFloor;
/* 0x0D14 */ u8 mNumCommandsPerPass[35];
/* 0x0D37 */ u8 mNumCommands;
@@ -296,41 +353,149 @@ private:
/* 0x0DAF */ u8 _0x0DAF[0x0E13 - 0x0DAF];
/* 0x0E13 */ u8 field_0x0E13;
- /* 0x0E14 */ MapUnkStruct3 mUnk3[56];
+ /* 0x0E14 */ dLytMapPopupConfig mPopupConfigs[56];
/* 0x1514 */ dLytMapIconAnimState mIconAnims[50];
/* 0x1834 */ s32 mNumAnims;
/* 0x1838 */ f32 field_0x1838;
/* 0x183C */ f32 field_0x183C;
-
- /* 0x1840 */ u8 _0x183C[0x1845 - 0x1840];
-
+ /* 0x1840 */ f32 field_0x1840;
+ /* 0x1844 */ bool field_0x1844;
/* 0x1845 */ u8 field_0x1845;
- /* 0x1846 */ u8 _0x1846[0x184C - 0x1846];
+ /* 0x1848 */ UNKWORD field_0x1848;
/* 0x184C */ bool field_0x184C;
+ /* 0x184D */ bool field_0x184D;
+};
+
+class dLytMapIcon00_c : public m2d::Base_c {
+public:
+ dLytMapIcon00_c()
+ : mModeCheckResult(MODE_MAX),
+ field_0x0E4C(0),
+ field_0x0E59(0),
+ field_0x0E5A(0),
+ field_0x13A6(0),
+ field_0x13A7(0),
+ field_0x1CD0(0.0f, 0.0f, 0.0f),
+ field_0x1CDC(0),
+ field_0x1CDD(0),
+ field_0x1CDE(0),
+ field_0x1CE0(0),
+ field_0x1CE4(0),
+ field_0x1CE5(0),
+ field_0x1CE6(0),
+ field_0x1CE7(0) {}
+
+ virtual void draw() override;
+ virtual bool build(d2d::ResAccIf_c *resAcc);
+ virtual bool remove();
+ virtual bool execute();
+ virtual void resetDrawCommands();
+
+private:
+ enum ModeCheck_e {
+ MODE_TRANSITION_TO_ZOOM = 2,
+ MODE_TRANSITION_TO_STAGE = 3,
+ MODE_STABLE_STAGE = 4,
+ MODE_STABLE_ZOOM = 5,
+ MODE_MAX = 6,
+ };
+
+ void fn_80189750();
+
+ /* 0x0010 */ u8 _0x0010[0x0104 - 0x0010];
+
+ /* 0x0104 */ d2d::LytBase_c mLyt;
+ /* 0x0194 */ d2d::AnmGroup_c mAnm[29];
+
+ /* 0x08D4 */ u8 _0x08D4[0x0970 - 0x08D4];
+
+ /* 0x0970 */ dCursorHitCheckLyt_c mCsHitCheck;
+ /* 0x0998 */ dLytMapIcon00DrawCommand mCommands[100];
+ /* 0x0E48 */ s32 mModeCheckResult;
+ /* 0x0E4C */ UNKWORD field_0x0E4C;
+ /* 0x0E50 */ u8 field_0x0E50;
+ /* 0x0E51 */ u8 field_0x0E51;
+ /* 0x0E52 */ u8 field_0x0E52;
+ /* 0x0E53 */ u8 field_0x0E53;
+ /* 0x0E54 */ u8 field_0x0E54;
+ /* 0x0E55 */ u8 field_0x0E55;
+ /* 0x0E56 */ u8 field_0x0E56;
+ /* 0x0E57 */ u8 field_0x0E57;
+ /* 0x0E58 */ u8 field_0x0E58;
+ /* 0x0E59 */ u8 field_0x0E59;
+ /* 0x0E59 */ u8 field_0x0E5A;
+ /* 0x0E5B */ u8 field_0x0E5B[100];
+
+ /* 0x0EC0 */ u8 _0x0EC0[0x0EE4 - 0x0EC0];
+
+ /* 0x0EE4 */ s32 mNumCommands;
+ /* 0x0EE8 */ s32 field_0x0EE8;
+ /* 0x0EEC */ u8 field_0x0EEC[36];
+
+ /* 0x0F10 */ u8 _0x0F10[0x0F20 - 0x0F10];
+
+ /* 0x0F20 */ u8 field_0x0F20[100];
+
+ /* 0x0F84 */ mVec3_c field_0x0F84[77];
+
+ /* 0x1320 */ u8 _0x1320[0x1331 - 0x1320];
+
+ /* 0x1331 */ u8 mNumCommandsPerPass[17];
+ /* 0x1342 */ u8 field_0x1342[100];
+ /* 0x13A6 */ u8 field_0x13A6;
+ /* 0x13A6 */ u8 field_0x13A7;
+ /* 0x13A8 */ u8 field_0x13A8[100];
+ /* 0x140C */ u8 field_0x140C;
+ /* 0x1410 */ dLytMapPopupConfig mPopupConfigs[30];
+ /* 0x17D0 */ dLytMapPlace_c mPlace;
+ /* 0x19B8 */ dLytMapIconAnimState mIconAnims[50];
+ /* 0x1CCC */ s32 mNumAnims;
+ /* 0x1CD0 */ mVec3_c field_0x1CD0;
+ /* 0x1CDC */ u8 field_0x1CDC;
+ /* 0x1CDD */ u8 field_0x1CDD;
+ /* 0x1CDE */ u8 field_0x1CDE;
+ /* 0x1CE0 */ UNKWORD field_0x1CE0;
+ /* 0x1CE4 */ u8 field_0x1CE4;
+ /* 0x1CE5 */ u8 field_0x1CE5;
+ /* 0x1CE6 */ u8 field_0x1CE6;
+ /* 0x1CE7 */ u8 field_0x1CE7;
};
-// TODO, name made up
class dLytMapMarkers_c : public m2d::Base_c {
public:
- dLytMapMarkers_c() : field_0x6F0(0), field_0x0702(0), field_0x0703(0), field_0x0704(0.0f) {}
+ dLytMapMarkers_c()
+ : mShowIslandNames(false), field_0x0702(0), field_0x0703(0), field_0x0704(0.0f), mNumPopups(0) {}
virtual ~dLytMapMarkers_c() {}
virtual void draw() override;
- virtual void build(d2d::ResAccIf_c *resAcc);
+ virtual bool build(d2d::ResAccIf_c *resAcc);
+ virtual bool remove();
+ virtual bool execute();
void setIslandNamesOn(bool on);
- void fn_80189B90();
+ void drawPopups();
void setField_0x6F4(const mVec2_c &v) {
field_0x06F4 = v;
}
+ void setField_0x0703(u8 v) {
+ field_0x0703 = v;
+ }
+
+ f32 getField_0x0704() const {
+ return field_0x0704;
+ }
+
private:
- /* 0x0010 */ d2d::ResAccIf_c mResAcc1;
- /* 0x0380 */ d2d::ResAccIf_c mResAcc2;
+ void resetPopups();
+ void loadPopups();
- /* 0x06F0 */ u8 field_0x6F0;
+ /* 0x0010 */ d2d::ResAccIf_c mResAcc00;
+ /* 0x0380 */ d2d::ResAccIf_c mResAcc01;
+
+ /* 0x06F0 */ bool mShowIslandNames;
/* 0x06F4 */ mVec2_c field_0x06F4;
/* 0x06FC */ u8 _0x6FC[0x0702 - 0x06FC];
@@ -339,11 +504,11 @@ private:
/* 0x0702 */ u8 field_0x0703;
/* 0x0704 */ f32 field_0x0704;
/* 0x0708 */ dLytMapPopup_c mMapPopup;
- /* 0x088C */ u8 _0x088C[0x0894 - 0x088C];
- /* 0x0894 */ MapUnkStruct1 mUnk1[60];
-
- /* 0x0F30 */ dLytMapIcon01_c mIcon01;
- /* 0x2780 */ dLytMapIcon00_c mIcon00;
+ /* 0x0890 */ s32 mNumPopups;
+ /* 0x0894 */ dLytMapPopupState mPopups[60];
+ /* 0x0F24 */ const dLytMapPopupConfig *mpPopupConfigs;
+ /* 0x0F28 */ dLytMapIcon01_c mIcon01;
+ /* 0x2778 */ dLytMapIcon00_c mIcon00;
};
#endif
diff --git a/include/toBeSorted/misc_actor.h b/include/toBeSorted/misc_actor.h
index 081734e1..4024e1bc 100644
--- a/include/toBeSorted/misc_actor.h
+++ b/include/toBeSorted/misc_actor.h
@@ -1,6 +1,11 @@
#ifndef MISC_ACTOR_H
#define MISC_ACTOR_H
+// TODO - this header might be unnecessary; a lot of functions in
+// the split corresponding to this header clearly are REL functions
+// that were moved to the DOL because they need to be called from the DOL.
+// So ideally all of these declarations were moved to REL class definitions...
+
bool checkIsInSkykeepPuzzle();
void restoreSkykeepPuzzleFromGlobal();
diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp
index 97380752..29f03e66 100644
--- a/src/d/lyt/d_lyt_map.cpp
+++ b/src/d/lyt/d_lyt_map.cpp
@@ -2296,7 +2296,7 @@ void dLytMapMain_c::build() {
}
mMarkers.setField_0x6F4(boundingPos2);
-
+
mPinIconAggregate.setUnk(&field_0xF1C);
mpPaneBgAll01 = mLyt.findPane("N_mapBgAll_01");
@@ -2344,17 +2344,19 @@ void dLytMapMain_c::draw() {
mFootPrints.draw();
}
- if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM || mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
+ if (mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM ||
+ mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) {
mMarkers.draw();
}
if (field_0x8C68 != 3 && field_0x8C68 != 5 && field_0x8C94 != 2) {
mPinIconAggregate.draw();
}
-
+
fn_80143120(0);
- if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) && (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) {
+ if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mCurrentMapMode == dLytMapGlobal_c::MAPMODE_ZOOM) &&
+ (mNextMapMode == dLytMapGlobal_c::MAPMODE_STAGE || mNextMapMode == dLytMapGlobal_c::MAPMODE_ZOOM)) {
mpZoomInOutPane->SetVisible(false);
} else {
mpZoomInOutPane->SetVisible(true);
@@ -2362,11 +2364,12 @@ void dLytMapMain_c::draw() {
mpScaleFlamePane->SetVisible(field_0x8DB5 ? true : false);
mLyt.getLayout()->GetRootPane()->Draw(mLyt.getDrawInfo());
- if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) && field_0x8C94 == 10) {
+ if ((mCurrentMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE || mNextMapMode == dLytMapGlobal_c::MAPMODE_PROVINCE) &&
+ field_0x8C94 == 10) {
fn_80138D80();
}
fn_80143120(-2);
- mMarkers.fn_80189B90();
+ mMarkers.drawPopups();
mPutIcon.draw();
if (field_0x8C94 == 10) {
mPopupInfo.draw();
@@ -2844,23 +2847,68 @@ void dLytMapMain_c::executeState_ResetPos() {
}
void dLytMapMain_c::finalizeState_ResetPos() {}
-void dLytMapMain_c::initializeState_ResetPosWithFloorChange() {}
-void dLytMapMain_c::executeState_ResetPosWithFloorChange() {}
+void dLytMapMain_c::initializeState_ResetPosWithFloorChange() {
+ dPadNav::stopFSStickNav();
+ mMapCapture.renderRequest();
+}
+void dLytMapMain_c::executeState_ResetPosWithFloorChange() {
+ if (mMapCapture.isBusyRendering()) {
+ return;
+ }
+ dLytMapGlobal_c *global = getGlobal();
+ mVec3_c pos;
+ fn_80142F00(pos, mCurrentMapMode, mMapUpDirection, global->getMapRotationCenter(), global->getField_0x56());
+ if (global->getMapScroll().squareDistanceToXZ(pos) >= 1.0f) {
+ mStateMgr.changeState(StateID_ResetPos);
+ } else {
+ mStateMgr.changeState(StateID_Active);
+ }
+}
void dLytMapMain_c::finalizeState_ResetPosWithFloorChange() {}
-void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() {}
-void dLytMapMain_c::executeState_EventSwBankSmall_Step1() {}
+void dLytMapMain_c::initializeState_EventSwBankSmall_Step1() {
+ field_0x8CB0 = sHio.field_0x1D;
+ field_0x8CB4 = 0;
+}
+void dLytMapMain_c::executeState_EventSwBankSmall_Step1() {
+ if (field_0x8CB0 != 0) {
+ field_0x8CB0--;
+ return;
+ }
+
+ mMarkers.setField_0x0703(1);
+ mStateMgr.changeState(StateID_EventSwBankSmall_Step2);
+}
void dLytMapMain_c::finalizeState_EventSwBankSmall_Step1() {}
-void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() {}
-void dLytMapMain_c::executeState_EventSwBankSmall_Step2() {}
+void dLytMapMain_c::initializeState_EventSwBankSmall_Step2() {
+ field_0x8CB0 = mMarkers.getField_0x0704();
+}
+void dLytMapMain_c::executeState_EventSwBankSmall_Step2() {
+ if (field_0x8CB0 != 0) {
+ field_0x8CB0--;
+ return;
+ }
+ mStateMgr.changeState(StateID_EventSwBankSmall_Step3);
+}
void dLytMapMain_c::finalizeState_EventSwBankSmall_Step2() {}
-void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() {}
-void dLytMapMain_c::executeState_EventSwBankSmall_Step3() {}
+void dLytMapMain_c::initializeState_EventSwBankSmall_Step3() {
+ field_0x8CB0 = sHio.field_0x1E;
+}
+void dLytMapMain_c::executeState_EventSwBankSmall_Step3() {
+ if (field_0x8CB0 != 0) {
+ field_0x8CB0--;
+ return;
+ }
+
+ field_0x8D6B = 1;
+}
void dLytMapMain_c::finalizeState_EventSwBankSmall_Step3() {}
-void dLytMapMain_c::initializeState_EventMapIntro_Step1() {}
+void dLytMapMain_c::initializeState_EventMapIntro_Step1() {
+ field_0x8CB0 = sHio.field_0x1F;
+}
void dLytMapMain_c::executeState_EventMapIntro_Step1() {}
void dLytMapMain_c::finalizeState_EventMapIntro_Step1() {}
diff --git a/src/d/lyt/d_lyt_map_markers.cpp b/src/d/lyt/d_lyt_map_markers.cpp
index 7c866d6b..41863ddf 100644
--- a/src/d/lyt/d_lyt_map_markers.cpp
+++ b/src/d/lyt/d_lyt_map_markers.cpp
@@ -2,24 +2,34 @@
#include "common.h"
#include "d/a/d_a_base.h"
+#include "d/a/d_a_item.h"
#include "d/a/d_a_player.h"
+#include "d/a/obj/d_a_obj_base.h"
+#include "d/a/obj/d_a_obj_save.h"
#include "d/a/obj/d_a_obj_tbox.h"
+#include "d/d_cs_base.h"
#include "d/d_cursor_hit_check.h"
+#include "d/d_gfx.h"
#include "d/d_message.h"
#include "d/d_player.h"
#include "d/d_player_act.h"
#include "d/d_sc_game.h"
#include "d/d_stage.h"
+#include "d/d_stage_mgr.h"
#include "d/flag/dungeonflag_manager.h"
#include "d/flag/storyflag_manager.h"
#include "d/lyt/d2d.h"
#include "d/lyt/d_lyt_map_global.h"
#include "d/lyt/d_window.h"
#include "d/snd/d_snd_small_effect_mgr.h"
+#include "f/f_base.h"
+#include "f/f_manager.h"
#include "m/m_vec.h"
#include "nw4r/lyt/lyt_bounding.h"
#include "nw4r/lyt/lyt_pane.h"
#include "nw4r/lyt/lyt_types.h"
+#include "sized_string.h"
+#include "toBeSorted/arc_managers/layout_arc_manager.h"
inline mVec3_c vec2ToVec3XY(const mVec2_c &v) {
return mVec3_c(v.x, v.y, 0.0f);
@@ -627,6 +637,8 @@ static const char *sMapIcon01BoundingNames[] = {
#define MAP_ICON_01_BOUNDING_MUSHI_00 57
#define MAP_ICON_01_BOUNDING_AREALIGHT_00 58
+#define MAP_ICON_01_BOUNDING_COMMONICON_LAST (MAP_ICON_01_BOUNDING_COMMONICON_29 + 1)
+
#define MAP_ICON_01_NUM_BOUNDINGS 59
static const char *sMapIcon01SpecialPaneNames[] = {
@@ -705,10 +717,15 @@ static const char *sMapIcon01SpecialPictureNames[] = {
#define MAP_ICON_01_NUM_SPECIAL_PICTURES 27
+static const char *sSaveObjPrefix = "SAVEOBJ_NAME_";
static const char *sTerryOnOff = "N_terryOnOff_00";
bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) {
- // TODO - ...
+ field_0x1848 = 30;
+ mCurrentFloor = dLytMapGlobal_c::GetInstance()->getFloor();
+ field_0x0C83 = dLytMapGlobal_c::GetInstance()->getField_0x4F();
+ field_0x0C84 = dLytMapGlobal_c::GetInstance()->getField_0x4C();
+ mLastFloor = mCurrentFloor;
mpResAcc = resAcc;
mLyt.setResAcc(resAcc);
mLyt.build("mapIcon_01.brlyt", nullptr);
@@ -740,8 +757,8 @@ bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) {
}
// TODO - why 56 and not 59
- for (int i = 0; i < 56; i++) {
- mUnk3[i].bounding = mpBoundings[i];
+ for (int i = 0; i < MAP_ICON_01_BOUNDING_COMMONICON_LAST; i++) {
+ mPopupConfigs[i].bounding = mpBoundings[i];
}
for (int i = 0; i < MAP_ICON_01_NUM_BOUNDINGS; i++) {
@@ -766,32 +783,32 @@ bool dLytMapIcon01_c::build(d2d::ResAccIf_c *resAcc) {
}
checkMapMode();
+ loadFlags();
for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) {
mIconAnims[i].cmdIndex = 100;
mIconAnims[i].frame = 0.0f;
mIconAnims[i].animIn = false;
mIconAnims[i].animOut = false;
- mIconAnims[i].idleVisible = false;
- mIconAnims[i].field_0x0B = 0;
mIconAnims[i].visible = false;
+ mIconAnims[i].prevVisible = false;
+ mIconAnims[i].render = false;
}
setupActorDrawCommands();
setupStageDrawCommands();
setupLinkDrawCommand();
-
if (field_0x0C70 == 1) {
setupTriforceDrawCommands();
}
if (field_0x0C70 == 4) {
- setupUnkDrawCommand();
+ setupCloudBigDrawCommand();
}
- // TODO - ...
-
- sortDrawCommands();
+ recordAnimVisState();
+ transitionAnims();
+ sortPanes();
mCsHitCheck.init(mLyt.getLayout()->GetRootPane(), 0x1, 0, 0);
dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck);
@@ -814,10 +831,52 @@ bool dLytMapIcon01_c::execute() {
mAnm[MAP_ICON_01_ANIM_TRES_OUT + i].setAnimEnable(false);
}
}
- mLyt.calc();
+ resetDrawCommands();
checkMapMode();
loadFlags();
+ mCurrentFloor = dLytMapGlobal_c::GetInstance()->getFloor();
+ field_0x0C83 = dLytMapGlobal_c::GetInstance()->getField_0x4F();
+ field_0x0C84 = dLytMapGlobal_c::GetInstance()->getField_0x4C();
+
+ updateScale();
+ setupActorDrawCommands();
+ setupStageDrawCommands();
+ setupLinkDrawCommand();
+ if (field_0x0C70 == 1) {
+ setupTriforceDrawCommands();
+ }
+
+ if (field_0x0C70 == 4) {
+ setupCloudBigDrawCommand();
+ }
+
+ for (int i = 0; i < MAP_ICON_01_NUM_ANIMS; i++) {
+ if (mAnm[i].isEnabled()) {
+ mAnm[i].play();
+ }
+ }
+
+ if (dLytMapGlobal_c::GetInstance()->getField_0x4D() && dLytMapGlobal_c::GetInstance()->getField_0x50() != 10) {
+ checkBoundingPointing();
+ }
+
+ mCsHitCheck.resetCachedHitboxes();
+ mCsHitCheck.execute();
+
+ transitionAnims();
+ recordAnimVisState();
+
+ if (!field_0x1844) {
+ field_0x1844 = true;
+ if (field_0x0C84 == 0) {
+ for (int i = 0; i < 50; i++) {
+ mIconAnims[i].animIn = false;
+ mIconAnims[i].animOut = false;
+ }
+ }
+ }
+
return true;
}
@@ -870,17 +929,17 @@ void dLytMapIcon01_c::draw() {
}
case MAP_ICON_01_PANE_AREALIGHT_00: {
if (field_0x0D48 != 100 && field_0x0D48 == cmd) {
- drawAreaLight(0, pane);
+ setAreaLight(0, pane);
} else if (field_0x0D49 != 100 && field_0x0D49 == cmd) {
- drawAreaLight(1, pane);
+ setAreaLight(1, pane);
} else if (field_0x0D4A != 100 && field_0x0D4A == cmd) {
- drawAreaLight(2, pane);
+ setAreaLight(2, pane);
}
break;
}
case MAP_ICON_01_PANE_SAVEICON_00: {
if (field_0x0D4B[cmd] != 100) {
- drawSaveObj(field_0x0D4B[cmd], pane);
+ setSaveObj(field_0x0D4B[cmd], pane);
}
break;
}
@@ -888,13 +947,13 @@ void dLytMapIcon01_c::draw() {
if (paneIdx == MAP_ICON_01_PANE_CLOUDBIG_000) {
if (dScGame_c::isCurrentStage("F020")) {
- if (field_0x0C81) {
- drawCloud(1, pane);
+ if (mThunderheadEntered) {
+ setCloud(1, pane);
} else {
- drawCloud(0, pane);
+ setCloud(0, pane);
}
} else if (dScGame_c::isCurrentStage("F023")) {
- drawCloud(2, pane);
+ setCloud(2, pane);
}
mVec3_c rotate(0.0f, 0.0f, (-mapRot).degree2());
pane->SetRotate(rotate);
@@ -914,15 +973,15 @@ void dLytMapIcon01_c::draw() {
if (found == true) {
if (field_0x0C84 && mIconAnims[i].animIn == true) {
if (field_0x1845 == 1) {
- mIconAnims[i].idleVisible = true;
+ mIconAnims[i].visible = true;
mIconAnims[i].animIn = true;
} else {
- mIconAnims[i].idleVisible = false;
+ mIconAnims[i].visible = false;
mIconAnims[i].animIn = false;
}
}
- if (field_0xD0C != field_0xD10) {
+ if (mCurrentFloor != mLastFloor) {
mIconAnims[i].animIn = false;
mIconAnims[i].animOut = false;
}
@@ -932,14 +991,14 @@ void dLytMapIcon01_c::draw() {
if (f <= field_0x1838) {
drawWithAnimIn(paneIdx, pane, f);
mIconAnims[i].frame += 1.0f;
- mIconAnims[i].visible = true;
+ mIconAnims[i].render = true;
if (!field_0x184C) {
dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MAP_ICON_APPEAR);
field_0x184C = true;
}
} else {
mIconAnims[i].animIn = false;
- mIconAnims[i].visible = true;
+ mIconAnims[i].render = true;
field_0x184C = false;
}
} else if (mIconAnims[i].animOut) {
@@ -947,17 +1006,17 @@ void dLytMapIcon01_c::draw() {
if (f <= field_0x183C) {
drawWithAnimOut(paneIdx, pane, f);
mIconAnims[i].frame += 1.0f;
- mIconAnims[i].visible = true;
+ mIconAnims[i].render = true;
} else {
mIconAnims[i].animOut = false;
- mIconAnims[i].visible = true;
+ mIconAnims[i].render = true;
}
- } else if (mIconAnims[i].idleVisible) {
+ } else if (mIconAnims[i].visible) {
drawFullyIn(paneIdx, pane);
- mIconAnims[i].visible = true;
+ mIconAnims[i].render = true;
}
- if (mIconAnims[i].visible == true) {
+ if (mIconAnims[i].render == true) {
pane->SetAlpha(alpha);
pane->SetTranslate(vec2ToVec3XY(mCommands[cmd].position + field_0x0D40));
pane->Animate(0);
@@ -979,15 +1038,16 @@ void dLytMapIcon01_c::draw() {
mVec2_c v2(0.0f, 0.0f);
for (int i = 0; i < field_0x0E13; i++) {
- if (mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) {
- v2 = mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].field_0x10;
- mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(vec2ToVec3XY(v2 + field_0x0D40));
- mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo());
- mUnk3[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo());
+ if (mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->IsVisible()) {
+ v2 = mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].boundingPos;
+ mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->SetTranslate(vec2ToVec3XY(v2 + field_0x0D40)
+ );
+ mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->CalculateMtx(mLyt.getDrawInfo());
+ mPopupConfigs[i + MAP_ICON_01_BOUNDING_COMMONICON_00].bounding->Draw(mLyt.getDrawInfo());
}
}
- field_0xD10 = field_0xD0C;
+ mLastFloor = mCurrentFloor;
}
static const char *sMapPrefix = "MAP_";
@@ -1002,7 +1062,7 @@ void dLytMapIcon01_c::resetDrawCommands() {
field_0x0C85[i] = 0;
}
- field_0xD0C = 0;
+ mCurrentFloor = 0;
for (int i = 0; i < (int)ARRAY_LENGTH(mNumCommandsPerPass); i++) {
mNumCommandsPerPass[i] = 0;
@@ -1010,14 +1070,13 @@ void dLytMapIcon01_c::resetDrawCommands() {
mNumCommands = 0;
- for (int i = 0; i < (int)ARRAY_LENGTH(mUnk3); i++) {
- mUnk3[i].field_0x00 = 100;
- mUnk3[i].field_0x10.set(0.0f, 0.0f);
- mUnk3[i].field_0x08 = 0.0f;
- mUnk3[i].field_0x0C = 0.0f;
- mUnk3[i].field_0x18 = 0;
- mUnk3[i].field_0x19 = 0;
- mUnk3[i].field_0x1C = sMapPrefix;
+ for (int i = 0; i < (int)ARRAY_LENGTH(mPopupConfigs); i++) {
+ mPopupConfigs[i].cmdIdx = 100;
+ mPopupConfigs[i].boundingPos.set(0.0f, 0.0f);
+ mPopupConfigs[i].textPos.set(0.0f, 0.0f);
+ mPopupConfigs[i].pointedAt = false;
+ mPopupConfigs[i].objId = 0;
+ mPopupConfigs[i].labelPrefix = sMapPrefix;
}
field_0x0E13 = 0;
@@ -1030,29 +1089,48 @@ void dLytMapIcon01_c::resetDrawCommands() {
field_0x0D49 = 100;
field_0x0D4A = 100;
- field_0x0C74 = 0;
- field_0x0C75 = 0;
- field_0x0C76 = 0;
- field_0x0C77 = 0;
- field_0x0C78 = 0;
- field_0x0C79 = 0;
- field_0x0C7A = 0;
- field_0x0C7B = 0;
- field_0x0C7C = 0;
- field_0x0C7D = 0;
- field_0x0C7E = 0;
- field_0x0C7F = 0;
- field_0x0C80 = 0;
- field_0x0C81 = 0;
- field_0x0C82 = 0;
+ mFunFunIslandDiscovered = false;
+ mLumpyPumkpinDiscovered = false;
+ mBeedleIslandDiscovered = false;
+ mBambooIslandDiscovered = false;
+ mIsleOfSongsDiscovered = false;
+ mBugHavenDiscovered = false;
+ mBilocyteFightTriggered = false;
+ mFaronPillarOpened = false;
+ mFaronDiscovered = false;
+ mEldinPillarOpened = false;
+ mEldinDiscovered = false;
+ mLanayruPillarOpened = false;
+ mLanaryuDiscovered = false;
+ mThunderheadEntered = false;
+ mBeedleShopEntered = false;
for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) {
- mIconAnims[i].visible = 0;
+ mIconAnims[i].render = false;
}
mNumAnims = 0;
}
+void dLytMapIcon01_c::loadFlags() {
+ StoryflagManager *mgr = StoryflagManager::sInstance;
+ mFunFunIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_FUN_FUN_ISLAND_DISCOVERED);
+ mLumpyPumkpinDiscovered = mgr->getCounterOrFlag(STORYFLAG_LUMPY_PUMPKIN_DISCOVERED);
+ mBeedleIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_BEEDLE_ISLAND_DISCOVERED);
+ mBambooIslandDiscovered = mgr->getCounterOrFlag(STORYFLAG_BAMBOO_ISLAND_DISCOVERED);
+ mIsleOfSongsDiscovered = mgr->getCounterOrFlag(STORYFLAG_ISLE_OF_SONGS_DISCOVERED);
+ mBugHavenDiscovered = mgr->getCounterOrFlag(STORYFLAG_BUG_HAVEN_DISCOVERED);
+ mBilocyteFightTriggered = mgr->getCounterOrFlag(STORYFLAG_BILOCYCTE_FIGHT_TRIGGERED);
+ mFaronPillarOpened = mgr->getCounterOrFlag(STORYFLAG_FARON_PILLAR_OPENED);
+ mFaronDiscovered = mgr->getCounterOrFlag(STORYFLAG_FARON_DISCOVERED);
+ mEldinPillarOpened = mgr->getCounterOrFlag(STORYFLAG_ELDIN_PILLAR_OPENED);
+ mEldinDiscovered = mgr->getCounterOrFlag(STORYFLAG_ELDIN_DISCOVERED);
+ mLanayruPillarOpened = mgr->getCounterOrFlag(STORYFLAG_LANAYRU_PILLAR_OPENED);
+ mLanaryuDiscovered = mgr->getCounterOrFlag(STORYFLAG_LANAYRU_DISCOVERED);
+ mThunderheadEntered = mgr->getCounterOrFlag(STORYFLAG_THUNDERHEAD_ENTERED);
+ mBeedleShopEntered = mgr->getCounterOrFlag(STORYFLAG_BEEDLE_SHOP_ENTERED);
+}
+
void dLytMapIcon01_c::setLinkTunic(s32 type) {
f32 frame = 0.0f;
switch (type) {
@@ -1066,6 +1144,49 @@ void dLytMapIcon01_c::setLinkTunic(s32 type) {
mAnm[MAP_ICON_01_ANIM_PLAYER_2_PATTERN].setAnimEnable(false);
}
+void dLytMapIcon01_c::setAreaLight(u32 color, nw4r::lyt::Pane *pane) {
+ f32 frame = color;
+ mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setAnimEnable(true);
+ mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setFrame(frame);
+ pane->Animate(0);
+ mAnm[MAP_ICON_01_ANIM_AREA_COLOR].setAnimEnable(false);
+}
+
+void dLytMapIcon01_c::setCloud(u32 alpha, nw4r::lyt::Pane *pane) {
+ f32 frame = alpha;
+ mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setAnimEnable(true);
+ mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setFrame(frame);
+ pane->Animate(0);
+ mAnm[MAP_ICON_01_ANIM_CLOUD_ALPHA].setAnimEnable(false);
+}
+
+void dLytMapIcon01_c::setGoddessStatue(u32 present) {
+ f32 frame = 0.0f;
+ if (!present) {
+ frame = 1.0f;
+ }
+ mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setFrame(frame);
+ mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setAnimEnable(true);
+ mLyt.calc();
+ mAnm[MAP_ICON_01_ANIM_GODDESS_ON_OFF].setAnimEnable(false);
+}
+
+void dLytMapIcon01_c::setSaveObj(u32 color, nw4r::lyt::Pane *pane) {
+ f32 frame = color;
+ mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setAnimEnable(true);
+ mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setFrame(frame);
+ pane->Animate(0);
+ mAnm[MAP_ICON_01_ANIM_SAVE_OBJECT_COLOR].setAnimEnable(false);
+}
+
+void dLytMapIcon01_c::setTerry(bool present) {
+ // NONMATCHING
+ // Additional clrlwi here...
+ // When you fix this, maybe also fix other instances of this problem
+ // by searching for 91657b77
+ mpTerryOnOffPane->SetVisible(present);
+}
+
void dLytMapIcon01_c::drawWithAnimIn(u32 paneIdx, nw4r::lyt::Pane *pane, f32 frame) {
if (paneIdx == MAP_ICON_01_PANE_DOORKEY_00) {
paneIdx = MAP_ICON_01_PANE_DOOR_000;
@@ -1155,9 +1276,62 @@ void dLytMapIcon01_c::checkMapMode() {
}
}
+void dLytMapIcon01_c::setupActorDrawCommands() {
+ dAcBase_c *ac = nullptr;
+ while ((ac = static_cast<dAcBase_c *>(fManager_c::searchBaseByGroupType(fBase_c::ACTOR, ac))) != nullptr) {
+ if (field_0x0C70 == 4 && mBilocyteFightTriggered) {
+ setupNpcBNusiDrawCommand(ac);
+ }
+
+ if (field_0x0C70 == 1 && checkHasMap()) {
+ setupObjD3DummyDrawCommand(ac);
+ }
+
+ if (dScGame_c::currentSpawnInfo.getTimeOfDay() != SpawnInfo::NIGHT) {
+ setupObjTerryShopDrawCommand(ac);
+ }
+
+ setupTboxDrawCommand(ac);
+ setupObjShutterDrawCommand(ac);
+ setupObjDoorDrawCommand(ac);
+ setupObjSealedDoorDrawCommand(ac);
+ setupObjHarpHintDrawCommand(ac);
+
+ if (field_0x184D) {
+ setupNpcKenseiDrawCommand(ac);
+ }
+
+ setupNpcBeeDrawCommand(ac);
+ setupObjSaveDrawCommand(ac);
+ setupObjLightLineDrawCommand(ac);
+ setupObjRoAtTargetDrawCommand(ac);
+
+ if (mNumCommands >= 100) {
+ break;
+ }
+ }
+}
+
+void dLytMapIcon01_c::setupNpcKenseiDrawCommand(dAcBase_c *actor) {
+ if (mNumCommands < 100) {
+ if (actor->mProfileName == fProfile::NPC_KENSEI && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) &&
+ mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) {
+ mVec2_c pos(0.0f, 0.0f);
+ projectOntoMap(actor->mPosition, pos);
+ mCommands[mNumCommands].passIdx = 18;
+ mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_SWORD_00;
+ mCommands[mNumCommands].position.x = pos.x;
+ mCommands[mNumCommands].position.y = pos.y;
+
+ mNumCommandsPerPass[18]++;
+ mNumCommands++;
+ }
+ }
+}
+
void dLytMapIcon01_c::setupTboxDrawCommand(dAcBase_c *actor) {
if (actor->mProfileName == fProfile::TBOX && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) &&
- field_0xD0C == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) {
+ mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) {
dAcTbox_c *box = static_cast<dAcTbox_c *>(actor);
if (box->getVariant() == dAcTbox_c::GODDESS) {
u16 flag = box->getParams2Lower();
@@ -1186,16 +1360,16 @@ void dLytMapIcon01_c::setupTboxDrawCommandClosed(dAcTbox_c *box) {
if (checkHasMap()) {
if (field_0x0C84) {
mIconAnims[mNumAnims].cmdIndex = mNumCommands;
- mIconAnims[mNumAnims].idleVisible = true;
+ mIconAnims[mNumAnims].visible = true;
mIconAnims[mNumAnims].animIn = true;
} else {
mIconAnims[mNumAnims].cmdIndex = mNumCommands;
- mIconAnims[mNumAnims].idleVisible = true;
+ mIconAnims[mNumAnims].visible = true;
mIconAnims[mNumAnims].animIn = false;
}
} else {
mIconAnims[mNumAnims].cmdIndex = mNumCommands;
- mIconAnims[mNumAnims].idleVisible = false;
+ mIconAnims[mNumAnims].visible = false;
}
mNumAnims++;
@@ -1231,3 +1405,520 @@ void dLytMapIcon01_c::setupTboxDrawCommandGoddessClosed(dAcTbox_c *box) {
mNumCommands++;
}
}
+
+void dLytMapIcon01_c::setupObjShutterDrawCommand(dAcBase_c *actor) {
+ // TODO - needs door classes
+}
+
+void dLytMapIcon01_c::setupObjDoorDrawCommand(dAcBase_c *actor) {
+ // TODO - needs door classes
+}
+
+void dLytMapIcon01_c::setupObjSaveDrawCommand(dAcBase_c *actor) {
+ if (mNumCommands < 100) {
+ if (actor->mProfileName == fProfile::OBJ_SAVE && !actor->checkActorProperty(dAcBase_c::AC_PROP_0x100) &&
+ mCurrentFloor == dStage_c::GetInstance()->getMapRelated()->fn_801B4F10(actor->mRoomID, actor->mPosition)) {
+ dAcOSave_c *save = static_cast<dAcOSave_c *>(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<dAcBase_c *>(fManager_c::searchBaseByGroupType(fBase_c::STAGE, ac))) != nullptr) {
+ setupTgMapMarkDrawCommand(ac);
+
+ if (dLytMapGlobal_c::GetInstance()->getField_0x54()) {
+ setupTgMapInstDrawCommand(ac);
+ }
+
+ setupTgForceGetFlagDrawCommand(ac);
+
+ if (field_0x184D) {
+ setupTgInsectDrawCommand(ac);
+ }
+
+ if (mNumCommands >= 100) {
+ break;
+ }
+ }
+}
+
+void dLytMapIcon01_c::setupTgMapMarkDrawCommand(dAcBase_c *actor) {
+ // TODO - ...
+}
+
+void dLytMapIcon01_c::setupTgMapMarkDrawCommand1(dTgMapMark_c *actor) {
+ // TODO - ...
+}
+
+void dLytMapIcon01_c::setupTgMapMarkDrawCommand2(dTgMapMark_c *actor) {
+ // TODO - ...
+}
+
+void dLytMapIcon01_c::setupTgMapInstDrawCommand(dAcBase_c *actor) {
+ // TODO - ...
+}
+
+void dLytMapIcon01_c::setupTgForceGetFlagDrawCommand(dAcBase_c *actor) {
+ // TODO - ...
+}
+
+void dLytMapIcon01_c::setupTgInsectDrawCommand(dAcBase_c *actor) {
+ // TODO - ...
+}
+
+void dLytMapIcon01_c::setupLinkDrawCommand() {
+ if (dAcPy_c::GetLinkM() != nullptr) {
+ setupLinkDrawCommand1(dAcPy_c::GetLinkM());
+
+ if (dLytMapGlobal_c::GetInstance()->getField_0x50() != 3) {
+ setupLinkDrawCommand2();
+ }
+ }
+}
+
+void dLytMapIcon01_c::setupLinkDrawCommand1(dAcPy_c *ac) {
+ // TODO - ...
+}
+
+void dLytMapIcon01_c::setupLinkDrawCommand2() {
+ // TODO - ...
+}
+
+void dLytMapIcon01_c::setupCloudBigDrawCommand() {
+ if (mNumCommands < 100) {
+ mVec3_c thunderHeadPos(-135210.0f, 0.0f, -84790.0f);
+ mVec2_c pos(0.0f, 0.0f);
+ projectOntoMap(thunderHeadPos, pos);
+ mCommands[mNumCommands].passIdx = 31;
+ mCommands[mNumCommands].paneIdx = MAP_ICON_01_PANE_CLOUDBIG_000;
+ mCommands[mNumCommands].position.x = pos.x;
+ mCommands[mNumCommands].position.y = pos.y;
+
+ mNumCommandsPerPass[31]++;
+ mNumCommands++;
+ }
+}
+
+void dLytMapIcon01_c::setupTriforceDrawCommands() {
+ dAcObjBase_c *ac = nullptr;
+ while ((ac = dAcObjBase_c::getNextObject(&dAcItem_c::sItemList, ac)) != nullptr) {
+ if (static_cast<dAcItem_c *>(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<dCursorHitCheckLyt_c *>(d)->getHitPane() == pane) {
+ return true;
+ }
+ return false;
+}
+
+void dLytMapIcon01_c::fn_80181C40() {
+ for (int i = 0; i < MAP_ICON_01_BOUNDING_COMMONICON_LAST; i++) {
+ mpBoundings[i]->SetVisible(false);
+ }
+}
+
+bool dLytMapIcon00_c::build(d2d::ResAccIf_c *resAcc) {
+ // TODO - ...
+ return true;
+}
+
+bool dLytMapIcon00_c::remove() {
+ // TODO - ...
+ return true;
+}
+
+bool dLytMapIcon00_c::execute() {
+ // TODO - ...
+ return true;
+}
+
+void dLytMapIcon00_c::draw() {
+ // TODO - ...
+}
+
+void dLytMapIcon00_c::resetDrawCommands() {
+ for (int i = 0; i < (int)ARRAY_LENGTH(mCommands); i++) {
+ mCommands[i].position.set(0.0f, 0.0f);
+ mCommands[i].rotation.setF(0.0f);
+ mCommands[i].paneIdx = 39;
+ mCommands[i].passIdx = 35;
+ field_0x0F20[i] = 100;
+ field_0x13A8[i] = 0;
+ field_0x1342[i] = 0;
+ field_0x0E5B[i] = 0;
+ }
+
+ for (int i = 0; i < (int)ARRAY_LENGTH(mNumCommandsPerPass); i++) {
+ mNumCommandsPerPass[i] = 0;
+ }
+
+ field_0x13A7 = 0;
+ mNumCommands = 0;
+
+ for (int i = 0; i < 36; i++) {
+ field_0x0EEC[i] = 0;
+ }
+
+ for (int i = 0; i < (int)ARRAY_LENGTH(mPopupConfigs); i++) {
+ mPopupConfigs[i].cmdIdx = 100;
+ mPopupConfigs[i].boundingPos.set(0.0f, 0.0f);
+ mPopupConfigs[i].textPos.set(0.0f, 0.0f);
+ mPopupConfigs[i].pointedAt = false;
+ mPopupConfigs[i].objId = 0;
+ mPopupConfigs[i].labelPrefix = sMapPrefix;
+ }
+
+ field_0x140C = 0;
+ field_0x0E59 = 0;
+ field_0x0E5A = 0;
+
+ fn_80189750();
+
+ field_0x0E50 = 0;
+ field_0x0E51 = 0;
+ field_0x0E52 = 0;
+ field_0x0E53 = 0;
+ field_0x0E54 = 0;
+ field_0x0E55 = 0;
+ field_0x0E56 = 0;
+ field_0x0E57 = 0;
+ field_0x0E58 = 0;
+
+ for (int i = 0; i < (int)ARRAY_LENGTH(mIconAnims); i++) {
+ mIconAnims[i].render = false;
+ }
+
+ mNumAnims = 0;
+ field_0x1CE4 = 0;
+}
+
+static const char *sMapPopPrefix = "MAP_POP_";
+
+bool dLytMapMarkers_c::build(d2d::ResAccIf_c *resAcc) {
+ mMapPopup.build(resAcc);
+ if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) {
+ void *data = LayoutArcManager::GetInstance()->getLoadedData("MapSky");
+ mResAcc01.attach(data, "");
+
+ // TODO - ...
+
+ mIcon01.build(&mResAcc01);
+ } else {
+ void *data = LayoutArcManager::GetInstance()->getLoadedData("MapField");
+ mResAcc00.attach(data, "");
+
+ // TODO - ...
+
+ mIcon00.build(&mResAcc00);
+ }
+ return true;
+}
+
+bool dLytMapMarkers_c::remove() {
+ mMapPopup.remove();
+ if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) {
+ mIcon01.remove();
+ mResAcc01.detach();
+ } else {
+ mIcon00.remove();
+ mResAcc00.detach();
+ }
+ // TODO - ...
+ return true;
+}
+
+bool dLytMapMarkers_c::execute() {
+ return true;
+}
+
+void dLytMapMarkers_c::draw() {
+ if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) {
+ mIcon01.draw();
+ } else {
+ mIcon00.draw();
+ }
+}
+
+void dLytMapMarkers_c::setIslandNamesOn(bool on) {
+ if (dStageMgr_c::GetInstance()->isSTIFbyte4_0()) {
+ mShowIslandNames = on;
+ mIcon01.mShowIslandNames = on;
+ }
+}
+
+void dLytMapMarkers_c::drawPopups() {
+ for (int i = 0; i < mNumPopups; i++) {
+ if (mPopups[i].visible) {
+ SizedString<0x40> label;
+ if (mPopups[i].objId == 0xFF) {
+ label.sprintf("SAVEOBJ_NAME_UNKNOWN");
+ } else {
+ label.sprintf("%s%02d", mPopups[i].labelPrefix, mPopups[i].objId);
+ }
+ mMapPopup.setLabel(label);
+ mMapPopup.realizeText();
+ f32 width = mMapPopup.getTextRenderWidth();
+
+ // TODO - probably equivalent but FPR, order, stack problems
+ mVec2_c boundingPos = mPopups[i].boundingPos;
+ mVec2_c textPos = mPopups[i].textPos;
+ mVec2_c pos = boundingPos + textPos + field_0x06F4;
+ pos.x += width / 2.0f;
+
+ mMapPopup.setPosition(pos);
+
+ mMapPopup.setInout(mPopups[i].inAnimFrame);
+ mMapPopup.draw();
+ if (mPopups[i].inAnimFrame <= mMapPopup.getInAnimDuration()) {
+ mPopups[i].inAnimFrame += 1.0f;
+ }
+ if (mMapPopup.getInAnimDuration() <= mPopups[i].inAnimFrame) {
+ mPopups[i].inAnimFrame = mMapPopup.getInAnimDuration();
+ }
+ } else if (0.0f < mPopups[i].inAnimFrame) {
+ SizedString<0x40> label;
+ if (mPopups[i].objId == 0xFF) {
+ label.sprintf("SAVEOBJ_NAME_UNKNOWN");
+ } else {
+ label.sprintf("%s%02d", mPopups[i].labelPrefix, mPopups[i].objId);
+ }
+ mMapPopup.setLabel(label);
+ mMapPopup.realizeText();
+ f32 width = mMapPopup.getTextRenderWidth();
+
+ // TODO - probably equivalent but FPR, order, stack problems
+ mVec2_c boundingPos = mPopups[i].boundingPos;
+ mVec2_c textPos = mPopups[i].textPos;
+ mVec2_c pos = boundingPos + textPos + field_0x06F4;
+ pos.x += width / 2.0f;
+
+ mMapPopup.setPosition(pos);
+
+ mPopups[i].inAnimFrame -= 1.0f;
+ mMapPopup.setInout(mPopups[i].inAnimFrame);
+ mMapPopup.draw();
+ }
+ }
+}
+
+void dLytMapMarkers_c::resetPopups() {
+ for (int i = 0; i < (int)ARRAY_LENGTH(mPopups); i++) {
+ mPopups[i].inAnimFrame = 0.0f;
+ mPopups[i].textPos.set(0.0f, 0.0f);
+ mPopups[i].boundingPos.set(0.0f, 0.0f);
+ mPopups[i].visible = false;
+ mPopups[i].objId = 0;
+ mPopups[i].labelPrefix = sMapPopPrefix;
+ }
+}
+
+void dLytMapMarkers_c::loadPopups() {
+ for (int i = 0; i < mNumPopups; i++) {
+ // TODO - this looks weird
+ const mVec2_c &v = mpPopupConfigs[i].textPos;
+ mPopups[i].textPos.x = v.x;
+ mPopups[i].textPos.y = v.y;
+ mPopups[i].boundingPos = mpPopupConfigs[i].boundingPos;
+ mPopups[i].visible = mpPopupConfigs[i].pointedAt;
+ mPopups[i].objId = mpPopupConfigs[i].objId;
+ mPopups[i].labelPrefix = mpPopupConfigs[i].labelPrefix;
+ }
+}