diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index 77dd080e1f..21d51bd481 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -89,7 +89,6 @@ - diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncInstallMusicLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncInstallMusicLogic.cs deleted file mode 100644 index 35bff5fc70..0000000000 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncInstallMusicLogic.cs +++ /dev/null @@ -1,57 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2014 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; -using System.IO; -using System.Linq; -using OpenRA.FileSystem; -using OpenRA.Mods.RA.Widgets.Logic; -using OpenRA.Widgets; - -namespace OpenRA.Mods.Cnc.Widgets.Logic -{ - public class CncInstallMusicLogic - { - [ObjectCreator.UseCtor] - public CncInstallMusicLogic(Widget widget, Ruleset modRules, Action onExit) - { - var installButton = widget.GetOrNull("INSTALL_BUTTON"); - if (installButton != null) - { - Action afterInstall = () => - { - try - { - var path = new string[] { Platform.SupportDir, "Content", Game.modData.Manifest.Mod.Id }.Aggregate(Path.Combine); - GlobalFileSystem.Mount(Path.Combine(path, "scores.mix")); - GlobalFileSystem.Mount(Path.Combine(path, "transit.mix")); - - modRules.Music.Do(m => m.Value.Reload()); - - var musicPlayerLogic = (MusicPlayerLogic)installButton.Parent.LogicObject; - musicPlayerLogic.BuildMusicTable(); - } - catch (Exception e) - { - Log.Write("debug", "Mounting the new mixfile and rebuild of scores list failed:\n{0}", e); - } - }; - - installButton.OnClick = () => - Ui.OpenWindow("INSTALL_MUSIC_PANEL", new WidgetArgs() { - { "afterInstall", afterInstall }, - { "filesToCopy", new[] { "SCORES.MIX" } }, - { "filesToExtract", new[] { "transit.mix" } }, - }); - installButton.IsVisible = () => modRules.InstalledMusic.ToArray().Length < 3; // HACK around music being split between transit.mix and scores.mix - } - } - } -} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index d6f1e2b4b2..3cd96f7a4a 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -519,6 +519,7 @@ + diff --git a/OpenRA.Mods.RA/Widgets/Logic/InstallMusicLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/InstallMusicLogic.cs new file mode 100644 index 0000000000..a528aa0ed5 --- /dev/null +++ b/OpenRA.Mods.RA/Widgets/Logic/InstallMusicLogic.cs @@ -0,0 +1,85 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 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; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using OpenRA.FileSystem; +using OpenRA.Widgets; + +namespace OpenRA.Mods.RA.Widgets.Logic +{ + public class InstallMusicLogic + { + ButtonWidget installButton; + Dictionary installData; + + [ObjectCreator.UseCtor] + public InstallMusicLogic(Widget widget) + { + installData = Game.modData.Manifest.ContentInstaller; + + installButton = widget.GetOrNull("INSTALL_BUTTON"); + if (installButton != null) + { + installButton.OnClick = () => LoadInstallMusicContainer(); + installButton.IsVisible = () => + Rules.InstalledMusic.ToArray().Length <= Exts.ParseIntegerInvariant(installData["ShippedSoundtracks"]); + } + } + + void LoadInstallMusicContainer() + { + var installMusicContainer = Ui.OpenWindow("INSTALL_MUSIC_PANEL", new WidgetArgs()); + + Action after = () => + { + try + { + GlobalFileSystem.LoadFromManifest(Game.modData.Manifest); + Rules.Music.Do(m => m.Value.Reload()); + var musicPlayerLogic = (MusicPlayerLogic)installButton.Parent.LogicObject; + musicPlayerLogic.BuildMusicTable(); + Ui.CloseWindow(); + } + catch (Exception e) + { + Log.Write("debug", "Mounting the new MIX file and rebuild of scores list failed:\n{0}", e); + } + }; + + var cancelButton = installMusicContainer.GetOrNull("CANCEL_BUTTON"); + if (cancelButton != null) + cancelButton.OnClick = () => Ui.CloseWindow(); + + var copyFromDiscButton = installMusicContainer.GetOrNull("COPY_FROM_CD_BUTTON"); + if (copyFromDiscButton != null) + { + copyFromDiscButton.OnClick = () => Ui.OpenWindow("INSTALL_FROMCD_PANEL", new WidgetArgs() { + { "continueLoading", after }, + }); + } + + var downloadButton = installMusicContainer.GetOrNull("DOWNLOAD_BUTTON"); + if (downloadButton != null) + { + downloadButton.IsVisible = () => !string.IsNullOrEmpty(installData["MusicPackageMirrorList"]); + var musicInstallData = new Dictionary { }; + musicInstallData["PackageMirrorList"] = installData["MusicPackageMirrorList"]; + + downloadButton.OnClick = () => Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", new WidgetArgs() { + { "afterInstall", after }, + { "installData", new ReadOnlyDictionary(musicInstallData) }, + }); + } + } + } +} diff --git a/mods/cnc/chrome/music.yaml b/mods/cnc/chrome/music.yaml index 1b632ce6ed..8bc5ee0fc3 100644 --- a/mods/cnc/chrome/music.yaml +++ b/mods/cnc/chrome/music.yaml @@ -170,7 +170,7 @@ Container@MUSIC_PANEL: Height: 35 Text: Back Button@INSTALL_BUTTON: - Logic: CncInstallMusicLogic + Logic: InstallMusicLogic X: 220 Y: 399 Width: 140 @@ -178,7 +178,7 @@ Container@MUSIC_PANEL: Text: Install Music Container@INSTALL_MUSIC_PANEL: - Logic: CncInstallFromCDLogic + Logic: InstallMusicLogic X: (WINDOW_RIGHT - WIDTH)/2 Y: (WINDOW_BOTTOM - 150)/2 Width: 640 @@ -201,52 +201,37 @@ Container@INSTALL_MUSIC_PANEL: 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@MUSIC_DISK_NOT_FOUND: - X: 170 - Y: 35 - Width: PARENT_RIGHT-30 - Height: 25 - Text: Disk not found - Font: Bold - Label@PLEASE_INSERT_MUSIC_DISK: - 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: + Label@INFO: + X: 170 + Y: 35 + Width: PARENT_RIGHT-30 + Height: 25 + Text: The soundtrack is currently unavailable. + Font: Bold + Label@INFO2: + X: 170 + Y: 70 + Width: PARENT_RIGHT-185 + Height: 25 + WordWrap: true + Text: OpenRA can download the music files from the internet, or you can install from the original C&C CDs. + Font: Bold + Button@CANCEL_BUTTON: Key: escape Y: 149 Width: 140 Height: 35 Text: Back - Button@RETRY_BUTTON: + Button@DOWNLOAD_BUTTON: + X: 350 + Y: 149 + Width: 140 + Height: 35 + Text: Download + Button@COPY_FROM_CD_BUTTON: X: 500 Y: 149 Width: 140 Height: 35 - Text: Retry + Text: Use CD diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index edf2f084bc..b9fb40eba7 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -141,6 +141,8 @@ ContentInstaller: PackageToExtractFromCD: INSTALL/SETUP.Z ExtractFilesFromCD: speech.mix, tempicnh.mix, transit.mix CopyFilesFromCD: CONQUER.MIX, DESERT.MIX, SCORES.MIX, SOUNDS.MIX, TEMPERAT.MIX, WINTER.MIX + ShippedSoundtracks: 2 + MusicPackageMirrorList: http://www.openra.net/packages/cnc-music-mirrors.txt ServerTraits: LobbyCommands diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 1d4c4e85ae..12cb686920 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -123,6 +123,8 @@ ContentInstaller: PackageToExtractFromCD: setup/setup.z ExtractFilesFromCD: SOUND.RS, DATA.R8, MOUSE.R8, BLOXBASE.R8, BLOXBAT.R8, BLOXBGBS.R8, BLOXICE.R8, BLOXTREE.R8, BLOXWAST.R8, 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: music/ambush.aud, music/arakatak.aud, music/atregain.aud, music/entordos.aud, music/fightpwr.aud, music/fremen.aud, music/hark_bat.aud, music/landsand.aud, music/options.aud, music/plotting.aud, music/risehark.aud, music/robotix.aud, music/score.aud, music/soldappr.aud, music/spicesct.aud, music/undercon.aud, music/waitgame.aud + ShippedSoundtracks: 1 + MusicPackageMirrorList: ServerTraits: LobbyCommands diff --git a/mods/ra/chrome/musicplayer.yaml b/mods/ra/chrome/musicplayer.yaml index d5dfd42257..f75d890ca9 100644 --- a/mods/ra/chrome/musicplayer.yaml +++ b/mods/ra/chrome/musicplayer.yaml @@ -149,12 +149,70 @@ Background@MUSIC_PANEL: Align: Center Visible: false Text: No Music Installed - Button@BACK_BUTTON: - X: PARENT_RIGHT - 180 + Button@INSTALL_BUTTON: + Logic: InstallMusicLogic + X: 20 Y: PARENT_BOTTOM - 45 - Width: 160 + Width: 120 + Height: 25 + Text: Install Music + Font: Bold + Button@BACK_BUTTON: + X: PARENT_RIGHT - 140 + Y: PARENT_BOTTOM - 45 + Width: 120 Height: 25 Text: Close Font: Bold Key: escape +Background@INSTALL_MUSIC_PANEL: + Logic: InstallMusicLogic + X: (WINDOW_RIGHT - WIDTH)/2 + Y: (WINDOW_BOTTOM - HEIGHT)/2 + Width: 510 + Height: 160 + Children: + Label@TITLE: + X: 0 + Y: 20 + Width: PARENT_RIGHT + Height: 25 + Text: Install Music + Align: Center + Font: Bold + Label@DESC1: + X: 0 + Y: 50 + Width: PARENT_RIGHT + Height: 25 + Text: The soundtrack is currently unavailable. + Align: Center + Label@DESC2: + X: 0 + Y: 70 + Width: PARENT_RIGHT + Height: 25 + Text: Please choose an installation method. + Align: Center + Button@COPY_FROM_CD_BUTTON: + X: 20 + Y: PARENT_BOTTOM - 45 + Width: 110 + Height: 25 + Text: Use CD + Font: Bold + Button@DOWNLOAD_BUTTON: + X: 140 + Y: PARENT_BOTTOM - 45 + Width: 110 + Height: 25 + Text: Download + Font: Bold + Button@CANCEL_BUTTON: + X: PARENT_RIGHT - 130 + Y: PARENT_BOTTOM - 45 + Width: 110 + Height: 25 + Text: Back + Font: Bold diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index bba740abd4..9d25391219 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -139,6 +139,8 @@ ContentInstaller: PackageToExtractFromCD: MAIN.MIX ExtractFilesFromCD: conquer.mix, russian.mix, allies.mix, sounds.mix, scores.mix, snow.mix, interior.mix, temperat.mix CopyFilesFromCD: INSTALL/REDALERT.MIX + ShippedSoundtracks: 1 + MusicPackageMirrorList: http://www.openra.net/packages/ra-music-mirrors.txt ServerTraits: LobbyCommands diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 6445ca0367..cd301c42cb 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -164,6 +164,8 @@ ContentInstaller: PackageToExtractFromCD: ExtractFilesFromCD: CopyFilesFromCD: install/tibsun.mix, scores.mix, multi.mix + ShippedSoundtracks: 2 + MusicPackageMirrorList: ServerTraits: LobbyCommands