Decompiled source of MoreEvents Reloaded v0.3.1

plugins/MoreEvents_Reloaded.Plugin.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using Conductor;
using Conductor.Extensions;
using Conductor.Interfaces;
using Ink.Runtime;
using Microsoft.CodeAnalysis;
using Microsoft.Extensions.Configuration;
using MoreEvents_Reloaded.Plugin.code;
using MoreEvents_Reloaded.Plugin.code.rewards;
using ShinyShoe;
using SimpleInjector;
using TrainworksReloaded.Base.Extensions;
using TrainworksReloaded.Core;
using TrainworksReloaded.Core.Extensions;
using TrainworksReloaded.Core.Interfaces;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("MoreEvents_Reloaded.Plugin")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.3.1.0")]
[assembly: AssemblyInformationalVersion("0.3.1+c1acd198edfd70c4a46093714bc7616a7851f098")]
[assembly: AssemblyProduct("MoreEvents_Reloaded.Plugin")]
[assembly: AssemblyTitle("MoreEvents_Reloaded.Plugin")]
[assembly: AssemblyVersion("0.3.1.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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]
	[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]
	[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 MoreEvents_Reloaded.Plugin
{
	[BepInPlugin("MoreEvents_Reloaded.Plugin", "MoreEvents_Reloaded.Plugin", "0.3.1")]
	public class Plugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static ExternalFunction <0>__CardsAvailableForFusion;

			public static ExternalFunction <1>__MoreEvents_SetBuildACardOption;
		}

		internal static ManualLogSource Logger = new ManualLogSource("MoreEvents_Reloaded.Plugin");

		public void Awake()
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Railhead.GetBuilder().Configure("MoreEvents_Reloaded.Plugin", (Action<IConfigurationBuilder>)delegate(IConfigurationBuilder c)
			{
				ConfigurationExtensions.AddMergedJsonFile(c, new List<string>(44)
				{
					"json/plugin.json", "json/cards/SpikedriverColony.json", "json/cards/AutomaticRailspikes.json", "json/cards/NexusSpike.json", "json/cards/OldeMagic.json", "json/events/UnitQuest.json", "json/events/SpellMerge.json", "json/events/BuildACard.json", "json/events/DivineAltar.json", "json/events/UnitQuest_UnitFollowup.json",
					"json/events/UnitQuest_SpellFollowup.json", "json/enhancers/Purgepact.json", "json/enhancers/Seekpact.json", "json/enhancers/Thricepact.json", "json/enhancers/Truepact.json", "json/enhancers/Valuepact.json", "json/enhancers/UnhingedPower.json", "json/essences/SpikedriverColony.json", "json/upgrades/BuildCard_Bonus_AddCapacity.json", "json/upgrades/BuildCard_Bonus_CardDraw.json",
					"json/upgrades/BuildCard_Bonus_GainGold.json", "json/upgrades/BuildCard_Movement_Advance.json", "json/upgrades/BuildCard_Movement_Ascend.json", "json/upgrades/BuildCard_Movement_Descend.json", "json/upgrades/BuildCard_Movement_Retreat.json", "json/upgrades/BuildCard_Movement_ShuffleE.json", "json/upgrades/BuildCard_Movement_ShuffleF.json", "json/upgrades/BuildCard_Primary_Buff.json", "json/upgrades/BuildCard_Primary_Damage.json", "json/upgrades/BuildCard_Primary_Heal.json",
					"json/upgrades/BuildCard_Primary_HealthUp.json", "json/upgrades/BuildCard_Status_AddArmor.json", "json/upgrades/BuildCard_Status_AddAvarice.json", "json/upgrades/BuildCard_Status_AddBurst.json", "json/upgrades/BuildCard_Status_AddConduit.json", "json/upgrades/BuildCard_Status_AddDecay.json", "json/upgrades/BuildCard_Status_AddFrostbite.json", "json/upgrades/BuildCard_Status_AddPyregel.json", "json/upgrades/BuildCard_Status_AddRage.json", "json/upgrades/BuildCard_Status_AddRegen.json",
					"json/upgrades/BuildCard_Status_AddSap.json", "json/upgrades/BuildCard_Status_AddSpikes.json", "json/upgrades/BuildCard_Status_AddUnstable.json", "json/upgrades/BuildCard_Status_AddValor.json"
				});
			});
			object obj = <>O.<0>__CardsAvailableForFusion;
			if (obj == null)
			{
				ExternalFunction val = InkExternalFunctions.CardsAvailableForFusion;
				<>O.<0>__CardsAvailableForFusion = val;
				obj = (object)val;
			}
			Utilities.AddInkExternalFunction("CardsAvailableForFusion", (ExternalFunction)obj);
			object obj2 = <>O.<1>__MoreEvents_SetBuildACardOption;
			if (obj2 == null)
			{
				ExternalFunction val2 = InkExternalFunctions.MoreEvents_SetBuildACardOption;
				<>O.<1>__MoreEvents_SetBuildACardOption = val2;
				obj2 = (object)val2;
			}
			Utilities.AddInkExternalFunction("MoreEvents_SetBuildACardOption", (ExternalFunction)obj2);
			Railend.ConfigurePostAction((Action<Container>)delegate(Container c)
			{
				IRegister<RewardData> rewardRegister = c.GetInstance<IRegister<RewardData>>();
				IRegister<CardData> cardRegister = c.GetInstance<IRegister<CardData>>();
				IRegister<CardUpgradeData> upgradeRegister = c.GetInstance<IRegister<CardUpgradeData>>();
				IRegister<CardUpgradeMaskData> filterRegister = c.GetInstance<IRegister<CardUpgradeMaskData>>();
				NexusSpellMergeRewardData? nexusSpellMergeRewardData = GetReward<NexusSpellMergeRewardData>("NexusSpikeSpellMergeReward");
				nexusSpellMergeRewardData.firstFilterData = GetFilter("BannedFromNexusSpikeStartingCard");
				nexusSpellMergeRewardData.secondFilterData = GetFilter("BannedFromNexusSpike");
				nexusSpellMergeRewardData.targetedCard = GetCard("NexusSpikeTarget");
				nexusSpellMergeRewardData.targetlessCard = GetCard("NexusSpikeTargetless");
				nexusSpellMergeRewardData.targetedXCard = GetCard("NexusSpikeXTarget");
				nexusSpellMergeRewardData.targetlessXCard = GetCard("NexusSpikeXTargetless");
				nexusSpellMergeRewardData.reservePositive = GetUpgrade("PlayReservePositiveMergeCardsUpgrade");
				nexusSpellMergeRewardData.reserveNegative = GetUpgrade("PlayReserveNegativeMergeCardsUpgrade");
				BuildACardRewardData? buildACardRewardData = GetReward<BuildACardRewardData>("BuildACardReward");
				buildACardRewardData.cardData = GetCard("OldeMagic");
				buildACardRewardData.componentUpgrades = new List<List<CardUpgradeData>>(4)
				{
					new List<CardUpgradeData>(4)
					{
						GetUpgrade("BuildCard_Damage"),
						GetUpgrade("BuildCard_Heal"),
						GetUpgrade("BuildCard_Buff"),
						GetUpgrade("BuildCard_HealthUp")
					},
					new List<CardUpgradeData>(13)
					{
						GetUpgrade("BuildCard_AddArmor"),
						GetUpgrade("BuildCard_AddRegen"),
						GetUpgrade("BuildCard_AddSap"),
						GetUpgrade("BuildCard_AddFrostbite"),
						GetUpgrade("BuildCard_AddSpikes"),
						GetUpgrade("BuildCard_AddRage"),
						GetUpgrade("BuildCard_AddBurst"),
						GetUpgrade("BuildCard_AddConduit"),
						GetUpgrade("BuildCard_AddDecay"),
						GetUpgrade("BuildCard_AddPyregel"),
						GetUpgrade("BuildCard_AddUnstable"),
						GetUpgrade("BuildCard_AddValor"),
						GetUpgrade("BuildCard_AddAvarice")
					},
					new List<CardUpgradeData>(6)
					{
						GetUpgrade("BuildCard_Advance"),
						GetUpgrade("BuildCard_Retreat"),
						GetUpgrade("BuildCard_Descend"),
						GetUpgrade("BuildCard_Ascend"),
						GetUpgrade("BuildCard_ShuffleF"),
						GetUpgrade("BuildCard_ShuffleE")
					},
					new List<CardUpgradeData>(3)
					{
						GetUpgrade("BuildCard_AddCapacity"),
						GetUpgrade("BuildCard_CardDraw"),
						GetUpgrade("BuildCard_GainGold")
					}
				};
				CardData GetCard(string id)
				{
					return IEnumerableUtility.GetValueOrDefault<string, CardData>((IDictionary<string, CardData>)cardRegister, StringExtensions.GetId("MoreEvents_Reloaded.Plugin", "Card", id), (CardData)null);
				}
				CardUpgradeMaskData GetFilter(string id)
				{
					return IEnumerableUtility.GetValueOrDefault<string, CardUpgradeMaskData>((IDictionary<string, CardUpgradeMaskData>)filterRegister, StringExtensions.GetId("MoreEvents_Reloaded.Plugin", "UpgradeMask", id), (CardUpgradeMaskData)null);
				}
				T? GetReward<T>(string id) where T : notnull, RewardData
				{
					RewardData valueOrDefault = IEnumerableUtility.GetValueOrDefault<string, RewardData>((IDictionary<string, RewardData>)rewardRegister, StringExtensions.GetId("MoreEvents_Reloaded.Plugin", "RewardData", id), (RewardData)null);
					return (T)(object)((valueOrDefault is T) ? valueOrDefault : null);
				}
				CardUpgradeData GetUpgrade(string id)
				{
					return IEnumerableUtility.GetValueOrDefault<string, CardUpgradeData>((IDictionary<string, CardUpgradeData>)upgradeRegister, StringExtensions.GetId("MoreEvents_Reloaded.Plugin", "Upgrade", id), (CardUpgradeData)null);
				}
			});
			Logger.LogInfo((object)"Plugin MoreEvents_Reloaded.Plugin is loaded!");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "MoreEvents_Reloaded.Plugin";

		public const string PLUGIN_NAME = "MoreEvents_Reloaded.Plugin";

		public const string PLUGIN_VERSION = "0.3.1";
	}
}
namespace MoreEvents_Reloaded.Plugin.code
{
	public static class InkExternalFunctions
	{
		public static object CardsAvailableForFusion(object[] args)
		{
			List<CardState> deckState = AllGameManagers.Instance.GetSaveManager().GetDeckState();
			int num = 0;
			foreach (CardState item in deckState)
			{
				if (!item.IsMonsterCard() || item.IsChampionCard())
				{
					continue;
				}
				bool flag = false;
				foreach (CardUpgradeState cardUpgrade in item.GetCardStateModifiers().GetCardUpgrades())
				{
					if (EssenceExtensions.IsEssenceUpgrade(cardUpgrade))
					{
						flag = true;
						break;
					}
				}
				if (!flag)
				{
					num++;
				}
			}
			return num >= 2;
		}

		public static object? MoreEvents_SetBuildACardOption(object[] args)
		{
			int component = (int)args[0];
			int upgrade = (int)args[1];
			BuildACardRewardData.SetUpgradeComponentKey(component, upgrade);
			return null;
		}
	}
}
namespace MoreEvents_Reloaded.Plugin.code.traits
{
	public class CardTraitMergedCard : CardTraitState
	{
		public override bool GetIsPlayableFromHand(CardManager cardManager, RoomManager roomManager, int sourceCharacterRoomIndex, out SelectionError selectionError)
		{
			foreach (CardState boxedCard in GetBoxedCards())
			{
				foreach (CardTraitState traitState in boxedCard.GetTraitStates())
				{
					if (!traitState.GetIsPlayableFromHand(cardManager, roomManager, sourceCharacterRoomIndex, ref selectionError))
					{
						return false;
					}
				}
			}
			selectionError = (SelectionError)0;
			return true;
		}

		public override bool GetIsPlayableFromPlay(CardManager cardManager, RoomManager roomManager, int sourceCharacterRoomIndex, out SelectionError selectionError)
		{
			foreach (CardState boxedCard in GetBoxedCards())
			{
				foreach (CardTraitState traitState in boxedCard.GetTraitStates())
				{
					if (!traitState.GetIsPlayableFromPlay(cardManager, roomManager, sourceCharacterRoomIndex, ref selectionError))
					{
						return false;
					}
				}
			}
			selectionError = (SelectionError)0;
			return true;
		}

		public override IEnumerator OnCardDiscarded(DiscardCardParams discardCardParams, ICoreGameManagers coreGameManagers)
		{
			foreach (CardState card in GetBoxedCards())
			{
				foreach (CardTraitState traitState in card.GetTraitStates())
				{
					if (traitState is CardTraitTreasure && (!discardCardParams.wasPlayed || discardCardParams.triggeredByCard) && !discardCardParams.handDiscarded && !discardCardParams.isRecastCopy)
					{
						DiscardCardParams val = new DiscardCardParams
						{
							discardCard = card,
							wasPlayed = discardCardParams.wasPlayed,
							isRecastCopy = discardCardParams.isRecastCopy,
							triggeredByCard = discardCardParams.triggeredByCard,
							handDiscarded = discardCardParams.handDiscarded
						};
						yield return traitState.OnCardDiscarded(val, coreGameManagers);
					}
				}
			}
		}

		public IEnumerable<CardState> GetBoxedCards()
		{
			return ((CardTraitState)this).GetCard().GetCardStateModifiers().BoxedCardStates;
		}

		public override PropDescriptions CreateEditorInspectorDescriptions()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			return new PropDescriptions();
		}
	}
}
namespace MoreEvents_Reloaded.Plugin.code.rewards
{
	public sealed class BuildACardRewardData : GrantableRewardData, IRewardPreviewProvider, ICardGiverReward
	{
		[Header("GrantUpgradedCached CardReward")]
		[SerializeField]
		public CardData? cardData;

		[SerializeField]
		private static int[] upgradeKeys = new int[4] { -1, -1, -1, -1 };

		[SerializeField]
		public List<List<CardUpgradeData>> componentUpgrades = new List<List<CardUpgradeData>>();

		public override string GetRngDeterminismID()
		{
			return ((GameData)cardData).GetID();
		}

		public override void GrantReward(GrantParams grantParams)
		{
			//IL_0000: 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)
			//IL_003b: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			CardState val = grantParams.coreGameManagers.GetSaveManager().AddCardToDeck(cardData, (CardStateModifiers)null, true, 0, false, false, false, false, true);
			foreach (CardUpgradeData upgradeData in GetUpgradeDatas())
			{
				CardUpgradeState val2 = new CardUpgradeState();
				val2.Setup(upgradeData, false, false);
				val.ApplyPermanentUpgrade(val2, grantParams.coreGameManagers.GetSaveManager(), true, (string)null);
			}
			grantParams.rewardGrantedCallback?.Invoke(new GrantResult(((GameData)cardData).GetID(), cardData.GetAssetKey(), "CardReward"));
			grantParams.interactionCompleteCallback?.Invoke();
		}

		public static void SetUpgradeComponentKey(int component, int upgrade)
		{
			if (component == -1 && upgrade == -1)
			{
				upgradeKeys[0] = (upgradeKeys[1] = (upgradeKeys[2] = (upgradeKeys[3] = -1)));
			}
			else
			{
				upgradeKeys[component] = upgrade;
			}
		}

		public List<CardUpgradeData> GetUpgradeDatas()
		{
			List<CardUpgradeData> list = new List<CardUpgradeData>();
			for (int i = 0; i < 4; i++)
			{
				int num = upgradeKeys[i];
				if (num != -1)
				{
					list.Add(componentUpgrades[i][num]);
				}
			}
			return list;
		}

		public RewardPreviewInfo ProvidePreview(SaveManager saveManager, RelicManager relicManager)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			return new RewardPreviewInfo
			{
				card = cardData,
				upgrades = GetUpgradeDatas()
			};
		}

		public string GetSpecificRewardName()
		{
			return cardData.GetName();
		}

		public List<CardData> GetAllCardData()
		{
			return new List<CardData>(1) { cardData };
		}
	}
	public class NexusSpellMergeRewardData : GrantableRewardData
	{
		public readonly int numCardsToMerge = 2;

		public CardUpgradeMaskData? firstFilterData;

		public CardUpgradeMaskData? secondFilterData;

		public CardData? targetlessCard;

		public CardData? targetedCard;

		public CardData? targetlessXCard;

		public CardData? targetedXCard;

		public CardUpgradeData? reservePositive;

		public CardUpgradeData? reserveNegative;

		private const string _firstPassInstructionKey = "MergeSpell_FirstInstruction";

		private const string _nextPassInstructionKey = "MergeSpell_NextInstruction";

		private List<CardState> cardsChosen = new List<CardState>();

		public override InteractionType interactionType => (InteractionType)2;

		public override void GrantReward(GrantParams grantParams)
		{
			//IL_0000: 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)
			((MonoBehaviour)grantParams.systemManagers.GetScreenManager()).StartCoroutine(ShowDeckSelection(grantParams));
		}

		private IEnumerator ShowDeckSelection(GrantParams grantParams)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			cardsChosen.Clear();
			for (int i = 0; i < numCardsToMerge; i++)
			{
				CardUpgradeMaskData filter = firstFilterData;
				string instructionContent = LocalizationExtensions.Localize("MergeSpell_FirstInstruction", (ILocalizationParameterContext)null);
				if (i > 0)
				{
					instructionContent = string.Format(LocalizationExtensions.Localize("MergeSpell_NextInstruction", (ILocalizationParameterContext)null), cardsChosen[i - 1].GetTitle());
					filter = secondFilterData;
				}
				bool cardChosen = false;
				bool interactionCompleted = false;
				ref Action interactionCompleteCallback = ref grantParams.interactionCompleteCallback;
				interactionCompleteCallback = (Action)Delegate.Combine(interactionCompleteCallback, (Action)delegate
				{
					interactionCompleted = true;
				});
				((GrantableRewardData)this).DoUIScreenConfirmationFlow((ScreenName)3, grantParams, (Action<IScreen, ScreenSetupConfirmationDelegate>)delegate(IScreen screen, ScreenSetupConfirmationDelegate screenSetupConfirmation)
				{
					//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_000f: Unknown result type (might be due to invalid IL or missing references)
					//IL_0014: 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_0027: Unknown result type (might be due to invalid IL or missing references)
					//IL_002c: Unknown result type (might be due to invalid IL or missing references)
					//IL_0031: Unknown result type (might be due to invalid IL or missing references)
					//IL_003d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0058: 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)
					//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
					//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
					//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
					//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
					//IL_00f9: Expected O, but got Unknown
					//IL_0100: Unknown result type (might be due to invalid IL or missing references)
					//IL_010a: Expected O, but got Unknown
					IScreen obj = ((screen is DeckScreen) ? screen : null);
					((DeckScreen)obj).Setup(new Params
					{
						mode = (Mode)12,
						showCancel = true,
						rewardSource = grantParams.source,
						cardUpgradeMaskData = filter,
						totalUses = grantParams.correspondingReward.TotalUses,
						sourceRewardState = grantParams.correspondingReward,
						forceExcludeCard = ((i > 0) ? cardsChosen[i - 1] : null),
						numDeckScreensNeededAfterThis = numCardsToMerge - i - 1,
						titleKey = ((RewardData)this)._rewardTitleKey,
						overrideInstructionContent = instructionContent,
						excludeFilteredOutCards = true
					});
					((DeckScreen)obj).AddDeckScreenCardStateChosenDelegate((CardStateChosenDelegate)delegate(CardState returnCardState)
					{
						if (returnCardState != null)
						{
							cardsChosen.Add(returnCardState);
							cardChosen = true;
						}
					});
				}, (RewardGrantedCallbackTiming)1);
				yield return (object)new WaitWhile((Func<bool>)(() => !interactionCompleted));
				if (!cardChosen)
				{
					break;
				}
			}
			if (cardsChosen.Count == numCardsToMerge)
			{
				MergeCards();
				grantParams.rewardGrantedCallback?.Invoke(default(GrantResult));
				grantParams.correspondingReward.ClaimReward(false);
			}
		}

		private void MergeCards()
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Invalid comparison between Unknown and I4
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Expected O, but got Unknown
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Expected O, but got Unknown
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Invalid comparison between Unknown and I4
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Invalid comparison between Unknown and I4
			CardData val = targetlessCard;
			bool flag = false;
			CardStateModifiers val2 = new CardStateModifiers();
			bool flag2 = false;
			bool flag3 = false;
			foreach (CardState item in cardsChosen)
			{
				CardState val3 = new CardState(base.saveManager.GetAllGameData().FindCardData(item.GetCardDataID()), base.saveManager, true, false);
				val3.CopyPermanentUpgrades(item.GetCardStateModifiers(), base.saveManager.GetAllGameData(), base.saveManager, (List<string>)null);
				List<CardEffectState> effectStates = val3.GetEffectStates();
				for (int i = 0; i < effectStates.Count; i++)
				{
					CardEffectState val4 = effectStates[i];
					if (val4.GetCardEffect() is CardEffectSacrifice && val4.GetTargetCharacterSubtype().IsNone && !val4.GetParamSubtype().IsNone)
					{
						val4.SetTargetCharacterSubtype(val4.GetParamSubtype());
					}
				}
				if ((int)item.GetCardTargetMode() == 1)
				{
					val = targetedCard;
				}
				if (item.IsConsumeRemainingEnergyCostType())
				{
					flag = true;
				}
				foreach (CardTriggerEffectData cardTrigger in item.GetCardTriggers())
				{
					if ((int)cardTrigger.GetTrigger() == 10)
					{
						flag2 = true;
					}
					if ((int)cardTrigger.GetTrigger() == 13)
					{
						flag3 = true;
					}
				}
				int num = base.saveManager.AddBoxedCardState(val3);
				val2.BoxCardState(num, base.saveManager);
			}
			if (flag)
			{
				val = (((Object)(object)val == (Object)(object)targetedCard) ? targetedXCard : targetlessXCard);
			}
			CardState val5 = base.saveManager.AddCardToDeck(val, val2, true, 0, false, ((RewardData)this).ShowRewardAnimationInEvent, true, false, true);
			if (flag2)
			{
				CardUpgradeState val6 = new CardUpgradeState();
				val6.Setup(reserveNegative, false, false);
				val5.ApplyPermanentUpgrade(val6, base.saveManager, true, (string)null);
			}
			if (flag3)
			{
				CardUpgradeState val7 = new CardUpgradeState();
				val7.Setup(reservePositive, false, false);
				val5.ApplyPermanentUpgrade(val7, base.saveManager, true, (string)null);
			}
		}
	}
}
namespace MoreEvents_Reloaded.Plugin.code.effects
{
	public sealed class CardEffectPlayBoxedCards : CardEffectBase
	{
		public override PropDescriptions CreateEditorInspectorDescriptions()
		{
			return PropDescriptions.DisplayNone;
		}

		public override IEnumerator ApplyEffect(CardEffectState cardEffectState, CardEffectParams cardEffectParams, ICoreGameManagers coreGameManagers, ISystemManagers sysManagers)
		{
			coreGameManagers.GetCardManager();
			coreGameManagers.GetAllGameData();
			SaveManager saveManager = coreGameManagers.GetSaveManager();
			coreGameManagers.GetRelicManager();
			coreGameManagers.GetRoomManager();
			CombatManager combatManager = coreGameManagers.GetCombatManager();
			CardStatistics cardStatistics = coreGameManagers.GetCardStatistics();
			PlayerManager playerManager = coreGameManagers.GetPlayerManager();
			CardState playedCard = cardEffectParams.playedCard;
			CardStateModifiers val = ((playedCard != null) ? playedCard.GetCardStateModifiers() : null);
			if (val == null)
			{
				yield break;
			}
			int xCostEnergy = playerManager.GetEnergy() + ((!saveManager.PreviewMode) ? cardEffectParams.playedCard.GetLastPlayedCost() : 0);
			SelectionError val2 = default(SelectionError);
			foreach (CardState cardState in val.BoxedCardStates)
			{
				foreach (CardTraitState traitState in cardState.GetTraitStates())
				{
					traitState.OnCardDrawn(cardState, coreGameManagers);
				}
				if (!combatManager.TestEffects(cardState.GetEffectStates(), cardEffectParams.selectedRoom, cardState, cardEffectParams.selfTarget, cardEffectParams.dropLocation, cardEffectParams.characterThatActivatedAbility, cardEffectParams.roomThatActivatedAbility, ref val2, cardEffectParams.disableLastSpawnedCharacterTargeting, cardEffectParams.overrideLastSpawnedCharacter))
				{
					continue;
				}
				cardStatistics.UpdateCardPlayedCost(cardState, xCostEnergy);
				yield return combatManager.ApplyEffects(cardState.GetEffectStates(), cardEffectParams.selectedRoom, cardState, true, cardEffectParams.sourceRelic, cardEffectParams.selfTarget, cardEffectParams.dropLocation, cardEffectParams.ignoreDeadInTargeting, (ApplyPreEffectsVfxAction)null, (ApplyPreEffectsAction)null, (ApplyEffectsAction)null, true, cardEffectParams.cardTriggeredCharacter, cardEffectParams.dyingCharacter, cardEffectParams.fireCount, cardEffectParams.overrideTargetCharacter, cardEffectParams.fromTrigger, cardEffectParams.triggerType, cardEffectParams.sourceCharacterTriggerState, cardEffectParams.characterThatActivatedAbility, cardEffectParams.roomThatActivatedAbility, cardEffectParams.isFromHiddenTrigger, cardEffectParams.disableLastSpawnedCharacterTargeting, cardEffectParams.overrideLastSpawnedCharacter);
				yield return combatManager.ApplyCardTriggers((CardTriggerType)0, cardState, false, cardEffectParams.selectedRoom, true, cardEffectParams.cardTriggeredCharacter, cardEffectParams.dyingCharacter, (Action)null, cardEffectParams.dropLocation, (ApplyPreEffectsVfxAction)null);
				DiscardCardParams discardCardParams = new DiscardCardParams
				{
					discardCard = cardState,
					isRecastCopy = true,
					wasPlayed = !saveManager.PreviewMode
				};
				foreach (CardTraitState traitState2 in cardState.GetTraitStates())
				{
					discardCardParams.isRecastCopy = HackRecastCopy(traitState2);
					yield return traitState2.OnCardDiscarded(discardCardParams, coreGameManagers);
				}
			}
		}

		private bool HackRecastCopy(CardTraitState cardTraitState)
		{
			return ((object)cardTraitState).GetType().Name switch
			{
				"CardTraitCopyOnPlay" => false, 
				"CardTraitAddCardUpgradeOnMoonPhase" => false, 
				"CardTraitScalingReturnConsumedCards" => false, 
				_ => true, 
			};
		}

		public override bool CreateAdditionalTooltips(CardEffectData cardEffectData, List<TooltipContent> content, SaveManager saveManager, CardState? sourceCardState = null)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (sourceCardState == null)
			{
				return false;
			}
			CardStateModifiers cardStateModifiers = sourceCardState.GetCardStateModifiers();
			if (cardStateModifiers != null)
			{
				List<CardState> list2 = default(List<CardState>);
				UsingGenericPoolObject<List<CardState>> list = GenericPools.GetList<CardState>(ref list2, cardStateModifiers.BoxedCardStates);
				try
				{
					TooltipContent item = default(TooltipContent);
					foreach (CardState item2 in list2)
					{
						if (CardTooltipHelper.TryGetAddedCardTooltipContent(saveManager.GetAllGameData().FindCardData(item2.GetCardDataID()), ref item, item2, saveManager))
						{
							content.Add(item);
						}
					}
				}
				finally
				{
					((IDisposable)list/*cast due to .constrained prefix*/).Dispose();
				}
			}
			return content.Count > 0;
		}
	}
	public sealed class CardEffectPlayBoxedCardTriggers : CardEffectBase
	{
		public override PropDescriptions CreateEditorInspectorDescriptions()
		{
			return PropDescriptions.DisplayNone;
		}

		public override IEnumerator ApplyEffect(CardEffectState cardEffectState, CardEffectParams cardEffectParams, ICoreGameManagers coreGameManagers, ISystemManagers sysManagers)
		{
			CombatManager combatManager = coreGameManagers.GetCombatManager();
			CardState playedCard = cardEffectParams.playedCard;
			CardStateModifiers val = ((playedCard != null) ? playedCard.GetCardStateModifiers() : null);
			if (val == null)
			{
				yield break;
			}
			foreach (CardState boxedCardState in val.BoxedCardStates)
			{
				yield return combatManager.ApplyCardTriggers(cardEffectParams.triggerType, boxedCardState, false, cardEffectParams.selectedRoom, cardEffectParams.ignoreDeadInTargeting, cardEffectParams.cardTriggeredCharacter, cardEffectParams.dyingCharacter, (Action)null, cardEffectParams.dropLocation, (ApplyPreEffectsVfxAction)null);
			}
		}
	}
}