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("DiscountFix")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DiscountFix")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("2695e571-6b44-43ad-9520-ff66c3505a41")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace DiscountFix;
[BepInPlugin("yazirushi.Discountfix", "Discount Fix", "1.0.2")]
public class DiscountFix : BaseUnityPlugin
{
private readonly Harmony harmony = new Harmony("yazirushi.Discountfix");
internal static ManualLogSource mls;
public static ConfigEntry<float> MaxDiscountRate;
public static ConfigEntry<float> DiscountPerPlayer;
public static ConfigEntry<bool> EnableLogging;
private void Awake()
{
MaxDiscountRate = ((BaseUnityPlugin)this).Config.Bind<float>("DiscountFix.Settings", "MaxDiscountRate", 0.9f, "割引の上限(0.90だと90%)(0.00〜1.00)");
DiscountPerPlayer = ((BaseUnityPlugin)this).Config.Bind<float>("DiscountFix.Settings", "DiscountPerPlayer", 0.1f, "一人当たりの割引率(0.10だと10%)");
EnableLogging = ((BaseUnityPlugin)this).Config.Bind<bool>("DiscountFix.Log", "EnableLogging", false, "ログの有効化");
mls = ((BaseUnityPlugin)this).Logger;
mls.LogInfo((object)"DiscountFixが起動しました!");
mls.LogInfo((object)$"DiscountFix:Config:MaxDiscountRate = {MaxDiscountRate.Value}");
mls.LogInfo((object)$"DiscountFix:Config:DiscountPerPlayer = {DiscountPerPlayer.Value}");
mls.LogInfo((object)$"DiscountFix:Config:Enablelogging = {EnableLogging.Value}");
harmony.PatchAll();
}
}
[HarmonyPatch(typeof(ShopManager), "UpgradeValueGet")]
public class UpgradeValuePatch
{
private static bool Prefix(ref float __result, float _value, Item item, ShopManager __instance)
{
int count = GameDirector.instance.PlayerList.Count;
FieldInfo fieldInfo = AccessTools.Field(typeof(ShopManager), "upgradeValueIncrease");
float num = (float)fieldInfo.GetValue(__instance);
int itemsUpgradesPurchased = StatsManager.instance.GetItemsUpgradesPurchased(item.itemAssetName);
count = Mathf.Max(count, 1);
float value = DiscountFix.MaxDiscountRate.Value;
float value2 = DiscountFix.DiscountPerPlayer.Value;
float num2 = value2 * (float)(count - 1);
num2 = Mathf.Min(num2, value);
float num3 = _value * (1f - num2);
float num4 = num * (float)itemsUpgradesPurchased;
float num5 = num3 * num4;
float num6 = num3 + num5;
__result = Mathf.Ceil(num6);
__result = Mathf.Max(__result, 1f);
if (DiscountFix.EnableLogging.Value)
{
DiscountFix.mls.LogInfo((object)("[DiscountFix] UpgradeItem: " + (item?.itemName ?? "null") + " | " + $"Original: {_value} | Discounted: {num3} | " + $"Increase: {num5} | Final: {__result} | " + $"Players: {count} | Purchases: {itemsUpgradesPurchased} | " + $"DiscountRate: {num2 * 100f:F1}%, IncreaseRate: {num4:F2}"));
}
return false;
}
}
[HarmonyPatch(typeof(ShopManager), "HealthPackValueGet")]
public class HealthPackValuePatch
{
private static bool Prefix(ref float __result, float _value, ShopManager __instance)
{
int count = GameDirector.instance.PlayerList.Count;
FieldInfo fieldInfo = AccessTools.Field(typeof(ShopManager), "healthPackValueIncrease");
float num = (float)fieldInfo.GetValue(__instance);
int num2 = Mathf.Min(RunManager.instance.levelsCompleted, 15);
count = Mathf.Max(count, 1);
float value = DiscountFix.MaxDiscountRate.Value;
float value2 = DiscountFix.DiscountPerPlayer.Value;
float num3 = value2 * (float)(count - 1);
num3 = Mathf.Min(num3, value);
float num4 = _value * (1f - num3);
float num5 = num * (float)num2;
float num6 = num4 * num5;
float num7 = num4 + num6;
__result = Mathf.Ceil(num7);
__result = Mathf.Max(__result, 1f);
if (DiscountFix.EnableLogging.Value)
{
DiscountFix.mls.LogInfo((object)("[DiscountFix] HealthPack " + $"Original: {_value} | Discounted: {num4} | " + $"Increase: {num6} | Final: {__result} | " + $"Players: {count} | Levels: {num2} | " + $"DiscountRate: {num3 * 100f:F1}%, IncreaseRate: {num5:F2}"));
}
return false;
}
}