示例#1
0
        public Rectangle TemplateBounds(TerrainTemplateInfo template, Size tileSize, MapGridType mapGrid)
        {
            Rectangle?templateRect = null;

            var i = 0;

            for (var y = 0; y < template.Size.Y; y++)
            {
                for (var x = 0; x < template.Size.X; x++)
                {
                    var tile     = new TerrainTile(template.Id, (byte)(i++));
                    var tileInfo = tileset.GetTileInfo(tile);

                    // Empty tile
                    if (tileInfo == null)
                    {
                        continue;
                    }

                    var sprite = TileSprite(tile);
                    var u      = mapGrid == MapGridType.Rectangular ? x : (x - y) / 2f;
                    var v      = mapGrid == MapGridType.Rectangular ? y : (x + y) / 2f;

                    var tl   = new float2(u * tileSize.Width, (v - 0.5f * tileInfo.Height) * tileSize.Height) - 0.5f * sprite.Size;
                    var rect = new Rectangle((int)(tl.X + sprite.Offset.X), (int)(tl.Y + sprite.Offset.Y), (int)sprite.Size.X, (int)sprite.Size.Y);
                    templateRect = templateRect.HasValue ? Rectangle.Union(templateRect.Value, rect) : rect;
                }
            }

            return(templateRect.HasValue ? templateRect.Value : Rectangle.Empty);
        }
示例#2
0
 public LaysTerrain(Actor self, LaysTerrainInfo info)
 {
     this.info = info;
     layer     = self.World.WorldActor.Trait <BuildableTerrainLayer>();
     bi        = self.World.WorldActor.Trait <BuildingInfluence>();
     template  = self.World.TileSet.Templates[info.Template];
 }
 public TileSelectorTemplate(TerrainTemplateInfo template)
 {
     Template    = template;
     Categories  = template.Categories;
     Tooltip     = template.Id.ToString();
     SearchTerms = new[] { Tooltip };
 }
示例#4
0
 public LaysTerrain(Actor self, LaysTerrainInfo info)
 {
     this.info    = info;
     layer        = self.World.WorldActor.Trait <CustomTerrainLayer>();
     template     = self.World.Map.Rules.TileSet.Templates[info.Template];
     buildingInfo = self.Info.TraitInfo <BuildingInfo>();
 }
示例#5
0
        Rectangle ITiledTerrainRenderer.TemplateBounds(TerrainTemplateInfo template)
        {
            Rectangle?templateRect = null;
            var       tileSize     = map.Grid.TileSize;

            var i = 0;

            for (var y = 0; y < template.Size.Y; y++)
            {
                for (var x = 0; x < template.Size.X; x++)
                {
                    var tile = new TerrainTile(template.Id, (byte)(i++));
                    if (!terrainInfo.TryGetTileInfo(tile, out var tileInfo))
                    {
                        continue;
                    }

                    var sprite = tileCache.TileSprite(tile);
                    var u      = map.Grid.Type == MapGridType.Rectangular ? x : (x - y) / 2f;
                    var v      = map.Grid.Type == MapGridType.Rectangular ? y : (x + y) / 2f;

                    var tl   = new float2(u * tileSize.Width, (v - 0.5f * tileInfo.Height) * tileSize.Height) - 0.5f * sprite.Size;
                    var rect = new Rectangle((int)(tl.X + sprite.Offset.X), (int)(tl.Y + sprite.Offset.Y), (int)sprite.Size.X, (int)sprite.Size.Y);
                    templateRect = templateRect.HasValue ? Rectangle.Union(templateRect.Value, rect) : rect;
                }
            }

            return(templateRect ?? Rectangle.Empty);
        }
示例#6
0
 public LaysTerrain(Actor self, LaysTerrainInfo info)
     : base(info)
 {
     layer        = self.World.WorldActor.Trait <BuildableTerrainLayer>();
     template     = self.World.Map.Rules.TileSet.Templates[info.Template];
     buildingInfo = self.Info.TraitInfo <BuildingInfo>();
 }
示例#7
0
 public D2LaysTerrain(Actor self, D2LaysTerrainInfo info)
 {
     this.info    = info;
     layer        = self.World.WorldActor.Trait <D2BuildableTerrainLayer>();
     bi           = self.World.WorldActor.Trait <BuildingInfluence>();
     template     = self.World.Map.Rules.TileSet.Templates[info.Template];
     buildingInfo = self.Info.TraitInfo <BuildingInfo>();
 }
示例#8
0
 protected TerrainTemplatePreviewWidget(TerrainTemplatePreviewWidget other)
     : base(other)
 {
     worldRenderer   = other.worldRenderer;
     terrainRenderer = other.terrainRenderer;
     Template        = other.Template;
     GetScale        = other.GetScale;
 }
 protected TerrainTemplatePreviewWidget(TerrainTemplatePreviewWidget other)
     : base(other)
 {
     worldRenderer = other.worldRenderer;
     tileset       = other.worldRenderer.World.Map.Rules.TileSet;
     Template      = other.Template;
     GetScale      = other.GetScale;
 }
		protected TerrainTemplatePreviewWidget(TerrainTemplatePreviewWidget other)
			: base(other)
		{
			worldRenderer = other.worldRenderer;
			tileset = other.worldRenderer.World.Map.Rules.TileSets[other.worldRenderer.World.Map.Tileset];
			Template = other.Template;
			GetScale = other.GetScale;
		}
示例#11
0
        public FloodFillEditorAction(ushort template, Map map, CPos cell)
        {
            this.template = template;
            this.map      = map;
            this.cell     = cell;

            var tileset = map.Rules.TileSet;

            terrainTemplate = tileset.Templates[template];
            Text            = "Filled with tile {0}".F(terrainTemplate.Id);
        }
示例#12
0
        public PaintTileEditorAction(ushort template, Map map, CPos cell)
        {
            this.template = template;
            this.map      = map;
            this.cell     = cell;

            var tileset = map.Rules.TileSet;

            terrainTemplate = tileset.Templates[template];
            Text            = "Added tile {0}".F(terrainTemplate.Id);
        }
示例#13
0
        public FloodFillEditorAction(ushort template, Map map, CPos cell)
        {
            this.template = template;
            this.map      = map;
            this.cell     = cell;

            var terrainInfo = (ITemplatedTerrainInfo)map.Rules.TerrainInfo;

            terrainTemplate = terrainInfo.Templates[template];
            Text            = $"Filled with tile {terrainTemplate.Id}";
        }
示例#14
0
        public PaintTileEditorAction(ushort template, Map map, CPos cell)
        {
            this.template = template;
            this.map      = map;
            this.cell     = cell;

            var terrainInfo = (ITemplatedTerrainInfo)map.Rules.TerrainInfo;

            terrainTemplate = terrainInfo.Templates[template];
            Text            = $"Added tile {terrainTemplate.Id}";
        }
示例#15
0
        public int SetTerrainTemplate(WorldRenderer wr, TerrainTemplateInfo template)
        {
            terrainOrResourceCell = wr.Viewport.ViewToWorld(wr.Viewport.WorldToViewPx(Viewport.LastMousePos));

            Type                   = EditorCursorType.TerrainTemplate;
            TerrainTemplate        = template;
            Actor                  = null;
            Resource               = null;
            terrainOrResourceDirty = true;

            return(++CurrentToken);
        }
示例#16
0
        public LaysTerrain(Actor self, LaysTerrainInfo info)
        {
            this.info = info;
            layer     = self.World.WorldActor.Trait <CustomTerrainLayer>();

            var terrainInfo = self.World.Map.Rules.TerrainInfo as ITemplatedTerrainInfo;

            if (terrainInfo == null)
            {
                throw new InvalidDataException("LaysTerrain requires a template-based tileset.");
            }

            template = terrainInfo.Templates[info.Template];

            buildingInfo = self.Info.TraitInfo <BuildingInfo>();
        }
示例#17
0
        MiniYaml SaveTemplate(TerrainTemplateInfo t, TileSet tileSet)
        {
            var defaultTemplate = new TerrainTemplateInfo(0, new string[] { null }, int2.Zero, null);
            var root            = FieldSaver.SaveDifferences(t, defaultTemplate);

            var tileYaml = new List <MiniYamlNode>();

            for (var i = 0; i < t.TilesCount; i++)
            {
                var tileInfo = t[i];
                if (tileInfo != null)
                {
                    tileYaml.Add(new MiniYamlNode(i.ToString(), SaveTileInfo(tileInfo, tileSet)));
                }
            }

            root.Nodes.Add(new MiniYamlNode("Tiles", null, tileYaml));
            return(root);
        }
示例#18
0
        bool PlacementOverlapsSameTemplate(TerrainTemplateInfo template, CPos cell)
        {
            var map = world.Map;
            var i   = 0;

            for (var y = 0; y < template.Size.Y; y++)
            {
                for (var x = 0; x < template.Size.X; x++, i++)
                {
                    if (template.Contains(i) && template[i] != null)
                    {
                        var c = cell + new CVec(x, y);
                        if (map.Contains(c) && map.MapTiles.Value[c].Type == template.Id)
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
示例#19
0
        void Export(string outputDir)
        {
            var dir = Platform.ResolvePath("^", outputDir);

            Directory.CreateDirectory(dir);
            var tilesetName = txtTilesetName.Text;
            var tilesetID   = txtID.Text;
            var tilesetExt  = txtExt.Text;

            if (tilesetName.Length < 1)
            {
                tilesetName = "Temperat";
            }
            if (tilesetID.Length < 1)
            {
                tilesetID = "TEMPERAT";
            }
            if (tilesetExt.Length < 1)
            {
                tilesetExt = ".tem";
            }

            // Create a Tileset definition
            // TODO: Pull this info from the GUI
            var tilesetFile = tilesetName.ToLower();

            if (tilesetFile.Length < 8)
            {
                tilesetFile = tilesetName.ToLower() + ".yaml";
            }
            else
            {
                tilesetFile = tilesetName.ToLower().Substring(0, 8) + ".yaml";
            }

            var tileset = new TileSet(
                name: tilesetName,
                id: tilesetID.ToUpper(),
                terrainInfo: terrainType);

            // List of files to add to the mix file
            var fileList = new List <string>();

            // Export tile artwork
            foreach (var t in surface1.Templates)
            {
                fileList.Add(ExportTemplate(t, surface1.Templates.IndexOf(t), tilesetExt, dir));
            }

            // Add the templates
            ushort cur = 0;

            templates.Clear();
            foreach (var tp in surface1.Templates)
            {
                var tiles = new byte[tp.Width * tp.Height];
                foreach (var t in tp.Cells)
                {
                    var ttype = terrainType[surface1.TerrainTypes[t.Key.X, t.Key.Y]].Type;
                    var idx   = (t.Key.X - tp.Left) + tp.Width * (t.Key.Y - tp.Top);
                    tiles[idx] = tileset.GetTerrainIndex(ttype);
                }

                var template = new TerrainTemplateInfo(
                    id: cur,
                    images: new[] { "{0}{1:00}".F(txtTilesetName.Text, cur) },
                    size: new int2(tp.Width, tp.Height),
                    tiles: tiles);

                // HACK: This part of the TileSet code is broken upstream
                var field = template.GetType()
                            .GetField("tileInfo", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                field.SetValue(template, tiles.Select(t =>
                {
                    var info = new TerrainTileInfo();
                    info.GetType().GetField("TerrainType").SetValue(info, t);
                    return(info);
                }).ToArray());

                templates[cur] = template;
                cur++;
            }

            SaveTileSet(tileset, Path.Combine(dir, tilesetFile));
            Console.WriteLine("Finished export");
        }
示例#20
0
        public void Export(string outputDir)
        {
            var dir = Platform.ResolvePath("^", outputDir);

            Directory.CreateDirectory(dir);
            var tilesetName    = txtTilesetName.Text;
            var tilesetID      = txtID.Text;
            var tilesetPalette = txtPal.Text;
            var tilesetExt     = txtExt.Text;

            if (tilesetName.Length < 1)
            {
                tilesetName = "Temperat";
            }
            if (tilesetID.Length < 1)
            {
                tilesetID = "TEMPERAT";
            }
            if (tilesetPalette.Length < 1)
            {
                tilesetPalette = "temperat";
            }
            if (tilesetExt.Length < 1)
            {
                tilesetExt = ".tem";
            }

            // Create a Tileset definition
            // TODO: Pull this info from the GUI
            var tilesetFile = "";

            tilesetFile = tilesetName.ToLower();
            if (tilesetFile.Length < 8)
            {
                tilesetFile = tilesetName.ToLower() + ".yaml";
            }
            else
            {
                tilesetFile = tilesetName.ToLower().Substring(0, 8) + ".yaml";
            }

            var tileset = new TileSet(
                name: tilesetName,
                id: tilesetID.ToUpper(),
                palette: tilesetPalette.ToLower(),
                terrainInfo: TerrainType);

            // List of files to add to the mix file
            var fileList = new List <string>();

            // Export palette (use the embedded palette)
            var p = surface1.Image.Palette.Entries.ToList();

            fileList.Add(ExportPalette(p, Path.Combine(dir, tileset.Palette)));

            // Export tile artwork
            foreach (var t in surface1.Templates)
            {
                fileList.Add(ExportTemplate(t, surface1.Templates.IndexOf(t), tilesetExt, dir));
            }

            // Add the templates
            ushort cur = 0;

            foreach (var tp in surface1.Templates)
            {
                var tiles = new byte[tp.Width * tp.Height];
                foreach (var t in tp.Cells)
                {
                    var ttype = TerrainType[surface1.TerrainTypes[t.Key.X, t.Key.Y]].Type;
                    var idx   = (t.Key.X - tp.Left) + tp.Width * (t.Key.Y - tp.Top);
                    tiles[idx] = tileset.GetTerrainIndex(ttype);
                }

                var template = new TerrainTemplateInfo(
                    id: cur,
                    images: new[] { "{0}{1:00}".F(txtTilesetName.Text, cur) },
                    size: new int2(tp.Width, tp.Height),
                    tiles: tiles);

                tileset.Templates.Add(cur, template);
                cur++;
            }

            tileset.Save(Path.Combine(dir, tilesetFile));
            Console.WriteLine("Finished export");
        }
示例#21
0
        void Export(string outputDir)
        {
            var dir = Platform.ResolvePath("^", outputDir);
            Directory.CreateDirectory(dir);
            var tilesetName = txtTilesetName.Text;
            var tilesetID = txtID.Text;
            var tilesetPalette = txtPal.Text;
            var tilesetExt = txtExt.Text;

            if (tilesetName.Length < 1) tilesetName = "Temperat";
            if (tilesetID.Length < 1) tilesetID = "TEMPERAT";
            if (tilesetPalette.Length < 1) tilesetPalette = "temperat";
            if (tilesetExt.Length < 1) tilesetExt = ".tem";

            // Create a Tileset definition
            // TODO: Pull this info from the GUI
            var tilesetFile = "";
            tilesetFile = tilesetName.ToLower();
            if (tilesetFile.Length < 8)
                tilesetFile = tilesetName.ToLower() + ".yaml";
            else
                tilesetFile = tilesetName.ToLower().Substring(0, 8) + ".yaml";

            var tileset = new TileSet(
                name: tilesetName,
                id: tilesetID.ToUpper(),
                palette: tilesetPalette.ToLower(),
                terrainInfo: terrainType);

            // List of files to add to the mix file
            var fileList = new List<string>();

            // Export palette (use the embedded palette)
            var p = surface1.Image.Palette.Entries.ToList();
            fileList.Add(ExportPalette(p, Path.Combine(dir, tileset.Palette)));

            // Export tile artwork
            foreach (var t in surface1.Templates)
                fileList.Add(ExportTemplate(t, surface1.Templates.IndexOf(t), tilesetExt, dir));

            // Add the templates
            ushort cur = 0;
            foreach (var tp in surface1.Templates)
            {
                var tiles = new byte[tp.Width * tp.Height];
                foreach (var t in tp.Cells)
                {
                    var ttype = terrainType[surface1.TerrainTypes[t.Key.X, t.Key.Y]].Type;
                    var idx = (t.Key.X - tp.Left) + tp.Width * (t.Key.Y - tp.Top);
                    tiles[idx] = tileset.GetTerrainIndex(ttype);
                }

                var template = new TerrainTemplateInfo(
                    id: cur,
                    images: new[] { "{0}{1:00}".F(txtTilesetName.Text, cur) },
                    size: new int2(tp.Width, tp.Height),
                    tiles: tiles);

                tileset.Templates.Add(cur, template);
                cur++;
            }

            tileset.Save(Path.Combine(dir, tilesetFile));
            Console.WriteLine("Finished export");
        }
示例#22
0
        IEnumerable <IRenderable> ITiledTerrainRenderer.RenderUIPreview(WorldRenderer wr, TerrainTemplateInfo t, int2 origin, float scale)
        {
            var template = t as DefaultTerrainTemplateInfo;

            if (template == null)
            {
                yield break;
            }

            var ts       = map.Grid.TileSize;
            var gridType = map.Grid.Type;

            var i = 0;

            for (var y = 0; y < template.Size.Y; y++)
            {
                for (var x = 0; x < template.Size.X; x++)
                {
                    var tile = new TerrainTile(template.Id, (byte)i++);
                    if (!terrainInfo.TryGetTileInfo(tile, out var tileInfo))
                    {
                        continue;
                    }

                    var sprite  = tileCache.TileSprite(tile, 0);
                    var u       = gridType == MapGridType.Rectangular ? x : (x - y) / 2f;
                    var v       = gridType == MapGridType.Rectangular ? y : (x + y) / 2f;
                    var offset  = (new float2(u * ts.Width, (v - 0.5f * tileInfo.Height) * ts.Height) - 0.5f * sprite.Size.XY).ToInt2();
                    var palette = template.Palette ?? TileSet.TerrainPaletteInternalName;

                    yield return(new UISpriteRenderable(sprite, WPos.Zero, origin + offset, 0, wr.Palette(palette), scale));
                }
            }
        }
示例#23
0
文件: Theater.cs 项目: pchote/OpenRA
        public Rectangle TemplateBounds(TerrainTemplateInfo template, Size tileSize, MapGridType mapGrid)
        {
            Rectangle? templateRect = null;

            var i = 0;
            for (var y = 0; y < template.Size.Y; y++)
            {
                for (var x = 0; x < template.Size.X; x++)
                {
                    var tile = new TerrainTile(template.Id, (byte)(i++));
                    var tileInfo = tileset.GetTileInfo(tile);

                    // Empty tile
                    if (tileInfo == null)
                        continue;

                    var sprite = TileSprite(tile);
                    var u = mapGrid == MapGridType.Rectangular ? x : (x - y) / 2f;
                    var v = mapGrid == MapGridType.Rectangular ? y : (x + y) / 2f;

                    var tl = new float2(u * tileSize.Width, (v - 0.5f * tileInfo.Height) * tileSize.Height) - 0.5f * sprite.Size;
                    var rect = new Rectangle((int)(tl.X + sprite.Offset.X), (int)(tl.Y + sprite.Offset.Y), (int)sprite.Size.X, (int)sprite.Size.Y);
                    templateRect = templateRect.HasValue ? Rectangle.Union(templateRect.Value, rect) : rect;
                }
            }

            return templateRect.HasValue ? templateRect.Value : Rectangle.Empty;
        }
示例#24
0
		bool PlacementOverlapsSameTemplate(TerrainTemplateInfo template, CPos cell)
		{
			var map = world.Map;
			var mapTiles = map.MapTiles.Value;
			var i = 0;
			for (var y = 0; y < template.Size.Y; y++)
			{
				for (var x = 0; x < template.Size.X; x++, i++)
				{
					if (template.Contains(i) && template[i] != null)
					{
						var c = cell + new CVec(x, y);
						if (mapTiles.Contains(c) && mapTiles[c].Type == template.Id)
							return true;
					}
				}
			}

			return false;
		}
示例#25
0
        IEnumerable <IRenderable> ITiledTerrainRenderer.RenderPreview(WorldRenderer wr, TerrainTemplateInfo t, WPos origin)
        {
            if (!(t is DefaultTerrainTemplateInfo template))
            {
                yield break;
            }

            var i = 0;

            for (var y = 0; y < template.Size.Y; y++)
            {
                for (var x = 0; x < template.Size.X; x++)
                {
                    var tile = new TerrainTile(template.Id, (byte)i++);
                    if (!terrainInfo.TryGetTileInfo(tile, out var tileInfo))
                    {
                        continue;
                    }

                    var sprite  = tileCache.TileSprite(tile, 0);
                    var offset  = map.Offset(new CVec(x, y), tileInfo.Height);
                    var palette = wr.Palette(template.Palette ?? TileSet.TerrainPaletteInternalName);

                    yield return(new SpriteRenderable(sprite, origin, offset, 0, palette, 1, false));
                }
            }
        }