diff --git a/OpenRA.Editor/LegacyMapImporter.cs b/OpenRA.Editor/LegacyMapImporter.cs index 4476c78161..5134b58670 100644 --- a/OpenRA.Editor/LegacyMapImporter.cs +++ b/OpenRA.Editor/LegacyMapImporter.cs @@ -16,6 +16,7 @@ using System.Text; using OpenRA; using OpenRA.FileFormats; using OpenRA.Traits; +using System.Drawing; namespace OpenRA.Editor { @@ -80,11 +81,26 @@ namespace OpenRA.Editor // {"wcrate","crate"}, // {"scrate","crate"}, }; - + + static Dictionary> namedColorMapping = new Dictionary>() + { + {"gold",Pair.New(Color.FromArgb(246,214,121),Color.FromArgb(40,32,8))}, + {"blue",Pair.New(Color.FromArgb(226,230,246),Color.FromArgb(8,20,52))}, + {"red",Pair.New(Color.FromArgb(255,20,0),Color.FromArgb(56,0,0))}, + {"neutral",Pair.New(Color.FromArgb(238,238,238),Color.FromArgb(44,28,24))}, + {"orange",Pair.New(Color.FromArgb(255,230,149),Color.FromArgb(56,0,0))}, + {"teal",Pair.New(Color.FromArgb(93,194,165),Color.FromArgb(0,32,32))}, + {"salmon",Pair.New(Color.FromArgb(210,153,125),Color.FromArgb(56,0,0))}, + {"green",Pair.New(Color.FromArgb(160,240,140),Color.FromArgb(20,20,20))}, + {"white",Pair.New(Color.FromArgb(255,255,255),Color.FromArgb(75,75,75))}, + {"black",Pair.New(Color.FromArgb(80,80,80),Color.FromArgb(5,5,5))}, + }; + int MapSize; int ActorCount = 0; Map Map = new Map(); - + List Players = new List(); + LegacyMapImporter(string filename) { ConvertIniMap(filename); @@ -97,7 +113,7 @@ namespace OpenRA.Editor } enum IniMapFormat { RedAlert = 3, /* otherwise, cnc (2 variants exist, we don't care to differentiate) */ }; - + public void ConvertIniMap(string iniFile) { var file = new IniFile(FileSystem.Open(iniFile)); @@ -124,17 +140,12 @@ namespace OpenRA.Editor UnpackRATileData(ReadPackedSection(file.GetSection("MapPack"))); UnpackRAOverlayData(ReadPackedSection(file.GetSection("OverlayPack"))); ReadRATrees(file); - // TODO: Fixme - //tileset = new TileSet("tileSet.til","templates.ini",fileMapping[Pair.New("ra",Map.Tileset)].First); } else // CNC { UnpackCncTileData(FileSystem.Open(iniFile.Substring(0, iniFile.Length - 4) + ".bin")); ReadCncOverlay(file); ReadCncTrees(file); - - // TODO: Fixme - //tileset = new TileSet("tileSet.til","templates.ini",fileMapping[Pair.New("cnc",Map.Tileset)].First); } LoadActors(file, "STRUCTURES"); @@ -142,6 +153,9 @@ namespace OpenRA.Editor LoadActors(file, "INFANTRY"); LoadSmudges(file, "SMUDGE"); + foreach (var p in Players) + LoadPlayer(file, p, (legacyMapFormat == IniMapFormat.RedAlert)); + var wp = file.GetSection("Waypoints") .Where(kv => int.Parse(kv.Value) > 0) .Select(kv => Pair.New(int.Parse(kv.Key), @@ -355,6 +369,10 @@ namespace OpenRA.Editor if (parts[0] == "") parts[0] = "Neutral"; + + if (!Players.Contains(parts[0])) + Players.Add(parts[0]); + Map.Actors.Add("Actor" + ActorCount++, new ActorReference(parts[1].ToLowerInvariant()) { @@ -376,6 +394,42 @@ namespace OpenRA.Editor Map.Smudges.Add(new SmudgeReference(parts[0].ToLowerInvariant(), new int2(loc % MapSize, loc / MapSize), int.Parse(parts[2]))); } } + + void LoadPlayer(IniFile file, string section, bool isRA) + { + var c = (section == "BadGuy") ? "red" : + (isRA) ? "blue" : "gold"; + + var color = namedColorMapping[c]; + + var pr = new PlayerReference + { + Name = section, + OwnsWorld = (section == "Neutral"), + NonCombatant = (section == "Neutral"), + Race = (isRA) ? ((section == "BadGuy") ? "allies" : "soviet") : ((section == "BadGuy") ? "nod" : "gdi"), + Color = color.First, + Color2 = color.Second, + }; + + var Neutral = new List(){"Neutral"}; + foreach (var s in file.GetSection(section, true)) + { + Console.WriteLine(s.Key); + switch(s.Key) + { + case "Credits": + pr.InitialCash = int.Parse(s.Value); + break; + case "Allies": + pr.Allies = s.Value.Split(',').Intersect(Players).Except(Neutral).ToArray(); + pr.Enemies = s.Value.Split(',').SymmetricDifference(Players).Except(Neutral).ToArray(); + break; + } + } + + Map.Players.Add(section, pr); + } static string Truncate(string s, int maxLength) { diff --git a/OpenRA.FileFormats/Map/PlayerReference.cs b/OpenRA.FileFormats/Map/PlayerReference.cs index 20a9e45fc7..3ea821d85a 100644 --- a/OpenRA.FileFormats/Map/PlayerReference.cs +++ b/OpenRA.FileFormats/Map/PlayerReference.cs @@ -14,14 +14,19 @@ namespace OpenRA.FileFormats { public class PlayerReference { - public readonly string Name; - public readonly string Palette; - public readonly string Race; - public readonly bool OwnsWorld = false; - public readonly bool NonCombatant = false; - public readonly Color Color = Color.FromArgb(238,238,238); - public readonly Color Color2 = Color.FromArgb(44,28,24); - + public string Name; + public string Palette; + public string Race; + public bool OwnsWorld = false; + public bool NonCombatant = false; + public Color Color = Color.FromArgb(238,238,238); + public Color Color2 = Color.FromArgb(44,28,24); + + public int InitialCash = 0; + public string[] Allies = null; + public string[] Enemies = null; + + public PlayerReference() {} public PlayerReference(MiniYaml my) { FieldLoader.Load(this, my);