diff options
Diffstat (limited to 'src/trainer_pokemon_sprites.c')
-rw-r--r-- | src/trainer_pokemon_sprites.c | 413 |
1 files changed, 413 insertions, 0 deletions
diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c new file mode 100644 index 000000000..085e66214 --- /dev/null +++ b/src/trainer_pokemon_sprites.c @@ -0,0 +1,413 @@ +#include "global.h" +#include "sprite.h" +#include "window.h" +#include "malloc.h" +#include "constants/species.h" +#include "palette.h" +#include "decompress.h" +#include "trainer_pokemon_sprites.h" +#include "data2.h" +#include "pokemon.h" +#include "constants/trainers.h" + +extern const struct CompressedSpriteSheet gMonFrontPicTable[NUM_SPECIES]; +extern const struct CompressedSpriteSheet gMonBackPicTable[NUM_SPECIES]; +extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; +extern const struct CompressedSpriteSheet gTrainerBackPicTable[]; +extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; +extern const union AffineAnimCmd *const gUnknown_082FF618[]; +extern const union AffineAnimCmd *const gUnknown_082FF694[]; +extern const union AnimCmd *const gPlayerMonSpriteAnimsTable[]; +extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[NUM_SPECIES]; +extern const union AnimCmd *const *const gUnknown_0830536C[]; + +// Static type declarations + +struct PicData +{ + u8 *frames; + struct SpriteFrameImage *images; + u16 paletteTag; + u8 spriteId; + u8 active; +}; + +// Static RAM declarations +#define PICS_COUNT 8 + +static EWRAM_DATA struct SpriteTemplate sCreatingSpriteTemplate = {}; +static EWRAM_DATA struct PicData sSpritePics[PICS_COUNT] = {}; + +// Static ROM declarations + +// .rodata + +static const struct PicData sDummyPicData = {}; +static const struct OamData gUnknown_0860B064 = +{ + .size = 3 +}; +static const struct OamData gUnknown_0860B06C = +{ + .affineMode = 1, .size = 3 +}; + +// .text + +static void DummyPicSpriteCallback(struct Sprite *sprite) +{ + +} + +bool16 ResetAllPicSprites(void) +{ + int i; + + for (i = 0; i < PICS_COUNT; i ++) + sSpritePics[i] = sDummyPicData; + + return FALSE; +} + +static bool16 DecompressPic(u16 species, u32 personality, bool8 isFrontPic, u8 *dest, bool8 isTrainer, bool8 ignoreDeoxys) +{ + if (!isTrainer) + { + if (isFrontPic) + { + if (!ignoreDeoxys) + LoadSpecialPokePic(&gMonFrontPicTable[species], dest, species, personality, isFrontPic); + else + LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], dest, species, personality, isFrontPic); + } + else + { + if (!ignoreDeoxys) + LoadSpecialPokePic(&gMonBackPicTable[species], dest, species, personality, isFrontPic); + else + LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], dest, species, personality, isFrontPic); + } + } + else + { + if (isFrontPic) + DecompressPicFromTable(&gTrainerFrontPicTable[species], dest, species); + else + DecompressPicFromTable(&gTrainerBackPicTable[species], dest, species); + } + return FALSE; +} + +static bool16 DecompressPic_HandleDeoxys(u16 species, u32 personality, bool8 isFrontPic, u8 *dest, bool8 isTrainer) +{ + return DecompressPic(species, personality, isFrontPic, dest, isTrainer, FALSE); +} + +static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 paletteSlot, u16 paletteTag, bool8 isTrainer) +{ + if (!isTrainer) + { + if (paletteTag == 0xFFFF) + { + sCreatingSpriteTemplate.paletteTag |= 0xFFFF; + LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20); + } + else + { + sCreatingSpriteTemplate.paletteTag = paletteTag; + LoadCompressedObjectPalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality)); + } + } + else + { + if (paletteTag == 0xFFFF) + { + sCreatingSpriteTemplate.paletteTag |= 0xFFFF; + LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, 0x100 + paletteSlot * 0x10, 0x20); + } + else + { + sCreatingSpriteTemplate.paletteTag = paletteTag; + LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[species]); + } + } +} + +static void LoadPicPaletteBySlot(u16 species, u32 otId, u32 personality, u8 paletteSlot, bool8 isTrainer) +{ + if (!isTrainer) + LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), paletteSlot * 0x10, 0x20); + else + LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, paletteSlot * 0x10, 0x20); +} + +static void AssignSpriteAnimsTable(bool8 isTrainer) +{ + if (!isTrainer) + sCreatingSpriteTemplate.anims = gPlayerMonSpriteAnimsTable; + else + sCreatingSpriteTemplate.anims = gUnknown_0830536C[0]; +} + +static u16 CreatePicSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer, bool8 ignoreDeoxys) +{ + u8 i; + u8 *framePics; + struct SpriteFrameImage *images; + int j; + u8 spriteId; + + for (i = 0; i < PICS_COUNT; i ++) + { + if (!sSpritePics[i].active) + { + break; + } + } + if (i == PICS_COUNT) + { + return 0xFFFF; + } + framePics = Alloc(4 * 0x800); + if (!framePics) + { + return 0xFFFF; + } + images = Alloc(4 * sizeof(struct SpriteFrameImage)); + if (!images) + { + Free(framePics); + return 0xFFFF; + } + if (DecompressPic(species, personality, isFrontPic, framePics, isTrainer, ignoreDeoxys)) + { + // debug trap? + return 0xFFFF; + } + for (j = 0; j < 4; j ++) + { + images[j].data = framePics + 0x800 * j; + images[j].size = 0x800; + } + sCreatingSpriteTemplate.tileTag = 0xFFFF; + sCreatingSpriteTemplate.oam = &gUnknown_0860B064; + AssignSpriteAnimsTable(isTrainer); + sCreatingSpriteTemplate.images = images; + sCreatingSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sCreatingSpriteTemplate.callback = DummyPicSpriteCallback; + LoadPicPaletteByTagOrSlot(species, otId, personality, paletteSlot, paletteTag, isTrainer); + spriteId = CreateSprite(&sCreatingSpriteTemplate, x, y, 0); + if (paletteTag == 0xFFFF) + { + gSprites[spriteId].oam.paletteNum = paletteSlot; + } + sSpritePics[i].frames = framePics; + sSpritePics[i].images = images; + sSpritePics[i].paletteTag = paletteTag; + sSpritePics[i].spriteId = spriteId; + sSpritePics[i].active = TRUE; + return spriteId; +} + +static u16 CreatePicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 isTrainer) +{ + return CreatePicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, isTrainer, FALSE); +} + +u16 CreatePicSprite2(u16 species, u32 otId, u32 personality, u8 flags, s16 x, s16 y, u8 paletteSlot, u16 paletteTag) +{ + u8 *framePics; + struct SpriteFrameImage *images; + int j; + u8 i; + u8 spriteId; + u8 flags2; + + for (i = 0; i < PICS_COUNT; i ++) + { + if (!sSpritePics[i].active) + { + break; + } + } + if (i == PICS_COUNT) + { + return 0xFFFF; + } + framePics = Alloc(4 * 0x800); + if (!framePics) + { + return 0xFFFF; + } + if (flags & 0x80) + { + flags &= 0x7F; + flags2 = 3; + } + else + { + flags2 = flags; + } + images = Alloc(4 * sizeof(struct SpriteFrameImage)); + if (!images) + { + Free(framePics); + return 0xFFFF; + } + if (DecompressPic(species, personality, flags, framePics, FALSE, FALSE)) + { + // debug trap? + return 0xFFFF; + } + for (j = 0; j < 4; j ++) + { + images[j].data = framePics + 0x800 * j; + images[j].size = 0x800; + } + sCreatingSpriteTemplate.tileTag = 0xFFFF; + sCreatingSpriteTemplate.anims = gMonAnimationsSpriteAnimsPtrTable[species]; + sCreatingSpriteTemplate.images = images; + if (flags2 == 0x01) + { + sCreatingSpriteTemplate.affineAnims = gUnknown_082FF694; + sCreatingSpriteTemplate.oam = &gUnknown_0860B06C; + } + else if (flags2 == 0x00) + { + sCreatingSpriteTemplate.affineAnims = gUnknown_082FF618; + sCreatingSpriteTemplate.oam = &gUnknown_0860B06C; + } + else + { + sCreatingSpriteTemplate.oam = &gUnknown_0860B064; + sCreatingSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + } + sCreatingSpriteTemplate.callback = DummyPicSpriteCallback; + LoadPicPaletteByTagOrSlot(species, otId, personality, paletteSlot, paletteTag, FALSE); + spriteId = CreateSprite(&sCreatingSpriteTemplate, x, y, 0); + if (paletteTag == 0xFFFF) + { + gSprites[spriteId].oam.paletteNum = paletteSlot; + } + sSpritePics[i].frames = framePics; + sSpritePics[i].images = images; + sSpritePics[i].paletteTag = paletteTag; + sSpritePics[i].spriteId = spriteId; + sSpritePics[i].active = TRUE; + return spriteId; +} + +static u16 FreeAndDestroyPicSpriteInternal(u16 spriteId) +{ + u8 i; + u8 *framePics; + struct SpriteFrameImage *images; + + for (i = 0; i < PICS_COUNT; i ++) + { + if (sSpritePics[i].spriteId == spriteId) + { + break; + } + } + if (i == PICS_COUNT) + { + return 0xFFFF; + } + framePics = sSpritePics[i].frames; + images = sSpritePics[i].images; + if (sSpritePics[i].paletteTag != 0xFFFF) + { + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum)); + } + DestroySprite(&gSprites[spriteId]); + Free(framePics); + Free(images); + sSpritePics[i] = sDummyPicData; + return 0; +} + +static u16 sub_818D65C(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId, bool8 isTrainer) +{ + if (DecompressPic_HandleDeoxys(species, personality, isFrontPic, (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA), FALSE)) + { + return 0xFFFF; + } + LoadPicPaletteBySlot(species, otId, personality, paletteSlot, isTrainer); + return 0; +} + +static u16 sub_818D6CC(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId, bool8 isTrainer) +{ + u8 *framePics; + + framePics = Alloc(4 * 0x800); + if (framePics && !DecompressPic_HandleDeoxys(species, personality, isFrontPic, framePics, isTrainer)) + { + BlitBitmapRectToWindow(windowId, framePics, 0, 0, 0x40, 0x40, destX, destY, 0x40, 0x40); + LoadPicPaletteBySlot(species, otId, personality, paletteSlot, isTrainer); + Free(framePics); + return 0; + } + return 0xFFFF; +} + +static u16 CreateMonPicSprite(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag, bool8 ignoreDeoxys) +{ + return CreatePicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, FALSE, ignoreDeoxys); +} + +u16 CreateMonPicSprite_HandleDeoxys(u16 species, u32 otId, u32 personality, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag) +{ + return CreateMonPicSprite(species, otId, personality, isFrontPic, x, y, paletteSlot, paletteTag, FALSE); +} + +u16 FreeAndDestroyMonPicSprite(u16 spriteId) +{ + return FreeAndDestroyPicSpriteInternal(spriteId); +} + +u16 sub_818D834(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u8 paletteSlot, u8 windowId) +{ + return sub_818D65C(species, otId, personality, isFrontPic, paletteSlot, windowId, FALSE); +} + +u16 sub_818D864(u16 species, u32 otId, u32 personality, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId) +{ + return sub_818D6CC(species, otId, personality, isFrontPic, destX, destY, paletteSlot, windowId, FALSE); +} + +u16 CreateTrainerPicSprite(u16 species, bool8 isFrontPic, s16 x, s16 y, u8 paletteSlot, u16 paletteTag) +{ + return CreatePicSprite_HandleDeoxys(species, 0, 0, isFrontPic, x, y, paletteSlot, paletteTag, TRUE); +} + +u16 FreeAndDestroyTrainerPicSprite(u16 spriteId) +{ + return FreeAndDestroyPicSpriteInternal(spriteId); +} + +u16 sub_818D904(u16 species, bool8 isFrontPic, u8 paletteSlot, u8 windowId) +{ + return sub_818D65C(species, 0, 0, isFrontPic, paletteSlot, windowId, TRUE); +} + +u16 sub_818D938(u16 species, bool8 isFrontPic, u16 destX, u16 destY, u8 paletteSlot, u8 windowId) +{ + return sub_818D6CC(species, 0, 0, isFrontPic, destX, destY, paletteSlot, windowId, TRUE); +} + +u16 PlayerGenderToFrontTrainerPicId_Debug(u8 gender, bool8 getClass) +{ + if (getClass == TRUE) + { + switch (gender) + { + default: + return gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_MAY]; + case MALE: + return gFacilityClassToPicIndex[FACILITY_CLASS_PKMN_TRAINER_BRENDAN]; + } + } + return gender; +} |