using System; using System.Collections.Generic; 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; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("11matt556-ReusableMetadata")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("11matt556-ReusableMetadata")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("5de677d0-3927-4fb2-b636-7dbedd094f7f")] [assembly: AssemblyFileVersion("1.0.11")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.11.0")] namespace ReusableMetadata; [BepInPlugin("11matt556.dysonsphereprogram.ReusableMetadata", "Reusable Metadata", "1.0.11")] public class ReusableMetadataPlugin : BaseUnityPlugin { public const string pluginGuid = "11matt556.dysonsphereprogram.ReusableMetadata"; public const string pluginName = "Reusable Metadata"; public const string pluginVersion = "1.0.11"; public static ManualLogSource logger; public static ConfigEntry useHighestProductionOnly; public static ConfigEntry useVerboseLogging; public static ConfigEntry useSandboxCheat; public static ConfigEntry sandboxMultiplier; public static IDictionary topSeedForItem; public void Awake() { //IL_0104: Unknown result type (might be due to invalid IL or missing references) logger = ((BaseUnityPlugin)this).Logger; topSeedForItem = new Dictionary(); topSeedForItem.Add(6001, -1L); topSeedForItem.Add(6002, -1L); topSeedForItem.Add(6003, -1L); topSeedForItem.Add(6004, -1L); topSeedForItem.Add(6005, -1L); topSeedForItem.Add(6006, -1L); useHighestProductionOnly = ((BaseUnityPlugin)this).Config.Bind("Behaviour", "useHighestProductionOnly", false, "True: Only metadata contributions from the seed with the highest production will count towards the available metadata. Metadata can be thought of as a high score with this setting enabled.\nFalse: Metadata production from every seed will contribute to the metadata totals. This is how production is calculated in the vanilla game."); useVerboseLogging = ((BaseUnityPlugin)this).Config.Bind("Debugging", "verboseLogging", false, "For debugging."); useSandboxCheat = ((BaseUnityPlugin)this).Config.Bind("Debugging", "enableSandboxCheat", false, "Intended for debuging and testing. Allows sandbox games to contribute metadata."); sandboxMultiplier = ((BaseUnityPlugin)this).Config.Bind("Debugging", "sandboxMultiplier", 1f, "Intended for debugging and testing. Applies sandboxMultiplier to sandbox games when enableSandboxCheat=true. Use at your own risk."); new Harmony("11matt556.dysonsphereprogram.ReusableMetadata").PatchAll(); logger.LogInfo((object)"Reusable Metadata 1.0.11 Patch successful"); } } [HarmonyPatch] public class Patches { [HarmonyPatch(typeof(PropertySystem), "GetItemTotalProperty")] [HarmonyPrefix] public static bool GetItemTotalProperty_Patch(int itemId, PropertySystem __instance, ref long __result) { GameMain.data.GetClusterSeedKey(); long num = 0L; long num2 = 0L; for (int i = 0; i < __instance.propertyDatas.Count; i++) { ClusterPropertyData val = __instance.propertyDatas[i]; int itemProduction = val.GetItemProduction(itemId); if (ReusableMetadataPlugin.useHighestProductionOnly.Value) { if (itemProduction > num) { num = itemProduction; num2 = num; ReusableMetadataPlugin.topSeedForItem[itemId] = val.seedKey; } } else { num2 += itemProduction; } } __result = num2; return false; } [HarmonyPatch(typeof(PropertySystem), "GetItemAvaliableProperty", new Type[] { typeof(long), typeof(int) })] [HarmonyPrefix] public static bool GetItemAvaliableProperty_Patch(long seedKey, int itemId, PropertySystem __instance, ref long __result) { long num = __instance.GetItemTotalProperty(itemId); if (ReusableMetadataPlugin.useVerboseLogging.Value) { ReusableMetadataPlugin.logger.LogInfo((object)$"GetItemAvaliableProperty_Patch_Start={num} ID={itemId}"); } if (GameMain.data.GetClusterSeedKey() == seedKey) { num -= GameMain.history.GetPropertyItemComsumption(itemId); _ = ReusableMetadataPlugin.useVerboseLogging.Value; if (!ReusableMetadataPlugin.useHighestProductionOnly.Value || seedKey == ReusableMetadataPlugin.topSeedForItem[itemId]) { num -= __instance.GetItemProduction(seedKey, itemId); } } __result = num; return false; } [HarmonyPatch(typeof(GameScenarioLogic))] [HarmonyPatch("GameTick")] [HarmonyPostfix] public static void GameScenarioLogic_GameTick_Patch(long time, GameScenarioLogic __instance) { if (__instance.gameData.gameDesc.isSandboxMode && ReusableMetadataPlugin.useSandboxCheat.Value) { __instance.propertyLogic.GameTick(time); } } [HarmonyPatch(typeof(GameMain))] [HarmonyPatch("Begin")] [HarmonyPostfix] public static void GameMain_Begin_Patch(GameMain __instance) { if (DSPGame.GameDesc.isSandboxMode && !ReusableMetadataPlugin.useSandboxCheat.Value) { for (int i = 6001; i <= 6006; i++) { GameMain.history.SetPropertyItemProduction(i, 0); DSPGame.propertySystem.SetItemProduction(DSPGame.GameDesc.seedKey64, i, 0); } } } [HarmonyPatch(typeof(PropertySystem))] [HarmonyPatch("GetItemProduction")] [HarmonyPostfix] public static void PropertySystem_GetItemProduction_Patch(long seedKey, int itemId, PropertySystem __instance, ref int __result) { if (GameMain.gameScenario != null && seedKey == GameMain.data.GetClusterSeedKey()) { int propertyItemProduction = GameMain.history.GetPropertyItemProduction(itemId); if (__result < propertyItemProduction) { __instance.SetItemProduction(seedKey, itemId, propertyItemProduction); GameMain.history.SetPropertyItemProduction(itemId, propertyItemProduction); __result = propertyItemProduction; } } } [HarmonyPatch(typeof(UIPropertyEntry))] [HarmonyPatch("UpdateUIElements")] [HarmonyPostfix] public static void UIPropertyEntry_UpdateUIElements_Patch(UIPropertyEntry __instance) { if (DSPGame.GameDesc.isSandboxMode && ReusableMetadataPlugin.useSandboxCheat.Value) { long itemAvaliableProperty = DSPGame.propertySystem.GetItemAvaliableProperty(GameMain.data.GetClusterSeedKey(), __instance.itemId); ((Selectable)__instance.realizeButton.button).interactable = GameMain.mainPlayer.isAlive && itemAvaliableProperty > 0; Text productionRateText = __instance.productionRateText1; string text2 = (__instance.productionRateText0.text = $"( x {ReusableMetadataPlugin.sandboxMultiplier.Value:0%} )"); productionRateText.text = text2; } } [HarmonyPatch(typeof(PropertyLogic), "UpdateProduction")] [HarmonyPrefix] public static bool PropertyLogic_UpdateProduction_Patch(PropertyLogic __instance) { FactoryProductionStat[] factoryStatPool = __instance.gameData.statistics.production.factoryStatPool; int factoryCount = __instance.gameData.factoryCount; ClusterPropertyData clusterData = __instance.propertySystem.GetClusterData(__instance.gameData.GetClusterSeedKey()); ClusterPropertyData propertyData = __instance.gameData.history.propertyData; if (ReusableMetadataPlugin.useVerboseLogging.Value) { ReusableMetadataPlugin.logger.LogInfo((object)"PropertyLogic_UpdateProduction_Patch"); } int[] productIds = PropertySystem.productIds; foreach (int num in productIds) { int itemProduction = propertyData.GetItemProduction(num); int itemProduction2 = clusterData.GetItemProduction(num); long num2 = 0L; for (int j = 0; j < factoryCount; j++) { int num3 = factoryStatPool[j].productIndices[num]; if (ReusableMetadataPlugin.useVerboseLogging.Value) { ReusableMetadataPlugin.logger.LogInfo((object)$"PropertyLogic_UpdateProduction_Patch productIndex={num3}"); } if (num3 > 0) { if (ReusableMetadataPlugin.useVerboseLogging.Value) { ReusableMetadataPlugin.logger.LogDebug((object)$"PropertyLogic_UpdateProduction_Patch factoryStatPool[index].productPool[productIndex].total[3]={factoryStatPool[j].productPool[num3].total[3]}"); } num2 += factoryStatPool[j].productPool[num3].total[3]; } } float num4 = ((!ReusableMetadataPlugin.useSandboxCheat.Value || !DSPGame.GameDesc.isSandboxMode) ? __instance.gameData.history.minimalPropertyMultiplier : ReusableMetadataPlugin.sandboxMultiplier.Value); int num5 = (int)Mathf.Clamp((float)(long)((double)num2 * (double)num4 / 60.0 + 0.001), -2.1474836E+09f, 2.1474836E+09f); if (num5 > itemProduction) { propertyData.SetItemProduction(num, num5); } if (num5 > itemProduction2) { clusterData.SetItemProduction(num, num5); } if (ReusableMetadataPlugin.useVerboseLogging.Value) { ReusableMetadataPlugin.logger.LogInfo((object)$"PropertyLogic_UpdateProduction_Patch count={num5}"); ReusableMetadataPlugin.logger.LogInfo((object)$"PropertyLogic_UpdateProduction_Patch num={num2}"); ReusableMetadataPlugin.logger.LogInfo((object)$"PropertyLogic_UpdateProduction_Patch minimalPropertyMultiplier={num4}"); } } return false; } }