From fc07391c8cdf03fe5841e7b8445d7cf24143ab40 Mon Sep 17 00:00:00 2001 From: Mustafa Alperen Seki Date: Tue, 7 Nov 2017 10:32:11 +0300 Subject: [PATCH] Add Type Support for InfiltrateFor* traits --- OpenRA.Mods.Cnc/Activities/Infiltrate.cs | 2 +- .../Traits/Infiltration/InfiltrateForCash.cs | 8 +++++++- .../Infiltration/InfiltrateForDecoration.cs | 15 +++++++++++--- .../Infiltration/InfiltrateForExploration.cs | 20 +++++++++++++++++-- .../Infiltration/InfiltrateForPowerOutage.cs | 8 +++++++- .../Infiltration/InfiltrateForSupportPower.cs | 8 +++++++- .../Scripting/ScriptTriggers.cs | 2 +- OpenRA.Mods.Common/TraitsInterfaces.cs | 2 +- mods/ra/rules/defaults.yaml | 2 ++ mods/ra/rules/structures.yaml | 9 +++++++++ 10 files changed, 65 insertions(+), 11 deletions(-) diff --git a/OpenRA.Mods.Cnc/Activities/Infiltrate.cs b/OpenRA.Mods.Cnc/Activities/Infiltrate.cs index 165b83ea51..f8b0283249 100644 --- a/OpenRA.Mods.Cnc/Activities/Infiltrate.cs +++ b/OpenRA.Mods.Cnc/Activities/Infiltrate.cs @@ -45,7 +45,7 @@ namespace OpenRA.Mods.Cnc.Activities ini.Infiltrating(self); foreach (var t in target.TraitsImplementing()) - t.Infiltrated(target, self); + t.Infiltrated(target, self, infiltrates.Info.Types); var exp = self.Owner.PlayerActor.TraitOrDefault(); if (exp != null) diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs index 1045e22aaf..2b1c1f5ded 100644 --- a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForCash.cs @@ -10,6 +10,7 @@ #endregion using System; +using System.Collections.Generic; using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -19,6 +20,8 @@ namespace OpenRA.Mods.Cnc.Traits [Desc("This structure can be infiltrated causing funds to be stolen.")] class InfiltrateForCashInfo : ITraitInfo { + public readonly HashSet Types = new HashSet(); + [Desc("Percentage of the victim's resources that will be stolen.")] public readonly int Percentage = 100; @@ -44,8 +47,11 @@ namespace OpenRA.Mods.Cnc.Traits public InfiltrateForCash(InfiltrateForCashInfo info) { this.info = info; } - void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator) + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, HashSet types) { + if (!info.Types.Overlaps(types)) + return; + var targetResources = self.Owner.PlayerActor.Trait(); var spyResources = infiltrator.Owner.PlayerActor.Trait(); var spyValue = infiltrator.Info.TraitInfoOrDefault(); diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForDecoration.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForDecoration.cs index af42b2d82d..1d7e75d09e 100644 --- a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForDecoration.cs +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForDecoration.cs @@ -20,18 +20,27 @@ namespace OpenRA.Mods.Cnc.Traits [Desc("Reveals a decoration sprite to the indicated players when infiltrated.")] class InfiltrateForDecorationInfo : WithDecorationInfo { + public readonly HashSet Types = new HashSet(); + public override object Create(ActorInitializer init) { return new InfiltrateForDecoration(init.Self, this); } } class InfiltrateForDecoration : WithDecoration, INotifyInfiltrated { readonly HashSet infiltrators = new HashSet(); + readonly InfiltrateForDecorationInfo info; public InfiltrateForDecoration(Actor self, InfiltrateForDecorationInfo info) - : base(self, info) { } - - void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator) + : base(self, info) { + this.info = info; + } + + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, HashSet types) + { + if (!info.Types.Overlaps(types)) + return; + infiltrators.Add(infiltrator.Owner); } diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForExploration.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForExploration.cs index 62a76c0ce6..96392cd05e 100644 --- a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForExploration.cs +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForExploration.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -16,12 +17,27 @@ using OpenRA.Traits; namespace OpenRA.Mods.Cnc.Traits { [Desc("Steal and reset the owner's exploration.")] - class InfiltrateForExplorationInfo : TraitInfo { } + class InfiltrateForExplorationInfo : ITraitInfo + { + public readonly HashSet Types = new HashSet(); + + public object Create(ActorInitializer init) { return new InfiltrateForExploration(init.Self, this); } + } class InfiltrateForExploration : INotifyInfiltrated { - void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator) + readonly InfiltrateForExplorationInfo info; + + public InfiltrateForExploration(Actor self, InfiltrateForExplorationInfo info) { + this.info = info; + } + + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, HashSet types) + { + if (!info.Types.Overlaps(types)) + return; + infiltrator.Owner.Shroud.Explore(self.Owner.Shroud); var preventReset = self.Owner.PlayerActor.TraitsImplementing() .Any(p => p.PreventShroudReset(self)); diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForPowerOutage.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForPowerOutage.cs index c0f7b2c884..e7976aa013 100644 --- a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForPowerOutage.cs +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForPowerOutage.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Collections.Generic; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -16,6 +17,8 @@ namespace OpenRA.Mods.Cnc.Traits { class InfiltrateForPowerOutageInfo : ITraitInfo { + public readonly HashSet Types = new HashSet(); + public readonly int Duration = 25 * 20; public object Create(ActorInitializer init) { return new InfiltrateForPowerOutage(init.Self, this); } @@ -32,8 +35,11 @@ namespace OpenRA.Mods.Cnc.Traits playerPower = self.Owner.PlayerActor.Trait(); } - void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator) + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, HashSet types) { + if (!info.Types.Overlaps(types)) + return; + playerPower.TriggerPowerOutage(info.Duration); } diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForSupportPower.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForSupportPower.cs index aa73249ac4..2c36d0139b 100644 --- a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForSupportPower.cs +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForSupportPower.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Collections.Generic; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Traits; @@ -19,6 +20,8 @@ namespace OpenRA.Mods.Cnc.Traits { [ActorReference, FieldLoader.Require] public readonly string Proxy = null; + public readonly HashSet Types = new HashSet(); + public object Create(ActorInitializer init) { return new InfiltrateForSupportPower(this); } } @@ -31,8 +34,11 @@ namespace OpenRA.Mods.Cnc.Traits this.info = info; } - void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator) + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, HashSet types) { + if (!info.Types.Overlaps(types)) + return; + infiltrator.World.AddFrameEndTask(w => w.CreateActor(info.Proxy, new TypeDictionary { new OwnerInit(infiltrator.Owner) diff --git a/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs b/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs index 0188a6b45d..2b64ed4c3d 100644 --- a/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs +++ b/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs @@ -302,7 +302,7 @@ namespace OpenRA.Mods.Common.Scripting OnCapturedInternal(self); } - void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator) + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, HashSet types) { if (world.Disposing) return; diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index cb03196780..507faa7df6 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -118,7 +118,7 @@ namespace OpenRA.Mods.Common.Traits public interface ISeedableResource { void Seed(Actor self); } [RequireExplicitImplementation] - public interface INotifyInfiltrated { void Infiltrated(Actor self, Actor infiltrator); } + public interface INotifyInfiltrated { void Infiltrated(Actor self, Actor infiltrator, HashSet types); } [RequireExplicitImplementation] public interface INotifyBlockingMove { void OnNotifyBlockingMove(Actor self, Actor blocking); } diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 6a0dad35b8..9e8139b6c9 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -770,6 +770,7 @@ Targetable: TargetTypes: Ground, Structure, C4, DetonateAttack, SpyInfiltrate InfiltrateForDecoration: + Types: SpyInfiltrate RequiresSelection: true Image: pips Sequence: tag-fake @@ -1120,5 +1121,6 @@ AffectedByPowerOutage: Condition: power-outage InfiltrateForPowerOutage: + Types: SpyInfiltrate Power: RequiresCondition: !disabled diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 7438380cd9..5ac7e0f3b6 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -112,6 +112,7 @@ SPEN: Inherits: ^Building InfiltrateForSupportPower: Proxy: powerproxy.sonarpulse + Types: SpyInfiltrate Valued: Cost: 800 Tooltip: @@ -241,6 +242,7 @@ SYRD: Inherits: ^Building InfiltrateForSupportPower: Proxy: powerproxy.sonarpulse + Types: SpyInfiltrate Buildable: Queue: Building BuildPaletteOrder: 40 @@ -621,6 +623,7 @@ DOME: ProvidesRadar: RequiresCondition: !jammed && !disabled InfiltrateForExploration: + Types: SpyInfiltrate DetectCloaked: Range: 10c0 RequiresCondition: !disabled @@ -1016,6 +1019,7 @@ WEAP: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate InfiltrateForSupportPower: Proxy: vehicles.upgraded + Types: SpyInfiltrate WithDecoration@primary: RequiresSelection: true Image: pips @@ -1153,6 +1157,7 @@ PROC: Facing: 64 InfiltrateForCash: Percentage: 50 + Types: SpyInfiltrate Notification: CreditsStolen WithIdleOverlay@TOP: Sequence: idle-top @@ -1286,6 +1291,7 @@ HPAD: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate InfiltrateForSupportPower: Proxy: aircraft.upgraded + Types: SpyInfiltrate WithDecoration@primary: RequiresSelection: true Image: pips @@ -1422,6 +1428,7 @@ AFLD: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate InfiltrateForSupportPower: Proxy: aircraft.upgraded + Types: SpyInfiltrate WithDecoration@primary: RequiresSelection: true Image: pips @@ -1626,6 +1633,7 @@ BARR: ProvidesPrerequisite@buildingname: InfiltrateForSupportPower: Proxy: barracks.upgraded + Types: SpyInfiltrate Targetable: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate WithDecoration@primary: @@ -1763,6 +1771,7 @@ TENT: ProvidesPrerequisite@buildingname: InfiltrateForSupportPower: Proxy: barracks.upgraded + Types: SpyInfiltrate Targetable: TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate WithDecoration@primary: