diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index c6303376..6e6ff5ab 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -251,6 +251,7 @@ + diff --git a/Assets.Scripts.Core.Buriko/BurikoScriptFile.cs b/Assets.Scripts.Core.Buriko/BurikoScriptFile.cs index a638e493..76b69428 100644 --- a/Assets.Scripts.Core.Buriko/BurikoScriptFile.cs +++ b/Assets.Scripts.Core.Buriko/BurikoScriptFile.cs @@ -2782,6 +2782,11 @@ private void ShowSetupMenuIfRequired() { GameSystem.Instance.MainUIController.modMenu.PushSubMenuAndShow(ModSubMenu.AudioSetup); } + + if (!MODWindowManager.FullscreenLockConfigured()) + { + GameSystem.Instance.MainUIController.modMenu.PushSubMenuAndShow(ModSubMenu.WindowSetup); + } } public BurikoVariable OperationMODGenericCall() diff --git a/MOD.Scripts.Core/MODWindowManager.cs b/MOD.Scripts.Core/MODWindowManager.cs index 3817eea2..4641977a 100644 --- a/MOD.Scripts.Core/MODWindowManager.cs +++ b/MOD.Scripts.Core/MODWindowManager.cs @@ -73,7 +73,7 @@ public static void RefreshWindowAspect(bool showToast = false) SetResolution(maybe_width: null, maybe_height: null, maybe_fullscreen: null, showToast: showToast); } - private static void SetResolution(int? maybe_width, int? maybe_height, bool? maybe_fullscreen, bool showToast=false) + public static void SetResolution(int? maybe_width, int? maybe_height, bool? maybe_fullscreen, bool showToast=false) { int height = 480; int width = 640; @@ -151,9 +151,14 @@ private static void SetResolution(int? maybe_width, int? maybe_height, bool? may // Update playerprefs (won't be saved until game exits or PlayerPrefs.Save() is called SetPlayerPrefs(); - if(showToast) + if (showToast) { - MODToaster.Show($"Set Res: {width}x{height}"); + string prefix = "Set Res"; + if(maybe_fullscreen == false && FullscreenLocked()) + { + prefix = "Fullscreen Locked"; + } + MODToaster.Show($"{prefix}: {width}x{height}"); } } @@ -209,6 +214,7 @@ public static void GameSystemInitSetResolution() if (PlayerPrefsNeedsReset()) { + ForceUnconfigureFullscreenLock(); // TODO: could fully reset playerprefs by calling PlayerPrefs.DeleteAll(), but not sure if such drastic measures are necessary? GoFullscreen(); Debug.Log("WARNING: Crash or corrupted playerprefs detected. Reverting to fullscreen mode!"); @@ -288,6 +294,10 @@ public static void OnApplicationReallyQuit(string context) public static void SetFullScreenLock(bool enableLock) { PlayerPrefs.SetInt(FULLSCREEN_LOCK_KEY, enableLock ? 1 : 0); + if(FullscreenLocked()) + { + GoFullscreen(); + } } public static bool FullscreenLocked() @@ -299,6 +309,10 @@ public static bool FullscreenLockConfigured() { return PlayerPrefs.HasKey(FULLSCREEN_LOCK_KEY); } + public static void ForceUnconfigureFullscreenLock() + { + PlayerPrefs.DeleteKey(FULLSCREEN_LOCK_KEY); + } private static Resolution GetFullscreenResolution() { diff --git a/MOD.Scripts.UI/MODMenu.cs b/MOD.Scripts.UI/MODMenu.cs index ad8e6929..c759cf1b 100644 --- a/MOD.Scripts.UI/MODMenu.cs +++ b/MOD.Scripts.UI/MODMenu.cs @@ -17,6 +17,7 @@ public enum ModSubMenu { Normal, AudioSetup, + WindowSetup, } public class MODMenu @@ -67,6 +68,7 @@ public bool TryPop() private MODMenuNormal normalMenu; private MODMenuAudioOptions audioOptionsMenu; private MODMenuAudioSetup audioSetupMenu; + private MODSubMenuWindowSetup windowSetupMenu; private SubMenuManager subMenuManager; @@ -103,6 +105,7 @@ public MODMenu(GameSystem gameSystem) this.audioOptionsMenu = new MODMenuAudioOptions(this); this.normalMenu = new MODMenuNormal(this, this.audioOptionsMenu); this.audioSetupMenu = new MODMenuAudioSetup(this, this.audioOptionsMenu); + this.windowSetupMenu = new MODSubMenuWindowSetup(this, this.normalMenu); subMenuManager = new SubMenuManager(this.normalMenu); @@ -372,8 +375,8 @@ public void PushSubMenuAndShow(ModSubMenu subMenu) subMenuToPush = audioSetupMenu; break; - case ModSubMenu.ResolutionSetup: - subMenuToPush = resolutionSetupMenu; + case ModSubMenu.WindowSetup: + subMenuToPush = windowSetupMenu; break; case ModSubMenu.Normal: diff --git a/MOD.Scripts.UI/MODMenuAudioSetup.cs b/MOD.Scripts.UI/MODMenuAudioSetup.cs index d1aed0de..4bcf4a68 100644 --- a/MOD.Scripts.UI/MODMenuAudioSetup.cs +++ b/MOD.Scripts.UI/MODMenuAudioSetup.cs @@ -38,7 +38,7 @@ public void OnGUI() } public bool UserCanClose() => false; - public string Heading() => "First-Time Setup Menu"; + public string Heading() => "Audio Setup Menu"; public string DefaultTooltip() => "Please choose the options on the left before continuing. You can hover over a button to view its description."; } } diff --git a/MOD.Scripts.UI/MODMenuNormal.cs b/MOD.Scripts.UI/MODMenuNormal.cs index 1180b3e7..7391010f 100644 --- a/MOD.Scripts.UI/MODMenuNormal.cs +++ b/MOD.Scripts.UI/MODMenuNormal.cs @@ -1,4 +1,5 @@ using Assets.Scripts.Core; +using MOD.Scripts.Core; using MOD.Scripts.Core.Audio; using System; using System.Collections.Generic; @@ -31,6 +32,7 @@ class MODMenuNormal : MODMenuModuleInterface private readonly MODRadio radioStretchBackgrounds; private readonly MODRadio radioTextWindowModeAndCrop; private readonly MODRadio radioForceComputedLipsync; + private readonly MODRadio radioFullscreenLock; private readonly MODTabControl tabControl; @@ -136,6 +138,11 @@ Sets the script censorship level new GUIContent("Computed Always", "Always use computed lipsync for all voices. Any 'spectrum' files will be ignored.") }); + radioFullscreenLock = new MODRadio("Fullscreen Lock", new GUIContent[] { + new GUIContent("No Lock", "Allow switching to Windowed mode at any time"), + new GUIContent("Force Fullscreen Always", "Force fullscreen mode always - do not allow switching to windowed mode.") + }); + tabControl = new MODTabControl(new List { new MODTabControl.TabProperties("Gameplay", "Voice Matching and Opening Videos", GameplayTabOnGUI), @@ -282,6 +289,8 @@ private void GraphicsTabOnGUI() HeadingLabel("Resolution"); resolutionMenu.OnGUI(); + + OnGUIFullscreenLock(); } private void GameplayTabOnGUI() @@ -485,6 +494,23 @@ private void OnGUIComputedLipsync() } } + public void OnGUIFullscreenLock() + { + HeadingLabel("Fullscreen Lock"); + + int currentValue = -1; + if(MODWindowManager.FullscreenLockConfigured()) + { + currentValue = MODWindowManager.FullscreenLocked() ? 1 : 0; + } + + if (this.radioFullscreenLock.OnGUIFragment(currentValue) is int newFullscreenlock) + { + MODWindowManager.SetFullScreenLock(newFullscreenlock == 0 ? false : true); + MODToaster.Show(MODWindowManager.FullscreenLocked() ? "Fullscreen lock enabled" : "Fullscreen lock disabled"); + } + } + public bool UserCanClose() => true; public string Heading() => "Mod Options Menu"; diff --git a/MOD.Scripts.UI/MODSubMenuWindowSetup.cs b/MOD.Scripts.UI/MODSubMenuWindowSetup.cs new file mode 100644 index 00000000..3e9e75a0 --- /dev/null +++ b/MOD.Scripts.UI/MODSubMenuWindowSetup.cs @@ -0,0 +1,75 @@ +using MOD.Scripts.Core; +using System; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using static MOD.Scripts.UI.MODMenuCommon; + +namespace MOD.Scripts.UI +{ + class MODSubMenuWindowSetup : MODMenuModuleInterface + { + MODMenu modMenu; + MODMenuNormal normalMenu; + + public MODSubMenuWindowSetup(MODMenu modMenu, MODMenuNormal normalMenu) + { + this.modMenu = modMenu; + this.normalMenu = normalMenu; + } + + public void OnBeforeMenuVisible() + { + + } + + public void OnGUI() + { + HeadingLabel("Linux Resolution/Windowed Mode Setup"); + + GUILayout.Space(20); + + Label("Some Native Linux users experience crashes or softlocks when entering windowed mode, or when moving the window around (the 'Gnome Crash Bug').\n\n" + + "Please click the button below to enter windowed mode, then drag the window around."); + + GUILayout.Space(20); + + if(Button( + new GUIContent( + "Click here to test Windowed Mode", + "This button will switch the game to Windowed mode.\n\n" + + "Please try moving the window around to see if the game crashes\n\n" + + "If the game freezes, you may need to force close it and open the game again." + ))) + { + MODWindowManager.SetResolution(maybe_width: null, maybe_height: null, maybe_fullscreen: false, showToast: true); + } + + GUILayout.Space(20); + + Label("If your game crashed in windowed mode, choose 'Force Fullscreen Always'. Otherwise choose 'No Lock'"); + + GUILayout.Space(20); + + normalMenu.OnGUIFullscreenLock(); + + GUILayout.Space(20); + + if (MODWindowManager.FullscreenLockConfigured()) + { + if(Button(new GUIContent("Click here when you're finished."))) + { + modMenu.PopSubMenu(); + } + } + else + { + Label("You must choose an option to continue."); + } + } + + public bool UserCanClose() => false; + public string Heading() => "Linux Resolution/Windowed Mode Setup Menu"; + public string DefaultTooltip() => "Please choose the options on the left before continuing. You can hover over a button to view its description."; + } +}