示例#1
0
    /// <summary>
    /// Builds the deck for the current game.
    /// </summary>
    void Build()
    {
        TextAsset deckFile = Resources.Load <TextAsset>("Decks/" + deckId);

        DeckData deckData = JsonUtility.FromJson <DeckData>(deckFile.text);

        cards = new Stack <Card>();

        for (int i = 0; i < deckData.cardStacks.Count; i++)
        {
            CardStack stack = deckData.cardStacks[i];

            CardData data;
            if (!CardsDatabase.GetById(stack.id, out data))
            {
                continue;
            }

            for (int j = 0; j < stack.ammount; j++)
            {
                // N copies of the same card
                cards.Push(new Card(data));
            }
        }

        Shuffle();
    }
示例#2
0
    /// <summary>
    ///
    /// Initialise the upgrade UI when it is opened
    ///
    /// </summary>
    public void InitUpgradeUI()
    {
        if (deckListUI != null && campaignManagerUI != null)
        {
            throw new Exception("UI not initialised properly");
        }

        upgradesToAdd = new List <UpgradeData>();
        //Gets the deck currently being edited it and copies it to a new instance of the deck
        if (deckListUI != null)
        {
            selectedDeck = GameManager.instance.deckManager.GetPlayerDeck(deckListUI.DeckEditId.Value);
            honourPointsArea.SetActive(false);
        }
        else if (campaignManagerUI != null)
        {
            selectedDeck = GameManager.instance.deckManager.GetPlayerDeck(campaignManagerUI.loadedDeck.Id.Value);
            honourPointsArea.SetActive(true);
            upgradeCostTracker = new Dictionary <UpgradeData, int>();
            RefreshHonourPoints();
        }

        newDeck = new DeckData(selectedDeck);

        //Refreshes the available upgrades section
        RefreshAvailableUpgrades();
        //Refreshes the upgrade to add area with an empty list
        RefreshUpgradeList(upgradesToAddArea);

        //Refresh the selected upgrade with empty fields
        RefreshSelectedUpgrade();
    }
示例#3
0
 public static void LoadPlayer(PlayerData data, PlayerController player)
 {
     player.transform.position   = data.Position;
     player.CurrentSpirit        = data.CurrentSpirit;
     player.maxSpirit            = data.MaxSpirit;
     player.spiritCostPerDiscard = data.SpiritCostPerDiscard;
     player.Health            = data.Health;
     player.maxHealth         = data.MaxHealth;
     player.Money             = data.Money;
     player.cardRedrawAmount  = data.CardRedrawAmount;
     player.maxHandSize       = data.MaxHandSize;
     player.maxTurnsUntilDraw = data.MaxTurnsUntilDraw;
     player.turnsUntilDraw    = data.TurnsUntilDraw;
     player.CurrentEnergy     = data.CurrentEnergy;
     player.energyPerTurn     = data.EnergyPerTurn;
     player.xPos = data.xPos;
     player.zPos = data.zPos;
     player.UpdateLOS();
     BattleManager.player.playerDeck = DeckData.LoadDeck(data.Deck);
     foreach (var card in player.playerDeck.hand)
     {
         player.puim.SpawnCardInHand(card);
     }
     foreach (var card in player.playerDeck.inventoryCards)
     {
         player.puim.CardAddedToInventory(card);
     }
 }
示例#4
0
    public Deck[] decks;//list of decks

    private void Awake()
    {
        //makes it so that there is only one instance of the deckManager object at all times
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(this.gameObject);
        }
        else if (this != Instance)
        {
            Destroy(this.gameObject);
        }

        //loads all of the decks as soon as this script is first used
        for (int i = 0; i < 5; i++)
        {
            DeckData data = SaveSystem.LoadDeck(i + 1);
            if (data != null)
            {
                decks[i].name = data.deckName;//loads the name of the deck

                var allCards = GetComponent <CardList>().cards;
                for (int j = 0; j < 30; j++)
                {
                    for (int k = 0; k < 10; k++)
                    {
                        if (data.cards[j] == allCards[k].name)
                        {
                            decks[i].cards[j] = allCards[k];
                        }
                    }
                }
            }
        }
    }
示例#5
0
    public void SetControlledDeck(DeckData deckData = null)
    {
        if (deckData == null)
        {
            ControlledDeckData = new DeckData();
            UserData.Instance.OwnedDeckList.Add(ControlledDeckData);
            DeckNameText.text      = ControlledDeckData.DeckName;
            DeckCardCountText.text = ControlledDeckData.CardCount + "/30";
        }
        else
        {
            ControlledDeckData     = deckData;
            DeckNameText.text      = ControlledDeckData.DeckName;
            DeckCardCountText.text = ControlledDeckData.CardCount + "/30";
        }

        if (DisplayDeckElementList != null)
        {
            foreach (var element in DisplayDeckElementList)
            {
                if (element != null)
                {
                    Destroy(element.gameObject);
                }
            }

            DisplayDeckElementList.Clear();
        }

        SettingDisplayElement();
    }
示例#6
0
    public void ActiveMainUI()
    {
        //덱 세팅
        var deckDataDic = DeckManager.Instance.DeckDic;

        for (int i = 0; i < mainSlotUIArray.Length; i++)
        {
            DeckData deckData = null;
            if (deckDataDic.ContainsKey(i))
            {
                deckData = deckDataDic[i];
            }

            //데이터가 없다면 비어있는 덱
            mainSlotUIArray[i].Init(i, deckData, ClickDeckSlot);
        }

        //사용중인 덱 선택
        if (curSelectedMainSlot == null)
        {
            int index = DeckManager.Instance.CurDeckIndex;
            curSelectedMainSlot = mainSlotUIArray.ElementAtOrDefault(index);
        }
        curSelectedMainSlot?.ClickSlot();

        //각 UI 루트 활성화/비활성화
        mainRoot.SetActive(true);
        deckEditRoot.SetActive(false);
        SlotEditRoot.SetActive(false);

        deckEditNameInput.value = string.Empty;
    }
示例#7
0
    /// <summary>
    ///
    /// Create a new player deck
    ///
    /// </summary>
    public DeckData CreatePlayerDeck(DeckData deckTemplate, string deckName, int?campaignId = null)
    {
        //Generate the ID of the deck. Takes the last deck id in the list and adds one to it
        var newId = 0;

        if (PlayerDeckList.Count > 0)
        {
            newId = PlayerDeckList.LastOrDefault().Id.Value + 1;
        }

        //Adds the deck to the list
        var newDeck = new DeckData(deckTemplate)
        {
            Id   = newId,
            Name = deckName,
        };

        PlayerDeckList.Add(newDeck);

        if (campaignId.HasValue)
        {
            newDeck.CampaignTracker = new CampaignProgression(newDeck.Id.Value, campaignId.Value);
        }

        //Save decks to file
        SaveDecks();

        return(newDeck);
    }
示例#8
0
 public void DeckCombo()
 {
     comboImage.color = Color.gray;
     buffImage.color  = Color.white;
     deckToEnemy      = deckBuff;
     DeckSelected(deckCombo);
 }
示例#9
0
    public void SetAllDeck()
    {
        UnitData[] _dataTemp = new UnitData[_deckKind.Length];

        int _allDeckCount = 0;

        for (int i = 0; i < _dataTemp.Length; i++)
        {
            _dataTemp[i] = DataManager.Instance.GetUnitDataWithUnitName(_deckKind[i]);

            _allDeckCount += _dataTemp[i].MaxReinforce;
        }
        _allDeck = new DeckData[_allDeckCount];

        int _choiceDeckIndex = 0;

        //덱 종류만큼 실행
        for (int i = 0; i < _dataTemp.Length; i++)
        {
            //한 종류의 최대 강화개수만큼 실행
            for (int j = 0; j < _dataTemp[i].MaxReinforce; j++)
            {
                _allDeck[_choiceDeckIndex] = new DeckData()
                {
                    _unit = _dataTemp[i]
                };
                _choiceDeckIndex++;
            }
        }
    }
    //When this method's called, Server has just sent the deck information
    //needed to instantiate cards, so we instantiate cards
    public void setDeck(DeckData deckData)
    {
        this.deckData = deckData;

        //Takes the deck data and instatiates card GameObjects with AbstractCard scripts
        createDeck();
    }
示例#11
0
    /// <summary>
    ///
    /// Function call for selecing a deck for the player to play
    ///
    /// </summary>
    public bool SelectDeck(DeckData deckData)
    {
        //Return the selected deck to the lobby UI
        if (lobbyUI.SelectDeck(playerId, deckData))
        {
            //Sets the properties of the deck currently being edited
            SelectedDeckId = deckData.Id;

            //Locks the deck scrolling
            listScrollArea.vertical = false;

            //Hides all deck objects in the deck list except the one being edited
            for (int deckIndex = 0; deckIndex < deckListObjects.Count; deckIndex++)
            {
                if (deckListObjects[deckIndex].GetComponent <DeckListObject>().deckData.Id != SelectedDeckId)
                {
                    deckListObjects[deckIndex].SetActive(false);
                }
            }

            return(true);
        }
        else
        {
            return(false);
        }
    }
示例#12
0
 public void DeckBuffs()
 {
     buffImage.color  = Color.gray;
     comboImage.color = Color.white;
     deckToEnemy      = deckCombo;
     DeckSelected(deckBuff);
 }
示例#13
0
        public void Init()
        {
            Entity.Create(new Transform2(new Size2(1920, 1080)))
            .Add(new Sprite("Images/Table/casino-felt"));

            var deckData = DeckData.LoadFromDir("Content/Decks/Poker");
            var cards    = new Items(deckData.GetAllCards().Select(x => Create(new Card(x))));

            var deck = new Deck(cards);

            Entity.Create(new Transform2(new Vector2(200, 200), Sizes.Card))
            .Add(cards)
            .Add(deck.Sprite)
            .Add(new ZGravity())
            .Add(x => new MouseDropTarget {
                OnDrop = o => deck.PutFacedownOnTop(o)
            })
            .Add(x => new MouseStateActions
            {
                OnPressed = () => deck.If(deck.Count > 0, () =>
                {
                    var drawnCard = deck.Draw();
                    drawnCard.Transform.Location = x.Transform.Location;
                })
            });
        }
示例#14
0
        protected virtual void OnDeckDataChangedEvent(DataChangedEventArgs e)
        {
            DeckData = e.Data;
            NavalFleet.Clear();
            for (int i = 0; i < DeckData.Count(); i++)
            {
                for (int j = 0; j < DeckData[i]["api_ship"].Count(); j++)
                {
                    string key = DeckData[i]["api_ship"][j].ToString();
                    if (ShipDataMap.ContainsKey(key))
                    {
                        NavalFleet[key] = (i + 1) + "-" + (j + 1);
                        JObject jo = ShipDataMap[key] as JObject;
                        if (jo["fleet_info"] == null)
                        {
                            jo.Add("fleet_info", (i + 1) + "-" + (j + 1));
                        }
                    }
                }
            }
            DeckDataChangedEventHandler handler = DeckDataChanged;

            if (handler != null)
            {
                handler(this, e);
            }
        }
示例#15
0
    public void Start()
    {
        tempDeckData       = null;
        isInitEditSlotList = false;

        ActiveMainUI();
    }
示例#16
0
    /// <summary>
    ///
    /// Function call for the deck lists when a deck is selected from the list
    ///
    /// </summary>
    public bool SelectDeck(int playerId, DeckData deck)
    {
        if (!playerDecks.Contains(deck))
        {
            //Assigned the deck to the required player deck
            playerDecks[playerId] = deck;

            //If all required decks are selected (i.e. not null), then can begin playing the game (there is no way for a map to not be selected)
            playButton.interactable = true;
            foreach (var deckCheck in playerDecks)
            {
                if (deckCheck == null)
                {
                    playButton.interactable = false;
                    break;
                }
            }

            return(true);
        }
        else
        {
            playerDecks[playerId] = null;
            return(false);
        }
    }
示例#17
0
    // Get deck for player1 -- player2 only if Single player
    public void ProcessGetDeck(NetworkResponse response)
    {
        ResponseGetDeck args      = response as ResponseGetDeck;
        int             numFields = args.numFields;
        int             numCards  = args.numCards;
        DeckData        deck      = args.deck;

        //CardData card = deck.popCard();

        GameManager.player1.setDeck(deck);
        GameManager.player1.dealCard(3);
        // Don't allow player1 to move cards until they hasDeck
        GameManager.player1.hasDeck = true;

        // Only deal cards for opponent if
        if (Constants.SINGLE_PLAYER)
        {
            Debug.Log("Deal player2 Cards");
            GameManager.player2.setDeck(deck);
            GameManager.player2.dealCard(3);
        }

        Debug.Log("Protocols Deck Response: deck count: " + deck.getSize() +
                  " numCards: " + numCards + " num fields: " + numFields);
        //Debug.Log ("Card data: cardID: " + card.cardID + " diet Type: " +
        //          card.dietType + " SpeciesName: " + card.speciesName);
    }
示例#18
0
    public void SaveDeck()
    {
        if (String.IsNullOrEmpty(deckInProgress.deckName))
        {
            Debug.LogError("You must name your Grimoire");
            return;
        }

        BinaryFormatter bf   = new BinaryFormatter();
        FileStream      file = File.Create(Application.persistentDataPath + "/" + deckInProgress.deckName + ".dat");

        DeckData data = new DeckData();

        List <int> listToSave = new List <int>();

        for (int i = 0; i < deckInProgress.savedDecklist.Count; i++)
        {
            //Debug.Log(deckInProgress[i] + " is an id being copied to SAVE");
            listToSave.Add(deckInProgress.savedDecklist[i]);
        }

        data.savedDecklist = listToSave;
        data.deckName      = deckNameText.text;

        bf.Serialize(file, data);
        file.Close();


        if (!savedDecks.Contains(deckNameText.text))
        {
            savedDecks.Add(deckNameText.text);
            SaveLibraryList();
        }
    }
示例#19
0
    public override string ToString()
    {
        DeckData data = new DeckData(name, character, cards);
        var      str  = JsonUtility.ToJson(data, false);

        return(str);
    }
示例#20
0
        public IActionResult OnPostDeck([FromBody] DeckData deck)
        {
            var theDeck = deck.ToDeck();

            theDeck.Owner = SignedInUser;
            _deckStore.Save(theDeck);
            return(new JsonResult(DeckData.FromDeck(theDeck)));
        }
示例#21
0
 private void Start()
 {
     currentDeck = LocalStorage.GetData <DeckData> (storageKey);
     if (currentDeck == null)
     {
         currentDeck = DeckData.BuildEmpty();
     }
 }
示例#22
0
 public DeckManager(DeckData deckData)
 {
     _deckData = deckData;
     for (int i = 0; i < _deckData.cards.Count; i++)
     {
         _availableCardsIdList.Add(i);
     }
 }
示例#23
0
    /// <summary>
    ///
    /// Creates an upgrade card on a canvas
    ///
    /// </summary>
    public GameObject CreateUpgrade(UpgradeData upgrade, Transform parent, DeckData currentDeck = null, float scaling = defaultUpgradeScaling)
    {
        var createdUpgrade = Instantiate(upgradeObject, parent);

        createdUpgrade.transform.localScale = new Vector3(scaling, scaling, 1.0f);
        createdUpgrade.GetComponent <UpgradeDisplay>().InitDisplay(upgrade, currentDeck);
        return(createdUpgrade);
    }
 public static DeckController GetInstance()
 {
     if (instance == null)
     {
         deckData = DeckData.GetInstance();
     }
     return(instance);
 }
示例#25
0
 public static DeckData GetInstance()
 {
     if (instance == null)
     {
         instance = new DeckData();
     }
     return(instance);
 }
示例#26
0
 public PlayerData(int index, int order, Team team, DeckData deckData)
 {
     this.index        = index;
     this.order        = order;
     this.team         = team;
     this.deckData     = deckData;
     this.UseIndexList = new List <int>();
 }
示例#27
0
 /// <summary>
 ///
 /// Refreshes the deck details of the object
 ///
 /// </summary>
 public void RefreshDeckDetails(DeckData deckData)
 {
     deckCardList.RefreshCardList(deckData, deckListUI);
     foreach (var deckResourceObject in deckResourceObjects)
     {
         deckResourceObject.RefreshResourceProperties();
     }
 }
示例#28
0
 public void PopulateDeck(DeckData deck)
 {
     /*
      * foreach(var card in deck.CardList)
      * {
      *  // Do something to select the cards.
      * }
      */
 }
示例#29
0
    public void SetUnitData(DeckData _deckDa, EnumInfo.TeamType _team)
    {
        _spawnTeam = _team;

        _deckData = _deckDa;

        _unitIdxText.text      = _deckDa._unit.UnitName;
        _maxReinforceText.text = string.Format("최대 강화 [{0}]", _deckDa._unit.MaxReinforce);
    }
示例#30
0
 /// <summary>
 ///
 /// Adds the hero card to the card list
 ///
 /// </summary>
 private void AddHeroCard(DeckData deckData)
 {
     if (deckData.HeroCard != null)
     {
         var heroCardObject = Instantiate(cardTemplate, cardListArea.transform);
         heroCardObject.GetComponent <DeckCardObject>().InitCardObject(deckData.HeroCard, 1, this.deckData.Id, deckListUI);
         heroCardObject.name = $"Card- {deckData.HeroCard.Name}";
     }
 }
        /// <summary>
        /// Gets the opponents DeckArchtype based on a calculated guess.
        /// </summary>
        /// <param name="opponentClass"></param>
        /// <returns></returns>
        private DeckData GetEnemyDeckDataForClass(CClass opponentClass)
        {
            if (_deckData == null)
            {
                var playerHistory = GetOpponentHistoryWithClass(opponentClass).FirstOrDefault();

                if (playerHistory != null)
                {
                    _deckData = new DeckData
                    {
                        Cards = playerHistory.Cards
                    };

                    switch (opponentClass)
                    {
                        case CClass.WARRIOR:
                            {
                                // Temporary for testing
                                if (_deckData.Cards.Any(c =>
                                    c == "BRM_019" || // Patron
                                    c == "EX1_392" || // Battle rage
                                    c == "EX1_084")) // Warsong Commander
                                {
                                    _deckData.SubType = SubType.PatronWarrior;
                                    _deckData.ArchType = DeckArchtype.Combo;
                                }
                                else if (_deckData.Cards.Any(c =>
                                    c == "GVG_082" || // Clockwork Gnome
                                    c == "GVG_013" || // Cogmaster
                                    c == "GVG_085" || // Annoy-o-Tron
                                    c == "GVG_006")) // Mechwarper
                                {
                                    _deckData.SubType = SubType.MechWarrior;
                                    _deckData.ArchType = DeckArchtype.Aggro;
                                }
                                else if (_deckData.Cards.Any(c =>
                                  c == "AT_071" || // Alexstrasza's Champion
                                  c == "AT_017" || // Twilight Guardian
                                  c == "BRM_033" || // Blackwing Technician
                                  c == "BRM_034")) // Blackwing Corruptor
                                {
                                    _deckData.SubType = SubType.DragonWarrior;
                                    _deckData.ArchType = DeckArchtype.Midrange;
                                }
                                else
                                {
                                    // Else it's most likely Control Warrior
                                    _deckData.SubType = SubType.ControlWarrior;
                                    _deckData.ArchType = DeckArchtype.Control;
                                }
                                break;
                            }
                        case CClass.ROGUE:
                            {
                                if (_deckData.Cards.Any(c =>
                                    c == "GVG_022")) // Tinker's Sharpsword Oil
                                {
                                    _deckData.SubType = SubType.OilRogue;
                                    _deckData.ArchType = DeckArchtype.Combo; // Combo?
                                }

                                // Else we don't know, not that many rogues around these days

                                break;
                            }
                        case CClass.PALADIN:
                            {
                                if (_deckData.Cards.Any(c =>
                                  c == "AT_079")) // Mysterious Challenger
                                {
                                    _deckData.SubType = SubType.SecretPaladin;
                                    _deckData.ArchType = DeckArchtype.Aggro;
                                }
                                // Need more here
                                break;
                            }
                        case CClass.DRUID:
                            {
                                if (_deckData.Cards.Any(c =>
                                 c == "NEW1_026" || // Violet Teacher
                                 c == "EX1_160")) // Power of the Wild
                                {
                                    _deckData.SubType = SubType.TokenDruid;
                                    _deckData.ArchType = DeckArchtype.Combo;
                                }
                                else if (_deckData.Cards.Any(c =>
                                    c == "EX1_178")) // Ancient of War
                                {
                                    _deckData.SubType = SubType.RampDruid;
                                    _deckData.ArchType = DeckArchtype.Control;
                                }
                                else
                                {
                                    // Else it's most likely Mid Range Druid
                                    _deckData.SubType = SubType.MidRangeDruid;
                                    _deckData.ArchType = DeckArchtype.Midrange;
                                }
                                break;
                            }
                        case CClass.PRIEST:
                            {
                                if (_deckData.Cards.Any(c =>
                                    c == "AT_017" || // Twilight Guardian
                                    c == "BRM_033" || // Blackwing Technician
                                    c == "BRM_004" || // Twilight Whelp
                                    c == "AT_116" || // Wyrmrest Agent
                                    c == "BRM_034")) // Blackwing Corruptor
                                {
                                    _deckData.SubType = SubType.DragonPriest;
                                    _deckData.ArchType = DeckArchtype.Tempo;
                                }
                                else
                                {
                                    // Else it is most likely Control priest
                                    _deckData.SubType = SubType.ControlPriest;
                                    _deckData.ArchType = DeckArchtype.Control;
                                }
                                break;
                            }
                        case CClass.MAGE:
                            {
                                if (_deckData.Cards.Any(c =>
                                   c == "GVG_005" || // Echo of Medivh
                                   c == "EX1_620")) // Molten Giant
                                {
                                    _deckData.SubType = SubType.EchoMage;
                                    _deckData.ArchType = DeckArchtype.Control;
                                }
                                else if (_deckData.Cards.Any(c =>
                                   c == "GVG_003" || // Unstable Portal
                                   c == "BRM_002")) // Flame Walker
                                {
                                    _deckData.SubType = SubType.TempoMage;
                                    _deckData.ArchType = DeckArchtype.Tempo;
                                }
                                else if (_deckData.Cards.Any(c =>
                                   c == "EX1_295")) // Ice block
                                {
                                    _deckData.SubType = SubType.FreezeMage;
                                    _deckData.ArchType = DeckArchtype.Control;
                                }
                                else if (_deckData.Cards.Any(c =>
                                    c == "GVG_082" || // Clockwork Gnome
                                    c == "GVG_013" || // Cogmaster
                                    c == "GVG_085" || // Annoy-o-Tron
                                    c == "GVG_006")) // Mechwarper
                                {
                                    _deckData.SubType = SubType.MechMage;
                                    _deckData.ArchType = DeckArchtype.Aggro;
                                }
                                break;
                            }
                        case CClass.WARLOCK:
                            {
                                if (_deckData.Cards.Any(c =>
                                        (c == "GVG_021" ||// Mal'Ganis OR
                                         c == "FP1_022") && // Void Caller With one the following:
                                        (c == "EX1_043" || // Twilight Drake
                                        c == "EX1_620" || // Molten Giant
                                        c == "EX1_105"))) // Mountain Giant
                                {
                                    _deckData.SubType = SubType.DemonHandlock;
                                    _deckData.ArchType = DeckArchtype.Control;
                                }
                                else if (_deckData.Cards.Any(c =>
                                      c == "AT_017" || // Twilight Guardian
                                      c == "BRM_033" || // Blackwing Technician
                                      c == "BRM_034")) // Blackwing Corruptor
                                {
                                    _deckData.SubType = SubType.DragonHandlock;
                                    _deckData.ArchType = DeckArchtype.Control;
                                }
                                else if (_deckData.Cards.Any(c =>
                                      c == "EX1_043" || // Twilight Drake
                                      c == "EX1_620" || // Molten Giant
                                      c == "EX1_105")) // Mountain Giant
                                {
                                    _deckData.SubType = SubType.Handlock;
                                    _deckData.ArchType = DeckArchtype.Control;
                                }
                                else if (_deckData.Cards.Any(c =>
                                      c == "GVG_021" || // Mal'Ganis
                                      c == "EX1_620" || // Molten Giant
                                      c == "EX1_105")) // Mountain Giant
                                {
                                    _deckData.SubType = SubType.DemonZooWarlock;
                                    _deckData.ArchType = DeckArchtype.Aggro;
                                }
                                else
                                {
                                    // Else it's very likely to be zoolock
                                    _deckData.SubType = SubType.Zoolock;
                                    _deckData.ArchType = DeckArchtype.Aggro;
                                }
                                break;
                            }
                        case CClass.HUNTER:
                        {
                            if (_deckData.Cards.Any(c =>
                                     c == "GVG_043" || // Glaivezooka
                                     c == "CS2_188" || // Abusive Sergeant
                                     c == "EX1_089" || // Arcane Golem
                                     c == "EX1_029")) // Leper Gnome
                            {
                                _deckData.SubType = SubType.FaceHunter;
                                _deckData.ArchType = DeckArchtype.Aggro;
                            }
                            if (_deckData.Cards.Any(c =>
                                      c == "EX1_534" || // Savannah Highmane
                                      c == "EX1_620" || // Molten Giant
                                      c == "EX1_105")) // Mountain Giant
                            {
                                _deckData.SubType = SubType.MidRangeHunter;
                                _deckData.ArchType = DeckArchtype.Midrange;
                            }
                            break;
                        }
                        case CClass.SHAMAN:
                        {
                            if (_deckData.Cards.Any(c =>
                                    c == "AT_046" || // Tuskarr Totemic
                                    c == "AT_049")) // //Thunder Bluff Valiant
                            {
                                _deckData.SubType = SubType.TotemShaman;
                                _deckData.ArchType = DeckArchtype.Midrange;
                            }
                            else if (_deckData.Cards.Any(c =>
                                   c == "GVG_082" || // Clockwork Gnome
                                   c == "GVG_013" || // Cogmaster
                                   c == "GVG_085" || // Annoy-o-Tron
                                   c == "GVG_006")) // Mechwarper
                            {
                                _deckData.SubType = SubType.MechShaman;
                                _deckData.ArchType = DeckArchtype.Aggro;
                            }
                            if (_deckData.Cards.Any(c =>
                                c == "AT_017" || // Twilight Guardian
                                c == "BRM_033" || // Blackwing Technician
                                c == "BRM_034")) // Blackwing Corruptor
                            {
                                _deckData.SubType = SubType.DragonShaman;
                                _deckData.ArchType = DeckArchtype.Midrange;
                            }
                            else
                            {
                                // It's a random Control shaman
                                _deckData.SubType = SubType.ControlShaman;
                                _deckData.ArchType = DeckArchtype.Control;
                            }
                            break;
                        }
                    }
                }

                // If it's still null, it's unknown
                if (_deckData == null)
                {
                    _deckData = new DeckData
                    {
                        ArchType = DeckArchtype.Unknown,
                        SubType = SubType.Unknown,
                        Cards = new List<string>()
                    };
                }
                else
                {
                    // Save stats to database
                    SharedDataMgr.AddRow("OpponentDeckHits", new string[]
                    {
                        Bot.GetCurrentOpponentId().ToString(CultureInfo.InvariantCulture),
                        opponentClass.ToString(),
                        DateTime.Now.ToString("g"),
                        string.Join(",", _deckData.Cards),
                        _deckData.ArchType.ToString(),
                        _deckData.SubType.ToString()
                    });
                }
            }

            Bot.Log("[OpponentDeck] SubType: " + _deckData.SubType);
            Bot.Log("[OpponentDeck] Archtype: " + _deckData.ArchType);
            Bot.Log("[OpponentDeck] DeckList: " + string.Join(", ", _deckData.Cards));

            return _deckData;
        }
        public override List<Card> HandleMulligan(List<Card> Choices, CClass opponentClass, CClass ownClass)
        {
            // Don't delete this
            _deckData = null;
            _playerHistories = null;
            _messageReceived = new AutoResetEvent(false);

            // For testing (replace this and everything below with your stuff)
            var deckData = GetEnemyDeckDataForClass(opponentClass);

            return Choices;
        }