diff --git a/config/YFEE01/arm9/overlays/ov000/delinks.txt b/config/YFEE01/arm9/overlays/ov000/delinks.txt index 1fdb10d..67f6cab 100644 --- a/config/YFEE01/arm9/overlays/ov000/delinks.txt +++ b/config/YFEE01/arm9/overlays/ov000/delinks.txt @@ -22,6 +22,10 @@ src/ov000/playerphase.cpp: src/ov000/mind.cpp: .text start:0x021af79c end:0x021b06fc +src/ov000/map_unit_menu.cpp: + .text start:0x021bfa60 end:0x021c1e18 + .data start:0x021de3a8 end:0x021dfc20 + src/ov000/map.cpp: .text start:0x021d708c end:0x021d7c90 .data start:0x021e2c30 end:0x021e2c88 diff --git a/config/YFEE01/arm9/overlays/ov000/symbols.txt b/config/YFEE01/arm9/overlays/ov000/symbols.txt index 0a573fc..2426fe9 100644 --- a/config/YFEE01/arm9/overlays/ov000/symbols.txt +++ b/config/YFEE01/arm9/overlays/ov000/symbols.txt @@ -594,118 +594,118 @@ func_ov000_021bf9f8 kind:function(arm,size=0x44) addr:0x021bf9f8 func_ov000_021bfa3c kind:function(arm,size=0x24) addr:0x021bfa3c func_ov000_021bfa60 kind:function(arm,size=0x90) addr:0x021bfa60 func_ov000_021bfaf0 kind:function(arm,size=0x90) addr:0x021bfaf0 -func_ov000_021bfb80 kind:function(arm,size=0x320) addr:0x021bfb80 -func_ov000_021bfea0 kind:function(arm,size=0x4c) addr:0x021bfea0 -func_ov000_021bfeec kind:function(arm,size=0x1c) addr:0x021bfeec -func_ov000_021bff08 kind:function(arm,size=0x2c) addr:0x021bff08 -func_ov000_021bff34 kind:function(arm,size=0x14) addr:0x021bff34 -func_ov000_021bff48 kind:function(arm,size=0x14) addr:0x021bff48 -func_ov000_021bff5c kind:function(arm,size=0x1c) addr:0x021bff5c -func_ov000_021bff78 kind:function(arm,size=0x2c) addr:0x021bff78 -func_ov000_021bffa4 kind:function(arm,size=0x48) addr:0x021bffa4 -func_ov000_021bffec kind:function(arm,size=0x18) addr:0x021bffec -func_ov000_021c0004 kind:function(arm,size=0x14) addr:0x021c0004 -func_ov000_021c0018 kind:function(arm,size=0x50) addr:0x021c0018 -func_ov000_021c0068 kind:function(arm,size=0x1c) addr:0x021c0068 -func_ov000_021c0084 kind:function(arm,size=0x1c) addr:0x021c0084 -func_ov000_021c00a0 kind:function(arm,size=0x2c) addr:0x021c00a0 -func_ov000_021c00cc kind:function(arm,size=0x1c4) addr:0x021c00cc -func_ov000_021c0290 kind:function(arm,size=0x14) addr:0x021c0290 -func_ov000_021c02a4 kind:function(arm,size=0x38) addr:0x021c02a4 -func_ov000_021c02dc kind:function(arm,size=0x1c) addr:0x021c02dc -func_ov000_021c02f8 kind:function(arm,size=0x2c) addr:0x021c02f8 -func_ov000_021c0324 kind:function(arm,size=0x5c) addr:0x021c0324 -func_ov000_021c0380 kind:function(arm,size=0x18) addr:0x021c0380 -func_ov000_021c0398 kind:function(arm,size=0x14) addr:0x021c0398 -func_ov000_021c03ac kind:function(arm,size=0x14) addr:0x021c03ac -func_ov000_021c03c0 kind:function(arm,size=0x1c) addr:0x021c03c0 -func_ov000_021c03dc kind:function(arm,size=0x2c) addr:0x021c03dc -func_ov000_021c0408 kind:function(arm,size=0x5c) addr:0x021c0408 -func_ov000_021c0464 kind:function(arm,size=0x8) addr:0x021c0464 -func_ov000_021c046c kind:function(arm,size=0x14) addr:0x021c046c -func_ov000_021c0480 kind:function(arm,size=0x50) addr:0x021c0480 -func_ov000_021c04d0 kind:function(arm,size=0x38) addr:0x021c04d0 -func_ov000_021c0508 kind:function(arm,size=0x1c) addr:0x021c0508 -func_ov000_021c0524 kind:function(arm,size=0x2c) addr:0x021c0524 -func_ov000_021c0550 kind:function(arm,size=0x204) addr:0x021c0550 -func_ov000_021c0754 kind:function(arm,size=0x14) addr:0x021c0754 -func_ov000_021c0768 kind:function(arm,size=0x38) addr:0x021c0768 -func_ov000_021c07a0 kind:function(arm,size=0x1c) addr:0x021c07a0 -func_ov000_021c07bc kind:function(arm,size=0x2c) addr:0x021c07bc -func_ov000_021c07e8 kind:function(arm,size=0x88) addr:0x021c07e8 -func_ov000_021c0870 kind:function(arm,size=0x14) addr:0x021c0870 -func_ov000_021c0884 kind:function(arm,size=0x38) addr:0x021c0884 -func_ov000_021c08bc kind:function(arm,size=0x1c) addr:0x021c08bc -func_ov000_021c08d8 kind:function(arm,size=0x2c) addr:0x021c08d8 -func_ov000_021c0904 kind:function(arm,size=0x74) addr:0x021c0904 -func_ov000_021c0978 kind:function(arm,size=0x14) addr:0x021c0978 -func_ov000_021c098c kind:function(arm,size=0x38) addr:0x021c098c -func_ov000_021c09c4 kind:function(arm,size=0x1c) addr:0x021c09c4 -func_ov000_021c09e0 kind:function(arm,size=0x2c) addr:0x021c09e0 -func_ov000_021c0a0c kind:function(arm,size=0x48) addr:0x021c0a0c -func_ov000_021c0a54 kind:function(arm,size=0x14) addr:0x021c0a54 -func_ov000_021c0a68 kind:function(arm,size=0x38) addr:0x021c0a68 -func_ov000_021c0aa0 kind:function(arm,size=0x1c) addr:0x021c0aa0 -func_ov000_021c0abc kind:function(arm,size=0x2c) addr:0x021c0abc -func_ov000_021c0ae8 kind:function(arm,size=0x48) addr:0x021c0ae8 -func_ov000_021c0b30 kind:function(arm,size=0x14) addr:0x021c0b30 -func_ov000_021c0b44 kind:function(arm,size=0x4c) addr:0x021c0b44 -func_ov000_021c0b90 kind:function(arm,size=0x1c) addr:0x021c0b90 -func_ov000_021c0bac kind:function(arm,size=0x2c) addr:0x021c0bac -func_ov000_021c0bd8 kind:function(arm,size=0x58) addr:0x021c0bd8 -func_ov000_021c0c30 kind:function(arm,size=0x8) addr:0x021c0c30 -func_ov000_021c0c38 kind:function(arm,size=0x14) addr:0x021c0c38 -func_ov000_021c0c4c kind:function(arm,size=0x4c) addr:0x021c0c4c -func_ov000_021c0c98 kind:function(arm,size=0x1c) addr:0x021c0c98 -func_ov000_021c0cb4 kind:function(arm,size=0x2c) addr:0x021c0cb4 -func_ov000_021c0ce0 kind:function(arm,size=0x13c) addr:0x021c0ce0 -func_ov000_021c0e1c kind:function(arm,size=0x8) addr:0x021c0e1c -func_ov000_021c0e24 kind:function(arm,size=0x14) addr:0x021c0e24 -func_ov000_021c0e38 kind:function(arm,size=0x4c) addr:0x021c0e38 -func_ov000_021c0e84 kind:function(arm,size=0x1c) addr:0x021c0e84 -func_ov000_021c0ea0 kind:function(arm,size=0x2c) addr:0x021c0ea0 -func_ov000_021c0ecc kind:function(arm,size=0x13c) addr:0x021c0ecc -func_ov000_021c1008 kind:function(arm,size=0x8) addr:0x021c1008 -func_ov000_021c1010 kind:function(arm,size=0x14) addr:0x021c1010 -func_ov000_021c1024 kind:function(arm,size=0xc0) addr:0x021c1024 -func_ov000_021c10e4 kind:function(arm,size=0x1c) addr:0x021c10e4 -func_ov000_021c1100 kind:function(arm,size=0x2c) addr:0x021c1100 -func_ov000_021c112c kind:function(arm,size=0x84) addr:0x021c112c -func_ov000_021c11b0 kind:function(arm,size=0x8) addr:0x021c11b0 -func_ov000_021c11b8 kind:function(arm,size=0x14) addr:0x021c11b8 -func_ov000_021c11cc kind:function(arm,size=0x1c) addr:0x021c11cc -func_ov000_021c11e8 kind:function(arm,size=0x1c) addr:0x021c11e8 -func_ov000_021c1204 kind:function(arm,size=0x2c) addr:0x021c1204 -func_ov000_021c1230 kind:function(arm,size=0x1c8) addr:0x021c1230 -func_ov000_021c13f8 kind:function(arm,size=0x14) addr:0x021c13f8 -func_ov000_021c140c kind:function(arm,size=0x24) addr:0x021c140c -func_ov000_021c1430 kind:function(arm,size=0x1c) addr:0x021c1430 -func_ov000_021c144c kind:function(arm,size=0x2c) addr:0x021c144c -func_ov000_021c1478 kind:function(arm,size=0x74) addr:0x021c1478 -func_ov000_021c14ec kind:function(arm,size=0x14) addr:0x021c14ec -func_ov000_021c1500 kind:function(arm,size=0x24) addr:0x021c1500 -func_ov000_021c1524 kind:function(arm,size=0x1c) addr:0x021c1524 -func_ov000_021c1540 kind:function(arm,size=0x2c) addr:0x021c1540 -func_ov000_021c156c kind:function(arm,size=0x148) addr:0x021c156c -func_ov000_021c16b4 kind:function(arm,size=0x14) addr:0x021c16b4 -func_ov000_021c16c8 kind:function(arm,size=0x24) addr:0x021c16c8 -func_ov000_021c16ec kind:function(arm,size=0x1c) addr:0x021c16ec -func_ov000_021c1708 kind:function(arm,size=0x2c) addr:0x021c1708 -func_ov000_021c1734 kind:function(arm,size=0x134) addr:0x021c1734 -func_ov000_021c1868 kind:function(arm,size=0x14) addr:0x021c1868 -func_ov000_021c187c kind:function(arm,size=0x1c) addr:0x021c187c -func_ov000_021c1898 kind:function(arm,size=0x1c) addr:0x021c1898 -func_ov000_021c18b4 kind:function(arm,size=0x2c) addr:0x021c18b4 -func_ov000_021c18e0 kind:function(arm,size=0x334) addr:0x021c18e0 -func_ov000_021c1c14 kind:function(arm,size=0x8) addr:0x021c1c14 -func_ov000_021c1c1c kind:function(arm,size=0x14) addr:0x021c1c1c -func_ov000_021c1c30 kind:function(arm,size=0x74) addr:0x021c1c30 -func_ov000_021c1ca4 kind:function(arm,size=0x4c) addr:0x021c1ca4 -func_ov000_021c1cf0 kind:function(arm,size=0x2c) addr:0x021c1cf0 -func_ov000_021c1d1c kind:function(arm,size=0x14) addr:0x021c1d1c -func_ov000_021c1d30 kind:function(arm,size=0x18) addr:0x021c1d30 -func_ov000_021c1d48 kind:function(arm,size=0x64) addr:0x021c1d48 -func_ov000_021c1dac kind:function(arm,size=0x6c) addr:0x021c1dac +StartUnitMenu kind:function(arm,size=0x320) addr:0x021bfb80 +_ZN3map9MIU_Fixed8vfunc_1cEv kind:function(arm,size=0x4c) addr:0x021bfea0 +_ZN3map9MIU_Fixed8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021bfeec +_ZN3map9MIU_Fixed8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021bff08 +_ZN3map9MIU_Fixed8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021bff34 +_ZN3map8MIU_Lure8vfunc_24EP4MenuP13MenuItemState kind:function(arm,size=0x14) addr:0x021bff48 +_ZN3map8MIU_Lure8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021bff5c +_ZN3map8MIU_Lure8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021bff78 +_ZN3map8MIU_Lure8vfunc_14Ev kind:function(arm,size=0x48) addr:0x021bffa4 +_ZN3map8MIU_Lure8vfunc_10EP13MenuItemState kind:function(arm,size=0x18) addr:0x021bffec +_ZN3map8MIU_Lure8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0004 +_ZN3map10DI_LureYes8vfunc_1cEv kind:function(arm,size=0x50) addr:0x021c0018 +_ZN3map13MIU_Imitation8vfunc_1cEv kind:function(arm,size=0x1c) addr:0x021c0068 +_ZN3map13MIU_Imitation8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c0084 +_ZN3map13MIU_Imitation8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c00a0 +_ZN3map13MIU_Imitation8vfunc_14Ev kind:function(arm,size=0x1c4) addr:0x021c00cc +_ZN3map13MIU_Imitation8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0290 +_ZN3map8MIU_Save8vfunc_20EP13MenuItemState kind:function(arm,size=0x38) addr:0x021c02a4 +_ZN3map8MIU_Save8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c02dc +_ZN3map8MIU_Save8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c02f8 +_ZN3map8MIU_Save8vfunc_14Ev kind:function(arm,size=0x5c) addr:0x021c0324 +_ZN3map8MIU_Save8vfunc_10EP13MenuItemState kind:function(arm,size=0x18) addr:0x021c0380 +_ZN3map8MIU_Save8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0398 +_ZN3map12MIU_Complete8vfunc_24EP4MenuP13MenuItemState kind:function(arm,size=0x14) addr:0x021c03ac +_ZN3map12MIU_Complete8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c03c0 +_ZN3map12MIU_Complete8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c03dc +_ZN3map12MIU_Complete8vfunc_14Ev kind:function(arm,size=0x5c) addr:0x021c0408 +_ZN3map12MIU_Complete8vfunc_10EP13MenuItemState kind:function(arm,size=0x8) addr:0x021c0464 +_ZN3map12MIU_Complete8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c046c +_ZN3map14DI_CompleteYes8vfunc_1cEv kind:function(arm,size=0x50) addr:0x021c0480 +_ZN3map15MIU_Transporter8vfunc_20EP13MenuItemState kind:function(arm,size=0x38) addr:0x021c04d0 +_ZN3map15MIU_Transporter8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c0508 +_ZN3map15MIU_Transporter8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c0524 +_ZN3map15MIU_Transporter8vfunc_14Ev kind:function(arm,size=0x204) addr:0x021c0550 +_ZN3map15MIU_Transporter8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0754 +_ZN3map9MIU_Arena8vfunc_20EP13MenuItemState kind:function(arm,size=0x38) addr:0x021c0768 +_ZN3map9MIU_Arena8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c07a0 +_ZN3map9MIU_Arena8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c07bc +_ZN3map9MIU_Arena8vfunc_14Ev kind:function(arm,size=0x88) addr:0x021c07e8 +_ZN3map9MIU_Arena8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0870 +_ZN3map14MIU_SecretShop8vfunc_1cEv kind:function(arm,size=0x38) addr:0x021c0884 +_ZN3map14MIU_SecretShop8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c08bc +_ZN3map14MIU_SecretShop8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c08d8 +_ZN3map14MIU_SecretShop8vfunc_14Ev kind:function(arm,size=0x74) addr:0x021c0904 +_ZN3map14MIU_SecretShop8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0978 +_ZN3map12MIU_ItemShop8vfunc_1cEv kind:function(arm,size=0x38) addr:0x021c098c +_ZN3map12MIU_ItemShop8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c09c4 +_ZN3map12MIU_ItemShop8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c09e0 +_ZN3map12MIU_ItemShop8vfunc_14Ev kind:function(arm,size=0x48) addr:0x021c0a0c +_ZN3map12MIU_ItemShop8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0a54 +_ZN3map14MIU_WeaponShop8vfunc_1cEv kind:function(arm,size=0x38) addr:0x021c0a68 +_ZN3map14MIU_WeaponShop8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c0aa0 +_ZN3map14MIU_WeaponShop8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c0abc +_ZN3map14MIU_WeaponShop8vfunc_14Ev kind:function(arm,size=0x48) addr:0x021c0ae8 +_ZN3map14MIU_WeaponShop8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0b30 +_ZN3map8MIU_TBox8vfunc_1cEv kind:function(arm,size=0x4c) addr:0x021c0b44 +_ZN3map8MIU_TBox8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c0b90 +_ZN3map8MIU_TBox8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c0bac +_ZN3map8MIU_TBox8vfunc_14Ev kind:function(arm,size=0x58) addr:0x021c0bd8 +_ZN3map8MIU_TBox8vfunc_10EP13MenuItemState kind:function(arm,size=0x8) addr:0x021c0c30 +_ZN3map8MIU_TBox8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0c38 +_ZN3map10MIU_Bridge8vfunc_1cEv kind:function(arm,size=0x4c) addr:0x021c0c4c +_ZN3map10MIU_Bridge8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c0c98 +_ZN3map10MIU_Bridge8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c0cb4 +_ZN3map10MIU_Bridge8vfunc_14Ev kind:function(arm,size=0x13c) addr:0x021c0ce0 +_ZN3map10MIU_Bridge8vfunc_10EP13MenuItemState kind:function(arm,size=0x8) addr:0x021c0e1c +_ZN3map10MIU_Bridge8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c0e24 +_ZN3map8MIU_Door8vfunc_1cEv kind:function(arm,size=0x4c) addr:0x021c0e38 +_ZN3map8MIU_Door8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c0e84 +_ZN3map8MIU_Door8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c0ea0 +_ZN3map8MIU_Door8vfunc_14Ev kind:function(arm,size=0x13c) addr:0x021c0ecc +_ZN3map8MIU_Door8vfunc_10EP13MenuItemState kind:function(arm,size=0x8) addr:0x021c1008 +_ZN3map8MIU_Door8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c1010 +_ZN3map9MIU_Visit8vfunc_1cEv kind:function(arm,size=0xc0) addr:0x021c1024 +_ZN3map9MIU_Visit8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c10e4 +_ZN3map9MIU_Visit8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c1100 +_ZN3map9MIU_Visit8vfunc_14Ev kind:function(arm,size=0x84) addr:0x021c112c +_ZN3map9MIU_Visit8vfunc_10EP13MenuItemState kind:function(arm,size=0x8) addr:0x021c11b0 +_ZN3map9MIU_Visit8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c11b8 +_ZN3map9MIU_Trade8vfunc_1cEv kind:function(arm,size=0x1c) addr:0x021c11cc +_ZN3map9MIU_Trade8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c11e8 +_ZN3map9MIU_Trade8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c1204 +_ZN3map9MIU_Trade8vfunc_14Ev kind:function(arm,size=0x1c8) addr:0x021c1230 +_ZN3map9MIU_Trade8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c13f8 +_ZN3map8MIU_Item8vfunc_1cEv kind:function(arm,size=0x24) addr:0x021c140c +_ZN3map8MIU_Item8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c1430 +_ZN3map8MIU_Item8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c144c +_ZN3map8MIU_Item8vfunc_18Ev kind:function(arm,size=0x74) addr:0x021c1478 +_ZN3map8MIU_Item8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c14ec +_ZN3map7MIU_Rod8vfunc_1cEv kind:function(arm,size=0x24) addr:0x021c1500 +_ZN3map7MIU_Rod8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c1524 +_ZN3map7MIU_Rod8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c1540 +_ZN3map7MIU_Rod8vfunc_18Ev kind:function(arm,size=0x148) addr:0x021c156c +_ZN3map7MIU_Rod8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c16b4 +_ZN3map10MIU_Attack8vfunc_1cEv kind:function(arm,size=0x24) addr:0x021c16c8 +_ZN3map10MIU_Attack8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c16ec +_ZN3map10MIU_Attack8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c1708 +_ZN3map10MIU_Attack8vfunc_14Ev kind:function(arm,size=0x134) addr:0x021c1734 +_ZN3map10MIU_Attack8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c1868 +_ZN3map8MIU_Talk8vfunc_1cEv kind:function(arm,size=0x1c) addr:0x021c187c +_ZN3map8MIU_Talk8vfunc_78EP4MenuP13MenuItemState kind:function(arm,size=0x1c) addr:0x021c1898 +_ZN3map8MIU_Talk8vfunc_90EP4MenuP13MenuItemState kind:function(arm,size=0x2c) addr:0x021c18b4 +_ZN3map8MIU_Talk8vfunc_14Ev kind:function(arm,size=0x334) addr:0x021c18e0 +_ZN3map8MIU_Talk8vfunc_10Ev kind:function(arm,size=0x8) addr:0x021c1c14 +_ZN3map8MIU_Talk8vfunc_00Ev kind:function(arm,size=0x14) addr:0x021c1c1c +_ZN3map8UnitMenu8vfunc_60Ev kind:function(arm,size=0x74) addr:0x021c1c30 +_ZN3map8UnitMenu8vfunc_28El kind:function(arm,size=0x4c) addr:0x021c1ca4 +_ZN3map8UnitMenu8vfunc_24EP13MenuItemStatel kind:function(arm,size=0x2c) addr:0x021c1cf0 +_ZN3map8UnitMenu9vfunc_11cEv kind:function(arm,size=0x14) addr:0x021c1d1c +_ZN3map8UnitMenu8vfunc_00Ev kind:function(arm,size=0x18) addr:0x021c1d30 +_ZN3map8UnitMenuD1Ev kind:function(arm,size=0x64) addr:0x021c1d48 +_ZN3map8UnitMenuD0Ev kind:function(arm,size=0x6c) addr:0x021c1dac func_ov000_021c1e18 kind:function(arm,size=0x90) addr:0x021c1e18 func_ov000_021c1ea8 kind:function(arm,size=0x294) addr:0x021c1ea8 func_ov000_021c213c kind:function(arm,size=0x38) addr:0x021c213c diff --git a/include/action.hpp b/include/action.hpp new file mode 100644 index 0000000..a5999de --- /dev/null +++ b/include/action.hpp @@ -0,0 +1,60 @@ +#ifndef ACTION_HPP +#define ACTION_HPP + +#include "global.h" + +enum +{ + ACTION_NONE = 0x00, + ACTION_FIGHT = 0x01, + ACTION_STAFF = 0x02, + // 0x03 + ACTION_WAIT = 0x04, + ACTION_DOOR = 0x05, + ACTION_CHEST = 0x06, + ACTION_BRIDGE = 0x07, + // 0x08 + // 0x09 + ACTION_ARMORY = 0x0A, + ACTION_VENDOR = 0x0B, + ACTION_SECRET_SHOP = 0x0C, + // 0x0D + ACTION_SEIZE = 0x0E, + ACTION_ESCAPE = 0x0F, + // 0x10 + ACTION_IMITATION = 0x11, + // 0x12 + ACTION_DECOY = 0x13, + ACTION_TALK = 0x14, + // 0x15 + // 0x16 + // 0x17 +}; + +class ActionState +{ +public: + STRUCT_PAD(0x00, 0x14); + u32 unk_14; + STRUCT_PAD(0x18, 0x2C); + s8 unk_2c; + s8 unk_2d; + u8 unk_2e; + u8 unk_2f; + /* 30 */ s8 xDecision; + /* 31 */ s8 yDecision; + /* 32 */ u8 unitId; // "MindGetUnit" returns this + /* 33 */ u8 actionId; // "MindGetMind" returns this + u8 unk_34; // target unit ID? + u8 unk_35; + u8 unk_36; + u8 unk_37; // item slot? + + void func_ov000_021b0eb4(struct Unit *); + void func_ov000_021b0ee8(struct Unit *); + void func_ov000_021b0f1c(struct Unit *); +}; + +extern struct ActionState * gActionSt; + +#endif // ACTION_HPP \ No newline at end of file diff --git a/include/menu.hpp b/include/menu.hpp index 3680bd1..f3bfd6d 100644 --- a/include/menu.hpp +++ b/include/menu.hpp @@ -28,6 +28,21 @@ enum MENU_ACTIVE = 8, }; +enum +{ + MENU_ACTION_x1 = (1 << 0), + MENU_ACTION_x2 = (1 << 1), + MENU_ACTION_x4 = (1 << 2), + MENU_ACTION_x8 = (1 << 3), // end this menu? + MENU_ACTION_x10 = (1 << 4), // end parent menu? + MENU_ACTION_x20 = (1 << 5), // end all menus? + MENU_ACTION_x40 = (1 << 6), // process success? + MENU_ACTION_x80 = (1 << 7), // process cancel? + MENU_ACTION_x100 = (1 << 8), // process failure? + + MENU_ACTION_x1000 = (1 << 12), // block? +}; + class ProcMenu; class MenuItem; class MenuItemState; diff --git a/include/unknown_funcs.h b/include/unknown_funcs.h index 763ad5d..abcb191 100644 --- a/include/unknown_funcs.h +++ b/include/unknown_funcs.h @@ -6276,118 +6276,118 @@ EC void func_ov000_021bec24(ProcPtr); // EC ??? func_ov000_021bfa3c // EC ??? func_ov000_021bfa60 // EC ??? func_ov000_021bfaf0 -EC void func_ov000_021bfb80(ProcPtr); -// EC ??? func_ov000_021bfea0 -// EC ??? func_ov000_021bfeec -// EC ??? func_ov000_021bff08 -// EC ??? func_ov000_021bff34 -// EC ??? func_ov000_021bff48 -// EC ??? func_ov000_021bff5c -// EC ??? func_ov000_021bff78 -// EC ??? func_ov000_021bffa4 -// EC ??? func_ov000_021bffec -// EC ??? func_ov000_021c0004 -// EC ??? func_ov000_021c0018 -// EC ??? func_ov000_021c0068 -// EC ??? func_ov000_021c0084 -// EC ??? func_ov000_021c00a0 -// EC ??? func_ov000_021c00cc -// EC ??? func_ov000_021c0290 -// EC ??? func_ov000_021c02a4 -// EC ??? func_ov000_021c02dc -// EC ??? func_ov000_021c02f8 -// EC ??? func_ov000_021c0324 -// EC ??? func_ov000_021c0380 -// EC ??? func_ov000_021c0398 -// EC ??? func_ov000_021c03ac -// EC ??? func_ov000_021c03c0 -// EC ??? func_ov000_021c03dc -// EC ??? func_ov000_021c0408 -// EC ??? func_ov000_021c0464 -// EC ??? func_ov000_021c046c -// EC ??? func_ov000_021c0480 -// EC ??? func_ov000_021c04d0 -// EC ??? func_ov000_021c0508 -// EC ??? func_ov000_021c0524 -// EC ??? func_ov000_021c0550 -// EC ??? func_ov000_021c0754 -// EC ??? func_ov000_021c0768 -// EC ??? func_ov000_021c07a0 -// EC ??? func_ov000_021c07bc -// EC ??? func_ov000_021c07e8 -// EC ??? func_ov000_021c0870 -// EC ??? func_ov000_021c0884 -// EC ??? func_ov000_021c08bc -// EC ??? func_ov000_021c08d8 -// EC ??? func_ov000_021c0904 -// EC ??? func_ov000_021c0978 -// EC ??? func_ov000_021c098c -// EC ??? func_ov000_021c09c4 -// EC ??? func_ov000_021c09e0 -// EC ??? func_ov000_021c0a0c -// EC ??? func_ov000_021c0a54 -// EC ??? func_ov000_021c0a68 -// EC ??? func_ov000_021c0aa0 -// EC ??? func_ov000_021c0abc -// EC ??? func_ov000_021c0ae8 -// EC ??? func_ov000_021c0b30 -// EC ??? func_ov000_021c0b44 -// EC ??? func_ov000_021c0b90 -// EC ??? func_ov000_021c0bac -// EC ??? func_ov000_021c0bd8 -// EC ??? func_ov000_021c0c30 -// EC ??? func_ov000_021c0c38 -// EC ??? func_ov000_021c0c4c -// EC ??? func_ov000_021c0c98 -// EC ??? func_ov000_021c0cb4 +EC void StartUnitMenu(ProcPtr); +// EC ??? _ZN3map9MIU_Fixed8vfunc_1cEv +// EC ??? _ZN3map9MIU_Fixed8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map9MIU_Fixed8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map9MIU_Fixed8vfunc_00Ev +// EC ??? _ZN3map8MIU_Lure8vfunc_24EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Lure8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Lure8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Lure8vfunc_14Ev +// EC ??? _ZN3map8MIU_Lure8vfunc_10EP13MenuItemState +// EC ??? _ZN3map8MIU_Lure8vfunc_00Ev +// EC ??? _ZN3map10DI_LureYes8vfunc_1cEv +// EC ??? _ZN3map13MIU_Imitation8vfunc_1cEv +// EC ??? _ZN3map13MIU_Imitation8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map13MIU_Imitation8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map13MIU_Imitation8vfunc_14Ev +// EC ??? _ZN3map13MIU_Imitation8vfunc_00Ev +// EC ??? _ZN3map8MIU_Save8vfunc_20EP13MenuItemState +// EC ??? _ZN3map8MIU_Save8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Save8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Save8vfunc_14Ev +// EC ??? _ZN3map8MIU_Save8vfunc_10EP13MenuItemState +// EC ??? _ZN3map8MIU_Save8vfunc_00Ev +// EC ??? _ZN3map12MIU_Complete8vfunc_24EP4MenuP13MenuItemState +// EC ??? _ZN3map12MIU_Complete8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map12MIU_Complete8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map12MIU_Complete8vfunc_14Ev +// EC ??? _ZN3map12MIU_Complete8vfunc_10EP13MenuItemState +// EC ??? _ZN3map12MIU_Complete8vfunc_00Ev +// EC ??? _ZN3map14DI_CompleteYes8vfunc_1cEv +// EC ??? _ZN3map15MIU_Transporter8vfunc_20EP13MenuItemState +// EC ??? _ZN3map15MIU_Transporter8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map15MIU_Transporter8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map15MIU_Transporter8vfunc_14Ev +// EC ??? _ZN3map15MIU_Transporter8vfunc_00Ev +// EC ??? _ZN3map9MIU_Arena8vfunc_20EP13MenuItemState +// EC ??? _ZN3map9MIU_Arena8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map9MIU_Arena8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map9MIU_Arena8vfunc_14Ev +// EC ??? _ZN3map9MIU_Arena8vfunc_00Ev +// EC ??? _ZN3map14MIU_SecretShop8vfunc_1cEv +// EC ??? _ZN3map14MIU_SecretShop8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map14MIU_SecretShop8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map14MIU_SecretShop8vfunc_14Ev +// EC ??? _ZN3map14MIU_SecretShop8vfunc_00Ev +// EC ??? _ZN3map12MIU_ItemShop8vfunc_1cEv +// EC ??? _ZN3map12MIU_ItemShop8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map12MIU_ItemShop8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map12MIU_ItemShop8vfunc_14Ev +// EC ??? _ZN3map12MIU_ItemShop8vfunc_00Ev +// EC ??? _ZN3map14MIU_WeaponShop8vfunc_1cEv +// EC ??? _ZN3map14MIU_WeaponShop8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map14MIU_WeaponShop8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map14MIU_WeaponShop8vfunc_14Ev +// EC ??? _ZN3map14MIU_WeaponShop8vfunc_00Ev +// EC ??? _ZN3map8MIU_TBox8vfunc_1cEv +// EC ??? _ZN3map8MIU_TBox8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_TBox8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_TBox8vfunc_14Ev +// EC ??? _ZN3map8MIU_TBox8vfunc_10EP13MenuItemState +// EC ??? _ZN3map8MIU_TBox8vfunc_00Ev +// EC ??? _ZN3map10MIU_Bridge8vfunc_1cEv +// EC ??? _ZN3map10MIU_Bridge8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map10MIU_Bridge8vfunc_90EP4MenuP13MenuItemState // EC ??? func_ov000_021c0ce0 -// EC ??? func_ov000_021c0e1c -// EC ??? func_ov000_021c0e24 -// EC ??? func_ov000_021c0e38 -// EC ??? func_ov000_021c0e84 -// EC ??? func_ov000_021c0ea0 -// EC ??? func_ov000_021c0ecc -// EC ??? func_ov000_021c1008 -// EC ??? func_ov000_021c1010 -// EC ??? func_ov000_021c1024 -// EC ??? func_ov000_021c10e4 -// EC ??? func_ov000_021c1100 -// EC ??? func_ov000_021c112c -// EC ??? func_ov000_021c11b0 -// EC ??? func_ov000_021c11b8 -// EC ??? func_ov000_021c11cc -// EC ??? func_ov000_021c11e8 -// EC ??? func_ov000_021c1204 -// EC ??? func_ov000_021c1230 -// EC ??? func_ov000_021c13f8 -// EC ??? func_ov000_021c140c -// EC ??? func_ov000_021c1430 -// EC ??? func_ov000_021c144c -// EC ??? func_ov000_021c1478 -// EC ??? func_ov000_021c14ec -// EC ??? func_ov000_021c1500 -// EC ??? func_ov000_021c1524 -// EC ??? func_ov000_021c1540 -// EC ??? func_ov000_021c156c -// EC ??? func_ov000_021c16b4 -// EC ??? func_ov000_021c16c8 -// EC ??? func_ov000_021c16ec -// EC ??? func_ov000_021c1708 -// EC ??? func_ov000_021c1734 -// EC ??? func_ov000_021c1868 -// EC ??? func_ov000_021c187c -// EC ??? func_ov000_021c1898 -// EC ??? func_ov000_021c18b4 -// EC ??? func_ov000_021c18e0 -// EC ??? func_ov000_021c1c14 -// EC ??? func_ov000_021c1c1c -// EC ??? func_ov000_021c1c30 -// EC ??? func_ov000_021c1ca4 -// EC ??? func_ov000_021c1cf0 -// EC ??? func_ov000_021c1d1c -// EC ??? func_ov000_021c1d30 -// EC ??? func_ov000_021c1d48 -// EC ??? func_ov000_021c1dac +// EC ??? _ZN3map10MIU_Bridge8vfunc_10EP13MenuItemState +// EC ??? _ZN3map10MIU_Bridge8vfunc_00Ev +// EC ??? _ZN3map8MIU_Door8vfunc_1cEv +// EC ??? _ZN3map8MIU_Door8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Door8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Door8vfunc_14Ev +// EC ??? _ZN3map8MIU_Door8vfunc_10EP13MenuItemState +// EC ??? _ZN3map8MIU_Door8vfunc_00Ev +// EC ??? _ZN3map9MIU_Visit8vfunc_1cEv +// EC ??? _ZN3map9MIU_Visit8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map9MIU_Visit8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map9MIU_Visit8vfunc_14Ev +// EC ??? _ZN3map9MIU_Visit8vfunc_10EP13MenuItemState +// EC ??? _ZN3map9MIU_Visit8vfunc_00Ev +// EC ??? _ZN3map9MIU_Trade8vfunc_1cEv +// EC ??? _ZN3map9MIU_Trade8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map9MIU_Trade8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map9MIU_Trade8vfunc_14Ev +// EC ??? _ZN3map9MIU_Trade8vfunc_00Ev +// EC ??? _ZN3map8MIU_Item8vfunc_1cEv +// EC ??? _ZN3map8MIU_Item8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Item8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Item8vfunc_18Ev +// EC ??? _ZN3map8MIU_Item8vfunc_00Ev +// EC ??? _ZN3map7MIU_Rod8vfunc_1cEv +// EC ??? _ZN3map7MIU_Rod8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map7MIU_Rod8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map7MIU_Rod8vfunc_18Ev +// EC ??? _ZN3map7MIU_Rod8vfunc_00Ev +// EC ??? _ZN3map10MIU_Attack8vfunc_1cEv +// EC ??? _ZN3map10MIU_Attack8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map10MIU_Attack8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map10MIU_Attack8vfunc_14Ev +// EC ??? _ZN3map10MIU_Attack8vfunc_00Ev +// EC ??? _ZN3map8MIU_Talk8vfunc_1cEv +// EC ??? _ZN3map8MIU_Talk8vfunc_78EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Talk8vfunc_90EP4MenuP13MenuItemState +// EC ??? _ZN3map8MIU_Talk8vfunc_14Ev +// EC ??? _ZN3map8MIU_Talk8vfunc_10Ev +// EC ??? _ZN3map8MIU_Talk8vfunc_00Ev +// EC ??? _ZN3map8UnitMenu8vfunc_60Ev +// EC ??? _ZN3map8UnitMenu8vfunc_28El +// EC ??? _ZN3map8UnitMenu8vfunc_24EP13MenuItemStatel +// EC ??? _ZN3map8UnitMenu9vfunc_11cEv +// EC ??? _ZN3map8UnitMenu8vfunc_00Ev +// EC ??? _ZN3map8UnitMenuD1Ev +// EC ??? _ZN3map8UnitMenuD0Ev // EC ??? func_ov000_021c1e18 // EC ??? func_ov000_021c1ea8 // EC ??? func_ov000_021c213c diff --git a/include/unknown_types.h b/include/unknown_types.h index 93a4b28..596a9c4 100644 --- a/include/unknown_types.h +++ b/include/unknown_types.h @@ -213,7 +213,7 @@ struct UnkStruct_021e3340 u8 unk_01; u8 unk_02; u8 unk_03; - STRUCT_PAD(0x03, 0x06); + STRUCT_PAD(0x04, 0x06); u8 unk_06; u8 unk_07; }; diff --git a/src/menu.cpp b/src/menu.cpp index 22f7283..0672b4e 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -144,34 +144,34 @@ struct UnkStruct_021970c4 extern struct UnkStruct_021970c4 * data_021970c4; extern struct UnkStruct_021970c4 * data_021970cc; -s32 MenuItem::vfunc_ac(MenuItemState * param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6) +s32 MenuItem::vfunc_ac(MenuItemState * menuItemState, s32 bg, s32 tileNum, s32 param_5, s32 param_6) { - s32 bVar1; - s32 bVar2; - ScreenState * pSVar3; + s32 x; + s32 y; + ScreenState * screenSt; s32 uVar6; - bVar1 = param_2->unk_04; - bVar2 = param_2->unk_05; + x = menuItemState->unk_04; + y = menuItemState->unk_05; uVar6 = 0; - if (this->vfunc_04(param_2) != 0) + if (this->vfunc_04(menuItemState) != NULL) { - data_021970c4->unk_08 = (void *)((u32 *)(data_021970cc->unk_00))[this->vfunc_10(param_2)]; + data_021970c4->unk_08 = (void *)((u32 *)(data_021970cc->unk_00))[this->vfunc_10(menuItemState)]; - pSVar3 = gpActiveScreenSt; + screenSt = gpActiveScreenSt; if (param_6 != 0) { uVar6 = func_0202972c( - data_021970c4, this->vfunc_04(param_2), pSVar3->bgTiles[param_3], pSVar3->tilemap[param_3], bVar1, - bVar2, param_4, param_5, param_6, 0, 0); + data_021970c4, this->vfunc_04(menuItemState), screenSt->bgTiles[bg], screenSt->tilemap[bg], x, + y, tileNum, param_5, param_6, 0, 0); } else { uVar6 = func_020295ec( - data_021970c4, this->vfunc_04(param_2), pSVar3->bgTiles[param_3], pSVar3->tilemap[param_3], bVar1, - bVar2, param_4, param_5, 0, 0); + data_021970c4, this->vfunc_04(menuItemState), screenSt->bgTiles[bg], screenSt->tilemap[bg], x, + y, tileNum, param_5, 0, 0); } } @@ -180,7 +180,7 @@ s32 MenuItem::vfunc_ac(MenuItemState * param_2, s32 param_3, s32 param_4, s32 pa EC u32 func_02028e7c(UnkStruct_021970c4 *, char *, s32); -u32 MenuItem::vfunc_c8(MenuItemState * param_2) +u32 MenuItem::vfunc_c8(MenuItemState * menuItemState) { u32 uVar1 = this->vfunc_c4(); @@ -189,17 +189,17 @@ u32 MenuItem::vfunc_c8(MenuItemState * param_2) return uVar1; } - if (this->vfunc_04(param_2) != NULL) + if (this->vfunc_04(menuItemState) != NULL) { - return (func_02028e7c(data_021970c4, this->vfunc_04(param_2), 0) + 7 & ~7) / 8; + return (func_02028e7c(data_021970c4, this->vfunc_04(menuItemState), 0) + 7 & ~7) / 8; } return 0; } -s32 MenuItem::vfunc_10(MenuItemState * param_2) +s32 MenuItem::vfunc_10(MenuItemState * menuItemState) { - if ((param_2->unk_09 & 7) != 1) + if ((menuItemState->unk_09 & 7) != 1) { return MENU_COLOR_WHITE; } @@ -207,37 +207,37 @@ s32 MenuItem::vfunc_10(MenuItemState * param_2) return MENU_COLOR_GRAY; } -void MenuItem::vfunc_b4(Menu * param_2, MenuItemState * param_3) +void MenuItem::vfunc_b4(Menu * menu, MenuItemState * menuItemState) { - param_2->vfunc_fc(param_3->unk_04, param_3->unk_05, param_3->unk_06, param_3->unk_07); - gpActiveScreenSt->unk_3e |= (1 << param_2->unk_30); + menu->vfunc_fc(menuItemState->unk_04, menuItemState->unk_05, menuItemState->unk_06, menuItemState->unk_07); + gpActiveScreenSt->unk_3e |= (1 << menu->unk_30); return; } -void MenuItem::vfunc_b8(Menu * param_2, MenuItemState * param_3) +void MenuItem::vfunc_b8(Menu * menu, MenuItemState * menuItemState) { - param_2->vfunc_108(param_3->unk_04, param_3->unk_05, param_3->unk_06, param_3->unk_07); - gpActiveScreenSt->unk_3e |= (1 << param_2->unk_30); + menu->vfunc_108(menuItemState->unk_04, menuItemState->unk_05, menuItemState->unk_06, menuItemState->unk_07); + gpActiveScreenSt->unk_3e |= (1 << menu->unk_30); return; } -void MenuItem::vfunc_bc(Menu * param_2, MenuItemState * param_3) +void MenuItem::vfunc_bc(Menu * menu, MenuItemState * menuItemState) { - param_2->vfunc_100(param_3->unk_04, param_3->unk_05, param_3->unk_06, param_3->unk_07); - gpActiveScreenSt->unk_3e |= (1 << param_2->unk_30); + menu->vfunc_100(menuItemState->unk_04, menuItemState->unk_05, menuItemState->unk_06, menuItemState->unk_07); + gpActiveScreenSt->unk_3e |= (1 << menu->unk_30); return; } -void MenuItem::vfunc_c0(Menu * param_2, MenuItemState * param_3) +void MenuItem::vfunc_c0(Menu * menu, MenuItemState * menuItemState) { - param_2->vfunc_fc(param_3->unk_04, param_3->unk_05, param_3->unk_06, param_3->unk_07); - gpActiveScreenSt->unk_3e |= (1 << param_2->unk_30); + menu->vfunc_fc(menuItemState->unk_04, menuItemState->unk_05, menuItemState->unk_06, menuItemState->unk_07); + gpActiveScreenSt->unk_3e |= (1 << menu->unk_30); return; } -EC BOOL func_0202dad0(MenuItemState * param_1, Menu * param_2) +EC BOOL func_0202dad0(MenuItemState * menuItemState, Menu * menu) { - return (¶m_2->unk_0c[param_2->unk_38] == param_1) & 0xff; + return (&menu->unk_0c[menu->unk_38] == menuItemState) & 0xff; } s32 Menu::vfunc_78(void) @@ -672,10 +672,8 @@ BOOL Menu::vfunc_b4(void) void Menu::vfunc_68(s32 param_2) { - MenuItemState * pMVar1; - int iVar2; - int iVar3; - int iVar4; + s32 iVar2; + s32 iVar3; u32 uVar5; MenuItemState * pMVar6; @@ -1098,8 +1096,6 @@ EC void func_0202b31c(u16, u16, u32, u32); void Menu::_0202f040(s32 param_2, s32 param_3, s32 param_4) { - s32 sVar1; - s32 sVar2; s32 a; s32 r3; u32 bVar3; @@ -1590,115 +1586,118 @@ PROC_LABEL(1), // clang-format on -EC void StartMenu(Menu * param_1, MenuItem ** param_2, s32 param_3) +EC void StartMenu(Menu * menu, MenuItem ** menuItems, s32 param_3) { - param_1->unk_08 = param_2; + menu->unk_08 = menuItems; - param_1->vfunc_00(); + menu->vfunc_00(); if (param_3 != 0) { - param_1->vfunc_128(); + menu->vfunc_128(); } - param_1->unk_49 = param_1->unk_48; + menu->unk_49 = menu->unk_48; - param_1->_0202f8c4(); + menu->_0202f8c4(); - param_1->vfunc_04(); + menu->vfunc_04(); - if (param_1->unk_04 != NULL) + if (menu->unk_04 != NULL) { - param_1->unk_10 = new (Proc_StartBlocking(ProcScr_ProcMenu, param_1->unk_04->unk_10)) ProcMenu(param_1); + menu->unk_10 = new (Proc_StartBlocking(ProcScr_ProcMenu, menu->unk_04->unk_10)) ProcMenu(menu); } else { - param_1->unk_10 = new (Proc_Start(ProcScr_ProcMenu, PROC_TREE_9)) ProcMenu(param_1); + menu->unk_10 = new (Proc_Start(ProcScr_ProcMenu, PROC_TREE_9)) ProcMenu(menu); } + return; } -EC void StartChildMenu(Menu * param_1, MenuItem ** param_2, ProcPtr param_3, u32 param_4, u8 param_5) +EC void StartChildMenu(Menu * menu, MenuItem ** menuItems, ProcPtr parent, u32 param_4, u8 param_5) { - param_1->unk_08 = param_2; + menu->unk_08 = menuItems; - if ((!IsRootProcess((struct Proc *)param_3)) && (func_020190c4((struct Proc *)param_3) == ProcScr_ProcMenu)) + if ((!IsRootProcess((struct Proc *)parent)) && (func_020190c4((struct Proc *)parent) == ProcScr_ProcMenu)) { - param_1->unk_04 = static_cast(param_3)->unk_38; + menu->unk_04 = static_cast(parent)->unk_38; } - param_1->vfunc_00(); + menu->vfunc_00(); if (param_5 != 0) { - param_1->vfunc_128(); + menu->vfunc_128(); } - param_1->unk_49 = param_1->unk_48; + menu->unk_49 = menu->unk_48; - param_1->_0202f8c4(); + menu->_0202f8c4(); - param_1->vfunc_04(); + menu->vfunc_04(); if (param_4) { - param_1->unk_10 = new (Proc_StartBlocking(ProcScr_ProcMenu, param_3)) ProcMenu(param_1); + menu->unk_10 = new (Proc_StartBlocking(ProcScr_ProcMenu, parent)) ProcMenu(menu); } else { - param_1->unk_10 = new (Proc_Start(ProcScr_ProcMenu, param_3)) ProcMenu(param_1); + menu->unk_10 = new (Proc_Start(ProcScr_ProcMenu, parent)) ProcMenu(menu); } + + return; } -EC void func_0202fc30(Menu * param_1, s32 param_2, s32 param_3) +EC void func_0202fc30(Menu * menu, s32 param_2, s32 param_3) { - param_1->unk_0c[param_1->unk_38].unk_00->vfunc_84(param_1, ¶m_1->unk_0c[param_1->unk_38]); + menu->unk_0c[menu->unk_38].unk_00->vfunc_84(menu, &menu->unk_0c[menu->unk_38]); - param_1->vfunc_dc(); - param_1->vfunc_ec(); + menu->vfunc_dc(); + menu->vfunc_ec(); if (param_2 != 0) { - param_1->unk_34 = param_1->unk_35 = -1; + menu->unk_34 = menu->unk_35 = -1; } if (param_3 != 0) { - param_1->unk_36 = param_1->unk_37 = -1; + menu->unk_36 = menu->unk_37 = -1; } - param_1->_0202f8c4(); + menu->_0202f8c4(); - param_1->vfunc_e8(); - param_1->vfunc_d8(); + menu->vfunc_e8(); + menu->vfunc_d8(); - param_1->unk_3f = 1; + menu->unk_3f = 1; - param_1->unk_0c[param_1->unk_38].unk_00->vfunc_78(param_1, ¶m_1->unk_0c[param_1->unk_38]); + menu->unk_0c[menu->unk_38].unk_00->vfunc_78(menu, &menu->unk_0c[menu->unk_38]); - param_1->unk_45 = 0; + menu->unk_45 = 0; return; } -EC void func_0202fd1c(Menu * param_1, s32 param_2, s32 param_3) +EC void func_0202fd1c(Menu * menu, s32 param_2, s32 param_3) { - if (param_3 != 0 || param_2 != param_1->unk_38) + if (param_3 != 0 || param_2 != menu->unk_38) { - param_1->unk_0c[param_1->unk_38].unk_00->vfunc_b8(param_1, ¶m_1->unk_0c[param_1->unk_38]); - param_1->unk_0c[param_1->unk_38].unk_00->vfunc_84(param_1, ¶m_1->unk_0c[param_1->unk_38]); + menu->unk_0c[menu->unk_38].unk_00->vfunc_b8(menu, &menu->unk_0c[menu->unk_38]); + menu->unk_0c[menu->unk_38].unk_00->vfunc_84(menu, &menu->unk_0c[menu->unk_38]); - param_1->vfunc_ec(); + menu->vfunc_ec(); - param_1->unk_39 = param_2; - param_1->unk_38 = param_2; + menu->unk_39 = param_2; + menu->unk_38 = param_2; - param_1->vfunc_e8(); + menu->vfunc_e8(); - param_1->unk_0c[param_1->unk_38].unk_00->vfunc_78(param_1, ¶m_1->unk_0c[param_1->unk_38]); - param_1->unk_0c[param_1->unk_38].unk_00->vfunc_b4(param_1, ¶m_1->unk_0c[param_1->unk_38]); + menu->unk_0c[menu->unk_38].unk_00->vfunc_78(menu, &menu->unk_0c[menu->unk_38]); + menu->unk_0c[menu->unk_38].unk_00->vfunc_b4(menu, &menu->unk_0c[menu->unk_38]); - param_1->unk_3f = 1; + menu->unk_3f = 1; } return; @@ -1707,23 +1706,23 @@ EC void func_0202fd1c(Menu * param_1, s32 param_2, s32 param_3) EC void func_02033f98(void); EC BOOL func_02033f54(ProcMenu *); -EC BOOL func_0202fe14(ProcMenu * param_1) +EC BOOL func_0202fe14(ProcMenu * proc) { - if (func_020190c4((struct Proc *)param_1) == ProcScr_ProcMenu) + if (func_020190c4((struct Proc *)proc) == ProcScr_ProcMenu) { return TRUE; } - return func_02033f54(param_1) != 0; + return func_02033f54(proc) != 0; } -EC void func_0202fe4c(ProcMenu * param_1) +EC void func_0202fe4c(ProcMenu * proc) { ProcMenu * p; - Proc_Goto(param_1, 1, 0); + Proc_Goto(proc, 1, 0); - p = (ProcMenu *)func_020190cc((struct Proc *)param_1); + p = (ProcMenu *)func_020190cc((struct Proc *)proc); if (p == NULL) { return; @@ -1734,26 +1733,26 @@ EC void func_0202fe4c(ProcMenu * param_1) return; } - func_02019124((struct Proc *)param_1); + func_02019124((struct Proc *)proc); return; } -EC void func_0202fe88(ProcMenu * param_1) +EC void func_0202fe88(ProcMenu * proc) { - Proc_Goto(param_1, 1, 0); + Proc_Goto(proc, 1, 0); return; } -EC void func_0202fe9c(Menu * param_1, s32 param_2) +EC void func_0202fe9c(Menu * menu, s32 param_2) { if (param_2 != 0) { - func_0202fe88(param_1->unk_10); + func_0202fe88(menu->unk_10); } else { - func_0202fe4c(param_1->unk_10); + func_0202fe4c(menu->unk_10); } return; @@ -1775,9 +1774,9 @@ EC void func_0202febc(s32 param_1) return; } -EC void func_0202fef8(Menu * param_1) +EC void func_0202fef8(Menu * menu) { - Proc_End(param_1->unk_10); + Proc_End(menu->unk_10); return; } @@ -1790,26 +1789,26 @@ EC void func_0202ff08(void) return; } -EC void LockMenu(Menu * param_1) +EC void LockMenu(Menu * menu) { - Proc_Lock((struct Proc *)param_1->unk_10); + Proc_Lock((struct Proc *)menu->unk_10); return; } -EC void UnlockMenu(Menu * param_1) +EC void UnlockMenu(Menu * menu) { - Proc_Release((struct Proc *)param_1->unk_10); + Proc_Release((struct Proc *)menu->unk_10); return; } -EC BOOL IsMenuLocked(Menu * param_1) +EC BOOL IsMenuLocked(Menu * menu) { - return IsProcLocked((struct Proc *)param_1->unk_10); + return IsProcLocked((struct Proc *)menu->unk_10); } -EC BOOL func_0202ff50(Menu * param_1) +EC BOOL func_0202ff50(Menu * menu) { - return func_02018f5c((struct Proc *)param_1->unk_10) != NULL; + return func_02018f5c((struct Proc *)menu->unk_10) != NULL; } EC BOOL IsMenuActive(void) @@ -1817,55 +1816,55 @@ EC BOOL IsMenuActive(void) return Proc_Find(ProcScr_ProcMenu) != NULL; } -EC Menu * func_0202ff8c(ProcMenu * param_1) +EC Menu * func_0202ff8c(ProcMenu * proc) { - if (param_1 == NULL) + if (proc == NULL) { - param_1 = static_cast(Proc_Find(ProcScr_ProcMenu)); + proc = static_cast(Proc_Find(ProcScr_ProcMenu)); } - if (param_1 == NULL) + if (proc == NULL) { return NULL; } else { - return param_1->unk_38; + return proc->unk_38; } } -EC Menu * func_0202ffb4(ProcPtr param_1) +EC Menu * func_0202ffb4(ProcPtr proc) { - ProcMenu * proc = static_cast((void *)func_02018d9c(ProcScr_ProcMenu, (struct Proc *)param_1)); + ProcMenu * found = static_cast((void *)func_02018d9c(ProcScr_ProcMenu, (struct Proc *)proc)); - if (proc != NULL) + if (found != NULL) { - return proc->unk_38; + return found->unk_38; } return NULL; } -EC Menu * func_0202ffd8(ProcPtr param_1) +EC Menu * func_0202ffd8(ProcPtr proc) { - ProcMenu * proc = static_cast((void *)func_02018df4(ProcScr_ProcMenu, (struct Proc *)param_1)); + ProcMenu * found = static_cast((void *)func_02018df4(ProcScr_ProcMenu, (struct Proc *)proc)); - if (proc != NULL) + if (found != NULL) { - return proc->unk_38; + return found->unk_38; } return NULL; } -BOOL SplitMenu::vfunc_b0(MenuItemState * arg1, s32 arg2, s32 arg3) +BOOL SplitMenu::vfunc_b0(MenuItemState * menuItemState, s32 arg2, s32 arg3) { - if ((arg2 < ((arg1->unk_04) * 8)) || (arg2 >= ((arg1->unk_04 + arg1->unk_06) * 8))) + if ((arg2 < ((menuItemState->unk_04) * 8)) || (arg2 >= ((menuItemState->unk_04 + menuItemState->unk_06) * 8))) { return FALSE; } - if ((arg3 < (arg1->unk_05 * 8)) || (arg3 >= ((arg1->unk_05 + arg1->unk_07) * 8))) + if ((arg3 < (menuItemState->unk_05 * 8)) || (arg3 >= ((menuItemState->unk_05 + menuItemState->unk_07) * 8))) { return FALSE; } diff --git a/src/ov000/map_unit_menu.cpp b/src/ov000/map_unit_menu.cpp new file mode 100644 index 0000000..8c1ed52 --- /dev/null +++ b/src/ov000/map_unit_menu.cpp @@ -0,0 +1,1742 @@ +#include "global.h" + +#include "action.hpp" +#include "event.hpp" +#include "hardware.hpp" +#include "map.hpp" +#include "menu.hpp" +#include "proc_ex.hpp" +#include "unit.hpp" + +#include "unknown_types.hpp" + +extern struct UnkStruct_02196f24 * data_02196f24; +extern Unit * gUnitList; + +inline Unit * GetUnit(s32 unitId) +{ + if (unitId != 0) + { + return gUnitList + unitId - 1; + } + else + { + return NULL; + } +} + +EC s32 func_02039088(struct Unit * unit, int b, int c, int d, int e, int f, int g); +EC void func_01ff9420(MapStateManager_08 *, Unit *, s32, s32); +EC void func_01ff95a4(MapStateManager_08 *, Unit *, s32, s32); + +EC s32 func_0203935c(Unit *, s32); +EC BOOL func_0203d184(Unit *); +EC BOOL func_0203d1bc(Unit *); +EC s32 func_02039400(s32, s32); +EC u64 func_0203cbc4(Unit *, u64); +EC BOOL func_0201f680(void); + +EC BOOL func_0203d1f4(Unit *); + +EC void func_ov000_021bfa60(ProcPtr); + +EC void func_ov000_021bfaf0(ProcPtr); + +EC BOOL func_ov000_021a47e4(void); +EC void func_ov000_021be21c(void); + +EC s32 func_ov000_021d49f4(s32, s32, s32); + +EC BOOL func_0202dad0(MenuItemState * menuItemState, Menu * menu); +EC void func_ov000_021ae180(s32, s32, s32); +EC void func_ov000_021bfa3c(void); +EC void func_ov000_021d6a9c(char *, s32); + +extern struct UnkStruct_021e3340 * data_ov000_021e3340; + +namespace map +{ + +class BMapMenu : public Menu +{ +public: + /* 008 */ virtual void vfunc_08(void); // func_ov000_021be588 + /* 01C */ virtual void vfunc_1c(void); // func_ov000_021be640 + /* 0A0 */ virtual BOOL vfunc_a0(void); // func_ov000_021be978 + /* 0AC */ virtual s32 vfunc_ac(void); // func_ov000_021be960 + + virtual ~BMapMenu() + { + if (this->unk_04 == NULL) + { + gpActiveScreenSt->dispIo->bldcnt.effect = 0; + } + } +}; + +class BSystemMapMenu : public BMapMenu +{ +public: + virtual ~BSystemMapMenu() + { + } +}; + +class UnitMenu : public BSystemMapMenu +{ +public: + virtual ~UnitMenu() + { + } + + /* 000 */ virtual void vfunc_00(void) + { + func_ov000_021be21c(); + this->unk_40 = 1; + return; + } + + /* 11C */ virtual void vfunc_11c(void) + { + func_ov000_021d6f1c(this->unk_10, 1); + return; + } + + /* 024 */ virtual s32 vfunc_24(MenuItemState * menuItemState, s32 param_3) + { + s32 r0 = (param_3 & 0x3f) == 0; + + if (!r0) + { + func_ov000_021bfa3c(); + return param_3; + } + + return param_3; + } + + /* 028 */ virtual s32 vfunc_28(s32 param_2) + { + s32 r0 = (param_2 & 0x3f) == 0; + + if (r0) + { + return param_2; + } + + if (data_ov000_021e3340->unk_06 != 0) + { + return 0x100; + } + + func_ov000_021d6e30(2); + + return param_2; + } + + /* 060 */ virtual s32 vfunc_60(void) + { + if (data_ov000_021e3340->unk_06 != 0) + { + func_ov000_021b0de8( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_WAIT, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021bfa3c(); + + return 0x81; + } + + return this->vfunc_28(0x81); + } +}; + +class MIU_Talk : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + // "Talk" + return func_02039e10("MUM_話す"); + } + + /* 10 */ virtual s32 vfunc_10(void) + { + return MENU_COLOR_GREEN; + } + + /* 14 */ virtual s32 vfunc_14(void) + { + s32 ux; + s32 uy; + s16 xMin; + s16 yMin; + s16 xMax; + s16 yMax; + s16 ix; + s16 iy; + Unit * unit; + + if (func_ov000_021a47e4()) + { + return MENU_NOTSHOWN; + } + + ux = gMapStateManager->unk_04->unk_00->xPos; + uy = gMapStateManager->unk_04->unk_00->yPos; + + xMin = MAX(ux - 1, gMapStateManager->unk_24); + yMin = MAX(uy - 1, gMapStateManager->unk_25); + + xMax = MIN(ux + 1, gMapStateManager->unk_26 - 1); + yMax = MIN(uy + 1, gMapStateManager->unk_27 - 1); + + for (iy = yMin; iy <= yMax; iy++) + { + for (ix = xMin; ix <= xMax; ix++) + { + s32 xDiff; + s32 yDiff; + char * personA; + char * personB; + + yDiff = ABS(gMapStateManager->unk_04->unk_00->yPos - iy); + xDiff = ABS(gMapStateManager->unk_04->unk_00->xPos - ix); + + if ((xDiff + yDiff >= 1) && (xDiff + yDiff <= 1)) + { + unit = GetUnit(gMapStateManager->unk_028[(ix | iy << 5)]); + + if (unit == NULL) + { + continue; + } + + personB = func_0203c378(unit)->pPersonData->unk_00; + personA = func_0203c378(gMapStateManager->unk_04->unk_00)->pPersonData->unk_00; + + if (EventCaller::CanStartTalkEvent((u32)personA, (u32)personB)) + { + return MENU_ENABLED; + } + } + } + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Talk to a neighboring unit. (Shortcuts: ┳┫, ┻╋)" + func_ov000_021d6a9c(func_02039e10("MUMH_話す"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Talk to a neighboring unit. (Shortcuts: ┳┫, ┻╋)" + func_ov000_021d6a9c(func_02039e10("MUMH_話す"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021ae180(0x11, 9, 0); + return MENU_ACTION_x40 | MENU_ACTION_x8; + } +}; + +class MIU_Attack : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + // Attack + return func_02039e10("MUM_攻撃"); + } + + /* 14 */ virtual s32 vfunc_14(void) + { + s32 unitId; + Unit * unit; + s16 ix; + s16 iy; + + func_01ff9420(gMapStateManager->unk_08, gMapStateManager->unk_04->unk_00, -1, -1); + + for (iy = gMapStateManager->unk_25; iy < gMapStateManager->unk_27; iy++) + { + for (ix = gMapStateManager->unk_24; ix < gMapStateManager->unk_26; ix++) + { + s32 unk = gMapStateManager->unk_08->unk_0854[ix | (iy << 5)]; + + if (unk < 0) + { + continue; + } + + unitId = gMapStateManager->unk_028[(ix | (iy << 5))]; + + if (unitId != 0) + { + unit = gUnitList + unitId - 1; + } + else + { + unit = NULL; + } + + if (unit == NULL) + { + continue; + } + + if (func_02039088(gMapStateManager->unk_04->unk_00, ix, iy, unk, 1, 0, -1) < 0) + { + continue; + } + + return 0; + } + } + + return 2; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // Attack with an available weapon. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_攻撃"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // Attack with an available weapon. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_攻撃"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021ae180(0xc, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x8; + } +}; + +class MIU_Rod : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + // Staff + return func_02039e10("MUM_杖"); + } + + /* 18 */ virtual s32 vfunc_18(void) + { + s16 ix; + s16 iy; + + if (func_0203935c(gMapStateManager->unk_04->unk_00, -1) != -1) + { + return 0; + } + + func_01ff95a4(gMapStateManager->unk_08, gMapStateManager->unk_04->unk_00, -1, -1); + + for (iy = gMapStateManager->unk_25; iy < gMapStateManager->unk_27; iy++) + { + for (ix = gMapStateManager->unk_24; ix < gMapStateManager->unk_26; ix++) + { + if (gMapStateManager->unk_08->unk_0854[ix | (iy << 5)] < 0) + { + continue; + } + + if (func_02039400(ix, iy) == 0) + { + continue; + } + + if (func_02039088( + gMapStateManager->unk_04->unk_00, ix, iy, gMapStateManager->unk_08->unk_0854[ix | (iy << 5)], 1, + 0, -1) < 0) + { + continue; + } + + return 0; + } + } + + return 2; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // Use an available staff. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_杖"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // Use an available staff. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_杖"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021ae180(0xc, 1, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x8; + } +}; + +class MIU_Item : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_持ち物"); + } + + /* 18 */ virtual s32 vfunc_18(void) + { + if ((data_02196f24->enableTutorials != 0) && (((data_ov000_021e3324->unk_1c & 1) ? TRUE : FALSE) & 0xFF)) + { + return 2; + } + + if (!((gMapStateManager->unk_04->unk_00->items[0].id != 0 ? TRUE : FALSE) & 0xFF)) + { + return 2; + } + + return 0; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Use, discard, or otherwise manage items." + func_ov000_021d6a9c(func_02039e10("MUMH_持ち物"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Use, discard, or otherwise manage items." + func_ov000_021d6a9c(func_02039e10("MUMH_持ち物"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021ae180(0xc, 4, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x8; + } +}; + +class MIU_Trade : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_交換"); + } + + /* 14 */ virtual s32 vfunc_14(void) + { + s32 ux; + s32 uy; + s16 xMin; + s16 yMin; + s16 xMax; + s16 yMax; + s16 ix; + s16 iy; + s32 xDiff; + s32 yDiff; + s32 itemId; + Unit * unit; + + if (data_ov000_021e3340->unk_06 & 1) + { + return MENU_NOTSHOWN; + } + + itemId = (((gMapStateManager->unk_04->unk_00->items[0].id != 0) ? TRUE : FALSE) & 0xFF); + + ux = gMapStateManager->unk_04->unk_00->xPos; + uy = gMapStateManager->unk_04->unk_00->yPos; + + xMin = MAX(ux - 1, gMapStateManager->unk_24); + yMin = MAX(uy - 1, gMapStateManager->unk_25); + + xMax = MIN(ux + 1, gMapStateManager->unk_26 - 1); + yMax = MIN(uy + 1, gMapStateManager->unk_27 - 1); + + for (iy = yMin; iy <= yMax; iy++) + { + for (ix = xMin; ix <= xMax; ix++) + { + yDiff = ABS(gMapStateManager->unk_04->unk_00->yPos - iy); + xDiff = ABS(gMapStateManager->unk_04->unk_00->xPos - ix); + + if (xDiff + yDiff < 1) + { + continue; + } + + if (xDiff + yDiff > 1) + { + continue; + } + + unit = GetUnit(gMapStateManager->unk_028[(ix | iy << 5)]); + + if (unit == NULL) + { + continue; + } + + if (gMapStateManager->unk_04->unk_00->force->id != unit->force->id) + { + continue; + } + + if (!itemId && !(((unit->items[0].id != 0) ? TRUE : FALSE) & 0xFF)) + { + continue; + } + + return MENU_ENABLED; + } + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Trade items with a neighboring unit." + func_ov000_021d6a9c(func_02039e10("MUMH_交換"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Trade items with a neighboring unit." + func_ov000_021d6a9c(func_02039e10("MUMH_交換"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021ae180(0x11, 7, 0); + return MENU_ACTION_x40 | MENU_ACTION_x8; + } +}; + +class MIU_Visit : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_訪問"); + } + + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + return MENU_COLOR_GREEN; + } + + /* 14 */ virtual s32 vfunc_14(void) + { + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 8)) + { + if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 2)) + { + return MENU_ENABLED; + } + } + + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 9)) + { + return MENU_ENABLED; + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Visit this village or home." + func_ov000_021d6a9c(func_02039e10("MUMH_訪問"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Visit this village or home." + func_ov000_021d6a9c(func_02039e10("MUMH_訪問"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + s32 uVar2 = 0; + + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 8)) + { + if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 2)) + { + uVar2 = 8; + } + } + + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 9)) + { + uVar2 = 9; + } + + func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, uVar2, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + + return MENU_ACTION_x40 | MENU_ACTION_x1; + } +}; + +class MIU_Door : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_扉"); + } + + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + return MENU_COLOR_GREEN; + } + + /* 14 */ virtual s32 vfunc_14(void) + { + s16 xMax; + s16 yMax; + s16 xMin; + s16 yMin; + s16 ix; + s16 iy; + s32 ux; + s32 uy; + + if (!func_0203d184(gMapStateManager->unk_04->unk_00)) + { + return MENU_NOTSHOWN; + } + + ux = gMapStateManager->unk_04->unk_00->xPos; + uy = gMapStateManager->unk_04->unk_00->yPos; + + xMin = MAX(ux - 1, gMapStateManager->unk_24); + yMin = MAX(uy - 1, gMapStateManager->unk_25); + + xMax = MIN(ux + 1, gMapStateManager->unk_26 - 1); + yMax = MIN(uy + 1, gMapStateManager->unk_27 - 1); + + for (iy = yMin; iy <= yMax; iy++) + { + for (ix = xMin; ix <= xMax; ix++) + { + s32 xDiff; + s32 yDiff; + + yDiff = ABS(gMapStateManager->unk_04->unk_00->yPos - iy); + xDiff = ABS(gMapStateManager->unk_04->unk_00->xPos - ix); + + if (xDiff + yDiff < 1) + { + continue; + } + + if (xDiff + yDiff > 1) + { + continue; + } + + if (!func_ov000_021d49f4(ix, iy, 5)) + { + continue; + } + + return MENU_ENABLED; + } + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Open this door so units can pass through." + func_ov000_021d6a9c(func_02039e10("MUMH_扉"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Open this door so units can pass through." + func_ov000_021d6a9c(func_02039e10("MUMH_扉"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021b0de8( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_DOOR, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } +}; + +class MIU_Bridge : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_橋"); + } + + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + return MENU_COLOR_GREEN; + } + + /* 14 */ virtual s32 vfunc_14(void) + { + s16 xMax; + s16 yMax; + s16 xMin; + s16 yMin; + s16 ix; + s16 iy; + s32 ux; + s32 uy; + + if (!func_0203d1bc(gMapStateManager->unk_04->unk_00)) + { + return MENU_NOTSHOWN; + } + + ux = gMapStateManager->unk_04->unk_00->xPos; + uy = gMapStateManager->unk_04->unk_00->yPos; + + xMin = MAX(ux - 1, gMapStateManager->unk_24); + yMin = MAX(uy - 1, gMapStateManager->unk_25); + + xMax = MIN(ux + 1, gMapStateManager->unk_26 - 1); + yMax = MIN(uy + 1, gMapStateManager->unk_27 - 1); + + for (iy = yMin; iy <= yMax; iy++) + { + for (ix = xMin; ix <= xMax; ix++) + { + s32 xDiff; + s32 yDiff; + + yDiff = ABS(gMapStateManager->unk_04->unk_00->yPos - iy); + xDiff = ABS(gMapStateManager->unk_04->unk_00->xPos - ix); + + if (xDiff + yDiff < 0) + { + continue; + } + + if (xDiff + yDiff > 1) + { + continue; + } + + if (!func_ov000_021d49f4(ix, iy, 7)) + { + continue; + } + + return MENU_ENABLED; + } + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Lower this drawbridge so units can cross it." + func_ov000_021d6a9c(func_02039e10("MUMH_橋"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Lower this drawbridge so units can cross it." + func_ov000_021d6a9c(func_02039e10("MUMH_橋"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021b0de8( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_BRIDGE, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } +}; + +class MIU_TBox : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + // "Chest" + return func_02039e10("MUM_宝箱"); + } + + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + return MENU_COLOR_GREEN; + } + + /* 14 */ virtual s32 vfunc_14(void) + { + if (!func_0203d1f4(gMapStateManager->unk_04->unk_00)) + { + return MENU_NOTSHOWN; + } + + if (!func_ov000_021d49f4( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_CHEST)) + { + return MENU_NOTSHOWN; + } + + return MENU_ENABLED; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Open this chest and claim the item inside." + func_ov000_021d6a9c(func_02039e10("MUMH_宝箱"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Open this chest and claim the item inside." + func_ov000_021d6a9c(func_02039e10("MUMH_宝箱"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021b0de8( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_CHEST, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } +}; + +class MIU_WeaponShop : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + // "Armory" + return func_02039e10("MUM_武器屋"); + } + + /* 14 */ virtual s32 vfunc_14(void) + { + if (func_ov000_021a47e4()) + { + return MENU_NOTSHOWN; + } + + if (!EventCaller::CanStartVisitEvent( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xa)) + { + return MENU_NOTSHOWN; + } + + return MENU_ENABLED; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Visit the armory to buy and sell weapons." + func_ov000_021d6a9c(func_02039e10("MUMH_武器屋"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Visit the armory to buy and sell weapons." + func_ov000_021d6a9c(func_02039e10("MUMH_武器屋"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + gActionSt->actionId = ACTION_ARMORY; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } +}; + +class MIU_ItemShop : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_道具屋"); + } + + /* 14 */ virtual s32 vfunc_14(void) + { + if (func_ov000_021a47e4()) + { + return MENU_NOTSHOWN; + } + + if (!EventCaller::CanStartVisitEvent( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xb)) + { + return MENU_NOTSHOWN; + } + + return MENU_ENABLED; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Visit the vendor to buy and sell magic tomes, staves, and items." + func_ov000_021d6a9c(func_02039e10("MUMH_道具屋"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Visit the vendor to buy and sell magic tomes, staves, and items." + func_ov000_021d6a9c(func_02039e10("MUMH_道具屋"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + gActionSt->actionId = ACTION_VENDOR; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } +}; + +class MIU_SecretShop : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_秘密屋"); + } + + /* 14 */ virtual s32 vfunc_14(void) + { + if (func_ov000_021a47e4()) + { + return 2; + } + + if (EventCaller::CanStartVisitEvent( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xc)) + { + + if (func_0203cbc4(gMapStateManager->unk_04->unk_00, 0x1000000) != 0) + { + return 0; + } + } + + return 2; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Visit this hidden shop to buy and sell weapons and items." + func_ov000_021d6a9c(func_02039e10("MUMH_秘密屋"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Visit this hidden shop to buy and sell weapons and items." + func_ov000_021d6a9c(func_02039e10("MUMH_秘密屋"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + gActionSt->actionId = ACTION_SECRET_SHOP; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } +}; + +class MIU_Arena : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_闘技場"); + } + + /* 14 */ virtual s32 vfunc_14(void) + { + s32 i; + + if (func_ov000_021a47e4()) + { + return 2; + } + + if (gMapStateManager + ->unk_828[gMapStateManager->unk_04->unk_00->xPos | gMapStateManager->unk_04->unk_00->yPos << 5] != 0x17) + { + return 2; + } + + for (i = 0; i < 6; i++) + { + if (i == 5) + { + continue; + } + + if (func_0203c7ac(gMapStateManager->unk_04->unk_00, i)) + { + return 0; + } + } + + return 1; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Visit the arena to test your might with gold at stake." + func_ov000_021d6a9c(func_02039e10("MUMH_闘技場"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Visit the arena to test your might with gold at stake." + func_ov000_021d6a9c(func_02039e10("MUMH_闘技場"), 0); + return; + } + + /* 20 */ virtual s32 vfunc_20(MenuItemState * menuItemState) + { + if ((menuItemState->unk_09 & 7) != 1) + { + func_ov000_021ae180(0x16, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } + + return MENU_ACTION_x100; + } +}; + +class MIU_Transporter : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_輸送隊"); + } + + /* 14 */ virtual s32 vfunc_14(void) + { + s16 xMax; + s16 yMax; + s16 xMin; + s16 yMin; + s16 iy; + s16 ix; + s32 ux; + s32 uy; + Unit * unit; + + if (func_ov000_021a47e4()) + { + return MENU_NOTSHOWN; + } + + if (data_02196f0c->state & 0x4000) + { + return MENU_NOTSHOWN; + } + + if (data_ov000_021e3340->unk_06 & 0x10) + { + return MENU_NOTSHOWN; + } + + if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 0x2)) + { + return MENU_ENABLED; + } + + ux = gMapStateManager->unk_04->unk_00->xPos; + uy = gMapStateManager->unk_04->unk_00->yPos; + + xMin = MAX(ux - 1, gMapStateManager->unk_24); + yMin = MAX(uy - 1, gMapStateManager->unk_25); + + xMax = MIN(ux + 1, gMapStateManager->unk_26 - 1); + yMax = MIN(uy + 1, gMapStateManager->unk_27 - 1); + + for (iy = yMin; iy <= yMax; iy++) + { + for (ix = xMin; ix <= xMax; ix++) + { + s32 xDiff; + s32 yDiff; + + yDiff = ABS(gMapStateManager->unk_04->unk_00->yPos - iy); + xDiff = ABS(gMapStateManager->unk_04->unk_00->xPos - ix); + + if (xDiff + yDiff < 1) + { + continue; + } + + if (xDiff + yDiff > 1) + { + continue; + } + + unit = GetUnit(gMapStateManager->unk_028[(ix | iy << 5)]); + + if (unit == NULL) + { + continue; + } + + if (unit->force->id != gMapStateManager->unk_04->unk_00->force->id) + { + continue; + } + + if (!CheckUnitAttribute(unit, 2)) + { + continue; + } + + return MENU_ENABLED; + } + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Summon the convoy to store and retrieve items." + func_ov000_021d6a9c(func_02039e10("MUMH_輸送隊"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Summon the convoy to store and retrieve items." + func_ov000_021d6a9c(func_02039e10("MUMH_輸送隊"), 0); + return; + } + + /* 20 */ virtual s32 vfunc_20(MenuItemState * menuItemState) + { + if ((menuItemState->unk_09 & 7) != 1) + { + func_ov000_021ae180(0x22, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } + + return MENU_ACTION_x100; + } +}; + +class DI_CompleteYes : public DialogItemYes +{ +public: + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021b0de8( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_SEIZE, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021bfa3c(); + func_ov000_021d6dfc(0); + + return MENU_ACTION_x40 | MENU_ACTION_x4; + } +}; + +class MIU_Complete : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + // "Seize" + return func_02039e10("MUM_制圧"); + } + + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + return MENU_COLOR_GREEN; + } + + /* 14 */ virtual s32 vfunc_14(void) + { + if (EventCaller::CanStartVisitEvent( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xe)) + { + if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 2)) + { + return MENU_ENABLED; + } + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "End the battle by securing this vital position." + func_ov000_021d6a9c(func_02039e10("MUMH_制圧"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "End the battle by securing this vital position." + func_ov000_021d6a9c(func_02039e10("MUMH_制圧"), 0); + return; + } + + /* 24 */ virtual s32 vfunc_24(Menu * menu, MenuItemState * menuItemState) + { + func_ov000_021bfa60(menu->unk_10); + return MENU_ACTION_x40; + } +}; + +class MIU_Save : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_P記録"); + } + + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + if ((menuItemState->unk_09 & 7) != 1) + { + return MENU_COLOR_GREEN; + } + + return MENU_COLOR_GRAY; + } + + /* 14 */ virtual s32 vfunc_14(void) + { + if (func_ov000_021a47e4()) + { + return MENU_NOTSHOWN; + } + + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x10)) + { + if (!func_0201f680()) + { + return MENU_DISABLED; + } + else + { + return MENU_ENABLED; + } + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Save your progress. You can only use this savepoint once." + func_ov000_021d6a9c(func_02039e10("MUMH_P記録"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // "Save your progress. You can only use this savepoint once." + func_ov000_021d6a9c(func_02039e10("MUMH_P記録"), 0); + return; + } + + /* 20 */ virtual s32 vfunc_20(MenuItemState * menuItemState) + { + if ((menuItemState->unk_09 & 7) != 1) + { + func_ov000_021ae180(0xe, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x8; + } + + return MENU_ACTION_x100; + } +}; + +class MIU_Imitation : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + // "Imitate" + return func_02039e10("MUM_ものまね"); + } + + /* 14 */ virtual s32 vfunc_14(void) + { + s16 xMax; + s16 yMax; + s16 xMin; + s16 yMin; + s16 iy; + s16 ix; + s32 ux; + s32 uy; + Unit * unit; + + if (gMapStateManager->unk_04->unk_00->state2 & 0x8000) + { + return MENU_NOTSHOWN; + } + + if (!CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 0x8000)) + { + return MENU_NOTSHOWN; + } + + ux = gMapStateManager->unk_04->unk_00->xPos; + uy = gMapStateManager->unk_04->unk_00->yPos; + + xMin = MAX(ux - 1, gMapStateManager->unk_24); + yMin = MAX(uy - 1, gMapStateManager->unk_25); + + xMax = MIN(ux + 1, gMapStateManager->unk_26 - 1); + yMax = MIN(uy + 1, gMapStateManager->unk_27 - 1); + + for (iy = yMin; iy <= yMax; iy++) + { + for (ix = xMin; ix <= xMax; ix++) + { + s32 xDiff; + s32 yDiff; + + yDiff = ABS(gMapStateManager->unk_04->unk_00->yPos - iy); + xDiff = ABS(gMapStateManager->unk_04->unk_00->xPos - ix); + + if (xDiff + yDiff < 1) + { + continue; + } + + if (xDiff + yDiff > 1) + { + continue; + } + + unit = GetUnit(gMapStateManager->unk_028[(ix | iy << 5)]); + + if (unit == NULL) + { + continue; + } + + if (unit->force->id != gMapStateManager->unk_04->unk_00->force->id) + { + continue; + } + + if (CheckUnitAttribute(unit, 0x1000000)) + { + continue; + } + + return MENU_ENABLED; + } + } + + return MENU_NOTSHOWN; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Transform into a neighboring allied unit. The transformation lasts five turns." + func_ov000_021d6a9c(func_02039e10("MUMH_ものまね"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // Transform into a neighboring allied unit. The transformation lasts five turns. + func_ov000_021d6a9c(func_02039e10("MUMH_ものまね"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021ae180(0x11, 10, 0); + return MENU_ACTION_x40 | MENU_ACTION_x8; + } +}; + +class MI_Separator : public MenuItem +{ +}; + +class DI_LureYes : public DialogItemYes +{ +public: + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021b0de8( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_DECOY, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021bfa3c(); + func_ov000_021d6dfc(0); + + return MENU_ACTION_x40 | MENU_ACTION_x4; + } +}; + +class MIU_Lure : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_囮"); + } + + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + if ((menuItemState->unk_09 & 7) != 1) + { + return MENU_COLOR_GREEN; + } + + return MENU_COLOR_GRAY; + } + + /* 14 */ virtual s32 vfunc_14(void) + { + if (func_ov000_021a47e4()) + { + return MENU_NOTSHOWN; + } + + if (!func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x13)) + { + return MENU_NOTSHOWN; + } + + return MENU_ENABLED; + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); + return; + } + + /* 24 */ virtual s32 vfunc_24(Menu * menu, MenuItemState * menuItemState) + { + func_ov000_021bfaf0(menu->unk_10); + return MENU_ACTION_x40; + } +}; + +class MIU_Fixed : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) + { + // Wait + return func_02039e10("MUM_待機"); + } + + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // End this unit's turn. + func_ov000_021d6a9c(func_02039e10("MUMH_待機"), 0); + + return; + } + + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // End this unit's turn. + func_ov000_021d6a9c(func_02039e10("MUMH_待機"), 0); + return; + } + + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021b0de8( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_WAIT, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + return MENU_ACTION_x40 | MENU_ACTION_x1; + } +}; + +class BMapDialogYesNo : public DialogYesNo +{ +public: + /* 000 */ virtual void vfunc_00(void); // func_ov000_021be6d8 + /* 0A0 */ virtual BOOL vfunc_a0(void); // func_ov000_021be934 + /* 0AC */ virtual s32 vfunc_ac(void); // func_ov000_021be91c + /* 130 */ virtual void vfunc_130(/* ? */); // func_ov000_021bea74 + /* 134 */ virtual void vfunc_134(/* ? */); // func_ov000_021beab0 +}; + +} // namespace map + +EC void StartChildMenu(Menu *, void *, ProcPtr, u32, u32); +EC void func_020303bc(Dialog *, char *, void *, ProcPtr, s32, s32); + +EC void func_ov000_021bfa60(ProcPtr proc) +{ + static map::DI_CompleteYes sCompleteYes; + + // clang-format off + static MenuItem * data_ov000_021de5c8[] = + { + &sCompleteYes, + }; + // clang-format on + + // "Proceed to the next chapter?" + func_020303bc(new map::BMapDialogYesNo(), func_02039e10("MD_制圧"), data_ov000_021de5c8, proc, 1, 0); + return; +} + +EC void func_ov000_021bfaf0(ProcPtr proc) +{ + static map::DI_LureYes sLureYes; + + // clang-format off + static MenuItem * data_ov000_021de5bc[] = + { + &sLureYes, + }; + // clang-format on + + // "Make this unit a decoy?" + func_020303bc(new map::BMapDialogYesNo(), func_02039e10("MD_囮"), data_ov000_021de5bc, proc, 1, 0); + return; +} + +EC void StartUnitMenu(ProcPtr proc) +{ + static map::MIU_Talk sTalk; + static map::MIU_Attack sAttack; + static map::MIU_Rod sRod; + static map::MIU_Item sItem; + static map::MIU_Trade sTrade; + static map::MIU_Visit sVisit; + static map::MIU_Door sDoor; + static map::MIU_Bridge sBridge; + static map::MIU_TBox sTBox; + static map::MIU_WeaponShop sWeaponShop; + static map::MIU_ItemShop sItemShop; + static map::MIU_SecretShop sSecretShop; + static map::MIU_Arena sArena; + static map::MIU_Transporter sTransporter; + static map::MIU_Complete sComplete; + static map::MIU_Save sSave; + static map::MIU_Imitation sImitation; + static map::MI_Separator sSeparator; + static map::MIU_Lure sLure; + static map::MIU_Fixed sFixed; + + // clang-format off + static MenuItem * data_ov000_021de82c[] = + { + &sTalk, + &sAttack, + &sRod, + &sItem, + &sTrade, + &sVisit, + &sDoor, + &sBridge, + &sTBox, + &sWeaponShop, + &sItemShop, + &sSecretShop, + &sArena, + &sTransporter, + &sComplete, + &sSave, + &sImitation, + &sSeparator, + &sLure, + &sFixed, + }; + // clang-format on + + StartChildMenu(new map::UnitMenu(), data_ov000_021de82c, proc, 1, 0); + + return; +} diff --git a/src/ov000/mind.cpp b/src/ov000/mind.cpp index 259a319..50f04c3 100644 --- a/src/ov000/mind.cpp +++ b/src/ov000/mind.cpp @@ -2,6 +2,7 @@ #include +#include "action.hpp" #include "event.hpp" #include "map.hpp" #include "proc_ex.hpp" @@ -12,63 +13,9 @@ #include "unknown_funcs.h" -enum -{ - ACTION_NONE = 0x00, - ACTION_FIGHT = 0x01, - ACTION_STAFF = 0x02, - // 0x03 - ACTION_WAIT = 0x04, - // 0x05 - // 0x06 - // 0x07 - // 0x08 - // 0x09 - // 0x0A - // 0x0B - // 0x0C - // 0x0D - // 0x0E - ACTION_ESCAPE = 0x0F, - // 0x10 - ACTION_IMITATION = 0x11, - // 0x12 - // 0x13 - ACTION_TALK = 0x14, - // 0x15 - // 0x16 - // 0x17 -}; - // TODO: This is likely part of a larger file, combined with "playerphase.cpp" and others // yet to be decompiled. It seems likely based on the data sections (i.e. vtable locations) -class ActionState -{ -public: - STRUCT_PAD(0x00, 0x14); - u32 unk_14; - STRUCT_PAD(0x18, 0x2C); - s8 unk_2c; - s8 unk_2d; - u8 unk_2e; - u8 unk_2f; - /* 30 */ s8 xDecision; - /* 31 */ s8 yDecision; - /* 32 */ u8 unitId; // "MindGetUnit" returns this - /* 33 */ u8 actionId; // "MindGetMind" returns this - u8 unk_34; // target unit ID? - u8 unk_35; - u8 unk_36; - u8 unk_37; // item slot? - - void func_ov000_021b0eb4(struct Unit *); - void func_ov000_021b0ee8(struct Unit *); - void func_ov000_021b0f1c(struct Unit *); -}; - -extern struct ActionState * gActionSt; - // CpSkip! struct UnkStruct_021e332c_08 { diff --git a/src/ov000/playerphase.cpp b/src/ov000/playerphase.cpp index ba31df6..4a8d3db 100644 --- a/src/ov000/playerphase.cpp +++ b/src/ov000/playerphase.cpp @@ -831,7 +831,7 @@ EC void func_ov000_021acc7c(ProcPtr proc) EC void func_ov000_021accfc(ProcPtr proc) { func_ov000_021a5774(gMapStateManager->unk_0c, 0x8b); - func_ov000_021bfb80(proc); + StartUnitMenu(proc); if (CHECK_02()) {