Various fixes
* Changed small techno triggers font to 5 pixels high. * Fixed trigger changes on Terrain objects not immediately refreshing the map indicators. * Fixed internal issue with the resources of object property popups not getting cleaned up correctly. * Fixed refresh event handler not getting removed when opening an object's properties popup. * Fixed an issue in the outline caching of buildings where the damaged state was not taken into account. * Updated showcase preview pictures.
This commit is contained in:
parent
2b3e485254
commit
c48e045544
@ -601,9 +601,7 @@ Released on 31 Jan 2023 at 20:50 GMT
|
||||
* The Digest section will now also be removed from TD / SS maps.
|
||||
* Upgraded the logic to detect missing rules for ant-related objects on RA maps, so it includes the Mandible weapon, and checks in triggers too. The check now also goes through the rules files, so when using a rules mod that does define these things, no warnings will be shown.
|
||||
* Added config option for the behaviour to recolor the classic DOS Einstein to RA95/remastered colors.
|
||||
* Added code to filter out special houses (e.g. "None") by HouseTypeFlag rather than using hardcoded exceptions.
|
||||
* Fixed the alliances list in the house settings scrolling past the first selected alliance.
|
||||
* The Alliances list now uses a specific list for alliance-houses, which is filtered and sorted to potentially include special houses.
|
||||
* Red Alert now allows the special grouping Houses "Allies" and "Soviet" in their alliances list.
|
||||
* Houses now always automatically add their own house name in their alliances list if it is missing.
|
||||
* Sole Survivor maps with all multi-Houses enabled will now have all those beyond Multi4 disabled on map load, to avoid needlessly expanding the ini.
|
||||
@ -622,7 +620,7 @@ Released on 31 Jan 2023 at 20:50 GMT
|
||||
* Added an option to control the behaviour of allowing walls as structures, with an owner. Since this is a behavior tweaks option, and those are all enabled by default, it is called "DontAllowWallsAsBuildings".
|
||||
|
||||
|
||||
### v1.5.1.0:
|
||||
### v1.6.0.0:
|
||||
|
||||
Unreleased.
|
||||
|
||||
@ -669,3 +667,4 @@ Unreleased.
|
||||
* Fixed an issue with the main editor window becoming hard to select if it was minimised during a load or save operation, because it would select the tool window instead of restoring the main window. To fix this, the tool window is now never shown if the main window is minimised.
|
||||
* Added an indicator to the building tool to indicate whether a building is capturable.
|
||||
* Added support for C&C95 v1.06c's bib disabling and capturability rule tweaks.
|
||||
* Fixed trigger changes on Terrain objects not immediately refreshing the map.
|
||||
|
Binary file not shown.
BIN
CnCTDRAMapEditor/5pntthin.fnt
Normal file
BIN
CnCTDRAMapEditor/5pntthin.fnt
Normal file
Binary file not shown.
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0">
|
||||
<Import Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />
|
||||
<PropertyGroup>
|
||||
@ -792,7 +792,7 @@
|
||||
<EmbeddedResource Include="Tools\Dialogs\WaypointsToolDialog.resx">
|
||||
<DependentUpon>WaypointsToolDialog.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<None Include="4point.fnt">
|
||||
<None Include="5pntthin.fnt">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="6ptdos.fnt">
|
||||
|
@ -158,6 +158,38 @@ namespace MobiusEditor.Controls
|
||||
};
|
||||
}
|
||||
|
||||
public void CleanUp()
|
||||
{
|
||||
Object = null;
|
||||
HideToolTip(this, new EventArgs());
|
||||
lblTriggerTypesInfo.Image = null;
|
||||
lblCapturable.Image = null;
|
||||
if (triggerInfoImage != null)
|
||||
{
|
||||
try { triggerInfoImage.Dispose(); }
|
||||
catch { /*ignore*/}
|
||||
triggerInfoImage = null;
|
||||
}
|
||||
if (captureImage != null)
|
||||
{
|
||||
try { captureImage.Dispose(); }
|
||||
catch { /*ignore*/}
|
||||
captureImage = null;
|
||||
}
|
||||
if (captureDisabledImage != null)
|
||||
{
|
||||
try { captureDisabledImage.Dispose(); }
|
||||
catch { /*ignore*/}
|
||||
captureDisabledImage = null;
|
||||
}
|
||||
if (captureUnknownImage != null)
|
||||
{
|
||||
try { captureUnknownImage.Dispose(); }
|
||||
catch { /*ignore*/}
|
||||
captureUnknownImage = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void Triggers_CollectionChanged(object sender, EventArgs e)
|
||||
{
|
||||
UpdateDataSource();
|
||||
@ -259,8 +291,12 @@ namespace MobiusEditor.Controls
|
||||
houseComboBox.DataBindings.Clear();
|
||||
strengthNud.DataBindings.Clear();
|
||||
directionComboBox.DataBindings.Clear();
|
||||
directionComboBox.DataSource = null;
|
||||
directionComboBox.Items.Clear();
|
||||
missionComboBox.DataBindings.Clear();
|
||||
triggerComboBox.DataBindings.Clear();
|
||||
triggerComboBox.DataSource = null;
|
||||
triggerComboBox.Items.Clear();
|
||||
basePriorityNud.DataBindings.Clear();
|
||||
prebuiltCheckBox.DataBindings.Clear();
|
||||
sellableCheckBox.DataBindings.Clear();
|
||||
@ -583,7 +619,7 @@ namespace MobiusEditor.Controls
|
||||
this.tooltipShownOn = target;
|
||||
}
|
||||
|
||||
private void HideToolTip(object sender, EventArgs e)
|
||||
public void HideToolTip(object sender, EventArgs e)
|
||||
{
|
||||
if (this.tooltipShownOn != null)
|
||||
{
|
||||
@ -602,43 +638,20 @@ namespace MobiusEditor.Controls
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
// Remove all bindings to this control
|
||||
Object = null;
|
||||
if (disposing && components != null)
|
||||
{
|
||||
lblTriggerTypesInfo.Image = null;
|
||||
lblCapturable.Image = null;
|
||||
if (triggerInfoImage != null)
|
||||
{
|
||||
try { triggerInfoImage.Dispose(); }
|
||||
catch { /*ignore*/}
|
||||
triggerInfoImage = null;
|
||||
}
|
||||
if (captureImage != null)
|
||||
{
|
||||
try { captureImage.Dispose(); }
|
||||
catch { /*ignore*/}
|
||||
captureImage = null;
|
||||
}
|
||||
if (captureDisabledImage != null)
|
||||
{
|
||||
try { captureDisabledImage.Dispose(); }
|
||||
catch { /*ignore*/}
|
||||
captureDisabledImage = null;
|
||||
}
|
||||
if (captureUnknownImage != null)
|
||||
{
|
||||
try { captureUnknownImage.Dispose(); }
|
||||
catch { /*ignore*/}
|
||||
captureUnknownImage = null;
|
||||
}
|
||||
components.Dispose();
|
||||
}
|
||||
CleanUp();
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
}
|
||||
|
||||
public class ObjectPropertiesPopup : ToolStripDropDown
|
||||
{
|
||||
private readonly ToolStripControlHost host;
|
||||
private ToolStripControlHost host;
|
||||
public ObjectProperties ObjectProperties { get; private set; }
|
||||
|
||||
public ObjectPropertiesPopup(IGamePlugin plugin, INotifyPropertyChanged obj)
|
||||
@ -657,18 +670,16 @@ namespace MobiusEditor.Controls
|
||||
Items.Add(host);
|
||||
ObjectProperties.Size = ObjectProperties.PreferredSize;
|
||||
Size = ObjectProperties.Size;
|
||||
ObjectProperties.Disposed += (sender, e) =>
|
||||
{
|
||||
ObjectProperties = null;
|
||||
Dispose(true);
|
||||
};
|
||||
}
|
||||
|
||||
protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
|
||||
{
|
||||
// Since dispose doesn't seem to auto-trigger, dispose and remove all this manually.
|
||||
ObjectProperties = null;
|
||||
Items.Remove(host);
|
||||
host.Dispose();
|
||||
host = null;
|
||||
base.OnClosed(e);
|
||||
|
||||
ObjectProperties.Object = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,19 +21,6 @@ namespace MobiusEditor.Controls
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
|
@ -52,15 +52,8 @@ namespace MobiusEditor.Controls
|
||||
public void Initialize(IGamePlugin plugin, bool isMockObject)
|
||||
{
|
||||
this.isMockObject = isMockObject;
|
||||
|
||||
Plugin = plugin;
|
||||
|
||||
UpdateDataSource();
|
||||
|
||||
Disposed += (sender, e) =>
|
||||
{
|
||||
Smudge = null;
|
||||
};
|
||||
}
|
||||
|
||||
private void UpdateDataSource()
|
||||
@ -76,7 +69,8 @@ namespace MobiusEditor.Controls
|
||||
private void Rebind()
|
||||
{
|
||||
stateComboBox.DataBindings.Clear();
|
||||
|
||||
stateComboBox.DataSource = null;
|
||||
stateComboBox.Items.Clear();
|
||||
if (smudge == null)
|
||||
{
|
||||
return;
|
||||
@ -109,11 +103,25 @@ namespace MobiusEditor.Controls
|
||||
binding.WriteValue();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
Smudge = null;
|
||||
if (disposing && components != null)
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
}
|
||||
|
||||
public class SmudgePropertiesPopup : ToolStripDropDown
|
||||
{
|
||||
private readonly ToolStripControlHost host;
|
||||
private ToolStripControlHost host;
|
||||
|
||||
public SmudgeProperties SmudgeProperties { get; private set; }
|
||||
|
||||
@ -131,18 +139,17 @@ namespace MobiusEditor.Controls
|
||||
SmudgeProperties.MaximumSize = SmudgeProperties.Size;
|
||||
Size = SmudgeProperties.Size;
|
||||
Items.Add(host);
|
||||
SmudgeProperties.Disposed += (sender, e) =>
|
||||
{
|
||||
SmudgeProperties = null;
|
||||
Dispose(true);
|
||||
};
|
||||
}
|
||||
|
||||
protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
|
||||
{
|
||||
base.OnClosed(e);
|
||||
|
||||
// Since dispose doesn't seem to auto-trigger, dispose and remove all this manually.
|
||||
SmudgeProperties.Smudge = null;
|
||||
SmudgeProperties = null;
|
||||
Items.Remove(host);
|
||||
host.Dispose();
|
||||
host = null;
|
||||
base.OnClosed(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -238,7 +238,7 @@ namespace MobiusEditor.Controls
|
||||
|
||||
public class TerrainPropertiesPopup : ToolStripDropDown
|
||||
{
|
||||
private readonly ToolStripControlHost host;
|
||||
private ToolStripControlHost host;
|
||||
|
||||
public TerrainProperties TerrainProperties { get; private set; }
|
||||
|
||||
@ -256,18 +256,17 @@ namespace MobiusEditor.Controls
|
||||
TerrainProperties.MaximumSize = TerrainProperties.Size;
|
||||
Size = TerrainProperties.Size;
|
||||
Items.Add(host);
|
||||
TerrainProperties.Disposed += (sender, e) =>
|
||||
{
|
||||
TerrainProperties = null;
|
||||
Dispose(true);
|
||||
};
|
||||
}
|
||||
|
||||
protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
|
||||
{
|
||||
base.OnClosed(e);
|
||||
|
||||
// Since dispose doesn't seem to auto-trigger, dispose and remove all this manually.
|
||||
TerrainProperties.Terrain = null;
|
||||
TerrainProperties = null;
|
||||
Items.Remove(host);
|
||||
host.Dispose();
|
||||
host = null;
|
||||
base.OnClosed(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,9 @@ namespace MobiusEditor.Interface
|
||||
string Trigger { get; set; }
|
||||
/// <summary>Direction that the object is facing.</summary>
|
||||
DirectionType Direction { get; set; }
|
||||
/// <summary>Cached index of the order in which the object was painted. This provides a quick solution to complicated overlap checks.</summary>
|
||||
/// <summary>Cached index of the order in which this object was painted along with other overlappers. This provides a quick solution to complicated overlap checks.</summary>
|
||||
int DrawOrderCache { get; set; }
|
||||
/// <summary>Cached index of the frame of the object that was rendered. This is used for distinguishing outlines.</summary>
|
||||
int DrawFrameCache { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -37,6 +37,7 @@ namespace MobiusEditor.Model
|
||||
public bool[,] BaseOccupyMask => Type.BaseOccupyMask;
|
||||
public int ZOrder => Type.ZOrder;
|
||||
public int DrawOrderCache { get; set; }
|
||||
public int DrawFrameCache { get; set; }
|
||||
public Size Size => type.Size;
|
||||
|
||||
private HouseType house;
|
||||
|
@ -61,6 +61,7 @@ namespace MobiusEditor.Model
|
||||
|
||||
public bool IsPreview { get; set; }
|
||||
public int DrawOrderCache { get; set; }
|
||||
public int DrawFrameCache { get; set; }
|
||||
|
||||
public Infantry(InfantryGroup infantryGroup)
|
||||
{
|
||||
|
@ -32,6 +32,7 @@ namespace MobiusEditor.Model
|
||||
private int icon;
|
||||
public int Icon { get => icon; set => SetField(ref icon, value); }
|
||||
|
||||
public bool IsAutoBib => this.AttachedTo != null; // TODO start using this and remove extra "autobib" smudge types.
|
||||
public Building AttachedTo { get; set; }
|
||||
|
||||
public Rectangle OverlapBounds => new Rectangle(Point.Empty, Type.Size);
|
||||
|
@ -38,6 +38,7 @@ namespace MobiusEditor.Model
|
||||
public bool[,] BaseOccupyMask => Type.OccupyMask;
|
||||
public int ZOrder => Type.ZOrder;
|
||||
public int DrawOrderCache { get; set; }
|
||||
public int DrawFrameCache { get; set; }
|
||||
|
||||
private string trigger = Model.Trigger.None;
|
||||
public string Trigger { get => trigger; set => SetField(ref trigger, value); }
|
||||
|
@ -38,6 +38,7 @@ namespace MobiusEditor.Model
|
||||
public bool[,] BaseOccupyMask => Type.OccupyMask;
|
||||
public int ZOrder => Type.ZOrder;
|
||||
public int DrawOrderCache { get; set; }
|
||||
public int DrawFrameCache { get; set; }
|
||||
|
||||
private HouseType house;
|
||||
public HouseType House { get => house; set => SetField(ref house, value); }
|
||||
|
@ -272,7 +272,7 @@ namespace MobiusEditor.RedAlert
|
||||
break;
|
||||
case ClassicFont.TechnoTriggersSmall:
|
||||
crop = true;
|
||||
fontName = "4point.fnt";
|
||||
fontName = "5pntthin.fnt";
|
||||
if (!tsmc.TileExists(fontName))
|
||||
{
|
||||
fontName = "3point.fnt";
|
||||
|
@ -615,6 +615,7 @@ namespace MobiusEditor.Render
|
||||
TerrainType type = terrain.Type;
|
||||
string tileName = type.GraphicsSource;
|
||||
bool succeeded = Globals.TheTilesetManager.GetTileData(tileName, type.DisplayIcon, out Tile tile, true, false);
|
||||
terrain.DrawFrameCache = type.DisplayIcon;
|
||||
if (!succeeded && !string.Equals(type.GraphicsSource, type.Name, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
succeeded = Globals.TheTilesetManager.GetTileData(type.Name, type.DisplayIcon, out tile, true, false);
|
||||
@ -713,6 +714,7 @@ namespace MobiusEditor.Render
|
||||
}
|
||||
ITeamColor teamColor = building.Type.CanRemap ? Globals.TheTeamColorManager[building.House?.BuildingTeamColor] : null;
|
||||
bool succeeded = Globals.TheTilesetManager.GetTeamColorTileData(building.Type.GraphicsSource, icon, teamColor, out Tile tile, true, false);
|
||||
building.DrawFrameCache = icon;
|
||||
Point location = new Point(topLeft.X * tileSize.Width, topLeft.Y * tileSize.Height);
|
||||
Size maxSize = new Size(building.Type.Size.Width * tileSize.Width, building.Type.Size.Height * tileSize.Height);
|
||||
|
||||
@ -972,6 +974,7 @@ namespace MobiusEditor.Render
|
||||
}
|
||||
// Get body frame
|
||||
Globals.TheTilesetManager.GetTeamColorTileData(unit.Type.Name, icon, teamColor, out Tile tile, true, false);
|
||||
unit.DrawFrameCache = icon;
|
||||
if (tile == null || tile.Image == null)
|
||||
{
|
||||
Debug.Print(string.Format("Unit {0} ({1}) not found", unit.Type.Name, icon));
|
||||
@ -1653,7 +1656,7 @@ namespace MobiusEditor.Render
|
||||
{
|
||||
houseCol = Color.FromArgb(0x80, Globals.TheTeamColorManager.GetBaseColor(colorPick(placedObj.House)));
|
||||
}
|
||||
string id = "outline_" + typeof(T).Name + "_" + placedObj.TechnoType.Name + '_' + (placedObj.Direction == null ? 0 : placedObj.Direction.ID).ToString() + "_" + tileSize.Width + "x" + tileSize.Height;
|
||||
string id = "outline_" + typeof(T).Name + "_" + placedObj.TechnoType.Name + "_fr" + placedObj.DrawFrameCache + "_" + tileSize.Width + "x" + tileSize.Height;
|
||||
RegionData paintAreaRel = Globals.TheShapeCacheManager.GetShape(id);
|
||||
if (paintAreaRel == null)
|
||||
{
|
||||
@ -2076,6 +2079,8 @@ namespace MobiusEditor.Render
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Size size = tileSize;
|
||||
Size boundSize = Globals.OriginalTileSize;
|
||||
List<(string, Rectangle, int)> infantryTriggers = new List<(string, Rectangle, int)>();
|
||||
for (int i = 0; i < infantryGroup.Infantry.Length; ++i)
|
||||
{
|
||||
@ -2084,7 +2089,6 @@ namespace MobiusEditor.Render
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Size size = Globals.OriginalTileSize;
|
||||
Size offset = Size.Empty;
|
||||
switch ((InfantryStoppingType)i)
|
||||
{
|
||||
@ -2105,7 +2109,7 @@ namespace MobiusEditor.Render
|
||||
offset.Height = size.Height / 4;
|
||||
break;
|
||||
}
|
||||
Rectangle bounds = new Rectangle(location + offset, size);
|
||||
Rectangle bounds = new Rectangle(location + offset, boundSize);
|
||||
infantryTriggers.Add((infantry.Trigger, bounds, infantry.IsPreview ? Globals.PreviewAlphaInt : 256));
|
||||
}
|
||||
triggers = infantryTriggers.ToArray();
|
||||
|
@ -198,7 +198,7 @@ namespace MobiusEditor.TiberianDawn
|
||||
break;
|
||||
case ClassicFont.TechnoTriggersSmall:
|
||||
crop = true;
|
||||
fontName = "4point.fnt";
|
||||
fontName = "5pntthin.fnt";
|
||||
if (!tsmc.TileExists(fontName))
|
||||
{
|
||||
fontName = "3point.fnt";
|
||||
|
@ -159,6 +159,7 @@ namespace MobiusEditor.Tools
|
||||
selectedObjectProperties = null;
|
||||
navigationWidget.Refresh();
|
||||
AddPropertiesUndoRedo(building, preEdit);
|
||||
building.PropertyChanged -= SelectedBuilding_PropertyChanged;
|
||||
};
|
||||
building.PropertyChanged += SelectedBuilding_PropertyChanged;
|
||||
selectedObjectProperties.Show(mapPanel, mapPanel.PointToClient(Control.MousePosition));
|
||||
|
@ -193,6 +193,7 @@ namespace MobiusEditor.Tools
|
||||
selectedObjectProperties = null;
|
||||
navigationWidget.Refresh();
|
||||
AddPropertiesUndoRedo(infantry, preEdit);
|
||||
infantry.PropertyChanged -= SelectedInfantry_PropertyChanged;
|
||||
};
|
||||
infantry.PropertyChanged += SelectedInfantry_PropertyChanged;
|
||||
selectedObjectProperties.Show(mapPanel, mapPanel.PointToClient(Control.MousePosition));
|
||||
|
@ -153,8 +153,10 @@ namespace MobiusEditor.Tools
|
||||
selectedSmudgeProperties = new SmudgePropertiesPopup(plugin, smudge);
|
||||
selectedSmudgeProperties.Closed += (cs, ce) =>
|
||||
{
|
||||
selectedSmudgeProperties = null;
|
||||
navigationWidget.Refresh();
|
||||
AddPropertiesUndoRedo(smudge, preEdit);
|
||||
smudge.PropertyChanged -= SelectedSmudge_PropertyChanged;
|
||||
};
|
||||
smudge.PropertyChanged += SelectedSmudge_PropertyChanged;
|
||||
selectedSmudgeProperties.Show(mapPanel, mapPanel.PointToClient(Control.MousePosition));
|
||||
|
@ -154,16 +154,19 @@ namespace MobiusEditor.Tools
|
||||
startedDragging = false;
|
||||
mapPanel.Invalidate();
|
||||
selectedTerrainProperties?.Close();
|
||||
// only TD supports triggers ("Attacked" type) on terrain types.
|
||||
// Only open if current plugin supports any triggers on terrain types.
|
||||
if (plugin.Map.TerrainActionTypes.Count > 0 || plugin.Map.TerrainEventTypes.Count > 0)
|
||||
{
|
||||
Terrain preEdit = terrain.Clone();
|
||||
selectedTerrainProperties = new TerrainPropertiesPopup(terrainProperties.Plugin, terrain);
|
||||
selectedTerrainProperties.Closed += (cs, ce) =>
|
||||
{
|
||||
selectedTerrainProperties = null;
|
||||
navigationWidget.Refresh();
|
||||
AddPropertiesUndoRedo(terrain, preEdit);
|
||||
terrain.PropertyChanged -= SelectedTerrain_PropertyChanged;
|
||||
};
|
||||
terrain.PropertyChanged += SelectedTerrain_PropertyChanged;
|
||||
selectedTerrainProperties.Show(mapPanel, mapPanel.PointToClient(Control.MousePosition));
|
||||
}
|
||||
UpdateStatus();
|
||||
@ -218,6 +221,11 @@ namespace MobiusEditor.Tools
|
||||
RefreshPreviewPanel();
|
||||
}
|
||||
|
||||
private void SelectedTerrain_PropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
mapPanel.Invalidate(map, sender as Terrain);
|
||||
}
|
||||
|
||||
private void TerrainTypeListBox_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
SelectedTerrainType = terrainTypeListBox.SelectedValue as TerrainType;
|
||||
|
@ -191,6 +191,7 @@ namespace MobiusEditor.Tools
|
||||
selectedObjectProperties = null;
|
||||
navigationWidget.Refresh();
|
||||
AddPropertiesUndoRedo(unit, preEdit);
|
||||
unit.PropertyChanged -= SelectedUnit_PropertyChanged;
|
||||
};
|
||||
unit.PropertyChanged += SelectedUnit_PropertyChanged;
|
||||
selectedObjectProperties.Show(mapPanel, mapPanel.PointToClient(Control.MousePosition));
|
||||
|
@ -6,13 +6,17 @@ Mobius Map Editor is an enhanced version of the map editor supplied with the Com
|
||||
|
||||
The editor can edit maps for Command & Conquer Tiberian Dawn, Sole Survivor and Red Alert. The goal of the project is to improve the usability and convenience of the map editor, fix bugs, improve and clean its code-base, enhance compatibility with different kinds of systems and enhance the editor's support for mods.
|
||||
|
||||
As of v1.5.0.0, the editor does not require the C&C Remaster; if the C&C Remastered Collection is not installed on the PC, you can launch the editor in Classic mode instead, using the original 90's graphics.
|
||||
As of v1.5.0.0, the editor no longer requires the C&C Remaster; if the C&C Remastered Collection is not installed on the PC, you can launch the editor in Classic mode instead, using the original 90's graphics.
|
||||
|
||||
Updates are regularly posted on my little corner of [the C&C Mod Haven Discord server](https://discord.gg/fGbEYfxqkZ).
|
||||
|
||||
### Screenshots
|
||||
|
||||

|
||||
Editing a Tiberian Dawn mission, in Remaster mode:
|
||||
|
||||

|
||||
|
||||
Editing a Red Alert mission, in Classic mode:
|
||||
|
||||

|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 555 KiB After Width: | Height: | Size: 534 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.1 MiB After Width: | Height: | Size: 2.4 MiB |
Loading…
x
Reference in New Issue
Block a user