Added reaction time to enemies

This commit is contained in:
Marco 2025-03-25 15:15:04 +01:00
commit 543f5f0d6b
11 changed files with 63 additions and 31 deletions

View file

@ -20,14 +20,18 @@ public partial class Shooting : EnemyStateBase
[Export]
public NavigationMovementModule NavigationModule { get; private set; }
[Export] public float MaxStrafeDistance { get; private set; } = 64f;
[Export] public float MinStrafeDistance { get; private set; } = 16f;
// [Export] public float MaxStrafeDistance { get; private set; } = 64f;
// [Export] public float MinStrafeDistance { get; private set; } = 16f;
[Export] public Weapon EquippedWeapon;
private bool _isPlayerInRange = false;
private Vector2? _currentStrafeTarget = null;
private float _strafeSpeed => StorageModule.EnemyData.StrafeSpeed;
private double _responseTimer = 0;
public override void EnterState()
{
@ -45,18 +49,8 @@ public partial class Shooting : EnemyStateBase
EquippedWeapon.WeaponData = StorageModule.Root.EnemyResource.Weapon;
_currentStrafeTarget = null;
// PlayerDetection.SetRange(StorageModule.Root.EnemyResource.PlayerDetectionRange);
//
// _isPlayerInRange = PlayerDetection.IsPlayerInRange(StorageModule.Root.EnemyResource.PlayerDetectionRange);
//
// PlayerDetection.PlayerInRange += PlayerDetectionOnPlayerInRange;
//
// PlayerDetection.PlayerOutOfRange += PlayerDetectionOnPlayerOutOfRange;
//
// DamageReceiver.ChangeState(true);
//
// DamageReceiver.HealthProvider.ResourceDepleted += HealthProviderOnResourceDepleted;
_responseTimer = 0;
}
private void HealthProviderOnResourceDepleted()
@ -93,10 +87,21 @@ public partial class Shooting : EnemyStateBase
// SHOOT
Shoot();
// Check if a strafe position is needed
if (!_currentStrafeTarget.HasValue || NavigationModule.IsNavigationFinished())
if (_strafeSpeed > 0)
{
_currentStrafeTarget = CalculateStrafePosition();
// Check if a strafe position is needed
if (!_currentStrafeTarget.HasValue || NavigationModule.IsNavigationFinished())
{
if (_responseTimer < StorageModule.EnemyData.ResponseTime)
{
_responseTimer += delta;
}
else
{
_currentStrafeTarget = CalculateStrafePosition();
_responseTimer = 0;
}
}
}
}
else
@ -108,7 +113,7 @@ public partial class Shooting : EnemyStateBase
if (_currentStrafeTarget.HasValue)
{
NavigationModule.SetTarget(_currentStrafeTarget.Value);
NavigationModule.Move();
NavigationModule.Move(_strafeSpeed);
}
}
@ -129,7 +134,7 @@ public partial class Shooting : EnemyStateBase
for (float factor = 1f; factor > 0.25f; factor *= 0.75f)
{
float strafeDistance = Mathf.Lerp(MinStrafeDistance, MaxStrafeDistance, factor);
float strafeDistance = Mathf.Lerp(StorageModule.EnemyData.MinStrafeDistance, StorageModule.EnemyData.MaxStrafeDistance, factor);
Vector2 newPos = enemyPos + (tryLeftFirst ? leftStrafe : rightStrafe) * strafeDistance;
if (NavigationModule.IsNavigable(newPos) && PlayerDetection.HasLineOfSight(newPos, playerPos))
{
@ -139,7 +144,7 @@ public partial class Shooting : EnemyStateBase
for (float factor = 1f; factor > 0.25f; factor *= 0.75f)
{
float strafeDistance = Mathf.Lerp(MinStrafeDistance, MaxStrafeDistance, factor);
float strafeDistance = Mathf.Lerp(StorageModule.EnemyData.MinStrafeDistance, StorageModule.EnemyData.MaxStrafeDistance, factor);
Vector2 newPos = enemyPos + (tryLeftFirst ? rightStrafe : leftStrafe) * strafeDistance;
if (NavigationModule.IsNavigable(newPos) && PlayerDetection.HasLineOfSight(newPos, playerPos))
{