From 04c09dda3122db23e486dfe019fe89b283c0ffdb Mon Sep 17 00:00:00 2001 From: penev92 Date: Tue, 30 Dec 2014 02:04:32 +0200 Subject: [PATCH] Add a delay before wandering, use it on viceroids Add a Min and Max delay and make it random --- OpenRA.Mods.RA/Traits/Wanders.cs | 30 ++++++++++++++++++++---------- mods/cnc/rules/civilian.yaml | 2 ++ mods/ts/rules/infantry.yaml | 2 ++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.RA/Traits/Wanders.cs b/OpenRA.Mods.RA/Traits/Wanders.cs index 168ce9a3ce..dbd529846b 100644 --- a/OpenRA.Mods.RA/Traits/Wanders.cs +++ b/OpenRA.Mods.RA/Traits/Wanders.cs @@ -13,22 +13,29 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA.Traits { - [Desc("Wanders around aimlesly when idle.")] + [Desc("Wanders around aimlessly while idle.")] abstract class WandersInfo : ITraitInfo { public readonly int WanderMoveRadius = 10; - [Desc("Number of ticks to wait until decreasing the effective move radius.")] - public readonly int MoveReductionRadiusScale = 5; + [Desc("Number of ticks to wait before decreasing the effective move radius.")] + public readonly int TicksToWaitBeforeReducingMoveRadius = 5; + + [Desc("Mimimum ammount of ticks the actor will sit idly before starting to wander.")] + public readonly int MinMoveDelayInTicks = 0; + + [Desc("Maximum ammount of ticks the actor will sit idly before starting to wander.")] + public readonly int MaxMoveDelayInTicks = 0; public abstract object Create(ActorInitializer init); } - class Wanders : INotifyAddedToWorld, INotifyBecomingIdle + class Wanders : INotifyIdle, INotifyBecomingIdle { readonly Actor self; readonly WandersInfo info; + int countdown; int ticksIdle; int effectiveMoveRadius; @@ -39,13 +46,16 @@ namespace OpenRA.Mods.RA.Traits effectiveMoveRadius = info.WanderMoveRadius; } - public void AddedToWorld(Actor self) - { - OnBecomingIdle(self); - } - public void OnBecomingIdle(Actor self) { + countdown = self.World.SharedRandom.Next(info.MinMoveDelayInTicks, info.MaxMoveDelayInTicks); + } + + public void TickIdle(Actor self) + { + if (--countdown > 0) + return; + var targetPos = PickTargetLocation(); if (targetPos != CPos.Zero) DoAction(self, targetPos); @@ -59,7 +69,7 @@ namespace OpenRA.Mods.RA.Traits if (!self.World.Map.Contains(targetCell)) { // If MoveRadius is too big there might not be a valid cell to order the attack to (if actor is on a small island and can't leave) - if (++ticksIdle % info.MoveReductionRadiusScale == 0) + if (++ticksIdle % info.TicksToWaitBeforeReducingMoveRadius == 0) effectiveMoveRadius--; return CPos.Zero; // We'll be back the next tick; better to sit idle for a few seconds than prolong this tick indefinitely with a loop diff --git a/mods/cnc/rules/civilian.yaml b/mods/cnc/rules/civilian.yaml index 2e07980ef2..0167e02dab 100644 --- a/mods/cnc/rules/civilian.yaml +++ b/mods/cnc/rules/civilian.yaml @@ -459,6 +459,8 @@ VICE: AttackFrontal: AttackWander: WanderMoveRadius: 2 + MinMoveDelayInTicks: 25 + MaxMoveDelayInTicks: 45 RenderUnit: WithMuzzleFlash: SplitFacings: true diff --git a/mods/ts/rules/infantry.yaml b/mods/ts/rules/infantry.yaml index 78422e3035..d01208595f 100644 --- a/mods/ts/rules/infantry.yaml +++ b/mods/ts/rules/infantry.yaml @@ -584,6 +584,8 @@ DOGGIE: AttackFrontal: AttackWander: WanderMoveRadius: 2 + MinMoveDelayInTicks: 25 + MaxMoveDelayInTicks: 45 VISSML: Inherits: ^Infantry