From 9a0ff658b4c206dfdf7996ce1a575977c3e3ff92 Mon Sep 17 00:00:00 2001 From: Niklas Ulf Anders Cullberg Date: Mon, 29 Oct 2012 00:51:14 +0100 Subject: [PATCH] The hell. Vi kan skjuta med S. --- DepthsBelow/DepthsBelow/Component/Stat.cs | 18 +- DepthsBelow/DepthsBelow/Core.cs | 500 +++++++++--------- DepthsBelow/DepthsBelow/KeyboardInput.cs | 10 +- DepthsBelow/DepthsBelow/MouseInput.cs | 2 +- DepthsBelow/DepthsBelow/Shot.cs | 21 +- DepthsBelow/DepthsBelow/SmallEnemy.cs | 314 +++++------ DepthsBelow/DepthsBelow/Soldier.cs | 2 +- DepthsBelow/DepthsBelow/Utility.cs | 10 +- .../DepthsBelowContent.contentproj | 7 + .../DepthsBelowContent/images/Shot3.bmp | Bin 0 -> 142 bytes 10 files changed, 464 insertions(+), 420 deletions(-) create mode 100644 DepthsBelow/DepthsBelowContent/images/Shot3.bmp diff --git a/DepthsBelow/DepthsBelow/Component/Stat.cs b/DepthsBelow/DepthsBelow/Component/Stat.cs index ee5e230..e4cfd17 100755 --- a/DepthsBelow/DepthsBelow/Component/Stat.cs +++ b/DepthsBelow/DepthsBelow/Component/Stat.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Microsoft.Xna.Framework; namespace DepthsBelow.Component { @@ -39,7 +40,15 @@ namespace DepthsBelow.Component protected int ammo = 0; protected int enemyDodge = 0; - protected int penaltyRange = 5; + protected int penaltyRange = 5; + + Vector2 rememberedPosition = Vector2.Zero; + + public Vector2 Remember + { + get { return rememberedPosition; } + set { rememberedPosition = value; } + } public int GetAim { @@ -83,7 +92,8 @@ namespace DepthsBelow.Component public void Kill() { - hp = 0; + hp = 0; + Parent.Remove(); //Console.WriteLine("Blargh! I am dead!"); } @@ -94,8 +104,8 @@ namespace DepthsBelow.Component public Stat(Entity parent) : base (parent) - { - + { + rememberedPosition = Vector2.Zero; } public bool targetInSight() diff --git a/DepthsBelow/DepthsBelow/Core.cs b/DepthsBelow/DepthsBelow/Core.cs index 237359a..6a0420e 100755 --- a/DepthsBelow/DepthsBelow/Core.cs +++ b/DepthsBelow/DepthsBelow/Core.cs @@ -1,250 +1,250 @@ -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 EntityManager EntityManager; - 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(); - - EntityManager = new EntityManager(); - 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/Aztek.Test"); - //Map = Content.Load("maps/Cave.Level1"); - // Load map objects - Map.ParseObjects(this); - GroupManager = new DynamicGroupManager(Squad.Cast().ToList(), (float)Grid.TileSize * 1.5f); - 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"; - 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(EntityManager, 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 EntityManager EntityManager; + 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(); + + EntityManager = new EntityManager(); + 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/Aztek.Test"); + //Map = Content.Load("maps/Cave.Level1"); + // Load map objects + Map.ParseObjects(this); + GroupManager = new DynamicGroupManager(Squad.Cast().ToList(), (float)Grid.TileSize * 1.5f); + 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"; + 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(EntityManager, 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/KeyboardInput.cs b/DepthsBelow/DepthsBelow/KeyboardInput.cs index 401c2d7..8336949 100755 --- a/DepthsBelow/DepthsBelow/KeyboardInput.cs +++ b/DepthsBelow/DepthsBelow/KeyboardInput.cs @@ -211,7 +211,7 @@ namespace DepthsBelow { if (soldier.Selected == true && soldier.Fired == false) { - core.Volley.Add(new Shot(core.EntityManager, soldier.GetComponent())); + core.Volley.Add(new Shot(core.EntityManager, soldier.GetComponent(), "Bullet")); soldier.Fired = true; foreach (var shot in core.Volley) { @@ -225,10 +225,12 @@ namespace DepthsBelow } if (shot.direction == Vector2.Zero) { - double directionX = Math.Cos(soldier.GetComponent().World.Rotation); - double directionY = Math.Sin(soldier.GetComponent().World.Rotation); + double directionX = Math.Cos(soldier.Transform.World.Rotation); + double directionY = Math.Sin(soldier.Transform.World.Rotation); shot.direction = new Vector2((float)directionX, (float)directionY); shot.Transform.World.Rotation = soldier.Transform.World.Rotation; + Vector2 yo = soldier.Transform.World.Position; + shot.Stat.Remember = yo; } } } @@ -268,7 +270,7 @@ namespace DepthsBelow current = 0; if (soldier.Selected == true && soldier.Fired == false && hit == true) { - core.Volley.Add(new Shot(core.EntityManager, soldier.GetComponent())); + core.Volley.Add(new Shot(core.EntityManager, soldier.GetComponent(), "Bullet")); soldier.Fired = true; foreach (var shot in core.Volley) { diff --git a/DepthsBelow/DepthsBelow/MouseInput.cs b/DepthsBelow/DepthsBelow/MouseInput.cs index 8b86d43..9de74db 100755 --- a/DepthsBelow/DepthsBelow/MouseInput.cs +++ b/DepthsBelow/DepthsBelow/MouseInput.cs @@ -236,7 +236,7 @@ namespace DepthsBelow { if (gridRectangle.Intersects(enemy.GetComponent().Rectangle)) { - Console.WriteLine(Utility.CalculateHitChance(unit, enemy)); + Console.WriteLine(Utility.CalculateHitChance(unit.GetComponent(), unit.GetComponent().World.Position, enemy)); } } } diff --git a/DepthsBelow/DepthsBelow/Shot.cs b/DepthsBelow/DepthsBelow/Shot.cs index 743c736..ec7fe35 100755 --- a/DepthsBelow/DepthsBelow/Shot.cs +++ b/DepthsBelow/DepthsBelow/Shot.cs @@ -13,6 +13,7 @@ namespace DepthsBelow public static Texture2D Texture; public Color Color; public static Point Origin; + string type = ""; Stat soldierStat; @@ -37,7 +38,7 @@ namespace DepthsBelow public Vector2 direction = Vector2.Zero; - public Shot(EntityManager entityManager, Stat _soldierStat) + public Shot(EntityManager entityManager, Stat _soldierStat, string _type) : base(entityManager) { if (Texture == null) @@ -46,6 +47,7 @@ namespace DepthsBelow Transform.World.Origin = new Vector2(16, 16); Stat = _soldierStat; + type = _type; this.Color = Color.White; var rc = new SpriteRenderer(this) { Texture = Texture, Color = Color.White }; @@ -55,9 +57,16 @@ namespace DepthsBelow AddComponent(cc); } - public static void LoadContent() + public void LoadContent() { - Texture = GameServices.GetService().Load("images/Shot"); + if (type == "Rocket") + { + Texture = GameServices.GetService().Load("images/Shot"); + } + else + { + Texture = GameServices.GetService().Load("images/Shot3"); + } } public override void Update(GameTime gameTime) { @@ -76,7 +85,11 @@ namespace DepthsBelow { if (this.GetComponent().Rectangle.Intersects(entity.GetComponent().Rectangle)) { - + if (Utility.HitTest(Stat, entity, Utility.CalculateHitChance(Stat, this.Stat.Remember, entity))) + { + this.Remove(); + return; + } } } } diff --git a/DepthsBelow/DepthsBelow/SmallEnemy.cs b/DepthsBelow/DepthsBelow/SmallEnemy.cs index 4241c3e..ce8badc 100755 --- a/DepthsBelow/DepthsBelow/SmallEnemy.cs +++ b/DepthsBelow/DepthsBelow/SmallEnemy.cs @@ -1,152 +1,164 @@ -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 int step - { - get { return currentStep; } - set - { - currentStep = value; - } - } - - public SmallEnemy(EntityManager entityManager, ref List swarm) - : base(entityManager) - { - 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); - AddComponent(cc); - - var pfc = new PathFinder(this); - AddComponent(pfc); - - var stat = new Component.Stat(this) - { - Life = 2, - Defence = 0, - Strength = 5000, - GetAim = 100, - GetDodge = 50 - }; - AddComponent(stat); - } - - 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 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(); - } - } - } - - } - } - } +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 int step + { + get { return currentStep; } + set + { + currentStep = value; + } + } + + public SmallEnemy(EntityManager entityManager, ref List swarm) + : base(entityManager) + { + 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); + AddComponent(cc); + + var pfc = new PathFinder(this); + AddComponent(pfc); + + var stat = new Component.Stat(this) + { + Life = 2, + Defence = 2, + Strength = 5000, + GetAim = 100, + GetDodge = 50 + }; + AddComponent(stat); + } + + 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 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 + { + foreach (var entity in entityManager.Entities) { + if (entity is Soldier) + { + if (entity.GetComponent().Rectangle.Intersects(this.GetComponent().Rectangle)) + { + if (Utility.HitTest(this.GetComponent(), entity, Utility.CalculateHitChance(this.GetComponent(), this.Transform.World.Position, entity))) + { + return; + } + } + } + } + GetComponent().Stop(); + } + } + } + + } + } + } } \ No newline at end of file diff --git a/DepthsBelow/DepthsBelow/Soldier.cs b/DepthsBelow/DepthsBelow/Soldier.cs index a25230a..99a1289 100755 --- a/DepthsBelow/DepthsBelow/Soldier.cs +++ b/DepthsBelow/DepthsBelow/Soldier.cs @@ -77,7 +77,7 @@ namespace DepthsBelow MaxPanic = 100, //Life = 10, Defence = 10, - Strength = 10, + Strength = 50, GetAim = 40, GetDodge = 20 }; diff --git a/DepthsBelow/DepthsBelow/Utility.cs b/DepthsBelow/DepthsBelow/Utility.cs index 0aaf88d..9529daa 100755 --- a/DepthsBelow/DepthsBelow/Utility.cs +++ b/DepthsBelow/DepthsBelow/Utility.cs @@ -19,9 +19,9 @@ namespace DepthsBelow /// The attacking unit. /// The recieving unit. /// Returns a hit chance percentage. - public static int CalculateHitChance(Entity attacker, Entity defender) + public static int CalculateHitChance(Stat attacker, Vector2 attackerPosition, Entity defender) { - Stat shooting = attacker.GetComponent(); + Stat shooting = attacker; Stat dodging = defender.GetComponent(); if (shooting == null || dodging == null) { @@ -29,16 +29,16 @@ namespace DepthsBelow } int baseHitChance = shooting.GetAim; int baseDodgeChance = dodging.GetDodge; - int distance = (int)Vector2.Distance(attacker.GetComponent().World.Position, defender.GetComponent().World.Position); + int distance = (int)Vector2.Distance(attackerPosition, defender.Transform.World.Position); int basePenalty = shooting.Penalty(distance / (Grid.TileSize)); Console.WriteLine("Penalty = " + basePenalty); int chanceToHit = baseHitChance - baseDodgeChance - basePenalty; //Console.WriteLine(chanceToHit); return chanceToHit; } - public static bool HitTest(Entity attacker, Entity defender, int chanceToHit) + public static bool HitTest(Stat attacker, Entity defender, int chanceToHit) { - Component.Stat shooting = attacker.GetComponent(); + Component.Stat shooting = attacker; Component.Stat dodging = defender.GetComponent(); Random rand = new Random(); if (rand.Next(0, 100) < chanceToHit) diff --git a/DepthsBelow/DepthsBelowContent/DepthsBelowContent.contentproj b/DepthsBelow/DepthsBelowContent/DepthsBelowContent.contentproj index 90a9c05..a7facc7 100755 --- a/DepthsBelow/DepthsBelowContent/DepthsBelowContent.contentproj +++ b/DepthsBelow/DepthsBelowContent/DepthsBelowContent.contentproj @@ -231,6 +231,13 @@ TextureProcessor + + + Shot3 + TextureImporter + TextureProcessor + +