From 863814105b69c78db3e1c17aefff9c499bee2200 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Fri, 4 Sep 2015 13:19:45 +0300 Subject: [PATCH 01/14] Move D2k tilesets to the root asset directory --- mods/d2k/mod.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 729e9a911b..d72d9ab63f 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -16,7 +16,6 @@ Folders: ~^Content/d2k/GAMESFX ~^Content/d2k/Movies ~^Content/d2k/Music - ~^Content/d2k/Tilesets MapFolders: ./mods/d2k/maps: System @@ -133,8 +132,7 @@ ContentInstaller: PackageToExtractFromCD: setup/setup.z OverwriteFiles: False ExtractFilesFromCD: - .: SOUND.RS, DATA.R8, MOUSE.R8 - Tilesets: BLOXBASE.R8, BLOXBAT.R8, BLOXBGBS.R8, BLOXICE.R8, BLOXTREE.R8, BLOXWAST.R8 + .: SOUND.RS, DATA.R8, MOUSE.R8, BLOXBASE.R8, BLOXBAT.R8, BLOXBGBS.R8, BLOXICE.R8, BLOXTREE.R8, BLOXWAST.R8 GAMESFX: A_ECONF1.AUD, A_ECONF2.AUD, A_ECONF3.AUD, A_ESEL1.AUD, A_ESEL2.AUD, A_ESEL3.AUD, A_FCONF1.AUD, A_FCONF2.AUD, A_FCONF3.AUD,A_FCONF4.AUD, A_FSEL1.AUD, A_FSEL2.AUD, A_FSEL3.AUD, A_FSEL4.AUD, AI_1MIN.AUD, AI_2MIN.AUD, AI_3MIN.AUD, AI_4MIN.AUD, AI_5MIN.AUD, AI_ABORT.AUD, AI_ATACK.AUD, AI_BDRDY.AUD, AI_BLOST.AUD, AI_BUILD.AUD, AI_CANCL.AUD, AI_CAPT.AUD, A_ICONF1.AUD, A_ICONF2.AUD, A_ICONF3.AUD, AI_DHRDY.AUD, AI_DPLOY.AUD, AI_ENEMY.AUD, AI_GANEW.AUD, AI_GLOAD.AUD, AI_GSAVE.AUD, AI_GUARD.AUD, AI_HATTK.AUD, AI_HOLD.AUD, AI_LAUNC.AUD, AI_MAP1A.AUD, AI_MAP1B.AUD, AI_MAP1C.AUD, AI_MAP2A.AUD, AI_MAP2B.AUD, AI_MAP2C.AUD, AI_MAP3A.AUD, AI_MAP4A.AUD, AI_MAP5A.AUD, AI_MAP6A.AUD, AI_MAP7A.AUD, AI_MAP8A.AUD, AI_MAP9A.AUD, AI_MEND.AUD, AI_MFAIL.AUD, AI_MONEY.AUD, AI_MWIN.AUD, AI_NEWOP.AUD, AI_NROOM.AUD, AI_ORDER.AUD, AI_PLACE.AUD, AI_POWER.AUD, AI_PREP.AUD, AI_PRMRY.AUD, AI_REINF.AUD, AI_RUN.AUD, A_ISEL1.AUD, A_ISEL2.AUD, A_ISEL3.AUD, AI_SELL.AUD, AI_SILOS.AUD, AI_SPORT.AUD, AI_TRAIN.AUD, AI_ULOST.AUD, AI_UNRDY.AUD, AI_UPGOP.AUD, AI_UPGRD.AUD, AI_WATTK.AUD, AI_WSIGN.AUD, A_VCONF1.AUD, A_VCONF2.AUD, A_VCONF3.AUD, A_VSEL1.AUD, A_VSEL2.AUD, A_VSEL3.AUD, G_SCONF1.AUD, G_SCONF2.AUD, G_SCONF3.AUD, G_SSEL1.AUD, G_SSEL2.AUD, G_SSEL3.AUD, H_ECONF1.AUD, H_ECONF2.AUD, H_ECONF3.AUD, H_ESEL1.AUD, H_ESEL2.AUD, H_ESEL3.AUD, HI_1MIN.AUD, HI_2MIN.AUD, HI_3MIN.AUD, HI_4MIN.AUD, HI_5MIN.AUD, HI_ABORT.AUD, HI_ATACK.AUD, HI_BDRDY.AUD, HI_BLOST.AUD, HI_BUILD.AUD, HI_CANCL.AUD, HI_CAPT.AUD, H_ICONF1.AUD, H_ICONF2.AUD, H_ICONF3.AUD, HI_DHRDY.AUD, HI_DPLOY.AUD, HI_ENEMY.AUD, HI_GANEW.AUD,HI_GLOAD.AUD, HI_GSAVE.AUD, HI_GUARD.AUD, HI_HATTK.AUD, HI_HOLD.AUD, HI_LAUNC.AUD, HI_MAP1A.AUD, HI_MAP1B.AUD, HI_MAP1C.AUD, HI_MAP2A.AUD, HI_MAP2B.AUD, HI_MAP2C.AUD, HI_MAP3A.AUD, HI_MAP3B.AUD, HI_MAP4A.AUD, HI_MAP4B.AUD, HI_MAP5A.AUD, HI_MAP6A.AUD, HI_MAP6B.AUD, HI_MAP7A.AUD, HI_MAP9A.AUD, HI_MAP9.AUD, HI_MEND.AUD, HI_MFAIL.AUD, HI_MONEY.AUD, HI_MWIN.AUD, HI_NEWOP.AUD, HI_NROOM.AUD, HI_ORDER.AUD, HI_PLACE.AUD, HI_POWER.AUD, HI_PREP.AUD, HI_PRMRY.AUD, HI_REINF.AUD, HI_RUN.AUD, H_ISEL1.AUD, H_ISEL2.AUD, H_ISEL3.AUD, HI_SELL.AUD, HI_SILOS.AUD,HI_SPORT.AUD, HI_TRAIN.AUD, HI_ULOST.AUD, HI_UNRDY.AUD, HI_UPGOP.AUD, HI_UPGRD.AUD, HI_WATTK.AUD, HI_WSIGN.AUD, H_VCONF1.AUD, H_VCONF2.AUD, H_VCONF3.AUD, H_VSEL1.AUD, H_VSEL2.AUD, H_VSEL3.AUD, O_ECONF1.AUD, O_ECONF2.AUD, O_ECONF3.AUD, O_ESEL1.AUD, O_ESEL2.AUD, O_ESEL3.AUD, OI_1MIN.AUD, OI_2MIN.AUD, OI_3MIN.AUD, OI_4MIN.AUD, OI_5MIN.AUD, OI_ABORT.AUD, OI_ATACK.AUD, OI_BDRDY.AUD, OI_BLOST.AUD, OI_BUILD.AUD, OI_CANCL.AUD, OI_CAPT.AUD, O_ICONF1.AUD, O_ICONF2.AUD, O_ICONF3.AUD, OI_DHRDY.AUD, OI_DPLOY.AUD, OI_ENEMY.AUD, OI_GANEW.AUD, OI_GLOAD.AUD, OI_GSAVE.AUD, OI_GUARD.AUD, OI_HATTK.AUD, OI_HOLD.AUD, OI_LAUNC.AUD, OI_MAP1A.AUD, OI_MAP1B.AUD, OI_MAP1C.AUD, OI_MAP2A.AUD, OI_MAP2B.AUD, OI_MAP2C.AUD, OI_MAP3A.AUD, OI_MAP4A.AUD, OI_MAP5A.AUD, OI_MAP6A.AUD, OI_MAP7A.AUD, OI_MAP8A.AUD, OI_MAP9A.AUD, OI_MEND.AUD, OI_MFAIL.AUD, OI_MONEY.AUD, OI_MWIN.AUD, OI_NEWOP.AUD, OI_NROOM.AUD, OI_ORDER.AUD, OI_PLACE.AUD, OI_POWER.AUD, OI_PREP.AUD, OI_PRMRY.AUD, OI_REINF.AUD, OI_RUN.AUD, O_ISEL1.AUD, O_ISEL2.AUD, O_ISEL3.AUD, OI_SELL.AUD, OI_SILOS.AUD, OI_SPORT.AUD, OI_TRAIN.AUD, OI_ULOST.AUD, OI_UNRDY.AUD, OI_UPGOP.AUD, OI_UPGRD.AUD, OI_WATTK.AUD, OI_WSIGN.AUD, O_SCONF1.AUD, O_SCONF2.AUD, O_SCONF3.AUD, O_SSEL1.AUD, O_SSEL2.AUD, O_SSEL3.AUD, O_VCONF1.AUD, O_VCONF2.AUD, O_VCONF3.AUD, O_VSEL1.AUD, O_VSEL2.AUD, O_VSEL3.AUD CopyFilesFromCD: Movies: movies/a_br01_e.vqa, movies/a_br02_e.vqa, movies/a_br03_e.vqa, movies/a_br04_e.vqa, movies/a_br05_e.vqa, movies/a_br06_e.vqa, movies/a_br07_e.vqa, movies/a_br08_e.vqa, movies/a_br09_e.vqa, movies/a_finl_e.vqa, movies/a_lose_e.vqa, movies/a_mntg_e.vqa, movies/h_br01_e.vqa, movies/h_br02_e.vqa, movies/h_br03_e.vqa, movies/h_br04_e.vqa, movies/h_br05_e.vqa, movies/h_br06_e.vqa, movies/h_br07_e.vqa, movies/h_br08_e.vqa, movies/h_br09_e.vqa, movies/h_finl_e.vqa, movies/h_lose_e.vqa, movies/h_mntg_e.vqa, movies/o_br01_e.vqa, movies/o_br02_e.vqa, movies/o_br03_e.vqa, movies/o_br04_e.vqa, movies/o_br05_e.vqa, movies/o_br06_e.vqa, movies/o_br07_e.vqa, movies/o_br08_e.vqa, movies/o_br09_e.vqa, movies/o_finl_e.vqa, movies/o_lose_e.vqa, movies/o_mntg_e.vqa, movies/g_int1_e.vqa, movies/g_int2_e.vqa, movies/g_maps_e.vqa, movies/g_pln2_e.vqa, movies/g_plnt_e.vqa, movies/t_titl_e.vqa From 1e57f13ecd6924bd6c71f703325995a0575d0546 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 8 Sep 2015 20:17:27 +0300 Subject: [PATCH 02/14] Fix ModChooser UI --- .../LoadScreens/ModChooserLoadScreen.cs | 3 ++- mods/modchooser/modchooser.yaml | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/OpenRA.Mods.Common/LoadScreens/ModChooserLoadScreen.cs b/OpenRA.Mods.Common/LoadScreens/ModChooserLoadScreen.cs index 563d9624f0..690dc0d7da 100644 --- a/OpenRA.Mods.Common/LoadScreens/ModChooserLoadScreen.cs +++ b/OpenRA.Mods.Common/LoadScreens/ModChooserLoadScreen.cs @@ -41,7 +41,8 @@ namespace OpenRA.Mods.Common.LoadScreens public void StartGame(Arguments args) { - Ui.LoadWidget("MODCHOOSER", Ui.Root, new WidgetArgs()); + Ui.LoadWidget("MODCHOOSER_BACKGROUND", Ui.Root, new WidgetArgs()); + Ui.OpenWindow("MODCHOOSER_DIALOG"); } public void Dispose() diff --git a/mods/modchooser/modchooser.yaml b/mods/modchooser/modchooser.yaml index e42672deab..a4d83bc54e 100644 --- a/mods/modchooser/modchooser.yaml +++ b/mods/modchooser/modchooser.yaml @@ -1,8 +1,10 @@ -Background@MODCHOOSER: - Logic:ModBrowserLogic +Background@MODCHOOSER_BACKGROUND: Background: background Width:WINDOW_RIGHT Height:WINDOW_BOTTOM + +Background@MODCHOOSER_DIALOG: + Logic:ModBrowserLogic Children: Container: X:(WINDOW_RIGHT - WIDTH)/2 @@ -10,7 +12,7 @@ Background@MODCHOOSER: Width:750 Height:550-4-32 Children: - Background@bg: + Background@DIALOG_BACKGROUND: Y:69 Width:PARENT_RIGHT Height:PARENT_BOTTOM - 69 @@ -123,16 +125,16 @@ Background@MODCHOOSER: X:PARENT_RIGHT - 53 - WIDTH - 170 Y:PARENT_BOTTOM - 25 - HEIGHT Width:140 - Height:35 + Height:32 Text:Load Mod Button@QUIT_BUTTON: Background:button-highlighted X:PARENT_RIGHT - 53 - WIDTH Y:PARENT_BOTTOM - 25 - HEIGHT Width:140 - Height:35 + Height:32 Text:Quit - Background@header: + Background@DIALOG_HEADER: Width:PARENT_RIGHT Height:72 Background:panel-header From 19388fd7738eae96f4ff59c1cb3638d7ea808bcb Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Wed, 9 Sep 2015 13:32:56 +0300 Subject: [PATCH 03/14] Add ButtonBaseLine metric --- OpenRA.Mods.Common/Widgets/ButtonWidget.cs | 2 +- mods/cnc/metrics.yaml | 1 + mods/d2k/metrics.yaml | 1 + mods/modchooser/metrics.yaml | 1 + mods/ra/metrics.yaml | 1 + mods/ts/metrics.yaml | 1 + 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.Common/Widgets/ButtonWidget.cs b/OpenRA.Mods.Common/Widgets/ButtonWidget.cs index 5e0803cbe5..1a05241fc2 100644 --- a/OpenRA.Mods.Common/Widgets/ButtonWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ButtonWidget.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.Common.Widgets public string Background = "button"; public bool Depressed = false; public int VisualHeight = ChromeMetrics.Get("ButtonDepth"); - public int BaseLine = 0; + public int BaseLine = ChromeMetrics.Get("ButtonBaseLine"); public string Font = ChromeMetrics.Get("ButtonFont"); public Color TextColor = ChromeMetrics.Get("ButtonTextColor"); public Color TextColorDisabled = ChromeMetrics.Get("ButtonTextColorDisabled"); diff --git a/mods/cnc/metrics.yaml b/mods/cnc/metrics.yaml index 64dcaa7846..0e682d5684 100644 --- a/mods/cnc/metrics.yaml +++ b/mods/cnc/metrics.yaml @@ -7,6 +7,7 @@ Metrics: ButtonTextColorDisabled: 128,128,128 ButtonTextContrast: false ButtonTextContrastColor: 0,0,0 + ButtonBaseLine: 0 CheckboxPressedState: true HotkeyFont: Regular HotkeyColor: 255,255,255 diff --git a/mods/d2k/metrics.yaml b/mods/d2k/metrics.yaml index 895fd06d63..4d0f23b773 100644 --- a/mods/d2k/metrics.yaml +++ b/mods/d2k/metrics.yaml @@ -7,6 +7,7 @@ Metrics: ButtonTextColorDisabled: 128,128,128 ButtonTextContrast: false ButtonTextContrastColor: 0,0,0 + ButtonBaseLine: 0 CheckboxPressedState: false HotkeyFont: Regular HotkeyColor: 255,255,255 diff --git a/mods/modchooser/metrics.yaml b/mods/modchooser/metrics.yaml index a4f6800caa..03f9622401 100644 --- a/mods/modchooser/metrics.yaml +++ b/mods/modchooser/metrics.yaml @@ -7,6 +7,7 @@ Metrics: ButtonTextColorDisabled: 128,128,128 ButtonTextContrast: false ButtonTextContrastColor: 0,0,0 + ButtonBaseLine: 0 CheckboxPressedState: true HotkeyFont: Regular HotkeyColor: 255,255,255 diff --git a/mods/ra/metrics.yaml b/mods/ra/metrics.yaml index cf1c961e82..00e3fbb107 100644 --- a/mods/ra/metrics.yaml +++ b/mods/ra/metrics.yaml @@ -7,6 +7,7 @@ Metrics: ButtonTextColorDisabled: 128,128,128 ButtonTextContrast: false ButtonTextContrastColor: 0,0,0 + ButtonBaseLine: 0 CheckboxPressedState: false HotkeyFont: Regular HotkeyColor: 255,255,255 diff --git a/mods/ts/metrics.yaml b/mods/ts/metrics.yaml index c079cfcac9..e8939a7ad4 100644 --- a/mods/ts/metrics.yaml +++ b/mods/ts/metrics.yaml @@ -7,6 +7,7 @@ Metrics: ButtonTextColorDisabled: 128,128,128 ButtonTextContrast: false ButtonTextContrastColor: 0,0,0 + ButtonBaseLine: 0 CheckboxPressedState: false HotkeyFont: Regular HotkeyColor: 255,255,255 From 82bf66a9be2a308d5c8f0abaa4204b23e7131223 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Wed, 9 Sep 2015 13:40:43 +0300 Subject: [PATCH 04/14] Generalise progress bars --- .../Widgets/ProgressBarWidget.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/ProgressBarWidget.cs b/OpenRA.Mods.Common/Widgets/ProgressBarWidget.cs index dad4f024c5..8c2558b9ac 100644 --- a/OpenRA.Mods.Common/Widgets/ProgressBarWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProgressBarWidget.cs @@ -10,12 +10,17 @@ using System; using System.Drawing; +using OpenRA.Graphics; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets { public class ProgressBarWidget : Widget { + public string Background = "progressbar-bg"; + public string Bar = "progressbar-thumb"; + public Size BarMargin = new Size(2, 2); + public int Percentage = 0; public bool Indeterminate = false; @@ -44,14 +49,16 @@ namespace OpenRA.Mods.Common.Widgets { var rb = RenderBounds; var percentage = GetPercentage(); - WidgetUtils.DrawPanel("progressbar-bg", rb); + WidgetUtils.DrawPanel(Background, rb); - var barRect = wasIndeterminate ? - new Rectangle(rb.X + 2 + (int)(0.75 * offset * (rb.Width - 4)), rb.Y + 2, (rb.Width - 4) / 4, rb.Height - 4) : - new Rectangle(rb.X + 2, rb.Y + 2, percentage * (rb.Width - 4) / 100, rb.Height - 4); + var minBarWidth = (int)(ChromeProvider.GetImage(Bar, "border-l").Size.X + ChromeProvider.GetImage(Bar, "border-r").Size.X); + var maxBarWidth = rb.Width - BarMargin.Width * 2; + var barWidth = wasIndeterminate ? maxBarWidth / 4 : percentage * maxBarWidth / 100; + barWidth = Math.Max(barWidth, minBarWidth); - if (barRect.Width > 0) - WidgetUtils.DrawPanel("progressbar-thumb", barRect); + var barOffset = wasIndeterminate ? (int)(0.75 * offset * maxBarWidth) : 0; + var barRect = new Rectangle(rb.X + BarMargin.Width + barOffset, rb.Y + BarMargin.Height, barWidth, rb.Height - 2 * BarMargin.Height); + WidgetUtils.DrawPanel(Bar, barRect); } bool wasIndeterminate; From 4314fae77ad41809d02bca201d84433cabdf8499 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 30 Aug 2015 17:05:10 +0300 Subject: [PATCH 05/14] Move ContentInstaller to OpenRA.Game from Mods.Common --- OpenRA.Game/ContentInstaller.cs | 40 ++++++++++++++++++++++++++++++ OpenRA.Game/OpenRA.Game.csproj | 1 + OpenRA.Mods.Common/InstallUtils.cs | 25 ------------------- 3 files changed, 41 insertions(+), 25 deletions(-) create mode 100644 OpenRA.Game/ContentInstaller.cs diff --git a/OpenRA.Game/ContentInstaller.cs b/OpenRA.Game/ContentInstaller.cs new file mode 100644 index 0000000000..58c97afd83 --- /dev/null +++ b/OpenRA.Game/ContentInstaller.cs @@ -0,0 +1,40 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; + +namespace OpenRA +{ + // Referenced from ModMetadata, so needs to be in OpenRA.Game :( + public class ContentInstaller : IGlobalModData + { + public readonly string MenuWidget = null; + public readonly string MusicMenuWidget = null; + public readonly string BackgroundWidget = null; + public readonly string[] TestFiles = { }; + public readonly string[] DiskTestFiles = { }; + public readonly string PackageToExtractFromCD = null; + public readonly bool OverwriteFiles = true; + + public readonly Dictionary CopyFilesFromCD = new Dictionary(); + public readonly Dictionary ExtractFilesFromCD = new Dictionary(); + + public readonly string PackageMirrorList = null; + + public readonly string MusicPackageMirrorList = null; + public readonly int ShippedSoundtracks = 0; + + /// InstallShield .CAB file IDs, used to extract Mod-specific files. + public readonly HashSet InstallShieldCABFileIds = new HashSet(); + + /// InstallShield .CAB file IDs, used to extract Mod-specific archives and extract contents of ExtractFilesFromCD. + public readonly HashSet InstallShieldCABFilePackageIds = new HashSet(); + } +} diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index e8de19d10a..30dbdd1844 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -95,6 +95,7 @@ + diff --git a/OpenRA.Mods.Common/InstallUtils.cs b/OpenRA.Mods.Common/InstallUtils.cs index 4520561375..decbbeab8d 100644 --- a/OpenRA.Mods.Common/InstallUtils.cs +++ b/OpenRA.Mods.Common/InstallUtils.cs @@ -18,31 +18,6 @@ using OpenRA.FileSystem; namespace OpenRA.Mods.Common { - public class ContentInstaller : IGlobalModData - { - public readonly string MenuWidget = null; - public readonly string MusicMenuWidget = null; - public readonly string BackgroundWidget = null; - public readonly HashSet TestFiles = new HashSet(); - public readonly HashSet DiskTestFiles = new HashSet(); - public readonly string PackageToExtractFromCD = null; - public readonly bool OverwriteFiles = true; - - public readonly Dictionary CopyFilesFromCD = new Dictionary(); - public readonly Dictionary ExtractFilesFromCD = new Dictionary(); - - public readonly string PackageMirrorList = null; - - public readonly string MusicPackageMirrorList = null; - public readonly int ShippedSoundtracks = 0; - - /// InstallShield .cab File Ids, used to extract Mod specific files. - public readonly HashSet InstallShieldCABFileIds = new HashSet(); - - /// InstallShield .cab File Ids, used to extract Mod specific archives and extract contents of ExtractFilesFromCD. - public readonly HashSet InstallShieldCABFilePackageIds = new HashSet(); - } - public static class InstallUtils { static IEnumerable GetEntries(this ZipInputStream z) From d472805fc68aa8601efac43b1534d6f89a04749f Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Mon, 31 Aug 2015 17:25:18 +0300 Subject: [PATCH 06/14] Add mod asset checks to ModBrowserLogic --- OpenRA.Game/ModMetadata.cs | 33 ++++++++---- .../Widgets/Logic/ModBrowserLogic.cs | 52 ++++++++++++++----- mods/cnc/mod.yaml | 2 - mods/d2k/mod.yaml | 1 - mods/modchooser/mod.yaml | 1 - mods/ra/mod.yaml | 1 - mods/ts/mod.yaml | 1 - 7 files changed, 63 insertions(+), 28 deletions(-) diff --git a/OpenRA.Game/ModMetadata.cs b/OpenRA.Game/ModMetadata.cs index a3430d319a..72222a6f21 100644 --- a/OpenRA.Game/ModMetadata.cs +++ b/OpenRA.Game/ModMetadata.cs @@ -8,6 +8,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -24,6 +25,7 @@ namespace OpenRA public string Version; public string Author; public bool Hidden; + public ContentInstaller Content; static Dictionary ValidateMods() { @@ -34,19 +36,30 @@ namespace OpenRA var ret = new Dictionary(); foreach (var m in mods) { - var yamlPath = Platform.ResolvePath(".", "mods", m, "mod.yaml"); - if (!File.Exists(yamlPath)) - continue; + try + { + var yamlPath = Platform.ResolvePath(".", "mods", m, "mod.yaml"); + if (!File.Exists(yamlPath)) + continue; - var yaml = new MiniYaml(null, MiniYaml.FromFile(yamlPath)); - var nd = yaml.ToDictionary(); - if (!nd.ContainsKey("Metadata")) - continue; + var yaml = new MiniYaml(null, MiniYaml.FromFile(yamlPath)); + var nd = yaml.ToDictionary(); + if (!nd.ContainsKey("Metadata")) + continue; - var mod = FieldLoader.Load(nd["Metadata"]); - mod.Id = m; + var mod = FieldLoader.Load(nd["Metadata"]); + mod.Id = m; - ret.Add(m, mod); + if (nd.ContainsKey("ContentInstaller")) + mod.Content = FieldLoader.Load(nd["ContentInstaller"]); + + ret.Add(m, mod); + } + catch (Exception ex) + { + Console.WriteLine("An exception occured when trying to load ModMetadata for `{0}`:".F(m)); + Console.WriteLine(ex.Message); + } } return ret; diff --git a/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs index 7672102c1c..ca5af451db 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs @@ -13,7 +13,9 @@ using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; +using OpenRA.FileSystem; using OpenRA.Graphics; +using OpenRA.Primitives; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic @@ -25,6 +27,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic readonly ModMetadata[] allMods; readonly Dictionary previews = new Dictionary(); readonly Dictionary logos = new Dictionary(); + readonly Cache modInstallStatus; + readonly Widget modChooserPanel; + readonly ButtonWidget loadButton; readonly SheetBuilder sheetBuilder; ModMetadata selectedMod; string selectedAuthor; @@ -34,30 +39,30 @@ namespace OpenRA.Mods.Common.Widgets.Logic [ObjectCreator.UseCtor] public ModBrowserLogic(Widget widget) { - var panel = widget; - var loadButton = panel.Get("LOAD_BUTTON"); + modChooserPanel = widget; + loadButton = modChooserPanel.Get("LOAD_BUTTON"); loadButton.OnClick = () => LoadMod(selectedMod); loadButton.IsDisabled = () => selectedMod.Id == Game.ModData.Manifest.Mod.Id; - panel.Get("QUIT_BUTTON").OnClick = Game.Exit; + modChooserPanel.Get("QUIT_BUTTON").OnClick = Game.Exit; - modList = panel.Get("MOD_LIST"); + modList = modChooserPanel.Get("MOD_LIST"); modTemplate = modList.Get("MOD_TEMPLATE"); - panel.Get("MOD_DESC").GetText = () => selectedDescription; - panel.Get("MOD_TITLE").GetText = () => selectedMod.Title; - panel.Get("MOD_AUTHOR").GetText = () => selectedAuthor; - panel.Get("MOD_VERSION").GetText = () => selectedMod.Version; + modChooserPanel.Get("MOD_DESC").GetText = () => selectedDescription; + modChooserPanel.Get("MOD_TITLE").GetText = () => selectedMod.Title; + modChooserPanel.Get("MOD_AUTHOR").GetText = () => selectedAuthor; + modChooserPanel.Get("MOD_VERSION").GetText = () => selectedMod.Version; - var prevMod = panel.Get("PREV_MOD"); + var prevMod = modChooserPanel.Get("PREV_MOD"); prevMod.OnClick = () => { modOffset -= 1; RebuildModList(); }; prevMod.IsVisible = () => modOffset > 0; - var nextMod = panel.Get("NEXT_MOD"); + var nextMod = modChooserPanel.Get("NEXT_MOD"); nextMod.OnClick = () => { modOffset += 1; RebuildModList(); }; nextMod.IsVisible = () => modOffset + 5 < allMods.Length; - panel.Get("MOD_PREVIEW").GetSprite = () => + modChooserPanel.Get("MOD_PREVIEW").GetSprite = () => { Sprite ret = null; previews.TryGetValue(selectedMod.Id, out ret); @@ -89,9 +94,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic catch (Exception) { } } + modInstallStatus = new Cache(IsModInstalled); + ModMetadata initialMod = null; ModMetadata.AllMods.TryGetValue(Game.Settings.Game.PreviousMod, out initialMod); - SelectMod(initialMod ?? ModMetadata.AllMods["ra"]); + SelectMod(initialMod != null && initialMod.Id != "modchooser" ? initialMod : ModMetadata.AllMods["ra"]); RebuildModList(); } @@ -113,6 +120,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic break; var mod = allMods[j]; + var item = modTemplate.Clone() as ButtonWidget; item.Bounds = new Rectangle(outerMargin + i * stride, 0, width, height); item.IsHighlighted = () => selectedMod == mod; @@ -148,10 +156,25 @@ namespace OpenRA.Mods.Common.Widgets.Logic var selectedIndex = Array.IndexOf(allMods, mod); if (selectedIndex - modOffset > 4) modOffset = selectedIndex - 4; + + loadButton.Text = modInstallStatus[mod] ? "Load Mod" : "Install Assets"; } void LoadMod(ModMetadata mod) { + if (!modInstallStatus[mod]) + { + var widgetArgs = new WidgetArgs + { + { "continueLoading", () => + Game.RunAfterTick(() => Game.InitializeMod(Game.Settings.Game.Mod, new Arguments())) } + }; + + Ui.OpenWindow("INSTALL_PANEL", widgetArgs); + + return; + } + Game.RunAfterTick(() => { Ui.CloseWindow(); @@ -159,5 +182,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic Game.InitializeMod(mod.Id, null); }); } + + static bool IsModInstalled(ModMetadata mod) + { + return mod.Content.TestFiles.All(file => File.Exists(Path.GetFullPath(Platform.ResolvePath(file)))); + } } } diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index a19b2c892a..11a2f510a3 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -140,8 +140,6 @@ LoadScreen: CncLoadScreen ContentInstaller: TestFiles: conquer.mix, desert.mix, sounds.mix, speech.mix, temperat.mix, tempicnh.mix, winter.mix - BackgroundWidget: INSTALL_BACKGROUND - MenuWidget: INSTALL_PANEL MusicMenuWidget: INSTALL_MUSIC_PANEL FilesToCopy: CONQUER.MIX, DESERT.MIX, SCORES.MIX, SOUNDS.MIX, TEMPERAT.MIX, WINTER.MIX FilesToExtract: speech.mix, tempicnh.mix, transit.mix diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index d72d9ab63f..a9aabe792d 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -123,7 +123,6 @@ LoadScreen: LogoStripeLoadScreen Text: Filling Crates..., Breeding Sandworms..., Fuelling carryalls..., Deploying harvesters..., Preparing 'thopters..., Summoning mentats... ContentInstaller: - MenuWidget: INSTALL_PANEL MusicMenuWidget: INSTALL_MUSIC_PANEL # TODO: check if DATA.R8 is at 1.03 patch level with 4840 frames TestFiles: BLOXBASE.R8, BLOXBAT.R8, BLOXBGBS.R8, BLOXICE.R8, BLOXTREE.R8, BLOXWAST.R8, DATA.R8, SOUND.RS diff --git a/mods/modchooser/mod.yaml b/mods/modchooser/mod.yaml index 1811c45686..dee26ab27f 100644 --- a/mods/modchooser/mod.yaml +++ b/mods/modchooser/mod.yaml @@ -8,7 +8,6 @@ Folders: . ./mods/modchooser - Cursors: ./mods/modchooser/cursors.yaml diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 0c387cb8cc..742cc47016 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -141,7 +141,6 @@ LoadScreen: LogoStripeLoadScreen Text: Filling Crates..., Charging Capacitors..., Reticulating Splines..., Planting Trees..., Building Bridges..., Aging Empires..., Compiling EVA..., Constructing Pylons..., Activating Skynet..., Splitting Atoms... ContentInstaller: - MenuWidget: INSTALL_PANEL MusicMenuWidget: INSTALL_MUSIC_PANEL TestFiles: allies.mix, conquer.mix, interior.mix, redalert.mix, russian.mix, snow.mix, sounds.mix, temperat.mix PackageMirrorList: http://www.openra.net/packages/ra-mirrors.txt diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 352ad2e585..18f85c941c 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -189,7 +189,6 @@ LoadScreen: LogoStripeLoadScreen Text: Updating EVA installation..., Changing perspective... ContentInstaller: - MenuWidget: INSTALL_PANEL MusicMenuWidget: INSTALL_MUSIC_PANEL TestFiles: cache.mix, conquer.mix, isosnow.mix, isotemp.mix, local.mix, sidec01.mix, sidec02.mix, sno.mix, snow.mix, sounds.mix, speech01.mix, tem.mix, temperat.mix PackageMirrorList: http://www.openra.net/packages/ts-mirrors.txt From fbfb2cfda12b3fa8d7aa47e7b82df07c4c92b120 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Thu, 3 Sep 2015 23:29:09 +0300 Subject: [PATCH 07/14] Remove asset handling from BlankLoadScreen --- OpenRA.Game/ContentInstaller.cs | 3 --- .../LoadScreens/BlankLoadScreen.cs | 23 ++++--------------- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/OpenRA.Game/ContentInstaller.cs b/OpenRA.Game/ContentInstaller.cs index 58c97afd83..49763093d2 100644 --- a/OpenRA.Game/ContentInstaller.cs +++ b/OpenRA.Game/ContentInstaller.cs @@ -15,9 +15,6 @@ namespace OpenRA // Referenced from ModMetadata, so needs to be in OpenRA.Game :( public class ContentInstaller : IGlobalModData { - public readonly string MenuWidget = null; - public readonly string MusicMenuWidget = null; - public readonly string BackgroundWidget = null; public readonly string[] TestFiles = { }; public readonly string[] DiskTestFiles = { }; public readonly string PackageToExtractFromCD = null; diff --git a/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs b/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs index f356025ac8..a2c17d1f5f 100644 --- a/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs +++ b/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using OpenRA.FileFormats; using OpenRA.FileSystem; @@ -40,27 +41,13 @@ namespace OpenRA.Mods.Common.LoadScreens Ui.ResetAll(); Game.Settings.Save(); - // Check whether the mod content is installed - // TODO: The installation code has finally been beaten into shape, so we can - // finally move it all into the planned "Manage Content" panel in the modchooser mod. var installData = Game.ModData.Manifest.Get(); - var installModContent = !installData.TestFiles.All(f => GlobalFileSystem.Exists(f)); - var installModMusic = args != null && args.Contains("Install.Music"); + var isModContentInstalled = installData.TestFiles.All(f => GlobalFileSystem.Exists(Path.GetFileName(f))); - if (installModContent || installModMusic) + // Mod assets are missing! + if (!isModContentInstalled) { - var widgetArgs = new WidgetArgs() - { - { "continueLoading", () => Game.RunAfterTick(() => - Game.InitializeMod(Game.Settings.Game.Mod, args)) }, - }; - - if (installData.BackgroundWidget != null) - Ui.LoadWidget(installData.BackgroundWidget, Ui.Root, widgetArgs); - - var menu = installModContent ? installData.MenuWidget : installData.MusicMenuWidget; - Ui.OpenWindow(menu, widgetArgs); - + Game.InitializeMod("modchooser", new Arguments()); return; } From cb0ccbac502d54bf421fe19499ea0052f8e2b3ee Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Thu, 3 Sep 2015 23:34:58 +0300 Subject: [PATCH 08/14] Add paths to TestFiles File checks for existing files don't work otherwise. --- mods/cnc/mod.yaml | 2 +- mods/d2k/mod.yaml | 2 +- mods/ra/mod.yaml | 2 +- mods/ts/mod.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 11a2f510a3..96e68f9806 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -139,7 +139,7 @@ LoadScreen: CncLoadScreen Text: Loading ContentInstaller: - TestFiles: conquer.mix, desert.mix, sounds.mix, speech.mix, temperat.mix, tempicnh.mix, winter.mix + TestFiles: ^Content/cnc/conquer.mix, ^Content/cnc/desert.mix, ^Content/cnc/sounds.mix, ^Content/cnc/speech.mix, ^Content/cnc/temperat.mix, ^Content/cnc/tempicnh.mix, ^Content/cnc/winter.mix MusicMenuWidget: INSTALL_MUSIC_PANEL FilesToCopy: CONQUER.MIX, DESERT.MIX, SCORES.MIX, SOUNDS.MIX, TEMPERAT.MIX, WINTER.MIX FilesToExtract: speech.mix, tempicnh.mix, transit.mix diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index a9aabe792d..dea69e5fe2 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -125,7 +125,7 @@ LoadScreen: LogoStripeLoadScreen ContentInstaller: MusicMenuWidget: INSTALL_MUSIC_PANEL # TODO: check if DATA.R8 is at 1.03 patch level with 4840 frames - TestFiles: BLOXBASE.R8, BLOXBAT.R8, BLOXBGBS.R8, BLOXICE.R8, BLOXTREE.R8, BLOXWAST.R8, DATA.R8, SOUND.RS + TestFiles: ^Content/d2k/BLOXBASE.R8, ^Content/d2k/BLOXBAT.R8, ^Content/d2k/BLOXBGBS.R8, ^Content/d2k/BLOXICE.R8, ^Content/d2k/BLOXTREE.R8, ^Content/d2k/BLOXWAST.R8, ^Content/d2k/DATA.R8, ^Content/d2k/SOUND.RS PackageMirrorList: http://www.openra.net/packages/d2k-103-mirrors.txt DiskTestFiles: music/ambush.aud, setup/setup.z PackageToExtractFromCD: setup/setup.z diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 742cc47016..1189b2112c 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -142,7 +142,7 @@ LoadScreen: LogoStripeLoadScreen ContentInstaller: MusicMenuWidget: INSTALL_MUSIC_PANEL - TestFiles: allies.mix, conquer.mix, interior.mix, redalert.mix, russian.mix, snow.mix, sounds.mix, temperat.mix + TestFiles: ^Content/ra/allies.mix, ^Content/ra/conquer.mix, ^Content/ra/interior.mix, ^Content/ra/redalert.mix, ^Content/ra/russian.mix, ^Content/ra/snow.mix, ^Content/ra/sounds.mix, ^Content/ra/temperat.mix PackageMirrorList: http://www.openra.net/packages/ra-mirrors.txt DiskTestFiles: MAIN.MIX, INSTALL/REDALERT.MIX PackageToExtractFromCD: MAIN.MIX diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 18f85c941c..bd435501eb 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -190,7 +190,7 @@ LoadScreen: LogoStripeLoadScreen ContentInstaller: MusicMenuWidget: INSTALL_MUSIC_PANEL - TestFiles: cache.mix, conquer.mix, isosnow.mix, isotemp.mix, local.mix, sidec01.mix, sidec02.mix, sno.mix, snow.mix, sounds.mix, speech01.mix, tem.mix, temperat.mix + TestFiles: ^Content/ts/cache.mix, ^Content/ts/conquer.mix, ^Content/ts/isosnow.mix, ^Content/ts/isotemp.mix, ^Content/ts/local.mix, ^Content/ts/sidec01.mix, ^Content/ts/sidec02.mix, ^Content/ts/sno.mix, ^Content/ts/snow.mix, ^Content/ts/sounds.mix, ^Content/ts/speech01.mix, ^Content/ts/tem.mix, ^Content/ts/temperat.mix PackageMirrorList: http://www.openra.net/packages/ts-mirrors.txt DiskTestFiles: MULTI.MIX, INSTALL/TIBSUN.MIX CopyFilesFromCD: From f0a2e58ccd5e5764aeb978b5b287236d7207f1f3 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Fri, 4 Sep 2015 21:48:52 +0300 Subject: [PATCH 09/14] Add content installation dialogs to `modchooser` --- mods/modchooser/chrome.png | Bin 80161 -> 80904 bytes mods/modchooser/chrome.yaml | 22 ++++++++++++ mods/modchooser/install.yaml | 64 +++++++++++++++++++++++++++++++++++ mods/modchooser/metrics.yaml | 3 +- mods/modchooser/mod.yaml | 1 + 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 mods/modchooser/install.yaml diff --git a/mods/modchooser/chrome.png b/mods/modchooser/chrome.png index 141af11a4fd2d1fae50875f5faf9e0d95de29156..662a60a70295d5e631acd8999ae01b6f1b820e83 100644 GIT binary patch literal 80904 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 literal 80161 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�SVey{LL8Jw5$tcCk!mvVr^hv#4z_P=m(pBQ}hE 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 m#J7Y0OyfU)`2Q_x?8v&YGo Date: Fri, 4 Sep 2015 13:22:21 +0300 Subject: [PATCH 10/14] Enable mod asset package downloading from the modchooser --- .../Installation/DownloadPackagesLogic.cs | 36 ++++++------ .../Logic/Installation/InstallLogic.cs | 13 +++-- .../Widgets/Logic/ModBrowserLogic.cs | 4 +- mods/modchooser/install.yaml | 56 +++++++++++++++++++ 4 files changed, 84 insertions(+), 25 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/DownloadPackagesLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/DownloadPackagesLogic.cs index a79e0da3ef..bbeb55bb29 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/DownloadPackagesLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/DownloadPackagesLogic.cs @@ -9,11 +9,10 @@ #endregion using System; -using System.Collections.Generic; using System.ComponentModel; using System.IO; -using System.Linq; using System.Net; +using System.Text; using OpenRA.Support; using OpenRA.Widgets; @@ -21,24 +20,29 @@ namespace OpenRA.Mods.Common.Widgets.Logic { public class DownloadPackagesLogic { + static readonly string[] SizeSuffixes = { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" }; readonly Widget panel; + readonly string modId; readonly string mirrorListUrl; readonly ProgressBarWidget progressBar; readonly LabelWidget statusLabel; readonly Action afterInstall; string mirror; - static readonly string[] SizeSuffixes = { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" }; [ObjectCreator.UseCtor] - public DownloadPackagesLogic(Widget widget, Action afterInstall, string mirrorListUrl) + public DownloadPackagesLogic(Widget widget, Action afterInstall, string mirrorListUrl, string modId) { this.mirrorListUrl = mirrorListUrl; this.afterInstall = afterInstall; + this.modId = modId; panel = widget.Get("INSTALL_DOWNLOAD_PANEL"); progressBar = panel.Get("PROGRESS_BAR"); statusLabel = panel.Get("STATUS_LABEL"); + var text = "Downloading {0} assets...".F(ModMetadata.AllMods[modId].Title); + panel.Get("TITLE").Text = text; + ShowDownloadDialog(); } @@ -52,9 +56,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic var cancelButton = panel.Get("CANCEL_BUTTON"); - var mirrorsFile = Platform.ResolvePath("^", "Content", Game.ModData.Manifest.Mod.Id, "mirrors.txt"); var file = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - var dest = Platform.ResolvePath("^", "Content", Game.ModData.Manifest.Mod.Id); + var dest = Platform.ResolvePath("^", "Content", modId); Action onDownloadProgress = i => { @@ -100,7 +103,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic onError(Download.FormatErrorMessage(i.Error)); return; } - else if (cancelled) + + if (cancelled) { onError("Download cancelled"); return; @@ -119,7 +123,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic } }; - Action onFetchMirrorsComplete = (i, cancelled) => + Action onFetchMirrorsComplete = (i, cancelled) => { progressBar.Indeterminate = true; @@ -128,21 +132,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic onError(Download.FormatErrorMessage(i.Error)); return; } - else if (cancelled) + + if (cancelled) { onError("Download cancelled"); return; } - var mirrorList = new List(); - using (var r = new StreamReader(mirrorsFile)) - { - string line; - while ((line = r.ReadLine()) != null) - if (!string.IsNullOrEmpty(line)) - mirrorList.Add(line); - } - + var data = Encoding.UTF8.GetString(i.Result); + var mirrorList = data.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); mirror = mirrorList.Random(new MersenneTwister()); // Save the package to a temp file @@ -152,7 +150,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; // Get the list of mirrors - var updateMirrors = new Download(mirrorListUrl, mirrorsFile, onDownloadProgress, onFetchMirrorsComplete); + var updateMirrors = new Download(mirrorListUrl, onDownloadProgress, onFetchMirrorsComplete); cancelButton.OnClick = () => { updateMirrors.Cancel(); Ui.CloseWindow(); }; retryButton.OnClick = () => { updateMirrors.Cancel(); ShowDownloadDialog(); }; } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs index 4685a06e9c..d664368f3e 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs @@ -9,7 +9,6 @@ #endregion using System; -using System.Collections.Generic; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic @@ -17,17 +16,21 @@ namespace OpenRA.Mods.Common.Widgets.Logic public class InstallLogic : Widget { [ObjectCreator.UseCtor] - public InstallLogic(Widget widget, Action continueLoading) + public InstallLogic(Widget widget, Action continueLoading, string mirrorListUrl, string modId) { - var installData = Game.ModData.Manifest.Get(); var panel = widget.Get("INSTALL_PANEL"); - var widgetArgs = new WidgetArgs() + var widgetArgs = new WidgetArgs { { "afterInstall", () => { Ui.CloseWindow(); continueLoading(); } }, { "continueLoading", continueLoading }, - { "mirrorListUrl", installData.PackageMirrorList }, + { "mirrorListUrl", mirrorListUrl }, + { "modId", modId } }; + var modName = ModMetadata.AllMods[modId].Title; + var text = panel.Get("DESC1").Text; + panel.Get("DESC1").Text = text.F(modName); + panel.Get("DOWNLOAD_BUTTON").OnClick = () => Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", widgetArgs); diff --git a/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs index ca5af451db..3c0ab93760 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs @@ -167,7 +167,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic var widgetArgs = new WidgetArgs { { "continueLoading", () => - Game.RunAfterTick(() => Game.InitializeMod(Game.Settings.Game.Mod, new Arguments())) } + Game.RunAfterTick(() => Game.InitializeMod(Game.Settings.Game.Mod, new Arguments())) }, + { "mirrorListUrl", mod.Content.PackageMirrorList }, + { "modId", mod.Id } }; Ui.OpenWindow("INSTALL_PANEL", widgetArgs); diff --git a/mods/modchooser/install.yaml b/mods/modchooser/install.yaml index 7580441d92..e9937e1857 100644 --- a/mods/modchooser/install.yaml +++ b/mods/modchooser/install.yaml @@ -62,3 +62,59 @@ Container@INSTALL_PANEL: Font: Bold Key: escape +Container@INSTALL_DOWNLOAD_PANEL: + Logic: DownloadPackagesLogic + X: (WINDOW_RIGHT - WIDTH)/2 + Y: (WINDOW_BOTTOM - HEIGHT)/2 + Width: 500 + Height: 177 + Children: + Background: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Background: panel-bg + Background@RULE: + X: 30 + Y: 50 + Width: 440 + Height:150 + Background:panel-rule + Label@TITLE: + X: 0 + Y: 12 + Width: PARENT_RIGHT + Height: 25 + Align: Center + Font: MediumBold + ProgressBar@PROGRESS_BAR: + X: 50 + Y: 64 + Width: PARENT_RIGHT - 100 + Height: 16 + BarMargin: 0, 0 + Label@STATUS_LABEL: + X: 36 + Y: 85 + Width: PARENT_RIGHT - 100 + Height: 25 + Align: Left + Button@RETRY_BUTTON: + X: PARENT_RIGHT - 280 + Y: PARENT_BOTTOM - 52 + Background:button-highlighted + Width: 120 + Height: 32 + Visible: false + Text: Retry + Font: Bold + Key: return + Button@CANCEL_BUTTON: + X: PARENT_RIGHT - 130 + Y: PARENT_BOTTOM - 52 + Background:button-highlighted + Width: 110 + Height: 32 + Text: Cancel + Font: Bold + Key: escape + From 0e7122acadd743e92f472249e156cd2c17198cfe Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Fri, 4 Sep 2015 21:14:16 +0300 Subject: [PATCH 11/14] Enable mod asset installation from CD from the modchooser --- OpenRA.Mods.Common/InstallUtils.cs | 10 ++- .../Logic/Installation/InstallFromCDLogic.cs | 17 ++-- .../Logic/Installation/InstallLogic.cs | 11 +-- mods/modchooser/install.yaml | 77 +++++++++++++++++++ 4 files changed, 102 insertions(+), 13 deletions(-) diff --git a/OpenRA.Mods.Common/InstallUtils.cs b/OpenRA.Mods.Common/InstallUtils.cs index decbbeab8d..98e471ff0c 100644 --- a/OpenRA.Mods.Common/InstallUtils.cs +++ b/OpenRA.Mods.Common/InstallUtils.cs @@ -56,7 +56,8 @@ namespace OpenRA.Mods.Common foreach (var file in directory.Value) { - var dest = Path.Combine(destPath, targetDir, file.ToLowerInvariant()); + var containingDir = Path.Combine(destPath, targetDir); + var dest = Path.Combine(containingDir, file.ToLowerInvariant()); if (File.Exists(dest)) { if (overwrite) @@ -68,6 +69,8 @@ namespace OpenRA.Mods.Common } } + Directory.CreateDirectory(containingDir); + using (var sourceStream = GlobalFileSystem.Open(file)) using (var destStream = File.Create(dest)) { @@ -98,13 +101,16 @@ namespace OpenRA.Mods.Common } var destFile = Path.GetFileName(file); - var dest = Path.Combine(destPath, targetDir, destFile.ToLowerInvariant()); + var containingDir = Path.Combine(destPath, targetDir); + var dest = Path.Combine(containingDir, destFile.ToLowerInvariant()); if (File.Exists(dest) && !overwrite) { Log.Write("debug", "Skipping {0}".F(dest)); continue; } + Directory.CreateDirectory(containingDir); + onProgress("Copying " + destFile); Log.Write("debug", "Copy {0} to {1}".F(sourcePath, dest)); File.Copy(sourcePath, dest, true); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromCDLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromCDLogic.cs index 6e4ec3f38b..57f715d66d 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromCDLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromCDLogic.cs @@ -19,6 +19,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { public class InstallFromCDLogic { + readonly string modId; readonly Widget panel; readonly ProgressBarWidget progressBar; readonly LabelWidget statusLabel; @@ -28,9 +29,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic readonly ContentInstaller installData; [ObjectCreator.UseCtor] - public InstallFromCDLogic(Widget widget, Action continueLoading) + public InstallFromCDLogic(Widget widget, Action continueLoading, string modId) { - installData = Game.ModData.Manifest.Get(); + this.modId = modId; + installData = ModMetadata.AllMods[modId].Content; this.continueLoading = continueLoading; panel = widget.Get("INSTALL_FROMCD_PANEL"); progressBar = panel.Get("PROGRESS_BAR"); @@ -74,6 +76,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic InstallTFD(Platform.ResolvePath(path, "data1.hdr")); else { + var text = "Please insert a {0} install CD and click Retry.".F(ModMetadata.AllMods[modId].Title); + insertDiskContainer.Get("INFO2").Text = text; + insertDiskContainer.IsVisible = () => true; installingContainer.IsVisible = () => false; } @@ -103,13 +108,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var filename = cabExtractor.FileName(index); statusLabel.GetText = () => "Extracting {0}".F(filename); - var dest = Platform.ResolvePath("^", "Content", Game.ModData.Manifest.Mod.Id, filename.ToLowerInvariant()); + var dest = Platform.ResolvePath("^", "Content", modId, filename.ToLowerInvariant()); cabExtractor.ExtractFile(index, dest); progressBar.Percentage += installPercent; } var ArchivesToExtract = installData.InstallShieldCABFilePackageIds.Select(x => x.Split(':')); - var destDir = Platform.ResolvePath("^", "Content", Game.ModData.Manifest.Mod.Id); + var destDir = Platform.ResolvePath("^", "Content", modId); var onError = (Action)(s => { }); var overwrite = installData.OverwriteFiles; @@ -124,7 +129,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var filename = cabExtractor.FileName(uint.Parse(archive[0])); statusLabel.GetText = () => "Extracting {0}".F(filename); - var destFile = Platform.ResolvePath("^", "Content", Game.ModData.Manifest.Mod.Id, filename.ToLowerInvariant()); + var destFile = Platform.ResolvePath("^", "Content", modId, filename.ToLowerInvariant()); cabExtractor.ExtractFile(uint.Parse(archive[0]), destFile); var annotation = archive.Length > 1 ? archive[1] : null; InstallUtils.ExtractFromPackage(source, destFile, annotation, extractFiles, destDir, overwrite, onProgress, onError); @@ -143,7 +148,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic insertDiskContainer.IsVisible = () => false; installingContainer.IsVisible = () => true; - var dest = Platform.ResolvePath("^", "Content", Game.ModData.Manifest.Mod.Id); + var dest = Platform.ResolvePath("^", "Content", modId); var copyFiles = installData.CopyFilesFromCD; var packageToExtract = installData.PackageToExtractFromCD.Split(':'); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs index d664368f3e..5532dfa02a 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs @@ -27,12 +27,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic { "modId", modId } }; - var modName = ModMetadata.AllMods[modId].Title; - var text = panel.Get("DESC1").Text; - panel.Get("DESC1").Text = text.F(modName); + var mod = ModMetadata.AllMods[modId]; + var text = "OpenRA requires the original {0} game content.".F(mod.Title); + panel.Get("DESC1").Text = text; - panel.Get("DOWNLOAD_BUTTON").OnClick = () => - Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", widgetArgs); + var downloadButton = panel.Get("DOWNLOAD_BUTTON"); + downloadButton.OnClick = () => Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", widgetArgs); + downloadButton.IsDisabled = () => string.IsNullOrEmpty(mod.Content.PackageMirrorList); panel.Get("INSTALL_BUTTON").OnClick = () => Ui.OpenWindow("INSTALL_FROMCD_PANEL", widgetArgs); diff --git a/mods/modchooser/install.yaml b/mods/modchooser/install.yaml index e9937e1857..88cb9c5f1c 100644 --- a/mods/modchooser/install.yaml +++ b/mods/modchooser/install.yaml @@ -118,3 +118,80 @@ Container@INSTALL_DOWNLOAD_PANEL: Font: Bold Key: escape +Container@INSTALL_FROMCD_PANEL: + Logic: InstallFromCDLogic + X: (WINDOW_RIGHT - WIDTH)/2 + Y: (WINDOW_BOTTOM - HEIGHT)/2 + Width: 500 + Height: 177 + Children: + Background: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Background: panel-bg + Background@RULE: + X: 30 + Y: 50 + Width: 440 + Height:150 + Background:panel-rule + Label@TITLE: + X: 0 + Y: 12 + Width: PARENT_RIGHT + Height: 25 + Text: Fetching assets from CD... + Align: Center + Font: MediumBold + Container@INSTALLING: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Visible: false + Children: + ProgressBar@PROGRESS_BAR: + X: 50 + Y: 60 + Width: PARENT_RIGHT - 100 + Height: 16 + BarMargin: 0, 0 + Label@STATUS_LABEL: + X: 36 + Y: 80 + Width: PARENT_RIGHT - 100 + Height: 25 + Align: Left + Container@INSERT_DISK: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Visible: false + Children: + Label@INFO1: + Y: 65 + Width: PARENT_RIGHT + Height: 25 + Text: Disk not found. + Align: Center + Label@INFO2: + Y: 85 + Width: PARENT_RIGHT + Height: 25 + Align: Center + Button@RETRY_BUTTON: + X: 20 + Y: PARENT_BOTTOM - 52 + Background:button-highlighted + Width: 110 + Height: 32 + Text: Retry + Font: Bold + Key: return + Button@BACK_BUTTON: + X: PARENT_RIGHT - 130 + Y: PARENT_BOTTOM - 52 + Background:button-highlighted + Width: 110 + Height: 32 + Text: Back + Font: Bold + Key: escape + From 4401e1aa0cd1b48eb7351729bef1f383a46f1b84 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 5 Sep 2015 00:19:20 +0300 Subject: [PATCH 12/14] Pipe mod music installation through the ModChooser --- .../LoadScreens/ModChooserLoadScreen.cs | 13 +++- .../Logic/Installation/InstallMusicLogic.cs | 28 ++++---- .../Widgets/Logic/ModBrowserLogic.cs | 3 +- .../Widgets/Logic/MusicPlayerLogic.cs | 7 +- mods/cnc/mod.yaml | 1 - mods/d2k/mod.yaml | 1 - mods/modchooser/install.yaml | 65 +++++++++++++++++++ mods/ra/mod.yaml | 1 - mods/ts/mod.yaml | 1 - 9 files changed, 94 insertions(+), 26 deletions(-) diff --git a/OpenRA.Mods.Common/LoadScreens/ModChooserLoadScreen.cs b/OpenRA.Mods.Common/LoadScreens/ModChooserLoadScreen.cs index 690dc0d7da..d744f8ccdc 100644 --- a/OpenRA.Mods.Common/LoadScreens/ModChooserLoadScreen.cs +++ b/OpenRA.Mods.Common/LoadScreens/ModChooserLoadScreen.cs @@ -41,8 +41,17 @@ namespace OpenRA.Mods.Common.LoadScreens public void StartGame(Arguments args) { - Ui.LoadWidget("MODCHOOSER_BACKGROUND", Ui.Root, new WidgetArgs()); - Ui.OpenWindow("MODCHOOSER_DIALOG"); + var widgetArgs = new WidgetArgs(); + + Ui.LoadWidget("MODCHOOSER_BACKGROUND", Ui.Root, widgetArgs); + + if (args != null && args.Contains("installMusic")) + { + widgetArgs.Add("modId", args.GetValue("installMusic", "")); + Ui.OpenWindow("INSTALL_MUSIC_PANEL", widgetArgs); + } + else + Ui.OpenWindow("MODCHOOSER_DIALOG", widgetArgs); } public void Dispose() diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs index 7dd7956884..431345c81c 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs @@ -9,10 +9,6 @@ #endregion using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using OpenRA.FileSystem; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic @@ -20,38 +16,42 @@ namespace OpenRA.Mods.Common.Widgets.Logic public class InstallMusicLogic { [ObjectCreator.UseCtor] - public InstallMusicLogic(Widget widget) + public InstallMusicLogic(Widget widget, string modId) { var installMusicContainer = widget.Get("INSTALL_MUSIC_PANEL"); - Action loadDefaultMod = () => Game.RunAfterTick(() => - Game.InitializeMod(Game.Settings.Game.Mod, null)); + Action loadDefaultMod = () => + Game.RunAfterTick(() => Game.InitializeMod(modId, null)); - var cancelButton = installMusicContainer.GetOrNull("CANCEL_BUTTON"); + var cancelButton = installMusicContainer.GetOrNull("BACK_BUTTON"); if (cancelButton != null) cancelButton.OnClick = loadDefaultMod; - var copyFromDiscButton = installMusicContainer.GetOrNull("COPY_FROM_CD_BUTTON"); + var copyFromDiscButton = installMusicContainer.GetOrNull("INSTALL_MUSIC_BUTTON"); if (copyFromDiscButton != null) { copyFromDiscButton.OnClick = () => { - Ui.OpenWindow("INSTALL_FROMCD_PANEL", new WidgetArgs() { + Ui.OpenWindow("INSTALL_FROMCD_PANEL", new WidgetArgs + { { "continueLoading", loadDefaultMod }, + { "modId", modId } }); }; } - var downloadButton = installMusicContainer.GetOrNull("DOWNLOAD_BUTTON"); + var downloadButton = installMusicContainer.GetOrNull("DOWNLOAD_MUSIC_BUTTON"); if (downloadButton != null) { - var installData = Game.ModData.Manifest.Get(); - downloadButton.IsVisible = () => !string.IsNullOrEmpty(installData.MusicPackageMirrorList); + var installData = ModMetadata.AllMods[modId].Content; + downloadButton.IsDisabled = () => string.IsNullOrEmpty(installData.MusicPackageMirrorList); downloadButton.OnClick = () => { - Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", new WidgetArgs() { + Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", new WidgetArgs + { { "afterInstall", loadDefaultMod }, { "mirrorListUrl", installData.MusicPackageMirrorList }, + { "modId", modId } }); }; } diff --git a/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs index 3c0ab93760..80597047e2 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs @@ -13,7 +13,6 @@ using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; -using OpenRA.FileSystem; using OpenRA.Graphics; using OpenRA.Primitives; using OpenRA.Widgets; @@ -96,7 +95,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic modInstallStatus = new Cache(IsModInstalled); - ModMetadata initialMod = null; + ModMetadata initialMod; ModMetadata.AllMods.TryGetValue(Game.Settings.Game.PreviousMod, out initialMod); SelectMod(initialMod != null && initialMod.Id != "modchooser" ? initialMod : ModMetadata.AllMods["ra"]); diff --git a/OpenRA.Mods.Common/Widgets/Logic/MusicPlayerLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/MusicPlayerLogic.cs index 449963aaf6..0279ad9c9a 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/MusicPlayerLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/MusicPlayerLogic.cs @@ -90,11 +90,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic var installButton = widget.GetOrNull("INSTALL_BUTTON"); if (installButton != null) { - installButton.IsDisabled = () => world == null || world.Type != WorldType.Shellmap; - var args = new string[] { "Install.Music=true" }; + installButton.IsDisabled = () => world.Type != WorldType.Shellmap; + var args = new[] { "installMusic={0}".F(Game.ModData.Manifest.Mod.Id) }; installButton.OnClick = () => - Game.RunAfterTick(() => - Game.InitializeMod(Game.Settings.Game.Mod, new Arguments(args))); + Game.RunAfterTick(() => Game.InitializeMod("modchooser", new Arguments(args))); var installData = Game.ModData.Manifest.Get(); installButton.IsVisible = () => modRules.InstalledMusic.ToArray().Length <= installData.ShippedSoundtracks; diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 96e68f9806..85a197c2a4 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -140,7 +140,6 @@ LoadScreen: CncLoadScreen ContentInstaller: TestFiles: ^Content/cnc/conquer.mix, ^Content/cnc/desert.mix, ^Content/cnc/sounds.mix, ^Content/cnc/speech.mix, ^Content/cnc/temperat.mix, ^Content/cnc/tempicnh.mix, ^Content/cnc/winter.mix - MusicMenuWidget: INSTALL_MUSIC_PANEL FilesToCopy: CONQUER.MIX, DESERT.MIX, SCORES.MIX, SOUNDS.MIX, TEMPERAT.MIX, WINTER.MIX FilesToExtract: speech.mix, tempicnh.mix, transit.mix PackageMirrorList: http://www.openra.net/packages/cnc-mirrors.txt diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index dea69e5fe2..6cbaaca57b 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -123,7 +123,6 @@ LoadScreen: LogoStripeLoadScreen Text: Filling Crates..., Breeding Sandworms..., Fuelling carryalls..., Deploying harvesters..., Preparing 'thopters..., Summoning mentats... ContentInstaller: - MusicMenuWidget: INSTALL_MUSIC_PANEL # TODO: check if DATA.R8 is at 1.03 patch level with 4840 frames TestFiles: ^Content/d2k/BLOXBASE.R8, ^Content/d2k/BLOXBAT.R8, ^Content/d2k/BLOXBGBS.R8, ^Content/d2k/BLOXICE.R8, ^Content/d2k/BLOXTREE.R8, ^Content/d2k/BLOXWAST.R8, ^Content/d2k/DATA.R8, ^Content/d2k/SOUND.RS PackageMirrorList: http://www.openra.net/packages/d2k-103-mirrors.txt diff --git a/mods/modchooser/install.yaml b/mods/modchooser/install.yaml index 88cb9c5f1c..7f8d32093d 100644 --- a/mods/modchooser/install.yaml +++ b/mods/modchooser/install.yaml @@ -195,3 +195,68 @@ Container@INSTALL_FROMCD_PANEL: Font: Bold Key: escape + +Container@INSTALL_MUSIC_PANEL: + Logic: InstallMusicLogic + X: (WINDOW_RIGHT - WIDTH)/2 + Y: (WINDOW_BOTTOM - HEIGHT)/2 + Width: 500 + Height: 177 + Children: + Background: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Background: panel-bg + Background@RULE: + X: 30 + Y: 50 + Width: 440 + Height:150 + Background:panel-rule + Label@TITLE: + X: 0 + Y: 12 + Width: PARENT_RIGHT + Height: 25 + Text: Install Music + Align: Center + Font: MediumBold + Label@DESC1: + X: 0 + Y: 65 + Width: PARENT_RIGHT + Height: 25 + Text: OpenRA can download the music files from the internet (if available), + Align: Center + Label@DESC2: + X: 0 + Y: 85 + Width: PARENT_RIGHT + Height: 25 + Text: or you can install them from an original CD. + Align: Center + Button@DOWNLOAD_MUSIC_BUTTON: + X: 20 + Y: PARENT_BOTTOM - 52 + Background:button-highlighted + Width: 110 + Height: 32 + Text: Download + Font: Bold + Button@INSTALL_MUSIC_BUTTON: + X: 140 + Y: PARENT_BOTTOM - 52 + Background:button-highlighted + Width: 110 + Height: 32 + Text: Use CD + Font: Bold + Button@BACK_BUTTON: + X: PARENT_RIGHT - 130 + Y: PARENT_BOTTOM - 52 + Background:button-highlighted + Width: 110 + Height: 32 + Text: Back + Font: Bold + Key: escape diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 1189b2112c..3a1495b227 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -141,7 +141,6 @@ LoadScreen: LogoStripeLoadScreen Text: Filling Crates..., Charging Capacitors..., Reticulating Splines..., Planting Trees..., Building Bridges..., Aging Empires..., Compiling EVA..., Constructing Pylons..., Activating Skynet..., Splitting Atoms... ContentInstaller: - MusicMenuWidget: INSTALL_MUSIC_PANEL TestFiles: ^Content/ra/allies.mix, ^Content/ra/conquer.mix, ^Content/ra/interior.mix, ^Content/ra/redalert.mix, ^Content/ra/russian.mix, ^Content/ra/snow.mix, ^Content/ra/sounds.mix, ^Content/ra/temperat.mix PackageMirrorList: http://www.openra.net/packages/ra-mirrors.txt DiskTestFiles: MAIN.MIX, INSTALL/REDALERT.MIX diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index bd435501eb..64e30242ef 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -189,7 +189,6 @@ LoadScreen: LogoStripeLoadScreen Text: Updating EVA installation..., Changing perspective... ContentInstaller: - MusicMenuWidget: INSTALL_MUSIC_PANEL TestFiles: ^Content/ts/cache.mix, ^Content/ts/conquer.mix, ^Content/ts/isosnow.mix, ^Content/ts/isotemp.mix, ^Content/ts/local.mix, ^Content/ts/sidec01.mix, ^Content/ts/sidec02.mix, ^Content/ts/sno.mix, ^Content/ts/snow.mix, ^Content/ts/sounds.mix, ^Content/ts/speech01.mix, ^Content/ts/tem.mix, ^Content/ts/temperat.mix PackageMirrorList: http://www.openra.net/packages/ts-mirrors.txt DiskTestFiles: MULTI.MIX, INSTALL/TIBSUN.MIX From 50ea12723c19935fe341c10212d474ac30dd78dd Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 8 Sep 2015 22:25:05 +0300 Subject: [PATCH 13/14] Streamline mod changing after installation - Don't return to the ModChooser after a successful installation. - Don't reload the ModChooser after a cancelled installation. --- .../Logic/Installation/InstallFromCDLogic.cs | 10 +++++----- .../Widgets/Logic/Installation/InstallLogic.cs | 15 +++------------ .../Logic/Installation/InstallMusicLogic.cs | 5 ++--- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromCDLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromCDLogic.cs index 57f715d66d..1fcee2378b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromCDLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromCDLogic.cs @@ -23,17 +23,17 @@ namespace OpenRA.Mods.Common.Widgets.Logic readonly Widget panel; readonly ProgressBarWidget progressBar; readonly LabelWidget statusLabel; - readonly Action continueLoading; + readonly Action afterInstall; readonly ButtonWidget retryButton, backButton; readonly Widget installingContainer, insertDiskContainer; readonly ContentInstaller installData; [ObjectCreator.UseCtor] - public InstallFromCDLogic(Widget widget, Action continueLoading, string modId) + public InstallFromCDLogic(Widget widget, Action afterInstall, string modId) { this.modId = modId; installData = ModMetadata.AllMods[modId].Content; - this.continueLoading = continueLoading; + this.afterInstall = afterInstall; panel = widget.Get("INSTALL_FROMCD_PANEL"); progressBar = panel.Get("PROGRESS_BAR"); statusLabel = panel.Get("STATUS_LABEL"); @@ -137,7 +137,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic } } - continueLoading(); + afterInstall(); }) { IsBackground = true }.Start(); } @@ -198,7 +198,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { statusLabel.GetText = () => "Game assets have been extracted."; Ui.CloseWindow(); - continueLoading(); + afterInstall(); }); } catch (Exception e) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs index 5532dfa02a..59591abd72 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs @@ -8,7 +8,6 @@ */ #endregion -using System; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic @@ -16,13 +15,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic public class InstallLogic : Widget { [ObjectCreator.UseCtor] - public InstallLogic(Widget widget, Action continueLoading, string mirrorListUrl, string modId) + public InstallLogic(Widget widget, string mirrorListUrl, string modId) { var panel = widget.Get("INSTALL_PANEL"); var widgetArgs = new WidgetArgs { - { "afterInstall", () => { Ui.CloseWindow(); continueLoading(); } }, - { "continueLoading", continueLoading }, + { "afterInstall", () => { Game.InitializeMod(modId, new Arguments()); } }, { "mirrorListUrl", mirrorListUrl }, { "modId", modId } }; @@ -38,14 +36,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic panel.Get("INSTALL_BUTTON").OnClick = () => Ui.OpenWindow("INSTALL_FROMCD_PANEL", widgetArgs); - panel.Get("BACK_BUTTON").OnClick = () => - { - Game.RunAfterTick(() => - { - Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id; - Game.InitializeMod("modchooser", null); - }); - }; + panel.Get("BACK_BUTTON").OnClick = Ui.CloseWindow; } } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs index 431345c81c..0b1fa7c794 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs @@ -20,8 +20,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var installMusicContainer = widget.Get("INSTALL_MUSIC_PANEL"); - Action loadDefaultMod = () => - Game.RunAfterTick(() => Game.InitializeMod(modId, null)); + Action loadDefaultMod = () => Game.RunAfterTick(() => Game.InitializeMod(modId, null)); var cancelButton = installMusicContainer.GetOrNull("BACK_BUTTON"); if (cancelButton != null) @@ -34,7 +33,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { Ui.OpenWindow("INSTALL_FROMCD_PANEL", new WidgetArgs { - { "continueLoading", loadDefaultMod }, + { "afterInstall", loadDefaultMod }, { "modId", modId } }); }; From 60fee57f75d1075041aa494936bd5721db619680 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 8 Sep 2015 20:35:23 +0300 Subject: [PATCH 14/14] Remove obsolete installation UI YAML files from the official mods --- mods/cnc/chrome.yaml | 1 - mods/cnc/chrome/install.yaml | 207 ----------------------------------- mods/cnc/mod.yaml | 1 - mods/d2k/chrome/install.yaml | 160 --------------------------- mods/d2k/mod.yaml | 1 - mods/ra/chrome/install.yaml | 160 --------------------------- mods/ra/mod.yaml | 1 - mods/ts/chrome/install.yaml | 160 --------------------------- mods/ts/mod.yaml | 1 - 9 files changed, 692 deletions(-) delete mode 100644 mods/cnc/chrome/install.yaml delete mode 100644 mods/d2k/chrome/install.yaml delete mode 100644 mods/ra/chrome/install.yaml delete mode 100644 mods/ts/chrome/install.yaml diff --git a/mods/cnc/chrome.yaml b/mods/cnc/chrome.yaml index aa3a7c67e6..7b910d144a 100644 --- a/mods/cnc/chrome.yaml +++ b/mods/cnc/chrome.yaml @@ -5,7 +5,6 @@ shellmapbits: chrome.png record: 288,16,16,16 logos: chrome.png - install:128,0,128,128 eva:256,64,128,64 nod-load:0,256,256,256 gdi-load:256,256,256,256 diff --git a/mods/cnc/chrome/install.yaml b/mods/cnc/chrome/install.yaml deleted file mode 100644 index f736e70c95..0000000000 --- a/mods/cnc/chrome/install.yaml +++ /dev/null @@ -1,207 +0,0 @@ -Container@INSTALL_BACKGROUND: - Width: WINDOW_RIGHT - Height: WINDOW_BOTTOM - Children: - Image@NOD: - X: WINDOW_RIGHT/2-384 - Y: (WINDOW_BOTTOM-256)/2 - ImageCollection: logos - ImageName: nod-load - Image@GDI: - X: WINDOW_RIGHT/2+128 - Y: (WINDOW_BOTTOM-256)/2 - ImageCollection: logos - ImageName: gdi-load - Image@EVA: - X: WINDOW_RIGHT-128-43 - Y: 43 - Width: 128 - Height: 64 - ImageCollection: logos - ImageName: eva - Background: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Background: shellmapborder - -Container@INSTALL_PANEL: - Logic: InstallLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - 150)/2 - Width: 640 - Height: 150 - Children: - Label@TITLE: - Width: PARENT_RIGHT - Y: 0-25 - Font: BigBold - Contrast: true - Align: Center - Text: Install Required - Background@bg: - Width: 640 - Height: 150 - Background: panel-black - Children: - Image@INSTALL: - X: 11 - Y: 11 - ImageCollection: logos - ImageName: install - Label@INFO: - X: 170 - Y: 50 - Width: PARENT_RIGHT-30 - Height: 25 - Text: OpenRA requires the original Command & Conquer game content. - Font: Bold - Label@INFO2: - X: 170 - Y: 70 - Width: PARENT_RIGHT-185 - Height: 25 - WordWrap: true - Text: Content can be downloaded, or copied from the install CD. - Font: Bold - Button@BACK_BUTTON: - Y: 149 - Width: 140 - Height: 35 - Text: Back - Button@DOWNLOAD_BUTTON: - X: 350 - Y: 149 - Width: 140 - Height: 35 - Text: Download - Button@INSTALL_BUTTON: - X: 500 - Y: 149 - Width: 140 - Height: 35 - Text: Use CD - -Container@INSTALL_FROMCD_PANEL: - Logic: InstallFromCDLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - 150)/2 - Width: 640 - Height: 150 - Children: - Label@TITLE: - Width: PARENT_RIGHT - Y: 0-25 - Font: BigBold - Contrast: true - Align: Center - Text: Installing from CD - Background@bg: - Width: 640 - Height: 150 - Background: panel-black - Children: - Image@INSTALL: - X: 11 - Y: 11 - ImageCollection: logos - ImageName: install - Container@INSTALLING: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Visible: false - Children: - ProgressBar@PROGRESS_BAR: - X: 170 - Y: 45 - Width: PARENT_RIGHT - 185 - Height: 35 - Label@STATUS_LABEL: - X: 170 - Y: 85 - Width: PARENT_RIGHT - 185 - Height: 25 - Align: Left - Container@INSERT_DISK: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Visible: false - Children: - Label@INFO: - X: 170 - Y: 50 - Width: PARENT_RIGHT-30 - Height: 25 - Text: Disk not found. - Font: Bold - Label@INFO2: - X: 170 - Y: 70 - Width: PARENT_RIGHT-185 - Height: 25 - WordWrap: true - Text: Please insert one of the Command & Conquer install CDs then click Retry. - Font: Bold - Button@BACK_BUTTON: - Key: escape - Y: 149 - Width: 140 - Height: 35 - Text: Back - Button@RETRY_BUTTON: - Key: return - X: 500 - Y: 149 - Width: 140 - Height: 35 - Text: Retry - -Container@INSTALL_DOWNLOAD_PANEL: - Logic: DownloadPackagesLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - 150)/2 - Width: 640 - Height: 150 - Children: - Label@TITLE: - Width: PARENT_RIGHT - Y: 0-25 - Font: BigBold - Contrast: true - Align: Center - Text: Downloading Command & Conquer Content - Background@bg: - Width: 640 - Height: 150 - Background: panel-black - Children: - Image@INSTALL: - X: 11 - Y: 11 - ImageCollection: logos - ImageName: install - ProgressBar@PROGRESS_BAR: - X: 170 - Y: 45 - Width: PARENT_RIGHT - 185 - Height: 35 - Label@STATUS_LABEL: - X: 170 - Y: 85 - Width: PARENT_RIGHT - 185 - Height: 25 - Align: Left - Text: Initialising... - Button@CANCEL_BUTTON: - Key: escape - Y: 149 - Width: 140 - Height: 35 - Text: Cancel - Button@RETRY_BUTTON: - Key: return - X: 500 - Y: 149 - Width: 140 - Height: 35 - Text: Retry - diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 85a197c2a4..5502db68f9 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -89,7 +89,6 @@ Assemblies: ./mods/cnc/OpenRA.Mods.Cnc.dll ChromeLayout: - ./mods/cnc/chrome/install.yaml ./mods/cnc/chrome/mainmenu.yaml ./mods/cnc/chrome/serverbrowser.yaml ./mods/cnc/chrome/createserver.yaml diff --git a/mods/d2k/chrome/install.yaml b/mods/d2k/chrome/install.yaml deleted file mode 100644 index e60d023c9a..0000000000 --- a/mods/d2k/chrome/install.yaml +++ /dev/null @@ -1,160 +0,0 @@ -Background@INSTALL_PANEL: - Logic: InstallLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Install Required - Align: Center - Font: Bold - Label@DESC1: - X: 0 - Y: 50 - Width: PARENT_RIGHT - Height: 25 - Text: OpenRA requires the original Dune 2000 game content. - Align: Center - Label@DESC2: - X: 0 - Y: 70 - Width: PARENT_RIGHT - Height: 25 - Text: Content can be downloaded, or copied from the install CD. - Align: Center - Button@DOWNLOAD_BUTTON: - X: 20 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Download - Font: Bold - Button@INSTALL_BUTTON: - X: 140 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Use CD - Font: Bold - Button@BACK_BUTTON: - X: PARENT_RIGHT - 130 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Back - Font: Bold - -Background@INSTALL_DOWNLOAD_PANEL: - Logic: DownloadPackagesLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Downloading Dune 2000 Content - Align: Center - Font: Bold - ProgressBar@PROGRESS_BAR: - X: 50 - Y: 55 - Width: PARENT_RIGHT - 100 - Height: 25 - Label@STATUS_LABEL: - X: 50 - Y: 80 - Width: PARENT_RIGHT - 100 - Height: 25 - Align: Left - Button@RETRY_BUTTON: - X: PARENT_RIGHT - 280 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Visible: false - Text: Retry - Font: Bold - Key: return - Button@CANCEL_BUTTON: - X: PARENT_RIGHT - 140 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Cancel - Font: Bold - Key: escape - -Background@INSTALL_FROMCD_PANEL: - Logic: InstallFromCDLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Installing from CD - Align: Center - Font: Bold - Container@INSTALLING: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Visible: false - Children: - ProgressBar@PROGRESS_BAR: - X: 50 - Y: 55 - Width: PARENT_RIGHT - 100 - Height: 25 - Label@STATUS_LABEL: - X: 50 - Y: 80 - Width: PARENT_RIGHT - 100 - Height: 25 - Align: Left - Container@INSERT_DISK: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Visible: false - Children: - Label@INFO: - Y: 50 - Width: PARENT_RIGHT - Height: 25 - Text: Disk not found. - Align: Center - Label@INFO2: - Y: 70 - Width: PARENT_RIGHT - Height: 25 - Text: Please insert the Dune 2000 install CD then click Retry. - Align: Center - Button@RETRY_BUTTON: - X: PARENT_RIGHT - 280 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Retry - Font: Bold - Key: return - Button@BACK_BUTTON: - X: PARENT_RIGHT - 140 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Back - Font: Bold - Key: escape - diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 6cbaaca57b..e56af97479 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -64,7 +64,6 @@ Assemblies: ./mods/d2k/OpenRA.Mods.D2k.dll ChromeLayout: - ./mods/d2k/chrome/install.yaml ./mods/d2k/chrome/ingame.yaml ./mods/ra/chrome/ingame-chat.yaml ./mods/ra/chrome/ingame-diplomacy.yaml diff --git a/mods/ra/chrome/install.yaml b/mods/ra/chrome/install.yaml deleted file mode 100644 index db695c4e6c..0000000000 --- a/mods/ra/chrome/install.yaml +++ /dev/null @@ -1,160 +0,0 @@ -Background@INSTALL_PANEL: - Logic: InstallLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Install Required - Align: Center - Font: Bold - Label@DESC1: - X: 0 - Y: 50 - Width: PARENT_RIGHT - Height: 25 - Text: OpenRA requires the original Red Alert game content. - Align: Center - Label@DESC2: - X: 0 - Y: 70 - Width: PARENT_RIGHT - Height: 25 - Text: Content can be downloaded, or copied from the install CD. - Align: Center - Button@DOWNLOAD_BUTTON: - X: 20 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Download - Font: Bold - Button@INSTALL_BUTTON: - X: 140 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Use CD - Font: Bold - Button@BACK_BUTTON: - X: PARENT_RIGHT - 130 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Back - Font: Bold - -Background@INSTALL_DOWNLOAD_PANEL: - Logic: DownloadPackagesLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Downloading Red Alert Content - Align: Center - Font: Bold - ProgressBar@PROGRESS_BAR: - X: 50 - Y: 55 - Width: PARENT_RIGHT - 100 - Height: 25 - Label@STATUS_LABEL: - X: 50 - Y: 80 - Width: PARENT_RIGHT - 100 - Height: 25 - Align: Left - Button@RETRY_BUTTON: - X: PARENT_RIGHT - 280 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Visible: false - Text: Retry - Font: Bold - Key: return - Button@CANCEL_BUTTON: - X: PARENT_RIGHT - 140 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Cancel - Font: Bold - Key: escape - -Background@INSTALL_FROMCD_PANEL: - Logic: InstallFromCDLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Installing from CD - Align: Center - Font: Bold - Container@INSTALLING: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Visible: false - Children: - ProgressBar@PROGRESS_BAR: - X: 50 - Y: 55 - Width: PARENT_RIGHT - 100 - Height: 25 - Label@STATUS_LABEL: - X: 50 - Y: 80 - Width: PARENT_RIGHT - 100 - Height: 25 - Align: Left - Container@INSERT_DISK: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Visible: false - Children: - Label@INFO: - Y: 50 - Width: PARENT_RIGHT - Height: 25 - Text: Disk not found. - Align: Center - Label@INFO2: - Y: 70 - Width: PARENT_RIGHT - Height: 25 - Text: Please insert one of the Red Alert install CDs then click Retry. - Align: Center - Button@RETRY_BUTTON: - X: PARENT_RIGHT - 280 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Retry - Font: Bold - Key: return - Button@BACK_BUTTON: - X: PARENT_RIGHT - 140 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Back - Font: Bold - Key: escape - diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 3a1495b227..d3b8970280 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -77,7 +77,6 @@ Assemblies: ./mods/cnc/OpenRA.Mods.Cnc.dll ChromeLayout: - ./mods/ra/chrome/install.yaml ./mods/ra/chrome/ingame.yaml ./mods/ra/chrome/ingame-chat.yaml ./mods/ra/chrome/ingame-diplomacy.yaml diff --git a/mods/ts/chrome/install.yaml b/mods/ts/chrome/install.yaml deleted file mode 100644 index dd7fa244bd..0000000000 --- a/mods/ts/chrome/install.yaml +++ /dev/null @@ -1,160 +0,0 @@ -Background@INSTALL_PANEL: - Logic: InstallLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Install Required - Align: Center - Font: Bold - Label@DESC1: - X: 0 - Y: 50 - Width: PARENT_RIGHT - Height: 25 - Text: OpenRA requires the original Tiberian Sun game content. - Align: Center - Label@DESC2: - X: 0 - Y: 70 - Width: PARENT_RIGHT - Height: 25 - Text: Content can be downloaded, or copied from the install CD. - Align: Center - Button@DOWNLOAD_BUTTON: - X: 20 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Download - Font: Bold - Button@INSTALL_BUTTON: - X: 140 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Use CD - Font: Bold - Button@BACK_BUTTON: - X: PARENT_RIGHT - 130 - Y: PARENT_BOTTOM - 45 - Width: 110 - Height: 25 - Text: Back - Font: Bold - -Background@INSTALL_DOWNLOAD_PANEL: - Logic: DownloadPackagesLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Downloading Tiberian Sun Content - Align: Center - Font: Bold - ProgressBar@PROGRESS_BAR: - X: 50 - Y: 55 - Width: PARENT_RIGHT - 100 - Height: 25 - Label@STATUS_LABEL: - X: 50 - Y: 80 - Width: PARENT_RIGHT - 100 - Height: 25 - Align: Left - Button@RETRY_BUTTON: - X: PARENT_RIGHT - 280 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Visible: false - Text: Retry - Font: Bold - Key: return - Button@CANCEL_BUTTON: - X: PARENT_RIGHT - 140 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Cancel - Font: Bold - Key: escape - -Background@INSTALL_FROMCD_PANEL: - Logic: InstallFromCDLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 500 - Height: 160 - Children: - Label@TITLE: - X: 0 - Y: 20 - Width: PARENT_RIGHT - Height: 25 - Text: Installing from CD - Align: Center - Font: Bold - Container@INSTALLING: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Visible: false - Children: - ProgressBar@PROGRESS_BAR: - X: 50 - Y: 55 - Width: PARENT_RIGHT - 100 - Height: 25 - Label@STATUS_LABEL: - X: 50 - Y: 80 - Width: PARENT_RIGHT - 100 - Height: 25 - Align: Left - Container@INSERT_DISK: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Visible: false - Children: - Label@INFO: - Y: 50 - Width: PARENT_RIGHT - Height: 25 - Text: Disk not found. - Align: Center - Label@INFO2: - Y: 70 - Width: PARENT_RIGHT - Height: 25 - Text: Please insert one of the Tiberian Sun install CDs then click Retry. - Align: Center - Button@RETRY_BUTTON: - X: PARENT_RIGHT - 280 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Retry - Font: Bold - Key: return - Button@BACK_BUTTON: - X: PARENT_RIGHT - 140 - Y: PARENT_BOTTOM - 45 - Width: 120 - Height: 25 - Text: Back - Font: Bold - Key: escape - diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 64e30242ef..aa5f572363 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -131,7 +131,6 @@ Assemblies: ./mods/ts/OpenRA.Mods.TS.dll ChromeLayout: - ./mods/ts/chrome/install.yaml ./mods/ra/chrome/ingame.yaml ./mods/ra/chrome/ingame-chat.yaml ./mods/ra/chrome/ingame-diplomacy.yaml