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

Revision 3568, 5.4 KB checked in by dezhidki, 9 years ago (diff)

Talletus.

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