private void gameOver(DebugGameRoom room)
        {
            ServerLogger.LogDebug("game real over", room);

            myServerManager.SendUpdateState(room);

            myServerManager.SendGameOver(room);

            rooms.Remove(room);
            room.Fiber.Reset();
        }
        private void askPlayerQuestion(DebugGameRoom room, DebugFiberYieldResponse answer)
        {
            gameData.TotalQuestionsAnswered++;

            var answ = answer.Question;

            if (answ == null)
            {
                ServerLogger.LogDebug("game question over", room);
                myServerManager.SendGameOver(room);
                room.Fiber.Run<DebugFiberYieldResponse>();
                //     profiler.takeSnapshot('game over ' + room.roomID);
                return;
            }
            askQuestion(answ, room);
            //ServerLogger.Log(gameData.toString());

            var dt = new DateTime();
            var then = dt.GetMilliseconds();
            //ServerLogger.Log(then - now + " Milliseconds");
            //  ServerLogger.Log(gameData.TotalQuestionsAnswered / ((dt.GetTime() - startTime.GetTime()) / 1000d) + " Answers per seconds", LogLevel.DebugInformation);
        }
        private void breakGameExecution(DebugGameRoom room, DebugFiberYieldResponse response)
        {

            var ganswer = new DebugGameBreakModel(response.LineNumber, response.Value);

            myServerManager.SendDebugBreak(room, ganswer);
        }
        private void logGameConsoleLine(DebugGameRoom room, DebugFiberYieldResponse answer)
        {
            var answ2 = room.Fiber.Run<DebugFiberYieldResponse>();
            processGameResponse(room, answ2);

            if (!room.Game.CardGame.Emulating)
            { 
                myServerManager.SendDebugLog(room, new DebugGameLogModel(answer.Contents));
            }
        }
        private void processGameResponse(DebugGameRoom room, DebugFiberYieldResponse response)
        {
            if (response == null)
            {
                ServerLogger.LogDebug("game request over", room);

                myServerManager.SendGameOver(room);
                room.Fiber.Run<DebugFiberYieldResponse>();
                rooms.Remove(room);
                room.Unwind(room.Players);
                return;
            }


            switch (response.Type)
            {
                case DebugFiberYieldResponseType.AskQuestion:
                    askPlayerQuestion(room, response);
                    break;

                case DebugFiberYieldResponseType.PlayersLeft:
                    didPlayersLeave(room, response);
                    break;
                case DebugFiberYieldResponseType.GameOver:
                    gameOver(room);
                    break;
                case DebugFiberYieldResponseType.Log:
                    logGameConsoleLine(room, response);
                    break;
                case DebugFiberYieldResponseType.VariableLookup:
                    Console.WriteLine("vlook  " + Json.Stringify(response));
                    breakGameExecution(room, response);
                    break;
                case DebugFiberYieldResponseType.Break:
                    Console.WriteLine("broke  " + Json.Stringify(response));
                    breakGameExecution(room, response);
                    break;
            }
        }
        private void didPlayersLeave(DebugGameRoom room, DebugFiberYieldResponse response)
        {
            room.Fiber.Run<DebugFiberYieldResponse>(room.PlayersLeft);

            room.PlayersLeft.Clear();
        }
        private void startGame(DebugGameRoom room)
        {
            if (!room.Started)
            {
                myServerManager.SendGameStarted(room);

                room.Started = true;
            }


            var answer = room.Fiber.Run<DebugFiberYieldResponse>(room.Players);
            processGameResponse(room, answer);
        }
 public void SendGameStarted(DebugGameRoom room)
 {
     SendMessageToTester(room, "Area.Debug.Started", new GameRoomModel() { RoomID = room.RoomID });
 }
 public void SendDebugBreak(DebugGameRoom room, DebugGameBreakModel ganswer)
 {
     qManager.SendMessage(room.DebuggingSender.Gateway, "Area.Debug.Break", room.DebuggingSender, ganswer);
 }
        public void CreateGame(UserLogicModel user, CreateDebugGameRequest data)
        {
            ServerLogger.LogDebug("--debug game created ", data);
            dataManager.SiteData.Game_GetGamesByName(data.GameName, (game) =>
            {
                if (game == null)
                {
                    ServerLogger.LogDebug("--game not found " + data.GameName, user);
                    return;
                }
                ServerLogger.LogDebug("--game found " + game.Name, game);

                DebugGameRoom room;
                rooms.Add(room = new DebugGameRoom());
                room.MaxUsers = data.NumberOfPlayers; //todo idk
                room.GameType = data.GameName;
                room.Started = false;
                for (int i = 0; i < data.NumberOfPlayers; i++)
                {
                    room.Players.Add(user);

                }
                room.DebuggingSender = user;
                
                GameObject evaluated_game = null;
                Script.Eval("evaluated_game=" + processor.ProcessJSFile(game.GameCode.Code));
                GameObject gameObject;
                gameObject = evaluated_game;


                room.Fiber = CreateFiber(room, gameObject, true, game, data.Breakpoints);
                room.Unwind = players =>
                {
                    gameData.FinishedGames++;
                    ServerLogger.LogDebug("--game closed", game);
                };
                room.PlayerLeave += (player) =>
                {
                    //todo laeve player api in the game
                    ////i think an action that it calls

                    room.Players.Remove(player);
                    room.PlayersLeft.Add(player);


                    if (room.Players.Count == 0)
                    { 
                        rooms.Remove(room);
                        room.Fiber.Reset();
                    }
                };

                myServerManager.RegisterGameServer(user);


                startGame(room);
            });
        }
 public void SendDebugLog(DebugGameRoom room, DebugGameLogModel ganswer)
 {
     qManager.SendMessage(room.DebuggingSender.Gateway, "Area.Debug.Log", room.DebuggingSender, ganswer);
 }
 public void SendUpdateState(DebugGameRoom room)
 {
     SendMessageToTester(room, "Area.Debug.UpdateState", new Compressor().CompressText(Json.Stringify(room.Game.CardGame.CleanUp())));
 }
        public void SendGameOver(DebugGameRoom room) 
        {
            SendMessageToTester(room, "Area.Debug.GameOver", "a");

        }
        private void askQuestion(CardGameQuestion answ, DebugGameRoom room)
        {
            var user = getPlayerByUsername(room, answ.User.UserName);
            myServerManager.SendAskQuestion(user, new DebugGameSendAnswerModel(answ.Question, answ.Answers));
            myServerManager.SendUpdateState(room);


            ServerLogger.LogDebug("Ask question   ", answ);
        }
        private Fiber<List<UserLogicModel>> CreateFiber(DebugGameRoom room, GameObject gameObject, bool emulating, GameDataModel game, List<int> breakpoints)
        {
            return new Fiber<List<UserLogicModel>>(players =>
            {
                if (players == null || players.Count == 0) return true;
                room.Players = players;
                ServerLogger.LogDebug("game started", room);
                GameObject sev = null;

                Script.Eval("sev = new gameObject();");
                room.PlayersLeft = new List<UserLogicModel>();
                sev.CardGame=new GameCardGame();
                sev.CardGame.Emulating = emulating;
                room.Game = sev;
                sev.CardGame.DebugInfo = new DebugInfo() { Breakpoints = breakpoints ?? new List<int>() };
                sev.CardGame.SetEmulatedAnswers(room.EmulatedAnswers);
                sev.CardGame.SetPlayers(players);
                sev.CardGame.Size = new Size(game.GameLayout.Width, game.GameLayout.Height);

                foreach (var gameTextModel in game.GameLayout.Texts)
                {
                    sev.CardGame.TextAreas.Add(new GameCardGameTextArea(new GameCardGameTextAreaOptions()
                    {
                        X = gameTextModel.Left,
                        Y = gameTextModel.Top,
                        Name = gameTextModel.Name,
                        Text = gameTextModel.Text,

                    }));
                }


                foreach (var gameSpaceModel in game.GameLayout.Spaces)
                {
                    sev.CardGame.Spaces.Add(new CardGameTableSpace(new CardGameTableSpaceOptions()
                    {
                        X = gameSpaceModel.Left,
                        Y = gameSpaceModel.Top,
                        Height = gameSpaceModel.Height,
                        Width = gameSpaceModel.Width,
                        Name = gameSpaceModel.Name,
                        Vertical = gameSpaceModel.Vertical,
                        ResizeType = gameSpaceModel.ResizeType
                    }));
                }

                foreach (var gameEffect in game.Effects)
                {
                    sev.CardGame.Effects.Add(new CardGameEffect(new CardGameEffectOptions()
                    {
                        Name = gameEffect.Name,
                        Type = gameEffect.Type,
                        Properties = gameEffect.Properties.Map(a => new CardGameEffectProperty() { Name = a.Name, Value = a.Value })
                    }));
                }

                gameData.TotalGames++;
                gameData.TotalPlayers += players.Count;
                sev.CardGame.EmulatedAnswerIndex = 0;

                //todo to data
                sev.CardGame.NumberOfCards = 52;
                sev.CardGame.NumberOfJokers = 0;

                sev.CardGame.ConfigurationCompleted();
                sev.Constructor();
                sev.RunGame();
                ServerLogger.LogDebug("Doneski", gameData);

                room.Unwind(players);
                return true;
            });
        }
 private UserLogicModel getPlayerByUsername(DebugGameRoom room, string userName)
 {
     foreach (var player in room.Players)
     {
         if (player.UserName == userName)
             return player;
     }
     return null;
 }
 private void SendMessageToTester(DebugGameRoom room, string message, object val)
 {
     qManager.SendMessage(room.DebuggingSender.Gateway, message, room.DebuggingSender, val);
 }