private void GetEnemyShot(ResponseMessage msg) { if (IsPlayerGoing) { return; } var result = _serializer.DeserializeDynamic(msg.Text); switch ((string)result["message_type"]) { case "get_enemy_shot": var enemyShot = _serializer.DeserializeObject <GetEnemyShot>(result); OnGetEnemyShot?.Invoke(this, new(enemyShot)); break; case "get_enemy_answer": var enemyAnswer = _serializer.DeserializeObject <GetEnemyAnswer>(result); OnGetEnemyAnswer?.Invoke(this, new(enemyAnswer)); break; case "player_turn": IsPlayerGoing = true; OnPlayerTurn?.Invoke(this, EventArgs.Empty); break; default: throw new("Unexpected message type"); } }
public async Task <ConnectionCode> CreateGame(Player player, ImmutableArray <Ship> ships) { var completionSource = new TaskCompletionSource <ConnectionCode>(); IDisposable subscription = null; subscription = _socket.MessageReceived.Subscribe(msg => { var connectionResult = _serializer.DeserializeDynamic(msg.Text); switch ((string)connectionResult["message_type"]) { case "connection_code": var connectionCode = _serializer.DeserializeObject <ConnectionCode>(connectionResult); completionSource.SetResult(connectionCode); break; case "game_connected": var result = _serializer.DeserializeObject <ConnectionToGameResult>(connectionResult); subscription.Dispose(); _reconnectSubscription.Dispose(); GameCreated?.Invoke(this, new(_socket, result.Go, result.Enemy)); break; default: throw new("Unexpected message type"); } }); await Connect(); var message = new CreateGameMessage(new(player, ships, null)); var text = _serializer.Serialize(message); _socket.Send(text); return(await completionSource.Task); }