Merge pull request #10765 from pchote/readonlyfs

Don't reenumerate FileSystem when switching maps.
This commit is contained in:
Matthias Mailänder
2016-02-18 21:15:41 +01:00
49 changed files with 225 additions and 196 deletions

View File

@@ -17,7 +17,15 @@ using OpenRA.Primitives;
namespace OpenRA.FileSystem namespace OpenRA.FileSystem
{ {
public class FileSystem public interface IReadOnlyFileSystem
{
Stream Open(string filename);
bool TryGetPackageContaining(string path, out IReadOnlyPackage package, out string filename);
bool TryOpen(string filename, out Stream s);
bool Exists(string filename);
}
public class FileSystem : IReadOnlyFileSystem
{ {
public IEnumerable<IReadOnlyPackage> MountedPackages { get { return mountedPackages.Keys; } } public IEnumerable<IReadOnlyPackage> MountedPackages { get { return mountedPackages.Keys; } }
readonly Dictionary<IReadOnlyPackage, int> mountedPackages = new Dictionary<IReadOnlyPackage, int>(); readonly Dictionary<IReadOnlyPackage, int> mountedPackages = new Dictionary<IReadOnlyPackage, int>();

View File

@@ -342,8 +342,6 @@ namespace OpenRA
ModData = new ModData(mod, !Settings.Server.Dedicated); ModData = new ModData(mod, !Settings.Server.Dedicated);
Sound.Initialize();
using (new PerfTimer("LoadMaps")) using (new PerfTimer("LoadMaps"))
ModData.MapCache.LoadMaps(); ModData.MapCache.LoadMaps();
@@ -363,7 +361,7 @@ namespace OpenRA
return; return;
} }
ModData.InitializeLoaders(); ModData.InitializeLoaders(ModData.DefaultFileSystem);
Renderer.InitializeFonts(ModData); Renderer.InitializeFonts(ModData);
if (Cursor != null) if (Cursor != null)

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.FileSystem;
namespace OpenRA.GameRules namespace OpenRA.GameRules
{ {
@@ -33,13 +34,13 @@ namespace OpenRA.GameRules
Filename = (nd.ContainsKey("Filename") ? nd["Filename"].Value : key) + "." + ext; Filename = (nd.ContainsKey("Filename") ? nd["Filename"].Value : key) + "." + ext;
} }
public void Load() public void Load(IReadOnlyFileSystem filesystem)
{ {
if (!Game.ModData.ModFiles.Exists(Filename)) if (!filesystem.Exists(Filename))
return; return;
Exists = true; Exists = true;
using (var s = Game.ModData.ModFiles.Open(Filename)) using (var s = filesystem.Open(Filename))
{ {
if (Filename.ToLowerInvariant().EndsWith("wav")) if (Filename.ToLowerInvariant().EndsWith("wav"))
Length = (int)WavLoader.WaveLength(s); Length = (int)WavLoader.WaveLength(s);

View File

@@ -11,13 +11,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.FileSystem;
using OpenRA.GameRules; using OpenRA.GameRules;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Support; using OpenRA.Support;
namespace OpenRA namespace OpenRA
{ {
public sealed class RulesetCache : IDisposable public sealed class RulesetCache
{ {
static readonly List<MiniYamlNode> NoMapRules = new List<MiniYamlNode>(); static readonly List<MiniYamlNode> NoMapRules = new List<MiniYamlNode>();
@@ -29,7 +30,6 @@ namespace OpenRA
readonly Dictionary<string, SoundInfo> notificationCache = new Dictionary<string, SoundInfo>(); readonly Dictionary<string, SoundInfo> notificationCache = new Dictionary<string, SoundInfo>();
readonly Dictionary<string, MusicInfo> musicCache = new Dictionary<string, MusicInfo>(); readonly Dictionary<string, MusicInfo> musicCache = new Dictionary<string, MusicInfo>();
readonly Dictionary<string, TileSet> tileSetCache = new Dictionary<string, TileSet>(); readonly Dictionary<string, TileSet> tileSetCache = new Dictionary<string, TileSet>();
readonly Dictionary<string, SequenceCache> sequenceCaches = new Dictionary<string, SequenceCache>();
public event EventHandler LoadingProgress; public event EventHandler LoadingProgress;
void RaiseProgress() void RaiseProgress()
@@ -47,7 +47,7 @@ namespace OpenRA
/// Cache and return the Ruleset for a given map. /// Cache and return the Ruleset for a given map.
/// If a map isn't specified then return the default mod Ruleset. /// If a map isn't specified then return the default mod Ruleset.
/// </summary> /// </summary>
public Ruleset Load(Map map = null) public Ruleset Load(IReadOnlyFileSystem fileSystem, Map map = null)
{ {
var m = modData.Manifest; var m = modData.Manifest;
@@ -59,38 +59,39 @@ namespace OpenRA
Dictionary<string, TileSet> tileSets; Dictionary<string, TileSet> tileSets;
using (new PerfTimer("Actors")) using (new PerfTimer("Actors"))
actors = LoadYamlRules(actorCache, m.Rules, actors = LoadYamlRules(fileSystem, actorCache, m.Rules,
map != null ? map.RuleDefinitions : NoMapRules, map != null ? map.RuleDefinitions : NoMapRules,
k => new ActorInfo(Game.ModData.ObjectCreator, k.Key.ToLowerInvariant(), k.Value)); k => new ActorInfo(Game.ModData.ObjectCreator, k.Key.ToLowerInvariant(), k.Value));
using (new PerfTimer("Weapons")) using (new PerfTimer("Weapons"))
weapons = LoadYamlRules(weaponCache, m.Weapons, weapons = LoadYamlRules(fileSystem, weaponCache, m.Weapons,
map != null ? map.WeaponDefinitions : NoMapRules, map != null ? map.WeaponDefinitions : NoMapRules,
k => new WeaponInfo(k.Key.ToLowerInvariant(), k.Value)); k => new WeaponInfo(k.Key.ToLowerInvariant(), k.Value));
using (new PerfTimer("Voices")) using (new PerfTimer("Voices"))
voices = LoadYamlRules(voiceCache, m.Voices, voices = LoadYamlRules(fileSystem, voiceCache, m.Voices,
map != null ? map.VoiceDefinitions : NoMapRules, map != null ? map.VoiceDefinitions : NoMapRules,
k => new SoundInfo(k.Value)); k => new SoundInfo(k.Value));
using (new PerfTimer("Notifications")) using (new PerfTimer("Notifications"))
notifications = LoadYamlRules(notificationCache, m.Notifications, notifications = LoadYamlRules(fileSystem, notificationCache, m.Notifications,
map != null ? map.NotificationDefinitions : NoMapRules, map != null ? map.NotificationDefinitions : NoMapRules,
k => new SoundInfo(k.Value)); k => new SoundInfo(k.Value));
using (new PerfTimer("Music")) using (new PerfTimer("Music"))
music = LoadYamlRules(musicCache, m.Music, music = LoadYamlRules(fileSystem, musicCache, m.Music,
map != null ? map.MusicDefinitions : NoMapRules, map != null ? map.MusicDefinitions : NoMapRules,
k => new MusicInfo(k.Key, k.Value)); k => new MusicInfo(k.Key, k.Value));
using (new PerfTimer("TileSets")) using (new PerfTimer("TileSets"))
tileSets = LoadTileSets(tileSetCache, sequenceCaches, m.TileSets); tileSets = LoadTileSets(fileSystem, tileSetCache, m.TileSets);
var sequences = sequenceCaches.ToDictionary(kvp => kvp.Key, kvp => new SequenceProvider(kvp.Value, map)); // TODO: only initialize, and then cache, the provider for the given map
var sequences = tileSets.ToDictionary(t => t.Key, t => new SequenceProvider(fileSystem, modData, t.Value, map));
return new Ruleset(actors, weapons, voices, notifications, music, tileSets, sequences); return new Ruleset(actors, weapons, voices, notifications, music, tileSets, sequences);
} }
Dictionary<string, T> LoadYamlRules<T>( Dictionary<string, T> LoadYamlRules<T>(IReadOnlyFileSystem fileSystem,
Dictionary<string, T> itemCache, Dictionary<string, T> itemCache,
string[] files, List<MiniYamlNode> nodes, string[] files, List<MiniYamlNode> nodes,
Func<MiniYamlNode, T> f) Func<MiniYamlNode, T> f)
@@ -112,7 +113,7 @@ namespace OpenRA
return t; return t;
}; };
var tree = MiniYaml.Merge(files.Select(s => MiniYaml.FromStream(modData.ModFiles.Open(s))).Append(nodes)) var tree = MiniYaml.Merge(files.Select(s => MiniYaml.FromStream(fileSystem.Open(s))).Append(nodes))
.ToDictionaryWithConflictLog(n => n.Key, n => n.Value, "LoadYamlRules", null, null); .ToDictionaryWithConflictLog(n => n.Key, n => n.Value, "LoadYamlRules", null, null);
RaiseProgress(); RaiseProgress();
@@ -121,7 +122,7 @@ namespace OpenRA
return itemSet; return itemSet;
} }
Dictionary<string, TileSet> LoadTileSets(Dictionary<string, TileSet> itemCache, Dictionary<string, SequenceCache> sequenceCaches, string[] files) Dictionary<string, TileSet> LoadTileSets(IReadOnlyFileSystem fileSystem, Dictionary<string, TileSet> itemCache, string[] files)
{ {
var items = new Dictionary<string, TileSet>(); var items = new Dictionary<string, TileSet>();
@@ -132,25 +133,13 @@ namespace OpenRA
items.Add(t.Id, t); items.Add(t.Id, t);
else else
{ {
t = new TileSet(modData, file); t = new TileSet(fileSystem, file);
itemCache.Add(file, t); itemCache.Add(file, t);
// every time we load a tile set, we create a sequence cache for it
var sc = new SequenceCache(modData, t);
sequenceCaches.Add(t.Id, sc);
items.Add(t.Id, t); items.Add(t.Id, t);
} }
} }
return items; return items;
} }
public void Dispose()
{
foreach (var cache in sequenceCaches.Values)
cache.Dispose();
sequenceCaches.Clear();
}
} }
} }

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.FileSystem;
namespace OpenRA.Graphics namespace OpenRA.Graphics
{ {
@@ -24,17 +25,19 @@ namespace OpenRA.Graphics
static Dictionary<string, Collection> collections; static Dictionary<string, Collection> collections;
static Dictionary<string, Sheet> cachedSheets; static Dictionary<string, Sheet> cachedSheets;
static Dictionary<string, Dictionary<string, Sprite>> cachedSprites; static Dictionary<string, Dictionary<string, Sprite>> cachedSprites;
static IReadOnlyFileSystem fileSystem;
public static void Initialize(ModData modData) public static void Initialize(ModData modData)
{ {
Deinitialize(); Deinitialize();
fileSystem = modData.DefaultFileSystem;
collections = new Dictionary<string, Collection>(); collections = new Dictionary<string, Collection>();
cachedSheets = new Dictionary<string, Sheet>(); cachedSheets = new Dictionary<string, Sheet>();
cachedSprites = new Dictionary<string, Dictionary<string, Sprite>>(); cachedSprites = new Dictionary<string, Dictionary<string, Sprite>>();
var chrome = MiniYaml.Merge(modData.Manifest.Chrome var chrome = MiniYaml.Merge(modData.Manifest.Chrome
.Select(s => MiniYaml.FromStream(modData.ModFiles.Open(s)))); .Select(s => MiniYaml.FromStream(fileSystem.Open(s))));
foreach (var c in chrome) foreach (var c in chrome)
LoadCollection(c.Key, c.Value); LoadCollection(c.Key, c.Value);
@@ -107,7 +110,7 @@ namespace OpenRA.Graphics
sheet = cachedSheets[mi.Src]; sheet = cachedSheets[mi.Src];
else else
{ {
using (var stream = Game.ModData.ModFiles.Open(mi.Src)) using (var stream = fileSystem.Open(mi.Src))
sheet = new Sheet(SheetType.BGRA, stream); sheet = new Sheet(SheetType.BGRA, stream);
cachedSheets.Add(mi.Src, sheet); cachedSheets.Add(mi.Src, sheet);

View File

@@ -21,8 +21,9 @@ namespace OpenRA.Graphics
public CursorProvider(ModData modData) public CursorProvider(ModData modData)
{ {
var fileSystem = modData.DefaultFileSystem;
var sequenceYaml = MiniYaml.Merge(modData.Manifest.Cursors.Select( var sequenceYaml = MiniYaml.Merge(modData.Manifest.Cursors.Select(
s => MiniYaml.FromStream(modData.ModFiles.Open(s)))); s => MiniYaml.FromStream(fileSystem.Open(s))));
var shadowIndex = new int[] { }; var shadowIndex = new int[] { };
@@ -36,11 +37,11 @@ namespace OpenRA.Graphics
var palettes = new Dictionary<string, ImmutablePalette>(); var palettes = new Dictionary<string, ImmutablePalette>();
foreach (var p in nodesDict["Palettes"].Nodes) foreach (var p in nodesDict["Palettes"].Nodes)
palettes.Add(p.Key, new ImmutablePalette(modData.ModFiles.Open(p.Value.Value), shadowIndex)); palettes.Add(p.Key, new ImmutablePalette(fileSystem.Open(p.Value.Value), shadowIndex));
Palettes = palettes.AsReadOnly(); Palettes = palettes.AsReadOnly();
var frameCache = new FrameCache(modData.SpriteLoaders); var frameCache = new FrameCache(fileSystem, modData.SpriteLoaders);
var cursors = new Dictionary<string, CursorSequence>(); var cursors = new Dictionary<string, CursorSequence>();
foreach (var s in nodesDict["Cursors"].Nodes) foreach (var s in nodesDict["Cursors"].Nodes)
foreach (var sequence in s.Value.Nodes) foreach (var sequence in s.Value.Nodes)

View File

@@ -11,6 +11,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.FileSystem;
namespace OpenRA.Graphics namespace OpenRA.Graphics
{ {
@@ -41,15 +42,22 @@ namespace OpenRA.Graphics
IReadOnlyDictionary<string, ISpriteSequence> ParseSequences(ModData modData, TileSet tileSet, SpriteCache cache, MiniYamlNode node); IReadOnlyDictionary<string, ISpriteSequence> ParseSequences(ModData modData, TileSet tileSet, SpriteCache cache, MiniYamlNode node);
} }
public class SequenceProvider public class SequenceProvider : IDisposable
{ {
readonly ModData modData;
readonly TileSet tileSet;
readonly Lazy<Sequences> sequences; readonly Lazy<Sequences> sequences;
public readonly SpriteCache SpriteCache; readonly Lazy<SpriteCache> spriteCache;
public SpriteCache SpriteCache { get { return spriteCache.Value; } }
public SequenceProvider(SequenceCache cache, Map map) readonly Dictionary<string, UnitSequences> sequenceCache = new Dictionary<string, UnitSequences>();
public SequenceProvider(IReadOnlyFileSystem fileSystem, ModData modData, TileSet tileSet, Map map)
{ {
sequences = Exts.Lazy(() => cache.LoadSequences(map)); this.modData = modData;
SpriteCache = cache.SpriteCache; this.tileSet = tileSet;
sequences = Exts.Lazy(() => LoadSequences(fileSystem, map));
spriteCache = Exts.Lazy(() => new SpriteCache(fileSystem, modData.SpriteLoaders, new SheetBuilder(SheetType.Indexed)));
} }
public ISpriteSequence GetSequence(string unitName, string sequenceName) public ISpriteSequence GetSequence(string unitName, string sequenceName)
@@ -88,43 +96,16 @@ namespace OpenRA.Graphics
return unitSeq.Value.Keys; return unitSeq.Value.Keys;
} }
public void Preload() public Sequences LoadSequences(IReadOnlyFileSystem fileSystem, Map map)
{
SpriteCache.SheetBuilder.Current.CreateBuffer();
foreach (var unitSeq in sequences.Value.Values)
foreach (var seq in unitSeq.Value.Values) { }
SpriteCache.SheetBuilder.Current.ReleaseBuffer();
}
}
public sealed class SequenceCache : IDisposable
{
readonly ModData modData;
readonly TileSet tileSet;
readonly Lazy<SpriteCache> spriteCache;
public SpriteCache SpriteCache { get { return spriteCache.Value; } }
readonly Dictionary<string, UnitSequences> sequenceCache = new Dictionary<string, UnitSequences>();
public SequenceCache(ModData modData, TileSet tileSet)
{
this.modData = modData;
this.tileSet = tileSet;
// Every time we load a tile set, we create a sequence cache for it
spriteCache = Exts.Lazy(() => new SpriteCache(modData.SpriteLoaders, new SheetBuilder(SheetType.Indexed)));
}
public Sequences LoadSequences(Map map)
{ {
using (new Support.PerfTimer("LoadSequences")) using (new Support.PerfTimer("LoadSequences"))
return Load(map != null ? map.SequenceDefinitions : new List<MiniYamlNode>()); return Load(fileSystem, map != null ? map.SequenceDefinitions : new List<MiniYamlNode>());
} }
Sequences Load(List<MiniYamlNode> sequenceNodes) Sequences Load(IReadOnlyFileSystem fileSystem, List<MiniYamlNode> sequenceNodes)
{ {
var nodes = MiniYaml.Merge(modData.Manifest.Sequences var nodes = MiniYaml.Merge(modData.Manifest.Sequences
.Select(s => MiniYaml.FromStream(modData.ModFiles.Open(s))) .Select(s => MiniYaml.FromStream(fileSystem.Open(s)))
.Append(sequenceNodes)); .Append(sequenceNodes));
var items = new Dictionary<string, UnitSequences>(); var items = new Dictionary<string, UnitSequences>();
@@ -149,6 +130,14 @@ namespace OpenRA.Graphics
return new ReadOnlyDictionary<string, UnitSequences>(items); return new ReadOnlyDictionary<string, UnitSequences>(items);
} }
public void Preload()
{
SpriteCache.SheetBuilder.Current.CreateBuffer();
foreach (var unitSeq in sequences.Value.Values)
foreach (var seq in unitSeq.Value.Values) { }
SpriteCache.SheetBuilder.Current.ReleaseBuffer();
}
public void Dispose() public void Dispose()
{ {
if (spriteCache.IsValueCreated) if (spriteCache.IsValueCreated)

View File

@@ -11,6 +11,7 @@
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using OpenRA.FileSystem;
using OpenRA.Primitives; using OpenRA.Primitives;
namespace OpenRA.Graphics namespace OpenRA.Graphics
@@ -34,11 +35,11 @@ namespace OpenRA.Graphics
public readonly SheetBuilder SheetBuilder; public readonly SheetBuilder SheetBuilder;
readonly Cache<string, Sprite[]> sprites; readonly Cache<string, Sprite[]> sprites;
public SpriteCache(ISpriteLoader[] loaders, SheetBuilder sheetBuilder) public SpriteCache(IReadOnlyFileSystem fileSystem, ISpriteLoader[] loaders, SheetBuilder sheetBuilder)
{ {
SheetBuilder = sheetBuilder; SheetBuilder = sheetBuilder;
sprites = new Cache<string, Sprite[]>(filename => SpriteLoader.GetSprites(filename, loaders, sheetBuilder)); sprites = new Cache<string, Sprite[]>(filename => SpriteLoader.GetSprites(fileSystem, filename, loaders, sheetBuilder));
} }
public Sprite[] this[string filename] { get { return sprites[filename]; } } public Sprite[] this[string filename] { get { return sprites[filename]; } }
@@ -48,9 +49,9 @@ namespace OpenRA.Graphics
{ {
readonly Cache<string, ISpriteFrame[]> frames; readonly Cache<string, ISpriteFrame[]> frames;
public FrameCache(ISpriteLoader[] loaders) public FrameCache(IReadOnlyFileSystem fileSystem, ISpriteLoader[] loaders)
{ {
frames = new Cache<string, ISpriteFrame[]>(filename => SpriteLoader.GetFrames(filename, loaders)); frames = new Cache<string, ISpriteFrame[]>(filename => SpriteLoader.GetFrames(fileSystem, filename, loaders));
} }
public ISpriteFrame[] this[string filename] { get { return frames[filename]; } } public ISpriteFrame[] this[string filename] { get { return frames[filename]; } }
@@ -58,14 +59,14 @@ namespace OpenRA.Graphics
public static class SpriteLoader public static class SpriteLoader
{ {
public static Sprite[] GetSprites(string filename, ISpriteLoader[] loaders, SheetBuilder sheetBuilder) public static Sprite[] GetSprites(IReadOnlyFileSystem fileSystem, string filename, ISpriteLoader[] loaders, SheetBuilder sheetBuilder)
{ {
return GetFrames(filename, loaders).Select(a => sheetBuilder.Add(a)).ToArray(); return GetFrames(fileSystem, filename, loaders).Select(a => sheetBuilder.Add(a)).ToArray();
} }
public static ISpriteFrame[] GetFrames(string filename, ISpriteLoader[] loaders) public static ISpriteFrame[] GetFrames(IReadOnlyFileSystem fileSystem, string filename, ISpriteLoader[] loaders)
{ {
using (var stream = Game.ModData.ModFiles.Open(filename)) using (var stream = fileSystem.Open(filename))
{ {
ISpriteFrame[] frames; ISpriteFrame[] frames;
foreach (var loader in loaders) foreach (var loader in loaders)

View File

@@ -56,7 +56,7 @@ namespace OpenRA.Graphics
sheetBuilder = new SheetBuilder(type, allocate); sheetBuilder = new SheetBuilder(type, allocate);
random = new MersenneTwister(); random = new MersenneTwister();
var frameCache = new FrameCache(Game.ModData.SpriteLoaders); var frameCache = new FrameCache(Game.ModData.DefaultFileSystem, Game.ModData.SpriteLoaders);
foreach (var t in tileset.Templates) foreach (var t in tileset.Templates)
{ {
var variants = new List<Sprite[]>(); var variants = new List<Sprite[]>();

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.FileSystem;
using OpenRA.Primitives; using OpenRA.Primitives;
namespace OpenRA.Graphics namespace OpenRA.Graphics
@@ -37,6 +38,7 @@ namespace OpenRA.Graphics
readonly List<Vertex[]> vertices = new List<Vertex[]>(); readonly List<Vertex[]> vertices = new List<Vertex[]>();
readonly Cache<Pair<string, string>, Voxel> voxels; readonly Cache<Pair<string, string>, Voxel> voxels;
readonly IReadOnlyFileSystem fileSystem;
IVertexBuffer<Vertex> vertexBuffer; IVertexBuffer<Vertex> vertexBuffer;
int totalVertexCount; int totalVertexCount;
int cachedVertexCount; int cachedVertexCount;
@@ -57,8 +59,9 @@ namespace OpenRA.Graphics
return new SheetBuilder(SheetType.DualIndexed, allocate); return new SheetBuilder(SheetType.DualIndexed, allocate);
} }
public VoxelLoader() public VoxelLoader(IReadOnlyFileSystem fileSystem)
{ {
this.fileSystem = fileSystem;
voxels = new Cache<Pair<string, string>, Voxel>(LoadFile); voxels = new Cache<Pair<string, string>, Voxel>(LoadFile);
vertices = new List<Vertex[]>(); vertices = new List<Vertex[]>();
totalVertexCount = 0; totalVertexCount = 0;
@@ -218,9 +221,9 @@ namespace OpenRA.Graphics
{ {
VxlReader vxl; VxlReader vxl;
HvaReader hva; HvaReader hva;
using (var s = Game.ModData.ModFiles.Open(files.First + ".vxl")) using (var s = fileSystem.Open(files.First + ".vxl"))
vxl = new VxlReader(s); vxl = new VxlReader(s);
using (var s = Game.ModData.ModFiles.Open(files.Second + ".hva")) using (var s = fileSystem.Open(files.Second + ".hva"))
hva = new HvaReader(s, files.Second + ".hva"); hva = new HvaReader(s, files.Second + ".hva");
return new Voxel(this, vxl, hva); return new Voxel(this, vxl, hva);
} }

View File

@@ -12,6 +12,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using OpenRA.FileSystem;
namespace OpenRA.Graphics namespace OpenRA.Graphics
{ {
@@ -19,20 +20,20 @@ namespace OpenRA.Graphics
{ {
static Dictionary<string, Dictionary<string, Voxel>> units; static Dictionary<string, Dictionary<string, Voxel>> units;
public static void Initialize(ModData modData, string[] voxelFiles, List<MiniYamlNode> voxelNodes) public static void Initialize(VoxelLoader loader, IReadOnlyFileSystem fileSystem, string[] voxelFiles, List<MiniYamlNode> voxelNodes)
{ {
units = new Dictionary<string, Dictionary<string, Voxel>>(); units = new Dictionary<string, Dictionary<string, Voxel>>();
var sequences = MiniYaml.Merge(voxelFiles.Select( var sequences = MiniYaml.Merge(voxelFiles.Select(
s => MiniYaml.FromStream(modData.ModFiles.Open(s)))); s => MiniYaml.FromStream(fileSystem.Open(s))));
foreach (var s in sequences) foreach (var s in sequences)
LoadVoxelsForUnit(s.Key, s.Value); LoadVoxelsForUnit(loader, s.Key, s.Value);
Game.ModData.VoxelLoader.RefreshBuffer(); loader.RefreshBuffer();
} }
static Voxel LoadVoxel(string unit, MiniYaml info) static Voxel LoadVoxel(VoxelLoader voxelLoader, string unit, MiniYaml info)
{ {
var vxl = unit; var vxl = unit;
var hva = unit; var hva = unit;
@@ -46,15 +47,15 @@ namespace OpenRA.Graphics
hva = fields[1].Trim(); hva = fields[1].Trim();
} }
return Game.ModData.VoxelLoader.Load(vxl, hva); return voxelLoader.Load(vxl, hva);
} }
static void LoadVoxelsForUnit(string unit, MiniYaml sequences) static void LoadVoxelsForUnit(VoxelLoader loader, string unit, MiniYaml sequences)
{ {
Game.ModData.LoadScreen.Display(); Game.ModData.LoadScreen.Display();
try try
{ {
var seq = sequences.ToDictionary(my => LoadVoxel(unit, my)); var seq = sequences.ToDictionary(my => LoadVoxel(loader, unit, my));
units.Add(unit, seq); units.Add(unit, seq);
} }
catch (FileNotFoundException) { } // Do nothing; we can crash later if we actually wanted art catch (FileNotFoundException) { } // Do nothing; we can crash later if we actually wanted art

View File

@@ -107,7 +107,7 @@ namespace OpenRA
MissionSelector = 4 MissionSelector = 4
} }
public class Map public class Map : IReadOnlyFileSystem
{ {
public const int SupportedMapFormat = 8; public const int SupportedMapFormat = 8;
@@ -372,7 +372,7 @@ namespace OpenRA
{ {
try try
{ {
return Game.ModData.RulesetCache.Load(this); return Game.ModData.RulesetCache.Load(this, this);
} }
catch (Exception e) catch (Exception e)
{ {
@@ -1174,5 +1174,34 @@ namespace OpenRA
{ {
return FindTilesInAnnulus(center, 0, maxRange, allowOutsideBounds); return FindTilesInAnnulus(center, 0, maxRange, allowOutsideBounds);
} }
// Placeholders for future implementation
public Stream Open(string filename)
{
if (Container.Contains(filename))
return Container.GetStream(filename);
return Game.ModData.DefaultFileSystem.Open(filename);
}
public bool TryGetPackageContaining(string path, out IReadOnlyPackage package, out string filename)
{
// Packages aren't supported inside maps
return Game.ModData.DefaultFileSystem.TryGetPackageContaining(path, out package, out filename);
}
public bool TryOpen(string filename, out Stream s)
{
s = Container.GetStream(filename);
if (s != null)
return true;
return Game.ModData.DefaultFileSystem.TryOpen(filename, out s);
}
public bool Exists(string filename)
{
return Container.Contains(filename) || Game.ModData.DefaultFileSystem.Exists(filename);
}
} }
} }

View File

@@ -12,6 +12,7 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using OpenRA.FileSystem;
using OpenRA.Primitives; using OpenRA.Primitives;
namespace OpenRA namespace OpenRA
@@ -191,9 +192,9 @@ namespace OpenRA
// Private default ctor for serialization comparison // Private default ctor for serialization comparison
TileSet() { } TileSet() { }
public TileSet(ModData modData, string filepath) public TileSet(IReadOnlyFileSystem fileSystem, string filepath)
{ {
var yaml = MiniYaml.DictFromStream(modData.ModFiles.Open(filepath)); var yaml = MiniYaml.DictFromStream(fileSystem.Open(filepath));
// General info // General info
FieldLoader.Load(this, yaml["General"]); FieldLoader.Load(this, yaml["General"]);

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using OpenRA.FileSystem;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Widgets; using OpenRA.Widgets;
using FS = OpenRA.FileSystem.FileSystem; using FS = OpenRA.FileSystem.FileSystem;
@@ -36,6 +37,7 @@ namespace OpenRA
readonly Lazy<Ruleset> defaultRules; readonly Lazy<Ruleset> defaultRules;
public Ruleset DefaultRules { get { return defaultRules.Value; } } public Ruleset DefaultRules { get { return defaultRules.Value; } }
public IReadOnlyFileSystem DefaultFileSystem { get { return ModFiles; } }
public ModData(string mod, bool useLoadScreen = false) public ModData(string mod, bool useLoadScreen = false)
{ {
@@ -70,7 +72,7 @@ namespace OpenRA
SpriteSequenceLoader = (ISpriteSequenceLoader)ctor.Invoke(new[] { this }); SpriteSequenceLoader = (ISpriteSequenceLoader)ctor.Invoke(new[] { this });
SpriteSequenceLoader.OnMissingSpriteError = s => Log.Write("debug", s); SpriteSequenceLoader.OnMissingSpriteError = s => Log.Write("debug", s);
defaultRules = Exts.Lazy(() => RulesetCache.Load()); defaultRules = Exts.Lazy(() => RulesetCache.Load(DefaultFileSystem));
initialThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; initialThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
} }
@@ -83,16 +85,18 @@ namespace OpenRA
LoadScreen.Display(); LoadScreen.Display();
} }
public void InitializeLoaders() public void InitializeLoaders(IReadOnlyFileSystem fileSystem)
{ {
// all this manipulation of static crap here is nasty and breaks // all this manipulation of static crap here is nasty and breaks
// horribly when you use ModData in unexpected ways. // horribly when you use ModData in unexpected ways.
ChromeMetrics.Initialize(this); ChromeMetrics.Initialize(this);
ChromeProvider.Initialize(this); ChromeProvider.Initialize(this);
Game.Sound.Initialize(SoundLoaders, fileSystem);
if (VoxelLoader != null) if (VoxelLoader != null)
VoxelLoader.Dispose(); VoxelLoader.Dispose();
VoxelLoader = new VoxelLoader(); VoxelLoader = new VoxelLoader(fileSystem);
CursorProvider = new CursorProvider(this); CursorProvider = new CursorProvider(this);
} }
@@ -166,11 +170,7 @@ namespace OpenRA
LoadTranslations(map); LoadTranslations(map);
// Reinitialize all our assets // Reinitialize all our assets
InitializeLoaders(); InitializeLoaders(map);
ModFiles.LoadFromManifest(Manifest);
// Mount map package so custom assets can be used.
ModFiles.Mount(ModFiles.OpenPackage(map.Path));
using (new Support.PerfTimer("Map.PreloadRules")) using (new Support.PerfTimer("Map.PreloadRules"))
map.PreloadRules(); map.PreloadRules();
@@ -180,9 +180,9 @@ namespace OpenRA
// Load music with map assets mounted // Load music with map assets mounted
using (new Support.PerfTimer("Map.Music")) using (new Support.PerfTimer("Map.Music"))
foreach (var entry in map.Rules.Music) foreach (var entry in map.Rules.Music)
entry.Value.Load(); entry.Value.Load(map);
VoxelProvider.Initialize(this, Manifest.VoxelSequences, map.VoxelSequenceDefinitions); VoxelProvider.Initialize(VoxelLoader, map, Manifest.VoxelSequences, map.VoxelSequenceDefinitions);
VoxelLoader.Finish(); VoxelLoader.Finish();
return map; return map;
@@ -192,7 +192,6 @@ namespace OpenRA
{ {
if (LoadScreen != null) if (LoadScreen != null)
LoadScreen.Dispose(); LoadScreen.Dispose();
RulesetCache.Dispose();
MapCache.Dispose(); MapCache.Dispose();
if (VoxelLoader != null) if (VoxelLoader != null)
VoxelLoader.Dispose(); VoxelLoader.Dispose();

View File

@@ -101,7 +101,7 @@ namespace OpenRA
fontSheetBuilder.Dispose(); fontSheetBuilder.Dispose();
fontSheetBuilder = new SheetBuilder(SheetType.BGRA); fontSheetBuilder = new SheetBuilder(SheetType.BGRA);
Fonts = modData.Manifest.Fonts.ToDictionary(x => x.Key, Fonts = modData.Manifest.Fonts.ToDictionary(x => x.Key,
x => new SpriteFont(x.Value.First, modData.ModFiles.Open(x.Value.First).ReadAllBytes(), x.Value.Second, fontSheetBuilder)).AsReadOnly(); x => new SpriteFont(x.Value.First, modData.DefaultFileSystem.Open(x.Value.First).ReadAllBytes(), x.Value.Second, fontSheetBuilder)).AsReadOnly();
} }
} }

View File

@@ -198,7 +198,7 @@ namespace OpenRA.Scripting
using (var loadScript = (LuaFunction)runtime.Globals["ExecuteSandboxedScript"]) using (var loadScript = (LuaFunction)runtime.Globals["ExecuteSandboxedScript"])
{ {
foreach (var s in scripts) foreach (var s in scripts)
loadScript.Call(s, Game.ModData.ModFiles.Open(s).ReadAllText()).Dispose(); loadScript.Call(s, world.Map.Open(s).ReadAllText()).Dispose();
} }
} }

View File

@@ -12,6 +12,7 @@ using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using OpenRA.FileSystem;
using OpenRA.GameRules; using OpenRA.GameRules;
using OpenRA.Primitives; using OpenRA.Primitives;
@@ -48,21 +49,21 @@ namespace OpenRA
throw new InvalidOperationException("Platform DLL is missing PlatformAttribute to tell us what type to use!"); throw new InvalidOperationException("Platform DLL is missing PlatformAttribute to tell us what type to use!");
} }
ISoundSource LoadSound(string filename) ISoundSource LoadSound(ISoundLoader[] loaders, IReadOnlyFileSystem fileSystem, string filename)
{ {
if (!Game.ModData.ModFiles.Exists(filename)) if (!fileSystem.Exists(filename))
{ {
Log.Write("sound", "LoadSound, file does not exist: {0}", filename); Log.Write("sound", "LoadSound, file does not exist: {0}", filename);
return null; return null;
} }
using (var stream = Game.ModData.ModFiles.Open(filename)) using (var stream = fileSystem.Open(filename))
{ {
byte[] rawData; byte[] rawData;
int channels; int channels;
int sampleBits; int sampleBits;
int sampleRate; int sampleRate;
foreach (var loader in Game.ModData.SoundLoaders) foreach (var loader in loaders)
if (loader.TryParseSound(stream, filename, out rawData, out channels, out sampleBits, out sampleRate)) if (loader.TryParseSound(stream, filename, out rawData, out channels, out sampleBits, out sampleRate))
return soundEngine.AddSoundSourceFromMemory(rawData, channels, sampleBits, sampleRate); return soundEngine.AddSoundSourceFromMemory(rawData, channels, sampleBits, sampleRate);
@@ -70,9 +71,9 @@ namespace OpenRA
} }
} }
public void Initialize() public void Initialize(ISoundLoader[] loaders, IReadOnlyFileSystem fileSystem)
{ {
sounds = new Cache<string, ISoundSource>(LoadSound); sounds = new Cache<string, ISoundSource>(s => LoadSound(loaders, fileSystem, s));
music = null; music = null;
currentMusic = null; currentMusic = null;
video = null; video = null;

View File

@@ -364,7 +364,7 @@ namespace OpenRA.Traits
IEnumerable<WPos> TargetablePositions(Actor self); IEnumerable<WPos> TargetablePositions(Actor self);
} }
public interface ILintPass { void Run(Action<string> emitError, Action<string> emitWarning); } public interface ILintPass { void Run(Action<string> emitError, Action<string> emitWarning, ModData modData); }
public interface ILintMapPass { void Run(Action<string> emitError, Action<string> emitWarning, Map map); } public interface ILintMapPass { void Run(Action<string> emitError, Action<string> emitWarning, Map map); }
public interface ILintRulesPass { void Run(Action<string> emitError, Action<string> emitWarning, Ruleset rules); } public interface ILintRulesPass { void Run(Action<string> emitError, Action<string> emitWarning, Ruleset rules); }

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Widgets
{ {
data = new Dictionary<string, string>(); data = new Dictionary<string, string>();
var metrics = MiniYaml.Merge(modData.Manifest.ChromeMetrics.Select( var metrics = MiniYaml.Merge(modData.Manifest.ChromeMetrics.Select(
y => MiniYaml.FromStream(modData.ModFiles.Open(y)))); y => MiniYaml.FromStream(modData.DefaultFileSystem.Open(y))));
foreach (var m in metrics) foreach (var m in metrics)
foreach (var n in m.Value.Nodes) foreach (var n in m.Value.Nodes)
data[n.Key] = n.Value.Value; data[n.Key] = n.Value.Value;

View File

@@ -24,7 +24,7 @@ namespace OpenRA
{ {
this.modData = modData; this.modData = modData;
foreach (var file in modData.Manifest.ChromeLayout.Select(a => MiniYaml.FromStream(modData.ModFiles.Open(a)))) foreach (var file in modData.Manifest.ChromeLayout.Select(a => MiniYaml.FromStream(modData.DefaultFileSystem.Open(a))))
foreach (var w in file) foreach (var w in file)
{ {
var key = w.Key.Substring(w.Key.IndexOf('@') + 1); var key = w.Key.Substring(w.Key.IndexOf('@') + 1);

View File

@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Cnc
r = Game.Renderer; r = Game.Renderer;
if (r == null) return; if (r == null) return;
using (var stream = modData.ModFiles.Open(info["Image"])) using (var stream = modData.DefaultFileSystem.Open(info["Image"]))
sheet = new Sheet(SheetType.BGRA, stream); sheet = new Sheet(SheetType.BGRA, stream);
var res = r.Resolution; var res = r.Resolution;

View File

@@ -142,7 +142,7 @@ namespace OpenRA.Mods.Cnc.UtilityCommands
public override void ReadPacks(IniFile file, string filename) public override void ReadPacks(IniFile file, string filename)
{ {
using (var s = Game.ModData.ModFiles.Open(filename.Substring(0, filename.Length - 4) + ".bin")) using (var s = ModData.DefaultFileSystem.Open(filename.Substring(0, filename.Length - 4) + ".bin"))
UnpackTileData(s); UnpackTileData(s);
ReadOverlay(file); ReadOverlay(file);

View File

@@ -14,6 +14,7 @@ using System.IO;
using System.Linq; using System.Linq;
using ICSharpCode.SharpZipLib; using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip;
using OpenRA.FileSystem;
namespace OpenRA.Mods.Common namespace OpenRA.Mods.Common
{ {
@@ -55,15 +56,15 @@ namespace OpenRA.Mods.Common
} }
// TODO: The package should be mounted into its own context to avoid name collisions with installed files // TODO: The package should be mounted into its own context to avoid name collisions with installed files
public static bool ExtractFromPackage(string srcPath, string package, Dictionary<string, string[]> filesByDirectory, public static bool ExtractFromPackage(FileSystem.FileSystem fileSystem, string srcPath, string package, Dictionary<string, string[]> filesByDirectory,
string destPath, bool overwrite, ContentInstaller.FilenameCase caseModifier, Action<string> onProgress, Action<string> onError) string destPath, bool overwrite, ContentInstaller.FilenameCase caseModifier, Action<string> onProgress, Action<string> onError)
{ {
Directory.CreateDirectory(destPath); Directory.CreateDirectory(destPath);
Log.Write("debug", "Mounting {0}".F(srcPath)); Log.Write("debug", "Mounting {0}".F(srcPath));
Game.ModData.ModFiles.Mount(srcPath); fileSystem.Mount(srcPath);
Log.Write("debug", "Mounting {0}".F(package)); Log.Write("debug", "Mounting {0}".F(package));
Game.ModData.ModFiles.Mount(package); fileSystem.Mount(package);
foreach (var directory in filesByDirectory) foreach (var directory in filesByDirectory)
{ {
@@ -86,7 +87,7 @@ namespace OpenRA.Mods.Common
Directory.CreateDirectory(containingDir); Directory.CreateDirectory(containingDir);
using (var sourceStream = Game.ModData.ModFiles.Open(file)) using (var sourceStream = fileSystem.Open(file))
using (var destStream = File.Create(dest)) using (var destStream = File.Create(dest))
{ {
Log.Write("debug", "Extracting {0} to {1}".F(file, dest)); Log.Write("debug", "Extracting {0} to {1}".F(file, dest));

View File

@@ -17,10 +17,10 @@ namespace OpenRA.Mods.Common.Lint
{ {
class CheckChromeLogic : ILintPass class CheckChromeLogic : ILintPass
{ {
public void Run(Action<string> emitError, Action<string> emitWarning) public void Run(Action<string> emitError, Action<string> emitWarning, ModData modData)
{ {
foreach (var filename in Game.ModData.Manifest.ChromeLayout) foreach (var filename in modData.Manifest.ChromeLayout)
CheckInner(MiniYaml.FromStream(Game.ModData.ModFiles.Open(filename)), filename, emitError); CheckInner(MiniYaml.FromStream(modData.DefaultFileSystem.Open(filename)), filename, emitError);
} }
void CheckInner(List<MiniYamlNode> nodes, string filename, Action<string> emitError) void CheckInner(List<MiniYamlNode> nodes, string filename, Action<string> emitError)

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Lint
this.emitError = emitError; this.emitError = emitError;
var sequenceSource = map != null ? map.SequenceDefinitions : new List<MiniYamlNode>(); var sequenceSource = map != null ? map.SequenceDefinitions : new List<MiniYamlNode>();
sequenceDefinitions = MiniYaml.Merge(modData.Manifest.Sequences.Select(s => MiniYaml.FromStream(modData.ModFiles.Open(s))).Append(sequenceSource)); sequenceDefinitions = MiniYaml.Merge(modData.Manifest.Sequences.Select(s => MiniYaml.FromStream(map.Open(s))).Append(sequenceSource));
var rules = map == null ? modData.DefaultRules : map.Rules; var rules = map == null ? modData.DefaultRules : map.Rules;
var factions = rules.Actors["world"].TraitInfos<FactionInfo>().Select(f => f.InternalName).ToArray(); var factions = rules.Actors["world"].TraitInfos<FactionInfo>().Select(f => f.InternalName).ToArray();

View File

@@ -18,9 +18,9 @@ namespace OpenRA.Mods.Common.Lint
{ {
class CheckSyncAnnotations : ILintPass class CheckSyncAnnotations : ILintPass
{ {
public void Run(Action<string> emitError, Action<string> emitWarning) public void Run(Action<string> emitError, Action<string> emitWarning, ModData modData)
{ {
var modTypes = Game.ModData.ObjectCreator.GetTypes(); var modTypes = modData.ObjectCreator.GetTypes();
CheckTypesWithSyncableMembersImplementSyncInterface(modTypes, emitWarning); CheckTypesWithSyncableMembersImplementSyncInterface(modTypes, emitWarning);
CheckTypesImplementingSyncInterfaceHaveSyncableMembers(modTypes, emitWarning); CheckTypesImplementingSyncInterfaceHaveSyncableMembers(modTypes, emitWarning);
} }

View File

@@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.LoadScreens
if (info.ContainsKey("Image")) if (info.ContainsKey("Image"))
{ {
using (var stream = modData.ModFiles.Open(info["Image"])) using (var stream = modData.DefaultFileSystem.Open(info["Image"]))
sheet = new Sheet(SheetType.BGRA, stream); sheet = new Sheet(SheetType.BGRA, stream);
logo = new Sprite(sheet, new Rectangle(0, 0, 256, 256), TextureChannel.Alpha); logo = new Sprite(sheet, new Rectangle(0, 0, 256, 256), TextureChannel.Alpha);

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.LoadScreens
var res = Game.Renderer.Resolution; var res = Game.Renderer.Resolution;
bounds = new Rectangle(0, 0, res.Width, res.Height); bounds = new Rectangle(0, 0, res.Width, res.Height);
using (var stream = modData.ModFiles.Open(info["Image"])) using (var stream = modData.DefaultFileSystem.Open(info["Image"]))
{ {
var sheet = new Sheet(SheetType.BGRA, stream); var sheet = new Sheet(SheetType.BGRA, stream);
sprite = new Sprite(sheet, new Rectangle(0, 0, 1024, 480), TextureChannel.Alpha); sprite = new Sprite(sheet, new Rectangle(0, 0, 1024, 480), TextureChannel.Alpha);

View File

@@ -13,6 +13,7 @@ using System.Drawing;
using System.IO; using System.IO;
using Eluant; using Eluant;
using OpenRA.Effects; using OpenRA.Effects;
using OpenRA.FileSystem;
using OpenRA.GameRules; using OpenRA.GameRules;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Effects;
@@ -165,7 +166,7 @@ namespace OpenRA.Mods.Common.Scripting
Stream s; Stream s;
try try
{ {
s = Game.ModData.ModFiles.Open(movie); s = world.Map.Open(movie);
} }
catch (FileNotFoundException e) catch (FileNotFoundException e)
{ {

View File

@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits
public void LoadPalettes(WorldRenderer wr) public void LoadPalettes(WorldRenderer wr)
{ {
wr.AddPalette(info.Name, new ImmutablePalette(Game.ModData.ModFiles.Open(world.TileSet.Palette), info.ShadowIndex), info.AllowModifiers); wr.AddPalette(info.Name, new ImmutablePalette(wr.World.Map.Open(world.TileSet.Palette), info.ShadowIndex), info.AllowModifiers);
} }
public IEnumerable<string> PaletteNames { get { yield return info.Name; } } public IEnumerable<string> PaletteNames { get { yield return info.Name; } }

View File

@@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Traits
public void LoadPalettes(WorldRenderer wr) public void LoadPalettes(WorldRenderer wr)
{ {
if (info.Tileset == null || info.Tileset.ToLowerInvariant() == world.Map.Tileset.ToLowerInvariant()) if (info.Tileset == null || info.Tileset.ToLowerInvariant() == world.Map.Tileset.ToLowerInvariant())
wr.AddPalette(info.Name, new ImmutablePalette(Game.ModData.ModFiles.Open(info.Filename), info.ShadowIndex), info.AllowModifiers); wr.AddPalette(info.Name, new ImmutablePalette(world.Map.Open(info.Filename), info.ShadowIndex), info.AllowModifiers);
} }
public IEnumerable<string> PaletteNames public IEnumerable<string> PaletteNames

View File

@@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Traits
public void LoadPalettes(WorldRenderer wr) public void LoadPalettes(WorldRenderer wr)
{ {
var filename = world.TileSet.PlayerPalette ?? world.TileSet.Palette; var filename = world.TileSet.PlayerPalette ?? world.TileSet.Palette;
wr.AddPalette(info.Name, new ImmutablePalette(Game.ModData.ModFiles.Open(filename), info.ShadowIndex), info.AllowModifiers); wr.AddPalette(info.Name, new ImmutablePalette(wr.World.Map.Open(filename), info.ShadowIndex), info.AllowModifiers);
} }
} }
} }

View File

@@ -28,16 +28,14 @@ namespace OpenRA.Mods.Common.UtilityCommands
{ {
// HACK: The engine code assumes that Game.modData is set. // HACK: The engine code assumes that Game.modData is set.
Game.ModData = modData; Game.ModData = modData;
modData.ModFiles.LoadFromManifest(modData.Manifest);
modData.SpriteSequenceLoader.OnMissingSpriteError = s => Console.WriteLine("\t" + s); modData.SpriteSequenceLoader.OnMissingSpriteError = s => Console.WriteLine("\t" + s);
foreach (var t in modData.Manifest.TileSets) foreach (var t in modData.Manifest.TileSets)
{ {
var ts = new TileSet(modData, t); var ts = new TileSet(modData.DefaultFileSystem, t);
Console.WriteLine("Tileset: " + ts.Name); Console.WriteLine("Tileset: " + ts.Name);
var sc = new SpriteCache(modData.SpriteLoaders, new SheetBuilder(SheetType.Indexed)); var sc = new SpriteCache(modData.DefaultFileSystem, modData.SpriteLoaders, new SheetBuilder(SheetType.Indexed));
var nodes = MiniYaml.Merge(modData.Manifest.Sequences.Select(s => MiniYaml.FromStream(modData.ModFiles.Open(s)))); var nodes = MiniYaml.Merge(modData.Manifest.Sequences.Select(s => MiniYaml.FromStream(modData.DefaultFileSystem.Open(s))));
foreach (var n in nodes) foreach (var n in nodes)
modData.SpriteSequenceLoader.ParseSequences(modData, ts, sc, n); modData.SpriteSequenceLoader.ParseSequences(modData, ts, sc, n);
} }

View File

@@ -56,18 +56,18 @@ namespace OpenRA.Mods.Common.UtilityCommands
var maps = new List<Map>(); var maps = new List<Map>();
if (args.Length < 2) if (args.Length < 2)
{ {
Console.WriteLine("Testing mod: {0}".F(Game.ModData.Manifest.Mod.Title)); Console.WriteLine("Testing mod: {0}".F(modData.Manifest.Mod.Title));
// Run all rule checks on the default mod rules. // Run all rule checks on the default mod rules.
CheckRules(Game.ModData.DefaultRules); CheckRules(modData, modData.DefaultRules);
// Run all generic (not mod-level) checks here. // Run all generic (not mod-level) checks here.
foreach (var customPassType in Game.ModData.ObjectCreator.GetTypesImplementing<ILintPass>()) foreach (var customPassType in modData.ObjectCreator.GetTypesImplementing<ILintPass>())
{ {
try try
{ {
var customPass = (ILintPass)Game.ModData.ObjectCreator.CreateBasic(customPassType); var customPass = (ILintPass)modData.ObjectCreator.CreateBasic(customPassType);
customPass.Run(EmitError, EmitWarning); customPass.Run(EmitError, EmitWarning, modData);
} }
catch (Exception e) catch (Exception e)
{ {
@@ -75,8 +75,8 @@ namespace OpenRA.Mods.Common.UtilityCommands
} }
} }
Game.ModData.MapCache.LoadMaps(); modData.MapCache.LoadMaps();
maps.AddRange(Game.ModData.MapCache maps.AddRange(modData.MapCache
.Where(m => m.Status == MapStatus.Available) .Where(m => m.Status == MapStatus.Available)
.Select(m => new Map(m.Path))); .Select(m => new Map(m.Path)));
} }
@@ -90,14 +90,14 @@ namespace OpenRA.Mods.Common.UtilityCommands
// Run all rule checks on the map if it defines custom rules. // Run all rule checks on the map if it defines custom rules.
if (testMap.RuleDefinitions.Any() || testMap.VoiceDefinitions.Any() || testMap.WeaponDefinitions.Any()) if (testMap.RuleDefinitions.Any() || testMap.VoiceDefinitions.Any() || testMap.WeaponDefinitions.Any())
CheckRules(testMap.Rules, testMap); CheckRules(modData, testMap.Rules, testMap);
// Run all map-level checks here. // Run all map-level checks here.
foreach (var customMapPassType in Game.ModData.ObjectCreator.GetTypesImplementing<ILintMapPass>()) foreach (var customMapPassType in modData.ObjectCreator.GetTypesImplementing<ILintMapPass>())
{ {
try try
{ {
var customMapPass = (ILintMapPass)Game.ModData.ObjectCreator.CreateBasic(customMapPassType); var customMapPass = (ILintMapPass)modData.ObjectCreator.CreateBasic(customMapPassType);
customMapPass.Run(EmitError, EmitWarning, testMap); customMapPass.Run(EmitError, EmitWarning, testMap);
} }
catch (Exception e) catch (Exception e)
@@ -120,14 +120,14 @@ namespace OpenRA.Mods.Common.UtilityCommands
} }
} }
void CheckRules(Ruleset rules, Map map = null) void CheckRules(ModData modData, Ruleset rules, Map map = null)
{ {
foreach (var customRulesPassType in Game.ModData.ObjectCreator.GetTypesImplementing<ILintRulesPass>()) foreach (var customRulesPassType in modData.ObjectCreator.GetTypesImplementing<ILintRulesPass>())
{ {
try try
{ {
Game.ModData.RulesetCache.Load(map); modData.RulesetCache.Load(modData.DefaultFileSystem, map);
var customRulesPass = (ILintRulesPass)Game.ModData.ObjectCreator.CreateBasic(customRulesPassType); var customRulesPass = (ILintRulesPass)modData.ObjectCreator.CreateBasic(customRulesPassType);
customRulesPass.Run(EmitError, EmitWarning, rules); customRulesPass.Run(EmitError, EmitWarning, rules);
} }
catch (Exception e) catch (Exception e)

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
var palette = new ImmutablePalette(args[2], shadowIndex); var palette = new ImmutablePalette(args[2], shadowIndex);
var frames = SpriteLoader.GetFrames(src, modData.SpriteLoaders); var frames = SpriteLoader.GetFrames(modData.DefaultFileSystem, src, modData.SpriteLoaders);
var usePadding = !args.Contains("--nopadding"); var usePadding = !args.Contains("--nopadding");
var count = 0; var count = 0;

View File

@@ -27,11 +27,10 @@ namespace OpenRA.Mods.Common.UtilityCommands
public void Run(ModData modData, string[] args) public void Run(ModData modData, string[] args)
{ {
var files = args.Skip(1); var files = args.Skip(1);
modData.ModFiles.LoadFromManifest(modData.Manifest);
foreach (var f in files) foreach (var f in files)
{ {
var src = modData.ModFiles.Open(f); var src = modData.DefaultFileSystem.Open(f);
if (src == null) if (src == null)
throw new InvalidOperationException("File not found: {0}".F(f)); throw new InvalidOperationException("File not found: {0}".F(f));
var data = src.ReadAllBytes(); var data = src.ReadAllBytes();

View File

@@ -29,13 +29,13 @@ namespace OpenRA.Mods.Common.UtilityCommands
{ {
// HACK: The engine code assumes that Game.modData is set. // HACK: The engine code assumes that Game.modData is set.
Game.ModData = modData; Game.ModData = modData;
Game.ModData.RulesetCache.Load(); modData.RulesetCache.Load(modData.DefaultFileSystem);
var types = Game.ModData.ObjectCreator.GetTypes(); var types = Game.ModData.ObjectCreator.GetTypes();
var translatableFields = types.SelectMany(t => t.GetFields()) var translatableFields = types.SelectMany(t => t.GetFields())
.Where(f => f.HasAttribute<TranslateAttribute>()).Distinct(); .Where(f => f.HasAttribute<TranslateAttribute>()).Distinct();
foreach (var filename in Game.ModData.Manifest.ChromeLayout) foreach (var filename in modData.Manifest.ChromeLayout)
{ {
Console.WriteLine("# {0}:", filename); Console.WriteLine("# {0}:", filename);
var yaml = MiniYaml.FromFile(filename); var yaml = MiniYaml.FromFile(filename);

View File

@@ -31,7 +31,6 @@ namespace OpenRA.Mods.Common.UtilityCommands
{ {
// HACK: The engine code assumes that Game.modData is set. // HACK: The engine code assumes that Game.modData is set.
Game.ModData = modData; Game.ModData = modData;
modData.ModFiles.LoadFromManifest(Game.ModData.Manifest);
var imageField = typeof(TerrainTemplateInfo).GetField("Image"); var imageField = typeof(TerrainTemplateInfo).GetField("Image");
var pickAnyField = typeof(TerrainTemplateInfo).GetField("PickAny"); var pickAnyField = typeof(TerrainTemplateInfo).GetField("PickAny");
@@ -43,10 +42,10 @@ namespace OpenRA.Mods.Common.UtilityCommands
var single = new int2(1, 1); var single = new int2(1, 1);
var exts = new[] { "" }.Concat(args[1].Split(',')); var exts = new[] { "" }.Concat(args[1].Split(','));
foreach (var t in Game.ModData.Manifest.TileSets) foreach (var t in modData.Manifest.TileSets)
{ {
var ts = new TileSet(Game.ModData, t); var ts = new TileSet(modData.DefaultFileSystem, t);
var frameCache = new FrameCache(Game.ModData.SpriteLoaders); var frameCache = new FrameCache(modData.DefaultFileSystem, modData.SpriteLoaders);
Console.WriteLine("Tileset: " + ts.Name); Console.WriteLine("Tileset: " + ts.Name);
foreach (var template in ts.Templates.Values) foreach (var template in ts.Templates.Values)
@@ -55,7 +54,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
foreach (var ext in exts) foreach (var ext in exts)
{ {
Stream s; Stream s;
if (modData.ModFiles.TryOpen(template.Images[0] + ext, out s)) if (modData.DefaultFileSystem.TryOpen(template.Images[0] + ext, out s))
s.Dispose(); s.Dispose();
else else
continue; continue;

View File

@@ -29,6 +29,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
MapSize = mapSize; MapSize = mapSize;
} }
public ModData ModData;
public Map Map; public Map Map;
public Ruleset Rules; public Ruleset Rules;
public List<string> Players = new List<string>(); public List<string> Players = new List<string>();
@@ -42,13 +43,14 @@ namespace OpenRA.Mods.Common.UtilityCommands
[Desc("FILENAME", "Convert a legacy INI/MPR map to the OpenRA format.")] [Desc("FILENAME", "Convert a legacy INI/MPR map to the OpenRA format.")]
public virtual void Run(ModData modData, string[] args) public virtual void Run(ModData modData, string[] args)
{ {
ModData = modData;
// HACK: The engine code assumes that Game.modData is set. // HACK: The engine code assumes that Game.modData is set.
Game.ModData = modData; Game.ModData = modData;
Rules = modData.RulesetCache.Load(modData.DefaultFileSystem);
Rules = Game.ModData.RulesetCache.Load();
var filename = args[1]; var filename = args[1];
using (var stream = Game.ModData.ModFiles.Open(filename)) using (var stream = modData.DefaultFileSystem.Open(filename))
{ {
var file = new IniFile(stream); var file = new IniFile(stream);
var basic = file.GetSection("Basic"); var basic = file.GetSection("Basic");
@@ -66,7 +68,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
Map.Description = ExtractBriefing(file); Map.Description = ExtractBriefing(file);
Map.RequiresMod = Game.ModData.Manifest.Mod.Id; Map.RequiresMod = modData.Manifest.Mod.Id;
SetBounds(Map, mapSection); SetBounds(Map, mapSection);

View File

@@ -38,17 +38,17 @@ namespace OpenRA.Mods.Common.UtilityCommands
remap[i] = i; remap[i] = i;
var srcMod = args[1].Split(':')[0]; var srcMod = args[1].Split(':')[0];
var srcModData = new ModData(srcMod);
Game.ModData = srcModData;
Game.ModData = new ModData(srcMod); var srcRules = srcModData.RulesetCache.Load(srcModData.DefaultFileSystem);
Game.ModData.ModFiles.LoadFromManifest(Game.ModData.Manifest);
var srcRules = Game.ModData.RulesetCache.Load();
var srcPaletteInfo = srcRules.Actors["player"].TraitInfo<PlayerColorPaletteInfo>(); var srcPaletteInfo = srcRules.Actors["player"].TraitInfo<PlayerColorPaletteInfo>();
var srcRemapIndex = srcPaletteInfo.RemapIndex; var srcRemapIndex = srcPaletteInfo.RemapIndex;
var destMod = args[2].Split(':')[0]; var destMod = args[2].Split(':')[0];
Game.ModData = new ModData(destMod); var destModData = new ModData(destMod);
Game.ModData.ModFiles.LoadFromManifest(Game.ModData.Manifest); Game.ModData = destModData;
var destRules = Game.ModData.RulesetCache.Load(); var destRules = destModData.RulesetCache.Load(destModData.DefaultFileSystem);
var destPaletteInfo = destRules.Actors["player"].TraitInfo<PlayerColorPaletteInfo>(); var destPaletteInfo = destRules.Actors["player"].TraitInfo<PlayerColorPaletteInfo>();
var destRemapIndex = destPaletteInfo.RemapIndex; var destRemapIndex = destPaletteInfo.RemapIndex;
var shadowIndex = new int[] { }; var shadowIndex = new int[] { };

View File

@@ -26,6 +26,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
readonly IEnumerable<IReadOnlyPackage> acceptablePackages; readonly IEnumerable<IReadOnlyPackage> acceptablePackages;
readonly World world; readonly World world;
readonly ModData modData;
Widget panel; Widget panel;
@@ -49,6 +50,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
public AssetBrowserLogic(Widget widget, Action onExit, World world, Dictionary<string, MiniYaml> logicArgs) public AssetBrowserLogic(Widget widget, Action onExit, World world, Dictionary<string, MiniYaml> logicArgs)
{ {
this.world = world; this.world = world;
modData = Game.ModData;
panel = widget; panel = widget;
@@ -217,7 +219,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
else else
allowedExtensions = new string[0]; allowedExtensions = new string[0];
acceptablePackages = Game.ModData.ModFiles.MountedPackages.Where(p => acceptablePackages = modData.ModFiles.MountedPackages.Where(p =>
p.Contents.Any(c => allowedExtensions.Contains(Path.GetExtension(c).ToLowerInvariant()))); p.Contents.Any(c => allowedExtensions.Contains(Path.GetExtension(c).ToLowerInvariant())));
assetList = panel.Get<ScrollPanelWidget>("ASSET_LIST"); assetList = panel.Get<ScrollPanelWidget>("ASSET_LIST");
@@ -309,7 +311,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (string.IsNullOrEmpty(filename)) if (string.IsNullOrEmpty(filename))
return false; return false;
if (!Game.ModData.ModFiles.Exists(filename)) if (!modData.DefaultFileSystem.Exists(filename))
return false; return false;
if (Path.GetExtension(filename.ToLowerInvariant()) == ".vqa") if (Path.GetExtension(filename.ToLowerInvariant()) == ".vqa")
@@ -356,7 +358,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
assetList.RemoveChildren(); assetList.RemoveChildren();
availableShps.Clear(); availableShps.Clear();
var files = assetSource != null ? assetSource.Contents : Game.ModData.ModFiles.MountedPackages.SelectMany(f => f.Contents).Distinct(); var files = assetSource != null ? assetSource.Contents : modData.ModFiles.MountedPackages.SelectMany(f => f.Contents).Distinct();
foreach (var file in files.OrderBy(s => s)) foreach (var file in files.OrderBy(s => s))
{ {
if (allowedExtensions.Any(ext => file.EndsWith(ext, true, CultureInfo.InvariantCulture))) if (allowedExtensions.Any(ext => file.EndsWith(ext, true, CultureInfo.InvariantCulture)))

View File

@@ -20,6 +20,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
public CreditsLogic(Widget widget, Action onExit) public CreditsLogic(Widget widget, Action onExit)
{ {
var panel = widget.Get("CREDITS_PANEL"); var panel = widget.Get("CREDITS_PANEL");
var modData = Game.ModData;
panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () => panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
{ {
@@ -31,7 +32,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var template = scrollPanel.Get<LabelWidget>("CREDITS_TEMPLATE"); var template = scrollPanel.Get<LabelWidget>("CREDITS_TEMPLATE");
scrollPanel.RemoveChildren(); scrollPanel.RemoveChildren();
var lines = Game.ModData.ModFiles.Open("AUTHORS").ReadAllLines(); var lines = modData.DefaultFileSystem.Open("AUTHORS").ReadAllLines();
foreach (var l in lines) foreach (var l in lines)
{ {
// Improve the formatting // Improve the formatting

View File

@@ -91,6 +91,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
insertDiskContainer.IsVisible = () => false; insertDiskContainer.IsVisible = () => false;
installingContainer.IsVisible = () => true; installingContainer.IsVisible = () => true;
progressBar.Percentage = 0; progressBar.Percentage = 0;
var modData = Game.ModData;
new Thread(() => new Thread(() =>
{ {
@@ -131,7 +132,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
statusLabel.GetText = () => "Extracting {0}".F(filename); statusLabel.GetText = () => "Extracting {0}".F(filename);
var destFile = Platform.ResolvePath("^", "Content", modId, filename.ToLowerInvariant()); var destFile = Platform.ResolvePath("^", "Content", modId, filename.ToLowerInvariant());
cabExtractor.ExtractFile(uint.Parse(archive[0]), destFile); cabExtractor.ExtractFile(uint.Parse(archive[0]), destFile);
InstallUtils.ExtractFromPackage(source, destFile, extractFiles, destDir, overwrite, installData.OutputFilenameCase, onProgress, onError); InstallUtils.ExtractFromPackage(modData.ModFiles, source, destFile, extractFiles, destDir, overwrite, installData.OutputFilenameCase, onProgress, onError);
progressBar.Percentage += installPercent; progressBar.Percentage += installPercent;
} }
} }
@@ -150,7 +151,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
retryButton.IsDisabled = () => true; retryButton.IsDisabled = () => true;
insertDiskContainer.IsVisible = () => false; insertDiskContainer.IsVisible = () => false;
installingContainer.IsVisible = () => true; installingContainer.IsVisible = () => true;
var modData = Game.ModData;
var dest = Platform.ResolvePath("^", "Content", modId); var dest = Platform.ResolvePath("^", "Content", modId);
var copyFiles = installData.CopyFilesFromCD; var copyFiles = installData.CopyFilesFromCD;
@@ -189,7 +190,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (!string.IsNullOrEmpty(extractPackage)) if (!string.IsNullOrEmpty(extractPackage))
{ {
if (!InstallUtils.ExtractFromPackage(source, extractPackage, extractFiles, dest, if (!InstallUtils.ExtractFromPackage(modData.ModFiles, source, extractPackage, extractFiles, dest,
overwrite, installData.OutputFilenameCase, onProgress, onError)) overwrite, installData.OutputFilenameCase, onProgress, onError))
{ {
onError("Extracting files from CD failed."); onError("Extracting files from CD failed.");

View File

@@ -24,6 +24,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
enum PlayingVideo { None, Info, Briefing, GameStart } enum PlayingVideo { None, Info, Briefing, GameStart }
readonly ModData modData;
readonly Action onStart; readonly Action onStart;
readonly ScrollPanelWidget descriptionPanel; readonly ScrollPanelWidget descriptionPanel;
readonly LabelWidget description; readonly LabelWidget description;
@@ -53,7 +54,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public MissionBrowserLogic(Widget widget, World world, Action onStart, Action onExit) public MissionBrowserLogic(Widget widget, World world, Action onStart, Action onExit)
{ {
var modData = Game.ModData; modData = Game.ModData;
this.onStart = onStart; this.onStart = onStart;
missionList = widget.Get<ScrollPanelWidget>("MISSION_LIST"); missionList = widget.Get<ScrollPanelWidget>("MISSION_LIST");
@@ -100,7 +101,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (modData.Manifest.Missions.Any()) if (modData.Manifest.Missions.Any())
{ {
var yaml = MiniYaml.Merge(modData.Manifest.Missions.Select( var yaml = MiniYaml.Merge(modData.Manifest.Missions.Select(
m => MiniYaml.FromStream(modData.ModFiles.Open(m)))); m => MiniYaml.FromStream(modData.DefaultFileSystem.Open(m))));
foreach (var kv in yaml) foreach (var kv in yaml)
{ {
@@ -178,11 +179,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var briefingVideo = selectedMap.Videos.Briefing; var briefingVideo = selectedMap.Videos.Briefing;
var briefingVideoVisible = briefingVideo != null; var briefingVideoVisible = briefingVideo != null;
var briefingVideoDisabled = !(briefingVideoVisible && Game.ModData.ModFiles.Exists(briefingVideo)); var briefingVideoDisabled = !(briefingVideoVisible && modData.DefaultFileSystem.Exists(briefingVideo));
var infoVideo = selectedMap.Videos.BackgroundInfo; var infoVideo = selectedMap.Videos.BackgroundInfo;
var infoVideoVisible = infoVideo != null; var infoVideoVisible = infoVideo != null;
var infoVideoDisabled = !(infoVideoVisible && Game.ModData.ModFiles.Exists(infoVideo)); var infoVideoDisabled = !(infoVideoVisible && modData.DefaultFileSystem.Exists(infoVideo));
startBriefingVideoButton.IsVisible = () => briefingVideoVisible && playingVideo != PlayingVideo.Briefing; startBriefingVideoButton.IsVisible = () => briefingVideoVisible && playingVideo != PlayingVideo.Briefing;
startBriefingVideoButton.IsDisabled = () => briefingVideoDisabled || playingVideo != PlayingVideo.None; startBriefingVideoButton.IsDisabled = () => briefingVideoDisabled || playingVideo != PlayingVideo.None;
@@ -308,7 +309,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Order.Command("state {0}".F(Session.ClientState.Ready)) Order.Command("state {0}".F(Session.ClientState.Ready))
}; };
if (gameStartVideo != null && Game.ModData.ModFiles.Exists(gameStartVideo)) if (gameStartVideo != null && modData.DefaultFileSystem.Exists(gameStartVideo))
{ {
var fsPlayer = fullscreenVideoPlayer.Get<VqaPlayerWidget>("PLAYER"); var fsPlayer = fullscreenVideoPlayer.Get<VqaPlayerWidget>("PLAYER");
fullscreenVideoPlayer.Visible = true; fullscreenVideoPlayer.Visible = true;

View File

@@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Widgets
{ {
if (filename == cachedVideo) if (filename == cachedVideo)
return; return;
var video = new VqaReader(Game.ModData.ModFiles.Open(filename)); var video = new VqaReader(Game.ModData.DefaultFileSystem.Open(filename));
cachedVideo = filename; cachedVideo = filename;
Open(video); Open(video);

View File

@@ -43,7 +43,7 @@ namespace OpenRA.Mods.D2k.Traits
public void LoadPalettes(WorldRenderer wr) public void LoadPalettes(WorldRenderer wr)
{ {
var colors = new uint[Palette.Size]; var colors = new uint[Palette.Size];
using (var s = Game.ModData.ModFiles.Open(info.Filename)) using (var s = wr.World.Map.Open(info.Filename))
{ {
s.Seek(info.Offset, SeekOrigin.Begin); s.Seek(info.Offset, SeekOrigin.Begin);

View File

@@ -43,7 +43,7 @@ namespace OpenRA.Mods.D2k.Traits
public void LoadPalettes(WorldRenderer wr) public void LoadPalettes(WorldRenderer wr)
{ {
var colors = new uint[Palette.Size]; var colors = new uint[Palette.Size];
using (var s = Game.ModData.ModFiles.Open(info.Filename)) using (var s = wr.World.Map.Open(info.Filename))
{ {
s.Seek(info.Offset, SeekOrigin.Begin); s.Seek(info.Offset, SeekOrigin.Begin);

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.D2k.UtilityCommands
// HACK: The engine code assumes that Game.modData is set. // HACK: The engine code assumes that Game.modData is set.
Game.ModData = modData; Game.ModData = modData;
var rules = Game.ModData.RulesetCache.Load(); var rules = modData.RulesetCache.Load(modData.DefaultFileSystem);
var map = D2kMapImporter.Import(args[1], modData.Manifest.Mod.Id, args[2], rules); var map = D2kMapImporter.Import(args[1], modData.Manifest.Mod.Id, args[2], rules);

View File

@@ -70,10 +70,10 @@ namespace OpenRA.Mods.TS.UtilityCommands
for (var i = 1; i <= sectionCount; i++, templateIndex++) for (var i = 1; i <= sectionCount; i++, templateIndex++)
{ {
var templateFilename = "{0}{1:D2}.{2}".F(sectionFilename, i, extension); var templateFilename = "{0}{1:D2}.{2}".F(sectionFilename, i, extension);
if (!Game.ModData.ModFiles.Exists(templateFilename)) if (!modData.DefaultFileSystem.Exists(templateFilename))
continue; continue;
using (var s = Game.ModData.ModFiles.Open(templateFilename)) using (var s = modData.DefaultFileSystem.Open(templateFilename))
{ {
Console.WriteLine("\tTemplate@{0}:", templateIndex); Console.WriteLine("\tTemplate@{0}:", templateIndex);
Console.WriteLine("\t\tCategory: {0}", sectionCategory); Console.WriteLine("\t\tCategory: {0}", sectionCategory);
@@ -85,7 +85,7 @@ namespace OpenRA.Mods.TS.UtilityCommands
for (var v = 'a'; v <= 'z'; v++) for (var v = 'a'; v <= 'z'; v++)
{ {
var variant = "{0}{1:D2}{2}.{3}".F(sectionFilename, i, v, extension); var variant = "{0}{1:D2}{2}.{3}".F(sectionFilename, i, v, extension);
if (Game.ModData.ModFiles.Exists(variant)) if (modData.DefaultFileSystem.Exists(variant))
images.Add(variant); images.Add(variant);
} }