#include "global.h" #include "event_data.h" #include "event_scripts.h" #include "field_player_avatar.h" #include "help_system.h" #include "item.h" #include "link.h" #include "overworld.h" #include "pokedex.h" #include "quest_log.h" #include "save.h" #include "save_location.h" #include "sound.h" #include "strings.h" #include "constants/items.h" #include "constants/maps.h" #include "constants/songs.h" static EWRAM_DATA u16 sSomeVariable = 0; static EWRAM_DATA u8 gUnknown_203B0EE = 0; u8 sHelpSystemState[4]; u16 gSomeVariableBackup; static bool32 IsCurrentMapInArray(const u16 * mapIdxs); static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); static bool8 HelpSystem_HasDefeatedBrock(void); static bool8 HelpSystemSubmenuIndexIsActive(u8); static bool8 HasGottenAtLeastOneHM(void); static void PrintWelcomeMessageOnPanel1(void); static void PrintTextOnPanel2Row52RightAlign(const u8 *); static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0); static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); static const u8 *const sHelpSystemTopicPtrs[] = { gUnknown_81B2DF8, gUnknown_81B2E1C, gUnknown_81B2E2E, gUnknown_81B2E48, gUnknown_81B2E58, gUnknown_81B2E6A }; static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[] = { gUnknown_81B2E88, gUnknown_81B2EC8, gUnknown_81B2F00, gUnknown_81B2F43, gUnknown_81B2F74, gUnknown_81B2FA9 }; static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = { NULL, gUnknown_81B3083, gUnknown_81B30A9, gUnknown_81B30C1, gUnknown_81B30DC, gUnknown_81B30FC, gUnknown_81B311F, gUnknown_81B3140, gUnknown_81B314F, gUnknown_81B3168, gUnknown_81B3189, gUnknown_81B31AE, gUnknown_81B31D3, gUnknown_81B31EC, gUnknown_81B31FF, gUnknown_81B3215, gUnknown_81B3226, gUnknown_81B3243, gUnknown_81B3261, gUnknown_81B3276, gUnknown_81B3290, gUnknown_81B32B6, gUnknown_81B32CD, gUnknown_81B32E3, gUnknown_81B32F9, gUnknown_81B330B, gUnknown_81B332B, gUnknown_81B3344, gUnknown_81B335C, gUnknown_81B3373, gUnknown_81B338C, gUnknown_81B33A6, gUnknown_81B33CA, gUnknown_81B33EA, gUnknown_81B3402, gUnknown_81B3427, gUnknown_81B3440, gUnknown_81B3457, gUnknown_81B346F, gUnknown_81B3481, gUnknown_81B349B, gUnknown_81B34B7, gUnknown_81B34D6, gUnknown_81B34F6, gUnknown_81B3516 }; static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = { NULL, gUnknown_81B3525, gUnknown_81B35E6, gUnknown_81B36EB, gUnknown_81B379A, gUnknown_81B3849, gUnknown_81B3876, gUnknown_81B3972, gUnknown_81B3A51, gUnknown_81B3ACC, gUnknown_81B3BB6, gUnknown_81B3C99, gUnknown_81B3D1B, gUnknown_81B3DE3, gUnknown_81B3EBC, gUnknown_81B3F7F, gUnknown_81B406C, gUnknown_81B410B, gUnknown_81B41D7, gUnknown_81B42B3, gUnknown_81B439D, gUnknown_81B4483, gUnknown_81B457C, gUnknown_81B4645, gUnknown_81B470A, gUnknown_81B47F0, gUnknown_81B48C6, gUnknown_81B497A, gUnknown_81B4A72, gUnknown_81B4B65, gUnknown_81B4C54, gUnknown_81B4D26, gUnknown_81B4E0B, gUnknown_81B4ED8, gUnknown_81B4FB2, gUnknown_81B4FFD, gUnknown_81B50FF, gUnknown_81B51B1, gUnknown_81B5272, gUnknown_81B5325, gUnknown_81B5382, gUnknown_81B547C, gUnknown_81B54E1, gUnknown_81B5589, gUnknown_81B55F4 }; static const u8 *const sHelpSystemMenuTopicTextPtrs[] = { NULL, gUnknown_81B56E3, gUnknown_81B56F4, gUnknown_81B5705, gUnknown_81B5717, gUnknown_81B5728, gUnknown_81B5737, gUnknown_81B5744, gUnknown_81B5754, gUnknown_81B5767, gUnknown_81B577B, gUnknown_81B5787, gUnknown_81B5795, gUnknown_81B57A5, gUnknown_81B57B8, gUnknown_81B57CF, gUnknown_81B57DE, gUnknown_81B57EE, gUnknown_81B580D, gUnknown_81B5824, gUnknown_81B5834, gUnknown_81B583F, gUnknown_81B5850, gUnknown_81B5863, gUnknown_81B5875, gUnknown_81B5884, gUnknown_81B5893, gUnknown_81B58A4, gUnknown_81B58BC, gUnknown_81B58D3, gUnknown_81B58E5, gUnknown_81B58FD, gUnknown_81B590E, gUnknown_81B591D, gUnknown_81B592E, gUnknown_81B593E, gUnknown_81B5950, gUnknown_81B595D, gUnknown_81B5974, gUnknown_81B5989, gUnknown_81B59A7, gUnknown_81B59BF, gUnknown_81B59D6, gUnknown_81B59E8, gUnknown_81B59F5, gUnknown_81B5A0D, gUnknown_81B5A1B, gUnknown_81B5A29, gUnknown_81B5A37 }; static const u8 *const sHelpSystemSpecializedControlsTextPtrs[] = { NULL, gUnknown_81B5A4D, gUnknown_81B5B0C, gUnknown_81B5B7D, gUnknown_81B5C13, gUnknown_81B5CDF, gUnknown_81B5D87, gUnknown_81B5E41, gUnknown_81B5F10, gUnknown_81B5FA6, gUnknown_81B606C, gUnknown_81B6140, gUnknown_81B6203, gUnknown_81B62E4, gUnknown_81B6397, gUnknown_81B6478, gUnknown_81B6525, gUnknown_81B65E7, gUnknown_81B66BA, gUnknown_81B678E, gUnknown_81B6883, gUnknown_81B68CD, gUnknown_81B69B9, gUnknown_81B6A9A, gUnknown_81B6B6E, gUnknown_81B6C4F, gUnknown_81B6D4A, gUnknown_81B6E02, gUnknown_81B6EC1, gUnknown_81B6FA8, gUnknown_81B7075, gUnknown_81B7108, gUnknown_81B71EA, gUnknown_81B723B, gUnknown_81B7319, gUnknown_81B73E8, gUnknown_81B747E, gUnknown_81B752C, gUnknown_81B7611, gUnknown_81B7692, gUnknown_81B771E, gUnknown_81B77DD, gUnknown_81B7884, gUnknown_81B7931, gUnknown_81B79CB, gUnknown_81B7A60, gUnknown_81B7AEE, gUnknown_81B7BBE, gUnknown_81B7C57 }; static const u8 *const sHelpSystemSpecializedStringsTextPtrs[] = { NULL, gUnknown_81B7CC1, gUnknown_81B7CC4, gUnknown_81B7CD9, gUnknown_81B7CDF, gUnknown_81B7CE6, gUnknown_81B7CEE, gUnknown_81B7CF6, gUnknown_81B7CFE, gUnknown_81B7D04, gUnknown_81B7D12, gUnknown_81B7D17, gUnknown_81B7D1A, gUnknown_81B7D1F, gUnknown_81B7D27, gUnknown_81B7D2D, gUnknown_81B7D37, gUnknown_81B7D3E, gUnknown_81B7D45, gUnknown_81B7D48, gUnknown_81B7D4E, gUnknown_81B7D57, gUnknown_81B7D5B, gUnknown_81B7D61, gUnknown_81B7D6B, gUnknown_81B7D76, gUnknown_81B7D7E, gUnknown_81B7D88, gUnknown_81B7D8F, gUnknown_81B7D9A, gUnknown_81B7DA7, gUnknown_81B7DB4, gUnknown_81B7DBA, gUnknown_81B7DC6, gUnknown_81B7DCC, gUnknown_81B7DD3, gUnknown_81B7DD6, gUnknown_81B7DD9, gUnknown_81B7DE1, gUnknown_81B7DEB, gUnknown_81B7DFA, gUnknown_81B7E02, gUnknown_81B7E09, gUnknown_81B7E0F }; static const u8 *const sHelpSystemSpecializedStringDefinitionsTextPtrs[] = { NULL, gUnknown_81B7E16, gUnknown_81B7F0A, gUnknown_81B800A, gUnknown_81B80EC, gUnknown_81B81C2, gUnknown_81B8256, gUnknown_81B8348, gUnknown_81B83EF, gUnknown_81B847B, gUnknown_81B8550, gUnknown_81B8647, gUnknown_81B86E2, gUnknown_81B87B8, gUnknown_81B8897, gUnknown_81B8924, gUnknown_81B8A04, gUnknown_81B8A84, gUnknown_81B8B62, gUnknown_81B8C18, gUnknown_81B8C94, gUnknown_81B8D1D, gUnknown_81B8DD4, gUnknown_81B8E67, gUnknown_81B8F4D, gUnknown_81B901B, gUnknown_81B90A7, gUnknown_81B90E8, gUnknown_81B9170, gUnknown_81B91C2, gUnknown_81B91F9, gUnknown_81B92B8, gUnknown_81B92ED, gUnknown_81B93D8, gUnknown_81B9439, gUnknown_81B9497, gUnknown_81B9560, gUnknown_81B9656, gUnknown_81B9749, gUnknown_81B984F, gUnknown_81B991C, gUnknown_81B99C4, gUnknown_81B9AA2, gUnknown_81B9B2F }; static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = { NULL, gUnknown_81B9BB7, gUnknown_81B9BC7, gUnknown_81B9BD0, gUnknown_81B9BE1, gUnknown_81B9BF5, gUnknown_81B9C09, gUnknown_81B9C1D }; static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = { NULL, gUnknown_81B9C2F, gUnknown_81B9D04, gUnknown_81B9DC5, gUnknown_81B9E75, gUnknown_81B9F09, gUnknown_81B9FCE, gUnknown_81BA027 }; static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = { NULL, gUnknown_81BA0F1, gUnknown_81BA10D, gUnknown_81BA121, gUnknown_81BA138, gUnknown_81BA14C, gUnknown_81BA163, gUnknown_81BA17A, gUnknown_81BA194, gUnknown_81BA1AC, gUnknown_81BA1C7, gUnknown_81BA1DC, gUnknown_81BA1F4, gUnknown_81BA209, gUnknown_81BA221, gUnknown_81BA234, gUnknown_81BA24A, gUnknown_81BA260, gUnknown_81BA279, gUnknown_81BA291, gUnknown_81BA2AC, gUnknown_81BA2C2, gUnknown_81BA2DB, gUnknown_81BA2F1, gUnknown_81BA30A, gUnknown_81BA320, gUnknown_81BA339, gUnknown_81BA34E, gUnknown_81BA366, gUnknown_81BA37C, gUnknown_81BA395, gUnknown_81BA3A9, gUnknown_81BA3C0, gUnknown_81BA3D5, gUnknown_81BA3ED, gUnknown_81BA400 }; static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = { NULL, gUnknown_81BA416, gUnknown_81BA4E6, gUnknown_81BA539, gUnknown_81BA595, gUnknown_81BA5F2, gUnknown_81BA66F, gUnknown_81BA6C9, gUnknown_81BA71F, gUnknown_81BA796, gUnknown_81BA7E9, gUnknown_81BA862, gUnknown_81BA8D3, gUnknown_81BA92A, gUnknown_81BA98D, gUnknown_81BA9F1, gUnknown_81BAA44, gUnknown_81BAAB6, gUnknown_81BAB18, gUnknown_81BAB7A, gUnknown_81BABCC, gUnknown_81BAC29, gUnknown_81BAC89, gUnknown_81BACC4, gUnknown_81BAD20, gUnknown_81BAD60, gUnknown_81BADA2, gUnknown_81BADF7, gUnknown_81BAEA8, gUnknown_81BAF01, gUnknown_81BAF6B, gUnknown_81BAFCA, gUnknown_81BB02E, gUnknown_81BB084, gUnknown_81BB0DF, gUnknown_81BB156 }; static const u8 gUnknown_845B660[] = { 0x01, 0x02, 0x03, 0xff }; static const u8 gUnknown_845B664[] = { 0x01, 0x02, 0x03, 0xff }; static const u8 gUnknown_845B668[] = { 0x13, 0xff }; static const u8 gUnknown_845B66A[] = { 0x01, 0x02, 0x03, 0xff }; static const u8 gUnknown_845B66E[] = { 0x01, 0x25, 0xff }; static const u8 gUnknown_845B671[] = { 0x02, 0x03, 0x04, 0x05, 0x11, 0xff }; static const u8 gUnknown_845B677[] = { 0x09, 0x01, 0xff }; static const u8 gUnknown_845B67A[] = { 0x02, 0x03, 0xff }; static const u8 gUnknown_845B67D[] = { 0x09, 0x0a, 0x0b, 0x11, 0x0c, 0x10, 0xff }; static const u8 gUnknown_845B684[] = { 0x09, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x02, 0x0d, 0xff }; static const u8 gUnknown_845B68E[] = { 0x09, 0x03, 0x0a, 0x0f, 0x12, 0x13, 0x14, 0xff }; static const u8 gUnknown_845B696[] = { 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x12, 0xff }; static const u8 gUnknown_845B6A1[] = { 0x16, 0x17, 0x18, 0xff }; static const u8 gUnknown_845B6A5[] = { 0x0a, 0xff }; static const u8 gUnknown_845B6A7[] = { 0x11, 0x0e, 0x19, 0x1a, 0x1b, 0xff }; static const u8 gUnknown_845B6AD[] = { 0x0a, 0xff }; static const u8 gUnknown_845B6AF[] = { 0x0b, 0xff }; static const u8 gUnknown_845B6B1[] = { 0x2b, 0x19, 0x1a, 0xff }; static const u8 gUnknown_845B6B5[] = { 0x0c, 0xff }; static const u8 gUnknown_845B6B7[] = { 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0xff }; static const u8 gUnknown_845B6BF[] = { 0x02, 0x03, 0x04, 0xff }; static const u8 gUnknown_845B6C3[] = { 0x01, 0x02, 0x03, 0x07, 0xff }; static const u8 gUnknown_845B6C8[] = { 0x02, 0x04, 0x05, 0x09, 0x25, 0xff }; static const u8 gUnknown_845B6CE[] = { 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0xff }; static const u8 gUnknown_845B6E2[] = { 0x09, 0x01, 0x02, 0x03, 0x0a, 0x28, 0xff }; static const u8 gUnknown_845B6E9[] = { 0x02, 0x05, 0x06, 0x0a, 0x23, 0x24, 0x09, 0x25, 0xff }; static const u8 gUnknown_845B6F2[] = { 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0x14, 0xff }; static const u8 gUnknown_845B707[] = { 0x09, 0x01, 0x02, 0x03, 0x0a, 0x28, 0xff }; static const u8 gUnknown_845B70E[] = { 0x03, 0x07, 0x04, 0x05, 0x06, 0xff }; static const u8 gUnknown_845B714[] = { 0x02, 0x05, 0x06, 0x0a, 0x23, 0x24, 0x09, 0x25, 0xff }; static const u8 gUnknown_845B71D[] = { 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0xff }; static const u8 gUnknown_845B731[] = { 0x09, 0x01, 0x02, 0x03, 0x0a, 0x0c, 0x0e, 0x16, 0x17, 0x18, 0x15, 0xff }; static const u8 gUnknown_845B73D[] = { 0x06, 0x0a, 0x23, 0x24, 0x09, 0x25, 0xff }; static const u8 gUnknown_845B744[] = { 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0xff }; static const u8 gUnknown_845B758[] = { 0x09, 0x01, 0x02, 0x03, 0x0a, 0x15, 0xff }; static const u8 gUnknown_845B75F[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff }; static const u8 gUnknown_845B783[] = { 0x02, 0x0a, 0x04, 0x05, 0x06, 0x07, 0x0d, 0x27, 0x08, 0x0b, 0x21, 0x23, 0x24, 0x2c, 0x09, 0x0e, 0x16, 0x17, 0x0f, 0x10, 0x11, 0x1a, 0x15, 0x1f, 0x20, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1b, 0x1e, 0x1c, 0x28, 0x25, 0xff }; static const u8 gUnknown_845B7A7[] = { 0x1f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x2c, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x0a, 0x0b, 0x0c, 0x11, 0xff }; static const u8 gUnknown_845B7BB[] = { 0x09, 0x01, 0x02, 0x0a, 0x0b, 0x0c, 0x0d, 0x15, 0xff }; static const u8 gUnknown_845B7C4[] = { 0x02, 0x0a, 0x04, 0x05, 0x06, 0x07, 0x0d, 0x27, 0x08, 0x0b, 0x21, 0x23, 0x24, 0x2c, 0x09, 0x0e, 0x16, 0x17, 0x0f, 0x10, 0x11, 0x1a, 0x15, 0x1f, 0x20, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1b, 0x1e, 0x1c, 0x28, 0x25, 0xff }; static const u8 gUnknown_845B7E8[] = { 0x1f, 0x01, 0x02, 0x06, 0x0a, 0x0b, 0x0c, 0x11, 0xff }; static const u8 gUnknown_845B7F1[] = { 0x09, 0x01, 0x02, 0x0a, 0x0b, 0x0c, 0x0d, 0x15, 0x28, 0xff }; static const u8 gUnknown_845B7FB[] = { 0x0a, 0x07, 0x0d, 0x27, 0x08, 0x0b, 0x21, 0x23, 0x24, 0x2c, 0x09, 0x0e, 0x16, 0x0f, 0x10, 0x11, 0x1a, 0x15, 0x1f, 0x20, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1b, 0x1e, 0x1c, 0x28, 0x25, 0xff }; static const u8 gUnknown_845B81A[] = { 0x1f, 0x01, 0x02, 0x06, 0x0a, 0x0b, 0x0c, 0x11, 0xff }; static const u8 gUnknown_845B823[] = { 0x09, 0x01, 0x02, 0x0a, 0x0b, 0x0c, 0x0d, 0x15, 0xff }; static const u8 gUnknown_845B82C[] = { 0x07, 0x27, 0x08, 0x2c, 0x15, 0x1f, 0x20, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1b, 0x1e, 0x1c, 0x28, 0x25, 0xff }; static const u8 gUnknown_845B83E[] = { 0x1f, 0x01, 0x02, 0x06, 0x0a, 0x0b, 0x0c, 0x11, 0xff }; static const u8 gUnknown_845B847[] = { 0x09, 0x01, 0x02, 0x0a, 0x0b, 0x0c, 0x0d, 0x15, 0xff }; static const u8 gUnknown_845B850[] = { 0x0f, 0x1b, 0x1d, 0x11, 0x12, 0x15, 0x17, 0x16, 0x1f, 0x20, 0x13, 0x14, 0xff }; static const u8 gUnknown_845B85D[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x07, 0x09, 0x2b, 0xff }; static const u8 gUnknown_845B866[] = { 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0d, 0x0f, 0x12, 0x13, 0x14, 0x27, 0x15, 0xff }; static const u8 gUnknown_845B878[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff }; static const u8 gUnknown_845B89C[] = { 0x0f, 0x1b, 0x1d, 0x11, 0x12, 0x16, 0x1f, 0x20, 0x13, 0x14, 0xff }; static const u8 gUnknown_845B8A7[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x07, 0x2b, 0xff }; static const u8 gUnknown_845B8AF[] = { 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0d, 0x0f, 0x12, 0x13, 0x14, 0x27, 0x15, 0xff }; static const u8 gUnknown_845B8C1[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff }; static const u8 gUnknown_845B8E5[] = { 0x0f, 0x1b, 0x1d, 0x11, 0x12, 0x16, 0x1f, 0x20, 0x13, 0x14, 0xff }; static const u8 gUnknown_845B8F0[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x07, 0x2b, 0xff }; static const u8 gUnknown_845B8F8[] = { 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0d, 0x0f, 0x12, 0x13, 0x14, 0x27, 0x15, 0xff }; static const u8 gUnknown_845B90A[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff }; static const u8 gUnknown_845B92E[] = { 0x29, 0x2a, 0x2b, 0xff }; static const u8 gUnknown_845B932[] = { 0x2d, 0x2e, 0x2f, 0x2b, 0xff }; static const u8 gUnknown_845B937[] = { 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0d, 0x0f, 0x12, 0x13, 0x14, 0xff }; static const u8 gUnknown_845B947[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0xff }; static const u8 gUnknown_845B96B[] = { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff }; static const u8 gUnknown_845B978[] = { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff }; static const u8 gUnknown_845B985[] = { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff }; static const u8 gUnknown_845B992[] = { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff }; static const u8 gUnknown_845B99F[] = { 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x30, 0xff }; static const u8 gUnknown_845B9AC[] = { 0x26, 0x27, 0x28, 0x29, 0x2a, 0xff }; static const u8 gUnknown_845B9B2[] = { 0x26, 0x27, 0x28, 0x29, 0x2a, 0xff }; static const u8 gUnknown_845B9B8[] = { 0x26, 0x27, 0x28, 0x29, 0x2a, 0xff }; static const u8 gUnknown_845B9BE[] = { 0x09, 0x01, 0x02, 0x03, 0x23, 0x25, 0x24, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x27, 0x15, 0x26, 0x16, 0x17, 0x18, 0x1a, 0x0e, 0x1b, 0xff }; static const u8 *const sHelpSystemSubmenuIndexPointers[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, gUnknown_845B660, NULL, NULL, NULL, NULL, gUnknown_845B664, NULL, NULL, gUnknown_845B668, NULL, gUnknown_845B66A, NULL, NULL, gUnknown_845B66E, NULL, NULL, NULL, NULL, gUnknown_845B671, gUnknown_845B677, NULL, NULL, NULL, gUnknown_845B67A, gUnknown_845B67D, NULL, NULL, NULL, NULL, gUnknown_845B684, NULL, NULL, NULL, NULL, gUnknown_845B68E, NULL, NULL, NULL, gUnknown_845B696, gUnknown_845B6A1, NULL, NULL, NULL, gUnknown_845B6A5, gUnknown_845B6A7, NULL, NULL, NULL, gUnknown_845B6AD, NULL, NULL, NULL, NULL, gUnknown_845B6AF, gUnknown_845B6B1, NULL, NULL, NULL, gUnknown_845B6B5, gUnknown_845B6B7, NULL, NULL, gUnknown_845B6BF, NULL, NULL, gUnknown_845B6C3, NULL, gUnknown_845B6C8, gUnknown_845B6CE, gUnknown_845B6E2, NULL, NULL, gUnknown_845B6E9, gUnknown_845B6F2, gUnknown_845B707, gUnknown_845B70E, NULL, gUnknown_845B714, gUnknown_845B71D, gUnknown_845B731, NULL, NULL, gUnknown_845B73D, gUnknown_845B744, gUnknown_845B758, NULL, gUnknown_845B75F, gUnknown_845B783, gUnknown_845B7A7, gUnknown_845B7BB, NULL, NULL, gUnknown_845B7C4, gUnknown_845B7E8, gUnknown_845B7F1, NULL, NULL, gUnknown_845B7FB, gUnknown_845B81A, gUnknown_845B823, NULL, NULL, gUnknown_845B82C, gUnknown_845B83E, gUnknown_845B847, NULL, NULL, gUnknown_845B850, gUnknown_845B85D, gUnknown_845B866, NULL, gUnknown_845B878, gUnknown_845B89C, gUnknown_845B8A7, gUnknown_845B8AF, NULL, gUnknown_845B8C1, gUnknown_845B8E5, gUnknown_845B8F0, gUnknown_845B8F8, NULL, gUnknown_845B90A, gUnknown_845B92E, gUnknown_845B932, gUnknown_845B937, NULL, gUnknown_845B947, NULL, gUnknown_845B96B, NULL, NULL, NULL, NULL, gUnknown_845B978, NULL, NULL, NULL, NULL, gUnknown_845B985, NULL, NULL, NULL, NULL, gUnknown_845B992, NULL, NULL, NULL, NULL, gUnknown_845B99F, NULL, NULL, NULL, NULL, gUnknown_845B9AC, NULL, NULL, NULL, NULL, gUnknown_845B9B2, NULL, NULL, NULL, NULL, gUnknown_845B9B8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static const u16 unref_845BCB0[] = INCBIN_U16("graphics/help_system/unk_845BCB0.bin"); static const u8 sHelpSystemContextTopicOrder[] = { 3, 0, 1, 2, 4, 5 }; static const bool8 sHelpSystemContextTopicFlags[][6] = { {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE }, {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE }, {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE }, {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE }, {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE }, {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE }, {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}, {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE} }; static const u16 sMartMaps[] = { MAP_VIRIDIAN_CITY_MART, MAP_PEWTER_CITY_MART, MAP_CERULEAN_CITY_MART, MAP_LAVENDER_TOWN_MART, MAP_VERMILION_CITY_MART, MAP_CELADON_CITY_DEPARTMENT_STORE_1F, MAP_CELADON_CITY_DEPARTMENT_STORE_2F, MAP_CELADON_CITY_DEPARTMENT_STORE_3F, MAP_CELADON_CITY_DEPARTMENT_STORE_4F, MAP_CELADON_CITY_DEPARTMENT_STORE_5F, MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF, MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR, MAP_FUCHSIA_CITY_MART, MAP_CINNABAR_ISLAND_MART, MAP_SAFFRON_CITY_MART, MAP_THREE_ISLAND_MART, MAP_FOUR_ISLAND_MART, MAP_SEVEN_ISLAND_MART, MAP_SIX_ISLAND_MART, MAP_UNDEFINED }; static const u16 sGymMaps[] = { MAP_PEWTER_CITY_GYM, MAP_CERULEAN_CITY_GYM, MAP_VERMILION_CITY_GYM, MAP_CELADON_CITY_GYM, MAP_FUCHSIA_CITY_GYM, MAP_SAFFRON_CITY_GYM, MAP_CINNABAR_ISLAND_GYM, MAP_VIRIDIAN_CITY_GYM, MAP_UNDEFINED }; static const u8 sDungeonMaps[][3] = { { MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), 1 }, { MAP_GROUP(MT_MOON_1F), MAP_NUM(MT_MOON_1F), 3 }, { MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), 2 }, { MAP_GROUP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP_NUM(DIGLETTS_CAVE_NORTH_ENTRANCE), 3 }, { MAP_GROUP(SEAFOAM_ISLANDS_1F), MAP_NUM(SEAFOAM_ISLANDS_1F), 5 }, { MAP_GROUP(VICTORY_ROAD_1F), MAP_NUM(VICTORY_ROAD_1F), 3 }, { MAP_GROUP(CERULEAN_CAVE_1F), MAP_NUM(CERULEAN_CAVE_1F), 3 }, { MAP_GROUP(MT_EMBER_RUBY_PATH_B4F), MAP_NUM(MT_EMBER_RUBY_PATH_B4F), 1 }, { MAP_GROUP(MT_EMBER_SUMMIT_PATH_1F), MAP_NUM(MT_EMBER_SUMMIT_PATH_1F), 3 }, { MAP_GROUP(MT_EMBER_RUBY_PATH_B5F), MAP_NUM(MT_EMBER_RUBY_PATH_B5F), 7 }, { MAP_GROUP(THREE_ISLAND_BERRY_FOREST), MAP_NUM(THREE_ISLAND_BERRY_FOREST), 1 }, { MAP_GROUP(SIX_ISLAND_PATTERN_BUSH), MAP_NUM(SIX_ISLAND_PATTERN_BUSH), 1 }, { MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ENTRANCE), MAP_NUM(FIVE_ISLAND_LOST_CAVE_ENTRANCE), 15 }, { MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), 4 }, { MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), MAP_NUM(SIX_ISLAND_ALTERING_CAVE), 1 }, { MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), 7 } }; void HelpSystem_SetSomeVariable(u8 a0) { sSomeVariable = a0; } void HelpSystem_SetSomeVariable2(u8 a0) { switch (sSomeVariable) { case 23: case 24: case 25: case 26: if (a0 == 9 || a0 == 5 || a0 == 6 || a0 == 7 || a0 == 8) break; // fallthrough default: sSomeVariable = a0; break; } } void Special_SetSomeVariable(void) { sSomeVariable = gSpecialVar_0x8004; } void HelpSystem_BackupSomeVariable(void) { gSomeVariableBackup = sSomeVariable; } void HelpSystem_RestoreSomeVariable(void) { sSomeVariable = gSomeVariableBackup; } static bool32 IsInMartMap(void) { return IsCurrentMapInArray(sMartMaps); } static bool32 IsInGymMap(void) { return IsCurrentMapInArray(sGymMaps); } static bool32 IsCurrentMapInArray(const u16 * mapIdxs) { u16 mapIdx = (gSaveBlock1Ptr->location.mapGroup << 8) + gSaveBlock1Ptr->location.mapNum; s32 i; for (i = 0; mapIdxs[i] != MAP_UNDEFINED; i++) { if (mapIdxs[i] == mapIdx) return TRUE; } return FALSE; } static bool8 IsInDungeonMap(void) { u8 i, j; for (i = 0; i < 16; i++) { for (j = 0; j < sDungeonMaps[i][2]; j++) { if ( sDungeonMaps[i][0] == gSaveBlock1Ptr->location.mapGroup && sDungeonMaps[i][1] + j == gSaveBlock1Ptr->location.mapNum && (i != 15 /* TANOBY */ || FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS) == TRUE) ) return TRUE; } } return FALSE; } void sub_812B35C(void) { HelpSystem_EnableToggleWithRButton(); if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) HelpSystem_SetSomeVariable2(0x16); else if (IsInDungeonMap()) HelpSystem_SetSomeVariable2(0x15); else if (IsMapTypeIndoors(gMapHeader.mapType)) { if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F))) HelpSystem_SetSomeVariable2(0x0E); else if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB)) HelpSystem_SetSomeVariable2(0x0F); else if (IsCurMapPokeCenter() == TRUE) HelpSystem_SetSomeVariable2(0x10); else if (IsInMartMap() == TRUE) HelpSystem_SetSomeVariable2(0x11); else if (IsInGymMap() == TRUE) HelpSystem_SetSomeVariable2(0x12); else HelpSystem_SetSomeVariable2(0x13); } else HelpSystem_SetSomeVariable2(0x14); } bool8 sub_812B40C(void) { if (gUnknown_203B0EE == 1) return FALSE; if (gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID && FlagGet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO)) return FALSE; FlagSet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO); gUnknown_203B0EE = 1; return TRUE; } bool8 sub_812B45C(void) { if (gReceivedRemoteLinkPlayers == 1) return FALSE; return TRUE; } void HelpSystem_Disable(void) { gHelpSystemEnabled = FALSE; } void HelpSystem_Enable(void) { if (gQuestLogState != 2 && gQuestLogState != 3) { gHelpSystemEnabled = TRUE; HelpSystem_EnableToggleWithRButton(); } } void HelpSystem_DisableToggleWithRButton(void) { gHelpSystemToggleWithRButtonDisabled = TRUE; } void HelpSystem_EnableToggleWithRButton(void) { gHelpSystemToggleWithRButtonDisabled = FALSE; } static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { helpListMenu->sub.items = listMenuItemsBuffer; helpListMenu->sub.totalItems = 1; helpListMenu->sub.maxShowed = 1; helpListMenu->sub.left = 1; helpListMenu->sub.top = 4; } static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer); PrintTextOnPanel2Row52RightAlign(gUnknown_841DFAC); HelpSystem_InitListMenuController(helpListMenu, 0, sHelpSystemState[2]); PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); sub_813BDA4(1); sub_813BD5C(1); } static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { u8 i; u8 totalItems = 0; for (i = 0; i < 6; i++) { if (sHelpSystemContextTopicFlags[sSomeVariable][sHelpSystemContextTopicOrder[i]] == TRUE) { listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]]; listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i]; totalItems++; } } listMenuItemsBuffer[totalItems - 1].index = -2; helpListMenu->sub.totalItems = totalItems; helpListMenu->sub.maxShowed = totalItems; helpListMenu->sub.left = 0; } static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sub_813BDE8(0); sub_813BFC0(0); sub_813BE78(1); ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer); PrintTextOnPanel2Row52RightAlign(gUnknown_841DFC9); HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos); HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0); sub_813BDA4(1); sub_813BD5C(1); } static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { u8 totalItems = 0; const u8 * indexPtr = sHelpSystemSubmenuIndexPointers[sSomeVariable * 5 + sHelpSystemState[1]]; u8 i; for (i = 0; indexPtr[i] != 0xFF; i++) { if (HelpSystemSubmenuIndexIsActive(indexPtr[i]) == TRUE) { if (sHelpSystemState[1] == 0) listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[indexPtr[i]]; else if (sHelpSystemState[1] == 1) listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[indexPtr[i]]; else if (sHelpSystemState[1] == 2) listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]]; else if (sHelpSystemState[1] == 3) listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[indexPtr[i]]; else listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[indexPtr[i]]; listMenuItemsBuffer[totalItems].index = indexPtr[i]; totalItems++; } } if (HelpSystem_HasDefeatedBrock() == TRUE) { for (i = 0, indexPtr = gUnknown_845B9BE; indexPtr[i] != 0xFF; i++) { listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]]; listMenuItemsBuffer[totalItems].index = indexPtr[i]; totalItems++; } } listMenuItemsBuffer[totalItems].label = gUnknown_81B2E6F; listMenuItemsBuffer[totalItems].index = -2; totalItems++; helpListMenu->sub.totalItems = totalItems; helpListMenu->sub.maxShowed = 7; helpListMenu->sub.left = 0; helpListMenu->sub.top = 21; } static bool8 HelpSystem_HasDefeatedBrock(void) { if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && sHelpSystemState[1] == 2) return TRUE; return FALSE; } static bool8 HelpSystemSubmenuIndexIsActive(u8 id) { u8 i = 0; if (sHelpSystemState[1] == 0) { switch (id) { case 1: case 2: case 3: case 5: case 8: case 34: case 38: case 41: case 42: case 43: return TRUE; case 4: return FlagGet(FLAG_VISITED_OAKS_LAB); case 6: case 10: case 16: case 19: case 22: case 35: case 36: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY); case 7: return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY); case 11: case 24: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST); case 9: case 13: case 14: case 15: case 17: case 18: case 20: case 26: case 29: case 31: case 37: return FlagGet(FLAG_SYS_POKEMON_GET); case 21: case 23: return FlagGet(FLAG_SYS_POKEDEX_GET); case 12: case 25: case 27: case 30: case 32: case 33: return FlagGet(FLAG_BADGE01_GET); case 28: case 40: return HasGottenAtLeastOneHM(); case 39: return FlagGet(FLAG_GOT_FAME_CHECKER); case 44: return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY); } return FALSE; } if (sHelpSystemState[1] == 1) { switch (id) { case 06: case 10: case 11: case 12: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 31: case 36: case 38: case 39: case 40: case 41: case 42: case 45: case 46: case 47: return TRUE; case 1: case 30: case 37: return FlagGet(FLAG_SYS_POKEDEX_GET); case 14: return CheckBagHasItem(ITEM_TOWN_MAP, 1); case 2: case 3: case 5: case 7: case 8: case 9: case 13: case 32: case 33: case 35: case 43: case 44: return FlagGet(FLAG_SYS_POKEMON_GET); case 4: case 34: if (GetKantoPokedexCount(1) > 1) return TRUE; return FALSE; case 15: return FlagGet(FLAG_BADGE01_GET); case 16: case 17: return HasGottenAtLeastOneHM(); case 18: return FlagGet(FLAG_GOT_BICYCLE); case 48: return FlagGet(FLAG_SYS_GAME_CLEAR); } return FALSE; } if (sHelpSystemState[1] == 2) { if (HelpSystem_HasDefeatedBrock() == TRUE) { for (i = 0; gUnknown_845B9BE[i] != 0xFF; i++) { if (gUnknown_845B9BE[i] == id) return FALSE; } } switch (id) { case 14: case 17: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 38: return TRUE; case 1: case 2: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 16: case 19: case 20: case 21: return FlagGet(FLAG_SYS_POKEMON_GET); case 36: case 37: return HasGottenAtLeastOneHM(); case 3: case 15: case 18: case 39: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST); } return TRUE; } if (sHelpSystemState[1] == 3) { switch (id) { case 5: return FlagGet(FLAG_BADGE01_GET); case 6: return FlagGet(FLAG_BADGE02_GET); } return TRUE; } if (sHelpSystemState[1] == 4) { return TRUE; } return FALSE; } static bool8 HasGottenAtLeastOneHM(void) { if (FlagGet(FLAG_GOT_HM01) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM02) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM03) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM04) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM05) == TRUE) return TRUE; if (FlagGet(FLAG_GOT_HM06) == TRUE) return TRUE; if (FlagGet(FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07) == TRUE) return TRUE; return FALSE; } bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { switch (helpListMenu->state) { case 8: return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer); case 9: return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer); case 10: return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer); case 0: return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer); case 1: return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer); case 2: return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer); case 3: return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer); case 4: return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer); case 5: return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer); case 6: return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer); } return FALSE; } bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { PrintTextOnPanel2Row52RightAlign(gUnknown_841DFA5); PrintWelcomeMessageOnPanel1(); sub_813BDA4(1); sub_813BD5C(1); helpListMenu->state = 9; return TRUE; } bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); helpListMenu->state = 10; } return TRUE; } bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sHelpSystemState[2] = 0; ResetHelpSystemCursor(helpListMenu); BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); helpListMenu->state = 0; return TRUE; } bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 v0 = HelpSystem_GetMenuInput(); switch (v0) { case -6: case -2: return FALSE; case -5: case -4: PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); break; case -3: case -1: break; default: sHelpSystemState[1] = v0; helpListMenu->state = 1; break; } return TRUE; } bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sHelpSystemState[0] = 1; sHelpSystemState[2] = helpListMenu->cursorPos; ResetHelpSystemCursor(helpListMenu); BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); sub_813C75C(); HelpSystem_SetInputDelay(2); helpListMenu->state = 3; return TRUE; } bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sub_813C004(0, 0); sub_813C004(1, 0); sHelpSystemState[0] = 0; BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); helpListMenu->state = 0; return TRUE; } bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 v0 = HelpSystem_GetMenuInput(); switch (v0) { case -6: return FALSE; case -2: helpListMenu->state = 2; break; case -5: case -4: case -3: case -1: break; default: sHelpSystemState[3] = v0; helpListMenu->state = 4; break; } return TRUE; } void sub_812BDEC(void) { HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0); } bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sHelpSystemState[0] = 2; sub_813BDA4(0); HelpSystem_FillPanel1(); PrintTextOnPanel2Row52RightAlign(gUnknown_841DFBE); sub_813BDE8(1); sub_813BEE4(1); if (sHelpSystemState[1] == 0) { HelpSystem_PrintTwoStrings(sHelpSystemSpecializedQuestionTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedAnswerTextPtrs[sHelpSystemState[3]]); } else if (sHelpSystemState[1] == 1) { HelpSystem_PrintTwoStrings(sHelpSystemMenuTopicTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedControlsTextPtrs[sHelpSystemState[3]]); } else if (sHelpSystemState[1] == 2) { HelpSystem_PrintTwoStrings(sHelpSystemSpecializedStringsTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedStringDefinitionsTextPtrs[sHelpSystemState[3]]); } else if (sHelpSystemState[1] == 3) { HelpSystem_PrintTwoStrings(sHelpSystemGeneralTopicTextPtrs[sHelpSystemState[3]], sHelpSystemGeneralTopicDescriptionTextPtrs[sHelpSystemState[3]]); } else { HelpSystem_PrintTwoStrings(sHelpSystemTypeMatchupTextPtrs[sHelpSystemState[3]], sHelpSystemTypeMatchupDescriptionTextPtrs[sHelpSystemState[3]]); } sub_813BDA4(1); sub_813BD5C(1); helpListMenu->state = 6; return TRUE; } bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sHelpSystemState[0] = 1; BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); sub_813C75C(); HelpSystem_SetInputDelay(2); helpListMenu->state = 3; return TRUE; } bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); helpListMenu->state = 5; return TRUE; } if (JOY_NEW(L_BUTTON | R_BUTTON)) return FALSE; return TRUE; } static void PrintWelcomeMessageOnPanel1(void) { HelpSystem_FillPanel1(); HelpSystem_PrintTextAt(gUnknown_81B2FC9, 0, 0); } static void PrintTextOnPanel2Row52RightAlign(const u8 * str) { HelpSystem_FillPanel2(); HelpSystem_PrintTextRightAlign_Row52(str); } u8 sub_812BF88(void) { return sHelpSystemState[0]; } static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu) { helpListMenu->itemsAbove = 0; helpListMenu->cursorPos = 0; } static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index; if (index == -2) HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[5]); else HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[index]); sub_813BE30(1); }