mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-18 12:37:38 +01:00
171 lines
4.5 KiB
C
171 lines
4.5 KiB
C
#include "global.h"
|
|
#include "decompress.h"
|
|
#include "graphics.h"
|
|
#include "item_icon.h"
|
|
#include "malloc.h"
|
|
#include "sprite.h"
|
|
#include "constants/items.h"
|
|
|
|
// EWRAM vars
|
|
EWRAM_DATA void *gItemIconDecompressionBuffer = NULL;
|
|
EWRAM_DATA void *gItemIcon4x4Buffer = NULL;
|
|
|
|
// const rom data
|
|
#include "data/item_icon_table.h"
|
|
|
|
static const struct OamData sOamData_ItemIcon =
|
|
{
|
|
.y = 0,
|
|
.affineMode = 0,
|
|
.objMode = 0,
|
|
.mosaic = 0,
|
|
.bpp = 0,
|
|
.shape = SPRITE_SHAPE(32x32),
|
|
.x = 0,
|
|
.matrixNum = 0,
|
|
.size = SPRITE_SIZE(32x32),
|
|
.tileNum = 0,
|
|
.priority = 1,
|
|
.paletteNum = 2,
|
|
.affineParam = 0
|
|
};
|
|
|
|
static const union AnimCmd sSpriteAnim_ItemIcon[] =
|
|
{
|
|
ANIMCMD_FRAME(0, 0),
|
|
ANIMCMD_END
|
|
};
|
|
|
|
static const union AnimCmd *const sSpriteAnimTable_ItemIcon[] =
|
|
{
|
|
sSpriteAnim_ItemIcon
|
|
};
|
|
|
|
const struct SpriteTemplate gItemIconSpriteTemplate =
|
|
{
|
|
.tileTag = 0,
|
|
.paletteTag = 0,
|
|
.oam = &sOamData_ItemIcon,
|
|
.anims = sSpriteAnimTable_ItemIcon,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = SpriteCallbackDummy,
|
|
};
|
|
|
|
// code
|
|
bool8 AllocItemIconTemporaryBuffers(void)
|
|
{
|
|
gItemIconDecompressionBuffer = gItemIconDecompressionBuffer; // needed to match
|
|
gItemIconDecompressionBuffer = Alloc(0x120);
|
|
if (gItemIconDecompressionBuffer == NULL)
|
|
return FALSE;
|
|
|
|
gItemIcon4x4Buffer = gItemIcon4x4Buffer; // needed to match
|
|
gItemIcon4x4Buffer = AllocZeroed(0x200);
|
|
if (gItemIcon4x4Buffer == NULL)
|
|
{
|
|
Free(gItemIconDecompressionBuffer);
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void FreeItemIconTemporaryBuffers(void)
|
|
{
|
|
Free(gItemIconDecompressionBuffer);
|
|
Free(gItemIcon4x4Buffer);
|
|
}
|
|
|
|
void CopyItemIconPicTo4x4Buffer(const void *src, void *dest)
|
|
{
|
|
u8 i;
|
|
|
|
for (i = 0; i < 3; i++)
|
|
CpuCopy16(src + i * 96, dest + i * 128, 0x60);
|
|
}
|
|
|
|
u8 AddItemIconSprite(u16 tilesTag, u16 paletteTag, u16 itemId)
|
|
{
|
|
if (!AllocItemIconTemporaryBuffers())
|
|
{
|
|
return MAX_SPRITES;
|
|
}
|
|
else
|
|
{
|
|
u8 spriteId;
|
|
struct SpriteSheet spriteSheet;
|
|
struct CompressedSpritePalette spritePalette;
|
|
struct SpriteTemplate *spriteTemplate;
|
|
|
|
LZDecompressWram(GetItemIconPicOrPalette(itemId, 0), gItemIconDecompressionBuffer);
|
|
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
|
|
spriteSheet.data = gItemIcon4x4Buffer;
|
|
spriteSheet.size = 0x200;
|
|
spriteSheet.tag = tilesTag;
|
|
LoadSpriteSheet(&spriteSheet);
|
|
|
|
spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
|
|
spritePalette.tag = paletteTag;
|
|
LoadCompressedSpritePalette(&spritePalette);
|
|
|
|
spriteTemplate = Alloc(sizeof(*spriteTemplate));
|
|
CpuCopy16(&gItemIconSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
|
|
spriteTemplate->tileTag = tilesTag;
|
|
spriteTemplate->paletteTag = paletteTag;
|
|
spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
|
|
|
|
FreeItemIconTemporaryBuffers();
|
|
Free(spriteTemplate);
|
|
|
|
return spriteId;
|
|
}
|
|
}
|
|
|
|
u8 AddCustomItemIconSprite(const struct SpriteTemplate *customSpriteTemplate, u16 tilesTag, u16 paletteTag, u16 itemId)
|
|
{
|
|
if (!AllocItemIconTemporaryBuffers())
|
|
{
|
|
return MAX_SPRITES;
|
|
}
|
|
else
|
|
{
|
|
u8 spriteId;
|
|
struct SpriteSheet spriteSheet;
|
|
struct CompressedSpritePalette spritePalette;
|
|
struct SpriteTemplate *spriteTemplate;
|
|
|
|
LZDecompressWram(GetItemIconPicOrPalette(itemId, 0), gItemIconDecompressionBuffer);
|
|
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
|
|
spriteSheet.data = gItemIcon4x4Buffer;
|
|
spriteSheet.size = 0x200;
|
|
spriteSheet.tag = tilesTag;
|
|
LoadSpriteSheet(&spriteSheet);
|
|
|
|
spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
|
|
spritePalette.tag = paletteTag;
|
|
LoadCompressedSpritePalette(&spritePalette);
|
|
|
|
spriteTemplate = Alloc(sizeof(*spriteTemplate));
|
|
CpuCopy16(customSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
|
|
spriteTemplate->tileTag = tilesTag;
|
|
spriteTemplate->paletteTag = paletteTag;
|
|
spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
|
|
|
|
FreeItemIconTemporaryBuffers();
|
|
Free(spriteTemplate);
|
|
|
|
return spriteId;
|
|
}
|
|
}
|
|
|
|
const void *GetItemIconPicOrPalette(u16 itemId, u8 which)
|
|
{
|
|
if (itemId == 0xFFFF)
|
|
itemId = ITEM_FIELD_ARROW;
|
|
else if (itemId >= ITEMS_COUNT)
|
|
itemId = 0;
|
|
|
|
return gItemIconTable[itemId][which];
|
|
}
|