2017-09-06 17:19:08 +02:00
# include "global.h"
2019-09-09 03:07:54 +02:00
# include "malloc.h"
2018-11-14 01:01:50 +01:00
# include "apprentice.h"
2018-02-09 15:55:12 +01:00
# include "battle.h"
2019-03-31 19:15:39 +02:00
# include "battle_anim.h"
2018-02-09 18:46:00 +01:00
# include "battle_controllers.h"
2018-02-10 02:06:32 +01:00
# include "battle_message.h"
2018-11-14 01:01:50 +01:00
# include "battle_pike.h"
2018-11-18 17:52:22 +01:00
# include "battle_pyramid.h"
2018-11-14 01:01:50 +01:00
# include "battle_setup.h"
# include "battle_tower.h"
2019-04-04 23:53:06 +02:00
# include "data.h"
2018-11-14 01:01:50 +01:00
# include "event_data.h"
2018-02-09 18:46:00 +01:00
# include "evolution_scene.h"
2019-03-02 08:44:02 +01:00
# include "field_specials.h"
2018-11-14 01:01:50 +01:00
# include "item.h"
# include "link.h"
# include "main.h"
2018-12-24 00:02:29 +01:00
# include "overworld.h"
2018-11-14 01:01:50 +01:00
# include "m4a.h"
2018-12-24 00:02:29 +01:00
# include "party_menu.h"
2018-02-10 02:06:32 +01:00
# include "pokedex.h"
# include "pokeblock.h"
2018-11-14 01:01:50 +01:00
# include "pokemon.h"
# include "pokemon_animation.h"
2018-12-24 00:02:29 +01:00
# include "pokemon_summary_screen.h"
2018-11-14 01:01:50 +01:00
# include "pokemon_storage_system.h"
# include "random.h"
# include "recorded_battle.h"
# include "rtc.h"
2018-02-10 02:06:32 +01:00
# include "sound.h"
2018-11-14 01:01:50 +01:00
# include "string_util.h"
# include "strings.h"
2018-02-10 02:06:32 +01:00
# include "task.h"
2018-11-14 01:01:50 +01:00
# include "text.h"
2019-01-13 20:50:08 +01:00
# include "trainer_hill.h"
2018-02-10 13:24:03 +01:00
# include "util.h"
2018-11-14 01:01:50 +01:00
# include "constants/abilities.h"
# include "constants/battle_frontier.h"
# include "constants/battle_move_effects.h"
# include "constants/hold_effects.h"
2019-04-14 17:20:26 +02:00
# include "constants/item_effects.h"
2018-11-14 01:01:50 +01:00
# include "constants/items.h"
2019-01-31 22:51:20 +01:00
# include "constants/layouts.h"
2018-11-14 01:01:50 +01:00
# include "constants/moves.h"
# include "constants/songs.h"
# include "constants/species.h"
# include "constants/trainers.h"
2018-02-11 23:46:50 +01:00
struct SpeciesItem
{
u16 species ;
u16 item ;
} ;
2017-09-06 17:19:08 +02:00
2018-02-09 15:55:12 +01:00
// this file's functions
2018-02-11 17:35:01 +01:00
static u16 CalculateBoxMonChecksum ( struct BoxPokemon * boxMon ) ;
static union PokemonSubstruct * GetSubstruct ( struct BoxPokemon * boxMon , u32 personality , u8 substructType ) ;
static void EncryptBoxMon ( struct BoxPokemon * boxMon ) ;
static void DecryptBoxMon ( struct BoxPokemon * boxMon ) ;
static void sub_806E6CC ( u8 taskId ) ;
static bool8 ShouldGetStatBadgeBoost ( u16 flagId , u8 battlerId ) ;
2019-10-18 01:22:03 +02:00
static u16 GiveMoveToBoxMon ( struct BoxPokemon * boxMon , u16 move ) ;
2020-02-02 19:28:54 +01:00
static bool8 ShouldSkipFriendshipChange ( void ) ;
2017-09-06 17:19:08 +02:00
2018-02-05 17:56:28 +01:00
// EWRAM vars
2018-02-11 23:46:50 +01:00
EWRAM_DATA static u8 sLearningMoveTableID = 0 ;
2018-02-05 17:56:28 +01:00
EWRAM_DATA u8 gPlayerPartyCount = 0 ;
EWRAM_DATA u8 gEnemyPartyCount = 0 ;
EWRAM_DATA struct Pokemon gPlayerParty [ PARTY_SIZE ] = { 0 } ;
EWRAM_DATA struct Pokemon gEnemyParty [ PARTY_SIZE ] = { 0 } ;
2018-07-01 15:28:57 +02:00
EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = { 0 } ;
2018-02-11 17:35:01 +01:00
EWRAM_DATA struct Unknown_806F160_Struct * gUnknown_020249B4 [ 2 ] = { NULL } ;
2018-02-05 17:56:28 +01:00
2018-02-05 17:39:26 +01:00
// const rom data
2018-02-26 12:59:52 +01:00
# include "data/battle_moves.h"
2020-02-01 18:04:51 +01:00
// Used in an unreferenced function in RS.
// Unreferenced here and in FRLG.
struct CombinedMove
{
u16 move1 ;
u16 move2 ;
u16 newMove ;
} ;
static const struct CombinedMove sCombinedMoves [ 2 ] =
{
{ MOVE_EMBER , MOVE_GUST , MOVE_HEAT_WAVE } ,
{ 0xFFFF , 0xFFFF , 0xFFFF }
} ;
2018-02-26 12:59:52 +01:00
2018-12-03 14:49:16 +01:00
# define SPECIES_TO_HOENN(name) [SPECIES_##name - 1] = HOENN_DEX_##name
# define SPECIES_TO_NATIONAL(name) [SPECIES_##name - 1] = NATIONAL_DEX_##name
# define HOENN_TO_NATIONAL(name) [HOENN_DEX_##name - 1] = NATIONAL_DEX_##name
2018-08-15 21:10:28 +02:00
const u16 gSpeciesToHoennPokedexNum [ ] = // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)
{
2018-12-03 14:49:16 +01:00
SPECIES_TO_HOENN ( BULBASAUR ) ,
SPECIES_TO_HOENN ( IVYSAUR ) ,
SPECIES_TO_HOENN ( VENUSAUR ) ,
SPECIES_TO_HOENN ( CHARMANDER ) ,
SPECIES_TO_HOENN ( CHARMELEON ) ,
SPECIES_TO_HOENN ( CHARIZARD ) ,
SPECIES_TO_HOENN ( SQUIRTLE ) ,
SPECIES_TO_HOENN ( WARTORTLE ) ,
SPECIES_TO_HOENN ( BLASTOISE ) ,
SPECIES_TO_HOENN ( CATERPIE ) ,
SPECIES_TO_HOENN ( METAPOD ) ,
SPECIES_TO_HOENN ( BUTTERFREE ) ,
SPECIES_TO_HOENN ( WEEDLE ) ,
SPECIES_TO_HOENN ( KAKUNA ) ,
SPECIES_TO_HOENN ( BEEDRILL ) ,
SPECIES_TO_HOENN ( PIDGEY ) ,
SPECIES_TO_HOENN ( PIDGEOTTO ) ,
SPECIES_TO_HOENN ( PIDGEOT ) ,
SPECIES_TO_HOENN ( RATTATA ) ,
SPECIES_TO_HOENN ( RATICATE ) ,
SPECIES_TO_HOENN ( SPEAROW ) ,
SPECIES_TO_HOENN ( FEAROW ) ,
SPECIES_TO_HOENN ( EKANS ) ,
SPECIES_TO_HOENN ( ARBOK ) ,
SPECIES_TO_HOENN ( PIKACHU ) ,
SPECIES_TO_HOENN ( RAICHU ) ,
SPECIES_TO_HOENN ( SANDSHREW ) ,
SPECIES_TO_HOENN ( SANDSLASH ) ,
SPECIES_TO_HOENN ( NIDORAN_F ) ,
SPECIES_TO_HOENN ( NIDORINA ) ,
SPECIES_TO_HOENN ( NIDOQUEEN ) ,
SPECIES_TO_HOENN ( NIDORAN_M ) ,
SPECIES_TO_HOENN ( NIDORINO ) ,
SPECIES_TO_HOENN ( NIDOKING ) ,
SPECIES_TO_HOENN ( CLEFAIRY ) ,
SPECIES_TO_HOENN ( CLEFABLE ) ,
SPECIES_TO_HOENN ( VULPIX ) ,
SPECIES_TO_HOENN ( NINETALES ) ,
SPECIES_TO_HOENN ( JIGGLYPUFF ) ,
SPECIES_TO_HOENN ( WIGGLYTUFF ) ,
SPECIES_TO_HOENN ( ZUBAT ) ,
SPECIES_TO_HOENN ( GOLBAT ) ,
SPECIES_TO_HOENN ( ODDISH ) ,
SPECIES_TO_HOENN ( GLOOM ) ,
SPECIES_TO_HOENN ( VILEPLUME ) ,
SPECIES_TO_HOENN ( PARAS ) ,
SPECIES_TO_HOENN ( PARASECT ) ,
SPECIES_TO_HOENN ( VENONAT ) ,
SPECIES_TO_HOENN ( VENOMOTH ) ,
SPECIES_TO_HOENN ( DIGLETT ) ,
SPECIES_TO_HOENN ( DUGTRIO ) ,
SPECIES_TO_HOENN ( MEOWTH ) ,
SPECIES_TO_HOENN ( PERSIAN ) ,
SPECIES_TO_HOENN ( PSYDUCK ) ,
SPECIES_TO_HOENN ( GOLDUCK ) ,
SPECIES_TO_HOENN ( MANKEY ) ,
SPECIES_TO_HOENN ( PRIMEAPE ) ,
SPECIES_TO_HOENN ( GROWLITHE ) ,
SPECIES_TO_HOENN ( ARCANINE ) ,
SPECIES_TO_HOENN ( POLIWAG ) ,
SPECIES_TO_HOENN ( POLIWHIRL ) ,
SPECIES_TO_HOENN ( POLIWRATH ) ,
SPECIES_TO_HOENN ( ABRA ) ,
SPECIES_TO_HOENN ( KADABRA ) ,
SPECIES_TO_HOENN ( ALAKAZAM ) ,
SPECIES_TO_HOENN ( MACHOP ) ,
SPECIES_TO_HOENN ( MACHOKE ) ,
SPECIES_TO_HOENN ( MACHAMP ) ,
SPECIES_TO_HOENN ( BELLSPROUT ) ,
SPECIES_TO_HOENN ( WEEPINBELL ) ,
SPECIES_TO_HOENN ( VICTREEBEL ) ,
SPECIES_TO_HOENN ( TENTACOOL ) ,
SPECIES_TO_HOENN ( TENTACRUEL ) ,
SPECIES_TO_HOENN ( GEODUDE ) ,
SPECIES_TO_HOENN ( GRAVELER ) ,
SPECIES_TO_HOENN ( GOLEM ) ,
SPECIES_TO_HOENN ( PONYTA ) ,
SPECIES_TO_HOENN ( RAPIDASH ) ,
SPECIES_TO_HOENN ( SLOWPOKE ) ,
SPECIES_TO_HOENN ( SLOWBRO ) ,
SPECIES_TO_HOENN ( MAGNEMITE ) ,
SPECIES_TO_HOENN ( MAGNETON ) ,
SPECIES_TO_HOENN ( FARFETCHD ) ,
SPECIES_TO_HOENN ( DODUO ) ,
SPECIES_TO_HOENN ( DODRIO ) ,
SPECIES_TO_HOENN ( SEEL ) ,
SPECIES_TO_HOENN ( DEWGONG ) ,
SPECIES_TO_HOENN ( GRIMER ) ,
SPECIES_TO_HOENN ( MUK ) ,
SPECIES_TO_HOENN ( SHELLDER ) ,
SPECIES_TO_HOENN ( CLOYSTER ) ,
SPECIES_TO_HOENN ( GASTLY ) ,
SPECIES_TO_HOENN ( HAUNTER ) ,
SPECIES_TO_HOENN ( GENGAR ) ,
SPECIES_TO_HOENN ( ONIX ) ,
SPECIES_TO_HOENN ( DROWZEE ) ,
SPECIES_TO_HOENN ( HYPNO ) ,
SPECIES_TO_HOENN ( KRABBY ) ,
SPECIES_TO_HOENN ( KINGLER ) ,
SPECIES_TO_HOENN ( VOLTORB ) ,
SPECIES_TO_HOENN ( ELECTRODE ) ,
SPECIES_TO_HOENN ( EXEGGCUTE ) ,
SPECIES_TO_HOENN ( EXEGGUTOR ) ,
SPECIES_TO_HOENN ( CUBONE ) ,
SPECIES_TO_HOENN ( MAROWAK ) ,
SPECIES_TO_HOENN ( HITMONLEE ) ,
SPECIES_TO_HOENN ( HITMONCHAN ) ,
SPECIES_TO_HOENN ( LICKITUNG ) ,
SPECIES_TO_HOENN ( KOFFING ) ,
SPECIES_TO_HOENN ( WEEZING ) ,
SPECIES_TO_HOENN ( RHYHORN ) ,
SPECIES_TO_HOENN ( RHYDON ) ,
SPECIES_TO_HOENN ( CHANSEY ) ,
SPECIES_TO_HOENN ( TANGELA ) ,
SPECIES_TO_HOENN ( KANGASKHAN ) ,
SPECIES_TO_HOENN ( HORSEA ) ,
SPECIES_TO_HOENN ( SEADRA ) ,
SPECIES_TO_HOENN ( GOLDEEN ) ,
SPECIES_TO_HOENN ( SEAKING ) ,
SPECIES_TO_HOENN ( STARYU ) ,
SPECIES_TO_HOENN ( STARMIE ) ,
SPECIES_TO_HOENN ( MR_MIME ) ,
SPECIES_TO_HOENN ( SCYTHER ) ,
SPECIES_TO_HOENN ( JYNX ) ,
SPECIES_TO_HOENN ( ELECTABUZZ ) ,
SPECIES_TO_HOENN ( MAGMAR ) ,
SPECIES_TO_HOENN ( PINSIR ) ,
SPECIES_TO_HOENN ( TAUROS ) ,
SPECIES_TO_HOENN ( MAGIKARP ) ,
SPECIES_TO_HOENN ( GYARADOS ) ,
SPECIES_TO_HOENN ( LAPRAS ) ,
SPECIES_TO_HOENN ( DITTO ) ,
SPECIES_TO_HOENN ( EEVEE ) ,
SPECIES_TO_HOENN ( VAPOREON ) ,
SPECIES_TO_HOENN ( JOLTEON ) ,
SPECIES_TO_HOENN ( FLAREON ) ,
SPECIES_TO_HOENN ( PORYGON ) ,
SPECIES_TO_HOENN ( OMANYTE ) ,
SPECIES_TO_HOENN ( OMASTAR ) ,
SPECIES_TO_HOENN ( KABUTO ) ,
SPECIES_TO_HOENN ( KABUTOPS ) ,
SPECIES_TO_HOENN ( AERODACTYL ) ,
SPECIES_TO_HOENN ( SNORLAX ) ,
SPECIES_TO_HOENN ( ARTICUNO ) ,
SPECIES_TO_HOENN ( ZAPDOS ) ,
SPECIES_TO_HOENN ( MOLTRES ) ,
SPECIES_TO_HOENN ( DRATINI ) ,
SPECIES_TO_HOENN ( DRAGONAIR ) ,
SPECIES_TO_HOENN ( DRAGONITE ) ,
SPECIES_TO_HOENN ( MEWTWO ) ,
SPECIES_TO_HOENN ( MEW ) ,
SPECIES_TO_HOENN ( CHIKORITA ) ,
SPECIES_TO_HOENN ( BAYLEEF ) ,
SPECIES_TO_HOENN ( MEGANIUM ) ,
SPECIES_TO_HOENN ( CYNDAQUIL ) ,
SPECIES_TO_HOENN ( QUILAVA ) ,
SPECIES_TO_HOENN ( TYPHLOSION ) ,
SPECIES_TO_HOENN ( TOTODILE ) ,
SPECIES_TO_HOENN ( CROCONAW ) ,
SPECIES_TO_HOENN ( FERALIGATR ) ,
SPECIES_TO_HOENN ( SENTRET ) ,
SPECIES_TO_HOENN ( FURRET ) ,
SPECIES_TO_HOENN ( HOOTHOOT ) ,
SPECIES_TO_HOENN ( NOCTOWL ) ,
SPECIES_TO_HOENN ( LEDYBA ) ,
SPECIES_TO_HOENN ( LEDIAN ) ,
SPECIES_TO_HOENN ( SPINARAK ) ,
SPECIES_TO_HOENN ( ARIADOS ) ,
SPECIES_TO_HOENN ( CROBAT ) ,
SPECIES_TO_HOENN ( CHINCHOU ) ,
SPECIES_TO_HOENN ( LANTURN ) ,
SPECIES_TO_HOENN ( PICHU ) ,
SPECIES_TO_HOENN ( CLEFFA ) ,
SPECIES_TO_HOENN ( IGGLYBUFF ) ,
SPECIES_TO_HOENN ( TOGEPI ) ,
SPECIES_TO_HOENN ( TOGETIC ) ,
SPECIES_TO_HOENN ( NATU ) ,
SPECIES_TO_HOENN ( XATU ) ,
SPECIES_TO_HOENN ( MAREEP ) ,
SPECIES_TO_HOENN ( FLAAFFY ) ,
SPECIES_TO_HOENN ( AMPHAROS ) ,
SPECIES_TO_HOENN ( BELLOSSOM ) ,
SPECIES_TO_HOENN ( MARILL ) ,
SPECIES_TO_HOENN ( AZUMARILL ) ,
SPECIES_TO_HOENN ( SUDOWOODO ) ,
SPECIES_TO_HOENN ( POLITOED ) ,
SPECIES_TO_HOENN ( HOPPIP ) ,
SPECIES_TO_HOENN ( SKIPLOOM ) ,
SPECIES_TO_HOENN ( JUMPLUFF ) ,
SPECIES_TO_HOENN ( AIPOM ) ,
SPECIES_TO_HOENN ( SUNKERN ) ,
SPECIES_TO_HOENN ( SUNFLORA ) ,
SPECIES_TO_HOENN ( YANMA ) ,
SPECIES_TO_HOENN ( WOOPER ) ,
SPECIES_TO_HOENN ( QUAGSIRE ) ,
SPECIES_TO_HOENN ( ESPEON ) ,
SPECIES_TO_HOENN ( UMBREON ) ,
SPECIES_TO_HOENN ( MURKROW ) ,
SPECIES_TO_HOENN ( SLOWKING ) ,
SPECIES_TO_HOENN ( MISDREAVUS ) ,
SPECIES_TO_HOENN ( UNOWN ) ,
SPECIES_TO_HOENN ( WOBBUFFET ) ,
SPECIES_TO_HOENN ( GIRAFARIG ) ,
SPECIES_TO_HOENN ( PINECO ) ,
SPECIES_TO_HOENN ( FORRETRESS ) ,
SPECIES_TO_HOENN ( DUNSPARCE ) ,
SPECIES_TO_HOENN ( GLIGAR ) ,
SPECIES_TO_HOENN ( STEELIX ) ,
SPECIES_TO_HOENN ( SNUBBULL ) ,
SPECIES_TO_HOENN ( GRANBULL ) ,
SPECIES_TO_HOENN ( QWILFISH ) ,
SPECIES_TO_HOENN ( SCIZOR ) ,
SPECIES_TO_HOENN ( SHUCKLE ) ,
SPECIES_TO_HOENN ( HERACROSS ) ,
SPECIES_TO_HOENN ( SNEASEL ) ,
SPECIES_TO_HOENN ( TEDDIURSA ) ,
SPECIES_TO_HOENN ( URSARING ) ,
SPECIES_TO_HOENN ( SLUGMA ) ,
SPECIES_TO_HOENN ( MAGCARGO ) ,
SPECIES_TO_HOENN ( SWINUB ) ,
SPECIES_TO_HOENN ( PILOSWINE ) ,
SPECIES_TO_HOENN ( CORSOLA ) ,
SPECIES_TO_HOENN ( REMORAID ) ,
SPECIES_TO_HOENN ( OCTILLERY ) ,
SPECIES_TO_HOENN ( DELIBIRD ) ,
SPECIES_TO_HOENN ( MANTINE ) ,
SPECIES_TO_HOENN ( SKARMORY ) ,
SPECIES_TO_HOENN ( HOUNDOUR ) ,
SPECIES_TO_HOENN ( HOUNDOOM ) ,
SPECIES_TO_HOENN ( KINGDRA ) ,
SPECIES_TO_HOENN ( PHANPY ) ,
SPECIES_TO_HOENN ( DONPHAN ) ,
SPECIES_TO_HOENN ( PORYGON2 ) ,
SPECIES_TO_HOENN ( STANTLER ) ,
SPECIES_TO_HOENN ( SMEARGLE ) ,
SPECIES_TO_HOENN ( TYROGUE ) ,
SPECIES_TO_HOENN ( HITMONTOP ) ,
SPECIES_TO_HOENN ( SMOOCHUM ) ,
SPECIES_TO_HOENN ( ELEKID ) ,
SPECIES_TO_HOENN ( MAGBY ) ,
SPECIES_TO_HOENN ( MILTANK ) ,
SPECIES_TO_HOENN ( BLISSEY ) ,
SPECIES_TO_HOENN ( RAIKOU ) ,
SPECIES_TO_HOENN ( ENTEI ) ,
SPECIES_TO_HOENN ( SUICUNE ) ,
SPECIES_TO_HOENN ( LARVITAR ) ,
SPECIES_TO_HOENN ( PUPITAR ) ,
SPECIES_TO_HOENN ( TYRANITAR ) ,
SPECIES_TO_HOENN ( LUGIA ) ,
SPECIES_TO_HOENN ( HO_OH ) ,
SPECIES_TO_HOENN ( CELEBI ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_B ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_C ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_D ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_E ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_F ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_G ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_H ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_I ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_J ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_K ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_L ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_M ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_N ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_O ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_P ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_Q ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_R ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_S ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_T ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_U ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_V ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_W ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_X ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_Y ) ,
SPECIES_TO_HOENN ( OLD_UNOWN_Z ) ,
SPECIES_TO_HOENN ( TREECKO ) ,
SPECIES_TO_HOENN ( GROVYLE ) ,
SPECIES_TO_HOENN ( SCEPTILE ) ,
SPECIES_TO_HOENN ( TORCHIC ) ,
SPECIES_TO_HOENN ( COMBUSKEN ) ,
SPECIES_TO_HOENN ( BLAZIKEN ) ,
SPECIES_TO_HOENN ( MUDKIP ) ,
SPECIES_TO_HOENN ( MARSHTOMP ) ,
SPECIES_TO_HOENN ( SWAMPERT ) ,
SPECIES_TO_HOENN ( POOCHYENA ) ,
SPECIES_TO_HOENN ( MIGHTYENA ) ,
SPECIES_TO_HOENN ( ZIGZAGOON ) ,
SPECIES_TO_HOENN ( LINOONE ) ,
SPECIES_TO_HOENN ( WURMPLE ) ,
SPECIES_TO_HOENN ( SILCOON ) ,
SPECIES_TO_HOENN ( BEAUTIFLY ) ,
SPECIES_TO_HOENN ( CASCOON ) ,
SPECIES_TO_HOENN ( DUSTOX ) ,
SPECIES_TO_HOENN ( LOTAD ) ,
SPECIES_TO_HOENN ( LOMBRE ) ,
SPECIES_TO_HOENN ( LUDICOLO ) ,
SPECIES_TO_HOENN ( SEEDOT ) ,
SPECIES_TO_HOENN ( NUZLEAF ) ,
SPECIES_TO_HOENN ( SHIFTRY ) ,
SPECIES_TO_HOENN ( NINCADA ) ,
SPECIES_TO_HOENN ( NINJASK ) ,
SPECIES_TO_HOENN ( SHEDINJA ) ,
SPECIES_TO_HOENN ( TAILLOW ) ,
SPECIES_TO_HOENN ( SWELLOW ) ,
SPECIES_TO_HOENN ( SHROOMISH ) ,
SPECIES_TO_HOENN ( BRELOOM ) ,
SPECIES_TO_HOENN ( SPINDA ) ,
SPECIES_TO_HOENN ( WINGULL ) ,
SPECIES_TO_HOENN ( PELIPPER ) ,
SPECIES_TO_HOENN ( SURSKIT ) ,
SPECIES_TO_HOENN ( MASQUERAIN ) ,
SPECIES_TO_HOENN ( WAILMER ) ,
SPECIES_TO_HOENN ( WAILORD ) ,
SPECIES_TO_HOENN ( SKITTY ) ,
SPECIES_TO_HOENN ( DELCATTY ) ,
SPECIES_TO_HOENN ( KECLEON ) ,
SPECIES_TO_HOENN ( BALTOY ) ,
SPECIES_TO_HOENN ( CLAYDOL ) ,
SPECIES_TO_HOENN ( NOSEPASS ) ,
SPECIES_TO_HOENN ( TORKOAL ) ,
SPECIES_TO_HOENN ( SABLEYE ) ,
SPECIES_TO_HOENN ( BARBOACH ) ,
SPECIES_TO_HOENN ( WHISCASH ) ,
SPECIES_TO_HOENN ( LUVDISC ) ,
SPECIES_TO_HOENN ( CORPHISH ) ,
SPECIES_TO_HOENN ( CRAWDAUNT ) ,
SPECIES_TO_HOENN ( FEEBAS ) ,
SPECIES_TO_HOENN ( MILOTIC ) ,
SPECIES_TO_HOENN ( CARVANHA ) ,
SPECIES_TO_HOENN ( SHARPEDO ) ,
SPECIES_TO_HOENN ( TRAPINCH ) ,
SPECIES_TO_HOENN ( VIBRAVA ) ,
SPECIES_TO_HOENN ( FLYGON ) ,
SPECIES_TO_HOENN ( MAKUHITA ) ,
SPECIES_TO_HOENN ( HARIYAMA ) ,
SPECIES_TO_HOENN ( ELECTRIKE ) ,
SPECIES_TO_HOENN ( MANECTRIC ) ,
SPECIES_TO_HOENN ( NUMEL ) ,
SPECIES_TO_HOENN ( CAMERUPT ) ,
SPECIES_TO_HOENN ( SPHEAL ) ,
SPECIES_TO_HOENN ( SEALEO ) ,
SPECIES_TO_HOENN ( WALREIN ) ,
SPECIES_TO_HOENN ( CACNEA ) ,
SPECIES_TO_HOENN ( CACTURNE ) ,
SPECIES_TO_HOENN ( SNORUNT ) ,
SPECIES_TO_HOENN ( GLALIE ) ,
SPECIES_TO_HOENN ( LUNATONE ) ,
SPECIES_TO_HOENN ( SOLROCK ) ,
SPECIES_TO_HOENN ( AZURILL ) ,
SPECIES_TO_HOENN ( SPOINK ) ,
SPECIES_TO_HOENN ( GRUMPIG ) ,
SPECIES_TO_HOENN ( PLUSLE ) ,
SPECIES_TO_HOENN ( MINUN ) ,
SPECIES_TO_HOENN ( MAWILE ) ,
SPECIES_TO_HOENN ( MEDITITE ) ,
SPECIES_TO_HOENN ( MEDICHAM ) ,
SPECIES_TO_HOENN ( SWABLU ) ,
SPECIES_TO_HOENN ( ALTARIA ) ,
SPECIES_TO_HOENN ( WYNAUT ) ,
SPECIES_TO_HOENN ( DUSKULL ) ,
SPECIES_TO_HOENN ( DUSCLOPS ) ,
SPECIES_TO_HOENN ( ROSELIA ) ,
SPECIES_TO_HOENN ( SLAKOTH ) ,
SPECIES_TO_HOENN ( VIGOROTH ) ,
SPECIES_TO_HOENN ( SLAKING ) ,
SPECIES_TO_HOENN ( GULPIN ) ,
SPECIES_TO_HOENN ( SWALOT ) ,
SPECIES_TO_HOENN ( TROPIUS ) ,
SPECIES_TO_HOENN ( WHISMUR ) ,
SPECIES_TO_HOENN ( LOUDRED ) ,
SPECIES_TO_HOENN ( EXPLOUD ) ,
SPECIES_TO_HOENN ( CLAMPERL ) ,
SPECIES_TO_HOENN ( HUNTAIL ) ,
SPECIES_TO_HOENN ( GOREBYSS ) ,
SPECIES_TO_HOENN ( ABSOL ) ,
SPECIES_TO_HOENN ( SHUPPET ) ,
SPECIES_TO_HOENN ( BANETTE ) ,
SPECIES_TO_HOENN ( SEVIPER ) ,
SPECIES_TO_HOENN ( ZANGOOSE ) ,
SPECIES_TO_HOENN ( RELICANTH ) ,
SPECIES_TO_HOENN ( ARON ) ,
SPECIES_TO_HOENN ( LAIRON ) ,
SPECIES_TO_HOENN ( AGGRON ) ,
SPECIES_TO_HOENN ( CASTFORM ) ,
SPECIES_TO_HOENN ( VOLBEAT ) ,
SPECIES_TO_HOENN ( ILLUMISE ) ,
SPECIES_TO_HOENN ( LILEEP ) ,
SPECIES_TO_HOENN ( CRADILY ) ,
SPECIES_TO_HOENN ( ANORITH ) ,
SPECIES_TO_HOENN ( ARMALDO ) ,
SPECIES_TO_HOENN ( RALTS ) ,
SPECIES_TO_HOENN ( KIRLIA ) ,
SPECIES_TO_HOENN ( GARDEVOIR ) ,
SPECIES_TO_HOENN ( BAGON ) ,
SPECIES_TO_HOENN ( SHELGON ) ,
SPECIES_TO_HOENN ( SALAMENCE ) ,
SPECIES_TO_HOENN ( BELDUM ) ,
SPECIES_TO_HOENN ( METANG ) ,
SPECIES_TO_HOENN ( METAGROSS ) ,
SPECIES_TO_HOENN ( REGIROCK ) ,
SPECIES_TO_HOENN ( REGICE ) ,
SPECIES_TO_HOENN ( REGISTEEL ) ,
SPECIES_TO_HOENN ( KYOGRE ) ,
SPECIES_TO_HOENN ( GROUDON ) ,
SPECIES_TO_HOENN ( RAYQUAZA ) ,
SPECIES_TO_HOENN ( LATIAS ) ,
SPECIES_TO_HOENN ( LATIOS ) ,
SPECIES_TO_HOENN ( JIRACHI ) ,
SPECIES_TO_HOENN ( DEOXYS ) ,
SPECIES_TO_HOENN ( CHIMECHO ) ,
2018-08-15 21:10:28 +02:00
} ;
const u16 gSpeciesToNationalPokedexNum [ ] = // Assigns all species to the National Dex Index (Summary No. for National Dex)
{
2018-12-03 14:49:16 +01:00
SPECIES_TO_NATIONAL ( BULBASAUR ) ,
SPECIES_TO_NATIONAL ( IVYSAUR ) ,
SPECIES_TO_NATIONAL ( VENUSAUR ) ,
SPECIES_TO_NATIONAL ( CHARMANDER ) ,
SPECIES_TO_NATIONAL ( CHARMELEON ) ,
SPECIES_TO_NATIONAL ( CHARIZARD ) ,
SPECIES_TO_NATIONAL ( SQUIRTLE ) ,
SPECIES_TO_NATIONAL ( WARTORTLE ) ,
SPECIES_TO_NATIONAL ( BLASTOISE ) ,
SPECIES_TO_NATIONAL ( CATERPIE ) ,
SPECIES_TO_NATIONAL ( METAPOD ) ,
SPECIES_TO_NATIONAL ( BUTTERFREE ) ,
SPECIES_TO_NATIONAL ( WEEDLE ) ,
SPECIES_TO_NATIONAL ( KAKUNA ) ,
SPECIES_TO_NATIONAL ( BEEDRILL ) ,
SPECIES_TO_NATIONAL ( PIDGEY ) ,
SPECIES_TO_NATIONAL ( PIDGEOTTO ) ,
SPECIES_TO_NATIONAL ( PIDGEOT ) ,
SPECIES_TO_NATIONAL ( RATTATA ) ,
SPECIES_TO_NATIONAL ( RATICATE ) ,
SPECIES_TO_NATIONAL ( SPEAROW ) ,
SPECIES_TO_NATIONAL ( FEAROW ) ,
SPECIES_TO_NATIONAL ( EKANS ) ,
SPECIES_TO_NATIONAL ( ARBOK ) ,
SPECIES_TO_NATIONAL ( PIKACHU ) ,
SPECIES_TO_NATIONAL ( RAICHU ) ,
SPECIES_TO_NATIONAL ( SANDSHREW ) ,
SPECIES_TO_NATIONAL ( SANDSLASH ) ,
SPECIES_TO_NATIONAL ( NIDORAN_F ) ,
SPECIES_TO_NATIONAL ( NIDORINA ) ,
SPECIES_TO_NATIONAL ( NIDOQUEEN ) ,
SPECIES_TO_NATIONAL ( NIDORAN_M ) ,
SPECIES_TO_NATIONAL ( NIDORINO ) ,
SPECIES_TO_NATIONAL ( NIDOKING ) ,
SPECIES_TO_NATIONAL ( CLEFAIRY ) ,
SPECIES_TO_NATIONAL ( CLEFABLE ) ,
SPECIES_TO_NATIONAL ( VULPIX ) ,
SPECIES_TO_NATIONAL ( NINETALES ) ,
SPECIES_TO_NATIONAL ( JIGGLYPUFF ) ,
SPECIES_TO_NATIONAL ( WIGGLYTUFF ) ,
SPECIES_TO_NATIONAL ( ZUBAT ) ,
SPECIES_TO_NATIONAL ( GOLBAT ) ,
SPECIES_TO_NATIONAL ( ODDISH ) ,
SPECIES_TO_NATIONAL ( GLOOM ) ,
SPECIES_TO_NATIONAL ( VILEPLUME ) ,
SPECIES_TO_NATIONAL ( PARAS ) ,
SPECIES_TO_NATIONAL ( PARASECT ) ,
SPECIES_TO_NATIONAL ( VENONAT ) ,
SPECIES_TO_NATIONAL ( VENOMOTH ) ,
SPECIES_TO_NATIONAL ( DIGLETT ) ,
SPECIES_TO_NATIONAL ( DUGTRIO ) ,
SPECIES_TO_NATIONAL ( MEOWTH ) ,
SPECIES_TO_NATIONAL ( PERSIAN ) ,
SPECIES_TO_NATIONAL ( PSYDUCK ) ,
SPECIES_TO_NATIONAL ( GOLDUCK ) ,
SPECIES_TO_NATIONAL ( MANKEY ) ,
SPECIES_TO_NATIONAL ( PRIMEAPE ) ,
SPECIES_TO_NATIONAL ( GROWLITHE ) ,
SPECIES_TO_NATIONAL ( ARCANINE ) ,
SPECIES_TO_NATIONAL ( POLIWAG ) ,
SPECIES_TO_NATIONAL ( POLIWHIRL ) ,
SPECIES_TO_NATIONAL ( POLIWRATH ) ,
SPECIES_TO_NATIONAL ( ABRA ) ,
SPECIES_TO_NATIONAL ( KADABRA ) ,
SPECIES_TO_NATIONAL ( ALAKAZAM ) ,
SPECIES_TO_NATIONAL ( MACHOP ) ,
SPECIES_TO_NATIONAL ( MACHOKE ) ,
SPECIES_TO_NATIONAL ( MACHAMP ) ,
SPECIES_TO_NATIONAL ( BELLSPROUT ) ,
SPECIES_TO_NATIONAL ( WEEPINBELL ) ,
SPECIES_TO_NATIONAL ( VICTREEBEL ) ,
SPECIES_TO_NATIONAL ( TENTACOOL ) ,
SPECIES_TO_NATIONAL ( TENTACRUEL ) ,
SPECIES_TO_NATIONAL ( GEODUDE ) ,
SPECIES_TO_NATIONAL ( GRAVELER ) ,
SPECIES_TO_NATIONAL ( GOLEM ) ,
SPECIES_TO_NATIONAL ( PONYTA ) ,
SPECIES_TO_NATIONAL ( RAPIDASH ) ,
SPECIES_TO_NATIONAL ( SLOWPOKE ) ,
SPECIES_TO_NATIONAL ( SLOWBRO ) ,
SPECIES_TO_NATIONAL ( MAGNEMITE ) ,
SPECIES_TO_NATIONAL ( MAGNETON ) ,
SPECIES_TO_NATIONAL ( FARFETCHD ) ,
SPECIES_TO_NATIONAL ( DODUO ) ,
SPECIES_TO_NATIONAL ( DODRIO ) ,
SPECIES_TO_NATIONAL ( SEEL ) ,
SPECIES_TO_NATIONAL ( DEWGONG ) ,
SPECIES_TO_NATIONAL ( GRIMER ) ,
SPECIES_TO_NATIONAL ( MUK ) ,
SPECIES_TO_NATIONAL ( SHELLDER ) ,
SPECIES_TO_NATIONAL ( CLOYSTER ) ,
SPECIES_TO_NATIONAL ( GASTLY ) ,
SPECIES_TO_NATIONAL ( HAUNTER ) ,
SPECIES_TO_NATIONAL ( GENGAR ) ,
SPECIES_TO_NATIONAL ( ONIX ) ,
SPECIES_TO_NATIONAL ( DROWZEE ) ,
SPECIES_TO_NATIONAL ( HYPNO ) ,
SPECIES_TO_NATIONAL ( KRABBY ) ,
SPECIES_TO_NATIONAL ( KINGLER ) ,
SPECIES_TO_NATIONAL ( VOLTORB ) ,
SPECIES_TO_NATIONAL ( ELECTRODE ) ,
SPECIES_TO_NATIONAL ( EXEGGCUTE ) ,
SPECIES_TO_NATIONAL ( EXEGGUTOR ) ,
SPECIES_TO_NATIONAL ( CUBONE ) ,
SPECIES_TO_NATIONAL ( MAROWAK ) ,
SPECIES_TO_NATIONAL ( HITMONLEE ) ,
SPECIES_TO_NATIONAL ( HITMONCHAN ) ,
SPECIES_TO_NATIONAL ( LICKITUNG ) ,
SPECIES_TO_NATIONAL ( KOFFING ) ,
SPECIES_TO_NATIONAL ( WEEZING ) ,
SPECIES_TO_NATIONAL ( RHYHORN ) ,
SPECIES_TO_NATIONAL ( RHYDON ) ,
SPECIES_TO_NATIONAL ( CHANSEY ) ,
SPECIES_TO_NATIONAL ( TANGELA ) ,
SPECIES_TO_NATIONAL ( KANGASKHAN ) ,
SPECIES_TO_NATIONAL ( HORSEA ) ,
SPECIES_TO_NATIONAL ( SEADRA ) ,
SPECIES_TO_NATIONAL ( GOLDEEN ) ,
SPECIES_TO_NATIONAL ( SEAKING ) ,
SPECIES_TO_NATIONAL ( STARYU ) ,
SPECIES_TO_NATIONAL ( STARMIE ) ,
SPECIES_TO_NATIONAL ( MR_MIME ) ,
SPECIES_TO_NATIONAL ( SCYTHER ) ,
SPECIES_TO_NATIONAL ( JYNX ) ,
SPECIES_TO_NATIONAL ( ELECTABUZZ ) ,
SPECIES_TO_NATIONAL ( MAGMAR ) ,
SPECIES_TO_NATIONAL ( PINSIR ) ,
SPECIES_TO_NATIONAL ( TAUROS ) ,
SPECIES_TO_NATIONAL ( MAGIKARP ) ,
SPECIES_TO_NATIONAL ( GYARADOS ) ,
SPECIES_TO_NATIONAL ( LAPRAS ) ,
SPECIES_TO_NATIONAL ( DITTO ) ,
SPECIES_TO_NATIONAL ( EEVEE ) ,
SPECIES_TO_NATIONAL ( VAPOREON ) ,
SPECIES_TO_NATIONAL ( JOLTEON ) ,
SPECIES_TO_NATIONAL ( FLAREON ) ,
SPECIES_TO_NATIONAL ( PORYGON ) ,
SPECIES_TO_NATIONAL ( OMANYTE ) ,
SPECIES_TO_NATIONAL ( OMASTAR ) ,
SPECIES_TO_NATIONAL ( KABUTO ) ,
SPECIES_TO_NATIONAL ( KABUTOPS ) ,
SPECIES_TO_NATIONAL ( AERODACTYL ) ,
SPECIES_TO_NATIONAL ( SNORLAX ) ,
SPECIES_TO_NATIONAL ( ARTICUNO ) ,
SPECIES_TO_NATIONAL ( ZAPDOS ) ,
SPECIES_TO_NATIONAL ( MOLTRES ) ,
SPECIES_TO_NATIONAL ( DRATINI ) ,
SPECIES_TO_NATIONAL ( DRAGONAIR ) ,
SPECIES_TO_NATIONAL ( DRAGONITE ) ,
SPECIES_TO_NATIONAL ( MEWTWO ) ,
SPECIES_TO_NATIONAL ( MEW ) ,
SPECIES_TO_NATIONAL ( CHIKORITA ) ,
SPECIES_TO_NATIONAL ( BAYLEEF ) ,
SPECIES_TO_NATIONAL ( MEGANIUM ) ,
SPECIES_TO_NATIONAL ( CYNDAQUIL ) ,
SPECIES_TO_NATIONAL ( QUILAVA ) ,
SPECIES_TO_NATIONAL ( TYPHLOSION ) ,
SPECIES_TO_NATIONAL ( TOTODILE ) ,
SPECIES_TO_NATIONAL ( CROCONAW ) ,
SPECIES_TO_NATIONAL ( FERALIGATR ) ,
SPECIES_TO_NATIONAL ( SENTRET ) ,
SPECIES_TO_NATIONAL ( FURRET ) ,
SPECIES_TO_NATIONAL ( HOOTHOOT ) ,
SPECIES_TO_NATIONAL ( NOCTOWL ) ,
SPECIES_TO_NATIONAL ( LEDYBA ) ,
SPECIES_TO_NATIONAL ( LEDIAN ) ,
SPECIES_TO_NATIONAL ( SPINARAK ) ,
SPECIES_TO_NATIONAL ( ARIADOS ) ,
SPECIES_TO_NATIONAL ( CROBAT ) ,
SPECIES_TO_NATIONAL ( CHINCHOU ) ,
SPECIES_TO_NATIONAL ( LANTURN ) ,
SPECIES_TO_NATIONAL ( PICHU ) ,
SPECIES_TO_NATIONAL ( CLEFFA ) ,
SPECIES_TO_NATIONAL ( IGGLYBUFF ) ,
SPECIES_TO_NATIONAL ( TOGEPI ) ,
SPECIES_TO_NATIONAL ( TOGETIC ) ,
SPECIES_TO_NATIONAL ( NATU ) ,
SPECIES_TO_NATIONAL ( XATU ) ,
SPECIES_TO_NATIONAL ( MAREEP ) ,
SPECIES_TO_NATIONAL ( FLAAFFY ) ,
SPECIES_TO_NATIONAL ( AMPHAROS ) ,
SPECIES_TO_NATIONAL ( BELLOSSOM ) ,
SPECIES_TO_NATIONAL ( MARILL ) ,
SPECIES_TO_NATIONAL ( AZUMARILL ) ,
SPECIES_TO_NATIONAL ( SUDOWOODO ) ,
SPECIES_TO_NATIONAL ( POLITOED ) ,
SPECIES_TO_NATIONAL ( HOPPIP ) ,
SPECIES_TO_NATIONAL ( SKIPLOOM ) ,
SPECIES_TO_NATIONAL ( JUMPLUFF ) ,
SPECIES_TO_NATIONAL ( AIPOM ) ,
SPECIES_TO_NATIONAL ( SUNKERN ) ,
SPECIES_TO_NATIONAL ( SUNFLORA ) ,
SPECIES_TO_NATIONAL ( YANMA ) ,
SPECIES_TO_NATIONAL ( WOOPER ) ,
SPECIES_TO_NATIONAL ( QUAGSIRE ) ,
SPECIES_TO_NATIONAL ( ESPEON ) ,
SPECIES_TO_NATIONAL ( UMBREON ) ,
SPECIES_TO_NATIONAL ( MURKROW ) ,
SPECIES_TO_NATIONAL ( SLOWKING ) ,
SPECIES_TO_NATIONAL ( MISDREAVUS ) ,
SPECIES_TO_NATIONAL ( UNOWN ) ,
SPECIES_TO_NATIONAL ( WOBBUFFET ) ,
SPECIES_TO_NATIONAL ( GIRAFARIG ) ,
SPECIES_TO_NATIONAL ( PINECO ) ,
SPECIES_TO_NATIONAL ( FORRETRESS ) ,
SPECIES_TO_NATIONAL ( DUNSPARCE ) ,
SPECIES_TO_NATIONAL ( GLIGAR ) ,
SPECIES_TO_NATIONAL ( STEELIX ) ,
SPECIES_TO_NATIONAL ( SNUBBULL ) ,
SPECIES_TO_NATIONAL ( GRANBULL ) ,
SPECIES_TO_NATIONAL ( QWILFISH ) ,
SPECIES_TO_NATIONAL ( SCIZOR ) ,
SPECIES_TO_NATIONAL ( SHUCKLE ) ,
SPECIES_TO_NATIONAL ( HERACROSS ) ,
SPECIES_TO_NATIONAL ( SNEASEL ) ,
SPECIES_TO_NATIONAL ( TEDDIURSA ) ,
SPECIES_TO_NATIONAL ( URSARING ) ,
SPECIES_TO_NATIONAL ( SLUGMA ) ,
SPECIES_TO_NATIONAL ( MAGCARGO ) ,
SPECIES_TO_NATIONAL ( SWINUB ) ,
SPECIES_TO_NATIONAL ( PILOSWINE ) ,
SPECIES_TO_NATIONAL ( CORSOLA ) ,
SPECIES_TO_NATIONAL ( REMORAID ) ,
SPECIES_TO_NATIONAL ( OCTILLERY ) ,
SPECIES_TO_NATIONAL ( DELIBIRD ) ,
SPECIES_TO_NATIONAL ( MANTINE ) ,
SPECIES_TO_NATIONAL ( SKARMORY ) ,
SPECIES_TO_NATIONAL ( HOUNDOUR ) ,
SPECIES_TO_NATIONAL ( HOUNDOOM ) ,
SPECIES_TO_NATIONAL ( KINGDRA ) ,
SPECIES_TO_NATIONAL ( PHANPY ) ,
SPECIES_TO_NATIONAL ( DONPHAN ) ,
SPECIES_TO_NATIONAL ( PORYGON2 ) ,
SPECIES_TO_NATIONAL ( STANTLER ) ,
SPECIES_TO_NATIONAL ( SMEARGLE ) ,
SPECIES_TO_NATIONAL ( TYROGUE ) ,
SPECIES_TO_NATIONAL ( HITMONTOP ) ,
SPECIES_TO_NATIONAL ( SMOOCHUM ) ,
SPECIES_TO_NATIONAL ( ELEKID ) ,
SPECIES_TO_NATIONAL ( MAGBY ) ,
SPECIES_TO_NATIONAL ( MILTANK ) ,
SPECIES_TO_NATIONAL ( BLISSEY ) ,
SPECIES_TO_NATIONAL ( RAIKOU ) ,
SPECIES_TO_NATIONAL ( ENTEI ) ,
SPECIES_TO_NATIONAL ( SUICUNE ) ,
SPECIES_TO_NATIONAL ( LARVITAR ) ,
SPECIES_TO_NATIONAL ( PUPITAR ) ,
SPECIES_TO_NATIONAL ( TYRANITAR ) ,
SPECIES_TO_NATIONAL ( LUGIA ) ,
SPECIES_TO_NATIONAL ( HO_OH ) ,
SPECIES_TO_NATIONAL ( CELEBI ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_B ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_C ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_D ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_E ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_F ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_G ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_H ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_I ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_J ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_K ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_L ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_M ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_N ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_O ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_P ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_Q ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_R ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_S ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_T ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_U ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_V ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_W ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_X ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_Y ) ,
SPECIES_TO_NATIONAL ( OLD_UNOWN_Z ) ,
SPECIES_TO_NATIONAL ( TREECKO ) ,
SPECIES_TO_NATIONAL ( GROVYLE ) ,
SPECIES_TO_NATIONAL ( SCEPTILE ) ,
SPECIES_TO_NATIONAL ( TORCHIC ) ,
SPECIES_TO_NATIONAL ( COMBUSKEN ) ,
SPECIES_TO_NATIONAL ( BLAZIKEN ) ,
SPECIES_TO_NATIONAL ( MUDKIP ) ,
SPECIES_TO_NATIONAL ( MARSHTOMP ) ,
SPECIES_TO_NATIONAL ( SWAMPERT ) ,
SPECIES_TO_NATIONAL ( POOCHYENA ) ,
SPECIES_TO_NATIONAL ( MIGHTYENA ) ,
SPECIES_TO_NATIONAL ( ZIGZAGOON ) ,
SPECIES_TO_NATIONAL ( LINOONE ) ,
SPECIES_TO_NATIONAL ( WURMPLE ) ,
SPECIES_TO_NATIONAL ( SILCOON ) ,
SPECIES_TO_NATIONAL ( BEAUTIFLY ) ,
SPECIES_TO_NATIONAL ( CASCOON ) ,
SPECIES_TO_NATIONAL ( DUSTOX ) ,
SPECIES_TO_NATIONAL ( LOTAD ) ,
SPECIES_TO_NATIONAL ( LOMBRE ) ,
SPECIES_TO_NATIONAL ( LUDICOLO ) ,
SPECIES_TO_NATIONAL ( SEEDOT ) ,
SPECIES_TO_NATIONAL ( NUZLEAF ) ,
SPECIES_TO_NATIONAL ( SHIFTRY ) ,
SPECIES_TO_NATIONAL ( NINCADA ) ,
SPECIES_TO_NATIONAL ( NINJASK ) ,
SPECIES_TO_NATIONAL ( SHEDINJA ) ,
SPECIES_TO_NATIONAL ( TAILLOW ) ,
SPECIES_TO_NATIONAL ( SWELLOW ) ,
SPECIES_TO_NATIONAL ( SHROOMISH ) ,
SPECIES_TO_NATIONAL ( BRELOOM ) ,
SPECIES_TO_NATIONAL ( SPINDA ) ,
SPECIES_TO_NATIONAL ( WINGULL ) ,
SPECIES_TO_NATIONAL ( PELIPPER ) ,
SPECIES_TO_NATIONAL ( SURSKIT ) ,
SPECIES_TO_NATIONAL ( MASQUERAIN ) ,
SPECIES_TO_NATIONAL ( WAILMER ) ,
SPECIES_TO_NATIONAL ( WAILORD ) ,
SPECIES_TO_NATIONAL ( SKITTY ) ,
SPECIES_TO_NATIONAL ( DELCATTY ) ,
SPECIES_TO_NATIONAL ( KECLEON ) ,
SPECIES_TO_NATIONAL ( BALTOY ) ,
SPECIES_TO_NATIONAL ( CLAYDOL ) ,
SPECIES_TO_NATIONAL ( NOSEPASS ) ,
SPECIES_TO_NATIONAL ( TORKOAL ) ,
SPECIES_TO_NATIONAL ( SABLEYE ) ,
SPECIES_TO_NATIONAL ( BARBOACH ) ,
SPECIES_TO_NATIONAL ( WHISCASH ) ,
SPECIES_TO_NATIONAL ( LUVDISC ) ,
SPECIES_TO_NATIONAL ( CORPHISH ) ,
SPECIES_TO_NATIONAL ( CRAWDAUNT ) ,
SPECIES_TO_NATIONAL ( FEEBAS ) ,
SPECIES_TO_NATIONAL ( MILOTIC ) ,
SPECIES_TO_NATIONAL ( CARVANHA ) ,
SPECIES_TO_NATIONAL ( SHARPEDO ) ,
SPECIES_TO_NATIONAL ( TRAPINCH ) ,
SPECIES_TO_NATIONAL ( VIBRAVA ) ,
SPECIES_TO_NATIONAL ( FLYGON ) ,
SPECIES_TO_NATIONAL ( MAKUHITA ) ,
SPECIES_TO_NATIONAL ( HARIYAMA ) ,
SPECIES_TO_NATIONAL ( ELECTRIKE ) ,
SPECIES_TO_NATIONAL ( MANECTRIC ) ,
SPECIES_TO_NATIONAL ( NUMEL ) ,
SPECIES_TO_NATIONAL ( CAMERUPT ) ,
SPECIES_TO_NATIONAL ( SPHEAL ) ,
SPECIES_TO_NATIONAL ( SEALEO ) ,
SPECIES_TO_NATIONAL ( WALREIN ) ,
SPECIES_TO_NATIONAL ( CACNEA ) ,
SPECIES_TO_NATIONAL ( CACTURNE ) ,
SPECIES_TO_NATIONAL ( SNORUNT ) ,
SPECIES_TO_NATIONAL ( GLALIE ) ,
SPECIES_TO_NATIONAL ( LUNATONE ) ,
SPECIES_TO_NATIONAL ( SOLROCK ) ,
SPECIES_TO_NATIONAL ( AZURILL ) ,
SPECIES_TO_NATIONAL ( SPOINK ) ,
SPECIES_TO_NATIONAL ( GRUMPIG ) ,
SPECIES_TO_NATIONAL ( PLUSLE ) ,
SPECIES_TO_NATIONAL ( MINUN ) ,
SPECIES_TO_NATIONAL ( MAWILE ) ,
SPECIES_TO_NATIONAL ( MEDITITE ) ,
SPECIES_TO_NATIONAL ( MEDICHAM ) ,
SPECIES_TO_NATIONAL ( SWABLU ) ,
SPECIES_TO_NATIONAL ( ALTARIA ) ,
SPECIES_TO_NATIONAL ( WYNAUT ) ,
SPECIES_TO_NATIONAL ( DUSKULL ) ,
SPECIES_TO_NATIONAL ( DUSCLOPS ) ,
SPECIES_TO_NATIONAL ( ROSELIA ) ,
SPECIES_TO_NATIONAL ( SLAKOTH ) ,
SPECIES_TO_NATIONAL ( VIGOROTH ) ,
SPECIES_TO_NATIONAL ( SLAKING ) ,
SPECIES_TO_NATIONAL ( GULPIN ) ,
SPECIES_TO_NATIONAL ( SWALOT ) ,
SPECIES_TO_NATIONAL ( TROPIUS ) ,
SPECIES_TO_NATIONAL ( WHISMUR ) ,
SPECIES_TO_NATIONAL ( LOUDRED ) ,
SPECIES_TO_NATIONAL ( EXPLOUD ) ,
SPECIES_TO_NATIONAL ( CLAMPERL ) ,
SPECIES_TO_NATIONAL ( HUNTAIL ) ,
SPECIES_TO_NATIONAL ( GOREBYSS ) ,
SPECIES_TO_NATIONAL ( ABSOL ) ,
SPECIES_TO_NATIONAL ( SHUPPET ) ,
SPECIES_TO_NATIONAL ( BANETTE ) ,
SPECIES_TO_NATIONAL ( SEVIPER ) ,
SPECIES_TO_NATIONAL ( ZANGOOSE ) ,
SPECIES_TO_NATIONAL ( RELICANTH ) ,
SPECIES_TO_NATIONAL ( ARON ) ,
SPECIES_TO_NATIONAL ( LAIRON ) ,
SPECIES_TO_NATIONAL ( AGGRON ) ,
SPECIES_TO_NATIONAL ( CASTFORM ) ,
SPECIES_TO_NATIONAL ( VOLBEAT ) ,
SPECIES_TO_NATIONAL ( ILLUMISE ) ,
SPECIES_TO_NATIONAL ( LILEEP ) ,
SPECIES_TO_NATIONAL ( CRADILY ) ,
SPECIES_TO_NATIONAL ( ANORITH ) ,
SPECIES_TO_NATIONAL ( ARMALDO ) ,
SPECIES_TO_NATIONAL ( RALTS ) ,
SPECIES_TO_NATIONAL ( KIRLIA ) ,
SPECIES_TO_NATIONAL ( GARDEVOIR ) ,
SPECIES_TO_NATIONAL ( BAGON ) ,
SPECIES_TO_NATIONAL ( SHELGON ) ,
SPECIES_TO_NATIONAL ( SALAMENCE ) ,
SPECIES_TO_NATIONAL ( BELDUM ) ,
SPECIES_TO_NATIONAL ( METANG ) ,
SPECIES_TO_NATIONAL ( METAGROSS ) ,
SPECIES_TO_NATIONAL ( REGIROCK ) ,
SPECIES_TO_NATIONAL ( REGICE ) ,
SPECIES_TO_NATIONAL ( REGISTEEL ) ,
SPECIES_TO_NATIONAL ( KYOGRE ) ,
SPECIES_TO_NATIONAL ( GROUDON ) ,
SPECIES_TO_NATIONAL ( RAYQUAZA ) ,
SPECIES_TO_NATIONAL ( LATIAS ) ,
SPECIES_TO_NATIONAL ( LATIOS ) ,
SPECIES_TO_NATIONAL ( JIRACHI ) ,
SPECIES_TO_NATIONAL ( DEOXYS ) ,
SPECIES_TO_NATIONAL ( CHIMECHO ) ,
2018-08-15 21:10:28 +02:00
} ;
2018-12-25 18:50:15 +01:00
const u16 gHoennToNationalOrder [ ] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
2018-08-15 21:10:28 +02:00
{
2018-12-03 14:49:16 +01:00
HOENN_TO_NATIONAL ( TREECKO ) ,
HOENN_TO_NATIONAL ( GROVYLE ) ,
HOENN_TO_NATIONAL ( SCEPTILE ) ,
HOENN_TO_NATIONAL ( TORCHIC ) ,
HOENN_TO_NATIONAL ( COMBUSKEN ) ,
HOENN_TO_NATIONAL ( BLAZIKEN ) ,
HOENN_TO_NATIONAL ( MUDKIP ) ,
HOENN_TO_NATIONAL ( MARSHTOMP ) ,
HOENN_TO_NATIONAL ( SWAMPERT ) ,
HOENN_TO_NATIONAL ( POOCHYENA ) ,
HOENN_TO_NATIONAL ( MIGHTYENA ) ,
HOENN_TO_NATIONAL ( ZIGZAGOON ) ,
HOENN_TO_NATIONAL ( LINOONE ) ,
HOENN_TO_NATIONAL ( WURMPLE ) ,
HOENN_TO_NATIONAL ( SILCOON ) ,
HOENN_TO_NATIONAL ( BEAUTIFLY ) ,
HOENN_TO_NATIONAL ( CASCOON ) ,
HOENN_TO_NATIONAL ( DUSTOX ) ,
HOENN_TO_NATIONAL ( LOTAD ) ,
HOENN_TO_NATIONAL ( LOMBRE ) ,
HOENN_TO_NATIONAL ( LUDICOLO ) ,
HOENN_TO_NATIONAL ( SEEDOT ) ,
HOENN_TO_NATIONAL ( NUZLEAF ) ,
HOENN_TO_NATIONAL ( SHIFTRY ) ,
HOENN_TO_NATIONAL ( TAILLOW ) ,
HOENN_TO_NATIONAL ( SWELLOW ) ,
HOENN_TO_NATIONAL ( WINGULL ) ,
HOENN_TO_NATIONAL ( PELIPPER ) ,
HOENN_TO_NATIONAL ( RALTS ) ,
HOENN_TO_NATIONAL ( KIRLIA ) ,
HOENN_TO_NATIONAL ( GARDEVOIR ) ,
HOENN_TO_NATIONAL ( SURSKIT ) ,
HOENN_TO_NATIONAL ( MASQUERAIN ) ,
HOENN_TO_NATIONAL ( SHROOMISH ) ,
HOENN_TO_NATIONAL ( BRELOOM ) ,
HOENN_TO_NATIONAL ( SLAKOTH ) ,
HOENN_TO_NATIONAL ( VIGOROTH ) ,
HOENN_TO_NATIONAL ( SLAKING ) ,
HOENN_TO_NATIONAL ( ABRA ) ,
HOENN_TO_NATIONAL ( KADABRA ) ,
HOENN_TO_NATIONAL ( ALAKAZAM ) ,
HOENN_TO_NATIONAL ( NINCADA ) ,
HOENN_TO_NATIONAL ( NINJASK ) ,
HOENN_TO_NATIONAL ( SHEDINJA ) ,
HOENN_TO_NATIONAL ( WHISMUR ) ,
HOENN_TO_NATIONAL ( LOUDRED ) ,
HOENN_TO_NATIONAL ( EXPLOUD ) ,
HOENN_TO_NATIONAL ( MAKUHITA ) ,
HOENN_TO_NATIONAL ( HARIYAMA ) ,
HOENN_TO_NATIONAL ( GOLDEEN ) ,
HOENN_TO_NATIONAL ( SEAKING ) ,
HOENN_TO_NATIONAL ( MAGIKARP ) ,
HOENN_TO_NATIONAL ( GYARADOS ) ,
HOENN_TO_NATIONAL ( AZURILL ) ,
HOENN_TO_NATIONAL ( MARILL ) ,
HOENN_TO_NATIONAL ( AZUMARILL ) ,
HOENN_TO_NATIONAL ( GEODUDE ) ,
HOENN_TO_NATIONAL ( GRAVELER ) ,
HOENN_TO_NATIONAL ( GOLEM ) ,
HOENN_TO_NATIONAL ( NOSEPASS ) ,
HOENN_TO_NATIONAL ( SKITTY ) ,
HOENN_TO_NATIONAL ( DELCATTY ) ,
HOENN_TO_NATIONAL ( ZUBAT ) ,
HOENN_TO_NATIONAL ( GOLBAT ) ,
HOENN_TO_NATIONAL ( CROBAT ) ,
HOENN_TO_NATIONAL ( TENTACOOL ) ,
HOENN_TO_NATIONAL ( TENTACRUEL ) ,
HOENN_TO_NATIONAL ( SABLEYE ) ,
HOENN_TO_NATIONAL ( MAWILE ) ,
HOENN_TO_NATIONAL ( ARON ) ,
HOENN_TO_NATIONAL ( LAIRON ) ,
HOENN_TO_NATIONAL ( AGGRON ) ,
HOENN_TO_NATIONAL ( MACHOP ) ,
HOENN_TO_NATIONAL ( MACHOKE ) ,
HOENN_TO_NATIONAL ( MACHAMP ) ,
HOENN_TO_NATIONAL ( MEDITITE ) ,
HOENN_TO_NATIONAL ( MEDICHAM ) ,
HOENN_TO_NATIONAL ( ELECTRIKE ) ,
HOENN_TO_NATIONAL ( MANECTRIC ) ,
HOENN_TO_NATIONAL ( PLUSLE ) ,
HOENN_TO_NATIONAL ( MINUN ) ,
HOENN_TO_NATIONAL ( MAGNEMITE ) ,
HOENN_TO_NATIONAL ( MAGNETON ) ,
HOENN_TO_NATIONAL ( VOLTORB ) ,
HOENN_TO_NATIONAL ( ELECTRODE ) ,
HOENN_TO_NATIONAL ( VOLBEAT ) ,
HOENN_TO_NATIONAL ( ILLUMISE ) ,
HOENN_TO_NATIONAL ( ODDISH ) ,
HOENN_TO_NATIONAL ( GLOOM ) ,
HOENN_TO_NATIONAL ( VILEPLUME ) ,
HOENN_TO_NATIONAL ( BELLOSSOM ) ,
HOENN_TO_NATIONAL ( DODUO ) ,
HOENN_TO_NATIONAL ( DODRIO ) ,
HOENN_TO_NATIONAL ( ROSELIA ) ,
HOENN_TO_NATIONAL ( GULPIN ) ,
HOENN_TO_NATIONAL ( SWALOT ) ,
HOENN_TO_NATIONAL ( CARVANHA ) ,
HOENN_TO_NATIONAL ( SHARPEDO ) ,
HOENN_TO_NATIONAL ( WAILMER ) ,
HOENN_TO_NATIONAL ( WAILORD ) ,
HOENN_TO_NATIONAL ( NUMEL ) ,
HOENN_TO_NATIONAL ( CAMERUPT ) ,
HOENN_TO_NATIONAL ( SLUGMA ) ,
HOENN_TO_NATIONAL ( MAGCARGO ) ,
HOENN_TO_NATIONAL ( TORKOAL ) ,
HOENN_TO_NATIONAL ( GRIMER ) ,
HOENN_TO_NATIONAL ( MUK ) ,
HOENN_TO_NATIONAL ( KOFFING ) ,
HOENN_TO_NATIONAL ( WEEZING ) ,
HOENN_TO_NATIONAL ( SPOINK ) ,
HOENN_TO_NATIONAL ( GRUMPIG ) ,
HOENN_TO_NATIONAL ( SANDSHREW ) ,
HOENN_TO_NATIONAL ( SANDSLASH ) ,
HOENN_TO_NATIONAL ( SPINDA ) ,
HOENN_TO_NATIONAL ( SKARMORY ) ,
HOENN_TO_NATIONAL ( TRAPINCH ) ,
HOENN_TO_NATIONAL ( VIBRAVA ) ,
HOENN_TO_NATIONAL ( FLYGON ) ,
HOENN_TO_NATIONAL ( CACNEA ) ,
HOENN_TO_NATIONAL ( CACTURNE ) ,
HOENN_TO_NATIONAL ( SWABLU ) ,
HOENN_TO_NATIONAL ( ALTARIA ) ,
HOENN_TO_NATIONAL ( ZANGOOSE ) ,
HOENN_TO_NATIONAL ( SEVIPER ) ,
HOENN_TO_NATIONAL ( LUNATONE ) ,
HOENN_TO_NATIONAL ( SOLROCK ) ,
HOENN_TO_NATIONAL ( BARBOACH ) ,
HOENN_TO_NATIONAL ( WHISCASH ) ,
HOENN_TO_NATIONAL ( CORPHISH ) ,
HOENN_TO_NATIONAL ( CRAWDAUNT ) ,
HOENN_TO_NATIONAL ( BALTOY ) ,
HOENN_TO_NATIONAL ( CLAYDOL ) ,
HOENN_TO_NATIONAL ( LILEEP ) ,
HOENN_TO_NATIONAL ( CRADILY ) ,
HOENN_TO_NATIONAL ( ANORITH ) ,
HOENN_TO_NATIONAL ( ARMALDO ) ,
HOENN_TO_NATIONAL ( IGGLYBUFF ) ,
HOENN_TO_NATIONAL ( JIGGLYPUFF ) ,
HOENN_TO_NATIONAL ( WIGGLYTUFF ) ,
HOENN_TO_NATIONAL ( FEEBAS ) ,
HOENN_TO_NATIONAL ( MILOTIC ) ,
HOENN_TO_NATIONAL ( CASTFORM ) ,
HOENN_TO_NATIONAL ( STARYU ) ,
HOENN_TO_NATIONAL ( STARMIE ) ,
HOENN_TO_NATIONAL ( KECLEON ) ,
HOENN_TO_NATIONAL ( SHUPPET ) ,
HOENN_TO_NATIONAL ( BANETTE ) ,
HOENN_TO_NATIONAL ( DUSKULL ) ,
HOENN_TO_NATIONAL ( DUSCLOPS ) ,
HOENN_TO_NATIONAL ( TROPIUS ) ,
HOENN_TO_NATIONAL ( CHIMECHO ) ,
HOENN_TO_NATIONAL ( ABSOL ) ,
HOENN_TO_NATIONAL ( VULPIX ) ,
HOENN_TO_NATIONAL ( NINETALES ) ,
HOENN_TO_NATIONAL ( PICHU ) ,
HOENN_TO_NATIONAL ( PIKACHU ) ,
HOENN_TO_NATIONAL ( RAICHU ) ,
HOENN_TO_NATIONAL ( PSYDUCK ) ,
HOENN_TO_NATIONAL ( GOLDUCK ) ,
HOENN_TO_NATIONAL ( WYNAUT ) ,
HOENN_TO_NATIONAL ( WOBBUFFET ) ,
HOENN_TO_NATIONAL ( NATU ) ,
HOENN_TO_NATIONAL ( XATU ) ,
HOENN_TO_NATIONAL ( GIRAFARIG ) ,
HOENN_TO_NATIONAL ( PHANPY ) ,
HOENN_TO_NATIONAL ( DONPHAN ) ,
HOENN_TO_NATIONAL ( PINSIR ) ,
HOENN_TO_NATIONAL ( HERACROSS ) ,
HOENN_TO_NATIONAL ( RHYHORN ) ,
HOENN_TO_NATIONAL ( RHYDON ) ,
HOENN_TO_NATIONAL ( SNORUNT ) ,
HOENN_TO_NATIONAL ( GLALIE ) ,
HOENN_TO_NATIONAL ( SPHEAL ) ,
HOENN_TO_NATIONAL ( SEALEO ) ,
HOENN_TO_NATIONAL ( WALREIN ) ,
HOENN_TO_NATIONAL ( CLAMPERL ) ,
HOENN_TO_NATIONAL ( HUNTAIL ) ,
HOENN_TO_NATIONAL ( GOREBYSS ) ,
HOENN_TO_NATIONAL ( RELICANTH ) ,
HOENN_TO_NATIONAL ( CORSOLA ) ,
HOENN_TO_NATIONAL ( CHINCHOU ) ,
HOENN_TO_NATIONAL ( LANTURN ) ,
HOENN_TO_NATIONAL ( LUVDISC ) ,
HOENN_TO_NATIONAL ( HORSEA ) ,
HOENN_TO_NATIONAL ( SEADRA ) ,
HOENN_TO_NATIONAL ( KINGDRA ) ,
HOENN_TO_NATIONAL ( BAGON ) ,
HOENN_TO_NATIONAL ( SHELGON ) ,
HOENN_TO_NATIONAL ( SALAMENCE ) ,
HOENN_TO_NATIONAL ( BELDUM ) ,
HOENN_TO_NATIONAL ( METANG ) ,
HOENN_TO_NATIONAL ( METAGROSS ) ,
HOENN_TO_NATIONAL ( REGIROCK ) ,
HOENN_TO_NATIONAL ( REGICE ) ,
HOENN_TO_NATIONAL ( REGISTEEL ) ,
HOENN_TO_NATIONAL ( LATIAS ) ,
HOENN_TO_NATIONAL ( LATIOS ) ,
HOENN_TO_NATIONAL ( KYOGRE ) ,
HOENN_TO_NATIONAL ( GROUDON ) ,
HOENN_TO_NATIONAL ( RAYQUAZA ) ,
HOENN_TO_NATIONAL ( JIRACHI ) ,
HOENN_TO_NATIONAL ( DEOXYS ) ,
2018-12-25 18:50:15 +01:00
HOENN_TO_NATIONAL ( BULBASAUR ) , // Pokémon from here onwards are UNSEEN in the HoennDex.
2018-12-03 14:49:16 +01:00
HOENN_TO_NATIONAL ( IVYSAUR ) ,
HOENN_TO_NATIONAL ( VENUSAUR ) ,
HOENN_TO_NATIONAL ( CHARMANDER ) ,
HOENN_TO_NATIONAL ( CHARMELEON ) ,
HOENN_TO_NATIONAL ( CHARIZARD ) ,
HOENN_TO_NATIONAL ( SQUIRTLE ) ,
HOENN_TO_NATIONAL ( WARTORTLE ) ,
HOENN_TO_NATIONAL ( BLASTOISE ) ,
HOENN_TO_NATIONAL ( CATERPIE ) ,
HOENN_TO_NATIONAL ( METAPOD ) ,
HOENN_TO_NATIONAL ( BUTTERFREE ) ,
HOENN_TO_NATIONAL ( WEEDLE ) ,
HOENN_TO_NATIONAL ( KAKUNA ) ,
HOENN_TO_NATIONAL ( BEEDRILL ) ,
HOENN_TO_NATIONAL ( PIDGEY ) ,
HOENN_TO_NATIONAL ( PIDGEOTTO ) ,
HOENN_TO_NATIONAL ( PIDGEOT ) ,
HOENN_TO_NATIONAL ( RATTATA ) ,
HOENN_TO_NATIONAL ( RATICATE ) ,
HOENN_TO_NATIONAL ( SPEAROW ) ,
HOENN_TO_NATIONAL ( FEAROW ) ,
HOENN_TO_NATIONAL ( EKANS ) ,
HOENN_TO_NATIONAL ( ARBOK ) ,
HOENN_TO_NATIONAL ( NIDORAN_F ) ,
HOENN_TO_NATIONAL ( NIDORINA ) ,
HOENN_TO_NATIONAL ( NIDOQUEEN ) ,
HOENN_TO_NATIONAL ( NIDORAN_M ) ,
HOENN_TO_NATIONAL ( NIDORINO ) ,
HOENN_TO_NATIONAL ( NIDOKING ) ,
HOENN_TO_NATIONAL ( CLEFAIRY ) ,
HOENN_TO_NATIONAL ( CLEFABLE ) ,
HOENN_TO_NATIONAL ( PARAS ) ,
HOENN_TO_NATIONAL ( PARASECT ) ,
HOENN_TO_NATIONAL ( VENONAT ) ,
HOENN_TO_NATIONAL ( VENOMOTH ) ,
HOENN_TO_NATIONAL ( DIGLETT ) ,
HOENN_TO_NATIONAL ( DUGTRIO ) ,
HOENN_TO_NATIONAL ( MEOWTH ) ,
HOENN_TO_NATIONAL ( PERSIAN ) ,
HOENN_TO_NATIONAL ( MANKEY ) ,
HOENN_TO_NATIONAL ( PRIMEAPE ) ,
HOENN_TO_NATIONAL ( GROWLITHE ) ,
HOENN_TO_NATIONAL ( ARCANINE ) ,
HOENN_TO_NATIONAL ( POLIWAG ) ,
HOENN_TO_NATIONAL ( POLIWHIRL ) ,
HOENN_TO_NATIONAL ( POLIWRATH ) ,
HOENN_TO_NATIONAL ( BELLSPROUT ) ,
HOENN_TO_NATIONAL ( WEEPINBELL ) ,
HOENN_TO_NATIONAL ( VICTREEBEL ) ,
HOENN_TO_NATIONAL ( PONYTA ) ,
HOENN_TO_NATIONAL ( RAPIDASH ) ,
HOENN_TO_NATIONAL ( SLOWPOKE ) ,
HOENN_TO_NATIONAL ( SLOWBRO ) ,
HOENN_TO_NATIONAL ( FARFETCHD ) ,
HOENN_TO_NATIONAL ( SEEL ) ,
HOENN_TO_NATIONAL ( DEWGONG ) ,
HOENN_TO_NATIONAL ( SHELLDER ) ,
HOENN_TO_NATIONAL ( CLOYSTER ) ,
HOENN_TO_NATIONAL ( GASTLY ) ,
HOENN_TO_NATIONAL ( HAUNTER ) ,
HOENN_TO_NATIONAL ( GENGAR ) ,
HOENN_TO_NATIONAL ( ONIX ) ,
HOENN_TO_NATIONAL ( DROWZEE ) ,
HOENN_TO_NATIONAL ( HYPNO ) ,
HOENN_TO_NATIONAL ( KRABBY ) ,
HOENN_TO_NATIONAL ( KINGLER ) ,
HOENN_TO_NATIONAL ( EXEGGCUTE ) ,
HOENN_TO_NATIONAL ( EXEGGUTOR ) ,
HOENN_TO_NATIONAL ( CUBONE ) ,
HOENN_TO_NATIONAL ( MAROWAK ) ,
HOENN_TO_NATIONAL ( HITMONLEE ) ,
HOENN_TO_NATIONAL ( HITMONCHAN ) ,
HOENN_TO_NATIONAL ( LICKITUNG ) ,
HOENN_TO_NATIONAL ( CHANSEY ) ,
HOENN_TO_NATIONAL ( TANGELA ) ,
HOENN_TO_NATIONAL ( KANGASKHAN ) ,
HOENN_TO_NATIONAL ( MR_MIME ) ,
HOENN_TO_NATIONAL ( SCYTHER ) ,
HOENN_TO_NATIONAL ( JYNX ) ,
HOENN_TO_NATIONAL ( ELECTABUZZ ) ,
HOENN_TO_NATIONAL ( MAGMAR ) ,
HOENN_TO_NATIONAL ( TAUROS ) ,
HOENN_TO_NATIONAL ( LAPRAS ) ,
HOENN_TO_NATIONAL ( DITTO ) ,
HOENN_TO_NATIONAL ( EEVEE ) ,
HOENN_TO_NATIONAL ( VAPOREON ) ,
HOENN_TO_NATIONAL ( JOLTEON ) ,
HOENN_TO_NATIONAL ( FLAREON ) ,
HOENN_TO_NATIONAL ( PORYGON ) ,
HOENN_TO_NATIONAL ( OMANYTE ) ,
HOENN_TO_NATIONAL ( OMASTAR ) ,
HOENN_TO_NATIONAL ( KABUTO ) ,
HOENN_TO_NATIONAL ( KABUTOPS ) ,
HOENN_TO_NATIONAL ( AERODACTYL ) ,
HOENN_TO_NATIONAL ( SNORLAX ) ,
HOENN_TO_NATIONAL ( ARTICUNO ) ,
HOENN_TO_NATIONAL ( ZAPDOS ) ,
HOENN_TO_NATIONAL ( MOLTRES ) ,
HOENN_TO_NATIONAL ( DRATINI ) ,
HOENN_TO_NATIONAL ( DRAGONAIR ) ,
HOENN_TO_NATIONAL ( DRAGONITE ) ,
HOENN_TO_NATIONAL ( MEWTWO ) ,
HOENN_TO_NATIONAL ( MEW ) ,
HOENN_TO_NATIONAL ( CHIKORITA ) ,
HOENN_TO_NATIONAL ( BAYLEEF ) ,
HOENN_TO_NATIONAL ( MEGANIUM ) ,
HOENN_TO_NATIONAL ( CYNDAQUIL ) ,
HOENN_TO_NATIONAL ( QUILAVA ) ,
HOENN_TO_NATIONAL ( TYPHLOSION ) ,
HOENN_TO_NATIONAL ( TOTODILE ) ,
HOENN_TO_NATIONAL ( CROCONAW ) ,
HOENN_TO_NATIONAL ( FERALIGATR ) ,
HOENN_TO_NATIONAL ( SENTRET ) ,
HOENN_TO_NATIONAL ( FURRET ) ,
HOENN_TO_NATIONAL ( HOOTHOOT ) ,
HOENN_TO_NATIONAL ( NOCTOWL ) ,
HOENN_TO_NATIONAL ( LEDYBA ) ,
HOENN_TO_NATIONAL ( LEDIAN ) ,
HOENN_TO_NATIONAL ( SPINARAK ) ,
HOENN_TO_NATIONAL ( ARIADOS ) ,
HOENN_TO_NATIONAL ( CLEFFA ) ,
HOENN_TO_NATIONAL ( TOGEPI ) ,
HOENN_TO_NATIONAL ( TOGETIC ) ,
HOENN_TO_NATIONAL ( MAREEP ) ,
HOENN_TO_NATIONAL ( FLAAFFY ) ,
HOENN_TO_NATIONAL ( AMPHAROS ) ,
HOENN_TO_NATIONAL ( SUDOWOODO ) ,
HOENN_TO_NATIONAL ( POLITOED ) ,
HOENN_TO_NATIONAL ( HOPPIP ) ,
HOENN_TO_NATIONAL ( SKIPLOOM ) ,
HOENN_TO_NATIONAL ( JUMPLUFF ) ,
HOENN_TO_NATIONAL ( AIPOM ) ,
HOENN_TO_NATIONAL ( SUNKERN ) ,
HOENN_TO_NATIONAL ( SUNFLORA ) ,
HOENN_TO_NATIONAL ( YANMA ) ,
HOENN_TO_NATIONAL ( WOOPER ) ,
HOENN_TO_NATIONAL ( QUAGSIRE ) ,
HOENN_TO_NATIONAL ( ESPEON ) ,
HOENN_TO_NATIONAL ( UMBREON ) ,
HOENN_TO_NATIONAL ( MURKROW ) ,
HOENN_TO_NATIONAL ( SLOWKING ) ,
HOENN_TO_NATIONAL ( MISDREAVUS ) ,
HOENN_TO_NATIONAL ( UNOWN ) ,
HOENN_TO_NATIONAL ( PINECO ) ,
HOENN_TO_NATIONAL ( FORRETRESS ) ,
HOENN_TO_NATIONAL ( DUNSPARCE ) ,
HOENN_TO_NATIONAL ( GLIGAR ) ,
HOENN_TO_NATIONAL ( STEELIX ) ,
HOENN_TO_NATIONAL ( SNUBBULL ) ,
HOENN_TO_NATIONAL ( GRANBULL ) ,
HOENN_TO_NATIONAL ( QWILFISH ) ,
HOENN_TO_NATIONAL ( SCIZOR ) ,
HOENN_TO_NATIONAL ( SHUCKLE ) ,
HOENN_TO_NATIONAL ( SNEASEL ) ,
HOENN_TO_NATIONAL ( TEDDIURSA ) ,
HOENN_TO_NATIONAL ( URSARING ) ,
HOENN_TO_NATIONAL ( SWINUB ) ,
HOENN_TO_NATIONAL ( PILOSWINE ) ,
HOENN_TO_NATIONAL ( REMORAID ) ,
HOENN_TO_NATIONAL ( OCTILLERY ) ,
HOENN_TO_NATIONAL ( DELIBIRD ) ,
HOENN_TO_NATIONAL ( MANTINE ) ,
HOENN_TO_NATIONAL ( HOUNDOUR ) ,
HOENN_TO_NATIONAL ( HOUNDOOM ) ,
HOENN_TO_NATIONAL ( PORYGON2 ) ,
HOENN_TO_NATIONAL ( STANTLER ) ,
HOENN_TO_NATIONAL ( SMEARGLE ) ,
HOENN_TO_NATIONAL ( TYROGUE ) ,
HOENN_TO_NATIONAL ( HITMONTOP ) ,
HOENN_TO_NATIONAL ( SMOOCHUM ) ,
HOENN_TO_NATIONAL ( ELEKID ) ,
HOENN_TO_NATIONAL ( MAGBY ) ,
HOENN_TO_NATIONAL ( MILTANK ) ,
HOENN_TO_NATIONAL ( BLISSEY ) ,
HOENN_TO_NATIONAL ( RAIKOU ) ,
HOENN_TO_NATIONAL ( ENTEI ) ,
HOENN_TO_NATIONAL ( SUICUNE ) ,
HOENN_TO_NATIONAL ( LARVITAR ) ,
HOENN_TO_NATIONAL ( PUPITAR ) ,
HOENN_TO_NATIONAL ( TYRANITAR ) ,
HOENN_TO_NATIONAL ( LUGIA ) ,
HOENN_TO_NATIONAL ( HO_OH ) ,
HOENN_TO_NATIONAL ( CELEBI ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_B ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_C ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_D ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_E ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_F ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_G ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_H ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_I ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_J ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_K ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_L ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_M ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_N ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_O ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_P ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_Q ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_R ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_S ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_T ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_U ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_V ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_W ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_X ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_Y ) ,
HOENN_TO_NATIONAL ( OLD_UNOWN_Z ) ,
2018-08-15 21:10:28 +02:00
} ;
2018-02-05 17:56:28 +01:00
2018-02-05 17:39:26 +01:00
const struct SpindaSpot gSpindaSpotGraphics [ ] =
{
{ 16 , 7 , INCBIN_U16 ( " graphics/spinda_spots/spot_0.bin " ) } ,
{ 40 , 8 , INCBIN_U16 ( " graphics/spinda_spots/spot_1.bin " ) } ,
{ 22 , 25 , INCBIN_U16 ( " graphics/spinda_spots/spot_2.bin " ) } ,
{ 34 , 26 , INCBIN_U16 ( " graphics/spinda_spots/spot_3.bin " ) }
} ;
# include "data/pokemon/item_effects.h"
2020-07-17 02:12:12 +02:00
const s8 gNatureStatTable [ NUM_NATURES ] [ NUM_NATURE_STATS ] =
2018-02-05 17:39:26 +01:00
{
// Atk Def Spd Sp.Atk Sp.Def
{ 0 , 0 , 0 , 0 , 0 } , // Hardy
{ + 1 , - 1 , 0 , 0 , 0 } , // Lonely
{ + 1 , 0 , - 1 , 0 , 0 } , // Brave
{ + 1 , 0 , 0 , - 1 , 0 } , // Adamant
{ + 1 , 0 , 0 , 0 , - 1 } , // Naughty
{ - 1 , + 1 , 0 , 0 , 0 } , // Bold
{ 0 , 0 , 0 , 0 , 0 } , // Docile
{ 0 , + 1 , - 1 , 0 , 0 } , // Relaxed
{ 0 , + 1 , 0 , - 1 , 0 } , // Impish
{ 0 , + 1 , 0 , 0 , - 1 } , // Lax
{ - 1 , 0 , + 1 , 0 , 0 } , // Timid
{ 0 , - 1 , + 1 , 0 , 0 } , // Hasty
{ 0 , 0 , 0 , 0 , 0 } , // Serious
{ 0 , 0 , + 1 , - 1 , 0 } , // Jolly
{ 0 , 0 , + 1 , 0 , - 1 } , // Naive
{ - 1 , 0 , 0 , + 1 , 0 } , // Modest
{ 0 , - 1 , 0 , + 1 , 0 } , // Mild
{ 0 , 0 , - 1 , + 1 , 0 } , // Quiet
{ 0 , 0 , 0 , 0 , 0 } , // Bashful
{ 0 , 0 , 0 , + 1 , - 1 } , // Rash
{ - 1 , 0 , 0 , 0 , + 1 } , // Calm
{ 0 , - 1 , 0 , 0 , + 1 } , // Gentle
{ 0 , 0 , - 1 , 0 , + 1 } , // Sassy
{ 0 , 0 , 0 , - 1 , + 1 } , // Careful
{ 0 , 0 , 0 , 0 , 0 } , // Quirky
} ;
# include "data/pokemon/tmhm_learnsets.h"
# include "data/pokemon/trainer_class_lookups.h"
# include "data/pokemon/cry_ids.h"
# include "data/pokemon/experience_tables.h"
# include "data/pokemon/base_stats.h"
# include "data/pokemon/level_up_learnsets.h"
# include "data/pokemon/evolution.h"
# include "data/pokemon/level_up_learnset_pointers.h"
2018-12-08 04:39:35 +01:00
// SPECIES_NONE are ignored in the following two tables, so decrement before accessing these arrays to get the right result
2018-12-07 13:16:19 +01:00
2018-02-11 23:46:50 +01:00
static const u8 sMonFrontAnimIdsTable [ ] =
{
2018-12-08 04:39:35 +01:00
[ SPECIES_BULBASAUR - 1 ] = 0x06 ,
[ SPECIES_IVYSAUR - 1 ] = 0x17 ,
[ SPECIES_VENUSAUR - 1 ] = 0x2f ,
[ SPECIES_CHARMANDER - 1 ] = 0x52 ,
[ SPECIES_CHARMELEON - 1 ] = 0x25 ,
[ SPECIES_CHARIZARD - 1 ] = 0x10 ,
[ SPECIES_SQUIRTLE - 1 ] = 0x0b ,
[ SPECIES_WARTORTLE - 1 ] = 0x13 ,
[ SPECIES_BLASTOISE - 1 ] = 0x19 ,
[ SPECIES_CATERPIE - 1 ] = 0x0b ,
[ SPECIES_METAPOD - 1 ] = 0x0b ,
[ SPECIES_BUTTERFREE - 1 ] = 0x1d ,
[ SPECIES_WEEDLE - 1 ] = 0x46 ,
[ SPECIES_KAKUNA - 1 ] = 0x20 ,
[ SPECIES_BEEDRILL - 1 ] = 0x02 ,
[ SPECIES_PIDGEY - 1 ] = 0x47 ,
[ SPECIES_PIDGEOTTO - 1 ] = 0x17 ,
[ SPECIES_PIDGEOT - 1 ] = 0x29 ,
[ SPECIES_RATTATA - 1 ] = 0x43 ,
[ SPECIES_RATICATE - 1 ] = 0x2b ,
[ SPECIES_SPEAROW - 1 ] = 0x18 ,
[ SPECIES_FEAROW - 1 ] = 0x2b ,
[ SPECIES_EKANS - 1 ] = 0x16 ,
[ SPECIES_ARBOK - 1 ] = 0x17 ,
[ SPECIES_PIKACHU - 1 ] = 0x2c ,
[ SPECIES_RAICHU - 1 ] = 0x17 ,
[ SPECIES_SANDSHREW - 1 ] = 0x2d ,
[ SPECIES_SANDSLASH - 1 ] = 0x17 ,
[ SPECIES_NIDORAN_F - 1 ] = 0x00 ,
[ SPECIES_NIDORINA - 1 ] = 0x17 ,
[ SPECIES_NIDOQUEEN - 1 ] = 0x0f ,
[ SPECIES_NIDORAN_M - 1 ] = 0x09 ,
[ SPECIES_NIDORINO - 1 ] = 0x13 ,
[ SPECIES_NIDOKING - 1 ] = 0x0f ,
[ SPECIES_CLEFAIRY - 1 ] = 0x00 ,
[ SPECIES_CLEFABLE - 1 ] = 0x4a ,
[ SPECIES_VULPIX - 1 ] = 0x17 ,
[ SPECIES_NINETALES - 1 ] = 0x10 ,
[ SPECIES_JIGGLYPUFF - 1 ] = 0x48 ,
[ SPECIES_WIGGLYTUFF - 1 ] = 0x31 ,
[ SPECIES_ZUBAT - 1 ] = 0x00 ,
[ SPECIES_GOLBAT - 1 ] = 0x1d ,
[ SPECIES_ODDISH - 1 ] = 0x00 ,
[ SPECIES_GLOOM - 1 ] = 0x45 ,
[ SPECIES_VILEPLUME - 1 ] = 0x49 ,
[ SPECIES_PARAS - 1 ] = 0x46 ,
[ SPECIES_PARASECT - 1 ] = 0x0f ,
[ SPECIES_VENONAT - 1 ] = 0x06 ,
[ SPECIES_VENOMOTH - 1 ] = 0x4b ,
[ SPECIES_DIGLETT - 1 ] = 0x10 ,
[ SPECIES_DUGTRIO - 1 ] = 0x4c ,
[ SPECIES_MEOWTH - 1 ] = 0x52 ,
[ SPECIES_PERSIAN - 1 ] = 0x17 ,
[ SPECIES_PSYDUCK - 1 ] = 0x06 ,
[ SPECIES_GOLDUCK - 1 ] = 0x4c ,
[ SPECIES_MANKEY - 1 ] = 0x32 ,
[ SPECIES_PRIMEAPE - 1 ] = 0x48 ,
[ SPECIES_GROWLITHE - 1 ] = 0x25 ,
[ SPECIES_ARCANINE - 1 ] = 0x02 ,
[ SPECIES_POLIWAG - 1 ] = 0x00 ,
[ SPECIES_POLIWHIRL - 1 ] = 0x32 ,
[ SPECIES_POLIWRATH - 1 ] = 0x19 ,
[ SPECIES_ABRA - 1 ] = 0x31 ,
[ SPECIES_KADABRA - 1 ] = 0x09 ,
[ SPECIES_ALAKAZAM - 1 ] = 0x17 ,
[ SPECIES_MACHOP - 1 ] = 0x00 ,
[ SPECIES_MACHOKE - 1 ] = 0x10 ,
[ SPECIES_MACHAMP - 1 ] = 0x31 ,
[ SPECIES_BELLSPROUT - 1 ] = 0x17 ,
[ SPECIES_WEEPINBELL - 1 ] = 0x0d ,
[ SPECIES_VICTREEBEL - 1 ] = 0x32 ,
[ SPECIES_TENTACOOL - 1 ] = 0x00 ,
[ SPECIES_TENTACRUEL - 1 ] = 0x00 ,
[ SPECIES_GEODUDE - 1 ] = 0x48 ,
[ SPECIES_GRAVELER - 1 ] = 0x48 ,
[ SPECIES_GOLEM - 1 ] = 0x2f ,
[ SPECIES_PONYTA - 1 ] = 0x20 ,
[ SPECIES_RAPIDASH - 1 ] = 0x11 ,
[ SPECIES_SLOWPOKE - 1 ] = 0x45 ,
[ SPECIES_SLOWBRO - 1 ] = 0x0b ,
[ SPECIES_MAGNEMITE - 1 ] = 0x54 ,
[ SPECIES_MAGNETON - 1 ] = 0x2c ,
[ SPECIES_FARFETCHD - 1 ] = 0x48 ,
[ SPECIES_DODUO - 1 ] = 0x4c ,
[ SPECIES_DODRIO - 1 ] = 0x41 ,
[ SPECIES_SEEL - 1 ] = 0x0b ,
[ SPECIES_DEWGONG - 1 ] = 0x45 ,
[ SPECIES_GRIMER - 1 ] = 0x46 ,
[ SPECIES_MUK - 1 ] = 0x30 ,
[ SPECIES_SHELLDER - 1 ] = 0x12 ,
[ SPECIES_CLOYSTER - 1 ] = 0x1d ,
[ SPECIES_GASTLY - 1 ] = 0x15 ,
[ SPECIES_HAUNTER - 1 ] = 0x35 ,
[ SPECIES_GENGAR - 1 ] = 0x3a ,
[ SPECIES_ONIX - 1 ] = 0x43 ,
[ SPECIES_DROWZEE - 1 ] = 0x4f ,
[ SPECIES_HYPNO - 1 ] = 0x09 ,
[ SPECIES_KRABBY - 1 ] = 0x03 ,
[ SPECIES_KINGLER - 1 ] = 0x4b ,
[ SPECIES_VOLTORB - 1 ] = 0x00 ,
[ SPECIES_ELECTRODE - 1 ] = 0x00 ,
[ SPECIES_EXEGGCUTE - 1 ] = 0x46 ,
[ SPECIES_EXEGGUTOR - 1 ] = 0x32 ,
[ SPECIES_CUBONE - 1 ] = 0x48 ,
[ SPECIES_MAROWAK - 1 ] = 0x05 ,
[ SPECIES_HITMONLEE - 1 ] = 0x16 ,
[ SPECIES_HITMONCHAN - 1 ] = 0x09 ,
[ SPECIES_LICKITUNG - 1 ] = 0x45 ,
[ SPECIES_KOFFING - 1 ] = 0x13 ,
[ SPECIES_WEEZING - 1 ] = 0x04 ,
[ SPECIES_RHYHORN - 1 ] = 0x10 ,
[ SPECIES_RHYDON - 1 ] = 0x13 ,
[ SPECIES_CHANSEY - 1 ] = 0x45 ,
[ SPECIES_TANGELA - 1 ] = 0x48 ,
[ SPECIES_KANGASKHAN - 1 ] = 0x17 ,
[ SPECIES_HORSEA - 1 ] = 0x12 ,
[ SPECIES_SEADRA - 1 ] = 0x04 ,
[ SPECIES_GOLDEEN - 1 ] = 0x0d ,
[ SPECIES_SEAKING - 1 ] = 0x1c ,
[ SPECIES_STARYU - 1 ] = 0x4e ,
[ SPECIES_STARMIE - 1 ] = 0x12 ,
[ SPECIES_MR_MIME - 1 ] = 0x46 ,
[ SPECIES_SCYTHER - 1 ] = 0x02 ,
[ SPECIES_JYNX - 1 ] = 0x17 ,
[ SPECIES_ELECTABUZZ - 1 ] = 0x2c ,
[ SPECIES_MAGMAR - 1 ] = 0x0f ,
[ SPECIES_PINSIR - 1 ] = 0x09 ,
[ SPECIES_TAUROS - 1 ] = 0x19 ,
[ SPECIES_MAGIKARP - 1 ] = 0x05 ,
[ SPECIES_GYARADOS - 1 ] = 0x48 ,
[ SPECIES_LAPRAS - 1 ] = 0x17 ,
[ SPECIES_DITTO - 1 ] = 0x01 ,
[ SPECIES_EEVEE - 1 ] = 0x17 ,
[ SPECIES_VAPOREON - 1 ] = 0x17 ,
[ SPECIES_JOLTEON - 1 ] = 0x00 ,
[ SPECIES_FLAREON - 1 ] = 0x17 ,
[ SPECIES_PORYGON - 1 ] = 0x52 ,
[ SPECIES_OMANYTE - 1 ] = 0x51 ,
[ SPECIES_OMASTAR - 1 ] = 0x09 ,
[ SPECIES_KABUTO - 1 ] = 0x1d ,
[ SPECIES_KABUTOPS - 1 ] = 0x0f ,
[ SPECIES_AERODACTYL - 1 ] = 0x47 ,
[ SPECIES_SNORLAX - 1 ] = 0x0b ,
[ SPECIES_ARTICUNO - 1 ] = 0x09 ,
[ SPECIES_ZAPDOS - 1 ] = 0x2c ,
[ SPECIES_MOLTRES - 1 ] = 0x45 ,
[ SPECIES_DRATINI - 1 ] = 0x00 ,
[ SPECIES_DRAGONAIR - 1 ] = 0x10 ,
[ SPECIES_DRAGONITE - 1 ] = 0x47 ,
[ SPECIES_MEWTWO - 1 ] = 0x09 ,
[ SPECIES_MEW - 1 ] = 0x0d ,
[ SPECIES_CHIKORITA - 1 ] = 0x00 ,
[ SPECIES_BAYLEEF - 1 ] = 0x00 ,
[ SPECIES_MEGANIUM - 1 ] = 0x17 ,
[ SPECIES_CYNDAQUIL - 1 ] = 0x52 ,
[ SPECIES_QUILAVA - 1 ] = 0x17 ,
[ SPECIES_TYPHLOSION - 1 ] = 0x10 ,
[ SPECIES_TOTODILE - 1 ] = 0x31 ,
[ SPECIES_CROCONAW - 1 ] = 0x0f ,
[ SPECIES_FERALIGATR - 1 ] = 0x0f ,
[ SPECIES_SENTRET - 1 ] = 0x00 ,
[ SPECIES_FURRET - 1 ] = 0x32 ,
[ SPECIES_HOOTHOOT - 1 ] = 0x47 ,
[ SPECIES_NOCTOWL - 1 ] = 0x17 ,
[ SPECIES_LEDYBA - 1 ] = 0x52 ,
[ SPECIES_LEDIAN - 1 ] = 0x47 ,
[ SPECIES_SPINARAK - 1 ] = 0x4f ,
[ SPECIES_ARIADOS - 1 ] = 0x0f ,
[ SPECIES_CROBAT - 1 ] = 0x00 ,
[ SPECIES_CHINCHOU - 1 ] = 0x45 ,
[ SPECIES_LANTURN - 1 ] = 0x51 ,
[ SPECIES_PICHU - 1 ] = 0x1e ,
[ SPECIES_CLEFFA - 1 ] = 0x52 ,
[ SPECIES_IGGLYBUFF - 1 ] = 0x0c ,
[ SPECIES_TOGEPI - 1 ] = 0x0b ,
[ SPECIES_TOGETIC - 1 ] = 0x00 ,
[ SPECIES_NATU - 1 ] = 0x31 ,
[ SPECIES_XATU - 1 ] = 0x09 ,
[ SPECIES_MAREEP - 1 ] = 0x00 ,
[ SPECIES_FLAAFFY - 1 ] = 0x1e ,
[ SPECIES_AMPHAROS - 1 ] = 0x2c ,
[ SPECIES_BELLOSSOM - 1 ] = 0x0b ,
[ SPECIES_MARILL - 1 ] = 0x00 ,
[ SPECIES_AZUMARILL - 1 ] = 0x4a ,
[ SPECIES_SUDOWOODO - 1 ] = 0x46 ,
[ SPECIES_POLITOED - 1 ] = 0x32 ,
[ SPECIES_HOPPIP - 1 ] = 0x1c ,
[ SPECIES_SKIPLOOM - 1 ] = 0x18 ,
[ SPECIES_JUMPLUFF - 1 ] = 0x51 ,
[ SPECIES_AIPOM - 1 ] = 0x32 ,
[ SPECIES_SUNKERN - 1 ] = 0x52 ,
[ SPECIES_SUNFLORA - 1 ] = 0x00 ,
[ SPECIES_YANMA - 1 ] = 0x2b ,
[ SPECIES_WOOPER - 1 ] = 0x00 ,
[ SPECIES_QUAGSIRE - 1 ] = 0x16 ,
[ SPECIES_ESPEON - 1 ] = 0x09 ,
[ SPECIES_UMBREON - 1 ] = 0x10 ,
[ SPECIES_MURKROW - 1 ] = 0x00 ,
[ SPECIES_SLOWKING - 1 ] = 0x13 ,
[ SPECIES_MISDREAVUS - 1 ] = 0x1c ,
[ SPECIES_UNOWN - 1 ] = 0x0a ,
[ SPECIES_WOBBUFFET - 1 ] = 0x30 ,
[ SPECIES_GIRAFARIG - 1 ] = 0x1e ,
[ SPECIES_PINECO - 1 ] = 0x0b ,
[ SPECIES_FORRETRESS - 1 ] = 0x10 ,
[ SPECIES_DUNSPARCE - 1 ] = 0x00 ,
[ SPECIES_GLIGAR - 1 ] = 0x13 ,
[ SPECIES_STEELIX - 1 ] = 0x0f ,
[ SPECIES_SNUBBULL - 1 ] = 0x17 ,
[ SPECIES_GRANBULL - 1 ] = 0x10 ,
[ SPECIES_QWILFISH - 1 ] = 0x3a ,
[ SPECIES_SCIZOR - 1 ] = 0x02 ,
[ SPECIES_SHUCKLE - 1 ] = 0x0b ,
[ SPECIES_HERACROSS - 1 ] = 0x41 ,
[ SPECIES_SNEASEL - 1 ] = 0x16 ,
[ SPECIES_TEDDIURSA - 1 ] = 0x17 ,
[ SPECIES_URSARING - 1 ] = 0x10 ,
[ SPECIES_SLUGMA - 1 ] = 0x17 ,
[ SPECIES_MAGCARGO - 1 ] = 0x17 ,
[ SPECIES_SWINUB - 1 ] = 0x00 ,
[ SPECIES_PILOSWINE - 1 ] = 0x0f ,
[ SPECIES_CORSOLA - 1 ] = 0x03 ,
[ SPECIES_REMORAID - 1 ] = 0x52 ,
[ SPECIES_OCTILLERY - 1 ] = 0x17 ,
[ SPECIES_DELIBIRD - 1 ] = 0x52 ,
[ SPECIES_MANTINE - 1 ] = 0x0d ,
[ SPECIES_SKARMORY - 1 ] = 0x17 ,
[ SPECIES_HOUNDOUR - 1 ] = 0x17 ,
[ SPECIES_HOUNDOOM - 1 ] = 0x10 ,
[ SPECIES_KINGDRA - 1 ] = 0x42 ,
[ SPECIES_PHANPY - 1 ] = 0x32 ,
[ SPECIES_DONPHAN - 1 ] = 0x19 ,
[ SPECIES_PORYGON2 - 1 ] = 0x00 ,
[ SPECIES_STANTLER - 1 ] = 0x00 ,
[ SPECIES_SMEARGLE - 1 ] = 0x31 ,
[ SPECIES_TYROGUE - 1 ] = 0x16 ,
[ SPECIES_HITMONTOP - 1 ] = 0x02 ,
[ SPECIES_SMOOCHUM - 1 ] = 0x09 ,
[ SPECIES_ELEKID - 1 ] = 0x2c ,
[ SPECIES_MAGBY - 1 ] = 0x00 ,
[ SPECIES_MILTANK - 1 ] = 0x45 ,
[ SPECIES_BLISSEY - 1 ] = 0x00 ,
[ SPECIES_RAIKOU - 1 ] = 0x2c ,
[ SPECIES_ENTEI - 1 ] = 0x09 ,
[ SPECIES_SUICUNE - 1 ] = 0x10 ,
[ SPECIES_LARVITAR - 1 ] = 0x52 ,
[ SPECIES_PUPITAR - 1 ] = 0x10 ,
[ SPECIES_TYRANITAR - 1 ] = 0x0f ,
[ SPECIES_LUGIA - 1 ] = 0x3a ,
[ SPECIES_HO_OH - 1 ] = 0x09 ,
[ SPECIES_CELEBI - 1 ] = 0x18 ,
[ SPECIES_OLD_UNOWN_B - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_C - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_D - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_E - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_F - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_G - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_H - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_I - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_J - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_K - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_L - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_M - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_N - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_O - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_P - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_Q - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_R - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_S - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_T - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_U - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_V - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_W - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_X - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_Y - 1 ] = 0x00 ,
[ SPECIES_OLD_UNOWN_Z - 1 ] = 0x00 ,
[ SPECIES_TREECKO - 1 ] = 0x00 ,
[ SPECIES_GROVYLE - 1 ] = 0x17 ,
[ SPECIES_SCEPTILE - 1 ] = 0x10 ,
[ SPECIES_TORCHIC - 1 ] = 0x16 ,
[ SPECIES_COMBUSKEN - 1 ] = 0x06 ,
[ SPECIES_BLAZIKEN - 1 ] = 0x0f ,
[ SPECIES_MUDKIP - 1 ] = 0x01 ,
[ SPECIES_MARSHTOMP - 1 ] = 0x04 ,
[ SPECIES_SWAMPERT - 1 ] = 0x1e ,
[ SPECIES_POOCHYENA - 1 ] = 0x10 ,
[ SPECIES_MIGHTYENA - 1 ] = 0x10 ,
[ SPECIES_ZIGZAGOON - 1 ] = 0x03 ,
[ SPECIES_LINOONE - 1 ] = 0x09 ,
[ SPECIES_WURMPLE - 1 ] = 0x00 ,
[ SPECIES_SILCOON - 1 ] = 0x00 ,
[ SPECIES_BEAUTIFLY - 1 ] = 0x04 ,
[ SPECIES_CASCOON - 1 ] = 0x04 ,
[ SPECIES_DUSTOX - 1 ] = 0x06 ,
[ SPECIES_LOTAD - 1 ] = 0x00 ,
[ SPECIES_LOMBRE - 1 ] = 0x00 ,
[ SPECIES_LUDICOLO - 1 ] = 0x49 ,
[ SPECIES_SEEDOT - 1 ] = 0x05 ,
[ SPECIES_NUZLEAF - 1 ] = 0x00 ,
[ SPECIES_SHIFTRY - 1 ] = 0x02 ,
[ SPECIES_NINCADA - 1 ] = 0x00 ,
[ SPECIES_NINJASK - 1 ] = 0x46 ,
[ SPECIES_SHEDINJA - 1 ] = 0x1c ,
[ SPECIES_TAILLOW - 1 ] = 0x1e ,
[ SPECIES_SWELLOW - 1 ] = 0x01 ,
[ SPECIES_SHROOMISH - 1 ] = 0x00 ,
[ SPECIES_BRELOOM - 1 ] = 0x00 ,
[ SPECIES_SPINDA - 1 ] = 0x31 ,
[ SPECIES_WINGULL - 1 ] = 0x1b ,
[ SPECIES_PELIPPER - 1 ] = 0x1c ,
[ SPECIES_SURSKIT - 1 ] = 0x00 ,
[ SPECIES_MASQUERAIN - 1 ] = 0x00 ,
[ SPECIES_WAILMER - 1 ] = 0x01 ,
[ SPECIES_WAILORD - 1 ] = 0x1c ,
[ SPECIES_SKITTY - 1 ] = 0x00 ,
[ SPECIES_DELCATTY - 1 ] = 0x17 ,
[ SPECIES_KECLEON - 1 ] = 0x35 ,
[ SPECIES_BALTOY - 1 ] = 0x1d ,
[ SPECIES_CLAYDOL - 1 ] = 0x51 ,
[ SPECIES_NOSEPASS - 1 ] = 0x49 ,
[ SPECIES_TORKOAL - 1 ] = 0x17 ,
[ SPECIES_SABLEYE - 1 ] = 0x15 ,
[ SPECIES_BARBOACH - 1 ] = 0x49 ,
[ SPECIES_WHISCASH - 1 ] = 0x49 ,
[ SPECIES_LUVDISC - 1 ] = 0x1d ,
[ SPECIES_CORPHISH - 1 ] = 0x10 ,
[ SPECIES_CRAWDAUNT - 1 ] = 0x09 ,
[ SPECIES_FEEBAS - 1 ] = 0x49 ,
[ SPECIES_MILOTIC - 1 ] = 0x22 ,
[ SPECIES_CARVANHA - 1 ] = 0x49 ,
[ SPECIES_SHARPEDO - 1 ] = 0x56 ,
[ SPECIES_TRAPINCH - 1 ] = 0x10 ,
[ SPECIES_VIBRAVA - 1 ] = 0x0f ,
[ SPECIES_FLYGON - 1 ] = 0x4b ,
[ SPECIES_MAKUHITA - 1 ] = 0x0b ,
[ SPECIES_HARIYAMA - 1 ] = 0x34 ,
[ SPECIES_ELECTRIKE - 1 ] = 0x00 ,
[ SPECIES_MANECTRIC - 1 ] = 0x00 ,
[ SPECIES_NUMEL - 1 ] = 0x04 ,
[ SPECIES_CAMERUPT - 1 ] = 0x10 ,
[ SPECIES_SPHEAL - 1 ] = 0x53 ,
[ SPECIES_SEALEO - 1 ] = 0x17 ,
[ SPECIES_WALREIN - 1 ] = 0x0f ,
[ SPECIES_CACNEA - 1 ] = 0x49 ,
[ SPECIES_CACTURNE - 1 ] = 0x04 ,
[ SPECIES_SNORUNT - 1 ] = 0x45 ,
[ SPECIES_GLALIE - 1 ] = 0x0a ,
[ SPECIES_LUNATONE - 1 ] = 0x0e ,
[ SPECIES_SOLROCK - 1 ] = 0x08 ,
[ SPECIES_AZURILL - 1 ] = 0x00 ,
[ SPECIES_SPOINK - 1 ] = 0x56 ,
[ SPECIES_GRUMPIG - 1 ] = 0x32 ,
[ SPECIES_PLUSLE - 1 ] = 0x00 ,
[ SPECIES_MINUN - 1 ] = 0x01 ,
[ SPECIES_MAWILE - 1 ] = 0x00 ,
[ SPECIES_MEDITITE - 1 ] = 0x05 ,
[ SPECIES_MEDICHAM - 1 ] = 0x45 ,
[ SPECIES_SWABLU - 1 ] = 0x04 ,
[ SPECIES_ALTARIA - 1 ] = 0x16 ,
[ SPECIES_WYNAUT - 1 ] = 0x32 ,
[ SPECIES_DUSKULL - 1 ] = 0x0a ,
[ SPECIES_DUSCLOPS - 1 ] = 0x02 ,
[ SPECIES_ROSELIA - 1 ] = 0x45 ,
[ SPECIES_SLAKOTH - 1 ] = 0x45 ,
[ SPECIES_VIGOROTH - 1 ] = 0x31 ,
[ SPECIES_SLAKING - 1 ] = 0x45 ,
[ SPECIES_GULPIN - 1 ] = 0x00 ,
[ SPECIES_SWALOT - 1 ] = 0x45 ,
[ SPECIES_TROPIUS - 1 ] = 0x10 ,
[ SPECIES_WHISMUR - 1 ] = 0x03 ,
[ SPECIES_LOUDRED - 1 ] = 0x49 ,
[ SPECIES_EXPLOUD - 1 ] = 0x19 ,
[ SPECIES_CLAMPERL - 1 ] = 0x12 ,
[ SPECIES_HUNTAIL - 1 ] = 0x09 ,
[ SPECIES_GOREBYSS - 1 ] = 0x1c ,
[ SPECIES_ABSOL - 1 ] = 0x11 ,
[ SPECIES_SHUPPET - 1 ] = 0x1c ,
[ SPECIES_BANETTE - 1 ] = 0x0d ,
[ SPECIES_SEVIPER - 1 ] = 0x17 ,
[ SPECIES_ZANGOOSE - 1 ] = 0x09 ,
[ SPECIES_RELICANTH - 1 ] = 0x1a ,
[ SPECIES_ARON - 1 ] = 0x45 ,
[ SPECIES_LAIRON - 1 ] = 0x00 ,
[ SPECIES_AGGRON - 1 ] = 0x19 ,
[ SPECIES_CASTFORM - 1 ] = 0x1d ,
[ SPECIES_VOLBEAT - 1 ] = 0x00 ,
[ SPECIES_ILLUMISE - 1 ] = 0x05 ,
[ SPECIES_LILEEP - 1 ] = 0x17 ,
[ SPECIES_CRADILY - 1 ] = 0x19 ,
[ SPECIES_ANORITH - 1 ] = 0x12 ,
[ SPECIES_ARMALDO - 1 ] = 0x10 ,
[ SPECIES_RALTS - 1 ] = 0x45 ,
[ SPECIES_KIRLIA - 1 ] = 0x00 ,
[ SPECIES_GARDEVOIR - 1 ] = 0x00 ,
[ SPECIES_BAGON - 1 ] = 0x19 ,
[ SPECIES_SHELGON - 1 ] = 0x04 ,
[ SPECIES_SALAMENCE - 1 ] = 0x0f ,
[ SPECIES_BELDUM - 1 ] = 0x0f ,
[ SPECIES_METANG - 1 ] = 0x04 ,
[ SPECIES_METAGROSS - 1 ] = 0x10 ,
[ SPECIES_REGIROCK - 1 ] = 0x01 ,
[ SPECIES_REGICE - 1 ] = 0x44 ,
[ SPECIES_REGISTEEL - 1 ] = 0x09 ,
[ SPECIES_KYOGRE - 1 ] = 0x2d ,
[ SPECIES_GROUDON - 1 ] = 0x10 ,
[ SPECIES_RAYQUAZA - 1 ] = 0x0f ,
[ SPECIES_LATIAS - 1 ] = 0x2d ,
[ SPECIES_LATIOS - 1 ] = 0x10 ,
[ SPECIES_JIRACHI - 1 ] = 0x0d ,
[ SPECIES_DEOXYS - 1 ] = 0x1b ,
[ SPECIES_CHIMECHO - 1 ] = 0x1d ,
2018-02-11 23:46:50 +01:00
} ;
2019-04-02 18:02:43 +02:00
static const u8 sMonAnimationDelayTable [ NUM_SPECIES - 1 ] =
2018-02-11 23:46:50 +01:00
{
2018-12-08 04:39:35 +01:00
[ SPECIES_BLASTOISE - 1 ] = 0x32 ,
[ SPECIES_WEEDLE - 1 ] = 0x0a ,
[ SPECIES_KAKUNA - 1 ] = 0x14 ,
[ SPECIES_BEEDRILL - 1 ] = 0x23 ,
[ SPECIES_PIDGEOTTO - 1 ] = 0x19 ,
[ SPECIES_FEAROW - 1 ] = 0x02 ,
[ SPECIES_EKANS - 1 ] = 0x1e ,
[ SPECIES_NIDORAN_F - 1 ] = 0x1c ,
[ SPECIES_NIDOKING - 1 ] = 0x19 ,
[ SPECIES_PARAS - 1 ] = 0x0a ,
[ SPECIES_PARASECT - 1 ] = 0x2d ,
[ SPECIES_VENONAT - 1 ] = 0x14 ,
[ SPECIES_DIGLETT - 1 ] = 0x19 ,
[ SPECIES_DUGTRIO - 1 ] = 0x23 ,
[ SPECIES_MEOWTH - 1 ] = 0x28 ,
[ SPECIES_PERSIAN - 1 ] = 0x14 ,
[ SPECIES_MANKEY - 1 ] = 0x14 ,
[ SPECIES_GROWLITHE - 1 ] = 0x1e ,
[ SPECIES_ARCANINE - 1 ] = 0x28 ,
[ SPECIES_POLIWHIRL - 1 ] = 0x05 ,
[ SPECIES_WEEPINBELL - 1 ] = 0x03 ,
[ SPECIES_MUK - 1 ] = 0x2d ,
[ SPECIES_SHELLDER - 1 ] = 0x14 ,
[ SPECIES_HAUNTER - 1 ] = 0x17 ,
[ SPECIES_DROWZEE - 1 ] = 0x30 ,
[ SPECIES_HYPNO - 1 ] = 0x28 ,
[ SPECIES_HITMONCHAN - 1 ] = 0x19 ,
[ SPECIES_SCYTHER - 1 ] = 0x0a ,
[ SPECIES_TAUROS - 1 ] = 0x0a ,
[ SPECIES_TYPHLOSION - 1 ] = 0x14 ,
[ SPECIES_FERALIGATR - 1 ] = 0x05 ,
[ SPECIES_NATU - 1 ] = 0x1e ,
[ SPECIES_MAREEP - 1 ] = 0x32 ,
[ SPECIES_AMPHAROS - 1 ] = 0x0a ,
[ SPECIES_POLITOED - 1 ] = 0x28 ,
[ SPECIES_DUNSPARCE - 1 ] = 0x0a ,
[ SPECIES_STEELIX - 1 ] = 0x2d ,
[ SPECIES_QWILFISH - 1 ] = 0x27 ,
[ SPECIES_SCIZOR - 1 ] = 0x13 ,
[ SPECIES_OCTILLERY - 1 ] = 0x14 ,
[ SPECIES_SMOOCHUM - 1 ] = 0x28 ,
[ SPECIES_TYRANITAR - 1 ] = 0x0a ,
[ SPECIES_LUGIA - 1 ] = 0x14 ,
[ SPECIES_WAILORD - 1 ] = 0x0a ,
[ SPECIES_KECLEON - 1 ] = 0x1e ,
[ SPECIES_MILOTIC - 1 ] = 0x2d ,
[ SPECIES_SPHEAL - 1 ] = 0x0f ,
[ SPECIES_SNORUNT - 1 ] = 0x14 ,
[ SPECIES_GRUMPIG - 1 ] = 0x0f ,
[ SPECIES_WYNAUT - 1 ] = 0x0f ,
[ SPECIES_DUSCLOPS - 1 ] = 0x1e ,
[ SPECIES_ABSOL - 1 ] = 0x2d ,
[ SPECIES_SALAMENCE - 1 ] = 0x46 ,
[ SPECIES_KYOGRE - 1 ] = 0x3c ,
[ SPECIES_RAYQUAZA - 1 ] = 0x3c ,
2018-02-11 23:46:50 +01:00
} ;
2019-02-19 10:09:42 +01:00
const u8 gPPUpGetMask [ ] = { 0x03 , 0x0c , 0x30 , 0xc0 } ; // Masks for getting PP Up count, also PP Max values
const u8 gPPUpSetMask [ ] = { 0xfc , 0xf3 , 0xcf , 0x3f } ; // Masks for setting PP Up count
const u8 gPPUpAddMask [ ] = { 0x01 , 0x04 , 0x10 , 0x40 } ; // Values added to PP Up count
2018-02-11 23:46:50 +01:00
const u8 gStatStageRatios [ ] [ 2 ] =
{
{ 10 , 40 } , // -6
{ 10 , 35 } , // -5
{ 10 , 30 } , // -4
{ 10 , 25 } , // -3
{ 10 , 20 } , // -2
{ 10 , 15 } , // -1
{ 10 , 10 } , // 0
{ 15 , 10 } , // +1
{ 20 , 10 } , // +2
{ 25 , 10 } , // +3
{ 30 , 10 } , // +4
{ 35 , 10 } , // +5
{ 40 , 10 } , // +6
} ;
static const u16 sDeoxysBaseStats [ ] =
{
2020-02-02 19:28:54 +01:00
[ STAT_HP ] = 50 ,
[ STAT_ATK ] = 95 ,
[ STAT_DEF ] = 90 ,
[ STAT_SPEED ] = 180 ,
[ STAT_SPATK ] = 95 ,
[ STAT_SPDEF ] = 90 ,
2018-02-11 23:46:50 +01:00
} ;
2020-02-07 18:48:47 +01:00
const u16 gLinkPlayerFacilityClasses [ NUM_MALE_LINK_FACILITY_CLASSES + NUM_FEMALE_LINK_FACILITY_CLASSES ] =
2018-02-11 23:46:50 +01:00
{
2020-02-07 18:48:47 +01:00
// Male classes
FACILITY_CLASS_COOLTRAINER_M ,
FACILITY_CLASS_BLACK_BELT ,
FACILITY_CLASS_CAMPER ,
FACILITY_CLASS_YOUNGSTER ,
FACILITY_CLASS_PSYCHIC_M ,
FACILITY_CLASS_BUG_CATCHER ,
FACILITY_CLASS_PKMN_BREEDER_M ,
FACILITY_CLASS_GUITARIST ,
// Female Classes
FACILITY_CLASS_COOLTRAINER_F ,
FACILITY_CLASS_HEX_MANIAC ,
FACILITY_CLASS_PICNICKER ,
FACILITY_CLASS_LASS ,
FACILITY_CLASS_PSYCHIC_F ,
FACILITY_CLASS_BATTLE_GIRL ,
FACILITY_CLASS_PKMN_BREEDER_F ,
FACILITY_CLASS_BEAUTY
2018-02-11 23:46:50 +01:00
} ;
static const u8 sHoldEffectToType [ ] [ 2 ] =
{
{ HOLD_EFFECT_BUG_POWER , TYPE_BUG } ,
{ HOLD_EFFECT_STEEL_POWER , TYPE_STEEL } ,
{ HOLD_EFFECT_GROUND_POWER , TYPE_GROUND } ,
{ HOLD_EFFECT_ROCK_POWER , TYPE_ROCK } ,
{ HOLD_EFFECT_GRASS_POWER , TYPE_GRASS } ,
{ HOLD_EFFECT_DARK_POWER , TYPE_DARK } ,
{ HOLD_EFFECT_FIGHTING_POWER , TYPE_FIGHTING } ,
{ HOLD_EFFECT_ELECTRIC_POWER , TYPE_ELECTRIC } ,
{ HOLD_EFFECT_WATER_POWER , TYPE_WATER } ,
{ HOLD_EFFECT_FLYING_POWER , TYPE_FLYING } ,
{ HOLD_EFFECT_POISON_POWER , TYPE_POISON } ,
{ HOLD_EFFECT_ICE_POWER , TYPE_ICE } ,
{ HOLD_EFFECT_GHOST_POWER , TYPE_GHOST } ,
{ HOLD_EFFECT_PSYCHIC_POWER , TYPE_PSYCHIC } ,
{ HOLD_EFFECT_FIRE_POWER , TYPE_FIRE } ,
{ HOLD_EFFECT_DRAGON_POWER , TYPE_DRAGON } ,
{ HOLD_EFFECT_NORMAL_POWER , TYPE_NORMAL } ,
} ;
const struct SpriteTemplate gUnknown_08329D98 [ MAX_BATTLERS_COUNT ] =
{
{ // B_POSITION_PLAYER_LEFT
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
. images = gUnknown_082FF3A8 ,
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{ // B_POSITION_OPPONENT_LEFT
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACA8 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
. images = gUnknown_082FF3C8 ,
. affineAnims = gUnknown_082FF694 ,
2018-12-23 14:52:47 +01:00
. callback = SpriteCb_WildMon ,
2018-02-11 23:46:50 +01:00
} ,
{ // B_POSITION_PLAYER_RIGHT
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
. images = gUnknown_082FF3E8 ,
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{ // B_POSITION_OPPONENT_RIGHT
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACA8 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
. images = gUnknown_082FF408 ,
. affineAnims = gUnknown_082FF694 ,
2018-12-23 14:52:47 +01:00
. callback = SpriteCb_WildMon
2018-02-11 23:46:50 +01:00
} ,
} ;
2019-02-02 22:53:47 +01:00
static const struct SpriteTemplate gSpriteTemplateTable_TrainerBackSprites [ ] =
2018-02-11 23:46:50 +01:00
{
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
2019-02-02 22:53:47 +01:00
. images = gTrainerBackPicTable_Brendan ,
2018-02-11 23:46:50 +01:00
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
2019-02-02 22:53:47 +01:00
. images = gTrainerBackPicTable_May ,
2018-02-11 23:46:50 +01:00
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
2019-02-02 22:53:47 +01:00
. images = gTrainerBackPicTable_Red ,
2018-02-11 23:46:50 +01:00
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
2019-02-02 22:53:47 +01:00
. images = gTrainerBackPicTable_Leaf ,
2018-02-11 23:46:50 +01:00
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
2019-02-02 22:53:47 +01:00
. images = gTrainerBackPicTable_RubySapphireBrendan ,
2018-02-11 23:46:50 +01:00
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
2019-02-02 22:53:47 +01:00
. images = gTrainerBackPicTable_RubySapphireMay ,
2018-02-11 23:46:50 +01:00
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
2019-02-02 22:53:47 +01:00
. images = gTrainerBackPicTable_Wally ,
2018-02-11 23:46:50 +01:00
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. paletteTag = 0 ,
2018-12-23 14:52:47 +01:00
. oam = & gOamData_831ACB0 ,
2018-02-11 23:46:50 +01:00
. anims = NULL ,
2019-02-02 22:53:47 +01:00
. images = gTrainerBackPicTable_Steven ,
2018-02-11 23:46:50 +01:00
. affineAnims = gUnknown_082FF618 ,
. callback = sub_8039BB4 ,
} ,
} ;
static const u8 sSecretBaseFacilityClasses [ 2 ] [ 5 ] =
{
2018-02-12 00:11:10 +01:00
{ FACILITY_CLASS_YOUNGSTER , FACILITY_CLASS_BUG_CATCHER , FACILITY_CLASS_RICH_BOY , FACILITY_CLASS_CAMPER , FACILITY_CLASS_COOLTRAINER_M } ,
{ FACILITY_CLASS_LASS , FACILITY_CLASS_SCHOOL_KID_F , FACILITY_CLASS_LADY , FACILITY_CLASS_PICNICKER , FACILITY_CLASS_COOLTRAINER_F }
2018-02-11 23:46:50 +01:00
} ;
static const u8 sGetMonDataEVConstants [ ] =
{
MON_DATA_HP_EV ,
MON_DATA_ATK_EV ,
MON_DATA_DEF_EV ,
MON_DATA_SPEED_EV ,
MON_DATA_SPDEF_EV ,
MON_DATA_SPATK_EV
} ;
2019-12-22 01:01:38 +01:00
// For stat-raising items
static const u8 sStatsToRaise [ ] =
2018-02-11 23:46:50 +01:00
{
STAT_ATK , STAT_ATK , STAT_SPEED , STAT_DEF , STAT_SPATK , STAT_ACC
} ;
2020-02-02 19:28:54 +01:00
// 3 modifiers each for how much to change friendship for different ranges
// 0-99, 100-199, 200+
static const s8 sFriendshipEventModifiers [ ] [ 3 ] =
{
[ FRIENDSHIP_EVENT_GROW_LEVEL ] = { 5 , 3 , 2 } ,
[ FRIENDSHIP_EVENT_VITAMIN ] = { 5 , 3 , 2 } ,
[ FRIENDSHIP_EVENT_BATTLE_ITEM ] = { 1 , 1 , 0 } ,
[ FRIENDSHIP_EVENT_LEAGUE_BATTLE ] = { 3 , 2 , 1 } ,
[ FRIENDSHIP_EVENT_LEARN_TMHM ] = { 1 , 1 , 0 } ,
[ FRIENDSHIP_EVENT_WALKING ] = { 1 , 1 , 1 } ,
[ FRIENDSHIP_EVENT_FAINT_SMALL ] = { - 1 , - 1 , - 1 } ,
[ FRIENDSHIP_EVENT_FAINT_FIELD_PSN ] = { - 5 , - 5 , - 10 } ,
[ FRIENDSHIP_EVENT_FAINT_LARGE ] = { - 5 , - 5 , - 10 } ,
2018-02-11 23:46:50 +01:00
} ;
static const u16 sHMMoves [ ] =
{
MOVE_CUT , MOVE_FLY , MOVE_SURF , MOVE_STRENGTH , MOVE_FLASH ,
2018-12-05 15:31:01 +01:00
MOVE_ROCK_SMASH , MOVE_WATERFALL , MOVE_DIVE , 0xFFFF
2018-02-11 23:46:50 +01:00
} ;
static const struct SpeciesItem sAlteringCaveWildMonHeldItems [ ] =
{
{ SPECIES_NONE , ITEM_NONE } ,
{ SPECIES_MAREEP , ITEM_GANLON_BERRY } ,
2018-12-05 15:31:01 +01:00
{ SPECIES_PINECO , ITEM_APICOT_BERRY } ,
2018-12-07 13:16:19 +01:00
{ SPECIES_HOUNDOUR , ITEM_BIG_MUSHROOM } ,
{ SPECIES_TEDDIURSA , ITEM_PETAYA_BERRY } ,
{ SPECIES_AIPOM , ITEM_BERRY_JUICE } ,
{ SPECIES_SHUCKLE , ITEM_BERRY_JUICE } ,
{ SPECIES_STANTLER , ITEM_PETAYA_BERRY } ,
{ SPECIES_SMEARGLE , ITEM_SALAC_BERRY } ,
2018-02-11 23:46:50 +01:00
} ;
static const struct OamData sOamData_8329F20 =
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_OFF ,
. objMode = ST_OAM_OBJ_NORMAL ,
2018-02-11 23:46:50 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-03-11 08:12:15 +01:00
. shape = SPRITE_SHAPE ( 64 x64 ) ,
2018-02-11 23:46:50 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-03-11 08:12:15 +01:00
. size = SPRITE_SIZE ( 64 x64 ) ,
2018-02-11 23:46:50 +01:00
. tileNum = 0 ,
. priority = 0 ,
. paletteNum = 0 ,
. affineParam = 0
} ;
static const struct SpriteTemplate gUnknown_08329F28 =
{
2018-12-05 15:31:01 +01:00
. tileTag = 0xFFFF ,
. paletteTag = 0xFFFF ,
2018-02-11 23:46:50 +01:00
. oam = & sOamData_8329F20 ,
. anims = gDummySpriteAnimTable ,
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy ,
} ;
2018-02-05 17:39:26 +01:00
// code
2017-09-06 17:19:08 +02:00
void ZeroBoxMonData ( struct BoxPokemon * boxMon )
{
u8 * raw = ( u8 * ) boxMon ;
u32 i ;
for ( i = 0 ; i < sizeof ( struct BoxPokemon ) ; i + + )
raw [ i ] = 0 ;
}
void ZeroMonData ( struct Pokemon * mon )
{
u32 arg ;
ZeroBoxMonData ( & mon - > box ) ;
arg = 0 ;
SetMonData ( mon , MON_DATA_STATUS , & arg ) ;
SetMonData ( mon , MON_DATA_LEVEL , & arg ) ;
SetMonData ( mon , MON_DATA_HP , & arg ) ;
SetMonData ( mon , MON_DATA_MAX_HP , & arg ) ;
SetMonData ( mon , MON_DATA_ATK , & arg ) ;
SetMonData ( mon , MON_DATA_DEF , & arg ) ;
2017-10-24 03:43:26 +02:00
SetMonData ( mon , MON_DATA_SPEED , & arg ) ;
2017-09-06 17:19:08 +02:00
SetMonData ( mon , MON_DATA_SPATK , & arg ) ;
SetMonData ( mon , MON_DATA_SPDEF , & arg ) ;
arg = 255 ;
SetMonData ( mon , MON_DATA_MAIL , & arg ) ;
}
void ZeroPlayerPartyMons ( void )
{
s32 i ;
2018-02-05 17:39:26 +01:00
for ( i = 0 ; i < PARTY_SIZE ; i + + )
2017-09-06 17:19:08 +02:00
ZeroMonData ( & gPlayerParty [ i ] ) ;
}
void ZeroEnemyPartyMons ( void )
{
s32 i ;
2018-02-05 17:39:26 +01:00
for ( i = 0 ; i < PARTY_SIZE ; i + + )
2017-09-06 17:19:08 +02:00
ZeroMonData ( & gEnemyParty [ i ] ) ;
}
void CreateMon ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 hasFixedPersonality , u32 fixedPersonality , u8 otIdType , u32 fixedOtId )
{
u32 arg ;
ZeroMonData ( mon ) ;
CreateBoxMon ( & mon - > box , species , level , fixedIV , hasFixedPersonality , fixedPersonality , otIdType , fixedOtId ) ;
SetMonData ( mon , MON_DATA_LEVEL , & level ) ;
arg = 255 ;
SetMonData ( mon , MON_DATA_MAIL , & arg ) ;
CalculateMonStats ( mon ) ;
}
void CreateBoxMon ( struct BoxPokemon * boxMon , u16 species , u8 level , u8 fixedIV , u8 hasFixedPersonality , u32 fixedPersonality , u8 otIdType , u32 fixedOtId )
{
u8 speciesName [ POKEMON_NAME_LENGTH + 1 ] ;
u32 personality ;
u32 value ;
u16 checksum ;
ZeroBoxMonData ( boxMon ) ;
if ( hasFixedPersonality )
personality = fixedPersonality ;
else
personality = Random32 ( ) ;
SetBoxMonData ( boxMon , MON_DATA_PERSONALITY , & personality ) ;
//Determine original trainer ID
if ( otIdType = = OT_ID_RANDOM_NO_SHINY ) //Pokemon cannot be shiny
{
u32 shinyValue ;
do
{
value = Random32 ( ) ;
shinyValue = HIHALF ( value ) ^ LOHALF ( value ) ^ HIHALF ( personality ) ^ LOHALF ( personality ) ;
2019-07-11 20:16:39 +02:00
} while ( shinyValue < SHINY_ODDS ) ;
2017-09-06 17:19:08 +02:00
}
else if ( otIdType = = OT_ID_PRESET ) //Pokemon has a preset OT ID
{
value = fixedOtId ;
}
else //Player is the OT
{
value = gSaveBlock2Ptr - > playerTrainerId [ 0 ]
| ( gSaveBlock2Ptr - > playerTrainerId [ 1 ] < < 8 )
| ( gSaveBlock2Ptr - > playerTrainerId [ 2 ] < < 16 )
| ( gSaveBlock2Ptr - > playerTrainerId [ 3 ] < < 24 ) ;
}
SetBoxMonData ( boxMon , MON_DATA_OT_ID , & value ) ;
checksum = CalculateBoxMonChecksum ( boxMon ) ;
SetBoxMonData ( boxMon , MON_DATA_CHECKSUM , & checksum ) ;
EncryptBoxMon ( boxMon ) ;
GetSpeciesName ( speciesName , species ) ;
SetBoxMonData ( boxMon , MON_DATA_NICKNAME , speciesName ) ;
SetBoxMonData ( boxMon , MON_DATA_LANGUAGE , & gGameLanguage ) ;
SetBoxMonData ( boxMon , MON_DATA_OT_NAME , gSaveBlock2Ptr - > playerName ) ;
SetBoxMonData ( boxMon , MON_DATA_SPECIES , & species ) ;
SetBoxMonData ( boxMon , MON_DATA_EXP , & gExperienceTables [ gBaseStats [ species ] . growthRate ] [ level ] ) ;
SetBoxMonData ( boxMon , MON_DATA_FRIENDSHIP , & gBaseStats [ species ] . friendship ) ;
2018-12-27 23:30:47 +01:00
value = GetCurrentRegionMapSectionId ( ) ;
2017-09-06 17:19:08 +02:00
SetBoxMonData ( boxMon , MON_DATA_MET_LOCATION , & value ) ;
SetBoxMonData ( boxMon , MON_DATA_MET_LEVEL , & level ) ;
SetBoxMonData ( boxMon , MON_DATA_MET_GAME , & gGameVersion ) ;
value = ITEM_POKE_BALL ;
SetBoxMonData ( boxMon , MON_DATA_POKEBALL , & value ) ;
SetBoxMonData ( boxMon , MON_DATA_OT_GENDER , & gSaveBlock2Ptr - > playerGender ) ;
if ( fixedIV < 32 )
{
SetBoxMonData ( boxMon , MON_DATA_HP_IV , & fixedIV ) ;
SetBoxMonData ( boxMon , MON_DATA_ATK_IV , & fixedIV ) ;
SetBoxMonData ( boxMon , MON_DATA_DEF_IV , & fixedIV ) ;
2017-10-24 03:43:26 +02:00
SetBoxMonData ( boxMon , MON_DATA_SPEED_IV , & fixedIV ) ;
2017-09-06 17:19:08 +02:00
SetBoxMonData ( boxMon , MON_DATA_SPATK_IV , & fixedIV ) ;
SetBoxMonData ( boxMon , MON_DATA_SPDEF_IV , & fixedIV ) ;
}
else
{
u32 iv ;
value = Random ( ) ;
iv = value & 0x1F ;
SetBoxMonData ( boxMon , MON_DATA_HP_IV , & iv ) ;
iv = ( value & 0x3E0 ) > > 5 ;
SetBoxMonData ( boxMon , MON_DATA_ATK_IV , & iv ) ;
iv = ( value & 0x7C00 ) > > 10 ;
SetBoxMonData ( boxMon , MON_DATA_DEF_IV , & iv ) ;
value = Random ( ) ;
iv = value & 0x1F ;
2017-10-24 03:43:26 +02:00
SetBoxMonData ( boxMon , MON_DATA_SPEED_IV , & iv ) ;
2017-09-06 17:19:08 +02:00
iv = ( value & 0x3E0 ) > > 5 ;
SetBoxMonData ( boxMon , MON_DATA_SPATK_IV , & iv ) ;
iv = ( value & 0x7C00 ) > > 10 ;
SetBoxMonData ( boxMon , MON_DATA_SPDEF_IV , & iv ) ;
}
2019-05-14 15:42:55 +02:00
if ( gBaseStats [ species ] . abilities [ 1 ] )
2017-09-06 17:19:08 +02:00
{
value = personality & 1 ;
2019-05-14 15:22:16 +02:00
SetBoxMonData ( boxMon , MON_DATA_ABILITY_NUM , & value ) ;
2017-09-06 17:19:08 +02:00
}
GiveBoxMonInitialMoveset ( boxMon ) ;
}
void CreateMonWithNature ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 nature )
{
u32 personality ;
do
{
personality = Random32 ( ) ;
}
while ( nature ! = GetNatureFromPersonality ( personality ) ) ;
CreateMon ( mon , species , level , fixedIV , 1 , personality , OT_ID_PLAYER_ID , 0 ) ;
}
void CreateMonWithGenderNatureLetter ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 gender , u8 nature , u8 unownLetter )
{
u32 personality ;
if ( ( u8 ) ( unownLetter - 1 ) < 28 )
{
u16 actualLetter ;
do
{
personality = Random32 ( ) ;
actualLetter = ( ( ( ( personality & 0x3000000 ) > > 18 ) | ( ( personality & 0x30000 ) > > 12 ) | ( ( personality & 0x300 ) > > 6 ) | ( personality & 0x3 ) ) % 28 ) ;
}
while ( nature ! = GetNatureFromPersonality ( personality )
| | gender ! = GetGenderFromSpeciesAndPersonality ( species , personality )
| | actualLetter ! = unownLetter - 1 ) ;
}
else
{
do
{
personality = Random32 ( ) ;
}
while ( nature ! = GetNatureFromPersonality ( personality )
| | gender ! = GetGenderFromSpeciesAndPersonality ( species , personality ) ) ;
}
CreateMon ( mon , species , level , fixedIV , 1 , personality , OT_ID_PLAYER_ID , 0 ) ;
}
// This is only used to create Wally's Ralts.
void CreateMaleMon ( struct Pokemon * mon , u16 species , u8 level )
{
u32 personality ;
u32 otId ;
do
{
otId = Random32 ( ) ;
personality = Random32 ( ) ;
}
while ( GetGenderFromSpeciesAndPersonality ( species , personality ) ! = MON_MALE ) ;
CreateMon ( mon , species , level , 32 , 1 , personality , OT_ID_PRESET , otId ) ;
}
void CreateMonWithIVsPersonality ( struct Pokemon * mon , u16 species , u8 level , u32 ivs , u32 personality )
{
CreateMon ( mon , species , level , 0 , 1 , personality , OT_ID_PLAYER_ID , 0 ) ;
SetMonData ( mon , MON_DATA_IVS , & ivs ) ;
CalculateMonStats ( mon ) ;
}
void CreateMonWithIVsOTID ( struct Pokemon * mon , u16 species , u8 level , u8 * ivs , u32 otId )
{
CreateMon ( mon , species , level , 0 , 0 , 0 , OT_ID_PRESET , otId ) ;
SetMonData ( mon , MON_DATA_HP_IV , & ivs [ 0 ] ) ;
SetMonData ( mon , MON_DATA_ATK_IV , & ivs [ 1 ] ) ;
SetMonData ( mon , MON_DATA_DEF_IV , & ivs [ 2 ] ) ;
2017-10-24 03:43:26 +02:00
SetMonData ( mon , MON_DATA_SPEED_IV , & ivs [ 3 ] ) ;
2017-09-06 17:19:08 +02:00
SetMonData ( mon , MON_DATA_SPATK_IV , & ivs [ 4 ] ) ;
SetMonData ( mon , MON_DATA_SPDEF_IV , & ivs [ 5 ] ) ;
CalculateMonStats ( mon ) ;
}
void CreateMonWithEVSpread ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 evSpread )
{
s32 i ;
s32 statCount = 0 ;
u16 evAmount ;
2018-02-09 15:55:12 +01:00
u8 evsBits ;
2017-09-06 17:19:08 +02:00
2019-08-31 05:06:43 +02:00
CreateMon ( mon , species , level , fixedIV , 0 , 0 , OT_ID_PLAYER_ID , 0 ) ;
2017-09-06 17:19:08 +02:00
2018-02-09 15:55:12 +01:00
evsBits = evSpread ;
2017-09-06 17:19:08 +02:00
2018-02-09 15:55:12 +01:00
for ( i = 0 ; i < NUM_STATS ; i + + )
2017-09-06 17:19:08 +02:00
{
2018-02-09 15:55:12 +01:00
if ( evsBits & 1 )
2017-09-06 17:19:08 +02:00
statCount + + ;
2018-02-09 15:55:12 +01:00
evsBits > > = 1 ;
2017-09-06 17:19:08 +02:00
}
2018-02-09 15:55:12 +01:00
evAmount = MAX_TOTAL_EVS / statCount ;
2017-09-06 17:19:08 +02:00
2018-02-09 15:55:12 +01:00
evsBits = 1 ;
2017-09-06 17:19:08 +02:00
2018-02-09 15:55:12 +01:00
for ( i = 0 ; i < NUM_STATS ; i + + )
2017-09-06 17:19:08 +02:00
{
2018-02-09 15:55:12 +01:00
if ( evSpread & evsBits )
2017-09-06 17:19:08 +02:00
SetMonData ( mon , MON_DATA_HP_EV + i , & evAmount ) ;
2018-02-09 15:55:12 +01:00
evsBits < < = 1 ;
2017-09-06 17:19:08 +02:00
}
CalculateMonStats ( mon ) ;
}
2019-01-13 12:12:27 +01:00
void CreateBattleTowerMon ( struct Pokemon * mon , struct BattleTowerPokemon * src )
2017-09-06 17:19:08 +02:00
{
s32 i ;
u8 nickname [ 30 ] ;
u8 language ;
u8 value ;
2019-08-31 05:06:43 +02:00
CreateMon ( mon , src - > species , src - > level , 0 , 1 , src - > personality , OT_ID_PRESET , src - > otId ) ;
2017-09-06 17:19:08 +02:00
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2017-09-06 17:19:08 +02:00
SetMonMoveSlot ( mon , src - > moves [ i ] , i ) ;
SetMonData ( mon , MON_DATA_PP_BONUSES , & src - > ppBonuses ) ;
SetMonData ( mon , MON_DATA_HELD_ITEM , & src - > heldItem ) ;
SetMonData ( mon , MON_DATA_FRIENDSHIP , & src - > friendship ) ;
StringCopy ( nickname , src - > nickname ) ;
if ( nickname [ 0 ] = = EXT_CTRL_CODE_BEGIN & & nickname [ 1 ] = = EXT_CTRL_CODE_JPN )
{
language = LANGUAGE_JAPANESE ;
StripExtCtrlCodes ( nickname ) ;
}
else
2017-09-12 15:36:04 +02:00
{
2017-09-06 17:19:08 +02:00
language = GAME_LANGUAGE ;
2017-09-12 15:36:04 +02:00
}
SetMonData ( mon , MON_DATA_LANGUAGE , & language ) ;
SetMonData ( mon , MON_DATA_NICKNAME , nickname ) ;
SetMonData ( mon , MON_DATA_HP_EV , & src - > hpEV ) ;
SetMonData ( mon , MON_DATA_ATK_EV , & src - > attackEV ) ;
SetMonData ( mon , MON_DATA_DEF_EV , & src - > defenseEV ) ;
2017-10-26 20:47:14 +02:00
SetMonData ( mon , MON_DATA_SPEED_EV , & src - > speedEV ) ;
2017-09-12 15:36:04 +02:00
SetMonData ( mon , MON_DATA_SPATK_EV , & src - > spAttackEV ) ;
SetMonData ( mon , MON_DATA_SPDEF_EV , & src - > spDefenseEV ) ;
2019-05-14 15:22:16 +02:00
value = src - > abilityNum ;
SetMonData ( mon , MON_DATA_ABILITY_NUM , & value ) ;
2017-09-12 15:36:04 +02:00
value = src - > hpIV ;
SetMonData ( mon , MON_DATA_HP_IV , & value ) ;
value = src - > attackIV ;
SetMonData ( mon , MON_DATA_ATK_IV , & value ) ;
value = src - > defenseIV ;
SetMonData ( mon , MON_DATA_DEF_IV , & value ) ;
value = src - > speedIV ;
2017-10-24 03:43:26 +02:00
SetMonData ( mon , MON_DATA_SPEED_IV , & value ) ;
2017-09-12 15:36:04 +02:00
value = src - > spAttackIV ;
SetMonData ( mon , MON_DATA_SPATK_IV , & value ) ;
value = src - > spDefenseIV ;
SetMonData ( mon , MON_DATA_SPDEF_IV , & value ) ;
MonRestorePP ( mon ) ;
CalculateMonStats ( mon ) ;
}
2019-01-13 12:12:27 +01:00
void CreateBattleTowerMon2 ( struct Pokemon * mon , struct BattleTowerPokemon * src , bool8 lvl50 )
2017-09-12 15:36:04 +02:00
{
s32 i ;
u8 nickname [ 30 ] ;
u8 level ;
u8 language ;
u8 value ;
2018-08-25 19:59:47 +02:00
if ( gSaveBlock2Ptr - > frontier . lvlMode ! = FRONTIER_LVL_50 )
2018-08-26 15:27:06 +02:00
level = GetFrontierEnemyMonLevel ( gSaveBlock2Ptr - > frontier . lvlMode ) ;
2017-09-12 15:36:04 +02:00
else if ( lvl50 )
level = 50 ;
else
level = src - > level ;
2019-08-31 05:06:43 +02:00
CreateMon ( mon , src - > species , level , 0 , 1 , src - > personality , OT_ID_PRESET , src - > otId ) ;
2017-09-12 15:36:04 +02:00
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2017-09-12 15:36:04 +02:00
SetMonMoveSlot ( mon , src - > moves [ i ] , i ) ;
SetMonData ( mon , MON_DATA_PP_BONUSES , & src - > ppBonuses ) ;
SetMonData ( mon , MON_DATA_HELD_ITEM , & src - > heldItem ) ;
SetMonData ( mon , MON_DATA_FRIENDSHIP , & src - > friendship ) ;
StringCopy ( nickname , src - > nickname ) ;
if ( nickname [ 0 ] = = EXT_CTRL_CODE_BEGIN & & nickname [ 1 ] = = EXT_CTRL_CODE_JPN )
{
language = LANGUAGE_JAPANESE ;
StripExtCtrlCodes ( nickname ) ;
}
else
{
language = GAME_LANGUAGE ;
}
2017-09-06 17:19:08 +02:00
SetMonData ( mon , MON_DATA_LANGUAGE , & language ) ;
SetMonData ( mon , MON_DATA_NICKNAME , nickname ) ;
SetMonData ( mon , MON_DATA_HP_EV , & src - > hpEV ) ;
SetMonData ( mon , MON_DATA_ATK_EV , & src - > attackEV ) ;
SetMonData ( mon , MON_DATA_DEF_EV , & src - > defenseEV ) ;
2017-10-26 20:47:14 +02:00
SetMonData ( mon , MON_DATA_SPEED_EV , & src - > speedEV ) ;
2017-09-06 17:19:08 +02:00
SetMonData ( mon , MON_DATA_SPATK_EV , & src - > spAttackEV ) ;
SetMonData ( mon , MON_DATA_SPDEF_EV , & src - > spDefenseEV ) ;
2019-05-14 15:22:16 +02:00
value = src - > abilityNum ;
SetMonData ( mon , MON_DATA_ABILITY_NUM , & value ) ;
2017-09-06 17:19:08 +02:00
value = src - > hpIV ;
SetMonData ( mon , MON_DATA_HP_IV , & value ) ;
value = src - > attackIV ;
SetMonData ( mon , MON_DATA_ATK_IV , & value ) ;
value = src - > defenseIV ;
SetMonData ( mon , MON_DATA_DEF_IV , & value ) ;
value = src - > speedIV ;
2017-10-24 03:43:26 +02:00
SetMonData ( mon , MON_DATA_SPEED_IV , & value ) ;
2017-09-06 17:19:08 +02:00
value = src - > spAttackIV ;
SetMonData ( mon , MON_DATA_SPATK_IV , & value ) ;
value = src - > spDefenseIV ;
SetMonData ( mon , MON_DATA_SPDEF_IV , & value ) ;
2017-09-06 21:48:30 +02:00
MonRestorePP ( mon ) ;
2017-09-06 17:19:08 +02:00
CalculateMonStats ( mon ) ;
}
2018-02-09 15:55:12 +01:00
2018-10-13 20:38:46 +02:00
void CreateApprenticeMon ( struct Pokemon * mon , const struct Apprentice * src , u8 monId )
2018-02-09 15:55:12 +01:00
{
s32 i ;
u16 evAmount ;
u8 language ;
2018-10-14 14:35:51 +02:00
u32 otId = gApprentices [ src - > id ] . otId ;
u32 personality = ( ( gApprentices [ src - > id ] . otId > > 8 ) | ( ( gApprentices [ src - > id ] . otId & 0xFF ) < < 8 ) )
2018-10-24 23:14:45 +02:00
+ src - > party [ monId ] . species + src - > number ;
2018-02-09 15:55:12 +01:00
CreateMon ( mon ,
2018-10-24 23:14:45 +02:00
src - > party [ monId ] . species ,
2018-10-14 14:35:51 +02:00
GetFrontierEnemyMonLevel ( src - > lvlMode - 1 ) ,
2018-02-09 15:55:12 +01:00
0x1F ,
TRUE ,
personality ,
2019-08-31 05:06:43 +02:00
OT_ID_PRESET ,
2018-02-09 15:55:12 +01:00
otId ) ;
2018-10-24 23:14:45 +02:00
SetMonData ( mon , MON_DATA_HELD_ITEM , & src - > party [ monId ] . item ) ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-10-24 23:14:45 +02:00
SetMonMoveSlot ( mon , src - > party [ monId ] . moves [ i ] , i ) ;
2018-02-09 15:55:12 +01:00
evAmount = MAX_TOTAL_EVS / NUM_STATS ;
for ( i = 0 ; i < NUM_STATS ; i + + )
SetMonData ( mon , MON_DATA_HP_EV + i , & evAmount ) ;
language = src - > language ;
SetMonData ( mon , MON_DATA_LANGUAGE , & language ) ;
2018-10-14 14:35:51 +02:00
SetMonData ( mon , MON_DATA_OT_NAME , GetApprenticeNameInLanguage ( src - > id , language ) ) ;
2018-02-09 15:55:12 +01:00
CalculateMonStats ( mon ) ;
}
2018-11-11 16:44:27 +01:00
void CreateMonWithEVSpreadNatureOTID ( struct Pokemon * mon , u16 species , u8 level , u8 nature , u8 fixedIV , u8 evSpread , u32 otId )
2018-02-09 15:55:12 +01:00
{
s32 i ;
s32 statCount = 0 ;
u8 evsBits ;
u16 evAmount ;
// i is reused as personality value
do
{
i = Random32 ( ) ;
} while ( nature ! = GetNatureFromPersonality ( i ) ) ;
2019-08-31 05:06:43 +02:00
CreateMon ( mon , species , level , fixedIV , TRUE , i , OT_ID_PRESET , otId ) ;
2018-02-09 15:55:12 +01:00
evsBits = evSpread ;
for ( i = 0 ; i < NUM_STATS ; i + + )
{
if ( evsBits & 1 )
statCount + + ;
evsBits > > = 1 ;
}
evAmount = MAX_TOTAL_EVS / statCount ;
evsBits = 1 ;
for ( i = 0 ; i < NUM_STATS ; i + + )
{
if ( evSpread & evsBits )
SetMonData ( mon , MON_DATA_HP_EV + i , & evAmount ) ;
evsBits < < = 1 ;
}
CalculateMonStats ( mon ) ;
}
2018-12-10 21:49:33 +01:00
void sub_80686FC ( struct Pokemon * mon , struct BattleTowerPokemon * dest )
2018-02-09 15:55:12 +01:00
{
s32 i ;
u16 heldItem ;
dest - > species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
heldItem = GetMonData ( mon , MON_DATA_HELD_ITEM , NULL ) ;
if ( heldItem = = ITEM_ENIGMA_BERRY )
heldItem = 0 ;
dest - > heldItem = heldItem ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-09 15:55:12 +01:00
dest - > moves [ i ] = GetMonData ( mon , MON_DATA_MOVE1 + i , NULL ) ;
dest - > level = GetMonData ( mon , MON_DATA_LEVEL , NULL ) ;
dest - > ppBonuses = GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) ;
dest - > otId = GetMonData ( mon , MON_DATA_OT_ID , NULL ) ;
dest - > hpEV = GetMonData ( mon , MON_DATA_HP_EV , NULL ) ;
dest - > attackEV = GetMonData ( mon , MON_DATA_ATK_EV , NULL ) ;
dest - > defenseEV = GetMonData ( mon , MON_DATA_DEF_EV , NULL ) ;
dest - > speedEV = GetMonData ( mon , MON_DATA_SPEED_EV , NULL ) ;
dest - > spAttackEV = GetMonData ( mon , MON_DATA_SPATK_EV , NULL ) ;
dest - > spDefenseEV = GetMonData ( mon , MON_DATA_SPDEF_EV , NULL ) ;
dest - > friendship = GetMonData ( mon , MON_DATA_FRIENDSHIP , NULL ) ;
dest - > hpIV = GetMonData ( mon , MON_DATA_HP_IV , NULL ) ;
dest - > attackIV = GetMonData ( mon , MON_DATA_ATK_IV , NULL ) ;
dest - > defenseIV = GetMonData ( mon , MON_DATA_DEF_IV , NULL ) ;
dest - > speedIV = GetMonData ( mon , MON_DATA_SPEED_IV , NULL ) ;
dest - > spAttackIV = GetMonData ( mon , MON_DATA_SPATK_IV , NULL ) ;
dest - > spDefenseIV = GetMonData ( mon , MON_DATA_SPDEF_IV , NULL ) ;
2019-05-14 15:22:16 +02:00
dest - > abilityNum = GetMonData ( mon , MON_DATA_ABILITY_NUM , NULL ) ;
2018-02-09 15:55:12 +01:00
dest - > personality = GetMonData ( mon , MON_DATA_PERSONALITY , NULL ) ;
GetMonData ( mon , MON_DATA_NICKNAME , dest - > nickname ) ;
}
void CreateObedientMon ( struct Pokemon * mon , u16 species , u8 level , u8 fixedIV , u8 hasFixedPersonality , u32 fixedPersonality , u8 otIdType , u32 fixedOtId )
{
bool32 obedient = TRUE ;
CreateMon ( mon , species , level , fixedIV , hasFixedPersonality , fixedPersonality , otIdType , fixedOtId ) ;
SetMonData ( mon , MON_DATA_OBEDIENCE , & obedient ) ;
}
bool8 sub_80688F8 ( u8 caseId , u8 battlerId )
{
switch ( caseId )
{
case 0 :
default :
return FALSE ;
case 1 :
if ( ! ( gBattleTypeFlags & BATTLE_TYPE_MULTI ) )
return FALSE ;
if ( ! gMain . inBattle )
return FALSE ;
2018-07-22 12:49:49 +02:00
if ( gLinkPlayers [ GetMultiplayerId ( ) ] . id = = battlerId )
2018-02-09 15:55:12 +01:00
return FALSE ;
break ;
case 2 :
break ;
case 3 :
if ( ! ( gBattleTypeFlags & BATTLE_TYPE_MULTI ) )
return FALSE ;
if ( ! gMain . inBattle )
return FALSE ;
if ( battlerId = = 1 | | battlerId = = 4 | | battlerId = = 5 )
return TRUE ;
return FALSE ;
case 4 :
break ;
case 5 :
if ( gBattleTypeFlags & BATTLE_TYPE_LINK )
{
if ( ! gMain . inBattle )
return FALSE ;
if ( gBattleTypeFlags & BATTLE_TYPE_MULTI )
{
2018-07-22 12:49:49 +02:00
if ( gLinkPlayers [ GetMultiplayerId ( ) ] . id = = battlerId )
2018-02-09 15:55:12 +01:00
return FALSE ;
}
else
{
if ( GetBattlerSide ( battlerId ) = = B_SIDE_PLAYER )
return FALSE ;
}
}
else
{
if ( ! gMain . inBattle )
return FALSE ;
if ( GetBattlerSide ( battlerId ) = = B_SIDE_PLAYER )
return FALSE ;
}
break ;
}
return TRUE ;
}
2019-07-29 21:44:03 +02:00
static u16 GetDeoxysStat ( struct Pokemon * mon , s32 statId )
2018-02-09 15:55:12 +01:00
{
s32 ivVal , evVal ;
2019-07-29 21:44:03 +02:00
u16 statValue = 0 ;
u8 nature ;
2018-02-09 15:55:12 +01:00
2019-07-29 21:44:03 +02:00
if ( gBattleTypeFlags & BATTLE_TYPE_20 | | GetMonData ( mon , MON_DATA_SPECIES , NULL ) ! = SPECIES_DEOXYS )
2018-02-09 15:55:12 +01:00
return 0 ;
ivVal = GetMonData ( mon , MON_DATA_HP_IV + statId , NULL ) ;
evVal = GetMonData ( mon , MON_DATA_HP_EV + statId , NULL ) ;
2019-07-29 21:44:03 +02:00
statValue = ( ( sDeoxysBaseStats [ statId ] * 2 + ivVal + evVal / 4 ) * mon - > level ) / 100 + 5 ;
2018-02-09 15:55:12 +01:00
nature = GetNature ( mon ) ;
2019-07-29 21:44:03 +02:00
statValue = ModifyStatByNature ( nature , statValue , ( u8 ) statId ) ;
2018-02-09 15:55:12 +01:00
return statValue ;
}
void SetDeoxysStats ( void )
{
s32 i , value ;
for ( i = 0 ; i < PARTY_SIZE ; i + + )
{
struct Pokemon * mon = & gPlayerParty [ i ] ;
if ( GetMonData ( mon , MON_DATA_SPECIES , NULL ) ! = SPECIES_DEOXYS )
continue ;
value = GetMonData ( mon , MON_DATA_ATK , NULL ) ;
SetMonData ( mon , MON_DATA_ATK , & value ) ;
value = GetMonData ( mon , MON_DATA_DEF , NULL ) ;
SetMonData ( mon , MON_DATA_DEF , & value ) ;
value = GetMonData ( mon , MON_DATA_SPEED , NULL ) ;
SetMonData ( mon , MON_DATA_SPEED , & value ) ;
value = GetMonData ( mon , MON_DATA_SPATK , NULL ) ;
SetMonData ( mon , MON_DATA_SPATK , & value ) ;
value = GetMonData ( mon , MON_DATA_SPDEF , NULL ) ;
SetMonData ( mon , MON_DATA_SPDEF , & value ) ;
}
}
2020-06-03 21:28:29 +02:00
u16 GetUnionRoomTrainerPic ( void )
2018-02-09 15:55:12 +01:00
{
u8 linkId ;
u32 arrId ;
if ( gBattleTypeFlags & BATTLE_TYPE_x2000000 )
linkId = gUnknown_0203C7B4 ^ 1 ;
else
linkId = GetMultiplayerId ( ) ^ 1 ;
arrId = gLinkPlayers [ linkId ] . trainerId & 7 ;
arrId | = gLinkPlayers [ linkId ] . gender < < 3 ;
2019-05-16 01:56:43 +02:00
return FacilityClassToPicIndex ( gLinkPlayerFacilityClasses [ arrId ] ) ;
2018-02-09 15:55:12 +01:00
}
2020-06-03 21:28:29 +02:00
u16 GetUnionRoomTrainerClass ( void )
2018-02-09 15:55:12 +01:00
{
u8 linkId ;
u32 arrId ;
if ( gBattleTypeFlags & BATTLE_TYPE_x2000000 )
linkId = gUnknown_0203C7B4 ^ 1 ;
else
linkId = GetMultiplayerId ( ) ^ 1 ;
arrId = gLinkPlayers [ linkId ] . trainerId & 7 ;
arrId | = gLinkPlayers [ linkId ] . gender < < 3 ;
2019-05-16 01:56:43 +02:00
return gFacilityClassToTrainerClass [ gLinkPlayerFacilityClasses [ arrId ] ] ;
2018-02-09 15:55:12 +01:00
}
void CreateObedientEnemyMon ( void )
{
s32 species = gSpecialVar_0x8004 ;
s32 level = gSpecialVar_0x8005 ;
s32 itemId = gSpecialVar_0x8006 ;
ZeroEnemyPartyMons ( ) ;
CreateObedientMon ( & gEnemyParty [ 0 ] , species , level , 32 , 0 , 0 , 0 , 0 ) ;
if ( itemId )
{
u8 heldItem [ 2 ] ;
heldItem [ 0 ] = itemId ;
heldItem [ 1 ] = itemId > > 8 ;
SetMonData ( & gEnemyParty [ 0 ] , MON_DATA_HELD_ITEM , heldItem ) ;
}
}
2018-02-11 17:35:01 +01:00
static u16 CalculateBoxMonChecksum ( struct BoxPokemon * boxMon )
2018-02-09 15:55:12 +01:00
{
u16 checksum = 0 ;
union PokemonSubstruct * substruct0 = GetSubstruct ( boxMon , boxMon - > personality , 0 ) ;
union PokemonSubstruct * substruct1 = GetSubstruct ( boxMon , boxMon - > personality , 1 ) ;
union PokemonSubstruct * substruct2 = GetSubstruct ( boxMon , boxMon - > personality , 2 ) ;
union PokemonSubstruct * substruct3 = GetSubstruct ( boxMon , boxMon - > personality , 3 ) ;
s32 i ;
for ( i = 0 ; i < 6 ; i + + )
checksum + = substruct0 - > raw [ i ] ;
for ( i = 0 ; i < 6 ; i + + )
checksum + = substruct1 - > raw [ i ] ;
for ( i = 0 ; i < 6 ; i + + )
checksum + = substruct2 - > raw [ i ] ;
for ( i = 0 ; i < 6 ; i + + )
checksum + = substruct3 - > raw [ i ] ;
return checksum ;
}
# define CALC_STAT(base, iv, ev, statIndex, field) \
{ \
u8 baseStat = gBaseStats [ species ] . base ; \
s32 n = ( ( ( 2 * baseStat + iv + ev / 4 ) * level ) / 100 ) + 5 ; \
u8 nature = GetNature ( mon ) ; \
n = ModifyStatByNature ( nature , n , statIndex ) ; \
SetMonData ( mon , field , & n ) ; \
}
void CalculateMonStats ( struct Pokemon * mon )
{
s32 oldMaxHP = GetMonData ( mon , MON_DATA_MAX_HP , NULL ) ;
s32 currentHP = GetMonData ( mon , MON_DATA_HP , NULL ) ;
s32 hpIV = GetMonData ( mon , MON_DATA_HP_IV , NULL ) ;
s32 hpEV = GetMonData ( mon , MON_DATA_HP_EV , NULL ) ;
s32 attackIV = GetMonData ( mon , MON_DATA_ATK_IV , NULL ) ;
s32 attackEV = GetMonData ( mon , MON_DATA_ATK_EV , NULL ) ;
s32 defenseIV = GetMonData ( mon , MON_DATA_DEF_IV , NULL ) ;
s32 defenseEV = GetMonData ( mon , MON_DATA_DEF_EV , NULL ) ;
s32 speedIV = GetMonData ( mon , MON_DATA_SPEED_IV , NULL ) ;
s32 speedEV = GetMonData ( mon , MON_DATA_SPEED_EV , NULL ) ;
s32 spAttackIV = GetMonData ( mon , MON_DATA_SPATK_IV , NULL ) ;
s32 spAttackEV = GetMonData ( mon , MON_DATA_SPATK_EV , NULL ) ;
s32 spDefenseIV = GetMonData ( mon , MON_DATA_SPDEF_IV , NULL ) ;
s32 spDefenseEV = GetMonData ( mon , MON_DATA_SPDEF_EV , NULL ) ;
u16 species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
s32 level = GetLevelFromMonExp ( mon ) ;
s32 newMaxHP ;
SetMonData ( mon , MON_DATA_LEVEL , & level ) ;
if ( species = = SPECIES_SHEDINJA )
{
newMaxHP = 1 ;
}
else
{
s32 n = 2 * gBaseStats [ species ] . baseHP + hpIV ;
newMaxHP = ( ( ( n + hpEV / 4 ) * level ) / 100 ) + level + 10 ;
}
gBattleScripting . field_23 = newMaxHP - oldMaxHP ;
if ( gBattleScripting . field_23 = = 0 )
gBattleScripting . field_23 = 1 ;
SetMonData ( mon , MON_DATA_MAX_HP , & newMaxHP ) ;
2018-07-01 11:15:42 +02:00
CALC_STAT ( baseAttack , attackIV , attackEV , STAT_ATK , MON_DATA_ATK )
CALC_STAT ( baseDefense , defenseIV , defenseEV , STAT_DEF , MON_DATA_DEF )
CALC_STAT ( baseSpeed , speedIV , speedEV , STAT_SPEED , MON_DATA_SPEED )
CALC_STAT ( baseSpAttack , spAttackIV , spAttackEV , STAT_SPATK , MON_DATA_SPATK )
CALC_STAT ( baseSpDefense , spDefenseIV , spDefenseEV , STAT_SPDEF , MON_DATA_SPDEF )
2018-02-09 15:55:12 +01:00
if ( species = = SPECIES_SHEDINJA )
{
if ( currentHP ! = 0 | | oldMaxHP = = 0 )
currentHP = 1 ;
else
return ;
}
else
{
if ( currentHP = = 0 & & oldMaxHP = = 0 )
currentHP = newMaxHP ;
else if ( currentHP ! = 0 )
currentHP + = newMaxHP - oldMaxHP ;
else
return ;
}
SetMonData ( mon , MON_DATA_HP , & currentHP ) ;
}
void BoxMonToMon ( const struct BoxPokemon * src , struct Pokemon * dest )
{
u32 value = 0 ;
dest - > box = * src ;
SetMonData ( dest , MON_DATA_STATUS , & value ) ;
SetMonData ( dest , MON_DATA_HP , & value ) ;
SetMonData ( dest , MON_DATA_MAX_HP , & value ) ;
value = 255 ;
SetMonData ( dest , MON_DATA_MAIL , & value ) ;
CalculateMonStats ( dest ) ;
}
u8 GetLevelFromMonExp ( struct Pokemon * mon )
{
u16 species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
u32 exp = GetMonData ( mon , MON_DATA_EXP , NULL ) ;
s32 level = 1 ;
2018-10-17 04:47:08 +02:00
while ( level < = MAX_LEVEL & & gExperienceTables [ gBaseStats [ species ] . growthRate ] [ level ] < = exp )
2018-02-09 15:55:12 +01:00
level + + ;
return level - 1 ;
}
u8 GetLevelFromBoxMonExp ( struct BoxPokemon * boxMon )
{
u16 species = GetBoxMonData ( boxMon , MON_DATA_SPECIES , NULL ) ;
u32 exp = GetBoxMonData ( boxMon , MON_DATA_EXP , NULL ) ;
s32 level = 1 ;
2018-10-17 04:47:08 +02:00
while ( level < = MAX_LEVEL & & gExperienceTables [ gBaseStats [ species ] . growthRate ] [ level ] < = exp )
2018-02-09 15:55:12 +01:00
level + + ;
return level - 1 ;
}
u16 GiveMoveToMon ( struct Pokemon * mon , u16 move )
{
return GiveMoveToBoxMon ( & mon - > box , move ) ;
}
2019-10-18 01:22:03 +02:00
static u16 GiveMoveToBoxMon ( struct BoxPokemon * boxMon , u16 move )
2018-02-09 15:55:12 +01:00
{
s32 i ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-09 15:55:12 +01:00
{
u16 existingMove = GetBoxMonData ( boxMon , MON_DATA_MOVE1 + i , NULL ) ;
2019-10-18 01:22:03 +02:00
if ( existingMove = = MOVE_NONE )
2018-02-09 15:55:12 +01:00
{
SetBoxMonData ( boxMon , MON_DATA_MOVE1 + i , & move ) ;
SetBoxMonData ( boxMon , MON_DATA_PP1 + i , & gBattleMoves [ move ] . pp ) ;
return move ;
}
if ( existingMove = = move )
2019-10-18 01:22:03 +02:00
return MON_ALREADY_KNOWS_MOVE ;
2018-02-09 15:55:12 +01:00
}
2019-10-18 01:22:03 +02:00
return MON_HAS_MAX_MOVES ;
2018-02-09 15:55:12 +01:00
}
u16 GiveMoveToBattleMon ( struct BattlePokemon * mon , u16 move )
{
s32 i ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-09 15:55:12 +01:00
{
if ( ! mon - > moves [ i ] )
{
mon - > moves [ i ] = move ;
mon - > pp [ i ] = gBattleMoves [ move ] . pp ;
return move ;
}
}
2018-12-05 15:31:01 +01:00
return 0xFFFF ;
2018-02-09 15:55:12 +01:00
}
void SetMonMoveSlot ( struct Pokemon * mon , u16 move , u8 slot )
{
SetMonData ( mon , MON_DATA_MOVE1 + slot , & move ) ;
SetMonData ( mon , MON_DATA_PP1 + slot , & gBattleMoves [ move ] . pp ) ;
}
void SetBattleMonMoveSlot ( struct BattlePokemon * mon , u16 move , u8 slot )
{
mon - > moves [ slot ] = move ;
mon - > pp [ slot ] = gBattleMoves [ move ] . pp ;
}
void GiveMonInitialMoveset ( struct Pokemon * mon )
{
GiveBoxMonInitialMoveset ( & mon - > box ) ;
}
void GiveBoxMonInitialMoveset ( struct BoxPokemon * boxMon )
{
u16 species = GetBoxMonData ( boxMon , MON_DATA_SPECIES , NULL ) ;
s32 level = GetLevelFromBoxMonExp ( boxMon ) ;
s32 i ;
2018-08-12 00:42:25 +02:00
for ( i = 0 ; gLevelUpLearnsets [ species ] [ i ] ! = LEVEL_UP_END ; i + + )
2018-02-09 15:55:12 +01:00
{
u16 moveLevel ;
u16 move ;
2019-11-15 00:56:18 +01:00
moveLevel = ( gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_LV ) ;
2018-02-09 15:55:12 +01:00
if ( moveLevel > ( level < < 9 ) )
break ;
2019-11-15 00:56:18 +01:00
move = ( gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_ID ) ;
2018-02-09 15:55:12 +01:00
2019-10-18 01:22:03 +02:00
if ( GiveMoveToBoxMon ( boxMon , move ) = = MON_HAS_MAX_MOVES )
2018-02-09 15:55:12 +01:00
DeleteFirstMoveAndGiveMoveToBoxMon ( boxMon , move ) ;
}
}
u16 MonTryLearningNewMove ( struct Pokemon * mon , bool8 firstMove )
{
u32 retVal = 0 ;
u16 species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
u8 level = GetMonData ( mon , MON_DATA_LEVEL , NULL ) ;
// since you can learn more than one move per level
// the game needs to know whether you decided to
// learn it or keep the old set to avoid asking
// you to learn the same move over and over again
if ( firstMove )
{
sLearningMoveTableID = 0 ;
2019-11-15 00:56:18 +01:00
while ( ( gLevelUpLearnsets [ species ] [ sLearningMoveTableID ] & LEVEL_UP_MOVE_LV ) ! = ( level < < 9 ) )
2018-02-09 15:55:12 +01:00
{
sLearningMoveTableID + + ;
2018-08-12 00:42:25 +02:00
if ( gLevelUpLearnsets [ species ] [ sLearningMoveTableID ] = = LEVEL_UP_END )
2018-02-09 15:55:12 +01:00
return 0 ;
}
}
2019-11-15 00:56:18 +01:00
if ( ( gLevelUpLearnsets [ species ] [ sLearningMoveTableID ] & LEVEL_UP_MOVE_LV ) = = ( level < < 9 ) )
2018-02-09 15:55:12 +01:00
{
2019-11-15 00:56:18 +01:00
gMoveToLearn = ( gLevelUpLearnsets [ species ] [ sLearningMoveTableID ] & LEVEL_UP_MOVE_ID ) ;
2018-02-09 15:55:12 +01:00
sLearningMoveTableID + + ;
retVal = GiveMoveToMon ( mon , gMoveToLearn ) ;
}
return retVal ;
}
void DeleteFirstMoveAndGiveMoveToMon ( struct Pokemon * mon , u16 move )
{
s32 i ;
2019-09-08 17:53:48 +02:00
u16 moves [ MAX_MON_MOVES ] ;
u8 pp [ MAX_MON_MOVES ] ;
2018-02-09 15:55:12 +01:00
u8 ppBonuses ;
2019-09-08 17:53:48 +02:00
for ( i = 0 ; i < MAX_MON_MOVES - 1 ; i + + )
2018-02-09 15:55:12 +01:00
{
moves [ i ] = GetMonData ( mon , MON_DATA_MOVE2 + i , NULL ) ;
pp [ i ] = GetMonData ( mon , MON_DATA_PP2 + i , NULL ) ;
}
ppBonuses = GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) ;
ppBonuses > > = 2 ;
moves [ 3 ] = move ;
pp [ 3 ] = gBattleMoves [ move ] . pp ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-09 15:55:12 +01:00
{
SetMonData ( mon , MON_DATA_MOVE1 + i , & moves [ i ] ) ;
SetMonData ( mon , MON_DATA_PP1 + i , & pp [ i ] ) ;
}
SetMonData ( mon , MON_DATA_PP_BONUSES , & ppBonuses ) ;
}
void DeleteFirstMoveAndGiveMoveToBoxMon ( struct BoxPokemon * boxMon , u16 move )
{
s32 i ;
2019-09-08 17:53:48 +02:00
u16 moves [ MAX_MON_MOVES ] ;
u8 pp [ MAX_MON_MOVES ] ;
2018-02-09 15:55:12 +01:00
u8 ppBonuses ;
2019-09-08 17:53:48 +02:00
for ( i = 0 ; i < MAX_MON_MOVES - 1 ; i + + )
2018-02-09 15:55:12 +01:00
{
moves [ i ] = GetBoxMonData ( boxMon , MON_DATA_MOVE2 + i , NULL ) ;
pp [ i ] = GetBoxMonData ( boxMon , MON_DATA_PP2 + i , NULL ) ;
}
ppBonuses = GetBoxMonData ( boxMon , MON_DATA_PP_BONUSES , NULL ) ;
ppBonuses > > = 2 ;
moves [ 3 ] = move ;
pp [ 3 ] = gBattleMoves [ move ] . pp ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-09 15:55:12 +01:00
{
SetBoxMonData ( boxMon , MON_DATA_MOVE1 + i , & moves [ i ] ) ;
SetBoxMonData ( boxMon , MON_DATA_PP1 + i , & pp [ i ] ) ;
}
SetBoxMonData ( boxMon , MON_DATA_PP_BONUSES , & ppBonuses ) ;
}
2018-02-09 18:46:00 +01:00
# define APPLY_STAT_MOD(var, mon, stat, statIndex) \
{ \
( var ) = ( stat ) * ( gStatStageRatios ) [ ( mon ) - > statStages [ ( statIndex ) ] ] [ 0 ] ; \
( var ) / = ( gStatStageRatios ) [ ( mon ) - > statStages [ ( statIndex ) ] ] [ 1 ] ; \
}
2018-02-27 18:13:28 +01:00
s32 CalculateBaseDamage ( struct BattlePokemon * attacker , struct BattlePokemon * defender , u32 move , u16 sideStatus , u16 powerOverride , u8 typeOverride , u8 battlerIdAtk , u8 battlerIdDef )
2018-02-09 18:46:00 +01:00
{
u32 i ;
s32 damage = 0 ;
s32 damageHelper ;
u8 type ;
u16 attack , defense ;
u16 spAttack , spDefense ;
u8 defenderHoldEffect ;
u8 defenderHoldEffectParam ;
u8 attackerHoldEffect ;
u8 attackerHoldEffectParam ;
if ( ! powerOverride )
gBattleMovePower = gBattleMoves [ move ] . power ;
else
gBattleMovePower = powerOverride ;
if ( ! typeOverride )
type = gBattleMoves [ move ] . type ;
else
type = typeOverride & 0x3F ;
attack = attacker - > attack ;
defense = defender - > defense ;
spAttack = attacker - > spAttack ;
spDefense = defender - > spDefense ;
if ( attacker - > item = = ITEM_ENIGMA_BERRY )
{
2018-02-27 18:13:28 +01:00
attackerHoldEffect = gEnigmaBerries [ battlerIdAtk ] . holdEffect ;
attackerHoldEffectParam = gEnigmaBerries [ battlerIdAtk ] . holdEffectParam ;
2018-02-09 18:46:00 +01:00
}
else
{
attackerHoldEffect = ItemId_GetHoldEffect ( attacker - > item ) ;
attackerHoldEffectParam = ItemId_GetHoldEffectParam ( attacker - > item ) ;
}
if ( defender - > item = = ITEM_ENIGMA_BERRY )
{
2018-02-27 18:13:28 +01:00
defenderHoldEffect = gEnigmaBerries [ battlerIdDef ] . holdEffect ;
defenderHoldEffectParam = gEnigmaBerries [ battlerIdDef ] . holdEffectParam ;
2018-02-09 18:46:00 +01:00
}
else
{
defenderHoldEffect = ItemId_GetHoldEffect ( defender - > item ) ;
defenderHoldEffectParam = ItemId_GetHoldEffectParam ( defender - > item ) ;
}
if ( attacker - > ability = = ABILITY_HUGE_POWER | | attacker - > ability = = ABILITY_PURE_POWER )
attack * = 2 ;
2018-02-27 18:13:28 +01:00
if ( ShouldGetStatBadgeBoost ( FLAG_BADGE01_GET , battlerIdAtk ) )
2018-02-09 18:46:00 +01:00
attack = ( 110 * attack ) / 100 ;
2018-02-27 18:13:28 +01:00
if ( ShouldGetStatBadgeBoost ( FLAG_BADGE05_GET , battlerIdDef ) )
2018-02-09 18:46:00 +01:00
defense = ( 110 * defense ) / 100 ;
2018-02-27 18:13:28 +01:00
if ( ShouldGetStatBadgeBoost ( FLAG_BADGE07_GET , battlerIdAtk ) )
2018-02-09 18:46:00 +01:00
spAttack = ( 110 * spAttack ) / 100 ;
2018-02-27 18:13:28 +01:00
if ( ShouldGetStatBadgeBoost ( FLAG_BADGE07_GET , battlerIdDef ) )
2018-02-09 18:46:00 +01:00
spDefense = ( 110 * spDefense ) / 100 ;
2018-02-11 23:46:50 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( sHoldEffectToType ) ; i + + )
2018-02-09 18:46:00 +01:00
{
2018-02-11 23:46:50 +01:00
if ( attackerHoldEffect = = sHoldEffectToType [ i ] [ 0 ]
& & type = = sHoldEffectToType [ i ] [ 1 ] )
2018-02-09 18:46:00 +01:00
{
2018-07-16 22:00:27 +02:00
if ( IS_TYPE_PHYSICAL ( type ) )
2018-02-09 18:46:00 +01:00
attack = ( attack * ( attackerHoldEffectParam + 100 ) ) / 100 ;
else
spAttack = ( spAttack * ( attackerHoldEffectParam + 100 ) ) / 100 ;
break ;
}
}
if ( attackerHoldEffect = = HOLD_EFFECT_CHOICE_BAND )
attack = ( 150 * attack ) / 100 ;
if ( attackerHoldEffect = = HOLD_EFFECT_SOUL_DEW & & ! ( gBattleTypeFlags & ( BATTLE_TYPE_FRONTIER ) ) & & ( attacker - > species = = SPECIES_LATIAS | | attacker - > species = = SPECIES_LATIOS ) )
spAttack = ( 150 * spAttack ) / 100 ;
if ( defenderHoldEffect = = HOLD_EFFECT_SOUL_DEW & & ! ( gBattleTypeFlags & ( BATTLE_TYPE_FRONTIER ) ) & & ( defender - > species = = SPECIES_LATIAS | | defender - > species = = SPECIES_LATIOS ) )
spDefense = ( 150 * spDefense ) / 100 ;
if ( attackerHoldEffect = = HOLD_EFFECT_DEEP_SEA_TOOTH & & attacker - > species = = SPECIES_CLAMPERL )
spAttack * = 2 ;
if ( defenderHoldEffect = = HOLD_EFFECT_DEEP_SEA_SCALE & & defender - > species = = SPECIES_CLAMPERL )
spDefense * = 2 ;
if ( attackerHoldEffect = = HOLD_EFFECT_LIGHT_BALL & & attacker - > species = = SPECIES_PIKACHU )
spAttack * = 2 ;
if ( defenderHoldEffect = = HOLD_EFFECT_METAL_POWDER & & defender - > species = = SPECIES_DITTO )
defense * = 2 ;
if ( attackerHoldEffect = = HOLD_EFFECT_THICK_CLUB & & ( attacker - > species = = SPECIES_CUBONE | | attacker - > species = = SPECIES_MAROWAK ) )
attack * = 2 ;
if ( defender - > ability = = ABILITY_THICK_FAT & & ( type = = TYPE_FIRE | | type = = TYPE_ICE ) )
spAttack / = 2 ;
if ( attacker - > ability = = ABILITY_HUSTLE )
attack = ( 150 * attack ) / 100 ;
2018-07-16 20:47:30 +02:00
if ( attacker - > ability = = ABILITY_PLUS & & ABILITY_ON_FIELD2 ( ABILITY_MINUS ) )
2018-02-09 18:46:00 +01:00
spAttack = ( 150 * spAttack ) / 100 ;
2018-07-16 20:47:30 +02:00
if ( attacker - > ability = = ABILITY_MINUS & & ABILITY_ON_FIELD2 ( ABILITY_PLUS ) )
2018-02-09 18:46:00 +01:00
spAttack = ( 150 * spAttack ) / 100 ;
if ( attacker - > ability = = ABILITY_GUTS & & attacker - > status1 )
attack = ( 150 * attack ) / 100 ;
if ( defender - > ability = = ABILITY_MARVEL_SCALE & & defender - > status1 )
defense = ( 150 * defense ) / 100 ;
if ( type = = TYPE_ELECTRIC & & AbilityBattleEffects ( ABILITYEFFECT_FIELD_SPORT , 0 , 0 , 0xFD , 0 ) )
gBattleMovePower / = 2 ;
if ( type = = TYPE_FIRE & & AbilityBattleEffects ( ABILITYEFFECT_FIELD_SPORT , 0 , 0 , 0xFE , 0 ) )
gBattleMovePower / = 2 ;
if ( type = = TYPE_GRASS & & attacker - > ability = = ABILITY_OVERGROW & & attacker - > hp < = ( attacker - > maxHP / 3 ) )
gBattleMovePower = ( 150 * gBattleMovePower ) / 100 ;
if ( type = = TYPE_FIRE & & attacker - > ability = = ABILITY_BLAZE & & attacker - > hp < = ( attacker - > maxHP / 3 ) )
gBattleMovePower = ( 150 * gBattleMovePower ) / 100 ;
if ( type = = TYPE_WATER & & attacker - > ability = = ABILITY_TORRENT & & attacker - > hp < = ( attacker - > maxHP / 3 ) )
gBattleMovePower = ( 150 * gBattleMovePower ) / 100 ;
if ( type = = TYPE_BUG & & attacker - > ability = = ABILITY_SWARM & & attacker - > hp < = ( attacker - > maxHP / 3 ) )
gBattleMovePower = ( 150 * gBattleMovePower ) / 100 ;
if ( gBattleMoves [ gCurrentMove ] . effect = = EFFECT_EXPLOSION )
defense / = 2 ;
2018-07-16 22:00:27 +02:00
if ( IS_TYPE_PHYSICAL ( type ) )
2018-02-09 18:46:00 +01:00
{
if ( gCritMultiplier = = 2 )
{
2018-02-11 23:46:50 +01:00
if ( attacker - > statStages [ STAT_ATK ] > 6 )
APPLY_STAT_MOD ( damage , attacker , attack , STAT_ATK )
2018-02-09 18:46:00 +01:00
else
damage = attack ;
}
else
2018-02-11 23:46:50 +01:00
APPLY_STAT_MOD ( damage , attacker , attack , STAT_ATK )
2018-02-09 18:46:00 +01:00
damage = damage * gBattleMovePower ;
damage * = ( 2 * attacker - > level / 5 + 2 ) ;
if ( gCritMultiplier = = 2 )
{
2018-02-11 23:46:50 +01:00
if ( defender - > statStages [ STAT_DEF ] < 6 )
APPLY_STAT_MOD ( damageHelper , defender , defense , STAT_DEF )
2018-02-09 18:46:00 +01:00
else
damageHelper = defense ;
}
else
2018-02-11 23:46:50 +01:00
APPLY_STAT_MOD ( damageHelper , defender , defense , STAT_DEF )
2018-02-09 18:46:00 +01:00
damage = damage / damageHelper ;
damage / = 50 ;
if ( ( attacker - > status1 & STATUS1_BURN ) & & attacker - > ability ! = ABILITY_GUTS )
damage / = 2 ;
if ( ( sideStatus & SIDE_STATUS_REFLECT ) & & gCritMultiplier = = 1 )
{
2019-09-04 23:47:29 +02:00
if ( ( gBattleTypeFlags & BATTLE_TYPE_DOUBLE ) & & CountAliveMonsInBattle ( BATTLE_ALIVE_DEF_SIDE ) = = 2 )
2018-02-09 18:46:00 +01:00
damage = 2 * ( damage / 3 ) ;
else
damage / = 2 ;
}
2020-07-09 20:52:19 +02:00
if ( ( gBattleTypeFlags & BATTLE_TYPE_DOUBLE ) & & gBattleMoves [ move ] . target = = MOVE_TARGET_BOTH & & CountAliveMonsInBattle ( BATTLE_ALIVE_DEF_SIDE ) = = 2 )
2018-02-09 18:46:00 +01:00
damage / = 2 ;
// moves always do at least 1 damage.
if ( damage = = 0 )
damage = 1 ;
}
if ( type = = TYPE_MYSTERY )
damage = 0 ; // is ??? type. does 0 damage.
2018-07-16 22:00:27 +02:00
if ( IS_TYPE_SPECIAL ( type ) )
2018-02-09 18:46:00 +01:00
{
if ( gCritMultiplier = = 2 )
{
2018-02-11 23:46:50 +01:00
if ( attacker - > statStages [ STAT_SPATK ] > 6 )
APPLY_STAT_MOD ( damage , attacker , spAttack , STAT_SPATK )
2018-02-09 18:46:00 +01:00
else
damage = spAttack ;
}
else
2018-02-11 23:46:50 +01:00
APPLY_STAT_MOD ( damage , attacker , spAttack , STAT_SPATK )
2018-02-09 18:46:00 +01:00
damage = damage * gBattleMovePower ;
damage * = ( 2 * attacker - > level / 5 + 2 ) ;
if ( gCritMultiplier = = 2 )
{
2018-02-11 23:46:50 +01:00
if ( defender - > statStages [ STAT_SPDEF ] < 6 )
APPLY_STAT_MOD ( damageHelper , defender , spDefense , STAT_SPDEF )
2018-02-09 18:46:00 +01:00
else
damageHelper = spDefense ;
}
else
2018-02-11 23:46:50 +01:00
APPLY_STAT_MOD ( damageHelper , defender , spDefense , STAT_SPDEF )
2018-02-09 18:46:00 +01:00
damage = ( damage / damageHelper ) ;
damage / = 50 ;
if ( ( sideStatus & SIDE_STATUS_LIGHTSCREEN ) & & gCritMultiplier = = 1 )
{
2019-09-04 23:47:29 +02:00
if ( ( gBattleTypeFlags & BATTLE_TYPE_DOUBLE ) & & CountAliveMonsInBattle ( BATTLE_ALIVE_DEF_SIDE ) = = 2 )
2018-02-09 18:46:00 +01:00
damage = 2 * ( damage / 3 ) ;
else
damage / = 2 ;
}
2020-07-09 20:52:19 +02:00
if ( ( gBattleTypeFlags & BATTLE_TYPE_DOUBLE ) & & gBattleMoves [ move ] . target = = MOVE_TARGET_BOTH & & CountAliveMonsInBattle ( BATTLE_ALIVE_DEF_SIDE ) = = 2 )
2018-02-09 18:46:00 +01:00
damage / = 2 ;
// are effects of weather negated with cloud nine or air lock
2018-07-16 20:47:30 +02:00
if ( WEATHER_HAS_EFFECT2 )
2018-02-09 18:46:00 +01:00
{
if ( gBattleWeather & WEATHER_RAIN_TEMPORARY )
{
switch ( type )
{
case TYPE_FIRE :
damage / = 2 ;
break ;
case TYPE_WATER :
damage = ( 15 * damage ) / 10 ;
break ;
}
}
// any weather except sun weakens solar beam
2019-11-20 17:37:14 +01:00
if ( ( gBattleWeather & ( WEATHER_RAIN_ANY | WEATHER_SANDSTORM_ANY | WEATHER_HAIL_ANY ) ) & & gCurrentMove = = MOVE_SOLAR_BEAM )
2018-02-09 18:46:00 +01:00
damage / = 2 ;
// sunny
if ( gBattleWeather & WEATHER_SUN_ANY )
{
switch ( type )
{
case TYPE_FIRE :
damage = ( 15 * damage ) / 10 ;
break ;
case TYPE_WATER :
damage / = 2 ;
break ;
}
}
}
// flash fire triggered
2019-04-04 23:53:06 +02:00
if ( ( gBattleResources - > flags - > flags [ battlerIdAtk ] & RESOURCE_FLAG_FLASH_FIRE ) & & type = = TYPE_FIRE )
2018-02-09 18:46:00 +01:00
damage = ( 15 * damage ) / 10 ;
}
return damage + 2 ;
}
u8 CountAliveMonsInBattle ( u8 caseId )
{
s32 i ;
u8 retVal = 0 ;
switch ( caseId )
{
case BATTLE_ALIVE_EXCEPT_ACTIVE :
2019-09-08 17:53:48 +02:00
for ( i = 0 ; i < MAX_BATTLERS_COUNT ; i + + )
2018-02-09 18:46:00 +01:00
{
if ( i ! = gActiveBattler & & ! ( gAbsentBattlerFlags & gBitTable [ i ] ) )
retVal + + ;
}
break ;
case BATTLE_ALIVE_ATK_SIDE :
2019-09-08 17:53:48 +02:00
for ( i = 0 ; i < MAX_BATTLERS_COUNT ; i + + )
2018-02-09 18:46:00 +01:00
{
if ( GetBattlerSide ( i ) = = GetBattlerSide ( gBattlerAttacker ) & & ! ( gAbsentBattlerFlags & gBitTable [ i ] ) )
retVal + + ;
}
break ;
case BATTLE_ALIVE_DEF_SIDE :
2019-09-08 17:53:48 +02:00
for ( i = 0 ; i < MAX_BATTLERS_COUNT ; i + + )
2018-02-09 18:46:00 +01:00
{
if ( GetBattlerSide ( i ) = = GetBattlerSide ( gBattlerTarget ) & & ! ( gAbsentBattlerFlags & gBitTable [ i ] ) )
retVal + + ;
}
break ;
}
return retVal ;
}
2018-02-11 17:35:01 +01:00
static bool8 ShouldGetStatBadgeBoost ( u16 badgeFlag , u8 battlerId )
2018-02-09 18:46:00 +01:00
{
if ( gBattleTypeFlags & ( BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER ) )
return FALSE ;
2018-07-01 15:28:57 +02:00
else if ( GetBattlerSide ( battlerId ) ! = B_SIDE_PLAYER )
2018-02-09 18:46:00 +01:00
return FALSE ;
2018-07-01 15:28:57 +02:00
else if ( gBattleTypeFlags & BATTLE_TYPE_TRAINER & & gTrainerBattleOpponent_A = = TRAINER_SECRET_BASE )
2018-02-09 18:46:00 +01:00
return FALSE ;
2018-07-01 15:28:57 +02:00
else if ( FlagGet ( badgeFlag ) )
2018-02-09 18:46:00 +01:00
return TRUE ;
2018-07-01 15:28:57 +02:00
else
return FALSE ;
2018-02-09 18:46:00 +01:00
}
2018-02-11 17:35:01 +01:00
u8 GetDefaultMoveTarget ( u8 battlerId )
2018-02-09 18:46:00 +01:00
{
2018-02-11 17:35:01 +01:00
u8 opposing = BATTLE_OPPOSITE ( GetBattlerPosition ( battlerId ) & BIT_SIDE ) ;
2018-02-09 18:46:00 +01:00
if ( ! ( gBattleTypeFlags & BATTLE_TYPE_DOUBLE ) )
2018-02-11 17:35:01 +01:00
return GetBattlerAtPosition ( opposing ) ;
2018-02-09 18:46:00 +01:00
if ( CountAliveMonsInBattle ( BATTLE_ALIVE_EXCEPT_ACTIVE ) > 1 )
{
2018-02-11 17:35:01 +01:00
u8 position ;
2018-02-09 18:46:00 +01:00
if ( ( Random ( ) & 1 ) = = 0 )
2018-02-11 17:35:01 +01:00
position = BATTLE_PARTNER ( opposing ) ;
2018-02-09 18:46:00 +01:00
else
2018-02-11 17:35:01 +01:00
position = opposing ;
return GetBattlerAtPosition ( position ) ;
2018-02-09 18:46:00 +01:00
}
else
{
2018-02-11 17:35:01 +01:00
if ( ( gAbsentBattlerFlags & gBitTable [ opposing ] ) )
return GetBattlerAtPosition ( BATTLE_PARTNER ( opposing ) ) ;
2018-02-09 18:46:00 +01:00
else
2018-02-11 17:35:01 +01:00
return GetBattlerAtPosition ( opposing ) ;
2018-02-09 18:46:00 +01:00
}
}
u8 GetMonGender ( struct Pokemon * mon )
{
return GetBoxMonGender ( & mon - > box ) ;
}
u8 GetBoxMonGender ( struct BoxPokemon * boxMon )
{
u16 species = GetBoxMonData ( boxMon , MON_DATA_SPECIES , NULL ) ;
u32 personality = GetBoxMonData ( boxMon , MON_DATA_PERSONALITY , NULL ) ;
switch ( gBaseStats [ species ] . genderRatio )
{
case MON_MALE :
case MON_FEMALE :
case MON_GENDERLESS :
return gBaseStats [ species ] . genderRatio ;
}
if ( gBaseStats [ species ] . genderRatio > ( personality & 0xFF ) )
return MON_FEMALE ;
else
return MON_MALE ;
}
u8 GetGenderFromSpeciesAndPersonality ( u16 species , u32 personality )
{
switch ( gBaseStats [ species ] . genderRatio )
{
case MON_MALE :
case MON_FEMALE :
case MON_GENDERLESS :
return gBaseStats [ species ] . genderRatio ;
}
if ( gBaseStats [ species ] . genderRatio > ( personality & 0xFF ) )
return MON_FEMALE ;
else
return MON_MALE ;
}
2019-04-05 00:07:39 +02:00
void SetMultiuseSpriteTemplateToPokemon ( u16 speciesTag , u8 battlerPosition )
2018-02-09 18:46:00 +01:00
{
if ( gMonSpritesGfxPtr ! = NULL )
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate = gMonSpritesGfxPtr - > templates [ battlerPosition ] ;
2018-02-09 18:46:00 +01:00
else if ( gUnknown_020249B4 [ 0 ] )
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate = gUnknown_020249B4 [ 0 ] - > templates [ battlerPosition ] ;
2018-02-09 18:46:00 +01:00
else if ( gUnknown_020249B4 [ 1 ] )
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate = gUnknown_020249B4 [ 1 ] - > templates [ battlerPosition ] ;
2018-02-09 18:46:00 +01:00
else
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate = gUnknown_08329D98 [ battlerPosition ] ;
2018-02-09 18:46:00 +01:00
2019-04-05 00:07:39 +02:00
gMultiuseSpriteTemplate . paletteTag = speciesTag ;
2018-07-01 15:28:57 +02:00
if ( battlerPosition = = B_POSITION_PLAYER_LEFT | | battlerPosition = = B_POSITION_PLAYER_RIGHT )
2019-04-04 23:53:06 +02:00
gMultiuseSpriteTemplate . anims = gUnknown_082FF70C ;
2019-04-05 00:07:39 +02:00
else if ( speciesTag > SPECIES_SHINY_TAG )
gMultiuseSpriteTemplate . anims = gMonFrontAnimsPtrTable [ speciesTag - SPECIES_SHINY_TAG ] ;
2018-02-09 18:46:00 +01:00
else
2019-04-05 00:07:39 +02:00
gMultiuseSpriteTemplate . anims = gMonFrontAnimsPtrTable [ speciesTag ] ;
2018-02-09 18:46:00 +01:00
}
2018-07-01 15:28:57 +02:00
void SetMultiuseSpriteTemplateToTrainerBack ( u16 trainerSpriteId , u8 battlerPosition )
2018-02-09 18:46:00 +01:00
{
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate . paletteTag = trainerSpriteId ;
2018-02-11 17:35:01 +01:00
if ( battlerPosition = = B_POSITION_PLAYER_LEFT | | battlerPosition = = B_POSITION_PLAYER_RIGHT )
2018-02-09 18:46:00 +01:00
{
2019-02-02 22:53:47 +01:00
gMultiuseSpriteTemplate = gSpriteTemplateTable_TrainerBackSprites [ trainerSpriteId ] ;
2018-09-09 23:35:07 +02:00
gMultiuseSpriteTemplate . anims = gTrainerBackAnimsPtrTable [ trainerSpriteId ] ;
2018-02-09 18:46:00 +01:00
}
else
{
if ( gMonSpritesGfxPtr ! = NULL )
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate = gMonSpritesGfxPtr - > templates [ battlerPosition ] ;
2018-02-09 18:46:00 +01:00
else
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate = gUnknown_08329D98 [ battlerPosition ] ;
2018-09-09 23:35:07 +02:00
gMultiuseSpriteTemplate . anims = gTrainerFrontAnimsPtrTable [ trainerSpriteId ] ;
2018-02-09 18:46:00 +01:00
}
}
2018-07-01 15:28:57 +02:00
void SetMultiuseSpriteTemplateToTrainerFront ( u16 arg0 , u8 battlerPosition )
2018-02-09 18:46:00 +01:00
{
if ( gMonSpritesGfxPtr ! = NULL )
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate = gMonSpritesGfxPtr - > templates [ battlerPosition ] ;
2018-02-09 18:46:00 +01:00
else
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate = gUnknown_08329D98 [ battlerPosition ] ;
2018-02-09 18:46:00 +01:00
2018-07-01 15:28:57 +02:00
gMultiuseSpriteTemplate . paletteTag = arg0 ;
2018-09-09 23:35:07 +02:00
gMultiuseSpriteTemplate . anims = gTrainerFrontAnimsPtrTable [ arg0 ] ;
2018-02-09 18:46:00 +01:00
}
2018-02-11 17:35:01 +01:00
static void EncryptBoxMon ( struct BoxPokemon * boxMon )
2018-02-09 18:46:00 +01:00
{
u32 i ;
for ( i = 0 ; i < 12 ; i + + )
{
boxMon - > secure . raw [ i ] ^ = boxMon - > personality ;
boxMon - > secure . raw [ i ] ^ = boxMon - > otId ;
}
}
2018-02-11 17:35:01 +01:00
static void DecryptBoxMon ( struct BoxPokemon * boxMon )
2018-02-09 18:46:00 +01:00
{
u32 i ;
for ( i = 0 ; i < 12 ; i + + )
{
boxMon - > secure . raw [ i ] ^ = boxMon - > otId ;
boxMon - > secure . raw [ i ] ^ = boxMon - > personality ;
}
}
# define SUBSTRUCT_CASE(n, v1, v2, v3, v4) \
case n : \
{ \
union PokemonSubstruct * substructs0 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs1 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs2 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs3 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs4 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs5 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs6 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs7 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs8 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs9 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs10 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs11 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs12 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs13 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs14 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs15 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs16 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs17 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs18 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs19 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs20 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs21 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs22 = boxMon - > secure . substructs ; \
union PokemonSubstruct * substructs23 = boxMon - > secure . substructs ; \
\
switch ( substructType ) \
{ \
case 0 : \
substruct = & substructs # # n [ v1 ] ; \
break ; \
case 1 : \
substruct = & substructs # # n [ v2 ] ; \
break ; \
case 2 : \
substruct = & substructs # # n [ v3 ] ; \
break ; \
case 3 : \
substruct = & substructs # # n [ v4 ] ; \
break ; \
} \
break ; \
} \
2018-02-11 17:35:01 +01:00
static union PokemonSubstruct * GetSubstruct ( struct BoxPokemon * boxMon , u32 personality , u8 substructType )
2018-02-09 18:46:00 +01:00
{
union PokemonSubstruct * substruct = NULL ;
switch ( personality % 24 )
{
SUBSTRUCT_CASE ( 0 , 0 , 1 , 2 , 3 )
SUBSTRUCT_CASE ( 1 , 0 , 1 , 3 , 2 )
SUBSTRUCT_CASE ( 2 , 0 , 2 , 1 , 3 )
SUBSTRUCT_CASE ( 3 , 0 , 3 , 1 , 2 )
SUBSTRUCT_CASE ( 4 , 0 , 2 , 3 , 1 )
SUBSTRUCT_CASE ( 5 , 0 , 3 , 2 , 1 )
SUBSTRUCT_CASE ( 6 , 1 , 0 , 2 , 3 )
SUBSTRUCT_CASE ( 7 , 1 , 0 , 3 , 2 )
SUBSTRUCT_CASE ( 8 , 2 , 0 , 1 , 3 )
SUBSTRUCT_CASE ( 9 , 3 , 0 , 1 , 2 )
SUBSTRUCT_CASE ( 10 , 2 , 0 , 3 , 1 )
SUBSTRUCT_CASE ( 11 , 3 , 0 , 2 , 1 )
SUBSTRUCT_CASE ( 12 , 1 , 2 , 0 , 3 )
SUBSTRUCT_CASE ( 13 , 1 , 3 , 0 , 2 )
SUBSTRUCT_CASE ( 14 , 2 , 1 , 0 , 3 )
SUBSTRUCT_CASE ( 15 , 3 , 1 , 0 , 2 )
SUBSTRUCT_CASE ( 16 , 2 , 3 , 0 , 1 )
SUBSTRUCT_CASE ( 17 , 3 , 2 , 0 , 1 )
SUBSTRUCT_CASE ( 18 , 1 , 2 , 3 , 0 )
SUBSTRUCT_CASE ( 19 , 1 , 3 , 2 , 0 )
SUBSTRUCT_CASE ( 20 , 2 , 1 , 3 , 0 )
SUBSTRUCT_CASE ( 21 , 3 , 1 , 2 , 0 )
SUBSTRUCT_CASE ( 22 , 2 , 3 , 1 , 0 )
SUBSTRUCT_CASE ( 23 , 3 , 2 , 1 , 0 )
}
return substruct ;
}
u32 GetMonData ( struct Pokemon * mon , s32 field , u8 * data )
{
u32 ret ;
switch ( field )
{
case MON_DATA_STATUS :
ret = mon - > status ;
break ;
case MON_DATA_LEVEL :
ret = mon - > level ;
break ;
case MON_DATA_HP :
ret = mon - > hp ;
break ;
case MON_DATA_MAX_HP :
ret = mon - > maxHP ;
break ;
case MON_DATA_ATK :
2019-07-29 21:45:06 +02:00
ret = GetDeoxysStat ( mon , STAT_ATK ) ;
2018-02-09 18:46:00 +01:00
if ( ! ret )
ret = mon - > attack ;
break ;
case MON_DATA_DEF :
2019-07-29 21:45:06 +02:00
ret = GetDeoxysStat ( mon , STAT_DEF ) ;
2018-02-09 18:46:00 +01:00
if ( ! ret )
ret = mon - > defense ;
break ;
case MON_DATA_SPEED :
2019-07-29 21:45:06 +02:00
ret = GetDeoxysStat ( mon , STAT_SPEED ) ;
2018-02-09 18:46:00 +01:00
if ( ! ret )
ret = mon - > speed ;
break ;
case MON_DATA_SPATK :
2019-07-29 21:45:06 +02:00
ret = GetDeoxysStat ( mon , STAT_SPATK ) ;
2018-02-09 18:46:00 +01:00
if ( ! ret )
ret = mon - > spAttack ;
break ;
case MON_DATA_SPDEF :
2019-07-29 21:45:06 +02:00
ret = GetDeoxysStat ( mon , STAT_SPDEF ) ;
2018-02-09 18:46:00 +01:00
if ( ! ret )
ret = mon - > spDefense ;
break ;
case MON_DATA_ATK2 :
ret = mon - > attack ;
break ;
case MON_DATA_DEF2 :
ret = mon - > defense ;
break ;
case MON_DATA_SPEED2 :
ret = mon - > speed ;
break ;
case MON_DATA_SPATK2 :
ret = mon - > spAttack ;
break ;
case MON_DATA_SPDEF2 :
ret = mon - > spDefense ;
break ;
case MON_DATA_MAIL :
ret = mon - > mail ;
break ;
default :
ret = GetBoxMonData ( & mon - > box , field , data ) ;
break ;
}
return ret ;
}
u32 GetBoxMonData ( struct BoxPokemon * boxMon , s32 field , u8 * data )
{
s32 i ;
u32 retVal = 0 ;
struct PokemonSubstruct0 * substruct0 = NULL ;
struct PokemonSubstruct1 * substruct1 = NULL ;
struct PokemonSubstruct2 * substruct2 = NULL ;
struct PokemonSubstruct3 * substruct3 = NULL ;
2019-04-28 00:45:32 +02:00
// Any field greater than MON_DATA_ENCRYPT_SEPARATOR is encrypted and must be treated as such
if ( field > MON_DATA_ENCRYPT_SEPARATOR )
2018-02-09 18:46:00 +01:00
{
substruct0 = & ( GetSubstruct ( boxMon , boxMon - > personality , 0 ) - > type0 ) ;
substruct1 = & ( GetSubstruct ( boxMon , boxMon - > personality , 1 ) - > type1 ) ;
substruct2 = & ( GetSubstruct ( boxMon , boxMon - > personality , 2 ) - > type2 ) ;
substruct3 = & ( GetSubstruct ( boxMon , boxMon - > personality , 3 ) - > type3 ) ;
DecryptBoxMon ( boxMon ) ;
if ( CalculateBoxMonChecksum ( boxMon ) ! = boxMon - > checksum )
{
boxMon - > isBadEgg = 1 ;
boxMon - > isEgg = 1 ;
substruct3 - > isEgg = 1 ;
}
}
switch ( field )
{
case MON_DATA_PERSONALITY :
retVal = boxMon - > personality ;
break ;
case MON_DATA_OT_ID :
retVal = boxMon - > otId ;
break ;
case MON_DATA_NICKNAME :
{
if ( boxMon - > isBadEgg )
{
for ( retVal = 0 ;
retVal < POKEMON_NAME_LENGTH & & gText_BadEgg [ retVal ] ! = EOS ;
data [ retVal ] = gText_BadEgg [ retVal ] , retVal + + ) { }
data [ retVal ] = EOS ;
}
else if ( boxMon - > isEgg )
{
StringCopy ( data , gText_EggNickname ) ;
retVal = StringLength ( data ) ;
}
else if ( boxMon - > language = = LANGUAGE_JAPANESE )
{
data [ 0 ] = EXT_CTRL_CODE_BEGIN ;
data [ 1 ] = EXT_CTRL_CODE_JPN ;
for ( retVal = 2 , i = 0 ;
i < 5 & & boxMon - > nickname [ i ] ! = EOS ;
data [ retVal ] = boxMon - > nickname [ i ] , retVal + + , i + + ) { }
data [ retVal + + ] = EXT_CTRL_CODE_BEGIN ;
data [ retVal + + ] = EXT_CTRL_CODE_ENG ;
data [ retVal ] = EOS ;
}
else
{
for ( retVal = 0 ;
retVal < POKEMON_NAME_LENGTH ;
data [ retVal ] = boxMon - > nickname [ retVal ] , retVal + + ) { }
data [ retVal ] = EOS ;
}
break ;
}
case MON_DATA_LANGUAGE :
retVal = boxMon - > language ;
break ;
2018-12-15 23:58:47 +01:00
case MON_DATA_SANITY_IS_BAD_EGG :
2018-02-09 18:46:00 +01:00
retVal = boxMon - > isBadEgg ;
break ;
2018-12-15 23:58:47 +01:00
case MON_DATA_SANITY_HAS_SPECIES :
2018-02-09 18:46:00 +01:00
retVal = boxMon - > hasSpecies ;
break ;
2018-12-15 23:58:47 +01:00
case MON_DATA_SANITY_IS_EGG :
2018-02-09 18:46:00 +01:00
retVal = boxMon - > isEgg ;
break ;
case MON_DATA_OT_NAME :
{
retVal = 0 ;
2018-09-01 22:03:21 +02:00
while ( retVal < PLAYER_NAME_LENGTH )
2018-02-09 18:46:00 +01:00
{
data [ retVal ] = boxMon - > otName [ retVal ] ;
retVal + + ;
}
data [ retVal ] = EOS ;
break ;
}
case MON_DATA_MARKINGS :
retVal = boxMon - > markings ;
break ;
case MON_DATA_CHECKSUM :
retVal = boxMon - > checksum ;
break ;
2019-04-28 00:45:32 +02:00
case MON_DATA_ENCRYPT_SEPARATOR :
2018-02-09 18:46:00 +01:00
retVal = boxMon - > unknown ;
break ;
case MON_DATA_SPECIES :
retVal = boxMon - > isBadEgg ? SPECIES_EGG : substruct0 - > species ;
break ;
case MON_DATA_HELD_ITEM :
retVal = substruct0 - > heldItem ;
break ;
case MON_DATA_EXP :
retVal = substruct0 - > experience ;
break ;
case MON_DATA_PP_BONUSES :
retVal = substruct0 - > ppBonuses ;
break ;
case MON_DATA_FRIENDSHIP :
retVal = substruct0 - > friendship ;
break ;
case MON_DATA_MOVE1 :
case MON_DATA_MOVE2 :
case MON_DATA_MOVE3 :
case MON_DATA_MOVE4 :
retVal = substruct1 - > moves [ field - MON_DATA_MOVE1 ] ;
break ;
case MON_DATA_PP1 :
case MON_DATA_PP2 :
case MON_DATA_PP3 :
case MON_DATA_PP4 :
retVal = substruct1 - > pp [ field - MON_DATA_PP1 ] ;
break ;
case MON_DATA_HP_EV :
retVal = substruct2 - > hpEV ;
break ;
case MON_DATA_ATK_EV :
retVal = substruct2 - > attackEV ;
break ;
case MON_DATA_DEF_EV :
retVal = substruct2 - > defenseEV ;
break ;
case MON_DATA_SPEED_EV :
retVal = substruct2 - > speedEV ;
break ;
case MON_DATA_SPATK_EV :
retVal = substruct2 - > spAttackEV ;
break ;
case MON_DATA_SPDEF_EV :
retVal = substruct2 - > spDefenseEV ;
break ;
case MON_DATA_COOL :
retVal = substruct2 - > cool ;
break ;
case MON_DATA_BEAUTY :
retVal = substruct2 - > beauty ;
break ;
case MON_DATA_CUTE :
retVal = substruct2 - > cute ;
break ;
case MON_DATA_SMART :
retVal = substruct2 - > smart ;
break ;
case MON_DATA_TOUGH :
retVal = substruct2 - > tough ;
break ;
case MON_DATA_SHEEN :
retVal = substruct2 - > sheen ;
break ;
case MON_DATA_POKERUS :
retVal = substruct3 - > pokerus ;
break ;
case MON_DATA_MET_LOCATION :
retVal = substruct3 - > metLocation ;
break ;
case MON_DATA_MET_LEVEL :
retVal = substruct3 - > metLevel ;
break ;
case MON_DATA_MET_GAME :
retVal = substruct3 - > metGame ;
break ;
case MON_DATA_POKEBALL :
retVal = substruct3 - > pokeball ;
break ;
case MON_DATA_OT_GENDER :
retVal = substruct3 - > otGender ;
break ;
case MON_DATA_HP_IV :
retVal = substruct3 - > hpIV ;
break ;
case MON_DATA_ATK_IV :
retVal = substruct3 - > attackIV ;
break ;
case MON_DATA_DEF_IV :
retVal = substruct3 - > defenseIV ;
break ;
case MON_DATA_SPEED_IV :
retVal = substruct3 - > speedIV ;
break ;
case MON_DATA_SPATK_IV :
retVal = substruct3 - > spAttackIV ;
break ;
case MON_DATA_SPDEF_IV :
retVal = substruct3 - > spDefenseIV ;
break ;
case MON_DATA_IS_EGG :
retVal = substruct3 - > isEgg ;
break ;
2019-05-14 15:22:16 +02:00
case MON_DATA_ABILITY_NUM :
retVal = substruct3 - > abilityNum ;
2018-02-09 18:46:00 +01:00
break ;
case MON_DATA_COOL_RIBBON :
retVal = substruct3 - > coolRibbon ;
break ;
case MON_DATA_BEAUTY_RIBBON :
retVal = substruct3 - > beautyRibbon ;
break ;
case MON_DATA_CUTE_RIBBON :
retVal = substruct3 - > cuteRibbon ;
break ;
case MON_DATA_SMART_RIBBON :
retVal = substruct3 - > smartRibbon ;
break ;
case MON_DATA_TOUGH_RIBBON :
retVal = substruct3 - > toughRibbon ;
break ;
case MON_DATA_CHAMPION_RIBBON :
retVal = substruct3 - > championRibbon ;
break ;
case MON_DATA_WINNING_RIBBON :
retVal = substruct3 - > winningRibbon ;
break ;
case MON_DATA_VICTORY_RIBBON :
retVal = substruct3 - > victoryRibbon ;
break ;
case MON_DATA_ARTIST_RIBBON :
retVal = substruct3 - > artistRibbon ;
break ;
case MON_DATA_EFFORT_RIBBON :
retVal = substruct3 - > effortRibbon ;
break ;
case MON_DATA_GIFT_RIBBON_1 :
retVal = substruct3 - > giftRibbon1 ;
break ;
case MON_DATA_GIFT_RIBBON_2 :
retVal = substruct3 - > giftRibbon2 ;
break ;
case MON_DATA_GIFT_RIBBON_3 :
retVal = substruct3 - > giftRibbon3 ;
break ;
case MON_DATA_GIFT_RIBBON_4 :
retVal = substruct3 - > giftRibbon4 ;
break ;
case MON_DATA_GIFT_RIBBON_5 :
retVal = substruct3 - > giftRibbon5 ;
break ;
case MON_DATA_GIFT_RIBBON_6 :
retVal = substruct3 - > giftRibbon6 ;
break ;
case MON_DATA_GIFT_RIBBON_7 :
retVal = substruct3 - > giftRibbon7 ;
break ;
case MON_DATA_FATEFUL_ENCOUNTER :
retVal = substruct3 - > fatefulEncounter ;
break ;
case MON_DATA_OBEDIENCE :
retVal = substruct3 - > obedient ;
break ;
case MON_DATA_SPECIES2 :
retVal = substruct0 - > species ;
if ( substruct0 - > species & & ( substruct3 - > isEgg | | boxMon - > isBadEgg ) )
retVal = SPECIES_EGG ;
break ;
case MON_DATA_IVS :
retVal = substruct3 - > hpIV | ( substruct3 - > attackIV < < 5 ) | ( substruct3 - > defenseIV < < 10 ) | ( substruct3 - > speedIV < < 15 ) | ( substruct3 - > spAttackIV < < 20 ) | ( substruct3 - > spDefenseIV < < 25 ) ;
break ;
case MON_DATA_KNOWN_MOVES :
if ( substruct0 - > species & & ! substruct3 - > isEgg )
{
u16 * moves = ( u16 * ) data ;
s32 i = 0 ;
2018-12-15 23:58:47 +01:00
while ( moves [ i ] ! = MOVES_COUNT )
2018-02-09 18:46:00 +01:00
{
u16 move = moves [ i ] ;
if ( substruct1 - > moves [ 0 ] = = move
| | substruct1 - > moves [ 1 ] = = move
| | substruct1 - > moves [ 2 ] = = move
| | substruct1 - > moves [ 3 ] = = move )
retVal | = gBitTable [ i ] ;
i + + ;
}
}
break ;
case MON_DATA_RIBBON_COUNT :
retVal = 0 ;
if ( substruct0 - > species & & ! substruct3 - > isEgg )
{
retVal + = substruct3 - > coolRibbon ;
retVal + = substruct3 - > beautyRibbon ;
retVal + = substruct3 - > cuteRibbon ;
retVal + = substruct3 - > smartRibbon ;
retVal + = substruct3 - > toughRibbon ;
retVal + = substruct3 - > championRibbon ;
retVal + = substruct3 - > winningRibbon ;
retVal + = substruct3 - > victoryRibbon ;
retVal + = substruct3 - > artistRibbon ;
retVal + = substruct3 - > effortRibbon ;
retVal + = substruct3 - > giftRibbon1 ;
retVal + = substruct3 - > giftRibbon2 ;
retVal + = substruct3 - > giftRibbon3 ;
retVal + = substruct3 - > giftRibbon4 ;
retVal + = substruct3 - > giftRibbon5 ;
retVal + = substruct3 - > giftRibbon6 ;
retVal + = substruct3 - > giftRibbon7 ;
}
break ;
case MON_DATA_RIBBONS :
retVal = 0 ;
if ( substruct0 - > species & & ! substruct3 - > isEgg )
{
retVal = substruct3 - > championRibbon
| ( substruct3 - > coolRibbon < < 1 )
| ( substruct3 - > beautyRibbon < < 4 )
| ( substruct3 - > cuteRibbon < < 7 )
| ( substruct3 - > smartRibbon < < 10 )
| ( substruct3 - > toughRibbon < < 13 )
| ( substruct3 - > winningRibbon < < 16 )
| ( substruct3 - > victoryRibbon < < 17 )
| ( substruct3 - > artistRibbon < < 18 )
| ( substruct3 - > effortRibbon < < 19 )
| ( substruct3 - > giftRibbon1 < < 20 )
| ( substruct3 - > giftRibbon2 < < 21 )
| ( substruct3 - > giftRibbon3 < < 22 )
| ( substruct3 - > giftRibbon4 < < 23 )
| ( substruct3 - > giftRibbon5 < < 24 )
| ( substruct3 - > giftRibbon6 < < 25 )
| ( substruct3 - > giftRibbon7 < < 26 ) ;
}
break ;
default :
break ;
}
2019-04-28 00:45:32 +02:00
if ( field > MON_DATA_ENCRYPT_SEPARATOR )
2018-02-09 18:46:00 +01:00
EncryptBoxMon ( boxMon ) ;
return retVal ;
}
# define SET8(lhs) (lhs) = *data
# define SET16(lhs) (lhs) = data[0] + (data[1] << 8)
# define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24)
void SetMonData ( struct Pokemon * mon , s32 field , const void * dataArg )
{
2018-07-01 15:28:57 +02:00
const u8 * data = dataArg ;
2018-02-09 18:46:00 +01:00
switch ( field )
{
case MON_DATA_STATUS :
SET32 ( mon - > status ) ;
break ;
case MON_DATA_LEVEL :
SET8 ( mon - > level ) ;
break ;
case MON_DATA_HP :
SET16 ( mon - > hp ) ;
break ;
case MON_DATA_MAX_HP :
SET16 ( mon - > maxHP ) ;
break ;
case MON_DATA_ATK :
SET16 ( mon - > attack ) ;
break ;
case MON_DATA_DEF :
SET16 ( mon - > defense ) ;
break ;
case MON_DATA_SPEED :
SET16 ( mon - > speed ) ;
break ;
case MON_DATA_SPATK :
SET16 ( mon - > spAttack ) ;
break ;
case MON_DATA_SPDEF :
SET16 ( mon - > spDefense ) ;
break ;
case MON_DATA_MAIL :
SET8 ( mon - > mail ) ;
break ;
case MON_DATA_SPECIES2 :
break ;
default :
SetBoxMonData ( & mon - > box , field , data ) ;
break ;
}
}
void SetBoxMonData ( struct BoxPokemon * boxMon , s32 field , const void * dataArg )
{
2018-07-01 15:28:57 +02:00
const u8 * data = dataArg ;
2018-02-09 18:46:00 +01:00
struct PokemonSubstruct0 * substruct0 = NULL ;
struct PokemonSubstruct1 * substruct1 = NULL ;
struct PokemonSubstruct2 * substruct2 = NULL ;
struct PokemonSubstruct3 * substruct3 = NULL ;
2019-04-28 00:45:32 +02:00
if ( field > MON_DATA_ENCRYPT_SEPARATOR )
2018-02-09 18:46:00 +01:00
{
substruct0 = & ( GetSubstruct ( boxMon , boxMon - > personality , 0 ) - > type0 ) ;
substruct1 = & ( GetSubstruct ( boxMon , boxMon - > personality , 1 ) - > type1 ) ;
substruct2 = & ( GetSubstruct ( boxMon , boxMon - > personality , 2 ) - > type2 ) ;
substruct3 = & ( GetSubstruct ( boxMon , boxMon - > personality , 3 ) - > type3 ) ;
DecryptBoxMon ( boxMon ) ;
if ( CalculateBoxMonChecksum ( boxMon ) ! = boxMon - > checksum )
{
boxMon - > isBadEgg = 1 ;
boxMon - > isEgg = 1 ;
substruct3 - > isEgg = 1 ;
EncryptBoxMon ( boxMon ) ;
return ;
}
}
switch ( field )
{
case MON_DATA_PERSONALITY :
SET32 ( boxMon - > personality ) ;
break ;
case MON_DATA_OT_ID :
SET32 ( boxMon - > otId ) ;
break ;
case MON_DATA_NICKNAME :
{
s32 i ;
for ( i = 0 ; i < POKEMON_NAME_LENGTH ; i + + )
boxMon - > nickname [ i ] = data [ i ] ;
break ;
}
case MON_DATA_LANGUAGE :
SET8 ( boxMon - > language ) ;
break ;
2018-12-15 23:58:47 +01:00
case MON_DATA_SANITY_IS_BAD_EGG :
2018-02-09 18:46:00 +01:00
SET8 ( boxMon - > isBadEgg ) ;
break ;
2018-12-15 23:58:47 +01:00
case MON_DATA_SANITY_HAS_SPECIES :
2018-02-09 18:46:00 +01:00
SET8 ( boxMon - > hasSpecies ) ;
break ;
2018-12-15 23:58:47 +01:00
case MON_DATA_SANITY_IS_EGG :
2018-02-09 18:46:00 +01:00
SET8 ( boxMon - > isEgg ) ;
break ;
case MON_DATA_OT_NAME :
{
s32 i ;
2018-09-01 22:03:21 +02:00
for ( i = 0 ; i < PLAYER_NAME_LENGTH ; i + + )
2018-02-09 18:46:00 +01:00
boxMon - > otName [ i ] = data [ i ] ;
break ;
}
case MON_DATA_MARKINGS :
SET8 ( boxMon - > markings ) ;
break ;
case MON_DATA_CHECKSUM :
SET16 ( boxMon - > checksum ) ;
break ;
2019-04-28 00:45:32 +02:00
case MON_DATA_ENCRYPT_SEPARATOR :
2018-02-09 18:46:00 +01:00
SET16 ( boxMon - > unknown ) ;
break ;
case MON_DATA_SPECIES :
{
SET16 ( substruct0 - > species ) ;
if ( substruct0 - > species )
boxMon - > hasSpecies = 1 ;
else
boxMon - > hasSpecies = 0 ;
break ;
}
case MON_DATA_HELD_ITEM :
SET16 ( substruct0 - > heldItem ) ;
break ;
case MON_DATA_EXP :
SET32 ( substruct0 - > experience ) ;
break ;
case MON_DATA_PP_BONUSES :
SET8 ( substruct0 - > ppBonuses ) ;
break ;
case MON_DATA_FRIENDSHIP :
SET8 ( substruct0 - > friendship ) ;
break ;
case MON_DATA_MOVE1 :
case MON_DATA_MOVE2 :
case MON_DATA_MOVE3 :
case MON_DATA_MOVE4 :
SET16 ( substruct1 - > moves [ field - MON_DATA_MOVE1 ] ) ;
break ;
case MON_DATA_PP1 :
case MON_DATA_PP2 :
case MON_DATA_PP3 :
case MON_DATA_PP4 :
SET8 ( substruct1 - > pp [ field - MON_DATA_PP1 ] ) ;
break ;
case MON_DATA_HP_EV :
SET8 ( substruct2 - > hpEV ) ;
break ;
case MON_DATA_ATK_EV :
SET8 ( substruct2 - > attackEV ) ;
break ;
case MON_DATA_DEF_EV :
SET8 ( substruct2 - > defenseEV ) ;
break ;
case MON_DATA_SPEED_EV :
SET8 ( substruct2 - > speedEV ) ;
break ;
case MON_DATA_SPATK_EV :
SET8 ( substruct2 - > spAttackEV ) ;
break ;
case MON_DATA_SPDEF_EV :
SET8 ( substruct2 - > spDefenseEV ) ;
break ;
case MON_DATA_COOL :
SET8 ( substruct2 - > cool ) ;
break ;
case MON_DATA_BEAUTY :
SET8 ( substruct2 - > beauty ) ;
break ;
case MON_DATA_CUTE :
SET8 ( substruct2 - > cute ) ;
break ;
case MON_DATA_SMART :
SET8 ( substruct2 - > smart ) ;
break ;
case MON_DATA_TOUGH :
SET8 ( substruct2 - > tough ) ;
break ;
case MON_DATA_SHEEN :
SET8 ( substruct2 - > sheen ) ;
break ;
case MON_DATA_POKERUS :
SET8 ( substruct3 - > pokerus ) ;
break ;
case MON_DATA_MET_LOCATION :
SET8 ( substruct3 - > metLocation ) ;
break ;
case MON_DATA_MET_LEVEL :
{
u8 metLevel = * data ;
substruct3 - > metLevel = metLevel ;
break ;
}
case MON_DATA_MET_GAME :
SET8 ( substruct3 - > metGame ) ;
break ;
case MON_DATA_POKEBALL :
{
u8 pokeball = * data ;
substruct3 - > pokeball = pokeball ;
break ;
}
case MON_DATA_OT_GENDER :
SET8 ( substruct3 - > otGender ) ;
break ;
case MON_DATA_HP_IV :
SET8 ( substruct3 - > hpIV ) ;
break ;
case MON_DATA_ATK_IV :
SET8 ( substruct3 - > attackIV ) ;
break ;
case MON_DATA_DEF_IV :
SET8 ( substruct3 - > defenseIV ) ;
break ;
case MON_DATA_SPEED_IV :
SET8 ( substruct3 - > speedIV ) ;
break ;
case MON_DATA_SPATK_IV :
SET8 ( substruct3 - > spAttackIV ) ;
break ;
case MON_DATA_SPDEF_IV :
SET8 ( substruct3 - > spDefenseIV ) ;
break ;
case MON_DATA_IS_EGG :
SET8 ( substruct3 - > isEgg ) ;
if ( substruct3 - > isEgg )
boxMon - > isEgg = 1 ;
else
boxMon - > isEgg = 0 ;
break ;
2019-05-14 15:22:16 +02:00
case MON_DATA_ABILITY_NUM :
SET8 ( substruct3 - > abilityNum ) ;
2018-02-09 18:46:00 +01:00
break ;
case MON_DATA_COOL_RIBBON :
SET8 ( substruct3 - > coolRibbon ) ;
break ;
case MON_DATA_BEAUTY_RIBBON :
SET8 ( substruct3 - > beautyRibbon ) ;
break ;
case MON_DATA_CUTE_RIBBON :
SET8 ( substruct3 - > cuteRibbon ) ;
break ;
case MON_DATA_SMART_RIBBON :
SET8 ( substruct3 - > smartRibbon ) ;
break ;
case MON_DATA_TOUGH_RIBBON :
SET8 ( substruct3 - > toughRibbon ) ;
break ;
case MON_DATA_CHAMPION_RIBBON :
SET8 ( substruct3 - > championRibbon ) ;
break ;
case MON_DATA_WINNING_RIBBON :
SET8 ( substruct3 - > winningRibbon ) ;
break ;
case MON_DATA_VICTORY_RIBBON :
SET8 ( substruct3 - > victoryRibbon ) ;
break ;
case MON_DATA_ARTIST_RIBBON :
SET8 ( substruct3 - > artistRibbon ) ;
break ;
case MON_DATA_EFFORT_RIBBON :
SET8 ( substruct3 - > effortRibbon ) ;
break ;
case MON_DATA_GIFT_RIBBON_1 :
SET8 ( substruct3 - > giftRibbon1 ) ;
break ;
case MON_DATA_GIFT_RIBBON_2 :
SET8 ( substruct3 - > giftRibbon2 ) ;
break ;
case MON_DATA_GIFT_RIBBON_3 :
SET8 ( substruct3 - > giftRibbon3 ) ;
break ;
case MON_DATA_GIFT_RIBBON_4 :
SET8 ( substruct3 - > giftRibbon4 ) ;
break ;
case MON_DATA_GIFT_RIBBON_5 :
SET8 ( substruct3 - > giftRibbon5 ) ;
break ;
case MON_DATA_GIFT_RIBBON_6 :
SET8 ( substruct3 - > giftRibbon6 ) ;
break ;
case MON_DATA_GIFT_RIBBON_7 :
SET8 ( substruct3 - > giftRibbon7 ) ;
break ;
case MON_DATA_FATEFUL_ENCOUNTER :
SET8 ( substruct3 - > fatefulEncounter ) ;
break ;
case MON_DATA_OBEDIENCE :
SET8 ( substruct3 - > obedient ) ;
break ;
case MON_DATA_IVS :
{
u32 ivs = data [ 0 ] | ( data [ 1 ] < < 8 ) | ( data [ 2 ] < < 16 ) | ( data [ 3 ] < < 24 ) ;
substruct3 - > hpIV = ivs & 0x1F ;
substruct3 - > attackIV = ( ivs > > 5 ) & 0x1F ;
substruct3 - > defenseIV = ( ivs > > 10 ) & 0x1F ;
substruct3 - > speedIV = ( ivs > > 15 ) & 0x1F ;
substruct3 - > spAttackIV = ( ivs > > 20 ) & 0x1F ;
substruct3 - > spDefenseIV = ( ivs > > 25 ) & 0x1F ;
break ;
}
default :
break ;
}
2019-04-28 00:45:32 +02:00
if ( field > MON_DATA_ENCRYPT_SEPARATOR )
2018-02-09 18:46:00 +01:00
{
boxMon - > checksum = CalculateBoxMonChecksum ( boxMon ) ;
EncryptBoxMon ( boxMon ) ;
}
}
void CopyMon ( void * dest , void * src , size_t size )
{
memcpy ( dest , src , size ) ;
}
u8 GiveMonToPlayer ( struct Pokemon * mon )
{
s32 i ;
SetMonData ( mon , MON_DATA_OT_NAME , gSaveBlock2Ptr - > playerName ) ;
SetMonData ( mon , MON_DATA_OT_GENDER , & gSaveBlock2Ptr - > playerGender ) ;
SetMonData ( mon , MON_DATA_OT_ID , gSaveBlock2Ptr - > playerTrainerId ) ;
2018-02-11 17:35:01 +01:00
for ( i = 0 ; i < PARTY_SIZE ; i + + )
{
if ( GetMonData ( & gPlayerParty [ i ] , MON_DATA_SPECIES , NULL ) = = SPECIES_NONE )
break ;
}
2018-02-09 18:46:00 +01:00
2018-02-11 17:35:01 +01:00
if ( i > = PARTY_SIZE )
2018-02-09 18:46:00 +01:00
return SendMonToPC ( mon ) ;
CopyMon ( & gPlayerParty [ i ] , mon , sizeof ( * mon ) ) ;
gPlayerPartyCount = i + 1 ;
return MON_GIVEN_TO_PARTY ;
}
u8 SendMonToPC ( struct Pokemon * mon )
{
s32 boxNo , boxPos ;
2019-09-17 07:49:07 +02:00
SetPCBoxToSendMon ( VarGet ( VAR_PC_BOX_TO_SEND_MON ) ) ;
2018-02-09 18:46:00 +01:00
boxNo = StorageGetCurrentBox ( ) ;
do
{
2018-12-21 22:35:01 +01:00
for ( boxPos = 0 ; boxPos < IN_BOX_COUNT ; boxPos + + )
2018-02-09 18:46:00 +01:00
{
struct BoxPokemon * checkingMon = GetBoxedMonPtr ( boxNo , boxPos ) ;
if ( GetBoxMonData ( checkingMon , MON_DATA_SPECIES , NULL ) = = SPECIES_NONE )
{
MonRestorePP ( mon ) ;
CopyMon ( checkingMon , & mon - > box , sizeof ( mon - > box ) ) ;
gSpecialVar_MonBoxId = boxNo ;
gSpecialVar_MonBoxPos = boxPos ;
2019-09-17 07:49:07 +02:00
if ( GetPCBoxToSendMon ( ) ! = boxNo )
FlagClear ( FLAG_SHOWN_BOX_WAS_FULL_MESSAGE ) ;
VarSet ( VAR_PC_BOX_TO_SEND_MON , boxNo ) ;
2018-02-09 18:46:00 +01:00
return MON_GIVEN_TO_PC ;
}
}
boxNo + + ;
2018-12-21 22:35:01 +01:00
if ( boxNo = = TOTAL_BOXES_COUNT )
2018-02-09 18:46:00 +01:00
boxNo = 0 ;
} while ( boxNo ! = StorageGetCurrentBox ( ) ) ;
return MON_CANT_GIVE ;
}
u8 CalculatePlayerPartyCount ( void )
{
gPlayerPartyCount = 0 ;
2020-04-09 21:18:53 +02:00
while ( gPlayerPartyCount < PARTY_SIZE
2018-02-09 18:46:00 +01:00
& & GetMonData ( & gPlayerParty [ gPlayerPartyCount ] , MON_DATA_SPECIES , NULL ) ! = SPECIES_NONE )
{
gPlayerPartyCount + + ;
}
return gPlayerPartyCount ;
}
u8 CalculateEnemyPartyCount ( void )
{
gEnemyPartyCount = 0 ;
2020-04-09 21:18:53 +02:00
while ( gEnemyPartyCount < PARTY_SIZE
2018-02-09 18:46:00 +01:00
& & GetMonData ( & gEnemyParty [ gEnemyPartyCount ] , MON_DATA_SPECIES , NULL ) ! = SPECIES_NONE )
{
gEnemyPartyCount + + ;
}
return gEnemyPartyCount ;
}
u8 GetMonsStateToDoubles ( void )
{
s32 aliveCount = 0 ;
s32 i ;
CalculatePlayerPartyCount ( ) ;
if ( gPlayerPartyCount = = 1 )
return gPlayerPartyCount ; // PLAYER_HAS_ONE_MON
for ( i = 0 ; i < gPlayerPartyCount ; i + + )
{
if ( GetMonData ( & gPlayerParty [ i ] , MON_DATA_SPECIES2 , NULL ) ! = SPECIES_EGG
& & GetMonData ( & gPlayerParty [ i ] , MON_DATA_HP , NULL ) ! = 0
& & GetMonData ( & gPlayerParty [ i ] , MON_DATA_SPECIES2 , NULL ) ! = SPECIES_NONE )
aliveCount + + ;
}
return ( aliveCount > 1 ) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON ;
}
u8 GetMonsStateToDoubles_2 ( void )
{
s32 aliveCount = 0 ;
s32 i ;
for ( i = 0 ; i < PARTY_SIZE ; i + + )
{
u32 species = GetMonData ( & gPlayerParty [ i ] , MON_DATA_SPECIES2 , NULL ) ;
if ( species ! = SPECIES_EGG & & species ! = SPECIES_NONE
& & GetMonData ( & gPlayerParty [ i ] , MON_DATA_HP , NULL ) ! = 0 )
aliveCount + + ;
}
if ( aliveCount = = 1 )
return PLAYER_HAS_ONE_MON ; // may have more than one, but only one is alive
return ( aliveCount > 1 ) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON ;
}
2019-08-22 16:46:33 +02:00
u8 GetAbilityBySpecies ( u16 species , u8 abilityNum )
2018-02-09 18:46:00 +01:00
{
2019-05-14 15:22:16 +02:00
if ( abilityNum )
2019-05-14 15:42:55 +02:00
gLastUsedAbility = gBaseStats [ species ] . abilities [ 1 ] ;
2018-02-09 18:46:00 +01:00
else
2019-05-14 15:42:55 +02:00
gLastUsedAbility = gBaseStats [ species ] . abilities [ 0 ] ;
2018-02-09 18:46:00 +01:00
return gLastUsedAbility ;
}
u8 GetMonAbility ( struct Pokemon * mon )
{
u16 species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
2019-05-14 15:22:16 +02:00
u8 abilityNum = GetMonData ( mon , MON_DATA_ABILITY_NUM , NULL ) ;
return GetAbilityBySpecies ( species , abilityNum ) ;
2018-02-09 18:46:00 +01:00
}
2019-04-05 23:11:24 +02:00
void CreateSecretBaseEnemyParty ( struct SecretBase * secretBaseRecord )
2018-02-09 18:46:00 +01:00
{
s32 i , j ;
ZeroEnemyPartyMons ( ) ;
* gBattleResources - > secretBase = * secretBaseRecord ;
for ( i = 0 ; i < PARTY_SIZE ; i + + )
{
if ( gBattleResources - > secretBase - > party . species [ i ] )
{
CreateMon ( & gEnemyParty [ i ] ,
gBattleResources - > secretBase - > party . species [ i ] ,
gBattleResources - > secretBase - > party . levels [ i ] ,
15 ,
1 ,
gBattleResources - > secretBase - > party . personality [ i ] ,
2019-08-31 05:06:43 +02:00
OT_ID_RANDOM_NO_SHINY ,
2018-02-09 18:46:00 +01:00
0 ) ;
SetMonData ( & gEnemyParty [ i ] , MON_DATA_HELD_ITEM , & gBattleResources - > secretBase - > party . heldItems [ i ] ) ;
2020-04-09 21:18:53 +02:00
for ( j = 0 ; j < NUM_STATS ; j + + )
2018-02-09 18:46:00 +01:00
SetMonData ( & gEnemyParty [ i ] , MON_DATA_HP_EV + j , & gBattleResources - > secretBase - > party . EVs [ i ] ) ;
2018-12-25 18:50:15 +01:00
for ( j = 0 ; j < MAX_MON_MOVES ; j + + )
2018-02-09 18:46:00 +01:00
{
SetMonData ( & gEnemyParty [ i ] , MON_DATA_MOVE1 + j , & gBattleResources - > secretBase - > party . moves [ i * 4 + j ] ) ;
SetMonData ( & gEnemyParty [ i ] , MON_DATA_PP1 + j , & gBattleMoves [ gBattleResources - > secretBase - > party . moves [ i * 4 + j ] ] . pp ) ;
}
}
}
}
u8 GetSecretBaseTrainerPicIndex ( void )
{
2018-02-11 23:46:50 +01:00
u8 facilityClass = sSecretBaseFacilityClasses [ gBattleResources - > secretBase - > gender ] [ gBattleResources - > secretBase - > trainerId [ 0 ] % 5 ] ;
2018-02-11 17:35:01 +01:00
return gFacilityClassToPicIndex [ facilityClass ] ;
2018-02-09 18:46:00 +01:00
}
2018-02-11 17:35:01 +01:00
u8 GetSecretBaseTrainerClass ( void )
2018-02-09 18:46:00 +01:00
{
2018-02-11 23:46:50 +01:00
u8 facilityClass = sSecretBaseFacilityClasses [ gBattleResources - > secretBase - > gender ] [ gBattleResources - > secretBase - > trainerId [ 0 ] % 5 ] ;
2018-02-11 17:35:01 +01:00
return gFacilityClassToTrainerClass [ facilityClass ] ;
2018-02-09 18:46:00 +01:00
}
bool8 IsPlayerPartyAndPokemonStorageFull ( void )
{
s32 i ;
2018-02-11 17:35:01 +01:00
for ( i = 0 ; i < PARTY_SIZE ; i + + )
2018-02-09 18:46:00 +01:00
if ( GetMonData ( & gPlayerParty [ i ] , MON_DATA_SPECIES , NULL ) = = SPECIES_NONE )
return FALSE ;
return IsPokemonStorageFull ( ) ;
}
bool8 IsPokemonStorageFull ( void )
{
s32 i , j ;
2018-12-21 22:35:01 +01:00
for ( i = 0 ; i < TOTAL_BOXES_COUNT ; i + + )
for ( j = 0 ; j < IN_BOX_COUNT ; j + + )
2018-12-15 23:58:47 +01:00
if ( GetBoxMonDataAt ( i , j , MON_DATA_SPECIES ) = = SPECIES_NONE )
2018-02-09 18:46:00 +01:00
return FALSE ;
return TRUE ;
}
void GetSpeciesName ( u8 * name , u16 species )
{
s32 i ;
for ( i = 0 ; i < = POKEMON_NAME_LENGTH ; i + + )
{
if ( species > NUM_SPECIES )
name [ i ] = gSpeciesNames [ 0 ] [ i ] ;
else
name [ i ] = gSpeciesNames [ species ] [ i ] ;
if ( name [ i ] = = EOS )
break ;
}
name [ i ] = EOS ;
}
u8 CalculatePPWithBonus ( u16 move , u8 ppBonuses , u8 moveIndex )
{
u8 basePP = gBattleMoves [ move ] . pp ;
2019-02-19 10:09:42 +01:00
return basePP + ( ( basePP * 20 * ( ( gPPUpGetMask [ moveIndex ] & ppBonuses ) > > ( 2 * moveIndex ) ) ) / 100 ) ;
2018-02-09 18:46:00 +01:00
}
void RemoveMonPPBonus ( struct Pokemon * mon , u8 moveIndex )
{
u8 ppBonuses = GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) ;
2019-02-19 10:09:42 +01:00
ppBonuses & = gPPUpSetMask [ moveIndex ] ;
2018-02-09 18:46:00 +01:00
SetMonData ( mon , MON_DATA_PP_BONUSES , & ppBonuses ) ;
}
void RemoveBattleMonPPBonus ( struct BattlePokemon * mon , u8 moveIndex )
{
2019-02-19 10:09:42 +01:00
mon - > ppBonuses & = gPPUpSetMask [ moveIndex ] ;
2018-02-09 18:46:00 +01:00
}
2018-02-11 17:35:01 +01:00
void CopyPlayerPartyMonToBattleData ( u8 battlerId , u8 partyIndex )
2018-02-09 18:46:00 +01:00
{
u16 * hpSwitchout ;
s32 i ;
u8 nickname [ POKEMON_NAME_LENGTH * 2 ] ;
2018-02-11 17:35:01 +01:00
gBattleMons [ battlerId ] . species = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_SPECIES , NULL ) ;
gBattleMons [ battlerId ] . item = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_HELD_ITEM , NULL ) ;
2018-02-09 18:46:00 +01:00
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-09 18:46:00 +01:00
{
2018-02-11 17:35:01 +01:00
gBattleMons [ battlerId ] . moves [ i ] = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_MOVE1 + i , NULL ) ;
gBattleMons [ battlerId ] . pp [ i ] = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_PP1 + i , NULL ) ;
}
gBattleMons [ battlerId ] . ppBonuses = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_PP_BONUSES , NULL ) ;
gBattleMons [ battlerId ] . friendship = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_FRIENDSHIP , NULL ) ;
gBattleMons [ battlerId ] . experience = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_EXP , NULL ) ;
gBattleMons [ battlerId ] . hpIV = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_HP_IV , NULL ) ;
gBattleMons [ battlerId ] . attackIV = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_ATK_IV , NULL ) ;
gBattleMons [ battlerId ] . defenseIV = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_DEF_IV , NULL ) ;
gBattleMons [ battlerId ] . speedIV = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_SPEED_IV , NULL ) ;
gBattleMons [ battlerId ] . spAttackIV = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_SPATK_IV , NULL ) ;
gBattleMons [ battlerId ] . spDefenseIV = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_SPDEF_IV , NULL ) ;
gBattleMons [ battlerId ] . personality = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_PERSONALITY , NULL ) ;
gBattleMons [ battlerId ] . status1 = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_STATUS , NULL ) ;
gBattleMons [ battlerId ] . level = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_LEVEL , NULL ) ;
gBattleMons [ battlerId ] . hp = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_HP , NULL ) ;
gBattleMons [ battlerId ] . maxHP = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_MAX_HP , NULL ) ;
gBattleMons [ battlerId ] . attack = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_ATK , NULL ) ;
gBattleMons [ battlerId ] . defense = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_DEF , NULL ) ;
gBattleMons [ battlerId ] . speed = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_SPEED , NULL ) ;
gBattleMons [ battlerId ] . spAttack = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_SPATK , NULL ) ;
gBattleMons [ battlerId ] . spDefense = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_SPDEF , NULL ) ;
gBattleMons [ battlerId ] . isEgg = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_IS_EGG , NULL ) ;
2019-05-14 15:22:16 +02:00
gBattleMons [ battlerId ] . abilityNum = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_ABILITY_NUM , NULL ) ;
2018-02-11 17:35:01 +01:00
gBattleMons [ battlerId ] . otId = GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_OT_ID , NULL ) ;
gBattleMons [ battlerId ] . type1 = gBaseStats [ gBattleMons [ battlerId ] . species ] . type1 ;
gBattleMons [ battlerId ] . type2 = gBaseStats [ gBattleMons [ battlerId ] . species ] . type2 ;
2019-05-14 15:22:16 +02:00
gBattleMons [ battlerId ] . ability = GetAbilityBySpecies ( gBattleMons [ battlerId ] . species , gBattleMons [ battlerId ] . abilityNum ) ;
2018-02-09 18:46:00 +01:00
GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_NICKNAME , nickname ) ;
2018-02-11 17:35:01 +01:00
StringCopy10 ( gBattleMons [ battlerId ] . nickname , nickname ) ;
GetMonData ( & gPlayerParty [ partyIndex ] , MON_DATA_OT_NAME , gBattleMons [ battlerId ] . otName ) ;
2018-02-09 18:46:00 +01:00
2018-02-11 17:35:01 +01:00
hpSwitchout = & gBattleStruct - > hpOnSwitchout [ GetBattlerSide ( battlerId ) ] ;
* hpSwitchout = gBattleMons [ battlerId ] . hp ;
2018-02-09 18:46:00 +01:00
for ( i = 0 ; i < 8 ; i + + )
2018-02-11 17:35:01 +01:00
gBattleMons [ battlerId ] . statStages [ i ] = 6 ;
2018-02-09 18:46:00 +01:00
2018-02-11 17:35:01 +01:00
gBattleMons [ battlerId ] . status2 = 0 ;
sub_803FA70 ( battlerId ) ;
ClearTemporarySpeciesSpriteData ( battlerId , FALSE ) ;
2018-02-09 18:46:00 +01:00
}
2018-02-11 17:35:01 +01:00
bool8 ExecuteTableBasedItemEffect ( struct Pokemon * mon , u16 item , u8 partyIndex , u8 moveIndex )
2018-02-09 18:46:00 +01:00
{
return PokemonUseItemEffects ( mon , item , partyIndex , moveIndex , 0 ) ;
}
bool8 PokemonUseItemEffects ( struct Pokemon * mon , u16 item , u8 partyIndex , u8 moveIndex , u8 e )
{
u32 dataUnsigned ;
s32 dataSigned ;
s32 friendship ;
s32 cmdIndex ;
bool8 retVal = TRUE ;
const u8 * itemEffect ;
u8 var_3C = 6 ;
u32 var_38 ;
s8 var_34 = 0 ;
u8 holdEffect ;
u8 battlerId = 4 ;
u32 var_28 = 0 ;
u16 heldItem ;
u8 r10 ;
u32 r4 ;
u32 r5 ;
s8 r2 ;
u16 evCount ;
heldItem = GetMonData ( mon , MON_DATA_HELD_ITEM , NULL ) ;
if ( heldItem = = ITEM_ENIGMA_BERRY )
{
if ( gMain . inBattle )
2018-02-11 23:46:50 +01:00
holdEffect = gEnigmaBerries [ gBattlerInMenuId ] . holdEffect ;
2018-02-09 18:46:00 +01:00
else
holdEffect = gSaveBlock1Ptr - > enigmaBerry . holdEffect ;
}
else
{
holdEffect = ItemId_GetHoldEffect ( heldItem ) ;
}
2018-02-11 23:46:50 +01:00
gPotentialItemEffectBattler = gBattlerInMenuId ;
2018-02-09 18:46:00 +01:00
if ( gMain . inBattle )
{
2018-02-11 23:46:50 +01:00
gActiveBattler = gBattlerInMenuId ;
2018-02-09 18:46:00 +01:00
cmdIndex = ( GetBattlerSide ( gActiveBattler ) ! = B_SIDE_PLAYER ) ;
while ( cmdIndex < gBattlersCount )
{
if ( gBattlerPartyIndexes [ cmdIndex ] = = partyIndex )
{
battlerId = cmdIndex ;
break ;
}
cmdIndex + = 2 ;
}
}
else
{
gActiveBattler = 0 ;
battlerId = MAX_BATTLERS_COUNT ;
}
2019-04-14 17:20:26 +02:00
if ( ! ITEM_HAS_EFFECT ( item ) )
2018-02-09 18:46:00 +01:00
return TRUE ;
2019-04-14 17:20:26 +02:00
if ( gItemEffectTable [ item - ITEM_POTION ] = = NULL & & item ! = ITEM_ENIGMA_BERRY )
2018-02-09 18:46:00 +01:00
return TRUE ;
if ( item = = ITEM_ENIGMA_BERRY )
{
if ( gMain . inBattle )
itemEffect = gEnigmaBerries [ gActiveBattler ] . itemEffect ;
else
itemEffect = gSaveBlock1Ptr - > enigmaBerry . itemEffect ;
}
else
{
2019-04-14 17:20:26 +02:00
itemEffect = gItemEffectTable [ item - ITEM_POTION ] ;
2018-02-09 18:46:00 +01:00
}
for ( cmdIndex = 0 ; cmdIndex < 6 ; cmdIndex + + )
{
switch ( cmdIndex )
{
2019-04-14 17:20:26 +02:00
// infatuation heal, x attack, sacred ash and dire hit
2018-02-09 18:46:00 +01:00
case 0 :
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM0_INFATUATION )
& & gMain . inBattle & & battlerId ! = MAX_BATTLERS_COUNT & & ( gBattleMons [ battlerId ] . status2 & STATUS2_INFATUATION ) )
2018-02-09 18:46:00 +01:00
{
gBattleMons [ battlerId ] . status2 & = ~ STATUS2_INFATUATION ;
retVal = FALSE ;
}
2019-12-22 01:01:38 +01:00
if ( ( itemEffect [ cmdIndex ] & ITEM0_DIRE_HIT )
2018-02-09 18:46:00 +01:00
& & ! ( gBattleMons [ gActiveBattler ] . status2 & STATUS2_FOCUS_ENERGY ) )
{
gBattleMons [ gActiveBattler ] . status2 | = STATUS2_FOCUS_ENERGY ;
retVal = FALSE ;
}
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM0_X_ATTACK )
2018-02-11 23:46:50 +01:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_ATK ] < 12 )
2018-02-09 18:46:00 +01:00
{
2019-04-14 17:20:26 +02:00
gBattleMons [ gActiveBattler ] . statStages [ STAT_ATK ] + = itemEffect [ cmdIndex ] & ITEM0_X_ATTACK ;
2018-02-11 23:46:50 +01:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_ATK ] > 12 )
gBattleMons [ gActiveBattler ] . statStages [ STAT_ATK ] = 12 ;
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
}
break ;
2019-04-14 17:20:26 +02:00
// in-battle stat boosting effects
2018-02-09 18:46:00 +01:00
case 1 :
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM1_X_DEFEND )
2018-02-11 23:46:50 +01:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_DEF ] < 12 )
2018-02-09 18:46:00 +01:00
{
2019-04-14 17:20:26 +02:00
gBattleMons [ gActiveBattler ] . statStages [ STAT_DEF ] + = ( itemEffect [ cmdIndex ] & ITEM1_X_DEFEND ) > > 4 ;
2018-02-11 23:46:50 +01:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_DEF ] > 12 )
gBattleMons [ gActiveBattler ] . statStages [ STAT_DEF ] = 12 ;
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
}
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM1_X_SPEED )
2018-02-11 23:46:50 +01:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_SPEED ] < 12 )
2018-02-09 18:46:00 +01:00
{
2019-04-14 17:20:26 +02:00
gBattleMons [ gActiveBattler ] . statStages [ STAT_SPEED ] + = itemEffect [ cmdIndex ] & ITEM1_X_SPEED ;
2018-02-11 23:46:50 +01:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_SPEED ] > 12 )
gBattleMons [ gActiveBattler ] . statStages [ STAT_SPEED ] = 12 ;
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
}
break ;
2019-04-14 17:20:26 +02:00
// more stat boosting effects
2018-02-09 18:46:00 +01:00
case 2 :
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM2_X_ACCURACY )
2018-02-11 23:46:50 +01:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_ACC ] < 12 )
2018-02-09 18:46:00 +01:00
{
2019-04-14 17:20:26 +02:00
gBattleMons [ gActiveBattler ] . statStages [ STAT_ACC ] + = ( itemEffect [ cmdIndex ] & ITEM2_X_ACCURACY ) > > 4 ;
2018-02-11 23:46:50 +01:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_ACC ] > 12 )
gBattleMons [ gActiveBattler ] . statStages [ STAT_ACC ] = 12 ;
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
}
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM2_X_SPATK )
2018-02-11 23:46:50 +01:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_SPATK ] < 12 )
2018-02-09 18:46:00 +01:00
{
2019-04-14 17:20:26 +02:00
gBattleMons [ gActiveBattler ] . statStages [ STAT_SPATK ] + = itemEffect [ cmdIndex ] & ITEM2_X_SPATK ;
2018-02-11 23:46:50 +01:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_SPATK ] > 12 )
gBattleMons [ gActiveBattler ] . statStages [ STAT_SPATK ] = 12 ;
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
}
break ;
case 3 :
2019-12-22 01:01:38 +01:00
if ( ( itemEffect [ cmdIndex ] & ITEM3_GUARD_SPEC )
2018-02-09 18:46:00 +01:00
& & gSideTimers [ GetBattlerSide ( gActiveBattler ) ] . mistTimer = = 0 )
{
gSideTimers [ GetBattlerSide ( gActiveBattler ) ] . mistTimer = 5 ;
retVal = FALSE ;
}
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM3_LEVEL_UP )
2018-10-17 04:47:08 +02:00
& & GetMonData ( mon , MON_DATA_LEVEL , NULL ) ! = MAX_LEVEL )
2018-02-09 18:46:00 +01:00
{
dataUnsigned = gExperienceTables [ gBaseStats [ GetMonData ( mon , MON_DATA_SPECIES , NULL ) ] . growthRate ] [ GetMonData ( mon , MON_DATA_LEVEL , NULL ) + 1 ] ;
SetMonData ( mon , MON_DATA_EXP , & dataUnsigned ) ;
CalculateMonStats ( mon ) ;
retVal = FALSE ;
}
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM3_SLEEP )
2018-02-09 18:46:00 +01:00
& & HealStatusConditions ( mon , partyIndex , 7 , battlerId ) = = 0 )
{
if ( battlerId ! = 4 )
gBattleMons [ battlerId ] . status2 & = ~ STATUS2_NIGHTMARE ;
retVal = FALSE ;
}
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM3_POISON ) & & HealStatusConditions ( mon , partyIndex , STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER , battlerId ) = = 0 )
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM3_BURN ) & & HealStatusConditions ( mon , partyIndex , STATUS1_BURN , battlerId ) = = 0 )
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM3_FREEZE ) & & HealStatusConditions ( mon , partyIndex , STATUS1_FREEZE , battlerId ) = = 0 )
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM3_PARALYSIS ) & & HealStatusConditions ( mon , partyIndex , STATUS1_PARALYSIS , battlerId ) = = 0 )
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM3_CONFUSION ) // heal confusion
& & gMain . inBattle & & battlerId ! = MAX_BATTLERS_COUNT & & ( gBattleMons [ battlerId ] . status2 & STATUS2_CONFUSION ) )
2018-02-09 18:46:00 +01:00
{
gBattleMons [ battlerId ] . status2 & = ~ STATUS2_CONFUSION ;
retVal = FALSE ;
}
break ;
// EV, HP, and PP raising effects
case 4 :
r10 = itemEffect [ cmdIndex ] ;
2019-04-14 17:20:26 +02:00
if ( r10 & ITEM4_PP_UP )
2018-02-09 18:46:00 +01:00
{
2019-04-14 17:20:26 +02:00
r10 & = ~ ITEM4_PP_UP ;
2019-02-19 10:09:42 +01:00
dataUnsigned = ( GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) & gPPUpGetMask [ moveIndex ] ) > > ( moveIndex * 2 ) ;
2018-02-09 18:46:00 +01:00
var_38 = CalculatePPWithBonus ( GetMonData ( mon , MON_DATA_MOVE1 + moveIndex , NULL ) , GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) , moveIndex ) ;
if ( dataUnsigned < = 2 & & var_38 > 4 )
{
2019-02-19 10:09:42 +01:00
dataUnsigned = GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) + gPPUpAddMask [ moveIndex ] ;
2018-02-09 18:46:00 +01:00
SetMonData ( mon , MON_DATA_PP_BONUSES , & dataUnsigned ) ;
dataUnsigned = CalculatePPWithBonus ( GetMonData ( mon , MON_DATA_MOVE1 + moveIndex , NULL ) , dataUnsigned , moveIndex ) - var_38 ;
dataUnsigned = GetMonData ( mon , MON_DATA_PP1 + moveIndex , NULL ) + dataUnsigned ;
SetMonData ( mon , MON_DATA_PP1 + moveIndex , & dataUnsigned ) ;
retVal = FALSE ;
}
}
var_38 = 0 ;
while ( r10 ! = 0 )
{
if ( r10 & 1 )
{
switch ( var_38 )
{
case 0 :
case 1 :
2019-04-14 17:20:26 +02:00
// ev raise
2018-02-09 18:46:00 +01:00
evCount = GetMonEVCount ( mon ) ;
r5 = itemEffect [ var_3C ] ;
2018-02-11 23:46:50 +01:00
dataSigned = GetMonData ( mon , sGetMonDataEVConstants [ var_38 ] , NULL ) ;
2018-02-09 18:46:00 +01:00
r2 = r5 ;
if ( r2 > 0 )
{
if ( evCount > = MAX_TOTAL_EVS )
return TRUE ;
2019-09-17 21:24:44 +02:00
if ( dataSigned > = EV_ITEM_RAISE_LIMIT )
2018-02-09 18:46:00 +01:00
break ;
2019-09-17 21:24:44 +02:00
if ( dataSigned + r2 > EV_ITEM_RAISE_LIMIT )
r5 = EV_ITEM_RAISE_LIMIT - ( dataSigned + r2 ) + r2 ;
2018-02-09 18:46:00 +01:00
else
r5 = r2 ;
if ( evCount + r5 > MAX_TOTAL_EVS )
r5 + = MAX_TOTAL_EVS - ( evCount + r5 ) ;
dataSigned + = r5 ;
}
else
{
if ( dataSigned = = 0 )
{
var_28 = 1 ;
var_3C + + ;
break ;
}
dataSigned + = r2 ;
if ( dataSigned < 0 )
dataSigned = 0 ;
}
2018-02-11 23:46:50 +01:00
SetMonData ( mon , sGetMonDataEVConstants [ var_38 ] , & dataSigned ) ;
2018-02-09 18:46:00 +01:00
CalculateMonStats ( mon ) ;
var_3C + + ;
retVal = FALSE ;
break ;
case 2 :
2019-04-14 17:20:26 +02:00
// revive
2018-02-09 18:46:00 +01:00
if ( r10 & 0x10 )
{
if ( GetMonData ( mon , MON_DATA_HP , NULL ) ! = 0 )
{
var_3C + + ;
break ;
}
if ( gMain . inBattle )
{
if ( battlerId ! = 4 )
{
gAbsentBattlerFlags & = ~ gBitTable [ battlerId ] ;
2019-10-26 03:55:01 +02:00
CopyPlayerPartyMonToBattleData ( battlerId , GetPartyIdFromBattlePartyId ( gBattlerPartyIndexes [ battlerId ] ) ) ;
2019-01-19 22:32:25 +01:00
if ( GetBattlerSide ( gActiveBattler ) = = B_SIDE_PLAYER & & gBattleResults . numRevivesUsed < 255 )
gBattleResults . numRevivesUsed + + ;
2018-02-09 18:46:00 +01:00
}
else
{
gAbsentBattlerFlags & = ~ gBitTable [ gActiveBattler ^ 2 ] ;
2019-01-19 22:32:25 +01:00
if ( GetBattlerSide ( gActiveBattler ) = = B_SIDE_PLAYER & & gBattleResults . numRevivesUsed < 255 )
gBattleResults . numRevivesUsed + + ;
2018-02-09 18:46:00 +01:00
}
}
}
else
{
if ( GetMonData ( mon , MON_DATA_HP , NULL ) = = 0 )
{
var_3C + + ;
break ;
}
}
dataUnsigned = itemEffect [ var_3C + + ] ;
switch ( dataUnsigned )
{
case 0xFF :
dataUnsigned = GetMonData ( mon , MON_DATA_MAX_HP , NULL ) - GetMonData ( mon , MON_DATA_HP , NULL ) ;
break ;
case 0xFE :
dataUnsigned = GetMonData ( mon , MON_DATA_MAX_HP , NULL ) / 2 ;
if ( dataUnsigned = = 0 )
dataUnsigned = 1 ;
break ;
case 0xFD :
dataUnsigned = gBattleScripting . field_23 ;
break ;
}
if ( GetMonData ( mon , MON_DATA_MAX_HP , NULL ) ! = GetMonData ( mon , MON_DATA_HP , NULL ) )
{
if ( e = = 0 )
{
dataUnsigned = GetMonData ( mon , MON_DATA_HP , NULL ) + dataUnsigned ;
if ( dataUnsigned > GetMonData ( mon , MON_DATA_MAX_HP , NULL ) )
dataUnsigned = GetMonData ( mon , MON_DATA_MAX_HP , NULL ) ;
SetMonData ( mon , MON_DATA_HP , & dataUnsigned ) ;
if ( gMain . inBattle & & battlerId ! = 4 )
{
gBattleMons [ battlerId ] . hp = dataUnsigned ;
if ( ! ( r10 & 0x10 ) & & GetBattlerSide ( gActiveBattler ) = = B_SIDE_PLAYER )
{
2019-01-19 22:32:25 +01:00
if ( gBattleResults . numHealingItemsUsed < 255 )
gBattleResults . numHealingItemsUsed + + ;
2018-02-09 18:46:00 +01:00
// I have to re-use this variable to match.
r5 = gActiveBattler ;
gActiveBattler = battlerId ;
2018-09-20 11:55:35 +02:00
BtlController_EmitGetMonData ( 0 , REQUEST_ALL_BATTLE , 0 ) ;
2018-02-09 18:46:00 +01:00
MarkBattlerForControllerExec ( gActiveBattler ) ;
gActiveBattler = r5 ;
}
}
}
else
{
gBattleMoveDamage = - dataUnsigned ;
}
retVal = FALSE ;
}
r10 & = 0xEF ;
break ;
case 3 :
2019-04-14 17:20:26 +02:00
// Heal pp in all moves.
2018-02-09 18:46:00 +01:00
if ( ! ( r10 & 2 ) )
{
for ( r5 = 0 ; ( signed ) ( r5 ) < ( signed ) ( 4 ) ; r5 + + )
{
u16 moveId ;
dataUnsigned = GetMonData ( mon , MON_DATA_PP1 + r5 , NULL ) ;
moveId = GetMonData ( mon , MON_DATA_MOVE1 + r5 , NULL ) ;
if ( dataUnsigned ! = CalculatePPWithBonus ( moveId , GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) , r5 ) )
{
dataUnsigned + = itemEffect [ var_3C ] ;
moveId = GetMonData ( mon , MON_DATA_MOVE1 + r5 , NULL ) ;
if ( dataUnsigned > CalculatePPWithBonus ( moveId , GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) , r5 ) )
{
moveId = GetMonData ( mon , MON_DATA_MOVE1 + r5 , NULL ) ;
dataUnsigned = CalculatePPWithBonus ( moveId , GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) , r5 ) ;
}
SetMonData ( mon , MON_DATA_PP1 + r5 , & dataUnsigned ) ;
if ( gMain . inBattle
2019-04-14 17:20:26 +02:00
& & battlerId ! = MAX_BATTLERS_COUNT & & ! ( gBattleMons [ battlerId ] . status2 & STATUS2_TRANSFORMED )
2019-01-19 22:32:25 +01:00
& & ! ( gDisableStructs [ battlerId ] . mimickedMoves & gBitTable [ r5 ] ) )
2018-02-09 18:46:00 +01:00
gBattleMons [ battlerId ] . pp [ r5 ] = dataUnsigned ;
retVal = FALSE ;
}
}
var_3C + + ;
}
2019-04-14 17:20:26 +02:00
// Heal pp in one move.
2018-02-09 18:46:00 +01:00
else
{
u16 moveId ;
dataUnsigned = GetMonData ( mon , MON_DATA_PP1 + moveIndex , NULL ) ;
moveId = GetMonData ( mon , MON_DATA_MOVE1 + moveIndex , NULL ) ;
if ( dataUnsigned ! = CalculatePPWithBonus ( moveId , GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) , moveIndex ) )
{
dataUnsigned + = itemEffect [ var_3C + + ] ;
moveId = GetMonData ( mon , MON_DATA_MOVE1 + moveIndex , NULL ) ;
if ( dataUnsigned > CalculatePPWithBonus ( moveId , GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) , moveIndex ) )
{
moveId = GetMonData ( mon , MON_DATA_MOVE1 + moveIndex , NULL ) ;
dataUnsigned = CalculatePPWithBonus ( moveId , GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) , moveIndex ) ;
}
SetMonData ( mon , MON_DATA_PP1 + moveIndex , & dataUnsigned ) ;
if ( gMain . inBattle
& & battlerId ! = 4 & & ! ( gBattleMons [ battlerId ] . status2 & STATUS2_TRANSFORMED )
2019-01-19 22:32:25 +01:00
& & ! ( gDisableStructs [ battlerId ] . mimickedMoves & gBitTable [ moveIndex ] ) )
2018-02-09 18:46:00 +01:00
gBattleMons [ battlerId ] . pp [ moveIndex ] = dataUnsigned ;
retVal = FALSE ;
}
}
break ;
2019-04-14 17:20:26 +02:00
// Evolution stone
2018-02-09 18:46:00 +01:00
case 7 :
{
u16 targetSpecies = GetEvolutionTargetSpecies ( mon , 2 , item ) ;
if ( targetSpecies ! = SPECIES_NONE )
{
BeginEvolutionScene ( mon , targetSpecies , 0 , partyIndex ) ;
return FALSE ;
}
}
break ;
}
}
var_38 + + ;
r10 > > = 1 ;
}
break ;
2019-04-14 17:20:26 +02:00
// EV and friendship
2018-02-09 18:46:00 +01:00
case 5 :
r10 = itemEffect [ cmdIndex ] ;
var_38 = 0 ;
while ( r10 ! = 0 )
{
if ( r10 & 1 )
{
switch ( var_38 )
{
case 0 :
case 1 :
case 2 :
case 3 :
evCount = GetMonEVCount ( mon ) ;
r5 = itemEffect [ var_3C ] ;
2018-02-11 23:46:50 +01:00
dataSigned = GetMonData ( mon , sGetMonDataEVConstants [ var_38 + 2 ] , NULL ) ;
2018-02-09 18:46:00 +01:00
r2 = r5 ;
if ( r2 > 0 )
{
if ( evCount > = MAX_TOTAL_EVS )
return TRUE ;
2019-09-17 21:24:44 +02:00
if ( dataSigned > = EV_ITEM_RAISE_LIMIT )
2018-02-09 18:46:00 +01:00
break ;
2019-09-17 21:24:44 +02:00
if ( dataSigned + r2 > EV_ITEM_RAISE_LIMIT )
r5 = EV_ITEM_RAISE_LIMIT - ( dataSigned + r2 ) + r2 ;
2018-02-09 18:46:00 +01:00
else
r5 = r2 ;
if ( evCount + r5 > MAX_TOTAL_EVS )
r5 + = MAX_TOTAL_EVS - ( evCount + r5 ) ;
dataSigned + = r5 ;
}
else
{
if ( dataSigned = = 0 )
{
var_28 = 1 ;
var_3C + + ;
break ;
}
dataSigned + = r2 ;
if ( dataSigned < 0 )
dataSigned = 0 ;
}
2018-02-11 23:46:50 +01:00
SetMonData ( mon , sGetMonDataEVConstants [ var_38 + 2 ] , & dataSigned ) ;
2018-02-09 18:46:00 +01:00
CalculateMonStats ( mon ) ;
retVal = FALSE ;
var_3C + + ;
break ;
case 4 :
2019-02-19 10:09:42 +01:00
dataUnsigned = ( GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) & gPPUpGetMask [ moveIndex ] ) > > ( moveIndex * 2 ) ;
2018-02-09 18:46:00 +01:00
r5 = CalculatePPWithBonus ( GetMonData ( mon , MON_DATA_MOVE1 + moveIndex , NULL ) , GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) , moveIndex ) ;
if ( dataUnsigned < 3 & & r5 > 4 )
{
dataUnsigned = GetMonData ( mon , MON_DATA_PP_BONUSES , NULL ) ;
2019-02-19 10:09:42 +01:00
dataUnsigned & = gPPUpSetMask [ moveIndex ] ;
dataUnsigned + = gPPUpAddMask [ moveIndex ] * 3 ;
2018-02-09 18:46:00 +01:00
SetMonData ( mon , MON_DATA_PP_BONUSES , & dataUnsigned ) ;
dataUnsigned = CalculatePPWithBonus ( GetMonData ( mon , MON_DATA_MOVE1 + moveIndex , NULL ) , dataUnsigned , moveIndex ) - r5 ;
dataUnsigned = GetMonData ( mon , MON_DATA_PP1 + moveIndex , NULL ) + dataUnsigned ;
SetMonData ( mon , MON_DATA_PP1 + moveIndex , & dataUnsigned ) ;
retVal = FALSE ;
}
break ;
case 5 :
2020-02-02 19:28:54 +01:00
if ( GetMonData ( mon , MON_DATA_FRIENDSHIP , NULL ) < 100 & & ( retVal = = 0 | | var_28 ! = 0 ) & & ! ShouldSkipFriendshipChange ( ) & & var_34 = = 0 )
2018-02-09 18:46:00 +01:00
{
var_34 = itemEffect [ var_3C ] ;
friendship = GetMonData ( mon , MON_DATA_FRIENDSHIP , NULL ) ;
if ( var_34 > 0 & & holdEffect = = HOLD_EFFECT_HAPPINESS_UP )
friendship + = 150 * var_34 / 100 ;
else
friendship + = var_34 ;
if ( var_34 > 0 )
{
2020-01-20 09:30:12 +01:00
if ( GetMonData ( mon , MON_DATA_POKEBALL , NULL ) = = ITEM_LUXURY_BALL )
2018-02-09 18:46:00 +01:00
friendship + + ;
2018-12-27 23:30:47 +01:00
if ( GetMonData ( mon , MON_DATA_MET_LOCATION , NULL ) = = GetCurrentRegionMapSectionId ( ) )
2018-02-09 18:46:00 +01:00
friendship + + ;
}
if ( friendship < 0 )
friendship = 0 ;
2019-12-18 08:32:52 +01:00
if ( friendship > MAX_FRIENDSHIP )
friendship = MAX_FRIENDSHIP ;
2018-02-09 18:46:00 +01:00
SetMonData ( mon , MON_DATA_FRIENDSHIP , & friendship ) ;
retVal = FALSE ;
}
var_3C + + ;
break ;
case 6 :
if ( GetMonData ( mon , MON_DATA_FRIENDSHIP , NULL ) > = 100 & & GetMonData ( mon , MON_DATA_FRIENDSHIP , NULL ) < 200
2020-02-02 19:28:54 +01:00
& & ( retVal = = 0 | | var_28 ! = 0 ) & & ! ShouldSkipFriendshipChange ( ) & & var_34 = = 0 )
2018-02-09 18:46:00 +01:00
{
var_34 = itemEffect [ var_3C ] ;
friendship = GetMonData ( mon , MON_DATA_FRIENDSHIP , NULL ) ;
if ( ( s8 ) ( var_34 ) > 0 & & holdEffect = = HOLD_EFFECT_HAPPINESS_UP )
friendship + = 150 * var_34 / 100 ;
else
friendship + = var_34 ;
if ( var_34 > 0 )
{
2020-01-20 09:30:12 +01:00
if ( GetMonData ( mon , MON_DATA_POKEBALL , NULL ) = = ITEM_LUXURY_BALL )
2018-02-09 18:46:00 +01:00
friendship + + ;
2018-12-27 23:30:47 +01:00
if ( GetMonData ( mon , MON_DATA_MET_LOCATION , NULL ) = = GetCurrentRegionMapSectionId ( ) )
2018-02-09 18:46:00 +01:00
friendship + + ;
}
if ( friendship < 0 )
friendship = 0 ;
2019-12-18 08:32:52 +01:00
if ( friendship > MAX_FRIENDSHIP )
friendship = MAX_FRIENDSHIP ;
2018-02-09 18:46:00 +01:00
SetMonData ( mon , MON_DATA_FRIENDSHIP , & friendship ) ;
retVal = FALSE ;
}
var_3C + + ;
break ;
case 7 :
2020-02-02 19:28:54 +01:00
if ( GetMonData ( mon , MON_DATA_FRIENDSHIP , NULL ) > = 200 & & ( retVal = = 0 | | var_28 ! = 0 ) & & ! ShouldSkipFriendshipChange ( ) & & var_34 = = 0 )
2018-02-09 18:46:00 +01:00
{
var_34 = itemEffect [ var_3C ] ;
friendship = GetMonData ( mon , MON_DATA_FRIENDSHIP , NULL ) ;
if ( ( s8 ) ( var_34 ) > 0 & & holdEffect = = HOLD_EFFECT_HAPPINESS_UP )
friendship + = 150 * var_34 / 100 ;
else
friendship + = var_34 ;
if ( var_34 > 0 )
{
2020-01-20 09:30:12 +01:00
if ( GetMonData ( mon , MON_DATA_POKEBALL , NULL ) = = ITEM_LUXURY_BALL )
2018-02-09 18:46:00 +01:00
friendship + + ;
2018-12-27 23:30:47 +01:00
if ( GetMonData ( mon , MON_DATA_MET_LOCATION , NULL ) = = GetCurrentRegionMapSectionId ( ) )
2018-02-09 18:46:00 +01:00
friendship + + ;
}
if ( friendship < 0 )
friendship = 0 ;
2019-12-18 08:32:52 +01:00
if ( friendship > MAX_FRIENDSHIP )
friendship = MAX_FRIENDSHIP ;
2018-02-09 18:46:00 +01:00
SetMonData ( mon , MON_DATA_FRIENDSHIP , & friendship ) ;
retVal = FALSE ;
}
var_3C + + ;
break ;
}
}
var_38 + + ;
r10 > > = 1 ;
}
break ;
}
}
return retVal ;
}
2018-02-11 17:35:01 +01:00
bool8 HealStatusConditions ( struct Pokemon * mon , u32 battlePartyId , u32 healMask , u8 battlerId )
2018-02-10 02:06:32 +01:00
{
u32 status = GetMonData ( mon , MON_DATA_STATUS , 0 ) ;
if ( status & healMask )
{
status & = ~ healMask ;
SetMonData ( mon , MON_DATA_STATUS , & status ) ;
2018-02-11 17:35:01 +01:00
if ( gMain . inBattle & & battlerId ! = MAX_BATTLERS_COUNT )
gBattleMons [ battlerId ] . status1 & = ~ healMask ;
2018-02-10 02:06:32 +01:00
return FALSE ;
}
else
{
return TRUE ;
}
}
u8 GetItemEffectParamOffset ( u16 itemId , u8 effectByte , u8 effectBit )
{
const u8 * temp ;
const u8 * itemEffect ;
u8 offset ;
int i ;
u8 j ;
u8 val ;
offset = 6 ;
2019-04-14 17:20:26 +02:00
temp = gItemEffectTable [ itemId - ITEM_POTION ] ;
2018-02-10 02:06:32 +01:00
if ( ! temp & & itemId ! = ITEM_ENIGMA_BERRY )
return 0 ;
if ( itemId = = ITEM_ENIGMA_BERRY )
{
temp = gEnigmaBerries [ gActiveBattler ] . itemEffect ;
}
itemEffect = temp ;
for ( i = 0 ; i < 6 ; i + + )
{
switch ( i )
{
case 0 :
case 1 :
case 2 :
case 3 :
if ( i = = effectByte )
return 0 ;
break ;
case 4 :
val = itemEffect [ 4 ] ;
2019-04-14 17:20:26 +02:00
if ( val & ITEM4_PP_UP )
val & = ~ ( ITEM4_PP_UP ) ;
2018-02-10 02:06:32 +01:00
j = 0 ;
while ( val )
{
if ( val & 1 )
{
switch ( j )
{
case 2 :
if ( val & 0x10 )
val & = 0xEF ;
case 0 :
if ( i = = effectByte & & ( val & effectBit ) )
return offset ;
offset + + ;
break ;
case 1 :
if ( i = = effectByte & & ( val & effectBit ) )
return offset ;
offset + + ;
break ;
case 3 :
if ( i = = effectByte & & ( val & effectBit ) )
return offset ;
offset + + ;
break ;
case 7 :
if ( i = = effectByte )
return 0 ;
break ;
}
}
j + + ;
val > > = 1 ;
if ( i = = effectByte )
effectBit > > = 1 ;
}
break ;
case 5 :
val = itemEffect [ 5 ] ;
j = 0 ;
while ( val )
{
if ( val & 1 )
{
switch ( j )
{
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
if ( i = = effectByte & & ( val & effectBit ) )
return offset ;
offset + + ;
break ;
case 7 :
if ( i = = effectByte )
return 0 ;
break ;
}
}
j + + ;
val > > = 1 ;
if ( i = = effectByte )
effectBit > > = 1 ;
}
break ;
}
}
return offset ;
}
2019-12-22 01:01:38 +01:00
static void BufferStatRoseMessage ( s32 arg0 )
2018-02-10 02:06:32 +01:00
{
2018-02-11 23:46:50 +01:00
gBattlerTarget = gBattlerInMenuId ;
2019-12-22 01:01:38 +01:00
StringCopy ( gBattleTextBuff1 , gStatNamesTable [ sStatsToRaise [ arg0 ] ] ) ;
2018-02-10 02:06:32 +01:00
StringCopy ( gBattleTextBuff2 , gText_StatRose ) ;
BattleStringExpandPlaceholdersToDisplayedString ( gText_PkmnsStatChanged2 ) ;
}
2019-12-22 01:01:38 +01:00
u8 * UseStatIncreaseItem ( u16 itemId )
2018-02-10 02:06:32 +01:00
{
int i ;
const u8 * itemEffect ;
if ( itemId = = ITEM_ENIGMA_BERRY )
{
if ( gMain . inBattle )
2018-02-11 23:46:50 +01:00
itemEffect = gEnigmaBerries [ gBattlerInMenuId ] . itemEffect ;
2018-02-10 02:06:32 +01:00
else
itemEffect = gSaveBlock1Ptr - > enigmaBerry . itemEffect ;
}
else
{
2019-04-14 17:20:26 +02:00
itemEffect = gItemEffectTable [ itemId - ITEM_POTION ] ;
2018-02-10 02:06:32 +01:00
}
2018-02-11 23:46:50 +01:00
gPotentialItemEffectBattler = gBattlerInMenuId ;
2018-02-10 02:06:32 +01:00
for ( i = 0 ; i < 3 ; i + + )
{
2019-12-22 01:01:38 +01:00
if ( itemEffect [ i ] & ( ITEM0_X_ATTACK | ITEM1_X_SPEED | ITEM2_X_SPATK ) )
BufferStatRoseMessage ( i * 2 ) ;
if ( itemEffect [ i ] & ( ITEM0_DIRE_HIT | ITEM1_X_DEFEND | ITEM2_X_ACCURACY ) )
2018-02-10 02:06:32 +01:00
{
2019-12-22 01:01:38 +01:00
if ( i ! = 0 ) // Dire Hit is the only ITEM0 above
2018-02-10 02:06:32 +01:00
{
2019-12-22 01:01:38 +01:00
BufferStatRoseMessage ( i * 2 + 1 ) ;
2018-02-10 02:06:32 +01:00
}
else
{
2018-02-11 23:46:50 +01:00
gBattlerAttacker = gBattlerInMenuId ;
2018-02-10 02:06:32 +01:00
BattleStringExpandPlaceholdersToDisplayedString ( gText_PkmnGettingPumped ) ;
}
}
}
2019-12-22 01:01:38 +01:00
if ( itemEffect [ 3 ] & ITEM3_GUARD_SPEC )
2018-02-10 02:06:32 +01:00
{
2018-02-11 23:46:50 +01:00
gBattlerAttacker = gBattlerInMenuId ;
2018-02-10 02:06:32 +01:00
BattleStringExpandPlaceholdersToDisplayedString ( gText_PkmnShroudedInMist ) ;
}
return gDisplayedStringBattle ;
}
u8 GetNature ( struct Pokemon * mon )
{
2020-07-17 02:12:12 +02:00
return GetMonData ( mon , MON_DATA_PERSONALITY , 0 ) % NUM_NATURES ;
2018-02-10 02:06:32 +01:00
}
u8 GetNatureFromPersonality ( u32 personality )
{
2020-07-17 02:12:12 +02:00
return personality % NUM_NATURES ;
2018-02-10 02:06:32 +01:00
}
u16 GetEvolutionTargetSpecies ( struct Pokemon * mon , u8 type , u16 evolutionItem )
{
int i ;
u16 targetSpecies = 0 ;
u16 species = GetMonData ( mon , MON_DATA_SPECIES , 0 ) ;
u16 heldItem = GetMonData ( mon , MON_DATA_HELD_ITEM , 0 ) ;
u32 personality = GetMonData ( mon , MON_DATA_PERSONALITY , 0 ) ;
u8 level ;
u16 friendship ;
u8 beauty = GetMonData ( mon , MON_DATA_BEAUTY , 0 ) ;
u16 upperPersonality = personality > > 16 ;
u8 holdEffect ;
if ( heldItem = = ITEM_ENIGMA_BERRY )
holdEffect = gSaveBlock1Ptr - > enigmaBerry . holdEffect ;
else
holdEffect = ItemId_GetHoldEffect ( heldItem ) ;
2018-07-01 15:28:57 +02:00
if ( holdEffect = = HOLD_EFFECT_PREVENT_EVOLVE & & type ! = 3 )
2018-07-16 20:47:30 +02:00
return SPECIES_NONE ;
2018-02-10 02:06:32 +01:00
switch ( type )
{
case 0 :
level = GetMonData ( mon , MON_DATA_LEVEL , 0 ) ;
friendship = GetMonData ( mon , MON_DATA_FRIENDSHIP , 0 ) ;
2018-07-16 20:47:30 +02:00
for ( i = 0 ; i < EVOS_PER_MON ; i + + )
2018-02-10 02:06:32 +01:00
{
switch ( gEvolutionTable [ species ] [ i ] . method )
{
case EVO_FRIENDSHIP :
if ( friendship > = 220 )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_FRIENDSHIP_DAY :
RtcCalcLocalTime ( ) ;
if ( gLocalTime . hours > = 12 & & gLocalTime . hours < 24 & & friendship > = 220 )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_FRIENDSHIP_NIGHT :
RtcCalcLocalTime ( ) ;
if ( gLocalTime . hours > = 0 & & gLocalTime . hours < 12 & & friendship > = 220 )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_LEVEL :
if ( gEvolutionTable [ species ] [ i ] . param < = level )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_LEVEL_ATK_GT_DEF :
if ( gEvolutionTable [ species ] [ i ] . param < = level )
if ( GetMonData ( mon , MON_DATA_ATK , 0 ) > GetMonData ( mon , MON_DATA_DEF , 0 ) )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_LEVEL_ATK_EQ_DEF :
if ( gEvolutionTable [ species ] [ i ] . param < = level )
if ( GetMonData ( mon , MON_DATA_ATK , 0 ) = = GetMonData ( mon , MON_DATA_DEF , 0 ) )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_LEVEL_ATK_LT_DEF :
if ( gEvolutionTable [ species ] [ i ] . param < = level )
if ( GetMonData ( mon , MON_DATA_ATK , 0 ) < GetMonData ( mon , MON_DATA_DEF , 0 ) )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_LEVEL_SILCOON :
if ( gEvolutionTable [ species ] [ i ] . param < = level & & ( upperPersonality % 10 ) < = 4 )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_LEVEL_CASCOON :
if ( gEvolutionTable [ species ] [ i ] . param < = level & & ( upperPersonality % 10 ) > 4 )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_LEVEL_NINJASK :
if ( gEvolutionTable [ species ] [ i ] . param < = level )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_BEAUTY :
if ( gEvolutionTable [ species ] [ i ] . param < = beauty )
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
}
}
break ;
case 1 :
2018-07-16 20:47:30 +02:00
for ( i = 0 ; i < EVOS_PER_MON ; i + + )
2018-02-10 02:06:32 +01:00
{
switch ( gEvolutionTable [ species ] [ i ] . method )
{
case EVO_TRADE :
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
case EVO_TRADE_ITEM :
if ( gEvolutionTable [ species ] [ i ] . param = = heldItem )
{
heldItem = 0 ;
2019-04-03 22:00:15 +02:00
SetMonData ( mon , MON_DATA_HELD_ITEM , & heldItem ) ;
2018-02-10 02:06:32 +01:00
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
}
break ;
}
}
break ;
case 2 :
case 3 :
2018-07-16 20:47:30 +02:00
for ( i = 0 ; i < EVOS_PER_MON ; i + + )
2018-02-10 02:06:32 +01:00
{
if ( gEvolutionTable [ species ] [ i ] . method = = EVO_ITEM
& & gEvolutionTable [ species ] [ i ] . param = = evolutionItem )
{
targetSpecies = gEvolutionTable [ species ] [ i ] . targetSpecies ;
break ;
}
}
break ;
}
return targetSpecies ;
}
u16 HoennPokedexNumToSpecies ( u16 hoennNum )
{
u16 species ;
if ( ! hoennNum )
return 0 ;
species = 0 ;
2018-12-15 21:12:28 +01:00
while ( species < ( NUM_SPECIES - 1 ) & & gSpeciesToHoennPokedexNum [ species ] ! = hoennNum )
2018-02-10 02:06:32 +01:00
species + + ;
2018-12-15 21:12:28 +01:00
if ( species = = NUM_SPECIES - 1 )
2018-02-10 02:06:32 +01:00
return 0 ;
return species + 1 ;
}
u16 NationalPokedexNumToSpecies ( u16 nationalNum )
{
u16 species ;
if ( ! nationalNum )
return 0 ;
species = 0 ;
2018-12-15 21:12:28 +01:00
while ( species < ( NUM_SPECIES - 1 ) & & gSpeciesToNationalPokedexNum [ species ] ! = nationalNum )
2018-02-10 02:06:32 +01:00
species + + ;
2018-12-15 21:12:28 +01:00
if ( species = = NUM_SPECIES - 1 )
2018-02-10 02:06:32 +01:00
return 0 ;
return species + 1 ;
}
u16 NationalToHoennOrder ( u16 nationalNum )
{
u16 hoennNum ;
if ( ! nationalNum )
return 0 ;
hoennNum = 0 ;
2018-12-15 21:12:28 +01:00
while ( hoennNum < ( NUM_SPECIES - 1 ) & & gHoennToNationalOrder [ hoennNum ] ! = nationalNum )
2018-02-10 02:06:32 +01:00
hoennNum + + ;
2018-12-15 21:12:28 +01:00
if ( hoennNum = = NUM_SPECIES - 1 )
2018-02-10 02:06:32 +01:00
return 0 ;
return hoennNum + 1 ;
}
u16 SpeciesToNationalPokedexNum ( u16 species )
{
if ( ! species )
return 0 ;
return gSpeciesToNationalPokedexNum [ species - 1 ] ;
}
u16 SpeciesToHoennPokedexNum ( u16 species )
{
if ( ! species )
return 0 ;
return gSpeciesToHoennPokedexNum [ species - 1 ] ;
}
u16 HoennToNationalOrder ( u16 hoennNum )
{
if ( ! hoennNum )
return 0 ;
return gHoennToNationalOrder [ hoennNum - 1 ] ;
}
u16 SpeciesToCryId ( u16 species )
{
2018-12-17 18:28:11 +01:00
if ( species < = SPECIES_CELEBI - 1 )
2018-02-10 02:06:32 +01:00
return species ;
2018-12-17 18:28:11 +01:00
if ( species < SPECIES_TREECKO - 1 )
2018-12-18 15:20:43 +01:00
return SPECIES_UNOWN - 1 ;
2018-02-10 02:06:32 +01:00
2018-12-17 18:28:11 +01:00
return gSpeciesIdToCryId [ species - ( SPECIES_TREECKO - 1 ) ] ;
2018-02-10 02:06:32 +01:00
}
void sub_806D544 ( u16 species , u32 personality , u8 * dest )
{
if ( species = = SPECIES_SPINDA
& & dest ! = gMonSpritesGfxPtr - > sprites [ 0 ]
& & dest ! = gMonSpritesGfxPtr - > sprites [ 2 ] )
{
int i ;
for ( i = 0 ; i < 4 ; i + + )
{
int j ;
u8 x = gSpindaSpotGraphics [ i ] . x + ( ( personality & 0x0F ) - 8 ) ;
u8 y = gSpindaSpotGraphics [ i ] . y + ( ( ( personality & 0xF0 ) > > 4 ) - 8 ) ;
for ( j = 0 ; j < 16 ; j + + )
{
int k ;
s32 row = gSpindaSpotGraphics [ i ] . image [ j ] ;
for ( k = x ; k < x + 16 ; k + + )
{
u8 * val = dest + ( ( k / 8 ) * 32 ) + ( ( k % 8 ) / 2 ) + ( ( y > > 3 ) < < 8 ) + ( ( y & 7 ) < < 2 ) ;
if ( row & 1 )
{
if ( k & 1 )
{
if ( ( u8 ) ( ( * val & 0xF0 ) - 0x10 ) < = 0x20 )
* val + = 0x40 ;
}
else
{
if ( ( u8 ) ( ( * val & 0xF ) - 0x01 ) < = 0x02 )
* val + = 0x04 ;
}
}
row > > = 1 ;
}
y + + ;
}
personality > > = 8 ;
}
}
}
void DrawSpindaSpots ( u16 species , u32 personality , u8 * dest , u8 a4 )
{
if ( species = = SPECIES_SPINDA & & a4 )
{
int i ;
for ( i = 0 ; i < 4 ; i + + )
{
int j ;
u8 x = gSpindaSpotGraphics [ i ] . x + ( ( personality & 0x0F ) - 8 ) ;
u8 y = gSpindaSpotGraphics [ i ] . y + ( ( ( personality & 0xF0 ) > > 4 ) - 8 ) ;
2018-02-09 18:46:00 +01:00
2018-02-10 02:06:32 +01:00
for ( j = 0 ; j < 16 ; j + + )
{
int k ;
s32 row = gSpindaSpotGraphics [ i ] . image [ j ] ;
for ( k = x ; k < x + 16 ; k + + )
{
u8 * val = dest + ( ( k / 8 ) * 32 ) + ( ( k % 8 ) / 2 ) + ( ( y > > 3 ) < < 8 ) + ( ( y & 7 ) < < 2 ) ;
if ( row & 1 )
{
if ( k & 1 )
{
if ( ( u8 ) ( ( * val & 0xF0 ) - 0x10 ) < = 0x20 )
* val + = 0x40 ;
}
else
{
if ( ( u8 ) ( ( * val & 0xF ) - 0x01 ) < = 0x02 )
* val + = 0x04 ;
}
}
row > > = 1 ;
}
y + + ;
}
personality > > = 8 ;
}
}
}
void EvolutionRenameMon ( struct Pokemon * mon , u16 oldSpecies , u16 newSpecies )
{
u8 language ;
GetMonData ( mon , MON_DATA_NICKNAME , gStringVar1 ) ;
language = GetMonData ( mon , MON_DATA_LANGUAGE , & language ) ;
if ( language = = GAME_LANGUAGE & & ! StringCompare ( gSpeciesNames [ oldSpecies ] , gStringVar1 ) )
SetMonData ( mon , MON_DATA_NICKNAME , gSpeciesNames [ newSpecies ] ) ;
}
2019-10-31 19:11:55 +01:00
// The below two functions determine which side of a multi battle the trainer battles on
// 0 is the left (top in party menu), 1 is right (bottom in party menu)
u8 GetPlayerFlankId ( void )
2018-02-10 02:06:32 +01:00
{
2019-10-31 19:11:55 +01:00
u8 flankId = 0 ;
2018-07-22 12:49:49 +02:00
switch ( gLinkPlayers [ GetMultiplayerId ( ) ] . id )
2018-02-10 02:06:32 +01:00
{
case 0 :
case 3 :
2019-10-31 19:11:55 +01:00
flankId = 0 ;
2018-02-10 02:06:32 +01:00
break ;
case 1 :
case 2 :
2019-10-31 19:11:55 +01:00
flankId = 1 ;
2018-02-10 02:06:32 +01:00
break ;
}
2019-10-31 19:11:55 +01:00
return flankId ;
2018-02-10 02:06:32 +01:00
}
2018-07-01 11:15:42 +02:00
u16 GetLinkTrainerFlankId ( u8 linkPlayerId )
2018-02-10 02:06:32 +01:00
{
2018-07-01 11:15:42 +02:00
u16 flankId = 0 ;
2018-07-22 13:14:58 +02:00
switch ( gLinkPlayers [ linkPlayerId ] . id )
2018-02-10 02:06:32 +01:00
{
case 0 :
case 3 :
2018-07-01 11:15:42 +02:00
flankId = 0 ;
2018-02-10 02:06:32 +01:00
break ;
case 1 :
case 2 :
2018-07-01 11:15:42 +02:00
flankId = 1 ;
2018-02-10 02:06:32 +01:00
break ;
}
2018-07-01 11:15:42 +02:00
return flankId ;
2018-02-10 02:06:32 +01:00
}
s32 GetBattlerMultiplayerId ( u16 a1 )
{
s32 id ;
for ( id = 0 ; id < MAX_LINK_PLAYERS ; id + + )
2018-07-22 12:49:49 +02:00
if ( gLinkPlayers [ id ] . id = = a1 )
2018-02-10 02:06:32 +01:00
break ;
return id ;
}
u8 GetTrainerEncounterMusicId ( u16 trainerOpponentId )
{
if ( InBattlePyramid ( ) )
2019-02-07 18:37:28 +01:00
return GetBattlePyramindTrainerEncounterMusicId ( trainerOpponentId ) ;
2019-10-07 02:04:30 +02:00
else if ( InTrainerHillChallenge ( ) )
2019-01-13 20:50:08 +01:00
return GetTrainerEncounterMusicIdInTrainerHill ( trainerOpponentId ) ;
2018-07-01 15:28:57 +02:00
else
return TRAINER_ENCOUNTER_MUSIC ( trainerOpponentId ) ;
2018-02-10 02:06:32 +01:00
}
u16 ModifyStatByNature ( u8 nature , u16 n , u8 statIndex )
{
2020-01-05 16:50:32 +01:00
// Dont modify HP, Accuracy, or Evasion by nature
2020-07-17 02:12:12 +02:00
if ( statIndex < = STAT_HP | | statIndex > NUM_NATURE_STATS )
2018-02-10 02:06:32 +01:00
{
2018-07-01 15:28:57 +02:00
// Should just be "return n", but it wouldn't match without this.
2018-02-10 02:06:32 +01:00
u16 retVal = n ;
retVal + + ;
retVal - - ;
return retVal ;
}
switch ( gNatureStatTable [ nature ] [ statIndex - 1 ] )
{
case 1 :
2019-10-04 06:58:47 +02:00
return ( u16 ) ( n * 110 ) / 100 ; // NOTE: will overflow for n > 595 because the intermediate value is cast to u16 before the division. Fix by removing (u16) cast
2018-02-10 02:06:32 +01:00
case - 1 :
2019-10-04 06:58:47 +02:00
return ( u16 ) ( n * 90 ) / 100 ; // NOTE: will overflow for n > 728, see above
2018-02-10 02:06:32 +01:00
}
return n ;
}
2020-02-02 19:28:54 +01:00
# define IS_LEAGUE_BATTLE \
( ( gBattleTypeFlags & BATTLE_TYPE_TRAINER ) \
& & ( gTrainers [ gTrainerBattleOpponent_A ] . trainerClass = = TRAINER_CLASS_ELITE_FOUR \
| | gTrainers [ gTrainerBattleOpponent_A ] . trainerClass = = TRAINER_CLASS_LEADER \
| | gTrainers [ gTrainerBattleOpponent_A ] . trainerClass = = TRAINER_CLASS_CHAMPION ) ) \
2018-02-10 02:06:32 +01:00
void AdjustFriendship ( struct Pokemon * mon , u8 event )
{
u16 species , heldItem ;
u8 holdEffect ;
2020-02-02 19:28:54 +01:00
if ( ShouldSkipFriendshipChange ( ) )
2018-02-10 02:06:32 +01:00
return ;
species = GetMonData ( mon , MON_DATA_SPECIES2 , 0 ) ;
heldItem = GetMonData ( mon , MON_DATA_HELD_ITEM , 0 ) ;
if ( heldItem = = ITEM_ENIGMA_BERRY )
{
if ( gMain . inBattle )
holdEffect = gEnigmaBerries [ 0 ] . holdEffect ;
else
holdEffect = gSaveBlock1Ptr - > enigmaBerry . holdEffect ;
}
else
{
holdEffect = ItemId_GetHoldEffect ( heldItem ) ;
}
if ( species & & species ! = SPECIES_EGG )
{
u8 friendshipLevel = 0 ;
s16 friendship = GetMonData ( mon , MON_DATA_FRIENDSHIP , 0 ) ;
2020-02-02 19:28:54 +01:00
2018-02-10 02:06:32 +01:00
if ( friendship > 99 )
friendshipLevel + + ;
if ( friendship > 199 )
friendshipLevel + + ;
2020-02-02 19:28:54 +01:00
if ( ( event ! = FRIENDSHIP_EVENT_WALKING | | ! ( Random ( ) & 1 ) )
& & ( event ! = FRIENDSHIP_EVENT_LEAGUE_BATTLE | | IS_LEAGUE_BATTLE ) )
2018-02-10 02:06:32 +01:00
{
2020-02-02 19:28:54 +01:00
s8 mod = sFriendshipEventModifiers [ event ] [ friendshipLevel ] ;
2018-02-10 02:06:32 +01:00
if ( mod > 0 & & holdEffect = = HOLD_EFFECT_HAPPINESS_UP )
mod = ( 150 * mod ) / 100 ;
friendship + = mod ;
if ( mod > 0 )
{
if ( GetMonData ( mon , MON_DATA_POKEBALL , 0 ) = = ITEM_LUXURY_BALL )
friendship + + ;
2018-12-27 23:30:47 +01:00
if ( GetMonData ( mon , MON_DATA_MET_LOCATION , 0 ) = = GetCurrentRegionMapSectionId ( ) )
2018-02-10 02:06:32 +01:00
friendship + + ;
}
if ( friendship < 0 )
friendship = 0 ;
2019-12-18 08:32:52 +01:00
if ( friendship > MAX_FRIENDSHIP )
friendship = MAX_FRIENDSHIP ;
2018-02-10 02:06:32 +01:00
SetMonData ( mon , MON_DATA_FRIENDSHIP , & friendship ) ;
}
}
}
void MonGainEVs ( struct Pokemon * mon , u16 defeatedSpecies )
{
u8 evs [ NUM_STATS ] ;
u16 evIncrease = 0 ;
u16 totalEVs = 0 ;
u16 heldItem ;
u8 holdEffect ;
int i ;
for ( i = 0 ; i < NUM_STATS ; i + + )
{
evs [ i ] = GetMonData ( mon , MON_DATA_HP_EV + i , 0 ) ;
totalEVs + = evs [ i ] ;
}
for ( i = 0 ; i < NUM_STATS ; i + + )
{
u8 hasHadPokerus ;
int multiplier ;
if ( totalEVs > = MAX_TOTAL_EVS )
break ;
hasHadPokerus = CheckPartyHasHadPokerus ( mon , 0 ) ;
if ( hasHadPokerus )
multiplier = 2 ;
else
multiplier = 1 ;
switch ( i )
{
case 0 :
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_HP * multiplier ;
break ;
case 1 :
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_Attack * multiplier ;
break ;
case 2 :
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_Defense * multiplier ;
break ;
case 3 :
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_Speed * multiplier ;
break ;
case 4 :
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_SpAttack * multiplier ;
break ;
case 5 :
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_SpDefense * multiplier ;
break ;
}
heldItem = GetMonData ( mon , MON_DATA_HELD_ITEM , 0 ) ;
if ( heldItem = = ITEM_ENIGMA_BERRY )
{
if ( gMain . inBattle )
holdEffect = gEnigmaBerries [ 0 ] . holdEffect ;
else
holdEffect = gSaveBlock1Ptr - > enigmaBerry . holdEffect ;
}
else
{
holdEffect = ItemId_GetHoldEffect ( heldItem ) ;
}
if ( holdEffect = = HOLD_EFFECT_MACHO_BRACE )
evIncrease * = 2 ;
if ( totalEVs + ( s16 ) evIncrease > MAX_TOTAL_EVS )
evIncrease = ( ( s16 ) evIncrease + MAX_TOTAL_EVS ) - ( totalEVs + evIncrease ) ;
if ( evs [ i ] + ( s16 ) evIncrease > 255 )
{
int val1 = ( s16 ) evIncrease + 255 ;
int val2 = evs [ i ] + evIncrease ;
evIncrease = val1 - val2 ;
}
evs [ i ] + = evIncrease ;
totalEVs + = evIncrease ;
SetMonData ( mon , MON_DATA_HP_EV + i , & evs [ i ] ) ;
}
}
u16 GetMonEVCount ( struct Pokemon * mon )
{
int i ;
u16 count = 0 ;
for ( i = 0 ; i < NUM_STATS ; i + + )
count + = GetMonData ( mon , MON_DATA_HP_EV + i , 0 ) ;
return count ;
}
void RandomlyGivePartyPokerus ( struct Pokemon * party )
{
u16 rnd = Random ( ) ;
if ( rnd = = 0x4000 | | rnd = = 0x8000 | | rnd = = 0xC000 )
{
struct Pokemon * mon ;
do
{
do
{
rnd = Random ( ) % PARTY_SIZE ;
mon = & party [ rnd ] ;
}
while ( ! GetMonData ( mon , MON_DATA_SPECIES , 0 ) ) ;
}
while ( GetMonData ( mon , MON_DATA_IS_EGG , 0 ) ) ;
if ( ! ( CheckPartyHasHadPokerus ( party , gBitTable [ rnd ] ) ) )
{
u8 rnd2 ;
do
{
rnd2 = Random ( ) ;
}
while ( ( rnd2 & 0x7 ) = = 0 ) ;
if ( rnd2 & 0xF0 )
rnd2 & = 0x7 ;
rnd2 | = ( rnd2 < < 4 ) ;
rnd2 & = 0xF3 ;
rnd2 + + ;
SetMonData ( & party [ rnd ] , MON_DATA_POKERUS , & rnd2 ) ;
}
}
}
u8 CheckPartyPokerus ( struct Pokemon * party , u8 selection )
{
u8 retVal ;
int partyIndex = 0 ;
unsigned curBit = 1 ;
retVal = 0 ;
if ( selection )
{
do
{
if ( ( selection & 1 ) & & ( GetMonData ( & party [ partyIndex ] , MON_DATA_POKERUS , 0 ) & 0xF ) )
retVal | = curBit ;
partyIndex + + ;
curBit < < = 1 ;
selection > > = 1 ;
}
while ( selection ) ;
}
else if ( GetMonData ( & party [ 0 ] , MON_DATA_POKERUS , 0 ) & 0xF )
{
retVal = 1 ;
}
return retVal ;
}
u8 CheckPartyHasHadPokerus ( struct Pokemon * party , u8 selection )
{
u8 retVal ;
int partyIndex = 0 ;
unsigned curBit = 1 ;
retVal = 0 ;
if ( selection )
{
do
{
if ( ( selection & 1 ) & & GetMonData ( & party [ partyIndex ] , MON_DATA_POKERUS , 0 ) )
retVal | = curBit ;
partyIndex + + ;
curBit < < = 1 ;
selection > > = 1 ;
}
while ( selection ) ;
}
else if ( GetMonData ( & party [ 0 ] , MON_DATA_POKERUS , 0 ) )
{
retVal = 1 ;
}
return retVal ;
}
void UpdatePartyPokerusTime ( u16 days )
{
int i ;
for ( i = 0 ; i < PARTY_SIZE ; i + + )
{
if ( GetMonData ( & gPlayerParty [ i ] , MON_DATA_SPECIES , 0 ) )
{
u8 pokerus = GetMonData ( & gPlayerParty [ i ] , MON_DATA_POKERUS , 0 ) ;
if ( pokerus & 0xF )
{
if ( ( pokerus & 0xF ) < days | | days > 4 )
pokerus & = 0xF0 ;
else
pokerus - = days ;
if ( pokerus = = 0 )
pokerus = 0x10 ;
SetMonData ( & gPlayerParty [ i ] , MON_DATA_POKERUS , & pokerus ) ;
}
}
}
}
void PartySpreadPokerus ( struct Pokemon * party )
{
if ( ( Random ( ) % 3 ) = = 0 )
{
int i ;
for ( i = 0 ; i < PARTY_SIZE ; i + + )
{
if ( GetMonData ( & party [ i ] , MON_DATA_SPECIES , 0 ) )
{
u8 pokerus = GetMonData ( & party [ i ] , MON_DATA_POKERUS , 0 ) ;
u8 curPokerus = pokerus ;
if ( pokerus )
{
if ( pokerus & 0xF )
{
2018-07-01 15:28:57 +02:00
// Spread to adjacent party members.
2018-02-10 02:06:32 +01:00
if ( i ! = 0 & & ! ( GetMonData ( & party [ i - 1 ] , MON_DATA_POKERUS , 0 ) & 0xF0 ) )
SetMonData ( & party [ i - 1 ] , MON_DATA_POKERUS , & curPokerus ) ;
if ( i ! = ( PARTY_SIZE - 1 ) & & ! ( GetMonData ( & party [ i + 1 ] , MON_DATA_POKERUS , 0 ) & 0xF0 ) )
{
SetMonData ( & party [ i + 1 ] , MON_DATA_POKERUS , & curPokerus ) ;
i + + ;
}
}
}
}
}
}
}
bool8 TryIncrementMonLevel ( struct Pokemon * mon )
{
u16 species = GetMonData ( mon , MON_DATA_SPECIES , 0 ) ;
u8 nextLevel = GetMonData ( mon , MON_DATA_LEVEL , 0 ) + 1 ;
u32 expPoints = GetMonData ( mon , MON_DATA_EXP , 0 ) ;
2018-10-17 04:47:08 +02:00
if ( expPoints > gExperienceTables [ gBaseStats [ species ] . growthRate ] [ MAX_LEVEL ] )
2018-02-10 02:06:32 +01:00
{
2018-10-17 04:47:08 +02:00
expPoints = gExperienceTables [ gBaseStats [ species ] . growthRate ] [ MAX_LEVEL ] ;
2018-02-10 02:06:32 +01:00
SetMonData ( mon , MON_DATA_EXP , & expPoints ) ;
}
2018-10-17 04:47:08 +02:00
if ( nextLevel > MAX_LEVEL | | expPoints < gExperienceTables [ gBaseStats [ species ] . growthRate ] [ nextLevel ] )
2018-02-10 02:06:32 +01:00
{
return FALSE ;
}
else
{
SetMonData ( mon , MON_DATA_LEVEL , & nextLevel ) ;
return TRUE ;
}
}
u32 CanMonLearnTMHM ( struct Pokemon * mon , u8 tm )
{
u16 species = GetMonData ( mon , MON_DATA_SPECIES2 , 0 ) ;
if ( species = = SPECIES_EGG )
{
return 0 ;
}
else if ( tm < 32 )
{
u32 mask = 1 < < tm ;
return gTMHMLearnsets [ species ] [ 0 ] & mask ;
}
else
{
u32 mask = 1 < < ( tm - 32 ) ;
return gTMHMLearnsets [ species ] [ 1 ] & mask ;
}
}
u32 CanSpeciesLearnTMHM ( u16 species , u8 tm )
{
if ( species = = SPECIES_EGG )
{
return 0 ;
}
else if ( tm < 32 )
{
u32 mask = 1 < < tm ;
return gTMHMLearnsets [ species ] [ 0 ] & mask ;
}
else
{
u32 mask = 1 < < ( tm - 32 ) ;
return gTMHMLearnsets [ species ] [ 1 ] & mask ;
}
}
u8 GetMoveRelearnerMoves ( struct Pokemon * mon , u16 * moves )
{
2019-09-08 17:53:48 +02:00
u16 learnedMoves [ MAX_MON_MOVES ] ;
2018-02-10 02:06:32 +01:00
u8 numMoves = 0 ;
u16 species = GetMonData ( mon , MON_DATA_SPECIES , 0 ) ;
u8 level = GetMonData ( mon , MON_DATA_LEVEL , 0 ) ;
int i , j , k ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-10 02:06:32 +01:00
learnedMoves [ i ] = GetMonData ( mon , MON_DATA_MOVE1 + i , 0 ) ;
for ( i = 0 ; i < 20 ; i + + )
{
u16 moveLevel ;
2019-11-15 00:56:18 +01:00
if ( gLevelUpLearnsets [ species ] [ i ] = = LEVEL_UP_END )
2018-02-10 02:06:32 +01:00
break ;
2019-11-15 00:56:18 +01:00
moveLevel = gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_LV ;
2018-02-10 02:06:32 +01:00
if ( moveLevel < = ( level < < 9 ) )
{
2019-11-15 00:56:18 +01:00
for ( j = 0 ; j < MAX_MON_MOVES & & learnedMoves [ j ] ! = ( gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_ID ) ; j + + )
2018-02-10 02:06:32 +01:00
;
2018-12-25 18:50:15 +01:00
if ( j = = MAX_MON_MOVES )
2018-02-10 02:06:32 +01:00
{
2019-11-15 00:56:18 +01:00
for ( k = 0 ; k < numMoves & & moves [ k ] ! = ( gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_ID ) ; k + + )
2018-02-10 02:06:32 +01:00
;
if ( k = = numMoves )
2019-11-15 00:56:18 +01:00
moves [ numMoves + + ] = gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_ID ;
2018-02-10 02:06:32 +01:00
}
}
}
return numMoves ;
}
u8 GetLevelUpMovesBySpecies ( u16 species , u16 * moves )
{
u8 numMoves = 0 ;
int i ;
2019-11-15 00:56:18 +01:00
for ( i = 0 ; i < 20 & & gLevelUpLearnsets [ species ] [ i ] ! = LEVEL_UP_END ; i + + )
moves [ numMoves + + ] = gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_ID ;
2018-02-10 02:06:32 +01:00
return numMoves ;
}
u8 GetNumberOfRelearnableMoves ( struct Pokemon * mon )
{
2019-09-08 17:53:48 +02:00
u16 learnedMoves [ MAX_MON_MOVES ] ;
2018-02-10 02:06:32 +01:00
u16 moves [ 20 ] ;
u8 numMoves = 0 ;
u16 species = GetMonData ( mon , MON_DATA_SPECIES2 , 0 ) ;
u8 level = GetMonData ( mon , MON_DATA_LEVEL , 0 ) ;
int i , j , k ;
if ( species = = SPECIES_EGG )
return 0 ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-10 02:06:32 +01:00
learnedMoves [ i ] = GetMonData ( mon , MON_DATA_MOVE1 + i , 0 ) ;
for ( i = 0 ; i < 20 ; i + + )
{
u16 moveLevel ;
2019-11-15 00:56:18 +01:00
if ( gLevelUpLearnsets [ species ] [ i ] = = LEVEL_UP_END )
2018-02-10 02:06:32 +01:00
break ;
2019-11-15 00:56:18 +01:00
moveLevel = gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_LV ;
2018-02-10 02:06:32 +01:00
if ( moveLevel < = ( level < < 9 ) )
{
2019-11-15 00:56:18 +01:00
for ( j = 0 ; j < MAX_MON_MOVES & & learnedMoves [ j ] ! = ( gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_ID ) ; j + + )
2018-02-10 02:06:32 +01:00
;
2018-12-25 18:50:15 +01:00
if ( j = = MAX_MON_MOVES )
2018-02-10 02:06:32 +01:00
{
2019-11-15 00:56:18 +01:00
for ( k = 0 ; k < numMoves & & moves [ k ] ! = ( gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_ID ) ; k + + )
2018-02-10 02:06:32 +01:00
;
if ( k = = numMoves )
2019-11-15 00:56:18 +01:00
moves [ numMoves + + ] = gLevelUpLearnsets [ species ] [ i ] & LEVEL_UP_MOVE_ID ;
2018-02-10 02:06:32 +01:00
}
}
}
return numMoves ;
}
u16 SpeciesToPokedexNum ( u16 species )
{
if ( IsNationalPokedexEnabled ( ) )
{
return SpeciesToNationalPokedexNum ( species ) ;
}
else
{
species = SpeciesToHoennPokedexNum ( species ) ;
2018-12-15 21:12:28 +01:00
if ( species < = HOENN_DEX_COUNT )
2018-02-10 02:06:32 +01:00
return species ;
2018-12-05 15:31:01 +01:00
return 0xFFFF ;
2018-02-10 02:06:32 +01:00
}
}
2018-12-15 21:12:28 +01:00
bool32 IsSpeciesInHoennDex ( u16 species )
2018-02-10 02:06:32 +01:00
{
2018-12-15 21:12:28 +01:00
if ( SpeciesToHoennPokedexNum ( species ) > HOENN_DEX_COUNT )
2018-02-10 02:06:32 +01:00
return FALSE ;
else
return TRUE ;
}
void ClearBattleMonForms ( void )
{
int i ;
2018-02-11 17:35:01 +01:00
for ( i = 0 ; i < MAX_BATTLERS_COUNT ; i + + )
2018-02-10 02:06:32 +01:00
gBattleMonForms [ i ] = 0 ;
}
u16 GetBattleBGM ( void )
{
if ( gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON )
return MUS_BATTLE34 ;
2018-07-01 15:28:57 +02:00
else if ( gBattleTypeFlags & BATTLE_TYPE_REGI )
2018-02-10 02:06:32 +01:00
return MUS_BATTLE36 ;
2018-07-01 15:28:57 +02:00
else if ( gBattleTypeFlags & ( BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 ) )
2018-02-10 02:06:32 +01:00
return MUS_BATTLE20 ;
2018-07-01 15:28:57 +02:00
else if ( gBattleTypeFlags & BATTLE_TYPE_TRAINER )
2018-02-10 02:06:32 +01:00
{
u8 trainerClass ;
if ( gBattleTypeFlags & BATTLE_TYPE_FRONTIER )
trainerClass = GetFrontierOpponentClass ( gTrainerBattleOpponent_A ) ;
2018-09-20 22:00:00 +02:00
else if ( gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL )
2018-02-10 02:06:32 +01:00
trainerClass = TRAINER_CLASS_EXPERT ;
else
trainerClass = gTrainers [ gTrainerBattleOpponent_A ] . trainerClass ;
switch ( trainerClass )
{
case TRAINER_CLASS_AQUA_LEADER :
case TRAINER_CLASS_MAGMA_LEADER :
return MUS_BATTLE30 ;
case TRAINER_CLASS_TEAM_AQUA :
case TRAINER_CLASS_TEAM_MAGMA :
case TRAINER_CLASS_AQUA_ADMIN :
case TRAINER_CLASS_MAGMA_ADMIN :
return MUS_BATTLE31 ;
case TRAINER_CLASS_LEADER :
return MUS_BATTLE32 ;
case TRAINER_CLASS_CHAMPION :
return MUS_BATTLE33 ;
case TRAINER_CLASS_PKMN_TRAINER_3 :
if ( gBattleTypeFlags & BATTLE_TYPE_FRONTIER )
return MUS_BATTLE35 ;
if ( ! StringCompare ( gTrainers [ gTrainerBattleOpponent_A ] . trainerName , gText_BattleWallyName ) )
return MUS_BATTLE20 ;
return MUS_BATTLE35 ;
case TRAINER_CLASS_ELITE_FOUR :
return MUS_BATTLE38 ;
case TRAINER_CLASS_SALON_MAIDEN :
case TRAINER_CLASS_DOME_ACE :
case TRAINER_CLASS_PALACE_MAVEN :
case TRAINER_CLASS_ARENA_TYCOON :
case TRAINER_CLASS_FACTORY_HEAD :
case TRAINER_CLASS_PIKE_QUEEN :
case TRAINER_CLASS_PYRAMID_KING :
return MUS_VS_FRONT ;
default :
return MUS_BATTLE20 ;
}
}
2018-07-01 15:28:57 +02:00
else
return MUS_BATTLE27 ;
2018-02-10 02:06:32 +01:00
}
void PlayBattleBGM ( void )
{
ResetMapMusic ( ) ;
m4aMPlayAllStop ( ) ;
PlayBGM ( GetBattleBGM ( ) ) ;
}
void PlayMapChosenOrBattleBGM ( u16 songId )
{
ResetMapMusic ( ) ;
m4aMPlayAllStop ( ) ;
if ( songId )
PlayNewMapMusic ( songId ) ;
else
PlayNewMapMusic ( GetBattleBGM ( ) ) ;
}
void sub_806E694 ( u16 songId )
{
u8 taskId ;
ResetMapMusic ( ) ;
m4aMPlayAllStop ( ) ;
taskId = CreateTask ( sub_806E6CC , 0 ) ;
gTasks [ taskId ] . data [ 0 ] = songId ;
}
2018-02-11 17:35:01 +01:00
static void sub_806E6CC ( u8 taskId )
2018-02-10 02:06:32 +01:00
{
if ( gTasks [ taskId ] . data [ 0 ] )
PlayNewMapMusic ( gTasks [ taskId ] . data [ 0 ] ) ;
else
PlayNewMapMusic ( GetBattleBGM ( ) ) ;
DestroyTask ( taskId ) ;
}
2018-10-21 09:24:57 +02:00
const u32 * GetMonFrontSpritePal ( struct Pokemon * mon )
2018-02-10 02:06:32 +01:00
{
u16 species = GetMonData ( mon , MON_DATA_SPECIES2 , 0 ) ;
u32 otId = GetMonData ( mon , MON_DATA_OT_ID , 0 ) ;
u32 personality = GetMonData ( mon , MON_DATA_PERSONALITY , 0 ) ;
2019-07-25 18:56:08 +02:00
return GetMonSpritePalFromSpeciesAndPersonality ( species , otId , personality ) ;
2018-02-10 02:06:32 +01:00
}
2019-07-25 18:56:08 +02:00
const u32 * GetMonSpritePalFromSpeciesAndPersonality ( u16 species , u32 otId , u32 personality )
2018-02-10 02:06:32 +01:00
{
u32 shinyValue ;
2018-12-30 17:58:42 +01:00
if ( species > NUM_SPECIES )
2018-02-10 02:06:32 +01:00
return gMonPaletteTable [ 0 ] . data ;
shinyValue = HIHALF ( otId ) ^ LOHALF ( otId ) ^ HIHALF ( personality ) ^ LOHALF ( personality ) ;
2019-07-11 20:16:39 +02:00
if ( shinyValue < SHINY_ODDS )
2018-02-10 02:06:32 +01:00
return gMonShinyPaletteTable [ species ] . data ;
else
return gMonPaletteTable [ species ] . data ;
}
2018-02-11 17:35:01 +01:00
const struct CompressedSpritePalette * GetMonSpritePalStruct ( struct Pokemon * mon )
2018-02-10 02:06:32 +01:00
{
u16 species = GetMonData ( mon , MON_DATA_SPECIES2 , 0 ) ;
u32 otId = GetMonData ( mon , MON_DATA_OT_ID , 0 ) ;
u32 personality = GetMonData ( mon , MON_DATA_PERSONALITY , 0 ) ;
return GetMonSpritePalStructFromOtIdPersonality ( species , otId , personality ) ;
}
const struct CompressedSpritePalette * GetMonSpritePalStructFromOtIdPersonality ( u16 species , u32 otId , u32 personality )
{
u32 shinyValue ;
shinyValue = HIHALF ( otId ) ^ LOHALF ( otId ) ^ HIHALF ( personality ) ^ LOHALF ( personality ) ;
2019-07-11 20:16:39 +02:00
if ( shinyValue < SHINY_ODDS )
2018-02-10 02:06:32 +01:00
return & gMonShinyPaletteTable [ species ] ;
else
return & gMonPaletteTable [ species ] ;
}
bool32 IsHMMove2 ( u16 move )
{
int i = 0 ;
2018-12-05 15:31:01 +01:00
while ( sHMMoves [ i ] ! = 0xFFFF )
2018-02-10 02:06:32 +01:00
{
2018-02-11 23:46:50 +01:00
if ( sHMMoves [ i + + ] = = move )
2018-02-10 02:06:32 +01:00
return TRUE ;
}
return FALSE ;
}
2018-02-11 17:35:01 +01:00
bool8 IsMonSpriteNotFlipped ( u16 species )
2018-02-10 02:06:32 +01:00
{
return gBaseStats [ species ] . noFlip ;
}
s8 GetMonFlavorRelation ( struct Pokemon * mon , u8 flavor )
{
u8 nature = GetNature ( mon ) ;
2020-07-17 02:12:12 +02:00
return gPokeblockFlavorCompatibilityTable [ nature * FLAVOR_COUNT + flavor ] ;
2018-02-10 02:06:32 +01:00
}
s8 GetFlavorRelationByPersonality ( u32 personality , u8 flavor )
{
u8 nature = GetNatureFromPersonality ( personality ) ;
2020-07-17 02:12:12 +02:00
return gPokeblockFlavorCompatibilityTable [ nature * FLAVOR_COUNT + flavor ] ;
2018-02-10 02:06:32 +01:00
}
bool8 IsTradedMon ( struct Pokemon * mon )
{
2018-09-01 22:03:21 +02:00
u8 otName [ PLAYER_NAME_LENGTH + 1 ] ;
2018-02-10 02:06:32 +01:00
u32 otId ;
GetMonData ( mon , MON_DATA_OT_NAME , otName ) ;
otId = GetMonData ( mon , MON_DATA_OT_ID , 0 ) ;
return IsOtherTrainer ( otId , otName ) ;
}
bool8 IsOtherTrainer ( u32 otId , u8 * otName )
{
if ( otId = =
( gSaveBlock2Ptr - > playerTrainerId [ 0 ]
| ( gSaveBlock2Ptr - > playerTrainerId [ 1 ] < < 8 )
| ( gSaveBlock2Ptr - > playerTrainerId [ 2 ] < < 16 )
| ( gSaveBlock2Ptr - > playerTrainerId [ 3 ] < < 24 ) ) )
{
int i ;
for ( i = 0 ; otName [ i ] ! = EOS ; i + + )
if ( otName [ i ] ! = gSaveBlock2Ptr - > playerName [ i ] )
return TRUE ;
return FALSE ;
}
return TRUE ;
}
void MonRestorePP ( struct Pokemon * mon )
{
BoxMonRestorePP ( & mon - > box ) ;
}
void BoxMonRestorePP ( struct BoxPokemon * boxMon )
{
int i ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-02-10 02:06:32 +01:00
{
if ( GetBoxMonData ( boxMon , MON_DATA_MOVE1 + i , 0 ) )
{
u16 move = GetBoxMonData ( boxMon , MON_DATA_MOVE1 + i , 0 ) ;
u16 bonus = GetBoxMonData ( boxMon , MON_DATA_PP_BONUSES , 0 ) ;
u8 pp = CalculatePPWithBonus ( move , bonus , i ) ;
SetBoxMonData ( boxMon , MON_DATA_PP1 + i , & pp ) ;
}
}
}
2018-07-07 19:57:09 +02:00
void SetMonPreventsSwitchingString ( void )
2018-02-10 02:06:32 +01:00
{
2018-07-07 19:57:09 +02:00
gLastUsedAbility = gBattleStruct - > abilityPreventingSwitchout ;
2018-02-10 02:06:32 +01:00
gBattleTextBuff1 [ 0 ] = B_BUFF_PLACEHOLDER_BEGIN ;
gBattleTextBuff1 [ 1 ] = B_BUFF_MON_NICK_WITH_PREFIX ;
2018-07-07 19:57:09 +02:00
gBattleTextBuff1 [ 2 ] = gBattleStruct - > battlerPreventingSwitchout ;
2018-02-10 02:06:32 +01:00
gBattleTextBuff1 [ 4 ] = B_BUFF_EOS ;
2018-07-07 19:57:09 +02:00
if ( GetBattlerSide ( gBattleStruct - > battlerPreventingSwitchout ) = = B_SIDE_PLAYER )
2019-10-26 03:55:01 +02:00
gBattleTextBuff1 [ 3 ] = GetPartyIdFromBattlePartyId ( gBattlerPartyIndexes [ gBattleStruct - > battlerPreventingSwitchout ] ) ;
2018-02-10 02:06:32 +01:00
else
2018-07-07 19:57:09 +02:00
gBattleTextBuff1 [ 3 ] = gBattlerPartyIndexes [ gBattleStruct - > battlerPreventingSwitchout ] ;
2018-02-10 02:06:32 +01:00
2019-10-26 03:55:01 +02:00
PREPARE_MON_NICK_WITH_PREFIX_BUFFER ( gBattleTextBuff2 , gBattlerInMenuId , GetPartyIdFromBattlePartyId ( gBattlerPartyIndexes [ gBattlerInMenuId ] ) )
2018-02-10 02:06:32 +01:00
BattleStringExpandPlaceholders ( gText_PkmnsXPreventsSwitching , gStringVar4 ) ;
}
static s32 GetWildMonTableIdInAlteringCave ( u16 species )
{
s32 i ;
2018-02-11 23:46:50 +01:00
for ( i = 0 ; i < ( s32 ) ARRAY_COUNT ( sAlteringCaveWildMonHeldItems ) ; i + + )
if ( sAlteringCaveWildMonHeldItems [ i ] . species = = species )
2018-02-10 02:06:32 +01:00
return i ;
return 0 ;
}
void SetWildMonHeldItem ( void )
{
if ( ! ( gBattleTypeFlags & ( BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_PIKE ) ) )
{
u16 rnd = Random ( ) % 100 ;
u16 species = GetMonData ( & gEnemyParty [ 0 ] , MON_DATA_SPECIES , 0 ) ;
u16 var1 = 45 ;
u16 var2 = 95 ;
2018-12-15 23:58:47 +01:00
if ( ! GetMonData ( & gPlayerParty [ 0 ] , MON_DATA_SANITY_IS_EGG , 0 )
2018-02-10 02:06:32 +01:00
& & GetMonAbility ( & gPlayerParty [ 0 ] ) = = ABILITY_COMPOUND_EYES )
{
var1 = 20 ;
var2 = 80 ;
}
2019-01-31 22:51:20 +01:00
if ( gMapHeader . mapLayoutId = = LAYOUT_ALTERING_CAVE )
2018-02-10 02:06:32 +01:00
{
s32 alteringCaveId = GetWildMonTableIdInAlteringCave ( species ) ;
if ( alteringCaveId ! = 0 )
{
if ( rnd < var2 )
return ;
2018-02-11 23:46:50 +01:00
SetMonData ( & gEnemyParty [ 0 ] , MON_DATA_HELD_ITEM , & sAlteringCaveWildMonHeldItems [ alteringCaveId ] . item ) ;
2018-02-10 02:06:32 +01:00
}
else
{
if ( rnd < var1 )
return ;
if ( rnd < var2 )
SetMonData ( & gEnemyParty [ 0 ] , MON_DATA_HELD_ITEM , & gBaseStats [ species ] . item1 ) ;
else
SetMonData ( & gEnemyParty [ 0 ] , MON_DATA_HELD_ITEM , & gBaseStats [ species ] . item2 ) ;
}
}
else
{
if ( gBaseStats [ species ] . item1 = = gBaseStats [ species ] . item2 & & gBaseStats [ species ] . item1 ! = 0 )
{
SetMonData ( & gEnemyParty [ 0 ] , MON_DATA_HELD_ITEM , & gBaseStats [ species ] . item1 ) ;
}
else
{
if ( rnd < var1 )
return ;
if ( rnd < var2 )
SetMonData ( & gEnemyParty [ 0 ] , MON_DATA_HELD_ITEM , & gBaseStats [ species ] . item1 ) ;
else
SetMonData ( & gEnemyParty [ 0 ] , MON_DATA_HELD_ITEM , & gBaseStats [ species ] . item2 ) ;
}
}
}
}
bool8 IsMonShiny ( struct Pokemon * mon )
{
u32 otId = GetMonData ( mon , MON_DATA_OT_ID , 0 ) ;
u32 personality = GetMonData ( mon , MON_DATA_PERSONALITY , 0 ) ;
return IsShinyOtIdPersonality ( otId , personality ) ;
}
bool8 IsShinyOtIdPersonality ( u32 otId , u32 personality )
{
bool8 retVal = FALSE ;
u32 shinyValue = HIHALF ( otId ) ^ LOHALF ( otId ) ^ HIHALF ( personality ) ^ LOHALF ( personality ) ;
2019-07-11 20:16:39 +02:00
if ( shinyValue < SHINY_ODDS )
2018-02-10 02:06:32 +01:00
retVal = TRUE ;
return retVal ;
}
const u8 * GetTrainerPartnerName ( void )
{
if ( gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER )
{
2018-06-30 18:55:34 +02:00
if ( gPartnerTrainerId = = TRAINER_STEVEN_PARTNER )
2018-02-10 02:06:32 +01:00
{
return gTrainers [ TRAINER_STEVEN ] . trainerName ;
}
else
{
GetFrontierTrainerName ( gStringVar1 , gPartnerTrainerId ) ;
return gStringVar1 ;
}
}
else
{
u8 id = GetMultiplayerId ( ) ;
2018-07-22 12:49:49 +02:00
return gLinkPlayers [ GetBattlerMultiplayerId ( gLinkPlayers [ id ] . id ^ 2 ) ] . name ;
2018-02-10 02:06:32 +01:00
}
}
# define READ_PTR_FROM_TASK(taskId, dataId) \
( void * ) ( \
( ( u16 ) ( gTasks [ taskId ] . data [ dataId ] ) | \
( ( u16 ) ( gTasks [ taskId ] . data [ dataId + 1 ] ) < < 0x10 ) ) )
# define STORE_PTR_IN_TASK(ptr, taskId, dataId) \
{ \
gTasks [ taskId ] . data [ dataId ] = ( u32 ) ( ptr ) ; \
gTasks [ taskId ] . data [ dataId + 1 ] = ( u32 ) ( ptr ) > > 0x10 ; \
}
static void Task_AnimateAfterDelay ( u8 taskId )
{
if ( - - gTasks [ taskId ] . data [ 3 ] = = 0 )
{
LaunchAnimationTaskForFrontSprite ( READ_PTR_FROM_TASK ( taskId , 0 ) , gTasks [ taskId ] . data [ 2 ] ) ;
DestroyTask ( taskId ) ;
}
}
static void Task_PokemonSummaryAnimateAfterDelay ( u8 taskId )
{
if ( - - gTasks [ taskId ] . data [ 3 ] = = 0 )
{
StartMonSummaryAnimation ( READ_PTR_FROM_TASK ( taskId , 0 ) , gTasks [ taskId ] . data [ 2 ] ) ;
2018-08-15 20:47:10 +02:00
SummaryScreen_SetUnknownTaskId ( 0xFF ) ;
2018-02-10 02:06:32 +01:00
DestroyTask ( taskId ) ;
}
}
void BattleAnimateFrontSprite ( struct Sprite * sprite , u16 species , bool8 noCry , u8 arg3 )
{
if ( gHitMarker & HITMARKER_NO_ANIMATIONS & & ! ( gBattleTypeFlags & ( BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 ) ) )
DoMonFrontSpriteAnimation ( sprite , species , noCry , arg3 | 0x80 ) ;
else
DoMonFrontSpriteAnimation ( sprite , species , noCry , arg3 ) ;
}
void DoMonFrontSpriteAnimation ( struct Sprite * sprite , u16 species , bool8 noCry , u8 arg3 )
{
s8 pan ;
switch ( arg3 & 0x7F )
{
case 0 :
pan = - 25 ;
break ;
case 1 :
pan = 25 ;
break ;
default :
pan = 0 ;
break ;
}
if ( arg3 & 0x80 )
{
if ( ! noCry )
PlayCry1 ( species , pan ) ;
sprite - > callback = SpriteCallbackDummy ;
}
else
{
if ( ! noCry )
{
PlayCry1 ( species , pan ) ;
if ( HasTwoFramesAnimation ( species ) )
StartSpriteAnim ( sprite , 1 ) ;
}
2018-02-11 23:46:50 +01:00
if ( sMonAnimationDelayTable [ species - 1 ] ! = 0 )
2018-02-10 02:06:32 +01:00
{
u8 taskId = CreateTask ( Task_AnimateAfterDelay , 0 ) ;
STORE_PTR_IN_TASK ( sprite , taskId , 0 ) ;
2018-02-11 23:46:50 +01:00
gTasks [ taskId ] . data [ 2 ] = sMonFrontAnimIdsTable [ species - 1 ] ;
gTasks [ taskId ] . data [ 3 ] = sMonAnimationDelayTable [ species - 1 ] ;
2018-02-10 02:06:32 +01:00
}
else
{
2018-02-11 23:46:50 +01:00
LaunchAnimationTaskForFrontSprite ( sprite , sMonFrontAnimIdsTable [ species - 1 ] ) ;
2018-02-10 02:06:32 +01:00
}
sprite - > callback = SpriteCallbackDummy_2 ;
}
}
void PokemonSummaryDoMonAnimation ( struct Sprite * sprite , u16 species , bool8 oneFrame )
{
if ( ! oneFrame & & HasTwoFramesAnimation ( species ) )
StartSpriteAnim ( sprite , 1 ) ;
2018-02-11 23:46:50 +01:00
if ( sMonAnimationDelayTable [ species - 1 ] ! = 0 )
2018-02-10 02:06:32 +01:00
{
u8 taskId = CreateTask ( Task_PokemonSummaryAnimateAfterDelay , 0 ) ;
STORE_PTR_IN_TASK ( sprite , taskId , 0 ) ;
2018-02-11 23:46:50 +01:00
gTasks [ taskId ] . data [ 2 ] = sMonFrontAnimIdsTable [ species - 1 ] ;
gTasks [ taskId ] . data [ 3 ] = sMonAnimationDelayTable [ species - 1 ] ;
2018-08-15 20:47:10 +02:00
SummaryScreen_SetUnknownTaskId ( taskId ) ;
2018-02-10 02:06:32 +01:00
SetSpriteCB_MonAnimDummy ( sprite ) ;
}
else
{
2018-02-11 23:46:50 +01:00
StartMonSummaryAnimation ( sprite , sMonFrontAnimIdsTable [ species - 1 ] ) ;
2018-02-10 02:06:32 +01:00
}
}
2019-02-19 10:09:42 +01:00
void StopPokemonAnimationDelayTask ( void )
2018-02-10 02:06:32 +01:00
{
u8 delayTaskId = FindTaskIdByFunc ( Task_PokemonSummaryAnimateAfterDelay ) ;
if ( delayTaskId ! = 0xFF )
DestroyTask ( delayTaskId ) ;
}
void BattleAnimateBackSprite ( struct Sprite * sprite , u16 species )
{
if ( gHitMarker & HITMARKER_NO_ANIMATIONS & & ! ( gBattleTypeFlags & ( BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 ) ) )
{
sprite - > callback = SpriteCallbackDummy ;
}
else
{
LaunchAnimationTaskForBackSprite ( sprite , GetSpeciesBackAnimSet ( species ) ) ;
sprite - > callback = SpriteCallbackDummy_2 ;
}
}
u8 sub_806EF08 ( u8 arg0 )
{
s32 i ;
s32 var = 0 ;
u8 multiplayerId = GetMultiplayerId ( ) ;
2018-07-22 12:49:49 +02:00
switch ( gLinkPlayers [ multiplayerId ] . id )
2018-02-10 02:06:32 +01:00
{
case 0 :
case 2 :
var = ( arg0 ! = 0 ) ? 1 : 3 ;
break ;
case 1 :
case 3 :
var = ( arg0 ! = 0 ) ? 2 : 0 ;
break ;
}
2019-09-08 18:21:24 +02:00
for ( i = 0 ; i < MAX_LINK_PLAYERS ; i + + )
2018-02-10 02:06:32 +01:00
{
2018-07-22 12:49:49 +02:00
if ( gLinkPlayers [ i ] . id = = ( s16 ) ( var ) )
2018-02-10 02:06:32 +01:00
break ;
}
return i ;
}
u8 sub_806EF84 ( u8 arg0 , u8 arg1 )
{
s32 i ;
s32 var = 0 ;
2018-07-22 12:49:49 +02:00
switch ( gLinkPlayers [ arg1 ] . id )
2018-02-10 02:06:32 +01:00
{
case 0 :
case 2 :
var = ( arg0 ! = 0 ) ? 1 : 3 ;
break ;
case 1 :
case 3 :
var = ( arg0 ! = 0 ) ? 2 : 0 ;
break ;
}
2019-09-08 18:21:24 +02:00
for ( i = 0 ; i < MAX_LINK_PLAYERS ; i + + )
2018-02-10 02:06:32 +01:00
{
2018-07-22 12:49:49 +02:00
if ( gLinkPlayers [ i ] . id = = ( s16 ) ( var ) )
2018-02-10 02:06:32 +01:00
break ;
}
return i ;
}
2018-02-11 17:35:01 +01:00
u16 FacilityClassToPicIndex ( u16 facilityClass )
2018-02-10 02:06:32 +01:00
{
2018-02-11 17:35:01 +01:00
return gFacilityClassToPicIndex [ facilityClass ] ;
2018-02-10 02:06:32 +01:00
}
u16 PlayerGenderToFrontTrainerPicId ( u8 playerGender )
{
2018-02-12 00:11:10 +01:00
if ( playerGender ! = MALE )
2018-12-03 14:01:52 +01:00
return FacilityClassToPicIndex ( FACILITY_CLASS_MAY ) ;
2018-08-19 01:06:10 +02:00
else
2018-12-03 14:01:52 +01:00
return FacilityClassToPicIndex ( FACILITY_CLASS_BRENDAN ) ;
2018-02-10 02:06:32 +01:00
}
void HandleSetPokedexFlag ( u16 nationalNum , u8 caseId , u32 personality )
{
u8 getFlagCaseId = ( caseId = = FLAG_SET_SEEN ) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT ;
if ( ! GetSetPokedexFlag ( nationalNum , getFlagCaseId ) ) // don't set if it's already set
{
GetSetPokedexFlag ( nationalNum , caseId ) ;
if ( NationalPokedexNumToSpecies ( nationalNum ) = = SPECIES_UNOWN )
gSaveBlock2Ptr - > pokedex . unownPersonality = personality ;
if ( NationalPokedexNumToSpecies ( nationalNum ) = = SPECIES_SPINDA )
gSaveBlock2Ptr - > pokedex . spindaPersonality = personality ;
}
}
const u8 * GetTrainerClassNameFromId ( u16 trainerId )
{
2018-06-30 18:55:34 +02:00
if ( trainerId > = TRAINERS_COUNT )
trainerId = TRAINER_NONE ;
2018-02-10 02:06:32 +01:00
return gTrainerClassNames [ gTrainers [ trainerId ] . trainerClass ] ;
}
const u8 * GetTrainerNameFromId ( u16 trainerId )
{
2018-06-30 18:55:34 +02:00
if ( trainerId > = TRAINERS_COUNT )
trainerId = TRAINER_NONE ;
2018-02-10 02:06:32 +01:00
return gTrainers [ trainerId ] . trainerName ;
}
bool8 HasTwoFramesAnimation ( u16 species )
{
return ( species ! = SPECIES_CASTFORM
& & species ! = SPECIES_DEOXYS
& & species ! = SPECIES_SPINDA
& & species ! = SPECIES_UNOWN ) ;
}
2020-02-02 19:28:54 +01:00
static bool8 ShouldSkipFriendshipChange ( void )
2018-02-10 02:06:32 +01:00
{
if ( gMain . inBattle & & gBattleTypeFlags & ( BATTLE_TYPE_FRONTIER ) )
return TRUE ;
if ( ! gMain . inBattle & & ( InBattlePike ( ) | | InBattlePyramid ( ) ) )
return TRUE ;
return FALSE ;
}
2018-02-10 13:24:03 +01:00
# define FORCE_SIGNED(x)(-(x * (-1)))
2018-02-10 02:06:32 +01:00
2018-02-11 17:35:01 +01:00
static void sub_806F160 ( struct Unknown_806F160_Struct * structPtr )
2018-02-10 02:06:32 +01:00
{
2018-02-10 13:24:03 +01:00
u16 i , j ;
for ( i = 0 ; i < FORCE_SIGNED ( structPtr - > field_0_0 ) ; i + + )
2018-02-10 02:06:32 +01:00
{
structPtr - > templates [ i ] = gUnknown_08329D98 [ i ] ;
for ( j = 0 ; j < structPtr - > field_1 ; j + + )
{
asm ( " " ) ;
structPtr - > frameImages [ i * structPtr - > field_1 + j ] . data = & structPtr - > byteArrays [ i ] [ j * 0x800 ] ;
}
structPtr - > templates [ i ] . images = & structPtr - > frameImages [ i * structPtr - > field_1 ] ;
}
}
2018-02-11 17:35:01 +01:00
static void sub_806F1FC ( struct Unknown_806F160_Struct * structPtr )
2018-02-10 02:06:32 +01:00
{
2018-02-10 13:24:03 +01:00
u16 i , j ;
for ( i = 0 ; i < FORCE_SIGNED ( structPtr - > field_0_0 ) ; i + + )
2018-02-10 02:06:32 +01:00
{
structPtr - > templates [ i ] = gUnknown_08329F28 ;
for ( j = 0 ; j < structPtr - > field_1 ; j + + )
{
structPtr - > frameImages [ i * structPtr - > field_0_0 + j ] . data = & structPtr - > byteArrays [ i ] [ j * 0x800 ] ;
}
structPtr - > templates [ i ] . images = & structPtr - > frameImages [ i * structPtr - > field_0_0 ] ;
2019-04-04 23:53:06 +02:00
structPtr - > templates [ i ] . anims = gUnknown_082FF70C ;
2018-02-10 02:06:32 +01:00
structPtr - > templates [ i ] . paletteTag = i ;
}
}
2018-02-10 13:24:03 +01:00
struct Unknown_806F160_Struct * sub_806F2AC ( u8 id , u8 arg1 )
2018-02-10 02:06:32 +01:00
{
u8 i ;
u8 flags ;
struct Unknown_806F160_Struct * structPtr ;
flags = 0 ;
2018-02-10 13:24:03 +01:00
id % = 2 ;
2018-02-10 02:06:32 +01:00
structPtr = AllocZeroed ( sizeof ( * structPtr ) ) ;
if ( structPtr = = NULL )
return NULL ;
switch ( arg1 )
{
case 2 :
structPtr - > field_0_0 = 7 ;
structPtr - > field_0_1 = 7 ;
structPtr - > field_1 = 4 ;
structPtr - > field_3_0 = 1 ;
structPtr - > field_3_1 = 2 ;
break ;
case 0 :
default :
structPtr - > field_0_0 = 4 ;
structPtr - > field_0_1 = 4 ;
structPtr - > field_1 = 4 ;
structPtr - > field_3_0 = 1 ;
structPtr - > field_3_1 = 0 ;
break ;
}
2018-02-10 13:24:03 +01:00
structPtr - > bytes = AllocZeroed ( structPtr - > field_3_0 * 0x800 * 4 * structPtr - > field_0_0 ) ;
2018-02-10 02:06:32 +01:00
structPtr - > byteArrays = AllocZeroed ( structPtr - > field_0_0 * 32 ) ;
if ( structPtr - > bytes = = NULL | | structPtr - > byteArrays = = NULL )
{
flags | = 1 ;
}
else
{
2018-02-10 13:24:03 +01:00
for ( i = 0 ; i < FORCE_SIGNED ( structPtr - > field_0_0 ) ; i + + )
2018-02-10 02:06:32 +01:00
structPtr - > byteArrays [ i ] = structPtr - > bytes + ( structPtr - > field_3_0 * ( i < < 0xD ) ) ;
}
structPtr - > templates = AllocZeroed ( sizeof ( struct SpriteTemplate ) * structPtr - > field_0_0 ) ;
structPtr - > frameImages = AllocZeroed ( sizeof ( struct SpriteFrameImage ) * structPtr - > field_0_0 * structPtr - > field_1 ) ;
if ( structPtr - > templates = = NULL | | structPtr - > frameImages = = NULL )
{
flags | = 2 ;
}
else
{
for ( i = 0 ; i < structPtr - > field_1 * structPtr - > field_0_0 ; i + + )
structPtr - > frameImages [ i ] . size = 0x800 ;
switch ( structPtr - > field_3_1 )
{
case 2 :
sub_806F1FC ( structPtr ) ;
break ;
case 0 :
case 1 :
default :
sub_806F160 ( structPtr ) ;
break ;
}
}
if ( flags & 2 )
{
if ( structPtr - > frameImages ! = NULL )
FREE_AND_SET_NULL ( structPtr - > frameImages ) ;
if ( structPtr - > templates ! = NULL )
FREE_AND_SET_NULL ( structPtr - > templates ) ;
}
if ( flags & 1 )
{
if ( structPtr - > byteArrays ! = NULL )
FREE_AND_SET_NULL ( structPtr - > byteArrays ) ;
if ( structPtr - > bytes ! = NULL )
FREE_AND_SET_NULL ( structPtr - > bytes ) ;
}
if ( flags )
{
memset ( structPtr , 0 , sizeof ( * structPtr ) ) ;
Free ( structPtr ) ;
}
else
{
2018-02-10 13:24:03 +01:00
structPtr - > magic = 0xA3 ;
gUnknown_020249B4 [ id ] = structPtr ;
}
return gUnknown_020249B4 [ id ] ;
}
void sub_806F47C ( u8 id )
{
struct Unknown_806F160_Struct * structPtr ;
id % = 2 ;
structPtr = gUnknown_020249B4 [ id ] ;
if ( structPtr = = NULL )
return ;
if ( structPtr - > magic ! = 0xA3 )
{
memset ( structPtr , 0 , sizeof ( struct Unknown_806F160_Struct ) ) ;
}
else
{
if ( structPtr - > frameImages ! = NULL )
FREE_AND_SET_NULL ( structPtr - > frameImages ) ;
if ( structPtr - > templates ! = NULL )
FREE_AND_SET_NULL ( structPtr - > templates ) ;
if ( structPtr - > byteArrays ! = NULL )
FREE_AND_SET_NULL ( structPtr - > byteArrays ) ;
if ( structPtr - > bytes ! = NULL )
FREE_AND_SET_NULL ( structPtr - > bytes ) ;
memset ( structPtr , 0 , sizeof ( struct Unknown_806F160_Struct ) ) ;
Free ( structPtr ) ;
}
}
u8 * sub_806F4F8 ( u8 id , u8 arg1 )
{
struct Unknown_806F160_Struct * structPtr = gUnknown_020249B4 [ id % 2 ] ;
if ( structPtr - > magic ! = 0xA3 )
{
return NULL ;
2018-02-10 02:06:32 +01:00
}
2018-02-10 13:24:03 +01:00
else
{
if ( arg1 > = FORCE_SIGNED ( structPtr - > field_0_0 ) )
arg1 = 0 ;
2018-02-10 02:06:32 +01:00
2018-02-10 13:24:03 +01:00
return structPtr - > byteArrays [ arg1 ] ;
}
2018-02-10 02:06:32 +01:00
}