diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index cffcfa1f8f..a7f51e3228 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -206,6 +206,8 @@ namespace OpenRA public readonly MiniYaml NotificationDefinitions; public readonly MiniYaml TranslationDefinitions; + public readonly Dictionary ReplacedInvalidTerrainTiles = new Dictionary(); + // Generated data public readonly MapGrid Grid; public IReadOnlyPackage Package { get; private set; } @@ -435,6 +437,7 @@ namespace OpenRA { if (!tileset.TryGetTileInfo(Tiles[uv], out var info)) { + ReplacedInvalidTerrainTiles[uv.ToCPos(this)] = Tiles[uv]; Tiles[uv] = tileset.DefaultTerrainTile; info = tileset.GetTileInfo(tileset.DefaultTerrainTile); } diff --git a/OpenRA.Game/Map/TileReference.cs b/OpenRA.Game/Map/TileReference.cs index 65d34dcc08..0adfe7a047 100644 --- a/OpenRA.Game/Map/TileReference.cs +++ b/OpenRA.Game/Map/TileReference.cs @@ -23,6 +23,8 @@ namespace OpenRA } public override int GetHashCode() { return Type.GetHashCode() ^ Index.GetHashCode(); } + + public override string ToString() { return Type + "," + Index; } } public struct ResourceTile diff --git a/OpenRA.Mods.Common/Lint/CheckMapTiles.cs b/OpenRA.Mods.Common/Lint/CheckMapTiles.cs new file mode 100644 index 0000000000..df13b31604 --- /dev/null +++ b/OpenRA.Mods.Common/Lint/CheckMapTiles.cs @@ -0,0 +1,25 @@ +#region Copyright & License Information +/* + * Copyright 2007-2020 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, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Linq; + +namespace OpenRA.Mods.Common.Lint +{ + public class CheckMapTiles : ILintMapPass + { + public void Run(Action emitError, Action emitWarning, ModData modData, Map map) + { + foreach (var kv in map.ReplacedInvalidTerrainTiles) + emitError("Cell {0} references invalid terrain tile {1}.".F(kv.Key, kv.Value)); + } + } +}