diff --git a/OpenRA.Game/FileSystem/InstallShieldPackage.cs b/OpenRA.Game/FileSystem/InstallShieldPackage.cs index 9e619609c6..240cb88475 100644 --- a/OpenRA.Game/FileSystem/InstallShieldPackage.cs +++ b/OpenRA.Game/FileSystem/InstallShieldPackage.cs @@ -17,8 +17,19 @@ namespace OpenRA.FileSystem { public sealed class InstallShieldPackage : IReadOnlyPackage { - readonly Dictionary index = new Dictionary(); - readonly List filenames; + struct Entry + { + public readonly uint Offset; + public readonly uint Length; + + public Entry(uint offset, uint length) + { + Offset = offset; + Length = length; + } + } + + readonly Dictionary index = new Dictionary(); readonly Stream s; readonly long dataStart = 255; readonly int priority; @@ -29,40 +40,45 @@ namespace OpenRA.FileSystem this.filename = filename; this.priority = priority; - filenames = new List(); - s = context.Open(filename); try { // Parse package header - var reader = new BinaryReader(s); - var signature = reader.ReadUInt32(); + var signature = s.ReadUInt32(); if (signature != 0x8C655D13) throw new InvalidDataException("Not an Installshield package"); - reader.ReadBytes(8); - /*var FileCount = */reader.ReadUInt16(); - reader.ReadBytes(4); - /*var ArchiveSize = */reader.ReadUInt32(); - reader.ReadBytes(19); - var tocAddress = reader.ReadInt32(); - reader.ReadBytes(4); - var dirCount = reader.ReadUInt16(); + s.Position += 8; + /*var FileCount = */s.ReadUInt16(); + s.Position += 4; + /*var ArchiveSize = */s.ReadUInt32(); + s.Position += 19; + var tocAddress = s.ReadInt32(); + s.Position += 4; + var dirCount = s.ReadUInt16(); // Parse the directory list - s.Seek(tocAddress, SeekOrigin.Begin); - var tocReader = new BinaryReader(s); - - var fileCountInDirs = new List(); + s.Position = tocAddress; // Parse directories + var directories = new Dictionary(); for (var i = 0; i < dirCount; i++) - fileCountInDirs.Add(ParseDirectory(tocReader)); + { + // Parse directory header + var fileCount = s.ReadUInt16(); + var chunkSize = s.ReadUInt16(); + var nameLength = s.ReadUInt16(); + var dirName = s.ReadASCII(nameLength); + + // Skip to the end of the chunk + s.ReadBytes(chunkSize - nameLength - 6); + directories.Add(dirName, fileCount); + } // Parse files - foreach (var fileCount in fileCountInDirs) - for (var i = 0; i < fileCount; i++) - ParseFile(reader); + foreach (var dir in directories) + for (var i = 0; i < dir.Value; i++) + ParseFile(s, dir.Key); } catch { @@ -71,44 +87,29 @@ namespace OpenRA.FileSystem } } - static uint ParseDirectory(BinaryReader reader) - { - // Parse directory header - var fileCount = reader.ReadUInt16(); - var chunkSize = reader.ReadUInt16(); - var nameLength = reader.ReadUInt16(); - reader.ReadChars(nameLength); // var DirName = new String(reader.ReadChars(NameLength)); - - // Skip to the end of the chunk - reader.ReadBytes(chunkSize - nameLength - 6); - return fileCount; - } - uint accumulatedData = 0; - void ParseFile(BinaryReader reader) + void ParseFile(Stream s, string dirName) { - reader.ReadBytes(7); - var compressedSize = reader.ReadUInt32(); - reader.ReadBytes(12); - var chunkSize = reader.ReadUInt16(); - reader.ReadBytes(4); - var nameLength = reader.ReadByte(); - var fileName = new string(reader.ReadChars(nameLength)); + s.Position += 7; + var compressedSize = s.ReadUInt32(); + s.Position += 12; + var chunkSize = s.ReadUInt16(); + s.Position += 4; + var nameLength = s.ReadByte(); + var fileName = dirName + "\\" + s.ReadASCII(nameLength); - var hash = PackageEntry.HashFilename(fileName, PackageHashType.Classic); - if (!index.ContainsKey(hash)) - index.Add(hash, new PackageEntry(hash, accumulatedData, compressedSize)); - filenames.Add(fileName); + // Use index syntax to overwrite any duplicate entries with the last value + index[fileName] = new Entry(accumulatedData, compressedSize); accumulatedData += compressedSize; // Skip to the end of the chunk - reader.ReadBytes(chunkSize - nameLength - 30); + s.Position += chunkSize - nameLength - 30; } - public Stream GetContent(uint hash) + public Stream GetContent(string filename) { - PackageEntry e; - if (!index.TryGetValue(hash, out e)) + Entry e; + if (!index.TryGetValue(filename, out e)) return null; s.Seek(dataStart + e.Offset, SeekOrigin.Begin); @@ -117,19 +118,14 @@ namespace OpenRA.FileSystem return new MemoryStream(Blast.Decompress(data)); } - public Stream GetContent(string filename) - { - return GetContent(PackageEntry.HashFilename(filename, PackageHashType.Classic)); - } - public IEnumerable AllFileNames() { - return filenames; + return index.Keys; } public bool Exists(string filename) { - return index.ContainsKey(PackageEntry.HashFilename(filename, PackageHashType.Classic)); + return index.ContainsKey(filename); } public int Priority { get { return 2000 + priority; } } diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 17177eae48..26c69c7625 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -146,13 +146,11 @@ 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 - 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 DiskTestFiles: conquer.mix, desert.mix, install/setup.z PackageToExtractFromCD: install/setup.z ExtractFilesFromCD: - .: speech.mix, tempicnh.mix, transit.mix + .: C&C95\SPEECH.MIX, C&C95\TEMPICNH.MIX, C&C95\TRANSIT.MIX CopyFilesFromCD: .: conquer.mix, desert.mix, general.mix, scores.mix, sounds.mix, temperat.mix, winter.mix ShippedSoundtracks: 4 diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index 2bace6adeb..673230bf89 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -137,8 +137,8 @@ ContentInstaller: PackageToExtractFromCD: setup/setup.z OverwriteFiles: False ExtractFilesFromCD: - .: SOUND.RS, DATA.R8, MOUSE.R8, BLOXBASE.R8, BLOXBAT.R8, BLOXBGBS.R8, BLOXICE.R8, BLOXTREE.R8, BLOXWAST.R8, PALETTE.BIN - 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 + .: DUNE\Data\GAMESFX\SOUND.RS, DUNE\Data\DATA.R8, DUNE\Data\MOUSE.R8, DUNE\Data\BLOXBASE.R8, DUNE\Data\BLOXBAT.R8, DUNE\Data\BLOXBGBS.R8, DUNE\Data\BLOXICE.R8, DUNE\Data\BLOXTREE.R8, DUNE\Data\BLOXWAST.R8, DUNE\Data\bin\PALETTE.BIN + GAMESFX: DUNE\Data\GAMESFX\A_ECONF1.AUD, DUNE\Data\GAMESFX\A_ECONF2.AUD, DUNE\Data\GAMESFX\A_ECONF3.AUD, DUNE\Data\GAMESFX\A_ESEL1.AUD, DUNE\Data\GAMESFX\A_ESEL2.AUD, DUNE\Data\GAMESFX\A_ESEL3.AUD, DUNE\Data\GAMESFX\A_FCONF1.AUD, DUNE\Data\GAMESFX\A_FCONF2.AUD, DUNE\Data\GAMESFX\A_FCONF3.AUD, DUNE\Data\GAMESFX\A_FCONF4.AUD, DUNE\Data\GAMESFX\A_FSEL1.AUD, DUNE\Data\GAMESFX\A_FSEL2.AUD, DUNE\Data\GAMESFX\A_FSEL3.AUD, DUNE\Data\GAMESFX\A_FSEL4.AUD, DUNE\Data\GAMESFX\AI_1MIN.AUD, DUNE\Data\GAMESFX\AI_2MIN.AUD, DUNE\Data\GAMESFX\AI_3MIN.AUD, DUNE\Data\GAMESFX\AI_4MIN.AUD, DUNE\Data\GAMESFX\AI_5MIN.AUD, DUNE\Data\GAMESFX\AI_ABORT.AUD, DUNE\Data\GAMESFX\AI_ATACK.AUD, DUNE\Data\GAMESFX\AI_BDRDY.AUD, DUNE\Data\GAMESFX\AI_BLOST.AUD, DUNE\Data\GAMESFX\AI_BUILD.AUD, DUNE\Data\GAMESFX\AI_CANCL.AUD, DUNE\Data\GAMESFX\AI_CAPT.AUD, DUNE\Data\GAMESFX\A_ICONF1.AUD, DUNE\Data\GAMESFX\A_ICONF2.AUD, DUNE\Data\GAMESFX\A_ICONF3.AUD, DUNE\Data\GAMESFX\AI_DHRDY.AUD, DUNE\Data\GAMESFX\AI_DPLOY.AUD, DUNE\Data\GAMESFX\AI_ENEMY.AUD, DUNE\Data\GAMESFX\AI_GANEW.AUD, DUNE\Data\GAMESFX\AI_GLOAD.AUD, DUNE\Data\GAMESFX\AI_GSAVE.AUD, DUNE\Data\GAMESFX\AI_GUARD.AUD, DUNE\Data\GAMESFX\AI_HATTK.AUD, DUNE\Data\GAMESFX\AI_HOLD.AUD, DUNE\Data\GAMESFX\AI_LAUNC.AUD, DUNE\Data\GAMESFX\AI_MAP1A.AUD, DUNE\Data\GAMESFX\AI_MAP1B.AUD, DUNE\Data\GAMESFX\AI_MAP1C.AUD, DUNE\Data\GAMESFX\AI_MAP2A.AUD, DUNE\Data\GAMESFX\AI_MAP2B.AUD, DUNE\Data\GAMESFX\AI_MAP2C.AUD, DUNE\Data\GAMESFX\AI_MAP3A.AUD, DUNE\Data\GAMESFX\AI_MAP4A.AUD, DUNE\Data\GAMESFX\AI_MAP5A.AUD, DUNE\Data\GAMESFX\AI_MAP6A.AUD, DUNE\Data\GAMESFX\AI_MAP7A.AUD, DUNE\Data\GAMESFX\AI_MAP8A.AUD, DUNE\Data\GAMESFX\AI_MAP9A.AUD, DUNE\Data\GAMESFX\AI_MEND.AUD, DUNE\Data\GAMESFX\AI_MFAIL.AUD, DUNE\Data\GAMESFX\AI_MONEY.AUD, DUNE\Data\GAMESFX\AI_MWIN.AUD, DUNE\Data\GAMESFX\AI_NEWOP.AUD, DUNE\Data\GAMESFX\AI_NROOM.AUD, DUNE\Data\GAMESFX\AI_ORDER.AUD, DUNE\Data\GAMESFX\AI_PLACE.AUD, DUNE\Data\GAMESFX\AI_POWER.AUD, DUNE\Data\GAMESFX\AI_PREP.AUD, DUNE\Data\GAMESFX\AI_PRMRY.AUD, DUNE\Data\GAMESFX\AI_REINF.AUD, DUNE\Data\GAMESFX\AI_RUN.AUD, DUNE\Data\GAMESFX\A_ISEL1.AUD, DUNE\Data\GAMESFX\A_ISEL2.AUD, DUNE\Data\GAMESFX\A_ISEL3.AUD, DUNE\Data\GAMESFX\AI_SELL.AUD, DUNE\Data\GAMESFX\AI_SILOS.AUD, DUNE\Data\GAMESFX\AI_SPORT.AUD, DUNE\Data\GAMESFX\AI_TRAIN.AUD, DUNE\Data\GAMESFX\AI_ULOST.AUD, DUNE\Data\GAMESFX\AI_UNRDY.AUD, DUNE\Data\GAMESFX\AI_UPGOP.AUD, DUNE\Data\GAMESFX\AI_UPGRD.AUD, DUNE\Data\GAMESFX\AI_WATTK.AUD, DUNE\Data\GAMESFX\AI_WSIGN.AUD, DUNE\Data\GAMESFX\A_VCONF1.AUD, DUNE\Data\GAMESFX\A_VCONF2.AUD, DUNE\Data\GAMESFX\A_VCONF3.AUD, DUNE\Data\GAMESFX\A_VSEL1.AUD, DUNE\Data\GAMESFX\A_VSEL2.AUD, DUNE\Data\GAMESFX\A_VSEL3.AUD, DUNE\Data\GAMESFX\G_SCONF1.AUD, DUNE\Data\GAMESFX\G_SCONF2.AUD, DUNE\Data\GAMESFX\G_SCONF3.AUD, DUNE\Data\GAMESFX\G_SSEL1.AUD, DUNE\Data\GAMESFX\G_SSEL2.AUD, DUNE\Data\GAMESFX\G_SSEL3.AUD, DUNE\Data\GAMESFX\H_ECONF1.AUD, DUNE\Data\GAMESFX\H_ECONF2.AUD, DUNE\Data\GAMESFX\H_ECONF3.AUD, DUNE\Data\GAMESFX\H_ESEL1.AUD, DUNE\Data\GAMESFX\H_ESEL2.AUD, DUNE\Data\GAMESFX\H_ESEL3.AUD, DUNE\Data\GAMESFX\HI_1MIN.AUD, DUNE\Data\GAMESFX\HI_2MIN.AUD, DUNE\Data\GAMESFX\HI_3MIN.AUD, DUNE\Data\GAMESFX\HI_4MIN.AUD, DUNE\Data\GAMESFX\HI_5MIN.AUD, DUNE\Data\GAMESFX\HI_ABORT.AUD, DUNE\Data\GAMESFX\HI_ATACK.AUD, DUNE\Data\GAMESFX\HI_BDRDY.AUD, DUNE\Data\GAMESFX\HI_BLOST.AUD, DUNE\Data\GAMESFX\HI_BUILD.AUD, DUNE\Data\GAMESFX\HI_CANCL.AUD, DUNE\Data\GAMESFX\HI_CAPT.AUD, DUNE\Data\GAMESFX\H_ICONF1.AUD, DUNE\Data\GAMESFX\H_ICONF2.AUD, DUNE\Data\GAMESFX\H_ICONF3.AUD, DUNE\Data\GAMESFX\HI_DHRDY.AUD, DUNE\Data\GAMESFX\HI_DPLOY.AUD, DUNE\Data\GAMESFX\HI_ENEMY.AUD, DUNE\Data\GAMESFX\HI_GANEW.AUD, DUNE\Data\GAMESFX\HI_GLOAD.AUD, DUNE\Data\GAMESFX\HI_GSAVE.AUD, DUNE\Data\GAMESFX\HI_GUARD.AUD, DUNE\Data\GAMESFX\HI_HATTK.AUD, DUNE\Data\GAMESFX\HI_HOLD.AUD, DUNE\Data\GAMESFX\HI_LAUNC.AUD, DUNE\Data\GAMESFX\HI_MAP1A.AUD, DUNE\Data\GAMESFX\HI_MAP1B.AUD, DUNE\Data\GAMESFX\HI_MAP1C.AUD, DUNE\Data\GAMESFX\HI_MAP2A.AUD, DUNE\Data\GAMESFX\HI_MAP2B.AUD, DUNE\Data\GAMESFX\HI_MAP2C.AUD, DUNE\Data\GAMESFX\HI_MAP3A.AUD, DUNE\Data\GAMESFX\HI_MAP3B.AUD, DUNE\Data\GAMESFX\HI_MAP4A.AUD, DUNE\Data\GAMESFX\HI_MAP4B.AUD, DUNE\Data\GAMESFX\HI_MAP5A.AUD, DUNE\Data\GAMESFX\HI_MAP6A.AUD, DUNE\Data\GAMESFX\HI_MAP6B.AUD, DUNE\Data\GAMESFX\HI_MAP7A.AUD, DUNE\Data\GAMESFX\HI_MAP9A.AUD, DUNE\Data\GAMESFX\HI_MAP9.AUD, DUNE\Data\GAMESFX\HI_MEND.AUD, DUNE\Data\GAMESFX\HI_MFAIL.AUD, DUNE\Data\GAMESFX\HI_MONEY.AUD, DUNE\Data\GAMESFX\HI_MWIN.AUD, DUNE\Data\GAMESFX\HI_NEWOP.AUD, DUNE\Data\GAMESFX\HI_NROOM.AUD, DUNE\Data\GAMESFX\HI_ORDER.AUD, DUNE\Data\GAMESFX\HI_PLACE.AUD, DUNE\Data\GAMESFX\HI_POWER.AUD, DUNE\Data\GAMESFX\HI_PREP.AUD, DUNE\Data\GAMESFX\HI_PRMRY.AUD, DUNE\Data\GAMESFX\HI_REINF.AUD, DUNE\Data\GAMESFX\HI_RUN.AUD, DUNE\Data\GAMESFX\H_ISEL1.AUD, DUNE\Data\GAMESFX\H_ISEL2.AUD, DUNE\Data\GAMESFX\H_ISEL3.AUD, DUNE\Data\GAMESFX\HI_SELL.AUD, DUNE\Data\GAMESFX\HI_SILOS.AUD, DUNE\Data\GAMESFX\HI_SPORT.AUD, DUNE\Data\GAMESFX\HI_TRAIN.AUD, DUNE\Data\GAMESFX\HI_ULOST.AUD, DUNE\Data\GAMESFX\HI_UNRDY.AUD, DUNE\Data\GAMESFX\HI_UPGOP.AUD, DUNE\Data\GAMESFX\HI_UPGRD.AUD, DUNE\Data\GAMESFX\HI_WATTK.AUD, DUNE\Data\GAMESFX\HI_WSIGN.AUD, DUNE\Data\GAMESFX\H_VCONF1.AUD, DUNE\Data\GAMESFX\H_VCONF2.AUD, DUNE\Data\GAMESFX\H_VCONF3.AUD, DUNE\Data\GAMESFX\H_VSEL1.AUD, DUNE\Data\GAMESFX\H_VSEL2.AUD, DUNE\Data\GAMESFX\H_VSEL3.AUD, DUNE\Data\GAMESFX\O_ECONF1.AUD, DUNE\Data\GAMESFX\O_ECONF2.AUD, DUNE\Data\GAMESFX\O_ECONF3.AUD, DUNE\Data\GAMESFX\O_ESEL1.AUD, DUNE\Data\GAMESFX\O_ESEL2.AUD, DUNE\Data\GAMESFX\O_ESEL3.AUD, DUNE\Data\GAMESFX\OI_1MIN.AUD, DUNE\Data\GAMESFX\OI_2MIN.AUD, DUNE\Data\GAMESFX\OI_3MIN.AUD, DUNE\Data\GAMESFX\OI_4MIN.AUD, DUNE\Data\GAMESFX\OI_5MIN.AUD, DUNE\Data\GAMESFX\OI_ABORT.AUD, DUNE\Data\GAMESFX\OI_ATACK.AUD, DUNE\Data\GAMESFX\OI_BDRDY.AUD, DUNE\Data\GAMESFX\OI_BLOST.AUD, DUNE\Data\GAMESFX\OI_BUILD.AUD, DUNE\Data\GAMESFX\OI_CANCL.AUD, DUNE\Data\GAMESFX\OI_CAPT.AUD, DUNE\Data\GAMESFX\O_ICONF1.AUD, DUNE\Data\GAMESFX\O_ICONF2.AUD, DUNE\Data\GAMESFX\O_ICONF3.AUD, DUNE\Data\GAMESFX\OI_DHRDY.AUD, DUNE\Data\GAMESFX\OI_DPLOY.AUD, DUNE\Data\GAMESFX\OI_ENEMY.AUD, DUNE\Data\GAMESFX\OI_GANEW.AUD, DUNE\Data\GAMESFX\OI_GLOAD.AUD, DUNE\Data\GAMESFX\OI_GSAVE.AUD, DUNE\Data\GAMESFX\OI_GUARD.AUD, DUNE\Data\GAMESFX\OI_HATTK.AUD, DUNE\Data\GAMESFX\OI_HOLD.AUD, DUNE\Data\GAMESFX\OI_LAUNC.AUD, DUNE\Data\GAMESFX\OI_MAP1A.AUD, DUNE\Data\GAMESFX\OI_MAP1B.AUD, DUNE\Data\GAMESFX\OI_MAP1C.AUD, DUNE\Data\GAMESFX\OI_MAP2A.AUD, DUNE\Data\GAMESFX\OI_MAP2B.AUD, DUNE\Data\GAMESFX\OI_MAP2C.AUD, DUNE\Data\GAMESFX\OI_MAP3A.AUD, DUNE\Data\GAMESFX\OI_MAP4A.AUD, DUNE\Data\GAMESFX\OI_MAP5A.AUD, DUNE\Data\GAMESFX\OI_MAP6A.AUD, DUNE\Data\GAMESFX\OI_MAP7A.AUD, DUNE\Data\GAMESFX\OI_MAP8A.AUD, DUNE\Data\GAMESFX\OI_MAP9A.AUD, DUNE\Data\GAMESFX\OI_MEND.AUD, DUNE\Data\GAMESFX\OI_MFAIL.AUD, DUNE\Data\GAMESFX\OI_MONEY.AUD, DUNE\Data\GAMESFX\OI_MWIN.AUD, DUNE\Data\GAMESFX\OI_NEWOP.AUD, DUNE\Data\GAMESFX\OI_NROOM.AUD, DUNE\Data\GAMESFX\OI_ORDER.AUD, DUNE\Data\GAMESFX\OI_PLACE.AUD, DUNE\Data\GAMESFX\OI_POWER.AUD, DUNE\Data\GAMESFX\OI_PREP.AUD, DUNE\Data\GAMESFX\OI_PRMRY.AUD, DUNE\Data\GAMESFX\OI_REINF.AUD, DUNE\Data\GAMESFX\OI_RUN.AUD, DUNE\Data\GAMESFX\O_ISEL1.AUD, DUNE\Data\GAMESFX\O_ISEL2.AUD, DUNE\Data\GAMESFX\O_ISEL3.AUD, DUNE\Data\GAMESFX\OI_SELL.AUD, DUNE\Data\GAMESFX\OI_SILOS.AUD, DUNE\Data\GAMESFX\OI_SPORT.AUD, DUNE\Data\GAMESFX\OI_TRAIN.AUD, DUNE\Data\GAMESFX\OI_ULOST.AUD, DUNE\Data\GAMESFX\OI_UNRDY.AUD, DUNE\Data\GAMESFX\OI_UPGOP.AUD, DUNE\Data\GAMESFX\OI_UPGRD.AUD, DUNE\Data\GAMESFX\OI_WATTK.AUD, DUNE\Data\GAMESFX\OI_WSIGN.AUD, DUNE\Data\GAMESFX\O_SCONF1.AUD, DUNE\Data\GAMESFX\O_SCONF2.AUD, DUNE\Data\GAMESFX\O_SCONF3.AUD, DUNE\Data\GAMESFX\O_SSEL1.AUD, DUNE\Data\GAMESFX\O_SSEL2.AUD, DUNE\Data\GAMESFX\O_SSEL3.AUD, DUNE\Data\GAMESFX\O_VCONF1.AUD, DUNE\Data\GAMESFX\O_VCONF2.AUD, DUNE\Data\GAMESFX\O_VCONF3.AUD, DUNE\Data\GAMESFX\O_VSEL1.AUD, DUNE\Data\GAMESFX\O_VSEL2.AUD, DUNE\Data\GAMESFX\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 Music: 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