Bunch of stuff related to the map hash-indicators

* Made techno occupancy into its own separate option.
* Added settings for all hashing colours
* Enabled terrain type hash-indicators on map template tool and placement previews.
* Fixed the fact the hash graphics used on the Map tool preview was a generated image in classic mode, instead of the "trans.icn" sprite.
* Added "lazy steam init" option to only initialise the link with Steam when the Publish dialog is opened.
* Updated readme to v1.5.1.0 options (I should REALLY learn to make separate branches, for that reason alone, ugh. Ah well, after this release.)
This commit is contained in:
Nyerguds 2024-06-26 22:18:38 +02:00
parent 9018335f2b
commit 1b8949fb79
18 changed files with 566 additions and 182 deletions

View File

@ -627,6 +627,7 @@ Released on 31 Jan 2023 at 20:50 GMT
Unreleased.
* Added .mix files to the supported formats to open, giving the ability to load official maps straight from the game's internal archives.
* The editor will now only connect to Steam if the Publish function is opened, making it possible to leave the editor open while testing maps in-game.
* Dropping a file into the editor that causes a dialog to be opened (like mix files and images) will no longer freeze the source you dragged the file from while the dialog in the editor is open.
* Removed theater restrictions on Terrain objects; if the object is found in the theater, it will be shown.
* Fixed bug that prevented the Red Alert civilian "C3" from loading, and that prevented the Einstein colour fix from working.
@ -637,7 +638,9 @@ Unreleased.
* Added a specific "PreviewScaleClassic" setting.
* Fixed Red Alert map load not giving feedback on the removal of Aircraft.
* Added an indicator on the Autocreate option on Teams if the Max Allowed setting is set to 0.
* Enabling map indicators will now show a different colour for each terrain type, and green indications on cells occupied by objects on the map.
* Enabling map terrain type indicators will now show a different colour for each terrain type, editable per type in the settings file.
* The placement previews for map templates will now always show the terrain types. This indication will be less pronounced when the map terrain type indicators option is disabled.
* Added extra indicators (shortcut: F4) for cells occupied by objects on the map.
* Added outlines for overlapped buildings.
* Implemented a new scaling method that should vastly reduce saving times of multiplayer map thumbnails and image exports.
* Fixed issue that caused any unknown video names configured on TD missions to be marked as "Remaster only".
@ -650,3 +653,4 @@ Unreleased.
* Added checks on Events in Red Alert triggers that crash the game if no House is set on the trigger itself.
* Fixed RA checks on buildings overlapping non-buildings.
* Fixed the fact RA mission rules were only applied after the map was populated, which could make buildings disappear from overlapping with bibs that were actually disabled in the rules.
* Fixed classic mode not using the classic hash pattern tile to draw the terrain type indicators on the map tiles tool window.

View File

@ -31,6 +31,9 @@
<setting name="ClassicProducesNoMetaFiles" serializeAs="String">
<value>False</value>
</setting>
<setting name="LazyInitSteam" serializeAs="String">
<value>True</value>
</setting>
<setting name="EditorLanguage" serializeAs="String">
<value>Auto</value>
</setting>
@ -82,16 +85,7 @@
<setting name="RememberToolData" serializeAs="String">
<value>False</value>
</setting>
<setting name="TerrainTypesShowObjects" serializeAs="String">
<value>True</value>
</setting>
<setting name="MapGridColor" serializeAs="String">
<value>40, 0, 0, 255</value>
</setting>
<setting name="MapBackColor" serializeAs="String">
<value>32, 32, 32</value>
</setting>
<setting name="MapScale" serializeAs="String">
<setting name="MapScale" serializeAs="String">
<value>0.5</value>
</setting>
<setting name="MapScaleClassic" serializeAs="String">
@ -118,6 +112,39 @@
<setting name="MinimumClampSize" serializeAs="String">
<value>30, 30</value>
</setting>
<setting name="MapBackColor" serializeAs="String">
<value>32, 32, 32</value>
</setting>
<setting name="MapGridColor" serializeAs="String">
<value>40, 0, 0, 255</value>
</setting>
<setting name="HashColorTechnoPart" serializeAs="String">
<value>0, 170, 0</value>
</setting>
<setting name="HashColorTechnoFull" serializeAs="String">
<value>0, 255, 0</value>
</setting>
<setting name="HashColorLandClear" serializeAs="String">
<value>0, 255, 255, 255</value>
</setting>
<setting name="HashColorLandBeach" serializeAs="String">
<value>255, 255, 85</value>
</setting>
<setting name="HashColorLandRock" serializeAs="String">
<value>170, 0, 0</value>
</setting>
<setting name="HashColorLandRoad" serializeAs="String">
<value>186, 128, 040</value>
</setting>
<setting name="HashColorLandWater" serializeAs="String">
<value>186, 186, 255</value>
</setting>
<setting name="HashColorLandRiver" serializeAs="String">
<value>0, 0, 255</value>
</setting>
<setting name="HashColorLandRough" serializeAs="String">
<value>186, 128, 186</value>
</setting>
<setting name="ReportMissionDetection" serializeAs="String">
<value>True</value>
</setting>

View File

@ -65,6 +65,7 @@ HasMixNesting=false
0=TheaterExt ; Any file with a theater extension; e.g. "cr1" -> "cr1.tem"
1=TheaterFile ; Main file for a theater, with the given part as extension, e.g. "pal" -> "temperat.pal"
2=Video320 ; 320x200 video, expanded to a vqa/vqp pair.
3=MixArchive ; Embedded mix file
; Type definitions.
@ -99,3 +100,8 @@ HasMixNesting=false
0Info=Video: {0}
1={0}.vqp
1Info=Video stretch table: {0}
; used for embedded mix files
[MixArchive]
0={0}.mix
0Info=Game archive: {0}

View File

@ -7,6 +7,7 @@
4=IconRa ; RA item which only has an icon but no basic shp file. This is used for superweapons and fake buildings.
5=VortexRa ; RA chrono vortex effect deformation tables.
6=ResourceRa ; RA resource sprite; iterates over all 4 numbers, on all theaters.
7=ImageRa ; fullscreen umages; CPS for DOS, PCX for RA95
[MissionRa]
; Standard campaigns. Just roughly going over 01-19, with only EA-EB-EC suffixes.
@ -70,6 +71,12 @@
0={0}[01-04].{3}
0Info=({1})
[ImageRa]
0={0}.cps
0Info={0} (DOS)
1={0}.pcx
1Info={0} (W95)
; Files for Red Alert
; Format is "NAME,TYPE=DESC".
; NAME: the filename part that becomes {0} in the type definition.
@ -80,26 +87,30 @@
; character long. The 'x' character is generally used as placeholder.
[FilesRA]
; Embedded mix files
allies.mix=Game archive: Allied voices
russian.mix=Game archive: Russian voices
conquer.mix=Game archive: game graphics
edhi.mix=Game archive: editor assets (W95)
edlo.mix=Game archive: editor assets (DOS)
general.mix=Game archive: Missions
movies1.mix=Game archive: Allied videos
movies2.mix=Game archive: Russian videos
scores.mix=Game archive: music
sounds.mix=Game archive: sounds
editor.mix=Game archive: editor assets
local.mix=Game archive: game resources
lores.mix=Game archive: DOS assets
lores1.mix=Game archive: DOS assets (expansion)
hires.mix=Game archive: W95 assets
hires1.mix=Game archive: W95 assets (expansion)
nchires.mix=Game archive: video stretch tables
speech.mix=Game archive: Computer speech
allies,MixArchive=Allied voices
russian,MixArchive=Russian voices
conquer,MixArchive=game graphics
edhi,MixArchive=editor assets (W95)
edlo,MixArchive=editor assets (DOS)
general,MixArchive=Missions
movies,MixArchive=Videos ; Used in 0.09c prerelease
movies1,MixArchive=Allied videos
movies2,MixArchive=Russian videos
scores,MixArchive=music
sounds,MixArchive=sounds
editor,MixArchive=editor assets
local,MixArchive=game resources
lores,MixArchive=DOS assets
lores1,MixArchive=DOS assets (expansion)
hires,MixArchive=W95 assets
hires1,MixArchive=W95 assets (expansion)
nchires,MixArchive=video stretch tables
speech,MixArchive=Computer speech
; Generates all theater mixfile names.
mix,TheaterFile={1} theater mix archive
; 0.09c prerelease version missions. Added before the full name generating so it'd have priority.
scg07wa.ini=Game Map (Campaign)
scu01eb.ini=E3 showcase map.
; Generates all mission names. The actual given filename is just the "sc" part; the rest is generated.
sc,MissionRa=Game Map
; Special files
@ -117,6 +128,16 @@ tutorial.ini=Text trigger lines
title.cps=DOS title screen
title.pcx=Win95 title screen
hole,VortexRa=Chrono vortex distortion table
; 0.09c prerelease images
credit1,ImageRa=Churchill class naval cruiser blueprints
credit2,ImageRa=Chronosphere
credit3,ImageRa=Ship half-wireframe
credit4,ImageRa=Allied logo background
credit5,ImageRa=Gap generator
credit6,ImageRa=Shipyard
credit7,ImageRa=Submarine underwater
credit8,ImageRa=Submarine in red sunset
credit9,ImageRa=V-2 launcher
; Map editor files
edtitle.cps=DOS Editor title screen (English)
edtitlef.cps=DOS Editor title screen (French)
@ -859,7 +880,22 @@ sizzle2,Video320=x
trailer,Video320=x
antintro,Video320=It Came From Red Alert
antend,Video320=Ant Queen's demise ; added ' to fix derped ini highlighting.
; beta videos / names?
; 0.09c prerelease videos
apache,Video320=Helicopters flying, seen from above.
shipyard,Video320=Shipyard building ship
un_flag,Video320=UN flag waving in the wind.
un_red,Video320=UN flag changing to USSR flag.
; 0.09c prerelease; only vqp files found.
acrop,Video320=x ; Probably the scene of the Acropolis getting bombed (news clip in an Allied briefing)
aghq,Video320=x ; Unknown
aghqnt,Video320=x ; Unknown
chronapr,Video320=x ; Chrono appear? Possibly the scene with two mammoth tanks (Soviet briefing)
chrondsp,Video320=x ; Chrono disappear? Possibly the Philadelphia Experiment scene (Allied briefing)
gdansk,Video320=x ; Unknown
nukefact,Video320=x ; Possibly the scene with a nuclear transport driving out of a hangar. (game intro)
sputnik,Video320=x ; Probably a full version of the Sputnik launch. (game intro, trailers)
; Other beta videos / names
onthprow,Video320=x
ants,Video320=It Came From Red Alert
gpslnch,Video320=GPS Satellite launched
; music
@ -1052,6 +1088,10 @@ smout1.aud=Thief: "Movin' out."
sokay1.aud=Thief: "Ok."
swhat1.aud=Thief: "What?"
saffirm1.aud=Thief: "Affirmative."
; 0.09c prerelease thief voices
scandy1.aud=Thief: "Like candy from a baby."
sclean1.aud=Thief: "Lets pick em clean."
ssteal1.aud=Thief: "Time for a little five-finger discount!"
dogg5p.aud=Strong dog growl
dogw3px.aud=Dog reporting
dogw5.aud=Dog whine
@ -1093,8 +1133,9 @@ jyes1.aud=Shock Trooper: "Yesssss!"
ackno,AudioVarRa="Acknowledged."
affirm1,AudioVarRa="Affirmative."
await1,AudioVarRa="Awaiting orders"
movout1,AudioVarRa="It is done." ; 0.09c prerelease
noprob,AudioVarRa="Of course."
overout,AudioVarRa="As you wish." (unused)
overout,AudioVarRa="As you wish." ; unused
ready,AudioVarRa="Ready and waiting."
report1,AudioVarRa="Reporting."
ritaway,AudioVarRa="At once."
@ -1184,6 +1225,13 @@ chrotnk1.aud=Chrono tank teleport
madchrg2.aud=MAD tank charges up
madexplo.aud=MAD tank explodes
shktrop1.aud=Shock Trooper fires
; 0.09c prerelease sounds
bridge3.aud=Bridge exploding
charge2.aud=Depth charge
chrono1.aud=Chronosphere charge sound
mrj7.aud=Mobile Radar Jammer sound effect
oretruk1.aud=Ore truck unloading
sattact2.aud=GPS satellite tactical reveal
; Map / score sound effects
appear1.aud=Map appear swoosh
beepy6.aud=Score screen beep sound

View File

@ -40,9 +40,19 @@ namespace MobiusEditor
// Fine tuning
ZoomToBoundsOnLoad = Properties.Settings.Default.ZoomToBoundsOnLoad;
RememberToolData = Properties.Settings.Default.RememberToolData;
IndicateMapObjects = Properties.Settings.Default.TerrainTypesShowObjects;
MapGridColor = Properties.Settings.Default.MapGridColor;
MapBackColor = Color.FromArgb(255, Properties.Settings.Default.MapBackColor);
HashColorTechnoPart = Properties.Settings.Default.HashColorTechnoPart;
HashColorTechnoFull = Properties.Settings.Default.HashColorTechnoFull;
HashColorLandClear = Properties.Settings.Default.HashColorLandClear;
HashColorLandBeach = Properties.Settings.Default.HashColorLandBeach;
HashColorLandRock = Properties.Settings.Default.HashColorLandRock;
HashColorLandRoad = Properties.Settings.Default.HashColorLandRoad;
HashColorLandWater = Properties.Settings.Default.HashColorLandWater;
HashColorLandRiver = Properties.Settings.Default.HashColorLandRiver;
HashColorLandRough = Properties.Settings.Default.HashColorLandRough;
UndoRedoStackSize = Properties.Settings.Default.UndoRedoStackSize;
MinimumClampSize = Properties.Settings.Default.MinimumClampSize;
// Behavior tweaks
@ -112,10 +122,19 @@ namespace MobiusEditor
public static bool ZoomToBoundsOnLoad { get; private set; }
public static bool RememberToolData { get; private set; }
public static bool IndicateMapObjects { get; private set; }
public static Color MapGridColor { get; private set; }
public static Color MapBackColor { get; private set; }
public static Color HashColorTechnoPart { get; private set; }
public static Color HashColorTechnoFull { get; private set; }
public static Color HashColorLandClear { get; private set; }
public static Color HashColorLandBeach { get; private set; }
public static Color HashColorLandRock { get; private set; }
public static Color HashColorLandRoad { get; private set; }
public static Color HashColorLandWater { get; private set; }
public static Color HashColorLandRiver { get; private set; }
public static Color HashColorLandRough { get; private set; }
private static double GetMinScale(){ return 1.0 / Math.Min(OriginalTileWidth, OriginalTileHeight); }
public static double MapTileScale => Math.Max(GetMinScale(), Math.Abs(UseClassicFiles ? Properties.Settings.Default.MapScaleClassic : Properties.Settings.Default.MapScale));
public static bool MapSmoothScale => (UseClassicFiles ? Properties.Settings.Default.MapScaleClassic : Properties.Settings.Default.MapScale) < 0;

View File

@ -107,7 +107,8 @@ namespace MobiusEditor
this.viewExtraIndicatorsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewExtraIndicatorsMapSymmetryMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewExtraIndicatorsMapGridMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewExtraIndicatorsMapPassabilityMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewExtraIndicatorsTerrainTypesMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewExtraIndicatorsPlacedObjectsMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewExtraIndicatorsEffectAreaRadiusMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.viewZoomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -132,6 +133,7 @@ namespace MobiusEditor
this.copyrightStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.mouseToolTip = new System.Windows.Forms.ToolTip(this.components);
this.mainToolStrip = new System.Windows.Forms.ToolStrip();
this.mapPanel = new MobiusEditor.Controls.MapPanel();
this.mapToolStripButton = new MobiusEditor.Controls.ViewToolStripButton();
this.smudgeToolStripButton = new MobiusEditor.Controls.ViewToolStripButton();
this.overlayToolStripButton = new MobiusEditor.Controls.ViewToolStripButton();
@ -144,7 +146,6 @@ namespace MobiusEditor
this.waypointsToolStripButton = new MobiusEditor.Controls.ViewToolStripButton();
this.cellTriggersToolStripButton = new MobiusEditor.Controls.ViewToolStripButton();
this.selectToolStripButton = new MobiusEditor.Controls.ViewToolStripButton();
this.mapPanel = new MobiusEditor.Controls.MapPanel();
this.mainMenuStrip.SuspendLayout();
this.mainStatusStrip.SuspendLayout();
this.mainToolStrip.SuspendLayout();
@ -498,7 +499,7 @@ namespace MobiusEditor
this.viewLayersSmudgeMenuItem,
this.viewLayersWaypointsMenuItem});
this.viewLayersToolStripMenuItem.Name = "viewLayersToolStripMenuItem";
this.viewLayersToolStripMenuItem.Size = new System.Drawing.Size(155, 22);
this.viewLayersToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.viewLayersToolStripMenuItem.Text = "&Layers";
//
// viewLayersEnableAllMenuItem
@ -599,7 +600,7 @@ namespace MobiusEditor
this.viewIndicatorsBuildingFakeLabelsMenuItem,
this.viewIndicatorsOutlinesMenuItem});
this.viewIndicatorsToolStripMenuItem.Name = "viewIndicatorsToolStripMenuItem";
this.viewIndicatorsToolStripMenuItem.Size = new System.Drawing.Size(155, 22);
this.viewIndicatorsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.viewIndicatorsToolStripMenuItem.Text = "&Indicators";
//
// viewIndicatorsEnableAllMenuItem
@ -701,12 +702,13 @@ namespace MobiusEditor
this.viewExtraIndicatorsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.viewExtraIndicatorsMapSymmetryMenuItem,
this.viewExtraIndicatorsMapGridMenuItem,
this.viewExtraIndicatorsMapPassabilityMenuItem,
this.viewExtraIndicatorsTerrainTypesMenuItem,
this.viewExtraIndicatorsPlacedObjectsMenuItem,
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem,
this.viewExtraIndicatorsEffectAreaRadiusMenuItem});
this.viewExtraIndicatorsToolStripMenuItem.Name = "viewExtraIndicatorsToolStripMenuItem";
this.viewExtraIndicatorsToolStripMenuItem.Size = new System.Drawing.Size(155, 22);
this.viewExtraIndicatorsToolStripMenuItem.Text = "&Extra Indicators";
this.viewExtraIndicatorsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.viewExtraIndicatorsToolStripMenuItem.Text = "&Extra indicators";
//
// viewExtraIndicatorsMapSymmetryMenuItem
//
@ -726,31 +728,40 @@ namespace MobiusEditor
this.viewExtraIndicatorsMapGridMenuItem.Text = "Map &grid";
this.viewExtraIndicatorsMapGridMenuItem.CheckedChanged += new System.EventHandler(this.ViewMenuItem_CheckedChanged);
//
// viewExtraIndicatorsMapPassabilityMenuItem
// viewExtraIndicatorsTerrainTypesMenuItem
//
this.viewExtraIndicatorsMapPassabilityMenuItem.CheckOnClick = true;
this.viewExtraIndicatorsMapPassabilityMenuItem.Name = "viewExtraIndicatorsMapPassabilityMenuItem";
this.viewExtraIndicatorsMapPassabilityMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3;
this.viewExtraIndicatorsMapPassabilityMenuItem.Size = new System.Drawing.Size(224, 22);
this.viewExtraIndicatorsMapPassabilityMenuItem.Text = "Map passability";
this.viewExtraIndicatorsMapPassabilityMenuItem.CheckedChanged += new System.EventHandler(this.ViewMenuItem_CheckedChanged);
this.viewExtraIndicatorsTerrainTypesMenuItem.CheckOnClick = true;
this.viewExtraIndicatorsTerrainTypesMenuItem.Name = "viewExtraIndicatorsTerrainTypesMenuItem";
this.viewExtraIndicatorsTerrainTypesMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3;
this.viewExtraIndicatorsTerrainTypesMenuItem.Size = new System.Drawing.Size(224, 22);
this.viewExtraIndicatorsTerrainTypesMenuItem.Text = "Map terrain &types";
this.viewExtraIndicatorsTerrainTypesMenuItem.CheckedChanged += new System.EventHandler(this.ViewMenuItem_CheckedChanged);
//
// viewExtraIndicatorsPlacedObjectsMenuItem
//
this.viewExtraIndicatorsPlacedObjectsMenuItem.CheckOnClick = true;
this.viewExtraIndicatorsPlacedObjectsMenuItem.Name = "viewExtraIndicatorsPlacedObjectsMenuItem";
this.viewExtraIndicatorsPlacedObjectsMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F4;
this.viewExtraIndicatorsPlacedObjectsMenuItem.Size = new System.Drawing.Size(224, 22);
this.viewExtraIndicatorsPlacedObjectsMenuItem.Text = "&Occupied by objects";
this.viewExtraIndicatorsPlacedObjectsMenuItem.CheckedChanged += new System.EventHandler(this.ViewMenuItem_CheckedChanged);
//
// viewExtraIndicatorsWaypointRevealRadiusMenuItem
//
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem.CheckOnClick = true;
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem.Name = "viewExtraIndicatorsWaypointRevealRadiusMenuItem";
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F4;
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F5;
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem.Size = new System.Drawing.Size(224, 22);
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem.Text = "Waypoint reveal radiuses";
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem.Text = "&Waypoint reveal radiuses";
this.viewExtraIndicatorsWaypointRevealRadiusMenuItem.CheckedChanged += new System.EventHandler(this.ViewMenuItem_CheckedChanged);
//
// viewExtraIndicatorsEffectAreaRadiusMenuItem
//
this.viewExtraIndicatorsEffectAreaRadiusMenuItem.CheckOnClick = true;
this.viewExtraIndicatorsEffectAreaRadiusMenuItem.Name = "viewExtraIndicatorsEffectAreaRadiusMenuItem";
this.viewExtraIndicatorsEffectAreaRadiusMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F5;
this.viewExtraIndicatorsEffectAreaRadiusMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F6;
this.viewExtraIndicatorsEffectAreaRadiusMenuItem.Size = new System.Drawing.Size(224, 22);
this.viewExtraIndicatorsEffectAreaRadiusMenuItem.Text = "Jam/gap radiuses";
this.viewExtraIndicatorsEffectAreaRadiusMenuItem.Text = "Jam/gap &radiuses";
this.viewExtraIndicatorsEffectAreaRadiusMenuItem.CheckedChanged += new System.EventHandler(this.ViewMenuItem_CheckedChanged);
//
// viewZoomToolStripMenuItem
@ -761,7 +772,7 @@ namespace MobiusEditor
this.viewZoomResetMenuItem,
this.viewZoomToBoundsMenuItem});
this.viewZoomToolStripMenuItem.Name = "viewZoomToolStripMenuItem";
this.viewZoomToolStripMenuItem.Size = new System.Drawing.Size(155, 22);
this.viewZoomToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.viewZoomToolStripMenuItem.Text = "&Zoom";
//
// viewZoomInMenuItem
@ -940,6 +951,28 @@ namespace MobiusEditor
this.mainToolStrip.Text = "toolStrip1";
this.mainToolStrip.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MainToolStrip_MouseMove);
//
// mapPanel
//
this.mapPanel.AllowDrop = true;
this.mapPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.mapPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.mapPanel.FocusOnMouseEnter = true;
this.mapPanel.Location = new System.Drawing.Point(0, 55);
this.mapPanel.MapImage = null;
this.mapPanel.MaxZoom = 8D;
this.mapPanel.MinZoom = 0.8D;
this.mapPanel.Name = "mapPanel";
this.mapPanel.Size = new System.Drawing.Size(1008, 484);
this.mapPanel.SuspendMouseZoom = false;
this.mapPanel.SuspendMouseZoomKeys = System.Windows.Forms.Keys.None;
this.mapPanel.TabIndex = 4;
this.mapPanel.Zoom = 1D;
this.mapPanel.ZoomStep = 1D;
this.mapPanel.PostRender += new System.EventHandler<MobiusEditor.Event.RenderEventArgs>(this.MapPanel_PostRender);
this.mapPanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.MapPanel_DragDrop);
this.mapPanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.MapPanel_DragEnter);
this.mapPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MapPanel_MouseMove);
//
// mapToolStripButton
//
this.mapToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("mapToolStripButton.Image")));
@ -1061,28 +1094,6 @@ namespace MobiusEditor
this.selectToolStripButton.Visible = false;
this.selectToolStripButton.Click += new System.EventHandler(this.mainToolStripButton_Click);
//
// mapPanel
//
this.mapPanel.AllowDrop = true;
this.mapPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.mapPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.mapPanel.FocusOnMouseEnter = true;
this.mapPanel.Location = new System.Drawing.Point(0, 55);
this.mapPanel.MapImage = null;
this.mapPanel.MaxZoom = 8D;
this.mapPanel.MinZoom = 0.8D;
this.mapPanel.Name = "mapPanel";
this.mapPanel.Size = new System.Drawing.Size(1008, 484);
this.mapPanel.SuspendMouseZoom = false;
this.mapPanel.SuspendMouseZoomKeys = System.Windows.Forms.Keys.None;
this.mapPanel.TabIndex = 4;
this.mapPanel.Zoom = 1D;
this.mapPanel.ZoomStep = 1D;
this.mapPanel.PostRender += new System.EventHandler<MobiusEditor.Event.RenderEventArgs>(this.MapPanel_PostRender);
this.mapPanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.MapPanel_DragDrop);
this.mapPanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.MapPanel_DragEnter);
this.mapPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MapPanel_MouseMove);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -1203,7 +1214,7 @@ namespace MobiusEditor
private System.Windows.Forms.ToolStripMenuItem viewIndicatorsMapBoundariesMenuItem;
private System.Windows.Forms.ToolStripMenuItem viewIndicatorsOutlinesMenuItem;
private System.Windows.Forms.ToolStripMenuItem toolsOptionsOutlineAllCratesMenuItem;
private System.Windows.Forms.ToolStripMenuItem viewExtraIndicatorsMapPassabilityMenuItem;
private System.Windows.Forms.ToolStripMenuItem viewExtraIndicatorsTerrainTypesMenuItem;
private System.Windows.Forms.ToolStripMenuItem viewZoomToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem viewZoomInMenuItem;
private System.Windows.Forms.ToolStripMenuItem viewZoomOutMenuItem;
@ -1214,6 +1225,7 @@ namespace MobiusEditor
private System.Windows.Forms.ToolStripMenuItem InfoAboutMenuItem;
private System.Windows.Forms.ToolStripMenuItem InfoCheckForUpdatesMenuItem;
private System.Windows.Forms.ToolStripMenuItem InfoWebsiteMenuItem;
private System.Windows.Forms.ToolStripMenuItem viewExtraIndicatorsPlacedObjectsMenuItem;
}
}

View File

@ -2805,10 +2805,14 @@ namespace MobiusEditor
{
layers &= ~MapLayerFlag.EffectRadius;
}
if (!viewExtraIndicatorsMapPassabilityMenuItem.Checked)
if (!viewExtraIndicatorsTerrainTypesMenuItem.Checked)
{
layers &= ~MapLayerFlag.LandTypes;
}
if (!viewExtraIndicatorsPlacedObjectsMenuItem.Checked)
{
layers &= ~MapLayerFlag.TechnoOccupancy;
}
if (!viewIndicatorsOutlinesMenuItem.Checked)
{
layers &= ~MapLayerFlag.OverlapOutlines;
@ -2981,6 +2985,10 @@ namespace MobiusEditor
{
return;
}
if (SteamworksUGC.IsSteamBuild && !SteamworksUGC.IsInit && Properties.Settings.Default.LazyInitSteam)
{
SteamworksUGC.Init();
}
if (!SteamworksUGC.IsInit)
{
MessageBox.Show(this, "Steam interface is not initialized. To enable Workshop publishing, log into Steam and restart the editor.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

View File

@ -59,6 +59,7 @@ namespace MobiusEditor.Model
WaypointRadius /**/ = 1 << 20,
OverlapOutlines /**/ = 1 << 21,
LandTypes /**/ = 1 << 22,
TechnoOccupancy /**/ = 1 << 23,
OverlayAll = Resources | Walls | Overlay,
Technos = Terrain | Infantry | Units | Buildings,
@ -67,7 +68,7 @@ namespace MobiusEditor.Model
/// <summary>Listing of layers that don't need a full map repaint.</summary>
Indicators = Boundaries | MapSymmetry | MapGrid | WaypointsIndic | FootballArea | CellTriggers
| TechnoTriggers | BuildingRebuild | BuildingFakes | EffectRadius | WaypointRadius
| OverlapOutlines | LandTypes,
| OverlapOutlines | LandTypes | TechnoOccupancy,
All = Int32.MaxValue
}
@ -264,6 +265,8 @@ namespace MobiusEditor.Model
public readonly List<TemplateType> TemplateTypes;
public HashSet<LandType> UsedLandTypes = new HashSet<LandType>();
public readonly List<TerrainType> TerrainTypes;
public readonly List<OverlayType> OverlayTypes;
@ -611,6 +614,12 @@ namespace MobiusEditor.Model
{
templateType.Init(gameInfo, this.Theater, Globals.FilterTheaterObjects);
}
this.UsedLandTypes = this.TemplateTypes
.Where(tmp => tmp.ExistsInTheater)
.SelectMany(tmp => tmp.LandTypes ?? new LandType[0])
.Distinct()
.Where(lt => lt != LandType.None)
.ToHashSet();
foreach (SmudgeType smudgeType in this.SmudgeTypes)
{
smudgeType.Init(this.Theater);
@ -1546,6 +1555,7 @@ namespace MobiusEditor.Model
this.AllTeamTechnoTypes, wpPreview, this.MovieTypes, this.MovieEmpty, this.ThemeTypes, this.ThemeEmpty,
this.DropZoneRadius, this.GapRadius, this.RadarJamRadius, this.TiberiumOrGoldValue, this.GemValue)
{
UsedLandTypes = this.UsedLandTypes,
TopLeft = TopLeft,
Size = Size,
// Allows functions to check whether they are being applied on the real map or the preview map.

View File

@ -698,6 +698,20 @@ namespace MobiusEditor.Model
return new Point(icon % ThumbnailIconWidth, icon / ThumbnailIconWidth);
}
public IEnumerable<Point> GetIconPoints(Point offset)
{
for (int y = 0; y < IconHeight; y++)
{
for (int x = 0; x < IconWidth; x++)
{
if (IconMask[y, x])
{
yield return new Point(offset.X + x, offset.Y + y);
}
}
}
}
public bool IsValidIcon(Point point)
{
if (point.X < 0 || point.Y < 0)

View File

@ -14,7 +14,6 @@
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
using MobiusEditor.Dialogs;
using MobiusEditor.Interface;
using MobiusEditor.Model;
using MobiusEditor.Utility;
using System;
@ -165,7 +164,7 @@ namespace MobiusEditor
return;
}
bool steamEnabled = false;
if (SteamworksUGC.IsSteamBuild)
if (SteamworksUGC.IsSteamBuild && !Properties.Settings.Default.LazyInitSteam)
{
steamEnabled = SteamworksUGC.Init();
}

View File

@ -12,7 +12,7 @@ namespace MobiusEditor.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.10.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@ -77,6 +77,15 @@ namespace MobiusEditor.Properties {
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool LazyInitSteam {
get {
return ((bool)(this["LazyInitSteam"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Auto")]
@ -230,33 +239,6 @@ namespace MobiusEditor.Properties {
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool TerrainTypesShowObjects {
get {
return ((bool)(this["TerrainTypesShowObjects"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("40, 0, 0, 255")]
public global::System.Drawing.Color MapGridColor {
get {
return ((global::System.Drawing.Color)(this["MapGridColor"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("32, 32, 32")]
public global::System.Drawing.Color MapBackColor {
get {
return ((global::System.Drawing.Color)(this["MapBackColor"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0.5")]
@ -338,6 +320,105 @@ namespace MobiusEditor.Properties {
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("40, 0, 0, 255")]
public global::System.Drawing.Color MapGridColor {
get {
return ((global::System.Drawing.Color)(this["MapGridColor"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("32, 32, 32")]
public global::System.Drawing.Color MapBackColor {
get {
return ((global::System.Drawing.Color)(this["MapBackColor"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0, 170, 0")]
public global::System.Drawing.Color HashColorTechnoPart {
get {
return ((global::System.Drawing.Color)(this["HashColorTechnoPart"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0, 255, 0")]
public global::System.Drawing.Color HashColorTechnoFull {
get {
return ((global::System.Drawing.Color)(this["HashColorTechnoFull"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0, 255, 255, 255")]
public global::System.Drawing.Color HashColorLandClear {
get {
return ((global::System.Drawing.Color)(this["HashColorLandClear"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("255, 255, 85")]
public global::System.Drawing.Color HashColorLandBeach {
get {
return ((global::System.Drawing.Color)(this["HashColorLandBeach"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("170, 0, 0")]
public global::System.Drawing.Color HashColorLandRock {
get {
return ((global::System.Drawing.Color)(this["HashColorLandRock"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("186, 127, 040")]
public global::System.Drawing.Color HashColorLandRoad {
get {
return ((global::System.Drawing.Color)(this["HashColorLandRoad"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("186, 186, 255")]
public global::System.Drawing.Color HashColorLandWater {
get {
return ((global::System.Drawing.Color)(this["HashColorLandWater"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0, 0, 255")]
public global::System.Drawing.Color HashColorLandRiver {
get {
return ((global::System.Drawing.Color)(this["HashColorLandRiver"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("186, 128, 186")]
public global::System.Drawing.Color HashColorLandRough {
get {
return ((global::System.Drawing.Color)(this["HashColorLandRough"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]

View File

@ -20,6 +20,9 @@
<Setting Name="ClassicProducesNoMetaFiles" Type="System.Boolean" Scope="Application">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="LazyInitSteam" Type="System.Boolean" Scope="Application">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="EditorLanguage" Type="System.String" Scope="Application">
<Value Profile="(Default)">Auto</Value>
</Setting>
@ -71,15 +74,6 @@
<Setting Name="RememberToolData" Type="System.Boolean" Scope="Application">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="TerrainTypesShowObjects" Type="System.Boolean" Scope="Application">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="MapGridColor" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">40, 0, 0, 255</Value>
</Setting>
<Setting Name="MapBackColor" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">32, 32, 32</Value>
</Setting>
<Setting Name="MapScale" Type="System.Double" Scope="Application">
<Value Profile="(Default)">0.5</Value>
</Setting>
@ -107,6 +101,39 @@
<Setting Name="MinimumClampSize" Type="System.Drawing.Size" Scope="Application">
<Value Profile="(Default)">30, 30</Value>
</Setting>
<Setting Name="MapGridColor" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">40, 0, 0, 255</Value>
</Setting>
<Setting Name="MapBackColor" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">32, 32, 32</Value>
</Setting>
<Setting Name="HashColorTechnoPart" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">0, 170, 0</Value>
</Setting>
<Setting Name="HashColorTechnoFull" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">0, 255, 0</Value>
</Setting>
<Setting Name="HashColorLandClear" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">0, 255, 255, 255</Value>
</Setting>
<Setting Name="HashColorLandBeach" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">255, 255, 85</Value>
</Setting>
<Setting Name="HashColorLandRock" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">170, 0, 0</Value>
</Setting>
<Setting Name="HashColorLandRoad" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">186, 127, 040</Value>
</Setting>
<Setting Name="HashColorLandWater" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">186, 186, 255</Value>
</Setting>
<Setting Name="HashColorLandRiver" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">0, 0, 255</Value>
</Setting>
<Setting Name="HashColorLandRough" Type="System.Drawing.Color" Scope="Application">
<Value Profile="(Default)">186, 128, 186</Value>
</Setting>
<Setting Name="ReportMissionDetection" Type="System.Boolean" Scope="Application">
<Value Profile="(Default)">True</Value>
</Setting>

View File

@ -779,7 +779,7 @@ namespace MobiusEditor.RedAlert
List<TeamType> teamTypes = this.LoadTeamTypes(ini, errors, ref modified);
List<Trigger> triggers = this.LoadTriggers(ini, errors, ref modified);
// Rules should be applied in advance to correctly set bibs.
bool isSolo = CheckSwitchToSolo(tryCheckSoloMission, fromMix, triggers, Map.BasicSection.SoloMission, player, errors, true);
bool isSolo = CheckSwitchToSolo(tryCheckSoloMission, fromMix, triggers, Map.BasicSection.SoloMission, player, errors);
SetMissionRules(ini, isSolo, expansionEnabled, errors, ref modified);
Dictionary<string, string> caseTrigs = Trigger.None.Yield().Concat(triggers.Select(t => t.Name)).ToDictionary(t => t, StringComparer.OrdinalIgnoreCase);
LoadMapPack(ini, errors, ref modified);
@ -2716,7 +2716,7 @@ namespace MobiusEditor.RedAlert
}
}
private bool CheckSwitchToSolo(bool tryCheckSoloMission, bool dontReportSwitch, List<Trigger> triggers, bool wasSolo, HouseType player, List<string> errors, bool testOnly)
private bool CheckSwitchToSolo(bool tryCheckSoloMission, bool dontReportSwitch, List<Trigger> triggers, bool wasSolo, HouseType player, List<string> errors)
{
bool switchedToSolo = false;
if (tryCheckSoloMission && !wasSolo)
@ -2735,10 +2735,6 @@ namespace MobiusEditor.RedAlert
switchedToSolo = hasWinTrigger && hasLoseTrigger;
}
bool isSolo = wasSolo || switchedToSolo;
if (testOnly)
{
return isSolo;
}
if (switchedToSolo)
{
Map.BasicSection.SoloMission = true;

View File

@ -2518,19 +2518,32 @@ namespace MobiusEditor.Render
/// <param name="graphics">Graphics to paint on.</param>
/// <param name="plugin">Game plugin</param>
/// <param name="templates">The map data itself</param>
/// <param name="technos">If given, draws a green grid on the locations of the technos in the given set.</param>
/// <param name="tileSize">Tile size</param>
/// <param name="visibleCells">If given, only cells in the given area are marked.</param>
/// <param name="ignoreEmpty">Do not mark cells that have a value of null. This is used by the template tool preview function to not mark unused cells in the template shape.</param>
/// <param name="technos">If given, draws a green grid on the locations of the technos in the given set.</param>
public static void RenderLandTypes(Graphics graphics, IGamePlugin plugin, CellGrid<Template> templates, Size tileSize, Rectangle visibleCells, bool ignoreEmpty, OccupierSet<ICellOccupier> technos)
/// <param name="ignoreCells">Cells to completely ignore during the drawing operation.</param>
/// <param name="forPreview">Indicates this is painted for placement preview purposes, meaning colours with their alpha set to 0 are restored and also handled.</param>
/// <param name="soft">True to paint the hashing with only 25% alpha instead of the usual 50%.</param>
public static void RenderHashAreas(Graphics graphics, IGamePlugin plugin, CellGrid<Template> templates, OccupierSet<ICellOccupier> technos, Size tileSize, Rectangle visibleCells, HashSet<Point> ignoreCells, bool forPreview, bool soft)
{
// Check which cells need to be marked.
LandType clearLand = LandType.Clear;
// Fetch the terrain type for clear terrain on this theater.
if (!ignoreEmpty)
IEnumerable<Point> points = visibleCells.Points();
TemplateType clear = plugin.Map.TemplateTypes.Where(t => t.Flag.HasFlag(TemplateTypeFlag.Clear)).FirstOrDefault();
clearLand = clear.LandTypes.Length > 0 ? clear.LandTypes[0] : LandType.Clear;
HashSet<LandType> usedLandTypes = plugin.Map.UsedLandTypes;
if (technos != null && technos.Count() == 0)
{
TemplateType clear = plugin.Map.TemplateTypes.Where(t => t.Flag.HasFlag(TemplateTypeFlag.Clear)).FirstOrDefault();
clearLand = clear.LandTypes.Length > 0 ? clear.LandTypes[0] : LandType.Clear;
technos = null;
}
if (templates != null && templates.Length == 0)
{
templates = null;
}
if (technos == null && templates == null)
{
return;
}
// Caching this in advance for all types.
LandType[] landTypes = (LandType[])Enum.GetValues(typeof(LandType));
@ -2539,32 +2552,63 @@ namespace MobiusEditor.Render
float lineSize = tileWidth / 16.0f;
int lineOffsetW = tileWidth / 4;
int lineOffsetH = tileHeight / 4;
Dictionary<LandType, Color> landColorsMapping = GetLandColorsMapping();
// If the classic sprite exist, use that and recolour it. Since it's fetched
// with extension, this will simply not return anything in Remastered mode.
Globals.TheTilesetManager.GetTileData("trans.icn", 0, out Tile tile);
for (int i = 0; i < landTypes.Length; i++)
// -1 and 0 are used for respectively partially-filled infantry cells, and fully filled techno cells.
for (int i = -1; i < landTypes.Length; i++)
{
LandType landType = landTypes[i];
LandType landType = LandType.None;
Color curCol;
// Techno indication hijacks LandType.None just because it's in this loop.
bool forTechnos = landType == LandType.None && technos != null;
if (forTechnos)
bool forTechnos = i <= 0 && technos != null;
bool forTechnosPart = forTechnos && i < 0;
bool forTechnosFull = forTechnos && i == 0;
if (forTechnosPart)
{
// Green
curCol = Color.FromArgb(0, 170, 0);
curCol = Globals.HashColorTechnoPart;
}
else if (!LandColorsMapping.TryGetValue(landType, out curCol) || curCol.A == 0)
else if (forTechnosFull)
{
curCol = Globals.HashColorTechnoFull;
}
else
{
if (i <= 0 || templates == null)
{
continue;
}
landType = landTypes[i];
if (!usedLandTypes.Contains(landType) || !landColorsMapping.TryGetValue(landType, out curCol))
{
continue;
}
}
// Unless it's for a placement preview, terrain types with a colour that is fully transparent are completely skipped.
if (curCol.A == 0 && !forPreview)
{
continue;
}
curCol = Color.FromArgb(255, curCol);
using (Bitmap curBmp = GenerateLinesBitmap(tile, tileWidth, tileHeight, curCol, lineSize, lineOffsetW, lineOffsetH, graphics))
using (ImageAttributes imageAttributes = new ImageAttributes())
{
imageAttributes.SetColorMatrix(GetColorMatrix(Color.White, 1.0f, 0.50f));
float brightness = 1.0f;
float alpha = 0.50f;
if (soft)
{
alpha /= 2;
}
imageAttributes.SetColorMatrix(GetColorMatrix(Color.White, brightness, alpha));
for (int y = visibleCells.Y; y < visibleCells.Bottom; ++y)
{
for (int x = visibleCells.X; x < visibleCells.Right; ++x)
{
if (ignoreCells != null && ignoreCells.Contains(new Point(x, y)))
{
continue;
}
bool renderTerrainType = true;
if (technos != null)
{
@ -2578,27 +2622,19 @@ namespace MobiusEditor.Render
if (forTechnos && techno != null)
{
renderTerrainType = false;
float brightness = 1.0f;
if (techno is InfantryGroup ifg && ifg.Infantry.Any(inf => inf == null))
bool incomplete = techno is InfantryGroup ifg && ifg.Infantry.Any(inf => inf == null);
if (incomplete && forTechnosFull || !incomplete && forTechnosPart)
{
brightness = 2.0f;
continue;
}
imageAttributes.SetColorMatrix(GetColorMatrix(Color.White, brightness, 0.50f));
}
}
if (renderTerrainType)
{
Template template = templates[y, x];
LandType land = LandType.None;
if (template != null)
{
land = template.Type.GetLandType(template.Icon);
}
else if (!ignoreEmpty)
{
land = clearLand;
}
// Exclude uninitialised terrain
land = template == null ? clearLand : template.Type.GetLandType(template.Icon);
// Only handle currently looped one
if (land != landType)
{
continue;
@ -2612,16 +2648,19 @@ namespace MobiusEditor.Render
}
}
public static readonly Dictionary<LandType, Color> LandColorsMapping = new Dictionary<LandType, Color>
private static Dictionary<LandType, Color> GetLandColorsMapping()
{
//{LandType.Clear, Color.Transparent }, // [Clear] Normal clear terrain.
{LandType.Beach, Color.FromArgb(255, 255, 085) }, // [Beach] Sandy beach. Can't be built on.
{LandType.Rock, Color.FromArgb(170, 000, 000) }, // [Rock] Impassable terrain.
{LandType.Road, Color.FromArgb(186, 127, 040) }, // [Road] Units move faster on this terrain.
{LandType.Water, Color.FromArgb(255, 255, 255) }, // [Water] Ships can travel over this.
{LandType.River, Color.FromArgb(000, 000, 255) }, // [River] Ships normally can't travel over this.
{LandType.Rough, Color.FromArgb(170, 170, 170) }, // [Rough] Rough terrain. Can't be built on
};
return new Dictionary<LandType, Color>
{
{LandType.Clear, Globals.HashColorLandClear }, // [Clear] Normal clear terrain.
{LandType.Beach, Globals.HashColorLandBeach }, // [Beach] Sandy beach. Can't be built on.
{LandType.Rock, Globals.HashColorLandRock }, // [Rock] Impassable terrain.
{LandType.Road, Globals.HashColorLandRoad }, // [Road] Units move faster on this terrain.
{LandType.Water, Globals.HashColorLandWater }, // [Water] Ships can travel over this.
{LandType.River, Globals.HashColorLandRiver }, // [River] Ships normally can't travel over this.
{LandType.Rough, Globals.HashColorLandRough }, // [Rough] Rough terrain. Can't be built on
};
}
/// <summary>
/// Generates a cell filled with diagonal line hashing. If a tile is given, and it matches the requested size,
@ -2638,7 +2677,7 @@ namespace MobiusEditor.Render
/// <returns>The image with diagonal lines, in the given color.</returns>
private static Bitmap GenerateLinesBitmap(Tile tile, int width, int height, Color color, float lineSize, int lineOffsetW, int lineOffsetH, Graphics g)
{
if (tile != null && tile.Image != null && tile.Image.Width == width && tile.Image.Height == height)
if (tile != null && tile.Image != null)
{
byte colR = color.R;
byte colG = color.G;
@ -2657,7 +2696,24 @@ namespace MobiusEditor.Render
imgData[i + 1] = colG;
imgData[i + 2] = colR;
}
return ImageUtils.BuildImage(imgData, width, height, stride, PixelFormat.Format32bppArgb, null, null);
if (tile.Image.Width == width && tile.Image.Height == height)
{
return ImageUtils.BuildImage(imgData, width, height, stride, PixelFormat.Format32bppArgb, null, null);
}
else
{
using (Bitmap tmp = ImageUtils.BuildImage(imgData, tile.Image.Width, tile.Image.Height, stride, PixelFormat.Format32bppArgb, null, null))
{
Bitmap bm = new Bitmap(width, height);
using (Graphics bmg = Graphics.FromImage(bm))
{
// Pixel upscale for classic graphics
SetRenderSettings(bmg, false);
bmg.DrawImage(tmp, new Rectangle(0, 0, width, height), 0, 0, tmp.Width, tmp.Height, GraphicsUnit.Pixel);
}
return bm;
}
}
}
Bitmap bitmap = new Bitmap(width, height);
int tripleWidth = width * 3;

View File

@ -39,7 +39,7 @@ namespace MobiusEditor.Tools
{
get
{
MapLayerFlag handled = MapLayerFlag.Boundaries | MapLayerFlag.LandTypes;
MapLayerFlag handled = MapLayerFlag.Boundaries | MapLayerFlag.LandTypes | MapLayerFlag.TechnoOccupancy;
if (boundsMode)
{
handled |= MapLayerFlag.MapSymmetry;
@ -1035,6 +1035,7 @@ namespace MobiusEditor.Tools
}
CellMetrics templateTypeMetrics = new CellMetrics(selected.ThumbnailIconWidth, selected.ThumbnailIconHeight);
CellGrid<Template> templates = null;
HashSet<Point> ignoredPoints = new HashSet<Point>();
if (renderGrid)
{
// Fill "dummy map" to apply land types grid to it.
@ -1049,6 +1050,10 @@ namespace MobiusEditor.Tools
{
SetTemplate(map.TemplateTypes, templates, selected, new Point(x, y), new Point(x, y), null, null, this.random, false);
}
else
{
ignoredPoints.Add(new Point(x, y));
}
cell++;
}
}
@ -1064,7 +1069,7 @@ namespace MobiusEditor.Tools
g.DrawImage(selected.Thumbnail, new Rectangle(Point.Empty, selected.Thumbnail.Size), 0, 0, templatePreview.Width, templatePreview.Height, GraphicsUnit.Pixel);
if (templates != null)
{
MapRenderer.RenderLandTypes(g, plugin, templates, Globals.PreviewTileSize, templateTypeMetrics.Bounds, true, null);
MapRenderer.RenderHashAreas(g, plugin, templates, null, Globals.PreviewTileSize, templateTypeMetrics.Bounds, ignoredPoints, true, false);
}
}
// paint selected.Thumbnail;
@ -1896,9 +1901,39 @@ namespace MobiusEditor.Tools
protected override void PostRenderMap(Graphics graphics, Rectangle visibleCells)
{
base.PostRenderMap(graphics, visibleCells);
if (Layers.HasFlag(MapLayerFlag.LandTypes))
HashSet<Point> placementArea = null;
HashSet<Point> placementAreaClear = null;
Rectangle placementRect = Rectangle.Empty;
if (placementMode || fillMode)
{
MapRenderer.RenderLandTypes(graphics, plugin, previewMap.Templates, Globals.MapTileSize, visibleCells, false, Globals.IndicateMapObjects ? previewMap.Technos : null);
placementArea = new HashSet<Point>();
placementAreaClear = new HashSet<Point>();
Point location = navigationWidget.ActualMouseCell;
TemplateType selected = SelectedTemplateType;
if (selected == null || SelectedIcon.HasValue)
{
placementRect = new Rectangle(location.X, location.Y, 1, 1);
placementArea.Add(location);
}
else
{
placementRect = new Rectangle(location.X, location.Y, selected.IconWidth, selected.IconHeight);
IEnumerable<Point> points = selected.GetIconPoints(location);
placementArea.UnionWith(points);
placementAreaClear.UnionWith(placementRect.Points().Where(p => !placementArea.Contains(p)));
}
}
if (Layers.HasAnyFlags(MapLayerFlag.LandTypes | MapLayerFlag.TechnoOccupancy))
{
OccupierSet<ICellOccupier> technos = Layers.HasFlag(MapLayerFlag.TechnoOccupancy) ? previewMap.Technos : null;
CellGrid<Template> templates = Layers.HasFlag(MapLayerFlag.LandTypes) ? previewMap.Templates : null;
MapRenderer.RenderHashAreas(graphics, plugin, templates, technos, Globals.MapTileSize, visibleCells, placementArea, false, false);
}
if (placementMode || fillMode)
{
CellGrid<Template> templates = previewMap.Templates;
bool isExtra = !Layers.HasFlag(MapLayerFlag.LandTypes);
MapRenderer.RenderHashAreas(graphics, plugin, templates, null, Globals.MapTileSize, placementRect, placementAreaClear, true, isExtra);
}
if (boundsMode)
{
@ -1915,9 +1950,12 @@ namespace MobiusEditor.Tools
{
Point location = navigationWidget.ActualMouseCell;
TemplateType selected = SelectedTemplateType;
if (selected == null)
int selWidth = 1;
int selHeight = 1;
if (selected != null && !SelectedIcon.HasValue)
{
return;
selWidth = selected.IconWidth;
selHeight = selected.IconHeight;
}
Rectangle singleCell = new Rectangle(
location.X * Globals.MapTileWidth, location.Y * Globals.MapTileHeight,
@ -1925,15 +1963,15 @@ namespace MobiusEditor.Tools
Rectangle previewBounds = new Rectangle(
location.X * Globals.MapTileWidth,
location.Y * Globals.MapTileHeight,
(SelectedIcon.HasValue ? 1 : selected.IconWidth) * Globals.MapTileWidth,
(SelectedIcon.HasValue ? 1 : selected.IconHeight) * Globals.MapTileHeight
selWidth * Globals.MapTileWidth,
selHeight * Globals.MapTileHeight
);
using (Pen previewPen = new Pen(fillMode ? Color.Red : Color.Green, Math.Max(1, Globals.MapTileSize.Width / 16.0f)))
{
graphics.DrawRectangle(previewPen, previewBounds);
// Special indicator to tell the user that the top-left cell has a special purpose:
// when pattern-filling, only this cell will serve as fill origin.
if (fillMode && (selected.IconWidth != 1 || selected.IconHeight != 1))
if (fillMode && (selWidth != 1 || selHeight != 1))
{
graphics.DrawRectangle(previewPen, singleCell);
}

View File

@ -278,10 +278,16 @@ namespace MobiusEditor.Tools
boundRenderCells.Intersect(map.Metrics.Bounds);
// Only render these if they are not in the priority layers, and not handled manually.
// The functions themselves will take care of checking whether they are in the active layers to render.
if (layersToRender.HasFlag(MapLayerFlag.LandTypes)
&& !manuallyHandledLayers.HasFlag(MapLayerFlag.LandTypes))
if (layersToRender.HasAnyFlags(MapLayerFlag.LandTypes | MapLayerFlag.TechnoOccupancy))
{
MapRenderer.RenderLandTypes(graphics, plugin, map.Templates, tileSize, visibleCells, false, Globals.IndicateMapObjects ? map.Technos : null);
CellGrid<Template> templates = layersToRender.HasFlag(MapLayerFlag.LandTypes)
&& !manuallyHandledLayers.HasFlag(MapLayerFlag.LandTypes) ? map.Templates : null;
OccupierSet<ICellOccupier> technos = layersToRender.HasFlag(MapLayerFlag.TechnoOccupancy)
&& !manuallyHandledLayers.HasFlag(MapLayerFlag.TechnoOccupancy) ? map.Technos : null;
if (templates != null || technos != null)
{
MapRenderer.RenderHashAreas(graphics, plugin, templates, technos, Globals.MapTileSize, visibleCells, null, false, false);
}
}
if ((Globals.ShowPlacementGrid && inPlacementMode) ||
layersToRender.HasFlag(MapLayerFlag.MapGrid)

View File

@ -36,6 +36,8 @@ Besides those, \[PageUp\] and \[PageDown\] have been universally implemented to
Some editing modes will have their own specific shortcuts; in Map mode, holding down the \[Ctrl\] key will allow modifying the map border, and \[Ctrl\]+\[Alt\] allows using the flood fill feature. In Waypoints mode, pressing \[Shift\] plus the starting letter of a special waypoint will act as shortcut for quickly selecting it. In Waypoints and Celltriggers modes, the \[Enter\] key functions as shortcut for the "Jump To" function. All such mode-dependent shortcuts will be indicated in the bottom bar along with the mouse function modifiers.
Additionally, the "Extra indicators" you can find under the "View" menu all have an F-key assigned to them, to quickly toggles them. F1 for the map symmetry lines, F2 for the map grid, F3 for showing the map terrain type of each cell, F4 for indicating maps occupied by placed down objects, F5 to show the reveal radius around any waypoints that are configured to reveal terrain through map scripting, and F6 for showing the radiuses for special abilities, such as the gap generators and radar jammers in Red Alert. A lot of these extra indicators will pop up automatically under certain conditions, such as placing/dragging the affected objects, or simply being in the relevant editing mode. The menu toggles will simply keep them permanently enabled, even outside these contexts.
Note that these hotkeys only work when the main window is selected; if you click on the tool window to select it, all keys will work as expected inside the selected controls. Also note that the tool window will automatically deselect when the mouse is moved over the main editor area, to avoid having to click the main window to activate its normal functioning.
### Sole Survivor and Megamaps
@ -52,7 +54,7 @@ The editor contains a function to create a new map starting from an image, also
The function is meant to allow map makers to plan out the layout of their map in an image editor, with more tools available in terms of symmetry, copy-pasting, drawing straight lines, drawing curves, etc. Each pixel on the image represents one cell, so the image should be the size of a full map; 64x64 for Tiberian Dawn, and 128x128 for Red Alert and Sole Survivor (and Tiberian Dawn megamaps). If the image is smaller, it will be expanded with black. If it is larger, only the upper left corner will be used.
After selecting the map type and the image, a dialog will be shown where colors can be mapped to a specific tileset icon type. This function only handles distinct colors, so avoid using tools that use smooth color transitions; the final image should probably only contain some 3-10 distinct colors. Note that the alpha factor of the colors will be ignored.
After selecting the map type and the image, a dialog will be shown where colours can be mapped to a specific tileset icon type. This function only handles distinct colours, so avoid using tools that use smooth colour transitions; the final image should probably only contain some 3-10 distinct colours. Note that the alpha factor of the colours will be ignored.
The result of this is obviously not an immediately usable map. It will produce a rough layout which will then need to be overlayed with actual cliffs, rivers and shores to turn it into an actual map. For Red Alert Interior theater, you can probably do a lot more preparation work in the image editor; all corridor sizes can be laid out exactly, and you can even pre-place areas where wall shadows will come, so they can be taken care of with a few quick flood fill commands in the editor.
@ -98,7 +100,7 @@ The editor has two kinds of settings; global settings used on every run, and mod
**\%localappdata\%\\Nyerguds\\**
This should make you end up in the "AppData\\Local\\Nyerguds" folder under your Windows user folder. Removing this folder will clear all of the editor's user settings.
This should make you end up in the "AppData\\Local\\Nyerguds" folder under your Windows user folder. Removing this folder (or, at least, all folders in there starting with "CnCTDRAMapEditor") will clear all of the editor's user settings.
## Configuration
@ -123,15 +125,16 @@ Note that for Red Alert, the editor uses the DOS versions of the infantry sprite
### General editor options
* **EnableDpiAwareness**: On some machines with high dpi monitors, people might have odd issues where the positioning of the indicators on the map doesn't correctly match the map tiles. If this happens, enabling this option might fix the problem.
* **LazyInitSteam**: Enabled by default. The link between the editor and Steam is normally initialised on startup, but that link prevents Steam from running the game while the editor is open. With this option, the link with Steam is only initialised at the moment the map publish function is opened, allowing map makers to more easily switch between the editor and the game to test their what they're making.
* **EditorLanguage**: This option can change the language the editor loads for the remastered game text to name the objects in the editor by specifying a culture code in a format such as "EN-US". This only works for languages that are supported by the C&C Remaster as in-game language. When set to "Auto", it will attempt to use the system language, or the nearest supported one that matches it. To force the default English language, you can leave the setting empty, or use "Default" or "None". The supported languages of the game are: EN-US, DE-DE, ES-ES, FR-FR, KO-KR, PL-PL, RU-RU, ZH-CN, ZH-TW.
* **CheckUpdatesOnStartup**: Enabled by default. Will make the editor notify users if a new version is available.
* **EnableDpiAwareness**: Disabled by default. On some machines with high dpi monitors, people might have odd issues where the positioning of the indicators on the map doesn't correctly match the map tiles. If this happens, enabling this option might fix the problem.
### Mods:
* **ModsToLoadTD** / **ModsToLoadRA** / **ModsToLoadSS**: semicolon (or comma) separated list of mod entries for each supported game.
These refer to mods in the format defined by the Command & Conquer Remastered Collection. A mod entry can either be a Steam workshop ID, or a folder name. Steam workshop IDs are looked up in the game's downloaded Workshop items. Folder names will initially be looked up in the mods folder of the respective game in the CnCRemastered\\mods\\ folder under your Documents folder, but if nothing is found there, the loading system will also check the Steam workshop files for a matching mod. Sole Survivor will use Tiberian Dawn mods. Note that mods can only apply graphical changes from the tileset and house color xml files; the editor can't read any data from compiled dll files. This mods system is mostly meant to apply graphical fixes to the editor.
These refer to mods in the format defined by the Command & Conquer Remastered Collection. A mod entry can either be a Steam workshop ID, or a folder name. Steam workshop IDs are looked up in the game's downloaded Workshop items. Folder names will initially be looked up in the mods folder of the respective game in the CnCRemastered\\mods\\ folder under your Documents folder, but if nothing is found there, the loading system will also check the Steam workshop files for a matching mod. Sole Survivor will use Tiberian Dawn mods. Note that mods can only apply graphical changes from the tileset and house colour xml files; the editor can't read any data from compiled dll files. This mods system is mostly meant to apply graphical fixes to the editor.
The **ModsToLoadTD** and **ModsToLoadSS** settings will have the `GraphicsFixesTD` mod set by default, to complete the incomplete TD Remastered graphics set, meaning the mod will automatically be loaded if found. Similarly, the **ModsToLoadRA** setting will have the `GraphicsFixesRA` mod set. Note that the editor has no way to check whether mods are enabled in the Remastered Collection games, so that makes no difference.
@ -139,6 +142,12 @@ You can find these mods on the Steam workshop ([GraphicsFixesTD](https://steamco
In classic graphics mode, the editor can still use mods, if they contain classic files in a "ccdata" folder. The 'GraphicsFixesRA' mod has such a classic component, to fix the classic graphics of Einstein and the ant buildings.
### Mix content analysis:
Starting from v1.5.1.0, the editor has the ability to open the original games' .mix archives to open the missions inside it. However, the names of the files inside those archives are only stored as hashed numeric values created with a one-way hashing algorithm. This means that, to identify these files, lists of all the original file names are needed. The system to generate these names and their hash values is controlled by a set of ini files, of which the main definitions file is configured in the settings:
* **MixContentInfoFile**: Contains the definitions of the supported games for which mix file content analysis can be done, and any additional files to be loaded to get all information for each game. By default, this is set to "Classic\mixcontent.ini".
### Defaults:
* **DefaultBoundsObstructFill**: Default for the option "Tools" → "Options" → "Flood fill is obstructed by map bounds". When enabled, and filling map tiles with \[Ctrl\]+\[Shift\]+\[Click\], the map boundary acts as border blocking the fill spread. This applies both inside and outside the border.
@ -153,24 +162,44 @@ In classic graphics mode, the editor can still use mods, if they contain classic
### Editor fine tuning:
* **ZoomToBoundsOnLoad**: Defaults to True. When enabled, causes the editor to zoom in to the map bounds when loading an existing map.
* **RememberToolData**: Defaults to False. When enabled, the item selections and options on the tool windows will be remembered when opening a different or new map for the same game.
* **MapGridColor**: Color for drawing the map grid, as "A,R,G,B". This includes the alpha value, because the grid is semitransparent by default.
* **MapBackColor**: Background color for the map screen, as "R,G,B". This defaults to dark grey, so users can see the actual map outline on Red Alert Interior maps.
* **RememberToolData**: Defaults to False. When enabled, the item selections and options on the tool windows will be remembered when opening a different map for the same game.
* **MapScale**: Scaling multiplier for the size at which assets are rendered on the map. Scaling down the rendered map size will make the UI more responsive. Negative values will enable smooth scaling, which gives nicer graphics but will make the UI noticeable _less_ responsive. Defaults to 0.5.
* **MapScaleClassic**: Scaling multiplier when using classic graphics. Defaults to 1.0.
* **PreviewScale**: Scaling multiplier for the size at which assets are rendered on the preview tools. Negative values will enable smooth scaling, but this usually doesn't look good on the upscaled preview graphics. Defaults to 1.
* **PreviewScaleClassic** Scaling multiplier for the preview tools when using classic graphics. Defaults to 5.333 (128/24), which upscales the objects to match the size they have in Remastered graphics.
* **PreviewScaleClassic** Scaling multiplier for the preview tools when using classic graphics. Defaults to 5.333 (128/24), which upscales the objects to match the size they have in the Remastered graphics.
* **ObjectToolItemSizeMultiplier**: Floating-point multiplication factor for downsizing the item icons on the selection lists on the tool windows.
* **TemplateToolTextureSizeMultiplier**: Floating-point multiplication factor for the size of tiles shown on the Map tool. This scaling is somehow done relative to the screen size; not sure.
* **MaxMapTileTextureSize**: Maximum for the size of the tiles shown on the Map tool. Leave on 0 to disable.
* **UndoRedoStackSize**: The amount of undo/redo actions stored in memory. Defaults to 100.
* **MinimumClampSize**: Minimum size of the tool window that will automatically be forced to remain in the screen area. If set to 0,0, this will default to the size of the entire tool window.
### Colours:
General:
* **MapBackColor**: Background colour for the map screen, as "R,G,B". This defaults to dark grey, so users can see the actual map outline on Red Alert Interior maps.
* **MapGridColor**: Colour for drawing the map grid, as "A,R,G,B". This includes the alpha value, because the grid is semitransparent by default.
For the option "Extra indicators" → "Occupied by objects":
* **HashColorTechnoPart**: The colour for cells partially filled with map objects; specifically, infantry.
* **HashColorTechnoFull**: The colour for cells fully filled with map objects; either cells of buildings, terrain or units, or cells fully filled with five infantry units.
For the option "Extra indicators" → "Map terrain types":
* **HashColorLandClear**: The colour for cells of the 'Clear' land type. This is the default passable terrain. Defaults to transparent white. Note that by default, this one's alpha component is set to 0, to suppress the indicators for this type. However, the actual colour information will be used for placement previews of map templates, to indicate all cells in the shape.
* **HashColorLandBeach**: The colour for cells of the 'Beach' land type. This is passable, but can't be built on. Defaults to yellow.
* **HashColorLandRock**: The colour for cells of the 'Rock' land type. This is fully impassable terrain. Defaults to dark red.
* **HashColorLandRoad**: The colour for cells of the 'Road' land type. Units move faster on roads. This type is only used in Red Alert. Defaults to brown.
* **HashColorLandWater**: The colour for cells of the 'Water' land type. This is water terrain that is passable for ships. Defaults to pale blue.
* **HashColorLandRiver**: The colour for cells of the 'River' land type. This is water terrain that is not passable for ships. Defaults to blue.
* **HashColorLandRough**: The colour for cells of the 'Rough' land type. This is passable, but can't be built on. Defaults to grayish purple.
### Editor behavior tweaks:
These options are all enabled by default, but can be disabled if you wish. Use these at your own risk. Some of these (air units, craters, harvesting) are related to bugs in the games, so they could be disabled when making maps for a mod in which these issues are fixed.
* **ReportMissionDetection**: When detecting that a file is a classic single player mission file because it matches the classic "SCG01EA"-like name pattern and contains win and lose scripts, a note about it is shown in the mission load analysis. When disabled, this will only be shown if it is not the only remark in the list.
* **ReportMissionDetection**: When detecting that a file is a classic single player mission file because it matches the classic "SCG01EA"-like name pattern and contains win and lose scripts, a note about it is shown in the mission load analysis. When disabled, this will only be shown if it is not the only remark in the list. Note that missions loaded from .mix archives will always behave as if this option is enabled.
* **EnforceObjectMaximums**: Don't allow saving a map if any of the object amounts exceed the normal internal maximums of the game. Can be disabled in case a mission is specifically meant to be played on a modded game that increases these limits.
* **Ignore106Scripting**: Don't support the extended scripting added by the C&C95 v1.06 patch. If this option is disabled, additional triggers named UUUU, VVVV and WWWW can also be destroyed with "Dstry Trig" actions.
* **ConvertRaObsoleteClear**: Automatically clear tiles with ID 255 on RA Temperate/Snow maps, or on Interior maps if more than 80% of the area outside the map bounds is filled with it, to fix the fact old versions of RA saved that as Clear terrain. This can be disabled to research changes on old maps.
@ -191,7 +220,7 @@ These don't affect any real behaviour, but change some graphics to look more cor
* **FixClassicEinstein**: While the Win95 and remastered versions of Red Alert have Einstein's in-game sprite coloured to match how he appears in the briefings, the DOS version (which the editor and the game use) looks identical to Dr. Mobius in Tiberian Dawn. This option makes the editor shuffle around some colours in the classic DOS sprite so it matches that same colour scheme. Note that the **GraphicsFixesRA** mod also fixes this.
* **FixConcretePavement**: The connection logic of the "CONC" pavement in Tiberian Dawn is seriously bugged in-game. The editor contains a fixed logic, showing the concrete how it was intended to be, filling in side gaps with filler cells. However, be advised that this new logic does not match the actual game. For this reason, it is disabled by default.
* **DrawSoleTeleports**: On Sole Survivor maps, draw a black area with blue border over the loaded ROAD graphics to emulate the look of the in-game teleporters.
* **DrawSoleTeleports**: On Sole Survivor maps, draw a black area with a blue border over the loaded ROAD graphics to emulate the look of the in-game teleporters.
## Classic files listing:

View File

@ -20,6 +20,10 @@ Updates are regularly posted on my little corner of [the C&C Tiberian Dawn Remas
Right now, I'm not really looking into making this a joint project. Specific bug reports and suggestions are always welcome though, but post them as issues.
## Download
Github can be a bit tricky to nagivate, but you can find the latest releases in the right-hand sidebar, under **Releases**. Once there, scroll past the changes list, and download the first .zip file in the list. [Click here](https://github.com/Nyerguds/MobiusMapEditor/releases/latest/) to go straight to the latest release.
## Installation
**DO NOT unpack this in the C&C Remastered Collection's install folder.** It is absolutely unnecessary to overwrite any files of the installed game.