diff --git a/include/item_icon.h b/include/item_icon.h index 28f3c0933..22454d5d2 100644 --- a/include/item_icon.h +++ b/include/item_icon.h @@ -6,27 +6,9 @@ extern u8 *gItemIcon4x4Buffer; extern const struct SpriteTemplate gItemIconSpriteTemplate; -extern const struct CompressedSpriteSheet gSpriteSheet_BagMale; -extern const struct CompressedSpriteSheet gSpriteSheet_BagFemale; -extern const struct CompressedSpritePalette gSpritePalette_Bag; - -extern const struct CompressedSpriteSheet gBagSwapSpriteSheet; -extern const struct CompressedSpritePalette gBagSwapSpritePalette; - -void ResetItemMenuIconState(void); -void CreateSwapLine(void); -void DestroyItemMenuIcon(bool8 a0); -void CreateItemMenuIcon(u16 itemId, bool8 a0); void CopyItemIconPicTo4x4Buffer(const void *src, void *dest); u8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId); u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origTemplate, u16 tilesTag, u16 paletteTag, u16 itemId); -void CreateBerryPouchItemIcon(u16 itemId, u8 idx); -void UpdateSwapLinePos(s16 x, u16 y); -void SetSwapLineInvisibility(bool8 invisible); -void SetBagVisualPocketId(u8); -void ShakeBagSprite(void); -void CreateBagSprite(u8 animNum); - const void *GetItemIconPic(u16 itemId); const void *GetItemIconPalette(u16 itemId); diff --git a/include/item_menu_icons.h b/include/item_menu_icons.h new file mode 100644 index 000000000..0f1710d51 --- /dev/null +++ b/include/item_menu_icons.h @@ -0,0 +1,21 @@ +#ifndef GUARD_ITEM_MENU_ICONS_H +#define GUARD_ITEM_MENU_ICONS_H + +extern const struct CompressedSpriteSheet gSpriteSheet_BagMale; +extern const struct CompressedSpriteSheet gSpriteSheet_BagFemale; +extern const struct CompressedSpritePalette gSpritePalette_Bag; +extern const struct CompressedSpriteSheet gBagSwapSpriteSheet; +extern const struct CompressedSpritePalette gBagSwapSpritePalette; + +void ResetItemMenuIconState(void); +void CreateSwapLine(void); +void DestroyItemMenuIcon(bool8 a0); +void CreateItemMenuIcon(u16 itemId, bool8 a0); +void CreateBerryPouchItemIcon(u16 itemId, u8 idx); +void UpdateSwapLinePos(s16 x, u16 y); +void SetSwapLineInvisibility(bool8 invisible); +void SetBagVisualPocketId(u8); +void ShakeBagSprite(void); +void CreateBagSprite(u8 animNum); + +#endif // GUARD_ITEM_MENU_ICONS_H \ No newline at end of file diff --git a/src/berry_pouch.c b/src/berry_pouch.c index 35e2cf5f5..aea5fcdb4 100644 --- a/src/berry_pouch.c +++ b/src/berry_pouch.c @@ -11,6 +11,7 @@ #include "new_menu_helpers.h" #include "scanline_effect.h" #include "item_icon.h" +#include "item_menu_icons.h" #include "list_menu.h" #include "graphics.h" #include "berry.h" diff --git a/src/item_icon.c b/src/item_icon.c index 00d71b412..2d121ac80 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -8,290 +8,9 @@ #include "constants/items.h" #include "battle_main.h" -enum { - TAG_BAG = 100, - TAG_SWAP_LINE, - TAG_ITEM_ICON, - TAG_ITEM_ICON_ALT, -}; - -#define NUM_SWAP_LINE_SPRITES 9 - -// Indexes for sItemMenuIconSpriteIds -enum { - SPR_BAG, - SPR_SWAP_LINE_START, - SPR_ITEM_ICON = SPR_SWAP_LINE_START + NUM_SWAP_LINE_SPRITES, - SPR_ITEM_ICON_ALT, - SPR_COUNT -}; - -enum { - ANIM_SWAP_LINE_START, - ANIM_SWAP_LINE_MID, - ANIM_SWAP_LINE_END, -}; - -enum { - AFFINEANIM_BAG_IDLE, - AFFINEANIM_BAG_SHAKE, -}; - -static EWRAM_DATA u8 sItemMenuIconSpriteIds[SPR_COUNT] = {0}; EWRAM_DATA u8 *gItemIconDecompressionBuffer = NULL; EWRAM_DATA u8 *gItemIcon4x4Buffer = NULL; -static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite); -static void SpriteCB_ShakeBagSprite(struct Sprite *sprite); - -static const struct OamData sOamData_Bag = { - .affineMode = ST_OAM_AFFINE_NORMAL, - .shape = SPRITE_SHAPE(64x64), - .size = SPRITE_SIZE(64x64), - .priority = 1, - .paletteNum = 0 -}; - -static const union AnimCmd sAnim_Bag_OpenPokeBallsPocket[] = { - ANIMCMD_FRAME( 0, 5), - ANIMCMD_FRAME(0x40, 0), - ANIMCMD_END -}; - -static const union AnimCmd sAnim_Bag_OpenItemsPocket[] = { - ANIMCMD_FRAME( 0, 5), - ANIMCMD_FRAME(0x80, 0), - ANIMCMD_END -}; - -static const union AnimCmd sAnim_Bag_OpenKeyItemsPocket[] = { - ANIMCMD_FRAME( 0, 5), - ANIMCMD_FRAME(0xc0, 0), - ANIMCMD_END -}; - -static const union AnimCmd *const sAnims_Bag[] = { - [POCKET_ITEMS - 1] = sAnim_Bag_OpenItemsPocket, - [POCKET_KEY_ITEMS - 1] = sAnim_Bag_OpenKeyItemsPocket, - [POCKET_POKE_BALLS - 1] = sAnim_Bag_OpenPokeBallsPocket, -}; - -static const union AffineAnimCmd sAffineAnim_BagIdle[] = { - AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd sAffineAnim_BagShake[] = { - AFFINEANIMCMD_FRAME(0, 0, -2, 2), - AFFINEANIMCMD_FRAME(0, 0, 2, 4), - AFFINEANIMCMD_FRAME(0, 0, -2, 4), - AFFINEANIMCMD_FRAME(0, 0, 2, 2), - AFFINEANIMCMD_END -}; - -static const union AffineAnimCmd *const sAffineAnimTable_Bag[] = { - [AFFINEANIM_BAG_IDLE] = sAffineAnim_BagIdle, - [AFFINEANIM_BAG_SHAKE] = sAffineAnim_BagShake -}; - -const struct CompressedSpriteSheet gSpriteSheet_BagMale = { - .data = gBagMale_Gfx, - .size = 0x2000, - .tag = TAG_BAG -}; - -const struct CompressedSpriteSheet gSpriteSheet_BagFemale = { - .data = gBagFemale_Gfx, - .size = 0x2000, - .tag = TAG_BAG -}; - -const struct CompressedSpritePalette gSpritePalette_Bag = { - .data = gBag_Pal, - .tag = TAG_BAG -}; - -static const struct SpriteTemplate sSpriteTemplate_Bag = { - .tileTag = TAG_BAG, - .paletteTag = TAG_BAG, - .oam = &sOamData_Bag, - .anims = sAnims_Bag, - .images = NULL, - .affineAnims = sAffineAnimTable_Bag, - .callback = SpriteCallbackDummy -}; - -static const struct OamData sOamData_SwapLine = { - .affineMode = ST_OAM_AFFINE_OFF, - .shape = SPRITE_SHAPE(16x16), - .size = SPRITE_SIZE(16x16), - .priority = 1, - .paletteNum = 1 -}; - -static const union AnimCmd sAnim_SwapLine_Start[] = { - ANIMCMD_FRAME(0, 0), - ANIMCMD_END -}; - -static const union AnimCmd sAnim_SwapLine_Mid[] = { - ANIMCMD_FRAME(4, 0), - ANIMCMD_END -}; - -static const union AnimCmd sAnim_SwapLine_End[] = { - ANIMCMD_FRAME(0, 0, .hFlip = TRUE), - ANIMCMD_END -}; - -static const union AnimCmd *const sAnims_SwapLine[] = { - [ANIM_SWAP_LINE_START] = sAnim_SwapLine_Start, - [ANIM_SWAP_LINE_MID] = sAnim_SwapLine_Mid, - [ANIM_SWAP_LINE_END] = sAnim_SwapLine_End -}; - -const struct CompressedSpriteSheet gBagSwapSpriteSheet = { - .data = gSwapLine_Gfx, - .size = 0x100, - .tag = TAG_SWAP_LINE -}; - -const struct CompressedSpritePalette gBagSwapSpritePalette = { - .data = gSwapLine_Pal, - .tag = TAG_SWAP_LINE -}; - -static const struct SpriteTemplate sSpriteTemplate_SwapLine = { - .tileTag = TAG_SWAP_LINE, - .paletteTag = TAG_SWAP_LINE, - .oam = &sOamData_SwapLine, - .anims = sAnims_SwapLine, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct OamData sOamData_ItemIcon = { - .affineMode = ST_OAM_AFFINE_OFF, - .shape = SPRITE_SHAPE(32x32), - .size = SPRITE_SIZE(32x32), - .priority = 1, - .paletteNum = 2 -}; - -static const union AnimCmd sAnim_ItemIcon[] = { - ANIMCMD_FRAME(0, 0), - ANIMCMD_END -}; - -static const union AnimCmd *const sAnims_ItemIcon[] = { - sAnim_ItemIcon -}; - -const struct SpriteTemplate gItemIconSpriteTemplate = { - .tileTag = TAG_ITEM_ICON, - .paletteTag = TAG_ITEM_ICON, - .oam = &sOamData_ItemIcon, - .anims = sAnims_ItemIcon, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -void ResetItemMenuIconState(void) -{ - u16 i; - - for (i = 0; i < SPR_COUNT; i++) - sItemMenuIconSpriteIds[i] = SPRITE_NONE; -} - -void CreateBagSprite(u8 animNum) -{ - sItemMenuIconSpriteIds[SPR_BAG] = CreateSprite(&sSpriteTemplate_Bag, 40, 68, 0); - SetBagVisualPocketId(animNum); -} - -void SetBagVisualPocketId(u8 animNum) -{ - struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]]; - sprite->y2 = -5; - sprite->callback = SpriteCB_BagVisualSwitchingPockets; - StartSpriteAnim(sprite, animNum); -} - -static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite) -{ - if (sprite->y2 != 0) - sprite->y2++; - else - sprite->callback = SpriteCallbackDummy; -} - -void ShakeBagSprite(void) -{ - struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]]; - if (sprite->affineAnimEnded) - { - StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_SHAKE); - sprite->callback = SpriteCB_ShakeBagSprite; - } -} - -static void SpriteCB_ShakeBagSprite(struct Sprite *sprite) -{ - if (sprite->affineAnimEnded) - { - StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_IDLE); - sprite->callback = SpriteCallbackDummy; - } -} - -void CreateSwapLine(void) -{ - u8 i; - u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; - - for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) - { - spriteIds[i] = CreateSprite(&sSpriteTemplate_SwapLine, i * 16 + 96, 7, 0); - switch (i) - { - case 0: - // ANIM_SWAP_LINE_START, by default - break; - case NUM_SWAP_LINE_SPRITES - 1: - StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_END); - break; - default: - StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_MID); - break; - } - gSprites[spriteIds[i]].invisible = TRUE; - } -} - -void SetSwapLineInvisibility(bool8 invisible) -{ - u8 i; - u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; - - for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) - gSprites[spriteIds[i]].invisible = invisible; -} - -void UpdateSwapLinePos(s16 x, u16 y) -{ - u8 i; - u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; - - for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) - { - gSprites[spriteIds[i]].x2 = x; - gSprites[spriteIds[i]].y = y + 7; - } -} - static bool8 TryAllocItemIconTilesBuffers(void) { gItemIconDecompressionBuffer = Alloc(0x120); @@ -377,57 +96,6 @@ u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origT return spriteId; } -void CreateItemMenuIcon(u16 itemId, u8 idx) -{ - u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; - u8 spriteId; - - if (spriteIds[idx] == SPRITE_NONE) - { - // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT - FreeSpriteTilesByTag(TAG_ITEM_ICON + idx); - FreeSpritePaletteByTag(TAG_ITEM_ICON + idx); - spriteId = AddItemIconObject(TAG_ITEM_ICON + idx, TAG_ITEM_ICON + idx, itemId); - if (spriteId != MAX_SPRITES) - { - spriteIds[idx] = spriteId; - gSprites[spriteId].x2 = 24; - gSprites[spriteId].y2 = 140; - } - } -} - -void DestroyItemMenuIcon(u8 idx) -{ - u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; - - if (spriteIds[idx] != SPRITE_NONE) - { - DestroySpriteAndFreeResources(&gSprites[spriteIds[idx]]); - spriteIds[idx] = SPRITE_NONE; - } -} - -void CreateBerryPouchItemIcon(u16 itemId, u8 idx) -{ - u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; - u8 spriteId; - - if (spriteIds[idx] == SPRITE_NONE) - { - // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT - FreeSpriteTilesByTag(TAG_ITEM_ICON + idx); - FreeSpritePaletteByTag(TAG_ITEM_ICON + idx); - spriteId = AddItemIconObject(TAG_ITEM_ICON + idx, TAG_ITEM_ICON + idx, itemId); - if (spriteId != MAX_SPRITES) - { - spriteIds[idx] = spriteId; - gSprites[spriteId].x2 = 24; - gSprites[spriteId].y2 = 147; // This value is the only difference from CreateItemMenuIcon - } - } -} - const void *GetItemIconPic(u16 itemId) { if (itemId == ITEM_FIELD_ARROW) diff --git a/src/item_menu.c b/src/item_menu.c index 05f43a44c..8fa7282b0 100644 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -10,8 +10,9 @@ #include "graphics.h" #include "help_system.h" #include "item.h" -#include "item_menu.h" #include "item_icon.h" +#include "item_menu.h" +#include "item_menu_icons.h" #include "item_use.h" #include "link.h" #include "list_menu.h" diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c new file mode 100644 index 000000000..b3a2b2a9c --- /dev/null +++ b/src/item_menu_icons.c @@ -0,0 +1,343 @@ +#include "global.h" + +#include "sprite.h" + +#include "graphics.h" +#include "item_icon.h" +#include "item_menu_icons.h" +#include "constants/item.h" + +enum { + TAG_BAG = 100, + TAG_SWAP_LINE, + TAG_ITEM_ICON, + TAG_ITEM_ICON_ALT, +}; + +#define NUM_SWAP_LINE_SPRITES 9 + +// Indexes for sItemMenuIconSpriteIds +enum { + SPR_BAG, + SPR_SWAP_LINE_START, + SPR_ITEM_ICON = SPR_SWAP_LINE_START + NUM_SWAP_LINE_SPRITES, + SPR_ITEM_ICON_ALT, + SPR_COUNT +}; + +enum { + ANIM_SWAP_LINE_START, + ANIM_SWAP_LINE_MID, + ANIM_SWAP_LINE_END, +}; + +enum { + AFFINEANIM_BAG_IDLE, + AFFINEANIM_BAG_SHAKE, +}; + +static EWRAM_DATA u8 sItemMenuIconSpriteIds[SPR_COUNT] = {0}; + +static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite); +static void SpriteCB_ShakeBagSprite(struct Sprite *sprite); + +static const struct OamData sOamData_Bag = { + .affineMode = ST_OAM_AFFINE_NORMAL, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .priority = 1, + .paletteNum = 0 +}; + +static const union AnimCmd sAnim_Bag_OpenPokeBallsPocket[] = { + ANIMCMD_FRAME( 0, 5), + ANIMCMD_FRAME(0x40, 0), + ANIMCMD_END +}; + +static const union AnimCmd sAnim_Bag_OpenItemsPocket[] = { + ANIMCMD_FRAME( 0, 5), + ANIMCMD_FRAME(0x80, 0), + ANIMCMD_END +}; + +static const union AnimCmd sAnim_Bag_OpenKeyItemsPocket[] = { + ANIMCMD_FRAME( 0, 5), + ANIMCMD_FRAME(0xc0, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sAnims_Bag[] = { + [POCKET_ITEMS - 1] = sAnim_Bag_OpenItemsPocket, + [POCKET_KEY_ITEMS - 1] = sAnim_Bag_OpenKeyItemsPocket, + [POCKET_POKE_BALLS - 1] = sAnim_Bag_OpenPokeBallsPocket, +}; + +static const union AffineAnimCmd sAffineAnim_BagIdle[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sAffineAnim_BagShake[] = { + AFFINEANIMCMD_FRAME(0, 0, -2, 2), + AFFINEANIMCMD_FRAME(0, 0, 2, 4), + AFFINEANIMCMD_FRAME(0, 0, -2, 4), + AFFINEANIMCMD_FRAME(0, 0, 2, 2), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sAffineAnimTable_Bag[] = { + [AFFINEANIM_BAG_IDLE] = sAffineAnim_BagIdle, + [AFFINEANIM_BAG_SHAKE] = sAffineAnim_BagShake +}; + +const struct CompressedSpriteSheet gSpriteSheet_BagMale = { + .data = gBagMale_Gfx, + .size = 0x2000, + .tag = TAG_BAG +}; + +const struct CompressedSpriteSheet gSpriteSheet_BagFemale = { + .data = gBagFemale_Gfx, + .size = 0x2000, + .tag = TAG_BAG +}; + +const struct CompressedSpritePalette gSpritePalette_Bag = { + .data = gBag_Pal, + .tag = TAG_BAG +}; + +static const struct SpriteTemplate sSpriteTemplate_Bag = { + .tileTag = TAG_BAG, + .paletteTag = TAG_BAG, + .oam = &sOamData_Bag, + .anims = sAnims_Bag, + .images = NULL, + .affineAnims = sAffineAnimTable_Bag, + .callback = SpriteCallbackDummy +}; + +static const struct OamData sOamData_SwapLine = { + .affineMode = ST_OAM_AFFINE_OFF, + .shape = SPRITE_SHAPE(16x16), + .size = SPRITE_SIZE(16x16), + .priority = 1, + .paletteNum = 1 +}; + +static const union AnimCmd sAnim_SwapLine_Start[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sAnim_SwapLine_Mid[] = { + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sAnim_SwapLine_End[] = { + ANIMCMD_FRAME(0, 0, .hFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd *const sAnims_SwapLine[] = { + [ANIM_SWAP_LINE_START] = sAnim_SwapLine_Start, + [ANIM_SWAP_LINE_MID] = sAnim_SwapLine_Mid, + [ANIM_SWAP_LINE_END] = sAnim_SwapLine_End +}; + +const struct CompressedSpriteSheet gBagSwapSpriteSheet = { + .data = gSwapLine_Gfx, + .size = 0x100, + .tag = TAG_SWAP_LINE +}; + +const struct CompressedSpritePalette gBagSwapSpritePalette = { + .data = gSwapLine_Pal, + .tag = TAG_SWAP_LINE +}; + +static const struct SpriteTemplate sSpriteTemplate_SwapLine = { + .tileTag = TAG_SWAP_LINE, + .paletteTag = TAG_SWAP_LINE, + .oam = &sOamData_SwapLine, + .anims = sAnims_SwapLine, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct OamData sOamData_ItemIcon = { + .affineMode = ST_OAM_AFFINE_OFF, + .shape = SPRITE_SHAPE(32x32), + .size = SPRITE_SIZE(32x32), + .priority = 1, + .paletteNum = 2 +}; + +static const union AnimCmd sAnim_ItemIcon[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sAnims_ItemIcon[] = { + sAnim_ItemIcon +}; + +const struct SpriteTemplate gItemIconSpriteTemplate = { + .tileTag = TAG_ITEM_ICON, + .paletteTag = TAG_ITEM_ICON, + .oam = &sOamData_ItemIcon, + .anims = sAnims_ItemIcon, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +void ResetItemMenuIconState(void) +{ + u16 i; + + for (i = 0; i < SPR_COUNT; i++) + sItemMenuIconSpriteIds[i] = SPRITE_NONE; +} + +void CreateBagSprite(u8 animNum) +{ + sItemMenuIconSpriteIds[SPR_BAG] = CreateSprite(&sSpriteTemplate_Bag, 40, 68, 0); + SetBagVisualPocketId(animNum); +} + +void SetBagVisualPocketId(u8 animNum) +{ + struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]]; + sprite->y2 = -5; + sprite->callback = SpriteCB_BagVisualSwitchingPockets; + StartSpriteAnim(sprite, animNum); +} + +static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite) +{ + if (sprite->y2 != 0) + sprite->y2++; + else + sprite->callback = SpriteCallbackDummy; +} + +void ShakeBagSprite(void) +{ + struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]]; + if (sprite->affineAnimEnded) + { + StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_SHAKE); + sprite->callback = SpriteCB_ShakeBagSprite; + } +} + +static void SpriteCB_ShakeBagSprite(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_IDLE); + sprite->callback = SpriteCallbackDummy; + } +} + +void CreateSwapLine(void) +{ + u8 i; + u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; + + for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) + { + spriteIds[i] = CreateSprite(&sSpriteTemplate_SwapLine, i * 16 + 96, 7, 0); + switch (i) + { + case 0: + // ANIM_SWAP_LINE_START, by default + break; + case NUM_SWAP_LINE_SPRITES - 1: + StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_END); + break; + default: + StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_MID); + break; + } + gSprites[spriteIds[i]].invisible = TRUE; + } +} + +void SetSwapLineInvisibility(bool8 invisible) +{ + u8 i; + u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; + + for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) + gSprites[spriteIds[i]].invisible = invisible; +} + +void UpdateSwapLinePos(s16 x, u16 y) +{ + u8 i; + u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; + + for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) + { + gSprites[spriteIds[i]].x2 = x; + gSprites[spriteIds[i]].y = y + 7; + } +} + +void CreateItemMenuIcon(u16 itemId, u8 idx) +{ + u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; + u8 spriteId; + + if (spriteIds[idx] == SPRITE_NONE) + { + // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT + FreeSpriteTilesByTag(TAG_ITEM_ICON + idx); + FreeSpritePaletteByTag(TAG_ITEM_ICON + idx); + spriteId = AddItemIconObject(TAG_ITEM_ICON + idx, TAG_ITEM_ICON + idx, itemId); + if (spriteId != MAX_SPRITES) + { + spriteIds[idx] = spriteId; + gSprites[spriteId].x2 = 24; + gSprites[spriteId].y2 = 140; + } + } +} + +void DestroyItemMenuIcon(u8 idx) +{ + u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; + + if (spriteIds[idx] != SPRITE_NONE) + { + DestroySpriteAndFreeResources(&gSprites[spriteIds[idx]]); + spriteIds[idx] = SPRITE_NONE; + } +} + +void CreateBerryPouchItemIcon(u16 itemId, u8 idx) +{ + u8 * spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; + u8 spriteId; + + if (spriteIds[idx] == SPRITE_NONE) + { + // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT + FreeSpriteTilesByTag(TAG_ITEM_ICON + idx); + FreeSpritePaletteByTag(TAG_ITEM_ICON + idx); + spriteId = AddItemIconObject(TAG_ITEM_ICON + idx, TAG_ITEM_ICON + idx, itemId); + if (spriteId != MAX_SPRITES) + { + spriteIds[idx] = spriteId; + gSprites[spriteId].x2 = 24; + gSprites[spriteId].y2 = 147; // This value is the only difference from CreateItemMenuIcon + } + } +} + + diff --git a/src/item_pc.c b/src/item_pc.c index b6c598711..a62f1d568 100644 --- a/src/item_pc.c +++ b/src/item_pc.c @@ -7,6 +7,7 @@ #include "item.h" #include "item_menu.h" #include "item_icon.h" +#include "item_menu_icons.h" #include "list_menu.h" #include "item_pc.h" #include "item_use.h" diff --git a/src/shop.c b/src/shop.c index 8d12cf29a..ad9580c74 100644 --- a/src/shop.c +++ b/src/shop.c @@ -13,6 +13,7 @@ #include "task.h" #include "item.h" #include "item_menu.h" +#include "item_menu_icons.h" #include "overworld.h" #include "field_fadetransition.h" #include "scanline_effect.h"