Decompiled source of SAP Player Encounters v1.0.0

sap-players-encounters.dll

Decompiled 14 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Logging;
using DiskCardGame;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("sap-players-encounters")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("sap-players-encounters")]
[assembly: AssemblyTitle("sap-players-encounters")]
[assembly: AssemblyVersion("1.0.0.0")]
[BepInPlugin("com.bigeidan.sapplayersencounters", "SAP Players Encounters", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
	private class CartaCombate
	{
		public string Nombre;

		public List<Ability> SellosExtras = new List<Ability>();

		public int AtaqueExtra;

		public int VidaExtra;

		public string Token()
		{
			string text = Nombre;
			if (SellosExtras != null && SellosExtras.Count > 0)
			{
				text = text + "@" + string.Join("&", SellosExtras.Select((Ability x) => ((int)x).ToString()).ToArray());
			}
			if (AtaqueExtra != 0 || VidaExtra != 0)
			{
				text = text + "~" + AtaqueExtra + "|" + VidaExtra;
			}
			return text;
		}
	}

	[CompilerGenerated]
	private sealed class <>c__DisplayClass25_0
	{
		public HashSet<CardSlot> slotsEnCola;

		internal bool <EncolarTurnoReal>b__0(CardSlot s)
		{
			return (Object)(object)s.Card != (Object)null || slotsEnCola.Contains(s);
		}
	}

	[CompilerGenerated]
	private sealed class <EjecutarTurnoCombate>d__24 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public Opponent opponent;

		public bool doTween;

		public bool changeView;

		public Plugin <>4__this;

		private int <turnoActual>5__1;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <EjecutarTurnoCombate>d__24(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>4__this.UltimoSpawnConCartas = false;
				<turnoActual>5__1 = <>4__this.turnoSpawn;
				if (!<>4__this.combateActual.ContainsKey(<turnoActual>5__1))
				{
					<>4__this.turnoSpawn++;
					return false;
				}
				<>2__current = <>4__this.EncolarTurnoReal(opponent, <>4__this.combateActual[<turnoActual>5__1], doTween, changeView);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				if (<>4__this.UltimoSpawnConCartas)
				{
					<>4__this.turnoSpawn++;
				}
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <EncolarTurnoReal>d__25 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public Opponent opponent;

		public List<CartaCombate> cartasTurno;

		public bool doTween;

		public bool changeView;

		public Plugin <>4__this;

		private <>c__DisplayClass25_0 <>8__1;

		private List<CartaCombate> <cartasValidas>5__2;

		private List<CardSlot> <slots>5__3;

		private int <index>5__4;

		private int <cartasEncoladas>5__5;

		private List<CartaCombate>.Enumerator <>s__6;

		private CartaCombate <carta>5__7;

		private CardInfo <info>5__8;

		private List<CartaCombate>.Enumerator <>s__9;

		private CartaCombate <cartaTurno>5__10;

		private CardInfo <cartaBase>5__11;

		private bool <haySellos>5__12;

		private bool <hayStats>5__13;

		private CardInfo <cartaConExtras>5__14;

		private CardModificationInfo <modExtra>5__15;

		private PlayableCard <cartaEnCola>5__16;

		private int <ajusteAtkActual>5__17;

		private int <ajusteVidaActual>5__18;

		private int <ajusteAtkFaltante>5__19;

		private int <ajusteVidaFaltante>5__20;

		private List<Ability> <sellosFaltantes>5__21;

		private List<Ability>.Enumerator <>s__22;

		private Ability <sello>5__23;

		private CardModificationInfo <modExtraTemp>5__24;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <EncolarTurnoReal>d__25(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			int num = <>1__state;
			if (num == -3 || num == 1)
			{
				try
				{
				}
				finally
				{
					<>m__Finally1();
				}
			}
			<>8__1 = null;
			<cartasValidas>5__2 = null;
			<slots>5__3 = null;
			<>s__6 = default(List<CartaCombate>.Enumerator);
			<carta>5__7 = null;
			<info>5__8 = null;
			<>s__9 = default(List<CartaCombate>.Enumerator);
			<cartaTurno>5__10 = null;
			<cartaBase>5__11 = null;
			<cartaConExtras>5__14 = null;
			<modExtra>5__15 = null;
			<cartaEnCola>5__16 = null;
			<sellosFaltantes>5__21 = null;
			<>s__22 = default(List<Ability>.Enumerator);
			<modExtraTemp>5__24 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0553: Unknown result type (might be due to invalid IL or missing references)
			//IL_055d: Expected O, but got Unknown
			//IL_04c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0305: Expected O, but got Unknown
			try
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>8__1 = new <>c__DisplayClass25_0();
					if ((Object)(object)opponent == (Object)null)
					{
						Log.LogError((object)"Opponent NULL");
						return false;
					}
					<cartasValidas>5__2 = new List<CartaCombate>();
					<>s__6 = cartasTurno.GetEnumerator();
					try
					{
						while (<>s__6.MoveNext())
						{
							<carta>5__7 = <>s__6.Current;
							<info>5__8 = <>4__this.ResolverCartaPorNombre(<carta>5__7.Nombre);
							if ((Object)(object)<info>5__8 == (Object)null)
							{
								Log.LogWarning((object)("Carta no encontrada: " + <carta>5__7.Nombre));
								continue;
							}
							<cartasValidas>5__2.Add(<carta>5__7);
							<info>5__8 = null;
							<carta>5__7 = null;
						}
					}
					finally
					{
						((IDisposable)<>s__6).Dispose();
					}
					<>s__6 = default(List<CartaCombate>.Enumerator);
					if (<cartasValidas>5__2.Count == 0)
					{
						Log.LogWarning((object)"No hay cartas validas");
						return false;
					}
					<slots>5__3 = new List<CardSlot>(Singleton<BoardManager>.Instance.OpponentSlotsCopy);
					<>8__1.slotsEnCola = new HashSet<CardSlot>(opponent.QueuedSlots);
					<slots>5__3.RemoveAll((CardSlot s) => (Object)(object)s.Card != (Object)null || <>8__1.slotsEnCola.Contains(s));
					if (<slots>5__3.Count == 0)
					{
						return false;
					}
					<index>5__4 = 0;
					<cartasEncoladas>5__5 = 0;
					<>s__9 = <cartasValidas>5__2.GetEnumerator();
					<>1__state = -3;
					break;
				case 1:
					<>1__state = -3;
					if (<haySellos>5__12 | <hayStats>5__13)
					{
						<cartaEnCola>5__16 = opponent.Queue.LastOrDefault();
						if ((Object)(object)<cartaEnCola>5__16 != (Object)null)
						{
							<ajusteAtkActual>5__17 = <cartaEnCola>5__16.Attack - <cartaBase>5__11.Attack;
							<ajusteVidaActual>5__18 = <cartaEnCola>5__16.Health - <cartaBase>5__11.Health;
							<ajusteAtkFaltante>5__19 = <cartaTurno>5__10.AtaqueExtra - <ajusteAtkActual>5__17;
							<ajusteVidaFaltante>5__20 = <cartaTurno>5__10.VidaExtra - <ajusteVidaActual>5__18;
							<sellosFaltantes>5__21 = new List<Ability>();
							if (<haySellos>5__12)
							{
								<>s__22 = <cartaTurno>5__10.SellosExtras.GetEnumerator();
								try
								{
									while (<>s__22.MoveNext())
									{
										<sello>5__23 = <>s__22.Current;
										if (!<cartaEnCola>5__16.HasAbility(<sello>5__23))
										{
											<sellosFaltantes>5__21.Add(<sello>5__23);
										}
									}
								}
								finally
								{
									((IDisposable)<>s__22).Dispose();
								}
								<>s__22 = default(List<Ability>.Enumerator);
							}
							if (<sellosFaltantes>5__21.Count > 0 || <ajusteAtkFaltante>5__19 != 0 || <ajusteVidaFaltante>5__20 != 0)
							{
								<modExtraTemp>5__24 = new CardModificationInfo();
								if (<sellosFaltantes>5__21.Count > 0)
								{
									<modExtraTemp>5__24.abilities = <sellosFaltantes>5__21;
								}
								<modExtraTemp>5__24.attackAdjustment = <ajusteAtkFaltante>5__19;
								<modExtraTemp>5__24.healthAdjustment = <ajusteVidaFaltante>5__20;
								<cartaEnCola>5__16.AddTemporaryMod(<modExtraTemp>5__24);
								<modExtraTemp>5__24 = null;
							}
							<sellosFaltantes>5__21 = null;
						}
						<cartaEnCola>5__16 = null;
					}
					<index>5__4++;
					<cartasEncoladas>5__5++;
					changeView = false;
					<cartaBase>5__11 = null;
					<cartaConExtras>5__14 = null;
					<cartaTurno>5__10 = null;
					break;
				}
				while (<>s__9.MoveNext())
				{
					<cartaTurno>5__10 = <>s__9.Current;
					if (<index>5__4 >= <slots>5__3.Count)
					{
						break;
					}
					<cartaBase>5__11 = <>4__this.ResolverCartaPorNombre(<cartaTurno>5__10.Nombre);
					if ((Object)(object)<cartaBase>5__11 == (Object)null)
					{
						Log.LogWarning((object)("Carta no resoluble en spawn: " + <cartaTurno>5__10.Nombre));
						continue;
					}
					<haySellos>5__12 = <cartaTurno>5__10.SellosExtras != null && <cartaTurno>5__10.SellosExtras.Count > 0;
					<hayStats>5__13 = <cartaTurno>5__10.AtaqueExtra != 0 || <cartaTurno>5__10.VidaExtra != 0;
					<cartaConExtras>5__14 = <cartaBase>5__11;
					if (<haySellos>5__12 | <hayStats>5__13)
					{
						<cartaConExtras>5__14 = Object.Instantiate<CardInfo>(<cartaBase>5__11);
						<modExtra>5__15 = new CardModificationInfo();
						if (<haySellos>5__12)
						{
							<modExtra>5__15.abilities = new List<Ability>(<cartaTurno>5__10.SellosExtras);
						}
						<modExtra>5__15.attackAdjustment = <cartaTurno>5__10.AtaqueExtra;
						<modExtra>5__15.healthAdjustment = <cartaTurno>5__10.VidaExtra;
						if (<cartaConExtras>5__14.Mods != null)
						{
							<cartaConExtras>5__14.Mods.Add(<modExtra>5__15);
						}
						<modExtra>5__15 = null;
					}
					<>2__current = opponent.QueueCard(<cartaConExtras>5__14, <slots>5__3[<index>5__4], doTween, changeView, true);
					<>1__state = 1;
					return true;
				}
				<>m__Finally1();
				<>s__9 = default(List<CartaCombate>.Enumerator);
				<>4__this.UltimoSpawnConCartas = <cartasEncoladas>5__5 > 0;
				return false;
			}
			catch
			{
				//try-fault
				((IDisposable)this).Dispose();
				throw;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		private void <>m__Finally1()
		{
			<>1__state = -1;
			((IDisposable)<>s__9).Dispose();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <FallbackColaInicialTrasSetup>d__28 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public Plugin <>4__this;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <FallbackColaInicialTrasSetup>d__28(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				if (<>4__this.colaInicialProcesada)
				{
					return false;
				}
				if ((Object)(object)Singleton<TurnManager>.Instance == (Object)null || (Object)(object)Singleton<TurnManager>.Instance.Opponent == (Object)null)
				{
					return false;
				}
				<>4__this.CargarCombate();
				<>2__current = <>4__this.EjecutarTurnoCombate(Singleton<TurnManager>.Instance.Opponent);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				if (<>4__this.UltimoSpawnConCartas)
				{
					<>4__this.colaInicialProcesada = true;
				}
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	public static Plugin Instance;

	public static ManualLogSource Log;

	private int turnoSpawn = 1;

	private int turnoGuardado = 1;

	private int ultimoTurnoJugadorGuardado = -1;

	private Dictionary<string, int> turnoAnterior = new Dictionary<string, int>();

	private List<string> turnos = new List<string>();

	private Dictionary<int, List<CartaCombate>> combateActual = new Dictionary<int, List<CartaCombate>>();

	private string slotElegido = "";

	private bool combateCargado = false;

	private int ultimoTurnoProcesadoQueue = -1;

	private bool colaInicialProcesada = false;

	public bool UltimoSpawnConCartas { get; private set; }

	private void Awake()
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: Expected O, but got Unknown
		Instance = this;
		Log = ((BaseUnityPlugin)this).Logger;
		try
		{
			SacarDeWeb();
			Harmony val = new Harmony("com.bigeidan.sapplayersencounters");
			val.PatchAll();
		}
		catch (Exception ex)
		{
			Log.LogError((object)("ERROR EN AWAKE: " + ex));
		}
	}

	private void SacarDeWeb()
	{
		try
		{
			string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
			string address = "https://sap-players-ecounters-default-rtdb.europe-west1.firebasedatabase.app/.json";
			using WebClient webClient = new WebClient();
			string fileName = Path.Combine(directoryName, "combates.json");
			webClient.DownloadFile(address, fileName);
		}
		catch (Exception ex)
		{
			Log.LogError((object)("ERROR descargando JSON: " + ex));
		}
	}

	public void CargarCombate()
	{
		if (combateCargado)
		{
			return;
		}
		combateCargado = true;
		try
		{
			string path = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "combates.json");
			if (!File.Exists(path))
			{
				Log.LogError((object)"No existe combates.json");
				return;
			}
			string input = File.ReadAllText(path);
			slotElegido = "slot_" + Random.Range(1, 51);
			string pattern = "\"" + Regex.Escape(slotElegido) + "\"\\s*:\\s*\"((?:\\\\.|[^\"])*)\"";
			Match match = Regex.Match(input, pattern);
			if (!match.Success)
			{
				Log.LogWarning((object)"No hay combate en ese slot");
				return;
			}
			string text = Regex.Unescape(match.Groups[1].Value);
			if (string.IsNullOrWhiteSpace(text))
			{
				Log.LogWarning((object)"Combate vacio en slot");
			}
			else
			{
				ParsearCombate(text);
			}
		}
		catch (Exception ex)
		{
			Log.LogError((object)("Error cargando combate: " + ex));
		}
	}

	private void ParsearCombate(string combate)
	{
		combateActual.Clear();
		string[] array = combate.Split(new char[1] { ';' });
		string[] array2 = array;
		foreach (string text in array2)
		{
			if (string.IsNullOrWhiteSpace(text))
			{
				continue;
			}
			string[] array3 = text.Split(new char[1] { ':' }, 2);
			if (array3.Length < 2)
			{
				Log.LogWarning((object)("Turno mal formado: " + text));
				continue;
			}
			if (!int.TryParse(array3[0].Replace("turno", "").Trim(), out var result))
			{
				Log.LogWarning((object)("No se pudo parsear numero de turno en: " + text));
				continue;
			}
			List<CartaCombate> list = new List<CartaCombate>();
			string text2 = array3[1].Trim();
			if (!string.IsNullOrEmpty(text2))
			{
				string[] array4 = text2.Split(new char[1] { ',' });
				foreach (string token in array4)
				{
					if (TryParseCartaToken(token, out var carta))
					{
						list.Add(carta);
					}
				}
			}
			combateActual[result] = list;
		}
	}

	private bool TryParseCartaToken(string token, out CartaCombate carta)
	{
		//IL_013b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0174: Unknown result type (might be due to invalid IL or missing references)
		//IL_018b: Unknown result type (might be due to invalid IL or missing references)
		carta = null;
		if (string.IsNullOrWhiteSpace(token))
		{
			return false;
		}
		string text = token.Trim();
		string text2 = null;
		int num = text.IndexOf('~');
		if (num >= 0)
		{
			text2 = text.Substring(num + 1).Trim();
			text = text.Substring(0, num).Trim();
		}
		int num2 = text.IndexOf('@');
		CartaCombate cartaCombate = new CartaCombate();
		if (num2 < 0)
		{
			cartaCombate.Nombre = LimpiarNombreCarta(text);
			carta = cartaCombate;
			return !string.IsNullOrEmpty(cartaCombate.Nombre);
		}
		cartaCombate.Nombre = LimpiarNombreCarta(text.Substring(0, num2));
		if (string.IsNullOrEmpty(cartaCombate.Nombre))
		{
			return false;
		}
		string text3 = text.Substring(num2 + 1).Trim();
		if (!string.IsNullOrEmpty(text3))
		{
			string[] array = text3.Split(new char[1] { '&' });
			foreach (string text4 in array)
			{
				string text5 = text4.Trim();
				if (!string.IsNullOrEmpty(text5))
				{
					Ability result2;
					if (int.TryParse(text5, out var result))
					{
						result2 = (Ability)result;
					}
					else if (!Enum.TryParse<Ability>(text5, ignoreCase: true, out result2))
					{
						Log.LogWarning((object)("Sello extra no reconocido: " + text5));
						continue;
					}
					if (!cartaCombate.SellosExtras.Contains(result2))
					{
						cartaCombate.SellosExtras.Add(result2);
					}
				}
			}
		}
		if (!string.IsNullOrEmpty(text2))
		{
			string[] array2 = text2.Split(new char[1] { '|' });
			if (array2.Length != 0 && int.TryParse(array2[0].Trim(), out var result3))
			{
				cartaCombate.AtaqueExtra = result3;
			}
			if (array2.Length > 1 && int.TryParse(array2[1].Trim(), out var result4))
			{
				cartaCombate.VidaExtra = result4;
			}
		}
		carta = cartaCombate;
		return true;
	}

	private string LimpiarNombreCarta(string nombre)
	{
		if (string.IsNullOrWhiteSpace(nombre))
		{
			return string.Empty;
		}
		return nombre.Trim().Trim(new char[1] { '"' }).Replace("\\\"", "\"")
			.Replace("\\", "")
			.Trim();
	}

	private CardInfo ResolverCartaPorNombre(string nombre)
	{
		string text = LimpiarNombreCarta(nombre);
		if (string.IsNullOrEmpty(text))
		{
			return null;
		}
		CardInfo cardByName = CardLoader.GetCardByName(text);
		if ((Object)(object)cardByName != (Object)null)
		{
			return cardByName;
		}
		string text2 = text.Replace(" ", "");
		cardByName = CardLoader.GetCardByName(text2);
		if ((Object)(object)cardByName != (Object)null)
		{
			return cardByName;
		}
		string text3 = text.Replace(" ", "_");
		cardByName = CardLoader.GetCardByName(text3);
		if ((Object)(object)cardByName != (Object)null)
		{
			return cardByName;
		}
		return null;
	}

	[IteratorStateMachine(typeof(<EjecutarTurnoCombate>d__24))]
	public IEnumerator EjecutarTurnoCombate(Opponent opponent, bool doTween = true, bool changeView = false)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <EjecutarTurnoCombate>d__24(0)
		{
			<>4__this = this,
			opponent = opponent,
			doTween = doTween,
			changeView = changeView
		};
	}

	[IteratorStateMachine(typeof(<EncolarTurnoReal>d__25))]
	private IEnumerator EncolarTurnoReal(Opponent opponent, List<CartaCombate> cartasTurno, bool doTween, bool changeView)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <EncolarTurnoReal>d__25(0)
		{
			<>4__this = this,
			opponent = opponent,
			cartasTurno = cartasTurno,
			doTween = doTween,
			changeView = changeView
		};
	}

	public bool DebeProcesarColaTurno(out bool esColaInicial)
	{
		esColaInicial = false;
		if ((Object)(object)Singleton<TurnManager>.Instance == (Object)null)
		{
			return false;
		}
		if (Singleton<TurnManager>.Instance.IsSetupPhase)
		{
			if (colaInicialProcesada)
			{
				return false;
			}
			esColaInicial = true;
			return true;
		}
		if (Singleton<TurnManager>.Instance.IsPlayerTurn)
		{
			return false;
		}
		int turnNumber = Singleton<TurnManager>.Instance.TurnNumber;
		if (turnNumber <= 0)
		{
			return false;
		}
		if (ultimoTurnoProcesadoQueue == turnNumber)
		{
			return false;
		}
		ultimoTurnoProcesadoQueue = turnNumber;
		return true;
	}

	public void ConfirmarColaInicialProcesada()
	{
		colaInicialProcesada = true;
	}

	[IteratorStateMachine(typeof(<FallbackColaInicialTrasSetup>d__28))]
	public IEnumerator FallbackColaInicialTrasSetup()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <FallbackColaInicialTrasSetup>d__28(0)
		{
			<>4__this = this
		};
	}

	public List<PlayableCard> ObtenerCartasJugador()
	{
		List<PlayableCard> list = new List<PlayableCard>();
		if ((Object)(object)Singleton<BoardManager>.Instance == (Object)null || (Object)(object)Singleton<TurnManager>.Instance == (Object)null)
		{
			return list;
		}
		foreach (CardSlot item in Singleton<BoardManager>.Instance.PlayerSlotsCopy)
		{
			if ((Object)(object)item.Card != (Object)null && item.Card.TurnPlayed == Singleton<TurnManager>.Instance.TurnNumber)
			{
				list.Add(item.Card);
			}
		}
		return list;
	}

	private List<Ability> ObtenerSellosExtras(PlayableCard carta)
	{
		//IL_019d: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Unknown result type (might be due to invalid IL or missing references)
		//IL_011d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		HashSet<Ability> hashSet = new HashSet<Ability>();
		if ((Object)(object)((Card)carta).Info != (Object)null && ((Card)carta).Info.Mods != null)
		{
			foreach (CardModificationInfo mod in ((Card)carta).Info.Mods)
			{
				if (mod == null || mod.abilities == null)
				{
					continue;
				}
				foreach (Ability ability in mod.abilities)
				{
					hashSet.Add(ability);
				}
			}
		}
		if (carta.TemporaryMods != null)
		{
			foreach (CardModificationInfo temporaryMod in carta.TemporaryMods)
			{
				if (temporaryMod == null || temporaryMod.abilities == null)
				{
					continue;
				}
				foreach (Ability ability2 in temporaryMod.abilities)
				{
					hashSet.Add(ability2);
				}
			}
		}
		CardInfo cardByName = CardLoader.GetCardByName(((Object)((Card)carta).Info).name);
		if ((Object)(object)cardByName != (Object)null && cardByName.Abilities != null)
		{
			foreach (Ability ability3 in cardByName.Abilities)
			{
				if (hashSet.Contains(ability3))
				{
					hashSet.Remove(ability3);
				}
			}
		}
		List<Ability> list = new List<Ability>(hashSet);
		list.Sort((Ability a, Ability b) => ((int)a).CompareTo((int)b));
		return list;
	}

	private void ObtenerAjustesEstadisticas(PlayableCard carta, out int ataqueExtra, out int vidaExtra)
	{
		ataqueExtra = 0;
		vidaExtra = 0;
		if ((Object)(object)((Card)carta).Info != (Object)null && ((Card)carta).Info.Mods != null)
		{
			foreach (CardModificationInfo mod in ((Card)carta).Info.Mods)
			{
				if (mod != null)
				{
					ataqueExtra += mod.attackAdjustment;
					vidaExtra += mod.healthAdjustment;
				}
			}
		}
		if (carta.TemporaryMods == null)
		{
			return;
		}
		foreach (CardModificationInfo temporaryMod in carta.TemporaryMods)
		{
			if (temporaryMod != null)
			{
				ataqueExtra += temporaryMod.attackAdjustment;
				vidaExtra += temporaryMod.healthAdjustment;
			}
		}
	}

	private string SerializarCarta(PlayableCard carta)
	{
		if ((Object)(object)carta == (Object)null || (Object)(object)((Card)carta).Info == (Object)null || string.IsNullOrEmpty(((Object)((Card)carta).Info).name))
		{
			return null;
		}
		List<Ability> list = ObtenerSellosExtras(carta);
		ObtenerAjustesEstadisticas(carta, out var ataqueExtra, out var vidaExtra);
		if (list.Count == 0 && ataqueExtra == 0 && vidaExtra == 0)
		{
			return ((Object)((Card)carta).Info).name;
		}
		string text = ((Object)((Card)carta).Info).name;
		if (list.Count > 0)
		{
			text = text + "@" + string.Join("&", list.Select((Ability x) => ((int)x).ToString()).ToArray());
		}
		if (ataqueExtra != 0 || vidaExtra != 0)
		{
			text = text + "~" + ataqueExtra + "|" + vidaExtra;
		}
		return text;
	}

	public void GuardarTurno(List<PlayableCard> cartasEnMesa)
	{
		Dictionary<string, int> dictionary = new Dictionary<string, int>();
		foreach (PlayableCard item2 in cartasEnMesa)
		{
			string text = SerializarCarta(item2);
			if (!string.IsNullOrEmpty(text))
			{
				if (!dictionary.ContainsKey(text))
				{
					dictionary[text] = 0;
				}
				dictionary[text]++;
			}
		}
		List<string> list = new List<string>();
		foreach (KeyValuePair<string, int> item3 in dictionary)
		{
			int num = (turnoAnterior.ContainsKey(item3.Key) ? turnoAnterior[item3.Key] : 0);
			int num2 = item3.Value - num;
			for (int i = 0; i < num2; i++)
			{
				list.Add(item3.Key);
			}
		}
		if (list.Count > 0)
		{
			string item = "turno" + turnoGuardado + ":" + string.Join(",", list);
			turnos.Add(item);
		}
		turnoAnterior = dictionary;
		turnoGuardado++;
	}

	public void GuardarTurnoJugadorActualSiNoGuardado()
	{
		if (!((Object)(object)Singleton<TurnManager>.Instance == (Object)null))
		{
			int turnNumber = Singleton<TurnManager>.Instance.TurnNumber;
			if (turnNumber > 0 && ultimoTurnoJugadorGuardado != turnNumber)
			{
				List<PlayableCard> cartasEnMesa = ObtenerCartasJugador();
				GuardarTurno(cartasEnMesa);
				ultimoTurnoJugadorGuardado = turnNumber;
			}
		}
	}

	public void EnviarCombate()
	{
		try
		{
			if (turnos.Count == 0)
			{
				Log.LogWarning((object)"No hay turnos que enviar");
				return;
			}
			string text = string.Join(";", turnos);
			string address = "https://sap-players-ecounters-default-rtdb.europe-west1.firebasedatabase.app/" + slotElegido + ".json";
			string data = "\"" + text.Replace("\"", "\\\"") + "\"";
			using WebClient webClient = new WebClient();
			webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
			webClient.UploadString(address, "PUT", data);
		}
		catch (Exception ex)
		{
			Log.LogError((object)("ERROR subiendo combate: " + ex));
		}
	}

	public void ResetearCombate()
	{
		turnoSpawn = 1;
		turnoGuardado = 1;
		ultimoTurnoJugadorGuardado = -1;
		turnoAnterior.Clear();
		turnos.Clear();
		combateActual.Clear();
		combateCargado = false;
		ultimoTurnoProcesadoQueue = -1;
		colaInicialProcesada = false;
		UltimoSpawnConCartas = false;
	}
}
[HarmonyPatch(typeof(Opponent), "QueueNewCards")]
internal class QueueNewCardsPatch
{
	[CompilerGenerated]
	private sealed class <EjecutarDespuesDeQueueBase>d__1 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public IEnumerator original;

		public Opponent opponent;

		public bool doTween;

		public bool changeView;

		private Plugin <plugin>5__1;

		private bool <esColaInicial>5__2;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <EjecutarDespuesDeQueueBase>d__1(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<plugin>5__1 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				goto IL_0051;
			case 1:
				<>1__state = -1;
				goto IL_0051;
			case 2:
				{
					<>1__state = -1;
					if (<esColaInicial>5__2 && <plugin>5__1.UltimoSpawnConCartas)
					{
						<plugin>5__1.ConfirmarColaInicialProcesada();
					}
					return false;
				}
				IL_0051:
				if (original.MoveNext())
				{
					<>2__current = original.Current;
					<>1__state = 1;
					return true;
				}
				<plugin>5__1 = Plugin.Instance;
				if ((Object)(object)<plugin>5__1 == (Object)null)
				{
					return false;
				}
				if (!<plugin>5__1.DebeProcesarColaTurno(out <esColaInicial>5__2))
				{
					return false;
				}
				<plugin>5__1.CargarCombate();
				<>2__current = <plugin>5__1.EjecutarTurnoCombate(opponent, doTween);
				<>1__state = 2;
				return true;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private static void Postfix(Opponent __instance, bool __0, bool __1, ref IEnumerator __result)
	{
		__result = EjecutarDespuesDeQueueBase(__result, __instance, __0, __1);
	}

	[IteratorStateMachine(typeof(<EjecutarDespuesDeQueueBase>d__1))]
	private static IEnumerator EjecutarDespuesDeQueueBase(IEnumerator original, Opponent opponent, bool doTween, bool changeView)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <EjecutarDespuesDeQueueBase>d__1(0)
		{
			original = original,
			opponent = opponent,
			doTween = doTween,
			changeView = changeView
		};
	}
}
[HarmonyPatch(typeof(TurnManager), "SetupPhase")]
internal class SetupPhasePatch
{
	[CompilerGenerated]
	private sealed class <EjecutarDespuesDeSetup>d__1 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public IEnumerator original;

		private Plugin <plugin>5__1;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <EjecutarDespuesDeSetup>d__1(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<plugin>5__1 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				goto IL_004e;
			case 1:
				<>1__state = -1;
				goto IL_004e;
			case 2:
				{
					<>1__state = -1;
					return false;
				}
				IL_004e:
				if (original.MoveNext())
				{
					<>2__current = original.Current;
					<>1__state = 1;
					return true;
				}
				<plugin>5__1 = Plugin.Instance;
				if ((Object)(object)<plugin>5__1 == (Object)null)
				{
					return false;
				}
				<>2__current = <plugin>5__1.FallbackColaInicialTrasSetup();
				<>1__state = 2;
				return true;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private static void Postfix(ref IEnumerator __result)
	{
		__result = EjecutarDespuesDeSetup(__result);
	}

	[IteratorStateMachine(typeof(<EjecutarDespuesDeSetup>d__1))]
	private static IEnumerator EjecutarDespuesDeSetup(IEnumerator original)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <EjecutarDespuesDeSetup>d__1(0)
		{
			original = original
		};
	}
}
[HarmonyPatch(typeof(TurnManager), "PlayerTurn")]
internal class PlayerTurnPatch
{
	[CompilerGenerated]
	private sealed class <EjecutarDespuesDePlayerTurn>d__1 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public IEnumerator original;

		private Plugin <plugin>5__1;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <EjecutarDespuesDePlayerTurn>d__1(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<plugin>5__1 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			if (original.MoveNext())
			{
				<>2__current = original.Current;
				<>1__state = 1;
				return true;
			}
			<plugin>5__1 = Plugin.Instance;
			if ((Object)(object)<plugin>5__1 == (Object)null)
			{
				return false;
			}
			<plugin>5__1.GuardarTurnoJugadorActualSiNoGuardado();
			return false;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private static void Postfix(ref IEnumerator __result)
	{
		__result = EjecutarDespuesDePlayerTurn(__result);
	}

	[IteratorStateMachine(typeof(<EjecutarDespuesDePlayerTurn>d__1))]
	private static IEnumerator EjecutarDespuesDePlayerTurn(IEnumerator original)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <EjecutarDespuesDePlayerTurn>d__1(0)
		{
			original = original
		};
	}
}
[HarmonyPatch(typeof(TurnManager), "CleanupPhase")]
internal class EndCombatPatch
{
	private static void Postfix()
	{
		Plugin instance = Plugin.Instance;
		if ((Object)(object)instance != (Object)null)
		{
			instance.GuardarTurnoJugadorActualSiNoGuardado();
			instance.EnviarCombate();
			instance.ResetearCombate();
		}
	}
}