diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index ee29ef2a2c..aeb4fdda34 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -517,6 +517,7 @@ + diff --git a/OpenRA.Mods.RA/Player/ProvidesCustomPrerequisite.cs b/OpenRA.Mods.RA/Player/ProvidesCustomPrerequisite.cs new file mode 100755 index 0000000000..6f78597ffa --- /dev/null +++ b/OpenRA.Mods.RA/Player/ProvidesCustomPrerequisite.cs @@ -0,0 +1,77 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 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.Collections.Generic; +using System.Linq; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA +{ + public class ProvidesCustomPrerequisiteInfo : ITraitInfo + { + [Desc("The prerequisite type that this provides")] + public readonly string Prerequisite = null; + + [Desc("Only grant this prerequisite for certain factions")] + public readonly string[] Race = { }; + + [Desc("Should the prerequisite remain enabled if the owner changes?")] + public readonly bool Sticky = true; + public object Create(ActorInitializer init) { return new ProvidesCustomPrerequisite(init, this); } + } + + public class ProvidesCustomPrerequisite : ITechTreePrerequisite, INotifyOwnerChanged + { + ProvidesCustomPrerequisiteInfo info; + bool enabled = true; + + public ProvidesCustomPrerequisite(ActorInitializer init, ProvidesCustomPrerequisiteInfo info) + { + this.info = info; + + if (info.Race.Any()) + { + var race = init.self.Owner.Country.Race; + if (init.Contains()) + race = init.Get(); + + enabled = info.Race.Contains(race); + } + } + + public IEnumerable ProvidesPrerequisites + { + get + { + if (!enabled) + yield break; + + yield return info.Prerequisite; + } + } + + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + if (!info.Sticky && info.Race.Any()) + enabled = info.Race.Contains(self.Owner.Country.Race); + } + } + + // Allows maps / transformations to specify the race variant of an actor. + public class RaceInit : IActorInit + { + [FieldFromYamlKey] public readonly string Race; + + public RaceInit() { } + public RaceInit(string race) { Race = race; } + public string Value(World world) { return Race; } + } +} diff --git a/OpenRA.Mods.RA/Player/TechTree.cs b/OpenRA.Mods.RA/Player/TechTree.cs index 24e76c2a7a..c9707fb5cc 100755 --- a/OpenRA.Mods.RA/Player/TechTree.cs +++ b/OpenRA.Mods.RA/Player/TechTree.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 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, @@ -155,23 +155,4 @@ namespace OpenRA.Mods.RA } } } - - public class ProvidesCustomPrerequisiteInfo : ITraitInfo - { - public readonly string Prerequisite; - - public object Create(ActorInitializer init) { return new ProvidesCustomPrerequisite(this); } - } - - public class ProvidesCustomPrerequisite : ITechTreePrerequisite - { - ProvidesCustomPrerequisiteInfo info; - - public IEnumerable ProvidesPrerequisites { get { yield return info.Prerequisite; } } - - public ProvidesCustomPrerequisite(ProvidesCustomPrerequisiteInfo info) - { - this.info = info; - } - } }