wzorzec, który pozwala przekazywać obsługę operacji do następnych handlerów;

Jeśli umiesz obsłuzyc => robisz
Nie umiesz => dajesz następnemu

// Bazowy handler
abstract class InputHandler
{
    private InputHandler _next;

    public InputHandler SetNext(InputHandler next)
    {
        _next = next;
        return next; // pozwala na chainowanie: a.SetNext(b).SetNext(c)
    }

    public virtual void Handle(ConsoleKey key, Player player)
    {
        _next?.Handle(key, player);
    }
}

// Konkretne handlery
class MovementHandler : InputHandler
{
    public override void Handle(ConsoleKey key, Player player)
    {
        switch (key)
        {
            case ConsoleKey.W: player.Y--; return;
            case ConsoleKey.S: player.Y++; return;
            case ConsoleKey.A: player.X--; return;
            case ConsoleKey.D: player.X++; return;
        }
        base.Handle(key, player); // nie mój klawisz — przekaż dalej
    }
}

class InventoryHandler : InputHandler
{
    public override void Handle(ConsoleKey key, Player player)
    {
        if (key == ConsoleKey.I)
        {
            Console.WriteLine("Otwieram inventory...");
            return;
        }
        base.Handle(key, player);
    }
}

class PauseHandler : InputHandler
{
    public override void Handle(ConsoleKey key, Player player)
    {
        if (key == ConsoleKey.Escape)
        {
            Console.WriteLine("Pauza");
            return;
        }
        base.Handle(key, player);
    }
}