diff --git a/OpenRA.Mods.RA/Render/RenderInfantry.cs b/OpenRA.Mods.RA/Render/RenderInfantry.cs index d5df8624bf..44aec38337 100644 --- a/OpenRA.Mods.RA/Render/RenderInfantry.cs +++ b/OpenRA.Mods.RA/Render/RenderInfantry.cs @@ -16,7 +16,7 @@ using OpenRA.Mods.RA.Move; namespace OpenRA.Mods.RA.Render { - public class RenderInfantryInfo : RenderSimpleInfo + public class RenderInfantryInfo : RenderSimpleInfo, ITraitPrerequisite { public readonly int MinIdleWaitTicks = 30; public readonly int MaxIdleWaitTicks = 110; @@ -37,8 +37,7 @@ namespace OpenRA.Mods.RA.Render }; public bool Panicked = false; - public bool Prone = false; - bool wasProne = false; + protected bool dirty = false; RenderInfantryInfo Info; string idleSequence; @@ -46,8 +45,7 @@ namespace OpenRA.Mods.RA.Render protected virtual string NormalizeInfantrySequence(Actor self, string baseSequence) { - var prefix = Prone ? "prone-" : - Panicked ? "panic-" : ""; + var prefix = Panicked ? "panic-" : ""; if (anim.HasSequence(prefix + baseSequence)) return prefix + baseSequence; @@ -57,7 +55,7 @@ namespace OpenRA.Mods.RA.Render protected virtual bool AllowIdleAnimation(Actor self) { - return Info.IdleAnimations.Length > 0 && !Prone && !Panicked; + return Info.IdleAnimations.Length > 0 && !Panicked; } public AnimationState State { get; private set; } @@ -84,17 +82,17 @@ namespace OpenRA.Mods.RA.Render { base.Tick(self); - if ((State == AnimationState.Moving || wasProne != Prone) && !mobile.IsMoving) + if ((State == AnimationState.Moving || dirty) && !mobile.IsMoving) { State = AnimationState.Waiting; anim.PlayFetchIndex(NormalizeInfantrySequence(self, "stand"), () => 0); } - else if ((State != AnimationState.Moving || wasProne != Prone) && mobile.IsMoving) + else if ((State != AnimationState.Moving || dirty) && mobile.IsMoving) { State = AnimationState.Moving; anim.PlayRepeating(NormalizeInfantrySequence(self, "run")); } - wasProne = Prone; + dirty = false; } public void TickIdle(Actor self) diff --git a/OpenRA.Mods.RA/TakeCover.cs b/OpenRA.Mods.RA/TakeCover.cs index 29f88506b5..13bc1f4be2 100644 --- a/OpenRA.Mods.RA/TakeCover.cs +++ b/OpenRA.Mods.RA/TakeCover.cs @@ -14,7 +14,7 @@ using OpenRA.Mods.RA.Render; namespace OpenRA.Mods.RA { - class TakeCoverInfo : ITraitInfo, ITraitPrerequisite + public class TakeCoverInfo : ITraitInfo { public readonly int ProneTime = 100; /* ticks, =4s */ public readonly float ProneDamage = .5f; @@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA } // Infantry prone behavior - class TakeCover : ITick, INotifyDamage, IDamageModifier, ISpeedModifier, ISync + public class TakeCover : ITick, INotifyDamage, IDamageModifier, ISpeedModifier, ISync { TakeCoverInfo Info; [Sync] @@ -38,25 +38,14 @@ namespace OpenRA.Mods.RA public void Damaged(Actor self, AttackInfo e) { - if (e.Damage > 0) /* Don't go prone when healed */ - { - if (e.Warhead == null || !e.Warhead.PreventProne) - { - remainingProneTime = Info.ProneTime; - self.Trait().Prone = true; - } - } + if (e.Damage > 0 && e.Warhead == null || !e.Warhead.PreventProne) /* Don't go prone when healed */ + remainingProneTime = Info.ProneTime; } public void Tick(Actor self) { - if (!IsProne) - return; - - //var ri = self.Trait(); - - if (--remainingProneTime <= 0) - self.Trait().Prone = false; + if (IsProne) + remainingProneTime--; } public float GetDamageModifier(Actor attacker, WarheadInfo warhead ) @@ -69,4 +58,45 @@ namespace OpenRA.Mods.RA return IsProne ? Info.ProneSpeed : 1m; } } + + class RenderInfantryProneInfo : RenderInfantryInfo, ITraitPrerequisite + { + public override object Create(ActorInitializer init) { return new RenderInfantryProne(init.self, this); } + } + + class RenderInfantryProne : RenderInfantry + { + readonly TakeCover tc; + bool wasProne; + + public RenderInfantryProne(Actor self, RenderInfantryProneInfo info) + : base(self, info) + { + tc = self.Trait(); + } + + protected override string NormalizeInfantrySequence(Actor self, string baseSequence) + { + var prefix = tc != null && tc.IsProne ? "prone-" : ""; + + if (anim.HasSequence(prefix + baseSequence)) + return prefix + baseSequence; + else + return baseSequence; + } + + protected override bool AllowIdleAnimation(Actor self) + { + return base.AllowIdleAnimation(self) && !tc.IsProne; + } + + public override void Tick (Actor self) + { + if (wasProne != tc.IsProne) + dirty = true; + + wasProne = tc.IsProne; + base.Tick(self); + } + } } diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index 2fca8a4c5d..b9f7b6ae4b 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -112,7 +112,8 @@ TargetTypes: Ground Buildable: Queue: Infantry - RenderInfantry: + TakeCover: + RenderInfantryProne: AutoTarget: AttackMove: Passenger: @@ -132,6 +133,9 @@ Inherits: ^Infantry -Buildable: -AutoTarget: + -TakeCover: + -RenderInfantryProne: + RenderInfantry: AppearsOnRadar: Selectable: Voice: CivilianMaleVoice diff --git a/mods/cnc/rules/infantry.yaml b/mods/cnc/rules/infantry.yaml index c80afe3307..c1b1da0877 100644 --- a/mods/cnc/rules/infantry.yaml +++ b/mods/cnc/rules/infantry.yaml @@ -17,8 +17,7 @@ E1: HP: 50 AttackFrontal: PrimaryWeapon: M16 - TakeCover: - RenderInfantry: + RenderInfantryProne: IdleAnimations: idle1,idle2,idle3,idle4 E2: Inherits: ^Infantry @@ -42,8 +41,7 @@ E2: PrimaryWeapon: Grenade PrimaryOffset: 0,0,0,-10 FireDelay: 15 - TakeCover: - RenderInfantry: + RenderInfantryProne: IdleAnimations: idle1,idle2 E3: @@ -67,8 +65,7 @@ E3: PrimaryWeapon: Rockets PrimaryOffset: 0,0,0,-10 FireDelay: 5 - TakeCover: - RenderInfantry: + RenderInfantryProne: IdleAnimations: idle1,idle2 E4: @@ -93,9 +90,8 @@ E4: PrimaryWeapon: Flamethrower PrimaryOffset: 0,0,0,-5 FireDelay: 3 - TakeCover: WithMuzzleFlash: - RenderInfantry: + RenderInfantryProne: IdleAnimations: idle1,idle2 E5: @@ -120,10 +116,9 @@ E5: PrimaryWeapon: Chemspray PrimaryOffset: 0,0,0,-5 FireDelay: 3 - TakeCover: WithMuzzleFlash: -PoisonedByTiberium: - RenderInfantry: + RenderInfantryProne: IdleAnimations: idle1,idle2 E6: @@ -143,7 +138,6 @@ E6: Speed: 4 Health: HP: 25 - TakeCover: Passenger: PipType: Yellow EngineerRepair: @@ -151,7 +145,7 @@ E6: -AutoTarget: AttackMove: JustMove: true - RenderInfantry: + RenderInfantryProne: IdleAnimations: idle1,idle2 RMBO: @@ -175,12 +169,11 @@ RMBO: HP: 200 RevealsShroud: Range: 5 - TakeCover: C4Demolition: C4Delay: .03 AttackFrontal: PrimaryWeapon: Sniper - RenderInfantry: + RenderInfantryProne: IdleAnimations: idle1,idle2,idle3 VICE: @@ -203,4 +196,5 @@ VICE: WithMuzzleFlash: Armor: Type: Wood - -PoisonedByTiberium: \ No newline at end of file + -PoisonedByTiberium: + -TakeCover: \ No newline at end of file