Editor marker tiles layer
This commit is contained in:
259
OpenRA.Mods.Common/Widgets/Logic/Editor/MapMarkerTilesLogic.cs
Normal file
259
OpenRA.Mods.Common/Widgets/Logic/Editor/MapMarkerTilesLogic.cs
Normal file
@@ -0,0 +1,259 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright (c) The OpenRA Developers and Contributors
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation, either version 3 of
|
||||
* the License, or (at your option) any later version. For more
|
||||
* information, see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Mods.Common.Traits;
|
||||
using OpenRA.Widgets;
|
||||
using static OpenRA.Mods.Common.Traits.MarkerLayerOverlay;
|
||||
|
||||
namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
{
|
||||
public class MapMarkerTilesLogic : ChromeLogic
|
||||
{
|
||||
[TranslationReference]
|
||||
const string MarkerMirrorModeNoneTranslation = "mirror-mode.none";
|
||||
|
||||
[TranslationReference]
|
||||
const string MarkerMirrorModeFlipTranslation = "mirror-mode.flip";
|
||||
|
||||
[TranslationReference]
|
||||
const string MarkerMirrorModeRotateTranslation = "mirror-mode.rotate";
|
||||
|
||||
readonly EditorActionManager editorActionManager;
|
||||
readonly MarkerLayerOverlay markerLayerTrait;
|
||||
readonly ScrollPanelWidget tileColorPanel;
|
||||
readonly SliderWidget alphaSlider;
|
||||
readonly LabelWidget alphaValueLabel;
|
||||
readonly DropDownButtonWidget modeDropdown;
|
||||
readonly SliderWidget rotateNumSidesSlider;
|
||||
readonly DropDownButtonWidget flipNumSidesDropdown;
|
||||
readonly LabelWidget numSidesLabel;
|
||||
readonly LabelWidget rotateNumSidesValueLabel;
|
||||
readonly LabelWidget axisAngleLabel;
|
||||
readonly SliderWidget axisAngleSlider;
|
||||
readonly LabelWidget axisAngleValueLabel;
|
||||
readonly ButtonWidget clearSelectedButtonWidget;
|
||||
readonly ButtonWidget clearAllButtonWidget;
|
||||
readonly EditorViewportControllerWidget editor;
|
||||
|
||||
int? markerTile;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public MapMarkerTilesLogic(Widget widget, World world, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
|
||||
{
|
||||
markerLayerTrait = world.WorldActor.Trait<MarkerLayerOverlay>();
|
||||
editorActionManager = world.WorldActor.Trait<EditorActionManager>();
|
||||
|
||||
editor = widget.Parent.Parent.Parent.Parent.Get<EditorViewportControllerWidget>("MAP_EDITOR");
|
||||
editor.BrushChanged += HandleBrushChanged;
|
||||
|
||||
tileColorPanel = widget.Get<ScrollPanelWidget>("TILE_COLOR_PANEL");
|
||||
{
|
||||
tileColorPanel.Layout = new GridLayout(tileColorPanel);
|
||||
var colorSwatchTemplate = tileColorPanel.Get<ScrollItemWidget>("TILE_COLOR_TEMPLATE");
|
||||
var iconTemplate = tileColorPanel.Get<ScrollItemWidget>("TILE_ICON_TEMPLATE");
|
||||
tileColorPanel.RemoveChildren();
|
||||
|
||||
var colors = markerLayerTrait.Info.Colors;
|
||||
for (var colorIndex = 0; colorIndex < colors.Length; colorIndex++)
|
||||
{
|
||||
var scrollItem = SetupColorSwatchItem(colorIndex, colorSwatchTemplate);
|
||||
tileColorPanel.AddChild(scrollItem);
|
||||
}
|
||||
|
||||
var eraseItem = SetupEraseItem(iconTemplate);
|
||||
tileColorPanel.AddChild(eraseItem);
|
||||
|
||||
///////
|
||||
|
||||
ScrollItemWidget SetupColorSwatchItem(int index, ScrollItemWidget template)
|
||||
{
|
||||
var item = ScrollItemWidget.Setup(template,
|
||||
() => markerTile == index,
|
||||
() =>
|
||||
{
|
||||
markerTile = index;
|
||||
editor.SetBrush(new EditorMarkerLayerBrush(editor, index, worldRenderer));
|
||||
});
|
||||
|
||||
var colorWidget = item.Get<ColorBlockWidget>("TILE_PREVIEW");
|
||||
colorWidget.GetColor = () => colors[index];
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
ScrollItemWidget SetupEraseItem(ScrollItemWidget template)
|
||||
{
|
||||
var item = ScrollItemWidget.Setup(template,
|
||||
() => markerTile == null && editor.CurrentBrush != null && editor.CurrentBrush is EditorMarkerLayerBrush,
|
||||
() =>
|
||||
{
|
||||
markerTile = null;
|
||||
editor.SetBrush(new EditorMarkerLayerBrush(editor, null, worldRenderer));
|
||||
});
|
||||
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
clearSelectedButtonWidget = widget.Get<ButtonWidget>("CLEAR_CURRENT_BUTTON");
|
||||
clearSelectedButtonWidget.IsDisabled = () => markerTile == null;
|
||||
clearSelectedButtonWidget.OnClick = ClearSelected;
|
||||
|
||||
clearAllButtonWidget = widget.Get<ButtonWidget>("CLEAR_ALL_BUTTON");
|
||||
clearAllButtonWidget.OnClick = ClearAll;
|
||||
|
||||
alphaSlider = widget.Get<SliderWidget>("ALPHA_SLIDER");
|
||||
alphaSlider.MinimumValue = 1;
|
||||
alphaSlider.MaximumValue = 255;
|
||||
alphaSlider.Ticks = 12;
|
||||
alphaSlider.OnChange += (val) => markerLayerTrait.TileAlpha = (int)val;
|
||||
alphaSlider.GetValue = () => markerLayerTrait.TileAlpha;
|
||||
|
||||
alphaValueLabel = widget.Get<LabelWidget>("ALPHA_VALUE");
|
||||
alphaValueLabel.GetText = () => markerLayerTrait.TileAlpha.ToString(NumberFormatInfo.InvariantInfo);
|
||||
|
||||
modeDropdown = widget.Get<DropDownButtonWidget>("MODE_DROPDOWN");
|
||||
modeDropdown.OnMouseDown = _ => ShowMarkerModeDropDown(modeDropdown);
|
||||
modeDropdown.GetText = () =>
|
||||
{
|
||||
switch (markerLayerTrait.MirrorMode)
|
||||
{
|
||||
case MarkerTileMirrorMode.None:
|
||||
return TranslationProvider.GetString(MarkerMirrorModeNoneTranslation);
|
||||
case MarkerTileMirrorMode.Flip:
|
||||
return TranslationProvider.GetString(MarkerMirrorModeFlipTranslation);
|
||||
case MarkerTileMirrorMode.Rotate:
|
||||
return TranslationProvider.GetString(MarkerMirrorModeRotateTranslation);
|
||||
default:
|
||||
throw new ArgumentException($"Couldn't find translation for marker tile mirror mode '{markerLayerTrait.MirrorMode}'");
|
||||
}
|
||||
};
|
||||
|
||||
bool IsFlipMode() => markerLayerTrait.MirrorMode == MarkerTileMirrorMode.Flip;
|
||||
bool IsRotateMode() => markerLayerTrait.MirrorMode == MarkerTileMirrorMode.Rotate;
|
||||
|
||||
numSidesLabel = widget.Get<LabelWidget>("NUM_SIDES_LABEL");
|
||||
numSidesLabel.IsVisible = () => IsFlipMode() || IsRotateMode();
|
||||
|
||||
rotateNumSidesSlider = widget.Get<SliderWidget>("ROTATE_NUM_SIDES_SLIDER");
|
||||
rotateNumSidesSlider.MinimumValue = 2;
|
||||
rotateNumSidesSlider.MaximumValue = 8;
|
||||
rotateNumSidesSlider.Ticks = 7;
|
||||
rotateNumSidesSlider.IsVisible = IsRotateMode;
|
||||
rotateNumSidesSlider.OnChange += (val) => markerLayerTrait.NumSides = (int)val;
|
||||
rotateNumSidesSlider.GetValue = () => markerLayerTrait.NumSides;
|
||||
|
||||
rotateNumSidesValueLabel = widget.Get<LabelWidget>("ROTATE_NUM_SIDES_VALUE");
|
||||
rotateNumSidesValueLabel.IsVisible = IsRotateMode;
|
||||
rotateNumSidesValueLabel.GetText = () => markerLayerTrait.NumSides.ToString(NumberFormatInfo.InvariantInfo);
|
||||
|
||||
flipNumSidesDropdown = widget.Get<DropDownButtonWidget>("FLIP_NUM_SIDES_DROPDOWN");
|
||||
flipNumSidesDropdown.OnMouseDown = _ => ShowFlipNumSidesDropDown(flipNumSidesDropdown);
|
||||
flipNumSidesDropdown.IsVisible = IsFlipMode;
|
||||
flipNumSidesDropdown.GetText = () => markerLayerTrait.NumSides.ToString(NumberFormatInfo.InvariantInfo);
|
||||
|
||||
axisAngleLabel = widget.Get<LabelWidget>("AXIS_ANGLE_LABEL");
|
||||
axisAngleLabel.IsVisible = IsFlipMode;
|
||||
|
||||
axisAngleSlider = widget.Get<SliderWidget>("AXIS_ANGLE_SLIDER");
|
||||
axisAngleSlider.MinimumValue = 0;
|
||||
axisAngleSlider.MaximumValue = 11;
|
||||
axisAngleSlider.Ticks = 12;
|
||||
axisAngleSlider.IsVisible = IsFlipMode;
|
||||
axisAngleSlider.OnChange += (val) => markerLayerTrait.AxisAngle = (int)val * 15;
|
||||
axisAngleSlider.GetValue = () => markerLayerTrait.AxisAngle / 15;
|
||||
|
||||
axisAngleValueLabel = widget.Get<LabelWidget>("AXIS_ANGLE_VALUE");
|
||||
axisAngleValueLabel.IsVisible = IsFlipMode;
|
||||
axisAngleValueLabel.GetText = () => markerLayerTrait.AxisAngle.ToString(NumberFormatInfo.InvariantInfo);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
editor.BrushChanged -= HandleBrushChanged;
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
void HandleBrushChanged()
|
||||
{
|
||||
if (editor.CurrentBrush is not EditorMarkerLayerBrush)
|
||||
{
|
||||
markerTile = null;
|
||||
}
|
||||
}
|
||||
|
||||
void ClearSelected()
|
||||
{
|
||||
if (editor.CurrentBrush is EditorMarkerLayerBrush markerLayerBrush &&
|
||||
markerLayerBrush.Template.HasValue &&
|
||||
markerLayerTrait.Tiles.TryGetValue(markerLayerBrush.Template.Value, out var tiles) &&
|
||||
tiles.Count > 0)
|
||||
editorActionManager.Add(new ClearSelectedMarkerTilesEditorAction(markerLayerBrush.Template.Value, markerLayerTrait));
|
||||
}
|
||||
|
||||
void ClearAll()
|
||||
{
|
||||
if (markerLayerTrait.Tiles.Count > 0 && markerLayerTrait.Tiles.Any(x => x.Value.Count > 0))
|
||||
editorActionManager.Add(new ClearAllMarkerTilesEditorAction(markerLayerTrait));
|
||||
}
|
||||
|
||||
void ShowMarkerModeDropDown(DropDownButtonWidget dropdown)
|
||||
{
|
||||
ScrollItemWidget SetupItem(MarkerTileMirrorMode mode, ScrollItemWidget itemTemplate)
|
||||
{
|
||||
var item = ScrollItemWidget.Setup(itemTemplate,
|
||||
() => markerLayerTrait.MirrorMode == mode,
|
||||
() => markerLayerTrait.SetMirrorMode(mode));
|
||||
|
||||
item.Get<LabelWidget>("LABEL").GetText = () =>
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case MarkerTileMirrorMode.None:
|
||||
return TranslationProvider.GetString(MarkerMirrorModeNoneTranslation);
|
||||
case MarkerTileMirrorMode.Flip:
|
||||
return TranslationProvider.GetString(MarkerMirrorModeFlipTranslation);
|
||||
case MarkerTileMirrorMode.Rotate:
|
||||
return TranslationProvider.GetString(MarkerMirrorModeRotateTranslation);
|
||||
default:
|
||||
throw new ArgumentException($"Couldn't find translation for marker tile mirror mode '{mode}'");
|
||||
}
|
||||
};
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
var options = new[] { MarkerTileMirrorMode.None, MarkerTileMirrorMode.Flip, MarkerTileMirrorMode.Rotate };
|
||||
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, SetupItem);
|
||||
}
|
||||
|
||||
void ShowFlipNumSidesDropDown(DropDownButtonWidget dropdown)
|
||||
{
|
||||
ScrollItemWidget SetupItem(int value, ScrollItemWidget itemTemplate)
|
||||
{
|
||||
var item = ScrollItemWidget.Setup(itemTemplate,
|
||||
() => markerLayerTrait.NumSides == value,
|
||||
() => markerLayerTrait.NumSides = value);
|
||||
|
||||
item.Get<LabelWidget>("LABEL").GetText = () => value.ToString(NumberFormatInfo.InvariantInfo);
|
||||
return item;
|
||||
}
|
||||
|
||||
var options = new[] { 2, 4 };
|
||||
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, SetupItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,13 +11,14 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Mods.Common.Lint;
|
||||
using OpenRA.Mods.Common.Traits;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
{
|
||||
[ChromeLogicArgsHotkeys("ToggleGridOverlayKey", "ToggleBuildableOverlayKey")]
|
||||
[ChromeLogicArgsHotkeys("ToggleGridOverlayKey", "ToggleBuildableOverlayKey", "ToggleMarkerOverlayKey")]
|
||||
public class MapOverlaysLogic : ChromeLogic
|
||||
{
|
||||
[Flags]
|
||||
@@ -26,19 +27,19 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
None = 0,
|
||||
Grid = 1,
|
||||
Buildable = 2,
|
||||
Marker = 4,
|
||||
}
|
||||
|
||||
readonly TerrainGeometryOverlay terrainGeometryTrait;
|
||||
readonly BuildableTerrainOverlay buildableTerrainTrait;
|
||||
readonly Widget widget;
|
||||
readonly MarkerLayerOverlay markerLayerTrait;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public MapOverlaysLogic(Widget widget, World world, ModData modData, Dictionary<string, MiniYaml> logicArgs)
|
||||
public MapOverlaysLogic(Widget widget, World world, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
|
||||
{
|
||||
this.widget = widget;
|
||||
|
||||
terrainGeometryTrait = world.WorldActor.Trait<TerrainGeometryOverlay>();
|
||||
buildableTerrainTrait = world.WorldActor.Trait<BuildableTerrainOverlay>();
|
||||
markerLayerTrait = world.WorldActor.Trait<MarkerLayerOverlay>();
|
||||
|
||||
var toggleGridKey = new HotkeyReference();
|
||||
if (logicArgs.TryGetValue("ToggleGridOverlayKey", out var yaml))
|
||||
@@ -48,6 +49,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
if (logicArgs.TryGetValue("ToggleBuildableOverlayKey", out yaml))
|
||||
toggleBuildableKey = modData.Hotkeys[yaml.Value];
|
||||
|
||||
var toggleMarkerKey = new HotkeyReference();
|
||||
if (logicArgs.TryGetValue("ToggleMarkerOverlayKey", out yaml))
|
||||
toggleMarkerKey = modData.Hotkeys[yaml.Value];
|
||||
|
||||
var keyhandler = widget.Get<LogicKeyListenerWidget>("OVERLAY_KEYHANDLER");
|
||||
keyhandler.AddHandler(e =>
|
||||
{
|
||||
@@ -66,6 +71,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
return true;
|
||||
}
|
||||
|
||||
if (toggleMarkerKey.IsActivatedBy(e))
|
||||
{
|
||||
markerLayerTrait.Enabled ^= true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
@@ -84,23 +95,33 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
Widget CreateOverlaysPanel()
|
||||
{
|
||||
var categoriesPanel = widget.Get<Widget>("TOOLS_WIDGETS");
|
||||
var showGridCheckbox = categoriesPanel.Get<CheckboxWidget>("SHOW_TILE_GRID");
|
||||
var showBuildableAreaCheckbox = categoriesPanel.Get<CheckboxWidget>("SHOW_BUILDABLE_AREA");
|
||||
var categoriesPanel = Ui.LoadWidget("OVERLAY_PANEL", null, new WidgetArgs());
|
||||
var categoryTemplate = categoriesPanel.Get<CheckboxWidget>("CATEGORY_TEMPLATE");
|
||||
|
||||
MapOverlays[] allCategories = { MapOverlays.Grid, MapOverlays.Buildable };
|
||||
MapOverlays[] allCategories = { MapOverlays.Grid, MapOverlays.Buildable, MapOverlays.Marker };
|
||||
foreach (var cat in allCategories)
|
||||
{
|
||||
var category = (CheckboxWidget)categoryTemplate.Clone();
|
||||
category.GetText = () => cat.ToString();
|
||||
category.IsVisible = () => true;
|
||||
|
||||
if (cat.HasFlag(MapOverlays.Grid))
|
||||
{
|
||||
showGridCheckbox.IsChecked = () => terrainGeometryTrait.Enabled;
|
||||
showGridCheckbox.OnClick = () => terrainGeometryTrait.Enabled ^= true;
|
||||
category.IsChecked = () => terrainGeometryTrait.Enabled;
|
||||
category.OnClick = () => terrainGeometryTrait.Enabled ^= true;
|
||||
}
|
||||
else if (cat.HasFlag(MapOverlays.Buildable))
|
||||
{
|
||||
showBuildableAreaCheckbox.IsChecked = () => buildableTerrainTrait.Enabled;
|
||||
showBuildableAreaCheckbox.OnClick = () => buildableTerrainTrait.Enabled ^= true;
|
||||
category.IsChecked = () => buildableTerrainTrait.Enabled;
|
||||
category.OnClick = () => buildableTerrainTrait.Enabled ^= true;
|
||||
}
|
||||
else if (cat.HasFlag(MapOverlays.Marker))
|
||||
{
|
||||
category.IsChecked = () => markerLayerTrait.Enabled;
|
||||
category.OnClick = () => markerLayerTrait.Enabled ^= true;
|
||||
}
|
||||
|
||||
categoriesPanel.AddChild(category);
|
||||
}
|
||||
|
||||
return categoriesPanel;
|
||||
|
||||
82
OpenRA.Mods.Common/Widgets/Logic/Editor/MapToolsLogic.cs
Normal file
82
OpenRA.Mods.Common/Widgets/Logic/Editor/MapToolsLogic.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright (c) The OpenRA Developers and Contributors
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation, either version 3 of
|
||||
* the License, or (at your option) any later version. For more
|
||||
* information, see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
{
|
||||
public class MapToolsLogic : ChromeLogic
|
||||
{
|
||||
[TranslationReference]
|
||||
const string MarkerTiles = "label-tool-marker-tiles";
|
||||
|
||||
enum MapTool
|
||||
{
|
||||
MarkerTiles
|
||||
}
|
||||
|
||||
readonly DropDownButtonWidget toolsDropdown;
|
||||
readonly Dictionary<MapTool, string> toolNames = new()
|
||||
{
|
||||
{ MapTool.MarkerTiles, MarkerTiles }
|
||||
};
|
||||
|
||||
readonly Dictionary<MapTool, Widget> toolPanels = new();
|
||||
|
||||
MapTool selectedTool = MapTool.MarkerTiles;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public MapToolsLogic(Widget widget, World world, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
|
||||
{
|
||||
toolsDropdown = widget.Get<DropDownButtonWidget>("TOOLS_DROPDOWN");
|
||||
|
||||
var markerToolPanel = widget.Get<ScrollPanelWidget>("MARKER_TOOL_PANEL");
|
||||
toolPanels.Add(MapTool.MarkerTiles, markerToolPanel);
|
||||
|
||||
toolsDropdown.OnMouseDown = _ => ShowToolsDropDown(toolsDropdown);
|
||||
toolsDropdown.GetText = () => TranslationProvider.GetString(toolNames[selectedTool]);
|
||||
toolsDropdown.Disabled = true; // TODO: Enable if new tools are added
|
||||
}
|
||||
|
||||
void ShowToolsDropDown(DropDownButtonWidget dropdown)
|
||||
{
|
||||
ScrollItemWidget SetupItem(MapTool tool, ScrollItemWidget itemTemplate)
|
||||
{
|
||||
var item = ScrollItemWidget.Setup(itemTemplate,
|
||||
() => selectedTool == tool,
|
||||
() => SelectTool(tool));
|
||||
|
||||
item.Get<LabelWidget>("LABEL").GetText = () => TranslationProvider.GetString(toolNames[tool]);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
var options = new[] { MapTool.MarkerTiles };
|
||||
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, SetupItem);
|
||||
}
|
||||
|
||||
void SelectTool(MapTool tool)
|
||||
{
|
||||
if (tool != selectedTool)
|
||||
{
|
||||
var currentToolPanel = toolPanels[selectedTool];
|
||||
currentToolPanel.Visible = false;
|
||||
}
|
||||
|
||||
selectedTool = tool;
|
||||
|
||||
var toolPanel = toolPanels[selectedTool];
|
||||
toolPanel.Visible = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using OpenRA.FileSystem;
|
||||
using OpenRA.Mods.Common.Traits;
|
||||
using OpenRA.Widgets;
|
||||
@@ -300,6 +301,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
}
|
||||
|
||||
saveMap(combinedPath);
|
||||
|
||||
SaveMapMarkerTiles(map, modData, world);
|
||||
}
|
||||
|
||||
public static void SaveMapInner(Map map, IReadWritePackage package, World world, ModData modData)
|
||||
@@ -344,5 +347,33 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
},
|
||||
confirmText: SaveMapFailedConfirm);
|
||||
}
|
||||
|
||||
static void SaveMapMarkerTiles(Map map, ModData modData, World world)
|
||||
{
|
||||
try
|
||||
{
|
||||
var markerLayerOverlay = world.WorldActor.Trait<MarkerLayerOverlay>();
|
||||
if (markerLayerOverlay.Tiles.Count == 0)
|
||||
return;
|
||||
|
||||
var mod = modData.Manifest.Metadata;
|
||||
var directory = Path.Combine(Platform.SupportDir, "Editor", modData.Manifest.Id, mod.Version, "MarkerTiles");
|
||||
Directory.CreateDirectory(directory);
|
||||
|
||||
var markerTilesFile = markerLayerOverlay.ToFile();
|
||||
var markerTilesContent = JsonConvert.SerializeObject(markerTilesFile);
|
||||
|
||||
var markerTileFilename = $"{Path.GetFileNameWithoutExtension(map.Package.Name)}.json";
|
||||
using (var streamWriter = new StreamWriter(Path.Combine(directory, markerTileFilename), false))
|
||||
{
|
||||
streamWriter.Write(markerTilesContent);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Write("debug", "Failed to save map editor marker tiles.");
|
||||
Log.Write("debug", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user