2017-09-02 22:28:44 +01:00
# ifndef GUARD_POKEMON_H
# define GUARD_POKEMON_H
2018-02-11 16:35:01 +00:00
# include "sprite.h"
2023-03-23 09:02:32 +00:00
# include "constants/items.h"
2020-10-15 10:18:35 +01:00
# include "constants/region_map_sections.h"
2020-11-25 03:53:53 +00:00
# include "constants/map_groups.h"
2024-01-29 11:51:32 +00:00
# include "contest_effect.h"
2018-02-11 16:35:01 +00:00
2020-12-25 00:46:39 +00:00
# define GET_BASE_SPECIES_ID(speciesId) (GetFormSpeciesId(speciesId, 0))
2021-12-03 22:32:31 +00:00
# define FORM_SPECIES_END (0xffff)
2020-12-25 00:46:39 +00:00
2022-08-15 22:36:55 +01:00
// Property labels for Get(Box)MonData / Set(Box)MonData
2022-08-08 23:40:47 +01:00
enum {
MON_DATA_PERSONALITY ,
2023-12-27 16:48:17 +00:00
MON_DATA_STATUS ,
2022-08-08 23:40:47 +01:00
MON_DATA_OT_ID ,
MON_DATA_LANGUAGE ,
MON_DATA_SANITY_IS_BAD_EGG ,
MON_DATA_SANITY_HAS_SPECIES ,
MON_DATA_SANITY_IS_EGG ,
MON_DATA_OT_NAME ,
MON_DATA_MARKINGS ,
MON_DATA_CHECKSUM ,
2023-12-27 16:48:17 +00:00
MON_DATA_HP ,
MON_DATA_IS_SHINY ,
MON_DATA_HIDDEN_NATURE ,
MON_DATA_HP_LOST ,
2022-08-08 23:40:47 +01:00
MON_DATA_ENCRYPT_SEPARATOR ,
2023-12-27 16:48:17 +00:00
MON_DATA_NICKNAME ,
2024-03-29 17:43:17 +00:00
MON_DATA_NICKNAME10 ,
2022-08-08 23:40:47 +01:00
MON_DATA_SPECIES ,
MON_DATA_HELD_ITEM ,
MON_DATA_MOVE1 ,
MON_DATA_MOVE2 ,
MON_DATA_MOVE3 ,
MON_DATA_MOVE4 ,
MON_DATA_PP1 ,
MON_DATA_PP2 ,
MON_DATA_PP3 ,
MON_DATA_PP4 ,
MON_DATA_PP_BONUSES ,
MON_DATA_COOL ,
MON_DATA_BEAUTY ,
MON_DATA_CUTE ,
MON_DATA_EXP ,
MON_DATA_HP_EV ,
MON_DATA_ATK_EV ,
MON_DATA_DEF_EV ,
MON_DATA_SPEED_EV ,
MON_DATA_SPATK_EV ,
MON_DATA_SPDEF_EV ,
MON_DATA_FRIENDSHIP ,
MON_DATA_SMART ,
MON_DATA_POKERUS ,
MON_DATA_MET_LOCATION ,
MON_DATA_MET_LEVEL ,
MON_DATA_MET_GAME ,
MON_DATA_POKEBALL ,
MON_DATA_HP_IV ,
MON_DATA_ATK_IV ,
MON_DATA_DEF_IV ,
MON_DATA_SPEED_IV ,
MON_DATA_SPATK_IV ,
MON_DATA_SPDEF_IV ,
MON_DATA_IS_EGG ,
MON_DATA_ABILITY_NUM ,
MON_DATA_TOUGH ,
MON_DATA_SHEEN ,
MON_DATA_OT_GENDER ,
MON_DATA_COOL_RIBBON ,
MON_DATA_BEAUTY_RIBBON ,
MON_DATA_CUTE_RIBBON ,
MON_DATA_SMART_RIBBON ,
MON_DATA_TOUGH_RIBBON ,
MON_DATA_LEVEL ,
MON_DATA_MAX_HP ,
MON_DATA_ATK ,
MON_DATA_DEF ,
MON_DATA_SPEED ,
MON_DATA_SPATK ,
MON_DATA_SPDEF ,
MON_DATA_MAIL ,
2023-02-24 10:53:02 +00:00
MON_DATA_SPECIES_OR_EGG ,
2022-08-08 23:40:47 +01:00
MON_DATA_IVS ,
MON_DATA_CHAMPION_RIBBON ,
MON_DATA_WINNING_RIBBON ,
MON_DATA_VICTORY_RIBBON ,
MON_DATA_ARTIST_RIBBON ,
MON_DATA_EFFORT_RIBBON ,
MON_DATA_MARINE_RIBBON ,
MON_DATA_LAND_RIBBON ,
MON_DATA_SKY_RIBBON ,
MON_DATA_COUNTRY_RIBBON ,
MON_DATA_NATIONAL_RIBBON ,
MON_DATA_EARTH_RIBBON ,
MON_DATA_WORLD_RIBBON ,
2023-02-15 16:56:11 +00:00
MON_DATA_MODERN_FATEFUL_ENCOUNTER ,
2022-08-08 23:40:47 +01:00
MON_DATA_KNOWN_MOVES ,
MON_DATA_RIBBON_COUNT ,
MON_DATA_RIBBONS ,
MON_DATA_ATK2 ,
MON_DATA_DEF2 ,
MON_DATA_SPEED2 ,
MON_DATA_SPATK2 ,
MON_DATA_SPDEF2 ,
2023-12-27 16:48:17 +00:00
MON_DATA_HYPER_TRAINED_HP ,
MON_DATA_HYPER_TRAINED_ATK ,
MON_DATA_HYPER_TRAINED_DEF ,
MON_DATA_HYPER_TRAINED_SPEED ,
MON_DATA_HYPER_TRAINED_SPATK ,
MON_DATA_HYPER_TRAINED_SPDEF ,
MON_DATA_IS_SHADOW ,
MON_DATA_DYNAMAX_LEVEL ,
MON_DATA_GIGANTAMAX_FACTOR ,
MON_DATA_TERA_TYPE ,
2024-02-01 21:35:38 +00:00
MON_DATA_EVOLUTION_TRACKER ,
2022-08-08 23:40:47 +01:00
} ;
2017-02-04 02:34:56 +00:00
struct PokemonSubstruct0
{
2023-12-27 16:48:17 +00:00
u16 species : 11 ; // 2047 species.
u16 teraType : 5 ; // 30 types.
u16 heldItem : 10 ; // 1023 items.
u16 unused_02 : 6 ;
u32 experience : 21 ;
u32 nickname11 : 8 ; // 11th character of nickname.
u32 unused_04 : 3 ;
u8 ppBonuses ;
u8 friendship ;
u16 pokeball : 6 ; // 63 balls.
u16 nickname12 : 8 ; // 12th character of nickname.
u16 unused_0A : 2 ;
} ;
2017-02-04 02:34:56 +00:00
struct PokemonSubstruct1
{
2023-12-27 16:48:17 +00:00
u16 move1 : 11 ; // 2047 moves.
2024-02-01 21:35:38 +00:00
u16 evolutionTracker1 : 5 ;
2023-12-27 16:48:17 +00:00
u16 move2 : 11 ; // 2047 moves.
2024-02-01 21:35:38 +00:00
u16 evolutionTracker2 : 4 ;
u16 unused_02 : 1 ;
2023-12-27 16:48:17 +00:00
u16 move3 : 11 ; // 2047 moves.
u16 unused_04 : 5 ;
u16 move4 : 11 ; // 2047 moves.
u16 unused_06 : 3 ;
u16 hyperTrainedHP : 1 ;
u16 hyperTrainedAttack : 1 ;
u8 pp1 : 7 ; // 127 PP.
u8 hyperTrainedDefense : 1 ;
u8 pp2 : 7 ; // 127 PP.
u8 hyperTrainedSpeed : 1 ;
u8 pp3 : 7 ; // 127 PP.
u8 hyperTrainedSpAttack : 1 ;
u8 pp4 : 7 ; // 127 PP.
u8 hyperTrainedSpDefense : 1 ;
} ;
2017-02-04 02:34:56 +00:00
struct PokemonSubstruct2
{
2023-12-27 16:48:17 +00:00
u8 hpEV ;
u8 attackEV ;
u8 defenseEV ;
u8 speedEV ;
u8 spAttackEV ;
u8 spDefenseEV ;
u8 cool ;
u8 beauty ;
u8 cute ;
u8 smart ;
u8 tough ;
u8 sheen ;
} ;
2017-02-04 02:34:56 +00:00
struct PokemonSubstruct3
{
2023-12-27 16:48:17 +00:00
u8 pokerus ;
u8 metLocation ;
u16 metLevel : 7 ;
u16 metGame : 4 ;
u16 dynamaxLevel : 4 ;
u16 otGender : 1 ;
u32 hpIV : 5 ;
u32 attackIV : 5 ;
u32 defenseIV : 5 ;
u32 speedIV : 5 ;
u32 spAttackIV : 5 ;
u32 spDefenseIV : 5 ;
u32 isEgg : 1 ;
u32 gigantamaxFactor : 1 ;
u32 coolRibbon : 3 ; // Stores the highest contest rank achieved in the Cool category.
u32 beautyRibbon : 3 ; // Stores the highest contest rank achieved in the Beauty category.
u32 cuteRibbon : 3 ; // Stores the highest contest rank achieved in the Cute category.
u32 smartRibbon : 3 ; // Stores the highest contest rank achieved in the Smart category.
u32 toughRibbon : 3 ; // Stores the highest contest rank achieved in the Tough category.
u32 championRibbon : 1 ; // Given when defeating the Champion. Because both RSE and FRLG use it, later generations don't specify from which region it comes from.
u32 winningRibbon : 1 ; // Given at the Battle Tower's Level 50 challenge by winning a set of seven battles that extends the current streak to 56 or more.
u32 victoryRibbon : 1 ; // Given at the Battle Tower's Level 100 challenge by winning a set of seven battles that extends the current streak to 56 or more.
u32 artistRibbon : 1 ; // Given at the Contest Hall by winning a Master Rank contest with at least 800 points, and agreeing to have the Pokémon's portrait placed in the museum after being offered.
u32 effortRibbon : 1 ; // Given at Slateport's market to Pokémon with maximum EVs.
u32 marineRibbon : 1 ; // Never distributed.
u32 landRibbon : 1 ; // Never distributed.
u32 skyRibbon : 1 ; // Never distributed.
u32 countryRibbon : 1 ; // Distributed during Pokémon Festa '04 and '05 to tournament winners.
u32 nationalRibbon : 1 ; // Given to purified Shadow Pokémon in Colosseum/XD.
u32 earthRibbon : 1 ; // Given to teams that have beaten Mt. Battle's 100-battle challenge in Colosseum/XD.
u32 worldRibbon : 1 ; // Distributed during Pokémon Festa '04 and '05 to tournament winners.
u32 isShadow : 1 ;
u32 unused_0B : 1 ;
u32 abilityNum : 2 ;
// The functionality of this bit changed in FRLG:
// In RS, this bit does nothing, is never set, & is accidentally unset when hatching Eggs.
// In FRLG & Emerald, this controls Mew & Deoxys obedience and whether they can be traded.
// If set, a Pokémon is a fateful encounter in FRLG's summary screen if hatched & for all Pokémon in Gen 4+ summary screens.
// Set for in-game event island legendaries, events distributed after a certain date, & Pokémon from XD: Gale of Darkness.
// Not to be confused with METLOC_FATEFUL_ENCOUNTER.
u32 modernFatefulEncounter : 1 ;
2017-02-04 02:34:56 +00:00
} ;
2021-10-11 15:35:53 +01:00
// Number of bytes in the largest Pokémon substruct.
// They are assumed to be the same size, and will be padded to
// the largest size by the union.
// By default they are all 12 bytes.
# define NUM_SUBSTRUCT_BYTES (max(sizeof(struct PokemonSubstruct0), \
max ( sizeof ( struct PokemonSubstruct1 ) , \
max ( sizeof ( struct PokemonSubstruct2 ) , \
sizeof ( struct PokemonSubstruct3 ) ) ) ) )
2017-02-04 02:34:56 +00:00
union PokemonSubstruct
{
struct PokemonSubstruct0 type0 ;
struct PokemonSubstruct1 type1 ;
struct PokemonSubstruct2 type2 ;
struct PokemonSubstruct3 type3 ;
2021-10-11 15:35:53 +01:00
u16 raw [ NUM_SUBSTRUCT_BYTES / 2 ] ; // /2 because it's u16, not u8
2017-02-04 02:34:56 +00:00
} ;
struct BoxPokemon
{
u32 personality ;
u32 otId ;
2023-12-27 16:48:17 +00:00
u8 nickname [ min ( 10 , POKEMON_NAME_LENGTH ) ] ;
u8 language : 3 ;
u8 hiddenNatureModifier : 5 ; // 31 natures.
2017-02-04 02:34:56 +00:00
u8 isBadEgg : 1 ;
u8 hasSpecies : 1 ;
u8 isEgg : 1 ;
2023-12-27 16:48:17 +00:00
u8 blockBoxRS : 1 ; // Unused, but Pokémon Box Ruby & Sapphire will refuse to deposit a Pokémon with this flag set.
u8 unused_13 : 4 ;
2018-09-01 21:03:21 +01:00
u8 otName [ PLAYER_NAME_LENGTH ] ;
2023-12-27 16:48:17 +00:00
u8 markings : 4 ;
u8 compressedStatus : 4 ;
2017-02-04 02:34:56 +00:00
u16 checksum ;
2023-12-27 16:48:17 +00:00
u16 hpLost : 14 ; // 16383 HP.
u16 shinyModifier : 1 ;
u16 unused_1E : 1 ;
2017-02-04 02:34:56 +00:00
union
{
2021-10-11 15:35:53 +01:00
u32 raw [ ( NUM_SUBSTRUCT_BYTES * 4 ) / 4 ] ; // *4 because there are 4 substructs, /4 because it's u32, not u8
2017-02-04 02:34:56 +00:00
union PokemonSubstruct substructs [ 4 ] ;
} secure ;
} ;
struct Pokemon
{
struct BoxPokemon box ;
u32 status ;
u8 level ;
2017-09-11 17:27:54 +01:00
u8 mail ;
2017-02-04 02:34:56 +00:00
u16 hp ;
u16 maxHP ;
u16 attack ;
u16 defense ;
u16 speed ;
u16 spAttack ;
u16 spDefense ;
} ;
2021-10-03 04:47:59 +01:00
struct MonSpritesGfxManager
2018-02-11 16:35:01 +00:00
{
2021-10-03 04:47:59 +01:00
u32 numSprites : 4 ;
u32 numSprites2 : 4 ; // Never read
u32 numFrames : 8 ;
u32 active : 8 ;
u32 dataSize : 4 ;
u32 mode : 4 ; // MON_SPR_GFX_MODE_*
void * spriteBuffer ;
u8 * * spritePointers ;
2018-02-11 16:35:01 +00:00
struct SpriteTemplate * templates ;
struct SpriteFrameImage * frameImages ;
} ;
2021-10-03 04:47:59 +01:00
enum {
MON_SPR_GFX_MODE_NORMAL ,
MON_SPR_GFX_MODE_BATTLE ,
MON_SPR_GFX_MODE_FULL_PARTY ,
} ;
enum {
MON_SPR_GFX_MANAGER_A ,
MON_SPR_GFX_MANAGER_B , // Nothing ever sets up this manager.
MON_SPR_GFX_MANAGERS_COUNT
} ;
2017-09-04 20:43:13 +01:00
struct BattlePokemon
{
/*0x00*/ u16 species ;
/*0x02*/ u16 attack ;
/*0x04*/ u16 defense ;
/*0x06*/ u16 speed ;
/*0x08*/ u16 spAttack ;
/*0x0A*/ u16 spDefense ;
2019-09-08 16:53:48 +01:00
/*0x0C*/ u16 moves [ MAX_MON_MOVES ] ;
2017-09-04 20:43:13 +01:00
/*0x14*/ u32 hpIV : 5 ;
/*0x14*/ u32 attackIV : 5 ;
/*0x15*/ u32 defenseIV : 5 ;
/*0x15*/ u32 speedIV : 5 ;
/*0x16*/ u32 spAttackIV : 5 ;
/*0x17*/ u32 spDefenseIV : 5 ;
2019-08-21 10:56:49 +01:00
/*0x17*/ u32 abilityNum : 2 ;
2018-11-18 19:00:36 +00:00
/*0x18*/ s8 statStages [ NUM_BATTLE_STATS ] ;
2020-05-18 22:54:12 +01:00
/*0x20*/ u16 ability ;
/*0x22*/ u8 type1 ;
/*0x23*/ u8 type2 ;
/*0x24*/ u8 type3 ;
/*0x25*/ u8 pp [ MAX_MON_MOVES ] ;
/*0x29*/ u16 hp ;
/*0x2B*/ u8 level ;
/*0x2C*/ u8 friendship ;
/*0x2D*/ u16 maxHP ;
/*0x2F*/ u16 item ;
/*0x31*/ u8 nickname [ POKEMON_NAME_LENGTH + 1 ] ;
/*0x3C*/ u8 ppBonuses ;
/*0x3D*/ u8 otName [ PLAYER_NAME_LENGTH + 1 ] ;
/*0x45*/ u32 experience ;
/*0x49*/ u32 personality ;
/*0x4D*/ u32 status1 ;
/*0x51*/ u32 status2 ;
/*0x55*/ u32 otId ;
2023-01-11 07:15:57 +00:00
/*0x59*/ u8 metLevel ;
2023-12-27 16:48:17 +00:00
/*0x5A*/ bool8 isShiny ;
2017-09-04 20:43:13 +01:00
} ;
2023-12-08 14:05:10 +00:00
struct Evolution
{
u16 method ;
u16 param ;
u16 targetSpecies ;
} ;
struct SpeciesInfo /*0x8C*/
2017-02-04 02:34:56 +00:00
{
/* 0x00 */ u8 baseHP ;
/* 0x01 */ u8 baseAttack ;
/* 0x02 */ u8 baseDefense ;
/* 0x03 */ u8 baseSpeed ;
/* 0x04 */ u8 baseSpAttack ;
/* 0x05 */ u8 baseSpDefense ;
2023-01-04 11:14:34 +00:00
/* 0x06 */ u8 types [ 2 ] ;
2017-02-04 02:34:56 +00:00
/* 0x08 */ u8 catchRate ;
2023-12-08 14:05:10 +00:00
/* 0x09 */ u8 padding1 ;
2023-02-08 21:08:12 +00:00
/* 0x0A */ u16 expYield ; // expYield was changed from u8 to u16 for the new Exp System.
/* 0x0C */ u16 evYield_HP : 2 ;
u16 evYield_Attack : 2 ;
u16 evYield_Defense : 2 ;
u16 evYield_Speed : 2 ;
/* 0x0D */ u16 evYield_SpAttack : 2 ;
u16 evYield_SpDefense : 2 ;
2023-12-08 14:05:10 +00:00
u16 padding2 : 4 ;
2023-02-08 21:08:12 +00:00
/* 0x0E */ u16 itemCommon ;
/* 0x10 */ u16 itemRare ;
/* 0x12 */ u8 genderRatio ;
/* 0x13 */ u8 eggCycles ;
/* 0x14 */ u8 friendship ;
/* 0x15 */ u8 growthRate ;
/* 0x16 */ u8 eggGroups [ 2 ] ;
/* 0x18 */ u16 abilities [ NUM_ABILITY_SLOTS ] ; // 3 abilities, no longer u8 because we have over 255 abilities now.
/* 0x1E */ u8 safariZoneFleeRate ;
2023-12-08 14:05:10 +00:00
// Pokédex data
/* 0x1F */ u8 categoryName [ 13 ] ;
/* 0x1F */ u8 speciesName [ POKEMON_NAME_LENGTH + 1 ] ;
/* 0x2C */ u16 cryId ;
/* 0x2E */ u16 natDexNum ;
/* 0x30 */ u16 height ; //in decimeters
/* 0x32 */ u16 weight ; //in hectograms
/* 0x34 */ u16 pokemonScale ;
/* 0x36 */ u16 pokemonOffset ;
/* 0x38 */ u16 trainerScale ;
/* 0x3A */ u16 trainerOffset ;
/* 0x3C */ const u8 * description ;
2024-03-29 16:43:33 +00:00
/* 0x40 */ u8 bodyColor : 7 ;
2023-12-08 14:05:10 +00:00
// Graphical Data
2024-03-29 16:43:33 +00:00
u8 noFlip : 1 ;
2023-12-08 14:05:10 +00:00
/* 0x41 */ u8 frontAnimDelay ;
/* 0x42 */ u8 frontAnimId ;
/* 0x43 */ u8 backAnimId ;
/* 0x44 */ const union AnimCmd * const * frontAnimFrames ;
/* 0x48 */ const u32 * frontPic ;
/* 0x4C */ const u32 * frontPicFemale ;
/* 0x50 */ const u32 * backPic ;
/* 0x54 */ const u32 * backPicFemale ;
/* 0x58 */ const u32 * palette ;
/* 0x5C */ const u32 * paletteFemale ;
/* 0x60 */ const u32 * shinyPalette ;
/* 0x64 */ const u32 * shinyPaletteFemale ;
/* 0x68 */ const u8 * iconSprite ;
/* 0x6C */ const u8 * iconSpriteFemale ;
2024-01-04 20:54:03 +00:00
# if P_FOOTPRINTS
2023-12-08 14:05:10 +00:00
/* 0x70 */ const u8 * footprint ;
2024-01-04 20:54:03 +00:00
# endif
2023-12-08 14:05:10 +00:00
// All Pokémon pics are 64x64, but this data table defines where in this 64x64 frame the sprite's non-transparent pixels actually are.
/* 0x74 */ u8 frontPicSize ; // The dimensions of this drawn pixel area.
/* 0x74 */ u8 frontPicSizeFemale ; // The dimensions of this drawn pixel area.
/* 0x75 */ u8 frontPicYOffset ; // The number of pixels between the drawn pixel area and the bottom edge.
/* 0x76 */ u8 backPicSize ; // The dimensions of this drawn pixel area.
/* 0x76 */ u8 backPicSizeFemale ; // The dimensions of this drawn pixel area.
/* 0x77 */ u8 backPicYOffset ; // The number of pixels between the drawn pixel area and the bottom edge.
/* 0x78 */ u8 iconPalIndex : 3 ;
u8 iconPalIndexFemale : 3 ;
u8 padding3 : 2 ;
/* 0x79 */ u8 enemyMonElevation ; // This determines how much higher above the usual position the enemy Pokémon is during battle. Species that float or fly have nonzero values.
// Flags
/* 0x7A */ u32 isLegendary : 1 ;
u32 isMythical : 1 ;
u32 isUltraBeast : 1 ;
2024-05-03 18:32:06 +01:00
u32 isParadox : 1 ;
2024-03-16 17:38:43 +00:00
u32 isTotem : 1 ;
2023-12-08 14:05:10 +00:00
u32 isMegaEvolution : 1 ;
2023-12-11 12:54:20 +00:00
u32 isPrimalReversion : 1 ;
2023-12-08 14:05:10 +00:00
u32 isUltraBurst : 1 ;
u32 isGigantamax : 1 ;
u32 isAlolanForm : 1 ;
u32 isGalarianForm : 1 ;
u32 isHisuianForm : 1 ;
u32 isPaldeanForm : 1 ;
u32 cannotBeTraded : 1 ;
u32 allPerfectIVs : 1 ;
2024-01-11 16:35:31 +00:00
u32 dexForceRequired : 1 ; // This species will be taken into account for Pokédex ratings even if they have the "isMythical" flag set.
2024-05-03 18:32:06 +01:00
u32 tmIlliterate : 1 ; // This species will be unable to learn the universal moves.
u32 isFrontierBanned : 1 ; // This species is not allowed to participate in Battle Frontier facilities.
u32 padding4 : 14 ;
2023-12-08 14:05:10 +00:00
// Move Data
2023-12-11 12:54:20 +00:00
/* 0x80 */ const struct LevelUpMove * levelUpLearnset ;
/* 0x84 */ const u16 * teachableLearnset ;
2024-05-19 12:47:15 +01:00
const u16 * eggMoveLearnset ;
2023-12-11 12:54:20 +00:00
/* 0x88 */ const struct Evolution * evolutions ;
/* 0x84 */ const u16 * formSpeciesIdTable ;
/* 0x84 */ const struct FormChange * formChangeTable ;
2017-02-04 02:34:56 +00:00
} ;
2024-01-29 11:51:32 +00:00
struct MoveInfo
2017-02-04 02:34:56 +00:00
{
2024-01-29 11:51:32 +00:00
const u8 * name ;
const u8 * description ;
2019-03-31 14:24:46 +01:00
u16 effect ;
2024-01-29 04:05:05 +00:00
u16 type : 5 ;
u16 category : 2 ;
2024-02-12 12:47:07 +00:00
u16 power : 9 ; // up to 511
u16 accuracy : 7 ;
2024-01-29 04:05:05 +00:00
u16 target : 9 ;
2017-02-04 02:34:56 +00:00
u8 pp ;
2023-12-19 15:10:07 +00:00
union {
u8 effect ;
u8 powerOverride ;
} zMove ;
2024-01-29 04:05:05 +00:00
s32 priority : 4 ;
u32 recoil : 7 ;
2024-02-01 06:19:10 +00:00
u32 strikeCount : 4 ; // Max 15 hits. Defaults to 1 if not set. May apply its effect on each hit.
2024-01-29 04:05:05 +00:00
u32 criticalHitStage : 2 ;
u32 alwaysCriticalHit : 1 ;
2024-03-14 20:20:13 +00:00
u32 numAdditionalEffects : 2 ; // limited to 3 - don't want to get too crazy
// 12 bits left to complete this word - continues into flags
2024-01-29 04:05:05 +00:00
2023-07-03 09:01:59 +01:00
// Flags
u32 makesContact : 1 ;
u32 ignoresProtect : 1 ;
u32 magicCoatAffected : 1 ;
u32 snatchAffected : 1 ;
u32 ignoresKingsRock : 1 ;
u32 punchingMove : 1 ;
u32 bitingMove : 1 ;
u32 pulseMove : 1 ;
u32 soundMove : 1 ;
u32 ballisticMove : 1 ;
u32 powderMove : 1 ;
u32 danceMove : 1 ;
u32 windMove : 1 ;
2024-02-25 08:54:04 +00:00
u32 slicingMove : 1 ; // end of word
2024-01-30 08:54:43 +00:00
u32 healingMove : 1 ;
2023-07-03 09:01:59 +01:00
u32 minimizeDoubleDamage : 1 ;
u32 ignoresTargetAbility : 1 ;
u32 ignoresTargetDefenseEvasionStages : 1 ;
u32 damagesUnderground : 1 ;
u32 damagesUnderwater : 1 ;
u32 damagesAirborne : 1 ;
u32 damagesAirborneDoubleDamage : 1 ;
u32 ignoreTypeIfFlyingAndUngrounded : 1 ;
u32 thawsUser : 1 ;
u32 ignoresSubstitute : 1 ;
2024-02-13 03:19:27 +00:00
u32 forcePressure : 1 ;
2023-10-20 00:16:37 +01:00
u32 cantUseTwice : 1 ;
2024-01-30 08:54:43 +00:00
// Ban flags
u32 gravityBanned : 1 ;
u32 mirrorMoveBanned : 1 ;
u32 meFirstBanned : 1 ;
u32 mimicBanned : 1 ;
u32 metronomeBanned : 1 ;
u32 copycatBanned : 1 ;
u32 assistBanned : 1 ; // Matches same moves as copycatBanned + semi-invulnerable moves and Mirror Coat.
u32 sleepTalkBanned : 1 ;
u32 instructBanned : 1 ;
u32 encoreBanned : 1 ;
u32 parentalBondBanned : 1 ;
u32 skyBattleBanned : 1 ;
u32 sketchBanned : 1 ;
2024-05-28 09:29:37 +01:00
u32 padding : 5 ; // end of word
2023-11-18 18:17:26 +00:00
2024-01-29 04:05:05 +00:00
u32 argument ;
2023-12-25 03:19:38 +00:00
2023-11-18 18:17:26 +00:00
// primary/secondary effects
2024-03-14 20:20:13 +00:00
const struct AdditionalEffect * additionalEffects ;
2024-01-29 11:51:32 +00:00
// contest parameters
u8 contestEffect ;
u8 contestCategory : 3 ;
u8 contestComboStarterId ;
u8 contestComboMoves [ MAX_COMBO_MOVES ] ;
2017-02-04 02:34:56 +00:00
} ;
2024-01-02 09:50:19 +00:00
# define EFFECTS_ARR(...) (const struct AdditionalEffect[]) {__VA_ARGS__}
2024-03-14 20:20:13 +00:00
# define ADDITIONAL_EFFECTS(...) EFFECTS_ARR( __VA_ARGS__ ), .numAdditionalEffects = ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ ))
2023-11-25 14:06:51 +00:00
2024-01-30 04:27:46 +00:00
// Just a hack to make a move boosted by Sheer Force despite having no secondary effects affected
# define SHEER_FORCE_HACK { .moveEffect = 0, .chance = 100, }
2023-11-18 18:17:26 +00:00
struct AdditionalEffect
{
2024-01-30 08:54:43 +00:00
u16 moveEffect ;
2024-01-02 09:50:19 +00:00
u8 self : 1 ;
u8 onlyIfTargetRaisedStats : 1 ;
2024-01-02 11:27:50 +00:00
u8 onChargeTurnOnly : 1 ;
2023-11-18 18:17:26 +00:00
u8 chance ; // 0% = effect certain, primary effect
} ;
2023-12-29 13:25:24 +00:00
struct Ability
{
u8 name [ ABILITY_NAME_LENGTH + 1 ] ;
const u8 * description ;
2023-12-30 22:07:18 +00:00
s8 aiRating ;
Ability flags update (#3886)
* Added five ability flags
Omitted duplicate flags that are basically "can't copy" (Role Play, Receiver, Entrainment, Skill Swap), didn't bother adding Neutralizing Gas flag,
* Mold Breaker and Trace
* Gastro Acid, Simple Beam, Worry Seed
Decided to keep the Simple Beam/Worry Seed functions
* Entrainment done
* Skill Swap
* Doodle/Role Play + flag descriptions
Also adjusted Doodle test
* Wandering Spirit, Mummy, Neutralizing Gas
Neutralizing Gas really only needs to check for other mons with Neutralizing Gas, otherwise unsuppressable abilities are handled separately.
* Renamed flags
2024-01-01 14:03:34 +00:00
u8 cantBeCopied : 1 ; // cannot be copied by Role Play or Doodle
u8 cantBeSwapped : 1 ; // cannot be swapped with Skill Swap or Wandering Spirit
u8 cantBeTraced : 1 ; // cannot be copied by Trace - same as cantBeCopied except for Wonder Guard
u8 cantBeSuppressed : 1 ; // cannot be negated by Gastro Acid or Neutralizing Gas
u8 cantBeOverwritten : 1 ; // cannot be overwritten by Entrainment, Worry Seed or Simple Beam (but can be by Mummy) - same as cantBeSuppressed except for Truant
u8 breakable : 1 ; // can be bypassed by Mold Breaker and clones
u8 failsOnImposter : 1 ; // doesn't work on an Imposter mon; when can we actually use this?
2023-12-29 13:25:24 +00:00
} ;
2024-05-19 09:14:31 +01:00
enum {
AFFINE_NONE ,
AFFINE_TURN_UP ,
AFFINE_TURN_UP_AND_DOWN ,
AFFINE_TURN_DOWN ,
AFFINE_TURN_DOWN_SLOW ,
AFFINE_TURN_DOWN_SLIGHT ,
AFFINE_TURN_UP_HIGH ,
AFFINE_UNUSED_1 ,
AFFINE_UNUSED_2 ,
AFFINE_UNUSED_3 ,
NUM_MON_AFFINES ,
} ;
// The animation the Pokémon does during the feeding scene depends on their nature.
// The below values are offsets into sMonPokeblockAnims of the animation data for that nature.
# define ANIM_HARDY 0
# define ANIM_LONELY (ANIM_HARDY + 3)
# define ANIM_BRAVE (ANIM_LONELY + 1)
# define ANIM_ADAMANT (ANIM_BRAVE + 1)
# define ANIM_NAUGHTY (ANIM_ADAMANT + 5)
# define ANIM_BOLD (ANIM_NAUGHTY + 3)
# define ANIM_DOCILE (ANIM_BOLD + 2)
# define ANIM_RELAXED (ANIM_DOCILE + 1)
# define ANIM_IMPISH (ANIM_RELAXED + 2)
# define ANIM_LAX (ANIM_IMPISH + 1)
# define ANIM_TIMID (ANIM_LAX + 1)
# define ANIM_HASTY (ANIM_TIMID + 5)
# define ANIM_SERIOUS (ANIM_HASTY + 2)
# define ANIM_JOLLY (ANIM_SERIOUS + 1)
# define ANIM_NAIVE (ANIM_JOLLY + 1)
# define ANIM_MODEST (ANIM_NAIVE + 4)
# define ANIM_MILD (ANIM_MODEST + 3)
# define ANIM_QUIET (ANIM_MILD + 1)
# define ANIM_BASHFUL (ANIM_QUIET + 2)
# define ANIM_RASH (ANIM_BASHFUL + 3)
# define ANIM_CALM (ANIM_RASH + 3)
# define ANIM_GENTLE (ANIM_CALM + 1)
# define ANIM_SASSY (ANIM_GENTLE + 1)
# define ANIM_CAREFUL (ANIM_SASSY + 1)
# define ANIM_QUIRKY (ANIM_CAREFUL + 5)
// In palace double battles, Pokémon have a target preference depending on nature
# define PALACE_TARGET_STRONGER 0
# define PALACE_TARGET_WEAKER 1
# define PALACE_TARGET_RANDOM 2
struct NatureInfo
{
const u8 * name ;
u8 statUp ;
u8 statDown ;
u8 backAnim ;
u8 pokeBlockAnim [ 2 ] ;
u8 battlePalacePercents [ 4 ] ;
u8 battlePalaceFlavorText ;
u8 battlePalaceSmokescreen ;
const u8 * natureGirlMessage ;
} ;
2022-04-02 22:09:51 +01:00
# define SPINDA_SPOT_WIDTH 16
# define SPINDA_SPOT_HEIGHT 16
2017-09-11 10:35:41 +01:00
struct SpindaSpot
{
u8 x , y ;
2022-04-02 22:09:51 +01:00
u16 image [ SPINDA_SPOT_HEIGHT ] ;
2017-09-11 10:35:41 +01:00
} ;
2018-09-22 12:52:38 +01:00
struct LevelUpMove
2017-09-06 16:19:08 +01:00
{
2018-09-22 12:52:38 +01:00
u16 move ;
u16 level ;
2017-09-06 16:19:08 +01:00
} ;
2022-09-01 18:57:58 +01:00
struct FormChange
{
2021-01-27 22:26:18 +00:00
u16 method ;
u16 targetSpecies ;
u16 param1 ;
u16 param2 ;
2022-09-01 18:57:58 +01:00
u16 param3 ;
2021-01-27 22:26:18 +00:00
} ;
2021-03-02 20:25:15 +00:00
2023-11-23 21:59:51 +00:00
struct Fusion
{
u16 fusionStorageIndex ;
u16 itemId ;
u16 targetSpecies1 ;
u16 targetSpecies2 ;
u16 fusingIntoMon ;
u16 fusionMove ;
u16 unfuseForgetMove ;
} ;
extern const struct Fusion * const gFusionTablePointers [ NUM_SPECIES ] ;
2021-01-19 09:03:16 +00:00
# define NUM_UNOWN_FORMS 28
2021-01-19 17:36:36 +00:00
# define GET_UNOWN_LETTER(personality) (( \
( ( ( personality ) & 0x03000000 ) > > 18 ) \
| ( ( ( personality ) & 0x00030000 ) > > 12 ) \
| ( ( ( personality ) & 0x00000300 ) > > 6 ) \
| ( ( ( personality ) & 0x00000003 ) > > 0 ) \
2021-01-19 09:03:16 +00:00
) % NUM_UNOWN_FORMS )
2022-09-11 18:35:58 +01:00
# define GET_SHINY_VALUE(otId, personality) (HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality))
2021-10-03 04:48:12 +01:00
2017-09-06 16:19:08 +01:00
extern u8 gPlayerPartyCount ;
extern struct Pokemon gPlayerParty [ PARTY_SIZE ] ;
extern u8 gEnemyPartyCount ;
extern struct Pokemon gEnemyParty [ PARTY_SIZE ] ;
2018-07-01 14:28:57 +01:00
extern struct SpriteTemplate gMultiuseSpriteTemplate ;
2018-02-11 22:46:50 +00:00
2024-01-29 11:51:32 +00:00
extern const struct MoveInfo gMovesInfo [ ] ;
2018-02-11 23:11:10 +00:00
extern const u8 gFacilityClassToPicIndex [ ] ;
extern const u8 gFacilityClassToTrainerClass [ ] ;
2022-10-24 21:01:48 +01:00
extern const struct SpeciesInfo gSpeciesInfo [ ] ;
2018-10-17 03:47:08 +01:00
extern const u32 gExperienceTables [ ] [ MAX_LEVEL + 1 ] ;
2019-02-19 09:09:42 +00:00
extern const u8 gPPUpGetMask [ ] ;
2021-10-03 04:48:12 +01:00
extern const u8 gPPUpClearMask [ ] ;
extern const u8 gPPUpAddValues [ ] ;
2020-08-05 01:33:05 +01:00
extern const u8 gStatStageRatios [ MAX_STAT_STAGE + 1 ] [ 2 ] ;
2022-08-23 17:39:24 +01:00
extern const u16 gUnionRoomFacilityClasses [ ] ;
2021-01-23 04:22:37 +00:00
extern const struct SpriteTemplate gBattlerSpriteTemplates [ ] ;
2022-08-31 14:05:51 +01:00
extern const u32 sExpCandyExperienceTable [ ] ;
2024-01-26 18:25:52 +00:00
extern const struct Ability gAbilitiesInfo [ ] ;
2024-05-19 09:14:31 +01:00
extern const struct NatureInfo gNaturesInfo [ ] ;
2017-09-11 17:27:54 +01:00
2017-09-06 16:19:08 +01:00
void ZeroBoxMonData ( struct BoxPokemon * boxMon ) ;
void ZeroMonData ( struct Pokemon * mon ) ;
void ZeroPlayerPartyMons ( void ) ;
void ZeroEnemyPartyMons ( void ) ;
void CreateMon ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 hasFixedPersonality , u32 fixedPersonality , u8 otIdType , u32 fixedOtId ) ;
void CreateBoxMon ( struct BoxPokemon * boxMon , u16 species , u8 level , u8 fixedIV , u8 hasFixedPersonality , u32 fixedPersonality , u8 otIdType , u32 fixedOtId ) ;
void CreateMonWithNature ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 nature ) ;
void CreateMonWithGenderNatureLetter ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 gender , u8 nature , u8 unownLetter ) ;
void CreateMaleMon ( struct Pokemon * mon , u16 species , u8 level ) ;
void CreateMonWithIVsPersonality ( struct Pokemon * mon , u16 species , u8 level , u32 ivs , u32 personality ) ;
void CreateMonWithIVsOTID ( struct Pokemon * mon , u16 species , u8 level , u8 * ivs , u32 otId ) ;
void CreateMonWithEVSpread ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 evSpread ) ;
2019-01-13 11:12:27 +00:00
void CreateBattleTowerMon ( struct Pokemon * mon , struct BattleTowerPokemon * src ) ;
2021-10-03 04:48:12 +01:00
void CreateBattleTowerMon_HandleLevel ( struct Pokemon * mon , struct BattleTowerPokemon * src , bool8 lvl50 ) ;
2018-10-13 19:38:46 +01:00
void CreateApprenticeMon ( struct Pokemon * mon , const struct Apprentice * src , u8 monId ) ;
2018-11-11 15:44:27 +00:00
void CreateMonWithEVSpreadNatureOTID ( struct Pokemon * mon , u16 species , u8 level , u8 nature , u8 fixedIV , u8 evSpread , u32 otId ) ;
2020-12-24 21:18:47 +00:00
void ConvertPokemonToBattleTowerPokemon ( struct Pokemon * mon , struct BattleTowerPokemon * dest ) ;
2021-01-23 04:22:37 +00:00
bool8 ShouldIgnoreDeoxysForm ( u8 caseId , u8 battlerId ) ;
2020-06-03 20:28:29 +01:00
u16 GetUnionRoomTrainerPic ( void ) ;
u16 GetUnionRoomTrainerClass ( void ) ;
2023-02-15 16:56:11 +00:00
void CreateEnemyEventMon ( void ) ;
2017-09-06 16:19:08 +01:00
void CalculateMonStats ( struct Pokemon * mon ) ;
2018-02-11 16:35:01 +00:00
void BoxMonToMon ( const struct BoxPokemon * src , struct Pokemon * dest ) ;
2017-09-06 16:19:08 +01:00
u8 GetLevelFromMonExp ( struct Pokemon * mon ) ;
u8 GetLevelFromBoxMonExp ( struct BoxPokemon * boxMon ) ;
u16 GiveMoveToMon ( struct Pokemon * mon , u16 move ) ;
2023-04-30 10:25:48 +01:00
u16 GiveMoveToBoxMon ( struct BoxPokemon * boxMon , u16 move ) ;
2017-09-06 16:19:08 +01:00
u16 GiveMoveToBattleMon ( struct BattlePokemon * mon , u16 move ) ;
void SetMonMoveSlot ( struct Pokemon * mon , u16 move , u8 slot ) ;
void SetBattleMonMoveSlot ( struct BattlePokemon * mon , u16 move , u8 slot ) ;
void GiveMonInitialMoveset ( struct Pokemon * mon ) ;
void GiveBoxMonInitialMoveset ( struct BoxPokemon * boxMon ) ;
2018-02-11 16:35:01 +00:00
u16 MonTryLearningNewMove ( struct Pokemon * mon , bool8 firstMove ) ;
2017-09-06 16:19:08 +01:00
void DeleteFirstMoveAndGiveMoveToMon ( struct Pokemon * mon , u16 move ) ;
void DeleteFirstMoveAndGiveMoveToBoxMon ( struct BoxPokemon * boxMon , u16 move ) ;
2023-08-30 10:21:10 +01:00
u8 CountAliveMonsInBattle ( u8 caseId , u32 battler ) ;
2018-02-11 16:35:01 +00:00
u8 GetDefaultMoveTarget ( u8 battlerId ) ;
2017-09-06 16:19:08 +01:00
u8 GetMonGender ( struct Pokemon * mon ) ;
u8 GetBoxMonGender ( struct BoxPokemon * boxMon ) ;
u8 GetGenderFromSpeciesAndPersonality ( u16 species , u32 personality ) ;
2023-07-07 03:17:21 +01:00
bool32 IsPersonalityFemale ( u16 species , u32 personality ) ;
2019-04-07 11:40:18 +01:00
u32 GetUnownSpeciesId ( u32 personality ) ;
2019-04-04 23:07:39 +01:00
void SetMultiuseSpriteTemplateToPokemon ( u16 speciesTag , u8 battlerPosition ) ;
2018-07-01 14:28:57 +01:00
void SetMultiuseSpriteTemplateToTrainerBack ( u16 trainerSpriteId , u8 battlerPosition ) ;
2022-05-21 20:21:50 +01:00
void SetMultiuseSpriteTemplateToTrainerFront ( u16 trainerPicId , u8 battlerPosition ) ;
2017-09-06 16:19:08 +01:00
2023-07-24 14:57:37 +01:00
/* GameFreak called Get(Box)MonData with either 2 or 3 arguments, for
* type safety we have a Get ( Box ) MonData macro which dispatches to
* either Get ( Box ) MonData2 or Get ( Box ) MonData3 based on the number of
* arguments . The two functions are aliases of each other , but they
* differ for matching purposes in the caller ' s codegen . */
# define GetMonData(...) CAT(GetMonData, NARG_8(__VA_ARGS__))(__VA_ARGS__)
# define GetBoxMonData(...) CAT(GetBoxMonData, NARG_8(__VA_ARGS__))(__VA_ARGS__)
u32 GetMonData3 ( struct Pokemon * mon , s32 field , u8 * data ) ;
u32 GetMonData2 ( struct Pokemon * mon , s32 field ) ;
u32 GetBoxMonData3 ( struct BoxPokemon * boxMon , s32 field , u8 * data ) ;
u32 GetBoxMonData2 ( struct BoxPokemon * boxMon , s32 field ) ;
2017-02-04 02:34:56 +00:00
2018-02-11 16:35:01 +00:00
void SetMonData ( struct Pokemon * mon , s32 field , const void * dataArg ) ;
void SetBoxMonData ( struct BoxPokemon * boxMon , s32 field , const void * dataArg ) ;
2017-09-06 16:19:08 +01:00
void CopyMon ( void * dest , void * src , size_t size ) ;
u8 GiveMonToPlayer ( struct Pokemon * mon ) ;
2023-12-08 20:01:26 +00:00
u8 CopyMonToPC ( struct Pokemon * mon ) ;
2017-09-06 16:19:08 +01:00
u8 CalculatePlayerPartyCount ( void ) ;
u8 CalculateEnemyPartyCount ( void ) ;
2018-02-11 16:35:01 +00:00
u8 GetMonsStateToDoubles ( void ) ;
u8 GetMonsStateToDoubles_2 ( void ) ;
2020-05-18 22:54:12 +01:00
u16 GetAbilityBySpecies ( u16 species , u8 abilityNum ) ;
u16 GetMonAbility ( struct Pokemon * mon ) ;
2019-04-05 22:11:24 +01:00
void CreateSecretBaseEnemyParty ( struct SecretBase * secretBaseRecord ) ;
2017-09-06 16:19:08 +01:00
u8 GetSecretBaseTrainerPicIndex ( void ) ;
2018-02-11 16:35:01 +00:00
u8 GetSecretBaseTrainerClass ( void ) ;
2017-09-11 23:01:12 +01:00
bool8 IsPlayerPartyAndPokemonStorageFull ( void ) ;
bool8 IsPokemonStorageFull ( void ) ;
2023-07-07 19:37:51 +01:00
const u8 * GetSpeciesName ( u16 species ) ;
2023-12-08 14:05:10 +00:00
const u8 * GetSpeciesCategory ( u16 species ) ;
const u8 * GetSpeciesPokedexDescription ( u16 species ) ;
u16 GetSpeciesHeight ( u16 species ) ;
u16 GetSpeciesWeight ( u16 species ) ;
const struct LevelUpMove * GetSpeciesLevelUpLearnset ( u16 species ) ;
const u16 * GetSpeciesTeachableLearnset ( u16 species ) ;
2024-05-19 12:47:15 +01:00
const u16 * GetSpeciesEggMoves ( u16 species ) ;
2023-12-08 14:05:10 +00:00
const struct Evolution * GetSpeciesEvolutions ( u16 species ) ;
const u16 * GetSpeciesFormTable ( u16 species ) ;
const struct FormChange * GetSpeciesFormChanges ( u16 species ) ;
2017-09-06 16:19:08 +01:00
u8 CalculatePPWithBonus ( u16 move , u8 ppBonuses , u8 moveIndex ) ;
void RemoveMonPPBonus ( struct Pokemon * mon , u8 moveIndex ) ;
void RemoveBattleMonPPBonus ( struct BattlePokemon * mon , u8 moveIndex ) ;
2018-07-15 17:07:01 +01:00
void PokemonToBattleMon ( struct Pokemon * src , struct BattlePokemon * dst ) ;
2018-02-11 16:35:01 +00:00
void CopyPlayerPartyMonToBattleData ( u8 battlerId , u8 partyIndex ) ;
bool8 ExecuteTableBasedItemEffect ( struct Pokemon * mon , u16 item , u8 partyIndex , u8 moveIndex ) ;
bool8 PokemonUseItemEffects ( struct Pokemon * mon , u16 item , u8 partyIndex , u8 moveIndex , u8 e ) ;
2024-01-15 20:55:35 +00:00
bool8 HealStatusConditions ( struct Pokemon * mon , u32 healMask , u8 battlerId ) ;
2023-08-30 10:21:10 +01:00
u8 GetItemEffectParamOffset ( u32 battler , u16 itemId , u8 effectByte , u8 effectBit ) ;
2019-12-22 00:01:38 +00:00
u8 * UseStatIncreaseItem ( u16 itemId ) ;
2017-09-06 16:19:08 +01:00
u8 GetNature ( struct Pokemon * mon ) ;
u8 GetNatureFromPersonality ( u32 personality ) ;
2022-02-27 00:40:20 +00:00
u16 GetEvolutionTargetSpecies ( struct Pokemon * mon , u8 type , u16 evolutionItem , struct Pokemon * tradePartner ) ;
2023-09-14 19:37:57 +01:00
bool8 IsMonPastEvolutionLevel ( struct Pokemon * mon ) ;
2017-09-11 10:35:41 +01:00
u16 NationalPokedexNumToSpecies ( u16 nationalNum ) ;
2018-02-11 16:35:01 +00:00
u16 NationalToHoennOrder ( u16 nationalNum ) ;
u16 SpeciesToNationalPokedexNum ( u16 species ) ;
u16 SpeciesToHoennPokedexNum ( u16 species ) ;
u16 HoennToNationalOrder ( u16 hoennNum ) ;
Castform, Cherrim Sun, Spinda, and Spheal Graphical Tweaks (#3127)
* Casrform graphics. Palette changes, edited backs, and 2 Frame anims
* Castform Graphics
* Cherrim graphics, and Castform redefinitions
* Spheal and Spinda Graphic edits. Spheal mouth adjustment, Spinda 2 frame and palette
* Revised Spinda Spot drawing function, removed tabs
* Animations for Castform forms, Spinda, Cherrim Sun, and Spheal set
* Spacing
* Forgot shiny pal. Fixed
* Delete .vs directory
* remove vs ref
2023-07-14 16:45:40 +01:00
void DrawSpindaSpots ( u32 personality , u8 * dest , bool32 isSecondFrame ) ;
2018-02-11 16:35:01 +00:00
void EvolutionRenameMon ( struct Pokemon * mon , u16 oldSpecies , u16 newSpecies ) ;
2019-10-31 18:11:55 +00:00
u8 GetPlayerFlankId ( void ) ;
u16 GetLinkTrainerFlankId ( u8 id ) ;
2022-06-01 17:41:57 +01:00
s32 GetBattlerMultiplayerId ( u16 id ) ;
2018-02-11 16:35:01 +00:00
u8 GetTrainerEncounterMusicId ( u16 trainerOpponentId ) ;
u16 ModifyStatByNature ( u8 nature , u16 n , u8 statIndex ) ;
void AdjustFriendship ( struct Pokemon * mon , u8 event ) ;
void MonGainEVs ( struct Pokemon * mon , u16 defeatedSpecies ) ;
u16 GetMonEVCount ( struct Pokemon * mon ) ;
2017-10-05 23:12:01 +01:00
void RandomlyGivePartyPokerus ( struct Pokemon * party ) ;
u8 CheckPartyPokerus ( struct Pokemon * party , u8 selection ) ;
u8 CheckPartyHasHadPokerus ( struct Pokemon * party , u8 selection ) ;
void UpdatePartyPokerusTime ( u16 days ) ;
void PartySpreadPokerus ( struct Pokemon * party ) ;
2017-11-14 19:23:25 +00:00
bool8 TryIncrementMonLevel ( struct Pokemon * mon ) ;
2022-08-26 19:48:06 +01:00
u8 CanLearnTeachableMove ( u16 species , u16 move ) ;
2018-02-11 16:35:01 +00:00
u8 GetMoveRelearnerMoves ( struct Pokemon * mon , u16 * moves ) ;
2017-11-14 20:43:23 +00:00
u8 GetLevelUpMovesBySpecies ( u16 species , u16 * moves ) ;
2018-02-11 16:35:01 +00:00
u8 GetNumberOfRelearnableMoves ( struct Pokemon * mon ) ;
u16 SpeciesToPokedexNum ( u16 species ) ;
2018-12-15 20:12:28 +00:00
bool32 IsSpeciesInHoennDex ( u16 species ) ;
2018-02-11 16:35:01 +00:00
u16 GetBattleBGM ( void ) ;
void PlayBattleBGM ( void ) ;
void PlayMapChosenOrBattleBGM ( u16 songId ) ;
2020-12-24 21:18:47 +00:00
void CreateTask_PlayMapChosenOrBattleBGM ( u16 songId ) ;
2018-10-21 08:24:57 +01:00
const u32 * GetMonFrontSpritePal ( struct Pokemon * mon ) ;
2023-12-27 16:48:17 +00:00
const u32 * GetMonSpritePalFromSpeciesAndPersonality ( u16 species , bool32 isShiny , u32 personality ) ;
2023-08-21 12:49:17 +01:00
bool8 IsMoveHM ( u16 move ) ;
2018-02-11 16:35:01 +00:00
bool8 IsMonSpriteNotFlipped ( u16 species ) ;
s8 GetMonFlavorRelation ( struct Pokemon * mon , u8 flavor ) ;
s8 GetFlavorRelationByPersonality ( u32 personality , u8 flavor ) ;
bool8 IsTradedMon ( struct Pokemon * mon ) ;
bool8 IsOtherTrainer ( u32 otId , u8 * otName ) ;
void MonRestorePP ( struct Pokemon * mon ) ;
void BoxMonRestorePP ( struct BoxPokemon * boxMon ) ;
2018-07-07 18:57:09 +01:00
void SetMonPreventsSwitchingString ( void ) ;
2018-02-11 16:35:01 +00:00
void SetWildMonHeldItem ( void ) ;
bool8 IsMonShiny ( struct Pokemon * mon ) ;
const u8 * GetTrainerPartnerName ( void ) ;
2022-07-29 16:15:33 +01:00
void BattleAnimateFrontSprite ( struct Sprite * sprite , u16 species , bool8 noCry , u8 panMode ) ;
void DoMonFrontSpriteAnimation ( struct Sprite * sprite , u16 species , bool8 noCry , u8 panModeAnimFlag ) ;
void PokemonSummaryDoMonAnimation ( struct Sprite * sprite , u16 species , bool8 oneFrame ) ;
2019-02-19 09:09:42 +00:00
void StopPokemonAnimationDelayTask ( void ) ;
2022-07-29 16:15:33 +01:00
void BattleAnimateBackSprite ( struct Sprite * sprite , u16 species ) ;
2021-10-03 04:48:12 +01:00
u8 GetOpposingLinkMultiBattlerId ( bool8 rightSide , u8 multiplayerId ) ;
2018-02-11 16:35:01 +00:00
u16 FacilityClassToPicIndex ( u16 facilityClass ) ;
u16 PlayerGenderToFrontTrainerPicId ( u8 playerGender ) ;
void HandleSetPokedexFlag ( u16 nationalNum , u8 caseId , u32 personality ) ;
bool8 HasTwoFramesAnimation ( u16 species ) ;
2021-10-03 04:47:59 +01:00
struct MonSpritesGfxManager * CreateMonSpritesGfxManager ( u8 managerId , u8 mode ) ;
void DestroyMonSpritesGfxManager ( u8 managerId ) ;
u8 * MonSpritesGfxManager_GetSpritePtr ( u8 managerId , u8 spriteNum ) ;
2020-12-25 00:46:39 +00:00
u16 GetFormSpeciesId ( u16 speciesId , u8 formId ) ;
u8 GetFormIdFromFormSpeciesId ( u16 formSpeciesId ) ;
2021-03-03 19:07:50 +00:00
u16 GetFormChangeTargetSpecies ( struct Pokemon * mon , u16 method , u32 arg ) ;
2022-11-05 23:00:12 +00:00
u16 GetFormChangeTargetSpeciesBoxMon ( struct BoxPokemon * boxMon , u16 method , u32 arg ) ;
bool32 DoesSpeciesHaveFormChangeMethod ( u16 species , u16 method ) ;
2020-07-16 14:02:06 +01:00
u16 MonTryLearningNewMoveEvolution ( struct Pokemon * mon , bool8 firstMove ) ;
2023-07-07 03:17:21 +01:00
bool32 SpeciesHasGenderDifferences ( u16 species ) ;
2022-11-02 02:50:26 +00:00
bool32 TryFormChange ( u32 monId , u32 side , u16 method ) ;
2022-10-20 17:14:32 +01:00
void TryToSetBattleFormChangeMoves ( struct Pokemon * mon , u16 method ) ;
2022-08-26 21:47:07 +01:00
u32 GetMonFriendshipScore ( struct Pokemon * pokemon ) ;
2023-11-14 20:29:38 +00:00
u32 GetMonAffectionHearts ( struct Pokemon * pokemon ) ;
2022-12-24 05:13:42 +00:00
void UpdateMonPersonality ( struct BoxPokemon * boxMon , u32 personality ) ;
2023-07-05 19:59:42 +01:00
u8 CalculatePartyCount ( struct Pokemon * party ) ;
2023-07-07 19:37:51 +01:00
u16 SanitizeSpeciesId ( u16 species ) ;
bool32 IsSpeciesEnabled ( u16 species ) ;
2023-12-08 14:05:10 +00:00
u16 GetCryIdBySpecies ( u16 species ) ;
2023-12-11 16:54:34 +00:00
u16 GetSpeciesPreEvolution ( u16 species ) ;
2023-12-27 16:48:17 +00:00
void HealPokemon ( struct Pokemon * mon ) ;
void HealBoxPokemon ( struct BoxPokemon * boxMon ) ;
2024-01-29 11:51:32 +00:00
const u8 * GetMoveName ( u16 moveId ) ;
2017-09-18 22:48:47 +01:00
2017-09-02 22:28:44 +01:00
# endif // GUARD_POKEMON_H