diff --git a/README.md b/README.md index 48faf9d07..374acdccc 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,10 @@ Congratulations, you are now sailing with the Ship of Harkinian! Have fun! The Ship of Harkinian uses a proprietary versioning system consisting of a sci-fi film character followed by a phonetic alphabet code word. The film character represents a major release version which increments with the addition of many new features and bug fixes. The code word represents a minor release version which increments with small updates mainly comprised of bug fixes. For example, `DECKARD ALFA`. -### The Extraction Tool +### Windows Rom Extraction -* Open a rom to initiate generating the `oot.otr` archive file. -* If a second button exists then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error. +* Open OTRGui.exe, and select one of the supported roms listed above, to generate the `oot.otr` archive file. +* If a second button already exits then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error. * When the process completes, place `oot.otr` beside `soh.exe` if it is not already. This packaging process can take up to **5 minutes**. @@ -42,6 +42,37 @@ This packaging process can take up to **5 minutes**. Close the OTRGui when the `Done!` message appears. If you get another message, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum. +### Linux Rom Extraction + +* Place one of the supported roms in the same folder as the appimage. +* When you run the soh appimage, it should begin generating the `oot.otr` archive file. +* When the process completes, place `oot.otr` in the same folder as the appimage, if it is not already, then run the appimage. + +The packaging process can take up to **5 minutes**. + +If you get any errors, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum. + +### MacOS Rom Extraction + +* Run `soh.app`, and when prompted, select one of the supported roms listed above. +* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start. + +The packing process can take up to **5 minutes**. + +If you get an error saying `Incompatible ROM hash`, you have selected the wrong rom, make sure the checksum matches one of the ones listed above. + +### Nintendo Switch Rom Extraction + +* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform. +* Place the `.nro` and the `oot.otr` archive into a folder called `soh` in your Switch folder on your Switch + +### Nintendo Wii U Rom Extraction + +* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform. +* Copy the `.rpx` and the `oot.otr` archive to `wiiu/apps/soh` + +--- + If you still cannot get the tool to work, join our [Discord Server](https://discord.com/invite/BtBmd55HVH) and ask for help in the `#support` text channel. Keep-in-mind that we do not condone piracy in any way. ### Running The Ship of Harkinian diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index 42be25619..9ebaac6f5 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -251,9 +251,9 @@ extern "C" void CVar_Save() auto keyStr = key.c_str(); Color_RGBA8 clr = cvar.second->value.valueRGBA; pConf->setUInt(StringHelper::Sprintf("%s.R", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.r); - pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.r); + pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.g); + pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.b); + pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.a); pConf->setString(StringHelper::Sprintf("%s.Type", keyStr), mercuryRGBAObjectType); } } diff --git a/libultraship/libultraship/ImGuiImpl.cpp b/libultraship/libultraship/ImGuiImpl.cpp index a68b4fc61..d430bc769 100644 --- a/libultraship/libultraship/ImGuiImpl.cpp +++ b/libultraship/libultraship/ImGuiImpl.cpp @@ -2001,18 +2001,21 @@ namespace SohImGui { if (ImGui::BeginMenu("Rando Enhancements")) { - EnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares"); + EnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi"); Tooltip( - "Play unique fanfares when obtaining quest items " - "(medallions/stones/songs). Note that these fanfares are longer than usual." + "Replace Navi's overworld quest hints with rando-related gameplay hints." ); PaddedEnhancementCheckbox("Random Rupee Names", "gRandomizeRupeeNames", true, false); Tooltip( "When obtaining rupees, randomize what the rupee is called in the textbox." ); - PaddedEnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi", true, false); + PaddedEnhancementCheckbox("Key Colors Match Dungeon", "gRandoMatchKeyColors", true, false); Tooltip( - "Replace Navi's overworld quest hints with rando-related gameplay hints." + "Matches the color of small keys and boss keys to the dungeon they belong to. This helps identify keys from afar and adds a little bit of flair."); + PaddedEnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares", true, false); + Tooltip( + "Play unique fanfares when obtaining quest items " + "(medallions/stones/songs). Note that these fanfares are longer than usual." ); ImGui::EndMenu(); } diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 324256900..96aef33df 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -181,9 +181,11 @@ source_group("Header Files\\soh\\Enhancements\\debugger" FILES ${Header_Files__s set(Header_Files__soh__Enhancements__randomizer "soh/Enhancements/randomizer/randomizer.h" + "soh/Enhancements/randomizer/randomizer_inf.h" "soh/Enhancements/randomizer/randomizer_item_tracker.h" "soh/Enhancements/randomizer/adult_trade_shuffle.h" "soh/Enhancements/randomizer/randomizer_check_objects.h" + "soh/Enhancements/randomizer/draw.h" ) source_group("Header Files\\soh\\Enhancements\\randomizer" FILES ${Header_Files__soh__Enhancements__randomizer}) @@ -291,6 +293,7 @@ set(Source_Files__soh__Enhancements__randomizer "soh/Enhancements/randomizer/randomizer_item_tracker.cpp" "soh/Enhancements/randomizer/adult_trade_shuffle.c" "soh/Enhancements/randomizer/randomizer_check_objects.cpp" + "soh/Enhancements/randomizer/draw.cpp" ) source_group("Source Files\\soh\\Enhancements\\randomizer" FILES ${Source_Files__soh__Enhancements__randomizer}) diff --git a/soh/include/functions.h b/soh/include/functions.h index a458505e7..9047b6d3f 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -11,6 +11,7 @@ extern "C" #include "../../libultraship/libultraship/luslog.h" #include +#include #if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) @@ -558,6 +559,8 @@ s32 Flags_GetEventChkInf(s32 flag); void Flags_SetEventChkInf(s32 flag); s32 Flags_GetInfTable(s32 flag); void Flags_SetInfTable(s32 flag); +s32 Flags_GetRandomizerInf(RandomizerInf flag); +void Flags_SetRandomizerInf(RandomizerInf flag); u16 func_80037C30(GlobalContext* globalCtx, s16 arg1); s32 func_80037D98(GlobalContext* globalCtx, Actor* actor, s16 arg2, s32* arg3); s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f arg4); @@ -859,6 +862,7 @@ void Cutscene_HandleEntranceTriggers(GlobalContext* globalCtx); void Cutscene_HandleConditionalTriggers(GlobalContext* globalCtx); void Cutscene_SetSegment(GlobalContext* globalCtx, void* segment); void GetItem_Draw(GlobalContext* globalCtx, s16 drawId); +void GetItemEntry_Draw(GlobalContext* globalCtx, GetItemEntry getItemEntry); void SoundSource_InitAll(GlobalContext* globalCtx); void SoundSource_UpdateAll(GlobalContext* globalCtx); void SoundSource_PlaySfxAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* pos, s32 duration, u16 sfxId); diff --git a/soh/include/z64player.h b/soh/include/z64player.h index b910ce3e2..cbee1b440 100644 --- a/soh/include/z64player.h +++ b/soh/include/z64player.h @@ -368,7 +368,7 @@ typedef enum { FLAG_SCENE_CLEAR, FLAG_SCENE_COLLECTIBLE, FLAG_EVENT_CHECK_INF, - FLAG_COW_MILKED + FLAG_RANDOMIZER_INF } FlagType; typedef struct { diff --git a/soh/include/z64save.h b/soh/include/z64save.h index d219fd17f..7db9f3c14 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -5,6 +5,7 @@ #include "z64math.h" #include "z64audio.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" +#include "soh/Enhancements/randomizer/randomizer_inf.h" typedef struct { /* 0x00 */ u8 buttonItems[8]; @@ -182,9 +183,7 @@ typedef struct { char ganonHintText[150]; char ganonText[250]; u8 seedIcons[5]; - u8 dungeonsDone[8]; - u8 trialsDone[6]; - u8 cowsMilked[10]; + u16 randomizerInf[2]; u8 scrubsPurchased[35]; u8 temporaryWeapon; u16 adultTradeItems; diff --git a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp index b8bae4d17..b04f30e35 100644 --- a/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp +++ b/soh/soh/Enhancements/cosmetics/CosmeticsEditor.cpp @@ -26,7 +26,7 @@ const char* RainbowColorCvarList[] = { "gCCMapsPrim", "gCCQuestsPrim", "gCCSavePrim", "gCCGameoverPrim" }; const char* MarginCvarList[] { - "gHearts", "gMagicBar", "gVSOA", "gBBtn", "gABtn", "gStartBtn", + "gHearts", "gHeartsCount", "gMagicBar", "gVSOA", "gBBtn", "gABtn", "gStartBtn", "gCBtnU", "gCBtnD", "gCBtnL", "gCBtnR", "gDPad", "gMinimap", "gSKC", "gRC", "gCarrots", "gTimers", "gAS", "gTCM", "gTCB" }; @@ -44,7 +44,6 @@ ImVec4 GetRandomValue(int MaximumPossible){ return NewColor; } void GetRandomColorRGB(CosmeticsColorSection* ColorSection, int SectionSize){ - //std::random_shuffle(ColorSection, ColorSection + SectionSize); for (int i = 0; i < SectionSize; i++){ CosmeticsColorIndividual* Element = ColorSection[i].Element; ImVec4 colors = Element->ModifiedColor; @@ -477,7 +476,7 @@ void Draw_Placements(){ Table_InitHeader(false); DrawUseMarginsSlider("Hearts counts", "gHearts"); DrawPositionsRadioBoxes("gHeartsCount"); - DrawPositionSlider("gHeartsCount",-22,ImGui::GetWindowViewport()->Size.y,-25,ImGui::GetWindowViewport()->Size.x); + DrawPositionSlider("gHeartsCount",-22,ImGui::GetWindowViewport()->Size.y,-125,ImGui::GetWindowViewport()->Size.x); DrawScaleSlider("gHeartsCount",0.7f); ImGui::NewLine(); ImGui::EndTable(); diff --git a/soh/soh/Enhancements/item-tables/ItemTableTypes.h b/soh/soh/Enhancements/item-tables/ItemTableTypes.h index 7e5f1a9a3..f10d94dc2 100644 --- a/soh/soh/Enhancements/item-tables/ItemTableTypes.h +++ b/soh/soh/Enhancements/item-tables/ItemTableTypes.h @@ -7,12 +7,20 @@ #define CHEST_ANIM_LONG 1 #define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \ - { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true } + { itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true, NULL } #define GET_ITEM_NONE \ - { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false } + { ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false, NULL } -typedef struct { +#define GET_ITEM_CUSTOM_DRAW(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId, drawFunc) \ + { itemId, field (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true, drawFunc } + +typedef struct GlobalContext GlobalContext; +typedef struct GetItemEntry GetItemEntry; + +typedef void (*CustomDrawFunc)(GlobalContext* globalCtx, GetItemEntry* getItemEntry); + +typedef struct GetItemEntry { /* 0x00 */ uint16_t itemId; /* 0x01 */ uint16_t field; // various bit-packed data /* 0x02 */ int16_t gi; // defines the draw id and chest opening animation @@ -22,4 +30,5 @@ typedef struct { /* 0x08 */ int16_t getItemId; /* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference. /* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases. -} GetItemEntry; // size = 0x0F + CustomDrawFunc drawFunc; +}; // size = 0x0F diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp new file mode 100644 index 000000000..8e276d1a1 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -0,0 +1,109 @@ +#include "draw.h" +#include "z64.h" +#include "macros.h" +#include "functions.h" +#include "randomizerTypes.h" +#include +#include "objects/object_gi_key/object_gi_key.h" +#include "objects/object_gi_bosskey/object_gi_bosskey.h" +#include "objects/object_gi_hearts/object_gi_hearts.h" + +extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry) { + s32 pad; + + s16 color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_SMALL_KEY; + s16 colors[9][3] = { + { 4, 195, 46 }, // Forest Temple + { 237, 95, 95 }, // Fire Temple + { 85, 180, 223 }, // Water Temple + { 222, 158, 47 }, // Spirit Temple + { 126, 16, 177 }, // Shadow Temple + { 227, 110, 255 }, // Bottom of the Well + { 221, 212, 60 }, // Gerudo Training Grounds + { 255, 255, 255 }, // Theive's Hideout (unused) + { 80, 80, 80 } // Ganon's Castle + }; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_80093D18(globalCtx->state.gfxCtx); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gsDPSetGrayscaleColor(POLY_OPA_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255); + gsSPGrayscale(POLY_OPA_DISP++, true); + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL); + + gsSPGrayscale(POLY_OPA_DISP++, false); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry) { + s32 pad; + s16 color_slot; + color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_BOSS_KEY; + s16 colors[6][3] = { + { 4, 195, 46 }, // Forest Temple + { 237, 95, 95 }, // Fire Temple + { 85, 180, 223 }, // Water Temple + { 222, 158, 47 }, // Spirit Temple + { 126, 16, 177 }, // Shadow Temple + { 210, 0, 0 } // Ganon's Castle + }; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_80093D18(globalCtx->state.gfxCtx); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + if (color_slot == 5) { // Ganon's Boss Key + gsDPSetGrayscaleColor(POLY_OPA_DISP++, 80, 80, 80, 255); + gsSPGrayscale(POLY_OPA_DISP++, true); + } + + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBossKeyDL); + + if (color_slot == 5) { // Ganon's Boss Key + gsSPGrayscale(POLY_OPA_DISP++, false); + } + + func_80093D84(globalCtx->state.gfxCtx); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gsDPSetGrayscaleColor(POLY_XLU_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], + 255); + gsSPGrayscale(POLY_XLU_DISP++, true); + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBossKeyGemDL); + + gsSPGrayscale(POLY_XLU_DISP++, false); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +extern "C" void Randomizer_DrawDoubleDefense(GlobalContext* globalCtx, GetItemEntry getItemEntry) { + s32 pad; + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_80093D84(globalCtx->state.gfxCtx); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD); + + gsDPSetGrayscaleColor(POLY_XLU_DISP++, 255, 255, 255, 255); + gsSPGrayscale(POLY_XLU_DISP++, true); + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiHeartBorderDL); + + gsSPGrayscale(POLY_XLU_DISP++, false); + + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiHeartContainerDL); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h new file mode 100644 index 000000000..b1a93bd92 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -0,0 +1,13 @@ +#ifndef RANDODRAW_H +#define RANDODRAW_H +#pragma once + +#include "../item-tables/ItemTableTypes.h" + +typedef struct GlobalContext GlobalContext; + +extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry); +extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry); +extern "C" void Randomizer_DrawDoubleDefense(GlobalContext* globalCtx, GetItemEntry getItemEntry); + +#endif diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 3f61e2513..23c0f45dc 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -19,6 +19,7 @@ #include #include "randomizer_check_objects.h" #include +#include "draw.h" using json = nlohmann::json; using namespace std::literals::string_literals; @@ -1158,7 +1159,7 @@ s16 Randomizer::GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId) { case RG_GIANTS_KNIFE: return GI_SWORD_KNIFE; case RG_BIGGORON_SWORD: - return !CHECK_OWNED_EQUIP(EQUIP_SWORD, 2) ? GI_SWORD_BGS : GI_RUPEE_BLUE; + return !gSaveContext.bgsFlag ? GI_SWORD_BGS : GI_RUPEE_BLUE; case RG_DEKU_SHIELD: return GI_SHIELD_DEKU; @@ -3620,8 +3621,8 @@ void DrawRandoEditor(bool& open) { ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cellPadding); if (ImGui::BeginTable("tableRandoOther", 3, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) { ImGui::TableSetupColumn("Timesavers", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Hint Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); - ImGui::TableSetupColumn("Item Pool Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("World Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Item Pool & Hint Settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); ImGui::TableHeadersRow(); ImGui::PopItemFlag(); @@ -3693,10 +3694,49 @@ void DrawRandoEditor(bool& open) { "The cutscenes of the Poes in Forest Temple and Darunia in Fire Temple will not be skipped. " "These cutscenes are only useful for glitched gameplay and can be safely skipped otherwise."); - // COLUMN 2 - HINT SETTINGS + // COLUMN 2 - WORLD SETTINGS ImGui::TableNextColumn(); window->DC.CurrLineTextBaseOffset = 0.0f; ImGui::PushItemWidth(-FLT_MIN); + ImGui::Text("Coming soon"); + + ImGui::PopItemWidth(); + + // COLUMN 3 - ITEM POOL & HINT SETTINGS + ImGui::TableNextColumn(); + window->DC.CurrLineTextBaseOffset = 0.0f; + ImGui::PushItemWidth(-FLT_MIN); + + ImGui::Text(Settings::ItemPoolValue.GetName().c_str()); + InsertHelpHoverText("Sets how many major items appear in the item pool.\n" + "\n" + "Plentiful - Extra major items are added to the pool.\n" + "\n" + "Balanced - Original item pool.\n" + "\n" + "Scarce - Some excess items are removed, including health upgrades.\n" + "\n" + "Minimal - Most excess items are removed."); + SohImGui::EnhancementCombobox("gRandomizeItemPool", randoItemPool, 4, 1); + PaddedSeparator(); + + // Ice Traps + ImGui::Text(Settings::IceTrapValue.GetName().c_str()); + InsertHelpHoverText("Sets how many items are replaced by ice traps.\n" + "\n" + "Off - No ice traps.\n" + "\n" + "Normal - Only Ice Traps from the base item pool are shuffled in.\n" + "\n" + "Extra - Chance to replace added junk items with additional ice traps.\n" + "\n" + "Mayhem - All added junk items will be Ice Traps.\n" + "\n" + "Onslaught - All junk items will be replaced by Ice Traps, even those " + "in the base pool."); + SohImGui::EnhancementCombobox("gRandomizeIceTraps", randoIceTraps, 5, 1); + + PaddedSeparator(); // Gossip Stone Hints ImGui::Text(Settings::GossipStoneHints.GetName().c_str()); @@ -3746,40 +3786,7 @@ void DrawRandoEditor(bool& open) { SohImGui::EnhancementCombobox("gRandomizeHintDistribution", randoHintDistribution, 4, 1); ImGui::Unindent(); } - ImGui::PopItemWidth(); - // COLUMN 3 - ITEM POOL SETTINGS - ImGui::TableNextColumn(); - window->DC.CurrLineTextBaseOffset = 0.0f; - ImGui::PushItemWidth(-FLT_MIN); - ImGui::Text(Settings::ItemPoolValue.GetName().c_str()); - InsertHelpHoverText("Sets how many major items appear in the item pool.\n" - "\n" - "Plentiful - Extra major items are added to the pool.\n" - "\n" - "Balanced - Original item pool.\n" - "\n" - "Scarce - Some excess items are removed, including health upgrades.\n" - "\n" - "Minimal - Most excess items are removed."); - SohImGui::EnhancementCombobox("gRandomizeItemPool", randoItemPool, 4, 1); - PaddedSeparator(); - - // Ice Traps - ImGui::Text(Settings::IceTrapValue.GetName().c_str()); - InsertHelpHoverText("Sets how many items are replaced by ice traps.\n" - "\n" - "Off - No ice traps.\n" - "\n" - "Normal - Only Ice Traps from the base item pool are shuffled in.\n" - "\n" - "Extra - Chance to replace added junk items with additional ice traps.\n" - "\n" - "Mayhem - All added junk items will be Ice Traps.\n" - "\n" - "Onslaught - All junk items will be replaced by Ice Traps, even those " - "in the base pool."); - SohImGui::EnhancementCombobox("gRandomizeIceTraps", randoIceTraps, 5, 1); ImGui::PopItemWidth(); ImGui::EndTable(); } @@ -4349,6 +4356,14 @@ void InitRandoItemTable() { ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, extendedVanillaGetItemTable[i].getItemId, extendedVanillaGetItemTable[i]); } for (int i = 0; i < ARRAY_COUNT(randoGetItemTable); i++) { + if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_SMALL_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_SMALL_KEY + && randoGetItemTable[i].itemId != RG_GERUDO_FORTRESS_SMALL_KEY) { + randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawSmallKey; + } else if (randoGetItemTable[i].itemId >= RG_FOREST_TEMPLE_BOSS_KEY && randoGetItemTable[i].itemId <= RG_GANONS_CASTLE_BOSS_KEY) { + randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawBossKey; + } else if (randoGetItemTable[i].itemId == RG_DOUBLE_DEFENSE) { + randoGetItemTable[i].drawFunc = (CustomDrawFunc)Randomizer_DrawDoubleDefense; + } ItemTableManager::Instance->AddItemEntry(MOD_RANDOMIZER, randoGetItemTable[i].itemId, randoGetItemTable[i]); } } diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h new file mode 100644 index 000000000..e5f41a5d3 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -0,0 +1,35 @@ +#pragma once + +typedef enum { + RAND_INF_DUNGEONS_DONE_DEKU_TREE, + RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN, + RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY, + RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE, + RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE, + RAND_INF_DUNGEONS_DONE_WATER_TEMPLE, + RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, + RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, + + RAND_INF_TRIALS_DONE_LIGHT_TRIAL, + RAND_INF_TRIALS_DONE_FOREST_TRIAL, + RAND_INF_TRIALS_DONE_FIRE_TRIAL, + RAND_INF_TRIALS_DONE_WATER_TRIAL, + RAND_INF_TRIALS_DONE_SPIRIT_TRIAL, + RAND_INF_TRIALS_DONE_SHADOW_TRIAL, + + RAND_INF_COWS_MILKED_LINKS_HOUSE_COW, + RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, + RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, + RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, + RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, + RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, + RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, + RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, + RAND_INF_COWS_MILKED_GV_COW, + RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, + RAND_INF_COWS_MILKED_HF_COW_GROTTO_GOSSIP_STONE, + + // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16) + + RAND_INF_MAX, +} RandomizerInf; diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index ed26e9078..8cede9a66 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -1,12 +1,13 @@ #include "randomizer_item_tracker.h" #include "../../util.h" #include "../libultraship/ImGuiImpl.h" -#include +#include "../libultraship/Hooks.h" +#include "../libultraship/UltraController.h" +#include "../debugger/ImGuiHelpers.h" -#include -#include #include #include +#include #include extern "C" { @@ -20,223 +21,208 @@ extern GlobalContext* gGlobalCtx; #include "textures/icon_item_24_static/icon_item_24_static.h" } -typedef struct { - uint32_t id; - std::string name; - std::string nameFaded; - std::string texturePath; -} ItemMapEntry; +void DrawEquip(ItemTrackerItem item); +void DrawItem(ItemTrackerItem item); +void DrawDungeonItem(ItemTrackerItem item); +void DrawBottle(ItemTrackerItem item); +void DrawQuest(ItemTrackerItem item); +void DrawSong(ItemTrackerItem item); -#define ITEM_MAP_ENTRY(id) \ - { \ - id, { \ - id, #id, #id "_Faded", static_cast(gItemIcons[id]) \ - } \ - } +OSContPad* buttonsPressed; -// Maps items ids to info for use in ImGui -std::map itemMappingSSS = { - ITEM_MAP_ENTRY(ITEM_STICK), - ITEM_MAP_ENTRY(ITEM_NUT), - ITEM_MAP_ENTRY(ITEM_BOMB), - ITEM_MAP_ENTRY(ITEM_BOW), - ITEM_MAP_ENTRY(ITEM_ARROW_FIRE), - ITEM_MAP_ENTRY(ITEM_DINS_FIRE), - ITEM_MAP_ENTRY(ITEM_SLINGSHOT), - ITEM_MAP_ENTRY(ITEM_OCARINA_FAIRY), - ITEM_MAP_ENTRY(ITEM_OCARINA_TIME), - ITEM_MAP_ENTRY(ITEM_BOMBCHU), - ITEM_MAP_ENTRY(ITEM_HOOKSHOT), - ITEM_MAP_ENTRY(ITEM_LONGSHOT), - ITEM_MAP_ENTRY(ITEM_ARROW_ICE), - ITEM_MAP_ENTRY(ITEM_FARORES_WIND), - ITEM_MAP_ENTRY(ITEM_BOOMERANG), - ITEM_MAP_ENTRY(ITEM_LENS), - ITEM_MAP_ENTRY(ITEM_BEAN), - ITEM_MAP_ENTRY(ITEM_HAMMER), - ITEM_MAP_ENTRY(ITEM_ARROW_LIGHT), - ITEM_MAP_ENTRY(ITEM_NAYRUS_LOVE), - ITEM_MAP_ENTRY(ITEM_BOTTLE), - ITEM_MAP_ENTRY(ITEM_POTION_RED), - ITEM_MAP_ENTRY(ITEM_POTION_GREEN), - ITEM_MAP_ENTRY(ITEM_POTION_BLUE), - ITEM_MAP_ENTRY(ITEM_FAIRY), - ITEM_MAP_ENTRY(ITEM_FISH), - ITEM_MAP_ENTRY(ITEM_MILK_BOTTLE), - ITEM_MAP_ENTRY(ITEM_LETTER_RUTO), - ITEM_MAP_ENTRY(ITEM_BLUE_FIRE), - ITEM_MAP_ENTRY(ITEM_BUG), - ITEM_MAP_ENTRY(ITEM_BIG_POE), - ITEM_MAP_ENTRY(ITEM_MILK_HALF), - ITEM_MAP_ENTRY(ITEM_POE), - ITEM_MAP_ENTRY(ITEM_WEIRD_EGG), - ITEM_MAP_ENTRY(ITEM_CHICKEN), - ITEM_MAP_ENTRY(ITEM_LETTER_ZELDA), - ITEM_MAP_ENTRY(ITEM_MASK_KEATON), - ITEM_MAP_ENTRY(ITEM_MASK_SKULL), - ITEM_MAP_ENTRY(ITEM_MASK_SPOOKY), - ITEM_MAP_ENTRY(ITEM_MASK_BUNNY), - ITEM_MAP_ENTRY(ITEM_MASK_GORON), - ITEM_MAP_ENTRY(ITEM_MASK_ZORA), - ITEM_MAP_ENTRY(ITEM_MASK_GERUDO), - ITEM_MAP_ENTRY(ITEM_MASK_TRUTH), - ITEM_MAP_ENTRY(ITEM_SOLD_OUT), - ITEM_MAP_ENTRY(ITEM_POCKET_EGG), - ITEM_MAP_ENTRY(ITEM_POCKET_CUCCO), - ITEM_MAP_ENTRY(ITEM_COJIRO), - ITEM_MAP_ENTRY(ITEM_ODD_MUSHROOM), - ITEM_MAP_ENTRY(ITEM_ODD_POTION), - ITEM_MAP_ENTRY(ITEM_SAW), - ITEM_MAP_ENTRY(ITEM_SWORD_BROKEN), - ITEM_MAP_ENTRY(ITEM_PRESCRIPTION), - ITEM_MAP_ENTRY(ITEM_FROG), - ITEM_MAP_ENTRY(ITEM_EYEDROPS), - ITEM_MAP_ENTRY(ITEM_CLAIM_CHECK), - ITEM_MAP_ENTRY(ITEM_BOW_ARROW_FIRE), - ITEM_MAP_ENTRY(ITEM_BOW_ARROW_ICE), - ITEM_MAP_ENTRY(ITEM_BOW_ARROW_LIGHT), - ITEM_MAP_ENTRY(ITEM_SWORD_KOKIRI), - ITEM_MAP_ENTRY(ITEM_SWORD_MASTER), - ITEM_MAP_ENTRY(ITEM_SWORD_BGS), - ITEM_MAP_ENTRY(ITEM_SHIELD_DEKU), - ITEM_MAP_ENTRY(ITEM_SHIELD_HYLIAN), - ITEM_MAP_ENTRY(ITEM_SHIELD_MIRROR), - ITEM_MAP_ENTRY(ITEM_TUNIC_KOKIRI), - ITEM_MAP_ENTRY(ITEM_TUNIC_GORON), - ITEM_MAP_ENTRY(ITEM_TUNIC_ZORA), - ITEM_MAP_ENTRY(ITEM_BOOTS_KOKIRI), - ITEM_MAP_ENTRY(ITEM_BOOTS_IRON), - ITEM_MAP_ENTRY(ITEM_BOOTS_HOVER), - ITEM_MAP_ENTRY(ITEM_BULLET_BAG_30), - ITEM_MAP_ENTRY(ITEM_BULLET_BAG_40), - ITEM_MAP_ENTRY(ITEM_BULLET_BAG_50), - ITEM_MAP_ENTRY(ITEM_QUIVER_30), - ITEM_MAP_ENTRY(ITEM_QUIVER_40), - ITEM_MAP_ENTRY(ITEM_QUIVER_50), - ITEM_MAP_ENTRY(ITEM_BOMB_BAG_20), - ITEM_MAP_ENTRY(ITEM_BOMB_BAG_30), - ITEM_MAP_ENTRY(ITEM_BOMB_BAG_40), - ITEM_MAP_ENTRY(ITEM_BRACELET), - ITEM_MAP_ENTRY(ITEM_GAUNTLETS_SILVER), - ITEM_MAP_ENTRY(ITEM_GAUNTLETS_GOLD), - ITEM_MAP_ENTRY(ITEM_SCALE_SILVER), - ITEM_MAP_ENTRY(ITEM_SCALE_GOLDEN), - ITEM_MAP_ENTRY(ITEM_SWORD_KNIFE), - ITEM_MAP_ENTRY(ITEM_WALLET_ADULT), - ITEM_MAP_ENTRY(ITEM_WALLET_GIANT), - ITEM_MAP_ENTRY(ITEM_SEEDS), - ITEM_MAP_ENTRY(ITEM_FISHING_POLE), - ITEM_MAP_ENTRY(ITEM_KEY_BOSS), - ITEM_MAP_ENTRY(ITEM_COMPASS), - ITEM_MAP_ENTRY(ITEM_DUNGEON_MAP), - ITEM_MAP_ENTRY(ITEM_KEY_SMALL), +bool shouldUpdateVectors = true; +std::vector mainWindowItems = {}; + +std::vector inventoryItems = { + ITEM_TRACKER_ITEM(ITEM_STICK, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NUT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMB, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOW, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_FIRE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_DINS_FIRE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_SLINGSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BOMBCHU, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_ICE, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_FARORES_WIND, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOOMERANG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_LENS, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_BEAN, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HAMMER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_ARROW_LIGHT, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_NAYRUS_LOVE, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 1, DrawBottle), ITEM_TRACKER_ITEM(ITEM_BOTTLE, 2, DrawBottle), + ITEM_TRACKER_ITEM(ITEM_BOTTLE, 3, DrawBottle), ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem), }; -// Maps entries in the GS flag array to the area name it represents - -std::vector gsMappingSSS = { - "Deku Tree", - "Dodongo's Cavern", - "Inside Jabu-Jabu's Belly", - "Forest Temple", - "Fire Temple", - "Water Temple", - "Spirit Temple", - "Shadow Temple", - "Bottom of the Well", - "Ice Cavern", - "Hyrule Field", - "Lon Lon Ranch", - "Kokiri Forest", - "Lost Woods, Sacred Forest Meadow", - "Castle Town and Ganon's Castle", - "Death Mountain Trail, Goron City", - "Kakariko Village", - "Zora Fountain, River", - "Lake Hylia", - "Gerudo Valley", - "Gerudo Fortress", - "Desert Colossus, Haunted Wasteland", +std::vector equipmentItems = { + ITEM_TRACKER_ITEM(ITEM_SWORD_KOKIRI, 1 << 0, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_MASTER, 1 << 1, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SWORD_BGS, 1 << 2, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_TUNIC_KOKIRI, 1 << 8, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_GORON, 1 << 9, DrawEquip), ITEM_TRACKER_ITEM(ITEM_TUNIC_ZORA, 1 << 10, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_SHIELD_DEKU, 1 << 4, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_HYLIAN, 1 << 5, DrawEquip), ITEM_TRACKER_ITEM(ITEM_SHIELD_MIRROR, 1 << 6, DrawEquip), + ITEM_TRACKER_ITEM(ITEM_BOOTS_KOKIRI, 1 << 12, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_IRON, 1 << 13, DrawEquip), ITEM_TRACKER_ITEM(ITEM_BOOTS_HOVER, 1 << 14, DrawEquip), }; -extern "C" u8 gAreaGsFlags[]; - -extern "C" u8 gAmmoItems[]; - -// Modification of gAmmoItems that replaces ITEM_NONE with the item in inventory slot it represents -u8 gAllAmmoItemsSSS[] = { - ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE, - ITEM_SLINGSHOT, ITEM_OCARINA_TIME, ITEM_BOMBCHU, ITEM_LONGSHOT, ITEM_ARROW_ICE, ITEM_FARORES_WIND, - ITEM_BOOMERANG, ITEM_LENS, ITEM_BEAN, ITEM_HAMMER, +std::vector miscItems = { + ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem), + ITEM_TRACKER_ITEM(ITEM_HEART_CONTAINER, 0, DrawItem), ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem), ITEM_TRACKER_ITEM(QUEST_STONE_OF_AGONY, 1 << 21, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_GERUDO_CARD, 1 << 22, DrawQuest), ITEM_TRACKER_ITEM(QUEST_SKULL_TOKEN, 1 << 23, DrawQuest), }; -// Encapsulates what is drawn by the passed-in function within a border -template void DrawGroupWithBorder(T&& drawFunc) { - // First group encapsulates the inner portion and border - ImGui::BeginGroup(); +std::vector dungeonRewardStones = { + ITEM_TRACKER_ITEM(QUEST_KOKIRI_EMERALD, 1 << 18, DrawQuest), ITEM_TRACKER_ITEM(QUEST_GORON_RUBY, 1 << 19, DrawQuest), ITEM_TRACKER_ITEM(QUEST_ZORA_SAPPHIRE, 1 << 20, DrawQuest), +}; - ImVec2 padding = ImGui::GetStyle().FramePadding; - ImVec2 p0 = ImGui::GetCursorScreenPos(); - ImGui::SetCursorScreenPos(ImVec2(p0.x + padding.x, p0.y + padding.y)); +std::vector dungeonRewardMedallions = { + ITEM_TRACKER_ITEM(QUEST_MEDALLION_FOREST, 1 << 0, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_FIRE, 1 << 1, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_WATER, 1 << 2, DrawQuest), + ITEM_TRACKER_ITEM(QUEST_MEDALLION_SPIRIT, 1 << 3, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_SHADOW, 1 << 4, DrawQuest), ITEM_TRACKER_ITEM(QUEST_MEDALLION_LIGHT, 1 << 5, DrawQuest), +}; - // Second group encapsulates just the inner portion - ImGui::BeginGroup(); +std::vector dungeonRewards = {}; - drawFunc(); +std::vector songItems = { + ITEM_TRACKER_ITEM(QUEST_SONG_LULLABY, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_EPONA, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SARIA, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_SUN, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_TIME, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_STORMS, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_MINUET, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_BOLERO, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_SERENADE, 0, DrawSong), + ITEM_TRACKER_ITEM(QUEST_SONG_REQUIEM, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_NOCTURNE, 0, DrawSong), ITEM_TRACKER_ITEM(QUEST_SONG_PRELUDE, 0, DrawSong), +}; - ImGui::Dummy(padding); - ImGui::EndGroup(); +std::vector itemTrackerDungeonsWithMapsHorizontal = { + { SCENE_YDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_DDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_BDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADANCH, { ITEM_KEY_SMALL, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_MEN, { ITEM_KEY_SMALL } }, +}; - ImVec2 p1 = ImGui::GetItemRectMax(); - p1.x += padding.x; - ImVec4 borderCol = ImGui::GetStyle().Colors[ImGuiCol_Border]; - ImGui::GetWindowDrawList()->AddRect( - p0, p1, IM_COL32(borderCol.x * 255, borderCol.y * 255, borderCol.z * 255, borderCol.w * 255)); +std::vector itemTrackerDungeonsHorizontal = { + { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, + { SCENE_MEN, { ITEM_KEY_SMALL } }, +}; - ImGui::EndGroup(); -} -char z2ASCIISSS(int code) { - int ret; - if (code < 10) { // Digits - ret = code + 0x30; - } else if (code >= 10 && code < 36) { // Uppercase letters - ret = code + 0x37; - } else if (code >= 36 && code < 62) { // Lowercase letters - ret = code + 0x3D; - } else if (code == 62) { // Space - ret = code - 0x1E; - } else if (code == 63 || code == 64) { // _ and . - ret = code - 0x12; - } else { - ret = code; - } - return char(ret); -} +std::vector itemTrackerDungeonsWithMapsCompact = { + { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_HAKADANCH, { ITEM_KEY_SMALL, ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_YDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_DDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_BDAN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_ICE_DOUKUTO, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_MEN, { ITEM_KEY_SMALL } }, +}; -typedef struct { - uint32_t id; - std::string name; - std::string nameFaded; - uint32_t bitMask; -} ItemTrackerMapEntry; +std::vector itemTrackerDungeonsCompact = { + { SCENE_BMORI1, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HIDAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_MIZUSIN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_JYASINZOU, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADAN, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_GANONTIKA, { ITEM_KEY_SMALL, ITEM_KEY_BOSS } }, + { SCENE_HAKADANCH, { ITEM_KEY_SMALL } }, + { SCENE_MEN, { ITEM_KEY_SMALL } }, + { SCENE_GERUDOWAY, { ITEM_KEY_SMALL } }, +}; -#define ITEM_TRACKER_MAP_ENTRY(id, maskShift) \ - { \ - id, { \ - id, #id, #id "_Faded", 1 << maskShift \ - } \ - } +std::map itemTrackerDungeonShortNames = { + { SCENE_BMORI1, "FRST" }, + { SCENE_HIDAN, "FIRE" }, + { SCENE_MIZUSIN, "WATR" }, + { SCENE_JYASINZOU, "SPRT" }, + { SCENE_HAKADAN, "SHDW" }, + { SCENE_HAKADANCH, "BOTW" }, + { SCENE_YDAN, "DEKU" }, + { SCENE_DDAN, "DCVN" }, + { SCENE_BDAN, "JABU" }, + { SCENE_ICE_DOUKUTO, "ICE" }, + { SCENE_GANONTIKA, "GANON" }, + { SCENE_MEN, "GTG" }, + { SCENE_GERUDOWAY, "HIDE" }, +}; -std::unordered_map equipTrackerMap = { - ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_KOKIRI, 0), ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_MASTER, 1), - ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_BGS, 2), ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_BROKEN, 3), - ITEM_TRACKER_MAP_ENTRY(ITEM_SHIELD_DEKU, 4), ITEM_TRACKER_MAP_ENTRY(ITEM_SHIELD_HYLIAN, 5), - ITEM_TRACKER_MAP_ENTRY(ITEM_SHIELD_MIRROR, 6), ITEM_TRACKER_MAP_ENTRY(ITEM_TUNIC_KOKIRI, 8), - ITEM_TRACKER_MAP_ENTRY(ITEM_TUNIC_GORON, 9), ITEM_TRACKER_MAP_ENTRY(ITEM_TUNIC_ZORA, 10), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOOTS_KOKIRI, 12), ITEM_TRACKER_MAP_ENTRY(ITEM_BOOTS_IRON, 13), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOOTS_HOVER, 14), +std::vector dungeonItems = {}; + +std::unordered_map actualItemTrackerItemMap = { + { ITEM_BOTTLE, ITEM_TRACKER_ITEM(ITEM_BOTTLE, 0, DrawItem) }, + { ITEM_BIG_POE, ITEM_TRACKER_ITEM(ITEM_BIG_POE, 0, DrawItem) }, + { ITEM_BLUE_FIRE, ITEM_TRACKER_ITEM(ITEM_BLUE_FIRE, 0, DrawItem) }, + { ITEM_BUG, ITEM_TRACKER_ITEM(ITEM_BUG, 0, DrawItem) }, + { ITEM_FAIRY, ITEM_TRACKER_ITEM(ITEM_FAIRY, 0, DrawItem) }, + { ITEM_FISH, ITEM_TRACKER_ITEM(ITEM_FISH, 0, DrawItem) }, + { ITEM_POTION_GREEN, ITEM_TRACKER_ITEM(ITEM_POTION_GREEN, 0, DrawItem) }, + { ITEM_POE, ITEM_TRACKER_ITEM(ITEM_POE, 0, DrawItem) }, + { ITEM_POTION_RED, ITEM_TRACKER_ITEM(ITEM_POTION_RED, 0, DrawItem) }, + { ITEM_POTION_BLUE, ITEM_TRACKER_ITEM(ITEM_POTION_BLUE, 0, DrawItem) }, + { ITEM_MILK_BOTTLE, ITEM_TRACKER_ITEM(ITEM_MILK_BOTTLE, 0, DrawItem) }, + { ITEM_MILK_HALF, ITEM_TRACKER_ITEM(ITEM_MILK_HALF, 0, DrawItem) }, + { ITEM_LETTER_RUTO, ITEM_TRACKER_ITEM(ITEM_LETTER_RUTO, 0, DrawItem) }, + + { ITEM_HOOKSHOT, ITEM_TRACKER_ITEM(ITEM_HOOKSHOT, 0, DrawItem) }, + { ITEM_LONGSHOT, ITEM_TRACKER_ITEM(ITEM_LONGSHOT, 0, DrawItem) }, + + { ITEM_OCARINA_FAIRY, ITEM_TRACKER_ITEM(ITEM_OCARINA_FAIRY, 0, DrawItem) }, + { ITEM_OCARINA_TIME, ITEM_TRACKER_ITEM(ITEM_OCARINA_TIME, 0, DrawItem) }, + + { ITEM_MAGIC_SMALL, ITEM_TRACKER_ITEM(ITEM_MAGIC_SMALL, 0, DrawItem) }, + { ITEM_MAGIC_LARGE, ITEM_TRACKER_ITEM(ITEM_MAGIC_LARGE, 0, DrawItem) }, + + { ITEM_WALLET_ADULT, ITEM_TRACKER_ITEM(ITEM_WALLET_ADULT, 0, DrawItem) }, + { ITEM_WALLET_GIANT, ITEM_TRACKER_ITEM(ITEM_WALLET_GIANT, 0, DrawItem) }, + + { ITEM_BRACELET, ITEM_TRACKER_ITEM(ITEM_BRACELET, 0, DrawItem) }, + { ITEM_GAUNTLETS_SILVER, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_SILVER, 0, DrawItem) }, + { ITEM_GAUNTLETS_GOLD, ITEM_TRACKER_ITEM(ITEM_GAUNTLETS_GOLD, 0, DrawItem) }, + + { ITEM_SCALE_SILVER, ITEM_TRACKER_ITEM(ITEM_SCALE_SILVER, 0, DrawItem) }, + { ITEM_SCALE_GOLDEN, ITEM_TRACKER_ITEM(ITEM_SCALE_GOLDEN, 0, DrawItem) }, + + { ITEM_WEIRD_EGG, ITEM_TRACKER_ITEM(ITEM_WEIRD_EGG, 0, DrawItem) }, + { ITEM_CHICKEN, ITEM_TRACKER_ITEM(ITEM_CHICKEN, 0, DrawItem) }, + { ITEM_LETTER_ZELDA, ITEM_TRACKER_ITEM(ITEM_LETTER_ZELDA, 0, DrawItem) }, + { ITEM_MASK_KEATON, ITEM_TRACKER_ITEM(ITEM_MASK_KEATON, 0, DrawItem) }, + { ITEM_MASK_SKULL, ITEM_TRACKER_ITEM(ITEM_MASK_SKULL, 0, DrawItem) }, + { ITEM_MASK_SPOOKY, ITEM_TRACKER_ITEM(ITEM_MASK_SPOOKY, 0, DrawItem) }, + { ITEM_MASK_BUNNY, ITEM_TRACKER_ITEM(ITEM_MASK_BUNNY, 0, DrawItem) }, + { ITEM_MASK_GORON, ITEM_TRACKER_ITEM(ITEM_MASK_GORON, 0, DrawItem) }, + { ITEM_MASK_ZORA, ITEM_TRACKER_ITEM(ITEM_MASK_ZORA, 0, DrawItem) }, + { ITEM_MASK_GERUDO, ITEM_TRACKER_ITEM(ITEM_MASK_GERUDO, 0, DrawItem) }, + { ITEM_MASK_TRUTH, ITEM_TRACKER_ITEM(ITEM_MASK_TRUTH, 0, DrawItem) }, + { ITEM_SOLD_OUT, ITEM_TRACKER_ITEM(ITEM_SOLD_OUT, 0, DrawItem) }, + + { ITEM_POCKET_EGG, ITEM_TRACKER_ITEM(ITEM_POCKET_EGG, 0, DrawItem) }, + { ITEM_POCKET_CUCCO, ITEM_TRACKER_ITEM(ITEM_POCKET_CUCCO, 0, DrawItem) }, + { ITEM_COJIRO, ITEM_TRACKER_ITEM(ITEM_COJIRO, 0, DrawItem) }, + { ITEM_ODD_MUSHROOM, ITEM_TRACKER_ITEM(ITEM_ODD_MUSHROOM, 0, DrawItem) }, + { ITEM_ODD_POTION, ITEM_TRACKER_ITEM(ITEM_ODD_POTION, 0, DrawItem) }, + { ITEM_SAW, ITEM_TRACKER_ITEM(ITEM_SAW, 0, DrawItem) }, + { ITEM_SWORD_BROKEN, ITEM_TRACKER_ITEM(ITEM_SWORD_BROKEN, 0, DrawItem) }, + { ITEM_PRESCRIPTION, ITEM_TRACKER_ITEM(ITEM_PRESCRIPTION, 0, DrawItem) }, + { ITEM_FROG, ITEM_TRACKER_ITEM(ITEM_FROG, 0, DrawItem) }, + { ITEM_EYEDROPS, ITEM_TRACKER_ITEM(ITEM_EYEDROPS, 0, DrawItem) }, + { ITEM_CLAIM_CHECK, ITEM_TRACKER_ITEM(ITEM_CLAIM_CHECK, 0, DrawItem) }, +}; + +std::vector buttonMap = { + BTN_A, + BTN_B, + BTN_CUP, + BTN_CDOWN, + BTN_CLEFT, + BTN_CRIGHT, + BTN_L, + BTN_Z, + BTN_R, + BTN_START, + BTN_DUP, + BTN_DDOWN, + BTN_DLEFT, + BTN_DRIGHT }; bool IsValidSaveFile() { @@ -244,1319 +230,602 @@ bool IsValidSaveFile() { return validSave; } -void DrawEquip(uint32_t itemId) { - const ItemTrackerMapEntry& entry = equipTrackerMap[itemId]; - bool hasEquip = (entry.bitMask & gSaveContext.inventory.equipment) != 0; - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - ImGui::Image(SohImGui::GetTextureByName(hasEquip && IsValidSaveFile() ? entry.name : entry.nameFaded), - ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); +ImVec2 GetItemCurrentAndMax(ItemTrackerItem item) { + ImVec2 result = { 0, 0 }; - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); -} - -std::unordered_map questTrackerMap = { - ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_FOREST, 0), ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_FIRE, 1), - ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_WATER, 2), ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_SPIRIT, 3), - ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_SHADOW, 4), ITEM_TRACKER_MAP_ENTRY(QUEST_MEDALLION_LIGHT, 5), - ITEM_TRACKER_MAP_ENTRY(QUEST_KOKIRI_EMERALD, 18), ITEM_TRACKER_MAP_ENTRY(QUEST_GORON_RUBY, 19), - ITEM_TRACKER_MAP_ENTRY(QUEST_ZORA_SAPPHIRE, 20), ITEM_TRACKER_MAP_ENTRY(QUEST_STONE_OF_AGONY, 21), - ITEM_TRACKER_MAP_ENTRY(QUEST_GERUDO_CARD, 22), ITEM_TRACKER_MAP_ENTRY(QUEST_SKULL_TOKEN, 23), - -}; - -void DrawQuest(uint32_t itemId) { - const ItemTrackerMapEntry& entry = questTrackerMap[itemId]; - bool hasQuestItem = (entry.bitMask & gSaveContext.inventory.questItems) != 0; - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - ImGui::BeginGroup(); - ImGui::Image(SohImGui::GetTextureByName(hasQuestItem && IsValidSaveFile() ? entry.name : entry.nameFaded), - ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - - ImVec2 p = ImGui::GetCursorScreenPos(); - int estimatedTextWidth = 10; - int estimatedTextHeight = 10; - ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - estimatedTextWidth, p.y - estimatedTextHeight)); - - if (entry.name == "QUEST_SKULL_TOKEN") { - if (gSaveContext.inventory.gsTokens == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", gSaveContext.inventory.gsTokens); - ImGui::PopStyleColor(); - } else if (gSaveContext.inventory.gsTokens >= 1 && gSaveContext.inventory.gsTokens <= 99) { - ImGui::Text("%i", gSaveContext.inventory.gsTokens); - } else if (gSaveContext.inventory.gsTokens >= 100) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 0, 0, 255)); - ImGui::Text("%i", gSaveContext.inventory.gsTokens); - ImGui::PopStyleColor(); - } - } - - ImGui::EndGroup(); - - SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); -}; - -std::unordered_map itemTrackerMap = { - ITEM_TRACKER_MAP_ENTRY(ITEM_STICK, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_NUT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOMB, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOW, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ARROW_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_DINS_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SLINGSHOT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_OCARINA_FAIRY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_OCARINA_TIME, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOMBCHU, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_HOOKSHOT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LONGSHOT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ARROW_ICE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FARORES_WIND, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOOMERANG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LENS, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BEAN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_HAMMER, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ARROW_LIGHT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_NAYRUS_LOVE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOTTLE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_RED, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_GREEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_BLUE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FAIRY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FISH, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MILK_BOTTLE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LETTER_RUTO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BLUE_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BUG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BIG_POE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MILK_HALF, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_WEIRD_EGG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_CHICKEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LETTER_ZELDA, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_KEATON, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_SKULL, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_SPOOKY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_BUNNY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_GORON, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_ZORA, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_GERUDO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_TRUTH, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SOLD_OUT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POCKET_EGG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POCKET_CUCCO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_COJIRO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ODD_MUSHROOM, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ODD_POTION, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SAW, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_BROKEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_PRESCRIPTION, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FROG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_EYEDROPS, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_CLAIM_CHECK, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOW_ARROW_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOW_ARROW_ICE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOW_ARROW_LIGHT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BOTTLE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_RED, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_GREEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POTION_BLUE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FAIRY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FISH, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MILK_BOTTLE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LETTER_RUTO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BLUE_FIRE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BUG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_BIG_POE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MILK_HALF, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_WEIRD_EGG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_CHICKEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_LETTER_ZELDA, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_KEATON, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_SKULL, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_SPOOKY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_BUNNY, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_GORON, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_ZORA, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_GERUDO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MASK_TRUTH, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SOLD_OUT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POCKET_EGG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_POCKET_CUCCO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_COJIRO, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ODD_MUSHROOM, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_ODD_POTION, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SAW, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_SWORD_BROKEN, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_PRESCRIPTION, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_FROG, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_EYEDROPS, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_CLAIM_CHECK, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_HEART_CONTAINER, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MAGIC_SMALL, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_MAGIC_LARGE, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_WALLET_ADULT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_WALLET_GIANT, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_DUNGEON_MAP, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_COMPASS, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_KEY_SMALL, 0), - ITEM_TRACKER_MAP_ENTRY(ITEM_KEY_BOSS, 0) -}; - -void DrawItem(uint32_t itemId) { - uint32_t actualItemId = INV_CONTENT(itemId); - - if (itemId == ITEM_HEART_CONTAINER) { - actualItemId = itemId; - } - - if (itemId == ITEM_WALLET_ADULT || itemId == ITEM_WALLET_GIANT) { - if (CUR_UPG_VALUE(UPG_WALLET) == 2) { - actualItemId = ITEM_WALLET_GIANT; - } else if (CUR_UPG_VALUE(UPG_WALLET) < 2) { - actualItemId = ITEM_WALLET_ADULT; - } - } - - if (itemId == ITEM_MAGIC_SMALL || itemId == ITEM_MAGIC_LARGE) { - if (gSaveContext.magicLevel == 2) { - actualItemId = ITEM_MAGIC_LARGE; - } else { - actualItemId = ITEM_MAGIC_SMALL; - } - } - - bool hasItem = actualItemId != ITEM_NONE; - - if (itemId == ITEM_HEART_CONTAINER) { - if (gSaveContext.doubleDefense) { - hasItem = true; - } else { - hasItem = false; - } - } - - if (itemId == ITEM_WALLET_ADULT || itemId == ITEM_WALLET_GIANT) { - if (CUR_UPG_VALUE(UPG_WALLET) == 0) { - hasItem = false; - } else { - hasItem = true; - } - } - - if (itemId == ITEM_MAGIC_SMALL || itemId == ITEM_MAGIC_LARGE) { - if (gSaveContext.magicLevel == 0) { - hasItem = false; - } else { - hasItem = true; - } - } - - const ItemTrackerMapEntry& entry = itemTrackerMap[hasItem && IsValidSaveFile() ? actualItemId : itemId]; - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - - ImGui::BeginGroup(); - ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? entry.name : entry.nameFaded), - ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - ImVec2 p = ImGui::GetCursorScreenPos(); - int estimatedTextWidth = 10; - int estimatedTextHeight = 10; - ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - estimatedTextWidth, p.y - estimatedTextHeight)); - - if (IsValidSaveFile()) { - DrawItemAmmo(actualItemId); - } else { - ImGui::Text(" "); - } - ImGui::EndGroup(); - - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); -} - -void DrawItemAmmo(int itemId) { - switch (itemId) { + switch (item.id) { case ITEM_STICK: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_STICK) == CUR_CAPACITY(UPG_STICKS)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_STICK)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_STICK) != 0 || AMMO(ITEM_STICK) == CUR_CAPACITY(UPG_STICKS) - 1) { - ImGui::Text("%i", AMMO(ITEM_STICK)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_STICK) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_STICK)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_STICKS)); - ImGui::PopStyleColor(); + result.x = CUR_CAPACITY(UPG_STICKS); + result.y = 30; break; case ITEM_NUT: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_NUT) == CUR_CAPACITY(UPG_NUTS)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_NUT)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_NUT) != 0 || AMMO(ITEM_NUT) == CUR_CAPACITY(UPG_NUTS) - 1) { - ImGui::Text("%i", AMMO(ITEM_NUT)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_NUT) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_NUT)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_NUTS)); - ImGui::PopStyleColor(); + result.x = CUR_CAPACITY(UPG_NUTS); + result.y = 40; break; case ITEM_BOMB: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_BOMB) == CUR_CAPACITY(UPG_BOMB_BAG)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_BOMB)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_BOMB) != 0 || AMMO(ITEM_BOMB) == CUR_CAPACITY(UPG_BOMB_BAG) - 1) { - ImGui::Text("%i", AMMO(ITEM_BOMB)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_BOMB) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_BOMB)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_BOMB_BAG)); - ImGui::PopStyleColor(); + result.x = CUR_CAPACITY(UPG_BOMB_BAG); + result.y = 40; break; - case ITEM_BOW: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_BOW) == CUR_CAPACITY(UPG_QUIVER)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_BOW)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_BOW) != 0 || AMMO(ITEM_BOW) == CUR_CAPACITY(UPG_QUIVER) - 1) { - ImGui::Text("%i", AMMO(ITEM_BOW)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_BOW) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_BOW)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_QUIVER)); - ImGui::PopStyleColor(); + result.x = CUR_CAPACITY(UPG_QUIVER); + result.y = 50; break; case ITEM_SLINGSHOT: - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - if (AMMO(ITEM_SLINGSHOT) == CUR_CAPACITY(UPG_BULLET_BAG)) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_SLINGSHOT)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_SLINGSHOT) != 0 || AMMO(ITEM_SLINGSHOT) == CUR_CAPACITY(UPG_BULLET_BAG) - 1) { - ImGui::Text("%i", AMMO(ITEM_SLINGSHOT)); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } else if (AMMO(ITEM_SLINGSHOT) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_SLINGSHOT)); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::SameLine(0, 0.0f); - } - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", CUR_CAPACITY(UPG_BULLET_BAG)); - ImGui::PopStyleColor(); - break; - case ITEM_BOMBCHU: - if (AMMO(ITEM_BOMBCHU) == 50) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_BOMBCHU)); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_BOMBCHU) != 0 || AMMO(ITEM_BOMBCHU) < 50) { - ImGui::Text("%i", AMMO(ITEM_BOMBCHU)); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - } else if (AMMO(ITEM_BOMBCHU) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_BOMBCHU)); - ImGui::PopStyleColor(); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - } - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("50"); - ImGui::PopStyleColor(); - } - break; - case ITEM_BEAN: - if (AMMO(ITEM_BEAN) == 10) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("%i", AMMO(ITEM_BEAN)); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - ImGui::PopStyleColor(); - } else if (AMMO(ITEM_BEAN) != 0 || AMMO(ITEM_BEAN) < 10) { - ImGui::Text("%i", AMMO(ITEM_BEAN)); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - } else if (AMMO(ITEM_BEAN) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("%i", AMMO(ITEM_BEAN)); - ImGui::PopStyleColor(); - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::Text("/"); - } - } - if (CVar_GetS32("gItemTrackerAmmoDisplay", 0) == 1) { - ImGui::SameLine(0, 0.0f); - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("10"); - ImGui::PopStyleColor(); - } + result.x = CUR_CAPACITY(UPG_BULLET_BAG); + result.y = 50; break; case ITEM_WALLET_ADULT: case ITEM_WALLET_GIANT: - if (CUR_UPG_VALUE(UPG_WALLET) == 0) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("99"); - ImGui::PopStyleColor(); - } else if (CUR_UPG_VALUE(UPG_WALLET) == 1) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("200"); - ImGui::PopStyleColor(); - } else if (CUR_UPG_VALUE(UPG_WALLET) == 2) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); - ImGui::Text("500"); - ImGui::PopStyleColor(); + result.x = CUR_CAPACITY(UPG_WALLET); + result.y = 500; + break; + case ITEM_BEAN: + result.x = AMMO(ITEM_BEAN); + result.y = 10; + break; + case QUEST_SKULL_TOKEN: + result.x = gSaveContext.inventory.gsTokens; + result.y = 100; + break; + case ITEM_KEY_SMALL: + result.x = gSaveContext.inventory.dungeonKeys[item.data]; + switch (item.data) { + case SCENE_BMORI1: + result.y = 5; + break; + case SCENE_HIDAN: + result.y = 8; + break; + case SCENE_MIZUSIN: + result.y = 6; + break; + case SCENE_JYASINZOU: + result.y = 5; + break; + case SCENE_HAKADAN: + result.y = 5; + break; + case SCENE_HAKADANCH: + result.y = 3; + break; + case SCENE_GANONTIKA: + result.y = 2; + break; + case SCENE_MEN: + result.y = 9; + break; + case SCENE_GERUDOWAY: + result.y = 4; + break; } break; - default: - ImGui::Text(" "); - break; + } + + return result; +} + +void DrawItemCount(ItemTrackerItem item) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + ImVec2 currentAndMax = GetItemCurrentAndMax(item); + ImVec2 p = ImGui::GetCursorScreenPos(); + + if (!IsValidSaveFile()) { + ImGui::SetCursorScreenPos(ImVec2(p.x, p.y - 14)); + ImGui::Text(""); + return; + } + + if (currentAndMax.x > 0) { + if (currentAndMax.x >= currentAndMax.y) { + std::string currentString = std::to_string((int)currentAndMax.x); + float x = CVar_GetS32("gItemTrackerCurrentOnLeft", 0) ? p.x : p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2); + + ImGui::SetCursorScreenPos(ImVec2(x, p.y - 14)); + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); + ImGui::Text("%d", (int)currentAndMax.x); + ImGui::PopStyleColor(); + } else { + if (CVar_GetS32("gItemTrackerDisplayCurrentMax", 0) == 1) { + std::string currentAndMaxString = std::to_string((int)currentAndMax.x) + "/" + std::to_string((int)currentAndMax.y); + + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentAndMaxString.c_str()).x / 2), p.y - 14)); + ImGui::Text("%d/", (int)currentAndMax.x); + ImGui::SameLine(0, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 255, 0, 255)); + ImGui::Text("%d", (int)currentAndMax.y); + ImGui::PopStyleColor(); + } else { + std::string currentString = std::to_string((int)currentAndMax.x); + float x = CVar_GetS32("gItemTrackerCurrentOnLeft", 0) ? p.x : p.x + (iconSize / 2) - (ImGui::CalcTextSize(currentString.c_str()).x / 2); + + ImGui::SetCursorScreenPos(ImVec2(x, p.y - 14)); + ImGui::Text("%d", (int)currentAndMax.x); + } + } } } -void DrawBottle(uint32_t itemId, uint32_t bottleSlot) { - uint32_t actualItemId = gSaveContext.inventory.items[SLOT(itemId) + bottleSlot]; - bool hasItem = actualItemId != ITEM_NONE; - const ItemTrackerMapEntry& entry = itemTrackerMap[hasItem && IsValidSaveFile() ? actualItemId : itemId]; - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? entry.name : entry.nameFaded), +void DrawEquip(ItemTrackerItem item) { + bool hasEquip = (item.data & gSaveContext.inventory.equipment) != 0; + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + ImGui::Image(SohImGui::GetTextureByName(hasEquip && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); + SetLastItemHoverText(SohUtils::GetItemName(item.id)); +} + +void DrawQuest(ItemTrackerItem item) { + bool hasQuestItem = (item.data & gSaveContext.inventory.questItems) != 0; + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + ImGui::BeginGroup(); + ImGui::Image(SohImGui::GetTextureByName(hasQuestItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); + + if (item.id == QUEST_SKULL_TOKEN) { + DrawItemCount(item); + } + + ImGui::EndGroup(); + + SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); }; -void DrawDungeonItem(uint32_t itemId, uint32_t scene) { - const ItemTrackerMapEntry& entry = itemTrackerMap[itemId]; - uint32_t bitMask = 1 << (entry.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[scene]) != 0; - bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[scene]) >= 0; +void DrawItem(ItemTrackerItem item) { + uint32_t actualItemId = INV_CONTENT(item.id); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + bool hasItem = actualItemId != ITEM_NONE; + + if (item.id == ITEM_NONE) { + return; + } + + switch (item.id) { + case ITEM_HEART_CONTAINER: + actualItemId = item.id; + hasItem = !!gSaveContext.doubleDefense; + break; + case ITEM_MAGIC_SMALL: + case ITEM_MAGIC_LARGE: + actualItemId = gSaveContext.magicLevel == 2 ? ITEM_MAGIC_LARGE : ITEM_MAGIC_SMALL; + hasItem = gSaveContext.magicLevel > 0; + break; + case ITEM_WALLET_ADULT: + case ITEM_WALLET_GIANT: + actualItemId = CUR_UPG_VALUE(UPG_WALLET) == 2 ? ITEM_WALLET_GIANT : ITEM_WALLET_ADULT; + hasItem = true; + break; + case ITEM_BRACELET: + case ITEM_GAUNTLETS_SILVER: + case ITEM_GAUNTLETS_GOLD: + actualItemId = CUR_UPG_VALUE(UPG_STRENGTH) == 3 ? ITEM_GAUNTLETS_GOLD : CUR_UPG_VALUE(UPG_STRENGTH) == 2 ? ITEM_GAUNTLETS_SILVER : ITEM_BRACELET; + hasItem = CUR_UPG_VALUE(UPG_STRENGTH) > 0; + break; + case ITEM_SCALE_SILVER: + case ITEM_SCALE_GOLDEN: + actualItemId = CUR_UPG_VALUE(UPG_SCALE) == 2 ? ITEM_SCALE_GOLDEN : ITEM_SCALE_SILVER; + hasItem = CUR_UPG_VALUE(UPG_SCALE) > 0; + break; + } + + if (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end()) { + item = actualItemTrackerItemMap[actualItemId]; + } + + ImGui::BeginGroup(); + ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); + + DrawItemCount(item); + ImGui::EndGroup(); + + SetLastItemHoverText(SohUtils::GetItemName(item.id)); +} + +void DrawBottle(ItemTrackerItem item) { + uint32_t actualItemId = gSaveContext.inventory.items[SLOT(item.id) + item.data]; + bool hasItem = actualItemId != ITEM_NONE; + + if (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end()) { + item = actualItemTrackerItemMap[actualItemId]; + } + + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), + ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); + + SetLastItemHoverText(SohUtils::GetItemName(item.id)); +}; + +void DrawDungeonItem(ItemTrackerItem item) { + uint32_t itemId = item.id; + uint32_t bitMask = 1 << (item.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[item.data]) != 0; + bool hasSmallKey = (gSaveContext.inventory.dungeonKeys[item.data]) >= 0; ImGui::BeginGroup(); if (itemId == ITEM_KEY_SMALL) { - ImGui::Image(SohImGui::GetTextureByName(hasSmallKey && IsValidSaveFile() ? entry.name : entry.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasSmallKey && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } else { - ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? entry.name : entry.nameFaded), + ImGui::Image(SohImGui::GetTextureByName(hasItem && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); } - ImVec2 p = ImGui::GetCursorScreenPos(); - int estimatedTextWidth = 10; - int estimatedTextHeight = 10; - ImGui::SetCursorScreenPos(ImVec2(p.x - 5 + (iconSize / 2) - estimatedTextWidth, p.y - estimatedTextHeight)); + if (itemId == ITEM_KEY_SMALL) { + DrawItemCount(item); - if (itemId == ITEM_KEY_SMALL) { // This check there for small key is necessary to get the text position properly and can't be on the same ITEM_KEY chack from the top - if (gSaveContext.inventory.dungeonKeys[scene] <= 0 || !IsValidSaveFile()) { - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(155, 155, 155, 255)); - ImGui::Text("0"); - ImGui::PopStyleColor(); - } - else { - ImGui::Text("%i", gSaveContext.inventory.dungeonKeys[scene]); - } + ImVec2 p = ImGui::GetCursorScreenPos(); + std::string dungeonName = itemTrackerDungeonShortNames[item.data]; + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 16))); + ImGui::Text(dungeonName.c_str()); + } + + if (itemId == ITEM_DUNGEON_MAP && + (item.data == SCENE_YDAN || item.data == SCENE_DDAN || item.data == SCENE_BDAN || item.data == SCENE_ICE_DOUKUTO) + ) { + ImVec2 p = ImGui::GetCursorScreenPos(); + std::string dungeonName = itemTrackerDungeonShortNames[item.data]; + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(dungeonName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::Text(dungeonName.c_str()); } ImGui::EndGroup(); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); + SetLastItemHoverText(SohUtils::GetItemName(item.id)); } -typedef struct { - uint8_t id; - std::string name; - std::string nameFaded; -} ItemTrackerUpgradeEntry; - -#define ITEM_TRACKER_UPGRADE_ENTRY(id) \ - { id, #id, #id "_Faded" } - -std::unordered_map> upgradeTrackerMap = { - { UPG_STRENGTH, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BRACELET), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_GAUNTLETS_SILVER), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_GAUNTLETS_GOLD), - } }, - { UPG_SCALE, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_SCALE_SILVER), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_SCALE_GOLDEN), - } }, - { UPG_QUIVER, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_QUIVER_30), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_QUIVER_40), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_QUIVER_50), - } }, - { UPG_BULLET_BAG, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BULLET_BAG_30), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BULLET_BAG_40), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BULLET_BAG_50), - } }, - { UPG_BOMB_BAG, - { - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BOMB_BAG_20), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BOMB_BAG_30), - ITEM_TRACKER_UPGRADE_ENTRY(ITEM_BOMB_BAG_40), - } }, - -}; - -void DrawUpgrade(int32_t categoryId) { - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - if (CUR_UPG_VALUE(categoryId) == 0 || !IsValidSaveFile()) { - const ItemTrackerUpgradeEntry& entry = upgradeTrackerMap[categoryId][0]; - ImGui::Image(SohImGui::GetTextureByName(entry.nameFaded), ImVec2(iconSize, iconSize), ImVec2(0, 0), - ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); - } else { - const ItemTrackerUpgradeEntry& entry = upgradeTrackerMap[categoryId][CUR_UPG_VALUE(categoryId) - 1]; - ImGui::Image(SohImGui::GetTextureByName(entry.name), ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetItemName(entry.id)); - } -} - -typedef struct { - uint32_t id; - std::string name; - std::string nameFaded; - ImVec4 color; -} ItemTrackerSongEntry; - -#define ITEM_TRACKER_SONG_ENTRY(id) \ - { \ - id, { \ - id, #id, #id "_Faded" \ - } \ - } - -// Maps song ids to info for use in ImGui -std::unordered_map songTrackerMap = { - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_LULLABY), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_EPONA), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SARIA), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SUN), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_TIME), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_STORMS), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_MINUET), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_BOLERO), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SERENADE), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_REQUIEM), - ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_NOCTURNE), ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_PRELUDE), -}; - -#define VANILLA_ITEM_TRACKER_SONG_ENTRY(id) \ - { \ - id, { \ - id, #id "_Vanilla", #id "_Vanilla_Faded" \ - } \ - } - -// Maps song ids to info for use in ImGui -std::unordered_map vanillaSongTrackerMap = { - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_LULLABY), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_EPONA), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SARIA), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SUN), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_TIME), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_STORMS), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_MINUET), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_BOLERO), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_SERENADE), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_REQUIEM), - VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_NOCTURNE), VANILLA_ITEM_TRACKER_SONG_ENTRY(QUEST_SONG_PRELUDE), -}; - -void DrawSong(int32_t songId) { - int iconSize = CVar_GetS32("gRandoTrackIconSize", 0); - const ItemTrackerSongEntry& entry = - CVar_GetS32("gItemTrackeSongColor", 0) ? songTrackerMap[songId] : vanillaSongTrackerMap[songId]; - uint32_t bitMask = 1 << entry.id; +void DrawSong(ItemTrackerItem item) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + uint32_t bitMask = 1 << item.id; bool hasSong = (bitMask & gSaveContext.inventory.questItems) != 0; - ImGui::Image(SohImGui::GetTextureByName(hasSong && IsValidSaveFile() ? entry.name : entry.nameFaded), + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::SetCursorScreenPos(ImVec2(p.x + 6, p.y)); + ImGui::Image(SohImGui::GetTextureByName(hasSong && IsValidSaveFile() ? item.name : item.nameFaded), ImVec2(iconSize / 1.5, iconSize), ImVec2(0, 0), ImVec2(1, 1)); - SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id)); + SetLastItemHoverText(SohUtils::GetQuestItemName(item.id)); } -// Theme 1 Original Tracker style -void DrawFloatingInventory(int Icon_Cells_Size, int Icon_Spacing) { +void DrawNotes(bool resizeable = false) { ImGui::BeginGroup(); - DrawItem(ITEM_STICK); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawItem(ITEM_NUT); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawItem(ITEM_BOMB); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawItem(ITEM_BOW); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_ARROW_FIRE); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_DINS_FIRE); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawItem(ITEM_SLINGSHOT); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawItem(ITEM_OCARINA_FAIRY); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawItem(ITEM_BOMBCHU); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawItem(ITEM_HOOKSHOT); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_ARROW_ICE); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_FARORES_WIND); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawItem(ITEM_BOOMERANG); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawItem(ITEM_LENS); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawItem(ITEM_BEAN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawItem(ITEM_HAMMER); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_ARROW_LIGHT); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_NAYRUS_LOVE); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawBottle(ITEM_BOTTLE, 0); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawBottle(ITEM_BOTTLE, 1); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawBottle(ITEM_BOTTLE, 2); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawBottle(ITEM_BOTTLE, 3); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_POCKET_EGG); // ADULT TRADE - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_MASK_KEATON); // CHILD TRADE - ImGui::EndGroup(); -} -void DrawFloatingEquipsQuestUpgradeStones(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawEquip(ITEM_SWORD_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_SWORD_MASTER); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_SWORD_BGS); // PURPLE TODO: CHECK IF BGS OR BROKEN SWORD TO DISPLAY - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawQuest(QUEST_STONE_OF_AGONY); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawQuest(QUEST_GERUDO_CARD); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawQuest(QUEST_SKULL_TOKEN); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_SHIELD_DEKU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_SHIELD_HYLIAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_SHIELD_MIRROR); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawUpgrade(UPG_STRENGTH); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawUpgrade(UPG_SCALE); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawItem(ITEM_WALLET_ADULT); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_TUNIC_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_TUNIC_GORON); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_TUNIC_ZORA); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawItem(ITEM_HEART_CONTAINER); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawItem(ITEM_MAGIC_SMALL); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_BOOTS_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_BOOTS_IRON); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_BOOTS_HOVER); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawQuest(QUEST_KOKIRI_EMERALD); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawQuest(QUEST_GORON_RUBY); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawQuest(QUEST_ZORA_SAPPHIRE); - ImGui::EndGroup(); -} -void DrawFloatingTokens(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerTheme", 0) == 0 || !CVar_GetS32("gItemTrackerMedallionsPlacement", 0)) { - DrawQuest(QUEST_MEDALLION_FOREST); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawQuest(QUEST_MEDALLION_FIRE); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_MEDALLION_WATER); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawQuest(QUEST_MEDALLION_SPIRIT); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawQuest(QUEST_MEDALLION_SHADOW); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawQuest(QUEST_MEDALLION_LIGHT); - } else if (CVar_GetS32("gItemTrackerTheme", 0) != 0 && CVar_GetS32("gItemTrackerMedallionsPlacement", 0)) { - ImGui::BeginGroup(); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 1); - DrawQuest(QUEST_MEDALLION_LIGHT); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawQuest(QUEST_MEDALLION_SHADOW); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_MEDALLION_FOREST); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawQuest(QUEST_MEDALLION_SPIRIT); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_MEDALLION_FIRE); - ImGui::EndGroup(); - ImGui::BeginGroup(); - ImGui::NewLine(); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 1); - DrawQuest(QUEST_MEDALLION_WATER); - ImGui::EndGroup(); - } - ImGui::EndGroup(); -} + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); -void DrawFloatingSongs(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawSong(QUEST_SONG_LULLABY); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawSong(QUEST_SONG_EPONA); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawSong(QUEST_SONG_SARIA); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawSong(QUEST_SONG_SUN); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawSong(QUEST_SONG_TIME); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawSong(QUEST_SONG_STORMS); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawSong(QUEST_SONG_MINUET); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawSong(QUEST_SONG_BOLERO); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawSong(QUEST_SONG_SERENADE); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawSong(QUEST_SONG_REQUIEM); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawSong(QUEST_SONG_NOCTURNE); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawSong(QUEST_SONG_PRELUDE); - ImGui::EndGroup(); -} - -// Theme 2 per cells elements -void DrawFloatingEquipments(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawEquip(ITEM_SWORD_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_SWORD_MASTER); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_SWORD_BGS); // PURPLE TODO: CHECK IF BGS OR BROKEN SWORD TO DISPLAY - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_SHIELD_DEKU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_SHIELD_HYLIAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_SHIELD_MIRROR); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_TUNIC_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_TUNIC_GORON); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_TUNIC_ZORA); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawEquip(ITEM_BOOTS_KOKIRI); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawEquip(ITEM_BOOTS_IRON); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawEquip(ITEM_BOOTS_HOVER); - ImGui::EndGroup(); -} - -void DrawFloatingUpgrades(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawUpgrade(UPG_STRENGTH); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawUpgrade(UPG_SCALE); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawItem(ITEM_WALLET_ADULT); - ImGui::EndGroup(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + Icon_Spacing); - ImGui::BeginGroup(); - DrawItem(ITEM_HEART_CONTAINER); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawItem(ITEM_MAGIC_SMALL); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::EndGroup(); -} - -void DrawFloatingQuest(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawQuest(QUEST_STONE_OF_AGONY); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawQuest(QUEST_GERUDO_CARD); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_SKULL_TOKEN); - ImGui::EndGroup(); -} - -void DrawFloatingStones(int Icon_Cells_Size, int Icon_Spacing) { - ImGui::BeginGroup(); - DrawQuest(QUEST_KOKIRI_EMERALD); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawQuest(QUEST_GORON_RUBY); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawQuest(QUEST_ZORA_SAPPHIRE); - ImGui::EndGroup(); -} - -void DrawFloatingDungeons(int Icon_Cells_Size, int Icon_Spacing) { - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::Text("DEKU"); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - ImGui::Text("DCVN"); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::Text("JABU"); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - ImGui::Text("FRST"); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - ImGui::Text("FIRE"); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - ImGui::Text("WATR"); - } - else { - ImGui::Text("FRST"); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - ImGui::Text("FIRE"); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::Text("WATR"); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - ImGui::Text("SPRT"); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - ImGui::Text("SHDW"); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - ImGui::Text("GANON"); - } - ImGui::EndGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_YDAN); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_DDAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_BDAN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_MIZUSIN); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_COMPASS, SCENE_YDAN); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_COMPASS, SCENE_DDAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_COMPASS, SCENE_BDAN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_COMPASS, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_COMPASS, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_COMPASS, SCENE_MIZUSIN); - ImGui::EndGroup(); - } - // SMALL KEYS FOR DEKU TREE TO WATER TEMPLE - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::NewLine(); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_MIZUSIN); - ImGui::EndGroup(); - // BOSS KEYS FOR DEKU TREE TO WATER TEMPLE - ImGui::BeginGroup(); - ImGui::NewLine(); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_MIZUSIN); - } else { - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing ); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_MIZUSIN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size *4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_GANONTIKA); - ImGui::EndGroup(); - // BOSS KEYS FOR FOREST TO GANON - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_BMORI1); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_HIDAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_MIZUSIN); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size *4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_GANON); - } - ImGui::EndGroup(); - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::Text("SPRT"); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - ImGui::Text("SHDW"); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::Text("BOTW"); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - ImGui::Text("ICE"); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - ImGui::Text("GTG"); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - ImGui::Text("GANON"); - } else { - ImGui::Text("BOTW"); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - ImGui::Text("HIDE"); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - ImGui::Text("GTG"); - } - ImGui::EndGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_HAKADANCH); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_DUNGEON_MAP, SCENE_ICE_DOUKUTO); - ImGui::SameLine(Icon_Cells_Size * 4); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 4); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_MEN); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_GANONTIKA); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_COMPASS, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_COMPASS, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_COMPASS, SCENE_HAKADANCH); - ImGui::SameLine(Icon_Cells_Size * 3); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 3); - DrawDungeonItem(ITEM_COMPASS, SCENE_ICE_DOUKUTO); - ImGui::SameLine(Icon_Cells_Size * 5); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 5); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_GANON); - ImGui::EndGroup(); - } - ImGui::BeginGroup(); - if (CVar_GetS32("gItemTrackerDisplayMapsAndCompasses", 0)) { - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HAKADAN); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HAKADANCH); - ImGui::EndGroup(); - ImGui::BeginGroup(); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_JYASINZOU); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_KEY_BOSS, SCENE_HAKADAN); - } else { - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_HAKADANCH); - ImGui::SameLine(Icon_Cells_Size); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_GERUDOWAY); - ImGui::SameLine(Icon_Cells_Size * 2); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + Icon_Spacing * 2); - DrawDungeonItem(ITEM_KEY_SMALL, SCENE_MEN); - } - ImGui::EndGroup(); - } -} - -void DrawFloatingNotes(int Icon_Cells_Size, int Icon_Spacing) { - if (CVar_GetS32("gItemTrackerNotes", 0)) { - ImGui::BeginGroup(); - struct ItemTrackerNotes { - static int TrackerNotesResizeCallback(ImGuiInputTextCallbackData* data) { - if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) { - ImVector* itemTrackerNotes = (ImVector*)data->UserData; - IM_ASSERT(itemTrackerNotes->begin() == data->Buf); - itemTrackerNotes->resize( - data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 - data->Buf = itemTrackerNotes->begin(); - } - return 0; - } - static bool TrackerNotesInputTextMultiline(const char* label, ImVector* itemTrackerNotes, const ImVec2& size = ImVec2(0, 0), - ImGuiInputTextFlags flags = 0) { - IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); - return ImGui::InputTextMultiline(label, itemTrackerNotes->begin(), (size_t)itemTrackerNotes->size(), - size, flags | ImGuiInputTextFlags_CallbackResize, - ItemTrackerNotes::TrackerNotesResizeCallback, - (void*)itemTrackerNotes); - } - }; - static ImVector itemTrackerNotes; - if (itemTrackerNotes.empty()) { - itemTrackerNotes.push_back(0); + struct ItemTrackerNotes { + static int TrackerNotesResizeCallback(ImGuiInputTextCallbackData* data) { + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) { + ImVector* itemTrackerNotes = (ImVector*)data->UserData; + IM_ASSERT(itemTrackerNotes->begin() == data->Buf); + itemTrackerNotes->resize( + data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 + data->Buf = itemTrackerNotes->begin(); } - ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), ImGuiInputTextFlags_AllowTabInput); - ImGui::EndGroup(); + return 0; + } + static bool TrackerNotesInputTextMultiline(const char* label, ImVector* itemTrackerNotes, const ImVec2& size = ImVec2(0, 0), + ImGuiInputTextFlags flags = 0) { + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + return ImGui::InputTextMultiline(label, itemTrackerNotes->begin(), (size_t)itemTrackerNotes->size(), + size, flags | ImGuiInputTextFlags_CallbackResize, + ItemTrackerNotes::TrackerNotesResizeCallback, + (void*)itemTrackerNotes); + } + }; + static ImVector itemTrackerNotes; + if (itemTrackerNotes.empty()) { + itemTrackerNotes.push_back(0); } + ImVec2 size = resizeable ? ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y) : ImVec2(((iconSize + iconSpacing) * 6) - 8, 200); + ItemTrackerNotes::TrackerNotesInputTextMultiline("##ItemTrackerNotes", &itemTrackerNotes, size, ImGuiInputTextFlags_AllowTabInput); + ImGui::EndGroup(); } // Windowing stuff -ImVec4 ChromaKeyBackground = { 0, 0, 0, 1 }; // Float value, 1 = 255 in rgb value. -void BeginFloatingWindows(std::string UniqueName) { - ImGuiWindowFlags FloatingWndFlags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoDocking | - ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | - ImGuiWindowFlags_NoScrollbar; - if (!CVar_GetS32("gItemTrackerHudEditMode", 0)) { - FloatingWndFlags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | - ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoDecoration | - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar | - ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; +ImVec4 ChromaKeyBackground = { 0, 0, 0, 0 }; // Float value, 1 = 255 in rgb value. +void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) { + ImGuiWindowFlags windowFlags = flags; + + if (windowFlags == 0) { + windowFlags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; + } + + if (!CVar_GetS32("gItemTrackerWindowType", 0)) { + ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); + windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; + + if (!CVar_GetS32("gItemTrackerHudEditMode", 0)) { + windowFlags |= ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove; + } } ImGui::PushStyleColor(ImGuiCol_WindowBg, ChromaKeyBackground); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); - ImGui::Begin(UniqueName.c_str(), nullptr, FloatingWndFlags); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); + ImGui::Begin(UniqueName.c_str(), nullptr, windowFlags); } void EndFloatingWindows() { + ImGui::PopStyleVar(); ImGui::PopStyleColor(); ImGui::PopStyleColor(); ImGui::End(); } +/** + * DrawItemsInRows + * Takes in a vector of ItemTrackerItem and draws them in rows of N items + */ +void DrawItemsInRows(std::vector items, int columns = 6) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); + int topPadding = CVar_GetS32("gItemTrackerWindowType", 0) ? 20 : 0; + + for (int i = 0; i < items.size(); i++) { + int row = i / columns; + int column = i % columns; + ImGui::SetCursorPos(ImVec2((column * (iconSize + iconSpacing) + 8), (row * (iconSize + iconSpacing)) + 8 + topPadding)); + items[i].drawFunc(items[i]); + } +} + +/** + * DrawItemsInACircle + * Takes in a vector of ItemTrackerItem and draws them evenly spread across a circle + */ +void DrawItemsInACircle(std::vector items) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); + + ImVec2 max = ImGui::GetWindowContentRegionMax(); + float radius = (iconSize + iconSpacing) * 2; + + for (int i = 0; i < items.size(); i++) { + float angle = (float)i / items.size() * 2.0f * M_PI; + float x = (radius / 2.0f) * cos(angle) + max.x / 2.0f; + float y = (radius / 2.0f) * sin(angle) + max.y / 2.0f; + ImGui::SetCursorPos(ImVec2(x - 14, y + 4)); + items[i].drawFunc(items[i]); + } +} + +/** + * GetDungeonItemsVector + * Loops over dungeons and creates vectors of items in the correct order + * to then call DrawItemsInRows + */ +std::vector GetDungeonItemsVector(std::vector dungeons, int columns = 6) { + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); + std::vector dungeonItems = {}; + + int rowCount = 0; + for (int i = 0; i < dungeons.size(); i++) { + if (dungeons[i].items.size() > rowCount) rowCount = dungeons[i].items.size(); + } + + for (int i = 0; i < rowCount; i++) { + for (int j = 0; j < MIN(dungeons.size(), columns); j++) { + if (dungeons[j].items.size() > i) { + switch (dungeons[j].items[i]) { + case ITEM_KEY_SMALL: + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, dungeons[j].id, DrawDungeonItem)); + break; + case ITEM_KEY_BOSS: + // Swap Ganon's Castle boss key to the right scene ID manually + if (dungeons[j].id == SCENE_GANONTIKA) { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, SCENE_GANON, DrawDungeonItem)); + } else { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_KEY_BOSS, dungeons[j].id, DrawDungeonItem)); + } + break; + case ITEM_DUNGEON_MAP: + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_DUNGEON_MAP, dungeons[j].id, DrawDungeonItem)); + break; + case ITEM_COMPASS: + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_COMPASS, dungeons[j].id, DrawDungeonItem)); + break; + } + } else { + dungeonItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + } + } + + if (dungeons.size() > columns) { + std::vector nextDungeonItems = GetDungeonItemsVector(std::vector(dungeons.begin() + columns, dungeons.end()), columns); + dungeonItems.insert(dungeonItems.end(), nextDungeonItems.begin(), nextDungeonItems.end()); + } + + return dungeonItems; +} + +/* TODO: These need to be moved to a common imgui file */ +void LabeledComboBoxRightAligned(const char* label, const char* cvar, std::vector options, s32 defaultValue) { + s32 currentValue = CVar_GetS32(cvar, defaultValue); + std::string hiddenLabel = "##" + std::string(cvar); + ImGui::Text(label); + ImGui::SameLine(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize(options[currentValue].c_str()).x * 1.0f + 20.0f)); + ImGui::PushItemWidth((ImGui::CalcTextSize(options[currentValue].c_str()).x * 1.0f) + 30.0f); + if (ImGui::BeginCombo(hiddenLabel.c_str(), options[currentValue].c_str())) { + for (int i = 0; i < options.size(); i++) { + if (ImGui::Selectable(options[i].c_str())) { + CVar_SetS32(cvar, i); + SohImGui::needs_save = true; + shouldUpdateVectors = true; + } + } + + ImGui::EndCombo(); + } + ImGui::PopItemWidth(); +} + +void PaddedEnhancementCheckbox(const char* text, const char* cvarName, s32 defaultValue = 0, bool padTop = true, bool padBottom = true) { + if (padTop) { + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + } + bool val = (bool)CVar_GetS32(cvarName, defaultValue); + if (ImGui::Checkbox(text, &val)) { + CVar_SetS32(cvarName, val); + SohImGui::needs_save = true; + shouldUpdateVectors = true; + } + if (padBottom) { + ImGui::Dummy(ImVec2(0.0f, 0.0f)); + } +} +/* ****************************************************** */ + +void UpdateVectors() { + if (!shouldUpdateVectors) { + return; + } + + dungeonRewards.clear(); + dungeonRewards.insert(dungeonRewards.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); + dungeonRewards.insert(dungeonRewards.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); + + dungeonItems.clear(); + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1) && CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsWithMapsHorizontal, 12); + // Manually adding Thieves Hideout to an open spot so we don't get an additional row for one item + dungeonItems[23] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + } else { + // Manually adding Thieves Hideout to an open spot so we don't get an additional row for one item + dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsHorizontal, 8); + dungeonItems[15] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + } + } else { + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsWithMapsCompact); + // Manually adding Thieves Hideout to an open spot so we don't get an additional row for one item + dungeonItems[35] = ITEM_TRACKER_ITEM(ITEM_KEY_SMALL, SCENE_GERUDOWAY, DrawDungeonItem); + } else { + dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsCompact); + } + } + + mainWindowItems.clear(); + if (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) { + mainWindowItems.insert(mainWindowItems.end(), inventoryItems.begin(), inventoryItems.end()); + } + if (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) { + mainWindowItems.insert(mainWindowItems.end(), equipmentItems.begin(), equipmentItems.end()); + } + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { + mainWindowItems.insert(mainWindowItems.end(), miscItems.begin(), miscItems.end()); + } + if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 1) { + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) { + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + mainWindowItems.insert(mainWindowItems.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); + mainWindowItems.insert(mainWindowItems.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); + } + if (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) { + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1 && CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) != 1) { + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + mainWindowItems.insert(mainWindowItems.end(), songItems.begin(), songItems.end()); + } + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 1) { + mainWindowItems.insert(mainWindowItems.end(), dungeonItems.begin(), dungeonItems.end()); + } + + shouldUpdateVectors = false; +} + void DrawItemTracker(bool& open) { + UpdateVectors(); if (!open) { CVar_SetS32("gItemTrackerEnabled", 0); return; } - int Icon_Cells_Size = CVar_GetS32("gRandoTrackIconSize", 0); - int Icon_Spacing = CVar_GetS32("gRandoTrackIconSpacing", 0); + int iconSize = CVar_GetS32("gItemTrackerIconSize", 36); + int iconSpacing = CVar_GetS32("gItemTrackerIconSpacing", 12); + int comboButton1Mask = buttonMap[CVar_GetS32("gItemTrackerComboButton1", 6)]; + int comboButton2Mask = buttonMap[CVar_GetS32("gItemTrackerComboButton2", 8)]; + bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask; + bool isPaused = CVar_GetS32("gItemTrackerShowOnlyPaused", 0) == 0 || gGlobalCtx != nullptr && gGlobalCtx->pauseCtx.state > 0; - if (CVar_GetS32("gItemTrackerEnabled", 0)) { - int ImGui_DefaultMargin = 0; - if (CVar_GetS32("gItemTrackerTheme", 0) == 0) { // One block tracker, original tracker style - BeginFloatingWindows("ItemTracker_Theme_0_Grouped"); - DrawFloatingInventory(Icon_Cells_Size, Icon_Spacing); - DrawFloatingEquipsQuestUpgradeStones(Icon_Cells_Size, Icon_Spacing); - DrawFloatingTokens(Icon_Cells_Size, Icon_Spacing); - DrawFloatingSongs(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - BeginFloatingWindows("ItemTracker_Theme_0_Dungeons"); - DrawFloatingDungeons(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); + if (CVar_GetS32("gItemTrackerWindowType", 0) == 1 || isPaused && (CVar_GetS32("gItemTrackerDisplayType", 0) == 0 ? CVar_GetS32("gItemTrackerEnabled", 0) : comboButtonsHeld)) { + if ( + (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 1) == 1) || + (CVar_GetS32("gItemTrackerNotesDisplayType", 2) == 1) + ) { + BeginFloatingWindows("Item Tracker##main window"); + DrawItemsInRows(mainWindowItems, 6); + + if (CVar_GetS32("gItemTrackerNotesDisplayType", 2) == 1 && CVar_GetS32("gItemTrackerDisplayType", 0) == 0) { + DrawNotes(); } - /* - if (CVar_GetS32("gItemTrackerNotes", 0)) { - BeginFloatingWindows("ItemTracker_Theme_0_Notes"); - DrawFloatingNotes(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - }*/ - } else if (CVar_GetS32("gItemTrackerTheme", 0) == 1) { // Per groups elements N.1 - BeginFloatingWindows("ItemTracker_Theme_1_Inventory"); - DrawFloatingInventory(Icon_Cells_Size, Icon_Spacing); EndFloatingWindows(); + } - BeginFloatingWindows("ItemTracker_Theme_1_Stuffs"); - DrawFloatingEquipsQuestUpgradeStones(Icon_Cells_Size, Icon_Spacing); + if (CVar_GetS32("gItemTrackerInventoryItemsDisplayType", 1) == 2) { + BeginFloatingWindows("Inventory Items Tracker"); + DrawItemsInRows(inventoryItems); EndFloatingWindows(); + } - BeginFloatingWindows("ItemTracker_Theme_1_Tokens"); - DrawFloatingTokens(Icon_Cells_Size, Icon_Spacing); + if (CVar_GetS32("gItemTrackerEquipmentItemsDisplayType", 1) == 2) { + BeginFloatingWindows("Equipment Items Tracker"); + DrawItemsInRows(equipmentItems, 3); EndFloatingWindows(); + } - BeginFloatingWindows("ItemTracker_Theme_1_Songs"); - DrawFloatingSongs(Icon_Cells_Size, Icon_Spacing); + if (CVar_GetS32("gItemTrackerMiscItemsDisplayType", 1) == 2) { + BeginFloatingWindows("Misc Items Tracker"); + DrawItemsInRows(miscItems, 4); EndFloatingWindows(); + } - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - BeginFloatingWindows("ItemTracker_Theme_1_Dungeons"); - DrawFloatingDungeons(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); + if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 2) { + BeginFloatingWindows("Dungeon Rewards Tracker"); + if (CVar_GetS32("gItemTrackerDungeonRewardsCircle", 0) == 1) { + ImGui::BeginGroup(); + DrawItemsInACircle(dungeonRewardMedallions); + ImGui::EndGroup(); + ImGui::BeginGroup(); + DrawItemsInRows(dungeonRewardStones); + ImGui::EndGroup(); + } else { + DrawItemsInRows(dungeonRewards, 3); } - /* - if (CVar_GetS32("gItemTrackerNotes", 0)) { - BeginFloatingWindows("ItemTracker_Theme_1_Notes"); - DrawFloatingNotes(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - }*/ - } else if (CVar_GetS32("gItemTrackerTheme", 0) == 2) { // Per groups elements N.2 - BeginFloatingWindows("ItemTracker_Theme_2_Inventory"); - DrawFloatingInventory(Icon_Cells_Size, Icon_Spacing); EndFloatingWindows(); + } - BeginFloatingWindows("ItemTracker_Theme_2_Equips"); - DrawFloatingEquipments(Icon_Cells_Size, Icon_Spacing); + if (CVar_GetS32("gItemTrackerSongsDisplayType", 1) == 2) { + BeginFloatingWindows("Songs Tracker"); + DrawItemsInRows(songItems); EndFloatingWindows(); + } - BeginFloatingWindows("ItemTracker_Theme_2_Upgrade"); - DrawFloatingUpgrades(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Quest"); - DrawFloatingQuest(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Stones"); - DrawFloatingStones(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Tokens"); - DrawFloatingTokens(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - BeginFloatingWindows("ItemTracker_Theme_2_Song"); - DrawFloatingSongs(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - BeginFloatingWindows("ItemTracker_Theme_2_Dungeons"); - DrawFloatingDungeons(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { + BeginFloatingWindows("Dungeon Items Tracker"); + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsHorizontal", 1)) { + if (CVar_GetS32("gItemTrackerDisplayDungeonItemsMaps", 1)) { + DrawItemsInRows(dungeonItems, 12); + } else { + DrawItemsInRows(dungeonItems, 8); + } + } else { + DrawItemsInRows(dungeonItems); } - /* - if (CVar_GetS32("gItemTrackerNotes", 0)) { - BeginFloatingWindows("ItemTracker_Theme_2_Notes"); - DrawFloatingNotes(Icon_Cells_Size, Icon_Spacing); - EndFloatingWindows(); - }*/ + EndFloatingWindows(); + } + + if (CVar_GetS32("gItemTrackerNotesDisplayType", 2) == 2 && CVar_GetS32("gItemTrackerDisplayType", 0) == 0) { + ImGui::SetNextWindowSize(ImVec2(400,300), ImGuiCond_FirstUseEver); + BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing); + DrawNotes(true); + EndFloatingWindows(); } } } @@ -1567,108 +836,81 @@ void DrawItemTrackerOptions(bool& open) { return; } - ImGui::SetNextWindowSize(ImVec2(240, 285), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(600,375), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Item Tracker Settings", &open, ImGuiWindowFlags_NoFocusOnAppearing)) { ImGui::End(); return; } - SohImGui::EnhancementCheckbox("Display \"Ammo/MaxAmo\"", "gItemTrackerAmmoDisplay"); - SohImGui::EnhancementCheckbox("Randomizer colors for Songs", "gItemTrackeSongColor"); - SohImGui::Tooltip("Will display non-warp songs with randomizer colors instead of pure white"); - - SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gRandoTrackIconSize", 25, 128, "", 32, - true); - SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gRandoTrackIconSpacing", -5, 50, "", - 0, true); - // SohImGui::EnhancementSliderInt("X spacing : %dpx", "##ITEMTRACKERSPACINGX", "gRandoTrackIconSpacingX", 0, 256, - // ""); SohImGui::EnhancementSliderInt("Y Spacing : %dpx", "##ITEMTRACKERSPACINGY", "gRandoTrackIconSpacingY", 0, - // 255, ""); - + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); + ImGui::BeginTable("itemTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); + ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); + ImGui::TableHeadersRow(); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("BG Color"); + ImGui::SameLine(); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); - ImGui::Text("Chroma Key"); - auto flags = ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel; - ImGui::ColorEdit4("Chroma Key Selection", (float*)&ChromaKeyBackground, flags); - CVar_SetFloat("gItemTrackerBgColorR", ChromaKeyBackground.x); - CVar_SetFloat("gItemTrackerBgColorG", ChromaKeyBackground.y); - CVar_SetFloat("gItemTrackerBgColorB", ChromaKeyBackground.z); - CVar_SetFloat("gItemTrackerBgColorA", ChromaKeyBackground.w); + if (ImGui::ColorEdit4("BG Color##gItemTrackerBgColor", (float*)&ChromaKeyBackground, ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_NoLabel)) { + CVar_SetFloat("gItemTrackerBgColorR", ChromaKeyBackground.x); + CVar_SetFloat("gItemTrackerBgColorG", ChromaKeyBackground.y); + CVar_SetFloat("gItemTrackerBgColorB", ChromaKeyBackground.z); + CVar_SetFloat("gItemTrackerBgColorA", ChromaKeyBackground.w); + SohImGui::needs_save = true; + } + ImGui::PopItemWidth(); - const char* ItemsTrackerTheme[3] = { "One Block", "Grouped style n.1", "Grouped style n.2" }; - ImGui::Text("Using theme :"); - SohImGui::EnhancementCombobox("gItemTrackerTheme", ItemsTrackerTheme, 3, 0); - SohImGui::EnhancementCheckbox("Edit mode HUD", "gItemTrackerHudEditMode"); - std::string ResetButtonName = "Reset \""; - ResetButtonName += ItemsTrackerTheme[CVar_GetS32("gItemTrackerTheme", 0)]; - ResetButtonName += "\" theme"; - if (ImGui::Button(ResetButtonName.c_str())) { - ImVec2 OriginPosition = { - ImGui::GetMainViewport()->GetWorkCenter().x - 100, - ImGui::GetMainViewport()->GetWorkCenter().y - 220, - }; - CVar_SetS32("gRandoTrackIconSize", 32); - CVar_SetS32("gRandoTrackIconSpacing", 0); - if (CVar_GetS32("gItemTrackerTheme", 0) == 0) { // One block tracker, original tracker style - ImVec2 Default_Pos_Wnd_0 = { OriginPosition.x, OriginPosition.y }; - ImGui::SetWindowPos("ItemTracker_Theme_0_Grouped", Default_Pos_Wnd_0); - ImVec2 Default_Pos_Wnd_1 = { OriginPosition.x, OriginPosition.y + 175}; - ImGui::SetWindowPos("ItemTracker_Theme_0_Dungeons", Default_Pos_Wnd_1); - //ImVec2 Default_Pos_Wnd_2 = { OriginPosition.x + 100, OriginPosition.y}; - //ImGui::SetWindowPos("ItemTracker_Theme_0_Notes", Default_Pos_Wnd_2); - } else if (CVar_GetS32("gItemTrackerTheme", 0) == 1) { // Per groups elements N.1 - ImVec2 Default_Pos_Wnd_0 = { OriginPosition.x, OriginPosition.y }; - ImGui::SetWindowPos("ItemTracker_Theme_1_Inventory", Default_Pos_Wnd_0); - ImVec2 Default_Pos_Wnd_1 = { OriginPosition.x, OriginPosition.y + 175 }; - ImGui::SetWindowPos("ItemTracker_Theme_1_Stuffs", Default_Pos_Wnd_1); - ImVec2 Default_Pos_Wnd_2 = { OriginPosition.x, OriginPosition.y + 340 }; - ImGui::SetWindowPos("ItemTracker_Theme_1_Tokens", Default_Pos_Wnd_2); - ImVec2 Default_Pos_Wnd_3 = { OriginPosition.x + 5, OriginPosition.y + 380 }; - ImGui::SetWindowPos("ItemTracker_Theme_1_Songs", Default_Pos_Wnd_3); - ImVec2 Default_Pos_Wnd_4 = { OriginPosition.x + 100, OriginPosition.y + 175}; - ImGui::SetWindowPos("ItemTracker_Theme_1_Dungeons", Default_Pos_Wnd_4); - //ImVec2 Default_Pos_Wnd_5 = { OriginPosition.x - 100, OriginPosition.y}; - //ImGui::SetWindowPos("ItemTracker_Theme_1_Notes", Default_Pos_Wnd_5); - } else if (CVar_GetS32("gItemTrackerTheme", 0) == 2) { // Per groups elements N.2 - ImVec2 Default_Pos_Wnd_0 = { OriginPosition.x, OriginPosition.y }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Inventory", Default_Pos_Wnd_0); - ImVec2 Default_Pos_Wnd_1 = { OriginPosition.x, OriginPosition.y + 175 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Equips", Default_Pos_Wnd_1); - ImVec2 Default_Pos_Wnd_2 = { OriginPosition.x + 100, OriginPosition.y + 170 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Upgrade", Default_Pos_Wnd_2); - ImVec2 Default_Pos_Wnd_3 = { OriginPosition.x + 100, OriginPosition.y + 250 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Quest", Default_Pos_Wnd_3); - ImVec2 Default_Pos_Wnd_4 = { OriginPosition.x + 100, OriginPosition.y + 290 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Stones", Default_Pos_Wnd_4); - ImVec2 Default_Pos_Wnd_5 = { OriginPosition.x, OriginPosition.y + 330 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Tokens", Default_Pos_Wnd_5); - ImVec2 Default_Pos_Wnd_6 = { OriginPosition.x, OriginPosition.y + 368 }; - ImGui::SetWindowPos("ItemTracker_Theme_2_Song", Default_Pos_Wnd_6); - ImVec2 Default_Pos_Wnd_7 = { OriginPosition.x - 100, OriginPosition.y}; - ImGui::SetWindowPos("ItemTracker_Theme_2_Dungeons", Default_Pos_Wnd_7); - //ImVec2 Default_Pos_Wnd_8 = { OriginPosition.x - 100, OriginPosition.y + 170}; - //ImGui::SetWindowPos("ItemTracker_Theme_2_Notes", Default_Pos_Wnd_8); + LabeledComboBoxRightAligned("Window Type", "gItemTrackerWindowType", { "Floating", "Window" }, 0); + + if (CVar_GetS32("gItemTrackerWindowType", 0) == 0) { + PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode", 0); + PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerShowOnlyPaused", 0); + LabeledComboBoxRightAligned("Display Mode", "gItemTrackerDisplayType", { "Always", "Combo Button Hold" }, 0); + if (CVar_GetS32("gItemTrackerDisplayType", 0) > 0) { + LabeledComboBoxRightAligned("Combo Button 1", "gItemTrackerComboButton1", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }, 6); + LabeledComboBoxRightAligned("Combo Button 2", "gItemTrackerComboButton2", { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }, 8); } } - SohImGui::EnhancementCheckbox("Alternative medallions display", "gItemTrackerMedallionsPlacement"); - SohImGui::Tooltip("Will display medallions into a placement that will be from the Quest Menu"); - - SohImGui::EnhancementCheckbox("Key Tracker", "gItemTrackerDisplayDungeonItems"); - - if (CVar_GetS32("gItemTrackerDisplayDungeonItems", 0)) { - SohImGui::EnhancementCheckbox("Map and Compass Tracker", "gItemTrackerDisplayMapsAndCompasses"); + PaddedSeparator(); + SohImGui::EnhancementSliderInt("Icon size : %dpx", "##ITEMTRACKERICONSIZE", "gItemTrackerIconSize", 25, 128, "", 36, true); + SohImGui::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 12, true); + PaddedEnhancementCheckbox("Display \"Current/Max\" values", "gItemTrackerDisplayCurrentMax", 0); + if (CVar_GetS32("gItemTrackerDisplayCurrentMax", 0) == 0) { + PaddedEnhancementCheckbox("Align count to left side", "gItemTrackerCurrentOnLeft", 0); } - // SohImGui::EnhancementCheckbox("Personal notes space", "gItemTrackerNotes"); - // SohImGui::Tooltip("Adds a textbox under the item tracker to keep your own notes in"); - // TODO: FIX THE NOTES SPACE SIZE ON FLOATING WINDOW, DISABLED UNTIL FIXED + ImGui::TableNextColumn(); + + LabeledComboBoxRightAligned("Inventory", "gItemTrackerInventoryItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Equipment", "gItemTrackerEquipmentItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Misc", "gItemTrackerMiscItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Dungeon Rewards", "gItemTrackerDungeonRewardsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + if (CVar_GetS32("gItemTrackerDungeonRewardsDisplayType", 1) == 2) { + PaddedEnhancementCheckbox("Circle display", "gItemTrackerDungeonRewardsCircle", 1); + } + LabeledComboBoxRightAligned("Songs", "gItemTrackerSongsDisplayType", { "Hidden", "Main Window", "Seperate" }, 1); + LabeledComboBoxRightAligned("Dungeon Items", "gItemTrackerDungeonItemsDisplayType", { "Hidden", "Main Window", "Seperate" }, 2); + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) != 0) { + if (CVar_GetS32("gItemTrackerDungeonItemsDisplayType", 2) == 2) { + PaddedEnhancementCheckbox("Horizontal display", "gItemTrackerDisplayDungeonItemsHorizontal", 1); + } + PaddedEnhancementCheckbox("Maps and compasses", "gItemTrackerDisplayDungeonItemsMaps", 1); + } + + if (CVar_GetS32("gItemTrackerDisplayType", 0) != 1) { + LabeledComboBoxRightAligned("Personal notes", "gItemTrackerNotesDisplayType", { "Hidden", "Main Window", "Seperate" }, 2); + } + + ImGui::PopStyleVar(1); + ImGui::EndTable(); ImGui::End(); } void InitItemTracker() { - CVar_RegisterS32("gRandoTrackIconSize", 32); - SohImGui::AddWindow("Randomizer", "Item Tracker", DrawItemTracker); + SohImGui::AddWindow("Randomizer", "Item Tracker", DrawItemTracker, CVar_GetS32("gItemTrackerEnabled", 0) == 1); SohImGui::AddWindow("Randomizer", "Item Tracker Settings", DrawItemTrackerOptions); float trackerBgR = CVar_GetFloat("gItemTrackerBgColorR", 0); float trackerBgG = CVar_GetFloat("gItemTrackerBgColorG", 0); @@ -1680,4 +922,7 @@ void InitItemTracker() { trackerBgB, trackerBgA }; // Float value, 1 = 255 in rgb value. + Ship::RegisterHook([](OSContPad* cont_pad) { + buttonsPressed = cont_pad; + }); } diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h index 1397c3d58..910d1a7b7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.h @@ -1,5 +1,26 @@ #pragma once +#include +#include + void InitItemTracker(); void DrawItemTracker(bool& open); void DrawItemAmmo(int itemId); + +typedef struct ItemTrackerItem { + uint32_t id; + std::string name; + std::string nameFaded; + uint32_t data; + void (*drawFunc)(ItemTrackerItem); +} ItemTrackerItem; + +#define ITEM_TRACKER_ITEM(id, data, drawFunc) \ + { \ + id, #id, #id "_Faded", data, drawFunc \ + } + +typedef struct ItemTrackerDungeon { + uint32_t id; + std::vector items; +} ItemTrackerDungeon; diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index fac3849c6..092ad3ead 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -758,15 +758,8 @@ void SaveManager::LoadBaseVersion1() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->LoadArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); }); SaveManager::Instance->LoadArray("scrubsPurchased", ARRAY_COUNT(gSaveContext.scrubsPurchased), [](size_t i) { @@ -926,15 +919,8 @@ void SaveManager::LoadBaseVersion2() { SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->LoadArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->LoadData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]); }); SaveManager::Instance->LoadArray("scrubsPurchased", ARRAY_COUNT(gSaveContext.scrubsPurchased), [](size_t i) { @@ -1090,15 +1076,8 @@ void SaveManager::SaveBase() { SaveManager::Instance->SaveData("angle", gSaveContext.horseData.angle); }); - SaveManager::Instance->SaveArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { - SaveManager::Instance->SaveData("", gSaveContext.dungeonsDone[i]); - }); - - SaveManager::Instance->SaveArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone), - [](size_t i) { SaveManager::Instance->SaveData("", gSaveContext.trialsDone[i]); }); - - SaveManager::Instance->SaveArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) { - SaveManager::Instance->SaveData("", gSaveContext.cowsMilked[i]); + SaveManager::Instance->SaveArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) { + SaveManager::Instance->SaveData("", gSaveContext.randomizerInf[i]); }); SaveManager::Instance->SaveArray("scrubsPurchased", ARRAY_COUNT(gSaveContext.scrubsPurchased), [](size_t i) { diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index bf34412cb..5d7add53a 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -4705,6 +4705,20 @@ void Flags_SetInfTable(s32 flag) { gSaveContext.infTable[flag >> 4] |= (1 << (flag & 0xF)); } +/** + * Tests if "randomizerInf" flag is set. + */ +s32 Flags_GetRandomizerInf(RandomizerInf flag) { + return gSaveContext.randomizerInf[flag >> 4] & (1 << (flag & 0xF)); +} + +/** + * Sets "randomizerInf" flag. + */ +void Flags_SetRandomizerInf(RandomizerInf flag) { + gSaveContext.randomizerInf[flag >> 4] |= (1 << (flag & 0xF)); +} + u32 func_80035BFC(GlobalContext* globalCtx, s16 arg1) { u16 retTextId = 0; diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index 60c3a7ee4..c2af2b8a9 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -395,6 +395,20 @@ void GetItem_Draw(GlobalContext* globalCtx, s16 drawId) { sDrawItemTable[drawId].drawFunc(globalCtx, drawId); } +/** + * Draw "Get Item" Model from a `GetItemEntry` + * Uses the Custom Draw Function if it exists, or just calls `GetItem_Draw` + */ +void GetItemEntry_Draw(GlobalContext* globalCtx, GetItemEntry getItemEntry) { + // RANDOTODO: Make this more flexible for easier toggling of individual item recolors in the future. + if (getItemEntry.drawFunc != NULL && + (CVar_GetS32("gRandoMatchKeyColors", 0) || getItemEntry.getItemId == RG_DOUBLE_DEFENSE)) { + getItemEntry.drawFunc(globalCtx, &getItemEntry); + } else { + GetItem_Draw(globalCtx, getItemEntry.gid); + } +} + // All remaining functions in this file are draw functions referenced in the table and called by the function above /* 0x0178 */ u8 primXluColor[3]; diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 54beafdab..89e1c9df7 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -1293,7 +1293,7 @@ void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetI color_slot = 0; break; case RG_DOUBLE_DEFENSE: - color_slot = 1; + color_slot = 8; break; default: return; @@ -1305,14 +1305,14 @@ void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetI s16* colors[9][3] = { { 34, 255, 76 }, // Minuet and Magic Upgrades Colors - { 177, 35, 35 }, // Bolero and Double Defense Colors + { 177, 35, 35 }, // Bolero Colors { 115, 251, 253 }, // Serenade Color { 177, 122, 35 }, // Requiem Color { 177, 28, 212 }, // Nocturne Color { 255, 255, 92 }, // Prelude Color { 31, 152, 49 }, // Stick Upgrade Color { 222, 182, 20 }, // Nut Upgrade Color - { 255, 255, 255 } // White Color placeholder + { 255, 255, 255 } // Double Defense Color }; s16* colorsEnv[9][3] = { @@ -1381,7 +1381,7 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - GetItem_Draw(globalCtx, randoGetItemEntry.gid); + GetItemEntry_Draw(globalCtx, randoGetItemEntry); } else { s32 texIndex = this->actor.params - 3; @@ -1443,7 +1443,7 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { GetItemEntry randoGetItemEntry = Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry); - GetItem_Draw(globalCtx, randoGetItemEntry.gid); + GetItemEntry_Draw(globalCtx, randoGetItemEntry); } else { s32 pad; diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index bc8fa8149..9d95bb0bc 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -3591,15 +3591,15 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { } int CUp_factor = (1 << 10) * C_Up_BTN_Size / CUpScaled; if (CVar_GetS32("gCBtnUPosType", 0) != 0) { - C_Up_BTN_Pos[1] = CVar_GetS32("gCBtnUPosY", 0)-(CUpScale*13)+Y_Margins_CU; + C_Up_BTN_Pos[1] = CVar_GetS32("gCBtnUPosY", 0)+Y_Margins_CU; if (CVar_GetS32("gCBtnUPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnUUseMargins", 0) != 0) {X_Margins_CU = Left_HUD_Margin;}; - C_Up_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13)+X_Margins_CU); + C_Up_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnUPosX", 0)+X_Margins_CU); } else if (CVar_GetS32("gCBtnUPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnUUseMargins", 0) != 0) {X_Margins_CU = Right_HUD_Margin;}; - C_Up_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13)+X_Margins_CU); + C_Up_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnUPosX", 0)+X_Margins_CU); } else if (CVar_GetS32("gCBtnUPosType", 0) == 3) {//Anchor None - C_Up_BTN_Pos[0] = CVar_GetS32("gCBtnUPosX", 0)-(CUpScale*13); + C_Up_BTN_Pos[0] = CVar_GetS32("gCBtnUPosX", 0); } else if (CVar_GetS32("gCBtnUPosType", 0) == 4) {//Hidden C_Up_BTN_Pos[0] = -9999; } @@ -3617,15 +3617,15 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { int CDown_factor = (1 << 10) * C_Down_BTN_Size / CDownScaled; int PositionAdjustment = CDownScaled/2; if (CVar_GetS32("gCBtnDPosType", 0) != 0) { - C_Down_BTN_Pos[1] = CVar_GetS32("gCBtnDPosY", 0)-PositionAdjustment+Y_Margins_CD; + C_Down_BTN_Pos[1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD; if (CVar_GetS32("gCBtnDPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - C_Down_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment+X_Margins_CD); + C_Down_BTN_Pos[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - C_Down_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment+X_Margins_CD); + C_Down_BTN_Pos[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 3) {//Anchor None - C_Down_BTN_Pos[0] = CVar_GetS32("gCBtnDPosX", 0)-PositionAdjustment; + C_Down_BTN_Pos[0] = CVar_GetS32("gCBtnDPosX", 0); } else if (CVar_GetS32("gCBtnDPosType", 0) == 4) {//Hidden C_Down_BTN_Pos[0] = -9999; } @@ -3663,9 +3663,9 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_L.r, C_button_L.g, C_button_L.b, interfaceCtx->cLeftAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Left_BTN_Pos[0] << 2, C_Left_BTN_Pos[1] << 2, - (C_Left_BTN_Pos[0] + CLeftScaled) << 2, - (C_Left_BTN_Pos[1] + CLeftScaled) << 2, - G_TX_RENDERTILE, 0, 0, CLeft_factor, CLeft_factor); + (C_Left_BTN_Pos[0] + R_ITEM_BTN_WIDTH(1)) << 2, + (C_Left_BTN_Pos[1] + R_ITEM_BTN_WIDTH(1)) << 2, + G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(1) << 1, R_ITEM_BTN_DD(1) << 1); // C-Down Button Color & Texture if (CVar_GetS32("gHudColors", 1) == 0) { @@ -3678,9 +3678,9 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_D.r, C_button_D.g, C_button_D.b, interfaceCtx->cDownAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Down_BTN_Pos[0] << 2, C_Down_BTN_Pos[1] << 2, - (C_Down_BTN_Pos[0] + CDownScaled) << 2, - (C_Down_BTN_Pos[1] + CDownScaled) << 2, - G_TX_RENDERTILE, 0, 0, CDown_factor, CDown_factor); + (C_Down_BTN_Pos[0] + R_ITEM_BTN_WIDTH(2)) << 2, + (C_Down_BTN_Pos[1] + R_ITEM_BTN_WIDTH(2)) << 2, + G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(2) << 1, R_ITEM_BTN_DD(2) << 1); // C-Right Button Color & Texture if (CVar_GetS32("gHudColors", 1) == 0) { @@ -3693,9 +3693,9 @@ void Interface_DrawItemButtons(GlobalContext* globalCtx) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, C_button_R.r, C_button_R.g, C_button_R.b, interfaceCtx->cRightAlpha); } gSPWideTextureRectangle(OVERLAY_DISP++, C_Right_BTN_Pos[0] << 2, C_Right_BTN_Pos[1] << 2, - (C_Right_BTN_Pos[0] + CRightScaled) << 2, - (C_Right_BTN_Pos[1] + CRightScaled) << 2, - G_TX_RENDERTILE, 0, 0, CRight_factor, CRight_factor); + (C_Right_BTN_Pos[0] + R_ITEM_BTN_WIDTH(3)) << 2, + (C_Right_BTN_Pos[1] + R_ITEM_BTN_WIDTH(3)) << 2, + G_TX_RENDERTILE, 0, 0, R_ITEM_BTN_DD(3) << 1, R_ITEM_BTN_DD(3) << 1); if ((pauseCtx->state < 8) || (pauseCtx->state >= 18)) { if ((globalCtx->pauseCtx.state != 0) || (globalCtx->pauseCtx.debugState != 0)) { @@ -3992,43 +3992,16 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 X_Margins_DPad_Items = 0; Y_Margins_DPad_Items = 0; } - const float ItemsScale_offset[8][2] = { - // Y X - { 104.0f, 144.0f }, //B - { 108.0f, 148.0f }, //C L - { 108.0f, 148.0f }, //C D - { 108.0f, 148.0f }, //C R - { 112.0f, 152.0f }, //Dpad ^ - { 112.0f, 152.0f }, //Dpad V - { 112.0f, 152.0f }, //Dpad < - { 112.0f, 152.0f } //Dpad > - }; - float ItemScale_ori[8] = { - 1.0f, //B BTN - 0.87f, 0.87f, 0.87f, //C BTNs L / D / R - 0.6f, 0.6f, 0.6f, 0.6f //Dpad U/D/L/R - }; const s16 ItemIconPos_ori[8][2] = { - { B_BUTTON_X+X_Margins_BtnB-ItemsScale_offset[0][1], B_BUTTON_Y+Y_Margins_BtnB-ItemsScale_offset[0][0] }, - { C_LEFT_BUTTON_X+X_Margins_CL-ItemsScale_offset[1][1], C_LEFT_BUTTON_Y+Y_Margins_CL-ItemsScale_offset[1][0] }, - { C_DOWN_BUTTON_X+X_Margins_CD-ItemsScale_offset[2][1], C_DOWN_BUTTON_Y+Y_Margins_CD-ItemsScale_offset[2][0] }, - { C_RIGHT_BUTTON_X+X_Margins_CR-ItemsScale_offset[3][1], C_RIGHT_BUTTON_Y+Y_Margins_CR-ItemsScale_offset[3][0] }, - { DPAD_UP_X+X_Margins_DPad_Items-ItemsScale_offset[4][1], DPAD_UP_Y+Y_Margins_DPad_Items-ItemsScale_offset[4][0] }, - { DPAD_DOWN_X+X_Margins_DPad_Items-ItemsScale_offset[5][1], DPAD_DOWN_Y+Y_Margins_DPad_Items-ItemsScale_offset[5][0] }, - { DPAD_LEFT_X+X_Margins_DPad_Items-ItemsScale_offset[6][1], DPAD_LEFT_Y+Y_Margins_DPad_Items-ItemsScale_offset[6][0] }, - { DPAD_RIGHT_X+X_Margins_DPad_Items-ItemsScale_offset[7][1], DPAD_RIGHT_Y+Y_Margins_DPad_Items-ItemsScale_offset[7][0] } + { B_BUTTON_X+X_Margins_BtnB, B_BUTTON_Y+Y_Margins_BtnB }, + { C_LEFT_BUTTON_X+X_Margins_CL, C_LEFT_BUTTON_Y+Y_Margins_CL }, + { C_DOWN_BUTTON_X+X_Margins_CD, C_DOWN_BUTTON_Y+Y_Margins_CD }, + { C_RIGHT_BUTTON_X+X_Margins_CR, C_RIGHT_BUTTON_Y+Y_Margins_CR }, + { DPAD_UP_X+X_Margins_DPad_Items, DPAD_UP_Y+Y_Margins_DPad_Items }, + { DPAD_DOWN_X+X_Margins_DPad_Items, DPAD_DOWN_Y+Y_Margins_DPad_Items }, + { DPAD_LEFT_X+X_Margins_DPad_Items, DPAD_LEFT_Y+Y_Margins_DPad_Items }, + { DPAD_RIGHT_X+X_Margins_DPad_Items, DPAD_RIGHT_Y+Y_Margins_DPad_Items } }; - float ItemScale[8] = { - CVar_GetFloat("gBBtnScale", 1.0f), - CVar_GetFloat("gCBtnLScale", 0.87f), - CVar_GetFloat("gCBtnDScale", 0.87f), - CVar_GetFloat("gCBtnRScale", 0.87f), - CVar_GetFloat("gDPadScale", 0.425f), - CVar_GetFloat("gDPadScale", 0.425f), - CVar_GetFloat("gDPadScale", 0.425f), - CVar_GetFloat("gDPadScale", 0.425f), - }; - float ItemScaleCurrent[8]; //Hold the array with modified scale u16 ItemsSlotsAlpha[8] = { interfaceCtx->bAlpha, interfaceCtx->cLeftAlpha, @@ -4048,10 +4021,6 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 s16 ItemIconPos[8][2]; //(X,Y) //DPadItems if (CVar_GetS32("gDPadPosType", 0) != 0) { - ItemScaleCurrent[4] = ItemScale[4]; - ItemScaleCurrent[5] = ItemScale[5]; - ItemScaleCurrent[6] = ItemScale[6]; - ItemScaleCurrent[7] = ItemScale[7]; ItemIconPos[4][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[0][1];//Up ItemIconPos[5][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[1][1];//Down ItemIconPos[6][1] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[2][1];//Left @@ -4080,10 +4049,6 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 ItemIconPos[7][0] = -9999; } } else { - ItemScaleCurrent[4] = ItemScale_ori[4]; - ItemScaleCurrent[5] = ItemScale_ori[5]; - ItemScaleCurrent[6] = ItemScale_ori[6]; - ItemScaleCurrent[7] = ItemScale_ori[7]; ItemIconPos[4][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[4][0]); ItemIconPos[5][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[5][0]); ItemIconPos[6][0] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[6][0]); @@ -4095,81 +4060,73 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 } //B Button if (CVar_GetS32("gBBtnPosType", 0) != 0) { - ItemScaleCurrent[0] = ItemScale[0]; - ItemIconPos[0][1] = CVar_GetS32("gBBtnPosY", 0)+Y_Margins_BtnB-ItemsScale_offset[0][0]; + ItemIconPos[0][1] = CVar_GetS32("gBBtnPosY", 0)+Y_Margins_BtnB; if (CVar_GetS32("gBBtnPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gBBtnUseMargins", 0) != 0) {X_Margins_BtnB = Left_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB-ItemsScale_offset[0][1]); + ItemIconPos[0][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB); } else if (CVar_GetS32("gBBtnPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gBBtnUseMargins", 0) != 0) {X_Margins_BtnB = Right_HUD_Margin;}; - ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB-ItemsScale_offset[0][1]); + ItemIconPos[0][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gBBtnPosX", 0)+X_Margins_BtnB); } else if (CVar_GetS32("gBBtnPosType", 0) == 3) {//Anchor None - ItemIconPos[0][0] = CVar_GetS32("gBBtnPosX", 0)-ItemsScale_offset[0][1]; + ItemIconPos[0][0] = CVar_GetS32("gBBtnPosX", 0); } else if (CVar_GetS32("gBBtnPosType", 0) == 4) {//Hidden ItemIconPos[0][0] = -9999; } } else { - ItemScaleCurrent[0] = ItemScale_ori[0]; ItemIconPos[0][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[0][0]); ItemIconPos[0][1] = ItemIconPos_ori[0][1]; } //C button Left if (CVar_GetS32("gCBtnLPosType", 0) != 0) { - ItemScaleCurrent[1] = ItemScale[1]; - ItemIconPos[1][1] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL-ItemsScale_offset[1][0]; + ItemIconPos[1][1] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL; if (CVar_GetS32("gCBtnLPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL-ItemsScale_offset[1][1]); + ItemIconPos[1][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); } else if (CVar_GetS32("gCBtnLPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; - ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL-ItemsScale_offset[1][1]); + ItemIconPos[1][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); } else if (CVar_GetS32("gCBtnLPosType", 0) == 3) {//Anchor None - ItemIconPos[1][0] = CVar_GetS32("gCBtnLPosX", 0)-ItemsScale_offset[1][1]; + ItemIconPos[1][0] = CVar_GetS32("gCBtnLPosX", 0); } else if (CVar_GetS32("gCBtnLPosType", 0) == 4) {//Hidden ItemIconPos[1][0] = -9999; } } else { - ItemScaleCurrent[1] = ItemScale_ori[1]; ItemIconPos[1][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[1][0]); ItemIconPos[1][1] = ItemIconPos_ori[1][1]; } //C Button down if (CVar_GetS32("gCBtnDPosType", 0) != 0) { - ItemScaleCurrent[2] = ItemScale[2]; - ItemIconPos[2][1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD-ItemsScale_offset[2][0]; + ItemIconPos[2][1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD; if (CVar_GetS32("gCBtnDPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD-ItemsScale_offset[2][1]); + ItemIconPos[2][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; - ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD-ItemsScale_offset[2][1]); + ItemIconPos[2][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); } else if (CVar_GetS32("gCBtnDPosType", 0) == 3) {//Anchor None - ItemIconPos[2][0] = CVar_GetS32("gCBtnDPosX", 0)-ItemsScale_offset[2][1]; + ItemIconPos[2][0] = CVar_GetS32("gCBtnDPosX", 0); } else if (CVar_GetS32("gCBtnDPosType", 0) == 4) {//Hidden ItemIconPos[2][0] = -9999; } } else { - ItemScaleCurrent[2] = ItemScale_ori[2]; ItemIconPos[2][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[2][0]); ItemIconPos[2][1] = ItemIconPos_ori[2][1]; } //C button Right if (CVar_GetS32("gCBtnRPosType", 0) != 0) { - ItemScaleCurrent[3] = ItemScale[3]; - ItemIconPos[3][1] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR-ItemsScale_offset[3][0]; + ItemIconPos[3][1] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR; if (CVar_GetS32("gCBtnRPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR-ItemsScale_offset[3][1]); + ItemIconPos[3][0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); } else if (CVar_GetS32("gCBtnRPosType", 0) == 2) {//Anchor Right if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; - ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR-ItemsScale_offset[3][1]); + ItemIconPos[3][0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); } else if (CVar_GetS32("gCBtnRPosType", 0) == 3) {//Anchor None - ItemIconPos[3][0] = CVar_GetS32("gCBtnRPosX", 0)-ItemsScale_offset[3][1]; + ItemIconPos[3][0] = CVar_GetS32("gCBtnRPosX", 0); } else if (CVar_GetS32("gCBtnRPosType", 0) == 4) {//Hidden ItemIconPos[3][0] = -9999; } } else { - ItemScaleCurrent[3] = ItemScale_ori[3]; ItemIconPos[3][0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[3][0]); ItemIconPos[3][1] = ItemIconPos_ori[3][1]; } @@ -4177,23 +4134,10 @@ void Interface_DrawItemIconTexture(GlobalContext* globalCtx, void* texture, s16 gDPLoadTextureBlock(OVERLAY_DISP++, texture, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gDPPipeSync(OVERLAY_DISP++); - gSPSetGeometryMode(OVERLAY_DISP++, G_CULL_BACK); - gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); - gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, ItemsSlotsAlpha[button]); - gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0); - Matrix_Translate( - ItemIconPos[button][0], - ItemIconPos[button][1] * -1, 1.0f, MTXMODE_NEW); - - Matrix_Scale( - ItemScaleCurrent[button]/1, - ItemScaleCurrent[button]/1, - ItemScaleCurrent[button]/1, MTXMODE_APPLY); - gSPMatrix(OVERLAY_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); - gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[0], 4, 0); - gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); - gDPPipeSync(OVERLAY_DISP++); + gSPWideTextureRectangle(OVERLAY_DISP++, ItemIconPos[button][0] << 2, ItemIconPos[button][1] << 2, + (ItemIconPos[button][0] + gItemIconWidth[button]) << 2, + (ItemIconPos[button][1] + gItemIconWidth[button]) << 2, G_TX_RENDERTILE, 0, 0, + gItemIconDD[button] << 1, gItemIconDD[button] << 1); CLOSE_DISPS(globalCtx->state.gfxCtx); } diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index 99425bd8d..bd33748e2 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -1170,7 +1170,13 @@ void Player_DrawGetItemImpl(GlobalContext* globalCtx, Player* this, Vec3f* refPo Matrix_RotateZYX(0, globalCtx->gameplayFrames * 1000, 0, MTXMODE_APPLY); Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY); - GetItem_Draw(globalCtx, drawIdPlusOne - 1); + // RANDOTODO: Make this more flexible for easier toggling of individual item recolors in the future. + if (this->getItemEntry.drawFunc != NULL && + (CVar_GetS32("gRandoMatchKeyColors", 0) || this->getItemEntry.getItemId == RG_DOUBLE_DEFENSE)) { + this->getItemEntry.drawFunc(globalCtx, &this->getItemEntry); + } else { + GetItem_Draw(globalCtx, drawIdPlusOne - 1); + } CLOSE_DISPS(globalCtx->state.gfxCtx); } diff --git a/soh/src/code/z_sram.c b/soh/src/code/z_sram.c index 4b362f070..270fd87a8 100644 --- a/soh/src/code/z_sram.c +++ b/soh/src/code/z_sram.c @@ -3,6 +3,7 @@ #include #include +#include #define NUM_DUNGEONS 8 #define NUM_TRIALS 6 @@ -703,19 +704,9 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) { fileChooseCtx->n64ddFlag = 1; gSaveContext.n64ddFlag = 1; - // Sets all the dungeons to incomplete when generating a rando save. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/82 - for (u8 i = 0; i < NUM_DUNGEONS; i++) { - gSaveContext.dungeonsDone[i] = 0; - } - - // Sets all Ganon's Trials to incomplete when generating a rando save. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/131 - for (u8 i = 0; i < NUM_TRIALS; i++) { - gSaveContext.trialsDone[i] = 0; - } - - // Sets all cows to unmilked when generating a rando save. - for (u8 i = 0; i < NUM_COWS; i++) { - gSaveContext.cowsMilked[i] = 0; + // Sets all rando flags to false + for (s32 i = 0; i < ARRAY_COUNT(gSaveContext.randomizerInf); i++) { + gSaveContext.randomizerInf[i] = 0; } // Sets all scrubs to not purchased when generating a rando save. diff --git a/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c b/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c index 9e46c39ef..e3539aaf7 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c +++ b/soh/src/overlays/actors/ovl_Bg_Gjyo_Bridge/z_bg_gjyo_bridge.c @@ -132,35 +132,35 @@ u8 CheckMedallionCount() { u8 CheckDungeonCount() { u8 dungeonCount = 0; - if (gSaveContext.dungeonsDone[0] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[1] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[2] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[3] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[4] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[5] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[6] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) { dungeonCount++; } - if (gSaveContext.dungeonsDone[7] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) { dungeonCount++; } diff --git a/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c b/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c index 5c20fa602..713314002 100644 --- a/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.c @@ -152,7 +152,7 @@ void BgSpot06Objects_Init(Actor* thisx, GlobalContext* globalCtx) { if (LINK_IS_ADULT && ((!gSaveContext.n64ddFlag && !(gSaveContext.eventChkInf[6] & 0x200)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[5]))) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)))) { if (gSaveContext.sceneSetupIndex < 4) { this->lakeHyliaWaterLevel = -681.0f; globalCtx->colCtx.colHeader->waterBoxes[LHWB_GERUDO_VALLEY_RIVER_LOWER].ySurface = diff --git a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c index 8d81b41c4..12c42358b 100644 --- a/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c +++ b/soh/src/overlays/actors/ovl_Demo_Effect/z_demo_effect.c @@ -2089,6 +2089,10 @@ void DemoEffect_DrawGetItem(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag && globalCtx->sceneNum == SCENE_BDAN) { GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_BARINADE, RG_ZORA_SAPPHIRE); this->getItem.drawId = getItemEntry.gid; + func_8002EBCC(thisx, globalCtx, 0); + func_8002ED80(thisx, globalCtx, 0); + GetItemEntry_Draw(globalCtx, getItemEntry); + return; } func_8002EBCC(thisx, globalCtx, 0); func_8002ED80(thisx, globalCtx, 0); diff --git a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c index 46ecf5979..adc534a2d 100644 --- a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c +++ b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c @@ -76,27 +76,27 @@ s32 DemoKekkai_CheckEventFlag(s32 params) { u32 TrialsDoneCount() { u8 trialCount = 0; - if (gSaveContext.trialsDone[0] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[1] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_FOREST_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[2] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_FIRE_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[3] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_WATER_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[4] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_SPIRIT_TRIAL)) { trialCount++; } - if (gSaveContext.trialsDone[5] == 1) { + if (Flags_GetRandomizerInf(RAND_INF_TRIALS_DONE_SHADOW_TRIAL)) { trialCount++; } @@ -249,22 +249,22 @@ void DemoKekkai_TrialBarrierDispel(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { switch (thisx->params) { case KEKKAI_WATER: - gSaveContext.trialsDone[2] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_WATER_TRIAL); break; case KEKKAI_LIGHT: - gSaveContext.trialsDone[5] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_LIGHT_TRIAL); break; case KEKKAI_FIRE: - gSaveContext.trialsDone[1] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_FIRE_TRIAL); break; case KEKKAI_SHADOW: - gSaveContext.trialsDone[3] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_SHADOW_TRIAL); break; case KEKKAI_SPIRIT: - gSaveContext.trialsDone[4] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_SPIRIT_TRIAL); break; case KEKKAI_FOREST: - gSaveContext.trialsDone[0] = 1; + Flags_SetRandomizerInf(RAND_INF_TRIALS_DONE_FOREST_TRIAL); break; } Flags_SetEventChkInf(eventFlags[thisx->params]); diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 5130f1ca8..e372d3291 100644 --- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -546,7 +546,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (globalCtx->sceneNum == SCENE_DDAN_BOSS) { if (!Flags_GetEventChkInf(0x25)) { Flags_SetEventChkInf(0x25); - gSaveContext.dungeonsDone[0] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x47A; gSaveContext.nextCutsceneIndex = 0; @@ -563,7 +563,7 @@ void DoorWarp1_ChildWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (!Flags_GetEventChkInf(7) || gSaveContext.n64ddFlag) { Flags_SetEventChkInf(7); Flags_SetEventChkInf(9); - gSaveContext.dungeonsDone[1] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x0457; gSaveContext.nextCutsceneIndex = 0; @@ -671,7 +671,7 @@ void DoorWarp1_RutoWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (this->warpTimer > sWarpTimerTarget && gSaveContext.nextCutsceneIndex == 0xFFEF) { gSaveContext.eventChkInf[3] |= 0x80; - gSaveContext.dungeonsDone[2] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x10E; @@ -785,7 +785,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { if (globalCtx->sceneNum == SCENE_MORIBOSSROOM) { if (!(gSaveContext.eventChkInf[4] & 0x100)) { gSaveContext.eventChkInf[4] |= 0x100; - gSaveContext.dungeonsDone[3] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x608; @@ -807,7 +807,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } else if (globalCtx->sceneNum == SCENE_FIRE_BS) { if (!(gSaveContext.eventChkInf[4] & 0x200)) { gSaveContext.eventChkInf[4] |= 0x200; - gSaveContext.dungeonsDone[4] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x564; @@ -828,7 +828,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } else if (globalCtx->sceneNum == SCENE_MIZUSIN_BS) { if (!(gSaveContext.eventChkInf[4] & 0x400)) { gSaveContext.eventChkInf[4] |= 0x400; - gSaveContext.dungeonsDone[5] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x60C; @@ -849,7 +849,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } } else if (globalCtx->sceneNum == SCENE_JYASINBOSS) { if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) || gSaveContext.n64ddFlag) { - gSaveContext.dungeonsDone[6] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x610; @@ -870,7 +870,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, GlobalContext* globalCtx) { } } else if (globalCtx->sceneNum == SCENE_HAKADAN_BS) { if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) || gSaveContext.n64ddFlag) { - gSaveContext.dungeonsDone[7] = 1; + Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE); if (gSaveContext.n64ddFlag) { globalCtx->nextEntranceIndex = 0x580; diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c index 3a687f41d..3572de01c 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.c @@ -218,51 +218,51 @@ void func_809DF730(EnCow* this, GlobalContext* globalCtx) { CowInfo EnCow_GetInfo(EnCow* this, GlobalContext* globalCtx) { struct CowInfo cowInfo; - cowInfo.cowId = -1; + cowInfo.randomizerInf = -1; cowInfo.randomizerCheck = RC_UNKNOWN_CHECK; switch (globalCtx->sceneNum) { case SCENE_SOUKO: // Lon Lon Tower if (this->actor.world.pos.x == -229 && this->actor.world.pos.z == 157) { - cowInfo.cowId = 0; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW; cowInfo.randomizerCheck = RC_LLR_TOWER_LEFT_COW; } else if (this->actor.world.pos.x == -142 && this->actor.world.pos.z == -140) { - cowInfo.cowId = 1; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW; cowInfo.randomizerCheck = RC_LLR_TOWER_RIGHT_COW; } break; case SCENE_MALON_STABLE: if (this->actor.world.pos.x == 116 && this->actor.world.pos.z == -254) { - cowInfo.cowId = 2; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW; cowInfo.randomizerCheck = RC_LLR_STABLES_RIGHT_COW; } else if (this->actor.world.pos.x == -122 && this->actor.world.pos.z == -254) { - cowInfo.cowId = 3; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW; cowInfo.randomizerCheck = RC_LLR_STABLES_LEFT_COW; } break; case SCENE_KAKUSIANA: // Grotto if (this->actor.world.pos.x == 2444 && this->actor.world.pos.z == -471) { - cowInfo.cowId = 4; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW; cowInfo.randomizerCheck = RC_DMT_COW_GROTTO_COW; } else if (this->actor.world.pos.x == 3485 && this->actor.world.pos.z == -291) { - cowInfo.cowId = 5; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW; cowInfo.randomizerCheck = RC_HF_COW_GROTTO_COW; } break; case SCENE_LINK_HOME: - cowInfo.cowId = 6; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_LINKS_HOUSE_COW; cowInfo.randomizerCheck = RC_KF_LINKS_HOUSE_COW; break; case SCENE_LABO: // Impa's house - cowInfo.cowId = 7; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW; cowInfo.randomizerCheck = RC_KAK_IMPAS_HOUSE_COW; break; case SCENE_SPOT09: // Gerudo Valley - cowInfo.cowId = 8; + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_GV_COW; cowInfo.randomizerCheck = RC_GV_COW; break; - case SCENE_SPOT08: // Jabu's Belly - cowInfo.cowId = 9; + case SCENE_BDAN: // Jabu's Belly + cowInfo.randomizerInf = RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW; cowInfo.randomizerCheck = RC_JABU_JABUS_BELLY_MQ_COW; break; } @@ -290,8 +290,8 @@ void EnCow_MoveForRandomizer(EnCow* this, GlobalContext* globalCtx) { void EnCow_SetCowMilked(EnCow* this, GlobalContext* globalCtx) { CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); Player* player = GET_PLAYER(globalCtx); - player->pendingFlag.flagID = cowInfo.cowId; - player->pendingFlag.flagType = FLAG_COW_MILKED; + player->pendingFlag.flagID = cowInfo.randomizerInf; + player->pendingFlag.flagType = FLAG_RANDOMIZER_INF; } void func_809DF778(EnCow* this, GlobalContext* globalCtx) { @@ -337,7 +337,7 @@ void func_809DF8FC(EnCow* this, GlobalContext* globalCtx) { bool EnCow_HasBeenMilked(EnCow* this, GlobalContext* globalCtx) { CowInfo cowInfo = EnCow_GetInfo(this, globalCtx); - return gSaveContext.cowsMilked[cowInfo.cowId]; + return Flags_GetRandomizerInf(cowInfo.randomizerInf); } void EnCow_GivePlayerRandomizedItem(EnCow* this, GlobalContext* globalCtx) { diff --git a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h index a5c66f1da..7367f470c 100644 --- a/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h +++ b/soh/src/overlays/actors/ovl_En_Cow/z_en_cow.h @@ -22,7 +22,7 @@ typedef struct EnCow { } EnCow; // size = 0x0280 typedef struct CowInfo { - int cowId; + RandomizerInf randomizerInf; RandomizerCheck randomizerCheck; } CowInfo; diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c index 0cbc370af..80cf97b32 100644 --- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c +++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c @@ -521,9 +521,14 @@ void EnExItem_DrawItems(EnExItem* this, GlobalContext* globalCtx) { case EXITEM_BOMBCHUS_COUNTER: randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_BOMBCHUS, GI_BOMBCHUS_10); break; + case EXITEM_BULLET_BAG: + randoGetItem = Randomizer_GetItemFromKnownCheck(RC_LW_TARGET_IN_WOODS, GI_BULLET_BAG_50); + break; } EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); + GetItemEntry_Draw(globalCtx, randoGetItem); + return; } GetItem_Draw(globalCtx, this->giDrawId); @@ -536,7 +541,7 @@ void EnExItem_DrawHeartPiece(EnExItem* this, GlobalContext* globalCtx) { GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, GI_HEART_PIECE); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - GetItem_Draw(globalCtx, randoGetItem.gid); + GetItemEntry_Draw(globalCtx, randoGetItem); } else { GetItem_Draw(globalCtx, GID_HEART_PIECE); } diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c index 389b1b145..58124ef23 100644 --- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -114,7 +114,7 @@ u16 EnGo_GetTextID(GlobalContext* globalCtx, Actor* thisx) { } case 0x00: if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) { if (gSaveContext.infTable[16] & 0x8000) { return 0x3042; } else { diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index 175335a0d..9f6ff147e 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -416,10 +416,10 @@ s16 EnGo2_GetStateGoronDmtRollingSmall(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronDmtDcEntrance(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.eventChkInf[2] & 0x8 ? 0x3021 : gSaveContext.infTable[14] & 0x1 ? 0x302A : 0x3008; @@ -439,10 +439,10 @@ s16 EnGo2_GetStateGoronDmtDcEntrance(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityEntrance(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.infTable[15] & 0x1 ? 0x3015 : 0x3014; @@ -462,10 +462,10 @@ s16 EnGo2_GetStateGoronCityEntrance(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityIsland(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return gSaveContext.infTable[15] & 0x10 ? 0x3017 : 0x3016; @@ -485,10 +485,10 @@ s16 EnGo2_GetStateGoronCityIsland(GlobalContext* globalCtx, EnGo2* this) { u16 EnGo2_GetTextIdGoronCityLowestFloor(GlobalContext* globalCtx, EnGo2* this) { if (((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { return 0x3043; } else if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[0])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN))) { return 0x3027; } else { return CUR_UPG_VALUE(UPG_STRENGTH) != 0 ? 0x302C @@ -1589,7 +1589,7 @@ void EnGo2_Init(Actor* thisx, GlobalContext* globalCtx) { case GORON_CITY_STAIRWELL: case GORON_CITY_LOST_WOODS: if (((!gSaveContext.n64ddFlag && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[4])) && LINK_IS_ADULT) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) && LINK_IS_ADULT) { Actor_Kill(&this->actor); } this->actionFunc = EnGo2_CurledUp; diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index da73fd634..96aebbef6 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -73,7 +73,7 @@ static AnimationInfo sAnimationInfo[] = { u16 EnKz_GetTextNoMaskChild(GlobalContext* globalCtx, EnKz* this) { Player* player = GET_PLAYER(globalCtx); - if ((gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[2]) || + if ((gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) || (!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE))) { return 0x402B; } else if (gSaveContext.eventChkInf[3] & 8) { diff --git a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c index ffb02e8d2..83252a27e 100644 --- a/soh/src/overlays/actors/ovl_En_Md/z_en_md.c +++ b/soh/src/overlays/actors/ovl_En_Md/z_en_md.c @@ -373,7 +373,7 @@ u16 EnMd_GetTextKokiriForest(GlobalContext* globalCtx, EnMd* this) { this->unk_209 = TEXT_STATE_NONE; if ((!gSaveContext.n64ddFlag && CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) || - (gSaveContext.n64ddFlag && gSaveContext.dungeonsDone[1])) { + (gSaveContext.n64ddFlag && Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE))) { return 0x1045; } @@ -486,7 +486,7 @@ u8 EnMd_ShouldSpawn(EnMd* this, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { // if we have beaten deku tree or have open forest turned on // or have already shown mido we have an equipped sword/shield - if (gSaveContext.dungeonsDone[1] || + if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE) || Randomizer_GetSettingValue(RSK_FOREST) == 1 || gSaveContext.eventChkInf[0] & 0x10) { return 0; diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index 1e154ef3b..2ba2a1478 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -518,7 +518,7 @@ void EnOssan_TalkGoronShopkeeper(GlobalContext* globalCtx) { Message_ContinueTextbox(globalCtx, 0x300F); } } else if ((!gSaveContext.n64ddFlag && !CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) || - (gSaveContext.n64ddFlag && !gSaveContext.dungeonsDone[4])) { + (gSaveContext.n64ddFlag && !Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE))) { Message_ContinueTextbox(globalCtx, 0x3057); } else { Message_ContinueTextbox(globalCtx, 0x305B); diff --git a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c index a9c3cb258..aa07c1450 100644 --- a/soh/src/overlays/actors/ovl_En_Si/z_en_si.c +++ b/soh/src/overlays/actors/ovl_En_Si/z_en_si.c @@ -17,7 +17,8 @@ s32 func_80AFB748(EnSi* this, GlobalContext* globalCtx); void func_80AFB768(EnSi* this, GlobalContext* globalCtx); void func_80AFB89C(EnSi* this, GlobalContext* globalCtx); void func_80AFB950(EnSi* this, GlobalContext* globalCtx); -void Randomizer_GrantSkullReward(EnSi* this, GlobalContext* globalCtx); +void Randomizer_UpdateSkullReward(EnSi* this, GlobalContext* globalCtx); +void Randomizer_GiveSkullReward(EnSi* this, GlobalContext* globalCtx); s32 textId = 0xB4; s32 giveItemId = ITEM_SKULL_TOKEN; @@ -99,21 +100,25 @@ void func_80AFB768(EnSi* this, GlobalContext* globalCtx) { if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) { this->collider.base.ocFlags2 &= ~OC2_HIT_PLAYER; + if (gSaveContext.n64ddFlag) { - Randomizer_GrantSkullReward(this, globalCtx); + Randomizer_UpdateSkullReward(this, globalCtx); } else { Item_Give(globalCtx, giveItemId); } if ((CVar_GetS32("gSkulltulaFreeze", 0) != 1 || giveItemId != ITEM_SKULL_TOKEN) && getItemId != RG_ICE_TRAP) { player->actor.freezeTimer = 20; } + Message_StartTextbox(globalCtx, textId, NULL); if (gSaveContext.n64ddFlag && getItemId != RG_ICE_TRAP) { + Randomizer_GiveSkullReward(this, globalCtx); Audio_PlayFanfare_Rando(getItem); } else { Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); } + player->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = func_80AFB950; } else { @@ -133,16 +138,20 @@ void func_80AFB89C(EnSi* this, GlobalContext* globalCtx) { if (!CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_13)) { if (gSaveContext.n64ddFlag) { - Randomizer_GrantSkullReward(this, globalCtx); + Randomizer_UpdateSkullReward(this, globalCtx); } else { Item_Give(globalCtx, giveItemId); } + Message_StartTextbox(globalCtx, textId, NULL); + if (gSaveContext.n64ddFlag && getItemId != RG_ICE_TRAP) { + Randomizer_GiveSkullReward(this, globalCtx); Audio_PlayFanfare_Rando(getItem); } else { Audio_PlayFanfare(NA_BGM_SMALL_ITEM_GET); } + player->getItemEntry = (GetItemEntry)GET_ITEM_NONE; this->actionFunc = func_80AFB950; } @@ -184,29 +193,34 @@ void EnSi_Draw(Actor* thisx, GlobalContext* globalCtx) { f32 mtxScale = 1.5f; Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); } - GetItem_Draw(globalCtx, getItem.gid); + GetItemEntry_Draw(globalCtx, getItem); } } } -void Randomizer_GrantSkullReward(EnSi* this, GlobalContext* globalCtx) { +void Randomizer_UpdateSkullReward(EnSi* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); getItem = Randomizer_GetRandomizedItem(GI_SKULL_TOKEN, this->actor.id, this->actor.params, globalCtx->sceneNum); getItemId = getItem.getItemId; if (getItemId == RG_ICE_TRAP) { + player->getItemEntry = getItem; player->pendingIceTrap = true; textId = 0xF8; } else { textId = getItem.textId; giveItemId = getItem.itemId; - if (getItem.modIndex == MOD_NONE) { - Item_Give(globalCtx, giveItemId); - } else if (getItem.modIndex == MOD_RANDOMIZER) { - Randomizer_Item_Give(globalCtx, getItem); - } } - // player->getItemId = getItemId; +} + +void Randomizer_GiveSkullReward(EnSi* this, GlobalContext* globalCtx) { + Player* player = GET_PLAYER(globalCtx); + + if (getItem.modIndex == MOD_NONE) { + Item_Give(globalCtx, giveItemId); + } else if (getItem.modIndex == MOD_RANDOMIZER) { + Randomizer_Item_Give(globalCtx, getItem); + } player->getItemEntry = getItem; } diff --git a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c index 304c3053d..f4181146a 100644 --- a/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c +++ b/soh/src/overlays/actors/ovl_Item_B_Heart/z_item_b_heart.c @@ -99,8 +99,8 @@ void ItemBHeart_Draw(Actor* thisx, GlobalContext* globalCtx) { } if (gSaveContext.n64ddFlag) { - GetItem_Draw(globalCtx, Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, - this->actor.id,this->actor.params, globalCtx->sceneNum).gid); + GetItemEntry_Draw(globalCtx, Randomizer_GetRandomizedItem(GI_HEART_CONTAINER_2, + this->actor.id,this->actor.params, globalCtx->sceneNum)); } else { if (flag) { func_80093D84(globalCtx->state.gfxCtx); diff --git a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c index eb6efef7b..c8e57237f 100644 --- a/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c +++ b/soh/src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.c @@ -233,7 +233,7 @@ void ItemEtcetera_DrawThroughLens(Actor* thisx, GlobalContext* globalCtx) { GetItemEntry randoGetItem = GetChestGameRandoGetItem(this->actor.room, this->giDrawId, globalCtx); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); if (randoGetItem.itemId != ITEM_NONE) { - GetItem_Draw(globalCtx, randoGetItem.gid); + GetItemEntry_Draw(globalCtx, randoGetItem); return; } } @@ -257,7 +257,10 @@ void ItemEtcetera_Draw(Actor* thisx, GlobalContext* globalCtx) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); if (randoGetItem.itemId != RG_NONE) { - this->giDrawId = randoGetItem.gid; + func_8002EBCC(&this->actor, globalCtx, 0); + func_8002ED80(&this->actor, globalCtx, 0); + GetItemEntry_Draw(globalCtx, randoGetItem); + return; } } diff --git a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c index a8db425da..1cc8752cb 100644 --- a/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c +++ b/soh/src/overlays/actors/ovl_Item_Ocarina/z_item_ocarina.c @@ -218,7 +218,7 @@ void ItemOcarina_Draw(Actor* thisx, GlobalContext* globalCtx) { if (gSaveContext.n64ddFlag) { GetItemEntry randoGetItem = Randomizer_GetItemFromKnownCheck(RC_HF_OCARINA_OF_TIME_ITEM, GI_OCARINA_OOT); EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItem); - GetItem_Draw(globalCtx, randoGetItem.gid); + GetItemEntry_Draw(globalCtx, randoGetItem); return; } diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index cb23a1b89..2631e39b9 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6083,8 +6083,8 @@ void Player_SetPendingFlag(Player* this, GlobalContext* globalCtx) { case FLAG_SCENE_TREASURE: Flags_SetTreasure(globalCtx, this->pendingFlag.flagID); break; - case FLAG_COW_MILKED: - gSaveContext.cowsMilked[this->pendingFlag.flagID] = 1; + case FLAG_RANDOMIZER_INF: + Flags_SetRandomizerInf(this->pendingFlag.flagID); break; case FLAG_EVENT_CHECK_INF: Flags_SetEventChkInf(this->pendingFlag.flagID); @@ -12667,6 +12667,14 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) { this->stateFlags1 &= ~PLAYER_STATE1_29; func_80852FFC(globalCtx, NULL, 8); } + + // Set unk_862 to 0 early to not have the game draw non-custom colored models for a split second. + // This unk is what the game normally uses to decide what item to draw when holding up an item above Link's head. + // Only do this when the item actually has a custom draw function. + if (this->getItemEntry.drawFunc != NULL) { + this->unk_862 = 0; + } + this->getItemId = GI_NONE; this->getItemEntry = (GetItemEntry)GET_ITEM_NONE; } diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c index b8aff2d22..2fc3e3e15 100644 --- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c +++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c @@ -598,6 +598,170 @@ void KaleidoScope_UpdateItemEquip(GlobalContext* globalCtx) { u16 offsetX; u16 offsetY; + s16 Top_HUD_Margin = CVar_GetS32("gHUDMargin_T", 0); + s16 Left_HUD_Margin = CVar_GetS32("gHUDMargin_L", 0); + s16 Right_HUD_Margin = CVar_GetS32("gHUDMargin_R", 0); + s16 Bottom_HUD_Margin = CVar_GetS32("gHUDMargin_B", 0); + + s16 X_Margins_CL; + s16 X_Margins_CR; + s16 X_Margins_CD; + s16 Y_Margins_CL; + s16 Y_Margins_CR; + s16 Y_Margins_CD; + s16 X_Margins_BtnB; + s16 Y_Margins_BtnB; + s16 X_Margins_DPad_Items; + s16 Y_Margins_DPad_Items; + if (CVar_GetS32("gBBtnUseMargins", 0) != 0) { + if (CVar_GetS32("gBBtnPosType", 0) == 0) {X_Margins_BtnB = Right_HUD_Margin;}; + Y_Margins_BtnB = (Top_HUD_Margin*-1); + } else { + X_Margins_BtnB = 0; + Y_Margins_BtnB = 0; + } + if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) { + if (CVar_GetS32("gCBtnLPosType", 0) == 0) {X_Margins_CL = Right_HUD_Margin;}; + Y_Margins_CL = (Top_HUD_Margin*-1); + } else { + X_Margins_CL = 0; + Y_Margins_CL = 0; + } + if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) { + if (CVar_GetS32("gCBtnRPosType", 0) == 0) {X_Margins_CR = Right_HUD_Margin;}; + Y_Margins_CR = (Top_HUD_Margin*-1); + } else { + X_Margins_CR = 0; + Y_Margins_CR = 0; + } + if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) { + if (CVar_GetS32("gCBtnDPosType", 0) == 0) {X_Margins_CD = Right_HUD_Margin;}; + Y_Margins_CD = (Top_HUD_Margin*-1); + } else { + X_Margins_CD = 0; + Y_Margins_CD = 0; + } + if (CVar_GetS32("gDPadUseMargins", 0) != 0) { + if (CVar_GetS32("gDPadPosType", 0) == 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; + Y_Margins_DPad_Items = (Top_HUD_Margin*-1); + } else { + X_Margins_DPad_Items = 0; + Y_Margins_DPad_Items = 0; + } + const s16 ItemIconPos_ori[7][2] = { + { C_LEFT_BUTTON_X+X_Margins_CL, C_LEFT_BUTTON_Y+Y_Margins_CL }, + { C_DOWN_BUTTON_X+X_Margins_CD, C_DOWN_BUTTON_Y+Y_Margins_CD }, + { C_RIGHT_BUTTON_X+X_Margins_CR, C_RIGHT_BUTTON_Y+Y_Margins_CR }, + { DPAD_UP_X+X_Margins_DPad_Items, DPAD_UP_Y+Y_Margins_DPad_Items }, + { DPAD_DOWN_X+X_Margins_DPad_Items, DPAD_DOWN_Y+Y_Margins_DPad_Items }, + { DPAD_LEFT_X+X_Margins_DPad_Items, DPAD_LEFT_Y+Y_Margins_DPad_Items }, + { DPAD_RIGHT_X+X_Margins_DPad_Items, DPAD_RIGHT_Y+Y_Margins_DPad_Items } + }; + s16 DPad_ItemsOffset[4][2] = { + { 7,-8},//Up + { 7,24},//Down + {-9, 8},//Left + {23, 8},//Right + }; //(X,Y) Used with custom position to place it properly. + + //DPadItems + if (CVar_GetS32("gDPadPosType", 0) != 0) { + sCButtonPosY[3] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[0][1];//Up + sCButtonPosY[4] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[1][1];//Down + sCButtonPosY[5] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[2][1];//Left + sCButtonPosY[6] = CVar_GetS32("gDPadPosY", 0)+Y_Margins_DPad_Items+DPad_ItemsOffset[3][1];//Right + if (CVar_GetS32("gDPadPosType", 0) == 1) {//Anchor Left + if (CVar_GetS32("gDPadUseMargins", 0) != 0) {X_Margins_DPad_Items = Left_HUD_Margin;}; + sCButtonPosX[3] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); + sCButtonPosX[4] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); + sCButtonPosX[5] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); + sCButtonPosX[6] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); + } else if (CVar_GetS32("gDPadPosType", 0) == 2) {//Anchor Right + if (CVar_GetS32("gDPadUseMargins", 0) != 0) {X_Margins_DPad_Items = Right_HUD_Margin;}; + sCButtonPosX[3] = OTRGetDimensionFromRightEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[0][0]); + sCButtonPosX[4] = OTRGetDimensionFromRightEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[1][0]); + sCButtonPosX[5] = OTRGetDimensionFromRightEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[2][0]); + sCButtonPosX[6] = OTRGetDimensionFromRightEdge(CVar_GetS32("gDPadPosX", 0)+X_Margins_DPad_Items+DPad_ItemsOffset[3][0]); + } else if (CVar_GetS32("gDPadPosType", 0) == 3) {//Anchor None + sCButtonPosX[3] = CVar_GetS32("gDPadPosX", 0)+DPad_ItemsOffset[0][0]; + sCButtonPosX[4] = CVar_GetS32("gDPadPosX", 0)+DPad_ItemsOffset[1][0]; + sCButtonPosX[5] = CVar_GetS32("gDPadPosX", 0)+DPad_ItemsOffset[2][0]; + sCButtonPosX[6] = CVar_GetS32("gDPadPosX", 0)+DPad_ItemsOffset[3][0]; + } + } else { + sCButtonPosX[3] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[3][0]); + sCButtonPosX[4] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[4][0]); + sCButtonPosX[5] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[5][0]); + sCButtonPosX[6] = OTRGetDimensionFromRightEdge(ItemIconPos_ori[6][0]); + sCButtonPosY[3] = ItemIconPos_ori[3][1]; + sCButtonPosY[4] = ItemIconPos_ori[4][1]; + sCButtonPosY[5] = ItemIconPos_ori[5][1]; + sCButtonPosY[6] = ItemIconPos_ori[6][1]; + } + //C button Left + if (CVar_GetS32("gCBtnLPosType", 0) != 0) { + sCButtonPosY[0] = CVar_GetS32("gCBtnLPosY", 0)+Y_Margins_CL; + if (CVar_GetS32("gCBtnLPosType", 0) == 1) {//Anchor Left + if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Left_HUD_Margin;}; + sCButtonPosX[0] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); + } else if (CVar_GetS32("gCBtnLPosType", 0) == 2) {//Anchor Right + if (CVar_GetS32("gCBtnLUseMargins", 0) != 0) {X_Margins_CL = Right_HUD_Margin;}; + sCButtonPosX[0] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnLPosX", 0)+X_Margins_CL); + } else if (CVar_GetS32("gCBtnLPosType", 0) == 3) {//Anchor None + sCButtonPosX[0] = CVar_GetS32("gCBtnLPosX", 0); + } + } else { + sCButtonPosX[0] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[0][0]); + sCButtonPosY[0] = ItemIconPos_ori[0][1]; + } + //C Button down + if (CVar_GetS32("gCBtnDPosType", 0) != 0) { + sCButtonPosY[1] = CVar_GetS32("gCBtnDPosY", 0)+Y_Margins_CD; + if (CVar_GetS32("gCBtnDPosType", 0) == 1) {//Anchor Left + if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Left_HUD_Margin;}; + sCButtonPosX[1] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); + } else if (CVar_GetS32("gCBtnDPosType", 0) == 2) {//Anchor Right + if (CVar_GetS32("gCBtnDUseMargins", 0) != 0) {X_Margins_CD = Right_HUD_Margin;}; + sCButtonPosX[1] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnDPosX", 0)+X_Margins_CD); + } else if (CVar_GetS32("gCBtnDPosType", 0) == 3) {//Anchor None + sCButtonPosX[1] = CVar_GetS32("gCBtnDPosX", 0); + } + } else { + sCButtonPosX[1] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[1][0]); + sCButtonPosY[1] = ItemIconPos_ori[1][1]; + } + //C button Right + if (CVar_GetS32("gCBtnRPosType", 0) != 0) { + sCButtonPosY[2] = CVar_GetS32("gCBtnRPosY", 0)+Y_Margins_CR; + if (CVar_GetS32("gCBtnRPosType", 0) == 1) {//Anchor Left + if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Left_HUD_Margin;}; + sCButtonPosX[2] = OTRGetDimensionFromLeftEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); + } else if (CVar_GetS32("gCBtnRPosType", 0) == 2) {//Anchor Right + if (CVar_GetS32("gCBtnRUseMargins", 0) != 0) {X_Margins_CR = Right_HUD_Margin;}; + sCButtonPosX[2] = OTRGetDimensionFromRightEdge(CVar_GetS32("gCBtnRPosX", 0)+X_Margins_CR); + } else if (CVar_GetS32("gCBtnRPosType", 0) == 3) {//Anchor None + sCButtonPosX[2] = CVar_GetS32("gCBtnRPosX", 0); + } + } else { + sCButtonPosX[2] = OTRGetRectDimensionFromRightEdge(ItemIconPos_ori[2][0]); + sCButtonPosY[2] = ItemIconPos_ori[2][1]; + } + + sCButtonPosX[0] = sCButtonPosX[0] - 160; + sCButtonPosY[0] = 120 - sCButtonPosY[0]; + sCButtonPosX[1] = sCButtonPosX[1] - 160; + sCButtonPosY[1] = 120 - sCButtonPosY[1]; + sCButtonPosX[2] = sCButtonPosX[2] - 160; + sCButtonPosY[2] = 120 - sCButtonPosY[2]; + sCButtonPosX[3] = sCButtonPosX[3] - 160; + sCButtonPosY[3] = 120 - sCButtonPosY[3]; + sCButtonPosX[4] = sCButtonPosX[4] - 160; + sCButtonPosY[4] = 120 - sCButtonPosY[4]; + sCButtonPosX[5] = sCButtonPosX[5] - 160; + sCButtonPosY[5] = 120 - sCButtonPosY[5]; + sCButtonPosX[6] = sCButtonPosX[6] - 160; + sCButtonPosY[6] = 120 - sCButtonPosY[6]; + if (sEquipState == 0) { pauseCtx->equipAnimAlpha += 14; if (pauseCtx->equipAnimAlpha > 255) { @@ -628,7 +792,7 @@ void KaleidoScope_UpdateItemEquip(GlobalContext* globalCtx) { offsetX = ABS(pauseCtx->equipAnimX - bowItemVtx->v.ob[0] * 10) / sEquipMoveTimer; offsetY = ABS(pauseCtx->equipAnimY - bowItemVtx->v.ob[1] * 10) / sEquipMoveTimer; } else { - offsetX = ABS(pauseCtx->equipAnimX - OTRGetRectDimensionFromRightEdge(sCButtonPosX[pauseCtx->equipTargetCBtn]) * 10) / sEquipMoveTimer; + offsetX = ABS(pauseCtx->equipAnimX - sCButtonPosX[pauseCtx->equipTargetCBtn] * 10) / sEquipMoveTimer; offsetY = ABS(pauseCtx->equipAnimY - sCButtonPosY[pauseCtx->equipTargetCBtn] * 10) / sEquipMoveTimer; } @@ -658,7 +822,7 @@ void KaleidoScope_UpdateItemEquip(GlobalContext* globalCtx) { pauseCtx->equipAnimY += offsetY; } } else { - if (pauseCtx->equipAnimX >= OTRGetRectDimensionFromRightEdge(sCButtonPosX[pauseCtx->equipTargetCBtn]) * 10) { + if (pauseCtx->equipAnimX >= sCButtonPosX[pauseCtx->equipTargetCBtn] * 10) { pauseCtx->equipAnimX -= offsetX; } else { pauseCtx->equipAnimX += offsetX;