2022-05-19 19:14:13 +02:00
# ifndef GUARD_POKEMON_H
# define GUARD_POKEMON_H
# include "constants/pokemon.h"
# include "sprite.h"
struct PokemonSubstruct0
{
u16 species ;
u16 heldItem ;
u32 experience ;
u8 ppBonuses ;
u8 friendship ;
u16 filler ;
} ;
struct PokemonSubstruct1
{
u16 moves [ MAX_MON_MOVES ] ;
u8 pp [ MAX_MON_MOVES ] ;
} ;
struct PokemonSubstruct2
{
u8 hpEV ;
u8 attackEV ;
u8 defenseEV ;
u8 speedEV ;
u8 spAttackEV ;
u8 spDefenseEV ;
u8 cool ;
u8 beauty ;
u8 cute ;
u8 smart ;
u8 tough ;
u8 sheen ;
} ;
struct PokemonSubstruct3
{
/* 0x00 */ u8 pokerus ;
/* 0x01 */ u8 metLocation ;
/* 0x02 */ u16 metLevel : 7 ;
/* 0x02 */ u16 metGame : 4 ;
/* 0x03 */ u16 pokeball : 4 ;
/* 0x03 */ u16 otGender : 1 ;
/* 0x04 */ u32 hpIV : 5 ;
/* 0x04 */ u32 attackIV : 5 ;
/* 0x05 */ u32 defenseIV : 5 ;
/* 0x05 */ u32 speedIV : 5 ;
/* 0x05 */ u32 spAttackIV : 5 ;
/* 0x06 */ u32 spDefenseIV : 5 ;
/* 0x07 */ u32 isEgg : 1 ;
/* 0x07 */ u32 abilityNum : 1 ;
/* 0x08 */ u32 coolRibbon : 3 ;
/* 0x08 */ u32 beautyRibbon : 3 ;
/* 0x08 */ u32 cuteRibbon : 3 ;
/* 0x09 */ u32 smartRibbon : 3 ;
/* 0x09 */ u32 toughRibbon : 3 ;
/* 0x09 */ u32 championRibbon : 1 ;
/* 0x0A */ u32 winningRibbon : 1 ;
/* 0x0A */ u32 victoryRibbon : 1 ;
/* 0x0A */ u32 artistRibbon : 1 ;
/* 0x0A */ u32 effortRibbon : 1 ;
/* 0x0A */ u32 marineRibbon : 1 ; // never distributed
/* 0x0A */ u32 landRibbon : 1 ; // never distributed
/* 0x0A */ u32 skyRibbon : 1 ; // never distributed
/* 0x0A */ u32 countryRibbon : 1 ; // distributed during Pokémon Festa '04 and '05 to tournament winners
/* 0x0B */ u32 nationalRibbon : 1 ;
/* 0x0B */ u32 earthRibbon : 1 ;
/* 0x0B */ u32 worldRibbon : 1 ; // distributed during Pokémon Festa '04 and '05 to tournament winners
/* 0x0B */ u32 unusedRibbons : 4 ; // discarded in Gen 4
/* 0x0B */ u32 eventLegal : 1 ; // controls Mew & Deoxys obedience; if set, Pokémon is a fateful encounter in Gen 4+; set for in-game event island legendaries, some distributed events, and Pokémon from XD: Gale of Darkness.
} ;
// 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 ) ) ) ) )
union PokemonSubstruct
{
struct PokemonSubstruct0 type0 ;
struct PokemonSubstruct1 type1 ;
struct PokemonSubstruct2 type2 ;
struct PokemonSubstruct3 type3 ;
u16 raw [ NUM_SUBSTRUCT_BYTES / 2 ] ; // /2 because it's u16, not u8
} ;
struct BoxPokemon
{
u32 personality ;
u32 otId ;
u8 nickname [ POKEMON_NAME_LENGTH ] ;
u8 language ;
u8 isBadEgg : 1 ;
u8 hasSpecies : 1 ;
u8 isEgg : 1 ;
u8 unused : 5 ;
u8 otName [ PLAYER_NAME_LENGTH ] ;
u8 markings ;
u16 checksum ;
u16 unknown ;
union
{
u32 raw [ ( NUM_SUBSTRUCT_BYTES * 4 ) / 4 ] ; // *4 because there are 4 substructs, /4 because it's u32, not u8
union PokemonSubstruct substructs [ 4 ] ;
} secure ;
} ;
struct Pokemon
{
struct BoxPokemon box ;
u32 status ;
u8 level ;
u8 mail ;
u16 hp ;
u16 maxHP ;
u16 attack ;
u16 defense ;
u16 speed ;
u16 spAttack ;
u16 spDefense ;
} ;
struct MonSpritesGfxManager
{
2022-05-24 16:06:08 +02:00
u8 numSprites ;
u8 numFrames ;
bool16 active ;
2022-05-19 19:14:13 +02:00
void * spriteBuffer ;
u8 * * spritePointers ;
struct SpriteTemplate * templates ;
struct SpriteFrameImage * frameImages ;
} ;
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
} ;
struct BattlePokemon
{
/*0x00*/ u16 species ;
/*0x02*/ u16 attack ;
/*0x04*/ u16 defense ;
/*0x06*/ u16 speed ;
/*0x08*/ u16 spAttack ;
/*0x0A*/ u16 spDefense ;
/*0x0C*/ u16 moves [ MAX_MON_MOVES ] ;
/*0x14*/ u32 hpIV : 5 ;
/*0x14*/ u32 attackIV : 5 ;
/*0x15*/ u32 defenseIV : 5 ;
/*0x15*/ u32 speedIV : 5 ;
/*0x16*/ u32 spAttackIV : 5 ;
/*0x17*/ u32 spDefenseIV : 5 ;
/*0x17*/ u32 isEgg : 1 ;
/*0x17*/ u32 abilityNum : 1 ;
/*0x18*/ s8 statStages [ NUM_BATTLE_STATS ] ;
/*0x20*/ u8 ability ;
/*0x21*/ u8 type1 ;
/*0x22*/ u8 type2 ;
/*0x23*/ u8 unknown ;
/*0x24*/ u8 pp [ MAX_MON_MOVES ] ;
/*0x28*/ u16 hp ;
/*0x2A*/ u8 level ;
/*0x2B*/ u8 friendship ;
/*0x2C*/ u16 maxHP ;
/*0x2E*/ u16 item ;
/*0x30*/ u8 nickname [ POKEMON_NAME_LENGTH + 1 ] ;
/*0x3B*/ u8 ppBonuses ;
/*0x3C*/ u8 otName [ PLAYER_NAME_LENGTH + 1 ] ;
/*0x44*/ u32 experience ;
/*0x48*/ u32 personality ;
/*0x4C*/ u32 status1 ;
/*0x50*/ u32 status2 ;
/*0x54*/ u32 otId ;
} ;
struct BaseStats
{
/* 0x00 */ u8 baseHP ;
/* 0x01 */ u8 baseAttack ;
/* 0x02 */ u8 baseDefense ;
/* 0x03 */ u8 baseSpeed ;
/* 0x04 */ u8 baseSpAttack ;
/* 0x05 */ u8 baseSpDefense ;
/* 0x06 */ u8 type1 ;
/* 0x07 */ u8 type2 ;
/* 0x08 */ u8 catchRate ;
/* 0x09 */ u8 expYield ;
/* 0x0A */ u16 evYield_HP : 2 ;
/* 0x0A */ u16 evYield_Attack : 2 ;
/* 0x0A */ u16 evYield_Defense : 2 ;
/* 0x0A */ u16 evYield_Speed : 2 ;
/* 0x0B */ u16 evYield_SpAttack : 2 ;
/* 0x0B */ u16 evYield_SpDefense : 2 ;
/* 0x0C */ u16 item1 ;
/* 0x0E */ u16 item2 ;
/* 0x10 */ u8 genderRatio ;
/* 0x11 */ u8 eggCycles ;
/* 0x12 */ u8 friendship ;
/* 0x13 */ u8 growthRate ;
/* 0x14 */ u8 eggGroup1 ;
/* 0x15 */ u8 eggGroup2 ;
/* 0x16 */ u8 abilities [ 2 ] ;
/* 0x18 */ u8 safariZoneFleeRate ;
/* 0x19 */ u8 bodyColor : 7 ;
u8 noFlip : 1 ;
} ;
struct BattleMove
{
u8 effect ;
u8 power ;
u8 type ;
u8 accuracy ;
u8 pp ;
u8 secondaryEffectChance ;
u8 target ;
s8 priority ;
u8 flags ;
} ;
struct SpindaSpot
{
u8 x , y ;
u16 image [ 16 ] ;
} ;
struct __attribute__ ( ( packed ) ) LevelUpMove
{
u16 move : 9 ;
u16 level : 7 ;
} ;
struct Evolution
{
u16 method ;
u16 param ;
u16 targetSpecies ;
} ;
# define NUM_UNOWN_FORMS 28
# define GET_UNOWN_LETTER(personality) (( \
( ( ( personality ) & 0x03000000 ) > > 18 ) \
| ( ( ( personality ) & 0x00030000 ) > > 12 ) \
| ( ( ( personality ) & 0x00000300 ) > > 6 ) \
| ( ( ( personality ) & 0x00000003 ) > > 0 ) \
) % NUM_UNOWN_FORMS )
# define GET_SHINY_VALUE(otId, personality)HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality)
extern u8 gPlayerPartyCount ;
extern struct Pokemon gPlayerParty [ PARTY_SIZE ] ;
extern u8 gEnemyPartyCount ;
extern struct Pokemon gEnemyParty [ PARTY_SIZE ] ;
extern struct SpriteTemplate gMultiuseSpriteTemplate ;
extern const struct BattleMove gBattleMoves [ ] ;
extern const u8 gFacilityClassToPicIndex [ ] ;
extern const u8 gFacilityClassToTrainerClass [ ] ;
extern const struct BaseStats gBaseStats [ ] ;
extern const u8 * const gItemEffectTable [ ] ;
extern const u32 gExperienceTables [ ] [ MAX_LEVEL + 1 ] ;
extern const u16 * const gLevelUpLearnsets [ ] ;
extern const u8 gPPUpGetMask [ ] ;
extern const u8 gPPUpClearMask [ ] ;
extern const u8 gPPUpAddValues [ ] ;
extern const u8 gStatStageRatios [ MAX_STAT_STAGE + 1 ] [ 2 ] ;
extern const u16 gLinkPlayerFacilityClasses [ ] ;
extern const struct SpriteTemplate gBattlerSpriteTemplates [ ] ;
extern const s8 gNatureStatTable [ ] [ 5 ] ;
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 ) ;
void CreateBattleTowerMon ( struct Pokemon * mon , struct BattleTowerPokemon * src ) ;
void CreateBattleTowerMon_HandleLevel ( struct Pokemon * mon , struct BattleTowerPokemon * src , bool8 lvl50 ) ;
void CreateApprenticeMon ( struct Pokemon * mon , const struct Apprentice * src , u8 monId ) ;
void CreateMonWithEVSpreadNatureOTID ( struct Pokemon * mon , u16 species , u8 level , u8 nature , u8 fixedIV , u8 evSpread , u32 otId ) ;
void ConvertPokemonToBattleTowerPokemon ( struct Pokemon * mon , struct BattleTowerPokemon * dest ) ;
void CreateEventLegalMon ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 hasFixedPersonality , u32 fixedPersonality , u8 otIdType , u32 fixedOtId ) ;
bool8 ShouldIgnoreDeoxysForm ( u8 caseId , u8 battlerId ) ;
void SetDeoxysStats ( void ) ;
u16 GetUnionRoomTrainerPic ( void ) ;
u16 GetUnionRoomTrainerClass ( void ) ;
void CreateEventLegalEnemyMon ( void ) ;
void CalculateMonStats ( struct Pokemon * mon ) ;
void BoxMonToMon ( const struct BoxPokemon * src , struct Pokemon * dest ) ;
u8 GetLevelFromMonExp ( struct Pokemon * mon ) ;
u8 GetLevelFromBoxMonExp ( struct BoxPokemon * boxMon ) ;
u16 GiveMoveToMon ( struct Pokemon * mon , u16 move ) ;
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 ) ;
u16 MonTryLearningNewMove ( struct Pokemon * mon , bool8 firstMove ) ;
void DeleteFirstMoveAndGiveMoveToMon ( struct Pokemon * mon , u16 move ) ;
void DeleteFirstMoveAndGiveMoveToBoxMon ( struct BoxPokemon * boxMon , u16 move ) ;
s32 CalculateBaseDamage ( struct BattlePokemon * attacker , struct BattlePokemon * defender , u32 move , u16 sideStatus , u16 powerOverride , u8 typeOverride , u8 bankAtk , u8 bankDef ) ;
u8 CountAliveMonsInBattle ( u8 caseId ) ;
u8 GetDefaultMoveTarget ( u8 battlerId ) ;
u8 GetMonGender ( struct Pokemon * mon ) ;
u8 GetBoxMonGender ( struct BoxPokemon * boxMon ) ;
u8 GetGenderFromSpeciesAndPersonality ( u16 species , u32 personality ) ;
void SetMultiuseSpriteTemplateToPokemon ( u16 speciesTag , u8 battlerPosition ) ;
void SetMultiuseSpriteTemplateToTrainerBack ( u16 trainerSpriteId , u8 battlerPosition ) ;
void SetMultiuseSpriteTemplateToTrainerFront ( u16 arg0 , u8 battlerPosition ) ;
// These are full type signatures for GetMonData() and GetBoxMonData(),
// but they are not used since some code erroneously omits the third arg.
// u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data);
// u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data);
u32 GetMonData ( ) ;
u32 GetBoxMonData ( ) ;
void SetMonData ( struct Pokemon * mon , s32 field , const void * dataArg ) ;
void SetBoxMonData ( struct BoxPokemon * boxMon , s32 field , const void * dataArg ) ;
void CopyMon ( void * dest , void * src , size_t size ) ;
u8 GiveMonToPlayer ( struct Pokemon * mon ) ;
u8 CalculatePlayerPartyCount ( void ) ;
u8 CalculateEnemyPartyCount ( void ) ;
u8 GetMonsStateToDoubles ( void ) ;
u8 GetMonsStateToDoubles_2 ( void ) ;
u8 GetAbilityBySpecies ( u16 species , u8 abilityNum ) ;
u8 GetMonAbility ( struct Pokemon * mon ) ;
void CreateSecretBaseEnemyParty ( struct SecretBase * secretBaseRecord ) ;
u8 GetSecretBaseTrainerPicIndex ( void ) ;
u8 GetSecretBaseTrainerClass ( void ) ;
bool8 IsPlayerPartyAndPokemonStorageFull ( void ) ;
bool8 IsPokemonStorageFull ( void ) ;
void GetSpeciesName ( u8 * name , u16 species ) ;
u8 CalculatePPWithBonus ( u16 move , u8 ppBonuses , u8 moveIndex ) ;
void RemoveMonPPBonus ( struct Pokemon * mon , u8 moveIndex ) ;
void RemoveBattleMonPPBonus ( struct BattlePokemon * mon , u8 moveIndex ) ;
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 ) ;
bool8 HealStatusConditions ( struct Pokemon * mon , u32 battlePartyId , u32 healMask , u8 battlerId ) ;
u8 GetItemEffectParamOffset ( u16 itemId , u8 effectByte , u8 effectBit ) ;
u8 * UseStatIncreaseItem ( u16 itemId ) ;
u8 GetNature ( struct Pokemon * mon ) ;
u8 GetNatureFromPersonality ( u32 personality ) ;
u16 GetEvolutionTargetSpecies ( struct Pokemon * mon , u8 type , u16 evolutionItem ) ;
u16 HoennPokedexNumToSpecies ( u16 hoennNum ) ;
u16 NationalPokedexNumToSpecies ( u16 nationalNum ) ;
u16 NationalToHoennOrder ( u16 nationalNum ) ;
u16 SpeciesToNationalPokedexNum ( u16 species ) ;
u16 SpeciesToHoennPokedexNum ( u16 species ) ;
u16 HoennToNationalOrder ( u16 hoennNum ) ;
u16 SpeciesToCryId ( u16 species ) ;
void DrawSpindaSpots ( u16 species , u32 personality , u8 * dest , u8 a4 ) ;
void EvolutionRenameMon ( struct Pokemon * mon , u16 oldSpecies , u16 newSpecies ) ;
u8 GetPlayerFlankId ( void ) ;
u16 GetLinkTrainerFlankId ( u8 id ) ;
s32 GetBattlerMultiplayerId ( u16 a1 ) ;
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 ) ;
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 ) ;
bool8 TryIncrementMonLevel ( struct Pokemon * mon ) ;
u32 CanMonLearnTMHM ( struct Pokemon * mon , u8 tm ) ;
u32 CanSpeciesLearnTMHM ( u16 species , u8 tm ) ;
u8 GetMoveRelearnerMoves ( struct Pokemon * mon , u16 * moves ) ;
u8 GetLevelUpMovesBySpecies ( u16 species , u16 * moves ) ;
u8 GetNumberOfRelearnableMoves ( struct Pokemon * mon ) ;
u16 SpeciesToPokedexNum ( u16 species ) ;
bool32 IsSpeciesInHoennDex ( u16 species ) ;
void ClearBattleMonForms ( void ) ;
u16 GetBattleBGM ( void ) ;
void PlayBattleBGM ( void ) ;
void PlayMapChosenOrBattleBGM ( u16 songId ) ;
void CreateTask_PlayMapChosenOrBattleBGM ( u16 songId ) ;
const u32 * GetMonFrontSpritePal ( struct Pokemon * mon ) ;
const u32 * GetMonSpritePalFromSpeciesAndPersonality ( u16 species , u32 otId , u32 personality ) ;
const struct CompressedSpritePalette * GetMonSpritePalStruct ( struct Pokemon * mon ) ;
const struct CompressedSpritePalette * GetMonSpritePalStructFromOtIdPersonality ( u16 species , u32 otId , u32 personality ) ;
bool32 IsHMMove2 ( u16 move ) ;
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 ) ;
void SetMonPreventsSwitchingString ( void ) ;
void SetWildMonHeldItem ( void ) ;
bool8 IsMonShiny ( struct Pokemon * mon ) ;
bool8 IsShinyOtIdPersonality ( u32 otId , u32 personality ) ;
const u8 * GetTrainerPartnerName ( void ) ;
void BattleAnimateFrontSprite ( struct Sprite * sprite , u16 species , bool8 noCry , u8 arg3 ) ;
void DoMonFrontSpriteAnimation ( struct Sprite * sprite , u16 species , bool8 noCry , u8 arg3 ) ;
void PokemonSummaryDoMonAnimation ( struct Sprite * sprite , u16 species , bool8 oneFrame ) ;
void StopPokemonAnimationDelayTask ( void ) ;
void BattleAnimateBackSprite ( struct Sprite * sprite , u16 species ) ;
u8 GetOpposingLinkMultiBattlerId ( bool8 rightSide , u8 multiplayerId ) ;
u16 FacilityClassToPicIndex ( u16 facilityClass ) ;
u16 PlayerGenderToFrontTrainerPicId ( u8 playerGender ) ;
void HandleSetPokedexFlag ( u16 nationalNum , u8 caseId , u32 personality ) ;
const u8 * GetTrainerClassNameFromId ( u16 trainerId ) ;
const u8 * GetTrainerNameFromId ( u16 trainerId ) ;
bool8 HasTwoFramesAnimation ( u16 species ) ;
2022-05-24 16:06:08 +02:00
struct MonSpritesGfxManager * CreateMonSpritesGfxManager ( void ) ;
void DestroyMonSpritesGfxManager ( void ) ;
u8 * MonSpritesGfxManager_GetSpritePtr ( u8 spriteNum ) ;
2022-05-19 19:14:13 +02:00
# endif // GUARD_POKEMON_H