Config refactor to split dungeon generation and the mod's universal features.

This commit is contained in:
LadyAliceMargatroid 2025-01-11 01:49:35 -08:00
parent d690b69a26
commit 83d0d8a737
44 changed files with 2001 additions and 1664 deletions

View file

@ -1,4 +1,5 @@
using System;
using ScarletMansion.Configs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -17,7 +18,7 @@ namespace ScarletMansion.ModPatch {
}
public static void Call(){
if (StartOfRound.Instance.IsHost && PluginConfig.Instance.facilityMeltdownActiveValue){
if (StartOfRound.Instance.IsHost && ConfigMain.Instance.facilityMeltdownActiveValue){
FacilityMeltdown.API.MeltdownAPI.StartMeltdown(Plugin.modGUID);
GamePatch.Managers.AngerManager.Instance.TriggerAngerLightForever();
}

View file

@ -1,4 +1,5 @@
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -9,18 +10,16 @@ using LethalConfig.ConfigItems;
using BepInEx.Configuration;
using System.Reflection;
using ChangeList = ScarletMansion.PresetConfig.ChangeList;
using ConfigEntryBundleInt = ScarletMansion.PluginConfig.ConfigEntryBundle<int>;
using ConfigEntryBundleFloat = ScarletMansion.PluginConfig.ConfigEntryBundle<float>;
using ConfigEntryBundleString = ScarletMansion.PluginConfig.ConfigEntryBundle<string>;
using ConfigEntryBundleBool = ScarletMansion.PluginConfig.ConfigEntryBundle<bool>;
using HarmonyLib;
using LethalConfig.MonoBehaviours.Components;
using UnityEngine.UI;
using LethalConfig.MonoBehaviours;
using ScarletMansion.Configs;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
namespace ScarletMansion.ModPatch {
public class LethalConfigPatch : ModPatch {
public class LethalConfigPatch<T> : ModPatch where T: ConfigDungeon<T> {
public const string section = "_Presets";
public const string descriptionPrefix = "These are a set of preset config values for your convience. Your config values will automatically update to these preset values every time SDM is loaded. These config values are a brighter shade of red. To disable this feature, set this value to Custom.";
@ -32,7 +31,8 @@ namespace ScarletMansion.ModPatch {
public static void ForceUIUpdate(){
try {
var configMenuObject = GameObject.FindObjectOfType<ConfigMenu>();
// zaggy said it's better
var configMenuObject = GameObject.FindAnyObjectByType<ConfigMenu>();
configMenuObject.Close(false);
configMenuObject.Open();
} catch (Exception e) {
@ -50,14 +50,14 @@ namespace ScarletMansion.ModPatch {
return LethalConfig.ConfigItems.Options.CanModifyResult.True();
}
public static void CreateConfig(ConfigEntryBase configEntry) {
if (configEntry is ConfigEntry<int>) CreateIntConfig(configEntry as ConfigEntry<int>);
else if (configEntry is ConfigEntry<float>) CreateFloatConfig(configEntry as ConfigEntry<float>);
else if (configEntry is ConfigEntry<string>) CreateStringConfig(configEntry as ConfigEntry<string>);
else if (configEntry is ConfigEntry<bool>) CreateBoolConfig(configEntry as ConfigEntry<bool>);
public static void CreateConfig(Assembly assembly, ConfigEntryBase configEntry) {
if (configEntry is ConfigEntry<int>) CreateIntConfig(assembly, configEntry as ConfigEntry<int>);
else if (configEntry is ConfigEntry<float>) CreateFloatConfig(assembly, configEntry as ConfigEntry<float>);
else if (configEntry is ConfigEntry<string>) CreateStringConfig(assembly, configEntry as ConfigEntry<string>);
else if (configEntry is ConfigEntry<bool>) CreateBoolConfig(assembly, configEntry as ConfigEntry<bool>);
}
public static void CreateIntConfig(ConfigEntry<int> configEntry){
public static void CreateIntConfig(Assembly assembly, ConfigEntry<int> configEntry){
var options = new LethalConfig.ConfigItems.Options.IntSliderOptions{
Section = configEntry.Definition.Section,
Name = configEntry.Definition.Key,
@ -67,10 +67,10 @@ namespace ScarletMansion.ModPatch {
};
var entry = new IntSliderConfigItem(configEntry, options);
LethalConfigManager.AddConfigItem(entry);
LethalConfigManager.AddConfigItem(entry, assembly);
}
public static void CreateFloatConfig(ConfigEntry<float> configEntry){
public static void CreateFloatConfig(Assembly assembly, ConfigEntry<float> configEntry){
var options = new LethalConfig.ConfigItems.Options.FloatSliderOptions{
Section = configEntry.Definition.Section,
Name = configEntry.Definition.Key,
@ -80,10 +80,10 @@ namespace ScarletMansion.ModPatch {
};
var entry = new FloatSliderConfigItem(configEntry, options);
LethalConfigManager.AddConfigItem(entry);
LethalConfigManager.AddConfigItem(entry, assembly);
}
public static void CreateStringConfig(ConfigEntry<string> configEntry){
public static void CreateStringConfig(Assembly assembly, ConfigEntry<string> configEntry){
var options = new LethalConfig.ConfigItems.Options.TextInputFieldOptions{
Section = configEntry.Definition.Section,
Name = configEntry.Definition.Key,
@ -93,10 +93,10 @@ namespace ScarletMansion.ModPatch {
};
var entry = new TextInputFieldConfigItem(configEntry, options);
LethalConfigManager.AddConfigItem(entry);
LethalConfigManager.AddConfigItem(entry, assembly);
}
public static void CreateBoolConfig(ConfigEntry<bool> configEntry){
public static void CreateBoolConfig(Assembly assembly, ConfigEntry<bool> configEntry){
var options = new LethalConfig.ConfigItems.Options.BoolCheckBoxOptions{
Section = configEntry.Definition.Section,
Name = configEntry.Definition.Key,
@ -106,10 +106,10 @@ namespace ScarletMansion.ModPatch {
};
var entry = new BoolCheckBoxConfigItem(configEntry, options);
LethalConfigManager.AddConfigItem(entry);
LethalConfigManager.AddConfigItem(entry, assembly);
}
public static void CreatePresetConfig<T>(ConfigEntry<T> configEntry, List<ChangeList> changeList) where T: Enum {
public static void CreatePresetConfig<U>(Assembly assembly, ConfigEntry<U> configEntry, List<ConfigManager<T>.ChangeList> changeList) where U: Enum {
configEntry.SettingChanged += (obj, args) => ForceUIUpdate();
var description = $"{requiresNewLobby}\n\n{descriptionPrefix}\n\n";
@ -125,20 +125,20 @@ namespace ScarletMansion.ModPatch {
CanModifyCallback = CanModifyCallback,
};
var entry = new EnumDropDownConfigItem<T>(configEntry, options);
LethalConfigManager.AddConfigItem(entry);
var entry = new EnumDropDownConfigItem<U>(configEntry, options);
LethalConfigManager.AddConfigItem(entry, assembly);
}
public static void AutoGenerateConfigs(params object[] ignoreTargets){
var fields = typeof(PluginConfig).GetFields(BindingFlags.Public | BindingFlags.Static);
public static void AutoGenerateConfigs<TTarget>(Assembly assembly, params object[] ignoreTargets) where TTarget: ConfigManager<TTarget> {
var fields = typeof(TTarget).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
foreach(var p in fields){
var value = p.GetValue(null);
if (ignoreTargets.Contains(value)) continue;
var valueBundle = value as PluginConfig.ConfigEntryBundleBase;
if (valueBundle != null){
if (value is ConfigManager<TTarget>.ConfigEntryBundleBase){
var valueBundle = (ConfigManager<TTarget>.ConfigEntryBundleBase)value;
foreach(var c in valueBundle.GetConfigs()){
CreateConfig(c);
CreateConfig(assembly, c);
}
}
}
@ -147,27 +147,34 @@ namespace ScarletMansion.ModPatch {
public override void AddPatch() {
LethalConfigManager.SkipAutoGen();
CreatePresetConfig(PluginConfig.lcDungeonGenerationPreset.config, PresetConfig.dungeonGenerationChangeList);
CreatePresetConfig(PluginConfig.lcDungeonLightingPreset.config, PresetConfig.dungeonLightingChangeList);
LethalConfigManager.SetModDescription("Adds the Scarlet Devil Mansion from Touhou as a possible dungeon to the snow maps.\n\nThis is the master config for the entire mod.");
var mainAssembly = typeof(Plugin).Assembly;
var dungeonAssembly = typeof(DungeonFoyer.Plugin).Assembly;
CreatePresetConfig(dungeonAssembly, ConfigDungeon<T>.dungeonGenerationPreset.config, ConfigDungeon<T>.dungeonGenerationChangeList);
CreatePresetConfig(dungeonAssembly, ConfigDungeon<T>.dungeonLightingPreset.config, ConfigDungeon<T>.dungeonLightingChangeList);
AutoGenerateConfigs(PluginConfig.lcDungeonGenerationPreset, PluginConfig.lcDungeonLightingPreset);
AutoGenerateConfigs<ConfigMain>(mainAssembly);
AutoGenerateConfigs<T>(dungeonAssembly, ConfigDungeon<T>.dungeonGenerationPreset, ConfigDungeon<T>.dungeonLightingPreset);
try {
Plugin.Instance.harmony.PatchAll(typeof(LethalConfigPatch));
//Plugin.Instance.harmony.PatchAll(typeof(LethalConfigPatch));
} catch (Exception e) {
Plugin.logger.LogWarning("Tried to HarmonyPatch LethalConfig but failed. Nothing bad will happen but report this bug to dev.");
Plugin.logger.LogError(e.ToString());
}
}
/*
[HarmonyPatch(typeof(LethalConfig.MonoBehaviours.ConfigList), "LoadConfigsForMod")]
[HarmonyPostfix]
public static void LoadConfigsForModPatch(ref LethalConfig.MonoBehaviours.ConfigList __instance, ref LethalConfig.Mods.Mod mod) {
try {
if (mod.ModInfo.Guid == Plugin.modGUID) {
var genChanges = PresetConfig.defaultGeneration.GetAllConfigEntries();
var lightChanges = PresetConfig.defaultLighting.GetAllConfigEntries();
var genChanges = Presets.defaultGeneration.GetAllConfigEntries();
var lightChanges = Presets.defaultLighting.GetAllConfigEntries();
foreach(Transform child in __instance.listContainerObject.transform){
var controller = child.GetComponentInChildren<ModConfigController>();
@ -187,6 +194,7 @@ namespace ScarletMansion.ModPatch {
}
}
*/
}
}

View file

@ -5,6 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Bootstrap;
using ScarletMansion.Configs;
namespace ScarletMansion.ModPatch {
public class ModCompability {
@ -17,7 +18,7 @@ namespace ScarletMansion.ModPatch {
public static readonly ModPatch[] modPatches = new ModPatch[] {
//new AdvancedCompanyPatch(advancedCompanyGuid),
new LethalConfigPatch(lethalConfigGuid),
new LethalConfigPatch<ConfigDungeonFoyer>(lethalConfigGuid),
new FacilityMeltdownPatch(facilityMeldownGuid),
new ReservedFlashlightPatch(reserveFlashlightGuid),
new ReservedKeyPatch(reserveKeyGuid)