From bb932a33c55091508ef0ff89388ceb9e0387071c Mon Sep 17 00:00:00 2001 From: senft-research Date: Thu, 14 Aug 2025 00:03:21 +0100 Subject: [PATCH 1/6] - Initial Config Logic - Next commit will add exception try-catches, cleanup, and documentation. --- MonsterModifiers/MonsterModifiers.csproj | 1 + .../Src/Config/ModifierConfigLogic.cs | 59 +++++++++++++++++++ MonsterModifiers/Src/Plugin.cs | 8 ++- MonsterModifiers/Src/Utils/YamlUtils.cs | 5 +- 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 MonsterModifiers/Src/Config/ModifierConfigLogic.cs diff --git a/MonsterModifiers/MonsterModifiers.csproj b/MonsterModifiers/MonsterModifiers.csproj index 8bddbb8..049ca2b 100644 --- a/MonsterModifiers/MonsterModifiers.csproj +++ b/MonsterModifiers/MonsterModifiers.csproj @@ -122,6 +122,7 @@ + diff --git a/MonsterModifiers/Src/Config/ModifierConfigLogic.cs b/MonsterModifiers/Src/Config/ModifierConfigLogic.cs new file mode 100644 index 0000000..fc96e9e --- /dev/null +++ b/MonsterModifiers/Src/Config/ModifierConfigLogic.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using BepInEx.Configuration; +using Jotunn.Extensions; + +namespace MonsterModifiers.Config; +public class ModifierConfigLogic +{ + ConfigFile _configFile; + Dictionary> modifierWeights; + + static ModifierConfigLogic? _instance; + + public static ModifierConfigLogic Instance + { + get{ + if (_instance == null) + { + _instance = new ModifierConfigLogic(); + } + return _instance; + } + } + + public void InitConfig(ConfigFile configFile) + { + this._configFile = configFile; + InitConfigParams(); + } + + void InitConfigParams() + { + foreach (MonsterModifierTypes modifierType in Enum.GetValues(typeof(MonsterModifierTypes))) + { + ConfigEntry modifierEntry = _configFile.BindConfig("Modifier Weights", + modifierType.ToString(), + 1, + "The liklihood (between 0.0 and 1.0) of if the modifier will be applied to monsters.", + true); + modifierWeights.Add(modifierType, modifierEntry); + + } + } + + public Dictionary InitCustomConfigModifiers( + Dictionary defaultModifiers) + { + foreach (var modiferEntry in modifierWeights) + { + if (!defaultModifiers.TryGetValue(modiferEntry.Key, out ModifierData defaultData)) + { + continue; + } + defaultData.weight = modiferEntry.Value.Value; + } + + return defaultModifiers; + } +} diff --git a/MonsterModifiers/Src/Plugin.cs b/MonsterModifiers/Src/Plugin.cs index 9090dca..aa8ee87 100644 --- a/MonsterModifiers/Src/Plugin.cs +++ b/MonsterModifiers/Src/Plugin.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; @@ -11,6 +12,7 @@ using Jotunn.Managers; using Jotunn.Utils; using LocalizationManager; +using MonsterModifiers.Config; using MonsterModifiers.Modifiers; using UnityEngine; using Paths = BepInEx.Paths; @@ -59,10 +61,12 @@ public void Awake() if (saveOnSet) { Config.SaveOnConfigSet = saveOnSet; + Config.Save(); } - - YamlUtils.ParseDefaultYamls(); + ModifierConfigLogic.Instance.InitConfig(Config); + Dictionary defaultModifiers= YamlUtils.ParseDefaultYamls(); + ModifierUtils.modifiers = ModifierConfigLogic.Instance.InitCustomConfigModifiers(defaultModifiers); TranslationUtils.AddLocalizations(); ModifierAssetUtils.Setup(); ModifierAssetUtils.LoadAllIcons(); diff --git a/MonsterModifiers/Src/Utils/YamlUtils.cs b/MonsterModifiers/Src/Utils/YamlUtils.cs index 5d183d2..fde3fc7 100644 --- a/MonsterModifiers/Src/Utils/YamlUtils.cs +++ b/MonsterModifiers/Src/Utils/YamlUtils.cs @@ -12,7 +12,7 @@ public class YamlUtils { public static string defaultModifierValues; - public static void ParseDefaultYamls() + public static Dictionary ParseDefaultYamls() { defaultModifierValues = AssetUtils.LoadTextFromResources("modifierValues.yml"); @@ -20,6 +20,7 @@ public static void ParseDefaultYamls() .WithNamingConvention(CamelCaseNamingConvention.Instance) .Build(); - ModifierUtils.modifiers = deserializer.Deserialize>(new StringReader(defaultModifierValues)); + return deserializer.Deserialize>(new StringReader(defaultModifierValues)); } + } \ No newline at end of file From cf51bbbd0e91eccd2605471908b43e4e92e66c2e Mon Sep 17 00:00:00 2001 From: senft-research Date: Thu, 14 Aug 2025 18:01:46 +0100 Subject: [PATCH 2/6] - Refactored ModifierConfigLogic.cs to ModifierConfigHandler.cs - Refactored Plugin.cs to have a dedicated method for initializing the config values for modifiers. - Added documentation to ModifierConfigHandler.cs & initialized configModifierWeights dictionary. --- MonsterModifiers/MonsterModifiers.csproj | 2 +- .../Src/Config/ModifierConfigHandler.cs | 81 +++++++++++++++++++ .../Src/Config/ModifierConfigLogic.cs | 59 -------------- MonsterModifiers/Src/Plugin.cs | 13 ++- 4 files changed, 92 insertions(+), 63 deletions(-) create mode 100644 MonsterModifiers/Src/Config/ModifierConfigHandler.cs delete mode 100644 MonsterModifiers/Src/Config/ModifierConfigLogic.cs diff --git a/MonsterModifiers/MonsterModifiers.csproj b/MonsterModifiers/MonsterModifiers.csproj index 049ca2b..ba1c54e 100644 --- a/MonsterModifiers/MonsterModifiers.csproj +++ b/MonsterModifiers/MonsterModifiers.csproj @@ -122,7 +122,7 @@ - + diff --git a/MonsterModifiers/Src/Config/ModifierConfigHandler.cs b/MonsterModifiers/Src/Config/ModifierConfigHandler.cs new file mode 100644 index 0000000..7c436f5 --- /dev/null +++ b/MonsterModifiers/Src/Config/ModifierConfigHandler.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using BepInEx.Configuration; +using Jotunn.Extensions; + +namespace MonsterModifiers.Config; + +/// +/// Handler for the values determined by the Bepinex Config for this mod. +/// +public class ModifierConfigHandler +{ + ConfigFile _configFile; + Dictionary> configModifierWeights = new(); + + static ModifierConfigHandler? _instance; + + /// + /// Gets the singleton instance of the Handler. + /// + public static ModifierConfigHandler Instance + { + get{ + if (_instance == null) + { + _instance = new ModifierConfigHandler(); + } + return _instance; + } + } + + /// + /// Initializes the config by setting the ConfigFile of the mod, allowing for calling of the config API methods. + /// + /// The Config File the handler will be responsible for. + public void InitConfig(ConfigFile configFile) + { + this._configFile = configFile; + InitConfigParams(); + } + + /// + /// Initializes the weighting values of all the Monster Modifiers in the Mod. The intention is that, regardless of + /// how many modifiers are added to the mod, the config will dynamically add the new modifiers to the weighting + /// section. + /// + void InitConfigParams() + { + foreach (MonsterModifierTypes modifierType in Enum.GetValues(typeof(MonsterModifierTypes))) + { + ConfigEntry modifierEntry = _configFile.BindConfig("Modifier Weights", + modifierType.ToString(), + 1, + "The weighting of this modifier to be applied to monsters.", + true); + configModifierWeights.Add(modifierType, modifierEntry); + + } + } + + /// + /// Takes in a dictionary of modifier type - modifier data key-value pairs and dynamically alters the weighting of + /// the modifier data, if custom config values have been chosen by the user via the mod bepinex config. + /// + /// The default modifiers to attempt altering weighting data for. + /// The modified modifier data dictionary. + public Dictionary InitCustomConfigModifiers( + Dictionary defaultModifiers) + { + foreach (var modiferEntry in configModifierWeights) + { + if (!defaultModifiers.TryGetValue(modiferEntry.Key, out ModifierData defaultData)) + { + continue; + } + defaultData.weight = modiferEntry.Value.Value; + } + + return defaultModifiers; + } +} diff --git a/MonsterModifiers/Src/Config/ModifierConfigLogic.cs b/MonsterModifiers/Src/Config/ModifierConfigLogic.cs deleted file mode 100644 index fc96e9e..0000000 --- a/MonsterModifiers/Src/Config/ModifierConfigLogic.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using BepInEx.Configuration; -using Jotunn.Extensions; - -namespace MonsterModifiers.Config; -public class ModifierConfigLogic -{ - ConfigFile _configFile; - Dictionary> modifierWeights; - - static ModifierConfigLogic? _instance; - - public static ModifierConfigLogic Instance - { - get{ - if (_instance == null) - { - _instance = new ModifierConfigLogic(); - } - return _instance; - } - } - - public void InitConfig(ConfigFile configFile) - { - this._configFile = configFile; - InitConfigParams(); - } - - void InitConfigParams() - { - foreach (MonsterModifierTypes modifierType in Enum.GetValues(typeof(MonsterModifierTypes))) - { - ConfigEntry modifierEntry = _configFile.BindConfig("Modifier Weights", - modifierType.ToString(), - 1, - "The liklihood (between 0.0 and 1.0) of if the modifier will be applied to monsters.", - true); - modifierWeights.Add(modifierType, modifierEntry); - - } - } - - public Dictionary InitCustomConfigModifiers( - Dictionary defaultModifiers) - { - foreach (var modiferEntry in modifierWeights) - { - if (!defaultModifiers.TryGetValue(modiferEntry.Key, out ModifierData defaultData)) - { - continue; - } - defaultData.weight = modiferEntry.Value.Value; - } - - return defaultModifiers; - } -} diff --git a/MonsterModifiers/Src/Plugin.cs b/MonsterModifiers/Src/Plugin.cs index aa8ee87..cdaa52e 100644 --- a/MonsterModifiers/Src/Plugin.cs +++ b/MonsterModifiers/Src/Plugin.cs @@ -64,9 +64,7 @@ public void Awake() Config.Save(); } - ModifierConfigLogic.Instance.InitConfig(Config); - Dictionary defaultModifiers= YamlUtils.ParseDefaultYamls(); - ModifierUtils.modifiers = ModifierConfigLogic.Instance.InitCustomConfigModifiers(defaultModifiers); + InitModifiers(); TranslationUtils.AddLocalizations(); ModifierAssetUtils.Setup(); ModifierAssetUtils.LoadAllIcons(); @@ -81,6 +79,15 @@ public void Awake() PrefabManager.OnVanillaPrefabsAvailable += PrefabUtils.CreateCustomPrefabs; } + + void InitModifiers() + { + ModifierConfigHandler.Instance.InitConfig(Config); + Dictionary defaultModifiers= YamlUtils.ParseDefaultYamls(); + ModifierUtils.modifiers = ModifierConfigHandler.Instance.InitCustomConfigModifiers(defaultModifiers); + } + + public static ConfigEntry Configurations_MaxModifiers; From 92cf38ee071280a013862922f6a06c1eefc5cd25 Mon Sep 17 00:00:00 2001 From: senft-research Date: Sun, 17 Aug 2025 18:53:33 +0100 Subject: [PATCH 3/6] - Clean up of ModifierConfigHandler.cs logic, along with exceptions thrown in invalid cases - MonsterModifiers.csproj updated with location of ModifierConfigHandler.cs in compile includes. --- MonsterModifiers/MonsterModifiers.csproj | 1 + .../Src/Config/ModifierConfigHandler.cs | 49 ++++++++++++++----- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/MonsterModifiers/MonsterModifiers.csproj b/MonsterModifiers/MonsterModifiers.csproj index bc690da..7b75706 100644 --- a/MonsterModifiers/MonsterModifiers.csproj +++ b/MonsterModifiers/MonsterModifiers.csproj @@ -125,6 +125,7 @@ + diff --git a/MonsterModifiers/Src/Config/ModifierConfigHandler.cs b/MonsterModifiers/Src/Config/ModifierConfigHandler.cs index 7c436f5..203e886 100644 --- a/MonsterModifiers/Src/Config/ModifierConfigHandler.cs +++ b/MonsterModifiers/Src/Config/ModifierConfigHandler.cs @@ -2,16 +2,17 @@ using System.Collections.Generic; using BepInEx.Configuration; using Jotunn.Extensions; +using UnityEngine; namespace MonsterModifiers.Config; /// -/// Handler for the values determined by the Bepinex Config for this mod. +/// Handler for the values determined by the Bepinex Config for this mod. /// public class ModifierConfigHandler { - ConfigFile _configFile; - Dictionary> configModifierWeights = new(); + ConfigFile? _configFile; + readonly Dictionary> _configModifierWeights = new(); static ModifierConfigHandler? _instance; @@ -20,7 +21,8 @@ public class ModifierConfigHandler /// public static ModifierConfigHandler Instance { - get{ + get + { if (_instance == null) { _instance = new ModifierConfigHandler(); @@ -35,7 +37,7 @@ public static ModifierConfigHandler Instance /// The Config File the handler will be responsible for. public void InitConfig(ConfigFile configFile) { - this._configFile = configFile; + _configFile = configFile; InitConfigParams(); } @@ -46,28 +48,49 @@ public void InitConfig(ConfigFile configFile) /// void InitConfigParams() { + if (_configFile == null) + { + throw new InvalidOperationException( + "The initialization of config parameters has been called, but the" + + " configuration file has not been initialized in the config handler!" + ); + } foreach (MonsterModifierTypes modifierType in Enum.GetValues(typeof(MonsterModifierTypes))) { - ConfigEntry modifierEntry = _configFile.BindConfig("Modifier Weights", + ConfigEntry modifierEntry = _configFile.BindConfig( + "Modifier Weights", modifierType.ToString(), 1, - "The weighting of this modifier to be applied to monsters.", - true); - configModifierWeights.Add(modifierType, modifierEntry); - + "The weighting of this modifier to be applied to monsters." + ); + if (modifierEntry.Value <= 0) + { + MonsterModifiersPlugin.MonsterModifiersLogger.LogWarning( + $"Weight for {modifierType.ToString()} modifier was set to less than 0 ({modifierEntry.Value}), weight has been ignored, please change this weight to an integer value that is higher than 0" + ); + continue; + } + _configModifierWeights.Add(modifierType, modifierEntry); } } /// /// Takes in a dictionary of modifier type - modifier data key-value pairs and dynamically alters the weighting of - /// the modifier data, if custom config values have been chosen by the user via the mod bepinex config. + /// the modifier data, if custom config values have been chosen by the user via the mod bepinex config. /// /// The default modifiers to attempt altering weighting data for. /// The modified modifier data dictionary. public Dictionary InitCustomConfigModifiers( - Dictionary defaultModifiers) + Dictionary defaultModifiers + ) { - foreach (var modiferEntry in configModifierWeights) + if (_configFile == null) + { + throw new InvalidOperationException( + "Config modifier weights are being queried by the Modifier Config Handler, but the initialization of the Mod's config file has not succesfully executed!" + ); + } + foreach (var modiferEntry in _configModifierWeights) { if (!defaultModifiers.TryGetValue(modiferEntry.Key, out ModifierData defaultData)) { From 69dc9787bbfa95dfe5ec65ad15a476023cb8d5c2 Mon Sep 17 00:00:00 2001 From: senft-research Date: Sun, 17 Aug 2025 18:55:02 +0100 Subject: [PATCH 4/6] - Update to the config entry message. --- MonsterModifiers/Src/Config/ModifierConfigHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonsterModifiers/Src/Config/ModifierConfigHandler.cs b/MonsterModifiers/Src/Config/ModifierConfigHandler.cs index 203e886..38c6e35 100644 --- a/MonsterModifiers/Src/Config/ModifierConfigHandler.cs +++ b/MonsterModifiers/Src/Config/ModifierConfigHandler.cs @@ -61,7 +61,7 @@ void InitConfigParams() "Modifier Weights", modifierType.ToString(), 1, - "The weighting of this modifier to be applied to monsters." + "The application weight of the modifier. Value should be any positive integer." ); if (modifierEntry.Value <= 0) { From 915329c5a08952f5f1d5f4ab0f302d7177ec92f8 Mon Sep 17 00:00:00 2001 From: senft-research Date: Sun, 17 Aug 2025 20:26:41 +0100 Subject: [PATCH 5/6] - Somehow, the harmony patch snuck back in. --- MonsterModifiers/MonsterModifiers.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/MonsterModifiers/MonsterModifiers.csproj b/MonsterModifiers/MonsterModifiers.csproj index 7b75706..999234a 100644 --- a/MonsterModifiers/MonsterModifiers.csproj +++ b/MonsterModifiers/MonsterModifiers.csproj @@ -63,9 +63,6 @@ - - $(BepInExPath)\core\0Harmony.dll - $(PublicizedAssembliesPath)\assembly_guiutils_publicized.dll From c876f87ddcf3b35c045b0490273810b76002fa55 Mon Sep 17 00:00:00 2001 From: senft-research Date: Sun, 17 Aug 2025 20:34:27 +0100 Subject: [PATCH 6/6] - Added Microsoft.Net.Compilers.Toolset 4.10.0 to ensure a consistent Roslyn compiler (to avoid mismatches on Linux when building). --- MonsterModifiers/MonsterModifiers.csproj | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/MonsterModifiers/MonsterModifiers.csproj b/MonsterModifiers/MonsterModifiers.csproj index 999234a..4d2e330 100644 --- a/MonsterModifiers/MonsterModifiers.csproj +++ b/MonsterModifiers/MonsterModifiers.csproj @@ -2,6 +2,16 @@ + + + all + + + + all + + + Debug AnyCPU