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 } ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
2020-08-05 02:33:05 +02:00
const u8 gStatStageRatios [ MAX_STAT_STAGE + 1 ] [ 2 ] =
2018-02-11 23:46:50 +01:00
{
2020-08-05 02:33:05 +02:00
{ 10 , 40 } , // -6, MIN_STAT_STAGE
2018-02-11 23:46:50 +01:00
{ 10 , 35 } , // -5
{ 10 , 30 } , // -4
{ 10 , 25 } , // -3
{ 10 , 20 } , // -2
{ 10 , 15 } , // -1
2020-08-05 02:33:05 +02:00
{ 10 , 10 } , // 0, DEFAULT_STAT_STAGE
2018-02-11 23:46:50 +01:00
{ 15 , 10 } , // +1
{ 20 , 10 } , // +2
{ 25 , 10 } , // +3
{ 30 , 10 } , // +4
{ 35 , 10 } , // +5
2020-08-05 02:33:05 +02:00
{ 40 , 10 } , // +6, MAX_STAT_STAGE
2018-02-11 23:46:50 +01:00
} ;
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
2020-08-28 03:25:02 +02:00
FACILITY_CLASS_COOLTRAINER_M ,
FACILITY_CLASS_BLACK_BELT ,
2020-02-07 18:48:47 +01:00
FACILITY_CLASS_CAMPER ,
2020-08-28 03:25:02 +02:00
FACILITY_CLASS_YOUNGSTER ,
FACILITY_CLASS_PSYCHIC_M ,
2020-02-07 18:48:47 +01:00
FACILITY_CLASS_BUG_CATCHER ,
2020-08-28 03:25:02 +02:00
FACILITY_CLASS_PKMN_BREEDER_M ,
2020-02-07 18:48:47 +01:00
FACILITY_CLASS_GUITARIST ,
// Female Classes
2020-08-28 03:25:02 +02:00
FACILITY_CLASS_COOLTRAINER_F ,
FACILITY_CLASS_HEX_MANIAC ,
2020-02-07 18:48:47 +01:00
FACILITY_CLASS_PICNICKER ,
2020-08-28 03:25:02 +02:00
FACILITY_CLASS_LASS ,
FACILITY_CLASS_PSYCHIC_F ,
2020-02-07 18:48:47 +01:00
FACILITY_CLASS_BATTLE_GIRL ,
2020-08-28 03:25:02 +02:00
FACILITY_CLASS_PKMN_BREEDER_F ,
2020-02-07 18:48:47 +01:00
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 )
{
2020-08-05 02:33:05 +02:00
if ( attacker - > statStages [ STAT_ATK ] > DEFAULT_STAT_STAGE )
2018-02-11 23:46:50 +01:00
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 )
{
2020-08-05 02:33:05 +02:00
if ( defender - > statStages [ STAT_DEF ] < DEFAULT_STAT_STAGE )
2018-02-11 23:46:50 +01:00
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 )
{
2020-08-05 02:33:05 +02:00
if ( attacker - > statStages [ STAT_SPATK ] > DEFAULT_STAT_STAGE )
2018-02-11 23:46:50 +01:00
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 )
{
2020-08-05 02:33:05 +02:00
if ( defender - > statStages [ STAT_SPDEF ] < DEFAULT_STAT_STAGE )
2018-02-11 23:46:50 +01:00
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
{
2020-07-12 02:25:56 +02:00
SetMonData ( & gEnemyParty [ i ] , MON_DATA_MOVE1 + j , & gBattleResources - > secretBase - > party . moves [ i * MAX_MON_MOVES + j ] ) ;
SetMonData ( & gEnemyParty [ i ] , MON_DATA_PP1 + j , & gBattleMoves [ gBattleResources - > secretBase - > party . moves [ i * MAX_MON_MOVES + j ] ] . pp ) ;
2018-02-09 18:46:00 +01:00
}
}
}
}
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
2020-08-05 02:33:05 +02:00
for ( i = 0 ; i < NUM_BATTLE_STATS ; i + + )
gBattleMons [ battlerId ] . statStages [ i ] = DEFAULT_STAT_STAGE ;
2018-02-09 18:46:00 +01:00
2018-02-11 17:35:01 +01:00
gBattleMons [ battlerId ] . status2 = 0 ;
2020-07-28 00:10:42 +02:00
UpdateSentPokesToOpponentValue ( battlerId ) ;
2018-02-11 17:35:01 +01:00
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 )
2020-08-05 02:33:05 +02:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_ATK ] < MAX_STAT_STAGE )
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 ;
2020-08-05 02:33:05 +02:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_ATK ] > MAX_STAT_STAGE )
gBattleMons [ gActiveBattler ] . statStages [ STAT_ATK ] = MAX_STAT_STAGE ;
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 )
2020-08-05 02:33:05 +02:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_DEF ] < MAX_STAT_STAGE )
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 ;
2020-08-05 02:33:05 +02:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_DEF ] > MAX_STAT_STAGE )
gBattleMons [ gActiveBattler ] . statStages [ STAT_DEF ] = MAX_STAT_STAGE ;
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
}
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM1_X_SPEED )
2020-08-05 02:33:05 +02:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_SPEED ] < MAX_STAT_STAGE )
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 ;
2020-08-05 02:33:05 +02:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_SPEED ] > MAX_STAT_STAGE )
gBattleMons [ gActiveBattler ] . statStages [ STAT_SPEED ] = MAX_STAT_STAGE ;
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 )
2020-08-05 02:33:05 +02:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_ACC ] < MAX_STAT_STAGE )
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 ;
2020-08-05 02:33:05 +02:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_ACC ] > MAX_STAT_STAGE )
gBattleMons [ gActiveBattler ] . statStages [ STAT_ACC ] = MAX_STAT_STAGE ;
2018-02-09 18:46:00 +01:00
retVal = FALSE ;
}
2019-04-14 17:20:26 +02:00
if ( ( itemEffect [ cmdIndex ] & ITEM2_X_SPATK )
2020-08-05 02:33:05 +02:00
& & gBattleMons [ gActiveBattler ] . statStages [ STAT_SPATK ] < MAX_STAT_STAGE )
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 ;
2020-08-05 02:33:05 +02:00
if ( gBattleMons [ gActiveBattler ] . statStages [ STAT_SPATK ] > MAX_STAT_STAGE )
gBattleMons [ gActiveBattler ] . statStages [ STAT_SPATK ] = MAX_STAT_STAGE ;
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
{
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
// Should just be "return n", but it wouldn't match without this.
u16 retVal = n ;
retVal + + ;
retVal - - ;
return retVal ;
2018-02-10 02:06:32 +01:00
}
switch ( gNatureStatTable [ nature ] [ statIndex - 1 ] )
{
case 1 :
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +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 :
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
return ( u16 ) ( n * 90 ) / 100 ; // NOTE: will overflow for n > 728, see above
2018-02-10 02:06:32 +01:00
}
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
return n ;
2018-02-10 02:06:32 +01:00
}
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
2020-08-28 03:25:02 +02:00
if ( ( event ! = FRIENDSHIP_EVENT_WALKING | | ! ( Random ( ) & 1 ) )
2020-02-02 19:28:54 +01:00
& & ( 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 ;
2020-07-16 09:58:16 +02:00
int i , multiplier ;
2018-02-10 02:06:32 +01:00
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 + + )
{
if ( totalEVs > = MAX_TOTAL_EVS )
break ;
2020-08-28 03:25:02 +02:00
2020-07-16 09:58:16 +02:00
if ( CheckPartyHasHadPokerus ( mon , 0 ) )
2018-02-10 02:06:32 +01:00
multiplier = 2 ;
else
multiplier = 1 ;
switch ( i )
{
2020-07-16 09:58:16 +02:00
case STAT_HP :
2018-02-10 02:06:32 +01:00
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_HP * multiplier ;
break ;
2020-07-16 09:58:16 +02:00
case STAT_ATK :
2018-02-10 02:06:32 +01:00
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_Attack * multiplier ;
break ;
2020-07-16 09:58:16 +02:00
case STAT_DEF :
2018-02-10 02:06:32 +01:00
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_Defense * multiplier ;
break ;
2020-07-16 09:58:16 +02:00
case STAT_SPEED :
2018-02-10 02:06:32 +01:00
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_Speed * multiplier ;
break ;
2020-07-16 09:58:16 +02:00
case STAT_SPATK :
2018-02-10 02:06:32 +01:00
evIncrease = gBaseStats [ defeatedSpecies ] . evYield_SpAttack * multiplier ;
break ;
2020-07-16 09:58:16 +02:00
case STAT_SPDEF :
2018-02-10 02:06:32 +01:00
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 ) ;
2020-08-28 03:25:02 +02:00
if ( evs [ i ] + ( s16 ) evIncrease > MAX_PER_STAT_EVS )
2018-02-10 02:06:32 +01:00
{
2020-08-28 03:25:02 +02:00
int val1 = ( s16 ) evIncrease + MAX_PER_STAT_EVS ;
2018-02-10 02:06:32 +01:00
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 ) ;
2020-08-28 20:36:07 +02:00
for ( i = 0 ; i < MAX_LEVEL_UP_MOVES ; i + + )
2018-02-10 02:06:32 +01:00
{
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 ;
2020-08-28 20:36:07 +02:00
for ( i = 0 ; i < MAX_LEVEL_UP_MOVES & & gLevelUpLearnsets [ species ] [ i ] ! = LEVEL_UP_END ; i + + )
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 GetNumberOfRelearnableMoves ( struct Pokemon * mon )
{
2019-09-08 17:53:48 +02:00
u16 learnedMoves [ MAX_MON_MOVES ] ;
2020-08-28 20:36:07 +02:00
u16 moves [ MAX_LEVEL_UP_MOVES ] ;
2018-02-10 02:06:32 +01:00
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 ) ;
2020-08-28 20:36:07 +02:00
for ( i = 0 ; i < MAX_LEVEL_UP_MOVES ; i + + )
2018-02-10 02:06:32 +01:00
{
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 )
2020-08-21 00:02:00 +02:00
return MUS_VS_KYOGRE_GROUDON ;
2018-07-01 15:28:57 +02:00
else if ( gBattleTypeFlags & BATTLE_TYPE_REGI )
2020-08-21 00:02:00 +02:00
return MUS_VS_REGI ;
2018-07-01 15:28:57 +02:00
else if ( gBattleTypeFlags & ( BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 ) )
2020-08-21 00:02:00 +02:00
return MUS_VS_TRAINER ;
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 :
2020-08-21 00:02:00 +02:00
return MUS_VS_AQUA_MAGMA_LEADER ;
2018-02-10 02:06:32 +01:00
case TRAINER_CLASS_TEAM_AQUA :
case TRAINER_CLASS_TEAM_MAGMA :
case TRAINER_CLASS_AQUA_ADMIN :
case TRAINER_CLASS_MAGMA_ADMIN :
2020-08-21 00:02:00 +02:00
return MUS_VS_AQUA_MAGMA ;
2018-02-10 02:06:32 +01:00
case TRAINER_CLASS_LEADER :
2020-08-21 00:02:00 +02:00
return MUS_VS_GYM_LEADER ;
2018-02-10 02:06:32 +01:00
case TRAINER_CLASS_CHAMPION :
2020-08-21 00:02:00 +02:00
return MUS_VS_CHAMPION ;
2018-02-10 02:06:32 +01:00
case TRAINER_CLASS_PKMN_TRAINER_3 :
if ( gBattleTypeFlags & BATTLE_TYPE_FRONTIER )
2020-08-21 00:02:00 +02:00
return MUS_VS_RIVAL ;
2018-02-10 02:06:32 +01:00
if ( ! StringCompare ( gTrainers [ gTrainerBattleOpponent_A ] . trainerName , gText_BattleWallyName ) )
2020-08-21 00:02:00 +02:00
return MUS_VS_TRAINER ;
return MUS_VS_RIVAL ;
2018-02-10 02:06:32 +01:00
case TRAINER_CLASS_ELITE_FOUR :
2020-08-21 00:02:00 +02:00
return MUS_VS_ELITE_FOUR ;
2018-02-10 02:06:32 +01:00
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 :
2020-08-21 00:02:00 +02:00
return MUS_VS_FRONTIER_BRAIN ;
2018-02-10 02:06:32 +01:00
default :
2020-08-21 00:02:00 +02:00
return MUS_VS_TRAINER ;
2018-02-10 02:06:32 +01:00
}
}
2018-07-01 15:28:57 +02:00
else
2020-08-21 00:02:00 +02:00
return MUS_VS_WILD ;
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 ;
}
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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 ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
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 + + )
{
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
# ifndef NONMATCHING
asm ( " " ) ;
# endif
2018-02-10 02:06:32 +01:00
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 ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
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 ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
structPtr - > field_3_0 = 1 ;
2018-02-10 02:06:32 +01:00
structPtr - > field_3_1 = 2 ;
break ;
case 0 :
default :
structPtr - > field_0_0 = 4 ;
structPtr - > field_0_1 = 4 ;
structPtr - > field_1 = 4 ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
structPtr - > field_3_0 = 1 ;
2018-02-10 02:06:32 +01:00
structPtr - > field_3_1 = 0 ;
break ;
}
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02: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
{
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
for ( i = 0 ; i < FORCE_SIGNED ( structPtr - > field_0_0 ) ; i + + )
structPtr - > byteArrays [ i ] = structPtr - > bytes + ( structPtr - > field_3_0 * ( i < < 0xD ) ) ;
2018-02-10 02:06:32 +01:00
}
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 ;
2020-09-09 22:05:22 +02:00
case 0 :
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
case 1 :
2018-02-10 02:06:32 +01:00
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
{
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
structPtr - > magic = 0xA3 ;
2018-02-10 13:24:03 +01:00
gUnknown_020249B4 [ id ] = structPtr ;
}
return gUnknown_020249B4 [ id ] ;
}
void sub_806F47C ( u8 id )
{
struct Unknown_806F160_Struct * structPtr ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
id % = 2 ;
2018-02-10 13:24:03 +01:00
structPtr = gUnknown_020249B4 [ id ] ;
if ( structPtr = = NULL )
return ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
if ( structPtr - > magic ! = 0xA3 )
2018-02-10 13:24:03 +01:00
{
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 ] ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
if ( structPtr - > magic ! = 0xA3 )
2018-02-10 13:24:03 +01:00
{
return NULL ;
2018-02-10 02:06:32 +01:00
}
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
else
{
if ( arg1 > = FORCE_SIGNED ( structPtr - > field_0_0 ) )
arg1 = 0 ;
2018-02-10 02:06:32 +01:00
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
return structPtr - > byteArrays [ arg1 ] ;
}
2018-02-10 02:06:32 +01:00
}