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 0000000000..3a0c8ccd39
Binary files /dev/null and b/mods/ra/maps/central-conflict/map.bin differ
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 0000000000..30610cb775
Binary files /dev/null and b/mods/ra/maps/marooned/map.bin differ
diff --git a/mods/ra/maps/marooned/map.uid b/mods/ra/maps/marooned/map.uid
new file mode 100644
index 0000000000..402e44a251
--- /dev/null
+++ b/mods/ra/maps/marooned/map.uid
@@ -0,0 +1 @@
+b36b36596bc0ad9300247436d15c37749d5842de
\ No newline at end of file
diff --git a/mods/ra/maps/marooned/map.yaml b/mods/ra/maps/marooned/map.yaml
new file mode 100644
index 0000000000..9871158706
--- /dev/null
+++ b/mods/ra/maps/marooned/map.yaml
@@ -0,0 +1,386 @@
+Selectable: True
+
+MapFormat: 2
+
+Title: Marooned II
+
+Description:
+
+Author: Westwood Studios
+
+PlayerCount: 6
+
+Tileset: TEMPERAT
+
+MapSize: 128,128
+
+TopLeft: 16,16
+
+BottomRight: 112,112
+
+Players:
+
+Actors:
+ ActorReference@Actor0:
+ Id: Actor0
+ Type: mine
+ Location: 63,74
+ Owner: Neutral
+ ActorReference@Actor1:
+ Id: Actor1
+ Type: mine
+ Location: 92,30
+ Owner: Neutral
+ ActorReference@Actor2:
+ Id: Actor2
+ Type: mine
+ Location: 81,25
+ Owner: Neutral
+ ActorReference@Actor3:
+ Id: Actor3
+ Type: mine
+ Location: 43,28
+ Owner: Neutral
+ ActorReference@Actor4:
+ Id: Actor4
+ Type: mine
+ Location: 40,72
+ Owner: Neutral
+ ActorReference@Actor5:
+ Id: Actor5
+ Type: mine
+ Location: 97,76
+ Owner: Neutral
+ ActorReference@Actor6:
+ Id: Actor6
+ Type: mine
+ Location: 26,63
+ Owner: Neutral
+ ActorReference@Actor7:
+ Id: Actor7
+ Type: mine
+ Location: 50,46
+ Owner: Neutral
+ ActorReference@Actor8:
+ Id: Actor8
+ Type: mine
+ Location: 64,90
+ Owner: Neutral
+ ActorReference@Actor9:
+ Id: Actor9
+ Type: mine
+ Location: 44,99
+ Owner: Neutral
+ ActorReference@Actor10:
+ Id: Actor10
+ Type: tc04
+ Location: 80,78
+ Owner: Neutral
+ ActorReference@Actor11:
+ Id: Actor11
+ Type: tc03
+ Location: 78,85
+ Owner: Neutral
+ ActorReference@Actor12:
+ Id: Actor12
+ Type: tc01
+ Location: 83,87
+ Owner: Neutral
+ ActorReference@Actor13:
+ Id: Actor13
+ Type: t17
+ Location: 66,88
+ Owner: Neutral
+ ActorReference@Actor14:
+ Id: Actor14
+ Type: t16
+ Location: 57,79
+ Owner: Neutral
+ ActorReference@Actor15:
+ Id: Actor15
+ Type: t15
+ Location: 60,69
+ Owner: Neutral
+ ActorReference@Actor16:
+ Id: Actor16
+ Type: t14
+ Location: 65,80
+ Owner: Neutral
+ ActorReference@Actor17:
+ Id: Actor17
+ Type: t13
+ Location: 62,92
+ Owner: Neutral
+ ActorReference@Actor18:
+ Id: Actor18
+ Type: t11
+ Location: 85,101
+ Owner: Neutral
+ ActorReference@Actor19:
+ Id: Actor19
+ Type: t08
+ Location: 87,100
+ Owner: Neutral
+ ActorReference@Actor20:
+ Id: Actor20
+ Type: t08
+ Location: 97,40
+ Owner: Neutral
+ ActorReference@Actor21:
+ Id: Actor21
+ Type: t11
+ Location: 98,39
+ Owner: Neutral
+ ActorReference@Actor22:
+ Id: Actor22
+ Type: t08
+ Location: 100,41
+ Owner: Neutral
+ ActorReference@Actor23:
+ Id: Actor23
+ Type: t07
+ Location: 96,35
+ Owner: Neutral
+ ActorReference@Actor24:
+ Id: Actor24
+ Type: t06
+ Location: 85,37
+ Owner: Neutral
+ ActorReference@Actor25:
+ Id: Actor25
+ Type: t02
+ Location: 83,47
+ Owner: Neutral
+ ActorReference@Actor26:
+ Id: Actor26
+ Type: t01
+ Location: 54,33
+ Owner: Neutral
+ ActorReference@Actor27:
+ Id: Actor27
+ Type: t03
+ Location: 43,47
+ Owner: Neutral
+ ActorReference@Actor28:
+ Id: Actor28
+ Type: tc02
+ Location: 51,28
+ Owner: Neutral
+ ActorReference@Actor29:
+ Id: Actor29
+ Type: tc01
+ Location: 37,25
+ Owner: Neutral
+ ActorReference@Actor30:
+ Id: Actor30
+ Type: t17
+ Location: 31,26
+ Owner: Neutral
+ ActorReference@Actor31:
+ Id: Actor31
+ Type: t15
+ Location: 32,65
+ Owner: Neutral
+ ActorReference@Actor32:
+ Id: Actor32
+ Type: t14
+ Location: 37,64
+ Owner: Neutral
+ ActorReference@Actor33:
+ Id: Actor33
+ Type: t13
+ Location: 62,83
+ Owner: Neutral
+ ActorReference@Actor34:
+ Id: Actor34
+ Type: t11
+ Location: 90,70
+ Owner: Neutral
+ ActorReference@Actor35:
+ Id: Actor35
+ Type: t10
+ Location: 74,65
+ Owner: Neutral
+ ActorReference@Actor36:
+ Id: Actor36
+ Type: tc01
+ Location: 81,21
+ Owner: Neutral
+ ActorReference@Actor37:
+ Id: Actor37
+ Type: t17
+ Location: 96,27
+ Owner: Neutral
+ ActorReference@Actor38:
+ Id: Actor38
+ Type: tc05
+ Location: 45,55
+ Owner: Neutral
+ ActorReference@Actor39:
+ Id: Actor39
+ Type: tc04
+ Location: 35,58
+ Owner: Neutral
+ ActorReference@Actor40:
+ Id: Actor40
+ Type: t16
+ Location: 46,61
+ Owner: Neutral
+ ActorReference@Actor41:
+ Id: Actor41
+ Type: t13
+ Location: 45,50
+ Owner: Neutral
+ ActorReference@Actor42:
+ Id: Actor42
+ Type: t12
+ Location: 43,39
+ Owner: Neutral
+ ActorReference@Actor43:
+ Id: Actor43
+ Type: tc02
+ Location: 68,36
+ Owner: Neutral
+ ActorReference@Actor44:
+ Id: Actor44
+ Type: t07
+ Location: 72,72
+ Owner: Neutral
+ ActorReference@Actor45:
+ Id: Actor45
+ Type: t06
+ Location: 42,58
+ Owner: Neutral
+ ActorReference@Actor46:
+ Id: Actor46
+ Type: t06
+ Location: 22,63
+ Owner: Neutral
+ ActorReference@Actor47:
+ Id: Actor47
+ Type: t10
+ Location: 22,56
+ Owner: Neutral
+ ActorReference@Actor48:
+ Id: Actor48
+ Type: t08
+ Location: 34,82
+ Owner: Neutral
+ ActorReference@Actor49:
+ Id: Actor49
+ Type: tc04
+ Location: 54,101
+ Owner: Neutral
+ ActorReference@Actor50:
+ Id: Actor50
+ Type: tc01
+ Location: 61,47
+ Owner: Neutral
+ ActorReference@Actor51:
+ Id: Actor51
+ Type: t17
+ Location: 57,32
+ Owner: Neutral
+ ActorReference@Actor52:
+ Id: Actor52
+ Type: tc01
+ Location: 81,36
+ Owner: Neutral
+ ActorReference@Actor53:
+ Id: Actor53
+ Type: t16
+ Location: 87,52
+ Owner: Neutral
+ ActorReference@Actor54:
+ Id: Actor54
+ Type: t16
+ Location: 102,48
+ Owner: Neutral
+ ActorReference@Actor55:
+ Id: Actor55
+ Type: t15
+ Location: 94,60
+ Owner: Neutral
+ ActorReference@Actor56:
+ Id: Actor56
+ Type: tc02
+ Location: 103,76
+ Owner: Neutral
+ ActorReference@Actor57:
+ Id: Actor57
+ Type: t16
+ Location: 96,85
+ Owner: Neutral
+ ActorReference@Actor58:
+ Id: Actor58
+ Type: tc04
+ Location: 95,84
+ Owner: Neutral
+ ActorReference@Actor59:
+ Id: Actor59
+ Type: tc05
+ Location: 86,39
+ Owner: Neutral
+ ActorReference@Actor60:
+ Id: Actor60
+ Type: tc04
+ Location: 49,21
+ Owner: Neutral
+ ActorReference@Actor61:
+ Id: Actor61
+ Type: tc01
+ Location: 45,40
+ Owner: Neutral
+ ActorReference@Actor62:
+ Id: Actor62
+ Type: t16
+ Location: 27,52
+ Owner: Neutral
+ ActorReference@Actor63:
+ Id: Actor63
+ Type: tc02
+ Location: 72,103
+ Owner: Neutral
+ ActorReference@Actor64:
+ Id: Actor64
+ Type: t16
+ Location: 81,102
+ Owner: Neutral
+ ActorReference@Actor65:
+ Id: Actor65
+ Type: t17
+ Location: 78,57
+ Owner: Neutral
+ ActorReference@Actor66:
+ Id: Actor66
+ Type: tc01
+ Location: 37,75
+ Owner: Neutral
+ ActorReference@Actor67:
+ Id: Actor67
+ Type: tc01
+ Location: 61,41
+ Owner: Neutral
+ ActorReference@Actor68:
+ Id: Actor68
+ Type: t16
+ Location: 79,42
+ Owner: Neutral
+ ActorReference@Actor69:
+ Id: Actor69
+ Type: tc04
+ Location: 98,56
+ Owner: Neutral
+
+Waypoints:
+ spawn0: 94,47
+ spawn1: 81,94
+ spawn2: 36,42
+ spawn3: 35,92
+ spawn4: 64,27
+ spawn5: 80,72
+
+Smudges:
+
+Rules:
+