diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index 7c64cbf925..2aedd54815 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -154,10 +154,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic mapButton.IsDisabled = configurationDisabled; mapButton.OnClick = () => { - var onSelect = new Action(m => + var onSelect = new Action(uid => { - orderManager.IssueOrder(Order.Command("map " + m.Uid)); - Game.Settings.Server.Map = m.Uid; + orderManager.IssueOrder(Order.Command("map " + uid)); + Game.Settings.Server.Map = uid; Game.Settings.Save(); }); diff --git a/OpenRA.Mods.RA/Widgets/Logic/MapChooserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/MapChooserLogic.cs index 198e9b1db1..9e4b829bfc 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/MapChooserLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/MapChooserLogic.cs @@ -18,21 +18,21 @@ namespace OpenRA.Mods.RA.Widgets.Logic { public class MapChooserLogic { - Map map; + string selectedUid; // May be a subset of available maps if a mode filter is active - Dictionary visibleMaps; + List visibleMaps; ScrollPanelWidget scrollpanel; ScrollItemWidget itemTemplate; string gameMode; [ObjectCreator.UseCtor] - internal MapChooserLogic(Widget widget, string initialMap, Action onExit, Action onSelect) + internal MapChooserLogic(Widget widget, string initialMap, Action onExit, Action onSelect) { - map = Game.modData.MapCache[WidgetUtils.ChooseInitialMap(initialMap)].Map; + selectedUid = WidgetUtils.ChooseInitialMap(initialMap); - widget.Get("BUTTON_OK").OnClick = () => { Ui.CloseWindow(); onSelect(map); }; + widget.Get("BUTTON_OK").OnClick = () => { Ui.CloseWindow(); onSelect(selectedUid); }; widget.Get("BUTTON_CANCEL").OnClick = () => { Ui.CloseWindow(); onExit(); }; scrollpanel = widget.Get("MAP_LIST"); @@ -75,9 +75,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic { randomMapButton.OnClick = () => { - var kv = visibleMaps.Random(Game.CosmeticRandom); - map = kv.Value; - scrollpanel.ScrollToItem(kv.Key); + var uid = visibleMaps.Random(Game.CosmeticRandom); + selectedUid = uid; + scrollpanel.ScrollToItem(uid); }; randomMapButton.IsDisabled = () => visibleMaps == null || visibleMaps.Count == 0; } @@ -85,25 +85,23 @@ namespace OpenRA.Mods.RA.Widgets.Logic EnumerateMaps(onSelect); } - void EnumerateMaps(Action onSelect) + void EnumerateMaps(Action onSelect) { var maps = Game.modData.MapCache .Where(m => m.Status == MapStatus.Available && m.Map.Selectable) - .ToDictionary(m => m.Uid, m => m.Map) - .Where(kv => kv.Value.Type == gameMode || gameMode == null) - .OrderBy(kv => kv.Value.PlayerCount) - .ThenBy(kv => kv.Value.Title); + .Where(m => m.Type == gameMode || gameMode == null) + .OrderBy(m => m.PlayerCount) + .ThenBy(m => m.Title); scrollpanel.RemoveChildren(); - foreach (var kv in maps) + foreach (var loop in maps) { - var m = kv.Value; - var item = ScrollItemWidget.Setup(kv.Key, itemTemplate, () => m == map, () => map = m, () => { Ui.CloseWindow(); onSelect(m); }); + var preview = loop; + var item = ScrollItemWidget.Setup(preview.Uid, itemTemplate, () => selectedUid == preview.Uid, () => selectedUid = preview.Uid, () => { Ui.CloseWindow(); onSelect(preview.Uid); }); var titleLabel = item.Get("TITLE"); - titleLabel.GetText = () => m.Title; + titleLabel.GetText = () => preview.Title; - var preview = Game.modData.MapCache[m.Uid]; var previewWidget = item.Get("PREVIEW"); previewWidget.IgnoreMouseOver = true; previewWidget.IgnoreMouseInput = true; @@ -116,17 +114,17 @@ namespace OpenRA.Mods.RA.Widgets.Logic var detailsWidget = item.GetOrNull("DETAILS"); if (detailsWidget != null) - detailsWidget.GetText = () => "{0} ({1} players)".F(m.Type, m.PlayerCount); + detailsWidget.GetText = () => "{0} ({1} players)".F(preview.Type, preview.PlayerCount); var authorWidget = item.GetOrNull("AUTHOR"); if (authorWidget != null) - authorWidget.GetText = () => "Created by {0}".F(m.Author); + authorWidget.GetText = () => "Created by {0}".F(preview.Author); var sizeWidget = item.GetOrNull("SIZE"); if (sizeWidget != null) { - var size = m.Bounds.Width + "x" + m.Bounds.Height; - var numberPlayableCells = m.Bounds.Width * m.Bounds.Height; + var size = preview.Bounds.Width + "x" + preview.Bounds.Height; + var numberPlayableCells = preview.Bounds.Width * preview.Bounds.Height; if (numberPlayableCells >= 120 * 120) size += " (Huge)"; else if (numberPlayableCells >= 90 * 90) size += " (Large)"; else if (numberPlayableCells >= 60 * 60) size += " (Medium)"; @@ -137,9 +135,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic scrollpanel.AddChild(item); } - visibleMaps = maps.ToDictionary(kv => kv.Key, kv => kv.Value); - if (visibleMaps.ContainsValue(map)) - scrollpanel.ScrollToItem(visibleMaps.First(m => m.Value == map).Key); + visibleMaps = maps.Select(m => m.Uid).ToList(); + if (visibleMaps.Contains(selectedUid)) + scrollpanel.ScrollToItem(selectedUid); } } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/ServerCreationLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ServerCreationLogic.cs index c4d22eaebf..f693929bb6 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/ServerCreationLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/ServerCreationLogic.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic { { "initialMap", preview.Uid }, { "onExit", () => {} }, - { "onSelect", (Action)(m => preview = Game.modData.MapCache[m.Uid]) } + { "onSelect", (Action)(uid => preview = Game.modData.MapCache[uid]) } }); };