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