feat: key history algorithm

This commit is contained in:
Gerard Gascón 2024-04-14 20:02:15 +02:00
parent 5d2da3ddbf
commit 1869a92580
8 changed files with 115 additions and 10 deletions

View file

@ -17,7 +17,5 @@ namespace Domain {
}
public bool KeyDown(Type key) => _readers[key].KeyDown();
public bool KeyPressed(Type key) => _readers[key].KeyPressed();
public bool KeyUp(Type key) => _readers[key].KeyUp();
}
}

View file

@ -0,0 +1,57 @@
using System.Collections.Generic;
using System.Linq;
namespace Domain.Input {
public class GeminadaReader : InputReader {
protected override int Key { get; } = 0x33;
private int LKey { get; } = 76;
private bool _lPressed;
private bool _lWasPressed;
private bool _dotPressed;
private bool _dotWasPressed;
private List<int> _lastPresses;
public override void UpdateInput() {
if (UpdateLInput()) {
if (_lastPresses.Count == 0) {
_lastPresses.Add(LKey);
} else if (_lastPresses.Count >= 2) {
if (_lastPresses[^1] == Key && _lastPresses[^2] == LKey) {
IsPressed = true;
}
}
}
UpdateDotInput();
}
private bool UpdateDotInput() {
_dotWasPressed = _dotPressed;
short dotState = Win32API.GetAsyncKeyState(Key);
if (!_dotWasPressed && dotState != 0) {
_dotPressed = true;
return true;
}
if (_dotPressed && dotState == 0) {
_dotPressed = false;
}
return false;
}
private bool UpdateLInput() {
_lWasPressed = _lPressed;
short lState = Win32API.GetAsyncKeyState(LKey);
if (!_lWasPressed && lState != 0) {
_lPressed = true;
return true;
}
if (_lPressed && lState == 0) {
_lPressed = false;
}
return false;
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 057b144441c443ccb0a24de75397b551
timeCreated: 1713114678

View file

@ -1,17 +1,15 @@
namespace Domain.Input {
public abstract class InputReader {
private bool _wasPressed;
private bool _isPressed;
protected bool WasPressed;
protected bool IsPressed;
protected abstract int Key { get; }
public void UpdateInput() {
_wasPressed = _isPressed;
_isPressed = Win32API.GetAsyncKeyState(Key) != 0;
public virtual void UpdateInput() {
WasPressed = IsPressed;
IsPressed = Win32API.GetAsyncKeyState(Key) != 0;
}
public bool KeyDown() => _isPressed && !_wasPressed;
public bool KeyPressed() => _isPressed;
public bool KeyUp() => !_isPressed && _wasPressed;
public bool KeyDown() => IsPressed && !WasPressed;
}
}

View file

@ -0,0 +1,34 @@
using System.Collections.Generic;
namespace Domain {
public class KeyHistory {
private readonly List<int> _lastPresses = new();
private readonly List<int> _desiredSequence;
public KeyHistory(List<int> desiredSequence) {
_desiredSequence = desiredSequence;
}
public void KeyPressed(int key) => _lastPresses.Add(key);
public void ClearPressed() => _lastPresses.Clear();
public bool ContainsSequence() {
if (_lastPresses.Count < _desiredSequence.Count)
return false;
for (int i = 0; i < _lastPresses.Count; i++) {
if (i >= _desiredSequence.Count)
break;
int keyPressed = _lastPresses[_lastPresses.Count - 1 - i];
int sequenceKey = _desiredSequence[_desiredSequence.Count - 1 - i];
if (keyPressed != sequenceKey) {
return false;
}
}
return true;
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a63e60d016a84434ac8ae1855004239e
timeCreated: 1713116240