Decompiled source of RoundsEliteClasses v1.0.2

RoundsEliteClasses.dll

Decompiled 7 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using TMPro;
using UnboundLib;
using UnboundLib.Cards;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("RoundsEliteClasses")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RoundsEliteClasses")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("828cc942-ce5c-4bdc-979f-41561952d540")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace RoundsEliteClasses;

public enum CardRarity
{
	Common,
	Rare,
	Legendary,
	Mythic
}
public enum CardCategory
{
	Universal,
	ClassExclusive,
	Chaos,
	Environment,
	Utility
}
public class CardData
{
	public string Name;

	public string Description;

	public CardRarity Rarity;

	public CardCategory Category;

	public ClassType? ExclusiveClass;

	public Color RarityColor;

	public float SpawnWeight;

	public bool IsStackable = true;

	public void ApplyEffect(int playerID, int stackCount)
	{
		Plugin.Log.LogInfo((object)$"Carte {Name} appliquée x{stackCount} au joueur {playerID}");
	}
}
public static class CardManager
{
	public static List<CardData> AllCards = new List<CardData>();

	public static Dictionary<CardRarity, Color> RarityColors = new Dictionary<CardRarity, Color>
	{
		{
			CardRarity.Common,
			new Color(0.8f, 0.8f, 0.8f)
		},
		{
			CardRarity.Rare,
			new Color(0.2f, 0.4f, 1f)
		},
		{
			CardRarity.Legendary,
			new Color(0.6f, 0f, 1f)
		},
		{
			CardRarity.Mythic,
			new Color(1f, 0.5f, 0f)
		}
	};

	public static void Initialize()
	{
		RegisterUniversalCards();
		RegisterChaosCards();
		RegisterEnvironmentCards();
		RegisterUtilityCards();
		RegisterUniversalCards();
		RegisterDefenseCards();
		RegisterClassCards();
		Plugin.Log.LogInfo((object)("CardManager initialisé — " + AllCards.Count + " cartes chargées"));
	}

	private static void RegisterUniversalCards()
	{
		Add("Double Saut", "Permet de sauter une deuxième fois en l'air", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Triple Saut", "Permet de sauter trois fois en l'air", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Wall Jump", "Permet de sauter contre les murs", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Dash Avant", "Courte impulsion vers l'avant", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Dash Arrière", "Courte impulsion vers l'arrière", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Gravité Réduite", "Tu flottes légèrement", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Super Saut", "Sauts beaucoup plus hauts", CardRarity.Rare, CardCategory.Universal, 0.7f);
		Add("Glissement", "Glisse rapidement au sol", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Téléportation Courte", "Téléportation aléatoire à chaque saut", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Sprint Passif", "Vitesse de déplacement augmentée en permanence", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Rebond Mural", "Tu rebondis sur les murs", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Vol Court", "Vole pendant 3 secondes", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Atterrissage Silencieux", "Aucun son à l'atterrissage, position masquée", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Esquive Auto", "Esquive automatiquement une balle une fois par vie", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Inertie Réduite", "Changements de direction instantanés", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Balle Jumelle", "Chaque tir produit 2 balles", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Balle Triple", "Chaque tir produit 3 balles", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Tir Rapide", "Cadence de tir augmentée", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Balle Lourde", "Balles plus lentes mais plus puissantes", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Balle Légère", "Balles plus rapides mais moins puissantes", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Recul Réduit", "Recul lors du tir réduit", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Recul Augmenté", "Recul massif mais balles ultra puissantes", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Balle Rebondissante", "Les balles rebondissent sur les murs", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Balle Perforante", "Traverse les obstacles", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Balle Explosive", "Explose à l'impact", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Tir en Rafale", "Tire 3 balles rapidement", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Tir Chargé", "Maintiens pour charger un tir puissant", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Balle Magnétique", "Attire légèrement vers la cible", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Balle Gravité", "Tombe en arc de cercle", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Balle Fantôme", "Traverse un ennemi sans le tuer mais le ralentit", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Sniper", "Une seule munition par vie mais ultra puissante", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Balle Inversée", "Part dans le sens opposé puis fait demi-tour", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Balle Spirale", "Tourne en spirale vers l'adversaire", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Tir Diagonal", "Tire en diagonale en plus du tir normal", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Balle Fumigène", "Crée un nuage de fumée à l'impact", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Rebond Infini", "Les balles rebondissent indéfiniment", CardRarity.Legendary, CardCategory.Universal, 0.3f);
	}

	private static void RegisterDefenseCards()
	{
		Add("Vie Supplémentaire", "+1 vie supplémentaire", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Bouclier Temporaire", "Bouclier qui absorbe 2 balles", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Régénération Lente", "Récupère lentement de la vie", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Armure Légère", "+10% résistance aux dégâts", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Miroir Défensif", "Renvoie une balle sur deux", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Clone Défensif", "Un faux toi absorbe une balle", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Invincibilité Courte", "1 seconde d'invincibilité après avoir reçu des dégâts", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Réduction Recul", "Recul reçu réduit", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Absorption Partielle", "Absorbe 20% des dégâts reçus", CardRarity.Rare, CardCategory.Universal, 0.6f);
		Add("Barrière Énergétique", "Barrière qui bloque la prochaine balle", CardRarity.Rare, CardCategory.Universal, 0.5f);
		Add("Esquive Passive", "5% de chance d'esquiver automatiquement", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Second Souffle", "Survie à une balle fatale une fois par partie", CardRarity.Legendary, CardCategory.Universal, 0.3f);
		Add("Ancrage", "Impossible d'être repoussé", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Résistance Explosion", "Réduit les dégâts des explosions de 50%", CardRarity.Common, CardCategory.Universal, 1f);
		Add("Carapace", "La première balle reçue est absorbée", CardRarity.Rare, CardCategory.Universal, 0.6f);
	}

	private static void RegisterChaosCards()
	{
		Add("Fusion", "Mélange toutes les cartes des deux joueurs", CardRarity.Legendary, CardCategory.Chaos, 0.3f);
		Add("Vol", "Prend une carte aléatoire de l'adversaire", CardRarity.Rare, CardCategory.Chaos, 0.5f);
		Add("Échange Total", "Échange toutes vos cartes", CardRarity.Legendary, CardCategory.Chaos, 0.3f);
		Add("Carte Miroir", "Copie une carte aléatoire de l'adversaire", CardRarity.Rare, CardCategory.Chaos, 0.5f);
		Add("Carte Ruine", "Détruit une carte aléatoire de l'adversaire", CardRarity.Rare, CardCategory.Chaos, 0.5f);
		Add("Carte Bénie", "Double une carte aléatoire que tu possèdes", CardRarity.Legendary, CardCategory.Chaos, 0.3f);
		Add("Chaos Total", "Redistribue toutes les cartes aléatoirement", CardRarity.Mythic, CardCategory.Chaos, 0.1f);
		Add("Carte Pari", "50/50 entre un gros buff et un gros debuff", CardRarity.Rare, CardCategory.Chaos, 0.5f);
		Add("Sacrifice", "Perd 1 vie pour doubler tous tes stats", CardRarity.Legendary, CardCategory.Chaos, 0.3f);
		Add("Rebirth", "Si tu perds ce round tu gardes toutes tes cartes", CardRarity.Legendary, CardCategory.Chaos, 0.3f);
		Add("Equalizer", "Les deux joueurs ont les mêmes cartes pendant 1 round", CardRarity.Rare, CardCategory.Chaos, 0.4f);
		Add("Invisibilité Totale", "Invisibilité complète pendant 1 round", CardRarity.Legendary, CardCategory.Chaos, 0.2f);
		Add("Carte Temps", "Ralentit tout pendant 3 secondes", CardRarity.Legendary, CardCategory.Chaos, 0.3f);
		Add("Gravité Inversée", "Gravité inversée pendant 1 round", CardRarity.Legendary, CardCategory.Chaos, 0.3f);
		Add("Magnétisme", "Attire les balles adverses puis les renvoie", CardRarity.Mythic, CardCategory.Chaos, 0.1f);
		Add("Doublon", "Duplique une carte aléatoire que tu possèdes", CardRarity.Rare, CardCategory.Chaos, 0.5f);
		Add("Amnésie", "L'adversaire perd une carte aléatoire", CardRarity.Rare, CardCategory.Chaos, 0.5f);
		Add("Carte Mystère", "Effet complètement aléatoire", CardRarity.Common, CardCategory.Chaos, 1f);
		Add("Carte Malédiction", "Gros buff mais aussi un debuff aléatoire", CardRarity.Rare, CardCategory.Chaos, 0.5f);
		Add("Carte Handicap", "Te handicape pour recevoir 2 cartes au lieu d'une", CardRarity.Common, CardCategory.Chaos, 1f);
	}

	private static void RegisterEnvironmentCards()
	{
		Add("Brouillard de Guerre", "Écran partiellement masqué", CardRarity.Rare, CardCategory.Environment, 0.5f);
		Add("Pluie de Balles", "Balles tombent du ciel aléatoirement", CardRarity.Legendary, CardCategory.Environment, 0.3f);
		Add("Plateforme Fantôme", "Plateforme temporaire sous tes pieds", CardRarity.Rare, CardCategory.Environment, 0.5f);
		Add("Tremblement de Terre", "Vibration de la map pendant 3 secondes", CardRarity.Rare, CardCategory.Environment, 0.5f);
		Add("Zone Ralentissement", "Zone bleue au sol qui ralentit", CardRarity.Common, CardCategory.Environment, 1f);
		Add("Zone Accélération", "Zone verte au sol qui accélère", CardRarity.Common, CardCategory.Environment, 1f);
		Add("Mur Invisible", "Mur temporaire au centre de la map", CardRarity.Rare, CardCategory.Environment, 0.5f);
		Add("Portail", "2 portails téléportent les balles", CardRarity.Legendary, CardCategory.Environment, 0.3f);
		Add("Gravité Locale", "Zone à gravité modifiée", CardRarity.Rare, CardCategory.Environment, 0.4f);
		Add("Pièges au Sol", "Mines invisibles placées aléatoirement", CardRarity.Legendary, CardCategory.Environment, 0.3f);
	}

	private static void RegisterUtilityCards()
	{
		Add("Reload Instantané", "Recharge instantanément les munitions", CardRarity.Common, CardCategory.Utility, 1f);
		Add("Munitions Infinies", "Munitions infinies pendant 5 secondes", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Vision Améliorée", "Léger zoom permanent", CardRarity.Common, CardCategory.Utility, 1f);
		Add("Détection Adverse", "Vois la position adverse en permanence", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Silence", "Aucun son pendant 1 round", CardRarity.Rare, CardCategory.Utility, 0.4f);
		Add("Tremblement Adverse", "La visée adverse tremble", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Ralentissement Adverse", "L'adversaire ralentit pendant 3 secondes", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Accélération", "Tu accélères pendant 5 secondes", CardRarity.Common, CardCategory.Utility, 1f);
		Add("Carte Copie", "Copie le dernier power-up pris par l'adversaire", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Boost Démarrage", "Sprint au début de chaque round", CardRarity.Common, CardCategory.Utility, 1f);
		Add("Stabilisateur", "Aucun recul pendant 1 round", CardRarity.Common, CardCategory.Utility, 1f);
		Add("Ciblage Assisté", "Légère assistance à la visée", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Portée Augmentée", "Les balles vont plus loin", CardRarity.Common, CardCategory.Utility, 1f);
		Add("Portée Adverse Réduite", "Les balles adverses vont moins loin", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Balle Traçante", "Vois la trajectoire de tes balles", CardRarity.Common, CardCategory.Utility, 1f);
		Add("Radar de Balle", "Les balles adverses apparaissent en rouge", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Bouclier de Mana", "Absorbe 2 balles puis disparaît", CardRarity.Rare, CardCategory.Utility, 0.5f);
		Add("Turbo", "Vitesse x1.5 pendant 3 secondes", CardRarity.Common, CardCategory.Utility, 1f);
		Add("Carte Finale", "La prochaine balle fait x3 dégâts", CardRarity.Legendary, CardCategory.Utility, 0.3f);
		Add("Reload Instantané 2", "Double la vitesse de rechargement", CardRarity.Common, CardCategory.Utility, 1f);
	}

	private static void RegisterClassCards()
	{
		AddExclusive("Boule de Feu", "Explosion massive à l'impact", CardRarity.Rare, ClassType.Mage);
		AddExclusive("Tempête Arcanique", "Balles tourbillonnantes autour de toi", CardRarity.Legendary, ClassType.Mage);
		AddExclusive("Singularité", "Crée un trou noir qui aspire l'adversaire", CardRarity.Mythic, ClassType.Mage);
		AddExclusive("Frappe Létale", "One-shot si dans le dos de l'adversaire", CardRarity.Rare, ClassType.Assassin);
		AddExclusive("Ombre Totale", "Invisibilité totale pendant 5 secondes", CardRarity.Legendary, ClassType.Assassin);
		AddExclusive("Exécution", "Instakill si l'adversaire est sous 30% de vie", CardRarity.Mythic, ClassType.Assassin);
		AddExclusive("Forteresse", "Bouclier absorbant 3 balles", CardRarity.Rare, ClassType.Tank);
		AddExclusive("Séisme", "Onde de choc qui repousse tout", CardRarity.Legendary, ClassType.Tank);
		AddExclusive("Indestructible", "Invincible pendant 1 round entier", CardRarity.Mythic, ClassType.Tank);
		AddExclusive("Flèche Explosive", "Flèche qui explose à l'impact", CardRarity.Rare, ClassType.Archer);
		AddExclusive("Pluie de Flèches", "5 balles simultanées", CardRarity.Legendary, ClassType.Archer);
		AddExclusive("Flèche Divine", "Traverse tout et rebondit 10 fois", CardRarity.Mythic, ClassType.Archer);
		AddExclusive("Malédiction", "L'adversaire perd une carte aléatoire", CardRarity.Rare, ClassType.Demon);
		AddExclusive("Pacte de Sang", "Vole la moitié des cartes adverses", CardRarity.Legendary, ClassType.Demon);
		AddExclusive("Apocalypse", "Explosion massive sur toute la map", CardRarity.Mythic, ClassType.Demon);
		AddExclusive("Dédoublement", "2 clones qui tirent simultanément", CardRarity.Rare, ClassType.Specter);
		AddExclusive("Dimension Fantôme", "Intouchable pendant 3 secondes", CardRarity.Legendary, ClassType.Specter);
		AddExclusive("Possession", "Contrôle l'adversaire pendant 2 secondes", CardRarity.Mythic, ClassType.Specter);
		AddExclusive("Rage", "Dégâts x2 quand sous 20% de vie", CardRarity.Rare, ClassType.Berserker);
		AddExclusive("Frénésie", "Vitesse et dégâts x2 pendant 5 secondes", CardRarity.Legendary, ClassType.Berserker);
		AddExclusive("Dernière Rage", "À ta mort une explosion couvre tout l'écran", CardRarity.Mythic, ClassType.Berserker);
		AddExclusive("Réflexion Totale", "Renvoie 100% des balles pendant 3 secondes", CardRarity.Rare, ClassType.Mirror);
		AddExclusive("Double Miroir", "Crée un miroir flottant qui renvoie les balles", CardRarity.Legendary, ClassType.Mirror);
		AddExclusive("Monde Inversé", "Inverse les contrôles adverses pendant 1 round", CardRarity.Mythic, ClassType.Mirror);
		AddExclusive("Rembobinage", "Retourne 2 secondes en arrière", CardRarity.Rare, ClassType.Time);
		AddExclusive("Freeze", "Gèle tout pendant 1.5 secondes", CardRarity.Legendary, ClassType.Time);
		AddExclusive("Paradoxe", "Deux versions de toi tirent simultanément", CardRarity.Mythic, ClassType.Time);
		AddExclusive("Chaîne Électrique", "La balle rebondit sur l'adversaire 3 fois", CardRarity.Rare, ClassType.Electric);
		AddExclusive("EMP", "Désactive les power-ups adverses 2 secondes", CardRarity.Legendary, ClassType.Electric);
		AddExclusive("Tempête Électrique", "Balles aléatoires partent dans toutes les directions", CardRarity.Mythic, ClassType.Electric);
		AddExclusive("Congélation", "Fige l'adversaire pendant 1.5 secondes", CardRarity.Rare, ClassType.Ice);
		AddExclusive("Mur de Glace", "Mur temporaire indestructible", CardRarity.Legendary, ClassType.Ice);
		AddExclusive("Blizzard", "Visibilité réduite pour l'adversaire pendant 1 round", CardRarity.Mythic, ClassType.Ice);
		AddExclusive("Trou Noir", "Aspire l'adversaire vers toi", CardRarity.Rare, ClassType.Gravity);
		AddExclusive("Antigravité", "L'adversaire flotte sans contrôle pendant 2 secondes", CardRarity.Legendary, ClassType.Gravity);
		AddExclusive("Écrasement", "Ta gravité augmente, tu tombes comme un marteau", CardRarity.Mythic, ClassType.Gravity);
		AddExclusive("Racines", "Immobilise l'adversaire pendant 2 secondes", CardRarity.Rare, ClassType.Nature);
		AddExclusive("Spores", "Nuage de poison en zone", CardRarity.Legendary, ClassType.Nature);
		AddExclusive("Floraison", "Explosion de pétales qui font des dégâts en zone", CardRarity.Mythic, ClassType.Nature);
		AddExclusive("Drone", "Drone autonome qui suit et tire sur l'adversaire", CardRarity.Rare, ClassType.Technology);
		AddExclusive("Hack", "Inverse les contrôles adverses", CardRarity.Legendary, ClassType.Technology);
		AddExclusive("Surcharge Système", "Toutes tes cartes boostées à x1.5 pendant 1 round", CardRarity.Mythic, ClassType.Technology);
		AddExclusive("Hémorragie", "L'adversaire perd de la vie progressivement", CardRarity.Rare, ClassType.Blood);
		AddExclusive("Vampirisme", "Récupère de la vie sur chaque balle touchée", CardRarity.Legendary, ClassType.Blood);
		AddExclusive("Explosion de Sang", "À ta mort des projectiles partent dans tous les sens", CardRarity.Mythic, ClassType.Blood);
		AddExclusive("Flash", "Aveuglement total de l'adversaire pendant 2 secondes", CardRarity.Rare, ClassType.Light);
		AddExclusive("Rayon Divin", "Balle ultra puissante qui traverse tout", CardRarity.Legendary, ClassType.Light);
		AddExclusive("Jugement", "Si l'adversaire a plus de cartes que toi, dégâts x3", CardRarity.Mythic, ClassType.Light);
		AddExclusive("Disparition", "Invisibilité totale pendant 3 secondes", CardRarity.Rare, ClassType.Shadow);
		AddExclusive("Monde des Ombres", "Toute la map devient sombre pendant 1 round", CardRarity.Legendary, ClassType.Shadow);
		AddExclusive("Absorption Sombre", "Absorbe la lumière adverse et la convertit en bouclier", CardRarity.Mythic, ClassType.Shadow);
	}

	private static void Add(string name, string desc, CardRarity rarity, CardCategory category, float weight)
	{
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		AllCards.Add(new CardData
		{
			Name = name,
			Description = desc,
			Rarity = rarity,
			Category = category,
			ExclusiveClass = null,
			RarityColor = RarityColors[rarity],
			SpawnWeight = weight
		});
	}

	private static void AddExclusive(string name, string desc, CardRarity rarity, ClassType classType)
	{
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		AllCards.Add(new CardData
		{
			Name = name,
			Description = desc,
			Rarity = rarity,
			Category = CardCategory.ClassExclusive,
			ExclusiveClass = classType,
			RarityColor = RarityColors[rarity],
			SpawnWeight = rarity switch
			{
				CardRarity.Legendary => 0.2f, 
				CardRarity.Mythic => 0.1f, 
				_ => 0.4f, 
			}
		});
	}

	public static List<CardData> GetCardsForClass(ClassType classType)
	{
		return AllCards.FindAll((CardData c) => !c.ExclusiveClass.HasValue || c.ExclusiveClass == classType);
	}

	public static List<CardData> GetCardsByRarity(CardRarity rarity)
	{
		return AllCards.FindAll((CardData c) => c.Rarity == rarity);
	}
}
public static class CardPicker
{
	private const int CARDS_TO_SHOW = 5;

	private static readonly Dictionary<CardRarity, float> RarityWeights = new Dictionary<CardRarity, float>
	{
		{
			CardRarity.Common,
			50f
		},
		{
			CardRarity.Rare,
			28f
		},
		{
			CardRarity.Legendary,
			15f
		},
		{
			CardRarity.Mythic,
			7f
		}
	};

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

	public static List<CardData> GetCardsForPlayer(int playerID, int count = 5)
	{
		List<CardData> list = new List<CardData>();
		ClassType classType = ClassType.Mage;
		if (ClassManager.PlayerClasses.ContainsKey(playerID))
		{
			classType = ClassManager.PlayerClasses[playerID];
		}
		List<CardData> cardsForClass = CardManager.GetCardsForClass(classType);
		List<string> ownedCards = GetOwnedCards(playerID);
		int num = 0;
		while (list.Count < count && num < 200)
		{
			num++;
			CardRarity rarity = RollRarity();
			List<CardData> list2 = cardsForClass.FindAll((CardData c) => c.Rarity == rarity);
			if (list2.Count != 0)
			{
				CardData card = list2[Random.Range(0, list2.Count)];
				if (!list.Exists((CardData c) => c.Name == card.Name))
				{
					list.Add(card);
				}
			}
		}
		Plugin.Log.LogInfo((object)($"Joueur {playerID} ({classType}) — " + $"{list.Count} cartes proposées :"));
		foreach (CardData item in list)
		{
			Plugin.Log.LogInfo((object)$"  → [{item.Rarity}] {item.Name}");
		}
		return list;
	}

	public static void ApplyCard(int playerID, CardData card)
	{
		if (!playerStacks.ContainsKey(playerID))
		{
			playerStacks[playerID] = new Dictionary<string, int>();
		}
		Dictionary<string, int> dictionary = playerStacks[playerID];
		if (!dictionary.ContainsKey(card.Name))
		{
			dictionary[card.Name] = 0;
		}
		dictionary[card.Name]++;
		int num = dictionary[card.Name];
		card.ApplyEffect(playerID, num);
		Plugin.Log.LogInfo((object)$"Joueur {playerID} — {card.Name} x{num}");
	}

	public static int GetStackCount(int playerID, string cardName)
	{
		if (!playerStacks.ContainsKey(playerID))
		{
			return 0;
		}
		if (!playerStacks[playerID].ContainsKey(cardName))
		{
			return 0;
		}
		return playerStacks[playerID][cardName];
	}

	public static void ResetStacks(int playerID)
	{
		if (playerStacks.ContainsKey(playerID))
		{
			playerStacks[playerID].Clear();
		}
	}

	public static void ResetAllStacks()
	{
		playerStacks.Clear();
		Plugin.Log.LogInfo((object)"Tous les stacks réinitialisés");
	}

	private static List<string> GetOwnedCards(int playerID)
	{
		List<string> list = new List<string>();
		if (!playerStacks.ContainsKey(playerID))
		{
			return list;
		}
		foreach (string key in playerStacks[playerID].Keys)
		{
			list.Add(key);
		}
		return list;
	}

	private static CardRarity RollRarity()
	{
		float num = 0f;
		foreach (float value in RarityWeights.Values)
		{
			num += value;
		}
		float num2 = Random.Range(0f, num);
		float num3 = 0f;
		foreach (KeyValuePair<CardRarity, float> rarityWeight in RarityWeights)
		{
			num3 += rarityWeight.Value;
			if (num2 <= num3)
			{
				return rarityWeight.Key;
			}
		}
		return CardRarity.Common;
	}

	public static void ApplyFusion(int playerID1, int playerID2)
	{
		if (!playerStacks.ContainsKey(playerID1) || !playerStacks.ContainsKey(playerID2))
		{
			return;
		}
		List<string> list = new List<string>();
		foreach (string key2 in playerStacks[playerID1].Keys)
		{
			list.Add(key2);
		}
		foreach (string key3 in playerStacks[playerID2].Keys)
		{
			list.Add(key3);
		}
		playerStacks[playerID1].Clear();
		playerStacks[playerID2].Clear();
		for (int num = list.Count - 1; num > 0; num--)
		{
			int index = Random.Range(0, num + 1);
			string value = list[num];
			list[num] = list[index];
			list[index] = value;
		}
		for (int i = 0; i < list.Count; i++)
		{
			int key = ((i % 2 == 0) ? playerID1 : playerID2);
			if (!playerStacks[key].ContainsKey(list[i]))
			{
				playerStacks[key][list[i]] = 0;
			}
			playerStacks[key][list[i]]++;
		}
		Plugin.Log.LogInfo((object)$"Fusion appliquée entre joueur {playerID1} et {playerID2}");
	}

	public static void ApplySteal(int thiefID, int victimID)
	{
		if (playerStacks.ContainsKey(victimID) && playerStacks[victimID].Count != 0)
		{
			List<string> list = new List<string>(playerStacks[victimID].Keys);
			string text = list[Random.Range(0, list.Count)];
			playerStacks[victimID][text]--;
			if (playerStacks[victimID][text] <= 0)
			{
				playerStacks[victimID].Remove(text);
			}
			if (!playerStacks.ContainsKey(thiefID))
			{
				playerStacks[thiefID] = new Dictionary<string, int>();
			}
			if (!playerStacks[thiefID].ContainsKey(text))
			{
				playerStacks[thiefID][text] = 0;
			}
			playerStacks[thiefID][text]++;
			Plugin.Log.LogInfo((object)$"Joueur {thiefID} a volé {text} au joueur {victimID}");
		}
	}

	public static void ApplySwap(int playerID1, int playerID2)
	{
		Dictionary<string, int> value = (playerStacks.ContainsKey(playerID1) ? new Dictionary<string, int>(playerStacks[playerID1]) : new Dictionary<string, int>());
		playerStacks[playerID1] = (playerStacks.ContainsKey(playerID2) ? new Dictionary<string, int>(playerStacks[playerID2]) : new Dictionary<string, int>());
		playerStacks[playerID2] = value;
		Plugin.Log.LogInfo((object)$"Échange total entre joueur {playerID1} et {playerID2}");
	}

	public static void ApplyRuin(int targetID)
	{
		if (playerStacks.ContainsKey(targetID) && playerStacks[targetID].Count != 0)
		{
			List<string> list = new List<string>(playerStacks[targetID].Keys);
			string text = list[Random.Range(0, list.Count)];
			playerStacks[targetID][text]--;
			if (playerStacks[targetID][text] <= 0)
			{
				playerStacks[targetID].Remove(text);
			}
			Plugin.Log.LogInfo((object)$"Carte {text} supprimée du joueur {targetID}");
		}
	}
}
public static class CardRegistrar
{
	public static void RegisterAllCards()
	{
		foreach (CardData allCard in CardManager.AllCards)
		{
			RegisterCard(allCard);
		}
		Plugin.Log.LogInfo((object)$"CardRegistrar — {CardManager.AllCards.Count} cartes enregistrées dans ROUNDS");
	}

	private static void RegisterCard(CardData cardData)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Expected O, but got Unknown
		try
		{
			GameObject val = new GameObject(cardData.Name);
			BaseEliteCard baseEliteCard = val.AddComponent<BaseEliteCard>();
			baseEliteCard.EliteCardData = cardData;
			CustomCard.RegisterUnityCard<BaseEliteCard>(val, (Action<CardInfo>)delegate
			{
			});
		}
		catch (Exception ex)
		{
			Plugin.Log.LogError((object)("Erreur enregistrement carte " + cardData.Name + " : " + ex.Message));
		}
	}
}
public class BaseEliteCard : CustomCard
{
	public CardData EliteCardData;

	public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers)
	{
		cardInfo.cardName = EliteCardData?.Name ?? "Unknown";
	}

	public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers statModifiers)
	{
		if (EliteCardData != null)
		{
			int playerID = player.playerID;
			int num = CardPicker.GetStackCount(playerID, EliteCardData.Name) + 1;
			ApplyCardEffect(player, gun, data, health, statModifiers, num);
			CardPicker.ApplyCard(playerID, EliteCardData);
			Plugin.Log.LogInfo((object)($"Carte appliquée : {EliteCardData.Name} x{num} " + $"au joueur {playerID}"));
		}
	}

	public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers statModifiers)
	{
	}

	protected override string GetTitle()
	{
		return EliteCardData?.Name ?? "Unknown";
	}

	protected override string GetDescription()
	{
		return EliteCardData?.Description ?? "";
	}

	protected override CardInfoStat[] GetStats()
	{
		return (CardInfoStat[])(object)new CardInfoStat[0];
	}

	protected override Rarity GetRarity()
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		if (EliteCardData == null)
		{
			return (Rarity)0;
		}
		return (Rarity)(EliteCardData.Rarity switch
		{
			CardRarity.Rare => 1, 
			CardRarity.Legendary => 2, 
			CardRarity.Mythic => 2, 
			_ => 0, 
		});
	}

	protected override GameObject GetCardArt()
	{
		return null;
	}

	protected override CardThemeColorType GetTheme()
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		if (EliteCardData == null)
		{
			return (CardThemeColorType)4;
		}
		return (CardThemeColorType)(EliteCardData.Rarity switch
		{
			CardRarity.Mythic => 1, 
			CardRarity.Legendary => 4, 
			CardRarity.Rare => 7, 
			_ => 6, 
		});
	}

	private void ApplyCardEffect(Player player, Gun gun, CharacterData data, HealthHandler health, CharacterStatModifiers statModifiers, int stackCount)
	{
		if (EliteCardData != null)
		{
			switch (EliteCardData.Name)
			{
			case "Double Saut":
				statModifiers.numberOfJumps += stackCount;
				break;
			case "Triple Saut":
				statModifiers.numberOfJumps += 2 * stackCount;
				break;
			case "Sprint Passif":
				statModifiers.movementSpeed += 0.2f * (float)stackCount;
				break;
			case "Gravité Réduite":
				statModifiers.gravity -= 0.2f * (float)stackCount;
				break;
			case "Super Saut":
				statModifiers.jump += 0.5f * (float)stackCount;
				break;
			case "Dash Avant":
				statModifiers.movementSpeed += 0.3f * (float)stackCount;
				break;
			case "Dash Arrière":
				statModifiers.movementSpeed += 0.3f * (float)stackCount;
				break;
			case "Glissement":
				statModifiers.movementSpeed += 0.25f * (float)stackCount;
				break;
			case "Turbo":
				statModifiers.movementSpeed += 0.3f * (float)stackCount;
				break;
			case "Accélération":
				statModifiers.movementSpeed += 0.2f * (float)stackCount;
				break;
			case "Balle Jumelle":
				gun.numberOfProjectiles += stackCount;
				break;
			case "Balle Triple":
				gun.numberOfProjectiles += 2 * stackCount;
				break;
			case "Tir Rapide":
				gun.attackSpeed *= Mathf.Pow(0.8f, (float)stackCount);
				break;
			case "Balle Lourde":
				gun.damage += 0.3f * (float)stackCount;
				gun.projectileSpeed -= 0.2f * (float)stackCount;
				break;
			case "Balle Légère":
				gun.projectileSpeed += 0.3f * (float)stackCount;
				gun.damage -= 0.1f * (float)stackCount;
				break;
			case "Balle Explosive":
				gun.explodeNearEnemyDamage += 0.5f * (float)stackCount;
				gun.explodeNearEnemyRange += 0.5f * (float)stackCount;
				break;
			case "Tir en Rafale":
				gun.bursts += 2 * stackCount;
				gun.timeBetweenBullets -= 0.05f * (float)stackCount;
				break;
			case "Balle Rebondissante":
				gun.reflects += 2 * stackCount;
				break;
			case "Rebond Infini":
				gun.reflects += 10 * stackCount;
				break;
			case "Sniper":
				gun.projectileSpeed += 2f * (float)stackCount;
				gun.damage += 1f * (float)stackCount;
				gun.ammo = 1;
				break;
			case "Balle Perforante":
				gun.damage += 0.2f * (float)stackCount;
				break;
			case "Tir Diagonal":
				gun.spread += 0.2f * (float)stackCount;
				gun.numberOfProjectiles += stackCount;
				break;
			case "Balle Spirale":
				gun.reflects += 3 * stackCount;
				gun.spread += 0.1f * (float)stackCount;
				break;
			case "Balle Magnétique":
				gun.drag += 0.1f * (float)stackCount;
				break;
			case "Balle Gravité":
				gun.gravity += 0.3f * (float)stackCount;
				break;
			case "Balle Inversée":
				gun.reflects += stackCount;
				gun.projectileSpeed += 0.5f * (float)stackCount;
				break;
			case "Recul Augmenté":
				gun.damage += 0.4f * (float)stackCount;
				gun.knockback += 0.5f * (float)stackCount;
				break;
			case "Recul Réduit":
				gun.recoil -= 0.2f * (float)stackCount;
				break;
			case "Vie Supplémentaire":
				data.maxHealth += 50f * (float)stackCount;
				break;
			case "Armure Légère":
				statModifiers.slow += 0.1f * (float)stackCount;
				break;
			case "Régénération Lente":
				statModifiers.lifeSteal += 0.05f * (float)stackCount;
				break;
			case "Absorption Partielle":
				statModifiers.slow += 0.1f * (float)stackCount;
				break;
			case "Réduction Recul":
				gun.recoil -= 0.3f * (float)stackCount;
				break;
			case "Second Souffle":
				statModifiers.respawns += stackCount;
				break;
			case "Portée Augmentée":
				gun.projectileSpeed += 0.3f * (float)stackCount;
				break;
			case "Munitions Infinies":
				gun.ammo += 5 * stackCount;
				break;
			case "Reload Instantané":
				gun.reloadTime -= 0.2f * (float)stackCount;
				break;
			case "Reload Instantané 2":
				gun.reloadTime -= 0.3f * (float)stackCount;
				break;
			case "Ciblage Assisté":
				gun.spread -= 0.1f * (float)stackCount;
				break;
			case "Stabilisateur":
				gun.recoil -= 0.5f * (float)stackCount;
				break;
			case "Balle Traçante":
				gun.projectileSpeed += 0.2f * (float)stackCount;
				break;
			case "Radar de Balle":
				gun.projectileSpeed += 0.1f * (float)stackCount;
				break;
			case "Portée Adverse Réduite":
				gun.damage += 0.1f * (float)stackCount;
				break;
			case "Boule de Feu":
				gun.explodeNearEnemyDamage += 1f * (float)stackCount;
				gun.explodeNearEnemyRange += 1f * (float)stackCount;
				gun.damage += 0.5f * (float)stackCount;
				break;
			case "Tempête Arcanique":
				gun.numberOfProjectiles += 3 * stackCount;
				gun.spread += 0.3f * (float)stackCount;
				gun.damage += 0.3f * (float)stackCount;
				break;
			case "Frappe Létale":
				gun.damage += 1f * (float)stackCount;
				gun.projectileSpeed += 0.5f * (float)stackCount;
				break;
			case "Ombre Totale":
				statModifiers.movementSpeed += 0.5f * (float)stackCount;
				gun.damage += 0.5f * (float)stackCount;
				break;
			case "Forteresse":
				data.maxHealth += 100f * (float)stackCount;
				statModifiers.slow += 0.2f * (float)stackCount;
				break;
			case "Séisme":
				gun.knockback += 1f * (float)stackCount;
				gun.explodeNearEnemyDamage += 0.5f * (float)stackCount;
				gun.explodeNearEnemyRange += 1f * (float)stackCount;
				break;
			case "Flèche Explosive":
				gun.explodeNearEnemyDamage += 0.8f * (float)stackCount;
				gun.projectileSpeed += 1f * (float)stackCount;
				gun.damage += 0.3f * (float)stackCount;
				break;
			case "Pluie de Flèches":
				gun.numberOfProjectiles += 4 * stackCount;
				gun.spread += 0.5f * (float)stackCount;
				break;
			case "Rage":
				gun.damage += 0.5f * (float)stackCount;
				statModifiers.movementSpeed += 0.3f * (float)stackCount;
				break;
			case "Frénésie":
				gun.damage += 1f * (float)stackCount;
				statModifiers.movementSpeed += 0.5f * (float)stackCount;
				gun.attackSpeed *= Mathf.Pow(0.7f, (float)stackCount);
				break;
			case "Réflexion Totale":
				gun.reflects += 5 * stackCount;
				gun.damage += 0.3f * (float)stackCount;
				break;
			case "Congélation":
				gun.slow += 0.3f * (float)stackCount;
				gun.damage += 0.1f * (float)stackCount;
				break;
			case "Mur de Glace":
				gun.slow += 0.5f * (float)stackCount;
				statModifiers.slow += 0.3f * (float)stackCount;
				break;
			case "Chaîne Électrique":
				gun.reflects += 3 * stackCount;
				gun.damage += 0.2f * (float)stackCount;
				break;
			case "Trou Noir":
				gun.gravity += 0.5f * (float)stackCount;
				gun.damage += 0.2f * (float)stackCount;
				break;
			case "Racines":
				gun.slow += 0.4f * (float)stackCount;
				gun.damage += 0.1f * (float)stackCount;
				break;
			case "Spores":
				gun.slow += 0.3f * (float)stackCount;
				gun.explodeNearEnemyDamage += 0.3f * (float)stackCount;
				gun.explodeNearEnemyRange += 0.5f * (float)stackCount;
				break;
			case "Drone":
				gun.numberOfProjectiles += stackCount;
				gun.attackSpeed *= Mathf.Pow(0.9f, (float)stackCount);
				break;
			case "Hémorragie":
				gun.damage += 0.3f * (float)stackCount;
				statModifiers.lifeSteal += 0.1f * (float)stackCount;
				break;
			case "Vampirisme":
				statModifiers.lifeSteal += 0.2f * (float)stackCount;
				break;
			case "Flash":
				gun.slow += 0.5f * (float)stackCount;
				break;
			case "Rayon Divin":
				gun.damage += 1f * (float)stackCount;
				gun.projectileSpeed += 1f * (float)stackCount;
				break;
			case "Disparition":
				statModifiers.movementSpeed += 0.4f * (float)stackCount;
				gun.damage += 0.3f * (float)stackCount;
				break;
			case "Singularité":
				gun.gravity += 1f * (float)stackCount;
				gun.explodeNearEnemyDamage += 1f * (float)stackCount;
				gun.explodeNearEnemyRange += 2f * (float)stackCount;
				break;
			case "Exécution":
				gun.damage += 2f * (float)stackCount;
				gun.projectileSpeed += 1f * (float)stackCount;
				break;
			case "Indestructible":
				data.maxHealth += 200f * (float)stackCount;
				statModifiers.slow += 0.5f * (float)stackCount;
				break;
			case "Flèche Divine":
				gun.reflects += 10 * stackCount;
				gun.damage += 1f * (float)stackCount;
				gun.projectileSpeed += 2f * (float)stackCount;
				break;
			case "Apocalypse":
				gun.explodeNearEnemyDamage += 2f * (float)stackCount;
				gun.explodeNearEnemyRange += 3f * (float)stackCount;
				gun.damage += 1f * (float)stackCount;
				break;
			case "Possession":
				statModifiers.movementSpeed += 1f * (float)stackCount;
				gun.damage += 0.5f * (float)stackCount;
				break;
			case "Dernière Rage":
				gun.explodeNearEnemyDamage += 2f * (float)stackCount;
				gun.explodeNearEnemyRange += 5f * (float)stackCount;
				statModifiers.movementSpeed += 0.5f * (float)stackCount;
				break;
			case "Paradoxe":
				gun.numberOfProjectiles += 2 * stackCount;
				gun.damage += 0.5f * (float)stackCount;
				break;
			case "Tempête Électrique":
				gun.numberOfProjectiles += 5 * stackCount;
				gun.spread += 1f * (float)stackCount;
				gun.damage += 0.3f * (float)stackCount;
				break;
			case "Blizzard":
				gun.slow += 1f * (float)stackCount;
				gun.numberOfProjectiles += 3 * stackCount;
				break;
			case "Floraison":
				gun.explodeNearEnemyDamage += 1f * (float)stackCount;
				gun.explodeNearEnemyRange += 2f * (float)stackCount;
				statModifiers.lifeSteal += 0.1f * (float)stackCount;
				break;
			case "Surcharge Système":
				gun.damage += 1f * (float)stackCount;
				gun.attackSpeed *= Mathf.Pow(0.6f, (float)stackCount);
				statModifiers.movementSpeed += 0.5f * (float)stackCount;
				break;
			case "Explosion de Sang":
				gun.explodeNearEnemyDamage += 1.5f * (float)stackCount;
				gun.explodeNearEnemyRange += 2f * (float)stackCount;
				statModifiers.lifeSteal += 0.2f * (float)stackCount;
				break;
			case "Jugement":
				gun.damage += 1.5f * (float)stackCount;
				gun.projectileSpeed += 0.5f * (float)stackCount;
				break;
			case "Absorption Sombre":
				statModifiers.movementSpeed += 0.3f * (float)stackCount;
				data.maxHealth += 50f * (float)stackCount;
				gun.damage += 0.5f * (float)stackCount;
				break;
			}
		}
	}
}
public class CardSelectionUI : MonoBehaviour
{
	[CompilerGenerated]
	private sealed class <AnimateIn>d__19 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public CardSelectionUI <>4__this;

		private float <t>5__1;

		private List<GameObject>.Enumerator <>s__2;

		private GameObject <c>5__3;

		private float <ease>5__4;

		private int <i>5__5;

		private float <delay>5__6;

		private float <it>5__7;

		private float <iease>5__8;

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

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

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

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>s__2 = default(List<GameObject>.Enumerator);
			<c>5__3 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>s__2 = <>4__this.cardObjects.GetEnumerator();
				try
				{
					while (<>s__2.MoveNext())
					{
						<c>5__3 = <>s__2.Current;
						<c>5__3.transform.localPosition = new Vector3(0f, -80f, 0f);
						<c>5__3 = null;
					}
				}
				finally
				{
					((IDisposable)<>s__2).Dispose();
				}
				<>s__2 = default(List<GameObject>.Enumerator);
				<t>5__1 = 0f;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			if (<t>5__1 < 1f)
			{
				<t>5__1 += Time.deltaTime / 0.45f;
				<ease>5__4 = Mathf.SmoothStep(0f, 1f, <t>5__1);
				<>4__this.canvasGroup.alpha = <ease>5__4;
				<i>5__5 = 0;
				while (<i>5__5 < <>4__this.cardObjects.Count)
				{
					<delay>5__6 = (float)<i>5__5 * 0.08f;
					<it>5__7 = Mathf.Clamp01((<t>5__1 - <delay>5__6) / (1f - <delay>5__6));
					<iease>5__8 = Mathf.SmoothStep(0f, 1f, <it>5__7);
					<>4__this.cardObjects[<i>5__5].transform.localPosition = Vector3.Lerp(new Vector3(0f, -80f, 0f), Vector3.zero, <iease>5__8);
					<i>5__5++;
				}
				<>2__current = null;
				<>1__state = 1;
				return 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();
		}
	}

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

		private object <>2__current;

		public CardSelectionUI <>4__this;

		private float <t>5__1;

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

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

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

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

		private bool MoveNext()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = (object)new WaitForSeconds(0.4f);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				<t>5__1 = 0f;
				break;
			case 2:
				<>1__state = -1;
				break;
			}
			if (<t>5__1 < 1f)
			{
				<t>5__1 += Time.deltaTime / 0.3f;
				<>4__this.canvasGroup.alpha = Mathf.SmoothStep(1f, 0f, <t>5__1);
				<>4__this.panel.transform.localScale = Vector3.Lerp(Vector3.one, new Vector3(1.04f, 1.04f, 1f), <t>5__1);
				<>2__current = null;
				<>1__state = 2;
				return true;
			}
			Object.Destroy((Object)(object)((Component)<>4__this).gameObject);
			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 GameObject panel;

	private List<GameObject> cardObjects = new List<GameObject>();

	private CanvasGroup canvasGroup;

	private TextMeshProUGUI titleText;

	private TextMeshProUGUI subtitleText;

	private int playerID;

	private List<CardData> cards;

	private bool chosen = false;

	private float animTimer = 0f;

	private static readonly Color BG_COLOR = new Color(0.04f, 0.04f, 0.06f, 0.95f);

	private static readonly Color CARD_BG = new Color(0.1f, 0.1f, 0.15f, 1f);

	private static readonly Color CARD_HOVER = new Color(0.18f, 0.18f, 0.25f, 1f);

	private static readonly Color WHITE = new Color(1f, 1f, 1f, 1f);

	private static readonly Color GREY = new Color(0.6f, 0.6f, 0.65f, 1f);

	private static readonly Color ACCENT = new Color(0.85f, 0.25f, 0.25f, 1f);

	public static CardSelectionUI Show(int playerID, List<CardData> cards)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		GameObject val = new GameObject("CardSelectionUI");
		Object.DontDestroyOnLoad((Object)(object)val);
		CardSelectionUI cardSelectionUI = val.AddComponent<CardSelectionUI>();
		cardSelectionUI.playerID = playerID;
		cardSelectionUI.cards = cards;
		cardSelectionUI.Build();
		return cardSelectionUI;
	}

	private void Build()
	{
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: 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)
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0110: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_014e: Unknown result type (might be due to invalid IL or missing references)
		//IL_015d: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_021e: Unknown result type (might be due to invalid IL or missing references)
		//IL_022d: Unknown result type (might be due to invalid IL or missing references)
		//IL_023c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0272: Unknown result type (might be due to invalid IL or missing references)
		//IL_0281: Unknown result type (might be due to invalid IL or missing references)
		//IL_0286: Unknown result type (might be due to invalid IL or missing references)
		//IL_028b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0295: Unknown result type (might be due to invalid IL or missing references)
		Canvas val = ((Component)this).gameObject.AddComponent<Canvas>();
		val.renderMode = (RenderMode)0;
		val.sortingOrder = 998;
		((Component)this).gameObject.AddComponent<CanvasScaler>().uiScaleMode = (ScaleMode)1;
		((Component)this).gameObject.AddComponent<GraphicRaycaster>();
		panel = CreatePanel(((Component)this).gameObject, "Panel", Vector2.zero, Vector2.one, Vector2.zero, BG_COLOR);
		canvasGroup = panel.AddComponent<CanvasGroup>();
		canvasGroup.alpha = 0f;
		GameObject val2 = CreatePanel(panel, "TopLine", new Vector2(0f, 1f), new Vector2(1f, 1f), Vector2.zero, ACCENT);
		val2.GetComponent<RectTransform>().sizeDelta = new Vector2(0f, 3f);
		GameObject val3 = CreatePanel(panel, "BotLine", new Vector2(0f, 0f), new Vector2(1f, 0f), Vector2.zero, ACCENT);
		val3.GetComponent<RectTransform>().sizeDelta = new Vector2(0f, 3f);
		titleText = CreateText(panel, "Title", "CHOOSE A CARD", 48f, (FontStyles)1, WHITE, new Vector2(0.05f, 0.82f), new Vector2(0.95f, 0.96f));
		((TMP_Text)titleText).alignment = (TextAlignmentOptions)514;
		((TMP_Text)titleText).characterSpacing = 8f;
		ClassType type = (ClassManager.PlayerClasses.ContainsKey(playerID) ? ClassManager.PlayerClasses[playerID] : ClassType.Mage);
		ClassData @class = ClassManager.GetClass(type);
		subtitleText = CreateText(panel, "Subtitle", (@class != null) ? $"Joueur {playerID + 1}  —  Classe {@class.Name.ToUpper()}" : $"Joueur {playerID + 1}", 16f, (FontStyles)2, GREY, new Vector2(0.05f, 0.76f), new Vector2(0.95f, 0.83f));
		((TMP_Text)subtitleText).alignment = (TextAlignmentOptions)514;
		CreatePanel(panel, "Sep", new Vector2(0.1f, 0.748f), new Vector2(0.9f, 0.752f), Vector2.zero, ACCENT * 0.6f);
		BuildCards();
		((MonoBehaviour)this).StartCoroutine(AnimateIn());
	}

	private void BuildCards()
	{
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: 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_00e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: Unknown result type (might be due to invalid IL or missing references)
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_014b: Unknown result type (might be due to invalid IL or missing references)
		//IL_015a: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0254: Unknown result type (might be due to invalid IL or missing references)
		//IL_0263: Unknown result type (might be due to invalid IL or missing references)
		//IL_0268: Unknown result type (might be due to invalid IL or missing references)
		//IL_026d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0274: Unknown result type (might be due to invalid IL or missing references)
		//IL_0296: Unknown result type (might be due to invalid IL or missing references)
		//IL_0298: Unknown result type (might be due to invalid IL or missing references)
		//IL_029d: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02db: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_0322: Unknown result type (might be due to invalid IL or missing references)
		//IL_0331: Unknown result type (might be due to invalid IL or missing references)
		//IL_0336: Unknown result type (might be due to invalid IL or missing references)
		//IL_033b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0345: Unknown result type (might be due to invalid IL or missing references)
		//IL_0365: Unknown result type (might be due to invalid IL or missing references)
		//IL_0374: Unknown result type (might be due to invalid IL or missing references)
		//IL_0383: Unknown result type (might be due to invalid IL or missing references)
		//IL_045c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0461: Unknown result type (might be due to invalid IL or missing references)
		//IL_03cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_03dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_041a: Unknown result type (might be due to invalid IL or missing references)
		//IL_041f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0424: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01db: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_020d: Unknown result type (might be due to invalid IL or missing references)
		//IL_021c: Unknown result type (might be due to invalid IL or missing references)
		//IL_022b: Unknown result type (might be due to invalid IL or missing references)
		int count = cards.Count;
		float num = 0.02f;
		float num2 = 1f - num * (float)(count + 1);
		float num3 = num2 / (float)count;
		for (int i = 0; i < count; i++)
		{
			CardData cardData = cards[i];
			float num4 = num + (float)i * (num3 + num);
			float num5 = num4 + num3;
			GameObject val = CreatePanel(panel, "Card_" + i, new Vector2(num4, 0.08f), new Vector2(num5, 0.72f), new Vector2(6f, 6f), CARD_BG);
			Color val2 = CardManager.RarityColors[cardData.Rarity];
			CreatePanel(val, "RarityBar", new Vector2(0f, 0.92f), new Vector2(1f, 1f), Vector2.zero, val2);
			((TMP_Text)CreateText(val, "RarityLabel", GetRarityLabel(cardData.Rarity), 10f, (FontStyles)1, val2, new Vector2(0.05f, 0.84f), new Vector2(0.95f, 0.92f))).alignment = (TextAlignmentOptions)514;
			CreatePanel(val, "RaritySep", new Vector2(0.1f, 0.838f), new Vector2(0.9f, 0.841f), Vector2.zero, val2 * 0.5f);
			if (cardData.ExclusiveClass.HasValue)
			{
				ClassData @class = ClassManager.GetClass(cardData.ExclusiveClass.Value);
				if (@class != null)
				{
					GameObject parent = CreatePanel(val, "ClassTag", new Vector2(0.05f, 0.74f), new Vector2(0.95f, 0.83f), Vector2.zero, @class.PrimaryColor * 0.3f);
					((TMP_Text)CreateText(parent, "ClassTagText", @class.Name.ToUpper(), 9f, (FontStyles)1, @class.PrimaryColor, new Vector2(0.05f, 0.1f), new Vector2(0.95f, 0.9f))).alignment = (TextAlignmentOptions)514;
				}
			}
			GameObject parent2 = CreatePanel(val, "IconZone", new Vector2(0.15f, 0.52f), new Vector2(0.85f, 0.74f), Vector2.zero, val2 * 0.15f);
			((TMP_Text)CreateText(parent2, "IconText", GetCardIcon(cardData), 28f, (FontStyles)1, val2, Vector2.zero, Vector2.one)).alignment = (TextAlignmentOptions)514;
			TextMeshProUGUI val3 = CreateText(val, "Name", cardData.Name.ToUpper(), 13f, (FontStyles)1, WHITE, new Vector2(0.05f, 0.38f), new Vector2(0.95f, 0.52f));
			((TMP_Text)val3).alignment = (TextAlignmentOptions)514;
			((TMP_Text)val3).characterSpacing = 2f;
			CreatePanel(val, "NameSep", new Vector2(0.1f, 0.378f), new Vector2(0.9f, 0.381f), Vector2.zero, WHITE * 0.15f);
			((TMP_Text)CreateText(val, "Desc", cardData.Description, 11f, (FontStyles)0, GREY, new Vector2(0.06f, 0.14f), new Vector2(0.94f, 0.375f))).alignment = (TextAlignmentOptions)514;
			int stackCount = CardPicker.GetStackCount(playerID, cardData.Name);
			if (stackCount > 0)
			{
				GameObject parent3 = CreatePanel(val, "StackBadge", new Vector2(0.7f, 0.02f), new Vector2(0.98f, 0.13f), Vector2.zero, val2 * 0.8f);
				((TMP_Text)CreateText(parent3, "StackText", $"x{stackCount + 1}", 14f, (FontStyles)1, WHITE, Vector2.zero, Vector2.one)).alignment = (TextAlignmentOptions)514;
			}
			CardData captured = cardData;
			int index = i;
			AddButton(val, delegate
			{
				OnCardChosen(captured, index);
			}, CARD_BG, CARD_HOVER);
			cardObjects.Add(val);
		}
	}

	private void OnCardChosen(CardData card, int index)
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		if (chosen)
		{
			return;
		}
		chosen = true;
		for (int i = 0; i < cardObjects.Count; i++)
		{
			if (i == index)
			{
				((Graphic)cardObjects[i].GetComponent<Image>()).color = CardManager.RarityColors[card.Rarity] * 0.3f;
				continue;
			}
			CanvasGroup val = cardObjects[i].AddComponent<CanvasGroup>();
			val.alpha = 0.3f;
		}
		GameManager.OnCardSelected(playerID, card);
		Plugin.Log.LogInfo((object)$"Joueur {playerID + 1} a choisi : {card.Name} [{card.Rarity}]");
		((MonoBehaviour)this).StartCoroutine(AnimateOut());
	}

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

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

	private void Update()
	{
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: 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_007f: Unknown result type (might be due to invalid IL or missing references)
		animTimer += Time.deltaTime;
		if (!chosen)
		{
			for (int i = 0; i < cardObjects.Count; i++)
			{
				float num = Mathf.Sin(animTimer * 1.5f + (float)i * 0.8f) * 3f;
				Vector3 localPosition = cardObjects[i].transform.localPosition;
				cardObjects[i].transform.localPosition = new Vector3(localPosition.x, num, localPosition.z);
			}
		}
	}

	private string GetRarityLabel(CardRarity rarity)
	{
		return rarity switch
		{
			CardRarity.Common => "⚪  COMMUN", 
			CardRarity.Rare => "\ud83d\udd35  RARE", 
			CardRarity.Legendary => "\ud83d\udfe3  LÉGENDAIRE", 
			CardRarity.Mythic => "\ud83d\udfe0  MYTHIQUE", 
			_ => "INCONNU", 
		};
	}

	private string GetCardIcon(CardData card)
	{
		if (card.Category == CardCategory.Chaos)
		{
			return "\ud83c\udfb2";
		}
		if (card.Category == CardCategory.Environment)
		{
			return "\ud83c\udf0d";
		}
		if (card.Category == CardCategory.Utility)
		{
			return "⚙";
		}
		if (card.ExclusiveClass.HasValue)
		{
			return "⭐";
		}
		return card.Rarity switch
		{
			CardRarity.Mythic => "\ud83d\udc51", 
			CardRarity.Legendary => "\ud83d\udc8e", 
			CardRarity.Rare => "✦", 
			_ => "•", 
		};
	}

	private GameObject CreatePanel(GameObject parent, string name, Vector2 anchorMin, Vector2 anchorMax, Vector2 offset, Color color)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: 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_003f: 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)
		GameObject val = new GameObject(name);
		val.transform.SetParent(parent.transform, false);
		RectTransform val2 = val.AddComponent<RectTransform>();
		val2.anchorMin = anchorMin;
		val2.anchorMax = anchorMax;
		val2.offsetMin = offset;
		val2.offsetMax = -offset;
		((Graphic)val.AddComponent<Image>()).color = color;
		return val;
	}

	private TextMeshProUGUI CreateText(GameObject parent, string name, string text, float size, FontStyles style, Color color, Vector2 anchorMin, Vector2 anchorMax)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_0023: 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_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = new GameObject(name);
		val.transform.SetParent(parent.transform, false);
		RectTransform val2 = val.AddComponent<RectTransform>();
		val2.anchorMin = anchorMin;
		val2.anchorMax = anchorMax;
		Vector2 offsetMin = (val2.offsetMax = Vector2.zero);
		val2.offsetMin = offsetMin;
		TextMeshProUGUI val3 = val.AddComponent<TextMeshProUGUI>();
		((TMP_Text)val3).text = text;
		((TMP_Text)val3).fontSize = size;
		((TMP_Text)val3).fontStyle = style;
		((Graphic)val3).color = color;
		return val3;
	}

	private void AddButton(GameObject go, Action onClick, Color normal, Color hover)
	{
		//IL_001d: 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)
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Expected O, but got Unknown
		Button val = go.AddComponent<Button>();
		Image component = go.GetComponent<Image>();
		ColorBlock colors = ((Selectable)val).colors;
		((ColorBlock)(ref colors)).normalColor = normal;
		((ColorBlock)(ref colors)).highlightedColor = hover;
		((ColorBlock)(ref colors)).pressedColor = hover * 0.8f;
		((Selectable)val).colors = colors;
		((Selectable)val).targetGraphic = (Graphic)(object)component;
		((UnityEvent)val.onClick).AddListener((UnityAction)delegate
		{
			onClick();
		});
	}
}
public class Class1
{
}
public enum ClassType
{
	Mage,
	Assassin,
	Tank,
	Archer,
	Demon,
	Specter,
	Berserker,
	Mirror,
	Time,
	Electric,
	Ice,
	Gravity,
	Nature,
	Technology,
	Blood,
	Light,
	Shadow
}
public class ClassData
{
	public ClassType Type;

	public string Name;

	public string Description;

	public Color PrimaryColor;

	public Color SecondaryColor;

	public float MoveSpeedMultiplier;

	public float HealthMultiplier;

	public float DamageMultiplier;

	public float BulletSpeedMultiplier;

	public string PassiveDescription;

	public string MusicTrack;

	public string ParticleEffect;
}
public static class ClassManager
{
	public static Dictionary<ClassType, ClassData> Classes = new Dictionary<ClassType, ClassData>();

	public static Dictionary<int, ClassType> PlayerClasses = new Dictionary<int, ClassType>();

	public static void Initialize()
	{
		RegisterAllClasses();
		Plugin.Log.LogInfo((object)("ClassManager initialisé — " + Classes.Count + " classes chargées"));
	}

	private static void RegisterAllClasses()
	{
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: 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_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0185: Unknown result type (might be due to invalid IL or missing references)
		//IL_018a: Unknown result type (might be due to invalid IL or missing references)
		//IL_019f: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_022e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0233: Unknown result type (might be due to invalid IL or missing references)
		//IL_0248: Unknown result type (might be due to invalid IL or missing references)
		//IL_024d: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0380: Unknown result type (might be due to invalid IL or missing references)
		//IL_0385: Unknown result type (might be due to invalid IL or missing references)
		//IL_039a: Unknown result type (might be due to invalid IL or missing references)
		//IL_039f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0429: Unknown result type (might be due to invalid IL or missing references)
		//IL_042e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0443: Unknown result type (might be due to invalid IL or missing references)
		//IL_0448: Unknown result type (might be due to invalid IL or missing references)
		//IL_04d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_04d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_04f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_057b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0580: Unknown result type (might be due to invalid IL or missing references)
		//IL_0595: Unknown result type (might be due to invalid IL or missing references)
		//IL_059a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0625: Unknown result type (might be due to invalid IL or missing references)
		//IL_062a: Unknown result type (might be due to invalid IL or missing references)
		//IL_063f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0644: Unknown result type (might be due to invalid IL or missing references)
		//IL_06cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_06d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_06ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_0779: Unknown result type (might be due to invalid IL or missing references)
		//IL_077e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0793: Unknown result type (might be due to invalid IL or missing references)
		//IL_0798: Unknown result type (might be due to invalid IL or missing references)
		//IL_0823: Unknown result type (might be due to invalid IL or missing references)
		//IL_0828: Unknown result type (might be due to invalid IL or missing references)
		//IL_083d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0842: Unknown result type (might be due to invalid IL or missing references)
		//IL_08cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_08d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_08e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_08ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_0977: Unknown result type (might be due to invalid IL or missing references)
		//IL_097c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0991: Unknown result type (might be due to invalid IL or missing references)
		//IL_0996: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a21: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a26: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a3b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a40: Unknown result type (might be due to invalid IL or missing references)
		//IL_0acb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0ad0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0ae5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0aea: Unknown result type (might be due to invalid IL or missing references)
		Register(new ClassData
		{
			Type = ClassType.Mage,
			Name = "Mage",
			Description = "Maître des arcanes, ses balles sont lentes mais devastatrices",
			PrimaryColor = new Color(0.5f, 0f, 1f),
			SecondaryColor = new Color(0.2f, 0f, 0.8f),
			MoveSpeedMultiplier = 0.9f,
			HealthMultiplier = 1f,
			DamageMultiplier = 1.3f,
			BulletSpeedMultiplier = 0.7f,
			PassiveDescription = "Balles plus lentes mais plus grosses et plus puissantes",
			MusicTrack = "music_mage",
			ParticleEffect = "fx_mage_smoke"
		});
		Register(new ClassData
		{
			Type = ClassType.Assassin,
			Name = "Assassin",
			Description = "Ombre et vitesse, frappe avant d'être vu",
			PrimaryColor = new Color(0.1f, 0.1f, 0.1f),
			SecondaryColor = new Color(0.8f, 0f, 0f),
			MoveSpeedMultiplier = 1.5f,
			HealthMultiplier = 0.8f,
			DamageMultiplier = 1.2f,
			BulletSpeedMultiplier = 1.4f,
			PassiveDescription = "Déplacement ultra rapide, frappe directe",
			MusicTrack = "music_assassin",
			ParticleEffect = "fx_assassin_shadow"
		});
		Register(new ClassData
		{
			Type = ClassType.Tank,
			Name = "Tank",
			Description = "Forteresse vivante, rien ne le fait plier",
			PrimaryColor = new Color(0.5f, 0.5f, 0.5f),
			SecondaryColor = new Color(0.3f, 0.3f, 0.3f),
			MoveSpeedMultiplier = 0.7f,
			HealthMultiplier = 2f,
			DamageMultiplier = 1.1f,
			BulletSpeedMultiplier = 0.8f,
			PassiveDescription = "Double vie mais se déplace lentement",
			MusicTrack = "music_tank",
			ParticleEffect = "fx_tank_shockwave"
		});
		Register(new ClassData
		{
			Type = ClassType.Archer,
			Name = "Archer",
			Description = "Précision absolue, aucune cible ne lui échappe",
			PrimaryColor = new Color(0.8f, 0.6f, 0f),
			SecondaryColor = new Color(0.4f, 0.3f, 0f),
			MoveSpeedMultiplier = 1.1f,
			HealthMultiplier = 0.9f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 2f,
			PassiveDescription = "Balles ultra rapides et précises",
			MusicTrack = "music_archer",
			ParticleEffect = "fx_archer_trail"
		});
		Register(new ClassData
		{
			Type = ClassType.Demon,
			Name = "Démon",
			Description = "Nourri par la souffrance des autres",
			PrimaryColor = new Color(0.8f, 0f, 0f),
			SecondaryColor = new Color(0.4f, 0f, 0f),
			MoveSpeedMultiplier = 1.1f,
			HealthMultiplier = 1.1f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 1f,
			PassiveDescription = "Vole de la vie sur chaque balle touchée",
			MusicTrack = "music_demon",
			ParticleEffect = "fx_demon_fire"
		});
		Register(new ClassData
		{
			Type = ClassType.Specter,
			Name = "Spectre",
			Description = "Entre deux mondes, insaisissable",
			PrimaryColor = new Color(0.9f, 0.9f, 1f),
			SecondaryColor = new Color(0.6f, 0.6f, 0.9f),
			MoveSpeedMultiplier = 1.2f,
			HealthMultiplier = 0.9f,
			DamageMultiplier = 0.9f,
			BulletSpeedMultiplier = 1.1f,
			PassiveDescription = "Peut traverser les plateformes",
			MusicTrack = "music_specter",
			ParticleEffect = "fx_specter_ghost"
		});
		Register(new ClassData
		{
			Type = ClassType.Berserker,
			Name = "Berserker",
			Description = "La douleur le rend plus fort",
			PrimaryColor = new Color(1f, 0.2f, 0f),
			SecondaryColor = new Color(0.6f, 0f, 0f),
			MoveSpeedMultiplier = 1f,
			HealthMultiplier = 1.2f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 1f,
			PassiveDescription = "Plus tu prends de dégâts plus tu es rapide",
			MusicTrack = "music_berserker",
			ParticleEffect = "fx_berserker_rage"
		});
		Register(new ClassData
		{
			Type = ClassType.Mirror,
			Name = "Miroir",
			Description = "Tout ce que tu envoies te revient",
			PrimaryColor = new Color(0.9f, 0.9f, 0.9f),
			SecondaryColor = new Color(0.7f, 0.9f, 1f),
			MoveSpeedMultiplier = 1f,
			HealthMultiplier = 1f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 1f,
			PassiveDescription = "Renvoie 50% des balles reçues",
			MusicTrack = "music_mirror",
			ParticleEffect = "fx_mirror_reflect"
		});
		Register(new ClassData
		{
			Type = ClassType.Time,
			Name = "Temps",
			Description = "Le temps est son arme la plus redoutable",
			PrimaryColor = new Color(0f, 0.8f, 1f),
			SecondaryColor = new Color(0f, 0.4f, 0.8f),
			MoveSpeedMultiplier = 1.1f,
			HealthMultiplier = 1f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 1f,
			PassiveDescription = "Perception temporelle ralentie légèrement",
			MusicTrack = "music_time",
			ParticleEffect = "fx_time_distortion"
		});
		Register(new ClassData
		{
			Type = ClassType.Electric,
			Name = "Électrique",
			Description = "L'énergie pure sous forme de combat",
			PrimaryColor = new Color(1f, 1f, 0f),
			SecondaryColor = new Color(0f, 0.5f, 1f),
			MoveSpeedMultiplier = 1.2f,
			HealthMultiplier = 0.9f,
			DamageMultiplier = 1.1f,
			BulletSpeedMultiplier = 1.3f,
			PassiveDescription = "Balles créent une impulsion qui dévie les balles adverses",
			MusicTrack = "music_electric",
			ParticleEffect = "fx_electric_lightning"
		});
		Register(new ClassData
		{
			Type = ClassType.Ice,
			Name = "Glace",
			Description = "Froid et implacable comme le blizzard",
			PrimaryColor = new Color(0.7f, 0.9f, 1f),
			SecondaryColor = new Color(0.4f, 0.7f, 1f),
			MoveSpeedMultiplier = 1f,
			HealthMultiplier = 1.1f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 0.9f,
			PassiveDescription = "Traînée de glace qui ralentit l'adversaire",
			MusicTrack = "music_ice",
			ParticleEffect = "fx_ice_crystals"
		});
		Register(new ClassData
		{
			Type = ClassType.Gravity,
			Name = "Gravité",
			Description = "Maître des forces invisibles",
			PrimaryColor = new Color(0.2f, 0f, 0.3f),
			SecondaryColor = new Color(0.5f, 0f, 0.8f),
			MoveSpeedMultiplier = 1f,
			HealthMultiplier = 1f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 1f,
			PassiveDescription = "Peut modifier légèrement sa propre gravité",
			MusicTrack = "music_gravity",
			ParticleEffect = "fx_gravity_orbit"
		});
		Register(new ClassData
		{
			Type = ClassType.Nature,
			Name = "Nature",
			Description = "La vie trouve toujours un chemin",
			PrimaryColor = new Color(0.2f, 0.8f, 0.2f),
			SecondaryColor = new Color(0.1f, 0.5f, 0.1f),
			MoveSpeedMultiplier = 1f,
			HealthMultiplier = 1.2f,
			DamageMultiplier = 0.9f,
			BulletSpeedMultiplier = 0.9f,
			PassiveDescription = "Régénération lente mais constante",
			MusicTrack = "music_nature",
			ParticleEffect = "fx_nature_leaves"
		});
		Register(new ClassData
		{
			Type = ClassType.Technology,
			Name = "Technologie",
			Description = "La machine ne connaît pas la fatigue",
			PrimaryColor = new Color(0f, 0.8f, 1f),
			SecondaryColor = new Color(0f, 0.4f, 0.6f),
			MoveSpeedMultiplier = 1f,
			HealthMultiplier = 1f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 1.1f,
			PassiveDescription = "Tourelle miniature déployée automatiquement",
			MusicTrack = "music_tech",
			ParticleEffect = "fx_tech_hologram"
		});
		Register(new ClassData
		{
			Type = ClassType.Blood,
			Name = "Sang",
			Description = "Chaque blessure le rend plus dangereux",
			PrimaryColor = new Color(0.7f, 0f, 0f),
			SecondaryColor = new Color(0.4f, 0f, 0f),
			MoveSpeedMultiplier = 1f,
			HealthMultiplier = 1.1f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 1f,
			PassiveDescription = "Chaque dégât reçu augmente les dégâts de 5%",
			MusicTrack = "music_blood",
			ParticleEffect = "fx_blood_splatter"
		});
		Register(new ClassData
		{
			Type = ClassType.Light,
			Name = "Lumière",
			Description = "Pure et aveuglante comme le soleil",
			PrimaryColor = new Color(1f, 1f, 0.8f),
			SecondaryColor = new Color(1f, 0.9f, 0.4f),
			MoveSpeedMultiplier = 1.1f,
			HealthMultiplier = 1f,
			DamageMultiplier = 1f,
			BulletSpeedMultiplier = 1.2f,
			PassiveDescription = "Balles aveuglent brièvement à l'impact",
			MusicTrack = "music_light",
			ParticleEffect = "fx_light_glow"
		});
		Register(new ClassData
		{
			Type = ClassType.Shadow,
			Name = "Ombre",
			Description = "Invisible dans les ténèbres",
			PrimaryColor = new Color(0.1f, 0.1f, 0.1f),
			SecondaryColor = new Color(0.5f, 0f, 0f),
			MoveSpeedMultiplier = 1.2f,
			HealthMultiplier = 0.9f,
			DamageMultiplier = 1.1f,
			BulletSpeedMultiplier = 1.1f,
			PassiveDescription = "Invisible dans les zones sombres de la map",
			MusicTrack = "music_shadow",
			ParticleEffect = "fx_shadow_darkness"
		});
	}

	private static void Register(ClassData data)
	{
		Classes[data.Type] = data;
	}

	public static ClassData GetClass(ClassType type)
	{
		return Classes.ContainsKey(type) ? Classes[type] : null;
	}

	public static void SetPlayerClass(int playerID, ClassType type)
	{
		PlayerClasses[playerID] = type;
		ApplyClassStats(playerID, type);
	}

	private static void ApplyClassStats(int playerID, ClassType type)
	{
		ClassData @class = GetClass(type);
		if (@class != null)
		{
			Plugin.Log.LogInfo((object)$"Classe {@class.Name} appliquée au joueur {playerID}");
		}
	}
}
public class ClassSelectionUI : MonoBehaviour
{
	[CompilerGenerated]
	private sealed class <AnimateIn>d__34 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public ClassSelectionUI <>4__this;

		private CanvasGroup <cg>5__1;

		private float <t>5__2;

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

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

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

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

		private bool MoveNext()
		{
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<cg>5__1 = <>4__this.background.AddComponent<CanvasGroup>();
				<cg>5__1.alpha = 0f;
				<t>5__2 = 0f;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			if (<t>5__2 < 1f)
			{
				<t>5__2 += Time.deltaTime / 0.4f;
				<cg>5__1.alpha = Mathf.SmoothStep(0f, 1f, <t>5__2);
				<>4__this.background.transform.localScale = Vector3.Lerp(new Vector3(0.95f, 0.95f, 1f), Vector3.one, <t>5__2);
				<>2__current = null;
				<>1__state = 1;
				return 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();
		}
	}

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

		private object <>2__current;

		public ClassSelectionUI <>4__this;

		private CanvasGroup <cg>5__1;

		private float <t>5__2;

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

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

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

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

		private bool MoveNext()
		{
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<cg>5__1 = <>4__this.background.GetComponent<CanvasGroup>();
				if ((Object)(object)<cg>5__1 == (Object)null)
				{
					<cg>5__1 = <>4__this.background.AddComponent<CanvasGroup>();
				}
				<t>5__2 = 0f;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			if (<t>5__2 < 1f)
			{
				<t>5__2 += Time.deltaTime / 0.3f;
				<cg>5__1.alpha = Mathf.SmoothStep(1f, 0f, <t>5__2);
				<>4__this.background.transform.localScale = Vector3.Lerp(Vector3.one, new Vector3(1.05f, 1.05f, 1f), <t>5__2);
				<>2__current = null;
				<>1__state = 1;
				return true;
			}
			Object.Destroy((Object)(object)((Component)<>4__this).gameObject);
			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 GameObject panel;

	private GameObject background;

	private List<GameObject> classCards = new List<GameObject>();

	private GameObject selectedGlow;

	private TextMeshProUGUI titleText;

	private TextMeshProUGUI subtitleText;

	private TextMeshProUGUI classNameText;

	private TextMeshProUGUI classDescText;

	private TextMeshProUGUI passiveText;

	private GameObject confirmButton;

	private TextMeshProUGUI confirmText;

	private ClassType selectedClass = ClassType.Mage;

	private int playerID = 0;

	private bool confirmed = false;

	private float animTimer = 0f;

	private static readonly Color BG_DARK = new Color(0.05f, 0.05f, 0.08f, 0.97f);

	private static readonly Color BG_CARD = new Color(0.1f, 0.1f, 0.15f, 1f);

	private static readonly Color BG_CARD_HOVER = new Color(0.18f, 0.18f, 0.25f, 1f);

	private static readonly Color BG_SELECTED = new Color(0.2f, 0.1f, 0.35f, 1f);

	private static readonly Color COLOR_WHITE = new Color(1f, 1f, 1f, 1f);

	private static readonly Color COLOR_GREY = new Color(0.65f, 0.65f, 0.7f, 1f);

	private static readonly Color COLOR_ACCENT = new Color(0.85f, 0.25f, 0.25f, 1f);

	private static readonly Color GLOW_COLOR = new Color(1f, 1f, 1f, 0.08f);

	public static ClassSelectionUI Show(int playerID)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		GameObject val = new GameObject("ClassSelectionUI");
		Object.DontDestroyOnLoad((Object)(object)val);
		ClassSelectionUI classSelectionUI = val.AddComponent<ClassSelectionUI>();
		classSelectionUI.playerID = playerID;
		classSelectionUI.Build();
		return classSelectionUI;
	}

	private void Build()
	{
		BuildBackground();
		BuildTitle();
		BuildClassGrid();
		BuildInfoPanel();
		BuildConfirmButton();
		SelectClass(ClassType.Mage);
		((MonoBehaviour)this).StartCoroutine(AnimateIn());
	}

	private void BuildBackground()
	{
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: 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)
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: 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)
		//IL_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: 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)
		Canvas val = ((Component)this).gameObject.AddComponent<Canvas>();
		val.renderMode = (RenderMode)0;
		val.sortingOrder = 999;
		((Component)this).gameObject.AddComponent<CanvasScaler>().uiScaleMode = (ScaleMode)1;
		((Component)this).gameObject.AddComponent<GraphicRaycaster>();
		background = CreatePanel(((Component)this).gameObject, "Background", Vector2.zero, Vector2.one, Vector2.zero, BG_DARK);
		GameObject val2 = CreatePanel(background, "TopLine", new Vector2(0f, 1f), new Vector2(1f, 1f), new Vector2(0f, -4f), COLOR_ACCENT);
		val2.GetComponent<RectTransform>().sizeDelta = new Vector2(0f, 3f);
		GameObject val3 = CreatePanel(background, "BotLine", new Vector2(0f, 0f), new Vector2(1f, 0f), new Vector2(0f, 4f), COLOR_ACCENT);
		val3.GetComponent<RectTransform>().sizeDelta = new Vector2(0f, 3f);
	}

	private void BuildTitle()
	{
		//IL_0017: 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_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		GameObject parent = CreatePanel(background, "TitleZone", new Vector2(0f, 0.82f), new Vector2(1f, 1f), Vector2.zero, Color.clear);
		titleText = CreateText(parent, "Title", "CHOOSE YOUR CLASS", 52f, (FontStyles)1, COLOR_WHITE, new Vector2(0.05f, 0f), new Vector2(0.95f, 1f));
		((TMP_Text)titleText).alignment = (TextAlignmentOptions)514;
		((TMP_Text)titleText).characterSpacing = 8f;
		subtitleText = CreateText(parent, "Subtitle", "Each class defines your playstyle — choose wisely", 18f, (FontStyles)2, COLOR_GREY, new Vector2(0.1f, 0f), new Vector2(0.9f, 0.45f));
		((TMP_Text)subtitleText).alignment = (TextAlignmentOptions)514;
	}

	private void BuildClassGrid()
	{
		//IL_0017: 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)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0125: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		//IL_013b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0156: Unknown result type (might be due to invalid IL or missing references)
		//IL_016a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0179: Unknown result type (might be due to invalid IL or missing references)
		//IL_017e: Unknown result type (might be due to invalid IL or missing references)
		//IL_017f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0187: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_022d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0232: Unknown result type (might be due to invalid IL or missing references)
		GameObject parent = CreatePanel(background, "GridZone", new Vector2(0f, 0.22f), new Vector2(0.62f, 0.82f), new Vector2(16f, -8f), Color.clear);
		ClassType[] array = (ClassType[])Enum.GetValues(typeof(ClassType));
		int num = 6;
		float num2 = 0.015f;
		float num3 = 0.04f;
		float num4 = (1f - num2 * (float)(num + 1)) / (float)num;
		for (int i = 0; i < array.Length; i++)
		{
			ClassType classType = array[i];
			ClassData @class = ClassManager.GetClass(classType);
			if (@class != null)
			{
				int num5 = i % num;
				int num6 = i / num;
				float num7 = Mathf.Ceil((float)array.Length / (float)num);
				float num8 = (1f - num3 * (num7 + 1f)) / num7;
				float num9 = num2 + (float)num5 * (num4 + num2);
				float num10 = 1f - num3 - (float)num6 * (num8 + num3);
				float num11 = num10 - num8;
				GameObject val = CreatePanel(parent, "Card_" + classType, new Vector2(num9, num11), new Vector2(num9 + num4, num10), Vector2.zero, BG_CARD);
				RectTransform component = val.GetComponent<RectTransform>();
				component.anchorMin = new Vector2(num9, num11);
				component.anchorMax = new Vector2(num9 + num4, num10);
				Vector2 offsetMin = (component.offsetMax = Vector2.zero);
				component.offsetMin = offsetMin;
				GameObject val2 = CreatePanel(val, "ColorBar", new Vector2(0f, 0.78f), new Vector2(1f, 1f), Vector2.zero, @class.PrimaryColor);
				TextMeshProUGUI val3 = CreateText(val, "Name", @class.Name, 11f, (FontStyles)1, COLOR_WHITE, new Vector2(0.05f, 0.08f), new Vector2(0.95f, 0.75f));
				((TMP_Text)val3).alignment = (TextAlignmentOptions)514;
				ClassType captured = classType;
				AddButton(val, delegate
				{
					SelectClass(captured);
				}, BG_CARD, BG_CARD_HOVER);
				classCards.Add(val);
			}
		}
	}

	private void BuildInfoPanel()
	{
		//IL_0017: 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)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b7: 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)
		//IL_0108: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: 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_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_014e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0180: Unknown result type (might be due to invalid IL or missing references)
		//IL_018f: Unknown result type (might be due to invalid IL or missing references)
		//IL_019e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
		GameObject parent = CreatePanel(background, "InfoZone", new Vector2(0.63f, 0.22f), new Vector2(1f, 0.82f), new Vector2(-16f, -8f), BG_CARD);
		GameObject val = CreatePanel(parent, "ColorBar", new Vector2(0f, 0.92f), new Vector2(1f, 1f), Vector2.zero, COLOR_ACCENT);
		((Object)val).name = "InfoColorBar";
		classNameText = CreateText(parent, "ClassName", "MAGE", 36f, (FontStyles)1, COLOR_WHITE, new Vector2(0.06f, 0.74f), new Vector2(0.94f, 0.92f));
		((TMP_Text)classNameText).alignment = (TextAlignmentOptions)513;
		((TMP_Text)classNameText).characterSpacing = 4f;
		GameObject val2 = CreatePanel(parent, "Sep", new Vector2(0.06f, 0.72f), new Vector2(0.94f, 0.722f), Vector2.zero, COLOR_ACCENT);
		classDescText = CreateText(parent, "ClassDesc", "", 14f, (FontStyles)0, COLOR_GREY, new Vector2(0.06f, 0.54f), new Vector2(0.94f, 0.71f));
		((TMP_Text)classDescText).alignment = (TextAlignmentOptions)513;
		((TMP_Text)CreateText(parent, "PassiveLabel", "PASSIF", 11f, (FontStyles)1, COLOR_ACCENT, new Vector2(0.06f, 0.48f), new Vector2(0.94f, 0.54f))).alignment = (TextAlignmentOptions)513;
		passiveText = CreateText(parent, "Passive", "", 13f, (FontStyles)0, COLOR_WHITE, new Vector2(0.06f, 0.3f), new Vector2(0.94f, 0.48f));
		((TMP_Text)passiveText).alignment = (TextAlignmentOptions)513;
		BuildStatBars(parent);
	}

	private void BuildStatBars(GameObject parent)
	{
		//IL_0063: 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_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: 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)
		//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: 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_0122: Unknown result type (might be due to invalid IL or missing references)
		string[] array = new string[4] { "VITESSE", "VIE", "DÉGÂTS", "BALLE" };
		for (int i = 0; i < array.Length; i++)
		{
			float num = 0.27f - (float)i * 0.065f;
			float num2 = num - 0.045f;
			((TMP_Text)CreateText(parent, "StatLabel_" + i, array[i], 9f, (FontStyles)1, COLOR_GREY, new Vector2(0.06f, num2), new Vector2(0.28f, num))).alignment = (TextAlignmentOptions)513;
			GameObject val = CreatePanel(parent, "BarBg_" + i, new Vector2(0.3f, num2 + 0.01f), new Vector2(0.94f, num - 0.01f), Vector2.zero, new Color(0.2f, 0.2f, 0.2f, 1f));
			((Object)val).name = "StatBarBg_" + i;
			GameObject val2 = CreatePanel(val, "Fill", Vector2.zero, new Vector2(0.5f, 1f), Vector2.zero, COLOR_ACCENT);
			((Object)val2).name = "StatBarFill_" + i;
		}
	}

	private void BuildConfirmButton()
	{
		//IL_0017: 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_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		GameObject parent = CreatePanel(background, "BtnZone", new Vector2(0.3f, 0.05f), new Vector2(0.7f, 0.19f), Vector2.zero, Color.clear);
		confirmButton = CreatePanel(parent, "ConfirmBtn", new Vector2(0.1f, 0.15f), new Vector2(0.9f, 0.85f), Vector2.zero, COLOR_ACCENT);
		confirmText = CreateText(confirmButton, "BtnText", "CONFIRM CLASS", 22f, (FontStyles)1, COLOR_WHITE, Vector2.zero, Vector2.one);
		((TMP_Text)confirmText).alignment = (TextAlignmentOptions)514;
		((TMP_Text)confirmText).characterSpacing = 5f;
		AddButton(confirmButton, OnConfirm, COLOR_ACCENT, new Color(1f, 0.4f, 0.4f, 1f));
	}

	private void SelectClass(ClassType type)
	{
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0123: Unknown result type (might be due to invalid IL or missing references)
		selectedClass = type;
		ClassData @class = ClassManager.GetClass(type);
		if (@class == null)
		{
			return;
		}
		((TMP_Text)classNameText).text = @class.Name.ToUpper();
		((TMP_Text)classDescText).text = @class.Description;
		((TMP_Text)passiveText).text = @class.PassiveDescription;
		Transform val = background.transform.Find("InfoZone/InfoColorBar");
		if ((Object)(object)val != (Object)null)
		{
			((Graphic)((Component)val).GetComponent<Image>()).color = @class.PrimaryColor;
		}
		UpdateStatBars(@class);
		ClassType[] array = (ClassType[])Enum.GetValues(typeof(ClassType));
		for (int i = 0; i < classCards.Count; i++)
		{
			bool flag = array[i] == type;
			((Graphic)classCards[i].GetComponent<Image>()).color = (flag ? BG_SELECTED : BG_CARD);
			Transform val2 = classCards[i].transform.Find("ColorBar");
			if ((Object)(object)val2 != (Object)null)
			{
				((Graphic)((Component)val2).GetComponent<Image>()).color = (flag ? @class.PrimaryColor : ClassManager.GetClass(array[i]).PrimaryColor);
			}
		}
		MusicManager.PlayClassMusic(type);
	}

	private void UpdateStatBars(ClassData cd)
	{
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: Unknown result type (might be due to invalid