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