pokefirered/src/decompress.c
2024-06-16 15:09:00 +02:00

162 lines
4.2 KiB
C

#include "global.h"
#include "gflib.h"
#include "decompress.h"
#include "pokemon.h"
void LZDecompressWram(const void *src, void *dest)
{
LZ77UnCompWram(src, dest);
}
void LZDecompressVram(const void *src, void *dest)
{
LZ77UnCompVram(src, dest);
}
u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src)
{
struct SpriteSheet dest;
LZ77UnCompWram(src->data, gDecompressionBuffer);
dest.data = gDecompressionBuffer;
dest.size = src->size;
dest.tag = src->tag;
return LoadSpriteSheet(&dest);
}
void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer)
{
struct SpriteSheet dest;
LZ77UnCompWram(src->data, buffer);
dest.data = buffer;
dest.size = src->size;
dest.tag = src->tag;
LoadSpriteSheet(&dest);
}
void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src)
{
struct SpritePalette dest;
LZ77UnCompWram(src->data, gDecompressionBuffer);
dest.data = (void *) gDecompressionBuffer;
dest.tag = src->tag;
LoadSpritePalette(&dest);
}
void LoadCompressedSpritePaletteWithTag(const u32 *pal, u16 tag)
{
struct SpritePalette dest;
LZ77UnCompWram(pal, gDecompressionBuffer);
dest.data = (void *) gDecompressionBuffer;
dest.tag = tag;
LoadSpritePalette(&dest);
}
void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer)
{
struct SpritePalette dest;
LZ77UnCompWram(a->data, buffer);
dest.data = buffer;
dest.tag = a->tag;
LoadSpritePalette(&dest);
}
void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void *buffer)
{
LZ77UnCompWram(src->data, buffer);
}
void HandleLoadSpecialPokePic(bool32 isFrontPic, void *dest, s32 species, u32 personality)
{
LoadSpecialPokePic(dest, species, personality, isFrontPic);
}
void LoadSpecialPokePic(void *dest, s32 species, u32 personality, bool8 isFrontPic)
{
species = SanitizeSpeciesId(species);
if (species == SPECIES_UNOWN)
species = GetUnownSpeciesId(personality);
if (isFrontPic) {
if (gSpeciesInfo[species].frontPicFemale != NULL && IsPersonalityFemale(species, personality))
LZ77UnCompWram(gSpeciesInfo[species].frontPicFemale, dest);
else if (gSpeciesInfo[species].frontPic != NULL)
LZ77UnCompWram(gSpeciesInfo[species].frontPic, dest);
else
LZ77UnCompWram(gSpeciesInfo[SPECIES_NONE].frontPic, dest);
} else {
if (gSpeciesInfo[species].backPicFemale != NULL && IsPersonalityFemale(species, personality))
LZ77UnCompWram(gSpeciesInfo[species].backPicFemale, dest);
else if (gSpeciesInfo[species].backPic != NULL)
LZ77UnCompWram(gSpeciesInfo[species].backPic, dest);
else
LZ77UnCompWram(gSpeciesInfo[SPECIES_NONE].backPic, dest);
}
DrawSpindaSpots(species, personality, dest, isFrontPic);
}
bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src)
{
struct SpriteSheet dest;
void *buffer;
buffer = AllocZeroed(*((u32 *)src->data) >> 8);
if (!buffer)
return TRUE;
LZ77UnCompWram(src->data, buffer);
dest.data = buffer;
dest.size = src->size;
dest.tag = src->tag;
LoadSpriteSheet(&dest);
Free(buffer);
return FALSE;
}
bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src)
{
struct SpritePalette dest;
void *buffer;
buffer = AllocZeroed(*((u32 *)src->data) >> 8);
if (!buffer)
return TRUE;
LZ77UnCompWram(src->data, buffer);
dest.data = buffer;
dest.tag = src->tag;
LoadSpritePalette(&dest);
Free(buffer);
return FALSE;
}
bool8 LoadCompressedSpritePaletteUsingHeapWithTag(const u32 *pal, u16 tag)
{
struct SpritePalette dest;
void *buffer;
buffer = AllocZeroed(*((u32 *)pal) >> 8);
if (!buffer)
return TRUE;
LZ77UnCompWram(pal, buffer);
dest.data = buffer;
dest.tag = tag;
LoadSpritePalette(&dest);
Free(buffer);
return FALSE;
}
u32 GetDecompressedDataSize(const u8 *ptr)
{
u32 ptr32[1];
u8 *ptr8 = (u8 *)ptr32;
ptr8[0] = ptr[1];
ptr8[1] = ptr[2];
ptr8[2] = ptr[3];
ptr8[3] = 0;
return ptr32[0];
}