summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_controller_player.c4
-rw-r--r--src/battle_script_commands.c4
-rw-r--r--src/data/pokemon/experience_tables.h2
-rw-r--r--src/daycare.c4
-rw-r--r--src/menu2.c836
-rw-r--r--src/party_menu.c22
-rw-r--r--src/pokemon.c4
-rw-r--r--src/pokemon_special_anim.c708
-rw-r--r--src/pokemon_special_anim_scene.c1552
9 files changed, 2698 insertions, 438 deletions
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index a751c0eea..b28249a97 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -1226,7 +1226,7 @@ static void sub_80303A8(u8 taskId)
case 2:
PlaySE(SE_REGI);
if (IsMonGettingExpSentOut())
- sub_811E5B8(sprite->pos1.x + sprite->pos2.x,
+ CreateLevelUpVerticalSpritesTask(sprite->pos1.x + sprite->pos2.x,
sprite->pos1.y + sprite->pos2.y,
10000,
10000,
@@ -1235,7 +1235,7 @@ static void sub_80303A8(u8 taskId)
++data[15];
break;
case 3:
- if (!sub_811E680())
+ if (!LevelUpVerticalSpritesTaskIsRunning())
{
sprite->invisible = FALSE;
++data[15];
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index de505827f..225a47729 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -5828,7 +5828,7 @@ static void DrawLevelUpWindow1(void)
{
u16 currStats[NUM_STATS];
- BufferMonStatsToTaskData(&gPlayerParty[gBattleStruct->expGetterMonId], currStats);
+ GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats);
DrawLevelUpWindowPg1(12, gBattleResources->beforeLvlUp->stats, currStats, 0xE, 0xD, 0xF);
}
@@ -5836,7 +5836,7 @@ static void DrawLevelUpWindow2(void)
{
u16 currStats[NUM_STATS];
- BufferMonStatsToTaskData(&gPlayerParty[gBattleStruct->expGetterMonId], currStats);
+ GetMonLevelUpWindowStats(&gPlayerParty[gBattleStruct->expGetterMonId], currStats);
DrawLevelUpWindowPg2(12, currStats, 0xE, 0xD, 0xF);
}
diff --git a/src/data/pokemon/experience_tables.h b/src/data/pokemon/experience_tables.h
index b2723e9d2..15bcadeb2 100644
--- a/src/data/pokemon/experience_tables.h
+++ b/src/data/pokemon/experience_tables.h
@@ -15,7 +15,7 @@
:(n <= 36) ? ((n + 14) * CUBE(n) / 50) \
: (((n / 2) + 32) * CUBE(n) / 50)
-const u32 gExperienceTables[][MAX_MON_LEVEL + 1] =
+const u32 gExperienceTables[][MAX_LEVEL + 1] =
{
{ // Medium Fast
0, // 0
diff --git a/src/daycare.c b/src/daycare.c
index 0a19c6c9b..e07c2a234 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -479,7 +479,7 @@ static void ApplyDaycareExperience(struct Pokemon *mon)
bool8 firstMove;
u16 learnedMove;
- for (i = 0; i < MAX_MON_LEVEL; i++)
+ for (i = 0; i < MAX_LEVEL; i++)
{
// Add the mon's gained daycare experience level by level until it can't level up anymore.
if (TryIncrementMonLevel(mon))
@@ -513,7 +513,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon)
species = GetBoxMonData(&daycareMon->mon, MON_DATA_SPECIES);
BoxMonToMon(&daycareMon->mon, &pokemon);
- if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_MON_LEVEL)
+ if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL)
{
experience = GetMonData(&pokemon, MON_DATA_EXP) + daycareMon->steps;
SetMonData(&pokemon, MON_DATA_EXP, &experience);
diff --git a/src/menu2.c b/src/menu2.c
index 1957715b2..116bf7b52 100644
--- a/src/menu2.c
+++ b/src/menu2.c
@@ -9,422 +9,422 @@
static void Task_SmoothBlendLayers(u8 taskId);
-static const u8 gUnknown_845FD54[][5] = {
- [SPECIES_BULBASAUR - 1] = {0x16, 0x1b, 0x30, 0x16, 0x29},
- [SPECIES_IVYSAUR - 1] = {0x14, 0x1b, 0x30, 0x15, 0x2a},
- [SPECIES_VENUSAUR - 1] = {0x1b, 0x20, 0x20, 0x1b, 0x33},
- [SPECIES_CHARMANDER - 1] = {0x14, 0x0f, 0x38, 0x13, 0x1e},
- [SPECIES_CHARMELEON - 1] = {0x0d, 0x11, 0x30, 0x0f, 0x22},
- [SPECIES_CHARIZARD - 1] = {0x1b, 0x07, 0x28, 0x1a, 0x19},
- [SPECIES_SQUIRTLE - 1] = {0x19, 0x13, 0x30, 0x1a, 0x22},
- [SPECIES_WARTORTLE - 1] = {0x16, 0x13, 0x30, 0x17, 0x21},
- [SPECIES_BLASTOISE - 1] = {0x12, 0x08, 0x28, 0x15, 0x19},
- [SPECIES_CATERPIE - 1] = {0x15, 0x14, 0x30, 0x13, 0x24},
- [SPECIES_METAPOD - 1] = {0x13, 0x1d, 0x30, 0x18, 0x2a},
- [SPECIES_BUTTERFREE - 1] = {0x12, 0x1b, 0x08, 0x12, 0x2a},
- [SPECIES_WEEDLE - 1] = {0x16, 0x1c, 0x30, 0x15, 0x2b},
- [SPECIES_KAKUNA - 1] = {0x19, 0x13, 0x30, 0x1a, 0x24},
- [SPECIES_BEEDRILL - 1] = {0x19, 0x16, 0x08, 0x19, 0x25},
- [SPECIES_PIDGEY - 1] = {0x15, 0x12, 0x30, 0x12, 0x1e},
- [SPECIES_PIDGEOTTO - 1] = {0x24, 0x0e, 0x30, 0x1f, 0x1e},
- [SPECIES_PIDGEOT - 1] = {0x0c, 0x13, 0x08, 0x0a, 0x23},
- [SPECIES_RATTATA - 1] = {0x17, 0x1e, 0x30, 0x18, 0x2d},
- [SPECIES_RATICATE - 1] = {0x12, 0x14, 0x30, 0x10, 0x26},
- [SPECIES_SPEAROW - 1] = {0x15, 0x14, 0x30, 0x15, 0x1f},
- [SPECIES_FEAROW - 1] = {0x0c, 0x27, 0x00, 0x0b, 0x3f},
- [SPECIES_EKANS - 1] = {0x11, 0x0f, 0x30, 0x14, 0x1d},
- [SPECIES_ARBOK - 1] = {0x1b, 0x01, 0x28, 0x1d, 0x10},
- [SPECIES_PIKACHU - 1] = {0x19, 0x13, 0x30, 0x1a, 0x1f},
- [SPECIES_RAICHU - 1] = {0x19, 0x14, 0x28, 0x1c, 0x22},
- [SPECIES_SANDSHREW - 1] = {0x17, 0x16, 0x30, 0x18, 0x25},
- [SPECIES_SANDSLASH - 1] = {0x11, 0x13, 0x28, 0x13, 0x22},
- [SPECIES_NIDORAN_F - 1] = {0x16, 0x15, 0x30, 0x18, 0x21},
- [SPECIES_NIDORINA - 1] = {0x1f, 0x17, 0x30, 0x1e, 0x28},
- [SPECIES_NIDOQUEEN - 1] = {0x10, 0x0b, 0x28, 0x13, 0x1c},
- [SPECIES_NIDORAN_M - 1] = {0x15, 0x22, 0x28, 0x15, 0x31},
- [SPECIES_NIDORINO - 1] = {0x13, 0x1e, 0x28, 0x1b, 0x2d},
- [SPECIES_NIDOKING - 1] = {0x12, 0x15, 0x28, 0x13, 0x27},
- [SPECIES_CLEFAIRY - 1] = {0x19, 0x14, 0x30, 0x1b, 0x24},
- [SPECIES_CLEFABLE - 1] = {0x1c, 0x12, 0x30, 0x1d, 0x21},
- [SPECIES_VULPIX - 1] = {0x10, 0x16, 0x30, 0x0e, 0x25},
- [SPECIES_NINETALES - 1] = {0x28, 0x10, 0x28, 0x27, 0x1e},
- [SPECIES_JIGGLYPUFF - 1] = {0x1d, 0x15, 0x30, 0x1e, 0x25},
- [SPECIES_WIGGLYTUFF - 1] = {0x1a, 0x12, 0x30, 0x1c, 0x22},
- [SPECIES_ZUBAT - 1] = {0x14, 0x1d, 0x08, 0x14, 0x29},
- [SPECIES_GOLBAT - 1] = {0x23, 0x1a, 0x00, 0x21, 0x2e},
- [SPECIES_ODDISH - 1] = {0x1d, 0x20, 0x28, 0x1d, 0x2b},
- [SPECIES_GLOOM - 1] = {0x1c, 0x18, 0x28, 0x1c, 0x27},
- [SPECIES_VILEPLUME - 1] = {0x1c, 0x1e, 0x28, 0x1d, 0x2a},
- [SPECIES_PARAS - 1] = {0x1d, 0x1a, 0x30, 0x1c, 0x27},
- [SPECIES_PARASECT - 1] = {0x1e, 0x1c, 0x28, 0x20, 0x2e},
- [SPECIES_VENONAT - 1] = {0x1b, 0x16, 0x10, 0x1a, 0x29},
- [SPECIES_VENOMOTH - 1] = {0x12, 0x19, 0x08, 0x16, 0x27},
- [SPECIES_DIGLETT - 1] = {0x1e, 0x16, 0x30, 0x1c, 0x23},
- [SPECIES_DUGTRIO - 1] = {0x1a, 0x11, 0x30, 0x1a, 0x1f},
- [SPECIES_MEOWTH - 1] = {0x1c, 0x16, 0x30, 0x1c, 0x23},
- [SPECIES_PERSIAN - 1] = {0x13, 0x13, 0x30, 0x13, 0x21},
- [SPECIES_PSYDUCK - 1] = {0x1c, 0x13, 0x30, 0x17, 0x29},
- [SPECIES_GOLDUCK - 1] = {0x17, 0x12, 0x28, 0x17, 0x22},
- [SPECIES_MANKEY - 1] = {0x1c, 0x15, 0x30, 0x1b, 0x23},
- [SPECIES_PRIMEAPE - 1] = {0x1e, 0x16, 0x30, 0x1a, 0x27},
- [SPECIES_GROWLITHE - 1] = {0x14, 0x17, 0x30, 0x14, 0x24},
- [SPECIES_ARCANINE - 1] = {0x0f, 0x09, 0x28, 0x0c, 0x19},
- [SPECIES_POLIWAG - 1] = {0x15, 0x14, 0x30, 0x13, 0x1f},
- [SPECIES_POLIWHIRL - 1] = {0x1f, 0x10, 0x30, 0x1e, 0x17},
- [SPECIES_POLIWRATH - 1] = {0x22, 0x0c, 0x30, 0x21, 0x18},
- [SPECIES_ABRA - 1] = {0x1f, 0x13, 0x30, 0x1f, 0x21},
- [SPECIES_KADABRA - 1] = {0x1b, 0x12, 0x30, 0x1c, 0x25},
- [SPECIES_ALAKAZAM - 1] = {0x1c, 0x11, 0x28, 0x1d, 0x26},
- [SPECIES_MACHOP - 1] = {0x1b, 0x11, 0x30, 0x1b, 0x1e},
- [SPECIES_MACHOKE - 1] = {0x1d, 0x11, 0x30, 0x1d, 0x1f},
- [SPECIES_MACHAMP - 1] = {0x1a, 0x0d, 0x28, 0x1c, 0x1b},
- [SPECIES_BELLSPROUT - 1] = {0x15, 0x0e, 0x30, 0x0e, 0x1c},
- [SPECIES_WEEPINBELL - 1] = {0x1a, 0x1c, 0x10, 0x15, 0x32},
- [SPECIES_VICTREEBEL - 1] = {0x1e, 0x0f, 0x30, 0x1c, 0x1b},
- [SPECIES_TENTACOOL - 1] = {0x1a, 0x15, 0x30, 0x1e, 0x26},
- [SPECIES_TENTACRUEL - 1] = {0x1b, 0x10, 0x28, 0x1c, 0x26},
- [SPECIES_GEODUDE - 1] = {0x1c, 0x20, 0x28, 0x1d, 0x2d},
- [SPECIES_GRAVELER - 1] = {0x1d, 0x19, 0x28, 0x1e, 0x26},
- [SPECIES_GOLEM - 1] = {0x19, 0x1b, 0x28, 0x1c, 0x27},
- [SPECIES_PONYTA - 1] = {0x0f, 0x11, 0x30, 0x0e, 0x23},
- [SPECIES_RAPIDASH - 1] = {0x2f, 0x0f, 0x28, 0x2b, 0x1e},
- [SPECIES_SLOWPOKE - 1] = {0x14, 0x1f, 0x28, 0x15, 0x2f},
- [SPECIES_SLOWBRO - 1] = {0x0e, 0x0d, 0x28, 0x0c, 0x1f},
- [SPECIES_MAGNEMITE - 1] = {0x20, 0x1b, 0x10, 0x1f, 0x29},
- [SPECIES_MAGNETON - 1] = {0x1f, 0x14, 0x08, 0x1f, 0x22},
- [SPECIES_FARFETCHD - 1] = {0x16, 0x14, 0x30, 0x16, 0x29},
- [SPECIES_DODUO - 1] = {0x11, 0x16, 0x30, 0x0d, 0x2c},
- [SPECIES_DODRIO - 1] = {0x1d, 0x04, 0x28, 0x0e, 0x07},
- [SPECIES_SEEL - 1] = {0x1b, 0x24, 0x20, 0x17, 0x35},
- [SPECIES_DEWGONG - 1] = {0x12, 0x0a, 0x30, 0x0e, 0x1a},
- [SPECIES_GRIMER - 1] = {0x1f, 0x10, 0x30, 0x1d, 0x25},
- [SPECIES_MUK - 1] = {0x17, 0x0f, 0x30, 0x19, 0x22},
- [SPECIES_SHELLDER - 1] = {0x1a, 0x18, 0x30, 0x17, 0x29},
- [SPECIES_CLOYSTER - 1] = {0x19, 0x1e, 0x28, 0x1d, 0x2c},
- [SPECIES_GASTLY - 1] = {0x1a, 0x1f, 0x08, 0x19, 0x30},
- [SPECIES_HAUNTER - 1] = {0x20, 0x14, 0x08, 0x1d, 0x26},
- [SPECIES_GENGAR - 1] = {0x1a, 0x16, 0x30, 0x19, 0x28},
- [SPECIES_ONIX - 1] = {0x1f, 0x24, 0x20, 0x28, 0x36},
- [SPECIES_DROWZEE - 1] = {0x1a, 0x0e, 0x30, 0x1a, 0x1e},
- [SPECIES_HYPNO - 1] = {0x1c, 0x12, 0x30, 0x19, 0x24},
- [SPECIES_KRABBY - 1] = {0x1d, 0x1d, 0x30, 0x1a, 0x2b},
- [SPECIES_KINGLER - 1] = {0x1e, 0x1f, 0x28, 0x1c, 0x30},
- [SPECIES_VOLTORB - 1] = {0x1c, 0x1b, 0x30, 0x1b, 0x2b},
- [SPECIES_ELECTRODE - 1] = {0x1c, 0x18, 0x30, 0x1d, 0x2e},
- [SPECIES_EXEGGCUTE - 1] = {0x21, 0x17, 0x30, 0x20, 0x24},
- [SPECIES_EXEGGUTOR - 1] = {0x1c, 0x17, 0x28, 0x1b, 0x25},
- [SPECIES_CUBONE - 1] = {0x1b, 0x12, 0x30, 0x1b, 0x22},
- [SPECIES_MAROWAK - 1] = {0x14, 0x0f, 0x30, 0x11, 0x23},
- [SPECIES_HITMONLEE - 1] = {0x2e, 0x11, 0x30, 0x28, 0x22},
- [SPECIES_HITMONCHAN - 1] = {0x22, 0x0e, 0x30, 0x1e, 0x1d},
- [SPECIES_LICKITUNG - 1] = {0x14, 0x11, 0x30, 0x14, 0x24},
- [SPECIES_KOFFING - 1] = {0x1e, 0x14, 0x10, 0x1d, 0x20},
- [SPECIES_WEEZING - 1] = {0x11, 0x0d, 0x10, 0x0f, 0x1c},
- [SPECIES_RHYHORN - 1] = {0x0e, 0x23, 0x20, 0x14, 0x33},
- [SPECIES_RHYDON - 1] = {0x0d, 0x12, 0x28, 0x17, 0x22},
- [SPECIES_CHANSEY - 1] = {0x1a, 0x0d, 0x30, 0x1a, 0x1a},
- [SPECIES_TANGELA - 1] = {0x1c, 0x18, 0x30, 0x1d, 0x29},
- [SPECIES_KANGASKHAN - 1] = {0x1b, 0x06, 0x28, 0x1c, 0x14},
- [SPECIES_HORSEA - 1] = {0x1c, 0x14, 0x30, 0x16, 0x23},
- [SPECIES_SEADRA - 1] = {0x10, 0x17, 0x30, 0x09, 0x2a},
- [SPECIES_GOLDEEN - 1] = {0x16, 0x23, 0x20, 0x15, 0x34},
- [SPECIES_SEAKING - 1] = {0x16, 0x0f, 0x30, 0x10, 0x18},
- [SPECIES_STARYU - 1] = {0x1c, 0x18, 0x30, 0x1a, 0x26},
- [SPECIES_STARMIE - 1] = {0x1d, 0x13, 0x30, 0x1b, 0x20},
- [SPECIES_MR_MIME - 1] = {0x24, 0x11, 0x30, 0x25, 0x1e},
- [SPECIES_SCYTHER - 1] = {0x10, 0x19, 0x28, 0x12, 0x27},
- [SPECIES_JYNX - 1] = {0x1b, 0x0f, 0x30, 0x19, 0x1c},
- [SPECIES_ELECTABUZZ - 1] = {0x14, 0x11, 0x30, 0x17, 0x20},
- [SPECIES_MAGMAR - 1] = {0x10, 0x0e, 0x30, 0x0b, 0x19},
- [SPECIES_PINSIR - 1] = {0x1d, 0x1c, 0x28, 0x20, 0x2b},
- [SPECIES_TAUROS - 1] = {0x11, 0x1d, 0x28, 0x13, 0x2e},
- [SPECIES_MAGIKARP - 1] = {0x16, 0x15, 0x30, 0x13, 0x23},
- [SPECIES_GYARADOS - 1] = {0x0b, 0x18, 0x28, 0x16, 0x29},
- [SPECIES_LAPRAS - 1] = {0x16, 0x08, 0x28, 0x15, 0x16},
- [SPECIES_DITTO - 1] = {0x24, 0x12, 0x30, 0x1f, 0x20},
- [SPECIES_EEVEE - 1] = {0x16, 0x16, 0x30, 0x16, 0x23},
- [SPECIES_VAPOREON - 1] = {0x18, 0x23, 0x28, 0x18, 0x30},
- [SPECIES_JOLTEON - 1] = {0x14, 0x1b, 0x30, 0x16, 0x28},
- [SPECIES_FLAREON - 1] = {0x16, 0x17, 0x30, 0x14, 0x25},
- [SPECIES_PORYGON - 1] = {0x18, 0x12, 0x30, 0x10, 0x23},
- [SPECIES_OMANYTE - 1] = {0x1d, 0x1d, 0x30, 0x1c, 0x2b},
- [SPECIES_OMASTAR - 1] = {0x16, 0x1a, 0x30, 0x19, 0x2d},
- [SPECIES_KABUTO - 1] = {0x1b, 0x16, 0x30, 0x1a, 0x27},
- [SPECIES_KABUTOPS - 1] = {0x15, 0x11, 0x30, 0x15, 0x1f},
- [SPECIES_AERODACTYL - 1] = {0x13, 0x1d, 0x00, 0x14, 0x30},
- [SPECIES_SNORLAX - 1] = {0x35, 0x09, 0x30, 0x2e, 0x14},
- [SPECIES_ARTICUNO - 1] = {0x18, 0x0b, 0x18, 0x17, 0x17},
- [SPECIES_ZAPDOS - 1] = {0x0e, 0x0e, 0x10, 0x04, 0x28},
- [SPECIES_MOLTRES - 1] = {0x0b, 0x2a, 0x08, 0x0b, 0x38},
- [SPECIES_DRATINI - 1] = {0x0d, 0x12, 0x30, 0x0b, 0x21},
- [SPECIES_DRAGONAIR - 1] = {0x18, 0x0e, 0x30, 0x13, 0x1c},
- [SPECIES_DRAGONITE - 1] = {0x1b, 0x07, 0x18, 0x19, 0x17},
- [SPECIES_MEWTWO - 1] = {0x2b, 0x09, 0x28, 0x2c, 0x18},
- [SPECIES_MEW - 1] = {0x19, 0x14, 0x10, 0x1f, 0x21},
- [SPECIES_CHIKORITA - 1] = {0x1b, 0x17, 0x30, 0x1b, 0x24},
- [SPECIES_BAYLEEF - 1] = {0x1d, 0x10, 0x30, 0x20, 0x1d},
- [SPECIES_MEGANIUM - 1] = {0x05, 0x0d, 0x28, 0x0d, 0x1b},
- [SPECIES_CYNDAQUIL - 1] = {0x11, 0x1b, 0x30, 0x14, 0x27},
- [SPECIES_QUILAVA - 1] = {0x25, 0x18, 0x30, 0x27, 0x26},
- [SPECIES_TYPHLOSION - 1] = {0x09, 0x10, 0x28, 0x10, 0x1c},
- [SPECIES_TOTODILE - 1] = {0x16, 0x10, 0x30, 0x19, 0x20},
- [SPECIES_CROCONAW - 1] = {0x16, 0x10, 0x30, 0x18, 0x21},
- [SPECIES_FERALIGATR - 1] = {0x0e, 0x0a, 0x28, 0x08, 0x1a},
- [SPECIES_SENTRET - 1] = {0x1e, 0x0a, 0x30, 0x1d, 0x15},
- [SPECIES_FURRET - 1] = {0x21, 0x0e, 0x30, 0x21, 0x19},
- [SPECIES_HOOTHOOT - 1] = {0x1d, 0x15, 0x30, 0x1c, 0x24},
- [SPECIES_NOCTOWL - 1] = {0x19, 0x0e, 0x30, 0x18, 0x1c},
- [SPECIES_LEDYBA - 1] = {0x1b, 0x15, 0x30, 0x1c, 0x24},
- [SPECIES_LEDIAN - 1] = {0x18, 0x12, 0x10, 0x1c, 0x21},
- [SPECIES_SPINARAK - 1] = {0x20, 0x20, 0x28, 0x20, 0x2d},
- [SPECIES_ARIADOS - 1] = {0x17, 0x23, 0x28, 0x15, 0x30},
- [SPECIES_CROBAT - 1] = {0x22, 0x1e, 0x08, 0x23, 0x2b},
- [SPECIES_CHINCHOU - 1] = {0x1f, 0x1d, 0x30, 0x1f, 0x29},
- [SPECIES_LANTURN - 1] = {0x10, 0x23, 0x28, 0x19, 0x33},
- [SPECIES_PICHU - 1] = {0x1e, 0x17, 0x30, 0x1e, 0x24},
- [SPECIES_CLEFFA - 1] = {0x1c, 0x18, 0x30, 0x1e, 0x26},
- [SPECIES_IGGLYBUFF - 1] = {0x1f, 0x19, 0x30, 0x1f, 0x24},
- [SPECIES_TOGEPI - 1] = {0x21, 0x15, 0x30, 0x1f, 0x20},
- [SPECIES_TOGETIC - 1] = {0x1b, 0x10, 0x30, 0x1c, 0x1c},
- [SPECIES_NATU - 1] = {0x1c, 0x17, 0x30, 0x15, 0x21},
- [SPECIES_XATU - 1] = {0x1b, 0x08, 0x30, 0x19, 0x14},
- [SPECIES_MAREEP - 1] = {0x16, 0x15, 0x30, 0x15, 0x24},
- [SPECIES_FLAAFFY - 1] = {0x19, 0x12, 0x30, 0x18, 0x21},
- [SPECIES_AMPHAROS - 1] = {0x0f, 0x0a, 0x30, 0x10, 0x1b},
- [SPECIES_BELLOSSOM - 1] = {0x1f, 0x13, 0x30, 0x1f, 0x20},
- [SPECIES_MARILL - 1] = {0x1d, 0x15, 0x30, 0x1d, 0x22},
- [SPECIES_AZUMARILL - 1] = {0x1a, 0x12, 0x30, 0x17, 0x1f},
- [SPECIES_SUDOWOODO - 1] = {0x20, 0x10, 0x30, 0x20, 0x1f},
- [SPECIES_POLITOED - 1] = {0x1d, 0x0f, 0x30, 0x1e, 0x20},
- [SPECIES_HOPPIP - 1] = {0x23, 0x25, 0x08, 0x25, 0x33},
- [SPECIES_SKIPLOOM - 1] = {0x1e, 0x18, 0x08, 0x1c, 0x27},
- [SPECIES_JUMPLUFF - 1] = {0x1d, 0x21, 0x08, 0x20, 0x2f},
- [SPECIES_AIPOM - 1] = {0x1e, 0x29, 0x18, 0x1e, 0x35},
- [SPECIES_SUNKERN - 1] = {0x1f, 0x20, 0x08, 0x24, 0x2e},
- [SPECIES_SUNFLORA - 1] = {0x1c, 0x0c, 0x30, 0x1b, 0x19},
- [SPECIES_YANMA - 1] = {0x1b, 0x28, 0x08, 0x16, 0x35},
- [SPECIES_WOOPER - 1] = {0x1d, 0x13, 0x30, 0x1f, 0x21},
- [SPECIES_QUAGSIRE - 1] = {0x15, 0x09, 0x30, 0x12, 0x18},
- [SPECIES_ESPEON - 1] = {0x11, 0x1b, 0x30, 0x11, 0x29},
- [SPECIES_UMBREON - 1] = {0x23, 0x15, 0x30, 0x23, 0x22},
- [SPECIES_MURKROW - 1] = {0x24, 0x13, 0x30, 0x20, 0x22},
- [SPECIES_SLOWKING - 1] = {0x1e, 0x13, 0x28, 0x1d, 0x25},
- [SPECIES_MISDREAVUS - 1] = {0x28, 0x21, 0x08, 0x26, 0x2e},
- [SPECIES_UNOWN - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},
- [SPECIES_WOBBUFFET - 1] = {0x1d, 0x09, 0x30, 0x1d, 0x1a},
- [SPECIES_GIRAFARIG - 1] = {0x0b, 0x0d, 0x28, 0x11, 0x1d},
- [SPECIES_PINECO - 1] = {0x1d, 0x12, 0x10, 0x19, 0x25},
- [SPECIES_FORRETRESS - 1] = {0x19, 0x17, 0x08, 0x1e, 0x26},
- [SPECIES_DUNSPARCE - 1] = {0x10, 0x1b, 0x30, 0x0c, 0x2d},
- [SPECIES_GLIGAR - 1] = {0x1e, 0x13, 0x08, 0x1d, 0x23},
- [SPECIES_STEELIX - 1] = {0x0c, 0x0d, 0x28, 0x0d, 0x1c},
- [SPECIES_SNUBBULL - 1] = {0x1b, 0x15, 0x30, 0x1a, 0x23},
- [SPECIES_GRANBULL - 1] = {0x1c, 0x09, 0x30, 0x19, 0x18},
- [SPECIES_QWILFISH - 1] = {0x1f, 0x26, 0x20, 0x1d, 0x33},
- [SPECIES_SCIZOR - 1] = {0x15, 0x0f, 0x10, 0x1a, 0x1a},
- [SPECIES_SHUCKLE - 1] = {0x25, 0x0a, 0x30, 0x24, 0x18},
- [SPECIES_HERACROSS - 1] = {0x18, 0x19, 0x28, 0x1a, 0x26},
- [SPECIES_SNEASEL - 1] = {0x1c, 0x13, 0x30, 0x1d, 0x24},
- [SPECIES_TEDDIURSA - 1] = {0x1e, 0x12, 0x30, 0x1b, 0x23},
- [SPECIES_URSARING - 1] = {0x1e, 0x04, 0x28, 0x1d, 0x14},
- [SPECIES_SLUGMA - 1] = {0x20, 0x18, 0x30, 0x20, 0x28},
- [SPECIES_MAGCARGO - 1] = {0x16, 0x11, 0x30, 0x17, 0x23},
- [SPECIES_SWINUB - 1] = {0x1c, 0x18, 0x30, 0x1b, 0x25},
- [SPECIES_PILOSWINE - 1] = {0x18, 0x23, 0x20, 0x18, 0x36},
- [SPECIES_CORSOLA - 1] = {0x19, 0x1d, 0x28, 0x19, 0x2b},
- [SPECIES_REMORAID - 1] = {0x15, 0x1f, 0x28, 0x13, 0x2b},
- [SPECIES_OCTILLERY - 1] = {0x1c, 0x11, 0x30, 0x1a, 0x20},
- [SPECIES_DELIBIRD - 1] = {0x1d, 0x11, 0x30, 0x1b, 0x1f},
- [SPECIES_MANTINE - 1] = {0x16, 0x1e, 0x28, 0x1f, 0x27},
- [SPECIES_SKARMORY - 1] = {0x1e, 0x00, 0x28, 0x13, 0x07},
- [SPECIES_HOUNDOUR - 1] = {0x25, 0x11, 0x30, 0x25, 0x1f},
- [SPECIES_HOUNDOOM - 1] = {0x0d, 0x13, 0x30, 0x0d, 0x24},
- [SPECIES_KINGDRA - 1] = {0x0e, 0x13, 0x28, 0x0a, 0x2c},
- [SPECIES_PHANPY - 1] = {0x1b, 0x11, 0x30, 0x19, 0x24},
- [SPECIES_DONPHAN - 1] = {0x11, 0x15, 0x30, 0x19, 0x2c},
- [SPECIES_PORYGON2 - 1] = {0x18, 0x11, 0x30, 0x11, 0x20},
- [SPECIES_STANTLER - 1] = {0x15, 0x15, 0x28, 0x17, 0x28},
- [SPECIES_SMEARGLE - 1] = {0x18, 0x10, 0x30, 0x1b, 0x25},
- [SPECIES_TYROGUE - 1] = {0x1e, 0x12, 0x30, 0x1f, 0x1f},
- [SPECIES_HITMONTOP - 1] = {0x1a, 0x39, 0x10, 0x1a, 0x2b},
- [SPECIES_SMOOCHUM - 1] = {0x20, 0x18, 0x30, 0x21, 0x26},
- [SPECIES_ELEKID - 1] = {0x1d, 0x14, 0x30, 0x1d, 0x23},
- [SPECIES_MAGBY - 1] = {0x1c, 0x15, 0x30, 0x1a, 0x24},
- [SPECIES_MILTANK - 1] = {0x18, 0x0e, 0x30, 0x18, 0x1e},
- [SPECIES_BLISSEY - 1] = {0x1d, 0x09, 0x30, 0x1d, 0x19},
- [SPECIES_RAIKOU - 1] = {0x29, 0x0c, 0x28, 0x27, 0x1e},
- [SPECIES_ENTEI - 1] = {0x08, 0x09, 0x28, 0x0b, 0x18},
- [SPECIES_SUICUNE - 1] = {0x23, 0x1d, 0x28, 0x26, 0x2c},
- [SPECIES_LARVITAR - 1] = {0x1c, 0x18, 0x30, 0x1a, 0x24},
- [SPECIES_PUPITAR - 1] = {0x1b, 0x19, 0x30, 0x1b, 0x28},
- [SPECIES_TYRANITAR - 1] = {0x06, 0x0b, 0x28, 0x0d, 0x19},
- [SPECIES_LUGIA - 1] = {0x08, 0x2a, 0x08, 0x14, 0x34},
- [SPECIES_HO_OH - 1] = {0x0d, 0x25, 0x08, 0x0e, 0x34},
- [SPECIES_CELEBI - 1] = {0x15, 0x21, 0x08, 0x1a, 0x2b},
- [SPECIES_OLD_UNOWN_B - 1] = {0x1f, 0x12, 0x08, 0x1e, 0x1c},
- [SPECIES_OLD_UNOWN_C - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},
- [SPECIES_OLD_UNOWN_D - 1] = {0x1c, 0x19, 0x08, 0x1b, 0x23},
- [SPECIES_OLD_UNOWN_E - 1] = {0x21, 0x19, 0x08, 0x20, 0x23},
- [SPECIES_OLD_UNOWN_F - 1] = {0x1b, 0x13, 0x08, 0x1a, 0x1d},
- [SPECIES_OLD_UNOWN_G - 1] = {0x20, 0x16, 0x08, 0x1f, 0x21},
- [SPECIES_OLD_UNOWN_H - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
- [SPECIES_OLD_UNOWN_I - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
- [SPECIES_OLD_UNOWN_J - 1] = {0x20, 0x16, 0x08, 0x1f, 0x20},
- [SPECIES_OLD_UNOWN_K - 1] = {0x1d, 0x1a, 0x08, 0x1c, 0x24},
- [SPECIES_OLD_UNOWN_L - 1] = {0x20, 0x16, 0x08, 0x1f, 0x1f},
- [SPECIES_OLD_UNOWN_M - 1] = {0x20, 0x1c, 0x08, 0x1f, 0x26},
- [SPECIES_OLD_UNOWN_N - 1] = {0x20, 0x1a, 0x08, 0x1f, 0x23},
- [SPECIES_OLD_UNOWN_O - 1] = {0x20, 0x1a, 0x08, 0x1f, 0x23},
- [SPECIES_OLD_UNOWN_P - 1] = {0x20, 0x16, 0x08, 0x1f, 0x20},
- [SPECIES_OLD_UNOWN_Q - 1] = {0x1d, 0x16, 0x08, 0x1c, 0x20},
- [SPECIES_OLD_UNOWN_R - 1] = {0x20, 0x15, 0x08, 0x1f, 0x1f},
- [SPECIES_OLD_UNOWN_S - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
- [SPECIES_OLD_UNOWN_T - 1] = {0x20, 0x1e, 0x08, 0x1f, 0x28},
- [SPECIES_OLD_UNOWN_U - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},
- [SPECIES_OLD_UNOWN_V - 1] = {0x1e, 0x1e, 0x08, 0x1d, 0x28},
- [SPECIES_OLD_UNOWN_W - 1] = {0x20, 0x1d, 0x08, 0x1f, 0x27},
- [SPECIES_OLD_UNOWN_X - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
- [SPECIES_OLD_UNOWN_Y - 1] = {0x20, 0x15, 0x08, 0x1f, 0x1f},
- [SPECIES_OLD_UNOWN_Z - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
- [SPECIES_TREECKO - 1] = {0x1a, 0x0f, 0x30, 0x19, 0x20},
- [SPECIES_GROVYLE - 1] = {0x0d, 0x05, 0x10, 0x05, 0x13},
- [SPECIES_SCEPTILE - 1] = {0x10, 0x04, 0x28, 0x0c, 0x12},
- [SPECIES_TORCHIC - 1] = {0x17, 0x18, 0x30, 0x15, 0x25},
- [SPECIES_COMBUSKEN - 1] = {0x20, 0x12, 0x28, 0x1e, 0x20},
- [SPECIES_BLAZIKEN - 1] = {0x1a, 0x07, 0x28, 0x1d, 0x13},
- [SPECIES_MUDKIP - 1] = {0x1b, 0x1d, 0x28, 0x19, 0x2c},
- [SPECIES_MARSHTOMP - 1] = {0x1d, 0x11, 0x30, 0x1c, 0x20},
- [SPECIES_SWAMPERT - 1] = {0x1b, 0x11, 0x28, 0x1b, 0x23},
- [SPECIES_POOCHYENA - 1] = {0x14, 0x12, 0x30, 0x0f, 0x20},
- [SPECIES_MIGHTYENA - 1] = {0x09, 0x0d, 0x28, 0x09, 0x1c},
- [SPECIES_ZIGZAGOON - 1] = {0x0b, 0x1a, 0x30, 0x09, 0x2b},
- [SPECIES_LINOONE - 1] = {0x0d, 0x28, 0x18, 0x0b, 0x37},
- [SPECIES_WURMPLE - 1] = {0x21, 0x17, 0x30, 0x1f, 0x26},
- [SPECIES_SILCOON - 1] = {0x13, 0x1c, 0x30, 0x11, 0x2a},
- [SPECIES_BEAUTIFLY - 1] = {0x0f, 0x1b, 0x08, 0x0e, 0x28},
- [SPECIES_CASCOON - 1] = {0x14, 0x1d, 0x30, 0x11, 0x2c},
- [SPECIES_DUSTOX - 1] = {0x14, 0x19, 0x08, 0x16, 0x26},
- [SPECIES_LOTAD - 1] = {0x19, 0x25, 0x28, 0x17, 0x32},
- [SPECIES_LOMBRE - 1] = {0x22, 0x10, 0x30, 0x29, 0x1d},
- [SPECIES_LUDICOLO - 1] = {0x1c, 0x0f, 0x28, 0x1b, 0x24},
- [SPECIES_SEEDOT - 1] = {0x1b, 0x17, 0x30, 0x18, 0x28},
- [SPECIES_NUZLEAF - 1] = {0x20, 0x0d, 0x30, 0x1a, 0x1d},
- [SPECIES_SHIFTRY - 1] = {0x32, 0x11, 0x28, 0x2e, 0x23},
- [SPECIES_NINCADA - 1] = {0x18, 0x1a, 0x30, 0x17, 0x28},
- [SPECIES_NINJASK - 1] = {0x17, 0x21, 0x00, 0x17, 0x2f},
- [SPECIES_SHEDINJA - 1] = {0x16, 0x19, 0x08, 0x18, 0x2a},
- [SPECIES_TAILLOW - 1] = {0x17, 0x10, 0x30, 0x14, 0x1e},
- [SPECIES_SWELLOW - 1] = {0x0c, 0x0a, 0x28, 0x05, 0x16},
- [SPECIES_SHROOMISH - 1] = {0x1f, 0x16, 0x30, 0x1d, 0x23},
- [SPECIES_BRELOOM - 1] = {0x25, 0x0c, 0x30, 0x23, 0x19},
- [SPECIES_SPINDA - 1] = {0x21, 0x16, 0x30, 0x1f, 0x27},
- [SPECIES_WINGULL - 1] = {0x1a, 0x16, 0x10, 0x15, 0x26},
- [SPECIES_PELIPPER - 1] = {0x1d, 0x0a, 0x10, 0x09, 0x1b},
- [SPECIES_SURSKIT - 1] = {0x1d, 0x16, 0x30, 0x1c, 0x25},
- [SPECIES_MASQUERAIN - 1] = {0x1a, 0x21, 0x08, 0x14, 0x30},
- [SPECIES_WAILMER - 1] = {0x17, 0x17, 0x30, 0x16, 0x28},
- [SPECIES_WAILORD - 1] = {0x17, 0x03, 0x30, 0x09, 0x13},
- [SPECIES_SKITTY - 1] = {0x24, 0x1a, 0x30, 0x22, 0x2a},
- [SPECIES_DELCATTY - 1] = {0x1e, 0x12, 0x30, 0x1c, 0x21},
- [SPECIES_KECLEON - 1] = {0x19, 0x10, 0x30, 0x13, 0x1e},
- [SPECIES_BALTOY - 1] = {0x1d, 0x15, 0x30, 0x1b, 0x22},
- [SPECIES_CLAYDOL - 1] = {0x1e, 0x0d, 0x28, 0x1d, 0x24},
- [SPECIES_NOSEPASS - 1] = {0x1f, 0x10, 0x30, 0x15, 0x23},
- [SPECIES_TORKOAL - 1] = {0x0e, 0x19, 0x28, 0x0a, 0x27},
- [SPECIES_SABLEYE - 1] = {0x1e, 0x16, 0x30, 0x1d, 0x27},
- [SPECIES_BARBOACH - 1] = {0x17, 0x12, 0x30, 0x15, 0x1e},
- [SPECIES_WHISCASH - 1] = {0x18, 0x20, 0x28, 0x17, 0x31},
- [SPECIES_LUVDISC - 1] = {0x19, 0x0f, 0x30, 0x13, 0x1c},
- [SPECIES_CORPHISH - 1] = {0x1f, 0x14, 0x30, 0x1d, 0x23},
- [SPECIES_CRAWDAUNT - 1] = {0x14, 0x0c, 0x28, 0x18, 0x23},
- [SPECIES_FEEBAS - 1] = {0x18, 0x1e, 0x28, 0x16, 0x2f},
- [SPECIES_MILOTIC - 1] = {0x20, 0x0c, 0x28, 0x1f, 0x1d},
- [SPECIES_CARVANHA - 1] = {0x16, 0x19, 0x30, 0x13, 0x22},
- [SPECIES_SHARPEDO - 1] = {0x19, 0x0c, 0x28, 0x17, 0x27},
- [SPECIES_TRAPINCH - 1] = {0x29, 0x13, 0x30, 0x17, 0x18},
- [SPECIES_VIBRAVA - 1] = {0x10, 0x27, 0x20, 0x0e, 0x34},
- [SPECIES_FLYGON - 1] = {0x22, 0x07, 0x10, 0x21, 0x13},
- [SPECIES_MAKUHITA - 1] = {0x22, 0x13, 0x30, 0x1c, 0x23},
- [SPECIES_HARIYAMA - 1] = {0x24, 0x0f, 0x28, 0x26, 0x1c},
- [SPECIES_ELECTRIKE - 1] = {0x11, 0x18, 0x30, 0x14, 0x27},
- [SPECIES_MANECTRIC - 1] = {0x2f, 0x18, 0x28, 0x2e, 0x29},
- [SPECIES_NUMEL - 1] = {0x10, 0x1a, 0x30, 0x0d, 0x2a},
- [SPECIES_CAMERUPT - 1] = {0x0d, 0x22, 0x28, 0x0e, 0x36},
- [SPECIES_SPHEAL - 1] = {0x1e, 0x0f, 0x30, 0x18, 0x1f},
- [SPECIES_SEALEO - 1] = {0x1c, 0x09, 0x30, 0x1a, 0x18},
- [SPECIES_WALREIN - 1] = {0x19, 0x01, 0x28, 0x10, 0x16},
- [SPECIES_CACNEA - 1] = {0x1f, 0x17, 0x30, 0x1d, 0x29},
- [SPECIES_CACTURNE - 1] = {0x1d, 0x0e, 0x28, 0x1d, 0x1b},
- [SPECIES_SNORUNT - 1] = {0x1e, 0x16, 0x30, 0x1e, 0x26},
- [SPECIES_GLALIE - 1] = {0x1a, 0x1c, 0x08, 0x1a, 0x31},
- [SPECIES_LUNATONE - 1] = {0x1c, 0x16, 0x08, 0x19, 0x2c},
- [SPECIES_SOLROCK - 1] = {0x18, 0x18, 0x10, 0x17, 0x31},
- [SPECIES_AZURILL - 1] = {0x1b, 0x10, 0x30, 0x18, 0x1f},
- [SPECIES_SPOINK - 1] = {0x21, 0x14, 0x30, 0x1b, 0x28},
- [SPECIES_GRUMPIG - 1] = {0x14, 0x10, 0x30, 0x15, 0x20},
- [SPECIES_PLUSLE - 1] = {0x1c, 0x16, 0x08, 0x1d, 0x25},
- [SPECIES_MINUN - 1] = {0x21, 0x16, 0x08, 0x1f, 0x26},
- [SPECIES_MAWILE - 1] = {0x2d, 0x14, 0x30, 0x2f, 0x24},
- [SPECIES_MEDITITE - 1] = {0x1f, 0x17, 0x30, 0x1e, 0x25},
- [SPECIES_MEDICHAM - 1] = {0x21, 0x0f, 0x28, 0x1e, 0x1d},
- [SPECIES_SWABLU - 1] = {0x1b, 0x16, 0x10, 0x17, 0x23},
- [SPECIES_ALTARIA - 1] = {0x1d, 0x0b, 0x10, 0x1a, 0x1a},
- [SPECIES_WYNAUT - 1] = {0x1a, 0x15, 0x30, 0x1b, 0x26},
- [SPECIES_DUSKULL - 1] = {0x10, 0x18, 0x08, 0x14, 0x2e},
- [SPECIES_DUSCLOPS - 1] = {0x1c, 0x0f, 0x30, 0x1a, 0x28},
- [SPECIES_ROSELIA - 1] = {0x1e, 0x11, 0x30, 0x1d, 0x20},
- [SPECIES_SLAKOTH - 1] = {0x19, 0x1e, 0x30, 0x18, 0x2f},
- [SPECIES_VIGOROTH - 1] = {0x10, 0x12, 0x28, 0x14, 0x24},
- [SPECIES_SLAKING - 1] = {0x37, 0x0f, 0x30, 0x29, 0x21},
- [SPECIES_GULPIN - 1] = {0x1b, 0x18, 0x30, 0x17, 0x26},
- [SPECIES_SWALOT - 1] = {0x1f, 0x06, 0x30, 0x15, 0x13},
- [SPECIES_TROPIUS - 1] = {0x18, 0x0a, 0x28, 0x20, 0x18},
- [SPECIES_WHISMUR - 1] = {0x1f, 0x19, 0x30, 0x1d, 0x29},
- [SPECIES_LOUDRED - 1] = {0x1c, 0x12, 0x28, 0x22, 0x27},
- [SPECIES_EXPLOUD - 1] = {0x10, 0x10, 0x28, 0x1a, 0x2a},
- [SPECIES_CLAMPERL - 1] = {0x20, 0x1a, 0x30, 0x1e, 0x26},
- [SPECIES_HUNTAIL - 1] = {0x13, 0x1e, 0x28, 0x15, 0x33},
- [SPECIES_GOREBYSS - 1] = {0x0d, 0x1f, 0x28, 0x03, 0x32},
- [SPECIES_ABSOL - 1] = {0x2a, 0x11, 0x28, 0x2a, 0x22},
- [SPECIES_SHUPPET - 1] = {0x16, 0x19, 0x08, 0x17, 0x27},
- [SPECIES_BANETTE - 1] = {0x1c, 0x14, 0x08, 0x1b, 0x23},
- [SPECIES_SEVIPER - 1] = {0x0e, 0x0d, 0x30, 0x0b, 0x1e},
- [SPECIES_ZANGOOSE - 1] = {0x18, 0x0c, 0x28, 0x15, 0x1a},
- [SPECIES_RELICANTH - 1] = {0x0c, 0x1f, 0x30, 0x09, 0x2d},
- [SPECIES_ARON - 1] = {0x18, 0x1c, 0x30, 0x1a, 0x2c},
- [SPECIES_LAIRON - 1] = {0x0b, 0x21, 0x30, 0x12, 0x2f},
- [SPECIES_AGGRON - 1] = {0x10, 0x0b, 0x28, 0x16, 0x1b},
- [SPECIES_CASTFORM - 1] = {0x1d, 0x18, 0x08, 0x1b, 0x26},
- [SPECIES_VOLBEAT - 1] = {0x25, 0x15, 0x08, 0x21, 0x25},
- [SPECIES_ILLUMISE - 1] = {0x20, 0x12, 0x08, 0x1f, 0x20},
- [SPECIES_LILEEP - 1] = {0x1e, 0x11, 0x30, 0x1f, 0x1e},
- [SPECIES_CRADILY - 1] = {0x12, 0x16, 0x28, 0x15, 0x28},
- [SPECIES_ANORITH - 1] = {0x1c, 0x1e, 0x30, 0x1b, 0x2b},
- [SPECIES_ARMALDO - 1] = {0x15, 0x05, 0x28, 0x14, 0x13},
- [SPECIES_RALTS - 1] = {0x1f, 0x17, 0x30, 0x20, 0x23},
- [SPECIES_KIRLIA - 1] = {0x1c, 0x12, 0x30, 0x1f, 0x1e},
- [SPECIES_GARDEVOIR - 1] = {0x35, 0x07, 0x28, 0x32, 0x14},
- [SPECIES_BAGON - 1] = {0x17, 0x13, 0x30, 0x16, 0x26},
- [SPECIES_SHELGON - 1] = {0x19, 0x1b, 0x30, 0x19, 0x2c},
- [SPECIES_SALAMENCE - 1] = {0x09, 0x11, 0x30, 0x0a, 0x21},
- [SPECIES_BELDUM - 1] = {0x16, 0x19, 0x08, 0x18, 0x23},
- [SPECIES_METANG - 1] = {0x22, 0x0f, 0x10, 0x1f, 0x21},
- [SPECIES_METAGROSS - 1] = {0x24, 0x1b, 0x28, 0x22, 0x2b},
- [SPECIES_REGIROCK - 1] = {0x16, 0x07, 0x28, 0x14, 0x12},
- [SPECIES_REGICE - 1] = {0x19, 0x0c, 0x28, 0x17, 0x19},
- [SPECIES_REGISTEEL - 1] = {0x19, 0x0d, 0x28, 0x19, 0x19},
- [SPECIES_KYOGRE - 1] = {0x0e, 0x19, 0x28, 0x0b, 0x26},
- [SPECIES_GROUDON - 1] = {0x04, 0x0b, 0x28, 0x0a, 0x19},
- [SPECIES_RAYQUAZA - 1] = {0x0c, 0x0e, 0x10, 0x0e, 0x1f},
- [SPECIES_LATIAS - 1] = {0x1e, 0x0c, 0x10, 0x23, 0x19},
- [SPECIES_LATIOS - 1] = {0x05, 0x0e, 0x10, 0x05, 0x1d},
- [SPECIES_JIRACHI - 1] = {0x1c, 0x15, 0x08, 0x1e, 0x22},
+static const u8 sMonSpriteAnchorCoords[][5] = {
+ [SPECIES_BULBASAUR - 1] = {0x16, 0x1b, 0x30, 0x16, 0x29},
+ [SPECIES_IVYSAUR - 1] = {0x14, 0x1b, 0x30, 0x15, 0x2a},
+ [SPECIES_VENUSAUR - 1] = {0x1b, 0x20, 0x20, 0x1b, 0x33},
+ [SPECIES_CHARMANDER - 1] = {0x14, 0x0f, 0x38, 0x13, 0x1e},
+ [SPECIES_CHARMELEON - 1] = {0x0d, 0x11, 0x30, 0x0f, 0x22},
+ [SPECIES_CHARIZARD - 1] = {0x1b, 0x07, 0x28, 0x1a, 0x19},
+ [SPECIES_SQUIRTLE - 1] = {0x19, 0x13, 0x30, 0x1a, 0x22},
+ [SPECIES_WARTORTLE - 1] = {0x16, 0x13, 0x30, 0x17, 0x21},
+ [SPECIES_BLASTOISE - 1] = {0x12, 0x08, 0x28, 0x15, 0x19},
+ [SPECIES_CATERPIE - 1] = {0x15, 0x14, 0x30, 0x13, 0x24},
+ [SPECIES_METAPOD - 1] = {0x13, 0x1d, 0x30, 0x18, 0x2a},
+ [SPECIES_BUTTERFREE - 1] = {0x12, 0x1b, 0x08, 0x12, 0x2a},
+ [SPECIES_WEEDLE - 1] = {0x16, 0x1c, 0x30, 0x15, 0x2b},
+ [SPECIES_KAKUNA - 1] = {0x19, 0x13, 0x30, 0x1a, 0x24},
+ [SPECIES_BEEDRILL - 1] = {0x19, 0x16, 0x08, 0x19, 0x25},
+ [SPECIES_PIDGEY - 1] = {0x15, 0x12, 0x30, 0x12, 0x1e},
+ [SPECIES_PIDGEOTTO - 1] = {0x24, 0x0e, 0x30, 0x1f, 0x1e},
+ [SPECIES_PIDGEOT - 1] = {0x0c, 0x13, 0x08, 0x0a, 0x23},
+ [SPECIES_RATTATA - 1] = {0x17, 0x1e, 0x30, 0x18, 0x2d},
+ [SPECIES_RATICATE - 1] = {0x12, 0x14, 0x30, 0x10, 0x26},
+ [SPECIES_SPEAROW - 1] = {0x15, 0x14, 0x30, 0x15, 0x1f},
+ [SPECIES_FEAROW - 1] = {0x0c, 0x27, 0x00, 0x0b, 0x3f},
+ [SPECIES_EKANS - 1] = {0x11, 0x0f, 0x30, 0x14, 0x1d},
+ [SPECIES_ARBOK - 1] = {0x1b, 0x01, 0x28, 0x1d, 0x10},
+ [SPECIES_PIKACHU - 1] = {0x19, 0x13, 0x30, 0x1a, 0x1f},
+ [SPECIES_RAICHU - 1] = {0x19, 0x14, 0x28, 0x1c, 0x22},
+ [SPECIES_SANDSHREW - 1] = {0x17, 0x16, 0x30, 0x18, 0x25},
+ [SPECIES_SANDSLASH - 1] = {0x11, 0x13, 0x28, 0x13, 0x22},
+ [SPECIES_NIDORAN_F - 1] = {0x16, 0x15, 0x30, 0x18, 0x21},
+ [SPECIES_NIDORINA - 1] = {0x1f, 0x17, 0x30, 0x1e, 0x28},
+ [SPECIES_NIDOQUEEN - 1] = {0x10, 0x0b, 0x28, 0x13, 0x1c},
+ [SPECIES_NIDORAN_M - 1] = {0x15, 0x22, 0x28, 0x15, 0x31},
+ [SPECIES_NIDORINO - 1] = {0x13, 0x1e, 0x28, 0x1b, 0x2d},
+ [SPECIES_NIDOKING - 1] = {0x12, 0x15, 0x28, 0x13, 0x27},
+ [SPECIES_CLEFAIRY - 1] = {0x19, 0x14, 0x30, 0x1b, 0x24},
+ [SPECIES_CLEFABLE - 1] = {0x1c, 0x12, 0x30, 0x1d, 0x21},
+ [SPECIES_VULPIX - 1] = {0x10, 0x16, 0x30, 0x0e, 0x25},
+ [SPECIES_NINETALES - 1] = {0x28, 0x10, 0x28, 0x27, 0x1e},
+ [SPECIES_JIGGLYPUFF - 1] = {0x1d, 0x15, 0x30, 0x1e, 0x25},
+ [SPECIES_WIGGLYTUFF - 1] = {0x1a, 0x12, 0x30, 0x1c, 0x22},
+ [SPECIES_ZUBAT - 1] = {0x14, 0x1d, 0x08, 0x14, 0x29},
+ [SPECIES_GOLBAT - 1] = {0x23, 0x1a, 0x00, 0x21, 0x2e},
+ [SPECIES_ODDISH - 1] = {0x1d, 0x20, 0x28, 0x1d, 0x2b},
+ [SPECIES_GLOOM - 1] = {0x1c, 0x18, 0x28, 0x1c, 0x27},
+ [SPECIES_VILEPLUME - 1] = {0x1c, 0x1e, 0x28, 0x1d, 0x2a},
+ [SPECIES_PARAS - 1] = {0x1d, 0x1a, 0x30, 0x1c, 0x27},
+ [SPECIES_PARASECT - 1] = {0x1e, 0x1c, 0x28, 0x20, 0x2e},
+ [SPECIES_VENONAT - 1] = {0x1b, 0x16, 0x10, 0x1a, 0x29},
+ [SPECIES_VENOMOTH - 1] = {0x12, 0x19, 0x08, 0x16, 0x27},
+ [SPECIES_DIGLETT - 1] = {0x1e, 0x16, 0x30, 0x1c, 0x23},
+ [SPECIES_DUGTRIO - 1] = {0x1a, 0x11, 0x30, 0x1a, 0x1f},
+ [SPECIES_MEOWTH - 1] = {0x1c, 0x16, 0x30, 0x1c, 0x23},
+ [SPECIES_PERSIAN - 1] = {0x13, 0x13, 0x30, 0x13, 0x21},
+ [SPECIES_PSYDUCK - 1] = {0x1c, 0x13, 0x30, 0x17, 0x29},
+ [SPECIES_GOLDUCK - 1] = {0x17, 0x12, 0x28, 0x17, 0x22},
+ [SPECIES_MANKEY - 1] = {0x1c, 0x15, 0x30, 0x1b, 0x23},
+ [SPECIES_PRIMEAPE - 1] = {0x1e, 0x16, 0x30, 0x1a, 0x27},
+ [SPECIES_GROWLITHE - 1] = {0x14, 0x17, 0x30, 0x14, 0x24},
+ [SPECIES_ARCANINE - 1] = {0x0f, 0x09, 0x28, 0x0c, 0x19},
+ [SPECIES_POLIWAG - 1] = {0x15, 0x14, 0x30, 0x13, 0x1f},
+ [SPECIES_POLIWHIRL - 1] = {0x1f, 0x10, 0x30, 0x1e, 0x17},
+ [SPECIES_POLIWRATH - 1] = {0x22, 0x0c, 0x30, 0x21, 0x18},
+ [SPECIES_ABRA - 1] = {0x1f, 0x13, 0x30, 0x1f, 0x21},
+ [SPECIES_KADABRA - 1] = {0x1b, 0x12, 0x30, 0x1c, 0x25},
+ [SPECIES_ALAKAZAM - 1] = {0x1c, 0x11, 0x28, 0x1d, 0x26},
+ [SPECIES_MACHOP - 1] = {0x1b, 0x11, 0x30, 0x1b, 0x1e},
+ [SPECIES_MACHOKE - 1] = {0x1d, 0x11, 0x30, 0x1d, 0x1f},
+ [SPECIES_MACHAMP - 1] = {0x1a, 0x0d, 0x28, 0x1c, 0x1b},
+ [SPECIES_BELLSPROUT - 1] = {0x15, 0x0e, 0x30, 0x0e, 0x1c},
+ [SPECIES_WEEPINBELL - 1] = {0x1a, 0x1c, 0x10, 0x15, 0x32},
+ [SPECIES_VICTREEBEL - 1] = {0x1e, 0x0f, 0x30, 0x1c, 0x1b},
+ [SPECIES_TENTACOOL - 1] = {0x1a, 0x15, 0x30, 0x1e, 0x26},
+ [SPECIES_TENTACRUEL - 1] = {0x1b, 0x10, 0x28, 0x1c, 0x26},
+ [SPECIES_GEODUDE - 1] = {0x1c, 0x20, 0x28, 0x1d, 0x2d},
+ [SPECIES_GRAVELER - 1] = {0x1d, 0x19, 0x28, 0x1e, 0x26},
+ [SPECIES_GOLEM - 1] = {0x19, 0x1b, 0x28, 0x1c, 0x27},
+ [SPECIES_PONYTA - 1] = {0x0f, 0x11, 0x30, 0x0e, 0x23},
+ [SPECIES_RAPIDASH - 1] = {0x2f, 0x0f, 0x28, 0x2b, 0x1e},
+ [SPECIES_SLOWPOKE - 1] = {0x14, 0x1f, 0x28, 0x15, 0x2f},
+ [SPECIES_SLOWBRO - 1] = {0x0e, 0x0d, 0x28, 0x0c, 0x1f},
+ [SPECIES_MAGNEMITE - 1] = {0x20, 0x1b, 0x10, 0x1f, 0x29},
+ [SPECIES_MAGNETON - 1] = {0x1f, 0x14, 0x08, 0x1f, 0x22},
+ [SPECIES_FARFETCHD - 1] = {0x16, 0x14, 0x30, 0x16, 0x29},
+ [SPECIES_DODUO - 1] = {0x11, 0x16, 0x30, 0x0d, 0x2c},
+ [SPECIES_DODRIO - 1] = {0x1d, 0x04, 0x28, 0x0e, 0x07},
+ [SPECIES_SEEL - 1] = {0x1b, 0x24, 0x20, 0x17, 0x35},
+ [SPECIES_DEWGONG - 1] = {0x12, 0x0a, 0x30, 0x0e, 0x1a},
+ [SPECIES_GRIMER - 1] = {0x1f, 0x10, 0x30, 0x1d, 0x25},
+ [SPECIES_MUK - 1] = {0x17, 0x0f, 0x30, 0x19, 0x22},
+ [SPECIES_SHELLDER - 1] = {0x1a, 0x18, 0x30, 0x17, 0x29},
+ [SPECIES_CLOYSTER - 1] = {0x19, 0x1e, 0x28, 0x1d, 0x2c},
+ [SPECIES_GASTLY - 1] = {0x1a, 0x1f, 0x08, 0x19, 0x30},
+ [SPECIES_HAUNTER - 1] = {0x20, 0x14, 0x08, 0x1d, 0x26},
+ [SPECIES_GENGAR - 1] = {0x1a, 0x16, 0x30, 0x19, 0x28},
+ [SPECIES_ONIX - 1] = {0x1f, 0x24, 0x20, 0x28, 0x36},
+ [SPECIES_DROWZEE - 1] = {0x1a, 0x0e, 0x30, 0x1a, 0x1e},
+ [SPECIES_HYPNO - 1] = {0x1c, 0x12, 0x30, 0x19, 0x24},
+ [SPECIES_KRABBY - 1] = {0x1d, 0x1d, 0x30, 0x1a, 0x2b},
+ [SPECIES_KINGLER - 1] = {0x1e, 0x1f, 0x28, 0x1c, 0x30},
+ [SPECIES_VOLTORB - 1] = {0x1c, 0x1b, 0x30, 0x1b, 0x2b},
+ [SPECIES_ELECTRODE - 1] = {0x1c, 0x18, 0x30, 0x1d, 0x2e},
+ [SPECIES_EXEGGCUTE - 1] = {0x21, 0x17, 0x30, 0x20, 0x24},
+ [SPECIES_EXEGGUTOR - 1] = {0x1c, 0x17, 0x28, 0x1b, 0x25},
+ [SPECIES_CUBONE - 1] = {0x1b, 0x12, 0x30, 0x1b, 0x22},
+ [SPECIES_MAROWAK - 1] = {0x14, 0x0f, 0x30, 0x11, 0x23},
+ [SPECIES_HITMONLEE - 1] = {0x2e, 0x11, 0x30, 0x28, 0x22},
+ [SPECIES_HITMONCHAN - 1] = {0x22, 0x0e, 0x30, 0x1e, 0x1d},
+ [SPECIES_LICKITUNG - 1] = {0x14, 0x11, 0x30, 0x14, 0x24},
+ [SPECIES_KOFFING - 1] = {0x1e, 0x14, 0x10, 0x1d, 0x20},
+ [SPECIES_WEEZING - 1] = {0x11, 0x0d, 0x10, 0x0f, 0x1c},
+ [SPECIES_RHYHORN - 1] = {0x0e, 0x23, 0x20, 0x14, 0x33},
+ [SPECIES_RHYDON - 1] = {0x0d, 0x12, 0x28, 0x17, 0x22},
+ [SPECIES_CHANSEY - 1] = {0x1a, 0x0d, 0x30, 0x1a, 0x1a},
+ [SPECIES_TANGELA - 1] = {0x1c, 0x18, 0x30, 0x1d, 0x29},
+ [SPECIES_KANGASKHAN - 1] = {0x1b, 0x06, 0x28, 0x1c, 0x14},
+ [SPECIES_HORSEA - 1] = {0x1c, 0x14, 0x30, 0x16, 0x23},
+ [SPECIES_SEADRA - 1] = {0x10, 0x17, 0x30, 0x09, 0x2a},
+ [SPECIES_GOLDEEN - 1] = {0x16, 0x23, 0x20, 0x15, 0x34},
+ [SPECIES_SEAKING - 1] = {0x16, 0x0f, 0x30, 0x10, 0x18},
+ [SPECIES_STARYU - 1] = {0x1c, 0x18, 0x30, 0x1a, 0x26},
+ [SPECIES_STARMIE - 1] = {0x1d, 0x13, 0x30, 0x1b, 0x20},
+ [SPECIES_MR_MIME - 1] = {0x24, 0x11, 0x30, 0x25, 0x1e},
+ [SPECIES_SCYTHER - 1] = {0x10, 0x19, 0x28, 0x12, 0x27},
+ [SPECIES_JYNX - 1] = {0x1b, 0x0f, 0x30, 0x19, 0x1c},
+ [SPECIES_ELECTABUZZ - 1] = {0x14, 0x11, 0x30, 0x17, 0x20},
+ [SPECIES_MAGMAR - 1] = {0x10, 0x0e, 0x30, 0x0b, 0x19},
+ [SPECIES_PINSIR - 1] = {0x1d, 0x1c, 0x28, 0x20, 0x2b},
+ [SPECIES_TAUROS - 1] = {0x11, 0x1d, 0x28, 0x13, 0x2e},
+ [SPECIES_MAGIKARP - 1] = {0x16, 0x15, 0x30, 0x13, 0x23},
+ [SPECIES_GYARADOS - 1] = {0x0b, 0x18, 0x28, 0x16, 0x29},
+ [SPECIES_LAPRAS - 1] = {0x16, 0x08, 0x28, 0x15, 0x16},
+ [SPECIES_DITTO - 1] = {0x24, 0x12, 0x30, 0x1f, 0x20},
+ [SPECIES_EEVEE - 1] = {0x16, 0x16, 0x30, 0x16, 0x23},
+ [SPECIES_VAPOREON - 1] = {0x18, 0x23, 0x28, 0x18, 0x30},
+ [SPECIES_JOLTEON - 1] = {0x14, 0x1b, 0x30, 0x16, 0x28},
+ [SPECIES_FLAREON - 1] = {0x16, 0x17, 0x30, 0x14, 0x25},
+ [SPECIES_PORYGON - 1] = {0x18, 0x12, 0x30, 0x10, 0x23},
+ [SPECIES_OMANYTE - 1] = {0x1d, 0x1d, 0x30, 0x1c, 0x2b},
+ [SPECIES_OMASTAR - 1] = {0x16, 0x1a, 0x30, 0x19, 0x2d},
+ [SPECIES_KABUTO - 1] = {0x1b, 0x16, 0x30, 0x1a, 0x27},
+ [SPECIES_KABUTOPS - 1] = {0x15, 0x11, 0x30, 0x15, 0x1f},
+ [SPECIES_AERODACTYL - 1] = {0x13, 0x1d, 0x00, 0x14, 0x30},
+ [SPECIES_SNORLAX - 1] = {0x35, 0x09, 0x30, 0x2e, 0x14},
+ [SPECIES_ARTICUNO - 1] = {0x18, 0x0b, 0x18, 0x17, 0x17},
+ [SPECIES_ZAPDOS - 1] = {0x0e, 0x0e, 0x10, 0x04, 0x28},
+ [SPECIES_MOLTRES - 1] = {0x0b, 0x2a, 0x08, 0x0b, 0x38},
+ [SPECIES_DRATINI - 1] = {0x0d, 0x12, 0x30, 0x0b, 0x21},
+ [SPECIES_DRAGONAIR - 1] = {0x18, 0x0e, 0x30, 0x13, 0x1c},
+ [SPECIES_DRAGONITE - 1] = {0x1b, 0x07, 0x18, 0x19, 0x17},
+ [SPECIES_MEWTWO - 1] = {0x2b, 0x09, 0x28, 0x2c, 0x18},
+ [SPECIES_MEW - 1] = {0x19, 0x14, 0x10, 0x1f, 0x21},
+ [SPECIES_CHIKORITA - 1] = {0x1b, 0x17, 0x30, 0x1b, 0x24},
+ [SPECIES_BAYLEEF - 1] = {0x1d, 0x10, 0x30, 0x20, 0x1d},
+ [SPECIES_MEGANIUM - 1] = {0x05, 0x0d, 0x28, 0x0d, 0x1b},
+ [SPECIES_CYNDAQUIL - 1] = {0x11, 0x1b, 0x30, 0x14, 0x27},
+ [SPECIES_QUILAVA - 1] = {0x25, 0x18, 0x30, 0x27, 0x26},
+ [SPECIES_TYPHLOSION - 1] = {0x09, 0x10, 0x28, 0x10, 0x1c},
+ [SPECIES_TOTODILE - 1] = {0x16, 0x10, 0x30, 0x19, 0x20},
+ [SPECIES_CROCONAW - 1] = {0x16, 0x10, 0x30, 0x18, 0x21},
+ [SPECIES_FERALIGATR - 1] = {0x0e, 0x0a, 0x28, 0x08, 0x1a},
+ [SPECIES_SENTRET - 1] = {0x1e, 0x0a, 0x30, 0x1d, 0x15},
+ [SPECIES_FURRET - 1] = {0x21, 0x0e, 0x30, 0x21, 0x19},
+ [SPECIES_HOOTHOOT - 1] = {0x1d, 0x15, 0x30, 0x1c, 0x24},
+ [SPECIES_NOCTOWL - 1] = {0x19, 0x0e, 0x30, 0x18, 0x1c},
+ [SPECIES_LEDYBA - 1] = {0x1b, 0x15, 0x30, 0x1c, 0x24},
+ [SPECIES_LEDIAN - 1] = {0x18, 0x12, 0x10, 0x1c, 0x21},
+ [SPECIES_SPINARAK - 1] = {0x20, 0x20, 0x28, 0x20, 0x2d},
+ [SPECIES_ARIADOS - 1] = {0x17, 0x23, 0x28, 0x15, 0x30},
+ [SPECIES_CROBAT - 1] = {0x22, 0x1e, 0x08, 0x23, 0x2b},
+ [SPECIES_CHINCHOU - 1] = {0x1f, 0x1d, 0x30, 0x1f, 0x29},
+ [SPECIES_LANTURN - 1] = {0x10, 0x23, 0x28, 0x19, 0x33},
+ [SPECIES_PICHU - 1] = {0x1e, 0x17, 0x30, 0x1e, 0x24},
+ [SPECIES_CLEFFA - 1] = {0x1c, 0x18, 0x30, 0x1e, 0x26},
+ [SPECIES_IGGLYBUFF - 1] = {0x1f, 0x19, 0x30, 0x1f, 0x24},
+ [SPECIES_TOGEPI - 1] = {0x21, 0x15, 0x30, 0x1f, 0x20},
+ [SPECIES_TOGETIC - 1] = {0x1b, 0x10, 0x30, 0x1c, 0x1c},
+ [SPECIES_NATU - 1] = {0x1c, 0x17, 0x30, 0x15, 0x21},
+ [SPECIES_XATU - 1] = {0x1b, 0x08, 0x30, 0x19, 0x14},
+ [SPECIES_MAREEP - 1] = {0x16, 0x15, 0x30, 0x15, 0x24},
+ [SPECIES_FLAAFFY - 1] = {0x19, 0x12, 0x30, 0x18, 0x21},
+ [SPECIES_AMPHAROS - 1] = {0x0f, 0x0a, 0x30, 0x10, 0x1b},
+ [SPECIES_BELLOSSOM - 1] = {0x1f, 0x13, 0x30, 0x1f, 0x20},
+ [SPECIES_MARILL - 1] = {0x1d, 0x15, 0x30, 0x1d, 0x22},
+ [SPECIES_AZUMARILL - 1] = {0x1a, 0x12, 0x30, 0x17, 0x1f},
+ [SPECIES_SUDOWOODO - 1] = {0x20, 0x10, 0x30, 0x20, 0x1f},
+ [SPECIES_POLITOED - 1] = {0x1d, 0x0f, 0x30, 0x1e, 0x20},
+ [SPECIES_HOPPIP - 1] = {0x23, 0x25, 0x08, 0x25, 0x33},
+ [SPECIES_SKIPLOOM - 1] = {0x1e, 0x18, 0x08, 0x1c, 0x27},
+ [SPECIES_JUMPLUFF - 1] = {0x1d, 0x21, 0x08, 0x20, 0x2f},
+ [SPECIES_AIPOM - 1] = {0x1e, 0x29, 0x18, 0x1e, 0x35},
+ [SPECIES_SUNKERN - 1] = {0x1f, 0x20, 0x08, 0x24, 0x2e},
+ [SPECIES_SUNFLORA - 1] = {0x1c, 0x0c, 0x30, 0x1b, 0x19},
+ [SPECIES_YANMA - 1] = {0x1b, 0x28, 0x08, 0x16, 0x35},
+ [SPECIES_WOOPER - 1] = {0x1d, 0x13, 0x30, 0x1f, 0x21},
+ [SPECIES_QUAGSIRE - 1] = {0x15, 0x09, 0x30, 0x12, 0x18},
+ [SPECIES_ESPEON - 1] = {0x11, 0x1b, 0x30, 0x11, 0x29},
+ [SPECIES_UMBREON - 1] = {0x23, 0x15, 0x30, 0x23, 0x22},
+ [SPECIES_MURKROW - 1] = {0x24, 0x13, 0x30, 0x20, 0x22},
+ [SPECIES_SLOWKING - 1] = {0x1e, 0x13, 0x28, 0x1d, 0x25},
+ [SPECIES_MISDREAVUS - 1] = {0x28, 0x21, 0x08, 0x26, 0x2e},
+ [SPECIES_UNOWN - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},
+ [SPECIES_WOBBUFFET - 1] = {0x1d, 0x09, 0x30, 0x1d, 0x1a},
+ [SPECIES_GIRAFARIG - 1] = {0x0b, 0x0d, 0x28, 0x11, 0x1d},
+ [SPECIES_PINECO - 1] = {0x1d, 0x12, 0x10, 0x19, 0x25},
+ [SPECIES_FORRETRESS - 1] = {0x19, 0x17, 0x08, 0x1e, 0x26},
+ [SPECIES_DUNSPARCE - 1] = {0x10, 0x1b, 0x30, 0x0c, 0x2d},
+ [SPECIES_GLIGAR - 1] = {0x1e, 0x13, 0x08, 0x1d, 0x23},
+ [SPECIES_STEELIX - 1] = {0x0c, 0x0d, 0x28, 0x0d, 0x1c},
+ [SPECIES_SNUBBULL - 1] = {0x1b, 0x15, 0x30, 0x1a, 0x23},
+ [SPECIES_GRANBULL - 1] = {0x1c, 0x09, 0x30, 0x19, 0x18},
+ [SPECIES_QWILFISH - 1] = {0x1f, 0x26, 0x20, 0x1d, 0x33},
+ [SPECIES_SCIZOR - 1] = {0x15, 0x0f, 0x10, 0x1a, 0x1a},
+ [SPECIES_SHUCKLE - 1] = {0x25, 0x0a, 0x30, 0x24, 0x18},
+ [SPECIES_HERACROSS - 1] = {0x18, 0x19, 0x28, 0x1a, 0x26},
+ [SPECIES_SNEASEL - 1] = {0x1c, 0x13, 0x30, 0x1d, 0x24},
+ [SPECIES_TEDDIURSA - 1] = {0x1e, 0x12, 0x30, 0x1b, 0x23},
+ [SPECIES_URSARING - 1] = {0x1e, 0x04, 0x28, 0x1d, 0x14},
+ [SPECIES_SLUGMA - 1] = {0x20, 0x18, 0x30, 0x20, 0x28},
+ [SPECIES_MAGCARGO - 1] = {0x16, 0x11, 0x30, 0x17, 0x23},
+ [SPECIES_SWINUB - 1] = {0x1c, 0x18, 0x30, 0x1b, 0x25},
+ [SPECIES_PILOSWINE - 1] = {0x18, 0x23, 0x20, 0x18, 0x36},
+ [SPECIES_CORSOLA - 1] = {0x19, 0x1d, 0x28, 0x19, 0x2b},
+ [SPECIES_REMORAID - 1] = {0x15, 0x1f, 0x28, 0x13, 0x2b},
+ [SPECIES_OCTILLERY - 1] = {0x1c, 0x11, 0x30, 0x1a, 0x20},
+ [SPECIES_DELIBIRD - 1] = {0x1d, 0x11, 0x30, 0x1b, 0x1f},
+ [SPECIES_MANTINE - 1] = {0x16, 0x1e, 0x28, 0x1f, 0x27},
+ [SPECIES_SKARMORY - 1] = {0x1e, 0x00, 0x28, 0x13, 0x07},
+ [SPECIES_HOUNDOUR - 1] = {0x25, 0x11, 0x30, 0x25, 0x1f},
+ [SPECIES_HOUNDOOM - 1] = {0x0d, 0x13, 0x30, 0x0d, 0x24},
+ [SPECIES_KINGDRA - 1] = {0x0e, 0x13, 0x28, 0x0a, 0x2c},
+ [SPECIES_PHANPY - 1] = {0x1b, 0x11, 0x30, 0x19, 0x24},
+ [SPECIES_DONPHAN - 1] = {0x11, 0x15, 0x30, 0x19, 0x2c},
+ [SPECIES_PORYGON2 - 1] = {0x18, 0x11, 0x30, 0x11, 0x20},
+ [SPECIES_STANTLER - 1] = {0x15, 0x15, 0x28, 0x17, 0x28},
+ [SPECIES_SMEARGLE - 1] = {0x18, 0x10, 0x30, 0x1b, 0x25},
+ [SPECIES_TYROGUE - 1] = {0x1e, 0x12, 0x30, 0x1f, 0x1f},
+ [SPECIES_HITMONTOP - 1] = {0x1a, 0x39, 0x10, 0x1a, 0x2b},
+ [SPECIES_SMOOCHUM - 1] = {0x20, 0x18, 0x30, 0x21, 0x26},
+ [SPECIES_ELEKID - 1] = {0x1d, 0x14, 0x30, 0x1d, 0x23},
+ [SPECIES_MAGBY - 1] = {0x1c, 0x15, 0x30, 0x1a, 0x24},
+ [SPECIES_MILTANK - 1] = {0x18, 0x0e, 0x30, 0x18, 0x1e},
+ [SPECIES_BLISSEY - 1] = {0x1d, 0x09, 0x30, 0x1d, 0x19},
+ [SPECIES_RAIKOU - 1] = {0x29, 0x0c, 0x28, 0x27, 0x1e},
+ [SPECIES_ENTEI - 1] = {0x08, 0x09, 0x28, 0x0b, 0x18},
+ [SPECIES_SUICUNE - 1] = {0x23, 0x1d, 0x28, 0x26, 0x2c},
+ [SPECIES_LARVITAR - 1] = {0x1c, 0x18, 0x30, 0x1a, 0x24},
+ [SPECIES_PUPITAR - 1] = {0x1b, 0x19, 0x30, 0x1b, 0x28},
+ [SPECIES_TYRANITAR - 1] = {0x06, 0x0b, 0x28, 0x0d, 0x19},
+ [SPECIES_LUGIA - 1] = {0x08, 0x2a, 0x08, 0x14, 0x34},
+ [SPECIES_HO_OH - 1] = {0x0d, 0x25, 0x08, 0x0e, 0x34},
+ [SPECIES_CELEBI - 1] = {0x15, 0x21, 0x08, 0x1a, 0x2b},
+ [SPECIES_OLD_UNOWN_B - 1] = {0x1f, 0x12, 0x08, 0x1e, 0x1c},
+ [SPECIES_OLD_UNOWN_C - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},
+ [SPECIES_OLD_UNOWN_D - 1] = {0x1c, 0x19, 0x08, 0x1b, 0x23},
+ [SPECIES_OLD_UNOWN_E - 1] = {0x21, 0x19, 0x08, 0x20, 0x23},
+ [SPECIES_OLD_UNOWN_F - 1] = {0x1b, 0x13, 0x08, 0x1a, 0x1d},
+ [SPECIES_OLD_UNOWN_G - 1] = {0x20, 0x16, 0x08, 0x1f, 0x21},
+ [SPECIES_OLD_UNOWN_H - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
+ [SPECIES_OLD_UNOWN_I - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
+ [SPECIES_OLD_UNOWN_J - 1] = {0x20, 0x16, 0x08, 0x1f, 0x20},
+ [SPECIES_OLD_UNOWN_K - 1] = {0x1d, 0x1a, 0x08, 0x1c, 0x24},
+ [SPECIES_OLD_UNOWN_L - 1] = {0x20, 0x16, 0x08, 0x1f, 0x1f},
+ [SPECIES_OLD_UNOWN_M - 1] = {0x20, 0x1c, 0x08, 0x1f, 0x26},
+ [SPECIES_OLD_UNOWN_N - 1] = {0x20, 0x1a, 0x08, 0x1f, 0x23},
+ [SPECIES_OLD_UNOWN_O - 1] = {0x20, 0x1a, 0x08, 0x1f, 0x23},
+ [SPECIES_OLD_UNOWN_P - 1] = {0x20, 0x16, 0x08, 0x1f, 0x20},
+ [SPECIES_OLD_UNOWN_Q - 1] = {0x1d, 0x16, 0x08, 0x1c, 0x20},
+ [SPECIES_OLD_UNOWN_R - 1] = {0x20, 0x15, 0x08, 0x1f, 0x1f},
+ [SPECIES_OLD_UNOWN_S - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
+ [SPECIES_OLD_UNOWN_T - 1] = {0x20, 0x1e, 0x08, 0x1f, 0x28},
+ [SPECIES_OLD_UNOWN_U - 1] = {0x20, 0x17, 0x08, 0x1f, 0x21},
+ [SPECIES_OLD_UNOWN_V - 1] = {0x1e, 0x1e, 0x08, 0x1d, 0x28},
+ [SPECIES_OLD_UNOWN_W - 1] = {0x20, 0x1d, 0x08, 0x1f, 0x27},
+ [SPECIES_OLD_UNOWN_X - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
+ [SPECIES_OLD_UNOWN_Y - 1] = {0x20, 0x15, 0x08, 0x1f, 0x1f},
+ [SPECIES_OLD_UNOWN_Z - 1] = {0x20, 0x19, 0x08, 0x1f, 0x23},
+ [SPECIES_TREECKO - 1] = {0x1a, 0x0f, 0x30, 0x19, 0x20},
+ [SPECIES_GROVYLE - 1] = {0x0d, 0x05, 0x10, 0x05, 0x13},
+ [SPECIES_SCEPTILE - 1] = {0x10, 0x04, 0x28, 0x0c, 0x12},
+ [SPECIES_TORCHIC - 1] = {0x17, 0x18, 0x30, 0x15, 0x25},
+ [SPECIES_COMBUSKEN - 1] = {0x20, 0x12, 0x28, 0x1e, 0x20},
+ [SPECIES_BLAZIKEN - 1] = {0x1a, 0x07, 0x28, 0x1d, 0x13},
+ [SPECIES_MUDKIP - 1] = {0x1b, 0x1d, 0x28, 0x19, 0x2c},
+ [SPECIES_MARSHTOMP - 1] = {0x1d, 0x11, 0x30, 0x1c, 0x20},
+ [SPECIES_SWAMPERT - 1] = {0x1b, 0x11, 0x28, 0x1b, 0x23},
+ [SPECIES_POOCHYENA - 1] = {0x14, 0x12, 0x30, 0x0f, 0x20},
+ [SPECIES_MIGHTYENA - 1] = {0x09, 0x0d, 0x28, 0x09, 0x1c},
+ [SPECIES_ZIGZAGOON - 1] = {0x0b, 0x1a, 0x30, 0x09, 0x2b},
+ [SPECIES_LINOONE - 1] = {0x0d, 0x28, 0x18, 0x0b, 0x37},
+ [SPECIES_WURMPLE - 1] = {0x21, 0x17, 0x30, 0x1f, 0x26},
+ [SPECIES_SILCOON - 1] = {0x13, 0x1c, 0x30, 0x11, 0x2a},
+ [SPECIES_BEAUTIFLY - 1] = {0x0f, 0x1b, 0x08, 0x0e, 0x28},
+ [SPECIES_CASCOON - 1] = {0x14, 0x1d, 0x30, 0x11, 0x2c},
+ [SPECIES_DUSTOX - 1] = {0x14, 0x19, 0x08, 0x16, 0x26},
+ [SPECIES_LOTAD - 1] = {0x19, 0x25, 0x28, 0x17, 0x32},
+ [SPECIES_LOMBRE - 1] = {0x22, 0x10, 0x30, 0x29, 0x1d},
+ [SPECIES_LUDICOLO - 1] = {0x1c, 0x0f, 0x28, 0x1b, 0x24},
+ [SPECIES_SEEDOT - 1] = {0x1b, 0x17, 0x30, 0x18, 0x28},
+ [SPECIES_NUZLEAF - 1] = {0x20, 0x0d, 0x30, 0x1a, 0x1d},
+ [SPECIES_SHIFTRY - 1] = {0x32, 0x11, 0x28, 0x2e, 0x23},
+ [SPECIES_NINCADA - 1] = {0x18, 0x1a, 0x30, 0x17, 0x28},
+ [SPECIES_NINJASK - 1] = {0x17, 0x21, 0x00, 0x17, 0x2f},
+ [SPECIES_SHEDINJA - 1] = {0x16, 0x19, 0x08, 0x18, 0x2a},
+ [SPECIES_TAILLOW - 1] = {0x17, 0x10, 0x30, 0x14, 0x1e},
+ [SPECIES_SWELLOW - 1] = {0x0c, 0x0a, 0x28, 0x05, 0x16},
+ [SPECIES_SHROOMISH - 1] = {0x1f, 0x16, 0x30, 0x1d, 0x23},
+ [SPECIES_BRELOOM - 1] = {0x25, 0x0c, 0x30, 0x23, 0x19},
+ [SPECIES_SPINDA - 1] = {0x21, 0x16, 0x30, 0x1f, 0x27},
+ [SPECIES_WINGULL - 1] = {0x1a, 0x16, 0x10, 0x15, 0x26},
+ [SPECIES_PELIPPER - 1] = {0x1d, 0x0a, 0x10, 0x09, 0x1b},
+ [SPECIES_SURSKIT - 1] = {0x1d, 0x16, 0x30, 0x1c, 0x25},
+ [SPECIES_MASQUERAIN - 1] = {0x1a, 0x21, 0x08, 0x14, 0x30},
+ [SPECIES_WAILMER - 1] = {0x17, 0x17, 0x30, 0x16, 0x28},
+ [SPECIES_WAILORD - 1] = {0x17, 0x03, 0x30, 0x09, 0x13},
+ [SPECIES_SKITTY - 1] = {0x24, 0x1a, 0x30, 0x22, 0x2a},
+ [SPECIES_DELCATTY - 1] = {0x1e, 0x12, 0x30, 0x1c, 0x21},
+ [SPECIES_KECLEON - 1] = {0x19, 0x10, 0x30, 0x13, 0x1e},
+ [SPECIES_BALTOY - 1] = {0x1d, 0x15, 0x30, 0x1b, 0x22},
+ [SPECIES_CLAYDOL - 1] = {0x1e, 0x0d, 0x28, 0x1d, 0x24},
+ [SPECIES_NOSEPASS - 1] = {0x1f, 0x10, 0x30, 0x15, 0x23},
+ [SPECIES_TORKOAL - 1] = {0x0e, 0x19, 0x28, 0x0a, 0x27},
+ [SPECIES_SABLEYE - 1] = {0x1e, 0x16, 0x30, 0x1d, 0x27},
+ [SPECIES_BARBOACH - 1] = {0x17, 0x12, 0x30, 0x15, 0x1e},
+ [SPECIES_WHISCASH - 1] = {0x18, 0x20, 0x28, 0x17, 0x31},
+ [SPECIES_LUVDISC - 1] = {0x19, 0x0f, 0x30, 0x13, 0x1c},
+ [SPECIES_CORPHISH - 1] = {0x1f, 0x14, 0x30, 0x1d, 0x23},
+ [SPECIES_CRAWDAUNT - 1] = {0x14, 0x0c, 0x28, 0x18, 0x23},
+ [SPECIES_FEEBAS - 1] = {0x18, 0x1e, 0x28, 0x16, 0x2f},
+ [SPECIES_MILOTIC - 1] = {0x20, 0x0c, 0x28, 0x1f, 0x1d},
+ [SPECIES_CARVANHA - 1] = {0x16, 0x19, 0x30, 0x13, 0x22},
+ [SPECIES_SHARPEDO - 1] = {0x19, 0x0c, 0x28, 0x17, 0x27},
+ [SPECIES_TRAPINCH - 1] = {0x29, 0x13, 0x30, 0x17, 0x18},
+ [SPECIES_VIBRAVA - 1] = {0x10, 0x27, 0x20, 0x0e, 0x34},
+ [SPECIES_FLYGON - 1] = {0x22, 0x07, 0x10, 0x21, 0x13},
+ [SPECIES_MAKUHITA - 1] = {0x22, 0x13, 0x30, 0x1c, 0x23},
+ [SPECIES_HARIYAMA - 1] = {0x24, 0x0f, 0x28, 0x26, 0x1c},
+ [SPECIES_ELECTRIKE - 1] = {0x11, 0x18, 0x30, 0x14, 0x27},
+ [SPECIES_MANECTRIC - 1] = {0x2f, 0x18, 0x28, 0x2e, 0x29},
+ [SPECIES_NUMEL - 1] = {0x10, 0x1a, 0x30, 0x0d, 0x2a},
+ [SPECIES_CAMERUPT - 1] = {0x0d, 0x22, 0x28, 0x0e, 0x36},
+ [SPECIES_SPHEAL - 1] = {0x1e, 0x0f, 0x30, 0x18, 0x1f},
+ [SPECIES_SEALEO - 1] = {0x1c, 0x09, 0x30, 0x1a, 0x18},
+ [SPECIES_WALREIN - 1] = {0x19, 0x01, 0x28, 0x10, 0x16},
+ [SPECIES_CACNEA - 1] = {0x1f, 0x17, 0x30, 0x1d, 0x29},
+ [SPECIES_CACTURNE - 1] = {0x1d, 0x0e, 0x28, 0x1d, 0x1b},
+ [SPECIES_SNORUNT - 1] = {0x1e, 0x16, 0x30, 0x1e, 0x26},
+ [SPECIES_GLALIE - 1] = {0x1a, 0x1c, 0x08, 0x1a, 0x31},
+ [SPECIES_LUNATONE - 1] = {0x1c, 0x16, 0x08, 0x19, 0x2c},
+ [SPECIES_SOLROCK - 1] = {0x18, 0x18, 0x10, 0x17, 0x31},
+ [SPECIES_AZURILL - 1] = {0x1b, 0x10, 0x30, 0x18, 0x1f},
+ [SPECIES_SPOINK - 1] = {0x21, 0x14, 0x30, 0x1b, 0x28},
+ [SPECIES_GRUMPIG - 1] = {0x14, 0x10, 0x30, 0x15, 0x20},
+ [SPECIES_PLUSLE - 1] = {0x1c, 0x16, 0x08, 0x1d, 0x25},
+ [SPECIES_MINUN - 1] = {0x21, 0x16, 0x08, 0x1f, 0x26},
+ [SPECIES_MAWILE - 1] = {0x2d, 0x14, 0x30, 0x2f, 0x24},
+ [SPECIES_MEDITITE - 1] = {0x1f, 0x17, 0x30, 0x1e, 0x25},
+ [SPECIES_MEDICHAM - 1] = {0x21, 0x0f, 0x28, 0x1e, 0x1d},
+ [SPECIES_SWABLU - 1] = {0x1b, 0x16, 0x10, 0x17, 0x23},
+ [SPECIES_ALTARIA - 1] = {0x1d, 0x0b, 0x10, 0x1a, 0x1a},
+ [SPECIES_WYNAUT - 1] = {0x1a, 0x15, 0x30, 0x1b, 0x26},
+ [SPECIES_DUSKULL - 1] = {0x10, 0x18, 0x08, 0x14, 0x2e},
+ [SPECIES_DUSCLOPS - 1] = {0x1c, 0x0f, 0x30, 0x1a, 0x28},
+ [SPECIES_ROSELIA - 1] = {0x1e, 0x11, 0x30, 0x1d, 0x20},
+ [SPECIES_SLAKOTH - 1] = {0x19, 0x1e, 0x30, 0x18, 0x2f},
+ [SPECIES_VIGOROTH - 1] = {0x10, 0x12, 0x28, 0x14, 0x24},
+ [SPECIES_SLAKING - 1] = {0x37, 0x0f, 0x30, 0x29, 0x21},
+ [SPECIES_GULPIN - 1] = {0x1b, 0x18, 0x30, 0x17, 0x26},
+ [SPECIES_SWALOT - 1] = {0x1f, 0x06, 0x30, 0x15, 0x13},
+ [SPECIES_TROPIUS - 1] = {0x18, 0x0a, 0x28, 0x20, 0x18},
+ [SPECIES_WHISMUR - 1] = {0x1f, 0x19, 0x30, 0x1d, 0x29},
+ [SPECIES_LOUDRED - 1] = {0x1c, 0x12, 0x28, 0x22, 0x27},
+ [SPECIES_EXPLOUD - 1] = {0x10, 0x10, 0x28, 0x1a, 0x2a},
+ [SPECIES_CLAMPERL - 1] = {0x20, 0x1a, 0x30, 0x1e, 0x26},
+ [SPECIES_HUNTAIL - 1] = {0x13, 0x1e, 0x28, 0x15, 0x33},
+ [SPECIES_GOREBYSS - 1] = {0x0d, 0x1f, 0x28, 0x03, 0x32},
+ [SPECIES_ABSOL - 1] = {0x2a, 0x11, 0x28, 0x2a, 0x22},
+ [SPECIES_SHUPPET - 1] = {0x16, 0x19, 0x08, 0x17, 0x27},
+ [SPECIES_BANETTE - 1] = {0x1c, 0x14, 0x08, 0x1b, 0x23},
+ [SPECIES_SEVIPER - 1] = {0x0e, 0x0d, 0x30, 0x0b, 0x1e},
+ [SPECIES_ZANGOOSE - 1] = {0x18, 0x0c, 0x28, 0x15, 0x1a},
+ [SPECIES_RELICANTH - 1] = {0x0c, 0x1f, 0x30, 0x09, 0x2d},
+ [SPECIES_ARON - 1] = {0x18, 0x1c, 0x30, 0x1a, 0x2c},
+ [SPECIES_LAIRON - 1] = {0x0b, 0x21, 0x30, 0x12, 0x2f},
+ [SPECIES_AGGRON - 1] = {0x10, 0x0b, 0x28, 0x16, 0x1b},
+ [SPECIES_CASTFORM - 1] = {0x1d, 0x18, 0x08, 0x1b, 0x26},
+ [SPECIES_VOLBEAT - 1] = {0x25, 0x15, 0x08, 0x21, 0x25},
+ [SPECIES_ILLUMISE - 1] = {0x20, 0x12, 0x08, 0x1f, 0x20},
+ [SPECIES_LILEEP - 1] = {0x1e, 0x11, 0x30, 0x1f, 0x1e},
+ [SPECIES_CRADILY - 1] = {0x12, 0x16, 0x28, 0x15, 0x28},
+ [SPECIES_ANORITH - 1] = {0x1c, 0x1e, 0x30, 0x1b, 0x2b},
+ [SPECIES_ARMALDO - 1] = {0x15, 0x05, 0x28, 0x14, 0x13},
+ [SPECIES_RALTS - 1] = {0x1f, 0x17, 0x30, 0x20, 0x23},
+ [SPECIES_KIRLIA - 1] = {0x1c, 0x12, 0x30, 0x1f, 0x1e},
+ [SPECIES_GARDEVOIR - 1] = {0x35, 0x07, 0x28, 0x32, 0x14},
+ [SPECIES_BAGON - 1] = {0x17, 0x13, 0x30, 0x16, 0x26},
+ [SPECIES_SHELGON - 1] = {0x19, 0x1b, 0x30, 0x19, 0x2c},
+ [SPECIES_SALAMENCE - 1] = {0x09, 0x11, 0x30, 0x0a, 0x21},
+ [SPECIES_BELDUM - 1] = {0x16, 0x19, 0x08, 0x18, 0x23},
+ [SPECIES_METANG - 1] = {0x22, 0x0f, 0x10, 0x1f, 0x21},
+ [SPECIES_METAGROSS - 1] = {0x24, 0x1b, 0x28, 0x22, 0x2b},
+ [SPECIES_REGIROCK - 1] = {0x16, 0x07, 0x28, 0x14, 0x12},
+ [SPECIES_REGICE - 1] = {0x19, 0x0c, 0x28, 0x17, 0x19},
+ [SPECIES_REGISTEEL - 1] = {0x19, 0x0d, 0x28, 0x19, 0x19},
+ [SPECIES_KYOGRE - 1] = {0x0e, 0x19, 0x28, 0x0b, 0x26},
+ [SPECIES_GROUDON - 1] = {0x04, 0x0b, 0x28, 0x0a, 0x19},
+ [SPECIES_RAYQUAZA - 1] = {0x0c, 0x0e, 0x10, 0x0e, 0x1f},
+ [SPECIES_LATIAS - 1] = {0x1e, 0x0c, 0x10, 0x23, 0x19},
+ [SPECIES_LATIOS - 1] = {0x05, 0x0e, 0x10, 0x05, 0x1d},
+ [SPECIES_JIRACHI - 1] = {0x1c, 0x15, 0x08, 0x1e, 0x22},
#if defined(FIRERED)
- [SPECIES_DEOXYS - 1] = {0x1b, 0x08, 0x28, 0x1c, 0x16},
+ [SPECIES_DEOXYS - 1] = {0x1b, 0x08, 0x28, 0x1c, 0x16},
#elif defined(LEAFGREEN)
- [SPECIES_DEOXYS - 1] = {0x1a, 0x09, 0x28, 0x1a, 0x17},
+ [SPECIES_DEOXYS - 1] = {0x1a, 0x09, 0x28, 0x1a, 0x17},
#endif
- [SPECIES_CHIMECHO - 1] = {0x1d, 0x0c, 0x08, 0x1c, 0x1a},
+ [SPECIES_CHIMECHO - 1] = {0x1d, 0x0c, 0x08, 0x1c, 0x1a},
[SPECIES_OLD_UNOWN_EMARK - 1] = {0x20, 0x21, 0x08, 0x20, 0x2b},
[SPECIES_OLD_UNOWN_QMARK - 1] = {0x20, 0x23, 0x08, 0x20, 0x2d}
};
@@ -635,7 +635,7 @@ static void Task_SmoothBlendLayers(u8 taskId)
}
}
-u8 sub_812EA78(u16 species, u32 personality, u8 a2)
+u8 Menu2_GetMonSpriteAnchorCoord(u16 species, u32 personality, u8 a2)
{
if (species == SPECIES_UNOWN)
{
@@ -658,13 +658,13 @@ u8 sub_812EA78(u16 species, u32 personality, u8 a2)
if (species != SPECIES_NONE && a2 < 5)
{
species--;
- if (gUnknown_845FD54[species][a2] != 0xFF)
- return gUnknown_845FD54[species][a2];
+ if (sMonSpriteAnchorCoords[species][a2] != 0xFF)
+ return sMonSpriteAnchorCoords[species][a2];
}
return 32;
}
-s8 sub_812EAE4(u16 species, u32 personality, u8 a2)
+s8 Menu2_GetMonSpriteAnchorCoordMinusx20(u16 species, u32 personality, u8 a2)
{
- return sub_812EA78(species, personality, a2) - 32;
+ return Menu2_GetMonSpriteAnchorCoord(species, personality, a2) - 32;
}
diff --git a/src/party_menu.c b/src/party_menu.c
index edf7e96f6..5ceeb2c3b 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -380,7 +380,7 @@ static void sub_8125898(u8 taskId, UNUSED TaskFunc func);
static void sub_8125F4C(u8 taskId, UNUSED TaskFunc func);
static void sub_8125F5C(u8 taskId);
static void sub_8126BD4(void);
-static bool8 sub_8126C24(void);
+static bool8 MonCanEvolve(void);
static EWRAM_DATA struct PartyMenuInternal *sPartyMenuInternal = NULL;
EWRAM_DATA struct PartyMenu gPartyMenu = {0};
@@ -4295,21 +4295,21 @@ static void sub_8124DE0(void)
{
if (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId) == 2) // Evolution stone
{
- if (sub_8126C24() == TRUE)
- sub_811C540(gPartyMenu.slotId, gSpecialVar_ItemId, sub_8126BD4);
+ if (MonCanEvolve() == TRUE)
+ StartUseItemAnim_Normal(gPartyMenu.slotId, gSpecialVar_ItemId, sub_8126BD4);
else
- sub_811C5AC(gPartyMenu.slotId, gSpecialVar_ItemId, gPartyMenu.exitCallback);
+ StartUseItemAnim_CantEvolve(gPartyMenu.slotId, gSpecialVar_ItemId, gPartyMenu.exitCallback);
}
else
{
- sub_811C540(gPartyMenu.slotId, gSpecialVar_ItemId, sub_8124E48);
+ StartUseItemAnim_Normal(gPartyMenu.slotId, gSpecialVar_ItemId, sub_8124E48);
}
}
static void sub_8124E48(void)
{
if (ItemId_GetPocket(gSpecialVar_ItemId) == POCKET_TM_CASE
- && sub_811D178() == 1)
+ && PSA_IsCancelDisabled() == TRUE)
{
GiveMoveToMon(&gPlayerParty[gPartyMenu.slotId], ItemIdToBattleMoveId(gSpecialVar_ItemId));
AdjustFriendship(&gPlayerParty[gPartyMenu.slotId], 4);
@@ -4325,7 +4325,7 @@ static void sub_8124E48(void)
static void sub_8124EFC(void)
{
- if (sub_811D178() == 1)
+ if (PSA_IsCancelDisabled() == TRUE)
{
struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];
u8 moveIdx = GetMoveSlotToReplace();
@@ -4919,7 +4919,7 @@ static void CB2_ReturnToPartyMenuWhileLearningMove(void)
if (learnMoveState == 0 && moveIdx != MAX_MON_MOVES)
{
move = GetMonData(&gPlayerParty[gPartyMenu.slotId], moveIdx + MON_DATA_MOVE1);
- sub_811C568(gPartyMenu.slotId, gSpecialVar_ItemId, move, sub_8124EFC);
+ StartUseItemAnim_ForgetMoveAndLearnTMorHM(gPartyMenu.slotId, gSpecialVar_ItemId, move, sub_8124EFC);
gItemUseCB = sub_8125F4C;
gPartyMenu.action = learnMoveState;
}
@@ -5075,9 +5075,9 @@ static void ItemUseCB_RareCandyStep(u8 taskId, UNUSED TaskFunc func)
s16 *arrayPtr = ptr->data;
u8 level;
- BufferMonStatsToTaskData(mon, arrayPtr);
+ GetMonLevelUpWindowStats(mon, arrayPtr);
ExecuteTableBasedItemEffect_(gPartyMenu.slotId, gSpecialVar_ItemId, 0);
- BufferMonStatsToTaskData(mon, &ptr->data[NUM_STATS]);
+ GetMonLevelUpWindowStats(mon, &ptr->data[NUM_STATS]);
gPartyMenuUseExitCallback = TRUE;
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, 0xFFFF);
PlayFanfareByFanfareNum(0);
@@ -5347,7 +5347,7 @@ static void sub_8126BD4(void)
RemoveBagItem(gSpecialVar_ItemId, 1);
}
-static bool8 sub_8126C24(void)
+static bool8 MonCanEvolve(void)
{
if (!IsNationalPokedexEnabled()
&& GetEvolutionTargetSpecies(&gPlayerParty[gPartyMenu.slotId], 2, gSpecialVar_ItemId) > KANTO_DEX_COUNT)
diff --git a/src/pokemon.c b/src/pokemon.c
index b9e62502d..4c5a3e867 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -2143,7 +2143,7 @@ static u8 GetLevelFromMonExp(struct Pokemon *mon)
u32 exp = GetMonData(mon, MON_DATA_EXP, NULL);
s32 level = 1;
- while (level <= MAX_MON_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp)
+ while (level <= MAX_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp)
level++;
return level - 1;
@@ -2155,7 +2155,7 @@ u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon)
u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL);
s32 level = 1;
- while (level <= MAX_MON_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp)
+ while (level <= MAX_LEVEL && gExperienceTables[gBaseStats[species].growthRate][level] <= exp)
level++;
return level - 1;
diff --git a/src/pokemon_special_anim.c b/src/pokemon_special_anim.c
new file mode 100644
index 000000000..f05b93c54
--- /dev/null
+++ b/src/pokemon_special_anim.c
@@ -0,0 +1,708 @@
+#include "global.h"
+#include "gflib.h"
+#include "data.h"
+#include "party_menu.h"
+#include "pokemon_special_anim_internal.h"
+#include "item_use.h"
+#include "task.h"
+#include "constants/songs.h"
+#include "constants/items.h"
+
+// Functions related to the special anims Pokemon
+// make when using an item on them in the field.
+
+static EWRAM_DATA bool32 sCancelDisabled = FALSE;
+static EWRAM_DATA u8 sPSATaskId = 0;
+static EWRAM_DATA struct PokemonSpecialAnim * sPSAWork = NULL;
+
+static struct PokemonSpecialAnim * AllocPSA(u8 slotId, u16 itemId, MainCallback callback);
+static void SetUpUseItemAnim_Normal(struct PokemonSpecialAnim * ptr);
+static void SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(struct PokemonSpecialAnim * ptr);
+static void SetUpUseItemAnim_CantEvolve(struct PokemonSpecialAnim * ptr);
+static void Task_UseItem_Normal(u8 taskId);
+static void Task_ForgetMove(u8 taskId);
+static void Task_EvoStone_CantEvolve(u8 taskId);
+static void Task_UseTM_NoForget(u8 taskId);
+static void Task_MachineSet(u8 taskId);
+static void Task_CleanUp(u8 taskId);
+static u8 GetClosenessFromFriendship(u16 friendship);
+static u16 GetAnimTypeByItemId(u16 itemId);
+
+void StartUseItemAnim_Normal(u8 slotId, u16 itemId, MainCallback callback)
+{
+ struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);
+ if (ptr == NULL)
+ SetMainCallback2(callback);
+ else
+ SetUpUseItemAnim_Normal(ptr);
+}
+
+void StartUseItemAnim_ForgetMoveAndLearnTMorHM(u8 slotId, u16 itemId, u16 moveId, MainCallback callback)
+{
+ struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);
+ if (ptr == NULL)
+ SetMainCallback2(callback);
+ else
+ {
+ StringCopy(ptr->nameOfMoveForgotten, gMoveNames[moveId]);
+ SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(ptr);
+ }
+}
+
+void StartUseItemAnim_CantEvolve(u8 slotId, u16 itemId, MainCallback callback)
+{
+ struct PokemonSpecialAnim * ptr = AllocPSA(slotId, itemId, callback);
+ if (ptr == NULL)
+ SetMainCallback2(callback);
+ else
+ SetUpUseItemAnim_CantEvolve(ptr);
+}
+
+static struct PokemonSpecialAnim * AllocPSA(u8 slotId, u16 itemId, MainCallback callback)
+{
+ struct PokemonSpecialAnim * ptr;
+ struct Pokemon * pokemon;
+ u16 moveId;
+
+ if (!gMain.inBattle)
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ptr = Alloc(sizeof(struct PokemonSpecialAnim));
+ if (ptr == NULL)
+ {
+ SetMainCallback2(callback);
+ return NULL;
+ }
+ pokemon = &gPlayerParty[slotId];
+ ptr->state = 0;
+ ptr->savedCallback = callback;
+ ptr->species = GetMonData(pokemon, MON_DATA_SPECIES);
+ ptr->closeness = GetClosenessFromFriendship(GetMonData(pokemon, MON_DATA_FRIENDSHIP));
+ ptr->personality = GetMonData(pokemon, MON_DATA_PERSONALITY);
+ ptr->slotId = slotId;
+ ptr->itemId = itemId;
+ ptr->animType = GetAnimTypeByItemId(itemId);
+ ptr->pokemon = *pokemon;
+ ptr->field_00a4 = 0;
+ GetMonData(pokemon, MON_DATA_NICKNAME, ptr->nickname);
+ if (ptr->animType == 4)
+ {
+ moveId = ItemIdToBattleMoveId(itemId);
+ StringCopy(ptr->nameOfMoveToTeach, gMoveNames[moveId]);
+ }
+ return ptr;
+}
+
+static void VBlankCB_PSA(void)
+{
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+static void CB2_PSA(void)
+{
+ RunTextPrinters();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void SetUseItemAnimCallback(u8 taskId, TaskFunc func)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+ ptr->state = 0;
+ gTasks[taskId].func = func;
+}
+
+static void SetUpUseItemAnim_Normal(struct PokemonSpecialAnim * ptr)
+{
+ u8 taskId;
+ switch (ptr->animType)
+ {
+ case 0:
+ case 1:
+ case 3:
+ taskId = CreateTask(Task_UseItem_Normal, 0);
+ break;
+ case 4:
+ taskId = CreateTask(Task_UseTM_NoForget, 0);
+ break;
+ default:
+ SetMainCallback2(ptr->savedCallback);
+ Free(ptr);
+ return;
+ }
+ ptr->cancelDisabled = FALSE;
+ SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
+ SetMainCallback2(CB2_PSA);
+ sPSATaskId = taskId;
+}
+
+static void SetUpUseItemAnim_ForgetMoveAndLearnTMorHM(struct PokemonSpecialAnim * ptr)
+{
+ u8 taskId = CreateTask(Task_ForgetMove, 0);
+ SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
+ SetMainCallback2(CB2_PSA);
+ sPSATaskId = taskId;
+ ptr->cancelDisabled = FALSE;
+}
+
+static void SetUpUseItemAnim_CantEvolve(struct PokemonSpecialAnim * ptr)
+{
+ u8 taskId = CreateTask(Task_EvoStone_CantEvolve, 0);
+ SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
+ SetMainCallback2(CB2_PSA);
+ sPSATaskId = taskId;
+}
+
+static void Task_UseItem_Normal(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+ if (!ptr->cancelDisabled && JOY_HELD(A_BUTTON | B_BUTTON))
+ {
+ PSA_UseItem_CleanUpForCancel();
+ SetUseItemAnimCallback(taskId, Task_CleanUp);
+ return;
+ }
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);
+ PSA_CreateMonSpriteAtCloseness(0);
+ ptr->state++;
+ break;
+ case 1:
+ if (!PokemonSpecialAnimSceneInitIsNotFinished())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ ptr->state++;
+ SetVBlankCallback(VBlankCB_PSA);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ ptr->state++;
+ }
+ break;
+ case 3:
+ PSA_SetUpZoomAnim(ptr->closeness);
+ ptr->state++;
+ break;
+ case 4:
+ if (!PSA_IsZoomTaskActive())
+ {
+ ptr->delayTimer = 0;
+ ptr->state++;
+ }
+ break;
+ case 5:
+ if (!PSA_LevelUpVerticalSpritesTaskIsRunning())
+ {
+ ptr->state++;
+ }
+ break;
+ case 6:
+ PSA_SetUpItemUseOnMonAnim(ptr->itemId, ptr->closeness, TRUE);
+ ptr->state++;
+ break;
+ case 7:
+ if (!PSA_IsItemUseOnMonAnimActive())
+ {
+ ptr->cancelDisabled = TRUE;
+ if (ptr->closeness == 3)
+ {
+ PlayCry1(ptr->species, 0);
+ }
+ PSA_ShowMessageWindow();
+ ptr->state++;
+ }
+ break;
+ case 8:
+ PSA_PrintMessage(PSA_TEXT_ITEM_USED);
+ ptr->state++;
+ break;
+ case 9:
+ if (!PSA_IsMessagePrintTaskActive())
+ {
+ ptr->state++;
+ }
+ break;
+ case 10:
+ PSA_SetUpZoomAnim(0);
+ ptr->state++;
+ break;
+ case 11:
+ if (!PSA_IsZoomTaskActive())
+ {
+ ptr->cancelDisabled = TRUE;
+ ptr->state++;
+ }
+ break;
+ case 12:
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ if (CheckIfItemIsTMHMOrEvolutionStone(ptr->itemId) != 2) // evo stone
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ ptr->state++;
+ }
+ else
+ {
+ ptr->state += 2;
+ }
+ }
+ break;
+ case 13:
+ if (!gPaletteFade.active)
+ {
+ ptr->state++;
+ }
+ break;
+ case 14:
+ SetMainCallback2(ptr->savedCallback);
+ PSA_FreeWindowBuffers();
+ Free(ptr);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void Task_ForgetMove(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+ u8 r4;
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);
+ PSA_CreateMonSpriteAtCloseness(3);
+ ptr->state++;
+ break;
+ case 1:
+ if (!PokemonSpecialAnimSceneInitIsNotFinished())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ ptr->state++;
+ SetVBlankCallback(VBlankCB_PSA);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ ptr->delayTimer = 0;
+ ptr->state++;
+ }
+ break;
+ case 3:
+ ptr->delayTimer++;
+ if (ptr->delayTimer > 30)
+ {
+ PSA_ShowMessageWindow();
+ ptr->state++;
+ }
+ break;
+ case 4:
+ PSA_PrintMessage(PSA_TEXT_FORGET_1);
+ ptr->state++;
+ break;
+ case 5:
+ if (!PSA_IsMessagePrintTaskActive())
+ {
+ ptr->delayTimer = 0;
+ ptr->state++;
+ }
+ break;
+ case 6:
+ ptr->delayTimer++;
+ if (ptr->delayTimer > 30)
+ {
+ PSA_PrintMessage(PSA_TEXT_FORGET_2_AND);
+ ptr->state++;
+ }
+ break;
+ case 7:
+ if (!PSA_IsMessagePrintTaskActive())
+ {
+ ptr->delayTimer = 0;
+ ptr->state++;
+ }
+ break;
+ case 8:
+ ptr->delayTimer++;
+ if (ptr->delayTimer > 30)
+ {
+ PlaySE(SE_W255);
+ PSA_PrintMessage(PSA_TEXT_FORGET_POOF);
+ PSA_DarkenMonSprite();
+ ptr->state++;
+ }
+ break;
+ case 9:
+ r4 = PSA_RunPoofAnim();
+ if (!(r4 | PSA_IsMessagePrintTaskActive()))
+ {
+ PSA_AfterPoof_ClearMessageWindow();
+ ptr->state++;
+ }
+ break;
+ case 10:
+ PSA_PrintMessage(PSA_TEXT_FORGET_FORGOT);
+ ptr->state++;
+ break;
+ case 11:
+ if (!PSA_IsMessagePrintTaskActive())
+ {
+ PSA_PrintMessage(PSA_TEXT_FORGET_AND);
+ ptr->state++;
+ }
+ break;
+ case 12:
+ if (!PSA_IsMessagePrintTaskActive())
+ {
+ PSA_HideMessageWindow();
+ ptr->state++;
+ }
+ break;
+ case 13:
+ SetUseItemAnimCallback(taskId, Task_MachineSet);
+ break;
+ }
+}
+
+static void Task_EvoStone_CantEvolve(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+
+ if (!ptr->cancelDisabled && JOY_HELD(B_BUTTON))
+ {
+ SetUseItemAnimCallback(taskId, Task_CleanUp);
+ return;
+ }
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);
+ PSA_CreateMonSpriteAtCloseness(0);
+ ptr->state++;
+ break;
+ case 1:
+ if (!PokemonSpecialAnimSceneInitIsNotFinished())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ ptr->state++;
+ SetVBlankCallback(VBlankCB_PSA);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ ptr->state++;
+ }
+ break;
+ case 3:
+ PSA_SetUpZoomAnim(ptr->closeness);
+ ptr->state++;
+ break;
+ case 4:
+ PSA_SetUpItemUseOnMonAnim(ptr->itemId, ptr->closeness, FALSE);
+ ptr->state++;
+ break;
+ case 5:
+ if (!PSA_IsItemUseOnMonAnimActive())
+ {
+ PSA_ShowMessageWindow();
+ ptr->state++;
+ }
+ break;
+ case 6:
+ PSA_PrintMessage(PSA_TEXT_HUH);
+ ptr->state++;
+ break;
+ case 7:
+ if (!PSA_IsMessagePrintTaskActive())
+ {
+ ptr->cancelDisabled = TRUE;
+ ptr->state++;
+ }
+ break;
+ case 8:
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ ptr->state++;
+ }
+ break;
+ case 9:
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(ptr->savedCallback);
+ PSA_FreeWindowBuffers();
+ Free(ptr);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void Task_UseTM_NoForget(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+
+ if (JOY_NEW(B_BUTTON))
+ {
+ SetUseItemAnimCallback(taskId, Task_CleanUp);
+ return;
+ }
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ InitPokemonSpecialAnimScene(&ptr->sceneResources, ptr->animType);
+ PSA_CreateMonSpriteAtCloseness(3);
+ ptr->state++;
+ break;
+ case 1:
+ if (!PokemonSpecialAnimSceneInitIsNotFinished())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ ptr->state++;
+ SetVBlankCallback(VBlankCB_PSA);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ ptr->delayTimer = 0;
+ ptr->state++;
+ }
+ break;
+ case 3:
+ ptr->delayTimer++;
+ if (ptr->delayTimer > 20)
+ {
+ SetUseItemAnimCallback(taskId, Task_MachineSet);
+ }
+ break;
+ }
+}
+
+static void Task_MachineSet(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+
+ if (!ptr->cancelDisabled && JOY_NEW(B_BUTTON))
+ {
+ PSA_UseTM_CleanUpForCancel();
+ SetUseItemAnimCallback(taskId, Task_CleanUp);
+ return;
+ }
+
+ switch (ptr->state)
+ {
+ case 0:
+ CreateItemIconSpriteAtMaxCloseness(ptr->itemId);
+ ptr->delayTimer = 0;
+ ptr->state++;
+ break;
+ case 1:
+ PSA_ShowMessageWindow();
+ PSA_PrintMessage(PSA_TEXT_MACHINE_SET);
+ ptr->state++;
+ break;
+ case 2:
+ if (!PSA_IsMessagePrintTaskActive())
+ {
+ PSA_HideMessageWindow();
+ ptr->state++;
+ }
+ break;
+ case 3:
+ PSA_UseTM_SetUpMachineSetWobble();
+ ptr->state++;
+ break;
+ case 4:
+ if (!PSA_UseTM_RunMachineSetWobble())
+ {
+ ptr->state++;
+ }
+ break;
+ case 5:
+ PSA_UseTM_SetUpZoomOutAnim();
+ ptr->state++;
+ break;
+ case 6:
+ if (!PSA_UseTM_RunZoomOutAnim())
+ {
+ ptr->delayTimer = 0;
+ ptr->state++;
+ }
+ break;
+ case 7:
+ ptr->delayTimer++;
+ if (ptr->delayTimer > 30)
+ {
+ PSA_ShowMessageWindow();
+ PSA_PrintMessage(PSA_TEXT_LEARNED_MOVE);
+ ptr->state++;
+ }
+ break;
+ case 8:
+ if (!PSA_IsMessagePrintTaskActive())
+ {
+ PlayFanfare(MUS_FANFA1);
+ ptr->cancelDisabled = TRUE;
+ ptr->state++;
+ }
+ break;
+ case 9:
+ if (IsFanfareTaskInactive())
+ {
+ SetUseItemAnimCallback(taskId, Task_CleanUp);
+ }
+ break;
+ }
+}
+
+static void Task_CleanUp(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(VBlankCB_PSA);
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ ptr->state++;
+ break;
+ case 1:
+ if (!gPaletteFade.active && (ptr->field_00a4 != 1 || IsCryFinished()))
+ {
+ sCancelDisabled = ptr->cancelDisabled;
+ SetMainCallback2(ptr->savedCallback);
+ DestroyTask(taskId);
+ PSA_FreeWindowBuffers();
+ Free(ptr);
+ }
+ break;
+ }
+}
+
+static const struct {
+ u16 itemId;
+ u16 animType;
+} gUnknown_8459634[2] = {
+ {ITEM_RARE_CANDY, 0},
+ {ITEM_POTION, 1}
+};
+
+static u16 GetAnimTypeByItemId(u16 itemId)
+{
+ int i;
+
+ for (i = 0; i < NELEMS(gUnknown_8459634); i++)
+ {
+ if (gUnknown_8459634[i].itemId == itemId)
+ return gUnknown_8459634[i].animType;
+ }
+
+ if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08)
+ {
+ return 4;
+ }
+
+ return 0;
+}
+
+static u8 GetClosenessFromFriendship(u16 friendship)
+{
+ if (friendship <= 100)
+ return 0;
+ else if (friendship <= 150)
+ return 1;
+ else if (friendship <= 200)
+ return 2;
+ else
+ return 3;
+}
+
+struct PokemonSpecialAnim * GetPSAStruct(void)
+{
+ return (void *)GetWordTaskArg(sPSATaskId, 0);
+}
+
+struct Pokemon * PSA_GetPokemon(void)
+{
+ sPSAWork = GetPSAStruct();
+ return &sPSAWork->pokemon;
+}
+
+struct PokemonSpecialAnimScene * PSA_GetSceneWork(void)
+{
+ return &GetPSAStruct()->sceneResources;
+}
+
+u16 PSA_GetItemId(void)
+{
+ return GetPSAStruct()->itemId;
+}
+
+u8 *PSA_GetNameOfMoveForgotten(void)
+{
+ return GetPSAStruct()->nameOfMoveForgotten;
+}
+
+u8 *PSA_GetNameOfMoveToTeach(void)
+{
+ return GetPSAStruct()->nameOfMoveToTeach;
+}
+
+u8 *PSA_CopyMonNickname(u8 *dest)
+{
+ return StringCopy(dest, GetPSAStruct()->nickname);
+}
+
+u8 *PSA_GetMonNickname(void)
+{
+ return GetPSAStruct()->nickname;
+}
+
+u8 PSA_GetAnimType(void)
+{
+ return GetPSAStruct()->animType;
+}
+
+u16 PSA_GetMonSpecies(void)
+{
+ return GetPSAStruct()->species;
+}
+
+u32 PSA_GetMonPersonality(void)
+{
+ return GetPSAStruct()->personality;
+}
+
+void GetMonLevelUpWindowStats(struct Pokemon * pokemon, u16 *data)
+{
+ data[0] = GetMonData(pokemon, MON_DATA_MAX_HP);
+ data[1] = GetMonData(pokemon, MON_DATA_ATK);
+ data[2] = GetMonData(pokemon, MON_DATA_DEF);
+ data[3] = GetMonData(pokemon, MON_DATA_SPEED);
+ data[4] = GetMonData(pokemon, MON_DATA_SPATK);
+ data[5] = GetMonData(pokemon, MON_DATA_SPDEF);
+}
+
+bool32 PSA_IsCancelDisabled(void)
+{
+ return sCancelDisabled;
+}
diff --git a/src/pokemon_special_anim_scene.c b/src/pokemon_special_anim_scene.c
new file mode 100644
index 000000000..2d65c24a7
--- /dev/null
+++ b/src/pokemon_special_anim_scene.c
@@ -0,0 +1,1552 @@
+#include "global.h"
+#include "gflib.h"
+#include "data.h"
+#include "decompress.h"
+#include "dynamic_placeholder_text_util.h"
+#include "item.h"
+#include "item_menu_icons.h"
+#include "menu.h"
+#include "new_menu_helpers.h"
+#include "pokemon_special_anim_internal.h"
+#include "strings.h"
+#include "text_window.h"
+#include "trig.h"
+#include "constants/songs.h"
+
+static void LoadBgGfxByAnimType(u16 animType);
+static void Task_ZoomAnim(u8 taskId);
+static void SetSpriteWithCloseness(struct Sprite * sprite, u8 closeness);
+static bool8 IsZoomSpriteCBActive(struct Sprite * sprite);
+static void MonSpriteZoom_UpdateYPos(struct Sprite * sprite, u8 closeness);
+static void ItemSpriteZoom_UpdateYPos(struct Sprite * sprite, u8 closeness);
+static void StartMonWiggleAnim(struct PokemonSpecialAnimScene * scene, u8 frameLen, u8 niter, u8 amplitude);
+static void StopMonWiggleAnim(struct PokemonSpecialAnimScene * scene);
+static void SpriteCallback_MonSpriteWiggle(struct Sprite * sprite);
+static void LoadMonSpriteGraphics(u16 *tilees, u16 *palette);
+static struct Sprite * PSA_CreateItemIconObject(u16 itemId);
+static u16 GetBlendColorByItemId(u16 itemId);
+static void Task_ItemUseOnMonAnim(u8 taskId);
+static void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct Sprite * sprite);
+static void SpriteCB_OutwardSpiralDots(struct Sprite * sprite);
+static void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite * sprite, u8 closeness);
+static void MachineSetWobbleInit(void);
+static void MachineSetWobble_SetCB(struct Sprite * sprite);
+static bool8 MachineSetWobbleCBIsRunning(void);
+static void SpriteCB_MachineSetWobble(struct Sprite * sprite);
+static void StartZoomOutAnimForUseTM(u8 closeness);
+static void CreateStarSprites(struct PokemonSpecialAnimScene * scene);
+static bool8 AnyStarSpritesActive(void);
+static void SpriteCB_Star(struct Sprite * sprite);
+static void PSAScene_SeedRandomInTask(struct PokemonSpecialAnimScene * scene);
+static void StopMakingOutwardSpiralDots(void);
+static void Task_UseItem_OutwardSpiralDots(u8 taskId);
+static u16 PSAScene_RandomFromTask(u8 taskId);
+static void SpriteCallback_UseItem_OutwardSpiralDots(struct Sprite * sprite);
+static void LoadOutwardSpiralDotsGfx(void);
+static bool32 IsOutwardSpiralDotsTaskRunning(void);
+static void Task_LevelUpVerticalSprites(u8 taskId);
+static void CreateLevelUpVerticalSprite(u8 taskId, s16 *data);
+static void SpriteCB_LevelUpVertical(struct Sprite * sprite);
+
+static const u16 sBgPals_PSA_Any[] = INCBIN_U16("graphics/pokemon_special_anim/unk_845963C.gbapal");
+static const u16 sBgPals_PSA_Anim4[] = INCBIN_U16("graphics/pokemon_special_anim/unk_845965C.gbapal");
+static const u32 sBg3Tiles_PSA[] = INCBIN_U32("graphics/pokemon_special_anim/unk_845967C.4bpp.lz");
+static const u32 sBg3Map_PSA[] = INCBIN_U32("graphics/pokemon_special_anim/unk_845973C.bin.lz");
+static const u16 sSpritePals_LevelUpVertical[] = INCBIN_U16("graphics/pokemon_special_anim/unk_8459868.gbapal");
+static const u32 sSpriteTiles_LevelUpVertical[] = INCBIN_U32("graphics/pokemon_special_anim/unk_8459888.4bpp.lz");
+static const u16 sSpritePals_Star[] = INCBIN_U16("graphics/pokemon_special_anim/unk_84598A4.gbapal");
+static const u32 sSpriteTiles_Star[] = INCBIN_U32("graphics/pokemon_special_anim/unk_84598C4.4bpp.lz");
+static const u16 sSpritePals_UseItem_OutwardSpiralDots[] = INCBIN_U16("graphics/pokemon_special_anim/unk_8459940.gbapal");
+static const u32 sSpriteTiles_UseItem_OutwardSpiralDots[] = INCBIN_U32("graphics/pokemon_special_anim/unk_8459960.4bpp.lz");
+
+static const struct BgTemplate sBgTemplates[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0x001
+ }, {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x000
+ }
+};
+
+static const struct WindowTemplate sWindowTemplates[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 28,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x00a
+ }, DUMMY_WIN_TEMPLATE
+};
+
+static const u8 *const s1_2_and_Poof_textPtrs[] = {
+ gUnknown_841B2ED, // 1,
+ gUnknown_841B2F1, // 2, and ‥ ‥ ‥
+ gUnknown_841B2FF, // Poof!
+};
+
+static const u16 sUnref_84599A4[] = {
+ 0, 16, 68
+};
+
+static const u16 sAffineScales[] = {
+ 0x100,
+ 0x155,
+ 0x1AA,
+ 0x200
+};
+
+static const s8 sStarCoordOffsets[][2] = {
+ {-8, -8},
+ { 6, -13},
+ { 8, -8}
+};
+
+static const struct CompressedSpriteSheet sSpriteSheet_Star = {
+ sSpriteTiles_Star,
+ 0x80,
+ 2
+};
+
+static const struct SpritePalette sSpritePalette_Star = {
+ sSpritePals_Star,
+ 2
+};
+
+static const struct CompressedSpriteSheet sSpriteSheet_UseItem_OutwardSpiralDots = {
+ sSpriteTiles_UseItem_OutwardSpiralDots,
+ 0x60,
+ 5
+};
+
+static const struct SpritePalette sSpritePalette_UseItem_OutwardSpiralDots = {
+ sSpritePals_UseItem_OutwardSpiralDots,
+ 5
+};
+
+static const struct OamData sOamData_MonSprite = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0x000,
+ .priority = 1,
+ .paletteNum = 0
+};
+
+
+static const union AffineAnimCmd gUnknown_84599E0[] = {
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gUnknown_84599F0[] = {
+ AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gUnknown_8459A00[] = {
+ AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gUnknown_8459A10[] = {
+ AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sAffineAnimTable_Zoom[] = {
+ gUnknown_84599E0,
+ gUnknown_84599F0,
+ gUnknown_8459A00,
+ gUnknown_8459A10
+};
+
+static const struct SpriteTemplate sSpriteTemplate_MonSprite = {
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_MonSprite,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sAffineAnimTable_Zoom,
+ .callback = SpriteCallbackDummy
+};
+
+static const union AffineAnimCmd sAffineAnim_ItemZoom_0[] = {
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(-28, -28, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sAffineAnim_ItemZoom_1[] = {
+ AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0),
+ AFFINEANIMCMD_FRAME(-37, -37, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sAffineAnim_ItemZoom_2[] = {
+ AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0),
+ AFFINEANIMCMD_FRAME(-47, -47, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sAffineAnim_ItemZoom_3[] = {
+ AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
+ AFFINEANIMCMD_FRAME(-56, -56, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sAffineAnimTable_ItemZoom[] = {
+ sAffineAnim_ItemZoom_0,
+ sAffineAnim_ItemZoom_1,
+ sAffineAnim_ItemZoom_2,
+ sAffineAnim_ItemZoom_3
+};
+
+static const struct OamData sOamData_LevelUpVertical = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0x000,
+ .priority = 1,
+ .paletteNum = 0
+};
+
+static const union AnimCmd gUnknown_8459AC0[] = {
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sAnimTable_LevelUpVertical[] = {
+ gUnknown_8459AC0
+};
+
+static const struct SpriteTemplate sSpriteTemplate_LevelUpVertical = {
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_LevelUpVertical,
+ .anims = sAnimTable_LevelUpVertical,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_LevelUpVertical
+};
+
+static const struct OamData sOamData_Star = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0x000,
+ .priority = 1,
+ .paletteNum = 0
+};
+
+static const struct SpriteTemplate sSpriteTemplate_Star = {
+ .tileTag = 2,
+ .paletteTag = 2,
+ .oam = &sOamData_Star,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_Star
+};
+
+static const struct OamData sOamData_UseItem_OutwardSpiralDots = {
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0x000,
+ .priority = 0,
+ .paletteNum = 0
+};
+
+static const union AnimCmd gUnknown_8459B0C[] = {
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gUnknown_8459B1C[] = {
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sAnimTable_UseItem_OutwardSpiralDots[] = {
+ gUnknown_8459B0C,
+ gUnknown_8459B1C
+};
+
+static const struct SpriteTemplate sSpriteTemplate_UseItem_OutwardSpiralDots = {
+ .tileTag = 5,
+ .paletteTag = 5,
+ .oam = &sOamData_UseItem_OutwardSpiralDots,
+ .anims = sAnimTable_UseItem_OutwardSpiralDots,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_UseItem_OutwardSpiralDots
+};
+
+void InitPokemonSpecialAnimScene(struct PokemonSpecialAnimScene * buffer, u16 animType)
+{
+ FreeAllWindowBuffers();
+ ResetTempTileDataBuffers();
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetBgsAndClearDma3BusyFlags(FALSE);
+ InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates));
+ InitWindows(sWindowTemplates);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetBgTilemapBuffer(0, buffer->field_0914);
+ SetBgTilemapBuffer(3, buffer->field_1914);
+ RequestDma3Fill(0, (void *)BG_VRAM, 0x20, TRUE);
+ FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 32, 32);
+ LoadBgGfxByAnimType(animType);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ TextWindow_SetUserSelectedFrame(0, 0x000, 0xe0);
+ CopyWindowToVram(0, 3);
+ ShowBg(0);
+ ShowBg(3);
+ HideBg(1);
+ HideBg(2);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(3);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+bool8 PokemonSpecialAnimSceneInitIsNotFinished(void)
+{
+ if (!FreeTempTileDataBuffersIfPossible())
+ return IsDma3ManagerBusyWithBgCopy();
+ else
+ return TRUE;
+}
+
+void PSA_FreeWindowBuffers(void)
+{
+ FreeAllWindowBuffers();
+}
+
+void PSA_ShowMessageWindow(void)
+{
+ PutWindowTilemap(0);
+ FillWindowPixelBuffer(0, PIXEL_FILL(1));
+ DrawTextBorderOuter(0, 0x001, 0xE);
+ CopyWindowToVram(0, 3);
+}
+
+void PSA_HideMessageWindow(void)
+{
+ ClearWindowTilemap(0);
+ ClearStdWindowAndFrameToTransparent(0, FALSE);
+ CopyWindowToVram(0, 1);
+}
+
+void PSA_PrintMessage(u8 messageId)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ u16 itemId = PSA_GetItemId();
+ u16 strWidth = 0;
+ u8 textSpeed = GetTextSpeedSetting();
+ struct Pokemon * pokemon = PSA_GetPokemon();
+ u16 level;
+ u8 *str;
+
+ switch (messageId)
+ {
+ case 0: // Item was used on Mon
+ str = StringCopy(scene->textBuf, ItemId_GetName(itemId));
+ str = StringCopy(str, gUnknown_841B285);
+ GetMonData(pokemon, MON_DATA_NICKNAME, str);
+ StringAppend(scene->textBuf, gUnknown_841B293);
+ break;
+ case 1: // Mon's level was elevated to level
+ level = GetMonData(pokemon, MON_DATA_LEVEL);
+ GetMonData(pokemon, MON_DATA_NICKNAME, scene->textBuf);
+ str = StringAppend(scene->textBuf, gUnknown_841B295);
+ if (level < MAX_LEVEL)
+ level++;
+ str = ConvertIntToDecimalStringN(str, level, STR_CONV_MODE_LEFT_ALIGN, level < MAX_LEVEL ? 2 : 3);
+ StringAppend(str, gUnknown_841B2A7);
+ break;
+ case 9: // Mon learned move
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, PSA_GetMonNickname());
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, PSA_GetNameOfMoveToTeach());
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(scene->textBuf, gUnknown_841B32E);
+ break;
+ case 4: // poof!
+ strWidth += GetStringWidth(2, gUnknown_841B2F1, -1);
+ // fallthrough
+ case 3: // 2 and...
+ strWidth += GetStringWidth(2, gUnknown_841B2ED, -1);
+ // fallthrough
+ case 2: // 1
+ StringCopy(scene->textBuf, s1_2_and_Poof_textPtrs[messageId - 2]);
+ textSpeed = 1;
+ break;
+ case 5: // Mon forgot move
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, PSA_GetMonNickname());
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, PSA_GetNameOfMoveForgotten());
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(scene->textBuf, gUnknown_841B306);
+ break;
+ case 6: // And...
+ StringCopy(scene->textBuf, gUnknown_841B315);
+ break;
+ case 7: // Machine set!
+ StringCopy(scene->textBuf, gUnknown_841B31B);
+ break;
+ case 8: // Huh?
+ StringCopy(scene->textBuf, gUnknown_841B329);
+ break;
+ default:
+ return;
+ }
+
+ AddTextPrinterParameterized5(0, 2, scene->textBuf, strWidth, 0, textSpeed, NULL, 0, 4);
+}
+
+void PSA_AfterPoof_ClearMessageWindow(void)
+{
+ FillWindowPixelBuffer(0, PIXEL_FILL(1));
+ CopyWindowToVram(0, 2);
+}
+
+bool8 PSA_IsMessagePrintTaskActive(void)
+{
+ return IsTextPrinterActive(0);
+}
+
+void PSA_DarkenMonSprite(void)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ scene->state = 0;
+ BlendPalettes((0x10000 << IndexOfSpritePaletteTag(0)) | 4, 16, RGB_BLACK);
+ CreateStarSprites(scene);
+}
+
+bool8 PSA_RunPoofAnim(void)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+
+ switch (scene->state)
+ {
+ case 0:
+ if (!AnyStarSpritesActive())
+ {
+ BeginNormalPaletteFade((0x10000 << IndexOfSpritePaletteTag(0)) | 4, -1, 16, 0, RGB_BLACK);
+ scene->state++;
+ }
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ return FALSE;
+ break;
+ }
+ return TRUE;
+}
+
+void PSA_UseTM_SetUpZoomOutAnim(void)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ scene->state = 0;
+}
+
+void PSA_UseTM_CleanUpForCancel(void)
+{
+ StopMakingOutwardSpiralDots();
+ ResetPaletteFadeControl();
+}
+
+bool8 PSA_UseTM_RunZoomOutAnim(void)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ switch (scene->state)
+ {
+ case 0:
+ StartZoomOutAnimForUseTM(0);
+ scene->state++;
+ break;
+ case 1:
+ if (!PSA_IsZoomTaskActive())
+ {
+ scene->field_0004 = 0;
+ scene->state++;
+ }
+ break;
+ case 2:
+ scene->field_0004++;
+ if (scene->field_0004 > 20)
+ scene->state++;
+ break;
+ case 3:
+ StartMonWiggleAnim(scene, 1, 0, 1);
+ scene->field_0004 = 0;
+ scene->state++;
+ break;
+ case 4:
+ scene->field_0004++;
+ if (scene->field_0004 > 0)
+ {
+ scene->field_0004 = 0;
+ PlaySE(SE_W025);
+ BeginNormalPaletteFade(0x00000001, 2, 0, 12, RGB(8, 13, 31));
+ PSAScene_SeedRandomInTask(scene);
+ scene->state++;
+ }
+ break;
+ case 5:
+ scene->field_0004++;
+ if (scene->field_0004 > 70)
+ {
+ StopMonWiggleAnim(scene);
+ BeginNormalPaletteFade(0x00000001, 6, 12, 0, RGB(8, 13, 31));
+ scene->field_0004 = 0;
+ scene->state++;
+ }
+ break;
+ case 6:
+ scene->field_0004++;
+ if (!IsOutwardSpiralDotsTaskRunning() && scene->field_0004 > 40)
+ {
+ scene->field_0004 = 0;
+ scene->state++;
+ }
+ break;
+ case 7:
+ scene->field_0004++;
+ if (scene->field_0004 > 20)
+ {
+ scene->state++;
+ }
+ break;
+ case 8:
+ PlaySE(SE_EXPMAX);
+ DestroySprite(scene->itemIconSprite);
+ scene->state++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void PSA_UseTM_SetUpMachineSetWobble(void)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ scene->state = 0;
+}
+
+bool8 PSA_UseTM_RunMachineSetWobble(void)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+
+ switch (scene->state)
+ {
+ case 0:
+ MachineSetWobbleInit();
+ PlaySE(SE_MU_PACHI);
+ scene->state++;
+ break;
+ case 1:
+ return MachineSetWobbleCBIsRunning();
+ }
+ return TRUE;
+}
+
+// There may once have been plans to put the battle level up
+// anim in with using Rare Candy, but they were scrapped
+// at a later stage of development
+
+UNUSED void PSA_CreateLevelUpVerticalSpritesTask(void)
+{
+ CreateLevelUpVerticalSpritesTask(120, 56, 4, 4, 2, 0);
+}
+
+bool8 PSA_LevelUpVerticalSpritesTaskIsRunning(void)
+{
+ return LevelUpVerticalSpritesTaskIsRunning();
+}
+
+UNUSED void PSA_DrawLevelUpWindowPg1(u16 *statsBefore, u16 *statsAfter)
+{
+ DrawTextBorderOuter(1, 0x001, 0xE);
+ DrawLevelUpWindowPg1(1, statsBefore, statsAfter, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 3);
+}
+UNUSED void PSA_DrawLevelUpWindowPg2(u16 *currStats)
+{
+ DrawLevelUpWindowPg2(1, currStats, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY);
+ CopyWindowToVram(1, 2);
+}
+
+UNUSED bool8 PSA_IsCopyingLevelUpWindowToVram(void)
+{
+ return IsDma3ManagerBusyWithBgCopy();
+}
+
+static void LoadBgGfxByAnimType(u16 animType)
+{
+ CopyToBgTilemapBuffer(3, sBg3Map_PSA, 0, 0x000);
+ DecompressAndCopyTileDataToVram(3, sBg3Tiles_PSA, 0, 0x000, 0);
+ if (animType != 4)
+ LoadPalette(sBgPals_PSA_Any, 0x00, 0x20);
+ else
+ LoadPalette(sBgPals_PSA_Anim4, 0x00, 0x20);
+}
+
+void PSA_CreateMonSpriteAtCloseness(u8 closeness)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ struct Pokemon * pokemon = PSA_GetPokemon();
+ u16 species = GetMonData(pokemon, MON_DATA_SPECIES);
+ u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY);
+ u8 r1 = Menu2_GetMonSpriteAnchorCoord(species, personality, 2);
+ void * r6;
+ void * r9;
+ void * r4;
+ u8 spriteId;
+
+ if (r1 != 0xFF)
+ {
+ scene->monSpriteY1 = 0x48;
+ scene->monSpriteY2 = r1 + 0x30;
+ }
+ else
+ {
+ scene->monSpriteY1 = 0x48;
+ scene->monSpriteY2 = 0x60;
+ }
+
+ r6 = Alloc(0x2000);
+ r9 = Alloc(0x2000);
+ r4 = Alloc(0x100);
+ if (r6 != NULL && r9 != NULL && r4 != NULL)
+ {
+ HandleLoadSpecialPokePic(&gMonFrontPicTable[species], r6, species, personality);
+ LZ77UnCompWram(GetMonFrontSpritePal(pokemon), r4);
+ LoadMonSpriteGraphics(r6, r4);
+ spriteId = CreateSprite(&sSpriteTemplate_MonSprite, 120, scene->monSpriteY1, 4);
+ if (spriteId != MAX_SPRITES)
+ {
+ scene->monSprite = &gSprites[spriteId];
+ MonSpriteZoom_UpdateYPos(scene->monSprite, closeness);
+ }
+ else
+ scene->monSprite = NULL;
+ scene->lastCloseness = closeness;
+ }
+ if (r6 != NULL) Free(r6);
+ if (r9 != NULL) Free(r9);
+ if (r4 != NULL) Free(r4);
+}
+
+#define tState data[0]
+#define tCurrCloseness data[1]
+#define tFinalCloseness data[2]
+#define tDeltaCloseness data[3]
+#define tTimer data[4]
+#define tDelay data[5]
+#define tOff_MonSprite 6
+#define tHasItemSprite data[8]
+#define tOff_ItemSprite 9
+
+void PSA_SetUpZoomAnim(u8 closeness)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ u8 taskId;
+ if (closeness != scene->lastCloseness)
+ {
+ taskId = CreateTask(Task_ZoomAnim, 4);
+ SetWordTaskArg(taskId, tOff_MonSprite, (uintptr_t)scene->monSprite);
+ gTasks[taskId].tCurrCloseness = scene->lastCloseness;
+ gTasks[taskId].tFinalCloseness = closeness;
+ gTasks[taskId].tDelay = 6;
+ if (closeness > scene->lastCloseness)
+ gTasks[taskId].tDeltaCloseness = 1;
+ else
+ gTasks[taskId].tDeltaCloseness = -1;
+ }
+}
+
+bool8 PSA_IsZoomTaskActive(void)
+{
+ return FuncIsActiveTask(Task_ZoomAnim);
+}
+
+static void Task_ZoomAnim(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite * sprite = (void *)GetWordTaskArg(taskId, tOff_MonSprite);
+ switch (tState)
+ {
+ case 0:
+ SetSpriteWithCloseness(sprite, tCurrCloseness);
+ if (tHasItemSprite)
+ SetSpriteWithCloseness((void *)GetWordTaskArg(taskId, tOff_ItemSprite), tCurrCloseness);
+ tCurrCloseness += tDeltaCloseness;
+ tState++;
+ break;
+ case 1:
+ if (!IsZoomSpriteCBActive(sprite))
+ {
+ PlaySE(SE_TB_KARA);
+ MonSpriteZoom_UpdateYPos(sprite, tCurrCloseness);
+ if (tHasItemSprite)
+ ItemSpriteZoom_UpdateYPos((void *)GetWordTaskArg(taskId, tOff_ItemSprite), tCurrCloseness);
+ if (tCurrCloseness == tFinalCloseness)
+ {
+ PSA_GetSceneWork()->lastCloseness = tFinalCloseness;
+ DestroyTask(taskId);
+ }
+ else
+ {
+ tTimer = 0;
+ tState = 2;
+ }
+ }
+ break;
+ case 2:
+ tTimer++;
+ if (tTimer > tDelay)
+ tState = 0;
+ break;
+ }
+}
+
+static void SetSpriteWithCloseness(struct Sprite * sprite, u8 closeness)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = closeness;
+}
+
+static bool8 IsZoomSpriteCBActive(struct Sprite * sprite)
+{
+ return sprite->callback != SpriteCallbackDummy;
+}
+
+static s16 GetSpriteOffsetByScale(s16 pos, u8 closeness)
+{
+ return (pos * sAffineScales[closeness]) >> 8;
+}
+
+// FIXME: better math
+static u16 GetYPosByScale(u16 pos)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ s32 v = ((((((scene->monSpriteY2 - scene->monSpriteY1) << 16) >> 8) / 256 * (pos - 256)) << 8) >> 16);
+ return v += scene->monSpriteY1;
+}
+
+static void MonSpriteZoom_UpdateYPos(struct Sprite * sprite, u8 closeness)
+{
+ if (closeness > 3)
+ closeness = 3;
+ PSA_GetSceneWork(); // return value not used
+ StartSpriteAffineAnim(sprite, closeness);
+ sprite->pos1.y = GetYPosByScale(sAffineScales[closeness]);
+}
+
+static void ItemSpriteZoom_UpdateYPos(struct Sprite * sprite, u8 closeness)
+{
+ MonSpriteZoom_UpdateYPos(sprite, closeness);
+ sprite->pos2.x = GetSpriteOffsetByScale(sprite->data[6] - 32, closeness);
+ sprite->pos2.y = GetSpriteOffsetByScale(sprite->data[7] - 32, closeness);
+}
+
+static void StartMonWiggleAnim(struct PokemonSpecialAnimScene * scene, u8 frameLen, u8 niter, u8 amplitude)
+{
+ // frameLen: frame duration
+ // niter = 0: iterate ad infinitum
+ scene->monSprite->data[0] = frameLen;
+ scene->monSprite->data[1] = niter;
+ scene->monSprite->data[2] = amplitude;
+ scene->monSprite->callback = SpriteCallback_MonSpriteWiggle;
+}
+
+static void StopMonWiggleAnim(struct PokemonSpecialAnimScene * scene)
+{
+ scene->monSprite->pos2.x = 0;
+ scene->monSprite->callback = SpriteCallbackDummy;
+}
+
+static void SpriteCallback_MonSpriteWiggle(struct Sprite * sprite)
+{
+ sprite->data[7]++;
+ if (sprite->data[7] > sprite->data[0])
+ {
+ sprite->data[7] = 0;
+ sprite->data[6]++;
+ if (sprite->data[1] != 0 && sprite->data[6] >= sprite->data[1])
+ {
+ sprite->pos2.x = 0;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ else if (sprite->data[6] & 1)
+ sprite->pos2.x = sprite->data[2];
+ else
+ sprite->pos2.x = -sprite->data[2];
+ }
+}
+
+static void LoadMonSpriteGraphics(u16 *tiles, u16 *palette)
+{
+ struct SpriteSheet spriteSheet;
+ struct SpritePalette spritePalette;
+
+ spriteSheet.data = tiles;
+ spriteSheet.size = 0x800;
+ spriteSheet.tag = 0;
+ spritePalette.data = palette;
+ spritePalette.tag = 0;
+ LoadSpriteSheet(&spriteSheet);
+ LoadSpritePalette(&spritePalette);
+}
+
+#undef tOff_ItemSprite
+#undef tHasItemSprite
+#undef tOff_MonSprite
+#undef tDelay
+#undef tTimer
+#undef tDeltaCloseness
+#undef tFinalCloseness
+#undef tCurrCloseness
+#undef tState
+
+#define tState data[0]
+#define tTimer data[1]
+#define tCloseness data[2]
+#define tYpos data[3]
+#define tOff_ItemSprite 4
+#define tData6 data[6]
+#define tData7 data[7]
+#define tActiveSprCt data[8]
+#define tBlendColor data[9]
+#define tTimerReset data[10]
+#define tSuppressDots data[11]
+
+void PSA_SetUpItemUseOnMonAnim(u16 itemId, u8 closeness, bool32 a2)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ u8 taskId;
+ scene->itemIconSprite = PSA_CreateItemIconObject(itemId);
+ if (scene->itemIconSprite != NULL)
+ {
+ InitItemIconSpriteState(scene, scene->itemIconSprite, closeness);
+ StartSpriteAffineAnim(scene->itemIconSprite, closeness);
+ scene->itemIconSprite->invisible = TRUE;
+ taskId = CreateTask(Task_ItemUseOnMonAnim, 2);
+ SetWordTaskArg(taskId, tOff_ItemSprite, (uintptr_t)scene->itemIconSprite);
+ gTasks[taskId].tCloseness = closeness;
+ gTasks[taskId].tYpos = GetYPosByScale(sAffineScales[closeness]);
+ gTasks[taskId].tData6 = a2;
+ gTasks[taskId].tBlendColor = GetBlendColorByItemId(itemId);
+ }
+}
+
+static u16 GetBlendColorByItemId(u16 itemId)
+{
+ return RGB_WHITE;
+}
+
+void CreateItemIconSpriteAtMaxCloseness(u16 itemId)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ scene->itemIconSprite = PSA_CreateItemIconObject(itemId);
+ if (scene->itemIconSprite != NULL)
+ {
+ StartSpriteAffineAnim(scene->itemIconSprite, 3);
+ InitItemIconSpriteState(scene, scene->itemIconSprite, 3);
+ }
+}
+
+static struct Sprite * PSA_CreateItemIconObject(u16 itemId)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+ spriteId = AddItemIconObject(1, 1, itemId);
+ if (spriteId == MAX_SPRITES)
+ return NULL;
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].subpriority = 1;
+ gSprites[spriteId].affineAnims = sAffineAnimTable_Zoom;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ return &gSprites[spriteId];
+}
+
+bool8 PSA_IsItemUseOnMonAnimActive(void)
+{
+ return FuncIsActiveTask(Task_ItemUseOnMonAnim);
+}
+
+static void Task_ItemUseOnMonAnim(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite * sprite = (void *)GetWordTaskArg(taskId, tOff_ItemSprite);
+ switch (tState)
+ {
+ case 0:
+ tTimer++;
+ if (tTimer > 20)
+ {
+ tTimer = 0;
+ PlaySE(SE_W207B);
+ sprite->invisible = FALSE;
+ if (!tSuppressDots)
+ LoadOutwardSpiralDotsGfx();
+ tState = 1;
+ }
+ break;
+ case 1:
+ tTimer++;
+ if (tTimer > 30)
+ {
+ tTimer = 0;
+ sprite->affineAnims = sAffineAnimTable_ItemZoom;
+ StartSpriteAffineAnim(sprite, tCloseness);
+ BeginNormalPaletteFade(0x10000 << IndexOfSpritePaletteTag(1), -2, 0, 12, tBlendColor);
+ tState = 2;
+ PlaySE(SE_W208);
+ }
+ break;
+ case 2:
+ if (sprite->affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ tTimerReset = 20;
+ tState = 3;
+ }
+ break;
+ case 3:
+ tTimer++;
+ if (tTimer > tTimerReset)
+ {
+ tTimer = 0;
+ if (!tSuppressDots)
+ CreateSprites_UseItem_OutwardSpiralDots(taskId, data, sprite);
+ if (tData7 == 0)
+ PlaySE(SE_W179);
+ tData7++;
+ if (tData7 > 2)
+ tState = 4;
+ else
+ tTimerReset = 8;
+ }
+ break;
+ case 4:
+ if (tActiveSprCt == 0)
+ {
+ if (tData6)
+ DestroySprite(sprite);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct Sprite * sprite)
+{
+ int x = sprite->pos1.x + sprite->pos2.x - 4;
+ int y = sprite->pos1.y + sprite->pos2.y - 4;
+ u8 spriteId;
+ int i;
+ BlendPalettes(0x10000 << IndexOfSpritePaletteTag(5), 16, tBlendColor);
+ for (i = 0; i < 15; i++)
+ {
+ spriteId = CreateSprite(&sSpriteTemplate_UseItem_OutwardSpiralDots, x, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[1] = i << 4;
+ gSprites[spriteId].data[7] = taskId;
+ gSprites[spriteId].callback = SpriteCB_OutwardSpiralDots;
+ StartSpriteAnim(&gSprites[spriteId], 1);
+ tActiveSprCt++;
+ }
+ }
+}
+
+static void SpriteCB_OutwardSpiralDots(struct Sprite * sprite)
+{
+ s16 *data = sprite->data;
+ if (data[0] < 16)
+ {
+ data[0]++;
+ data[1] += 7;
+ data[1] &= 0xFF;
+ data[2] += 4;
+ sprite->pos2.x = (data[2] * gSineTable[data[1] + 0x40]) >> 8;
+ sprite->pos2.y = (data[2] * gSineTable[data[1]]) >> 8;
+ }
+ else
+ {
+ gTasks[data[7]].tActiveSprCt--;
+ DestroySprite(sprite);
+ }
+}
+
+void PSA_UseItem_CleanUpForCancel(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_ItemUseOnMonAnim);
+ if (taskId != 0xFF)
+ {
+ gTasks[taskId].tSuppressDots = TRUE;
+ }
+}
+
+static void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite * sprite, u8 closeness)
+{
+ u16 species;
+ u32 personality;
+ register int x asm("r4"); // FIXME
+ u8 y;
+ if (closeness == 3)
+ {
+ sprite->pos1.x = 120;
+ sprite->pos1.y = scene->monSpriteY2;
+ }
+ else
+ {
+ sprite->pos1.x = 120;
+ sprite->pos1.y = scene->monSpriteY1;
+ }
+ sprite->pos1.x += 4;
+ sprite->pos1.y += 4;
+ species = PSA_GetMonSpecies();
+ personality = PSA_GetMonPersonality();
+ if (PSA_GetAnimType() == 4)
+ {
+ x = Menu2_GetMonSpriteAnchorCoord(species, personality, 0);
+ y = Menu2_GetMonSpriteAnchorCoord(species, personality, 1);
+ }
+ else
+ {
+ x = Menu2_GetMonSpriteAnchorCoord(species, personality, 3);
+ y = Menu2_GetMonSpriteAnchorCoord(species, personality, 4);
+ }
+ if (x == 0xFF)
+ x = 0;
+ if (y == 0xFF)
+ y = 0;
+ sprite->data[6] = x;
+ sprite->data[7] = y;
+ ItemSpriteZoom_UpdateYPos(sprite, closeness);
+}
+
+#undef tSuppressDots
+#undef tTimerReset
+#undef tBlendColor
+#undef tActiveSprCt
+#undef tData7
+#undef tData6
+#undef tOff_ItemSprite
+#undef tYpos
+#undef tCloseness
+#undef tTimer
+#undef tState
+
+static void MachineSetWobbleInit(void)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ MachineSetWobble_SetCB(scene->monSprite);
+ MachineSetWobble_SetCB(scene->itemIconSprite);
+}
+
+static void MachineSetWobble_SetCB(struct Sprite * sprite)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = SpriteCB_MachineSetWobble;
+}
+
+static bool8 MachineSetWobbleCBIsRunning(void)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ return scene->monSprite->callback != SpriteCallbackDummy;
+}
+
+static void SpriteCB_MachineSetWobble(struct Sprite * sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x += 3;
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->data[1]++;
+ if (sprite->data[1] > 30)
+ {
+ sprite->pos1.x -= 3;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+// Redefined from above
+#define tState data[0]
+#define tCurrCloseness data[1]
+#define tFinalCloseness data[2]
+#define tDeltaCloseness data[3]
+#define tTimer data[4]
+#define tDelay data[5]
+#define tOff_MonSprite 6
+#define tHasItemSprite data[8]
+#define tOff_ItemSprite 9
+
+static void StartZoomOutAnimForUseTM(u8 closeness)
+{
+ struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork();
+ u8 taskId;
+ if (closeness != scene->lastCloseness)
+ {
+ taskId = CreateTask(Task_ZoomAnim, 1);
+ SetWordTaskArg(taskId, tOff_MonSprite, (uintptr_t)scene->monSprite);
+ SetWordTaskArg(taskId, tOff_ItemSprite, (uintptr_t)scene->itemIconSprite);
+ gTasks[taskId].tCurrCloseness = scene->lastCloseness;
+ gTasks[taskId].tFinalCloseness = closeness;
+ gTasks[taskId].tHasItemSprite = 1;
+ gTasks[taskId].tDelay = 6;
+ if (closeness > scene->lastCloseness)
+ gTasks[taskId].tDeltaCloseness = 1;
+ else
+ gTasks[taskId].tDeltaCloseness = -1;
+ }
+}
+
+#undef tOff_ItemSprite
+#undef tHasItemSprite
+#undef tOff_MonSprite
+#undef tDelay
+#undef tTimer
+#undef tDeltaCloseness
+#undef tFinalCloseness
+#undef tCurrCloseness
+#undef tState
+
+static void CreateStarSprites(struct PokemonSpecialAnimScene * scene)
+{
+ int i;
+ u8 spriteId;
+ u16 species;
+ u32 personality;
+ LoadCompressedSpriteSheet(&sSpriteSheet_Star);
+ LoadSpritePalette(&sSpritePalette_Star);
+ scene->field_0002 = 0;
+ for (i = 0; i < 3; i++)
+ {
+ spriteId = CreateSprite(&sSpriteTemplate_Star, 120 + sStarCoordOffsets[i][0], scene->monSpriteY2 + sStarCoordOffsets[i][1], 2);
+ if (spriteId != MAX_SPRITES)
+ {
+ species = PSA_GetMonSpecies();
+ personality = PSA_GetMonPersonality();
+ gSprites[spriteId].data[3] = sStarCoordOffsets[i][0] * 8;
+ gSprites[spriteId].data[4] = sStarCoordOffsets[i][1] * 8;
+ gSprites[spriteId].pos1.x += GetSpriteOffsetByScale(Menu2_GetMonSpriteAnchorCoordMinusx20(species, personality, 0), 3);
+ gSprites[spriteId].pos1.y += GetSpriteOffsetByScale(Menu2_GetMonSpriteAnchorCoordMinusx20(species, personality, 1), 3);
+ scene->field_0002++;
+ }
+ }
+}
+
+static u8 AnyStarSpritesActive(void)
+{
+ return PSA_GetSceneWork()->field_0002;
+}
+
+static void SpriteCB_Star(struct Sprite * sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] < 10)
+ {
+ sprite->data[1] += sprite->data[3];
+ sprite->data[2] += sprite->data[4];
+ sprite->pos2.x = sprite->data[1] >> 4;
+ sprite->pos2.y = sprite->data[2] >> 4;
+ }
+ else
+ {
+ PSA_GetSceneWork()->field_0002--;
+ DestroySprite(sprite);
+ }
+}
+
+// ========================================================
+
+#define tState data[0]
+#define tTimer data[1]
+#define tActiveSprCt data[2]
+#define tOff_RngState 3
+#define tAngle data[5]
+#define tMadeSprCt data[6]
+
+#define tsRadius data[0]
+#define tsSpeed data[1]
+#define tsXinit data[2]
+#define tsYinit data[3]
+#define tsXorig data[4]
+#define tsYorig data[5]
+#define tsTaskId data[6]
+
+static void PSAScene_SeedRandomInTask(struct PokemonSpecialAnimScene * scene)
+{
+ u8 taskId;
+ LoadOutwardSpiralDotsGfx();
+ taskId = CreateTask(Task_UseItem_OutwardSpiralDots, 1);
+ SetWordTaskArg(taskId, tOff_RngState, 2022069025);
+ gTasks[taskId].tAngle = 0xE0;
+}
+
+static void StopMakingOutwardSpiralDots(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_UseItem_OutwardSpiralDots);
+ if (taskId != 0xFF)
+ gTasks[taskId].tState = 1;
+}
+
+static void Task_UseItem_OutwardSpiralDots(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ struct Sprite * sprite;
+ int x;
+ register int y asm("r10"); // FIXME
+ int x2;
+ int y2;
+ int ampl;
+ u8 spriteId;
+ switch (tState)
+ {
+ case 0:
+ if (tTimer == 0)
+ {
+ sprite = PSA_GetSceneWork()->itemIconSprite;
+ x = sprite->pos1.x + sprite->pos2.x;
+ y = sprite->pos1.y + sprite->pos2.y;
+ ampl = (PSAScene_RandomFromTask(taskId) % 21) + 70;
+ x2 = x + ((u32)(gSineTable[tAngle + 0x40] * ampl) >> 8);
+ y2 = y + ((u32)(gSineTable[tAngle ] * ampl) >> 8);
+ tAngle += 0x4C;
+ tAngle &= 0xFF;
+ spriteId = CreateSprite(&sSpriteTemplate_UseItem_OutwardSpiralDots, x2, y2, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].tsRadius = 0;
+ gSprites[spriteId].tsSpeed = (PSAScene_RandomFromTask(taskId) & 1) + 6;
+ gSprites[spriteId].tsXinit = x2;
+ gSprites[spriteId].tsYinit = y2;
+ gSprites[spriteId].tsXorig = x;
+ gSprites[spriteId].tsYorig = y;
+ gSprites[spriteId].tsTaskId = taskId;
+ tActiveSprCt++;
+ }
+ tMadeSprCt++;
+ if (tMadeSprCt > 47)
+ tState++;
+ }
+ else
+ tTimer--;
+ break;
+ case 1:
+ if (tActiveSprCt == 0)
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static u16 PSAScene_RandomFromTask(u8 taskId)
+{
+ u32 state = GetWordTaskArg(taskId, tOff_RngState);
+ state = state * 1103515245 + 24691;
+ SetWordTaskArg(taskId, tOff_RngState, state);
+ return state >> 16;
+}
+
+static void SpriteCallback_UseItem_OutwardSpiralDots(struct Sprite * sprite)
+{
+ int x;
+ int y;
+ sprite->tsRadius += sprite->tsSpeed;
+ if (sprite->tsRadius > 255)
+ {
+ gTasks[sprite->tsTaskId].tActiveSprCt--;
+ DestroySprite(sprite);
+ }
+ else
+ {
+ x = (sprite->tsXorig - sprite->tsXinit) * sprite->tsRadius;
+ y = (sprite->tsYorig - sprite->tsYinit) * sprite->tsRadius;
+ sprite->pos1.x = (x >> 8) + sprite->tsXinit;
+ sprite->pos1.y = (y >> 8) + sprite->tsYinit;
+ }
+}
+
+static void LoadOutwardSpiralDotsGfx(void)
+{
+ LoadCompressedSpriteSheet(&sSpriteSheet_UseItem_OutwardSpiralDots);
+ LoadSpritePalette(&sSpritePalette_UseItem_OutwardSpiralDots);
+}
+
+static bool32 IsOutwardSpiralDotsTaskRunning(void)
+{
+ return FuncIsActiveTask(Task_UseItem_OutwardSpiralDots);
+}
+
+#undef tsTaskId
+#undef tsYorig
+#undef tsXorig
+#undef tsYinit
+#undef tsXinit
+#undef tsSpeed
+#undef tsRadius
+
+#undef tMadeSprCt
+#undef tAngle
+#undef tOff_RngState
+#undef tActiveSprCt
+#undef tTimer
+#undef tState
+
+// ========================================================
+
+#define tState data[0]
+#define tActiveSprCt data[1]
+#define tMadeSprCt data[2]
+#define tTimer data[3]
+#define tXpos data[4]
+#define tYpos data[5]
+#define tTileTag data[6]
+#define tPaletteTag data[7]
+#define tPriority data[8]
+#define tSubpriority data[9]
+
+#define tsYsubpixel data[1]
+#define tsSpeed data[2]
+#define tsTaskId data[7]
+
+void CreateLevelUpVerticalSpritesTask(u16 x, u16 y, u16 tileTag, u16 paletteTag, u16 priority, u16 subpriority)
+{
+ static struct CompressedSpriteSheet spriteSheet;
+ static struct SpritePalette spritePalette;
+ u8 taskId;
+ spriteSheet.tag = tileTag;
+ spriteSheet.data = sSpriteTiles_LevelUpVertical;
+ spriteSheet.size = sSpriteTiles_LevelUpVertical[0] >> 8;
+ spritePalette.data = sSpritePals_LevelUpVertical;
+ spritePalette.tag = paletteTag;
+ LoadCompressedSpriteSheet(&spriteSheet);
+ LoadSpritePalette(&spritePalette);
+ taskId = CreateTask(Task_LevelUpVerticalSprites, 0);
+ gTasks[taskId].tXpos = x - 32;
+ gTasks[taskId].tYpos = y + 32;
+ gTasks[taskId].tTileTag = tileTag;
+ gTasks[taskId].tPaletteTag = paletteTag;
+ gTasks[taskId].tPriority = priority;
+ gTasks[taskId].tSubpriority = subpriority;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 6));
+}
+
+bool8 LevelUpVerticalSpritesTaskIsRunning(void)
+{
+ return FuncIsActiveTask(Task_LevelUpVerticalSprites);
+}
+
+static void Task_LevelUpVerticalSprites(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (tState)
+ {
+ case 0:
+ if (tTimer == 0)
+ {
+ tTimer++;
+ CreateLevelUpVerticalSprite(taskId, data);
+ if (tMadeSprCt > 17)
+ tState++;
+ }
+ else
+ {
+ tTimer++;
+ if (tTimer == 2)
+ tTimer = 0;
+ }
+ break;
+ case 1:
+ if (tActiveSprCt == 0)
+ {
+ FreeSpriteTilesByTag(tTileTag);
+ FreeSpritePaletteByTag(tPaletteTag);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void CreateLevelUpVerticalSprite(u8 taskId, s16 *data)
+{
+ u8 spriteId;
+ struct SpriteTemplate template = sSpriteTemplate_LevelUpVertical;
+ template.tileTag = tTileTag;
+ template.paletteTag = tPaletteTag;
+ tMadeSprCt++;
+ spriteId = CreateSprite(&template, ((tMadeSprCt * 219) & 0x3F) + tXpos, tYpos, tSubpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = tPriority;
+ gSprites[spriteId].tsYsubpixel = 0;
+ // similar to the LCRNG in random.c, but seeding from data[2]
+ gSprites[spriteId].tsSpeed = ((tMadeSprCt * 1103515245 + 24691) & 0x3F) + 0x20;
+ gSprites[spriteId].tsTaskId = taskId;
+ tActiveSprCt++;
+ }
+}
+
+static void SpriteCB_LevelUpVertical(struct Sprite * sprite)
+{
+ sprite->tsYsubpixel -= sprite->tsSpeed;
+ sprite->pos2.y = sprite->tsYsubpixel >> 4;
+ if (sprite->pos2.y < -0x40)
+ {
+ gTasks[sprite->tsTaskId].tActiveSprCt--;
+ DestroySprite(sprite);
+ }
+}
+
+#undef tsTaskId
+#undef tsSpeed
+#undef tsYsubpixel
+
+#undef tSubpriority
+#undef tPriority
+#undef tPaletteTag
+#undef tTileTag
+#undef tYpos
+#undef tXpos
+#undef tTimer
+#undef tMadeSprCt
+#undef tActiveSprCt
+#undef tState
+
+// ========================================================
+
+static const u8 *const sLevelUpWindowStatNames[] = {
+ gUnknown_841B2A9,
+ gUnknown_841B2B7,
+ gUnknown_841B2BE,
+ gUnknown_841B2CC,
+ gUnknown_841B2D4,
+ gUnknown_841B2C6
+};
+
+void DrawLevelUpWindowPg1(u16 windowId, u16 *beforeStats, u16 *afterStats, u8 bgColor, u8 fgColor, u8 shadowColor)
+{
+ s16 diffStats[6];
+ u8 textbuf[12];
+ u8 textColor[3];
+ u16 i;
+ u8 x;
+
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor));
+
+ diffStats[0] = afterStats[0] - beforeStats[0];
+ diffStats[1] = afterStats[1] - beforeStats[1];
+ diffStats[2] = afterStats[2] - beforeStats[2];
+ diffStats[3] = afterStats[4] - beforeStats[4];
+ diffStats[4] = afterStats[5] - beforeStats[5];
+ diffStats[5] = afterStats[3] - beforeStats[3];
+
+ textColor[0] = bgColor;
+ textColor[1] = fgColor;
+ textColor[2] = shadowColor;
+
+ for (i = 0; i < 6; i++)
+ {
+ AddTextPrinterParameterized3(windowId, 2, 0, i * 15, textColor, TEXT_SPEED_FF, sLevelUpWindowStatNames[i]);
+ StringCopy(textbuf, diffStats[i] >= 0 ? gUnknown_841B2DC : gUnknown_841B2E5);
+ AddTextPrinterParameterized3(windowId, 2, 56, i * 15, textColor, TEXT_SPEED_FF, textbuf);
+ textbuf[0] = CHAR_SPACE;
+ x = abs(diffStats[i]) < 10 ? 12 : 6;
+ ConvertIntToDecimalStringN(textbuf + 1, abs(diffStats[i]), STR_CONV_MODE_LEFT_ALIGN, 2);
+ AddTextPrinterParameterized3(windowId, 2, x + 56, i * 15, textColor, TEXT_SPEED_FF, textbuf);
+ }
+}
+
+void DrawLevelUpWindowPg2(u16 windowId, u16 *currStats, u8 bgColor, u8 fgColor, u8 shadowColor)
+{
+ s16 statsRearrange[6];
+ u8 textbuf[12];
+ u8 textColor[3];
+ u16 i;
+ u8 ndigits;
+ u16 x;
+
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor));
+
+ statsRearrange[0] = currStats[0];
+ statsRearrange[1] = currStats[1];
+ statsRearrange[2] = currStats[2];
+ statsRearrange[3] = currStats[4];
+ statsRearrange[4] = currStats[5];
+ statsRearrange[5] = currStats[3];
+
+ textColor[0] = bgColor;
+ textColor[1] = fgColor;
+ textColor[2] = shadowColor;
+
+ for (i = 0; i < 6; i++)
+ {
+ if (statsRearrange[i] >= 100)
+ ndigits = 3;
+ else if (statsRearrange[i] >= 10)
+ ndigits = 2;
+ else
+ ndigits = 1;
+ ConvertIntToDecimalStringN(textbuf, statsRearrange[i], STR_CONV_MODE_LEFT_ALIGN, ndigits);
+ x = 6 * (4 - ndigits);
+ AddTextPrinterParameterized3(windowId, 2, 0, i * 15, textColor, TEXT_SPEED_FF, sLevelUpWindowStatNames[i]);
+ AddTextPrinterParameterized3(windowId, 2, 56 + x, i * 15, textColor, TEXT_SPEED_FF, textbuf);
+ }
+}