tumbledemerald-legacy/src/decoration_inventory.c

160 lines
4.0 KiB
C

#include "global.h"
#include "constants/decorations.h"
#include "decoration.h"
#include "decoration_inventory.h"
EWRAM_DATA struct DecorationInventory gDecorationInventories[DECORCAT_COUNT] = {};
#define SET_DECOR_INV(i, ptr) {\
gDecorationInventories[i].items = ptr;\
gDecorationInventories[i].size = ARRAY_COUNT(ptr);\
}
void SetDecorationInventoriesPointers(void)
{
SET_DECOR_INV(DECORCAT_DESK, gSaveBlock1Ptr->decorationDesks);
SET_DECOR_INV(DECORCAT_CHAIR, gSaveBlock1Ptr->decorationChairs);
SET_DECOR_INV(DECORCAT_PLANT, gSaveBlock1Ptr->decorationPlants);
SET_DECOR_INV(DECORCAT_ORNAMENT, gSaveBlock1Ptr->decorationOrnaments);
SET_DECOR_INV(DECORCAT_MAT, gSaveBlock1Ptr->decorationMats);
SET_DECOR_INV(DECORCAT_POSTER, gSaveBlock1Ptr->decorationPosters);
SET_DECOR_INV(DECORCAT_DOLL, gSaveBlock1Ptr->decorationDolls);
SET_DECOR_INV(DECORCAT_CUSHION, gSaveBlock1Ptr->decorationCushions);
InitDecorationContextItems();
}
static void ClearDecorationInventory(u8 category)
{
u8 i;
for (i = 0; i < gDecorationInventories[category].size; i ++)
gDecorationInventories[category].items[i] = DECOR_NONE;
}
void ClearDecorationInventories(void)
{
u8 category;
for (category = 0; category < 8; category++)
ClearDecorationInventory(category);
}
s8 GetFirstEmptyDecorSlot(u8 category)
{
s8 i;
for (i = 0; i < (s8)gDecorationInventories[category].size; i++)
{
if (gDecorationInventories[category].items[i] == DECOR_NONE)
return i;
}
return -1;
}
bool8 CheckHasDecoration(u8 decor)
{
u8 i;
u8 category;
category = gDecorations[decor].category;
for (i = 0; i < gDecorationInventories[category].size; i ++)
{
if (gDecorationInventories[category].items[i] == decor)
return TRUE;
}
return FALSE;
}
bool8 DecorationAdd(u8 decor)
{
u8 category;
s8 idx;
if (decor == DECOR_NONE)
return FALSE;
category = gDecorations[decor].category;
idx = GetFirstEmptyDecorSlot(category);
if (idx == -1)
return FALSE;
gDecorationInventories[category].items[idx] = decor;
return TRUE;
}
bool8 DecorationCheckSpace(u8 decor)
{
if (decor == DECOR_NONE)
return FALSE;
if (GetFirstEmptyDecorSlot(gDecorations[decor].category) == -1)
return FALSE;
return TRUE;
}
s8 DecorationRemove(u8 decor)
{
u8 i;
u8 category;
i = 0;
if (decor == DECOR_NONE)
return 0;
for (i = 0; i < gDecorationInventories[gDecorations[decor].category].size; i ++)
{
category = gDecorations[decor].category;
if (gDecorationInventories[category].items[i] == decor)
{
gDecorationInventories[category].items[i] = DECOR_NONE;
CondenseDecorationsInCategory(category);
return 1;
}
}
return 0;
}
void CondenseDecorationsInCategory(u8 category)
{
u8 i;
u8 j;
u8 tmp;
for (i = 0; i < gDecorationInventories[category].size; i ++)
{
for (j = i + 1; j < gDecorationInventories[category].size; j ++)
{
if (gDecorationInventories[category].items[j] != DECOR_NONE && (gDecorationInventories[category].items[i] == DECOR_NONE || gDecorationInventories[category].items[i] > gDecorationInventories[category].items[j]))
{
tmp = gDecorationInventories[category].items[i];
gDecorationInventories[category].items[i] = gDecorationInventories[category].items[j];
gDecorationInventories[category].items[j] = tmp;
}
}
}
}
u8 GetNumOwnedDecorationsInCategory(u8 category)
{
u8 i;
u8 ct;
ct = 0;
for (i = 0; i < gDecorationInventories[category].size; i++)
{
if (gDecorationInventories[category].items[i] != DECOR_NONE)
ct++;
}
return ct;
}
u8 GetNumOwnedDecorations(void)
{
u8 category;
u8 count;
count = 0;
for (category = 0; category < DECORCAT_COUNT; category++)
count += GetNumOwnedDecorationsInCategory(category);
return count;
}