From 724df5ad5406e5e8ac02c662cb9ee504fac6a6e9 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 1 Aug 2010 18:02:02 +1200 Subject: [PATCH] add central-conflict and marooned-ii via new importer --- MapConverter/Main.cs | 3 +- MapConverter/MapConverter.cs | 4 +- OpenRA.Editor/Form1.Designer.cs | 83 ++-- OpenRA.Editor/Form1.cs | 21 + OpenRA.Editor/Form1.resx | 26 +- OpenRA.Editor/LegacyMapImporter.cs | 354 +++++++++++++++++ OpenRA.Editor/OpenRA.Editor.csproj | 1 + OpenRA.Editor/Program.cs | 1 + OpenRA.Editor/Surface.cs | 9 +- mods/ra/maps/central-conflict/map.bin | Bin 0 -> 81925 bytes mods/ra/maps/central-conflict/map.uid | 1 + mods/ra/maps/central-conflict/map.yaml | 518 +++++++++++++++++++++++++ mods/ra/maps/marooned/map.bin | Bin 0 -> 81925 bytes mods/ra/maps/marooned/map.uid | 1 + mods/ra/maps/marooned/map.yaml | 386 ++++++++++++++++++ 15 files changed, 1348 insertions(+), 60 deletions(-) create mode 100644 OpenRA.Editor/LegacyMapImporter.cs create mode 100644 mods/ra/maps/central-conflict/map.bin create mode 100644 mods/ra/maps/central-conflict/map.uid create mode 100644 mods/ra/maps/central-conflict/map.yaml create mode 100644 mods/ra/maps/marooned/map.bin create mode 100644 mods/ra/maps/marooned/map.uid create mode 100644 mods/ra/maps/marooned/map.yaml diff --git a/MapConverter/Main.cs b/MapConverter/Main.cs index d82f462725..ab92e6a619 100644 --- a/MapConverter/Main.cs +++ b/MapConverter/Main.cs @@ -31,8 +31,9 @@ namespace MapConverter Game.InitializeEngineWithMods(mods); var map = MapConverter.Import(inputFile); - + Directory.CreateDirectory(outputPath); + map.Package = new Folder(outputPath); map.Save(outputPath); } } diff --git a/MapConverter/MapConverter.cs b/MapConverter/MapConverter.cs index 143b468f3e..4db9aaf61d 100644 --- a/MapConverter/MapConverter.cs +++ b/MapConverter/MapConverter.cs @@ -76,8 +76,8 @@ namespace MapConverter {"v18","v18"}, // Crates - {"wcrate","crate"}, - {"scrate","crate"}, +// {"wcrate","crate"}, +// {"scrate","crate"}, }; int MapSize; diff --git a/OpenRA.Editor/Form1.Designer.cs b/OpenRA.Editor/Form1.Designer.cs index 58b768c171..aef0537b3b 100644 --- a/OpenRA.Editor/Form1.Designer.cs +++ b/OpenRA.Editor/Form1.Designer.cs @@ -39,27 +39,27 @@ this.actorPalette = new System.Windows.Forms.FlowLayoutPanel(); this.tabPage3 = new System.Windows.Forms.TabPage(); this.resourcePalette = new System.Windows.Forms.FlowLayoutPanel(); - this.tt = new System.Windows.Forms.ToolTip(this.components); - this.folderBrowser = new System.Windows.Forms.FolderBrowserDialog(); + this.surface1 = new OpenRA.Editor.Surface(); this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.exotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.cCRedAlertMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.bitmapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.exotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.resizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.spawnpointsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.surface1 = new OpenRA.Editor.Surface(); + this.tt = new System.Windows.Forms.ToolTip(this.components); + this.folderBrowser = new System.Windows.Forms.FolderBrowserDialog(); this.toolStripContainer1.ContentPanel.SuspendLayout(); this.toolStripContainer1.TopToolStripPanel.SuspendLayout(); this.toolStripContainer1.SuspendLayout(); @@ -148,7 +148,7 @@ this.tabPage2.Location = new System.Drawing.Point(4, 22); this.tabPage2.Name = "tabPage2"; this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(190, 630); + this.tabPage2.Size = new System.Drawing.Size(190, 655); this.tabPage2.TabIndex = 1; this.tabPage2.Text = "Actors"; this.tabPage2.UseVisualStyleBackColor = true; @@ -160,7 +160,7 @@ this.actorPalette.Dock = System.Windows.Forms.DockStyle.Fill; this.actorPalette.Location = new System.Drawing.Point(3, 3); this.actorPalette.Name = "actorPalette"; - this.actorPalette.Size = new System.Drawing.Size(184, 624); + this.actorPalette.Size = new System.Drawing.Size(184, 649); this.actorPalette.TabIndex = 2; // // tabPage3 @@ -168,7 +168,7 @@ this.tabPage3.Controls.Add(this.resourcePalette); this.tabPage3.Location = new System.Drawing.Point(4, 22); this.tabPage3.Name = "tabPage3"; - this.tabPage3.Size = new System.Drawing.Size(190, 630); + this.tabPage3.Size = new System.Drawing.Size(190, 655); this.tabPage3.TabIndex = 2; this.tabPage3.Text = "Resources"; this.tabPage3.UseVisualStyleBackColor = true; @@ -180,12 +180,18 @@ this.resourcePalette.Dock = System.Windows.Forms.DockStyle.Fill; this.resourcePalette.Location = new System.Drawing.Point(0, 0); this.resourcePalette.Name = "resourcePalette"; - this.resourcePalette.Size = new System.Drawing.Size(190, 630); + this.resourcePalette.Size = new System.Drawing.Size(190, 655); this.resourcePalette.TabIndex = 3; // - // tt + // surface1 // - this.tt.ShowAlways = true; + this.surface1.BackColor = System.Drawing.Color.Black; + this.surface1.Dock = System.Windows.Forms.DockStyle.Fill; + this.surface1.Location = new System.Drawing.Point(0, 0); + this.surface1.Name = "surface1"; + this.surface1.Size = new System.Drawing.Size(783, 681); + this.surface1.TabIndex = 5; + this.surface1.Text = "surface1"; // // menuStrip1 // @@ -224,6 +230,11 @@ this.newToolStripMenuItem.Text = "&New..."; this.newToolStripMenuItem.Click += new System.EventHandler(this.NewClicked); // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6); + // // openToolStripMenuItem // this.openToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripMenuItem.Image"))); @@ -232,11 +243,6 @@ this.openToolStripMenuItem.Text = "&Open..."; this.openToolStripMenuItem.Click += new System.EventHandler(this.OpenClicked); // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6); - // // saveToolStripMenuItem // this.saveToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem.Image"))); @@ -257,18 +263,6 @@ this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6); // - // exotToolStripMenuItem - // - this.exotToolStripMenuItem.Name = "exotToolStripMenuItem"; - this.exotToolStripMenuItem.Size = new System.Drawing.Size(152, 22); - this.exotToolStripMenuItem.Text = "E&xit"; - this.exotToolStripMenuItem.Click += new System.EventHandler(this.CloseClicked); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(149, 6); - // // toolStripMenuItem1 // this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -284,6 +278,7 @@ this.cCRedAlertMapToolStripMenuItem.Name = "cCRedAlertMapToolStripMenuItem"; this.cCRedAlertMapToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.cCRedAlertMapToolStripMenuItem.Text = "&C&&C / Red Alert Map..."; + this.cCRedAlertMapToolStripMenuItem.Click += new System.EventHandler(this.ImportLegacyMapClicked); // // bitmapToolStripMenuItem // @@ -292,6 +287,18 @@ this.bitmapToolStripMenuItem.Size = new System.Drawing.Size(195, 22); this.bitmapToolStripMenuItem.Text = "&Bitmap..."; // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(149, 6); + // + // exotToolStripMenuItem + // + this.exotToolStripMenuItem.Name = "exotToolStripMenuItem"; + this.exotToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exotToolStripMenuItem.Text = "E&xit"; + this.exotToolStripMenuItem.Click += new System.EventHandler(this.CloseClicked); + // // mapToolStripMenuItem // this.mapToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -307,7 +314,7 @@ // this.propertiesToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("propertiesToolStripMenuItem.Image"))); this.propertiesToolStripMenuItem.Name = "propertiesToolStripMenuItem"; - this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(142, 22); this.propertiesToolStripMenuItem.Text = "&Properties..."; this.propertiesToolStripMenuItem.Click += new System.EventHandler(this.PropertiesClicked); // @@ -315,32 +322,26 @@ // this.resizeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("resizeToolStripMenuItem.Image"))); this.resizeToolStripMenuItem.Name = "resizeToolStripMenuItem"; - this.resizeToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.resizeToolStripMenuItem.Size = new System.Drawing.Size(142, 22); this.resizeToolStripMenuItem.Text = "&Resize..."; this.resizeToolStripMenuItem.Click += new System.EventHandler(this.ResizeClicked); // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(149, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(139, 6); // // spawnpointsToolStripMenuItem // this.spawnpointsToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("spawnpointsToolStripMenuItem.Image"))); this.spawnpointsToolStripMenuItem.Name = "spawnpointsToolStripMenuItem"; - this.spawnpointsToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.spawnpointsToolStripMenuItem.Size = new System.Drawing.Size(142, 22); this.spawnpointsToolStripMenuItem.Text = "&Spawnpoints"; this.spawnpointsToolStripMenuItem.Click += new System.EventHandler(this.SpawnPointsClicked); // - // surface1 + // tt // - this.surface1.BackColor = System.Drawing.Color.Black; - this.surface1.Dock = System.Windows.Forms.DockStyle.Fill; - this.surface1.Location = new System.Drawing.Point(0, 0); - this.surface1.Name = "surface1"; - this.surface1.Size = new System.Drawing.Size(783, 681); - this.surface1.TabIndex = 5; - this.surface1.Text = "surface1"; + this.tt.ShowAlways = true; // // Form1 // diff --git a/OpenRA.Editor/Form1.cs b/OpenRA.Editor/Form1.cs index 03d0b6d50a..a2b24f5d61 100644 --- a/OpenRA.Editor/Form1.cs +++ b/OpenRA.Editor/Form1.cs @@ -401,5 +401,26 @@ namespace OpenRA.Editor { Close(); } + + void ImportLegacyMapClicked(object sender, EventArgs e) + { + using (var ofd = new OpenFileDialog { 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 map = LegacyMapImporter.Import(ofd.FileName); + map.Package = new Folder(savePath); + map.Save(savePath); + LoadMap(savePath); + loadedMapName = null; /* editor needs to think this hasnt been saved */ + + Directory.Delete(savePath, true); + } + } } } \ No newline at end of file diff --git a/OpenRA.Editor/Form1.resx b/OpenRA.Editor/Form1.resx index 19933a2c82..a6beb3464c 100644 --- a/OpenRA.Editor/Form1.resx +++ b/OpenRA.Editor/Form1.resx @@ -120,12 +120,6 @@ 309, 17 - - 17, 17 - - - 182, 17 - @@ -144,7 +138,7 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAACeklE + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsQAAALEAGtI711AAACeklE QVQ4T6WTWUiUURiG/4suurJIjUIwskQsEANDqosQpUVNKbdCSRPKrQVDMddmXEedGdcpFXNGnUYdrSzF sEIoFInQcqHE1CwoKsXUUMnt6Z+RLMtA8OK5OZz3Oe/5OEcAhPWwpnBaodZZmqfjWmY5GSo98XJNwq9D 1yQIilLhFaYIMIQuxZaZJ4uy6FS1T2BUIUKdNsdPhL9pqpEp/ne18PiiE94RCjzDco0C+rs1zIzXGvkx @@ -161,7 +155,7 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAACMklE + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsQAAALEAGtI711AAACMklE QVQ4T6WT3UuTcRTH9y90303QRbc1NYZrMRs86hzKsmFoIb09kqZpunxJUqxMxZYvkK1w6sTlahJOKvIF TJEUMZaSlZkrWuJQU3QiGHz7nZ+wn0vrQh84Nw98Puc553wfBQDFXorDL18EQOXuXEGHaxlPHItoafbj kXUW9XU/YLnnxd3yaZSWfEZR4Qfk5Y7japaHoVBwAYF9vUBd7Tq9/Oeztr4BfVIfTic95xUUuJ4tcUFl @@ -221,7 +215,7 @@ XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALEQAACxEBf2RfkQAAAN5JREFUOE+FUwEOAyEI + 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALEAAACxABrSO9dQAAAN5JREFUOE+FUwEOAyEI 8+k+7X7GoFBWmZdtISYgtS3csrXsFtvzf2Mv8/8d4Hkec2SLM+IHzJsjdwVAcxQrtl8OsDgBxPMGgKJG SQkwMlI2zSCS+cuL0YCceHEDAcBbM6gTQOhDDpnBxHqVOsmgdYvmfCxk7q+JpDZN4yQOJhOAOtmslGna MYE3AN2HeBEmyvhYZ44mL5rRXkijgoAZAA3nCVBzbzM5vuE8x8xmbGIzqE1LkNwHOO2RZmZOjQYTjoWF @@ -231,7 +225,7 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAACR0lE + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsQAAALEAGtI711AAACR0lE QVQ4T6WTXUiTARSGdxkRRBdB0IUREV1EKRFEYYuQAklL8sKQfphUoJSUWJbLxAVZWqyBio5WajorM1PL xExUlLQfbU5n0lygRerMP/qxOZ92vpjfCKLAi3P5Puc957xHA2gWUoo49147gWUqbSPrdjOXChrQm56S lFVFvKEcXaqV2OQiohMt7Esw+6Ro5gGeWfhbff0BY9NzDI3N0f/JS6fLy7rd6f8HcNsdOI6EYD8cjK3V @@ -248,7 +242,7 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAACCklE + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsQAAALEAGtI711AAACCklE QVQ4T6WT30tTUQDHz39QD0UQSpAPIkgPyR60AiUiyoGBL4qZjOyt0tZP9tBDk1AsXIhj93ILdd27DPPH 3VwrUrdK2ioJHAgVOdoPaQsarBg43L6ec+akuRsEPnw5D4fP5/vlXg4BQHaSf8LjjwdqaTA2cg+y1Ith qxmi5Tas/SYWk+QRoPgmtNsLcPq7GYX8+XoTqaUL+KR2cAmDxeBgqeBv2NhWzwUFOBk4g5/zRxB3V8Es @@ -263,7 +257,7 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAADLklE + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsQAAALEAGtI711AAADLklE QVQ4T3WS60/ScRjFf39CL3rR1ovurduWbbU2t7ZqdlkXt7Lrym6O1VoXcdYqQ54wKlGxABE1CzWF0nIm lZcoTbyUNJFIzDJSJK+E0qy8wInvz+i2erazfd+cz3m+zw4nTS+FLOeZNim3Vp6UU5sqvf5MSZqnyjhV pfKUvEx54kqp8rCkWHVQVKSJPHtbs+tUgSYiOicVAMfEqfR1dVFCGSqrX94cHQeN/aXhbyD3Zz91uf3U @@ -283,7 +277,7 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsRAAALEQF/ZF+RAAABrUlE + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsQAAALEAGtI711AAABrUlE QVQ4T6WTWyhDcRzHl8g1D/IkxZ4mjcgDB0U5ubbVbJLkkubJSt7w6M1eENHUENrktmzJ3HKEiSh7US5l QiK5JUXpy/9f/9O2zhY59at//c/n87uc35EBkP0nAsL6Bi33E9CpeBINJElHthIkvBNKChh8YVPi1Cpn Eo7ANSnJwQUMfnLEobVejZbaCnis8VRiyFSgXJ4QWOAPO5fXYJ2xo1HD48QcRSV5CfHSAn94fV0gL9Jn @@ -294,4 +288,10 @@ vP+uv56/AehVvkSccelEAAAAAElFTkSuQmCC + + 17, 17 + + + 182, 17 + \ No newline at end of file diff --git a/OpenRA.Editor/LegacyMapImporter.cs b/OpenRA.Editor/LegacyMapImporter.cs new file mode 100644 index 0000000000..4623571e8a --- /dev/null +++ b/OpenRA.Editor/LegacyMapImporter.cs @@ -0,0 +1,354 @@ +#region Copyright & License Information +/* + * Copyright 2007-2010 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, + * see LICENSE. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using OpenRA; +using OpenRA.FileFormats; + +namespace OpenRA.Editor +{ + public class LegacyMapImporter + { + // Mapping from ra overlay index to type string + static string[] raOverlayNames = + { + "sbag", "cycl", "brik", "fenc", "wood", + "gold01", "gold02", "gold03", "gold04", + "gem01", "gem02", "gem03", "gem04", + "v12", "v13", "v14", "v15", "v16", "v17", "v18", + "fpls", "wcrate", "scrate", "barb", "sbag", + }; + + static Dictionary> overlayResourceMapping = new Dictionary>() + { + // RA Gems, Gold + { "gold01", new Pair(1,0) }, + { "gold02", new Pair(1,1) }, + { "gold03", new Pair(1,2) }, + { "gold04", new Pair(1,3) }, + + { "gem01", new Pair(2,0) }, + { "gem02", new Pair(2,1) }, + { "gem03", new Pair(2,2) }, + { "gem04", new Pair(2,3) }, + + // cnc tiberium + { "ti1", new Pair(1,0) }, + { "ti2", new Pair(1,1) }, + { "ti3", new Pair(1,2) }, + { "ti4", new Pair(1,3) }, + { "ti5", new Pair(1,4) }, + { "ti6", new Pair(1,5) }, + { "ti7", new Pair(1,6) }, + { "ti8", new Pair(1,7) }, + { "ti9", new Pair(1,8) }, + { "ti10", new Pair(1,9) }, + { "ti11", new Pair(1,10) }, + { "ti12", new Pair(1,11) }, + }; + + static Dictionary overlayActorMapping = new Dictionary() { + // Fences + {"sbag","sbag"}, + {"cycl","cycl"}, + {"brik","brik"}, + {"fenc","fenc"}, + {"wood","wood"}, + + // Fields + {"v12","v12"}, + {"v13","v13"}, + {"v14","v14"}, + {"v15","v15"}, + {"v16","v16"}, + {"v17","v17"}, + {"v18","v18"}, + + // Crates +// {"wcrate","crate"}, +// {"scrate","crate"}, + }; + + int MapSize; + int ActorCount = 0; + Map Map = new Map(); + + LegacyMapImporter(string filename) + { + ConvertIniMap(filename); + } + + public static Map Import(string filename) + { + var converter = new LegacyMapImporter(filename); + return converter.Map; + } + + 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)); + var basic = file.GetSection("Basic"); + var map = file.GetSection("Map"); + var legacyMapFormat = (IniMapFormat)int.Parse(basic.GetValue("NewINIFormat", "0")); + var XOffset = int.Parse(map.GetValue("X", "0")); + var YOffset = int.Parse(map.GetValue("Y", "0")); + var Width = int.Parse(map.GetValue("Width", "0")); + var Height = int.Parse(map.GetValue("Height", "0")); + MapSize = (legacyMapFormat == IniMapFormat.RedAlert) ? 128 : 64; + + Map.Title = basic.GetValue("Name", "(null)"); + Map.Author = "Westwood Studios"; + Map.Tileset = Truncate(map.GetValue("Theater", "TEMPERAT"), 8); + Map.MapSize.X = MapSize; + Map.MapSize.Y = MapSize; + Map.TopLeft = new int2(XOffset, YOffset); + Map.BottomRight = new int2(XOffset + Width, YOffset + Height); + Map.Selectable = true; + + if (legacyMapFormat == IniMapFormat.RedAlert) + { + 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"); + LoadActors(file, "UNITS"); + LoadActors(file, "INFANTRY"); + LoadSmudges(file, "SMUDGE"); + + var wp = file.GetSection("Waypoints") + .Where(kv => int.Parse(kv.Value) > 0) + .Select(kv => Pair.New(int.Parse(kv.Key), + LocationFromMapOffset(int.Parse(kv.Value), MapSize))) + .Where(a => a.First < 8) + .ToArray(); + + Map.PlayerCount = wp.Count(); + + foreach (var kv in wp) + Map.Waypoints.Add("spawn" + kv.First, kv.Second); + } + + static int2 LocationFromMapOffset(int offset, int mapSize) + { + return new int2(offset % mapSize, offset / mapSize); + } + + static MemoryStream ReadPackedSection(IniSection mapPackSection) + { + StringBuilder sb = new StringBuilder(); + for (int i = 1; ; i++) + { + string line = mapPackSection.GetValue(i.ToString(), null); + if (line == null) + break; + + sb.Append(line.Trim()); + } + + byte[] data = Convert.FromBase64String(sb.ToString()); + List chunks = new List(); + BinaryReader reader = new BinaryReader(new MemoryStream(data)); + + try + { + while (true) + { + uint length = reader.ReadUInt32() & 0xdfffffff; + byte[] dest = new byte[8192]; + byte[] src = reader.ReadBytes((int)length); + + /*int actualLength =*/ + Format80.DecodeInto(src, dest); + + chunks.Add(dest); + } + } + catch (EndOfStreamException) { } + + MemoryStream ms = new MemoryStream(); + foreach (byte[] chunk in chunks) + ms.Write(chunk, 0, chunk.Length); + + ms.Position = 0; + + return ms; + } + + static byte ReadByte(Stream s) + { + int ret = s.ReadByte(); + if (ret == -1) + throw new NotImplementedException(); + return (byte)ret; + } + + static ushort ReadWord(Stream s) + { + ushort ret = ReadByte(s); + ret |= (ushort)(ReadByte(s) << 8); + + return ret; + } + + void UnpackRATileData(MemoryStream ms) + { + Map.MapTiles = new TileReference[MapSize, MapSize]; + for (int i = 0; i < MapSize; i++) + for (int j = 0; j < MapSize; j++) + Map.MapTiles[i, j] = new TileReference(); + + for (int j = 0; j < MapSize; j++) + for (int i = 0; i < MapSize; i++) + Map.MapTiles[i, j].type = ReadWord(ms); + + for (int j = 0; j < MapSize; j++) + for (int i = 0; i < MapSize; i++) + { + Map.MapTiles[i, j].index = ReadByte(ms); + if (Map.MapTiles[i, j].type == 0xff || Map.MapTiles[i, j].type == 0xffff) + Map.MapTiles[i, j].index = byte.MaxValue; + } + } + + void UnpackRAOverlayData(MemoryStream ms) + { + Map.MapResources = new TileReference[MapSize, MapSize]; + for (int j = 0; j < MapSize; j++) + for (int i = 0; i < MapSize; i++) + { + byte o = ReadByte(ms); + var res = Pair.New((byte)0, (byte)0); + + if (o != 255 && overlayResourceMapping.ContainsKey(raOverlayNames[o])) + res = overlayResourceMapping[raOverlayNames[o]]; + + Map.MapResources[i, j] = new TileReference(res.First, res.Second); + + if (o != 255 && overlayActorMapping.ContainsKey(raOverlayNames[o])) + Map.Actors.Add("Actor" + ActorCount, new ActorReference("Actor" + ActorCount++, overlayActorMapping[raOverlayNames[o]], new int2(i, j), "Neutral")); + } + } + + void ReadRATrees(IniFile file) + { + IniSection terrain = file.GetSection("TERRAIN", true); + if (terrain == null) + return; + + foreach (KeyValuePair kv in terrain) + { + var loc = int.Parse(kv.Key); + Map.Actors.Add("Actor" + ActorCount, new ActorReference("Actor" + ActorCount++, kv.Value.ToLowerInvariant(), new int2(loc % MapSize, loc / MapSize), "Neutral")); + } + } + + void UnpackCncTileData(Stream ms) + { + Map.MapTiles = new TileReference[MapSize, MapSize]; + for (int i = 0; i < MapSize; i++) + for (int j = 0; j < MapSize; j++) + Map.MapTiles[i, j] = new TileReference(); + + for (int j = 0; j < MapSize; j++) + for (int i = 0; i < MapSize; i++) + { + Map.MapTiles[i, j].type = ReadByte(ms); + Map.MapTiles[i, j].index = ReadByte(ms); + + if (Map.MapTiles[i, j].type == 0xff) + Map.MapTiles[i, j].index = byte.MaxValue; + } + } + + void ReadCncOverlay(IniFile file) + { + IniSection overlay = file.GetSection("OVERLAY", true); + if (overlay == null) + return; + + Map.MapResources = new TileReference[MapSize, MapSize]; + foreach (KeyValuePair kv in overlay) + { + var loc = int.Parse(kv.Key); + int2 cell = new int2(loc % MapSize, loc / MapSize); + + var res = Pair.New((byte)0, (byte)0); + if (overlayResourceMapping.ContainsKey(kv.Value.ToLower())) + res = overlayResourceMapping[kv.Value.ToLower()]; + + Map.MapResources[cell.X, cell.Y] = new TileReference(res.First, res.Second); + + if (overlayActorMapping.ContainsKey(kv.Value.ToLower())) + Map.Actors.Add("Actor" + ActorCount, new ActorReference("Actor" + ActorCount++, overlayActorMapping[kv.Value.ToLower()], new int2(cell.X, cell.Y), "Neutral")); + } + } + + void ReadCncTrees(IniFile file) + { + IniSection terrain = file.GetSection("TERRAIN", true); + if (terrain == null) + return; + + foreach (KeyValuePair kv in terrain) + { + var loc = int.Parse(kv.Key); + Map.Actors.Add("Actor" + ActorCount, new ActorReference("Actor" + ActorCount++, kv.Value.Split(',')[0].ToLowerInvariant(), new int2(loc % MapSize, loc / MapSize), "Neutral")); + } + } + + void LoadActors(IniFile file, string section) + { + foreach (var s in file.GetSection(section, true)) + { + //num=owner,type,health,location,facing,... + var parts = s.Value.Split(','); + var loc = int.Parse(parts[3]); + if (parts[0] == "") + parts[0] = "Neutral"; + Map.Actors.Add("Actor" + ActorCount, new ActorReference("Actor" + ActorCount++, parts[1].ToLowerInvariant(), new int2(loc % MapSize, loc / MapSize), parts[0])); + } + } + + void LoadSmudges(IniFile file, string section) + { + foreach (var s in file.GetSection(section, true)) + { + //loc=type,loc,depth + var parts = s.Value.Split(','); + var loc = int.Parse(parts[1]); + Map.Smudges.Add(new SmudgeReference(parts[0].ToLowerInvariant(), new int2(loc % MapSize, loc / MapSize), int.Parse(parts[2]))); + } + } + + static string Truncate(string s, int maxLength) + { + return s.Length <= maxLength ? s : s.Substring(0, maxLength); + } + } +} diff --git a/OpenRA.Editor/OpenRA.Editor.csproj b/OpenRA.Editor/OpenRA.Editor.csproj index 9a7a471f48..d8c5a80068 100644 --- a/OpenRA.Editor/OpenRA.Editor.csproj +++ b/OpenRA.Editor/OpenRA.Editor.csproj @@ -58,6 +58,7 @@ Form1.cs + Form diff --git a/OpenRA.Editor/Program.cs b/OpenRA.Editor/Program.cs index 13bc5b2248..bd8b93799f 100644 --- a/OpenRA.Editor/Program.cs +++ b/OpenRA.Editor/Program.cs @@ -22,6 +22,7 @@ namespace OpenRA.Editor Application.CurrentCulture = CultureInfo.InvariantCulture; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1(args)); } } diff --git a/OpenRA.Editor/Surface.cs b/OpenRA.Editor/Surface.cs index 18ef2ba640..9244917fb4 100644 --- a/OpenRA.Editor/Surface.cs +++ b/OpenRA.Editor/Surface.cs @@ -15,6 +15,8 @@ using System.Linq; using System.Windows.Forms; using OpenRA.FileFormats; using OpenRA.Thirdparty; +using System; +using System.Diagnostics; namespace OpenRA.Editor { @@ -252,7 +254,7 @@ namespace OpenRA.Editor Map.Actors[id] = new ActorReference(id,Actor.Info.Name.ToLowerInvariant(), GetBrushLocation(), owner); } - Random r = new Random(); + System.Random r = new System.Random(); void DrawWithResource() { Map.MapResources[GetBrushLocation().X, GetBrushLocation().Y] @@ -288,10 +290,11 @@ namespace OpenRA.Editor Bitmap RenderChunk(int u, int v) { + var bitmap = new Bitmap(ChunkSize * 24, ChunkSize * 24); bitmap.SetPixel(0, 0, Color.Green); - var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), + var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); unsafe @@ -308,7 +311,7 @@ namespace OpenRA.Editor var rawImage = tile.TileBitmapBytes[index]; for (var x = 0; x < 24; x++) for (var y = 0; y < 24; y++) - p[ (j * 24 + y) * stride + i * 24 + x ] = Palette.GetColor(rawImage[x + 24 * y]).ToArgb(); + p[(j * 24 + y) * stride + i * 24 + x] = Palette.GetColor(rawImage[x + 24 * y]).ToArgb(); if (Map.MapResources[u * ChunkSize + i, v * ChunkSize + j].type != 0) { diff --git a/mods/ra/maps/central-conflict/map.bin b/mods/ra/maps/central-conflict/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..3a0c8ccd39f9d16325ab539af0661639ae0abc18 GIT binary patch literal 81925 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 literal 0 HcmV?d00001 diff --git a/mods/ra/maps/central-conflict/map.uid b/mods/ra/maps/central-conflict/map.uid new file mode 100644 index 0000000000..b2ee3b67eb --- /dev/null +++ b/mods/ra/maps/central-conflict/map.uid @@ -0,0 +1 @@ +7063c02f2b8930b9556b1cc9013659500d5bc03c \ No newline at end of file diff --git a/mods/ra/maps/central-conflict/map.yaml b/mods/ra/maps/central-conflict/map.yaml new file mode 100644 index 0000000000..1d8dc573b1 --- /dev/null +++ b/mods/ra/maps/central-conflict/map.yaml @@ -0,0 +1,518 @@ +Selectable: True + +MapFormat: 2 + +Title: Central Conflict + +Description: + +Author: Westwood Studios + +PlayerCount: 8 + +Tileset: TEMPERAT + +MapSize: 128,128 + +TopLeft: 16,16 + +BottomRight: 112,112 + +Players: + +Actors: + ActorReference@Actor0: + Id: Actor0 + Type: tc05 + Location: 73,64 + Owner: Neutral + ActorReference@Actor1: + Id: Actor1 + Type: tc05 + Location: 59,60 + Owner: Neutral + ActorReference@Actor2: + Id: Actor2 + Type: t01 + Location: 63,61 + Owner: Neutral + ActorReference@Actor3: + Id: Actor3 + Type: t01 + Location: 62,61 + Owner: Neutral + ActorReference@Actor4: + Id: Actor4 + Type: t02 + Location: 66,61 + Owner: Neutral + ActorReference@Actor5: + Id: Actor5 + Type: tc05 + Location: 67,61 + Owner: Neutral + ActorReference@Actor6: + Id: Actor6 + Type: tc05 + Location: 64,48 + Owner: Neutral + ActorReference@Actor7: + Id: Actor7 + Type: tc03 + Location: 58,50 + Owner: Neutral + ActorReference@Actor8: + Id: Actor8 + Type: tc02 + Location: 64,51 + Owner: Neutral + ActorReference@Actor9: + Id: Actor9 + Type: tc02 + Location: 28,21 + Owner: Neutral + ActorReference@Actor10: + Id: Actor10 + Type: tc02 + Location: 28,26 + Owner: Neutral + ActorReference@Actor11: + Id: Actor11 + Type: tc02 + Location: 26,25 + Owner: Neutral + ActorReference@Actor12: + Id: Actor12 + Type: tc03 + Location: 39,22 + Owner: Neutral + ActorReference@Actor13: + Id: Actor13 + Type: tc05 + Location: 40,25 + Owner: Neutral + ActorReference@Actor14: + Id: Actor14 + Type: t01 + Location: 66,28 + Owner: Neutral + ActorReference@Actor15: + Id: Actor15 + Type: t01 + Location: 77,29 + Owner: Neutral + ActorReference@Actor16: + Id: Actor16 + Type: t01 + Location: 77,32 + Owner: Neutral + ActorReference@Actor17: + Id: Actor17 + Type: t02 + Location: 80,31 + Owner: Neutral + ActorReference@Actor18: + Id: Actor18 + Type: tc05 + Location: 83,31 + Owner: Neutral + ActorReference@Actor19: + Id: Actor19 + Type: tc05 + Location: 91,38 + Owner: Neutral + ActorReference@Actor20: + Id: Actor20 + Type: t08 + Location: 90,42 + Owner: Neutral + ActorReference@Actor21: + Id: Actor21 + Type: t08 + Location: 81,37 + Owner: Neutral + ActorReference@Actor22: + Id: Actor22 + Type: t10 + Location: 104,49 + Owner: Neutral + ActorReference@Actor23: + Id: Actor23 + Type: t12 + Location: 103,47 + Owner: Neutral + ActorReference@Actor24: + Id: Actor24 + Type: t12 + Location: 98,48 + Owner: Neutral + ActorReference@Actor25: + Id: Actor25 + Type: t12 + Location: 55,65 + Owner: Neutral + ActorReference@Actor26: + Id: Actor26 + Type: t14 + Location: 50,82 + Owner: Neutral + ActorReference@Actor27: + Id: Actor27 + Type: t01 + Location: 68,93 + Owner: Neutral + ActorReference@Actor28: + Id: Actor28 + Type: tc02 + Location: 64,107 + Owner: Neutral + ActorReference@Actor29: + Id: Actor29 + Type: tc01 + Location: 60,102 + Owner: Neutral + ActorReference@Actor30: + Id: Actor30 + Type: t17 + Location: 60,106 + Owner: Neutral + ActorReference@Actor31: + Id: Actor31 + Type: tc01 + Location: 82,97 + Owner: Neutral + ActorReference@Actor32: + Id: Actor32 + Type: tc02 + Location: 81,102 + Owner: Neutral + ActorReference@Actor33: + Id: Actor33 + Type: t02 + Location: 73,97 + Owner: Neutral + ActorReference@Actor34: + Id: Actor34 + Type: tc03 + Location: 104,100 + Owner: Neutral + ActorReference@Actor35: + Id: Actor35 + Type: tc05 + Location: 109,109 + Owner: Neutral + ActorReference@Actor36: + Id: Actor36 + Type: tc04 + Location: 103,109 + Owner: Neutral + ActorReference@Actor37: + Id: Actor37 + Type: t01 + Location: 47,99 + Owner: Neutral + ActorReference@Actor38: + Id: Actor38 + Type: tc04 + Location: 39,99 + Owner: Neutral + ActorReference@Actor39: + Id: Actor39 + Type: tc01 + Location: 33,86 + Owner: Neutral + ActorReference@Actor40: + Id: Actor40 + Type: tc01 + Location: 35,88 + Owner: Neutral + ActorReference@Actor41: + Id: Actor41 + Type: tc05 + Location: 45,82 + Owner: Neutral + ActorReference@Actor42: + Id: Actor42 + Type: tc03 + Location: 44,84 + Owner: Neutral + ActorReference@Actor43: + Id: Actor43 + Type: tc04 + Location: 27,71 + Owner: Neutral + ActorReference@Actor44: + Id: Actor44 + Type: tc05 + Location: 27,57 + Owner: Neutral + ActorReference@Actor45: + Id: Actor45 + Type: t01 + Location: 37,62 + Owner: Neutral + ActorReference@Actor46: + Id: Actor46 + Type: t03 + Location: 32,57 + Owner: Neutral + ActorReference@Actor47: + Id: Actor47 + Type: t06 + Location: 27,44 + Owner: Neutral + ActorReference@Actor48: + Id: Actor48 + Type: t06 + Location: 29,47 + Owner: Neutral + ActorReference@Actor49: + Id: Actor49 + Type: t06 + Location: 25,47 + Owner: Neutral + ActorReference@Actor50: + Id: Actor50 + Type: t08 + Location: 47,52 + Owner: Neutral + ActorReference@Actor51: + Id: Actor51 + Type: t10 + Location: 50,51 + Owner: Neutral + ActorReference@Actor52: + Id: Actor52 + Type: tc05 + Location: 49,48 + Owner: Neutral + ActorReference@Actor53: + Id: Actor53 + Type: t01 + Location: 54,42 + Owner: Neutral + ActorReference@Actor54: + Id: Actor54 + Type: t05 + Location: 53,39 + Owner: Neutral + ActorReference@Actor55: + Id: Actor55 + Type: tc05 + Location: 35,40 + Owner: Neutral + ActorReference@Actor56: + Id: Actor56 + Type: t01 + Location: 37,36 + Owner: Neutral + ActorReference@Actor57: + Id: Actor57 + Type: t01 + Location: 36,25 + Owner: Neutral + ActorReference@Actor58: + Id: Actor58 + Type: t01 + Location: 89,68 + Owner: Neutral + ActorReference@Actor59: + Id: Actor59 + Type: t02 + Location: 96,70 + Owner: Neutral + ActorReference@Actor60: + Id: Actor60 + Type: tc05 + Location: 101,69 + Owner: Neutral + ActorReference@Actor61: + Id: Actor61 + Type: tc05 + Location: 94,80 + Owner: Neutral + ActorReference@Actor62: + Id: Actor62 + Type: t01 + Location: 92,88 + Owner: Neutral + ActorReference@Actor63: + Id: Actor63 + Type: t02 + Location: 93,89 + Owner: Neutral + ActorReference@Actor64: + Id: Actor64 + Type: t02 + Location: 16,16 + Owner: Neutral + ActorReference@Actor65: + Id: Actor65 + Type: t05 + Location: 60,27 + Owner: Neutral + ActorReference@Actor66: + Id: Actor66 + Type: t05 + Location: 48,27 + Owner: Neutral + ActorReference@Actor67: + Id: Actor67 + Type: tc05 + Location: 99,31 + Owner: Neutral + ActorReference@Actor68: + Id: Actor68 + Type: tc05 + Location: 92,26 + Owner: Neutral + ActorReference@Actor69: + Id: Actor69 + Type: tc05 + Location: 78,75 + Owner: Neutral + ActorReference@Actor70: + Id: Actor70 + Type: tc04 + Location: 62,93 + Owner: Neutral + ActorReference@Actor71: + Id: Actor71 + Type: tc01 + Location: 67,90 + Owner: Neutral + ActorReference@Actor72: + Id: Actor72 + Type: tc04 + Location: 24,24 + Owner: Neutral + ActorReference@Actor73: + Id: Actor73 + Type: tc05 + Location: 88,58 + Owner: Neutral + ActorReference@Actor74: + Id: Actor74 + Type: tc05 + Location: 99,102 + Owner: Neutral + ActorReference@Actor75: + Id: Actor75 + Type: tc04 + Location: 25,100 + Owner: Neutral + ActorReference@Actor76: + Id: Actor76 + Type: tc03 + Location: 48,103 + Owner: Neutral + ActorReference@Actor77: + Id: Actor77 + Type: tc02 + Location: 48,94 + Owner: Neutral + ActorReference@Actor78: + Id: Actor78 + Type: tc01 + Location: 71,31 + Owner: Neutral + ActorReference@Actor79: + Id: Actor79 + Type: t17 + Location: 70,31 + Owner: Neutral + ActorReference@Actor80: + Id: Actor80 + Type: tc02 + Location: 73,32 + Owner: Neutral + ActorReference@Actor81: + Id: Actor81 + Type: mine + Location: 46,22 + Owner: Neutral + ActorReference@Actor82: + Id: Actor82 + Type: mine + Location: 73,27 + Owner: Neutral + ActorReference@Actor83: + Id: Actor83 + Type: mine + Location: 36,45 + Owner: Neutral + ActorReference@Actor84: + Id: Actor84 + Type: mine + Location: 33,77 + Owner: Neutral + ActorReference@Actor85: + Id: Actor85 + Type: mine + Location: 104,82 + Owner: Neutral + ActorReference@Actor86: + Id: Actor86 + Type: mine + Location: 109,104 + Owner: Neutral + ActorReference@Actor87: + Id: Actor87 + Type: mine + Location: 18,109 + Owner: Neutral + ActorReference@Actor88: + Id: Actor88 + Type: mine + Location: 58,61 + Owner: Neutral + ActorReference@Actor89: + Id: Actor89 + Type: mine + Location: 78,65 + Owner: Neutral + ActorReference@Actor90: + Id: Actor90 + Type: mine + Location: 82,76 + Owner: Neutral + ActorReference@Actor91: + Id: Actor91 + Type: mine + Location: 76,89 + Owner: Neutral + ActorReference@Actor92: + Id: Actor92 + Type: mine + Location: 53,91 + Owner: Neutral + ActorReference@Actor93: + Id: Actor93 + Type: mine + Location: 50,74 + Owner: Neutral + ActorReference@Actor94: + Id: Actor94 + Type: mine + Location: 101,26 + Owner: Neutral + ActorReference@Actor95: + Id: Actor95 + Type: mine + Location: 95,34 + Owner: Neutral + +Waypoints: + spawn0: 20,36 + spawn1: 108,92 + spawn2: 34,104 + spawn3: 105,20 + spawn4: 57,19 + spawn5: 75,108 + spawn6: 19,71 + spawn7: 104,60 + +Smudges: + +Rules: + diff --git a/mods/ra/maps/marooned/map.bin b/mods/ra/maps/marooned/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..30610cb7756258ac17280056c6d84e04d9f96f2b GIT binary patch literal 81925 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