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;
- }
- }
}