Skip to content

The Act Break

Once per campaign, between Night 4’s outcome and Night 5’s dawn, the player sees a five-line scripted beat that recontextualizes the campaign. The marker on screen reads NIGHT 4½.

NIGHT 4½
A pause.
[tap]
You set the cards down. He sets the cards down.
[tap]
For the first time tonight, neither of you moves.
[tap]
The lamp dims slowly, of its own accord. He looks at it. He looks at you.
[tap]
"I told myself I would not say this, {name}. But you have come further
than most. The next three nights will not feel like the first four. I
am sorry for that, in advance."
[tap → Night 5 dawn]

{name} substitutes the sanitized player name. If the name is empty or unspeakable, the substitution falls back to “you” — but the prompt on the start screen is good enough that this fallback rarely fires in practice.

The Act Break is one-shot per campaign. State is persisted in CampaignState.seenActBreak (default false). The controller checks nightIndex == 5 && !seenActBreak after every Night 4 transition (cleared / strain / last-call) and surfaces CampaignPhase.actBreak instead of CampaignPhase.dawnTransition.

After the player taps through, acknowledgeActBreak() sets seenActBreak = true and falls through to the standard dawn transition for Night 5.

  • It does not fire if the player Bergman-folds before Night 5.
  • It does not retroactively fire if the campaign-state save was migrated and seenActBreak is false going into Night 6 — the gate is nightIndex == 5 only.
  • It does not fire on a final-night last call (the campaign closes with last_call_final immediately).

Inscryption’s framing is the precedent — the moment the game’s texture briefly drops and the player sees a different angle on what they’re doing. Pale Jack’s version is gentler: no fourth-wall break, no system shift. Just the dealer dropping the warmth for a single breath, telling you the second half will be harder, and stepping back into character.

The beat is structurally between Night 4 and Night 5 — not part of either night’s gameplay loop. The half-number marker is the smallest typographic signal that “this is not a normal night-transition.” No room target, no hands played, no chips earned. Just the beat.

  • lib/data/campaign_state.dart:seenActBreak — the persisted flag.
  • lib/sim/campaign_controller.dart:acknowledgeActBreak() — the transition.
  • lib/ui/act_break_screen.dart — the screen + 5-line script.
  • test/sim/campaign_act_break_test.dart — 8 controller tests.
  • test/ui/act_break_screen_test.dart — 8 widget tests.