X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fcarfire;a=blobdiff_plain;f=CarFire%2FCarFire%2FCarFire%2FGame.cs;h=9a44ff37f16629945ff18469cf4e862935903167;hp=fa3fbd1b9e7b6a5a4134b40f135cf1ddb1144d2a;hb=f4202b11a1891486216aab3c6b1370fc9a3eb89a;hpb=af9deb873b24dadd0d509ce199fc6cac2b3efbc9 diff --git a/CarFire/CarFire/CarFire/Game.cs b/CarFire/CarFire/CarFire/Game.cs index fa3fbd1..9a44ff3 100644 --- a/CarFire/CarFire/CarFire/Game.cs +++ b/CarFire/CarFire/CarFire/Game.cs @@ -15,6 +15,9 @@ namespace CarFire public class GameState { #region Public Properties + + public int HitMonsterScore { get { return hitMonsterScore; } } + public int KillMonsterScore { get { return killMonsterScore; } } public long FrameNumber { get { return mFrameNumber; } } @@ -24,7 +27,9 @@ namespace CarFire public Map Map; public List Entities = new List(); - + public List mProjectiles = new List(); + public Player[] mCharacters; + public Display mDisplay; #endregion @@ -39,6 +44,8 @@ namespace CarFire mNumberOfPlayers = numPlayers; mFrameNumber = 0; + mCharacters = new Player[numPlayers]; + mIsGameOver = new bool[numPlayers]; mIsTerminated = new bool[numPlayers]; @@ -152,7 +159,8 @@ namespace CarFire #region Private Variables - + private const int hitMonsterScore = 20; + private const int killMonsterScore = 100; int mNumberOfPlayers; public Point[] mMouseLocation; public bool[] mMouseButton; @@ -216,11 +224,17 @@ namespace CarFire { get { - bool[,] grid = State.Map.Grid; + bool[,] grid = (bool[,])State.Map.Grid.Clone(); foreach (IEntity entity in State.Entities) { Point coordinates = entity.Coordinates; - grid[coordinates.X, coordinates.Y] = true; + grid[coordinates.X, coordinates.Y] = false; + } + foreach (Player player in State.mCharacters) + { + if (player == null) continue; + Point coordinates = player.Coordinates; + grid[coordinates.X, coordinates.Y] = false; } return grid; } @@ -231,24 +245,99 @@ namespace CarFire #region Public Methods - public bool IsCellOpen(Point point) + /// + /// Get an entity at a certain place on the map. + /// + /// The coordinates. + /// The entity, or null if none is at that location. + public IEntity GetEntityAtCoordinates(Point point) { - if (!State.Map.IsCellOpen(point)) return false; foreach (IEntity entity in State.Entities) { - if (entity.Coordinates == point) return false; + if (entity.Coordinates == point) return entity; + } + return null; + } + + /// + /// Get a player at a certain place on the map. + /// + /// The coordinates. + /// The player, or null if none is at that location. + public Player GetPlayerAtCoordinates(Point point) + { + foreach (Player player in State.mCharacters) + { + if (player != null && player.Coordinates == point) return player; } + return null; + } + + /// + /// Determine if a cell is open, depending on the static scenery + /// of the map and if there are any collidable entities. + /// + /// The coordinates. + /// True if the cell is open; false otherwise. + public bool IsCellOpen(Point point) + { + if (!State.Map.IsCellOpen(point)) return false; + IEntity entity = GetEntityAtCoordinates(point); + if (entity != null && entity.IsCollidable) return false; + Player player = GetPlayerAtCoordinates(point); + if (player != null) return false; return true; } + /// + /// Remove a specific entity from the game. The entity can still + /// be tracked some other way, but it won't included when the game is + /// updating and drawing stuff. + /// + /// The entity. + /// The entity that was removed, or null if no entity was removed. + public IEntity RemoveEntity(IEntity entity) + { + if (State.Entities.Remove(entity)) return entity; + return null; + } + + /// + /// Move on to the next map, and advance the level. + /// + public void AdvanceLevel() + { + // TODO: Load the next map, etc... + //TODO somehow get next map + State.Entities.Clear(); + String nextMap = State.Map.Next; + State.Map = mContentManager.Load("Maps/"+nextMap); + for (int i = 0; i < State.mCharacters.Length; i++) + { + State.mCharacters[i].Coordinates = State.Map.GetStartingPositionForPlayer(i + 1); + } + State.Entities = State.Map.GetAllEntities(this); + } + + /// + /// Restart the current level. + /// + public void Reset() + { + State.Map.Reset(); + // TODO: Do other stuff to reset everything. + } + + public Game() { - mDisplay = new Display(this); + } public void LoadContent(ContentManager contentManager) { mContentManager = contentManager; - mDisplay.LoadContent(contentManager); + menu = mContentManager.Load("menuFont"); + } public void UnloadContent() @@ -290,11 +379,52 @@ namespace CarFire State = new GameState(numPlayers); mInputs = new NextInputs(numPlayers); - - State.Map = mContentManager.Load("Maps/stable"); - State.Map.Game = this; - State.Entities = State.Map.GetAllEntities(); - Map.DefaultTile = mContentManager.Load("default"); + State.mDisplay = new Display(this); + State.mDisplay.LoadContent(mContentManager); + + // Load the tilemap. + Texture2D mapTiles = mContentManager.Load("graphics/wallAndFloorTilesNoEdgeScale"); + Tilemap tilemap = new Tilemap(mapTiles, 10, 7); + tilemap.SetTile('`', new Point(0, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('~', new Point(1, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('!', new Point(2, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('@', new Point(3, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('#', new Point(4, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('$', new Point(5, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('%', new Point(6, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('^', new Point(8, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('&', new Point(9, 2), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('*', new Point(0, 3), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('(', new Point(1, 3), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile(')', new Point(2, 3), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('-', new Point(3, 3), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('=', new Point(4, 3), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('_', new Point(5, 3), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('+', new Point(6, 3), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('|', new Point(8, 3), TileFlags.Closed | TileFlags.Wall); + tilemap.SetTile('[', new Point(0, 4), TileFlags.Default); + tilemap.SetTile(']', new Point(1, 4), TileFlags.Default); + tilemap.SetTile('{', new Point(2, 4), TileFlags.Default); + tilemap.SetTile('}', new Point(3, 4), TileFlags.Default); + tilemap.SetTile('?', new Point(4, 4), TileFlags.Default); + tilemap.SetTile(',', new Point(7, 4), TileFlags.Default); + tilemap.SetTile('.', new Point(8, 4), TileFlags.Default); + tilemap.SetTile('\\', new Point(9, 4), TileFlags.Default); + tilemap.SetTile(';', new Point(0, 5), TileFlags.Default); + tilemap.SetTile(':', new Point(1, 5), TileFlags.Default); + tilemap.SetTile('\'', new Point(2, 5), TileFlags.Default); + tilemap.SetTile('"', new Point(3, 5), TileFlags.Default); + tilemap.SetTile(' ', new Point(4, 5), TileFlags.Default); + tilemap.SetTile('<', new Point(7, 5), TileFlags.Default); + tilemap.SetTile('>', new Point(8, 5), TileFlags.Default); + tilemap.SetTile('/', new Point(9, 5), TileFlags.Default); + Map.Tilemap = tilemap; + + // Load the first map. + State.Map = mContentManager.Load("Maps/colosseumClosed"); + State.Entities = State.Map.GetAllEntities(this); + + mAIData = new AI(this); /* mPlayers.Clear(); @@ -361,8 +491,24 @@ namespace CarFire public long Update(TimeSpan elapsedTime) { State.AdvanceFrame(mInputs, elapsedTime.Milliseconds); // Apply the inputs, advance game state. - mDisplay.Update(elapsedTime, State); - State.Entities.ForEach(delegate(IEntity e) { e.Update(elapsedTime); }); + State.mDisplay.Update(elapsedTime, mThisPlayerID); + State.Entities.ForEach(delegate(IEntity e) + { + IMonster m = e as IMonster; + if (m != null) + { + if (State.mCharacters[0] != null && mAIData.spaceVisible(e.Coordinates, State.mCharacters[0].Coordinates)) + { + m.Chasing(State.mCharacters[0].Coordinates); + } + else + { + m.DefaultAction(); + } + } + e.Update(elapsedTime); + }); + //State.Entities.ForEach(delegate(IEntity e) { e.Update(elapsedTime); }); mInputs = new NextInputs(State.NumberOfPlayers); // Start with inputs cleared on the next frame. //mDisplay.Update(elapsedTime); return State.FrameNumber; @@ -371,7 +517,35 @@ namespace CarFire public long Draw(SpriteBatch spriteBatch) { - mDisplay.Draw(spriteBatch); + bool allCharactersSelected = true; + for (int i = 0; i < State.NumberOfPlayers; i++) + { + //If player has not selected a player yet let them select one. + if (State.mCharacters[i] == null) + { + allCharactersSelected = false; + if (State.GetKeysDown(i).Contains(Keys.M)) + { + State.mCharacters[i] = new Melee(this, "", State.Map.GetStartingPositionForPlayer(i + 1), i); + State.mCharacters[i].LoadContent(mContentManager); + } + else if (State.GetKeysDown(i).Contains(Keys.R)) + { + State.mCharacters[i] = new Ranged(this, "", State.Map.GetStartingPositionForPlayer(i + 1), i); + State.mCharacters[i].LoadContent(mContentManager); + } + } + } + if (allCharactersSelected) + { + + State.mDisplay.Draw(spriteBatch); + } + else + { + spriteBatch.GraphicsDevice.Clear(Color.Black); + spriteBatch.DrawString(menu, "Press R to select a Ranged Character and M to select a Melee Character", new Vector2(30, 30), Color.RosyBrown); + } return CurrentFrameNumber; } @@ -380,8 +554,8 @@ namespace CarFire #region Private Variables - Display mDisplay; - + SpriteFont menu; + AI mAIData; ContentManager mContentManager; NextInputs mInputs;