public void LaunchGame()
        {
            var playerCount = PlayerCount;
            var fascistCount = playerCount % 2 == 0 ? playerCount / 2 - 1 : playerCount / 2;
            var liberalCount = playerCount - fascistCount;

            //Generate Decks

            PlayerHand[] decks = new PlayerHand[playerCount];
            var j = 0;
            for (var i = 0; i < fascistCount; i++, j++)
                decks[j] = new PlayerHand(new CardSecretRoleFascist(i), new CardMembershipFascist());
            for (var i = 0; i < liberalCount; i++, j++)
                decks[j] = new PlayerHand(new CardSecretRoleLiberal(i), new CardMembershipLiberal());

            Player hitler = null;
            var fascists = new List<Player>();
            //Shuffle and hand out decks
            decks.Shuffle();
            var sendMsgs = new ServerResponse();
            StartGame();
            for (var i = 0; i < playerCount; i++)
            {
                var player = SeatedPlayers[i];
                player.Dead = false;
                player.Hand = decks[i];
                var sendToPlayer = new NetworkCardObject(ServerCommands.AnnounceCard, decks[i].Membership, decks[i].Role, decks[i].Yes, decks[i].No);
                if (decks[i].Role.IsFascist)
                    fascists.Add(player);
                if (decks[i].Role.IsHitler)
                    hitler = player;
                sendMsgs.AddObject(sendToPlayer, player);
                //Announce decks to player
            }
            var rand = new Random(Environment.TickCount * 5);
            var president = SeatedPlayers[rand.Next(playerCount)];
            SetPresident(president);
            var presidentMsg = new NetworkPlayerObject(ServerCommands.AnnouncePresident, president);
            sendMsgs.AddObject(presidentMsg);
            //Announce Fascists to other party members
            for (var i = 0; i < playerCount; i++)
            {
                var player = SeatedPlayers[i];
                if (player.Hand.Membership.IsFascist && (playerCount <= 6 || !player.Hand.Role.IsHitler))
                    foreach (Player announcePlayer in fascists)
                        if (player != announcePlayer)
                            sendMsgs.AddObject(new NetworkRevealRoleObject(announcePlayer), player);
            }
            Server.SendResponse(sendMsgs);
            FascistActions = FascistAction.GetActionsForPlayers(playerCount);
        }
        private static AuthoritativeInput <TInput, TOutput> GetInputComponentFromMessage(NetworkWriter writer, out byte[] data)
        {
            short conn = writer.ReadInt16();

            NetworkPlayerObject player = NetworkController.Instance.Scene.GetPlayer(conn);

            data = null;

            if (player == null)
            {
                return(null);
            }

            GameObject playerObj = player.GameObject;

            data = writer.ReadBytes();

            return(playerObj.GetComponent <AuthoritativeInput <TInput, TOutput> >());
        }
        internal void HandleMessage(NetworkObject request, TcpClient sentBy, Player player)
        {
            var response = new ServerResponse();
            response.AddObject(new NetworkObject(ServerCommands.OK, ID: request.ID), player);
            switch (request.Command)
            {
                case ServerCommands.Message:
                    var msgResponse = request as NetworkMessageObject;
                    response.AddObject(new NetworkMessageObject(msgResponse.Username, msgResponse.Message, sendToServer: false));
                    break;
                case ServerCommands.GetGameState:
                    response.AddObject(new NetworkGameStateObject(ServerCommands.SendGameState, gameState), player);
                    break;
                case ServerCommands.AnnounceChancellor:
                    var playerResponse = request as NetworkPlayerObject;
                    if (gameState.MayElectPlayer(playerResponse.Player))
                    {
                        gameState.ResetVotes();
                        gameState.AreVoting = true;
                        gameState.SetChancellor(playerResponse.Player);
                        response.AddObject(playerResponse);
                    }
                    break;
                case ServerCommands.CastVote:
                    if (!gameState.AreVoting) break;
                    var boolObj = request as NetworkBoolObject;
                    gameState.SetVote(player, boolObj.Value);
                    var playerVoted = new NetworkPlayerObject(ServerCommands.PlayerVoted, player);
                    response.AddObject(playerVoted);
                    //multObj.AddObject(playerVoted);
                    if (gameState.EveryoneVoted())
                    {
                        gameState.AreVoting = false;
                        //everyone voted
                        AnnounceVotes(response);
                    }
                    break;
                case ServerCommands.PresidentPolicyCardPicked:
                    const int vetoPowerUnlocked  = 5;
                    if (player != gameState.President || !gameState.PresidentPicking) break;
                    gameState.PresidentPicking = false;
                    var pickPolicyCard = request as NetworkByteObject;
                    gameState.DiscardPile.AddCard(gameState.CurrentlyPicked[pickPolicyCard.Value]);
                    response.AddObject(new NetworkObject(ServerCommands.PresidentDiscarded));
                    var chancellorCards = new CardPolicy[gameState.FascistsCardsPlayed >= vetoPowerUnlocked ? 3 : 2];
                    var j = 0;
                    for (var i = 0; i < 3; i++)
                        if (i != pickPolicyCard.Value)
                            chancellorCards[j++] = gameState.CurrentlyPicked[i];
                    if (gameState.FascistsCardsPlayed == vetoPowerUnlocked)
                        chancellorCards[2] = new CardPolicyVeto();
                    gameState.CurrentlyPicked = chancellorCards;
                    response.AddObject(new NetworkCardObject(ServerCommands.ChancellorPickPolicyCard, chancellorCards), gameState.Chancellor);
                    gameState.ChancellorPicking = true;
                    break;
                case ServerCommands.ChancellorPolicyCardPicked:
                    if (player != gameState.Chancellor || !gameState.ChancellorPicking) break;
                    gameState.ChancellorPicking = false;
                    var pickCard = request as NetworkByteObject;
                    gameState.DiscardPile.AddCard(gameState.CurrentlyPicked[pickCard.Value]);
                    var playCard = gameState.CurrentlyPicked[Math.Abs(pickCard.Value - 1)];
                    gameState.CurrentlyPicked = null;
                    PlayPolicy(playCard, response);
                    break;
                case ServerCommands.PresidentActionExamineResponse:
                    if (player != gameState.President || gameState.AwaitingPresidentAction != request.Command) break;
                    GetNextPresident(response);
                    break;
                case ServerCommands.PresidentActionKillResponse:
                    if (player != gameState.President || gameState.AwaitingPresidentAction != request.Command) break;
                    var killPlayer = request as NetworkPlayerObject;
                    response.AddObject(new NetworkPlayerObject(ServerCommands.KillPlayer, killPlayer.Player));
                    gameState.KillPlayer(killPlayer.Player);
                    if (killPlayer.Player.Hand.Role.IsHitler)
                    {
                        AnnounceWin(response, false, "Hitler was killed");
                        break;
                    }
                    else
                        response.AddObject(new NetworkPlayerObject(ServerCommands.NotHitler, killPlayer.Player));
                    GetNextPresident(response);
                    break;

                case ServerCommands.PresidentActionChoosePresidentResponse:
                    if (player != gameState.President || gameState.AwaitingPresidentAction != request.Command) break;
                    var presObj = request as NetworkPlayerObject;
                    if (presObj.Player == gameState.President) break;
                    var presidentAfterChoice = gameState.GetNextPresident();
                    SetPresident(response, presObj.Player);
                    gameState.SetNextPresident(presidentAfterChoice);
                    break;
                case ServerCommands.PresidentActionInvestigatePresidentResponse:
                    if (player != gameState.President || gameState.AwaitingPresidentAction != request.Command) break;
                    var investigate = request as NetworkPlayerObject;
                    if (investigate.Player == player) break;
                    response.AddObject(new NetworkNewPlayerObject(ServerCommands.RevealMembership, investigate.Player, investigate.Player.Hand.Membership.IsFascist ? 1 : 0), player);
                    GetNextPresident(response);
                    break;
                case ServerCommands.ChancellorRequestVeto:
                    if (player != gameState.Chancellor) break;
                    response.AddObject(new NetworkObject(ServerCommands.PresidentConfirmVeto));
                    break;
                case ServerCommands.PresidentRequestVetoAllowed:
                    if (player != gameState.President) break;
                    var vetoAllowed = (request as NetworkBoolObject).Value;
                    response.AddObject(new NetworkBoolObject(ServerCommands.AnnounceVetoResult, vetoAllowed));
                    if (vetoAllowed)
                    {
                        var currentlyPicked = gameState.CurrentlyPicked;

                        //discard all the cards
                        gameState.CurrentlyPicked = null;
                        for (var i = 0; i < currentlyPicked.Length - 1; i++) //the last card is the veto card
                        {
                            gameState.DiscardPile.AddCard(currentlyPicked[i]);
                            response.AddObject(new NetworkCardObject(ServerCommands.ChancellorDiscarded));
                        }
                        //Increment the election tracker, veto passed
                        IncrementElectionTracker(response);
                        //The next president is elected because veto ends the current government
                        GetNextPresident(response);
                    }
                    else
                    {
                        var newArr = new CardPolicy[gameState.CurrentlyPicked.Length - 1];
                        for (var i = 0; i < gameState.CurrentlyPicked.Length - 1; i++)
                            newArr[i] = gameState.CurrentlyPicked[i];
                        gameState.CurrentlyPicked = newArr;
                    }
                    break;
            }
            server.SendResponse(response);
            OnReceive?.Invoke(player, request);
        }
Exemple #4
0
 internal void PickNextPresident(Player obj)
 {
     var playerObj = new NetworkPlayerObject(ServerCommands.PresidentActionChoosePresidentResponse, obj);
     new SendMsgHandler(playerObj, this);
 }
Exemple #5
0
 public void ChooseChancellor(Player player)
 {
     var playerObj = new NetworkPlayerObject(ServerCommands.AnnounceChancellor, player);
     new SendMsgHandler(playerObj, this);
 }
 public void NetworkPlayerObject()
 {
     var player = Player.GetPlayer("Sander");
     var decoder = new NetworkPlayerObject.PlayerObjectReader();
     var obj = new NetworkPlayerObject(ServerCommands.AnnouncePresident, player);
     var bytes = decoder.GenerateByteStream(obj);
     var playerObj = decoder.GenerateObject(bytes, false);
     Assert.IsInstanceOfType(playerObj, typeof(NetworkPlayerObject));
     Assert.AreSame(player, (playerObj as NetworkPlayerObject).Player);
     CompareDefaultObject(obj, playerObj);
 }