/* 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; }
/* 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; } }
/* 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); }); }
public void Move(Transform target, TraslationType transition = TraslationType.INSTANT, Func <Card, bool> callback = null) { StartCoroutine(cMove(target, transition, callback)); }
/* 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); }