diff --git a/OpenRA.Mods.RA/Render/RenderInfantry.cs b/OpenRA.Mods.RA/Render/RenderInfantry.cs index 44aec38337..1345b10bcf 100644 --- a/OpenRA.Mods.RA/Render/RenderInfantry.cs +++ b/OpenRA.Mods.RA/Render/RenderInfantry.cs @@ -36,7 +36,6 @@ namespace OpenRA.Mods.RA.Render IdleAnimating }; - public bool Panicked = false; protected bool dirty = false; RenderInfantryInfo Info; @@ -45,17 +44,12 @@ namespace OpenRA.Mods.RA.Render protected virtual string NormalizeInfantrySequence(Actor self, string baseSequence) { - var prefix = Panicked ? "panic-" : ""; - - if (anim.HasSequence(prefix + baseSequence)) - return prefix + baseSequence; - else - return baseSequence; + return baseSequence; } protected virtual bool AllowIdleAnimation(Actor self) { - return Info.IdleAnimations.Length > 0 && !Panicked; + return Info.IdleAnimations.Length > 0; } public AnimationState State { get; private set; } diff --git a/OpenRA.Mods.RA/ScaredyCat.cs b/OpenRA.Mods.RA/ScaredyCat.cs index 21f49477a9..c9eab8b77f 100644 --- a/OpenRA.Mods.RA/ScaredyCat.cs +++ b/OpenRA.Mods.RA/ScaredyCat.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA class ScaredyCat : INotifyIdle, INotifyDamage { readonly ScaredyCatInfo Info; - bool Panicked = false; + public bool Panicked = false; public ScaredyCat(Actor self, ScaredyCatInfo info) { Info = info; @@ -36,16 +36,55 @@ namespace OpenRA.Mods.RA { if (!Panicked) return; + var target = Util.SubPxVector[self.World.SharedRandom.Next(255)]* Info.MoveRadius / 1024 + self.Location; self.Trait().ResolveOrder(self, new Order("Move", self, false) { TargetLocation = target }); } public void Damaged(Actor self, AttackInfo e) { - if (Panicked) - return; Panicked = true; - self.Trait().Panicked = true; + } + } + + class RenderInfantryPanicInfo : RenderInfantryInfo, ITraitPrerequisite + { + public override object Create(ActorInitializer init) { return new RenderInfantryPanic(init.self, this); } + } + + class RenderInfantryPanic : RenderInfantry + { + readonly ScaredyCat sc; + bool wasPanic; + + public RenderInfantryPanic(Actor self, RenderInfantryPanicInfo info) + : base(self, info) + { + sc = self.Trait(); + } + + protected override string NormalizeInfantrySequence(Actor self, string baseSequence) + { + var prefix = sc != null && sc.Panicked ? "panic-" : ""; + + if (anim.HasSequence(prefix + baseSequence)) + return prefix + baseSequence; + else + return baseSequence; + } + + protected override bool AllowIdleAnimation(Actor self) + { + return base.AllowIdleAnimation(self) && !sc.Panicked; + } + + public override void Tick (Actor self) + { + if (wasPanic != sc.Panicked) + dirty = true; + + wasPanic = sc.Panicked; + base.Tick(self); } } } diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index b9f7b6ae4b..d7fa1a90d1 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -135,7 +135,6 @@ -AutoTarget: -TakeCover: -RenderInfantryProne: - RenderInfantry: AppearsOnRadar: Selectable: Voice: CivilianMaleVoice @@ -158,6 +157,7 @@ ProximityCaptor: Types:CivilianInfantry ScaredyCat: + RenderInfantryPanic: ^Plane: AppearsOnRadar: