From b135a059eefbcfc985978e9bddff27b04e44e82f Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 3 Apr 2010 21:50:03 +1300 Subject: [PATCH] Map converter saves to package --- MapConverter/Main.cs | 16 +----- MapConverter/MapConverter.cs | 76 ++++++++++++++++++++++++++--- OpenRA.FileFormats/Map/Map.cs | 12 +++-- OpenRA.Game/Chrome.cs | 22 ++------- mods/cnc/maps/multimap/map.bin | Bin 0 -> 20485 bytes mods/cnc/maps/multimap/map.yaml | 60 +++++++++++++++++++++++ mods/cnc/maps/multimap/preview.png | Bin 0 -> 878 bytes 7 files changed, 141 insertions(+), 45 deletions(-) create mode 100644 mods/cnc/maps/multimap/map.bin create mode 100644 mods/cnc/maps/multimap/map.yaml create mode 100644 mods/cnc/maps/multimap/preview.png 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 0000000000000000000000000000000000000000..bb4b05c8f90346192289f20296c0d4a127860fc4 GIT binary patch literal 20485 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e36a4c5b216ed9d4f034b242504f142a8162cab7 GIT binary patch literal 878 zcmV-!1CjiRP)Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU!>`6pHRA_eJja=8*2g$zCPZDLsBTO zZ7L*Hh@TsjS6MYE7r8RXjMw%k3x1dZ`uO~MmT8c<(Zjk5I=`83Gwmo`LMi0L?CFyYzIRDX)fte(5{fmkZKL4b6j8G=r_SQQ@+V z_Pa=4@W|on`Xm;pl>T5Oea_6{*oO0%tcH|Q%p(;`78m6dB;Fli;0T}wnO&Pxkk~K| zGOBC0kYGq=JsY*tN<(7f=zXR0Ji1|LHWacdy||+m{hI}ezZ(Ks9YuPzAgLXtV{+?b z*|13dd&t?KLnj^zJUfD6$V|a%D^L|uO0O*FZqij6N0(T%>Vk|$0Xo4Q&8X+#eqHIB z0rgfDEYEwON+Ekdd#iIENUndW4V;9UtROKc{?G$zl|8g0mj)Seatc!Ns0Y$BmNdYU zqn4D*-dQ$UBW-%2UmAhx9n>NX+Kgfh3C44dlpw1kx`J$iHvzqhTYD~&8l=b3nKhh+ z)TU$47~|S=x_bIdMG~h-4@wu&`C`^G~?MV0!gDu zK{Jq6c7-6p$et*2knmnRs%0QOLu>^}4YVM!5^dINkd?m{vA`%K*u+9g3h~6l-OrTf zJZTd_gTPh>@O6(%0%V70r*w*>G^V)JrD-!0%*q&PNQsfe@Ad*|35KLj`E%5g8eS44 zJMnlLS?kpvL|W=nkXu7(HoGG^+S}Z;UkM4In?h#3>6NLFoVPW|iu%qbkWIXM+Mcq9 zHfL-GDS>kP<@VkJ9S&KMQdT6r{ggvS3ri8mp0uU!R7h!qZdC?GLPm6&KhM_2M+Ow@ z#U;#Pv#Vw-7sZNbO8*#=4(TaKD=MBb5*eEw$SfSlFI5xzZQ7t}k^lez07*qoM6N<$ Ef+VthMF0Q* literal 0 HcmV?d00001