Пример #1
0
    /* sposta una carta fino a un target ed esegue il callback */
    IEnumerator cMove(Transform target, TraslationType transition = TraslationType.INSTANT, Func <Card, bool> callback = null)
    {
        if (transition == TraslationType.ANIMATE)
        {
            GameManager.Instance.DraggingDisabled = true;

            SetSortingLayerName("Dragged"); // porto la carta in foreground

            // ciclo per spostamento
            while (transform.position != target.position)
            {
                transform.position = Vector3.MoveTowards(transform.position, target.position, GameManager.Instance.CardSpeed * Time.deltaTime);
                //yield return new WaitForSeconds(0.2f);
                yield return(new WaitForFixedUpdate());
            }

            SetSortingLayerName("Cards"); // porto la carta in background
        }
        else
        {
            transform.position = target.position;
        }

        // eseguo il callback
        callback(this);
        GameManager.Instance.DraggingDisabled = false;
    }
Пример #2
0
    /* Trasferisce le carte dalla cima di un mazzo alla cima dell'altro (anche multiple) */
    public static void TransferCards(
        Deck sender,   // mazzo di origine
        Deck receiver, // mazzo di destinazione
        int numCards = 1,
        TraslationType traslation = TraslationType.INSTANT,
        MoveType direction        = MoveType.FORWARD,
        bool registerAsOneMove    = false
        )
    {
        if (!sender.Top)
        {
            return;
        }

        for (int c = 0; c < numCards; c++)
        {
            if (!sender.Top)
            {
                return;
            }

            Card card = sender.Top;

            receiver.AddCard(ref card, sender, traslation);

            if (direction == MoveType.FORWARD && !registerAsOneMove)
            {
                Move newMove = new Move(sender, receiver, ref card);
                GameManager.Instance.RegisterMove(newMove);
            }

            if (!registerAsOneMove)
            {
                GameManager.Instance.Moves += 1;
            }

            sender.DiscardTop();

            int score = CalculateScore(sender, receiver);
            GameManager.Instance.Score += score;
        }

        if (direction == MoveType.FORWARD && registerAsOneMove)
        {
            Card card    = receiver.Top;
            Move newMove = new Move(sender, receiver, ref card, false, 0, numCards);
            GameManager.Instance.RegisterMove(newMove);
        }

        if (registerAsOneMove)
        {
            GameManager.Instance.Moves += 1;
        }
    }
Пример #3
0
    /* Aggiunge una carta al mazzo */
    public void AddCard(ref Card card, Deck sender = null, TraslationType transition = TraslationType.INSTANT)
    {
        // lock
        if (_ordering)
        {
            return;
        }

        // se è una matrioska e non vuota la destinazione è l'ultima carta, se no il mazzo
        Transform target = (!IsEmpty && IsMatrioska ? Top.transform : transform);

        // scopro subito la carta (se la destinazione non è il mazzo principale)
        card.Scoperta = (Type != DeckType.MAIN);

        Cards.Add(card);  // aggiungo l'oggetto carta alla lista
        card.Deck = this; // imposto la reference del mazzo

        card.Move(target, transition, delegate(Card theCard) {
            theCard.SetParent(target);
            Reorder();
            return(true);
        });
    }
Пример #4
0
 public void Move(Transform target, TraslationType transition = TraslationType.INSTANT, Func <Card, bool> callback = null)
 {
     StartCoroutine(cMove(target, transition, callback));
 }
Пример #5
0
    /* Il giocatore ha trascinato e droppato una o più carte sul mazzo */
    public bool Drop(
        ref Card card,
        Deck sender,
        TraslationType transition = TraslationType.INSTANT,
        MoveType moveType         = MoveType.FORWARD
        )
    {
        if (!AcceptDrops)
        {
            return(false);
        }

        if (!Accept(card) && moveType != MoveType.BACK)
        {
            return(false);
        }

        int numCards = card.transform.GetComponentsInChildren <Card>().Length;

        // inizializzo la mossa da salvare in history
        Move newMove = new Move(sender, this, ref card);

        bool flipped = false;

        // sono state trascinate più carte assieme
        if (numCards > 1)
        {
            // ottengo tutte le carte della catena
            Card[] cards = card.transform.GetComponentsInChildren <Card>();

            // aggiungo tutte le carte al mazzo di destinazione
            for (int i = 0; i < cards.Length; i++)
            {
                AddCard(ref cards[i], sender);
                flipped = sender.DiscardTop(); // TODO: andrebbero tolte in senso inverso
            }
        }
        else
        {
            // aggiungo la carta al mazzo di destinazione
            AddCard(ref card, sender, transition);
            flipped = sender.DiscardTop();
        }

        if (moveType == MoveType.FORWARD)
        {
            // calcolo il punteggio
            newMove.Score += GameManager.CalculateScore(sender, this);
        }

        // se il sender è una colonna ed è rimasta una carta coperta libera
        if (moveType == MoveType.FORWARD && sender.Type == DeckType.COLUMN && sender.Top != null && flipped)
        {
            newMove.Score  += (int)Scores.FlippedCard;
            newMove.Flipped = true;
        }

        // se il trascinamento viene da una base allora sottraggo il punteggio
        if (sender.Type == DeckType.BASE)
        {
            newMove.Score -= GameManager.CalculateScore(this, sender);
        }

        if (moveType == MoveType.FORWARD)
        {
            // aggiorno il punteggio, registro la mossa, incremento il numero di mosse
            GameManager.Instance.Score += newMove.Score;
            GameManager.Instance.RegisterMove(newMove);
        }

        GameManager.Instance.Moves += 1;

        card.FindBestMove();

        return(true);
    }