source: 2012/27/DenisZ/TheDungeonGame/TheDungeonGame/TheDungeonGame/LevelGenerator.cs @ 3517

Revision 3517, 4.5 KB checked in by dezhidki, 8 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using MathHelper;
7
8namespace Rooms
9{
10    class LevelGenerator
11    {
12        private double width, height;
13        private int roomAmountHor, roomAmountVert;
14        private Game game;
15        private Room[,] rooms;
16        private List<Room> roomList = new List<Room>();
17
18        public LevelGenerator(Game game, Vector size, Vector roomamount)
19        {
20            this.game = game;
21            width = size.X;
22            height = size.Y;
23            roomAmountHor = (int)roomamount.X;
24            roomAmountVert = (int)roomamount.Y;
25
26            rooms = new Room[roomAmountHor, roomAmountVert];
27        }
28
29        public Vector CenterRoom
30        {
31            get
32            {
33                return new Vector(roomAmountHor / 2, roomAmountVert / 2);
34            }
35        }
36
37        public void buildDungeon()
38        {
39            foreach (Room room in roomList)
40            {
41                room.buildLevel();
42            }
43        }
44
45        public void destroyDungeon()
46        {
47            foreach (Room room in roomList)
48            {
49                room.destroyLevel();
50            }
51        }
52
53        public void generateRandomLevel(int minRooms, int maxRooms)
54        {
55            int roomAmount = RandomGen.NextInt(minRooms, maxRooms);
56            Room lastRoom = null;
57
58            for (int room = 0; room < roomAmount; room++)
59            {
60                if (room == 0)
61                {
62                    lastRoom = new TestRoom(game, VecMath.mul(CenterRoom, new Vector(TheDungeonGame.ROOMWIDTH + TheDungeonGame.ROOMTHICKNESS, -TheDungeonGame.ROOMHEIGHT - TheDungeonGame.ROOMTHICKNESS)), TheDungeonGame.roomSize, TheDungeonGame.ROOMTHICKNESS);
63                    placeRoomAt(lastRoom, (int)CenterRoom.X, (int)CenterRoom.Y);
64                    continue;
65                }
66
67                Room randomRoom = getRandomRoom();
68                int checkedSides = 0;
69                bool[] sideChecked = new bool[4];
70
71                while (checkedSides < 4)
72                {
73                    int dir = RandomGen.NextInt(4);
74                    if (sideChecked[dir])
75                    {
76                        checkedSides++;
77                        continue;
78                    }
79                    else
80                    {
81                        checkedSides++;
82                        sideChecked[dir] = true;
83                    }
84
85                    if (tryCreateRoom(dir, VecMath.add(lastRoom.PosOnGrid, RoomDirection.getOffsetFromDir(dir)), lastRoom))
86                    {
87                        lastRoom = currentRoom;
88                        break;
89                    }
90
91                }
92
93            }
94        }
95
96
97
98        private Room currentRoom;
99        private bool tryCreateRoom(int dir, Vector pos, Room lastRoom)
100        {
101            if (getRoomFromDirection(lastRoom, dir) != null) return false;
102            currentRoom = new TestRoom(game, VecMath.mul(pos, new Vector(TheDungeonGame.ROOMWIDTH+TheDungeonGame.ROOMTHICKNESS, -TheDungeonGame.ROOMHEIGHT -TheDungeonGame.ROOMTHICKNESS)), TheDungeonGame.roomSize, TheDungeonGame.ROOMTHICKNESS);
103            return placeRoomAt(currentRoom, (int)pos.X, (int)pos.Y);
104        }
105
106        public bool placeRoomAt(Room room, int x, int y)
107        {
108            if (!isValidPos(x, y) || getRoomAt(x, y) != null) return false;
109            room.PosOnGrid = new Vector(x, y);
110            rooms[x, y] = room;
111            roomList.Add(room);
112            return true;
113        }
114
115        public Room getRoomAt(int x, int y)
116        {
117            if (!isValidPos(x, y)) return null;
118            return rooms[x, y];
119        }
120
121        public Room getRoomFromDirection(Room source, int dir)
122        {
123            int roomX = (int)source.PosOnGrid.X;
124            int roomY = (int)source.PosOnGrid.Y;
125
126            Vector roomPos = VecMath.add(source.PosOnGrid, RoomDirection.getOffsetFromDir(dir));
127            return getRoomAt((int)roomPos.X, (int)roomPos.Y);
128        }
129
130        public Room getRandomRoom()
131        {
132            if (roomList.Count == 0) throw new InvalidOperationException("The List is empty!");
133            return roomList[RandomGen.NextInt(roomList.Count)];
134        }
135
136        private bool isValidPos(int x, int y)
137        {
138            return !(x >= roomAmountHor || x < 0 || y >= roomAmountVert || y < 0);
139        }
140
141
142    }
143}
Note: See TracBrowser for help on using the repository browser.