summaryrefslogtreecommitdiff
path: root/src/field/item.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/field/item.c')
-rw-r--r--src/field/item.c674
1 files changed, 0 insertions, 674 deletions
diff --git a/src/field/item.c b/src/field/item.c
deleted file mode 100644
index 6ff7a7cbe..000000000
--- a/src/field/item.c
+++ /dev/null
@@ -1,674 +0,0 @@
-#include "global.h"
-#include "constants/hold_effects.h"
-#include "item.h"
-#include "constants/items.h"
-#include "item_use.h"
-#include "berry.h"
-#include "string_util.h"
-#include "strings.h"
-
-extern u8 gUnknown_02038560;
-
-// These constants are used in gItems
-enum
-{
- POCKET_NONE,
- POCKET_ITEMS,
- POCKET_POKE_BALLS,
- POCKET_TM_HM,
- POCKET_BERRIES,
- POCKET_KEY_ITEMS,
-};
-
-enum
-{
- ITEMS_POCKET,
- BALLS_POCKET,
- TMHM_POCKET,
- BERRIES_POCKET,
- KEYITEMS_POCKET
-};
-
-#if ENGLISH
-#include "../data/item_descriptions_en.h"
-#include "../data/items_en.h"
-#elif GERMAN
-#include "../data/item_descriptions_de.h"
-#include "../data/items_de.h"
-#endif
-
-static void CompactPCItems(void);
-
-void CopyItemName(u16 itemId, u8 *string)
-{
- if (itemId == ITEM_ENIGMA_BERRY)
- {
- StringCopy(string, GetBerryInfo(0x2B)->name); // berry 0x2b = enigma berry
- StringAppend(string, gOtherText_Berry2);
- }
- else
- StringCopy(string, ItemId_GetItem(itemId)->name);
-}
-
-//Unreferenced
-s8 CountUsedBagPocketSlots(u8 pocket)
-{
- u8 i;
-
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
- {
- if (gBagPockets[pocket].itemSlots[i].itemId == 0)
- return i;
- }
- return -1;
-}
-
-bool8 IsBagPocketNonEmpty(u8 pocket)
-{
- u8 i;
-
- for (i = 0; i < gBagPockets[pocket - 1].capacity; i++)
- {
- if (gBagPockets[pocket - 1].itemSlots[i].itemId != 0)
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 CheckBagHasItem(u16 itemId, u16 count)
-{
- u8 i;
- u8 pocket;
-
- if (ItemId_GetPocket(itemId) == 0)
- return FALSE;
- pocket = ItemId_GetPocket(itemId) - 1;
- //Check for item slots that contain the item
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
- {
- if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
- {
- //Does this item slot contain enough of the item?
- if (gBagPockets[pocket].itemSlots[i].quantity >= count)
- return TRUE;
- count -= gBagPockets[pocket].itemSlots[i].quantity;
- //Does this item slot and all previous slots contain enough of the item?
- if (count == 0)
- return TRUE;
- }
- }
- return FALSE;
-}
-
-bool8 CheckBagHasSpace(u16 itemId, u16 count)
-{
- u8 i;
- u8 pocket;
- u16 slotCapacity;
-
- if (ItemId_GetPocket(itemId) == 0)
- return FALSE;
- pocket = ItemId_GetPocket(itemId) - 1;
- if (pocket != BERRIES_POCKET)
- slotCapacity = 99;
- else
- slotCapacity = 999;
-
- //Check space in any existing item slots that already contain this item
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
- {
- if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
- {
- if (gBagPockets[pocket].itemSlots[i].quantity + count <= slotCapacity)
- return TRUE;
- if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
- return FALSE;
- count -= slotCapacity - gBagPockets[pocket].itemSlots[i].quantity;
- if (count == 0)
- return TRUE;
- }
- }
-
- //Check space in empty item slots
- if (count > 0)
- {
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
- {
- if (gBagPockets[pocket].itemSlots[i].itemId == 0)
- {
- if (count <= slotCapacity)
- return TRUE;
- else
- count -= slotCapacity;
- }
- }
- if (count > 0)
- return FALSE; //No more item slots. The bag is full
- }
-
- return TRUE;
-}
-
-// This function matches if gBagPockets is declared non-const,
-// but it should be fixed anyway.
-#ifdef NONMATCHING
-bool8 AddBagItem(u16 itemId, u16 count)
-{
- u8 i;
- u8 pocket;
- u16 slotCapacity;
- struct ItemSlot newItems[64];
-
- if (ItemId_GetPocket(itemId) == 0)
- return FALSE;
- pocket = ItemId_GetPocket(itemId) - 1;
- //Copy the bag pocket
- memcpy(newItems, gBagPockets[pocket].itemSlots, gBagPockets[pocket].capacity * sizeof(struct ItemSlot));
- if (pocket != BERRIES_POCKET)
- slotCapacity = 99;
- else
- slotCapacity = 999;
-
- //Use any item slots that already contain this item
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
- {
- if (newItems[i].itemId == itemId)
- {
- if (newItems[i].quantity + count <= slotCapacity)
- {
- newItems[i].quantity += count;
- //Copy pocket back into the bag.
- memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot));
- return TRUE;
- }
- if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
- return FALSE;
- count -= slotCapacity - newItems[i].quantity;
- newItems[i].quantity = slotCapacity;
- if (count == 0)
- goto copy_items;
- }
- }
-
- //Put any remaining items into new item slots.
- if (count > 0)
- {
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
- {
- if (newItems[i].itemId == 0)
- {
- newItems[i].itemId = itemId;
- if (count <= slotCapacity)
- {
- newItems[i].quantity = count;
- goto copy_items;
- }
- count -= slotCapacity;
- newItems[i].quantity = slotCapacity;
- }
- }
- if (count > 0)
- return FALSE; //No more empty item slots. The bag is full.
- }
-
- copy_items:
- //Copy pocket back into the bag.
- memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot));
- return TRUE;
-}
-#else
-__attribute__((naked))
-bool8 AddBagItem(u16 itemId, u16 count)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- sub sp, 0x100\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- lsls r1, 16\n\
- lsrs r4, r1, 16\n\
- bl ItemId_GetPocket\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080A9510\n\
- mov r0, r8\n\
- bl ItemId_GetPocket\n\
- subs r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- ldr r1, _080A94F8 @ =gBagPockets\n\
- lsls r0, r6, 3\n\
- adds r5, r0, r1\n\
- ldr r1, [r5]\n\
- ldrb r2, [r5, 0x4]\n\
- lsls r2, 2\n\
- mov r0, sp\n\
- bl memcpy\n\
- ldr r7, _080A94FC @ =0x000003e7\n\
- cmp r6, 0x3\n\
- beq _080A9468\n\
- movs r7, 0x63\n\
-_080A9468:\n\
- movs r1, 0\n\
- ldrb r0, [r5, 0x4]\n\
- cmp r1, r0\n\
- bcs _080A94B2\n\
- subs r0, r6, 0x2\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r12, r0\n\
-_080A9478:\n\
- lsls r0, r1, 2\n\
- mov r2, sp\n\
- adds r3, r2, r0\n\
- ldrh r0, [r3]\n\
- cmp r0, r8\n\
- bne _080A94A6\n\
- ldrh r2, [r3, 0x2]\n\
- adds r0, r2, r4\n\
- cmp r0, r7\n\
- ble _080A9500\n\
- mov r0, r12\n\
- cmp r0, 0x1\n\
- bls _080A9510\n\
- subs r0, r7, r2\n\
- subs r0, r4, r0\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- strh r7, [r3, 0x2]\n\
- ldr r2, _080A94F8 @ =gBagPockets\n\
- mov r9, r2\n\
- lsls r3, r6, 3\n\
- cmp r4, 0\n\
- beq _080A9516\n\
-_080A94A6:\n\
- adds r0, r1, 0x1\n\
- lsls r0, 24\n\
- lsrs r1, r0, 24\n\
- ldrb r0, [r5, 0x4]\n\
- cmp r1, r0\n\
- bcc _080A9478\n\
-_080A94B2:\n\
- ldr r2, _080A94F8 @ =gBagPockets\n\
- mov r9, r2\n\
- lsls r3, r6, 3\n\
- cmp r4, 0\n\
- beq _080A9516\n\
- movs r1, 0\n\
- adds r0, r3, r2\n\
- ldrb r0, [r0, 0x4]\n\
- cmp r1, r0\n\
- bcs _080A94F2\n\
- mov r6, r9\n\
- adds r5, r3, r6\n\
-_080A94CA:\n\
- lsls r0, r1, 2\n\
- mov r6, sp\n\
- adds r2, r6, r0\n\
- ldrh r0, [r2]\n\
- cmp r0, 0\n\
- bne _080A94E6\n\
- mov r0, r8\n\
- strh r0, [r2]\n\
- cmp r4, r7\n\
- bls _080A9514\n\
- subs r0, r4, r7\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- strh r7, [r2, 0x2]\n\
-_080A94E6:\n\
- adds r0, r1, 0x1\n\
- lsls r0, 24\n\
- lsrs r1, r0, 24\n\
- ldrb r2, [r5, 0x4]\n\
- cmp r1, r2\n\
- bcc _080A94CA\n\
-_080A94F2:\n\
- cmp r4, 0\n\
- beq _080A9516\n\
- b _080A9510\n\
- .align 2, 0\n\
-_080A94F8: .4byte gBagPockets\n\
-_080A94FC: .4byte 0x000003e7\n\
-_080A9500:\n\
- strh r0, [r3, 0x2]\n\
- ldr r0, _080A950C @ =gBagPockets\n\
- lsls r1, r6, 3\n\
- adds r1, r0\n\
- b _080A951A\n\
- .align 2, 0\n\
-_080A950C: .4byte gBagPockets\n\
-_080A9510:\n\
- movs r0, 0\n\
- b _080A9528\n\
-_080A9514:\n\
- strh r4, [r2, 0x2]\n\
-_080A9516:\n\
- mov r6, r9\n\
- adds r1, r3, r6\n\
-_080A951A:\n\
- ldr r0, [r1]\n\
- ldrb r2, [r1, 0x4]\n\
- lsls r2, 2\n\
- mov r1, sp\n\
- bl memcpy\n\
- movs r0, 0x1\n\
-_080A9528:\n\
- add sp, 0x100\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .syntax divided\n");
-}
-#endif
-
-bool8 RemoveBagItem(u16 itemId, u16 count)
-{
- u8 i;
- u8 pocket;
- u16 totalQuantity = 0;
-
- if (ItemId_GetPocket(itemId) == 0 || itemId == 0)
- return FALSE;
- pocket = ItemId_GetPocket(itemId) - 1;
-
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
- {
- if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
- totalQuantity += gBagPockets[pocket].itemSlots[i].quantity;
- }
- if (totalQuantity < count)
- return FALSE; //We don't have enough of the item
-
- if (gBagPockets[pocket].capacity > gUnknown_02038560
- && gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId == itemId)
- {
- if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity >= count)
- {
- gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity -= count;
- count = 0;
- }
- else
- {
- count -= gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity;
- gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity = 0;
- }
- if (gBagPockets[pocket].itemSlots[gUnknown_02038560].quantity == 0)
- gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId = 0;
- if (count == 0)
- return TRUE;
- }
-
- for (i = 0; i < gBagPockets[pocket].capacity; i++)
- {
- if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
- {
- if (gBagPockets[pocket].itemSlots[i].quantity >= count)
- {
- gBagPockets[pocket].itemSlots[i].quantity -= count;
- count = 0;
- }
- else
- {
- count -= gBagPockets[pocket].itemSlots[i].quantity;
- gBagPockets[pocket].itemSlots[i].quantity = 0;
- }
- if (gBagPockets[pocket].itemSlots[i].quantity == 0)
- gBagPockets[pocket].itemSlots[i].itemId = 0;
- if (count == 0)
- return TRUE;
- }
- }
- return TRUE;
-}
-
-u8 GetPocketByItemId(u16 itemId)
-{
- return ItemId_GetPocket(itemId);
-}
-
-void ClearItemSlots(struct ItemSlot *itemSlots, u8 b)
-{
- u16 i;
-
- for (i = 0; i < b; i++)
- {
- itemSlots[i].itemId = 0;
- itemSlots[i].quantity = 0;
- }
-}
-
-static s32 FindFreePCItemSlot(void)
-{
- s8 i;
-
- for (i = 0; i < 50; i++)
- {
- if (gSaveBlock1.pcItems[i].itemId == 0)
- return i;
- }
- return -1;
-}
-
-u8 CountUsedPCItemSlots(void)
-{
- u8 usedSlots = 0;
- u8 i;
-
- for (i = 0; i < 50; i++)
- {
- if (gSaveBlock1.pcItems[i].itemId != 0)
- usedSlots++;
- }
- return usedSlots;
-}
-
-bool8 CheckPCHasItem(u16 itemId, u16 count)
-{
- u8 i;
-
- for (i = 0; i < 50; i++)
- {
- if (gSaveBlock1.pcItems[i].itemId == itemId && gSaveBlock1.pcItems[i].quantity >= count)
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 AddPCItem(u16 itemId, u16 count)
-{
- u8 i;
- s8 freeSlot;
- struct ItemSlot newItems[50];
-
- //Copy PC items
- memcpy(newItems, gSaveBlock1.pcItems, sizeof(newItems));
-
- //Use any item slots that already contain this item
- for (i = 0; i < 50; i++)
- {
- if (newItems[i].itemId == itemId)
- {
- if (newItems[i].quantity + count <= 999)
- {
- newItems[i].quantity += count;
- memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems));
- return TRUE;
- }
- count += newItems[i].quantity - 999;
- newItems[i].quantity = 999;
- if (count == 0)
- {
- memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems));
- return TRUE;
- }
- }
- }
-
- //Put any remaining items into a new item slot.
- if (count > 0)
- {
- freeSlot = FindFreePCItemSlot();
- if (freeSlot == -1)
- return FALSE;
- newItems[freeSlot].itemId = itemId;
- newItems[freeSlot].quantity = count;
- }
-
- //Copy items back to the PC
- memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems));
- return TRUE;
-}
-
-void RemovePCItem(u8 index, u16 count)
-{
- gSaveBlock1.pcItems[index].quantity -= count;
- if (gSaveBlock1.pcItems[index].quantity == 0)
- {
- gSaveBlock1.pcItems[index].itemId = 0;
- CompactPCItems();
- }
-}
-
-static void CompactPCItems(void)
-{
- u16 i;
- u16 j;
-
- for (i = 0; i < 49; i++)
- {
- for (j = i + 1; j <= 49; j++)
- {
- if (gSaveBlock1.pcItems[i].itemId == 0)
- {
- struct ItemSlot temp = gSaveBlock1.pcItems[i];
- gSaveBlock1.pcItems[i] = gSaveBlock1.pcItems[j];
- gSaveBlock1.pcItems[j] = temp;
- }
- }
- }
-}
-
-void SwapRegisteredBike(void)
-{
- switch (gSaveBlock1.registeredItem)
- {
- case 0x103:
- gSaveBlock1.registeredItem = 0x110;
- break;
- case 0x110:
- gSaveBlock1.registeredItem = 0x103;
- break;
- }
-}
-
-static u16 SanitizeItemId(u16 itemId)
-{
- if (itemId >= ARRAY_COUNT(gItems))
- return 0;
- else
- return itemId;
-}
-
-const struct Item *ItemId_GetItem(u16 itemId)
-{
- return &gItems[SanitizeItemId(itemId)];
-}
-
-u16 ItemId_GetId(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].itemId;
-}
-
-u16 ItemId_GetPrice(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].price;
-}
-
-u8 ItemId_GetHoldEffect(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].holdEffect;
-}
-
-u8 ItemId_GetHoldEffectParam(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].holdEffectParam;
-}
-
-const u8 *ItemId_GetDescription(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].description;
-}
-
-bool32 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c)
-{
- u32 r5 = c + 1;
- const u8 *description = gItems[SanitizeItemId(itemId)].description;
- u8 *str = a;
-
- for (;;)
- {
- if (*description == 0xFF || *description == 0xFE)
- {
- r5--;
- if (r5 == 0)
- {
- *str = 0xFF;
- return TRUE;
- }
- if (*description == 0xFF)
- return FALSE;
- str = a;
- description++;
- }
- else
- *(str++) = *(description++);
- }
-}
-
-u8 ItemId_GetImportance(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].importance;
-}
-
-u8 ItemId_GetUnknownValue(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].unk19;
-}
-
-u8 ItemId_GetPocket(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].pocket;
-}
-
-u8 ItemId_GetType(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].type;
-}
-
-ItemUseFunc ItemId_GetFieldFunc(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].fieldUseFunc;
-}
-
-u8 ItemId_GetBattleUsage(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].battleUsage;
-}
-
-ItemUseFunc ItemId_GetBattleFunc(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].battleUseFunc;
-}
-
-u8 ItemId_GetSecondaryId(u16 itemId)
-{
- return gItems[SanitizeItemId(itemId)].secondaryId;
-}