From 26b2689c64cb80e4a4bd0c110b53edd9d2bc09d3 Mon Sep 17 00:00:00 2001 From: kiwi515 <49212064+kiwi515@users.noreply.github.com> Date: Sat, 31 Jan 2026 14:53:09 -0500 Subject: [PATCH] Matching type splish --- config/RSPE01_01/symbols.txt | 90 +- include/Pack/RPKernel.h | 1 + include/Pack/RPKernel/RPSysSystemWinMgr.h | 77 + include/Pack/RPSystem.h | 2 + include/Pack/RPSystem/RPSysSaveDataMgr.h | 417 ++++ include/Pack/RPSystem/RPSysScene.h | 20 + include/Pack/RPSystem/RPSysSceneMgr.h | 5 + include/Pack/common_message.h | 275 ++- include/Pack/sports_message.h | 2409 ++++++++++----------- include/Pack/types_pack.h | 9 + include/revolution/NAND/nand.h | 33 +- include/revolution/VF/d_vf.h | 1 + src/Pack/RPKernel/RPSysKokeshiManager.cpp | 6 +- src/Pack/RPSystem/RPSysSaveData.cpp | 2 +- src/Pack/RPSystem/RPSysSaveDataMgr.cpp | 975 +++++++++ 15 files changed, 2914 insertions(+), 1408 deletions(-) create mode 100644 include/Pack/RPKernel/RPSysSystemWinMgr.h create mode 100644 include/Pack/RPSystem/RPSysSaveDataMgr.h create mode 100644 include/Pack/RPSystem/RPSysScene.h create mode 100644 src/Pack/RPSystem/RPSysSaveDataMgr.cpp diff --git a/config/RSPE01_01/symbols.txt b/config/RSPE01_01/symbols.txt index c5c26a59..8739da4d 100644 --- a/config/RSPE01_01/symbols.txt +++ b/config/RSPE01_01/symbols.txt @@ -7036,49 +7036,49 @@ fn_80187FA4 = .text:0x80187FA4; // type:function size:0x1E8 fn_8018818C = .text:0x8018818C; // type:function size:0xD4 fn_80188260 = .text:0x80188260; // type:function size:0x20 fn_80188280 = .text:0x80188280; // type:function size:0xE8 -fn_80188368 = .text:0x80188368; // type:function size:0x58 -fn_801883C0 = .text:0x801883C0; // type:function size:0x130 -fn_801884F0 = .text:0x801884F0; // type:function size:0x30 -fn_80188520 = .text:0x80188520; // type:function size:0x8 -fn_80188528 = .text:0x80188528; // type:function size:0x98 -fn_801885C0 = .text:0x801885C0; // type:function size:0x8 -fn_801885C8 = .text:0x801885C8; // type:function size:0xE4 -fn_801886AC = .text:0x801886AC; // type:function size:0xD0 -fn_8018877C = .text:0x8018877C; // type:function size:0xEC -fn_80188868 = .text:0x80188868; // type:function size:0xF4 -fn_8018895C = .text:0x8018895C; // type:function size:0x104 -fn_80188A60 = .text:0x80188A60; // type:function size:0xA4 -fn_80188B04 = .text:0x80188B04; // type:function size:0xD0 -fn_80188BD4 = .text:0x80188BD4; // type:function size:0x18C -fn_80188D60 = .text:0x80188D60; // type:function size:0xF4 -fn_80188E54 = .text:0x80188E54; // type:function size:0x10 -fn_80188E64 = .text:0x80188E64; // type:function size:0x8 -fn_80188E6C = .text:0x80188E6C; // type:function size:0x20 -fn_80188E8C = .text:0x80188E8C; // type:function size:0x8 -fn_80188E94 = .text:0x80188E94; // type:function size:0x8 -fn_80188E9C = .text:0x80188E9C; // type:function size:0x28 -fn_80188EC4 = .text:0x80188EC4; // type:function size:0x38 -fn_80188EFC = .text:0x80188EFC; // type:function size:0x8 -fn_80188F04 = .text:0x80188F04; // type:function size:0xC -fn_80188F10 = .text:0x80188F10; // type:function size:0x20 -fn_80188F30 = .text:0x80188F30; // type:function size:0x14 -fn_80188F44 = .text:0x80188F44; // type:function size:0x20 -fn_80188F64 = .text:0x80188F64; // type:function size:0xDC -fn_80189040 = .text:0x80189040; // type:function size:0xA0 -fn_801890E0 = .text:0x801890E0; // type:function size:0x7C -fn_8018915C = .text:0x8018915C; // type:function size:0xD8 -fn_80189234 = .text:0x80189234; // type:function size:0xA0 -fn_801892D4 = .text:0x801892D4; // type:function size:0xA0 -fn_80189374 = .text:0x80189374; // type:function size:0xA0 -fn_80189414 = .text:0x80189414; // type:function size:0x120 -fn_80189534 = .text:0x80189534; // type:function size:0xF8 -fn_8018962C = .text:0x8018962C; // type:function size:0xF4 -fn_80189720 = .text:0x80189720; // type:function size:0x100 -fn_80189820 = .text:0x80189820; // type:function size:0x3F0 -fn_80189C10 = .text:0x80189C10; // type:function size:0x290 -fn_80189EA0 = .text:0x80189EA0; // type:function size:0x4FC -fn_8018A39C = .text:0x8018A39C; // type:function size:0x508 -fn_8018A8A4 = .text:0x8018A8A4; // type:function size:0x60 +__dt__16RPSysSaveDataMgrFv = .text:0x80188368; // type:function size:0x58 +__ct__16RPSysSaveDataMgrFPQ23EGG4Heap = .text:0x801883C0; // type:function size:0x130 +saveDataFunc__16RPSysSaveDataMgrFPv = .text:0x801884F0; // type:function size:0x30 +loadDataFunc__16RPSysSaveDataMgrFPv = .text:0x80188520; // type:function size:0x8 +createPackFileFunc__16RPSysSaveDataMgrFPv = .text:0x80188528; // type:function size:0x98 +existNandMemoryFunc__16RPSysSaveDataMgrFPv = .text:0x801885C0; // type:function size:0x8 +existPackFileFunc__16RPSysSaveDataMgrFPv = .text:0x801885C8; // type:function size:0xE4 +saveBannerFile__16RPSysSaveDataMgrFQ216RPSysSaveDataMgr11EBannerType = .text:0x801886AC; // type:function size:0xD0 +loadSync__16RPSysSaveDataMgrFv = .text:0x8018877C; // type:function size:0xEC +saveSync__16RPSysSaveDataMgrFv = .text:0x80188868; // type:function size:0xF4 +createBannerFile__16RPSysSaveDataMgrFv = .text:0x8018895C; // type:function size:0x104 +existNandMemorySync__16RPSysSaveDataMgrFv = .text:0x80188A60; // type:function size:0xA4 +checkContinueReject__16RPSysSaveDataMgrFv = .text:0x80188B04; // type:function size:0xD0 +initBanner__16RPSysSaveDataMgrFv = .text:0x80188BD4; // type:function size:0x18C +update__16RPSysSaveDataMgrFb = .text:0x80188D60; // type:function size:0xF4 +finishNandAccess__16RPSysSaveDataMgrFv = .text:0x80188E54; // type:function size:0x10 +getSaveFileNum__16RPSysSaveDataMgrCFv = .text:0x80188E64; // type:function size:0x8 +getUserBlockSize__16RPSysSaveDataMgrCFv = .text:0x80188E6C; // type:function size:0x20 +getErrorCode__16RPSysSaveDataMgrCFv = .text:0x80188E8C; // type:function size:0x8 +getNandCheckAnswer__16RPSysSaveDataMgrCFv = .text:0x80188E94; // type:function size:0x8 +setSaveDisable__16RPSysSaveDataMgrFb = .text:0x80188E9C; // type:function size:0x28 +isErrorOccured__16RPSysSaveDataMgrCFv = .text:0x80188EC4; // type:function size:0x38 +isSaveFileBroken__16RPSysSaveDataMgrCFv = .text:0x80188EFC; // type:function size:0x8 +isNandMemoryExist__16RPSysSaveDataMgrCFv = .text:0x80188F04; // type:function size:0xC +isPackFileExist__16RPSysSaveDataMgrCFv = .text:0x80188F10; // type:function size:0x20 +isNandAccessFinish__16RPSysSaveDataMgrCFv = .text:0x80188F30; // type:function size:0x14 +isAsyncFinish__16RPSysSaveDataMgrCFv = .text:0x80188F44; // type:function size:0x20 +saveAsync__16RPSysSaveDataMgrFv = .text:0x80188F64; // type:function size:0xDC +loadAsync__16RPSysSaveDataMgrFv = .text:0x80189040; // type:function size:0xA0 +savePackFileSync__16RPSysSaveDataMgrFv = .text:0x801890E0; // type:function size:0x7C +deletePackFileSync__16RPSysSaveDataMgrFv = .text:0x8018915C; // type:function size:0xD8 +createPackFileAsync__16RPSysSaveDataMgrFv = .text:0x80189234; // type:function size:0xA0 +existNandMemoryAsync__16RPSysSaveDataMgrFv = .text:0x801892D4; // type:function size:0xA0 +existPackFileAsync__16RPSysSaveDataMgrFv = .text:0x80189374; // type:function size:0xA0 +existPackFileSync__16RPSysSaveDataMgrFv = .text:0x80189414; // type:function size:0x120 +getPartySystemData__16RPSysSaveDataMgrCFv = .text:0x80189534; // type:function size:0xF8 +setPartyPlayerData__16RPSysSaveDataMgrFRC17RPPartyPlayerDatal = .text:0x8018962C; // type:function size:0xF4 +getPartyPlayerData__16RPSysSaveDataMgrCFl = .text:0x80189720; // type:function size:0x100 +setSportsSystemData__16RPSysSaveDataMgrFRC18RPSportsSystemData = .text:0x80189820; // type:function size:0x3F0 +getSportsSystemData__16RPSysSaveDataMgrCFv = .text:0x80189C10; // type:function size:0x290 +setSportsPlayerData__16RPSysSaveDataMgrFRC18RPSportsPlayerDatal = .text:0x80189EA0; // type:function size:0x4FC +getSportsPlayerData__16RPSysSaveDataMgrCFl = .text:0x8018A39C; // type:function size:0x508 +CreateInstance__16RPSysSaveDataMgrFPQ23EGG4Heap = .text:0x8018A8A4; // type:function size:0x60 ListenPropertyEvent__18IRPSysHostIOSocketFv = .text:0x8018A904; // type:function size:0x4 GenMessage__18IRPSysHostIOSocketFv = .text:0x8018A908; // type:function size:0x4 write__18RPSportsSystemDataFRQ23EGG9RamStream = .text:0x8018A90C; // type:function size:0xC4 @@ -18590,7 +18590,7 @@ __vt__11RPGrpScreen = .data:0x803B9894; // type:object size:0x14 scope:global lbl_803B98A8 = .data:0x803B98A8; // type:object size:0x60 jumptable_803B9908 = .data:0x803B9908; // type:object size:0x20 scope:local lbl_803B9928 = .data:0x803B9928; // type:object size:0x10 -lbl_803B9938 = .data:0x803B9938; // type:object size:0x14 +__vt__16RPSysSaveDataMgr = .data:0x803B9938; // type:object size:0x14 lbl_803B9950 = .data:0x803B9950; // type:object size:0x1C lbl_803B996C = .data:0x803B996C; // type:object size:0xC lbl_803B9978 = .data:0x803B9978; // type:object size:0xC @@ -21878,7 +21878,7 @@ spInstance__15RPSysGameConfig = .sbss:0x804BF4E8; // type:object size:0x4 data:4 spInstance__20RPSysResourceManager = .sbss:0x804BF4F0; // type:object size:0x8 data:4byte lbl_804BF4F8 = .sbss:0x804BF4F8; // type:object size:0x8 data:4byte lbl_804BF500 = .sbss:0x804BF500; // type:object size:0x8 data:4byte -lbl_804BF508 = .sbss:0x804BF508; // type:object size:0x8 data:4byte +spInstance__16RPSysSaveDataMgr = .sbss:0x804BF508; // type:object size:0x8 data:4byte spInstance__16RPSysFontManager = .sbss:0x804BF510; // type:object size:0x8 data:4byte lbl_804BF518 = .sbss:0x804BF518; // type:object size:0x8 data:4byte lbl_804BF520 = .sbss:0x804BF520; // type:object size:0x8 data:4byte diff --git a/include/Pack/RPKernel.h b/include/Pack/RPKernel.h index b8ce3d8e..2b779036 100644 --- a/include/Pack/RPKernel.h +++ b/include/Pack/RPKernel.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include diff --git a/include/Pack/RPKernel/RPSysSystemWinMgr.h b/include/Pack/RPKernel/RPSysSystemWinMgr.h new file mode 100644 index 00000000..17112446 --- /dev/null +++ b/include/Pack/RPKernel/RPSysSystemWinMgr.h @@ -0,0 +1,77 @@ +#ifndef RP_KERNEL_SYSTEM_WINDOW_MGR_H +#define RP_KERNEL_SYSTEM_WINDOW_MGR_H +#include + +#include + +//! @addtogroup rp_kernel +//! @{ + +// Forward declarations +class RPSysMessage; + +/** + * @brief System window manager + */ +class RPSysSystemWinMgr { + RP_SINGLETON_DECL_EX(RPSysSystemWinMgr); + +public: + enum E_ALIGN {}; + + enum E_BUTTON { + E_BUTTON_YES, + E_BUTTON_NO, + }; + + enum E_WINDOW_TYPE { + E_WINDOW_TYPE_TEXT, + E_WINDOW_TYPE_ERROR, + }; + + enum E_RESULT { + RESULT_NONE, + RESULT_WAIT, + RESULT_YES, + RESULT_NO, + RESULT_4, + RESULT_5, + RESULT_CONTINUE, + }; + + enum ESound {}; + +public: + void setSystemWindow(E_WINDOW_TYPE type, u32 group, RPSysMessage* pMessage, + int argc, ...); + + void setCursors(); + + void setDefaultCursor(E_BUTTON button) { + unkAF = 0; + unkB0 = button; + unkAB = 0; + unkAC = 0; + unkAD = 0; + unkAE = 0; + } + + E_RESULT getResult() { + return mResult; + } + +private: + char unk8[0x90 - 0x8]; + E_RESULT mResult; // at 0x90 + char unk94[0xAB - 0x94]; + u8 unkAB; + u8 unkAC; + u8 unkAD; + u8 unkAE; + u8 unkAF; + u8 unkB0; +}; + +//! @} + +#endif diff --git a/include/Pack/RPSystem.h b/include/Pack/RPSystem.h index 6d4f436a..9abd52f2 100644 --- a/include/Pack/RPSystem.h +++ b/include/Pack/RPSystem.h @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/include/Pack/RPSystem/RPSysSaveDataMgr.h b/include/Pack/RPSystem/RPSysSaveDataMgr.h new file mode 100644 index 00000000..7237105a --- /dev/null +++ b/include/Pack/RPSystem/RPSysSaveDataMgr.h @@ -0,0 +1,417 @@ +#ifndef RP_SYSTEM_SAVE_DATA_MGR_H +#define RP_SYSTEM_SAVE_DATA_MGR_H +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include + +//! @addtogroup rp_system +//! @{ + +// Forward declarations +class RPSysSaveData; + +/** + * @brief Save data manager + */ +class RPSysSaveDataMgr : public IRPSysHostIOSocket { + RP_SINGLETON_DECL_EX(RPSysSaveDataMgr); + +public: + /** + * @brief Banner file type + */ + enum EBannerType { + EBannerType_Real, //!< Banner file in the home directory + EBannerType_Temp, //!< Banner file in the temporary directory + + EBannerType_Max + }; + +public: + /** + * @name Access save data + */ + /**@{*/ + /** + * @brief Gets the Sports Pack player data at the specified player list + * index + * + * @param idx Player list index + */ + RPSportsPlayerData getSportsPlayerData(s32 idx) const; + /** + * @brief Sets the Sports Pack player data at the specified player list + * index + * + * @param rPlayerData Player data + * @param idx Player list index + */ + void setSportsPlayerData(const RPSportsPlayerData& rPlayerData, s32 idx); + + /** + * @brief Gets the Sports Pack system data + */ + RPSportsSystemData getSportsSystemData() const; + /** + * @brief Sets the Sports Pack system data + * + * @param rSystemData System data + */ + void setSportsSystemData(const RPSportsSystemData& rSystemData); + + /** + * @brief Gets the Party Pack player data at the specified player list + * index + * + * @param idx Player list index + */ + RPPartyPlayerData getPartyPlayerData(s32 idx) const; + /** + * @brief Sets the Party Pack player data at the specified player list + * index + * + * @param rPlayerData Player data + * @param idx Player list index + */ + void setPartyPlayerData(const RPPartyPlayerData& rPlayerData, s32 idx); + + /** + * @brief Gets the Party Pack system data + */ + RPPartySystemData getPartySystemData() const; + /** + * @brief Sets the Party Pack system data + * + * @param rSystemData System data + */ + void setPartySystemData(const RPPartySystemData& rSystemData); + /**@}*/ + + /** + * @name Prepare save data + */ + /**@{*/ + /** + * @brief Checks which save data files exist on the NAND + * + * @return Success + */ + bool existPackFileSync(); + /** + * @brief Checks which save data files exist on the NAND (asynchronous) + * + * @return Success + */ + bool existPackFileAsync(); + /** + * @brief Tests whether the NAND has enough free space to store both the + * banner and save files (asynchronous) + * + * @return Success + */ + bool existNandMemoryAsync(); + + /** + * @brief Attempts to create both the banner and save files on the NAND + * + * @return Success + */ + bool createPackFileSync(); + /** + * @brief Attempts to create both the banner and save files on the NAND + * (asynchonous) + * + * @return Success + */ + bool createPackFileAsync(); + /** + * @brief Attempts to delete both the banner and save files from the NAND + * + * @return Success + */ + bool deletePackFileSync(); + /** + * @brief Attempts to save both the banner and save files to the NAND + * + * @return Success + */ + bool savePackFileSync(); + + /** + * @brief Attempts to load the save file from the NAND (asynchronous) + * + * @return Success + */ + bool loadAsync(); + /** + * @brief Attempts to save both the banner and save files to the NAND + * (asynchronous) + * + * @return Success + */ + bool saveAsync(); + + /** + * @brief Loads the save file from the NAND + */ + void loadSync(); + /** + * @brief Saves both the banner and save files to the NAND + */ + void saveSync(); + + /** + * @name State checking + */ + /**@{*/ + /** + * @brief Tests whether async operations have completed + */ + bool isAsyncFinish() const; + /** + * @brief Tests whether NAND operations have completed + */ + bool isNandAccessFinish() const; + + /** + * @brief Tests whether both the banner and save files exist on the NAND + */ + bool isPackFileExist() const; + /** + * @brief Tests whether the NAND has enough free space to store both the + * banner and save files + */ + bool isNandMemoryExist() const; + + /** + * @brief Tests whether the save file is broken (bad magic, checksum, etc.) + */ + bool isSaveFileBroken() const; + /** + * @brief Tests whether any unrecoverable error has occurred + * @typo + */ + bool isErrorOccured() const; + /**@}*/ + + /** + * @brief Toggles the ability to save both the banner and save files to the + * NAND + * + * @param disable Whether to disable saving + */ + void setSaveDisable(bool disable); + + /** + * @name NAND + */ + /**@{*/ + /** + * @brief Gets the result of the last NAND memory check + */ + u32 getNandCheckAnswer() const; + /** + * @brief Gets the result of the last NAND operation + */ + s32 getErrorCode() const; + + /** + * @brief Gets the number of free NAND blocks needed to store both the + * banner and save files + */ + u32 getUserBlockSize() const; + /** + * @brief Gets the number of free NAND inodes needed to store both the + * banner and save files + */ + u32 getSaveFileNum() const; + + /** + * @brief Marks the current async NAND operations as completed + */ + void finishNandAccess(); + /**@}*/ + + /** + * @brief Updates the save manager state + * + * @param display Whether the scene is fully displayed + */ + void update(bool display); + + /** + * @brief Initializes the banner file binary + */ + void initBanner(); + +private: + /** + * @brief Bitflag indices + */ + enum { + EFlag_NandMemoryExist, //!< Enough NAND memory exists for all files + EFlag_BannerFileExist, //!< The banner file exists on the NAND + EFlag_SaveFileExist, //!< The save file exists on the NAND + EFlag_3, + EFlag_DisableSave, //!< Saving is disabled + EFlag_5, + EFlag_6, + EFlag_7, + EFlag_NandAccess, //!< NAND operation is happening on another thread + EFlag_AsyncSave, //!< Save file is being written on another thread + EFlag_ErrorWindow, //!< System window error was displayed + EFlag_11, + EFlag_NandError, //!< Unrecoverable NAND error + EFlag_13, + EFlag_14, + }; + + /** + * @brief banner.tpl file indices + */ + enum ETplIndex { + ETplIndex_BannerTexture, //!< Banner texture + ETplIndex_IconTexture, //!< Icon texture + }; + + //! VF work memory size + static const u32 VF_WORK_SIZE = OS_MEM_KB_TO_B(16); + + //! NAND save file banner size + static const u32 SAVE_BANNER_SIZE = NAND_BANNER_SIZE(1); + + //! Number of files written when saving +#if defined(PACK_SPORTS) + static const u32 SAVE_FILE_NUM = 2; // RPSports.dat, banner.bin +#elif defined(PACK_PARTY) + static const u32 SAVE_FILE_NUM = 2; // RPParty.dat, banner.bin +#endif + + //! Number of icon texture frames in the save banner + static const u32 BANNER_ICON_FRAME_NUM = 1; + +private: + /** + * @brief Prompts the user to continue without saving + */ + void checkContinueReject(); + + /** + * @brief Checks if the NAND has enough free space to store both the banner + * and save files + */ + void existNandMemorySync() DECOMP_DONT_INLINE; + + /** + * @brief Checks whether the banner file exists on the NAND + */ + void existBannerFile(); + /** + * @brief Creates the banner file on the NAND + * @details For safety purposes, the banner file is first created in the + * temporary directory, before being moved out. + */ + void createBannerFile(); + /** + * @brief Deletes the banner file from the NAND + * @details This function only deletes the banner file in the home directory + */ + void deleteBannerFile(); + /** + * @brief Saves the banner file to the NAND + * + * @param type Which type of banner file to save + */ + void saveBannerFile(EBannerType type); + + /** + * @brief Checks whether the save file exists on the NAND + */ + void existSaveFile(); + /** + * @brief Deletes the save file from the NAND + */ + void deleteSaveFile(); + + /** + * @name Thread functions + */ + /**@{*/ + /** + * @brief Checks which save data files exist on the NAND + * + * @param pArg Thread function argument + */ + static void existPackFileFunc(void* pArg); + /** + * @brief Checks if the NAND has enough free space to store both the banner + * and save files + * + * @param pArg Thread function argument + */ + static void existNandMemoryFunc(void* pArg); + + /** + * @brief Creates both the banner and save files on the NAND + * + * @param pArg Thread function argument + */ + static void createPackFileFunc(void* pArg); + + /** + * @brief Loads the save file from the NAND + * + * @param pArg Thread function argument + */ + static void loadDataFunc(void* pArg); + /** + * @brief Saves both the banner and save files to the NAND + * + * @param pArg Thread function argument + */ + static void saveDataFunc(void* pArg); + /**@}*/ + +private: + //! Banner file names + static const char* BANNER_FILE_NAMES[EBannerType_Max]; + //! Save file name + static const char* SAVE_FILE_NAME; + + //! Status flags + EGG::TBitFlag mFlags; // at 0x8 + + //! Last NAND operation result + s32 mNandErrorCode; // at 0xC + u32 unk10; + //! NANDCheck result + u32 mNandCheckAnswer; // at 0x14 + + //! Save file (`RPSports.dat`) size + u32 mSaveFileSize; // at 0x18 + //! Save banner (`banner.bin`) size + u32 mBannerFileSize; // at 0x1C + //! Size of both the save file and banner together + u32 mClusterFileSize; // at 0x20 + + //! Banner file binary + NANDBanner* mpBannerFile; // at 0x24 + //! Save file binary + u8* mpSaveFile; // at 0x28 + + //! Game save data + RPSysSaveData* mpSaveData; // at 0x2C +}; + +//! @} + +#endif diff --git a/include/Pack/RPSystem/RPSysScene.h b/include/Pack/RPSystem/RPSysScene.h new file mode 100644 index 00000000..c2e47ce6 --- /dev/null +++ b/include/Pack/RPSystem/RPSysScene.h @@ -0,0 +1,20 @@ +#ifndef RP_SYSTEM_SCENE_H +#define RP_SYSTEM_SCENE_H +#include + +#include + +//! @addtogroup rp_system +//! @{ + +/** + * @brief Pack Project scene + */ +class RPSysScene : public EGG::Scene { +public: + bool isNandAccessEnable() const; +}; + +//! @} + +#endif diff --git a/include/Pack/RPSystem/RPSysSceneMgr.h b/include/Pack/RPSystem/RPSysSceneMgr.h index 6bfd0334..3de33b66 100644 --- a/include/Pack/RPSystem/RPSysSceneMgr.h +++ b/include/Pack/RPSystem/RPSysSceneMgr.h @@ -3,6 +3,7 @@ #include #include +#include #include @@ -17,6 +18,10 @@ class RPSysSceneMgr : public EGG::SceneManager { public: bool isShutDownReserved() const; + + RPSysScene* getCurrentSceneRP() const; + + void returnToMenu(bool); }; //! @} diff --git a/include/Pack/common_message.h b/include/Pack/common_message.h index 23b7f376..35096913 100644 --- a/include/Pack/common_message.h +++ b/include/Pack/common_message.h @@ -2,153 +2,144 @@ #define RP_COMMON_MESSAGE_H #include -#define MSG_GROUP(X) (((X) & 0xFFFFFF00) >> 8) -#define MSG_INDEX(X) ((X) & 0xFF) -#define MSG_UNPACK(X) MSG_GROUP(X), MSG_INDEX(X) - -struct bmg_message { - u32 group; - u32 index; -}; - /** * @brief common_message.bmg message IDs */ enum common_message { // clang-format off - MSG_000_000 = 0x00000000, //!< Yes - MSG_001_000 = 0x00000010, //!< No - MSG_002_000 = 0x00000020, //!< Back - MSG_003_000 = 0x00000030, //!< Wii Menu - MSG_010_000 = 0x00000100, //!< - MSG_011_000 = 0x00000110, //!< - MSG_012_000 = 0x00000120, //!< - MSG_013_000 = 0x00000130, //!< - MSG_014_000 = 0x00000140, //!< - MSG_015_000 = 0x00000150, //!< - MSG_020_000 = 0x00000200, //!< Wii Sports - MSG_021_000 = 0x00000210, //!< Wii Play - MSG_040_000 = 0x00000400, //!< An error has occurred.\nPress the Eject Button,\nremove the Game Disc,\nand turn the power off.\nPlease read the\nWii Operations Manual\nfor help troubleshooting. - MSG_041_000 = 0x00000410, //!< The Game Disc could not be read.\nPlease read the Wii operations\nmanual for more information. - MSG_042_000 = 0x00000420, //!< Please insert the {000000}\nGame Disc. - MSG_043_000 = 0x00000430, //!< Press a button on the Wii Remote\nif you want to continue playing. - MSG_050_000 = 0x00000500, //!< - MSG_051_000 = 0x00000510, //!< - MSG_052_000 = 0x00000520, //!< The game could not be saved.\nContinue without saving?{020001 01 00} - MSG_053_000 = 0x00000530, //!< The Wii System Memory is\ncorrupted. Please refer to the\nWii Operations Manual for help\ntroubleshooting. Continue without\nsaving?{020001 01 00} - MSG_100_000 = 0x00001000, //!< This game's save data is\ncorrupted and must be formatted.\nFormat the data now?{020001 01 00} - MSG_101_000 = 0x00001010, //!< Continue without saving?{020001 01 00} - MSG_102_000 = 0x00001020, //!< - MSG_103_000 = 0x00001030, //!< - MSG_104_000 = 0x00001040, //!< The Wii System Memory does not\nhave enough free space. Either\nmove files to an SD Card or erase\nfiles to save. This game requires\n{000000} empty blocks.\nOpen the Data Management\nscreen now?{020001 01 00} - MSG_105_000 = 0x00001050, //!< Create a save file for {000000}?{020001 00 00} - MSG_106_000 = 0x00001060, //!< - MSG_107_000 = 0x00001070, //!< A save file has been created. - MSG_108_000 = 0x00001080, //!< - MSG_110_000 = 0x00001100, //!< The Wii System Memory does not\nhave enough empty files. Either\nmove files to an SD Card or erase\nfiles to save. Open the Data\nManagement screen now?{020001 01 00} - MSG_150_000 = 0x00001500, //!< The batteries in the Wii Remote\nare running low. Please check the\nbattery level on the HOME Menu. - MSG_160_000 = 0x00001600, //!< Unable to load Mii Channel data.\nPlease access the Mii Channel\nand check Mii Channel data. - MSG_161_000 = 0x00001610, //!< Unable to load Mii data stored\nin the Wii Remote. - MSG_170_000 = 0x00001700, //!< Unable to load saved data.\nPlease try again later.\nIf this problem continues, see\nthe Wii Operations Manual for\nhelp troubleshooting. - MSG_171_000 = 0x00001710, //!< Unable to save. - MSG_200_000 = 0x00002000, //!< To play with this many players,\nyou need {000000} Wii Remotes.\nPlease connect more Wii Remotes.{020000 00 3C} - MSG_210_000 = 0x00002100, //!< Use {000000} Wii Remote with {000000} players. - MSG_211_000 = 0x00002110, //!< Use {000000} Wii Remotes with {000000} players. - MSG_250_000 = 0x00002500, //!< You can't select this until you've\ncreated a Mii in the Mii Channel.{020002 00 00}{020001 00 00} - MSG_250_001 = 0x00002501, //!< Back - MSG_250_002 = 0x00002502, //!< To Wii Menu - MSG_251_000 = 0x00002510, //!< There are no Miis stored on this\nWii Remote. Please add a Mii in\nthe Mii Channel. - MSG_260_000 = 0x00002600, //!< You can't save your records\nwith this Mii. Continue?{020002 01 00}{020001 01 00} - MSG_261_000 = 0x00002610, //!< You can't save My Record data\nwith this Mii. Continue?{020001 01 00}{020002 01 00} - MSG_270_000 = 0x00002700, //!< You can't select this Mii today\nbecause it has taken the Wii\nFitness test. Try again tomorrow. - MSG_271_000 = 0x00002710, //!< The connection between the\nWii Remote and Wii console has\nbeen lost. Press \uE047 and \uE048\nsimultaneously to reconnect... - MSG_280_000 = 0x00002800, //!< Added {000001} to\nthe player list. If you erase\nthis Mii from the Mii Channel, it\nwill be deleted from your player\nlist, so be careful!{020000 00 B4} - MSG_281_000 = 0x00002810, //!< Added {000001} to\nthe player list. If you erase\nthis Mii from the Mii Channel, it\nwill be deleted from your player\nlist, so be careful!{020000 00 B4} - MSG_290_000 = 0x00002900, //!< One or more Miis have been\nerased from the Mii Channel\nand will be removed from your\nplayer list.{020000 00 B4} - MSG_291_000 = 0x00002910, //!< One or more Miis have been\nerased from the Mii Channel\nand will be removed from your\nplayer list.{020000 00 B4} - MSG_300_000 = 0x00003000, //!< Which hand do you want to use? - MSG_301_000 = 0x00003010, //!< Tennis - MSG_302_000 = 0x00003020, //!< Baseball - MSG_303_000 = 0x00003030, //!< Bowling - MSG_304_000 = 0x00003040, //!< Golf - MSG_305_000 = 0x00003050, //!< Boxing - MSG_310_000 = 0x00003100, //!< Swing - MSG_311_000 = 0x00003110, //!< Pitch - MSG_312_000 = 0x00003120, //!< Bat - MSG_313_000 = 0x00003130, //!< Bowl - MSG_314_000 = 0x00003140, //!< Swing - MSG_315_000 = 0x00003150, //!< Stance - MSG_320_000 = 0x00003200, //!< L - MSG_321_000 = 0x00003210, //!< R - MSG_330_000 = 0x00003300, //!< OK - MSG_400_000 = 0x00004000, //!< Select Mii - MSG_401_000 = 0x00004010, //!< Select Players - MSG_402_000 = 0x00004020, //!< Tennis - MSG_403_000 = 0x00004030, //!< Baseball - MSG_404_000 = 0x00004040, //!< Bowling - MSG_405_000 = 0x00004050, //!< Golf - MSG_406_000 = 0x00004060, //!< Boxing - MSG_407_000 = 0x00004070, //!< Training - MSG_408_000 = 0x00004080, //!< Wii Fitness - MSG_409_000 = 0x00004090, //!< Main Menu - MSG_450_000 = 0x00004500, //!< Back - MSG_450_001 = 0x00004501, //!< Main Menu - MSG_451_000 = 0x00004510, //!< P1 - MSG_452_000 = 0x00004520, //!< P2 - MSG_453_000 = 0x00004530, //!< P3 - MSG_454_000 = 0x00004540, //!< P4 - MSG_455_000 = 0x00004550, //!< {000001} - MSG_470_000 = 0x00004700, //!< - MSG_500_000 = 0x00005000, //!< Select the number of players. - MSG_510_000 = 0x00005100, //!< 1 - MSG_511_000 = 0x00005110, //!< 2 - MSG_520_000 = 0x00005200, //!< 1 - MSG_521_000 = 0x00005210, //!< 2 - MSG_522_000 = 0x00005220, //!< 3 - MSG_523_000 = 0x00005230, //!< 4 - MSG_530_000 = 0x00005300, //!< More - MSG_531_000 = 0x00005310, //!< OK - MSG_540_000 = 0x00005400, //!< Wii Remotes - MSG_541_000 = 0x00005410, //!< Press \uE047 and \uE048 at the same time on\neach Wii Remote you want to add. - MSG_600_000 = 0x00006000, //!< Select a Mii for Player {000000}. - MSG_600_001 = 0x00006001, //!< Select a Mii. - MSG_610_000 = 0x00006100, //!< Wii Console - MSG_611_000 = 0x00006110, //!< Guest - MSG_612_000 = 0x00006120, //!< Wii Remote - MSG_613_000 = 0x00006130, //!< Reading Mii data...\nDo not unplug the extension controller. - MSG_620_000 = 0x00006200, //!< Play with this Mii. - MSG_620_001 = 0x00006201, //!< Play with these Miis. - MSG_630_000 = 0x00006300, //!< P1 - MSG_631_000 = 0x00006310, //!< P2 - MSG_632_000 = 0x00006320, //!< - MSG_633_000 = 0x00006330, //!< - MSG_640_000 = 0x00006400, //!< {000001} - MSG_650_000 = 0x00006500, //!< Change - MSG_651_000 = 0x00006510, //!< OK - MSG_660_000 = 0x00006600, //!< Guest A - MSG_661_000 = 0x00006610, //!< Guest B - MSG_662_000 = 0x00006620, //!< Guest C - MSG_663_000 = 0x00006630, //!< Guest D - MSG_664_000 = 0x00006640, //!< Guest E - MSG_665_000 = 0x00006650, //!< Guest F - MSG_700_000 = 0x00007000, //!< Yes - MSG_700_001 = 0x00007001, //!< Back - MSG_701_000 = 0x00007010, //!< No - MSG_701_001 = 0x00007011, //!< Wii Menu - MSG_702_000 = 0x00007020, //!< - MSG_750_000 = 0x00007500, //!< Continue - MSG_751_000 = 0x00007510, //!< Start over - MSG_752_000 = 0x00007520, //!< Quit - MSG_800_000 = 0x00008000, //!< Attach the Wii Remote wrist strap. - MSG_850_000 = 0x00008500, //!< Slip the Wii Remote strap\nthrough the connector\nhook of the Nunchuk plug,\nthen connect the Nunchuk. - MSG_851_000 = 0x00008510, //!< Unplug the extension controller\nconnected to this Wii Remote. - MSG_860_000 = 0x00008600, //!< Put the Wii Remote strap through\nthe Nunchuk's connector hook. - MSG_870_000 = 0x00008700, //!< {000001} - MSG_871_000 = 0x00008710, //!< OK! - MSG_880_000 = 0x00008800, //!< Starting the game...\n\nHold the Wii Remote\nsecurely in your hand and\npress \uE042 and \uE043. - MSG_900_000 = 0x00009000, //!< Are you using your Wii Remote\nJacket? Make sure there are\nno people or objects around\nthat you might bump into! - MSG_901_000 = 0x00009010, //!< Why not take a break?\nYou can pause the game\nby pressing \uE045. - MSG_999_000 = 0x00009990, //!< + CMN_MSG_000_000 = 0x00000000, //!< Yes + CMN_MSG_001_000 = 0x00000010, //!< No + CMN_MSG_002_000 = 0x00000020, //!< Back + CMN_MSG_003_000 = 0x00000030, //!< Wii Menu + CMN_MSG_010_000 = 0x000000A0, //!< + CMN_MSG_011_000 = 0x000000B0, //!< + CMN_MSG_012_000 = 0x000000C0, //!< + CMN_MSG_013_000 = 0x000000D0, //!< + CMN_MSG_014_000 = 0x000000E0, //!< + CMN_MSG_015_000 = 0x000000F0, //!< + CMN_MSG_020_000 = 0x00000140, //!< Wii Sports + CMN_MSG_021_000 = 0x00000150, //!< Wii Play + CMN_MSG_040_000 = 0x00000280, //!< An error has occurred.\nPress the Eject Button,\nremove the Game Disc,\nand turn the power off.\nPlease read the\nWii Operations Manual\nfor help troubleshooting. + CMN_MSG_041_000 = 0x00000290, //!< The Game Disc could not be read.\nPlease read the Wii operations\nmanual for more information. + CMN_MSG_042_000 = 0x000002A0, //!< Please insert the {000000}\nGame Disc. + CMN_MSG_043_000 = 0x000002B0, //!< Press a button on the Wii Remote\nif you want to continue playing. + CMN_MSG_050_000 = 0x00000320, //!< + CMN_MSG_051_000 = 0x00000330, //!< + CMN_MSG_052_000 = 0x00000340, //!< The game could not be saved.\nContinue without saving?{020001 01 00} + CMN_MSG_053_000 = 0x00000350, //!< The Wii System Memory is\ncorrupted. Please refer to the\nWii Operations Manual for help\ntroubleshooting. Continue without\nsaving?{020001 01 00} + CMN_MSG_100_000 = 0x00000640, //!< This game's save data is\ncorrupted and must be formatted.\nFormat the data now?{020001 01 00} + CMN_MSG_101_000 = 0x00000650, //!< Continue without saving?{020001 01 00} + CMN_MSG_102_000 = 0x00000660, //!< + CMN_MSG_103_000 = 0x00000670, //!< + CMN_MSG_104_000 = 0x00000680, //!< The Wii System Memory does not\nhave enough free space. Either\nmove files to an SD Card or erase\nfiles to save. This game requires\n{000000} empty blocks.\nOpen the Data Management\nscreen now?{020001 01 00} + CMN_MSG_105_000 = 0x00000690, //!< Create a save file for {000000}?{020001 00 00} + CMN_MSG_106_000 = 0x000006A0, //!< + CMN_MSG_107_000 = 0x000006B0, //!< A save file has been created. + CMN_MSG_108_000 = 0x000006C0, //!< + CMN_MSG_110_000 = 0x000006E0, //!< The Wii System Memory does not\nhave enough empty files. Either\nmove files to an SD Card or erase\nfiles to save. Open the Data\nManagement screen now?{020001 01 00} + CMN_MSG_150_000 = 0x00000960, //!< The batteries in the Wii Remote\nare running low. Please check the\nbattery level on the HOME Menu. + CMN_MSG_160_000 = 0x00000A00, //!< Unable to load Mii Channel data.\nPlease access the Mii Channel\nand check Mii Channel data. + CMN_MSG_161_000 = 0x00000A10, //!< Unable to load Mii data stored\nin the Wii Remote. + CMN_MSG_170_000 = 0x00000AA0, //!< Unable to load saved data.\nPlease try again later.\nIf this problem continues, see\nthe Wii Operations Manual for\nhelp troubleshooting. + CMN_MSG_171_000 = 0x00000AB0, //!< Unable to save. + CMN_MSG_200_000 = 0x00000C80, //!< To play with this many players,\nyou need {000000} Wii Remotes.\nPlease connect more Wii Remotes.{020000 00 3C} + CMN_MSG_210_000 = 0x00000D20, //!< Use {000000} Wii Remote with {000000} players. + CMN_MSG_211_000 = 0x00000D30, //!< Use {000000} Wii Remotes with {000000} players. + CMN_MSG_250_000 = 0x00000FA0, //!< You can't select this until you've\ncreated a Mii in the Mii Channel.{020002 00 00}{020001 00 00} + CMN_MSG_250_001 = 0x00000FA1, //!< Back + CMN_MSG_250_002 = 0x00000FA2, //!< To Wii Menu + CMN_MSG_251_000 = 0x00000FB0, //!< There are no Miis stored on this\nWii Remote. Please add a Mii in\nthe Mii Channel. + CMN_MSG_260_000 = 0x00001040, //!< You can't save your records\nwith this Mii. Continue?{020002 01 00}{020001 01 00} + CMN_MSG_261_000 = 0x00001050, //!< You can't save My Record data\nwith this Mii. Continue?{020001 01 00}{020002 01 00} + CMN_MSG_270_000 = 0x000010E0, //!< You can't select this Mii today\nbecause it has taken the Wii\nFitness test. Try again tomorrow. + CMN_MSG_271_000 = 0x000010F0, //!< The connection between the\nWii Remote and Wii console has\nbeen lost. Press \uE047 and \uE048\nsimultaneously to reconnect... + CMN_MSG_280_000 = 0x00001180, //!< Added {000001} to\nthe player list. If you erase\nthis Mii from the Mii Channel, it\nwill be deleted from your player\nlist, so be careful!{020000 00 B4} + CMN_MSG_281_000 = 0x00001190, //!< Added {000001} to\nthe player list. If you erase\nthis Mii from the Mii Channel, it\nwill be deleted from your player\nlist, so be careful!{020000 00 B4} + CMN_MSG_290_000 = 0x00001220, //!< One or more Miis have been\nerased from the Mii Channel\nand will be removed from your\nplayer list.{020000 00 B4} + CMN_MSG_291_000 = 0x00001230, //!< One or more Miis have been\nerased from the Mii Channel\nand will be removed from your\nplayer list.{020000 00 B4} + CMN_MSG_300_000 = 0x000012C0, //!< Which hand do you want to use? + CMN_MSG_301_000 = 0x000012D0, //!< Tennis + CMN_MSG_302_000 = 0x000012E0, //!< Baseball + CMN_MSG_303_000 = 0x000012F0, //!< Bowling + CMN_MSG_304_000 = 0x00001300, //!< Golf + CMN_MSG_305_000 = 0x00001310, //!< Boxing + CMN_MSG_310_000 = 0x00001360, //!< Swing + CMN_MSG_311_000 = 0x00001370, //!< Pitch + CMN_MSG_312_000 = 0x00001380, //!< Bat + CMN_MSG_313_000 = 0x00001390, //!< Bowl + CMN_MSG_314_000 = 0x000013A0, //!< Swing + CMN_MSG_315_000 = 0x000013B0, //!< Stance + CMN_MSG_320_000 = 0x00001400, //!< L + CMN_MSG_321_000 = 0x00001410, //!< R + CMN_MSG_330_000 = 0x000014A0, //!< OK + CMN_MSG_400_000 = 0x00001900, //!< Select Mii + CMN_MSG_401_000 = 0x00001910, //!< Select Players + CMN_MSG_402_000 = 0x00001920, //!< Tennis + CMN_MSG_403_000 = 0x00001930, //!< Baseball + CMN_MSG_404_000 = 0x00001940, //!< Bowling + CMN_MSG_405_000 = 0x00001950, //!< Golf + CMN_MSG_406_000 = 0x00001960, //!< Boxing + CMN_MSG_407_000 = 0x00001970, //!< Training + CMN_MSG_408_000 = 0x00001980, //!< Wii Fitness + CMN_MSG_409_000 = 0x00001990, //!< Main Menu + CMN_MSG_450_000 = 0x00001C20, //!< Back + CMN_MSG_450_001 = 0x00001C21, //!< Main Menu + CMN_MSG_451_000 = 0x00001C30, //!< P1 + CMN_MSG_452_000 = 0x00001C40, //!< P2 + CMN_MSG_453_000 = 0x00001C50, //!< P3 + CMN_MSG_454_000 = 0x00001C60, //!< P4 + CMN_MSG_455_000 = 0x00001C70, //!< {000001} + CMN_MSG_470_000 = 0x00001D60, //!< + CMN_MSG_500_000 = 0x00001F40, //!< Select the number of players. + CMN_MSG_510_000 = 0x00001FE0, //!< 1 + CMN_MSG_511_000 = 0x00001FF0, //!< 2 + CMN_MSG_520_000 = 0x00002080, //!< 1 + CMN_MSG_521_000 = 0x00002090, //!< 2 + CMN_MSG_522_000 = 0x000020A0, //!< 3 + CMN_MSG_523_000 = 0x000020B0, //!< 4 + CMN_MSG_530_000 = 0x00002120, //!< More + CMN_MSG_531_000 = 0x00002130, //!< OK + CMN_MSG_540_000 = 0x000021C0, //!< Wii Remotes + CMN_MSG_541_000 = 0x000021D0, //!< Press \uE047 and \uE048 at the same time on\neach Wii Remote you want to add. + CMN_MSG_600_000 = 0x00002580, //!< Select a Mii for Player {000000}. + CMN_MSG_600_001 = 0x00002581, //!< Select a Mii. + CMN_MSG_610_000 = 0x00002620, //!< Wii Console + CMN_MSG_611_000 = 0x00002630, //!< Guest + CMN_MSG_612_000 = 0x00002640, //!< Wii Remote + CMN_MSG_613_000 = 0x00002650, //!< Reading Mii data...\nDo not unplug the extension controller. + CMN_MSG_620_000 = 0x000026C0, //!< Play with this Mii. + CMN_MSG_620_001 = 0x000026C1, //!< Play with these Miis. + CMN_MSG_630_000 = 0x00002760, //!< P1 + CMN_MSG_631_000 = 0x00002770, //!< P2 + CMN_MSG_632_000 = 0x00002780, //!< + CMN_MSG_633_000 = 0x00002790, //!< + CMN_MSG_640_000 = 0x00002800, //!< {000001} + CMN_MSG_650_000 = 0x000028A0, //!< Change + CMN_MSG_651_000 = 0x000028B0, //!< OK + CMN_MSG_660_000 = 0x00002940, //!< Guest A + CMN_MSG_661_000 = 0x00002950, //!< Guest B + CMN_MSG_662_000 = 0x00002960, //!< Guest C + CMN_MSG_663_000 = 0x00002970, //!< Guest D + CMN_MSG_664_000 = 0x00002980, //!< Guest E + CMN_MSG_665_000 = 0x00002990, //!< Guest F + CMN_MSG_700_000 = 0x00002BC0, //!< Yes + CMN_MSG_700_001 = 0x00002BC1, //!< Back + CMN_MSG_701_000 = 0x00002BD0, //!< No + CMN_MSG_701_001 = 0x00002BD1, //!< Wii Menu + CMN_MSG_702_000 = 0x00002BE0, //!< + CMN_MSG_750_000 = 0x00002EE0, //!< Continue + CMN_MSG_751_000 = 0x00002EF0, //!< Start over + CMN_MSG_752_000 = 0x00002F00, //!< Quit + CMN_MSG_800_000 = 0x00003200, //!< Attach the Wii Remote wrist strap. + CMN_MSG_850_000 = 0x00003520, //!< Slip the Wii Remote strap\nthrough the connector\nhook of the Nunchuk plug,\nthen connect the Nunchuk. + CMN_MSG_851_000 = 0x00003530, //!< Unplug the extension controller\nconnected to this Wii Remote. + CMN_MSG_860_000 = 0x000035C0, //!< Put the Wii Remote strap through\nthe Nunchuk's connector hook. + CMN_MSG_870_000 = 0x00003660, //!< {000001} + CMN_MSG_871_000 = 0x00003670, //!< OK! + CMN_MSG_880_000 = 0x00003700, //!< Starting the game...\n\nHold the Wii Remote\nsecurely in your hand and\npress \uE042 and \uE043. + CMN_MSG_900_000 = 0x00003840, //!< Are you using your Wii Remote\nJacket? Make sure there are\nno people or objects around\nthat you might bump into! + CMN_MSG_901_000 = 0x00003850, //!< Why not take a break?\nYou can pause the game\nby pressing \uE045. + CMN_MSG_999_000 = 0x00003E70, //!< // clang-format on }; diff --git a/include/Pack/sports_message.h b/include/Pack/sports_message.h index 6ac98d21..81965f38 100644 --- a/include/Pack/sports_message.h +++ b/include/Pack/sports_message.h @@ -2,1220 +2,1211 @@ #define RP_SPORTS_MESSAGE_H #include -#define MSG_GROUP(X) (((X) & 0xFFFFFF00) >> 8) -#define MSG_INDEX(X) ((X) & 0xFF) -#define MSG_UNPACK(X) MSG_GROUP(X), MSG_INDEX(X) - -struct bmg_message { - u32 group; - u32 index; -}; - /** * @brief sports_message.bmg message IDs */ enum sports_message { // clang-format off - MSG_00000_000 = 0x00000000, //!< - MSG_00001_000 = 0x00000010, //!< - MSG_00999_000 = 0x00009990, //!< - MSG_01000_000 = 0x00010000, //!< - MSG_01110_000 = 0x00011100, //!< - MSG_01300_000 = 0x00013000, //!< Returning Balls - MSG_01301_000 = 0x00013010, //!< Return the ball inside\nthe court. Just relax\nand focus on hitting\nthe ball. - MSG_01310_000 = 0x00013100, //!< Timing Your Swing - MSG_01311_000 = 0x00013110, //!< Return the ball into\nthe orange bar. Watch\nyour timing, and aim\neach shot carefully. - MSG_01320_000 = 0x00013200, //!< Target Practice - MSG_01321_000 = 0x00013210, //!< Volley the ball off\nthe wall and hit the\ntargets. Controlling\nyour swing speed and\nstrength is essential\nin aiming your shots. - MSG_02000_000 = 0x00020000, //!< - MSG_02100_000 = 0x00021000, //!< - MSG_02101_000 = 0x00021010, //!< - MSG_02101_001 = 0x00021011, //!< - MSG_02101_002 = 0x00021012, //!< - MSG_02101_003 = 0x00021013, //!< - MSG_02102_000 = 0x00021020, //!< - MSG_02300_000 = 0x00023000, //!< Hitting Home Runs - MSG_02301_000 = 0x00023010, //!< Watch the ball, and\ntry to hit it out of\nthe park. Timing is\neverything! - MSG_02310_000 = 0x00023100, //!< Swing Control - MSG_02311_000 = 0x00023110, //!< Hit into the target\nzones on the field.\nMaster this, and you'll\nbe a pro in no time! - MSG_02320_000 = 0x00023200, //!< Batting Practice - MSG_02321_000 = 0x00023210, //!< The pitcher will keep\nthrowing those balls,\nso focus on making\nfast, compact swings! - MSG_03000_000 = 0x00030000, //!< - MSG_03001_000 = 0x00030010, //!< - MSG_03002_000 = 0x00030020, //!< - MSG_03002_001 = 0x00030021, //!< - MSG_03003_000 = 0x00030030, //!< - MSG_03100_000 = 0x00031000, //!< - MSG_03101_000 = 0x00031010, //!< - MSG_03200_000 = 0x00032000, //!< - MSG_03201_000 = 0x00032010, //!< - MSG_03300_000 = 0x00033000, //!< Putting - MSG_03301_000 = 0x00033010, //!< Drop it in the cup with\na single putt. Check\nthe lay of the green\nby pressing \uE047. - MSG_03310_000 = 0x00033100, //!< Hitting the Green - MSG_03311_000 = 0x00033110, //!< Land the ball as close\nto the pin as possible.\nPractice your stroke\nto check the power of\nyour swing. Hold \uE042\nto approach the ball. - MSG_03320_000 = 0x00033200, //!< Target Practice - MSG_03321_000 = 0x00033210, //!< Hit the target with\nthe ball. Before you\ntake your swing, be\nsure to read the\nwind direction. - MSG_04000_000 = 0x00040000, //!< - MSG_04001_000 = 0x00040010, //!< - MSG_04100_000 = 0x00041000, //!< - MSG_04101_000 = 0x00041010, //!< - MSG_05000_000 = 0x00050000, //!< Boxing - MSG_05300_000 = 0x00053000, //!< Throwing Punches - MSG_05301_000 = 0x00053010, //!< Watch your trainer's\nmitts, and try to hit\nthem. You lose points\nif you hit your trainer. - MSG_05310_000 = 0x00053100, //!< Dodging - MSG_05311_000 = 0x00053110, //!< Your trainer throws\nball after ball at you.\nMove left and right\nto avoid getting hit. - MSG_05320_000 = 0x00053200, //!< Working the Bag - MSG_05321_000 = 0x00053210, //!< Throw punches at\nthe punching bags\nuntil you knock them\noff their chains.\nWell-aimed combo\npunches are key. - MSG_06000_000 = 0x00060000, //!< - MSG_06300_000 = 0x00063000, //!< Picking Up Spares - MSG_06301_000 = 0x00063010, //!< Knock down the pins\nwith a single throw.\nTwist your wrist to\ncurve the ball. - MSG_06310_000 = 0x00063100, //!< Spin Control - MSG_06311_000 = 0x00063110, //!< Avoid the barriers in\nthe lane and knock\ndown the pin. You'll\nhave to balance speed\nand spin. - MSG_06320_000 = 0x00063200, //!< Power Throws - MSG_06321_000 = 0x00063210, //!< Knock down as many\npins as you can. A\nnew row will be added\nafter each set. Strikes\ndouble your score! - MSG_07000_000 = 0x00070000, //!< Today's fitness test uses\nthe Nunchuk. Are you able to use\nthe Nunchuk?{020001 00 00} - MSG_07001_000 = 0x00070010, //!< Quit the Wii Fitness test?\n\nIf you quit, you can't do another\nWii Fitness test until tomorrow.{020001 01 00}{020002 01 00} - MSG_07002_000 = 0x00070020, //!< Quitting today's fitness test. - MSG_07003_000 = 0x00070030, //!< - MSG_07004_000 = 0x00070040, //!< - MSG_07005_000 = 0x00070050, //!< - MSG_07006_000 = 0x00070060, //!< Selecting events that do\nnot use the Nunchuk. - MSG_07010_000 = 0x00070100, //!< You can take only one Wii Fitness\ntest each day. You've already\ntaken the test today, so please\ntry again tomorrow. - MSG_07020_000 = 0x00070200, //!< - MSG_07030_000 = 0x00070300, //!< Wii Fitness\n\nTest your speed, stamina, and\nstrength to determine your Wii\nFitness Age. Train every day to\nlower your Wii Fitness Age. - MSG_08000_000 = 0x00080000, //!< {000001}\ndebuted in Wii Sports on\n{000000} at {000000}. - MSG_08010_000 = 0x00080100, //!< You're a tennis pro! - MSG_08011_000 = 0x00080110, //!< You're a baseball pro! - MSG_08012_000 = 0x00080120, //!< You're a pro bowler! - MSG_08013_000 = 0x00080130, //!< You're a pro golfer! - MSG_08014_000 = 0x00080140, //!< You're a pro boxer! - MSG_08020_000 = 0x00080200, //!< You've lost your\ntennis pro status! - MSG_08021_000 = 0x00080210, //!< You've lost your\nbaseball pro status! - MSG_08022_000 = 0x00080220, //!< You've lost your\nbowling pro status! - MSG_08023_000 = 0x00080230, //!< You've lost your\ngolf pro status! - MSG_08024_000 = 0x00080240, //!< You've lost your\nboxing pro status! - MSG_08030_000 = 0x00080300, //!< New personal best!\nGolf: Stroke play - MSG_08030_001 = 0x00080301, //!< Score: {000000} - MSG_08030_002 = 0x00080302, //!< {000000} - MSG_08031_000 = 0x00080310, //!< New personal best!\nBowling: Score play - MSG_08031_001 = 0x00080311, //!< Score: {000000} - MSG_08031_002 = 0x00080312, //!< {000000} - MSG_08040_000 = 0x00080400, //!< New personal best!\n{000000}: {000000} - MSG_08040_001 = 0x00080401, //!< Score: {000000} - MSG_08040_002 = 0x00080402, //!< {000000} pt - MSG_08040_003 = 0x00080403, //!< {000000} pts - MSG_08041_000 = 0x00080410, //!< Home runs: {000000} - MSG_08041_001 = 0x00080411, //!< {000000} homer - MSG_08041_002 = 0x00080412, //!< Total distance: {000000} - MSG_08041_003 = 0x00080413, //!< {000000} foot - MSG_08041_004 = 0x00080414, //!< {000000} feet - MSG_08041_005 = 0x00080415, //!< {000000} homers - MSG_08042_000 = 0x00080420, //!< Hits: {000000} - MSG_08042_001 = 0x00080421, //!< {000000} hit - MSG_08042_002 = 0x00080422, //!< {000000} hits - MSG_08043_000 = 0x00080430, //!< Successful hits: {000000} - MSG_08043_001 = 0x00080431, //!< {000000} hit - MSG_08043_002 = 0x00080432, //!< {000000} hits - MSG_08044_000 = 0x00080440, //!< Pins knocked down: {000000} - MSG_08044_001 = 0x00080441, //!< {000000} pin - MSG_08044_002 = 0x00080442, //!< {000000} pins - MSG_08045_000 = 0x00080450, //!< Cup-in: {000000} - MSG_08045_001 = 0x00080451, //!< {000000} pt - MSG_08045_002 = 0x00080452, //!< {000000} pts - MSG_08046_000 = 0x00080460, //!< Total remaining: {000000} - MSG_08046_001 = 0x00080461, //!< {000000} yard - MSG_08046_002 = 0x00080462, //!< {000000} yards - MSG_08050_000 = 0x00080500, //!< You got a {000000} medal in\n{000000}: {000000}! - MSG_08060_000 = 0x00080600, //!< Wii Fitness Results - MSG_08060_001 = 0x00080601, //!< {000000} years old!\nYou've taken off {000000} year! - MSG_08060_002 = 0x00080602, //!< {000000} years old!\nYou've taken off {000000} years! - MSG_08070_000 = 0x00080700, //!< Impressive! You hit a hole\nin one on hole {000000} in a\nnine-hole game of golf! - MSG_08070_001 = 0x00080701, //!< Impressive! You hit a hole\nin one on hole {000000} in a\nthree-hole game of golf! - MSG_08100_000 = 0x00081000, //!< Wii Sports Debut - MSG_08110_000 = 0x00081100, //!< Pro Status Earned - MSG_08111_000 = 0x00081110, //!< Pro Status Lost - MSG_08112_000 = 0x00081120, //!< New Personal Best Set - MSG_08113_000 = 0x00081130, //!< A New Champion! - MSG_08114_020 = 0x00811420, //!< Impressive! - MSG_08114_030 = 0x00811430, //!< Impressive! - MSG_08120_000 = 0x00081200, //!< New Personal Best Set - MSG_08121_000 = 0x00081210, //!< Platinum Medal Earned! - MSG_08121_001 = 0x00081211, //!< Gold Medal Earned! - MSG_08121_002 = 0x00081212, //!< Silver Medal Earned! - MSG_08121_003 = 0x00081213, //!< Bronzed Medal Earned! - MSG_08122_000 = 0x00081220, //!< All Gold Medals Earned! - MSG_08123_000 = 0x00081230, //!< All Platinum Medals Earned! - MSG_08130_000 = 0x00081300, //!< Wii Fitness Results - MSG_08200_000 = 0x00082000, //!< Wii Sports Debut - MSG_08210_000 = 0x00082100, //!< Tennis Pro Status Reached! - MSG_08210_010 = 0x00821010, //!< Baseball Pro Status Reached! - MSG_08210_020 = 0x00821020, //!< Bowling Pro Status Reached! - MSG_08210_030 = 0x00821030, //!< Golf Pro Status Reached! - MSG_08210_040 = 0x00821040, //!< Boxing Pro Status Reached! - MSG_08211_000 = 0x00082110, //!< Tennis Pro Status Lost! - MSG_08211_010 = 0x00821110, //!< Baseball Pro Status Lost! - MSG_08211_020 = 0x00821120, //!< Bowling Pro Status Lost! - MSG_08211_030 = 0x00821130, //!< Golf Pro Status Lost! - MSG_08211_040 = 0x00821140, //!< Boxing Pro Status Lost! - MSG_08212_020 = 0x00821220, //!< Bowling\n New Personal Best! - MSG_08212_030 = 0x00821230, //!< Golf\n New Personal Best! - MSG_08213_000 = 0x00082130, //!< Tennis\n Beat the tennis champ! - MSG_08213_010 = 0x00821310, //!< Baseball\n Beat the baseball champ! - MSG_08213_040 = 0x00821340, //!< Boxing\n Beat the boxing champ! - MSG_08220_000 = 0x00082200, //!< Tennis: Target Practice\n New Personal Best! - MSG_08220_001 = 0x00082201, //!< Tennis: Timing Your Swing\n New Personal Best! - MSG_08220_002 = 0x00082202, //!< Tennis: Returning Balls\n New Personal Best! - MSG_08220_010 = 0x00822010, //!< Baseball: Hitting Home Runs\n New Personal Best! - MSG_08220_011 = 0x00822011, //!< Baseball: Swing Control\n New Personal Best! - MSG_08220_012 = 0x00822012, //!< Baseball: Batting Practice\n New Personal Best! - MSG_08220_020 = 0x00822020, //!< Bowling: Picking Up Spares\n New Personal Best! - MSG_08220_021 = 0x00822021, //!< Bowling: Power Throws\n New Personal Best! - MSG_08220_022 = 0x00822022, //!< Bowling: Spin Control\n New Personal Best! - MSG_08220_030 = 0x00822030, //!< Golf: Putting\n New Personal Best! - MSG_08220_031 = 0x00822031, //!< Golf: Hitting the Green\n New Personal Best! - MSG_08220_032 = 0x00822032, //!< Golf: Target Practice\n New Personal Best! - MSG_08220_040 = 0x00822040, //!< Boxing: Working the Bag\n New Personal Best! - MSG_08220_041 = 0x00822041, //!< Boxing: Dodging\n New Personal Best! - MSG_08220_042 = 0x00822042, //!< Boxing: Throwing Punches\n New Personal Best! - MSG_08221_000 = 0x00082210, //!< Tennis: Target Practice\n Earned a platinum medal! - MSG_08221_001 = 0x00082211, //!< Tennis: Target Practice\n Earned a gold medal! - MSG_08221_002 = 0x00082212, //!< Tennis: Target Practice\n Earned a silver medal! - MSG_08221_003 = 0x00082213, //!< Tennis: Target Practice\n Earned a bronze medal! - MSG_08221_004 = 0x00082214, //!< Tennis: Timing Your Swing\n Earned a platinum medal! - MSG_08221_005 = 0x00082215, //!< Tennis: Timing Your Swing\n Earned a gold medal! - MSG_08221_006 = 0x00082216, //!< Tennis: Timing Your Swing\n Earned a silver medal! - MSG_08221_007 = 0x00082217, //!< Tennis: Timing Your Swing\n Earned a bronze medal! - MSG_08221_008 = 0x00082218, //!< Tennis: Returning Balls\n Earned a platinum medal! - MSG_08221_009 = 0x00082219, //!< Tennis: Returning Balls\n Earned a gold medal! - MSG_08221_010 = 0x00822110, //!< Tennis: Returning Balls\n Earned a silver medal! - MSG_08221_011 = 0x00822111, //!< Tennis: Returning Balls\n Earned a bronze medal! - MSG_08221_020 = 0x00822120, //!< Baseball: Hitting Home Runs\n Earned a platinum medal! - MSG_08221_021 = 0x00822121, //!< Baseball: Hitting Home Runs\n Earned a gold medal! - MSG_08221_022 = 0x00822122, //!< Baseball: Hitting Home Runs\n Earned a silver medal! - MSG_08221_023 = 0x00822123, //!< Baseball: Hitting Home Runs\n Earned a bronze medal! - MSG_08221_024 = 0x00822124, //!< Baseball: Swing Control\n Earned a platinum medal! - MSG_08221_025 = 0x00822125, //!< Baseball: Swing Control\n Earned a gold medal! - MSG_08221_026 = 0x00822126, //!< Baseball: Swing Control\n Earned a silver medal! - MSG_08221_027 = 0x00822127, //!< Baseball: Swing Control\n Earned a bronze medal! - MSG_08221_028 = 0x00822128, //!< Baseball: Batting Practice\n Earned a platinum medal! - MSG_08221_029 = 0x00822129, //!< Baseball: Batting Practice\n Earned a gold medal! - MSG_08221_030 = 0x00822130, //!< Baseball: Batting Practice\n Earned a silver medal! - MSG_08221_031 = 0x00822131, //!< Baseball: Batting Practice\n Earned a bronze medal! - MSG_08221_040 = 0x00822140, //!< Bowling: Picking Up Spares\n Earned a platinum medal! - MSG_08221_041 = 0x00822141, //!< Bowling: Picking Up Spares\n Earned a gold medal! - MSG_08221_042 = 0x00822142, //!< Bowling: Picking Up Spares\n Earned a silver medal! - MSG_08221_043 = 0x00822143, //!< Bowling: Picking Up Spares\n Earned a bronze medal! - MSG_08221_044 = 0x00822144, //!< Bowling: Power Throws\n Earned a platinum medal! - MSG_08221_045 = 0x00822145, //!< Bowling: Power Throws\n Earned a gold medal! - MSG_08221_046 = 0x00822146, //!< Bowling: Power Throws\n Earned a silver medal! - MSG_08221_047 = 0x00822147, //!< Bowling: Power Throws\n Earned a bronze medal! - MSG_08221_048 = 0x00822148, //!< Bowling: Spin Control\n Earned a platinum medal! - MSG_08221_049 = 0x00822149, //!< Bowling: Spin Control\n Earned a gold medal! - MSG_08221_050 = 0x00822150, //!< Bowling: Spin Control\n Earned a silver medal! - MSG_08221_051 = 0x00822151, //!< Bowling: Spin Control\n Earned a bronze medal! - MSG_08221_060 = 0x00822160, //!< Golf: Putting \n Earned a platinum medal! - MSG_08221_061 = 0x00822161, //!< Golf: Putting \n Earned a gold medal! - MSG_08221_062 = 0x00822162, //!< Golf: Putting \n Earned a silver medal! - MSG_08221_063 = 0x00822163, //!< Golf: Putting \n Earned a bronze medal! - MSG_08221_064 = 0x00822164, //!< Golf: Hitting the Green\n Earned a platinum medal! - MSG_08221_065 = 0x00822165, //!< Golf: Hitting the Green\n Earned a gold medal! - MSG_08221_066 = 0x00822166, //!< Golf: Hitting the Green\n Earned a silver medal! - MSG_08221_067 = 0x00822167, //!< Golf: Hitting the Green\n Earned a bronze medal! - MSG_08221_068 = 0x00822168, //!< Golf: Target Practice\n Earned a platinum medal! - MSG_08221_069 = 0x00822169, //!< Golf: Target Practice\n Earned a gold medal! - MSG_08221_070 = 0x00822170, //!< Golf: Target Practice\n Earned a silver medal! - MSG_08221_071 = 0x00822171, //!< Golf: Target Practice\n Earned a bronze medal! - MSG_08221_080 = 0x00822180, //!< Boxing: Working the Bag\n Earned a platinum medal! - MSG_08221_081 = 0x00822181, //!< Boxing: Working the Bag\n Earned a gold medal! - MSG_08221_082 = 0x00822182, //!< Boxing: Working the Bag\n Earned a silver medal! - MSG_08221_083 = 0x00822183, //!< Boxing: Working the Bag\n Earned a bronze medal! - MSG_08221_084 = 0x00822184, //!< Boxing: Dodging\n Earned a platinum medal! - MSG_08221_085 = 0x00822185, //!< Boxing: Dodging\n Earned a gold medal! - MSG_08221_086 = 0x00822186, //!< Boxing: Dodging\n Earned a silver medal! - MSG_08221_087 = 0x00822187, //!< Boxing: Dodging\n Earned a bronze medal! - MSG_08221_088 = 0x00822188, //!< Boxing: Throwing Punches\n Earned a platinum medal! - MSG_08221_089 = 0x00822189, //!< Boxing: Throwing Punches\n Earned a gold medal! - MSG_08221_090 = 0x00822190, //!< Boxing: Throwing Punches\n Earned a silver medal! - MSG_08221_091 = 0x00822191, //!< Boxing: Throwing Punches\n Earned a bronze medal! - MSG_08300_000 = 0x00083000, //!< The following player has been\nadded to the player list:\n{000001}{000000}\n\nIf you erase this Mii from the\nMii Channel, it will be deleted\nfrom your player list, so be\ncareful. - MSG_08310_000 = 0x00083100, //!< The following player has become\na tennis pro:\n{000001}{000000} - MSG_08310_010 = 0x00831010, //!< The following player has become\na baseball pro:\n{000001}{000000} - MSG_08310_020 = 0x00831020, //!< The following player has become\na bowling pro:\n{000001}{000000} - MSG_08310_030 = 0x00831030, //!< The following player has become\na golf pro:\n{000001}{000000} - MSG_08310_040 = 0x00831040, //!< The following player has become\na boxing pro:\n{000001}{000000} - MSG_08311_000 = 0x00083110, //!< The following player has lost\nthe title of tennis pro:\n{000001}{000000} - MSG_08311_010 = 0x00831110, //!< The following player has lost\nthe title of baseball pro:\n{000001}{000000} - MSG_08311_020 = 0x00831120, //!< The following player has lost\nthe title of bowling pro:\n{000001}{000000} - MSG_08311_030 = 0x00831130, //!< The following player has lost\nthe title of golf pro:\n{000001}{000000} - MSG_08311_040 = 0x00831140, //!< The following player has lost\nthe title of boxing pro:\n{000001}{000000} - MSG_08312_020 = 0x00831220, //!< The following player has set a\nnew personal best in bowling:\n{000001}{000000} - MSG_08312_030 = 0x00831230, //!< The following player has set a\nnew personal best in three-hole\ngolf at the beginner level:\n{000001}{000000} - MSG_08312_031 = 0x00831231, //!< The following player has set a\nnew personal best in three-hole\ngolf at the intermediate level:\n{000001}{000000} - MSG_08312_032 = 0x00831232, //!< The following player has set a\nnew personal best in three-hole\ngolf at the expert level:\n{000001}{000000} - MSG_08312_033 = 0x00831233, //!< The following player has set a\nnew personal best in nine-hole\ngolf:\n{000001}{000000} - MSG_08313_000 = 0x00083130, //!< {000001}{000000} beat\ntennis pro {000000}. - MSG_08313_010 = 0x00831310, //!< {000001}{000000} beat\nbaseball pro {000000}. - MSG_08313_040 = 0x00831340, //!< {000001}{000000} beat\nboxing pro {000000}. - MSG_08314_030 = 0x00831430, //!< The following player hit a hole\nin one on the first hole in golf:\n{000001}{000000} - MSG_08314_031 = 0x00831431, //!< The following player hit a hole\nin one on the second hole in\ngolf:\n{000001}{000000} - MSG_08314_032 = 0x00831432, //!< The following player hit a hole\nin one on the third hole in\ngolf:\n{000001}{000000} - MSG_08314_033 = 0x00831433, //!< The following player hit a hole\nin one on the fourth hole in\ngolf:\n{000001}{000000} - MSG_08314_034 = 0x00831434, //!< The following player hit a hole\nin one on the fifth hole in\ngolf:\n{000001}{000000} - MSG_08314_035 = 0x00831435, //!< The following player hit a hole\nin one on the sixth hole in\ngolf:\n{000001}{000000} - MSG_08314_036 = 0x00831436, //!< The following player hit a hole\nin one on the seventh hole in\ngolf:\n{000001}{000000} - MSG_08314_037 = 0x00831437, //!< The following player hit a hole\nin one on the eighth hole in\ngolf:\n{000001}{000000} - MSG_08314_038 = 0x00831438, //!< The following player hit a hole\nin one on the nine hole in golf:\n{000001}{000000} - MSG_08314_050 = 0x00831450, //!< {000001}{000000} bowled\na perfect game. - MSG_08319_000 = 0x00083190, //!< Score: {000000} ⇒ {000000} - MSG_08320_000 = 0x00083200, //!< The following player has set a\nnew personal best in Tennis:\nTarget Practice:\n{000001}{000000} - MSG_08320_001 = 0x00083201, //!< The following player has set a\nnew personal best in Tennis:\nTiming Your Swing:\n{000001}{000000} - MSG_08320_002 = 0x00083202, //!< The following player has set a\nnew personal best in Tennis:\nReturning Balls:\n{000001}{000000} - MSG_08320_010 = 0x00832010, //!< The following player has set a\nnew personal best in Baseball:\nHitting Home Runs:\n{000001}{000000} - MSG_08320_011 = 0x00832011, //!< The following player has set a\nnew personal best in Baseball:\nSwing Control:\n{000001}{000000} - MSG_08320_012 = 0x00832012, //!< The following player has set a\nnew personal best in Baseball:\nBatting Practice:\n{000001}{000000} - MSG_08320_020 = 0x00832020, //!< The following player has set a\nnew personal best in Bowling:\nPicking Up Spares:\n{000001}{000000} - MSG_08320_021 = 0x00832021, //!< The following player has set a\nnew personal best in Bowling:\nPower Throws:\n{000001}{000000} - MSG_08320_022 = 0x00832022, //!< The following player has set a\nnew personal best in Bowling:\nSpin Control:\n{000001}{000000} - MSG_08320_030 = 0x00832030, //!< The following player has set a\nnew personal best in Golf:\nPutting:\n{000001}{000000} - MSG_08320_031 = 0x00832031, //!< The following player has set a\nnew personal best in Golf:\nHitting the Green:\n{000001}{000000} - MSG_08320_032 = 0x00832032, //!< The following player has set a\nnew personal best in Golf:\nTarget Practice:\n{000001}{000000} - MSG_08320_040 = 0x00832040, //!< The following player has set a\nnew personal best in Boxing:\nWorking the Bag:\n{000001}{000000} - MSG_08320_041 = 0x00832041, //!< The following player has set a\nnew personal best in Boxing:\nDodging:\n{000001}{000000} - MSG_08320_042 = 0x00832042, //!< The following player has set a\nnew personal best in Boxing:\nThrowing Punches:\n{000001}{000000} - MSG_08321_000 = 0x00083210, //!< The following player has earned\na platinum medal in Tennis:\nTarget Practice:\n{000001}{000000} - MSG_08321_001 = 0x00083211, //!< The following player has earned\na gold medal in Tennis:\nTarget Practice:\n{000001}{000000} - MSG_08321_002 = 0x00083212, //!< The following player has earned\na silver medal in Tennis:\nTarget Practice:\n{000001}{000000} - MSG_08321_003 = 0x00083213, //!< The following player has earned\na bronze medal in Tennis:\nTarget Practice:\n{000001}{000000} - MSG_08321_004 = 0x00083214, //!< The following player has earned\na platinum medal in Tennis:\nTiming Your Swing:\n{000001}{000000} - MSG_08321_005 = 0x00083215, //!< The following player has earned\na gold medal in Tennis:\nTiming Your Swing:\n{000001}{000000} - MSG_08321_006 = 0x00083216, //!< The following player has earned\na silver medal in Tennis:\nTiming Your Swing:\n{000001}{000000} - MSG_08321_007 = 0x00083217, //!< The following player has earned\na bronze medal in Tennis:\nTiming Your Swing:\n{000001}{000000} - MSG_08321_008 = 0x00083218, //!< The following player has earned\na platinum medal in Tennis:\nReturning Balls:\n{000001}{000000} - MSG_08321_009 = 0x00083219, //!< The following player has earned\na gold medal in Tennis:\nReturning Balls:\n{000001}{000000} - MSG_08321_010 = 0x00832110, //!< The following player has earned\na silver medal in Tennis:\nReturning Balls:\n{000001}{000000} - MSG_08321_011 = 0x00832111, //!< The following player has earned\na bronze medal in Tennis:\nReturning Balls:\n{000001}{000000} - MSG_08321_020 = 0x00832120, //!< The following player has earned\na platinum medal in Baseball:\nHitting Home Runs:\n{000001}{000000} - MSG_08321_021 = 0x00832121, //!< The following player has earned\na gold medal in Baseball:\nHitting Home Runs:\n{000001}{000000} - MSG_08321_022 = 0x00832122, //!< The following player has earned\na silver medal in Baseball:\nHitting Home Runs:\n{000001}{000000} - MSG_08321_023 = 0x00832123, //!< The following player has earned\na bronze medal in Baseball:\nHitting Home Runs:\n{000001}{000000} - MSG_08321_024 = 0x00832124, //!< The following player has earned\na platinum medal in Baseball:\nSwing Control:\n{000001}{000000} - MSG_08321_025 = 0x00832125, //!< The following player has earned\na gold medal in Baseball:\nSwing Control:\n{000001}{000000} - MSG_08321_026 = 0x00832126, //!< The following player has earned\na silver medal in Baseball:\nSwing Control:\n{000001}{000000} - MSG_08321_027 = 0x00832127, //!< The following player has earned\na bronze medal in Baseball:\nSwing Control:\n{000001}{000000} - MSG_08321_028 = 0x00832128, //!< The following player has earned\na platinum medal in Baseball:\nBatting Practice:\n{000001}{000000} - MSG_08321_029 = 0x00832129, //!< The following player has earned\na gold medal in Baseball:\nBatting Practice:\n{000001}{000000} - MSG_08321_030 = 0x00832130, //!< The following player has earned\na silver medal in Baseball:\nBatting Practice:\n{000001}{000000} - MSG_08321_031 = 0x00832131, //!< The following player has earned\na bronze medal in Baseball:\nBatting Practice:\n{000001}{000000} - MSG_08321_040 = 0x00832140, //!< The following player has earned\na platinum medal in Bowling:\nPicking Up Spares:\n{000001}{000000} - MSG_08321_041 = 0x00832141, //!< The following player has earned\na gold medal in Bowling:\nPicking Up Spares:\n{000001}{000000} - MSG_08321_042 = 0x00832142, //!< The following player has earned\na silver medal in Bowling:\nPicking Up Spares:\n{000001}{000000} - MSG_08321_043 = 0x00832143, //!< The following player has earned\na bronze medal in Bowling:\nPicking Up Spares:\n{000001}{000000} - MSG_08321_044 = 0x00832144, //!< The following player has earned\na platinum medal in Bowling:\nPower Throws:\n{000001}{000000} - MSG_08321_045 = 0x00832145, //!< The following player has earned\na gold medal in Bowling:\nPower Throws:\n{000001}{000000} - MSG_08321_046 = 0x00832146, //!< The following player has earned\na silver medal in Bowling:\nPower Throws:\n{000001}{000000} - MSG_08321_047 = 0x00832147, //!< The following player has earned\na bronze medal in Bowling:\nPower Throws:\n{000001}{000000} - MSG_08321_048 = 0x00832148, //!< The following player has earned\na platinum medal in Bowling:\nSpin Control:\n{000001}{000000} - MSG_08321_049 = 0x00832149, //!< The following player has earned\na gold medal in Bowling:\nSpin Control:\n{000001}{000000} - MSG_08321_050 = 0x00832150, //!< The following player has earned\na silver medal in Bowling:\nSpin Control:\n{000001}{000000} - MSG_08321_051 = 0x00832151, //!< The following player has earned\na bronze medal in Bowling:\nSpin Control:\n{000001}{000000} - MSG_08321_060 = 0x00832160, //!< The following player has earned\na platinum medal in Golf:\nPutting:\n{000001}{000000} - MSG_08321_061 = 0x00832161, //!< The following player has earned\na gold medal in Golf:\nPutting:\n{000001}{000000} - MSG_08321_062 = 0x00832162, //!< The following player has earned\na silver medal in Golf:\nPutting:\n{000001}{000000} - MSG_08321_063 = 0x00832163, //!< The following player has earned\na bronze medal in Golf:\nPutting:\n{000001}{000000} - MSG_08321_064 = 0x00832164, //!< The following player has earned\na platinum medal in Golf:\nHitting the Green:\n{000001}{000000} - MSG_08321_065 = 0x00832165, //!< The following player has earned\na gold medal in Golf:\nHitting the Green:\n{000001}{000000} - MSG_08321_066 = 0x00832166, //!< The following player has earned\na silver medal in Golf:\nHitting the Green:\n{000001}{000000} - MSG_08321_067 = 0x00832167, //!< The following player has earned\na bronze medal in Golf:\nHitting the Green:\n{000001}{000000} - MSG_08321_068 = 0x00832168, //!< The following player has earned\na platinum medal in Golf:\nTarget Practice:\n{000001}{000000} - MSG_08321_069 = 0x00832169, //!< The following player has earned\na gold medal in Golf:\nTarget Practice:\n{000001}{000000} - MSG_08321_070 = 0x00832170, //!< The following player has earned\na silver medal in Golf:\nTarget Practice:\n{000001}{000000} - MSG_08321_071 = 0x00832171, //!< The following player has earned\na bronze medal in Golf:\nTarget Practice:\n{000001}{000000} - MSG_08321_080 = 0x00832180, //!< The following player has earned\na platinum medal in Boxing:\nWorking the Bag:\n{000001}{000000} - MSG_08321_081 = 0x00832181, //!< The following player has earned\na gold medal in Boxing:\nWorking the Bag:\n{000001}{000000} - MSG_08321_082 = 0x00832182, //!< The following player has earned\na silver medal in Boxing:\nWorking the Bag:\n{000001}{000000} - MSG_08321_083 = 0x00832183, //!< The following player has earned\na bronze medal in Boxing:\nWorking the Bag:\n{000001}{000000} - MSG_08321_084 = 0x00832184, //!< The following player has earned\na platinum medal in Boxing:\nDodging:\n{000001}{000000} - MSG_08321_085 = 0x00832185, //!< The following player has earned\na gold medal in Boxing:\nDodging:\n{000001}{000000} - MSG_08321_086 = 0x00832186, //!< The following player has earned\na silver medal in Boxing:\nDodging:\n{000001}{000000} - MSG_08321_087 = 0x00832187, //!< The following player has earned\na bronze medal in Boxing:\nDodging:\n{000001}{000000} - MSG_08321_088 = 0x00832188, //!< The following player has earned\na platinum medal in Boxing:\nThrowing Punches:\n{000001}{000000} - MSG_08321_089 = 0x00832189, //!< The following player has earned\na gold medal in Boxing:\nThrowing Punches:\n{000001}{000000} - MSG_08321_090 = 0x00832190, //!< The following player has earned\na silver medal in Boxing:\nThrowing Punches:\n{000001}{000000} - MSG_08321_091 = 0x00832191, //!< The following player has earned\na bronze medal in Boxing:\nThrowing Punches:\n{000001}{000000} - MSG_08329_000 = 0x00083290, //!< Score: {000000} ⇒ {000000} - MSG_08329_001 = 0x00083291, //!< Score:\n{000000} {000000} ({000000} {000000})\n⇒ {000000} {000000} ({000000} {000000}) - MSG_08329_002 = 0x00083292, //!< Score: {000000} ft ⇒ {000000} ft - MSG_08330_000 = 0x00083300, //!< The following player has earned\ngold medals in all training\ngames:\n{000001}{000000} - MSG_08331_000 = 0x00083310, //!< The following player has earned\nplatinum medals in all training\ngames:\n{000001}{000000} - MSG_08340_000 = 0x00083400, //!< Today's Wii Fitness results for\n{000001}{000000}: - MSG_08341_000 = 0x00083410, //!<        {000000} - MSG_08342_000 = 0x00083420, //!< Wow! You've taken off {000000} {000000}! - MSG_08342_001 = 0x00083421, //!< Wow! You've taken off {000000} {000000}! - MSG_08342_002 = 0x00083422, //!< Oh, no! You've added {000000} {000000}! - MSG_08342_003 = 0x00083423, //!< Oh, no! You've added {000000} {000000}! - MSG_08510_000 = 0x00085100, //!< Tennis Info - MSG_08510_005 = 0x00085105, //!< Skill level\n {000000} - MSG_08510_006 = 0x00085106, //!< Debuted on\n {000000} - MSG_08510_007 = 0x00085107, //!< Games played\n {000000} {000000} - MSG_08510_010 = 0x00851010, //!< Baseball Info - MSG_08510_015 = 0x00851015, //!< Skill level\n {000000} - MSG_08510_016 = 0x00851016, //!< Debuted on\n {000000} - MSG_08510_017 = 0x00851017, //!< Games played\n {000000} - MSG_08510_020 = 0x00851020, //!< Bowling Info - MSG_08510_025 = 0x00851025, //!< Skill level\n {000000} - MSG_08510_026 = 0x00851026, //!< Debuted on\n {000000} - MSG_08510_027 = 0x00851027, //!< Games played\n {000000} - MSG_08510_030 = 0x00851030, //!< Golf Info - MSG_08510_035 = 0x00851035, //!< Skill level\n {000000} - MSG_08510_036 = 0x00851036, //!< Debuted on\n {000000} - MSG_08510_037 = 0x00851037, //!< Games played\n {000000} {000000} - MSG_08510_040 = 0x00851040, //!< Boxing Info - MSG_08510_045 = 0x00851045, //!< Skill level\n {000000} - MSG_08510_046 = 0x00851046, //!< Debuted on\n {000000} - MSG_08510_047 = 0x00851047, //!< Matches fought\n {000000} - MSG_08511_000 = 0x00085110, //!< Tennis Info - MSG_08511_005 = 0x00085115, //!< Skill level\n {000000} - MSG_08511_006 = 0x00085116, //!< Debuted on\n {000000} - MSG_08511_007 = 0x00085117, //!< Games played\n {000000} {000000} - MSG_08511_010 = 0x00851110, //!< Baseball Info - MSG_08511_015 = 0x00851115, //!< Skill level\n {000000} - MSG_08511_016 = 0x00851116, //!< Debuted on\n {000000} - MSG_08511_017 = 0x00851117, //!< Games played\n {000000} - MSG_08511_020 = 0x00851120, //!< Bowling Info - MSG_08511_025 = 0x00851125, //!< Skill level\n {000000} - MSG_08511_026 = 0x00851126, //!< Debuted on\n {000000} - MSG_08511_027 = 0x00851127, //!< Games played\n {000000} - MSG_08511_030 = 0x00851130, //!< Golf Info - MSG_08511_035 = 0x00851135, //!< Skill level\n {000000} - MSG_08511_036 = 0x00851136, //!< Debuted on\n {000000} - MSG_08511_037 = 0x00851137, //!< Games played\n {000000} {000000} - MSG_08511_040 = 0x00851140, //!< Boxing Info - MSG_08511_045 = 0x00851145, //!< Skill level\n {000000} - MSG_08511_046 = 0x00851146, //!< Debuted on\n {000000} - MSG_08511_047 = 0x00851147, //!< Matches fought\n {000000} - MSG_08512_020 = 0x00851220, //!< Bowling Info - MSG_08512_025 = 0x00851225, //!< Skill level\n {000000} - MSG_08512_026 = 0x00851226, //!< Debuted on\n {000000} - MSG_08512_027 = 0x00851227, //!< Games played\n {000000} - MSG_08512_030 = 0x00851230, //!< Golf Info - MSG_08512_035 = 0x00851235, //!< Skill level\n {000000} - MSG_08512_036 = 0x00851236, //!< Debuted on\n {000000} - MSG_08512_037 = 0x00851237, //!< Games played\n {000000} {000000} - MSG_08513_000 = 0x00085130, //!< Tennis Info - MSG_08513_005 = 0x00085135, //!< Skill level\n {000000} - MSG_08513_006 = 0x00085136, //!< Debuted on\n {000000} - MSG_08513_007 = 0x00085137, //!< Matches played\n {000000} - MSG_08513_010 = 0x00851310, //!< Baseball Info - MSG_08513_040 = 0x00851340, //!< Boxing Info - MSG_08514_000 = 0x00085140, //!< Holes in one: {000000} - MSG_08514_001 = 0x00085141, //!< Perfect games: {000000} - MSG_08520_000 = 0x00085200, //!< Training Info - MSG_08520_001 = 0x00085201, //!< Medal earned\n Platinum - MSG_08520_002 = 0x00085202, //!< Medal earned\n Gold - MSG_08520_003 = 0x00085203, //!< Medal earned\n Silver - MSG_08520_004 = 0x00085204, //!< Medal earned\n Bronze - MSG_08520_005 = 0x00085205, //!< Began training on\n {000000} - MSG_08520_006 = 0x00085206, //!< Total training sessions\n {000000} - MSG_08521_000 = 0x00085210, //!< Training Info - MSG_08521_001 = 0x00085211, //!< Personal best\n {000000} - MSG_08521_002 = 0x00085212, //!< Personal best\n {000000} {000000} ({000000} {000000}) - MSG_08521_003 = 0x00085213, //!< Personal best\n {000000} ft - MSG_08521_005 = 0x00085215, //!< Began training on\n {000000} - MSG_08521_006 = 0x00085216, //!< Total training sessions\n {000000} - MSG_08530_000 = 0x00085300, //!< Wii Fitness Info - MSG_08530_001 = 0x00085301, //!< Date of this Wii Fitness test:\n {000000} - MSG_08530_002 = 0x00085302, //!< Date of first Wii Fitness test:\n {000000} - MSG_08530_003 = 0x00085303, //!< Total tests completed:\n {000000} - MSG_08530_004 = 0x00085304, //!< Wii Fitness\n\nMeasure your skill in Wii\nSports. Your test results appear\nas a Wii Fitness Age, with 20\nbeing the best possible age.\n\nBecause these tests are designed\nfor adults, children may not\nget accurate test results. - MSG_08900_000 = 0x00089000, //!< Wii Sports News\n - MSG_08901_000 = 0x00089010, //!< {000000} - MSG_08902_000 = 0x00089020, //!< - MSG_08903_000 = 0x00089030, //!< 【PRO】 - MSG_08910_000 = 0x00089100, //!< - MSG_08910_001 = 0x00089101, //!< - MSG_08911_000 = 0x00089110, //!< set - MSG_08911_001 = 0x00089111, //!< sets - MSG_08912_000 = 0x00089120, //!< hole - MSG_08912_001 = 0x00089121, //!< holes - MSG_08913_000 = 0x00089130, //!< homer - MSG_08913_001 = 0x00089131, //!< homers - MSG_08914_000 = 0x00089140, //!< ft - MSG_08915_000 = 0x00089150, //!< - MSG_08916_000 = 0x00089160, //!< years - MSG_08916_001 = 0x00089161, //!< year - MSG_09999_000 = 0x00099990, //!< - MSG_19000_000 = 0x00190000, //!< Saburo - MSG_19000_001 = 0x00190001, //!< Hiroshi - MSG_19000_002 = 0x00190002, //!< Daisuke - MSG_19000_003 = 0x00190003, //!< Shinnosuke - MSG_19000_004 = 0x00190004, //!< Akira - MSG_19000_005 = 0x00190005, //!< Tatsuaki - MSG_19000_006 = 0x00190006, //!< Shouta - MSG_19000_007 = 0x00190007, //!< Ren - MSG_19000_008 = 0x00190008, //!< Kentaro - MSG_19000_009 = 0x00190009, //!< Takumi - MSG_19000_010 = 0x01900010, //!< Haru - MSG_19000_011 = 0x01900011, //!< Yoshi - MSG_19000_012 = 0x01900012, //!< Fumiko - MSG_19000_013 = 0x01900013, //!< Keiko - MSG_19000_014 = 0x01900014, //!< Yoko - MSG_19000_015 = 0x01900015, //!< Miyu - MSG_19000_016 = 0x01900016, //!< Ai - MSG_19000_017 = 0x01900017, //!< Misaki - MSG_19000_018 = 0x01900018, //!< Rin - MSG_19000_019 = 0x01900019, //!< Sakura - MSG_19000_020 = 0x01900020, //!< Andy - MSG_19000_021 = 0x01900021, //!< Chris - MSG_19000_022 = 0x01900022, //!< Ryan - MSG_19000_023 = 0x01900023, //!< Jake - MSG_19000_024 = 0x01900024, //!< Matt - MSG_19000_025 = 0x01900025, //!< Mike - MSG_19000_026 = 0x01900026, //!< Nick - MSG_19000_027 = 0x01900027, //!< Oscar - MSG_19000_028 = 0x01900028, //!< Theo - MSG_19000_029 = 0x01900029, //!< Tyrone - MSG_19000_030 = 0x01900030, //!< Abby - MSG_19000_031 = 0x01900031, //!< Ashley - MSG_19000_032 = 0x01900032, //!< Emily - MSG_19000_033 = 0x01900033, //!< Hayley - MSG_19000_034 = 0x01900034, //!< Jackie - MSG_19000_035 = 0x01900035, //!< Jessie - MSG_19000_036 = 0x01900036, //!< Maria - MSG_19000_037 = 0x01900037, //!< Naomi - MSG_19000_038 = 0x01900038, //!< Rachel - MSG_19000_039 = 0x01900039, //!< Steph - MSG_19000_040 = 0x01900040, //!< James - MSG_19000_041 = 0x01900041, //!< Steve - MSG_19000_042 = 0x01900042, //!< Michael - MSG_19000_043 = 0x01900043, //!< Martin - MSG_19000_044 = 0x01900044, //!< Pierre - MSG_19000_045 = 0x01900045, //!< Alex - MSG_19000_046 = 0x01900046, //!< Luca - MSG_19000_047 = 0x01900047, //!< Marco - MSG_19000_048 = 0x01900048, //!< David - MSG_19000_049 = 0x01900049, //!< Víctor - MSG_19000_050 = 0x01900050, //!< Sarah - MSG_19000_051 = 0x01900051, //!< Helen - MSG_19000_052 = 0x01900052, //!< Kathrin - MSG_19000_053 = 0x01900053, //!< Silke - MSG_19000_054 = 0x01900054, //!< Emma - MSG_19000_055 = 0x01900055, //!< Julie - MSG_19000_056 = 0x01900056, //!< Anna - MSG_19000_057 = 0x01900057, //!< Elisa - MSG_19000_058 = 0x01900058, //!< Eva - MSG_19000_059 = 0x01900059, //!< Lucía - MSG_20000_000 = 0x00200000, //!< - MSG_20000_001 = 0x00200001, //!< - MSG_20000_002 = 0x00200002, //!< - MSG_20001_000 = 0x00200010, //!< - MSG_20001_001 = 0x00200011, //!< - MSG_20001_002 = 0x00200012, //!< - MSG_20001_003 = 0x00200013, //!< - MSG_20002_000 = 0x00200020, //!< - MSG_20010_000 = 0x00200100, //!< - MSG_20010_001 = 0x00200101, //!< - MSG_20020_000 = 0x00200200, //!< - MSG_20020_001 = 0x00200201, //!< - MSG_20020_002 = 0x00200202, //!< - MSG_20020_003 = 0x00200203, //!< - MSG_20020_004 = 0x00200204, //!< - MSG_20020_005 = 0x00200205, //!< - MSG_20020_006 = 0x00200206, //!< - MSG_20021_000 = 0x00200210, //!< - MSG_20021_001 = 0x00200211, //!< - MSG_20021_002 = 0x00200212, //!< - MSG_20021_003 = 0x00200213, //!< - MSG_20021_004 = 0x00200214, //!< - MSG_20021_005 = 0x00200215, //!< - MSG_20021_006 = 0x00200216, //!< - MSG_20021_007 = 0x00200217, //!< - MSG_20021_008 = 0x00200218, //!< - MSG_20021_009 = 0x00200219, //!< - MSG_20021_010 = 0x02002110, //!< - MSG_20021_011 = 0x02002111, //!< - MSG_20022_000 = 0x00200220, //!< - MSG_20022_001 = 0x00200221, //!< - MSG_20022_002 = 0x00200222, //!< - MSG_20022_003 = 0x00200223, //!< - MSG_20030_000 = 0x00200300, //!< - MSG_20030_001 = 0x00200301, //!< - MSG_20030_002 = 0x00200302, //!< - MSG_20030_003 = 0x00200303, //!< - MSG_20030_004 = 0x00200304, //!< - MSG_20030_005 = 0x00200305, //!< - MSG_20030_006 = 0x00200306, //!< - MSG_20030_007 = 0x00200307, //!< - MSG_20031_000 = 0x00200310, //!< - MSG_20031_001 = 0x00200311, //!< - MSG_20031_002 = 0x00200312, //!< - MSG_20031_003 = 0x00200313, //!< - MSG_20031_004 = 0x00200314, //!< - MSG_20040_000 = 0x00200400, //!< - MSG_20050_000 = 0x00200500, //!< - MSG_20051_000 = 0x00200510, //!< - MSG_20060_000 = 0x00200600, //!< - MSG_20061_000 = 0x00200610, //!< - MSG_20061_001 = 0x00200611, //!< - MSG_20061_002 = 0x00200612, //!< - MSG_20062_000 = 0x00200620, //!< - MSG_20063_000 = 0x00200630, //!< - MSG_20063_001 = 0x00200631, //!< - MSG_20063_002 = 0x00200632, //!< - MSG_20063_003 = 0x00200633, //!< - MSG_20063_004 = 0x00200634, //!< - MSG_20064_000 = 0x00200640, //!< - MSG_20070_000 = 0x00200700, //!< - MSG_20071_000 = 0x00200710, //!< - MSG_20072_000 = 0x00200720, //!< - MSG_20080_000 = 0x00200800, //!< - MSG_20080_001 = 0x00200801, //!< - MSG_21000_000 = 0x00210000, //!< - MSG_21010_000 = 0x00210100, //!< - MSG_21010_001 = 0x00210101, //!< - MSG_21010_002 = 0x00210102, //!< - MSG_21010_003 = 0x00210103, //!< - MSG_21010_004 = 0x00210104, //!< - MSG_21011_000 = 0x00210110, //!< - MSG_21011_001 = 0x00210111, //!< - MSG_21020_000 = 0x00210200, //!< - MSG_21020_001 = 0x00210201, //!< - MSG_21020_002 = 0x00210202, //!< - MSG_21030_000 = 0x00210300, //!< - MSG_21100_000 = 0x00211000, //!< Server - MSG_21110_000 = 0x00211100, //!< Miss - MSG_21120_000 = 0x00211200, //!< Let - MSG_21120_001 = 0x00211201, //!< Out - MSG_21120_002 = 0x00211202, //!< Miss - MSG_21120_003 = 0x00211203, //!< 2nd Bounce - MSG_21130_000 = 0x00211300, //!< 00 - MSG_21130_001 = 0x00211301, //!< 15 - MSG_21130_002 = 0x00211302, //!< 30 - MSG_21130_003 = 0x00211303, //!< 40 - MSG_21130_004 = 0x00211304, //!< Adv. - MSG_21131_000 = 0x00211310, //!< - - MSG_21132_000 = 0x00211320, //!< Deuce - MSG_21132_001 = 0x00211321, //!< Game - MSG_21140_000 = 0x00211400, //!< Advantage - MSG_21141_000 = 0x00211410, //!< Deuce - MSG_21141_001 = 0x00211411, //!< Game Point - MSG_21141_002 = 0x00211412, //!< Break Point - MSG_21141_003 = 0x00211413, //!< Match Point - MSG_21150_000 = 0x00211500, //!< {000001} - MSG_21200_000 = 0x00212000, //!< Choose positions and press \uE042. - MSG_21210_000 = 0x00212100, //!< Single Game - MSG_21211_000 = 0x00212110, //!< Best of 3 - MSG_21212_000 = 0x00212120, //!< Best of 5 - MSG_21220_000 = 0x00212200, //!< Start - MSG_21230_000 = 0x00212300, //!< {000001}{000000}\nSkill Level: {000000} - MSG_21240_000 = 0x00212400, //!< ? - MSG_21300_000 = 0x00213000, //!< {000000} - MSG_21310_000 = 0x00213100, //!< pt - MSG_21310_001 = 0x00213101, //!< pts - MSG_21500_000 = 0x00215000, //!< {000000} - MSG_21510_000 = 0x00215100, //!< Targets left - MSG_21520_000 = 0x00215200, //!< Balls left - MSG_22000_000 = 0x00220000, //!< - MSG_22000_001 = 0x00220001, //!< - MSG_22001_000 = 0x00220010, //!< - MSG_22001_001 = 0x00220011, //!< - MSG_22001_002 = 0x00220012, //!< - MSG_22001_003 = 0x00220013, //!< - MSG_22010_000 = 0x00220100, //!< - MSG_22010_001 = 0x00220101, //!< - MSG_22010_002 = 0x00220102, //!< - MSG_22010_003 = 0x00220103, //!< - MSG_22010_004 = 0x00220104, //!< - MSG_22010_005 = 0x00220105, //!< - MSG_22010_006 = 0x00220106, //!< - MSG_22010_007 = 0x00220107, //!< - MSG_22010_008 = 0x00220108, //!< - MSG_22011_000 = 0x00220110, //!< - MSG_22011_001 = 0x00220111, //!< - MSG_22011_002 = 0x00220112, //!< - MSG_22100_000 = 0x00221000, //!< Play Ball! - MSG_22101_000 = 0x00221010, //!< Mercy Rule - MSG_22110_000 = 0x00221100, //!< Strike - MSG_22110_001 = 0x00221101, //!< Ball - MSG_22110_002 = 0x00221102, //!< Ball Four - MSG_22110_003 = 0x00221103, //!< Strikeout - MSG_22120_000 = 0x00221200, //!< Foul Ball - MSG_22120_001 = 0x00221201, //!< Single - MSG_22120_002 = 0x00221202, //!< Double - MSG_22120_003 = 0x00221203, //!< Triple - MSG_22120_004 = 0x00221204, //!< Home Run - MSG_22120_005 = 0x00221205, //!< Out of the Park - MSG_22130_000 = 0x00221300, //!< Out - MSG_22130_001 = 0x00221301, //!< Double Play - MSG_22130_002 = 0x00221302, //!< Error - MSG_22130_003 = 0x00221303, //!< Change - MSG_22130_004 = 0x00221304, //!< Mercy Rule - MSG_22140_000 = 0x00221400, //!< Fastball - MSG_22140_001 = 0x00221401, //!< Curveball - MSG_22140_002 = 0x00221402, //!< Screwball - MSG_22140_003 = 0x00221403, //!< Splitter - MSG_22150_000 = 0x00221500, //!< mph - MSG_22151_000 = 0x00221510, //!< ft - MSG_22151_001 = 0x00221511, //!< ft - MSG_22160_000 = 0x00221600, //!< 1ST - MSG_22160_001 = 0x00221601, //!< 2ND - MSG_22160_002 = 0x00221602, //!< 3RD - MSG_22170_000 = 0x00221700, //!< - MSG_22180_000 = 0x00221800, //!< - MSG_22180_001 = 0x00221801, //!< - MSG_22180_002 = 0x00221802, //!< - MSG_22190_000 = 0x00221900, //!< Vs. - MSG_22191_000 = 0x00221910, //!< 1 - MSG_22191_001 = 0x00221911, //!< 2 - MSG_22191_002 = 0x00221912, //!< 3 - MSG_22191_003 = 0x00221913, //!< R - MSG_22192_000 = 0x00221920, //!< B - MSG_22192_001 = 0x00221921, //!< S - MSG_22193_002 = 0x00221932, //!< O - MSG_22200_000 = 0x00222000, //!< {000001} - MSG_22201_000 = 0x00222010, //!< - MSG_22210_000 = 0x00222100, //!< Strikeout - MSG_22210_001 = 0x00222101, //!< Ball Four - MSG_22210_002 = 0x00222102, //!< Out - MSG_22210_003 = 0x00222103, //!< Single - MSG_22210_004 = 0x00222104, //!< Double - MSG_22210_005 = 0x00222105, //!< Triple - MSG_22210_006 = 0x00222106, //!< Home Run - MSG_22210_007 = 0x00222107, //!< Out of the Park - MSG_22210_008 = 0x00222108, //!< - MSG_22220_000 = 0x00222200, //!< - MSG_22220_001 = 0x00222201, //!< - MSG_22220_002 = 0x00222202, //!< - MSG_22230_000 = 0x00222300, //!< That's the Game! - MSG_22240_000 = 0x00222400, //!< R - MSG_22250_000 = 0x00222500, //!< Play again - MSG_22251_000 = 0x00222510, //!< Quit - MSG_22252_000 = 0x00222520, //!< Next - MSG_22300_000 = 0x00223000, //!< - MSG_22301_000 = 0x00223010, //!< - MSG_22350_000 = 0x00223500, //!< - MSG_22400_000 = 0x00224000, //!< 10 balls - MSG_22400_001 = 0x00224001, //!< 30 balls - MSG_22410_000 = 0x00224100, //!< You swung too early! - MSG_22410_001 = 0x00224101, //!< You're a tad early! - MSG_22410_002 = 0x00224102, //!< You swung too late! - MSG_22410_003 = 0x00224103, //!< You're a tad late! - MSG_22420_000 = 0x00224200, //!< Home run - MSG_22420_001 = 0x00224201, //!< Out of the park - MSG_22450_000 = 0x00224500, //!< - MSG_22451_000 = 0x00224510, //!< - MSG_22500_000 = 0x00225000, //!< 10 pitches - MSG_22510_000 = 0x00225100, //!< {000000} runs - MSG_22520_000 = 0x00225200, //!< - MSG_22600_000 = 0x00226000, //!< Left - MSG_22601_000 = 0x00226010, //!< - MSG_22610_000 = 0x00226100, //!< Hits - MSG_22611_000 = 0x00226110, //!< - MSG_22611_001 = 0x00226111, //!< - MSG_22612_000 = 0x00226120, //!< Hit! - MSG_22620_000 = 0x00226200, //!< - MSG_22621_000 = 0x00226210, //!< - MSG_22650_000 = 0x00226500, //!< - MSG_22651_000 = 0x00226510, //!< - MSG_22700_000 = 0x00227000, //!< Vs. - MSG_22710_000 = 0x00227100, //!< {000001}{000000} - MSG_22711_000 = 0x00227110, //!< Skill Level: {000000} - MSG_22720_000 = 0x00227200, //!< {000001}{000000} - MSG_22721_000 = 0x00227210, //!< Skill Level: {000000} - MSG_22800_000 = 0x00228000, //!< Batting - MSG_22801_000 = 0x00228010, //!< - MSG_22810_000 = 0x00228100, //!< How to Hold - MSG_22811_000 = 0x00228110, //!< Hold the Wii Remote so that the side\nwith the buttons is facing you. - MSG_22820_000 = 0x00228200, //!< Batting - MSG_22821_000 = 0x00228210, //!< Hold the Wii Remote like a bat. Swing at\npitches at the right time to hit them. - MSG_22830_000 = 0x00228300, //!< Pitching - MSG_22831_000 = 0x00228310, //!< - MSG_22840_000 = 0x00228400, //!< Pitching - MSG_22841_000 = 0x00228410, //!< Swing the Wii Remote overhand to pitch.\nAim your pitch with \uE041. - MSG_22850_000 = 0x00228500, //!< Breaking Balls - MSG_22851_000 = 0x00228510, //!< Pitch while pressing \uE042 for a screwball,\n\uE043 for a curveball, and \uE042+\uE043 for a splitter. - MSG_22851_001 = 0x00228511, //!< Pitch while pressing \uE042 for a curveball,\n\uE043 for a screwball, and \uE042+\uE043 for a splitter. - MSG_22860_000 = 0x00228600, //!< Swing to pitch. - MSG_23000_000 = 0x00230000, //!< - MSG_23001_000 = 0x00230010, //!< - MSG_23010_000 = 0x00230100, //!< - MSG_23011_000 = 0x00230110, //!< - MSG_23011_001 = 0x00230111, //!< - MSG_23012_000 = 0x00230120, //!< - MSG_23012_001 = 0x00230121, //!< - MSG_23012_002 = 0x00230122, //!< - MSG_23012_003 = 0x00230123, //!< - MSG_23012_004 = 0x00230124, //!< - MSG_23020_000 = 0x00230200, //!< - MSG_23020_001 = 0x00230201, //!< - MSG_23020_002 = 0x00230202, //!< - MSG_23020_003 = 0x00230203, //!< - MSG_23020_004 = 0x00230204, //!< - MSG_23030_000 = 0x00230300, //!< - MSG_23030_001 = 0x00230301, //!< - MSG_23100_000 = 0x00231000, //!< Select a course - MSG_23101_000 = 0x00231010, //!< 9-Hole Game - MSG_23102_000 = 0x00231020, //!< 3-Hole Game - MSG_23103_000 = 0x00231030, //!< Beginner - MSG_23103_001 = 0x00231031, //!< Holes 1 to 3 - MSG_23104_000 = 0x00231040, //!< Intermediate - MSG_23104_001 = 0x00231041, //!< Holes 4 to 5 - MSG_23105_000 = 0x00231050, //!< Expert - MSG_23105_001 = 0x00231051, //!< Holes 6 to 9 - MSG_23106_000 = 0x00231060, //!< Main menu - MSG_23110_000 = 0x00231100, //!< Hole {000000}: Par {000000} - MSG_23111_000 = 0x00231110, //!< {000001} - MSG_23112_000 = 0x00231120, //!< Best - MSG_23113_000 = 0x00231130, //!< - MSG_23114_000 = 0x00231140, //!< Skill Level - MSG_23115_000 = 0x00231150, //!< - MSG_23116_000 = 0x00231160, //!< Score - MSG_23117_000 = 0x00231170, //!< - MSG_23120_000 = 0x00231200, //!< Stroke {000000} - MSG_23121_000 = 0x00231210, //!< {000001}{000000} - MSG_23130_000 = 0x00231300, //!< Hole {000000}: Par {000000} - MSG_23131_000 = 0x00231310, //!< {000000} yd left - MSG_23131_001 = 0x00231311, //!< {000000} yds left - MSG_23131_002 = 0x00231312, //!< {000000} ft left - MSG_23131_003 = 0x00231313, //!< {000000} ft left - MSG_23132_000 = 0x00231320, //!< {000000} mph - MSG_23132_001 = 0x00231321, //!< Wind - MSG_23132_002 = 0x00231322, //!< mph - MSG_23133_000 = 0x00231330, //!< Driver - MSG_23133_001 = 0x00231331, //!< Iron - MSG_23133_002 = 0x00231332, //!< Wedge - MSG_23133_003 = 0x00231333, //!< Putter - MSG_23134_000 = 0x00231340, //!< To hit the ball, hold down \uE042 and swing.\n㌍\uE041㍗: Aim, ㌦\uE041㌣: Change clubs - MSG_23135_000 = 0x00231350, //!< To hit the ball, hold down \uE042 and swing.\n㌍\uE041㍗: Aim, \uE047: Read green\n\uE048: Change camera - MSG_23136_000 = 0x00231360, //!< - MSG_23140_000 = 0x00231400, //!< Green - MSG_23140_001 = 0x00231401, //!< Edge of Green - MSG_23140_002 = 0x00231402, //!< Fairway - MSG_23140_003 = 0x00231403, //!< Rough - MSG_23140_004 = 0x00231404, //!< Bunker - MSG_23140_005 = 0x00231405, //!< Out of Bounds - MSG_23140_006 = 0x00231406, //!< Water Hazard - MSG_23140_007 = 0x00231407, //!< Off the Green - MSG_23141_000 = 0x00231410, //!< {000000} yard to go - MSG_23141_001 = 0x00231411, //!< {000000} yards to go - MSG_23142_000 = 0x00231420, //!< {000000} foot to go - MSG_23142_001 = 0x00231421, //!< {000000} feet to go - MSG_23150_000 = 0x00231500, //!< Hole in One - MSG_23150_001 = 0x00231501, //!< Double Eagle - MSG_23150_002 = 0x00231502, //!< Eagle - MSG_23150_003 = 0x00231503, //!< Birdie - MSG_23150_004 = 0x00231504, //!< Par - MSG_23150_005 = 0x00231505, //!< Bogey - MSG_23150_006 = 0x00231506, //!< Double Bogey - MSG_23150_007 = 0x00231507, //!< Triple Bogey - MSG_23150_008 = 0x00231508, //!< {000000} - MSG_23160_000 = 0x00231600, //!< Give up - MSG_23161_000 = 0x00231610, //!< {000000} - MSG_23170_000 = 0x00231700, //!< Scorecard - MSG_23180_000 = 0x00231800, //!< New personal best! - MSG_23181_000 = 0x00231810, //!< Next - MSG_23182_000 = 0x00231820, //!< Hole - MSG_23183_000 = 0x00231830, //!< Total - MSG_23184_000 = 0x00231840, //!< Par - MSG_23185_000 = 0x00231850, //!< {000001} - MSG_23200_000 = 0x00232000, //!< Round {000000} - MSG_23210_000 = 0x00232100, //!< Distance left: {000000} ft - MSG_23210_001 = 0x00232101, //!< Distance left: {000000} ft - MSG_23220_000 = 0x00232200, //!< Try again - MSG_23300_000 = 0x00233000, //!< Total: {000000} ft - MSG_23300_001 = 0x00233001, //!< Total: {000000} ft - MSG_23310_000 = 0x00233100, //!< - MSG_23311_000 = 0x00233110, //!< - MSG_23311_001 = 0x00233111, //!< Score: {000000} ft - MSG_23400_000 = 0x00234000, //!< Total: {000000} pt - MSG_23400_001 = 0x00234001, //!< Total: {000000} pts - MSG_23401_000 = 0x00234010, //!< Miss - MSG_23401_001 = 0x00234011, //!< +10 - MSG_23401_002 = 0x00234012, //!< +25 - MSG_23401_003 = 0x00234013, //!< +50 - MSG_23401_004 = 0x00234014, //!< +100 - MSG_23401_005 = 0x00234015, //!< +75 - MSG_23500_000 = 0x00235000, //!< High - MSG_23501_000 = 0x00235010, //!< Low - MSG_23600_000 = 0x00236000, //!< Hold the Wii Remote down, like a club.\nSwing as though you are hitting the\nball with the side of the Wii Remote. - MSG_23601_000 = 0x00236010, //!< Check the strength of your swing\nwith the power gauge. - MSG_23602_000 = 0x00236020, //!< If you swing too hard and max out the\ngauge, your shot will slice or hook. - MSG_23603_000 = 0x00236030, //!< Try some practice swings before you\nstep up to hit the ball. - MSG_23604_000 = 0x00236040, //!< Let's take a swing at the ball.\nAim the Wii Remote down and hold\ndown \uE042 to swing. - MSG_24000_000 = 0x00240000, //!< - MSG_24001_000 = 0x00240010, //!< - MSG_24002_000 = 0x00240020, //!< - MSG_24002_001 = 0x00240021, //!< - MSG_25000_000 = 0x00250000, //!< - MSG_25001_000 = 0x00250010, //!< - MSG_25002_000 = 0x00250020, //!< - MSG_25003_000 = 0x00250030, //!< - MSG_25010_000 = 0x00250100, //!< Decision - MSG_25011_000 = 0x00250110, //!< Decision - MSG_25020_000 = 0x00250200, //!< - MSG_25021_000 = 0x00250210, //!< - MSG_25030_000 = 0x00250300, //!< R1 - MSG_25030_001 = 0x00250301, //!< R2 - MSG_25030_002 = 0x00250302, //!< R3 - MSG_25040_000 = 0x00250400, //!< pt - MSG_25040_001 = 0x00250401, //!< pts - MSG_25100_000 = 0x00251000, //!< - MSG_25101_000 = 0x00251010, //!< - MSG_25200_000 = 0x00252000, //!< - MSG_25201_000 = 0x00252010, //!< - MSG_25300_000 = 0x00253000, //!< - MSG_25301_000 = 0x00253010, //!< - MSG_25400_000 = 0x00254000, //!< Guard your face! - MSG_25401_000 = 0x00254010, //!< Hold the Wii Remote and Nunchuk\nup in front of your face. - MSG_25410_000 = 0x00254100, //!< Punch the face! - MSG_25411_000 = 0x00254110, //!< Jab with the Wii Remote to punch\nyour opponent's head. - MSG_25420_000 = 0x00254200, //!< Guard your body! - MSG_25421_000 = 0x00254210, //!< Hold the Wii Remote and Nunchuk in front\nof your torso and tilt them inward. - MSG_25430_000 = 0x00254300, //!< Punch the Body - MSG_25431_000 = 0x00254310, //!< Jab with the Wii Remote to punch\nyour opponent's body. - MSG_25440_000 = 0x00254400, //!< Dodge Punches - MSG_25441_000 = 0x00254410, //!< Hold the Wii Remote and Nunchuk and tilt\nyour body forward, back, left, or right. - MSG_25550_000 = 0x00255500, //!< Fighting Stance - MSG_25551_000 = 0x00255510, //!< Hold the Wii Remote in your dominant\nhand and the Nunchuk in the other hand. - MSG_26000_000 = 0x00260000, //!< Raise the Wii Remote and hold \uE043. - MSG_26001_000 = 0x00260010, //!< Take a swing while\nholding \uE043. Release \uE043\nas you roll the ball. - MSG_26002_000 = 0x00260020, //!< Swing your arm while\nholding down \uE043, and\nrelease it to roll the ball. - MSG_26010_000 = 0x00260100, //!< Strike - MSG_26010_001 = 0x00260101, //!< Spare - MSG_26010_002 = 0x00260102, //!< {000000} pin - MSG_26010_003 = 0x00260103, //!< {000000} pins - MSG_26011_000 = 0x00260110, //!< Double - MSG_26011_001 = 0x00260111, //!< Turkey - MSG_26011_002 = 0x00260112, //!< Fourth - MSG_26011_003 = 0x00260113, //!< Fifth - MSG_26011_004 = 0x00260114, //!< Six-pack - MSG_26011_005 = 0x00260115, //!< Seven-pack - MSG_26011_006 = 0x00260116, //!< Eight in a row - MSG_26011_007 = 0x00260117, //!< Nine in a row - MSG_26011_008 = 0x00260118, //!< Ten in a row - MSG_26011_009 = 0x00260119, //!< Eleven in a row - MSG_26011_010 = 0x02601110, //!< Perfect - MSG_26012_000 = 0x00260120, //!< Missed - MSG_26020_000 = 0x00260200, //!< Scorecard - MSG_26021_000 = 0x00260210, //!< Record! - MSG_26022_000 = 0x00260220, //!< - - MSG_26023_000 = 0x00260230, //!< ①②③④⑤⑥⑦⑧ - MSG_26030_000 = 0x00260300, //!< Next - MSG_26040_000 = 0x00260400, //!< Move - MSG_26040_001 = 0x00260401, //!< Turn - MSG_26041_000 = 0x00260410, //!< Switch - MSG_26042_000 = 0x00260420, //!< Back - MSG_26050_000 = 0x00260500, //!< Game Finished - MSG_26060_000 = 0x00260600, //!< Replay - MSG_26100_000 = 0x00261000, //!< Stage {000000} - MSG_26101_000 = 0x00261010, //!< {000000} pins - MSG_26102_000 = 0x00261020, //!< Stage {000000} - MSG_26110_000 = 0x00261100, //!< Missed - MSG_26120_000 = 0x00261200, //!< Challenge cleared - MSG_26200_000 = 0x00262000, //!< - MSG_26300_000 = 0x00263000, //!< - MSG_26400_000 = 0x00264000, //!< {000000} pin - MSG_26400_001 = 0x00264001, //!< {000000} pins - MSG_26401_000 = 0x00264010, //!< × - MSG_26500_000 = 0x00265000, //!< Perfect! - MSG_27000_000 = 0x00270000, //!< {000001} - MSG_27001_000 = 0x00270010, //!< Wii Fitness - MSG_27010_000 = 0x00270100, //!< Wii Fitness Age: - MSG_27011_000 = 0x00270110, //!< - MSG_27020_000 = 0x00270200, //!< {000000} - MSG_27021_000 = 0x00270210, //!< Sun - MSG_27021_001 = 0x00270211, //!< Mon - MSG_27021_002 = 0x00270212, //!< Tues - MSG_27021_003 = 0x00270213, //!< Wed - MSG_27021_004 = 0x00270214, //!< Thurs - MSG_27021_005 = 0x00270215, //!< Fri - MSG_27021_006 = 0x00270216, //!< Sat - MSG_27030_000 = 0x00270300, //!< Start - MSG_27031_000 = 0x00270310, //!< Done - MSG_27100_000 = 0x00271000, //!< Speed - MSG_27101_000 = 0x00271010, //!< Balance - MSG_27102_000 = 0x00271020, //!< Stamina - MSG_27200_000 = 0x00272000, //!< Results - MSG_27210_000 = 0x00272100, //!< {000001} - MSG_27210_001 = 0x00272101, //!< - MSG_27210_002 = 0x00272102, //!< - MSG_27220_000 = 0x00272200, //!< - MSG_27230_000 = 0x00272300, //!< - MSG_27250_000 = 0x00272500, //!< Wow! It's like you're {000000} years younger! - MSG_27251_000 = 0x00272510, //!< It's like you're a whole year younger! - MSG_27251_001 = 0x00272511, //!< It's like you're {000000} years younger! - MSG_27252_000 = 0x00272520, //!< No change - MSG_27253_000 = 0x00272530, //!< A bit lower than before - MSG_27254_000 = 0x00272540, //!< A big decline - MSG_27255_000 = 0x00272550, //!< Good job! - MSG_27400_000 = 0x00274000, //!< JAN - MSG_27400_001 = 0x00274001, //!< FEB - MSG_27400_002 = 0x00274002, //!< MAR - MSG_27400_003 = 0x00274003, //!< APR - MSG_27400_004 = 0x00274004, //!< MAY - MSG_27400_005 = 0x00274005, //!< JUN - MSG_27400_006 = 0x00274006, //!< JUL - MSG_27400_007 = 0x00274007, //!< AUG - MSG_27400_008 = 0x00274008, //!< SEP - MSG_27400_009 = 0x00274009, //!< OCT - MSG_27400_010 = 0x02740010, //!< NOV - MSG_27400_011 = 0x02740011, //!< DEC - MSG_27500_000 = 0x00275000, //!< {000000} - MSG_27600_000 = 0x00276000, //!< Testing... - MSG_27601_000 = 0x00276010, //!< Wii Fitness Age - MSG_28000_000 = 0x00280000, //!< - MSG_29000_000 = 0x00290000, //!< - MSG_29000_001 = 0x00290001, //!< - MSG_29000_002 = 0x00290002, //!< - MSG_29000_003 = 0x00290003, //!< - MSG_29000_004 = 0x00290004, //!< - MSG_29000_005 = 0x00290005, //!< - MSG_29000_006 = 0x00290006, //!< - MSG_29000_007 = 0x00290007, //!< - MSG_29000_008 = 0x00290008, //!< - MSG_29000_009 = 0x00290009, //!< - MSG_29000_010 = 0x02900010, //!< - MSG_29000_011 = 0x02900011, //!< - MSG_29000_012 = 0x02900012, //!< - MSG_29000_013 = 0x02900013, //!< - MSG_29000_014 = 0x02900014, //!< - MSG_29010_000 = 0x00290100, //!< Start - MSG_29010_001 = 0x00290101, //!< Finished - MSG_29100_000 = 0x00291000, //!< - MSG_29111_000 = 0x00291110, //!< - MSG_29112_000 = 0x00291120, //!< - MSG_29113_000 = 0x00291130, //!< - MSG_29114_000 = 0x00291140, //!< - MSG_29115_000 = 0x00291150, //!< - MSG_29120_000 = 0x00291200, //!< - MSG_29121_000 = 0x00291210, //!< - MSG_29122_000 = 0x00291220, //!< - MSG_29123_000 = 0x00291230, //!< - MSG_29124_000 = 0x00291240, //!< - MSG_29125_000 = 0x00291250, //!< - MSG_29130_000 = 0x00291300, //!< - MSG_29131_000 = 0x00291310, //!< - MSG_29140_000 = 0x00291400, //!< - MSG_29200_000 = 0x00292000, //!< Training - MSG_29201_000 = 0x00292010, //!< Main menu - MSG_29202_000 = 0x00292020, //!< Wii Fitness - MSG_29210_000 = 0x00292100, //!< Tennis - MSG_29211_000 = 0x00292110, //!< Baseball - MSG_29212_000 = 0x00292120, //!< Bowling - MSG_29213_000 = 0x00292130, //!< Golf - MSG_29214_000 = 0x00292140, //!< Boxing - MSG_29230_000 = 0x00292300, //!< Returning Balls - MSG_29231_000 = 0x00292310, //!< Timing Your Swing - MSG_29232_000 = 0x00292320, //!< Target Practice - MSG_29233_000 = 0x00292330, //!< Hitting Home Runs - MSG_29234_000 = 0x00292340, //!< Batting Practice - MSG_29235_000 = 0x00292350, //!< Swing Control - MSG_29236_000 = 0x00292360, //!< Picking Up Spares - MSG_29237_000 = 0x00292370, //!< Spin Control - MSG_29238_000 = 0x00292380, //!< Power Throws - MSG_29239_000 = 0x00292390, //!< Putting - MSG_29240_000 = 0x00292400, //!< Hitting the Green - MSG_29241_000 = 0x00292410, //!< Target Practice - MSG_29242_000 = 0x00292420, //!< Throwing Punches - MSG_29243_000 = 0x00292430, //!< Dodging - MSG_29244_000 = 0x00292440, //!< Working the Bag - MSG_29300_000 = 0x00293000, //!< \uE042: Start - MSG_29310_000 = 0x00293100, //!< ??? - MSG_29400_000 = 0x00294000, //!< First event - MSG_29400_001 = 0x00294001, //!< Second event - MSG_29400_002 = 0x00294002, //!< Third event - MSG_29500_000 = 0x00295000, //!< Skill Level - MSG_29501_000 = 0x00295010, //!< PRO - MSG_29502_000 = 0x00295020, //!< Play again - MSG_29503_000 = 0x00295030, //!< Quit - MSG_29510_000 = 0x00295100, //!< {000001}{000000} - MSG_29511_000 = 0x00295110, //!< {000000} - MSG_29600_000 = 0x00296000, //!< {000001}{000000} - MSG_29601_000 = 0x00296010, //!< Pause - MSG_29610_000 = 0x00296100, //!< Record: {000000} pt - MSG_29610_001 = 0x00296101, //!< Record: {000000} pts - MSG_29611_000 = 0x00296110, //!< Record: {000000} pt - MSG_29611_001 = 0x00296111, //!< Record: {000000} pts - MSG_29612_000 = 0x00296120, //!< Record: {000000} pt - MSG_29612_001 = 0x00296121, //!< Record: {000000} pts - MSG_29620_000 = 0x00296200, //!< Record: {000000} homer ({000000} ft) - MSG_29620_001 = 0x00296201, //!< Record: {000000} homers ({000000} ft) - MSG_29621_000 = 0x00296210, //!< Record: {000000} pt - MSG_29621_001 = 0x00296211, //!< Record: {000000} pts - MSG_29622_000 = 0x00296220, //!< Record: {000000} hit - MSG_29622_001 = 0x00296221, //!< Record: {000000} hits - MSG_29630_000 = 0x00296300, //!< Record: {000000} pt - MSG_29630_001 = 0x00296301, //!< Record: {000000} pts - MSG_29631_000 = 0x00296310, //!< Record: {000000} ft - MSG_29631_001 = 0x00296311, //!< Record: {000000} ft - MSG_29632_000 = 0x00296320, //!< Record: {000000} pt - MSG_29632_001 = 0x00296321, //!< Record: {000000} pts - MSG_29640_000 = 0x00296400, //!< Record: {000000} pt - MSG_29640_001 = 0x00296401, //!< Record: {000000} pts - MSG_29641_000 = 0x00296410, //!< Record: {000000} pt - MSG_29641_001 = 0x00296411, //!< Record: {000000} pts - MSG_29642_000 = 0x00296420, //!< Record: {000000} pt - MSG_29642_001 = 0x00296421, //!< Record: {000000} pts - MSG_29650_000 = 0x00296500, //!< Record: {000000} lane - MSG_29650_001 = 0x00296501, //!< Record: {000000} lanes - MSG_29651_000 = 0x00296510, //!< Record: {000000} lane - MSG_29651_001 = 0x00296511, //!< Record: {000000} lanes - MSG_29652_000 = 0x00296520, //!< Record: {000000} pin - MSG_29652_001 = 0x00296521, //!< Record: {000000} pins - MSG_29700_000 = 0x00297000, //!< {000001}{000000} - MSG_29701_000 = 0x00297010, //!< Record! - MSG_29702_000 = 0x00297020, //!< Try again - MSG_29703_000 = 0x00297030, //!< Quit - MSG_29710_000 = 0x00297100, //!< Returning Balls - MSG_29710_001 = 0x00297101, //!< Score: - MSG_29710_002 = 0x00297102, //!< pt - MSG_29710_003 = 0x00297103, //!< pts - MSG_29711_000 = 0x00297110, //!< Timing Your Swing - MSG_29711_001 = 0x00297111, //!< Score: - MSG_29711_002 = 0x00297112, //!< pt - MSG_29711_003 = 0x00297113, //!< pts - MSG_29712_000 = 0x00297120, //!< Target Practice - MSG_29712_001 = 0x00297121, //!< Score: - MSG_29712_002 = 0x00297122, //!< pt - MSG_29712_003 = 0x00297123, //!< pts - MSG_29720_000 = 0x00297200, //!< Hitting Home Runs - MSG_29720_001 = 0x00297201, //!< Home runs: - MSG_29720_002 = 0x00297202, //!< run - MSG_29720_003 = 0x00297203, //!< runs - MSG_29720_004 = 0x00297204, //!< Total distance: - MSG_29720_005 = 0x00297205, //!< ft - MSG_29720_006 = 0x00297206, //!< ft - MSG_29721_000 = 0x00297210, //!< Swing Control - MSG_29721_001 = 0x00297211, //!< Score: - MSG_29721_002 = 0x00297212, //!< pt - MSG_29721_003 = 0x00297213, //!< pts - MSG_29722_000 = 0x00297220, //!< Batting Practice - MSG_29722_001 = 0x00297221, //!< Score: - MSG_29722_002 = 0x00297222, //!< hit - MSG_29722_003 = 0x00297223, //!< hits - MSG_29730_000 = 0x00297300, //!< Putting - MSG_29730_001 = 0x00297301, //!< Cup-in: - MSG_29730_002 = 0x00297302, //!< pt - MSG_29730_003 = 0x00297303, //!< pts - MSG_29731_000 = 0x00297310, //!< Hitting the Green - MSG_29731_001 = 0x00297311, //!< Total left: - MSG_29731_002 = 0x00297312, //!< ft - MSG_29731_003 = 0x00297313, //!< ft - MSG_29732_000 = 0x00297320, //!< Target Practice - MSG_29732_001 = 0x00297321, //!< Score: - MSG_29732_002 = 0x00297322, //!< pt - MSG_29732_003 = 0x00297323, //!< pts - MSG_29740_000 = 0x00297400, //!< Throwing Punches - MSG_29740_001 = 0x00297401, //!< Score: - MSG_29740_002 = 0x00297402, //!< pt - MSG_29740_003 = 0x00297403, //!< pts - MSG_29740_004 = 0x00297404, //!< Hit score: - MSG_29740_005 = 0x00297405, //!< pt - MSG_29740_006 = 0x00297406, //!< pts - MSG_29740_007 = 0x00297407, //!< Trainer penalty: - MSG_29740_008 = 0x00297408, //!< pt - MSG_29740_009 = 0x00297409, //!< pts - MSG_29741_000 = 0x00297410, //!< Dodging - MSG_29741_001 = 0x00297411, //!< Score: - MSG_29741_002 = 0x00297412, //!< pt - MSG_29741_003 = 0x00297413, //!< pts - MSG_29741_004 = 0x00297414, //!< Balls dodged: - MSG_29741_005 = 0x00297415, //!< pt - MSG_29741_006 = 0x00297416, //!< pts - MSG_29741_007 = 0x00297417, //!< Balls hit: - MSG_29741_008 = 0x00297418, //!< pt - MSG_29741_009 = 0x00297419, //!< pts - MSG_29742_000 = 0x00297420, //!< Working the Bag - MSG_29742_001 = 0x00297421, //!< Score: - MSG_29742_002 = 0x00297422, //!< pt - MSG_29742_003 = 0x00297423, //!< pts - MSG_29742_004 = 0x00297424, //!< - MSG_29742_005 = 0x00297425, //!< - MSG_29742_006 = 0x00297426, //!< - MSG_29742_007 = 0x00297427, //!< - MSG_29742_008 = 0x00297428, //!< - MSG_29742_009 = 0x00297429, //!< - MSG_29750_000 = 0x00297500, //!< Picking Up Spares - MSG_29750_001 = 0x00297501, //!< Cleared: - MSG_29750_002 = 0x00297502, //!< lane - MSG_29750_003 = 0x00297503, //!< lanes - MSG_29751_000 = 0x00297510, //!< Spin Control - MSG_29751_001 = 0x00297511, //!< Cleared: - MSG_29751_002 = 0x00297512, //!< lane - MSG_29751_003 = 0x00297513, //!< lanes - MSG_29752_000 = 0x00297520, //!< Power Throws - MSG_29752_001 = 0x00297521, //!< Score: - MSG_29752_002 = 0x00297522, //!< pin - MSG_29752_003 = 0x00297523, //!< pins - MSG_29800_000 = 0x00298000, //!< - MSG_29801_000 = 0x00298010, //!< 1 - MSG_29802_000 = 0x00298020, //!< 2 - MSG_29803_000 = 0x00298030, //!< 3 - MSG_29804_000 = 0x00298040, //!< 4 - MSG_29805_000 = 0x00298050, //!< {000001} - MSG_29810_000 = 0x00298100, //!< {000000} pt - MSG_29810_001 = 0x00298101, //!< {000000} pts - MSG_29811_000 = 0x00298110, //!< {000000} pt - MSG_29811_001 = 0x00298111, //!< {000000} pts - MSG_29812_000 = 0x00298120, //!< {000000} pt - MSG_29812_001 = 0x00298121, //!< {000000} pts - MSG_29820_000 = 0x00298200, //!< {000000} homer {FF0001 00 3C}({000000} ft) - MSG_29820_001 = 0x00298201, //!< {000000} homers {FF0001 00 3C}({000000} ft) - MSG_29820_002 = 0x00298202, //!< - MSG_29820_003 = 0x00298203, //!< - MSG_29821_000 = 0x00298210, //!< {000000} pt - MSG_29821_001 = 0x00298211, //!< {000000} pts - MSG_29822_000 = 0x00298220, //!< {000000} hit - MSG_29822_001 = 0x00298221, //!< {000000} hits - MSG_29830_000 = 0x00298300, //!< {000000} pt - MSG_29830_001 = 0x00298301, //!< {000000} pts - MSG_29831_000 = 0x00298310, //!< {000000} ft - MSG_29831_001 = 0x00298311, //!< {000000} ft - MSG_29832_000 = 0x00298320, //!< {000000} pt - MSG_29832_001 = 0x00298321, //!< {000000} pts - MSG_29840_000 = 0x00298400, //!< {000000} pt - MSG_29840_001 = 0x00298401, //!< {000000} pts - MSG_29841_000 = 0x00298410, //!< {000000} pt - MSG_29841_001 = 0x00298411, //!< {000000} pts - MSG_29842_000 = 0x00298420, //!< {000000} pt - MSG_29842_001 = 0x00298421, //!< {000000} pts - MSG_29850_000 = 0x00298500, //!< {000000} lane - MSG_29850_001 = 0x00298501, //!< {000000} lanes - MSG_29851_000 = 0x00298510, //!< {000000} lane - MSG_29851_001 = 0x00298511, //!< {000000} lanes - MSG_29852_000 = 0x00298520, //!< {000000} pin - MSG_29852_001 = 0x00298521, //!< {000000} pins - MSG_29860_000 = 0x00298600, //!< Returning Balls - MSG_29861_000 = 0x00298610, //!< Timing Your Swing - MSG_29862_000 = 0x00298620, //!< Target Practice - MSG_29863_000 = 0x00298630, //!< Hitting Home Runs - MSG_29864_000 = 0x00298640, //!< Batting Practice - MSG_29865_000 = 0x00298650, //!< Swing Control - MSG_29866_000 = 0x00298660, //!< Picking Up Spares - MSG_29867_000 = 0x00298670, //!< Spin Control - MSG_29868_000 = 0x00298680, //!< Power Throws - MSG_29869_000 = 0x00298690, //!< Putting - MSG_29870_000 = 0x00298700, //!< Hitting the Green - MSG_29871_000 = 0x00298710, //!< Target Practice - MSG_29872_000 = 0x00298720, //!< Throwing Punches - MSG_29873_000 = 0x00298730, //!< Dodging - MSG_29874_000 = 0x00298740, //!< Working the Bag - MSG_29880_000 = 0x00298800, //!< Again - MSG_29881_000 = 0x00298810, //!< Quit - MSG_29890_000 = 0x00298900, //!< Platinum - MSG_29891_000 = 0x00298910, //!< Gold - MSG_29892_000 = 0x00298920, //!< Silver - MSG_29893_000 = 0x00298930, //!< Bronze - MSG_29900_000 = 0x00299000, //!< Tennis - MSG_29901_000 = 0x00299010, //!< Baseball - MSG_29902_000 = 0x00299020, //!< Bowling - MSG_29903_000 = 0x00299030, //!< Golf - MSG_29904_000 = 0x00299040, //!< Boxing - MSG_29910_000 = 0x00299100, //!< Training - MSG_29911_000 = 0x00299110, //!< Wii Fitness - MSG_29920_000 = 0x00299200, //!< ㌃㌶㍑ - MSG_29930_000 = 0x00299300, //!< Please press \uE042 and \uE043. - MSG_29940_000 = 0x00299400, //!< Wii Sports - MSG_29941_000 = 0x00299410, //!< Play like a pro! + SP_MSG_00000_000 = 0x00000000, //!< + SP_MSG_00001_000 = 0x00000010, //!< + SP_MSG_00999_000 = 0x00003E70, //!< + SP_MSG_01000_000 = 0x00003E80, //!< + SP_MSG_01110_000 = 0x00004560, //!< + SP_MSG_01300_000 = 0x00005140, //!< Returning Balls + SP_MSG_01301_000 = 0x00005150, //!< Return the ball inside\nthe court. Just relax\nand focus on hitting\nthe ball. + SP_MSG_01310_000 = 0x000051E0, //!< Timing Your Swing + SP_MSG_01311_000 = 0x000051F0, //!< Return the ball into\nthe orange bar. Watch\nyour timing, and aim\neach shot carefully. + SP_MSG_01320_000 = 0x00005280, //!< Target Practice + SP_MSG_01321_000 = 0x00005290, //!< Volley the ball off\nthe wall and hit the\ntargets. Controlling\nyour swing speed and\nstrength is essential\nin aiming your shots. + SP_MSG_02000_000 = 0x00007D00, //!< + SP_MSG_02100_000 = 0x00008340, //!< + SP_MSG_02101_000 = 0x00008350, //!< + SP_MSG_02101_001 = 0x00008351, //!< + SP_MSG_02101_002 = 0x00008352, //!< + SP_MSG_02101_003 = 0x00008353, //!< + SP_MSG_02102_000 = 0x00008360, //!< + SP_MSG_02300_000 = 0x00008FC0, //!< Hitting Home Runs + SP_MSG_02301_000 = 0x00008FD0, //!< Watch the ball, and\ntry to hit it out of\nthe park. Timing is\neverything! + SP_MSG_02310_000 = 0x00009060, //!< Swing Control + SP_MSG_02311_000 = 0x00009070, //!< Hit into the target\nzones on the field.\nMaster this, and you'll\nbe a pro in no time! + SP_MSG_02320_000 = 0x00009100, //!< Batting Practice + SP_MSG_02321_000 = 0x00009110, //!< The pitcher will keep\nthrowing those balls,\nso focus on making\nfast, compact swings! + SP_MSG_03000_000 = 0x0000BB80, //!< + SP_MSG_03001_000 = 0x0000BB90, //!< + SP_MSG_03002_000 = 0x0000BBA0, //!< + SP_MSG_03002_001 = 0x0000BBA1, //!< + SP_MSG_03003_000 = 0x0000BBB0, //!< + SP_MSG_03100_000 = 0x0000C1C0, //!< + SP_MSG_03101_000 = 0x0000C1D0, //!< + SP_MSG_03200_000 = 0x0000C800, //!< + SP_MSG_03201_000 = 0x0000C810, //!< + SP_MSG_03300_000 = 0x0000CE40, //!< Putting + SP_MSG_03301_000 = 0x0000CE50, //!< Drop it in the cup with\na single putt. Check\nthe lay of the green\nby pressing \uE047. + SP_MSG_03310_000 = 0x0000CEE0, //!< Hitting the Green + SP_MSG_03311_000 = 0x0000CEF0, //!< Land the ball as close\nto the pin as possible.\nPractice your stroke\nto check the power of\nyour swing. Hold \uE042\nto approach the ball. + SP_MSG_03320_000 = 0x0000CF80, //!< Target Practice + SP_MSG_03321_000 = 0x0000CF90, //!< Hit the target with\nthe ball. Before you\ntake your swing, be\nsure to read the\nwind direction. + SP_MSG_04000_000 = 0x0000FA00, //!< + SP_MSG_04001_000 = 0x0000FA10, //!< + SP_MSG_04100_000 = 0x00010040, //!< + SP_MSG_04101_000 = 0x00010050, //!< + SP_MSG_05000_000 = 0x00013880, //!< Boxing + SP_MSG_05300_000 = 0x00014B40, //!< Throwing Punches + SP_MSG_05301_000 = 0x00014B50, //!< Watch your trainer's\nmitts, and try to hit\nthem. You lose points\nif you hit your trainer. + SP_MSG_05310_000 = 0x00014BE0, //!< Dodging + SP_MSG_05311_000 = 0x00014BF0, //!< Your trainer throws\nball after ball at you.\nMove left and right\nto avoid getting hit. + SP_MSG_05320_000 = 0x00014C80, //!< Working the Bag + SP_MSG_05321_000 = 0x00014C90, //!< Throw punches at\nthe punching bags\nuntil you knock them\noff their chains.\nWell-aimed combo\npunches are key. + SP_MSG_06000_000 = 0x00017700, //!< + SP_MSG_06300_000 = 0x000189C0, //!< Picking Up Spares + SP_MSG_06301_000 = 0x000189D0, //!< Knock down the pins\nwith a single throw.\nTwist your wrist to\ncurve the ball. + SP_MSG_06310_000 = 0x00018A60, //!< Spin Control + SP_MSG_06311_000 = 0x00018A70, //!< Avoid the barriers in\nthe lane and knock\ndown the pin. You'll\nhave to balance speed\nand spin. + SP_MSG_06320_000 = 0x00018B00, //!< Power Throws + SP_MSG_06321_000 = 0x00018B10, //!< Knock down as many\npins as you can. A\nnew row will be added\nafter each set. Strikes\ndouble your score! + SP_MSG_07000_000 = 0x0001B580, //!< Today's fitness test uses\nthe Nunchuk. Are you able to use\nthe Nunchuk?{020001 00 00} + SP_MSG_07001_000 = 0x0001B590, //!< Quit the Wii Fitness test?\n\nIf you quit, you can't do another\nWii Fitness test until tomorrow.{020001 01 00}{020002 01 00} + SP_MSG_07002_000 = 0x0001B5A0, //!< Quitting today's fitness test. + SP_MSG_07003_000 = 0x0001B5B0, //!< + SP_MSG_07004_000 = 0x0001B5C0, //!< + SP_MSG_07005_000 = 0x0001B5D0, //!< + SP_MSG_07006_000 = 0x0001B5E0, //!< Selecting events that do\nnot use the Nunchuk. + SP_MSG_07010_000 = 0x0001B620, //!< You can take only one Wii Fitness\ntest each day. You've already\ntaken the test today, so please\ntry again tomorrow. + SP_MSG_07020_000 = 0x0001B6C0, //!< + SP_MSG_07030_000 = 0x0001B760, //!< Wii Fitness\n\nTest your speed, stamina, and\nstrength to determine your Wii\nFitness Age. Train every day to\nlower your Wii Fitness Age. + SP_MSG_08000_000 = 0x0001F400, //!< {000001}\ndebuted in Wii Sports on\n{000000} at {000000}. + SP_MSG_08010_000 = 0x0001F4A0, //!< You're a tennis pro! + SP_MSG_08011_000 = 0x0001F4B0, //!< You're a baseball pro! + SP_MSG_08012_000 = 0x0001F4C0, //!< You're a pro bowler! + SP_MSG_08013_000 = 0x0001F4D0, //!< You're a pro golfer! + SP_MSG_08014_000 = 0x0001F4E0, //!< You're a pro boxer! + SP_MSG_08020_000 = 0x0001F540, //!< You've lost your\ntennis pro status! + SP_MSG_08021_000 = 0x0001F550, //!< You've lost your\nbaseball pro status! + SP_MSG_08022_000 = 0x0001F560, //!< You've lost your\nbowling pro status! + SP_MSG_08023_000 = 0x0001F570, //!< You've lost your\ngolf pro status! + SP_MSG_08024_000 = 0x0001F580, //!< You've lost your\nboxing pro status! + SP_MSG_08030_000 = 0x0001F5E0, //!< New personal best!\nGolf: Stroke play + SP_MSG_08030_001 = 0x0001F5E1, //!< Score: {000000} + SP_MSG_08030_002 = 0x0001F5E2, //!< {000000} + SP_MSG_08031_000 = 0x0001F5F0, //!< New personal best!\nBowling: Score play + SP_MSG_08031_001 = 0x0001F5F1, //!< Score: {000000} + SP_MSG_08031_002 = 0x0001F5F2, //!< {000000} + SP_MSG_08040_000 = 0x0001F680, //!< New personal best!\n{000000}: {000000} + SP_MSG_08040_001 = 0x0001F681, //!< Score: {000000} + SP_MSG_08040_002 = 0x0001F682, //!< {000000} pt + SP_MSG_08040_003 = 0x0001F683, //!< {000000} pts + SP_MSG_08041_000 = 0x0001F690, //!< Home runs: {000000} + SP_MSG_08041_001 = 0x0001F691, //!< {000000} homer + SP_MSG_08041_002 = 0x0001F692, //!< Total distance: {000000} + SP_MSG_08041_003 = 0x0001F693, //!< {000000} foot + SP_MSG_08041_004 = 0x0001F694, //!< {000000} feet + SP_MSG_08041_005 = 0x0001F695, //!< {000000} homers + SP_MSG_08042_000 = 0x0001F6A0, //!< Hits: {000000} + SP_MSG_08042_001 = 0x0001F6A1, //!< {000000} hit + SP_MSG_08042_002 = 0x0001F6A2, //!< {000000} hits + SP_MSG_08043_000 = 0x0001F6B0, //!< Successful hits: {000000} + SP_MSG_08043_001 = 0x0001F6B1, //!< {000000} hit + SP_MSG_08043_002 = 0x0001F6B2, //!< {000000} hits + SP_MSG_08044_000 = 0x0001F6C0, //!< Pins knocked down: {000000} + SP_MSG_08044_001 = 0x0001F6C1, //!< {000000} pin + SP_MSG_08044_002 = 0x0001F6C2, //!< {000000} pins + SP_MSG_08045_000 = 0x0001F6D0, //!< Cup-in: {000000} + SP_MSG_08045_001 = 0x0001F6D1, //!< {000000} pt + SP_MSG_08045_002 = 0x0001F6D2, //!< {000000} pts + SP_MSG_08046_000 = 0x0001F6E0, //!< Total remaining: {000000} + SP_MSG_08046_001 = 0x0001F6E1, //!< {000000} yard + SP_MSG_08046_002 = 0x0001F6E2, //!< {000000} yards + SP_MSG_08050_000 = 0x0001F720, //!< You got a {000000} medal in\n{000000}: {000000}! + SP_MSG_08060_000 = 0x0001F7C0, //!< Wii Fitness Results + SP_MSG_08060_001 = 0x0001F7C1, //!< {000000} years old!\nYou've taken off {000000} year! + SP_MSG_08060_002 = 0x0001F7C2, //!< {000000} years old!\nYou've taken off {000000} years! + SP_MSG_08070_000 = 0x0001F860, //!< Impressive! You hit a hole\nin one on hole {000000} in a\nnine-hole game of golf! + SP_MSG_08070_001 = 0x0001F861, //!< Impressive! You hit a hole\nin one on hole {000000} in a\nthree-hole game of golf! + SP_MSG_08100_000 = 0x0001FA40, //!< Wii Sports Debut + SP_MSG_08110_000 = 0x0001FAE0, //!< Pro Status Earned + SP_MSG_08111_000 = 0x0001FAF0, //!< Pro Status Lost + SP_MSG_08112_000 = 0x0001FB00, //!< New Personal Best Set + SP_MSG_08113_000 = 0x0001FB10, //!< A New Champion! + SP_MSG_08114_020 = 0x0013CF60, //!< Impressive! + SP_MSG_08114_030 = 0x0013CF70, //!< Impressive! + SP_MSG_08120_000 = 0x0001FB80, //!< New Personal Best Set + SP_MSG_08121_000 = 0x0001FB90, //!< Platinum Medal Earned! + SP_MSG_08121_001 = 0x0001FB91, //!< Gold Medal Earned! + SP_MSG_08121_002 = 0x0001FB92, //!< Silver Medal Earned! + SP_MSG_08121_003 = 0x0001FB93, //!< Bronzed Medal Earned! + SP_MSG_08122_000 = 0x0001FBA0, //!< All Gold Medals Earned! + SP_MSG_08123_000 = 0x0001FBB0, //!< All Platinum Medals Earned! + SP_MSG_08130_000 = 0x0001FC20, //!< Wii Fitness Results + SP_MSG_08200_000 = 0x00020080, //!< Wii Sports Debut + SP_MSG_08210_000 = 0x00020120, //!< Tennis Pro Status Reached! + SP_MSG_08210_010 = 0x00140B50, //!< Baseball Pro Status Reached! + SP_MSG_08210_020 = 0x00140B60, //!< Bowling Pro Status Reached! + SP_MSG_08210_030 = 0x00140B70, //!< Golf Pro Status Reached! + SP_MSG_08210_040 = 0x00140B80, //!< Boxing Pro Status Reached! + SP_MSG_08211_000 = 0x00020130, //!< Tennis Pro Status Lost! + SP_MSG_08211_010 = 0x00140BF0, //!< Baseball Pro Status Lost! + SP_MSG_08211_020 = 0x00140C00, //!< Bowling Pro Status Lost! + SP_MSG_08211_030 = 0x00140C10, //!< Golf Pro Status Lost! + SP_MSG_08211_040 = 0x00140C20, //!< Boxing Pro Status Lost! + SP_MSG_08212_020 = 0x00140CA0, //!< Bowling\n New Personal Best! + SP_MSG_08212_030 = 0x00140CB0, //!< Golf\n New Personal Best! + SP_MSG_08213_000 = 0x00020150, //!< Tennis\n Beat the tennis champ! + SP_MSG_08213_010 = 0x00140D30, //!< Baseball\n Beat the baseball champ! + SP_MSG_08213_040 = 0x00140D60, //!< Boxing\n Beat the boxing champ! + SP_MSG_08220_000 = 0x000201C0, //!< Tennis: Target Practice\n New Personal Best! + SP_MSG_08220_001 = 0x000201C1, //!< Tennis: Timing Your Swing\n New Personal Best! + SP_MSG_08220_002 = 0x000201C2, //!< Tennis: Returning Balls\n New Personal Best! + SP_MSG_08220_010 = 0x00141190, //!< Baseball: Hitting Home Runs\n New Personal Best! + SP_MSG_08220_011 = 0x00141191, //!< Baseball: Swing Control\n New Personal Best! + SP_MSG_08220_012 = 0x00141192, //!< Baseball: Batting Practice\n New Personal Best! + SP_MSG_08220_020 = 0x001411A0, //!< Bowling: Picking Up Spares\n New Personal Best! + SP_MSG_08220_021 = 0x001411A1, //!< Bowling: Power Throws\n New Personal Best! + SP_MSG_08220_022 = 0x001411A2, //!< Bowling: Spin Control\n New Personal Best! + SP_MSG_08220_030 = 0x001411B0, //!< Golf: Putting\n New Personal Best! + SP_MSG_08220_031 = 0x001411B1, //!< Golf: Hitting the Green\n New Personal Best! + SP_MSG_08220_032 = 0x001411B2, //!< Golf: Target Practice\n New Personal Best! + SP_MSG_08220_040 = 0x001411C0, //!< Boxing: Working the Bag\n New Personal Best! + SP_MSG_08220_041 = 0x001411C1, //!< Boxing: Dodging\n New Personal Best! + SP_MSG_08220_042 = 0x001411C2, //!< Boxing: Throwing Punches\n New Personal Best! + SP_MSG_08221_000 = 0x000201D0, //!< Tennis: Target Practice\n Earned a platinum medal! + SP_MSG_08221_001 = 0x000201D1, //!< Tennis: Target Practice\n Earned a gold medal! + SP_MSG_08221_002 = 0x000201D2, //!< Tennis: Target Practice\n Earned a silver medal! + SP_MSG_08221_003 = 0x000201D3, //!< Tennis: Target Practice\n Earned a bronze medal! + SP_MSG_08221_004 = 0x000201D4, //!< Tennis: Timing Your Swing\n Earned a platinum medal! + SP_MSG_08221_005 = 0x000201D5, //!< Tennis: Timing Your Swing\n Earned a gold medal! + SP_MSG_08221_006 = 0x000201D6, //!< Tennis: Timing Your Swing\n Earned a silver medal! + SP_MSG_08221_007 = 0x000201D7, //!< Tennis: Timing Your Swing\n Earned a bronze medal! + SP_MSG_08221_008 = 0x000201D8, //!< Tennis: Returning Balls\n Earned a platinum medal! + SP_MSG_08221_009 = 0x000201D9, //!< Tennis: Returning Balls\n Earned a gold medal! + SP_MSG_08221_010 = 0x00141230, //!< Tennis: Returning Balls\n Earned a silver medal! + SP_MSG_08221_011 = 0x00141231, //!< Tennis: Returning Balls\n Earned a bronze medal! + SP_MSG_08221_020 = 0x00141240, //!< Baseball: Hitting Home Runs\n Earned a platinum medal! + SP_MSG_08221_021 = 0x00141241, //!< Baseball: Hitting Home Runs\n Earned a gold medal! + SP_MSG_08221_022 = 0x00141242, //!< Baseball: Hitting Home Runs\n Earned a silver medal! + SP_MSG_08221_023 = 0x00141243, //!< Baseball: Hitting Home Runs\n Earned a bronze medal! + SP_MSG_08221_024 = 0x00141244, //!< Baseball: Swing Control\n Earned a platinum medal! + SP_MSG_08221_025 = 0x00141245, //!< Baseball: Swing Control\n Earned a gold medal! + SP_MSG_08221_026 = 0x00141246, //!< Baseball: Swing Control\n Earned a silver medal! + SP_MSG_08221_027 = 0x00141247, //!< Baseball: Swing Control\n Earned a bronze medal! + SP_MSG_08221_028 = 0x00141248, //!< Baseball: Batting Practice\n Earned a platinum medal! + SP_MSG_08221_029 = 0x00141249, //!< Baseball: Batting Practice\n Earned a gold medal! + SP_MSG_08221_030 = 0x00141250, //!< Baseball: Batting Practice\n Earned a silver medal! + SP_MSG_08221_031 = 0x00141251, //!< Baseball: Batting Practice\n Earned a bronze medal! + SP_MSG_08221_040 = 0x00141260, //!< Bowling: Picking Up Spares\n Earned a platinum medal! + SP_MSG_08221_041 = 0x00141261, //!< Bowling: Picking Up Spares\n Earned a gold medal! + SP_MSG_08221_042 = 0x00141262, //!< Bowling: Picking Up Spares\n Earned a silver medal! + SP_MSG_08221_043 = 0x00141263, //!< Bowling: Picking Up Spares\n Earned a bronze medal! + SP_MSG_08221_044 = 0x00141264, //!< Bowling: Power Throws\n Earned a platinum medal! + SP_MSG_08221_045 = 0x00141265, //!< Bowling: Power Throws\n Earned a gold medal! + SP_MSG_08221_046 = 0x00141266, //!< Bowling: Power Throws\n Earned a silver medal! + SP_MSG_08221_047 = 0x00141267, //!< Bowling: Power Throws\n Earned a bronze medal! + SP_MSG_08221_048 = 0x00141268, //!< Bowling: Spin Control\n Earned a platinum medal! + SP_MSG_08221_049 = 0x00141269, //!< Bowling: Spin Control\n Earned a gold medal! + SP_MSG_08221_050 = 0x00141270, //!< Bowling: Spin Control\n Earned a silver medal! + SP_MSG_08221_051 = 0x00141271, //!< Bowling: Spin Control\n Earned a bronze medal! + SP_MSG_08221_060 = 0x00141280, //!< Golf: Putting \n Earned a platinum medal! + SP_MSG_08221_061 = 0x00141281, //!< Golf: Putting \n Earned a gold medal! + SP_MSG_08221_062 = 0x00141282, //!< Golf: Putting \n Earned a silver medal! + SP_MSG_08221_063 = 0x00141283, //!< Golf: Putting \n Earned a bronze medal! + SP_MSG_08221_064 = 0x00141284, //!< Golf: Hitting the Green\n Earned a platinum medal! + SP_MSG_08221_065 = 0x00141285, //!< Golf: Hitting the Green\n Earned a gold medal! + SP_MSG_08221_066 = 0x00141286, //!< Golf: Hitting the Green\n Earned a silver medal! + SP_MSG_08221_067 = 0x00141287, //!< Golf: Hitting the Green\n Earned a bronze medal! + SP_MSG_08221_068 = 0x00141288, //!< Golf: Target Practice\n Earned a platinum medal! + SP_MSG_08221_069 = 0x00141289, //!< Golf: Target Practice\n Earned a gold medal! + SP_MSG_08221_070 = 0x00141290, //!< Golf: Target Practice\n Earned a silver medal! + SP_MSG_08221_071 = 0x00141291, //!< Golf: Target Practice\n Earned a bronze medal! + SP_MSG_08221_080 = 0x001412A0, //!< Boxing: Working the Bag\n Earned a platinum medal! + SP_MSG_08221_081 = 0x001412A1, //!< Boxing: Working the Bag\n Earned a gold medal! + SP_MSG_08221_082 = 0x001412A2, //!< Boxing: Working the Bag\n Earned a silver medal! + SP_MSG_08221_083 = 0x001412A3, //!< Boxing: Working the Bag\n Earned a bronze medal! + SP_MSG_08221_084 = 0x001412A4, //!< Boxing: Dodging\n Earned a platinum medal! + SP_MSG_08221_085 = 0x001412A5, //!< Boxing: Dodging\n Earned a gold medal! + SP_MSG_08221_086 = 0x001412A6, //!< Boxing: Dodging\n Earned a silver medal! + SP_MSG_08221_087 = 0x001412A7, //!< Boxing: Dodging\n Earned a bronze medal! + SP_MSG_08221_088 = 0x001412A8, //!< Boxing: Throwing Punches\n Earned a platinum medal! + SP_MSG_08221_089 = 0x001412A9, //!< Boxing: Throwing Punches\n Earned a gold medal! + SP_MSG_08221_090 = 0x001412B0, //!< Boxing: Throwing Punches\n Earned a silver medal! + SP_MSG_08221_091 = 0x001412B1, //!< Boxing: Throwing Punches\n Earned a bronze medal! + SP_MSG_08300_000 = 0x000206C0, //!< The following player has been\nadded to the player list:\n{000001}{000000}\n\nIf you erase this Mii from the\nMii Channel, it will be deleted\nfrom your player list, so be\ncareful. + SP_MSG_08310_000 = 0x00020760, //!< The following player has become\na tennis pro:\n{000001}{000000} + SP_MSG_08310_010 = 0x001449D0, //!< The following player has become\na baseball pro:\n{000001}{000000} + SP_MSG_08310_020 = 0x001449E0, //!< The following player has become\na bowling pro:\n{000001}{000000} + SP_MSG_08310_030 = 0x001449F0, //!< The following player has become\na golf pro:\n{000001}{000000} + SP_MSG_08310_040 = 0x00144A00, //!< The following player has become\na boxing pro:\n{000001}{000000} + SP_MSG_08311_000 = 0x00020770, //!< The following player has lost\nthe title of tennis pro:\n{000001}{000000} + SP_MSG_08311_010 = 0x00144A70, //!< The following player has lost\nthe title of baseball pro:\n{000001}{000000} + SP_MSG_08311_020 = 0x00144A80, //!< The following player has lost\nthe title of bowling pro:\n{000001}{000000} + SP_MSG_08311_030 = 0x00144A90, //!< The following player has lost\nthe title of golf pro:\n{000001}{000000} + SP_MSG_08311_040 = 0x00144AA0, //!< The following player has lost\nthe title of boxing pro:\n{000001}{000000} + SP_MSG_08312_020 = 0x00144B20, //!< The following player has set a\nnew personal best in bowling:\n{000001}{000000} + SP_MSG_08312_030 = 0x00144B30, //!< The following player has set a\nnew personal best in three-hole\ngolf at the beginner level:\n{000001}{000000} + SP_MSG_08312_031 = 0x00144B31, //!< The following player has set a\nnew personal best in three-hole\ngolf at the intermediate level:\n{000001}{000000} + SP_MSG_08312_032 = 0x00144B32, //!< The following player has set a\nnew personal best in three-hole\ngolf at the expert level:\n{000001}{000000} + SP_MSG_08312_033 = 0x00144B33, //!< The following player has set a\nnew personal best in nine-hole\ngolf:\n{000001}{000000} + SP_MSG_08313_000 = 0x00020790, //!< {000001}{000000} beat\ntennis pro {000000}. + SP_MSG_08313_010 = 0x00144BB0, //!< {000001}{000000} beat\nbaseball pro {000000}. + SP_MSG_08313_040 = 0x00144BE0, //!< {000001}{000000} beat\nboxing pro {000000}. + SP_MSG_08314_030 = 0x00144C70, //!< The following player hit a hole\nin one on the first hole in golf:\n{000001}{000000} + SP_MSG_08314_031 = 0x00144C71, //!< The following player hit a hole\nin one on the second hole in\ngolf:\n{000001}{000000} + SP_MSG_08314_032 = 0x00144C72, //!< The following player hit a hole\nin one on the third hole in\ngolf:\n{000001}{000000} + SP_MSG_08314_033 = 0x00144C73, //!< The following player hit a hole\nin one on the fourth hole in\ngolf:\n{000001}{000000} + SP_MSG_08314_034 = 0x00144C74, //!< The following player hit a hole\nin one on the fifth hole in\ngolf:\n{000001}{000000} + SP_MSG_08314_035 = 0x00144C75, //!< The following player hit a hole\nin one on the sixth hole in\ngolf:\n{000001}{000000} + SP_MSG_08314_036 = 0x00144C76, //!< The following player hit a hole\nin one on the seventh hole in\ngolf:\n{000001}{000000} + SP_MSG_08314_037 = 0x00144C77, //!< The following player hit a hole\nin one on the eighth hole in\ngolf:\n{000001}{000000} + SP_MSG_08314_038 = 0x00144C78, //!< The following player hit a hole\nin one on the nine hole in golf:\n{000001}{000000} + SP_MSG_08314_050 = 0x00144C90, //!< {000001}{000000} bowled\na perfect game. + SP_MSG_08319_000 = 0x000207F0, //!< Score: {000000} ⇒ {000000} + SP_MSG_08320_000 = 0x00020800, //!< The following player has set a\nnew personal best in Tennis:\nTarget Practice:\n{000001}{000000} + SP_MSG_08320_001 = 0x00020801, //!< The following player has set a\nnew personal best in Tennis:\nTiming Your Swing:\n{000001}{000000} + SP_MSG_08320_002 = 0x00020802, //!< The following player has set a\nnew personal best in Tennis:\nReturning Balls:\n{000001}{000000} + SP_MSG_08320_010 = 0x00145010, //!< The following player has set a\nnew personal best in Baseball:\nHitting Home Runs:\n{000001}{000000} + SP_MSG_08320_011 = 0x00145011, //!< The following player has set a\nnew personal best in Baseball:\nSwing Control:\n{000001}{000000} + SP_MSG_08320_012 = 0x00145012, //!< The following player has set a\nnew personal best in Baseball:\nBatting Practice:\n{000001}{000000} + SP_MSG_08320_020 = 0x00145020, //!< The following player has set a\nnew personal best in Bowling:\nPicking Up Spares:\n{000001}{000000} + SP_MSG_08320_021 = 0x00145021, //!< The following player has set a\nnew personal best in Bowling:\nPower Throws:\n{000001}{000000} + SP_MSG_08320_022 = 0x00145022, //!< The following player has set a\nnew personal best in Bowling:\nSpin Control:\n{000001}{000000} + SP_MSG_08320_030 = 0x00145030, //!< The following player has set a\nnew personal best in Golf:\nPutting:\n{000001}{000000} + SP_MSG_08320_031 = 0x00145031, //!< The following player has set a\nnew personal best in Golf:\nHitting the Green:\n{000001}{000000} + SP_MSG_08320_032 = 0x00145032, //!< The following player has set a\nnew personal best in Golf:\nTarget Practice:\n{000001}{000000} + SP_MSG_08320_040 = 0x00145040, //!< The following player has set a\nnew personal best in Boxing:\nWorking the Bag:\n{000001}{000000} + SP_MSG_08320_041 = 0x00145041, //!< The following player has set a\nnew personal best in Boxing:\nDodging:\n{000001}{000000} + SP_MSG_08320_042 = 0x00145042, //!< The following player has set a\nnew personal best in Boxing:\nThrowing Punches:\n{000001}{000000} + SP_MSG_08321_000 = 0x00020810, //!< The following player has earned\na platinum medal in Tennis:\nTarget Practice:\n{000001}{000000} + SP_MSG_08321_001 = 0x00020811, //!< The following player has earned\na gold medal in Tennis:\nTarget Practice:\n{000001}{000000} + SP_MSG_08321_002 = 0x00020812, //!< The following player has earned\na silver medal in Tennis:\nTarget Practice:\n{000001}{000000} + SP_MSG_08321_003 = 0x00020813, //!< The following player has earned\na bronze medal in Tennis:\nTarget Practice:\n{000001}{000000} + SP_MSG_08321_004 = 0x00020814, //!< The following player has earned\na platinum medal in Tennis:\nTiming Your Swing:\n{000001}{000000} + SP_MSG_08321_005 = 0x00020815, //!< The following player has earned\na gold medal in Tennis:\nTiming Your Swing:\n{000001}{000000} + SP_MSG_08321_006 = 0x00020816, //!< The following player has earned\na silver medal in Tennis:\nTiming Your Swing:\n{000001}{000000} + SP_MSG_08321_007 = 0x00020817, //!< The following player has earned\na bronze medal in Tennis:\nTiming Your Swing:\n{000001}{000000} + SP_MSG_08321_008 = 0x00020818, //!< The following player has earned\na platinum medal in Tennis:\nReturning Balls:\n{000001}{000000} + SP_MSG_08321_009 = 0x00020819, //!< The following player has earned\na gold medal in Tennis:\nReturning Balls:\n{000001}{000000} + SP_MSG_08321_010 = 0x001450B0, //!< The following player has earned\na silver medal in Tennis:\nReturning Balls:\n{000001}{000000} + SP_MSG_08321_011 = 0x001450B1, //!< The following player has earned\na bronze medal in Tennis:\nReturning Balls:\n{000001}{000000} + SP_MSG_08321_020 = 0x001450C0, //!< The following player has earned\na platinum medal in Baseball:\nHitting Home Runs:\n{000001}{000000} + SP_MSG_08321_021 = 0x001450C1, //!< The following player has earned\na gold medal in Baseball:\nHitting Home Runs:\n{000001}{000000} + SP_MSG_08321_022 = 0x001450C2, //!< The following player has earned\na silver medal in Baseball:\nHitting Home Runs:\n{000001}{000000} + SP_MSG_08321_023 = 0x001450C3, //!< The following player has earned\na bronze medal in Baseball:\nHitting Home Runs:\n{000001}{000000} + SP_MSG_08321_024 = 0x001450C4, //!< The following player has earned\na platinum medal in Baseball:\nSwing Control:\n{000001}{000000} + SP_MSG_08321_025 = 0x001450C5, //!< The following player has earned\na gold medal in Baseball:\nSwing Control:\n{000001}{000000} + SP_MSG_08321_026 = 0x001450C6, //!< The following player has earned\na silver medal in Baseball:\nSwing Control:\n{000001}{000000} + SP_MSG_08321_027 = 0x001450C7, //!< The following player has earned\na bronze medal in Baseball:\nSwing Control:\n{000001}{000000} + SP_MSG_08321_028 = 0x001450C8, //!< The following player has earned\na platinum medal in Baseball:\nBatting Practice:\n{000001}{000000} + SP_MSG_08321_029 = 0x001450C9, //!< The following player has earned\na gold medal in Baseball:\nBatting Practice:\n{000001}{000000} + SP_MSG_08321_030 = 0x001450D0, //!< The following player has earned\na silver medal in Baseball:\nBatting Practice:\n{000001}{000000} + SP_MSG_08321_031 = 0x001450D1, //!< The following player has earned\na bronze medal in Baseball:\nBatting Practice:\n{000001}{000000} + SP_MSG_08321_040 = 0x001450E0, //!< The following player has earned\na platinum medal in Bowling:\nPicking Up Spares:\n{000001}{000000} + SP_MSG_08321_041 = 0x001450E1, //!< The following player has earned\na gold medal in Bowling:\nPicking Up Spares:\n{000001}{000000} + SP_MSG_08321_042 = 0x001450E2, //!< The following player has earned\na silver medal in Bowling:\nPicking Up Spares:\n{000001}{000000} + SP_MSG_08321_043 = 0x001450E3, //!< The following player has earned\na bronze medal in Bowling:\nPicking Up Spares:\n{000001}{000000} + SP_MSG_08321_044 = 0x001450E4, //!< The following player has earned\na platinum medal in Bowling:\nPower Throws:\n{000001}{000000} + SP_MSG_08321_045 = 0x001450E5, //!< The following player has earned\na gold medal in Bowling:\nPower Throws:\n{000001}{000000} + SP_MSG_08321_046 = 0x001450E6, //!< The following player has earned\na silver medal in Bowling:\nPower Throws:\n{000001}{000000} + SP_MSG_08321_047 = 0x001450E7, //!< The following player has earned\na bronze medal in Bowling:\nPower Throws:\n{000001}{000000} + SP_MSG_08321_048 = 0x001450E8, //!< The following player has earned\na platinum medal in Bowling:\nSpin Control:\n{000001}{000000} + SP_MSG_08321_049 = 0x001450E9, //!< The following player has earned\na gold medal in Bowling:\nSpin Control:\n{000001}{000000} + SP_MSG_08321_050 = 0x001450F0, //!< The following player has earned\na silver medal in Bowling:\nSpin Control:\n{000001}{000000} + SP_MSG_08321_051 = 0x001450F1, //!< The following player has earned\na bronze medal in Bowling:\nSpin Control:\n{000001}{000000} + SP_MSG_08321_060 = 0x00145100, //!< The following player has earned\na platinum medal in Golf:\nPutting:\n{000001}{000000} + SP_MSG_08321_061 = 0x00145101, //!< The following player has earned\na gold medal in Golf:\nPutting:\n{000001}{000000} + SP_MSG_08321_062 = 0x00145102, //!< The following player has earned\na silver medal in Golf:\nPutting:\n{000001}{000000} + SP_MSG_08321_063 = 0x00145103, //!< The following player has earned\na bronze medal in Golf:\nPutting:\n{000001}{000000} + SP_MSG_08321_064 = 0x00145104, //!< The following player has earned\na platinum medal in Golf:\nHitting the Green:\n{000001}{000000} + SP_MSG_08321_065 = 0x00145105, //!< The following player has earned\na gold medal in Golf:\nHitting the Green:\n{000001}{000000} + SP_MSG_08321_066 = 0x00145106, //!< The following player has earned\na silver medal in Golf:\nHitting the Green:\n{000001}{000000} + SP_MSG_08321_067 = 0x00145107, //!< The following player has earned\na bronze medal in Golf:\nHitting the Green:\n{000001}{000000} + SP_MSG_08321_068 = 0x00145108, //!< The following player has earned\na platinum medal in Golf:\nTarget Practice:\n{000001}{000000} + SP_MSG_08321_069 = 0x00145109, //!< The following player has earned\na gold medal in Golf:\nTarget Practice:\n{000001}{000000} + SP_MSG_08321_070 = 0x00145110, //!< The following player has earned\na silver medal in Golf:\nTarget Practice:\n{000001}{000000} + SP_MSG_08321_071 = 0x00145111, //!< The following player has earned\na bronze medal in Golf:\nTarget Practice:\n{000001}{000000} + SP_MSG_08321_080 = 0x00145120, //!< The following player has earned\na platinum medal in Boxing:\nWorking the Bag:\n{000001}{000000} + SP_MSG_08321_081 = 0x00145121, //!< The following player has earned\na gold medal in Boxing:\nWorking the Bag:\n{000001}{000000} + SP_MSG_08321_082 = 0x00145122, //!< The following player has earned\na silver medal in Boxing:\nWorking the Bag:\n{000001}{000000} + SP_MSG_08321_083 = 0x00145123, //!< The following player has earned\na bronze medal in Boxing:\nWorking the Bag:\n{000001}{000000} + SP_MSG_08321_084 = 0x00145124, //!< The following player has earned\na platinum medal in Boxing:\nDodging:\n{000001}{000000} + SP_MSG_08321_085 = 0x00145125, //!< The following player has earned\na gold medal in Boxing:\nDodging:\n{000001}{000000} + SP_MSG_08321_086 = 0x00145126, //!< The following player has earned\na silver medal in Boxing:\nDodging:\n{000001}{000000} + SP_MSG_08321_087 = 0x00145127, //!< The following player has earned\na bronze medal in Boxing:\nDodging:\n{000001}{000000} + SP_MSG_08321_088 = 0x00145128, //!< The following player has earned\na platinum medal in Boxing:\nThrowing Punches:\n{000001}{000000} + SP_MSG_08321_089 = 0x00145129, //!< The following player has earned\na gold medal in Boxing:\nThrowing Punches:\n{000001}{000000} + SP_MSG_08321_090 = 0x00145130, //!< The following player has earned\na silver medal in Boxing:\nThrowing Punches:\n{000001}{000000} + SP_MSG_08321_091 = 0x00145131, //!< The following player has earned\na bronze medal in Boxing:\nThrowing Punches:\n{000001}{000000} + SP_MSG_08329_000 = 0x00020890, //!< Score: {000000} ⇒ {000000} + SP_MSG_08329_001 = 0x00020891, //!< Score:\n{000000} {000000} ({000000} {000000})\n⇒ {000000} {000000} ({000000} {000000}) + SP_MSG_08329_002 = 0x00020892, //!< Score: {000000} ft ⇒ {000000} ft + SP_MSG_08330_000 = 0x000208A0, //!< The following player has earned\ngold medals in all training\ngames:\n{000001}{000000} + SP_MSG_08331_000 = 0x000208B0, //!< The following player has earned\nplatinum medals in all training\ngames:\n{000001}{000000} + SP_MSG_08340_000 = 0x00020940, //!< Today's Wii Fitness results for\n{000001}{000000}: + SP_MSG_08341_000 = 0x00020950, //!<        {000000} + SP_MSG_08342_000 = 0x00020960, //!< Wow! You've taken off {000000} {000000}! + SP_MSG_08342_001 = 0x00020961, //!< Wow! You've taken off {000000} {000000}! + SP_MSG_08342_002 = 0x00020962, //!< Oh, no! You've added {000000} {000000}! + SP_MSG_08342_003 = 0x00020963, //!< Oh, no! You've added {000000} {000000}! + SP_MSG_08510_000 = 0x000213E0, //!< Tennis Info + SP_MSG_08510_005 = 0x000213E5, //!< Skill level\n {000000} + SP_MSG_08510_006 = 0x000213E6, //!< Debuted on\n {000000} + SP_MSG_08510_007 = 0x000213E7, //!< Games played\n {000000} {000000} + SP_MSG_08510_010 = 0x0014C6D0, //!< Baseball Info + SP_MSG_08510_015 = 0x0014C6D5, //!< Skill level\n {000000} + SP_MSG_08510_016 = 0x0014C6D6, //!< Debuted on\n {000000} + SP_MSG_08510_017 = 0x0014C6D7, //!< Games played\n {000000} + SP_MSG_08510_020 = 0x0014C6E0, //!< Bowling Info + SP_MSG_08510_025 = 0x0014C6E5, //!< Skill level\n {000000} + SP_MSG_08510_026 = 0x0014C6E6, //!< Debuted on\n {000000} + SP_MSG_08510_027 = 0x0014C6E7, //!< Games played\n {000000} + SP_MSG_08510_030 = 0x0014C6F0, //!< Golf Info + SP_MSG_08510_035 = 0x0014C6F5, //!< Skill level\n {000000} + SP_MSG_08510_036 = 0x0014C6F6, //!< Debuted on\n {000000} + SP_MSG_08510_037 = 0x0014C6F7, //!< Games played\n {000000} {000000} + SP_MSG_08510_040 = 0x0014C700, //!< Boxing Info + SP_MSG_08510_045 = 0x0014C705, //!< Skill level\n {000000} + SP_MSG_08510_046 = 0x0014C706, //!< Debuted on\n {000000} + SP_MSG_08510_047 = 0x0014C707, //!< Matches fought\n {000000} + SP_MSG_08511_000 = 0x000213F0, //!< Tennis Info + SP_MSG_08511_005 = 0x000213F5, //!< Skill level\n {000000} + SP_MSG_08511_006 = 0x000213F6, //!< Debuted on\n {000000} + SP_MSG_08511_007 = 0x000213F7, //!< Games played\n {000000} {000000} + SP_MSG_08511_010 = 0x0014C770, //!< Baseball Info + SP_MSG_08511_015 = 0x0014C775, //!< Skill level\n {000000} + SP_MSG_08511_016 = 0x0014C776, //!< Debuted on\n {000000} + SP_MSG_08511_017 = 0x0014C777, //!< Games played\n {000000} + SP_MSG_08511_020 = 0x0014C780, //!< Bowling Info + SP_MSG_08511_025 = 0x0014C785, //!< Skill level\n {000000} + SP_MSG_08511_026 = 0x0014C786, //!< Debuted on\n {000000} + SP_MSG_08511_027 = 0x0014C787, //!< Games played\n {000000} + SP_MSG_08511_030 = 0x0014C790, //!< Golf Info + SP_MSG_08511_035 = 0x0014C795, //!< Skill level\n {000000} + SP_MSG_08511_036 = 0x0014C796, //!< Debuted on\n {000000} + SP_MSG_08511_037 = 0x0014C797, //!< Games played\n {000000} {000000} + SP_MSG_08511_040 = 0x0014C7A0, //!< Boxing Info + SP_MSG_08511_045 = 0x0014C7A5, //!< Skill level\n {000000} + SP_MSG_08511_046 = 0x0014C7A6, //!< Debuted on\n {000000} + SP_MSG_08511_047 = 0x0014C7A7, //!< Matches fought\n {000000} + SP_MSG_08512_020 = 0x0014C820, //!< Bowling Info + SP_MSG_08512_025 = 0x0014C825, //!< Skill level\n {000000} + SP_MSG_08512_026 = 0x0014C826, //!< Debuted on\n {000000} + SP_MSG_08512_027 = 0x0014C827, //!< Games played\n {000000} + SP_MSG_08512_030 = 0x0014C830, //!< Golf Info + SP_MSG_08512_035 = 0x0014C835, //!< Skill level\n {000000} + SP_MSG_08512_036 = 0x0014C836, //!< Debuted on\n {000000} + SP_MSG_08512_037 = 0x0014C837, //!< Games played\n {000000} {000000} + SP_MSG_08513_000 = 0x00021410, //!< Tennis Info + SP_MSG_08513_005 = 0x00021415, //!< Skill level\n {000000} + SP_MSG_08513_006 = 0x00021416, //!< Debuted on\n {000000} + SP_MSG_08513_007 = 0x00021417, //!< Matches played\n {000000} + SP_MSG_08513_010 = 0x0014C8B0, //!< Baseball Info + SP_MSG_08513_040 = 0x0014C8E0, //!< Boxing Info + SP_MSG_08514_000 = 0x00021420, //!< Holes in one: {000000} + SP_MSG_08514_001 = 0x00021421, //!< Perfect games: {000000} + SP_MSG_08520_000 = 0x00021480, //!< Training Info + SP_MSG_08520_001 = 0x00021481, //!< Medal earned\n Platinum + SP_MSG_08520_002 = 0x00021482, //!< Medal earned\n Gold + SP_MSG_08520_003 = 0x00021483, //!< Medal earned\n Silver + SP_MSG_08520_004 = 0x00021484, //!< Medal earned\n Bronze + SP_MSG_08520_005 = 0x00021485, //!< Began training on\n {000000} + SP_MSG_08520_006 = 0x00021486, //!< Total training sessions\n {000000} + SP_MSG_08521_000 = 0x00021490, //!< Training Info + SP_MSG_08521_001 = 0x00021491, //!< Personal best\n {000000} + SP_MSG_08521_002 = 0x00021492, //!< Personal best\n {000000} {000000} ({000000} {000000}) + SP_MSG_08521_003 = 0x00021493, //!< Personal best\n {000000} ft + SP_MSG_08521_005 = 0x00021495, //!< Began training on\n {000000} + SP_MSG_08521_006 = 0x00021496, //!< Total training sessions\n {000000} + SP_MSG_08530_000 = 0x00021520, //!< Wii Fitness Info + SP_MSG_08530_001 = 0x00021521, //!< Date of this Wii Fitness test:\n {000000} + SP_MSG_08530_002 = 0x00021522, //!< Date of first Wii Fitness test:\n {000000} + SP_MSG_08530_003 = 0x00021523, //!< Total tests completed:\n {000000} + SP_MSG_08530_004 = 0x00021524, //!< Wii Fitness\n\nMeasure your skill in Wii\nSports. Your test results appear\nas a Wii Fitness Age, with 20\nbeing the best possible age.\n\nBecause these tests are designed\nfor adults, children may not\nget accurate test results. + SP_MSG_08900_000 = 0x00022C40, //!< Wii Sports News\n + SP_MSG_08901_000 = 0x00022C50, //!< {000000} + SP_MSG_08902_000 = 0x00022C60, //!< + SP_MSG_08903_000 = 0x00022C70, //!< 【PRO】 + SP_MSG_08910_000 = 0x00022CE0, //!< + SP_MSG_08910_001 = 0x00022CE1, //!< + SP_MSG_08911_000 = 0x00022CF0, //!< set + SP_MSG_08911_001 = 0x00022CF1, //!< sets + SP_MSG_08912_000 = 0x00022D00, //!< hole + SP_MSG_08912_001 = 0x00022D01, //!< holes + SP_MSG_08913_000 = 0x00022D10, //!< homer + SP_MSG_08913_001 = 0x00022D11, //!< homers + SP_MSG_08914_000 = 0x00022D20, //!< ft + SP_MSG_08915_000 = 0x00022D30, //!< + SP_MSG_08916_000 = 0x00022D40, //!< years + SP_MSG_08916_001 = 0x00022D41, //!< year + SP_MSG_09999_000 = 0x000270F0, //!< + SP_MSG_19000_000 = 0x0004A380, //!< Saburo + SP_MSG_19000_001 = 0x0004A381, //!< Hiroshi + SP_MSG_19000_002 = 0x0004A382, //!< Daisuke + SP_MSG_19000_003 = 0x0004A383, //!< Shinnosuke + SP_MSG_19000_004 = 0x0004A384, //!< Akira + SP_MSG_19000_005 = 0x0004A385, //!< Tatsuaki + SP_MSG_19000_006 = 0x0004A386, //!< Shouta + SP_MSG_19000_007 = 0x0004A387, //!< Ren + SP_MSG_19000_008 = 0x0004A388, //!< Kentaro + SP_MSG_19000_009 = 0x0004A389, //!< Takumi + SP_MSG_19000_010 = 0x002E6310, //!< Haru + SP_MSG_19000_011 = 0x002E6311, //!< Yoshi + SP_MSG_19000_012 = 0x002E6312, //!< Fumiko + SP_MSG_19000_013 = 0x002E6313, //!< Keiko + SP_MSG_19000_014 = 0x002E6314, //!< Yoko + SP_MSG_19000_015 = 0x002E6315, //!< Miyu + SP_MSG_19000_016 = 0x002E6316, //!< Ai + SP_MSG_19000_017 = 0x002E6317, //!< Misaki + SP_MSG_19000_018 = 0x002E6318, //!< Rin + SP_MSG_19000_019 = 0x002E6319, //!< Sakura + SP_MSG_19000_020 = 0x002E6320, //!< Andy + SP_MSG_19000_021 = 0x002E6321, //!< Chris + SP_MSG_19000_022 = 0x002E6322, //!< Ryan + SP_MSG_19000_023 = 0x002E6323, //!< Jake + SP_MSG_19000_024 = 0x002E6324, //!< Matt + SP_MSG_19000_025 = 0x002E6325, //!< Mike + SP_MSG_19000_026 = 0x002E6326, //!< Nick + SP_MSG_19000_027 = 0x002E6327, //!< Oscar + SP_MSG_19000_028 = 0x002E6328, //!< Theo + SP_MSG_19000_029 = 0x002E6329, //!< Tyrone + SP_MSG_19000_030 = 0x002E6330, //!< Abby + SP_MSG_19000_031 = 0x002E6331, //!< Ashley + SP_MSG_19000_032 = 0x002E6332, //!< Emily + SP_MSG_19000_033 = 0x002E6333, //!< Hayley + SP_MSG_19000_034 = 0x002E6334, //!< Jackie + SP_MSG_19000_035 = 0x002E6335, //!< Jessie + SP_MSG_19000_036 = 0x002E6336, //!< Maria + SP_MSG_19000_037 = 0x002E6337, //!< Naomi + SP_MSG_19000_038 = 0x002E6338, //!< Rachel + SP_MSG_19000_039 = 0x002E6339, //!< Steph + SP_MSG_19000_040 = 0x002E6340, //!< James + SP_MSG_19000_041 = 0x002E6341, //!< Steve + SP_MSG_19000_042 = 0x002E6342, //!< Michael + SP_MSG_19000_043 = 0x002E6343, //!< Martin + SP_MSG_19000_044 = 0x002E6344, //!< Pierre + SP_MSG_19000_045 = 0x002E6345, //!< Alex + SP_MSG_19000_046 = 0x002E6346, //!< Luca + SP_MSG_19000_047 = 0x002E6347, //!< Marco + SP_MSG_19000_048 = 0x002E6348, //!< David + SP_MSG_19000_049 = 0x002E6349, //!< Víctor + SP_MSG_19000_050 = 0x002E6350, //!< Sarah + SP_MSG_19000_051 = 0x002E6351, //!< Helen + SP_MSG_19000_052 = 0x002E6352, //!< Kathrin + SP_MSG_19000_053 = 0x002E6353, //!< Silke + SP_MSG_19000_054 = 0x002E6354, //!< Emma + SP_MSG_19000_055 = 0x002E6355, //!< Julie + SP_MSG_19000_056 = 0x002E6356, //!< Anna + SP_MSG_19000_057 = 0x002E6357, //!< Elisa + SP_MSG_19000_058 = 0x002E6358, //!< Eva + SP_MSG_19000_059 = 0x002E6359, //!< Lucía + SP_MSG_20000_000 = 0x0004E200, //!< + SP_MSG_20000_001 = 0x0004E201, //!< + SP_MSG_20000_002 = 0x0004E202, //!< + SP_MSG_20001_000 = 0x0004E210, //!< + SP_MSG_20001_001 = 0x0004E211, //!< + SP_MSG_20001_002 = 0x0004E212, //!< + SP_MSG_20001_003 = 0x0004E213, //!< + SP_MSG_20002_000 = 0x0004E220, //!< + SP_MSG_20010_000 = 0x0004E2A0, //!< + SP_MSG_20010_001 = 0x0004E2A1, //!< + SP_MSG_20020_000 = 0x0004E340, //!< + SP_MSG_20020_001 = 0x0004E341, //!< + SP_MSG_20020_002 = 0x0004E342, //!< + SP_MSG_20020_003 = 0x0004E343, //!< + SP_MSG_20020_004 = 0x0004E344, //!< + SP_MSG_20020_005 = 0x0004E345, //!< + SP_MSG_20020_006 = 0x0004E346, //!< + SP_MSG_20021_000 = 0x0004E350, //!< + SP_MSG_20021_001 = 0x0004E351, //!< + SP_MSG_20021_002 = 0x0004E352, //!< + SP_MSG_20021_003 = 0x0004E353, //!< + SP_MSG_20021_004 = 0x0004E354, //!< + SP_MSG_20021_005 = 0x0004E355, //!< + SP_MSG_20021_006 = 0x0004E356, //!< + SP_MSG_20021_007 = 0x0004E357, //!< + SP_MSG_20021_008 = 0x0004E358, //!< + SP_MSG_20021_009 = 0x0004E359, //!< + SP_MSG_20021_010 = 0x0030E130, //!< + SP_MSG_20021_011 = 0x0030E131, //!< + SP_MSG_20022_000 = 0x0004E360, //!< + SP_MSG_20022_001 = 0x0004E361, //!< + SP_MSG_20022_002 = 0x0004E362, //!< + SP_MSG_20022_003 = 0x0004E363, //!< + SP_MSG_20030_000 = 0x0004E3E0, //!< + SP_MSG_20030_001 = 0x0004E3E1, //!< + SP_MSG_20030_002 = 0x0004E3E2, //!< + SP_MSG_20030_003 = 0x0004E3E3, //!< + SP_MSG_20030_004 = 0x0004E3E4, //!< + SP_MSG_20030_005 = 0x0004E3E5, //!< + SP_MSG_20030_006 = 0x0004E3E6, //!< + SP_MSG_20030_007 = 0x0004E3E7, //!< + SP_MSG_20031_000 = 0x0004E3F0, //!< + SP_MSG_20031_001 = 0x0004E3F1, //!< + SP_MSG_20031_002 = 0x0004E3F2, //!< + SP_MSG_20031_003 = 0x0004E3F3, //!< + SP_MSG_20031_004 = 0x0004E3F4, //!< + SP_MSG_20040_000 = 0x0004E480, //!< + SP_MSG_20050_000 = 0x0004E520, //!< + SP_MSG_20051_000 = 0x0004E530, //!< + SP_MSG_20060_000 = 0x0004E5C0, //!< + SP_MSG_20061_000 = 0x0004E5D0, //!< + SP_MSG_20061_001 = 0x0004E5D1, //!< + SP_MSG_20061_002 = 0x0004E5D2, //!< + SP_MSG_20062_000 = 0x0004E5E0, //!< + SP_MSG_20063_000 = 0x0004E5F0, //!< + SP_MSG_20063_001 = 0x0004E5F1, //!< + SP_MSG_20063_002 = 0x0004E5F2, //!< + SP_MSG_20063_003 = 0x0004E5F3, //!< + SP_MSG_20063_004 = 0x0004E5F4, //!< + SP_MSG_20064_000 = 0x0004E600, //!< + SP_MSG_20070_000 = 0x0004E660, //!< + SP_MSG_20071_000 = 0x0004E670, //!< + SP_MSG_20072_000 = 0x0004E680, //!< + SP_MSG_20080_000 = 0x0004E700, //!< + SP_MSG_20080_001 = 0x0004E701, //!< + SP_MSG_21000_000 = 0x00052080, //!< + SP_MSG_21010_000 = 0x00052120, //!< + SP_MSG_21010_001 = 0x00052121, //!< + SP_MSG_21010_002 = 0x00052122, //!< + SP_MSG_21010_003 = 0x00052123, //!< + SP_MSG_21010_004 = 0x00052124, //!< + SP_MSG_21011_000 = 0x00052130, //!< + SP_MSG_21011_001 = 0x00052131, //!< + SP_MSG_21020_000 = 0x000521C0, //!< + SP_MSG_21020_001 = 0x000521C1, //!< + SP_MSG_21020_002 = 0x000521C2, //!< + SP_MSG_21030_000 = 0x00052260, //!< + SP_MSG_21100_000 = 0x000526C0, //!< Server + SP_MSG_21110_000 = 0x00052760, //!< Miss + SP_MSG_21120_000 = 0x00052800, //!< Let + SP_MSG_21120_001 = 0x00052801, //!< Out + SP_MSG_21120_002 = 0x00052802, //!< Miss + SP_MSG_21120_003 = 0x00052803, //!< 2nd Bounce + SP_MSG_21130_000 = 0x000528A0, //!< 00 + SP_MSG_21130_001 = 0x000528A1, //!< 15 + SP_MSG_21130_002 = 0x000528A2, //!< 30 + SP_MSG_21130_003 = 0x000528A3, //!< 40 + SP_MSG_21130_004 = 0x000528A4, //!< Adv. + SP_MSG_21131_000 = 0x000528B0, //!< - + SP_MSG_21132_000 = 0x000528C0, //!< Deuce + SP_MSG_21132_001 = 0x000528C1, //!< Game + SP_MSG_21140_000 = 0x00052940, //!< Advantage + SP_MSG_21141_000 = 0x00052950, //!< Deuce + SP_MSG_21141_001 = 0x00052951, //!< Game Point + SP_MSG_21141_002 = 0x00052952, //!< Break Point + SP_MSG_21141_003 = 0x00052953, //!< Match Point + SP_MSG_21150_000 = 0x000529E0, //!< {000001} + SP_MSG_21200_000 = 0x00052D00, //!< Choose positions and press \uE042. + SP_MSG_21210_000 = 0x00052DA0, //!< Single Game + SP_MSG_21211_000 = 0x00052DB0, //!< Best of 3 + SP_MSG_21212_000 = 0x00052DC0, //!< Best of 5 + SP_MSG_21220_000 = 0x00052E40, //!< Start + SP_MSG_21230_000 = 0x00052EE0, //!< {000001}{000000}\nSkill Level: {000000} + SP_MSG_21240_000 = 0x00052F80, //!< ? + SP_MSG_21300_000 = 0x00053340, //!< {000000} + SP_MSG_21310_000 = 0x000533E0, //!< pt + SP_MSG_21310_001 = 0x000533E1, //!< pts + SP_MSG_21500_000 = 0x00053FC0, //!< {000000} + SP_MSG_21510_000 = 0x00054060, //!< Targets left + SP_MSG_21520_000 = 0x00054100, //!< Balls left + SP_MSG_22000_000 = 0x00055F00, //!< + SP_MSG_22000_001 = 0x00055F01, //!< + SP_MSG_22001_000 = 0x00055F10, //!< + SP_MSG_22001_001 = 0x00055F11, //!< + SP_MSG_22001_002 = 0x00055F12, //!< + SP_MSG_22001_003 = 0x00055F13, //!< + SP_MSG_22010_000 = 0x00055FA0, //!< + SP_MSG_22010_001 = 0x00055FA1, //!< + SP_MSG_22010_002 = 0x00055FA2, //!< + SP_MSG_22010_003 = 0x00055FA3, //!< + SP_MSG_22010_004 = 0x00055FA4, //!< + SP_MSG_22010_005 = 0x00055FA5, //!< + SP_MSG_22010_006 = 0x00055FA6, //!< + SP_MSG_22010_007 = 0x00055FA7, //!< + SP_MSG_22010_008 = 0x00055FA8, //!< + SP_MSG_22011_000 = 0x00055FB0, //!< + SP_MSG_22011_001 = 0x00055FB1, //!< + SP_MSG_22011_002 = 0x00055FB2, //!< + SP_MSG_22100_000 = 0x00056540, //!< Play Ball! + SP_MSG_22101_000 = 0x00056550, //!< Mercy Rule + SP_MSG_22110_000 = 0x000565E0, //!< Strike + SP_MSG_22110_001 = 0x000565E1, //!< Ball + SP_MSG_22110_002 = 0x000565E2, //!< Ball Four + SP_MSG_22110_003 = 0x000565E3, //!< Strikeout + SP_MSG_22120_000 = 0x00056680, //!< Foul Ball + SP_MSG_22120_001 = 0x00056681, //!< Single + SP_MSG_22120_002 = 0x00056682, //!< Double + SP_MSG_22120_003 = 0x00056683, //!< Triple + SP_MSG_22120_004 = 0x00056684, //!< Home Run + SP_MSG_22120_005 = 0x00056685, //!< Out of the Park + SP_MSG_22130_000 = 0x00056720, //!< Out + SP_MSG_22130_001 = 0x00056721, //!< Double Play + SP_MSG_22130_002 = 0x00056722, //!< Error + SP_MSG_22130_003 = 0x00056723, //!< Change + SP_MSG_22130_004 = 0x00056724, //!< Mercy Rule + SP_MSG_22140_000 = 0x000567C0, //!< Fastball + SP_MSG_22140_001 = 0x000567C1, //!< Curveball + SP_MSG_22140_002 = 0x000567C2, //!< Screwball + SP_MSG_22140_003 = 0x000567C3, //!< Splitter + SP_MSG_22150_000 = 0x00056860, //!< mph + SP_MSG_22151_000 = 0x00056870, //!< ft + SP_MSG_22151_001 = 0x00056871, //!< ft + SP_MSG_22160_000 = 0x00056900, //!< 1ST + SP_MSG_22160_001 = 0x00056901, //!< 2ND + SP_MSG_22160_002 = 0x00056902, //!< 3RD + SP_MSG_22170_000 = 0x000569A0, //!< + SP_MSG_22180_000 = 0x00056A40, //!< + SP_MSG_22180_001 = 0x00056A41, //!< + SP_MSG_22180_002 = 0x00056A42, //!< + SP_MSG_22190_000 = 0x00056AE0, //!< Vs. + SP_MSG_22191_000 = 0x00056AF0, //!< 1 + SP_MSG_22191_001 = 0x00056AF1, //!< 2 + SP_MSG_22191_002 = 0x00056AF2, //!< 3 + SP_MSG_22191_003 = 0x00056AF3, //!< R + SP_MSG_22192_000 = 0x00056B00, //!< B + SP_MSG_22192_001 = 0x00056B01, //!< S + SP_MSG_22193_002 = 0x00056B12, //!< O + SP_MSG_22200_000 = 0x00056B80, //!< {000001} + SP_MSG_22201_000 = 0x00056B90, //!< + SP_MSG_22210_000 = 0x00056C20, //!< Strikeout + SP_MSG_22210_001 = 0x00056C21, //!< Ball Four + SP_MSG_22210_002 = 0x00056C22, //!< Out + SP_MSG_22210_003 = 0x00056C23, //!< Single + SP_MSG_22210_004 = 0x00056C24, //!< Double + SP_MSG_22210_005 = 0x00056C25, //!< Triple + SP_MSG_22210_006 = 0x00056C26, //!< Home Run + SP_MSG_22210_007 = 0x00056C27, //!< Out of the Park + SP_MSG_22210_008 = 0x00056C28, //!< + SP_MSG_22220_000 = 0x00056CC0, //!< + SP_MSG_22220_001 = 0x00056CC1, //!< + SP_MSG_22220_002 = 0x00056CC2, //!< + SP_MSG_22230_000 = 0x00056D60, //!< That's the Game! + SP_MSG_22240_000 = 0x00056E00, //!< R + SP_MSG_22250_000 = 0x00056EA0, //!< Play again + SP_MSG_22251_000 = 0x00056EB0, //!< Quit + SP_MSG_22252_000 = 0x00056EC0, //!< Next + SP_MSG_22300_000 = 0x000571C0, //!< + SP_MSG_22301_000 = 0x000571D0, //!< + SP_MSG_22350_000 = 0x000574E0, //!< + SP_MSG_22400_000 = 0x00057800, //!< 10 balls + SP_MSG_22400_001 = 0x00057801, //!< 30 balls + SP_MSG_22410_000 = 0x000578A0, //!< You swung too early! + SP_MSG_22410_001 = 0x000578A1, //!< You're a tad early! + SP_MSG_22410_002 = 0x000578A2, //!< You swung too late! + SP_MSG_22410_003 = 0x000578A3, //!< You're a tad late! + SP_MSG_22420_000 = 0x00057940, //!< Home run + SP_MSG_22420_001 = 0x00057941, //!< Out of the park + SP_MSG_22450_000 = 0x00057B20, //!< + SP_MSG_22451_000 = 0x00057B30, //!< + SP_MSG_22500_000 = 0x00057E40, //!< 10 pitches + SP_MSG_22510_000 = 0x00057EE0, //!< {000000} runs + SP_MSG_22520_000 = 0x00057F80, //!< + SP_MSG_22600_000 = 0x00058480, //!< Left + SP_MSG_22601_000 = 0x00058490, //!< + SP_MSG_22610_000 = 0x00058520, //!< Hits + SP_MSG_22611_000 = 0x00058530, //!< + SP_MSG_22611_001 = 0x00058531, //!< + SP_MSG_22612_000 = 0x00058540, //!< Hit! + SP_MSG_22620_000 = 0x000585C0, //!< + SP_MSG_22621_000 = 0x000585D0, //!< + SP_MSG_22650_000 = 0x000587A0, //!< + SP_MSG_22651_000 = 0x000587B0, //!< + SP_MSG_22700_000 = 0x00058AC0, //!< Vs. + SP_MSG_22710_000 = 0x00058B60, //!< {000001}{000000} + SP_MSG_22711_000 = 0x00058B70, //!< Skill Level: {000000} + SP_MSG_22720_000 = 0x00058C00, //!< {000001}{000000} + SP_MSG_22721_000 = 0x00058C10, //!< Skill Level: {000000} + SP_MSG_22800_000 = 0x00059100, //!< Batting + SP_MSG_22801_000 = 0x00059110, //!< + SP_MSG_22810_000 = 0x000591A0, //!< How to Hold + SP_MSG_22811_000 = 0x000591B0, //!< Hold the Wii Remote so that the side\nwith the buttons is facing you. + SP_MSG_22820_000 = 0x00059240, //!< Batting + SP_MSG_22821_000 = 0x00059250, //!< Hold the Wii Remote like a bat. Swing at\npitches at the right time to hit them. + SP_MSG_22830_000 = 0x000592E0, //!< Pitching + SP_MSG_22831_000 = 0x000592F0, //!< + SP_MSG_22840_000 = 0x00059380, //!< Pitching + SP_MSG_22841_000 = 0x00059390, //!< Swing the Wii Remote overhand to pitch.\nAim your pitch with \uE041. + SP_MSG_22850_000 = 0x00059420, //!< Breaking Balls + SP_MSG_22851_000 = 0x00059430, //!< Pitch while pressing \uE042 for a screwball,\n\uE043 for a curveball, and \uE042+\uE043 for a splitter. + SP_MSG_22851_001 = 0x00059431, //!< Pitch while pressing \uE042 for a curveball,\n\uE043 for a screwball, and \uE042+\uE043 for a splitter. + SP_MSG_22860_000 = 0x000594C0, //!< Swing to pitch. + SP_MSG_23000_000 = 0x00059D80, //!< + SP_MSG_23001_000 = 0x00059D90, //!< + SP_MSG_23010_000 = 0x00059E20, //!< + SP_MSG_23011_000 = 0x00059E30, //!< + SP_MSG_23011_001 = 0x00059E31, //!< + SP_MSG_23012_000 = 0x00059E40, //!< + SP_MSG_23012_001 = 0x00059E41, //!< + SP_MSG_23012_002 = 0x00059E42, //!< + SP_MSG_23012_003 = 0x00059E43, //!< + SP_MSG_23012_004 = 0x00059E44, //!< + SP_MSG_23020_000 = 0x00059EC0, //!< + SP_MSG_23020_001 = 0x00059EC1, //!< + SP_MSG_23020_002 = 0x00059EC2, //!< + SP_MSG_23020_003 = 0x00059EC3, //!< + SP_MSG_23020_004 = 0x00059EC4, //!< + SP_MSG_23030_000 = 0x00059F60, //!< + SP_MSG_23030_001 = 0x00059F61, //!< + SP_MSG_23100_000 = 0x0005A3C0, //!< Select a course + SP_MSG_23101_000 = 0x0005A3D0, //!< 9-Hole Game + SP_MSG_23102_000 = 0x0005A3E0, //!< 3-Hole Game + SP_MSG_23103_000 = 0x0005A3F0, //!< Beginner + SP_MSG_23103_001 = 0x0005A3F1, //!< Holes 1 to 3 + SP_MSG_23104_000 = 0x0005A400, //!< Intermediate + SP_MSG_23104_001 = 0x0005A401, //!< Holes 4 to 5 + SP_MSG_23105_000 = 0x0005A410, //!< Expert + SP_MSG_23105_001 = 0x0005A411, //!< Holes 6 to 9 + SP_MSG_23106_000 = 0x0005A420, //!< Main menu + SP_MSG_23110_000 = 0x0005A460, //!< Hole {000000}: Par {000000} + SP_MSG_23111_000 = 0x0005A470, //!< {000001} + SP_MSG_23112_000 = 0x0005A480, //!< Best + SP_MSG_23113_000 = 0x0005A490, //!< + SP_MSG_23114_000 = 0x0005A4A0, //!< Skill Level + SP_MSG_23115_000 = 0x0005A4B0, //!< + SP_MSG_23116_000 = 0x0005A4C0, //!< Score + SP_MSG_23117_000 = 0x0005A4D0, //!< + SP_MSG_23120_000 = 0x0005A500, //!< Stroke {000000} + SP_MSG_23121_000 = 0x0005A510, //!< {000001}{000000} + SP_MSG_23130_000 = 0x0005A5A0, //!< Hole {000000}: Par {000000} + SP_MSG_23131_000 = 0x0005A5B0, //!< {000000} yd left + SP_MSG_23131_001 = 0x0005A5B1, //!< {000000} yds left + SP_MSG_23131_002 = 0x0005A5B2, //!< {000000} ft left + SP_MSG_23131_003 = 0x0005A5B3, //!< {000000} ft left + SP_MSG_23132_000 = 0x0005A5C0, //!< {000000} mph + SP_MSG_23132_001 = 0x0005A5C1, //!< Wind + SP_MSG_23132_002 = 0x0005A5C2, //!< mph + SP_MSG_23133_000 = 0x0005A5D0, //!< Driver + SP_MSG_23133_001 = 0x0005A5D1, //!< Iron + SP_MSG_23133_002 = 0x0005A5D2, //!< Wedge + SP_MSG_23133_003 = 0x0005A5D3, //!< Putter + SP_MSG_23134_000 = 0x0005A5E0, //!< To hit the ball, hold down \uE042 and swing.\n㌍\uE041㍗: Aim, ㌦\uE041㌣: Change clubs + SP_MSG_23135_000 = 0x0005A5F0, //!< To hit the ball, hold down \uE042 and swing.\n㌍\uE041㍗: Aim, \uE047: Read green\n\uE048: Change camera + SP_MSG_23136_000 = 0x0005A600, //!< + SP_MSG_23140_000 = 0x0005A640, //!< Green + SP_MSG_23140_001 = 0x0005A641, //!< Edge of Green + SP_MSG_23140_002 = 0x0005A642, //!< Fairway + SP_MSG_23140_003 = 0x0005A643, //!< Rough + SP_MSG_23140_004 = 0x0005A644, //!< Bunker + SP_MSG_23140_005 = 0x0005A645, //!< Out of Bounds + SP_MSG_23140_006 = 0x0005A646, //!< Water Hazard + SP_MSG_23140_007 = 0x0005A647, //!< Off the Green + SP_MSG_23141_000 = 0x0005A650, //!< {000000} yard to go + SP_MSG_23141_001 = 0x0005A651, //!< {000000} yards to go + SP_MSG_23142_000 = 0x0005A660, //!< {000000} foot to go + SP_MSG_23142_001 = 0x0005A661, //!< {000000} feet to go + SP_MSG_23150_000 = 0x0005A6E0, //!< Hole in One + SP_MSG_23150_001 = 0x0005A6E1, //!< Double Eagle + SP_MSG_23150_002 = 0x0005A6E2, //!< Eagle + SP_MSG_23150_003 = 0x0005A6E3, //!< Birdie + SP_MSG_23150_004 = 0x0005A6E4, //!< Par + SP_MSG_23150_005 = 0x0005A6E5, //!< Bogey + SP_MSG_23150_006 = 0x0005A6E6, //!< Double Bogey + SP_MSG_23150_007 = 0x0005A6E7, //!< Triple Bogey + SP_MSG_23150_008 = 0x0005A6E8, //!< {000000} + SP_MSG_23160_000 = 0x0005A780, //!< Give up + SP_MSG_23161_000 = 0x0005A790, //!< {000000} + SP_MSG_23170_000 = 0x0005A820, //!< Scorecard + SP_MSG_23180_000 = 0x0005A8C0, //!< New personal best! + SP_MSG_23181_000 = 0x0005A8D0, //!< Next + SP_MSG_23182_000 = 0x0005A8E0, //!< Hole + SP_MSG_23183_000 = 0x0005A8F0, //!< Total + SP_MSG_23184_000 = 0x0005A900, //!< Par + SP_MSG_23185_000 = 0x0005A910, //!< {000001} + SP_MSG_23200_000 = 0x0005AA00, //!< Round {000000} + SP_MSG_23210_000 = 0x0005AAA0, //!< Distance left: {000000} ft + SP_MSG_23210_001 = 0x0005AAA1, //!< Distance left: {000000} ft + SP_MSG_23220_000 = 0x0005AB40, //!< Try again + SP_MSG_23300_000 = 0x0005B040, //!< Total: {000000} ft + SP_MSG_23300_001 = 0x0005B041, //!< Total: {000000} ft + SP_MSG_23310_000 = 0x0005B0E0, //!< + SP_MSG_23311_000 = 0x0005B0F0, //!< + SP_MSG_23311_001 = 0x0005B0F1, //!< Score: {000000} ft + SP_MSG_23400_000 = 0x0005B680, //!< Total: {000000} pt + SP_MSG_23400_001 = 0x0005B681, //!< Total: {000000} pts + SP_MSG_23401_000 = 0x0005B690, //!< Miss + SP_MSG_23401_001 = 0x0005B691, //!< +10 + SP_MSG_23401_002 = 0x0005B692, //!< +25 + SP_MSG_23401_003 = 0x0005B693, //!< +50 + SP_MSG_23401_004 = 0x0005B694, //!< +100 + SP_MSG_23401_005 = 0x0005B695, //!< +75 + SP_MSG_23500_000 = 0x0005BCC0, //!< High + SP_MSG_23501_000 = 0x0005BCD0, //!< Low + SP_MSG_23600_000 = 0x0005C300, //!< Hold the Wii Remote down, like a club.\nSwing as though you are hitting the\nball with the side of the Wii Remote. + SP_MSG_23601_000 = 0x0005C310, //!< Check the strength of your swing\nwith the power gauge. + SP_MSG_23602_000 = 0x0005C320, //!< If you swing too hard and max out the\ngauge, your shot will slice or hook. + SP_MSG_23603_000 = 0x0005C330, //!< Try some practice swings before you\nstep up to hit the ball. + SP_MSG_23604_000 = 0x0005C340, //!< Let's take a swing at the ball.\nAim the Wii Remote down and hold\ndown \uE042 to swing. + SP_MSG_24000_000 = 0x0005DC00, //!< + SP_MSG_24001_000 = 0x0005DC10, //!< + SP_MSG_24002_000 = 0x0005DC20, //!< + SP_MSG_24002_001 = 0x0005DC21, //!< + SP_MSG_25000_000 = 0x00061A80, //!< + SP_MSG_25001_000 = 0x00061A90, //!< + SP_MSG_25002_000 = 0x00061AA0, //!< + SP_MSG_25003_000 = 0x00061AB0, //!< + SP_MSG_25010_000 = 0x00061B20, //!< Decision + SP_MSG_25011_000 = 0x00061B30, //!< Decision + SP_MSG_25020_000 = 0x00061BC0, //!< + SP_MSG_25021_000 = 0x00061BD0, //!< + SP_MSG_25030_000 = 0x00061C60, //!< R1 + SP_MSG_25030_001 = 0x00061C61, //!< R2 + SP_MSG_25030_002 = 0x00061C62, //!< R3 + SP_MSG_25040_000 = 0x00061D00, //!< pt + SP_MSG_25040_001 = 0x00061D01, //!< pts + SP_MSG_25100_000 = 0x000620C0, //!< + SP_MSG_25101_000 = 0x000620D0, //!< + SP_MSG_25200_000 = 0x00062700, //!< + SP_MSG_25201_000 = 0x00062710, //!< + SP_MSG_25300_000 = 0x00062D40, //!< + SP_MSG_25301_000 = 0x00062D50, //!< + SP_MSG_25400_000 = 0x00063380, //!< Guard your face! + SP_MSG_25401_000 = 0x00063390, //!< Hold the Wii Remote and Nunchuk\nup in front of your face. + SP_MSG_25410_000 = 0x00063420, //!< Punch the face! + SP_MSG_25411_000 = 0x00063430, //!< Jab with the Wii Remote to punch\nyour opponent's head. + SP_MSG_25420_000 = 0x000634C0, //!< Guard your body! + SP_MSG_25421_000 = 0x000634D0, //!< Hold the Wii Remote and Nunchuk in front\nof your torso and tilt them inward. + SP_MSG_25430_000 = 0x00063560, //!< Punch the Body + SP_MSG_25431_000 = 0x00063570, //!< Jab with the Wii Remote to punch\nyour opponent's body. + SP_MSG_25440_000 = 0x00063600, //!< Dodge Punches + SP_MSG_25441_000 = 0x00063610, //!< Hold the Wii Remote and Nunchuk and tilt\nyour body forward, back, left, or right. + SP_MSG_25550_000 = 0x00063CE0, //!< Fighting Stance + SP_MSG_25551_000 = 0x00063CF0, //!< Hold the Wii Remote in your dominant\nhand and the Nunchuk in the other hand. + SP_MSG_26000_000 = 0x00065900, //!< Raise the Wii Remote and hold \uE043. + SP_MSG_26001_000 = 0x00065910, //!< Take a swing while\nholding \uE043. Release \uE043\nas you roll the ball. + SP_MSG_26002_000 = 0x00065920, //!< Swing your arm while\nholding down \uE043, and\nrelease it to roll the ball. + SP_MSG_26010_000 = 0x000659A0, //!< Strike + SP_MSG_26010_001 = 0x000659A1, //!< Spare + SP_MSG_26010_002 = 0x000659A2, //!< {000000} pin + SP_MSG_26010_003 = 0x000659A3, //!< {000000} pins + SP_MSG_26011_000 = 0x000659B0, //!< Double + SP_MSG_26011_001 = 0x000659B1, //!< Turkey + SP_MSG_26011_002 = 0x000659B2, //!< Fourth + SP_MSG_26011_003 = 0x000659B3, //!< Fifth + SP_MSG_26011_004 = 0x000659B4, //!< Six-pack + SP_MSG_26011_005 = 0x000659B5, //!< Seven-pack + SP_MSG_26011_006 = 0x000659B6, //!< Eight in a row + SP_MSG_26011_007 = 0x000659B7, //!< Nine in a row + SP_MSG_26011_008 = 0x000659B8, //!< Ten in a row + SP_MSG_26011_009 = 0x000659B9, //!< Eleven in a row + SP_MSG_26011_010 = 0x003F80F0, //!< Perfect + SP_MSG_26012_000 = 0x000659C0, //!< Missed + SP_MSG_26020_000 = 0x00065A40, //!< Scorecard + SP_MSG_26021_000 = 0x00065A50, //!< Record! + SP_MSG_26022_000 = 0x00065A60, //!< - + SP_MSG_26023_000 = 0x00065A70, //!< ①②③④⑤⑥⑦⑧ + SP_MSG_26030_000 = 0x00065AE0, //!< Next + SP_MSG_26040_000 = 0x00065B80, //!< Move + SP_MSG_26040_001 = 0x00065B81, //!< Turn + SP_MSG_26041_000 = 0x00065B90, //!< Switch + SP_MSG_26042_000 = 0x00065BA0, //!< Back + SP_MSG_26050_000 = 0x00065C20, //!< Game Finished + SP_MSG_26060_000 = 0x00065CC0, //!< Replay + SP_MSG_26100_000 = 0x00065F40, //!< Stage {000000} + SP_MSG_26101_000 = 0x00065F50, //!< {000000} pins + SP_MSG_26102_000 = 0x00065F60, //!< Stage {000000} + SP_MSG_26110_000 = 0x00065FE0, //!< Missed + SP_MSG_26120_000 = 0x00066080, //!< Challenge cleared + SP_MSG_26200_000 = 0x00066580, //!< + SP_MSG_26300_000 = 0x00066BC0, //!< + SP_MSG_26400_000 = 0x00067200, //!< {000000} pin + SP_MSG_26400_001 = 0x00067201, //!< {000000} pins + SP_MSG_26401_000 = 0x00067210, //!< × + SP_MSG_26500_000 = 0x00067840, //!< Perfect! + SP_MSG_27000_000 = 0x00069780, //!< {000001} + SP_MSG_27001_000 = 0x00069790, //!< Wii Fitness + SP_MSG_27010_000 = 0x00069820, //!< Wii Fitness Age: + SP_MSG_27011_000 = 0x00069830, //!< + SP_MSG_27020_000 = 0x000698C0, //!< {000000} + SP_MSG_27021_000 = 0x000698D0, //!< Sun + SP_MSG_27021_001 = 0x000698D1, //!< Mon + SP_MSG_27021_002 = 0x000698D2, //!< Tues + SP_MSG_27021_003 = 0x000698D3, //!< Wed + SP_MSG_27021_004 = 0x000698D4, //!< Thurs + SP_MSG_27021_005 = 0x000698D5, //!< Fri + SP_MSG_27021_006 = 0x000698D6, //!< Sat + SP_MSG_27030_000 = 0x00069960, //!< Start + SP_MSG_27031_000 = 0x00069970, //!< Done + SP_MSG_27100_000 = 0x00069DC0, //!< Speed + SP_MSG_27101_000 = 0x00069DD0, //!< Balance + SP_MSG_27102_000 = 0x00069DE0, //!< Stamina + SP_MSG_27200_000 = 0x0006A400, //!< Results + SP_MSG_27210_000 = 0x0006A4A0, //!< {000001} + SP_MSG_27210_001 = 0x0006A4A1, //!< + SP_MSG_27210_002 = 0x0006A4A2, //!< + SP_MSG_27220_000 = 0x0006A540, //!< + SP_MSG_27230_000 = 0x0006A5E0, //!< + SP_MSG_27250_000 = 0x0006A720, //!< Wow! It's like you're {000000} years younger! + SP_MSG_27251_000 = 0x0006A730, //!< It's like you're a whole year younger! + SP_MSG_27251_001 = 0x0006A731, //!< It's like you're {000000} years younger! + SP_MSG_27252_000 = 0x0006A740, //!< No change + SP_MSG_27253_000 = 0x0006A750, //!< A bit lower than before + SP_MSG_27254_000 = 0x0006A760, //!< A big decline + SP_MSG_27255_000 = 0x0006A770, //!< Good job! + SP_MSG_27400_000 = 0x0006B080, //!< JAN + SP_MSG_27400_001 = 0x0006B081, //!< FEB + SP_MSG_27400_002 = 0x0006B082, //!< MAR + SP_MSG_27400_003 = 0x0006B083, //!< APR + SP_MSG_27400_004 = 0x0006B084, //!< MAY + SP_MSG_27400_005 = 0x0006B085, //!< JUN + SP_MSG_27400_006 = 0x0006B086, //!< JUL + SP_MSG_27400_007 = 0x0006B087, //!< AUG + SP_MSG_27400_008 = 0x0006B088, //!< SEP + SP_MSG_27400_009 = 0x0006B089, //!< OCT + SP_MSG_27400_010 = 0x0042E510, //!< NOV + SP_MSG_27400_011 = 0x0042E511, //!< DEC + SP_MSG_27500_000 = 0x0006B6C0, //!< {000000} + SP_MSG_27600_000 = 0x0006BD00, //!< Testing... + SP_MSG_27601_000 = 0x0006BD10, //!< Wii Fitness Age + SP_MSG_28000_000 = 0x0006D600, //!< + SP_MSG_29000_000 = 0x00071480, //!< + SP_MSG_29000_001 = 0x00071481, //!< + SP_MSG_29000_002 = 0x00071482, //!< + SP_MSG_29000_003 = 0x00071483, //!< + SP_MSG_29000_004 = 0x00071484, //!< + SP_MSG_29000_005 = 0x00071485, //!< + SP_MSG_29000_006 = 0x00071486, //!< + SP_MSG_29000_007 = 0x00071487, //!< + SP_MSG_29000_008 = 0x00071488, //!< + SP_MSG_29000_009 = 0x00071489, //!< + SP_MSG_29000_010 = 0x0046CD10, //!< + SP_MSG_29000_011 = 0x0046CD11, //!< + SP_MSG_29000_012 = 0x0046CD12, //!< + SP_MSG_29000_013 = 0x0046CD13, //!< + SP_MSG_29000_014 = 0x0046CD14, //!< + SP_MSG_29010_000 = 0x00071520, //!< Start + SP_MSG_29010_001 = 0x00071521, //!< Finished + SP_MSG_29100_000 = 0x00071AC0, //!< + SP_MSG_29111_000 = 0x00071B70, //!< + SP_MSG_29112_000 = 0x00071B80, //!< + SP_MSG_29113_000 = 0x00071B90, //!< + SP_MSG_29114_000 = 0x00071BA0, //!< + SP_MSG_29115_000 = 0x00071BB0, //!< + SP_MSG_29120_000 = 0x00071C00, //!< + SP_MSG_29121_000 = 0x00071C10, //!< + SP_MSG_29122_000 = 0x00071C20, //!< + SP_MSG_29123_000 = 0x00071C30, //!< + SP_MSG_29124_000 = 0x00071C40, //!< + SP_MSG_29125_000 = 0x00071C50, //!< + SP_MSG_29130_000 = 0x00071CA0, //!< + SP_MSG_29131_000 = 0x00071CB0, //!< + SP_MSG_29140_000 = 0x00071D40, //!< + SP_MSG_29200_000 = 0x00072100, //!< Training + SP_MSG_29201_000 = 0x00072110, //!< Main menu + SP_MSG_29202_000 = 0x00072120, //!< Wii Fitness + SP_MSG_29210_000 = 0x000721A0, //!< Tennis + SP_MSG_29211_000 = 0x000721B0, //!< Baseball + SP_MSG_29212_000 = 0x000721C0, //!< Bowling + SP_MSG_29213_000 = 0x000721D0, //!< Golf + SP_MSG_29214_000 = 0x000721E0, //!< Boxing + SP_MSG_29230_000 = 0x000722E0, //!< Returning Balls + SP_MSG_29231_000 = 0x000722F0, //!< Timing Your Swing + SP_MSG_29232_000 = 0x00072300, //!< Target Practice + SP_MSG_29233_000 = 0x00072310, //!< Hitting Home Runs + SP_MSG_29234_000 = 0x00072320, //!< Batting Practice + SP_MSG_29235_000 = 0x00072330, //!< Swing Control + SP_MSG_29236_000 = 0x00072340, //!< Picking Up Spares + SP_MSG_29237_000 = 0x00072350, //!< Spin Control + SP_MSG_29238_000 = 0x00072360, //!< Power Throws + SP_MSG_29239_000 = 0x00072370, //!< Putting + SP_MSG_29240_000 = 0x00072380, //!< Hitting the Green + SP_MSG_29241_000 = 0x00072390, //!< Target Practice + SP_MSG_29242_000 = 0x000723A0, //!< Throwing Punches + SP_MSG_29243_000 = 0x000723B0, //!< Dodging + SP_MSG_29244_000 = 0x000723C0, //!< Working the Bag + SP_MSG_29300_000 = 0x00072740, //!< \uE042: Start + SP_MSG_29310_000 = 0x000727E0, //!< ??? + SP_MSG_29400_000 = 0x00072D80, //!< First event + SP_MSG_29400_001 = 0x00072D81, //!< Second event + SP_MSG_29400_002 = 0x00072D82, //!< Third event + SP_MSG_29500_000 = 0x000733C0, //!< Skill Level + SP_MSG_29501_000 = 0x000733D0, //!< PRO + SP_MSG_29502_000 = 0x000733E0, //!< Play again + SP_MSG_29503_000 = 0x000733F0, //!< Quit + SP_MSG_29510_000 = 0x00073460, //!< {000001}{000000} + SP_MSG_29511_000 = 0x00073470, //!< {000000} + SP_MSG_29600_000 = 0x00073A00, //!< {000001}{000000} + SP_MSG_29601_000 = 0x00073A10, //!< Pause + SP_MSG_29610_000 = 0x00073AA0, //!< Record: {000000} pt + SP_MSG_29610_001 = 0x00073AA1, //!< Record: {000000} pts + SP_MSG_29611_000 = 0x00073AB0, //!< Record: {000000} pt + SP_MSG_29611_001 = 0x00073AB1, //!< Record: {000000} pts + SP_MSG_29612_000 = 0x00073AC0, //!< Record: {000000} pt + SP_MSG_29612_001 = 0x00073AC1, //!< Record: {000000} pts + SP_MSG_29620_000 = 0x00073B40, //!< Record: {000000} homer ({000000} ft) + SP_MSG_29620_001 = 0x00073B41, //!< Record: {000000} homers ({000000} ft) + SP_MSG_29621_000 = 0x00073B50, //!< Record: {000000} pt + SP_MSG_29621_001 = 0x00073B51, //!< Record: {000000} pts + SP_MSG_29622_000 = 0x00073B60, //!< Record: {000000} hit + SP_MSG_29622_001 = 0x00073B61, //!< Record: {000000} hits + SP_MSG_29630_000 = 0x00073BE0, //!< Record: {000000} pt + SP_MSG_29630_001 = 0x00073BE1, //!< Record: {000000} pts + SP_MSG_29631_000 = 0x00073BF0, //!< Record: {000000} ft + SP_MSG_29631_001 = 0x00073BF1, //!< Record: {000000} ft + SP_MSG_29632_000 = 0x00073C00, //!< Record: {000000} pt + SP_MSG_29632_001 = 0x00073C01, //!< Record: {000000} pts + SP_MSG_29640_000 = 0x00073C80, //!< Record: {000000} pt + SP_MSG_29640_001 = 0x00073C81, //!< Record: {000000} pts + SP_MSG_29641_000 = 0x00073C90, //!< Record: {000000} pt + SP_MSG_29641_001 = 0x00073C91, //!< Record: {000000} pts + SP_MSG_29642_000 = 0x00073CA0, //!< Record: {000000} pt + SP_MSG_29642_001 = 0x00073CA1, //!< Record: {000000} pts + SP_MSG_29650_000 = 0x00073D20, //!< Record: {000000} lane + SP_MSG_29650_001 = 0x00073D21, //!< Record: {000000} lanes + SP_MSG_29651_000 = 0x00073D30, //!< Record: {000000} lane + SP_MSG_29651_001 = 0x00073D31, //!< Record: {000000} lanes + SP_MSG_29652_000 = 0x00073D40, //!< Record: {000000} pin + SP_MSG_29652_001 = 0x00073D41, //!< Record: {000000} pins + SP_MSG_29700_000 = 0x00074040, //!< {000001}{000000} + SP_MSG_29701_000 = 0x00074050, //!< Record! + SP_MSG_29702_000 = 0x00074060, //!< Try again + SP_MSG_29703_000 = 0x00074070, //!< Quit + SP_MSG_29710_000 = 0x000740E0, //!< Returning Balls + SP_MSG_29710_001 = 0x000740E1, //!< Score: + SP_MSG_29710_002 = 0x000740E2, //!< pt + SP_MSG_29710_003 = 0x000740E3, //!< pts + SP_MSG_29711_000 = 0x000740F0, //!< Timing Your Swing + SP_MSG_29711_001 = 0x000740F1, //!< Score: + SP_MSG_29711_002 = 0x000740F2, //!< pt + SP_MSG_29711_003 = 0x000740F3, //!< pts + SP_MSG_29712_000 = 0x00074100, //!< Target Practice + SP_MSG_29712_001 = 0x00074101, //!< Score: + SP_MSG_29712_002 = 0x00074102, //!< pt + SP_MSG_29712_003 = 0x00074103, //!< pts + SP_MSG_29720_000 = 0x00074180, //!< Hitting Home Runs + SP_MSG_29720_001 = 0x00074181, //!< Home runs: + SP_MSG_29720_002 = 0x00074182, //!< run + SP_MSG_29720_003 = 0x00074183, //!< runs + SP_MSG_29720_004 = 0x00074184, //!< Total distance: + SP_MSG_29720_005 = 0x00074185, //!< ft + SP_MSG_29720_006 = 0x00074186, //!< ft + SP_MSG_29721_000 = 0x00074190, //!< Swing Control + SP_MSG_29721_001 = 0x00074191, //!< Score: + SP_MSG_29721_002 = 0x00074192, //!< pt + SP_MSG_29721_003 = 0x00074193, //!< pts + SP_MSG_29722_000 = 0x000741A0, //!< Batting Practice + SP_MSG_29722_001 = 0x000741A1, //!< Score: + SP_MSG_29722_002 = 0x000741A2, //!< hit + SP_MSG_29722_003 = 0x000741A3, //!< hits + SP_MSG_29730_000 = 0x00074220, //!< Putting + SP_MSG_29730_001 = 0x00074221, //!< Cup-in: + SP_MSG_29730_002 = 0x00074222, //!< pt + SP_MSG_29730_003 = 0x00074223, //!< pts + SP_MSG_29731_000 = 0x00074230, //!< Hitting the Green + SP_MSG_29731_001 = 0x00074231, //!< Total left: + SP_MSG_29731_002 = 0x00074232, //!< ft + SP_MSG_29731_003 = 0x00074233, //!< ft + SP_MSG_29732_000 = 0x00074240, //!< Target Practice + SP_MSG_29732_001 = 0x00074241, //!< Score: + SP_MSG_29732_002 = 0x00074242, //!< pt + SP_MSG_29732_003 = 0x00074243, //!< pts + SP_MSG_29740_000 = 0x000742C0, //!< Throwing Punches + SP_MSG_29740_001 = 0x000742C1, //!< Score: + SP_MSG_29740_002 = 0x000742C2, //!< pt + SP_MSG_29740_003 = 0x000742C3, //!< pts + SP_MSG_29740_004 = 0x000742C4, //!< Hit score: + SP_MSG_29740_005 = 0x000742C5, //!< pt + SP_MSG_29740_006 = 0x000742C6, //!< pts + SP_MSG_29740_007 = 0x000742C7, //!< Trainer penalty: + SP_MSG_29740_008 = 0x000742C8, //!< pt + SP_MSG_29740_009 = 0x000742C9, //!< pts + SP_MSG_29741_000 = 0x000742D0, //!< Dodging + SP_MSG_29741_001 = 0x000742D1, //!< Score: + SP_MSG_29741_002 = 0x000742D2, //!< pt + SP_MSG_29741_003 = 0x000742D3, //!< pts + SP_MSG_29741_004 = 0x000742D4, //!< Balls dodged: + SP_MSG_29741_005 = 0x000742D5, //!< pt + SP_MSG_29741_006 = 0x000742D6, //!< pts + SP_MSG_29741_007 = 0x000742D7, //!< Balls hit: + SP_MSG_29741_008 = 0x000742D8, //!< pt + SP_MSG_29741_009 = 0x000742D9, //!< pts + SP_MSG_29742_000 = 0x000742E0, //!< Working the Bag + SP_MSG_29742_001 = 0x000742E1, //!< Score: + SP_MSG_29742_002 = 0x000742E2, //!< pt + SP_MSG_29742_003 = 0x000742E3, //!< pts + SP_MSG_29742_004 = 0x000742E4, //!< + SP_MSG_29742_005 = 0x000742E5, //!< + SP_MSG_29742_006 = 0x000742E6, //!< + SP_MSG_29742_007 = 0x000742E7, //!< + SP_MSG_29742_008 = 0x000742E8, //!< + SP_MSG_29742_009 = 0x000742E9, //!< + SP_MSG_29750_000 = 0x00074360, //!< Picking Up Spares + SP_MSG_29750_001 = 0x00074361, //!< Cleared: + SP_MSG_29750_002 = 0x00074362, //!< lane + SP_MSG_29750_003 = 0x00074363, //!< lanes + SP_MSG_29751_000 = 0x00074370, //!< Spin Control + SP_MSG_29751_001 = 0x00074371, //!< Cleared: + SP_MSG_29751_002 = 0x00074372, //!< lane + SP_MSG_29751_003 = 0x00074373, //!< lanes + SP_MSG_29752_000 = 0x00074380, //!< Power Throws + SP_MSG_29752_001 = 0x00074381, //!< Score: + SP_MSG_29752_002 = 0x00074382, //!< pin + SP_MSG_29752_003 = 0x00074383, //!< pins + SP_MSG_29800_000 = 0x00074680, //!< + SP_MSG_29801_000 = 0x00074690, //!< 1 + SP_MSG_29802_000 = 0x000746A0, //!< 2 + SP_MSG_29803_000 = 0x000746B0, //!< 3 + SP_MSG_29804_000 = 0x000746C0, //!< 4 + SP_MSG_29805_000 = 0x000746D0, //!< {000001} + SP_MSG_29810_000 = 0x00074720, //!< {000000} pt + SP_MSG_29810_001 = 0x00074721, //!< {000000} pts + SP_MSG_29811_000 = 0x00074730, //!< {000000} pt + SP_MSG_29811_001 = 0x00074731, //!< {000000} pts + SP_MSG_29812_000 = 0x00074740, //!< {000000} pt + SP_MSG_29812_001 = 0x00074741, //!< {000000} pts + SP_MSG_29820_000 = 0x000747C0, //!< {000000} homer {FF0001 00 3C}({000000} ft) + SP_MSG_29820_001 = 0x000747C1, //!< {000000} homers {FF0001 00 3C}({000000} ft) + SP_MSG_29820_002 = 0x000747C2, //!< + SP_MSG_29820_003 = 0x000747C3, //!< + SP_MSG_29821_000 = 0x000747D0, //!< {000000} pt + SP_MSG_29821_001 = 0x000747D1, //!< {000000} pts + SP_MSG_29822_000 = 0x000747E0, //!< {000000} hit + SP_MSG_29822_001 = 0x000747E1, //!< {000000} hits + SP_MSG_29830_000 = 0x00074860, //!< {000000} pt + SP_MSG_29830_001 = 0x00074861, //!< {000000} pts + SP_MSG_29831_000 = 0x00074870, //!< {000000} ft + SP_MSG_29831_001 = 0x00074871, //!< {000000} ft + SP_MSG_29832_000 = 0x00074880, //!< {000000} pt + SP_MSG_29832_001 = 0x00074881, //!< {000000} pts + SP_MSG_29840_000 = 0x00074900, //!< {000000} pt + SP_MSG_29840_001 = 0x00074901, //!< {000000} pts + SP_MSG_29841_000 = 0x00074910, //!< {000000} pt + SP_MSG_29841_001 = 0x00074911, //!< {000000} pts + SP_MSG_29842_000 = 0x00074920, //!< {000000} pt + SP_MSG_29842_001 = 0x00074921, //!< {000000} pts + SP_MSG_29850_000 = 0x000749A0, //!< {000000} lane + SP_MSG_29850_001 = 0x000749A1, //!< {000000} lanes + SP_MSG_29851_000 = 0x000749B0, //!< {000000} lane + SP_MSG_29851_001 = 0x000749B1, //!< {000000} lanes + SP_MSG_29852_000 = 0x000749C0, //!< {000000} pin + SP_MSG_29852_001 = 0x000749C1, //!< {000000} pins + SP_MSG_29860_000 = 0x00074A40, //!< Returning Balls + SP_MSG_29861_000 = 0x00074A50, //!< Timing Your Swing + SP_MSG_29862_000 = 0x00074A60, //!< Target Practice + SP_MSG_29863_000 = 0x00074A70, //!< Hitting Home Runs + SP_MSG_29864_000 = 0x00074A80, //!< Batting Practice + SP_MSG_29865_000 = 0x00074A90, //!< Swing Control + SP_MSG_29866_000 = 0x00074AA0, //!< Picking Up Spares + SP_MSG_29867_000 = 0x00074AB0, //!< Spin Control + SP_MSG_29868_000 = 0x00074AC0, //!< Power Throws + SP_MSG_29869_000 = 0x00074AD0, //!< Putting + SP_MSG_29870_000 = 0x00074AE0, //!< Hitting the Green + SP_MSG_29871_000 = 0x00074AF0, //!< Target Practice + SP_MSG_29872_000 = 0x00074B00, //!< Throwing Punches + SP_MSG_29873_000 = 0x00074B10, //!< Dodging + SP_MSG_29874_000 = 0x00074B20, //!< Working the Bag + SP_MSG_29880_000 = 0x00074B80, //!< Again + SP_MSG_29881_000 = 0x00074B90, //!< Quit + SP_MSG_29890_000 = 0x00074C20, //!< Platinum + SP_MSG_29891_000 = 0x00074C30, //!< Gold + SP_MSG_29892_000 = 0x00074C40, //!< Silver + SP_MSG_29893_000 = 0x00074C50, //!< Bronze + SP_MSG_29900_000 = 0x00074CC0, //!< Tennis + SP_MSG_29901_000 = 0x00074CD0, //!< Baseball + SP_MSG_29902_000 = 0x00074CE0, //!< Bowling + SP_MSG_29903_000 = 0x00074CF0, //!< Golf + SP_MSG_29904_000 = 0x00074D00, //!< Boxing + SP_MSG_29910_000 = 0x00074D60, //!< Training + SP_MSG_29911_000 = 0x00074D70, //!< Wii Fitness + SP_MSG_29920_000 = 0x00074E00, //!< ㌃㌶㍑ + SP_MSG_29930_000 = 0x00074EA0, //!< Please press \uE042 and \uE043. + SP_MSG_29940_000 = 0x00074F40, //!< Wii Sports + SP_MSG_29941_000 = 0x00074F50, //!< Play like a pro! // clang-format on }; diff --git a/include/Pack/types_pack.h b/include/Pack/types_pack.h index e26aa795..3f3957db 100644 --- a/include/Pack/types_pack.h +++ b/include/Pack/types_pack.h @@ -14,4 +14,13 @@ typedef u16 RPTime16; */ typedef u32 RPTime32; +struct bmg_message { + u32 group; + u32 index; +}; + +#define MSG_GROUP(X) (((X) & 0xFFFFFFF0) >> 4) +#define MSG_INDEX(X) ((X) & 0x0000000F) +#define MSG_TUPLE(X) MSG_GROUP(X), MSG_INDEX(X) + #endif diff --git a/include/revolution/NAND/nand.h b/include/revolution/NAND/nand.h index f4aa675a..b62c3922 100644 --- a/include/revolution/NAND/nand.h +++ b/include/revolution/NAND/nand.h @@ -10,6 +10,12 @@ extern "C" { #define NAND_BANNER_TITLE_MAX 32 #define NAND_BANNER_ICON_MAX_FRAME 8 +#define NAND_PAGE_SIZE 2048 +#define NAND_CLUSTER_SIZE (NAND_PAGE_SIZE * 8) +#define NAND_BLOCK_SIZE (NAND_CLUSTER_SIZE * 8) + +#define NAND_MAX_PATH FS_MAX_PATH + // Forward declarations typedef struct NANDCommandBlock NANDCommandBlock; @@ -126,15 +132,26 @@ typedef struct NANDCommandBlock { const char** dir; // at 0xB4 } NANDCommandBlock; +#define NAND_BANNER_TEXTURE_SIZE 0x6000 +#define NAND_BANNER_ICON_SIZE 0x1200 + +#define NAND_BANNER_SIZE(ICON_FRAMES) \ + (offsetof(NANDBanner, iconTexture) + (0x1200 * ICON_FRAMES)) + +#define NAND_BANNER_SET_ICON_SPEED(BANNER, FRAME, SPEED) \ + (BANNER)->iconSpeed = (BANNER)->iconSpeed & ~(0b11 << (FRAME)) | \ + (((SPEED) & 0b11) << (FRAME)) + typedef struct NANDBanner { - u32 magic; // at 0x0 - u32 flags; // at 0x4 - u16 iconSpeed; // at 0x8 - u8 reserved[0x20 - 0xA]; // at 0xA - wchar_t title[NAND_BANNER_TITLE_MAX]; // at 0x20 - wchar_t subtitle[NAND_BANNER_TITLE_MAX]; // at 0x60 - u8 bannerTexture[0x6000]; // at 0xA0 - u8 iconTexture[0x1200][NAND_BANNER_ICON_MAX_FRAME]; // at 0x60A0 + u32 magic; // at 0x0 + u32 flags; // at 0x4 + u16 iconSpeed; // at 0x8 + u8 reserved[0x20 - 0xA]; // at 0xA + wchar_t title[NAND_BANNER_TITLE_MAX]; // at 0x20 + wchar_t subtitle[NAND_BANNER_TITLE_MAX]; // at 0x60 + u8 bannerTexture[NAND_BANNER_TEXTURE_SIZE]; // at 0xA0 + u8 iconTexture[NAND_BANNER_ICON_SIZE] + [NAND_BANNER_ICON_MAX_FRAME]; // at 0x60A0 } NANDBanner; s32 NANDCreate(const char* path, u8 perm, u8 attr); diff --git a/include/revolution/VF/d_vf.h b/include/revolution/VF/d_vf.h index 207061b1..c4b96c58 100644 --- a/include/revolution/VF/d_vf.h +++ b/include/revolution/VF/d_vf.h @@ -18,6 +18,7 @@ typedef enum { typedef enum { VF_SYNC_MODE_0, VF_SYNC_MODE_1 } VFSyncMode; s32 VFIsAvailable(void); +void VFInitEx(void*, u32); s32 VFMountDriveNANDFlashEx(const char* i_drive, const char* i_sys_file_name_p); s32 VFUnmountDrive(const char* i_drive); VFFile VFOpenFile(const char* i_path_p, const char* i_mode, u32 i_attr); diff --git a/src/Pack/RPKernel/RPSysKokeshiManager.cpp b/src/Pack/RPKernel/RPSysKokeshiManager.cpp index dc6bc0a1..53841ceb 100644 --- a/src/Pack/RPKernel/RPSysKokeshiManager.cpp +++ b/src/Pack/RPKernel/RPSysKokeshiManager.cpp @@ -270,9 +270,9 @@ void RPSysKokeshiManager::LoadStaticResource() { mpCommonMessage = new (pResHeap) RPSysMessage(pCommonRes, pResHeap); static const bmg_message GUEST_NAME_MSGS[RFL_DEFAULT_CHAR_MAX] = { - MSG_UNPACK(MSG_660_000), MSG_UNPACK(MSG_661_000), - MSG_UNPACK(MSG_662_000), MSG_UNPACK(MSG_663_000), - MSG_UNPACK(MSG_664_000), MSG_UNPACK(MSG_665_000), + MSG_TUPLE(CMN_MSG_660_000), MSG_TUPLE(CMN_MSG_661_000), + MSG_TUPLE(CMN_MSG_662_000), MSG_TUPLE(CMN_MSG_663_000), + MSG_TUPLE(CMN_MSG_664_000), MSG_TUPLE(CMN_MSG_665_000), }; for (u16 i = 0; i < RFL_DEFAULT_CHAR_MAX; i++) { diff --git a/src/Pack/RPSystem/RPSysSaveData.cpp b/src/Pack/RPSystem/RPSysSaveData.cpp index 6e8d82d4..ef098f02 100644 --- a/src/Pack/RPSystem/RPSysSaveData.cpp +++ b/src/Pack/RPSystem/RPSysSaveData.cpp @@ -156,7 +156,7 @@ void RPSysSaveData::read(EGG::RamStream& rStrm, const void* pRawSave) { #if defined(PACK_SPORTS) mpSportsSystemData->read(rStrm); -#elif defined(PACK_PLAY) +#elif defined(PACK_PARTY) mpPartySystemData->read(rStrm); #endif diff --git a/src/Pack/RPSystem/RPSysSaveDataMgr.cpp b/src/Pack/RPSystem/RPSysSaveDataMgr.cpp new file mode 100644 index 00000000..ed7c64c0 --- /dev/null +++ b/src/Pack/RPSystem/RPSysSaveDataMgr.cpp @@ -0,0 +1,975 @@ +#include +#include +#include +#include + +#include + +#include +#include +#include + +/** + * @brief Pack-specific message file name + */ +#if defined(PACK_SPORTS) +#define PACK_MSG_FILE_NAME "sports_message.bmg" +#elif defined(PACK_PARTY) +#define PACK_MSG_FILE_NAME "party_message.bmg" +#endif + +/** + * @brief Banner icon TPL file name + */ +#define BANNER_ICON_FILE_NAME "banner.tpl" + +/** + * @brief Banner file names + */ +const char* RPSysSaveDataMgr::BANNER_FILE_NAMES[EBannerType_Max] = { + "banner.bin", // EBannerType_Real + "/tmp/banner.bin" // EBannerType_Temp +}; + +/** + * @brief Save file name + */ +#if defined(PACK_SPORTS) +static const char* SAVE_FILE_NAME = "RPSports.dat"; +#elif defined(PACK_PARTY) +static const char* SAVE_FILE_NAME = "RPParty.dat"; +#endif + +RP_SINGLETON_IMPL_EX(RPSysSaveDataMgr); + +/** + * @brief Gets the Sports Pack player data at the specified player list + * index + * + * @param idx Player list index + */ +RPSportsPlayerData RPSysSaveDataMgr::getSportsPlayerData(s32 idx) const { + return *mpSaveData->getSportsPlayerData(idx); +} + +/** + * @brief Sets the Sports Pack player data at the specified player list + * index + * + * @param rPlayerData Player data + * @param idx Player list index + */ +void RPSysSaveDataMgr::setSportsPlayerData( + const RPSportsPlayerData& rPlayerData, s32 idx) { + + RPSportsPlayerData clone(rPlayerData); + mpSaveData->setSportsPlayerData(&clone, idx); +} + +/** + * @brief Gets the Sports Pack system data + */ +RPSportsSystemData RPSysSaveDataMgr::getSportsSystemData() const { + return *mpSaveData->getSportsSystemData(); +} + +/** + * @brief Sets the Sports Pack system data + * + * @param rSystemData System data + */ +void RPSysSaveDataMgr::setSportsSystemData( + const RPSportsSystemData& rSystemData) { + + RPSportsSystemData clone(rSystemData); + mpSaveData->setSportsSystemData(&clone); +} + +/** + * @brief Gets the Party Pack player data at the specified player list + * index + * + * @param idx Player list index + */ +RPPartyPlayerData RPSysSaveDataMgr::getPartyPlayerData(s32 idx) const { + return *mpSaveData->getPartyPlayerData(idx); +} + +/** + * @brief Sets the Party Pack player data at the specified player list + * index + * + * @param rPlayerData Player data + * @param idx Player list index + */ +void RPSysSaveDataMgr::setPartyPlayerData(const RPPartyPlayerData& rPlayerData, + s32 idx) { + + RPPartyPlayerData clone(rPlayerData); + mpSaveData->setPartyPlayerData(&clone, idx); +} + +/** + * @brief Gets the Party Pack system data + */ +RPPartySystemData RPSysSaveDataMgr::getPartySystemData() const { + return *mpSaveData->getPartySystemData(); +} + +/** + * @brief Sets the Party Pack system data + * + * @param rSystemData System data + */ +void RPSysSaveDataMgr::setPartySystemData( + const RPPartySystemData& rSystemData) { + + RPPartySystemData clone(rSystemData); + mpSaveData->setPartySystemData(&clone); +} + +/** + * @brief Checks which save data files exist on the NAND + * + * @return Success + */ +bool RPSysSaveDataMgr::existPackFileSync() { + bool enable = false; + + if (RP_GET_INSTANCE(RPSysSceneMgr) + ->getCurrentSceneRP() + ->isNandAccessEnable()) { + + mFlags.resetBit(EFlag_NandError); + mFlags.resetBit(EFlag_13); + + enable = true; + } else { + enable = false; + } + + if (enable) { + existSaveFile(); + existBannerFile(); + + return true; + } + + return false; +} + +/** + * @brief Checks which save data files exist on the NAND (asynchronous) + * + * @return Success + */ +bool RPSysSaveDataMgr::existPackFileAsync() { + bool enable = false; + + if (RP_GET_INSTANCE(RPSysSceneMgr) + ->getCurrentSceneRP() + ->isNandAccessEnable()) { + + mFlags.setBit(EFlag_NandAccess); + mFlags.resetBit(EFlag_NandError); + mFlags.resetBit(EFlag_13); + + enable = true; + } else { + enable = false; + } + + if (enable) { + RP_GET_INSTANCE(RPSysSystem) + ->getNandThread() + ->request(existPackFileFunc, NULL, + RP_GET_INSTANCE(RPSysSystem)->getNandEndMessage()); + + return true; + } + + return false; +} + +/** + * @brief Tests whether the NAND has enough free space to store both the + * banner and save files (asynchronous) + * + * @return Success + */ +bool RPSysSaveDataMgr::existNandMemoryAsync() { + bool enable = false; + + if (RP_GET_INSTANCE(RPSysSceneMgr) + ->getCurrentSceneRP() + ->isNandAccessEnable()) { + + mFlags.setBit(EFlag_NandAccess); + mFlags.resetBit(EFlag_NandError); + mFlags.resetBit(EFlag_13); + + enable = true; + } else { + enable = false; + } + + if (enable) { + RP_GET_INSTANCE(RPSysSystem) + ->getNandThread() + ->request(existNandMemoryFunc, NULL, + RP_GET_INSTANCE(RPSysSystem)->getNandEndMessage()); + + return true; + } + + return false; +} + +/** + * @brief Attempts to create both the banner and save files on the NAND + * + * @return Success + */ +bool RPSysSaveDataMgr::createPackFileSync() { + if (mFlags.offBit(EFlag_NandError) && mFlags.offBit(EFlag_13)) { + mFlags.resetBit(EFlag_SaveFileExist); + + mNandErrorCode = + NANDCreate(SAVE_FILE_NAME, + NAND_PERM_RUSR | NAND_PERM_WUSR | NAND_PERM_RGRP, 0); + + if (mNandErrorCode == NAND_RESULT_OK || + mNandErrorCode == NAND_RESULT_EXISTS) { + + mFlags.setBit(EFlag_SaveFileExist); + } else { + mFlags.setBit(EFlag_NandError); + } + } + + saveSync(); + return true; +} + +/** + * @brief Attempts to create both the banner and save files on the NAND + * (asynchonous) + * + * @return Success + */ +bool RPSysSaveDataMgr::createPackFileAsync() { + bool enable = false; + + if (RP_GET_INSTANCE(RPSysSceneMgr) + ->getCurrentSceneRP() + ->isNandAccessEnable()) { + + mFlags.setBit(EFlag_NandAccess); + mFlags.resetBit(EFlag_NandError); + mFlags.resetBit(EFlag_13); + + enable = true; + } else { + enable = false; + } + + if (enable) { + RP_GET_INSTANCE(RPSysSystem) + ->getNandThread() + ->request(createPackFileFunc, NULL, + RP_GET_INSTANCE(RPSysSystem)->getNandEndMessage()); + + return true; + } + + return false; +} + +/** + * @brief Attempts to delete both the banner and save files from the NAND + * + * @return Success + */ +bool RPSysSaveDataMgr::deletePackFileSync() { + bool enable = false; + + if (RP_GET_INSTANCE(RPSysSceneMgr) + ->getCurrentSceneRP() + ->isNandAccessEnable()) { + + mFlags.resetBit(EFlag_NandError); + mFlags.resetBit(EFlag_13); + + enable = true; + } else { + enable = false; + } + + if (enable) { + deleteBannerFile(); + deleteSaveFile(); + + return true; + } + + return false; +} + +/** + * @brief Attempts to save both the banner and save files to the NAND + * + * @return Success + */ +bool RPSysSaveDataMgr::savePackFileSync() { + bool enable = false; + + if (RP_GET_INSTANCE(RPSysSceneMgr) + ->getCurrentSceneRP() + ->isNandAccessEnable()) { + + mFlags.resetBit(EFlag_NandError); + mFlags.resetBit(EFlag_13); + + enable = true; + } else { + enable = false; + } + + if (enable) { + saveSync(); + saveBannerFile(EBannerType_Real); + + return true; + } + + return false; +} + +/** + * @brief Attempts to load the save file from the NAND (asynchronous) + * + * @return Success + */ +bool RPSysSaveDataMgr::loadAsync() { + bool enable = false; + + if (RP_GET_INSTANCE(RPSysSceneMgr) + ->getCurrentSceneRP() + ->isNandAccessEnable()) { + + mFlags.setBit(EFlag_NandAccess); + mFlags.resetBit(EFlag_NandError); + mFlags.resetBit(EFlag_13); + + enable = true; + } else { + enable = false; + } + + if (enable) { + RP_GET_INSTANCE(RPSysSystem) + ->getNandThread() + ->request(loadDataFunc, NULL, + RP_GET_INSTANCE(RPSysSystem)->getNandEndMessage()); + + return true; + } + + return false; +} + +/** + * @brief Attempts to save both the banner and save files to the NAND + * (asynchronous) + * + * @return Success + */ +bool RPSysSaveDataMgr::saveAsync() { + if (mFlags.offBit(EFlag_AsyncSave)) { + bool enable = false; + + if (RP_GET_INSTANCE(RPSysSceneMgr) + ->getCurrentSceneRP() + ->isNandAccessEnable()) { + + mFlags.setBit(EFlag_NandAccess); + mFlags.resetBit(EFlag_NandError); + mFlags.resetBit(EFlag_13); + + enable = true; + } else { + enable = false; + } + + bool request = false; + + if (enable) { + RP_GET_INSTANCE(RPSysSystem) + ->getNandThread() + ->request(saveDataFunc, NULL, + RP_GET_INSTANCE(RPSysSystem)->getNandEndMessage()); + + request = true; + } else { + request = false; + } + + if (request) { + mFlags.setBit(EFlag_AsyncSave); + mFlags.resetBit(EFlag_ErrorWindow); + } + + return mFlags.onBit(EFlag_AsyncSave); + } + + return false; +} + +/** + * @brief Tests whether async operations have completed + */ +bool RPSysSaveDataMgr::isAsyncFinish() const { + return mFlags.offBit(EFlag_NandAccess) && mFlags.offBit(EFlag_AsyncSave); +} + +/** + * @brief Tests whether NAND operations have completed + */ +bool RPSysSaveDataMgr::isNandAccessFinish() const { + return mFlags.offBit(EFlag_NandAccess); +} + +/** + * @brief Tests whether both the banner and save files exist on the NAND + */ +bool RPSysSaveDataMgr::isPackFileExist() const { + return mFlags.onBit(EFlag_BannerFileExist) && + mFlags.onBit(EFlag_SaveFileExist); +} + +/** + * @brief Tests whether the NAND has enough free space to store both the + * banner and save files + */ +bool RPSysSaveDataMgr::isNandMemoryExist() const { + return mFlags.onBit(EFlag_NandMemoryExist); +} + +/** + * @brief Tests whether the save file is broken (bad magic, checksum, etc.) + */ +bool RPSysSaveDataMgr::isSaveFileBroken() const { + return mpSaveData->isErrorOccured(); +} + +/** + * @brief Tests whether any unrecoverable error has occurred + * @typo + */ +bool RPSysSaveDataMgr::isErrorOccured() const { + return !mFlags.onBit(EFlag_DisableSave) && + (mFlags.onBit(EFlag_NandError) || mFlags.onBit(EFlag_13)); +} + +/** + * @brief Toggles the ability to save both the banner and save files to the + * NAND + * + * @param disable Whether to disable saving + */ +void RPSysSaveDataMgr::setSaveDisable(bool disable) { + mFlags.changeBit(EFlag_DisableSave, disable); +} + +/** + * @brief Gets the result of the last NAND memory check + */ +u32 RPSysSaveDataMgr::getNandCheckAnswer() const { + return mNandCheckAnswer; +} + +/** + * @brief Gets the result of the last NAND operation + */ +s32 RPSysSaveDataMgr::getErrorCode() const { + return mNandErrorCode; +} + +/** + * @brief Gets the number of free NAND blocks needed to store both the + * banner and save files + */ +u32 RPSysSaveDataMgr::getUserBlockSize() const { + return (mClusterFileSize / NAND_BLOCK_SIZE) + + (mClusterFileSize % NAND_BLOCK_SIZE != 0); +} + +/** + * @brief Gets the number of free NAND inodes needed to store both the + * banner and save files + */ +u32 RPSysSaveDataMgr::getSaveFileNum() const { + return SAVE_FILE_NUM; +} + +/** + * @brief Marks the current async NAND operations as completed + */ +void RPSysSaveDataMgr::finishNandAccess() { + mFlags.resetBit(EFlag_NandAccess); +} + +/** + * @brief Updates the save manager state + * + * @param display Whether the scene is fully displayed + */ +void RPSysSaveDataMgr::update(bool display) { + if (mFlags.offBit(EFlag_AsyncSave)) { + return; + } + if (mFlags.onBit(EFlag_NandAccess)) { + return; + } + + if (isErrorOccured()) { + if (mNandErrorCode == NAND_RESULT_BUSY) { + RPSysSystemWinMgr* pWinMgr = RP_GET_INSTANCE(RPSysSystemWinMgr); + + if (mFlags.offBit(EFlag_ErrorWindow)) { + // "Unable to save." + pWinMgr->setSystemWindow(RPSysSystemWinMgr::E_WINDOW_TYPE_ERROR, + MSG_GROUP(CMN_MSG_171_000), NULL, 0); + + pWinMgr->setCursors(); + mFlags.setBit(EFlag_ErrorWindow); + + } else if (pWinMgr->getResult() == + RPSysSystemWinMgr::RESULT_CONTINUE) { + + mFlags.resetBit(EFlag_AsyncSave); + mFlags.resetBit(EFlag_ErrorWindow); + } + + } else if (display) { + checkContinueReject(); + } + + } else { + mFlags.resetBit(EFlag_AsyncSave); + mFlags.resetBit(EFlag_ErrorWindow); + } +} + +/** + * @brief Initializes the banner file binary + */ +void RPSysSaveDataMgr::initBanner() { + EGG::Heap* pHeap = + RP_GET_INSTANCE(RPSysSceneMgr)->getCurrentSceneRP()->getHeap(); + + void* pMessageRes = + RPSysResourceManager::GetMessageResource(PACK_MSG_FILE_NAME); + + RPSysMessage* pMessage = new (pHeap) RPSysMessage(pMessageRes, pHeap); + + const wchar_t* pSaveTitleMsg = + pMessage->GetMsg(MSG_TUPLE(SP_MSG_29940_000)); + const wchar_t* pSaveSubTitleMsg = + pMessage->GetMsg(MSG_TUPLE(SP_MSG_29941_000)); + + NANDInitBanner(mpBannerFile, 0, pSaveTitleMsg, pSaveSubTitleMsg); + + u8* pTplBuffer = + static_cast(EGG::Heap::alloc(mBannerFileSize, 32, pHeap)); + + void* pTplFile = EGG::DvdRipper::loadToMainRAM( + BANNER_ICON_FILE_NAME, pTplBuffer, pHeap, + EGG::DvdRipper::ALLOC_DIR_HEAD, 0, NULL, NULL); + + TPLPalette* pPalette = static_cast(pTplFile); + TPLBind(pPalette); + + TPLDescriptor* pBannerTexture = TPLGet(pPalette, ETplIndex_BannerTexture); + + memcpy(mpBannerFile->bannerTexture, pBannerTexture->textureHeader->data, + sizeof(mpBannerFile->bannerTexture)); + + for (int i = 0; i < BANNER_ICON_FRAME_NUM; i++) { + TPLDescriptor* pIconTexture = + TPLGet(pPalette, ETplIndex_IconTexture + i); + + if (pIconTexture != NULL) { + memcpy(mpBannerFile->iconTexture[i], + pIconTexture->textureHeader->data, NAND_BANNER_ICON_SIZE); + + NAND_BANNER_SET_ICON_SPEED(mpBannerFile, i, 2); + } + } + + // Frame with a speed of zero marks the end of the animation + NAND_BANNER_SET_ICON_SPEED(mpBannerFile, BANNER_ICON_FRAME_NUM + 1, 0); +} + +/** + * @brief Prompts the user to continue without saving + */ +void RPSysSaveDataMgr::checkContinueReject() { + RPSysSystemWinMgr* pWinMgr = RP_GET_INSTANCE(RPSysSystemWinMgr); + + if (mFlags.offBit(EFlag_ErrorWindow)) { + // "The game could not be saved. Continue without saving?" + pWinMgr->setSystemWindow(RPSysSystemWinMgr::E_WINDOW_TYPE_ERROR, + MSG_GROUP(CMN_MSG_052_000), NULL, 0); + + pWinMgr->setDefaultCursor(RPSysSystemWinMgr::E_BUTTON_YES); + pWinMgr->setCursors(); + + mFlags.setBit(EFlag_ErrorWindow); + + } else if (pWinMgr->getResult() == RPSysSystemWinMgr::RESULT_YES) { + mFlags.setBit(EFlag_DisableSave); + + mFlags.resetBit(EFlag_AsyncSave); + mFlags.resetBit(EFlag_ErrorWindow); + + } else if (pWinMgr->getResult() == RPSysSystemWinMgr::RESULT_NO) { + RP_GET_INSTANCE(RPSysSceneMgr)->returnToMenu(false); + + mFlags.resetBit(EFlag_AsyncSave); + mFlags.resetBit(EFlag_ErrorWindow); + } +} + +/** + * @brief Checks if the NAND has enough free space to store both the banner + * and save files + */ +void RPSysSaveDataMgr::existNandMemorySync() { + if (mFlags.offBit(EFlag_NandError) && mFlags.offBit(EFlag_13)) { + mFlags.resetBit(EFlag_NandMemoryExist); + + // TODO(kiwi) Why is the block calculation different? + mNandErrorCode = + NANDCheck(getUserBlockSize(), getSaveFileNum(), &mNandCheckAnswer); + + if (mNandErrorCode == NAND_RESULT_OK) { + if (mNandCheckAnswer == 0) { + mFlags.setBit(EFlag_NandMemoryExist); + } + } else { + mFlags.setBit(EFlag_NandError); + } + } +} + +/** + * @brief Checks whether the banner file exists on the NAND + */ +void RPSysSaveDataMgr::existBannerFile() { + if (mFlags.offBit(EFlag_NandError) && mFlags.offBit(EFlag_13)) { + mFlags.resetBit(EFlag_SaveFileExist); + + u8 type; + mNandErrorCode = NANDGetType(SAVE_FILE_NAME, &type); + + if (mNandErrorCode == NAND_RESULT_OK) { + mFlags.setBit(EFlag_SaveFileExist); + } else if (mNandErrorCode != NAND_RESULT_NOEXISTS) { + mFlags.setBit(EFlag_NandError); + } + } +} + +/** + * @brief Creates the banner file on the NAND + * @details For safety purposes, the banner file is first created in the + * temporary directory, before being moved out. + */ +void RPSysSaveDataMgr::createBannerFile() { + if (mFlags.offBit(EFlag_NandError) && mFlags.offBit(EFlag_13)) { + mFlags.resetBit(EFlag_BannerFileExist); + + mNandErrorCode = + NANDCreate(BANNER_FILE_NAMES[EBannerType_Temp], + NAND_PERM_RUSR | NAND_PERM_WUSR | NAND_PERM_RGRP, 0); + + if (mNandErrorCode != NAND_RESULT_OK && + mNandErrorCode != NAND_RESULT_EXISTS) { + + mFlags.setBit(EFlag_NandError); + return; + } + + saveBannerFile(EBannerType_Temp); + + if (mFlags.onBit(EFlag_NandError)) { + return; + } + if (mFlags.onBit(EFlag_13)) { + return; + } + + char homeDir[NAND_MAX_PATH]; + mNandErrorCode = NANDGetHomeDir(homeDir); + + if (mNandErrorCode != NAND_RESULT_OK) { + mFlags.setBit(EFlag_NandError); + return; + } + + mNandErrorCode = NANDMove(BANNER_FILE_NAMES[EBannerType_Temp], homeDir); + + if (mNandErrorCode == NAND_RESULT_OK || + mNandErrorCode == NAND_RESULT_EXISTS) { + + mFlags.setBit(EFlag_BannerFileExist); + } else { + mFlags.setBit(EFlag_NandError); + } + } +} + +/** + * @brief Deletes the banner file from the NAND + * @details This function only deletes the banner file in the home directory + */ +void RPSysSaveDataMgr::deleteBannerFile() { + mNandErrorCode = NANDDelete(BANNER_FILE_NAMES[EBannerType_Real]); + + if (mNandErrorCode == NAND_RESULT_OK || + mNandErrorCode == NAND_RESULT_NOEXISTS) { + + mFlags.resetBit(EFlag_BannerFileExist); + } else { + mFlags.setBit(EFlag_NandError); + } +} + +/** + * @brief Saves both the banner and save files to the NAND + */ +void RPSysSaveDataMgr::saveSync() { + if (mFlags.offBit(EFlag_DisableSave) && mFlags.offBit(EFlag_NandError) && + mFlags.offBit(EFlag_13)) { + + { + EGG::RamStream strm(mpSaveFile, mSaveFileSize); + mpSaveData->write(strm, mpSaveFile); + } + + NANDFileInfo info; + mNandErrorCode = NANDOpen(SAVE_FILE_NAME, &info, NAND_ACCESS_WRITE); + + if (mNandErrorCode != NAND_RESULT_OK) { + mFlags.setBit(EFlag_NandError); + return; + } + + mNandErrorCode = NANDWrite(&info, mpSaveFile, mSaveFileSize); + + if (mNandErrorCode != mSaveFileSize) { + NANDClose(&info); + mFlags.setBit(EFlag_NandError); + return; + } + + mNandErrorCode = NANDClose(&info); + + if (mNandErrorCode != NAND_RESULT_OK) { + mFlags.setBit(EFlag_NandError); + } + } +} + +/** + * @brief Loads the save file from the NAND + */ +void RPSysSaveDataMgr::loadSync() { + if (mFlags.offBit(EFlag_NandError) && mFlags.offBit(EFlag_13)) { + NANDFileInfo info; + mNandErrorCode = NANDOpen(SAVE_FILE_NAME, &info, NAND_ACCESS_READ); + + if (mNandErrorCode != NAND_RESULT_OK) { + mFlags.setBit(EFlag_NandError); + return; + } + + mNandErrorCode = NANDRead(&info, mpSaveFile, mSaveFileSize); + + if (mNandErrorCode != mSaveFileSize) { + NANDClose(&info); + mFlags.setBit(EFlag_NandError); + return; + } + + mNandErrorCode = NANDClose(&info); + + if (mNandErrorCode != NAND_RESULT_OK) { + mFlags.setBit(EFlag_NandError); + // No early return? + } + + { + EGG::RamStream strm(mpSaveFile, mSaveFileSize); + mpSaveData->read(strm, mpSaveFile); + } + } +} + +/** + * @brief Saves the banner file to the NAND + * + * @param type Which type of banner file to save + */ +void RPSysSaveDataMgr::saveBannerFile(EBannerType type) { + if (mFlags.offBit(EFlag_DisableSave) && mFlags.offBit(EFlag_NandError) && + mFlags.offBit(EFlag_13)) { + + NANDFileInfo info; + mNandErrorCode = + NANDOpen(BANNER_FILE_NAMES[type], &info, NAND_ACCESS_WRITE); + + if (mNandErrorCode != NAND_RESULT_OK) { + mFlags.setBit(EFlag_NandError); + return; + } + + mNandErrorCode = NANDWrite(&info, mpBannerFile, mBannerFileSize); + + if (mNandErrorCode != mBannerFileSize) { + NANDClose(&info); + mFlags.setBit(EFlag_NandError); + return; + } + + mNandErrorCode = NANDClose(&info); + + if (mNandErrorCode != NAND_RESULT_OK) { + mFlags.setBit(EFlag_NandError); + } + } +} + +/** + * @brief Checks whether the save file exists on the NAND + */ +void RPSysSaveDataMgr::existSaveFile() { + if (mFlags.offBit(EFlag_NandError) && mFlags.offBit(EFlag_13)) { + mFlags.resetBit(EFlag_BannerFileExist); + + u8 type; + mNandErrorCode = + NANDGetType(BANNER_FILE_NAMES[EBannerType_Real], &type); + + if (mNandErrorCode == NAND_RESULT_OK) { + mFlags.setBit(EFlag_BannerFileExist); + } else if (mNandErrorCode != NAND_RESULT_NOEXISTS) { + mFlags.setBit(EFlag_NandError); + } + } +} + +/** + * @brief Deletes the save file from the NAND + */ +void RPSysSaveDataMgr::deleteSaveFile() { + mNandErrorCode = NANDDelete(SAVE_FILE_NAME); + + if (mNandErrorCode == NAND_RESULT_OK || + mNandErrorCode == NAND_RESULT_NOEXISTS) { + + mFlags.resetBit(EFlag_SaveFileExist); + } else { + mFlags.setBit(EFlag_NandError); + } +} + +/** + * @brief Checks which save data files exist on the NAND + * + * @param pArg Thread function argument + */ +void RPSysSaveDataMgr::existPackFileFunc(void* /* pArg */) { + RP_GET_INSTANCE(RPSysSaveDataMgr)->existSaveFile(); + RP_GET_INSTANCE(RPSysSaveDataMgr)->existBannerFile(); +} + +/** + * @brief Checks if the NAND has enough free space to store both the banner + * and save files + * + * @param pArg Thread function argument + */ +void RPSysSaveDataMgr::existNandMemoryFunc(void* /* pArg */) { + RP_GET_INSTANCE(RPSysSaveDataMgr)->existNandMemorySync(); +} + +/** + * @brief Creates both the banner and save files on the NAND + * + * @param pArg Thread function argument + */ +void RPSysSaveDataMgr::createPackFileFunc(void* /* pArg */) { + RP_GET_INSTANCE(RPSysSaveDataMgr)->createPackFileSync(); + RP_GET_INSTANCE(RPSysSaveDataMgr)->createBannerFile(); +} + +/** + * @brief Loads the save file from the NAND + * + * @param pArg Thread function argument + */ +void RPSysSaveDataMgr::loadDataFunc(void* /* pArg */) { + RP_GET_INSTANCE(RPSysSaveDataMgr)->loadSync(); +} + +/** + * @brief Saves both the banner and save files to the NAND + * + * @param pArg Thread function argument + */ +void RPSysSaveDataMgr::saveDataFunc(void* /* pArg */) { + RP_GET_INSTANCE(RPSysSaveDataMgr)->saveSync(); + RP_GET_INSTANCE(RPSysSaveDataMgr)->saveBannerFile(EBannerType_Real); +} + +/** + * @brief Constructor + * + * @param pHeap Parent heap + */ +RPSysSaveDataMgr::RPSysSaveDataMgr(EGG::Heap* pHeap) + : IRPSysHostIOSocket("Save File"), mpParentHeap(pHeap) { + + if (VFIsAvailable() == VF_OK) { + void* pWorkBuffer = EGG::Heap::alloc(VF_WORK_SIZE, 4, pHeap); + VFInitEx(pWorkBuffer, VF_WORK_SIZE); + } + + mFlags.makeAllZero(); + mNandErrorCode = NAND_RESULT_OK; + unk10 = 0; + mNandCheckAnswer = 0; + + mpSaveData = new (pHeap) RPSysSaveData(); + + mSaveFileSize = RPSysSaveData::getSaveFileSize(); + mBannerFileSize = SAVE_BANNER_SIZE; + + mClusterFileSize = ((mSaveFileSize / NAND_CLUSTER_SIZE) + + (mSaveFileSize % NAND_CLUSTER_SIZE != 0) + + (mBannerFileSize / NAND_CLUSTER_SIZE) + + (mBannerFileSize % NAND_CLUSTER_SIZE != 0)) // + * NAND_CLUSTER_SIZE; + + mpBannerFile = static_cast( + EGG::Heap::alloc(sizeof(NANDBanner), 32, pHeap)); + + mpSaveFile = static_cast(EGG::Heap::alloc(mSaveFileSize, 32, pHeap)); +} + +/** + * @brief Destructor + */ +RPSysSaveDataMgr::~RPSysSaveDataMgr() {}