Shipwright/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_debug.c

655 lines
29 KiB
C

#include "z_kaleido_scope.h"
#include "textures/parameter_static/parameter_static.h"
// Positions of each input section in the editor
static u16 sSectionPositions[][2] = {
{ 64, 15 }, { 144, 15 }, { 170, 15 }, { 78, 35 }, { 104, 35 }, { 130, 35 }, { 156, 35 }, { 182, 35 },
{ 208, 35 }, { 78, 50 }, { 104, 50 }, { 130, 50 }, { 156, 50 }, { 182, 50 }, { 208, 50 }, { 78, 65 },
{ 104, 65 }, { 130, 65 }, { 156, 65 }, { 182, 65 }, { 208, 65 }, { 78, 80 }, { 104, 80 }, { 130, 80 },
{ 156, 80 }, { 182, 80 }, { 208, 80 }, { 78, 98 }, { 88, 98 }, { 98, 98 }, { 108, 98 }, { 118, 98 },
{ 128, 98 }, { 138, 98 }, { 148, 98 }, { 158, 98 }, { 168, 98 }, { 178, 98 }, { 188, 98 }, { 198, 98 },
{ 208, 98 }, { 218, 98 }, { 228, 98 }, { 238, 98 }, { 78, 115 }, { 90, 115 }, { 102, 115 }, { 114, 115 },
{ 126, 115 }, { 138, 115 }, { 150, 115 }, { 162, 115 }, { 202, 115 }, { 214, 115 }, { 226, 115 }, { 238, 115 },
{ 78, 132 }, { 90, 132 }, { 102, 132 }, { 114, 132 }, { 126, 132 }, { 138, 132 }, { 150, 132 }, { 162, 132 },
{ 174, 132 }, { 186, 132 }, { 198, 132 }, { 210, 132 }, { 78, 149 }, { 90, 149 }, { 102, 149 }, { 114, 149 },
{ 126, 149 }, { 138, 149 }, { 78, 166 }, { 90, 166 }, { 102, 166 }, { 114, 166 }, { 126, 166 }, { 138, 166 },
{ 150, 166 }, { 162, 166 }, { 174, 166 }, { 186, 166 }, { 198, 166 }, { 210, 166 }, { 210, 149 }, { 222, 149 },
{ 234, 149 }, { 78, 185 }, { 90, 185 }, { 145, 185 }, { 210, 185 },
};
// First section of each row in the editor (starting from the top)
static u16 sRowFirstSections[] = {
0x00, 0x03, 0x1B, 0x2C, 0x34, 0x38, 0x44, 0x4A, 0x56, 0x59, 0x5C,
};
// Maximum value of each upgrade type
static u8 sMaxUpgradeValues[] = {
3, 3, 3, 2, 2, 3, 3, 3,
};
// Item ID corresponding to each slot, aside from bottles and trade items
static s16 sSlotItems[] = {
ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE,
ITEM_SLINGSHOT, ITEM_OCARINA_FAIRY, ITEM_BOMBCHU, ITEM_HOOKSHOT, ITEM_ARROW_ICE, ITEM_FARORES_WIND,
ITEM_BOOMERANG, ITEM_LENS, ITEM_BEAN, ITEM_HAMMER, ITEM_ARROW_LIGHT, ITEM_NAYRUS_LOVE,
};
void KaleidoScope_DrawDebugEditorText(Gfx** gfxp) {
GfxPrint printer;
s32 pad[2];
GfxPrint_Init(&printer);
GfxPrint_Open(&printer, *gfxp);
GfxPrint_SetPos(&printer, 4, 2);
GfxPrint_SetColor(&printer, 255, 60, 0, 255);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ルピー"); // "Rupee"
GfxPrint_SetPos(&printer, 15, 2);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ハート"); // "Heart"
GfxPrint_SetPos(&printer, 26, 3);
GfxPrint_Printf(&printer, "%s", "/4");
GfxPrint_SetPos(&printer, 4, 5);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "アイテム"); // "Item"
GfxPrint_SetPos(&printer, 4, 13);
GfxPrint_Printf(&printer, "%s", "KEY");
GfxPrint_SetPos(&printer, 4, 15);
GfxPrint_Printf(&printer, "%s", GFXP_HIRAGANA "ソウビ"); // "Equipment"
GfxPrint_SetPos(&printer, 23, 14);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "ケン"); // "Sword"
GfxPrint_SetPos(&printer, 23, 15);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "タテ"); // "Shield"
GfxPrint_SetPos(&printer, 4, 17);
GfxPrint_Printf(&printer, "%s", "MAP");
GfxPrint_SetPos(&printer, 4, 19);
GfxPrint_Printf(&printer, "%s", GFXP_HIRAGANA "フウイン"); // "Seal"
GfxPrint_SetPos(&printer, 20, 19);
GfxPrint_Printf(&printer, "%s", GFXP_HIRAGANA "セイレイセキ"); // "Spiritual Stone"
GfxPrint_SetPos(&printer, 4, 21);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "オカリナ"); // "Ocarina"
GfxPrint_SetPos(&printer, 4, 24);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "コレクト"); // "Collect"
GfxPrint_SetPos(&printer, 14, 24);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "キンスタ"); // "Skulltula"
GfxPrint_SetPos(&printer, 23, 24);
GfxPrint_Printf(&printer, "%s", GFXP_KATAKANA "カケラ"); // "Gold Token"
GfxPrint_SetPos(&printer, 28, 24);
GfxPrint_Printf(&printer, "%s", "/4");
*gfxp = GfxPrint_Close(&printer);
GfxPrint_Destroy(&printer);
}
extern const char* digitTextures[];
void KaleidoScope_DrawDigit(GlobalContext* globalCtx, s32 digit, s32 rectLeft, s32 rectTop) {
OPEN_DISPS(globalCtx->state.gfxCtx);
gDPLoadTextureBlock(POLY_KAL_DISP++, digitTextures[digit], G_IM_FMT_I, G_IM_SIZ_8b, 8, 16, 0,
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
gSPTextureRectangle(POLY_KAL_DISP++, rectLeft << 2, rectTop << 2, (rectLeft + 8) << 2, (rectTop + 16) << 2,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
void KaleidoScope_DrawDebugEditor(GlobalContext* globalCtx) {
static s16 curSection = 0;
static s16 curRow = 0;
static s32 prevDBtnInput = 0;
static s32 heldDBtnTimer = 0;
PauseContext* pauseCtx = &globalCtx->pauseCtx;
Input* input = &globalCtx->state.input[0];
Gfx* gfx;
Gfx* gfxRef;
s16 spD8[4];
s16 slot;
s16 i;
s16 j;
s16 x;
s16 y;
s32 dBtnInput = input->cur.button & (BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT);
OPEN_DISPS(globalCtx->state.gfxCtx);
pauseCtx->stickRelX = input->rel.stick_x;
pauseCtx->stickRelY = input->rel.stick_y;
func_800944C4_KAL(globalCtx->state.gfxCtx);
gDPSetRenderMode(POLY_KAL_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
gDPSetCombineMode(POLY_KAL_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 0, 0, 0, 220);
gDPFillRectangle(POLY_KAL_DISP++, 24, 12, 298, 228);
gDPPipeSync(POLY_KAL_DISP++);
gDPSetCombineLERP(POLY_KAL_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
PRIMITIVE, 0);
gfxRef = POLY_KAL_DISP;
gfx = Graph_GfxPlusOne(gfxRef);
gSPDisplayList(OVERLAY_DISP++, gfx);
KaleidoScope_DrawDebugEditorText(&gfx);
gSPEndDisplayList(gfx++);
Graph_BranchDlist(gfxRef, gfx);
POLY_KAL_DISP = gfx;
gDPPipeSync(POLY_KAL_DISP++);
gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 0, 0, 255);
gDPSetEnvColor(POLY_KAL_DISP++, 0, 0, 0, 0);
// Current Health Quarter (X / 4)
KaleidoScope_DrawDigit(globalCtx, (gSaveContext.health % 0x10) / 4, 194, 15);
gDPPipeSync(POLY_KAL_DISP++);
gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 255, 255, 255, 255);
// Rupees
spD8[0] = spD8[1] = spD8[2] = 0;
spD8[3] = gSaveContext.rupees;
while (spD8[3] >= 1000) {
spD8[0]++;
spD8[3] -= 1000;
}
while (spD8[3] >= 100) {
spD8[1]++;
spD8[3] -= 100;
}
while (spD8[3] >= 10) {
spD8[2]++;
spD8[3] -= 10;
}
for (i = 0, x = 68; i < 4; i++, x += 10) {
KaleidoScope_DrawDigit(globalCtx, spD8[i], x, 15);
}
// Health capacity
spD8[2] = 0;
spD8[3] = gSaveContext.healthCapacity / 0x10;
while (spD8[3] >= 10) {
spD8[2]++;
spD8[3] -= 10;
}
KaleidoScope_DrawDigit(globalCtx, spD8[2], 146, 15);
KaleidoScope_DrawDigit(globalCtx, spD8[3], 156, 15);
// Health
spD8[2] = 0;
spD8[3] = gSaveContext.health / 0x10;
while (spD8[3] >= 10) {
spD8[2]++;
spD8[3] -= 10;
}
KaleidoScope_DrawDigit(globalCtx, spD8[2], 172, 15);
KaleidoScope_DrawDigit(globalCtx, spD8[3], 182, 15);
// Inventory
for (slot = 0, i = 0, y = 35; i < 4; i++, y += 15) {
for (j = 0, x = 78; j < 6; j++, slot++, x += 26) {
spD8[2] = 0;
if ((slot <= SLOT_BOW) || (slot == SLOT_SLINGSHOT) || (slot == SLOT_BOMBCHU) || (slot == SLOT_BEAN)) {
spD8[3] = AMMO(gAmmoItems[slot]);
} else if (slot == SLOT_OCARINA) {
spD8[3] = gSaveContext.inventory.items[slot];
} else {
spD8[3] = gSaveContext.inventory.items[slot];
}
if (spD8[3] != ITEM_NONE) {
while (spD8[3] >= 10) {
spD8[2]++;
spD8[3] -= 10;
}
} else {
spD8[2] = spD8[3] = 0;
}
KaleidoScope_DrawDigit(globalCtx, spD8[2], x, y);
KaleidoScope_DrawDigit(globalCtx, spD8[3], x + 10, y);
}
}
// Keys
for (spD8[1] = 78, i = 0; i < 17; i++) {
spD8[2] = 0;
if ((spD8[3] = gSaveContext.inventory.dungeonKeys[i]) >= 0) {
while (spD8[3] >= 10) {
spD8[2]++;
spD8[3] -= 10;
}
} else {
spD8[2] = spD8[3] = 0;
}
KaleidoScope_DrawDigit(globalCtx, spD8[3], spD8[1], 98);
spD8[1] += 10;
}
// Upgrades
for (spD8[1] = 78, i = 0; i < 8; i++, spD8[1] += 12) {
KaleidoScope_DrawDigit(globalCtx, CUR_UPG_VALUE(i), spD8[1], 115);
}
// Equipment
for (spD8[1] = 202, i = 0; i < 4; i++, spD8[1] += 12) {
KaleidoScope_DrawDigit(globalCtx, ALL_EQUIP_VALUE(i), spD8[1], 115);
}
// Dungeon Items
for (spD8[1] = 78, i = 0; i < 12; i++, spD8[1] += 12) {
spD8[2] = gSaveContext.inventory.dungeonItems[i] & gEquipMasks[0];
KaleidoScope_DrawDigit(globalCtx, spD8[2], spD8[1], 132);
}
// Medallions
for (spD8[1] = 78, i = 0; i < 6; i++, spD8[1] += 12) {
spD8[2] = 0;
if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST + i)) {
spD8[2] = 1;
}
KaleidoScope_DrawDigit(globalCtx, spD8[2], spD8[1], 149);
}
// Spiritual Stones
for (spD8[1] = 210, i = 0; i < 3; i++, spD8[1] += 12) {
spD8[2] = 0;
if (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD + i)) {
spD8[2] = 1;
}
KaleidoScope_DrawDigit(globalCtx, spD8[2], spD8[1], 149);
}
// Songs
for (spD8[1] = 78, i = 0; i < 12; i++, spD8[1] += 12) {
spD8[2] = 0;
if (CHECK_QUEST_ITEM(QUEST_SONG_MINUET + i)) {
spD8[2] = 1;
}
KaleidoScope_DrawDigit(globalCtx, spD8[2], spD8[1], 166);
}
// Other Quest Items
for (spD8[1] = 78, i = 0; i < 2; i++, spD8[1] += 12) {
spD8[2] = 0;
if (CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY + i)) {
spD8[2] = 1;
}
KaleidoScope_DrawDigit(globalCtx, spD8[2], spD8[1], 185);
}
// GS Tokens
spD8[3] = gSaveContext.inventory.gsTokens;
spD8[1] = 0;
spD8[2] = 0;
while (spD8[3] >= 100) {
spD8[1]++;
spD8[3] -= 100;
}
while (spD8[3] >= 10) {
spD8[2]++;
spD8[3] -= 10;
}
KaleidoScope_DrawDigit(globalCtx, spD8[1], 145, 185);
KaleidoScope_DrawDigit(globalCtx, spD8[2], 155, 185);
KaleidoScope_DrawDigit(globalCtx, spD8[3], 165, 185);
// Heart Pieces (X / 4)
KaleidoScope_DrawDigit(globalCtx, ((gSaveContext.inventory.questItems & 0xF0000000) & 0xF0000000) >> 0x1C, 210,
185);
// Handles navigating the menu to different sections with the D-Pad
// When the same direction is held, registers the input periodically based on a timer
if (dBtnInput == prevDBtnInput) {
heldDBtnTimer--;
if (heldDBtnTimer < 0) {
heldDBtnTimer = 1;
} else {
dBtnInput ^= prevDBtnInput;
}
} else {
prevDBtnInput = dBtnInput;
heldDBtnTimer = 16;
}
if (CHECK_BTN_ANY(dBtnInput, BTN_DDOWN)) {
if ((u32)++curRow > 10) {
curRow = 0;
}
curSection = sRowFirstSections[curRow];
} else if (CHECK_BTN_ANY(dBtnInput, BTN_DUP)) {
if (--curRow < 0) {
curRow = 22;
}
curSection = sRowFirstSections[curRow];
} else if (CHECK_BTN_ANY(dBtnInput, BTN_DLEFT)) {
if (--curSection < 0) {
curSection = 0x5C;
}
} else if (CHECK_BTN_ANY(dBtnInput, BTN_DRIGHT)) {
if (++curSection > 0x5C) {
curSection = 0;
}
}
// Handles the logic to change values based on the selected section
switch (curSection) {
case 0:
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
gSaveContext.rupees -= 100;
if (gSaveContext.rupees < 0) {
gSaveContext.rupees = 0;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
gSaveContext.rupees += 100;
if (gSaveContext.rupees >= 9999) {
gSaveContext.rupees = 9999;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
gSaveContext.rupees--;
if (gSaveContext.rupees < 0) {
gSaveContext.rupees = 0;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
gSaveContext.rupees++;
if (gSaveContext.rupees >= 9999) {
gSaveContext.rupees = 9999;
}
}
break;
case 1:
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
gSaveContext.healthCapacity -= 0x10;
if (gSaveContext.healthCapacity < 0x30) {
gSaveContext.healthCapacity = 0x30;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
gSaveContext.healthCapacity += 0x10;
if (gSaveContext.healthCapacity >= 0x140) {
gSaveContext.healthCapacity = 0x140;
}
}
break;
case 2:
if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
Health_ChangeBy(globalCtx, -4);
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
Health_ChangeBy(globalCtx, 4);
} else if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
Health_ChangeBy(globalCtx, -0x10);
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
Health_ChangeBy(globalCtx, 0x10);
}
break;
case 0x5C:
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if ((((gSaveContext.inventory.questItems & 0xF0000000) & 0xF0000000) >> 0x1C) != 0) {
gSaveContext.inventory.questItems -= 0x10000000;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if ((gSaveContext.inventory.questItems & 0xF0000000) <= 0x40000000) {
gSaveContext.inventory.questItems += 0x10000000;
}
}
break;
default:
if (curSection < 0x1B) {
i = curSection - 3;
if ((i <= SLOT_BOW) || (i == SLOT_SLINGSHOT) || (i == SLOT_BOMBCHU) || (i == SLOT_BEAN)) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
Inventory_DeleteItem(gAmmoItems[i], SLOT(gAmmoItems[i]));
AMMO(gAmmoItems[i]) = 0;
}
if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (i != INV_CONTENT(gAmmoItems[i])) {
INV_CONTENT(gAmmoItems[i]) = gAmmoItems[i];
}
AMMO(gAmmoItems[i])++;
if (AMMO(gAmmoItems[i]) > 99) {
AMMO(gAmmoItems[i]) = 99;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
AMMO(gAmmoItems[i])--;
if (AMMO(gAmmoItems[i]) < 0) {
AMMO(gAmmoItems[i]) = 0;
}
}
} else if (i == SLOT_OCARINA) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
Inventory_DeleteItem(ITEM_OCARINA_FAIRY, SLOT(ITEM_OCARINA_FAIRY));
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_OCARINA_FAIRY;
} else if ((gSaveContext.inventory.items[i] >= ITEM_OCARINA_FAIRY) &&
(gSaveContext.inventory.items[i] < ITEM_OCARINA_TIME)) {
gSaveContext.inventory.items[i]++;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_OCARINA_TIME;
} else if ((gSaveContext.inventory.items[i] > ITEM_OCARINA_FAIRY) &&
(gSaveContext.inventory.items[i] <= ITEM_OCARINA_TIME)) {
gSaveContext.inventory.items[i]--;
}
}
} else if (i == SLOT_HOOKSHOT) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
Inventory_DeleteItem(ITEM_HOOKSHOT, SLOT(ITEM_HOOKSHOT));
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_HOOKSHOT;
} else if ((gSaveContext.inventory.items[i] >= ITEM_HOOKSHOT) &&
(gSaveContext.inventory.items[i] < ITEM_LONGSHOT)) {
gSaveContext.inventory.items[i]++;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_LONGSHOT;
} else if ((gSaveContext.inventory.items[i] > ITEM_HOOKSHOT) &&
(gSaveContext.inventory.items[i] <= ITEM_LONGSHOT)) {
gSaveContext.inventory.items[i]--;
}
}
} else if (i == SLOT_TRADE_ADULT) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
Inventory_DeleteItem(ITEM_POCKET_EGG, SLOT(ITEM_POCKET_EGG));
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_POCKET_EGG;
} else if ((gSaveContext.inventory.items[i] >= ITEM_POCKET_EGG) &&
(gSaveContext.inventory.items[i] < ITEM_CLAIM_CHECK)) {
gSaveContext.inventory.items[i]++;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_CLAIM_CHECK;
} else if ((gSaveContext.inventory.items[i] > ITEM_POCKET_EGG) &&
(gSaveContext.inventory.items[i] <= ITEM_CLAIM_CHECK)) {
gSaveContext.inventory.items[i]--;
}
}
} else if (i == SLOT_TRADE_CHILD) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
Inventory_DeleteItem(ITEM_WEIRD_EGG, SLOT(ITEM_WEIRD_EGG));
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_WEIRD_EGG;
} else if ((gSaveContext.inventory.items[i] >= ITEM_WEIRD_EGG) &&
(gSaveContext.inventory.items[i] < ITEM_SOLD_OUT)) {
gSaveContext.inventory.items[i]++;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_SOLD_OUT;
} else if ((gSaveContext.inventory.items[i] > ITEM_WEIRD_EGG) &&
(gSaveContext.inventory.items[i] <= ITEM_SOLD_OUT)) {
gSaveContext.inventory.items[i]--;
}
}
} else if ((i >= SLOT_BOTTLE_1) && (i <= SLOT_BOTTLE_4)) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
Inventory_DeleteItem(ITEM_BOTTLE + i - SLOT_BOTTLE_1, SLOT(ITEM_BOTTLE) + i - SLOT_BOTTLE_1);
} else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_BOTTLE;
} else if ((gSaveContext.inventory.items[i] >= ITEM_BOTTLE) &&
(gSaveContext.inventory.items[i] <= ITEM_MILK_HALF)) {
gSaveContext.inventory.items[i]++;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_POE;
} else if ((gSaveContext.inventory.items[i] >= ITEM_POTION_RED) &&
(gSaveContext.inventory.items[i] <= ITEM_POE)) {
gSaveContext.inventory.items[i]--;
}
}
} else if (i < 0x1B) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT) ||
CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (i == SLOT_TRADE_ADULT) {
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = ITEM_BEAN;
} else {
Inventory_DeleteItem(ITEM_BEAN, SLOT(ITEM_BEAN));
}
} else {
j = sSlotItems[i];
osSyncPrintf("i=%d j=%d\n", i, j);
if (gSaveContext.inventory.items[i] == ITEM_NONE) {
gSaveContext.inventory.items[i] = j;
} else {
Inventory_DeleteItem(j, i);
}
}
}
}
} else if (curSection < 0x2C) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
i = curSection - 0x1B;
gSaveContext.inventory.dungeonKeys[i]--;
if (gSaveContext.inventory.dungeonKeys[i] < 0) {
gSaveContext.inventory.dungeonKeys[i] = -1;
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
i = curSection - 0x1B;
if (gSaveContext.inventory.dungeonKeys[i] < 0) {
gSaveContext.inventory.dungeonKeys[i] = 1;
} else {
gSaveContext.inventory.dungeonKeys[i]++;
if (gSaveContext.inventory.dungeonKeys[i] >= 9) {
gSaveContext.inventory.dungeonKeys[i] = 9;
}
}
}
} else {
if (curSection < 0x38) {
i = curSection - 0x2C;
if ((curSection >= 0x2C) && (curSection < 0x34)) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) ||
CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
if (CUR_UPG_VALUE(i) != 0) {
Inventory_ChangeUpgrade(i, CUR_UPG_VALUE(i) - 1);
}
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
if (CUR_UPG_VALUE(i) < sMaxUpgradeValues[i]) {
Inventory_ChangeUpgrade(i, CUR_UPG_VALUE(i) + 1);
}
}
} else {
i = curSection - 0x34;
if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
gSaveContext.inventory.equipment ^= (1 << gEquipShifts[i]);
}
if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
gSaveContext.inventory.equipment ^= (2 << gEquipShifts[i]);
}
if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
gSaveContext.inventory.equipment ^= (4 << gEquipShifts[i]);
}
if (CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
gSaveContext.inventory.equipment ^= (8 << gEquipShifts[i]);
}
}
} else if (curSection < 0x44) {
i = curSection - 0x38;
if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
gSaveContext.inventory.dungeonItems[i] ^= 4;
}
if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
gSaveContext.inventory.dungeonItems[i] ^= 2;
}
if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
gSaveContext.inventory.dungeonItems[i] ^= 1;
}
} else if (curSection == 0x5B) {
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
gSaveContext.inventory.gsTokens++;
} else if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN) ||
CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
gSaveContext.inventory.gsTokens--;
if (gSaveContext.inventory.gsTokens <= 0) {
gSaveContext.inventory.gsTokens = 0;
}
}
} else if (curSection < 0x5C) {
i = curSection - 0x44;
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
gSaveContext.inventory.questItems ^= gBitFlags[i];
}
}
}
break;
}
// Draws a highlight on the selected section
gDPPipeSync(POLY_KAL_DISP++);
gDPSetRenderMode(POLY_KAL_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
gDPSetCombineMode(POLY_KAL_DISP++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 0, 0, 200, 120);
if (curSection == 0) {
gDPFillRectangle(POLY_KAL_DISP++, sSectionPositions[curSection][0], sSectionPositions[curSection][1],
sSectionPositions[curSection][0] + 45, sSectionPositions[curSection][1] + 16);
} else if ((curSection >= 0x1B) || (curSection == 0x5B)) {
gDPFillRectangle(POLY_KAL_DISP++, sSectionPositions[curSection][0] - 2, sSectionPositions[curSection][1],
sSectionPositions[curSection][0] + 14, sSectionPositions[curSection][1] + 16);
} else {
gDPFillRectangle(POLY_KAL_DISP++, sSectionPositions[curSection][0] - 4, sSectionPositions[curSection][1],
sSectionPositions[curSection][0] + 24, sSectionPositions[curSection][1] + 16);
}
// Handles exiting the inventory editor with the L button
// The editor is opened with `debugState` set to 1, and becomes closable after a frame once `debugState` is set to 2
s16 Debug_BTN = BTN_L;
if (CVar_GetS32("gNGCKaleidoSwitcher", 0) != 0) {
Debug_BTN = BTN_Z;
}
if (pauseCtx->debugState == 1) {
pauseCtx->debugState = 2;
} else if ((pauseCtx->debugState == 2) && CHECK_BTN_ALL(input->press.button, Debug_BTN)) {
pauseCtx->debugState = 0;
}
CLOSE_DISPS(globalCtx->state.gfxCtx);
}