Revert format upgrader and map importers saving rules to external file.

This commit is contained in:
Paul Chote
2016-03-09 22:29:53 +00:00
parent dd677ae916
commit b0c0bf3151
4 changed files with 27 additions and 62 deletions

View File

@@ -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(() =>

View File

@@ -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.

View File

@@ -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);
}
} }
} }

View File

@@ -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));
} }
} }
} }