diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2020-03-22 14:50:33 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-22 14:50:33 -0400 |
commit | 4f65d54095908a1bcf068c7712bca9d4c34f10a3 (patch) | |
tree | 98931db924a98c2fc6e1ee0c47ab9f8fa2763d9d /src | |
parent | ec93f0bb084f7b98ac8853794d430aed8c6a5298 (diff) | |
parent | cce652dc9b40f0c673432f55a757aae8c4d4064e (diff) |
Merge pull request #309 from PikalaxALT/pokemon_special_anim
Pokemon special anim
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_controller_player.c | 4 | ||||
-rw-r--r-- | src/battle_script_commands.c | 4 | ||||
-rw-r--r-- | src/data/pokemon/experience_tables.h | 2 | ||||
-rw-r--r-- | src/daycare.c | 4 | ||||
-rw-r--r-- | src/menu2.c | 836 | ||||
-rw-r--r-- | src/party_menu.c | 22 | ||||
-rw-r--r-- | src/pokemon.c | 4 | ||||
-rw-r--r-- | src/pokemon_special_anim.c | 708 | ||||
-rw-r--r-- | src/pokemon_special_anim_scene.c | 1552 |
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); + } +} |