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(); } }
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(); }
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(); } }