/// <inheritdoc />
        public async Task OnCommandAsync(PacketConnection context, string argument)
        {
            _game.ThrowIfNotHost(Command);
            _game.ThrowIfWrongState(Command, GameState.Handshake);

            SetNameFromArgument(argument);

            await context.SendResponseAsync(ResponseCode.Handshake, _game.LocalPlayer.Name);

            _game.GameState = GameState.Idle;
        }
Esempio n. 2
0
        /// <inheritdoc />
        public Task OnCommandAsync(PacketConnection context, string argument)
        {
            _game.ThrowIfNotHost(Command);
            _game.ThrowIfWrongState(Command, GameState.Idle);

            _game.GameState    = GameState.InGame;
            _game.IsLocalsTurn = _random.NextBool();

            if (_game.IsLocalsTurn)
            {
                return(context.SendResponseAsync(ResponseCode.StartHost, "Host starts"));
            }
            else
            {
                return(context.SendResponseAsync(ResponseCode.StartClient, "Client starts"));
            }
        }
        /// <inheritdoc />
        public Task OnCommandAsync(PacketConnection context, string argument)
        {
            _game.ThrowIfWrongState(Command, GameState.InGame);
            _game.ThrowIfLocalsTurn();
            if (WaitingForResponseAt.HasValue)
            {
                throw new ProtocolException(ResponseCode.SequenceError, $"Sequence error: Awaiting FIRE response for {WaitingForResponseAt}");
            }

            (Coordinate coordinate, string message) = GetCoordinate(argument);

            Task responseTask = FireAndSendResponse(context, coordinate, out Ship ship);

            _game.IsLocalsTurn = true;

            OnTakenFire(new FireOutcome(coordinate, ship));
            if (!string.IsNullOrEmpty(message))
            {
                OnTakenFireMessage(message);
            }

            return(responseTask);
        }