source: 2012/27/DenisZ/TheDungeonGame/TheDungeonGame/TheDungeonGame/Room.cs @ 3624

Revision 3624, 13.8 KB checked in by dezhidki, 9 years ago (diff)

Animations added!
Every mob has a texture!
The first (and the last because the lack of time) boss!
Main menu!
Death menu!
Boss room has own door!
Possibility to do damage to health!
Almost last release for now!
Some sound is added!

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using MathHelper;
7using Entity;
8
9namespace Rooms
10{
11    public abstract class Room
12    {
13
14        public Vector Position;
15        public double width, height, thickness;
16        protected List<IPhysicsObject> roomDecorations = new List<IPhysicsObject>();
17        protected List<IPhysicsObject> roomObjects = new List<IPhysicsObject>();
18        public bool isBuilt = false;
19        protected IPhysicsObject[,] insideObjects;
20        public ObjectDoor[] doors = new ObjectDoor[4];
21        protected double blockWidth, blockHeight;
22        protected double insideWidth, insideHeight;
23        protected Vector insidePos;
24        protected int bWidth, bHeight;
25        public TheDungeonGame Game { get; set; }
26        public Vector PosOnGrid { get; set; }
27        public PhysicsObject wall;
28        public int EntityAmount { get; set; }
29        public String roomName;
30
31        public Room(TheDungeonGame game, Vector pos, Vector size, double thickness)
32        {
33            Game = game;
34            Position = VecMath.sub(pos, new Vector(Game.Level.Width / 2, -(Game.Level.Height / 2)));
35            width = size.X;
36            height = size.Y;
37            this.thickness = thickness;
38
39            insidePos = VecMath.add(Position, new Vector(thickness, -thickness));
40            insideWidth = width - thickness;
41            insideHeight = height - thickness;
42            blockWidth = insideWidth / 10;
43            blockHeight = blockWidth;
44            bWidth = (int)(insideWidth / blockWidth);
45            bHeight = (int)(insideHeight / blockHeight);
46
47            insideObjects = new PhysicsObject[bWidth, bHeight];
48            roomName = "Basic Room";
49        }
50
51        public abstract void initRoom();
52
53        public void spawnRandomEntities(int entityAmount)
54        {
55            int entitiesSpawned = 0;
56            while (entitiesSpawned < entityAmount)
57            {
58                EntityBase entity = RoomCreator.getEntity(RandomGen.NextInt(4));
59                if (!addEntityAt(entity, RandomGen.NextInt(bWidth - 2) + 1, RandomGen.NextInt(bHeight - 2) + 1))
60                    continue;
61                entitiesSpawned++;
62            }
63            //for (int i = 0; i < entityAmount; i++)
64            //{
65            //    EntityBase entity = RoomCreator.getEntity(Entities.entities.Length-1);
66            //    if(!addEntityAt(entity, RandomGen.NextInt(bWidth-2)+1, RandomGen.NextInt(bHeight-2)+1))
67
68            //}
69        }
70
71        protected void createLevelDecorations()
72        {
73            int level = Game.LevelGen.level;
74            createBorders(Game.getTopBottomWall(level), Game.getLeftRightWall(level));
75            addDoors();
76            roomDecorations.Add(createBackground(Game.getLevelBackground(level)));
77        }
78
79        public void buildLevel()
80        {
81            if (roomDecorations.Count == 0 && roomObjects.Count == 0) throw new Exception("Cannot build empty room!");
82
83            foreach (IPhysicsObject obj in roomDecorations)
84            {
85                Game.Add(obj);
86            }
87
88            foreach (IPhysicsObject obj in roomObjects)
89            {
90                Game.Add(obj, 1);
91            }
92
93            foreach (IPhysicsObject obj in insideObjects)
94            {
95                if (obj != null)
96                {
97                    if (obj.Tag.Equals("Enemy"))
98                        Game.Add(obj, 2);
99                    else Game.Add(obj, 1);
100                }
101
102            }
103
104
105            isBuilt = true;
106        }
107
108        public void destroyLevel()
109        {
110            if (roomDecorations.Count == 0) throw new Exception("Cannot destory empty room!");
111            if (!isBuilt) return;
112
113            foreach (IPhysicsObject obj in roomDecorations)
114            {
115                obj.Destroy();
116            }
117            foreach (IPhysicsObject obj in roomObjects)
118            {
119                obj.Destroy();
120            }
121            foreach (IPhysicsObject obj in insideObjects)
122            {
123                if (obj != null)
124                    obj.Destroy();
125            }
126        }
127
128        public void hideLevel()
129        {
130            if (roomDecorations.Count == 0) throw new Exception("Cannot hide empty room!");
131            if (!isBuilt) return;
132
133            foreach (IPhysicsObject obj in roomDecorations)
134            {
135                obj.IsVisible = false;
136            }
137            foreach (IPhysicsObject obj in roomObjects)
138            {
139                obj.IsVisible = false;
140            }
141            foreach (IPhysicsObject obj in insideObjects)
142            {
143                if (obj != null)
144                    obj.IsVisible = false;
145            }
146        }
147
148        public void restoreLevel()
149        {
150            if (roomDecorations.Count == 0) throw new Exception("Cannot hide empty room!");
151            if (!isBuilt) return;
152
153            foreach (IPhysicsObject obj in roomDecorations)
154            {
155                obj.IsVisible = true;
156            }
157            foreach (IPhysicsObject obj in roomObjects)
158            {
159                obj.IsVisible = true;
160            }
161            foreach (IPhysicsObject obj in insideObjects)
162            {
163                if (obj != null)
164                    obj.IsVisible = true;
165            }
166        }
167
168        public void restoreBrains()
169        {
170            foreach (IPhysicsObject obj in insideObjects)
171            {
172                if (obj != null)
173                {
174                    if (obj.Brain != null)
175                        obj.Brain.Active = true;
176                }
177            }
178        }
179
180        public void killBrains()
181        {
182            foreach (IPhysicsObject obj in insideObjects)
183            {
184                if (obj != null)
185                {
186                    if (obj.Tag.Equals("Enemy"))
187                        obj.Brain.Active = false;
188                    obj.Stop();
189                }
190            }
191        }
192
193        public void addBlock(IPhysicsObject obj, int bx, int by)
194        {
195            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0 || insideObjects[bx, by] != null) return;
196            obj.Left = insidePos.X + (bx * blockWidth);
197            obj.Top = insidePos.Y - (by * blockHeight);
198            insideObjects[bx, by] = obj;
199        }
200
201        public void addBlock(IPhysicsObject obj, int bx, int by, Vector offset)
202        {
203            addBlock(obj, bx, by);
204            obj.Position += offset;
205        }
206
207        public void addBlockAt(IPhysicsObject obj, double x, double y)
208        {
209            obj.Left = Position.X + x;
210            obj.Top = Position.Y + y;
211            roomObjects.Add(obj);
212        }
213
214        public bool addEntityAt(EntityBase ent, int bx, int by)
215        {
216            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0 || insideObjects[bx, by] != null) return false;
217            ++EntityAmount;
218            ent.Left = insidePos.X + (bx * blockWidth);
219            ent.Top = insidePos.Y - (by * blockHeight);
220            insideObjects[bx, by] = ent;
221            return true;
222        }
223
224        public IPhysicsObject getEntityAt(int bx, int by)
225        {
226            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0) return null;
227            return insideObjects[bx, by];
228        }
229
230        public void deleteBlock(int bx, int by)
231        {
232            insideObjects[bx, by].Destroy();
233            insideObjects[bx, by] = null;
234        }
235
236
237        // En vitsinyt käyttää enempää aikaa tämän parantamiseksi. Helppo ja toimiva
238        public void addDoors()
239        {
240            Image doorTexture = Game.objectTextures[1];
241            for (int i = 0; i < 4; i++)
242            {
243                Room room = Game.LevelGen.getRoomAt(PosOnGrid + RoomDirection.getOffsetFromDir(i));
244
245                if (room == null) continue;
246
247                ObjectDoor door = null;
248
249                if (i == RoomDirection.North)
250                {
251                    door = new ObjectDoor(thickness, thickness);
252                    door.Position = Position + new Vector((width + thickness) / 2, -thickness / 2);
253                    door.Tag = RoomDirection.North;
254                }
255                else if (i == RoomDirection.East)
256                {
257                    door = new ObjectDoor(thickness, thickness);
258                    door.Position = Position + new Vector(width + thickness / 2, -(height + thickness) / 2);
259                    door.Tag = RoomDirection.East;
260                }
261                else if (i == RoomDirection.South)
262                {
263                    door = new ObjectDoor(thickness, thickness);
264                    door.Position = Position + new Vector((thickness + width) / 2, -height - thickness / 2);
265                    door.Tag = RoomDirection.South;
266                }
267                else if (i == RoomDirection.West)
268                {
269                    door = new ObjectDoor(thickness, thickness);
270                    door.Position = Position + new Vector(thickness / 2, -height / 2 - thickness / 2);
271                    door.Tag = RoomDirection.West;
272                }
273                if (door != null)
274                {
275                    roomObjects.Add(door);
276                    doors[i] = door;
277                    setDoorTexture(doorTexture, i);
278                }
279
280            }
281        }
282
283        public void setDoorTexture(Image tex, int dir)
284        {
285            ObjectDoor door = getDoor(dir);
286
287            if (door == null) return;
288
289            Room room = Game.LevelGen.getRoomAt(PosOnGrid + RoomDirection.getOffsetFromDir(dir));
290            if (room.roomName == "Boss Room")
291                door.Image = Game.objectTextures[2];
292            else door.Image = tex;
293            door.Angle = RoomDirection.getAngleFromDir(dir);
294        }
295
296        public ObjectDoor getDoor(int dir)
297        {
298            ObjectDoor result = null;
299            for (int i = 0; i < doors.Length; i++)
300            {
301                ObjectDoor door = doors[i];
302                if (door != null && (int)door.Tag == dir)
303                {
304                    result = door;
305                    return result;
306                }
307            }
308            return result;
309        }
310
311        public void createBorders(Image topBottom, Image leftRight)
312        {
313            PhysicsObject wallTop = createWall(Position, width + thickness, thickness);
314            wallTop.Color = Color.Blue;
315            wallTop.Image = topBottom;
316            PhysicsObject wallLeft = createWall(VecMath.sub(Position, new Vector(0, thickness)), thickness, height - thickness);
317            wallLeft.Color = Color.Red;
318            wallLeft.Image = leftRight;
319            PhysicsObject wallDown = createWall(VecMath.sub(Position, new Vector(0, height)), width + thickness, thickness);
320            wallDown.Color = Color.Black;
321            if (topBottom != null) wallDown.Image = Image.Flip(topBottom);
322            PhysicsObject wallRight = createWall(VecMath.add(Position, new Vector(width, -thickness)), thickness, height - thickness);
323            wallRight.Color = Color.Orange;
324            if (leftRight != null) wallRight.Image = Image.Mirror(leftRight);
325            roomDecorations.Add(wallTop);
326            roomDecorations.Add(wallLeft);
327            roomDecorations.Add(wallDown);
328            roomDecorations.Add(wallRight);
329        }
330
331        public PhysicsObject createWall(Vector pos, double width, double height)
332        {
333            wall = PhysicsObject.CreateStaticObject(width, height);
334            wall.Tag = "Wall";
335            wall.Left = pos.X;
336            wall.Top = pos.Y;
337
338            return wall;
339        }
340
341        public PhysicsObject createBackground(Image background)
342        {
343            PhysicsObject bg = PhysicsObject.CreateStaticObject(insideWidth, insideHeight);
344            bg.Left = Position.X + thickness;
345            bg.Top = Position.Y - thickness;
346            bg.IgnoresCollisionResponse = true;
347            bg.Image = background;
348            bg.Color = Color.Green;
349            bg.IgnoresExplosions = true;
350            return bg;
351        }
352    }
353
354    public class RoomDirection
355    {
356        public const int North = 0;
357        public const int East = 1;
358        public const int South = 2;
359        public const int West = 3;
360
361        public static Angle NorthAngle = Angle.Zero;
362        public static Angle EastAngle = Angle.FromDegrees(270);
363        public static Angle SouthAngle = Angle.FromDegrees(180);
364        public static Angle WestAngle = Angle.FromDegrees(90);
365
366        public static Vector getOffsetFromDir(int dir)
367        {
368            if (dir == North)
369                return new Vector(0, -1);
370            if (dir == East)
371                return new Vector(1, 0);
372            if (dir == South)
373                return new Vector(0, 1);
374            if (dir == West)
375                return new Vector(-1, 0);
376
377            return Vector.Zero;
378        }
379
380        public static Angle getAngleFromDir(int dir)
381        {
382            if (dir == North)
383                return NorthAngle;
384            else if (dir == East)
385                return EastAngle;
386            else if (dir == South)
387                return SouthAngle;
388            else if (dir == West)
389                return WestAngle;
390
391            return Angle.Zero;
392        }
393
394        public static Vector getOffsetFromWorldDir(int dir)
395        {
396            if (dir == North)
397                return new Vector(0, 1);
398            if (dir == East)
399                return new Vector(1, 0);
400            if (dir == South)
401                return new Vector(0, -1);
402            if (dir == West)
403                return new Vector(-1, 0);
404
405            return Vector.Zero;
406        }
407    }
408}
Note: See TracBrowser for help on using the repository browser.