From 580b9014b3bcc834d87ea3ed857deaceb0e3f815 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 23 Jan 2011 20:32:26 +1300 Subject: [PATCH] Install map button (does not verify that maps are valid). --- OpenRA.Game/ModData.cs | 10 ++-- .../Widgets/Delegates/MapChooserDelegate.cs | 51 ++++++++++++++++--- mods/cnc/chrome/gamelobby.yaml | 8 +++ mods/ra/chrome/gamelobby.yaml | 8 +++ 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/OpenRA.Game/ModData.cs b/OpenRA.Game/ModData.cs index a745602c53..0820b0896b 100755 --- a/OpenRA.Game/ModData.cs +++ b/OpenRA.Game/ModData.cs @@ -21,7 +21,7 @@ namespace OpenRA { public readonly Manifest Manifest; public readonly ObjectCreator ObjectCreator; - public readonly Dictionary AvailableMaps; + public Dictionary AvailableMaps {get; private set;} public readonly WidgetLoader WidgetLoader; public ILoadScreen LoadScreen = null; public SheetBuilder SheetBuilder; @@ -37,10 +37,13 @@ namespace OpenRA LoadScreen = ObjectCreator.CreateObject(Manifest.LoadScreen); LoadScreen.Init(); LoadScreen.Display(); - - AvailableMaps = FindMaps( Manifest.Mods ); WidgetLoader = new WidgetLoader( this ); } + + public void ReloadMaps() + { + AvailableMaps = FindMaps( Manifest.Mods ); + } public void LoadInitialAssets() { @@ -50,6 +53,7 @@ namespace OpenRA foreach (var dir in Manifest.Folders) FileSystem.Mount(dir); + ReloadMaps(); Palette = new HardwarePalette(); ChromeProvider.Initialize( Manifest.Chrome ); SheetBuilder = new SheetBuilder( TextureChannel.Red ); diff --git a/OpenRA.Mods.RA/Widgets/Delegates/MapChooserDelegate.cs b/OpenRA.Mods.RA/Widgets/Delegates/MapChooserDelegate.cs index 37147f0455..e0c9d35b2b 100644 --- a/OpenRA.Mods.RA/Widgets/Delegates/MapChooserDelegate.cs +++ b/OpenRA.Mods.RA/Widgets/Delegates/MapChooserDelegate.cs @@ -13,13 +13,16 @@ using System.Linq; using OpenRA.FileFormats; using OpenRA.Network; using OpenRA.Widgets; +using System.IO; namespace OpenRA.Mods.RA.Widgets.Delegates { public class MapChooserDelegate : IWidgetDelegate { MapStub Map = null; - + Widget scrollpanel; + Widget itemTemplate; + [ObjectCreator.UseCtor] internal MapChooserDelegate( [ObjectCreator.Param( "widget" )] Widget bg, @@ -31,7 +34,6 @@ namespace OpenRA.Mods.RA.Widgets.Delegates else Map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Value; - var ml = bg.GetWidget("MAP_LIST"); bg.GetWidget("MAPCHOOSER_MAP_PREVIEW").Map = () => Map; bg.GetWidget("CURMAP_TITLE").GetText = () => Map.Title; bg.GetWidget("CURMAP_AUTHOR").GetText = () => Map.Author; @@ -41,20 +43,28 @@ namespace OpenRA.Mods.RA.Widgets.Delegates bg.GetWidget("CURMAP_THEATER").GetText = () => Rules.TileSets[Map.Tileset].Name; bg.GetWidget("CURMAP_PLAYERS").GetText = () => Map.PlayerCount.ToString(); - bg.GetWidget("BUTTON_OK").OnMouseUp = mi => + bg.GetWidget("BUTTON_OK").OnMouseUp = mi => { orderManager.IssueOrder(Order.Command("map " + Map.Uid)); Widget.CloseWindow(); return true; }; - bg.GetWidget("BUTTON_CANCEL").OnMouseUp = mi => + bg.GetWidget("BUTTON_CANCEL").OnMouseUp = mi => { Widget.CloseWindow(); return true; }; - - var itemTemplate = ml.GetWidget("MAP_TEMPLATE"); + + bg.GetWidget("BUTTON_INSTALL").OnMouseUp = mi => InstallMap(); + scrollpanel = bg.GetWidget("MAP_LIST"); + 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 map = kv.Value; @@ -69,8 +79,35 @@ namespace OpenRA.Mods.RA.Widgets.Delegates template.GetWidget("TITLE").GetText = () => map.Title; template.GetWidget("PLAYERS").GetText = () => "{0}".F(map.PlayerCount); template.GetWidget("TYPE").GetText = () => map.Type; - ml.AddChild(template); + scrollpanel.AddChild(template); } } + + bool InstallMap() + { + Game.Utilities.PromptFilepathAsync("Select MAIN.MIX on the CD", path => + { + if (!string.IsNullOrEmpty(path)) + Game.RunAfterTick(() => InstallMapInner(path)); + }); + return true; + } + + void InstallMapInner(string path) + { + var toPath = "{0}{1}maps{1}{2}{1}{3}" + .F(Game.SupportDir,Path.DirectorySeparatorChar, + Game.modData.Manifest.Mods[0], + Path.GetFileName(path)); + + // Create directory if required + var dir = Path.GetDirectoryName(toPath); + if (!Directory.Exists(dir)) + Directory.CreateDirectory(dir); + + File.Copy(path, toPath, true); + Game.modData.ReloadMaps(); + EnumerateMaps(); + } } } diff --git a/mods/cnc/chrome/gamelobby.yaml b/mods/cnc/chrome/gamelobby.yaml index 7cfe8f1270..1d20bf2fc8 100644 --- a/mods/cnc/chrome/gamelobby.yaml +++ b/mods/cnc/chrome/gamelobby.yaml @@ -626,3 +626,11 @@ Background@MAP_CHOOSER: Height:25 Text:Cancel Bold:True + Button@BUTTON_INSTALL: + Id:BUTTON_INSTALL + X:20 + Y:PARENT_BOTTOM-49 + Width:120 + Height:25 + Text:Install Map + Bold:True \ No newline at end of file diff --git a/mods/ra/chrome/gamelobby.yaml b/mods/ra/chrome/gamelobby.yaml index 5a044e7844..da500d7439 100644 --- a/mods/ra/chrome/gamelobby.yaml +++ b/mods/ra/chrome/gamelobby.yaml @@ -626,3 +626,11 @@ Background@MAP_CHOOSER: Height:25 Text:Cancel Bold:True + Button@BUTTON_INSTALL: + Id:BUTTON_INSTALL + X:20 + Y:PARENT_BOTTOM-49 + Width:120 + Height:25 + Text:Install Map + Bold:True