root/Code/oMaE/oMaE/Overworld/Map.cs @ 58

Revision 58, 16.6 KB (checked in by acarter, 2 years ago)

Match game always clears

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Audio;
7using Microsoft.Xna.Framework.Content;
8using Microsoft.Xna.Framework.GamerServices;
9using Microsoft.Xna.Framework.Graphics;
10using Microsoft.Xna.Framework.Input;
11using Microsoft.Xna.Framework.Media;
12using oMaE.Overworld.Objects;
13
14namespace oMaE.Overworld
15{
16    /// <summary>
17    /// The map of the game.
18    /// </summary>
19    public class Map : GameObject
20    {
21        private static readonly string[][] maps = new string[][]{
22            new string[] {
23            "r-----v-----------v--v--J",
24            "|     d           d *| *|",
25            "| r---+-----------+--<  |",
26            "| |   |           |  d  |",
27            "| |   d           |  |  |",
28            "| |   |           >I-<  |",
29            "| >-I-<           |  |  |",
30            "| |   |           d  |  |",
31            "| | * |           |  |  |",
32            "| L---<           >-I<  |",
33            "|     |           |  |  |",
34            "|     d           d  |  |",
35            "|     |           | *| *|",
36            "L-----n----JMr----n--n--/",
37            "           | |           ",
38            "           |Y|           ",
39            "           LE/           "}};
40        private string[] map;
41        private int[][] minimap;
42        public Door Entrance;
43        private Vector2 start = Vector2.Zero;
44        /// <summary>
45        /// All the wall in the compound.
46        /// </summary>
47        public LinkedList<Wall> Walls { get { return GenerateWalls(); } }
48        /// <summary>
49        /// All the doors in the compound.
50        /// </summary>
51        public LinkedList<Door> Doors { get { return GenerateDoors(); } }
52        /// <summary>
53        /// Makes a new map.
54        /// </summary>
55        /// <param name="num">The map number.</param>
56        public Map(int num)
57        {
58            Visible = false;
59            map = maps[num];
60            minimap = new int[3 * map.Length + 2][];
61            for (int i = 0; i < minimap.Length; ++i)
62            {
63                minimap[i] = new int[3 * map[0].Length + 2];
64                for (int j = 0; j < minimap[i].Length; ++j)
65                    minimap[i][j] = 0;
66            }
67            for (int i = 0; i < map.Length; ++i)
68            {
69                for (int j = 0; j < map[i].Length; ++j)
70                {
71                    switch (map[i][j])
72                    {
73                        case '+':
74                            minimap[3 * i + 2][3 * j + 1] = -1;
75                            minimap[3 * i + 1][3 * j + 2] = -1;
76                            minimap[3 * i + 2][3 * j + 2] = -1;
77                            minimap[3 * i + 3][3 * j + 2] = -1;
78                            minimap[3 * i + 2][3 * j + 3] = -1;
79                            break;
80                        case '|':
81                            minimap[3 * i + 1][3 * j + 2] = -1;
82                            minimap[3 * i + 2][3 * j + 2] = -1;
83                            minimap[3 * i + 3][3 * j + 2] = -1;
84                            break;
85                        case '-':
86                            minimap[3 * i + 2][3 * j + 1] = -1;
87                            minimap[3 * i + 2][3 * j + 2] = -1;
88                            minimap[3 * i + 2][3 * j + 3] = -1;
89                            break;
90                        case 'I':
91                            minimap[3 * i + 2][3 * j + 1] = -2;
92                            minimap[3 * i + 2][3 * j + 2] = -2;
93                            minimap[3 * i + 2][3 * j + 3] = -2;
94                            break;
95                        case 'E':
96                            minimap[3 * i + 2][3 * j + 1] = -4;
97                            minimap[3 * i + 2][3 * j + 2] = -4;
98                            minimap[3 * i + 2][3 * j + 3] = -4;
99                            break;
100                        case 'd':
101                            minimap[3 * i + 1][3 * j + 2] = -2;
102                            minimap[3 * i + 2][3 * j + 2] = -2;
103                            minimap[3 * i + 3][3 * j + 2] = -2;
104                            break;
105                        case 'r':
106                            minimap[3 * i + 2][3 * j + 2] = -1;
107                            minimap[3 * i + 3][3 * j + 2] = -1;
108                            minimap[3 * i + 2][3 * j + 3] = -1;
109                            break;
110                        case 'J':
111                            minimap[3 * i + 2][3 * j + 2] = -1;
112                            minimap[3 * i + 2][3 * j + 1] = -1;
113                            minimap[3 * i + 3][3 * j + 2] = -1;
114                            break;
115                        case '/':
116                            minimap[3 * i + 2][3 * j + 2] = -1;
117                            minimap[3 * i + 2][3 * j + 1] = -1;
118                            minimap[3 * i + 1][3 * j + 2] = -1;
119                            break;
120                        case 'L':
121                            minimap[3 * i + 2][3 * j + 2] = -1;
122                            minimap[3 * i + 1][3 * j + 2] = -1;
123                            minimap[3 * i + 2][3 * j + 3] = -1;
124                            break;
125                        case 'v':
126                            minimap[3 * i + 2][3 * j + 1] = -1;
127                            minimap[3 * i + 2][3 * j + 2] = -1;
128                            minimap[3 * i + 2][3 * j + 3] = -1;
129                            minimap[3 * i + 3][3 * j + 2] = -1;
130                            break;
131                        case 'n':
132                            minimap[3 * i + 2][3 * j + 1] = -1;
133                            minimap[3 * i + 2][3 * j + 2] = -1;
134                            minimap[3 * i + 2][3 * j + 3] = -1;
135                            minimap[3 * i + 1][3 * j + 2] = -1;
136                            break;
137                        case '<':
138                            minimap[3 * i + 1][3 * j + 2] = -1;
139                            minimap[3 * i + 2][3 * j + 2] = -1;
140                            minimap[3 * i + 3][3 * j + 2] = -1;
141                            minimap[3 * i + 2][3 * j + 1] = -1;
142                            break;
143                        case '>':
144                            minimap[3 * i + 1][3 * j + 2] = -1;
145                            minimap[3 * i + 2][3 * j + 2] = -1;
146                            minimap[3 * i + 3][3 * j + 2] = -1;
147                            minimap[3 * i + 2][3 * j + 3] = -1;
148                            break;
149
150                    }
151                }
152            }
153            for (int i = 0; i < map.Length; ++i)
154                for (int j = 0; j < map[i].Length; ++j)
155                    if (map[i][j] == 'Y')
156                        start = new Vector2(j, i);
157        }
158        private LinkedList<Door> GenerateDoors()
159        {
160            LinkedList<Door> doors = new LinkedList<Door>();
161            for (int i = 0; i < map.Length; ++i)
162            {
163                for (int j = 0; j < map[i].Length; ++j)
164                {
165                    Vector2 top = 20 * (new Vector2(j, i) - new Vector2(0.0f, 0.5f) - start);
166                    Vector2 bottom = 20 * (new Vector2(j, i) + new Vector2(0.0f, 0.5f) - start);
167                    Vector2 left = 20 * (new Vector2(j, i) - new Vector2(0.5f, 0.0f) - start);
168                    Vector2 right = 20 * (new Vector2(j, i) + new Vector2(0.5f, 0.0f) - start);
169                    Vector2 center = 20 * (new Vector2(j, i) - start);
170                    Door partner;
171                    switch (map[i][j])
172                    {
173                        case 'E':
174                            doors.AddFirst(partner = new Door(Color.Black, Color.Black, Color.LightSlateGray, left, right, 30, 40, ""));
175                            doors.AddFirst(new Door(Color.Black, Color.Black, Color.LightSlateGray, right, left, partner, 30, 40, ""));
176                            Entrance = partner;
177                            break;
178                        case 'I':
179                            doors.AddFirst(partner = new Door(Color.Red, Color.Green, Color.LightSlateGray, left, right, 10, 40));
180                            doors.AddFirst(new Door(Color.Red, Color.Green, Color.LightSlateGray, right, left, partner, 10, 40));
181                            break;
182                        case 'd':
183                            doors.AddFirst(partner = new Door(Color.Red, Color.Green, Color.LightSlateGray, top, bottom, 10, 40));
184                            doors.AddFirst(new Door(Color.Red, Color.Green, Color.LightSlateGray, bottom, top, partner, 10, 40));
185                            break;
186                    }
187                }
188            }
189            return doors;
190        }
191        private LinkedList<Wall> GenerateWalls()
192        {
193            LinkedList<Wall> walls = new LinkedList<Wall>();
194            for (int i = 0; i < map.Length; ++i)
195            {
196                for (int j = 0; j < map[i].Length; ++j)
197                {
198                    Vector2 top = 20 * (new Vector2(j, i) - new Vector2(0.0f, 0.5f) - start); 
199                    Vector2 bottom = 20 * (new Vector2(j, i) + new Vector2(0.0f, 0.5f) - start); 
200                    Vector2 left = 20 * (new Vector2(j, i) - new Vector2(0.5f, 0.0f) - start); 
201                    Vector2 right = 20 * (new Vector2(j, i) + new Vector2(0.5f, 0.0f) - start);
202                    Vector2 center = 20 * (new Vector2(j, i) - start);
203                    switch (map[i][j])
204                    {
205                        case '+':
206                            walls.AddFirst(new Wall(Color.LightSlateGray, top, bottom, 40f));
207                            walls.AddFirst(new Wall(Color.LightSlateGray, bottom, top, 40f));
208                            walls.AddFirst(new Wall(Color.LightSlateGray, left, right, 40f));
209                            walls.AddFirst(new Wall(Color.LightSlateGray, right, left, 40f));
210                            break;
211                        case '|':
212                            walls.AddFirst(new Wall(Color.LightSlateGray, top, bottom, 40f));
213                            walls.AddFirst(new Wall(Color.LightSlateGray, bottom, top, 40f));
214                            break;
215                        case '-':
216                            walls.AddFirst(new Wall(Color.LightSlateGray, left, right, 40f));
217                            walls.AddFirst(new Wall(Color.LightSlateGray, right, left, 40f));
218                            break;
219                        case 'r':
220                            walls.AddFirst(new Wall(Color.LightSlateGray, bottom, center, 40f));
221                            walls.AddFirst(new Wall(Color.LightSlateGray, center, bottom, 40f));
222                            walls.AddFirst(new Wall(Color.LightSlateGray, right, center, 40f));
223                            walls.AddFirst(new Wall(Color.LightSlateGray, center, right, 40f));
224                            break;
225                        case 'J':
226                            walls.AddFirst(new Wall(Color.LightSlateGray, bottom, center, 40f));
227                            walls.AddFirst(new Wall(Color.LightSlateGray, center, bottom, 40f));
228                            walls.AddFirst(new Wall(Color.LightSlateGray, left, center, 40f));
229                            walls.AddFirst(new Wall(Color.LightSlateGray, center, left, 40f));
230                            break;
231                        case '/':
232                            walls.AddFirst(new Wall(Color.LightSlateGray, left, center, 40f));
233                            walls.AddFirst(new Wall(Color.LightSlateGray, center, left, 40f));
234                            walls.AddFirst(new Wall(Color.LightSlateGray, top, center, 40f));
235                            walls.AddFirst(new Wall(Color.LightSlateGray, center, top, 40f));
236                            break;
237                        case 'L':
238                            walls.AddFirst(new Wall(Color.LightSlateGray, right, center, 40f));
239                            walls.AddFirst(new Wall(Color.LightSlateGray, center, right, 40f));
240                            walls.AddFirst(new Wall(Color.LightSlateGray, top, center, 40f));
241                            walls.AddFirst(new Wall(Color.LightSlateGray, center, top, 40f));
242                            break;
243                        case 'v':
244                            walls.AddFirst(new Wall(Color.LightSlateGray, left, right, 40f));
245                            walls.AddFirst(new Wall(Color.LightSlateGray, right, left, 40f));
246                            walls.AddFirst(new Wall(Color.LightSlateGray, bottom, center, 40f));
247                            walls.AddFirst(new Wall(Color.LightSlateGray, center, bottom, 40f));
248                            break;
249                        case 'n':
250                            walls.AddFirst(new Wall(Color.LightSlateGray, left, right, 40f));
251                            walls.AddFirst(new Wall(Color.LightSlateGray, right, left, 40f));
252                            walls.AddFirst(new Wall(Color.LightSlateGray, top, center, 40f));
253                            walls.AddFirst(new Wall(Color.LightSlateGray, center, top, 40f));
254                            break;
255                        case '>':
256                            walls.AddFirst(new Wall(Color.LightSlateGray, top, bottom, 40f));
257                            walls.AddFirst(new Wall(Color.LightSlateGray, bottom, top, 40f));
258                            walls.AddFirst(new Wall(Color.LightSlateGray, right, center, 40f));
259                            walls.AddFirst(new Wall(Color.LightSlateGray, center, right, 40f));
260                            break;
261                        case '<':
262                            walls.AddFirst(new Wall(Color.LightSlateGray, top, bottom, 40f));
263                            walls.AddFirst(new Wall(Color.LightSlateGray, bottom, top, 40f));
264                            walls.AddFirst(new Wall(Color.LightSlateGray, left, center, 40f));
265                            walls.AddFirst(new Wall(Color.LightSlateGray, center, left, 40f));
266                            break;
267                    }
268                }
269            }
270            return walls;
271        }
272        /// <summary>
273        /// Updates on the map
274        /// </summary>
275        /// <param name="gamestate">The current gamestate</param>
276        public override void Update(GameState gamestate)
277        {
278            if (gamestate.Pressed(MouseButton.LEFT))
279            {
280                gamestate.handle(MouseButton.LEFT);
281                driver.CloseMap();
282            }
283            base.Update();
284        }
285        /// <summary>
286        /// Draws the minimap to the screen.
287        /// </summary>
288        /// <param name="screen">The screen to be drawn on.</param>
289        public override void Draw(Screen2D screen)
290        {
291            screen.FillRectangle(new Rectangle(0, 0, 1000, 500), new Color(0, 0, 255, 127));
292            int majorSize = 200 / map.Length, minorSize = 75 / map.Length;
293            int xcoord, dxcoord, ycoord = 50, dycoord;
294            for (int i = 1; i < minimap.Length - 1; ++i)
295            {
296                xcoord = (1000 - map[(i - 1) / 3].Length * (2 * majorSize + minorSize)) / 2;
297                dycoord = (i % 3 == 2 ? minorSize : majorSize);
298                for (int j = 1; j < minimap[i].Length - 1; ++j)
299                {
300                    dxcoord = (j % 3 == 2 ? minorSize : majorSize);
301                    Color c;
302                    switch (minimap[i][j])
303                    {
304                        case -1:
305                            c = Color.Black;
306                            break;
307                        case -2:
308                            c = Color.Red;
309                            break;
310                        case -4:
311                            c = Color.Maroon;
312                            break;
313                        default:
314                            c = Color.Gray;
315                            break;
316                    }
317                    screen.FillRectangle(new Rectangle(xcoord, ycoord, dxcoord, dycoord), c);
318                    xcoord += dxcoord;
319                }
320                ycoord += dycoord;
321            }
322            Vector2 loc = ((driver.World3D.CameraPosition2D * (1 / 20.0f)) + start) * (2 * majorSize + minorSize) + new Vector2((1000 - map[0].Length * (2 * majorSize + minorSize)) / 2, 50);
323            screen.FillRectangle(new Rectangle((int)loc.X + 5, (int)loc.Y + 5, 10, 10), Color.White);
324            screen.DrawText("Click anywhere to close", new Vector2(500, 10), TextHorizontal.CENTERED, TextVertical.TOP, Color.White);
325            base.Draw(screen);
326        }
327    }
328}
Note: See TracBrowser for help on using the browser.