pokeruby/src/pokemon_icon.c
2017-07-21 09:14:35 -07:00

1277 lines
27 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "global.h"
#include "graphics.h"
#include "mail_data.h"
#include "species.h"
#include "sprite.h"
#define POKE_ICON_BASE_PAL_TAG 56000
struct MonIconSpriteTemplate
{
const struct OamData *oam;
const u8 *image;
const union AnimCmd *const *anims;
const union AffineAnimCmd *const *affineAnims;
void (*callback)(struct Sprite *);
u16 paletteTag;
};
const u8 * const gMonIconTable[] =
{
gMonIcon_Bulbasaur,
gMonIcon_Bulbasaur,
gMonIcon_Ivysaur,
gMonIcon_Venusaur,
gMonIcon_Charmander,
gMonIcon_Charmeleon,
gMonIcon_Charizard,
gMonIcon_Squirtle,
gMonIcon_Wartortle,
gMonIcon_Blastoise,
gMonIcon_Caterpie,
gMonIcon_Metapod,
gMonIcon_Butterfree,
gMonIcon_Weedle,
gMonIcon_Kakuna,
gMonIcon_Beedrill,
gMonIcon_Pidgey,
gMonIcon_Pidgeotto,
gMonIcon_Pidgeot,
gMonIcon_Rattata,
gMonIcon_Raticate,
gMonIcon_Spearow,
gMonIcon_Fearow,
gMonIcon_Ekans,
gMonIcon_Arbok,
gMonIcon_Pikachu,
gMonIcon_Raichu,
gMonIcon_Sandshrew,
gMonIcon_Sandslash,
gMonIcon_NidoranF,
gMonIcon_Nidorina,
gMonIcon_Nidoqueen,
gMonIcon_NidoranM,
gMonIcon_Nidorino,
gMonIcon_Nidoking,
gMonIcon_Clefairy,
gMonIcon_Clefable,
gMonIcon_Vulpix,
gMonIcon_Ninetales,
gMonIcon_Jigglypuff,
gMonIcon_Wigglytuff,
gMonIcon_Zubat,
gMonIcon_Golbat,
gMonIcon_Oddish,
gMonIcon_Gloom,
gMonIcon_Vileplume,
gMonIcon_Paras,
gMonIcon_Parasect,
gMonIcon_Venonat,
gMonIcon_Venomoth,
gMonIcon_Diglett,
gMonIcon_Dugtrio,
gMonIcon_Meowth,
gMonIcon_Persian,
gMonIcon_Psyduck,
gMonIcon_Golduck,
gMonIcon_Mankey,
gMonIcon_Primeape,
gMonIcon_Growlithe,
gMonIcon_Arcanine,
gMonIcon_Poliwag,
gMonIcon_Poliwhirl,
gMonIcon_Poliwrath,
gMonIcon_Abra,
gMonIcon_Kadabra,
gMonIcon_Alakazam,
gMonIcon_Machop,
gMonIcon_Machoke,
gMonIcon_Machamp,
gMonIcon_Bellsprout,
gMonIcon_Weepinbell,
gMonIcon_Victreebel,
gMonIcon_Tentacool,
gMonIcon_Tentacruel,
gMonIcon_Geodude,
gMonIcon_Graveler,
gMonIcon_Golem,
gMonIcon_Ponyta,
gMonIcon_Rapidash,
gMonIcon_Slowpoke,
gMonIcon_Slowbro,
gMonIcon_Magnemite,
gMonIcon_Magneton,
gMonIcon_Farfetchd,
gMonIcon_Doduo,
gMonIcon_Dodrio,
gMonIcon_Seel,
gMonIcon_Dewgong,
gMonIcon_Grimer,
gMonIcon_Muk,
gMonIcon_Shellder,
gMonIcon_Cloyster,
gMonIcon_Gastly,
gMonIcon_Haunter,
gMonIcon_Gengar,
gMonIcon_Onix,
gMonIcon_Drowzee,
gMonIcon_Hypno,
gMonIcon_Krabby,
gMonIcon_Kingler,
gMonIcon_Voltorb,
gMonIcon_Electrode,
gMonIcon_Exeggcute,
gMonIcon_Exeggutor,
gMonIcon_Cubone,
gMonIcon_Marowak,
gMonIcon_Hitmonlee,
gMonIcon_Hitmonchan,
gMonIcon_Lickitung,
gMonIcon_Koffing,
gMonIcon_Weezing,
gMonIcon_Rhyhorn,
gMonIcon_Rhydon,
gMonIcon_Chansey,
gMonIcon_Tangela,
gMonIcon_Kangaskhan,
gMonIcon_Horsea,
gMonIcon_Seadra,
gMonIcon_Goldeen,
gMonIcon_Seaking,
gMonIcon_Staryu,
gMonIcon_Starmie,
gMonIcon_Mrmime,
gMonIcon_Scyther,
gMonIcon_Jynx,
gMonIcon_Electabuzz,
gMonIcon_Magmar,
gMonIcon_Pinsir,
gMonIcon_Tauros,
gMonIcon_Magikarp,
gMonIcon_Gyarados,
gMonIcon_Lapras,
gMonIcon_Ditto,
gMonIcon_Eevee,
gMonIcon_Vaporeon,
gMonIcon_Jolteon,
gMonIcon_Flareon,
gMonIcon_Porygon,
gMonIcon_Omanyte,
gMonIcon_Omastar,
gMonIcon_Kabuto,
gMonIcon_Kabutops,
gMonIcon_Aerodactyl,
gMonIcon_Snorlax,
gMonIcon_Articuno,
gMonIcon_Zapdos,
gMonIcon_Moltres,
gMonIcon_Dratini,
gMonIcon_Dragonair,
gMonIcon_Dragonite,
gMonIcon_Mewtwo,
gMonIcon_Mew,
gMonIcon_Chikorita,
gMonIcon_Bayleef,
gMonIcon_Meganium,
gMonIcon_Cyndaquil,
gMonIcon_Quilava,
gMonIcon_Typhlosion,
gMonIcon_Totodile,
gMonIcon_Croconaw,
gMonIcon_Feraligatr,
gMonIcon_Sentret,
gMonIcon_Furret,
gMonIcon_Hoothoot,
gMonIcon_Noctowl,
gMonIcon_Ledyba,
gMonIcon_Ledian,
gMonIcon_Spinarak,
gMonIcon_Ariados,
gMonIcon_Crobat,
gMonIcon_Chinchou,
gMonIcon_Lanturn,
gMonIcon_Pichu,
gMonIcon_Cleffa,
gMonIcon_Igglybuff,
gMonIcon_Togepi,
gMonIcon_Togetic,
gMonIcon_Natu,
gMonIcon_Xatu,
gMonIcon_Mareep,
gMonIcon_Flaaffy,
gMonIcon_Ampharos,
gMonIcon_Bellossom,
gMonIcon_Marill,
gMonIcon_Azumarill,
gMonIcon_Sudowoodo,
gMonIcon_Politoed,
gMonIcon_Hoppip,
gMonIcon_Skiploom,
gMonIcon_Jumpluff,
gMonIcon_Aipom,
gMonIcon_Sunkern,
gMonIcon_Sunflora,
gMonIcon_Yanma,
gMonIcon_Wooper,
gMonIcon_Quagsire,
gMonIcon_Espeon,
gMonIcon_Umbreon,
gMonIcon_Murkrow,
gMonIcon_Slowking,
gMonIcon_Misdreavus,
gMonIcon_UnownA,
gMonIcon_Wobbuffet,
gMonIcon_Girafarig,
gMonIcon_Pineco,
gMonIcon_Forretress,
gMonIcon_Dunsparce,
gMonIcon_Gligar,
gMonIcon_Steelix,
gMonIcon_Snubbull,
gMonIcon_Granbull,
gMonIcon_Qwilfish,
gMonIcon_Scizor,
gMonIcon_Shuckle,
gMonIcon_Heracross,
gMonIcon_Sneasel,
gMonIcon_Teddiursa,
gMonIcon_Ursaring,
gMonIcon_Slugma,
gMonIcon_Magcargo,
gMonIcon_Swinub,
gMonIcon_Piloswine,
gMonIcon_Corsola,
gMonIcon_Remoraid,
gMonIcon_Octillery,
gMonIcon_Delibird,
gMonIcon_Mantine,
gMonIcon_Skarmory,
gMonIcon_Houndour,
gMonIcon_Houndoom,
gMonIcon_Kingdra,
gMonIcon_Phanpy,
gMonIcon_Donphan,
gMonIcon_Porygon2,
gMonIcon_Stantler,
gMonIcon_Smeargle,
gMonIcon_Tyrogue,
gMonIcon_Hitmontop,
gMonIcon_Smoochum,
gMonIcon_Elekid,
gMonIcon_Magby,
gMonIcon_Miltank,
gMonIcon_Blissey,
gMonIcon_Raikou,
gMonIcon_Entei,
gMonIcon_Suicune,
gMonIcon_Larvitar,
gMonIcon_Pupitar,
gMonIcon_Tyranitar,
gMonIcon_Lugia,
gMonIcon_HoOh,
gMonIcon_Celebi,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_QuestionMark,
gMonIcon_Treecko,
gMonIcon_Grovyle,
gMonIcon_Sceptile,
gMonIcon_Torchic,
gMonIcon_Combusken,
gMonIcon_Blaziken,
gMonIcon_Mudkip,
gMonIcon_Marshtomp,
gMonIcon_Swampert,
gMonIcon_Poochyena,
gMonIcon_Mightyena,
gMonIcon_Zigzagoon,
gMonIcon_Linoone,
gMonIcon_Wurmple,
gMonIcon_Silcoon,
gMonIcon_Beautifly,
gMonIcon_Cascoon,
gMonIcon_Dustox,
gMonIcon_Lotad,
gMonIcon_Lombre,
gMonIcon_Ludicolo,
gMonIcon_Seedot,
gMonIcon_Nuzleaf,
gMonIcon_Shiftry,
gMonIcon_Nincada,
gMonIcon_Ninjask,
gMonIcon_Shedinja,
gMonIcon_Taillow,
gMonIcon_Swellow,
gMonIcon_Shroomish,
gMonIcon_Breloom,
gMonIcon_Spinda,
gMonIcon_Wingull,
gMonIcon_Pelipper,
gMonIcon_Surskit,
gMonIcon_Masquerain,
gMonIcon_Wailmer,
gMonIcon_Wailord,
gMonIcon_Skitty,
gMonIcon_Delcatty,
gMonIcon_Kecleon,
gMonIcon_Baltoy,
gMonIcon_Claydol,
gMonIcon_Nosepass,
gMonIcon_Torkoal,
gMonIcon_Sableye,
gMonIcon_Barboach,
gMonIcon_Whiscash,
gMonIcon_Luvdisc,
gMonIcon_Corphish,
gMonIcon_Crawdaunt,
gMonIcon_Feebas,
gMonIcon_Milotic,
gMonIcon_Carvanha,
gMonIcon_Sharpedo,
gMonIcon_Trapinch,
gMonIcon_Vibrava,
gMonIcon_Flygon,
gMonIcon_Makuhita,
gMonIcon_Hariyama,
gMonIcon_Electrike,
gMonIcon_Manectric,
gMonIcon_Numel,
gMonIcon_Camerupt,
gMonIcon_Spheal,
gMonIcon_Sealeo,
gMonIcon_Walrein,
gMonIcon_Cacnea,
gMonIcon_Cacturne,
gMonIcon_Snorunt,
gMonIcon_Glalie,
gMonIcon_Lunatone,
gMonIcon_Solrock,
gMonIcon_Azurill,
gMonIcon_Spoink,
gMonIcon_Grumpig,
gMonIcon_Plusle,
gMonIcon_Minun,
gMonIcon_Mawile,
gMonIcon_Meditite,
gMonIcon_Medicham,
gMonIcon_Swablu,
gMonIcon_Altaria,
gMonIcon_Wynaut,
gMonIcon_Duskull,
gMonIcon_Dusclops,
gMonIcon_Roselia,
gMonIcon_Slakoth,
gMonIcon_Vigoroth,
gMonIcon_Slaking,
gMonIcon_Gulpin,
gMonIcon_Swalot,
gMonIcon_Tropius,
gMonIcon_Whismur,
gMonIcon_Loudred,
gMonIcon_Exploud,
gMonIcon_Clamperl,
gMonIcon_Huntail,
gMonIcon_Gorebyss,
gMonIcon_Absol,
gMonIcon_Shuppet,
gMonIcon_Banette,
gMonIcon_Seviper,
gMonIcon_Zangoose,
gMonIcon_Relicanth,
gMonIcon_Aron,
gMonIcon_Lairon,
gMonIcon_Aggron,
gMonIcon_Castform,
gMonIcon_Volbeat,
gMonIcon_Illumise,
gMonIcon_Lileep,
gMonIcon_Cradily,
gMonIcon_Anorith,
gMonIcon_Armaldo,
gMonIcon_Ralts,
gMonIcon_Kirlia,
gMonIcon_Gardevoir,
gMonIcon_Bagon,
gMonIcon_Shelgon,
gMonIcon_Salamence,
gMonIcon_Beldum,
gMonIcon_Metang,
gMonIcon_Metagross,
gMonIcon_Regirock,
gMonIcon_Regice,
gMonIcon_Registeel,
gMonIcon_Kyogre,
gMonIcon_Groudon,
gMonIcon_Rayquaza,
gMonIcon_Latias,
gMonIcon_Latios,
gMonIcon_Jirachi,
gMonIcon_Deoxys,
gMonIcon_Chimecho,
gMonIcon_Egg,
gMonIcon_UnownB,
gMonIcon_UnownC,
gMonIcon_UnownD,
gMonIcon_UnownE,
gMonIcon_UnownF,
gMonIcon_UnownG,
gMonIcon_UnownH,
gMonIcon_UnownI,
gMonIcon_UnownJ,
gMonIcon_UnownK,
gMonIcon_UnownL,
gMonIcon_UnownM,
gMonIcon_UnownN,
gMonIcon_UnownO,
gMonIcon_UnownP,
gMonIcon_UnownQ,
gMonIcon_UnownR,
gMonIcon_UnownS,
gMonIcon_UnownT,
gMonIcon_UnownU,
gMonIcon_UnownV,
gMonIcon_UnownW,
gMonIcon_UnownX,
gMonIcon_UnownY,
gMonIcon_UnownZ,
gMonIcon_UnownExclamationMark,
gMonIcon_UnownQuestionMark,
};
const u8 gMonIconPaletteIndices[] =
{
0, // ??????????
1, // Bulbasaur
1, // Ivysaur
1, // Venusaur
0, // Charmander
0, // Charmeleon
0, // Charizard
0, // Squirtle
2, // Wartortle
2, // Blastoise
1, // Caterpie
1, // Metapod
0, // Butterfree
1, // Weedle
2, // Kakuna
2, // Beedrill
0, // Pidgey
0, // Pidgeotto
0, // Pidgeot
2, // Rattata
1, // Raticate
0, // Spearow
0, // Fearow
2, // Ekans
2, // Arbok
2, // Pikachu
0, // Raichu
2, // Sandshrew
2, // Sandslash
2, // Nidoran♀
2, // Nidorina
2, // Nidoqueen
2, // Nidoran♂
2, // Nidorino
2, // Nidoking
0, // Clefairy
0, // Clefable
2, // Vulpix
1, // Ninetales
0, // Jigglypuff
0, // Wigglytuff
2, // Zubat
2, // Golbat
1, // Oddish
0, // Gloom
0, // Vileplume
0, // Paras
0, // Parasect
0, // Venonat
2, // Venomoth
2, // Diglett
2, // Dugtrio
1, // Meowth
1, // Persian
1, // Psyduck
2, // Golduck
1, // Mankey
2, // Primeape
0, // Growlithe
0, // Arcanine
0, // Poliwag
0, // Poliwhirl
0, // Poliwrath
2, // Abra
2, // Kadabra
2, // Alakazam
0, // Machop
2, // Machoke
0, // Machamp
1, // Bellsprout
1, // Weepinbell
1, // Victreebel
2, // Tentacool
2, // Tentacruel
1, // Geodude
1, // Graveler
1, // Golem
0, // Ponyta
0, // Rapidash
0, // Slowpoke
0, // Slowbro
0, // Magnemite
0, // Magneton
1, // Farfetch'd
2, // Doduo
2, // Dodrio
2, // Seel
2, // Dewgong
2, // Grimer
2, // Muk
2, // Shellder
2, // Cloyster
2, // Gastly
2, // Haunter
2, // Gengar
2, // Onix
2, // Drowzee
1, // Hypno
2, // Krabby
2, // Kingler
0, // Voltorb
0, // Electrode
0, // Exeggcute
1, // Exeggutor
1, // Cubone
1, // Marowak
2, // Hitmonlee
2, // Hitmonchan
1, // Lickitung
2, // Koffing
2, // Weezing
1, // Rhyhorn
1, // Rhydon
0, // Chansey
0, // Tangela
1, // Kangaskhan
0, // Horsea
0, // Seadra
0, // Goldeen
0, // Seaking
2, // Staryu
2, // Starmie
0, // Mr. mime
1, // Scyther
2, // Jynx
1, // Electabuzz
0, // Magmar
2, // Pinsir
2, // Tauros
0, // Magikarp
0, // Gyarados
2, // Lapras
2, // Ditto
2, // Eevee
0, // Vaporeon
0, // Jolteon
0, // Flareon
0, // Porygon
0, // Omanyte
0, // Omastar
2, // Kabuto
2, // Kabutops
0, // Aerodactyl
1, // Snorlax
0, // Articuno
0, // Zapdos
0, // Moltres
0, // Dratini
0, // Dragonair
2, // Dragonite
2, // Mewtwo
0, // Mew
1, // Chikorita
1, // Bayleef
1, // Meganium
1, // Cyndaquil
1, // Quilava
1, // Typhlosion
2, // Totodile
2, // Croconaw
2, // Feraligatr
2, // Sentret
2, // Furret
2, // Hoothoot
2, // Noctowl
0, // Ledyba
0, // Ledian
1, // Spinarak
0, // Ariados
2, // Crobat
2, // Chinchou
0, // Lanturn
0, // Pichu
0, // Cleffa
1, // Igglybuff
2, // Togepi
2, // Togetic
0, // Natu
0, // Xatu
2, // Mareep
0, // Flaaffy
0, // Ampharos
1, // Bellossom
2, // Marill
2, // Azumarill
1, // Sudowoodo
1, // Politoed
1, // Hoppip
1, // Skiploom
2, // Jumpluff
2, // Aipom
1, // Sunkern
1, // Sunflora
1, // Yanma
0, // Wooper
0, // Quagsire
2, // Espeon
2, // Umbreon
2, // Murkrow
0, // Slowking
0, // Misdreavus
0, // Unown A
0, // Wobbuffet
1, // Girafarig
0, // Pineco
2, // Forretress
2, // Dunsparce
2, // Gligar
0, // Steelix
0, // Snubbull
2, // Granbull
0, // Qwilfish
0, // Scizor
1, // Shuckle
2, // Heracross
0, // Sneasel
0, // Teddiursa
2, // Ursaring
0, // Slugma
0, // Magcargo
2, // Swinub
2, // Piloswine
0, // Corsola
0, // Remoraid
0, // Octillery
0, // Delibird
2, // Mantine
0, // Skarmory
0, // Houndour
0, // Houndoom
0, // Kingdra
0, // Phanpy
0, // Donphan
0, // Porygon2
2, // Stantler
1, // Smeargle
2, // Tyrogue
2, // Hitmontop
1, // Smoochum
1, // Elekid
1, // Magby
1, // Miltank
1, // Blissey
0, // Raikou
2, // Entei
0, // Suicune
1, // Larvitar
0, // Pupitar
1, // Tyranitar
0, // Lugia
1, // Ho-Oh
1, // Celebi
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
0, // ?
1, // Treecko
0, // Grovyle
1, // Sceptile
0, // Torchic
0, // Combusken
0, // Blaziken
0, // Mudkip
0, // Marshtomp
0, // Swampert
2, // Poochyena
2, // Mightyena
2, // Zigzagoon
2, // Linoone
0, // Wurmple
2, // Silcoon
0, // Beautifly
2, // Cascoon
1, // Dustox
1, // Lotad
1, // Lombre
1, // Ludicolo
1, // Seedot
1, // Nuzleaf
0, // Shiftry
1, // Nincada
1, // Ninjask
1, // Shedinja
2, // Taillow
2, // Swellow
1, // Shroomish
1, // Breloom
1, // Spinda
0, // Wingull
0, // Pelipper
2, // Surskit
0, // Masquerain
2, // Wailmer
0, // Wailord
0, // Skitty
2, // Delcatty
1, // Kecleon
1, // Baltoy
0, // Claydol
0, // Nosepass
1, // Torkoal
2, // Sableye
0, // Barboach
0, // Whiscash
0, // Luvdisc
0, // Corphish
0, // Crawdaunt
2, // Feebas
0, // Milotic
0, // Carvanha
0, // Sharpedo
1, // Trapinch
1, // Vibrava
1, // Flygon
2, // Makuhita
1, // Hariyama
1, // Electrike
0, // Manectric
1, // Numel
0, // Camerupt
2, // Spheal
2, // Sealeo
0, // Walrein
1, // Cacnea
1, // Cacturne
2, // Snorunt
0, // Glalie
1, // Lunatone
0, // Solrock
2, // Azurill
0, // Spoink
2, // Grumpig
0, // Plusle
0, // Minun
2, // Mawile
0, // Meditite
0, // Medicham
0, // Swablu
0, // Altaria
0, // Wynaut
0, // Duskull
0, // Dusclops
0, // Roselia
2, // Slakoth
2, // Vigoroth
1, // Slaking
1, // Gulpin
2, // Swalot
1, // Tropius
0, // Whismur
2, // Loudred
2, // Exploud
0, // Clamperl
0, // Huntail
0, // Gorebyss
0, // Absol
0, // Shuppet
0, // Banette
2, // Seviper
0, // Zangoose
1, // Relicanth
2, // Aron
2, // Lairon
2, // Aggron
0, // Castform
0, // Volbeat
2, // Illumise
2, // Lileep
0, // Cradily
0, // Anorith
0, // Armaldo
1, // Ralts
1, // Kirlia
1, // Gardevoir
2, // Bagon
2, // Shelgon
0, // Salamence
0, // Beldum
0, // Metang
0, // Metagross
2, // Regirock
2, // Regice
2, // Registeel
2, // Kyogre
0, // Groudon
1, // Rayquaza
0, // Latias
2, // Latios
0, // Jirachi
0, // Deoxys
0, // Chimecho
1, // Egg
0, // Unown B
0, // Unown C
0, // Unown D
0, // Unown E
0, // Unown F
0, // Unown G
0, // Unown H
0, // Unown I
0, // Unown J
0, // Unown K
0, // Unown L
0, // Unown M
0, // Unown N
0, // Unown O
0, // Unown P
0, // Unown Q
0, // Unown R
0, // Unown S
0, // Unown T
0, // Unown U
0, // Unown V
0, // Unown W
0, // Unown X
0, // Unown Y
0, // Unown Z
0, // Unown Exclamation Mark
0, // Unown Question Mark
};
const struct SpritePalette gMonIconPaletteTable[] =
{
{ gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 },
{ gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 },
{ gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 },
// There are only 3 actual palettes. The following are unused
// and don't point to valid data.
{ gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 },
{ gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 },
{ gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 },
};
static const struct OamData sMonIconOamData =
{
.size = 2,
.priority = 1,
};
// fastest to slowest
static const union AnimCmd sAnim_0[] =
{
ANIMCMD_FRAME(0, 6),
ANIMCMD_FRAME(1, 6),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sAnim_1[] =
{
ANIMCMD_FRAME(0, 8),
ANIMCMD_FRAME(1, 8),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sAnim_2[] =
{
ANIMCMD_FRAME(0, 14),
ANIMCMD_FRAME(1, 14),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sAnim_3[] =
{
ANIMCMD_FRAME(0, 22),
ANIMCMD_FRAME(1, 22),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sAnim_4[] =
{
ANIMCMD_FRAME(0, 29),
ANIMCMD_FRAME(0, 29), // frame 0 is repeated
ANIMCMD_JUMP(0),
};
static const union AnimCmd *const sMonIconAnims[] =
{
sAnim_0,
sAnim_1,
sAnim_2,
sAnim_3,
sAnim_4,
};
static const union AffineAnimCmd sAffineAnim_0[] =
{
AFFINEANIMCMD_FRAME(0, 0, 0, 10),
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd sAffineAnim_1[] =
{
AFFINEANIMCMD_FRAME(-2, -2, 0, 122),
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd *const sMonIconAffineAnims[] =
{
sAffineAnim_0,
sAffineAnim_1,
};
const u16 sSpriteImageSizes[3][4] =
{
// square
{
0x20, // 1×1
0x80, // 2×2
0x200, // 4×4
0x800, // 8×8
},
// horizontal rectangle
{
0x40, // 2×1
0x80, // 4×1
0x100, // 4×2
0x400, // 8×4
},
// vertical rectangle
{
0x40, // 1×2
0x80, // 1×4
0x100, // 2×4
0x400, // 4×8
},
};
u16 GetUnownLetterByPersonality(u32);
const u8 *GetMonIconPtr(u16, u32 personality);
u8 UpdateMonIconFrame(struct Sprite *);
u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8);
void sub_809D7E8(struct Sprite *);
// duplicate of sub_809D3A4
u8 unref_sub_809D26C(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority)
{
u8 spriteId;
struct MonIconSpriteTemplate iconTemplate;
struct MonIconSpriteTemplate *iconTemplatePtr = &iconTemplate; // needed to match
iconTemplatePtr->oam = &sMonIconOamData;
iconTemplatePtr->image = gMonIconTable[species];
iconTemplatePtr->anims = sMonIconAnims;
iconTemplatePtr->affineAnims = sMonIconAffineAnims;
iconTemplatePtr->callback = callback;
iconTemplatePtr->paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species];
spriteId = CreateMonIconSprite(iconTemplatePtr, x, y, subpriority);
UpdateMonIconFrame(&gSprites[spriteId]);
return spriteId;
}
u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality)
{
u8 spriteId;
struct MonIconSpriteTemplate iconTemplate =
{
.oam = &sMonIconOamData,
.image = GetMonIconPtr(species, personality),
.anims = sMonIconAnims,
.affineAnims = sMonIconAffineAnims,
.callback = callback,
.paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species],
};
if (species > SPECIES_EGG)
iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG;
spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority);
UpdateMonIconFrame(&gSprites[spriteId]);
return spriteId;
}
u8 sub_809D3A4(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority)
{
u8 spriteId;
struct MonIconSpriteTemplate iconTemplate;
struct MonIconSpriteTemplate *iconTemplatePtr = &iconTemplate; // needed to match
iconTemplatePtr->oam = &sMonIconOamData;
iconTemplatePtr->image = gMonIconTable[species];
iconTemplatePtr->anims = sMonIconAnims;
iconTemplatePtr->affineAnims = sMonIconAffineAnims;
iconTemplatePtr->callback = callback;
iconTemplatePtr->paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species];
spriteId = CreateMonIconSprite(iconTemplatePtr, x, y, subpriority);
UpdateMonIconFrame(&gSprites[spriteId]);
return spriteId;
}
u16 mon_icon_convert_unown_species_id(u16 species, u32 personality)
{
u16 result;
if (species == SPECIES_UNOWN)
{
u16 letter = GetUnownLetterByPersonality(personality);
if (letter == 0)
letter = SPECIES_UNOWN;
else
letter += (SPECIES_UNOWN_B - 1);
result = letter;
}
else
{
if (species > SPECIES_EGG)
result = 260;
else
result = species;
}
return result;
}
u16 GetUnownLetterByPersonality(u32 personality)
{
return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C;
}
u16 sub_809D4A8(u16 species)
{
u16 value;
if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN)
{
if (value == 0)
value += SPECIES_UNOWN;
else
value += (SPECIES_UNOWN_B - 1);
return value;
}
else
{
return mon_icon_convert_unown_species_id(species, 0);
}
}
const u8 *GetMonIconPtr(u16 species, u32 personality)
{
u16 convertedSpecies = mon_icon_convert_unown_species_id(species, personality);
return gMonIconTable[convertedSpecies];
}
void sub_809D510(struct Sprite *sprite)
{
sub_809D7E8(sprite);
}
void sub_809D51C(void)
{
u8 i;
for (i = 0; i < 6; i++)
LoadSpritePalette(&gMonIconPaletteTable[i]);
}
// unused
void SafeLoadMonIconPalette(u16 species)
{
u8 palIndex;
if (species > SPECIES_EGG)
species = 260;
palIndex = gMonIconPaletteIndices[species];
if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)
LoadSpritePalette(&gMonIconPaletteTable[palIndex]);
}
void sub_809D580(u16 species)
{
u8 palIndex = gMonIconPaletteIndices[species];
if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)
LoadSpritePalette(&gMonIconPaletteTable[palIndex]);
}
// unused
void FreeMonIconPalettes(void)
{
u8 i;
for (i = 0; i < 6; i++)
FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag);
}
// unused
void SafeFreeMonIconPalette(u16 species)
{
u8 palIndex;
if (species > SPECIES_EGG)
species = 260;
palIndex = gMonIconPaletteIndices[species];
FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);
}
void sub_809D608(u16 species)
{
u8 palIndex;
palIndex = gMonIconPaletteIndices[species];
FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);
}
void sub_809D62C(struct Sprite *sprite)
{
UpdateMonIconFrame(sprite);
}
// TODO: try to find a way to avoid using goto and asm statement
u8 UpdateMonIconFrame(struct Sprite *sprite)
{
u8 result = 0;
if (sprite->animDelayCounter == 0)
{
s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue;
if (frame != -2)
{
if (frame != -1)
goto copy;
goto end;
}
sprite->animCmdIndex = 0;
goto end;
copy:
RequestSpriteCopy(
(u8 *)sprite->images + sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame,
(u8 *)OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP,
sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]);
{
register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration;
sprite->animDelayCounter = duration;
}
sprite->animCmdIndex++;
result = sprite->animCmdIndex;
}
else
{
sprite->animDelayCounter--;
}
end:
return result;
}
u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority)
{
u8 spriteId;
struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] };
struct SpriteTemplate spriteTemplate =
{
.tileTag = 0xFFFF,
.paletteTag = iconTemplate->paletteTag,
.oam = iconTemplate->oam,
.anims = iconTemplate->anims,
.images = &image,
.affineAnims = iconTemplate->affineAnims,
.callback = iconTemplate->callback,
};
spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);
gSprites[spriteId].animPaused = TRUE;
gSprites[spriteId].animBeginning = FALSE;
gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image;
return spriteId;
}
void sub_809D7E8(struct Sprite *sprite)
{
struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] };
sprite->images = &image;
DestroySprite(sprite);
}
void sub_809D824(struct Sprite *sprite, u8 animNum)
{
sprite->animNum = animNum;
sprite->animDelayCounter = 0;
sprite->animCmdIndex = 0;
}