From e8abfbce496a97f225938131017ec03c77ff4e2d Mon Sep 17 00:00:00 2001 From: Nephrite Date: Fri, 4 Jul 2025 18:07:53 +0100 Subject: [PATCH] Untangled TMs and HMs from item ids (#7173) --- include/constants/items.h | 3 - include/item.h | 124 ++++++++++++++++++++++++++++------- include/metaprogram.h | 24 ++++++- include/pokemon.h | 3 +- src/apprentice.c | 8 +-- src/battle_dome.c | 7 +- src/battle_script_commands.c | 2 +- src/battle_util.c | 2 +- src/data/items.h | 108 ------------------------------ src/daycare.c | 4 +- src/debug.c | 5 +- src/evolution_scene.c | 4 +- src/field_specials.c | 3 +- src/item.c | 25 ++++++- src/item_icon.c | 12 ++-- src/item_menu.c | 8 +-- src/item_use.c | 2 +- src/party_menu.c | 20 +----- src/pokedex_plus_hgss.c | 16 ++--- src/pokemon.c | 28 ++++---- src/pokemon_summary_screen.c | 2 +- 21 files changed, 201 insertions(+), 209 deletions(-) diff --git a/include/constants/items.h b/include/constants/items.h index 0abfc31a44..58f453414f 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -1027,9 +1027,6 @@ #define MAIL_NONE 0xFF #define ITEM_TO_MULCH(itemId)(((itemId) - ITEM_GROWTH_MULCH) + 1) -#define NUM_TECHNICAL_MACHINES 100 -#define NUM_HIDDEN_MACHINES 8 - #define MAX_BAG_ITEM_CAPACITY 999 #define MAX_PC_ITEM_CAPACITY 999 #define MAX_PYRAMID_BAG_ITEM_CAPACITY 99 // Values higher than 255 require free SaveBlock2 space. diff --git a/include/item.h b/include/item.h index 7fcdb37fe3..b14d9bdf14 100644 --- a/include/item.h +++ b/include/item.h @@ -3,8 +3,44 @@ #include "constants/item.h" #include "constants/items.h" +#include "constants/moves.h" #include "constants/tms_hms.h" +/* Expands to: + * enum + * { + * ITEM_TM_FOCUS_PUNCH = ITEM_TM01, + * ... + * ITEM_HM_CUT = ITM_HM01, + * ... + * }; */ +#define ENUM_TM(n, id) CAT(ITEM_TM_, id) = CAT(ITEM_TM, n), +#define ENUM_HM(n, id) CAT(ITEM_HM_, id) = CAT(ITEM_HM, n), +#define TO_TMHM_NUMS(a, ...) (__VA_ARGS__) +enum TMHMItemId +{ + RECURSIVELY(R_ZIP(ENUM_TM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_TM(APPEND_COMMA)))) + RECURSIVELY(R_ZIP(ENUM_HM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_HM(APPEND_COMMA)))) +}; + +#undef ENUM_TM +#undef ENUM_HM +#undef TO_TMHM_NUMS + +/* Each of these TM_HM enums corresponds an index in the list of TMs + HMs item ids in + * gTMHMItemMoveIds. The index for an item can be retrieved with GetItemTMHMIndex below. + */ +#define UNPACK_TM_HM_ENUM(_tmHm) CAT(ENUM_TM_HM_, _tmHm), +enum TMHMIndex +{ + FOREACH_TMHM(UNPACK_TM_HM_ENUM) + NUM_ALL_MACHINES, + NUM_TECHNICAL_MACHINES = (0 FOREACH_TM(PLUS_ONE)), + NUM_HIDDEN_MACHINES = (0 FOREACH_HM(PLUS_ONE)), +}; + +#undef UNPACK_TM_HM_ENUM + typedef void (*ItemUseFunc)(u8); struct Item @@ -20,8 +56,8 @@ struct Item u8 holdEffectParam; u8 importance:2; u8 notConsumed:1; - u8 padding:5; - enum Pocket pocket:8; + enum Pocket pocket:5; + u8 padding; u8 type; u8 battleUsage; u8 flingPower; @@ -29,14 +65,75 @@ struct Item const u16 *iconPalette; }; -struct __attribute__((packed, aligned(2))) BagPocket +struct ALIGNED(2) BagPocket { struct ItemSlot *itemSlots; u16 capacity; }; +struct TmHmIndexKey +{ + enum TMHMItemId itemId:16; + u16 moveId; +}; + extern const struct Item gItemsInfo[]; extern struct BagPocket gBagPockets[]; +extern const struct TmHmIndexKey gTMHMItemMoveIds[]; + +#define UNPACK_ITEM_TO_TM_INDEX(_tm) case CAT(ITEM_TM_, _tm): return CAT(ENUM_TM_HM_, _tm) + 1; +#define UNPACK_ITEM_TO_HM_INDEX(_hm) case CAT(ITEM_HM_, _hm): return CAT(ENUM_TM_HM_, _hm) + 1; +#define UNPACK_ITEM_TO_TM_MOVE_ID(_tm) case CAT(ITEM_TM_, _tm): return CAT(MOVE_, _tm); +#define UNPACK_ITEM_TO_HM_MOVE_ID(_hm) case CAT(ITEM_HM_, _hm): return CAT(MOVE_, _hm); + +static inline enum TMHMIndex GetItemTMHMIndex(u16 item) +{ + switch (item) + { + /* Expands to: + * case ITEM_TM_FOCUS_PUNCH: + * return 1; + * case ITEM_TM_DRAGON_CLAW: + * return 2; + * etc */ + FOREACH_TM(UNPACK_ITEM_TO_TM_INDEX) + FOREACH_HM(UNPACK_ITEM_TO_HM_INDEX) + default: + return 0; + } +} + +static inline u16 GetItemTMHMMoveId(u16 item) +{ + switch (item) + { + /* Expands to: + * case ITEM_TM_FOCUS_PUNCH: + * return MOVE_FOCUS_PUNCH; + * case ITEM_TM_DRAGON_CLAW: + * return MOVE_DRAGON_CLAW; + * etc */ + FOREACH_TM(UNPACK_ITEM_TO_TM_MOVE_ID) + FOREACH_HM(UNPACK_ITEM_TO_HM_MOVE_ID) + default: + return MOVE_NONE; + } +} + +#undef UNPACK_ITEM_TO_TM_INDEX +#undef UNPACK_ITEM_TO_HM_INDEX +#undef UNPACK_ITEM_TO_TM_MOVE_ID +#undef UNPACK_ITEM_TO_HM_MOVE_ID + +static inline enum TMHMItemId GetTMHMItemId(enum TMHMIndex index) +{ + return gTMHMItemMoveIds[index].itemId; +} + +static inline u16 GetTMHMMoveId(enum TMHMIndex index) +{ + return gTMHMItemMoveIds[index].moveId; +} u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos); u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos); @@ -85,25 +182,4 @@ u32 GetItemStatus1Mask(u16 itemId); u32 GetItemStatus2Mask(u16 itemId); u32 GetItemSellPrice(u32 itemId); -/* Expands to: - * enum - * { - * ITEM_TM_FOCUS_PUNCH, - * ... - * ITEM_HM_CUT, - * ... - * }; */ -#define ENUM_TM(id) CAT(ITEM_TM_, id), -#define ENUM_HM(id) CAT(ITEM_HM_, id), -enum -{ - ENUM_TM_START_ = ITEM_TM01 - 1, - FOREACH_TM(ENUM_TM) - - ENUM_HM_START_ = ITEM_HM01 - 1, - FOREACH_HM(ENUM_HM) -}; -#undef ENUM_TM -#undef ENUM_HM - #endif // GUARD_ITEM_H diff --git a/include/metaprogram.h b/include/metaprogram.h index e12822946a..47fa99af72 100644 --- a/include/metaprogram.h +++ b/include/metaprogram.h @@ -26,8 +26,9 @@ #define STR(...) STR_(__VA_ARGS__) #define STR_(...) #__VA_ARGS__ -/* You'll never guess what this one does */ +/* You'll never guess what these do */ #define APPEND_SEMICOLON(a) a; +#define APPEND_COMMA(a) a, /* Converts a string to a compound literal, essentially making it a pointer to const u8 */ #define COMPOUND_STRING(str) (const u8[]) _(str) @@ -98,6 +99,21 @@ #define R_FOR_EACH_WITH_(macro, args, a, ...) INVOKE_WITH(macro, args, a) __VA_OPT__(R_FOR_EACH_WITH_P PARENS (macro, args, __VA_ARGS__)) #define R_FOR_EACH_WITH_P() R_FOR_EACH_WITH_ +/* Expands to 'macro(a, b)' for each 'a' in 'as' and 'b' in 'bs'. + * Uses the shorter of 'as' and 'bs'. (Credit to MGriffin) */ +#define R_ZIP(macro, as, bs) CAT(R_ZIP_, CAT(R_ZIP_NONEMPTY(as), R_ZIP_NONEMPTY(bs)))(macro, FIRST as, FIRST bs, (EXCEPT_1 as), (EXCEPT_1 bs)) +#define R_ZIP_00(macro, a, b, as, bs) +#define R_ZIP_01(macro, a, b, as, bs) +#define R_ZIP_10(macro, a, b, as, bs) +#define R_ZIP_11(macro, a, b, as, bs) macro(a, b) R_ZIP_P PARENS (macro, as, bs) +#define R_ZIP_P() R_ZIP + +#define R_ZIP_NONEMPTY(as) R_ZIP_NONEMPTY_ as +#define R_ZIP_NONEMPTY_(...) FIRST(__VA_OPT__(1,) 0) + +/* Just a lot of numbers (with leading zeroes - remove with REMOVE_LEADING_ZEROES) */ +#define NUMBERS_256 (00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255) + /* Picks the xth VA_ARG if it exists, otherwise returns a default value */ #define DEFAULT(_default, ...) FIRST(__VA_OPT__(__VA_ARGS__, ) _default) #define DEFAULT_2(_default, ...) DEFAULT(_default __VA_OPT__(, SECOND(__VA_ARGS__))) @@ -171,4 +187,10 @@ Input must be of the form (upper << lower) where upper can be up to 3, lower up /* Finds the required digits to display the number (maximum 4) */ #define MAX_DIGITS(_num) 1 + !!(_num / 10) + !!(_num / 100) + !!(_num / 1000) +/* Converts a number with leading zeroes to a normal int (base 10 and up to three digits only!) */ +#define REMOVE_LEADING_ZEROES(_num) (((0x##_num / 256) * 100) + ((0x##_num / 16) * 10) + (0x##_num % 16)) + +/* Useful for counting arguments */ +#define PLUS_ONE(...) + 1 + #endif diff --git a/include/pokemon.h b/include/pokemon.h index 3b4cc0715b..f6c242606f 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -824,7 +824,8 @@ void CreateTask_PlayMapChosenOrBattleBGM(u16 songId); const u16 *GetMonFrontSpritePal(struct Pokemon *mon); const u16 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, bool32 isShiny, u32 personality); const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFemale); -bool8 IsMoveHM(u16 move); +bool32 IsMoveHM(u16 move); +bool32 CannotForgetMove(u16 move); bool8 IsMonSpriteNotFlipped(u16 species); s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor); s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor); diff --git a/src/apprentice.c b/src/apprentice.c index 4b0403b281..585b4eed43 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -353,14 +353,12 @@ static u16 GetRandomAlternateMove(u8 monId) // NOTE: Below is an infinite loop if a species which cannot learn TMs is assigned to an Apprentice do { - id = Random() % (NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES); - shouldUseMove = CanLearnTeachableMove(species, ItemIdToBattleMoveId(ITEM_TM01 + id)); + id = (Random() % NUM_ALL_MACHINES) + 1; + move = GetTMHMMoveId(id); + shouldUseMove = CanLearnTeachableMove(species, move); } while (!shouldUseMove); - move = ItemIdToBattleMoveId(ITEM_TM01 + id); - shouldUseMove = TRUE; - if (numLearnsetMoves <= MAX_MON_MOVES) j = 0; else diff --git a/src/battle_dome.c b/src/battle_dome.c index ff7fe4b8b0..68bd6af252 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -27,6 +27,7 @@ #include "sound.h" #include "pokemon_icon.h" #include "data.h" +#include "item.h" #include "international_string_util.h" #include "trainer_pokemon_sprites.h" #include "scanline_effect.h" @@ -3976,12 +3977,12 @@ static bool32 IsDomeLuckyMove(u32 move) static bool32 IsDomePopularMove(u32 move) { u8 i; - for (i = 0; i < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; i++) + for (i = 0; i < NUM_ALL_MACHINES; i++) { - if (ItemIdToBattleMoveId(ITEM_TM01 + i) == move) + if (GetTMHMMoveId(i + 1) == move) return TRUE; } - if (i == NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) + if (i == NUM_ALL_MACHINES) return FALSE; // Filter in TMs/HMs if (GetMovePower(move) >= 90) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4372b09291..e49d824d75 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8497,7 +8497,7 @@ static void Cmd_yesnoboxlearnmove(void) else { u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, B_POSITION_PLAYER_LEFT); gBattleScripting.learnMoveState = 6; diff --git a/src/battle_util.c b/src/battle_util.c index 31caab95a0..76786d1f44 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10445,7 +10445,7 @@ enum DamageCategory GetCategoryBasedOnStats(u32 battler) static u32 GetFlingPowerFromItemId(u32 itemId) { - if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08) + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) { u32 power = GetMovePower(ItemIdToBattleMoveId(itemId)); if (power > 1) diff --git a/src/data/items.h b/src/data/items.h index 187b4bc399..d1d7ae3125 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -10454,7 +10454,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FOCUS_PUNCH, }, [ITEM_TM_DRAGON_CLAW] = @@ -10469,7 +10468,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DRAGON_CLAW, }, [ITEM_TM_WATER_PULSE] = @@ -10484,7 +10482,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_WATER_PULSE, }, [ITEM_TM_CALM_MIND] = @@ -10499,7 +10496,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_CALM_MIND, }, [ITEM_TM_ROAR] = @@ -10514,7 +10510,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROAR, }, [ITEM_TM_TOXIC] = @@ -10529,7 +10524,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TOXIC, }, [ITEM_TM_HAIL] = @@ -10551,7 +10545,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HAIL, }, [ITEM_TM_BULK_UP] = @@ -10566,7 +10559,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BULK_UP, }, [ITEM_TM_BULLET_SEED] = @@ -10581,7 +10573,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BULLET_SEED, }, [ITEM_TM_HIDDEN_POWER] = @@ -10596,7 +10587,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HIDDEN_POWER, }, [ITEM_TM_SUNNY_DAY] = @@ -10611,7 +10601,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SUNNY_DAY, }, [ITEM_TM_TAUNT] = @@ -10626,7 +10615,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TAUNT, }, [ITEM_TM_ICE_BEAM] = @@ -10645,7 +10633,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ICE_BEAM, }, [ITEM_TM_BLIZZARD] = @@ -10666,7 +10653,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BLIZZARD, }, [ITEM_TM_HYPER_BEAM] = @@ -10681,7 +10667,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_HYPER_BEAM, }, [ITEM_TM_LIGHT_SCREEN] = @@ -10696,7 +10681,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_LIGHT_SCREEN, }, [ITEM_TM_PROTECT] = @@ -10711,7 +10695,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_PROTECT, }, [ITEM_TM_RAIN_DANCE] = @@ -10726,7 +10709,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_RAIN_DANCE, }, [ITEM_TM_GIGA_DRAIN] = @@ -10741,7 +10723,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_GIGA_DRAIN, }, [ITEM_TM_SAFEGUARD] = @@ -10756,7 +10737,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SAFEGUARD, }, [ITEM_TM_FRUSTRATION] = @@ -10771,7 +10751,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FRUSTRATION, }, [ITEM_TM_SOLAR_BEAM] = @@ -10786,7 +10765,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SOLAR_BEAM, }, [ITEM_TM_IRON_TAIL] = @@ -10801,7 +10779,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_IRON_TAIL, }, [ITEM_TM_THUNDERBOLT] = @@ -10816,7 +10793,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THUNDERBOLT, }, [ITEM_TM_THUNDER] = @@ -10831,7 +10807,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THUNDER, }, [ITEM_TM_EARTHQUAKE] = @@ -10846,7 +10821,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_EARTHQUAKE, }, [ITEM_TM_RETURN] = @@ -10861,7 +10835,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_RETURN, }, [ITEM_TM_DIG] = @@ -10876,7 +10849,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DIG, }, [ITEM_TM_PSYCHIC] = @@ -10891,7 +10863,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_PSYCHIC, }, [ITEM_TM_SHADOW_BALL] = @@ -10906,7 +10877,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SHADOW_BALL, }, [ITEM_TM_BRICK_BREAK] = @@ -10921,7 +10891,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_BRICK_BREAK, }, [ITEM_TM_DOUBLE_TEAM] = @@ -10936,7 +10905,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DOUBLE_TEAM, }, [ITEM_TM_REFLECT] = @@ -10951,7 +10919,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_REFLECT, }, [ITEM_TM_SHOCK_WAVE] = @@ -10966,7 +10933,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SHOCK_WAVE, }, [ITEM_TM_FLAMETHROWER] = @@ -10981,7 +10947,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLAMETHROWER, }, [ITEM_TM_SLUDGE_BOMB] = @@ -10996,7 +10961,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SLUDGE_BOMB, }, [ITEM_TM_SANDSTORM] = @@ -11011,7 +10975,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SANDSTORM, }, [ITEM_TM_FIRE_BLAST] = @@ -11026,7 +10989,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FIRE_BLAST, }, [ITEM_TM_ROCK_TOMB] = @@ -11041,7 +11003,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROCK_TOMB, }, [ITEM_TM_AERIAL_ACE] = @@ -11056,7 +11017,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_AERIAL_ACE, }, [ITEM_TM_TORMENT] = @@ -11071,7 +11031,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_TORMENT, }, [ITEM_TM_FACADE] = @@ -11086,7 +11045,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FACADE, }, [ITEM_TM_SECRET_POWER] = @@ -11101,7 +11059,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SECRET_POWER, }, [ITEM_TM_REST] = @@ -11116,7 +11073,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_REST, }, [ITEM_TM_ATTRACT] = @@ -11131,7 +11087,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ATTRACT, }, [ITEM_TM_THIEF] = @@ -11146,7 +11101,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_THIEF, }, [ITEM_TM_STEEL_WING] = @@ -11161,7 +11115,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_STEEL_WING, }, [ITEM_TM_SKILL_SWAP] = @@ -11176,7 +11129,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SKILL_SWAP, }, [ITEM_TM_SNATCH] = @@ -11191,7 +11143,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SNATCH, }, [ITEM_TM_OVERHEAT] = @@ -11206,7 +11157,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_OVERHEAT, }, [ITEM_TM51] = @@ -11218,7 +11168,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM52] = @@ -11230,7 +11179,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM53] = @@ -11242,7 +11190,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM54] = @@ -11254,7 +11201,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM55] = @@ -11266,7 +11212,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM56] = @@ -11278,7 +11223,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM57] = @@ -11290,7 +11234,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM58] = @@ -11302,7 +11245,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM59] = @@ -11314,7 +11256,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM60] = @@ -11326,7 +11267,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM61] = @@ -11338,7 +11278,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM62] = @@ -11350,7 +11289,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM63] = @@ -11362,7 +11300,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM64] = @@ -11374,7 +11311,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM65] = @@ -11386,7 +11322,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM66] = @@ -11398,7 +11333,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM67] = @@ -11410,7 +11344,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM68] = @@ -11422,7 +11355,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM69] = @@ -11434,7 +11366,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM70] = @@ -11446,7 +11377,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM71] = @@ -11458,7 +11388,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM72] = @@ -11470,7 +11399,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM73] = @@ -11482,7 +11410,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM74] = @@ -11494,7 +11421,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM75] = @@ -11506,7 +11432,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM76] = @@ -11518,7 +11443,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM77] = @@ -11530,7 +11454,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM78] = @@ -11542,7 +11465,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM79] = @@ -11554,7 +11476,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM80] = @@ -11566,7 +11487,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM81] = @@ -11578,7 +11498,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM82] = @@ -11590,7 +11509,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM83] = @@ -11602,7 +11520,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM84] = @@ -11614,7 +11531,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM85] = @@ -11626,7 +11542,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM86] = @@ -11638,7 +11553,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM87] = @@ -11650,7 +11564,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM88] = @@ -11662,7 +11575,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM89] = @@ -11674,7 +11586,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM90] = @@ -11686,7 +11597,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM91] = @@ -11698,7 +11608,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM92] = @@ -11710,7 +11619,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM93] = @@ -11722,7 +11630,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM94] = @@ -11734,7 +11641,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM95] = @@ -11746,7 +11652,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM96] = @@ -11758,7 +11663,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM97] = @@ -11770,7 +11674,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM98] = @@ -11782,7 +11685,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM99] = @@ -11794,7 +11696,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_TM100] = @@ -11806,7 +11707,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_NONE, // Todo }, [ITEM_HM_CUT] = @@ -11821,7 +11721,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_CUT, }, [ITEM_HM_FLY] = @@ -11836,7 +11735,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLY, }, [ITEM_HM_SURF] = @@ -11851,7 +11749,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_SURF, }, [ITEM_HM_STRENGTH] = @@ -11866,7 +11763,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_STRENGTH, }, [ITEM_HM_FLASH] = @@ -11881,7 +11777,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_FLASH, }, [ITEM_HM_ROCK_SMASH] = @@ -11896,7 +11791,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_ROCK_SMASH, }, [ITEM_HM_WATERFALL] = @@ -11911,7 +11805,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_WATERFALL, }, [ITEM_HM_DIVE] = @@ -11926,7 +11819,6 @@ const struct Item gItemsInfo[] = .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = MOVE_DIVE, }, diff --git a/src/daycare.c b/src/daycare.c index e2f6f8f070..fdb98d6630 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -895,9 +895,9 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru { if (sHatchedEggFatherMoves[i] != MOVE_NONE) { - for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) + for (j = 0; j < NUM_ALL_MACHINES; j++) { - u16 moveId = ItemIdToBattleMoveId(ITEM_TM01 + j); + u16 moveId = GetTMHMMoveId(j + 1); if (sHatchedEggFatherMoves[i] == moveId && CanLearnTeachableMove(GetMonData(egg, MON_DATA_SPECIES_OR_EGG), moveId)) { if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == MON_HAS_MAX_MOVES) diff --git a/src/debug.c b/src/debug.c index e46c5c5062..3f970ae7fc 100644 --- a/src/debug.c +++ b/src/debug.c @@ -3236,10 +3236,11 @@ static void DebugAction_PCBag_Fill_PocketPokeBalls(u8 taskId) static void DebugAction_PCBag_Fill_PocketTMHM(u8 taskId) { - u16 itemId; + u16 index, itemId; - for (itemId = ITEM_TM01; itemId <= ITEM_HM08; itemId++) + for (index = 0; index < NUM_ALL_MACHINES; index++) { + itemId = GetTMHMItemId(index + 1); if (CheckBagHasSpace(itemId, 1) && ItemIdToBattleMoveId(itemId) != MOVE_NONE) AddBagItem(itemId, 1); } diff --git a/src/evolution_scene.c b/src/evolution_scene.c index c746414958..1f9d2af8fa 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -992,7 +992,7 @@ static void Task_EvolutionScene(u8 taskId) { // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN]); @@ -1376,7 +1376,7 @@ static void Task_TradeEvolutionScene(u8 taskId) { // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); - if (IsMoveHM(move)) + if (CannotForgetMove(move)) { // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN]); diff --git a/src/field_specials.c b/src/field_specials.c index 0ac0d9fa68..927326e399 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -19,6 +19,7 @@ #include "field_weather.h" #include "graphics.h" #include "international_string_util.h" +#include "item.h" #include "item_icon.h" #include "link.h" #include "load_save.h" @@ -1671,7 +1672,7 @@ u16 GetMysteryGiftCardStat(void) bool8 BufferTMHMMoveName(void) { - if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08) + if (gItemsInfo[gSpecialVar_0x8004].pocket == POCKET_TM_HM) { StringCopy(gStringVar2, GetMoveName(ItemIdToBattleMoveId(gSpecialVar_0x8004))); return TRUE; diff --git a/src/item.c b/src/item.c index fb470866bc..f0f9071c5a 100644 --- a/src/item.c +++ b/src/item.c @@ -31,6 +31,27 @@ EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0}; #include "data/pokemon/item_effects.h" #include "data/items.h" +#define UNPACK_TM_ITEM_ID(_tm) [CAT(ENUM_TM_HM_, _tm) + 1] = { CAT(ITEM_TM_, _tm), CAT(MOVE_, _tm) }, +#define UNPACK_HM_ITEM_ID(_hm) [CAT(ENUM_TM_HM_, _hm) + 1] = { CAT(ITEM_HM_, _hm), CAT(MOVE_, _hm) }, + +const struct TmHmIndexKey gTMHMItemMoveIds[NUM_ALL_MACHINES + 1] = +{ + [0] = { ITEM_NONE, MOVE_NONE }, // Failsafe + FOREACH_TM(UNPACK_TM_ITEM_ID) + FOREACH_HM(UNPACK_HM_ITEM_ID) + /* + * Expands to the following: + * + * [1] = { ITEM_TM_FOCUS_PUNCH, MOVE_FOCUS_PUNCH }, + * [2] = { ITEM_TM_DRAGON_CLAW, MOVE_DRAGON_CLAW }, + * [3] = { ITEM_TM_WATER_PULSE, MOVE_WATER_PULSE }, + * etc etc + */ +}; + +#undef UNPACK_TM_ITEM_ID +#undef UNPACK_HM_ITEM_ID + static inline u16 GetBagItemIdPocket(struct BagPocket *pocket, u32 pocketPos) { return pocket->itemSlots[pocketPos].itemId; @@ -592,7 +613,9 @@ void SortBerriesOrTMHMs(enum Pocket pocketId) { if (GetBagItemQuantity(pocketId, j) == 0 || GetBagItemId(pocketId, j) == ITEM_NONE) continue; - if (GetBagItemId(pocketId, i) <= GetBagItemId(pocketId, j)) + if (pocketId == POCKET_BERRIES && GetBagItemId(pocketId, i) <= GetBagItemId(pocketId, j)) // To do + continue; + if (pocketId == POCKET_TM_HM && GetItemTMHMIndex(GetBagItemId(pocketId, i)) <= GetItemTMHMIndex(GetBagItemId(pocketId, j))) continue; } SwapItemSlots(pocketId, i, j); diff --git a/src/item_icon.c b/src/item_icon.c index a218ebaf8e..8d4ff3223d 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -166,11 +166,11 @@ const void *GetItemIconPic(u16 itemId) return gItemIcon_ReturnToFieldArrow; // Use last icon, the "return to field" arrow if (itemId >= ITEMS_COUNT) return gItemsInfo[0].iconPic; - if (itemId >= ITEM_TM01 && itemId < ITEM_HM01 + NUM_HIDDEN_MACHINES) + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) { - if (itemId < ITEM_TM01 + NUM_TECHNICAL_MACHINES) - return gItemIcon_TM; - return gItemIcon_HM; + if (GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) + return gItemIcon_HM; + return gItemIcon_TM; } return gItemsInfo[itemId].iconPic; @@ -182,8 +182,8 @@ const u16 *GetItemIconPalette(u16 itemId) return gItemIconPalette_ReturnToFieldArrow; if (itemId >= ITEMS_COUNT) return gItemsInfo[0].iconPalette; - if (itemId >= ITEM_TM01 && itemId < ITEM_HM01 + NUM_HIDDEN_MACHINES) - return gTypesInfo[GetMoveType(gItemsInfo[itemId].secondaryId)].paletteTMHM; + if (gItemsInfo[itemId].pocket == POCKET_TM_HM) + return gTypesInfo[GetMoveType(GetItemTMHMMoveId(itemId))].paletteTMHM; return gItemsInfo[itemId].iconPalette; } diff --git a/src/item_menu.c b/src/item_menu.c index aa241b7c75..647b99eb2d 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -916,16 +916,16 @@ static void GetItemNameFromPocket(u8 *dest, u16 itemId) case POCKET_TM_HM: end = StringCopy(gStringVar2, GetMoveName(ItemIdToBattleMoveId(itemId))); PrependFontIdToFit(gStringVar2, end, FONT_NARROW, 61); - if (itemId >= ITEM_HM01) + if (GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) { // Get HM number - ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_HM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 1); + ConvertIntToDecimalStringN(gStringVar1, GetItemTMHMIndex(itemId) - NUM_TECHNICAL_MACHINES, STR_CONV_MODE_LEADING_ZEROS, 1); StringExpandPlaceholders(dest, gText_NumberItem_HM); } else { // Get TM number - ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_TM01 + 1, STR_CONV_MODE_LEADING_ZEROS, 2); + ConvertIntToDecimalStringN(gStringVar1, GetItemTMHMIndex(itemId), STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(dest, gText_NumberItem_TMBerry); } break; @@ -983,7 +983,7 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) itemQuantity = GetBagItemQuantity(gBagPosition.pocket, itemIndex); // Draw HM icon - if (itemId >= ITEM_HM01 && itemId <= ITEM_HM08) + if (gBagPosition.pocket == POCKET_TM_HM && GetItemTMHMIndex(itemId) > NUM_TECHNICAL_MACHINES) BlitBitmapToWindow(windowId, gBagMenuHMIcon_Gfx, 8, y - 1, 16, 16); if (gBagPosition.pocket != POCKET_KEY_ITEMS && GetItemImportance(itemId) == FALSE) diff --git a/src/item_use.c b/src/item_use.c index ad0fb47565..9df366e595 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -884,7 +884,7 @@ void ItemUseOutOfBattle_DynamaxCandy(u8 taskId) void ItemUseOutOfBattle_TMHM(u8 taskId) { - if (gSpecialVar_ItemId >= ITEM_HM01) + if (GetItemTMHMIndex(gSpecialVar_ItemId) > NUM_TECHNICAL_MACHINES) DisplayItemMessage(taskId, FONT_NORMAL, sText_BootedUpHM, BootUpSoundTMHM); // HM else DisplayItemMessage(taskId, FONT_NORMAL, sText_BootedUpTM, BootUpSoundTMHM); // TM diff --git a/src/party_menu.c b/src/party_menu.c index 0954715a5d..16ea3522d7 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -158,14 +158,6 @@ enum { #define MENU_DIR_RIGHT 2 #define MENU_DIR_LEFT -2 -#define HM_MOVES_END 0xFFFF - -static const u16 sHMMoves[] = -{ - MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, - MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END -}; - enum { CAN_LEARN_MOVE, CANNOT_LEARN_MOVE, @@ -1567,14 +1559,8 @@ static bool8 DoesSelectedMonKnowHM(u8 *slotPtr) for (u32 i = 0; i < MAX_MON_MOVES; i++) { - u32 j = 0; - u16 move = GetMonData(&gPlayerParty[*slotPtr], MON_DATA_MOVE1 + i); - - while (sHMMoves[j] != HM_MOVES_END) - { - if (sHMMoves[j++] == move) - return TRUE; - } + if (IsMoveHM(GetMonData(&gPlayerParty[*slotPtr], MON_DATA_MOVE1 + i))) + return TRUE; } return FALSE; } @@ -5355,7 +5341,7 @@ void ItemUseCB_PPUp(u8 taskId, TaskFunc task) u16 ItemIdToBattleMoveId(u16 item) { - return (GetItemPocket(item) == POCKET_TM_HM) ? gItemsInfo[item].secondaryId : MOVE_NONE; + return (GetItemPocket(item) == POCKET_TM_HM) ? GetItemTMHMMoveId(item) : MOVE_NONE; } bool8 MonKnowsMove(struct Pokemon *mon, u16 move) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index d986ce63af..db7ff38ee0 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -290,9 +290,9 @@ static EWRAM_DATA u16 sLastSelectedPokemon = 0; static EWRAM_DATA u8 sPokeBallRotation = 0; static EWRAM_DATA struct PokedexListItem *sPokedexListItem = NULL; //Pokedex Plus HGSS_Ui -#define MOVES_COUNT_TOTAL (EGG_MOVES_ARRAY_COUNT + MAX_LEVEL_UP_MOVES + NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES) +#define MOVES_COUNT_TOTAL (EGG_MOVES_ARRAY_COUNT + MAX_LEVEL_UP_MOVES + NUM_ALL_MACHINES) EWRAM_DATA static u16 sStatsMoves[MOVES_COUNT_TOTAL] = {0}; -EWRAM_DATA static u16 sStatsMovesTMHM_ID[NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES] = {0}; +EWRAM_DATA static u16 sStatsMovesTMHM_ID[NUM_ALL_MACHINES] = {0}; struct SearchOptionText @@ -5054,13 +5054,13 @@ static u16 AddTMTutorMoves(u16 species, u16 movesTotal, u8 *numTMHMMoves, u8 *nu // TM Moves if (HGSS_SORT_TMS_BY_NUM) { - for (i = 0; i < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; i++) + for (i = 0; i < NUM_ALL_MACHINES; i++) { - move = ItemIdToBattleMoveId(ITEM_TM01 + i); + move = GetTMHMMoveId(i + 1); if (move != MOVE_NONE && CanLearnTeachableMove(species, move)) { isTMMove[move] = TRUE; - sStatsMovesTMHM_ID[*numTMHMMoves] = ITEM_TM01 + i; + sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(i + 1); (*numTMHMMoves)++; sStatsMoves[movesTotal] = move; movesTotal++; @@ -5072,12 +5072,12 @@ static u16 AddTMTutorMoves(u16 species, u16 movesTotal, u8 *numTMHMMoves, u8 *nu for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) { move = teachableLearnset[i]; - for (u16 j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) + for (u16 j = 0; j < NUM_ALL_MACHINES; j++) { - if (ItemIdToBattleMoveId(ITEM_TM01 + j) == move) + if (GetTMHMMoveId(j + 1) == move) { isTMMove[move] = TRUE; - sStatsMovesTMHM_ID[*numTMHMMoves] = ITEM_TM01 + j; + sStatsMovesTMHM_ID[*numTMHMMoves] = GetTMHMItemId(j + 1); (*numTMHMMoves)++; sStatsMoves[movesTotal] = move; movesTotal++; diff --git a/src/pokemon.c b/src/pokemon.c index 1ed82d39c4..4a3b0bf706 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -871,14 +871,6 @@ static const s8 sFriendshipEventModifiers[][3] = [FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10}, }; -#define HM_MOVES_END 0xFFFF - -static const u16 sHMMoves[] = -{ - MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH, - MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, HM_MOVES_END -}; - static const struct SpeciesItem sAlteringCaveWildMonHeldItems[] = { {SPECIES_NONE, ITEM_NONE}, @@ -5947,19 +5939,21 @@ const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFema } } -bool8 IsMoveHM(u16 move) -{ - int i = 0; +#define OR_MOVE_IS_HM(_hm) || (move == MOVE_##_hm) +bool32 IsMoveHM(u16 move) +{ + return FALSE FOREACH_HM(OR_MOVE_IS_HM); +} + +#undef OR_MOVE_IS_HM + +bool32 CannotForgetMove(u16 move) +{ if (P_CAN_FORGET_HIDDEN_MOVE) return FALSE; - while (sHMMoves[i] != HM_MOVES_END) - { - if (sHMMoves[i++] == move) - return TRUE; - } - return FALSE; + return IsMoveHM(move); } bool8 IsMonSpriteNotFlipped(u16 species) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 3bf7c0aac4..b63f6d17eb 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2609,7 +2609,7 @@ static bool8 CanReplaceMove(void) { if (sMonSummaryScreen->firstMoveIndex == MAX_MON_MOVES || sMonSummaryScreen->newMove == MOVE_NONE - || IsMoveHM(sMonSummaryScreen->summary.moves[sMonSummaryScreen->firstMoveIndex]) != TRUE) + || !CannotForgetMove(sMonSummaryScreen->summary.moves[sMonSummaryScreen->firstMoveIndex])) return TRUE; else return FALSE;