Example #1
0
    public void GivePlayerACard(CardAsset cardAsset, int UniqueID)
    {
        GameObject card = CreateACardAtPosition(cardAsset, slots.Children[0].transform.localPosition);

        foreach (Transform transform in card.GetComponentsInChildren <Transform>())
        {
            transform.tag = owner.ToString() + "Card";
        }
        AddCard(card);

        WhereIsCard whereIsCard = card.GetComponent <WhereIsCard>();

        IDHolder id = card.AddComponent <IDHolder>();

        id.UniqueID = UniqueID;

        Sequence sequence = DOTween.Sequence();

        sequence.Append(card.transform.DOLocalMove(slots.Children[0].transform.localPosition, 0));
        if (TakeCardsOpenly)
        {
            sequence.Insert(0f, card.transform.DORotate(Vector3.zero, 0));
        }

        sequence.OnComplete(() => ChangeLastCardStatusToInHand(card, whereIsCard));
    }
Example #2
0
    // method to add a card to the table
    public void AddCard(CardAsset cardAsset, Vector3 handPosition, int monsterIndex)
    {
        // create a new card from prefab
        GameObject card;

        card = GameObject.Instantiate(GameStateSync.Instance.SkillCardPrefab, handPosition, Quaternion.Euler(new Vector3(0f, -179f, 0f))) as GameObject;

        // apply the look of the card based on the info from CardAsset
        SkillCardManager manager = card.GetComponent <SkillCardManager>();

        manager.cardAsset = cardAsset;
        manager.ReadCardFromAsset();

        // parent this card to our open slot
        Transform openSlot = FindOpenSlot(monsterIndex);

        card.transform.SetParent(openSlot);

        // Bring card to front while it travels from draw spot to hand
        WhereIsTheCardOrMonster w = card.GetComponent <WhereIsTheCardOrMonster>();

        w.SendToBack();
        w.Slot = monsterIndex;

        // move card to the hand;
        Sequence s = DOTween.Sequence();

        s.Insert(0f, card.transform.DORotate(Vector3.zero, GameStateSync.Instance.CardTransitionTime));
        s.Append(card.transform.DOMove(openSlot.position, GameStateSync.Instance.CardTransitionTime));

        s.OnComplete(() => Command.CommandExecutionComplete());
    }
Example #3
0
    GameObject CreateACardAtPosition(CardAsset c, Vector3 position, Vector3 eulerAngles)
    {
        GameObject card;

        if (c.MaxHealth > 0)
        {
            card = GameObject.Instantiate(GlobalSettings.Instance.CreatureCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
        }
        else
        {
            if (c.Targets == TargetingOptions.NoTarget)
            {
                card = GameObject.Instantiate(GlobalSettings.Instance.NoTargetSpellCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
            }
            else
            {
                card = GameObject.Instantiate(GlobalSettings.Instance.TargetedSpellCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
                // передает список допустимых целей скрипту, отвечающему за проверку корректности цели
                DragSpellOnTarget dragSpell = card.GetComponentInChildren <DragSpellOnTarget>();
                dragSpell.Targets = c.Targets;
            }
        }

        OneCardManager manager = card.GetComponent <OneCardManager>();

        manager.cardAsset = c;
        manager.ReadCardFromAsset();

        return(card);
    }
    void InstantiateGameObject(CardAsset c)
    {
        cardSelectionPrefab.GetComponent <OneCardManager>().cardAsset = c;
        GameObject inHand = Instantiate(cardSelectionPrefab, transform.position, Quaternion.identity) as GameObject;

        SetSpace(inHand);
    }
 public void ApplyAsset(CardAsset ca, int quantity)
 {
     Asset         = ca;
     NameText.text = ca.ScriptName;
     ManaCost.text = ca.ManaCost.ToString();
     SetQuantity(quantity);
 }
Example #6
0
    // CONSTRUCTOR
    public CardLogic(CardAsset ca)
    {
        // ustaw referencje CardAsset
        /// NA PRZYSZŁOŚć: this - odwołanie się klasy samej do siebie, Dlaczego tutaj tak? Bo parametrem funkcji jest ca więc odwołujemy się do niego
        this.ca = ca;

        //zdobądz unikalny int ID
        // Do UniqueCardID przypisujemy wynik pobrany z funkcji GetUniqueID, która znajduje się w klasie IDFactory
        UniqueCardID = IDFactory.GetUniqueID();
        //UniqueCardID = IDFactory.GetUniqueID();

        ResetManaCost(); // Wywołujemy funkcję ResetManaCost()

        //Tworzymy instancję SpellEffect z nazwą z CardAsset i dołączamy ją
        // Sprawdzamy czy zmienna SpellScriptName nie jest pusta i przechowuje jakąś nazwę skryptu
        if (ca.SpellScriptName != null && ca.SpellScriptName != "")
        {
            // Tworzymy instancję aktywatora (pobiera typ(nazwę skryptu czaru)) nadaje mu typ spelleffect
            /// NA przyszłosc: getType sprawdza również duże i małe litery
            effect = System.Activator.CreateInstance(System.Type.GetType(ca.SpellScriptName)) as SpellEffect;
        }
        //Dodaj tę kartę do magazynu z identyfikatorem jako klucz
        // Odwołuje się do tablicy CardsCreatedThisGame i dodaje kartę (add) z jej identyfikatorem i assetem, który przechowywany jest w ca (odwołanie this)
        CardsCreatedThisGame.Add(UniqueCardID, this);
    }
Example #7
0
    // Excès de rage
    public override void WhenACreatureIsPlayed()
    {
        CardAsset[] allCards = Resources.LoadAll <CardAsset>("");

        CardAsset creature = null;

        foreach (CardAsset a in allCards)
        {
            if (a.Nom == specialName)
            {
                creature = a;
                break;
            }
        }

        if (owner.table.CreaturesOnTable.Count == 7)
        {
            return;
        }

        CardLogic creatureCard = new CardLogic(creature);

        // add a creature to player`s table:
        owner.PlayACreatureFromHand(creatureCard, tablePos: 0, causeBattlecry: false);
    }
    void CreateNewCard()
    {
        CardAsset cardAsset = CreateCardAssets.CreateSignleCard(type, cardName);

        Selection.activeObject = cardAsset;
        ApplyValues(cardAsset);
    }
Example #9
0
    // gives player a new card from a given position
    public void GivePlayerACard(CardAsset c, int index, bool canSee)
    {
        GameObject card;

        card = CreateACardAtPosition(c, DeckTransform.position, new Vector3(0f, -179f, 0f));

        // pass this card to HandVisual class
        AddCard(card, index);

        // Bring card to front while it travels from draw spot to hand
        WhereIsTheCardOrMonster w = card.GetComponent <WhereIsTheCardOrMonster>();

        w.BringToFront();
        w.Slot = index;

        // move card to the hand;
        Sequence s = DOTween.Sequence();

        // displace the card so that we can select it in the scene easier.
        s.Append(card.transform.DOLocalMove(slots.Children[0].transform.localPosition, GameStateSync.Instance.CardTransitionTime));

        if (canSee)
        {
            //s.Append(card.transform.DOMove(DrawPreviewSpot.position, GameStateSync.Instance.CardTransitionTime));
            s.Insert(0f, card.transform.DORotate(Vector3.zero, GameStateSync.Instance.CardTransitionTime));
            //s.AppendInterval(GameStateSync.Instance.CardPreviewTime);
        }
        else
        {
            HoverPreview preview = card.GetComponent <HoverPreview>();
            Destroy(preview);
        }

        s.OnComplete(() => ChangeLastCardStatusToInHand(card, w));
    }
Example #10
0
    public void ShowCraftingScreen(CardAsset cardToShow)
    {
        currentCard = cardToShow;
        GameObject cardObject;

        if (currentCard.TypeOfCard == TypesOfCards.Creature)
        {
            cardObject = CreatureCard;
            CreatureCard.SetActive(true);
            SpellCard.SetActive(false);
        }
        else
        {
            cardObject = SpellCard;
            CreatureCard.SetActive(false);
            SpellCard.SetActive(true);
        }
        OneCardManager manager = cardObject.GetComponent <OneCardManager>();

        manager.CardAsset = cardToShow;
        manager.ReadCardFromAsset();

        CraftText.text      = "Craft this card for " + TradingCosts[cardToShow.Rarity].CraftCost + " dust";
        DisenchantText.text = "Disenchant to get " + TradingCosts[cardToShow.Rarity].DisenchantOutcome + " dust";

        ShopManager.Instance.DustHUD.SetActive(true);
        UpdateQuantityOfCurrentCard();
        Content.SetActive(true);
    }
Example #11
0
    public void ShowCardDetail(CardOutView vv)
    {
        Debug.Log(vv);
        int idx = view.CardsViewList.IndexOf(vv);

        if (idx == -1)
        {
            return;
        }

        CardInfo  info = model.NowCardInfos[idx];
        CardAsset ca   = pCardMgr.GetCardInfo(info.CardId);

        view.DetailDesp.text       = ca.CardDesp;
        view.DetailName.text       = ca.CardName;
        view.DetailEffectDesp.text = ca.CardEffectDesp;

        if (preCardView != null)
        {
            preCardView.Hint.gameObject.SetActive(false);
        }
        view.DetailPanel.gameObject.SetActive(true);
        vv.Hint.gameObject.SetActive(true);
        preCardView = vv;
    }
Example #12
0
    private void LoadCard()
    {
        List <CardInfo> infoList = mCardMdl.GetAllCards();

        state.CardDeck.Clear();
        foreach (CardInfo info in infoList)
        {
            string      eid  = info.CardId;
            CardAsset   ca   = mCardMdl.GetCardInfo(eid);
            CardInZhibo card = new CardInZhibo(eid, ca.UseTime);
            card.ca = ca;
            state.CardDeck.Add(card);
        }

        List <string> platformCards = pRoleMgr.GetNowPlatformInfo().PlatformCards;

        for (int i = 0; i < platformCards.Count; i++)
        {
            string      eid  = platformCards[i];
            CardAsset   ca   = mCardMdl.GetCardInfo(eid);
            CardInZhibo card = new CardInZhibo(eid, ca.UseTime);
            card.ca = ca;
            state.CardDeck.Add(card);
        }

        shuffle <CardInZhibo>(state.CardDeck);
    }
Example #13
0
    public void LoadFromNetworkPlayer(NetworkPlayer np)
    {
        this.np            = np;
        nickname           = np.nickname;
        nicknameField.text = nickname;

        avatarAsset         = np.avatar;
        avatarSprite.sprite = avatarAsset.AvatarImage;

        if (!np.cardsPlayed.Any() || np.cardsPlayed.Count < 2)
        {
            Debug.LogError("ERROR:  Loading PlayedItem.cs from Player who didn't play any cards.");
        }
        else
        {
            card1Asset = np.cardsPlayed[0].ca;
            card2Asset = np.cardsPlayed[1].ca;

            OneCardManager card1Manager = card1.GetComponent <OneCardManager>();
            card1Manager.cardAsset = card1Asset;
            card1Manager.ReadCardFromAsset();
            OneCardManager card2Manager = card2.GetComponent <OneCardManager>();
            card2Manager.cardAsset = card2Asset;
            card2Manager.ReadCardFromAsset();
        }
    }
Example #14
0
    //public int ID
    //{
    //    get{ return UniqueCardID; }
    //}

    public CardLogic(CardAsset ca)
    {
        this.ca = ca;
        //UniqueCardID = IDFactory.GetUniqueID();
        //UniqueCardID = IDFactory.GetUniqueID();
        //CardsCreatedThisGame.Add(UniqueCardID, this);
    }
Example #15
0
    public void AddCardAtIndex(CardAsset cardAsset, int UniqueID, int index)
    {
        GameObject card = Instantiate(ViewManager.Instance.cardOnBoardPrefab, slots.Children[index].transform.position, Quaternion.identity) as GameObject;

        CardOnBoardView cardView = card.GetComponent <CardOnBoardView>();

        cardView.cardAsset = cardAsset;
        cardView.displayCardOnBoardVisual();

        foreach (Transform transform in card.GetComponentsInChildren <Transform>())
        {
            transform.tag = owner.ToString() + "CardOnFrontRow";
        }

        card.transform.SetParent(slots.transform);

        cardsInRow.Insert(index, card);

        WhereIsCard whereIsCard = card.GetComponent <WhereIsCard>();

        whereIsCard.Slot        = index;
        whereIsCard.VisualState = VisualStates.LowBoardFrontRow;

        IDHolder id = card.AddComponent <IDHolder>();

        id.UniqueID = UniqueID;

        ShiftSlotsGameObjectAccordingToNumberOfCardsOnBoard();
        PlaceCardsOnNewSlots();

        Command.CommandExecutionComplete();
    }
Example #16
0
 public PlaySkillCardCommand(PlayerArea playerArea, CardAsset cardAsset, int handIndex, int monsterIndex)
 {
     this.playerArea   = playerArea;
     this.cardAsset    = cardAsset;
     this.handIndex    = handIndex;
     this.monsterIndex = monsterIndex;
 }
Example #17
0
    public override void StartCommandExecution()
    {
        base.StartCommandExecution();

        Deck deck = _player.deck;

        if (deck.cards.Count == 0)
        {
            if (_player.discard.cards.Count == 0)
            {
                _player.HasLost = true;
                Command.CommandQueue.Clear();
                (new ChangeStateCommand(GameState.GameOverPhase)).AddToQueue();
            }
            else
            {
                // TODO animate
                (new DrawCardCommand(ref _player)).InsertAtFront();
                (new MoveDiscardToDeckCommand(ref _player)).InsertAtFront();
            }
        }

        if (!_player.HasLost && deck.cards.Count > 0)
        {
            CardAsset drawnCard = deck.DrawCard();
            if (drawnCard != null)
            {
                _player.CardInPlay = drawnCard;
                GameManager.Instance.cardsAtStake.Add(_player.CardInPlay);
            }
        }

        Command.CommandExecutionComplete();
    }
Example #18
0
    // CARD DRAW METHODS

    // creates a card and returns a new card as a GameObject
    GameObject CreateACardAtPosition(CardAsset c, Vector3 position, Vector3 eulerAngles)
    {
        // Instantiate a card depending on its type
        GameObject card;

        if (c.VieMaximum > 0)
        {
            // this card is a creature card
            card = GameObject.Instantiate(GlobalSettings.Instance.CreatureCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
        }
        else
        {
            // this is a spell: checking for targeted or non-targeted spell
            if (c.Cible == TargetingOptions.NoTarget)
            {
                card = GameObject.Instantiate(GlobalSettings.Instance.NoTargetSpellCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
            }
            else
            {
                card = GameObject.Instantiate(GlobalSettings.Instance.TargetedSpellCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
                // pass targeting options to DraggingActions
                DragSpellOnTarget dragSpell = card.GetComponentInChildren <DragSpellOnTarget>();
                dragSpell.Targets = c.Cible;
            }
        }

        // apply the look of the card based on the info from CardAsset
        OneCardManager manager = card.GetComponent <OneCardManager>();

        manager.cardAsset = c;
        manager.ReadCardFromAsset();

        return(card);
    }
Example #19
0
    // method to create a new creature and add it to the table
    public void AddCreatureAtIndex(CardAsset ca, int UniqueID, int index)
    {
        GameObject creature = GameObject.Instantiate(GlobalSettings.Instance.CreaturePrefab, this.transform.position, Quaternion.identity) as GameObject;

        OneCreatureManager manager = creature.GetComponent <OneCreatureManager>();

        manager.cardAsset = ca;
        manager.LoadFromCardAsset();

        foreach (Transform t in creature.GetComponentsInChildren <Transform>())
        {
            t.tag = owner.ToString() + "Creature";
        }

        creature.transform.SetParent(this.transform);

        CreaturesOnTable.Insert(index, creature);

        IDHolder id = creature.AddComponent <IDHolder>();

        id.UniqueID = UniqueID;

        CalculateCardPositions();

        // end command execution
        Command.CommandExecutionComplete();
    }
Example #20
0
    GameObject CreateACardAtPosition(CardAsset cardAsset, Vector3 position, Vector3 eulerAngles)
    {
        GameObject card;

        if (cardAsset.IsCreatureCard)
        {
            card = GameObject.Instantiate(GlobalSettings.Instance.CreatureCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
        }
        else
        {
            if (cardAsset.Targets == TargetingOptions.NoTarget)
            {
                card = GameObject.Instantiate(GlobalSettings.Instance.NoTargetSpellCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
            }
            else
            {
                card = GameObject.Instantiate(GlobalSettings.Instance.TargetedSpellCardPrefab, position, Quaternion.Euler(eulerAngles)) as GameObject;
                // pass targeting options to DraggingActions
                DragSpellOnTarget dragSpell = card.GetComponentInChildren <DragSpellOnTarget>();
                dragSpell.Targets = cardAsset.Targets;
            }
        }

        // apply the look of the card based on the info from CardAsset
        OneCardManager manager = card.GetComponentInChildren <OneCardManager>();

        manager.cardAsset = cardAsset;
        manager.LoadFromCardAsset();

        return(card);
    }
    public override void ActivateEffect(int specialAmount = 0, string specialName = "", ICharacter target = null)
    {
        int compteur;

        for (compteur = 0; compteur < specialAmount; compteur++)
        {
            CardAsset[] allCards = Resources.LoadAll <CardAsset> ("");

            CardAsset creature = null;
            foreach (CardAsset a in allCards)
            {
                if (a.Nom == specialName)
                {
                    creature = a;
                    break;
                }
            }

            if (TurnManager.Instance.whoseTurn.table.CreaturesOnTable.Count == 7)
            {
                return;
            }

            CardLogic creatureCard = new CardLogic(creature);

            // add a creature to player`s table:
            TurnManager.Instance.whoseTurn.PlayACreatureFromHand(creatureCard, tablePos: 0, causeBattlecry: false);
        }
    }
Example #22
0
    private GameObject CardFromPack(RarityOptions rarity)
    {
        List <CardAsset> CardsOfThisRarity = CardCollection.Instance.GetCardsWithRarity(rarity);
        CardAsset        a = CardsOfThisRarity[Random.Range(0, CardsOfThisRarity.Count)];

        CardCollection.Instance.QuantityOfEachCard[a]++;

        GameObject card;

        if (a.TypeOfCard == TypesOfCards.Creature)
        {
            card = Instantiate(CreatureCardFromPackPrefab) as GameObject;
        }
        else
        {
            card = Instantiate(SpellCardFromPackPrefab) as GameObject;
        }

        card.transform.rotation = Quaternion.Euler(0f, 180f, 0f);
        OneCardManager manager = card.GetComponent <OneCardManager>();

        manager.CardAsset = a;
        manager.ReadCardFromAsset();
        return(card);
    }
    public override void Initialize(CardAsset cardAsset)
    {
        base.Initialize(cardAsset);

        revenue     = cardAsset.revenue;
        damageBoost = cardAsset.damageBoost;
    }
Example #24
0
 private void LoadCardEffect(CardAsset cardAsset)
 {
     if (!string.IsNullOrEmpty(cardAsset.SpellScriptName))
     {
         _effect = Activator.CreateInstance(Type.GetType(cardAsset.SpellScriptName)) as SpellEffect;
     }
 }
Example #25
0
 public DrawACardCommand(PlayerArea playerArea, CardAsset cardAsset, int handPos, bool canSee)
 {
     this.playerArea = playerArea;
     this.cardAsset  = cardAsset;
     this.handPos    = handPos;
     this.canSee     = canSee;
 }
Example #26
0
    public void ShowCraftingScreen(CardAsset cardToShow)
    {
        currentCard = cardToShow;

        // select type of card to show on this screen - creature or spell
        GameObject cardObject;

        if (currentCard.TypeOfCard == TypesOfCards.Creature)
        {
            cardObject = CreatureCard;
            CreatureCard.SetActive(true);
            SpellCard.SetActive(false);
        }
        else
        {
            cardObject = SpellCard;
            CreatureCard.SetActive(false);
            SpellCard.SetActive(true);
        }
        // change the look of the card to the card that we selected
        OneCardManager manager = cardObject.GetComponent <OneCardManager>();

        manager.cardAsset = cardToShow;
        manager.ReadCardFromAsset();

        // change the text on buttons
        CraftText.text      = "Craft this card for " + TradingCosts[cardToShow.Rarity].CraftCost.ToString() + " dust";
        DisenchantText.text = "Disenchant to get " + TradingCosts[cardToShow.Rarity].DisenchantOutcome.ToString() + " dust";

        ShopManager.Instance.DustHUD.SetActive(true);
        // make sure that correct amount of cards is shown
        UpdateQuantityOfCurrentCard();
        // show the content of this screen
        Content.SetActive(true);
    }
Example #27
0
    public CardInfo GainNewCard(string cid)
    {
        CardAsset aset = null;

        CardDict.TryGetValue(cid, out aset);
        if (aset == null)
        {
            aset = Load(cid);
        }
        if (aset != null)
        {
            aset.ReplaceWithAmountInEffect();
            CardInfo info = new CardInfo(InstId, cid, Time.realtimeSinceStartup);
            info.ca = aset;
            cards.Add(info);
            InstId += 1;

            if (aset.HasTurnEffect || aset.TurnEffects.Count > 0)
            {
                CardsWithTurnEffect.Add(info);
            }

            return(info);
        }
        return(null);
    }
    // Excès de rage
    public override void WhenACreatureIsPlayed()
    {
        List <CardAsset> allCreatureAssets = new List <CardAsset>();

        CardAsset[] allCards = Resources.LoadAll <CardAsset>("");
        // only select creatures
        foreach (CardAsset a in allCards)
        {
            if (a.VieMaximum > 0)
            {
                allCreatureAssets.Add(a);
            }
        }

        if (owner.table.CreaturesOnTable.Count == 7)
        {
            return;
        }
        // Select a random CardAsset:
        int       index = Random.Range(0, allCreatureAssets.Count);
        CardAsset randomCreatureAsset = allCreatureAssets[index];

        // make a CardLogic to call PlayACreatureFromHand():
        CardLogic creatureCard = new CardLogic(randomCreatureAsset);

        // add a creature to player`s table:
        owner.PlayACreatureFromHand(creatureCard, tablePos: 0, causeBattlecry: false);
        // or you can change it to: tablePos: 6 to place him on the other side.
    }
Example #29
0
    public void AddCard(CardAsset asset)
    {
        //if we are browsing the collection
        if (!InDeckBuildingMode)
        {
            return;
        }

        //if the deck is already full
        if (deckList.Count == AmountOfCardsInDeck)
        {
            return;
        }

        int count = NumberOfThisCardInDeck(asset);

        int limitOfThisCardInDeck = SameCardLimit;

        //if something else if specified in the CardAsset, we use that
        if (asset.OverrideLimitOfThisCardInDeck > 0)
        {
            limitOfThisCardInDeck = asset.OverrideLimitOfThisCardInDeck;
        }

        if (count < limitOfThisCardInDeck)
        {
            deckList.Add(asset);

            //added one to count if we are adding this card
            count++;

            //add to card count
            if (CardCount.Instance.count < 20)
            {
                CardCount.Instance.count++;
                //CardCount.Instance.SetCountText ();
            }
            //do all the graphical stuff
            if (ribbons.ContainsKey(asset))
            {
                //update quantity
                ribbons [asset].SetQuantity(count);
            }
            else
            {
                // add card's name to the list
                GameObject cardName = Instantiate(cardNamePrefab, content) as GameObject;
                cardName.transform.SetAsLastSibling();
                cardName.transform.localScale = Vector3.one;
                CardNameRibbon ribbon = cardName.GetComponent <CardNameRibbon> ();
                ribbon.ApplyAsset(asset, count);
                ribbons.Add(asset, ribbon);
            }
            if (CardCount.Instance.count <= 20)
            {
                CardCount.Instance.SetCountText();
            }
        }
    }
Example #30
0
    // gives player a new card from a given position
    public void GivePlayerACard(CardAsset cardAsset, int UniqueID, bool fast = false, bool fromDeck = true)
    {
        var lastCardPosition = GetLastCardPosition();
        var originPosition   = fromDeck ? DeckTransform.position : OtherCardDrawSourceTransform.position;

        var card = CreateACardAtPosition(cardAsset, originPosition, new Vector3(0f, -180f, 0f));

        foreach (Transform t in card.GetComponentsInChildren <Transform>())
        {
            t.tag = owner.ToString() + "Card";
        }

        AddCard(card);

        var whereIs = card.GetComponent <WhereIsTheCardOrCreature>();

        if (whereIs == null)
        {
            whereIs = card.GetComponentInChildren <WhereIsTheCardOrCreature>();
        }

        whereIs.BringToFront();
        whereIs.Slot        = 0;
        whereIs.VisualState = VisualStates.Transition;

        // pass a unique ID to this card.
        IDHolder id = card.AddComponent <IDHolder>();

        id.UniqueID = UniqueID;

        // move card to the hand;
        Sequence s = DOTween.Sequence();

        if (!fast)
        {
            s.Append(card.transform.DOMove(DrawPreviewSpot.position, GlobalSettings.Instance.CardTransitionTime));
            if (TakeCardsOpenly)
            {
                s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTime));
            }

            s.AppendInterval(GlobalSettings.Instance.CardPreviewTime);

            s.Append(card.transform.DOLocalMove(lastCardPosition, GlobalSettings.Instance.CardTransitionTime));
        }
        else
        {
            s.Append(card.transform.DOLocalMove(lastCardPosition, GlobalSettings.Instance.CardTransitionTimeFast));
            if (TakeCardsOpenly)
            {
                s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTimeFast));
            }
        }

        s.OnComplete(() => {
            ChangeLastCardStatusToInHand(card, whereIs);
            AdjustCardsInHand();
        });
    }