Files
2026-07-13 13:13:17 +08:00

90 lines
2.8 KiB
C#

using T3.SystemUi;
namespace Lib.io.input;
[Guid("e7cdc103-4be4-4465-b77d-a66917cec5f6")]
internal sealed class KeyboardInputAsInt : Instance<KeyboardInputAsInt>
{
[Output(Guid = "64B9DEC6-2B3A-4D7E-A174-991C8A8B92CE", DirtyFlagTrigger = DirtyFlagTrigger.Animated)]
public readonly Slot<int> PressedNumber = new();
public KeyboardInputAsInt()
{
PressedNumber.UpdateAction = Update;
}
private int _lastPressedNumber = 0;
private void Update(EvaluationContext context)
{
int currentZone = Zone.GetValue(context);
int currentMode = Mode.GetValue(context);
bool keyPressed = false;
int newPressedNumber = 0;
switch (currentZone)
{
case 0: // Number row keys (48-57)
for (int i = 48; i <= 57; i++)
{
if (KeyHandler.PressedKeys[i])
{
newPressedNumber = i - 48;
keyPressed = true;
break;
}
}
break;
case 1: // Numpad keys (96-105)
for (int i = 96; i <= 105; i++)
{
if (KeyHandler.PressedKeys[i])
{
newPressedNumber = i - 96;
keyPressed = true;
break;
}
}
break;
}
switch (currentMode)
{
case 0: // Original behavior - value is 0 when key is released
PressedNumber.Value = keyPressed ? newPressedNumber : 0;
_lastPressedNumber = PressedNumber.Value;
break;
case 1: // Hold value - only update on new key press
if (keyPressed && newPressedNumber != _lastPressedNumber)
{
_lastPressedNumber = newPressedNumber;
PressedNumber.Value = newPressedNumber;
}
else if (!keyPressed)
{
PressedNumber.Value = _lastPressedNumber;
}
break;
}
}
private enum Modes
{
IsDown,
KeepActive,
}
private enum Zones
{
NumRow,
Numpad,
}
[Input(Guid = "2aa9e2e4-1830-4483-88e5-1f2ca50bfe3f", MappedType = typeof(Zones))]
public readonly InputSlot<int> Zone = new();
[Input(Guid = "8846aa50-e4d0-433c-9e5b-013a93f17f79", MappedType = typeof(Modes))]
public readonly InputSlot<int> Mode = new();
}