#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. * * OpenRA is free software: you can redistribute it and/or modify * it 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. * * OpenRA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenRA. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Drawing; using System.Linq; namespace OpenRA.FileFormats { public class MapStub { public IFolder Package; // Yaml map data public string Uid; public bool Selectable; public string Title; public string Description; public string Author; public int PlayerCount; public string Tileset; public Dictionary Waypoints = new Dictionary(); public IEnumerable SpawnPoints { get { return Waypoints.Select(kv => kv.Value); } } public int2 TopLeft; public int2 BottomRight; public int Width { get { return BottomRight.X - TopLeft.X; } } public int Height { get { return BottomRight.Y - TopLeft.Y; } } public Lazy Preview; static List Fields = new List() { "Selectable", "Title", "Description", "Author", "PlayerCount", "Tileset", "TopLeft", "BottomRight" }; public MapStub(IFolder package) { Package = package; var yaml = MiniYaml.FromStream(Package.GetContent("map.yaml")); FieldLoader.LoadFields(this, yaml, Fields); // Waypoints foreach (var wp in yaml["Waypoints"].Nodes) { string[] loc = wp.Value.Value.Split(','); Waypoints.Add(wp.Key, new int2(int.Parse(loc[0]), int.Parse(loc[1]))); } Preview = Lazy.New( () => new Bitmap(Package.GetContent("preview.png")) ); Uid = Package.GetContent("map.uid").ReadAllText(); } public int2 ConvertToPreview(int2 point, Rectangle container) { float scale = Math.Min(container.Width * 1.0f / Width, container.Height * 1.0f / Height); var size = Math.Max(Width, Height); var dw = (int)(scale * (size - Width)) / 2; var dh = (int)(scale * (size - Height)) / 2; return new int2(container.X + dw + (int)(scale*(point.X - TopLeft.X)) , container.Y + dh + (int)(scale*(point.Y - TopLeft.Y))); } public Rectangle PreviewBounds(Rectangle container) { float scale = Math.Min(container.Width * 1.0f / Width, container.Height * 1.0f / Height); var size = Math.Max(Width, Height); var dw = (int)(scale * (size - Width)) / 2; var dh = (int)(scale * (size - Height)) / 2; return new Rectangle(container.X + dw, container.Y + dh, (int)(Width * scale), (int)(Height * scale)); } } }