rs_board
The board is where the accusation is built. Evidence goes up on cork, brass pins hold it, and a length of red string is run between two pins. **A string only holds where the two pieces genuinely contradict each other** — same person, same question, two answers. One that does not…
rs_board — the corkboard, and the string
The board is where the accusation is built. Evidence goes up on cork, brass pins hold it, and a length of red string is run between two pins. A string only holds where the two pieces genuinely contradict each other — same person, same question, two answers. One that does not hangs slack and dead, with the reason typed on a slip.
Playing it
| Do this | And |
|---|---|
| Tap a card in the HELD EVIDENCE tray | it goes up on the cork |
| Tap it again | it comes down, and every string to it is cut |
| Tap a card on the cork | you pick up the end of the string |
| Tap a second card | the pin is attempted — it holds, or it does not |
| Press and drag a card | it moves, and every string follows it |
| CUT LAST STRING | the last run comes off the board |
| READ THE CHAIN | rules says whether what is up amounts to proof |
| LEAVE THE BOARD | back to the ship |
The API
local Board = Core.need("board")
Board.open() Board.close() Board.toggle() Board.isOpen()
Board.putUp(cardId) Board.takeDown(cardId)
Board.select(cardId) -- one tap
Board.pin(a, b) -> ok, why
Board.contradicts(a, b) -> ok, why -- delegates to rules when aboard
Board.moveCard(id, x, y) -- cork-local points, at the card's centre
Board.placement(id) -> { x, y, rot, w, h, pinX, pinY }
Board.cutLast() Board.clearSelection()
Board.verify() -> ok, report -- asks rules.verifyChain
Board.links() -> Core.state.links
Board.seedDemo() -- a hand of evidence, for a capture or a solo look
The board writes Core.state.links ({ a, b, ok, why } per entry) and emits
Core.EV.links whenever it changes.
What it asks of the other slices
rules—card(id),contradicts(a, b),isStale(id, leg),verifyChain(links). Until it lands the board falls back to a placeholder deck carrying the twenty-seven ids, so the board can be played and looked at on its own. Every placeholder card is markedplaceholder = true; the momentrulesprovidescard()the fallback is never read again.dossier— a face per card throughCore.art.evidence(id). While one is missing the board draws the paper itself in SVG, by kind: a print in its white border, a wireless flimsy off the spool, a typed statement on onionskin, a manifest page, an evidence tag, the annotated deck plan.
How it is driven
The board hit-tests the pointer itself, in the frame tick, off
input.snapshot(). That is deliberate: the string is one full-screen svg
drawn over the cards, so the run of string lies over the paper the way it
does on a real board — and an overlay that draws on top would otherwise take
every click meant for a card. Hit-testing in the tick means z-order does not
decide what is clickable, and the same press can either select a card or drag
it depending on whether it moves.
Interaction runs in play. In edit the board renders but does not respond.
Scoped to this part · feeds back into the world's score.