mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-08-13 17:03:47 -04:00
a5df9dddf0
* First batch some overlay
* Almost all overlay
* effect & gamestate
* kaleido stuffs
* more overlay
* more left over from code folder
* remaining hardcoded line and file
* Open & Close _DISP __FILE__ & __LINE__ clean up
* Some if (1) {} remove
* LOG_xxxx __FILE__ , __LINE__ cleaned
* ASSERT macro __FILE__ __LINE__
* mtx without line/file in functions
* " if (1) {} " & "if (0) {}" and tab/white place
* LogUtils as macro
* GameState_, GameAlloc_, SystemArena_ & ZeldaArena_
* Revert "GameState_, GameAlloc_, SystemArena_ & ZeldaArena_"
This reverts commit 0d85caaf7e
.
* Like last commit but as macro
* Fix matrix not using macros
* use function not macro
* DebugArena_* functions
GameAlloc_MallocDebug
BgCheck_PosErrorCheck as macros
removed issues with ; in macro file
655 lines
29 KiB
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);
|
|
}
|