From 7b10da6bde156ad79988cabb5fe597377e66b60e Mon Sep 17 00:00:00 2001 From: WolfGaming Date: Wed, 16 Jul 2014 05:34:47 +0000 Subject: [PATCH] Adds the RequiresPrerequisites field into ProvidesCustomPrerequisite and all the logic behind it. --- .../Player/ProvidesCustomPrerequisite.cs | 34 ++++++++++++------- OpenRA.Mods.RA/Player/TechTree.cs | 9 ++++- mods/ra/rules/structures.yaml | 6 ++++ 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/OpenRA.Mods.RA/Player/ProvidesCustomPrerequisite.cs b/OpenRA.Mods.RA/Player/ProvidesCustomPrerequisite.cs index 6f78597ffa..32a1c9054d 100755 --- a/OpenRA.Mods.RA/Player/ProvidesCustomPrerequisite.cs +++ b/OpenRA.Mods.RA/Player/ProvidesCustomPrerequisite.cs @@ -20,31 +20,30 @@ namespace OpenRA.Mods.RA [Desc("The prerequisite type that this provides")] public readonly string Prerequisite = null; + [Desc("Only grant this prerequisite when you have these prerequisites")] + public readonly string[] RequiresPrerequisites = { }; + [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; + [Desc("Should it recheck everything when it is captured?")] + public readonly bool ResetOnOwnerChange = false; public object Create(ActorInitializer init) { return new ProvidesCustomPrerequisite(init, this); } } public class ProvidesCustomPrerequisite : ITechTreePrerequisite, INotifyOwnerChanged { - ProvidesCustomPrerequisiteInfo info; + readonly 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(); + var race = init.Contains() ? init.Get() : init.self.Owner.Country.Race; - enabled = info.Race.Contains(race); - } + Update(init.self.Owner, race); } public IEnumerable ProvidesPrerequisites @@ -60,8 +59,19 @@ namespace OpenRA.Mods.RA public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { - if (!info.Sticky && info.Race.Any()) - enabled = info.Race.Contains(self.Owner.Country.Race); + if (info.ResetOnOwnerChange) + Update(newOwner, newOwner.Country.Race); + } + + void Update(Player owner, string race) + { + enabled = true; + + if (info.Race.Any()) + enabled = info.Race.Contains(race); + + if (info.RequiresPrerequisites.Any() && enabled) + enabled = owner.PlayerActor.Trait().HasPrerequisites(info.RequiresPrerequisites); } } diff --git a/OpenRA.Mods.RA/Player/TechTree.cs b/OpenRA.Mods.RA/Player/TechTree.cs index 6563fc8271..45929e9884 100755 --- a/OpenRA.Mods.RA/Player/TechTree.cs +++ b/OpenRA.Mods.RA/Player/TechTree.cs @@ -61,6 +61,13 @@ namespace OpenRA.Mods.RA watchers.RemoveAll(x => x.RegisteredBy == tte); } + public bool HasPrerequisites(IEnumerable prerequisites) + { + var ownedPrereqs = TechTree.GatherOwnedPrerequisites(player); + return prerequisites.All(p => !(p.Replace("~", "").StartsWith("!") + ^ !ownedPrereqs.ContainsKey(p.Replace("!", "").Replace("~", "")))); + } + static Cache> GatherOwnedPrerequisites(Player player) { var ret = new Cache>(x => new List()); @@ -69,7 +76,7 @@ namespace OpenRA.Mods.RA // Add all actors that provide prerequisites var prerequisites = player.World.ActorsWithTrait() - .Where(a => a.Actor.Owner == player && !a.Actor.IsDead() && a.Actor.IsInWorld); + .Where(a => a.Actor.Owner == player && a.Actor.IsInWorld && !a.Actor.IsDead()); foreach (var b in prerequisites) { diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index c3572b87ba..207f487239 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -695,6 +695,12 @@ WEAP: ProvidesCustomPrerequisite@soviet: Race: soviet Prerequisite: vehicles.soviet + ProvidesCustomPrerequisite@alliedstructure: + RequiresPrerequisites: structures.allies + Prerequisite: vehicles.allies + ProvidesCustomPrerequisite@sovietstructure: + RequiresPrerequisites: structures.soviet + Prerequisite: vehicles.soviet PrimaryBuilding: IronCurtainable: ProductionBar: