diff --git a/DepthsBelow/DepthsBelow/Core.cs b/DepthsBelow/DepthsBelow/Core.cs index d2cb71c..64c23f5 100755 --- a/DepthsBelow/DepthsBelow/Core.cs +++ b/DepthsBelow/DepthsBelow/Core.cs @@ -1,256 +1,256 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using DepthsBelow.GUI; -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Audio; -using Microsoft.Xna.Framework.Content; -using Microsoft.Xna.Framework.GamerServices; -using Microsoft.Xna.Framework.Graphics; -using Microsoft.Xna.Framework.Input; -using Microsoft.Xna.Framework.Media; - -namespace DepthsBelow -{ - /// - /// This is the main type for your game - /// - public class Core : Microsoft.Xna.Framework.Game - { - public static GraphicsDeviceManager GraphicsDeviceManager; - private SpriteBatch spriteBatch; - private Effect lightShader; - private RenderTarget2D lightRenderTarget; - private RenderTarget2D sceneRenderTarget; - - public Lua Lua; - - public TurnManager TurnManager; - - public Camera Camera; - public Interface Interface; - - public/* static*/ MouseInput MouseInput; - public static KeyboardInput KeyboardInput; - public List Squad; - public DynamicGroupManager GroupManager; - public List Swarm; - public List Volley; - - public List Spawn; - - public static Map Map; - - public SmallEnemy TestMonster; - - public int Brightness = 30; - - public Core() - { - GraphicsDeviceManager = new GraphicsDeviceManager(this); - GraphicsDeviceManager.PreferredBackBufferWidth = 1280; - GraphicsDeviceManager.PreferredBackBufferHeight = 720; - GraphicsDeviceManager.IsFullScreen = false; - //graphics.SynchronizeWithVerticalRetrace = false; - GraphicsDeviceManager.ApplyChanges(); - - this.IsFixedTimeStep = false; - this.IsMouseVisible = true; - - Content.RootDirectory = "Content"; - } - - /// - /// Allows the game to perform any initialization it needs to before starting to run. - /// This is where it can query for any required services and load any non-graphic - /// related content. Calling base.Initialize will enumerate through any components - /// and initialize them as well. - /// - protected override void Initialize() - { - GameServices.AddService(GraphicsDevice); - GameServices.AddService(Content); - - Lua = new Lua(); - - TurnManager = new TurnManager(new string[] { "Player", "Computer" }); - - Camera = new Camera(this); - Interface = new Interface(this); - - Squad = new List(); - Swarm = new List(); - Volley = new List(); - - Spawn = new List(); - - base.Initialize(); - } - - /// - /// LoadContent will be called once per game and is the place to load - /// all of your content. - /// - protected override void LoadContent() - { - // Create a new SpriteBatch, which can be used to draw textures. - spriteBatch = new SpriteBatch(GraphicsDevice); - lightShader = Content.Load("shaders/LightEffect"); - lightRenderTarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, false, SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents); - sceneRenderTarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height); - - Map = Content.Load("maps/prototyp"); - //Map = Content.Load("maps/Aztek.Test"); - //Map = Content.Load("maps/Cave.Level1"); - - // Load map objects - Map.ParseObjects(this); - - Squad[0].Name = "Dean H. Jones"; - Squad[1].Name = "Walter L. Verville"; - Squad[2].Name = "Patrick Y. Southerland"; - Squad[3].Name = "Andrew C. Friend"; - Squad[4].Name = "Gary B. Whitley"; - - // Center the camera on a unit - Camera.Position = Squad[0].Transform.World.Position * -1 + new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2); - - GroupManager = new DynamicGroupManager(Squad.Cast().ToList(), (float)Grid.TileSize * 1.5f); - - Interface.CreateUnitFrames(Squad); - - // TODO: use this.Content to load your game content here - Soldier.LoadContent(); - SmallEnemy.LoadContent(); - //Shot.LoadContent(); - - MouseInput = new MouseInput(this); - MouseInput.LoadContent(); - KeyboardInput = new KeyboardInput(this); - - TestMonster = new SmallEnemy(ref Swarm); - TestMonster.X = 12; - TestMonster.Y = 4; - Swarm.Add(TestMonster); - - // Load Lua scripts after everything is created - Lua.LoadScripts(); - } - - /// - /// UnloadContent will be called once per game and is the place to unload - /// all content. - /// - protected override void UnloadContent() - { - // TODO: Unload any non ContentManager content here - } - - /// - /// Allows the game to run logic such as updating the world, - /// checking for collisions, gathering input, and playing audio. - /// - /// Provides a snapshot of timing values. - protected override void Update(GameTime gameTime) - { - // Allows the game to exit - if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) - this.Exit(); - - Camera.Update(gameTime); - MouseInput.Update(gameTime); - KeyboardInput.Update(gameTime); - - EntityManager.Update(gameTime); - - Interface.Update(gameTime); - GUIManager.Update(gameTime); - - base.Update(gameTime); - } - - /// - /// This is called when the game should draw itself. - /// - /// Provides a snapshot of timing values. - protected override void Draw(GameTime gameTime) - { - MouseState ms = Mouse.GetState(); - - // Draw to the lighting render target - GraphicsDevice.SetRenderTarget(lightRenderTarget); - GraphicsDevice.Clear(new Color(Brightness, Brightness, Brightness)); - spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Additive, SamplerState.PointClamp, null, null, null, - Camera.Transform); - - // Draw flashlights - foreach (var light in EntityManager.GetComponents()) - light.Draw(spriteBatch); - - spriteBatch.End(); - GraphicsDevice.SetRenderTarget(null); - - // Draw the scene to a render target - GraphicsDevice.SetRenderTarget(sceneRenderTarget); - GraphicsDevice.Clear(Color.Black); - // Start drawing using the Camera transform - spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null, - Camera.Transform); - - // Draw the level - Map.Draw(spriteBatch); - - // Draw entities - foreach (var spriteRenderer in EntityManager.GetComponents()) - { - // Only render illuminated entities - var position = Camera.WorldToScreen(spriteRenderer.Parent.Transform.World + spriteRenderer.Parent.Transform.World.Origin); - var sourceRect = new Rectangle((int)position.X, (int)position.Y, 1, 1); - if ( - sourceRect.X >= 0 - && sourceRect.Y >= 0 - && sourceRect.X < lightRenderTarget.Width - && sourceRect.Y < lightRenderTarget.Height - ) - { - var lightData = new Color[1]; - lightRenderTarget.GetData(0, sourceRect, lightData, 0, 1); - if (lightData[0] != new Color(Brightness, Brightness, Brightness)) - spriteRenderer.Draw(spriteBatch); - } - } - -#if DEBUG - var debugTexture = new Texture2D(GraphicsDevice, 1, 1); - debugTexture.SetData(new Color[] { Color.White }); - foreach (var collisionComponent in EntityManager.GetComponents()) - { - spriteBatch.Draw(debugTexture, collisionComponent.Rectangle, Color.Red * 0.5f); - } -#endif - - // Draw mouse input visuals - MouseInput.Draw(spriteBatch); - - spriteBatch.End(); - GraphicsDevice.SetRenderTarget(null); - - // Draw the scene from the render target with the light shader - lightShader.Parameters["LightsTexture"].SetValue(lightRenderTarget); - lightShader.CurrentTechnique.Passes[0].Apply(); - spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointClamp, null, null, lightShader, - Matrix.Identity); - spriteBatch.Draw(sceneRenderTarget, Vector2.Zero, Color.White); - spriteBatch.End(); - - // Draw GUI components - spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.AnisotropicClamp, null, null, null, Matrix.Identity); - GUIManager.Draw(spriteBatch); - spriteBatch.End(); - - base.Draw(gameTime); - } - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using DepthsBelow.GUI; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Audio; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.GamerServices; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using Microsoft.Xna.Framework.Media; + +namespace DepthsBelow +{ + /// + /// This is the main type for your game + /// + public class Core : Microsoft.Xna.Framework.Game + { + public static GraphicsDeviceManager GraphicsDeviceManager; + private SpriteBatch spriteBatch; + private Effect lightShader; + private RenderTarget2D lightRenderTarget; + private RenderTarget2D sceneRenderTarget; + + public Lua Lua; + + public TurnManager TurnManager; + + public Camera Camera; + public Interface Interface; + + public/* static*/ MouseInput MouseInput; + public static KeyboardInput KeyboardInput; + public List Squad; + public DynamicGroupManager GroupManager; + public List Swarm; + public List Volley; + + public List Spawn; + + public static Map Map; + + public SmallEnemy TestMonster; + + public int Brightness = 30; + + public Core() + { + GraphicsDeviceManager = new GraphicsDeviceManager(this); + GraphicsDeviceManager.PreferredBackBufferWidth = 1280; + GraphicsDeviceManager.PreferredBackBufferHeight = 720; + GraphicsDeviceManager.IsFullScreen = false; + //graphics.SynchronizeWithVerticalRetrace = false; + GraphicsDeviceManager.ApplyChanges(); + + this.IsFixedTimeStep = false; + this.IsMouseVisible = true; + + Content.RootDirectory = "Content"; + } + + /// + /// Allows the game to perform any initialization it needs to before starting to run. + /// This is where it can query for any required services and load any non-graphic + /// related content. Calling base.Initialize will enumerate through any components + /// and initialize them as well. + /// + protected override void Initialize() + { + GameServices.AddService(GraphicsDevice); + GameServices.AddService(Content); + + Lua = new Lua(); + + TurnManager = new TurnManager(new string[] { "Player", "Computer" }); + + Camera = new Camera(this); + Interface = new Interface(this); + + Squad = new List(); + Swarm = new List(); + Volley = new List(); + + Spawn = new List(); + + base.Initialize(); + } + + /// + /// LoadContent will be called once per game and is the place to load + /// all of your content. + /// + protected override void LoadContent() + { + // Create a new SpriteBatch, which can be used to draw textures. + spriteBatch = new SpriteBatch(GraphicsDevice); + lightShader = Content.Load("shaders/LightEffect"); + lightRenderTarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, false, SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents); + sceneRenderTarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height); + + Map = Content.Load("maps/prototyp"); + //Map = Content.Load("maps/Aztek.Test"); + //Map = Content.Load("maps/Cave.Level1"); + + // Load map objects + Map.ParseObjects(this); + + Squad[0].Name = "Dean H. Jones"; + Squad[1].Name = "Walter L. Verville"; + Squad[2].Name = "Patrick Y. Southerland"; + Squad[3].Name = "Andrew C. Friend"; + Squad[4].Name = "Gary B. Whitley"; + + // Center the camera on a unit + Camera.Position = Squad[0].Transform.World.Position * -1 + new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2); + + GroupManager = new DynamicGroupManager(Squad.Cast().ToList(), (float)Grid.TileSize * 1.5f); + + Interface.CreateUnitFrames(Squad); + + // TODO: use this.Content to load your game content here + Soldier.LoadContent(); + SmallEnemy.LoadContent(); + //Shot.LoadContent(); + + MouseInput = new MouseInput(this); + MouseInput.LoadContent(); + KeyboardInput = new KeyboardInput(this); + + TestMonster = new SmallEnemy(ref Swarm); + TestMonster.X = 12; + TestMonster.Y = 4; + Swarm.Add(TestMonster); + + // Load Lua scripts after everything is created + Lua.LoadScripts(); + } + + /// + /// UnloadContent will be called once per game and is the place to unload + /// all content. + /// + protected override void UnloadContent() + { + // TODO: Unload any non ContentManager content here + } + + /// + /// Allows the game to run logic such as updating the world, + /// checking for collisions, gathering input, and playing audio. + /// + /// Provides a snapshot of timing values. + protected override void Update(GameTime gameTime) + { + // Allows the game to exit + if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) + this.Exit(); + + Camera.Update(gameTime); + MouseInput.Update(gameTime); + KeyboardInput.Update(gameTime); + + EntityManager.Update(gameTime); + + Interface.Update(gameTime); + GUIManager.Update(gameTime); + + base.Update(gameTime); + } + + /// + /// This is called when the game should draw itself. + /// + /// Provides a snapshot of timing values. + protected override void Draw(GameTime gameTime) + { + MouseState ms = Mouse.GetState(); + + // Draw to the lighting render target + GraphicsDevice.SetRenderTarget(lightRenderTarget); + GraphicsDevice.Clear(new Color(Brightness, Brightness, Brightness)); + spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Additive, SamplerState.PointClamp, null, null, null, + Camera.Transform); + + // Draw flashlights + foreach (var light in EntityManager.GetComponents()) + light.Draw(spriteBatch); + + spriteBatch.End(); + GraphicsDevice.SetRenderTarget(null); + + // Draw the scene to a render target + GraphicsDevice.SetRenderTarget(sceneRenderTarget); + GraphicsDevice.Clear(Color.Black); + // Start drawing using the Camera transform + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null, + Camera.Transform); + + // Draw the level + Map.Draw(spriteBatch); + + // Draw entities + foreach (var spriteRenderer in EntityManager.GetComponents()) + { + // Only render illuminated entities + var position = Camera.WorldToScreen(spriteRenderer.Parent.Transform.World + spriteRenderer.Parent.Transform.World.Origin); + var sourceRect = new Rectangle((int)position.X, (int)position.Y, 1, 1); + if ( + sourceRect.X >= 0 + && sourceRect.Y >= 0 + && sourceRect.X < lightRenderTarget.Width + && sourceRect.Y < lightRenderTarget.Height + ) + { + var lightData = new Color[1]; + lightRenderTarget.GetData(0, sourceRect, lightData, 0, 1); + if (lightData[0] != new Color(Brightness, Brightness, Brightness)) + spriteRenderer.Draw(spriteBatch); + } + } + +/*#if DEBUG + var debugTexture = new Texture2D(GraphicsDevice, 1, 1); + debugTexture.SetData(new Color[] { Color.White }); + foreach (var collisionComponent in EntityManager.GetComponents()) + { + spriteBatch.Draw(debugTexture, collisionComponent.Rectangle, Color.Red * 0.5f); + } +#endif*/ + + // Draw mouse input visuals + MouseInput.Draw(spriteBatch); + + spriteBatch.End(); + GraphicsDevice.SetRenderTarget(null); + + // Draw the scene from the render target with the light shader + lightShader.Parameters["LightsTexture"].SetValue(lightRenderTarget); + lightShader.CurrentTechnique.Passes[0].Apply(); + spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointClamp, null, null, lightShader, + Matrix.Identity); + spriteBatch.Draw(sceneRenderTarget, Vector2.Zero, Color.White); + spriteBatch.End(); + + // Draw GUI components + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.AnisotropicClamp, null, null, null, Matrix.Identity); + GUIManager.Draw(spriteBatch); + spriteBatch.End(); + + base.Draw(gameTime); + } + } +} diff --git a/DepthsBelow/DepthsBelow/Map.cs b/DepthsBelow/DepthsBelow/Map.cs index efa74c5..6e844e5 100755 --- a/DepthsBelow/DepthsBelow/Map.cs +++ b/DepthsBelow/DepthsBelow/Map.cs @@ -1,181 +1,197 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Graphics; - -namespace DepthsBelow -{ - public class MapTile - { - public int LocalId; - public Texture2D Texture; - public Rectangle SourceRectangle; - public SpriteEffects SpriteEffects; - } - - public enum MapObjectType : byte - { - Plain, - Tile, - Polygon, - Polyline - } - - public class MapObject - { - //public MapObjectType ObjectType; - public string Name; - public string Type; - public Rectangle Bounds; - public List Points; - } - - public class MapLayer - { - public int Width; - public int Height; - public string Name; - } - - public class MapTileLayer : MapLayer - { - public MapTile[] Tiles; - } - - public class MapObjectLayer : MapLayer - { - public MapObject[] Objects; - } - - public class Map - { - public int TileWidth; - public int TileHeight; - public List Layers = new List(); - - public Map() - { - - } - - public void ParseObjects(Core core) - { - foreach (var layer in Layers) - { - var objectLayer = layer as MapObjectLayer; - - if (objectLayer == null) - continue; - - foreach (var mapObject in objectLayer.Objects) - { - if (mapObject.Type == "SquadStart") - { - var soldier = new Soldier(ref core.Squad); - soldier.Name = "Derp"; - // HACK: For some reason, the tile object coordinates are offset by one tile on the Y-axis in the Tiled map file (https://github.com/bjorn/tiled/issues/91) - var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); - var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); - soldier.X = mapObjectGridPos.X; - soldier.Y = mapObjectGridPos.Y; - - core.Squad.Add(soldier); - } - if (mapObject.Type == "MonsterSpawn") - { - var enemy = new MonsterSpawn("Monster", ref core.Swarm); - var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); - var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); - enemy.X = mapObjectGridPos.X; - enemy.Y = mapObjectGridPos.Y; - } - if (mapObject.Type == "BossSpawn") - { - var enemy = new MonsterSpawn("BUB", ref core.Swarm); - var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); - var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); - enemy.X = mapObjectGridPos.X; - enemy.Y = mapObjectGridPos.Y; - } - if (mapObject.Type == "Door") - { - var door = new Door(); - var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y); - var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); - door.X = mapObjectGridPos.X; - door.Y = mapObjectGridPos.Y; - } - } - } - } - - public void Draw(SpriteBatch spriteBatch) - { - foreach (var layer in Layers) - { - var tileLayer = layer as MapTileLayer; - - if (tileLayer == null) - continue; - - // Don't draw the collision layer - if (tileLayer.Name == "Collision") - continue; - - for (int y = 0; y < tileLayer.Height; y++) - { - for (int x = 0; x < tileLayer.Width; x++) - { - MapTile mapTile = tileLayer.Tiles[y * layer.Width + x]; - if (mapTile != null) - { - spriteBatch.Draw( - mapTile.Texture, - new Rectangle(x * TileWidth, y * TileHeight, TileWidth, TileHeight), - mapTile.SourceRectangle, - Color.White, - 0, - Vector2.Zero, - mapTile.SpriteEffects, - 0); - } - } - } - } - } - - public byte[,] GetCollisionMap() - { - byte[,] collisionMap = null; - - foreach (var layer in Layers) - { - var tileLayer = layer as MapTileLayer; - - if (tileLayer != null && tileLayer.Name == "Collision") - { - collisionMap = new byte[1024,1024]; - for (int y = 0; y < tileLayer.Height; y++) - { - for (int x = 0; x < tileLayer.Width; x++) - { - MapTile tile = tileLayer.Tiles[y * layer.Width + x]; - if (tile == null || tile.LocalId == 0) - collisionMap[x, y] = 1; - else - collisionMap[x, y] = 0; - } - } - - break; - } - } - - if (collisionMap == null) - Debug.WriteLine("Map lacks a Collision layer! Pathfinding won't work."); - - return collisionMap; - } - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace DepthsBelow +{ + public class MapTile + { + public int LocalId; + public Texture2D Texture; + public Rectangle SourceRectangle; + public SpriteEffects SpriteEffects; + } + + public enum MapObjectType : byte + { + Plain, + Tile, + Polygon, + Polyline + } + + public class MapObject + { + //public MapObjectType ObjectType; + public string Name; + public string Type; + public Rectangle Bounds; + public List Points; + } + + public class MapLayer + { + public int Width; + public int Height; + public string Name; + } + + public class MapTileLayer : MapLayer + { + public MapTile[] Tiles; + } + + public class MapObjectLayer : MapLayer + { + public MapObject[] Objects; + } + + public class Map + { + public int TileWidth; + public int TileHeight; + public List Layers = new List(); + + public Map() + { + + } + + public void ParseObjects(Core core) + { + foreach (var layer in Layers) + { + var objectLayer = layer as MapObjectLayer; + + if (objectLayer == null) + continue; + + foreach (var mapObject in objectLayer.Objects) + { + if (mapObject.Type == "SquadStart") + { + var soldier = new Soldier(ref core.Squad); + soldier.Name = "Derp"; + // HACK: For some reason, the tile object coordinates are offset by one tile on the Y-axis in the Tiled map file (https://github.com/bjorn/tiled/issues/91) + var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); + var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); + soldier.X = mapObjectGridPos.X; + soldier.Y = mapObjectGridPos.Y; + + core.Squad.Add(soldier); + } + if (mapObject.Type == "MonsterSpawn" || mapObject.Type == "EnemySpawn") + { + var enemy = new MonsterSpawn("Monster", 14, 0, ref core.Swarm); + var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); + var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); + enemy.X = mapObjectGridPos.X; + enemy.Y = mapObjectGridPos.Y; + } + if (mapObject.Type == "AmbushMonsterSpawn" || mapObject.Type == "AmbushEnemySpawn") + { + var enemy = new MonsterSpawn("Monster", 2, 0, ref core.Swarm); + var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); + var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); + enemy.X = mapObjectGridPos.X; + enemy.Y = mapObjectGridPos.Y; + } + if (mapObject.Type == "DelayedMonsterSpawn" || mapObject.Type == "DelayedEnemySpawn") + { + var enemy = new MonsterSpawn("Monster", 200, 8, ref core.Swarm); + var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); + var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); + enemy.X = mapObjectGridPos.X; + enemy.Y = mapObjectGridPos.Y; + } + /*if (mapObject.Type == "BossSpawn") + { + var enemy = new MonsterSpawn("BUB", 12, 0, ref core.Swarm); + var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); + var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); + enemy.X = mapObjectGridPos.X; + enemy.Y = mapObjectGridPos.Y; + }*/ + if (mapObject.Type == "Door") + { + var door = new Door(); + var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y); + var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); + door.X = mapObjectGridPos.X; + door.Y = mapObjectGridPos.Y; + } + } + } + } + + public void Draw(SpriteBatch spriteBatch) + { + foreach (var layer in Layers) + { + var tileLayer = layer as MapTileLayer; + + if (tileLayer == null) + continue; + + // Don't draw the collision layer + if (tileLayer.Name == "Collision") + continue; + + for (int y = 0; y < tileLayer.Height; y++) + { + for (int x = 0; x < tileLayer.Width; x++) + { + MapTile mapTile = tileLayer.Tiles[y * layer.Width + x]; + if (mapTile != null) + { + spriteBatch.Draw( + mapTile.Texture, + new Rectangle(x * TileWidth, y * TileHeight, TileWidth, TileHeight), + mapTile.SourceRectangle, + Color.White, + 0, + Vector2.Zero, + mapTile.SpriteEffects, + 0); + } + } + } + } + } + + public byte[,] GetCollisionMap() + { + byte[,] collisionMap = null; + + foreach (var layer in Layers) + { + var tileLayer = layer as MapTileLayer; + + if (tileLayer != null && tileLayer.Name == "Collision") + { + collisionMap = new byte[1024,1024]; + for (int y = 0; y < tileLayer.Height; y++) + { + for (int x = 0; x < tileLayer.Width; x++) + { + MapTile tile = tileLayer.Tiles[y * layer.Width + x]; + if (tile == null || tile.LocalId == 0) + collisionMap[x, y] = 1; + else + collisionMap[x, y] = 0; + } + } + + break; + } + } + + if (collisionMap == null) + Debug.WriteLine("Map lacks a Collision layer! Pathfinding won't work."); + + return collisionMap; + } + } +} diff --git a/DepthsBelow/DepthsBelow/MonsterSpawn.cs b/DepthsBelow/DepthsBelow/MonsterSpawn.cs index a60b25f..48e9703 100755 --- a/DepthsBelow/DepthsBelow/MonsterSpawn.cs +++ b/DepthsBelow/DepthsBelow/MonsterSpawn.cs @@ -1,57 +1,60 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using Microsoft.Xna.Framework; - -namespace DepthsBelow -{ - public class MonsterSpawn : Entity - { - //EntityManager entityManager; - - int wakingDistance = 7; - int sleepingDistance = 6; - - string type; - - List swarm; - - public MonsterSpawn(string _type, ref List Swarm) - : base() - { - //this.entityManager = entityManager; - type = _type; - swarm = Swarm; - } - - public override void Update(GameTime gameTime) - { - for (int index = 0; index < EntityManager.Entities.Count; index++) - { - var entity = EntityManager.Entities[index]; - if (entity is Soldier) - { - Vector2 distance1 = new Vector2(this.GetComponent().Grid.Position.X, - this.GetComponent().Grid.Position.Y); - Vector2 distance2 = new Vector2(entity.GetComponent().Grid.Position.X, - entity.GetComponent().Grid.Position.Y); - if (Vector2.Distance(distance1, distance2) < wakingDistance/* && Vector2.Distance(distance1, distance2) > sleepingDistance*/) - { - var enemy = new SmallEnemy(ref swarm); - if (type == "BUB") - { - enemy.LoadBoss(); - } - enemy.X = this.X; - enemy.Y = this.Y; - swarm.Add(enemy); - this.Remove(); - break; - } - } - } - } - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework; + +namespace DepthsBelow +{ + public class MonsterSpawn : Entity + { + //EntityManager entityManager; + + int wakingDistance = 12; + int sleepingDistance = 6; + int wakingTurn = 0; + + string type; + + List swarm; + + public MonsterSpawn(string _type, int _wakingDistance, int _wakingTurn, ref List Swarm) + : base() + { + //this.entityManager = entityManager; + type = _type; + swarm = Swarm; + wakingDistance = _wakingDistance; + wakingTurn = _wakingTurn; + } + + public override void Update(GameTime gameTime) + { + for (int index = 0; index < EntityManager.Entities.Count; index++) + { + var entity = EntityManager.Entities[index]; + if (entity is Soldier) + { + Vector2 distance1 = new Vector2(this.GetComponent().Grid.Position.X, + this.GetComponent().Grid.Position.Y); + Vector2 distance2 = new Vector2(entity.GetComponent().Grid.Position.X, + entity.GetComponent().Grid.Position.Y); + if (Vector2.Distance(distance1, distance2) < wakingDistance && TurnManager.currentTurn >= wakingTurn/* && Vector2.Distance(distance1, distance2) > sleepingDistance*/) + { + var enemy = new SmallEnemy(ref swarm); + if (type == "BUB") + { + enemy.LoadBoss(); + } + enemy.X = this.X; + enemy.Y = this.Y; + swarm.Add(enemy); + this.Remove(); + break; + } + } + } + } + } +} diff --git a/DepthsBelow/DepthsBelow/SmallEnemy.cs b/DepthsBelow/DepthsBelow/SmallEnemy.cs index d310679..145ba0b 100755 --- a/DepthsBelow/DepthsBelow/SmallEnemy.cs +++ b/DepthsBelow/DepthsBelow/SmallEnemy.cs @@ -1,192 +1,192 @@ -using System; -using System.Collections.Generic; -using DepthsBelow.Component; -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Content; -using Microsoft.Xna.Framework.Graphics; -using Microsoft.Xna.Framework.Input; - -namespace DepthsBelow -{ - public class SmallEnemy : Entity - { - public static Texture2D Texture; - public Color Color; - public static Point Origin; - private bool _selected; //I guess as in "currently doing something" - - public List Swarm; - - private PathFinder.Node nextNode; - - public int numberOfSteps = 5; - public int currentStep = 0; - - public bool AttackedThisTurn = false; - - public int step - { - get { return currentStep; } - set - { - currentStep = value; - } - } - - public SmallEnemy(ref List swarm) - : base() - { - if (Texture == null) - LoadContent(); - - this.Swarm = swarm; - - Transform.World.Origin = new Vector2(20, 16); - - this.Color = Color.White; - var rc = new SpriteRenderer(this) { Texture = Texture, Color = Color.White }; - AddComponent(rc); - - var cc = new Collision(this, 32, 32); - cc.Solid = true; - AddComponent(cc); - - var pfc = new PathFinder(this); - AddComponent(pfc); - - var stat = new Component.Stat(this) - { - Life = 50, - Defence = 25, - Strength = 26, - GetAim = 100, - GetDodge = 50 - }; - AddComponent(stat); - } - public override void Remove() - { - Swarm.Remove(this); - - base.Remove(); - } - - public bool Selected - { - get { return _selected; } - set - { - _selected = value; - GetComponent().Color = (value) ? Color.Blue : this.Color; - } - } - - public static void LoadContent() - { - Texture = GameServices.GetService().Load("images/Monster"); - } - - public void LoadBoss() - { - GetComponent().AlternativeTexture = GameServices.GetService().Load("images/Pineapple"); - var stat = new Component.Stat(this) - { - Life = 500, - Defence = 15, - Strength = 70, - GetAim = 80, - GetDodge = 5 - }; - } - - public override void Update(GameTime gameTime) - { - base.Update(gameTime); - - float elapsed = gameTime.ElapsedGameTime.Milliseconds / 1000.0f; - - if (nextNode == null) - nextNode = GetComponent().Next(); - - if (nextNode != null) - { - List soldierCollisions = new List(); - - // Collision with moving units - foreach (var body in Swarm) - { - if (body != this) - { - if (body.Transform.Grid == nextNode.Position) - { - soldierCollisions.Add(body.Transform.Grid); - GetComponent().RecreatePath(soldierCollisions); - nextNode = GetComponent().Next(); - break; - } - } - } - - if (nextNode != null) - { - var nodeWorldPos = Grid.GridToWorld(nextNode.Position); - // HACK: Make this work properly with other speeds... - float speed = 4f; - if (Transform.World.X < nodeWorldPos.X) - { - Transform.World.X += speed; - GetComponent().World.Rotation = MathHelper.ToRadians(0); - } - if (Transform.World.X > nodeWorldPos.X) - { - Transform.World.X -= speed; - GetComponent().World.Rotation = MathHelper.ToRadians(180); - } - if (Transform.World.Y < nodeWorldPos.Y) - { - Transform.World.Y += speed; - GetComponent().World.Rotation = MathHelper.ToRadians(90); - } - if (Transform.World.Y > nodeWorldPos.Y) - { - Transform.World.Y -= speed; - GetComponent().World.Rotation = MathHelper.ToRadians(270); - } - if (Transform.World == nodeWorldPos) - { - if (currentStep < numberOfSteps) - { - currentStep++; - //lastLastNode = lastNode; - //lastNode = nextNode; - nextNode = GetComponent().Next(); - } - else - { - - GetComponent().Stop(); - } - foreach (var entity in EntityManager.Entities) - { - if (entity is Soldier) - { - if (entity.GetComponent().Rectangle.Intersects(this.GetComponent().Rectangle)) - { - if (AttackedThisTurn == false) - { - if (Utility.AttackTest(this.GetComponent(), entity, Utility.CalculateHitChance(this.GetComponent(), this.Transform.World.Position, entity))) - { - AttackedThisTurn = true; - break; - } - } - } - } - } - } - } - - } - } - } +using System; +using System.Collections.Generic; +using DepthsBelow.Component; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; + +namespace DepthsBelow +{ + public class SmallEnemy : Entity + { + public static Texture2D Texture; + public Color Color; + public static Point Origin; + private bool _selected; //I guess as in "currently doing something" + + public List Swarm; + + private PathFinder.Node nextNode; + + public int numberOfSteps = 8; + public int currentStep = 0; + + public bool AttackedThisTurn = false; + + public int step + { + get { return currentStep; } + set + { + currentStep = value; + } + } + + public SmallEnemy(ref List swarm) + : base() + { + if (Texture == null) + LoadContent(); + + this.Swarm = swarm; + + Transform.World.Origin = new Vector2(20, 16); + + this.Color = Color.White; + var rc = new SpriteRenderer(this) { Texture = Texture, Color = Color.White }; + AddComponent(rc); + + var cc = new Collision(this, 32, 32); + cc.Solid = true; + AddComponent(cc); + + var pfc = new PathFinder(this); + AddComponent(pfc); + + var stat = new Component.Stat(this) + { + Life = 50, + Defence = 25, + Strength = 70, + GetAim = 100, + GetDodge = 50 + }; + AddComponent(stat); + } + public override void Remove() + { + Swarm.Remove(this); + + base.Remove(); + } + + public bool Selected + { + get { return _selected; } + set + { + _selected = value; + GetComponent().Color = (value) ? Color.Blue : this.Color; + } + } + + public static void LoadContent() + { + Texture = GameServices.GetService().Load("images/Monster"); + } + + public void LoadBoss() + { + GetComponent().AlternativeTexture = GameServices.GetService().Load("images/Pineapple"); + var stat = new Component.Stat(this) + { + Life = 500, + Defence = 15, + Strength = 70, + GetAim = 80, + GetDodge = 5 + }; + } + + public override void Update(GameTime gameTime) + { + base.Update(gameTime); + + float elapsed = gameTime.ElapsedGameTime.Milliseconds / 1000.0f; + + if (nextNode == null) + nextNode = GetComponent().Next(); + + if (nextNode != null) + { + List soldierCollisions = new List(); + + // Collision with moving units + foreach (var body in Swarm) + { + if (body != this) + { + if (body.Transform.Grid == nextNode.Position) + { + soldierCollisions.Add(body.Transform.Grid); + GetComponent().RecreatePath(soldierCollisions); + nextNode = GetComponent().Next(); + break; + } + } + } + + if (nextNode != null) + { + var nodeWorldPos = Grid.GridToWorld(nextNode.Position); + // HACK: Make this work properly with other speeds... + float speed = 4f; + if (Transform.World.X < nodeWorldPos.X) + { + Transform.World.X += speed; + GetComponent().World.Rotation = MathHelper.ToRadians(0); + } + if (Transform.World.X > nodeWorldPos.X) + { + Transform.World.X -= speed; + GetComponent().World.Rotation = MathHelper.ToRadians(180); + } + if (Transform.World.Y < nodeWorldPos.Y) + { + Transform.World.Y += speed; + GetComponent().World.Rotation = MathHelper.ToRadians(90); + } + if (Transform.World.Y > nodeWorldPos.Y) + { + Transform.World.Y -= speed; + GetComponent().World.Rotation = MathHelper.ToRadians(270); + } + if (Transform.World == nodeWorldPos) + { + if (currentStep < numberOfSteps) + { + currentStep++; + //lastLastNode = lastNode; + //lastNode = nextNode; + nextNode = GetComponent().Next(); + } + else + { + + GetComponent().Stop(); + } + foreach (var entity in EntityManager.Entities) + { + if (entity is Soldier) + { + if (entity.GetComponent().Rectangle.Intersects(this.GetComponent().Rectangle)) + { + if (AttackedThisTurn == false) + { + if (Utility.AttackTest(this.GetComponent(), entity, Utility.CalculateHitChance(this.GetComponent(), this.Transform.World.Position, entity))) + { + AttackedThisTurn = true; + break; + } + } + } + } + } + } + } + + } + } + } } \ No newline at end of file diff --git a/DepthsBelow/DepthsBelow/TurnManager.cs b/DepthsBelow/DepthsBelow/TurnManager.cs index dcd4e2b..2f6b4fd 100755 --- a/DepthsBelow/DepthsBelow/TurnManager.cs +++ b/DepthsBelow/DepthsBelow/TurnManager.cs @@ -1,115 +1,122 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; - -namespace DepthsBelow -{ - /// - /// Keeps track of whose turn it is. - /// - public class TurnManager - { - /// - /// A player turn token. - /// - public class Token - { - /// - /// Unique identifying name of the token. - /// - public string Name { get; private set; } - private TurnManager turnManager; - - /// - /// Initializes a new instance of the class. - /// Preferably use instead. - /// - /// The turn manager the token belongs to. - /// Unique identifying name of the token. - public Token(TurnManager turnManager, string name) - { - this.turnManager = turnManager; - this.Name = name; - turnManager.AddToken(this); - } - } - - /// - /// Dictionary of turn tokens. - /// - public Dictionary Tokens; - private int currentTokenIndex; - - /// - /// The turn token belonging to a player. - /// - public Token CurrentTurn - { - get { return Tokens.ElementAt(currentTokenIndex).Value; } - } - - /// - /// Get the turn token by the specified name. - /// - /// The identifying name of the player. - /// Returns a player turn token. - public Token this[string name] - { - get { return this.Tokens[name]; } - } - - /// - /// Create a turn manager. - /// - public TurnManager() - { - Tokens = new Dictionary(); - } - - /// - /// Create a turn manager. - /// - /// Tokens of players. - public TurnManager(string[] tokenNames) - : this() - { - foreach (var tokenName in tokenNames) - CreateToken(tokenName); - } - - /// - /// Create a turn token. - /// - /// Name of the token. - /// Returns a player turn token. - public Token CreateToken(string name) - { - return Tokens.ContainsKey(name) ? Tokens[name] : new Token(this, name); - } - - /// - /// Add a turn token to - /// - /// - public void AddToken(Token token) - { - if (!Tokens.ContainsKey(token.Name)) - Tokens.Add(token.Name, token); - } - - /// - /// End the current turn, skipping to the next token in the dictionary. - /// - public void EndTurn() - { - var prevTurn = CurrentTurn; - - if (++currentTokenIndex > Tokens.Count - 1) - currentTokenIndex = 0; - - Debug.WriteLine(prevTurn.Name + " turn ended. Current turn: " + CurrentTurn.Name); - } - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; + +namespace DepthsBelow +{ + /// + /// Keeps track of whose turn it is. + /// + public class TurnManager + { + public static int currentTurn = 0; + + /// + /// A player turn token. + /// + public class Token + { + /// + /// Unique identifying name of the token. + /// + public string Name { get; private set; } + private TurnManager turnManager; + + /// + /// Initializes a new instance of the class. + /// Preferably use instead. + /// + /// The turn manager the token belongs to. + /// Unique identifying name of the token. + public Token(TurnManager turnManager, string name) + { + this.turnManager = turnManager; + this.Name = name; + turnManager.AddToken(this); + } + } + + /// + /// Dictionary of turn tokens. + /// + public Dictionary Tokens; + private int currentTokenIndex; + + /// + /// The turn token belonging to a player. + /// + public Token CurrentTurn + { + get { return Tokens.ElementAt(currentTokenIndex).Value; } + } + + /// + /// Get the turn token by the specified name. + /// + /// The identifying name of the player. + /// Returns a player turn token. + public Token this[string name] + { + get { return this.Tokens[name]; } + } + + /// + /// Create a turn manager. + /// + public TurnManager() + { + Tokens = new Dictionary(); + } + + /// + /// Create a turn manager. + /// + /// Tokens of players. + public TurnManager(string[] tokenNames) + : this() + { + foreach (var tokenName in tokenNames) + CreateToken(tokenName); + } + + /// + /// Create a turn token. + /// + /// Name of the token. + /// Returns a player turn token. + public Token CreateToken(string name) + { + return Tokens.ContainsKey(name) ? Tokens[name] : new Token(this, name); + } + + /// + /// Add a turn token to + /// + /// + public void AddToken(Token token) + { + if (!Tokens.ContainsKey(token.Name)) + Tokens.Add(token.Name, token); + } + + /// + /// End the current turn, skipping to the next token in the dictionary. + /// + public void EndTurn() + { + var prevTurn = CurrentTurn; + + if (++currentTokenIndex > Tokens.Count - 1) + currentTokenIndex = 0; + + Debug.WriteLine(prevTurn.Name + " turn ended. Current turn: " + CurrentTurn.Name); + if (CurrentTurn.Name == "Player") + { + currentTurn++; + Console.WriteLine("Turn: " + currentTurn); + } + } + } +} diff --git a/DepthsBelow/DepthsBelowContent/maps/prototyp.tmx b/DepthsBelow/DepthsBelowContent/maps/prototyp.tmx index 56828d1..f50ee00 100755 --- a/DepthsBelow/DepthsBelowContent/maps/prototyp.tmx +++ b/DepthsBelow/DepthsBelowContent/maps/prototyp.tmx @@ -29,7 +29,7 @@ - + @@ -59,6 +59,14 @@ + + + + + + + +