From e005985559c67331fdfee35127889e4da437d3e6 Mon Sep 17 00:00:00 2001 From: Ralphie Morell Date: Thu, 19 Oct 2023 17:17:45 -0400 Subject: [PATCH] Added tracker support --- .../randomizer/randomizer_item_tracker.cpp | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index f24ab818b..e3eb8fded 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -84,6 +84,24 @@ std::vector triforcePieces = { ITEM_TRACKER_ITEM(RG_TRIFORCE_PIECE, 0, DrawItem), }; +std::vector bossSoulItems = { + //Hack for right now, just gonna draw souls as bottles/big poes. + ItemTrackerItem(RG_GOHMA_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + ItemTrackerItem(RG_KING_DODONGO_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + ItemTrackerItem(RG_BARINADE_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + ItemTrackerItem(RG_PHANTOM_GANON_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + ItemTrackerItem(RG_VOLVAGIA_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + ItemTrackerItem(RG_MORPHA_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + ItemTrackerItem(RG_BONGO_BONGO_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + ItemTrackerItem(RG_TWINROVA_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + ItemTrackerItem(RG_GANON_SOUL, "ITEM_BIG_POE", "ITEM_BOTTLE_Faded", 0, DrawItem ), + + //For when these actually have textures, maybe? + // ITEM_TRACKER_ITEM(RG_GOHMA_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_KING_DODONGO_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_BARINADE_SOUL, 0, DrawItem), + // ITEM_TRACKER_ITEM(RG_PHANTOM_GANON_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_VOLVAGIA_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_MORPHA_SOUL, 0, DrawItem), + // ITEM_TRACKER_ITEM(RG_BONGO_BONGO_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_TWINROVA_SOUL, 0, DrawItem), ITEM_TRACKER_ITEM(RG_GANON_SOUL, 0, DrawItem), +}; + std::vector itemTrackerDungeonsWithMapsHorizontal = { { SCENE_DEKU_TREE, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, { SCENE_DODONGOS_CAVERN, { ITEM_DUNGEON_MAP, ITEM_COMPASS } }, @@ -154,6 +172,18 @@ std::map itemTrackerDungeonShortNames = { { SCENE_THIEVES_HIDEOUT, "HIDE" }, }; +std::map itemTrackerBossShortNames = { + { RG_GOHMA_SOUL, "GOHMA" }, + { RG_KING_DODONGO_SOUL, "KD" }, + { RG_BARINADE_SOUL, "BARI" }, + { RG_PHANTOM_GANON_SOUL, "PG"}, + { RG_VOLVAGIA_SOUL, "VOLV"}, + { RG_MORPHA_SOUL, "MORPH"}, + { RG_BONGO_BONGO_SOUL, "BONGO"}, + { RG_TWINROVA_SOUL, "TWIN"}, + { RG_GANON_SOUL, "GANON"}, +}; + std::vector dungeonItems = {}; std::unordered_map actualItemTrackerItemMap = { @@ -609,6 +639,52 @@ void DrawItem(ItemTrackerItem item) { hasItem = IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIFORCE_HUNT); itemName = "Triforce Piece"; break; + case RG_GOHMA_SOUL: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_GOHMA_SOUL); + itemName = "Gohma's Soul"; + break; + case RG_KING_DODONGO_SOUL: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_KING_DODONGO_SOUL); + itemName = "King Dodongo's Soul"; + break; + case RG_BARINADE_SOUL: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BARINADE_SOUL); + itemName = "Barinade's Soul"; + break; + case RG_PHANTOM_GANON_SOUL: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_PHANTOM_GANON_SOUL); + itemName = "Phantom Ganon's Soul"; + break; + case RG_VOLVAGIA_SOUL: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_VOLVAGIA_SOUL); + itemName = "Volvagia's Soul"; + break; + case RG_MORPHA_SOUL: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_MORPHA_SOUL); + itemName = "Morpha's Soul"; + break; + case RG_BONGO_BONGO_SOUL: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_BONGO_BONGO_SOUL); + itemName = "Bongo Bongo's Soul"; + break; + case RG_TWINROVA_SOUL: + actualItemId = item.id; + hasItem = Flags_GetRandomizerInf(RAND_INF_TWINROVA_SOUL); + itemName = "Twinrova's Soul"; + break; + case RG_GANON_SOUL: + actualItemId = item.id; + hasItem = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BOSS_SOULS) == RO_BOSS_SOULS_ON_PLUS_GANON ? true : + Flags_GetRandomizerInf(RAND_INF_GANON_SOUL); + itemName = "Ganon's Soul"; + break; } if (GameInteractor::IsSaveLoaded() && (hasItem && item.id != actualItemId && actualItemTrackerItemMap.find(actualItemId) != actualItemTrackerItemMap.end())) { @@ -621,6 +697,16 @@ void DrawItem(ItemTrackerItem item) { ImVec2(iconSize, iconSize), ImVec2(0, 0), ImVec2(1, 1)); DrawItemCount(item); + + if (item.id >= RG_GOHMA_SOUL && item.id <= RG_GANON_SOUL) { + ImVec2 p = ImGui::GetCursorScreenPos(); + std::string bossName = itemTrackerBossShortNames[item.id]; + ImGui::SetCursorScreenPos(ImVec2(p.x + (iconSize / 2) - (ImGui::CalcTextSize(bossName.c_str()).x / 2), p.y - (iconSize + 13))); + ImGui::PushStyleColor(ImGuiCol_Text, IM_COL_WHITE); + ImGui::Text("%s", bossName.c_str()); + ImGui::PopStyleColor(); + } + ImGui::EndGroup(); if (itemName == "") { @@ -956,6 +1042,17 @@ void UpdateVectors() { mainWindowItems.insert(mainWindowItems.end(), triforcePieces.begin(), triforcePieces.end()); } + //If we're adding boss souls to the main window... + if (CVarGetInteger("gItemTrackerBossSoulsDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) { + //...add empty items on the main window to get the souls on their own row. (Too many to sit with Greg/Triforce pieces) + while (mainWindowItems.size() % 6) { + mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); + } + + //Add boss souls + mainWindowItems.insert(mainWindowItems.end(), bossSoulItems.begin(), bossSoulItems.end()); + } + shouldUpdateVectors = false; } @@ -1056,6 +1153,12 @@ void ItemTrackerWindow::DrawElement() { EndFloatingWindows(); } + if (CVarGetInteger("gItemTrackerBossSoulsDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) { + BeginFloatingWindows("Boss Soul Tracker"); + DrawItemsInRows(bossSoulItems); + EndFloatingWindows(); + } + if (CVarGetInteger("gItemTrackerNotesDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE && CVarGetInteger("gItemTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { ImGui::SetNextWindowSize(ImVec2(400,300), ImGuiCond_FirstUseEver); BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing); @@ -1195,6 +1298,10 @@ void ItemTrackerSettingsWindow::DrawElement() { shouldUpdateVectors = true; } + if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Boss Souls", "gItemTrackerBossSoulsDisplayType", displayTypes, SECTION_DISPLAY_HIDDEN)) { + shouldUpdateVectors = true; + } + if (CVarGetInteger("gItemTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Personal notes", "gItemTrackerNotesDisplayType", displayTypes, SECTION_DISPLAY_HIDDEN)) { shouldUpdateVectors = true;