protected Layout <TRoom> TransformLayout(IMapLayout <TRoom> layout, TwoWayDictionary <IRoomDescription, GameObject> roomDescriptionsToRoomTemplates) { var roomTransformations = new RoomTransformations(); // Prepare an object to hold instantiated room templates var parentGameObject = new GameObject("Room template instances"); parentGameObject.transform.parent = Payload.GameObject.transform; // Initialize rooms var layoutData = new Dictionary <TRoom, RoomInfo <TRoom> >(); foreach (var layoutRoom in layout.Rooms) { var roomTemplate = roomDescriptionsToRoomTemplates[layoutRoom.RoomDescription]; // Instatiate room template var room = Object.Instantiate(roomTemplate); room.SetActive(false); room.transform.SetParent(parentGameObject.transform); // Transform room template if needed var transformation = layoutRoom.Transformation; roomTransformations.Transform(room, transformation); // Compute correct room position // We cannot directly use layoutRoom.Position because the dungeon moves // all room shapes in a way that they are in the first plane quadrant // and touch the xy axes. So we have to subtract the original lowest // x and y coordinates. var smallestX = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.X); var smallestY = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.Y); var correctPosition = layoutRoom.Position.ToUnityIntVector3() - new Vector3Int(smallestX, smallestY, 0); room.transform.position = correctPosition; var roomInfo = new RoomInfo <TRoom>(roomTemplate, room, correctPosition, TransformDoorInfo(layoutRoom.Doors), layoutRoom.IsCorridor, layoutRoom); room.transform.position = new Vector3(room.transform.position.x * 32, room.transform.position.y * 16, 0); //room.gameObject.SetActive(true); foreach (Transform child in room.transform) { if (child.gameObject.tag == "object") { var pos = child.transform.localPosition; child.transform.SetParent(room.transform.parent); child.transform.localScale = new Vector3(1, 1, 0); child.transform.position = new Vector3(room.transform.position.x + pos.x, room.transform.position.y + pos.y, 0); } } room.transform.localScale = new Vector3(1, 1, 0); layoutData.Add(layoutRoom.Node, roomInfo); } return(new Layout <TRoom>(layoutData)); }
protected void SetupRoomTemplates(IMapLayout <int> layout) { var roomTransformations = new RoomTransformations(); // Prepare an object to hold instantiated room templates var parentGameObject = new GameObject("Room template instances"); parentGameObject.transform.parent = Payload.GameObject.transform; // Initialize rooms Payload.LayoutData = new Dictionary <int, RoomInfo <int> >(); foreach (var layoutRoom in layout.Rooms) { var roomTemplate = Payload.RoomDescriptionsToRoomTemplates[layoutRoom.RoomDescription]; // Instatiate room template var room = Object.Instantiate(roomTemplate); room.SetActive(false); room.transform.SetParent(parentGameObject.transform); // Transform room template if needed var transformation = layoutRoom.Transformation; roomTransformations.Transform(room, transformation); // Compute correct room position // We cannot directly use layoutRoom.Position because the dungeon moves // all room shapes in a way that they are in the first plane quadrant // and touch the xy axes. So we have to subtract the original lowest // x and y coordinates. var smallestX = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.X); var smallestY = layoutRoom.RoomDescription.Shape.GetPoints().Min(x => x.Y); var correctPosition = layoutRoom.Position.ToUnityIntVector3() - new Vector3Int(smallestX, smallestY, 0); room.transform.position = correctPosition; var roomInfo = new RoomInfo <int>(roomTemplate, room, correctPosition, TransformDoorInfo(layoutRoom.Doors), layoutRoom.IsCorridor, layoutRoom); Payload.LayoutData.Add(layoutRoom.Node, roomInfo); } }
public static GeneratedLevel TransformLayout(IMapLayout <Room> layout, LevelDescription levelDescription, GameObject rootGameObject) { // var layoutCenter = GetLayoutCenter(layout); var prefabToRoomTemplateMapping = levelDescription.GetPrefabToRoomTemplateMapping(); var corridorToConnectionMapping = levelDescription.GetCorridorToConnectionMapping(); var roomTransformations = new RoomTransformations(); // Prepare an object to hold instantiated room templates var roomTemplateInstancesRoot = new GameObject("Room template instances"); roomTemplateInstancesRoot.transform.parent = rootGameObject.transform; // Initialize rooms var layoutData = new Dictionary <Room, RoomInstance>(); var layoutRooms = layout.Rooms.ToDictionary(x => x.Node, x => x); foreach (var layoutRoom in layoutRooms.Values) { var roomTemplatePrefab = prefabToRoomTemplateMapping.GetByValue(layoutRoom.RoomTemplate); // Instantiate room template var roomTemplateInstance = Object.Instantiate(roomTemplatePrefab); roomTemplateInstance.transform.SetParent(roomTemplateInstancesRoot.transform); // Transform room template if needed var transformation = layoutRoom.Transformation; roomTransformations.Transform(roomTemplateInstance, transformation); // Compute correct room position var position = layoutRoom.Position.ToUnityIntVector3(); roomTemplateInstance.transform.position = position; // Compute outline polygon var polygon = new Polygon2D(layoutRoom.Shape + layoutRoom.Position); var connection = layoutRoom.IsCorridor ? corridorToConnectionMapping[layoutRoom.Node] : null; var roomInstance = new RoomInstance(layoutRoom.Node, layoutRoom.IsCorridor, connection, roomTemplatePrefab, roomTemplateInstance, position, polygon); // Add room info to the GameObject var roomInfo = roomTemplateInstance.GetComponent <RoomInfo>(); if (roomInfo != null) { PostProcessUtils.Destroy(roomInfo); } roomInfo = roomTemplateInstance.AddComponent <RoomInfo>(); roomInfo.RoomInstance = roomInstance; layoutData.Add(layoutRoom.Node, roomInstance); } foreach (var roomInstance in layoutData.Values) { roomInstance.SetDoors(TransformDoorInfo(layoutRooms[roomInstance.Room].Doors, layoutData)); } // Add level info var levelInfo = rootGameObject.GetComponent <LevelInfo>(); if (levelInfo != null) { PostProcessUtils.Destroy(levelInfo); } levelInfo = rootGameObject.AddComponent <LevelInfo>(); levelInfo.RoomInstances = layoutData.Values.ToList(); return(new GeneratedLevel(layoutData, layout, rootGameObject)); }