Quick answer: Use sequence_instance_pause() and sequence_instance_resume(). Don’t use instance_deactivate to pause sequences — it leaves internal timers running.

A boss intro sequence plays a camera pan with synchronized SFX. Mid-pan, the player presses Pause — you call instance_deactivate_all to freeze gameplay. Resume, and the sequence jumps to wherever it “should” have been if it kept running — the rest of the pan, the explosion, all skipped.

Sequences Run on Wall Time

GameMaker Sequences advance using the room’s delta time when you start them with layer_sequence_play. The sequence instance has an internal time pointer that ticks even when objects are deactivated — the sequence itself is layer-scoped, not instance-scoped, so deactivation of objects doesn’t pause it.

This is intentional for some workflows (background ambience sequences) but wrong for cutscenes that should track gameplay state.

The Fix

/// On pause
if (sequence_instance != noone) {
    sequence_instance_pause(sequence_instance);
}

/// On resume
if (sequence_instance != noone) {
    sequence_instance_resume(sequence_instance);
}

Store the sequence instance ID when you start it (returned from layer_sequence_create). Pause/resume by that ID.

Speed-Scale Alternative

If you want a fade-to-pause effect rather than instant stop:

/// Pause smoothly
layer_sequence_speedscale_set(sequence_instance, 0);

/// Resume
layer_sequence_speedscale_set(sequence_instance, 1);

Or lerp the speed scale from 1 to 0 over a few frames for a slow-mo pause feel.

What About Sound Tracks?

Sequences can have sound tracks. Pausing the sequence via the API above pauses the audio playback as well. instance_deactivate doesn’t pause audio (since audio isn’t per-instance), so cutscene audio kept playing during your pause — another reason to use the proper sequence API.

Track Active Sequences

For multi-sequence scenarios, maintain a list:

/// global startup
global.active_sequences = [];

function play_cutscene(seq) {
    var inst = layer_sequence_create("Layer_FX", 0, 0, seq);
    array_push(global.active_sequences, inst);
    return inst;
}

function pause_all_sequences() {
    for (var i = 0; i < array_length(global.active_sequences); i++) {
        sequence_instance_pause(global.active_sequences[i]);
    }
}

Centralizes the bookkeeping so a single pause/resume covers everything.

Verifying

Start a sequence, pause for 5 seconds, resume. The sequence’s visible state at resume should be exactly where it was at pause — not 5 seconds further along.

“instance_deactivate doesn’t pause sequences. The sequence API has its own pause — use it.”

Track every layer_sequence_create instance in a global array. Future pause/resume work becomes a one-liner.