From edc8fd5a5bf20533b14b57032f1582c6b52fd959 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Mon, 24 Feb 2025 08:44:18 +0100 Subject: [PATCH] Enhance ObjectFieldMultiplier with flexible field configuration and selective application --- .../TerraTech/ObjectFieldMultiplier.cs | 69 ++++++++++++++----- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/Projects/TerraTech/TerraTech/ObjectFieldMultiplier.cs b/Projects/TerraTech/TerraTech/ObjectFieldMultiplier.cs index bef6e22..49b9427 100644 --- a/Projects/TerraTech/TerraTech/ObjectFieldMultiplier.cs +++ b/Projects/TerraTech/TerraTech/ObjectFieldMultiplier.cs @@ -8,12 +8,36 @@ namespace TerraTech { /// Represents a field that can be multiplied by a configurable value /// /// The type of the field value + public class FieldConfiguration { + public string FieldName { get; } + public ConfigEntry DefaultMultiplier { get; } + public Func> ConditionalMultiplier { get; } + + public FieldConfiguration(string fieldName, ConfigEntry defaultMultiplier) { + FieldName = fieldName; + DefaultMultiplier = defaultMultiplier; + } + + public FieldConfiguration(string fieldName, ConfigEntry defaultMultiplier, + Func> conditionalMultiplier) { + FieldName = fieldName; + DefaultMultiplier = defaultMultiplier; + ConditionalMultiplier = conditionalMultiplier; + } + + public ConfigEntry GetMultiplier(object instance) { + return ConditionalMultiplier?.Invoke(instance) ?? DefaultMultiplier; + } + } + public class MultipliedField { private readonly string _fieldName; private readonly ConfigEntry _multiplier; private readonly Traverse _parentTraverse; private TValue _originalValue; + public string FieldName => _fieldName; + public MultipliedField(string fieldName, ConfigEntry multiplier, Traverse parentTraverse) { _fieldName = fieldName; _multiplier = multiplier; @@ -99,32 +123,43 @@ namespace TerraTech { /// /// The type of the object being managed public class MultipliedObject { + private readonly T _instance; private readonly Traverse _objectTraverse; - private readonly List> _fields; + private readonly Dictionary> _fields; public MultipliedObject(T instance) { + _instance = instance; _objectTraverse = Traverse.Create(instance); - _fields = new List>(); + _fields = new Dictionary>(); } - public void AddField(string fieldName, ConfigEntry multiplier) { - _fields.Add(new MultipliedField(fieldName, multiplier, _objectTraverse)); + public void AddField(FieldConfiguration config) { + var multiplier = config.GetMultiplier(_instance); + _fields[config.FieldName] = new MultipliedField(config.FieldName, multiplier, _objectTraverse); } public void CaptureFrom() { - foreach (var field in _fields) { + foreach (var field in _fields.Values) { field.CaptureOriginal(); } } - public void ApplyTo() { - foreach (var field in _fields) { + public void ApplyTo(IEnumerable fieldNames = null) { + var fieldsToApply = fieldNames != null + ? fieldNames.Where(name => _fields.ContainsKey(name)).Select(name => _fields[name]) + : _fields.Values; + + foreach (var field in fieldsToApply) { field.Apply(); } } - public void RestoreTo() { - foreach (var field in _fields) { + public void RestoreTo(IEnumerable fieldNames = null) { + var fieldsToRestore = + fieldNames != null ? fieldNames.Where(name => _fields.ContainsKey(name)).Select(name => _fields[name]) + : _fields.Values; + + foreach (var field in fieldsToRestore) { field.Restore(); } } @@ -132,7 +167,7 @@ namespace TerraTech { public void LogValues(string prefix) { if (!Main.debug.Value) return; - foreach (var field in _fields) { + foreach (var field in _fields.Values) { field.LogValue(prefix); } } @@ -182,25 +217,25 @@ namespace TerraTech { } } - public void ApplyAll() { + public void ApplyAll(IEnumerable fieldNames = null) { if (Main.debug.Value) Console.WriteLine("Modifying {0} {1}", _managedObjects.Count, typeof(T).Name); foreach (var instance in _managedObjects.Keys) { - RestoreTo(instance); - ApplyTo(instance); + RestoreTo(instance, fieldNames); + ApplyTo(instance, fieldNames); } } - private void ApplyTo(T instance) { + public void ApplyTo(T instance, IEnumerable fieldNames = null) { MultipliedObject obj; if (_managedObjects.TryGetValue(instance, out obj)) - obj.ApplyTo(); + obj.ApplyTo(fieldNames); } - private void RestoreTo(T instance) { + public void RestoreTo(T instance, IEnumerable fieldNames = null) { MultipliedObject obj; if (_managedObjects.TryGetValue(instance, out obj)) - obj.RestoreTo(); + obj.RestoreTo(fieldNames); } } }