From 56ae4e846b5cb6535a158bb2baafd2e72710d9e9 Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Sat, 18 Jun 2016 13:44:19 +0200 Subject: [PATCH] Add GUI integration for PlayerExperience --- .../Logic/Ingame/GameInfoStatsLogic.cs | 99 +++++++++++-------- .../Logic/Ingame/ObserverStatsLogic.cs | 1 + mods/cnc/chrome/ingame-infostats.yaml | 79 +++++++-------- mods/cnc/chrome/ingame-observerstats.yaml | 58 ++++++----- mods/d2k/chrome/ingame-infostats.yaml | 82 +++++++-------- mods/ra/chrome/ingame-infostats.yaml | 80 +++++++-------- mods/ra/chrome/ingame-observerstats.yaml | 58 ++++++----- mods/ts/chrome/ingame-observerstats.yaml | 58 ++++++----- 8 files changed, 276 insertions(+), 239 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs index c089793293..677da89a78 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.Mods.Common.Traits; @@ -59,58 +60,70 @@ namespace OpenRA.Mods.Common.Widgets.Logic playerPanel.Bounds.Height += objectiveGroup.Bounds.Height; } + var teamTemplate = playerPanel.Get("TEAM_TEMPLATE"); var playerTemplate = playerPanel.Get("PLAYER_TEMPLATE"); playerPanel.RemoveChildren(); - foreach (var p in world.Players.Where(a => !a.NonCombatant)) + var teams = world.Players.Where(p => !p.NonCombatant && p.Playable) + .Select(p => new Pair(p, p.PlayerActor.TraitOrDefault())) + .OrderByDescending(p => p.Second != null ? p.Second.Experience : 0) + .GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.First.ClientIndex) ?? new Session.Client()).Team) + .OrderByDescending(g => g.Sum(gg => gg.Second != null ? gg.Second.Experience : 0)); + + foreach (var t in teams) { - var pp = p; - var client = world.LobbyInfo.ClientWithIndex(pp.ClientIndex); - var item = playerTemplate.Clone(); - LobbyUtils.SetupClientWidget(item, client, orderManager, client != null && client.Bot == null); - var nameLabel = item.Get("NAME"); - var nameFont = Game.Renderer.Fonts[nameLabel.Font]; - - var suffixLength = new CachedTransform(s => nameFont.Measure(s).X); - var name = new CachedTransform, string>(c => - WidgetUtils.TruncateText(c.First, nameLabel.Bounds.Width - c.Second, nameFont)); - - nameLabel.GetText = () => + if (teams.Count() > 1) { - var suffix = pp.WinState == WinState.Undefined ? "" : " (" + pp.WinState + ")"; - if (client != null && client.State == Session.ClientState.Disconnected) - suffix = " (Gone)"; + var teamHeader = ScrollItemWidget.Setup(teamTemplate, () => true, () => { }); + teamHeader.Get("TEAM").GetText = () => t.Key == 0 ? "No Team" : "Team {0}".F(t.Key); + var teamRating = teamHeader.Get("TEAM_SCORE"); + teamRating.GetText = () => t.Sum(gg => gg.Second != null ? gg.Second.Experience : 0).ToString(); - var sl = suffixLength.Update(suffix); - return name.Update(Pair.New(pp.PlayerName, sl)) + suffix; - }; - nameLabel.GetColor = () => pp.Color.RGB; - - var flag = item.Get("FACTIONFLAG"); - flag.GetImageCollection = () => "flags"; - if (player == null || player.Stances[pp] == Stance.Ally || player.WinState != WinState.Undefined) - { - flag.GetImageName = () => pp.Faction.InternalName; - item.Get("FACTION").GetText = () => pp.Faction.Name; - } - else - { - flag.GetImageName = () => pp.DisplayFaction.InternalName; - item.Get("FACTION").GetText = () => pp.DisplayFaction.Name; + playerPanel.AddChild(teamHeader); } - var team = item.Get("TEAM"); - var teamNumber = pp.PlayerReference.Playable ? ((client == null) ? 0 : client.Team) : pp.PlayerReference.Team; - team.GetText = () => (teamNumber == 0) ? "-" : teamNumber.ToString(); - playerPanel.AddChild(item); + foreach (var p in t.ToList()) + { + var pp = p.First; + var client = world.LobbyInfo.ClientWithIndex(pp.ClientIndex); + var item = playerTemplate.Clone(); + LobbyUtils.SetupClientWidget(item, client, orderManager, client != null && client.Bot == null); + var nameLabel = item.Get("NAME"); + var nameFont = Game.Renderer.Fonts[nameLabel.Font]; - var stats = pp.PlayerActor.TraitOrDefault(); - if (stats == null) - break; - var totalKills = stats.UnitsKilled + stats.BuildingsKilled; - var totalDeaths = stats.UnitsDead + stats.BuildingsDead; - item.Get("KILLS").GetText = () => totalKills.ToString(); - item.Get("DEATHS").GetText = () => totalDeaths.ToString(); + var suffixLength = new CachedTransform(s => nameFont.Measure(s).X); + var name = new CachedTransform, string>(c => + WidgetUtils.TruncateText(c.First, nameLabel.Bounds.Width - c.Second, nameFont)); + + nameLabel.GetText = () => + { + var suffix = pp.WinState == WinState.Undefined ? "" : " (" + pp.WinState + ")"; + if (client != null && client.State == Session.ClientState.Disconnected) + suffix = " (Gone)"; + + var sl = suffixLength.Update(suffix); + return name.Update(Pair.New(pp.PlayerName, sl)) + suffix; + }; + nameLabel.GetColor = () => pp.Color.RGB; + + var flag = item.Get("FACTIONFLAG"); + flag.GetImageCollection = () => "flags"; + if (player == null || player.Stances[pp] == Stance.Ally || player.WinState != WinState.Undefined) + { + flag.GetImageName = () => pp.Faction.InternalName; + item.Get("FACTION").GetText = () => pp.Faction.Name; + } + else + { + flag.GetImageName = () => pp.DisplayFaction.InternalName; + item.Get("FACTION").GetText = () => pp.DisplayFaction.Name; + } + + var experience = p.Second != null ? p.Second.Experience : 0; + item.Get("SCORE").GetText = () => experience.ToString(); + + playerPanel.AddChild(item); + } } } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs index 2c5e2a2ef2..b5d4469059 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs @@ -273,6 +273,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic template.Get("DEATHS").GetText = () => (stats.UnitsDead + stats.BuildingsDead).ToString(); template.Get("ASSETS_DESTROYED").GetText = () => "$" + stats.KillsCost; template.Get("ASSETS_LOST").GetText = () => "$" + stats.DeathsCost; + template.Get("EXPERIENCE").GetText = () => stats.Experience.ToString(); template.Get("ACTIONS_MIN").GetText = () => AverageOrdersPerMinute(stats.OrderCount); return template; diff --git a/mods/cnc/chrome/ingame-infostats.yaml b/mods/cnc/chrome/ingame-infostats.yaml index 8815d31a7e..6e12d1bb1a 100644 --- a/mods/cnc/chrome/ingame-infostats.yaml +++ b/mods/cnc/chrome/ingame-infostats.yaml @@ -35,38 +35,23 @@ Container@SKIRMISH_STATS: Children: Label@NAME: X: 10 - Width: 150 + Width: 210 Height: 25 Text: Player Font: Bold Label@FACTION: - X: 150 - Width: 80 + X: 230 + Width: 120 Height: 25 Text: Faction Font: Bold - Align: Center - Label@STANCE: - X: 240 - Width: 70 + Label@SCORE: + X: 360 + Width: 75 Height: 25 - Text: Team + Text: Score Font: Bold - Align: Center - Label@KILLS: - X: 310 - Width: 70 - Height: 25 - Text: Kills - Font: Bold - Align: Center - Label@DEATHS: - X: 380 - Width: 70 - Height: 25 - Text: Deaths - Font: Bold - Align: Center + Align: Right ScrollPanel@PLAYER_LIST: X: 15 Y: 105 @@ -75,43 +60,51 @@ Container@SKIRMISH_STATS: TopBottomSpacing: 5 ItemSpacing: 5 Children: + ScrollItem@TEAM_TEMPLATE: + Width: PARENT_RIGHT - 27 + Height: 20 + X: 2 + Visible: false + Children: + Label@TEAM: + X: 2 + Y: 0-2 + Width: 160 + Height: 20 + Font: Bold + Label@TEAM_SCORE: + X: 360 + Y: 0-2 + Width: 75 + Height: 20 + Font: Bold + Align: Right Container@PLAYER_TEMPLATE: Width: PARENT_RIGHT-27 Height: 25 X: 2 - Y: 0 Children: Label@NAME: X: 10 - Width: 150 + Width: 210 Height: 25 ClientTooltipRegion@CLIENT_REGION: TooltipContainer: TOOLTIP_CONTAINER Template: INGAME_CLIENT_TOOLTIP X: 10 - Width: 150 + Width: 210 Height: 25 Image@FACTIONFLAG: - X: 159 + X: 230 Y: 6 Width: 32 Height: 16 Label@FACTION: - X: 195 - Width: 40 + X: 264 + Width: 86 Height: 25 - Label@TEAM: - X: 240 - Width: 70 + Label@SCORE: + X: 360 + Width: 75 Height: 25 - Align: Center - Label@KILLS: - X: 310 - Width: 70 - Height: 25 - Align: Center - Label@DEATHS: - X: 380 - Width: 70 - Height: 25 - Align: Center + Align: Right diff --git a/mods/cnc/chrome/ingame-observerstats.yaml b/mods/cnc/chrome/ingame-observerstats.yaml index ae890bb166..4081e2d4e0 100644 --- a/mods/cnc/chrome/ingame-observerstats.yaml +++ b/mods/cnc/chrome/ingame-observerstats.yaml @@ -2,7 +2,7 @@ Background@INGAME_OBSERVERSTATS_BG: Logic: ObserverStatsLogic X: (WINDOW_RIGHT - WIDTH) / 2 Y: (WINDOW_BOTTOM - HEIGHT) / 2 - Width: 940 + Width: 1005 Height: 500 Children: Background@BACKGROUND: @@ -59,41 +59,49 @@ Background@INGAME_OBSERVERSTATS_BG: Font: Bold Text: Power Label@KILLS_HEADER: - X: 495 + X: 475 Y: 40 - Width: 40 + Width: 60 Height: 25 Font: Bold Text: Kills Align: Right Label@DEATHS_HEADER: - X: 555 + X: 535 Y: 40 - Width: 40 + Width: 60 Height: 25 Font: Bold Text: Deaths Align: Right Label@ASSETS_DESTROYED_HEADER: - X: 625 + X: 595 Y: 40 - Width: 60 + Width: 80 Height: 25 Font: Bold Text: Destroyed Align: Right Label@ASSETS_LOST_HEADER: - X: 685 + X: 675 Y: 40 - Width: 60 + Width: 80 Height: 25 Font: Bold Text: Lost Align: Right - Label@ACTIONS_MIN_HEADER: - X: 805 + Label@EXPERIENCE_HEADER: + X: 755 Y: 40 - Width: 40 + Width: 94 + Height: 25 + Font: Bold + Text: Experience + Align: Right + Label@ACTIONS_MIN_HEADER: + X: 850 + Y: 40 + Width: 90 Height: 25 Font: Bold Text: Actions/min @@ -316,33 +324,39 @@ Background@INGAME_OBSERVERSTATS_BG: Width: 80 Height: PARENT_BOTTOM Label@KILLS: - X: 475 + X: 455 Y: 0 - Width: 40 + Width: 60 Height: PARENT_BOTTOM Align: Right Label@DEATHS: - X: 535 + X: 515 Y: 0 - Width: 40 + Width: 60 Height: PARENT_BOTTOM Align: Right Label@ASSETS_DESTROYED: - X: 595 + X: 575 Y: 0 - Width: 60 + Width: 80 Height: PARENT_BOTTOM Align: Right Label@ASSETS_LOST: - X: 660 + X: 655 Y: 0 - Width: 60 + Width: 80 + Height: PARENT_BOTTOM + Align: Right + Label@EXPERIENCE: + X: 735 + Y: 0 + Width: 95 Height: PARENT_BOTTOM Align: Right Label@ACTIONS_MIN: - X: 775 + X: 830 Y: 0 - Width: 40 + Width: 90 Height: PARENT_BOTTOM Align: Right ScrollItem@ECONOMY_PLAYER_TEMPLATE: diff --git a/mods/d2k/chrome/ingame-infostats.yaml b/mods/d2k/chrome/ingame-infostats.yaml index 46b29dd0c9..4832ba512e 100644 --- a/mods/d2k/chrome/ingame-infostats.yaml +++ b/mods/d2k/chrome/ingame-infostats.yaml @@ -35,38 +35,23 @@ Container@SKIRMISH_STATS: Children: Label@NAME: X: 10 - Width: 150 + Width: 210 Height: 25 Text: Player Font: Bold Label@FACTION: - X: 150 - Width: 80 + X: 230 + Width: 120 Height: 25 Text: Faction Font: Bold - Align: Center - Label@STANCE: - X: 280 - Width: 50 + Label@SCORE: + X: 360 + Width: 75 Height: 25 - Text: Team + Text: Score Font: Bold - Align: Center - Label@KILLS: - X: 330 - Width: 60 - Height: 25 - Text: Kills - Font: Bold - Align: Center - Label@DEATHS: - X: 390 - Width: 60 - Height: 25 - Text: Deaths - Font: Bold - Align: Center + Align: Right ScrollPanel@PLAYER_LIST: X: 20 Y: 105 @@ -75,43 +60,52 @@ Container@SKIRMISH_STATS: TopBottomSpacing: 5 ItemSpacing: 5 Children: + ScrollItem@TEAM_TEMPLATE: + BaseName: scrollheader + Width: PARENT_RIGHT - 27 + Height: 20 + X: 2 + Visible: false + Children: + Label@TEAM: + X: 2 + Y: 0-2 + Width: 160 + Height: 20 + Font: Bold + Label@TEAM_SCORE: + X: 360 + Y: 0-2 + Width: 75 + Height: 20 + Font: Bold + Align: Right Container@PLAYER_TEMPLATE: Width: PARENT_RIGHT-27 Height: 25 X: 2 - Y: 0 Children: Label@NAME: X: 10 - Width: 150 + Width: 210 Height: 25 ClientTooltipRegion@CLIENT_REGION: TooltipContainer: TOOLTIP_CONTAINER Template: INGAME_CLIENT_TOOLTIP X: 10 - Width: 150 + Width: 210 Height: 25 Image@FACTIONFLAG: - X: 159 - Y: 3 + X: 230 + Y: 6 Width: 32 Height: 16 Label@FACTION: - X: 195 - Width: 85 + X: 264 + Width: 86 Height: 25 - Label@TEAM: - X: 280 - Width: 50 + Label@SCORE: + X: 360 + Width: 75 Height: 25 - Align: Center - Label@KILLS: - X: 330 - Width: 60 - Height: 25 - Align: Center - Label@DEATHS: - X: 390 - Width: 60 - Height: 25 - Align: Center + Align: Right diff --git a/mods/ra/chrome/ingame-infostats.yaml b/mods/ra/chrome/ingame-infostats.yaml index 9a48a61985..4832ba512e 100644 --- a/mods/ra/chrome/ingame-infostats.yaml +++ b/mods/ra/chrome/ingame-infostats.yaml @@ -35,38 +35,23 @@ Container@SKIRMISH_STATS: Children: Label@NAME: X: 10 - Width: 150 + Width: 210 Height: 25 Text: Player Font: Bold Label@FACTION: - X: 150 - Width: 80 + X: 230 + Width: 120 Height: 25 Text: Faction Font: Bold - Align: Center - Label@STANCE: - X: 260 - Width: 50 + Label@SCORE: + X: 360 + Width: 75 Height: 25 - Text: Team + Text: Score Font: Bold - Align: Center - Label@KILLS: - X: 310 - Width: 70 - Height: 25 - Text: Kills - Font: Bold - Align: Center - Label@DEATHS: - X: 380 - Width: 70 - Height: 25 - Text: Deaths - Font: Bold - Align: Center + Align: Right ScrollPanel@PLAYER_LIST: X: 20 Y: 105 @@ -75,43 +60,52 @@ Container@SKIRMISH_STATS: TopBottomSpacing: 5 ItemSpacing: 5 Children: + ScrollItem@TEAM_TEMPLATE: + BaseName: scrollheader + Width: PARENT_RIGHT - 27 + Height: 20 + X: 2 + Visible: false + Children: + Label@TEAM: + X: 2 + Y: 0-2 + Width: 160 + Height: 20 + Font: Bold + Label@TEAM_SCORE: + X: 360 + Y: 0-2 + Width: 75 + Height: 20 + Font: Bold + Align: Right Container@PLAYER_TEMPLATE: Width: PARENT_RIGHT-27 Height: 25 X: 2 - Y: 0 Children: Label@NAME: X: 10 - Width: 150 + Width: 210 Height: 25 ClientTooltipRegion@CLIENT_REGION: TooltipContainer: TOOLTIP_CONTAINER Template: INGAME_CLIENT_TOOLTIP X: 10 - Width: 150 + Width: 210 Height: 25 Image@FACTIONFLAG: - X: 159 + X: 230 Y: 6 Width: 32 Height: 16 Label@FACTION: - X: 195 - Width: 65 + X: 264 + Width: 86 Height: 25 - Label@TEAM: - X: 260 - Width: 50 + Label@SCORE: + X: 360 + Width: 75 Height: 25 - Align: Center - Label@KILLS: - X: 310 - Width: 70 - Height: 25 - Align: Center - Label@DEATHS: - X: 380 - Width: 70 - Height: 25 - Align: Center + Align: Right diff --git a/mods/ra/chrome/ingame-observerstats.yaml b/mods/ra/chrome/ingame-observerstats.yaml index 97c4d7bf1a..9d1c5ddd20 100644 --- a/mods/ra/chrome/ingame-observerstats.yaml +++ b/mods/ra/chrome/ingame-observerstats.yaml @@ -2,7 +2,7 @@ Background@INGAME_OBSERVERSTATS_BG: Logic: ObserverStatsLogic X: 25 Y: 50 - Width: 950 + Width: 1025 Height: 500 Background: dialog Children: @@ -54,30 +54,30 @@ Background@INGAME_OBSERVERSTATS_BG: Label@POWER_HEADER: X: 425 Y: 40 - Width: 80 + Width: 60 Height: 25 Font: Bold Text: Power Label@KILLS_HEADER: - X: 505 + X: 485 Y: 40 - Width: 40 + Width: 60 Height: 25 Font: Bold Text: Kills Align: Right Label@DEATHS_HEADER: - X: 565 + X: 545 Y: 40 - Width: 40 + Width: 60 Height: 25 Font: Bold Text: Deaths Align: Right Label@ASSETS_DESTROYED_HEADER: - X: 625 + X: 605 Y: 40 - Width: 60 + Width: 80 Height: 25 Font: Bold Text: Destroyed @@ -85,15 +85,23 @@ Background@INGAME_OBSERVERSTATS_BG: Label@ASSETS_LOST_HEADER: X: 685 Y: 40 - Width: 60 + Width: 80 Height: 25 Font: Bold Text: Lost Align: Right - Label@ACTIONS_MIN_HEADER: - X: 805 + Label@EXPERIENCE_HEADER: + X: 765 Y: 40 - Width: 40 + Width: 95 + Height: 25 + Font: Bold + Text: Experience + Align: Right + Label@ACTIONS_MIN_HEADER: + X: 860 + Y: 40 + Width: 90 Height: 25 Font: Bold Text: Actions/min @@ -316,33 +324,39 @@ Background@INGAME_OBSERVERSTATS_BG: Width: 80 Height: PARENT_BOTTOM Label@KILLS: - X: 475 + X: 455 Y: 0 - Width: 40 + Width: 60 Height: PARENT_BOTTOM Align: Right Label@DEATHS: - X: 535 + X: 515 Y: 0 - Width: 40 + Width: 60 Height: PARENT_BOTTOM Align: Right Label@ASSETS_DESTROYED: - X: 595 + X: 575 Y: 0 - Width: 60 + Width: 80 Height: PARENT_BOTTOM Align: Right Label@ASSETS_LOST: - X: 660 + X: 655 Y: 0 - Width: 60 + Width: 80 + Height: PARENT_BOTTOM + Align: Right + Label@EXPERIENCE: + X: 735 + Y: 0 + Width: 95 Height: PARENT_BOTTOM Align: Right Label@ACTIONS_MIN: - X: 775 + X: 830 Y: 0 - Width: 40 + Width: 90 Height: PARENT_BOTTOM Align: Right ScrollItem@ECONOMY_PLAYER_TEMPLATE: diff --git a/mods/ts/chrome/ingame-observerstats.yaml b/mods/ts/chrome/ingame-observerstats.yaml index 7372b21194..067a3a20f6 100644 --- a/mods/ts/chrome/ingame-observerstats.yaml +++ b/mods/ts/chrome/ingame-observerstats.yaml @@ -2,7 +2,7 @@ Background@INGAME_OBSERVERSTATS_BG: Logic: ObserverStatsLogic X: 25 Y: 50 - Width: 950 + Width: 1025 Height: 500 Background: dialog Children: @@ -54,30 +54,30 @@ Background@INGAME_OBSERVERSTATS_BG: Label@POWER_HEADER: X: 425 Y: 40 - Width: 80 + Width: 60 Height: 25 Font: Bold Text: Power Label@KILLS_HEADER: - X: 505 + X: 485 Y: 40 - Width: 40 + Width: 60 Height: 25 Font: Bold Text: Kills Align: Right Label@DEATHS_HEADER: - X: 565 + X: 545 Y: 40 - Width: 40 + Width: 60 Height: 25 Font: Bold Text: Deaths Align: Right Label@ASSETS_DESTROYED_HEADER: - X: 625 + X: 605 Y: 40 - Width: 60 + Width: 80 Height: 25 Font: Bold Text: Destroyed @@ -85,15 +85,23 @@ Background@INGAME_OBSERVERSTATS_BG: Label@ASSETS_LOST_HEADER: X: 685 Y: 40 - Width: 60 + Width: 80 Height: 25 Font: Bold Text: Lost Align: Right - Label@ACTIONS_MIN_HEADER: - X: 805 + Label@EXPERIENCE_HEADER: + X: 765 Y: 40 - Width: 40 + Width: 95 + Height: 25 + Font: Bold + Text: Experience + Align: Right + Label@ACTIONS_MIN_HEADER: + X: 860 + Y: 40 + Width: 90 Height: 25 Font: Bold Text: Actions/min @@ -316,33 +324,39 @@ Background@INGAME_OBSERVERSTATS_BG: Width: 80 Height: PARENT_BOTTOM Label@KILLS: - X: 475 + X: 455 Y: 0 - Width: 40 + Width: 60 Height: PARENT_BOTTOM Align: Right Label@DEATHS: - X: 535 + X: 515 Y: 0 - Width: 40 + Width: 60 Height: PARENT_BOTTOM Align: Right Label@ASSETS_DESTROYED: - X: 595 + X: 575 Y: 0 - Width: 60 + Width: 80 Height: PARENT_BOTTOM Align: Right Label@ASSETS_LOST: - X: 660 + X: 655 Y: 0 - Width: 60 + Width: 80 + Height: PARENT_BOTTOM + Align: Right + Label@EXPERIENCE: + X: 735 + Y: 0 + Width: 95 Height: PARENT_BOTTOM Align: Right Label@ACTIONS_MIN: - X: 775 + X: 830 Y: 0 - Width: 40 + Width: 90 Height: PARENT_BOTTOM Align: Right ScrollItem@ECONOMY_PLAYER_TEMPLATE: