# chalkMark
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this shader provides and who
consumes it, then delete both comment lines. -->
TODO: describe this shader.
# physician
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputMap provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputMap.
# tinctures — the belt of three phials
A few seconds each, and none of them hurts anything. A tincture changes how the
physician MOVES, which in Ashcross is the same as changing where he can go.
- **Theriac.** Heavy. He falls faster and lands harder, and a fall taken under
it goes straight through a rotten board instead of standing on it. Slower on
his feet, and the jump is shorter — a phial for going down, not up.
- **Aqua Vitae.** Quick. A dash on the ground, and one in the air, given back
the next time he touches down.
- **Vinegar Cloth.** Soaked and held to the mask. The miasma cannot reach him,
and the cloth catches the air on the way down: a long, slow fall that turns a
drop that would kill him into a way through.
He packs one of each before the round. Everything past that is found in the
district.
## Read by other slices
| | |
|---|---|
| `NB.state.tinctures` | the ids on the belt, in belt order |
| `NB.state.activeTincture` | `{ id, label, remaining, total, colour }`, or nothing |
| `NB.ext.belt` | `{ index, doses }` — which phial is in his hand, and how many are left |
| `NB.ext.miasmaImmune` | true while the Vinegar Cloth is up |
# censer — the smoke, and the charcoal that pays for it
The brass censer swings on its chain and lays a column of burning aromatics in
front of the physician. The smoke rises, and so does anything standing in it:
step into your own column and it carries you up a wall that has no handholds on
it. It is the reason a plague doctor's instrument list is also his route.
Every swing burns charcoal. When the censer is cold it swings anyway and does
nothing, and the only way to fill it again is to stand at a lit brazier.
The smoke is `censerSmoke.shader` beside this file — one quad per puff and no
texture at all. The billow, its churn, the coal glowing out of its middle while
it is young, and the way it swells and thins as it dies are all computed in the
fragment shader from two numbers: how old the puff is, and a seed that keeps it
from looking like the puff next to it.
Also here: the dust a heavy landing throws up, which is the same cloud with the
fire taken out of it and told not to lift anybody.
## Read by other slices
| | |
|---|---|
| `NB.ext.smokeAt(x, y)` | is that point inside live smoke? — what the infected recoil from |
| `NB.ext.censer.puffs` | the live puffs, read-only |
# nb
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this module provides and who
consumes it, then delete both comment lines. -->
TODO: describe this module.
# Doctor
The physician's body. It hangs on the `doctor` entity the scene reserves for the
player, and it is the only thing in Nine Bells that reads a control.
Every frame it turns the live control scheme into one table of intent, hands
that to the traverse slice's simulation, and writes the answer onto its own
entity. Nothing about how he moves lives here — that is `game.traverse` — which
is what lets the whole of the doctor's movement be driven from a test with a
made-up frame of input and no game running at all.
## Fields
| | |
|---|---|
| `inputMap` | the control scheme this body answers to |
| `controlled` | clear it and he still falls, lands and stands, but takes no orders — what a cutscene wants |
| `anim` | read-out: what he is doing |
| `speedX` | read-out: how fast he is going along the street |
| `inputX` | read-out: the control reading he is acting on |
| `ticks` | read-out: frames simulated since he last woke |
## Other slices reaching a control
`game.traverse.physician` is the game's one scheme, and it is activated here and
nowhere else. Anything else that needs a control asks for it rather than
standing up a second map:
```lua
local stop = NB.ext.onControl("treat", "pressed", function() ... end)
```
`kind` is `"pressed"`, `"released"` or `"input"`, and the returned function
unsubscribes.
# belt
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputBinding provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputBinding.
# cane
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputBinding provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputBinding.
# censer
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputBinding provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputBinding.
# dash
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputBinding provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputBinding.
# jump
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputBinding provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputBinding.
# move
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputBinding provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputBinding.
# tincture
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputBinding provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputBinding.
# treat
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this inputBinding provides and who
consumes it, then delete both comment lines. -->
TODO: describe this inputBinding.
# censerSmoke
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this material provides and who
consumes it, then delete both comment lines. -->
TODO: describe this material.
# smoke
<!-- zero:scaffolded-readme -->
<!-- Replace the line below with what this shader provides and who
consumes it, then delete both comment lines. -->
TODO: describe this shader.