Implement enter behaviour for Infiltrates plus other cleanups.

This commit is contained in:
Paul Chote
2015-11-23 21:24:17 +00:00
parent f5fafb1b9d
commit 1959820bc8
3 changed files with 35 additions and 23 deletions

View File

@@ -18,19 +18,17 @@ namespace OpenRA.Mods.RA.Activities
class Infiltrate : Enter class Infiltrate : Enter
{ {
readonly Actor target; readonly Actor target;
readonly Stance validStances;
readonly Cloak cloak; readonly Cloak cloak;
readonly string notification;
readonly Infiltrates infiltrates; public Infiltrate(Actor self, Actor target, EnterBehaviour enterBehaviour, Stance validStances, string notification)
: base(self, target, enterBehaviour)
public Infiltrate(Actor self, Actor target)
: base(self, target, EnterBehaviour.Dispose)
{ {
this.target = target; this.target = target;
this.validStances = validStances;
this.notification = notification;
cloak = self.TraitOrDefault<Cloak>(); cloak = self.TraitOrDefault<Cloak>();
infiltrates = self.TraitOrDefault<Infiltrates>();
} }
protected override void OnInside(Actor self) protected override void OnInside(Actor self)
@@ -39,7 +37,7 @@ namespace OpenRA.Mods.RA.Activities
return; return;
var stance = self.Owner.Stances[target.Owner]; var stance = self.Owner.Stances[target.Owner];
if (!infiltrates.Info.ValidStances.HasStance(stance)) if (!validStances.HasStance(stance))
return; return;
if (cloak != null && cloak.Info.UncloakOnInfiltrate) if (cloak != null && cloak.Info.UncloakOnInfiltrate)
@@ -48,10 +46,9 @@ namespace OpenRA.Mods.RA.Activities
foreach (var t in target.TraitsImplementing<INotifyInfiltrated>()) foreach (var t in target.TraitsImplementing<INotifyInfiltrated>())
t.Infiltrated(target, self); t.Infiltrated(target, self);
self.Dispose(); if (!string.IsNullOrEmpty(notification))
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech",
if (target.Info.HasTraitInfo<BuildingInfo>()) notification, self.Owner.Faction.InternalName);
Game.Sound.PlayToPlayer(self.Owner, "bldginf1.aud");
} }
} }
} }

View File

@@ -8,22 +8,29 @@
*/ */
#endregion #endregion
using OpenRA.Mods.Common.Traits;
using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Activities;
using OpenRA.Mods.RA.Traits;
using OpenRA.Scripting; using OpenRA.Scripting;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Scripting namespace OpenRA.Mods.RA.Scripting
{ {
[ScriptPropertyGroup("Ability")] [ScriptPropertyGroup("Ability")]
public class InfiltrateProperties : ScriptActorProperties public class InfiltrateProperties : ScriptActorProperties, Requires<InfiltratesInfo>
{ {
readonly InfiltratesInfo info;
public InfiltrateProperties(ScriptContext context, Actor self) public InfiltrateProperties(ScriptContext context, Actor self)
: base(context, self) : base(context, self)
{ } {
info = Self.Info.TraitInfo<InfiltratesInfo>();
}
[Desc("Infiltrate the target actor.")] [Desc("Infiltrate the target actor.")]
public void Infiltrate(Actor target) public void Infiltrate(Actor target)
{ {
Self.QueueActivity(new Infiltrate(Self, target)); Self.QueueActivity(new Infiltrate(Self, target, info.EnterBehaviour, info.ValidStances, info.Notification));
} }
} }
} }

View File

@@ -12,6 +12,7 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.Mods.Common; using OpenRA.Mods.Common;
using OpenRA.Mods.Common.Activities;
using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Orders;
using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Activities;
using OpenRA.Traits; using OpenRA.Traits;
@@ -27,21 +28,28 @@ namespace OpenRA.Mods.RA.Traits
[Desc("What diplomatic stances can be infiltrated by this actor.")] [Desc("What diplomatic stances can be infiltrated by this actor.")]
public readonly Stance ValidStances = Stance.Neutral | Stance.Enemy; public readonly Stance ValidStances = Stance.Neutral | Stance.Enemy;
[Desc("Behaviour when entering the structure.",
"Possible values are Exit, Suicide, Dispose.")]
public readonly EnterBehaviour EnterBehaviour = EnterBehaviour.Dispose;
[Desc("Notification to play when a building is infiltrated.")]
public readonly string Notification = "BuildingInfiltrated";
public object Create(ActorInitializer init) { return new Infiltrates(this); } public object Create(ActorInitializer init) { return new Infiltrates(this); }
} }
class Infiltrates : IIssueOrder, IResolveOrder, IOrderVoice class Infiltrates : IIssueOrder, IResolveOrder, IOrderVoice
{ {
public readonly InfiltratesInfo Info; readonly InfiltratesInfo info;
public Infiltrates(InfiltratesInfo info) public Infiltrates(InfiltratesInfo info)
{ {
Info = info; this.info = info;
} }
public IEnumerable<IOrderTargeter> Orders public IEnumerable<IOrderTargeter> Orders
{ {
get { yield return new InfiltrationOrderTargeter(Info); } get { yield return new InfiltrationOrderTargeter(info); }
} }
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
@@ -79,13 +87,13 @@ namespace OpenRA.Mods.RA.Traits
else else
targetTypes = order.TargetActor.GetEnabledTargetTypes(); targetTypes = order.TargetActor.GetEnabledTargetTypes();
return Info.Types.Overlaps(targetTypes); return info.Types.Overlaps(targetTypes);
} }
public string VoicePhraseForOrder(Actor self, Order order) public string VoicePhraseForOrder(Actor self, Order order)
{ {
return order.OrderString == "Infiltrate" && IsValidOrder(self, order) return order.OrderString == "Infiltrate" && IsValidOrder(self, order)
? Info.Voice : null; ? info.Voice : null;
} }
public void ResolveOrder(Actor self, Order order) public void ResolveOrder(Actor self, Order order)
@@ -95,14 +103,14 @@ namespace OpenRA.Mods.RA.Traits
var target = self.ResolveFrozenActorOrder(order, Color.Red); var target = self.ResolveFrozenActorOrder(order, Color.Red);
if (target.Type != TargetType.Actor if (target.Type != TargetType.Actor
|| !Info.Types.Overlaps(target.Actor.GetAllTargetTypes())) || !info.Types.Overlaps(target.Actor.GetAllTargetTypes()))
return; return;
if (!order.Queued) if (!order.Queued)
self.CancelActivity(); self.CancelActivity();
self.SetTargetLine(target, Color.Red); self.SetTargetLine(target, Color.Red);
self.QueueActivity(new Infiltrate(self, target.Actor)); self.QueueActivity(new Infiltrate(self, target.Actor, info.EnterBehaviour, info.ValidStances, info.Notification));
} }
} }