diff --git a/OpenRA.Editor/Form1.Designer.cs b/OpenRA.Editor/Form1.Designer.cs index ebf25e08f5..07f47175c4 100755 --- a/OpenRA.Editor/Form1.Designer.cs +++ b/OpenRA.Editor/Form1.Designer.cs @@ -85,8 +85,6 @@ namespace OpenRA.Editor this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.redAlertMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.miniMapExport = new System.Windows.Forms.ToolStripMenuItem(); this.miniMapToPng = new System.Windows.Forms.ToolStripMenuItem(); this.fullMapRenderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -582,7 +580,6 @@ namespace OpenRA.Editor this.saveToolStripMenuItem, this.saveAsToolStripMenuItem, this.toolStripSeparator2, - this.toolStripMenuItem1, this.miniMapExport, this.toolStripSeparator3, this.exitToolStripMenuItem}); @@ -639,25 +636,6 @@ namespace OpenRA.Editor this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(120, 6); // - // toolStripMenuItem1 - // - this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.redAlertMapToolStripMenuItem}); - this.toolStripMenuItem1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem1.Image"))); - this.toolStripMenuItem1.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(123, 22); - this.toolStripMenuItem1.Text = "&Import"; - // - // cCRedAlertMapToolStripMenuItem - // - this.redAlertMapToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("cCRedAlertMapToolStripMenuItem.Image"))); - this.redAlertMapToolStripMenuItem.Name = "cCRedAlertMapToolStripMenuItem"; - this.redAlertMapToolStripMenuItem.Size = new System.Drawing.Size(188, 22); - this.redAlertMapToolStripMenuItem.Text = "&Legacy Map Format..."; - this.redAlertMapToolStripMenuItem.ToolTipText = "Import an original C&C / Red Alert and convert it to the .oramap format."; - this.redAlertMapToolStripMenuItem.Click += new System.EventHandler(this.ImportLegacyMapClicked); - // // mnuExport // this.miniMapExport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -1097,8 +1075,6 @@ namespace OpenRA.Editor private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem redAlertMapToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem miniMapExport; private System.Windows.Forms.ToolStripMenuItem miniMapToPng; private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; diff --git a/OpenRA.Editor/Form1.cs b/OpenRA.Editor/Form1.cs index b3ffb39b5e..47027f7cf8 100644 --- a/OpenRA.Editor/Form1.cs +++ b/OpenRA.Editor/Form1.cs @@ -402,6 +402,7 @@ namespace OpenRA.Editor map.Players.Clear(); map.MakeDefaultPlayers(); + map.FixOpenAreas(); NewMap(map); } @@ -437,37 +438,6 @@ namespace OpenRA.Editor Close(); } - void ImportLegacyMapClicked(object sender, EventArgs e) - { - using (var ofd = new OpenFileDialog { RestoreDirectory = true, - Filter = "Legacy maps (*.ini;*.mpr)|*.ini;*.mpr" }) - if (DialogResult.OK == ofd.ShowDialog()) - { - /* massive hack: we should be able to call NewMap() with the imported Map object, - * but something's not right internally in it, unless loaded via the real maploader */ - - var savePath = Path.Combine(Path.GetTempPath(), "OpenRA.Import"); - Directory.CreateDirectory(savePath); - - var errors = new List(); - - var map = LegacyMapImporter.Import(ofd.FileName, a => errors.Add(a)); - - if (errors.Count > 0) - using (var eld = new ErrorListDialog(errors)) - eld.ShowDialog(); - - map.MakeDefaultPlayers(); - - map.Save(savePath); - LoadMap(savePath); - loadedMapName = null; /* editor needs to think this hasnt been saved */ - - Directory.Delete(savePath, true); - MakeDirty(); - } - } - void OnFormClosing(object sender, FormClosingEventArgs e) { if (!dirty) return; @@ -515,18 +485,7 @@ namespace OpenRA.Editor void FixOpenAreas(object sender, EventArgs e) { dirty = true; - var r = new Random(); - - for (var j = surface1.Map.Bounds.Top; j < surface1.Map.Bounds.Bottom; j++) - for (var i = surface1.Map.Bounds.Left; i < surface1.Map.Bounds.Right; i++) - { - var tr = surface1.Map.MapTiles.Value[i, j]; - if (tr.Type == 0xff || tr.Type == 0xffff || tr.Type == 1 || tr.Type == 2) - tr.Index = (byte)r.Next(0, surface1.TileSetRenderer.Data(tr.Type).Count); - - surface1.Map.MapTiles.Value[i, j] = tr; - } - + surface1.Map.FixOpenAreas(); surface1.Chunks.Clear(); surface1.Invalidate(); } diff --git a/OpenRA.Editor/OpenRA.Editor.csproj b/OpenRA.Editor/OpenRA.Editor.csproj index be2dd5e5fa..2b4313d66a 100644 --- a/OpenRA.Editor/OpenRA.Editor.csproj +++ b/OpenRA.Editor/OpenRA.Editor.csproj @@ -96,7 +96,6 @@ Form1.cs - Form diff --git a/OpenRA.Game/Map.cs b/OpenRA.Game/Map.cs index 4b40075232..5f36b5f4b4 100644 --- a/OpenRA.Game/Map.cs +++ b/OpenRA.Game/Map.cs @@ -60,7 +60,7 @@ namespace OpenRA // Yaml map data public string Uid { get; private set; } public int MapFormat; - public bool Selectable; + public bool Selectable = true; public bool UseAsShellmap; public string RequiresMod; @@ -474,5 +474,24 @@ namespace OpenRA Enemies = Players.Where(p => p.Value.Playable).Select(p => p.Key).ToArray() }); } + + public void FixOpenAreas() + { + var r = new Random(); + var tileset = OpenRA.Rules.TileSets[Tileset]; + + for (var j = Bounds.Top; j < Bounds.Bottom; j++) + { + for (var i = Bounds.Left; i < Bounds.Right; i++) + { + var tr = MapTiles.Value[i, j]; + var template = tileset.Templates[tr.Type]; + if (!template.PickAny) + continue; + tr.Index = (byte)r.Next(0, template.Tiles.Count); + MapTiles.Value[i, j] = tr; + } + } + } } } diff --git a/OpenRA.Utility/Command.cs b/OpenRA.Utility/Command.cs index ff230b4430..2e373bbeaf 100644 --- a/OpenRA.Utility/Command.cs +++ b/OpenRA.Utility/Command.cs @@ -331,5 +331,21 @@ namespace OpenRA.Utility Game.modData = new ModData(mod); new Map(map, mod); } + + [Desc("MOD", "FILENAME", "Convert a legacy INI/MPR map to the OpenRA format.")] + public static void ImportLegacyMap(string[] args) + { + var mod = args[1]; + var filename = args[2]; + Game.modData = new ModData(mod); + Rules.LoadRules(Game.modData.Manifest, new Map()); + var map = LegacyMapImporter.Import(filename, e => Console.WriteLine(e)); + map.RequiresMod = mod; + map.MakeDefaultPlayers(); + map.FixOpenAreas(); + var dest = map.Title + ".oramap"; + map.Save(dest); + Console.WriteLine(dest + " saved."); + } } } diff --git a/OpenRA.Editor/LegacyMapImporter.cs b/OpenRA.Utility/LegacyMapImporter.cs similarity index 97% rename from OpenRA.Editor/LegacyMapImporter.cs rename to OpenRA.Utility/LegacyMapImporter.cs index f1dab220e1..191aaadcd3 100644 --- a/OpenRA.Editor/LegacyMapImporter.cs +++ b/OpenRA.Utility/LegacyMapImporter.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -18,7 +18,7 @@ using System.Text; using OpenRA.FileFormats; using OpenRA.Traits; -namespace OpenRA.Editor +namespace OpenRA.Utility { public class LegacyMapImporter { @@ -133,7 +133,7 @@ namespace OpenRA.Editor var height = int.Parse(mapSection.GetValue("Height", "0")); mapSize = (legacyMapFormat == IniMapFormat.RedAlert) ? 128 : 64; - map.Title = basic.GetValue("Name", "(null)"); + map.Title = basic.GetValue("Name", Path.GetFileNameWithoutExtension(iniFile)); map.Author = "Westwood Studios"; map.Tileset = Truncate(mapSection.GetValue("Theater", "TEMPERAT"), 8); map.MapSize.X = mapSize; @@ -464,13 +464,15 @@ namespace OpenRA.Editor var neutral = new[] { "Neutral" }; foreach (var s in file.GetSection(section, true)) { - Console.WriteLine(s.Key); switch (s.Key) { case "Allies": pr.Allies = s.Value.Split(',').Intersect(players).Except(neutral).ToArray(); pr.Enemies = s.Value.Split(',').SymmetricDifference(players).Except(neutral).ToArray(); - break; + break; + default: + Console.WriteLine("Ignoring unknown {0}={1} for player {2}", s.Key, s.Value, pr.Name); + break; } } diff --git a/OpenRA.Utility/OpenRA.Utility.csproj b/OpenRA.Utility/OpenRA.Utility.csproj index 085267930e..3fa93c808b 100644 --- a/OpenRA.Utility/OpenRA.Utility.csproj +++ b/OpenRA.Utility/OpenRA.Utility.csproj @@ -77,6 +77,7 @@ + diff --git a/OpenRA.Utility/Program.cs b/OpenRA.Utility/Program.cs index 06914d0119..a6ef3850b4 100644 --- a/OpenRA.Utility/Program.cs +++ b/OpenRA.Utility/Program.cs @@ -32,6 +32,7 @@ namespace OpenRA.Utility { "--map-upgrade-v5", Command.UpgradeV5Map }, { "--upgrade-map", UpgradeRules.UpgradeMap }, { "--upgrade-mod", UpgradeRules.UpgradeMod }, + { "--map-import", Command.ImportLegacyMap } }; static void Main(string[] args) diff --git a/mods/cnc/tilesets/desert.yaml b/mods/cnc/tilesets/desert.yaml index cde9f0a7e8..900f389be8 100644 --- a/mods/cnc/tilesets/desert.yaml +++ b/mods/cnc/tilesets/desert.yaml @@ -60,6 +60,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@65535: Id: 65535 Image: clear1 @@ -67,6 +82,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@0: Id: 0 Image: clear1 @@ -74,6 +104,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@1: Id: 1 Image: w1 diff --git a/mods/cnc/tilesets/snow.yaml b/mods/cnc/tilesets/snow.yaml index 4a8d24886f..a91c54587e 100644 --- a/mods/cnc/tilesets/snow.yaml +++ b/mods/cnc/tilesets/snow.yaml @@ -60,6 +60,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@65535: Id: 65535 Image: clear1 @@ -67,6 +82,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@0: Id: 0 Image: clear1 @@ -74,6 +104,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@1: Id: 1 Image: w1 diff --git a/mods/cnc/tilesets/temperat.yaml b/mods/cnc/tilesets/temperat.yaml index 7dbe8c3528..570024a2d6 100644 --- a/mods/cnc/tilesets/temperat.yaml +++ b/mods/cnc/tilesets/temperat.yaml @@ -60,6 +60,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@65535: Id: 65535 Image: clear1 @@ -67,6 +82,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@0: Id: 0 Image: clear1 @@ -74,6 +104,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@1: Id: 1 Image: w1 diff --git a/mods/cnc/tilesets/winter.yaml b/mods/cnc/tilesets/winter.yaml index b3b3ab2b29..23e56cf7d6 100644 --- a/mods/cnc/tilesets/winter.yaml +++ b/mods/cnc/tilesets/winter.yaml @@ -60,6 +60,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@65535: Id: 65535 Image: clear1 @@ -67,6 +82,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@0: Id: 0 Image: clear1 @@ -74,6 +104,21 @@ Templates: PickAny: True Tiles: 0: Clear + 1: Clear + 2: Clear + 3: Clear + 4: Clear + 5: Clear + 6: Clear + 7: Clear + 8: Clear + 9: Clear + 10: Clear + 11: Clear + 12: Clear + 13: Clear + 14: Clear + 15: Clear Template@1: Id: 1 Image: w1 diff --git a/mods/d2k/tilesets/arrakis.yaml b/mods/d2k/tilesets/arrakis.yaml index 76cfe51fc6..502474925b 100644 --- a/mods/d2k/tilesets/arrakis.yaml +++ b/mods/d2k/tilesets/arrakis.yaml @@ -64,7 +64,7 @@ Templates: Image: BLOXBASE Frames: 0 Size: 1,1 - PickAny: False + PickAny: True # TODO: add more Frames and Tiles here Tiles: 0: Sand Template@1: @@ -108,7 +108,7 @@ Templates: Image: BLOXBASE Frames: 16,17,36,37 Size: 2,2 - Category: Dune + Category: Dune PickAny: False Tiles: 0: Sand @@ -120,7 +120,7 @@ Templates: Image: BLOXBASE Frames: 18,19,38,39 Size: 2,2 - Category: Dune + Category: Dune PickAny: False Tiles: 0: Dune @@ -132,7 +132,7 @@ Templates: Image: BLOXBASE Frames: 58,59,78,79 Size: 2,2 - Category: Dune + Category: Dune PickAny: False Tiles: 1: Dune diff --git a/mods/ra/tilesets/desert.yaml b/mods/ra/tilesets/desert.yaml index 1ba9d9a4e8..d43c9a3641 100644 --- a/mods/ra/tilesets/desert.yaml +++ b/mods/ra/tilesets/desert.yaml @@ -75,6 +75,7 @@ Templates: Image: clear1 Size: 1,1 Category: Terrain + PickAny: True Tiles: 0: Clear 1: Clear @@ -97,6 +98,7 @@ Templates: Image: clear1 Size: 1,1 Category: Terrain + PickAny: True Tiles: 0: Clear 1: Clear @@ -115,14 +117,14 @@ Templates: 14: Clear 15: Clear Template@256: - Id: 256 + Id: 256 Image: w1 Size: 1,1 Category: Terrain Tiles: 0: Water Template@257: - Id: 257 + Id: 257 Image: sh17 Size: 2,2 Category: Terrain @@ -132,7 +134,7 @@ Templates: 2: Water 3: Water Template@258: - Id: 258 + Id: 258 Image: sh18 Size: 2,2 Category: Terrain diff --git a/mods/ra/tilesets/interior.yaml b/mods/ra/tilesets/interior.yaml index 30ddb2b4bb..9f40b6d756 100644 --- a/mods/ra/tilesets/interior.yaml +++ b/mods/ra/tilesets/interior.yaml @@ -56,6 +56,7 @@ Templates: Id: 255 Image: clear1 Size: 1,1 + PickAny: True Tiles: 0: Clear 1: Clear @@ -76,6 +77,7 @@ Templates: Template@65535: Id: 65535 Image: clear1 + PickAny: True Size: 1,1 Tiles: 0: Clear diff --git a/mods/ra/tilesets/temperat.yaml b/mods/ra/tilesets/temperat.yaml index 940fcddc86..ae7bb37b6d 100644 --- a/mods/ra/tilesets/temperat.yaml +++ b/mods/ra/tilesets/temperat.yaml @@ -58,6 +58,7 @@ Templates: Image: clear1 Size: 1,1 Category: Terrain + PickAny: True Tiles: 0: Clear 1: Clear @@ -80,6 +81,7 @@ Templates: Image: clear1 Size: 1,1 Category: Terrain + PickAny: True Tiles: 0: Clear 1: Clear