return {
    -- Difficulty knobs passed straight into each terminal minigame (the daemons you `run` during
    -- an intrusion). Every value below is the game's built-in default; keys match the module names
    -- shown by the `games` command.

    -- Network Maze (net-maze.exe) - navigate the fog-of-war maze to the exit node.
    maze = {
        width = 21, -- maze cells wide (7-41); bigger = harder
        height = 15, -- maze cells tall (7-27); bigger = harder
        timeLimit = 60, -- seconds before the trace catches you (0 = no limit)
        visibility = 5, -- vision radius in cells (2-10); lower = harder
        dataNodes = 3, -- fragments to grab before the exit unlocks (0-8)
    },

    -- Grid Node Capture (node-grab.exe) - capture nodes before too many expire.
    capture = {
        gridSize = 10, -- grid cells per side (6-16)
        nodeDuration = 2200, -- ms a node lasts before expiring (min 800); lower = harder
        capturesRequired = 15, -- nodes to capture to win (min 3)
        maxMisses = 5, -- expired nodes allowed before lockout (min 1); lower = harder
    },

    -- Cipher Lock (cipher-lock.exe) - rotate the cipher to block packets; survive the timer.
    cipher = {
        timeLimit = 20, -- seconds to survive (min 5); reaching 0 = WIN
        speed = 1.0, -- packet speed multiplier; higher = harder
        spawnRate = 1.0, -- packet spawn-rate multiplier; higher = harder
        playerLives = 1, -- wrong matches allowed before death
    },

    -- Data Worm Routing (data-worm.exe) - route the worm through nodes; walls are lethal.
    snake = {
        nodesRequired = 20, -- nodes to route to win
        initialSpeed = 88, -- ms per tick (60-150); LOWER = faster = harder
        gridCols = 28, -- grid columns (max 50)
        gridRows = 13, -- grid rows (max 21)
    },

    -- Firewall Defense (fw-defense.exe) - repel waves of hostile packets; protect the nodes.
    firewall = {
        rows = 4, -- invader rows per wave (1-8)
        cols = 8, -- invader columns per wave (3-12)
        waves = 3, -- waves to clear (1-5)
        speed = 1.0, -- enemy speed multiplier; higher = harder
        timeLimit = 0, -- optional countdown in seconds (0 = no limit)
        fireRate = 0.8, -- enemy shots per second; higher = harder
        playerLives = 1, -- hits allowed before death
        shootCooldown = 250, -- ms between your shots; higher = slower fire = harder
    },

    -- Data Highway Evasion (highway-evade.exe) - dodge oncoming traffic; survive the timer.
    evasion = {
        timeLimit = 50, -- seconds to survive (min 5); reaching 0 = WIN
        speed = 1.0, -- threat fall-speed multiplier; higher = harder
        spawnRate = 1.0, -- threat spawn-rate multiplier; higher = harder
        roadWidth = 34, -- driveable lane width in cells (14-40); lower = harder
        playerLives = 1, -- hits allowed before death
    },

    -- Code Injection (code-inject.exe) - type each incoming string before its timer runs out.
    typing = {
        stringLength = 10, -- characters per string; higher = harder
        timePerString = 6000, -- ms allowed to type each string; lower = harder
        stringsRequired = 12, -- strings to clear to win (min 1)
        playerLives = 3, -- mistyped/expired strings allowed before lockout
    },

    -- Signal Replay (sig-replay.exe) - watch the pad sequence, then repeat it from memory.
    signal = {
        sequenceLength = 6, -- pads in the FINAL round's sequence; higher = harder
        startLength = 3, -- pads in the first round (grows toward sequenceLength each round)
        flashSpeed = 1.0, -- playback speed multiplier; higher = faster = harder
        inputWindow = 1.0, -- time multiplier to enter the sequence; lower = harder
        playerLives = 1, -- wrong inputs allowed before lockout
    },

    -- Packet Routing (pipe-route.exe) - rotate the pipes to route a winding path from source to
    -- sink. The path length scales with gridWidth (~2.2x), so that's the main difficulty lever.
    pipe = {
        gridWidth = 8, -- routing-grid columns; bigger = harder (also lengthens the path)
        gridHeight = 6, -- routing-grid rows; bigger = more room to wind + more decoys
        timeLimit = 50, -- seconds to finish a board (0 = no limit)
        rounds = 1, -- boards to solve to win (min 1)
        playerLives = 2, -- failed boards allowed before lockout
    },

    -- ICE Breaker (ice-break.exe) - clear the barrier layers with the paddle + ball.
    breakout = {
        rows = 4, -- brick rows; more = harder
        cols = 10, -- brick columns; more = longer
        ballSpeed = 1.0, -- ball speed multiplier; higher = harder
        paddleWidth = 100, -- paddle width in px; lower = harder
        timeLimit = 0, -- optional countdown in seconds (0 = no limit)
        playerLives = 3, -- balls lost allowed before death
    },
}
