using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("shopprice2")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("shopprice2")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("2367ad22-5cd7-4c6e-84f5-442fa9408d56")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace ShopPriceModifier; internal class Manager { private static Random random = new Random(); private static readonly FieldInfo upgInc = AccessTools.Field(typeof(ShopManager), "upgradeValueIncrease"); private static readonly FieldInfo hpInc = AccessTools.Field(typeof(ShopManager), "healthPackValueIncrease"); private static readonly FieldInfo cryInc = AccessTools.Field(typeof(ShopManager), "crystalValueIncrease"); public static void ModifyUpgradePrice(float _value, Item item, ref float __result, ShopManager __instance) { float num = _value; int count = GameDirector.instance.PlayerList.Count; float num2 = SetConfig.UpgPlayerInfluence.Value * (float)(count - 1); num2 = Mathf.Max(num2, -0.9f); num += num * num2; float num3 = (SetConfig.CustomIncEnable.Value ? SetConfig.UpgInc.Value : ((float)upgInc.GetValue(__instance))); num += num * num3 * (float)StatsManager.instance.GetItemsUpgradesPurchased(((Object)item).name); float globalRandomMultiplier = GetGlobalRandomMultiplier(); float num4 = SetConfig.UpgBaseMult.Value + globalRandomMultiplier - 1f; num4 = Mathf.Max(num4, 0.1f); num *= num4; num = Mathf.Ceil(num); num = (__result = Mathf.Max(num, 1f)); if (SetConfig.DebugLog.Value) { string text = ((num2 > 0f) ? $"涨{num2 * 100f:F1}%" : ((num2 < 0f) ? $"降{Math.Abs(num2) * 100f:F1}%" : "无调整")); string text2 = (SetConfig.RandEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)"); ShopPrice.Log.LogDebug((object)($"[升级物品:{((Object)item).name}] 基础值:{_value:F2} | 玩家数:{count}({text})→ " + $"总倍率(基础{SetConfig.UpgBaseMult.Value:F2} + {text2} - 1)={num4:F2} → 最终价:{num:F2}")); } } public static void ModifyHealthPackPrice(float _value, ref float __result, ShopManager __instance) { float num = _value; int count = GameDirector.instance.PlayerList.Count; int num2 = Mathf.Min(RunManager.instance.levelsCompleted, SetConfig.MaxLevel.Value); float num3 = SetConfig.HpPlayerInfluence.Value * (float)(count - 1); num3 = Mathf.Max(num3, -0.9f); num += num * num3; float num4 = (SetConfig.CustomIncEnable.Value ? SetConfig.HpInc.Value : ((float)hpInc.GetValue(__instance))); num += num * num4 * (float)num2; float globalRandomMultiplier = GetGlobalRandomMultiplier(); float num5 = SetConfig.HpBaseMult.Value + globalRandomMultiplier - 1f; num5 = Mathf.Max(num5, 0.1f); num *= num5; num = Mathf.Ceil(num); num = (__result = Mathf.Max(num, 1f)); if (SetConfig.DebugLog.Value) { string text = ((num3 > 0f) ? $"涨{num3 * 100f:F1}%" : ((num3 < 0f) ? $"降{Math.Abs(num3) * 100f:F1}%" : "无调整")); string text2 = (SetConfig.RandEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)"); ShopPrice.Log.LogDebug((object)($"[医疗包] 基础值:{_value:F2} | 玩家数:{count}({text})| 通关数:{num2} → " + $"总倍率(基础{SetConfig.HpBaseMult.Value:F2} + {text2} - 1)={num5:F2} → 最终价:{num:F2}")); } } public static void ModifyCrystalPrice(float _value, ref float __result, ShopManager __instance) { float num = _value; int num2 = Mathf.Min(RunManager.instance.levelsCompleted, SetConfig.MaxLevel.Value); float num3 = (SetConfig.CustomIncEnable.Value ? SetConfig.CryInc.Value : ((float)cryInc.GetValue(__instance))); num += num * num3 * (float)num2; float globalRandomMultiplier = GetGlobalRandomMultiplier(); float num4 = SetConfig.CryBaseMult.Value + globalRandomMultiplier - 1f; num4 = Mathf.Max(num4, 0.1f); num *= num4; num = Mathf.Ceil(num); num = (__result = Mathf.Max(num, 1f)); if (SetConfig.DebugLog.Value) { string text = (SetConfig.RandEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)"); ShopPrice.Log.LogDebug((object)($"[能量水晶] 基础值:{_value:F2} | 通关数:{num2} → " + $"总倍率(基础{SetConfig.CryBaseMult.Value:F2} + {text} - 1)={num4:F2} → 最终价:{num:F2}")); } } internal static float GetGlobalRandomMultiplier() { if (!SetConfig.RandEnable.Value) { return 1f; } return (float)(random.NextDouble() * (double)(SetConfig.RandMaxMult.Value - SetConfig.RandMinMult.Value) + (double)SetConfig.RandMinMult.Value); } } internal class SetConfig { internal static ConfigEntry UpgBaseMult; internal static ConfigEntry UpgPlayerInfluence; internal static ConfigEntry HpBaseMult; internal static ConfigEntry HpPlayerInfluence; internal static ConfigEntry CryBaseMult; internal static ConfigEntry RandEnable; internal static ConfigEntry RandMinMult; internal static ConfigEntry RandMaxMult; internal static ConfigEntry DebugLog; internal static ConfigEntry MaxLevel; internal static ConfigEntry CustomIncEnable; internal static ConfigEntry UpgInc; internal static ConfigEntry HpInc; internal static ConfigEntry CryInc; public static void InitConfig(ConfigFile Config) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Expected O, but got Unknown //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Expected O, but got Unknown //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Expected O, but got Unknown //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Expected O, but got Unknown //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Expected O, but got Unknown //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Expected O, but got Unknown //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Expected O, but got Unknown //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Expected O, but got Unknown //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Expected O, but got Unknown //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Expected O, but got Unknown UpgBaseMult = Config.Bind("Upgrade Price", "BaseMultiplier", 1f, new ConfigDescription("升级物品基础价格倍率 (0.01~10,0.5=半价,1=原价)", (AcceptableValueBase)(object)new AcceptableValueRange(0.01f, 10f), Array.Empty())); UpgPlayerInfluence = Config.Bind("Upgrade Price", "PlayerInfluence", 0.1f, new ConfigDescription("玩家数量对价格的影响 (-0.1~1,0.1=每人+10%,-0.05=每人-5%)", (AcceptableValueBase)(object)new AcceptableValueRange(-0.1f, 1f), Array.Empty())); HpBaseMult = Config.Bind("Health Pack Price", "BaseMultiplier", 1f, new ConfigDescription("医疗包基础价格倍率 (0.01~10,0.5=半价,1=原价)", (AcceptableValueBase)(object)new AcceptableValueRange(0.01f, 10f), Array.Empty())); HpPlayerInfluence = Config.Bind("Health Pack Price", "PlayerInfluence", 0.1f, new ConfigDescription("玩家数量对价格的影响 (-0.1~1,0.1=每人+10%,-0.05=每人-5%)", (AcceptableValueBase)(object)new AcceptableValueRange(-0.1f, 1f), Array.Empty())); CryBaseMult = Config.Bind("Energy Crystal Price", "BaseMultiplier", 1f, new ConfigDescription("能量水晶基础价格倍率 (0.01~10,0.5=半价,1=原价)", (AcceptableValueBase)(object)new AcceptableValueRange(0.01f, 10f), Array.Empty())); RandEnable = Config.Bind("Random Price", "RandomEnable", false, new ConfigDescription("是否启用全局商品价格随机波动(总开关)", (AcceptableValueBase)(object)new AcceptableValueRange(false, true), Array.Empty())); RandMinMult = Config.Bind("Random Price", "RandomMinMultiplier", 0.8f, new ConfigDescription("随机价格最小倍率 (0.1~2,默认0.8)", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 2f), Array.Empty())); RandMaxMult = Config.Bind("Random Price", "RandomMaxMultiplier", 1.2f, new ConfigDescription("随机价格最大倍率 (0.1~2,默认1.2)", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 2f), Array.Empty())); CustomIncEnable = Config.Bind("Advanced", "EnableCustomBaseIncrease", false, new ConfigDescription("是否启用自定义成长值(覆盖游戏原生的升级/医疗包/水晶成长数值)", (AcceptableValueBase)(object)new AcceptableValueRange(false, true), Array.Empty())); UpgInc = Config.Bind("Advanced", "UpgradeValueOwnedIncrease", 0.5f, new ConfigDescription("升级物品购买次数成长值 (0.1~1,默认0.5)", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 1f), Array.Empty())); HpInc = Config.Bind("Advanced", "HealthPackValueLevelIncrease", 0.05f, new ConfigDescription("医疗包等级成长值 (0.01~0.1,默认0.05)", (AcceptableValueBase)(object)new AcceptableValueRange(0.01f, 0.1f), Array.Empty())); CryInc = Config.Bind("Advanced", "CrystalValueLevelIncrease", 0.2f, new ConfigDescription("能量水晶等级成长值 (0.01~0.5,默认0.01)", (AcceptableValueBase)(object)new AcceptableValueRange(0.01f, 0.5f), Array.Empty())); MaxLevel = Config.Bind("Advanced", "MaxLevelLimit", 15, new ConfigDescription("价格计算最大等级限制 (15~50,默认15)", (AcceptableValueBase)(object)new AcceptableValueRange(15, 50), Array.Empty())); DebugLog = Config.Bind("Logging Settings", "EnableDebugLogging", false, new ConfigDescription("是否启用调试日志输出(启用后打印每件商品价格计算详情)", (AcceptableValueBase)(object)new AcceptableValueRange(false, true), Array.Empty())); UpgBaseMult.Value = Mathf.Clamp(UpgBaseMult.Value, 0.01f, 10f); UpgPlayerInfluence.Value = Mathf.Clamp(UpgPlayerInfluence.Value, -0.1f, 1f); HpBaseMult.Value = Mathf.Clamp(HpBaseMult.Value, 0.01f, 10f); HpPlayerInfluence.Value = Mathf.Clamp(HpPlayerInfluence.Value, -0.1f, 1f); CryBaseMult.Value = Mathf.Clamp(CryBaseMult.Value, 0.01f, 10f); RandMinMult.Value = Mathf.Clamp(RandMinMult.Value, 0.1f, 2f); RandMaxMult.Value = Mathf.Clamp(RandMaxMult.Value, 0.1f, 2f); MaxLevel.Value = Mathf.Clamp(MaxLevel.Value, 15, 50); UpgInc.Value = Mathf.Clamp(UpgInc.Value, 0.1f, 1f); HpInc.Value = Mathf.Clamp(HpInc.Value, 0.01f, 0.1f); CryInc.Value = Mathf.Clamp(CryInc.Value, 0.01f, 0.5f); if (RandMinMult.Value > RandMaxMult.Value) { RandMinMult.Value = RandMaxMult.Value; } ShopPrice.Log.LogInfo((object)("配置加载成功 → " + $"升级物品[倍率:{UpgBaseMult.Value}, 玩家影响:{UpgPlayerInfluence.Value * 100f}%/人] | " + $"医疗包[倍率:{HpBaseMult.Value}, 玩家影响:{HpPlayerInfluence.Value * 100f}%/人] | " + $"能量水晶[倍率:{CryBaseMult.Value}] | " + "随机价格[" + (RandEnable.Value ? $"开启({RandMinMult.Value}~{RandMaxMult.Value})" : "关闭") + "] | " + $"最大等级限制:{MaxLevel.Value} | " + "自定义基础成长[" + (CustomIncEnable.Value ? $"开启(升级:{UpgInc.Value}, 医疗包:{HpInc.Value}, 水晶:{CryInc.Value})" : "关闭") + "] | 调试日志[" + (DebugLog.Value ? "开启" : "关闭") + "]")); } } [BepInPlugin("ShopPriceModifier", "ShopPriceModifier", "1.0.4")] public class ShopPrice : BaseUnityPlugin { [HarmonyPatch(typeof(ShopManager), "UpgradeValueGet")] private static class UpgradeValueGetPatch { private static bool Prefix(float _value, Item item, ref float __result, ShopManager __instance) { Manager.ModifyUpgradePrice(_value, item, ref __result, __instance); return false; } } [HarmonyPatch(typeof(ShopManager), "HealthPackValueGet")] private static class HealthPackValueGetPatch { private static bool Prefix(float _value, ref float __result, ShopManager __instance) { Manager.ModifyHealthPackPrice(_value, ref __result, __instance); return false; } } [HarmonyPatch(typeof(ShopManager), "CrystalValueGet")] private static class CrystalValueGetPatch { private static bool Prefix(float _value, ref float __result, ShopManager __instance) { Manager.ModifyCrystalPrice(_value, ref __result, __instance); return false; } } internal static ManualLogSource Log; private void Awake() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; new Harmony("ShopPriceModifier").PatchAll(); SetConfig.InitConfig(((BaseUnityPlugin)this).Config); } } public static class PluginInfo { public const string GUID = "ShopPriceModifier"; public const string Name = "ShopPriceModifier"; public const string Version = "1.0.4"; }