Files
PokemonEmeraldSafariFrontier/src/decoration_inventory.c
PikalaxALT c042e5148b Decoration + decoration_inventory (#89)
* SetDecorationInventoriesPointers

* ClearDecorationInventories

* CheckHasDecoration

* DecorationAdd

* DecorationCheckSpace

* DecorationRemove

* sub_8161A38

* CountDecorations; Funcion renaming

* Disassemble decoration data structs, tilemaps, and descriptions

* sub_8126968

* sub_81269D4

* through sub_8126A88

* through sub_8126B2C

* sub_8126B80

* sub_8126C08

* sub_8126C48

* sub_8126CA4

* sub_8126D10

* sub_8126E44

* sub_8126E8C

* sub_8126F68

* sub_8127058

* sub_8127088

* sub_81270E8

* through sub_8127208

* through sub_8127268

* sub_8127284

* through sub_81272F8

* sub_8127330

* through sub_8127480

* sub_81274A0

* sub_8127500; makefile now tells scaninc to scan headers

* Actual real fix to mapfile being in build/emerald instead of wd

* through sub_812759C

* through sub_812764C

* through sub_8127744

* through sub_81277BC

* sub_81277E8

* sub_8127814

* through sub_81279C4

* through sub_8127ACC

* sub_8127B04

* sub_8127B54

* sub_8127B90

* sub_8127D38

* sub_8127E18

* sub_8127F68

* sub_8128060

* ConfigureCameraObjectForPlacingDecoration

* SetUpPlacingDecorationPlayerAvatar

* sub_812826C

* through sub_8128414

* through sub_81284F4

* sub_812853C

* sub_8128950

* through sub_8128AAC

* through sub_8128BBC

* c1_overworld_prev_quest

* sub_8128C64

* sub_8128CD4

* sub_8128D10

* sub_8128DB4

* through sub_8128E18

* through sub_8129068

* sub_8129088

* through sub_81291E8

* sub_812925C

* sub_81292D0

* sub_81292E8

* gpu_pal_decompress_alloc_tag_and_upload

* AddDecorationIconObjectFromIconTable

* GetDecorationIconPicOrPalette

* AddDecorationIconObjectFromFieldObject

* AddDecorationIconObject

* through sub_8129708

* sub_81297F8

* sub_81298EC

* SetUpPuttingAwayDecorationPlayerAvatar

* sub_8129ABC

* sub_8129B34

* sub_8129BCC

* through sub_8129C74

* through sub_8129D8C

* sub_8129E0C

* sub_8129E74

* sub_8129F20

* sub_8129FC8

* sub_812A040

* nonmatching sub_812A0E8

* through sub_812A22C

* sub_812A25C

* sub_812A2C4

* through sub_812A39C

* Remaining fns in decoration.s

* Decompile decoration headers

* Decompile all remaining decoration data that had already been disassembled

* Disassemble two data objects

* Suggest structure of list menu template

* decompile through decoration list menu template

* Disassemble decoration icon graphics table

* Rip icon gfx

* Decompile deco icon table

* Decompile more data related to drawing decorations

* Decompile gUnknown_085A7250 structs

* Decompile two sprite templates

* Decompile remaining data in decoration.s

* Decompile decoration ewram

* deco -> decor
2017-10-22 17:55:07 -05: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;
}