Enemy subclass RunnerElite, configures stats and behavior for an elite runner enemy. Overrides health, spawn scale, death blood amount, start initialization, rotation handling, target offset calculation, and jump sound effect.
using System;
using Sandbox;
public class RunnerElite : Runner
{
public override EnemyType EnemyType => EnemyType.RunnerElite;
public override float GetMaxHealth()
{
switch ( Manager.Instance.Difficulty )
{
case 0: default: return 105f;
case 1: return 120f;
case 2: return 125f;
}
}
public override Vector3 SpawnScale => new Vector3( 1.4f );
public override int ExtraDeathBloodSprayAmount => 20;
protected override void OnStart()
{
base.OnStart();
CoinValueMin = 3;
CoinValueMax = 4;
CoinChance = 1f;
PushStrength = 7000f;
Weight = 1.4f;
_personalSpeedScale = Game.Random.Float( 1.0f, 1.1f );
_personalSpeedFreq = Game.Random.Float( 14f, 15f );
if ( IsProxy )
return;
AggroRange = 140f;
DetectTargetRange = 700f;
LoseTargetRange = 1000f;
LoseTargetTime = 7f;
MeleeDamage = Utils.Select( Manager.Instance.Difficulty, 7f, 8f, 9f );
DamageTargetDelay = 0.5f;
_personalTurnSpeed = Game.Random.Float( 7f, 9f );
Acceleration = 130f * Utils.Select(Manager.Instance.Difficulty, 0.9f, 1f, 1.13f);
AccelerationAttacking = 145f * Utils.Select(Manager.Instance.Difficulty, 0.9f, 1f, 1.13f);
Deceleration = 1.6f;
DecelerationAttacking = 1.45f;
_evadeDelayMin = 0.8f;
_evadeDelayMax = 3.6f;
_evadeDelay = Game.Random.Float( _evadeDelayMin, _evadeDelayMax );
_evadeVelocityMin = 120f;
_evadeVelocityMax = 250f;
_nextJumpDelayMin = 1f;
_nextJumpDelayMax = 8f;
_delayUntilNextJump = Game.Random.Float( _nextJumpDelayMin, _nextJumpDelayMax );
_maxJumpDist = 450f;
_retreatVelocityMin = 150f;
_retreatVelocityMax = 350f;
}
protected override void HandleRotation()
{
base.HandleRotation();
if ( _isRetreating )
WorldRotation = Rotation.Lerp( WorldRotation, Rotation.FromYaw( WorldRotation.Yaw() + Utils.FastSin( TimeSinceSpawn * 0.45f ) * 75f ), _personalTurnSpeed * Time.Delta * TimeScale );
}
protected override Vector2 GetTargetOffset()
{
if ( IsAttacking || _isRetreating )
return Vector2.Zero;
return TargetUnit.Velocity * (0.6f + Utils.FastSin( TimeSinceSpawn * 0.29f ) * 0.5f) * (TargetUnit.Position2D - Position2D).Length * 0.02f
+ new Vector2( Utils.FastSin( TimeSinceSpawn * 0.33f ), Utils.FastSin( TimeSinceSpawn * 0.38f ) ) * (100f + Utils.FastSin( TimeSinceSpawn * 0.77f ) * 250f);
}
protected override void PlayJumpSfx()
{
Manager.Instance.PlaySfxNearby( "jump_whoosh", Position2D, pitch: Game.Random.Float( 1.65f, 1.7f ), volume: 0.4f, maxDist: 300f );
}
}