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.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[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;
[BepInPlugin("ShopPriceModifier", "ShopPriceModifier", "1.0.1")]
public class ShopPriceModifier : BaseUnityPlugin
{
public static class PricePatches
{
public static void ModifyUpgradePricePrefix(float _value, Item item, ref float __result, ref bool __runOriginal, ShopManager __instance)
{
float num = _value;
int count = GameDirector.instance.PlayerList.Count;
float num2 = UpgradePlayerInfluence.Value * (float)(count - 1);
num2 = Mathf.Max(num2, -0.9f);
num += num * num2;
float num3 = (float)_UpgradeValueIncrease.GetValue(__instance);
num += num * num3 * (float)StatsManager.instance.GetItemsUpgradesPurchased(((Object)item).name);
float globalRandomMultiplier = GetGlobalRandomMultiplier();
float num4 = UpgradeBaseMultiplier.Value + globalRandomMultiplier - 1f;
num4 = Mathf.Max(num4, 0.1f);
num *= num4;
num = Mathf.Ceil(num);
num = (__result = Mathf.Max(num, 1f));
__runOriginal = false;
string text = ((num2 > 0f) ? $"涨{num2 * 100f:F1}%" : ((num2 < 0f) ? $"降{Math.Abs(num2) * 100f:F1}%" : "无调整"));
string text2 = (GlobalPriceRandomEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)");
LogDebug($"[升级物品:{((Object)item).name}] 基础值:{_value:F2} | 玩家数:{count}({text})→ " + $"总倍率(基础{UpgradeBaseMultiplier.Value:F2} + {text2} - 1)={num4:F2} → 最终价:{num:F2}");
}
public static void ModifyHealthPackPricePrefix(float _value, ref float __result, ref bool __runOriginal, ShopManager __instance)
{
float num = _value;
int count = GameDirector.instance.PlayerList.Count;
int num2 = Mathf.Min(RunManager.instance.levelsCompleted, 15);
float num3 = HealthPackPlayerInfluence.Value * (float)(count - 1);
num3 = Mathf.Max(num3, -0.9f);
num += num * num3;
float num4 = (float)_HealthPackValueIncrease.GetValue(__instance);
num += num * num4 * (float)num2;
float globalRandomMultiplier = GetGlobalRandomMultiplier();
float num5 = HealthPackBaseMultiplier.Value + globalRandomMultiplier - 1f;
num5 = Mathf.Max(num5, 0.1f);
num *= num5;
num = Mathf.Ceil(num);
num = (__result = Mathf.Max(num, 1f));
__runOriginal = false;
string text = ((num3 > 0f) ? $"涨{num3 * 100f:F1}%" : ((num3 < 0f) ? $"降{Math.Abs(num3) * 100f:F1}%" : "无调整"));
string text2 = (GlobalPriceRandomEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)");
LogDebug($"[医疗包] 基础值:{_value:F2} | 玩家数:{count}({text})| 通关数:{num2} → " + $"总倍率(基础{HealthPackBaseMultiplier.Value:F2} + {text2} - 1)={num5:F2} → 最终价:{num:F2}");
}
public static void ModifyCrystalPricePrefix(float _value, ref float __result, ref bool __runOriginal, ShopManager __instance)
{
float num = _value;
int num2 = Mathf.Min(RunManager.instance.levelsCompleted, 15);
float num3 = (float)_CrystalValueIncrease.GetValue(__instance);
num += num * num3 * (float)num2;
float globalRandomMultiplier = GetGlobalRandomMultiplier();
float num4 = CrystalBaseMultiplier.Value + globalRandomMultiplier - 1f;
num4 = Mathf.Max(num4, 0.1f);
num *= num4;
num = Mathf.Ceil(num);
num = (__result = Mathf.Max(num, 1f));
__runOriginal = false;
string text = (GlobalPriceRandomEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)");
LogDebug($"[能量水晶] 基础值:{_value:F2} | 通关数:{num2} → " + $"总倍率(基础{CrystalBaseMultiplier.Value:F2} + {text} - 1)={num4:F2} → 最终价:{num:F2}");
}
}
internal static ManualLogSource Log;
internal static ConfigEntry<float> UpgradeBaseMultiplier;
internal static ConfigEntry<float> UpgradePlayerInfluence;
internal static ConfigEntry<float> HealthPackBaseMultiplier;
internal static ConfigEntry<float> HealthPackPlayerInfluence;
internal static ConfigEntry<float> CrystalBaseMultiplier;
internal static ConfigEntry<bool> GlobalPriceRandomEnable;
internal static ConfigEntry<float> GlobalRandomMinMultiplier;
internal static ConfigEntry<float> GlobalRandomMaxMultiplier;
internal static ConfigEntry<bool> LoggingEnable;
private static Random _random = new Random();
private static readonly FieldInfo _UpgradeValueIncrease = AccessTools.Field(typeof(ShopManager), "upgradeValueIncrease");
private static readonly FieldInfo _HealthPackValueIncrease = AccessTools.Field(typeof(ShopManager), "healthPackValueIncrease");
private static readonly FieldInfo _CrystalValueIncrease = AccessTools.Field(typeof(ShopManager), "crystalValueIncrease");
private void Awake()
{
Log = ((BaseUnityPlugin)this).Logger;
InitConfig();
ApplyPatches();
}
private void InitConfig()
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Expected O, but got Unknown
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Expected O, but got Unknown
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Expected O, but got Unknown
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Expected O, but got Unknown
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Expected O, but got Unknown
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
//IL_015e: Expected O, but got Unknown
//IL_0191: Unknown result type (might be due to invalid IL or missing references)
//IL_019b: Expected O, but got Unknown
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_01d8: Expected O, but got Unknown
//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0209: Expected O, but got Unknown
UpgradeBaseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Upgrade Item Price Settings", "BaseMultiplier", 1f, new ConfigDescription("Upgrade item base price multiplier (0.01~10, 0.5=50% off, 1=original price)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 10f), Array.Empty<object>()));
UpgradePlayerInfluence = ((BaseUnityPlugin)this).Config.Bind<float>("Upgrade Item Price Settings", "PlayerInfluence", 0.1f, new ConfigDescription("Upgrade item player count influence (-0.1~1, 0.1=+10% per player, -0.05=-5% per player)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-0.1f, 1f), Array.Empty<object>()));
HealthPackBaseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Health Pack Price Settings", "BaseMultiplier", 1f, new ConfigDescription("Health pack base price multiplier (0.01~10, 0.5=50% off, 1=original price)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 10f), Array.Empty<object>()));
HealthPackPlayerInfluence = ((BaseUnityPlugin)this).Config.Bind<float>("Health Pack Price Settings", "PlayerInfluence", 0.1f, new ConfigDescription("Health pack player count influence (-0.1~1, 0.1=+10% per player, -0.05=-5% per player)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-0.1f, 1f), Array.Empty<object>()));
CrystalBaseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Energy Crystal Price Settings", "BaseMultiplier", 1f, new ConfigDescription("Energy crystal base price multiplier (0.01~10, 0.5=50% off, 1=original price)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 10f), Array.Empty<object>()));
GlobalPriceRandomEnable = ((BaseUnityPlugin)this).Config.Bind<bool>("Random Price Settings", "RandomEnable", false, new ConfigDescription("Whether to enable random price fluctuation for all goods (global switch)", (AcceptableValueBase)(object)new AcceptableValueRange<bool>(false, true), Array.Empty<object>()));
GlobalRandomMinMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Global Random Settings", "RandomMinMultiplier", 0.8f, new ConfigDescription("Random minimum multiplier (0.1~2, default 0.8)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 2f), Array.Empty<object>()));
GlobalRandomMaxMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Global Random Settings", "RandomMaxMultiplier", 1.2f, new ConfigDescription("Random maximum multiplier (0.1~2, default 1.2)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 2f), Array.Empty<object>()));
LoggingEnable = ((BaseUnityPlugin)this).Config.Bind<bool>("Logging Settings", "EnableDebugLogging", false, new ConfigDescription("Whether to enable debug log output (print price calculation details for each item when enabled)", (AcceptableValueBase)(object)new AcceptableValueRange<bool>(false, true), Array.Empty<object>()));
UpgradeBaseMultiplier.Value = Mathf.Clamp(UpgradeBaseMultiplier.Value, 0.01f, 10f);
UpgradePlayerInfluence.Value = Mathf.Clamp(UpgradePlayerInfluence.Value, -0.1f, 1f);
HealthPackBaseMultiplier.Value = Mathf.Clamp(HealthPackBaseMultiplier.Value, 0.01f, 10f);
HealthPackPlayerInfluence.Value = Mathf.Clamp(HealthPackPlayerInfluence.Value, -0.1f, 1f);
CrystalBaseMultiplier.Value = Mathf.Clamp(CrystalBaseMultiplier.Value, 0.01f, 10f);
GlobalRandomMinMultiplier.Value = Mathf.Clamp(GlobalRandomMinMultiplier.Value, 0.1f, 2f);
GlobalRandomMaxMultiplier.Value = Mathf.Clamp(GlobalRandomMaxMultiplier.Value, 0.1f, 2f);
if (GlobalRandomMinMultiplier.Value > GlobalRandomMaxMultiplier.Value)
{
GlobalRandomMinMultiplier.Value = GlobalRandomMaxMultiplier.Value;
}
Log.LogInfo((object)("Configuration loaded successfully → " + $"Upgrade Items[Multiplier:{UpgradeBaseMultiplier.Value}, Player Influence:{UpgradePlayerInfluence.Value * 100f}%/player] | " + $"Health Packs[Multiplier:{HealthPackBaseMultiplier.Value}, Player Influence:{HealthPackPlayerInfluence.Value * 100f}%/player] | " + $"Energy Crystals[Multiplier:{CrystalBaseMultiplier.Value}] | " + "Random Price[" + (GlobalPriceRandomEnable.Value ? $"Enabled({GlobalRandomMinMultiplier.Value}~{GlobalRandomMaxMultiplier.Value})" : "Disabled") + "] | Debug Log[" + (LoggingEnable.Value ? "Enabled" : "Disabled") + "]"));
}
private void ApplyPatches()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Expected O, but got Unknown
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Expected O, but got Unknown
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Expected O, but got Unknown
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Expected O, but got Unknown
try
{
Harmony val = new Harmony("ShopPriceModifier");
val.Patch((MethodBase)typeof(ShopManager).GetMethod("UpgradeValueGet"), new HarmonyMethod(typeof(PricePatches).GetMethod("ModifyUpgradePricePrefix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
val.Patch((MethodBase)typeof(ShopManager).GetMethod("HealthPackValueGet"), new HarmonyMethod(typeof(PricePatches).GetMethod("ModifyHealthPackPricePrefix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
val.Patch((MethodBase)typeof(ShopManager).GetMethod("CrystalValueGet"), new HarmonyMethod(typeof(PricePatches).GetMethod("ModifyCrystalPricePrefix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
Log.LogInfo((object)"加载成功!");
}
catch (Exception ex)
{
Log.LogError((object)("插件加载失败:" + ex.Message + "\n" + ex.StackTrace));
}
}
internal static float GetGlobalRandomMultiplier()
{
if (!GlobalPriceRandomEnable.Value)
{
return 1f;
}
return (float)(_random.NextDouble() * (double)(GlobalRandomMaxMultiplier.Value - GlobalRandomMinMultiplier.Value) + (double)GlobalRandomMinMultiplier.Value);
}
internal static void LogDebug(string message)
{
if (LoggingEnable.Value)
{
Log.LogDebug((object)message);
}
}
}
public static class PluginInfo
{
public const string GUID = "ShopPriceModifier";
public const string Name = "ShopPriceModifier";
public const string Version = "1.0.1";
}