From 6389e9aa5c5c514ee4c5c62401a0463543a16b6c Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 22 Feb 2016 20:59:14 +0000 Subject: [PATCH] Fix automated map format upgrades. --- .../UtilityCommands/UpgradeMapCommand.cs | 23 ++++++--- .../UtilityCommands/UpgradeModCommand.cs | 49 ++++++++++++++----- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeMapCommand.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeMapCommand.cs index 2d351c3e7f..3070183e4c 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeMapCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeMapCommand.cs @@ -10,6 +10,8 @@ #endregion using System; +using System.Collections.Generic; +using System.Text; using OpenRA.FileSystem; namespace OpenRA.Mods.Common.UtilityCommands @@ -23,13 +25,10 @@ namespace OpenRA.Mods.Common.UtilityCommands return args.Length >= 3; } - [Desc("MAP", "CURRENTENGINE", "Upgrade map rules to the latest engine version.")] - public void Run(ModData modData, string[] args) + public static void UpgradeMap(ModData modData, IReadWritePackage package, int engineDate) { - // HACK: The engine code assumes that Game.modData is set. - Game.ModData = modData; + UpgradeRules.UpgradeMapFormat(modData, package); - var engineDate = Exts.ParseIntegerInvariant(args[2]); if (engineDate < UpgradeRules.MinimumSupportedVersion) { Console.WriteLine("Unsupported engine version. Use the release-{0} utility to update to that version, and then try again", @@ -37,9 +36,6 @@ namespace OpenRA.Mods.Common.UtilityCommands return; } - var package = modData.ModFiles.OpenWritablePackage(args[1]); - UpgradeRules.UpgradeMapFormat(modData, package); - var map = new Map(modData, package); UpgradeRules.UpgradeWeaponRules(engineDate, ref map.WeaponDefinitions, null, 0); UpgradeRules.UpgradeActorRules(engineDate, ref map.RuleDefinitions, null, 0); @@ -47,5 +43,16 @@ namespace OpenRA.Mods.Common.UtilityCommands UpgradeRules.UpgradeActors(engineDate, ref map.ActorDefinitions, null, 0); map.Save(package); } + + [Desc("MAP", "CURRENTENGINE", "Upgrade map rules to the latest engine version.")] + public void Run(ModData modData, string[] args) + { + // HACK: The engine code assumes that Game.modData is set. + Game.ModData = modData; + + var package = modData.ModFiles.OpenWritablePackage(args[1]); + var engineDate = Exts.ParseIntegerInvariant(args[2]); + UpgradeMap(modData, package, engineDate); + } } } diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeModCommand.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeModCommand.cs index 9b20c83729..407232f721 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeModCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeModCommand.cs @@ -74,22 +74,45 @@ namespace OpenRA.Mods.Common.UtilityCommands ProcessYaml("Chrome Metrics", modData.Manifest.ChromeMetrics, modData, engineDate, UpgradeRules.UpgradeChromeMetrics); ProcessYaml("Chrome Layout", modData.Manifest.ChromeLayout, modData, engineDate, UpgradeRules.UpgradeChromeLayout); + // The map cache won't be valid if there was a map format upgrade, so walk the map packages manually + // Only upgrade system maps - user maps must be updated manually using --upgrade-map Console.WriteLine("Processing Maps:"); - var mapPreviews = modData.MapCache - .Where(m => m.Status == MapStatus.Available); - - foreach (var p in mapPreviews) + foreach (var kv in modData.Manifest.MapFolders) { - var package = (IReadWritePackage)p.Package; - Console.WriteLine("\t" + package.Name); - UpgradeRules.UpgradeMapFormat(modData, package); + var name = kv.Key; + var classification = string.IsNullOrEmpty(kv.Value) + ? MapClassification.Unknown : Enum.Parse(kv.Value); - var map = new Map(modData, package); - UpgradeRules.UpgradeActorRules(engineDate, ref map.RuleDefinitions, null, 0); - UpgradeRules.UpgradeWeaponRules(engineDate, ref map.WeaponDefinitions, null, 0); - UpgradeRules.UpgradePlayers(engineDate, ref map.PlayerDefinitions, null, 0); - UpgradeRules.UpgradeActors(engineDate, ref map.ActorDefinitions, null, 0); - map.Save(package); + if (classification != MapClassification.System) + continue; + + var optional = name.StartsWith("~"); + if (optional) + name = name.Substring(1); + + try + { + using (var package = (IReadWritePackage)modData.ModFiles.OpenPackage(name)) + { + foreach (var map in package.Contents) + { + try + { + using (var mapPackage = modData.ModFiles.OpenPackage(map, package)) + { + if (mapPackage != null) + UpgradeMapCommand.UpgradeMap(modData, (IReadWritePackage)mapPackage, engineDate); + } + } + catch (Exception e) + { + Console.WriteLine("Failed to upgrade map {0}", map); + Console.WriteLine("Error was: {0}", e.ToString()); + } + } + } + } + catch { } } } }