Compare commits

..

23 Commits

Author SHA1 Message Date
Eric Hoey ac93d7cc15 Add additional glitch-aiding cutscenes for MQ (#5769)
* add mq jabu chest + mq spirit switch cs

* update tooltip
2025-09-08 20:44:45 -07:00
Pepper0ni 27f2292f9d Fix gerudo card generation failures (#5774)
* quick fix gerudo card

* submodules pls
2025-09-08 20:44:36 -07:00
Malkierian 837f497ea6 Encapsulate BeginTable for item and check tracker settings windows. (#5778) 2025-09-08 20:44:27 -07:00
Extloga 405fc7a31d Fixes for the German translation in util.cpp (#5768)
* Fixes for the German translation in util.cpp

* Fixes for the German translation in item_list.cpp

* Fixes for the German translation in item_list.cpp

* Fixes for the German translation in util.cpp

* Revert the fixes for the German translation in item_list.cpp

* Fixes for the German translation in util.cpp

* Fixes for the German translation in util.cpp

* Fixes for the German translation in util.cpp

* Fixes for the German translation in util.cpp

* Fixes for the German translation in util.cpp

* Fixes for the German translation in kaleidoscope_ger.json

* Revert the fixes for the German translation in kaleidoscope_ger.json

* Fixes for the German translation in util.cpp
2025-09-08 20:44:19 -07:00
Malkierian cbd376afa9 Search Tweaks (#5767)
* Increase vibrancy of search field color.
Set autofocus to only happen on fresh menu load.

* Revert tooltip addition.
2025-08-28 08:59:45 -07:00
PurpleHato 7b38093665 [TWEAK] Localization support for the Notification System (#5751)
* Localization support

* stick/nuts updrage french  wording

* forgot german questItem and function adaptation for these

* names

* clang

* name + clang

* should be the last one :derp:

* German typo
2025-08-26 12:34:29 -07:00
balloondude2 21e37d9ac2 Fix the Show Horizontal Resolution Field option v2 (#5744)
* move showHorizontalResField initialization

* remove redundant assignment

Co-authored-by: Philip Dubé <serprex@users.noreply.github.com>

---------

Co-authored-by: Philip Dubé <serprex@users.noreply.github.com>
2025-08-25 12:00:28 -07:00
Eric Hoey 820d097c84 Fix King Dodongo door switch cutscene (#5729)
* fix parathenses to properly OR

* clang clang clang
2025-08-25 12:00:04 -07:00
Pepper0ni 224efe2946 Fix TOT_MASTER_SWORD when the master sword is stated with but not shuffled. (#5705)
* Fix TOT_MASTER_SWORD when the master sword is stated with but not shuffled.

* remove RC_MASTER_SWORD_PEDESTAL
2025-08-25 11:59:47 -07:00
Malkierian b6166f41c8 Restore previous state of z_door_warp1.c, and reimplement boss rush blue warp bypass. This also fixes the issue with shadow and spirit medallions not being given in vanilla without cutscene skips on. (#5763)
Ensure shadow and spirit medallions get queued when skipping story cutscenes in vanilla.
2025-08-25 11:59:38 -07:00
Jordan Longstaff 9ff9bebaa2 Fix faulty Nocturne trigger when receiving Fire Medallion (#5761) 2025-08-25 11:59:28 -07:00
Eric Hoey 568639dfc0 skip ItemGet for small keys after skeleton key (#5730) 2025-08-12 20:37:08 -07:00
Eric Hoey e104870e6a remove !IS_RANDO check (#5728) 2025-08-12 19:56:07 -07:00
xxAtrain223 353ad944be Removed SHUTTER_BACK_LOCKED and SHUTTER_BOSS from GetDungeonSmallKeyDoors. (#5738) 2025-08-12 19:55:38 -07:00
Malkierian 89c1c97522 Add missing CVar check for tab key processing for alt asset toggle. (#5736) 2025-08-09 11:17:33 -07:00
Pepper0ni b87f1432fd properly clear location subcatagories when generating a seed (#5707) 2025-08-05 20:43:19 -07:00
Malkierian be77a9be71 Fix Dpad Navigation and Dpad equips on Inventory (#5708)
* Encapsulates ship-specific stuff inside the first state checks in menu draw functions to prevent function bleed.

* clang
2025-07-29 18:47:43 -07:00
Malkierian 7d7072f717 Bump version to 9.0.5 (#5694) 2025-07-23 21:31:13 -07:00
Jordan Longstaff ccf3d4b6a0 Add playing icon to improve Audio Editor indicator (#5686) 2025-07-23 20:48:01 -07:00
AltoXorg d06cf6bf10 timesplitdata.json obey app directory (#5693) 2025-07-23 20:45:46 -07:00
Malkierian d51e88b972 Rando Versioning (Again) (#5691)
* Adds Sulu/Spock rando block check (data not empty, but all sub-entries null), and put that and data being empty to the old file flow.
Also moves the `SaveFile` call to after everything else is loaded to preserve sohStats block.

* Add check for blank buildVersion in sohStats block for determining old saves.

* clang
2025-07-23 20:45:22 -07:00
Malkierian c588d48672 Bump version to Blair Echo. (#5690) 2025-07-21 22:21:59 -07:00
Malkierian 35ad68578e Prevent empty randomizer blocks from triggering the rando version flow. (#5689)
Clear SpoilerLog CVar when unsupported spoiler log is discovered on load.
2025-07-21 22:19:04 -07:00
27 changed files with 825 additions and 342 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ set(CMAKE_C_STANDARD 17 CACHE STRING "The C standard to use")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
project(Ship VERSION 9.0.3 LANGUAGES C CXX) project(Ship VERSION 9.0.5 LANGUAGES C CXX)
include(CMake/soh-cvars.cmake) include(CMake/soh-cvars.cmake)
include(CMake/lus-cvars.cmake) include(CMake/lus-cvars.cmake)
@@ -1,6 +1,7 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/OTRGlobals.h" #include "soh/OTRGlobals.h"
#include "soh/Enhancements/timesaver_hook_handlers.h"
extern "C" { extern "C" {
#include "macros.h" #include "macros.h"
@@ -12,6 +13,7 @@ extern "C" {
#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() #define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get()
extern "C" PlayState* gPlayState;
static bool sEnteredBlueWarp = false; static bool sEnteredBlueWarp = false;
/** /**
@@ -124,6 +126,13 @@ void SkipBlueWarp_ShouldPlayBlueWarpCS(GIVanillaBehavior _, bool* should, va_lis
*/ */
void SkipBlueWarp_ShouldGiveItem(GIVanillaBehavior _, bool* should, va_list originalArgs) { void SkipBlueWarp_ShouldGiveItem(GIVanillaBehavior _, bool* should, va_list originalArgs) {
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) {
if (IS_VANILLA) {
if (gPlayState->sceneNum == SCENE_SHADOW_TEMPLE_BOSS) {
TimeSaverQueueItem(RG_SHADOW_MEDALLION);
} else if (gPlayState->sceneNum == SCENE_SPIRIT_TEMPLE_BOSS) {
TimeSaverQueueItem(RG_SPIRIT_MEDALLION);
}
}
*should = false; *should = false;
} }
} }
+6 -3
View File
@@ -298,9 +298,12 @@ void Draw_SfxTab(const std::string& tabId, SeqType type, const std::string& tabN
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::TextColored( if (isCurrentlyPlaying) {
UIWidgets::ColorValues.at(isCurrentlyPlaying ? UIWidgets::Colors::Yellow : UIWidgets::Colors::White), "%s", ImGui::TextColored(UIWidgets::ColorValues.at(UIWidgets::Colors::Yellow), "%s %s", ICON_FA_PLAY,
seqData.label.c_str()); seqData.label.c_str());
} else {
ImGui::Text("%s", seqData.label.c_str());
}
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::PushItemWidth(-FLT_MIN); ImGui::PushItemWidth(-FLT_MIN);
const int initialValue = map.contains(currentValue) ? currentValue : defaultValue; const int initialValue = map.contains(currentValue) ? currentValue : defaultValue;
@@ -501,6 +501,10 @@ void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li
} }
break; break;
} }
case VB_PLAY_BLUE_WARP_CS: {
*should = false;
break;
}
// Spawn clean blue warps (no ruto, adult animation, etc) // Spawn clean blue warps (no ruto, adult animation, etc)
case VB_SPAWN_BLUE_WARP: { case VB_SPAWN_BLUE_WARP: {
switch (gPlayState->sceneNum) { switch (gPlayState->sceneNum) {
@@ -861,7 +861,7 @@ void GenerateItemPool() {
AddItemToMainPool(RG_GERUDO_MEMBERSHIP_CARD); AddItemToMainPool(RG_GERUDO_MEMBERSHIP_CARD);
ctx->possibleIceTrapModels.push_back(RG_GERUDO_MEMBERSHIP_CARD); ctx->possibleIceTrapModels.push_back(RG_GERUDO_MEMBERSHIP_CARD);
} else if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { } else if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) {
AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); AddItemToPool(ItemPool, RG_GERUDO_MEMBERSHIP_CARD);
ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_ICE_TRAP, false, true); ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_ICE_TRAP, false, true);
} else { } else {
ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, false, true); ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, false, true);
+5 -1
View File
@@ -161,12 +161,16 @@ bool Context::IsQuestOfLocationActive(RandomizerCheck rc) {
void Context::GenerateLocationPool() { void Context::GenerateLocationPool() {
allLocations.clear(); allLocations.clear();
overworldLocations.clear();
for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) {
dungeon->locations.clear();
}
for (Location& location : StaticData::GetLocationTable()) { for (Location& location : StaticData::GetLocationTable()) {
// skip RCs that shouldn't be in the pool for any reason (i.e. settings, unsupported check type, etc.) // skip RCs that shouldn't be in the pool for any reason (i.e. settings, unsupported check type, etc.)
// TODO: Exclude checks for some of the older shuffles from the pool too i.e. Frog Songs, Scrubs, etc.) // TODO: Exclude checks for some of the older shuffles from the pool too i.e. Frog Songs, Scrubs, etc.)
if (location.GetRandomizerCheck() == RC_UNKNOWN_CHECK || if (location.GetRandomizerCheck() == RC_UNKNOWN_CHECK ||
location.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || // already in pool location.GetRandomizerCheck() == RC_TRIFORCE_COMPLETED || // already in pool
(location.GetRandomizerCheck() == RC_MASTER_SWORD_PEDESTAL && (location.GetRandomizerCheck() == RC_TOT_MASTER_SWORD &&
mOptions[RSK_SHUFFLE_MASTER_SWORD].Is(RO_GENERIC_OFF)) || mOptions[RSK_SHUFFLE_MASTER_SWORD].Is(RO_GENERIC_OFF)) ||
(location.GetRandomizerCheck() == RC_KAK_100_GOLD_SKULLTULA_REWARD && (location.GetRandomizerCheck() == RC_KAK_100_GOLD_SKULLTULA_REWARD &&
mOptions[RSK_SHUFFLE_100_GS_REWARD].Is(RO_GENERIC_OFF)) || mOptions[RSK_SHUFFLE_100_GS_REWARD].Is(RO_GENERIC_OFF)) ||
@@ -1,4 +1,4 @@
#include <libultraship/bridge.h> #include <libultraship/bridge.h>
#include "soh/OTRGlobals.h" #include "soh/OTRGlobals.h"
#include "soh/ResourceManagerHelpers.h" #include "soh/ResourceManagerHelpers.h"
#include "soh/Enhancements/enhancementTypes.h" #include "soh/Enhancements/enhancementTypes.h"
@@ -327,7 +327,10 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
getItemEntry.modIndex == MOD_RANDOMIZER) && getItemEntry.modIndex == MOD_RANDOMIZER) &&
(getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK || (getItemEntry.getItemCategory == ITEM_CATEGORY_JUNK ||
getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN || getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN ||
getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER))))) { getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER ||
// Treat small keys as junk if Skeleton Key is obtained.
(getItemEntry.getItemCategory == ITEM_CATEGORY_SMALL_KEY &&
Flags_GetRandomizerInf(RAND_INF_HAS_SKELETON_KEY))))))) {
Item_DropCollectible(gPlayState, &spawnPos, ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000); Item_DropCollectible(gPlayState, &spawnPos, ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000);
} }
} }
@@ -865,7 +868,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
*should = !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) && LINK_IS_ADULT && *should = !Flags_GetEventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL) && LINK_IS_ADULT &&
gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_KAKARIKO_VILLAGE && gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_KAKARIKO_VILLAGE &&
CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) &&
CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER); CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && gSaveContext.cutsceneIndex < 0xFFF0;
break; break;
case VB_BE_ELIGIBLE_FOR_CHILD_ROLLING_GORON_REWARD: { case VB_BE_ELIGIBLE_FOR_CHILD_ROLLING_GORON_REWARD: {
// Don't require a bomb bag to get prize in rando // Don't require a bomb bag to get prize in rando
@@ -881,7 +884,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
break; break;
} }
case VB_GIVE_ITEM_MASTER_SWORD: case VB_GIVE_ITEM_MASTER_SWORD:
if (RAND_GET_OPTION(RSK_SHUFFLE_MASTER_SWORD)) { if (RAND_GET_OPTION(RSK_SHUFFLE_MASTER_SWORD) || RAND_GET_OPTION(RSK_STARTING_MASTER_SWORD)) {
*should = false; *should = false;
} else { } else {
*should = true; *should = true;
@@ -1023,17 +1026,55 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
} }
if (item00->itemEntry.modIndex == MOD_NONE) { if (item00->itemEntry.modIndex == MOD_NONE) {
std::string message;
switch (gSaveContext.language) {
case LANGUAGE_FRA:
message = "Vous obtenez: ";
break;
case LANGUAGE_GER:
message = "Du erhältst: ";
break;
case LANGUAGE_ENG:
default:
message = "You found ";
break;
}
Notification::Emit({ Notification::Emit({
.itemIcon = GetTextureForItemId(item00->itemEntry.itemId), .itemIcon = GetTextureForItemId(item00->itemEntry.itemId),
.message = "You found ", .message = message,
.suffix = SohUtils::GetItemName(item00->itemEntry.itemId), .suffix = SohUtils::GetItemName(item00->itemEntry.itemId),
}); });
} else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) { } else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) {
std::string message;
std::string itemName;
switch (gSaveContext.language) {
case LANGUAGE_FRA:
message = "Vous obtenez: ";
itemName = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName()
.french;
break;
case LANGUAGE_GER:
message = "Du erhältst: ";
itemName = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName()
.german;
break;
case LANGUAGE_ENG:
default:
message = "You found ";
itemName = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName()
.english;
break;
}
Notification::Emit({ Notification::Emit({
.message = "You found ", .message = message,
.suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId) .suffix = itemName,
.GetName()
.english,
}); });
} }
+1 -1
View File
@@ -2228,7 +2228,7 @@ const std::vector<uint8_t>& GetDungeonSmallKeyDoors(SceneID sceneId) {
} }
} else if (transitionActor.id == ACTOR_DOOR_SHUTTER) { } else if (transitionActor.id == ACTOR_DOOR_SHUTTER) {
uint8_t doorType = (transitionActor.params >> 7) & 15; uint8_t doorType = (transitionActor.params >> 7) & 15;
if (doorType == SHUTTER_BACK_LOCKED || doorType == SHUTTER_BOSS || doorType == SHUTTER_KEY_LOCKED) { if (doorType == SHUTTER_KEY_LOCKED) {
dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F); dungeonSmallKeyDoors[key].emplace_back(transitionActor.params & 0x3F);
} }
} }
@@ -406,6 +406,8 @@ bool Randomizer::SpoilerFileExists(const char* spoilerFileName) {
"The spoiler file located at\n" + std::string(spoilerFileName) + "The spoiler file located at\n" + std::string(spoilerFileName) +
"\nwas made by a version that doesn't match the currently running version.\n" + "\nwas made by a version that doesn't match the currently running version.\n" +
"Loading for this file has been cancelled."); "Loading for this file has been cancelled.");
CVarClear(CVAR_GENERAL("SpoilerLog"));
Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame();
} }
// Update cache // Update cache
@@ -2609,7 +2609,6 @@ typedef enum {
RC_PIERRE, RC_PIERRE,
RC_DELIVER_RUTOS_LETTER, RC_DELIVER_RUTOS_LETTER,
RC_MASTER_SWORD_PEDESTAL,
RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE,
RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE,
RC_KF_GOSSIP_STONE, RC_KF_GOSSIP_STONE,
@@ -4902,7 +4901,6 @@ typedef enum {
RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT,
RHT_GANONS_TOWER_BOSS_KEY_CHEST, RHT_GANONS_TOWER_BOSS_KEY_CHEST,
RHT_DELIVER_RUTOS_LETTER, RHT_DELIVER_RUTOS_LETTER,
RHT_MASTER_SWORD_PEDESTAL,
// Beehives // Beehives
RHT_BEEHIVE_CHEST_GROTTO, RHT_BEEHIVE_CHEST_GROTTO,
RHT_BEEHIVE_COW_GROTTO, RHT_BEEHIVE_COW_GROTTO,
@@ -2199,8 +2199,8 @@ void CheckTrackerSettingsWindow::DrawElement() {
"Checks that you saved the game while having collected.", THEME_COLOR); "Checks that you saved the game while having collected.", THEME_COLOR);
ImGui::PopStyleVar(1); ImGui::PopStyleVar(1);
ImGui::EndTable();
} }
ImGui::EndTable();
} }
void CheckTrackerWindow::InitElement() { void CheckTrackerWindow::InitElement() {
@@ -1713,245 +1713,156 @@ static std::unordered_map<int32_t, const char*> minimalDisplayTypes = {
void ItemTrackerSettingsWindow::DrawElement() { void ItemTrackerSettingsWindow::DrawElement() {
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f }); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, { 8.0f, 8.0f });
ImGui::BeginTable("itemTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV); if (ImGui::BeginTable("itemTrackerSettingsTable", 2, ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV)) {
ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::TableSetupColumn("General settings", ImGuiTableColumnFlags_WidthStretch, 200.0f);
ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f); ImGui::TableSetupColumn("Section settings", ImGuiTableColumnFlags_WidthStretch, 200.0f);
ImGui::TableHeadersRow(); ImGui::TableHeadersRow();
ImGui::TableNextRow(); ImGui::TableNextRow();
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x);
CVarColorPicker("Background Color##gItemTrackerBgColor", CVAR_TRACKER_ITEM("BgColor"), { 0, 0, 0, 0 }, true, CVarColorPicker("Background Color##gItemTrackerBgColor", CVAR_TRACKER_ITEM("BgColor"), { 0, 0, 0, 0 }, true,
ColorPickerRandomButton | ColorPickerResetButton, THEME_COLOR); ColorPickerRandomButton | ColorPickerResetButton, THEME_COLOR);
ImGui::PopItemWidth(); ImGui::PopItemWidth();
if (CVarCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes, if (CVarCombobox("Window Type", CVAR_TRACKER_ITEM("WindowType"), windowTypes,
ComboboxOptions()
.DefaultIndex(TRACKER_WINDOW_FLOATING)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) {
if (CVarCheckbox("Enable Dragging", CVAR_TRACKER_ITEM("Draggable"), CheckboxOptions().Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCheckbox("Only enable while paused", CVAR_TRACKER_ITEM("ShowOnlyPaused"),
CheckboxOptions().Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes,
ComboboxOptions() ComboboxOptions()
.DefaultIndex(TRACKER_DISPLAY_ALWAYS) .DefaultIndex(TRACKER_WINDOW_FLOATING)
.ComponentAlignment(ComponentAlignments::Right) .ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far) .LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) { .Color(THEME_COLOR))) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) ==
TRACKER_DISPLAY_COMBO_BUTTON) { if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) {
if (CVarCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons, if (CVarCheckbox("Enable Dragging", CVAR_TRACKER_ITEM("Draggable"), CheckboxOptions().Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCheckbox("Only enable while paused", CVAR_TRACKER_ITEM("ShowOnlyPaused"),
CheckboxOptions().Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Display Mode", CVAR_TRACKER_ITEM("DisplayType.Main"), displayModes,
ComboboxOptions() ComboboxOptions()
.DefaultIndex(TRACKER_COMBO_BUTTON_L) .DefaultIndex(TRACKER_DISPLAY_ALWAYS)
.ComponentAlignment(ComponentAlignments::Right) .ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far) .LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) { .Color(THEME_COLOR))) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (CVarCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons, if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) ==
ComboboxOptions() TRACKER_DISPLAY_COMBO_BUTTON) {
.DefaultIndex(TRACKER_COMBO_BUTTON_R) if (CVarCombobox("Combo Button 1", CVAR_TRACKER_ITEM("ComboButton1"), buttons,
.ComponentAlignment(ComponentAlignments::Right) ComboboxOptions()
.LabelPosition(LabelPositions::Far) .DefaultIndex(TRACKER_COMBO_BUTTON_L)
.Color(THEME_COLOR))) { .ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Combo Button 2", CVAR_TRACKER_ITEM("ComboButton2"), buttons,
ComboboxOptions()
.DefaultIndex(TRACKER_COMBO_BUTTON_R)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
}
}
ImGui::Separator();
CVarSliderInt("Icon size : %dpx", CVAR_TRACKER_ITEM("IconSize"),
IntSliderOptions().Min(25).Max(128).DefaultValue(36).Color(THEME_COLOR));
CVarSliderInt("Icon margins : %dpx", CVAR_TRACKER_ITEM("IconSpacing"),
IntSliderOptions().Min(-5).Max(50).DefaultValue(12).Color(THEME_COLOR));
CVarSliderInt("Text size : %dpx", CVAR_TRACKER_ITEM("TextSize"),
IntSliderOptions().Min(1).Max(30).DefaultValue(13).Color(THEME_COLOR));
ImGui::NewLine();
CVarCombobox("Ammo/Capacity Tracking", CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions,
ComboboxOptions()
.DefaultIndex(ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY)
.ComponentAlignment(ComponentAlignments::Left)
.LabelPosition(LabelPositions::Above)
.Color(THEME_COLOR)
.Tooltip("Customize what the numbers under each item are tracking."
"\n\nNote: items without capacity upgrades will track ammo even in capacity mode"));
if (CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) ==
ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY ||
CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) ==
ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) {
if (CVarCheckbox("Align count to left side", CVAR_TRACKER_ITEM("ItemCountAlignLeft"),
CheckboxOptions().Color(THEME_COLOR))) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} }
}
ImGui::Separator();
CVarSliderInt("Icon size : %dpx", CVAR_TRACKER_ITEM("IconSize"),
IntSliderOptions().Min(25).Max(128).DefaultValue(36).Color(THEME_COLOR));
CVarSliderInt("Icon margins : %dpx", CVAR_TRACKER_ITEM("IconSpacing"),
IntSliderOptions().Min(-5).Max(50).DefaultValue(12).Color(THEME_COLOR));
CVarSliderInt("Text size : %dpx", CVAR_TRACKER_ITEM("TextSize"),
IntSliderOptions().Min(1).Max(30).DefaultValue(13).Color(THEME_COLOR));
ImGui::NewLine(); CVarCombobox("Key Count Tracking", CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions,
CVarCombobox("Ammo/Capacity Tracking", CVAR_TRACKER_ITEM("ItemCountType"), itemTrackerCapacityTrackOptions, ComboboxOptions()
ComboboxOptions() .DefaultIndex(KEYS_COLLECTED_MAX)
.DefaultIndex(ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) .ComponentAlignment(ComponentAlignments::Left)
.ComponentAlignment(ComponentAlignments::Left) .LabelPosition(LabelPositions::Above)
.LabelPosition(LabelPositions::Above) .Color(THEME_COLOR)
.Color(THEME_COLOR) .Tooltip("Customize what numbers are shown for key tracking."));
.Tooltip("Customize what the numbers under each item are tracking."
"\n\nNote: items without capacity upgrades will track ammo even in capacity mode")); CVarCombobox("Triforce Piece Count Tracking", CVAR_TRACKER_ITEM("TriforcePieceCounts"),
if (CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == itemTrackerTriforcePieceTrackOptions,
ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || ComboboxOptions()
CVarGetInteger(CVAR_TRACKER_ITEM("ItemCountType"), ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == .DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX)
ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) { .ComponentAlignment(ComponentAlignments::Left)
if (CVarCheckbox("Align count to left side", CVAR_TRACKER_ITEM("ItemCountAlignLeft"), .LabelPosition(LabelPositions::Above)
CheckboxOptions().Color(THEME_COLOR))) { .Color(THEME_COLOR)
.Tooltip("Customize what numbers are shown for triforce piece tracking."));
ImGui::TableNextColumn();
if (CVarCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} if (CVarCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes,
ComboboxOptions()
CVarCombobox("Key Count Tracking", CVAR_TRACKER_ITEM("KeyCounts"), itemTrackerKeyTrackOptions, .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
ComboboxOptions() .ComponentAlignment(ComponentAlignments::Right)
.DefaultIndex(KEYS_COLLECTED_MAX) .LabelPosition(LabelPositions::Far)
.ComponentAlignment(ComponentAlignments::Left) .Color(THEME_COLOR))) {
.LabelPosition(LabelPositions::Above)
.Color(THEME_COLOR)
.Tooltip("Customize what numbers are shown for key tracking."));
CVarCombobox("Triforce Piece Count Tracking", CVAR_TRACKER_ITEM("TriforcePieceCounts"),
itemTrackerTriforcePieceTrackOptions,
ComboboxOptions()
.DefaultIndex(TRIFORCE_PIECE_COLLECTED_REQUIRED_MAX)
.ComponentAlignment(ComponentAlignments::Left)
.LabelPosition(LabelPositions::Above)
.Color(THEME_COLOR)
.Tooltip("Customize what numbers are shown for triforce piece tracking."));
ImGui::TableNextColumn();
if (CVarCombobox("Inventory", CVAR_TRACKER_ITEM("DisplayType.Inventory"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Equipment", CVAR_TRACKER_ITEM("DisplayType.Equipment"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) ==
SECTION_DISPLAY_SEPARATE) {
if (CVarCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"),
CheckboxOptions().DefaultValue(false).Color(THEME_COLOR))) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} if (CVarCombobox("Misc", CVAR_TRACKER_ITEM("DisplayType.Misc"), displayTypes,
if (CVarCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes, ComboboxOptions()
ComboboxOptions() .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
.DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW) .ComponentAlignment(ComponentAlignments::Right)
.ComponentAlignment(ComponentAlignments::Right) .LabelPosition(LabelPositions::Far)
.LabelPosition(LabelPositions::Far) .Color(THEME_COLOR))) {
.Color(THEME_COLOR))) { shouldUpdateVectors = true;
shouldUpdateVectors = true; }
} if (CVarCombobox("Dungeon Rewards", CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), displayTypes,
if (CVarCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes, ComboboxOptions()
ComboboxOptions() .DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
.DefaultIndex(SECTION_DISPLAY_HIDDEN) .ComponentAlignment(ComponentAlignments::Right)
.ComponentAlignment(ComponentAlignments::Right) .LabelPosition(LabelPositions::Far)
.LabelPosition(LabelPositions::Far) .Color(THEME_COLOR))) {
.Color(THEME_COLOR))) { shouldUpdateVectors = true;
shouldUpdateVectors = true; }
} if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonRewards"), SECTION_DISPLAY_MAIN_WINDOW) ==
if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) !=
SECTION_DISPLAY_HIDDEN) {
if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) ==
SECTION_DISPLAY_SEPARATE) { SECTION_DISPLAY_SEPARATE) {
if (CVarCheckbox("Horizontal display", CVAR_TRACKER_ITEM("DungeonItems.Layout"), if (CVarCheckbox("Circle display", CVAR_TRACKER_ITEM("DungeonRewardsLayout"),
CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { CheckboxOptions().DefaultValue(false).Color(THEME_COLOR))) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} }
if (CVarCheckbox("Maps and compasses", CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"), if (CVarCombobox("Songs", CVAR_TRACKER_ITEM("DisplayType.Songs"), displayTypes,
CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) { ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_MAIN_WINDOW)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} if (CVarCombobox("Dungeon Items", CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), displayTypes,
if (CVarCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Overworld Keys", CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_MINIMAL_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW ||
(CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING &&
CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) !=
TRACKER_DISPLAY_COMBO_BUTTON)) {
if (CVarCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes,
ComboboxOptions() ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN) .DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right) .ComponentAlignment(ComponentAlignments::Right)
@@ -1959,14 +1870,104 @@ void ItemTrackerSettingsWindow::DrawElement() {
.Color(THEME_COLOR))) { .Color(THEME_COLOR))) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) !=
CVarCheckbox("Show Hookshot Identifiers", CVAR_TRACKER_ITEM("HookshotIdentifier"), SECTION_DISPLAY_HIDDEN) {
CheckboxOptions() if (CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.DungeonItems"), SECTION_DISPLAY_HIDDEN) ==
.Tooltip("Shows an 'H' or an 'L' to more easiely distinguish between Hookshot and Longshot.") SECTION_DISPLAY_SEPARATE) {
.Color(THEME_COLOR)); if (CVarCheckbox("Horizontal display", CVAR_TRACKER_ITEM("DungeonItems.Layout"),
CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
}
if (CVarCheckbox("Maps and compasses", CVAR_TRACKER_ITEM("DungeonItems.DisplayMaps"),
CheckboxOptions().DefaultValue(true).Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
}
if (CVarCombobox("Greg", CVAR_TRACKER_ITEM("DisplayType.Greg"), extendedDisplayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
ImGui::PopStyleVar(1); if (CVarCombobox("Triforce Pieces", CVAR_TRACKER_ITEM("DisplayType.TriforcePieces"), displayTypes,
ImGui::EndTable(); ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Boss Souls", CVAR_TRACKER_ITEM("DisplayType.BossSouls"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Ocarina Buttons", CVAR_TRACKER_ITEM("DisplayType.OcarinaButtons"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Overworld Keys", CVAR_TRACKER_ITEM("DisplayType.OverworldKeys"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Fishing Pole", CVAR_TRACKER_ITEM("DisplayType.FishingPole"), extendedDisplayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_EXTENDED_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarCombobox("Total Checks", "gTrackers.ItemTracker.TotalChecks.DisplayType", minimalDisplayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_MINIMAL_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
if (CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW ||
(CVarGetInteger(CVAR_TRACKER_ITEM("WindowType"), TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING &&
CVarGetInteger(CVAR_TRACKER_ITEM("DisplayType.Main"), TRACKER_DISPLAY_ALWAYS) !=
TRACKER_DISPLAY_COMBO_BUTTON)) {
if (CVarCombobox("Personal notes", CVAR_TRACKER_ITEM("DisplayType.Notes"), displayTypes,
ComboboxOptions()
.DefaultIndex(SECTION_DISPLAY_HIDDEN)
.ComponentAlignment(ComponentAlignments::Right)
.LabelPosition(LabelPositions::Far)
.Color(THEME_COLOR))) {
shouldUpdateVectors = true;
}
}
CVarCheckbox("Show Hookshot Identifiers", CVAR_TRACKER_ITEM("HookshotIdentifier"),
CheckboxOptions()
.Tooltip("Shows an 'H' or an 'L' to more easiely distinguish between Hookshot and Longshot.")
.Color(THEME_COLOR));
ImGui::PopStyleVar(1);
ImGui::EndTable();
}
} }
void ItemTrackerWindow::InitElement() { void ItemTrackerWindow::InitElement() {
+1 -1
View File
@@ -2571,7 +2571,7 @@ void Context::FinalizeSettings(const std::set<RandomizerCheck>& excludedLocation
} }
if (!mOptions[RSK_SHUFFLE_MASTER_SWORD]) { if (!mOptions[RSK_SHUFFLE_MASTER_SWORD]) {
if (mOptions[RSK_STARTING_MASTER_SWORD]) { if (mOptions[RSK_STARTING_MASTER_SWORD]) {
this->GetItemLocation(RC_MASTER_SWORD_PEDESTAL)->SetExcludedOption(1); this->GetItemLocation(RC_TOT_MASTER_SWORD)->SetExcludedOption(1);
} }
} }
if (!mOptions[RSK_SHUFFLE_OCARINA]) { if (!mOptions[RSK_SHUFFLE_OCARINA]) {
@@ -1,6 +1,5 @@
#include <libultraship/bridge.h> #include <libultraship/bridge.h>
#include "soh/OTRGlobals.h" #include "soh/OTRGlobals.h"
#include "soh/Enhancements/randomizer/randomizerTypes.h"
#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/Enhancements/enhancementTypes.h" #include "soh/Enhancements/enhancementTypes.h"
@@ -165,7 +164,7 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li
*should = false; *should = false;
} }
u8 meetsBurningKakRequirements = LINK_IS_ADULT && u8 meetsBurningKakRequirements = LINK_IS_ADULT && gSaveContext.cutsceneIndex < 0xFFF0 &&
gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE && gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE &&
Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) && Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP) &&
Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP) && Flags_GetEventChkInf(EVENTCHKINF_USED_FIRE_TEMPLE_BLUE_WARP) &&
@@ -301,9 +300,10 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li
} }
switch (actor->id) { switch (actor->id) {
case ACTOR_OBJ_SWITCH: { case ACTOR_OBJ_SWITCH: {
if ((actor->params == 8224 && gPlayState->sceneNum == SCENE_DODONGOS_CAVERN) || if (((actor->params == 8224 && gPlayState->sceneNum == SCENE_DODONGOS_CAVERN) ||
(actor->params == 6979 && gPlayState->sceneNum == SCENE_WATER_TEMPLE) && (actor->params == 6979 && gPlayState->sceneNum == SCENE_WATER_TEMPLE) ||
CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding"), 0)) { (actor->params == 8961 && gPlayState->sceneNum == SCENE_SPIRIT_TEMPLE)) &&
CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding"), 0)) {
break; break;
} }
ObjSwitch* switchActor = (ObjSwitch*)actor; ObjSwitch* switchActor = (ObjSwitch*)actor;
@@ -341,6 +341,16 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li
*should = false; *should = false;
break; break;
} }
case ACTOR_EN_BOX: {
if (actor->params == -30457 && gPlayState->sceneNum == SCENE_JABU_JABU &&
CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding"), 0)) {
break;
}
EnBox* boxActor = (EnBox*)actor;
*should = false;
RateLimitedSuccessChime();
break;
}
case ACTOR_BG_HIDAN_FWBIG: case ACTOR_BG_HIDAN_FWBIG:
case ACTOR_EN_EX_ITEM: case ACTOR_EN_EX_ITEM:
case ACTOR_EN_DNT_NOMAL: case ACTOR_EN_DNT_NOMAL:
@@ -353,7 +363,6 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li
case ACTOR_DOOR_SHUTTER: case ACTOR_DOOR_SHUTTER:
case ACTOR_BG_ICE_SHUTTER: case ACTOR_BG_ICE_SHUTTER:
case ACTOR_OBJ_LIGHTSWITCH: case ACTOR_OBJ_LIGHTSWITCH:
case ACTOR_EN_BOX:
case ACTOR_OBJ_SYOKUDAI: case ACTOR_OBJ_SYOKUDAI:
case ACTOR_OBJ_TIMEBLOCK: case ACTOR_OBJ_TIMEBLOCK:
case ACTOR_EN_PO_SISTERS: case ACTOR_EN_PO_SISTERS:
@@ -941,7 +950,7 @@ void TimeSaverOnActorInitHandler(void* actorRef) {
}); });
} }
if (actor->id == ACTOR_EN_JJ && !IS_RANDO) { if (actor->id == ACTOR_EN_JJ) {
enJjUpdateHook = enJjUpdateHook =
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnActorUpdate>([](void* innerActorRef) mutable { GameInteractor::Instance->RegisterGameHook<GameInteractor::OnActorUpdate>([](void* innerActorRef) mutable {
Actor* innerActor = static_cast<Actor*>(innerActorRef); Actor* innerActor = static_cast<Actor*>(innerActorRef);
@@ -1199,6 +1208,10 @@ void TimeSaverOnSceneInitHandler(int16_t sceneNum) {
static GetItemEntry vanillaQueuedItemEntry = GET_ITEM_NONE; static GetItemEntry vanillaQueuedItemEntry = GET_ITEM_NONE;
void TimeSaverQueueItem(RandomizerGet randoGet) {
vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(randoGet).GetGIEntry_Copy();
}
void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) { void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) {
// Do nothing when in a boss rush // Do nothing when in a boss rush
if (IS_BOSS_RUSH) { if (IS_BOSS_RUSH) {
@@ -1,6 +1,9 @@
#ifndef TIMESAVER_HOOK_HANDLERS_H #ifndef TIMESAVER_HOOK_HANDLERS_H
#define TIMESAVER_HOOK_HANDLERS_H #define TIMESAVER_HOOK_HANDLERS_H
#include "soh/Enhancements/randomizer/randomizerTypes.h"
void TimeSaverRegisterHooks(); void TimeSaverRegisterHooks();
void TimeSaverQueueItem(RandomizerGet randoGet);
#endif // TIMESAVER_HOOK_HANDLERS_H #endif // TIMESAVER_HOOK_HANDLERS_H
@@ -4,6 +4,7 @@
#include "soh/util.h" #include "soh/util.h"
#include <vector> #include <vector>
#include "include/z64item.h" #include "include/z64item.h"
#include "Context.h"
#include <fstream> #include <fstream>
#include <filesystem> #include <filesystem>
@@ -363,7 +364,7 @@ void TimeSplitsSkipSplit(uint32_t index) {
} }
void TimeSplitsFileManagement(uint32_t action, const char* listEntry, std::vector<SplitObject> listData) { void TimeSplitsFileManagement(uint32_t action, const char* listEntry, std::vector<SplitObject> listData) {
std::string filename = "timesplitdata.json"; std::string filename = Ship::Context::GetPathRelativeToAppDirectory("timesplitdata.json");
json saveFile; json saveFile;
json listArray = nlohmann::json::array(); json listArray = nlohmann::json::array();
@@ -948,9 +949,10 @@ void TimeSplitsDrawManageList() {
} }
void InitializeSplitDataFile() { void InitializeSplitDataFile() {
if (!std::filesystem::exists("timesplitdata.json")) { std::string filename = Ship::Context::GetPathRelativeToAppDirectory("timesplitdata.json");
if (!std::filesystem::exists(filename)) {
json j; json j;
std::ofstream file("timesplitdata.json"); std::ofstream file(filename);
file << j.dump(4); file << j.dump(4);
file.close(); file.close();
} }
+3 -1
View File
@@ -1435,7 +1435,9 @@ extern "C" void Graph_StartFrame() {
} }
#endif #endif
case KbScancode::LUS_KB_TAB: { case KbScancode::LUS_KB_TAB: {
CVarSetInteger(CVAR_SETTING("AltAssets"), !CVarGetInteger(CVAR_SETTING("AltAssets"), 0)); if (CVarGetInteger(CVAR_SETTING("Mods.AlternateAssetsHotkey"), 1)) {
CVarSetInteger(CVAR_SETTING("AltAssets"), !CVarGetInteger(CVAR_SETTING("AltAssets"), 0));
}
break; break;
} }
} }
+17 -7
View File
@@ -1111,6 +1111,7 @@ void SaveManager::LoadFile(int fileNum) {
std::ifstream input(fileName); std::ifstream input(fileName);
try { try {
bool deleteRando = false;
saveBlock = nlohmann::json::object(); saveBlock = nlohmann::json::object();
input >> saveBlock; input >> saveBlock;
if (!saveBlock.contains("version")) { if (!saveBlock.contains("version")) {
@@ -1120,21 +1121,24 @@ void SaveManager::LoadFile(int fileNum) {
switch (saveBlock["version"].get<int>()) { switch (saveBlock["version"].get<int>()) {
case 1: case 1:
for (auto& block : saveBlock["sections"].items()) { for (auto& block : saveBlock["sections"].items()) {
bool oldVanilla =
block.value()["data"].empty() || block.value()["data"].contains("aat0") ||
block.value()["data"]["entrances"].empty() ||
SohUtils::IsStringEmpty(saveBlock["sections"]["sohStats"]["data"]["buildVersion"]);
std::string sectionName = block.key(); std::string sectionName = block.key();
if (sectionName == "randomizer") { if (sectionName == "randomizer") {
bool hasStats = saveBlock["sections"].contains("sohStats"); bool hasStats = saveBlock["sections"].contains("sohStats");
if (block.value()["data"].contains("aat0") || !hasStats) { // Rachael rando data if (oldVanilla || !hasStats) { // Vanilla "rando" data
SohGui::RegisterPopup( SohGui::RegisterPopup(
"Loading old file", "Loading old file",
"The file in slot " + std::to_string(fileNum + 1) + "The file in slot " + std::to_string(fileNum + 1) +
" appears to contain randomizer data, but is a very old format.\n" + " appears to contain randomizer data, but is a very old format or is empty.\n" +
"The randomizer data has been removed, and this file will be treated as a vanilla " "The randomizer data has been removed, and this file will be treated as a vanilla "
"file.\n" + "file.\nIf this was a vanilla file, it still is, and you shouldn't see this "
"message again.\n" +
"If this was a randomizer file, the file will not work, and should be deleted."); "If this was a randomizer file, the file will not work, and should be deleted.");
input.close(); deleteRando = true;
saveMtx.unlock(); continue;
SaveFile(fileNum);
return;
} }
s16 major = saveBlock["sections"]["sohStats"]["data"]["buildVersionMajor"]; s16 major = saveBlock["sections"]["sohStats"]["data"]["buildVersionMajor"];
s16 minor = saveBlock["sections"]["sohStats"]["data"]["buildVersionMinor"]; s16 minor = saveBlock["sections"]["sohStats"]["data"]["buildVersionMinor"];
@@ -1201,6 +1205,12 @@ void SaveManager::LoadFile(int fileNum) {
assert(false); assert(false);
break; break;
} }
input.close();
if (deleteRando) {
saveBlock["sections"].erase(saveBlock["sections"].find("randomizer"));
SaveFile(fileNum);
deleteRando = false;
}
InitMeta(fileNum); InitMeta(fileNum);
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnLoadFile>(fileNum); GameInteractor::Instance->ExecuteHooks<GameInteractor::OnLoadFile>(fileNum);
} catch (const std::exception& e) { } catch (const std::exception& e) {
+10 -4
View File
@@ -496,6 +496,7 @@ void Menu::Draw() {
SyncVisibilityConsoleVariable(); SyncVisibilityConsoleVariable();
} }
static bool freshOpen = true;
void Menu::DrawElement() { void Menu::DrawElement() {
for (auto& [reason, info] : disabledMap) { for (auto& [reason, info] : disabledMap) {
info.active = info.evaluation(info); info.active = info.evaluation(info);
@@ -538,6 +539,7 @@ void Menu::DrawElement() {
if (!popout) { if (!popout) {
ImGui::PopStyleVar(); ImGui::PopStyleVar();
} }
freshOpen = true;
ImGui::PopStyleColor(); ImGui::PopStyleColor();
ImGui::End(); ImGui::End();
return; return;
@@ -654,13 +656,13 @@ void Menu::DrawElement() {
std::string menuSearchText = ""; std::string menuSearchText = "";
if (headerSearch) { if (headerSearch) {
ImGui::SameLine(); ImGui::SameLine();
if (autoFocus && ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) && !ImGui::IsAnyItemActive() && if (autoFocus && freshOpen) {
!ImGui::IsMouseClicked(0)) { ImGui::SetKeyboardFocusHere();
ImGui::SetKeyboardFocusHere(0);
} }
auto color = UIWidgets::ColorValues.at(menuThemeIndex); auto color = UIWidgets::ColorValues.at(menuThemeIndex);
color.w = 0.2f; color.w = 0.6f;
ImGui::PushStyleColor(ImGuiCol_FrameBg, color); ImGui::PushStyleColor(ImGuiCol_FrameBg, color);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);
menuSearch.Draw("##search", 200.0f); menuSearch.Draw("##search", 200.0f);
menuSearchText = menuSearch.InputBuf; menuSearchText = menuSearch.InputBuf;
menuSearchText.erase(std::remove(menuSearchText.begin(), menuSearchText.end(), ' '), menuSearchText.end()); menuSearchText.erase(std::remove(menuSearchText.begin(), menuSearchText.end(), ' '), menuSearchText.end());
@@ -668,6 +670,7 @@ void Menu::DrawElement() {
ImGui::SameLine(headerWidth - 200.0f + style.ItemSpacing.x); ImGui::SameLine(headerWidth - 200.0f + style.ItemSpacing.x);
ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "Search..."); ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "Search...");
} }
ImGui::PopStyleVar();
ImGui::PopStyleColor(); ImGui::PopStyleColor();
} }
ImGui::EndChild(); ImGui::EndChild();
@@ -853,6 +856,9 @@ void Menu::DrawElement() {
poppedSize = ImGui::GetWindowSize(); poppedSize = ImGui::GetWindowSize();
poppedPos = ImGui::GetWindowPos(); poppedPos = ImGui::GetWindowPos();
} }
if (freshOpen) {
freshOpen = false;
}
ImGui::End(); ImGui::End();
} }
} // namespace Ship } // namespace Ship
-1
View File
@@ -563,7 +563,6 @@ void UpdateResolutionVars() {
verticalPixelCount = verticalPixelCount =
CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", pixelCountPresets[item_pixelCount]); CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalPixelCount", pixelCountPresets[item_pixelCount]);
// Additional settings // Additional settings
showHorizontalResField = false;
horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX; horizontalPixelCount = (verticalPixelCount / aspectRatioY) * aspectRatioX;
// Disabling flags // Disabling flags
disabled_everything = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0); disabled_everything = !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".Enabled", 0);
+5 -4
View File
@@ -347,10 +347,11 @@ void SohMenu::AddMenuEnhancements() {
.Options(CheckboxOptions().DefaultValue(IS_RANDO)); .Options(CheckboxOptions().DefaultValue(IS_RANDO));
AddWidget(path, "Exclude Glitch-Aiding Cutscenes", WIDGET_CVAR_CHECKBOX) AddWidget(path, "Exclude Glitch-Aiding Cutscenes", WIDGET_CVAR_CHECKBOX)
.CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding")) .CVar(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.GlitchAiding"))
.Options(CheckboxOptions().Tooltip( .Options(
"Don't skip cutscenes that are associated with useful glitches. Currently, it is " CheckboxOptions().Tooltip("Don't skip cutscenes that are associated with useful glitches. Currently, it is "
"only the Fire Temple Darunia CS, Forest Temple Poe Sisters CS, Dodongo Boss " "only the Fire Temple Darunia CS, Forest Temple Poe Sisters CS, Dodongo Boss "
"Door Switch CS, Water Temple Dragon Switch CS, and the Box Skip One Point in Jabu.")); "Door Switch CS, Water Temple Dragon Switch CS, the Box Skip One Point in Jabu, "
"Early Hammer Switch CS in MQ Spirit, and Cow Switch Chest CS in MQ Jabu."));
AddWidget(path, "Text", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Text", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Skip Bottle Pickup Messages", WIDGET_CVAR_CHECKBOX) AddWidget(path, "Skip Bottle Pickup Messages", WIDGET_CVAR_CHECKBOX)
+390 -6
View File
@@ -7,6 +7,7 @@
#include <assert.h> #include <assert.h>
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include "Enhancements/randomizer/randomizerTypes.h" #include "Enhancements/randomizer/randomizerTypes.h"
#include <variables.h>
std::vector<std::string> sceneNames = { std::vector<std::string> sceneNames = {
"Inside the Deku Tree", "Inside the Deku Tree",
@@ -121,7 +122,7 @@ std::vector<std::string> sceneNames = {
"Treasure Chest Room", "Treasure Chest Room",
}; };
std::vector<std::string> itemNames = { std::vector<std::string> itemNamesEng = {
"Deku Stick", "Deku Stick",
"Deku Nut", "Deku Nut",
"Bomb", "Bomb",
@@ -280,7 +281,325 @@ std::vector<std::string> itemNames = {
"Deku Nut Upgrade (40)", "Deku Nut Upgrade (40)",
}; };
std::vector<std::string> questItemNames = { std::vector<std::string> itemNamesFra = {
"Bâton Mojo",
"Noix Mojo",
"Bombe",
"Arc des Fées",
"Flèche de Feu",
"Feu de Din",
"Lance-Pierre des Fées",
"Ocarina des Fées",
"Ocarina du Temps",
"Missile Teigneux",
"Grappin",
"Super Grappin",
"Flèche de Glace",
"Vent de Farore",
"Boomerang",
"Monocle de Vérité",
"Haricot Magique",
"Masse des Titans",
"Flèche de Lumière",
"Amour de Nayru",
"Bouteille Vide",
"Potion Rouge",
"Potion Verte",
"Potion Bleue",
"Fée en Bouteille",
"Poisson",
"Lait Lon Lon et Bouteille",
"Lettre de Ruto",
"Flamme Bleue",
"Insectes",
"Grand Spectre",
"Lait Lon Lon (Demi)",
"Spectre",
"Oeuf Suspect",
"Poule",
"Lettre de Zelda",
"Masque Renard",
"Masque de Mort",
"Masque du Fantôme",
"Capuche de Lapin",
"Masque Goron",
"Masque Zora",
"Masque Gerudo",
"Masque de Vérité",
"ÉPUISÉ",
"Oeuf de Poche",
"Cocotte de Poche",
"Cojiro",
"Champignon Suspect",
"Potion Suspecte",
"Scie du Chasseur",
"Épée Goron (Cassée)",
"Ordonnance",
"Crapaud-qui-louche",
"Super Gouttes",
"Certificat",
"Arc des Fées & Flèche de Feu",
"Arc des Fées & Flèche de Glace",
"Arc des Fées & Flèche de Lumière",
"Épée Kokiri",
"Épée de Légende",
"Lame des Géants & Épée Biggoron",
"Bouclier Mojo",
"Bouclier Hylien",
"Bouclier Miroir",
"Tunique Kokiri",
"Tunique Goron",
"Tunique Zora",
"Bottes Kokiri",
"Bottes de Plomb",
"Bottes des Airs",
"Sac de Graines (30)",
"Sac de Graines (40)",
"Sac de Graines (50)",
"Carquois (30)",
"Grand Carquois (40)",
"Énorme Grand Carquois (50)",
"Sac de Bombes (20)",
"Gros Sac de Bombes (30)",
"Énorme Sac de Bombes (40)",
"Bracelet Goron",
"Gantelets d'Argent",
"Gantelets d'Or",
"Écaille d'Argent",
"Écaille d'Or",
"Lame des Géants (Cassée)",
"Grande Bourse",
"Bourse de Géant",
"Graines Mojo (5)",
"Canne à Pêche",
"Menuet des Bois",
"Boléro du Feu",
"Sérénade de l'Eau",
"Requiem de l'Esprit",
"Nocturne de l'Ombre",
"Prélude de la Lumière",
"Berceuse de Zelda",
"Chant d'Epona",
"Chant de Saria",
"Chant du Soleil",
"Chant du Temps",
"Chant des Tempêtes",
"Médaillon de la Forêt",
"Médaillon du Feu",
"Médaillon de l'Eau",
"Médaillon de l'Esprit",
"Médaillon de l'Ombre",
"Médaillon de la Lumière",
"Émeraude Kokiri",
"Rubis Goron",
"Saphir Zora",
"Pierre de Souffrance",
"Carte Gerudo",
"Symbole de Skulltula d'Or",
"Réceptacle de Coeur",
"Quart de Coeur",
"Clé du Boss",
"Boussole",
"Carte du Donjon",
"Petite Clé",
"Petite Magie",
"Grande Magie",
"Quart de Coeur",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"[Retiré]",
"Lait Lon Lon",
"Coeur",
"Rubis Vert",
"Rubis Bleu",
"Rubis Rouge",
"Rubis Pourpre",
"Énorme Rubis",
"[Retiré]",
"Bâtons Mojo (5)",
"Bâtons Mojo (10)",
"Noix Mojo (5)",
"Noix Mojo (10)",
"Bombes (5)",
"Bombes (10)",
"Bombes (20)",
"Bombes (30)",
"Flèches (Petites)",
"Flèches (Moyennes)",
"Flèches (Grandes)",
"Graines Mojo (30)",
"Missile Teigneux (5)",
"Missile Teigneux (20)",
"Amélioration des Bâtons Mojo (20)",
"Amélioration des Bâtons Mojo (30)",
"Amélioration des Noix Mojo (30)",
"Amélioration des Noix Mojo (40)",
};
std::vector<std::string> itemNamesGer = {
"Deku-Stab",
"Deku-Nuß",
"Bombe",
"Feen-Bogen",
"Feuer-Pfeil",
"Dins Feuerinferno",
"Feen-Schleuder",
"Feen-Okarina",
"Okarina der Zeit",
"Krabbelmine",
"Fanghaken",
"Enterhaken",
"Eis-Pfeil",
"Farores Donnersturm",
"Bumerang",
"Auge der Wahrheit",
"Wundererbse",
"Stahlhammer",
"Licht-Pfeil",
"Nayrus Umarmung",
"Leere Flasche",
"Rotes Elixier",
"Grünes Elixier",
"Blaues Elixier",
"Flasche (Fee)",
"Fisch",
"Flasche (Milch)",
"Rutos Brief",
"Blaues Feuer",
"Käfer",
"Nachtschwärmer",
"Lon Lon-Milch (Halbe Füllung)",
"Irrlicht",
"Seltsames Ei",
"Huhn",
"Zeldas Brief",
"Fuchs-Maske",
"Geister-Maske",
"Schädel-Maske",
"Hasenohren",
"Goronen-Maske",
"Zora-Maske",
"Gerudo-Maske",
"Maske des Wissens",
"AUSVERKAUFT",
"Ei",
"Kiki",
"Henni",
"Schimmelpilz",
"Modertrank",
"Säge",
"Zerbr. Goronen-Schwert",
"Rezept",
"Glotzfrosch",
"Augentropfen",
"Zertifikat",
"Feen-Bogen & Feuer-Pfeil",
"Feen-Bogen & Eis-Pfeil",
"Feen-Bogen & Licht-Pfeil",
"Kokiri-Schwert",
"Master-Schwert",
"Langschwert & Biggoron-Schwert",
"Deku-Schild",
"Hylia-Schild",
"Spiegel-Schild",
"Kokiri-Rüstung",
"Goronen-Rüstung",
"Zora-Rüstung",
"Lederstiefel",
"Eisenstiefel",
"Gleitstiefel",
"Munitionstasche (30)",
"Große Munitionstasche (40)",
"Riesen-Munitionstasche (50)",
"Köcher (30)",
"Großer Köcher (40)",
"Riesenköcher (50)",
"Bombentasche (20)",
"Große Bombentasche (30)",
"Riesen-Bombentasche (40)",
"Goronen-Armband",
"Krafthandschuhe",
"Titanhandschuhe",
"Silberne Schuppe",
"Goldene Schuppe",
"Zerbr. Langschwert",
"Große Börse",
"Riesenbörse",
"Deku-Kerne (5)",
"Angelrute",
"Menuett des Waldes",
"Bolero des Feuers",
"Serenade des Wassers",
"Requiem der Geister",
"Nocturne des Schattens",
"Kantate des Lichts",
"Zeldas Wiegenlied",
"Eponas Lied",
"Salias Lied",
"Hymne der Sonne",
"Hymne der Zeit",
"Hymne des Sturms",
"Amulett des Waldes",
"Amulett des Feuers",
"Amulett des Wassers",
"Amulett der Geister",
"Amulett des Schattens",
"Amulett des Lichts",
"Kokiri-Smaragd",
"Goronen-Rubin",
"Zora-Saphir",
"Stein des Wissens",
"Gerudo-Paß",
"Skulltula-Symbol",
"Herzcontainer",
"Herzteil",
"Master-Schlüssel",
"Kompaß",
"Labyrinth-Karte",
"Kleiner Schlüssel",
"Kleine Magieflasche",
"Große Magieflasche",
"Herzteil",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"[Entfernt]",
"Lon Lon-Milch",
"Herz",
"Grüner Rubin",
"Blauer Rubin",
"Roter Rubin",
"Violetter Rubin",
"Silberner Rubin",
"[Entfernt]",
"Deku-Stäbe (5)",
"Deku-Stäbe (10)",
"Deku-Nüsse (5)",
"Deku-Nüsse (10)",
"Bomben (5)",
"Bomben (10)",
"Bomben (20)",
"Bomben (30)",
"Pfeile (5)",
"Pfeile (10)",
"Pfeile (30)",
"Deku-Kerne (30)",
"Krabbelminen (5)",
"Krabbelminen (20)",
"Deku-Stab-Kapazität (20)",
"Deku-Stab-Kapazität (30)",
"Deku-Nuß-Kapazität (30)",
"Deku-Nuß-Kapazität (40)",
};
std::vector<std::string> questItemNamesEng = {
"Forest Medallion", "Fire Medallion", "Water Medallion", "Spirit Medallion", "Shadow Medallion", "Forest Medallion", "Fire Medallion", "Water Medallion", "Spirit Medallion", "Shadow Medallion",
"Light Medallion", "Minuet of Forest", "Bolero of Fire", "Serenade of Water", "Requiem of Spirit", "Light Medallion", "Minuet of Forest", "Bolero of Fire", "Serenade of Water", "Requiem of Spirit",
"Nocturne of Shadow", "Prelude of Light", "Zelda's Lullaby", "Epona's Song", "Saria's Song", "Nocturne of Shadow", "Prelude of Light", "Zelda's Lullaby", "Epona's Song", "Saria's Song",
@@ -288,6 +607,42 @@ std::vector<std::string> questItemNames = {
"Zora's Sapphire", "Stone of Agony", "Gerudo's Card", "Gold Skulltula Token", "Zora's Sapphire", "Stone of Agony", "Gerudo's Card", "Gold Skulltula Token",
}; };
std::vector<std::string> questItemNamesFra = {
"Médaillon de la Forêt", "Médaillon du Feu", "Médaillon de l'Eau", "Médaillon de l'Esprit",
"Médaillon de l'Ombre", "Médaillon de la Lumière", "Menuet des Bois", "Boléro du Feu",
"Sérénade de l'Eau", "Requiem de l'Esprit", "Nocturne de l'Ombre", "Prélude de la Lumière",
"Berceuse de Zelda", "Chant d'Epona", "Chant de Saria", "Chant du Soleil",
"Chant du Temps", "Chant des Tempêtes", "Émeraude Kokiri", "Rubis Goron",
"Saphir Zora", "Pierre de Souffrance", "Carte Gerudo", "Symbole de Skulltula d'Or",
};
std::vector<std::string> questItemNamesGer = {
"Amulett des Waldes",
"Amulett des Feuers",
"Amulett des Wassers",
"Amulett der Geister",
"Amulett des Schattens",
"Amulett des Lichts",
"Menuett des Waldes",
"Bolero des Feuers",
"Serenade des Wassers",
"Requiem der Geister",
"Nocturne des Schattens",
"Kantate des Lichts",
"Zeldas Wiegenlied",
"Eponas Lied",
"Salias Lied",
"Hymne der Sonne",
"Hymne der Zeit",
"Hymne des Sturms",
"Kokiri-Smaragd",
"Goronen-Rubin",
"Zora-Saphir",
"Stein des Wissens",
"Gerudo-Paß",
"Goldenes Skulltula-Symbol",
};
std::array<std::string, RA_MAX> rcareaPrefixes = { std::array<std::string, RA_MAX> rcareaPrefixes = {
"KF", "KF",
"LW", "LW",
@@ -334,23 +689,52 @@ const std::string& SohUtils::GetSceneName(int32_t scene) {
} }
const std::string& SohUtils::GetItemName(int32_t item) { const std::string& SohUtils::GetItemName(int32_t item) {
if (item > itemNames.size()) { const std::vector<std::string>* currentItemNames = nullptr;
switch (gSaveContext.language) {
case LANGUAGE_FRA:
currentItemNames = &itemNamesFra;
break;
case LANGUAGE_GER:
currentItemNames = &itemNamesGer;
break;
case LANGUAGE_ENG:
default:
currentItemNames = &itemNamesEng;
break;
}
if (item >= currentItemNames->size()) {
SPDLOG_WARN("Passed invalid item id to SohUtils::GetItemName: ({})", item); SPDLOG_WARN("Passed invalid item id to SohUtils::GetItemName: ({})", item);
assert(false); assert(false);
return ""; return "";
} }
return itemNames[item]; return (*currentItemNames)[item];
} }
const std::string& SohUtils::GetQuestItemName(int32_t item) { const std::string& SohUtils::GetQuestItemName(int32_t item) {
if (item > questItemNames.size()) { const std::vector<std::string>* currentQuestItemNames = nullptr;
switch (gSaveContext.language) {
case LANGUAGE_FRA:
currentQuestItemNames = &questItemNamesFra;
break;
case LANGUAGE_GER:
currentQuestItemNames = &questItemNamesGer;
break;
case LANGUAGE_ENG:
default:
currentQuestItemNames = &questItemNamesEng;
break;
}
if (item > questItemNamesEng.size()) {
SPDLOG_WARN("Passed invalid quest item id to SohUtils::GetQuestItemName: ({})", item); SPDLOG_WARN("Passed invalid quest item id to SohUtils::GetQuestItemName: ({})", item);
assert(false); assert(false);
return ""; return "";
} }
return questItemNames[item]; return (*currentQuestItemNames)[item];
} }
const std::string& SohUtils::GetRandomizerCheckAreaPrefix(int32_t rcarea) { const std::string& SohUtils::GetRandomizerCheckAreaPrefix(int32_t rcarea) {
@@ -813,8 +813,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) {
gSaveContext.nextCutsceneIndex = 0; gSaveContext.nextCutsceneIndex = 0;
} }
} else if (play->sceneNum == SCENE_SPIRIT_TEMPLE_BOSS) { } else if (play->sceneNum == SCENE_SPIRIT_TEMPLE_BOSS) {
if (GameInteractor_Should(VB_PLAY_BLUE_WARP_CS, if (GameInteractor_Should(VB_PLAY_BLUE_WARP_CS, !CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT),
!Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE),
RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) { RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) {
Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE); Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE);
if (GameInteractor_Should(VB_GIVE_ITEM_FROM_BLUE_WARP, true, ITEM_MEDALLION_SPIRIT)) { if (GameInteractor_Should(VB_GIVE_ITEM_FROM_BLUE_WARP, true, ITEM_MEDALLION_SPIRIT)) {
@@ -832,8 +831,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) {
gSaveContext.nextCutsceneIndex = 0; gSaveContext.nextCutsceneIndex = 0;
} }
} else if (play->sceneNum == SCENE_SHADOW_TEMPLE_BOSS) { } else if (play->sceneNum == SCENE_SHADOW_TEMPLE_BOSS) {
if (GameInteractor_Should(VB_PLAY_BLUE_WARP_CS, if (GameInteractor_Should(VB_PLAY_BLUE_WARP_CS, !CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW),
!Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE),
RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) { RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) {
Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE); Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE);
if (GameInteractor_Should(VB_GIVE_ITEM_FROM_BLUE_WARP, true, ITEM_MEDALLION_SHADOW)) { if (GameInteractor_Should(VB_GIVE_ITEM_FROM_BLUE_WARP, true, ITEM_MEDALLION_SHADOW)) {
@@ -8,51 +8,6 @@
extern const char* digitTextures[]; extern const char* digitTextures[];
void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) {
Color_RGB8 aButtonColor = { 80, 150, 255 };
if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.Changed"), 0)) {
aButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.AButton.Value"), aButtonColor);
} else if (CVarGetInteger(CVAR_COSMETIC("DefaultColorScheme"), COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
aButtonColor = (Color_RGB8){ 80, 255, 150 };
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_D4, true)) {
aButtonColor = (Color_RGB8){ 191, 191, 191 };
}
Color_RGB8 cButtonsColor = { 255, 255, 50 };
if (CVarGetInteger(CVAR_COSMETIC("HUD.CButtons.Changed"), 0)) {
cButtonsColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor);
}
Color_RGB8 cUpButtonColor = cButtonsColor;
if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.Changed"), 0)) {
cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CUpButton.Value"), cUpButtonColor);
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_D5, true)) {
cUpButtonColor = (Color_RGB8){ 191, 191, 191 };
}
Color_RGB8 cDownButtonColor = cButtonsColor;
if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.Changed"), 0)) {
cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CDownButton.Value"), cDownButtonColor);
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_F4, true)) {
cDownButtonColor = (Color_RGB8){ 191, 191, 191 };
}
Color_RGB8 cLeftButtonColor = cButtonsColor;
if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.Changed"), 0)) {
cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CLeftButton.Value"), cLeftButtonColor);
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_B4, true)) {
cLeftButtonColor = (Color_RGB8){ 191, 191, 191 };
}
Color_RGB8 cRightButtonColor = cButtonsColor;
if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.Changed"), 0)) {
cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CRightButton.Value"), cRightButtonColor);
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_A4, true)) {
cRightButtonColor = (Color_RGB8){ 191, 191, 191 };
}
static s16 D_8082A070[][4] = { static s16 D_8082A070[][4] = {
{ 255, 0, 0, 255 }, { 255, 0, 0, 255 },
@@ -124,22 +79,22 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) {
s16 pad2; s16 pad2;
s16 phi_s0_2; s16 phi_s0_2;
s16 sp208[3]; s16 sp208[3];
if (CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0)) {
if (CHECK_BTN_ALL(input->press.button, BTN_DLEFT)) {
pauseCtx->stickRelX = -35;
} else if (CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)) {
pauseCtx->stickRelX = 35;
} else if (CHECK_BTN_ALL(input->press.button, BTN_DDOWN)) {
pauseCtx->stickRelY = -35;
} else if (CHECK_BTN_ALL(input->press.button, BTN_DUP)) {
pauseCtx->stickRelY = 35;
}
}
OPEN_DISPS(gfxCtx); OPEN_DISPS(gfxCtx);
if (((pauseCtx->unk_1E4 == 0) || (pauseCtx->unk_1E4 == 5) || (pauseCtx->unk_1E4 == 8)) && if (((pauseCtx->unk_1E4 == 0) || (pauseCtx->unk_1E4 == 5) || (pauseCtx->unk_1E4 == 8)) &&
(pauseCtx->pageIndex == PAUSE_QUEST)) { (pauseCtx->pageIndex == PAUSE_QUEST)) {
if (CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0)) {
if (CHECK_BTN_ALL(input->press.button, BTN_DLEFT)) {
pauseCtx->stickRelX = -35;
} else if (CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)) {
pauseCtx->stickRelX = 35;
} else if (CHECK_BTN_ALL(input->press.button, BTN_DDOWN)) {
pauseCtx->stickRelY = -35;
} else if (CHECK_BTN_ALL(input->press.button, BTN_DUP)) {
pauseCtx->stickRelY = 35;
}
}
pauseCtx->cursorColorSet = 0; pauseCtx->cursorColorSet = 0;
if (pauseCtx->cursorSpecialPos == 0) { if (pauseCtx->cursorSpecialPos == 0) {
@@ -516,6 +471,52 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) {
} }
if (pauseCtx->state == 6) { if (pauseCtx->state == 6) {
Color_RGB8 aButtonColor = { 80, 150, 255 };
if (CVarGetInteger(CVAR_COSMETIC("HUD.AButton.Changed"), 0)) {
aButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.AButton.Value"), aButtonColor);
} else if (CVarGetInteger(CVAR_COSMETIC("DefaultColorScheme"), COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
aButtonColor = (Color_RGB8){ 80, 255, 150 };
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_D4, true)) {
aButtonColor = (Color_RGB8){ 191, 191, 191 };
}
Color_RGB8 cButtonsColor = { 255, 255, 50 };
if (CVarGetInteger(CVAR_COSMETIC("HUD.CButtons.Changed"), 0)) {
cButtonsColor = CVarGetColor24(CVAR_COSMETIC("HUD.CButtons.Value"), cButtonsColor);
}
Color_RGB8 cUpButtonColor = cButtonsColor;
if (CVarGetInteger(CVAR_COSMETIC("HUD.CUpButton.Changed"), 0)) {
cUpButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CUpButton.Value"), cUpButtonColor);
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_D5, true)) {
cUpButtonColor = (Color_RGB8){ 191, 191, 191 };
}
Color_RGB8 cDownButtonColor = cButtonsColor;
if (CVarGetInteger(CVAR_COSMETIC("HUD.CDownButton.Changed"), 0)) {
cDownButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CDownButton.Value"), cDownButtonColor);
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_F4, true)) {
cDownButtonColor = (Color_RGB8){ 191, 191, 191 };
}
Color_RGB8 cLeftButtonColor = cButtonsColor;
if (CVarGetInteger(CVAR_COSMETIC("HUD.CLeftButton.Changed"), 0)) {
cLeftButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CLeftButton.Value"), cLeftButtonColor);
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_B4, true)) {
cLeftButtonColor = (Color_RGB8){ 191, 191, 191 };
}
Color_RGB8 cRightButtonColor = cButtonsColor;
if (CVarGetInteger(CVAR_COSMETIC("HUD.CRightButton.Changed"), 0)) {
cRightButtonColor = CVarGetColor24(CVAR_COSMETIC("HUD.CRightButton.Value"), cRightButtonColor);
}
if (!GameInteractor_Should(VB_HAVE_OCARINA_NOTE_A4, true)) {
cRightButtonColor = (Color_RGB8){ 191, 191, 191 };
}
gDPPipeSync(POLY_OPA_DISP++); gDPPipeSync(POLY_OPA_DISP++);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@@ -183,10 +183,6 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
s16 cursorX; s16 cursorX;
s16 cursorY; s16 cursorY;
s16 oldCursorPoint; s16 oldCursorPoint;
bool dpad = (CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CHECK_BTN_ALL(input->cur.button, BTN_CUP));
bool pauseAnyCursor =
(CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_RANDO_ONLY && IS_RANDO) ||
(CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_ALWAYS_ON);
OPEN_DISPS(play->state.gfxCtx); OPEN_DISPS(play->state.gfxCtx);
@@ -204,6 +200,11 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
} }
if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && (pauseCtx->pageIndex == PAUSE_EQUIP)) { if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && (pauseCtx->pageIndex == PAUSE_EQUIP)) {
bool dpad = (CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CHECK_BTN_ALL(input->cur.button, BTN_CUP));
bool pauseAnyCursor =
(CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_RANDO_ONLY && IS_RANDO) ||
(CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_ALWAYS_ON);
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_EQUIP]; oldCursorPoint = pauseCtx->cursorPoint[PAUSE_EQUIP];
pauseCtx->cursorColorSet = 0; pauseCtx->cursorColorSet = 0;
@@ -421,11 +421,6 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
s16 cursorY; s16 cursorY;
s16 oldCursorPoint; s16 oldCursorPoint;
s16 moveCursorResult; s16 moveCursorResult;
bool dpad = (CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CHECK_BTN_ALL(input->cur.button, BTN_CUP));
bool pauseAnyCursor =
pauseCtx->cursorSpecialPos == 0 &&
((CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_RANDO_ONLY && IS_RANDO) ||
(CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_ALWAYS_ON));
OPEN_DISPS(play->state.gfxCtx); OPEN_DISPS(play->state.gfxCtx);
@@ -437,6 +432,12 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
pauseCtx->nameColorSet = 0; pauseCtx->nameColorSet = 0;
if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && (pauseCtx->pageIndex == PAUSE_ITEM)) { if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && (pauseCtx->pageIndex == PAUSE_ITEM)) {
bool dpad = (CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0) && !CHECK_BTN_ALL(input->cur.button, BTN_CUP));
bool pauseAnyCursor =
pauseCtx->cursorSpecialPos == 0 &&
((CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_RANDO_ONLY && IS_RANDO) ||
(CVarGetInteger(CVAR_ENHANCEMENT("PauseAnyCursor"), 0) == PAUSE_ANY_CURSOR_ALWAYS_ON));
moveCursorResult = 0 || IsItemCycling(); moveCursorResult = 0 || IsItemCycling();
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_ITEM]; oldCursorPoint = pauseCtx->cursorPoint[PAUSE_ITEM];
@@ -59,11 +59,11 @@ void KaleidoScope_DrawDungeonMap(PlayState* play, GraphicsContext* gfxCtx) {
s16 stepG; s16 stepG;
s16 stepB; s16 stepB;
u16 rgba16; u16 rgba16;
bool dpad = CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0);
OPEN_DISPS(gfxCtx); OPEN_DISPS(gfxCtx);
if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && (pauseCtx->pageIndex == PAUSE_MAP)) { if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && (pauseCtx->pageIndex == PAUSE_MAP)) {
bool dpad = CVarGetInteger(CVAR_SETTING("DPadOnPause"), 0);
pauseCtx->cursorColorSet = 0; pauseCtx->cursorColorSet = 0;
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_MAP]; oldCursorPoint = pauseCtx->cursorPoint[PAUSE_MAP];