diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 7eeb56f4f..5d3e3e124 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -628,6 +628,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -815,6 +818,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Subsurface/Content/Orders.xml b/Subsurface/Content/Orders.xml new file mode 100644 index 000000000..c28b1b516 --- /dev/null +++ b/Subsurface/Content/Orders.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Subsurface/Content/UI/orderSymbols.png b/Subsurface/Content/UI/orderSymbols.png new file mode 100644 index 000000000..2860a2a77 Binary files /dev/null and b/Subsurface/Content/UI/orderSymbols.png differ diff --git a/Subsurface/Source/Characters/AI/CrewCommander.cs b/Subsurface/Source/Characters/AI/CrewCommander.cs index cea3f0d34..972d4060f 100644 --- a/Subsurface/Source/Characters/AI/CrewCommander.cs +++ b/Subsurface/Source/Characters/AI/CrewCommander.cs @@ -63,7 +63,7 @@ namespace Barotrauma Order.PrefabList.FindAll(o=> o.ItemComponentType!=null); int startX = (int)-(buttonWidth * orders.Count + spacing * (orders.Count - 1)) / 2; - + int i=0; foreach (Order order in orders) { @@ -77,25 +77,39 @@ namespace Barotrauma { var newOrder = new Order(order, it.components.Find(ic => ic.GetType() == order.ItemComponentType)); - var button = new GUIButton(new Rectangle(x+buttonWidth/2, y2, buttonWidth, 20), order.Name, Alignment.TopCenter, GUI.Style, frame); - button.UserData = newOrder; - button.OnClicked = SetOrder; + CreateOrderButton(new Rectangle(x + buttonWidth / 2, y2, buttonWidth, 20), newOrder, y2==y); y2 += 25; } } else { - var button = new GUIButton(new Rectangle(x + buttonWidth / 2, y, buttonWidth, 20), order.Name, Alignment.TopCenter, GUI.Style, frame); - button.UserData = order; - button.OnClicked = SetOrder; + CreateOrderButton(new Rectangle(x + buttonWidth / 2, y, buttonWidth, 20), order); } i++; } y += 80; } + } + private GUIButton CreateOrderButton(Rectangle rect, Order order, bool createSymbol = true) + { + var orderButton = new GUIButton(rect, order.Name, Color.Black * 0.5f, Alignment.TopCenter, Alignment.Right, null, frame); + orderButton.HoverColor = Color.LightGray * 0.5f; + orderButton.OutlineColor = Color.LightGray * 0.8f; + orderButton.UserData = order; + orderButton.OnClicked = SetOrder; + + if (createSymbol) + { + var symbol = new GUIImage(new Rectangle(-5,0,64,64), order.SymbolSprite, Alignment.Left | Alignment.CenterY, orderButton); + symbol.Color = order.Color; + orderButton.children.Insert(1, symbol); + orderButton.children.RemoveAt(orderButton.children.Count-1); + } + + return orderButton; } public void UpdateCharacters() @@ -155,7 +169,8 @@ namespace Barotrauma characterButton.OutlineColor = Color.LightGray * 0.8f; } - string name = character.Info.Name.Replace(' ', '\n'); + string name = character.Info.Name; + if (character.Info.Job != null) name += '\n' + "(" + character.Info.Job.Name + ")"; GUITextBlock textBlock = new GUITextBlock( new Rectangle(40, 0, 0, 25), @@ -166,7 +181,7 @@ namespace Barotrauma textBlock.Font = GUI.SmallFont; textBlock.Padding = new Vector4(5.0f, 0.0f, 5.0f, 0.0f); - new GUIImage(new Rectangle(-10, -5, 0, 0), character.AnimController.Limbs[0].sprite, Alignment.Left, characterButton); + new GUIImage(new Rectangle(-5, -5, 0, 0), character.AnimController.Limbs[0].sprite, Alignment.Left, characterButton); i++; } diff --git a/Subsurface/Source/Characters/AI/Order.cs b/Subsurface/Source/Characters/AI/Order.cs index 205ede5cd..3423ae5b3 100644 --- a/Subsurface/Source/Characters/AI/Order.cs +++ b/Subsurface/Source/Characters/AI/Order.cs @@ -1,22 +1,29 @@ using Barotrauma.Items.Components; +using Microsoft.Xna.Framework; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; +using System.Xml.Linq; namespace Barotrauma { class Order { + private static string ConfigFile = Path.Combine("Content", "Orders.xml"); + public static List PrefabList; public readonly string Name; public readonly string DoingText; - //Sprite buttonSprite; + public readonly Sprite SymbolSprite; public readonly Type ItemComponentType; + public readonly Color Color; + public ItemComponent TargetItem; public readonly string[] Options; @@ -25,18 +32,64 @@ namespace Barotrauma { PrefabList = new List(); - PrefabList.Add(new Order("Follow", "Following")); + XDocument doc = ToolBox.TryLoadXml(ConfigFile); + if (doc == null) return; - PrefabList.Add(new Order("Dismiss", "Dismissed")); + foreach (XElement orderElement in doc.Root.Elements()) + { + if (orderElement.Name.ToString().ToLower() != "order") continue; - PrefabList.Add(new Order("Wait", "Wait")); + PrefabList.Add(new Order(orderElement)); + } - PrefabList.Add(new Order("Operate Reactor", "Operating reactor", typeof(Reactor), new string[] {"Power up", "Shutdown"})); - PrefabList.Add(new Order("Operate Railgun", "Operating railgun", typeof(Turret), new string[] { "Fire at will", "Hold fire" })); + //PrefabList.Add(new Order("Follow", "Following")); + + //PrefabList.Add(new Order("Dismiss", "Dismissed")); + + //PrefabList.Add(new Order("Wait", "Wait")); + + //PrefabList.Add(new Order("Operate Reactor", "Operating reactor", typeof(Reactor), new string[] {"Power up", "Shutdown"})); + //PrefabList.Add(new Order("Operate Railgun", "Operating railgun", typeof(Turret), new string[] { "Fire at will", "Hold fire" })); } + private Order(XElement orderElement) + { + Name = ToolBox.GetAttributeString(orderElement, "name", "Name not found"); + DoingText = ToolBox.GetAttributeString(orderElement, "doingtext", ""); + + string targetItemName = ToolBox.GetAttributeString(orderElement, "targetitemtype", ""); + + if (!string.IsNullOrWhiteSpace(targetItemName)) + { + try + { + ItemComponentType = Type.GetType("Barotrauma.Items.Components." + targetItemName, true, true); + } + + catch (Exception e) + { + DebugConsole.ThrowError("Error in " + ConfigFile + ", item component type " + targetItemName + " not found", e); + } + } + + Color = new Color(ToolBox.GetAttributeVector4(orderElement, "color", new Vector4(1.0f, 1.0f, 1.0f, 1.0f))); + + Options = ToolBox.GetAttributeString(orderElement, "options", "").Split(','); + for (int i = 0; i