MoveKeys.cs
namespace PixelPusher;

/// <summary>
/// WASD plus the numpad as a second stick. 4/6 strafe, 8/2 up-down, corners diagonal.
/// Arrow aliases cover Num Lock off (4/6 become left/right).
/// </summary>
public static class MoveKeys
{
	public static bool Left => Input.Down( "Left" ) || AnyDown( "LEFTARROW", "KP_4", "KP_7", "KP_1", "HOME", "END" );
	public static bool Right => Input.Down( "Right" ) || AnyDown( "RIGHTARROW", "KP_6", "KP_9", "KP_3", "PGUP", "PGDN" );
	public static bool Forward => Input.Down( "Forward" ) || AnyDown( "UPARROW", "KP_8", "KP_7", "KP_9", "HOME", "PGUP" );
	public static bool Backward => Input.Down( "Backward" ) || AnyDown( "DOWNARROW", "KP_2", "KP_1", "KP_3", "END", "PGDN" );

	/// <summary>Numpad / arrows only — AnalogMove already covers WASD.</summary>
	public static bool StickLeft => AnyDown( "LEFTARROW", "KP_4", "KP_7", "KP_1", "HOME", "END" );
	public static bool StickRight => AnyDown( "RIGHTARROW", "KP_6", "KP_9", "KP_3", "PGUP", "PGDN" );
	public static bool StickUp => AnyDown( "UPARROW", "KP_8", "KP_7", "KP_9", "HOME", "PGUP" );
	public static bool StickDown => AnyDown( "DOWNARROW", "KP_2", "KP_1", "KP_3", "END", "PGDN" );

	public static bool JumpHeld( bool walk3d )
	{
		if ( Input.Down( "Jump" ) || AnyDown( "KP_0", "KP_PLUS", "KP_ENTER", "INS" ) )
			return true;
		return !walk3d && AnyDown( "UPARROW", "KP_8", "KP_7", "KP_9", "HOME", "PGUP" );
	}

	public static bool JumpPressed( bool walk3d )
	{
		if ( Input.Pressed( "Jump" ) || AnyPressed( "KP_0", "KP_PLUS", "KP_ENTER", "INS" ) )
			return true;
		return !walk3d && AnyPressed( "UPARROW", "KP_8", "KP_7", "KP_9", "HOME", "PGUP" );
	}

	public static bool ZoomIn => Pressed( "KP_PLUS" );
	public static bool ZoomOut => Pressed( "KP_MINUS" );
	public static bool Home => Pressed( "KP_5" );
	public static bool DropIn => Pressed( "KP_ENTER" );

	static bool AnyDown( params string[] keys )
	{
		foreach ( var key in keys )
		{
			if ( Down( key ) )
				return true;
		}

		return false;
	}

	static bool AnyPressed( params string[] keys )
	{
		foreach ( var key in keys )
		{
			if ( Pressed( key ) )
				return true;
		}

		return false;
	}

	static bool Down( string key )
	{
		try
		{
			return Input.Keyboard.Down( key );
		}
		catch
		{
			return false;
		}
	}

	static bool Pressed( string key )
	{
		try
		{
			return Input.Keyboard.Pressed( key );
		}
		catch
		{
			return false;
		}
	}
}