#include "global.h" #include "sprite.h" #include "mail.h" #include "graphics.h" #include "constants/species.h" #include "palette.h" #include "pokemon_icon.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; }; // static functions static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); // .rodata 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 }, }; const struct OamData sMonIconOamData = { .y = 0, .affineMode = 0, .objMode = 0, .mosaic = 0, .bpp = 0, .shape = 0, .x = 0, .matrixNum = 0, .size = 2, .tileNum = 0, .priority = 1, .paletteNum = 0, .affineParam = 0 }; // 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), }; 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, }; 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 }, }; u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool32 extra) { u8 spriteId; struct MonIconSpriteTemplate iconTemplate = { .oam = &sMonIconOamData, .image = GetMonIconPtr(species, personality, extra), .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_80D2D78(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, bool32 extra) { u8 spriteId; struct MonIconSpriteTemplate iconTemplate = { .oam = &sMonIconOamData, .image = NULL, .anims = sMonIconAnims, .affineAnims = sMonIconAffineAnims, .callback = callback, .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], }; iconTemplate.image = GetMonIconTiles(species, extra); spriteId = CreateMonIconSprite(&iconTemplate, 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) { if (!personality) return 0; return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; } u16 sub_80D2E84(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 { if(species > (SPECIES_UNOWN_B - 1)) species = 260; return mon_icon_convert_unown_species_id(species, 0); } } const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 extra) { return GetMonIconTiles(mon_icon_convert_unown_species_id(species, personality), extra); } void sub_80D2EF8(struct Sprite *sprite) { sub_80D328C(sprite); } void LoadMonIconPalettes(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 LoadMonIconPalette(u16 species) { u8 palIndex = gMonIconPaletteIndices[species]; if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) LoadSpritePalette(&gMonIconPaletteTable[palIndex]); } 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 FreeMonIconPalette(u16 species) { u8 palIndex; palIndex = gMonIconPaletteIndices[species]; FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); } void sub_80D3014(struct Sprite *sprite) { UpdateMonIconFrame(sprite); } const u8* GetMonIconTiles(u16 species, bool32 extra) { const u8* iconSprite = gMonIconTable[species]; if(species == SPECIES_DEOXYS && extra == TRUE) { iconSprite = (const u8*)(0x400 + (u32)iconSprite); //WTF? } return iconSprite; } void sub_80D304C(u16 offset) { s32 i; const struct SpritePalette* monIconPalettePtr; if(offset <= 0xA0) { monIconPalettePtr = gMonIconPaletteTable; for(i = 5; i >= 0 ; i--) { LoadPalette(monIconPalettePtr->data, offset, 0x20); offset += 0x10; monIconPalettePtr++; } } } u8 sub_80D3080(u16 species) { if (species > SPECIES_EGG) species = 260; return gMonIconPaletteIndices[species]; } u8 sub_80D30A0(u16 species) { return gMonIconPaletteIndices[species]; } const u16* GetValidMonIconPalettePtr(u16 species) { if (species > SPECIES_EGG) species = 260; return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data; } // TODO: try to find a way to avoid using asm statement u8 UpdateMonIconFrame(struct Sprite *sprite) { u8 result = 0; if (sprite->animDelayCounter == 0) { s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; switch (frame) { case -1: break; case -2: sprite->animCmdIndex = 0; break; default: RequestSpriteCopy( // pointer arithmetic is needed to get the correct pointer to perform the sprite copy on. // because sprite->images is a struct def, it has to be casted to (u8 *) before any // arithmetic can be performed. (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; break; } } else { sprite->animDelayCounter--; } return result; } static 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_80D328C(struct Sprite *sprite) { struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] }; sprite->images = ℑ DestroySprite(sprite); } void sub_80D32C8(struct Sprite *sprite, u8 animNum) { sprite->animNum = animNum; sprite->animDelayCounter = 0; sprite->animCmdIndex = 0; }