101 lines
3.1 KiB
C#
101 lines
3.1 KiB
C#
#region Copyright & License Information
|
|
/*
|
|
* Copyright 2007-2015 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. For more information,
|
|
* see COPYING.
|
|
*/
|
|
#endregion
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using OpenRA;
|
|
using OpenRA.FileFormats;
|
|
using OpenRA.Mods.Common.Widgets;
|
|
using OpenRA.Traits;
|
|
using OpenRA.Widgets;
|
|
|
|
namespace OpenRA.Mods.Common.Widgets.Logic
|
|
{
|
|
public class NewMapLogic
|
|
{
|
|
Widget panel;
|
|
|
|
[ObjectCreator.UseCtor]
|
|
public NewMapLogic(Action onExit, Action<string> onSelect, Ruleset modRules, Widget widget, World world)
|
|
{
|
|
panel = widget;
|
|
|
|
panel.Get<ButtonWidget>("CANCEL_BUTTON").OnClick = () => { Ui.CloseWindow(); onExit(); };
|
|
|
|
var tilesetDropDown = panel.Get<DropDownButtonWidget>("TILESET");
|
|
var tilesets = modRules.TileSets.Select(t => t.Key).ToList();
|
|
Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
|
|
{
|
|
var item = ScrollItemWidget.Setup(template,
|
|
() => tilesetDropDown.Text == option,
|
|
() => { tilesetDropDown.Text = option; });
|
|
item.Get<LabelWidget>("LABEL").GetText = () => option;
|
|
return item;
|
|
};
|
|
tilesetDropDown.Text = tilesets.First();
|
|
tilesetDropDown.OnClick = () =>
|
|
tilesetDropDown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 210, tilesets, setupItem);
|
|
|
|
var widthTextField = panel.Get<TextFieldWidget>("WIDTH");
|
|
var heightTextField = panel.Get<TextFieldWidget>("HEIGHT");
|
|
|
|
panel.Get<ButtonWidget>("CREATE_BUTTON").OnClick = () =>
|
|
{
|
|
int width, height;
|
|
int.TryParse(widthTextField.Text, out width);
|
|
int.TryParse(heightTextField.Text, out 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 tileset = modRules.TileSets[tilesetDropDown.Text];
|
|
var map = new Map(tileset, width + 2, height + tileset.MaxGroundHeight + 2);
|
|
|
|
var tl = new MPos(1, 1);
|
|
var br = new MPos(width, height + tileset.MaxGroundHeight);
|
|
map.SetBounds(tl, br);
|
|
|
|
map.PlayerDefinitions = new MapPlayers(map.Rules, map.SpawnPoints.Value.Length).ToMiniYaml();
|
|
map.FixOpenAreas(modRules);
|
|
|
|
Action<string> afterSave = uid =>
|
|
{
|
|
// HACK: Work around a synced-code change check.
|
|
// It's not clear why this is needed here, but not in the other places that load maps.
|
|
Game.RunAfterTick(() =>
|
|
{
|
|
ConnectionLogic.Connect(System.Net.IPAddress.Loopback.ToString(),
|
|
Game.CreateLocalServer(uid), "",
|
|
() => Game.LoadEditor(uid),
|
|
() => { Game.CloseServer(); onExit(); });
|
|
});
|
|
|
|
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 }
|
|
});
|
|
};
|
|
}
|
|
}
|
|
}
|