Merge pull request #10703 from pchote/explicitpackages

Unify filesystem package syntax.
This commit is contained in:
abcdefg30
2016-02-15 15:00:31 +01:00
15 changed files with 572 additions and 554 deletions

View File

@@ -21,6 +21,8 @@ namespace OpenRA.FileSystem
{ {
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>();
readonly Dictionary<string, IReadOnlyPackage> explicitMounts = new Dictionary<string, IReadOnlyPackage>();
Cache<string, List<IReadOnlyPackage>> fileIndex = new Cache<string, List<IReadOnlyPackage>>(_ => new List<IReadOnlyPackage>()); Cache<string, List<IReadOnlyPackage>> fileIndex = new Cache<string, List<IReadOnlyPackage>>(_ => new List<IReadOnlyPackage>());
public IReadWritePackage CreatePackage(string filename, Dictionary<string, byte[]> content) public IReadWritePackage CreatePackage(string filename, Dictionary<string, byte[]> content)
@@ -54,7 +56,13 @@ namespace OpenRA.FileSystem
if (filename.EndsWith(".hdr", StringComparison.InvariantCultureIgnoreCase)) if (filename.EndsWith(".hdr", StringComparison.InvariantCultureIgnoreCase))
return new InstallShieldCABExtractor(this, filename); return new InstallShieldCABExtractor(this, filename);
return new Folder(filename); IReadOnlyPackage parent;
string subPath = null;
if (TryGetPackageContaining(filename, out parent, out subPath))
if (parent is Folder)
return new Folder(Path.Combine(((Folder)parent).Name, subPath));
return new Folder(Platform.ResolvePath(filename));
} }
public IReadWritePackage OpenWritablePackage(string filename) public IReadWritePackage OpenWritablePackage(string filename)
@@ -67,23 +75,27 @@ namespace OpenRA.FileSystem
return new Folder(filename); return new Folder(filename);
} }
public void Mount(string name) public void Mount(string name, string explicitName = null)
{ {
var optional = name.StartsWith("~"); var optional = name.StartsWith("~");
if (optional) if (optional)
name = name.Substring(1); name = name.Substring(1);
name = Platform.ResolvePath(name); var modPackage = name.StartsWith("$");
if (modPackage)
name = name.Substring(1);
Action a = () => Mount(OpenPackage(name)); Action a = () => Mount(modPackage ? ModMetadata.AllMods[name].Package : OpenPackage(name), explicitName);
if (optional) if (optional)
{
try { a(); } try { a(); }
catch { } catch { }
}
else else
a(); a();
} }
public void Mount(IReadOnlyPackage package) public void Mount(IReadOnlyPackage package, string explicitName = null)
{ {
var mountCount = 0; var mountCount = 0;
if (mountedPackages.TryGetValue(package, out mountCount)) if (mountedPackages.TryGetValue(package, out mountCount))
@@ -101,6 +113,10 @@ namespace OpenRA.FileSystem
{ {
// Mounting the package for the first time // Mounting the package for the first time
mountedPackages.Add(package, 1); mountedPackages.Add(package, 1);
if (explicitName != null)
explicitMounts.Add(explicitName, package);
foreach (var filename in package.Contents) foreach (var filename in package.Contents)
fileIndex[filename].Add(package); fileIndex[filename].Add(package);
} }
@@ -118,6 +134,7 @@ namespace OpenRA.FileSystem
packagesForFile.RemoveAll(p => p == package); packagesForFile.RemoveAll(p => p == package);
mountedPackages.Remove(package); mountedPackages.Remove(package);
explicitMounts.Remove(package.Name);
package.Dispose(); package.Dispose();
} }
else else
@@ -132,14 +149,15 @@ namespace OpenRA.FileSystem
package.Dispose(); package.Dispose();
mountedPackages.Clear(); mountedPackages.Clear();
explicitMounts.Clear();
fileIndex = new Cache<string, List<IReadOnlyPackage>>(_ => new List<IReadOnlyPackage>()); fileIndex = new Cache<string, List<IReadOnlyPackage>>(_ => new List<IReadOnlyPackage>());
} }
public void LoadFromManifest(Manifest manifest) public void LoadFromManifest(Manifest manifest)
{ {
UnmountAll(); UnmountAll();
foreach (var pkg in manifest.Packages) foreach (var kv in manifest.Packages)
Mount(pkg); Mount(kv.Key, kv.Value);
} }
Stream GetFromCache(string filename) Stream GetFromCache(string filename)
@@ -162,58 +180,64 @@ namespace OpenRA.FileSystem
return s; return s;
} }
public bool TryOpen(string name, out Stream s) public bool TryGetPackageContaining(string path, out IReadOnlyPackage package, out string filename)
{ {
var filename = name; var explicitSplit = path.IndexOf('|');
var packageName = string.Empty; if (explicitSplit > 0 && explicitMounts.TryGetValue(path.Substring(0, explicitSplit), out package))
// Used for faction specific packages; rule out false positive on Windows C:\ drive notation
var explicitPackage = name.Contains(':') && !Directory.Exists(Path.GetDirectoryName(name));
if (explicitPackage)
{ {
var divide = name.Split(':'); filename = path.Substring(explicitSplit + 1);
packageName = divide.First(); return true;
filename = divide.Last();
} }
// Check the cache for a quick lookup if the package name is unknown package = fileIndex[path].LastOrDefault(x => x.Contains(path));
// TODO: This disables caching for explicit package requests filename = path;
if (filename.IndexOfAny(new[] { '/', '\\' }) == -1 && !explicitPackage)
return package != null;
}
public bool TryOpen(string filename, out Stream s)
{
var explicitSplit = filename.IndexOf('|');
if (explicitSplit > 0)
{ {
s = GetFromCache(filename); IReadOnlyPackage explicitPackage;
if (s != null) if (explicitMounts.TryGetValue(filename.Substring(0, explicitSplit), out explicitPackage))
return true; {
s = explicitPackage.GetStream(filename.Substring(explicitSplit + 1));
if (s != null)
return true;
}
} }
s = GetFromCache(filename);
if (s != null)
return true;
// Ask each package individually // Ask each package individually
IReadOnlyPackage package; // TODO: This fallback can be removed once the filesystem cleanups are complete
if (explicitPackage && !string.IsNullOrEmpty(packageName)) var package = mountedPackages.Keys.LastOrDefault(x => x.Contains(filename));
package = mountedPackages.Keys.LastOrDefault(x => x.Name == packageName);
else
package = mountedPackages.Keys.LastOrDefault(x => x.Contains(filename));
if (package != null) if (package != null)
{ {
s = package.GetStream(filename); s = package.GetStream(filename);
return true; return s != null;
} }
s = null; s = null;
return false; return false;
} }
public bool Exists(string name) public bool Exists(string filename)
{ {
var explicitPackage = name.Contains(':') && !Directory.Exists(Path.GetDirectoryName(name)); var explicitSplit = filename.IndexOf('|');
if (explicitPackage) if (explicitSplit > 0)
{ {
var divide = name.Split(':'); IReadOnlyPackage explicitPackage;
var packageName = divide.First(); if (explicitMounts.TryGetValue(filename.Substring(0, explicitSplit), out explicitPackage))
var filename = divide.Last(); if (explicitPackage.Contains(filename.Substring(explicitSplit + 1)))
return mountedPackages.Keys.Where(n => n.Name == packageName).Any(f => f.Contains(filename)); return true;
} }
else
return mountedPackages.Keys.Any(f => f.Contains(name)); return fileIndex.ContainsKey(filename);
} }
} }
} }

View File

@@ -35,11 +35,12 @@ namespace OpenRA
{ {
public readonly ModMetadata Mod; public readonly ModMetadata Mod;
public readonly string[] public readonly string[]
Packages, Rules, ServerTraits, Rules, ServerTraits,
Sequences, VoxelSequences, Cursors, Chrome, Assemblies, ChromeLayout, Sequences, VoxelSequences, Cursors, Chrome, Assemblies, ChromeLayout,
Weapons, Voices, Notifications, Music, Translations, TileSets, Weapons, Voices, Notifications, Music, Translations, TileSets,
ChromeMetrics, MapCompatibility, Missions; ChromeMetrics, MapCompatibility, Missions;
public readonly IReadOnlyDictionary<string, string> Packages;
public readonly IReadOnlyDictionary<string, string> MapFolders; public readonly IReadOnlyDictionary<string, string> MapFolders;
public readonly MiniYaml LoadScreen; public readonly MiniYaml LoadScreen;
public readonly MiniYaml LobbyDefaults; public readonly MiniYaml LobbyDefaults;
@@ -69,23 +70,27 @@ namespace OpenRA
Mod.Id = modId; Mod.Id = modId;
// TODO: Use fieldloader // TODO: Use fieldloader
MapFolders = YamlDictionary(yaml, "MapFolders", true); MapFolders = YamlDictionary(yaml, "MapFolders");
Packages = YamlList(yaml, "Packages", true);
Rules = YamlList(yaml, "Rules", true); MiniYaml packages;
Sequences = YamlList(yaml, "Sequences", true); if (yaml.TryGetValue("Packages", out packages))
VoxelSequences = YamlList(yaml, "VoxelSequences", true); Packages = packages.ToDictionary(x => x.Value).AsReadOnly();
Cursors = YamlList(yaml, "Cursors", true);
Chrome = YamlList(yaml, "Chrome", true); Rules = YamlList(yaml, "Rules");
Assemblies = YamlList(yaml, "Assemblies", true); Sequences = YamlList(yaml, "Sequences");
ChromeLayout = YamlList(yaml, "ChromeLayout", true); VoxelSequences = YamlList(yaml, "VoxelSequences");
Weapons = YamlList(yaml, "Weapons", true); Cursors = YamlList(yaml, "Cursors");
Voices = YamlList(yaml, "Voices", true); Chrome = YamlList(yaml, "Chrome");
Notifications = YamlList(yaml, "Notifications", true); Assemblies = YamlList(yaml, "Assemblies");
Music = YamlList(yaml, "Music", true); ChromeLayout = YamlList(yaml, "ChromeLayout");
Translations = YamlList(yaml, "Translations", true); Weapons = YamlList(yaml, "Weapons");
TileSets = YamlList(yaml, "TileSets", true); Voices = YamlList(yaml, "Voices");
ChromeMetrics = YamlList(yaml, "ChromeMetrics", true); Notifications = YamlList(yaml, "Notifications");
Missions = YamlList(yaml, "Missions", true); Music = YamlList(yaml, "Music");
Translations = YamlList(yaml, "Translations");
TileSets = YamlList(yaml, "TileSets");
ChromeMetrics = YamlList(yaml, "ChromeMetrics");
Missions = YamlList(yaml, "Missions");
ServerTraits = YamlList(yaml, "ServerTraits"); ServerTraits = YamlList(yaml, "ServerTraits");
@@ -96,10 +101,10 @@ namespace OpenRA
throw new InvalidDataException("`LobbyDefaults` section is not defined."); throw new InvalidDataException("`LobbyDefaults` section is not defined.");
Fonts = yaml["Fonts"].ToDictionary(my => Fonts = yaml["Fonts"].ToDictionary(my =>
{ {
var nd = my.ToDictionary(); var nd = my.ToDictionary();
return Pair.New(nd["Font"].Value, Exts.ParseIntegerInvariant(nd["Size"].Value)); return Pair.New(nd["Font"].Value, Exts.ParseIntegerInvariant(nd["Size"].Value));
}); });
RequiresMods = yaml["RequiresMods"].ToDictionary(my => my.Value); RequiresMods = yaml["RequiresMods"].ToDictionary(my => my.Value);
@@ -152,35 +157,15 @@ namespace OpenRA
if (!yaml.ContainsKey(key)) if (!yaml.ContainsKey(key))
return new string[] { }; return new string[] { };
if (parsePaths)
return yaml[key].Nodes.Select(node => Platform.ResolvePath(node.Key, node.Value.Value ?? string.Empty)).ToArray();
return yaml[key].ToDictionary().Keys.ToArray(); return yaml[key].ToDictionary().Keys.ToArray();
} }
static IReadOnlyDictionary<string, string> YamlDictionary(Dictionary<string, MiniYaml> yaml, string key, bool parsePaths = false) static IReadOnlyDictionary<string, string> YamlDictionary(Dictionary<string, MiniYaml> yaml, string key)
{ {
if (!yaml.ContainsKey(key)) if (!yaml.ContainsKey(key))
return new ReadOnlyDictionary<string, string>(); return new ReadOnlyDictionary<string, string>();
var inner = new Dictionary<string, string>(); var inner = yaml[key].ToDictionary(my => my.Value);
foreach (var node in yaml[key].Nodes)
{
var line = node.Key;
if (node.Value.Value != null)
line += ":" + node.Value.Value;
// '@' may be used in mod.yaml to indicate extra information (similar to trait @ tags).
// Applies to MapFolders (to indicate System and User directories) and Packages (to indicate package annotation).
if (line.Contains('@'))
{
var split = line.Split('@');
inner.Add(parsePaths ? Platform.ResolvePath(split[0]) : split[0], split[1]);
}
else
inner.Add(line, null);
}
return new ReadOnlyDictionary<string, string>(inner); return new ReadOnlyDictionary<string, string>(inner);
} }

View File

@@ -16,6 +16,7 @@ using System.Linq;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using OpenRA.FileSystem;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Primitives; using OpenRA.Primitives;
@@ -45,7 +46,8 @@ namespace OpenRA
{ {
// Expand the dictionary (dir path, dir type) to a dictionary of (map path, dir type) // Expand the dictionary (dir path, dir type) to a dictionary of (map path, dir type)
var mapPaths = modData.Manifest.MapFolders.SelectMany(kv => var mapPaths = modData.Manifest.MapFolders.SelectMany(kv =>
FindMapsIn(kv.Key).ToDictionary(p => p, p => string.IsNullOrEmpty(kv.Value) ? MapClassification.Unknown : Enum<MapClassification>.Parse(kv.Value))); FindMapsIn(modData.ModFiles, kv.Key).ToDictionary(p => p, p => string.IsNullOrEmpty(kv.Value)
? MapClassification.Unknown : Enum<MapClassification>.Parse(kv.Value)));
foreach (var path in mapPaths) foreach (var path in mapPaths)
{ {
@@ -111,7 +113,7 @@ namespace OpenRA
new Download(url, _ => { }, onInfoComplete); new Download(url, _ => { }, onInfoComplete);
} }
public static IEnumerable<string> FindMapsIn(string dir) public static IEnumerable<string> FindMapsIn(FileSystem.FileSystem context, string dir)
{ {
string[] noMaps = { }; string[] noMaps = { };
@@ -119,9 +121,15 @@ namespace OpenRA
if (dir.StartsWith("~")) if (dir.StartsWith("~"))
dir = dir.Substring(1); dir = dir.Substring(1);
dir = Platform.ResolvePath(dir); // HACK: We currently only support maps loaded from Folders
// This is a temporary workaround that resolves the filesystem paths to a system directory
if (!Directory.Exists(dir)) IReadOnlyPackage package;
string filename;
if (context.TryGetPackageContaining(dir, out package, out filename))
dir = Path.Combine(package.Name, filename);
else if (Directory.Exists(Platform.ResolvePath(dir)))
dir = Platform.ResolvePath(dir);
else
return noMaps; return noMaps;
var dirsWithMaps = Directory.GetDirectories(dir) var dirsWithMaps = Directory.GetDirectories(dir)

View File

@@ -100,14 +100,6 @@ namespace OpenRA
{ {
path = path.TrimEnd(new char[] { ' ', '\t' }); path = path.TrimEnd(new char[] { ' ', '\t' });
// If the path contains ':', chances are it is a package path.
// If it isn't, someone passed an already resolved path, which is wrong.
if (path.IndexOf(":", StringComparison.Ordinal) > 1)
{
var split = path.Split(':');
return ResolvePath(split[0], split[1]);
}
// paths starting with ^ are relative to the support dir // paths starting with ^ are relative to the support dir
if (path.StartsWith("^")) if (path.StartsWith("^"))
path = SupportDir + path.Substring(1); path = SupportDir + path.Substring(1);
@@ -119,16 +111,6 @@ namespace OpenRA
return path; return path;
} }
/// <summary>Replaces package names with full paths. Avoid using this for non-package paths.</summary>
public static string ResolvePath(string package, string target)
{
// Resolve mod package paths.
if (ModMetadata.AllMods.ContainsKey(package))
package = ModMetadata.AllMods[package].Package.Name;
return ResolvePath(Path.Combine(package, target));
}
/// <summary>Replace special character prefixes with full paths.</summary> /// <summary>Replace special character prefixes with full paths.</summary>
public static string ResolvePath(params string[] path) public static string ResolvePath(params string[] path)
{ {

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;
using OpenRA.Widgets; using OpenRA.Widgets;
namespace OpenRA.Mods.Common.Widgets.Logic namespace OpenRA.Mods.Common.Widgets.Logic
@@ -29,6 +30,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public SaveMapLogic(Widget widget, Action<string> onSave, Action onExit, Map map, List<MiniYamlNode> playerDefinitions, List<MiniYamlNode> actorDefinitions) public SaveMapLogic(Widget widget, Action<string> onSave, Action onExit, Map map, List<MiniYamlNode> playerDefinitions, List<MiniYamlNode> actorDefinitions)
{ {
var modData = Game.ModData;
var title = widget.Get<TextFieldWidget>("TITLE"); var title = widget.Get<TextFieldWidget>("TITLE");
title.Text = map.Title; title.Text = map.Title;
@@ -59,14 +61,18 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Func<string, string> makeMapDirectory = dir => Func<string, string> makeMapDirectory = dir =>
{ {
var f = Platform.UnresolvePath(dir); if (dir.StartsWith("~"))
if (f.StartsWith("~")) dir = dir.Substring(1);
f = f.Substring(1);
return f; IReadOnlyPackage package;
string f;
if (modData.ModFiles.TryGetPackageContaining(dir, out package, out f))
dir = Path.Combine(package.Name, f);
return Platform.UnresolvePath(dir);
}; };
var mapDirectories = Game.ModData.Manifest.MapFolders var mapDirectories = modData.Manifest.MapFolders
.ToDictionary(kv => makeMapDirectory(kv.Key), kv => Enum<MapClassification>.Parse(kv.Value)); .ToDictionary(kv => makeMapDirectory(kv.Key), kv => Enum<MapClassification>.Parse(kv.Value));
var directoryDropdown = widget.Get<DropDownButtonWidget>("DIRECTORY_DROPDOWN"); var directoryDropdown = widget.Get<DropDownButtonWidget>("DIRECTORY_DROPDOWN");
@@ -147,7 +153,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (playerDefinitions != null) if (playerDefinitions != null)
map.PlayerDefinitions = playerDefinitions; map.PlayerDefinitions = playerDefinitions;
map.RequiresMod = Game.ModData.Manifest.Mod.Id; map.RequiresMod = modData.Manifest.Mod.Id;
// Create the map directory if required // Create the map directory if required
Directory.CreateDirectory(Platform.ResolvePath(directoryDropdown.Text)); Directory.CreateDirectory(Platform.ResolvePath(directoryDropdown.Text));
@@ -156,13 +162,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
// Invalidate the old map metadata // Invalidate the old map metadata
if (map.Uid != null && combinedPath == map.Path) if (map.Uid != null && combinedPath == map.Path)
Game.ModData.MapCache[map.Uid].Invalidate(); modData.MapCache[map.Uid].Invalidate();
map.Save(combinedPath); map.Save(combinedPath);
// Update the map cache so it can be loaded without restarting the game // Update the map cache so it can be loaded without restarting the game
var classification = mapDirectories[directoryDropdown.Text]; var classification = mapDirectories[directoryDropdown.Text];
Game.ModData.MapCache[map.Uid].UpdateFromMap(map, classification); modData.MapCache[map.Uid].UpdateFromMap(map, classification);
Console.WriteLine("Saved current map at {0}", combinedPath); Console.WriteLine("Saved current map at {0}", combinedPath);
Ui.CloseWindow(); Ui.CloseWindow();

View File

@@ -10,7 +10,8 @@ RequiresMods:
Packages: Packages:
~^Content/cnc ~^Content/cnc
. .
./mods/cnc $cnc: cnc
./mods/common: common
speech.mix speech.mix
conquer.mix conquer.mix
sounds.mix sounds.mix
@@ -24,122 +25,122 @@ Packages:
~scores.mix ~scores.mix
~scores2.mix ~scores2.mix
~transit.mix ~transit.mix
./mods/cnc/bits/snow.mix cnc|bits/snow.mix
./mods/cnc/bits cnc|bits
./mods/cnc/bits/jungle cnc|bits/jungle
./mods/cnc/bits/desert cnc|bits/desert
./mods/cnc/bits/ss cnc|bits/ss
./mods/cnc/uibits cnc|uibits
MapFolders: MapFolders:
./mods/cnc/maps@System cnc|maps: System
~^maps/cnc/{DEV_VERSION}@User ~^maps/cnc/{DEV_VERSION}: User
Rules: Rules:
./mods/cnc/rules/misc.yaml cnc|rules/misc.yaml
./mods/cnc/rules/ai.yaml cnc|rules/ai.yaml
./mods/cnc/rules/player.yaml cnc|rules/player.yaml
./mods/cnc/rules/world.yaml cnc|rules/world.yaml
./mods/cnc/rules/palettes.yaml cnc|rules/palettes.yaml
./mods/cnc/rules/defaults.yaml cnc|rules/defaults.yaml
./mods/cnc/rules/structures.yaml cnc|rules/structures.yaml
./mods/cnc/rules/infantry.yaml cnc|rules/infantry.yaml
./mods/cnc/rules/vehicles.yaml cnc|rules/vehicles.yaml
./mods/cnc/rules/trees.yaml cnc|rules/trees.yaml
./mods/cnc/rules/civilian.yaml cnc|rules/civilian.yaml
./mods/cnc/rules/civilian-desert.yaml cnc|rules/civilian-desert.yaml
./mods/cnc/rules/tech.yaml cnc|rules/tech.yaml
./mods/cnc/rules/ships.yaml cnc|rules/ships.yaml
./mods/cnc/rules/aircraft.yaml cnc|rules/aircraft.yaml
./mods/cnc/rules/husks.yaml cnc|rules/husks.yaml
Sequences: Sequences:
./mods/cnc/sequences/structures.yaml cnc|sequences/structures.yaml
./mods/cnc/sequences/vehicles.yaml cnc|sequences/vehicles.yaml
./mods/cnc/sequences/infantry.yaml cnc|sequences/infantry.yaml
./mods/cnc/sequences/aircraft.yaml cnc|sequences/aircraft.yaml
./mods/cnc/sequences/decorations.yaml cnc|sequences/decorations.yaml
./mods/cnc/sequences/misc.yaml cnc|sequences/misc.yaml
./mods/cnc/sequences/funpark.yaml cnc|sequences/funpark.yaml
./mods/cnc/sequences/civilian.yaml cnc|sequences/civilian.yaml
./mods/cnc/sequences/campaign.yaml cnc|sequences/campaign.yaml
TileSets: TileSets:
./mods/cnc/tilesets/desert.yaml cnc|tilesets/desert.yaml
./mods/cnc/tilesets/winter.yaml cnc|tilesets/winter.yaml
./mods/cnc/tilesets/snow.yaml cnc|tilesets/snow.yaml
./mods/cnc/tilesets/temperat.yaml cnc|tilesets/temperat.yaml
./mods/cnc/tilesets/jungle.yaml cnc|tilesets/jungle.yaml
Weapons: Weapons:
./mods/cnc/weapons/explosions.yaml cnc|weapons/explosions.yaml
./mods/cnc/weapons/largecaliber.yaml cnc|weapons/largecaliber.yaml
./mods/cnc/weapons/missiles.yaml cnc|weapons/missiles.yaml
./mods/cnc/weapons/other.yaml cnc|weapons/other.yaml
./mods/cnc/weapons/smallcaliber.yaml cnc|weapons/smallcaliber.yaml
./mods/cnc/weapons/superweapons.yaml cnc|weapons/superweapons.yaml
Cursors: Cursors:
./mods/cnc/cursors.yaml cnc|cursors.yaml
Chrome: Chrome:
./mods/cnc/chrome.yaml cnc|chrome.yaml
Assemblies: Assemblies:
./mods/common/OpenRA.Mods.Common.dll common|OpenRA.Mods.Common.dll
./mods/cnc/OpenRA.Mods.Cnc.dll cnc|OpenRA.Mods.Cnc.dll
ChromeLayout: ChromeLayout:
./mods/cnc/chrome/mainmenu.yaml cnc|chrome/mainmenu.yaml
./mods/cnc/chrome/multiplayer.yaml cnc|chrome/multiplayer.yaml
./mods/cnc/chrome/multiplayer-browser.yaml cnc|chrome/multiplayer-browser.yaml
./mods/cnc/chrome/multiplayer-createserver.yaml cnc|chrome/multiplayer-createserver.yaml
./mods/cnc/chrome/multiplayer-directconnect.yaml cnc|chrome/multiplayer-directconnect.yaml
./mods/cnc/chrome/multiplayer-globalchat.yaml cnc|chrome/multiplayer-globalchat.yaml
./mods/cnc/chrome/lobby.yaml cnc|chrome/lobby.yaml
./mods/cnc/chrome/lobby-mappreview.yaml cnc|chrome/lobby-mappreview.yaml
./mods/cnc/chrome/lobby-players.yaml cnc|chrome/lobby-players.yaml
./mods/cnc/chrome/lobby-options.yaml cnc|chrome/lobby-options.yaml
./mods/cnc/chrome/lobby-music.yaml cnc|chrome/lobby-music.yaml
./mods/cnc/chrome/lobby-kickdialogs.yaml cnc|chrome/lobby-kickdialogs.yaml
./mods/cnc/chrome/lobby-globalchat.yaml cnc|chrome/lobby-globalchat.yaml
./mods/cnc/chrome/connection.yaml cnc|chrome/connection.yaml
./mods/cnc/chrome/color-picker.yaml cnc|chrome/color-picker.yaml
./mods/cnc/chrome/mapchooser.yaml cnc|chrome/mapchooser.yaml
./mods/cnc/chrome/replaybrowser.yaml cnc|chrome/replaybrowser.yaml
./mods/cnc/chrome/ingame.yaml cnc|chrome/ingame.yaml
./mods/cnc/chrome/ingame-chat.yaml cnc|chrome/ingame-chat.yaml
./mods/cnc/chrome/ingame-menu.yaml cnc|chrome/ingame-menu.yaml
./mods/cnc/chrome/ingame-debug.yaml cnc|chrome/ingame-debug.yaml
./mods/cnc/chrome/ingame-info.yaml cnc|chrome/ingame-info.yaml
./mods/cnc/chrome/ingame-infobriefing.yaml cnc|chrome/ingame-infobriefing.yaml
./mods/cnc/chrome/ingame-infoscripterror.yaml cnc|chrome/ingame-infoscripterror.yaml
./mods/cnc/chrome/ingame-infoobjectives.yaml cnc|chrome/ingame-infoobjectives.yaml
./mods/cnc/chrome/ingame-infostats.yaml cnc|chrome/ingame-infostats.yaml
./mods/cnc/chrome/ingame-observerstats.yaml cnc|chrome/ingame-observerstats.yaml
./mods/cnc/chrome/music.yaml cnc|chrome/music.yaml
./mods/cnc/chrome/settings.yaml cnc|chrome/settings.yaml
./mods/cnc/chrome/credits.yaml cnc|chrome/credits.yaml
./mods/cnc/chrome/dialogs.yaml cnc|chrome/dialogs.yaml
./mods/cnc/chrome/tooltips.yaml cnc|chrome/tooltips.yaml
./mods/cnc/chrome/assetbrowser.yaml cnc|chrome/assetbrowser.yaml
./mods/cnc/chrome/missionbrowser.yaml cnc|chrome/missionbrowser.yaml
./mods/cnc/chrome/editor.yaml cnc|chrome/editor.yaml
Voices: Voices:
./mods/cnc/audio/voices.yaml cnc|audio/voices.yaml
Notifications: Notifications:
./mods/cnc/audio/notifications.yaml cnc|audio/notifications.yaml
Music: Music:
./mods/cnc/audio/music.yaml cnc|audio/music.yaml
Translations: Translations:
./mods/cnc/languages/english.yaml cnc|languages/english.yaml
LoadScreen: CncLoadScreen LoadScreen: CncLoadScreen
Image: ./mods/cnc/uibits/chrome.png Image: cnc|uibits/chrome.png
Text: Loading Text: Loading
ContentInstaller: ContentInstaller:
@@ -171,33 +172,33 @@ LobbyDefaults:
TechLevel: Unrestricted TechLevel: Unrestricted
ChromeMetrics: ChromeMetrics:
./mods/common/metrics.yaml common|metrics.yaml
./mods/cnc/metrics.yaml cnc|metrics.yaml
Fonts: Fonts:
Small: Small:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:12 Size:12
Regular: Regular:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:14 Size:14
Bold: Bold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:14 Size:14
Title: Title:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:32 Size:32
MediumBold: MediumBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:18 Size:18
BigBold: BigBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:24 Size:24
Tiny: Tiny:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:10 Size:10
TinyBold: TinyBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:10 Size:10
Missions: Missions:

View File

@@ -13,120 +13,124 @@ Packages:
~^Content/d2k/Movies ~^Content/d2k/Movies
~^Content/d2k/Music ~^Content/d2k/Music
. .
d2k: $d2k: d2k
$ra: ra
$cnc: cnc
./mods/common: common
SOUND.RS SOUND.RS
d2k:bits d2k|bits
d2k:bits/tex d2k|bits/tex
d2k:bits/xmas d2k|bits/xmas
d2k:uibits d2k|uibits
MapFolders: MapFolders:
d2k:maps@System d2k|maps: System
~^maps/d2k/{DEV_VERSION}@User ~^maps/d2k/{DEV_VERSION}: User
Rules: Rules:
d2k:rules/misc.yaml d2k|rules/misc.yaml
d2k:rules/ai.yaml d2k|rules/ai.yaml
d2k:rules/player.yaml d2k|rules/player.yaml
d2k:rules/world.yaml d2k|rules/world.yaml
d2k:rules/palettes.yaml d2k|rules/palettes.yaml
d2k:rules/defaults.yaml d2k|rules/defaults.yaml
d2k:rules/vehicles.yaml d2k|rules/vehicles.yaml
d2k:rules/starport.yaml d2k|rules/starport.yaml
d2k:rules/husks.yaml d2k|rules/husks.yaml
d2k:rules/structures.yaml d2k|rules/structures.yaml
d2k:rules/aircraft.yaml d2k|rules/aircraft.yaml
d2k:rules/infantry.yaml d2k|rules/infantry.yaml
d2k:rules/arrakis.yaml d2k|rules/arrakis.yaml
Sequences: Sequences:
d2k:sequences/aircraft.yaml d2k|sequences/aircraft.yaml
d2k:sequences/vehicles.yaml d2k|sequences/vehicles.yaml
d2k:sequences/infantry.yaml d2k|sequences/infantry.yaml
d2k:sequences/structures.yaml d2k|sequences/structures.yaml
d2k:sequences/misc.yaml d2k|sequences/misc.yaml
TileSets: TileSets:
d2k:tilesets/arrakis.yaml d2k|tilesets/arrakis.yaml
MapGrid: MapGrid:
TileSize: 32,32 TileSize: 32,32
Type: Rectangular Type: Rectangular
Cursors: Cursors:
d2k:cursors.yaml d2k|cursors.yaml
Chrome: Chrome:
d2k:chrome.yaml d2k|chrome.yaml
Assemblies: Assemblies:
./mods/common/OpenRA.Mods.Common.dll common|OpenRA.Mods.Common.dll
./mods/cnc/OpenRA.Mods.Cnc.dll cnc|OpenRA.Mods.Cnc.dll
./mods/d2k/OpenRA.Mods.D2k.dll d2k|OpenRA.Mods.D2k.dll
ChromeLayout: ChromeLayout:
d2k:chrome/ingame.yaml d2k|chrome/ingame.yaml
./mods/ra/chrome/ingame-chat.yaml ra|chrome/ingame-chat.yaml
./mods/ra/chrome/ingame-fmvplayer.yaml ra|chrome/ingame-fmvplayer.yaml
d2k:chrome/ingame-menu.yaml d2k|chrome/ingame-menu.yaml
./mods/ra/chrome/ingame-info.yaml ra|chrome/ingame-info.yaml
./mods/ra/chrome/ingame-infoscripterror.yaml ra|chrome/ingame-infoscripterror.yaml
./mods/ra/chrome/ingame-infobriefing.yaml ra|chrome/ingame-infobriefing.yaml
./mods/ra/chrome/ingame-infoobjectives.yaml ra|chrome/ingame-infoobjectives.yaml
d2k:chrome/ingame-infostats.yaml d2k|chrome/ingame-infostats.yaml
d2k:chrome/ingame-observer.yaml d2k|chrome/ingame-observer.yaml
./mods/ra/chrome/ingame-observerstats.yaml ra|chrome/ingame-observerstats.yaml
d2k:chrome/ingame-player.yaml d2k|chrome/ingame-player.yaml
./mods/ra/chrome/ingame-perf.yaml ra|chrome/ingame-perf.yaml
./mods/ra/chrome/ingame-debug.yaml ra|chrome/ingame-debug.yaml
d2k:chrome/mainmenu.yaml d2k|chrome/mainmenu.yaml
./mods/ra/chrome/settings.yaml ra|chrome/settings.yaml
./mods/ra/chrome/credits.yaml ra|chrome/credits.yaml
./mods/ra/chrome/lobby.yaml ra|chrome/lobby.yaml
./mods/ra/chrome/lobby-mappreview.yaml ra|chrome/lobby-mappreview.yaml
d2k:chrome/lobby-players.yaml d2k|chrome/lobby-players.yaml
d2k:chrome/lobby-options.yaml d2k|chrome/lobby-options.yaml
./mods/ra/chrome/lobby-music.yaml ra|chrome/lobby-music.yaml
./mods/ra/chrome/lobby-kickdialogs.yaml ra|chrome/lobby-kickdialogs.yaml
./mods/ra/chrome/lobby-globalchat.yaml ra|chrome/lobby-globalchat.yaml
d2k:chrome/color-picker.yaml d2k|chrome/color-picker.yaml
./mods/ra/chrome/map-chooser.yaml ra|chrome/map-chooser.yaml
./mods/ra/chrome/multiplayer.yaml ra|chrome/multiplayer.yaml
./mods/ra/chrome/multiplayer-browser.yaml ra|chrome/multiplayer-browser.yaml
./mods/ra/chrome/multiplayer-createserver.yaml ra|chrome/multiplayer-createserver.yaml
./mods/ra/chrome/multiplayer-directconnect.yaml ra|chrome/multiplayer-directconnect.yaml
./mods/ra/chrome/multiplayer-globalchat.yaml ra|chrome/multiplayer-globalchat.yaml
./mods/ra/chrome/connection.yaml ra|chrome/connection.yaml
d2k:chrome/dropdowns.yaml d2k|chrome/dropdowns.yaml
./mods/ra/chrome/musicplayer.yaml ra|chrome/musicplayer.yaml
d2k:chrome/tooltips.yaml d2k|chrome/tooltips.yaml
./mods/ra/chrome/assetbrowser.yaml ra|chrome/assetbrowser.yaml
d2k:chrome/missionbrowser.yaml d2k|chrome/missionbrowser.yaml
./mods/ra/chrome/confirmation-dialogs.yaml ra|chrome/confirmation-dialogs.yaml
./mods/ra/chrome/editor.yaml ra|chrome/editor.yaml
./mods/ra/chrome/replaybrowser.yaml ra|chrome/replaybrowser.yaml
Weapons: Weapons:
d2k:weapons/debris.yaml d2k|weapons/debris.yaml
d2k:weapons/smallguns.yaml d2k|weapons/smallguns.yaml
d2k:weapons/largeguns.yaml d2k|weapons/largeguns.yaml
d2k:weapons/missiles.yaml d2k|weapons/missiles.yaml
d2k:weapons/other.yaml d2k|weapons/other.yaml
Voices: Voices:
d2k:audio/voices.yaml d2k|audio/voices.yaml
Notifications: Notifications:
d2k:audio/notifications.yaml d2k|audio/notifications.yaml
Music: Music:
d2k:audio/music.yaml d2k|audio/music.yaml
Translations: Translations:
d2k:languages/english.yaml d2k|languages/english.yaml
LoadScreen: LogoStripeLoadScreen LoadScreen: LogoStripeLoadScreen
Image: ./mods/d2k/uibits/loadscreen.png Image: d2k|uibits/loadscreen.png
Text: Filling Crates..., Breeding Sandworms..., Fuelling carryalls..., Deploying harvesters..., Preparing 'thopters..., Summoning mentats... Text: Filling Crates..., Breeding Sandworms..., Fuelling carryalls..., Deploying harvesters..., Preparing 'thopters..., Summoning mentats...
ContentInstaller: ContentInstaller:
@@ -161,37 +165,37 @@ LobbyDefaults:
TechLevel: Unrestricted TechLevel: Unrestricted
ChromeMetrics: ChromeMetrics:
./mods/common/metrics.yaml common|metrics.yaml
d2k:metrics.yaml d2k|metrics.yaml
Fonts: Fonts:
Regular: Regular:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:14 Size:14
Bold: Bold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:14 Size:14
Title: Title:
Font:./mods/d2k/Dune2k.ttf Font: d2k|Dune2k.ttf
Size:32 Size:32
MediumBold: MediumBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:18 Size:18
BigBold: BigBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:24 Size:24
Small: Small:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:12 Size:12
Tiny: Tiny:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:10 Size:10
TinyBold: TinyBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:10 Size:10
Missions: Missions:
d2k:missions.yaml d2k|missions.yaml
SupportsMapsFrom: d2k SupportsMapsFrom: d2k

View File

@@ -8,48 +8,49 @@ RequiresMods:
Packages: Packages:
. .
./mods/modchooser ./mods/modchooser: modchooser
./mods/common: common
Cursors: Cursors:
./mods/modchooser/cursors.yaml modchooser|cursors.yaml
Chrome: Chrome:
./mods/modchooser/chrome.yaml modchooser|chrome.yaml
Assemblies: Assemblies:
./mods/common/OpenRA.Mods.Common.dll common|OpenRA.Mods.Common.dll
ChromeLayout: ChromeLayout:
./mods/modchooser/modchooser.yaml modchooser|modchooser.yaml
./mods/modchooser/install.yaml modchooser|install.yaml
Notifications: Notifications:
./mods/modchooser/notifications.yaml modchooser|notifications.yaml
LoadScreen: ModChooserLoadScreen LoadScreen: ModChooserLoadScreen
Image: ./mods/modchooser/chrome.png Image: ./mods/modchooser/chrome.png
ChromeMetrics: ChromeMetrics:
./mods/modchooser/metrics.yaml modchooser|metrics.yaml
Fonts: Fonts:
Regular: Regular:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:14 Size:14
Bold: Bold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:14 Size:14
BigBold: BigBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:24 Size:24
MediumBold: MediumBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:18 Size:18
Tiny: Tiny:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:10 Size:10
TinyBold: TinyBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:10 Size:10
LobbyDefaults: LobbyDefaults:

View File

@@ -10,7 +10,9 @@ RequiresMods:
Packages: Packages:
~^Content/ra ~^Content/ra
. .
./mods/ra $ra: ra
$cnc: cnc
./mods/common: common
~main.mix ~main.mix
redalert.mix redalert.mix
conquer.mix conquer.mix
@@ -26,121 +28,121 @@ Packages:
~scores.mix ~scores.mix
~movies1.mix ~movies1.mix
~movies2.mix ~movies2.mix
./mods/ra/bits ra|bits
./mods/ra/bits/desert ra|bits/desert
./mods/ra/uibits ra|uibits
MapFolders: MapFolders:
./mods/ra/maps@System ra|maps: System
~^maps/ra/{DEV_VERSION}@User ~^maps/ra/{DEV_VERSION}: User
Rules: Rules:
./mods/ra/rules/misc.yaml ra|rules/misc.yaml
./mods/ra/rules/ai.yaml ra|rules/ai.yaml
./mods/ra/rules/player.yaml ra|rules/player.yaml
./mods/ra/rules/palettes.yaml ra|rules/palettes.yaml
./mods/ra/rules/world.yaml ra|rules/world.yaml
./mods/ra/rules/defaults.yaml ra|rules/defaults.yaml
./mods/ra/rules/vehicles.yaml ra|rules/vehicles.yaml
./mods/ra/rules/husks.yaml ra|rules/husks.yaml
./mods/ra/rules/structures.yaml ra|rules/structures.yaml
./mods/ra/rules/infantry.yaml ra|rules/infantry.yaml
./mods/ra/rules/civilian.yaml ra|rules/civilian.yaml
./mods/ra/rules/decoration.yaml ra|rules/decoration.yaml
./mods/ra/rules/aircraft.yaml ra|rules/aircraft.yaml
./mods/ra/rules/ships.yaml ra|rules/ships.yaml
./mods/ra/rules/fakes.yaml ra|rules/fakes.yaml
Sequences: Sequences:
./mods/ra/sequences/ships.yaml ra|sequences/ships.yaml
./mods/ra/sequences/vehicles.yaml ra|sequences/vehicles.yaml
./mods/ra/sequences/structures.yaml ra|sequences/structures.yaml
./mods/ra/sequences/infantry.yaml ra|sequences/infantry.yaml
./mods/ra/sequences/aircraft.yaml ra|sequences/aircraft.yaml
./mods/ra/sequences/misc.yaml ra|sequences/misc.yaml
./mods/ra/sequences/decorations.yaml ra|sequences/decorations.yaml
TileSets: TileSets:
./mods/ra/tilesets/snow.yaml ra|tilesets/snow.yaml
./mods/ra/tilesets/interior.yaml ra|tilesets/interior.yaml
./mods/ra/tilesets/temperat.yaml ra|tilesets/temperat.yaml
./mods/ra/tilesets/desert.yaml ra|tilesets/desert.yaml
Cursors: Cursors:
./mods/ra/cursors.yaml ra|cursors.yaml
Chrome: Chrome:
./mods/ra/chrome.yaml ra|chrome.yaml
Assemblies: Assemblies:
./mods/common/OpenRA.Mods.Common.dll common|OpenRA.Mods.Common.dll
./mods/ra/OpenRA.Mods.RA.dll ra|OpenRA.Mods.RA.dll
./mods/cnc/OpenRA.Mods.Cnc.dll cnc|OpenRA.Mods.Cnc.dll
ChromeLayout: ChromeLayout:
./mods/ra/chrome/ingame.yaml ra|chrome/ingame.yaml
./mods/ra/chrome/ingame-chat.yaml ra|chrome/ingame-chat.yaml
./mods/ra/chrome/ingame-fmvplayer.yaml ra|chrome/ingame-fmvplayer.yaml
./mods/ra/chrome/ingame-info.yaml ra|chrome/ingame-info.yaml
./mods/ra/chrome/ingame-infoscripterror.yaml ra|chrome/ingame-infoscripterror.yaml
./mods/ra/chrome/ingame-infobriefing.yaml ra|chrome/ingame-infobriefing.yaml
./mods/ra/chrome/ingame-infoobjectives.yaml ra|chrome/ingame-infoobjectives.yaml
./mods/ra/chrome/ingame-infostats.yaml ra|chrome/ingame-infostats.yaml
./mods/ra/chrome/ingame-menu.yaml ra|chrome/ingame-menu.yaml
./mods/ra/chrome/ingame-observer.yaml ra|chrome/ingame-observer.yaml
./mods/ra/chrome/ingame-observerstats.yaml ra|chrome/ingame-observerstats.yaml
./mods/ra/chrome/ingame-player.yaml ra|chrome/ingame-player.yaml
./mods/ra/chrome/ingame-perf.yaml ra|chrome/ingame-perf.yaml
./mods/ra/chrome/ingame-debug.yaml ra|chrome/ingame-debug.yaml
./mods/ra/chrome/mainmenu.yaml ra|chrome/mainmenu.yaml
./mods/ra/chrome/settings.yaml ra|chrome/settings.yaml
./mods/ra/chrome/credits.yaml ra|chrome/credits.yaml
./mods/ra/chrome/lobby.yaml ra|chrome/lobby.yaml
./mods/ra/chrome/lobby-mappreview.yaml ra|chrome/lobby-mappreview.yaml
./mods/ra/chrome/lobby-players.yaml ra|chrome/lobby-players.yaml
./mods/ra/chrome/lobby-options.yaml ra|chrome/lobby-options.yaml
./mods/ra/chrome/lobby-music.yaml ra|chrome/lobby-music.yaml
./mods/ra/chrome/lobby-kickdialogs.yaml ra|chrome/lobby-kickdialogs.yaml
./mods/ra/chrome/lobby-globalchat.yaml ra|chrome/lobby-globalchat.yaml
./mods/ra/chrome/color-picker.yaml ra|chrome/color-picker.yaml
./mods/ra/chrome/map-chooser.yaml ra|chrome/map-chooser.yaml
./mods/ra/chrome/multiplayer.yaml ra|chrome/multiplayer.yaml
./mods/ra/chrome/multiplayer-browser.yaml ra|chrome/multiplayer-browser.yaml
./mods/ra/chrome/multiplayer-createserver.yaml ra|chrome/multiplayer-createserver.yaml
./mods/ra/chrome/multiplayer-directconnect.yaml ra|chrome/multiplayer-directconnect.yaml
./mods/ra/chrome/multiplayer-globalchat.yaml ra|chrome/multiplayer-globalchat.yaml
./mods/ra/chrome/connection.yaml ra|chrome/connection.yaml
./mods/ra/chrome/replaybrowser.yaml ra|chrome/replaybrowser.yaml
./mods/ra/chrome/dropdowns.yaml ra|chrome/dropdowns.yaml
./mods/ra/chrome/musicplayer.yaml ra|chrome/musicplayer.yaml
./mods/ra/chrome/tooltips.yaml ra|chrome/tooltips.yaml
./mods/ra/chrome/assetbrowser.yaml ra|chrome/assetbrowser.yaml
./mods/ra/chrome/missionbrowser.yaml ra|chrome/missionbrowser.yaml
./mods/ra/chrome/confirmation-dialogs.yaml ra|chrome/confirmation-dialogs.yaml
./mods/ra/chrome/editor.yaml ra|chrome/editor.yaml
Weapons: Weapons:
./mods/ra/weapons/explosions.yaml ra|weapons/explosions.yaml
./mods/ra/weapons/largecaliber.yaml ra|weapons/largecaliber.yaml
./mods/ra/weapons/missiles.yaml ra|weapons/missiles.yaml
./mods/ra/weapons/other.yaml ra|weapons/other.yaml
./mods/ra/weapons/smallcaliber.yaml ra|weapons/smallcaliber.yaml
./mods/ra/weapons/superweapons.yaml ra|weapons/superweapons.yaml
Voices: Voices:
./mods/ra/audio/voices.yaml ra|audio/voices.yaml
Notifications: Notifications:
./mods/ra/audio/notifications.yaml ra|audio/notifications.yaml
Music: Music:
./mods/ra/audio/music.yaml ra|audio/music.yaml
Translations: Translations:
./mods/ra/languages/english.yaml ra|languages/english.yaml
LoadScreen: LogoStripeLoadScreen LoadScreen: LogoStripeLoadScreen
Image: ./mods/ra/uibits/loadscreen.png Image: ra|uibits/loadscreen.png
Text: Filling Crates..., Charging Capacitors..., Reticulating Splines..., Planting Trees..., Building Bridges..., Aging Empires..., Compiling EVA..., Constructing Pylons..., Activating Skynet..., Splitting Atoms... Text: Filling Crates..., Charging Capacitors..., Reticulating Splines..., Planting Trees..., Building Bridges..., Aging Empires..., Compiling EVA..., Constructing Pylons..., Activating Skynet..., Splitting Atoms...
ContentInstaller: ContentInstaller:
@@ -173,37 +175,37 @@ LobbyDefaults:
TechLevel: Unrestricted TechLevel: Unrestricted
ChromeMetrics: ChromeMetrics:
./mods/common/metrics.yaml common|metrics.yaml
./mods/ra/metrics.yaml ra|metrics.yaml
Fonts: Fonts:
Regular: Regular:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:14 Size:14
Bold: Bold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:14 Size:14
Title: Title:
Font:./mods/ra/ZoodRangmah.ttf Font: ra|ZoodRangmah.ttf
Size:48 Size:48
MediumBold: MediumBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:18 Size:18
BigBold: BigBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:24 Size:24
Small: Small:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:12 Size:12
Tiny: Tiny:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:10 Size:10
TinyBold: TinyBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:10 Size:10
Missions: Missions:
./mods/ra/missions.yaml ra|missions.yaml
MapGrid: MapGrid:
TileSize: 24,24 TileSize: 24,24

View File

@@ -1,7 +1,7 @@
Speech: Speech:
Prefixes: Prefixes:
gdi: speech01.mix: gdi: speech-gdi|
nod: speech02.mix: nod: speech-nod|
Notifications: Notifications:
AirUnitLost: 00-i074 AirUnitLost: 00-i074
AirstrikeReady: 00-n160 AirstrikeReady: 00-n160

View File

@@ -10,7 +10,12 @@ RequiresMods:
Packages: Packages:
~^Content/ts ~^Content/ts
. .
./mods/ts $ts: ts
./mods/common: common
$ra: ra
$cnc: cnc
$d2k: d2k
# Tiberian Sun # Tiberian Sun
~scores.mix ~scores.mix
~sidenc01.mix ~sidenc01.mix
@@ -32,13 +37,13 @@ Packages:
isosnow.mix isosnow.mix
isotemp.mix isotemp.mix
local.mix local.mix
sidec01.mix sidec01.mix: sidebar-gdi
sidec02.mix sidec02.mix: sidebar-nod
sno.mix sno.mix
snow.mix snow.mix
sounds.mix sounds.mix
speech01.mix # EVA speech01.mix: speech-gdi
speech02.mix # Cabal speech02.mix: speech-nod
tem.mix tem.mix
temperat.mix temperat.mix
# Firestorm # Firestorm
@@ -50,65 +55,65 @@ Packages:
~e01vox01.mix ~e01vox01.mix
~e01vox02.mix ~e01vox02.mix
~ecache01.mix ~ecache01.mix
./mods/ts/bits ts|bits
./mods/ts/uibits ts|uibits
MapFolders: MapFolders:
./mods/ts/maps@System ts|maps: System
~^maps/ts/{DEV_VERSION}@User ~^maps/ts/{DEV_VERSION}: User
Rules: Rules:
./mods/ts/rules/ai.yaml ts|rules/ai.yaml
./mods/ts/rules/misc.yaml ts|rules/misc.yaml
./mods/ts/rules/player.yaml ts|rules/player.yaml
./mods/ts/rules/world.yaml ts|rules/world.yaml
./mods/ts/rules/palettes.yaml ts|rules/palettes.yaml
./mods/ts/rules/defaults.yaml ts|rules/defaults.yaml
./mods/ts/rules/aircraft.yaml ts|rules/aircraft.yaml
./mods/ts/rules/husks.yaml ts|rules/husks.yaml
./mods/ts/rules/civilian-infantry.yaml ts|rules/civilian-infantry.yaml
./mods/ts/rules/civilian-structures.yaml ts|rules/civilian-structures.yaml
./mods/ts/rules/civilian-vehicles.yaml ts|rules/civilian-vehicles.yaml
./mods/ts/rules/gdi-infantry.yaml ts|rules/gdi-infantry.yaml
./mods/ts/rules/gdi-structures.yaml ts|rules/gdi-structures.yaml
./mods/ts/rules/gdi-support.yaml ts|rules/gdi-support.yaml
./mods/ts/rules/gdi-vehicles.yaml ts|rules/gdi-vehicles.yaml
./mods/ts/rules/nod-infantry.yaml ts|rules/nod-infantry.yaml
./mods/ts/rules/nod-structures.yaml ts|rules/nod-structures.yaml
./mods/ts/rules/nod-support.yaml ts|rules/nod-support.yaml
./mods/ts/rules/nod-vehicles.yaml ts|rules/nod-vehicles.yaml
./mods/ts/rules/shared-infantry.yaml ts|rules/shared-infantry.yaml
./mods/ts/rules/shared-structures.yaml ts|rules/shared-structures.yaml
./mods/ts/rules/shared-support.yaml ts|rules/shared-support.yaml
./mods/ts/rules/shared-vehicles.yaml ts|rules/shared-vehicles.yaml
./mods/ts/rules/trees.yaml ts|rules/trees.yaml
Weapons: Weapons:
./mods/ts/weapons/bombsandgrenades.yaml ts|weapons/bombsandgrenades.yaml
./mods/ts/weapons/energyweapons.yaml ts|weapons/energyweapons.yaml
./mods/ts/weapons/explosions.yaml ts|weapons/explosions.yaml
./mods/ts/weapons/healweapons.yaml ts|weapons/healweapons.yaml
./mods/ts/weapons/largeguns.yaml ts|weapons/largeguns.yaml
./mods/ts/weapons/missiles.yaml ts|weapons/missiles.yaml
./mods/ts/weapons/otherweapons.yaml ts|weapons/otherweapons.yaml
./mods/ts/weapons/smallguns.yaml ts|weapons/smallguns.yaml
./mods/ts/weapons/superweapons.yaml ts|weapons/superweapons.yaml
Sequences: Sequences:
./mods/ts/sequences/aircraft.yaml ts|sequences/aircraft.yaml
./mods/ts/sequences/infantry.yaml ts|sequences/infantry.yaml
./mods/ts/sequences/misc.yaml ts|sequences/misc.yaml
./mods/ts/sequences/civilian.yaml ts|sequences/civilian.yaml
./mods/ts/sequences/structures.yaml ts|sequences/structures.yaml
./mods/ts/sequences/vehicles.yaml ts|sequences/vehicles.yaml
./mods/ts/sequences/trees.yaml ts|sequences/trees.yaml
VoxelSequences: VoxelSequences:
./mods/ts/sequences/voxels.yaml ts|sequences/voxels.yaml
TileSets: TileSets:
./mods/ts/tilesets/temperate.yaml ts|tilesets/temperate.yaml
./mods/ts/tilesets/snow.yaml ts|tilesets/snow.yaml
MapGrid: MapGrid:
TileSize: 48,24 TileSize: 48,24
@@ -118,75 +123,75 @@ MapGrid:
SubCellDefaultIndex: 2 SubCellDefaultIndex: 2
Cursors: Cursors:
./mods/ts/cursors.yaml ts|cursors.yaml
Chrome: Chrome:
./mods/ts/chrome.yaml ts|chrome.yaml
Assemblies: Assemblies:
./mods/common/OpenRA.Mods.Common.dll common|OpenRA.Mods.Common.dll
./mods/ra/OpenRA.Mods.RA.dll ra|OpenRA.Mods.RA.dll
./mods/cnc/OpenRA.Mods.Cnc.dll cnc|OpenRA.Mods.Cnc.dll
./mods/ts/OpenRA.Mods.TS.dll ts|OpenRA.Mods.TS.dll
ChromeLayout: ChromeLayout:
./mods/ra/chrome/ingame.yaml ra|chrome/ingame.yaml
./mods/ra/chrome/ingame-chat.yaml ra|chrome/ingame-chat.yaml
./mods/ra/chrome/ingame-fmvplayer.yaml ra|chrome/ingame-fmvplayer.yaml
./mods/ra/chrome/ingame-menu.yaml ra|chrome/ingame-menu.yaml
./mods/ts/chrome/ingame-info.yaml ts|chrome/ingame-info.yaml
./mods/ra/chrome/ingame-infoscripterror.yaml ra|chrome/ingame-infoscripterror.yaml
./mods/ra/chrome/ingame-infobriefing.yaml ra|chrome/ingame-infobriefing.yaml
./mods/ra/chrome/ingame-infoobjectives.yaml ra|chrome/ingame-infoobjectives.yaml
./mods/ra/chrome/ingame-infostats.yaml ra|chrome/ingame-infostats.yaml
d2k:chrome/ingame-observer.yaml d2k|chrome/ingame-observer.yaml
./mods/ts/chrome/ingame-observerstats.yaml ts|chrome/ingame-observerstats.yaml
./mods/ts/chrome/ingame-player.yaml ts|chrome/ingame-player.yaml
./mods/ra/chrome/ingame-perf.yaml ra|chrome/ingame-perf.yaml
./mods/ts/chrome/ingame-debug.yaml ts|chrome/ingame-debug.yaml
./mods/ra/chrome/mainmenu.yaml ra|chrome/mainmenu.yaml
./mods/ra/chrome/settings.yaml ra|chrome/settings.yaml
./mods/ra/chrome/credits.yaml ra|chrome/credits.yaml
./mods/ra/chrome/lobby.yaml ra|chrome/lobby.yaml
./mods/ra/chrome/lobby-mappreview.yaml ra|chrome/lobby-mappreview.yaml
./mods/ra/chrome/lobby-players.yaml ra|chrome/lobby-players.yaml
./mods/ra/chrome/lobby-options.yaml ra|chrome/lobby-options.yaml
./mods/ra/chrome/lobby-music.yaml ra|chrome/lobby-music.yaml
./mods/ra/chrome/lobby-kickdialogs.yaml ra|chrome/lobby-kickdialogs.yaml
./mods/ra/chrome/lobby-globalchat.yaml ra|chrome/lobby-globalchat.yaml
./mods/ts/chrome/color-picker.yaml ts|chrome/color-picker.yaml
./mods/ra/chrome/map-chooser.yaml ra|chrome/map-chooser.yaml
./mods/ra/chrome/multiplayer.yaml ra|chrome/multiplayer.yaml
./mods/ra/chrome/multiplayer-browser.yaml ra|chrome/multiplayer-browser.yaml
./mods/ra/chrome/multiplayer-createserver.yaml ra|chrome/multiplayer-createserver.yaml
./mods/ra/chrome/multiplayer-directconnect.yaml ra|chrome/multiplayer-directconnect.yaml
./mods/ra/chrome/multiplayer-globalchat.yaml ra|chrome/multiplayer-globalchat.yaml
./mods/ra/chrome/connection.yaml ra|chrome/connection.yaml
./mods/ra/chrome/replaybrowser.yaml ra|chrome/replaybrowser.yaml
./mods/ts/chrome/dropdowns.yaml ts|chrome/dropdowns.yaml
./mods/ra/chrome/musicplayer.yaml ra|chrome/musicplayer.yaml
./mods/ra/chrome/tooltips.yaml ra|chrome/tooltips.yaml
./mods/ra/chrome/assetbrowser.yaml ra|chrome/assetbrowser.yaml
./mods/ra/chrome/missionbrowser.yaml ra|chrome/missionbrowser.yaml
./mods/ra/chrome/confirmation-dialogs.yaml ra|chrome/confirmation-dialogs.yaml
./mods/ra/chrome/editor.yaml ra|chrome/editor.yaml
Voices: Voices:
./mods/ts/audio/voices.yaml ts|audio/voices.yaml
Notifications: Notifications:
./mods/ts/audio/speech-generic.yaml ts|audio/speech-generic.yaml
./mods/ts/audio/speech-singleplayer.yaml ts|audio/speech-singleplayer.yaml
./mods/ts/audio/sounds-generic.yaml ts|audio/sounds-generic.yaml
Music: Music:
./mods/ts/audio/music.yaml ts|audio/music.yaml
Translations: Translations:
./mods/ts/languages/english.yaml ts|languages/english.yaml
LoadScreen: LogoStripeLoadScreen LoadScreen: LogoStripeLoadScreen
Image: ./mods/ts/uibits/loadscreen.png Image: ts|uibits/loadscreen.png
Text: Updating EVA installation..., Changing perspective... Text: Updating EVA installation..., Changing perspective...
ContentInstaller: ContentInstaller:
@@ -218,33 +223,33 @@ LobbyDefaults:
Fog: true Fog: true
ChromeMetrics: ChromeMetrics:
./mods/common/metrics.yaml common|metrics.yaml
./mods/ts/metrics.yaml ts|metrics.yaml
Fonts: Fonts:
Regular: Regular:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:14 Size:14
Bold: Bold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:14 Size:14
Title: Title:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:32 Size:32
MediumBold: MediumBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:18 Size:18
BigBold: BigBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:24 Size:24
Small: Small:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:12 Size:12
Tiny: Tiny:
Font:./mods/common/FreeSans.ttf Font: common|FreeSans.ttf
Size:10 Size:10
TinyBold: TinyBold:
Font:./mods/common/FreeSansBold.ttf Font: common|FreeSansBold.ttf
Size:10 Size:10
SupportsMapsFrom: ts SupportsMapsFrom: ts

View File

@@ -43,7 +43,7 @@
Filename: anim.pal Filename: anim.pal
PaletteFromFile@sidebar: PaletteFromFile@sidebar:
Name: sidebar Name: sidebar
Filename: sidec02.mix:sidebar.pal Filename: sidebar-nod|sidebar.pal
PaletteFromPaletteWithAlpha@clock: PaletteFromPaletteWithAlpha@clock:
Name: iconclock Name: iconclock
BasePalette: sidebar BasePalette: sidebar

View File

@@ -66,7 +66,7 @@ e1.gdi:
ShadowStart: 190 ShadowStart: 190
die6: electro die6: electro
Length: * Length: *
icon: sidec01.mix:e1icon icon: sidebar-gdi|e1icon
e1.nod: e1.nod:
Defaults: e1 Defaults: e1
@@ -136,7 +136,7 @@ e1.nod:
ShadowStart: 190 ShadowStart: 190
die6: electro die6: electro
Length: * Length: *
icon: sidec02.mix:e1icon icon: sidebar-nod|e1icon
e2: e2:
Defaults: Defaults:
@@ -477,7 +477,7 @@ engineer.gdi:
ShadowStart: 190 ShadowStart: 190
die6: electro die6: electro
Length: * Length: *
icon: sidec01.mix:engnicon icon: sidebar-gdi|engnicon
engineer.nod: engineer.nod:
Defaults: engineer Defaults: engineer
@@ -539,7 +539,7 @@ engineer.nod:
ShadowStart: 190 ShadowStart: 190
die6: electro die6: electro
Length: * Length: *
icon: sidec02.mix:engnicon icon: sidebar-nod|engnicon
umagon: umagon:
Defaults: Defaults:

View File

@@ -912,7 +912,7 @@ napuls.gdi:
UseTilesetCode: false UseTilesetCode: false
ZOffset: 512 ZOffset: 512
BlendMode: Additive BlendMode: Additive
icon: sidec01.mix:empicon icon: sidebar-gdi|empicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -940,7 +940,7 @@ napuls.nod:
UseTilesetCode: false UseTilesetCode: false
ZOffset: 512 ZOffset: 512
BlendMode: Additive BlendMode: Additive
icon: sidec02.mix:empicon icon: sidebar-nod|empicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1190,7 +1190,7 @@ proc.gdi:
UseTilesetCode: false UseTilesetCode: false
ZOffset: 512 ZOffset: 512
BlendMode: Additive BlendMode: Additive
icon: sidec01.mix:reficon icon: sidebar-gdi|reficon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1232,7 +1232,7 @@ proc.nod:
UseTilesetCode: false UseTilesetCode: false
ZOffset: 512 ZOffset: 512
BlendMode: Additive BlendMode: Additive
icon: sidec02.mix:reficon icon: sidebar-nod|reficon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1323,7 +1323,7 @@ gasilo.gdi:
UseTilesetCode: false UseTilesetCode: false
ZOffset: 512 ZOffset: 512
BlendMode: Additive BlendMode: Additive
icon: sidec01.mix:siloicon icon: sidebar-gdi|siloicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1367,7 +1367,7 @@ gasilo.nod:
UseTilesetCode: false UseTilesetCode: false
ZOffset: 512 ZOffset: 512
BlendMode: Additive BlendMode: Additive
icon: sidec02.mix:siloicon icon: sidebar-nod|siloicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1431,7 +1431,7 @@ gadept.gdi:
UseTilesetCode: false UseTilesetCode: false
ZOffset: 512 ZOffset: 512
BlendMode: Additive BlendMode: Additive
icon: sidec01.mix:fixicon icon: sidebar-gdi|fixicon
Offset: 0, 0 Offset: 0, 0
UseTilesetCode: false UseTilesetCode: false
@@ -1495,7 +1495,7 @@ gadept.nod:
UseTilesetCode: false UseTilesetCode: false
ZOffset: 512 ZOffset: 512
BlendMode: Additive BlendMode: Additive
icon: sidec02.mix:fixicon icon: sidebar-nod|fixicon
Offset: 76, 66 Offset: 76, 66
UseTilesetCode: false UseTilesetCode: false

View File

@@ -2,13 +2,13 @@ mcv.gdi:
emp-overlay: emp_fx01 emp-overlay: emp_fx01
Length: * Length: *
BlendMode: Additive BlendMode: Additive
icon: sidec01.mix:mcvicon icon: sidebar-gdi|mcvicon
mcv.nod: mcv.nod:
emp-overlay: emp_fx01 emp-overlay: emp_fx01
Length: * Length: *
BlendMode: Additive BlendMode: Additive
icon: sidec02.mix:mcvicon icon: sidebar-nod|mcvicon
apc: apc:
emp-overlay: emp_fx01 emp-overlay: emp_fx01
@@ -22,7 +22,7 @@ harv.gdi:
BlendMode: Additive BlendMode: Additive
harvest: harvestr harvest: harvestr
Length: * Length: *
icon: sidec01.mix:harvicon icon: sidebar-gdi|harvicon
harv.nod: harv.nod:
emp-overlay: emp_fx01 emp-overlay: emp_fx01
@@ -30,7 +30,7 @@ harv.nod:
BlendMode: Additive BlendMode: Additive
harvest: harvestr harvest: harvestr
Length: * Length: *
icon: sidec02.mix:harvicon icon: sidebar-nod|harvicon
hvr: hvr:
emp-overlay: emp_fx01 emp-overlay: emp_fx01
@@ -56,7 +56,7 @@ lpst.gdi:
emp-overlay: emp_fx01 emp-overlay: emp_fx01
Length: * Length: *
BlendMode: Additive BlendMode: Additive
icon: sidec01.mix:lpsticon icon: sidebar-gdi|lpsticon
lpst.nod: lpst.nod:
idle: gadpsa idle: gadpsa
@@ -69,7 +69,7 @@ lpst.nod:
emp-overlay: emp_fx01 emp-overlay: emp_fx01
Length: * Length: *
BlendMode: Additive BlendMode: Additive
icon: sidec02.mix:lpsticon icon: sidebar-nod|lpsticon
repair: repair:
emp-overlay: emp_fx01 emp-overlay: emp_fx01