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 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); } } }
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; }
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); }
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); } }
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; }
private void GetNextPresident(ServerResponse response) { var president = gameState.GetNextPresident(); SetPresident(response, president); }
internal void SetPresident(ServerResponse response, Player president) { gameState.SetPresident(president); gameState.SetChancellor(null); response.AddObject(new NetworkPlayerObject(ServerCommands.AnnouncePresident, president)); }
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(); }
internal void SendResponse(ServerResponse response) { foreach (var player in connectedClients.Keys) response.GetResponse(player)?.Send(connectedClients[player]); }