Decompiled source of Unlimited Upgrades v1.0.1

AllUpgradesMod.dll

Decompiled 4 hours ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using BepInEx;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyCompany("AllUpgradesMod")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("AllUpgradesMod")]
[assembly: AssemblyTitle("AllUpgradesMod")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace AllUpgradesMod;

[BepInPlugin("com.pmadd.unlimitedupgrades", "Unlimited Upgrades Mod", "1.0.0")]
public class UnlimitedUpgradesPlugin : BaseUnityPlugin
{
	private void Awake()
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		new Harmony("com.pmadd.unlimitedupgrades").PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Unlimited Upgrades Mod loaded successfully!");
	}
}
[HarmonyPatch(typeof(Faction), "ApplyTraitsTo")]
public static class Faction_ApplyTraitsTo_Patch
{
	public static void Prefix(Faction __instance, Unit u)
	{
		if ((Object)(object)u != (Object)null && (Object)(object)u.modifiers != (Object)null)
		{
			u.modifiers.statMaxSlotted = 100;
		}
	}
}
[HarmonyPatch(typeof(CUIFleetConfigPanel), "PopulatePanelWithFaction")]
public static class CUIFleetConfigPanel_PopulatePanelWithFaction_Patch
{
	public static Dictionary<string, int> ScrollOffsets = new Dictionary<string, int>();

	public static bool Prefix(CUIFleetConfigPanel __instance, Faction f)
	{
		if ((Object)(object)f == (Object)null)
		{
			return true;
		}
		((Behaviour)__instance.numUnitsLabel).enabled = false;
		if (Object.op_Implicit((Object)(object)__instance.unitBlueprint))
		{
			((UIWidget)__instance.wireframeTexture).mainTexture = (Texture)(object)__instance.unitBlueprint.hudOutlineTexture;
			__instance.descriptionLabel.text = __instance.unitBlueprint.description;
			int num = 0;
			for (int i = 0; i < f.currentFleet.Count; i++)
			{
				if ((Object)(object)((Component)f.currentFleet[i]).GetComponent<Unit>().blueprint == (Object)(object)__instance.unitBlueprint)
				{
					num++;
				}
			}
			if (num > 1)
			{
				__instance.headerLabel.text = num + "x " + __instance.unitBlueprint.displayName + "S";
			}
			else
			{
				__instance.headerLabel.text = "1x " + __instance.unitBlueprint.displayName;
			}
		}
		UnitConfig configByID = f.GetConfigByID(__instance.unitConfigTag);
		if (configByID != null)
		{
			if (!ScrollOffsets.TryGetValue(__instance.unitConfigTag, out var value))
			{
				value = 0;
				ScrollOffsets[__instance.unitConfigTag] = 0;
			}
			int num2 = configByID.unitModifiers.Count + 1;
			int num3 = Mathf.Max(0, num2 - __instance.modifierButtons.Count);
			if (value > num3)
			{
				value = num3;
				ScrollOffsets[__instance.unitConfigTag] = value;
			}
			for (int j = 0; j < __instance.modifierButtons.Count; j++)
			{
				int num4 = value + j;
				((CUIFleetConfigButton)__instance.modifierButtons[j]).index = num4;
				UnitModifier modifier = null;
				if (num4 < configByID.unitModifiers.Count)
				{
					modifier = configByID.unitModifiers[num4];
				}
				__instance.modifierButtons[j].SetModifier(modifier);
			}
			for (int k = 0; k < configByID.weaponAssignments.Count; k++)
			{
				if (k < __instance.weaponButtons.Count)
				{
					__instance.weaponButtons[k].SetBlueprint(configByID.weaponAssignments[k].weaponBlueprint);
				}
			}
		}
		else
		{
			Debug.LogError((object)"Null unit config!");
		}
		return false;
	}
}
[HarmonyPatch(typeof(CUIFleetConfigPanel), "Update")]
public static class CUIFleetConfigPanel_Update_Patch
{
	public static void Postfix(CUIFleetConfigPanel __instance)
	{
		if (Controls.menuMouseControl)
		{
			UICamera.selectedObject = null;
		}
		GameObject hoveredObject = UICamera.hoveredObject;
		if ((Object)(object)hoveredObject != (Object)null)
		{
			CUIFleetConfigPanelModifierButton component = hoveredObject.GetComponent<CUIFleetConfigPanelModifierButton>();
			if ((Object)(object)component != (Object)null && (Object)(object)((CUIFleetConfigButton)component).configPanel == (Object)(object)__instance)
			{
				float axis = Input.GetAxis("Mouse ScrollWheel");
				if (axis != 0f)
				{
					Scroll(__instance, (!(axis > 0f)) ? 1 : (-1));
				}
			}
		}
		GameObject selectedObject = UICamera.selectedObject;
		if (!((Object)(object)selectedObject != (Object)null))
		{
			return;
		}
		CUIFleetConfigPanelModifierButton component2 = selectedObject.GetComponent<CUIFleetConfigPanelModifierButton>();
		if (!((Object)(object)component2 != (Object)null) || !((Object)(object)((CUIFleetConfigButton)component2).configPanel == (Object)(object)__instance))
		{
			return;
		}
		int num = __instance.modifierButtons.IndexOf(component2);
		if (num == __instance.modifierButtons.Count - 1)
		{
			if (Input.GetKeyDown((KeyCode)275) || Input.GetKeyDown((KeyCode)100) || Controls.player.GetButtonDown("Menu Right"))
			{
				Scroll(__instance, 1);
			}
		}
		else if (num == 0 && (Input.GetKeyDown((KeyCode)276) || Input.GetKeyDown((KeyCode)97) || Controls.player.GetButtonDown("Menu Left")))
		{
			Scroll(__instance, -1);
		}
	}

	private static void Scroll(CUIFleetConfigPanel panel, int direction)
	{
		UnitConfig configByID = Campaign.playerFaction.GetConfigByID(panel.unitConfigTag);
		if (configByID != null)
		{
			CUIFleetConfigPanel_PopulatePanelWithFaction_Patch.ScrollOffsets.TryGetValue(panel.unitConfigTag, out var value);
			int num = configByID.unitModifiers.Count + 1;
			int num2 = Mathf.Max(0, num - panel.modifierButtons.Count);
			int num3 = Mathf.Clamp(value + direction, 0, num2);
			if (num3 != value)
			{
				CUIFleetConfigPanel_PopulatePanelWithFaction_Patch.ScrollOffsets[panel.unitConfigTag] = num3;
				panel.Populate();
				AudioMenu.playToggle = true;
			}
		}
	}
}
[HarmonyPatch(typeof(CUIFleetConfigModifierPanel), "OnModifierButtonClicked")]
public static class CUIFleetConfigModifierPanel_OnModifierButtonClicked_Patch
{
	public static bool Prefix(CUIFleetConfigModifierPanel __instance, CUIModifierButton button)
	{
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		if (button.isLocked)
		{
			if (Campaign.playerFaction.CanPurchaseModifier(button.prefab))
			{
				MethodInfo? method = typeof(CUIFleetConfigModifierPanel).GetMethod("Purchase", BindingFlags.Instance | BindingFlags.NonPublic);
				typeof(CUIFleetConfigModifierPanel).GetField("_nextPurchasedModifier", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, button.prefab);
				typeof(CUIFleetConfigModifierPanel).GetField("_nextButton", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, button);
				method.Invoke(__instance, null);
			}
			else if (Campaign.playerFaction.upgradeTokens < button.prefab.upgradeTokenCost)
			{
				CUIFavorWidget.lastFlashTime = Time.time;
				Messenger<string, Color>.Broadcast("RequestToast", $"THIS UPGRADE REQUIRES {button.prefab.upgradeTokenCost} FAVOR", CockpitToast.notificationColor);
				AudioCockpit.PlayNegatory();
			}
			return false;
		}
		if ((button.prefab.allowedUnitTypes & CUIFleetConfigModifierPanel.nextBlueprint.prefab.unitType) == 0)
		{
			Messenger<string, Color>.Broadcast("RequestToast", "THIS UPGRADE CANNOT BE EQUIPPED ON THIS CLASS OF WARSHIP", CockpitToast.notificationColor);
			AudioCockpit.PlayNegatory();
			return false;
		}
		UnitConfig configByID = Campaign.playerFaction.GetConfigByID(CUIFleetConfigModifierPanel.nextTag);
		if (configByID != null)
		{
			if (configByID.unitModifiers.Contains(button.prefab))
			{
				configByID.unitModifiers.Remove(button.prefab);
				AudioMenu.playCancel = true;
			}
			else
			{
				int nextModifierIndex = CUIFleetConfigModifierPanel.nextModifierIndex;
				if (nextModifierIndex >= 0 && nextModifierIndex < configByID.unitModifiers.Count && (Object)(object)configByID.unitModifiers[nextModifierIndex] == (Object)null)
				{
					configByID.unitModifiers[nextModifierIndex] = button.prefab;
				}
				else
				{
					configByID.unitModifiers.Add(button.prefab);
				}
				AudioMenu.playUpgradeEquipped = true;
			}
			Campaign.SavePlayerFaction(false);
			__instance.Populate();
		}
		return false;
	}
}
[HarmonyPatch(typeof(CUIFleetConfigModifierPanel), "OnConfirmPurchaseClicked")]
public static class CUIFleetConfigModifierPanel_OnConfirmPurchaseClicked_Patch
{
	public static bool Prefix(CUIFleetConfigModifierPanel __instance)
	{
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Expected O, but got Unknown
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Expected O, but got Unknown
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		UnitModifier val = (UnitModifier)typeof(CUIFleetConfigModifierPanel).GetField("_nextPurchasedModifier", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
		CUIModifierButton val2 = (CUIModifierButton)typeof(CUIFleetConfigModifierPanel).GetField("_nextButton", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
		Campaign.playerFaction.PurchaseModifier(val);
		if ((val.allowedUnitTypes & CUIFleetConfigModifierPanel.nextBlueprint.prefab.unitType) != 0)
		{
			AudioMenu.playUpgradeEquipped = true;
			UnitConfig configByID = Campaign.playerFaction.GetConfigByID(CUIFleetConfigModifierPanel.nextTag);
			if (configByID != null)
			{
				int nextModifierIndex = CUIFleetConfigModifierPanel.nextModifierIndex;
				if (nextModifierIndex >= 0 && nextModifierIndex < configByID.unitModifiers.Count && (Object)(object)configByID.unitModifiers[nextModifierIndex] == (Object)null)
				{
					configByID.unitModifiers[nextModifierIndex] = val;
				}
				else
				{
					configByID.unitModifiers.Add(val);
				}
			}
		}
		else
		{
			AudioMenu.playUpgradePurchased = true;
		}
		Campaign.SavePlayerFaction(false);
		Game.Instance.menuSubstate = (MenuSubstate)262144;
		CUIFleetConfigMenu.Instance.state = (State)2;
		__instance.Populate();
		if ((Object)(object)val2 != (Object)null)
		{
			UICamera.selectedObject = ((Component)val2).gameObject;
		}
		return false;
	}
}
[HarmonyPatch(typeof(UnitModifier), "AddNewInstanceTo")]
public static class UnitModifier_AddNewInstanceTo_Patch
{
	public static bool Prefix(UnitModifier prefab, Unit u, ref UnitModifier __result)
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)prefab == (Object)null || (Object)(object)u == (Object)null)
		{
			return true;
		}
		if ((prefab.allowedUnitTypes & u.unitType) == 0)
		{
			Debug.LogWarning((object)$"Blocking incompatible modifier {((Object)prefab).name} from being added to unit {((Object)u).name} (type: {u.unitType})");
			__result = null;
			return false;
		}
		return true;
	}
}