summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/decoration.c8
-rw-r--r--src/item_icon.c169
2 files changed, 173 insertions, 4 deletions
diff --git a/src/decoration.c b/src/decoration.c
index 68a455285..68dcb26fb 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -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);
diff --git a/src/item_icon.c b/src/item_icon.c
new file mode 100644
index 000000000..4aaad9c31
--- /dev/null
+++ b/src/item_icon.c
@@ -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];
+}