// // SohGui.cpp // soh // // Created by David Chavez on 24.08.22. // #include "SohGui.hpp" #include #ifndef IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS #endif #include #include #include #include #ifdef __APPLE__ #include "graphic/Fast3D/gfx_metal.h" #endif #ifdef __SWITCH__ #include #endif #include "UIWidgets.hpp" #include "include/global.h" #include "include/z64audio.h" #include "soh/SaveManager.h" #include "OTRGlobals.h" #include "soh/Enhancements/presets.h" #include "soh/resource/type/Skeleton.h" #include "libultraship/libultraship.h" #ifdef ENABLE_REMOTE_CONTROL #include "Enhancements/crowd-control/CrowdControl.h" #include "Enhancements/game-interactor/GameInteractor_Sail.h" #endif #include "Enhancements/game-interactor/GameInteractor.h" #include "Enhancements/cosmetics/authenticGfxPatches.h" #include "Enhancements/resolution-editor/ResolutionEditor.h" #include "Enhancements/debugger/MessageViewer.h" bool ToggleAltAssetsAtEndOfFrame = false; bool isBetaQuestEnabled = false; extern "C" { void enableBetaQuest() { isBetaQuestEnabled = true; } void disableBetaQuest() { isBetaQuestEnabled = false; } } namespace SohGui { // MARK: - Properties static const char* chestSizeAndTextureMatchesContentsOptions[4] = { "Disabled", "Both", "Texture Only", "Size Only" }; static const char* bunnyHoodOptions[3] = { "Disabled", "Faster Run & Longer Jump", "Faster Run" }; static const char* allPowers[9] = { "Vanilla (1x)", "Double (2x)", "Quadruple (4x)", "Octuple (8x)", "Foolish (16x)", "Ridiculous (32x)", "Merciless (64x)", "Pure Torture (128x)", "OHKO (256x)" }; static const char* subPowers[8] = { allPowers[0], allPowers[1], allPowers[2], allPowers[3], allPowers[4], allPowers[5], allPowers[6], allPowers[7] }; static const char* subSubPowers[7] = { allPowers[0], allPowers[1], allPowers[2], allPowers[3], allPowers[4], allPowers[5], allPowers[6] }; static const char* zFightingOptions[3] = { "Disabled", "Consistent Vanish", "No Vanish" }; static const char* autosaveLabels[6] = { "Off", "New Location + Major Item", "New Location + Any Item", "New Location", "Major Item", "Any Item" }; static const char* FastFileSelect[5] = { "File N.1", "File N.2", "File N.3", "Zelda Map Select (require OoT Debug Mode)", "File select" }; static const char* bonkDamageValues[8] = { "No Damage", "0.25 Heart", "0.5 Heart", "1 Heart", "2 Hearts", "4 Hearts", "8 Hearts", "OHKO" }; static const inline std::vector> audioBackends = { #ifdef _WIN32 { "wasapi", "Windows Audio Session API" }, #endif #if defined(__linux) { "pulse", "PulseAudio" }, #endif { "sdl", "SDL Audio" } }; // MARK: - Helpers std::string GetWindowButtonText(const char* text, bool menuOpen) { char buttonText[100] = ""; if (menuOpen) { strcat(buttonText, ICON_FA_CHEVRON_RIGHT " "); } strcat(buttonText, text); if (!menuOpen) { strcat(buttonText, " "); } return buttonText; } // MARK: - Delegates std::shared_ptr mSohMenuBar; std::shared_ptr mConsoleWindow; std::shared_ptr mStatsWindow; std::shared_ptr mInputEditorWindow; std::shared_ptr mAudioEditorWindow; std::shared_ptr mInputViewer; std::shared_ptr mInputViewerSettings; std::shared_ptr mCosmeticsEditorWindow; std::shared_ptr mActorViewerWindow; std::shared_ptr mColViewerWindow; std::shared_ptr mSaveEditorWindow; std::shared_ptr mDLViewerWindow; std::shared_ptr mValueViewerWindow; std::shared_ptr mMessageViewerWindow; std::shared_ptr mGameplayStatsWindow; std::shared_ptr mCheckTrackerSettingsWindow; std::shared_ptr mCheckTrackerWindow; std::shared_ptr mEntranceTrackerWindow; std::shared_ptr mItemTrackerSettingsWindow; std::shared_ptr mItemTrackerWindow; std::shared_ptr mRandomizerSettingsWindow; std::shared_ptr mAdvancedResolutionSettingsWindow; std::shared_ptr mModalWindow; void SetupGuiElements() { auto gui = LUS::Context::GetInstance()->GetWindow()->GetGui(); mSohMenuBar = std::make_shared("gOpenMenuBar", CVarGetInteger("gOpenMenuBar", 0)); gui->SetMenuBar(std::reinterpret_pointer_cast(mSohMenuBar)); if (gui->GetMenuBar() && !gui->GetMenuBar()->IsVisible()) { #if defined(__SWITCH__) || defined(__WIIU__) gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press - to access enhancements menu"); #else gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press F1 to access enhancements menu"); #endif } mStatsWindow = gui->GetGuiWindow("Stats"); if (mStatsWindow == nullptr) { SPDLOG_ERROR("Could not find stats window"); } mConsoleWindow = gui->GetGuiWindow("Console"); if (mConsoleWindow == nullptr) { SPDLOG_ERROR("Could not find console window"); } mInputEditorWindow = gui->GetGuiWindow("Input Editor"); if (mInputEditorWindow == nullptr) { SPDLOG_ERROR("Could not find input editor window"); } mAudioEditorWindow = std::make_shared("gAudioEditor.WindowOpen", "Audio Editor"); gui->AddGuiWindow(mAudioEditorWindow); mInputViewer = std::make_shared("gOpenWindows.InputViewer", "Input Viewer"); gui->AddGuiWindow(mInputViewer); mInputViewerSettings = std::make_shared("gOpenWindows.InputViewerSettings", "Input Viewer Settings"); gui->AddGuiWindow(mInputViewerSettings); mCosmeticsEditorWindow = std::make_shared("gCosmeticsEditorEnabled", "Cosmetics Editor"); gui->AddGuiWindow(mCosmeticsEditorWindow); mActorViewerWindow = std::make_shared("gActorViewerEnabled", "Actor Viewer"); gui->AddGuiWindow(mActorViewerWindow); mColViewerWindow = std::make_shared("gCollisionViewerEnabled", "Collision Viewer"); gui->AddGuiWindow(mColViewerWindow); mSaveEditorWindow = std::make_shared("gSaveEditorEnabled", "Save Editor"); gui->AddGuiWindow(mSaveEditorWindow); mDLViewerWindow = std::make_shared("gDLViewerEnabled", "Display List Viewer"); gui->AddGuiWindow(mDLViewerWindow); mValueViewerWindow = std::make_shared("gValueViewer.WindowOpen", "Value Viewer"); gui->AddGuiWindow(mValueViewerWindow); mMessageViewerWindow = std::make_shared("gMessageViewerEnabled", "Message Viewer"); gui->AddGuiWindow(mMessageViewerWindow); mGameplayStatsWindow = std::make_shared("gGameplayStatsEnabled", "Gameplay Stats"); gui->AddGuiWindow(mGameplayStatsWindow); mCheckTrackerWindow = std::make_shared("gCheckTrackerEnabled", "Check Tracker"); gui->AddGuiWindow(mCheckTrackerWindow); mCheckTrackerSettingsWindow = std::make_shared("gCheckTrackerSettingsEnabled", "Check Tracker Settings"); gui->AddGuiWindow(mCheckTrackerSettingsWindow); mEntranceTrackerWindow = std::make_shared("gEntranceTrackerEnabled","Entrance Tracker"); gui->AddGuiWindow(mEntranceTrackerWindow); mItemTrackerWindow = std::make_shared("gItemTrackerEnabled", "Item Tracker"); gui->AddGuiWindow(mItemTrackerWindow); mItemTrackerSettingsWindow = std::make_shared("gItemTrackerSettingsEnabled", "Item Tracker Settings"); gui->AddGuiWindow(mItemTrackerSettingsWindow); mRandomizerSettingsWindow = std::make_shared("gRandomizerSettingsEnabled", "Randomizer Settings"); gui->AddGuiWindow(mRandomizerSettingsWindow); mAdvancedResolutionSettingsWindow = std::make_shared("gAdvancedResolutionEditorEnabled", "Advanced Resolution Settings"); gui->AddGuiWindow(mAdvancedResolutionSettingsWindow); mModalWindow = std::make_shared("gOpenWindows.modalWindowEnabled", "Modal Window"); gui->AddGuiWindow(mModalWindow); mModalWindow->Show(); } void Destroy() { mModalWindow = nullptr; mAdvancedResolutionSettingsWindow = nullptr; mRandomizerSettingsWindow = nullptr; mItemTrackerWindow = nullptr; mItemTrackerSettingsWindow = nullptr; mEntranceTrackerWindow = nullptr; mCheckTrackerWindow = nullptr; mCheckTrackerSettingsWindow = nullptr; mGameplayStatsWindow = nullptr; mDLViewerWindow = nullptr; mValueViewerWindow = nullptr; mMessageViewerWindow = nullptr; mSaveEditorWindow = nullptr; mColViewerWindow = nullptr; mActorViewerWindow = nullptr; mCosmeticsEditorWindow = nullptr; mAudioEditorWindow = nullptr; mInputEditorWindow = nullptr; mStatsWindow = nullptr; mConsoleWindow = nullptr; mSohMenuBar = nullptr; mInputViewer = nullptr; mInputViewerSettings = nullptr; } void RegisterPopup(std::string title, std::string message, std::string button1, std::string button2, std::function button1callback, std::function button2callback) { mModalWindow->RegisterPopup(title, message, button1, button2, button1callback, button2callback); } }