#region Copyright & License Information /* * Copyright 2007-2022 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. */ #endregion using System; using System.Linq; using OpenRA.Mods.Common.Terrain; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic { public class NewMapLogic : ChromeLogic { readonly Widget panel; [ObjectCreator.UseCtor] public NewMapLogic(Action onExit, Action onSelect, Widget widget, World world, ModData modData) { panel = widget; panel.Get("CANCEL_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); }; var tilesetDropDown = panel.Get("TILESET"); var tilesets = modData.DefaultTerrainInfo.Keys; Func setupItem = (option, template) => { var item = ScrollItemWidget.Setup(template, () => tilesetDropDown.Text == option, () => { tilesetDropDown.Text = option; }); item.Get("LABEL").GetText = () => option; return item; }; tilesetDropDown.Text = tilesets.First(); tilesetDropDown.OnClick = () => tilesetDropDown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 210, tilesets, setupItem); var widthTextField = panel.Get("WIDTH"); var heightTextField = panel.Get("HEIGHT"); panel.Get("CREATE_BUTTON").OnClick = () => { int.TryParse(widthTextField.Text, out var width); int.TryParse(heightTextField.Text, out var height); // Require at least a 2x2 playable area so that the // ground is visible through the edge shroud width = Math.Max(2, width); height = Math.Max(2, height); var maxTerrainHeight = world.Map.Grid.MaximumTerrainHeight; var tileset = modData.DefaultTerrainInfo[tilesetDropDown.Text]; var map = new Map(Game.ModData, tileset, width + 2, height + maxTerrainHeight + 2); var tl = new PPos(1, 1 + maxTerrainHeight); var br = new PPos(width, height + maxTerrainHeight); map.SetBounds(tl, br); map.PlayerDefinitions = new MapPlayers(map.Rules, 0).ToMiniYaml(); if (map.Rules.TerrainInfo is ITerrainInfoNotifyMapCreated notifyMapCreated) notifyMapCreated.MapCreated(map); Action afterSave = uid => { Game.LoadEditor(uid); Ui.CloseWindow(); onSelect(uid); }; Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs() { { "onSave", afterSave }, { "onExit", () => { Ui.CloseWindow(); onExit(); } }, { "map", map }, { "playerDefinitions", map.PlayerDefinitions }, { "actorDefinitions", map.ActorDefinitions } }); }; } } }