X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fcarfire;a=blobdiff_plain;f=CarFire%2FCarFire%2FCarFire%2FMap.cs;fp=CarFire%2FCarFire%2FCarFire%2FMap.cs;h=c277a7aa4590633359fd50a7d7ef9349f0ec0eff;hp=95a8c2c9b75253b17cc4debd169d312ca3cf43f5;hb=722dcd763d115992b2a56d4001db80d11e583064;hpb=f6cf62c9a386ab97a2de922d500e27e4e1eff390 diff --git a/CarFire/CarFire/CarFire/Map.cs b/CarFire/CarFire/CarFire/Map.cs index 95a8c2c..c277a7a 100644 --- a/CarFire/CarFire/CarFire/Map.cs +++ b/CarFire/CarFire/CarFire/Map.cs @@ -7,6 +7,7 @@ using System.Runtime.Serialization; using System.Diagnostics; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using System.Reflection; namespace CarFire { @@ -23,7 +24,7 @@ namespace CarFire #region Public Constants - public const float PixelsToUnitSquares = 64.0f; + public const float PixelsToUnitSquares = 8.0f; #endregion @@ -54,6 +55,16 @@ namespace CarFire public int GridHeight; } + /// + /// The container class for information about an entity defined in the map. + /// + public class RawEntity + { + public char Id; + public Point Position; + public Dictionary Attributes = new Dictionary(); + } + #endregion @@ -92,6 +103,11 @@ namespace CarFire // TODO: This should return whatever object we end up using for tilesets. public string Tileset { get { return mData.Metadata.Tileset; } } + /// + /// Get a list of the raw entity containers loaded with the map. + /// + public List RawEntities { get { return mData.Entities; } } + /// /// Get and set the coordinate of the grid cell that should be in @@ -112,7 +128,7 @@ namespace CarFire /// Construct a map with the provided map data. /// /// Map data. - public Map(Metadata metadata, char[,] grid, Dictionary> entities) + public Map(Metadata metadata, char[,] grid, List entities) { mData = new Modal(metadata, grid, entities); mView = new View(mData); @@ -186,7 +202,7 @@ namespace CarFire /// /// Determine whether or not a cell can be occupied by a game entity. /// - /// X,Y-coordinates. + /// X,Y-coordinates. /// True if cell can be occupied, false otherwise. public bool IsCellOpen(Point point) { @@ -195,14 +211,24 @@ namespace CarFire /// - /// Get the entities loaded from the map file. + /// Get all the entities loaded from the map file. Exceptions could be + /// thrown if there are entities without associated classes. /// - /// Dictionary of entities. The keys are the entity - /// identifiers and the value is a dictionary of key-value pairs - /// associated with that entity. - public Dictionary> GetEntities() + /// List of entity objects loaded. + public List GetAllEntities() { - return mData.Entities; + return mData.GetAllEntities(); + } + + /// + /// Get the entities of a certain type loaded from the map file. Exceptions + /// could be thrown if there are entities without associated classes. + /// + /// Type of the entity you want a list of. + /// List of entity objects loaded. + public List GetEntities() + { + return mData.GetEntities(); } #endregion @@ -214,9 +240,9 @@ namespace CarFire { Metadata mMetadata; char[,] mGrid; - Dictionary> mEntities; + List mEntities; - public Modal(Metadata metadata, char[,] grid, Dictionary> entities) + public Modal(Metadata metadata, char[,] grid, List entities) { Debug.Assert(metadata != null); Debug.Assert(grid != null); @@ -237,7 +263,7 @@ namespace CarFire public Metadata Metadata { get { return mMetadata; } } - public Dictionary> Entities { get { return mEntities; } } + public List Entities { get { return mEntities; } } public bool IsCellOpen(int x, int y) @@ -245,6 +271,59 @@ namespace CarFire // TODO: Still need to define characters for types of scenery. return mGrid[x, y] == ' '; } + + + public List GetAllEntities() + { + List list = new List(); + + foreach (RawEntity raw in mEntities) + { + if (raw.Attributes.ContainsKey("type")) + { + string typename = raw.Attributes["type"]; + + object[] args = new object[3]; + args[0] = raw.Id; + args[1] = raw.Position; + args[2] = raw.Attributes; + + object entity = Activator.CreateInstance(System.Type.GetType("CarFire." + typename), args); + if (entity != null) list.Add(entity); + else Console.WriteLine("Entity of type " + typename + " not loaded because an entity class can't be found."); + } + else + { + Console.WriteLine("Ignoring entity with identifier " + raw.Id + " since it has no type key."); + } + } + + return list; + } + + public List GetEntities() + { + System.Type type = typeof(T); + List list = new List(); + + string typename = typeof(T).Name; + foreach (RawEntity raw in mEntities) + { + if (raw.Attributes.ContainsKey("type") && typename == raw.Attributes["type"]) + { + object[] args = new object[3]; + args[0] = raw.Id; + args[1] = raw.Position; + args[2] = raw.Attributes; + + T entity = (T)Activator.CreateInstance(type, args); + if (entity != null) list.Add(entity); + else Console.WriteLine("Entity of type " + typename + " not loaded because an entity class can't be found."); + } + } + + return list; + } } class View