Easy customizable Hidden Move types (#5872)

This commit is contained in:
Eduardo Quezada 2025-01-04 17:42:14 -03:00 committed by GitHub
parent a7f77ed08d
commit d7bbb2e628
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 65 additions and 11 deletions

View File

@ -114,7 +114,8 @@ struct TypeInfo
u16 damageCategory:2; // Used for B_PHYSICAL_SPECIAL_SPLIT <= GEN_3 u16 damageCategory:2; // Used for B_PHYSICAL_SPECIAL_SPLIT <= GEN_3
u16 useSecondTypeIconPalette:1; u16 useSecondTypeIconPalette:1;
u16 isSpecialCaseType:1; u16 isSpecialCaseType:1;
u16 padding:12; u16 isHiddenPowerType:1; // Changing this for any type will change the distribution of all Hidden Power types from vanilla.
u16 padding:11;
const u32 *const paletteTMHM; const u32 *const paletteTMHM;
//u16 enhanceItem; //u16 enhanceItem;
//u16 berry; //u16 berry;

View File

@ -5966,12 +5966,15 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
| ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5); | ((GetMonData(mon, MON_DATA_SPDEF_IV) & 1) << 5);
} }
// Subtract 6 instead of 1 below because 5 types are excluded (TYPE_NONE, TYPE_NORMAL, TYPE_MYSTERY, TYPE_FAIRY and TYPE_STELLAR) u32 hpTypes[NUMBER_OF_MON_TYPES] = {0};
// The final + 2 skips past TYPE_NONE and Normal. u32 i, hpTypeCount = 0;
moveType = ((NUMBER_OF_MON_TYPES - 6) * typeBits) / 63 + 2; for (i = 0; i < NUMBER_OF_MON_TYPES; i++)
if (moveType >= TYPE_MYSTERY) {
moveType++; if (gTypesInfo[i].isHiddenPowerType)
return ((moveType | F_DYNAMIC_TYPE_IGNORE_PHYSICALITY) & 0x3F); hpTypes[hpTypeCount++] = i;
}
moveType = ((hpTypeCount - 1) * typeBits) / 63;
return ((hpTypes[moveType] | F_DYNAMIC_TYPE_IGNORE_PHYSICALITY) & 0x3F);
} }
break; break;
case EFFECT_CHANGE_TYPE_ON_ITEM: case EFFECT_CHANGE_TYPE_ON_ITEM:

View File

@ -40,10 +40,12 @@ const uq4_12_t gTypeEffectivenessTable[NUMBER_OF_MON_TYPES][NUMBER_OF_MON_TYPES]
#undef ______ #undef ______
#undef X #undef X
// .generic is large enough that the text for TYPE_ELECTRIC will exceed TEXT_BUFF_ARRAY_COUNT. // Notes regarding custom data:
// In this array there's commented-out data such as references to type-resist berries that would otherwise would go unused. // - The "generic" field is large enough that the text for TYPE_ELECTRIC will exceed TEXT_BUFF_ARRAY_COUNT.
// However, we figured this information would be useful for users that want to add their own types as a reminder of // - In this array there's commented-out data such as references to type-resist berries that would otherwise would go unused.
// what data would they need to add in order to have their new types be fully fledged like official types. // However, we figured this information would be useful for users that want to add their own types as a reminder of
// what data would they need to add in order to have their new types be fully fledged like official types.
// - Changing "isHiddenPowerType" for any type will change the distribution of all Hidden Power types from vanilla.
const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] = const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
{ {
[TYPE_NONE] = [TYPE_NONE] =
@ -56,6 +58,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_NormalTMHM, .paletteTMHM = gItemIconPalette_NormalTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = TRUE, .isSpecialCaseType = TRUE,
.isHiddenPowerType = FALSE,
}, },
[TYPE_NORMAL] = [TYPE_NORMAL] =
{ {
@ -69,6 +72,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_NormalTMHM, .paletteTMHM = gItemIconPalette_NormalTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = FALSE,
//.enhanceItem = ITEM_SILK_SCARF, //.enhanceItem = ITEM_SILK_SCARF,
//.berry = ITEM_CHILAN_BERRY, //.berry = ITEM_CHILAN_BERRY,
//.gem = ITEM_NORMAL_GEM, //.gem = ITEM_NORMAL_GEM,
@ -88,6 +92,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_FightingTMHM, .paletteTMHM = gItemIconPalette_FightingTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_BLACK_BELT, //.enhanceItem = ITEM_BLACK_BELT,
//.berry = ITEM_CHOPLE_BERRY, //.berry = ITEM_CHOPLE_BERRY,
//.gem = ITEM_FIGHTING_GEM, //.gem = ITEM_FIGHTING_GEM,
@ -109,6 +114,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_FlyingTMHM, .paletteTMHM = gItemIconPalette_FlyingTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_SHARP_BEAK, //.enhanceItem = ITEM_SHARP_BEAK,
//.berry = ITEM_COBA_BERRY, //.berry = ITEM_COBA_BERRY,
//.gem = ITEM_FLYING_GEM, //.gem = ITEM_FLYING_GEM,
@ -130,6 +136,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_PoisonTMHM, .paletteTMHM = gItemIconPalette_PoisonTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_POISON_BARB, //.enhanceItem = ITEM_POISON_BARB,
//.berry = ITEM_KEBIA_BERRY, //.berry = ITEM_KEBIA_BERRY,
//.gem = ITEM_POISON_GEM, //.gem = ITEM_POISON_GEM,
@ -151,6 +158,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_GroundTMHM, .paletteTMHM = gItemIconPalette_GroundTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_SOFT_SAND, //.enhanceItem = ITEM_SOFT_SAND,
//.berry = ITEM_SHUCA_BERRY, //.berry = ITEM_SHUCA_BERRY,
//.gem = ITEM_GROUND_GEM, //.gem = ITEM_GROUND_GEM,
@ -172,6 +180,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_RockTMHM, .paletteTMHM = gItemIconPalette_RockTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_HARD_STONE, //.enhanceItem = ITEM_HARD_STONE,
//.berry = ITEM_CHARTI_BERRY, //.berry = ITEM_CHARTI_BERRY,
//.gem = ITEM_ROCK_GEM, //.gem = ITEM_ROCK_GEM,
@ -193,6 +202,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_BugTMHM, .paletteTMHM = gItemIconPalette_BugTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_SILVER_POWDER, //.enhanceItem = ITEM_SILVER_POWDER,
//.berry = ITEM_TANGA_BERRY, //.berry = ITEM_TANGA_BERRY,
//.gem = ITEM_BUG_GEM, //.gem = ITEM_BUG_GEM,
@ -214,6 +224,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_GhostTMHM, .paletteTMHM = gItemIconPalette_GhostTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_SPELL_TAG, //.enhanceItem = ITEM_SPELL_TAG,
//.berry = ITEM_KASIB_BERRY, //.berry = ITEM_KASIB_BERRY,
//.gem = ITEM_GHOST_GEM, //.gem = ITEM_GHOST_GEM,
@ -235,6 +246,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_SteelTMHM, .paletteTMHM = gItemIconPalette_SteelTMHM,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_METAL_COAT, //.enhanceItem = ITEM_METAL_COAT,
//.berry = ITEM_BABIRI_BERRY, //.berry = ITEM_BABIRI_BERRY,
//.gem = ITEM_STEEL_GEM, //.gem = ITEM_STEEL_GEM,
@ -253,6 +265,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.damageCategory = DAMAGE_CATEGORY_SPECIAL, .damageCategory = DAMAGE_CATEGORY_SPECIAL,
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = TRUE, .isSpecialCaseType = TRUE,
.isHiddenPowerType = FALSE,
}, },
[TYPE_FIRE] = [TYPE_FIRE] =
{ {
@ -266,6 +279,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_FireTMHM, .paletteTMHM = gItemIconPalette_FireTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_CHARCOAL, //.enhanceItem = ITEM_CHARCOAL,
//.berry = ITEM_OCCA_BERRY, //.berry = ITEM_OCCA_BERRY,
//.gem = ITEM_FIRE_GEM, //.gem = ITEM_FIRE_GEM,
@ -287,6 +301,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_WaterTMHM, .paletteTMHM = gItemIconPalette_WaterTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_MYSTIC_WATER, //.enhanceItem = ITEM_MYSTIC_WATER,
//.berry = ITEM_PASSHO_BERRY, //.berry = ITEM_PASSHO_BERRY,
//.gem = ITEM_WATER_GEM, //.gem = ITEM_WATER_GEM,
@ -308,6 +323,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_GrassTMHM, .paletteTMHM = gItemIconPalette_GrassTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_MIRACLE_SEED, //.enhanceItem = ITEM_MIRACLE_SEED,
//.berry = ITEM_RINDO_BERRY, //.berry = ITEM_RINDO_BERRY,
//.gem = ITEM_GRASS_GEM, //.gem = ITEM_GRASS_GEM,
@ -329,6 +345,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_ElectricTMHM, .paletteTMHM = gItemIconPalette_ElectricTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_MAGNET, //.enhanceItem = ITEM_MAGNET,
//.berry = ITEM_WACAN_BERRY, //.berry = ITEM_WACAN_BERRY,
//.gem = ITEM_ELECTRIC_GEM, //.gem = ITEM_ELECTRIC_GEM,
@ -350,6 +367,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_PsychicTMHM, .paletteTMHM = gItemIconPalette_PsychicTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_TWISTED_SPOON, //.enhanceItem = ITEM_TWISTED_SPOON,
//.berry = ITEM_PAYAPA_BERRY, //.berry = ITEM_PAYAPA_BERRY,
//.gem = ITEM_PSYCHIC_GEM, //.gem = ITEM_PSYCHIC_GEM,
@ -371,6 +389,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_IceTMHM, .paletteTMHM = gItemIconPalette_IceTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_NEVER_MELT_ICE, //.enhanceItem = ITEM_NEVER_MELT_ICE,
//.berry = ITEM_YACHE_BERRY, //.berry = ITEM_YACHE_BERRY,
//.gem = ITEM_ICE_GEM, //.gem = ITEM_ICE_GEM,
@ -392,6 +411,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_DragonTMHM, .paletteTMHM = gItemIconPalette_DragonTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_DRAGON_FANG, //.enhanceItem = ITEM_DRAGON_FANG,
//.berry = ITEM_HABAN_BERRY, //.berry = ITEM_HABAN_BERRY,
//.gem = ITEM_DRAGON_GEM, //.gem = ITEM_DRAGON_GEM,
@ -413,6 +433,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_DarkTMHM, .paletteTMHM = gItemIconPalette_DarkTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = TRUE,
//.enhanceItem = ITEM_BLACK_GLASSES, //.enhanceItem = ITEM_BLACK_GLASSES,
//.berry = ITEM_COLBUR_BERRY, //.berry = ITEM_COLBUR_BERRY,
//.gem = ITEM_DARK_GEM, //.gem = ITEM_DARK_GEM,
@ -434,6 +455,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_FairyTMHM, .paletteTMHM = gItemIconPalette_FairyTMHM,
.useSecondTypeIconPalette = TRUE, .useSecondTypeIconPalette = TRUE,
.isSpecialCaseType = FALSE, .isSpecialCaseType = FALSE,
.isHiddenPowerType = FALSE,
//.enhanceItem = ITEM_FAIRY_FEATHER, //.enhanceItem = ITEM_FAIRY_FEATHER,
//.berry = ITEM_ROSELI_BERRY, //.berry = ITEM_ROSELI_BERRY,
//.gem = ITEM_FAIRY_GEM, //.gem = ITEM_FAIRY_GEM,
@ -454,6 +476,7 @@ const struct TypeInfo gTypesInfo[NUMBER_OF_MON_TYPES] =
.paletteTMHM = gItemIconPalette_NormalTMHM, // failsafe .paletteTMHM = gItemIconPalette_NormalTMHM, // failsafe
.useSecondTypeIconPalette = FALSE, .useSecondTypeIconPalette = FALSE,
.isSpecialCaseType = TRUE, .isSpecialCaseType = TRUE,
.isHiddenPowerType = FALSE,
// .teraShard = ITEM_STELLAR_TERA_SHARD, // .teraShard = ITEM_STELLAR_TERA_SHARD,
}, },
}; };

View File

@ -1,6 +1,33 @@
#include "global.h" #include "global.h"
#include "test/battle.h" #include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gTypesInfo[TYPE_NONE].isHiddenPowerType == FALSE);
ASSUME(gTypesInfo[TYPE_NORMAL].isHiddenPowerType == FALSE);
ASSUME(gTypesInfo[TYPE_FIGHTING].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_FLYING].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_POISON].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_GROUND].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_ROCK].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_BUG].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_GHOST].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_STEEL].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_MYSTERY].isHiddenPowerType == FALSE);
ASSUME(gTypesInfo[TYPE_FIRE].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_WATER].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_GRASS].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_PSYCHIC].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_ICE].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_DRAGON].isHiddenPowerType == TRUE);
ASSUME(gTypesInfo[TYPE_DARK].isHiddenPowerType == TRUE);
// Any type after Dark shouldn't be part of Hidden Power officially.
for (u32 j = TYPE_DARK + 1; j < NUMBER_OF_MON_TYPES; j++) {
ASSUME(gTypesInfo[j].isHiddenPowerType == FALSE);
}
}
// IV combinations sourced from https://www.smogon.com/forums/threads/hidden-power-iv-combinations.78083/ // IV combinations sourced from https://www.smogon.com/forums/threads/hidden-power-iv-combinations.78083/
SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs") SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs")
{ {