Decompiled source of Life Cost API v4.0.1

LifeCost.dll

Decompiled 10 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using DiskCardGame;
using GBC;
using HarmonyLib;
using InscryptionAPI.Ascension;
using InscryptionAPI.Card;
using InscryptionAPI.CardCosts;
using InscryptionAPI.Helpers;
using InscryptionCommunityPatch.Card;
using LifeCost.Cards;
using LifeCost.Costs;
using LifeCost.Costs.HCost;
using LifeCost.Costs.LCost;
using LifeCost.Costs.MCost;
using LifeCost.Sigils;
using LifeCost.Utility;
using Microsoft.CodeAnalysis;
using Pixelplacement;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyDescription("")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("05fe5e41-204a-49d6-bb88-1d873869dc85")]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("LifeCost")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("LifeCost")]
[assembly: AssemblyTitle("LifeCost")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace LifeCost
{
	[BepInPlugin("extraVoid.inscryption.LifeCost", "Life Scrybe", "4.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public const string APIGUID = "cyantist.inscryption.api";

		public const string PluginGuid = "extraVoid.inscryption.LifeCost";

		public const string ZGUID = "community.inscryption.patch";

		private const string PluginName = "Life Scrybe";

		private const string PluginVersion = "4.0.0";

		public static string Directory;

		internal static ManualLogSource Log;

		internal static ConfigEntry<bool> configFairHandActive;

		internal static ConfigEntry<int> configFairHandCostL;

		internal static ConfigEntry<int> configFairHandCostM;

		internal static ConfigEntry<int> configFairHandCostH;

		private void Awake()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			Log = ((BaseUnityPlugin)this).Logger;
			Directory = ((BaseUnityPlugin)this).Info.Location.Replace("LifeCost.dll", "");
			new Harmony("extraVoid.inscryption.LifeCost").PatchAll();
			configFairHandActive = ((BaseUnityPlugin)this).Config.Bind<bool>("Fair Hand", "Active", true, "Should this mod post-fix patch fair hand to include the Money, Life, and Hybrid Costs?");
			configFairHandCostL = ((BaseUnityPlugin)this).Config.Bind<int>("Fair Hand", "Life Cost", 4, "The value in which the card should not show up in fair hand.");
			configFairHandCostM = ((BaseUnityPlugin)this).Config.Bind<int>("Fair Hand", "Money Cost", 2, "The value in which the card should not show up in fair hand.");
			configFairHandCostH = ((BaseUnityPlugin)this).Config.Bind<int>("Fair Hand", "Hybrid Cost", 2, "The value in which the card should not show up in fair hand.");
			CostsToAdd.AddCost();
			SigilsToAdd.AddSigils();
			Teck.AddCard();
			Meck.AddCard();
			Leck.AddCard();
		}

		private void Start()
		{
			Log.LogMessage((object)"Lifecost start event fired");
			BackwardsCompatibility.ChangeCardsToLifecost();
		}

		public static void AddStartingDeck()
		{
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("Dev_Test.png", typeof(Plugin).Assembly, (FilterMode)0);
			StarterDeckInfo val = ScriptableObject.CreateInstance<StarterDeckInfo>();
			val.title = "NewCost Dev Test";
			val.iconSprite = TextureHelper.ConvertTexture(imageAsTexture, (SpriteType)9, (FilterMode)0);
			val.cards = new List<CardInfo>
			{
				CardLoader.GetCardByName("lifecost_Leck"),
				CardLoader.GetCardByName("lifecost_Meck"),
				CardLoader.GetCardByName("lifecost_Teck")
			};
			StarterDeckManager.Add("extraVoid.inscryption.LifeCost", val, 0);
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "LifeCost";

		public const string PLUGIN_NAME = "LifeCost";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace LifeCost.Utility
{
	public static class ext
	{
		public static int LifeCost(this CardInfo info)
		{
			int? extendedPropertyAsInt = CardExtensions.GetExtendedPropertyAsInt(info, "LifeCost");
			if (!extendedPropertyAsInt.HasValue)
			{
				return 0;
			}
			return extendedPropertyAsInt.Value;
		}

		public static int MoneyCost(this CardInfo info)
		{
			int? extendedPropertyAsInt = CardExtensions.GetExtendedPropertyAsInt(info, "MoneyCost");
			if (!extendedPropertyAsInt.HasValue)
			{
				return 0;
			}
			return extendedPropertyAsInt.Value;
		}

		public static int LifeMoneyCost(this CardInfo info)
		{
			int? extendedPropertyAsInt = CardExtensions.GetExtendedPropertyAsInt(info, "LifeMoneyCost");
			if (!extendedPropertyAsInt.HasValue)
			{
				return 0;
			}
			return extendedPropertyAsInt.Value;
		}
	}
	public static class BackwardsCompatibility
	{
		public static void ChangeCardsToLifecost()
		{
			CardManager.ModifyCardList += delegate(List<CardInfo> cards)
			{
				foreach (CardInfo item in cards.Where((CardInfo c) => c.EnergyCost < 0))
				{
					int num = item.EnergyCost * -1;
					CardExtensions.SetExtendedProperty(item, "LifeMoneyCost", (object)num);
					CardExtensions.SetEnergyCost(item, (int?)0);
				}
				return cards;
			};
		}

		public static void SetCardsToLifeMoneycost()
		{
			CardManager.ModifyCardList += delegate(List<CardInfo> cards)
			{
				foreach (CardInfo item in cards.Where((CardInfo c) => CardExtensions.GetCustomCost(c, "LifeMoneyCost", false) != 0))
				{
					int customCost = CardExtensions.GetCustomCost(item, "LifeMoneyCost", false);
					CardExtensions.SetExtendedProperty(item, "LifeMoneyCost", (object)customCost);
				}
				return cards;
			};
		}

		public static void SetCardsToMoneycost()
		{
			CardManager.ModifyCardList += delegate(List<CardInfo> cards)
			{
				foreach (CardInfo item in cards.Where((CardInfo c) => CardExtensions.GetCustomCost(c, "MoneyCost", false) != 0))
				{
					int customCost = CardExtensions.GetCustomCost(item, "MoneyCost", false);
					CardExtensions.SetExtendedProperty(item, "MoneyCost", (object)customCost);
				}
				return cards;
			};
		}

		public static void SetCardsToLifecost()
		{
			CardManager.ModifyCardList += delegate(List<CardInfo> cards)
			{
				foreach (CardInfo item in cards.Where((CardInfo c) => CardExtensions.GetCustomCost(c, "LifeCost", false) != 0))
				{
					int customCost = CardExtensions.GetCustomCost(item, "LifeCost", false);
					CardExtensions.SetExtendedProperty(item, "LifeCost", (object)customCost);
				}
				return cards;
			};
		}

		public static void FixCardsToLifeMoneycost()
		{
			CardManager.ModifyCardList += delegate(List<CardInfo> cards)
			{
				foreach (CardInfo item in cards.Where((CardInfo c) => c.LifeMoneyCost() != 0))
				{
					int num = item.LifeMoneyCost();
					CardExtensions.SetCustomCost(item, "LifeMoneyCost", num);
				}
				return cards;
			};
		}

		public static void FixCardsToMoneycost()
		{
			CardManager.ModifyCardList += delegate(List<CardInfo> cards)
			{
				foreach (CardInfo item in cards.Where((CardInfo c) => c.MoneyCost() != 0))
				{
					int num = item.MoneyCost();
					CardExtensions.SetCustomCost(item, "MoneyCost", num);
				}
				return cards;
			};
		}

		public static void FixCardsToLifecost()
		{
			CardManager.ModifyCardList += delegate(List<CardInfo> cards)
			{
				foreach (CardInfo item in cards.Where((CardInfo c) => c.LifeCost() != 0))
				{
					int num = item.LifeCost();
					CardExtensions.SetCustomCost(item, "LifeCost", num);
				}
				return cards;
			};
		}
	}
	public static class CardUtils
	{
		private static Assembly _assembly;

		public static Assembly CurrentAssembly
		{
			get
			{
				Assembly result;
				if ((result = _assembly) == null)
				{
					result = (_assembly = Assembly.GetExecutingAssembly());
				}
				return result;
			}
		}

		public static Texture2D getImage(string path)
		{
			return TextureHelper.GetImageAsTexture(path, CurrentAssembly, (FilterMode)0);
		}

		public static Sprite getSprite(string path)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: 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)
			new Sprite();
			Texture2D image = getImage(path);
			return Sprite.Create(image, new Rect(0f, 0f, (float)((Texture)image).width, (float)((Texture)image).height), new Vector2(0.5f, 0.5f));
		}

		public static LineSet SetAbilityInfoDialogue(string dialogue)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			return new LineSet(new List<Line>
			{
				new Line
				{
					text = dialogue
				}
			});
		}

		public static AbilityInfo CreateAbilityWithDefaultSettings(string rulebookName, string rulebookDescription, Type behavior, Texture2D text_a1, Sprite text_a2, string LearnDialogue, bool withDialogue = false, int powerLevel = 0, bool leshyUsable = false, bool part1Modular = true, bool stack = false)
		{
			AbilityInfo val = AbilityManager.New("extraVoid.inscryption.LifeCost", rulebookName, rulebookDescription, behavior, (Texture)(object)text_a1);
			if (withDialogue)
			{
				val.abilityLearnedDialogue = SetAbilityInfoDialogue(LearnDialogue);
			}
			val.powerLevel = powerLevel;
			val.activated = true;
			if (part1Modular)
			{
				val.metaCategories = new List<AbilityMetaCategory>
				{
					(AbilityMetaCategory)1,
					(AbilityMetaCategory)0
				};
			}
			else
			{
				val.metaCategories = new List<AbilityMetaCategory> { (AbilityMetaCategory)0 };
			}
			val.pixelIcon = text_a2;
			val.canStack = stack;
			return val;
		}

		public static CardInfo CreateCardWithDefaultSettings(string InternalName, string DisplayName, int attack, int health, Texture2D texture_base, Texture2D texture_emission, List<CardMetaCategory> cardMetaCategories, List<Tribe> tribes, List<Trait> traits, List<Ability> abilities, Texture2D texture_pixel = null, int bloodCost = 0, int boneCost = 0, int energyCost = 0)
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Expected I4, but got Unknown
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			CardInfo val = CardManager.New("lifecost", InternalName, DisplayName, attack, health, "A puddle that errods all that touches it.");
			CardExtensions.SetPortrait(val, texture_base, texture_emission, (FilterMode?)null);
			if ((Object)(object)texture_pixel != (Object)null)
			{
				CardExtensions.SetPixelPortrait(val, texture_pixel, (FilterMode?)null);
			}
			val.metaCategories = cardMetaCategories;
			val.tribes = tribes;
			val.traits = traits;
			for (int i = 0; i < abilities.Count; i++)
			{
				CardExtensions.AddAbilities(val, (Ability[])(object)new Ability[1] { (Ability)(int)abilities[i] });
			}
			val.temple = (CardTemple)0;
			val.cardComplexity = (CardComplexity)2;
			CardExtensions.SetBloodCost(val, (int?)bloodCost);
			CardExtensions.SetBonesCost(val, (int?)boneCost);
			CardExtensions.SetEnergyCost(val, (int?)energyCost);
			return val;
		}
	}
}
namespace LifeCost.Sigils
{
	public class lifecost_ActivateEnergyGamble : LifeActiveAbilityCost
	{
		public static Ability ability;

		public override Ability Ability => ability;

		public override int EnergyCost => 6;

		public override IEnumerator Activate()
		{
			yield return ((AbilityBehaviour)this).PreSuccessfulTriggerSequence();
			yield return (object)new WaitForSeconds(0.15f);
			bool flag = !SaveManager.SaveFile.IsPart2;
			int amount = Random.Range(0, 3);
			if (amount == 0)
			{
				yield return ((AbilityBehaviour)this).LearnAbility(0.25f);
				yield return (object)new WaitForSeconds(0.1f);
				yield break;
			}
			Random random = new Random();
			bool whoGetsit = random.Next(2) == 0;
			if (flag)
			{
				float waitTime2 = 0.1f;
				Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
				yield return (object)new WaitForSeconds(waitTime2);
				((Card)((AbilityBehaviour)this).Card).Anim.LightNegationEffect();
				yield return PayCost.ShowDamageSequence(amount, amount, whoGetsit);
				yield return (object)new WaitForSeconds(waitTime2);
				Singleton<ViewManager>.Instance.SwitchToView((View)4, false, true);
				Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
			}
			else
			{
				float waitTime2 = 0.5f;
				yield return (object)new WaitForSeconds(waitTime2);
				((Card)((AbilityBehaviour)this).Card).Anim.LightNegationEffect();
				yield return PayCost.ShowDamageSequence(amount, amount, whoGetsit);
				yield return (object)new WaitForSeconds(waitTime2);
			}
			yield return ((AbilityBehaviour)this).LearnAbility(0.25f);
			yield return (object)new WaitForSeconds(0.1f);
		}
	}
	public class lifecost_ActivateLifeRandomStatsUp : LifeActiveAbilityCost
	{
		public static Ability ability;

		private const string MOD_ID = "extraVoid.inscryption.LifeCost_statsUp";

		public override Ability Ability => ability;

		public override int LifeMoneyCost => 5;

		public override IEnumerator Activate()
		{
			yield return ((AbilityBehaviour)this).PreSuccessfulTriggerSequence();
			yield return (object)new WaitForSeconds(0.15f);
			CardModificationInfo mod = ((AbilityBehaviour)this).Card.TemporaryMods.Find((CardModificationInfo x) => x.singletonId == "extraVoid.inscryption.LifeCost_statsUp");
			bool isPart = !SaveManager.SaveFile.IsPart2;
			if (mod == null)
			{
				mod = new CardModificationInfo();
				mod.singletonId = "extraVoid.inscryption.LifeCost_statsUp";
				((AbilityBehaviour)this).Card.AddTemporaryMod(mod);
			}
			yield return (object)new WaitForSeconds(0.5f);
			int StatsUp = Random.Range(0, 6);
			if (isPart)
			{
				Singleton<ViewManager>.Instance.SwitchToView((View)4, false, true);
				for (int index2 = 0; index2 < StatsUp; index2++)
				{
					if (Random.Range(1, 100) > 50)
					{
						yield return (object)new WaitForSeconds(0.2f);
						CardModificationInfo obj = mod;
						obj.healthAdjustment++;
						((AbilityBehaviour)this).Card.OnStatsChanged();
						((Card)((AbilityBehaviour)this).Card).Anim.StrongNegationEffect();
					}
					else
					{
						yield return (object)new WaitForSeconds(0.2f);
						CardModificationInfo obj2 = mod;
						obj2.attackAdjustment++;
						((AbilityBehaviour)this).Card.OnStatsChanged();
						((Card)((AbilityBehaviour)this).Card).Anim.StrongNegationEffect();
					}
				}
				yield return (object)new WaitForSeconds(0.1f);
				Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
			}
			else
			{
				for (int index2 = 0; index2 < StatsUp; index2++)
				{
					if (Random.Range(1, 100) > 50)
					{
						yield return (object)new WaitForSeconds(0.2f);
						CardModificationInfo obj3 = mod;
						obj3.healthAdjustment++;
						((AbilityBehaviour)this).Card.OnStatsChanged();
						((Card)((AbilityBehaviour)this).Card).Anim.StrongNegationEffect();
					}
					else
					{
						yield return (object)new WaitForSeconds(0.2f);
						CardModificationInfo obj4 = mod;
						obj4.attackAdjustment++;
						((AbilityBehaviour)this).Card.OnStatsChanged();
						((Card)((AbilityBehaviour)this).Card).Anim.StrongNegationEffect();
					}
				}
			}
			yield return ((AbilityBehaviour)this).LearnAbility(0.25f);
			yield return (object)new WaitForSeconds(0.1f);
		}
	}
	public class lifecost_ActivateCashConverter : LifeActiveAbilityCost
	{
		public static Ability ability;

		public override Ability Ability => ability;

		public override int MoneyCost => 4;

		public override IEnumerator Activate()
		{
			yield return ((AbilityBehaviour)this).PreSuccessfulTriggerSequence();
			yield return (object)new WaitForSeconds(0.15f);
			if (!SaveManager.SaveFile.IsPart2)
			{
				float waitTime2 = 0.1f;
				Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
				yield return (object)new WaitForSeconds(waitTime2);
				yield return PayCost.ShowDamageSequence(1, 1, toPlayer: false);
				yield return (object)new WaitForSeconds(waitTime2);
				Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
				Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
			}
			else
			{
				float waitTime2 = 0.5f;
				yield return (object)new WaitForSeconds(waitTime2);
				yield return PayCost.ShowDamageSequence(1, 1, toPlayer: false);
				yield return (object)new WaitForSeconds(waitTime2);
			}
			yield return ((AbilityBehaviour)this).LearnAbility(0.25f);
			yield return (object)new WaitForSeconds(0.1f);
		}
	}
	public class lifecost_ActivateLifeConverter : LifeActiveAbilityCost
	{
		public static Ability ability;

		public override Ability Ability => ability;

		public override int LifeCost => 2;

		public override IEnumerator Activate()
		{
			yield return ((AbilityBehaviour)this).PreSuccessfulTriggerSequence();
			yield return (object)new WaitForSeconds(0.15f);
			if (!SaveManager.SaveFile.IsPart2)
			{
				if (Chainloader.PluginInfos.ContainsKey("extraVoid.inscryption.LifeCost"))
				{
					Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
					yield return (object)new WaitForSeconds(0.25f);
					RunState run = RunState.Run;
					run.currency += 2;
					yield return Singleton<CurrencyBowl>.Instance.DropWeightsIn(2);
					yield return (object)new WaitForSeconds(0.75f);
					Singleton<ViewManager>.Instance.SwitchToView((View)4, false, true);
					Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
				}
				else
				{
					Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
					yield return (object)new WaitForSeconds(0.25f);
					RunState run2 = RunState.Run;
					run2.currency += 2;
					yield return Singleton<CurrencyBowl>.Instance.ShowGain(2, true, false);
					yield return (object)new WaitForSeconds(0.25f);
					Singleton<ViewManager>.Instance.SwitchToView((View)4, false, true);
					Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
				}
			}
			else
			{
				SaveData data = SaveData.Data;
				data.currency += 2;
				((Card)((AbilityBehaviour)this).Card).Anim.LightNegationEffect();
			}
			yield return ((AbilityBehaviour)this).LearnAbility(0.25f);
			yield return (object)new WaitForSeconds(0.1f);
		}
	}
	public class lifecost_ActivateStatsUpLife : LifeActiveAbilityCost
	{
		public static Ability ability;

		private const string MOD_ID = "extraVoid.inscryption.LifeCost_statsUp";

		public override Ability Ability => ability;

		public override int LifeCost => 3;

		public override IEnumerator Activate()
		{
			bool flag = !SaveManager.SaveFile.IsPart2;
			if (flag)
			{
				Singleton<ViewManager>.Instance.SwitchToView((View)4, false, true);
			}
			CardModificationInfo val = ((AbilityBehaviour)this).Card.TemporaryMods.Find((CardModificationInfo x) => x.singletonId == "extraVoid.inscryption.LifeCost_statsUp");
			if (val == null)
			{
				val = new CardModificationInfo();
				val.singletonId = "extraVoid.inscryption.LifeCost_statsUp";
				((AbilityBehaviour)this).Card.AddTemporaryMod(val);
			}
			CardModificationInfo obj = val;
			obj.attackAdjustment++;
			CardModificationInfo obj2 = val;
			obj2.healthAdjustment++;
			((AbilityBehaviour)this).Card.OnStatsChanged();
			yield return (object)new WaitForSeconds(0.25f);
			if (flag)
			{
				Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
			}
		}
	}
	public class lifecost_ActiveStatsUpMoney : LifeActiveAbilityCost
	{
		public static Ability ability;

		private const string MOD_ID = "extraVoid.inscryption.LifeCost_statsUp";

		public override Ability Ability => ability;

		public override int MoneyCost => 5;

		public override IEnumerator Activate()
		{
			CardModificationInfo val = ((AbilityBehaviour)this).Card.TemporaryMods.Find((CardModificationInfo x) => x.singletonId == "extraVoid.inscryption.LifeCost_statsUp");
			if (val == null)
			{
				val = new CardModificationInfo();
				val.singletonId = "extraVoid.inscryption.LifeCost_statsUp";
				((AbilityBehaviour)this).Card.AddTemporaryMod(val);
			}
			CardModificationInfo obj = val;
			obj.attackAdjustment++;
			CardModificationInfo obj2 = val;
			obj2.healthAdjustment++;
			((AbilityBehaviour)this).Card.OnStatsChanged();
			Singleton<ViewManager>.Instance.SwitchToView((View)4, false, true);
			yield return (object)new WaitForSeconds(0.25f);
			Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
		}
	}
	[HarmonyPatch]
	public abstract class LifeActiveAbilityCost : ActivatedAbilityBehaviour
	{
		public virtual int LifeMoneyCost { get; }

		public virtual int LifeCost { get; }

		public virtual int MoneyCost { get; }

		public override int EnergyCost { get; }

		public override int BonesCost { get; }

		private bool CanAffordLife()
		{
			return Singleton<LifeManager>.Instance.Balance + 4 >= LifeCost;
		}

		private bool CanAffordMoney()
		{
			int num = ((!SaveManager.SaveFile.IsPart2) ? RunState.Run.currency : SaveData.Data.currency);
			return num >= MoneyCost;
		}

		private bool CanAffordHybrid()
		{
			Plugin.Log.LogMessage((object)"Lifecost active ability patch firing 3");
			int num = ((!SaveManager.SaveFile.IsPart2) ? RunState.Run.currency : SaveData.Data.currency);
			int num2 = Singleton<LifeManager>.Instance.Balance + 4;
			return num + num2 >= LifeMoneyCost;
		}

		public IEnumerator OnActivatedAbility()
		{
			if (((ActivatedAbilityBehaviour)this).CanAfford() && CanAffordLife() && CanAffordMoney() && CanAffordHybrid() && ((ActivatedAbilityBehaviour)this).CanActivate())
			{
				if (((ActivatedAbilityBehaviour)this).EnergyCost > 0)
				{
					yield return Singleton<ResourcesManager>.Instance.SpendEnergy(((ActivatedAbilityBehaviour)this).EnergyCost);
					if ((Object)(object)Singleton<ConduitCircuitManager>.Instance != (Object)null)
					{
						CardSlot val = Singleton<BoardManager>.Instance.GetSlots(true).Find((CardSlot x) => (Object)(object)x.Card != (Object)null && x.Card.HasAbility((Ability)66));
						if ((Object)(object)val != (Object)null)
						{
							ConduitEnergy component = ((Component)val.Card).GetComponent<ConduitEnergy>();
							if ((Object)(object)component != (Object)null && component.CompletesCircuit())
							{
								yield return Singleton<ResourcesManager>.Instance.AddEnergy(((ActivatedAbilityBehaviour)this).EnergyCost);
							}
						}
					}
				}
				if (((ActivatedAbilityBehaviour)this).BonesCost > 0)
				{
					yield return Singleton<ResourcesManager>.Instance.SpendBones(((ActivatedAbilityBehaviour)this).BonesCost);
				}
				if (LifeCost > 0)
				{
					if (SaveManager.SaveFile.IsPart2)
					{
						yield return PayCost.extractCostPart2_lifeOnly(LifeCost);
					}
					else
					{
						yield return PayCost.extractCostPart1_lifeOnly(LifeCost);
					}
				}
				if (MoneyCost > 0)
				{
					if (SaveManager.SaveFile.IsPart2)
					{
						yield return PayCost.extractCostPart2_MoneyOnly(MoneyCost);
					}
					else
					{
						int currency = RunState.Run.currency;
						yield return PayCost.extractCostPart1_MoneyOnly(MoneyCost, currency);
					}
				}
				if (LifeMoneyCost > 0)
				{
					if (SaveManager.SaveFile.IsPart2)
					{
						int currency2 = SaveData.Data.currency;
						yield return PayCost.extractCostPart2_hybrid(LifeMoneyCost, currency2);
					}
					else
					{
						int currency3 = RunState.Run.currency;
						yield return PayCost.extractCostPart1_hybrid(LifeMoneyCost, currency3);
					}
				}
				yield return (object)new WaitForSeconds(0.1f);
				yield return ((AbilityBehaviour)this).PreSuccessfulTriggerSequence();
				yield return ((ActivatedAbilityBehaviour)this).Activate();
				ProgressionData.SetMechanicLearned((MechanicsConcept)61);
			}
			else
			{
				((Card)((AbilityBehaviour)this).Card).Anim.LightNegationEffect();
				AudioController.Instance.PlaySound2D("toneless_negate", (MixerGroup)10, 0.2f, 0f, (Pitch)null, (Repetition)null, (Randomization)null, (Distortion)null, false);
				yield return (object)new WaitForSeconds(0.25f);
			}
		}
	}
	internal class SigilsToAdd
	{
		public static void AddSigils()
		{
			AddActivateEnergyGamble();
			AddActivateLifeConverter();
			AddActivateLifeRandomStatsUp();
			AddActiveCashConverter();
			AddActiveStatsUpLife();
			AddActiveStatsUpMoney();
		}

		private static void AddActivateEnergyGamble()
		{
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("lifecost_ActivateEnergyGamble.png", typeof(Plugin).Assembly, (FilterMode)0);
			Sprite imageAsSprite = TextureHelper.GetImageAsSprite("lifecost_ActivateEnergyGamble_a2.png", typeof(Plugin).Assembly, (SpriteType)11, (FilterMode)0);
			int powerLevel = 0;
			bool leshyUsable = true;
			bool part1Modular = false;
			bool stack = false;
			lifecost_ActivateEnergyGamble.ability = CardUtils.CreateAbilityWithDefaultSettings("Max Energy Gamble", "Pay 6 energy to put 0 to 3 damage on someone's side of the scale", typeof(lifecost_ActivateEnergyGamble), imageAsTexture, imageAsSprite, "Money for Blood", withDialogue: true, powerLevel, leshyUsable, part1Modular, stack).ability;
		}

		private static void AddActivateLifeRandomStatsUp()
		{
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("lifecost_ActivateLifeRandomStatsUp.png", typeof(Plugin).Assembly, (FilterMode)0);
			Sprite imageAsSprite = TextureHelper.GetImageAsSprite("lifecost_ActivateLifeRandomStatsUp_a2.png", typeof(Plugin).Assembly, (SpriteType)11, (FilterMode)0);
			int powerLevel = 2;
			bool leshyUsable = true;
			bool part1Modular = false;
			bool stack = false;
			AbilityInfo obj = CardUtils.CreateAbilityWithDefaultSettings("Die Roll", "Pay 5 Life/Foils to gain between 0 and 6 increase in stats, distributed randomly", typeof(lifecost_ActivateLifeRandomStatsUp), imageAsTexture, imageAsSprite, "Sing it once, Sing it twice, take a chance and roll the dice!", withDialogue: true, powerLevel, leshyUsable, part1Modular, stack);
			obj.activated = true;
			lifecost_ActivateLifeRandomStatsUp.ability = obj.ability;
		}

		private static void AddActiveCashConverter()
		{
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("lifecost_CashConverter.png", typeof(Plugin).Assembly, (FilterMode)0);
			Sprite imageAsSprite = TextureHelper.GetImageAsSprite("lifecost_CashConverter_a2.png", typeof(Plugin).Assembly, (SpriteType)11, (FilterMode)0);
			int powerLevel = 2;
			bool leshyUsable = true;
			bool part1Modular = false;
			bool stack = false;
			lifecost_ActivateCashConverter.ability = CardUtils.CreateAbilityWithDefaultSettings("Cash Converter", "Pay 4 foils to put 1 damage on your opponent's side of the scale", typeof(lifecost_ActivateCashConverter), imageAsTexture, imageAsSprite, "Money for Blood", withDialogue: true, powerLevel, leshyUsable, part1Modular, stack).ability;
		}

		private static void AddActivateLifeConverter()
		{
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("lifecost_LifeConverter.png", typeof(Plugin).Assembly, (FilterMode)0);
			Sprite imageAsSprite = TextureHelper.GetImageAsSprite("lifecost_LifeConverter_a2.png", typeof(Plugin).Assembly, (SpriteType)11, (FilterMode)0);
			int powerLevel = 3;
			bool leshyUsable = true;
			bool part1Modular = false;
			bool stack = false;
			lifecost_ActivateLifeConverter.ability = CardUtils.CreateAbilityWithDefaultSettings("Life Converter", "Pay 2 life to gain 1 foils", typeof(lifecost_ActivateLifeConverter), imageAsTexture, imageAsSprite, "Blood for money", withDialogue: true, powerLevel, leshyUsable, part1Modular, stack).ability;
		}

		private static void AddActiveStatsUpLife()
		{
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("lifecost_ActivateStatsUpLife.png", typeof(Plugin).Assembly, (FilterMode)0);
			Sprite imageAsSprite = TextureHelper.GetImageAsSprite("lifecost_ActivateStatsUpLife_a2.png", typeof(Plugin).Assembly, (SpriteType)11, (FilterMode)0);
			int powerLevel = 3;
			bool leshyUsable = true;
			bool part1Modular = true;
			bool stack = false;
			AbilityInfo obj = CardUtils.CreateAbilityWithDefaultSettings("Vamperic Strength", "Pay 3 life to increase the power and health of this card by 1", typeof(lifecost_ActivateStatsUpLife), imageAsTexture, imageAsSprite, "Hurting oneself can lead to an increase in strength.", withDialogue: true, powerLevel, leshyUsable, part1Modular, stack);
			obj.activated = true;
			lifecost_ActivateStatsUpLife.ability = obj.ability;
		}

		private static void AddActiveStatsUpMoney()
		{
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("lifecostActivateStatsUpMoney.png", typeof(Plugin).Assembly, (FilterMode)0);
			Sprite imageAsSprite = TextureHelper.GetImageAsSprite("lifecostActivateStatsUpMoney_a2.png", typeof(Plugin).Assembly, (SpriteType)11, (FilterMode)0);
			int powerLevel = 3;
			bool leshyUsable = true;
			bool part1Modular = false;
			bool stack = false;
			lifecost_ActiveStatsUpMoney.ability = CardUtils.CreateAbilityWithDefaultSettings("Greedy Strength", "Pay 5 currency to increase the power and health of this card by 1", typeof(lifecost_ActiveStatsUpMoney), imageAsTexture, imageAsSprite, "One can be hired to do many tasks", withDialogue: true, powerLevel, leshyUsable, part1Modular, stack).ability;
		}
	}
}
namespace LifeCost.Costs
{
	internal class CostsToAdd
	{
		public static void AddCost()
		{
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("CostChoiceBack.png", typeof(CostsToAdd).Assembly, (FilterMode)0);
			FullCardCost val = CardCostManager.Register("extraVoid.inscryption.LifeCost", "LifeMoneyCost", typeof(LifeMoneyCost), (Func<int, CardInfo, PlayableCard, Texture2D>)LifeCost.Costs.HCost.Textures.Texture_3D, (Func<int, CardInfo, PlayableCard, Texture2D>)LifeCost.Costs.HCost.Textures.Texture_Pixel);
			CardCostManager.SetCostTier(val, (Func<int, int>)LifeCost.Costs.HCost.CostTier.CostTierH);
			val.ResourceType = (ResourceType)42;
			CardCostManager.SetFoundAtChoiceNodes(val, true, (Texture)(object)imageAsTexture);
			FullCardCost val2 = CardCostManager.Register("extraVoid.inscryption.LifeCost", "LifeCost", typeof(LifeCost.Costs.LCost.LifeCost), (Func<int, CardInfo, PlayableCard, Texture2D>)LifeCost.Costs.LCost.Textures.Texture_3D, (Func<int, CardInfo, PlayableCard, Texture2D>)LifeCost.Costs.LCost.Textures.Texture_Pixel);
			CardCostManager.SetCostTier(val2, (Func<int, int>)LifeCost.Costs.LCost.CostTier.CostTierL);
			val2.ResourceType = val.ResourceType;
			FullCardCost val3 = CardCostManager.Register("extraVoid.inscryption.LifeCost", "MoneyCost", typeof(MoneyCost), (Func<int, CardInfo, PlayableCard, Texture2D>)LifeCost.Costs.MCost.Textures.Texture_3D, (Func<int, CardInfo, PlayableCard, Texture2D>)LifeCost.Costs.MCost.Textures.Texture_Pixel);
			CardCostManager.SetCostTier(val3, (Func<int, int>)LifeCost.Costs.MCost.CostTier.CostTierM);
			val3.ResourceType = val.ResourceType;
			if (Plugin.configFairHandActive.Value)
			{
				CardCostManager.SetCanBePlayedByTurn2WithHand(val, (Func<int, CardInfo, List<CardInfo>, bool>)LifeCost.Costs.HCost.CardCanBePlayedByTurn2WithHand.CanBePlayed);
				CardCostManager.SetCanBePlayedByTurn2WithHand(val2, (Func<int, CardInfo, List<CardInfo>, bool>)LifeCost.Costs.LCost.CardCanBePlayedByTurn2WithHand.CanBePlayed);
				CardCostManager.SetCanBePlayedByTurn2WithHand(val3, (Func<int, CardInfo, List<CardInfo>, bool>)LifeCost.Costs.MCost.CardCanBePlayedByTurn2WithHand.CanBePlayed);
			}
		}
	}
	internal class PayCost
	{
		public static IEnumerator extractCostPart1_hybrid(int costToPay, int currentCurrency)
		{
			float waitTime = 0.1f;
			List<Rigidbody> list2;
			if (costToPay > currentCurrency)
			{
				Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
				costToPay -= currentCurrency;
				yield return (object)new WaitForSeconds(waitTime);
				list2 = Singleton<CurrencyBowl>.Instance.TakeWeights(RunState.Run.currency);
				foreach (Rigidbody rigidbody2 in list2)
				{
					yield return (object)new WaitForSeconds(waitTime);
					float num = (float)list2.IndexOf(rigidbody2) * 0.05f;
					Tween.Position(((Component)rigidbody2).transform, ((Component)rigidbody2).transform.position + Vector3.up * 0.5f, 0.075f, num, Tween.EaseIn, (LoopType)0, (Action)null, (Action)null, true);
					Tween.Position(((Component)rigidbody2).transform, new Vector3(0f, 5.5f, 4f), 0.3f, 0.125f + num, Tween.EaseOut, (LoopType)0, (Action)null, (Action)null, true);
					Object.Destroy((Object)(object)((Component)rigidbody2).gameObject, 0.5f);
				}
				RunState.Run.currency = 0;
				yield return (object)new WaitForSeconds(waitTime);
				yield return ShowDamageSequence(costToPay, costToPay, toPlayer: true);
				Singleton<ViewManager>.Instance.SwitchToView((View)0, false, true);
				Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
				yield break;
			}
			Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
			yield return (object)new WaitForSeconds(waitTime);
			list2 = Singleton<CurrencyBowl>.Instance.TakeWeights(costToPay);
			foreach (Rigidbody rigidbody2 in list2)
			{
				yield return (object)new WaitForSeconds(waitTime);
				float num2 = (float)list2.IndexOf(rigidbody2) * 0.05f;
				Tween.Position(((Component)rigidbody2).transform, ((Component)rigidbody2).transform.position + Vector3.up * 0.5f, 0.075f, num2, Tween.EaseIn, (LoopType)0, (Action)null, (Action)null, true);
				Tween.Position(((Component)rigidbody2).transform, new Vector3(0f, 5.5f, 4f), 0.3f, 0.125f + num2, Tween.EaseOut, (LoopType)0, (Action)null, (Action)null, true);
				Object.Destroy((Object)(object)((Component)rigidbody2).gameObject, 0.5f);
			}
			yield return (object)new WaitForSeconds(waitTime);
			RunState.Run.currency = currentCurrency - costToPay;
			Singleton<ViewManager>.Instance.SwitchToView((View)0, false, true);
			Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
		}

		public static IEnumerator extractCostPart1_lifeOnly(int costToPay)
		{
			float waitTime = 0.1f;
			Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
			yield return (object)new WaitForSeconds(waitTime);
			yield return ShowDamageSequence(costToPay, costToPay, toPlayer: true);
			yield return (object)new WaitForSeconds(waitTime);
			Singleton<ViewManager>.Instance.SwitchToView((View)0, false, true);
			Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
		}

		public static IEnumerator extractCostPart1_MoneyOnly(int costToPay, int currentCurrency)
		{
			float waitTime = 0.1f;
			Singleton<ViewManager>.Instance.SwitchToView((View)7, false, true);
			yield return (object)new WaitForSeconds(waitTime);
			List<Rigidbody> list = Singleton<CurrencyBowl>.Instance.TakeWeights(costToPay);
			foreach (Rigidbody rigidbody in list)
			{
				yield return (object)new WaitForSeconds(waitTime);
				float num = (float)list.IndexOf(rigidbody) * 0.05f;
				Tween.Position(((Component)rigidbody).transform, ((Component)rigidbody).transform.position + Vector3.up * 0.5f, 0.075f, num, Tween.EaseIn, (LoopType)0, (Action)null, (Action)null, true);
				Tween.Position(((Component)rigidbody).transform, new Vector3(0f, 5.5f, 4f), 0.3f, 0.125f + num, Tween.EaseOut, (LoopType)0, (Action)null, (Action)null, true);
				Object.Destroy((Object)(object)((Component)rigidbody).gameObject, 0.5f);
			}
			yield return (object)new WaitForSeconds(waitTime);
			RunState.Run.currency = currentCurrency - costToPay;
			Singleton<ViewManager>.Instance.SwitchToView((View)0, false, true);
			Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0;
		}

		public static IEnumerator ShowDamageSequence(int damage, int numWeights, bool toPlayer, float waitAfter = 0.125f, GameObject alternateWeightPrefab = null, float waitBeforeCalcDamage = 0f, bool changeView = false)
		{
			if (damage > 1 && (Object)(object)Singleton<OpponentAnimationController>.Instance != (Object)null)
			{
				if ((Object)(object)P03AnimationController.Instance != (Object)null && (int)P03AnimationController.Instance.CurrentFace == 0)
				{
					P03AnimationController.Instance.SwitchToFace((Face)(toPlayer ? 4 : 3), false, true);
				}
				else if ((Object)(object)Singleton<LifeManager>.Instance.Scales != (Object)null)
				{
					Singleton<OpponentAnimationController>.Instance.SetLookTarget(((Component)Singleton<LifeManager>.Instance.Scales).transform, Vector3.up * 2f);
				}
			}
			if ((Object)(object)Singleton<LifeManager>.Instance.Scales != (Object)null)
			{
				if (changeView)
				{
					Singleton<ViewManager>.Instance.SwitchToView((View)7, false, false);
					yield return (object)new WaitForSeconds(0.1f);
				}
				yield return Singleton<LifeManager>.Instance.Scales.AddDamage(damage, numWeights, toPlayer, alternateWeightPrefab);
				if (waitBeforeCalcDamage > 0f)
				{
					yield return (object)new WaitForSeconds(waitBeforeCalcDamage);
				}
				if (toPlayer)
				{
					LifeManager instance = Singleton<LifeManager>.Instance;
					instance.PlayerDamage += damage;
				}
				else
				{
					LifeManager instance2 = Singleton<LifeManager>.Instance;
					instance2.OpponentDamage += damage;
				}
				yield return (object)new WaitForSeconds(waitAfter);
			}
			if ((Object)(object)Singleton<OpponentAnimationController>.Instance != (Object)null)
			{
				if ((Object)(object)P03AnimationController.Instance != (Object)null && ((int)P03AnimationController.Instance.CurrentFace == 3 || (int)P03AnimationController.Instance.CurrentFace == 4))
				{
					P03AnimationController.Instance.PlayFaceStatic();
					P03AnimationController.Instance.SwitchToFace((Face)0, false, false);
				}
				else
				{
					Singleton<OpponentAnimationController>.Instance.ClearLookTarget();
				}
			}
		}

		public static IEnumerator extractCostPart2_hybrid(int costToPay, int currentCurrency)
		{
			float waitTime = 0.5f;
			if (costToPay > currentCurrency)
			{
				costToPay -= currentCurrency;
				yield return (object)new WaitForSeconds(waitTime);
				AudioController.Instance.PlaySound2D("chipDelay_2", (MixerGroup)0, 1f, 0f, (Pitch)null, (Repetition)null, (Randomization)null, (Distortion)null, false);
				yield return foilToZero();
				yield return (object)new WaitForSeconds(waitTime);
				yield return ShowDamageSequence(costToPay, costToPay, toPlayer: true);
			}
			else
			{
				AudioController.Instance.PlaySound2D("chipDelay_2", (MixerGroup)0, 1f, 0f, (Pitch)null, (Repetition)null, (Randomization)null, (Distortion)null, false);
				yield return foilSpend(costToPay);
			}
		}

		public static IEnumerator extractCostPart2_lifeOnly(int costToPay)
		{
			float waitTime = 0.5f;
			yield return (object)new WaitForSeconds(waitTime);
			yield return ShowDamageSequence(costToPay, costToPay, toPlayer: true);
			yield return (object)new WaitForSeconds(waitTime);
		}

		public static IEnumerator extractCostPart2_MoneyOnly(int costToPay)
		{
			float waitTime = 0.5f;
			yield return (object)new WaitForSeconds(waitTime);
			AudioController.Instance.PlaySound2D("chipDelay_2", (MixerGroup)0, 1f, 0f, (Pitch)null, (Repetition)null, (Randomization)null, (Distortion)null, false);
			yield return foilSpend(costToPay);
			yield return (object)new WaitForSeconds(waitTime);
		}

		public static IEnumerator foilSetup()
		{
			Plugin.Log.LogWarning((object)"Life cost set up");
			Plugin.Log.LogWarning((object)SaveData.Data.currency);
			yield break;
		}

		public static IEnumerator foilCleanUp()
		{
			Plugin.Log.LogWarning((object)"Life cost clean up");
			Plugin.Log.LogWarning((object)SaveData.Data.currency);
			yield break;
		}

		public static IEnumerator foilSpend(int amount)
		{
			Plugin.Log.LogWarning((object)("Spending foils: " + SaveData.Data.currency));
			yield return SaveData.Data.currency = SaveData.Data.currency - amount;
			Plugin.Log.LogWarning((object)("current foils: " + SaveData.Data.currency));
		}

		public static IEnumerator foilToZero()
		{
			SaveData data = SaveData.Data;
			int num = 0;
			data.currency = 0;
			yield return num;
		}
	}
}
namespace LifeCost.Costs.MCost
{
	internal class CardCanBePlayedByTurn2WithHand
	{
		public static bool CanBePlayed(int amount, CardInfo card, List<CardInfo> hand)
		{
			return amount <= Plugin.configFairHandCostM.Value;
		}
	}
	internal class CostTier
	{
		public static int CostTierM(int amount)
		{
			return Mathf.FloorToInt((float)amount / 5f);
		}
	}
	public class MoneyCost : CustomCardCost
	{
		public ResourceType ResourceType = (ResourceType)42;

		public override string CostName => "MoneyCost";

		public override bool CostSatisfied(int cardCost, PlayableCard card)
		{
			int num = ((!SaveManager.SaveFile.IsPart2) ? RunState.Run.currency : SaveData.Data.currency);
			if (cardCost > num)
			{
				return false;
			}
			return true;
		}

		public override string CostUnsatisfiedHint(int cardCost, PlayableCard card)
		{
			if (SaveManager.SaveFile.IsPart2)
			{
				return "You do not have enough [c:gray]Foils[c:] to play that. You gain [c:gray]Foils[c:] by dealing overkill damage.";
			}
			string item = "You lack the foils to play that [c:gray]" + ((Card)card).Info.DisplayedNameLocalized + "[c:].";
			string item2 = $"[c:gray]{((Card)card).Info.DisplayedNameLocalized}[c:] requires you pay it's cost in [c:gray]foils[c:], that which you have [c:gray]{RunState.Run.currency}[c:].";
			string item3 = $"That [c:gray]{((Card)card).Info.DisplayedNameLocalized}[c:] has the cost of [c:gray]{cardCost}[c:] foils, which you do not have.";
			List<string> list = new List<string>();
			list.Add(item);
			list.Add(item2);
			list.Add(item3);
			return list[Random.Range(0, list.Count)];
		}

		public override IEnumerator OnPlayed(int cardCost, PlayableCard card)
		{
			if (SaveManager.SaveFile.IsPart2)
			{
				yield return PayCost.extractCostPart2_MoneyOnly(cardCost);
			}
			else
			{
				yield return PayCost.extractCostPart1_MoneyOnly(cardCost, RunState.Run.currency);
			}
		}
	}
	internal class Textures
	{
		public static Texture2D Texture_3D(int cardCost, CardInfo info, PlayableCard card)
		{
			return TextureHelper.GetImageAsTexture($"MoneyCost_{cardCost}.png", typeof(Plugin).Assembly, (FilterMode)0);
		}

		public static Texture2D Texture_Pixel(int cardCost, CardInfo info, PlayableCard card)
		{
			return Part2CardCostRender.CombineIconAndCount(cardCost, TextureHelper.GetImageAsTexture("MoneyCost_pixel.png", typeof(Plugin).Assembly, (FilterMode)0));
		}
	}
}
namespace LifeCost.Costs.HCost
{
	internal class CardCanBePlayedByTurn2WithHand
	{
		public static bool CanBePlayed(int amount, CardInfo card, List<CardInfo> hand)
		{
			return amount <= Plugin.configFairHandCostH.Value;
		}
	}
	internal class CostTier
	{
		public static int CostTierH(int amount)
		{
			return Mathf.FloorToInt((float)amount / 3f);
		}
	}
	public class LifeMoneyCost : CustomCardCost
	{
		public ResourceType ResourceType = (ResourceType)42;

		public override string CostName => "LifeMoneyCost";

		public override bool CostSatisfied(int cardCost, PlayableCard card)
		{
			int num = ((!SaveManager.SaveFile.IsPart2) ? RunState.Run.currency : SaveData.Data.currency);
			int num2 = num + Singleton<LifeManager>.Instance.Balance + 4;
			if (cardCost > num2)
			{
				return false;
			}
			return true;
		}

		public override string CostUnsatisfiedHint(int cardCost, PlayableCard card)
		{
			if (SaveManager.SaveFile.IsPart2)
			{
				return "You do not have enough [c:bG]Life[c:] or [c:gray]Foils[c:] to play that. Damage your opponent to gain more [c:bG]Life[c:].";
			}
			return "Your [c:bG]Scales[c:] are too tipped and you lack the [c:gray]Foils[c:] to play " + ((Card)card).Info.DisplayedNameLocalized + ".";
		}

		public override IEnumerator OnPlayed(int cardCost, PlayableCard card)
		{
			if (SaveManager.SaveFile.IsPart2)
			{
				yield return PayCost.extractCostPart2_hybrid(cardCost, SaveData.Data.currency);
			}
			else
			{
				yield return PayCost.extractCostPart1_hybrid(cardCost, RunState.Run.currency);
			}
		}
	}
	internal class Textures
	{
		public static Texture2D Texture_3D(int cardCost, CardInfo info, PlayableCard card)
		{
			return TextureHelper.GetImageAsTexture($"LifeMoneyCost_{cardCost}.png", typeof(Plugin).Assembly, (FilterMode)0);
		}

		public static Texture2D Texture_Pixel(int cardCost, CardInfo info, PlayableCard card)
		{
			return Part2CardCostRender.CombineIconAndCount(cardCost, TextureHelper.GetImageAsTexture("LifeMoneyCost_pixel.png", typeof(Plugin).Assembly, (FilterMode)0));
		}
	}
}
namespace LifeCost.Costs.LCost
{
	internal class CardCanBePlayedByTurn2WithHand
	{
		public static bool CanBePlayed(int amount, CardInfo card, List<CardInfo> hand)
		{
			return amount <= Plugin.configFairHandCostL.Value;
		}
	}
	internal class CostTier
	{
		public static int CostTierL(int amount)
		{
			return Mathf.FloorToInt((float)amount);
		}
	}
	public class LifeCost : CustomCardCost
	{
		public ResourceType ResourceType = (ResourceType)42;

		public override string CostName => "LifeCost";

		public override bool CostSatisfied(int cardCost, PlayableCard card)
		{
			int num = Singleton<LifeManager>.Instance.Balance + 4;
			if (cardCost > num)
			{
				return false;
			}
			return true;
		}

		public override string CostUnsatisfiedHint(int cardCost, PlayableCard card)
		{
			if (SaveManager.SaveFile.IsPart2)
			{
				return "You do not have enough [c:bG]Life[c:] on your scales to play that. Damage your opponent to gain more [c:bG]Life[c:].";
			}
			string item = "Your [c:bG]Scales[c:] are too tipped to play [c:bG]" + ((Card)card).Info.DisplayedNameLocalized + "[c:].";
			string item2 = "[c:bG]" + ((Card)card).Info.DisplayedNameLocalized + "[c:] requires you to pay in life, in which you can not fullfill without killing yourself.";
			string item3 = "You would kill yourself if you played [c:bG]" + ((Card)card).Info.DisplayedNameLocalized + "[c:]. Your [c:bG]Scales[c:] are too tipped";
			List<string> list = new List<string>();
			list.Add(item);
			list.Add(item2);
			list.Add(item3);
			return list[Random.Range(0, list.Count)];
		}

		public override IEnumerator OnPlayed(int cardCost, PlayableCard card)
		{
			if (SaveManager.SaveFile.IsPart2)
			{
				yield return PayCost.extractCostPart2_lifeOnly(cardCost);
			}
			else
			{
				yield return PayCost.extractCostPart1_lifeOnly(cardCost);
			}
		}
	}
	internal class Textures
	{
		public static Texture2D Texture_3D(int cardCost, CardInfo info, PlayableCard card)
		{
			return TextureHelper.GetImageAsTexture($"LifeCost_{cardCost}.png", typeof(Plugin).Assembly, (FilterMode)0);
		}

		public static Texture2D Texture_Pixel(int cardCost, CardInfo info, PlayableCard card)
		{
			return Part2CardCostRender.CombineIconAndCount(cardCost, TextureHelper.GetImageAsTexture("LifeCost_pixel.png", typeof(Plugin).Assembly, (FilterMode)0));
		}
	}
}
namespace LifeCost.Cards
{
	public static class Leck
	{
		public static void AddCard()
		{
			string displayName = "Leck";
			string description = "The Lost Beast, in the shape of a tooth, showing up only in error.";
			int attack = 5;
			int health = 1;
			int bloodCost = 0;
			int boneCost = 0;
			int energyCost = 0;
			List<CardMetaCategory> cardMetaCategories = new List<CardMetaCategory>();
			List<Tribe> tribes = new List<Tribe>();
			List<Ability> abilities = new List<Ability>();
			List<Trait> traits = new List<Trait>();
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("teck.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D imageAsTexture2 = TextureHelper.GetImageAsTexture("pixel_teck.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D imageAsTexture3 = TextureHelper.GetImageAsTexture("teck_e.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D texture_base = imageAsTexture;
			Texture2D texture_emission = imageAsTexture3;
			Texture2D texture_pixel = imageAsTexture2;
			CardInfo val = CardUtils.CreateCardWithDefaultSettings("lifecost_Leck", displayName, attack, health, texture_base, texture_emission, cardMetaCategories, tribes, traits, abilities, texture_pixel, bloodCost, boneCost, energyCost);
			val.description = description;
			CardExtensions.SetCustomCost(val, "LifeCost", 4);
			CardManager.Add("lifecost", val);
		}
	}
	public static class Meck
	{
		public static void AddCard()
		{
			string displayName = "Meck";
			string description = "The Lost Beast, in the shape of a tooth, showing up only in error.";
			int attack = 1;
			int health = 1;
			int bloodCost = 0;
			int boneCost = 0;
			int energyCost = 0;
			List<CardMetaCategory> cardMetaCategories = new List<CardMetaCategory>();
			List<Tribe> tribes = new List<Tribe>();
			List<Ability> abilities = new List<Ability>();
			List<Trait> traits = new List<Trait>();
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("teck.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D imageAsTexture2 = TextureHelper.GetImageAsTexture("pixel_teck.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D imageAsTexture3 = TextureHelper.GetImageAsTexture("teck_e.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D texture_base = imageAsTexture;
			Texture2D texture_emission = imageAsTexture3;
			Texture2D texture_pixel = imageAsTexture2;
			CardInfo val = CardUtils.CreateCardWithDefaultSettings("lifecost_Meck", displayName, attack, health, texture_base, texture_emission, cardMetaCategories, tribes, traits, abilities, texture_pixel, bloodCost, boneCost, energyCost);
			val.description = description;
			CardExtensions.SetCustomCost(val, "MoneyCost", 1);
			CardManager.Add("lifecost", val);
		}
	}
	public static class Teck
	{
		public static void AddCard()
		{
			string displayName = "Teck";
			string description = "The Lost Beast, in the shape of a tooth, showing up only in error.";
			int attack = 1;
			int health = 1;
			int bloodCost = 0;
			int boneCost = 0;
			int energyCost = 0;
			List<CardMetaCategory> cardMetaCategories = new List<CardMetaCategory>();
			List<Tribe> tribes = new List<Tribe>();
			List<Ability> abilities = new List<Ability>();
			List<Trait> traits = new List<Trait>();
			Texture2D imageAsTexture = TextureHelper.GetImageAsTexture("teck.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D imageAsTexture2 = TextureHelper.GetImageAsTexture("pixel_teck.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D imageAsTexture3 = TextureHelper.GetImageAsTexture("teck_e.png", typeof(Plugin).Assembly, (FilterMode)0);
			Texture2D texture_base = imageAsTexture;
			Texture2D texture_emission = imageAsTexture3;
			Texture2D texture_pixel = imageAsTexture2;
			CardInfo val = CardUtils.CreateCardWithDefaultSettings("lifecost_Teck", displayName, attack, health, texture_base, texture_emission, cardMetaCategories, tribes, traits, abilities, texture_pixel, bloodCost, boneCost, energyCost);
			val.description = description;
			CardExtensions.SetCustomCost(val, "LifeMoneyCost", 1);
			CardManager.Add("lifecost", val);
		}
	}
}
namespace LifeCost.Act2Experiment
{
	internal class Act2Temple
	{
		[HarmonyPatch(typeof(CollectionUI), "Start")]
		public class AddLifeTab
		{
			public static void Postfix(ref CollectionUI __instance)
			{
				if (!Chainloader.PluginInfos.ContainsKey("mrfantastik.inscryption.infact2"))
				{
					AddTab(__instance);
				}
			}

			public static void AddTab(CollectionUI instance)
			{
				//IL_007e: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
				GameObject val = Object.Instantiate<GameObject>(((Component)((Component)instance).gameObject.transform.Find("MainPanel").Find("Tabs").Find("Tab_4")).gameObject);
				((Object)val).name = "Tab_5";
				val.transform.parent = ((Component)instance).gameObject.transform.Find("MainPanel").Find("Tabs");
				val.transform.localPosition = new Vector3(-0.718f, 0.175f, 0f);
				((TabbedUIPanel)instance).tabButtons.Add(val.GetComponent<GenericUIButton>());
				val.GetComponent<GenericUIButton>().inputKey = (KeyCode)53;
				val.GetComponent<GenericUIButton>().OnButtonDown = ((Component)((Component)instance).gameObject.transform.Find("MainPanel").Find("Tabs").Find("Tab_4")).gameObject.GetComponent<GenericUIButton>().OnButtonDown;
				val.GetComponent<BoxCollider2D>().size = new Vector2(0.55f, 0.44f);
				((Component)val.gameObject.transform.Find("Icon")).gameObject.GetComponent<SpriteRenderer>().sprite = CardUtils.getSprite("life_temple_tab.png");
			}
		}

		[HarmonyPatch(typeof(CollectionUI), "CreatePages")]
		public class SortLifeCards
		{
			public static void Postfix(ref CollectionUI __instance, ref List<List<CardInfo>> __result, ref List<CardInfo> cards)
			{
				if (!Chainloader.PluginInfos.ContainsKey("mrfantastik.inscryption.infact2"))
				{
					__result = Test(__instance, __result, cards);
				}
			}

			public static List<List<CardInfo>> Test(CollectionUI Instance, List<List<CardInfo>> Result, List<CardInfo> cards)
			{
				//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
				//IL_01db: Expected I4, but got Unknown
				//IL_024b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0252: Expected I4, but got Unknown
				//IL_025c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0263: Expected I4, but got Unknown
				cards.Sort(delegate(CardInfo a, CardInfo b)
				{
					//IL_0001: Unknown result type (might be due to invalid IL or missing references)
					//IL_0007: Unknown result type (might be due to invalid IL or missing references)
					//IL_000c: Unknown result type (might be due to invalid IL or missing references)
					//IL_000e: Expected I4, but got Unknown
					//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
					//IL_00be: Unknown result type (might be due to invalid IL or missing references)
					int num10 = a.temple - b.temple;
					if (num10 != 0)
					{
						return num10;
					}
					int num11 = (a.metaCategories.Contains((CardMetaCategory)3) ? 1 : 0);
					int num12 = (b.metaCategories.Contains((CardMetaCategory)3) ? 1 : 0) - num11;
					if (num12 != 0)
					{
						return num12;
					}
					int num13 = a.CostTier - b.CostTier;
					if (num13 != 0)
					{
						return num13;
					}
					int num14 = a.BonesCost - b.BonesCost;
					if (num14 != 0)
					{
						return num14;
					}
					int num15 = ((a.GemsCost.Count == 1) ? ((int)a.GemsCost[0]) : 0);
					num15 = ((b.GemsCost.Count == 1) ? ((int)b.GemsCost[0]) : 0);
					int num16 = num15 - num15;
					if (num16 != 0)
					{
						return num16;
					}
					int num17 = a.DisplayedNameEnglish.CompareTo(b.DisplayedNameEnglish);
					return (num17 == 0) ? ((Object)a).name.CompareTo(((Object)b).name) : num17;
				});
				cards = new List<CardInfo>(cards);
				List<CardInfo> toRemove = new List<CardInfo>();
				for (int i = 1; i < cards.Count; i++)
				{
					if (((Object)cards[i]).name == ((Object)cards[i - 1]).name)
					{
						toRemove.Add(cards[i]);
					}
				}
				cards.RemoveAll((CardInfo x) => toRemove.Contains(x));
				List<List<CardInfo>> list = new List<List<CardInfo>>();
				List<CardInfo> AllBoons = new List<CardInfo>();
				int num = 0;
				for (int j = 0; j < cards.Count; j++)
				{
					int num2 = num / 8;
					if (num2 >= list.Count)
					{
						list.Add(new List<CardInfo>());
					}
					bool flag = false;
					if ((Object)(object)cards[j] != (Object)null && (cards[j].LifeCost() != 0 || cards[j].LifeMoneyCost() != 0 || cards[j].MoneyCost() != 0))
					{
						flag = true;
					}
					if (flag)
					{
						num++;
						AllBoons.Add(cards[j]);
						list[num2].Add(cards[j]);
					}
				}
				cards.RemoveAll((CardInfo x) => AllBoons.Contains(x));
				List<List<CardInfo>> list2 = new List<List<CardInfo>>();
				list2.Add(new List<CardInfo>());
				Instance.tabPageIndices = new int[5];
				for (int k = 0; k < Instance.tabPageIndices.Length; k++)
				{
					Instance.tabPageIndices[k] = 0;
				}
				for (int l = 0; l < cards.Count; l++)
				{
					List<CardInfo> list3 = list2[list2.Count - 1];
					if (l == 0)
					{
						int num3 = (int)cards[l].temple;
						for (int m = 0; m < num3; m++)
						{
							list2.Add(new List<CardInfo>());
							Instance.tabPageIndices[m + 1] = list2.IndexOf(list3) + 1;
							list3 = list2[list2.Count - 1];
						}
					}
					list3.Add(cards[l]);
					bool flag2 = l == cards.Count - 1;
					if (flag2)
					{
						continue;
					}
					int num4 = (int)cards[l].temple;
					int num5 = (int)cards[l + 1].temple;
					int num6 = num5 - num4 - 1;
					for (int n = 0; n < num6; n++)
					{
						list2.Add(new List<CardInfo>());
						Instance.tabPageIndices[num4 + 1 + n] = list2.IndexOf(list3) + 1;
						list3 = list2[list2.Count - 1];
					}
					bool flag3 = !flag2 && num4 != num5;
					if (list3.Count >= 8 || flag3)
					{
						list2.Add(new List<CardInfo>());
						if (flag3)
						{
							Instance.tabPageIndices[num5] = list2.IndexOf(list3) + 1;
						}
					}
				}
				for (int num7 = 0; num7 < Instance.tabPageIndices.Length; num7++)
				{
					if (num7 > 0 && Instance.tabPageIndices[num7] == 0)
					{
						list2.Add(new List<CardInfo>());
						Instance.tabPageIndices[num7] = list2.Count - 1;
					}
				}
				list2[list2.Count - 1] = list[0];
				int num8 = list2.Count - 1;
				if (list.Count > 0)
				{
					for (int num9 = 1; num9 < list.Count; num9++)
					{
						list2.Add(list[num9]);
					}
				}
				Instance.tabPageIndices[4] = num8;
				return list2;
			}
		}
	}
}