private async Task <List <IPlayer> > RequestOnlinePlayer() { var players = new List <IPlayer>(); OnlineGameResponse waitingResponse = new OnlineGameResponse(); isRequestingOnlineGame = true; while (!waitingResponse.IsReady && !isOnlineGameRequestCancelled) { waitingResponse = await proxy.OnlineGameRequest(myOnlineId); myOnlineId = waitingResponse.PlayerId; //Quit requesting online game when isOnlineGameRequestCancelled is true //(user is not in online game page) if (isOnlineGameRequestCancelled) { break; } if (waitingResponse.IsReady) { StartGameResponse startGameResponse = await proxy.ConfirmToPlay(waitingResponse.PlayerId); if (startGameResponse.IsConfirmed) { if (startGameResponse.YourTurn) { players.Add(playerFactory.Create(PlayerType.Human, waitingResponse.PlayerId)); players.Add(playerFactory.Create(PlayerType.OnlinePlayer, 0)); } else { players.Add(playerFactory.Create(PlayerType.OnlinePlayer, 0)); players.Add(playerFactory.Create(PlayerType.Human, waitingResponse.PlayerId)); } } else { waitingResponse.IsReady = false; } } } isRequestingOnlineGame = false; return(players); }
public async Task <OnlineGameResponse> OnlineGameRequest(int playerId) { OnlineGameResponse response; IPlayer rivalPlayer; IPlayer player = Logic.NewPlayer(playerId); Logger.Info("Player{0} requested to play", player.OnlineId); Logic.WaitingPlayers.Add(player); if (Logic.WaitingPlayers.TryTake(out rivalPlayer, 5000, rp => rp.OnlineId != player.OnlineId)) { Logger.Info("Rival (Player{0}) was found for Player{1}", rivalPlayer.OnlineId, player.OnlineId); List <IPlayer> players = RandomGenerator.Next(2) == 0 ? new List <IPlayer>() { rivalPlayer, player } : new List <IPlayer>() { player, rivalPlayer }; if (Logic.NewGame(players)) { Logger.Info("New game created for: Player{0} (will start) and Player{1}.", players[0].OnlineId, players[1].OnlineId); } response = new OnlineGameResponse(player.OnlineId, true); } else { Logger.Info("Rival wasn't found for Player{0}", player.OnlineId); Logic.WaitingPlayers.Remove(player); response = new OnlineGameResponse(player.OnlineId, false); } Logger.Info("OnlineGameResponse was send back to client: Player{0}", player.OnlineId); return(await Task.Factory.StartNew(() => response)); }