Exemple #1
0
        public void EndTurn()
        {
            _logger.Log("Ending turn...");
            TurnInfo turnInfo = _GameState.GetTurn();

            if (turnInfo == null)
            {
                Debug.WriteLine("Received null turnInfo from GameState");
                return;
            }

            //Use same ID for all turnInfo messages for this turn
            string msgID = _TurnInfoMessageID;

            _TurnInfoMessageNumber++;
            TurnInfoMessage turnInfoMsg = new TurnInfoMessage {
                TurnInfo = turnInfo, Sender = _UniqueID, MsgID = msgID
            };

            byte[] turnInfoMsgBytes = JsonSerializer.SerializeToUtf8Bytes(turnInfoMsg);

            bool       turnApproved    = false;
            List <int> ApprovedPlayers = new List <int>();                             //Players who have approved this turn
            int        requiredNumberOfPlayerApprovals = _LobbyInfo.Players.Count - 1; //-1 because player does not approve local turn

            //TODO, implement some time here? now sends turn max 10 times then fails
            for (int i = 0; i < 10; i++)
            {
                _NetworkComms.SendMessage(turnInfoMsgBytes);

                //Sleep a bit to give others time to check turn and response
                Thread.Sleep(500);

                bool responseAvailable;
                do
                {
                    responseAvailable = ResponseMessages.TryDequeue(out ResponseMessage response);

                    if (responseAvailable == false)
                    {
                        continue;
                    }

                    //Check if response is to our message
                    if (response.Receiver != _UniqueID)
                    {
                        Debug.WriteLine("Receive msg error: response was to some other message"); continue;
                    }

                    //Check if response is to same message as we sent
                    if (response.ReceivedMsgID != msgID)
                    {
                        Debug.WriteLine("Receive msg error: message ID did not match"); continue;
                    }

                    //Log message
                    _logger.Log("Received response to turn info message from " + response.Sender);

                    //Check if this player is in lobby
                    if (IsThisPlayerInLobby(response.Sender) == false)
                    {
                        Debug.WriteLine("Receive msg error: player not in lobby"); continue;
                    }

                    //Check if turn was approved
                    if (response.Approve == false)
                    {
                        Debug.WriteLine("Receive msg error: player did not approve turn, reason: " + response.ErrorString); continue;
                    }

                    //Check if this player has already approved turn
                    if (ApprovedPlayers.Contains(response.Sender) == true)
                    {
                        Debug.WriteLine("Error: player has already approved turn"); continue;
                    }

                    _logger.Log("Other player approved turn, PlayerID: " + response.Sender);
                    ApprovedPlayers.Add(response.Sender);

                    //Check if it was last required approvement
                    if (ApprovedPlayers.Count == requiredNumberOfPlayerApprovals)
                    {
                        break;
                    }
                } while (responseAvailable);

                if (ApprovedPlayers.Count == requiredNumberOfPlayerApprovals)
                {
                    turnApproved = true;
                    break;
                }
            }

            if (turnApproved)
            {
                //All good
                _logger.Log("Turn ended successfully");
                //Clear unnessary responses
                ResponseMessages.Clear();
            }
            else
            {
                _logger.Log("Ending turn FAILED, did not receive approvement from other players");
            }
        }