public override IEnumerator PerformPhase(Game game) { Player activePlayer = game.Players.Find(p => p.IsActive); List <Tile> allTiles = new List <Tile>(activePlayer.HandZone.Tiles); allTiles.AddRange(activePlayer.StealZone.Tiles); allTiles.Sort(Tile.CompareTiles); List <HandCombination> validCombs = game.ReturnValidCombinations(allTiles, HandCombination.CompletionType.Draw); if (validCombs.Count > 0) { Decision decision = new CompleteHandDecision(activePlayer, game, HandCombination.CompletionType.Draw); game.EnqueueDecision(decision); yield return(0); string resp = (string)decision.Response[0]; if (resp.Equals("Complete")) { activePlayer.ScorePointsWithHandComb(validCombs, game.Players.Where(p => p != activePlayer).ToList()); game.EnqueueDecision(new DisplayCompletedHandDecision(activePlayer, game, validCombs)); yield return(0); game.EnqueueCommand(new ChangeNextPhaseCommand(PhaseID.EndRound)); } } yield break; }
public override IEnumerator PerformPhase(Game game) { Player activePlayer = game.Players.Find(p => p.IsActive); // Make list of players in steal priority order. Queue <Player> stealPriorityOrder = new Queue <Player>(); int startIdx = (activePlayer.Id + 1) % game.Players.Count; for (int i = 0; i < game.Players.Count; ++i) { Player player = game.Players[(startIdx + i) % game.Players.Count]; if (player != activePlayer) { stealPriorityOrder.Enqueue(player); } } Tile stealableTile = activePlayer.DiscardZone.Tiles.Last(); Queue <Player> requestOrder = new Queue <Player>(); int priorityPlayerCount = stealPriorityOrder.Count; List <HandCombination>[] validCombsPerPlayer = new List <HandCombination> [game.Players.Count]; for (int i = 0; i < priorityPlayerCount; ++i) { Player player = stealPriorityOrder.Dequeue(); List <HandCombination> validCombs = this.GetPotentialHandCompletions(game, player, stealableTile); if (validCombs.Count > 0) { requestOrder.Enqueue(player); } else { stealPriorityOrder.Enqueue(player); } validCombsPerPlayer[player.Id] = validCombs; } while (stealPriorityOrder.Count > 0) { requestOrder.Enqueue(stealPriorityOrder.Dequeue()); } while (requestOrder.Count > 0) { Player player = requestOrder.Dequeue(); List <HandCombination> validCombs = validCombsPerPlayer[player.Id]; if (validCombs.Count > 0) { Decision decision = new CompleteHandDecision(player, game, HandCombination.CompletionType.Steal); game.EnqueueDecision(decision); yield return(0); string resp = (string)decision.Response[0]; if (resp.Equals("Complete")) { player.StealTileForCompletion(stealableTile, activePlayer); player.ScorePointsWithHandComb(validCombs, new List <Player>() { activePlayer }); game.EnqueueDecision(new DisplayCompletedHandDecision(player, game, validCombs)); yield return(0); game.EnqueueCommand(new ChangeNextPhaseCommand(PhaseID.EndRound)); break; } } else if (player.CanStealTileForMerge(stealableTile)) { Decision decision = new StealDiscardDecision(player, game); game.EnqueueDecision(decision); yield return(0); string response = (string)decision.Response[0]; if (response.Equals("Steal")) { game.EnqueueCommand(new StealTileCommand(activePlayer, player, stealableTile)); game.EnqueueCommand(new ChangeActivePlayerCommand(activePlayer, player)); game.EnqueueCommand(new ChangeNextPhaseCommand(PhaseNode.PhaseID.Discard)); break; } } } yield break; }