numbers aren't magic (#2976)

* numbers aren't magic

* chest style matches contents

renamed everything except the cvar itself at this point
(waiting for versioned configs for that)

* tracker as part of names

* finish the tracker rename

---------

Co-authored-by: briaguya <briaguya@alice>
This commit is contained in:
briaguya 2023-06-09 17:22:25 -04:00 committed by GitHub
parent e46c60a7a1
commit d69c07cd75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 305 additions and 180 deletions

View File

@ -452,7 +452,7 @@ void InitAudioDevice(void)
return; return;
} }
// Mixing happens on a seperate thread which means we need to synchronize. I'm using a mutex here to make things simple, but may // Mixing happens on a separate thread which means we need to synchronize. I'm using a mutex here to make things simple, but may
// want to look at something a bit smarter later on to keep everything real-time, if that's necessary. // want to look at something a bit smarter later on to keep everything real-time, if that's necessary.
if (ma_mutex_init(&AUDIO.System.lock) != MA_SUCCESS) if (ma_mutex_init(&AUDIO.System.lock) != MA_SUCCESS)
{ {

View File

@ -235,7 +235,7 @@ The CI works via [Github Actions](https://github.com/features/actions) where we
To get this step working on your fork, you'll need to add a machine to your own repository as a self-hosted runner via "Settings > Actions > Runners" in your repository settings. Make sure to add the 'asset-builder' tag to your newly added runner to assign it to run this step. To setup your runner as a service read the docs [here](https://docs.github.com/en/actions/hosting-your-own-runners/configuring-the-self-hosted-runner-application-as-a-service?platform=linux). To get this step working on your fork, you'll need to add a machine to your own repository as a self-hosted runner via "Settings > Actions > Runners" in your repository settings. Make sure to add the 'asset-builder' tag to your newly added runner to assign it to run this step. To setup your runner as a service read the docs [here](https://docs.github.com/en/actions/hosting-your-own-runners/configuring-the-self-hosted-runner-application-as-a-service?platform=linux).
### Runner on Windows ### Runner on Windows
You'll have to enable the ability to run unsigned scripts through PowerShell. To do this, open Powershell as administrator and run `set-executionpolicy remotesigned`. Most dependencies get installed as part of the CI process. You will also need to seperately install 7z and add it to the PATH so `7z` can be run as a command. [Chocolatey](https://chocolatey.org/) or other package managers can be used to install it easily. You'll have to enable the ability to run unsigned scripts through PowerShell. To do this, open Powershell as administrator and run `set-executionpolicy remotesigned`. Most dependencies get installed as part of the CI process. You will also need to separately install 7z and add it to the PATH so `7z` can be run as a command. [Chocolatey](https://chocolatey.org/) or other package managers can be used to install it easily.
### Runner on UNIX systems ### Runner on UNIX systems
If you're on macOS or Linux take a look at `macports-deps.txt` or `apt-deps.txt` to see the dependencies expected to be on your machine. If you're on macOS or Linux take a look at `macports-deps.txt` or `apt-deps.txt` to see the dependencies expected to be on your machine.

View File

@ -1,4 +1,5 @@
#include "CosmeticsEditor.h" #include "CosmeticsEditor.h"
#include "cosmeticsTypes.h"
#include "authenticGfxPatches.h" #include "authenticGfxPatches.h"
#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor.h"
@ -1688,7 +1689,7 @@ void CosmeticsEditorWindow::DrawElement() {
ImGui::Text("Color Scheme"); ImGui::Text("Color Scheme");
ImGui::SameLine(); ImGui::SameLine();
UIWidgets::EnhancementCombobox("gCosmetics.DefaultColorScheme", colorSchemes, 0); UIWidgets::EnhancementCombobox("gCosmetics.DefaultColorScheme", colorSchemes, COLORSCHEME_N64);
UIWidgets::EnhancementCheckbox("Advanced Mode", "gCosmetics.AdvancedMode"); UIWidgets::EnhancementCheckbox("Advanced Mode", "gCosmetics.AdvancedMode");
if (CVarGetInteger("gCosmetics.AdvancedMode", 0)) { if (CVarGetInteger("gCosmetics.AdvancedMode", 0)) {
if (ImGui::Button("Lock All Advanced", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) { if (ImGui::Button("Lock All Advanced", ImVec2(ImGui::GetContentRegionAvail().x / 2, 30.0f))) {

View File

@ -0,0 +1,4 @@
typedef enum {
COLORSCHEME_N64,
COLORSCHEME_GAMECUBE
} DefaultColorScheme;

View File

@ -59,10 +59,10 @@ void ColViewerWindow::DrawElement() {
} }
UIWidgets::EnhancementCheckbox("Enabled", "gColViewerEnabled"); UIWidgets::EnhancementCheckbox("Enabled", "gColViewerEnabled");
UIWidgets::LabeledRightAlignedEnhancementCombobox("Scene", "gColViewerScene", ColRenderSettingNames, 0); UIWidgets::LabeledRightAlignedEnhancementCombobox("Scene", "gColViewerScene", ColRenderSettingNames, COLVIEW_DISABLED);
UIWidgets::LabeledRightAlignedEnhancementCombobox("Bg Actors", "gColViewerBgActors", ColRenderSettingNames, 0); UIWidgets::LabeledRightAlignedEnhancementCombobox("Bg Actors", "gColViewerBgActors", ColRenderSettingNames, COLVIEW_DISABLED);
UIWidgets::LabeledRightAlignedEnhancementCombobox("Col Check", "gColViewerColCheck", ColRenderSettingNames, 0); UIWidgets::LabeledRightAlignedEnhancementCombobox("Col Check", "gColViewerColCheck", ColRenderSettingNames, COLVIEW_DISABLED);
UIWidgets::LabeledRightAlignedEnhancementCombobox("Waterbox", "gColViewerWaterbox", ColRenderSettingNames, 0); UIWidgets::LabeledRightAlignedEnhancementCombobox("Waterbox", "gColViewerWaterbox", ColRenderSettingNames, COLVIEW_DISABLED);
UIWidgets::EnhancementCheckbox("Apply as decal", "gColViewerDecal"); UIWidgets::EnhancementCheckbox("Apply as decal", "gColViewerDecal");
UIWidgets::InsertHelpHoverText("Applies the collision as a decal display. This can be useful if there is z-fighting occuring " UIWidgets::InsertHelpHoverText("Applies the collision as a decal display. This can be useful if there is z-fighting occuring "
@ -428,9 +428,9 @@ void DrawDynapoly(std::vector<Gfx>& dl, CollisionHeader* col, int32_t bgId) {
// Draws the scene // Draws the scene
void DrawSceneCollision() { void DrawSceneCollision() {
ColRenderSetting showSceneColSetting = (ColRenderSetting)CVarGetInteger("gColViewerScene", 0); ColRenderSetting showSceneColSetting = (ColRenderSetting)CVarGetInteger("gColViewerScene", COLVIEW_DISABLED);
if (showSceneColSetting == ColRenderSetting::Disabled || CVarGetInteger("gColViewerEnabled", 0) == 0) { if (showSceneColSetting == ColRenderSetting::Disabled || !CVarGetInteger("gColViewerEnabled", 0)) {
return; return;
} }
@ -443,8 +443,8 @@ void DrawSceneCollision() {
// Draws all Bg Actors // Draws all Bg Actors
void DrawBgActorCollision() { void DrawBgActorCollision() {
ColRenderSetting showBgActorSetting = (ColRenderSetting)CVarGetInteger("gColViewerBgActors", 0); ColRenderSetting showBgActorSetting = (ColRenderSetting)CVarGetInteger("gColViewerBgActors", COLVIEW_DISABLED);
if (showBgActorSetting == ColRenderSetting::Disabled || CVarGetInteger("gColViewerEnabled", 0) == 0) { if (showBgActorSetting == ColRenderSetting::Disabled || !CVarGetInteger("gColViewerEnabled", 0)) {
return; return;
} }
@ -568,8 +568,8 @@ void DrawColCheckList(std::vector<Gfx>& dl, Collider** objects, int32_t count) {
// Draws all Col Check objects // Draws all Col Check objects
void DrawColCheckCollision() { void DrawColCheckCollision() {
ColRenderSetting showColCheckSetting = (ColRenderSetting)CVarGetInteger("gColViewerColCheck", 0); ColRenderSetting showColCheckSetting = (ColRenderSetting)CVarGetInteger("gColViewerColCheck", COLVIEW_DISABLED);
if (showColCheckSetting == ColRenderSetting::Disabled || CVarGetInteger("gColViewerEnabled", 0) == 0) { if (showColCheckSetting == ColRenderSetting::Disabled || !CVarGetInteger("gColViewerEnabled", 0)) {
return; return;
} }
@ -621,8 +621,8 @@ extern "C" f32 zdWaterBoxMinY;
// Draws all waterboxes // Draws all waterboxes
void DrawWaterboxList() { void DrawWaterboxList() {
ColRenderSetting showWaterboxSetting = (ColRenderSetting)CVarGetInteger("gColViewerWaterbox", 0); ColRenderSetting showWaterboxSetting = (ColRenderSetting)CVarGetInteger("gColViewerWaterbox", COLVIEW_DISABLED);
if (showWaterboxSetting == ColRenderSetting::Disabled || CVarGetInteger("gColViewerEnabled", 0) == 0) { if (showWaterboxSetting == ColRenderSetting::Disabled || !CVarGetInteger("gColViewerEnabled", 0)) {
return; return;
} }

View File

@ -7,6 +7,12 @@ extern "C"
#endif #endif
void DrawColViewer(); void DrawColViewer();
typedef enum {
COLVIEW_DISABLED,
COLVIEW_SOLID,
COLVIEW_TRANSPARENT
} ColViewerRenderSetting;
#ifdef __cplusplus #ifdef __cplusplus
class ColViewerWindow : public LUS::GuiWindow { class ColViewerWindow : public LUS::GuiWindow {
public: public:
@ -16,4 +22,5 @@ class ColViewerWindow : public LUS::GuiWindow {
void DrawElement() override; void DrawElement() override;
void UpdateElement() override {}; void UpdateElement() override {};
}; };
#endif #endif

View File

@ -0,0 +1,46 @@
typedef enum {
CSMC_DISABLED,
CSMC_BOTH,
CSMC_TEXTURE,
CSMC_SIZE
} ChestStyleMatchesContentsType;
typedef enum {
BUNNY_HOOD_VANILLA,
BUNNY_HOOD_FAST_AND_JUMP,
BUNNY_HOOD_FAST
} BunnyHoodMode;
typedef enum {
FASTFILE_1,
FASTFILE_2,
FASTFILE_3,
FASTFILE_MAP_SELECT,
FASTFILE_FILE_SELECT
} FastFileSelectTarget;
typedef enum {
AUTOSAVE_OFF,
AUTOSAVE_LOCATION_AND_MAJOR_ITEMS,
AUTOSAVE_LOCATION_AND_ALL_ITEMS,
AUTOSAVE_LOCATION,
AUTOSAVE_MAJOR_ITEMS,
AUTOSAVE_ALL_ITEMS
} AutosaveType;
typedef enum {
ZFIGHT_FIX_DISABLED,
ZFIGHT_FIX_CONSISTENT_VANISH,
ZFIGHT_FIX_NO_VANISH,
} ZFightingFixType;
typedef enum {
BONK_DAMAGE_NONE,
BONK_DAMAGE_QUARTER_HEART,
BONK_DAMAGE_HALF_HEART,
BONK_DAMAGE_1_HEART,
BONK_DAMAGE_2_HEARTS,
BONK_DAMAGE_4_HEARTS,
BONK_DAMAGE_8_HEARTS,
BONK_DAMAGE_OHKO,
} BonkDamage;

View File

@ -87,7 +87,7 @@ bool GameInteractor::CanAddOrTakeAmmo(int16_t amount, int16_t item) {
} }
return true; return true;
} else { } else {
// Seperate checks for beans and bombchus because they don't have capacity upgrades // Separate checks for beans and bombchus because they don't have capacity upgrades
if (INV_CONTENT(item) != item || if (INV_CONTENT(item) != item ||
(amount > 0 && ((item == ITEM_BOMBCHU && AMMO(item) == 50) || (item == ITEM_BEAN && AMMO(item) == 10)))) { (amount > 0 && ((item == ITEM_BOMBCHU && AMMO(item) == 50) || (item == ITEM_BEAN && AMMO(item) == 10)))) {
return false; return false;

View File

@ -3,6 +3,7 @@
#include "soh/Enhancements/cosmetics/CosmeticsEditor.h" #include "soh/Enhancements/cosmetics/CosmeticsEditor.h"
#include "soh/Enhancements/randomizer/3drando/random.hpp" #include "soh/Enhancements/randomizer/3drando/random.hpp"
#include <math.h> #include <math.h>
#include "soh/Enhancements/debugger/colViewer.h"
extern "C" { extern "C" {
#include "variables.h" #include "variables.h"
@ -233,15 +234,15 @@ void GameInteractor::RawAction::SetCollisionViewer(bool active) {
CVarSetInteger("gColViewerDecal", active); CVarSetInteger("gColViewerDecal", active);
if (active) { if (active) {
CVarSetInteger("gColViewerScene", 2); CVarSetInteger("gColViewerScene", COLVIEW_TRANSPARENT);
CVarSetInteger("gColViewerBgActors", 2); CVarSetInteger("gColViewerBgActors", COLVIEW_TRANSPARENT);
CVarSetInteger("gColViewerColCheck", 2); CVarSetInteger("gColViewerColCheck", COLVIEW_TRANSPARENT);
CVarSetInteger("gColViewerWaterbox", 2); CVarSetInteger("gColViewerWaterbox", COLVIEW_TRANSPARENT);
} else { } else {
CVarSetInteger("gColViewerScene", 0); CVarSetInteger("gColViewerScene", COLVIEW_DISABLED);
CVarSetInteger("gColViewerBgActors", 0); CVarSetInteger("gColViewerBgActors", COLVIEW_DISABLED);
CVarSetInteger("gColViewerColCheck", 0); CVarSetInteger("gColViewerColCheck", COLVIEW_DISABLED);
CVarSetInteger("gColViewerWaterbox", 0); CVarSetInteger("gColViewerWaterbox", COLVIEW_DISABLED);
} }
} }

View File

@ -12,6 +12,7 @@ extern "C" {
#include <string> #include <string>
#include <libultraship/bridge.h> #include <libultraship/bridge.h>
#include <libultraship/libultraship.h> #include <libultraship/libultraship.h>
#include "soh/Enhancements/enhancementTypes.h"
extern "C" { extern "C" {
#include <z64.h> #include <z64.h>
@ -544,7 +545,7 @@ void DrawGameplayStatsCountsTab() {
GameplayStatsRow("Sword Swings:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_SWORD_SWINGS])); GameplayStatsRow("Sword Swings:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_SWORD_SWINGS]));
GameplayStatsRow("Steps Taken:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_STEPS])); GameplayStatsRow("Steps Taken:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_STEPS]));
// If using MM Bunny Hood enhancement, show how long it's been equipped (not counting pause time) // If using MM Bunny Hood enhancement, show how long it's been equipped (not counting pause time)
if (CVarGetInteger("gMMBunnyHood", 0) || gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD] > 0) { if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD] > 0) {
GameplayStatsRow("Bunny Hood Time:", formatTimestampGameplayStat(gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD] / 2)); GameplayStatsRow("Bunny Hood Time:", formatTimestampGameplayStat(gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD] / 2));
} }
GameplayStatsRow("Rolls:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_ROLLS])); GameplayStatsRow("Rolls:", formatIntGameplayStat(gSaveContext.sohStats.count[COUNT_ROLLS]));

View File

@ -3,6 +3,7 @@
#include "game-interactor/GameInteractor.h" #include "game-interactor/GameInteractor.h"
#include "tts/tts.h" #include "tts/tts.h"
#include "soh/Enhancements/boss-rush/BossRushTypes.h" #include "soh/Enhancements/boss-rush/BossRushTypes.h"
#include "soh/Enhancements/enhancementTypes.h"
extern "C" { extern "C" {
#include <z64.h> #include <z64.h>
@ -227,13 +228,13 @@ void AutoSave(GetItemEntry itemEntry) {
// Don't autosave in the Chamber of Sages since resuming from that map breaks the game // Don't autosave in the Chamber of Sages since resuming from that map breaks the game
// Don't autosave during the Ganon fight when picking up the Master Sword // Don't autosave during the Ganon fight when picking up the Master Sword
// Don't autosave in grottos since resuming from grottos breaks the game. // Don't autosave in grottos since resuming from grottos breaks the game.
if ((CVarGetInteger("gAutosave", 0) > 0) && (gPlayState != NULL) && (gSaveContext.pendingSale == ITEM_NONE) && if ((CVarGetInteger("gAutosave", AUTOSAVE_OFF) != AUTOSAVE_OFF) && (gPlayState != NULL) && (gSaveContext.pendingSale == ITEM_NONE) &&
(gPlayState->gameplayFrames > 60 && gSaveContext.cutsceneIndex < 0xFFF0) && (gPlayState->sceneNum != SCENE_GANON_DEMO)) { (gPlayState->gameplayFrames > 60 && gSaveContext.cutsceneIndex < 0xFFF0) && (gPlayState->sceneNum != SCENE_GANON_DEMO)) {
if (((CVarGetInteger("gAutosave", 0) == 2) || (CVarGetInteger("gAutosave", 0) == 5)) && (item != ITEM_NONE)) { if (((CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS) || (CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_ALL_ITEMS)) && (item != ITEM_NONE)) {
// Autosave for all items // Autosave for all items
performSave = true; performSave = true;
} else if (((CVarGetInteger("gAutosave", 0) == 1) || (CVarGetInteger("gAutosave", 0) == 4)) && (item != ITEM_NONE)) { } else if (((CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_MAJOR_ITEMS) || (CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_MAJOR_ITEMS)) && (item != ITEM_NONE)) {
// Autosave for major items // Autosave for major items
if (itemEntry.modIndex == 0) { if (itemEntry.modIndex == 0) {
switch (item) { switch (item) {
@ -284,12 +285,16 @@ void AutoSave(GetItemEntry itemEntry) {
} else if (itemEntry.modIndex == 1 && item != RG_ICE_TRAP) { } else if (itemEntry.modIndex == 1 && item != RG_ICE_TRAP) {
performSave = true; performSave = true;
} }
} else if ((CVarGetInteger("gAutosave", 0) > 0 && (CVarGetInteger("gAutosave", 0) < 4))) { } else if (CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_MAJOR_ITEMS ||
CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS ||
CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION) {
performSave = true; performSave = true;
} }
if ((gPlayState->sceneNum == SCENE_YOUSEI_IZUMI_TATE) || (gPlayState->sceneNum == SCENE_KAKUSIANA) || if ((gPlayState->sceneNum == SCENE_YOUSEI_IZUMI_TATE) || (gPlayState->sceneNum == SCENE_KAKUSIANA) ||
(gPlayState->sceneNum == SCENE_KENJYANOMA)) { (gPlayState->sceneNum == SCENE_KENJYANOMA)) {
if ((CVarGetInteger("gAutosave", 0) > 0 && (CVarGetInteger("gAutosave", 0) < 4))) { if (CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_MAJOR_ITEMS ||
CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION_AND_ALL_ITEMS ||
CVarGetInteger("gAutosave", AUTOSAVE_OFF) == AUTOSAVE_LOCATION) {
performSave = false; performSave = false;
return; return;
} }
@ -486,47 +491,44 @@ void RegisterHyperEnemies() {
void RegisterBonkDamage() { void RegisterBonkDamage() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnPlayerBonk>([]() { GameInteractor::Instance->RegisterGameHook<GameInteractor::OnPlayerBonk>([]() {
uint8_t bonkOption = CVarGetInteger("gBonkDamageMul", 0); uint8_t bonkOption = CVarGetInteger("gBonkDamageMul", BONK_DAMAGE_NONE);
if (bonkOption == BONK_DAMAGE_NONE) {
return;
}
if (bonkOption == BONK_DAMAGE_OHKO) {
gSaveContext.health = 0;
return;
}
uint16_t bonkDamage = 0; uint16_t bonkDamage = 0;
switch (bonkOption) { switch (bonkOption) {
// Quarter heart case BONK_DAMAGE_QUARTER_HEART:
case 1:
bonkDamage = 4; bonkDamage = 4;
break; break;
// Half a heart case BONK_DAMAGE_HALF_HEART:
case 2:
bonkDamage = 8; bonkDamage = 8;
break; break;
// Full heart case BONK_DAMAGE_1_HEART:
case 3:
bonkDamage = 16; bonkDamage = 16;
break; break;
// 2 hearts case BONK_DAMAGE_2_HEARTS:
case 4:
bonkDamage = 32; bonkDamage = 32;
break; break;
// 4 hearts case BONK_DAMAGE_4_HEARTS:
case 5:
bonkDamage = 64; bonkDamage = 64;
break; break;
// 8 hearts case BONK_DAMAGE_8_HEARTS:
case 6:
bonkDamage = 128; bonkDamage = 128;
break; break;
case 0:
case 7:
default: default:
break; break;
} }
// OHKO
if (bonkOption == 7) {
gSaveContext.health = 0;
} else if (bonkDamage) {
Health_ChangeBy(gPlayState, -bonkDamage); Health_ChangeBy(gPlayState, -bonkDamage);
// Set invincibility to make Link flash red as a visual damage indicator. // Set invincibility to make Link flash red as a visual damage indicator.
Player* player = GET_PLAYER(gPlayState); Player* player = GET_PLAYER(gPlayState);
player->invincibilityTimer = 28; player->invincibilityTimer = 28;
}
}); });
} }
@ -535,7 +537,7 @@ void UpdateDirtPathFixState(int32_t sceneNum) {
case SCENE_SPOT00: case SCENE_SPOT00:
case SCENE_SPOT04: case SCENE_SPOT04:
case SCENE_SPOT15: case SCENE_SPOT15:
CVarSetInteger("gDirtPathFix", CVarGetInteger("gSceneSpecificDirtPathFix", 0)); CVarSetInteger("gDirtPathFix", CVarGetInteger("gSceneSpecificDirtPathFix", ZFIGHT_FIX_DISABLED));
return; return;
default: default:
CVarClear("gDirtPathFix"); CVarClear("gDirtPathFix");

View File

@ -5,6 +5,7 @@
#include <variant> #include <variant>
#include <cstdint> #include <cstdint>
#include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/randomizer/randomizerTypes.h"
#include "soh/Enhancements/enhancementTypes.h"
enum PresetEntryType { enum PresetEntryType {
PRESET_ENTRY_TYPE_S32, PRESET_ENTRY_TYPE_S32,
@ -537,7 +538,7 @@ const std::vector<PresetEntry> enhancedPresetEntries = {
// No Skulltula Freeze // No Skulltula Freeze
PRESET_ENTRY_S32("gSkulltulaFreeze", 1), PRESET_ENTRY_S32("gSkulltulaFreeze", 1),
// MM Bunny Hood // MM Bunny Hood
PRESET_ENTRY_S32("gMMBunnyHood", 1), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST_AND_JUMP),
// Fast Chests // Fast Chests
PRESET_ENTRY_S32("gFastChests", 1), PRESET_ENTRY_S32("gFastChests", 1),
// Fast Drops // Fast Drops
@ -579,7 +580,7 @@ const std::vector<PresetEntry> enhancedPresetEntries = {
PRESET_ENTRY_S32("gAnubisFix", 1), PRESET_ENTRY_S32("gAnubisFix", 1),
// Autosave // Autosave
PRESET_ENTRY_S32("gAutosave", 1), PRESET_ENTRY_S32("gAutosave", AUTOSAVE_LOCATION_AND_MAJOR_ITEMS),
}; };
const std::vector<PresetEntry> randomizerPresetEntries = { const std::vector<PresetEntry> randomizerPresetEntries = {
@ -657,7 +658,7 @@ const std::vector<PresetEntry> randomizerPresetEntries = {
// No Skulltula Freeze // No Skulltula Freeze
PRESET_ENTRY_S32("gSkulltulaFreeze", 1), PRESET_ENTRY_S32("gSkulltulaFreeze", 1),
// MM Bunny Hood // MM Bunny Hood
PRESET_ENTRY_S32("gMMBunnyHood", 1), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST_AND_JUMP),
// Fast Chests // Fast Chests
PRESET_ENTRY_S32("gFastChests", 1), PRESET_ENTRY_S32("gFastChests", 1),
// Fast Drops // Fast Drops
@ -701,7 +702,7 @@ const std::vector<PresetEntry> randomizerPresetEntries = {
PRESET_ENTRY_S32("gAnubisFix", 1), PRESET_ENTRY_S32("gAnubisFix", 1),
// Autosave // Autosave
PRESET_ENTRY_S32("gAutosave", 1), PRESET_ENTRY_S32("gAutosave", AUTOSAVE_LOCATION_AND_MAJOR_ITEMS),
// Customize Fishing Behaviour // Customize Fishing Behaviour
PRESET_ENTRY_S32("gCustomizeFishing", 1), PRESET_ENTRY_S32("gCustomizeFishing", 1),
@ -721,7 +722,7 @@ const std::vector<PresetEntry> randomizerPresetEntries = {
// Pull out Ocarina to Summon Scarecrow // Pull out Ocarina to Summon Scarecrow
PRESET_ENTRY_S32("gSkipScarecrow", 1), PRESET_ENTRY_S32("gSkipScarecrow", 1),
// Chest size & texture matches contents // Chest size & texture matches contents
PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", 1), PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", CSMC_BOTH),
// Pause link animation (0 to 16) // Pause link animation (0 to 16)
PRESET_ENTRY_S32("gPauseLiveLink", 16), PRESET_ENTRY_S32("gPauseLiveLink", 16),
@ -734,9 +735,9 @@ const std::vector<PresetEntry> randomizerPresetEntries = {
}; };
const std::vector<PresetEntry> s6PresetEntries = { const std::vector<PresetEntry> s6PresetEntries = {
PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", 1), PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", CSMC_BOTH),
PRESET_ENTRY_S32("gFastChests", 1), PRESET_ENTRY_S32("gFastChests", 1),
PRESET_ENTRY_S32("gMMBunnyHood", 2), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST),
PRESET_ENTRY_S32("gRandomizeBigPoeTargetCount", 1), PRESET_ENTRY_S32("gRandomizeBigPoeTargetCount", 1),
PRESET_ENTRY_S32("gRandomizeCuccosToReturn", 4), PRESET_ENTRY_S32("gRandomizeCuccosToReturn", 4),
PRESET_ENTRY_S32("gRandomizeDoorOfTime", RO_DOOROFTIME_OPEN), PRESET_ENTRY_S32("gRandomizeDoorOfTime", RO_DOOROFTIME_OPEN),
@ -767,9 +768,9 @@ const std::vector<PresetEntry> s6PresetEntries = {
}; };
const std::vector<PresetEntry> hellModePresetEntries = { const std::vector<PresetEntry> hellModePresetEntries = {
PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", 1), PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", CSMC_BOTH),
PRESET_ENTRY_S32("gFastChests", 1), PRESET_ENTRY_S32("gFastChests", 1),
PRESET_ENTRY_S32("gMMBunnyHood", 2), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST),
PRESET_ENTRY_S32("gRandomizeBigPoeTargetCount", 1), PRESET_ENTRY_S32("gRandomizeBigPoeTargetCount", 1),
PRESET_ENTRY_S32("gRandomizeBlueFireArrows", 1), PRESET_ENTRY_S32("gRandomizeBlueFireArrows", 1),
PRESET_ENTRY_S32("gRandomizeBossKeysanity", RO_DUNGEON_ITEM_LOC_ANYWHERE), PRESET_ENTRY_S32("gRandomizeBossKeysanity", RO_DUNGEON_ITEM_LOC_ANYWHERE),

View File

@ -1764,3 +1764,30 @@ typedef struct CowIdentity {
RandomizerInf randomizerInf; RandomizerInf randomizerInf;
RandomizerCheck randomizerCheck; RandomizerCheck randomizerCheck;
} CowIdentity; } CowIdentity;
typedef enum {
TRACKER_WINDOW_FLOATING,
TRACKER_WINDOW_WINDOW
} TrackerWindowType;
typedef enum {
TRACKER_DISPLAY_ALWAYS,
TRACKER_DISPLAY_COMBO_BUTTON
} TrackerDisplayType;
typedef enum {
TRACKER_COMBO_BUTTON_A,
TRACKER_COMBO_BUTTON_B,
TRACKER_COMBO_BUTTON_C_UP,
TRACKER_COMBO_BUTTON_C_DOWN,
TRACKER_COMBO_BUTTON_C_LEFT,
TRACKER_COMBO_BUTTON_C_RIGHT,
TRACKER_COMBO_BUTTON_L,
TRACKER_COMBO_BUTTON_Z,
TRACKER_COMBO_BUTTON_R,
TRACKER_COMBO_BUTTON_START,
TRACKER_COMBO_BUTTON_D_UP,
TRACKER_COMBO_BUTTON_D_DOWN,
TRACKER_COMBO_BUTTON_D_LEFT,
TRACKER_COMBO_BUTTON_D_RIGHT,
} TrackerComboButton;

View File

@ -8,6 +8,7 @@
#include <libultraship/libultraship.h> #include <libultraship/libultraship.h>
#include "3drando/item_location.hpp" #include "3drando/item_location.hpp"
#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "randomizerTypes.h"
extern "C" { extern "C" {
@ -118,22 +119,23 @@ void CheckTrackerWindow::DrawElement() {
return; return;
} }
if (CVarGetInteger("gCheckTrackerWindowType", 1) == 0) { if (CVarGetInteger("gCheckTrackerWindowType", TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) {
if (CVarGetInteger("gCheckTrackerShowOnlyPaused", 0) == 1) if (CVarGetInteger("gCheckTrackerShowOnlyPaused", 0) && (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)) {
if (gPlayState == nullptr || gPlayState->pauseCtx.state == 0)
return; return;
}
if (CVarGetInteger("gCheckTrackerDisplayType", 0) == 1) { if (CVarGetInteger("gCheckTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) {
int comboButton1Mask = buttons[CVarGetInteger("gCheckTrackerComboButton1", 6)]; int comboButton1Mask = buttons[CVarGetInteger("gCheckTrackerComboButton1", TRACKER_COMBO_BUTTON_L)];
int comboButton2Mask = buttons[CVarGetInteger("gCheckTrackerComboButton2", 8)]; int comboButton2Mask = buttons[CVarGetInteger("gCheckTrackerComboButton2", TRACKER_COMBO_BUTTON_R)];
OSContPad* trackerButtonsPressed = LUS::Context::GetInstance()->GetControlDeck()->GetPads(); OSContPad* trackerButtonsPressed = LUS::Context::GetInstance()->GetControlDeck()->GetPads();
bool comboButtonsHeld = trackerButtonsPressed != nullptr && bool comboButtonsHeld = trackerButtonsPressed != nullptr &&
trackerButtonsPressed[0].button & comboButton1Mask && trackerButtonsPressed[0].button & comboButton1Mask &&
trackerButtonsPressed[0].button & comboButton2Mask; trackerButtonsPressed[0].button & comboButton2Mask;
if (!comboButtonsHeld) if (!comboButtonsHeld) {
return; return;
} }
} }
}
BeginFloatWindows("Check Tracker", mIsVisible, ImGuiWindowFlags_NoScrollbar); BeginFloatWindows("Check Tracker", mIsVisible, ImGuiWindowFlags_NoScrollbar);
@ -333,7 +335,7 @@ void BeginFloatWindows(std::string UniqueName, bool& open, ImGuiWindowFlags flag
ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_NoFocusOnAppearing; ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_NoFocusOnAppearing;
} }
if (!CVarGetInteger("gCheckTrackerWindowType", 1)) { if (CVarGetInteger("gCheckTrackerWindowType", TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) {
ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID);
windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar |
ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar;
@ -980,14 +982,14 @@ void CheckTrackerSettingsWindow::DrawElement() {
} }
ImGui::PopItemWidth(); ImGui::PopItemWidth();
UIWidgets::LabeledRightAlignedEnhancementCombobox("Window Type", "gCheckTrackerWindowType", windowType, 1); UIWidgets::LabeledRightAlignedEnhancementCombobox("Window Type", "gCheckTrackerWindowType", windowType, TRACKER_WINDOW_WINDOW);
if (CVarGetInteger("gCheckTrackerWindowType", 1) == 0) { if (CVarGetInteger("gCheckTrackerWindowType", TRACKER_WINDOW_WINDOW) == TRACKER_WINDOW_FLOATING) {
UIWidgets::EnhancementCheckbox("Enable Dragging", "gCheckTrackerHudEditMode"); UIWidgets::EnhancementCheckbox("Enable Dragging", "gCheckTrackerHudEditMode");
UIWidgets::EnhancementCheckbox("Only enable while paused", "gCheckTrackerShowOnlyPaused"); UIWidgets::EnhancementCheckbox("Only enable while paused", "gCheckTrackerShowOnlyPaused");
UIWidgets::LabeledRightAlignedEnhancementCombobox("Display Mode", "gCheckTrackerDisplayType", displayType, 0); UIWidgets::LabeledRightAlignedEnhancementCombobox("Display Mode", "gCheckTrackerDisplayType", displayType, 0);
if (CVarGetInteger("gCheckTrackerDisplayType", 0) > 0) { if (CVarGetInteger("gCheckTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) {
UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 1", "gCheckTrackerComboButton1", buttonStrings, 6); UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 1", "gCheckTrackerComboButton1", buttonStrings, TRACKER_COMBO_BUTTON_L);
UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 2", "gCheckTrackerComboButton2", buttonStrings, 8); UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 2", "gCheckTrackerComboButton2", buttonStrings, TRACKER_COMBO_BUTTON_R);
} }
} }
UIWidgets::EnhancementCheckbox("Performance mode", "gCheckTrackerOptionPerformanceMode"); UIWidgets::EnhancementCheckbox("Performance mode", "gCheckTrackerOptionPerformanceMode");

View File

@ -2,6 +2,7 @@
#include "../../util.h" #include "../../util.h"
#include "../../OTRGlobals.h" #include "../../OTRGlobals.h"
#include "../../UIWidgets.hpp" #include "../../UIWidgets.hpp"
#include "randomizerTypes.h"
#include <map> #include <map>
#include <string> #include <string>
@ -236,6 +237,25 @@ typedef enum {
ITEM_TRACKER_NUMBER_AMMO, ITEM_TRACKER_NUMBER_AMMO,
} ItemTrackerNumberOption; } ItemTrackerNumberOption;
typedef enum {
KEYS_COLLECTED_MAX,
KEYS_CURRENT_COLLECTED_MAX,
KEYS_CURRENT_MAX
} ItemTrackerKeysNumberOption;
typedef enum {
SECTION_DISPLAY_HIDDEN,
SECTION_DISPLAY_MAIN_WINDOW,
SECTION_DISPLAY_SEPARATE
} ItemTrackerDisplayType;
typedef enum {
SECTION_DISPLAY_EXTENDED_HIDDEN,
SECTION_DISPLAY_EXTENDED_MAIN_WINDOW,
SECTION_DISPLAY_EXTENDED_MISC_WINDOW,
SECTION_DISPLAY_EXTENDED_SEPARATE
} ItemTrackerExtendedDisplayType;
struct ItemTrackerNumbers { struct ItemTrackerNumbers {
int currentCapacity; int currentCapacity;
int maxCapacity; int maxCapacity;
@ -357,8 +377,8 @@ void DrawItemCount(ItemTrackerItem item) {
int iconSize = CVarGetInteger("gItemTrackerIconSize", 36); int iconSize = CVarGetInteger("gItemTrackerIconSize", 36);
ItemTrackerNumbers currentAndMax = GetItemCurrentAndMax(item); ItemTrackerNumbers currentAndMax = GetItemCurrentAndMax(item);
ImVec2 p = ImGui::GetCursorScreenPos(); ImVec2 p = ImGui::GetCursorScreenPos();
int32_t trackerNumberDisplayMode = CVarGetInteger("gItemTrackerCapacityTrack", 1); int32_t trackerNumberDisplayMode = CVarGetInteger("gItemTrackerCapacityTrack", ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY);
int32_t trackerKeyNumberDisplayMode = CVarGetInteger("gItemTrackerKeyTrack", 0); int32_t trackerKeyNumberDisplayMode = CVarGetInteger("gItemTrackerKeyTrack", KEYS_COLLECTED_MAX);
if (item.id == ITEM_KEY_SMALL && IsValidSaveFile()) { if (item.id == ITEM_KEY_SMALL && IsValidSaveFile()) {
std::string currentString = ""; std::string currentString = "";
@ -366,11 +386,11 @@ void DrawItemCount(ItemTrackerItem item) {
ImU32 currentColor = IM_COL_WHITE; ImU32 currentColor = IM_COL_WHITE;
ImU32 maxColor = IM_COL_GREEN; ImU32 maxColor = IM_COL_GREEN;
// "Collected / Max", "Current / Collected / Max", "Current / Max" // "Collected / Max", "Current / Collected / Max", "Current / Max"
if (trackerKeyNumberDisplayMode == 1 || trackerKeyNumberDisplayMode == 2) { if (trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX || trackerKeyNumberDisplayMode == KEYS_CURRENT_MAX) {
currentString+= std::to_string(currentAndMax.currentAmmo); currentString+= std::to_string(currentAndMax.currentAmmo);
currentString+= "/"; currentString+= "/";
} }
if (trackerKeyNumberDisplayMode == 0 || trackerKeyNumberDisplayMode == 1) { if (trackerKeyNumberDisplayMode == KEYS_COLLECTED_MAX || trackerKeyNumberDisplayMode == KEYS_CURRENT_COLLECTED_MAX) {
currentString+= std::to_string(currentAndMax.currentCapacity); currentString+= std::to_string(currentAndMax.currentCapacity);
currentString+= "/"; currentString+= "/";
} }
@ -648,7 +668,7 @@ void BeginFloatingWindows(std::string UniqueName, ImGuiWindowFlags flags = 0) {
windowFlags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize; windowFlags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize;
} }
if (!CVarGetInteger("gItemTrackerWindowType", 0)) { if (CVarGetInteger("gItemTrackerWindowType", TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) {
ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID); ImGui::SetNextWindowViewport(ImGui::GetMainViewport()->ID);
windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar; windowFlags |= ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar;
@ -675,7 +695,7 @@ void EndFloatingWindows() {
void DrawItemsInRows(std::vector<ItemTrackerItem> items, int columns = 6) { void DrawItemsInRows(std::vector<ItemTrackerItem> items, int columns = 6) {
int iconSize = CVarGetInteger("gItemTrackerIconSize", 36); int iconSize = CVarGetInteger("gItemTrackerIconSize", 36);
int iconSpacing = CVarGetInteger("gItemTrackerIconSpacing", 12); int iconSpacing = CVarGetInteger("gItemTrackerIconSpacing", 12);
int topPadding = CVarGetInteger("gItemTrackerWindowType", 0) ? 20 : 0; int topPadding = (CVarGetInteger("gItemTrackerWindowType", TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW) ? 20 : 0;
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {
int row = i / columns; int row = i / columns;
@ -767,7 +787,7 @@ void UpdateVectors() {
dungeonRewards.insert(dungeonRewards.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); dungeonRewards.insert(dungeonRewards.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end());
dungeonItems.clear(); dungeonItems.clear();
if (CVarGetInteger("gItemTrackerDisplayDungeonItemsHorizontal", 1) && CVarGetInteger("gItemTrackerDungeonItemsDisplayType", 0) == 2) { if (CVarGetInteger("gItemTrackerDisplayDungeonItemsHorizontal", 1) && CVarGetInteger("gItemTrackerDungeonItemsDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) {
if (CVarGetInteger("gItemTrackerDisplayDungeonItemsMaps", 1)) { if (CVarGetInteger("gItemTrackerDisplayDungeonItemsMaps", 1)) {
dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsWithMapsHorizontal, 12); dungeonItems = GetDungeonItemsVector(itemTrackerDungeonsWithMapsHorizontal, 12);
// Manually adding Thieves Hideout to an open spot so we don't get an additional row for one item // Manually adding Thieves Hideout to an open spot so we don't get an additional row for one item
@ -788,36 +808,37 @@ void UpdateVectors() {
} }
mainWindowItems.clear(); mainWindowItems.clear();
if (CVarGetInteger("gItemTrackerInventoryItemsDisplayType", 1) == 1) { if (CVarGetInteger("gItemTrackerInventoryItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) {
mainWindowItems.insert(mainWindowItems.end(), inventoryItems.begin(), inventoryItems.end()); mainWindowItems.insert(mainWindowItems.end(), inventoryItems.begin(), inventoryItems.end());
} }
if (CVarGetInteger("gItemTrackerEquipmentItemsDisplayType", 1) == 1) { if (CVarGetInteger("gItemTrackerEquipmentItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) {
mainWindowItems.insert(mainWindowItems.end(), equipmentItems.begin(), equipmentItems.end()); mainWindowItems.insert(mainWindowItems.end(), equipmentItems.begin(), equipmentItems.end());
} }
if (CVarGetInteger("gItemTrackerMiscItemsDisplayType", 1) == 1) { if (CVarGetInteger("gItemTrackerMiscItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) {
mainWindowItems.insert(mainWindowItems.end(), miscItems.begin(), miscItems.end()); mainWindowItems.insert(mainWindowItems.end(), miscItems.begin(), miscItems.end());
} }
if (CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", 1) == 1) { if (CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) {
mainWindowItems.insert(mainWindowItems.end(), dungeonRewardStones.begin(), dungeonRewardStones.end()); mainWindowItems.insert(mainWindowItems.end(), dungeonRewardStones.begin(), dungeonRewardStones.end());
mainWindowItems.insert(mainWindowItems.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end()); mainWindowItems.insert(mainWindowItems.end(), dungeonRewardMedallions.begin(), dungeonRewardMedallions.end());
} }
if (CVarGetInteger("gItemTrackerSongsDisplayType", 1) == 1) { if (CVarGetInteger("gItemTrackerSongsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) {
if (CVarGetInteger("gItemTrackerMiscItemsDisplayType", 1) == 1 && CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", 1) != 1) { if (CVarGetInteger("gItemTrackerMiscItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW &&
CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) != SECTION_DISPLAY_MAIN_WINDOW) {
mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem));
mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem));
mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem));
} }
mainWindowItems.insert(mainWindowItems.end(), songItems.begin(), songItems.end()); mainWindowItems.insert(mainWindowItems.end(), songItems.begin(), songItems.end());
} }
if (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", 0) == 1) { if (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) {
mainWindowItems.insert(mainWindowItems.end(), dungeonItems.begin(), dungeonItems.end()); mainWindowItems.insert(mainWindowItems.end(), dungeonItems.begin(), dungeonItems.end());
} }
// if we're adding greg to the misc window, // if we're adding greg to the misc window,
// and misc isn't on the main window, // and misc isn't on the main window,
// and it doesn't already have greg, add him // and it doesn't already have greg, add him
if (CVarGetInteger("gItemTrackerGregDisplayType", 0) == 2 && if (CVarGetInteger("gItemTrackerGregDisplayType", SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_MISC_WINDOW &&
CVarGetInteger("gItemTrackerMiscItemsDisplayType", 1) != 1 && CVarGetInteger("gItemTrackerMiscItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) != SECTION_DISPLAY_MAIN_WINDOW &&
std::none_of(miscItems.begin(), miscItems.end(), [](ItemTrackerItem item){return item.id == ITEM_RUPEE_GREEN;})) { std::none_of(miscItems.begin(), miscItems.end(), [](ItemTrackerItem item){return item.id == ITEM_RUPEE_GREEN;})) {
miscItems.insert(miscItems.end(), gregItems.begin(), gregItems.end()); miscItems.insert(miscItems.end(), gregItems.begin(), gregItems.end());
@ -832,7 +853,7 @@ void UpdateVectors() {
} }
// if we're adding greg to the main window // if we're adding greg to the main window
if (CVarGetInteger("gItemTrackerGregDisplayType", 0) == 1) { if (CVarGetInteger("gItemTrackerGregDisplayType", SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) {
// insert empty items until we're on a new row for greg // insert empty items until we're on a new row for greg
while (mainWindowItems.size() % 6) { while (mainWindowItems.size() % 6) {
mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem)); mainWindowItems.push_back(ITEM_TRACKER_ITEM(ITEM_NONE, 0, DrawItem));
@ -850,53 +871,53 @@ void ItemTrackerWindow::DrawElement() {
int iconSize = CVarGetInteger("gItemTrackerIconSize", 36); int iconSize = CVarGetInteger("gItemTrackerIconSize", 36);
int iconSpacing = CVarGetInteger("gItemTrackerIconSpacing", 12); int iconSpacing = CVarGetInteger("gItemTrackerIconSpacing", 12);
int comboButton1Mask = buttonMap[CVarGetInteger("gItemTrackerComboButton1", 6)]; int comboButton1Mask = buttonMap[CVarGetInteger("gItemTrackerComboButton1", TRACKER_COMBO_BUTTON_L)];
int comboButton2Mask = buttonMap[CVarGetInteger("gItemTrackerComboButton2", 8)]; int comboButton2Mask = buttonMap[CVarGetInteger("gItemTrackerComboButton2", TRACKER_COMBO_BUTTON_R)];
OSContPad* buttonsPressed = LUS::Context::GetInstance()->GetControlDeck()->GetPads(); OSContPad* buttonsPressed = LUS::Context::GetInstance()->GetControlDeck()->GetPads();
bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask; bool comboButtonsHeld = buttonsPressed != nullptr && buttonsPressed[0].button & comboButton1Mask && buttonsPressed[0].button & comboButton2Mask;
bool isPaused = CVarGetInteger("gItemTrackerShowOnlyPaused", 0) == 0 || gPlayState != nullptr && gPlayState->pauseCtx.state > 0; bool isPaused = CVarGetInteger("gItemTrackerShowOnlyPaused", 0) == 0 || gPlayState != nullptr && gPlayState->pauseCtx.state > 0;
if (CVarGetInteger("gItemTrackerWindowType", 0) == 1 || isPaused && (CVarGetInteger("gItemTrackerDisplayType", 0) == 0 ? CVarGetInteger("gItemTrackerEnabled", 0) : comboButtonsHeld)) { if (CVarGetInteger("gItemTrackerWindowType", TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_WINDOW || isPaused && (CVarGetInteger("gItemTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS ? CVarGetInteger("gItemTrackerEnabled", 0) : comboButtonsHeld)) {
if ( if (
(CVarGetInteger("gItemTrackerInventoryItemsDisplayType", 1) == 1) || (CVarGetInteger("gItemTrackerInventoryItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) ||
(CVarGetInteger("gItemTrackerEquipmentItemsDisplayType", 1) == 1) || (CVarGetInteger("gItemTrackerEquipmentItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) ||
(CVarGetInteger("gItemTrackerMiscItemsDisplayType", 1) == 1) || (CVarGetInteger("gItemTrackerMiscItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) ||
(CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", 1) == 1) || (CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) ||
(CVarGetInteger("gItemTrackerSongsDisplayType", 1) == 1) || (CVarGetInteger("gItemTrackerSongsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_MAIN_WINDOW) ||
(CVarGetInteger("gItemTrackerDungeonItemsDisplayType", 0) == 1) || (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW) ||
(CVarGetInteger("gItemTrackerGregDisplayType", 0) == 1) || (CVarGetInteger("gItemTrackerGregDisplayType", SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_MAIN_WINDOW) ||
(CVarGetInteger("gItemTrackerNotesDisplayType", 0) == 1) (CVarGetInteger("gItemTrackerNotesDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW)
) { ) {
BeginFloatingWindows("Item Tracker##main window"); BeginFloatingWindows("Item Tracker##main window");
DrawItemsInRows(mainWindowItems, 6); DrawItemsInRows(mainWindowItems, 6);
if (CVarGetInteger("gItemTrackerNotesDisplayType", 0) == 1 && CVarGetInteger("gItemTrackerDisplayType", 0) == 0) { if (CVarGetInteger("gItemTrackerNotesDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_MAIN_WINDOW && CVarGetInteger("gItemTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) {
DrawNotes(); DrawNotes();
} }
EndFloatingWindows(); EndFloatingWindows();
} }
if (CVarGetInteger("gItemTrackerInventoryItemsDisplayType", 1) == 2) { if (CVarGetInteger("gItemTrackerInventoryItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) {
BeginFloatingWindows("Inventory Items Tracker"); BeginFloatingWindows("Inventory Items Tracker");
DrawItemsInRows(inventoryItems); DrawItemsInRows(inventoryItems);
EndFloatingWindows(); EndFloatingWindows();
} }
if (CVarGetInteger("gItemTrackerEquipmentItemsDisplayType", 1) == 2) { if (CVarGetInteger("gItemTrackerEquipmentItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) {
BeginFloatingWindows("Equipment Items Tracker"); BeginFloatingWindows("Equipment Items Tracker");
DrawItemsInRows(equipmentItems, 3); DrawItemsInRows(equipmentItems, 3);
EndFloatingWindows(); EndFloatingWindows();
} }
if (CVarGetInteger("gItemTrackerMiscItemsDisplayType", 1) == 2) { if (CVarGetInteger("gItemTrackerMiscItemsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) {
BeginFloatingWindows("Misc Items Tracker"); BeginFloatingWindows("Misc Items Tracker");
DrawItemsInRows(miscItems, 4); DrawItemsInRows(miscItems, 4);
EndFloatingWindows(); EndFloatingWindows();
} }
if (CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", 1) == 2) { if (CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) {
BeginFloatingWindows("Dungeon Rewards Tracker"); BeginFloatingWindows("Dungeon Rewards Tracker");
if (CVarGetInteger("gItemTrackerDungeonRewardsCircle", 0) == 1) { if (CVarGetInteger("gItemTrackerDungeonRewardsCircle", 0)) {
ImGui::BeginGroup(); ImGui::BeginGroup();
DrawItemsInACircle(dungeonRewardMedallions); DrawItemsInACircle(dungeonRewardMedallions);
ImGui::EndGroup(); ImGui::EndGroup();
@ -909,13 +930,13 @@ void ItemTrackerWindow::DrawElement() {
EndFloatingWindows(); EndFloatingWindows();
} }
if (CVarGetInteger("gItemTrackerSongsDisplayType", 1) == 2) { if (CVarGetInteger("gItemTrackerSongsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) {
BeginFloatingWindows("Songs Tracker"); BeginFloatingWindows("Songs Tracker");
DrawItemsInRows(songItems); DrawItemsInRows(songItems);
EndFloatingWindows(); EndFloatingWindows();
} }
if (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", 0) == 2) { if (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) {
BeginFloatingWindows("Dungeon Items Tracker"); BeginFloatingWindows("Dungeon Items Tracker");
if (CVarGetInteger("gItemTrackerDisplayDungeonItemsHorizontal", 1)) { if (CVarGetInteger("gItemTrackerDisplayDungeonItemsHorizontal", 1)) {
if (CVarGetInteger("gItemTrackerDisplayDungeonItemsMaps", 1)) { if (CVarGetInteger("gItemTrackerDisplayDungeonItemsMaps", 1)) {
@ -929,13 +950,13 @@ void ItemTrackerWindow::DrawElement() {
EndFloatingWindows(); EndFloatingWindows();
} }
if (CVarGetInteger("gItemTrackerGregDisplayType", 0) == 3) { if (CVarGetInteger("gItemTrackerGregDisplayType", SECTION_DISPLAY_EXTENDED_HIDDEN) == SECTION_DISPLAY_EXTENDED_SEPARATE) {
BeginFloatingWindows("Greg Tracker"); BeginFloatingWindows("Greg Tracker");
DrawItemsInRows(gregItems); DrawItemsInRows(gregItems);
EndFloatingWindows(); EndFloatingWindows();
} }
if (CVarGetInteger("gItemTrackerNotesDisplayType", 0) == 2 && CVarGetInteger("gItemTrackerDisplayType", 0) == 0) { if (CVarGetInteger("gItemTrackerNotesDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE && CVarGetInteger("gItemTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) {
ImGui::SetNextWindowSize(ImVec2(400,300), ImGuiCond_FirstUseEver); ImGui::SetNextWindowSize(ImVec2(400,300), ImGuiCond_FirstUseEver);
BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing); BeginFloatingWindows("Personal Notes", ImGuiWindowFlags_NoFocusOnAppearing);
DrawNotes(true); DrawNotes(true);
@ -949,8 +970,8 @@ static const char* itemTrackerKeyTrackOptions[3] = { "Collected / Max", "Current
static const char* windowTypes[2] = { "Floating", "Window" }; static const char* windowTypes[2] = { "Floating", "Window" };
static const char* displayModes[2] = { "Always", "Combo Button Hold" }; static const char* displayModes[2] = { "Always", "Combo Button Hold" };
static const char* buttons[14] = { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" }; static const char* buttons[14] = { "A", "B", "C-Up", "C-Down", "C-Left", "C-Right", "L", "Z", "R", "Start", "D-Up", "D-Down", "D-Left", "D-Right" };
static const char* displayTypes[3] = { "Hidden", "Main Window", "Seperate" }; static const char* displayTypes[3] = { "Hidden", "Main Window", "Separate" };
static const char* extendedDisplayTypes[4] = { "Hidden", "Main Window", "Misc Window", "Seperate" }; static const char* extendedDisplayTypes[4] = { "Hidden", "Main Window", "Misc Window", "Separate" };
void ItemTrackerSettingsWindow::DrawElement() { void ItemTrackerSettingsWindow::DrawElement() {
ImGui::SetNextWindowSize(ImVec2(600,375), ImGuiCond_FirstUseEver); ImGui::SetNextWindowSize(ImVec2(600,375), ImGuiCond_FirstUseEver);
@ -979,25 +1000,25 @@ void ItemTrackerSettingsWindow::DrawElement() {
} }
ImGui::PopItemWidth(); ImGui::PopItemWidth();
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Window Type", "gItemTrackerWindowType", windowTypes, 0)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Window Type", "gItemTrackerWindowType", windowTypes, TRACKER_WINDOW_FLOATING)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (CVarGetInteger("gItemTrackerWindowType", 0) == 0) { if (CVarGetInteger("gItemTrackerWindowType", TRACKER_WINDOW_FLOATING) == TRACKER_WINDOW_FLOATING) {
if (UIWidgets::PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode")) { if (UIWidgets::PaddedEnhancementCheckbox("Enable Dragging", "gItemTrackerHudEditMode")) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (UIWidgets::PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerShowOnlyPaused")) { if (UIWidgets::PaddedEnhancementCheckbox("Only enable while paused", "gItemTrackerShowOnlyPaused")) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Display Mode", "gItemTrackerDisplayType", displayModes, 0)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Display Mode", "gItemTrackerDisplayType", displayModes, TRACKER_DISPLAY_ALWAYS)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (CVarGetInteger("gItemTrackerDisplayType", 0) > 0) { if (CVarGetInteger("gItemTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_COMBO_BUTTON) {
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 1", "gItemTrackerComboButton1", buttons, 6)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 1", "gItemTrackerComboButton1", buttons, TRACKER_COMBO_BUTTON_L)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 2", "gItemTrackerComboButton2", buttons, 8)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Combo Button 2", "gItemTrackerComboButton2", buttons, TRACKER_COMBO_BUTTON_R)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} }
@ -1007,45 +1028,45 @@ void ItemTrackerSettingsWindow::DrawElement() {
UIWidgets::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 12); UIWidgets::EnhancementSliderInt("Icon margins : %dpx", "##ITEMTRACKERSPACING", "gItemTrackerIconSpacing", -5, 50, "", 12);
ImGui::Text("Ammo/Capacity Tracking"); ImGui::Text("Ammo/Capacity Tracking");
UIWidgets::EnhancementCombobox("gItemTrackerCapacityTrack", itemTrackerCapacityTrackOptions, 1); UIWidgets::EnhancementCombobox("gItemTrackerCapacityTrack", itemTrackerCapacityTrackOptions, ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY);
UIWidgets::InsertHelpHoverText("Customize what the numbers under each item are tracking." UIWidgets::InsertHelpHoverText("Customize what the numbers under each item are tracking."
"\n\nNote: items without capacity upgrades will track ammo even in capacity mode"); "\n\nNote: items without capacity upgrades will track ammo even in capacity mode");
if (CVarGetInteger("gItemTrackerCapacityTrack", 1) == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || CVarGetInteger("gItemTrackerCapacityTrack", 1) == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) { if (CVarGetInteger("gItemTrackerCapacityTrack", ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY || CVarGetInteger("gItemTrackerCapacityTrack", ITEM_TRACKER_NUMBER_CURRENT_CAPACITY_ONLY) == ITEM_TRACKER_NUMBER_CURRENT_AMMO_ONLY) {
if (UIWidgets::PaddedEnhancementCheckbox("Align count to left side", "gItemTrackerCurrentOnLeft")) { if (UIWidgets::PaddedEnhancementCheckbox("Align count to left side", "gItemTrackerCurrentOnLeft")) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} }
ImGui::Text("Key Count Tracking"); ImGui::Text("Key Count Tracking");
UIWidgets::EnhancementCombobox("gItemTrackerKeyTrack", itemTrackerKeyTrackOptions, 0); UIWidgets::EnhancementCombobox("gItemTrackerKeyTrack", itemTrackerKeyTrackOptions, KEYS_COLLECTED_MAX);
UIWidgets::InsertHelpHoverText("Customize what numbers are shown for key tracking."); UIWidgets::InsertHelpHoverText("Customize what numbers are shown for key tracking.");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Inventory", "gItemTrackerInventoryItemsDisplayType", displayTypes, 1)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Inventory", "gItemTrackerInventoryItemsDisplayType", displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Equipment", "gItemTrackerEquipmentItemsDisplayType", displayTypes, 1)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Equipment", "gItemTrackerEquipmentItemsDisplayType", displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Misc", "gItemTrackerMiscItemsDisplayType", displayTypes, 1)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Misc", "gItemTrackerMiscItemsDisplayType", displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Dungeon Rewards", "gItemTrackerDungeonRewardsDisplayType", displayTypes, 1)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Dungeon Rewards", "gItemTrackerDungeonRewardsDisplayType", displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", 1) == 2) { if (CVarGetInteger("gItemTrackerDungeonRewardsDisplayType", SECTION_DISPLAY_MAIN_WINDOW) == SECTION_DISPLAY_SEPARATE) {
if (UIWidgets::PaddedEnhancementCheckbox("Circle display", "gItemTrackerDungeonRewardsCircle", true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true)) { if (UIWidgets::PaddedEnhancementCheckbox("Circle display", "gItemTrackerDungeonRewardsCircle", true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} }
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Songs", "gItemTrackerSongsDisplayType", displayTypes, 1)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Songs", "gItemTrackerSongsDisplayType", displayTypes, SECTION_DISPLAY_MAIN_WINDOW)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Dungeon Items", "gItemTrackerDungeonItemsDisplayType", displayTypes, 0)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Dungeon Items", "gItemTrackerDungeonItemsDisplayType", displayTypes, SECTION_DISPLAY_HIDDEN)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", 0) != 0) { if (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", SECTION_DISPLAY_HIDDEN) != SECTION_DISPLAY_HIDDEN) {
if (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", 0) == 2) { if (CVarGetInteger("gItemTrackerDungeonItemsDisplayType", SECTION_DISPLAY_HIDDEN) == SECTION_DISPLAY_SEPARATE) {
if (UIWidgets::PaddedEnhancementCheckbox("Horizontal display", "gItemTrackerDisplayDungeonItemsHorizontal", true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true)) { if (UIWidgets::PaddedEnhancementCheckbox("Horizontal display", "gItemTrackerDisplayDungeonItemsHorizontal", true, true, false, "", UIWidgets::CheckboxGraphics::Cross, true)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
@ -1054,12 +1075,12 @@ void ItemTrackerSettingsWindow::DrawElement() {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} }
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Greg", "gItemTrackerGregDisplayType", extendedDisplayTypes, 0)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Greg", "gItemTrackerGregDisplayType", extendedDisplayTypes, SECTION_DISPLAY_EXTENDED_HIDDEN)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
if (CVarGetInteger("gItemTrackerDisplayType", 0) != 1) { if (CVarGetInteger("gItemTrackerDisplayType", TRACKER_DISPLAY_ALWAYS) == TRACKER_DISPLAY_ALWAYS) {
if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Personal notes", "gItemTrackerNotesDisplayType", displayTypes, 0)) { if (UIWidgets::LabeledRightAlignedEnhancementCombobox("Personal notes", "gItemTrackerNotesDisplayType", displayTypes, SECTION_DISPLAY_HIDDEN)) {
shouldUpdateVectors = true; shouldUpdateVectors = true;
} }
} }

View File

@ -60,7 +60,7 @@ std::string GetWindowButtonText(const char* text, bool menuOpen) {
"Linear", "None" "Linear", "None"
}; };
static const char* chestSizeAndTextureMatchesContentsOptions[4] = { "Disabled", "Both", "Texture Only", "Size Only" }; static const char* chestStyleMatchesContentsOptions[4] = { "Disabled", "Both", "Texture Only", "Size Only" };
static const char* bunnyHoodOptions[3] = { "Disabled", "Faster Run & Longer Jump", "Faster Run" }; static const char* bunnyHoodOptions[3] = { "Disabled", "Faster Run & Longer Jump", "Faster Run" };
static const char* allPowers[9] = { static const char* allPowers[9] = {
"Vanilla (1x)", "Vanilla (1x)",
@ -405,7 +405,7 @@ void DrawSettingsMenu() {
// If more filters are added to LUS, make sure to add them to the filters list here // If more filters are added to LUS, make sure to add them to the filters list here
ImGui::Text("Texture Filter (Needs reload)"); ImGui::Text("Texture Filter (Needs reload)");
UIWidgets::EnhancementCombobox("gTextureFilter", filters, 0); UIWidgets::EnhancementCombobox("gTextureFilter", filters, FILTER_THREE_POINT);
UIWidgets::Spacer(0); UIWidgets::Spacer(0);
@ -480,8 +480,8 @@ void DrawEnhancementsMenu() {
UIWidgets::PaddedEnhancementCheckbox("Fast Chests", "gFastChests", true, false); UIWidgets::PaddedEnhancementCheckbox("Fast Chests", "gFastChests", true, false);
UIWidgets::Tooltip("Kick open every chest"); UIWidgets::Tooltip("Kick open every chest");
UIWidgets::PaddedText("Chest size & texture matches contents", true, false); UIWidgets::PaddedText("Chest size & texture matches contents", true, false);
if (UIWidgets::EnhancementCombobox("gChestSizeAndTextureMatchesContents", chestSizeAndTextureMatchesContentsOptions, 0)) { if (UIWidgets::EnhancementCombobox("gChestSizeAndTextureMatchesContents", chestStyleMatchesContentsOptions, CSMC_DISABLED)) {
if (CVarGetInteger("gChestSizeAndTextureMatchesContents", 0) == 0) { if (CVarGetInteger("gChestSizeAndTextureMatchesContents", CSMC_DISABLED) == CSMC_DISABLED) {
CVarSetInteger("gChestSizeDependsStoneOfAgony", 0); CVarSetInteger("gChestSizeDependsStoneOfAgony", 0);
} }
} }
@ -494,7 +494,7 @@ void DrawEnhancementsMenu() {
" - Boss keys: Vanilla size and texture\n" " - Boss keys: Vanilla size and texture\n"
" - Skulltula Tokens: Small skulltula chest\n" " - Skulltula Tokens: Small skulltula chest\n"
); );
if (CVarGetInteger("gChestSizeAndTextureMatchesContents", 0) > 0) { if (CVarGetInteger("gChestSizeAndTextureMatchesContents", CSMC_DISABLED) != CSMC_DISABLED) {
UIWidgets::PaddedEnhancementCheckbox("Chests of Agony", "gChestSizeDependsStoneOfAgony", true, false); UIWidgets::PaddedEnhancementCheckbox("Chests of Agony", "gChestSizeDependsStoneOfAgony", true, false);
UIWidgets::Tooltip("Only change the size/texture of chests if you have the Stone of Agony."); UIWidgets::Tooltip("Only change the size/texture of chests if you have the Stone of Agony.");
} }
@ -551,7 +551,7 @@ void DrawEnhancementsMenu() {
UIWidgets::PaddedEnhancementCheckbox("Prevent Dropped Ocarina Inputs", "gDpadNoDropOcarinaInput", true, false); UIWidgets::PaddedEnhancementCheckbox("Prevent Dropped Ocarina Inputs", "gDpadNoDropOcarinaInput", true, false);
UIWidgets::Tooltip("Prevent dropping inputs when playing the ocarina quickly"); UIWidgets::Tooltip("Prevent dropping inputs when playing the ocarina quickly");
UIWidgets::PaddedText("Bunny Hood Effect", true, false); UIWidgets::PaddedText("Bunny Hood Effect", true, false);
UIWidgets::EnhancementCombobox("gMMBunnyHood", bunnyHoodOptions, 0); UIWidgets::EnhancementCombobox("gMMBunnyHood", bunnyHoodOptions, BUNNY_HOOD_VANILLA);
UIWidgets::Tooltip( UIWidgets::Tooltip(
"Wearing the Bunny Hood grants a speed increase like in Majora's Mask. The longer jump option is not accounted for in randomizer logic.\n\n" "Wearing the Bunny Hood grants a speed increase like in Majora's Mask. The longer jump option is not accounted for in randomizer logic.\n\n"
"Also disables NPC's reactions to wearing the Bunny Hood." "Also disables NPC's reactions to wearing the Bunny Hood."
@ -616,7 +616,7 @@ void DrawEnhancementsMenu() {
"64x: Cannot survive void damage" "64x: Cannot survive void damage"
); );
UIWidgets::PaddedText("Bonk Damage Multiplier", true, false); UIWidgets::PaddedText("Bonk Damage Multiplier", true, false);
UIWidgets::EnhancementCombobox("gBonkDamageMul", bonkDamageValues, 0); UIWidgets::EnhancementCombobox("gBonkDamageMul", bonkDamageValues, BONK_DAMAGE_NONE);
UIWidgets::Tooltip("Modifies damage taken after bonking."); UIWidgets::Tooltip("Modifies damage taken after bonking.");
UIWidgets::PaddedEnhancementCheckbox("Spawn with full health", "gFullHealthSpawn", true, false); UIWidgets::PaddedEnhancementCheckbox("Spawn with full health", "gFullHealthSpawn", true, false);
UIWidgets::Tooltip("Respawn with full health instead of 3 Hearts"); UIWidgets::Tooltip("Respawn with full health instead of 3 Hearts");
@ -925,7 +925,7 @@ void DrawEnhancementsMenu() {
ImGui::EndMenu(); ImGui::EndMenu();
} }
UIWidgets::PaddedText("Fix Vanishing Paths", true, false); UIWidgets::PaddedText("Fix Vanishing Paths", true, false);
if (UIWidgets::EnhancementCombobox("gSceneSpecificDirtPathFix", zFightingOptions, 0) && gPlayState != NULL) { if (UIWidgets::EnhancementCombobox("gSceneSpecificDirtPathFix", zFightingOptions, ZFIGHT_FIX_DISABLED) && gPlayState != NULL) {
UpdateDirtPathFixState(gPlayState->sceneNum); UpdateDirtPathFixState(gPlayState->sceneNum);
} }
UIWidgets::Tooltip("Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n" UIWidgets::Tooltip("Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n"
@ -1047,7 +1047,7 @@ void DrawEnhancementsMenu() {
// Autosave enum value of 1 is the default in presets and the old checkbox "on" state for backwards compatibility // Autosave enum value of 1 is the default in presets and the old checkbox "on" state for backwards compatibility
UIWidgets::PaddedText("Autosave", false, true); UIWidgets::PaddedText("Autosave", false, true);
UIWidgets::EnhancementCombobox("gAutosave", autosaveLabels, 0); UIWidgets::EnhancementCombobox("gAutosave", autosaveLabels, AUTOSAVE_OFF);
UIWidgets::Tooltip("Automatically save the game when changing locations and/or obtaining items\n" UIWidgets::Tooltip("Automatically save the game when changing locations and/or obtaining items\n"
"Major items exclude rupees and health/magic/ammo refills (but include bombchus unless bombchu drops are enabled)"); "Major items exclude rupees and health/magic/ammo refills (but include bombchus unless bombchu drops are enabled)");

View File

@ -1,4 +1,5 @@
#include "global.h" #include "global.h"
#include "soh/Enhancements/enhancementTypes.h"
u16 sReactionTextIds[][PLAYER_MASK_MAX] = { u16 sReactionTextIds[][PLAYER_MASK_MAX] = {
{ 0x0000, 0x7124, 0x7127, 0x7126, 0x7125, 0x7127, 0x7124, 0x7125, 0x7127 }, { 0x0000, 0x7124, 0x7127, 0x7126, 0x7125, 0x7127, 0x7124, 0x7125, 0x7127 },
@ -66,7 +67,7 @@ u16 sReactionTextIds[][PLAYER_MASK_MAX] = {
u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet) { u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet) {
u8 currentMask = Player_GetMask(play); u8 currentMask = Player_GetMask(play);
if (CVarGetInteger("gMMBunnyHood", 0) && currentMask == PLAYER_MASK_BUNNY) { if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA && currentMask == PLAYER_MASK_BUNNY) {
return 0; return 0;
} else { } else {
return sReactionTextIds[reactionSet][currentMask]; return sReactionTextIds[reactionSet][currentMask];

View File

@ -7,6 +7,7 @@
#include "textures/parameter_static/parameter_static.h" #include "textures/parameter_static/parameter_static.h"
#include "textures/message_static/message_static.h" #include "textures/message_static/message_static.h"
#include "textures/message_texture_static/message_texture_static.h" #include "textures/message_texture_static/message_texture_static.h"
#include "soh/Enhancements/cosmetics/cosmeticsTypes.h"
s16 sTextFade = false; // original name: key_off_flag ? s16 sTextFade = false; // original name: key_off_flag ?
@ -97,7 +98,7 @@ void Message_ResetOcarinaNoteState(void) {
sOcarinaNoteCBtnEnv = (Color_RGB8){ 10, 10, 10 }; sOcarinaNoteCBtnEnv = (Color_RGB8){ 10, 10, 10 };
if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) {
sOcarinaNoteABtnPrim = CVarGetColor24("gCosmetics.Hud_AButton.Value", sOcarinaNoteABtnPrim); sOcarinaNoteABtnPrim = CVarGetColor24("gCosmetics.Hud_AButton.Value", sOcarinaNoteABtnPrim);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
sOcarinaNoteABtnPrim = (Color_RGB8){ 80, 255, 150 }; sOcarinaNoteABtnPrim = (Color_RGB8){ 80, 255, 150 };
} }
if (CVarGetInteger("gCosmetics.Hud_CButtons.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_CButtons.Changed", 0)) {
@ -465,7 +466,7 @@ void Message_DrawTextboxIcon(PlayState* play, Gfx** p, s16 x, s16 y) {
sIconPrimColors[0].b = (color.b / 255) * 95; sIconPrimColors[0].b = (color.b / 255) * 95;
sIconPrimColors[1] = color; sIconPrimColors[1] = color;
sIconEnvColors[1] = color; sIconEnvColors[1] = color;
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
sIconPrimColors[0] = (Color_RGB8){ 0, 200, 80 }; sIconPrimColors[0] = (Color_RGB8){ 0, 200, 80 };
sIconPrimColors[1] = (Color_RGB8){ 50, 255, 130 }; sIconPrimColors[1] = (Color_RGB8){ 50, 255, 130 };
sIconEnvColors[1] = (Color_RGB8){ 50, 255, 130 }; sIconEnvColors[1] = (Color_RGB8){ 50, 255, 130 };
@ -2017,7 +2018,7 @@ void Message_DrawMain(PlayState* play, Gfx** p) {
sOcarinaNoteAPrimColors[0].b = (color.b / 255) * 95; sOcarinaNoteAPrimColors[0].b = (color.b / 255) * 95;
sOcarinaNoteAPrimColors[1] = color; sOcarinaNoteAPrimColors[1] = color;
sOcarinaNoteAEnvColors[1] = color; sOcarinaNoteAEnvColors[1] = color;
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
sOcarinaNoteAPrimColors[0] = (Color_RGB8){ 80, 255, 150 }; sOcarinaNoteAPrimColors[0] = (Color_RGB8){ 80, 255, 150 };
sOcarinaNoteAPrimColors[1] = (Color_RGB8){ 100, 255, 200 }; sOcarinaNoteAPrimColors[1] = (Color_RGB8){ 100, 255, 200 };
sOcarinaNoteAEnvColors[1] = (Color_RGB8){ 50, 255, 50 }; sOcarinaNoteAEnvColors[1] = (Color_RGB8){ 50, 255, 50 };

View File

@ -10,6 +10,8 @@
#include "soh/Enhancements/gameplaystats.h" #include "soh/Enhancements/gameplaystats.h"
#include "soh/Enhancements/boss-rush/BossRushTypes.h" #include "soh/Enhancements/boss-rush/BossRushTypes.h"
#include "soh/Enhancements/custom-message/CustomMessageInterfaceAddon.h" #include "soh/Enhancements/custom-message/CustomMessageInterfaceAddon.h"
#include "soh/Enhancements/cosmetics/cosmeticsTypes.h"
#include "soh/Enhancements/enhancementTypes.h"
#ifdef _MSC_VER #ifdef _MSC_VER
#include <stdlib.h> #include <stdlib.h>
@ -1127,7 +1129,7 @@ void func_80083108(PlayState* play) {
if (interfaceCtx->restrictions.tradeItems != 0) { if (interfaceCtx->restrictions.tradeItems != 0) {
for (i = 1; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) { for (i = 1; i < ARRAY_COUNT(gSaveContext.equips.buttonItems); i++) {
if ((CVarGetInteger("gMMBunnyHood", 0) != 0) if ((CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA)
&& (gSaveContext.equips.buttonItems[i] >= ITEM_MASK_KEATON) && (gSaveContext.equips.buttonItems[i] >= ITEM_MASK_KEATON)
&& (gSaveContext.equips.buttonItems[i] <= ITEM_MASK_TRUTH)) { && (gSaveContext.equips.buttonItems[i] <= ITEM_MASK_TRUTH)) {
gSaveContext.buttonStatus[BUTTON_STATUS_INDEX(i)] = BTN_ENABLED; gSaveContext.buttonStatus[BUTTON_STATUS_INDEX(i)] = BTN_ENABLED;
@ -3704,7 +3706,7 @@ void Interface_DrawItemButtons(PlayState* play) {
Color_RGB8 bButtonColor = { 0, 150, 0 }; Color_RGB8 bButtonColor = { 0, 150, 0 };
if (CVarGetInteger("gCosmetics.Hud_BButton.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_BButton.Changed", 0)) {
bButtonColor = CVarGetColor24("gCosmetics.Hud_BButton.Value", bButtonColor); bButtonColor = CVarGetColor24("gCosmetics.Hud_BButton.Value", bButtonColor);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
bButtonColor = (Color_RGB8){ 255, 30, 30 }; bButtonColor = (Color_RGB8){ 255, 30, 30 };
} }
@ -3732,7 +3734,7 @@ void Interface_DrawItemButtons(PlayState* play) {
Color_RGB8 startButtonColor = { 200, 0, 0 }; Color_RGB8 startButtonColor = { 200, 0, 0 };
if (CVarGetInteger("gCosmetics.Hud_StartButton.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_StartButton.Changed", 0)) {
startButtonColor = CVarGetColor24("gCosmetics.Hud_StartButton.Value", startButtonColor); startButtonColor = CVarGetColor24("gCosmetics.Hud_StartButton.Value", startButtonColor);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
startButtonColor = (Color_RGB8){ 120, 120, 120 }; startButtonColor = (Color_RGB8){ 120, 120, 120 };
} }
@ -4828,7 +4830,7 @@ void Interface_Draw(PlayState* play) {
Color_RGB8 aButtonColor = { 90, 90, 255 }; Color_RGB8 aButtonColor = { 90, 90, 255 };
if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) {
aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor); aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
aButtonColor = (Color_RGB8){ 0, 200, 50 }; aButtonColor = (Color_RGB8){ 0, 200, 50 };
} }

View File

@ -9,6 +9,7 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h"
#include <overlays/actors/ovl_En_Niw/z_en_niw.h> #include <overlays/actors/ovl_En_Niw/z_en_niw.h>
#include "soh/Enhancements/enhancementTypes.h"
#include <libultraship/libultraship.h> #include <libultraship/libultraship.h>
@ -644,7 +645,7 @@ void Play_Init(GameState* thisx) {
Fault_AddClient(&D_801614B8, ZeldaArena_Display, NULL, NULL); Fault_AddClient(&D_801614B8, ZeldaArena_Display, NULL, NULL);
// In order to keep bunny hood equipped on first load, we need to pre-set the age reqs for the item and slot // In order to keep bunny hood equipped on first load, we need to pre-set the age reqs for the item and slot
if (CVarGetInteger("gMMBunnyHood", 0) || CVarGetInteger("gTimelessEquipment", 0)) { if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || CVarGetInteger("gTimelessEquipment", 0)) {
gItemAgeReqs[ITEM_MASK_BUNNY] = 9; gItemAgeReqs[ITEM_MASK_BUNNY] = 9;
if(INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_MASK_BUNNY) if(INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_MASK_BUNNY)
gSlotAgeReqs[SLOT_TRADE_CHILD] = 9; gSlotAgeReqs[SLOT_TRADE_CHILD] = 9;
@ -1177,7 +1178,7 @@ void Play_Update(PlayState* play) {
gSaveContext.sohStats.sceneTimer++; gSaveContext.sohStats.sceneTimer++;
gSaveContext.sohStats.roomTimer++; gSaveContext.sohStats.roomTimer++;
if (CVarGetInteger("gMMBunnyHood", 0) && Player_GetMask(play) == PLAYER_MASK_BUNNY) { if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA && Player_GetMask(play) == PLAYER_MASK_BUNNY) {
gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD]++; gSaveContext.sohStats.count[COUNT_TIME_BUNNY_HOOD]++;
} }
} }
@ -2287,7 +2288,7 @@ void Play_PerformSave(PlayState* play) {
} else { } else {
Save_SaveFile(); Save_SaveFile();
} }
if (CVarGetInteger("gAutosave", 0)) { if (CVarGetInteger("gAutosave", AUTOSAVE_OFF) != AUTOSAVE_OFF) {
Overlay_DisplayText(3.0f, "Game Saved"); Overlay_DisplayText(3.0f, "Game Saved");
} }
} }

View File

@ -2548,7 +2548,7 @@ void BossTw_DeathCSMsgSfx(BossTw* this, PlayState* play) {
Math_ApproachF(&this->workf[UNK_F18], 255.0f, 0.1f, 5.0f); Math_ApproachF(&this->workf[UNK_F18], 255.0f, 0.1f, 5.0f);
} }
// Add seperate timings for the "beam" that opens and closes around the sisters // Add separate timings for the "beam" that opens and closes around the sisters
// Needed because we skip ahead in cutscene timer value so it never gets called otherwise // Needed because we skip ahead in cutscene timer value so it never gets called otherwise
if (gSaveContext.n64ddFlag || gSaveContext.isBossRush) { if (gSaveContext.n64ddFlag || gSaveContext.isBossRush) {
if (this->work[CS_TIMER_2] < 900) { if (this->work[CS_TIMER_2] < 900) {

View File

@ -1,6 +1,7 @@
#include "z_en_box.h" #include "z_en_box.h"
#include "objects/object_box/object_box.h" #include "objects/object_box/object_box.h"
#include "soh_assets.h" #include "soh_assets.h"
#include "soh/Enhancements/enhancementTypes.h"
#define FLAGS 0 #define FLAGS 0
@ -632,11 +633,11 @@ void EnBox_Update(Actor* thisx, PlayState* play) {
void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) { void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
EnBox_CreateExtraChestTextures(); EnBox_CreateExtraChestTextures();
int cstmc = CVarGetInteger("gChestSizeAndTextureMatchesContents", 0); int csmc = CVarGetInteger("gChestSizeAndTextureMatchesContents", CSMC_DISABLED);
int requiresStoneAgony = CVarGetInteger("gChestSizeDependsStoneOfAgony", 0); int requiresStoneAgony = CVarGetInteger("gChestSizeDependsStoneOfAgony", 0);
GetItemCategory getItemCategory; GetItemCategory getItemCategory;
int isVanilla = cstmc == 0 || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)) || int isVanilla = csmc == CSMC_DISABLED || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)) ||
(play->sceneNum == SCENE_TAKARAYA && this->dyna.actor.room != 6); // Exclude treasure game chests except for the final room (play->sceneNum == SCENE_TAKARAYA && this->dyna.actor.room != 6); // Exclude treasure game chests except for the final room
if (!isVanilla) { if (!isVanilla) {
@ -656,7 +657,7 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
} }
// Change size // Change size
if (!isVanilla && (cstmc == 1 || cstmc == 3)) { if (!isVanilla && (csmc == CSMC_BOTH || csmc == CSMC_SIZE)) {
switch (getItemCategory) { switch (getItemCategory) {
case ITEM_CATEGORY_JUNK: case ITEM_CATEGORY_JUNK:
case ITEM_CATEGORY_SMALL_KEY: case ITEM_CATEGORY_SMALL_KEY:
@ -685,7 +686,7 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
} }
// Change texture // Change texture
if (!isVanilla && (cstmc == 1 || cstmc == 2)) { if (!isVanilla && (csmc == CSMC_BOTH || csmc == CSMC_TEXTURE)) {
switch (getItemCategory) { switch (getItemCategory) {
case ITEM_CATEGORY_MAJOR: case ITEM_CATEGORY_MAJOR:
this->boxBodyDL = gGoldTreasureChestChestFrontDL; this->boxBodyDL = gGoldTreasureChestChestFrontDL;

View File

@ -14,6 +14,7 @@
#include "objects/object_masterzoora/object_masterzoora.h" #include "objects/object_masterzoora/object_masterzoora.h"
#include "objects/object_masterkokirihead/object_masterkokirihead.h" #include "objects/object_masterkokirihead/object_masterkokirihead.h"
#include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h"
#include "soh/Enhancements/cosmetics/cosmeticsTypes.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED) #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED)
@ -1939,7 +1940,7 @@ void EnOssan_UpdateCursorAnim(EnOssan* this) {
Color_RGB8 aButtonColor = { 0, 80, 255 }; Color_RGB8 aButtonColor = { 0, 80, 255 };
if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) {
aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor); aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
aButtonColor = (Color_RGB8){ 0, 255, 80 }; aButtonColor = (Color_RGB8){ 0, 255, 80 };
} }
f32 t; f32 t;

View File

@ -25,6 +25,7 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h"
#include <overlays/actors/ovl_En_Partner/z_en_partner.h> #include <overlays/actors/ovl_En_Partner/z_en_partner.h>
#include "soh/Enhancements/enhancementTypes.h"
typedef enum { typedef enum {
/* 0x00 */ KNOB_ANIM_ADULT_L, /* 0x00 */ KNOB_ANIM_ADULT_L,
@ -2049,7 +2050,7 @@ void func_80833DF8(Player* this, PlayState* play) {
s32 i; s32 i;
if (this->currentMask != PLAYER_MASK_NONE) { if (this->currentMask != PLAYER_MASK_NONE) {
if (CVarGetInteger("gMMBunnyHood", 0) != 0) { if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA) {
s32 maskItem = this->currentMask - PLAYER_MASK_KEATON + ITEM_MASK_KEATON; s32 maskItem = this->currentMask - PLAYER_MASK_KEATON + ITEM_MASK_KEATON;
bool hasOnDpad = false; bool hasOnDpad = false;
if (CVarGetInteger("gDpadEquips", 0) != 0) { if (CVarGetInteger("gDpadEquips", 0) != 0) {
@ -6119,7 +6120,7 @@ void func_8083DFE0(Player* this, f32* arg1, s16* arg2) {
} }
} }
if (CVarGetInteger("gMMBunnyHood", 0) == 1 && this->currentMask == PLAYER_MASK_BUNNY) { if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) == BUNNY_HOOD_FAST_AND_JUMP && this->currentMask == PLAYER_MASK_BUNNY) {
maxSpeed *= 1.5f; maxSpeed *= 1.5f;
} }
@ -7761,7 +7762,7 @@ void func_80842180(Player* this, PlayState* play) {
} }
} }
if (CVarGetInteger("gMMBunnyHood", 0) && this->currentMask == PLAYER_MASK_BUNNY) { if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA && this->currentMask == PLAYER_MASK_BUNNY) {
sp2C *= 1.5f; sp2C *= 1.5f;
} }
@ -9664,7 +9665,7 @@ void Player_Init(Actor* thisx, PlayState* play2) {
func_80835F44(play, this, ITEM_NONE); func_80835F44(play, this, ITEM_NONE);
Player_SetEquipmentData(play, this); Player_SetEquipmentData(play, this);
this->prevBoots = this->currentBoots; this->prevBoots = this->currentBoots;
if (CVarGetInteger("gMMBunnyHood", 0)) { if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA) {
if (INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_SOLD_OUT) { if (INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_SOLD_OUT) {
sMaskMemory = PLAYER_MASK_NONE; sMaskMemory = PLAYER_MASK_NONE;
} }

View File

@ -13,6 +13,7 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/boss-rush/BossRush.h" #include "soh/Enhancements/boss-rush/BossRush.h"
#include "soh/Enhancements/custom-message/CustomMessageTypes.h" #include "soh/Enhancements/custom-message/CustomMessageTypes.h"
#include "soh/Enhancements/enhancementTypes.h"
#define MIN_QUEST (ResourceMgr_GameHasOriginal() ? FS_QUEST_NORMAL : FS_QUEST_MASTER) #define MIN_QUEST (ResourceMgr_GameHasOriginal() ? FS_QUEST_NORMAL : FS_QUEST_MASTER)
#define MAX_QUEST FS_QUEST_BOSSRUSH #define MAX_QUEST FS_QUEST_BOSSRUSH
@ -2497,15 +2498,15 @@ void FileChoose_Main(GameState* thisx) {
gSaveContext.skyboxTime += 0x10; gSaveContext.skyboxTime += 0x10;
} }
if (CVarGetInteger("gSkipLogoTitle", 0) && CVarGetInteger("gSaveFileID", 0) < 3 && !isFastFileIdIncompatible) { if (CVarGetInteger("gSkipLogoTitle", 0) && CVarGetInteger("gSaveFileID", FASTFILE_1) <= FASTFILE_3 && !isFastFileIdIncompatible) {
if (Save_Exist(CVarGetInteger("gSaveFileID", 0)) && FileChoose_IsSaveCompatible(Save_GetSaveMetaInfo(CVarGetInteger("gSaveFileID", 0)))) { if (Save_Exist(CVarGetInteger("gSaveFileID", FASTFILE_1)) && FileChoose_IsSaveCompatible(Save_GetSaveMetaInfo(CVarGetInteger("gSaveFileID", FASTFILE_1)))) {
this->buttonIndex = CVarGetInteger("gSaveFileID", 0); this->buttonIndex = CVarGetInteger("gSaveFileID", FASTFILE_1);
this->menuMode = FS_MENU_MODE_SELECT; this->menuMode = FS_MENU_MODE_SELECT;
this->selectMode = SM_LOAD_GAME; this->selectMode = SM_LOAD_GAME;
} else { } else {
isFastFileIdIncompatible = 1; isFastFileIdIncompatible = 1;
} }
} else if (CVarGetInteger("gSkipLogoTitle", 0) && CVarGetInteger("gSaveFileID", 0) == 3) { } else if (CVarGetInteger("gSkipLogoTitle", 0) && CVarGetInteger("gSaveFileID", FASTFILE_1) == FASTFILE_MAP_SELECT) {
this->buttonIndex = 0xFF; this->buttonIndex = 0xFF;
this->menuMode = FS_MENU_MODE_SELECT; this->menuMode = FS_MENU_MODE_SELECT;
this->selectMode = SM_LOAD_GAME; this->selectMode = SM_LOAD_GAME;

View File

@ -1,6 +1,7 @@
#include "z_kaleido_scope.h" #include "z_kaleido_scope.h"
#include "textures/parameter_static/parameter_static.h" #include "textures/parameter_static/parameter_static.h"
#include "textures/icon_item_static/icon_item_static.h" #include "textures/icon_item_static/icon_item_static.h"
#include "soh/Enhancements/cosmetics/cosmeticsTypes.h"
extern const char* digitTextures[]; extern const char* digitTextures[];
@ -8,7 +9,7 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) {
Color_RGB8 aButtonColor = { 80, 150, 255 }; Color_RGB8 aButtonColor = { 80, 150, 255 };
if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) {
aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor); aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
aButtonColor = (Color_RGB8){ 80, 255, 150 }; aButtonColor = (Color_RGB8){ 80, 255, 150 };
} }

View File

@ -2,6 +2,7 @@
#include "textures/parameter_static/parameter_static.h" #include "textures/parameter_static/parameter_static.h"
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h" #include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
#include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/randomizer/randomizerTypes.h"
#include "soh/Enhancements/enhancementTypes.h"
u8 gAmmoItems[] = { u8 gAmmoItems[] = {
ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_NONE, ITEM_NONE, ITEM_SLINGSHOT, ITEM_NONE, ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_NONE, ITEM_NONE, ITEM_SLINGSHOT, ITEM_NONE,
@ -401,7 +402,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
gSelectingMask = cursorSlot == SLOT_TRADE_CHILD; gSelectingMask = cursorSlot == SLOT_TRADE_CHILD;
gSlotAgeReqs[SLOT_TRADE_CHILD] = gItemAgeReqs[ITEM_MASK_BUNNY] = gSlotAgeReqs[SLOT_TRADE_CHILD] = gItemAgeReqs[ITEM_MASK_BUNNY] =
((CVarGetInteger("gMMBunnyHood", 0) || CVarGetInteger("gTimelessEquipment", 0)) && ((CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || CVarGetInteger("gTimelessEquipment", 0)) &&
INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_MASK_BUNNY) INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_MASK_BUNNY)
? 9 ? 9
: 1; : 1;

View File

@ -16,6 +16,7 @@
#include "soh/frame_interpolation.h" #include "soh/frame_interpolation.h"
#include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h"
#include "soh/Enhancements/cosmetics/cosmeticsTypes.h"
static void* sEquipmentFRATexs[] = { static void* sEquipmentFRATexs[] = {
gPauseEquipment00FRATex, gPauseEquipment01Tex, gPauseEquipment02Tex, gPauseEquipment03Tex, gPauseEquipment04Tex, gPauseEquipment00FRATex, gPauseEquipment01Tex, gPauseEquipment02Tex, gPauseEquipment03Tex, gPauseEquipment04Tex,
@ -999,7 +1000,7 @@ void KaleidoScope_DrawCursor(PlayState* play, u16 pageIndex) {
if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) {
sCursorColors[2] = CVarGetColor24("gCosmetics.Hud_AButton.Value", sCursorColors[2]); sCursorColors[2] = CVarGetColor24("gCosmetics.Hud_AButton.Value", sCursorColors[2]);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
sCursorColors[2] = (Color_RGB8){ 0, 255, 50 }; sCursorColors[2] = (Color_RGB8){ 0, 255, 50 };
} }
@ -1082,7 +1083,7 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor); aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor);
D_8082ACF4[8] = CVarGetColor24("gCosmetics.Hud_AButton.Value", D_8082ACF4[8]); D_8082ACF4[8] = CVarGetColor24("gCosmetics.Hud_AButton.Value", D_8082ACF4[8]);
D_8082ACF4[11] = CVarGetColor24("gCosmetics.Hud_AButton.Value", D_8082ACF4[11]); D_8082ACF4[11] = CVarGetColor24("gCosmetics.Hud_AButton.Value", D_8082ACF4[11]);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
aButtonColor = (Color_RGB8){ 100, 255, 100 }; aButtonColor = (Color_RGB8){ 100, 255, 100 };
D_8082ACF4[8] = (Color_RGB8){ 0, 255, 50 }; D_8082ACF4[8] = (Color_RGB8){ 0, 255, 50 };
D_8082ACF4[11] = (Color_RGB8){ 0, 255, 50 }; D_8082ACF4[11] = (Color_RGB8){ 0, 255, 50 };
@ -1540,7 +1541,7 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) {
Color_RGB8 aButtonColor = { 0, 100, 255 }; Color_RGB8 aButtonColor = { 0, 100, 255 };
if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) { if (CVarGetInteger("gCosmetics.Hud_AButton.Changed", 0)) {
aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor); aButtonColor = CVarGetColor24("gCosmetics.Hud_AButton.Value", aButtonColor);
} else if (CVarGetInteger("gCosmetics.DefaultColorScheme", 0)) { } else if (CVarGetInteger("gCosmetics.DefaultColorScheme", COLORSCHEME_N64) == COLORSCHEME_GAMECUBE) {
aButtonColor = (Color_RGB8){ 0, 255, 100 }; aButtonColor = (Color_RGB8){ 0, 255, 100 };
} }