Exemplo n.º 1
0
    public static bool isValidPlay(Card c, Player p, StateMachineSystem.StateMachine targetMachine)
    {
        Card.Suit   trump = targetMachine.Memory.GetData <Card.Suit>("Trump");
        List <Card> plays = targetMachine.Memory.GetData <List <Card> >("Plays");

        if (plays.Count > 0)
        {
            bool hasLeadSuitInHand = false;

            //Figure out the lead suit
            Card.Suit leadSuit = plays[0].suit;
            //overide the lead suit for offsuit Trump jack
            if (plays[0].value == Card.Value.Jack && plays[0].suit == trump.SameColorSuit())
            {
                leadSuit = trump;
            }

            //Figure out the suit of what we playes
            Card.Suit playedSuit = c.suit;
            //Override the played suit for offsuit trump jack
            if (c.value == Card.Value.Jack && c.suit == trump.SameColorSuit())
            {
                playedSuit = trump;
            }

            //Check if the hand has a card that is valid suit
            foreach (Card card in p.GetHand())
            {
                Card.Suit cardsSuit = card.suit;
                //Overrride the offsuit Trump jack
                if (card.value == Card.Value.Jack && card.suit == trump.SameColorSuit())
                {
                    cardsSuit = trump;
                }

                if (cardsSuit == leadSuit)
                {
                    hasLeadSuitInHand = true;
                }
            }

            //If they have an on suit play at the played card isn't, invalidate the play
            if (hasLeadSuitInHand && playedSuit != leadSuit)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
        else
        {
            return(true);
        }
    }
Exemplo n.º 2
0
    public static int  ScoreingValue(Card c, StateMachineSystem.StateMachine targetMachine)
    {
        Card.Suit trump = targetMachine.Memory.GetData <Card.Suit>("Trump");
        Card      lead  = targetMachine.Memory.GetData <List <Card> >("Plays")[0];
        //Intial value is as printed on the card
        int val = (int)c.value;

        //If on suit, add value
        if (c.suit == lead.suit)
        {
            val += 20;
        }
        //If on trump, add value
        if (c.suit == trump)
        {
            val += 50;
        }
        //Override on-color Jack
        if (c.suit == trump.SameColorSuit() && c.value == Card.Value.Jack)
        {
            val = 200;
        }
        //Override on-trump Jack
        if (c.suit == trump && c.value == Card.Value.Jack)
        {
            val = 250;
        }
        return(val);
    }
Exemplo n.º 3
0
    private static int CardValue(Card c, Card.Suit trump, PointSpread pointSpread)
    {
        int value = 0;

        if (c.suit == trump)
        {
            //On suit cards
            switch (c.value)
            {
            case Card.Value.Nine:
                value = pointSpread.Nine;
                break;

            case Card.Value.Ten:
                value = pointSpread.Ten;
                break;

            case Card.Value.Queen:
                value = pointSpread.Queen;
                break;

            case Card.Value.King:
                value = pointSpread.King;
                break;

            case Card.Value.Ace:
                value = pointSpread.Ace;
                break;

            case Card.Value.Jack:
                value = pointSpread.RightBower;
                break;
            }
        }
        else
        {
            //Off suit ace
            if (c.value == Card.Value.Ace)
            {
                value = pointSpread.OffSuitAce;
            }
            //Left Bower
            if (c.value == Card.Value.Jack && c.suit == trump.SameColorSuit())
            {
                value = pointSpread.Ace;
            }
        }
        //Debug.Log("C:" + c.Shortname() + " T:" + trump + " P: " + value);
        //Default to worth of 0
        return(value);
    }
Exemplo n.º 4
0
        public override IEnumerator Exit()
        {
            yield return(base.Exit());

            //Hide the trump selector
            owner.Memory.GetData <TrumpSelector>("TrumpSelector").gameObject.SetActive(false);

            //If we are leaving the Trump round and have selected a trump, prepare regular play
            if (owner.Memory.HasKey <Card.Suit>("Trump"))
            {
                if (owner.Memory.GetData <Player>("Player" + owner.Memory.GetData <int>("ActivePlayer")).isHuman == false && GameManager.AnimateGame)
                {
                    GameManager.AccessInstance().StartCoroutine(HandleAISpeach(GameManager.SpawnAIText(owner.Memory.GetData <int>("ActivePlayer"), 2, owner)));
                    if (owner.Memory.GetData <bool>("Alone"))
                    {
                        GameManager.AccessInstance().StartCoroutine(HandleAISpeach(GameManager.SpawnAIText(owner.Memory.GetData <int>("ActivePlayer"), 3, owner)));
                    }
                }

                //Organize AI and player's hands
                Player[]      players       = new Player[] { owner.Memory.GetData <Player>("Player0"), owner.Memory.GetData <Player>("Player1"), owner.Memory.GetData <Player>("Player2"), owner.Memory.GetData <Player>("Player3") };
                System.Action OrganizeHands = () => {
                    foreach (Player p in players)
                    {
                        if (p.isHuman)
                        {
                            Card.Suit trump = owner.Memory.GetData <Card.Suit>("Trump");
                            System.Func <Card, int> calcVal = (Card c) => {
                                //Intial value is as printed on the card
                                int val = (int)c.value;
                                //Clump up same suits
                                val += ((int)c.suit) * 30;
                                //If on trump, add value
                                if (c.suit == trump)
                                {
                                    val += 500;
                                }
                                //Override on-color Jack
                                if (c.suit == trump.SameColorSuit() && c.value == Card.Value.Jack)
                                {
                                    val = 99995;
                                }
                                //Override on-trump Jack
                                if (c.suit == trump && c.value == Card.Value.Jack)
                                {
                                    val = 99999;
                                }
                                return(val);
                            };
                            p.GetHand().Sort((Card x, Card y) => {
                                if (calcVal(x) < calcVal(y))
                                {
                                    return(-1);
                                }
                                else
                                {
                                    return(1);
                                }
                            });
                            p.GetHand().Reverse();
                        }
                        else
                        {
                            System.Action <List <Card> > ShuffleTheList = (List <Card> shuffleList) => {
                                int n = shuffleList.Count;
                                while (n > 1)
                                {
                                    n--;
                                    int k;
                                    //Shuffle, but don't let things stay in the same spot
                                    do
                                    {
                                        k = Random.Range(0, n + 1);
                                    } while (k == n);
                                    Card value = shuffleList[k];
                                    shuffleList[k] = shuffleList[n];
                                    shuffleList[n] = value;
                                }
                            };
                            ShuffleTheList(p.GetHand());
                        }
                        //Animate the cards where they belong
                        p.StartCoroutine(GameManager.cardAnimator.AdjustHand(p.gameObject.name, GameManager.AnimateGame, owner));
                    }
                };


                //Create a stamp to track what trump is
                if (GameManager.AnimateGame)
                {
                    owner.Memory.SetData <GameObject>("TrumpIndicator", GameManager.SpawnTrumpIndicator(owner.Memory.GetData <Card.Suit>("Trump"), owner.Memory.GetData <int>("ActivePlayer") % 2));
                }
                Deck d = owner.Memory.GetData <Deck>("GameDeck");

                //If the revealed card is still face up, have the dealer switch with it.
                if (owner.Memory.GetData <Card>("RevealedCardFromKittie").faceDown == false &&
                    //The following is some going alone logic. First check if someone went alone.
                    //The specific case is when our partner calls a loner and we are the dealer so we need to skip doing the pickup
                    //So we check for the specific case, and then compare it to false.
                    //First we check for someone having gone alone. Then we check to make sure that was person was on our team, and then we check to see if it was not the dealer.
                    (owner.Memory.GetData <bool>("Alone") &&
                     owner.Memory.GetData <int>("TrumpCaller") % 2 == owner.Memory.GetData <int>("Dealer") % 2 &&
                     owner.Memory.GetData <int>("TrumpCaller") != owner.Memory.GetData <int>("Dealer")) == false)
                {
                    //Add the revealed card to the dealer's hand
                    Card   rCard      = owner.Memory.GetData <Card>("RevealedCardFromKittie");
                    string dealerName = "Player" + owner.Memory.GetData <int>("Dealer");
                    Player dealer     = owner.Memory.GetData <Player>(dealerName);
                    dealer.AddCard(rCard);
                    if (GameManager.AnimateGame)
                    {
                        yield return(GameManager.cardAnimator.Orient(rCard, dealerName, GameManager.AnimateGame, owner));
                    }

                    //Hide the card
                    if (GameManager.AnimateGame)
                    {
                        if (dealer.isHuman == false && GameManager.ShowAllCards == false)
                        {
                            yield return(GameManager.cardAnimator.Flip(rCard, GameManager.AnimateGame));
                        }
                    }

                    if (GameManager.AnimateGame)
                    {
                        yield return(GameManager.cardAnimator.AdjustHand(dealerName, GameManager.AnimateGame, owner));
                    }

                    OrganizeHands();
                    //Wait for the cards to orient
                    if (GameManager.AnimateGame)
                    {
                        foreach (Player player in players)
                        {
                            foreach (Card card in player.GetHand())
                            {
                                while (card.animating)
                                {
                                    yield return(null);
                                }
                            }
                        }
                    }


                    //Add Listeners for Card interaction
                    CardInteractionHandlers.EnableCardInteraction(this);
                    if (dealer.isHuman)
                    {
                        CardInteractionHandlers.CanPlayCard = true;
                    }

                    bool lockout = true;
                    System.Action <object, object> func = (object sender, object args) => {
                        if (args == null)
                        {
                            return;
                        }

                        object[]   trueArgs = (object[])args;
                        GameObject zone     = (GameObject)trueArgs[0];
                        Card       card     = (Card)trueArgs[1];

                        if (zone.tag == "PlayZone")
                        {
                            //Set the played card as the revealed card
                            owner.Memory.SetData("RevealedCardFromKittie", card);

                            //Remove the card from the dealers hand.
                            dealer.RemoveCard(card);
                            //Do exit visuals to signify the card has left hand control
                            CardInteractionHandlers.CardMouseExit(this, card);

                            //Adjust the hand visuals
                            card.StartCoroutine(GameManager.cardAnimator.AdjustHand(dealerName, GameManager.AnimateGame, owner));

                            //Advance the coroutine
                            lockout = false;
                        }
                        else
                        {
                            card.StartCoroutine(GameManager.cardAnimator.FlyTo(card.goalPosition, card, GameManager.AnimateGame));
                        }
                    };
                    this.AddObserver(func, "CardPlayedInZone" + owner.UID);
                    //Run the AI
                    if (owner.Memory.GetData <Player>(dealerName).isHuman == false)
                    {
                        yield return(AIHandler.MakeTrumpDiscardDecision(owner.Memory.GetData <int>("Dealer"), owner.Memory.GetData <PointSpread>("Player" + owner.Memory.GetData <int>("ActivePlayer") + "PointSpread"), owner));
                    }
                    if (GameManager.AnimateGame)
                    {
                        //Yield until the player plays one
                        while (lockout)
                        {
                            yield return(null);
                        }
                    }
                    //Remove listeners for card interaction
                    CardInteractionHandlers.CanPlayCard = false;
                    CardInteractionHandlers.DisableCardInteraction(this);
                    this.RemoveObserver(func, "CardPlayedInZone" + owner.UID);
                }
                else
                {
                    OrganizeHands();
                    //Wait for the cards to orient
                    if (GameManager.AnimateGame)
                    {
                        foreach (Player player in players)
                        {
                            foreach (Card card in player.GetHand())
                            {
                                while (card.animating)
                                {
                                    yield return(null);
                                }
                            }
                        }
                    }
                }
                Card revealedCard = owner.Memory.GetData <Card>("RevealedCardFromKittie");

                //Flip the card over if needed
                if (revealedCard.faceDown == false)
                {
                    revealedCard.StartCoroutine(GameManager.cardAnimator.Flip(revealedCard, GameManager.AnimateGame));
                }

                //Move card to the deck
                if (GameManager.AnimateGame)
                {
                    yield return(GameManager.cardAnimator.FlyTo(d.basePosition, revealedCard, GameManager.AnimateGame));
                }
                //Add revealed card back to deck
                d.Place(new Card[] { revealedCard });

                //Slide the deck these cards offscreen
                foreach (Card card in d)
                {
                    card.SetOrdering(-3);
                    card.StartCoroutine(GameManager.cardAnimator.FlyTo(Vector3.LerpUnclamped(Vector3.zero, owner.Memory.GetData <Player>("Player" + owner.Memory.GetData <int>("Dealer")).gameObject.transform.position, 3.4f), card, GameManager.AnimateGame));
                }

                //Reset active player to right of dealer
                owner.Memory.SetData("ActivePlayer", (owner.Memory.GetData <int>("Dealer") == 3) ? 0 : owner.Memory.GetData <int>("Dealer") + 1);

                //Game should be good to start, wait a moment before starting play
                if (GameManager.AnimateGame)
                {
                    yield return(new WaitForSeconds(0.25f));
                }

                //Enable regular card interaction
                CardInteractionHandlers.EnableCardInteraction(this);
            }
            else
            {
                if (owner.Memory.GetData <Player>("Player" + owner.Memory.GetData <int>("ActivePlayer")).isHuman == false && GameManager.AnimateGame)
                {
                    GameManager.AccessInstance().StartCoroutine(HandleAISpeach(GameManager.SpawnAIText(owner.Memory.GetData <int>("ActivePlayer"), 1, owner)));
                    if (GameManager.AnimateGame)
                    {
                        yield return(new WaitForSeconds(0.5f));
                    }
                }
                //Move on the active player
                owner.Memory.SetData("ActivePlayer", (owner.Memory.GetData <int>("ActivePlayer") == 3) ? 0 : owner.Memory.GetData <int>("ActivePlayer") + 1);
            }
        }