Merge pull request #9853 from penev92/unglobalFileSystem

Unglobal file system
This commit is contained in:
Oliver Brakmann
2015-12-14 20:52:30 +01:00
49 changed files with 224 additions and 219 deletions

View File

@@ -27,11 +27,13 @@ namespace OpenRA.FileSystem
readonly Stream s;
readonly int bagFilePriority;
readonly Dictionary<uint, IdxEntry> index;
readonly FileSystem context;
public BagFile(string filename, int priority)
public BagFile(FileSystem context, string filename, int priority)
{
bagFilename = filename;
bagFilePriority = priority;
this.context = context;
// A bag file is always accompanied with an .idx counterpart
// For example: audio.bag requires the audio.idx file
@@ -39,14 +41,14 @@ namespace OpenRA.FileSystem
// Build the index and dispose the stream, it is no longer needed after this
List<IdxEntry> entries;
using (var indexStream = GlobalFileSystem.Open(indexFilename))
using (var indexStream = context.Open(indexFilename))
entries = new IdxReader(indexStream).Entries;
index = entries.ToDictionaryWithConflictLog(x => x.Hash,
"{0} (bag format)".F(filename),
null, x => "(offs={0}, len={1})".F(x.Offset, x.Length));
s = GlobalFileSystem.Open(filename);
s = context.Open(filename);
}
public int Priority { get { return 1000 + bagFilePriority; } }
@@ -159,9 +161,9 @@ namespace OpenRA.FileSystem
public IEnumerable<string> AllFileNames()
{
var lookup = new Dictionary<uint, string>();
if (GlobalFileSystem.Exists("global mix database.dat"))
if (context.Exists("global mix database.dat"))
{
var db = new XccGlobalDatabase(GlobalFileSystem.Open("global mix database.dat"));
var db = new XccGlobalDatabase(context.Open("global mix database.dat"));
foreach (var e in db.Entries)
{
var hash = IdxEntry.HashFilename(e, PackageHashType.CRC32);
@@ -175,7 +177,7 @@ namespace OpenRA.FileSystem
public void Write(Dictionary<string, byte[]> contents)
{
GlobalFileSystem.Unmount(this);
context.Unmount(this);
throw new NotImplementedException("Updating bag files unsupported");
}

View File

@@ -22,12 +22,12 @@ namespace OpenRA.FileSystem
readonly Dictionary<string, Entry> entries = new Dictionary<string, Entry>();
readonly Stream s;
public BigFile(string filename, int priority)
public BigFile(FileSystem context, string filename, int priority)
{
Name = filename;
Priority = priority;
s = GlobalFileSystem.Open(filename);
s = context.Open(filename);
try
{
if (s.ReadASCII(4) != "BIGF")

View File

@@ -24,12 +24,12 @@ namespace OpenRA.FileSystem
readonly Dictionary<uint, PackageEntry> index = new Dictionary<uint, PackageEntry>();
public D2kSoundResources(string filename, int priority)
public D2kSoundResources(FileSystem context, string filename, int priority)
{
this.filename = filename;
this.priority = priority;
s = GlobalFileSystem.Open(filename);
s = context.Open(filename);
try
{
filenames = new List<string>();

View File

@@ -17,55 +17,25 @@ using OpenRA.Primitives;
namespace OpenRA.FileSystem
{
public interface IFolder : IDisposable
public class FileSystem
{
Stream GetContent(string filename);
bool Exists(string filename);
IEnumerable<uint> ClassicHashes();
IEnumerable<uint> CrcHashes();
IEnumerable<string> AllFileNames();
void Write(Dictionary<string, byte[]> contents);
int Priority { get; }
string Name { get; }
}
public readonly List<string> FolderPaths = new List<string>();
public readonly List<IFolder> MountedFolders = new List<IFolder>();
public static class GlobalFileSystem
{
public static List<IFolder> MountedFolders = new List<IFolder>();
static Cache<uint, List<IFolder>> classicHashIndex = new Cache<uint, List<IFolder>>(_ => new List<IFolder>());
static Cache<uint, List<IFolder>> crcHashIndex = new Cache<uint, List<IFolder>>(_ => new List<IFolder>());
static readonly Dictionary<string, Assembly> AssemblyCache = new Dictionary<string, Assembly>();
public static List<string> FolderPaths = new List<string>();
int order;
Cache<uint, List<IFolder>> crcHashIndex = new Cache<uint, List<IFolder>>(_ => new List<IFolder>());
Cache<uint, List<IFolder>> classicHashIndex = new Cache<uint, List<IFolder>>(_ => new List<IFolder>());
static void MountInner(IFolder folder)
{
MountedFolders.Add(folder);
foreach (var hash in folder.ClassicHashes())
{
var l = classicHashIndex[hash];
if (!l.Contains(folder))
l.Add(folder);
}
foreach (var hash in folder.CrcHashes())
{
var l = crcHashIndex[hash];
if (!l.Contains(folder))
l.Add(folder);
}
}
static int order = 0;
public static IFolder CreatePackage(string filename, int order, Dictionary<string, byte[]> content)
public IFolder CreatePackage(string filename, int order, Dictionary<string, byte[]> content)
{
if (filename.EndsWith(".mix", StringComparison.InvariantCultureIgnoreCase))
return new MixFile(filename, order, content);
return new MixFile(this, filename, order, content);
if (filename.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
return new ZipFile(filename, order, content);
return new ZipFile(this, filename, order, content);
if (filename.EndsWith(".oramap", StringComparison.InvariantCultureIgnoreCase))
return new ZipFile(filename, order, content);
return new ZipFile(this, filename, order, content);
if (filename.EndsWith(".RS", StringComparison.InvariantCultureIgnoreCase))
throw new NotImplementedException("The creation of .RS archives is unimplemented");
if (filename.EndsWith(".Z", StringComparison.InvariantCultureIgnoreCase))
@@ -80,7 +50,7 @@ namespace OpenRA.FileSystem
return new Folder(filename, order, content);
}
public static IFolder OpenPackage(string filename, string annotation, int order)
public IFolder OpenPackage(string filename, string annotation, int order)
{
if (filename.EndsWith(".mix", StringComparison.InvariantCultureIgnoreCase))
{
@@ -88,30 +58,36 @@ namespace OpenRA.FileSystem
? PackageHashType.Classic
: FieldLoader.GetValue<PackageHashType>("(value)", annotation);
return new MixFile(filename, type, order);
return new MixFile(this, filename, type, order);
}
if (filename.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
return new ZipFile(filename, order);
return new ZipFile(this, filename, order);
if (filename.EndsWith(".oramap", StringComparison.InvariantCultureIgnoreCase))
return new ZipFile(filename, order);
return new ZipFile(this, filename, order);
if (filename.EndsWith(".RS", StringComparison.InvariantCultureIgnoreCase))
return new D2kSoundResources(filename, order);
return new D2kSoundResources(this, filename, order);
if (filename.EndsWith(".Z", StringComparison.InvariantCultureIgnoreCase))
return new InstallShieldPackage(filename, order);
return new InstallShieldPackage(this, filename, order);
if (filename.EndsWith(".PAK", StringComparison.InvariantCultureIgnoreCase))
return new PakFile(filename, order);
return new PakFile(this, filename, order);
if (filename.EndsWith(".big", StringComparison.InvariantCultureIgnoreCase))
return new BigFile(filename, order);
return new BigFile(this, filename, order);
if (filename.EndsWith(".bag", StringComparison.InvariantCultureIgnoreCase))
return new BagFile(filename, order);
return new BagFile(this, filename, order);
if (filename.EndsWith(".hdr", StringComparison.InvariantCultureIgnoreCase))
return new InstallShieldCABExtractor(filename, order);
return new InstallShieldCABExtractor(this, filename, order);
return new Folder(filename, order);
}
public static void Mount(string name, string annotation = null)
public void Mount(IFolder mount)
{
if (!MountedFolders.Contains(mount))
MountedFolders.Add(mount);
}
public void Mount(string name, string annotation = null)
{
var optional = name.StartsWith("~");
if (optional)
@@ -129,7 +105,34 @@ namespace OpenRA.FileSystem
a();
}
public static void UnmountAll()
void MountInner(IFolder folder)
{
MountedFolders.Add(folder);
foreach (var hash in folder.ClassicHashes())
{
var folderList = classicHashIndex[hash];
if (!folderList.Contains(folder))
folderList.Add(folder);
}
foreach (var hash in folder.CrcHashes())
{
var folderList = crcHashIndex[hash];
if (!folderList.Contains(folder))
folderList.Add(folder);
}
}
public bool Unmount(IFolder mount)
{
if (MountedFolders.Contains(mount))
mount.Dispose();
return MountedFolders.RemoveAll(f => f == mount) > 0;
}
public void UnmountAll()
{
foreach (var folder in MountedFolders)
folder.Dispose();
@@ -140,20 +143,7 @@ namespace OpenRA.FileSystem
crcHashIndex = new Cache<uint, List<IFolder>>(_ => new List<IFolder>());
}
public static bool Unmount(IFolder mount)
{
if (MountedFolders.Contains(mount))
mount.Dispose();
return MountedFolders.RemoveAll(f => f == mount) > 0;
}
public static void Mount(IFolder mount)
{
if (!MountedFolders.Contains(mount)) MountedFolders.Add(mount);
}
public static void LoadFromManifest(Manifest manifest)
public void LoadFromManifest(Manifest manifest)
{
UnmountAll();
foreach (var dir in manifest.Folders)
@@ -163,7 +153,7 @@ namespace OpenRA.FileSystem
Mount(pkg.Key, pkg.Value);
}
static Stream GetFromCache(PackageHashType type, string filename)
Stream GetFromCache(PackageHashType type, string filename)
{
var index = type == PackageHashType.CRC32 ? crcHashIndex : classicHashIndex;
var folder = index[PackageEntry.HashFilename(filename, type)]
@@ -176,7 +166,7 @@ namespace OpenRA.FileSystem
return null;
}
public static Stream Open(string filename)
public Stream Open(string filename)
{
Stream s;
if (!TryOpen(filename, out s))
@@ -185,7 +175,7 @@ namespace OpenRA.FileSystem
return s;
}
public static bool TryOpen(string name, out Stream s)
public bool TryOpen(string name, out Stream s)
{
var filename = name;
var foldername = string.Empty;
@@ -229,7 +219,7 @@ namespace OpenRA.FileSystem
return false;
}
public static bool Exists(string name)
public bool Exists(string name)
{
var explicitFolder = name.Contains(':') && !Directory.Exists(Path.GetDirectoryName(name));
if (explicitFolder)
@@ -243,8 +233,6 @@ namespace OpenRA.FileSystem
return MountedFolders.Any(f => f.Exists(name));
}
static Dictionary<string, Assembly> assemblyCache = new Dictionary<string, Assembly>();
public static Assembly ResolveAssembly(object sender, ResolveEventArgs e)
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
@@ -255,15 +243,15 @@ namespace OpenRA.FileSystem
var filename = frags[0] + ".dll";
Assembly a;
if (assemblyCache.TryGetValue(filename, out a))
if (AssemblyCache.TryGetValue(filename, out a))
return a;
if (Exists(filename))
using (var s = Open(filename))
if (Game.ModData.ModFiles.Exists(filename))
using (var s = Game.ModData.ModFiles.Open(filename))
{
var buf = s.ReadBytes((int)s.Length);
a = Assembly.Load(buf);
assemblyCache.Add(filename, a);
AssemblyCache.Add(filename, a);
return a;
}

View File

@@ -0,0 +1,28 @@
#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;
using System.Collections.Generic;
using System.IO;
namespace OpenRA.FileSystem
{
public interface IFolder : IDisposable
{
Stream GetContent(string filename);
bool Exists(string filename);
IEnumerable<uint> ClassicHashes();
IEnumerable<uint> CrcHashes();
IEnumerable<string> AllFileNames();
void Write(Dictionary<string, byte[]> contents);
int Priority { get; }
string Name { get; }
}
}

View File

@@ -14,11 +14,10 @@ using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
namespace OpenRA.FileSystem
{
public class InstallShieldCABExtractor : IDisposable, IFolder
public class InstallShieldCABExtractor : IFolder
{
const uint FileSplit = 0x1;
const uint FileObfuscated = 0x2;
@@ -187,6 +186,7 @@ namespace OpenRA.FileSystem
class CabReader : IDisposable
{
readonly FileSystem context;
readonly FileDescriptor fileDes;
public uint RemainingArchiveStream;
public uint RemainingFileStream;
@@ -195,11 +195,12 @@ namespace OpenRA.FileSystem
ushort volumeNumber;
Stream cabFile;
public CabReader(FileDescriptor fileDes, uint index, string commonName)
public CabReader(FileSystem context, FileDescriptor fileDes, uint index, string commonName)
{
this.fileDes = fileDes;
this.index = index;
this.commonName = commonName;
this.context = context;
volumeNumber = (ushort)((uint)fileDes.Volume - 1u);
RemainingArchiveStream = 0;
if ((fileDes.Flags & FileCompressed) > 0)
@@ -208,7 +209,7 @@ namespace OpenRA.FileSystem
RemainingFileStream = fileDes.ExpandedSize;
cabFile = null;
NextFile();
NextFile(context);
}
public void CopyTo(Stream dest)
@@ -258,7 +259,7 @@ namespace OpenRA.FileSystem
var read = cabFile.Read(outArray, 0, (int)RemainingArchiveStream);
if (RemainingFileStream > RemainingArchiveStream)
{
NextFile();
NextFile(context);
RemainingArchiveStream -= (uint)cabFile.Read(outArray, read, (int)count - read);
}
@@ -271,13 +272,13 @@ namespace OpenRA.FileSystem
cabFile.Dispose();
}
public void NextFile()
void NextFile(FileSystem context)
{
if (cabFile != null)
cabFile.Dispose();
++volumeNumber;
cabFile = GlobalFileSystem.Open("{0}{1}.cab".F(commonName, volumeNumber));
cabFile = context.Open("{0}{1}.cab".F(commonName, volumeNumber));
if (cabFile.ReadUInt32() != 0x28635349)
throw new InvalidDataException("Not an Installshield CAB package");
@@ -329,19 +330,21 @@ namespace OpenRA.FileSystem
readonly Dictionary<uint, string> directoryNames = new Dictionary<uint, string>();
readonly Dictionary<uint, FileDescriptor> fileDescriptors = new Dictionary<uint, FileDescriptor>();
readonly Dictionary<string, uint> fileLookup = new Dictionary<string, uint>();
readonly FileSystem context;
int priority;
string commonName;
public int Priority { get { return priority; } }
public string Name { get { return commonName; } }
public InstallShieldCABExtractor(string hdrFilename, int priority = -1)
public InstallShieldCABExtractor(FileSystem context, string hdrFilename, int priority = -1)
{
var fileGroups = new List<FileGroup>();
var fileGroupOffsets = new List<uint>();
hdrFile = context.Open(hdrFilename);
this.priority = priority;
hdrFile = GlobalFileSystem.Open(hdrFilename);
this.context = context;
// Strips archive number AND file extension
commonName = Regex.Replace(hdrFilename, @"\d*\.[^\.]*$", "");
@@ -472,7 +475,7 @@ namespace OpenRA.FileSystem
var output = new MemoryStream((int)fileDes.ExpandedSize);
using (var reader = new CabReader(fileDes, index, commonName))
using (var reader = new CabReader(context, fileDes, index, commonName))
reader.CopyTo(output);
if (output.Length != fileDes.ExpandedSize)
@@ -497,7 +500,7 @@ namespace OpenRA.FileSystem
if ((fileDes.Flags & FileObfuscated) != 0)
throw new NotImplementedException("Haven't implemented obfuscated files");
using (var reader = new CabReader(fileDes, index, commonName))
using (var reader = new CabReader(context, fileDes, index, commonName))
reader.CopyTo(output);
if (output.Length != fileDes.ExpandedSize)

View File

@@ -24,14 +24,14 @@ namespace OpenRA.FileSystem
readonly int priority;
readonly string filename;
public InstallShieldPackage(string filename, int priority)
public InstallShieldPackage(FileSystem context, string filename, int priority)
{
this.filename = filename;
this.priority = priority;
filenames = new List<string>();
s = GlobalFileSystem.Open(filename);
s = context.Open(filename);
try
{
// Parse package header

View File

@@ -25,14 +25,16 @@ namespace OpenRA.FileSystem
readonly Stream s;
readonly int priority;
readonly string filename;
readonly FileSystem context;
readonly PackageHashType type;
// Save a mix to disk with the given contents
public MixFile(string filename, int priority, Dictionary<string, byte[]> contents)
public MixFile(FileSystem context, string filename, int priority, Dictionary<string, byte[]> contents)
{
this.filename = filename;
this.priority = priority;
this.type = PackageHashType.Classic;
this.context = context;
if (File.Exists(filename))
File.Delete(filename);
@@ -51,13 +53,14 @@ namespace OpenRA.FileSystem
}
}
public MixFile(string filename, PackageHashType type, int priority)
public MixFile(FileSystem context, string filename, PackageHashType type, int priority)
{
this.filename = filename;
this.priority = priority;
this.type = type;
this.context = context;
s = GlobalFileSystem.Open(filename);
s = context.Open(filename);
try
{
// Detect format type
@@ -223,9 +226,9 @@ namespace OpenRA.FileSystem
}
}
if (GlobalFileSystem.Exists("global mix database.dat"))
if (context.Exists("global mix database.dat"))
{
var db = new XccGlobalDatabase(GlobalFileSystem.Open("global mix database.dat"));
var db = new XccGlobalDatabase(context.Open("global mix database.dat"));
foreach (var e in db.Entries)
{
var hash = PackageEntry.HashFilename(e, type);
@@ -249,7 +252,7 @@ namespace OpenRA.FileSystem
{
// Cannot modify existing mixfile - rename existing file and
// create a new one with original content plus modifications
GlobalFileSystem.Unmount(this);
context.Unmount(this);
// TODO: Add existing data to the contents list
if (index.Count > 0)

View File

@@ -28,13 +28,13 @@ namespace OpenRA.FileSystem
readonly Dictionary<string, Entry> index;
readonly Stream stream;
public PakFile(string filename, int priority)
public PakFile(FileSystem context, string filename, int priority)
{
this.filename = filename;
this.priority = priority;
index = new Dictionary<string, Entry>();
stream = GlobalFileSystem.Open(filename);
stream = context.Open(filename);
try
{
index = new Dictionary<string, Entry>();

View File

@@ -28,10 +28,11 @@ namespace OpenRA.FileSystem
ZipConstants.DefaultCodePage = Encoding.Default.CodePage;
}
public ZipFile(string filename, int priority)
public ZipFile(FileSystem context, string filename, int priority)
{
this.filename = filename;
this.priority = priority;
try
{
// Pull the file into memory, don't keep it open.
@@ -44,7 +45,7 @@ namespace OpenRA.FileSystem
}
// Create a new zip with the specified contents.
public ZipFile(string filename, int priority, Dictionary<string, byte[]> contents)
public ZipFile(FileSystem context, string filename, int priority, Dictionary<string, byte[]> contents)
{
this.priority = priority;
this.filename = filename;

View File

@@ -17,7 +17,6 @@ using System.Linq;
using System.Net;
using System.Threading;
using OpenRA.Chat;
using OpenRA.FileSystem;
using OpenRA.Graphics;
using OpenRA.Network;
using OpenRA.Primitives;
@@ -196,7 +195,7 @@ namespace OpenRA
{
Console.WriteLine("Platform is {0}", Platform.CurrentPlatform);
AppDomain.CurrentDomain.AssemblyResolve += GlobalFileSystem.ResolveAssembly;
AppDomain.CurrentDomain.AssemblyResolve += FileSystem.FileSystem.ResolveAssembly;
InitializeSettings(args);
@@ -219,7 +218,6 @@ namespace OpenRA
GeoIP.Initialize();
GlobalFileSystem.Mount(Platform.GameDir); // Needed to access shaders
var renderers = new[] { Settings.Graphics.Renderer, "Default", null };
foreach (var r in renderers)
{
@@ -280,7 +278,11 @@ namespace OpenRA
OrderManager.Dispose();
if (ModData != null)
{
ModData.ModFiles.UnmountAll();
ModData.Dispose();
}
ModData = null;
// Fall back to default if the mod doesn't exist or has missing prerequisites.

View File

@@ -9,7 +9,6 @@
#endregion
using OpenRA.FileFormats;
using OpenRA.FileSystem;
namespace OpenRA.GameRules
{
@@ -36,11 +35,11 @@ namespace OpenRA.GameRules
public void Load()
{
if (!GlobalFileSystem.Exists(Filename))
if (!Game.ModData.ModFiles.Exists(Filename))
return;
Exists = true;
using (var s = GlobalFileSystem.Open(Filename))
using (var s = Game.ModData.ModFiles.Open(Filename))
{
if (Filename.ToLowerInvariant().EndsWith("wav"))
Length = (int)WavLoader.WaveLength(s);

View File

@@ -9,6 +9,7 @@
#endregion
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace OpenRA.Graphics
@@ -110,7 +111,9 @@ namespace OpenRA.Graphics
sheet = cachedSheets[mi.Src];
else
{
sheet = new Sheet(SheetType.BGRA, mi.Src);
using (var stream = Game.ModData.ModFiles.Open(mi.Src))
sheet = new Sheet(SheetType.BGRA, stream);
cachedSheets.Add(mi.Src, sheet);
}

View File

@@ -10,10 +10,7 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.FileSystem;
using OpenRA.Primitives;
namespace OpenRA.Graphics
{
@@ -42,7 +39,7 @@ namespace OpenRA.Graphics
var palettes = new Dictionary<string, ImmutablePalette>();
foreach (var p in nodesDict["Palettes"].Nodes)
palettes.Add(p.Key, new ImmutablePalette(GlobalFileSystem.Open(p.Value.Value), shadowIndex));
palettes.Add(p.Key, new ImmutablePalette(modData.ModFiles.Open(p.Value.Value), shadowIndex));
Palettes = palettes.AsReadOnly();

View File

@@ -11,8 +11,9 @@
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using OpenRA.FileSystem;
namespace OpenRA.Graphics
{
@@ -47,9 +48,8 @@ namespace OpenRA.Graphics
Size = texture.Size;
}
public Sheet(SheetType type, string filename)
public Sheet(SheetType type, Stream stream)
{
using (var stream = GlobalFileSystem.Open(filename))
using (var bitmap = (Bitmap)Image.FromStream(stream))
{
Size = bitmap.Size;

View File

@@ -11,7 +11,6 @@
using System.Drawing;
using System.IO;
using System.Linq;
using OpenRA.FileSystem;
using OpenRA.Primitives;
namespace OpenRA.Graphics
@@ -66,7 +65,7 @@ namespace OpenRA.Graphics
public static ISpriteFrame[] GetFrames(string filename, ISpriteLoader[] loaders)
{
using (var stream = GlobalFileSystem.Open(filename))
using (var stream = Game.ModData.ModFiles.Open(filename))
{
ISpriteFrame[] frames;
foreach (var loader in loaders)

View File

@@ -13,7 +13,6 @@ using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.FileSystem;
using OpenRA.Primitives;
namespace OpenRA.Graphics
@@ -217,9 +216,9 @@ namespace OpenRA.Graphics
{
VxlReader vxl;
HvaReader hva;
using (var s = GlobalFileSystem.Open(files.First + ".vxl"))
using (var s = Game.ModData.ModFiles.Open(files.First + ".vxl"))
vxl = new VxlReader(s);
using (var s = GlobalFileSystem.Open(files.Second + ".hva"))
using (var s = Game.ModData.ModFiles.Open(files.Second + ".hva"))
hva = new HvaReader(s, files.Second + ".hva");
return new Voxel(this, vxl, hva);
}

View File

@@ -317,7 +317,7 @@ namespace OpenRA
public Map(string path)
{
Path = path;
Container = GlobalFileSystem.OpenPackage(path, null, int.MaxValue);
Container = Game.ModData.ModFiles.OpenPackage(path, null, int.MaxValue);
AssertExists("map.yaml");
AssertExists("map.bin");
@@ -650,7 +650,7 @@ namespace OpenRA
Path = toPath;
// Create a new map package
Container = GlobalFileSystem.CreatePackage(Path, int.MaxValue, entries);
Container = Game.ModData.ModFiles.CreatePackage(Path, int.MaxValue, entries);
}
// Update existing package

View File

@@ -12,7 +12,6 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using OpenRA.FileSystem;
namespace OpenRA
{
@@ -230,12 +229,6 @@ namespace OpenRA
return ret;
}
public static List<MiniYamlNode> FromFileInPackage(string path)
{
using (var stream = GlobalFileSystem.Open(path))
return FromLines(stream.ReadAllLines(), path);
}
public static Dictionary<string, MiniYaml> DictFromFile(string path)
{
return FromFile(path).ToDictionary(x => x.Key, x => x.Value);

View File

@@ -13,9 +13,9 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using OpenRA.FileSystem;
using OpenRA.Graphics;
using OpenRA.Widgets;
using FS = OpenRA.FileSystem.FileSystem;
namespace OpenRA
{
@@ -31,8 +31,9 @@ namespace OpenRA
public ILoadScreen LoadScreen { get; private set; }
public VoxelLoader VoxelLoader { get; private set; }
public CursorProvider CursorProvider { get; private set; }
public FS ModFiles = new FS();
Lazy<Ruleset> defaultRules;
readonly Lazy<Ruleset> defaultRules;
public Ruleset DefaultRules { get { return defaultRules.Value; } }
public ModData(string mod, bool useLoadScreen = false)
@@ -95,7 +96,7 @@ namespace OpenRA
public void MountFiles()
{
GlobalFileSystem.LoadFromManifest(Manifest);
ModFiles.LoadFromManifest(Manifest);
}
public void InitializeLoaders()
@@ -166,10 +167,10 @@ namespace OpenRA
// Reinitialize all our assets
InitializeLoaders();
GlobalFileSystem.LoadFromManifest(Manifest);
ModFiles.LoadFromManifest(Manifest);
// Mount map package so custom assets can be used. TODO: check priority.
GlobalFileSystem.Mount(GlobalFileSystem.OpenPackage(map.Path, null, int.MaxValue));
ModFiles.Mount(ModFiles.OpenPackage(map.Path, null, int.MaxValue));
using (new Support.PerfTimer("Map.PreloadRules"))
map.PreloadRules();

View File

@@ -95,6 +95,7 @@
<Compile Include="Actor.cs" />
<Compile Include="CacheStorage.cs" />
<Compile Include="FileSystem\IdxEntry.cs" />
<Compile Include="FileSystem\IFolder.cs" />
<Compile Include="LogProxy.cs" />
<Compile Include="FileFormats\IdxReader.cs" />
<Compile Include="FileSystem\BagFile.cs" />
@@ -321,7 +322,7 @@
<Compile Include="Settings.cs" />
<Compile Include="Graphics\PlayerColorRemap.cs" />
<Compile Include="Graphics\Palette.cs" />
<Compile Include="FileSystem\GlobalFileSystem.cs" />
<Compile Include="FileSystem\FileSystem.cs" />
<Compile Include="FileFormats\ReplayMetadata.cs" />
</ItemGroup>
<ItemGroup>

View File

@@ -11,12 +11,9 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using Eluant;
using OpenRA.FileSystem;
using OpenRA.Graphics;
using OpenRA.Primitives;
using OpenRA.Support;
@@ -133,7 +130,7 @@ namespace OpenRA.Scripting
.ToArray();
runtime.Globals["GameDir"] = Platform.GameDir;
runtime.DoBuffer(GlobalFileSystem.Open(Platform.ResolvePath(".", "lua", "scriptwrapper.lua")).ReadAllText(), "scriptwrapper.lua").Dispose();
runtime.DoBuffer(Game.ModData.ModFiles.Open(Platform.ResolvePath(".", "lua", "scriptwrapper.lua")).ReadAllText(), "scriptwrapper.lua").Dispose();
tick = (LuaFunction)runtime.Globals["Tick"];
// Register globals
@@ -172,7 +169,7 @@ namespace OpenRA.Scripting
using (var loadScript = (LuaFunction)runtime.Globals["ExecuteSandboxedScript"])
{
foreach (var s in scripts)
loadScript.Call(s, GlobalFileSystem.Open(s).ReadAllText()).Dispose();
loadScript.Call(s, Game.ModData.ModFiles.Open(s).ReadAllText()).Dispose();
}
}

View File

@@ -9,14 +9,11 @@
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using OpenRA.FileFormats;
using OpenRA.FileSystem;
using OpenRA.GameRules;
using OpenRA.Primitives;
using OpenRA.Traits;
namespace OpenRA
{
@@ -48,17 +45,17 @@ namespace OpenRA
ISoundSource LoadSound(string filename)
{
if (!GlobalFileSystem.Exists(filename))
if (!Game.ModData.ModFiles.Exists(filename))
{
Log.Write("sound", "LoadSound, file does not exist: {0}", filename);
return null;
}
if (filename.ToLowerInvariant().EndsWith("wav"))
using (var s = GlobalFileSystem.Open(filename))
using (var s = Game.ModData.ModFiles.Open(filename))
return LoadWave(new WavLoader(s));
using (var s = GlobalFileSystem.Open(filename))
using (var s = Game.ModData.ModFiles.Open(filename))
return LoadSoundRaw(AudLoader.LoadSound(s), 1, 16, 22050);
}