4adc2dcb16
* Added SpeciesInfo fields # Conflicts: # include/pokemon.h * Added missing comments * Renamed gigantamax to isGigantamax * Converted species flags to agbcc bit flags * Added padding after flags * Pikachu form config * Dex text * Reordered Paradox flag * Missing Pikachu ifdef comments * Moved P_GEN_x_POKEMON settings to the species_families file * Gen 1 Dex entries * Renamed file to species_enabled.h * Prevent Pokémon from evolving if their evolution is disabled * Prevent Pokémon from being affected by Eviolite if their evolution is disabled * Prevent Pokémon offspring if they're disabled * Corrected imprementation of evolution prevention It could potentially overwrite items by accident * Cross-evo configs * Gen 2 dex entries * Changed cry table to use assignable IDs # Conflicts: # include/pokemon.h * Form table pointers * Beginning support for moving data to gSpeciesInfo * Pokédexes reads text from gSpeciesInfo * Reading species names from gSpeciesInfo * Fixed erroneous copy-paste * Moved Bulbasaur to Raichu Family data do gSpeciesinfo * Added female pic sizes * Macros for Front, Back, Palette and Learnsets * Sandshrew to Dugtrio Families * Obtains Height/Weight from gSpeciesInfo * Read category from gSpeciesInfo * Removed unused data from pokedex_entries.h * Moved Gen 1 data to gSpeciesInfo * Moved Gen 2 data to gSpeciesInfo + fixed Ursaluna Bloodmoon not producing Teddiursa eggs * Moved Gen 3 data to gSpeciesInfo * Moved Gen 4 data to gSpeciesInfo * HGSS dex properly shows form sprites * Fixed data type for GetSpeciesHeight/Weight * Reading Pokédex Size data from gSpeciesInfo * Cleaned up mon graphic decompression function * Reading Front Pics gSpeciesInfo * Reading Back Pics gSpeciesInfo * Updated uses of GetMonSpritePalStruct to allow loading the data directly instead of reading the struct * Reading palettes from gSpeciesInfo * Reading animation delay from gSpeciesInfo * Fixed Pokémon Debug Menu not reading animation delay * Reading front anim Id from gSpeciesInfo * Reading back anim Id from gSpeciesInfo * Reading Animation Frames from gSpeciesInfo * Reading Icon Sprites from gSpeciesInfo * Reading Icon Palette IDs from gSpeciesInfo * Reading Footprints from gSpeciesInfo * Reading Mon Pic sizes from gSpeciesInfo * Separate mon pic sizes for female mon * Reading Level Up Learnsets from gSpeciesInfo * Reading Teachable Learnsets from gSpeciesInfo * Reading National Dex Number from gSpeciesInfo * Reading Enemy Mon Elevation from gSpeciesInfo * Reading Evolutions from gSpeciesInfo * Reading form table from gSpeciesInfo * Fixed button label inconsistency in pokémon debug menu * Reading form change table from gSpeciesInfo * Removed need to define mon graphics in include/graphics.h * Reordered mon graphics by family * Fixed National dex number offset * gFrontierBannedSpecies now checks IsSpeciesEnabled * Added 3 more toggles for Fusions, Primal Reversions and Ultra Burst * Gen 3 & 4 family toggles for dex entries * Fixed missing Mr. Rime data * Gen 1 dex descriptions as compound strings * Gen 2 dex descriptions as compound strings * Gen 3 dex descriptions as compound strings * Gen 4 dex descriptions as compound strings * Fixed compile in agbcc * Moved Gen 5 data to gSpeciesInfo * Using PLACEHOLDER_ANIM_SINGLE_FRAME when needed (same hash) * Renamed PLACEHOLDER_TWO_FRAME_ANIMATION to PLACEHOLDER_ANIM_TWO_FRAMES * Fixed capitalization for front pic anims * Fixed `CanEvolve` * Moved Gen 6 data to gSpeciesInfo * Gen 7 without macros * Gen 8 without macros * Gen 9 without macros * Fixed Gen 9 sound data * Finished moving Gen 7 data in macros (by Alex) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * Ultra Necrozma is now included in the fusion forms define * Cries are now properly excluded from the rom when disabling species * Removed P_GEN_x_POKEMON from form_change_tables.h * Fixed Yanmega's cry ignoring the P_GEN_4_CROSS_EVOS setting * Added P_NEW_EVOS_IN_REGIONAL_DEX setting * Automatic ASSUMPTION_FAIL when used species are disabled * Finished moving Gen 8 data in macros (by Alex) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> * Expanded Alcremie macro * Finished moving Gen 9 data in macros (by Alex) * Fixed missing data for Komala and Marshadow * Form species id tables use family toggles + added missing Ursaluna form species id table * Fixed Genesect palettes * Fixed Flabébé family graphics * Fixed Minior Graphics * Fixed missing Calyrex data * Family toggles in mon graphcis (By Jasper/Bassoonian) Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Fixed missing Ogerpon data * Ordered Level Up Learnsets (missing toggles) Also added White Basculin learnset * Added more Minior synonyms * Fixed enamorus order * Reordered teachable learnsets * Removed sSpeciesXXX level up learnsets + reordered * Removed unneeded assumes * Removed unused extra animations * Family toggles in mon level up learnsets (By Jasper/Bassoonian) Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Fixed Phione graphics inclusion * Family toggles for Teachable Learnsets Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Ordered Front Pic Anims * Family toggles for front pic animations Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Fixed HGSS dex incorrectly showing the wrong mon when catching it * Family toggles for Egg Moves + reodered Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> * Fixed HGSS not checking for null footprints * Review changes * Fixed Female difference mon not using their macros * Fixed Alcremie Macro * Fixed compile error when disabling the Bulbasaur family * Fixed Turtwig and Chimchar family + Houndour and Mareep cries not being excluded properly * Re-added missing Egg graphical data * Fixed crash during the Birch Intro when Lotad is disabled * Renamed PALLETE to PALETTES * Removed extra spacing for YOffsets * Fixed compile when only disabling cross-gen evolutions * Added Tera Forms define (Ogerpon and Terapagos) * Fixed Necrozma macro * Removed .noFlip = FALSE * Fixed dex number in summary screen for forms when nat dex is disabled * Fixed Paldean form paths --------- Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
300 lines
9.2 KiB
C
300 lines
9.2 KiB
C
#include "global.h"
|
|
#include "malloc.h"
|
|
#include "data.h"
|
|
#include "decompress.h"
|
|
#include "pokemon.h"
|
|
#include "pokemon_debug.h"
|
|
#include "text.h"
|
|
|
|
EWRAM_DATA ALIGNED(4) u8 gDecompressionBuffer[0x4000] = {0};
|
|
|
|
void LZDecompressWram(const u32 *src, void *dest)
|
|
{
|
|
LZ77UnCompWram(src, dest);
|
|
}
|
|
|
|
void LZDecompressVram(const u32 *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 *src, void *buffer)
|
|
{
|
|
struct SpritePalette dest;
|
|
|
|
LZ77UnCompWram(src->data, buffer);
|
|
dest.data = buffer;
|
|
dest.tag = src->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);
|
|
}
|
|
|
|
if (species == SPECIES_SPINDA && isFrontPic)
|
|
{
|
|
DrawSpindaSpots(personality, dest, FALSE);
|
|
DrawSpindaSpots(personality, dest, TRUE);
|
|
}
|
|
}
|
|
|
|
void Unused_LZDecompressWramIndirect(const void **src, void *dest)
|
|
{
|
|
LZ77UnCompWram(*src, dest);
|
|
}
|
|
|
|
static void UNUSED StitchObjectsOn8x8Canvas(s32 object_size, s32 object_count, u8 *src_tiles, u8 *dest_tiles)
|
|
{
|
|
/*
|
|
This function appears to emulate behaviour found in the GB(C) versions regarding how the Pokemon images
|
|
are stitched together to be displayed on the battle screen.
|
|
Given "compacted" tiles, an object count and a bounding box/object size, place the tiles in such a way
|
|
that the result will have each object centered in a 8x8 tile canvas.
|
|
*/
|
|
s32 i, j, k, l;
|
|
u8 *src = src_tiles, *dest = dest_tiles;
|
|
u8 bottom_off;
|
|
|
|
if (object_size & 1)
|
|
{
|
|
// Object size is odd
|
|
bottom_off = (object_size >> 1) + 4;
|
|
for (l = 0; l < object_count; l++)
|
|
{
|
|
// Clear all unused rows of tiles plus the half-tile required due to centering
|
|
for (j = 0; j < 8-object_size; j++)
|
|
{
|
|
for (k = 0; k < 8; k++)
|
|
{
|
|
for (i = 0; i < 16; i++)
|
|
{
|
|
if (j % 2 == 0)
|
|
{
|
|
// Clear top half of top tile and bottom half of bottom tile when on even j
|
|
((dest+i) + (k << 5))[((j >> 1) << 8)] = 0;
|
|
((bottom_off << 8) + (dest+i) + (k << 5) + 16)[((j >> 1) << 8)] = 0;
|
|
}
|
|
else
|
|
{
|
|
// Clear bottom half of top tile and top half of tile following bottom tile when on odd j
|
|
((dest+i) + (k << 5) + 16)[((j >> 1) << 8)] = 0;
|
|
((bottom_off << 8) + (dest+i) + (k << 5) + 256)[((j >> 1) << 8)] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Clear the columns to the left and right that wont be used completely
|
|
// Unlike the previous loops, this will clear the later used space as well
|
|
for (j = 0; j < 2; j++)
|
|
{
|
|
for (i = 0; i < 8; i++)
|
|
{
|
|
for (k = 0; k < 32; k++)
|
|
{
|
|
// Left side
|
|
((dest+k) + (i << 8))[(j << 5)] = 0;
|
|
// Right side
|
|
((dest+k) + (i << 8))[(j << 5)+192] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Skip the top row and first tile on the second row for objects of size 5
|
|
if (object_size == 5) dest += 0x120;
|
|
|
|
// Copy tile data
|
|
for (j = 0; j < object_size; j++)
|
|
{
|
|
for (k = 0; k < object_size; k++)
|
|
{
|
|
for (i = 0; i < 4; i++)
|
|
{
|
|
// Offset the tile by +4px in both x and y directions
|
|
(dest + (i << 2))[18] = (src + (i << 2))[0];
|
|
(dest + (i << 2))[19] = (src + (i << 2))[1];
|
|
(dest + (i << 2))[48] = (src + (i << 2))[2];
|
|
(dest + (i << 2))[49] = (src + (i << 2))[3];
|
|
|
|
(dest + (i << 2))[258] = (src + (i << 2))[16];
|
|
(dest + (i << 2))[259] = (src + (i << 2))[17];
|
|
(dest + (i << 2))[288] = (src + (i << 2))[18];
|
|
(dest + (i << 2))[289] = (src + (i << 2))[19];
|
|
}
|
|
src += 32;
|
|
dest += 32;
|
|
}
|
|
|
|
// At the end of a row, skip enough tiles to get to the beginning of the next row
|
|
if (object_size == 7) dest += 0x20;
|
|
else if (object_size == 5) dest += 0x60;
|
|
}
|
|
|
|
// Skip remaining unused space to go to the beginning of the next object
|
|
if (object_size == 7) dest += 0x100;
|
|
else if (object_size == 5) dest += 0x1e0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Object size is even
|
|
for (i = 0; i < object_count; i++)
|
|
{
|
|
// For objects of size 6, the first and last row and column will be cleared
|
|
// While the remaining space will be filled with actual data
|
|
if (object_size == 6)
|
|
{
|
|
for (k = 0; k < 256; k++) {
|
|
*dest = 0;
|
|
dest++;
|
|
}
|
|
}
|
|
|
|
for (j = 0; j < object_size; j++)
|
|
{
|
|
if (object_size == 6)
|
|
{
|
|
for (k = 0; k < 32; k++) {
|
|
*dest = 0;
|
|
dest++;
|
|
}
|
|
}
|
|
|
|
// Copy tile data
|
|
for (k = 0; k < 32 * object_size; k++) {
|
|
*dest = *src;
|
|
src++;
|
|
dest++;
|
|
}
|
|
|
|
if (object_size == 6)
|
|
{
|
|
for (k = 0; k < 32; k++) {
|
|
*dest = 0;
|
|
dest++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (object_size == 6)
|
|
{
|
|
for (k = 0; k < 256; k++) {
|
|
*dest = 0;
|
|
dest++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
u32 GetDecompressedDataSize(const u32 *ptr)
|
|
{
|
|
const u8 *ptr8 = (const u8 *)ptr;
|
|
return (ptr8[3] << 16) | (ptr8[2] << 8) | (ptr8[1]);
|
|
}
|
|
|
|
bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet *src)
|
|
{
|
|
struct SpriteSheet dest;
|
|
void *buffer;
|
|
|
|
buffer = AllocZeroed(src->data[0] >> 8);
|
|
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(src->data[0] >> 8);
|
|
LZ77UnCompWram(src->data, buffer);
|
|
dest.data = buffer;
|
|
dest.tag = src->tag;
|
|
|
|
LoadSpritePalette(&dest);
|
|
Free(buffer);
|
|
return FALSE;
|
|
}
|