/// <summary>
        /// Создать из объекта передачи данных
        /// </summary>
        /// <param name="dto">Объект передачи данных</param>
        /// <param name="manager">Менеджер объектов</param>
        /// <returns>Игровая комната</returns>
        public static GameRoom CreateFromDto(GameSceneDto dto, ObjectsManager manager)
        {
            // Преобразование всех объектов
            var allObjects = dto.Objects.Select(o => {
                var newObj      = manager.CreateObject(o.Name, o.Id);
                newObj.LayoutId = o.LayoutId;
                newObj.Position = o.Position;
                newObj.Rotation = o.Rotation;
                return(newObj);
            });

            var room = new GameRoom(dto.Id)
            {
                Interior = allObjects.Where(o => o.Type == ObjectType.Static).ToList(),
                Entities = allObjects.Where(o => o.Type == ObjectType.Entity).ToList()
            };

            // Параметры представления сцены
            room.PresentationMetadata.LookAtPoint  = dto.CameraTarget;
            room.PresentationMetadata.Distance     = dto.Distance;
            room.PresentationMetadata.SkyboxName   = dto.SkyboxName;
            room.PresentationMetadata.Seats        = dto.Seats.ToList();
            room.PresentationMetadata.PointsOfView = dto.POVs.ToList();
            room.PresentationMetadata.Lights       = dto.Lights.ToList();

            room.PovName = room.PresentationMetadata.PointsOfView[0].Name;

            // Места для игроков
            room.PlayerSeats = new Player[room.PresentationMetadata.Seats.Count];

            return(room);
        }
        /// <summary>
        /// Загрузить данные игровой комнаты
        /// </summary>
        /// <param name="manager">Менеджер объектов</param>
        /// <returns>Загруженная игровая комната</returns>
        public async Task <GameRoom> Load(ObjectsManager manager)
        {
            string contents = await package.ReadSceneDescription();

            var converter = new VectorConverter();
            var dto       = JsonConvert.DeserializeObject <GameSceneDto>(contents, converter);

            return(GameRoom.CreateFromDto(dto, manager));
        }
        /// <summary>
        /// Создать новую игровую сессию
        /// </summary>
        /// <param name="name">Название игры</param>
        /// <param name="gameMaster"></param>
        /// <returns>Новый игровой сеанс</returns>
        public async Task <GameSession> StartNewGame(string name, GameMaster master)
        {
            var gamePkg = new GamePackage(name);

            var objManager = new ObjectsManager(gamePkg);
            await objManager.LoadDefinitions();

            await objManager.LoadClientResources();

            var newSession = new GameSession(gamePkg)
            {
                Room            = await(new GameRoomLoader(gamePkg)).Load(objManager),
                Master          = master,
                ResourceManager = objManager
            };

            // Запустить сценарий игры
            newSession.StartInteractivity();

            activeSessions.Add(newSession);

            return(newSession);
        }