diff --git a/OpenRA.Mods.Cnc/Widgets/CncWidgetUtils.cs b/OpenRA.Mods.Cnc/Widgets/CncWidgetUtils.cs index 401f959d02..2969ffa321 100644 --- a/OpenRA.Mods.Cnc/Widgets/CncWidgetUtils.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncWidgetUtils.cs @@ -9,6 +9,7 @@ #endregion using System; +using System.Linq; using OpenRA.FileFormats; using OpenRA.Widgets; @@ -22,6 +23,15 @@ namespace OpenRA.Mods.Cnc.Widgets return Mod.AllMods[mod].Version; } + public static string ChooseInitialMap(string map) + { + var availableMaps = Game.modData.AvailableMaps; + if (string.IsNullOrEmpty(map) || !availableMaps.ContainsKey(map)) + return availableMaps.First(m => m.Value.Selectable).Key; + + return map; + } + public static void PromptConfirmAction(string title, string text, Action onConfirm, Action onCancel) { var prompt = Widget.OpenWindow("CONFIRM_PROMPT"); diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncMapChooserLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncMapChooserLogic.cs index 21c5c517fe..4f4f062c78 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncMapChooserLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncMapChooserLogic.cs @@ -27,8 +27,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic [ObjectCreator.Param] Action onExit, [ObjectCreator.Param] Action onSelect) { - if (string.IsNullOrEmpty(initialMap) || ! Game.modData.AvailableMaps.TryGetValue(initialMap, out map)) - map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Value; + map = Game.modData.AvailableMaps[ CncWidgetUtils.ChooseInitialMap(initialMap) ]; var panel = widget.GetWidget("MAPCHOOSER_PANEL"); @@ -48,16 +47,19 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic itemTemplate = scrollpanel.GetWidget("MAP_TEMPLATE"); EnumerateMaps(); } - + void EnumerateMaps() { scrollpanel.RemoveChildren(); - foreach (var kv in Game.modData.AvailableMaps.OrderBy(kv => kv.Value.Title).OrderBy(kv => kv.Value.PlayerCount)) + + var maps = Game.modData.AvailableMaps + .Where( kv => kv.Value.Selectable ) + .OrderBy( kv => kv.Value.PlayerCount ) + .ThenBy( kv => kv.Value.Title ); + + foreach (var kv in maps) { var m = kv.Value; - if (!m.Selectable) - continue; - var item = ScrollItemWidget.Setup(itemTemplate, () => m == map, () => map = m); item.GetWidget("TITLE").GetText = () => m.Title; item.GetWidget("PLAYERS").GetText = () => "{0}".F(m.PlayerCount); diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncMenuLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncMenuLogic.cs index 1b96b764ee..48460362ab 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncMenuLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncMenuLogic.cs @@ -143,10 +143,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic void StartSkirmishGame() { - var maps = Game.modData.AvailableMaps; - var last = Game.Settings.Server.Map; - var map = !string.IsNullOrEmpty(last) && maps.ContainsKey(last) ? last : - maps.FirstOrDefault(m => m.Value.Selectable).Key; + var map = CncWidgetUtils.ChooseInitialMap(Game.Settings.Server.Map); CncConnectingLogic.Connect(IPAddress.Loopback.ToString(), Game.CreateLocalServer(map), diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncServerCreationLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncServerCreationLogic.cs index 164903f29b..725bcc05b0 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncServerCreationLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncServerCreationLogic.cs @@ -47,9 +47,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic }); }; - if (string.IsNullOrEmpty(Game.Settings.Server.Map) || - !Game.modData.AvailableMaps.TryGetValue(Game.Settings.Server.Map, out map)) - map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Value; + map = Game.modData.AvailableMaps[ CncWidgetUtils.ChooseInitialMap(Game.Settings.Server.Map) ]; panel.GetWidget("MAP_PREVIEW").Map = () => map; panel.GetWidget("MAP_NAME").GetText = () => map.Title;