pokeemerald/src/decoration_inventory.c
2017-10-23 14:40:22 +02:00

190 lines
3.9 KiB
C

// Includes
#include "global.h"
#include "decoration.h"
#include "decoration_inventory.h"
// Static type declarations
// Static RAM declarations
EWRAM_DATA struct DecorationInventory gDecorationInventories[8] = {};
// Static ROM declarations
// .rodata
// .text
#define SET_DECOR_INV(i, ptr) {\
gDecorationInventories[i].items = ptr;\
gDecorationInventories[i].size = sizeof(ptr);\
}
void SetDecorationInventoriesPointers(void)
{
SET_DECOR_INV(0, gSaveBlock1Ptr->decorDesk);
SET_DECOR_INV(1, gSaveBlock1Ptr->decorChair);
SET_DECOR_INV(2, gSaveBlock1Ptr->decorPlant);
SET_DECOR_INV(3, gSaveBlock1Ptr->decorOrnament);
SET_DECOR_INV(4, gSaveBlock1Ptr->decorMat);
SET_DECOR_INV(5, gSaveBlock1Ptr->decorPoster);
SET_DECOR_INV(6, gSaveBlock1Ptr->decorDoll);
SET_DECOR_INV(7, gSaveBlock1Ptr->decorCushion);
sub_8126968();
}
static void ClearDecorationInventory(u8 idx)
{
u8 i;
for (i = 0; i < gDecorationInventories[idx].size; i ++)
{
gDecorationInventories[idx].items[i] = DECOR_NONE;
}
}
void ClearDecorationInventories(void)
{
u8 idx;
for (idx = 0; idx < 8; idx ++)
{
ClearDecorationInventory(idx);
}
}
s8 GetFirstEmptyDecorSlot(u8 idx)
{
s8 i;
for (i = 0; i < (s8)gDecorationInventories[idx].size; i ++)
{
if (gDecorationInventories[idx].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 idx;
i = 0;
if (decor == DECOR_NONE)
{
return 0;
}
for (i = 0; i < gDecorationInventories[gDecorations[decor].category].size; i ++)
{
idx = gDecorations[decor].category;
if (gDecorationInventories[idx].items[i] == decor)
{
gDecorationInventories[idx].items[i] = DECOR_NONE;
CondenseDecorationCategoryN(idx);
return 1;
}
}
return 0;
}
void CondenseDecorationCategoryN(u8 idx)
{
u8 i;
u8 j;
u8 tmp;
for (i = 0; i < gDecorationInventories[idx].size; i ++)
{
for (j = i + 1; j < gDecorationInventories[idx].size; j ++)
{
if (gDecorationInventories[idx].items[j] != DECOR_NONE && (gDecorationInventories[idx].items[i] == DECOR_NONE || gDecorationInventories[idx].items[i] > gDecorationInventories[idx].items[j]))
{
tmp = gDecorationInventories[idx].items[i];
gDecorationInventories[idx].items[i] = gDecorationInventories[idx].items[j];
gDecorationInventories[idx].items[j] = tmp;
}
}
}
}
u8 CountDecorationCategoryN(u8 idx)
{
u8 i;
u8 ct;
ct = 0;
for (i = 0; i < gDecorationInventories[idx].size; i ++)
{
if (gDecorationInventories[idx].items[i] != DECOR_NONE)
{
ct ++;
}
}
return ct;
}
u8 CountDecorations(void)
{
u8 idx;
u8 ct;
ct = 0;
for (idx = 0; idx < 8; idx ++)
{
ct += CountDecorationCategoryN(idx);
}
return ct;
}