Promote map generators to stand-alone editor tools.

This commit is contained in:
Paul Chote
2025-04-14 13:48:05 +01:00
committed by Gustas Kažukauskas
parent 78f660124c
commit b2acc653a0
15 changed files with 498 additions and 545 deletions

View File

@@ -21,22 +21,25 @@ namespace OpenRA.Mods.Common.Traits
{
[TraitLocation(SystemActors.EditorWorld)]
[Desc("A map generator that clears a map.")]
public sealed class ClearMapGeneratorInfo : TraitInfo<ClearMapGenerator>, IMapGeneratorInfo
public sealed class ClearMapGeneratorInfo : TraitInfo<ClearMapGenerator>, IMapGeneratorInfo, IEditorToolInfo
{
[FieldLoader.Require]
[Desc("Human-readable name this generator uses.")]
[FluentReference]
public readonly string Name = null;
[FieldLoader.Require]
[Desc("Internal id for this map generator.")]
public readonly string Type = null;
[Desc("The widget tree to open when the tool is selected.")]
public readonly string PanelWidget = "MAP_GENERATOR_TOOL_PANEL";
// This is purely of interest to the linter.
[FieldLoader.LoadUsing(nameof(FluentReferencesLoader))]
[FluentReference]
public readonly List<string> FluentReferences = null;
[FieldLoader.Require]
[Desc("Internal id for this map generator.")]
public readonly string Type = null;
[FieldLoader.LoadUsing(nameof(SettingsLoader))]
public readonly MiniYaml Settings;
@@ -98,6 +101,9 @@ namespace OpenRA.Mods.Common.Traits
map.PlayerDefinitions = new MapPlayers(map.Rules, 0).ToMiniYaml();
map.ActorDefinitions = [];
}
string IEditorToolInfo.Label => Name;
string IEditorToolInfo.PanelWidget => PanelWidget;
}
public class ClearMapGenerator { /* we're only interested in the Info */ }

View File

@@ -23,7 +23,7 @@ using static OpenRA.Mods.Common.Traits.ResourceLayerInfo;
namespace OpenRA.Mods.Common.Traits
{
[TraitLocation(SystemActors.EditorWorld)]
public sealed class ExperimentalMapGeneratorInfo : TraitInfo<ExperimentalMapGenerator>, IMapGeneratorInfo
public sealed class ExperimentalMapGeneratorInfo : TraitInfo<ExperimentalMapGenerator>, IMapGeneratorInfo, IEditorToolInfo
{
[FieldLoader.Require]
public readonly string Type = null;
@@ -32,6 +32,9 @@ namespace OpenRA.Mods.Common.Traits
[FluentReference]
public readonly string Name = null;
[Desc("The widget tree to open when the tool is selected.")]
public readonly string PanelWidget = "MAP_GENERATOR_TOOL_PANEL";
// This is purely of interest to the linter.
[FieldLoader.LoadUsing(nameof(FluentReferencesLoader))]
[FluentReference]
@@ -1821,6 +1824,9 @@ namespace OpenRA.Mods.Common.Traits
amplitude = Exts.ISqrt(amplitude);
return amplitude;
}
string IEditorToolInfo.Label => Name;
string IEditorToolInfo.PanelWidget => PanelWidget;
}
public class ExperimentalMapGenerator { /* we're only interested in the Info */ }

View File

@@ -22,8 +22,15 @@ using Color = OpenRA.Primitives.Color;
namespace OpenRA.Mods.Common.Traits
{
[TraitLocation(SystemActors.EditorWorld)]
public class MarkerLayerOverlayInfo : TraitInfo
public class MarkerLayerOverlayInfo : TraitInfo, IEditorToolInfo
{
[FluentReference]
[Desc("The label to show in the tools menu.")]
public readonly string Label = "label-tool-marker-tiles";
[Desc("The widget tree to open when the tool is selected.")]
public readonly string PanelWidget = "MARKER_TOOL_PANEL";
[Desc("A list of colors to be used for drawing.")]
public readonly Color[] Colors =
[
@@ -47,6 +54,9 @@ namespace OpenRA.Mods.Common.Traits
{
return new MarkerLayerOverlay(init.Self, this);
}
string IEditorToolInfo.Label => Label;
string IEditorToolInfo.PanelWidget => PanelWidget;
}
public class MarkerLayerOverlay : IRenderAnnotations, INotifyActorDisposing, IWorldLoaded

View File

@@ -961,6 +961,12 @@ namespace OpenRA.Mods.Common.Traits
bool PathMightExistForLocomotorBlockedByImmovable(Locomotor locomotor, CPos source, CPos target);
}
public interface IEditorToolInfo : ITraitInfoInterface
{
string Label { get; }
string PanelWidget { get; }
}
public class MapGenerationException : Exception
{
public MapGenerationException(string message)

View File

@@ -9,6 +9,7 @@
*/
#endregion
using OpenRA.Mods.Common.Traits;
using OpenRA.Widgets;
namespace OpenRA.Mods.Common.Widgets.Logic
@@ -17,6 +18,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{
enum MenuType { Select, Tiles, Layers, Actors, Tools, History }
readonly World world;
readonly Widget panelContainer;
readonly Widget tabContainer;
readonly EditorViewportControllerWidget editor;
@@ -25,8 +27,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
MenuType lastSelectedTab = MenuType.Tiles;
[ObjectCreator.UseCtor]
public MapEditorTabsLogic(Widget widget)
public MapEditorTabsLogic(Widget widget, World world)
{
this.world = world;
panelContainer = widget.Parent;
tabContainer = widget.Get("MAP_EDITOR_TAB_CONTAINER");
@@ -67,6 +70,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (tabType == MenuType.Select)
tab.IsDisabled = () => !editor.DefaultBrush.Selection.HasSelection;
if (tabType == MenuType.Tools)
{
var toolsAvailable = world.Map.Rules.Actors[SystemActors.EditorWorld].HasTraitInfo<IEditorToolInfo>();
tab.IsDisabled = () => !toolsAvailable;
}
var container = panelContainer.Get<ContainerWidget>(tabId);
container.IsVisible = () => menuType == tabType;
}

View File

@@ -35,10 +35,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
readonly World world;
readonly WorldRenderer worldRenderer;
readonly ModData modData;
// nullable
IMapGeneratorInfo selectedGenerator;
IMapGeneratorSettings selectedSettings;
readonly IMapGeneratorInfo generator;
readonly IMapGeneratorSettings settings;
readonly ScrollPanelWidget settingsPanel;
readonly Widget checkboxSettingTemplate;
@@ -46,13 +44,16 @@ namespace OpenRA.Mods.Common.Widgets.Logic
readonly Widget dropDownSettingTemplate;
[ObjectCreator.UseCtor]
public MapGeneratorToolLogic(Widget widget, World world, WorldRenderer worldRenderer, ModData modData)
public MapGeneratorToolLogic(Widget widget, World world, WorldRenderer worldRenderer, ModData modData,
IMapGeneratorInfo tool)
{
editorActionManager = world.WorldActor.Trait<EditorActionManager>();
this.world = world;
this.worldRenderer = worldRenderer;
this.modData = modData;
generator = tool;
settings = generator.GetSettings();
settingsPanel = widget.Get<ScrollPanelWidget>("SETTINGS_PANEL");
checkboxSettingTemplate = settingsPanel.Get<Widget>("CHECKBOX_TEMPLATE");
@@ -65,40 +66,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var generateRandomButtonWidget = widget.Get<ButtonWidget>("GENERATE_RANDOM_BUTTON");
generateRandomButtonWidget.OnClick = () =>
{
selectedSettings?.Randomize(world.LocalRandom);
settings?.Randomize(world.LocalRandom);
UpdateSettingsUi();
GenerateMap();
};
var generatorDropDown = widget.Get<DropDownButtonWidget>("GENERATOR");
var mapGenerators = world.Map.Rules.Actors[SystemActors.EditorWorld].TraitInfos<IMapGeneratorInfo>();
if (mapGenerators.Count > 0)
{
var label = new CachedTransform<IMapGeneratorInfo, string>(g => FluentProvider.GetMessage(g.Name));
generatorDropDown.GetText = () => label.Update(selectedGenerator);
generatorDropDown.OnMouseDown = _ =>
{
ScrollItemWidget SetupItem(IMapGeneratorInfo g, ScrollItemWidget template)
{
bool IsSelected() => g.Type == selectedGenerator.Type;
void OnClick() => ChangeGenerator(g);
var item = ScrollItemWidget.Setup(template, IsSelected, OnClick);
var label = FluentProvider.GetMessage(g.Name);
item.Get<LabelWidget>("LABEL").GetText = () => label;
return item;
}
generatorDropDown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", mapGenerators.Count * 30, mapGenerators, SetupItem);
};
}
else
{
generateButtonWidget.IsDisabled = () => true;
generateRandomButtonWidget.IsDisabled = () => true;
generatorDropDown.IsDisabled = () => true;
}
ChangeGenerator(mapGenerators.FirstOrDefault());
UpdateSettingsUi();
}
sealed class RandomMapEditorAction : IEditorAction
@@ -130,23 +103,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic
}
}
// newGenerator may be null.
void ChangeGenerator(IMapGeneratorInfo newGenerator)
{
selectedGenerator = newGenerator;
selectedSettings = newGenerator?.GetSettings();
UpdateSettingsUi();
}
void UpdateSettingsUi()
{
settingsPanel.RemoveChildren();
settingsPanel.ContentHeight = 0;
if (selectedGenerator == null)
if (generator == null)
return;
foreach (var o in selectedSettings.Options)
foreach (var o in settings.Options)
{
Widget settingWidget = null;
switch (o)
@@ -296,12 +260,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var bounds = map.Bounds;
generatedMap.SetBounds(new PPos(bounds.Left, bounds.Top), new PPos(bounds.Right - 1, bounds.Bottom - 1));
var settings = selectedSettings.Compile(terrainInfo);
var settings = this.settings.Compile(terrainInfo);
// Run main generator logic. May throw.
var generateStopwatch = Stopwatch.StartNew();
Log.Write("debug", $"Running '{selectedGenerator.Type}' map generator with settings:\n{MiniYamlExts.WriteToString(settings.Nodes)}\n\n");
selectedGenerator.Generate(generatedMap, settings);
Log.Write("debug", $"Running '{generator.Type}' map generator with settings:\n{MiniYamlExts.WriteToString(settings.Nodes)}\n\n");
generator.Generate(generatedMap, settings);
Log.Write("debug", $"Generator finished, taking {generateStopwatch.ElapsedMilliseconds}ms");
var editorActorLayer = world.WorldActor.Trait<EditorActorLayer>();
@@ -347,7 +311,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
false);
var description = FluentProvider.GetMessage(StrGenerated,
"name", FluentProvider.GetMessage(selectedGenerator.Name));
"name", FluentProvider.GetMessage(generator.Name));
var action = new RandomMapEditorAction(editorBlit, description);
editorActionManager.Add(action);
}

View File

@@ -10,7 +10,7 @@
#endregion
using System.Collections.Generic;
using OpenRA.Graphics;
using System.Linq;
using OpenRA.Mods.Common.Traits;
using OpenRA.Widgets;
@@ -18,77 +18,53 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{
public class MapToolsLogic : ChromeLogic
{
[FluentReference]
const string MarkerTiles = "label-tool-marker-tiles";
[FluentReference]
const string MapGenerator = "label-tool-map-generator";
enum MapTool
{
MarkerTiles,
MapGenerator
}
readonly DropDownButtonWidget toolsDropdown;
readonly Dictionary<MapTool, string> toolNames = new()
{
{ MapTool.MarkerTiles, MarkerTiles },
{ MapTool.MapGenerator, MapGenerator }
};
readonly Dictionary<MapTool, Widget> toolPanels = [];
MapTool selectedTool = MapTool.MarkerTiles;
readonly List<Widget> toolPanels = [];
readonly Dictionary<Widget, string> toolLabels = [];
Widget selectedPanel;
[ObjectCreator.UseCtor]
public MapToolsLogic(Widget widget, World world, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
public MapToolsLogic(Widget widget, World world)
{
toolsDropdown = widget.Get<DropDownButtonWidget>("TOOLS_DROPDOWN");
var markerToolPanel = widget.Get("MARKER_TOOL_PANEL");
toolPanels.Add(MapTool.MarkerTiles, markerToolPanel);
if (world.Map.Rules.Actors[SystemActors.EditorWorld].HasTraitInfo<IMapGeneratorInfo>())
var toolDropdownWidget = widget.Get<DropDownButtonWidget>("TOOLS_DROPDOWN");
var tools = world.Map.Rules.Actors[SystemActors.EditorWorld].TraitInfos<IEditorToolInfo>();
foreach (var tool in tools)
{
var mapGeneratorToolPanel = widget.GetOrNull("MAP_GENERATOR_TOOL_PANEL");
if (mapGeneratorToolPanel != null)
toolPanels.Add(MapTool.MapGenerator, mapGeneratorToolPanel);
var panel = Game.LoadWidget(world, tool.PanelWidget, widget, new WidgetArgs() { { "tool", tool } });
toolPanels.Add(panel);
toolLabels.Add(panel, FluentProvider.GetMessage(tool.Label));
}
toolsDropdown.OnMouseDown = _ => ShowToolsDropDown(toolsDropdown);
toolsDropdown.GetText = () => FluentProvider.GetMessage(toolNames[selectedTool]);
if (toolPanels.Count <= 1)
toolsDropdown.Disabled = true;
SelectTool(toolPanels.FirstOrDefault());
toolDropdownWidget.OnMouseDown = _ => ShowToolsDropDown(toolDropdownWidget);
toolDropdownWidget.GetText = () => toolLabels[selectedPanel];
if (toolPanels.Count == 1)
toolDropdownWidget.Disabled = true;
}
void ShowToolsDropDown(DropDownButtonWidget dropdown)
{
ScrollItemWidget SetupItem(MapTool tool, ScrollItemWidget itemTemplate)
ScrollItemWidget SetupItem(Widget panel, ScrollItemWidget itemTemplate)
{
var item = ScrollItemWidget.Setup(itemTemplate,
() => selectedTool == tool,
() => SelectTool(tool));
() => selectedPanel == panel,
() => SelectTool(panel));
item.Get<LabelWidget>("LABEL").GetText = () => FluentProvider.GetMessage(toolNames[tool]);
item.Get<LabelWidget>("LABEL").GetText = () => toolLabels[panel];
return item;
}
var options = new[] { MapTool.MarkerTiles, MapTool.MapGenerator };
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, SetupItem);
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, toolPanels, SetupItem);
}
void SelectTool(MapTool tool)
void SelectTool(Widget panel)
{
if (tool != selectedTool)
{
var currentToolPanel = toolPanels[selectedTool];
currentToolPanel.Visible = false;
}
if (panel != selectedPanel && selectedPanel != null)
selectedPanel.Visible = false;
selectedTool = tool;
var toolPanel = toolPanels[selectedTool];
toolPanel.Visible = true;
selectedPanel = panel;
if (panel != null)
selectedPanel.Visible = true;
}
}
}

View File

@@ -447,218 +447,6 @@ Container@EDITOR_WORLD_ROOT:
Width: PARENT_WIDTH - 60
Height: 25
Font: Bold
Background@MARKER_TOOL_PANEL:
Y: 25
Width: PARENT_WIDTH
Height: PARENT_HEIGHT - 25
Background: scrollpanel-bg
Logic: MapMarkerTilesLogic
Children:
ScrollPanel@TILE_COLOR_PANEL:
X: 6
Y: 6
Width: PARENT_WIDTH - 19
Height: 31
TopBottomSpacing: 1
ItemSpacing: 1
ScrollBar: Hidden
ScrollbarWidth: 0
ContentHeight: 31
Children:
ScrollItem@TILE_COLOR_TEMPLATE:
Visible: false
Height: 29
Width: 29
IgnoreChildMouseOver: true
Children:
ColorBlock@TILE_PREVIEW:
X: 2
Y: 2
Width: 26
Height: 26
ScrollItem@TILE_ICON_TEMPLATE:
Visible: false
Height: 29
Width: 29
IgnoreChildMouseOver: true
Children:
Image@TILE_ERASE:
X: 6
Y: 6
Width: 26
Height: 26
ImageCollection: editor
ImageName: erase
Button@CLEAR_CURRENT_BUTTON:
X: 6
Y: 42
Width: 100
Height: 25
Text: button-marker-tiles-clear-current
Font: Bold
Button@CLEAR_ALL_BUTTON:
X: 111
Y: 42
Width: 75
Height: 25
Text: button-marker-tiles-clear-all
Font: Bold
Label@ALPHA_LABEL:
X: 6
Y: 72
Width: 265
Height: 25
Align: Left
Text: label-marker-alpha
Slider@ALPHA_SLIDER:
X: 130
Y: 72
Width: 128
Height: 25
Label@ALPHA_VALUE:
X: 260
Y: 72
Width: 30
Height: 25
Align: Left
Label@MODE_LABEL:
X: 6
Y: 102
Width: 260
Height: 25
Align: Left
Text: label-marker-mirror-mode
DropDownButton@MODE_DROPDOWN:
X: 129
Y: 102
Width: 157
Height: 25
Label@NUM_SIDES_LABEL:
X: 6
Y: 132
Width: 256
Height: 25
Align: Left
Text: label-marker-layer-num-sides
Slider@ROTATE_NUM_SIDES_SLIDER:
X: 130
Y: 132
Width: 128
Height: 25
Visible: false
Label@ROTATE_NUM_SIDES_VALUE:
X: 260
Y: 132
Width: 30
Height: 25
Align: Left
Visible: false
DropDownButton@FLIP_NUM_SIDES_DROPDOWN:
X: 129
Y: 132
Width: 157
Height: 25
Label@AXIS_ANGLE_LABEL:
X: 6
Y: 162
Width: 256
Height: 25
Align: Left
Text: label-marker-axis-angle
Visible: false
Slider@AXIS_ANGLE_SLIDER:
X: 130
Y: 162
Width: 128
Height: 25
Visible: false
Label@AXIS_ANGLE_VALUE:
X: 260
Y: 162
Width: 30
Height: 25
Align: Left
Visible: false
ScrollPanel@MAP_GENERATOR_TOOL_PANEL:
Y: 25
Width: PARENT_WIDTH
Height: PARENT_HEIGHT - 25
Visible: false
ScrollBar: Hidden
ScrollbarWidth: 0
Logic: MapGeneratorToolLogic
Children:
LabelForInput@GENERATOR_LABEL:
Y: 5
Width: 65
Height: 25
Align: Right
Font: TinyBold
Text: label-map-generator-generator
For: GENERATOR
DropDownButton@GENERATOR:
X: 70
Y: 5
Width: PARENT_WIDTH - 75
Height: 25
Font: Bold
Button@GENERATE_BUTTON:
X: 5
Y: 45
Width: 95
Height: 25
Text: button-map-generator-generate
Font: Bold
Button@GENERATE_RANDOM_BUTTON:
X: 105
Y: 45
Width: 180
Height: 25
Text: button-map-generator-generate-random
Font: Bold
ScrollPanel@SETTINGS_PANEL:
X: 0
Y: 85
Width: PARENT_WIDTH
Height: PARENT_HEIGHT - 85
Children:
Container@CHECKBOX_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 30
Children:
Checkbox@CHECKBOX:
Width: PARENT_WIDTH
Height: 25
Container@TEXT_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 50
Children:
LabelForInput@LABEL:
Y: 0
Width: PARENT_WIDTH
Height: 20
For: INPUT
TextField@INPUT:
Y: 20
Width: PARENT_WIDTH
Height: 25
Container@DROPDOWN_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 50
Children:
LabelForInput@LABEL:
Y: 0
Width: PARENT_WIDTH
Height: 20
For: DROPDOWN
DropDownButton@DROPDOWN:
Y: 20
Width: PARENT_WIDTH
Height: 25
PanelRoot: EDITOR_WORLD_ROOT
Container@HISTORY_WIDGETS:
X: WINDOW_WIDTH - 295
Y: 318
@@ -1085,3 +873,207 @@ ScrollPanel@OVERLAY_PANEL:
Width: PARENT_WIDTH - 29
Height: 20
Visible: false
Background@MARKER_TOOL_PANEL:
Logic: MapMarkerTilesLogic
Y: 24
Width: PARENT_WIDTH
Height: PARENT_HEIGHT - 25
Background: scrollpanel-bg
Visible: false
Children:
ScrollPanel@TILE_COLOR_PANEL:
X: 6
Y: 6
Width: PARENT_WIDTH - 19
Height: 31
TopBottomSpacing: 1
ItemSpacing: 1
ScrollBar: Hidden
ScrollbarWidth: 0
ContentHeight: 31
Children:
ScrollItem@TILE_COLOR_TEMPLATE:
Visible: false
Height: 29
Width: 29
IgnoreChildMouseOver: true
Children:
ColorBlock@TILE_PREVIEW:
X: 2
Y: 2
Width: 26
Height: 26
ScrollItem@TILE_ICON_TEMPLATE:
Visible: false
Height: 29
Width: 29
IgnoreChildMouseOver: true
Children:
Image@TILE_ERASE:
X: 6
Y: 6
Width: 26
Height: 26
ImageCollection: editor
ImageName: erase
Button@CLEAR_CURRENT_BUTTON:
X: 6
Y: 42
Width: 100
Height: 25
Text: button-marker-tiles-clear-current
Font: Bold
Button@CLEAR_ALL_BUTTON:
X: 111
Y: 42
Width: 75
Height: 25
Text: button-marker-tiles-clear-all
Font: Bold
Label@ALPHA_LABEL:
X: 6
Y: 72
Width: 265
Height: 25
Align: Left
Text: label-marker-alpha
Slider@ALPHA_SLIDER:
X: 130
Y: 72
Width: 128
Height: 25
Label@ALPHA_VALUE:
X: 260
Y: 72
Width: 30
Height: 25
Align: Left
Label@MODE_LABEL:
X: 6
Y: 102
Width: 260
Height: 25
Align: Left
Text: label-marker-mirror-mode
DropDownButton@MODE_DROPDOWN:
X: 129
Y: 102
Width: 157
Height: 25
Label@NUM_SIDES_LABEL:
X: 6
Y: 132
Width: 256
Height: 25
Align: Left
Text: label-marker-layer-num-sides
Slider@ROTATE_NUM_SIDES_SLIDER:
X: 130
Y: 132
Width: 128
Height: 25
Visible: false
Label@ROTATE_NUM_SIDES_VALUE:
X: 260
Y: 132
Width: 30
Height: 25
Align: Left
Visible: false
DropDownButton@FLIP_NUM_SIDES_DROPDOWN:
X: 129
Y: 132
Width: 157
Height: 25
Label@AXIS_ANGLE_LABEL:
X: 6
Y: 162
Width: 256
Height: 25
Align: Left
Text: label-marker-axis-angle
Visible: false
Slider@AXIS_ANGLE_SLIDER:
X: 130
Y: 162
Width: 128
Height: 25
Visible: false
Label@AXIS_ANGLE_VALUE:
X: 260
Y: 162
Width: 30
Height: 25
Align: Left
Visible: false
Container@MAP_GENERATOR_TOOL_PANEL:
Logic: MapGeneratorToolLogic
Y: 24
Width: PARENT_WIDTH
Height: PARENT_HEIGHT - 25
Visible: false
Children:
Background@BUTTON_BG:
Background: panel-black
Width: PARENT_WIDTH
Height: 35
Children:
Button@GENERATE_BUTTON:
X: 5
Y: 5
Width: 95
Height: 25
Text: button-map-generator-generate
Font: Bold
Button@GENERATE_RANDOM_BUTTON:
X: 105
Y: 5
Width: 180
Height: 25
Text: button-map-generator-generate-random
Font: Bold
ScrollPanel@SETTINGS_PANEL:
X: 0
Y: 34
Width: PARENT_WIDTH
Height: PARENT_HEIGHT - 35
Children:
Container@CHECKBOX_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 30
Children:
Checkbox@CHECKBOX:
Width: PARENT_WIDTH
Height: 25
Container@TEXT_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 50
Children:
LabelForInput@LABEL:
Y: 0
Width: PARENT_WIDTH
Height: 20
For: INPUT
TextField@INPUT:
Y: 20
Width: PARENT_WIDTH
Height: 25
Container@DROPDOWN_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 50
Children:
LabelForInput@LABEL:
Y: 0
Width: PARENT_WIDTH
Height: 20
For: DROPDOWN
DropDownButton@DROPDOWN:
Y: 20
Width: PARENT_WIDTH
Height: 25
PanelRoot: EDITOR_WORLD_ROOT

View File

@@ -76,7 +76,6 @@ label-marker-layer-num-sides = Number of Sides
label-marker-alpha = Tile Alpha
label-marker-mirror-mode = Mirror Mode
label-marker-axis-angle = Axis Angle
label-map-generator-generator = Generator
button-map-generator-generate = Generate
button-map-generator-generate-random = Generate Random
@@ -116,7 +115,6 @@ button-select-categories-buttons-all = All
button-select-categories-buttons-none = None
label-tool-marker-tiles = Marker Tiles
label-tool-map-generator = Map Generator
## encyclopedia.yaml, mainmenu.yaml
label-encyclopedia-title = EVA Database

View File

@@ -51,8 +51,8 @@ faction-nod =
and the alien substance Tiberium. They use stealth technology
and guerilla tactics to defeat those who oppose them.
map-generator-experimental = Experimental
map-generator-clear = Clear
map-generator-experimental = Experimental RMG
map-generator-clear = Clear Terrain
## defaults.yaml
notification-unit-lost = Unit lost.

View File

@@ -281,7 +281,6 @@ World:
EditorWorld:
Inherits: ^BaseWorld
Inherits@MapGenerators: ^MapGenerators
EditorActorLayer:
EditorCursorLayer:
EditorResourceLayer:
@@ -302,3 +301,4 @@ EditorWorld:
BuildableTerrainOverlay:
AllowedTerrainTypes: Clear, Road
MarkerLayerOverlay:
Inherits@MapGenerators: ^MapGenerators

View File

@@ -408,220 +408,6 @@ Container@EDITOR_WORLD_ROOT:
Width: PARENT_WIDTH - 70
Height: 25
Font: Bold
Background@MARKER_TOOL_PANEL:
X: 10
Y: 35
Width: PARENT_WIDTH - 20
Height: WINDOW_HEIGHT - 490
Background: scrollpanel-bg
Logic: MapMarkerTilesLogic
Children:
ScrollPanel@TILE_COLOR_PANEL:
X: 6
Y: 6
Width: PARENT_WIDTH - 19
Height: 31
TopBottomSpacing: 1
ItemSpacing: 1
ScrollBar: Hidden
ScrollbarWidth: 0
ContentHeight: 31
Children:
ScrollItem@TILE_COLOR_TEMPLATE:
Visible: false
Height: 29
Width: 29
IgnoreChildMouseOver: true
Children:
ColorBlock@TILE_PREVIEW:
X: 2
Y: 2
Width: 26
Height: 26
ScrollItem@TILE_ICON_TEMPLATE:
Visible: false
Height: 29
Width: 29
IgnoreChildMouseOver: true
Children:
Image@TILE_ERASE:
X: 6
Y: 6
Width: 26
Height: 26
ImageCollection: editor
ImageName: erase
Button@CLEAR_CURRENT_BUTTON:
X: 6
Y: 42
Width: 100
Height: 25
Text: button-marker-tiles-clear-current
Font: Bold
Button@CLEAR_ALL_BUTTON:
X: 111
Y: 42
Width: 75
Height: 25
Text: button-marker-tiles-clear-all
Font: Bold
Label@ALPHA_LABEL:
X: 6
Y: 72
Width: 265
Height: 25
Align: Left
Text: label-marker-alpha
Slider@ALPHA_SLIDER:
X: 130
Y: 72
Width: 128
Height: 25
Label@ALPHA_VALUE:
X: 260
Y: 72
Width: 30
Height: 25
Align: Left
Label@MODE_LABEL:
X: 6
Y: 102
Width: 260
Height: 25
Align: Left
Text: label-marker-mirror-mode
DropDownButton@MODE_DROPDOWN:
X: 129
Y: 102
Width: 157
Height: 25
Label@NUM_SIDES_LABEL:
X: 6
Y: 132
Width: 256
Height: 25
Align: Left
Text: label-marker-layer-num-sides
Slider@ROTATE_NUM_SIDES_SLIDER:
X: 130
Y: 132
Width: 128
Height: 25
Visible: false
Label@ROTATE_NUM_SIDES_VALUE:
X: 260
Y: 132
Width: 30
Height: 25
Align: Left
Visible: false
DropDownButton@FLIP_NUM_SIDES_DROPDOWN:
X: 129
Y: 132
Width: 157
Height: 25
Label@AXIS_ANGLE_LABEL:
X: 6
Y: 162
Width: 256
Height: 25
Align: Left
Text: label-marker-axis-angle
Visible: false
Slider@AXIS_ANGLE_SLIDER:
X: 130
Y: 162
Width: 128
Height: 25
Visible: false
Label@AXIS_ANGLE_VALUE:
X: 260
Y: 162
Width: 30
Height: 25
Align: Left
Visible: false
ScrollPanel@MAP_GENERATOR_TOOL_PANEL:
X: 9
Y: 35
Width: 290
Height: WINDOW_HEIGHT - 490
Visible: false
ScrollBar: Hidden
ScrollbarWidth: 0
Logic: MapGeneratorToolLogic
Children:
LabelForInput@GENERATOR_LABEL:
Y: 5
Width: 65
Height: 25
Align: Right
Font: TinyBold
Text: label-map-generator-generator
For: GENERATOR
DropDownButton@GENERATOR:
X: 70
Y: 5
Width: PARENT_WIDTH - 75
Height: 25
Font: Bold
Button@GENERATE_BUTTON:
X: 5
Y: 45
Width: 95
Height: 25
Text: button-map-generator-generate
Font: Bold
Button@GENERATE_RANDOM_BUTTON:
X: 105
Y: 45
Width: 180
Height: 25
Text: button-map-generator-generate-random
Font: Bold
ScrollPanel@SETTINGS_PANEL:
X: 0
Y: 85
Width: PARENT_WIDTH
Height: PARENT_HEIGHT - 85
Children:
Container@CHECKBOX_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 30
Children:
Checkbox@CHECKBOX:
Width: PARENT_WIDTH
Height: 25
Container@TEXT_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 50
Children:
LabelForInput@LABEL:
Y: 0
Width: PARENT_WIDTH
Height: 20
For: INPUT
TextField@INPUT:
Y: 20
Width: PARENT_WIDTH
Height: 25
Container@DROPDOWN_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 50
Children:
LabelForInput@LABEL:
Y: 0
Width: PARENT_WIDTH
Height: 20
For: DROPDOWN
DropDownButton@DROPDOWN:
Y: 20
Width: PARENT_WIDTH
Height: 25
PanelRoot: EDITOR_WORLD_ROOT
Container@HISTORY_WIDGETS:
X: WINDOW_WIDTH - 320
Y: 354
@@ -1062,3 +848,205 @@ ScrollPanel@OVERLAY_PANEL:
Width: PARENT_WIDTH - 29
Height: 20
Visible: false
Background@MARKER_TOOL_PANEL:
X: 10
Y: 35
Width: PARENT_WIDTH - 20
Height: WINDOW_HEIGHT - 490
Background: scrollpanel-bg
Logic: MapMarkerTilesLogic
Children:
ScrollPanel@TILE_COLOR_PANEL:
X: 6
Y: 6
Width: PARENT_WIDTH - 19
Height: 31
TopBottomSpacing: 1
ItemSpacing: 1
ScrollBar: Hidden
ScrollbarWidth: 0
ContentHeight: 31
Children:
ScrollItem@TILE_COLOR_TEMPLATE:
Visible: false
Height: 29
Width: 29
IgnoreChildMouseOver: true
Children:
ColorBlock@TILE_PREVIEW:
X: 2
Y: 2
Width: 26
Height: 26
ScrollItem@TILE_ICON_TEMPLATE:
Visible: false
Height: 29
Width: 29
IgnoreChildMouseOver: true
Children:
Image@TILE_ERASE:
X: 6
Y: 6
Width: 26
Height: 26
ImageCollection: editor
ImageName: erase
Button@CLEAR_CURRENT_BUTTON:
X: 6
Y: 42
Width: 100
Height: 25
Text: button-marker-tiles-clear-current
Font: Bold
Button@CLEAR_ALL_BUTTON:
X: 111
Y: 42
Width: 75
Height: 25
Text: button-marker-tiles-clear-all
Font: Bold
Label@ALPHA_LABEL:
X: 6
Y: 72
Width: 265
Height: 25
Align: Left
Text: label-marker-alpha
Slider@ALPHA_SLIDER:
X: 130
Y: 72
Width: 128
Height: 25
Label@ALPHA_VALUE:
X: 260
Y: 72
Width: 30
Height: 25
Align: Left
Label@MODE_LABEL:
X: 6
Y: 102
Width: 260
Height: 25
Align: Left
Text: label-marker-mirror-mode
DropDownButton@MODE_DROPDOWN:
X: 129
Y: 102
Width: 157
Height: 25
Label@NUM_SIDES_LABEL:
X: 6
Y: 132
Width: 256
Height: 25
Align: Left
Text: label-marker-layer-num-sides
Slider@ROTATE_NUM_SIDES_SLIDER:
X: 130
Y: 132
Width: 128
Height: 25
Visible: false
Label@ROTATE_NUM_SIDES_VALUE:
X: 260
Y: 132
Width: 30
Height: 25
Align: Left
Visible: false
DropDownButton@FLIP_NUM_SIDES_DROPDOWN:
X: 129
Y: 132
Width: 157
Height: 25
Label@AXIS_ANGLE_LABEL:
X: 6
Y: 162
Width: 256
Height: 25
Align: Left
Text: label-marker-axis-angle
Visible: false
Slider@AXIS_ANGLE_SLIDER:
X: 130
Y: 162
Width: 128
Height: 25
Visible: false
Label@AXIS_ANGLE_VALUE:
X: 260
Y: 162
Width: 30
Height: 25
Align: Left
Visible: false
ScrollPanel@MAP_GENERATOR_TOOL_PANEL:
X: 9
Y: 35
Width: 290
Height: WINDOW_HEIGHT - 490
Visible: false
ScrollBar: Hidden
ScrollbarWidth: 0
Logic: MapGeneratorToolLogic
Children:
Button@GENERATE_BUTTON:
X: 5
Y: 5
Width: 95
Height: 25
Text: button-map-generator-generate
Font: Bold
Button@GENERATE_RANDOM_BUTTON:
X: 105
Y: 5
Width: 180
Height: 25
Text: button-map-generator-generate-random
Font: Bold
ScrollPanel@SETTINGS_PANEL:
X: 0
Y: 35
Width: PARENT_WIDTH
Height: PARENT_HEIGHT - 35
Children:
Container@CHECKBOX_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 30
Children:
Checkbox@CHECKBOX:
Width: PARENT_WIDTH
Height: 25
Container@TEXT_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 50
Children:
LabelForInput@LABEL:
Y: 0
Width: PARENT_WIDTH
Height: 20
For: INPUT
TextField@INPUT:
Y: 20
Width: PARENT_WIDTH
Height: 25
Container@DROPDOWN_TEMPLATE:
X: 5
Width: PARENT_WIDTH - 35
Height: 50
Children:
LabelForInput@LABEL:
Y: 0
Width: PARENT_WIDTH
Height: 20
For: DROPDOWN
DropDownButton@DROPDOWN:
Y: 20
Width: PARENT_WIDTH
Height: 25
PanelRoot: EDITOR_WORLD_ROOT

View File

@@ -72,7 +72,6 @@ label-marker-layer-num-sides = Number of Sides
label-marker-alpha = Tile Alpha
label-marker-mirror-mode = Mirror Mode
label-marker-axis-angle = Axis Angle
label-map-generator-generator = Generator
button-map-generator-generate = Generate
button-map-generator-generate-random = Generate Random
@@ -116,7 +115,6 @@ button-select-categories-buttons-all = All
button-select-categories-buttons-none = None
label-tool-marker-tiles = Marker Tiles
label-tool-map-generator = Map Generator
## gamesave-browser.yaml
label-gamesave-browser-panel-load-title = Load game

View File

@@ -34,8 +34,8 @@ options-starting-units =
resource-minerals = Valuable Minerals
map-generator-experimental = Experimental
map-generator-clear = Clear
map-generator-experimental = Experimental RMG
map-generator-clear = Clear Terrain
## Faction
faction-allies =

View File

@@ -299,7 +299,6 @@ World:
EditorWorld:
Inherits: ^BaseWorld
Inherits@MapGenerators: ^MapGenerators
EditorActorLayer:
EditorCursorLayer:
EditorResourceLayer:
@@ -320,3 +319,4 @@ EditorWorld:
BuildableTerrainOverlay:
AllowedTerrainTypes: Clear, Road
MarkerLayerOverlay:
Inherits@MapGenerators: ^MapGenerators