From a52e83ca49cb595114a66b88cfb0ae6c19f3bbfb Mon Sep 17 00:00:00 2001 From: reaperrr Date: Wed, 14 Mar 2018 21:00:07 +0100 Subject: [PATCH] Add Locomotor lint check --- OpenRA.Game/Traits/LintAttributes.cs | 3 ++ .../Lint/CheckLocomotorReferences.cs | 51 +++++++++++++++++++ OpenRA.Mods.Common/Traits/Mobile.cs | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 OpenRA.Mods.Common/Lint/CheckLocomotorReferences.cs diff --git a/OpenRA.Game/Traits/LintAttributes.cs b/OpenRA.Game/Traits/LintAttributes.cs index c115b7ac69..d62fad1e3b 100644 --- a/OpenRA.Game/Traits/LintAttributes.cs +++ b/OpenRA.Game/Traits/LintAttributes.cs @@ -34,6 +34,9 @@ namespace OpenRA.Traits [AttributeUsage(AttributeTargets.Field)] public sealed class VoiceReferenceAttribute : Attribute { } + [AttributeUsage(AttributeTargets.Field)] + public sealed class LocomotorReferenceAttribute : Attribute { } + [AttributeUsage(AttributeTargets.Field)] public sealed class SequenceReferenceAttribute : Attribute { diff --git a/OpenRA.Mods.Common/Lint/CheckLocomotorReferences.cs b/OpenRA.Mods.Common/Lint/CheckLocomotorReferences.cs new file mode 100644 index 0000000000..a0b6acc6e1 --- /dev/null +++ b/OpenRA.Mods.Common/Lint/CheckLocomotorReferences.cs @@ -0,0 +1,51 @@ +#region Copyright & License Information +/* + * Copyright 2007-2018 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; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Lint +{ + public class CheckLocomotorReferences : ILintRulesPass + { + public void Run(Action emitError, Action emitWarning, Ruleset rules) + { + var worldActor = rules.Actors["world"]; + var locomotorInfos = worldActor.TraitInfos().ToArray(); + foreach (var actorInfo in rules.Actors) + { + foreach (var traitInfo in actorInfo.Value.TraitInfos()) + { + var fields = traitInfo.GetType().GetFields().Where(f => f.HasAttribute()); + foreach (var field in fields) + { + var locomotors = LintExts.GetFieldValues(traitInfo, field, emitError); + foreach (var locomotor in locomotors) + { + if (string.IsNullOrEmpty(locomotor)) + continue; + + CheckLocomotors(actorInfo.Value, emitError, rules, locomotorInfos, locomotor); + } + } + } + } + } + + void CheckLocomotors(ActorInfo actorInfo, Action emitError, Ruleset rules, LocomotorInfo[] locomotorInfos, string locomotor) + { + if (!locomotorInfos.Any(l => l.Name == locomotor)) + emitError("Actor {0} defines Locomotor {1} not found on World actor.".F(actorInfo.Name, locomotor)); + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 017a8bdd54..7c8fe34161 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits UsesInit, UsesInit, UsesInit, IActorPreviewInitInfo { [Desc("Which Locomotor does this trait use. Must be defined on the World actor.")] - [FieldLoader.Require] + [LocomotorReference, FieldLoader.Require] public readonly string Locomotor = null; public readonly int InitialFacing = 0;