public override void OnStartDrag()
    {
        DebugManager.Instance.DebugMessage("Beginning to drag a spell.", DebugManager.MessageType.PlayerInteraction, gameObject);

        savedHandSlot = whereIsCard.Slot;

        whereIsCard.VisualState = VisualStates.Dragging;
        whereIsCard.BringToFront();

        int       ID = transform.GetComponent <IDHolder>().uniqueID;
        Player    p  = TurnManager.Instance.WhoseTurn;
        CardLogic cl = null;

        foreach (CardLogic c in p.hand.cardsInHand)
        {
            if (c.ID == ID)
            {
                cl = c;
            }
        }
        CardActionManager.Instance.HighlightValidTargets(TurnManager.Instance.WhoseTurn, cl);

        DebugManager.Instance.DebugMessage("Highlighting entire table.", DebugManager.MessageType.Targeting);
        CardActionManager.Instance.HighlightValidTargets(p, cl);
    }
 public override void OnStartDrag()
 {
     savedHandSlot           = whereIsCard.Slot;
     tempState               = whereIsCard.VisualState;
     whereIsCard.VisualState = VisualStates.Dragging;
     whereIsCard.BringToFront();
 }
Exemple #3
0
    public void TakeCardBackIntoHand(GameObject card)
    {
        foreach (Transform t in card.GetComponentsInChildren <Transform>())
        {
            t.tag = owner.ToString() + "Card";
        }
        // pass this card to HandVisual class
        AddCard(card);

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

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

        // Confirm that card already has ID
        IDHolder id = card.GetComponent <IDHolder>();

        Debug.Log("Picking up card with ID: " + id.UniqueID);

        Sequence s = DOTween.Sequence();

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

        s.OnComplete(() => ChangeLastCardStatusToInHand(card, w));
    }
Exemple #4
0
    public void PutACardOnTable(GameObject card, int UniqueID)
    {
        // Set a tag to reflect where this card is
        foreach (Transform t in card.GetComponentsInChildren <Transform>())
        {
            t.tag = owner.ToString() + "Card";
        }
        // pass this card to tableVisual class
        AddCard(card);

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

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


        // 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, GlobalSettings.Instance.CardTransitionTimeFast));
        s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTimeFast));

        s.OnComplete(() => ChangeLastCardStatusToOnTable(card, w));
    }
Exemple #5
0
    // gives player a new card from a given position
    public void GivePlayerACard(ScriptableObject c, int UniqueID, bool fast = false, bool fromDeck = true)
    {
        GameObject card;

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

        // Set a tag to reflect where this card is
        foreach (Transform t in card.GetComponentsInChildren <Transform>())
        {
            t.tag = owner.ToString() + "Card";
        }
        // pass this card to HandVisual class
        AddCard(card);

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

        w.BringToFront();
        w.Slot        = 0;
        w.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)
        {
            // Debug.Log ("Not fast!!!");
            s.Append(card.transform.DOMove(DrawPreviewSpot.position, GlobalSettings.Instance.CardTransitionTime));
            if (TakeCardsOpenly)
            {
                s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTime));
            }
            else
            {
                s.Insert(0f, card.transform.DORotate(new Vector3(0f, 179f, 0f), GlobalSettings.Instance.CardTransitionTime));
            }
            s.AppendInterval(GlobalSettings.Instance.CardPreviewTime);
            // displace the card so that we can select it in the scene easier.
            s.Append(card.transform.DOLocalMove(slots.Children[0].transform.localPosition, GlobalSettings.Instance.CardTransitionTime));
        }
        else
        {
            // displace the card so that we can select it in the scene easier.
            s.Append(card.transform.DOLocalMove(slots.Children[0].transform.localPosition, GlobalSettings.Instance.CardTransitionTimeFast));
            if (TakeCardsOpenly)
            {
                s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTimeFast));
            }
        }

        s.OnComplete(() => ChangeLastCardStatusToInHand(card, w));
    }
Exemple #6
0
    public override void OnStartDrag()
    {
        savedHandSlot = whereIsCard.Slot;

        whereIsCard.VisualState = VisualStates.Dragging;
        whereIsCard.BringToFront();
        initialPosition = transform.localPosition;
        initialRotation = transform.localRotation;
    }
    public override void OnStartDrag()
    {
        _initialVisualState   = whereIsCard.VisualState;
        _initialLocalPosition = this.transform.localPosition;
        _initialPosition      = this.transform.position;
        _initialRotation      = this.transform.rotation;

        this.transform.rotation = Quaternion.identity;
        whereIsCard.VisualState = VisualStates.Dragging;
        whereIsCard.BringToFront();
    }
    public override void OnStartDrag()
    {
        DebugManager.Instance.DebugMessage("Beginning to drag monster.", DebugManager.MessageType.PlayerInteraction, gameObject);
        savedHandSlot           = whereIsCard.Slot;
        tempState               = whereIsCard.VisualState;
        whereIsCard.VisualState = VisualStates.Dragging;
        whereIsCard.BringToFront();

        DebugManager.Instance.DebugMessage("Highlighting player's table", DebugManager.MessageType.Targeting);
        TurnManager.Instance.WhoseTurn.PArea.tableVisual.IsValidTarget = true;
    }
Exemple #9
0
    public void GetCardFromDeck(CardAsset ca, int cardID, bool fast)
    {
        GameObject card;
        Transform  DeckTransform = table.deckPosition;

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

        // Set a tag to reflect where this card is
        foreach (Transform t in card.GetComponentsInChildren <Transform>())
        {
            t.tag = owner.ToString() + "Card";
        }
        // pass this card to HandVisual class
        AddCard(card);

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

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

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

        id.UniqueID = cardID;

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

        if (!fast)
        {
            // Debug.Log ("Not fast!!!");
            s.Append(card.transform.DOLocalMove(gameObject.transform.localPosition, GlobalSettings.Instance.CardTransitionTime));
            s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTime));
        }
        else
        {
            // displace the card so that we can select it in the scene easier.
            s.Append(card.transform.DOLocalMove(gameObject.transform.localPosition, GlobalSettings.Instance.CardTransitionTimeFast));
            s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTimeFast));
        }

        s.OnComplete(() => ChangeLastCardStatusToInSlot(card, w));
    }
Exemple #10
0
    public void AttackTarget(int targetUniqueID, int damageTakenByTarget, int damageTakenByAttacker, int attackerHealthAfter, int targetHealthAfter)
    {
        Debug.Log(targetUniqueID);
        manager.CanAttackNow = false;
        GameObject target = IDHolder.GetGameObjectWithID(targetUniqueID);

        // bring this creature to front sorting-wise.
        w.BringToFront();
        VisualStates tempState = w.VisualState;

        w.VisualState = VisualStates.Transition;

        transform.DOMove(target.transform.position, 0.5f).SetLoops(2, LoopType.Yoyo).SetEase(Ease.InCubic).OnComplete(() =>
        {
            if (damageTakenByTarget > 0)
            {
                DamageEffect.CreateDamageEffect(target.transform.position, damageTakenByTarget);
            }
            if (damageTakenByAttacker > 0)
            {
                DamageEffect.CreateDamageEffect(transform.position, damageTakenByAttacker);
            }

            if (targetUniqueID == GlobalSettings.Instance.LowPlayer.PlayerID || targetUniqueID == GlobalSettings.Instance.TopPlayer.PlayerID)
            {
                // target is a player
                target.GetComponent <PlayerPortraitVisual>().HealthText.text = targetHealthAfter.ToString();
            }
            else
            {
                target.GetComponent <CreatureManager>().HealthText.text = targetHealthAfter.ToString();
            }

            w.SetTableSortingOrder();
            w.VisualState = tempState;

            manager.HealthText.text = attackerHealthAfter.ToString();
            Sequence s = DOTween.Sequence();
            s.AppendInterval(1f);
            s.OnComplete(Command.CommandExecutionComplete);
            //Command.CommandExecutionComplete();
        });
    }
Exemple #11
0
    public void AttackTarget(int targetUniqueID, int damageTakenByTarget, int damageTakenByAttacker, int attackerHealthAfter, int targetHealthAfter)
    {
        Debug.Log(targetUniqueID);                                        //wypisuje na konsoli ID karty
        manager.CanAttackNow = false;                                     //po wyłożeniu karty blokuje możliwość ataku daną kartą
        GameObject target = IDHolder.GetGameObjectWithID(targetUniqueID); //przypisuje

        // przypisz temu stworowi pierwszeństwo
        w.BringToFront();
        VisualStates tempState = w.VisualState;

        w.VisualState = VisualStates.Transition;

        transform.DOMove(target.transform.position, 0.5f).SetLoops(2, LoopType.Yoyo).SetEase(Ease.InCubic).OnComplete(() =>
        {
            if (damageTakenByTarget > 0)
            {
                DamageEffect.CreateDamageEffect(target.transform.position, damageTakenByTarget);            //tworzenie wyglądu ataku atakującego
            }
            if (damageTakenByAttacker > 0)
            {
                DamageEffect.CreateDamageEffect(transform.position, damageTakenByAttacker);                 //tworzenie wyglądu ataku broniącego się
            }
            if (targetUniqueID == GlobalSettings.Instance.LowPlayer.PlayerID || targetUniqueID == GlobalSettings.Instance.TopPlayer.PlayerID)
            {
                // celem jest gracz
                target.GetComponent <PlayerPortraitVisual>().HealthText.text = targetHealthAfter.ToString();
            }
            else
            {
                target.GetComponent <OneCreatureManager>().HealthText.text = targetHealthAfter.ToString(); //celem jest potwór
            }
            w.SetTableSortingOrder();                                                                      //ustawienie sortowania na stole
            w.VisualState = tempState;                                                                     //przypisuje wartości tymczasowe w danym miejscu

            manager.HealthText.text = attackerHealthAfter.ToString();
            Sequence s = DOTween.Sequence();
            s.AppendInterval(1f);
            s.OnComplete(Command.CommandExecutionComplete);
            //Command.CommandExecutionComplete();
        });
    }
    // CARD DRAW METHODS
    public void GivePlayerACard(CardAsset c, int UniqueID, bool fast = false, bool fromDeck = true)
    {
        GameObject card;

        if (fromDeck)
        {
            card = CreateACardAtPosition(c, DeckTransform.position, new Vector3(0f, -179f, 0f));
        }
        else
        {
            card = CreateACardAtPosition(c, OtherCardDrawSourceTransform.position, new Vector3(0f, -179f, 0f));
        }
        // save this as visual representation in CardLogic
        // Player ownerPlayer = GlobalSettings.Instance.Players[owner];
        //Debug.Log(ownerPlayer);
        //Debug.Log(ownerPlayer.hand);
        //Debug.Log("CArdsInHand.Count: "+ ownerPlayer.hand.CardsInHand.Count);
        //Debug.Log("Attempted placeInHand: " +placeInHand);
        // ownerPlayer.hand.CardsInHand[0].VisualRepresentation = card;
        //Debug.Log(ownerPlayer.hand);
        // Set a tag to reflect where this card is
        foreach (Transform t in card.GetComponentsInChildren <Transform>())
        {
            t.tag = owner.ToString() + "Card";
        }
        // pass this card to HandVisual class
        AddCard(card);
        // let the card know about its place in hand.
        WhereIsTheCardOrCreature w = card.GetComponent <WhereIsTheCardOrCreature>();

        w.BringToFront();

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

        id.UniqueID = UniqueID;

        // save this card to change its state to "Hand" when it arrives to the hand.
        LastDealtCard = card;

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

        if (!fast)
        {
            Debug.Log("Not fast!!!");
            s.Append(card.transform.DOMove(DrawPreviewSpot.position, GlobalSettings.Instance.CardTransitionTime));
            if (TakeCardsOpenly)
            {
                s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTime));
            }
            else
            {
                s.Insert(0f, card.transform.DORotate(new Vector3(0f, 179f, 0f), GlobalSettings.Instance.CardTransitionTime));
            }
            s.AppendInterval(GlobalSettings.Instance.CardPreviewTime);
            // displace the card so that we can select it in the scene easier.
            s.Append(card.transform.DOLocalMove(slots.Children[0].transform.localPosition, GlobalSettings.Instance.CardTransitionTime));
        }
        else
        {
            // displace the card so that we can select it in the scene easier.
            s.Append(card.transform.DOLocalMove(slots.Children[0].transform.localPosition, GlobalSettings.Instance.CardTransitionTimeFast));
            if (TakeCardsOpenly)
            {
                s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTimeFast));
            }
        }

        s.OnComplete(() => ChangeLastCardStatusToInHand(card, w));
    }
Exemple #13
0
    // DAJE GRACZOWI NOWĄ KARTĘ Z POZYCJI
    public void GivePlayerACard(CardAsset c, int UniqueID, bool fast = false, bool fromDeck = true)
    {
        // Zainicjowanie obiektu card typu GameObject
        GameObject card;

        // Sprawdzenie dla pewności czy karta pochodzi z talii; fromDeck musi być true
        if (fromDeck)
        {
            // Przypisanie do obiektu card obiektu stworzonego za pomocą funkcji - CreateACardAtPosition() -> funkcja opisana wyżej
            // W nawiasach znajdują się argumenty na których ma operować funkcja
            card = CreateACardAtPosition(c, DeckTransform.position, new Vector3(0f, -179f, 0f));
        }
        else
        {
            // Jeżeli fromDeck to false to karta nie jest z talii więc tworzy tą kartę, ale umieszcza ją w innym miejscu w grze
            card = CreateACardAtPosition(c, OtherCardDrawSourceTransform.position, new Vector3(0f, -179f, 0f));
        }

        // Ustawienie tagu, aby odzwierciedlić miejsce, w którym znajduje się ta karta
        // card.GetComponentsInChildren<Transform> - to zwrócony komponent typu Transform z obiektu card
        // Chodzi o przypisanie tagu do tego obiektu, a tag znajduje się w klasie Transform (jest to klasa systemowa)
        foreach (Transform t in card.GetComponentsInChildren <Transform>())
        {
            // Odwołanie się do tagu z Transform i przypisanie do niego zwróconego łańcucha znaków [ToString()] z "Owner" i dodanie do niego "Card"
            t.tag = owner.ToString() + "Card";
        }

        AddCard(card); //wywołanie funkcji (jest opisana wyżej)

        // Zainicjowanie zmiennej w typu WITCOC przypisanie do niego komponentu z obiektu card typu WITCOC
        WhereIsTheCardOrCreature w = card.GetComponent <WhereIsTheCardOrCreature>();

        w.BringToFront();                        //odwołanie się do funkcji w klasie WITCOC i wywołanie jej (działanie funkcji opisane w danym skrypcie)
        w.Slot        = 0;                       // Odwołanie się do zmiennej slot w klasie WITCOC i przypisanie jej wartości 0
        w.VisualState = VisualStates.Transition; //Odwołanie się do zmiennej VisualState w klasie WITCOC (jest to zmienna typu enum)
        // I nadanie jej argumentu "Transition", który znajduje się w zbiorze enum VisualStates
        /// Ogólnie tutaj chodzi o to aby podczas gdy karta będzie podróżować z miejsca do ręki miała priorytet i była ponad wszystkimi
        /// Innymi obiektami (była najbardziej widoczna)

        // NADAJ TEJ KARCIE - ID
        // Zainicjowanie zmiennej id typu IDHolder i przypisanie do niej stworzonego komponentu z obiektu card, typu IDHolder
        IDHolder id = card.AddComponent <IDHolder>();

        id.UniqueID = UniqueID; // Odwołanie się do zmiennej w klasie IDHolder i przypisanie do niej - jej (tzn jej ale będącej argumentem tej funkcji) xD
        /// Wiem to może być dziwne, ale to co przetwarza tamta klasa zapisuje się właśnie w UniqueID; chcemy to co ona wykona przekazać tą funkcją dalej
        /// Więc musimy to przekazać do jej argumentu - tym właśnie jest to drugie UniqueID po znaku równa się


        //  PRZENIESIENIE KARTY DO RĘKI
        // Zainicjowanie zmiennej s typu Sequence
        /// Na przyszłość: jeśli chodzi o tym Sequence to jest to typ udostępniany przez bibliotekę DOTWEEN
        /// Tworzy ona zasób w której będzie można przetrzymywać stworzoną sekwencję animacji jaka ma być wykonywana
        /// Nie będę tutaj za dużo o niej pisać, ale polecam zapoznać się z dokumentacją DOTWEEN jest tam wszystko dokładnie wytłumaczone
        // Do "s" przypisujemy funkcję która będzie generować tą sekwencję (chodzi po prostu o dbanie o zdrowie swoich palcy i nie pisania za dużo) xD
        Sequence s = DOTween.Sequence();

        // Na początku tej funkcji zainicjowaliśmy tą zmienną jako false, chodzi tutaj o wywołanie jej jako true, bez zmieniania jej na true
        if (!fast)
        {
            // Debug.Log ("Not fast!!!");
            // s.Append() - Wywołanie funkcji Append zawartej w Sequence()
            /// Append() - dodaje animację do końca sekwencji
            // DrawPreviewSpot.position - przekazuje referencje pozycji jakie znajdują się w polu DrawPreviewSpot
            // GlobalSettings.Instance.CardTransitionTime - przekazuje referencje czasu jakie znajdują się w polu CardTransitionTime
            /// Jeśli chodzi o to ostatnie to jest to wytłumaczone w skrypcie GlobalSetting
            s.Append(card.transform.DOMove(DrawPreviewSpot.position, GlobalSettings.Instance.CardTransitionTime));

            // Sprawdzanie czy można wyłożyć kartę, jeśli tak to jedzie z kodem ->
            if (TakeCardsOpenly)
            {
                // s.Insert() - Wywołanie funkcji Insert zawartej w Sequence()
                /// Insert() - umożliwia dodanie animacji do konkretnej pozycji czasowej
                // 0f - oznacza czas w którym ma zostać animacja umieszczona
                /// ogólnie w tej funkcji pierwszy argument zawsze oznacza czas
                // ard.transform.DORotate - wywołanie funkcji DORotate, która będzie działąć na Transform w obrębie card
                /// DORotate() - obraca cel do podanej wartości
                // Vector3.zero - pierwszy argument DORotate, jest końcowym stanem do jakiego ma zostać zmodyfikowany obiekt
                /// Na przyszłość: Vector3.zero - jest skrótem od Vector3 (0,0,0); ustawia obiekt na 0
                // lobalSettings.Instance.CardTransitionTime - TO CO BYŁO OPISANE WYŻEJ ^
                s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTime));
            }

            //else
            //s.Insert(0f, card.transform.DORotate(new Vector3(0f, -179f, 0f), GlobalSettings.Instance.CardTransitionTime));

            // s.AppendInterval() - Wywołanie funkcji AppendInterval zawartej w Sequence()
            // AppendInterval() - dodaje podany interwał do końca sekwencji
            // W nawiasie to co było wytłumaczane wyżej ^
            s.AppendInterval(GlobalSettings.Instance.CardPreviewTime);
            // Dodajemy animację do końca sekwencji; w nawiasie podajemy jaka animacja ma się stworzyć
            // card.transform.DOLocalMove - odwołujemy się do tramsformacji w obrębie "card" i wywołujemy funkcję DOLocalMove
            /// DOLocalMove() - funkcja która przenosi obiekt do podanej wartości w nawiasie
            // slots.Children[0].transform.localPosition - odwołujemy się do lokalnej pozycji jaka jest zawarta w Children[0], który jest w "slots"
            /// Jest to pierwszy argument funkcji DOLocalMove(), zawsze oznacza pozycję do której ma się udać obiekt
            // Drugi argument to czas w jakim ma się przenieść obiekt, tutaj bez zmian to co powyżej było wyjaśniane ^
            s.Append(card.transform.DOLocalMove(slots.Children[0].transform.localPosition, GlobalSettings.Instance.CardTransitionTime));
        }
        // Jeśli zmienna fast jest false to wykonuje poniższy kod ->
        else
        {
            // To samo co parę linikej wyżej z tą różnicą, że tym razem czas w jakim ma się wykonać animacja pochodzi od zmiennej CardTransitionTimeFast
            s.Append(card.transform.DOLocalMove(slots.Children[0].transform.localPosition, GlobalSettings.Instance.CardTransitionTimeFast));

            // Sprawdzenie czy można wyłożyć kartę z talii do ręki, TakeCardsOplenly musi być true aby ruszył się dalej kod ->
            if (TakeCardsOpenly)
            {
                // To samo co było wajaśniane wyżej w tej funkcji, dodajemy animację do konkretnej pozycji czasowej
                s.Insert(0f, card.transform.DORotate(Vector3.zero, GlobalSettings.Instance.CardTransitionTimeFast));
            }
        }

        // Ustawienie wywołania zwrotnego (OnComplete), które zostanie wywołanie po zakończeniu animacji; w nawiasie podajemy co ma być wywołane
        /// => - to wyrażenie lambda, służy do wywoływania funkcji/metod. Przydatne przy delegatach.
        /// Nie wiem jak to wytłumaczyć na zrozumiały język. .może przykład:
        /// mamy delegację del Delegate -> przypisujemy do niego np x -> del Delegate = x / i teraz możemy użyć wyrażenia lambda aby określić argumenty
        /// del Delegate = x => x + x;
        /// Potem możemy wywołać Delegate(np. 5) i dostaniemy wynik 10, ponieważ podaną 5 lambda przypisuje do argumentów x+x
        /// I tak samo lambdę moża wykorzystać w funkcjach tak jak poniżej, mamy funkcję ChangeLastCardStatusToInHand i podane argumenty
        /// Lambda przekazuje te parametry do funkcji, potem ta funkcja się wykonuje i zwraca wynik do niej
        /// Wynik wędruje do OnComplete aby wykonać swoją robotę na podstawie swojego argumentu, który składa się z argumentów ChangeLastCardStatusToInHand
        /// W ten sposób stworzyliśmy tzw. Drzewo wyrażeń - coś się składa z czegoś, a to coś jeszcze z czegoś i tak do najniższej pozycji drzewa
        // A dlaczego tak? Bo funkcja ChangeLastCardStatusToInHand zmienia status karty; chcemy aby ten status wykonał się po tym jak karta trafi do ręki
        // Dlatego umieszczamy ją w OnComplete, która oznacza koniec animacji która przenosi kartę do ręki i w ten sposób mamy pewność że ta funkcja
        // Wykona się dopiero wtedy gdy karta będzie w ręce
        s.OnComplete(() => ChangeLastCardStatusToInHand(card, w));
    }