using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("kamppix.QuotaScalingMoons")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("0.3.0.0")]
[assembly: AssemblyInformationalVersion("0.3.0+cd0015c12860fb681d17bc6fe33ad6002947f7af")]
[assembly: AssemblyProduct("QuotaScalingMoons")]
[assembly: AssemblyTitle("kamppix.QuotaScalingMoons")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.3.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace QuotaScalingMoons
{
[BepInPlugin("kamppix.QuotaScalingMoons", "QuotaScalingMoons", "0.3.0")]
public class Plugin : BaseUnityPlugin
{
public static Dictionary<string, ConfigEntry<bool>> BoolConfig = new Dictionary<string, ConfigEntry<bool>>();
private static Dictionary<string, ConfigEntry<float>> FirstQuotaValues = new Dictionary<string, ConfigEntry<float>>();
private static Dictionary<string, ConfigEntry<float>> SecondQuotaValues = new Dictionary<string, ConfigEntry<float>>();
private static Dictionary<string, ConfigEntry<float>> ThirdQuotaValues = new Dictionary<string, ConfigEntry<float>>();
private const float EXP_AVERAGE_VALUE = 31.71354f;
public static Plugin Instance { get; private set; } = null;
internal static ManualLogSource Logger { get; private set; } = null;
internal static Harmony? Harmony { get; set; }
private void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
Instance = this;
Patch();
AddConfig();
Logger.LogInfo((object)"kamppix.QuotaScalingMoons v0.3.0 has loaded!");
}
internal static void Patch()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
if (Harmony == null)
{
Harmony = new Harmony("kamppix.QuotaScalingMoons");
}
Logger.LogDebug((object)"Patching...");
Harmony.PatchAll();
Logger.LogDebug((object)"Finished patching!");
}
internal static void Unpatch()
{
Logger.LogDebug((object)"Unpatching...");
Harmony? harmony = Harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
Logger.LogDebug((object)"Finished unpatching!");
}
internal static float GetCurrentValue(string key, bool ignoreAvgScrapValue = false)
{
Dictionary<string, ConfigEntry<float>> dictionary;
Dictionary<string, ConfigEntry<float>> dictionary2;
if (BoolConfig["EnableThirdQuota"].Value && (float)TimeOfDay.Instance.profitQuota > SecondQuotaValues["TargetQuota"].Value)
{
dictionary = SecondQuotaValues;
dictionary2 = ThirdQuotaValues;
}
else
{
dictionary = FirstQuotaValues;
dictionary2 = SecondQuotaValues;
}
float value = dictionary[key].Value;
float num = dictionary2[key].Value - value;
float num2 = ((float)TimeOfDay.Instance.profitQuota - dictionary["TargetQuota"].Value) / (dictionary2["TargetQuota"].Value - dictionary["TargetQuota"].Value);
float num3 = value + num * num2;
if ((BoolConfig.ContainsKey("Limit" + key) && BoolConfig["Limit" + key].Value) || ((key == "MinScrap" || key == "MaxScrap") && BoolConfig["LimitScrapAmount"].Value))
{
num3 = Math.Min(num3, SecondQuotaValues[key].Value);
}
if (key == "ScrapValueMultiplier" && !ignoreAvgScrapValue && BoolConfig["EnableMoonBalancing"].Value)
{
num3 /= GetScrapValueDivider();
}
return num3;
}
private static float GetScrapValueDivider()
{
SelectableLevel currentLevel = StartOfRound.Instance.currentLevel;
float num = 0f;
float num2 = 0f;
foreach (SpawnableItemWithRarity item in currentLevel.spawnableScrap)
{
num += (float)item.rarity;
}
foreach (SpawnableItemWithRarity item2 in currentLevel.spawnableScrap)
{
float num3 = (float)(item2.spawnableItem.minValue + item2.spawnableItem.maxValue) / 2f * 0.4f;
num2 += (float)item2.rarity * num3 / num;
}
return num2 / 31.71354f;
}
internal static string GetCurrentRiskLevel()
{
int num = (int)(6f * ((float)TimeOfDay.Instance.profitQuota - FirstQuotaValues["TargetQuota"].Value) / (SecondQuotaValues["TargetQuota"].Value - FirstQuotaValues["TargetQuota"].Value));
return num switch
{
0 => "D",
1 => "C",
2 => "B",
3 => "A",
_ => string.Concat("S", string.Concat(Enumerable.Repeat("+", num - 4))),
};
}
private void AddConfig()
{
BoolConfig.Add("EnableFreeMoons", ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "EnableFreeMoons", true, "Whether or not all moons should be free to route to"));
BoolConfig.Add("EnableMoonBalancing", ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "EnableMoonBalancing", true, "Whether or not the properties of different moons should be balanced"));
BoolConfig.Add("EnableScrapValueScaling", ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "EnableScrapValueScaling", true, "Whether or not scrap value should be scaled based on the profit quota"));
BoolConfig.Add("EnableApparaticeValueScaling", ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "EnableApparaticeValueScaling", true, "Whether or not apparatice value should be scaled based on the profit quota"));
BoolConfig.Add("EnableHiveValueScaling", ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "EnableHiveValueScaling", true, "Whether or not beehive value should be scaled based on the profit quota"));
FirstQuotaValues.Add("TargetQuota", ((BaseUnityPlugin)this).Config.Bind<float>("First Quota", "TargetQuota", 130f, (ConfigDescription)null));
FirstQuotaValues.Add("MapSizeMultiplier", ((BaseUnityPlugin)this).Config.Bind<float>("First Quota", "MapSizeMultiplier", 1f, (ConfigDescription)null));
FirstQuotaValues.Add("ScrapValueMultiplier", ((BaseUnityPlugin)this).Config.Bind<float>("First Quota", "ScrapValueMultiplier", 0.4f, (ConfigDescription)null));
FirstQuotaValues.Add("MinScrap", ((BaseUnityPlugin)this).Config.Bind<float>("First Quota", "MinScrap", 8f, (ConfigDescription)null));
FirstQuotaValues.Add("MaxScrap", ((BaseUnityPlugin)this).Config.Bind<float>("First Quota", "MaxScrap", 12f, (ConfigDescription)null));
FirstQuotaValues.Add("MaxIndoorPower", ((BaseUnityPlugin)this).Config.Bind<float>("First Quota", "MaxIndoorEnemyPower", 4f, (ConfigDescription)null));
FirstQuotaValues.Add("MaxOutdoorPower", ((BaseUnityPlugin)this).Config.Bind<float>("First Quota", "MaxOutdoorEnemyPower", 8f, (ConfigDescription)null));
SecondQuotaValues.Add("TargetQuota", ((BaseUnityPlugin)this).Config.Bind<float>("Second Quota", "TargetQuota", 3536.25f, (ConfigDescription)null));
SecondQuotaValues.Add("MapSizeMultiplier", ((BaseUnityPlugin)this).Config.Bind<float>("Second Quota", "MapSizeMultiplier", 1.8f, (ConfigDescription)null));
SecondQuotaValues.Add("ScrapValueMultiplier", ((BaseUnityPlugin)this).Config.Bind<float>("Second Quota", "ScrapValueMultiplier", 0.74f, (ConfigDescription)null));
SecondQuotaValues.Add("MinScrap", ((BaseUnityPlugin)this).Config.Bind<float>("Second Quota", "MinScrap", 26f, (ConfigDescription)null));
SecondQuotaValues.Add("MaxScrap", ((BaseUnityPlugin)this).Config.Bind<float>("Second Quota", "MaxScrap", 31f, (ConfigDescription)null));
SecondQuotaValues.Add("MaxIndoorPower", ((BaseUnityPlugin)this).Config.Bind<float>("Second Quota", "MaxIndoorEnemyPower", 13f, (ConfigDescription)null));
SecondQuotaValues.Add("MaxOutdoorPower", ((BaseUnityPlugin)this).Config.Bind<float>("Second Quota", "MaxOutdoorEnemyPower", 13f, (ConfigDescription)null));
BoolConfig.Add("LimitMapSizeMultiplier", ((BaseUnityPlugin)this).Config.Bind<bool>("Second Quota", "LimitMapSize", false, "Limits MapSizeMultiplier to its second quota value instead of scaling infinitely."));
BoolConfig.Add("LimitScrapValueMultiplier", ((BaseUnityPlugin)this).Config.Bind<bool>("Second Quota", "LimitScrapValue", false, "Limits ScrapValueMultiplier to its second quota value instead of scaling infinitely."));
BoolConfig.Add("LimitScrapAmount", ((BaseUnityPlugin)this).Config.Bind<bool>("Second Quota", "LimitScrapAmount", false, "Limits MinScrap and MaxScrap to their second quota values instead of scaling infinitely."));
BoolConfig.Add("LimitMaxIndoorPower", ((BaseUnityPlugin)this).Config.Bind<bool>("Second Quota", "LimitMaxIndoorEnemyPower", false, "Limits MaxIndoorEnemyPower to its second quota value instead of scaling infinitely."));
BoolConfig.Add("LimitMaxOutdoorPower", ((BaseUnityPlugin)this).Config.Bind<bool>("Second Quota", "LimitMaxOutdoorEnemyPower", false, "Limits MaxOutdoorEnemyPower to its second quota value instead of scaling infinitely."));
BoolConfig.Add("EnableThirdQuota", ((BaseUnityPlugin)this).Config.Bind<bool>("Third Quota", "EnableThirdQuota", false, "Enables the optional third quota to scale towards after the second quota."));
ThirdQuotaValues.Add("TargetQuota", ((BaseUnityPlugin)this).Config.Bind<float>("Third Quota", "TargetQuota", 6942.5f, (ConfigDescription)null));
ThirdQuotaValues.Add("MapSizeMultiplier", ((BaseUnityPlugin)this).Config.Bind<float>("Third Quota", "MapSizeMultiplier", 2.6f, (ConfigDescription)null));
ThirdQuotaValues.Add("ScrapValueMultiplier", ((BaseUnityPlugin)this).Config.Bind<float>("Third Quota", "ScrapValueMultiplier", 1.08f, (ConfigDescription)null));
ThirdQuotaValues.Add("MinScrap", ((BaseUnityPlugin)this).Config.Bind<float>("Third Quota", "MinScrap", 44f, (ConfigDescription)null));
ThirdQuotaValues.Add("MaxScrap", ((BaseUnityPlugin)this).Config.Bind<float>("Third Quota", "MaxScrap", 50f, (ConfigDescription)null));
ThirdQuotaValues.Add("MaxIndoorPower", ((BaseUnityPlugin)this).Config.Bind<float>("Third Quota", "MaxIndoorEnemyPower", 22f, (ConfigDescription)null));
ThirdQuotaValues.Add("MaxOutdoorPower", ((BaseUnityPlugin)this).Config.Bind<float>("Third Quota", "MaxOutdoorEnemyPower", 18f, (ConfigDescription)null));
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "kamppix.QuotaScalingMoons";
public const string PLUGIN_NAME = "QuotaScalingMoons";
public const string PLUGIN_VERSION = "0.3.0";
}
}
namespace QuotaScalingMoons.Patches
{
[HarmonyPatch(typeof(RoundManager), "GenerateNewLevelClientRpc")]
public class MoonBalancePatch
{
private const int ARTIFICE = 10;
private static void Prefix(RoundManager __instance)
{
if (Plugin.BoolConfig["EnableMoonBalancing"].Value)
{
SelectableLevel currentLevel = __instance.currentLevel;
if (((Object)currentLevel).name != "CompanyBuildingLevel")
{
currentLevel.riskLevel = Plugin.GetCurrentRiskLevel();
currentLevel.factorySizeMultiplier = Plugin.GetCurrentValue("MapSizeMultiplier");
currentLevel.minScrap = (int)Plugin.GetCurrentValue("MinScrap");
currentLevel.maxScrap = Math.Max((int)Plugin.GetCurrentValue("MaxScrap"), currentLevel.minScrap);
currentLevel.maxEnemyPowerCount = (int)Plugin.GetCurrentValue("MaxIndoorPower");
currentLevel.maxOutsideEnemyPowerCount = (int)Plugin.GetCurrentValue("MaxOutdoorPower");
currentLevel.enemySpawnChanceThroughoutDay = StartOfRound.Instance.levels[10].enemySpawnChanceThroughoutDay;
currentLevel.outsideEnemySpawnChanceThroughDay = StartOfRound.Instance.levels[10].outsideEnemySpawnChanceThroughDay;
}
}
}
}
[HarmonyPatch(typeof(Terminal), "ParsePlayerSentence")]
public class MoonPricePatch
{
private static void Postfix(TerminalNode __result)
{
if (Plugin.BoolConfig["EnableFreeMoons"].Value && (__result.buyRerouteToMoon == -2 || (__result.buyRerouteToMoon != -1 && __result.buyRerouteToMoon != -2)))
{
__result.itemCost = 0;
}
}
}
[HarmonyPatch(typeof(LungProp), "DisconnectFromMachinery")]
public class PullAppPatch
{
private static void Prefix(LungProp __instance)
{
if (Plugin.BoolConfig["EnableApparaticeValueScaling"].Value)
{
((GrabbableObject)__instance).SetScrapValue((int)((float)((GrabbableObject)__instance).scrapValue * Plugin.GetCurrentValue("ScrapValueMultiplier", ignoreAvgScrapValue: true) / 0.4f));
}
}
}
[HarmonyPatch(typeof(RedLocustBees), "Start")]
public class SpawnHivePatch
{
private static void Postfix(RedLocustBees __instance)
{
if (Plugin.BoolConfig["EnableHiveValueScaling"].Value)
{
__instance.hive.SetScrapValue((int)((float)__instance.hive.scrapValue * Plugin.GetCurrentValue("ScrapValueMultiplier", ignoreAvgScrapValue: true) / 0.4f));
}
}
}
[HarmonyPatch(typeof(RoundManager), "SpawnScrapInLevel")]
public class SpawnScrapPatch
{
private static void Prefix(RoundManager __instance)
{
if (Plugin.BoolConfig["EnableScrapValueScaling"].Value)
{
__instance.scrapValueMultiplier = Plugin.GetCurrentValue("ScrapValueMultiplier");
}
}
}
}