diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index 87e9cc664c..a0bc1b02f3 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -201,6 +201,10 @@ namespace OpenRA MapSize = new int2(size); 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(Grid.Type, size)); MapTiles = Exts.Lazy(() => diff --git a/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs b/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs index 9d469750b3..28ee6125a2 100644 --- a/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs @@ -33,10 +33,8 @@ namespace OpenRA.Mods.Common.UtilityCommands public ModData ModData; public Map Map; - public IReadWritePackage Package; public List Players = new List(); public MapPlayers MapPlayers; - public MiniYaml Rules = new MiniYaml(""); public bool ValidateArguments(string[] args) { @@ -52,8 +50,6 @@ namespace OpenRA.Mods.Common.UtilityCommands Game.ModData = modData; 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)) { var file = new IniFile(stream); @@ -67,7 +63,7 @@ namespace OpenRA.Mods.Common.UtilityCommands Map = new Map(modData, modData.DefaultRules.TileSets[tileset], MapSize, MapSize) { Title = basic.GetValue("Name", Path.GetFileNameWithoutExtension(filename)), - Author = "Westwood Studios" + Author = "Westwood Studios", }; Map.RequiresMod = modData.Manifest.Mod.Id; @@ -96,16 +92,10 @@ namespace OpenRA.Mods.Common.UtilityCommands Map.FixOpenAreas(); - if (Rules.Nodes.Any()) - { - // 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 dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap"; + var package = new ZipFile(modData.ModFiles, dest, true); - var rulesText = Rules.Nodes.ToLines(false).JoinWith("\n"); - Package.Update("rules.yaml", System.Text.Encoding.ASCII.GetBytes(rulesText)); - } - - Map.Save(Package); + Map.Save(package); Console.WriteLine(dest + " saved."); } @@ -140,11 +130,11 @@ namespace OpenRA.Mods.Common.UtilityCommands if (briefing.Length == 0) return; - var worldNode = Rules.Nodes.FirstOrDefault(n => n.Key == "World"); + var worldNode = Map.RuleDefinitions.Nodes.FirstOrDefault(n => n.Key == "World"); if (worldNode == null) { worldNode = new MiniYamlNode("World", new MiniYaml("", new List())); - Rules.Nodes.Add(worldNode); + Map.RuleDefinitions.Nodes.Add(worldNode); } var missionData = worldNode.Value.Nodes.FirstOrDefault(n => n.Key == "MissionData"); @@ -201,11 +191,11 @@ namespace OpenRA.Mods.Common.UtilityCommands 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) { worldNode = new MiniYamlNode("World", new MiniYaml("", new List())); - Rules.Nodes.Add(worldNode); + Map.RuleDefinitions.Nodes.Add(worldNode); } var missionData = worldNode.Value.Nodes.FirstOrDefault(n => n.Key == "MissionData"); @@ -298,7 +288,7 @@ namespace OpenRA.Mods.Common.UtilityCommands 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) worldNode = new MiniYamlNode("World", new MiniYaml("", new List())); @@ -316,8 +306,8 @@ namespace OpenRA.Mods.Common.UtilityCommands worldNode.Value.Nodes.Add(smudgeLayer); } - if (worldNode.Value.Nodes.Any() && !Rules.Nodes.Contains(worldNode)) - Rules.Nodes.Add(worldNode); + if (worldNode.Value.Nodes.Any() && !Map.RuleDefinitions.Nodes.Contains(worldNode)) + Map.RuleDefinitions.Nodes.Add(worldNode); } // TODO: fix this -- will have bitrotted pretty badly. diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 153bbdf4e9..bbe3067d1d 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -948,20 +948,10 @@ namespace OpenRA.Mods.Common.UtilityCommands rules.Value.Nodes.Add(playerNode); } - // Format 9 -> 10 extracted map rules, sequences, voxelsequences, weapons, voices, music, notifications, - // and translations to external files, moved smudges to SmudgeLayer, and uses map.png for all maps + // Format 9 -> 10 moved smudges to SmudgeLayer, and uses map.png for all maps if (mapFormat < 10) { 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")) yaml.Nodes.Add(new MiniYamlNode("LockPreview", new MiniYaml("True"))); } @@ -1023,22 +1013,5 @@ namespace OpenRA.Mods.Common.UtilityCommands 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); - } } } diff --git a/OpenRA.Mods.TS/UtilityCommands/ImportTSMapCommand.cs b/OpenRA.Mods.TS/UtilityCommands/ImportTSMapCommand.cs index 48eda4f34c..16d4477e55 100644 --- a/OpenRA.Mods.TS/UtilityCommands/ImportTSMapCommand.cs +++ b/OpenRA.Mods.TS/UtilityCommands/ImportTSMapCommand.cs @@ -165,8 +165,6 @@ namespace OpenRA.Mods.TS.UtilityCommands var filename = args[1]; var file = new IniFile(File.Open(args[1], FileMode.Open)); var map = GenerateMapHeader(filename, file, modData); - var dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap"; - var package = new ZipFile(modData.DefaultFileSystem, dest, true); ReadTiles(map, file); ReadActors(map, file, "Structures"); @@ -175,11 +173,13 @@ namespace OpenRA.Mods.TS.UtilityCommands ReadTerrainActors(map, file); ReadWaypoints(map, file); ReadOverlay(map, file); - ReadLighting(map, package, file); + ReadLighting(map, file); var mapPlayers = new MapPlayers(map.Rules, spawnCount); map.PlayerDefinitions = mapPlayers.ToMiniYaml(); + var dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap"; + var package = new ZipFile(modData.DefaultFileSystem, dest, true); map.Save(package); 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 lightingSection = file.GetSection("Lighting"); - var lightingNode = new MiniYamlNode("GlobalLightingPaletteEffect", new MiniYaml("", new List())); - var worldNode = new MiniYamlNode("World", new MiniYaml("", new List() { lightingNode })); + var lightingNodes = new List(); foreach (var kv in lightingSection) { @@ -444,19 +443,18 @@ namespace OpenRA.Mods.TS.UtilityCommands { var val = FieldLoader.GetValue(kv.Key, kv.Value); 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 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 - typeof(Map).GetField("RuleDefinitions").SetValue(map, new[] { "rules.yaml" }); - - var rulesText = new List() { worldNode }.ToLines(false).JoinWith("\n"); - package.Update("rules.yaml", System.Text.Encoding.ASCII.GetBytes(rulesText)); + map.RuleDefinitions.Nodes.Add(new MiniYamlNode("World", new MiniYaml("", new List() + { + new MiniYamlNode("GlobalLightingPaletteEffect", new MiniYaml("", lightingNodes)) + }))); } } }