diff --git a/OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs b/OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs index 221602541f..d43033e181 100644 --- a/OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs +++ b/OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs @@ -11,6 +11,7 @@ using System; using System.Linq; using OpenRA.GameRules; +using OpenRA.Mods.Common.Traits; using OpenRA.Traits; namespace OpenRA.Mods.Common.Lint @@ -30,6 +31,18 @@ namespace OpenRA.Mods.Common.Lint emitError("Actor type `{0}` does not define a default visibility type!".F(actorInfo.Key)); else if (count > 1) emitError("Actor type `{0}` defines multiple default visibility types!".F(actorInfo.Key)); + else + { + var vis = actorInfo.Value.Traits.GetOrDefault(); + if (vis != null && vis.Type == VisibilityType.Footprint) + { + var ios = actorInfo.Value.Traits.GetOrDefault(); + if (ios == null) + emitError("Actor type `{0}` defines VisibilityType.Footprint in `{1}` but has no IOccupySpace traits!".F(actorInfo.Key, vis.GetType())); + else if (!ios.OccupiedCells(actorInfo.Value, CPos.Zero).Any()) + emitError("Actor type `{0}` defines VisibilityType.Footprint in `{1}` but does not have any footprint cells!".F(actorInfo.Key, vis.GetType())); + } + } } } } diff --git a/OpenRA.Mods.Common/Lint/CheckRevealFootprint.cs b/OpenRA.Mods.Common/Lint/CheckRevealFootprint.cs new file mode 100644 index 0000000000..5564f83f4a --- /dev/null +++ b/OpenRA.Mods.Common/Lint/CheckRevealFootprint.cs @@ -0,0 +1,42 @@ +#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.Linq; +using OpenRA.GameRules; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Lint +{ + class CheckRevealFootprint : ILintPass + { + public void Run(Action emitError, Action emitWarning, Map map) + { + foreach (var actorInfo in map.Rules.Actors) + { + if (actorInfo.Key.StartsWith("^")) + continue; + + var ios = actorInfo.Value.Traits.GetOrDefault(); + foreach (var rsi in actorInfo.Value.Traits.WithInterface()) + { + if (rsi.Type == VisibilityType.CenterPosition) + continue; + + if (ios == null) + emitError("Actor type `{0}` defines VisibilityType.Footprint in `{1}` but has no IOccupySpace traits!".F(actorInfo.Key, rsi.GetType())); + else if (!ios.OccupiedCells(actorInfo.Value, CPos.Zero).Any()) + emitError("Actor type `{0}` defines VisibilityType.Footprint in `{1}` but does not have any footprint cells!".F(actorInfo.Key, rsi.GetType())); + } + } + } + } +} diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index b999883465..f08f6c0617 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -688,6 +688,7 @@ +