Add upgrade rules for Map format 8 -> 9.
This commit is contained in:
@@ -66,7 +66,7 @@ namespace OpenRA
|
|||||||
|
|
||||||
public class Map : IReadOnlyFileSystem
|
public class Map : IReadOnlyFileSystem
|
||||||
{
|
{
|
||||||
public const int SupportedMapFormat = 8;
|
public const int SupportedMapFormat = 9;
|
||||||
|
|
||||||
public const int MaxTilesInCircleRange = 50;
|
public const int MaxTilesInCircleRange = 50;
|
||||||
public readonly MapGrid Grid;
|
public readonly MapGrid Grid;
|
||||||
|
|||||||
@@ -728,10 +728,6 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
if (mapFormat < 6)
|
if (mapFormat < 6)
|
||||||
throw new InvalidDataException("Map format {0} is not supported.\n File: {1}".F(mapFormat, package.Name));
|
throw new InvalidDataException("Map format {0} is not supported.\n File: {1}".F(mapFormat, package.Name));
|
||||||
|
|
||||||
// Nothing to do
|
|
||||||
if (mapFormat >= 8)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Format 6 -> 7 combined the Selectable and UseAsShellmap flags into the Class enum
|
// Format 6 -> 7 combined the Selectable and UseAsShellmap flags into the Class enum
|
||||||
if (mapFormat < 7)
|
if (mapFormat < 7)
|
||||||
{
|
{
|
||||||
@@ -790,6 +786,169 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Format 8 -> 9 moved map options and videos from the map file itself to traits
|
||||||
|
if (mapFormat < 9)
|
||||||
|
{
|
||||||
|
var rules = yaml.Nodes.FirstOrDefault(n => n.Key == "Rules");
|
||||||
|
var worldNode = rules.Value.Nodes.FirstOrDefault(n => n.Key == "World");
|
||||||
|
if (worldNode == null)
|
||||||
|
worldNode = new MiniYamlNode("World", new MiniYaml("", new List<MiniYamlNode>()));
|
||||||
|
|
||||||
|
var playerNode = rules.Value.Nodes.FirstOrDefault(n => n.Key == "Player");
|
||||||
|
if (playerNode == null)
|
||||||
|
playerNode = new MiniYamlNode("Player", new MiniYaml("", new List<MiniYamlNode>()));
|
||||||
|
|
||||||
|
var visibilityNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Visibility");
|
||||||
|
if (visibilityNode != null)
|
||||||
|
{
|
||||||
|
var visibility = FieldLoader.GetValue<MapVisibility>("Visibility", visibilityNode.Value.Value);
|
||||||
|
if (visibility.HasFlag(MapVisibility.MissionSelector))
|
||||||
|
{
|
||||||
|
var missionData = new MiniYamlNode("MissionData", new MiniYaml("", new List<MiniYamlNode>()));
|
||||||
|
worldNode.Value.Nodes.Add(missionData);
|
||||||
|
|
||||||
|
var description = yaml.Nodes.FirstOrDefault(n => n.Key == "Description");
|
||||||
|
if (description != null)
|
||||||
|
missionData.Value.Nodes.Add(new MiniYamlNode("Briefing", description.Value.Value));
|
||||||
|
|
||||||
|
var videos = yaml.Nodes.FirstOrDefault(n => n.Key == "Videos");
|
||||||
|
if (videos != null && videos.Value.Nodes.Any())
|
||||||
|
{
|
||||||
|
var backgroundVideo = videos.Value.Nodes.FirstOrDefault(n => n.Key == "BackgroundInfo");
|
||||||
|
if (backgroundVideo != null)
|
||||||
|
missionData.Value.Nodes.Add(new MiniYamlNode("BackgroundVideo", backgroundVideo.Value.Value));
|
||||||
|
|
||||||
|
var briefingVideo = videos.Value.Nodes.FirstOrDefault(n => n.Key == "Briefing");
|
||||||
|
if (briefingVideo != null)
|
||||||
|
missionData.Value.Nodes.Add(new MiniYamlNode("BriefingVideo", briefingVideo.Value.Value));
|
||||||
|
|
||||||
|
var startVideo = videos.Value.Nodes.FirstOrDefault(n => n.Key == "GameStart");
|
||||||
|
if (startVideo != null)
|
||||||
|
missionData.Value.Nodes.Add(new MiniYamlNode("StartVideo", startVideo.Value.Value));
|
||||||
|
|
||||||
|
var winVideo = videos.Value.Nodes.FirstOrDefault(n => n.Key == "GameWon");
|
||||||
|
if (winVideo != null)
|
||||||
|
missionData.Value.Nodes.Add(new MiniYamlNode("WinVideo", winVideo.Value.Value));
|
||||||
|
|
||||||
|
var lossVideo = videos.Value.Nodes.FirstOrDefault(n => n.Key == "GameLost");
|
||||||
|
if (lossVideo != null)
|
||||||
|
missionData.Value.Nodes.Add(new MiniYamlNode("LossVideo", lossVideo.Value.Value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var mapOptions = yaml.Nodes.FirstOrDefault(n => n.Key == "Options");
|
||||||
|
if (mapOptions != null)
|
||||||
|
{
|
||||||
|
var cheats = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "Cheats");
|
||||||
|
if (cheats != null)
|
||||||
|
{
|
||||||
|
worldNode.Value.Nodes.Add(new MiniYamlNode("DeveloperMode", new MiniYaml("", new List<MiniYamlNode>()
|
||||||
|
{
|
||||||
|
new MiniYamlNode("Locked", "True"),
|
||||||
|
new MiniYamlNode("Enabled", cheats.Value.Value)
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
var crates = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "Crates");
|
||||||
|
if (crates != null && !worldNode.Value.Nodes.Any(n => n.Key == "-CrateSpawner"))
|
||||||
|
{
|
||||||
|
if (!FieldLoader.GetValue<bool>("crates", crates.Value.Value))
|
||||||
|
worldNode.Value.Nodes.Add(new MiniYamlNode("-CrateSpawner", new MiniYaml("")));
|
||||||
|
}
|
||||||
|
|
||||||
|
var creeps = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "Creeps");
|
||||||
|
if (creeps != null)
|
||||||
|
{
|
||||||
|
worldNode.Value.Nodes.Add(new MiniYamlNode("MapCreeps", new MiniYaml("", new List<MiniYamlNode>()
|
||||||
|
{
|
||||||
|
new MiniYamlNode("Locked", "True"),
|
||||||
|
new MiniYamlNode("Enabled", creeps.Value.Value)
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
var fog = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "Fog");
|
||||||
|
var shroud = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "Shroud");
|
||||||
|
if (fog != null || shroud != null)
|
||||||
|
{
|
||||||
|
var shroudNode = new MiniYamlNode("Shroud", new MiniYaml("", new List<MiniYamlNode>()));
|
||||||
|
playerNode.Value.Nodes.Add(shroudNode);
|
||||||
|
|
||||||
|
if (fog != null)
|
||||||
|
{
|
||||||
|
shroudNode.Value.Nodes.Add(new MiniYamlNode("FogLocked", "True"));
|
||||||
|
shroudNode.Value.Nodes.Add(new MiniYamlNode("FogEnabled", fog.Value.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shroud != null)
|
||||||
|
{
|
||||||
|
var enabled = FieldLoader.GetValue<bool>("shroud", shroud.Value.Value);
|
||||||
|
shroudNode.Value.Nodes.Add(new MiniYamlNode("ExploredMapLocked", "True"));
|
||||||
|
shroudNode.Value.Nodes.Add(new MiniYamlNode("ExploredMapEnabled", FieldSaver.FormatValue(!enabled)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var allyBuildRadius = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "AllyBuildRadius");
|
||||||
|
if (allyBuildRadius != null)
|
||||||
|
{
|
||||||
|
worldNode.Value.Nodes.Add(new MiniYamlNode("MapBuildRadius", new MiniYaml("", new List<MiniYamlNode>()
|
||||||
|
{
|
||||||
|
new MiniYamlNode("AllyBuildRadiusLocked", "True"),
|
||||||
|
new MiniYamlNode("AllyBuildRadiusEnabled", allyBuildRadius.Value.Value)
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
var startingCash = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "StartingCash");
|
||||||
|
if (startingCash != null)
|
||||||
|
{
|
||||||
|
playerNode.Value.Nodes.Add(new MiniYamlNode("PlayerResources", new MiniYaml("", new List<MiniYamlNode>()
|
||||||
|
{
|
||||||
|
new MiniYamlNode("DefaultCashLocked", "True"),
|
||||||
|
new MiniYamlNode("DefaultCash", startingCash.Value.Value)
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
var startingUnits = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "ConfigurableStartingUnits");
|
||||||
|
if (startingUnits != null && !worldNode.Value.Nodes.Any(n => n.Key == "-SpawnMPUnits"))
|
||||||
|
{
|
||||||
|
worldNode.Value.Nodes.Add(new MiniYamlNode("SpawnMPUnits", new MiniYaml("", new List<MiniYamlNode>()
|
||||||
|
{
|
||||||
|
new MiniYamlNode("Locked", "True"),
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
|
var techLevel = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "TechLevel");
|
||||||
|
var difficulties = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "Difficulties");
|
||||||
|
var shortGame = mapOptions.Value.Nodes.FirstOrDefault(n => n.Key == "ShortGame");
|
||||||
|
if (techLevel != null || difficulties != null || shortGame != null)
|
||||||
|
{
|
||||||
|
var optionsNode = new MiniYamlNode("MapOptions", new MiniYaml("", new List<MiniYamlNode>()));
|
||||||
|
worldNode.Value.Nodes.Add(optionsNode);
|
||||||
|
|
||||||
|
if (techLevel != null)
|
||||||
|
{
|
||||||
|
optionsNode.Value.Nodes.Add(new MiniYamlNode("TechLevelLocked", "True"));
|
||||||
|
optionsNode.Value.Nodes.Add(new MiniYamlNode("TechLevel", techLevel.Value.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (difficulties != null)
|
||||||
|
optionsNode.Value.Nodes.Add(new MiniYamlNode("Difficulties", difficulties.Value.Value));
|
||||||
|
|
||||||
|
if (shortGame != null)
|
||||||
|
{
|
||||||
|
optionsNode.Value.Nodes.Add(new MiniYamlNode("ShortGameLocked", "True"));
|
||||||
|
optionsNode.Value.Nodes.Add(new MiniYamlNode("ShortGameEnabled", shortGame.Value.Value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (worldNode.Value.Nodes.Any() && !rules.Value.Nodes.Contains(worldNode))
|
||||||
|
rules.Value.Nodes.Add(worldNode);
|
||||||
|
|
||||||
|
if (playerNode.Value.Nodes.Any() && !rules.Value.Nodes.Contains(playerNode))
|
||||||
|
rules.Value.Nodes.Add(playerNode);
|
||||||
|
}
|
||||||
|
|
||||||
yaml.Nodes.First(n => n.Key == "MapFormat").Value = new MiniYaml(Map.SupportedMapFormat.ToString());
|
yaml.Nodes.First(n => n.Key == "MapFormat").Value = new MiniYaml(Map.SupportedMapFormat.ToString());
|
||||||
|
|
||||||
package.Update("map.yaml", Encoding.UTF8.GetBytes(yaml.Nodes.WriteToString()));
|
package.Update("map.yaml", Encoding.UTF8.GetBytes(yaml.Nodes.WriteToString()));
|
||||||
|
|||||||
Reference in New Issue
Block a user