diff --git a/MapConverter/Main.cs b/MapConverter/Main.cs index dccd026cb9..4ca9f8c7da 100644 --- a/MapConverter/Main.cs +++ b/MapConverter/Main.cs @@ -7,21 +7,7 @@ namespace MapConverter { public static void Main (string[] args) { - if (args.Length != 3) - { - Console.WriteLine("usage: MapConverter mod[,mod]* input-map.ini output-map.yaml"); - return; - } - - var mods = args[0].Split(','); - var manifest = new Manifest(mods); - - foreach (var folder in manifest.Folders) FileSystem.Mount(folder); - foreach (var pkg in manifest.Packages) FileSystem.Mount(pkg); - - var converter = new MapConverter(args[1]); - converter.Map.DebugContents(); - converter.Save(args[2]); + new MapConverter(args); } } } diff --git a/MapConverter/MapConverter.cs b/MapConverter/MapConverter.cs index be121bf1e2..8c0e9ad32d 100644 --- a/MapConverter/MapConverter.cs +++ b/MapConverter/MapConverter.cs @@ -23,6 +23,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using System.Drawing; +using System.Drawing.Imaging; using OpenRA; using OpenRA.FileFormats; @@ -40,7 +42,7 @@ namespace MapConverter "fpls", "wcrate", "scrate", "barb", "sbag", }; - Dictionary< string, Pair > overlayResourceMapping = new Dictionary>() + static Dictionary< string, Pair > overlayResourceMapping = new Dictionary>() { // RA Gems, Gold { "gold01", new Pair(1,0) }, @@ -68,7 +70,7 @@ namespace MapConverter { "ti12", new Pair(1,11) }, }; - Dictionary overlayActorMapping = new Dictionary() { + static Dictionary overlayActorMapping = new Dictionary() { // Fences {"sbag","sbag"}, {"cycl","cycl"}, @@ -92,11 +94,44 @@ namespace MapConverter int MapSize; int ActorCount = 0; - public Map Map = new Map(); + Map Map = new Map(); + Manifest manifest; - public MapConverter(string filename) + public MapConverter(string[] args) { - IniFile file = new IniFile(FileSystem.Open(filename)); + if (args.Length != 3) + { + Console.WriteLine("usage: MapConverter mod[,mod]* input-map.ini output-map.yaml"); + return; + } + + var mods = args[0].Split(','); + manifest = new Manifest(mods); + + foreach (var folder in manifest.Folders) FileSystem.Mount(folder); + foreach (var pkg in manifest.Packages) FileSystem.Mount(pkg); + + ConvertIniMap(args[1]); + Map.DebugContents(); + Save(args[2]); + } + + + static Dictionary,Pair > fileMapping = new Dictionary,Pair >() + { + {Pair.New("ra","TEMPERAT"),Pair.New("tem","temperat.col")}, + {Pair.New("ra","SNOW"),Pair.New("sno","snow.col")}, + {Pair.New("ra","INTERIOR"),Pair.New("int","temperat.col")}, + {Pair.New("cnc","DESERT"),Pair.New("des","desert.col")}, + {Pair.New("cnc","TEMPERAT"),Pair.New("tem","temperat.col")}, + {Pair.New("cnc","WINTER"),Pair.New("win","winter.col")}, + }; + + TerrainColorSet terrainTypeColors; + TileSet tileset; + public void ConvertIniMap(string iniFile) + { + IniFile file = new IniFile(FileSystem.Open(iniFile)); IniSection basic = file.GetSection("Basic"); IniSection map = file.GetSection("Map"); var INIFormat = int.Parse(basic.GetValue("NewINIFormat", "0")); @@ -119,12 +154,16 @@ namespace MapConverter UnpackRATileData(ReadPackedSection(file.GetSection("MapPack"))); UnpackRAOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); ReadRATrees(file); + terrainTypeColors = new TerrainColorSet(fileMapping[Pair.New("ra",Map.Tileset)].Second); + tileset = new TileSet("tileSet.til","templates.ini",fileMapping[Pair.New("ra",Map.Tileset)].First); } else // CNC { - UnpackCncTileData(FileSystem.Open(filename.Substring(0,filename.Length-4)+".bin")); + UnpackCncTileData(FileSystem.Open(iniFile.Substring(0,iniFile.Length-4)+".bin")); ReadCncOverlay(file); - ReadCncTrees(file); + ReadCncTrees(file); + terrainTypeColors = new TerrainColorSet(fileMapping[Pair.New("cnc",Map.Tileset)].Second); + tileset = new TileSet("tileSet.til","templates.ini",fileMapping[Pair.New("cnc",Map.Tileset)].First); } LoadActors(file, "STRUCTURES"); @@ -142,7 +181,7 @@ namespace MapConverter foreach (var kv in wp) Map.Waypoints.Add("spawn"+kv.First, kv.Second); } - + static MemoryStream ReadPackedSection(IniSection mapPackSection) { StringBuilder sb = new StringBuilder(); @@ -324,8 +363,29 @@ namespace MapConverter return s.Length <= maxLength ? s : s.Substring(0,maxLength ); } + public void SavePreviewImage(string filepath) + { + var xs = Map.TopLeft.X; + var ys = Map.TopLeft.Y; + + var bitmap = new Bitmap(Map.Width, Map.Height); + for (var x = 0; x < Map.Width; x++) + for (var y = 0; y < Map.Height; y++) + bitmap.SetPixel(x, y, terrainTypeColors.ColorForTerrainType(tileset.GetTerrainType(Map.MapTiles[x+xs, y+ys]))); + + for (var x = 0; x < Map.Width; x++) + for (var y = 0; y < Map.Height; y++) + if (Map.MapResources[x+xs, y+ys].type > 0) + bitmap.SetPixel(x, y, terrainTypeColors.ColorForTerrainType(TerrainType.Ore)); + + bitmap.Save(filepath,ImageFormat.Png); + } + public void Save(string filepath) { + Directory.CreateDirectory(filepath); + SavePreviewImage(Path.Combine(filepath,"preview.png")); + Map.UpdateUid(); Map.Save(filepath); } } diff --git a/OpenRA.FileFormats/Map/Map.cs b/OpenRA.FileFormats/Map/Map.cs index 5f351376e1..c9389ff6e3 100644 --- a/OpenRA.FileFormats/Map/Map.cs +++ b/OpenRA.FileFormats/Map/Map.cs @@ -101,6 +101,13 @@ namespace OpenRA.FileFormats LoadBinaryData(); } + public void UpdateUid() + { + // TODO: Do this properly. + // Use a hash of the important data + Random foo = new Random(); + Uid = foo.Next().ToString(); + } public void Save(string filepath) { @@ -116,10 +123,9 @@ namespace OpenRA.FileFormats root.Add("Waypoints",MiniYaml.FromDictionary(Waypoints)); // TODO: Players - root.Add("Rules",new MiniYaml(null,Rules)); - SaveBinaryData(filepath+"map.bin"); - root.WriteToFile(filepath+"map.yaml"); + SaveBinaryData(Path.Combine(filepath,"map.bin")); + root.WriteToFile(Path.Combine(filepath,"map.yaml")); } static byte ReadByte( Stream s ) diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index 4381ae936e..64ca607c2d 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -319,10 +319,9 @@ namespace OpenRA var y = r.Top + 50; int maxListItems = ((r.Bottom - 60 - y ) / 20); - - //for(int i = mapOffset; i < Math.Min(maxListItems + mapOffset, Game.AvailableMaps.Count()); i++, y += 20) - - // TODO: Show the appropriate subset of data + + // Don't bother showing a subset of the data + // This will be fixed properly when we move the map list to widgets foreach (var kv in Game.AvailableMaps) { var map = kv.Value; @@ -352,21 +351,6 @@ namespace OpenRA DrawCentered("Spawnpoints: {0}".F(currentMap.PlayerCount), new int2(mapRect.Left + mapRect.Width / 2, y), Color.White); - /* - y += 30; - AddUiButton(new int2(mapRect.Left + mapRect.Width / 2, y), "^", - _ => - { - mapOffset = (mapOffset - 1 < 0) ? 0 : mapOffset - 1; - }); - - y += 30; - AddUiButton(new int2(mapRect.Left + mapRect.Width / 2, y), "\\/", - _ => - { - mapOffset = (mapOffset + 1 > mapList.Value.Count() - maxListItems) ? mapOffset : mapOffset + 1; - }); - */ AddButton(r, _ => { }); } bool PaletteAvailable(int index) { return Game.LobbyInfo.Clients.All(c => c.PaletteIndex != index); } diff --git a/mods/cnc/maps/multimap/map.bin b/mods/cnc/maps/multimap/map.bin new file mode 100644 index 0000000000..bb4b05c8f9 Binary files /dev/null and b/mods/cnc/maps/multimap/map.bin differ diff --git a/mods/cnc/maps/multimap/map.yaml b/mods/cnc/maps/multimap/map.yaml new file mode 100644 index 0000000000..8e74a84603 --- /dev/null +++ b/mods/cnc/maps/multimap/map.yaml @@ -0,0 +1,60 @@ +Uid: 305604695 + +MapFormat: 1 + +Title: Sand Trap + +Author: Westwood Studios + +PlayerCount: 8 + +Tileset: DESERT + +MapSize: 64,64 + +TopLeft: 3,3 + +BottomRight: 60,61 + +Actors: + Actor0: split3 Neutral 21,55 + Actor1: split3 Neutral 19,19 + Actor2: split3 Neutral 8,4 + Actor3: t18 Neutral 3,31 + Actor4: t18 Neutral 22,34 + Actor5: t18 Neutral 26,37 + Actor6: t08 Neutral 4,37 + Actor7: t08 Neutral 7,38 + Actor8: t08 Neutral 5,37 + Actor9: rock1 Neutral 29,14 + Actor10: rock1 Neutral 3,5 + Actor11: rock6 Neutral 44,5 + Actor12: t08 Neutral 53,42 + Actor13: t08 Neutral 54,17 + Actor14: t08 Neutral 53,55 + Actor15: t08 Neutral 37,32 + Actor16: t08 Neutral 39,33 + Actor17: t08 Neutral 38,32 + Actor18: t08 Neutral 46,31 + Actor19: rock1 Neutral 3,12 + Actor20: rock1 Neutral 38,30 + Actor21: t08 Neutral 27,35 + Actor22: split3 Neutral 7,43 + Actor23: split3 Neutral 19,39 + Actor24: split3 Neutral 44,53 + Actor25: split3 Neutral 44,13 + Actor26: split3 Neutral 41,33 + Actor27: split3 Neutral 41,3 + +Waypoints: + spawn7: 20,5 + spawn6: 56,5 + spawn5: 52,35 + spawn4: 6,52 + spawn3: 25,58 + spawn2: 48,58 + spawn1: 33,16 + spawn0: 6,16 + +Rules: + diff --git a/mods/cnc/maps/multimap/preview.png b/mods/cnc/maps/multimap/preview.png new file mode 100644 index 0000000000..e36a4c5b21 Binary files /dev/null and b/mods/cnc/maps/multimap/preview.png differ