diff options
Diffstat (limited to 'src/kangaskhan_storage_3.c')
-rw-r--r-- | src/kangaskhan_storage_3.c | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/src/kangaskhan_storage_3.c b/src/kangaskhan_storage_3.c index e5382c3..f1ce8ce 100644 --- a/src/kangaskhan_storage_3.c +++ b/src/kangaskhan_storage_3.c @@ -1,9 +1,349 @@ #include "global.h" +#include "kangaskhan_storage.h" +#include "team_inventory.h" + +extern struct unkStruct_203B20C *gUnknown_203B20C; extern u32 sub_801B410(); extern void sub_801B450(); extern void sub_8017F10(u32); +extern u8 sub_801CF14(u32); + +struct HeldItem_Alt { + union tempHeld + { + struct HeldItem norm; + u32 full_bits; + } temp; +}; + +extern u8 sub_8012FD8(u32 *r0); +extern void sub_8013114(u32 *, s32 *); +extern void sub_801CBB8(void); +extern void sub_8017F10(u32); +extern void sub_8012EA4(u32 *, u32); + +bool8 IsNotMoneyOrUsedTMItem(u8 id); +extern u8 sub_801ADA0(s32); +extern void sub_801A928(void); +extern void sub_8099690(u32); +extern u32 sub_801A6E8(u32); + +extern u32 sub_8013BBC(u32 *); +extern u32 sub_801CA08(u32); +extern void sub_8018280(void); + +extern void sub_801CF94(void); +extern u8 sub_801CB24(); +extern u32 sub_801CFB8(void); +extern void sub_801AD34(u32); +extern u32 sub_801CFE0(u8); + +extern u32 sub_801A8AC(void); +extern u32 sub_801AEA8(void); +extern u32 sub_801AED0(u32); +extern void sub_801AE84(void); +extern u8 sub_801CF50(u32); + + +void sub_8018588(void) +{ + s32 temp; + temp = 0; + + if(sub_8012FD8(&gUnknown_203B20C->unk70) == 0) + { + sub_8013114(&gUnknown_203B20C->unk70, &temp); + if(temp != 1) gUnknown_203B20C->unk14 = temp; + } + + switch(temp) + { + case 2: + if((GetNumberOfFilledInventorySlots() != 0) && sub_801CF50(0) == 0) + sub_8017F10(4); + else + sub_8012EA4(&gUnknown_203B20C->unk70, 1);; + break; + case 3: + if(sub_801CF14(1) != 0) + sub_8012EA4(&gUnknown_203B20C->unk70, 1); + else + sub_8017F10(0xA); + break; + case 1: + sub_8017F10(3); + break; + } +} + +void sub_8018620(void) +{ + s32 iVar6; + switch(sub_801A6E8(1)) + { + case 3: + if(sub_801AEA8() != 0) + { + for(iVar6 = 0; iVar6 < INVENTORY_SIZE; iVar6++) + { + if(sub_801AED0(iVar6) != 0) + { + MoveToStorage(&gTeamInventory_203B460->teamItems[iVar6]); + gTeamInventory_203B460->teamItems[iVar6].itemIndex = 0; + gTeamInventory_203B460->teamItems[iVar6].itemFlags = 0; + } + } + FillInventoryGaps(); + sub_801AE84(); + if(GetNumberOfFilledInventorySlots() == 0) + { + sub_801A928(); + sub_8017F10(1); + } + else + { + sub_8017F10(5); + } + } + else + { + gUnknown_203B20C->unkC = sub_801A8AC(); + gUnknown_203B20C->unk8 = gTeamInventory_203B460->teamItems[gUnknown_203B20C->unkC]; + sub_8017F10(6); + } + break; + case 4: + gUnknown_203B20C->unkC = sub_801A8AC(); + gUnknown_203B20C->unk8 = gTeamInventory_203B460->teamItems[gUnknown_203B20C->unkC]; + sub_8017F10(7); + break; + case 2: + sub_801A928(); + sub_8017F10(1); + break; + } +} + +void sub_80186F8(void) +{ + struct HeldItem_Alt item; + u16 cast; + s32 iVar6; + u8 iVar6_32; + + switch(sub_801CA08(1)) + { + case 3: + if(sub_801CFB8() != 0) + { + for(iVar6 = 0; iVar6 < NUMBER_OF_ITEM_IDS; iVar6++) + { + iVar6_32 = iVar6; // dumb cast needed to match + if(sub_801CFE0(iVar6) != 0) + { + item.temp.full_bits = (item.temp.full_bits & 0xffffff00) | iVar6_32; + if(IsThrowableItem(item.temp.norm.itemIndex)) + if(gTeamInventory_203B460->teamStorage[item.temp.norm.itemIndex] > 0x63) + { + item.temp.full_bits = (item.temp.full_bits & 0xffff00ff) | (0xC6 << 7); + } + else + { + cast = gTeamInventory_203B460->teamStorage[item.temp.norm.itemIndex] << 8; + item.temp.full_bits = (item.temp.full_bits & 0xffff00ff) | cast; + } + else + { + item.temp.full_bits = (item.temp.full_bits & 0xffff00ff) | (0x80 << 1); + } + gTeamInventory_203B460->teamStorage[item.temp.norm.itemIndex] -= item.temp.norm.numItems; + sub_8091274((struct HeldItem *)&item); + } + } + FillInventoryGaps(); + sub_801CF94(); + if((sub_801CF14(1) == 0) && (GetNumberOfFilledInventorySlots() < INVENTORY_SIZE)) + sub_8017F10(0xB); + else + { + sub_801CBB8(); + sub_8017F10(1); + } + } + else + { + gUnknown_203B20C->itemIndex = sub_801CB24(); + xxx_init_itemslot_8090A8C(&gUnknown_203B20C->unk8, gUnknown_203B20C->itemIndex, 0); + gUnknown_203B20C->unk8.numItems = 1; + sub_8017F10(0xD); + } + break; + case 4: + gUnknown_203B20C->itemIndex = sub_801CB24(); + xxx_init_itemslot_8090A8C(&gUnknown_203B20C->unk8, gUnknown_203B20C->itemIndex, 0); + gUnknown_203B20C->unk8.numItems = 1; + sub_8017F10(0xE); + break; + case 2: + sub_801CBB8(); + sub_8017F10(1); + break; + case 1: + sub_801AD34(0); + break; + } +} + +void sub_8018854(void) +{ + struct HeldItem_Alt item; + u32 itemsCast; + u32 indexCast; + + sub_801CA08(0); + sub_8012FD8(&gUnknown_203B20C->unk70); + + switch(sub_8013BBC(&gUnknown_203B20C->unkC0)) + { + case 3: + gUnknown_203B20C->unk8.numItems = gUnknown_203B20C->unkC0; + + gTeamInventory_203B460->teamStorage[gUnknown_203B20C->unk8.itemIndex] -= gUnknown_203B20C->unk8.numItems; + + indexCast = gUnknown_203B20C->unk8.itemIndex; + item.temp.full_bits = (item.temp.full_bits & 0xffffff00) | indexCast; + + itemsCast = (gUnknown_203B20C->unk8.numItems << 8); + item.temp.full_bits = (item.temp.full_bits & 0xffff00ff) | itemsCast; + + sub_8091274((struct HeldItem *)&item); + if(sub_801CF14(1) == 0) + if(GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE) + { + error: + sub_801CBB8(); + sub_8017F10(0x1); + } + else + sub_8017F10(0xB); + else + goto error; + break; + case 2: + sub_8017F10(0xB); + break; + case 1: + sub_8018280(); + break; + case 0: + break; + } +} + +void sub_8018904(void) +{ + s32 temp; + + temp = 0; + + sub_801A6E8(0); + if(sub_8012FD8(&gUnknown_203B20C->unk70) == 0) + { + sub_8013114(&gUnknown_203B20C->unk70, &temp); + if(temp != 1) gUnknown_203B20C->unk18 = temp; + } + switch(temp) + { + case 2: + if(IsNotMoneyOrUsedTMItem(gUnknown_203B20C->unk8.itemIndex)) + if(sub_801ADA0(gUnknown_203B20C->unkC) == 0) + error: + sub_8012EA4(&gUnknown_203B20C->unk70, 1); + else + { + MoveToStorage(&gUnknown_203B20C->unk8); + ShiftItemsDownFrom(gUnknown_203B20C->unkC); + FillInventoryGaps(); + if(GetNumberOfFilledInventorySlots() == 0) + { + sub_801A928(); + sub_8017F10(1); + } + else + sub_8017F10(5); + } + else + goto error; + break; + case 4: + sub_8099690(0); + sub_8017F10(7); + break; + case 1: + sub_8017F10(5); + break; + } +} + +void sub_80189C8(void) +{ + struct HeldItem_Alt item; + s32 temp; + u32 itemsCast; + u32 indexCast; + + temp = 0; + + sub_801CA08(0); + if(sub_8012FD8(&gUnknown_203B20C->unk70) == 0) + { + sub_8013114(&gUnknown_203B20C->unk70, &temp); + if(temp != 1) gUnknown_203B20C->unk1C = temp; + } + switch(temp) + { + case 3: + if(GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE) + sub_8012EA4(&gUnknown_203B20C->unk70, 1); + else if(IsThrowableItem(gUnknown_203B20C->unk8.itemIndex)) + sub_8017F10(0xC); + else + { + gTeamInventory_203B460->teamStorage[gUnknown_203B20C->unk8.itemIndex] -= gUnknown_203B20C->unk8.numItems; + + indexCast = gUnknown_203B20C->unk8.itemIndex; + item.temp.full_bits = (item.temp.full_bits & 0xffffff00) | indexCast; + + itemsCast = (gUnknown_203B20C->unk8.numItems << 8); + item.temp.full_bits = (item.temp.full_bits & 0xffff00ff) | itemsCast; + + sub_8091274((struct HeldItem *)&item); + if(sub_801CF14(1) == 0) + if(GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE) + { + error: + sub_801CBB8(); + sub_8017F10(1); + } + else + { + sub_8017F10(0xB); + } + else + goto error; + } + break; + case 4: + sub_8017F10(0xE); + break; + case 1: + sub_8017F10(0xB); + break; + } +} + void sub_8018AC8(void) { switch(sub_801B410()) |