diff --git a/DepthsBelow/DepthsBelow/Interface.cs b/DepthsBelow/DepthsBelow/Interface.cs index c92bf07..3727e9a 100755 --- a/DepthsBelow/DepthsBelow/Interface.cs +++ b/DepthsBelow/DepthsBelow/Interface.cs @@ -1,510 +1,574 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DepthsBelow.GUI; -using Microsoft.Xna.Framework; -using System.Diagnostics; -using Microsoft.Xna.Framework.Graphics; -using Microsoft.Xna.Framework.Input; -using Microsoft.Xna.Framework.Content; - -namespace DepthsBelow -{ - public class Interface - { - Core core; - - /// - /// The master frame covering the whole game screen. Parent of all frames. - /// This frame handles all mouse interaction with the game world - /// - public Frame UIParent; - - public List PanicFrames = new List(); - public List UnitFrames = new List(); - public Dictionary SoldierToFrame = new Dictionary(); - - Random random = new Random(); - - private bool checkingDirection; - private Vector2 directionStart; - - public Interface(Core core) - { - this.core = core; - - UIParent = new Frame(); - UIParent.Width = GameServices.GetService().Viewport.Width; - UIParent.Height = GameServices.GetService().Viewport.Height; - - // Selection rectangle - var selectionFrame = new Frame(UIParent); - selectionFrame.Texture = Utility.GetSolidTexture(); - selectionFrame.Color = Color.Red * 0.5f; - selectionFrame.Visible = false; - UIParent["selectionFrame"] = selectionFrame; - - // OnClick - UIParent.OnClick += delegate(Frame frame, GUIManager.MouseEventArgs args) - { - KeyboardState ks = Keyboard.GetState(); - MouseState ms = args.MouseState; - - var mousePos = new Point(ms.X, ms.Y); - var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1); - var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y)); - var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1); - - if (args.LeftButton == ButtonState.Pressed) - { - Debug.WriteLine("Left button pressed on UIParent"); - // Deselect all units - /*if (!ks.IsKeyDown(Keys.LeftControl)) - { - foreach (var unit in core.Squad) - unit.Selected = false; - - foreach (var unitFrame in UnitFrames) - unitFrame.Color = Color.Black; - } - - // Select all units in the rectangle - foreach (var soldier in core.Squad) - { - if (mouseWorldRectangle.Intersects(soldier.GetComponent().Rectangle)) - { - soldier.Selected = true; - - foreach (var unitFrame in UnitFrames) - { - if (unitFrame["soldier"] == soldier) - unitFrame.Color = Color.Blue; - } - } - }*/ - } - - - - // Hide the selection rectangle - //selectionRectangle = Rectangle.Empty; - }; - - // OnPress - UIParent.OnPress += delegate(Frame frame, GUIManager.MouseEventArgs args) - { - //KeyboardState ks = Keyboard.GetState(); - MouseState ms = args.MouseState; - var mousePos = new Point(ms.X, ms.Y); - var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1); - var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y)); - var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1); - - // Show the selection frame - if (args.LeftButton == ButtonState.Pressed) - { - var selectFrame = (GUI.Frame)frame["selectionFrame"]; - if (!selectFrame.Visible) - { - selectFrame.X = mousePos.X; - selectFrame.Y = mousePos.Y; - selectFrame.Visible = true; - } - } - - if (args.RightButton == ButtonState.Pressed) - { - // Unit rotation - foreach (var unit in core.Squad) - { - if (unit.Selected && mouseWorldRectangle.Intersects(unit.GetComponent().Rectangle)) - { - checkingDirection = true; - directionStart = unit.Transform.World + unit.Transform.World.Origin; - } - } - } - }; - - // OnRelease - UIParent.OnRelease += delegate(Frame frame, GUIManager.MouseEventArgs args) - { - KeyboardState ks = Keyboard.GetState(); - MouseState ms = args.MouseState; - var mousePos = new Point(ms.X, ms.Y); - var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1); - var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y)); - var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1); - - if (args.LeftButton == ButtonState.Pressed) - { - // Deselect all units - if (!ks.IsKeyDown(Keys.LeftControl)) - { - foreach (var unit in core.Squad) - unit.Selected = false; - - foreach (var unitFrame in UnitFrames) - unitFrame.Color = Color.Black; - } - - // Select all soldier units inside the selection rectangle - var selectFrame = (GUI.Frame)frame["selectionFrame"]; - if (selectFrame.Visible) - { - Console.WriteLine("Before: " + selectFrame.AbsoluteRectangle.X + ", " + selectFrame.AbsoluteRectangle.Y + ", " + selectFrame.AbsoluteRectangle.Width + ", " + selectFrame.AbsoluteRectangle.Height); - - var intersectionRectangle = core.Camera.ScreenToWorld(selectFrame.AbsoluteRectangle); - - Console.WriteLine("After: " + intersectionRectangle.X + ", " + intersectionRectangle.Y + ", " + intersectionRectangle.Width + ", " + intersectionRectangle.Height); - - - // Select all units in the rectangle - foreach (var soldier in core.Squad) - { - if (intersectionRectangle.Intersects(soldier.GetComponent().Rectangle)) - { - soldier.Selected = true; - foreach (var unitFrame in UnitFrames) - { - if (unitFrame["soldier"] == soldier) - unitFrame.Color = Color.Blue; - } - } - } - - selectFrame.Visible = false; - } - } - - // Send orders with right click - if (args.RightButton == ButtonState.Pressed) - { - if (checkingDirection) - { - checkingDirection = false; - } - else - { - Debug.WriteLine("Right button pressed on UIParent"); - foreach (var unit in core.Squad) - if (unit.Selected) - unit.GetComponent().Goal = Grid.WorldToGrid(mouseWorldPos); - } - } - }; - - var button = new GUI.Button(UIParent); - button.SetTexture("images/Enter"); - button.X = 200; - button.Y = 100; - button.Width = 55; - button.Height = 40; - - // Test GUI frames - /*var frame = new GUI.Frame() - { - Y = 100 - }; - - var button = new GUI.Button(frame) - { - Width = 48, - Height = 23, - Texture = core.Content.Load("images/Enter"), - OnClick = delegate(Point clickPos) - { - Debug.WriteLine("That ugly button was clicked at (" + clickPos.X + "," + clickPos.Y + ")"); - } - }; - - var text = new GUI.Text(frame); - text.SetFont("Arial"); - text.Value = "Hello world!";*/ - - // Create some unit frames - /*var panicFrame = CreatePanicFrame(); - var unit1 = CreateUnitFrame("Flight captain Rainbow"); - unit1.X = panicFrame.X; - unit1.Y = panicFrame.Y + panicFrame.Height; - unit1.OnClick += delegate(Frame frame, Frame.MouseEventArgs args) - { - frame.Color = Color.Red; - }; - var unit2 = CreateUnitFrame("Mr. Sparkle"); - unit2.X = unit1.X; - unit2.Y = unit1.Y + unit1.Height; - unit2.OnClick += delegate(Frame frame, Frame.MouseEventArgs args) - { - frame.Color = Color.Red; - };*/ - - /*var frame1 = new GUI.Frame(); - frame1.Layer = 0; - frame1.SetTexture("images/Enter"); - frame1.Color = Color.Red; - frame1.Width = 100; - frame1.Height = 100; - frame1.OnClick += delegate(Frame frame, Frame.MouseEventArgs args) - { - if (frame.Color == Color.Red) - frame.Color = Color.Green; - else - frame.Color = Color.Red; - }; - var frame1_child = new GUI.Frame(frame1); - frame1_child.SetTexture("images/Enter"); - frame1_child.Color = Color.Purple; - frame1_child.Width = 60; - frame1_child.Height = 60; - frame1_child.X = 20; - frame1_child.Y = 20; - - var frame2 = new GUI.Frame(); - frame2.Layer = 0; - frame2.SetTexture("images/Enter"); - frame2.Color = Color.Blue; - frame2.Width = 100; - frame2.Height = 100; - frame2.X = 50; - frame2.Y = 50; - frame2.OnClick += delegate(Frame frame, Frame.MouseEventArgs args) - { - if (frame.Color == Color.Blue) - frame.Color = Color.Yellow; - else - frame.Color = Color.Blue; - };*/ - } - - private GUI.Frame CreatePanicFrame() - { - var frame = new GUI.Frame(UIParent); - frame.SetTexture("images/GUI/unit_background"); - frame.Color = Color.Black; - frame.Width = 164; - frame.Height = 19; - - frame.OnClick += delegate(Frame frame1, GUIManager.MouseEventArgs args) - { - DynamicGroupManager.Group group = (DynamicGroupManager.Group)frame1["group"]; - if (group != null) - group.Panic += 5; - }; - - var panicBarBg = new GUI.Frame(frame); - panicBarBg.SetTexture("images/GUI/health_background"); - panicBarBg.Width = 136; - panicBarBg.Height = 13; - panicBarBg.X = 3; - panicBarBg.Y = 3; - frame["panicBarBg"] = panicBarBg; - - var panicBar = new GUI.Frame(panicBarBg); - panicBar.SetTexture("images/GUI/bar_solid"); - panicBar.Color = new Color(87, 55, 253); - panicBar.Width = (int)(panicBarBg.Width * 0.5); - panicBar.Height = 11; - panicBar.X = 1; - panicBar.Y = 1; - frame["panicBar"] = panicBar; - - var text = new GUI.Text(frame); - text.SetFont("fonts/UnitName"); - text.Value = "0%"; - text.X = 4; - text.Y = 1; - frame["text"] = text; - - return frame; - } - - private GUI.Frame CreateUnitFrame(Soldier soldier) - { - var frame = new GUI.Frame(UIParent); - frame.SetTexture("images/GUI/unit_background"); - frame.Color = Color.Black; - frame.Width = 164; - frame.Height = 35; - - var nameText = new GUI.Text(frame); - nameText.SetFont("fonts/UnitName"); - nameText.Value = soldier.Name + " "/* + soldier.GetHashCode()*/; - nameText.X = 4; - nameText.Y = 1; - frame["nameText"] = nameText; - - var healthBarBg = new GUI.Frame(frame); - healthBarBg.SetTexture("images/GUI/health_background"); - healthBarBg.Width = 136; - healthBarBg.Height = 13; - healthBarBg.X = 3; - healthBarBg.Y = 19; - frame["healthBarBg"] = healthBarBg; - - var healthBar = new GUI.Frame(healthBarBg); - healthBar.SetTexture("images/GUI/bar_solid"); - healthBar.Color = Color.Red; - healthBar.Width = (int)((healthBarBg.Width - 2) * (soldier.GetComponent().HP / soldier.GetComponent().MaxHP)); - healthBar.Height = 11; - healthBar.X = 1; - healthBar.Y = 1; - frame["healthBar"] = healthBar; - - return frame; - } - - public void CreateUnitFrames(List squad) - { - // TODO: ForEach squad in Squads... - /*GUI.Frame lastFrame = null; - foreach (Soldier soldier in squad) - { - // TODO: Remove this test ;) - soldier.GetComponent().HP = random.Next(0, (int) soldier.GetComponent().MaxHP - 1); - - var uFrame = CreateUnitFrame(soldier); - uFrame["soldier"] = soldier; - soldier["unitFrame"] = uFrame; - if (lastFrame != null) - { - uFrame.X = lastFrame.X; - uFrame.Y = lastFrame.Y + lastFrame.Height; - } - uFrame.OnClick += delegate(Frame f, GUIManager.MouseEventArgs e) - { - var s = (Soldier) f["soldier"]; - KeyboardState ks = Keyboard.GetState(); - - if (!ks.IsKeyDown(Keys.LeftControl)) - { - // Deselect all units - foreach (var unitFrame in UnitFrames) - { - ((Soldier) unitFrame["soldier"]).Selected = false; - unitFrame.Color = Color.Black; - } - } - - if (!s.Selected) - { - s.Selected = true; - uFrame.Color = Color.Blue; - } - }; - UnitFrames.Add(uFrame); - lastFrame = uFrame; - }*/ - - foreach (var soldier in squad) - { - PanicFrames.Add(CreatePanicFrame()); - - // TODO: Remove this test ;) - soldier.GetComponent().HP = random.Next(0, (int)soldier.GetComponent().MaxHP - 1); - - var uFrame = CreateUnitFrame(soldier); - uFrame["soldier"] = soldier; - soldier["unitFrame"] = uFrame; - uFrame.OnClick += delegate(Frame f, GUIManager.MouseEventArgs e) - { - var s = (Soldier)f["soldier"]; - KeyboardState ks = Keyboard.GetState(); - - if (!ks.IsKeyDown(Keys.LeftControl)) - { - // Deselect all units - foreach (var unitFrame in UnitFrames) - { - ((Soldier)unitFrame["soldier"]).Selected = false; - unitFrame.Color = Color.Black; - } - } - - if (!s.Selected) - { - s.Selected = true; - uFrame.Color = Color.Blue; - } - }; - UnitFrames.Add(uFrame); - } - } - - public void UpdateUnitFrames() - { - core.GroupManager.UpdateGroups(); - var groups = core.GroupManager.Groups; - - foreach (var panicFrame in PanicFrames) - panicFrame.Visible = false; - - GUI.Frame lastFrame = null; - for (int index = 0; index < groups.Count; index++) - { - var group = groups[index]; - - var pFrame = PanicFrames[index]; - pFrame["group"] = group; - var pFrameBarBg = (GUI.Frame)pFrame["panicBarBg"]; - var pFrameBar = (GUI.Frame)pFrame["panicBar"]; - var pFrameText = (GUI.Text)pFrame["text"]; - pFrameBar.Width = (int)(pFrameBarBg.Width * (group.Panic / group.MaxPanic)); - pFrameText.Value = group.Panic.ToString() + " (" + (group.Panic / group.MaxPanic * 100f).ToString() + "%)"; - - pFrame.Visible = true; - if (lastFrame != null) - { - pFrame.X = lastFrame.X; - pFrame.Y = lastFrame.Y + lastFrame.Height + 15; - } - lastFrame = pFrame; - - foreach (Soldier soldier in @group.Entities) - { - var frame = (GUI.Frame) soldier["unitFrame"]; - frame.X = lastFrame.X; - frame.Y = lastFrame.Y + lastFrame.Height; - lastFrame = frame; - } - } - } - - public void Update(GameTime gameTime) - { - MouseState ms = Mouse.GetState(); - var mousePos = new Point(ms.X, ms.Y); - var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1); - var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y)); - var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1); - - // Update the selection rectangle - var selectionFrame = (GUI.Frame)UIParent["selectionFrame"]; - if (selectionFrame.Visible) - { - selectionFrame.Width = (int)mousePos.X - selectionFrame.X; - selectionFrame.Height = (int)mousePos.Y - selectionFrame.Y; - } - - // Update rotations - if (checkingDirection) - { - foreach (var unit in core.Squad) - if (unit.Selected) - { - float directionX = mouseWorldPos.X - unit.Transform.World.X; - float directionY = mouseWorldPos.Y - unit.Transform.World.Y; - //var mouseDirection = mouseWorldPos; - //mouseDirection.Normalize(); - unit.GetComponent().World.Rotation = - (float) - Math.Atan2(mouseWorldPos.Y - unit.Transform.World.Y - unit.Transform.World.Origin.Y, - mouseWorldPos.X - unit.Transform.World.X - unit.Transform.World.Origin.X); - } - } - - UpdateUnitFrames(); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DepthsBelow.GUI; +using Microsoft.Xna.Framework; +using System.Diagnostics; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using Microsoft.Xna.Framework.Content; + +namespace DepthsBelow +{ + public class Interface + { + Core core; + + /// + /// The master frame covering the whole game screen. Parent of all frames. + /// This frame handles all mouse interaction with the game world + /// + public Frame UIParent; + + public List PanicFrames = new List(); + public List UnitFrames = new List(); + public Dictionary SoldierToFrame = new Dictionary(); + + Random random = new Random(); + + private bool checkingDirection; + private Vector2 directionStart; + + public Interface(Core core) + { + this.core = core; + + UIParent = new Frame(); + UIParent.Width = GameServices.GetService().Viewport.Width; + UIParent.Height = GameServices.GetService().Viewport.Height; + + // Selection rectangle + var selectionFrame = new Frame(UIParent); + selectionFrame.Texture = Utility.GetSolidTexture(); + selectionFrame.Color = Color.Red * 0.5f; + selectionFrame.Visible = false; + UIParent["selectionFrame"] = selectionFrame; + + // OnClick + UIParent.OnClick += delegate(Frame frame, GUIManager.MouseEventArgs args) + { + KeyboardState ks = Keyboard.GetState(); + MouseState ms = args.MouseState; + + var mousePos = new Point(ms.X, ms.Y); + var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1); + var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y)); + var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1); + + if (args.LeftButton == ButtonState.Pressed) + { + Debug.WriteLine("Left button pressed on UIParent"); + // Deselect all units + /*if (!ks.IsKeyDown(Keys.LeftControl)) + { + foreach (var unit in core.Squad) + unit.Selected = false; + + foreach (var unitFrame in UnitFrames) + unitFrame.Color = Color.Black; + } + + // Select all units in the rectangle + foreach (var soldier in core.Squad) + { + if (mouseWorldRectangle.Intersects(soldier.GetComponent().Rectangle)) + { + soldier.Selected = true; + + foreach (var unitFrame in UnitFrames) + { + if (unitFrame["soldier"] == soldier) + unitFrame.Color = Color.Blue; + } + } + }*/ + } + + + + // Hide the selection rectangle + //selectionRectangle = Rectangle.Empty; + }; + + // OnPress + UIParent.OnPress += delegate(Frame frame, GUIManager.MouseEventArgs args) + { + //KeyboardState ks = Keyboard.GetState(); + MouseState ms = args.MouseState; + var mousePos = new Point(ms.X, ms.Y); + var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1); + var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y)); + var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1); + + // Show the selection frame + if (args.LeftButton == ButtonState.Pressed) + { + var selectFrame = (GUI.Frame)frame["selectionFrame"]; + if (!selectFrame.Visible) + { + selectFrame.X = mousePos.X; + selectFrame.Y = mousePos.Y; + selectFrame.Visible = true; + } + } + + if (args.RightButton == ButtonState.Pressed) + { + // Unit rotation + foreach (var unit in core.Squad) + { + if (unit.Selected && mouseWorldRectangle.Intersects(unit.GetComponent().Rectangle)) + { + checkingDirection = true; + directionStart = unit.Transform.World + unit.Transform.World.Origin; + } + } + } + }; + + // OnRelease + UIParent.OnRelease += delegate(Frame frame, GUIManager.MouseEventArgs args) + { + KeyboardState ks = Keyboard.GetState(); + MouseState ms = args.MouseState; + var mousePos = new Point(ms.X, ms.Y); + + var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1); + var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y)); + var mouseGridPos= Grid.WorldToGrid(mouseWorldPos); + var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1); + + if (args.LeftButton == ButtonState.Pressed) + { + // Deselect all units + if (!ks.IsKeyDown(Keys.LeftControl)) + { + foreach (var unit in core.Squad) + unit.Selected = false; + + foreach (var unitFrame in UnitFrames) + unitFrame.Color = Color.Black; + } + + // Select all soldier units inside the selection rectangle + var selectFrame = (GUI.Frame)frame["selectionFrame"]; + if (selectFrame.Visible) + { + Console.WriteLine("Before: " + selectFrame.AbsoluteRectangle.X + ", " + selectFrame.AbsoluteRectangle.Y + ", " + selectFrame.AbsoluteRectangle.Width + ", " + selectFrame.AbsoluteRectangle.Height); + + var intersectionRectangle = core.Camera.ScreenToWorld(selectFrame.AbsoluteRectangle); + + Console.WriteLine("After: " + intersectionRectangle.X + ", " + intersectionRectangle.Y + ", " + intersectionRectangle.Width + ", " + intersectionRectangle.Height); + + + // Select all units in the rectangle + foreach (var soldier in core.Squad) + { + if (intersectionRectangle.Intersects(soldier.GetComponent().Rectangle)) + { + soldier.Selected = true; + foreach (var unitFrame in UnitFrames) + { + if (unitFrame["soldier"] == soldier) + unitFrame.Color = Color.Blue; + } + } + } + + selectFrame.Visible = false; + } + } + + // Send orders with right click + if (args.RightButton == ButtonState.Pressed) + { + if (checkingDirection) + { + checkingDirection = false; + } + else + { + Debug.WriteLine("Right button pressed on UIParent"); + Point mainpath = Point.Zero; + Stack soldierStack = new Stack(); + //core.Squad.Where(a=>a.Selected).ToList().ForEach(a => soldierStack.Push(a)); + foreach (var soldier in core.Squad) + { + if (soldier.Selected) + { + soldierStack.Push(soldier); + } + } + + byte[,] collisionMap = Core.Map.GetCollisionMap(); + int X=5; + int Y=5; + int x,y,dx,dy; + x = y = dx =0; + dy = -1; + int t = (int)MathHelper.Max(X,Y); + int maxI = t*t; + for(int i =0; i < maxI; i++){ + if ((-X/2 < x&&x <= X/2) && (-Y/2 < y&&y <= Y/2)) + { + Point point = new Point(x + mouseGridPos.X, y + mouseGridPos.Y); + if (collisionMap[point.X,point.Y]==1) + { + if (soldierStack.Count==0) + { + break; + } + var soldier = soldierStack.Pop(); + + if (soldier==null) + { + break; + } + else + { + soldier.GetComponent().Goal = point; + Console.WriteLine(x + " " + y); + Console.WriteLine(soldier.GetComponent().Goal.X + " " + soldier.GetComponent().Goal.Y); + } + } + + + } + if( (x == y) || ((x < 0) && (x == -y)) || ((x > 0) && (x == 1-y))){ + t = dx; + dx = -dy; + dy = t; + } + x += dx; + y += dy; + } + //foreach (var unit in core.Squad) + //{ + // if (unit.Selected) + // { + // if (mainpath==Point.Zero) + // { + // mainpath = unit.Position; + // } + // Vector2 fromMain = new Vector2((mainpath.X - unit.Position.X) * 30,(mainpath.Y-unit.Position.Y) * 30); + // unit.GetComponent().Goal = Grid.WorldToGrid(mouseWorldPos - fromMain); + // } + //} + } + } + }; + + var button = new GUI.Button(UIParent); + button.SetTexture("images/Enter"); + button.X = 200; + button.Y = 100; + button.Width = 55; + button.Height = 40; + + // Test GUI frames + /*var frame = new GUI.Frame() + { + Y = 100 + }; + + var button = new GUI.Button(frame) + { + Width = 48, + Height = 23, + Texture = core.Content.Load("images/Enter"), + OnClick = delegate(Point clickPos) + { + Debug.WriteLine("That ugly button was clicked at (" + clickPos.X + "," + clickPos.Y + ")"); + } + }; + + var text = new GUI.Text(frame); + text.SetFont("Arial"); + text.Value = "Hello world!";*/ + + // Create some unit frames + /*var panicFrame = CreatePanicFrame(); + var unit1 = CreateUnitFrame("Flight captain Rainbow"); + unit1.X = panicFrame.X; + unit1.Y = panicFrame.Y + panicFrame.Height; + unit1.OnClick += delegate(Frame frame, Frame.MouseEventArgs args) + { + frame.Color = Color.Red; + }; + var unit2 = CreateUnitFrame("Mr. Sparkle"); + unit2.X = unit1.X; + unit2.Y = unit1.Y + unit1.Height; + unit2.OnClick += delegate(Frame frame, Frame.MouseEventArgs args) + { + frame.Color = Color.Red; + };*/ + + /*var frame1 = new GUI.Frame(); + frame1.Layer = 0; + frame1.SetTexture("images/Enter"); + frame1.Color = Color.Red; + frame1.Width = 100; + frame1.Height = 100; + frame1.OnClick += delegate(Frame frame, Frame.MouseEventArgs args) + { + if (frame.Color == Color.Red) + frame.Color = Color.Green; + else + frame.Color = Color.Red; + }; + var frame1_child = new GUI.Frame(frame1); + frame1_child.SetTexture("images/Enter"); + frame1_child.Color = Color.Purple; + frame1_child.Width = 60; + frame1_child.Height = 60; + frame1_child.X = 20; + frame1_child.Y = 20; + + var frame2 = new GUI.Frame(); + frame2.Layer = 0; + frame2.SetTexture("images/Enter"); + frame2.Color = Color.Blue; + frame2.Width = 100; + frame2.Height = 100; + frame2.X = 50; + frame2.Y = 50; + frame2.OnClick += delegate(Frame frame, Frame.MouseEventArgs args) + { + if (frame.Color == Color.Blue) + frame.Color = Color.Yellow; + else + frame.Color = Color.Blue; + };*/ + } + + private GUI.Frame CreatePanicFrame() + { + var frame = new GUI.Frame(UIParent); + frame.SetTexture("images/GUI/unit_background"); + frame.Color = Color.Black; + frame.Width = 164; + frame.Height = 19; + + frame.OnClick += delegate(Frame frame1, GUIManager.MouseEventArgs args) + { + DynamicGroupManager.Group group = (DynamicGroupManager.Group)frame1["group"]; + if (group != null) + group.Panic += 5; + }; + + var panicBarBg = new GUI.Frame(frame); + panicBarBg.SetTexture("images/GUI/health_background"); + panicBarBg.Width = 136; + panicBarBg.Height = 13; + panicBarBg.X = 3; + panicBarBg.Y = 3; + frame["panicBarBg"] = panicBarBg; + + var panicBar = new GUI.Frame(panicBarBg); + panicBar.SetTexture("images/GUI/bar_solid"); + panicBar.Color = new Color(87, 55, 253); + panicBar.Width = (int)(panicBarBg.Width * 0.5); + panicBar.Height = 11; + panicBar.X = 1; + panicBar.Y = 1; + frame["panicBar"] = panicBar; + + var text = new GUI.Text(frame); + text.SetFont("fonts/UnitName"); + text.Value = "0%"; + text.X = 4; + text.Y = 1; + frame["text"] = text; + + return frame; + } + + private GUI.Frame CreateUnitFrame(Soldier soldier) + { + var frame = new GUI.Frame(UIParent); + frame.SetTexture("images/GUI/unit_background"); + frame.Color = Color.Black; + frame.Width = 164; + frame.Height = 35; + + var nameText = new GUI.Text(frame); + nameText.SetFont("fonts/UnitName"); + nameText.Value = soldier.Name + " "/* + soldier.GetHashCode()*/; + nameText.X = 4; + nameText.Y = 1; + frame["nameText"] = nameText; + + var healthBarBg = new GUI.Frame(frame); + healthBarBg.SetTexture("images/GUI/health_background"); + healthBarBg.Width = 136; + healthBarBg.Height = 13; + healthBarBg.X = 3; + healthBarBg.Y = 19; + frame["healthBarBg"] = healthBarBg; + + var healthBar = new GUI.Frame(healthBarBg); + healthBar.SetTexture("images/GUI/bar_solid"); + healthBar.Color = Color.Red; + healthBar.Width = (int)((healthBarBg.Width - 2) * (soldier.GetComponent().HP / soldier.GetComponent().MaxHP)); + healthBar.Height = 11; + healthBar.X = 1; + healthBar.Y = 1; + frame["healthBar"] = healthBar; + + return frame; + } + + public void CreateUnitFrames(List squad) + { + // TODO: ForEach squad in Squads... + /*GUI.Frame lastFrame = null; + foreach (Soldier soldier in squad) + { + // TODO: Remove this test ;) + soldier.GetComponent().HP = random.Next(0, (int) soldier.GetComponent().MaxHP - 1); + + var uFrame = CreateUnitFrame(soldier); + uFrame["soldier"] = soldier; + soldier["unitFrame"] = uFrame; + if (lastFrame != null) + { + uFrame.X = lastFrame.X; + uFrame.Y = lastFrame.Y + lastFrame.Height; + } + uFrame.OnClick += delegate(Frame f, GUIManager.MouseEventArgs e) + { + var s = (Soldier) f["soldier"]; + KeyboardState ks = Keyboard.GetState(); + + if (!ks.IsKeyDown(Keys.LeftControl)) + { + // Deselect all units + foreach (var unitFrame in UnitFrames) + { + ((Soldier) unitFrame["soldier"]).Selected = false; + unitFrame.Color = Color.Black; + } + } + + if (!s.Selected) + { + s.Selected = true; + uFrame.Color = Color.Blue; + } + }; + UnitFrames.Add(uFrame); + lastFrame = uFrame; + }*/ + + foreach (var soldier in squad) + { + PanicFrames.Add(CreatePanicFrame()); + + // TODO: Remove this test ;) + soldier.GetComponent().HP = random.Next(0, (int)soldier.GetComponent().MaxHP - 1); + + var uFrame = CreateUnitFrame(soldier); + uFrame["soldier"] = soldier; + soldier["unitFrame"] = uFrame; + uFrame.OnClick += delegate(Frame f, GUIManager.MouseEventArgs e) + { + var s = (Soldier)f["soldier"]; + KeyboardState ks = Keyboard.GetState(); + + if (!ks.IsKeyDown(Keys.LeftControl)) + { + // Deselect all units + foreach (var unitFrame in UnitFrames) + { + ((Soldier)unitFrame["soldier"]).Selected = false; + unitFrame.Color = Color.Black; + } + } + + if (!s.Selected) + { + s.Selected = true; + uFrame.Color = Color.Blue; + } + }; + UnitFrames.Add(uFrame); + } + } + + public void UpdateUnitFrames() + { + core.GroupManager.UpdateGroups(); + var groups = core.GroupManager.Groups; + + foreach (var panicFrame in PanicFrames) + panicFrame.Visible = false; + + GUI.Frame lastFrame = null; + for (int index = 0; index < groups.Count; index++) + { + var group = groups[index]; + + var pFrame = PanicFrames[index]; + pFrame["group"] = group; + var pFrameBarBg = (GUI.Frame)pFrame["panicBarBg"]; + var pFrameBar = (GUI.Frame)pFrame["panicBar"]; + var pFrameText = (GUI.Text)pFrame["text"]; + pFrameBar.Width = (int)(pFrameBarBg.Width * (group.Panic / group.MaxPanic)); + pFrameText.Value = group.Panic.ToString() + " (" + (group.Panic / group.MaxPanic * 100f).ToString() + "%)"; + + pFrame.Visible = true; + if (lastFrame != null) + { + pFrame.X = lastFrame.X; + pFrame.Y = lastFrame.Y + lastFrame.Height + 15; + } + lastFrame = pFrame; + + foreach (Soldier soldier in @group.Entities) + { + var frame = (GUI.Frame) soldier["unitFrame"]; + frame.X = lastFrame.X; + frame.Y = lastFrame.Y + lastFrame.Height; + lastFrame = frame; + } + } + } + + public void Update(GameTime gameTime) + { + MouseState ms = Mouse.GetState(); + var mousePos = new Point(ms.X, ms.Y); + var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1); + var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y)); + var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1); + + // Update the selection rectangle + var selectionFrame = (GUI.Frame)UIParent["selectionFrame"]; + if (selectionFrame.Visible) + { + selectionFrame.Width = (int)mousePos.X - selectionFrame.X; + selectionFrame.Height = (int)mousePos.Y - selectionFrame.Y; + } + + // Update rotations + if (checkingDirection) + { + foreach (var unit in core.Squad) + if (unit.Selected) + { + float directionX = mouseWorldPos.X - unit.Transform.World.X; + float directionY = mouseWorldPos.Y - unit.Transform.World.Y; + //var mouseDirection = mouseWorldPos; + //mouseDirection.Normalize(); + unit.GetComponent().World.Rotation = + (float) + Math.Atan2(mouseWorldPos.Y - unit.Transform.World.Y - unit.Transform.World.Origin.Y, + mouseWorldPos.X - unit.Transform.World.X - unit.Transform.World.Origin.X); + } + } + + UpdateUnitFrames(); + } + } +} diff --git a/DepthsBelow/DepthsBelow/Soldier.cs b/DepthsBelow/DepthsBelow/Soldier.cs index 99a1289..e237f94 100755 --- a/DepthsBelow/DepthsBelow/Soldier.cs +++ b/DepthsBelow/DepthsBelow/Soldier.cs @@ -113,30 +113,40 @@ namespace DepthsBelow List soldierCollisions = new List(); // Collision with units at a standstill - foreach (var soldier in Squad) - { - if (soldier != this && !soldier.GetComponent().IsMoving) - { - soldierCollisions.Add(soldier.Transform.Grid); - } - } + //foreach (var soldier in Squad) + //{ + // if (soldier != this) + // { + // if (!soldier.GetComponent().IsMoving) + // { + // soldierCollisions.Add(soldier.Transform.Grid); + // } + // if (soldier.Transform.Grid == nextNode.Position) + // { + // GetComponent().RecreatePath(soldierCollisions); + // nextNode = GetComponent().Next(); + // break; + // } + // } - // Collision with moving units - foreach (var soldier in Squad) - { - if (soldier != this) - { - 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; - } - } - } + //} + + // Collision with moving units + //foreach (var soldier in Squad) + //{ + // if (soldier != this) + // { + // 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) {