Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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));
            }
        }
Exemplo n.º 5
0
        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");
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
 public void StartGame(User user)
 {
     //TODO: start with normal state
     ChangeState(GameState.State.HaveNoPrimaryWord);
     BroadcastMessage(GameMessage.UserRoleChangedMessage(user, User.Role.Host));
 }