From b1d304f6220383100871305cfc26d3c6d9f028cc Mon Sep 17 00:00:00 2001 From: Eebit Date: Mon, 9 Feb 2026 22:26:13 -0500 Subject: [PATCH 1/7] (map_unit_menu) Scaffold classes for battle map unit menu --- config/YFEE01/arm9/overlays/ov000/delinks.txt | 3 + include/unknown_types.h | 2 +- src/ov000/map_unit_menu.cpp | 1500 +++++++++++++++++ 3 files changed, 1504 insertions(+), 1 deletion(-) create mode 100644 src/ov000/map_unit_menu.cpp diff --git a/config/YFEE01/arm9/overlays/ov000/delinks.txt b/config/YFEE01/arm9/overlays/ov000/delinks.txt index 1fdb10d..7988e47 100644 --- a/config/YFEE01/arm9/overlays/ov000/delinks.txt +++ b/config/YFEE01/arm9/overlays/ov000/delinks.txt @@ -22,6 +22,9 @@ src/ov000/playerphase.cpp: src/ov000/mind.cpp: .text start:0x021af79c end:0x021b06fc +src/ov000/map_unit_menu.cpp: + .text start:0x021bfb80 end:0x021c1e18 + src/ov000/map.cpp: .text start:0x021d708c end:0x021d7c90 .data start:0x021e2c30 end:0x021e2c88 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/ov000/map_unit_menu.cpp b/src/ov000/map_unit_menu.cpp new file mode 100644 index 0000000..1b176cc --- /dev/null +++ b/src/ov000/map_unit_menu.cpp @@ -0,0 +1,1500 @@ +#include "global.h" + +#include "event.hpp" +#include "hardware.hpp" +#include "menu.hpp" +#include "proc_ex.hpp" + +namespace map +{ + +class MIU_Talk : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c1c1c + /* 10 */ virtual s32 vfunc_10(void); // func_ov000_021c1c14 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c18e0 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c187c + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c1898 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c18b4 +}; + +class MIU_Attack : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c1868 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c1734 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c16c8 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c16ec + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c1708 +}; + +class MIU_Rod : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c16b4 + /* 18 */ virtual s32 vfunc_18(void); // func_ov000_021c156c + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c1500 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c1524 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c1540 +}; + +class MIU_Item : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c14ec + /* 18 */ virtual s32 vfunc_18(void); // func_ov000_021c1478 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c140c + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c1430 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c144c +}; + +class MIU_Trade : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c13f8 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c1230 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c11cc + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c11e8 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c1204 +}; + +class MIU_Visit : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c11b8 + /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c11b0 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c112c + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c1024 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c10e4 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c1100 +}; + +class MIU_Door : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c1010 + /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c1008 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0ecc + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0e38 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0e84 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0ea0 +}; + +class MIU_Bridge : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0e24 + /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c0e1c + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0ce0 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0c4c + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0c98 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0cb4 +}; + +class MIU_TBox : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0c38 + /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c0c30 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0bd8 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0b44 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0b90 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0bac +}; + +class MIU_WeaponShop : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0b30 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0ae8 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0a68 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0aa0 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0abc +}; + +class MIU_ItemShop : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0a54 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0a0c + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c098c + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c09c4 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c09e0 +}; + +class MIU_SecretShop : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0978 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0904 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0884 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c08bc + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c08d8 +}; + +class MIU_Arena : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0870 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c07e8 + /* 20 */ virtual s32 vfunc_20(MenuItemState *); // func_ov000_021c0768 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c07a0 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c07bc +}; + +class MIU_Transporter : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0754 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0550 + /* 20 */ virtual s32 vfunc_20(MenuItemState *); // func_ov000_021c04d0 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0508 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0524 +}; + +class DI_CompleteYes : public DialogItemYes +{ +public: + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0480 +}; + +class MIU_Complete : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c046c + /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c0464 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0408 + /* 24 */ virtual s32 vfunc_24(Menu *, MenuItemState *); // func_ov000_021c03ac + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c03c0 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c03dc +}; + +class MIU_Save : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0398 + /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c0380 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0324 + /* 20 */ virtual s32 vfunc_20(MenuItemState *); // func_ov000_021c02a4 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c02dc + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c02f8 +}; + +class MIU_Imitation : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0290 + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c00cc + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0068 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0084 + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c00a0 +}; + +class MI_Separator : public MenuItem +{ +}; + +class DI_LureYes : public DialogItemYes +{ +public: + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0018 +}; + +class MIU_Lure : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0004 + /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021bffec + /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021bffa4 + /* 24 */ virtual s32 vfunc_24(Menu *, MenuItemState *); // func_ov000_021bff48 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021bff5c + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021bff78 +}; + +class MIU_Fixed : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void); // func_ov000_021bff34 + /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021bfea0 + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021bfeec + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021bff08 +}; + +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: + /* 000 */ virtual void vfunc_00(void); // func_ov000_021c1d30 + /* 024 */ virtual s32 vfunc_24(MenuItemState *, s32); // func_ov000_021c1cf0 + /* 028 */ virtual s32 vfunc_28(s32); // func_ov000_021c1ca4 + /* 060 */ virtual s32 vfunc_60(void); // func_ov000_021c1c30 + /* 11C */ virtual void vfunc_11c(void); // func_ov000_021c1d1c + + virtual ~UnitMenu() + { + } +}; + +} // namespace map + +EC void StartChildMenu(Menu *, void *, ProcPtr, u32, u32); + +EC void func_ov000_021bfb80(ProcPtr param_1) +{ + 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, param_1, 1, 0); + + return; +} + +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); + +// func_ov000_021bfea0 +s32 map::MIU_Fixed::vfunc_1c(void) +{ + func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 4, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; +} + +// func_ov000_021bfeec +void map::MIU_Fixed::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // End this unit's turn. + func_ov000_021d6a9c(func_02039e10("MUMH_待機"), 0); + return; +} + +// func_ov000_021bff08 +void map::MIU_Fixed::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; +} + +char * map::MIU_Fixed::vfunc_00(void) +{ + // Wait + return func_02039e10("MUM_待機"); +} + +EC void func_ov000_021bfaf0(ProcPtr); + +// func_ov000_021bff48 +s32 map::MIU_Lure::vfunc_24(Menu * menu, MenuItemState * menuItemState) +{ + func_ov000_021bfaf0(menu->unk_10); + return 0x40; +} + +// func_ov000_021bff5c +void map::MIU_Lure::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); + return; +} + +// func_ov000_021bff78 +void map::MIU_Lure::vfunc_90(Menu * menu, MenuItemState * menuItemState) +{ + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); + + return; +} + +EC s32 func_ov000_021d49f4(s32, s32, s32); + +// func_ov000_021bffa4 +s32 map::MIU_Lure::vfunc_14(void) +{ + if (func_ov000_021a47e4()) + { + return 2; + } + + if (!func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x13)) + { + return 2; + } + + return 0; +} + +// func_ov000_021bffec +s32 map::MIU_Lure::vfunc_10(MenuItemState * param_2) +{ + if ((param_2->unk_09 & 7) != 1) + { + return 5; + } + + return 2; +} + +// func_ov000_021c0004 +char * map::MIU_Lure::vfunc_00(void) +{ + return func_02039e10("MUM_囮"); +} + +// func_ov000_021c0018 +s32 map::DI_LureYes::vfunc_1c(void) +{ + func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x13, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021bfa3c(); + func_ov000_021d6dfc(0); + + return 0x44; +} + +// func_ov000_021c0068 +s32 map::MIU_Imitation::vfunc_1c(void) +{ + func_ov000_021ae180(0x11, 10, 0); + return 0x48; +} + +// func_ov000_021c0084 +void map::MIU_Imitation::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; +} + +// func_ov000_021c00a0 +void map::MIU_Imitation::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; +} + +// func_ov000_021c00cc +s32 map::MIU_Imitation::vfunc_14(void) +{ +} + +// func_ov000_021c0398 +char * map::MIU_Imitation::vfunc_00(void) +{ + // "Imitate" + return func_02039e10("MUM_ものまね"); +} + +// func_ov000_021c02a4 +s32 map::MIU_Save::vfunc_20(MenuItemState * menuItemState) +{ + if ((menuItemState->unk_09 & 7) != 1) + { + func_ov000_021ae180(0xe, 0, 0); + func_ov000_021d6dfc(0); + return 0x48; + } + + return 0x100; +} + +// func_ov000_021c02dc +void map::MIU_Save::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; +} + +// func_ov000_021c02f8 +void map::MIU_Save::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; +} + +EC BOOL func_0201f680(void); + +// func_ov000_021c0324 +s32 map::MIU_Save::vfunc_14(void) +{ + if (func_ov000_021a47e4()) + { + return 2; + } + + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x10)) + { + if (!func_0201f680()) + { + return 1; + } + else + { + return 0; + } + } + + return 2; +} + +// func_ov000_021c0380 +s32 map::MIU_Save::vfunc_10(MenuItemState * param_2) +{ + if ((param_2->unk_09 & 7) != 1) + { + return 5; + } + + return 2; +} + +// func_ov000_021c0398 +char * map::MIU_Save::vfunc_00(void) +{ + return func_02039e10("MUM_P記録"); +} + +EC void func_ov000_021bfa60(ProcPtr); + +// func_ov000_021c03ac +s32 map::MIU_Complete::vfunc_24(Menu * menu, MenuItemState * menuItemState) +{ + func_ov000_021bfa60(menu->unk_10); + return 0x40; +} + +// func_ov000_021c03c0 +void map::MIU_Complete::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "End the battle by securing this vital position." + func_ov000_021d6a9c(func_02039e10("MUMH_制圧"), 0); + return; +} + +// func_ov000_021c03dc +void map::MIU_Complete::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; +} + +// func_ov000_021c0408 +s32 map::MIU_Complete::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 0; + } + } + + return 2; +} + +// func_ov000_021c0464 +s32 map::MIU_Complete::vfunc_10(MenuItemState * menuItemState) +{ + return 5; +} + +// func_ov000_021c046c +char * map::MIU_Complete::vfunc_00(void) +{ + return func_02039e10("MUM_制圧"); +} + +// func_ov000_021c0480 +s32 map::DI_CompleteYes::vfunc_1c(void) +{ + func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xe, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021bfa3c(); + func_ov000_021d6dfc(0); + + return 0x44; +} + +// func_ov000_021c04d0 +s32 map::MIU_Transporter::vfunc_20(MenuItemState * param_2) +{ + if ((param_2->unk_09 & 7) != 1) + { + func_ov000_021ae180(0x22, 0, 0); + func_ov000_021d6dfc(0); + + return 0x41; + } + + return 0x100; +} + +// func_ov000_021c0508 +void map::MIU_Transporter::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Summon the convoy to store and retrieve items." + func_ov000_021d6a9c(func_02039e10("MUMH_輸送隊"), 0); + return; +} + +// func_ov000_021c0524 +void map::MIU_Transporter::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; +} + +// func_ov000_021c0550 +s32 map::MIU_Transporter::vfunc_14(void) +{ + // TODO +} + +// func_ov000_021c0754 +char * map::MIU_Transporter::vfunc_00(void) +{ + return func_02039e10("MUM_輸送隊"); +} + +// func_ov000_021c0768 +s32 map::MIU_Arena::vfunc_20(MenuItemState * param_2) +{ + if ((param_2->unk_09 & 7) != 1) + { + func_ov000_021ae180(0x16, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; + } + + return 0x100; +} + +// func_ov000_021c07a0 +void map::MIU_Arena::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; +} + +// func_ov000_021c07bc +void map::MIU_Arena::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; +} + +// func_ov000_021c07e8 +s32 map::MIU_Arena::vfunc_14(void) +{ + // TODO +} + +// func_ov000_021c0870 +char * map::MIU_Arena::vfunc_00(void) +{ + return func_02039e10("MUM_闘技場"); +} + +class ActionState +{ +public: + STRUCT_PAD(0x00, 0x2C); + s8 unk_2c; + s8 unk_2d; + u8 unk_2e; + u8 unk_2f; + s8 xDecision; + s8 yDecision; + s8 unitId; + u8 actionId; + u8 unk_34; + u8 unk_35; + u8 unk_36; + u8 unk_37; +}; + +extern struct ActionState * gActionSt; + +// func_ov000_021c0884 +s32 map::MIU_SecretShop::vfunc_1c(void) +{ + gActionSt->actionId = 0xc; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; +} + +// func_ov000_021c08bc +void map::MIU_SecretShop::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; +} + +// func_ov000_021c08d8 +void map::MIU_SecretShop::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; +} + +// func_ov000_021c0904 +s32 map::MIU_SecretShop::vfunc_14(void) +{ + // TODO +} + +// func_ov000_021c0978 +char * map::MIU_SecretShop::vfunc_00(void) +{ + return func_02039e10("MUM_秘密屋"); +} + +// func_ov000_021c098c +s32 map::MIU_ItemShop::vfunc_1c(void) +{ + gActionSt->actionId = 0xb; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; +} + +// func_ov000_021c09c4 +void map::MIU_ItemShop::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; +} + +// func_ov000_021c09e0 +void map::MIU_ItemShop::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; +} + +// func_ov000_021c0a0c +s32 map::MIU_ItemShop::vfunc_14(void) +{ + if (func_ov000_021a47e4()) + { + return 2; + } + + if (!EventCaller::CanStartVisitEvent( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xb)) + { + return 2; + } + + return 0; +} + +// func_ov000_021c0a54 +char * map::MIU_ItemShop::vfunc_00(void) +{ + return func_02039e10("MUM_道具屋"); +} + +// func_ov000_021c0a68 +s32 map::MIU_WeaponShop::vfunc_1c(void) +{ + gActionSt->actionId = 0xa; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; +} + +// func_ov000_021c0aa0 +void map::MIU_WeaponShop::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Visit the armory to buy and sell weapons." + func_ov000_021d6a9c(func_02039e10("MUMH_武器屋"), 0); + return; +} + +// func_ov000_021c0abc +void map::MIU_WeaponShop::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; +} + +// func_ov000_021c0ae8 +s32 map::MIU_WeaponShop::vfunc_14(void) +{ + if (func_ov000_021a47e4()) + { + return 2; + } + + if (!EventCaller::CanStartVisitEvent( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xa)) + { + return 2; + } + + return 0; +} + +// func_ov000_021c0b30 +char * map::MIU_WeaponShop::vfunc_00(void) +{ + return func_02039e10("MUM_武器屋"); +} + +// func_ov000_021c0b44 +s32 map::MIU_TBox::vfunc_1c(void) +{ + func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 6, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; +} + +// func_ov000_021c0b90 +void map::MIU_TBox::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Open this chest and claim the item inside." + func_ov000_021d6a9c(func_02039e10("MUMH_宝箱"), 0); + return; +} + +// func_ov000_021c0bac +void map::MIU_TBox::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; +} + +EC BOOL func_0203d1f4(Unit *); + +// func_ov000_021c0bd8 +s32 map::MIU_TBox::vfunc_14(void) +{ + if (!func_0203d1f4(gMapStateManager->unk_04->unk_00)) + { + return 2; + } + + if (!func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 6)) + { + return 2; + } + + return 0; +} + +// func_ov000_021c0c30 +s32 map::MIU_TBox::vfunc_10(MenuItemState * menuItemState) +{ + return 5; +} + +// func_ov000_021c0c38 +char * map::MIU_TBox::vfunc_00(void) +{ + return func_02039e10("MUM_宝箱"); +} + +// func_ov000_021c0c4c +s32 map::MIU_Bridge::vfunc_1c(void) +{ + func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 7, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; +} + +// func_ov000_021c0c98 +void map::MIU_Bridge::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Lower this drawbridge so units can cross it." + func_ov000_021d6a9c(func_02039e10("MUMH_橋"), 0); + return; +} + +// func_ov000_021c0cb4 +void map::MIU_Bridge::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; +} + +// func_ov000_021c0ce0 +s32 map::MIU_Bridge::vfunc_14(void) +{ + // TODO +} + +// func_ov000_021c0e1c +s32 map::MIU_Bridge::vfunc_10(MenuItemState * menuItemState) +{ + return 5; +} + +// func_ov000_021c0e24 +char * map::MIU_Bridge::vfunc_00(void) +{ + return func_02039e10("MUM_橋"); +} + +// func_ov000_021c0e38 +s32 map::MIU_Door::vfunc_1c(void) +{ + func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 5, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; +} + +// func_ov000_021c0e84 +void map::MIU_Door::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Open this door so units can pass through." + func_ov000_021d6a9c(func_02039e10("MUMH_扉"), 0); + return; +} + +// func_ov000_021c0ea0 +void map::MIU_Door::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; +} + +// func_ov000_021c0ecc +s32 map::MIU_Door::vfunc_14(void) +{ + // TODO +} + +// func_ov000_021c1008 +s32 map::MIU_Door::vfunc_10(MenuItemState * menuItemState) +{ + return 5; +} + +// func_ov000_021c1010 +char * map::MIU_Door::vfunc_00(void) +{ + return func_02039e10("MUM_扉"); +} + +// func_ov000_021c1024 +s32 map::MIU_Visit::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 0x41; +} + +// func_ov000_021c10e4 +void map::MIU_Visit::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Visit this village or home." + func_ov000_021d6a9c(func_02039e10("MUMH_訪問"), 0); + return; +} + +// func_ov000_021c1100 +void map::MIU_Visit::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; +} + +// func_ov000_021c112c +s32 map::MIU_Visit::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 0; + } + } + + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 9)) + { + return 0; + } + + return 2; +} + +// func_ov000_021c11b0 +s32 map::MIU_Visit::vfunc_10(MenuItemState * menuItemState) +{ + return 5; +} + +// func_ov000_021c11b8 +char * map::MIU_Visit::vfunc_00(void) +{ + return func_02039e10("MUM_訪問"); +} + +// func_ov000_021c11cc +s32 map::MIU_Trade::vfunc_1c(void) +{ + func_ov000_021ae180(0x11, 7, 0); + return 0x48; +} + +// func_ov000_021c11e8 +void map::MIU_Trade::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Trade items with a neighboring unit." + func_ov000_021d6a9c(func_02039e10("MUMH_交換"), 0); + return; +} + +// func_ov000_021c1204 +void map::MIU_Trade::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; +} + +// func_ov000_021c1230 +s32 map::MIU_Trade::vfunc_14(void) +{ + // TODO +} + +// func_ov000_021c13f8 +char * map::MIU_Trade::vfunc_00(void) +{ + return func_02039e10("MUM_交換"); +} + +// func_ov000_021c140c +s32 map::MIU_Item::vfunc_1c(void) +{ + func_ov000_021ae180(0xc, 4, 0); + func_ov000_021d6dfc(0); + return 0x48; +} + +// func_ov000_021c1430 +void map::MIU_Item::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Use, discard, or otherwise manage items." + func_ov000_021d6a9c(func_02039e10("MUMH_持ち物"), 0); + return; +} + +// func_ov000_021c144c +void map::MIU_Item::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; +} + +// func_ov000_021c1478 +s32 map::MIU_Item::vfunc_18(void) +{ + // TODO +} + +// func_ov000_021c14ec +char * map::MIU_Item::vfunc_00(void) +{ + return func_02039e10("MUM_持ち物"); +} + +// func_ov000_021c1500 +s32 map::MIU_Rod::vfunc_1c(void) +{ + func_ov000_021ae180(0xc, 1, 0); + func_ov000_021d6dfc(0); + return 0x48; +} + +// func_ov000_021c1524 +void map::MIU_Rod::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // Use an available staff. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_杖"), 0); + return; +} + +// func_ov000_021c1540 +void map::MIU_Rod::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; +} + +// func_ov000_021c156c +s32 map::MIU_Rod::vfunc_18(void) +{ + // TODO +} + +// func_ov000_021c16b4 +char * map::MIU_Rod::vfunc_00(void) +{ + // Staff + return func_02039e10("MUM_杖"); +} + +// func_ov000_021c16c8 +s32 map::MIU_Attack::vfunc_1c(void) +{ + func_ov000_021ae180(0xc, 0, 0); + func_ov000_021d6dfc(0); + return 0x48; +} + +// func_ov000_021c16ec +void map::MIU_Attack::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // Attack with an available weapon. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_攻撃"), 0); + return; +} + +// func_ov000_021c1708 +void map::MIU_Attack::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; +} + +// func_ov000_021c1734 +s32 map::MIU_Attack::vfunc_14(void) +{ + // TODO +} + +// func_ov000_021c1868 +char * map::MIU_Attack::vfunc_00(void) +{ + // Attack + return func_02039e10("MUM_攻撃"); +} + +// func_ov000_021c187c +s32 map::MIU_Talk::vfunc_1c(void) +{ + func_ov000_021ae180(0x11, 9, 0); + return 0x48; +} + +// func_ov000_021c1898 +void map::MIU_Talk::vfunc_78(Menu * menu, MenuItemState * menuItemState) +{ + // "Talk to a neighboring unit. (Shortcuts: ┳┫, ┻╋)" + func_ov000_021d6a9c(func_02039e10("MUMH_話す"), 0); + return; +} + +// func_ov000_021c18b4 +void map::MIU_Talk::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; +} + +// func_ov000_021c1c14 +s32 map::MIU_Talk::vfunc_10(void) +{ + return 5; +} + +// func_ov000_021c1c1c +char * map::MIU_Talk::vfunc_00(void) +{ + // "Talk" + return func_02039e10("MUM_話す"); +} + +#include "map.hpp" +#include "unit.hpp" + +EC BOOL func_ov000_021a47e4(void); + +extern Unit gUnitList[]; + +// func_ov000_021c18e0 +s32 map::MIU_Talk::vfunc_14(void) +{ + s16 ix; + s32 xDiff; + s32 yDiff; + s32 unitId; + Unit * psVar6; + s32 xCur; + s32 yCur; + s16 xMax; + s16 yMax; + s16 xMin; + s16 yMin; + s16 iy; + + if (func_ov000_021a47e4()) + { + return 2; + } + + xCur = gMapStateManager->unk_04->unk_00->xPos; + yCur = gMapStateManager->unk_04->unk_00->yPos; + + xMin = xCur - 1; + if (xMin <= gMapStateManager->unk_24) + { + xMin = gMapStateManager->unk_24; + } + + yMin = yCur - 1; + if (yMin <= gMapStateManager->unk_25) + { + yMin = gMapStateManager->unk_25; + } + + xMax = xCur + 1; + xCur = gMapStateManager->unk_26 - 1; + if (xCur <= xMax) + { + xMax = xCur; + } + + yMax = yCur + 1; + yCur = gMapStateManager->unk_27 - 1; + if (yCur <= yMax) + { + yMax = yCur; + } + + 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 > 0) && (xDiff + yDiff < 2)) + { + unitId = gMapStateManager->unk_028[(ix | iy << 5)]; + + if (unitId == 0) + { + psVar6 = NULL; + } + else + { + psVar6 = gUnitList + unitId - 1; + } + + if (psVar6 == NULL) + { + continue; + } + + if (EventCaller::CanStartTalkEvent( + (u32)func_0203c378(psVar6)->pPersonData, + (u32)func_0203c378(gMapStateManager->unk_04->unk_00)->pPersonData)) + { + return 0; + } + } + } + } + + return 2; +} + +extern struct UnkStruct_021e3340 * data_ov000_021e3340; + +// func_ov000_021c1c30 +s32 map::UnitMenu::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, 4, 0); + func_ov000_021ae180(0x28, 0, 0); + func_ov000_021bfa3c(); + + return 0x81; + } + + return this->vfunc_28(0x81); +} + +// func_ov000_021c1ca4 +s32 map::UnitMenu::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; +} + +// func_ov000_021c1cf0 +s32 map::UnitMenu::vfunc_24(MenuItemState * param_2, s32 param_3) +{ + s32 r0 = (param_3 & 0x3f) == 0; + + if (!r0) + { + func_ov000_021bfa3c(); + return param_3; + } + + return param_3; +} + +// func_ov000_021c1d1c +void map::UnitMenu::vfunc_11c(void) +{ + func_ov000_021d6f1c(this->unk_10, 1); + return; +} + +EC void func_ov000_021be21c(void); + +// func_ov000_021c1d30 +void map::UnitMenu::vfunc_00(void) +{ + func_ov000_021be21c(); + this->unk_40 = 1; + return; +} \ No newline at end of file From 3da4af502135b88a4c4bee7895f2117d5b1090b1 Mon Sep 17 00:00:00 2001 From: Eebit Date: Mon, 9 Feb 2026 22:26:49 -0500 Subject: [PATCH 2/7] (menu) Rename some function args --- src/menu.cpp | 239 +++++++++++++++++++++++++-------------------------- 1 file changed, 119 insertions(+), 120 deletions(-) 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; } From ee2debeb2ebdd996a1d169fcc87ff89fe0b25759 Mon Sep 17 00:00:00 2001 From: Eebit Date: Mon, 9 Feb 2026 23:07:26 -0500 Subject: [PATCH 3/7] (map_unit_menu) Rename symbols and identify some action enum values --- config/YFEE01/arm9/overlays/ov000/symbols.txt | 224 +++++------ include/action.hpp | 60 +++ include/unknown_funcs.h | 222 +++++------ src/ov000/map_unit_menu.cpp | 373 ++++++------------ src/ov000/mind.cpp | 55 +-- src/ov000/playerphase.cpp | 2 +- 6 files changed, 412 insertions(+), 524 deletions(-) create mode 100644 include/action.hpp 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..5ff28a1 --- /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 + // 0x0A + // 0x0B + // 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/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/src/ov000/map_unit_menu.cpp b/src/ov000/map_unit_menu.cpp index 1b176cc..bb91e20 100644 --- a/src/ov000/map_unit_menu.cpp +++ b/src/ov000/map_unit_menu.cpp @@ -1,5 +1,6 @@ #include "global.h" +#include "action.hpp" #include "event.hpp" #include "hardware.hpp" #include "menu.hpp" @@ -11,184 +12,184 @@ namespace map class MIU_Talk : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c1c1c - /* 10 */ virtual s32 vfunc_10(void); // func_ov000_021c1c14 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c18e0 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c187c - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c1898 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c18b4 + /* 00 */ virtual char * vfunc_00(void); + /* 10 */ virtual s32 vfunc_10(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Attack : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c1868 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c1734 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c16c8 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c16ec - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c1708 + /* 00 */ virtual char * vfunc_00(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Rod : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c16b4 - /* 18 */ virtual s32 vfunc_18(void); // func_ov000_021c156c - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c1500 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c1524 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c1540 + /* 00 */ virtual char * vfunc_00(void); + /* 18 */ virtual s32 vfunc_18(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Item : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c14ec - /* 18 */ virtual s32 vfunc_18(void); // func_ov000_021c1478 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c140c - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c1430 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c144c + /* 00 */ virtual char * vfunc_00(void); + /* 18 */ virtual s32 vfunc_18(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Trade : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c13f8 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c1230 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c11cc - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c11e8 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c1204 + /* 00 */ virtual char * vfunc_00(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Visit : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c11b8 - /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c11b0 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c112c - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c1024 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c10e4 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c1100 + /* 00 */ virtual char * vfunc_00(void); + /* 10 */ virtual s32 vfunc_10(MenuItemState *); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Door : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c1010 - /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c1008 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0ecc - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0e38 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0e84 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0ea0 + /* 00 */ virtual char * vfunc_00(void); + /* 10 */ virtual s32 vfunc_10(MenuItemState *); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Bridge : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0e24 - /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c0e1c - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0ce0 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0c4c - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0c98 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0cb4 + /* 00 */ virtual char * vfunc_00(void); + /* 10 */ virtual s32 vfunc_10(MenuItemState *); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_TBox : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0c38 - /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c0c30 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0bd8 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0b44 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0b90 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0bac + /* 00 */ virtual char * vfunc_00(void); + /* 10 */ virtual s32 vfunc_10(MenuItemState *); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_WeaponShop : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0b30 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0ae8 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0a68 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0aa0 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0abc + /* 00 */ virtual char * vfunc_00(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_ItemShop : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0a54 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0a0c - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c098c - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c09c4 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c09e0 + /* 00 */ virtual char * vfunc_00(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_SecretShop : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0978 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0904 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0884 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c08bc - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c08d8 + /* 00 */ virtual char * vfunc_00(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Arena : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0870 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c07e8 - /* 20 */ virtual s32 vfunc_20(MenuItemState *); // func_ov000_021c0768 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c07a0 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c07bc + /* 00 */ virtual char * vfunc_00(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 20 */ virtual s32 vfunc_20(MenuItemState *); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Transporter : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0754 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0550 - /* 20 */ virtual s32 vfunc_20(MenuItemState *); // func_ov000_021c04d0 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0508 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c0524 + /* 00 */ virtual char * vfunc_00(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 20 */ virtual s32 vfunc_20(MenuItemState *); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class DI_CompleteYes : public DialogItemYes { public: - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0480 + /* 1C */ virtual s32 vfunc_1c(void); }; class MIU_Complete : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c046c - /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c0464 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0408 - /* 24 */ virtual s32 vfunc_24(Menu *, MenuItemState *); // func_ov000_021c03ac - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c03c0 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c03dc + /* 00 */ virtual char * vfunc_00(void); + /* 10 */ virtual s32 vfunc_10(MenuItemState *); + /* 14 */ virtual s32 vfunc_14(void); + /* 24 */ virtual s32 vfunc_24(Menu *, MenuItemState *); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Save : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0398 - /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021c0380 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c0324 - /* 20 */ virtual s32 vfunc_20(MenuItemState *); // func_ov000_021c02a4 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c02dc - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c02f8 + /* 00 */ virtual char * vfunc_00(void); + /* 10 */ virtual s32 vfunc_10(MenuItemState *); + /* 14 */ virtual s32 vfunc_14(void); + /* 20 */ virtual s32 vfunc_20(MenuItemState *); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Imitation : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0290 - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021c00cc - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0068 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021c0084 - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021c00a0 + /* 00 */ virtual char * vfunc_00(void); + /* 14 */ virtual s32 vfunc_14(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MI_Separator : public MenuItem @@ -198,27 +199,27 @@ class MI_Separator : public MenuItem class DI_LureYes : public DialogItemYes { public: - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021c0018 + /* 1C */ virtual s32 vfunc_1c(void); }; class MIU_Lure : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021c0004 - /* 10 */ virtual s32 vfunc_10(MenuItemState *); // func_ov000_021bffec - /* 14 */ virtual s32 vfunc_14(void); // func_ov000_021bffa4 - /* 24 */ virtual s32 vfunc_24(Menu *, MenuItemState *); // func_ov000_021bff48 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021bff5c - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021bff78 + /* 00 */ virtual char * vfunc_00(void); + /* 10 */ virtual s32 vfunc_10(MenuItemState *); + /* 14 */ virtual s32 vfunc_14(void); + /* 24 */ virtual s32 vfunc_24(Menu *, MenuItemState *); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class MIU_Fixed : public MenuItem { public: - /* 00 */ virtual char * vfunc_00(void); // func_ov000_021bff34 - /* 1C */ virtual s32 vfunc_1c(void); // func_ov000_021bfea0 - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); // func_ov000_021bfeec - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); // func_ov000_021bff08 + /* 00 */ virtual char * vfunc_00(void); + /* 1C */ virtual s32 vfunc_1c(void); + /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); + /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); }; class BMapMenu : public Menu @@ -249,11 +250,11 @@ class BSystemMapMenu : public BMapMenu class UnitMenu : public BSystemMapMenu { public: - /* 000 */ virtual void vfunc_00(void); // func_ov000_021c1d30 - /* 024 */ virtual s32 vfunc_24(MenuItemState *, s32); // func_ov000_021c1cf0 - /* 028 */ virtual s32 vfunc_28(s32); // func_ov000_021c1ca4 - /* 060 */ virtual s32 vfunc_60(void); // func_ov000_021c1c30 - /* 11C */ virtual void vfunc_11c(void); // func_ov000_021c1d1c + /* 000 */ virtual void vfunc_00(void); + /* 024 */ virtual s32 vfunc_24(MenuItemState *, s32); + /* 028 */ virtual s32 vfunc_28(s32); + /* 060 */ virtual s32 vfunc_60(void); + /* 11C */ virtual void vfunc_11c(void); virtual ~UnitMenu() { @@ -264,7 +265,7 @@ class UnitMenu : public BSystemMapMenu EC void StartChildMenu(Menu *, void *, ProcPtr, u32, u32); -EC void func_ov000_021bfb80(ProcPtr param_1) +EC void StartUnitMenu(ProcPtr param_1) { static map::MIU_Talk sTalk; static map::MIU_Attack sAttack; @@ -323,16 +324,14 @@ EC void func_ov000_021ae180(s32, s32, s32); EC void func_ov000_021bfa3c(void); EC void func_ov000_021d6a9c(char *, s32); -// func_ov000_021bfea0 s32 map::MIU_Fixed::vfunc_1c(void) { - func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 4, 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_021d6dfc(0); return 0x41; } -// func_ov000_021bfeec void map::MIU_Fixed::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // End this unit's turn. @@ -340,7 +339,6 @@ void map::MIU_Fixed::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021bff08 void map::MIU_Fixed::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -362,21 +360,18 @@ char * map::MIU_Fixed::vfunc_00(void) EC void func_ov000_021bfaf0(ProcPtr); -// func_ov000_021bff48 s32 map::MIU_Lure::vfunc_24(Menu * menu, MenuItemState * menuItemState) { func_ov000_021bfaf0(menu->unk_10); return 0x40; } -// func_ov000_021bff5c void map::MIU_Lure::vfunc_78(Menu * menu, MenuItemState * menuItemState) { func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); return; } -// func_ov000_021bff78 void map::MIU_Lure::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -391,7 +386,6 @@ void map::MIU_Lure::vfunc_90(Menu * menu, MenuItemState * menuItemState) EC s32 func_ov000_021d49f4(s32, s32, s32); -// func_ov000_021bffa4 s32 map::MIU_Lure::vfunc_14(void) { if (func_ov000_021a47e4()) @@ -407,7 +401,6 @@ s32 map::MIU_Lure::vfunc_14(void) return 0; } -// func_ov000_021bffec s32 map::MIU_Lure::vfunc_10(MenuItemState * param_2) { if ((param_2->unk_09 & 7) != 1) @@ -418,16 +411,15 @@ s32 map::MIU_Lure::vfunc_10(MenuItemState * param_2) return 2; } -// func_ov000_021c0004 char * map::MIU_Lure::vfunc_00(void) { return func_02039e10("MUM_囮"); } -// func_ov000_021c0018 s32 map::DI_LureYes::vfunc_1c(void) { - func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x13, 0); + 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); @@ -435,14 +427,12 @@ s32 map::DI_LureYes::vfunc_1c(void) return 0x44; } -// func_ov000_021c0068 s32 map::MIU_Imitation::vfunc_1c(void) { func_ov000_021ae180(0x11, 10, 0); return 0x48; } -// func_ov000_021c0084 void map::MIU_Imitation::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // Transform into a neighboring allied unit. The transformation lasts five turns. @@ -450,7 +440,6 @@ void map::MIU_Imitation::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c00a0 void map::MIU_Imitation::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -464,19 +453,16 @@ void map::MIU_Imitation::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c00cc s32 map::MIU_Imitation::vfunc_14(void) { } -// func_ov000_021c0398 char * map::MIU_Imitation::vfunc_00(void) { // "Imitate" return func_02039e10("MUM_ものまね"); } -// func_ov000_021c02a4 s32 map::MIU_Save::vfunc_20(MenuItemState * menuItemState) { if ((menuItemState->unk_09 & 7) != 1) @@ -489,7 +475,6 @@ s32 map::MIU_Save::vfunc_20(MenuItemState * menuItemState) return 0x100; } -// func_ov000_021c02dc void map::MIU_Save::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Save your progress. You can only use this savepoint once." @@ -497,7 +482,6 @@ void map::MIU_Save::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c02f8 void map::MIU_Save::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -513,7 +497,6 @@ void map::MIU_Save::vfunc_90(Menu * menu, MenuItemState * menuItemState) EC BOOL func_0201f680(void); -// func_ov000_021c0324 s32 map::MIU_Save::vfunc_14(void) { if (func_ov000_021a47e4()) @@ -536,7 +519,6 @@ s32 map::MIU_Save::vfunc_14(void) return 2; } -// func_ov000_021c0380 s32 map::MIU_Save::vfunc_10(MenuItemState * param_2) { if ((param_2->unk_09 & 7) != 1) @@ -547,7 +529,6 @@ s32 map::MIU_Save::vfunc_10(MenuItemState * param_2) return 2; } -// func_ov000_021c0398 char * map::MIU_Save::vfunc_00(void) { return func_02039e10("MUM_P記録"); @@ -555,14 +536,12 @@ char * map::MIU_Save::vfunc_00(void) EC void func_ov000_021bfa60(ProcPtr); -// func_ov000_021c03ac s32 map::MIU_Complete::vfunc_24(Menu * menu, MenuItemState * menuItemState) { func_ov000_021bfa60(menu->unk_10); return 0x40; } -// func_ov000_021c03c0 void map::MIU_Complete::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "End the battle by securing this vital position." @@ -570,7 +549,6 @@ void map::MIU_Complete::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c03dc void map::MIU_Complete::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -584,7 +562,6 @@ void map::MIU_Complete::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0408 s32 map::MIU_Complete::vfunc_14(void) { if (EventCaller::CanStartVisitEvent( @@ -599,22 +576,21 @@ s32 map::MIU_Complete::vfunc_14(void) return 2; } -// func_ov000_021c0464 s32 map::MIU_Complete::vfunc_10(MenuItemState * menuItemState) { return 5; } -// func_ov000_021c046c char * map::MIU_Complete::vfunc_00(void) { + // "Seize" return func_02039e10("MUM_制圧"); } -// func_ov000_021c0480 s32 map::DI_CompleteYes::vfunc_1c(void) { - func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xe, 0); + 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); @@ -622,7 +598,6 @@ s32 map::DI_CompleteYes::vfunc_1c(void) return 0x44; } -// func_ov000_021c04d0 s32 map::MIU_Transporter::vfunc_20(MenuItemState * param_2) { if ((param_2->unk_09 & 7) != 1) @@ -636,7 +611,6 @@ s32 map::MIU_Transporter::vfunc_20(MenuItemState * param_2) return 0x100; } -// func_ov000_021c0508 void map::MIU_Transporter::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Summon the convoy to store and retrieve items." @@ -644,7 +618,6 @@ void map::MIU_Transporter::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0524 void map::MIU_Transporter::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -658,19 +631,16 @@ void map::MIU_Transporter::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0550 s32 map::MIU_Transporter::vfunc_14(void) { // TODO } -// func_ov000_021c0754 char * map::MIU_Transporter::vfunc_00(void) { return func_02039e10("MUM_輸送隊"); } -// func_ov000_021c0768 s32 map::MIU_Arena::vfunc_20(MenuItemState * param_2) { if ((param_2->unk_09 & 7) != 1) @@ -683,7 +653,6 @@ s32 map::MIU_Arena::vfunc_20(MenuItemState * param_2) return 0x100; } -// func_ov000_021c07a0 void map::MIU_Arena::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Visit the arena to test your might with gold at stake." @@ -691,7 +660,6 @@ void map::MIU_Arena::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c07bc void map::MIU_Arena::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -705,39 +673,16 @@ void map::MIU_Arena::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c07e8 s32 map::MIU_Arena::vfunc_14(void) { // TODO } -// func_ov000_021c0870 char * map::MIU_Arena::vfunc_00(void) { return func_02039e10("MUM_闘技場"); } -class ActionState -{ -public: - STRUCT_PAD(0x00, 0x2C); - s8 unk_2c; - s8 unk_2d; - u8 unk_2e; - u8 unk_2f; - s8 xDecision; - s8 yDecision; - s8 unitId; - u8 actionId; - u8 unk_34; - u8 unk_35; - u8 unk_36; - u8 unk_37; -}; - -extern struct ActionState * gActionSt; - -// func_ov000_021c0884 s32 map::MIU_SecretShop::vfunc_1c(void) { gActionSt->actionId = 0xc; @@ -746,7 +691,6 @@ s32 map::MIU_SecretShop::vfunc_1c(void) return 0x41; } -// func_ov000_021c08bc void map::MIU_SecretShop::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Visit this hidden shop to buy and sell weapons and items." @@ -754,7 +698,6 @@ void map::MIU_SecretShop::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c08d8 void map::MIU_SecretShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -768,19 +711,16 @@ void map::MIU_SecretShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0904 s32 map::MIU_SecretShop::vfunc_14(void) { // TODO } -// func_ov000_021c0978 char * map::MIU_SecretShop::vfunc_00(void) { return func_02039e10("MUM_秘密屋"); } -// func_ov000_021c098c s32 map::MIU_ItemShop::vfunc_1c(void) { gActionSt->actionId = 0xb; @@ -789,7 +729,6 @@ s32 map::MIU_ItemShop::vfunc_1c(void) return 0x41; } -// func_ov000_021c09c4 void map::MIU_ItemShop::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Visit the vendor to buy and sell magic tomes, staves, and items." @@ -797,7 +736,6 @@ void map::MIU_ItemShop::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c09e0 void map::MIU_ItemShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -811,7 +749,6 @@ void map::MIU_ItemShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0a0c s32 map::MIU_ItemShop::vfunc_14(void) { if (func_ov000_021a47e4()) @@ -828,13 +765,11 @@ s32 map::MIU_ItemShop::vfunc_14(void) return 0; } -// func_ov000_021c0a54 char * map::MIU_ItemShop::vfunc_00(void) { return func_02039e10("MUM_道具屋"); } -// func_ov000_021c0a68 s32 map::MIU_WeaponShop::vfunc_1c(void) { gActionSt->actionId = 0xa; @@ -843,7 +778,6 @@ s32 map::MIU_WeaponShop::vfunc_1c(void) return 0x41; } -// func_ov000_021c0aa0 void map::MIU_WeaponShop::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Visit the armory to buy and sell weapons." @@ -851,7 +785,6 @@ void map::MIU_WeaponShop::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0abc void map::MIU_WeaponShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -865,7 +798,6 @@ void map::MIU_WeaponShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0ae8 s32 map::MIU_WeaponShop::vfunc_14(void) { if (func_ov000_021a47e4()) @@ -882,22 +814,20 @@ s32 map::MIU_WeaponShop::vfunc_14(void) return 0; } -// func_ov000_021c0b30 char * map::MIU_WeaponShop::vfunc_00(void) { return func_02039e10("MUM_武器屋"); } -// func_ov000_021c0b44 s32 map::MIU_TBox::vfunc_1c(void) { - func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 6, 0); + 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 0x41; } -// func_ov000_021c0b90 void map::MIU_TBox::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Open this chest and claim the item inside." @@ -905,7 +835,6 @@ void map::MIU_TBox::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0bac void map::MIU_TBox::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -921,7 +850,6 @@ void map::MIU_TBox::vfunc_90(Menu * menu, MenuItemState * menuItemState) EC BOOL func_0203d1f4(Unit *); -// func_ov000_021c0bd8 s32 map::MIU_TBox::vfunc_14(void) { if (!func_0203d1f4(gMapStateManager->unk_04->unk_00)) @@ -929,7 +857,8 @@ s32 map::MIU_TBox::vfunc_14(void) return 2; } - if (!func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 6)) + if (!func_ov000_021d49f4( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_CHEST)) { return 2; } @@ -937,28 +866,26 @@ s32 map::MIU_TBox::vfunc_14(void) return 0; } -// func_ov000_021c0c30 s32 map::MIU_TBox::vfunc_10(MenuItemState * menuItemState) { return 5; } -// func_ov000_021c0c38 char * map::MIU_TBox::vfunc_00(void) { + // "Chest" return func_02039e10("MUM_宝箱"); } -// func_ov000_021c0c4c s32 map::MIU_Bridge::vfunc_1c(void) { - func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 7, 0); + 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 0x41; } -// func_ov000_021c0c98 void map::MIU_Bridge::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Lower this drawbridge so units can cross it." @@ -966,7 +893,6 @@ void map::MIU_Bridge::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0cb4 void map::MIU_Bridge::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -980,34 +906,29 @@ void map::MIU_Bridge::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0ce0 s32 map::MIU_Bridge::vfunc_14(void) { // TODO } -// func_ov000_021c0e1c s32 map::MIU_Bridge::vfunc_10(MenuItemState * menuItemState) { return 5; } -// func_ov000_021c0e24 char * map::MIU_Bridge::vfunc_00(void) { return func_02039e10("MUM_橋"); } -// func_ov000_021c0e38 s32 map::MIU_Door::vfunc_1c(void) { - func_ov000_021b0de8(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 5, 0); + 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 0x41; } -// func_ov000_021c0e84 void map::MIU_Door::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Open this door so units can pass through." @@ -1015,7 +936,6 @@ void map::MIU_Door::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0ea0 void map::MIU_Door::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -1029,25 +949,21 @@ void map::MIU_Door::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c0ecc s32 map::MIU_Door::vfunc_14(void) { // TODO } -// func_ov000_021c1008 s32 map::MIU_Door::vfunc_10(MenuItemState * menuItemState) { return 5; } -// func_ov000_021c1010 char * map::MIU_Door::vfunc_00(void) { return func_02039e10("MUM_扉"); } -// func_ov000_021c1024 s32 map::MIU_Visit::vfunc_1c(void) { s32 uVar2 = 0; @@ -1072,7 +988,6 @@ s32 map::MIU_Visit::vfunc_1c(void) return 0x41; } -// func_ov000_021c10e4 void map::MIU_Visit::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Visit this village or home." @@ -1080,7 +995,6 @@ void map::MIU_Visit::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c1100 void map::MIU_Visit::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -1094,7 +1008,6 @@ void map::MIU_Visit::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c112c s32 map::MIU_Visit::vfunc_14(void) { if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 8)) @@ -1113,26 +1026,22 @@ s32 map::MIU_Visit::vfunc_14(void) return 2; } -// func_ov000_021c11b0 s32 map::MIU_Visit::vfunc_10(MenuItemState * menuItemState) { return 5; } -// func_ov000_021c11b8 char * map::MIU_Visit::vfunc_00(void) { return func_02039e10("MUM_訪問"); } -// func_ov000_021c11cc s32 map::MIU_Trade::vfunc_1c(void) { func_ov000_021ae180(0x11, 7, 0); return 0x48; } -// func_ov000_021c11e8 void map::MIU_Trade::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Trade items with a neighboring unit." @@ -1140,7 +1049,6 @@ void map::MIU_Trade::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c1204 void map::MIU_Trade::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -1154,19 +1062,16 @@ void map::MIU_Trade::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c1230 s32 map::MIU_Trade::vfunc_14(void) { // TODO } -// func_ov000_021c13f8 char * map::MIU_Trade::vfunc_00(void) { return func_02039e10("MUM_交換"); } -// func_ov000_021c140c s32 map::MIU_Item::vfunc_1c(void) { func_ov000_021ae180(0xc, 4, 0); @@ -1174,7 +1079,6 @@ s32 map::MIU_Item::vfunc_1c(void) return 0x48; } -// func_ov000_021c1430 void map::MIU_Item::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Use, discard, or otherwise manage items." @@ -1182,7 +1086,6 @@ void map::MIU_Item::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c144c void map::MIU_Item::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -1196,19 +1099,16 @@ void map::MIU_Item::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c1478 s32 map::MIU_Item::vfunc_18(void) { // TODO } -// func_ov000_021c14ec char * map::MIU_Item::vfunc_00(void) { return func_02039e10("MUM_持ち物"); } -// func_ov000_021c1500 s32 map::MIU_Rod::vfunc_1c(void) { func_ov000_021ae180(0xc, 1, 0); @@ -1216,7 +1116,6 @@ s32 map::MIU_Rod::vfunc_1c(void) return 0x48; } -// func_ov000_021c1524 void map::MIU_Rod::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // Use an available staff. (Shortcuts: ┳┫, ┻╋) @@ -1224,7 +1123,6 @@ void map::MIU_Rod::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c1540 void map::MIU_Rod::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -1238,20 +1136,17 @@ void map::MIU_Rod::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c156c s32 map::MIU_Rod::vfunc_18(void) { // TODO } -// func_ov000_021c16b4 char * map::MIU_Rod::vfunc_00(void) { // Staff return func_02039e10("MUM_杖"); } -// func_ov000_021c16c8 s32 map::MIU_Attack::vfunc_1c(void) { func_ov000_021ae180(0xc, 0, 0); @@ -1259,7 +1154,6 @@ s32 map::MIU_Attack::vfunc_1c(void) return 0x48; } -// func_ov000_021c16ec void map::MIU_Attack::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // Attack with an available weapon. (Shortcuts: ┳┫, ┻╋) @@ -1267,7 +1161,6 @@ void map::MIU_Attack::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c1708 void map::MIU_Attack::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -1281,27 +1174,23 @@ void map::MIU_Attack::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c1734 s32 map::MIU_Attack::vfunc_14(void) { // TODO } -// func_ov000_021c1868 char * map::MIU_Attack::vfunc_00(void) { // Attack return func_02039e10("MUM_攻撃"); } -// func_ov000_021c187c s32 map::MIU_Talk::vfunc_1c(void) { func_ov000_021ae180(0x11, 9, 0); return 0x48; } -// func_ov000_021c1898 void map::MIU_Talk::vfunc_78(Menu * menu, MenuItemState * menuItemState) { // "Talk to a neighboring unit. (Shortcuts: ┳┫, ┻╋)" @@ -1309,7 +1198,6 @@ void map::MIU_Talk::vfunc_78(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c18b4 void map::MIU_Talk::vfunc_90(Menu * menu, MenuItemState * menuItemState) { if (!func_0202dad0(menuItemState, menu)) @@ -1323,13 +1211,11 @@ void map::MIU_Talk::vfunc_90(Menu * menu, MenuItemState * menuItemState) return; } -// func_ov000_021c1c14 s32 map::MIU_Talk::vfunc_10(void) { return 5; } -// func_ov000_021c1c1c char * map::MIU_Talk::vfunc_00(void) { // "Talk" @@ -1343,7 +1229,6 @@ EC BOOL func_ov000_021a47e4(void); extern Unit gUnitList[]; -// func_ov000_021c18e0 s32 map::MIU_Talk::vfunc_14(void) { s16 ix; @@ -1433,12 +1318,12 @@ s32 map::MIU_Talk::vfunc_14(void) extern struct UnkStruct_021e3340 * data_ov000_021e3340; -// func_ov000_021c1c30 s32 map::UnitMenu::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, 4, 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(); @@ -1448,7 +1333,6 @@ s32 map::UnitMenu::vfunc_60(void) return this->vfunc_28(0x81); } -// func_ov000_021c1ca4 s32 map::UnitMenu::vfunc_28(s32 param_2) { s32 r0 = (param_2 & 0x3f) == 0; @@ -1468,7 +1352,6 @@ s32 map::UnitMenu::vfunc_28(s32 param_2) return param_2; } -// func_ov000_021c1cf0 s32 map::UnitMenu::vfunc_24(MenuItemState * param_2, s32 param_3) { s32 r0 = (param_3 & 0x3f) == 0; @@ -1482,7 +1365,6 @@ s32 map::UnitMenu::vfunc_24(MenuItemState * param_2, s32 param_3) return param_3; } -// func_ov000_021c1d1c void map::UnitMenu::vfunc_11c(void) { func_ov000_021d6f1c(this->unk_10, 1); @@ -1491,7 +1373,6 @@ void map::UnitMenu::vfunc_11c(void) EC void func_ov000_021be21c(void); -// func_ov000_021c1d30 void map::UnitMenu::vfunc_00(void) { func_ov000_021be21c(); 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()) { From b7bd007a2250336ab84e259c15202cda036204be Mon Sep 17 00:00:00 2001 From: Eebit Date: Tue, 10 Feb 2026 00:31:44 -0500 Subject: [PATCH 4/7] (map_unit_menu) Inline definitions of virtual functions --- src/ov000/map_unit_menu.cpp | 1916 ++++++++++++++++------------------- 1 file changed, 893 insertions(+), 1023 deletions(-) diff --git a/src/ov000/map_unit_menu.cpp b/src/ov000/map_unit_menu.cpp index bb91e20..b89017a 100644 --- a/src/ov000/map_unit_menu.cpp +++ b/src/ov000/map_unit_menu.cpp @@ -3,224 +3,35 @@ #include "action.hpp" #include "event.hpp" #include "hardware.hpp" +#include "map.hpp" #include "menu.hpp" #include "proc_ex.hpp" +#include "unit.hpp" -namespace map -{ - -class MIU_Talk : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 10 */ virtual s32 vfunc_10(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_Attack : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_Rod : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 18 */ virtual s32 vfunc_18(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_Item : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 18 */ virtual s32 vfunc_18(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_Trade : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_Visit : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 10 */ virtual s32 vfunc_10(MenuItemState *); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_Door : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 10 */ virtual s32 vfunc_10(MenuItemState *); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_Bridge : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 10 */ virtual s32 vfunc_10(MenuItemState *); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_TBox : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 10 */ virtual s32 vfunc_10(MenuItemState *); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_WeaponShop : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_ItemShop : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_SecretShop : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; +EC BOOL func_0201f680(void); -class MIU_Arena : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 20 */ virtual s32 vfunc_20(MenuItemState *); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; +EC BOOL func_0203d1f4(Unit *); -class MIU_Transporter : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 20 */ virtual s32 vfunc_20(MenuItemState *); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; +EC void func_ov000_021bfa60(ProcPtr); -class DI_CompleteYes : public DialogItemYes -{ -public: - /* 1C */ virtual s32 vfunc_1c(void); -}; +EC void func_ov000_021bfaf0(ProcPtr); -class MIU_Complete : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 10 */ virtual s32 vfunc_10(MenuItemState *); - /* 14 */ virtual s32 vfunc_14(void); - /* 24 */ virtual s32 vfunc_24(Menu *, MenuItemState *); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; +EC BOOL func_ov000_021a47e4(void); +EC void func_ov000_021be21c(void); -class MIU_Save : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 10 */ virtual s32 vfunc_10(MenuItemState *); - /* 14 */ virtual s32 vfunc_14(void); - /* 20 */ virtual s32 vfunc_20(MenuItemState *); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; +EC s32 func_ov000_021d49f4(s32, s32, s32); -class MIU_Imitation : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 14 */ virtual s32 vfunc_14(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; +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); -class MI_Separator : public MenuItem -{ -}; +extern struct UnkStruct_021e3340 * data_ov000_021e3340; -class DI_LureYes : public DialogItemYes -{ -public: - /* 1C */ virtual s32 vfunc_1c(void); -}; +extern Unit gUnitList[]; -class MIU_Lure : public MenuItem +namespace map { -public: - /* 00 */ virtual char * vfunc_00(void); - /* 10 */ virtual s32 vfunc_10(MenuItemState *); - /* 14 */ virtual s32 vfunc_14(void); - /* 24 */ virtual s32 vfunc_24(Menu *, MenuItemState *); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; - -class MIU_Fixed : public MenuItem -{ -public: - /* 00 */ virtual char * vfunc_00(void); - /* 1C */ virtual s32 vfunc_1c(void); - /* 78 */ virtual void vfunc_78(Menu *, MenuItemState *); - /* 90 */ virtual void vfunc_90(Menu *, MenuItemState *); -}; class BMapMenu : public Menu { @@ -250,1132 +61,1191 @@ class BSystemMapMenu : public BMapMenu class UnitMenu : public BSystemMapMenu { public: - /* 000 */ virtual void vfunc_00(void); - /* 024 */ virtual s32 vfunc_24(MenuItemState *, s32); - /* 028 */ virtual s32 vfunc_28(s32); - /* 060 */ virtual s32 vfunc_60(void); - /* 11C */ virtual void vfunc_11c(void); - virtual ~UnitMenu() { } -}; -} // namespace map + /* 000 */ virtual void vfunc_00(void) + { + func_ov000_021be21c(); + this->unk_40 = 1; + return; + } -EC void StartChildMenu(Menu *, void *, ProcPtr, u32, u32); + /* 11C */ virtual void vfunc_11c(void) + { + func_ov000_021d6f1c(this->unk_10, 1); + return; + } -EC void StartUnitMenu(ProcPtr param_1) -{ - 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; + /* 024 */ virtual s32 vfunc_24(MenuItemState * menuItemState, s32 param_3) + { + s32 r0 = (param_3 & 0x3f) == 0; - // clang-format off - static MenuItem * data_ov000_021de82c[] = + if (!r0) + { + func_ov000_021bfa3c(); + return param_3; + } + + return param_3; + } + + /* 028 */ virtual s32 vfunc_28(s32 param_2) { - &sTalk, - &sAttack, - &sRod, - &sItem, - &sTrade, - &sVisit, - &sDoor, - &sBridge, - &sTBox, - &sWeaponShop, - &sItemShop, - &sSecretShop, - &sArena, - &sTransporter, - &sComplete, - &sSave, - &sImitation, - &sSeparator, - &sLure, - &sFixed, - }; - // clang-format on + s32 r0 = (param_2 & 0x3f) == 0; - StartChildMenu(new map::UnitMenu(), data_ov000_021de82c, param_1, 1, 0); + if (r0) + { + return param_2; + } - return; -} + if (data_ov000_021e3340->unk_06 != 0) + { + return 0x100; + } -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); + func_ov000_021d6e30(2); -s32 map::MIU_Fixed::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 0x41; -} + return param_2; + } -void map::MIU_Fixed::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // End this unit's turn. - func_ov000_021d6a9c(func_02039e10("MUMH_待機"), 0); - return; -} + /* 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(); -void map::MIU_Fixed::vfunc_90(Menu * menu, MenuItemState * menuItemState) + return 0x81; + } + + return this->vfunc_28(0x81); + } +}; + +class MIU_Talk : public MenuItem { - if (!func_0202dad0(menuItemState, menu)) +public: + /* 00 */ virtual char * vfunc_00(void) { - return; + // "Talk" + return func_02039e10("MUM_話す"); } - // End this unit's turn. - func_ov000_021d6a9c(func_02039e10("MUMH_待機"), 0); + /* 10 */ virtual s32 vfunc_10(void) + { + return 5; + } - return; -} + /* 14 */ virtual s32 vfunc_14(void) + { + s16 ix; + s32 xDiff; + s32 yDiff; + s32 unitId; + Unit * psVar6; + s32 xCur; + s32 yCur; + s16 xMax; + s16 yMax; + s16 xMin; + s16 yMin; + s16 iy; + + if (func_ov000_021a47e4()) + { + return 2; + } -char * map::MIU_Fixed::vfunc_00(void) -{ - // Wait - return func_02039e10("MUM_待機"); -} + xCur = gMapStateManager->unk_04->unk_00->xPos; + yCur = gMapStateManager->unk_04->unk_00->yPos; -EC void func_ov000_021bfaf0(ProcPtr); + xMin = xCur - 1; + if (xMin <= gMapStateManager->unk_24) + { + xMin = gMapStateManager->unk_24; + } -s32 map::MIU_Lure::vfunc_24(Menu * menu, MenuItemState * menuItemState) -{ - func_ov000_021bfaf0(menu->unk_10); - return 0x40; -} + yMin = yCur - 1; + if (yMin <= gMapStateManager->unk_25) + { + yMin = gMapStateManager->unk_25; + } -void map::MIU_Lure::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); - return; -} + xMax = xCur + 1; + xCur = gMapStateManager->unk_26 - 1; + if (xCur <= xMax) + { + xMax = xCur; + } -void map::MIU_Lure::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) - { - return; - } + yMax = yCur + 1; + yCur = gMapStateManager->unk_27 - 1; + if (yCur <= yMax) + { + yMax = yCur; + } - func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); + 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); - return; -} + if ((xDiff + yDiff > 0) && (xDiff + yDiff < 2)) + { + unitId = gMapStateManager->unk_028[(ix | iy << 5)]; + + if (unitId == 0) + { + psVar6 = NULL; + } + else + { + psVar6 = gUnitList + unitId - 1; + } + + if (psVar6 == NULL) + { + continue; + } + + if (EventCaller::CanStartTalkEvent( + (u32)func_0203c378(psVar6)->pPersonData, + (u32)func_0203c378(gMapStateManager->unk_04->unk_00)->pPersonData)) + { + return 0; + } + } + } + } -EC s32 func_ov000_021d49f4(s32, s32, s32); + return 2; + } -s32 map::MIU_Lure::vfunc_14(void) -{ - if (func_ov000_021a47e4()) + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) { - return 2; + if (!func_0202dad0(menuItemState, menu)) + { + return; + } + + // "Talk to a neighboring unit. (Shortcuts: ┳┫, ┻╋)" + func_ov000_021d6a9c(func_02039e10("MUMH_話す"), 0); + + return; } - if (!func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x13)) + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) { - return 2; + // "Talk to a neighboring unit. (Shortcuts: ┳┫, ┻╋)" + func_ov000_021d6a9c(func_02039e10("MUMH_話す"), 0); + return; } - return 0; -} + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021ae180(0x11, 9, 0); + return 0x48; + } +}; -s32 map::MIU_Lure::vfunc_10(MenuItemState * param_2) +class MIU_Attack : public MenuItem { - if ((param_2->unk_09 & 7) != 1) +public: + /* 00 */ virtual char * vfunc_00(void) { - return 5; + // Attack + return func_02039e10("MUM_攻撃"); } - return 2; -} + /* 14 */ virtual s32 vfunc_14(void) + { + // TODO + } -char * map::MIU_Lure::vfunc_00(void) -{ - return func_02039e10("MUM_囮"); -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::DI_LureYes::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); + // Attack with an available weapon. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_攻撃"), 0); - return 0x44; -} + return; + } -s32 map::MIU_Imitation::vfunc_1c(void) -{ - func_ov000_021ae180(0x11, 10, 0); - return 0x48; -} + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + // Attack with an available weapon. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_攻撃"), 0); + return; + } -void map::MIU_Imitation::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(0xc, 0, 0); + func_ov000_021d6dfc(0); + return 0x48; + } +}; -void map::MIU_Imitation::vfunc_90(Menu * menu, MenuItemState * menuItemState) +class MIU_Rod : public MenuItem { - if (!func_0202dad0(menuItemState, menu)) +public: + /* 00 */ virtual char * vfunc_00(void) { - return; + // Staff + return func_02039e10("MUM_杖"); } - // "Transform into a neighboring allied unit. The transformation lasts five turns." - func_ov000_021d6a9c(func_02039e10("MUMH_ものまね"), 0); + /* 18 */ virtual s32 vfunc_18(void) + { + // TODO + } - return; -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_Imitation::vfunc_14(void) -{ -} + // Use an available staff. (Shortcuts: ┳┫, ┻╋) + func_ov000_021d6a9c(func_02039e10("MUMH_杖"), 0); -char * map::MIU_Imitation::vfunc_00(void) -{ - // "Imitate" - return func_02039e10("MUM_ものまね"); -} + return; + } -s32 map::MIU_Save::vfunc_20(MenuItemState * menuItemState) -{ - if ((menuItemState->unk_09 & 7) != 1) + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) { - func_ov000_021ae180(0xe, 0, 0); + // 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 0x48; } +}; - return 0x100; -} - -void map::MIU_Save::vfunc_78(Menu * menu, MenuItemState * menuItemState) +class MIU_Item : public MenuItem { - // "Save your progress. You can only use this savepoint once." - func_ov000_021d6a9c(func_02039e10("MUMH_P記録"), 0); - return; -} +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_持ち物"); + } -void map::MIU_Save::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 18 */ virtual s32 vfunc_18(void) { - return; + // TODO } - // "Save your progress. You can only use this savepoint once." - func_ov000_021d6a9c(func_02039e10("MUMH_P記録"), 0); + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } - return; -} + // "Use, discard, or otherwise manage items." + func_ov000_021d6a9c(func_02039e10("MUMH_持ち物"), 0); -EC BOOL func_0201f680(void); + return; + } -s32 map::MIU_Save::vfunc_14(void) -{ - if (func_ov000_021a47e4()) + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) { - return 2; + // "Use, discard, or otherwise manage items." + func_ov000_021d6a9c(func_02039e10("MUMH_持ち物"), 0); + return; } - if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x10)) + /* 1C */ virtual s32 vfunc_1c(void) { - if (!func_0201f680()) - { - return 1; - } - else - { - return 0; - } + func_ov000_021ae180(0xc, 4, 0); + func_ov000_021d6dfc(0); + return 0x48; } +}; - return 2; -} - -s32 map::MIU_Save::vfunc_10(MenuItemState * param_2) +class MIU_Trade : public MenuItem { - if ((param_2->unk_09 & 7) != 1) +public: + /* 00 */ virtual char * vfunc_00(void) { - return 5; + return func_02039e10("MUM_交換"); } - return 2; -} - -char * map::MIU_Save::vfunc_00(void) -{ - return func_02039e10("MUM_P記録"); -} + /* 14 */ virtual s32 vfunc_14(void) + { + // TODO + } -EC void func_ov000_021bfa60(ProcPtr); + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_Complete::vfunc_24(Menu * menu, MenuItemState * menuItemState) -{ - func_ov000_021bfa60(menu->unk_10); - return 0x40; -} + // "Trade items with a neighboring unit." + func_ov000_021d6a9c(func_02039e10("MUMH_交換"), 0); -void map::MIU_Complete::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "End the battle by securing this vital position." - func_ov000_021d6a9c(func_02039e10("MUMH_制圧"), 0); - return; -} + return; + } -void map::MIU_Complete::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) { + // "Trade items with a neighboring unit." + func_ov000_021d6a9c(func_02039e10("MUMH_交換"), 0); return; } - // "End the battle by securing this vital position." - func_ov000_021d6a9c(func_02039e10("MUMH_制圧"), 0); - - return; -} + /* 1C */ virtual s32 vfunc_1c(void) + { + func_ov000_021ae180(0x11, 7, 0); + return 0x48; + } +}; -s32 map::MIU_Complete::vfunc_14(void) +class MIU_Visit : public MenuItem { - if (EventCaller::CanStartVisitEvent( - gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xe)) +public: + /* 00 */ virtual char * vfunc_00(void) { - if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 2)) - { - return 0; - } + return func_02039e10("MUM_訪問"); } - return 2; -} - -s32 map::MIU_Complete::vfunc_10(MenuItemState * menuItemState) -{ - return 5; -} + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + return 5; + } -char * map::MIU_Complete::vfunc_00(void) -{ - // "Seize" - return func_02039e10("MUM_制圧"); -} + /* 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 0; + } + } -s32 map::DI_CompleteYes::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); + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 9)) + { + return 0; + } - return 0x44; -} + return 2; + } -s32 map::MIU_Transporter::vfunc_20(MenuItemState * param_2) -{ - if ((param_2->unk_09 & 7) != 1) + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) { - func_ov000_021ae180(0x22, 0, 0); - func_ov000_021d6dfc(0); - - return 0x41; - } + if (!func_0202dad0(menuItemState, menu)) + { + return; + } - return 0x100; -} + // "Visit this village or home." + func_ov000_021d6a9c(func_02039e10("MUMH_訪問"), 0); -void map::MIU_Transporter::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Summon the convoy to store and retrieve items." - func_ov000_021d6a9c(func_02039e10("MUMH_輸送隊"), 0); - return; -} + return; + } -void map::MIU_Transporter::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) { + // "Visit this village or home." + func_ov000_021d6a9c(func_02039e10("MUMH_訪問"), 0); return; } - // "Summon the convoy to store and retrieve items." - func_ov000_021d6a9c(func_02039e10("MUMH_輸送隊"), 0); - - return; -} + /* 1C */ virtual s32 vfunc_1c(void) + { + s32 uVar2 = 0; -s32 map::MIU_Transporter::vfunc_14(void) -{ - // TODO -} + 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; + } + } -char * map::MIU_Transporter::vfunc_00(void) -{ - return func_02039e10("MUM_輸送隊"); -} + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 9)) + { + uVar2 = 9; + } -s32 map::MIU_Arena::vfunc_20(MenuItemState * param_2) -{ - if ((param_2->unk_09 & 7) != 1) - { - func_ov000_021ae180(0x16, 0, 0); + 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 0x41; } +}; - return 0x100; -} - -void map::MIU_Arena::vfunc_78(Menu * menu, MenuItemState * menuItemState) +class MIU_Door : public MenuItem { - // "Visit the arena to test your might with gold at stake." - func_ov000_021d6a9c(func_02039e10("MUMH_闘技場"), 0); - return; -} +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_扉"); + } -void map::MIU_Arena::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - return; + return 5; } - // "Visit the arena to test your might with gold at stake." - func_ov000_021d6a9c(func_02039e10("MUMH_闘技場"), 0); + /* 14 */ virtual s32 vfunc_14(void) + { + // TODO + } - return; -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_Arena::vfunc_14(void) -{ - // TODO -} + // "Open this door so units can pass through." + func_ov000_021d6a9c(func_02039e10("MUMH_扉"), 0); -char * map::MIU_Arena::vfunc_00(void) -{ - return func_02039e10("MUM_闘技場"); -} + return; + } -s32 map::MIU_SecretShop::vfunc_1c(void) -{ - gActionSt->actionId = 0xc; - func_ov000_021ae180(0x15, 0, 0); - func_ov000_021d6dfc(0); - return 0x41; -} + /* 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; + } -void map::MIU_SecretShop::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) + { + 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 0x41; + } +}; -void map::MIU_SecretShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) +class MIU_Bridge : public MenuItem { - if (!func_0202dad0(menuItemState, menu)) +public: + /* 00 */ virtual char * vfunc_00(void) { - return; + return func_02039e10("MUM_橋"); } - // "Visit this hidden shop to buy and sell weapons and items." - func_ov000_021d6a9c(func_02039e10("MUMH_秘密屋"), 0); - - return; -} + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + return 5; + } -s32 map::MIU_SecretShop::vfunc_14(void) -{ - // TODO -} + /* 14 */ virtual s32 vfunc_14(void) + { + // TODO + } -char * map::MIU_SecretShop::vfunc_00(void) -{ - return func_02039e10("MUM_秘密屋"); -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_ItemShop::vfunc_1c(void) -{ - gActionSt->actionId = 0xb; - func_ov000_021ae180(0x15, 0, 0); - func_ov000_021d6dfc(0); - return 0x41; -} + // "Lower this drawbridge so units can cross it." + func_ov000_021d6a9c(func_02039e10("MUMH_橋"), 0); -void map::MIU_ItemShop::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; -} + return; + } -void map::MIU_ItemShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 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; } - // "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) + { + 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 0x41; + } +}; -s32 map::MIU_ItemShop::vfunc_14(void) +class MIU_TBox : public MenuItem { - if (func_ov000_021a47e4()) +public: + /* 00 */ virtual char * vfunc_00(void) { - return 2; + // "Chest" + return func_02039e10("MUM_宝箱"); } - if (!EventCaller::CanStartVisitEvent( - gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xb)) + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - return 2; + return 5; } - return 0; -} - -char * map::MIU_ItemShop::vfunc_00(void) -{ - return func_02039e10("MUM_道具屋"); -} + /* 14 */ virtual s32 vfunc_14(void) + { + if (!func_0203d1f4(gMapStateManager->unk_04->unk_00)) + { + return 2; + } -s32 map::MIU_WeaponShop::vfunc_1c(void) -{ - gActionSt->actionId = 0xa; - func_ov000_021ae180(0x15, 0, 0); - func_ov000_021d6dfc(0); - return 0x41; -} + if (!func_ov000_021d49f4( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_CHEST)) + { + return 2; + } -void map::MIU_WeaponShop::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Visit the armory to buy and sell weapons." - func_ov000_021d6a9c(func_02039e10("MUMH_武器屋"), 0); - return; -} + return 0; + } -void map::MIU_WeaponShop::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 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; } - // "Visit the armory to buy and sell weapons." - func_ov000_021d6a9c(func_02039e10("MUMH_武器屋"), 0); + /* 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; + } - 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 0x41; + } +}; -s32 map::MIU_WeaponShop::vfunc_14(void) +class MIU_WeaponShop : public MenuItem { - if (func_ov000_021a47e4()) +public: + /* 00 */ virtual char * vfunc_00(void) { - return 2; + return func_02039e10("MUM_武器屋"); } - if (!EventCaller::CanStartVisitEvent( - gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xa)) + /* 14 */ virtual s32 vfunc_14(void) { - return 2; - } + if (func_ov000_021a47e4()) + { + return 2; + } - return 0; -} + if (!EventCaller::CanStartVisitEvent( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xa)) + { + return 2; + } -char * map::MIU_WeaponShop::vfunc_00(void) -{ - return func_02039e10("MUM_武器屋"); -} + return 0; + } -s32 map::MIU_TBox::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 0x41; -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -void map::MIU_TBox::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Open this chest and claim the item inside." - func_ov000_021d6a9c(func_02039e10("MUMH_宝箱"), 0); - return; -} + // "Visit the armory to buy and sell weapons." + func_ov000_021d6a9c(func_02039e10("MUMH_武器屋"), 0); -void map::MIU_TBox::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) + { + // "Visit the armory to buy and sell weapons." + func_ov000_021d6a9c(func_02039e10("MUMH_武器屋"), 0); + return; + } -EC BOOL func_0203d1f4(Unit *); + /* 1C */ virtual s32 vfunc_1c(void) + { + gActionSt->actionId = 0xa; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; + } +}; -s32 map::MIU_TBox::vfunc_14(void) +class MIU_ItemShop : public MenuItem { - if (!func_0203d1f4(gMapStateManager->unk_04->unk_00)) +public: + /* 00 */ virtual char * vfunc_00(void) { - return 2; + return func_02039e10("MUM_道具屋"); } - if (!func_ov000_021d49f4( - gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_CHEST)) + /* 14 */ virtual s32 vfunc_14(void) { - return 2; - } + if (func_ov000_021a47e4()) + { + return 2; + } - return 0; -} + if (!EventCaller::CanStartVisitEvent( + gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xb)) + { + return 2; + } -s32 map::MIU_TBox::vfunc_10(MenuItemState * menuItemState) -{ - return 5; -} + return 0; + } -char * map::MIU_TBox::vfunc_00(void) -{ - // "Chest" - return func_02039e10("MUM_宝箱"); -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_Bridge::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 0x41; -} + // "Visit the vendor to buy and sell magic tomes, staves, and items." + func_ov000_021d6a9c(func_02039e10("MUMH_道具屋"), 0); -void map::MIU_Bridge::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Lower this drawbridge so units can cross it." - func_ov000_021d6a9c(func_02039e10("MUMH_橋"), 0); - return; -} + return; + } -void map::MIU_Bridge::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 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; } - // "Lower this drawbridge so units can cross it." - func_ov000_021d6a9c(func_02039e10("MUMH_橋"), 0); - - return; -} + /* 1C */ virtual s32 vfunc_1c(void) + { + gActionSt->actionId = 0xb; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; + } +}; -s32 map::MIU_Bridge::vfunc_14(void) +class MIU_SecretShop : public MenuItem { - // TODO -} +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_秘密屋"); + } -s32 map::MIU_Bridge::vfunc_10(MenuItemState * menuItemState) -{ - return 5; -} + /* 14 */ virtual s32 vfunc_14(void) + { + // TODO + } -char * map::MIU_Bridge::vfunc_00(void) -{ - return func_02039e10("MUM_橋"); -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_Door::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 0x41; -} + // "Visit this hidden shop to buy and sell weapons and items." + func_ov000_021d6a9c(func_02039e10("MUMH_秘密屋"), 0); -void map::MIU_Door::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Open this door so units can pass through." - func_ov000_021d6a9c(func_02039e10("MUMH_扉"), 0); - return; -} + return; + } -void map::MIU_Door::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 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; } - // "Open this door so units can pass through." - func_ov000_021d6a9c(func_02039e10("MUMH_扉"), 0); - - return; -} - -s32 map::MIU_Door::vfunc_14(void) -{ - // TODO -} - -s32 map::MIU_Door::vfunc_10(MenuItemState * menuItemState) -{ - return 5; -} - -char * map::MIU_Door::vfunc_00(void) -{ - return func_02039e10("MUM_扉"); -} + /* 1C */ virtual s32 vfunc_1c(void) + { + gActionSt->actionId = 0xc; + func_ov000_021ae180(0x15, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; + } +}; -s32 map::MIU_Visit::vfunc_1c(void) +class MIU_Arena : public MenuItem { - s32 uVar2 = 0; - - if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 8)) +public: + /* 00 */ virtual char * vfunc_00(void) { - if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 2)) - { - uVar2 = 8; - } + return func_02039e10("MUM_闘技場"); } - if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 9)) + /* 14 */ virtual s32 vfunc_14(void) { - uVar2 = 9; + // TODO } - 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); + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } - return 0x41; -} + // "Visit the arena to test your might with gold at stake." + func_ov000_021d6a9c(func_02039e10("MUMH_闘技場"), 0); -void map::MIU_Visit::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Visit this village or home." - func_ov000_021d6a9c(func_02039e10("MUMH_訪問"), 0); - return; -} + return; + } -void map::MIU_Visit::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 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; } - // "Visit this village or home." - func_ov000_021d6a9c(func_02039e10("MUMH_訪問"), 0); - - return; -} - -s32 map::MIU_Visit::vfunc_14(void) -{ - if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 8)) + /* 20 */ virtual s32 vfunc_20(MenuItemState * menuItemState) { - if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 2)) + if ((menuItemState->unk_09 & 7) != 1) { - return 0; + func_ov000_021ae180(0x16, 0, 0); + func_ov000_021d6dfc(0); + return 0x41; } + + return 0x100; } +}; - if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 9)) +class MIU_Transporter : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) { - return 0; + return func_02039e10("MUM_輸送隊"); } - return 2; -} - -s32 map::MIU_Visit::vfunc_10(MenuItemState * menuItemState) -{ - return 5; -} + /* 14 */ virtual s32 vfunc_14(void) + { + // TODO + } -char * map::MIU_Visit::vfunc_00(void) -{ - return func_02039e10("MUM_訪問"); -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_Trade::vfunc_1c(void) -{ - func_ov000_021ae180(0x11, 7, 0); - return 0x48; -} + // "Summon the convoy to store and retrieve items." + func_ov000_021d6a9c(func_02039e10("MUMH_輸送隊"), 0); -void map::MIU_Trade::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Trade items with a neighboring unit." - func_ov000_021d6a9c(func_02039e10("MUMH_交換"), 0); - return; -} + return; + } -void map::MIU_Trade::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 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; } - // "Trade items with a neighboring unit." - 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); -s32 map::MIU_Trade::vfunc_14(void) -{ - // TODO -} + return 0x41; + } -char * map::MIU_Trade::vfunc_00(void) -{ - return func_02039e10("MUM_交換"); -} + return 0x100; + } +}; -s32 map::MIU_Item::vfunc_1c(void) +class DI_CompleteYes : public DialogItemYes { - func_ov000_021ae180(0xc, 4, 0); - func_ov000_021d6dfc(0); - return 0x48; -} +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); -void map::MIU_Item::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Use, discard, or otherwise manage items." - func_ov000_021d6a9c(func_02039e10("MUMH_持ち物"), 0); - return; -} + return 0x44; + } +}; -void map::MIU_Item::vfunc_90(Menu * menu, MenuItemState * menuItemState) +class MIU_Complete : public MenuItem { - if (!func_0202dad0(menuItemState, menu)) +public: + /* 00 */ virtual char * vfunc_00(void) { - return; + // "Seize" + return func_02039e10("MUM_制圧"); } - // "Use, discard, or otherwise manage items." - func_ov000_021d6a9c(func_02039e10("MUMH_持ち物"), 0); + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) + { + return 5; + } - return; -} + /* 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 0; + } + } -s32 map::MIU_Item::vfunc_18(void) -{ - // TODO -} + return 2; + } -char * map::MIU_Item::vfunc_00(void) -{ - return func_02039e10("MUM_持ち物"); -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_Rod::vfunc_1c(void) -{ - func_ov000_021ae180(0xc, 1, 0); - func_ov000_021d6dfc(0); - return 0x48; -} + // "End the battle by securing this vital position." + func_ov000_021d6a9c(func_02039e10("MUMH_制圧"), 0); -void map::MIU_Rod::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // Use an available staff. (Shortcuts: ┳┫, ┻╋) - func_ov000_021d6a9c(func_02039e10("MUMH_杖"), 0); - return; -} + return; + } -void map::MIU_Rod::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 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; } - // Use an available staff. (Shortcuts: ┳┫, ┻╋) - func_ov000_021d6a9c(func_02039e10("MUMH_杖"), 0); - - return; -} - -s32 map::MIU_Rod::vfunc_18(void) -{ - // TODO -} - -char * map::MIU_Rod::vfunc_00(void) -{ - // Staff - return func_02039e10("MUM_杖"); -} - -s32 map::MIU_Attack::vfunc_1c(void) -{ - func_ov000_021ae180(0xc, 0, 0); - func_ov000_021d6dfc(0); - return 0x48; -} + /* 24 */ virtual s32 vfunc_24(Menu * menu, MenuItemState * menuItemState) + { + func_ov000_021bfa60(menu->unk_10); + return 0x40; + } +}; -void map::MIU_Attack::vfunc_78(Menu * menu, MenuItemState * menuItemState) +class MIU_Save : public MenuItem { - // Attack with an available weapon. (Shortcuts: ┳┫, ┻╋) - func_ov000_021d6a9c(func_02039e10("MUMH_攻撃"), 0); - return; -} +public: + /* 00 */ virtual char * vfunc_00(void) + { + return func_02039e10("MUM_P記録"); + } -void map::MIU_Attack::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - return; + if ((menuItemState->unk_09 & 7) != 1) + { + return 5; + } + + return 2; } - // Attack with an available weapon. (Shortcuts: ┳┫, ┻╋) - func_ov000_021d6a9c(func_02039e10("MUMH_攻撃"), 0); + /* 14 */ virtual s32 vfunc_14(void) + { + if (func_ov000_021a47e4()) + { + return 2; + } - return; -} + if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x10)) + { + if (!func_0201f680()) + { + return 1; + } + else + { + return 0; + } + } -s32 map::MIU_Attack::vfunc_14(void) -{ - // TODO -} + return 2; + } -char * map::MIU_Attack::vfunc_00(void) -{ - // Attack - return func_02039e10("MUM_攻撃"); -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::MIU_Talk::vfunc_1c(void) -{ - func_ov000_021ae180(0x11, 9, 0); - return 0x48; -} + // "Save your progress. You can only use this savepoint once." + func_ov000_021d6a9c(func_02039e10("MUMH_P記録"), 0); -void map::MIU_Talk::vfunc_78(Menu * menu, MenuItemState * menuItemState) -{ - // "Talk to a neighboring unit. (Shortcuts: ┳┫, ┻╋)" - func_ov000_021d6a9c(func_02039e10("MUMH_話す"), 0); - return; -} + return; + } -void map::MIU_Talk::vfunc_90(Menu * menu, MenuItemState * menuItemState) -{ - if (!func_0202dad0(menuItemState, menu)) + /* 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; } - // "Talk to a neighboring unit. (Shortcuts: ┳┫, ┻╋)" - func_ov000_021d6a9c(func_02039e10("MUMH_話す"), 0); + /* 20 */ virtual s32 vfunc_20(MenuItemState * menuItemState) + { + if ((menuItemState->unk_09 & 7) != 1) + { + func_ov000_021ae180(0xe, 0, 0); + func_ov000_021d6dfc(0); + return 0x48; + } - return; -} + return 0x100; + } +}; -s32 map::MIU_Talk::vfunc_10(void) +class MIU_Imitation : public MenuItem { - return 5; -} +public: + /* 00 */ virtual char * vfunc_00(void) + { + // "Imitate" + return func_02039e10("MUM_ものまね"); + } -char * map::MIU_Talk::vfunc_00(void) -{ - // "Talk" - return func_02039e10("MUM_話す"); -} + /* 14 */ virtual s32 vfunc_14(void) + { + // TODO + } -#include "map.hpp" -#include "unit.hpp" + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -EC BOOL func_ov000_021a47e4(void); + // "Transform into a neighboring allied unit. The transformation lasts five turns." + func_ov000_021d6a9c(func_02039e10("MUMH_ものまね"), 0); -extern Unit gUnitList[]; + return; + } -s32 map::MIU_Talk::vfunc_14(void) -{ - s16 ix; - s32 xDiff; - s32 yDiff; - s32 unitId; - Unit * psVar6; - s32 xCur; - s32 yCur; - s16 xMax; - s16 yMax; - s16 xMin; - s16 yMin; - s16 iy; - - if (func_ov000_021a47e4()) + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) { - return 2; + // Transform into a neighboring allied unit. The transformation lasts five turns. + func_ov000_021d6a9c(func_02039e10("MUMH_ものまね"), 0); + return; } - xCur = gMapStateManager->unk_04->unk_00->xPos; - yCur = gMapStateManager->unk_04->unk_00->yPos; - - xMin = xCur - 1; - if (xMin <= gMapStateManager->unk_24) + /* 1C */ virtual s32 vfunc_1c(void) { - xMin = gMapStateManager->unk_24; + func_ov000_021ae180(0x11, 10, 0); + return 0x48; } +}; + +class MI_Separator : public MenuItem +{ +}; - yMin = yCur - 1; - if (yMin <= gMapStateManager->unk_25) +class DI_LureYes : public DialogItemYes +{ +public: + /* 1C */ virtual s32 vfunc_1c(void) { - yMin = gMapStateManager->unk_25; + 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 0x44; } +}; - xMax = xCur + 1; - xCur = gMapStateManager->unk_26 - 1; - if (xCur <= xMax) +class MIU_Lure : public MenuItem +{ +public: + /* 00 */ virtual char * vfunc_00(void) { - xMax = xCur; + return func_02039e10("MUM_囮"); } - yMax = yCur + 1; - yCur = gMapStateManager->unk_27 - 1; - if (yCur <= yMax) + /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - yMax = yCur; + if ((menuItemState->unk_09 & 7) != 1) + { + return 5; + } + + return 2; } - for (iy = yMin; iy >= yMax; iy++) + /* 14 */ virtual s32 vfunc_14(void) { - for (ix = xMin; ix >= xMax; ix++) + if (func_ov000_021a47e4()) { - yDiff = ABS(gMapStateManager->unk_04->unk_00->yPos - iy); - xDiff = ABS(gMapStateManager->unk_04->unk_00->xPos - ix); - - if ((xDiff + yDiff > 0) && (xDiff + yDiff < 2)) - { - unitId = gMapStateManager->unk_028[(ix | iy << 5)]; + return 2; + } - if (unitId == 0) - { - psVar6 = NULL; - } - else - { - psVar6 = gUnitList + unitId - 1; - } + if (!func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x13)) + { + return 2; + } - if (psVar6 == NULL) - { - continue; - } + return 0; + } - if (EventCaller::CanStartTalkEvent( - (u32)func_0203c378(psVar6)->pPersonData, - (u32)func_0203c378(gMapStateManager->unk_04->unk_00)->pPersonData)) - { - return 0; - } - } + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; } + + func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); + + return; } - return 2; -} + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) + { + func_ov000_021d6a9c(func_02039e10("MUMH_囮"), 0); + return; + } -extern struct UnkStruct_021e3340 * data_ov000_021e3340; + /* 24 */ virtual s32 vfunc_24(Menu * menu, MenuItemState * menuItemState) + { + func_ov000_021bfaf0(menu->unk_10); + return 0x40; + } +}; -s32 map::UnitMenu::vfunc_60(void) +class MIU_Fixed : public MenuItem { - if (data_ov000_021e3340->unk_06 != 0) +public: + /* 00 */ virtual char * vfunc_00(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_021bfa3c(); - - return 0x81; + // Wait + return func_02039e10("MUM_待機"); } - return this->vfunc_28(0x81); -} + /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) + { + if (!func_0202dad0(menuItemState, menu)) + { + return; + } -s32 map::UnitMenu::vfunc_28(s32 param_2) -{ - s32 r0 = (param_2 & 0x3f) == 0; + // End this unit's turn. + func_ov000_021d6a9c(func_02039e10("MUMH_待機"), 0); + + return; + } - if (r0) + /* 78 */ virtual void vfunc_78(Menu * menu, MenuItemState * menuItemState) { - return param_2; + // End this unit's turn. + func_ov000_021d6a9c(func_02039e10("MUMH_待機"), 0); + return; } - if (data_ov000_021e3340->unk_06 != 0) + /* 1C */ virtual s32 vfunc_1c(void) { - return 0x100; + 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 0x41; } +}; - func_ov000_021d6e30(2); +} // namespace map - return param_2; -} +EC void StartChildMenu(Menu *, void *, ProcPtr, u32, u32); -s32 map::UnitMenu::vfunc_24(MenuItemState * param_2, s32 param_3) +EC void StartUnitMenu(ProcPtr param_1) { - s32 r0 = (param_3 & 0x3f) == 0; + 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; - if (!r0) + // clang-format off + static MenuItem * data_ov000_021de82c[] = { - func_ov000_021bfa3c(); - return param_3; - } + &sTalk, + &sAttack, + &sRod, + &sItem, + &sTrade, + &sVisit, + &sDoor, + &sBridge, + &sTBox, + &sWeaponShop, + &sItemShop, + &sSecretShop, + &sArena, + &sTransporter, + &sComplete, + &sSave, + &sImitation, + &sSeparator, + &sLure, + &sFixed, + }; + // clang-format on - return param_3; -} + StartChildMenu(new map::UnitMenu(), data_ov000_021de82c, param_1, 1, 0); -void map::UnitMenu::vfunc_11c(void) -{ - func_ov000_021d6f1c(this->unk_10, 1); return; } - -EC void func_ov000_021be21c(void); - -void map::UnitMenu::vfunc_00(void) -{ - func_ov000_021be21c(); - this->unk_40 = 1; - return; -} \ No newline at end of file From 333c36c9d47f4c81b2df0792a9c8496dde66f330 Mon Sep 17 00:00:00 2001 From: Eebit Date: Tue, 10 Feb 2026 00:39:32 -0500 Subject: [PATCH 5/7] (map_unit_menu) Decompile decide menus and add data section --- config/YFEE01/arm9/overlays/ov000/delinks.txt | 3 +- src/ov000/map_unit_menu.cpp | 47 ++++++++++++++++++- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/config/YFEE01/arm9/overlays/ov000/delinks.txt b/config/YFEE01/arm9/overlays/ov000/delinks.txt index 7988e47..67f6cab 100644 --- a/config/YFEE01/arm9/overlays/ov000/delinks.txt +++ b/config/YFEE01/arm9/overlays/ov000/delinks.txt @@ -23,7 +23,8 @@ src/ov000/mind.cpp: .text start:0x021af79c end:0x021b06fc src/ov000/map_unit_menu.cpp: - .text start:0x021bfb80 end:0x021c1e18 + .text start:0x021bfa60 end:0x021c1e18 + .data start:0x021de3a8 end:0x021dfc20 src/ov000/map.cpp: .text start:0x021d708c end:0x021d7c90 diff --git a/src/ov000/map_unit_menu.cpp b/src/ov000/map_unit_menu.cpp index b89017a..960e382 100644 --- a/src/ov000/map_unit_menu.cpp +++ b/src/ov000/map_unit_menu.cpp @@ -1192,11 +1192,54 @@ class MIU_Fixed : public MenuItem } }; +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 param_1) +EC void StartUnitMenu(ProcPtr proc) { static map::MIU_Talk sTalk; static map::MIU_Attack sAttack; @@ -1245,7 +1288,7 @@ EC void StartUnitMenu(ProcPtr param_1) }; // clang-format on - StartChildMenu(new map::UnitMenu(), data_ov000_021de82c, param_1, 1, 0); + StartChildMenu(new map::UnitMenu(), data_ov000_021de82c, proc, 1, 0); return; } From b46b7257a3d05d46969350e1ccb9917310e37889 Mon Sep 17 00:00:00 2001 From: Eebit Date: Tue, 10 Feb 2026 00:54:16 -0500 Subject: [PATCH 6/7] (map_unit_menu) Add more enum values --- include/action.hpp | 6 +- include/menu.hpp | 15 +++++ src/ov000/map_unit_menu.cpp | 124 ++++++++++++++++++------------------ 3 files changed, 80 insertions(+), 65 deletions(-) diff --git a/include/action.hpp b/include/action.hpp index 5ff28a1..a5999de 100644 --- a/include/action.hpp +++ b/include/action.hpp @@ -15,9 +15,9 @@ enum ACTION_BRIDGE = 0x07, // 0x08 // 0x09 - // 0x0A - // 0x0B - // 0x0C + ACTION_ARMORY = 0x0A, + ACTION_VENDOR = 0x0B, + ACTION_SECRET_SHOP = 0x0C, // 0x0D ACTION_SEIZE = 0x0E, ACTION_ESCAPE = 0x0F, 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/src/ov000/map_unit_menu.cpp b/src/ov000/map_unit_menu.cpp index 960e382..afa881a 100644 --- a/src/ov000/map_unit_menu.cpp +++ b/src/ov000/map_unit_menu.cpp @@ -137,7 +137,7 @@ class MIU_Talk : public MenuItem /* 10 */ virtual s32 vfunc_10(void) { - return 5; + return MENU_COLOR_GREEN; } /* 14 */ virtual s32 vfunc_14(void) @@ -157,7 +157,7 @@ class MIU_Talk : public MenuItem if (func_ov000_021a47e4()) { - return 2; + return MENU_NOTSHOWN; } xCur = gMapStateManager->unk_04->unk_00->xPos; @@ -218,13 +218,13 @@ class MIU_Talk : public MenuItem (u32)func_0203c378(psVar6)->pPersonData, (u32)func_0203c378(gMapStateManager->unk_04->unk_00)->pPersonData)) { - return 0; + return MENU_ENABLED; } } } } - return 2; + return MENU_NOTSHOWN; } /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) @@ -250,7 +250,7 @@ class MIU_Talk : public MenuItem /* 1C */ virtual s32 vfunc_1c(void) { func_ov000_021ae180(0x11, 9, 0); - return 0x48; + return MENU_ACTION_x40 | MENU_ACTION_x8; } }; @@ -292,7 +292,7 @@ class MIU_Attack : public MenuItem { func_ov000_021ae180(0xc, 0, 0); func_ov000_021d6dfc(0); - return 0x48; + return MENU_ACTION_x40 | MENU_ACTION_x8; } }; @@ -334,7 +334,7 @@ class MIU_Rod : public MenuItem { func_ov000_021ae180(0xc, 1, 0); func_ov000_021d6dfc(0); - return 0x48; + return MENU_ACTION_x40 | MENU_ACTION_x8; } }; @@ -375,7 +375,7 @@ class MIU_Item : public MenuItem { func_ov000_021ae180(0xc, 4, 0); func_ov000_021d6dfc(0); - return 0x48; + return MENU_ACTION_x40 | MENU_ACTION_x8; } }; @@ -415,7 +415,7 @@ class MIU_Trade : public MenuItem /* 1C */ virtual s32 vfunc_1c(void) { func_ov000_021ae180(0x11, 7, 0); - return 0x48; + return MENU_ACTION_x40 | MENU_ACTION_x8; } }; @@ -429,7 +429,7 @@ class MIU_Visit : public MenuItem /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - return 5; + return MENU_COLOR_GREEN; } /* 14 */ virtual s32 vfunc_14(void) @@ -438,16 +438,16 @@ class MIU_Visit : public MenuItem { if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 2)) { - return 0; + return MENU_ENABLED; } } if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 9)) { - return 0; + return MENU_ENABLED; } - return 2; + return MENU_NOTSHOWN; } /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) @@ -491,7 +491,7 @@ class MIU_Visit : public MenuItem func_ov000_021ae180(0x28, 0, 0); func_ov000_021d6dfc(0); - return 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } }; @@ -505,7 +505,7 @@ class MIU_Door : public MenuItem /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - return 5; + return MENU_COLOR_GREEN; } /* 14 */ virtual s32 vfunc_14(void) @@ -539,7 +539,7 @@ class MIU_Door : public MenuItem 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 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } }; @@ -553,7 +553,7 @@ class MIU_Bridge : public MenuItem /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - return 5; + return MENU_COLOR_GREEN; } /* 14 */ virtual s32 vfunc_14(void) @@ -587,7 +587,7 @@ class MIU_Bridge : public MenuItem 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 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } }; @@ -602,23 +602,23 @@ class MIU_TBox : public MenuItem /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - return 5; + return MENU_COLOR_GREEN; } /* 14 */ virtual s32 vfunc_14(void) { if (!func_0203d1f4(gMapStateManager->unk_04->unk_00)) { - return 2; + return MENU_NOTSHOWN; } if (!func_ov000_021d49f4( gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, ACTION_CHEST)) { - return 2; + return MENU_NOTSHOWN; } - return 0; + return MENU_ENABLED; } /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) @@ -647,7 +647,7 @@ class MIU_TBox : public MenuItem 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 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } }; @@ -656,6 +656,7 @@ class MIU_WeaponShop : public MenuItem public: /* 00 */ virtual char * vfunc_00(void) { + // "Armory" return func_02039e10("MUM_武器屋"); } @@ -663,16 +664,16 @@ class MIU_WeaponShop : public MenuItem { if (func_ov000_021a47e4()) { - return 2; + return MENU_NOTSHOWN; } if (!EventCaller::CanStartVisitEvent( gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xa)) { - return 2; + return MENU_NOTSHOWN; } - return 0; + return MENU_ENABLED; } /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) @@ -697,10 +698,10 @@ class MIU_WeaponShop : public MenuItem /* 1C */ virtual s32 vfunc_1c(void) { - gActionSt->actionId = 0xa; + gActionSt->actionId = ACTION_ARMORY; func_ov000_021ae180(0x15, 0, 0); func_ov000_021d6dfc(0); - return 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } }; @@ -716,16 +717,16 @@ class MIU_ItemShop : public MenuItem { if (func_ov000_021a47e4()) { - return 2; + return MENU_NOTSHOWN; } if (!EventCaller::CanStartVisitEvent( gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0xb)) { - return 2; + return MENU_NOTSHOWN; } - return 0; + return MENU_ENABLED; } /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) @@ -750,10 +751,10 @@ class MIU_ItemShop : public MenuItem /* 1C */ virtual s32 vfunc_1c(void) { - gActionSt->actionId = 0xb; + gActionSt->actionId = ACTION_VENDOR; func_ov000_021ae180(0x15, 0, 0); func_ov000_021d6dfc(0); - return 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } }; @@ -792,10 +793,10 @@ class MIU_SecretShop : public MenuItem /* 1C */ virtual s32 vfunc_1c(void) { - gActionSt->actionId = 0xc; + gActionSt->actionId = ACTION_SECRET_SHOP; func_ov000_021ae180(0x15, 0, 0); func_ov000_021d6dfc(0); - return 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } }; @@ -838,10 +839,10 @@ class MIU_Arena : public MenuItem { func_ov000_021ae180(0x16, 0, 0); func_ov000_021d6dfc(0); - return 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } - return 0x100; + return MENU_ACTION_x100; } }; @@ -884,11 +885,10 @@ class MIU_Transporter : public MenuItem { func_ov000_021ae180(0x22, 0, 0); func_ov000_021d6dfc(0); - - return 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } - return 0x100; + return MENU_ACTION_x100; } }; @@ -903,7 +903,7 @@ class DI_CompleteYes : public DialogItemYes func_ov000_021bfa3c(); func_ov000_021d6dfc(0); - return 0x44; + return MENU_ACTION_x40 | MENU_ACTION_x4; } }; @@ -918,7 +918,7 @@ class MIU_Complete : public MenuItem /* 10 */ virtual s32 vfunc_10(MenuItemState * menuItemState) { - return 5; + return MENU_COLOR_GREEN; } /* 14 */ virtual s32 vfunc_14(void) @@ -928,11 +928,11 @@ class MIU_Complete : public MenuItem { if (CheckUnitAttribute(gMapStateManager->unk_04->unk_00, 2)) { - return 0; + return MENU_ENABLED; } } - return 2; + return MENU_NOTSHOWN; } /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) @@ -958,7 +958,7 @@ class MIU_Complete : public MenuItem /* 24 */ virtual s32 vfunc_24(Menu * menu, MenuItemState * menuItemState) { func_ov000_021bfa60(menu->unk_10); - return 0x40; + return MENU_ACTION_x40; } }; @@ -974,32 +974,32 @@ class MIU_Save : public MenuItem { if ((menuItemState->unk_09 & 7) != 1) { - return 5; + return MENU_COLOR_GREEN; } - return 2; + return MENU_COLOR_GRAY; } /* 14 */ virtual s32 vfunc_14(void) { if (func_ov000_021a47e4()) { - return 2; + return MENU_NOTSHOWN; } if (func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x10)) { if (!func_0201f680()) { - return 1; + return MENU_DISABLED; } else { - return 0; + return MENU_ENABLED; } } - return 2; + return MENU_NOTSHOWN; } /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) @@ -1028,10 +1028,10 @@ class MIU_Save : public MenuItem { func_ov000_021ae180(0xe, 0, 0); func_ov000_021d6dfc(0); - return 0x48; + return MENU_ACTION_x40 | MENU_ACTION_x8; } - return 0x100; + return MENU_ACTION_x100; } }; @@ -1072,7 +1072,7 @@ class MIU_Imitation : public MenuItem /* 1C */ virtual s32 vfunc_1c(void) { func_ov000_021ae180(0x11, 10, 0); - return 0x48; + return MENU_ACTION_x40 | MENU_ACTION_x8; } }; @@ -1091,7 +1091,7 @@ class DI_LureYes : public DialogItemYes func_ov000_021bfa3c(); func_ov000_021d6dfc(0); - return 0x44; + return MENU_ACTION_x40 | MENU_ACTION_x4; } }; @@ -1107,25 +1107,25 @@ class MIU_Lure : public MenuItem { if ((menuItemState->unk_09 & 7) != 1) { - return 5; + return MENU_COLOR_GREEN; } - return 2; + return MENU_COLOR_GRAY; } /* 14 */ virtual s32 vfunc_14(void) { if (func_ov000_021a47e4()) { - return 2; + return MENU_NOTSHOWN; } if (!func_ov000_021d49f4(gMapStateManager->unk_04->unk_00->xPos, gMapStateManager->unk_04->unk_00->yPos, 0x13)) { - return 2; + return MENU_NOTSHOWN; } - return 0; + return MENU_ENABLED; } /* 90 */ virtual void vfunc_90(Menu * menu, MenuItemState * menuItemState) @@ -1149,7 +1149,7 @@ class MIU_Lure : public MenuItem /* 24 */ virtual s32 vfunc_24(Menu * menu, MenuItemState * menuItemState) { func_ov000_021bfaf0(menu->unk_10); - return 0x40; + return MENU_ACTION_x40; } }; @@ -1188,7 +1188,7 @@ class MIU_Fixed : public MenuItem 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 0x41; + return MENU_ACTION_x40 | MENU_ACTION_x1; } }; From 0c8d3e8c4181e898ab01c0cfd5757f0d18457cc0 Mon Sep 17 00:00:00 2001 From: Eebit Date: Sun, 22 Feb 2026 00:18:01 -0500 Subject: [PATCH 7/7] (map_unit_menu) Progress on the remaining usability (vfunc_14) functions --- src/ov000/map_unit_menu.cpp | 576 ++++++++++++++++++++++++++++++++---- 1 file changed, 512 insertions(+), 64 deletions(-) diff --git a/src/ov000/map_unit_menu.cpp b/src/ov000/map_unit_menu.cpp index afa881a..8c1ed52 100644 --- a/src/ov000/map_unit_menu.cpp +++ b/src/ov000/map_unit_menu.cpp @@ -8,6 +8,32 @@ #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 *); @@ -28,8 +54,6 @@ EC void func_ov000_021d6a9c(char *, s32); extern struct UnkStruct_021e3340 * data_ov000_021e3340; -extern Unit gUnitList[]; - namespace map { @@ -142,81 +166,55 @@ class MIU_Talk : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - s16 ix; - s32 xDiff; - s32 yDiff; - s32 unitId; - Unit * psVar6; - s32 xCur; - s32 yCur; - s16 xMax; - s16 yMax; + 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; } - xCur = gMapStateManager->unk_04->unk_00->xPos; - yCur = gMapStateManager->unk_04->unk_00->yPos; + ux = gMapStateManager->unk_04->unk_00->xPos; + uy = gMapStateManager->unk_04->unk_00->yPos; - xMin = xCur - 1; - if (xMin <= gMapStateManager->unk_24) - { - xMin = gMapStateManager->unk_24; - } - - yMin = yCur - 1; - if (yMin <= gMapStateManager->unk_25) - { - yMin = gMapStateManager->unk_25; - } - - xMax = xCur + 1; - xCur = gMapStateManager->unk_26 - 1; - if (xCur <= xMax) - { - xMax = xCur; - } + xMin = MAX(ux - 1, gMapStateManager->unk_24); + yMin = MAX(uy - 1, gMapStateManager->unk_25); - yMax = yCur + 1; - yCur = gMapStateManager->unk_27 - 1; - if (yCur <= yMax) - { - yMax = yCur; - } + xMax = MIN(ux + 1, gMapStateManager->unk_26 - 1); + yMax = MIN(uy + 1, gMapStateManager->unk_27 - 1); - for (iy = yMin; iy >= yMax; iy++) + for (iy = yMin; iy <= yMax; iy++) { - for (ix = xMin; ix >= xMax; ix++) + 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 > 0) && (xDiff + yDiff < 2)) + if ((xDiff + yDiff >= 1) && (xDiff + yDiff <= 1)) { - unitId = gMapStateManager->unk_028[(ix | iy << 5)]; + unit = GetUnit(gMapStateManager->unk_028[(ix | iy << 5)]); - if (unitId == 0) - { - psVar6 = NULL; - } - else - { - psVar6 = gUnitList + unitId - 1; - } - - if (psVar6 == NULL) + if (unit == NULL) { continue; } - if (EventCaller::CanStartTalkEvent( - (u32)func_0203c378(psVar6)->pPersonData, - (u32)func_0203c378(gMapStateManager->unk_04->unk_00)->pPersonData)) + 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; } @@ -265,7 +263,50 @@ class MIU_Attack : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - // TODO + 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) @@ -307,7 +348,42 @@ class MIU_Rod : public MenuItem /* 18 */ virtual s32 vfunc_18(void) { - // TODO + 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) @@ -348,7 +424,17 @@ class MIU_Item : public MenuItem /* 18 */ virtual s32 vfunc_18(void) { - // TODO + 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) @@ -389,7 +475,74 @@ class MIU_Trade : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - // TODO + 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) @@ -510,7 +663,59 @@ class MIU_Door : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - // TODO + 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) @@ -558,7 +763,59 @@ class MIU_Bridge : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - // TODO + 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) @@ -768,7 +1025,22 @@ class MIU_SecretShop : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - // TODO + 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) @@ -810,7 +1082,33 @@ class MIU_Arena : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - // TODO + 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) @@ -856,7 +1154,87 @@ class MIU_Transporter : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - // TODO + 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) @@ -1046,7 +1424,77 @@ class MIU_Imitation : public MenuItem /* 14 */ virtual s32 vfunc_14(void) { - // TODO + 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)