From ee0df9c1cb5eb483606639dfcaf57386e7422bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 8 Jun 2014 11:19:24 +0200 Subject: [PATCH] make C4 Demolition frozen actor aware --- OpenRA.Game/Traits/TraitsInterfaces.cs | 3 +++ OpenRA.Mods.RA/BridgeHut.cs | 6 ++++-- OpenRA.Mods.RA/Buildings/Demolishable.cs | 9 +++++++-- OpenRA.Mods.RA/C4Demolition.cs | 16 +++++----------- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index cfa990b7e0..ac9898a133 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -83,11 +83,14 @@ namespace OpenRA.Traits public interface ISeedableResource { void Seed(Actor self); } public interface IAcceptInfiltrator { void OnInfiltrate(Actor self, Actor infiltrator); } + + public interface IDemolishableInfo { bool IsValidTarget(ActorInfo actorInfo, Actor saboteur); } public interface IDemolishable { void Demolish(Actor self, Actor saboteur); bool IsValidTarget(Actor self, Actor saboteur); } + public interface IStoreOre { int Capacity { get; } } public interface INotifyDocking { void Docked(Actor self, Actor harvester); void Undocked(Actor self, Actor harvester); } public interface IEffectiveOwner diff --git a/OpenRA.Mods.RA/BridgeHut.cs b/OpenRA.Mods.RA/BridgeHut.cs index 1a51e44472..b26434f0ad 100644 --- a/OpenRA.Mods.RA/BridgeHut.cs +++ b/OpenRA.Mods.RA/BridgeHut.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 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, @@ -12,8 +12,10 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA { - class BridgeHutInfo : ITraitInfo + class BridgeHutInfo : IDemolishableInfo, ITraitInfo { + public bool IsValidTarget(ActorInfo actorInfo, Actor saboteur) { return false; } // TODO: bridges don't support frozen under fog + public object Create(ActorInitializer init) { return new BridgeHut(init); } } diff --git a/OpenRA.Mods.RA/Buildings/Demolishable.cs b/OpenRA.Mods.RA/Buildings/Demolishable.cs index 194298a755..7afa32ca47 100644 --- a/OpenRA.Mods.RA/Buildings/Demolishable.cs +++ b/OpenRA.Mods.RA/Buildings/Demolishable.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, @@ -14,7 +14,12 @@ using OpenRA.FileFormats; namespace OpenRA.Mods.RA { [Desc("Handle demolitions from C4 explosives.")] - public class DemolishableInfo : TraitInfo { } + public class DemolishableInfo : IDemolishableInfo, ITraitInfo + { + public bool IsValidTarget(ActorInfo actorInfo, Actor saboteur) { return true; } + + public object Create(ActorInitializer init) { return new Demolishable(); } + } public class Demolishable : IDemolishable { diff --git a/OpenRA.Mods.RA/C4Demolition.cs b/OpenRA.Mods.RA/C4Demolition.cs index ab395bde72..8824e75eda 100644 --- a/OpenRA.Mods.RA/C4Demolition.cs +++ b/OpenRA.Mods.RA/C4Demolition.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 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, @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Drawing; +using System.Linq; using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Orders; using OpenRA.Traits; @@ -19,6 +20,7 @@ namespace OpenRA.Mods.RA class C4DemolitionInfo : ITraitInfo { public readonly int C4Delay = 45; // 1.8 seconds + public object Create(ActorInitializer init) { return new C4Demolition(this); } } @@ -83,20 +85,12 @@ namespace OpenRA.Mods.RA if (modifiers.HasModifier(TargetModifiers.ForceMove)) return false; - var demolishable = target.TraitOrDefault(); - if (demolishable == null || !demolishable.IsValidTarget(target, self)) - return false; - - return true; + return target.TraitsImplementing().Any(i => i.IsValidTarget(target, self)); } public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { - // TODO: Bridges don't yet support FrozenUnderFog. - if (target.Actor != null && target.Actor.HasTrait()) - return false; - - return true; + return target.Info.Traits.WithInterface().Any(i => i.IsValidTarget(target.Info, self)); } } }