PPos is best thought of as a cell grid applied in screen space. Multiple cells with different terrain heights may be projected to the same PPos, or to multiple PPos if they do not align with the screen grid. PPos coordinates are used primarily for map edge checks and shroud / visibility queries.
102 lines
3.2 KiB
C#
102 lines
3.2 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 maxTerrainHeight = Game.ModData.Manifest.MaximumTerrainHeight;
|
|
var tileset = modRules.TileSets[tilesetDropDown.Text];
|
|
var map = new Map(tileset, width + 2, height + maxTerrainHeight + 2);
|
|
|
|
var tl = new PPos(1, 1);
|
|
var br = new PPos(width, height + maxTerrainHeight);
|
|
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 }
|
|
});
|
|
};
|
|
}
|
|
}
|
|
}
|