Revert format upgrader and map importers saving rules to external file.
This commit is contained in:
@@ -201,6 +201,10 @@ namespace OpenRA
|
|||||||
MapSize = new int2(size);
|
MapSize = new int2(size);
|
||||||
Tileset = tileset.Id;
|
Tileset = tileset.Id;
|
||||||
|
|
||||||
|
// Empty rules that can be added to by the importers.
|
||||||
|
// Will be dropped on save if nothing is added to it
|
||||||
|
RuleDefinitions = new MiniYaml("");
|
||||||
|
|
||||||
MapResources = Exts.Lazy(() => new CellLayer<ResourceTile>(Grid.Type, size));
|
MapResources = Exts.Lazy(() => new CellLayer<ResourceTile>(Grid.Type, size));
|
||||||
|
|
||||||
MapTiles = Exts.Lazy(() =>
|
MapTiles = Exts.Lazy(() =>
|
||||||
|
|||||||
@@ -33,10 +33,8 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
|
|
||||||
public ModData ModData;
|
public ModData ModData;
|
||||||
public Map Map;
|
public Map Map;
|
||||||
public IReadWritePackage Package;
|
|
||||||
public List<string> Players = new List<string>();
|
public List<string> Players = new List<string>();
|
||||||
public MapPlayers MapPlayers;
|
public MapPlayers MapPlayers;
|
||||||
public MiniYaml Rules = new MiniYaml("");
|
|
||||||
|
|
||||||
public bool ValidateArguments(string[] args)
|
public bool ValidateArguments(string[] args)
|
||||||
{
|
{
|
||||||
@@ -52,8 +50,6 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
Game.ModData = modData;
|
Game.ModData = modData;
|
||||||
|
|
||||||
var filename = args[1];
|
var filename = args[1];
|
||||||
var dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap";
|
|
||||||
Package = new ZipFile(modData.ModFiles, dest, true);
|
|
||||||
using (var stream = modData.DefaultFileSystem.Open(filename))
|
using (var stream = modData.DefaultFileSystem.Open(filename))
|
||||||
{
|
{
|
||||||
var file = new IniFile(stream);
|
var file = new IniFile(stream);
|
||||||
@@ -67,7 +63,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
Map = new Map(modData, modData.DefaultRules.TileSets[tileset], MapSize, MapSize)
|
Map = new Map(modData, modData.DefaultRules.TileSets[tileset], MapSize, MapSize)
|
||||||
{
|
{
|
||||||
Title = basic.GetValue("Name", Path.GetFileNameWithoutExtension(filename)),
|
Title = basic.GetValue("Name", Path.GetFileNameWithoutExtension(filename)),
|
||||||
Author = "Westwood Studios"
|
Author = "Westwood Studios",
|
||||||
};
|
};
|
||||||
|
|
||||||
Map.RequiresMod = modData.Manifest.Mod.Id;
|
Map.RequiresMod = modData.Manifest.Mod.Id;
|
||||||
@@ -96,16 +92,10 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
|
|
||||||
Map.FixOpenAreas();
|
Map.FixOpenAreas();
|
||||||
|
|
||||||
if (Rules.Nodes.Any())
|
var dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap";
|
||||||
{
|
var package = new ZipFile(modData.ModFiles, dest, true);
|
||||||
// HACK: bypassing the readonly modifier here is still better than leaving this mutable by everyone
|
|
||||||
typeof(Map).GetField("RuleDefinitions").SetValue(Map, new[] { "rules.yaml" });
|
|
||||||
|
|
||||||
var rulesText = Rules.Nodes.ToLines(false).JoinWith("\n");
|
Map.Save(package);
|
||||||
Package.Update("rules.yaml", System.Text.Encoding.ASCII.GetBytes(rulesText));
|
|
||||||
}
|
|
||||||
|
|
||||||
Map.Save(Package);
|
|
||||||
Console.WriteLine(dest + " saved.");
|
Console.WriteLine(dest + " saved.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,11 +130,11 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
if (briefing.Length == 0)
|
if (briefing.Length == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var worldNode = Rules.Nodes.FirstOrDefault(n => n.Key == "World");
|
var worldNode = Map.RuleDefinitions.Nodes.FirstOrDefault(n => n.Key == "World");
|
||||||
if (worldNode == null)
|
if (worldNode == null)
|
||||||
{
|
{
|
||||||
worldNode = new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>()));
|
worldNode = new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>()));
|
||||||
Rules.Nodes.Add(worldNode);
|
Map.RuleDefinitions.Nodes.Add(worldNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
var missionData = worldNode.Value.Nodes.FirstOrDefault(n => n.Key == "MissionData");
|
var missionData = worldNode.Value.Nodes.FirstOrDefault(n => n.Key == "MissionData");
|
||||||
@@ -201,11 +191,11 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
|
|
||||||
if (videos.Any())
|
if (videos.Any())
|
||||||
{
|
{
|
||||||
var worldNode = Rules.Nodes.FirstOrDefault(n => n.Key == "World");
|
var worldNode = Map.RuleDefinitions.Nodes.FirstOrDefault(n => n.Key == "World");
|
||||||
if (worldNode == null)
|
if (worldNode == null)
|
||||||
{
|
{
|
||||||
worldNode = new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>()));
|
worldNode = new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>()));
|
||||||
Rules.Nodes.Add(worldNode);
|
Map.RuleDefinitions.Nodes.Add(worldNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
var missionData = worldNode.Value.Nodes.FirstOrDefault(n => n.Key == "MissionData");
|
var missionData = worldNode.Value.Nodes.FirstOrDefault(n => n.Key == "MissionData");
|
||||||
@@ -298,7 +288,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
craters.Add(node);
|
craters.Add(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
var worldNode = Rules.Nodes.FirstOrDefault(n => n.Key == "World");
|
var worldNode = Map.RuleDefinitions.Nodes.FirstOrDefault(n => n.Key == "World");
|
||||||
if (worldNode == null)
|
if (worldNode == null)
|
||||||
worldNode = new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>()));
|
worldNode = new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>()));
|
||||||
|
|
||||||
@@ -316,8 +306,8 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
worldNode.Value.Nodes.Add(smudgeLayer);
|
worldNode.Value.Nodes.Add(smudgeLayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (worldNode.Value.Nodes.Any() && !Rules.Nodes.Contains(worldNode))
|
if (worldNode.Value.Nodes.Any() && !Map.RuleDefinitions.Nodes.Contains(worldNode))
|
||||||
Rules.Nodes.Add(worldNode);
|
Map.RuleDefinitions.Nodes.Add(worldNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: fix this -- will have bitrotted pretty badly.
|
// TODO: fix this -- will have bitrotted pretty badly.
|
||||||
|
|||||||
@@ -948,20 +948,10 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
rules.Value.Nodes.Add(playerNode);
|
rules.Value.Nodes.Add(playerNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format 9 -> 10 extracted map rules, sequences, voxelsequences, weapons, voices, music, notifications,
|
// Format 9 -> 10 moved smudges to SmudgeLayer, and uses map.png for all maps
|
||||||
// and translations to external files, moved smudges to SmudgeLayer, and uses map.png for all maps
|
|
||||||
if (mapFormat < 10)
|
if (mapFormat < 10)
|
||||||
{
|
{
|
||||||
ExtractSmudges(yaml);
|
ExtractSmudges(yaml);
|
||||||
ExtractOrRemoveRules(package, yaml, "Rules", "rules.yaml");
|
|
||||||
ExtractOrRemoveRules(package, yaml, "Sequences", "sequences.yaml");
|
|
||||||
ExtractOrRemoveRules(package, yaml, "VoxelSequences", "voxels.yaml");
|
|
||||||
ExtractOrRemoveRules(package, yaml, "Weapons", "weapons.yaml");
|
|
||||||
ExtractOrRemoveRules(package, yaml, "Voices", "voices.yaml");
|
|
||||||
ExtractOrRemoveRules(package, yaml, "Music", "music.yaml");
|
|
||||||
ExtractOrRemoveRules(package, yaml, "Notifications", "notifications.yaml");
|
|
||||||
ExtractOrRemoveRules(package, yaml, "Translations", "translations.yaml");
|
|
||||||
|
|
||||||
if (package.Contains("map.png"))
|
if (package.Contains("map.png"))
|
||||||
yaml.Nodes.Add(new MiniYamlNode("LockPreview", new MiniYaml("True")));
|
yaml.Nodes.Add(new MiniYamlNode("LockPreview", new MiniYaml("True")));
|
||||||
}
|
}
|
||||||
@@ -1023,22 +1013,5 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
worldNode.Value.Nodes.Add(smudgeLayer);
|
worldNode.Value.Nodes.Add(smudgeLayer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ExtractOrRemoveRules(IReadWritePackage package, MiniYaml yaml, string key, string filename)
|
|
||||||
{
|
|
||||||
var node = yaml.Nodes.FirstOrDefault(n => n.Key == key);
|
|
||||||
if (node == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (node.Value.Nodes.Any())
|
|
||||||
{
|
|
||||||
var rulesText = node.Value.Nodes.ToLines(false).JoinWith("\n");
|
|
||||||
package.Update(filename, System.Text.Encoding.ASCII.GetBytes(rulesText));
|
|
||||||
node.Value.Value = filename;
|
|
||||||
node.Value.Nodes.Clear();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
yaml.Nodes.Remove(node);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -165,8 +165,6 @@ namespace OpenRA.Mods.TS.UtilityCommands
|
|||||||
var filename = args[1];
|
var filename = args[1];
|
||||||
var file = new IniFile(File.Open(args[1], FileMode.Open));
|
var file = new IniFile(File.Open(args[1], FileMode.Open));
|
||||||
var map = GenerateMapHeader(filename, file, modData);
|
var map = GenerateMapHeader(filename, file, modData);
|
||||||
var dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap";
|
|
||||||
var package = new ZipFile(modData.DefaultFileSystem, dest, true);
|
|
||||||
|
|
||||||
ReadTiles(map, file);
|
ReadTiles(map, file);
|
||||||
ReadActors(map, file, "Structures");
|
ReadActors(map, file, "Structures");
|
||||||
@@ -175,11 +173,13 @@ namespace OpenRA.Mods.TS.UtilityCommands
|
|||||||
ReadTerrainActors(map, file);
|
ReadTerrainActors(map, file);
|
||||||
ReadWaypoints(map, file);
|
ReadWaypoints(map, file);
|
||||||
ReadOverlay(map, file);
|
ReadOverlay(map, file);
|
||||||
ReadLighting(map, package, file);
|
ReadLighting(map, file);
|
||||||
|
|
||||||
var mapPlayers = new MapPlayers(map.Rules, spawnCount);
|
var mapPlayers = new MapPlayers(map.Rules, spawnCount);
|
||||||
map.PlayerDefinitions = mapPlayers.ToMiniYaml();
|
map.PlayerDefinitions = mapPlayers.ToMiniYaml();
|
||||||
|
|
||||||
|
var dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap";
|
||||||
|
var package = new ZipFile(modData.DefaultFileSystem, dest, true);
|
||||||
map.Save(package);
|
map.Save(package);
|
||||||
Console.WriteLine(dest + " saved.");
|
Console.WriteLine(dest + " saved.");
|
||||||
}
|
}
|
||||||
@@ -431,12 +431,11 @@ namespace OpenRA.Mods.TS.UtilityCommands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReadLighting(Map map, IReadWritePackage package, IniFile file)
|
void ReadLighting(Map map, IniFile file)
|
||||||
{
|
{
|
||||||
var lightingTypes = new[] { "Red", "Green", "Blue", "Ambient" };
|
var lightingTypes = new[] { "Red", "Green", "Blue", "Ambient" };
|
||||||
var lightingSection = file.GetSection("Lighting");
|
var lightingSection = file.GetSection("Lighting");
|
||||||
var lightingNode = new MiniYamlNode("GlobalLightingPaletteEffect", new MiniYaml("", new List<MiniYamlNode>()));
|
var lightingNodes = new List<MiniYamlNode>();
|
||||||
var worldNode = new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>() { lightingNode }));
|
|
||||||
|
|
||||||
foreach (var kv in lightingSection)
|
foreach (var kv in lightingSection)
|
||||||
{
|
{
|
||||||
@@ -444,19 +443,18 @@ namespace OpenRA.Mods.TS.UtilityCommands
|
|||||||
{
|
{
|
||||||
var val = FieldLoader.GetValue<float>(kv.Key, kv.Value);
|
var val = FieldLoader.GetValue<float>(kv.Key, kv.Value);
|
||||||
if (val != 1.0f)
|
if (val != 1.0f)
|
||||||
lightingNode.Value.Nodes.Add(new MiniYamlNode(kv.Key, FieldSaver.FormatValue(val)));
|
lightingNodes.Add(new MiniYamlNode(kv.Key, FieldSaver.FormatValue(val)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Console.WriteLine("Ignoring unknown lighting type: `{0}`".F(kv.Key));
|
Console.WriteLine("Ignoring unknown lighting type: `{0}`".F(kv.Key));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lightingNode.Value.Nodes.Any())
|
if (lightingNodes.Any())
|
||||||
{
|
{
|
||||||
// HACK: bypassing the readonly modifier here is still better than leaving this mutable by everyone
|
map.RuleDefinitions.Nodes.Add(new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>()
|
||||||
typeof(Map).GetField("RuleDefinitions").SetValue(map, new[] { "rules.yaml" });
|
{
|
||||||
|
new MiniYamlNode("GlobalLightingPaletteEffect", new MiniYaml("", lightingNodes))
|
||||||
var rulesText = new List<MiniYamlNode>() { worldNode }.ToLines(false).JoinWith("\n");
|
})));
|
||||||
package.Update("rules.yaml", System.Text.Encoding.ASCII.GetBytes(rulesText));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user