/// <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); }