Merge pull request #10786 from pchote/mappreview-packages
Remove internal use of map paths.
This commit is contained in:
@@ -949,7 +949,7 @@ namespace OpenRA.Mods.Common.Server
|
||||
|
||||
static void LoadMap(S server)
|
||||
{
|
||||
server.Map = new Map(server.ModData.MapCache[server.LobbyInfo.GlobalSettings.Map].Path);
|
||||
server.Map = new Map(server.ModData, server.ModData.MapCache[server.LobbyInfo.GlobalSettings.Map].Package);
|
||||
|
||||
server.MapPlayers = new MapPlayers(server.Map.PlayerDefinitions);
|
||||
server.LobbyInfo.Slots = server.MapPlayers.Players
|
||||
|
||||
@@ -79,10 +79,10 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
modData.MapCache.LoadMaps();
|
||||
maps.AddRange(modData.MapCache
|
||||
.Where(m => m.Status == MapStatus.Available)
|
||||
.Select(m => new Map(m.Path)));
|
||||
.Select(m => new Map(modData, m.Package)));
|
||||
}
|
||||
else
|
||||
maps.Add(new Map(args[1]));
|
||||
maps.Add(new Map(modData, modData.ModFiles.OpenPackage(args[1])));
|
||||
|
||||
foreach (var testMap in maps)
|
||||
{
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
{
|
||||
Game.ModData = modData;
|
||||
|
||||
var map = new Map(args[1]);
|
||||
var map = new Map(modData, modData.ModFiles.OpenPackage(args[1]));
|
||||
var minimap = Minimap.RenderMapPreview(map.Rules.TileSets[map.Tileset], map, true);
|
||||
|
||||
var dest = Path.GetFileNameWithoutExtension(args[1]) + ".png";
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
ValidateMapFormat(format);
|
||||
|
||||
var tileset = GetTileset(mapSection);
|
||||
Map = new Map(Rules.TileSets[tileset], MapSize, MapSize)
|
||||
Map = new Map(modData, Rules.TileSets[tileset], MapSize, MapSize)
|
||||
{
|
||||
Title = basic.GetValue("Name", Path.GetFileNameWithoutExtension(filename)),
|
||||
Author = "Westwood Studios"
|
||||
@@ -94,9 +94,9 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
|
||||
Map.FixOpenAreas(Rules);
|
||||
|
||||
var fileName = Path.GetFileNameWithoutExtension(args[1]);
|
||||
var dest = fileName + ".oramap";
|
||||
Map.Save(dest);
|
||||
var dest = Path.GetFileNameWithoutExtension(args[1]) + ".oramap";
|
||||
var package = modData.ModFiles.CreatePackage(dest);
|
||||
Map.Save(package);
|
||||
Console.WriteLine(dest + " saved.");
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.FileSystem;
|
||||
|
||||
namespace OpenRA.Mods.Common.UtilityCommands
|
||||
{
|
||||
@@ -48,7 +49,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
public void Run(ModData modData, string[] args)
|
||||
{
|
||||
Game.ModData = modData;
|
||||
map = new Map(args[1]);
|
||||
map = new Map(modData, modData.ModFiles.OpenPackage(args[1]));
|
||||
Console.WriteLine("Resizing map {0} from {1} to {2},{3}", map.Title, map.MapSize, width, height);
|
||||
map.Resize(width, height);
|
||||
|
||||
@@ -68,7 +69,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
foreach (var kv in forRemoval)
|
||||
map.ActorDefinitions.Remove(kv);
|
||||
|
||||
map.Save(map.Path);
|
||||
map.Save((IReadWritePackage)map.Package);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using OpenRA.FileSystem;
|
||||
|
||||
namespace OpenRA.Mods.Common.UtilityCommands
|
||||
{
|
||||
class UpgradeMapCommand : IUtilityCommand
|
||||
@@ -26,15 +28,16 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
// HACK: The engine code assumes that Game.modData is set.
|
||||
Game.ModData = modData;
|
||||
|
||||
UpgradeRules.UpgradeMapFormat(modData, args[1]);
|
||||
var package = modData.ModFiles.OpenWritablePackage(args[1]);
|
||||
UpgradeRules.UpgradeMapFormat(modData, package);
|
||||
|
||||
var map = new Map(args[1]);
|
||||
var map = new Map(modData, package);
|
||||
var engineDate = Exts.ParseIntegerInvariant(args[2]);
|
||||
UpgradeRules.UpgradeWeaponRules(engineDate, ref map.WeaponDefinitions, null, 0);
|
||||
UpgradeRules.UpgradeActorRules(engineDate, ref map.RuleDefinitions, null, 0);
|
||||
UpgradeRules.UpgradePlayers(engineDate, ref map.PlayerDefinitions, null, 0);
|
||||
UpgradeRules.UpgradeActors(engineDate, ref map.ActorDefinitions, null, 0);
|
||||
map.Save(args[1]);
|
||||
map.Save(package);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using OpenRA.FileSystem;
|
||||
|
||||
namespace OpenRA.Mods.Common.UtilityCommands
|
||||
{
|
||||
@@ -100,21 +101,21 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
}
|
||||
|
||||
Console.WriteLine("Processing Maps:");
|
||||
var mapPaths = modData.MapCache
|
||||
.Where(m => m.Status == MapStatus.Available)
|
||||
.Select(m => m.Path);
|
||||
var mapPreviews = modData.MapCache
|
||||
.Where(m => m.Status == MapStatus.Available);
|
||||
|
||||
foreach (var path in mapPaths)
|
||||
foreach (var p in mapPreviews)
|
||||
{
|
||||
Console.WriteLine("\t" + path);
|
||||
UpgradeRules.UpgradeMapFormat(modData, path);
|
||||
var package = (IReadWritePackage)p.Package;
|
||||
Console.WriteLine("\t" + package.Name);
|
||||
UpgradeRules.UpgradeMapFormat(modData, package);
|
||||
|
||||
var map = new Map(path);
|
||||
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(map.Path);
|
||||
map.Save(package);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using OpenRA.FileSystem;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
@@ -3602,95 +3603,92 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
}
|
||||
}
|
||||
|
||||
internal static void UpgradeMapFormat(ModData modData, string path)
|
||||
internal static void UpgradeMapFormat(ModData modData, IReadWritePackage package)
|
||||
{
|
||||
using (var package = modData.ModFiles.OpenWritablePackage(path))
|
||||
if (package == null)
|
||||
return;
|
||||
|
||||
var yamlStream = package.GetStream("map.yaml");
|
||||
if (yamlStream == null)
|
||||
return;
|
||||
|
||||
var yaml = new MiniYaml(null, MiniYaml.FromStream(yamlStream, package.Name));
|
||||
var nd = yaml.ToDictionary();
|
||||
var mapFormat = FieldLoader.GetValue<int>("MapFormat", nd["MapFormat"].Value);
|
||||
if (mapFormat < 6)
|
||||
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
|
||||
if (mapFormat < 7)
|
||||
{
|
||||
if (package == null)
|
||||
return;
|
||||
MiniYaml useAsShellmap;
|
||||
if (nd.TryGetValue("UseAsShellmap", out useAsShellmap) && bool.Parse(useAsShellmap.Value))
|
||||
yaml.Nodes.Add(new MiniYamlNode("Visibility", new MiniYaml("Shellmap")));
|
||||
else if (nd["Type"].Value == "Mission" || nd["Type"].Value == "Campaign")
|
||||
yaml.Nodes.Add(new MiniYamlNode("Visibility", new MiniYaml("MissionSelector")));
|
||||
}
|
||||
|
||||
var yamlStream = package.GetStream("map.yaml");
|
||||
if (yamlStream == null)
|
||||
return;
|
||||
|
||||
var yaml = new MiniYaml(null, MiniYaml.FromStream(yamlStream, path));
|
||||
var nd = yaml.ToDictionary();
|
||||
var mapFormat = FieldLoader.GetValue<int>("MapFormat", nd["MapFormat"].Value);
|
||||
if (mapFormat < 6)
|
||||
throw new InvalidDataException("Map format {0} is not supported.\n File: {1}".F(mapFormat, path));
|
||||
|
||||
// Nothing to do
|
||||
if (mapFormat >= 8)
|
||||
return;
|
||||
|
||||
// Format 6 -> 7 combined the Selectable and UseAsShellmap flags into the Class enum
|
||||
if (mapFormat < 7)
|
||||
// Format 7 -> 8 replaced normalized HSL triples with rgb(a) hex colors
|
||||
if (mapFormat < 8)
|
||||
{
|
||||
var players = yaml.Nodes.FirstOrDefault(n => n.Key == "Players");
|
||||
if (players != null)
|
||||
{
|
||||
MiniYaml useAsShellmap;
|
||||
if (nd.TryGetValue("UseAsShellmap", out useAsShellmap) && bool.Parse(useAsShellmap.Value))
|
||||
yaml.Nodes.Add(new MiniYamlNode("Visibility", new MiniYaml("Shellmap")));
|
||||
else if (nd["Type"].Value == "Mission" || nd["Type"].Value == "Campaign")
|
||||
yaml.Nodes.Add(new MiniYamlNode("Visibility", new MiniYaml("MissionSelector")));
|
||||
}
|
||||
|
||||
// Format 7 -> 8 replaced normalized HSL triples with rgb(a) hex colors
|
||||
if (mapFormat < 8)
|
||||
{
|
||||
var players = yaml.Nodes.FirstOrDefault(n => n.Key == "Players");
|
||||
if (players != null)
|
||||
bool noteHexColors = false;
|
||||
bool noteColorRamp = false;
|
||||
foreach (var player in players.Value.Nodes)
|
||||
{
|
||||
bool noteHexColors = false;
|
||||
bool noteColorRamp = false;
|
||||
foreach (var player in players.Value.Nodes)
|
||||
var colorRampNode = player.Value.Nodes.FirstOrDefault(n => n.Key == "ColorRamp");
|
||||
if (colorRampNode != null)
|
||||
{
|
||||
var colorRampNode = player.Value.Nodes.FirstOrDefault(n => n.Key == "ColorRamp");
|
||||
if (colorRampNode != null)
|
||||
Color dummy;
|
||||
var parts = colorRampNode.Value.Value.Split(',');
|
||||
if (parts.Length == 3 || parts.Length == 4)
|
||||
{
|
||||
Color dummy;
|
||||
var parts = colorRampNode.Value.Value.Split(',');
|
||||
if (parts.Length == 3 || parts.Length == 4)
|
||||
// Try to convert old normalized HSL value to a rgb hex color
|
||||
try
|
||||
{
|
||||
// Try to convert old normalized HSL value to a rgb hex color
|
||||
try
|
||||
{
|
||||
HSLColor color = new HSLColor(
|
||||
(byte)Exts.ParseIntegerInvariant(parts[0].Trim()).Clamp(0, 255),
|
||||
(byte)Exts.ParseIntegerInvariant(parts[1].Trim()).Clamp(0, 255),
|
||||
(byte)Exts.ParseIntegerInvariant(parts[2].Trim()).Clamp(0, 255));
|
||||
colorRampNode.Value.Value = FieldSaver.FormatValue(color);
|
||||
noteHexColors = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new InvalidDataException("Invalid ColorRamp value.\n File: " + path);
|
||||
}
|
||||
HSLColor color = new HSLColor(
|
||||
(byte)Exts.ParseIntegerInvariant(parts[0].Trim()).Clamp(0, 255),
|
||||
(byte)Exts.ParseIntegerInvariant(parts[1].Trim()).Clamp(0, 255),
|
||||
(byte)Exts.ParseIntegerInvariant(parts[2].Trim()).Clamp(0, 255));
|
||||
colorRampNode.Value.Value = FieldSaver.FormatValue(color);
|
||||
noteHexColors = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw new InvalidDataException("Invalid ColorRamp value.\n File: " + package.Name);
|
||||
}
|
||||
else if (parts.Length != 1 || !HSLColor.TryParseRGB(parts[0], out dummy))
|
||||
throw new InvalidDataException("Invalid ColorRamp value.\n File: " + path);
|
||||
|
||||
colorRampNode.Key = "Color";
|
||||
noteColorRamp = true;
|
||||
}
|
||||
else if (parts.Length != 1 || !HSLColor.TryParseRGB(parts[0], out dummy))
|
||||
throw new InvalidDataException("Invalid ColorRamp value.\n File: " + package.Name);
|
||||
|
||||
colorRampNode.Key = "Color";
|
||||
noteColorRamp = true;
|
||||
}
|
||||
|
||||
Console.WriteLine("Converted " + path + " to MapFormat 8.");
|
||||
if (noteHexColors)
|
||||
Console.WriteLine("ColorRamp is now called Color and uses rgb(a) hex value - rrggbb[aa].");
|
||||
else if (noteColorRamp)
|
||||
Console.WriteLine("ColorRamp is now called Color.");
|
||||
}
|
||||
}
|
||||
|
||||
var entries = new Dictionary<string, byte[]>();
|
||||
entries.Add("map.yaml", Encoding.UTF8.GetBytes(yaml.Nodes.WriteToString()));
|
||||
foreach (var file in package.Contents)
|
||||
{
|
||||
if (file == "map.yaml")
|
||||
continue;
|
||||
|
||||
entries.Add(file, package.GetStream(file).ReadAllBytes());
|
||||
Console.WriteLine("Converted " + package.Name + " to MapFormat 8.");
|
||||
if (noteHexColors)
|
||||
Console.WriteLine("ColorRamp is now called Color and uses rgb(a) hex value - rrggbb[aa].");
|
||||
else if (noteColorRamp)
|
||||
Console.WriteLine("ColorRamp is now called Color.");
|
||||
}
|
||||
}
|
||||
|
||||
var entries = new Dictionary<string, byte[]>();
|
||||
entries.Add("map.yaml", Encoding.UTF8.GetBytes(yaml.Nodes.WriteToString()));
|
||||
foreach (var file in package.Contents)
|
||||
{
|
||||
if (file == "map.yaml")
|
||||
continue;
|
||||
|
||||
entries.Add(file, package.GetStream(file).ReadAllBytes());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
var maxTerrainHeight = world.Map.Grid.MaximumTerrainHeight;
|
||||
var tileset = modRules.TileSets[tilesetDropDown.Text];
|
||||
var map = new Map(tileset, width + 2, height + maxTerrainHeight + 2);
|
||||
var map = new Map(Game.ModData, tileset, width + 2, height + maxTerrainHeight + 2);
|
||||
|
||||
var tl = new PPos(1, 1);
|
||||
var br = new PPos(width, height + maxTerrainHeight);
|
||||
|
||||
@@ -76,6 +76,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
var mapDirectories = modData.Manifest.MapFolders
|
||||
.ToDictionary(kv => makeMapDirectory(kv.Key), kv => Enum<MapClassification>.Parse(kv.Value));
|
||||
|
||||
var mapPath = map.Package != null ? map.Package.Name : null;
|
||||
var directoryDropdown = widget.Get<DropDownButtonWidget>("DIRECTORY_DROPDOWN");
|
||||
{
|
||||
Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
|
||||
@@ -87,7 +88,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
return item;
|
||||
};
|
||||
|
||||
var mapDirectory = map.Path != null ? Platform.UnresolvePath(Path.GetDirectoryName(map.Path)) : null;
|
||||
// TODO: This won't work for maps inside oramod packages
|
||||
var mapDirectory = mapPath != null ? Platform.UnresolvePath(Path.GetDirectoryName(mapPath)) : null;
|
||||
var initialDirectory = mapDirectories.Keys.FirstOrDefault(f => f == mapDirectory);
|
||||
|
||||
// Prioritize MapClassification.User directories over system directories
|
||||
@@ -101,14 +103,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
var mapIsUnpacked = false;
|
||||
|
||||
if (map.Path != null)
|
||||
// TODO: This won't work for maps inside oramod packages
|
||||
if (mapPath != null)
|
||||
{
|
||||
var attr = File.GetAttributes(map.Path);
|
||||
var attr = File.GetAttributes(mapPath);
|
||||
mapIsUnpacked = attr.HasFlag(FileAttributes.Directory);
|
||||
}
|
||||
|
||||
var filename = widget.Get<TextFieldWidget>("FILENAME");
|
||||
filename.Text = mapIsUnpacked ? Path.GetFileName(map.Path) : Path.GetFileNameWithoutExtension(map.Path);
|
||||
filename.Text = mapIsUnpacked ? Path.GetFileName(mapPath) : Path.GetFileNameWithoutExtension(mapPath);
|
||||
var fileType = mapIsUnpacked ? MapFileType.Unpacked : MapFileType.OraMap;
|
||||
|
||||
var fileTypes = new Dictionary<MapFileType, MapFileTypeInfo>()
|
||||
@@ -159,17 +162,19 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
// Create the map directory if required
|
||||
Directory.CreateDirectory(Platform.ResolvePath(directoryDropdown.Text));
|
||||
|
||||
// TODO: This won't work for maps inside oramod packages
|
||||
var combinedPath = Platform.ResolvePath(Path.Combine(directoryDropdown.Text, filename.Text + fileTypes[fileType].Extension));
|
||||
|
||||
// Invalidate the old map metadata
|
||||
if (map.Uid != null && combinedPath == map.Path)
|
||||
if (map.Uid != null && combinedPath == mapPath)
|
||||
modData.MapCache[map.Uid].Invalidate();
|
||||
|
||||
map.Save(combinedPath);
|
||||
var package = modData.ModFiles.CreatePackage(combinedPath);
|
||||
map.Save(package);
|
||||
|
||||
// Update the map cache so it can be loaded without restarting the game
|
||||
var classification = mapDirectories[directoryDropdown.Text];
|
||||
modData.MapCache[map.Uid].UpdateFromMap(map.Container, classification, null, map.Grid.Type);
|
||||
modData.MapCache[map.Uid].UpdateFromMap(map.Package, classification, null, map.Grid.Type);
|
||||
|
||||
Console.WriteLine("Saved current map at {0}", combinedPath);
|
||||
Ui.CloseWindow();
|
||||
|
||||
@@ -738,14 +738,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
if (MapPreview.Uid == uid)
|
||||
return;
|
||||
|
||||
MapPreview = Game.ModData.MapCache[uid];
|
||||
var modData = Game.ModData;
|
||||
MapPreview = modData.MapCache[uid];
|
||||
Map = null;
|
||||
if (MapPreview.Status == MapStatus.Available)
|
||||
{
|
||||
// Maps need to be validated and pre-loaded before they can be accessed
|
||||
new Thread(_ =>
|
||||
{
|
||||
var currentMap = Map = new Map(MapPreview.Path);
|
||||
var currentMap = Map = new Map(modData, MapPreview.Package);
|
||||
currentMap.PreloadRules();
|
||||
Game.RunAfterTick(() =>
|
||||
{
|
||||
|
||||
@@ -285,7 +285,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
string DeleteMap(string map)
|
||||
{
|
||||
var path = Game.ModData.MapCache[map].Path;
|
||||
var path = Game.ModData.MapCache[map].Package.Name;
|
||||
try
|
||||
{
|
||||
if (File.Exists(path))
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
readonly ScrollPanelWidget missionList;
|
||||
readonly ScrollItemWidget headerTemplate;
|
||||
readonly ScrollItemWidget template;
|
||||
readonly Cache<MapPreview, Map> mapCache = new Cache<MapPreview, Map>(p => new Map(p.Path));
|
||||
readonly Cache<MapPreview, Map> mapCache;
|
||||
|
||||
MapPreview selectedMapPreview;
|
||||
Map selectedMap;
|
||||
@@ -56,6 +56,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
public MissionBrowserLogic(Widget widget, World world, Action onStart, Action onExit)
|
||||
{
|
||||
modData = Game.ModData;
|
||||
mapCache = new Cache<MapPreview, Map>(p => new Map(modData, p.Package));
|
||||
this.onStart = onStart;
|
||||
|
||||
missionList = widget.Get<ScrollPanelWidget>("MISSION_LIST");
|
||||
@@ -109,8 +110,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
var missionMapPaths = kv.Value.Nodes.Select(n => Path.GetFullPath(n.Key)).ToList();
|
||||
|
||||
var previews = modData.MapCache
|
||||
.Where(p => p.Status == MapStatus.Available && missionMapPaths.Contains(Path.GetFullPath(p.Path)))
|
||||
.OrderBy(p => missionMapPaths.IndexOf(Path.GetFullPath(p.Path)));
|
||||
.Where(p => p.Status == MapStatus.Available && missionMapPaths.Contains(p.Package.Name))
|
||||
.OrderBy(p => missionMapPaths.IndexOf(p.Package.Name));
|
||||
|
||||
CreateMissionGroup(kv.Key, previews);
|
||||
allPreviews.AddRange(previews);
|
||||
|
||||
Reference in New Issue
Block a user