コード例 #1
0
        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);
        }
コード例 #2
0
        private void PlayPolicy(CardPolicy policy, ServerResponse response)
        {
            gameState.PlayPolicy(policy);
            response.AddObject(new NetworkCardObject(ServerCommands.ChancellorDiscarded));
            response.AddObject(new NetworkCardObject(ServerCommands.CardPlayed, policy));
            if(policy is CardPolicyLiberal)
            {
                if (!CheckCardPlayedWinCondition(response))
                    GetNextPresident(response);
            }
            else
            {
                if (!CheckCardPlayedWinCondition(response))
                {
                    if (gameState.FascistActions[gameState.FascistsCardsPlayed - 1] != null)
                    {
                        var fascistId = gameState.FascistsCardsPlayed - 1;
                        var fascistAction = gameState.FascistActions[fascistId];
                        response.AddObject(new NetworkByteObject(ServerCommands.PresidentAction, (byte)fascistId));
                        response.AddObject(fascistAction.GetPresidentObject(gameState), gameState.President);
                        gameState.AwaitingPresidentAction = fascistAction.ServerResponse;
                    }
                    else
                        GetNextPresident(response);
                }
            }

        }
コード例 #3
0
        private bool CheckCardPlayedWinCondition(ServerResponse response)
        {

            if (gameState.LiberalCardsPlayed == 5)
            {
                AnnounceWin(response, false, "The liberals have played 5 liberal policies");
                return true;
            }
            if (gameState.FascistsCardsPlayed == 6)
            {
                AnnounceWin(response, true, "The fascists have played 6 fascist policies");
                return true;
            }
            return false;
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 private void AnnounceVotes(ServerResponse response)
 {
     bool passed = gameState.VotePassed();
     response.AddObject(new NetworkVoteResultObject(ServerCommands.AnnounceVotes, gameState.GetVotes(), passed ? Vote.Ja : Vote.Nein));
     gameState.PreviousGovernmentElected = passed;
     if (gameState.ElectionTracker == 3)
     {
         response.AddObject(new NetworkObject(ServerCommands.ResetElectionTracker));
         gameState.ResetElectionTracker();
     }
     if (passed)
     {
         if (gameState.ElectionTracker != 0)
         {
             response.AddObject(new NetworkObject(ServerCommands.ResetElectionTracker));
             gameState.ResetElectionTracker();
         }
         if (gameState.FascistsCardsPlayed >= 3)
         {
             if (gameState.Chancellor.Hand.Role.IsHitler)
             {
                 AnnounceWin(response, true, "Hitler is chancellor");
                 return; //no point in doing the rest, the fascists have won anyway
             }
             response.AddObject(new NetworkPlayerObject(ServerCommands.NotHitler, gameState.Chancellor));
         }
         var cards = gameState.GetPolicyCards();
         gameState.CurrentlyPicked = cards;
         response.AddObject(new NetworkByteObject(ServerCommands.PolicyCardsDrawn, 3));
         response.AddObject(new NetworkCardObject(ServerCommands.PresidentPickPolicyCard, cards), gameState.President);
         gameState.PresidentPicking = true;
     }
     else
     {
         if (IncrementElectionTracker(response)) return;
         GetNextPresident(response);
     }
 }
コード例 #6
0
 private bool IncrementElectionTracker(ServerResponse response)
 {
     gameState.IncrementElectionTracker();
     response.AddObject(new NetworkObject(ServerCommands.IncrementElectionTracker));
     if (gameState.ElectionTracker == 3)
     {
         //gameState.ResetElectionTracker();
         response.AddObject(new NetworkByteObject(ServerCommands.PolicyCardsDrawn, 1));
         var card = gameState.GetPolicyCards(1);
         //PlayPolicy(card[0], response);
         response.AddObject(new NetworkCardObject(ServerCommands.CardPlayed, card));
         gameState.PlayPolicy(card[0]);
         return CheckCardPlayedWinCondition(response);
     }
     return false;
 }
コード例 #7
0
 private void GetNextPresident(ServerResponse response)
 {
     var president = gameState.GetNextPresident();
     SetPresident(response, president);
 }
コード例 #8
0
 internal void SetPresident(ServerResponse response, Player president)
 {
     gameState.SetPresident(president);
     gameState.SetChancellor(null);
     response.AddObject(new NetworkPlayerObject(ServerCommands.AnnouncePresident, president));
 }
コード例 #9
0
 private void AnnounceWin(ServerResponse response, bool fascistWin, string reason)
 {
     var playerCount = gameState.PlayerCount;
     for (var i = 0; i < playerCount; i++)
         response.AddObject(new NetworkRevealRoleObject(gameState.SeatedPlayers[i]));
     response.AddObject(new NetworkObject(fascistWin ? ServerCommands.FascistWin : ServerCommands.LiberalWin, reason));
     gameState.EndGame();
 }
コード例 #10
0
ファイル: Server.cs プロジェクト: sander3991/SecretHitler
 internal void SendResponse(ServerResponse response)
 {
     foreach (var player in connectedClients.Keys)
         response.GetResponse(player)?.Send(connectedClients[player]);
 }