private void GenerateLoot(ref RawDungeonData dungeon) { List <Item> items = new List <Item>(); List <Point> targetRooms = new List <Point>(); int numItemsToSpawn = Random.Range(m_MinItemTarget, m_MaxItemTarget + 1); int numTypes = ItemBase.singleton.baseTypes.Length; for (int i = 0; i < numItemsToSpawn; i++) { TypeSizeSprite link = ItemBase.singleton.baseTypes[ Random.Range(0, numTypes)]; // name is by default the string version of the type name Item newItem = new Item(link.m_Type.ToString(), link.m_Type, link.m_Size, link.m_Sprite); // Pick the room for it to go in int cluster = Random.Range(0, dungeon.Rooms.Length); int room = Random.Range(0, dungeon.Rooms[cluster].Length); items.Add(newItem); targetRooms.Add(new Point(cluster, room)); } dungeon.DungeonPopulation = new DungeonPopulation(items.ToArray(), targetRooms.ToArray()); }
private void GenerateDungeonData(int size, int minRoomSize, int maxRoomSize, int roomCount, out RawDungeonData dungeon) { dungeon = new RawDungeonData { Width = size, Height = size }; m_RawDungeonData.GenerateRoomsData(minRoomSize, maxRoomSize, roomCount); m_RawDungeonData.GenerateAndSortClusters(m_PathNodeCount, m_MaxRoomSize); }
private void GenerateAndSortClusters(Rect[] rooms, ref RawDungeonData dungeon) { dungeon.Path = new Vector2[m_PathNodeCount]; // Create some path nodes for (int i = 0; i < m_PathNodeCount; i++) { dungeon.Path[i] = new Vector2(Random.Range(m_MaxRoomSize, dungeon.Width - m_MaxRoomSize), Random.Range(m_MaxRoomSize, dungeon.Height - m_MaxRoomSize)); } List <Rect>[] roomNodePairing = new List <Rect> [dungeon.Path.Length];// node, room indices for (int i = 0; i < m_PathNodeCount; i++) { roomNodePairing[i] = new List <Rect>(); } // for each room find it's closest node for (int i = 0; i < rooms.Length; i++) { int closest = 0; float distClosest = Mathf.Infinity; for (int j = 0; j < dungeon.Path.Length; j++) { float dist = Vector2.Distance(rooms[i].center, dungeon.Path[j]); if (dist < distClosest) { distClosest = dist; closest = j; } } roomNodePairing[closest].Add(rooms[i]); } Rect[][] sortedRects = new Rect[m_PathNodeCount][]; for (int i = 0; i < m_PathNodeCount; i++) { sortedRects[i] = roomNodePairing[i].ToArray(); } // move nodes to centre point of the cluster // to make it look nicer for (int i = 0; i < sortedRects.Length; i++) { Vector2 midpoint = new Vector2(); var cluster = sortedRects[i]; for (int j = 0; j < cluster.Length; j++) { midpoint += cluster[j].center; } if (midpoint != Vector2.zero) { dungeon.Path[i] = midpoint / cluster.Length; } } // link rooms in a node (sort rooms according to clusters) // Link clusters together (pace one cluster of rooms after the preveous dungeon.Rooms = sortedRects; dungeon.Entrance = new int[2] { 0, 0 }; int numRooms = dungeon.Rooms.Length; dungeon.Exit = new int[2] { numRooms - 1, dungeon.Rooms[numRooms - 1].Length - 1 }; }
private void PopulateDungeon(ref RawDungeonData dungeon) { Player.transform.position = dungeon.Rooms[dungeon.Entrance[0]][dungeon.Entrance[1]].center + dungeon.GetWorldOffset(); GenerateLoot(ref dungeon); }