diff --git a/OpenRA.Mods.Common/Lint/LintBuildablePrerequisites.cs b/OpenRA.Mods.Common/Lint/LintBuildablePrerequisites.cs index d62f0dd8fc..85b6aeb88c 100644 --- a/OpenRA.Mods.Common/Lint/LintBuildablePrerequisites.cs +++ b/OpenRA.Mods.Common/Lint/LintBuildablePrerequisites.cs @@ -19,14 +19,9 @@ namespace OpenRA.Mods.Common.Lint { public void Run(Action emitError, Action emitWarning, Map map) { - // Buildings provide their actor names as a prerequisite - var buildingPrereqs = map.Rules.Actors.Where(a => a.Value.Traits.Contains()) - .Select(a => a.Key); - // ProvidesCustomPrerequisite allows arbitrary prereq definitions var customPrereqs = map.Rules.Actors.SelectMany(a => a.Value.Traits - .WithInterface()) - .Select(p => p.Prerequisite); + .WithInterface().Select(p => p.Prerequisite ?? a.Value.Name)); // ProvidesTechPrerequisite allows arbitrary prereq definitions // (but only one group at a time during gameplay) @@ -34,7 +29,7 @@ namespace OpenRA.Mods.Common.Lint .WithInterface()) .SelectMany(p => p.Prerequisites); - var providedPrereqs = buildingPrereqs.Concat(customPrereqs).Concat(techPrereqs); + var providedPrereqs = customPrereqs.Concat(techPrereqs); // TODO: this check is case insensitive while the real check in-game is not foreach (var i in map.Rules.Actors) diff --git a/OpenRA.Mods.Common/Traits/Buildings/Building.cs b/OpenRA.Mods.Common/Traits/Buildings/Building.cs index 47f9a60e33..4985072538 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Building.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Building.cs @@ -106,7 +106,7 @@ namespace OpenRA.Mods.Common.Traits } } - public class Building : IOccupySpace, INotifySold, INotifyTransform, ISync, ITechTreePrerequisite, INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld + public class Building : IOccupySpace, INotifySold, INotifyTransform, ISync, INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld { public readonly BuildingInfo Info; public bool BuildComplete { get; private set; } @@ -131,8 +131,6 @@ namespace OpenRA.Mods.Common.Traits public CPos TopLeft { get { return topLeft; } } public WPos CenterPosition { get; private set; } - public IEnumerable ProvidesPrerequisites { get { yield return self.Info.Name; } } - public Building(ActorInitializer init, BuildingInfo info) { this.self = init.Self; diff --git a/OpenRA.Mods.Common/Traits/Player/ProvidesCustomPrerequisite.cs b/OpenRA.Mods.Common/Traits/Player/ProvidesCustomPrerequisite.cs index ee601256e0..898fe26732 100644 --- a/OpenRA.Mods.Common/Traits/Player/ProvidesCustomPrerequisite.cs +++ b/OpenRA.Mods.Common/Traits/Player/ProvidesCustomPrerequisite.cs @@ -17,13 +17,13 @@ namespace OpenRA.Mods.Common.Traits { public class ProvidesCustomPrerequisiteInfo : ITraitInfo { - [Desc("The prerequisite type that this provides")] + [Desc("The prerequisite type that this provides. If left empty it defaults to the actor's name.")] public readonly string Prerequisite = null; - [Desc("Only grant this prerequisite when you have these prerequisites")] + [Desc("Only grant this prerequisite when you have these prerequisites.")] public readonly string[] RequiresPrerequisites = { }; - [Desc("Only grant this prerequisite for certain factions")] + [Desc("Only grant this prerequisite for certain factions.")] public readonly string[] Race = { }; [Desc("Should it recheck everything when it is captured?")] @@ -34,12 +34,17 @@ namespace OpenRA.Mods.Common.Traits public class ProvidesCustomPrerequisite : ITechTreePrerequisite, INotifyOwnerChanged { readonly ProvidesCustomPrerequisiteInfo info; + readonly string prerequisite; bool enabled = true; public ProvidesCustomPrerequisite(ActorInitializer init, ProvidesCustomPrerequisiteInfo info) { this.info = info; + prerequisite = info.Prerequisite; + + if (string.IsNullOrEmpty(prerequisite)) + prerequisite = init.Self.Info.Name; var race = init.Contains() ? init.Get() : init.Self.Owner.Country.Race; @@ -53,7 +58,7 @@ namespace OpenRA.Mods.Common.Traits if (!enabled) yield break; - yield return info.Prerequisite; + yield return prerequisite; } }