public class GameState\r
{\r
#region Public Properties\r
+ \r
+ public int HitMonsterScore { get { return hitMonsterScore; } }\r
+ public int KillMonsterScore { get { return killMonsterScore; } }\r
\r
public long FrameNumber { get { return mFrameNumber; } }\r
\r
public List<Projectile> mProjectiles = new List<Projectile>();\r
public Player[] mCharacters;\r
public Display mDisplay;\r
-\r
#endregion\r
\r
\r
\r
\r
#region Private Variables\r
-\r
+ private const int hitMonsterScore = 20;\r
+ private const int killMonsterScore = 100;\r
int mNumberOfPlayers;\r
public Point[] mMouseLocation;\r
public bool[] mMouseButton;\r
{\r
get\r
{\r
- bool[,] grid = State.Map.Grid;\r
+ bool[,] grid = (bool[,])State.Map.Grid.Clone();\r
foreach (IEntity entity in State.Entities)\r
{\r
Point coordinates = entity.Coordinates;\r
- if (State.Map.IsCellOpen(coordinates)) grid[coordinates.X, coordinates.Y] = false;\r
+ grid[coordinates.X, coordinates.Y] = false;\r
+ }\r
+ foreach (Player player in State.mCharacters)\r
+ {\r
+ if (player == null) continue;\r
+ Point coordinates = player.Coordinates;\r
+ grid[coordinates.X, coordinates.Y] = false;\r
}\r
return grid;\r
}\r
\r
#region Public Methods\r
\r
+ /// <summary>\r
+ /// Get an entity at a certain place on the map.\r
+ /// </summary>\r
+ /// <param name="point">The coordinates.</param>\r
+ /// <returns>The entity, or null if none is at that location.</returns>\r
public IEntity GetEntityAtCoordinates(Point point)\r
{\r
foreach (IEntity entity in State.Entities)\r
return null;\r
}\r
\r
+ /// <summary>\r
+ /// Get a player at a certain place on the map.\r
+ /// </summary>\r
+ /// <param name="point">The coordinates.</param>\r
+ /// <returns>The player, or null if none is at that location.</returns>\r
public Player GetPlayerAtCoordinates(Point point)\r
{\r
foreach (Player player in State.mCharacters)\r
return null;\r
}\r
\r
+ /// <summary>\r
+ /// Determine if a cell is open, depending on the static scenery\r
+ /// of the map and if there are any collidable entities.\r
+ /// </summary>\r
+ /// <param name="point">The coordinates.</param>\r
+ /// <returns>True if the cell is open; false otherwise.</returns>\r
public bool IsCellOpen(Point point)\r
{\r
if (!State.Map.IsCellOpen(point)) return false;\r
- if (GetEntityAtCoordinates(point) != null) return false;\r
+ IEntity entity = GetEntityAtCoordinates(point);\r
+ if (entity != null && entity.IsCollidable) return false;\r
+ Player player = GetPlayerAtCoordinates(point);\r
+ if (player != null) return false;\r
return true;\r
}\r
\r
- public Game()\r
+ /// <summary>\r
+ /// Remove a specific entity from the game. The entity can still\r
+ /// be tracked some other way, but it won't included when the game is\r
+ /// updating and drawing stuff.\r
+ /// </summary>\r
+ /// <param name="entity">The entity.</param>\r
+ /// <returns>The entity that was removed, or null if no entity was removed.</returns>\r
+ public IEntity RemoveEntity(IEntity entity)\r
{\r
- \r
+ if (State.Entities.Remove(entity)) return entity;\r
+ return null;\r
}\r
+\r
/// <summary>\r
- /// This method should be called whenever the players want to move to a new map.\r
- /// Not implemented yet. Need some way to get next map.\r
+ /// Move on to the next map, and advance the level.\r
/// </summary>\r
- public void startNewMap()\r
+ public void AdvanceLevel()\r
{\r
+ // TODO: Load the next map, etc...\r
//TODO somehow get next map\r
State.Entities.Clear();\r
- //State.Map = State.Map.getNextMap();\r
+ String nextMap = State.Map.Next;\r
+ State.Map = mContentManager.Load<Map>("Maps/"+nextMap);\r
for (int i = 0; i < State.mCharacters.Length; i++)\r
{\r
State.mCharacters[i].Coordinates = State.Map.GetStartingPositionForPlayer(i + 1);\r
}\r
State.Entities = State.Map.GetAllEntities(this);\r
}\r
+\r
+ /// <summary>\r
+ /// Restart the current level.\r
+ /// </summary>\r
+ public void Reset()\r
+ {\r
+ State.Map.Reset();\r
+ // TODO: Do other stuff to reset everything.\r
+ }\r
+\r
+\r
+ public Game()\r
+ {\r
+ \r
+ }\r
public void LoadContent(ContentManager contentManager)\r
{\r
mContentManager = contentManager;\r
State.mDisplay = new Display(this);\r
State.mDisplay.LoadContent(mContentManager);\r
\r
+ // Load the tilemap.\r
Texture2D mapTiles = mContentManager.Load<Texture2D>("graphics/wallAndFloorTilesNoEdgeScale");\r
Tilemap tilemap = new Tilemap(mapTiles, 10, 7);\r
- tilemap.SetTile(' ', new Point(4, 5));\r
- tilemap.SetTile('`', new Point(0, 1));\r
- tilemap.SetTile('~', new Point(1, 1));\r
- tilemap.SetTile('!', new Point(3, 1));\r
- tilemap.SetTile('@', new Point(4, 1));\r
- tilemap.SetTile('#', new Point(5, 1));\r
- tilemap.SetTile('$', new Point(6, 1));\r
- tilemap.SetTile('%', new Point(8, 1));\r
- tilemap.SetTile('^', new Point(9, 1));\r
- tilemap.SetTile('&', new Point(0, 2));\r
- tilemap.SetTile('=', new Point(1, 2));\r
- tilemap.SetTile('*', new Point(2, 2));\r
- tilemap.SetTile('(', new Point(4, 2));\r
- tilemap.SetTile(')', new Point(0, 3));\r
- tilemap.SetTile('_', new Point(2, 3));\r
- tilemap.SetTile('-', new Point(9, 3));\r
- tilemap.SetTile(',', new Point(1, 4));\r
- tilemap.SetTile('+', new Point(2, 4));\r
- tilemap.SetTile('[', new Point(3, 4));\r
- tilemap.SetTile(']', new Point(4, 4));\r
- tilemap.SetTile('{', new Point(5, 4));\r
- tilemap.SetTile('}', new Point(6, 4));\r
- tilemap.SetTile('\\', new Point(8, 4));\r
- tilemap.SetTile('|', new Point(9, 4));\r
- tilemap.SetTile(';', new Point(0, 5));\r
- tilemap.SetTile(':', new Point(1, 5));\r
- tilemap.SetTile('\'', new Point(2, 5));\r
- tilemap.SetTile('"', new Point(3, 5));\r
- tilemap.SetTile('.', new Point(5, 5));\r
- tilemap.SetTile('<', new Point(6, 5));\r
- tilemap.SetTile('>', new Point(7, 5));\r
- tilemap.SetTile('/', new Point(8, 5));\r
- tilemap.SetTile('?', new Point(9, 5));\r
-\r
- State.Map = mContentManager.Load<Map>("Maps/level1");\r
- State.Map.Tilemap = tilemap;\r
+ tilemap.SetTile('`', new Point(0, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('~', new Point(1, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('!', new Point(2, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('@', new Point(3, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('#', new Point(4, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('$', new Point(5, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('%', new Point(6, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('^', new Point(8, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('&', new Point(9, 2), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('*', new Point(0, 3), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('(', new Point(1, 3), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile(')', new Point(2, 3), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('-', new Point(3, 3), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('=', new Point(4, 3), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('_', new Point(5, 3), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('+', new Point(6, 3), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('|', new Point(8, 3), TileFlags.Closed | TileFlags.Wall);\r
+ tilemap.SetTile('[', new Point(0, 4), TileFlags.Default);\r
+ tilemap.SetTile(']', new Point(1, 4), TileFlags.Default);\r
+ tilemap.SetTile('{', new Point(2, 4), TileFlags.Default);\r
+ tilemap.SetTile('}', new Point(3, 4), TileFlags.Default);\r
+ tilemap.SetTile('?', new Point(4, 4), TileFlags.Default);\r
+ tilemap.SetTile(',', new Point(7, 4), TileFlags.Default);\r
+ tilemap.SetTile('.', new Point(8, 4), TileFlags.Default);\r
+ tilemap.SetTile('\\', new Point(9, 4), TileFlags.Default);\r
+ tilemap.SetTile(';', new Point(0, 5), TileFlags.Default);\r
+ tilemap.SetTile(':', new Point(1, 5), TileFlags.Default);\r
+ tilemap.SetTile('\'', new Point(2, 5), TileFlags.Default);\r
+ tilemap.SetTile('"', new Point(3, 5), TileFlags.Default);\r
+ tilemap.SetTile(' ', new Point(4, 5), TileFlags.Default);\r
+ tilemap.SetTile('<', new Point(7, 5), TileFlags.Default);\r
+ tilemap.SetTile('>', new Point(8, 5), TileFlags.Default);\r
+ tilemap.SetTile('/', new Point(9, 5), TileFlags.Default);\r
+ Map.Tilemap = tilemap;\r
+\r
+ // Load the first map.\r
+ State.Map = mContentManager.Load<Map>("Maps/colosseumClosed");\r
State.Entities = State.Map.GetAllEntities(this);\r
\r
+ mAIData = new AI(this);\r
+\r
/*\r
mPlayers.Clear();\r
for (int i = 0; i < PlayerIdentifiers.Length; i++)\r
*/\r
}\r
\r
+ public AI AIData { get { return mAIData; } }\r
+\r
public long CurrentFrameNumber\r
{\r
get { return State.FrameNumber; }\r
{\r
State.AdvanceFrame(mInputs, elapsedTime.Milliseconds); // Apply the inputs, advance game state.\r
State.mDisplay.Update(elapsedTime, mThisPlayerID);\r
+ /*\r
+ State.Entities.ForEach(delegate(IEntity e) \r
+ {\r
+ IMonster m = e as IMonster;\r
+ if (m != null)\r
+ {\r
+ if (State.mCharacters[0] != null && mAIData.spaceVisible(e.Coordinates, State.mCharacters[0].Coordinates))\r
+ {\r
+ m.Chasing(State.mCharacters[0].Coordinates);\r
+ }\r
+ else\r
+ {\r
+ m.DefaultAction();\r
+ }\r
+ }\r
+ e.Update(elapsedTime); \r
+ });\r
+ */\r
State.Entities.ForEach(delegate(IEntity e) { e.Update(elapsedTime); });\r
mInputs = new NextInputs(State.NumberOfPlayers); // Start with inputs cleared on the next frame.\r
//mDisplay.Update(elapsedTime);\r
#region Private Variables\r
\r
SpriteFont menu;\r
-\r
+ AI mAIData;\r
ContentManager mContentManager;\r
NextInputs mInputs;\r
\r