Esempio n. 1
0
    public void SelectCard(Card card)
    {
        if (gameStatus != GameStatus.TeamSelectsWords)
        {
            return;
        }
        if (isSomeCardMoving)
        {
            return;
        }
        if (isSelectionAllowed == false)
        {
            return;
        }

        card.GetComponent <Button>().interactable = false;

        // Если выбрана карточка, скрывающая агента красной или синей команды.
        if (card.fraction == FractionType.blueTeam || card.fraction == FractionType.redTeam)
        {
            Team team = GetTeamByFraction(card.fraction);
            team.agentsLeft--;
            Card agentCard = team.deck.cards[team.deck.cards.Count - 1];
            team.deck.cards.Remove(agentCard);
            agentCard.MoveToNewLocation(card.transform, true);

            // Если свой агент.
            if (card.fraction == currentTeam.FractionType)
            {
                // TODO KEEP SELECTING IF FREE WORDS AVAILABLE OR END TURN IF NO FREE WORDS
                soundPlayer.PlayApplauseSound();
                if (currentTeam.agentsLeft == 0)
                {
                    StartCoroutine("VictoryDemonstration");
                }
                else
                {
                    hintRemain--;
                    statusLabel.text = currentTeam.name + ": УГАДЫВАЙТЕ! ВАМ ОСТАЛОСЬ " + hintRemain + " СЛОВА.";
                    if (hintRemain <= 0)
                    {
                        ChangeTeam();
                    }
                }
            }
            // Если чужой агент.
            else
            {
                // TODO END TURN
                soundPlayer.PlayBooSound();
                if (NotCurrentTeam().agentsLeft > 0)
                {
                    ChangeTeam();
                }
                else
                {
                    StartCoroutine("VictoryDemonstration");
                }
            }
        }

        //if (card.fraction == FractionType.blueTeam)
        //{
        //    blueTeam.agentsLeft --;
        //    Card agentCard = table.blueDeck.cards[table.blueDeck.cards.Count - 1];
        //    table.blueDeck.cards.Remove(agentCard);
        //    agentCard.MoveToNewLocation (card.transform, true);
        //    //LeanTween.move(agentCard.gameObject, card.gameObject.transform, 0.5f);
        //}
        //else if (card.fraction == FractionType.redTeam)
        //{
        //    redTeam.agentsLeft--;
        //    Card agentCard = table.redDeck.cards[table.redDeck.cards.Count - 1];
        //    table.redDeck.cards.Remove(agentCard);
        //    agentCard.MoveToNewLocation(card.transform, true);
        //    //LeanTween.move(agentCard.gameObject, card.gameObject.transform, 0.5f);
        //}
        else if (card.fraction == FractionType.death)
        {
            isSelectionAllowed = false;
            AgentCard deathCard = Instantiate(agentCardPrefab, card.transform).GetComponent <AgentCard>();
            deathCard.SetDeathAgent();
            deathCard.SetRandomOffset(10f);
            deathCard.SetRandomAngle(2f);
            NotCurrentTeam().scores++;
            soundPlayer.PlayDefeatSound();
            StartCoroutine("DefeatDemonstration");
        }
        else if (card.fraction == FractionType.neutral)
        {
            AgentCard neutralCard = Instantiate(agentCardPrefab, card.transform).GetComponent <AgentCard>();
            neutralCard.SetNeutralCitizen();
            neutralCard.SetRandomOffset(10f);
            neutralCard.SetRandomAngle(2f);
            soundPlayer.PlayBooSound();
            ChangeTeam();
        }
    }
Esempio n. 2
0
    IEnumerator CardDistribution()
    {
        List <FractionType> fractionsPool = new List <FractionType>();

        for (int i = 0; i < redTeam.agentsLeft; i++)
        {
            fractionsPool.Add(redTeam.FractionType);
        }
        for (int i = 0; i < blueTeam.agentsLeft; i++)
        {
            fractionsPool.Add(blueTeam.FractionType);
        }
        fractionsPool.Add(FractionType.death);
        while (fractionsPool.Count < GlobalOptions.CardNumber)
        {
            fractionsPool.Add(FractionType.neutral);
        }

        for (int i = 0; i < table.cardPlaceHolders.Length; i++)
        {
            string word = unusedWords[Random.Range(0, unusedWords.Count)];
            unusedWords.Remove(word);

            CardWithWord card = cardsWithWord[i] = Instantiate(cardWithWordPrefab, table.deckPlace.transform).GetComponent <CardWithWord>();
            cardsWithWord[i].wordLabel.text = word;
            cardsWithWord[i].SetRandomAngle();
            int rnd = Random.Range(0, fractionsPool.Count);
            cardsWithWord[i].fraction = fractionsPool[rnd];
            fractionsPool.RemoveAt(rnd);

            card.PlaySound();
            LeanTween.move(cardsWithWord[i].gameObject, table.cardPlaceHolders[i].transform, 0.5f);

            if (cardsWithWord[i].fraction == FractionType.blueTeam)
            {
                cardsWithWord[i].gameObject.GetComponent <Image>().color = Color.blue;
            }
            if (cardsWithWord[i].fraction == FractionType.redTeam)
            {
                cardsWithWord[i].gameObject.GetComponent <Image>().color = Color.red;
            }
            if (cardsWithWord[i].fraction == FractionType.death)
            {
                cardsWithWord[i].gameObject.GetComponent <Image>().color = Color.gray;
            }

            yield return(new WaitForSeconds(0.25f));
        }

        for (int i = 0; i < redTeam.agentsLeft; i++)
        {
            AgentCard agentCard = Instantiate(agentCardPrefab, table.redDeck.transform).GetComponent <AgentCard>();
            agentCard.SetRedAgent();
            agentCard.SetRandomAngle(5f);
            agentCard.SetRandomOffset(40f);
            agentCard.PlaySound();
            table.redDeck.cards.Add(agentCard);
            yield return(new WaitForSeconds(0.2f));
        }
        for (int i = 0; i < blueTeam.agentsLeft; i++)
        {
            AgentCard agentCard = Instantiate(agentCardPrefab, table.blueDeck.transform).GetComponent <AgentCard>();
            agentCard.SetBlueAgent();
            agentCard.SetRandomAngle(5f);
            agentCard.SetRandomOffset(40f);
            agentCard.PlaySound();
            table.blueDeck.cards.Add(agentCard);
            yield return(new WaitForSeconds(0.2f));
        }
        Debug.Log("Card Distribution done.");

        StartCaptainTurn();
    }
Esempio n. 3
0
        public static void Resolve()
        {
            var chambersToResolve = Game.Moves.Select(m => m.Chamber).Distinct();

            foreach (var chamber in chambersToResolve)
            {
                var attackingMoves = Game.Moves.Where(m => m.Chamber == chamber).ToList();

                // Find the defender
                PlayerMove defendingMove = attackingMoves.FirstOrDefault(m => m.Player.Chamber == chamber ||
                                                                         chamber == Chamber.Court);
                if (defendingMove != null)
                {
                    attackingMoves.Remove(defendingMove);
                }

                AgentCard defendingAgent = null;
                if (defendingMove != null)
                {
                    defendingAgent = defendingMove.Agent;
                }
                else if (chamber != Chamber.Court)
                {
                    defendingAgent = Game.Players[chamber].Agents.LastOrDefault(a => a.IsInChamber());
                }

                // Are there any attackers?
                if (attackingMoves.Count == 0)
                {
                    // no attackers
                    continue;
                }

                // Start the attack
                foreach (var attackMove in attackingMoves)
                {
                    Log.Line("{0} with {1} is sneaking into the {2}", attackMove.Agent, attackMove.FacedownCard, chamber);
                }

                // Run the numbers
                var attackingIntrigue = attackingMoves.Sum(a => a.GetIntrigue());
                int defendingIntruge;

                if (defendingMove != null)
                {
                    // prepared
                    defendingIntruge = defendingMove.GetIntrigue();
                    Log.Line("{0} is waiting and ready", defendingMove);
                }
                else if (defendingAgent != null)
                {
                    // suprised
                    defendingIntruge = defendingAgent.Intrigue;
                    Log.Line("{0} is suprised", defendingAgent);
                }
                else
                {
                    // empty
                    Log.Line("But {0} was empty", chamber);
                    Log.Line();
                    Log.Sleep();
                    continue;
                }

                // Result
                var attackerIsHuman = attackingMoves.First().Player.IsHuman;
                var defenderIsHuman = Game.GetOwner(defendingAgent).IsHuman;

                var result = GetResult(attackingIntrigue, defendingIntruge, attackerIsHuman, defenderIsHuman);

                if (result == DieResult.Target_dies)
                {
                    Log.Line("The attack succeeds");

                    Game.Discard(defendingAgent);

                    if (defendingMove != null)
                    {
                        Game.Discard(defendingMove.FacedownCard);
                    }
                }
                else if (result == DieResult.Everyone_dies)
                {
                    Log.Line("Everyone manages to kill themselves in confusion");

                    foreach (var attackMove in attackingMoves)
                    {
                        Game.Discard(attackMove.Agent);
                        Game.Discard(attackMove.FacedownCard);
                    }
                    Game.Discard(defendingAgent);
                    if (defendingMove != null)
                    {
                        Game.Discard(defendingMove.FacedownCard);
                    }
                }
                else if (result == DieResult.Inspires_fear)
                {
                    Log.Line("The attack discovered but inspires fear", defendingAgent);

                    defendingAgent.Tap(TapReason.Frightened);
                }
                else if (result == DieResult.Raises_suspicion)
                {
                    Log.Line("The attack discovered and raises suspicion");
                    foreach (var attackMove in attackingMoves)
                    {
                        attackMove.Agent.Tap(TapReason.Suspicious);
                    }
                }
                else if (result == DieResult.Weapons_dropped)
                {
                    Log.Line("The attack is discovered and weapons are dropped at scene");
                    foreach (var attackMove in attackingMoves)
                    {
                        Game.Discard(attackMove.FacedownCard);
                    }
                }
                else if (result == DieResult.Hang_attackers)
                {
                    Log.Line("The attack is discovered and the attackers are hanged");
                    foreach (var attackMove in attackingMoves)
                    {
                        Game.Discard(attackMove.Agent);
                        Game.Discard(attackMove.FacedownCard);
                    }
                }

                //// Request key press if player didn't do anything
                //var hadInput = (attackingIntrigue > defendingIntruge && attackerIsHuman)
                //                || (defendingIntruge > attackingIntrigue && defenderIsHuman);
                //if (hadInput == false)
                //{
                //    Controls.PressAnyKey();
                //}

                // finished
                Log.Line();
                Log.Sleep();
            }
        }