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