diff --git a/OpenRA.Game/Widgets/WidgetUtils.cs b/OpenRA.Game/Widgets/WidgetUtils.cs
index 4c359d001d..ad179c422f 100644
--- a/OpenRA.Game/Widgets/WidgetUtils.cs
+++ b/OpenRA.Game/Widgets/WidgetUtils.cs
@@ -34,6 +34,11 @@ namespace OpenRA.Widgets
Game.Renderer.SpriteRenderer.DrawSprite(s,pos, wr, "chrome");
}
+ public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr, float2 size)
+ {
+ Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr, "chrome", size);
+ }
+
public static void DrawPanel(string collection, Rectangle Bounds)
{
DrawPanelPartial(collection, Bounds, PanelSides.All);
diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index ed0ad3a5c5..487fc1388b 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -382,6 +382,7 @@
+
diff --git a/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs
index 5f2d9807bd..e98e2f50d1 100644
--- a/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs
+++ b/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs
@@ -80,6 +80,30 @@ namespace OpenRA.Mods.RA.Widgets.Logic
template.Get("KILLS").GetText = () => player.Kills.ToString();
template.Get("DEATHS").GetText = () => player.Deaths.ToString();
+ var building = template.Get("BUILDING_ICON");
+ building.GetPlayer = () => player;
+ building.GetQueue = () => "Building";
+
+ var defense = template.Get("DEFENSE_ICON");
+ defense.GetPlayer = () => player;
+ defense.GetQueue = () => "Defense";
+
+ var vehicle = template.Get("VEHICLE_ICON");
+ vehicle.GetPlayer = () => player;
+ vehicle.GetQueue = () => "Vehicle";
+
+ var infantry = template.Get("INFANTRY_ICON");
+ infantry.GetPlayer = () => player;
+ infantry.GetQueue = () => "Infantry";
+
+ var ship = template.Get("SHIP_ICON");
+ ship.GetPlayer = () => player;
+ ship.GetQueue = () => "Ship";
+
+ var plane = template.Get("PLANE_ICON");
+ plane.GetPlayer = () => player;
+ plane.GetQueue = () => "Plane";
+
playersPanel.AddChild(template);
}
}
diff --git a/OpenRA.Mods.RA/Widgets/ObserverBuildIconWidget.cs b/OpenRA.Mods.RA/Widgets/ObserverBuildIconWidget.cs
new file mode 100644
index 0000000000..e40b030d0c
--- /dev/null
+++ b/OpenRA.Mods.RA/Widgets/ObserverBuildIconWidget.cs
@@ -0,0 +1,80 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2012 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using OpenRA.Graphics;
+using OpenRA.Widgets;
+
+namespace OpenRA.Mods.RA.Widgets
+{
+ public class ObserverBuildIconWidget : Widget
+ {
+ public Func GetPlayer;
+ public Func GetQueue;
+ Dictionary iconSprites;
+ World world;
+ WorldRenderer worldRenderer;
+
+ [ObjectCreator.UseCtor]
+ public ObserverBuildIconWidget(World world, WorldRenderer worldRenderer)
+ : base()
+ {
+ iconSprites = Rules.Info.Values.Where(u => u.Traits.Contains() && u.Name[0] != '^')
+ .ToDictionary(
+ u => u.Name,
+ u => Game.modData.SpriteLoader.LoadAllSprites(u.Traits.Get().Icon ?? (u.Name + "icon"))[0]);
+ this.world = world;
+ this.worldRenderer = worldRenderer;
+ }
+
+ protected ObserverBuildIconWidget(ObserverBuildIconWidget other)
+ : base(other)
+ {
+ GetPlayer = other.GetPlayer;
+ GetQueue = other.GetQueue;
+ iconSprites = other.iconSprites;
+ world = other.world;
+ worldRenderer = other.worldRenderer;
+ }
+
+ public override void Draw()
+ {
+ var player = GetPlayer();
+ var queue = GetQueue();
+ if (player == null || queue == null)
+ {
+ return;
+ }
+ var production = world.ActorsWithTrait()
+ .Where(a => a.Actor.Owner == player && a.Trait.Info.Type == queue)
+ .Select(a => a.Trait)
+ .FirstOrDefault();
+ if (production == null)
+ {
+ return;
+ }
+ var item = production.CurrentItem();
+ if (item == null)
+ {
+ return;
+ }
+ var location = new float2(RenderBounds.Location);
+ var sprite = iconSprites[item.Item];
+ WidgetUtils.DrawSHP(sprite, location, worldRenderer, sprite.size / new float2(2, 2));
+ }
+
+ public override Widget Clone()
+ {
+ return new ObserverBuildIconWidget(this);
+ }
+ }
+}
diff --git a/mods/ra/chrome/ingame.yaml b/mods/ra/chrome/ingame.yaml
index ab42bbd9f6..9020f68043 100644
--- a/mods/ra/chrome/ingame.yaml
+++ b/mods/ra/chrome/ingame.yaml
@@ -395,7 +395,7 @@ Container@OBSERVER_ROOT:
Logic:ObserverStatsLogic
X:25
Y:50
- Width:565
+ Width:805
Height:400
Visible:false
Children:
@@ -434,7 +434,7 @@ Container@OBSERVER_ROOT:
Font:Bold
Text:Power
Label@KILLS_HEADER:
- X:405
+ X:385
Y:40
Width:40
Height:25
@@ -442,13 +442,21 @@ Container@OBSERVER_ROOT:
Text:Kills
Align:Right
Label@DEATHS_HEADER:
- X:465
+ X:445
Y:40
Width:40
Height:25
Font:Bold
Text:Deaths
Align:Right
+ Label@PRODUCTION_HEADER
+ X:485
+ Y:40
+ Width:PARENT_RIGHT-525
+ Height:25
+ Font:Bold
+ Text:Production
+ Align:Center
ScrollPanel@PLAYERS:
X:25
Y:70
@@ -498,7 +506,7 @@ Container@OBSERVER_ROOT:
Width:80
Height:PARENT_BOTTOM
Label@KILLS:
- X:375
+ X:355
Y:0
Width:40
Height:PARENT_BOTTOM
@@ -509,6 +517,36 @@ Container@OBSERVER_ROOT:
Width:40
Height:PARENT_BOTTOM
Align:Right
+ ObserverBuildIcon@BUILDING_ICON:
+ X:480
+ Y:0
+ Width:40
+ Height:PARENT_BOTTOM
+ ObserverBuildIcon@DEFENSE_ICON:
+ X:520
+ Y:0
+ Width:40
+ Height:PARENT_BOTTOM
+ ObserverBuildIcon@VEHICLE_ICON:
+ X:560
+ Y:0
+ Width:40
+ Height:PARENT_BOTTOM
+ ObserverBuildIcon@INFANTRY_ICON:
+ X:600
+ Y:0
+ Width:40
+ Height:PARENT_BOTTOM
+ ObserverBuildIcon@SHIP_ICON:
+ X:640
+ Y:0
+ Width:40
+ Height:PARENT_BOTTOM
+ ObserverBuildIcon@PLANE_ICON:
+ X:680
+ Y:0
+ Width:40
+ Height:PARENT_BOTTOM
Background@FMVPLAYER:
Width:WINDOW_RIGHT
Height:WINDOW_BOTTOM