public void LeaveRoom(User user) { lock (gameState) { gameState.Users.Remove(user); } if (user.role == User.Role.Host) { ChangeState(GameState.State.GameOver); ResetRoles(); } else { if (user.role == User.Role.Qwestioner) { ChangeState(GameState.State.HaveNoCurrentWord); } BroadcastMessage(GameMessage.UserRoleChangedMessage(user, User.Role.None)); } if (gameState.Users.Count < 3 && gameState.state != GameState.State.NotStarted) { ChangeState(GameState.State.GameOver); ResetRoles(); } BroadcastMessage(GameMessage.UserLeftRoomMessage(user)); }
public void AcceptCurrentWordVariant(User user, string word) { if (user.role != User.Role.None) { LogSaver.Log("!!! AcceptCurrentWordVariant invoked user " + user.Id + " role " + user.role.ToString()); GameException.Throw("Вы не можете так делать"); } bool epicWin = false; // угадал primaryWord lock (gameState) { if (gameState.UsedWords.Contains(word)) { GameException.Throw("Это слово уже использовалось"); } if (!word.StartsWith(gameState.PrimaryWordKnownLetters)) { GameException.Throw("Слово должно начинаться с открытых букв"); } if (word == gameState.PrimaryWord) { epicWin = true; } else { gameState.VarOfCurWord = word; user.role = User.Role.Contacter; } } if (epicWin) { ResetRoles(); ChangeState(GameState.State.GameOver); } else { BroadcastMessage(GameMessage.UserRoleChangedMessage(user, User.Role.Contacter)); BroadcastMessage(GameMessage.VarOfCurWordChangedMessage(word)); ChangeState(GameState.State.HaveCurrentWordVariant); } }
public void AcceptQuestion(User user, string question, string word) { if (user.role != User.Role.None) { LogSaver.Log("!!! AcceptQuestion invoked user " + user.Id + " role " + user.role.ToString()); GameException.Throw("Вы не можете этого делать!"); } bool epicWin = false; //угадал primaryWord lock (gameState) { gameState.Question = question; if (!word.StartsWith(gameState.PrimaryWordKnownLetters)) { GameException.Throw("Слово должно начинаться с открытых букв"); } if (word == gameState.PrimaryWord) { epicWin = true; } else { gameState.CurrentWord = word; user.role = User.Role.Qwestioner; } } if (epicWin) { ResetRoles(); ChangeState(GameState.State.GameOver); } else { BroadcastMessage(GameMessage.QuestionAsked(question, word)); BroadcastMessage(GameMessage.UserRoleChangedMessage(user, User.Role.Qwestioner)); ChangeState(GameState.State.HaveCurrentWord); } }
private void ResetRoles() { User host, questioner, contacter; lock (gameState) { host = gameState.Users.SingleOrDefault(user => user.role == User.Role.Host); if (host != null) { host.role = User.Role.None; } questioner = gameState.Users.SingleOrDefault(user => user.role == User.Role.Qwestioner); if (questioner != null) { questioner.role = User.Role.None; } contacter = gameState.Users.SingleOrDefault(user => user.role == User.Role.Contacter); if (contacter != null) { contacter.role = User.Role.None; } } if (host != null) { BroadcastMessage(GameMessage.UserRoleChangedMessage(host, User.Role.None)); } if (contacter != null) { BroadcastMessage(GameMessage.UserRoleChangedMessage(contacter, User.Role.None)); } if (questioner != null) { BroadcastMessage(GameMessage.UserRoleChangedMessage(questioner, User.Role.None)); } }
private void VotingForPlayersWordsTimeout() { LogSaver.Log("VotingForPlayersWords Timeout"); User contacter, questioner; bool openLetter = false; bool winGame = false; bool CurrentWordAccepted = false; bool VarOfCurWordAccepted = false; lock (gameState) { CurrentWordAccepted = gameState.votings[0].Accepted(gameState.Users.Count); VarOfCurWordAccepted = gameState.votings[1].Accepted(gameState.Users.Count); // добавить в список используемых if (CurrentWordAccepted) { gameState.UsedWords.Add(gameState.CurrentWord); } if (VarOfCurWordAccepted) { gameState.UsedWords.Add(gameState.VarOfCurWord); } if (CurrentWordAccepted && VarOfCurWordAccepted) // игроки выиграли { gameState.NumberOfOpenChars++; if (gameState.NumberOfOpenChars == gameState.PrimaryWord.Length) { winGame = true; } else { openLetter = true; } } // сбросить роли contacter = gameState.Users.Single(user => user.role == User.Role.Contacter); contacter.role = User.Role.None; questioner = gameState.Users.Single(user => user.role == User.Role.Qwestioner); questioner.role = User.Role.None; } //разослать изменения BroadcastMessage(GameMessage.UserRoleChangedMessage(contacter, User.Role.None)); BroadcastMessage(GameMessage.UserRoleChangedMessage(questioner, User.Role.None)); //Сообщить о добавленых словах if (CurrentWordAccepted) { BroadcastMessage(GameMessage.UsedWordAddedMessage(gameState.CurrentWord)); // TODO: а это безопасно? } if (VarOfCurWordAccepted) { BroadcastMessage(GameMessage.UsedWordAddedMessage(gameState.VarOfCurWord)); } if (openLetter) { BroadcastMessage(GameMessage.PrimaryWordCharOpened()); } if (winGame) { ChangeState(GameState.State.GameOver); } else { ChangeState(GameState.State.HaveNoCurrentWord); } LogSaver.Log("VotingForPlayersWords Timeout end"); }
private void VotingForHostWordTimeout() { LogSaver.Log("VotingForChiefWord Timeout"); bool openLetter = false; bool winGame = false; bool ChiefWord = false; User questioner, contacter; lock (gameState) { ChiefWord = gameState.votings[0].Accepted(gameState.Users.Count); if (ChiefWord) { gameState.UsedWords.Add(gameState.ChiefWord); } else { gameState.NumberOfOpenChars++; if (gameState.NumberOfOpenChars == gameState.PrimaryWord.Length) { winGame = true; } else { openLetter = true; } } questioner = gameState.Users.SingleOrDefault(user => user.role == User.Role.Qwestioner); contacter = gameState.Users.SingleOrDefault(user => user.role == User.Role.Contacter); } if (questioner != null) { questioner.role = User.Role.None; BroadcastMessage(GameMessage.UserRoleChangedMessage(questioner, User.Role.None)); } if (contacter != null) { contacter.role = User.Role.None; BroadcastMessage(GameMessage.UserRoleChangedMessage(contacter, User.Role.None)); } if (ChiefWord) { BroadcastMessage(GameMessage.UsedWordAddedMessage(gameState.ChiefWord)); } if (openLetter) { BroadcastMessage(GameMessage.PrimaryWordCharOpened()); } if (winGame) { ChangeState(GameState.State.GameOver); } else { ChangeState(GameState.State.HaveNoCurrentWord); } }
public void StartGame(User user) { //TODO: start with normal state ChangeState(GameState.State.HaveNoPrimaryWord); BroadcastMessage(GameMessage.UserRoleChangedMessage(user, User.Role.Host)); }