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

Revision 3489, 4.2 KB checked in by dezhidki, 8 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    class LevelGenerator
11    {
12        private double width, height;
13        private int roomAmountHor, roomAmountVert;
14        private Game game;
15        private TestRoom[,] rooms;
16        private List<TestRoom> roomList = new List<TestRoom>();
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 TestRoom[roomAmountHor, roomAmountVert];
27        }
28
29        public void buildLevel()
30        {
31            foreach (TestRoom room in roomList)
32            {
33                    room.buildLevel();
34            }
35        }
36
37        public void generateRandomLevel(int minRooms, int maxRooms)
38        {
39            int roomAmount = RandomGen.NextInt(minRooms, maxRooms);
40            TestRoom lastRoom = null;
41
42            for (int room = 0; room < roomAmount; room++)
43            {
44                if (room == 0)
45                {
46                    lastRoom = new TestRoom(game, VecMath.mul(CenterRoom, new Vector(TheDungeonGame.ROOMWIDTH, -(TheDungeonGame.ROOMHEIGHT))), TheDungeonGame.roomSize, TheDungeonGame.ROOMTHICKNESS);
47                    placeRoomAt(lastRoom, (int)CenterRoom.X, (int)CenterRoom.Y);
48                    continue;
49                }
50
51                Room randomRoom = getRandomRoom();
52                int checkedSides = 0;
53                bool[] sideChecked = new bool[4];
54
55                //  while (checkedSides < 4)
56                //   {
57                int dir = 2;
58                /* if (sideChecked[dir])
59                 {
60                     checkedSides++;
61                     continue;
62                 } */
63                //  if (lastRoom == null) return;
64                checkedSides++;
65                lastRoom = tryCreateRoom(dir, VecMath.add(lastRoom.RoomsPosOnGrid, RoomDirection.getOffsetFromDir(dir)), lastRoom);
66                // }
67
68            }
69        }
70
71        private TestRoom tryCreateRoom(int dir, Vector pos, Room lastRoom)
72        {
73            if (getRoomFromDirection(lastRoom, dir) != null) return null;
74
75            TestRoom currentRoom = new TestRoom(game, VecMath.mul(pos, new Vector(TheDungeonGame.ROOMWIDTH, -TheDungeonGame.ROOMHEIGHT)), TheDungeonGame.roomSize, TheDungeonGame.ROOMTHICKNESS);
76            placeRoomAt(currentRoom, (int)pos.X, (int)pos.Y);
77            return currentRoom;
78        }
79
80        public void placeRoomAt(TestRoom room, int x, int y)
81        {
82            if (x > roomAmountHor || x < 0 || y > roomAmountVert || y < 0 || getRoomAt(x, y) != null) throw new Exception("Cant place Room there!");
83            room.RoomsPosOnGrid = new Vector(x, y);
84            rooms[x, y] = room;
85            roomList.Add(room);
86        }
87
88        public Room getRoomAt(int x, int y)
89        {
90            if (x > roomAmountHor || x < 0 || y > roomAmountVert || y < 0) return null;
91            return rooms[x, y];
92        }
93
94        public Room getRoomFromDirection(Room source, int dir)
95        {
96            int roomX = (int)source.RoomsPosOnGrid.X;
97            int roomY = (int)source.RoomsPosOnGrid.Y;
98
99            if (dir == RoomDirection.North)
100                return getRoomAt(roomX, roomY - 1);
101            if (dir == RoomDirection.East)
102                return getRoomAt(roomX + 1, roomY);
103            if (dir == RoomDirection.North)
104                return getRoomAt(roomX, roomY + 1);
105            if (dir == RoomDirection.West)
106                return getRoomAt(roomX - 1, roomY);
107
108            return null;
109        }
110
111        public Room getRandomRoom()
112        {
113            if (roomList.Count == 0) throw new InvalidOperationException("The List is empty!");
114            return roomList[RandomGen.NextInt(roomList.Count)];
115        }
116
117        public Vector CenterRoom
118        {
119            get
120            {
121                return new Vector(roomAmountHor / 2, roomAmountVert / 2);
122            }
123        }
124    }
125}
Note: See TracBrowser for help on using the repository browser.