This commit is contained in:
Boki 2026-02-21 21:48:58 -05:00
parent aee3a7f22c
commit 152c74fa15
5 changed files with 122 additions and 26 deletions

View file

@ -32,6 +32,11 @@ public class CombatManager
private long _lastOrbitMs;
private int _nextOrbitMs = OrbitStepMinMs;
// Chase — walks toward a screen position instead of orbiting
private volatile int _chaseX = -1;
private volatile int _chaseY = -1;
private readonly HashSet<int> _chaseKeys = new();
// Smoothed mouse position — lerps toward target to avoid jitter
private double _smoothX = 1280;
private double _smoothY = 720;
@ -39,6 +44,18 @@ public class CombatManager
public bool IsHolding => _holding;
public void SetChaseTarget(int screenX, int screenY)
{
_chaseX = screenX;
_chaseY = screenY;
}
public void ClearChaseTarget()
{
_chaseX = -1;
_chaseY = -1;
}
public CombatManager(IGameController game, HudReader hudReader, FlaskManager flasks)
{
_game = game;
@ -52,7 +69,16 @@ public class CombatManager
public async Task Tick(int x, int y, int jitter = 30)
{
await _flasks.Tick();
await UpdateOrbit();
if (_chaseX >= 0)
{
await UpdateChase();
}
else
{
if (_chaseKeys.Count > 0) await ReleaseChaseKeys();
await UpdateOrbit();
}
// Lerp smoothed position toward target
_smoothX += (x - _smoothX) * SmoothFactor;
@ -106,6 +132,55 @@ public class CombatManager
}
}
/// <summary>
/// Walk toward chase target using held WASD keys. Replaces orbit when active.
/// </summary>
private async Task UpdateChase()
{
// Release orbit key when entering chase mode
if (_orbitIndex >= 0)
{
await _game.KeyUp(OrbitKeys[_orbitIndex]);
_orbitIndex = -1;
}
const int screenCx = 1280, screenCy = 720;
var cx = _chaseX;
var cy = _chaseY;
var dx = cx - screenCx;
var dy = cy - screenCy;
var dist = Math.Sqrt(dx * dx + dy * dy);
var wanted = new HashSet<int>();
if (dist > 100)
{
var dirX = dx / dist;
var dirY = dy / dist;
if (dirY < -0.3) wanted.Add(InputSender.VK.W);
if (dirY > 0.3) wanted.Add(InputSender.VK.S);
if (dirX < -0.3) wanted.Add(InputSender.VK.A);
if (dirX > 0.3) wanted.Add(InputSender.VK.D);
}
foreach (var k in _chaseKeys.Except(wanted).ToList())
{
await _game.KeyUp(k);
_chaseKeys.Remove(k);
}
foreach (var k in wanted.Except(_chaseKeys).ToList())
{
await _game.KeyDown(k);
_chaseKeys.Add(k);
}
}
private async Task ReleaseChaseKeys()
{
foreach (var k in _chaseKeys)
await _game.KeyUp(k);
_chaseKeys.Clear();
}
/// <summary>
/// Cycle WASD directions to orbit in a small circle while attacking.
/// </summary>
@ -150,6 +225,9 @@ public class CombatManager
_smoothX = 1280;
_smoothY = 720;
await ReleaseOrbit();
await ReleaseChaseKeys();
_chaseX = -1;
_chaseY = -1;
}
/// <summary>
@ -164,5 +242,8 @@ public class CombatManager
_holding = false;
}
await ReleaseOrbit();
await ReleaseChaseKeys();
_chaseX = -1;
_chaseY = -1;
}
}