making dash through target a dedicated dash action

This commit is contained in:
2026-05-04 13:22:25 +02:00
parent bed1384dc7
commit b2b7baffe8

View File

@@ -1261,6 +1261,13 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
_playerState.SendEvent("cancel_aim"); _playerState.SendEvent("cancel_aim");
return; return;
} }
var isInputtingForward = IsPlayerInputtingForward() || GetMoveInput().Length() < Mathf.Epsilon;
if (_isEnemyInDashAttackRange && isInputtingForward)
{
_playerState.SendEvent("dash_attack");
return;
}
if (GetMoveInput().Length() < Mathf.Epsilon) return; if (GetMoveInput().Length() < Mathf.Epsilon) return;
@@ -2399,7 +2406,6 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen));
return; return;
} }
if (!CloseEnemyDetector.IsColliding()) if (!CloseEnemyDetector.IsColliding())
{ {
@@ -2419,15 +2425,15 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
// var targetDistance = _targetLocation.DistanceTo(GlobalPosition); // var targetDistance = _targetLocation.DistanceTo(GlobalPosition);
positionOnScreen = Camera.UnprojectPosition(_targetLocation); positionOnScreen = Camera.UnprojectPosition(_targetLocation);
var wouldKill = false; // var wouldKill = false;
if (_targetObject is IHealthable h and IDamageable d) // if (_targetObject is IHealthable h and IDamageable d)
{ // {
var wouldBeDamage = d.ComputeDamage(new DamageRecord(GlobalPosition, RDamage)); // var wouldBeDamage = d.ComputeDamage(new DamageRecord(GlobalPosition, RDamage));
if (h.CurrentHealth < wouldBeDamage.Damage.DamageDealt) wouldKill = true; // if (h.CurrentHealth < wouldBeDamage.Damage.DamageDealt) wouldKill = true;
} // }
_isEnemyInDashAttackRange = true; _isEnemyInDashAttackRange = true;
enemyTargetState = wouldKill ? PlayerUi.TargetState.TargetWouldKill : PlayerUi.TargetState.TargetWouldNotKill; // enemyTargetState = wouldKill ? PlayerUi.TargetState.TargetWouldKill : PlayerUi.TargetState.TargetWouldNotKill;
PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(PlayerUi.TargetState.TargetWouldNotKill, positionOnScreen));
} }
public DamageRecord TakeDamage(DamageRecord damageRecord) public DamageRecord TakeDamage(DamageRecord damageRecord)
@@ -2475,11 +2481,10 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
private PhysicsDirectSpaceState3D _spaceState = null!; private PhysicsDirectSpaceState3D _spaceState = null!;
public void StartDashAction(bool isParry) public void StartDashAction(bool isParry)
{ {
if (isParry) HeadSystem.OnParry(); // if (isParry) HeadSystem.OnParry();
else HeadSystem.OnHit(); // else HeadSystem.OnHit();
// var streamName = isParry ? "parry" : "attacks";
var streamName = isParry ? "parry" : "attacks"; _audioStream.SwitchToClipByName("dash");
_audioStream.SwitchToClipByName(streamName);
IsInvincible = true; IsInvincible = true;
var plannedDashLocation = _targetLocation + Vector3.Down*_playerHeight/2; var plannedDashLocation = _targetLocation + Vector3.Down*_playerHeight/2;
@@ -2518,8 +2523,7 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
{ {
if (_targetObject is IForgeEntity entity) if (_targetObject is IForgeEntity entity)
{ {
_hitEnemies.Add(entity); TriggerSimpleDashThroughDamage(entity);
TriggerDamage();
} }
if (_targetObject is IStunnable stunnable) if (_targetObject is IStunnable stunnable)
{ {
@@ -2529,6 +2533,13 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
_playerState.SendEvent("attack_finished"); _playerState.SendEvent("attack_finished");
} }
public void TriggerSimpleDashThroughDamage(IForgeEntity entity)
{
// Emulate normal hit
_hitEnemies.Add(entity);
TriggerDamage();
}
public void OnDashAttackEnded() public void OnDashAttackEnded()
{ {
StopDashAction(); StopDashAction();