sheetStyle(w: number, h: number, extra: { [string]: any }?) → void
PAPER — adapted from vendor/df_paper, recoloured to Core.paper
The sheet itself: aged rag, darker along both outer edges, lit from
above. The stops are the shading ALREADY composited over the paper
colour rather than a wash laid over it — a gradient replaces the fill, so
translucent stops would make the sheet a window onto the atelier.
| arg | type | description |
|---|
| w | number | |
| h | number | |
| extra | { [string]: any }? | |
laid(w: number, h: number) → any
The laid lines of hand-made paper, running down the sheet.
| arg | type | description |
|---|
| w | number | |
| h | number | |
foxing(w: number, h: number) → any
Foxing: the brown blooms an old sheet grows, as a coarse halftone screen.
| arg | type | description |
|---|
| w | number | |
| h | number | |
gap(h: number) → any
MARKS — rules, ornaments, type
| arg | type | description |
|---|
| h | number | |
rule(width: number, weight: number?, color: string?) → any
| arg | type | description |
|---|
| width | number | |
| weight | number? | |
| color | string? | |
doubleRule(width: number) → any
The double rule a heading sits on: one heavy, one hair.
| arg | type | description |
|---|
| width | number | |
label(text: string, style: { [string]: any }, wrap: boolean?) → any
| arg | type | description |
|---|
| text | string | |
| style | { [string]: any } | |
| wrap | boolean? | |
smallcap(text: string, size: number?, color: string?, tracking: number?) → any
A small-capital line: the printed word above a block.
| arg | type | description |
|---|
| text | string | |
| size | number? | |
| color | string? | |
| tracking | number? | |
display(text: string, size: number, color: string?, tracking: number?) → any
The name, set large with real letter-spacing.
| arg | type | description |
|---|
| text | string | |
| size | number | |
| color | string? | |
| tracking | number? | |
lines(text: { string }, style: { [string]: any }, leading: number) → any
PARAGRAPHS ARE SET LINE BY LINE, THE WAY A PRINTER SETS THEM.
Each paragraph arrives as a list of already-broken lines and becomes a
stack of single-line labels. The break points are then chosen rather than
measured, which is how a 1954 compositor set a title page, and every line
is guaranteed to sit inside the plate's measure.
| arg | type | description |
|---|
| text | { string } | |
| style | { [string]: any } | |
| leading | number | |
body(text: { string }, size: number?, color: string?, align: string?) → any
Printed body text.
| arg | type | description |
|---|
| text | { string } | |
| size | number? | |
| color | string? | |
| align | string? | |
hand(text: { string }, size: number?, color: string?, align: string?) → any
The perfumer's own hand: marginalia, glosses, a closing line.
| arg | type | description |
|---|
| text | { string } | |
| size | number? | |
| color | string? | |
| align | string? | |
figure(text: string, size: number?, color: string?, align: string?) → any
Anything that must line up in a column: doses, francs, times.
| arg | type | description |
|---|
| text | string | |
| size | number? | |
| color | string? | |
| align | string? | |
scaleCommands(cmds: { any }, k: number) → void
| arg | type | description |
|---|
| cmds | { any } | |
| k | number | |
canvasNode(w: number, h: number, cmds: { any }, style: { [string]: any }?) → any
| arg | type | description |
|---|
| w | number | |
| h | number | |
| cmds | { any } | |
| style | { [string]: any }? | |
fleuron(w: number) → any
A printer's fleuron: a centre lozenge between two curling scrolls, with a
hairline reaching out to either margin.
| arg | type | description |
|---|
| w | number | |
flaconArt(k: number) → any
The flacon: a stoppered bottle of amber glass with its label, hatched on
the shaded side the way a 1954 catalogue would engrave it, and the
sillage itself drawn rising off the stopper in three fading strands.
| arg | type | description |
|---|
| k | number | |
hump(m: number, peak: number, spread: number, amp: number) → number
THE TEACHING DIAGRAM — the one idea, drawn
Time runs DOWN the page on the log axis Core.timeToFraction defines, so
the first ten minutes take a third of the sheet. The brief's target band
is printed in ghost ink; a formula's accord is drawn over it in iron
gall. Where the line leaves the band, the second pot says why.
| arg | type | description |
|---|
| m | number | |
| peak | number | |
| spread | number | |
| amp | number | |
targetAt(m: number) → number
| arg | type | description |
|---|
| m | number | |
accordAt(m: number) → number
| arg | type | description |
|---|
| m | number | |
xf(v: number) → number
| arg | type | description |
|---|
| v | number | |
yf(minutes: number) → number
| arg | type | description |
|---|
| minutes | number | |
note(minutes: number, l1: string, l2: string, dy: number) → void
| arg | type | description |
|---|
| minutes | number | |
| l1 | string | |
| l2 | string | |
| dy | number | |
stampArt(text: string, sub: string, tone: string) → any
THE STAMP — struck across the career record
| arg | type | description |
|---|
| text | string | |
| sub | string | |
| tone | string | |
ground(children: { any }, dim: number?, blur: number?) → any
WHAT THE SCREENS ARE MADE OF
The full-page ground every plate is laid on: the atelier, thrown out of
focus and dropped a couple of stops, so the room is still the picture.
| arg | type | description |
|---|
| children | { any } | |
| dim | number? | |
| blur | number? | |
printedFrame(w: number, h: number) → any
The printed border a plate is struck inside: a heavy rule with a hairline
companion a few points in, the way a 1954 pharmacy sheet is framed.
| arg | type | description |
|---|
| w | number | |
| h | number | |
plate(w: number, h: number, children: { any }, extra: { [string]: any }?) → any
A plate: paper, its laid lines, its foxing, its border, and the setting.
| arg | type | description |
|---|
| w | number | |
| h | number | |
| children | { any } | |
| extra | { [string]: any }? | |
entryLine(id: string, callbackId: string, text: string, hint: string?) → any
The one interactive shape in the house style: a ruled entry line that
warms under the pointer.
| arg | type | description |
|---|
| id | string | |
| callbackId | string | |
| text | string | |
| hint | string? | |
titleTree( ) → any
SCREEN — TITLE
howtoTree( ) → any
SCREEN — HOW TO PLAY (one card, one idea, one drawn curve)
hudRow(k: string, v: string, strong: boolean?) → any
SCREEN — THE STANDING CHROME
Small, in a corner, and never fighting the organ for the frame: a
pinned docket 236 wide at the top left, plus a discreet pause mark.
| arg | type | description |
|---|
| k | string | |
| v | string | |
| strong | boolean? | |
romanOf(n: number) → string
| arg | type | description |
|---|
| n | number | |
reputationMark(rep: number) → any
Reputation as a printer's mark rather than a number: three lozenges,
struck solid for what is left and outlined for what has been spent.
| arg | type | description |
|---|
| rep | number | |
hudEntry(id: string, callback: string, text: string, key: string) → any
One line of the docket's foot: what it opens, and the key that opens it.
| arg | type | description |
|---|
| id | string | |
| callback | string | |
| text | string | |
| key | string | |
pauseTree( ) → any
SCREEN — PAUSE (a sheet laid over the shot)
cell(text: string, w: number, style: { [string]: any }) → any
Every cell states its own width AND its own alignment. A label given a
width but no textAlign centres inside it, which walks a ledger column
out of true row by row.
| arg | type | description |
|---|
| text | string | |
| w | number | |
| style | { [string]: any } | |
h(t: string, w: number, align: string) → any
| arg | type | description |
|---|
| t | string | |
| w | number | |
| align | string | |
recordRow(i: number, e: any) → any
| arg | type | description |
|---|
| i | number | |
| e | any | |
endTree(records: { any }) → any
| arg | type | description |
|---|
| records | { any } | |
apply( ) → void
Rebuild every registered tree and set what is on the glass. Immediate
mode: the tree IS the state, so one function does render and visibility.
show(name: string) → void
| arg | type | description |
|---|
| name | string | |
hud(on: boolean?) → void
| arg | type | description |
|---|
| on | boolean? | |
setPaused(on: boolean) → void
| arg | type | description |
|---|
| on | boolean | |
toggle(name: string) → void
Open one of the perfumer's other books, or close it and go back to the
organ. The economy slice draws both pages and follows the screen name.
| arg | type | description |
|---|
| name | string | |
pushRecord(entry: any) → void
Append a line to the career record. Slices may call this directly; it is
also filled from the bus, so a sim that only emits still gets a record.
| arg | type | description |
|---|
| entry | any | |
build(_root: any) → void
| arg | type | description |
|---|
| _root | any | |
pick(t: any, ...: ?) → any
READING THE BUS
The sim owns the shape of a brief and a verdict, so both are read
defensively: whichever of the usual field names is present is used, and a
missing one prints as a rule rather than as an error.
| arg | type | description |
|---|
| t | any | |
| ... | ? | |
onBrief(payload: any) → void
| arg | type | description |
|---|
| payload | any | |
normaliseVerdict(v: any) → string
onStruck(_payload: any) → void
The blotter is struck: the drydown sheet owns the frame for the next
twenty-four hours. Saying so here is what puts the docket away and asks
staging for the marble.
| arg | type | description |
|---|
| _payload | any | |
onVerdict(payload: any) → void
| arg | type | description |
|---|
| payload | any | |
onCallback(id: string, _value: any) → void
| arg | type | description |
|---|
| id | string | |
| _value | any | |
stopKeyLoop( ) → void
One background handle, kept on Core.state so a hot reload cannot orphan
it, and cancelled in stop().
onCareerOver(_payload: any) → void
The career is over — six commissions delivered, or the reputation spent.
The record on the end card is the one this slice has been keeping.
| arg | type | description |
|---|
| _payload | any | |
restartCareer( ) → void
Leaving the end card starts a new career. The record is wiped here and the
rest of the game is told to reset itself, so the title page a second player
sees is the same one the first one did.
raisePendingBrief( ) → void
Raise the waiting commission, once the camera has stopped performing.
Two things call this: the opening reporting itself done, and entering the
room at all — because the opening plays once per session and the card must
arrive on every commission after it, not only the first.
_onScreenRequest(payload: any) → void
| arg | type | description |
|---|
| payload | any | |
_onOpeningDone(_payload: any) → void
| arg | type | description |
|---|
| _payload | any | |
bindBus( ) → void
THE BUS IS SUBSCRIBED EXACTLY ONCE, EVER.
Core.handlers survives a module reload and Core.on has no counterpart
that removes a handler, so subscribing from start() adds another copy of
every listener each time the slice restarts — and a single verdict then
lands in the career record two or three times, overwriting the row
beside it. The flag lives on Core.state, which also survives the reload,
and each trampoline resolves the CURRENT module through the registry so
an old closure never keeps a stale copy of this file alive.
relay(method: string) → void
| arg | type | description |
|---|
| method | string | |