Observer: display army value in a new dedicated graph tab

This commit is contained in:
Clément Bœsch
2018-11-01 09:46:46 +01:00
committed by Paul Chote
parent 11b064a333
commit bb5e0eafba
4 changed files with 126 additions and 2 deletions

View File

@@ -31,12 +31,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic
readonly ContainerWidget productionStatsHeaders; readonly ContainerWidget productionStatsHeaders;
readonly ContainerWidget combatStatsHeaders; readonly ContainerWidget combatStatsHeaders;
readonly ContainerWidget earnedThisMinuteGraphHeaders; readonly ContainerWidget earnedThisMinuteGraphHeaders;
readonly ContainerWidget armyThisMinuteGraphHeaders;
readonly ScrollPanelWidget playerStatsPanel; readonly ScrollPanelWidget playerStatsPanel;
readonly ScrollItemWidget basicPlayerTemplate; readonly ScrollItemWidget basicPlayerTemplate;
readonly ScrollItemWidget economyPlayerTemplate; readonly ScrollItemWidget economyPlayerTemplate;
readonly ScrollItemWidget productionPlayerTemplate; readonly ScrollItemWidget productionPlayerTemplate;
readonly ScrollItemWidget combatPlayerTemplate; readonly ScrollItemWidget combatPlayerTemplate;
readonly ContainerWidget earnedThisMinuteGraphTemplate; readonly ContainerWidget earnedThisMinuteGraphTemplate;
readonly ContainerWidget armyThisMinuteGraphTemplate;
readonly ScrollItemWidget teamTemplate; readonly ScrollItemWidget teamTemplate;
readonly IEnumerable<Player> players; readonly IEnumerable<Player> players;
readonly World world; readonly World world;
@@ -64,6 +66,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
productionStatsHeaders = widget.Get<ContainerWidget>("PRODUCTION_STATS_HEADERS"); productionStatsHeaders = widget.Get<ContainerWidget>("PRODUCTION_STATS_HEADERS");
combatStatsHeaders = widget.Get<ContainerWidget>("COMBAT_STATS_HEADERS"); combatStatsHeaders = widget.Get<ContainerWidget>("COMBAT_STATS_HEADERS");
earnedThisMinuteGraphHeaders = widget.Get<ContainerWidget>("EARNED_THIS_MIN_GRAPH_HEADERS"); earnedThisMinuteGraphHeaders = widget.Get<ContainerWidget>("EARNED_THIS_MIN_GRAPH_HEADERS");
armyThisMinuteGraphHeaders = widget.Get<ContainerWidget>("ARMY_THIS_MIN_GRAPH_HEADERS");
playerStatsPanel = widget.Get<ScrollPanelWidget>("PLAYER_STATS_PANEL"); playerStatsPanel = widget.Get<ScrollPanelWidget>("PLAYER_STATS_PANEL");
playerStatsPanel.Layout = new GridLayout(playerStatsPanel); playerStatsPanel.Layout = new GridLayout(playerStatsPanel);
@@ -73,6 +76,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
productionPlayerTemplate = playerStatsPanel.Get<ScrollItemWidget>("PRODUCTION_PLAYER_TEMPLATE"); productionPlayerTemplate = playerStatsPanel.Get<ScrollItemWidget>("PRODUCTION_PLAYER_TEMPLATE");
combatPlayerTemplate = playerStatsPanel.Get<ScrollItemWidget>("COMBAT_PLAYER_TEMPLATE"); combatPlayerTemplate = playerStatsPanel.Get<ScrollItemWidget>("COMBAT_PLAYER_TEMPLATE");
earnedThisMinuteGraphTemplate = playerStatsPanel.Get<ContainerWidget>("EARNED_THIS_MIN_GRAPH_TEMPLATE"); earnedThisMinuteGraphTemplate = playerStatsPanel.Get<ContainerWidget>("EARNED_THIS_MIN_GRAPH_TEMPLATE");
armyThisMinuteGraphTemplate = playerStatsPanel.Get<ContainerWidget>("ARMY_THIS_MIN_GRAPH_TEMPLATE");
teamTemplate = playerStatsPanel.Get<ScrollItemWidget>("TEAM_TEMPLATE"); teamTemplate = playerStatsPanel.Get<ScrollItemWidget>("TEAM_TEMPLATE");
@@ -98,7 +102,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
createStatsOption("Economy", economyStatsHeaders, () => DisplayStats(EconomyStats)), createStatsOption("Economy", economyStatsHeaders, () => DisplayStats(EconomyStats)),
createStatsOption("Production", productionStatsHeaders, () => DisplayStats(ProductionStats)), createStatsOption("Production", productionStatsHeaders, () => DisplayStats(ProductionStats)),
createStatsOption("Combat", combatStatsHeaders, () => DisplayStats(CombatStats)), createStatsOption("Combat", combatStatsHeaders, () => DisplayStats(CombatStats)),
createStatsOption("Earnings (graph)", earnedThisMinuteGraphHeaders, () => EarnedThisMinuteGraph()) createStatsOption("Earnings (graph)", earnedThisMinuteGraphHeaders, () => EarnedThisMinuteGraph()),
createStatsOption("Army (graph)", armyThisMinuteGraphHeaders, () => ArmyThisMinuteGraph()),
}; };
Func<StatsDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) => Func<StatsDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
@@ -108,7 +113,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
return item; 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(); statsDropDownOptions[(int)activePanel].OnClick();
var close = widget.GetOrNull<ButtonWidget>("CLOSE"); var close = widget.GetOrNull<ButtonWidget>("CLOSE");
@@ -151,6 +156,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
productionStatsHeaders.Visible = false; productionStatsHeaders.Visible = false;
combatStatsHeaders.Visible = false; combatStatsHeaders.Visible = false;
earnedThisMinuteGraphHeaders.Visible = false; earnedThisMinuteGraphHeaders.Visible = false;
armyThisMinuteGraphHeaders.Visible = false;
} }
void EarnedThisMinuteGraph() void EarnedThisMinuteGraph()
@@ -169,6 +175,22 @@ namespace OpenRA.Mods.Common.Widgets.Logic
playerStatsPanel.ScrollToTop(); playerStatsPanel.ScrollToTop();
} }
void ArmyThisMinuteGraph()
{
armyThisMinuteGraphHeaders.Visible = true;
var template = armyThisMinuteGraphTemplate.Clone();
var graph = template.Get<LineGraphWidget>("ARMY_THIS_MIN_GRAPH");
graph.GetSeries = () =>
players.Select(p => new LineGraphSeries(
p.PlayerName,
p.Color.RGB,
(p.PlayerActor.TraitOrDefault<PlayerStatistics>() ?? new PlayerStatistics(p.PlayerActor)).ArmySamples.Select(s => (float)s)));
playerStatsPanel.AddChild(template);
playerStatsPanel.ScrollToTop();
}
void DisplayStats(Func<Player, ScrollItemWidget> createItem) void DisplayStats(Func<Player, ScrollItemWidget> createItem)
{ {
var teams = players.GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key); var teams = players.GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key);

View File

@@ -284,6 +284,20 @@ Background@INGAME_OBSERVERSTATS_BG:
Font: Bold Font: Bold
Text: Earnings received each minute Text: Earnings received each minute
Align: Center 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: ScrollPanel@PLAYER_STATS_PANEL:
X: 15 X: 15
Y: 70 Y: 70
@@ -565,6 +579,26 @@ Background@INGAME_OBSERVERSTATS_BG:
YAxisLabel: $ YAxisLabel: $
LabelFont: TinyBold LabelFont: TinyBold
AxisFont: Bold 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: Button@CLOSE:
X: 0 X: 0
Y: PARENT_BOTTOM - 36 Y: PARENT_BOTTOM - 36

View File

@@ -284,6 +284,20 @@ Background@INGAME_OBSERVERSTATS_BG:
Font: Bold Font: Bold
Text: Earnings received each minute Text: Earnings received each minute
Align: Center 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: ScrollPanel@PLAYER_STATS_PANEL:
X: 25 X: 25
Y: 70 Y: 70
@@ -565,6 +579,26 @@ Background@INGAME_OBSERVERSTATS_BG:
YAxisLabel: $ YAxisLabel: $
LabelFont: TinyBold LabelFont: TinyBold
AxisFont: Bold 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: Button@CLOSE:
X: PARENT_RIGHT - 145 X: PARENT_RIGHT - 145
Y: PARENT_BOTTOM - 45 Y: PARENT_BOTTOM - 45

View File

@@ -284,6 +284,20 @@ Background@INGAME_OBSERVERSTATS_BG:
Font: Bold Font: Bold
Text: Earnings received each minute Text: Earnings received each minute
Align: Center 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: ScrollPanel@PLAYER_STATS_PANEL:
X: 25 X: 25
Y: 70 Y: 70
@@ -567,6 +581,26 @@ Background@INGAME_OBSERVERSTATS_BG:
YAxisLabel: $ YAxisLabel: $
LabelFont: TinyBold LabelFont: TinyBold
AxisFont: Bold 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: Button@CLOSE:
X: PARENT_RIGHT - 145 X: PARENT_RIGHT - 145
Y: PARENT_BOTTOM - 45 Y: PARENT_BOTTOM - 45