Exemplo n.º 1
0
        public byte GetTerrainIndex(TerrainTile r)
        {
            TerrainTemplateInfo tpl;
            if (!Templates.TryGetValue(r.Type, out tpl))
                return defaultWalkableTerrainIndex;

            if (tpl.Contains(r.Index))
            {
                var tile = tpl[r.Index];
                if (tile != null && tile.TerrainType != byte.MaxValue)
                    return tile.TerrainType;
            }

            return defaultWalkableTerrainIndex;
        }
Exemplo n.º 2
0
        public TerrainTileInfo GetTileInfo(TerrainTile r)
        {
            TerrainTemplateInfo tpl;
            if (!Templates.TryGetValue(r.Type, out tpl))
                return null;

            return tpl.Contains(r.Index) ? tpl[r.Index] : null;
        }
Exemplo n.º 3
0
        public static Map FromTileset(TileSet tileset)
        {
            var size = new Size(1, 1);
            var tileShape = Game.ModData.Manifest.TileShape;
            var tileRef = new TerrainTile(tileset.Templates.First().Key, (byte)0);

            var makeMapTiles = Exts.Lazy(() =>
            {
                var ret = new CellLayer<TerrainTile>(tileShape, size);
                ret.Clear(tileRef);
                return ret;
            });

            var makeMapHeight = Exts.Lazy(() =>
            {
                var ret = new CellLayer<byte>(tileShape, size);
                ret.Clear(0);
                return ret;
            });

            var map = new Map()
            {
                Title = "Name your map here",
                Description = "Describe your map here",
                Author = "Your name here",
                MapSize = new int2(size),
                Tileset = tileset.Id,
                Videos = new MapVideos(),
                Options = new MapOptions(),
                MapResources = Exts.Lazy(() => new CellLayer<ResourceTile>(tileShape, size)),
                MapTiles = makeMapTiles,
                MapHeight = makeMapHeight,

                SpawnPoints = Exts.Lazy(() => new CPos[0])
            };

            map.PostInit();

            return map;
        }
Exemplo n.º 4
0
        public CellLayer<TerrainTile> LoadMapTiles()
        {
            var tiles = new CellLayer<TerrainTile>(this);
            using (var s = Container.GetContent("map.bin"))
            {
                var header = new BinaryDataHeader(s, MapSize);
                if (header.TilesOffset > 0)
                {
                    s.Position = header.TilesOffset;
                    for (var i = 0; i < MapSize.X; i++)
                    {
                        for (var j = 0; j < MapSize.Y; j++)
                        {
                            var tile = s.ReadUInt16();
                            var index = s.ReadUInt8();

                            // TODO: Remember to remove this when rewriting tile variants / PickAny
                            if (index == byte.MaxValue)
                                index = (byte)(i % 4 + (j % 4) * 4);

                            tiles[new MPos(i, j)] = new TerrainTile(tile, index);
                        }
                    }
                }
            }

            return tiles;
        }
Exemplo n.º 5
0
		public static Map FromTileset(TileSet tileset)
		{
			var size = new Size(1, 1);
			var tileShape = Game.modData.Manifest.TileShape;
			var tileRef = new TerrainTile(tileset.Templates.First().Key, (byte)0);

			var makeMapTiles =  Exts.Lazy(() =>
			{
				var ret = new CellLayer<TerrainTile>(tileShape, size);
				ret.Clear(tileRef);
				return ret;
			});

			var map = new Map()
			{
				Title = "Name your map here",
				Description = "Describe your map here",
				Author = "Your name here",
				MapSize = new int2(size),
				Tileset = tileset.Id,
				Options = new MapOptions(),
				MapResources = Exts.Lazy(() => new CellLayer<ResourceTile>(tileShape, size)),
				MapTiles = makeMapTiles,
				Actors = Exts.Lazy(() => new Dictionary<string, ActorReference>()),
				Smudges = Exts.Lazy(() => new List<SmudgeReference>())
			};
			map.PostInit();

			return map;
		}
Exemplo n.º 6
0
		public CellLayer<TerrainTile> LoadMapTiles()
		{
			var tiles = new CellLayer<TerrainTile>(this);
			using (var dataStream = Container.GetContent("map.bin"))
			{
				if (dataStream.ReadUInt8() != 1)
					throw new InvalidDataException("Unknown binary map format");

				// Load header info
				var width = dataStream.ReadUInt16();
				var height = dataStream.ReadUInt16();

				if (width != MapSize.X || height != MapSize.Y)
					throw new InvalidDataException("Invalid tile data");

				// Load tile data
				var data = dataStream.ReadBytes(MapSize.X * MapSize.Y * 3);
				var d = 0;
				for (var i = 0; i < MapSize.X; i++)
				{
					for (var j = 0; j < MapSize.Y; j++)
					{
						var tile = BitConverter.ToUInt16(data, d);
						d += 2;

						var index = data[d++];
						if (index == byte.MaxValue)
							index = (byte)(i % 4 + (j % 4) * 4);

						tiles[i, j] = new TerrainTile(tile, index);
					}
				}
			}

			return tiles;
		}
Exemplo n.º 7
0
		public int GetTerrainIndex(TerrainTile r)
		{
			var tpl = Templates[r.Type];

			if (tpl.Contains(r.Index))
			{
				var ti = tpl[r.Index];
				if (ti != -1)
					return ti;
			}

			return defaultWalkableTerrainIndex;
		}
Exemplo n.º 8
0
		public TerrainTypeInfo GetTerrainInfo(TerrainTile r)
		{
			return terrainInfo[GetTerrainIndex(r)];
		}
Exemplo n.º 9
0
        /// <summary>
        /// Initializes a new map created by the editor or importer.
        /// The map will not recieve a valid UID until after it has been saved and reloaded.
        /// </summary>
        public Map(TileSet tileset, int width, int height)
        {
            var size = new Size(width, height);
            var tileShape = Game.ModData.Manifest.TileShape;
            var tileRef = new TerrainTile(tileset.Templates.First().Key, (byte)0);

            Title = "Name your map here";
            Description = "Describe your map here";
            Author = "Your name here";

            MapSize = new int2(size);
            Tileset = tileset.Id;
            Videos = new MapVideos();
            Options = new MapOptions();

            MapResources = Exts.Lazy(() => new CellLayer<ResourceTile>(tileShape, size));

            MapTiles = Exts.Lazy(() =>
            {
                var ret = new CellLayer<TerrainTile>(tileShape, size);
                ret.Clear(tileRef);
                return ret;
            });

            MapHeight = Exts.Lazy(() =>
            {
                var ret = new CellLayer<byte>(tileShape, size);
                ret.Clear(0);
                return ret;
            });

            SpawnPoints = Exts.Lazy(() => new CPos[0]);
            TileShape = tileShape;
            MaximumTerrainHeight = Game.ModData.Manifest.MaximumTerrainHeight;

            PostInit();
        }
Exemplo n.º 10
0
        public Map(ModData modData, IReadOnlyPackage package)
        {
            this.modData = modData;
            Package      = package;

            if (!Package.Contains("map.yaml") || !Package.Contains("map.bin"))
            {
                throw new InvalidDataException("Not a valid map\n File: {1}".F(package.Name));
            }

            var yaml = new MiniYaml(null, MiniYaml.FromStream(Package.GetStream("map.yaml"), package.Name));

            foreach (var field in YamlFields)
            {
                field.Deserialize(this, yaml.Nodes);
            }

            if (MapFormat != SupportedMapFormat)
            {
                throw new InvalidDataException("Map format {0} is not supported.\n File: {1}".F(MapFormat, package.Name));
            }

            PlayerDefinitions = MiniYaml.NodesOrEmpty(yaml, "Players");
            ActorDefinitions  = MiniYaml.NodesOrEmpty(yaml, "Actors");

            Grid = modData.Manifest.Get <MapGrid>();

            var size = new Size(MapSize.X, MapSize.Y);

            Tiles     = new CellLayer <TerrainTile>(Grid.Type, size);
            Resources = new CellLayer <ResourceTile>(Grid.Type, size);
            Height    = new CellLayer <byte>(Grid.Type, size);

            using (var s = Package.GetStream("map.bin"))
            {
                var header = new BinaryDataHeader(s, MapSize);
                if (header.TilesOffset > 0)
                {
                    s.Position = header.TilesOffset;
                    for (var i = 0; i < MapSize.X; i++)
                    {
                        for (var j = 0; j < MapSize.Y; j++)
                        {
                            var tile  = s.ReadUInt16();
                            var index = s.ReadUInt8();

                            // TODO: Remember to remove this when rewriting tile variants / PickAny
                            if (index == byte.MaxValue)
                            {
                                index = (byte)(i % 4 + (j % 4) * 4);
                            }

                            Tiles[new MPos(i, j)] = new TerrainTile(tile, index);
                        }
                    }
                }

                if (header.ResourcesOffset > 0)
                {
                    s.Position = header.ResourcesOffset;
                    for (var i = 0; i < MapSize.X; i++)
                    {
                        for (var j = 0; j < MapSize.Y; j++)
                        {
                            var type    = s.ReadUInt8();
                            var density = s.ReadUInt8();
                            Resources[new MPos(i, j)] = new ResourceTile(type, density);
                        }
                    }
                }

                if (header.HeightsOffset > 0)
                {
                    s.Position = header.HeightsOffset;
                    for (var i = 0; i < MapSize.X; i++)
                    {
                        for (var j = 0; j < MapSize.Y; j++)
                        {
                            Height[new MPos(i, j)] = s.ReadUInt8().Clamp((byte)0, Grid.MaximumTerrainHeight);
                        }
                    }
                }
            }

            if (Grid.MaximumTerrainHeight > 0)
            {
                Tiles.CellEntryChanged  += UpdateProjection;
                Height.CellEntryChanged += UpdateProjection;
            }

            PostInit();

            Uid = ComputeUID(Package);
        }
Exemplo n.º 11
0
 public TerrainTileInfo GetTileInfo(TerrainTile r)
 {
     return(Templates[r.Type][r.Index]);
 }
Exemplo n.º 12
0
Arquivo: Map.cs Projeto: pchote/OpenRA
        public void FixOpenAreas()
        {
            var r = new Random();
            var tileset = Rules.TileSet;

            for (var j = Bounds.Top; j < Bounds.Bottom; j++)
            {
                for (var i = Bounds.Left; i < Bounds.Right; i++)
                {
                    var type = Tiles[new MPos(i, j)].Type;
                    var index = Tiles[new MPos(i, j)].Index;
                    if (!tileset.Templates.ContainsKey(type))
                    {
                        Console.WriteLine("Unknown Tile ID {0}".F(type));
                        continue;
                    }

                    var template = tileset.Templates[type];
                    if (!template.PickAny)
                        continue;

                    index = (byte)r.Next(0, template.TilesCount);
                    Tiles[new MPos(i, j)] = new TerrainTile(type, index);
                }
            }
        }
Exemplo n.º 13
0
Arquivo: Map.cs Projeto: pchote/OpenRA
        public Map(ModData modData, IReadOnlyPackage package)
        {
            this.modData = modData;
            Package = package;

            if (!Package.Contains("map.yaml") || !Package.Contains("map.bin"))
                throw new InvalidDataException("Not a valid map\n File: {0}".F(package.Name));

            var yaml = new MiniYaml(null, MiniYaml.FromStream(Package.GetStream("map.yaml"), package.Name));
            foreach (var field in YamlFields)
                field.Deserialize(this, yaml.Nodes);

            if (MapFormat != SupportedMapFormat)
                throw new InvalidDataException("Map format {0} is not supported.\n File: {1}".F(MapFormat, package.Name));

            PlayerDefinitions = MiniYaml.NodesOrEmpty(yaml, "Players");
            ActorDefinitions = MiniYaml.NodesOrEmpty(yaml, "Actors");

            Grid = modData.Manifest.Get<MapGrid>();

            var size = new Size(MapSize.X, MapSize.Y);
            Tiles = new CellLayer<TerrainTile>(Grid.Type, size);
            Resources = new CellLayer<ResourceTile>(Grid.Type, size);
            Height = new CellLayer<byte>(Grid.Type, size);

            using (var s = Package.GetStream("map.bin"))
            {
                var header = new BinaryDataHeader(s, MapSize);
                if (header.TilesOffset > 0)
                {
                    s.Position = header.TilesOffset;
                    for (var i = 0; i < MapSize.X; i++)
                    {
                        for (var j = 0; j < MapSize.Y; j++)
                        {
                            var tile = s.ReadUInt16();
                            var index = s.ReadUInt8();

                            // TODO: Remember to remove this when rewriting tile variants / PickAny
                            if (index == byte.MaxValue)
                                index = (byte)(i % 4 + (j % 4) * 4);

                            Tiles[new MPos(i, j)] = new TerrainTile(tile, index);
                        }
                    }
                }

                if (header.ResourcesOffset > 0)
                {
                    s.Position = header.ResourcesOffset;
                    for (var i = 0; i < MapSize.X; i++)
                    {
                        for (var j = 0; j < MapSize.Y; j++)
                        {
                            var type = s.ReadUInt8();
                            var density = s.ReadUInt8();
                            Resources[new MPos(i, j)] = new ResourceTile(type, density);
                        }
                    }
                }

                if (header.HeightsOffset > 0)
                {
                    s.Position = header.HeightsOffset;
                    for (var i = 0; i < MapSize.X; i++)
                        for (var j = 0; j < MapSize.Y; j++)
                            Height[new MPos(i, j)] = s.ReadUInt8().Clamp((byte)0, Grid.MaximumTerrainHeight);
                }
            }

            if (Grid.MaximumTerrainHeight > 0)
            {
                Tiles.CellEntryChanged += UpdateProjection;
                Height.CellEntryChanged += UpdateProjection;
            }

            PostInit();

            Uid = ComputeUID(Package);
        }
Exemplo n.º 14
0
Arquivo: Map.cs Projeto: pchote/OpenRA
        /// <summary>
        /// Initializes a new map created by the editor or importer.
        /// The map will not receive a valid UID until after it has been saved and reloaded.
        /// </summary>
        public Map(ModData modData, TileSet tileset, int width, int height)
        {
            this.modData = modData;
            var size = new Size(width, height);
            Grid = modData.Manifest.Get<MapGrid>();
            var tileRef = new TerrainTile(tileset.Templates.First().Key, 0);

            Title = "Name your map here";
            Author = "Your name here";

            MapSize = new int2(size);
            Tileset = tileset.Id;

            // Empty rules that can be added to by the importers.
            // Will be dropped on save if nothing is added to it
            RuleDefinitions = new MiniYaml("");

            Tiles = new CellLayer<TerrainTile>(Grid.Type, size);
            Resources = new CellLayer<ResourceTile>(Grid.Type, size);
            Height = new CellLayer<byte>(Grid.Type, size);
            if (Grid.MaximumTerrainHeight > 0)
            {
                Height.CellEntryChanged += UpdateProjection;
                Tiles.CellEntryChanged += UpdateProjection;
            }

            Tiles.Clear(tileRef);

            PostInit();
        }
Exemplo n.º 15
0
 public TerrainTypeInfo GetTerrainInfo(TerrainTile r)
 {
     return(terrainInfo[GetTerrainIndex(r)]);
 }