Merge pull request #11522 from pchote/more-installers

Support content installation from "C&C The Ultimate Collection" (Origin versions).
Closes #9479
Closes #11524
This commit is contained in:
Matthias Mailänder
2016-06-26 19:42:10 +02:00
committed by GitHub
8 changed files with 1508 additions and 94 deletions

View File

@@ -17,11 +17,12 @@ namespace OpenRA
{
public class ModContent : IGlobalModData
{
public enum SourceType { Disc, Install }
public class ModPackage
{
public readonly string Title;
public readonly string[] TestFiles = { };
public readonly string[] Discs = { };
public readonly string[] Sources = { };
public readonly bool Required;
public readonly string Download;
@@ -37,14 +38,20 @@ namespace OpenRA
}
}
public class ModDisc
public class ModSource
{
public readonly SourceType Type = SourceType.Disc;
// Used to find installation locations for SourceType.Install
public readonly string RegistryKey;
public readonly string RegistryValue;
public readonly string Title;
public readonly Dictionary<string, string> IDFiles;
[FieldLoader.Ignore] public readonly List<MiniYamlNode> Install;
public ModDisc(MiniYaml yaml)
public ModSource(MiniYaml yaml)
{
Title = yaml.Value;
var installNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Install");
@@ -101,18 +108,18 @@ namespace OpenRA
return downloads;
}
[FieldLoader.LoadUsing("LoadDiscs")]
public readonly Dictionary<string, ModDisc> Discs;
[FieldLoader.LoadUsing("LoadSources")]
public readonly Dictionary<string, ModSource> Sources;
static object LoadDiscs(MiniYaml yaml)
static object LoadSources(MiniYaml yaml)
{
var discs = new Dictionary<string, ModDisc>();
var discNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Discs");
if (discNode != null)
foreach (var node in discNode.Value.Nodes)
discs.Add(node.Key, new ModDisc(node.Value));
var sources = new Dictionary<string, ModSource>();
var sourceNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Sources");
if (sourceNode != null)
foreach (var node in sourceNode.Value.Nodes)
sources.Add(node.Key, new ModSource(node.Value));
return discs;
return sources;
}
}
}

View File

@@ -47,6 +47,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
// List Panel
readonly Widget listContainer;
readonly ScrollPanelWidget listPanel;
readonly Widget listHeaderTemplate;
readonly LabelWidget listTemplate;
readonly LabelWidget listLabel;
@@ -84,6 +85,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
listContainer.IsVisible = () => visible == Mode.List;
listPanel = listContainer.Get<ScrollPanelWidget>("LIST_PANEL");
listHeaderTemplate = listPanel.Get("LIST_HEADER_TEMPLATE");
listTemplate = listPanel.Get<LabelWidget>("LIST_TEMPLATE");
listPanel.RemoveChildren();
@@ -104,48 +106,65 @@ namespace OpenRA.Mods.Common.Widgets.Logic
.Where(v => v.DriveType == DriveType.CDRom && v.IsReady)
.Select(v => v.RootDirectory.FullName);
foreach (var kv in content.Discs)
foreach (var kv in content.Sources)
{
message = "Searching for " + kv.Value.Title;
foreach (var volume in volumes)
var path = FindSourcePath(kv.Value, volumes);
if (path != null)
{
if (PathIsDiscMount(volume, kv.Value))
var packages = content.Packages.Values
.Where(p => p.Sources.Contains(kv.Key) && !p.IsInstalled())
.Select(p => p.Title);
// Ignore disc if content is already installed
if (packages.Any())
{
var packages = content.Packages.Values
.Where(p => p.Discs.Contains(kv.Key) && !p.IsInstalled())
.Select(p => p.Title);
// Ignore disc if content is already installed
if (packages.Any())
Game.RunAfterTick(() =>
{
Game.RunAfterTick(() =>
{
ShowList(kv.Value.Title, "The following content packages will be installed:", packages);
ShowContinueCancel(() => InstallFromDisc(volume, kv.Value));
});
ShowList(kv.Value.Title, "The following content packages will be installed:", packages);
ShowContinueCancel(() => InstallFromDisc(path, kv.Value));
});
return;
}
return;
}
}
}
var discTitles = content.Packages.Values
var sources = content.Packages.Values
.Where(p => !p.IsInstalled())
.SelectMany(p => p.Discs)
.Select(d => content.Discs[d].Title)
.SelectMany(p => p.Sources)
.Select(d => content.Sources[d]);
var discs = sources
.Where(s => s.Type == ModContent.SourceType.Disc)
.Select(s => s.Title)
.Distinct();
var options = new Dictionary<string, IEnumerable<string>>()
{
{ "Game Discs", discs },
};
if (Platform.CurrentPlatform == PlatformType.Windows)
{
var installations = sources
.Where(s => s.Type == ModContent.SourceType.Install)
.Select(s => s.Title)
.Distinct();
options.Add("Digital Installs", installations);
}
Game.RunAfterTick(() =>
{
ShowList("Disc Content Not Found", "Please insert or mount one of the following discs and try again", discTitles);
ShowList("Game Content Not Found", "Please insert or install one of the following content sources:", options);
ShowBackRetry(DetectContentDisks);
});
}).Start();
}
void InstallFromDisc(string path, ModContent.ModDisc disc)
void InstallFromDisc(string path, ModContent.ModSource modSource)
{
var message = "";
ShowProgressbar("Installing Content", () => message);
@@ -157,7 +176,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
try
{
foreach (var i in disc.Install)
foreach (var i in modSource.Install)
{
switch (i.Key)
{
@@ -216,7 +235,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
}
default:
Game.Debug("debug", "Unknown installation command {0} - ignoring", i.Key);
Log.Write("debug", "Unknown installation command {0} - ignoring", i.Key);
break;
}
}
@@ -236,7 +255,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Game.RunAfterTick(() =>
{
ShowMessage("Installation Failed", "Refer to install.log in the logs directory for details.");
ShowBackRetry(() => InstallFromDisc(path, disc));
ShowBackRetry(() => InstallFromDisc(path, modSource));
});
}
}).Start();
@@ -351,11 +370,36 @@ namespace OpenRA.Mods.Common.Widgets.Logic
}
}
bool PathIsDiscMount(string path, ModContent.ModDisc disc)
string FindSourcePath(ModContent.ModSource source, IEnumerable<string> volumes)
{
if (source.Type == ModContent.SourceType.Install)
{
if (source.RegistryKey == null)
return null;
if (Platform.CurrentPlatform != PlatformType.Windows)
return null;
var path = Microsoft.Win32.Registry.GetValue(source.RegistryKey, source.RegistryValue, null) as string;
if (path == null)
return null;
return IsValidSourcePath(path, source) ? path : null;
}
if (source.Type == ModContent.SourceType.Disc)
foreach (var volume in volumes)
if (IsValidSourcePath(volume, source))
return volume;
return null;
}
bool IsValidSourcePath(string path, ModContent.ModSource source)
{
try
{
foreach (var kv in disc.IDFiles)
foreach (var kv in source.IDFiles)
{
var filePath = Path.Combine(path, kv.Key);
if (!File.Exists(filePath))
@@ -427,6 +471,40 @@ namespace OpenRA.Mods.Common.Widgets.Logic
panel.Bounds.Height = listContainer.Bounds.Height;
}
void ShowList(string title, string message, Dictionary<string, IEnumerable<string>> groups)
{
visible = Mode.List;
titleLabel.Text = title;
listLabel.Text = message;
listPanel.RemoveChildren();
foreach (var kv in groups)
{
if (kv.Value.Any())
{
var groupTitle = kv.Key;
var headerWidget = listHeaderTemplate.Clone();
var headerTitleWidget = headerWidget.Get<LabelWidget>("LABEL");
headerTitleWidget.GetText = () => groupTitle;
listPanel.AddChild(headerWidget);
}
foreach (var i in kv.Value)
{
var item = i;
var labelWidget = (LabelWidget)listTemplate.Clone();
labelWidget.GetText = () => item;
listPanel.AddChild(labelWidget);
}
}
primaryButton.Bounds.Y += listContainer.Bounds.Height - panel.Bounds.Height;
secondaryButton.Bounds.Y += listContainer.Bounds.Height - panel.Bounds.Height;
panel.Bounds.Y -= (listContainer.Bounds.Height - panel.Bounds.Height) / 2;
panel.Bounds.Height = listContainer.Bounds.Height;
}
void ShowContinueCancel(Action continueAction)
{
primaryButton.OnClick = continueAction;

View File

@@ -86,12 +86,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var requiredWidget = container.Get<LabelWidget>("REQUIRED");
requiredWidget.IsVisible = () => p.Value.Required;
var discWidget = container.Get<ImageWidget>("DISC");
var discs = p.Value.Discs.Select(s => content.Discs[s].Title).Distinct();
var discList = discs.JoinWith("\n");
var isDiscAvailable = discs.Any();
discWidget.GetTooltipText = () => discList;
discWidget.IsVisible = () => isDiscAvailable;
var sourceWidget = container.Get<ImageWidget>("DISC");
var sources = p.Value.Sources.Select(s => content.Sources[s].Title).Distinct();
var sourceList = sources.JoinWith("\n");
var isSourceAvailable = sources.Any();
sourceWidget.GetTooltipText = () => sourceList;
sourceWidget.IsVisible = () => isSourceAvailable;
var installed = p.Value.IsInstalled();
var downloadButton = container.Get<ButtonWidget>("DOWNLOAD");
@@ -115,13 +115,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var requiresDiscWidget = container.Get<LabelWidget>("REQUIRES_DISC");
requiresDiscWidget.IsVisible = () => !installed && !downloadEnabled;
if (!isDiscAvailable)
if (!isSourceAvailable)
requiresDiscWidget.GetText = () => "Manual Install";
scrollPanel.AddChild(container);
}
discAvailable = content.Packages.Values.Any(p => p.Discs.Any() && !p.IsInstalled());
discAvailable = content.Packages.Values.Any(p => p.Sources.Any() && !p.IsInstalled());
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -207,15 +207,15 @@ ModContent:
Packages:
base: Base Game Files
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, ^Content/d2k/PALETTE.BIN
Discs: d2k, d2k-linux
Sources: d2k, d2k-linux
Required: true
Download: basefiles
music: Game Music
TestFiles: ^Content/d2k/Music/AMBUSH.AUD
Discs: d2k, d2k-linux
Sources: d2k, d2k-linux
movies: Campaign Briefings
TestFiles: ^Content/d2k/Movies/A_BR01_E.VQA
Discs: d2k, d2k-linux
Sources: d2k, d2k-linux
Downloads:
basefiles: Base Content
MirrorList: http://www.openra.net/packages/d2k-103-mirrors.txt
@@ -481,7 +481,7 @@ ModContent:
^Content/d2k/GAMESFX/O_VSEL1.AUD: GAMESFX/O_VSEL1.AUD
^Content/d2k/GAMESFX/O_VSEL2.AUD: GAMESFX/O_VSEL2.AUD
^Content/d2k/GAMESFX/O_VSEL3.AUD: GAMESFX/O_VSEL3.AUD
Discs:
Sources:
d2k: Dune 2000 (English)
IDFiles:
MUSIC/AMBUSH.AUD: bd5926a56a83bc0e49f96037e1f909014ac0772a

View File

@@ -3,7 +3,7 @@ Background@CONTENT_PANEL:
X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - HEIGHT) / 2
Width: 500
Height: 268
Height: 290
Background: panel-bg
Children:
Background@RULE:
@@ -29,7 +29,7 @@ Background@CONTENT_PANEL:
X: 30
Y: 84
Width: PARENT_RIGHT - 60
Height: 115
Height: 137
TopBottomSpacing: 4
ItemSpacing: 2
BorderWidth: 2
@@ -89,9 +89,9 @@ Background@CONTENT_PANEL:
X: 30
Y: PARENT_BOTTOM - 52
Background: button-highlighted
Width: 110
Width: 200
Height: 32
Text: Detect Disc
Text: Detect Disc or Installation
Font: Bold
Button@BACK_BUTTON:
X: PARENT_RIGHT - 140
@@ -230,7 +230,7 @@ Background@DISC_INSTALL_PANEL:
Align: Center
Container@LIST:
Width: PARENT_RIGHT
Height: 268
Height: 338
Visible: false
Children:
Label@LIST_MESSAGE:
@@ -242,11 +242,31 @@ Background@DISC_INSTALL_PANEL:
X: 30
Y: 99
Width: PARENT_RIGHT - 60
Height: 100
Height: 170
TopBottomSpacing: 4
ItemSpacing: 2
BorderWidth: 2
Children:
Container@LIST_HEADER_TEMPLATE:
X: 6
Width: PARENT_RIGHT - 12 - 24
Height: 14
Children:
Background@TOP_RULE:
Width: PARENT_RIGHT
Height: 1
Background: panel-rule
Label@LABEL:
Y: 3
Width: PARENT_RIGHT
Height: 10
Font: TinyBold
Align: Center
Background@BOTTOM_RULE:
Y: 16
Width: PARENT_RIGHT
Height: 1
Background: panel-rule
Label@LIST_TEMPLATE:
X: 6
Width: PARENT_RIGHT - 16

View File

@@ -9,6 +9,7 @@ RequiresMods:
Packages:
~^Content/ra
~^Content/ra/music
.
$ra: ra
$cnc: cnc
@@ -26,7 +27,6 @@ Packages:
~snow.mix
~interior.mix
~scores.mix
~scores-counterstrike.mix
~movies1.mix
~movies2.mix
ra|bits
@@ -229,26 +229,29 @@ Migrations:
ModContent:
InstallPromptMessage: Red Alert requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2008 Red Alert freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc.
QuickDownload: basefiles
HeaderMessage: The original game content may be copied from an original game disc,\nor downloaded from an online mirror of the 2008 freeware release.
HeaderMessage: Game content may be extracted from the original game discs or an\nexisting digital install. OpenRA can also download the base game\nfiles from an online mirror of the 2008 freeware release of RA.
Packages:
base: Base Game Files
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
Discs: allied, allied-linux, soviet, soviet-linux
Sources: allied, allied-linux, soviet, soviet-linux, origin
Required: true
Download: basefiles
music: Base Game Music
TestFiles: ^Content/ra/scores.mix
Discs: allied, allied-linux, soviet, soviet-linux
Sources: allied, allied-linux, soviet, soviet-linux, origin
Download: music
movies-allied: Allied Campaign Briefings
TestFiles: ^Content/ra/movies1.mix
Discs: allied, allied-linux
Sources: allied, allied-linux, origin
movies-soviet: Soviet Campaign Briefings
TestFiles: ^Content/ra/movies2.mix
Discs: soviet, soviet-linux
music-covertops: Counterstrike Music
TestFiles: ^Content/ra/scores-counterstrike.mix
Discs: counterstrike, counterstrike-linux
Sources: soviet, soviet-linux, origin
music-counterstrike: Counterstrike Music
TestFiles: ^Content/ra/music/araziod.aud, ^Content/ra/music/backstab.aud, ^Content/ra/music/chaos2.aud, ^Content/ra/music/shut_it.aud, ^Content/ra/music/2nd_hand.aud, ^Content/ra/music/twinmix1.aud, ^Content/ra/music/under3.aud, ^Content/ra/music/vr2.aud,
Sources: counterstrike, counterstrike-linux, origin
music-aftermath: Aftermath Music
TestFiles: ^Content/ra/music/await.aud, ^Content/ra/music/bog.aud, ^Content/ra/music/float_v2.aud, ^Content/ra/music/gloom.aud, ^Content/ra/music/grndwire.aud, ^Content/ra/music/rpt.aud, ^Content/ra/music/search.aud, ^Content/ra/music/traction.aud, ^Content/ra/music/wastelnd.aud
Sources: aftermath, aftermath-linux, origin
Downloads:
basefiles: Base Freeware Content
MirrorList: http://www.openra.net/packages/ra-mirrors.txt
@@ -266,7 +269,7 @@ ModContent:
MirrorList: http://www.openra.net/packages/ra-music-mirrors.txt
Extract:
^Content/ra/scores.mix: scores.mix
Discs:
Sources:
allied: Red Alert 95 (Allied Disc, English)
IDFiles:
eahelp.GID: 13a8a4a1e7d9d6d893c38df5a39262c4689aeba5
@@ -407,21 +410,187 @@ ModContent:
^Content/ra/temperat.mix:
Offset: 499538555
Length: 1038859
counterstrike: Counterstrike Expansion (English)
counterstrike: Counterstrike Expansion Disc (English)
IDFiles:
README.TXT: 0efe8087383f0b159a9633f891fb5f53c6097cd4
SETUP/INSTALL/CSTRIKE.RTP: fae8ba82db71574f6ecd8fb4ff4026fcb65d2adc
Install:
extract-raw: MAIN.MIX
^Content/ra/scores-counterstrike.mix:
Offset: 144899491
Length: 87483135
counterstrike-linux: Counterstrike Expansion (English)
^Content/ra/music/2nd_hand.aud:
Offset: 209070947
Length: 3070092
^Content/ra/music/araziod.aud:
Offset: 212141039
Length: 2941132
^Content/ra/music/backstab.aud:
Offset: 215082171
Length: 3178252
^Content/ra/music/chaos2.aud:
Offset: 218260423
Length: 2860068
^Content/ra/music/shut_it.aud:
Offset: 221120491
Length: 2991979
^Content/ra/music/twinmix1.aud:
Offset: 224112470
Length: 2536972
^Content/ra/music/under3.aud:
Offset: 226649442
Length: 2812788
^Content/ra/music/vr2.aud:
Offset: 229462230
Length: 2920396
counterstrike-linux: Counterstrike Expansion Disc (English)
IDFiles:
readme.txt: 0efe8087383f0b159a9633f891fb5f53c6097cd4
setup/install/cstrike.rtp: fae8ba82db71574f6ecd8fb4ff4026fcb65d2adc
Install:
extract-raw: main.mix
^Content/ra/scores-counterstrike.mix:
Offset: 144899491
Length: 87483135
^Content/ra/music/2nd_hand.aud:
Offset: 209070947
Length: 3070092
^Content/ra/music/araziod.aud:
Offset: 212141039
Length: 2941132
^Content/ra/music/backstab.aud:
Offset: 215082171
Length: 3178252
^Content/ra/music/chaos2.aud:
Offset: 218260423
Length: 2860068
^Content/ra/music/shut_it.aud:
Offset: 221120491
Length: 2991979
^Content/ra/music/twinmix1.aud:
Offset: 224112470
Length: 2536972
^Content/ra/music/under3.aud:
Offset: 226649442
Length: 2812788
^Content/ra/music/vr2.aud:
Offset: 229462230
Length: 2920396
aftermath: Aftermath Expansion Disc (English)
IDFiles:
README.TXT: 9902fb74c019df1b76ff5634e68f0371d790b5e0
SETUP/INSTALL/PATCH.RTP: 5bce93f834f9322ddaa7233242e5b6c7fea0bf17
Install:
extract-raw: MAIN.MIX
^Content/ra/music/await.aud:
Offset: 158698809
Length: 2972788
^Content/ra/music/bog.aud:
Offset: 244351833
Length: 2386955
^Content/ra/music/float_v2.aud:
Offset: 246738788
Length: 3090115
^Content/ra/music/gloom.aud:
Offset: 249828903
Length: 2662851
^Content/ra/music/grndwire.aud:
Offset: 252491754
Length: 2573611
^Content/ra/music/rpt.aud:
Offset: 255065365
Length: 3092259
^Content/ra/music/search.aud:
Offset: 258157624
Length: 3104091
^Content/ra/music/traction.aud:
Offset: 261261715
Length: 2668003
^Content/ra/music/wastelnd.aud:
Offset: 263929718
Length: 2721563
aftermath-linux: Aftermath Expansion Disc (English)
IDFiles:
readme.txt: 9902fb74c019df1b76ff5634e68f0371d790b5e0
setup/install/patch.rtp: 5bce93f834f9322ddaa7233242e5b6c7fea0bf17
Install:
extract-raw: main.mix
^Content/ra/music/await.aud:
Offset: 158698809
Length: 2972788
^Content/ra/music/bog.aud:
Offset: 244351833
Length: 2386955
^Content/ra/music/float_v2.aud:
Offset: 246738788
Length: 3090115
^Content/ra/music/gloom.aud:
Offset: 249828903
Length: 2662851
^Content/ra/music/grndwire.aud:
Offset: 252491754
Length: 2573611
^Content/ra/music/rpt.aud:
Offset: 255065365
Length: 3092259
^Content/ra/music/search.aud:
Offset: 258157624
Length: 3104091
^Content/ra/music/traction.aud:
Offset: 261261715
Length: 2668003
^Content/ra/music/wastelnd.aud:
Offset: 263929718
Length: 2721563
origin: C&C The Ultimate Collection (Origin version, English)
Type: Install
RegistryKey: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\EA Games\Command and Conquer Red Alert
RegistryValue: Install Dir
IDFiles:
RA95Launcher.exe: 22bf7a1f9f1c2498823e3216541e6012f291c2c0
REDALERT.MIX: 0e58f4b54f44f6cd29fecf8cf379d33cf2d4caef
Install:
copy: .
^Content/ra/redalert.mix: REDALERT.MIX
^Content/ra/music/2nd_hand.aud: 2nd_hand.aud
^Content/ra/music/araziod.aud: araziod.aud
^Content/ra/music/await.aud: await.aud
^Content/ra/music/backstab.aud: backstab.aud
^Content/ra/music/bog.aud: bog.aud
^Content/ra/music/chaos2.aud: chaos2.aud
^Content/ra/music/float_v2.aud: float_v2.aud
^Content/ra/music/gloom.aud: gloom.aud
^Content/ra/music/grndwire.aud: grndwire.aud
^Content/ra/music/rpt.aud: rpt.aud
^Content/ra/music/search.aud: search.aud
^Content/ra/music/shut_it.aud: shut_it.aud
^Content/ra/music/traction.aud: traction.aud
^Content/ra/music/twinmix1.aud: twinmix1.aud
^Content/ra/music/under3.aud: under3.aud
^Content/ra/music/vr2.aud: vr2.aud
^Content/ra/music/wastelnd.aud: wastelnd.aud
extract-raw: MAIN.MIX
^Content/ra/movies1.mix:
Offset: 417051805
Length: 404691306
^Content/ra/interior.mix:
Offset: 821743111
Length: 249490
^Content/ra/conquer.mix:
Offset: 840028549
Length: 2192279
^Content/ra/allies.mix:
Offset: 842220828
Length: 319181
^Content/ra/temperat.mix:
Offset: 842540009
Length: 1043672
^Content/ra/sounds.mix:
Offset: 843583681
Length: 1385637
^Content/ra/snow.mix:
Offset: 844969318
Length: 1035716
^Content/ra/scores.mix:
Offset: 846005034
Length: 67742203
^Content/ra/russian.mix:
Offset: 913747237
Length: 274732
^Content/ra/movies2.mix:
Offset: 914022190
Length: 417051731

View File

@@ -26,7 +26,6 @@ Packages:
~movies02.mix
~sidecd01.mix
~sidecd02.mix
~tibsun.mix
~cache.mix
~conquer.mix
~isosnow.mix
@@ -262,16 +261,16 @@ ColorValidator:
ModContent:
InstallPromptMessage: Tiberian Sun requires artwork and audio from the original game.\n\nQuick Install will automatically download this content (without music\nor videos) from a mirror of the 2012 Tiberian Sun freeware release.\n\nAdvanced Install includes options for downloading the music and for\ncopying the videos and other content from an original game disc.
QuickDownload: basefiles
HeaderMessage: The original game content may be copied from an original game disc,\nor downloaded from an online mirror of the 2012 freeware release.
HeaderMessage: Game content may be extracted from the original game discs or an\nexisting digital install. OpenRA can also download the base game\nfiles from an online mirror of the 2012 freeware release of TS.
Packages:
base: Base Game Files
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
Discs: tibsun, tibsun-linux
Sources: tibsun, tibsun-linux, origin
Required: true
Download: basefiles
music: Base Game Music
TestFiles: ^Content/ts/scores.mix
Discs: tibsun, tibsun-linux
Sources: tibsun, tibsun-linux, origin
Download: music
Downloads:
basefiles: Base Freeware Content
@@ -295,7 +294,7 @@ ModContent:
MirrorList: http://www.openra.net/packages/ts-music-mirrors.txt
Extract:
^Content/ts/scores.mix: scores.mix
Discs:
Sources:
tibsun: Tiberan Sun (GDI or Nod Disc, English)
IDFiles:
README.TXT: 45745c4a0c888317ec900208a426472779c42bf7
@@ -396,3 +395,56 @@ ModContent:
^Content/ts/temperat.mix:
Offset: 73056940
Length: 2037606
origin: C&C The Ultimate Collection (Origin version, English)
Type: Install
RegistryKey: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\EA Games\Command and Conquer Tiberian Sun
RegistryValue: Install Dir
IDFiles:
TSLauncher.exe: 0b3e8dfd7cb701868eccef3ba3717a1ced802707
GDFBinary_en_US.dll: 4bb56a449bd0003e7ae67625d90a11ae169319d6
Install:
copy: .
^Content/ts/scores.mix: SCORES.MIX
extract-raw: TIBSUN.MIX
^Content/ts/cache.mix:
Offset: 300
Length: 169176
^Content/ts/conquer.mix:
Offset: 169484
Length: 5700088
^Content/ts/isosnow.mix:
Offset: 5869580
Length: 7624750
^Content/ts/isotemp.mix:
Offset: 13494332
Length: 8617646
^Content/ts/local.mix:
Offset: 22111980
Length: 18044736
^Content/ts/sidec01.mix:
Offset: 40156716
Length: 998476
^Content/ts/sidec02.mix:
Offset: 41155196
Length: 1039996
^Content/ts/snow.mix:
Offset: 56104508
Length: 2087806
^Content/ts/sno.mix:
Offset: 58192316
Length: 7826
^Content/ts/sounds.mix:
Offset: 58200156
Length: 3224136
^Content/ts/speech01.mix:
Offset: 61424300
Length: 6028236
^Content/ts/speech02.mix:
Offset: 67452540
Length: 5596628
^Content/ts/tem.mix:
Offset: 73049180
Length: 7746
^Content/ts/temperat.mix:
Offset: 73056940
Length: 2037606