A week at the table
A “run” in Pale Jack is one night. A campaign is seven nights. Charms persist across nights within a campaign; recovered Pieces persist permanently across campaigns (the dealer hasn’t been keeping duplicates); the dealer learns your name on Night 2.
The arc
Section titled “The arc”| Night | Day | Beat |
|---|---|---|
| 1 | Sunday | First sit-down. The dealer is friendly but does not name you. |
| 2 | Monday | ”Ah, {name}. You came back.” |
| 3 | Tuesday | ”Three nights, {name}. We’re practically familiars.” |
| 4 | Wednesday | The midweek thinning. |
| 4½ | — | The Act Break beat. One per campaign. |
| 5 | Thursday | The lamp dims one notch. Pie reserved. |
| 6 | Friday | ”On the first night you flinched at the lamp. You don’t now. I kept track.” |
| 7 | Saturday | ”I sit on this side tonight.” |
The four night-end paths
Section titled “The four night-end paths”| Outcome | What happens |
|---|---|
| Cleared | All 6 rooms cleared. Dawn. Charms intact, capital + winnings, and the dealer hands you back a Piece. |
| Cleared with strain | Final-room target missed but no last call. Partial reward — and the Piece still comes back. |
| Last call | Capital hit zero, or terminal bust. The morning is heavier; you shed 1-2 charms. No Piece moves either way. The campaign continues. |
| Bergman fold | Voluntary fold of the final hand. Campaign ends with accept_it. No Piece recovered. |
Endurance recovery
Section titled “Endurance recovery”Every campaign reaches Night 7 regardless of mid-campaign last calls. A failed night doesn’t end the campaign — it just doesn’t yield a Piece, and you shed a charm or two. You walk into Night 5 with what you’ve already collected: zero, three, six Pieces back. The campaign is a slow recovery, paced by clearance.
What persists
Section titled “What persists”| State | Across nights | Across campaigns |
|---|---|---|
| Player name | yes | no (entered fresh) |
| Arcanum tray | yes | no (cleared) |
| Capital | yes | no |
| Sanity | yes (refreshed to 6 between) | no |
| Recovered Pieces | yes | yes (permanent) |
seenActBreak | yes | no |
| Hours of the Night | yes (banked) | yes (permanent) |
| Mantle tier | yes | yes |
| Pages unlocked | yes | yes |
Save model
Section titled “Save model”CampaignState is persisted via SharedPreferences (key
palejack:campaign:v1). One active campaign at a time. Auto-saves on
every state transition (cleared / strain / last call / fold).
A player can quit after Night 3 of 7 and pick up at Night 4 weeks
later. The controller’s resume() lands them on the right phase.
Where this lives
Section titled “Where this lives”lib/data/campaign_state.dart— the immutable state model.lib/data/campaign_store.dart— persistence.lib/sim/campaign_runtime.dart— pure transitions (cleared / strain / last call / fold).lib/sim/campaign_controller.dart— state machine + phase enum.lib/sim/campaign_outcome_adapter.dart— TableScreen-end → controller transition dispatch.lib/main.dart— Root wiring (kCampaignMode gates the path).
Single-night demo vs. campaign
Section titled “Single-night demo vs. campaign”The web build at palejack.com is a single-
night demo (kCampaignMode = false). Desktop builds flip the flag and
unlock the full campaign. Same engine; the demo is effectively Night
1 of an unsaved campaign.