diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs index 21bac3a6e6..6c188eb5c2 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs @@ -31,12 +31,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic readonly ContainerWidget productionStatsHeaders; readonly ContainerWidget combatStatsHeaders; readonly ContainerWidget earnedThisMinuteGraphHeaders; + readonly ContainerWidget armyThisMinuteGraphHeaders; readonly ScrollPanelWidget playerStatsPanel; readonly ScrollItemWidget basicPlayerTemplate; readonly ScrollItemWidget economyPlayerTemplate; readonly ScrollItemWidget productionPlayerTemplate; readonly ScrollItemWidget combatPlayerTemplate; readonly ContainerWidget earnedThisMinuteGraphTemplate; + readonly ContainerWidget armyThisMinuteGraphTemplate; readonly ScrollItemWidget teamTemplate; readonly IEnumerable players; readonly World world; @@ -64,6 +66,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic productionStatsHeaders = widget.Get("PRODUCTION_STATS_HEADERS"); combatStatsHeaders = widget.Get("COMBAT_STATS_HEADERS"); earnedThisMinuteGraphHeaders = widget.Get("EARNED_THIS_MIN_GRAPH_HEADERS"); + armyThisMinuteGraphHeaders = widget.Get("ARMY_THIS_MIN_GRAPH_HEADERS"); playerStatsPanel = widget.Get("PLAYER_STATS_PANEL"); playerStatsPanel.Layout = new GridLayout(playerStatsPanel); @@ -73,6 +76,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic productionPlayerTemplate = playerStatsPanel.Get("PRODUCTION_PLAYER_TEMPLATE"); combatPlayerTemplate = playerStatsPanel.Get("COMBAT_PLAYER_TEMPLATE"); earnedThisMinuteGraphTemplate = playerStatsPanel.Get("EARNED_THIS_MIN_GRAPH_TEMPLATE"); + armyThisMinuteGraphTemplate = playerStatsPanel.Get("ARMY_THIS_MIN_GRAPH_TEMPLATE"); teamTemplate = playerStatsPanel.Get("TEAM_TEMPLATE"); @@ -98,7 +102,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic createStatsOption("Economy", economyStatsHeaders, () => DisplayStats(EconomyStats)), createStatsOption("Production", productionStatsHeaders, () => DisplayStats(ProductionStats)), createStatsOption("Combat", combatStatsHeaders, () => DisplayStats(CombatStats)), - createStatsOption("Earnings (graph)", earnedThisMinuteGraphHeaders, () => EarnedThisMinuteGraph()) + createStatsOption("Earnings (graph)", earnedThisMinuteGraphHeaders, () => EarnedThisMinuteGraph()), + createStatsOption("Army (graph)", armyThisMinuteGraphHeaders, () => ArmyThisMinuteGraph()), }; Func setupItem = (option, template) => @@ -108,7 +113,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic return item; }; - statsDropDown.OnMouseDown = _ => statsDropDown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, statsDropDownOptions, setupItem); + statsDropDown.OnMouseDown = _ => statsDropDown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 155, statsDropDownOptions, setupItem); statsDropDownOptions[(int)activePanel].OnClick(); var close = widget.GetOrNull("CLOSE"); @@ -151,6 +156,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic productionStatsHeaders.Visible = false; combatStatsHeaders.Visible = false; earnedThisMinuteGraphHeaders.Visible = false; + armyThisMinuteGraphHeaders.Visible = false; } void EarnedThisMinuteGraph() @@ -169,6 +175,22 @@ namespace OpenRA.Mods.Common.Widgets.Logic playerStatsPanel.ScrollToTop(); } + void ArmyThisMinuteGraph() + { + armyThisMinuteGraphHeaders.Visible = true; + var template = armyThisMinuteGraphTemplate.Clone(); + + var graph = template.Get("ARMY_THIS_MIN_GRAPH"); + graph.GetSeries = () => + players.Select(p => new LineGraphSeries( + p.PlayerName, + p.Color.RGB, + (p.PlayerActor.TraitOrDefault() ?? new PlayerStatistics(p.PlayerActor)).ArmySamples.Select(s => (float)s))); + + playerStatsPanel.AddChild(template); + playerStatsPanel.ScrollToTop(); + } + void DisplayStats(Func createItem) { var teams = players.GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key); diff --git a/mods/cnc/chrome/ingame-observerstats.yaml b/mods/cnc/chrome/ingame-observerstats.yaml index fff3eb107c..ccd57ff6ca 100644 --- a/mods/cnc/chrome/ingame-observerstats.yaml +++ b/mods/cnc/chrome/ingame-observerstats.yaml @@ -284,6 +284,20 @@ Background@INGAME_OBSERVERSTATS_BG: Font: Bold Text: Earnings received each minute Align: Center + Container@ARMY_THIS_MIN_GRAPH_HEADERS: + X: 0 + Y: 0 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Children: + Label@EARNED_THIS_MIN_HEADER: + X: 0 + Y: 40 + Width: PARENT_RIGHT + Height: 25 + Font: Bold + Text: Army value over time + Align: Center ScrollPanel@PLAYER_STATS_PANEL: X: 15 Y: 70 @@ -565,6 +579,26 @@ Background@INGAME_OBSERVERSTATS_BG: YAxisLabel: $ LabelFont: TinyBold AxisFont: Bold + Container@ARMY_THIS_MIN_GRAPH_TEMPLATE: + X: 10 + Y: 10 + Width: PARENT_RIGHT - 100 + Height: PARENT_BOTTOM - 60 + Children: + LineGraph@ARMY_THIS_MIN_GRAPH: + X: 0 + Y: 0 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + ValueFormat: ${0} + XAxisValueFormat: {0} + YAxisValueFormat: ${0:F0} + XAxisSize: 20 + YAxisSize: 10 + XAxisLabel: m + YAxisLabel: $ + LabelFont: TinyBold + AxisFont: Bold Button@CLOSE: X: 0 Y: PARENT_BOTTOM - 36 diff --git a/mods/common/chrome/ingame-observerstats.yaml b/mods/common/chrome/ingame-observerstats.yaml index 5b6992073c..63a9b34f2f 100644 --- a/mods/common/chrome/ingame-observerstats.yaml +++ b/mods/common/chrome/ingame-observerstats.yaml @@ -284,6 +284,20 @@ Background@INGAME_OBSERVERSTATS_BG: Font: Bold Text: Earnings received each minute Align: Center + Container@ARMY_THIS_MIN_GRAPH_HEADERS: + X: 0 + Y: 0 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Children: + Label@EARNED_THIS_MIN_HEADER: + X: 0 + Y: 40 + Width: PARENT_RIGHT + Height: 25 + Font: Bold + Text: Army value over time + Align: Center ScrollPanel@PLAYER_STATS_PANEL: X: 25 Y: 70 @@ -565,6 +579,26 @@ Background@INGAME_OBSERVERSTATS_BG: YAxisLabel: $ LabelFont: TinyBold AxisFont: Bold + Container@ARMY_THIS_MIN_GRAPH_TEMPLATE: + X: 0 + Y: 0 + Width: PARENT_RIGHT - 100 + Height: PARENT_BOTTOM - 50 + Children: + LineGraph@ARMY_THIS_MIN_GRAPH: + X: 0 + Y: 0 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + ValueFormat: ${0} + XAxisValueFormat: {0} + YAxisValueFormat: ${0:F0} + XAxisSize: 20 + YAxisSize: 10 + XAxisLabel: m + YAxisLabel: $ + LabelFont: TinyBold + AxisFont: Bold Button@CLOSE: X: PARENT_RIGHT - 145 Y: PARENT_BOTTOM - 45 diff --git a/mods/ts/chrome/ingame-observerstats.yaml b/mods/ts/chrome/ingame-observerstats.yaml index 7a6dfd4d35..222ea44443 100644 --- a/mods/ts/chrome/ingame-observerstats.yaml +++ b/mods/ts/chrome/ingame-observerstats.yaml @@ -284,6 +284,20 @@ Background@INGAME_OBSERVERSTATS_BG: Font: Bold Text: Earnings received each minute Align: Center + Container@ARMY_THIS_MIN_GRAPH_HEADERS: + X: 0 + Y: 0 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Children: + Label@EARNED_THIS_MIN_HEADER: + X: 0 + Y: 40 + Width: PARENT_RIGHT + Height: 25 + Font: Bold + Text: Army value over time + Align: Center ScrollPanel@PLAYER_STATS_PANEL: X: 25 Y: 70 @@ -567,6 +581,26 @@ Background@INGAME_OBSERVERSTATS_BG: YAxisLabel: $ LabelFont: TinyBold AxisFont: Bold + Container@ARMY_THIS_MIN_GRAPH_TEMPLATE: + X: 0 + Y: 0 + Width: PARENT_RIGHT - 100 + Height: PARENT_BOTTOM - 50 + Children: + LineGraph@ARMY_THIS_MIN_GRAPH: + X: 0 + Y: 0 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + ValueFormat: ${0} + XAxisValueFormat: {0} + YAxisValueFormat: ${0:F0} + XAxisSize: 20 + YAxisSize: 10 + XAxisLabel: m + YAxisLabel: $ + LabelFont: TinyBold + AxisFont: Bold Button@CLOSE: X: PARENT_RIGHT - 145 Y: PARENT_BOTTOM - 45