pmd-red/src/items.c
Dennis da7b30612f
More work on item related functions (#44)
* decompile sub_8091290

* decompile sub_80912c8

* rename functions / struct field

* more names

* decompile 80913A0

* decompile GetItemMove

* decompile sub_80913E0

* rename function

* decompile CanSellItem function

* rename inventory struct

* add some item check functions

* fix renaming stuff

* this file shouldnt have been here

* forgot merge conflict

* decompile more item functions

* rename some stuff

* fix HM/TM naming

* Update src/code_801AFA4.c

Use enum value for USED_TM

* Fix incorrect value

* decompile sub_80915F4

* decompile HasGummiItem

* decompiled another function and renamed stuff

* decompile 2 smaller functions

* more functions

* more decompiling and renaming

* redo change that was undone in the merge
2021-07-12 14:10:32 -05:00

298 lines
6.5 KiB
C

#include "global.h"
#include "file_system.h"
#include "item.h"
#include "team_inventory.h"
#include "random.h"
#include "pokemon.h"
extern struct TeamInventory *gTeamInventory_203B460;
extern struct TeamInventory gUnknown_20389A8;
extern struct FileArchive gSystemFileArchive;
extern const char gUnknown_8109764;
extern u16 *gGummiStatBoostLUT;
EWRAM_DATA struct OpenedFile *gItemParametersFile;
EWRAM_DATA struct Item *gItemParametersData;
extern u8 GetItemType(u8);
extern u32 GetItemUnkThrow(u8, u32);
extern bool8 CanSellItem(u8);
extern void sub_8090F58(void*, u8 *, struct ItemSlot *, u32);
void LoadItemParameters(void)
{
gTeamInventory_203B460 = &gUnknown_20389A8;
gItemParametersFile = OpenFileAndGetFileDataPtr(&gUnknown_8109764,&gSystemFileArchive);
gItemParametersData = (struct Item *) gItemParametersFile->data;
}
struct TeamInventory *GetMoneyItemsInfo(void)
{
return &gUnknown_20389A8;
}
void InitializeMoneyItems(void)
{
s32 i;
for(i = 0; i < INVENTORY_SIZE; i++)
{
gTeamInventory_203B460->teamItems[i].unk0 = 0;
}
for(i = 0; i < 0xF0; i++)
{
gTeamInventory_203B460->teamStorage[i] = 0;
}
for(i = 0; i < 8; i++)
{
xxx_init_unk230_substruct(i);
}
gTeamInventory_203B460->teamMoney = 0;
gTeamInventory_203B460->teamSavings = 0;
}
s32 GetNumberOfFilledInventorySlots(void)
{
s32 i;
s32 count;
count = 0;
for(i = 0; i < INVENTORY_SIZE; i++)
{
if ((gTeamInventory_203B460->teamItems[i].unk0 & 1) != 0) {
count++;
}
}
return count;
}
bool8 IsThrowableItem(u8 itemIndex)
{
if ((GetItemType(itemIndex) != ITEM_TYPE_THROWABLE) && (GetItemType(itemIndex) != ITEM_TYPE_ROCK)) {
return FALSE;
}
else {
return TRUE;
}
}
void sub_8090A8C(struct ItemSlot *param_1,u8 itemIndex,u8 param_3)
{
u32 uVar3;
u32 uVar4;
if (itemIndex != ITEM_ID_NOTHING) {
param_1->unk0 = 1;
param_1->itemIndex = itemIndex;
if (IsThrowableItem(itemIndex)) {
uVar3 = GetItemUnkThrow(itemIndex,0);
uVar4 = GetItemUnkThrow(itemIndex,1);
param_1->numItems = RandomRange(uVar3,uVar4);
}
else {
if (GetItemType(itemIndex) == ITEM_TYPE_MONEY) {
param_1->numItems = 1;
}
else {
param_1->numItems = 0;
}
}
if (param_3 != 0) {
param_1->unk0 |= 8;
}
}
else {
param_1->unk0 = 0;
param_1->itemIndex = ITEM_ID_NOTHING;
param_1->numItems = 0;
}
}
void sub_8090B08(struct ItemSlot_ALT *param_1,u8 itemIndex)
{
u32 uVar2;
u32 uVar3;
if (itemIndex != ITEM_ID_NOTHING) {
param_1->itemIndex = itemIndex;
if (IsThrowableItem(itemIndex)) {
uVar2 = GetItemUnkThrow(itemIndex,0);
uVar3 = GetItemUnkThrow(itemIndex,1);
param_1->numItems = RandomRange(uVar2,uVar3);
} else {
if (GetItemType(itemIndex) == ITEM_TYPE_MONEY) {
param_1->numItems = 1;
}
else {
param_1->numItems = 0;
}
}
}
else {
param_1->itemIndex = 0;
param_1->numItems = 0;
}
}
void sub_8090B64(struct ItemSlot *param_1, struct ItemSlot_ALT *param_2)
{
u8 r6;
if(param_2->itemIndex != ITEM_ID_NOTHING)
{
param_1->unk0 = 1;
param_1->itemIndex = param_2->itemIndex;
r6 = IsThrowableItem(param_1->itemIndex);
if(r6 != 0 || GetItemType(param_1->itemIndex) == ITEM_TYPE_MONEY)
{
param_1->numItems = param_2->numItems;
}
else
{
if(param_1->itemIndex == ITEM_ID_USED_TM)
{
param_1->numItems = param_2->numItems;
}
else
{
param_1->numItems = r6;
}
}
}
else
{
param_1->itemIndex = ITEM_ID_NOTHING;
param_1->numItems = 0;
param_1->unk0 = 0;
}
}
void sub_8090BB0(struct ItemSlot_ALT *param_1,struct ItemSlot *param_2)
{
if ((param_2->unk0 & 1) != 0) {
param_1->itemIndex = param_2->itemIndex;
param_1->numItems = param_2->numItems;
}
else {
param_1->itemIndex = ITEM_ID_NOTHING;
}
}
u8 GetItemType(u8 index)
{
return gItemParametersData[index].type;
}
s32 GetStackBuyValue(struct ItemSlot *param_1)
{
if (param_1->itemIndex == ITEM_ID_POKE) {
return GetMoneyValue(param_1);
}
else {
if (IsThrowableItem(param_1->itemIndex)) {
return gItemParametersData[param_1->itemIndex].buyPrice * param_1->numItems;
}
else {
return gItemParametersData[param_1->itemIndex].buyPrice;
}
}
}
s32 GetStackSellValue(struct ItemSlot *param_1)
{
if (param_1->itemIndex == ITEM_ID_POKE) {
return GetMoneyValue(param_1);
}
else {
if (IsThrowableItem(param_1->itemIndex)) {
return gItemParametersData[param_1->itemIndex].sellPrice * param_1->numItems;
}
else {
return gItemParametersData[param_1->itemIndex].sellPrice;
}
}
}
s32 GetStackBuyPrice(struct ItemSlot *param_1)
{
if (!CanSellItem(param_1->itemIndex)) {
return 0;
}
else {
if (IsThrowableItem(param_1->itemIndex)) {
return gItemParametersData[param_1->itemIndex].buyPrice * param_1->numItems;
}
else {
return gItemParametersData[param_1->itemIndex].buyPrice;
}
}
}
s32 GetStackSellPrice(struct ItemSlot *param_1)
{
if (!CanSellItem(param_1->itemIndex)) {
return 0;
}
else {
if (IsThrowableItem(param_1->itemIndex)) {
return gItemParametersData[param_1->itemIndex].sellPrice * param_1->numItems;
}
else {
return gItemParametersData[param_1->itemIndex].sellPrice;
}
}
}
s32 GetItemBuyPrice(u8 itemIndex)
{
return gItemParametersData[itemIndex].buyPrice;
}
s32 GetItemSellPrice(u8 itemIndex)
{
return gItemParametersData[itemIndex].sellPrice;
}
s32 GetItemOrder(u8 itemIndex)
{
return gItemParametersData[itemIndex].order;
}
u8 GetItemPalette(u8 itemIndex)
{
return gItemParametersData[itemIndex].palette;
}
u8 GetItemCategory(u8 itemIndex)
{
return gItemParametersData[itemIndex].category;
}
u32 GetItemUnkThrow(u8 itemIndex, u32 r1)
{
return gItemParametersData[itemIndex].unkThrow1B[r1];
}
u8 *GetItemDescription(u8 itemIndex)
{
return gItemParametersData[itemIndex].descriptionPointer;
}
u32 GetItemUnkFood(u8 itemIndex, u32 r1)
{
return gItemParametersData[itemIndex].unkFood1[r1];
}
void sub_8090DC4(void* param_1,u8 itemIndex,u32 param_3)
{
char acStack104 [80];
struct ItemSlot unkItem;
strncpy(acStack104,gItemParametersData[itemIndex].namePointer,0x50);
sub_8090A8C(&unkItem,itemIndex,0);
unkItem.numItems = 1;
sub_8090F58(param_1,acStack104,&unkItem,param_3);
}