decompile item icon
This commit is contained in:
@@ -2013,9 +2013,9 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
|
||||
{
|
||||
return MAX_SPRITES;
|
||||
}
|
||||
LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gUnknown_0203CEBC);
|
||||
CopyItemIconPicTo4x4Buffer(gUnknown_0203CEBC, gUnknown_0203CEC0);
|
||||
sheet.data = gUnknown_0203CEC0;
|
||||
LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gItemIconDecompressionBuffer);
|
||||
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
|
||||
sheet.data = gItemIcon4x4Buffer;
|
||||
sheet.size = 0x200;
|
||||
sheet.tag = tilesTag;
|
||||
LoadSpriteSheet(&sheet);
|
||||
@@ -2023,7 +2023,7 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
|
||||
palette.tag = paletteTag;
|
||||
LoadCompressedObjectPalette(&palette);
|
||||
template = malloc(sizeof(struct SpriteTemplate));
|
||||
*template = gUnknown_08614FF4;
|
||||
*template = gItemIconSpriteTemplate;
|
||||
template->tileTag = tilesTag;
|
||||
template->paletteTag = paletteTag;
|
||||
spriteId = CreateSprite(template, 0, 0, 0);
|
||||
|
||||
169
src/item_icon.c
Normal file
169
src/item_icon.c
Normal file
@@ -0,0 +1,169 @@
|
||||
#include "global.h"
|
||||
#include "item_icon.h"
|
||||
#include "malloc.h"
|
||||
#include "sprite.h"
|
||||
#include "decompress.h"
|
||||
#include "constants/items.h"
|
||||
|
||||
// EWRAM vars
|
||||
EWRAM_DATA void *gItemIconDecompressionBuffer = NULL;
|
||||
EWRAM_DATA void *gItemIcon4x4Buffer = NULL;
|
||||
|
||||
// const rom data
|
||||
extern const void *const gItemIconTable[][2]; // todo: move to C file
|
||||
|
||||
static const struct OamData sOamData_ItemIcon =
|
||||
{
|
||||
.y = 0,
|
||||
.affineMode = 0,
|
||||
.objMode = 0,
|
||||
.mosaic = 0,
|
||||
.bpp = 0,
|
||||
.shape = 0,
|
||||
.x = 0,
|
||||
.matrixNum = 0,
|
||||
.size = 2,
|
||||
.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;
|
||||
LoadCompressedObjectPalette(&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(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;
|
||||
LoadCompressedObjectPalette(&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 > ITEM_LAST_ID)
|
||||
itemId = 0;
|
||||
|
||||
return gItemIconTable[itemId][which];
|
||||
}
|
||||
Reference in New Issue
Block a user