diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/AxisLocalization.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/AxisLocalization.cs new file mode 100644 index 0000000..1b9259f --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/AxisLocalization.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization +{ + public class AxisLocalization + { + public static readonly List strings = new List(); + public static readonly List strings_French = new List(); + public static readonly List strings_Italian = new List(); + public static readonly List strings_Japanese = new List(); + public static readonly List strings_Custom = new List(); + + public static void Load() + { + try + { + ReadText(Path.Combine(Application.streamingAssetsPath, "Text"), "", strings); + ReadText(Path.Combine(Application.streamingAssetsPath, "Text"), "_French", strings_French); + ReadText(Path.Combine(Application.streamingAssetsPath, "Text"), "_Italian", strings_Italian); + ReadText(Path.Combine(Application.streamingAssetsPath, "Text"), "_Japanese", strings_Japanese); + ReadText(Path.Combine(Application.streamingAssetsPath, "CustomLanguage/Text"), "", strings_Custom); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + private static void ReadText(string basePath, string suffix, List items) + { + if (items.Count > 0) + { + return; + } + + var path = Path.Combine(basePath, "Axis" + suffix + ".txt"); + + if (!File.Exists(path)) + { + var lines = new List(24); + + for (var i = 0; i < 12; ++i) + { + var axis = "Axis " + (i + 1).ToString(); + + lines.Add(axis + " -"); + lines.Add(axis + " +"); + } + + Directory.CreateDirectory(basePath); + File.WriteAllLines(path, lines.ToArray()); + + return; + } + else + { + var lines = File.ReadAllLines(path); + + if (lines.Length < 24) + { + Console.WriteLine("ERROR: Invalid axis text file. Must have 24 lines."); + return; + } + + for (var i = 0; i < 24; ++i) + { + if (string.IsNullOrEmpty(lines[i])) + { + break; + } + + items.Add(lines[i]); + } + } + } + } +} + diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.csproj b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.csproj new file mode 100644 index 0000000..6e3dc69 --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.csproj @@ -0,0 +1,37 @@ + + + + net35 + BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization + ControlsMenuLocalization + 1.0.0 + true + 9.0 + + + + + + + + + + + + + + + + ..\lib\SteamRelease\Assembly-CSharp.dll + false + + + ..\lib\UnityEngine\UnityEngine.UI.dll + false + + + + + + + diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_CheckForDirectionOverlap.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_CheckForDirectionOverlap.cs new file mode 100644 index 0000000..be8361b --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_CheckForDirectionOverlap.cs @@ -0,0 +1,17 @@ +using HarmonyLib; +using System; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(KeyBindScript), "CheckForDirectionOverlap")] + public class KeyBindScript_CheckForDirectionOverlap + { + // Refresh localization. + public static void Postfix(KeyBindScript __instance) + { + Console.WriteLine("KeyBindScript_CheckForDirectionOverlap.Postfix: Refreshing buttons"); + + __instance.RefreshButtons(); + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_ControllerInput.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_ControllerInput.cs new file mode 100644 index 0000000..ffb2d91 --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_ControllerInput.cs @@ -0,0 +1,17 @@ +using HarmonyLib; +using System; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(KeyBindScript), "ControllerInput")] + public class KeyBindScript_ControllerInput + { + // Refresh localization. + public static void Postfix(KeyBindScript __instance) + { + Console.WriteLine("KeyBindScript_ControllerInput.Postfix: Refreshing buttons"); + + __instance.RefreshButtons(); + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_DpadNames.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_DpadNames.cs new file mode 100644 index 0000000..5506491 --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_DpadNames.cs @@ -0,0 +1,96 @@ +using HarmonyLib; +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(KeyBindScript), "DpadNames")] + public class KeyBindScript_DpadNames + { + // Apply custom localization to axii buttons. + public static void Postfix(KeyBindScript __instance + , ref Settings ___settings + ) + { + Console.WriteLine("KeyBindScript_DpadNames.Postfix: Refreshing buttons"); + + if (___settings.keyboardAlt != 0) + { + return; + } + + if (___settings.horizontalAxis == 0) + { + __instance.leftButton.transform.GetChild(0).GetComponent().text = KeyBindScript_RefreshButtons.GetString(KeyCode.LeftArrow, ___settings); + __instance.rightButton.transform.GetChild(0).GetComponent().text = KeyBindScript_RefreshButtons.GetString(KeyCode.RightArrow, ___settings); + } + else + { + __instance.leftButton.transform.GetChild(0).GetComponent().text = GetString(___settings.horizontalAxis * -1, ___settings); + __instance.rightButton.transform.GetChild(0).GetComponent().text = GetString(___settings.horizontalAxis, ___settings); + } + + if (___settings.verticalAxis == 0) + { + __instance.upButton.transform.GetChild(0).GetComponent().text = KeyBindScript_RefreshButtons.GetString(KeyCode.UpArrow, ___settings); + __instance.downButton.transform.GetChild(0).GetComponent().text = KeyBindScript_RefreshButtons.GetString(KeyCode.DownArrow, ___settings); + } + else + { + __instance.upButton.transform.GetChild(0).GetComponent().text = GetString(___settings.verticalAxis, ___settings); + __instance.downButton.transform.GetChild(0).GetComponent().text = GetString(___settings.verticalAxis * -1, ___settings); + } + } + + public static string GetString(int axis, Settings settings) + { + var negative = axis < 0; + var strings = (List)null; + + if (settings.language == 0) + { + strings = AxisLocalization.strings; + } + else if (settings.language == 1) + { + strings = AxisLocalization.strings_French; + } + else if (settings.language == 2) + { + strings = AxisLocalization.strings_Italian; + } + else if (settings.language == 3) + { + strings = AxisLocalization.strings_Japanese; + } + else + { + strings = AxisLocalization.strings_Custom; + } + + if (strings is null) + { + Console.WriteLine("KeyBindScript_DpadNames.GetString: localization strings not ready yet!"); + } + + if (axis < 0) + { +#pragma warning disable Harmony003 // Harmony non-ref patch parameters modified + axis = -axis; +#pragma warning restore Harmony003 // Harmony non-ref patch parameters modified + } + + if (strings != null + && (axis - 1) < strings.Count / 2) + { + return strings[((axis - 1) * 2) + (negative ? 0 : 1)]; + } + else + { + return "Axis " + axis + " " + (negative ? "-" : "+"); + } + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_RefreshButtons.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_RefreshButtons.cs new file mode 100644 index 0000000..f6bbc20 --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_RefreshButtons.cs @@ -0,0 +1,111 @@ +using HarmonyLib; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using UnityEngine; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(KeyBindScript), "RefreshButtons")] + public class KeyBindScript_RefreshButtons + { + public static readonly Regex splitRegex = new Regex("([A-Z]+(?![a-z])|[A-Z][a-z]+|[0-9]+|[a-z]+)"); + + // Ensure settings is assigned to a valid value. + public static void Prefix(KeyBindScript __instance + , ref Settings ___settings + ) + { + if (___settings is null) + { + Console.WriteLine("KeyBindScript_RefreshButtons.Prefix: settings is null! Auto fixing..."); + + ___settings = ProgressManager.instance.GetComponent(); + } + } + + // Apply custom localization to key buttons. + public static void Postfix(KeyBindScript __instance + , ref Settings ___settings + ) + { + Console.WriteLine("KeyBindScript_RefreshButtons.Postfix: Localizing labels"); + + __instance.action.text = GetString(___settings.keys["Action"], ___settings); + __instance.cancel.text = GetString(___settings.keys["Cancel"], ___settings); + __instance.sprint.text = GetString(___settings.keys["Sprint"], ___settings); + __instance.switchWeapon.text = GetString(___settings.keys["SwitchWeapon"], ___settings); + __instance.aim.text = GetString(___settings.keys["Aim"], ___settings); + __instance.submit.text = GetString(___settings.keys["Submit"], ___settings); + __instance.select.text = GetString(___settings.keys["Select"], ___settings); + __instance.special.text = GetString(___settings.keys["Special"], ___settings); + __instance.reload.text = GetString(___settings.keys["Reload"], ___settings); + } + + public static string GetString(KeyCode key, Settings settings) + { + var strings = (Dictionary)null; + + if (settings.language == 0) + { + strings = KeyCodeLocalization.strings; + } + else if (settings.language == 1) + { + strings = KeyCodeLocalization.strings_French; + } + else if (settings.language == 2) + { + strings = KeyCodeLocalization.strings_Italian; + } + else if (settings.language == 3) + { + strings = KeyCodeLocalization.strings_Japanese; + } + else + { + strings = KeyCodeLocalization.strings_Custom; + } + + if (strings is null) + { + Console.WriteLine("KeyBindScript_RefreshButtons.GetString: localization strings not ready yet!"); + } + + if (strings != null + && strings.ContainsKey(key)) + { + return strings[key]; + } + else + { +#pragma warning disable Harmony003 // Harmony non-ref patch parameters modified + var name = key.ToString(); +#pragma warning restore Harmony003 // Harmony non-ref patch parameters modified + + if (settings.xboxType) + { + name = name + .Replace("JoystickButton0", "ButtonA") + .Replace("JoystickButton1", "ButtonB") + .Replace("JoystickButton2", "ButtonX") + .Replace("JoystickButton3", "ButtonY") + .Replace("JoystickButton4", "ButtonLB") + .Replace("JoystickButton5", "ButtonRB") + .Replace("JoystickButton6", "ButtonBack") + .Replace("JoystickButton7", "ButtonStart") + .Replace("JoystickButton8", "ButtonLS") + .Replace("JoystickButton9", "ButtonRS") + ; + } + + name = name + .Replace("Alpha", "") + .Replace("Joystick", "") + ; + + return string.Join(" ", splitRegex.Split(name)); + } + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_ResetToDefault.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_ResetToDefault.cs new file mode 100644 index 0000000..d4ecc5e --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_ResetToDefault.cs @@ -0,0 +1,17 @@ +using HarmonyLib; +using System; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(KeyBindScript), "ResetToDefault")] + public class KeyBindScript_ResetToDefault + { + // Refresh localization. + public static void Postfix(KeyBindScript __instance) + { + Console.WriteLine("KeyBindScript_ResetToDefault.Postfix: Refreshing buttons"); + + __instance.RefreshButtons(); + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_Start.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_Start.cs new file mode 100644 index 0000000..17e8f43 --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/KeyBindScript_Start.cs @@ -0,0 +1,33 @@ +using HarmonyLib; +using System; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(KeyBindScript), "Start")] + public class KeyBindScript_Start + { + // Load custom localization files. + public static void Prefix(KeyBindScript __instance) + { + try + { + Console.WriteLine("KeyBindScript_Start.Prefix: Loading localization tables"); + + KeyCodeLocalization.Load(); + AxisLocalization.Load(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + // Refresh buttons. + public static void Postfix(KeyBindScript __instance) + { + Console.WriteLine("KeyBindScript_Start.Postfix: Refresh buttons"); + + __instance.RefreshButtons(); + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/MainMenu_ButtonConfigButton.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/MainMenu_ButtonConfigButton.cs new file mode 100644 index 0000000..1da9aab --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/MainMenu_ButtonConfigButton.cs @@ -0,0 +1,28 @@ +using HarmonyLib; +using System; +using System.Collections; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(MainMenu), "ButtonConfigButton")] + public class MainMenu_ButtonConfigButton + { + // Refresh localization. + public static void Postfix(MainMenu __instance + , ref KeyBindScript ___keyBind + ) + { + Console.WriteLine("MainMenu_ButtonConfigButton.Postfix: Refreshing buttons"); + + if (__instance.locked) + { + return; + } + + if (___keyBind) + { + ___keyBind.RefreshButtons(); + } + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/MainMenu_SetDefaultXboxControls.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/MainMenu_SetDefaultXboxControls.cs new file mode 100644 index 0000000..db457b7 --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/MainMenu_SetDefaultXboxControls.cs @@ -0,0 +1,26 @@ +using HarmonyLib; +using System; +using UnityEngine; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(MainMenu), "SetDefaultXboxControls")] + public class MainMenu_SetDefaultXboxControls + { + // Refresh localization. + public static void Postfix(MainMenu __instance + , ref KeyBindScript ___keyBind + ) + { + if (Application.platform != RuntimePlatform.OSXPlayer) + { + Console.WriteLine("MainMenu_SetDefaultXboxControls.Postfix: Refreshing buttons"); + + if (___keyBind) + { + ___keyBind.RefreshButtons(); + } + } + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/PauseMenu_ButtonConfigButton.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/PauseMenu_ButtonConfigButton.cs new file mode 100644 index 0000000..e9c59ea --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/PauseMenu_ButtonConfigButton.cs @@ -0,0 +1,28 @@ +using HarmonyLib; +using System; +using System.Collections; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(PauseMenu), "ButtonConfigButton")] + public class PauseMenu_ButtonConfigButton + { + // Refresh localization. + public static void Postfix(PauseMenu __instance + , ref KeyBindScript ___keyBind + ) + { + Console.WriteLine("PauseMenu_ButtonConfigButton.Postfix: Refreshing buttons"); + + if (__instance.locked) + { + return; + } + + if (___keyBind) + { + ___keyBind.RefreshButtons(); + } + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/PauseMenu_SetDefaultXboxControls.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/PauseMenu_SetDefaultXboxControls.cs new file mode 100644 index 0000000..1efa19e --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/HarmonyPatches/PauseMenu_SetDefaultXboxControls.cs @@ -0,0 +1,26 @@ +using HarmonyLib; +using System; +using UnityEngine; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization.HarmonyPatches +{ + [HarmonyPatch(typeof(PauseMenu), "SetDefaultXboxControls")] + public class PauseMenu_SetDefaultXboxControls + { + // Refresh localization. + public static void Postfix(PauseMenu __instance + , ref KeyBindScript ___keyBind + ) + { + if (Application.platform != RuntimePlatform.OSXPlayer) + { + Console.WriteLine("PauseMenu_SetDefaultXboxControls.Postfix: Refreshing buttons"); + + if (___keyBind) + { + ___keyBind.RefreshButtons(); + } + } + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/KeyCodeLocalization.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/KeyCodeLocalization.cs new file mode 100644 index 0000000..9674616 --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/KeyCodeLocalization.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization +{ + public class KeyCodeLocalization + { + public static readonly Dictionary strings = new Dictionary(); + public static readonly Dictionary strings_French = new Dictionary(); + public static readonly Dictionary strings_Italian = new Dictionary(); + public static readonly Dictionary strings_Japanese = new Dictionary(); + public static readonly Dictionary strings_Custom = new Dictionary(); + + public static void Load() + { + try + { + ReadText(Path.Combine(Application.streamingAssetsPath, "Text"), "", strings); + ReadText(Path.Combine(Application.streamingAssetsPath, "Text"), "_French", strings_French); + ReadText(Path.Combine(Application.streamingAssetsPath, "Text"), "_Italian", strings_Italian); + ReadText(Path.Combine(Application.streamingAssetsPath, "Text"), "_Japanese", strings_Japanese); + ReadText(Path.Combine(Application.streamingAssetsPath, "CustomLanguage/Text"), "", strings_Custom); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + private static void ReadText(string basePath, string suffix, Dictionary items) + { + if (items.Count > 0) + { + return; + } + + var path = Path.Combine(basePath, "Keys" + suffix + ".txt"); + + if (!File.Exists(path)) + { + var enums = Enum.GetValues(typeof(KeyCode)); + var lines = new List(enums.Length); + + Array.Sort(enums); + + foreach (var value in enums) + { + var name = ((KeyCode)value).ToString(); + + if (lines.Contains(name)) + { + continue; + } + + lines.Add(name); + } + + Directory.CreateDirectory(basePath); + File.WriteAllLines(path, lines.ToArray()); + + return; + } + else + { + var i = 0; + var enums = Enum.GetValues(typeof(KeyCode)); + var lines = File.ReadAllLines(path); + + Array.Sort(enums); + + foreach (var value in enums) + { + if (items.ContainsKey((KeyCode)value)) + { + continue; + } + + items.Add((KeyCode)value, lines[i++]); + } + } + } + } +} diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/NuGet.Config b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/NuGet.Config new file mode 100644 index 0000000..1864ded --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/NuGet.Config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/Plugin.cs b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/Plugin.cs new file mode 100644 index 0000000..b89dc98 --- /dev/null +++ b/BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization/Plugin.cs @@ -0,0 +1,26 @@ +using BepInEx; +using HarmonyLib; +using System; + +namespace BepInEx5Plugins.Ash.Alisa.ControlsMenuLocalization +{ + [BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] + public class Plugin : BaseUnityPlugin + { + private void Awake() + { + try + { + Logger.LogInfo($"Plugin {PluginInfo.PLUGIN_GUID} is loaded!"); + + var harmony = new Harmony(Info.Metadata.GUID); + + harmony.PatchAll(); + } + catch (Exception exception) + { + Console.WriteLine(exception); + } + } + } +}