diff options
author | Seth Barberee <seth.barberee@gmail.com> | 2021-11-10 08:43:51 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-10 08:43:51 -0800 |
commit | 561ea52847f5a88dc6a9a79dbfc5c40f421cace5 (patch) | |
tree | 0566b8fe1cf46f027696ac7fc4db9febd739ee39 /src/kecleon_items_1.c | |
parent | 681ca68ac96e8d39f49eb2c9f42e5c1e1041f5e0 (diff) |
Luminous cave (#72)
* fully decomp luminous cave
* remove header file. this one isn't ready yet
* doc few fields and func
* doc more of luminous cave
Diffstat (limited to 'src/kecleon_items_1.c')
-rw-r--r-- | src/kecleon_items_1.c | 541 |
1 files changed, 539 insertions, 2 deletions
diff --git a/src/kecleon_items_1.c b/src/kecleon_items_1.c index 89cd19f..0dea887 100644 --- a/src/kecleon_items_1.c +++ b/src/kecleon_items_1.c @@ -8,6 +8,10 @@ #include "team_inventory.h" extern struct unkStruct_203B210 *gUnknown_203B210; +extern u8 gUnknown_80DB8E4[]; +extern u8 gUnknown_80DB8EC[]; +extern u8 gUnknown_80DB92C[]; +extern u8 gUnknown_80DB934[]; extern s32 sub_80144A4(s32 *); void UpdateKecleonStoreState(u32); @@ -18,11 +22,27 @@ extern void sub_8099690(u32); extern u8 sub_8012FD8(u32 *); extern void sub_8013114(u32 *, u32 *); extern u32 sub_8019EDC(u8); -extern void sub_801A2A8(u32); +extern u32 sub_801A2A8(u8); extern s32 sub_801A8AC(void); -extern u32 sub_801A6E8(u32); +extern u32 sub_801A6E8(u8); extern void sub_801A928(void); extern void DrawTeamMoneyBox(u32); +extern void sub_8008C54(u32); +extern void sub_80073B8(u32); +extern void sub_80073E0(u32); +extern s32 sub_8013800(void *, u32); +extern void ExpandPlaceholdersBuffer(u8 *, u8 *, ...); +extern void xxx_call_draw_string(s32 x, s32, u8 *, u32, u32); +extern void sub_801AE84(void); +extern void sub_8012D08(void *, u32); +extern void sub_801A998(void); +extern void sub_801A9E0(void); +extern void sub_801AEF8(void); +extern bool8 sub_801ADA0(u32); +extern u32 sub_801AEA8(void); + + +extern struct unkStruct_203B224 *gUnknown_203B224; struct unkStruct_203B214 {; @@ -47,6 +67,7 @@ struct unkStruct_203B214 }; extern struct unkStruct_203B214 *gUnknown_203B214; +extern struct unkStruct_203B214 *gUnknown_203B21C; struct ItemSlot_Alt { @@ -67,12 +88,22 @@ extern void sub_8013660(void *); extern struct UnkTextStruct2 gUnknown_80DB8CC; extern struct UnkTextStruct2 gUnknown_80DB8B4; +extern struct UnkTextStruct2 gUnknown_80DB8FC; +extern struct UnkTextStruct2 gUnknown_80DB944; +extern const struct UnkTextStruct2 gUnknown_80DB914; extern u16 gUnknown_203B218; +extern u16 gUnknown_203B220; +extern void sub_801A430(void); +extern void sub_801A4A4(void); extern void sub_8013984(u8 *); extern void sub_801A064(void); extern void sub_801A0D8(void); extern void AddMenuCursorSprite(void *); extern s32 xxx_count_inv_unk230(); +extern u8 sub_801A37C(void); +extern u16 gUnknown_203B228; +extern u16 gUnknown_203B22A; +extern struct UnkTextStruct2 gUnknown_80DB95C; void sub_8019B08(void) { @@ -368,3 +399,509 @@ void sub_801A010(void) gUnknown_203B214 = NULL; } } + +NAKED +void sub_801A064(void) +{ + asm_unified( + "\tpush {r4,lr}\n" + "\tldr r4, _0801A0D4\n" + "\tldr r0, [r4]\n" + "\tldrh r1, [r0, 0x20]\n" + "\tadds r0, 0x9C\n" + "\tmovs r2, 0\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tldrh r1, [r0, 0x1E]\n" + "\tadds r0, 0x9D\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x9E\n" + "\tmovs r1, 0xA\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x9F\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r4]\n" + "\tmovs r1, 0x1A\n" + "\tldrsh r0, [r0, r1]\n" + "\tmovs r1, 0xC\n" + "\tbl sub_80095E4\n" + "\tadds r0, 0x2\n" + "\tlsls r0, 16\n" + "\tldr r2, [r4]\n" + "\tldr r3, [r2, 0x34]\n" + "\tlsls r1, r3, 1\n" + "\tadds r1, r3\n" + "\tlsls r1, 3\n" + "\tadds r1, r2, r1\n" + "\tadds r1, 0x4A\n" + "\tasrs r3, r0, 16\n" + "\tlsrs r0, 16\n" + "\tstrh r0, [r1]\n" + "\tldr r1, [r2, 0x34]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 3\n" + "\tadds r2, r0\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x4C\n" + "\tstrh r3, [r2]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x3C\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0801A0D4: .4byte gUnknown_203B214"); +} + +void sub_801A0D8(void) +{ + struct HeldItem *heldItem; + s32 iVar2; + s32 y; + s32 iVar4; + u8 auStack204 [80]; + struct unkStruct_8090F58 local_7c; + u8 auStack112 [80]; + struct ItemSlot_Alt slot; + u8 temp_calc; + + // Needed for the shifts.. + u32 index_shift; + u32 numItems_shift; + + sub_8008C54(gUnknown_203B214->unk34); + sub_80073B8(gUnknown_203B214->unk34); + xxx_call_draw_string(gUnknown_203B214->unk1E * 8 + 10,0,gUnknown_80DB8E4, + gUnknown_203B214->unk34,0); + + for(iVar4 = 0; iVar4 < gUnknown_203B214->unk1A; iVar4++) + { + temp_calc = (gUnknown_203B214->unk1E * gUnknown_203B214->unk1C) + iVar4; + heldItem = xxx_get_inv_unk230_at_809185C(temp_calc); + + index_shift = heldItem->itemIndex << 16; + slot.temp.full_bits = (slot.temp.full_bits & 0xff00ffff) | index_shift; + + numItems_shift = heldItem->numItems << 8; + slot.temp.full_bits = (slot.temp.full_bits & 0xffff00ff) | numItems_shift; + + slot.temp.full_bits = (slot.temp.full_bits & 0xffffff00) | (ITEM_FLAG_EXISTS | ITEM_FLAG_FOR_SALE); + + local_7c.unk0 = 1; + local_7c.unk4 = 0; + local_7c.unk6 = 0x58; + local_7c.unk8 = 1; + sub_8090E14(auStack204,(struct ItemSlot *)&slot,&local_7c); + iVar2 = GetStackBuyPrice((struct ItemSlot *)&slot); + if (iVar2 <= gTeamInventory_203B460->teamMoney) { + y = sub_8013800(gUnknown_203B214,iVar4); + xxx_call_draw_string(8,y,auStack204,gUnknown_203B214->unk34,0); + } + else { + ExpandPlaceholdersBuffer(auStack112,gUnknown_80DB8EC,auStack204); + y = sub_8013800(gUnknown_203B214,iVar4); + xxx_call_draw_string(8,y,auStack112,gUnknown_203B214->unk34,0); + } + } + sub_80073E0(gUnknown_203B214->unk34); +} + +u32 sub_801A20C(u32 r0) +{ + if(xxx_count_non_empty_inv_unk250_8091A48() == 0) + { + return 0; + } + else + { + gUnknown_203B21C = MemoryAlloc(sizeof(struct unkStruct_203B214), 0x8); + gUnknown_203B21C->unk34 = r0; + gUnknown_203B21C->unk38 = &gUnknown_203B21C->unk3C[gUnknown_203B21C->unk34]; + sub_8006518(gUnknown_203B21C->unk3C); + gUnknown_203B21C->unk3C[gUnknown_203B21C->unk34] = gUnknown_80DB914; + gUnknown_203B21C->unk38->unk14 = gUnknown_203B21C->unk9C; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B21C->unk3C, 1, 1); + sub_8013818(gUnknown_203B21C, xxx_count_non_empty_inv_unk250_8091A48(), 0xA, r0); + gUnknown_203B21C->temp.unk18 = gUnknown_203B220; + sub_8013984((u8 *)gUnknown_203B21C); + sub_801A430(); + sub_801A4A4(); + return 1; + } +} + +u32 sub_801A2A8(u8 r0) +{ + struct ItemSlot_Alt slot; + struct HeldItem *return_var; + u32 r2; + u32 r3; + + if(r0 == 0) + { + sub_8013660(gUnknown_203B21C); + return 0; + } + else + { + switch(GetKeyPress(gUnknown_203B21C)) + { + case 2: + PlayMenuSoundEffect(1); + return 2; + case 1: + return_var = xxx_get_unk250_at_8091A90(sub_801A37C()); + + // NOTE: needs seperate vars to match + r2 = return_var->itemIndex << 16; + slot.temp.full_bits = (slot.temp.full_bits & 0xff00ffff) | r2; + r3 = return_var->numItems << 8; + slot.temp.full_bits = (slot.temp.full_bits & 0xffff00ff) | r3; + + if(GetStackBuyPrice((struct ItemSlot *)&slot) > gTeamInventory_203B460->teamMoney) + { + PlayMenuSoundEffect(2); + } + else + { + PlayMenuSoundEffect(0); + } + return 3; + case 4: + PlayMenuSoundEffect(4); + return 4; + default: + if(sub_80138B8(gUnknown_203B21C, 1) != 0) + { + sub_801A430(); + sub_801A4A4(); + return 1; + } + else + { + return 0; + } + } + } +} + +u8 sub_801A37C(void) +{ + return (gUnknown_203B21C->unk1E * gUnknown_203B21C->unk1C) + gUnknown_203B21C->temp.unk18_u8; +} + +void sub_801A398(u32 r0) +{ + u8 r0_u8; + + r0_u8 = r0; + + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B21C->unk3C, 0, 0); + gUnknown_203B21C->unk22 = xxx_count_non_empty_inv_unk250_8091A48(); + sub_8013984((u8 *)gUnknown_203B21C); + sub_801A430(); + sub_801A4A4(); + if(r0_u8) + AddMenuCursorSprite(gUnknown_203B21C); +} + +void sub_801A3DC(void) +{ + if(gUnknown_203B21C != NULL) + { + gUnknown_203B220 = gUnknown_203B21C->temp.unk18; + gUnknown_203B21C->unk3C[gUnknown_203B21C->unk34] = gUnknown_80DB8FC; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B21C->unk3C, 1, 1); + MemoryFree(gUnknown_203B21C); + gUnknown_203B21C = NULL; + } +} + +NAKED +void sub_801A430(void) +{ + asm_unified("\tpush {r4,lr}\n" + "\tldr r4, _0801A4A0\n" + "\tldr r0, [r4]\n" + "\tldrh r1, [r0, 0x20]\n" + "\tadds r0, 0x9C\n" + "\tmovs r2, 0\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tldrh r1, [r0, 0x1E]\n" + "\tadds r0, 0x9D\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x9E\n" + "\tmovs r1, 0xA\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x9F\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r4]\n" + "\tmovs r1, 0x1A\n" + "\tldrsh r0, [r0, r1]\n" + "\tmovs r1, 0xC\n" + "\tbl sub_80095E4\n" + "\tadds r0, 0x2\n" + "\tlsls r0, 16\n" + "\tldr r2, [r4]\n" + "\tldr r3, [r2, 0x34]\n" + "\tlsls r1, r3, 1\n" + "\tadds r1, r3\n" + "\tlsls r1, 3\n" + "\tadds r1, r2, r1\n" + "\tadds r1, 0x4A\n" + "\tasrs r3, r0, 16\n" + "\tlsrs r0, 16\n" + "\tstrh r0, [r1]\n" + "\tldr r1, [r2, 0x34]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 3\n" + "\tadds r2, r0\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x4C\n" + "\tstrh r3, [r2]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x3C\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0801A4A0: .4byte gUnknown_203B21C"); +} + +void sub_801A4A4(void) +{ + struct HeldItem *heldItem; + s32 iVar2; + s32 y; + s32 iVar4; + u8 auStack204 [80]; + struct unkStruct_8090F58 local_7c; + u8 auStack112 [80]; + struct ItemSlot_Alt slot; + u8 temp_calc; + + // Needed for the shifts.. + u32 index_shift; + u32 numItems_shift; + + sub_8008C54(gUnknown_203B21C->unk34); + sub_80073B8(gUnknown_203B21C->unk34); + xxx_call_draw_string(gUnknown_203B21C->unk1E * 8 + 10,0,gUnknown_80DB92C, + gUnknown_203B21C->unk34,0); + + for(iVar4 = 0; iVar4 < gUnknown_203B21C->unk1A; iVar4++) + { + temp_calc = (gUnknown_203B21C->unk1E * gUnknown_203B21C->unk1C) + iVar4; + heldItem = xxx_get_unk250_at_8091A90(temp_calc); + + index_shift = heldItem->itemIndex << 16; + slot.temp.full_bits = (slot.temp.full_bits & 0xff00ffff) | index_shift; + + numItems_shift = heldItem->numItems << 8; + slot.temp.full_bits = (slot.temp.full_bits & 0xffff00ff) | numItems_shift; + + slot.temp.full_bits = (slot.temp.full_bits & 0xffffff00) | (ITEM_FLAG_EXISTS | ITEM_FLAG_FOR_SALE); + + local_7c.unk0 = 1; + local_7c.unk4 = 0; + local_7c.unk6 = 0x58; + local_7c.unk8 = 1; + sub_8090E14(auStack204,(struct ItemSlot *)&slot,&local_7c); + iVar2 = GetStackBuyPrice((struct ItemSlot *)&slot); + if (iVar2 <= gTeamInventory_203B460->teamMoney) { + y = sub_8013800(gUnknown_203B21C,iVar4); + xxx_call_draw_string(8,y,auStack204,gUnknown_203B21C->unk34,0); + } + else { + ExpandPlaceholdersBuffer(auStack112,gUnknown_80DB934,auStack204); + y = sub_8013800(gUnknown_203B21C,iVar4); + xxx_call_draw_string(8,y,auStack112,gUnknown_203B21C->unk34,0); + } + } + sub_80073E0(gUnknown_203B21C->unk34); +} + +u32 sub_801A5D8(u32 param_1,int param_2,struct UnkTextStruct2_sub *param_3,u32 param_4) +{ + + if (GetNumberOfFilledInventorySlots() == 0) { + return 0; + } + else { + if (gUnknown_203B224 == NULL) { + gUnknown_203B224 = MemoryAlloc(sizeof(struct unkStruct_203B224),8); + } + gUnknown_203B224->unk0 = param_1; + FillInventoryGaps(); + sub_801AE84(); + + gUnknown_203B224->unk88 = param_2; + gUnknown_203B224->unk8C = &gUnknown_203B224->unk90[param_2]; + + sub_8006518(gUnknown_203B224->unk90); + gUnknown_203B224->unk90[gUnknown_203B224->unk88] = gUnknown_80DB95C; + + gUnknown_203B224->unk8C->unk14 = gUnknown_203B224->unkF0; + if (param_3 != NULL) { + gUnknown_203B224->unk90[gUnknown_203B224->unk88].unk08 = *param_3; + } + sub_8012D08(gUnknown_203B224->unk8C,param_4); + sub_8099690(1); + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B224->unk90,1,1); + sub_8013818(&gUnknown_203B224->unk54,GetNumberOfFilledInventorySlots(),param_4,param_2); + gUnknown_203B224->unk6C = gUnknown_203B228; + gUnknown_203B224->unk72 = gUnknown_203B22A; + sub_8013984((u8 *)&gUnknown_203B224->unk54); + sub_801A998(); + sub_801A9E0(); + return 1; + } +} + +u32 sub_801A6E8(u8 param_1) +{ + s32 iVar5; + struct ItemSlot local_10; + + if (param_1 == '\0') { + sub_8013660(&gUnknown_203B224->unk54); + return 0; + } + switch(GetKeyPress(&gUnknown_203B224->unk54)) { + case 2: + PlayMenuSoundEffect(1); + return 2; + case 1: + switch(gUnknown_203B224->unk0) { + case 0: + case 1: + case 2: + if (gUnknown_203B224->unk4[sub_801A8AC()] != 0) + PlayMenuSoundEffect(2); + else + PlayMenuSoundEffect(0); + break; + case 3: + if ((sub_801AEA8() != 0) || (sub_801ADA0(sub_801A8AC()) != '\0')) + PlayMenuSoundEffect(0); + else + PlayMenuSoundEffect(2); + break; + case 4: + local_10 = gTeamInventory_203B460->teamItems[sub_801A8AC()]; + if (CanSellItem(local_10.itemIndex) && (GetStackSellPrice(&local_10) + gTeamInventory_203B460->teamMoney < 100000)) + PlayMenuSoundEffect(0); + else + PlayMenuSoundEffect(2); + break; + case 5: + PlayMenuSoundEffect(0); + break; + } + return 3; + case 4: + PlayMenuSoundEffect(4); + return 4; + case 5: + case 6: + if (gUnknown_203B224->unk0 != 3) goto _0801A87C; + iVar5 = sub_801A8AC(); + if ((gUnknown_203B224->unk4[iVar5] != 0) || (sub_801ADA0(iVar5) != '\0')) { + PlayMenuSoundEffect(6); + gUnknown_203B224->unk4[iVar5] = gUnknown_203B224->unk4[iVar5] ^ 1; + sub_80138B8(&gUnknown_203B224->unk54,0); + sub_801A9E0(); + return 1; + } + else + { + PlayMenuSoundEffect(2); + goto _0801A87C; + } + case 3: + if (gUnknown_203B224->unk0 != 2) { + PlayMenuSoundEffect(5); + sub_801AEF8(); + sub_801A9E0(); + } + // NOTE: fallthrough needed here + default: +_0801A87C: + if (sub_80138B8(&gUnknown_203B224->unk54,1) != '\0') { + sub_801A998(); + sub_801A9E0(); + return 1; + } + else { + return 0; + } + break; + } +} + +s32 sub_801A8AC(void) +{ + return (gUnknown_203B224->unk72 * gUnknown_203B224->unk70) + gUnknown_203B224->unk6C; +} + +void sub_801A8D0(u32 r0) +{ + u8 r0_u8; + + r0_u8 = r0; + + sub_8099690(1); + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B224->unk90, 0, 0); + FillInventoryGaps(); + gUnknown_203B224->unk76 = GetNumberOfFilledInventorySlots(); + sub_8013984((u8 *)&gUnknown_203B224->unk54); + sub_801A998(); + sub_801A9E0(); + if(r0_u8) + AddMenuCursorSprite((u8 *)&gUnknown_203B224->unk54); +} + +void sub_801A928(void) +{ + if(gUnknown_203B224 != NULL) + { + gUnknown_203B228 = gUnknown_203B224->unk6C; + gUnknown_203B22A = gUnknown_203B224->unk72; + gUnknown_203B224->unk90[gUnknown_203B224->unk88] = gUnknown_80DB944; + sub_8099690(0); + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B224->unk90, 1, 1); + MemoryFree(gUnknown_203B224); + gUnknown_203B224 = NULL; + } +} + +void sub_801A998(void) +{ + gUnknown_203B224->unkF0[0] = gUnknown_203B224->unk74; + gUnknown_203B224->unkF0[1] = gUnknown_203B224->unk72; + gUnknown_203B224->unkF0[2] = 0xB; + gUnknown_203B224->unkF0[3] = 0; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B224->unk90, 1, 1); +} |