summaryrefslogtreecommitdiff
path: root/src/pokemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pokemon.c')
-rw-r--r--src/pokemon.c2655
1 files changed, 2454 insertions, 201 deletions
diff --git a/src/pokemon.c b/src/pokemon.c
index 3a9fdbf04..b948e4033 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -5,8 +5,10 @@
#include "random.h"
#include "main.h"
#include "text.h"
+#include "data2.h"
#include "string_util.h"
#include "battle.h"
+#include "battle_2.h"
#include "item.h"
#include "event_data.h"
#include "util.h"
@@ -16,15 +18,27 @@
#include "battle_controllers.h"
#include "evolution_scene.h"
#include "battle_message.h"
+#include "battle_util.h"
+#include "battle_ai_script_commands.h"
#include "link.h"
#include "m4a.h"
#include "sound.h"
+#include "pokedex.h"
+#include "strings.h"
+#include "malloc.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "field_specials.h"
#include "constants/items.h"
+#include "constants/item_effects.h"
#include "constants/species.h"
+#include "constants/hoenn_cries.h"
#include "constants/pokemon.h"
#include "constants/abilities.h"
#include "constants/flags.h"
#include "constants/moves.h"
+#include "constants/trainer_classes.h"
+#include "constants/facility_trainer_classes.h"
#include "constants/hold_effects.h"
#include "constants/battle_move_effects.h"
@@ -34,63 +48,1605 @@
// Extracts the lower 16 bits of a 32-bit number
#define LOHALF(n) ((n) & 0xFFFF)
-// TODO: what is this
-struct UnkStruct20244F4
+#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
+
+struct OakSpeechNidoranFStruct
{
- u8 unk0:4;
- u8 unk0_2:4;
- u8 filler1[0xF];
- struct SpriteTemplate *unk10;
+ u8 spriteCount:4;
+ u8 battlePosition:4;
+ u8 frameCount;
+ u8 enable;
+ bool8 enable2;
+ u32 sizePerSprite;
+ u8 *dataBuffer;
+ u8 **bufferPtrs;
+ struct SpriteTemplate *templates;
+ struct SpriteFrameImage *frameImages;
};
-// External symbols
-extern struct UnkStruct20244F4 *gUnknown_20244F4;
-extern struct SpriteTemplate gUnknown_825DEF0[];
-extern struct SpriteTemplate gUnknown_825DF50[];
-extern const union AnimCmd *const *const gTrainerBackAnimsPtrTable[];
-extern struct SpriteTemplate gUnknown_825DEF0[];
-extern const union AnimCmd *const *const gTrainerFrontAnimsPtrTable[];
-extern const union AnimCmd *const gUnknown_82349BC[];
-extern const u8 gUnknown_825DEA1[];
-extern const u8 gPPUpWriteMasks[];
-extern u8 *gUnknown_83FD5D0[];
-extern const u8 gUnknown_825DFF0[];
-extern const u8 gText_EggNickname[];
-extern const u8 gText_BadEgg[];
-extern const u8 BattleText_Rose[];
-extern const u8 BattleText_UnknownString3[];
-extern const u8 BattleText_GetPumped[];
-extern const u8 BattleText_MistShroud[];
-extern const u8 gText_PkmnsXPreventsSwitching[];
-extern const u8 sHoldEffectToType[][2];
+// TODO: move sLearningMoveTableID, gPlayerPartyCount, gEnemyPartyCount,
+// gEnemyParty, gPlayerParty here after resolving symbol ref in between.
extern u8 sLearningMoveTableID;
-extern const u8 sSecretBaseFacilityClasses[2][5];
-extern u16 gUnknown_8251CB8[];
-extern u16 gUnknown_8251FEE[];
-extern u16 gUnknown_8252324[];
-extern u16 gUnknown_82539D4[];
-extern struct SpindaSpot gSpindaSpotGraphics[];
-extern s8 gNatureStatTable[][5];
-extern const s8 sFriendshipEventDeltas[][3];
-extern u32 gTMHMLearnsets[][2];
-extern u8 gBattleMonForms[4];
-extern const struct CompressedSpritePalette gMonPaletteTable[];
-extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
-extern const u16 sHMMoves[];
-extern s8 gPokeblockFlavorCompatibilityTable[];
-
-// External functions
-extern u8 GetCurrentRegionMapSectionId(void); // overworld
-extern const struct BattleMove gBattleMoves[];
-extern u8 sBattler_AI; // battle_ai
-extern void set_unknown_box_id(u8); // field_specials
-extern u8 pokemon_order_func(u8);
-extern u16 get_unknown_box_id(void); // field_specials
-extern u8 StorageGetCurrentBox(void); // pokemon_storage_system
-extern void sub_80174B8(u8 battlerId);
-
-union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType);
-s32 GetDeoxysStat(struct Pokemon *mon, s32 statId);
+EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0};
+static EWRAM_DATA struct OakSpeechNidoranFStruct *sOakSpeechNidoranResources = NULL;
+
+static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType);
+static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId);
+static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality);
+static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex);
+static u8 GetNatureFromPersonality(u32 personality);
+static bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
+static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
+static bool8 IsPokemonStorageFull(void);
+static u8 SendMonToPC(struct Pokemon* mon);
+static void EncryptBoxMon(struct BoxPokemon *boxMon);
+static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon);
+static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move);
+static u8 GetLevelFromMonExp(struct Pokemon *mon);
+static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
+
+#include "data/battle_moves.h"
+
+static const u8 sUnreferencedData[] = { 0x34, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 };
+
+static const u16 sSpeciesToHoennPokedexNum[] = // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)
+{
+ 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),
+};
+
+static const u16 sSpeciesToNationalPokedexNum[] = // Assigns all species to the National Dex Index (Summary No. for National Dex)
+{
+ 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),
+};
+
+static const u16 sHoennToNationalOrder[] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
+{
+ 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),
+ HOENN_TO_NATIONAL(BULBASAUR), // Pokémon from here onwards are UNSEEN in the HoennDex.
+ 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),
+};
+
+static const struct SpindaSpot sSpindaSpotGraphics[] =
+{
+ {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"
+
+static const s8 sNatureStatTable[][5] =
+{
+ // 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"
+
+static const s8 sPokeblockFlavorCompatibilityTable[] =
+{
+ // Cool, Beauty, Cute, Smart, Tough
+ 0, 0, 0, 0, 0, // Hardy
+ 1, 0, 0, 0, -1, // Lonely
+ 1, 0, -1, 0, 0, // Brave
+ 1, -1, 0, 0, 0, // Adamant
+ 1, 0, 0, -1, 0, // Naughty
+ -1, 0, 0, 0, 1, // Bold
+ 0, 0, 0, 0, 0, // Docile
+ 0, 0, -1, 0, 1, // Relaxed
+ 0, -1, 0, 0, 1, // Impish
+ 0, 0, 0, -1, 1, // Lax
+ -1, 0, 1, 0, 0, // Timid
+ 0, 0, 1, 0, -1, // Hasty
+ 0, 0, 0, 0, 0, // Serious
+ 0, -1, 1, 0, 0, // Jolly
+ 0, 0, 1, -1, 0, // Naive
+ -1, 1, 0, 0, 0, // Modest
+ 0, 1, 0, 0, -1, // Mild
+ 0, 1, -1, 0, 0, // Quiet
+ 0, 0, 0, 0, 0, // Bashful
+ 0, 1, 0, -1, 0, // Rash
+ -1, 0, 0, 1, 0, // Calm
+ 0, 0, 0, 1, -1, // Gentle
+ 0, 0, -1, 1, 0, // Sassy
+ 0, -1, 0, 1, 0, // Careful
+ 0, 0, 0, 0, 0 // Quirky
+};
+
+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
+
+const u8 gStatStageRatios[][2] =
+{
+ { 10, 40 },
+ { 10, 35 },
+ { 10, 30 },
+ { 10, 25 },
+ { 10, 20 },
+ { 10, 15 },
+ { 10, 10 },
+ { 15, 10 },
+ { 20, 10 },
+ { 25, 10 },
+ { 30, 10 },
+ { 35, 10 },
+ { 40, 10 },
+ { 138, 174 },
+ { 108, 120 },
+};
+
+static const u8 sFiller = _("");
+
+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_825DEF0[] =
+{
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234698,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F010,
+ .anims = NULL,
+ .images = gUnknown_82346B8,
+ .affineAnims = gUnknown_8234944,
+ .callback = oac_poke_opponent,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82346D8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F010,
+ .anims = NULL,
+ .images = gUnknown_82346F8,
+ .affineAnims = gUnknown_8234944,
+ .callback = oac_poke_opponent,
+ },
+};
+
+const struct SpriteTemplate gUnknown_825DF50[] =
+{
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234718,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234740,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82347A8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_82347C8,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234768,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+ {
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = 0,
+ .oam = &gUnknown_824F018,
+ .anims = NULL,
+ .images = gUnknown_8234788,
+ .affineAnims = gUnknown_82348C8,
+ .callback = sub_80120C4,
+ },
+};
+
+static const u8 sSecretBaseFacilityClasses[][5] =
+{
+ { FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2 },
+ { FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_YOUNGSTER_2 },
+};
+
+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
+};
+
+static const u8 gUnknown_825DFF0[] =
+{
+ STAT_ATK, STAT_ATK, STAT_SPEED, STAT_DEF, STAT_SPATK, STAT_ACC
+};
+
+static const s8 sFriendshipEventDeltas[][3] =
+{
+ { 5, 3, 2 },
+ { 5, 3, 2 },
+ { 1, 1, 0 },
+ { 3, 2, 1 },
+ { 1, 1, 0 },
+ { 1, 1, 1 },
+ { 3, 3, 3 },
+ {-1, -1, -1 },
+ {-5, -5, -10 },
+ {-5, -5, -10 },
+};
+
+static const u16 sHMMoves[] =
+{
+ MOVE_CUT, MOVE_FLY, MOVE_SURF, MOVE_STRENGTH, MOVE_FLASH,
+ MOVE_ROCK_SMASH, MOVE_WATERFALL, MOVE_DIVE, 0xFFFF
+};
+
+static const u16 sDeoxysBaseStats[] =
+{
+ 50, // Hp
+ 180, // Attack
+ 20, // Defense
+ 150, // Speed
+ 180, // Sp.Attack
+ 20, // Sp.Defense
+};
+
+const u16 gLinkPlayerFacilityClasses[] =
+{
+ FACILITY_CLASS_COOLTRAINER_3, FACILITY_CLASS_BLACK_BELT_2, FACILITY_CLASS_CAMPER_2, FACILITY_CLASS_YOUNGSTER_2, FACILITY_CLASS_PSYCHIC_3,
+ FACILITY_CLASS_BUG_CATCHER_2, FACILITY_CLASS_TAMER, FACILITY_CLASS_JUGGLER, FACILITY_CLASS_COOLTRAINER_4, FACILITY_CLASS_CHANNELER,
+ FACILITY_CLASS_PICNICKER_2, FACILITY_CLASS_LASS_2, FACILITY_CLASS_PSYCHIC_4, FACILITY_CLASS_CRUSH_GIRL, FACILITY_CLASS_PKMN_BREEDER_3,
+ FACILITY_CLASS_BEAUTY_2, FACILITY_CLASS_AQUA_LEADER,
+};
+
+const static struct OamData sOakSpeechNidoranFDummyOamData =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+};
+
+const struct SpriteTemplate sOakSpeechNidoranFDummyTemplate =
+{
+ .tileTag = SPRITE_INVALID_TAG,
+ .paletteTag = SPRITE_INVALID_TAG,
+ .oam = &sOakSpeechNidoranFDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
// code
void ZeroBoxMonData(struct BoxPokemon *boxMon)
@@ -233,7 +1789,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv);
}
- if (gBaseStats[species].ability2)
+ if (gBaseStats[species].abilities[1])
{
value = personality & 1;
SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, &value);
@@ -307,7 +1863,7 @@ void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32
CalculateMonStats(mon);
}
-void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId)
+static 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]);
@@ -351,7 +1907,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI
CalculateMonStats(mon);
}
-void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src)
+void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src)
{
s32 i;
u8 value;
@@ -402,7 +1958,7 @@ void sub_803E0A4(struct Pokemon *mon, struct BattleTowerPokemon *src)
CalculateMonStats(mon);
}
-void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
+static void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
{
bool32 obedient = TRUE;
@@ -447,7 +2003,7 @@ void sub_803E23C(struct Pokemon *mon, struct BattleTowerPokemon *dest)
GetMonData(mon, MON_DATA_NICKNAME, dest->nickname);
}
-u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
+static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
{
u16 checksum = 0;
union PokemonSubstruct *substruct0 = GetSubstruct(boxMon, boxMon->personality, 0);
@@ -476,7 +2032,7 @@ u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon)
u8 baseStat = gBaseStats[species].base; \
s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \
u8 nature = GetNature(mon); \
- n = nature_stat_mod(nature, n, statIndex); \
+ n = ModifyStatByNature(nature, n, statIndex); \
SetMonData(mon, field, &n); \
}
@@ -556,7 +2112,7 @@ void BoxMonToMon(struct BoxPokemon *src, struct Pokemon *dest)
CalculateMonStats(dest);
}
-u8 GetLevelFromMonExp(struct Pokemon *mon)
+static u8 GetLevelFromMonExp(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);
@@ -585,7 +2141,7 @@ u16 GiveMoveToMon(struct Pokemon *mon, u16 move)
return GiveMoveToBoxMon(&mon->box, move);
}
-u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
+static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
{
s32 i;
for (i = 0; i < 4; i++)
@@ -632,15 +2188,12 @@ void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot)
mon->pp[slot] = gBattleMoves[move].pp;
}
-void GiveMonInitialMoveset(struct Pokemon *mon)
+static void GiveMonInitialMoveset(struct Pokemon *mon)
{
GiveBoxMonInitialMoveset(&mon->box);
}
-// TODO: make level_up_learnsets.h in src/data and move this to there.
-#define LEVEL_UP_END 0xffff
-
-void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)
+static void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)
{
u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL);
s32 level = GetLevelFromBoxMonExp(boxMon);
@@ -722,7 +2275,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move)
SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
}
-void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
+static void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
{
s32 i;
u16 moves[4];
@@ -834,8 +2387,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
spDefense = (110 * spDefense) / 100;
}
- // TODO: Use ARRAY_COUNT(sHoldEffectToType)
- for (i = 0; i < 17; i++)
+ for (i = 0; i < NELEMS(sHoldEffectToType); i++)
{
if (attackerHoldEffect == sHoldEffectToType[i][0]
&& type == sHoldEffectToType[i][1])
@@ -924,13 +2476,13 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)
{
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2)
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)
damage = 2 * (damage / 3);
else
damage /= 2;
}
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2)
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)
damage /= 2;
// moves always do at least 1 damage.
@@ -971,13 +2523,13 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1)
{
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMons(2) == 2)
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)
damage = 2 * (damage / 3);
else
damage /= 2;
}
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMons(2) == 2)
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && CountAliveMonsInBattle(BATTLE_ALIVE_DEF_SIDE) == 2)
damage /= 2;
// are effects of weather negated with cloud nine or air lock
@@ -1023,28 +2575,28 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
return damage + 2;
}
-u8 CountAliveMons(u8 a1)
+u8 CountAliveMonsInBattle(u8 caseId)
{
s32 i;
u8 retVal = 0;
- switch (a1)
+ switch (caseId)
{
- case 0:
+ case BATTLE_ALIVE_EXCEPT_ACTIVE:
for (i = 0; i < 4; i++)
{
if (i != gActiveBattler && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
- case 1:
+ case BATTLE_ALIVE_ATK_SIDE:
for (i = 0; i < 4; i++)
{
if (GetBattlerSide(i) == GetBattlerSide(sBattler_AI) && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
- case 2:
+ case BATTLE_ALIVE_DEF_SIDE:
for (i = 0; i < 4; i++)
{
if (GetBattlerSide(i) == GetBattlerSide(gBattlerTarget) && !(gAbsentBattlerFlags & gBitTable[i]))
@@ -1056,29 +2608,28 @@ u8 CountAliveMons(u8 a1)
return retVal;
}
-u8 GetDefaultMoveTarget(u8 a1)
+u8 GetDefaultMoveTarget(u8 battlerId)
{
- u8 status = GetBattlerPosition(a1) & 1;
+ u8 opposing = BATTLE_OPPOSITE(GetBattlerPosition(battlerId) & BIT_SIDE);
- status ^= 1;
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
- return GetBattlerAtPosition(status);
- if (CountAliveMons(0) > 1)
+ return GetBattlerAtPosition(opposing);
+ if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) > 1)
{
- u8 val;
+ u8 position;
if ((Random() & 1) == 0)
- val = status ^ 2;
+ position = BATTLE_PARTNER(opposing);
else
- val = status;
- return GetBattlerAtPosition(val);
+ position = opposing;
+ return GetBattlerAtPosition(position);
}
else
{
- if ((gAbsentBattlerFlags & gBitTable[status]))
- return GetBattlerAtPosition(status ^ 2);
+ if ((gAbsentBattlerFlags & gBitTable[opposing]))
+ return GetBattlerAtPosition(BATTLE_PARTNER(opposing));
else
- return GetBattlerAtPosition(status);
+ return GetBattlerAtPosition(opposing);
}
}
@@ -1122,40 +2673,40 @@ u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality)
return MON_MALE;
}
-void SetMultiuseSpriteTemplateToPokemon(u16 trainerSpriteId, u8 battlerPosition)
+void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition)
{
- if(gMonSpritesGfxPtr != NULL)
+ if (gMonSpritesGfxPtr != NULL)
{
- if(battlerPosition >= 4)
+ if (battlerPosition >= 4)
battlerPosition = 0;
gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];
}
else
{
- if(gUnknown_20244F4)
+ if (sOakSpeechNidoranResources)
{
- if(battlerPosition >= (s8)gUnknown_20244F4->unk0_2) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler?
+ if (battlerPosition >= (s8)sOakSpeechNidoranResources->battlePosition) // why a cast?!? changing the unk0_2 type to s8 causes extra shifts, but a cast is the correct fix. why, compiler?
battlerPosition = 0;
- gMultiuseSpriteTemplate = gUnknown_20244F4->unk10[battlerPosition];
+ gMultiuseSpriteTemplate = sOakSpeechNidoranResources->templates[battlerPosition];
}
else
{
- if(battlerPosition >= 4)
+ if (battlerPosition >= 4)
battlerPosition = 0;
gMultiuseSpriteTemplate = gUnknown_825DEF0[battlerPosition];
}
}
- gMultiuseSpriteTemplate.paletteTag = trainerSpriteId;
+ gMultiuseSpriteTemplate.paletteTag = speciesTag;
gMultiuseSpriteTemplate.anims = gUnknown_82349BC;
}
void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition)
{
gMultiuseSpriteTemplate.paletteTag = trainerSpriteId;
- if(battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)
+ if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)
{
gMultiuseSpriteTemplate = gUnknown_825DF50[trainerSpriteId];
gMultiuseSpriteTemplate.anims = gTrainerBackAnimsPtrTable[trainerSpriteId];
@@ -1170,7 +2721,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosit
}
}
-void EncryptBoxMon(struct BoxPokemon *boxMon)
+static void EncryptBoxMon(struct BoxPokemon *boxMon)
{
u32 i;
for (i = 0; i < 12; i++)
@@ -1180,7 +2731,7 @@ void EncryptBoxMon(struct BoxPokemon *boxMon)
}
}
-void DecryptBoxMon(struct BoxPokemon *boxMon)
+static void DecryptBoxMon(struct BoxPokemon *boxMon)
{
u32 i;
for (i = 0; i < 12; i++)
@@ -1236,7 +2787,7 @@ case n: \
break; \
} \
-union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)
+static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType)
{
union PokemonSubstruct *substruct = NULL;
@@ -1290,27 +2841,27 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data)
ret = mon->maxHP;
break;
case MON_DATA_ATK:
- ret = (u16)GetDeoxysStat(mon, STAT_ATK);
+ ret = GetDeoxysStat(mon, STAT_ATK);
if (!ret)
ret = mon->attack;
break;
case MON_DATA_DEF:
- ret = (u16)GetDeoxysStat(mon, STAT_DEF);
+ ret = GetDeoxysStat(mon, STAT_DEF);
if (!ret)
ret = mon->defense;
break;
case MON_DATA_SPEED:
- ret = (u16)GetDeoxysStat(mon, STAT_SPEED);
+ ret = GetDeoxysStat(mon, STAT_SPEED);
if (!ret)
ret = mon->speed;
break;
case MON_DATA_SPATK:
- ret = (u16)GetDeoxysStat(mon, STAT_SPATK);
+ ret = GetDeoxysStat(mon, STAT_SPATK);
if (!ret)
ret = mon->spAttack;
break;
case MON_DATA_SPDEF:
- ret = (u16)GetDeoxysStat(mon, STAT_SPDEF);
+ ret = GetDeoxysStat(mon, STAT_SPDEF);
if (!ret)
ret = mon->spDefense;
break;
@@ -2065,7 +3616,7 @@ u8 GiveMonToPlayer(struct Pokemon *mon)
return MON_GIVEN_TO_PARTY;
}
-u8 SendMonToPC(struct Pokemon* mon)
+static u8 SendMonToPC(struct Pokemon* mon)
{
s32 boxNo, boxPos;
@@ -2151,9 +3702,9 @@ u8 GetMonsStateToDoubles(void)
u8 GetAbilityBySpecies(u16 species, bool8 altAbility)
{
if (altAbility)
- gLastUsedAbility = gBaseStats[species].ability2;
+ gLastUsedAbility = gBaseStats[species].abilities[1];
else
- gLastUsedAbility = gBaseStats[species].ability1;
+ gLastUsedAbility = gBaseStats[species].abilities[0];
return gLastUsedAbility;
}
@@ -2165,7 +3716,7 @@ u8 GetMonAbility(struct Pokemon *mon)
return GetAbilityBySpecies(species, altAbility);
}
-void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
+static void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
{
s32 i, j;
@@ -2224,7 +3775,7 @@ bool8 IsPlayerPartyAndPokemonStorageFull(void)
return IsPokemonStorageFull();
}
-bool8 IsPokemonStorageFull(void)
+static bool8 IsPokemonStorageFull(void)
{
s32 i, j;
@@ -2258,22 +3809,22 @@ void GetSpeciesName(u8 *name, u16 species)
u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex)
{
u8 basePP = gBattleMoves[move].pp;
- return basePP + ((basePP * 20 * ((gUnknown_825DEA1[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);
+ return basePP + ((basePP * 20 * ((gPPUpGetMask[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100);
}
void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex)
{
u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL);
- ppBonuses &= gPPUpWriteMasks[moveIndex];
+ ppBonuses &= gPPUpSetMask[moveIndex];
SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses);
}
void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex)
{
- mon->ppBonuses &= gPPUpWriteMasks[moveIndex];
+ mon->ppBonuses &= gPPUpSetMask[moveIndex];
}
-void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
+static void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
{
u16* hpSwitchout;
s32 i;
@@ -2333,10 +3884,6 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex,
return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0);
}
-extern const u8 gUnknown_825DEA1[];
-extern const u8 gUnknown_825DEA9[];
-extern const u8 sGetMonDataEVConstants[];
-
bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 moveIndex, u8 e)
{
u32 data;
@@ -2512,11 +4059,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
if (r10 & 0x20)
{
r10 &= ~0x20;
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3 && sp28 > 4)
{
- data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex];
+ data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex];
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28;
@@ -2741,13 +4288,13 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
}
break;
case 4:
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
if (data < 3)
{
r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
- data &= gPPUpWriteMasks[moveIndex];
- data += gUnknown_825DEA9[moveIndex] * 3;
+ data &= gPPUpSetMask[moveIndex];
+ data += gPPUpAddMask[moveIndex] * 3;
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4;
@@ -2840,7 +4387,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 mo
return retVal;
}
-bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
+static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
{
u32 status = GetMonData(mon, MON_DATA_STATUS, 0);
@@ -2858,8 +4405,6 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 bat
}
}
-extern bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
-
#ifdef NONMATCHING
/*
* This is nonmatching due to the compiler's insistence on avoiding the u8 cast
@@ -3047,11 +4592,11 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
if (r10 & 0x20)
{
r10 &= ~0x20;
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
sp28 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3 && sp28 > 4)
{
- //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gUnknown_825DEA9[moveIndex];
+ //data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex];
//SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
//
//data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - sp28;
@@ -3286,17 +4831,17 @@ bool8 PokemonUseItemEffects2(struct Pokemon *pkmn, u16 item, u8 partyIndex, u8 m
}
break;
case 4:
- data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gUnknown_825DEA1[moveIndex]) >> (moveIndex * 2);
+ data = (GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2);
r4 = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL), moveIndex);
if (data < 3)
{
- if(r4 <= 4)
+ if (r4 <= 4)
break;
/*
data = GetMonData(pkmn, MON_DATA_PP_BONUSES, NULL);
- data &= gPPUpWriteMasks[moveIndex];
- data += gUnknown_825DEA9[moveIndex] * 3;
+ data &= gPPUpSetMask[moveIndex];
+ data += gPPUpAddMask[moveIndex] * 3;
SetMonData(pkmn, MON_DATA_PP_BONUSES, &data);
data = CalculatePPWithBonus(GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex, NULL), data, moveIndex) - r4;
@@ -3957,7 +5502,7 @@ _08042850:\n\
movs r2, 0\n\
bl GetMonData\n\
adds r5, r0, 0\n\
- ldr r0, _080428DC @ =gUnknown_825DEA1\n\
+ ldr r0, _080428DC @ =gPPUpGetMask\n\
ldr r1, [sp, 0x8]\n\
adds r0, r1, r0\n\
ldrb r0, [r0]\n\
@@ -4013,7 +5558,7 @@ _080428D2:\n\
ldr r0, [r0]\n\
mov pc, r0\n\
.align 2, 0\n\
-_080428DC: .4byte gUnknown_825DEA1\n\
+_080428DC: .4byte gPPUpGetMask\n\
_080428E0: .4byte _080428E4\n\
.align 2, 0\n\
_080428E4:\n\
@@ -4275,7 +5820,7 @@ _08042AF4:\n\
movs r2, 0\n\
bl GetMonData\n\
adds r5, r0, 0\n\
- ldr r0, _08042B48 @ =gUnknown_825DEA1\n\
+ ldr r0, _08042B48 @ =gPPUpGetMask\n\
ldr r1, [sp, 0x8]\n\
adds r0, r1, r0\n\
ldrb r0, [r0]\n\
@@ -4309,7 +5854,7 @@ _08042AF4:\n\
str r2, [sp, 0x10]\n\
b _08042BBE\n\
.align 2, 0\n\
-_08042B48: .4byte gUnknown_825DEA1\n\
+_08042B48: .4byte gPPUpGetMask\n\
_08042B4C:\n\
mov r0, r8\n\
movs r1, 0x20\n\
@@ -4397,9 +5942,9 @@ _08042BD8:\n\
}
#endif
-bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
+static bool8 sub_8042BE8(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
{
- if((GetMonData(mon, MON_DATA_STATUS, NULL) & healMask) != 0)
+ if ((GetMonData(mon, MON_DATA_STATUS, NULL) & healMask) != 0)
return TRUE;
else
return FALSE;
@@ -4518,7 +6063,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
return offset;
}
-void sub_8042D50(int stat)
+static void sub_8042D50(int stat)
{
gBattlerTarget = gBattlerInMenuId;
StringCopy(gBattleTextBuff1, gUnknown_83FD5D0[gUnknown_825DFF0[stat]]);
@@ -4526,7 +6071,7 @@ void sub_8042D50(int stat)
BattleStringExpandPlaceholdersToDisplayedString(BattleText_UnknownString3);
}
-u8 *sub_8042DA4(u16 itemId)
+const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId)
{
int i;
const u8 *itemEffect;
@@ -4581,13 +6126,11 @@ u8 GetNature(struct Pokemon *mon)
return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25;
}
-u8 GetNatureFromPersonality(u32 personality)
+static u8 GetNatureFromPersonality(u32 personality)
{
return personality % 25;
}
-extern bool32 sub_806E25C(void);
-
u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
{
int i;
@@ -4716,21 +6259,19 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
return targetSpecies;
}
-// HoennPokedexNumToSpecies, but is it really Hoenn or Kanto its checking
-// TODO: Figure this out
-u16 sub_80431B4(u16 var)
+static u16 HoennPokedexNumToSpecies(u16 var)
{
u16 species;
- if(!var)
+ if (!var)
return 0;
species = 0;
- while(species < POKEMON_SLOTS_NUMBER - 1 && gUnknown_8251CB8[species] != var)
+ while (species < POKEMON_SLOTS_NUMBER - 1 && sSpeciesToHoennPokedexNum[species] != var)
species++;
- if(species == POKEMON_SLOTS_NUMBER - 1)
+ if (species == POKEMON_SLOTS_NUMBER - 1)
return 0;
return species + 1;
@@ -4745,7 +6286,7 @@ u16 NationalPokedexNumToSpecies(u16 nationalNum)
species = 0;
- while (species < POKEMON_SLOTS_NUMBER - 1 && gUnknown_8251FEE[species] != nationalNum)
+ while (species < POKEMON_SLOTS_NUMBER - 1 && sSpeciesToNationalPokedexNum[species] != nationalNum)
species++;
if (species == POKEMON_SLOTS_NUMBER - 1)
@@ -4754,8 +6295,7 @@ u16 NationalPokedexNumToSpecies(u16 nationalNum)
return species + 1;
}
-// NationalToKantoOrder?
-u16 sub_804324C(u16 nationalNum)
+static u16 NationalToHoennOrder(u16 nationalNum)
{
u16 hoennNum;
@@ -4764,7 +6304,7 @@ u16 sub_804324C(u16 nationalNum)
hoennNum = 0;
- while (hoennNum < POKEMON_SLOTS_NUMBER - 1 && gUnknown_8252324[hoennNum] != nationalNum)
+ while (hoennNum < POKEMON_SLOTS_NUMBER - 1 && sHoennToNationalOrder[hoennNum] != nationalNum)
hoennNum++;
if (hoennNum == POKEMON_SLOTS_NUMBER - 1)
@@ -4778,17 +6318,15 @@ u16 SpeciesToNationalPokedexNum(u16 species)
if (!species)
return 0;
- return gUnknown_8251FEE[species - 1];
+ return sSpeciesToNationalPokedexNum[species - 1];
}
-// these 2 functions are probably kanto and not hoenn
-// TODO: figure this out
-u16 SpeciesToHoennPokedexNum(u16 species)
+static u16 SpeciesToHoennPokedexNum(u16 species)
{
if (!species)
return 0;
- return gUnknown_8251CB8[species - 1];
+ return sSpeciesToHoennPokedexNum[species - 1];
}
u16 HoennToNationalOrder(u16 hoennNum)
@@ -4796,7 +6334,7 @@ u16 HoennToNationalOrder(u16 hoennNum)
if (!hoennNum)
return 0;
- return gUnknown_8252324[hoennNum - 1];
+ return sHoennToNationalOrder[hoennNum - 1];
}
u16 SpeciesToCryId(u16 species)
@@ -4807,10 +6345,10 @@ u16 SpeciesToCryId(u16 species)
if (species <= SPECIES_OLD_UNOWN_Z - 1)
return SPECIES_UNOWN - 1;
- return gUnknown_82539D4[species - ((SPECIES_OLD_UNOWN_Z + 1) - 1)];
+ return sHoennSpeciesIdToCryId[species - ((SPECIES_OLD_UNOWN_Z + 1) - 1)];
}
-void sub_8043338(u16 species, u32 personality, u8 *dest)
+static void sub_8043338(u16 species, u32 personality, u8 *dest)
{
if (species == SPECIES_SPINDA
&& dest != gMonSpritesGfxPtr->sprites[0]
@@ -4820,13 +6358,13 @@ void sub_8043338(u16 species, u32 personality, u8 *dest)
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);
+ u8 x = sSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
+ u8 y = sSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
for (j = 0; j < 16; j++)
{
int k;
- s32 row = gSpindaSpotGraphics[i].image[j];
+ s32 row = sSpindaSpotGraphics[i].image[j];
for (k = x; k < x + 16; k++)
{
@@ -4865,13 +6403,13 @@ void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4)
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);
+ u8 x = sSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8);
+ u8 y = sSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8);
for (j = 0; j < 16; j++)
{
int k;
- s32 row = gSpindaSpotGraphics[i].image[j];
+ s32 row = sSpindaSpotGraphics[i].image[j];
for (k = x; k < x + 16; k++)
{
@@ -4928,10 +6466,10 @@ bool8 sub_80435E0(void)
return retVal;
}
-bool8 sub_8043620(u8 id)
+bool8 GetLinkTrainerFlankId(u8 linkPlayerId)
{
bool8 retVal = FALSE;
- switch (gLinkPlayers[id].id)
+ switch (gLinkPlayers[linkPlayerId].id)
{
case 0:
case 3:
@@ -4954,12 +6492,12 @@ s32 GetBankMultiplayerId(u16 a1)
return id;
}
-u8 sub_804367C(u16 trainer)
+u8 GetTrainerEncounterMusicId(u16 trainer)
{
return gTrainers[trainer].encounterMusic_gender & 0x7F;
}
-u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
+static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
{
if (statIndex < 1 || statIndex > 5)
{
@@ -4970,7 +6508,7 @@ u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
return retVal;
}
- switch (gNatureStatTable[nature][statIndex - 1])
+ switch (sNatureStatTable[nature][statIndex - 1])
{
case 1:
return (u16)(n * 110) / 100;
@@ -4986,10 +6524,6 @@ u16 nature_stat_mod(u8 nature, u16 n, u8 statIndex)
#define TRAINER_CLASS_LEADER 0x57
#define TRAINER_CLASS_CHAMPION 0x5A
-// TODO: Move these too
-#define FRIENDSHIP_EVENT_LEAGUE_BATTLE 0x3
-#define FRIENDSHIP_EVENT_WALKING 0x5
-
void AdjustFriendship(struct Pokemon *mon, u8 event)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
@@ -5204,7 +6738,7 @@ u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection)
return retVal;
}
-void sub_8043B38(void)
+static void sub_8043B38(void)
{
u8 foo[4]; // huh?
}
@@ -5214,7 +6748,7 @@ void sub_8043B40(void)
u8 foo[4]; // huh?
}
-void sub_8043B48(struct Pokemon *mon, int species, u8 unused, u32 data)
+static void SetMonExpWithMaxLevelCheck(struct Pokemon *mon, int species, u8 unused, u32 data)
{
if (data > gExperienceTables[gBaseStats[species].growthRate][100])
{
@@ -5230,12 +6764,12 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon)
u8 newLevel = level + 1;
u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);
- if(level < 100)
+ if (level < 100)
{
- if(exp > gExperienceTables[gBaseStats[species].growthRate][newLevel])
+ if (exp > gExperienceTables[gBaseStats[species].growthRate][newLevel])
{
SetMonData(mon, MON_DATA_LEVEL, &newLevel);
- sub_8043B48(mon, species, newLevel, exp);
+ SetMonExpWithMaxLevelCheck(mon, species, newLevel, exp);
return TRUE;
}
else
@@ -5243,7 +6777,7 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon)
}
else
{
- sub_8043B48(mon, species, level, exp);
+ SetMonExpWithMaxLevelCheck(mon, species, level, exp);
return FALSE;
}
}
@@ -5258,12 +6792,12 @@ u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm)
else if (tm < 32)
{
u32 mask = 1 << tm;
- return gTMHMLearnsets[species][0] & mask;
+ return sTMHMLearnsets[species][0] & mask;
}
else
{
u32 mask = 1 << (tm - 32);
- return gTMHMLearnsets[species][1] & mask;
+ return sTMHMLearnsets[species][1] & mask;
}
}
@@ -5373,19 +6907,19 @@ u16 sub_8043F90(u16 species)
void ClearBattleMonForms(void)
{
int i;
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
gBattleMonForms[i] = 0;
}
-u16 GetMUS_ForBattle(void)
+static u16 GetMUS_ForBattle(void)
{
- if(gBattleTypeFlags & 0x1000)
+ if (gBattleTypeFlags & 0x1000)
return 0x12A;
- if(gBattleTypeFlags & 0x4000)
+ if (gBattleTypeFlags & 0x4000)
return 0x10A;
- if(gBattleTypeFlags & 0x2)
+ if (gBattleTypeFlags & 0x2)
return 0x10A;
- if(gBattleTypeFlags & 0x8)
+ if (gBattleTypeFlags & 0x8)
{
switch (gTrainers[gTrainerBattleOpponent_A].trainerClass)
{
@@ -5423,7 +6957,7 @@ void PlayMapChosenOrBattleBGM(u16 songId)
PlayNewMapMusic(GetMUS_ForBattle());
}
-const u8 *GetMonFrontSpritePal(struct Pokemon *mon)
+const u32 *GetMonFrontSpritePal(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
@@ -5431,7 +6965,7 @@ const u8 *GetMonFrontSpritePal(struct Pokemon *mon)
return GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality);
}
-const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
+const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
{
u32 shinyValue;
@@ -5480,16 +7014,16 @@ bool8 IsPokeSpriteNotFlipped(u16 species)
return gBaseStats[species].noFlip;
}
-s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
+static s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
{
u8 nature = GetNature(mon);
- return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
+ return sPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
}
s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor)
{
u8 nature = GetNatureFromPersonality(personality);
- return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
+ return sPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
}
bool8 IsTradedMon(struct Pokemon *mon)
@@ -5567,8 +7101,7 @@ void sub_8044348(void)
void SetWildMonHeldItem(void)
{
- // TODO: Replace 0x00010000 with the right flag that isnt BATTLE_TYPE_DOME
- if (!(gBattleTypeFlags & (0x00010000 | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER)))
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER)))
{
u16 rnd = Random() % 100;
u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0);
@@ -5595,7 +7128,7 @@ bool8 IsMonShiny(struct Pokemon *mon)
return IsShinyOtIdPersonality(otId, personality);
}
-bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
+static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
{
bool8 retVal = FALSE;
u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
@@ -5604,8 +7137,728 @@ bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
return retVal;
}
-u8 *sub_80444C4(void)
+u8 *GetTrainerPartnerName(void)
{
u8 id = GetMultiplayerId();
return gLinkPlayers[GetBankMultiplayerId(gLinkPlayers[id].id ^ 2)].name;
}
+
+u8 GetPlayerPartyHighestLevel(void)
+{
+ s32 slot;
+ u8 level, monLevel;
+
+ level = 1;
+ for (slot = 0; slot < PARTY_SIZE; ++slot)
+ {
+ if (GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_HAS_SPECIES, NULL) == 1 && !GetMonData(&gPlayerParty[slot], MON_DATA_SANITY_IS_EGG, NULL))
+ {
+ monLevel = GetMonData(&gPlayerParty[slot], MON_DATA_LEVEL, NULL);
+ if (monLevel > level)
+ level = monLevel;
+ }
+ }
+ return level;
+}
+
+u16 FacilityClassToPicIndex(u16 facilityClass)
+{
+ return gFacilityClassToPicIndex[facilityClass];
+}
+
+bool8 sub_804455C(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;
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ 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)
+ {
+ if (gLinkPlayers[GetMultiplayerId()].id == battlerId)
+ 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;
+}
+
+static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId)
+{
+ s32 ivVal, evVal;
+ u16 statValue;
+ u8 nature;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ {
+ return statValue = 0;
+ }
+ else
+ {
+ ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL);
+ evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL);
+ statValue = ((sDeoxysBaseStats[statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5;
+ nature = GetNature(mon);
+ statValue = ModifyStatByNature(nature, statValue, (u8)statId);
+ }
+ 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);
+ }
+}
+
+u16 sub_80447AC(void)
+{
+ u8 linkId = GetMultiplayerId() ^ 1;
+ u32 arrId = gLinkPlayers[linkId].trainerId & 7;
+
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return FacilityClassToPicIndex(gLinkPlayerFacilityClasses[arrId]);
+}
+
+u16 sub_80447F0(void)
+{
+ u8 linkId = GetMultiplayerId() ^ 1;
+ u32 arrId = gLinkPlayers[linkId].trainerId & 7;
+
+ arrId |= gLinkPlayers[linkId].gender << 3;
+ return gFacilityClassToTrainerClass[gLinkPlayerFacilityClasses[arrId]];
+}
+
+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);
+ }
+}
+
+void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)
+{
+ u8 getFlagCaseId = (caseId == FLAG_SET_SEEN) ? FLAG_GET_SEEN : FLAG_GET_CAUGHT;
+
+ if (!GetSetPokedexFlag(nationalNum, getFlagCaseId))
+ {
+ GetSetPokedexFlag(nationalNum, caseId);
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_UNOWN)
+ gSaveBlock2Ptr->pokedex.unownPersonality = personality;
+ if (NationalPokedexNumToSpecies(nationalNum) == SPECIES_SPINDA)
+ gSaveBlock2Ptr->pokedex.spindaPersonality = personality;
+ }
+}
+
+bool8 CheckBattleTypeGhost(struct Pokemon *mon, u8 bank)
+{
+ u8 buffer[12];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_GHOST && GetBattlerSide(bank))
+ {
+ GetMonData(mon, MON_DATA_NICKNAME, buffer);
+ StringGetEnd10(buffer);
+ if (!StringCompare(buffer, gUnknown_841D148))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void OakSpeechNidoranFSetupTemplate(struct OakSpeechNidoranFStruct *structPtr, u8 battlePosition)
+{
+ u16 i = 0, j = 0;
+
+ if (battlePosition > 3)
+ {
+ for (i = 0; i < (s8)structPtr->spriteCount; ++i)
+ {
+ structPtr->templates[i] = gUnknown_825DEF0[i];
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[i * structPtr->frameCount + j].data = &structPtr->bufferPtrs[i][j * 0x800];
+ structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->frameCount];
+ }
+ }
+ else
+ {
+ const struct SpriteTemplate *template = &gUnknown_825DEF0[battlePosition];
+
+ structPtr->templates[0] = *template;
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[j].data = &structPtr->bufferPtrs[0][j * 0x800];
+ structPtr->templates[0].images = structPtr->frameImages;
+ }
+}
+
+// not used
+static void OakSpeechNidoranFSetupTemplateDummy(struct OakSpeechNidoranFStruct *structPtr)
+{
+ u16 i, j;
+
+ for (i = 0; i < (s8)structPtr->spriteCount; ++i)
+ {
+ structPtr->templates[i] = sOakSpeechNidoranFDummyTemplate;
+ for (j = 0; j < structPtr->frameCount; ++j)
+ structPtr->frameImages[i * structPtr->spriteCount + j].data = &structPtr->bufferPtrs[i][j * 0x800];
+ structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->spriteCount]; // should be frameCount logically
+ structPtr->templates[i].anims = gUnknown_82349BC;
+ structPtr->templates[i].paletteTag = i;
+ }
+}
+
+#ifdef NONMATCHING
+struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable)
+{
+ s32 size;
+ u8 i, flags = 0;
+
+ if (sOakSpeechNidoranResources != NULL)
+ {
+ if (sOakSpeechNidoranResources->enable == 0xA3)
+ return NULL;
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ sOakSpeechNidoranResources = NULL;
+ }
+ sOakSpeechNidoranResources = AllocZeroed(0x18);
+ if (sOakSpeechNidoranResources == NULL)
+ return NULL;
+ switch (enable)
+ {
+ case TRUE:
+ if (battlePosition == 4)
+ {
+ sOakSpeechNidoranResources->spriteCount = 4;
+ sOakSpeechNidoranResources->battlePosition = 4;
+ }
+ else
+ {
+ if (battlePosition > 4)
+ battlePosition = 0;
+ sOakSpeechNidoranResources->spriteCount = 1;
+ sOakSpeechNidoranResources->battlePosition = 1;
+ }
+ sOakSpeechNidoranResources->frameCount = 4;
+ sOakSpeechNidoranResources->enable2 = TRUE;
+ break;
+ case FALSE:
+ default:
+ if (!battlePosition)
+ battlePosition = 1;
+ if (battlePosition > 8)
+ battlePosition = 8;
+ // The following two statements refused to cooperate.
+ sOakSpeechNidoranResources->spriteCount = battlePosition;
+ sOakSpeechNidoranResources->battlePosition = battlePosition;
+ sOakSpeechNidoranResources->frameCount = 4;
+ sOakSpeechNidoranResources->enable2 = FALSE;
+ break;
+ }
+ size = sOakSpeechNidoranResources->frameCount * 0x800;
+ sOakSpeechNidoranResources->sizePerSprite = size;
+ sOakSpeechNidoranResources->dataBuffer = AllocZeroed(sOakSpeechNidoranResources->spriteCount * size);
+ sOakSpeechNidoranResources->bufferPtrs = AllocZeroed(sOakSpeechNidoranResources->spriteCount * 0x20);
+ if (sOakSpeechNidoranResources->dataBuffer == NULL || sOakSpeechNidoranResources->bufferPtrs == NULL)
+ {
+ flags |= 1;
+ }
+ else
+ {
+ for (i = 0; i < (s8)sOakSpeechNidoranResources->spriteCount; ++i)
+ sOakSpeechNidoranResources->bufferPtrs[i] = &sOakSpeechNidoranResources->dataBuffer[sOakSpeechNidoranResources->sizePerSprite * i];
+ }
+ sOakSpeechNidoranResources->templates = AllocZeroed(sizeof(struct SpriteTemplate) * sOakSpeechNidoranResources->spriteCount);
+ sOakSpeechNidoranResources->frameImages = AllocZeroed(sOakSpeechNidoranResources->spriteCount * sizeof(struct SpriteFrameImage) * sOakSpeechNidoranResources->frameCount);
+ if (sOakSpeechNidoranResources->templates == NULL || sOakSpeechNidoranResources->frameImages == NULL)
+ {
+ flags |= 2;
+ }
+ else
+ {
+ for (i = 0; i < sOakSpeechNidoranResources->frameCount * sOakSpeechNidoranResources->spriteCount; ++i)
+ sOakSpeechNidoranResources->frameImages[i].size = 0x800;
+ switch (sOakSpeechNidoranResources->enable2)
+ {
+ case TRUE:
+ OakSpeechNidoranFSetupTemplate(sOakSpeechNidoranResources, battlePosition);
+ break;
+ case FALSE:
+ default:
+ OakSpeechNidoranFSetupTemplateDummy(sOakSpeechNidoranResources);
+ break;
+ }
+ }
+ if (flags & 2)
+ {
+ if (sOakSpeechNidoranResources->frameImages != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages);
+ if (sOakSpeechNidoranResources->templates != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates);
+ }
+ if (flags & 1)
+ {
+ if (sOakSpeechNidoranResources->bufferPtrs != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs);
+ if (sOakSpeechNidoranResources->dataBuffer != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer);
+ }
+ if (flags)
+ {
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources);
+ }
+ else
+ {
+ sOakSpeechNidoranResources->enable = 0xA3;
+ }
+ return sOakSpeechNidoranResources;
+}
+#else
+NAKED
+struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r5, r1, 24\n\
+ movs r0, 0\n\
+ mov r8, r0\n\
+ ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r4]\n\
+ cmp r1, 0\n\
+ beq _08044B1E\n\
+ ldrb r0, [r1, 0x2]\n\
+ cmp r0, 0xA3\n\
+ beq _08044B2E\n\
+ adds r0, r1, 0\n\
+ movs r1, 0\n\
+ movs r2, 0x18\n\
+ bl memset\n\
+ mov r1, r8\n\
+ str r1, [r4]\n\
+ _08044B1E:\n\
+ ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\
+ movs r0, 0x18\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ str r2, [r4]\n\
+ cmp r2, 0\n\
+ bne _08044B38\n\
+ _08044B2E:\n\
+ movs r0, 0\n\
+ b _08044D70\n\
+ .align 2, 0\n\
+ _08044B34: .4byte sOakSpeechNidoranResources\n\
+ _08044B38:\n\
+ cmp r5, 0\n\
+ beq _08044B94\n\
+ cmp r5, 0x1\n\
+ bne _08044B94\n\
+ cmp r6, 0x4\n\
+ bne _08044B5E\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, [r4]\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ movs r1, 0x40\n\
+ b _08044B7C\n\
+ _08044B5E:\n\
+ cmp r6, 0x4\n\
+ bls _08044B64\n\
+ movs r6, 0\n\
+ _08044B64:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x1\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, [r4]\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ movs r1, 0x10\n\
+ _08044B7C:\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r2, _08044B90 @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r2]\n\
+ movs r0, 0x4\n\
+ strb r0, [r1, 0x1]\n\
+ ldr r1, [r2]\n\
+ movs r0, 0x1\n\
+ strb r0, [r1, 0x3]\n\
+ b _08044BD0\n\
+ .align 2, 0\n\
+ _08044B90: .4byte sOakSpeechNidoranResources\n\
+ _08044B94:\n\
+ cmp r6, 0\n\
+ bne _08044B9A\n\
+ movs r6, 0x1\n\
+ _08044B9A:\n\
+ cmp r6, 0x8\n\
+ bls _08044BA0\n\
+ movs r6, 0x8\n\
+ _08044BA0:\n\
+ ldr r4, _08044C10 @ =sOakSpeechNidoranResources\n\
+ ldr r3, [r4]\n\
+ movs r0, 0xF\n\
+ adds r1, r6, 0\n\
+ ands r1, r0\n\
+ ldrb r2, [r3]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ strb r0, [r3]\n\
+ ldr r2, [r4]\n\
+ lsls r3, r6, 4\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ orrs r0, r3\n\
+ strb r0, [r2]\n\
+ ldr r1, [r4]\n\
+ movs r2, 0\n\
+ movs r0, 0x4\n\
+ strb r0, [r1, 0x1]\n\
+ ldr r0, [r4]\n\
+ strb r2, [r0, 0x3]\n\
+ _08044BD0:\n\
+ ldr r5, _08044C10 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r5]\n\
+ ldrb r1, [r0, 0x1]\n\
+ lsls r1, 11\n\
+ str r1, [r0, 0x4]\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ muls r0, r1\n\
+ bl AllocZeroed\n\
+ ldr r1, [r5]\n\
+ str r0, [r1, 0x8]\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 28\n\
+ lsrs r0, 23\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ ldr r1, [r5]\n\
+ str r2, [r1, 0xC]\n\
+ ldr r0, [r1, 0x8]\n\
+ cmp r0, 0\n\
+ beq _08044C04\n\
+ cmp r2, 0\n\
+ bne _08044C14\n\
+ _08044C04:\n\
+ movs r0, 0x1\n\
+ mov r1, r8\n\
+ orrs r1, r0\n\
+ mov r8, r1\n\
+ b _08044C44\n\
+ .align 2, 0\n\
+ _08044C10: .4byte sOakSpeechNidoranResources\n\
+ _08044C14:\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 28\n\
+ movs r4, 0\n\
+ adds r3, r5, 0\n\
+ cmp r0, 0\n\
+ beq _08044C44\n\
+ _08044C20:\n\
+ ldr r3, [r5]\n\
+ ldr r0, [r3, 0xC]\n\
+ lsls r1, r4, 2\n\
+ adds r1, r0\n\
+ ldr r0, [r3, 0x4]\n\
+ adds r2, r0, 0\n\
+ muls r2, r4\n\
+ ldr r0, [r3, 0x8]\n\
+ adds r0, r2\n\
+ str r0, [r1]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ cmp r4, r0\n\
+ blt _08044C20\n\
+ _08044C44:\n\
+ ldr r5, _08044C8C @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r5]\n\
+ ldrb r1, [r0]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ lsls r0, 3\n\
+ bl AllocZeroed\n\
+ ldr r2, [r5]\n\
+ str r0, [r2, 0x10]\n\
+ ldrb r1, [r2]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ ldrb r0, [r2, 0x1]\n\
+ lsls r0, 3\n\
+ muls r0, r1\n\
+ bl AllocZeroed\n\
+ adds r2, r0, 0\n\
+ ldr r1, [r5]\n\
+ str r2, [r1, 0x14]\n\
+ ldr r0, [r1, 0x10]\n\
+ cmp r0, 0\n\
+ beq _08044C7C\n\
+ cmp r2, 0\n\
+ bne _08044C90\n\
+ _08044C7C:\n\
+ movs r0, 0x2\n\
+ mov r1, r8\n\
+ orrs r1, r0\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ b _08044CE2\n\
+ .align 2, 0\n\
+ _08044C8C: .4byte sOakSpeechNidoranResources\n\
+ _08044C90:\n\
+ movs r4, 0\n\
+ ldrb r0, [r1, 0x1]\n\
+ ldrb r1, [r1]\n\
+ lsls r1, 28\n\
+ lsrs r1, 28\n\
+ muls r0, r1\n\
+ adds r3, r5, 0\n\
+ cmp r4, r0\n\
+ bge _08044CC6\n\
+ adds r7, r3, 0\n\
+ movs r5, 0x80\n\
+ lsls r5, 4\n\
+ _08044CA8:\n\
+ ldr r2, [r7]\n\
+ ldr r1, [r2, 0x14]\n\
+ lsls r0, r4, 3\n\
+ adds r0, r1\n\
+ strh r5, [r0, 0x4]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldrb r1, [r2, 0x1]\n\
+ ldrb r0, [r2]\n\
+ lsls r0, 28\n\
+ lsrs r0, 28\n\
+ muls r0, r1\n\
+ cmp r4, r0\n\
+ blt _08044CA8\n\
+ _08044CC6:\n\
+ ldr r0, [r3]\n\
+ ldrb r4, [r0, 0x3]\n\
+ cmp r4, 0\n\
+ beq _08044CDA\n\
+ cmp r4, 0x1\n\
+ bne _08044CDA\n\
+ adds r1, r6, 0\n\
+ bl OakSpeechNidoranFSetupTemplate\n\
+ b _08044CE2\n\
+ _08044CDA:\n\
+ ldr r0, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r0]\n\
+ bl OakSpeechNidoranFSetupTemplateDummy\n\
+ _08044CE2:\n\
+ movs r0, 0x2\n\
+ mov r1, r8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08044D12\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x14]\n\
+ cmp r0, 0\n\
+ beq _08044D00\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x14]\n\
+ _08044D00:\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x10]\n\
+ cmp r0, 0\n\
+ beq _08044D12\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x10]\n\
+ _08044D12:\n\
+ movs r0, 0x1\n\
+ mov r1, r8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08044D42\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0xC]\n\
+ cmp r0, 0\n\
+ beq _08044D30\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0xC]\n\
+ _08044D30:\n\
+ ldr r0, [r4]\n\
+ ldr r0, [r0, 0x8]\n\
+ cmp r0, 0\n\
+ beq _08044D42\n\
+ bl Free\n\
+ ldr r1, [r4]\n\
+ movs r0, 0\n\
+ str r0, [r1, 0x8]\n\
+ _08044D42:\n\
+ mov r0, r8\n\
+ cmp r0, 0\n\
+ beq _08044D64\n\
+ ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r4]\n\
+ movs r1, 0\n\
+ movs r2, 0x18\n\
+ bl memset\n\
+ ldr r0, [r4]\n\
+ bl Free\n\
+ movs r0, 0\n\
+ str r0, [r4]\n\
+ b _08044D6C\n\
+ .align 2, 0\n\
+ _08044D60: .4byte sOakSpeechNidoranResources\n\
+ _08044D64:\n\
+ ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\
+ ldr r1, [r0]\n\
+ movs r0, 0xA3\n\
+ strb r0, [r1, 0x2]\n\
+ _08044D6C:\n\
+ ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\
+ ldr r0, [r0]\n\
+ _08044D70:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+ _08044D7C: .4byte sOakSpeechNidoranResources\n\
+ ");
+}
+#endif
+
+void OakSpeechNidoranFFreeResources(void)
+{
+ if (sOakSpeechNidoranResources != NULL)
+ {
+ if (sOakSpeechNidoranResources->enable != 0xA3)
+ {
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ sOakSpeechNidoranResources = NULL;
+ }
+ else
+ {
+ if (sOakSpeechNidoranResources->frameImages != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->frameImages);
+ if (sOakSpeechNidoranResources->templates != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->templates);
+ if (sOakSpeechNidoranResources->bufferPtrs != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->bufferPtrs);
+ if (sOakSpeechNidoranResources->dataBuffer != NULL)
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources->dataBuffer);
+ memset(sOakSpeechNidoranResources, 0, sizeof(struct OakSpeechNidoranFStruct));
+ FREE_AND_SET_NULL(sOakSpeechNidoranResources);
+ }
+
+ }
+}
+
+void *OakSpeechNidoranFGetBuffer(u8 bufferId)
+{
+ if (sOakSpeechNidoranResources->enable != 0xA3)
+ {
+ return NULL;
+ }
+ else
+ {
+ if (bufferId >= (s8)sOakSpeechNidoranResources->spriteCount)
+ bufferId = 0;
+ return sOakSpeechNidoranResources->bufferPtrs[bufferId];
+ }
+}