summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett Cox <garrettjcox@gmail.com>2026-01-22 15:51:14 -0600
committerGitHub <noreply@github.com>2026-01-22 15:51:14 -0600
commit079f44bae3d3fe0bd01de01111a01edbb1b81a8c (patch)
treea5de9dc680a176b3107255d56deed0c745ff2379
parent99204fb69c923cba79299675c2ce21bb4f8ee587 (diff)
Check/Item Tracker improvements (#1492)
-rw-r--r--mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp55
-rw-r--r--mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.h7
-rw-r--r--mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp35
-rw-r--r--mm/2s2h/Rando/CheckTracker/CheckTracker.cpp126
-rw-r--r--mm/2s2h/Rando/ConvertItem.cpp3
5 files changed, 196 insertions, 30 deletions
diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp
index e347a630e..b3ffb3499 100644
--- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp
+++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.cpp
@@ -5,7 +5,7 @@
#include "Rando/Rando.h"
#include "Rando/ActorBehavior/Souls.h"
#include "Rando/MiscBehavior/ClockShuffle.h"
-
+#include "2s2h/BenPort.h"
#include "2s2h/ShipUtils.h"
#include <spdlog/fmt/fmt.h>
@@ -25,7 +25,13 @@ extern std::shared_ptr<ItemTrackerWindow> mItemTrackerWindow;
#define FORMAT_COUNT "{}/{}"
+#define CVAR_NAME_VISIBILITY_MODE "gSettings.ItemTracker.VisibilityMode"
+#define CVAR_NAME_VISIBILITY_BTN "gSettings.ItemTracker.VisibilityBtn"
+#define CVAR_VISIBILITY_MODE CVarGetInteger(CVAR_NAME_VISIBILITY_MODE, ITEM_TRACKER_VISIBILITY_MODE_ALWAYS)
+#define CVAR_VISIBILITY_BTN CVarGetInteger(CVAR_NAME_VISIBILITY_BTN, BTN_CUSTOM_MODIFIER1)
+
std::vector<TrackerGroup> itemTrackerGroups;
+static bool sItemTrackerBtnState = false;
TrackerImageObject GetImageObject(TrackerItemType itemType, u32 itemId) {
bool isSaveLoaded = gPlayState != NULL && gSaveContext.gameMode == GAMEMODE_NORMAL;
@@ -79,8 +85,11 @@ TrackerImageObject GetImageObject(TrackerItemType itemType, u32 itemId) {
}
trackerImageObject.textureColor = Ship_GetRandoItemColorTint(randoItemId);
- trackerImageObject.textureId = Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(
- Rando::StaticData::GetIconTexturePath(randoItemId));
+ const char* texturePath = Rando::StaticData::GetIconTexturePath(randoItemId);
+ if (texturePath != nullptr) {
+ trackerImageObject.textureId =
+ Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(texturePath);
+ }
if (randoItemId >= RI_OWL_CLOCK_TOWN_SOUTH && randoItemId <= RI_OWL_ZORA_CAPE) {
trackerImageObject.textureDimensions.y = 24.0f;
} else if (randoItemId >= RI_SONG_DOUBLE_TIME && randoItemId <= RI_SONG_TIME) {
@@ -90,7 +99,7 @@ TrackerImageObject GetImageObject(TrackerItemType itemType, u32 itemId) {
case TRACKER_ITEM_SLOT: {
itemObtained = gSaveContext.save.saveInfo.inventory.items[itemId] != ITEM_NONE;
auto vanillaItemId = isSaveLoaded ? gSaveContext.save.saveInfo.inventory.items[itemId] : ITEM_NONE;
- if (vanillaItemId == ITEM_NONE) {
+ if (vanillaItemId == ITEM_NONE || vanillaItemId >= ITEM_RECOVERY_HEART) {
vanillaItemId = safeItemsForInventorySlot[itemId][0];
}
@@ -339,8 +348,10 @@ bool DrawItemTrackerSlot(TrackerItemType itemType, u32 itemId, float scale, bool
ImGui::GetColorU32(tintColor));
}
- ImGui::GetWindowDrawList()->AddImage(imageObject.textureId, p0 + offset, p0 + offset + drawSize, ImVec2(0, 0),
- ImVec2(1, 1), ImGui::GetColorU32(imageObject.textureColor));
+ if (imageObject.textureId != nullptr) {
+ ImGui::GetWindowDrawList()->AddImage(imageObject.textureId, p0 + offset, p0 + offset + drawSize, ImVec2(0, 0),
+ ImVec2(1, 1), ImGui::GetColorU32(imageObject.textureColor));
+ }
auto itemName = GetItemTrackerItemName(itemType, itemId);
if (!itemName.empty()) {
UIWidgets::Tooltip(itemName.c_str());
@@ -388,6 +399,17 @@ void ItemTrackerWindow::Draw() {
return;
}
+ if (CVAR_VISIBILITY_MODE == ITEM_TRACKER_VISIBILITY_MODE_ONLY_ON_PAUSE_MENU &&
+ (!gPlayState || !gPlayState->pauseCtx.state)) {
+ return;
+ }
+
+ if ((CVAR_VISIBILITY_MODE == ITEM_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE ||
+ CVAR_VISIBILITY_MODE == ITEM_TRACKER_VISIBILITY_MODE_BUTTON_HOLD) &&
+ !sItemTrackerBtnState) {
+ return;
+ }
+
ImGuiWindowFlags windowFlags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNav |
ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize |
ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar;
@@ -452,3 +474,24 @@ void ItemTrackerWindow::InitElement() {
void ItemTrackerWindow::DrawElement() {
}
+
+static RegisterShipInitFunc initFunc(
+ []() {
+ COND_HOOK(OnGameStateMainStart, CVAR_VISIBILITY_MODE >= ITEM_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE, []() {
+ Input* input = CONTROLLER1(gGameState);
+
+ if (CVAR_VISIBILITY_MODE == ITEM_TRACKER_VISIBILITY_MODE_BUTTON_HOLD) {
+ if (CHECK_BTN_ALL(input->cur.button, CVAR_VISIBILITY_BTN)) {
+ sItemTrackerBtnState = true;
+ } else {
+ sItemTrackerBtnState = false;
+ }
+ } else {
+ if (CHECK_BTN_ALL(input->cur.button, CVAR_VISIBILITY_BTN) &&
+ CHECK_BTN_ANY(input->press.button, CVAR_VISIBILITY_BTN)) {
+ sItemTrackerBtnState = !sItemTrackerBtnState;
+ }
+ }
+ });
+ },
+ { CVAR_NAME_VISIBILITY_MODE });
diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.h b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.h
index 2c650bd01..dd495de82 100644
--- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.h
+++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTracker.h
@@ -13,6 +13,13 @@ typedef enum {
TRACKER_ITEM_MAGIC,
} TrackerItemType;
+typedef enum {
+ ITEM_TRACKER_VISIBILITY_MODE_ALWAYS,
+ ITEM_TRACKER_VISIBILITY_MODE_ONLY_ON_PAUSE_MENU,
+ ITEM_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE,
+ ITEM_TRACKER_VISIBILITY_MODE_BUTTON_HOLD,
+} ItemTrackerVisibilityMode;
+
typedef struct {
ImTextureID textureId;
ImVec4 textureColor;
diff --git a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp
index b1c91d3c5..a2ffb8f6f 100644
--- a/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp
+++ b/mm/2s2h/Enhancements/Trackers/ItemTracker/ItemTrackerSettings.cpp
@@ -4,6 +4,7 @@
#include "ShipUtils.h"
#include "ship/config/Config.h"
#include "2s2h/ShipInit.hpp"
+#include "2s2h/BenPort.h"
namespace BenGui {
extern std::shared_ptr<ItemTrackerWindow> mItemTrackerWindow;
@@ -13,9 +14,20 @@ void ItemTrackerSettingsWindow::UpdateElement() {
}
#define WIDGET_COLOR UIWidgets::Colors(CVarGetInteger("gSettings.Menu.Theme", 5))
+#define CVAR_NAME_VISIBILITY_MODE "gSettings.ItemTracker.VisibilityMode"
+#define CVAR_NAME_VISIBILITY_BTN "gSettings.ItemTracker.VisibilityBtn"
+#define CVAR_VISIBILITY_MODE CVarGetInteger(CVAR_NAME_VISIBILITY_MODE, ITEM_TRACKER_VISIBILITY_MODE_ALWAYS)
+#define CVAR_VISIBILITY_BTN CVarGetInteger(CVAR_NAME_VISIBILITY_BTN, BTN_CUSTOM_MODIFIER1)
static const char* windowTypes[2] = { "Floating", "Window" };
+static std::unordered_map<int32_t, const char*> sItemTrackerVisibilityModes = {
+ { ITEM_TRACKER_VISIBILITY_MODE_ALWAYS, "Always" },
+ { ITEM_TRACKER_VISIBILITY_MODE_ONLY_ON_PAUSE_MENU, "Only on Pause Menu" },
+ { ITEM_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE, "Button Toggle" },
+ { ITEM_TRACKER_VISIBILITY_MODE_BUTTON_HOLD, "Button Hold" },
+};
+
std::vector<TrackerGroup> itemTrackerGroupsAvailable;
void SaveItemTrackerLayout();
@@ -493,7 +505,7 @@ void LoadItemTrackerConfig() {
}
void DrawTrackerOptions() {
- if (ImGui::BeginTable("OptionsTable", 2)) {
+ if (ImGui::BeginTable("OptionsTable", 3)) {
ImGui::TableNextColumn();
if (CVarGetInteger("gWindows.ItemTracker", 0)) {
UIWidgets::WindowButton("Disable Item Tracker", "gWindows.ItemTracker", BenGui::mItemTrackerWindow,
@@ -503,15 +515,28 @@ void DrawTrackerOptions() {
{ .size = UIWidgets::Sizes::Inline, .color = UIWidgets::Colors::Green });
}
- UIWidgets::CVarCombobox("Window Type", "gSettings.ItemTracker.WindowType", windowTypes,
- { .alignment = UIWidgets::ComponentAlignment::Right,
- .labelPosition = UIWidgets::LabelPosition::Near,
- .color = WIDGET_COLOR });
UIWidgets::CVarCheckbox("Split Window Groups", "gSettings.ItemTracker.WindowGroup");
UIWidgets::CVarCheckbox("Show Item Counts", "gSettings.ItemTracker.ItemCounts",
UIWidgets::CheckboxOptions().DefaultValue(true));
ImGui::TableNextColumn();
+ UIWidgets::CVarCombobox("Window Type", "gSettings.ItemTracker.WindowType", windowTypes,
+ UIWidgets::ComboboxOptions()
+ .ComponentAlignment(UIWidgets::ComponentAlignment::Right)
+ .LabelPosition(UIWidgets::LabelPosition::Far));
+ UIWidgets::CVarCombobox("Visibility", CVAR_NAME_VISIBILITY_MODE, &sItemTrackerVisibilityModes,
+ UIWidgets::ComboboxOptions()
+ .DefaultIndex(ITEM_TRACKER_VISIBILITY_MODE_ALWAYS)
+ .ComponentAlignment(UIWidgets::ComponentAlignment::Right)
+ .LabelPosition(UIWidgets::LabelPosition::Far));
+ if (CVAR_VISIBILITY_MODE == ITEM_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE ||
+ CVAR_VISIBILITY_MODE == ITEM_TRACKER_VISIBILITY_MODE_BUTTON_HOLD) {
+ UIWidgets::CVarBtnSelector("Button Combination:", CVAR_NAME_VISIBILITY_BTN,
+ UIWidgets::BtnSelectorOptions().DefaultValue(BTN_CUSTOM_MODIFIER1));
+ }
+
+ ImGui::TableNextColumn();
+
if (UIWidgets::Button("Restore Default Groups", { .color = UIWidgets::Colors::Gray })) {
ApplyDefaultItemPreset();
SaveItemTrackerLayout();
diff --git a/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp b/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp
index 6b0a393c0..6a35728a6 100644
--- a/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp
+++ b/mm/2s2h/Rando/CheckTracker/CheckTracker.cpp
@@ -4,6 +4,7 @@
#include "2s2h/ShipUtils.h"
#include "2s2h/BenGui/UIWidgets.hpp"
#include "2s2h/Rando/StaticData/StaticData.h"
+#include "2s2h/BenPort.h"
#include <cstring>
// Image Icons
@@ -51,7 +52,25 @@ static std::unordered_map<int32_t, const char*> sCheckModes = {
{ CHECK_MODE_HIDDEN, "Hidden" },
};
+typedef enum {
+ CHECK_TRACKER_VISIBILITY_MODE_ALWAYS,
+ CHECK_TRACKER_VISIBILITY_MODE_ONLY_ON_PAUSE_MENU,
+ CHECK_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE,
+ CHECK_TRACKER_VISIBILITY_MODE_BUTTON_HOLD,
+} CheckTrackerVisibilityMode;
+
+static std::unordered_map<int32_t, const char*> sCheckVisibilityModes = {
+ { CHECK_TRACKER_VISIBILITY_MODE_ALWAYS, "Always" },
+ { CHECK_TRACKER_VISIBILITY_MODE_ONLY_ON_PAUSE_MENU, "Only on Pause Menu" },
+ { CHECK_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE, "Button Toggle" },
+ { CHECK_TRACKER_VISIBILITY_MODE_BUTTON_HOLD, "Button Hold" },
+};
+
+static bool sCheckTrackerBtnState = false;
+
#define CVAR_NAME_SHOW_CHECK_TRACKER "gWindows.CheckTracker"
+#define CVAR_NAME_VISIBILITY_MODE "gRando.CheckTracker.VisibilityMode"
+#define CVAR_NAME_VISIBILITY_BTN "gRando.CheckTracker.VisibilityBtn"
#define CVAR_NAME_OUT_OF_LOGIC_MODE "gRando.CheckTracker.OutOfLogicMode"
#define CVAR_NAME_OUT_OF_LOGIC_COLOR "gRando.CheckTracker.OutOfLogicColor"
#define CVAR_NAME_COLLECTED_MODE "gRando.CheckTracker.CollectedMode"
@@ -65,6 +84,8 @@ static std::unordered_map<int32_t, const char*> sCheckModes = {
#define CVAR_NAME_SHOW_CHECK_TYPE_FILTER "gRando.CheckTracker.ShowCheckTypeFilter"
#define CVAR_NAME_SHOW_SEARCH "gRando.CheckTracker.ShowSearch"
#define CVAR_SHOW_CHECK_TRACKER CVarGetInteger(CVAR_NAME_SHOW_CHECK_TRACKER, 0)
+#define CVAR_VISIBILITY_MODE CVarGetInteger(CVAR_NAME_VISIBILITY_MODE, CHECK_TRACKER_VISIBILITY_MODE_ALWAYS)
+#define CVAR_VISIBILITY_BTN CVarGetInteger(CVAR_NAME_VISIBILITY_BTN, BTN_CUSTOM_MODIFIER1)
#define CVAR_OUT_OF_LOGIC_MODE CVarGetInteger(CVAR_NAME_OUT_OF_LOGIC_MODE, CHECK_MODE_COLORED)
#define CVAR_OUT_OF_LOGIC_COLOR CVarGetColor(CVAR_NAME_OUT_OF_LOGIC_COLOR ".Value", { 255, 255, 255, 100 })
#define CVAR_COLLECTED_MODE CVarGetInteger(CVAR_NAME_COLLECTED_MODE, CHECK_MODE_HIDDEN)
@@ -351,15 +372,15 @@ void CheckTrackerDrawNonLogicalList() {
continue;
}
- if (!CVAR_SHOW_CURRENT_SCENE && CVAR_SCROLL_TO_SCENE && sScrollToTargetScene != -1 &&
- sScrollToTargetScene == sceneId) {
+ ImGui::PushID(sceneId);
+ ImGui::Separator();
+
+ // Auto-scroll to current scene - called after Separator to ensure stable positioning
+ if (!CVAR_SHOW_CURRENT_SCENE && sScrollToTargetScene != -1 && sScrollToTargetScene == sceneId) {
ImGui::SetScrollHereY(0.0f);
sScrollToTargetScene = -1;
sScrollToTargetEntrance = -1;
}
-
- ImGui::PushID(sceneId);
- ImGui::Separator();
ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0, 0, 0, 0));
std::string headerText = Ship_GetSceneName(sceneId);
headerText += " (" + std::to_string(obtainedCheckSum) + "/" + std::to_string(unfilteredChecks.size()) + ")";
@@ -456,6 +477,17 @@ void CheckTrackerWindow::Draw() {
return;
}
+ if (CVAR_VISIBILITY_MODE == CHECK_TRACKER_VISIBILITY_MODE_ONLY_ON_PAUSE_MENU &&
+ (!gPlayState || !gPlayState->pauseCtx.state)) {
+ return;
+ }
+
+ if ((CVAR_VISIBILITY_MODE == CHECK_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE ||
+ CVAR_VISIBILITY_MODE == CHECK_TRACKER_VISIBILITY_MODE_BUTTON_HOLD) &&
+ !sCheckTrackerBtnState) {
+ return;
+ }
+
ImGui::PushStyleColor(ImGuiCol_TitleBgActive, trackerBG);
ImGui::PushStyleColor(ImGuiCol_TitleBg, trackerBG);
ImGui::PushStyleColor(ImGuiCol_WindowBg, trackerBG);
@@ -483,12 +515,32 @@ void CheckTrackerWindow::Draw() {
bool sameLine = !(ImGui::GetContentRegionAvail().x <= 300.0f * trackerScale);
auto totalCheckCount = GetTotalCheckCount();
- UIWidgets::PushStyleCombobox();
+ UIWidgets::PushStyleInput();
sCheckTrackerFilter.Draw("##filter", (ImGui::GetContentRegionAvail().x -
(sameLine ? (ImGui::CalcTextSize("Total: ").x +
- ImGui::CalcTextSize(totalCheckCount.c_str()).x + 15.0f)
- : 0)));
- UIWidgets::PopStyleCombobox();
+ ImGui::CalcTextSize(totalCheckCount.c_str()).x + 60.0f)
+ : 40.0f)));
+ UIWidgets::PopStyleInput();
+
+ ImGui::SameLine();
+ if (!sCheckTrackerFilter.IsActive()) {
+ if (UIWidgets::Button(ICON_FA_ARROWS_V, UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline))) {
+ if (gPlayState) {
+ sScrollToTargetScene = Play_GetOriginalSceneId(gPlayState->sceneId);
+ sScrollToTargetEntrance = gSaveContext.save.entrance;
+ }
+ }
+ UIWidgets::Tooltip("Scroll to Current Scene");
+ } else {
+ if (UIWidgets::Button(ICON_FA_TIMES, UIWidgets::ButtonOptions().Size(UIWidgets::Sizes::Inline))) {
+ sCheckTrackerFilter.Clear();
+ if (gPlayState) {
+ sScrollToTargetScene = Play_GetOriginalSceneId(gPlayState->sceneId);
+ sScrollToTargetEntrance = gSaveContext.save.entrance;
+ }
+ }
+ }
+
if (!sCheckTrackerFilter.IsActive()) {
ImGui::SameLine(18.0f);
ImGui::Text("Search");
@@ -521,15 +573,22 @@ void CheckTrackerWindow::Draw() {
} else if (randoCheckType == RCTYPE_SONG) {
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 4.0f);
}
- if (ImGui::ImageButton(
- std::to_string(randoCheckType).c_str(), textureId,
- ImVec2((randoCheckType == RCTYPE_SONG ? 18.0f : 24.0f) * trackerScale,
- (randoCheckType == RCTYPE_OWL ? 12.0f * trackerScale : 24.0f * trackerScale) *
- trackerScale),
- ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0),
- randoCheckType == RCTYPE_UNKNOWN ? ImVec4(1, 0, 0, 1)
- : randoCheckType == RCTYPE_FREESTANDING ? ImVec4(0.78f, 1, 0.39f, 1)
- : ImVec4(1, 1, 1, 1))) {
+
+ ImVec2 size = ImVec2(24.0f * trackerScale, 24.0f * trackerScale);
+ if (randoCheckType == RCTYPE_SONG) {
+ size.x = 18.0f * trackerScale;
+ } else if (randoCheckType == RCTYPE_OWL) {
+ size.y = 12.0f * trackerScale;
+ }
+ ImVec4 tint = ImVec4(1, 1, 1, 1);
+ if (randoCheckType == RCTYPE_FREESTANDING) {
+ tint = ImVec4(0.78f, 1, 0.39f, 1);
+ } else if (randoCheckType == RCTYPE_UNKNOWN) {
+ tint = ImVec4(1, 0, 0, 1);
+ }
+
+ if (ImGui::ImageButton(std::to_string(randoCheckType).c_str(), textureId, size, ImVec2(0, 0),
+ ImVec2(1, 1), ImVec4(0, 0, 0, 0), tint)) {
if (randoCheckType == RCTYPE_UNKNOWN) {
checkTypeFilter.clear();
} else {
@@ -607,6 +666,16 @@ void SettingsWindow::DrawElement() {
ImGui::TableNextColumn();
ImGui::SeparatorText("Window Settings");
+ UIWidgets::CVarCombobox("Visibility", CVAR_NAME_VISIBILITY_MODE, &sCheckVisibilityModes,
+ UIWidgets::ComboboxOptions()
+ .DefaultIndex(CHECK_TRACKER_VISIBILITY_MODE_ALWAYS)
+ .ComponentAlignment(UIWidgets::ComponentAlignment::Right)
+ .LabelPosition(UIWidgets::LabelPosition::Far));
+ if (CVAR_VISIBILITY_MODE == CHECK_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE ||
+ CVAR_VISIBILITY_MODE == CHECK_TRACKER_VISIBILITY_MODE_BUTTON_HOLD) {
+ UIWidgets::CVarBtnSelector("Button Combination:", CVAR_NAME_VISIBILITY_BTN,
+ UIWidgets::BtnSelectorOptions().DefaultValue(BTN_CUSTOM_MODIFIER1));
+ }
UIWidgets::CVarCheckbox("Show Search", CVAR_NAME_SHOW_SEARCH, UIWidgets::CheckboxOptions().DefaultValue(true));
UIWidgets::CVarCheckbox("Show Check Type Filters", CVAR_NAME_SHOW_CHECK_TYPE_FILTER);
@@ -654,6 +723,27 @@ void Init() {
trackerScale = CVAR_TRACKER_SCALE;
}
+static RegisterShipInitFunc initFunc(
+ []() {
+ COND_HOOK(OnGameStateMainStart, CVAR_VISIBILITY_MODE >= CHECK_TRACKER_VISIBILITY_MODE_BUTTON_TOGGLE, []() {
+ Input* input = CONTROLLER1(gGameState);
+
+ if (CVAR_VISIBILITY_MODE == CHECK_TRACKER_VISIBILITY_MODE_BUTTON_HOLD) {
+ if (CHECK_BTN_ALL(input->cur.button, CVAR_VISIBILITY_BTN)) {
+ sCheckTrackerBtnState = true;
+ } else {
+ sCheckTrackerBtnState = false;
+ }
+ } else {
+ if (CHECK_BTN_ALL(input->cur.button, CVAR_VISIBILITY_BTN) &&
+ CHECK_BTN_ANY(input->press.button, CVAR_VISIBILITY_BTN)) {
+ sCheckTrackerBtnState = !sCheckTrackerBtnState;
+ }
+ }
+ });
+ },
+ { CVAR_NAME_VISIBILITY_MODE });
+
void OnFileLoad() {
if (!IS_RANDO) {
return;
diff --git a/mm/2s2h/Rando/ConvertItem.cpp b/mm/2s2h/Rando/ConvertItem.cpp
index faba39b3e..5e11a7204 100644
--- a/mm/2s2h/Rando/ConvertItem.cpp
+++ b/mm/2s2h/Rando/ConvertItem.cpp
@@ -322,7 +322,6 @@ bool Rando::IsItemObtainable(RandoItemId randoItemId, RandoCheckId randoCheckId)
case RI_SNOWHEAD_SMALL_KEY:
case RI_GREAT_BAY_SMALL_KEY:
case RI_STONE_TOWER_SMALL_KEY:
- case RI_CLOCK_TOWN_STRAY_FAIRY:
case RI_WOODFALL_STRAY_FAIRY:
case RI_SNOWHEAD_STRAY_FAIRY:
case RI_GREAT_BAY_STRAY_FAIRY:
@@ -334,6 +333,8 @@ bool Rando::IsItemObtainable(RandoItemId randoItemId, RandoCheckId randoCheckId)
return false;
}
return true;
+ case RI_CLOCK_TOWN_STRAY_FAIRY:
+ return !CHECK_WEEKEVENTREG(WEEKEVENTREG_08_80);
case RI_HEART_PIECE:
case RI_HEART_CONTAINER:
if (hasObtainedCheck) {