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