diff --git a/DepthsBelow/DepthsBelow/Component/Shooting.cs b/DepthsBelow/DepthsBelow/Component/Shooting.cs deleted file mode 100644 index 382d5ac..0000000 --- a/DepthsBelow/DepthsBelow/Component/Shooting.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace DepthsBelow.Component -{ - class Shooting : Component - { - protected int stepsTaken = 0; - protected int distanceToTarget = 0; - protected int panic = 0; - protected int soldierAim = 0; - protected int weaponAccuracy = 0; - protected int enemyDodge = 0; - - protected int penaltyRange = 5; - - public Shooting(Entity parent) : base (parent) - { - - } - - public bool targetInSight() - { - return false; - } - - public int CalculateChance() - { - int baseHitChance = soldierAim + weaponAccuracy; - int baseDodgeChance = panic + enemyDodge; - int basePenalty = ReturnPenalty(stepsTaken) + (int)(ReturnPenalty(distanceToTarget) / 2); - int chanceToHit = baseHitChance - baseDodgeChance - basePenalty; - return chanceToHit; - } - - public int ReturnPenalty(int distance) - { - int penalty = 0; - if (distance >= penaltyRange * 3) - { - penalty = 100; - } - else if (distance >= penaltyRange * 2) - { - distance -= penaltyRange * 2; - penalty = penaltyRange + penaltyRange * 3 + distance * 5; - } - else if (distance >= penaltyRange) - { - distance -= penaltyRange; - penalty = penaltyRange + distance * 3; - } - else - { - penalty = distance; - } - return penalty; - } - } -} diff --git a/DepthsBelow/DepthsBelow/Component/Stat.cs b/DepthsBelow/DepthsBelow/Component/Stat.cs new file mode 100644 index 0000000..4412f8a --- /dev/null +++ b/DepthsBelow/DepthsBelow/Component/Stat.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace DepthsBelow.Component +{ + public class Stat : Component + { + protected int hp = 0; + protected int defence = 0; + protected int stepsTaken = 0; + protected int distanceToTarget = 0; + protected int panic = 0; + protected int soldierAim = 100; + protected int weaponAccuracy = 0; + protected int weaponStrength = 0; + protected int ammo = 0; + protected int enemyDodge = 0; + + protected int penaltyRange = 5; + + public int GetAim + { + get { return soldierAim + weaponAccuracy; } + set { soldierAim = value; } + } + + public int GetDodge + { + get { return enemyDodge; } + set { enemyDodge = value; } + } + public int Life + { + get { return hp; } + set + { + hp = value; + if (hp <= 0) { + //If you kill me, I will become stronger than you can ever imagine. + Kill(); + } + } + } + public int Defence + { + get { return defence; } + set { defence = value; } + } + public int Strength + { + get { return weaponStrength; } + set { weaponStrength = value; } + } + + public void Kill() + { + hp = 0; + } + + public int Penalty(int distance) + { + return panic + GetPenalty(stepsTaken) + (int)(GetPenalty(distance) / 2); + } + + public Stat(Entity parent) : base (parent) + { + + } + + public bool targetInSight() + { + return false; + } + + public int GetPenalty(int distance) + { + int penalty = 0; + if (distance >= penaltyRange * 3) + { + penalty = 100; + } + else if (distance >= penaltyRange * 2) + { + distance -= penaltyRange * 2; + penalty = penaltyRange + penaltyRange * 3 + distance * 5; + } + else if (distance >= penaltyRange) + { + distance -= penaltyRange; + penalty = penaltyRange + distance * 3; + } + else + { + penalty = distance; + } + return penalty; + } + } +} diff --git a/DepthsBelow/DepthsBelow/Core.cs b/DepthsBelow/DepthsBelow/Core.cs index cbe8091..c4bffdd 100755 --- a/DepthsBelow/DepthsBelow/Core.cs +++ b/DepthsBelow/DepthsBelow/Core.cs @@ -1,213 +1,203 @@ -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; - SpriteBatch spriteBatch; - - public Lua Lua; - - public Camera Camera; - - public bool PlayerTurn = true; - public static MouseInput MouseInput; - public static KeyboardInput KeyboardInput; - public List Squad; - public List Swarm; - public List Volley; - public static Map Map; - - public SmallEnemy TestMonster; - - public Core() - { - GraphicsDeviceManager = new GraphicsDeviceManager(this); - Content.RootDirectory = "Content"; - - GraphicsDeviceManager.PreferredBackBufferWidth = 1280; - GraphicsDeviceManager.PreferredBackBufferHeight = 720; - GraphicsDeviceManager.IsFullScreen = false; - - //graphics.SynchronizeWithVerticalRetrace = false; - this.IsFixedTimeStep = false; - GraphicsDeviceManager.ApplyChanges(); - - this.IsMouseVisible = true; - - GameServices.AddService(GraphicsDevice); - GameServices.AddService(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() - { - // TODO: Add your initialization logic here - Camera = new Camera(this); - Squad = new List(); - Swarm = new List(); - Volley = new List(); - - TestMonster = new SmallEnemy(this, ref Swarm); - - // Run scripts after everything is initialized - Lua = new Lua(); - Lua.LoadScripts(); - - 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); - - Map = Content.Load("maps/Cave.Level1"); - // Load map objects - Map.ParseObjects(this); - - // TODO: use this.Content to load your game content here - Soldier.LoadContent(this); - SmallEnemy.LoadContent(this); - Shot.LoadContent(this); - - MouseInput = new MouseInput(this); - MouseInput.LoadContent(); - KeyboardInput = new KeyboardInput(this); - - TestMonster.X = 12; - TestMonster.Y = 4; - - //frame.Add(text); - } - - /// - /// 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); - - // Update soldiers in squad - foreach (var soldier in Squad) - soldier.Update(gameTime); - - foreach (var body in Swarm) - body.Update(gameTime); - - foreach (var bullet in Volley) - bullet.Update(gameTime); - - TestMonster.Update(gameTime); - GUIManager.Update(gameTime); - - base.Update(gameTime); - } - - public int FindDistance(Vector2 target, Vector2 start) - { - Vector2 combine = new Vector2(target.X - start.X, target.Y - start.Y); - - int result = 0; - int firstRestult = (int)Math.Sqrt((int)combine.X^2 + (int)combine.Y^2); - - result = (int)Vector2.Distance(target, start); - - return result; - } - - /// - /// This is called when the game should draw itself. - /// - /// Provides a snapshot of timing values. - protected override void Draw(GameTime gameTime) - { - GraphicsDevice.Clear(Color.Black); - - // Start drawing using the Camera transform - spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, - Camera.Transform); - - // Draw the level - Map.Draw(spriteBatch); - - // Draw units - foreach (var soldier in Squad) - { - var sr = soldier.GetComponent(); - if (sr != null) - sr.Draw(spriteBatch); - } - foreach (var body in Swarm) - { - var sr = body.GetComponent(); - if (sr != null) - sr.Draw(spriteBatch); - } - foreach (var bullet in Volley) - { - var sr = bullet.GetComponent(); - if (sr != null) - sr.Draw(spriteBatch); - } - - // Draw mouse input visuals - MouseInput.Draw(spriteBatch); - - TestMonster.GetComponent().Draw(spriteBatch); - - spriteBatch.End(); - - // Start drawing 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; + SpriteBatch spriteBatch; + + public Lua Lua; + + public Camera Camera; + + public bool PlayerTurn = true; + public static MouseInput MouseInput; + public static KeyboardInput KeyboardInput; + public List Squad; + public List Swarm; + public List Volley; + public static Map Map; + + public SmallEnemy TestMonster; + + public Core() + { + GraphicsDeviceManager = new GraphicsDeviceManager(this); + Content.RootDirectory = "Content"; + + GraphicsDeviceManager.PreferredBackBufferWidth = 1280; + GraphicsDeviceManager.PreferredBackBufferHeight = 720; + GraphicsDeviceManager.IsFullScreen = false; + + //graphics.SynchronizeWithVerticalRetrace = false; + this.IsFixedTimeStep = false; + GraphicsDeviceManager.ApplyChanges(); + + this.IsMouseVisible = true; + + GameServices.AddService(GraphicsDevice); + GameServices.AddService(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() + { + // TODO: Add your initialization logic here + Camera = new Camera(this); + Squad = new List(); + Swarm = new List(); + Volley = new List(); + + TestMonster = new SmallEnemy(this, ref Swarm); + + // Run scripts after everything is initialized + Lua = new Lua(); + Lua.LoadScripts(); + + 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); + + Map = Content.Load("maps/Cave.Level1"); + // Load map objects + Map.ParseObjects(this); + + // TODO: use this.Content to load your game content here + Soldier.LoadContent(this); + SmallEnemy.LoadContent(this); + Shot.LoadContent(this); + + MouseInput = new MouseInput(this); + MouseInput.LoadContent(); + KeyboardInput = new KeyboardInput(this); + + Swarm.Add(TestMonster); + + TestMonster.X = 12; + TestMonster.Y = 4; + + //frame.Add(text); + } + + /// + /// 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); + + // Update soldiers in squad + foreach (var soldier in Squad) + soldier.Update(gameTime); + + foreach (var body in Swarm) + body.Update(gameTime); + + foreach (var bullet in Volley) + bullet.Update(gameTime); + + TestMonster.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) + { + GraphicsDevice.Clear(Color.Black); + + // Start drawing using the Camera transform + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, + Camera.Transform); + + // Draw the level + Map.Draw(spriteBatch); + + // Draw units + foreach (var soldier in Squad) + { + var sr = soldier.GetComponent(); + if (sr != null) + sr.Draw(spriteBatch); + } + foreach (var body in Swarm) + { + var sr = body.GetComponent(); + if (sr != null) + sr.Draw(spriteBatch); + } + foreach (var bullet in Volley) + { + var sr = bullet.GetComponent(); + if (sr != null) + sr.Draw(spriteBatch); + } + + // Draw mouse input visuals + MouseInput.Draw(spriteBatch); + + TestMonster.GetComponent().Draw(spriteBatch); + + spriteBatch.End(); + + // Start drawing 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/DepthsBelow.csproj b/DepthsBelow/DepthsBelow/DepthsBelow.csproj index a11ea38..8a968e4 100644 --- a/DepthsBelow/DepthsBelow/DepthsBelow.csproj +++ b/DepthsBelow/DepthsBelow/DepthsBelow.csproj @@ -1,203 +1,204 @@ - - - - {94683C5B-052D-4143-96D8-35C67E831000} - {6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Debug - x86 - WinExe - Properties - DepthsBelow - DepthsBelow - v4.0 - Client - v4.0 - Windows - HiDef - faa0577e-a03e-43cf-89c7-0a03f4c22717 - Game - Game.ico - GameThumbnail.png - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 1 - 1.0.0.%2a - false - true - true - - - true - full - false - bin\x86\Debug - DEBUG;TRACE;WINDOWS - prompt - 4 - true - false - x86 - false - - - pdbonly - true - bin\x86\Release - TRACE;WINDOWS - prompt - 4 - true - false - x86 - true - - - ECE66DEF071576E8D2F7D57232C0569623E3E2DF - - - DepthsBelow_TemporaryKey.pfx - - - true - - - true - - - - ..\..\LuaInterface\LuaInterface.dll - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - False - - - - False - - - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {CD3F949D-54AA-4D38-99DB-92905A375D84} - AStar - - - DepthsBelowContent %28Content%29 - Content - {433A77A2-DE52-4875-A4EF-232CF59C2DD3} - - - - - False - Microsoft .NET Framework 4 Client Profile %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - False - Microsoft XNA Framework Redistributable 4.0 - true - - - - - - - - - + + + + {94683C5B-052D-4143-96D8-35C67E831000} + {6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Debug + x86 + WinExe + Properties + DepthsBelow + DepthsBelow + v4.0 + Client + v4.0 + Windows + HiDef + faa0577e-a03e-43cf-89c7-0a03f4c22717 + Game + Game.ico + GameThumbnail.png + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 1 + 1.0.0.%2a + false + true + true + + + true + full + false + bin\x86\Debug + DEBUG;TRACE;WINDOWS + prompt + 4 + true + false + x86 + false + + + pdbonly + true + bin\x86\Release + TRACE;WINDOWS + prompt + 4 + true + false + x86 + true + + + ECE66DEF071576E8D2F7D57232C0569623E3E2DF + + + DepthsBelow_TemporaryKey.pfx + + + true + + + true + + + + ..\..\LuaInterface\LuaInterface.dll + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + + False + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {CD3F949D-54AA-4D38-99DB-92905A375D84} + AStar + + + DepthsBelowContent %28Content%29 + Content + {433A77A2-DE52-4875-A4EF-232CF59C2DD3} + + + + + False + Microsoft .NET Framework 4 Client Profile %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 3.1 + true + + + False + Microsoft XNA Framework Redistributable 4.0 + true + + + + + + + + + + --> \ No newline at end of file diff --git a/DepthsBelow/DepthsBelow/Entity.cs b/DepthsBelow/DepthsBelow/Entity.cs index 838dc97..572d108 100644 --- a/DepthsBelow/DepthsBelow/Entity.cs +++ b/DepthsBelow/DepthsBelow/Entity.cs @@ -1,70 +1,73 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Microsoft.Xna.Framework; - -namespace DepthsBelow -{ - public class Entity - { - List Components; - public Component.Transform Transform; - public Component.PixelTransform pixelTransform; - public Component.GridTransform gridTransform; - public int X - { - get { return this.Transform.Grid.X; } - set - { - this.Transform.Grid.X = value; - } - } - public int Y - { - get { return this.Transform.Grid.Y; } - set - { - this.Transform.Grid.Y = value; - } - } - - protected Core core; - - public Entity(Core core) - { - this.core = core; - - Components = new List(); - Transform = new Component.Transform(this); - AddComponent(Transform); - pixelTransform = new Component.PixelTransform(this); - AddComponent(pixelTransform); - gridTransform = new Component.GridTransform(this); - AddComponent(gridTransform); - } - - public T GetComponent() where T : Component.Component - { - foreach (Component.Component c in Components) - { - if (c is T) - return (T)c; - } - - return null; - } - - public void AddComponent(Component.Component c) - { - Components.Add(c); - } - - public virtual void Update(GameTime gameTime) - { - // Update components - foreach (Component.Component c in Components) - c.Update(gameTime); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework; + +namespace DepthsBelow +{ + public class Entity + { + List Components; + public Component.Transform Transform; + public Component.PixelTransform pixelTransform; + public Component.GridTransform gridTransform; + public Component.Stat stat; + public int X + { + get { return this.Transform.Grid.X; } + set + { + this.Transform.Grid.X = value; + } + } + public int Y + { + get { return this.Transform.Grid.Y; } + set + { + this.Transform.Grid.Y = value; + } + } + + protected Core core; + + public Entity(Core core) + { + this.core = core; + + Components = new List(); + Transform = new Component.Transform(this); + AddComponent(Transform); + pixelTransform = new Component.PixelTransform(this); + AddComponent(pixelTransform); + gridTransform = new Component.GridTransform(this); + AddComponent(gridTransform); + stat = new Component.Stat(this); + AddComponent(stat); + } + + public T GetComponent() where T : Component.Component + { + foreach (Component.Component c in Components) + { + if (c is T) + return (T)c; + } + + return null; + } + + public void AddComponent(Component.Component c) + { + Components.Add(c); + } + + public virtual void Update(GameTime gameTime) + { + // Update components + foreach (Component.Component c in Components) + c.Update(gameTime); + } + } +} diff --git a/DepthsBelow/DepthsBelow/KeyboardInput.cs b/DepthsBelow/DepthsBelow/KeyboardInput.cs index c9dd67e..b0b2f59 100644 --- a/DepthsBelow/DepthsBelow/KeyboardInput.cs +++ b/DepthsBelow/DepthsBelow/KeyboardInput.cs @@ -15,7 +15,7 @@ namespace DepthsBelow Core core; bool Enter = false; bool turn; - int checkerSpeed = 1; + int checkerSpeed = 2; public KeyboardInput(Core core) { @@ -48,13 +48,14 @@ namespace DepthsBelow core.TestMonster.step = 0; core.PlayerTurn = false; Point target = Point.Zero; - int distance = 7000; + float distance = 7000; foreach (var unit in core.Squad) { Vector2 soldier = new Vector2(unit.Transform.Grid.X, unit.Transform.Grid.Y); Vector2 monster = new Vector2(core.TestMonster.Transform.Grid.X, core.TestMonster.Transform.Grid.Y); - int newDistance = core.FindDistance(soldier, monster); + float newDistance = Vector2.Distance(soldier, monster); + if (newDistance < distance) { target = unit.Transform.Grid; diff --git a/DepthsBelow/DepthsBelow/SmallEnemy.cs b/DepthsBelow/DepthsBelow/SmallEnemy.cs index b1b4aa2..c171653 100644 --- a/DepthsBelow/DepthsBelow/SmallEnemy.cs +++ b/DepthsBelow/DepthsBelow/SmallEnemy.cs @@ -1,142 +1,148 @@ -using System; -using System.Collections.Generic; -using DepthsBelow.Component; -using Microsoft.Xna.Framework; -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(Core core, ref List swarm) - : base(core) - { - if (Texture == null) - LoadContent(core); - - 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); - } - - public bool Selected - { - get { return _selected; } - set - { - _selected = value; - GetComponent().Color = (value) ? Color.Blue : this.Color; - } - } - - public static void LoadContent(Core core) - { - Texture = core.Content.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(); - - 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; - } - } - } - - foreach (var soldier in core.Squad) - { - var pathFinder = soldier.GetComponent(); - var position = nextNode.Position; - if (soldier.Transform.Grid == position) - { - soldierCollisions.Add(soldier.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; - if (Transform.World.X > nodeWorldPos.X) - Transform.World.X -= speed; - if (Transform.World.Y < nodeWorldPos.Y) - Transform.World.Y += speed; - if (Transform.World.Y > nodeWorldPos.Y) - Transform.World.Y -= speed; - - 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.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(Core core, ref List swarm) + : base(core) + { + if (Texture == null) + LoadContent(core); + + 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); + + stat.Life = 2; + stat.Defence = 0; + stat.Strength = 5; + stat.GetAim = 100; + stat.GetDodge = 10; + } + + public bool Selected + { + get { return _selected; } + set + { + _selected = value; + GetComponent().Color = (value) ? Color.Blue : this.Color; + } + } + + public static void LoadContent(Core core) + { + Texture = core.Content.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(); + + 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; + } + } + } + + foreach (var soldier in core.Squad) + { + var pathFinder = soldier.GetComponent(); + var position = nextNode.Position; + if (soldier.Transform.Grid == position) + { + soldierCollisions.Add(soldier.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; + if (Transform.World.X > nodeWorldPos.X) + Transform.World.X -= speed; + if (Transform.World.Y < nodeWorldPos.Y) + Transform.World.Y += speed; + if (Transform.World.Y > nodeWorldPos.Y) + Transform.World.Y -= speed; + + if (Transform.World == nodeWorldPos) + { + if (currentStep < numberOfSteps) + { + currentStep++; + //lastLastNode = lastNode; + //lastNode = nextNode; + nextNode = GetComponent().Next(); + } + else + { + GetComponent().Stop(); + } + } + } + + } + } + } } \ No newline at end of file diff --git a/DepthsBelow/DepthsBelow/Soldier.cs b/DepthsBelow/DepthsBelow/Soldier.cs index 074e002..6987727 100644 --- a/DepthsBelow/DepthsBelow/Soldier.cs +++ b/DepthsBelow/DepthsBelow/Soldier.cs @@ -61,6 +61,12 @@ namespace DepthsBelow var pfc = new PathFinder(this); AddComponent(pfc); + + stat.Life = 10; + stat.Defence = 10; + stat.Strength = 10; + stat.GetAim = 100; + stat.GetDodge = 20; } public bool Selected @@ -98,6 +104,13 @@ namespace DepthsBelow soldierCollisions.Add(soldier.Transform.Grid); } } + foreach (var enemy in core.Swarm) + { + if (!enemy.GetComponent().IsMoving) + { + soldierCollisions.Add(enemy.Transform.Grid); + } + } foreach (var soldier in Squad) { @@ -114,6 +127,18 @@ namespace DepthsBelow } } } + foreach (var enemy in core.Swarm) + { + var pathFinder = enemy.GetComponent(); + var position = nextNode.Position; + if (enemy.Transform.Grid == position) + { + soldierCollisions.Add(enemy.Transform.Grid); + GetComponent().RecreatePath(soldierCollisions); + nextNode = GetComponent().Next(); + break; + } + } if (nextNode != null) { diff --git a/DepthsBelow/DepthsBelow/Utility.cs b/DepthsBelow/DepthsBelow/Utility.cs new file mode 100644 index 0000000..aa6a870 --- /dev/null +++ b/DepthsBelow/DepthsBelow/Utility.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework; + +namespace DepthsBelow +{ + static class Utility + { + public static int CalculateHitChance(Entity attacker, Entity defender) + { + Component.Stat shooting = attacker.GetComponent(); + Component.Stat dodging = defender.GetComponent(); + if (shooting == null || dodging == null) + { + return 0; + } + int baseHitChance = shooting.GetAim; + int baseDodgeChance = dodging.GetDodge; + int basePenalty = shooting.Penalty((int)Vector2.Distance(attacker.GetComponent().World.Position, defender.GetComponent().World.Position) / Grid.TileSize); + int chanceToHit = baseHitChance - baseDodgeChance - basePenalty; + return chanceToHit; + } + public static bool HitTest(Entity attacker, Entity defender, int chanceToHit) + { + Component.Stat shooting = attacker.GetComponent(); + Component.Stat dodging = defender.GetComponent(); + Random rand = new Random(); + if (rand.Next(0, 100) < chanceToHit) + { + dodging.Life -= shooting.Strength - dodging.Defence / 2; + return true; + } + return false; + } + } +}