using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("RandomValueModLib")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("RandomValueModLib")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("246d11df-ddf0-40bf-9d24-9860ab131ee9")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace RandomValueLib; public class RandomizationConfig { public float MinMultiplier { get; set; } = 0.5f; public float MaxMultiplier { get; set; } = 2f; public bool EnableBlacklist { get; set; } = true; public List BlacklistKeywords { get; set; } = new List(); public bool EnableWhitelist { get; set; } = false; public List WhitelistKeywords { get; set; } = new List(); public bool ExcludeHighValueItems { get; set; } = false; public float HighValueThreshold { get; set; } = 50000f; public bool RandomizeCashBags { get; set; } = false; } public static class RandomValueService { private static FieldInfo dollarValueCurrentField; private static FieldInfo dollarValueOriginalField; static RandomValueService() { Type typeFromHandle = typeof(ValuableObject); dollarValueCurrentField = typeFromHandle.GetField("dollarValueCurrent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); dollarValueOriginalField = typeFromHandle.GetField("dollarValueOriginal", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); } public static float GetItemPrice(ValuableObject vo) { if (dollarValueCurrentField == null) { return 0f; } return (float)dollarValueCurrentField.GetValue(vo); } public static void SetItemPrice(ValuableObject vo, float newPrice) { dollarValueCurrentField?.SetValue(vo, newPrice); dollarValueOriginalField?.SetValue(vo, newPrice); } public static float GetRandomPrice(int instanceID, float originalPrice, RandomizationConfig config, int? extraSeed = null) { float num = Math.Max(0.1f, config.MinMultiplier); float num2 = Math.Max(num + 0.1f, config.MaxMultiplier); int num3 = instanceID; if (extraSeed.HasValue) { num3 ^= extraSeed.Value; } Random random = new Random(num3); float num4 = (float)(random.NextDouble() * (double)(num2 - num) + (double)num); float result = originalPrice; if (originalPrice > 0f) { result = originalPrice * num4; result = Mathf.Clamp(result, 1f, 1000000f); } return result; } public static bool ShouldRandomize(GameObject obj, RandomizationConfig config) { string name = ((Object)obj).name.ToLower(); if (name.Contains("surplus") && !config.RandomizeCashBags) { return false; } if (config.ExcludeHighValueItems) { ValuableObject component = obj.GetComponent(); if ((Object)(object)component != (Object)null && GetItemPrice(component) >= config.HighValueThreshold) { return false; } } if (config.EnableBlacklist && config.BlacklistKeywords.Any((string k) => name.Contains(k))) { return false; } if (config.EnableWhitelist && !config.WhitelistKeywords.Any((string k) => name.Contains(k))) { return false; } return true; } public static float ApplyRandomPrice(ValuableObject vo, RandomizationConfig config, int? extraSeed = null) { if ((Object)(object)vo == (Object)null) { return 0f; } int instanceID = ((Object)((Component)vo).gameObject).GetInstanceID(); float itemPrice = GetItemPrice(vo); if (itemPrice <= 0f) { return itemPrice; } if (!ShouldRandomize(((Component)vo).gameObject, config)) { return itemPrice; } float randomPrice = GetRandomPrice(instanceID, itemPrice, config, extraSeed); SetItemPrice(vo, randomPrice); return randomPrice; } } public static class ValuableObjectExtensions { public static float ApplyRandomPrice(this ValuableObject vo, RandomizationConfig config, int? extraSeed = null) { return RandomValueService.ApplyRandomPrice(vo, config, extraSeed); } }