user card Hand becomes the action surface, the board shows the train, and a reverse stops turning it around, other bug fixes too.

This commit is contained in:
Jesse
2026-08-05 19:18:26 -04:00
parent 1c321d4cea
commit 543584a2ca
20 changed files with 1851 additions and 320 deletions
+23
View File
@@ -93,6 +93,29 @@ export function playCue(cue: string): void {
return;
}
if (cue === 'couple') {
/**
* KNUCKLE COUPLERS MEETING: a low metallic clank and the slack running out behind it.
*
* Coupling a cut was reported as invisible — the car simply left the board and only history said
* where it went. It is the single most consequential thing a switching move does, so it gets the
* one sound a player will learn to listen for.
*/
for (const fg of [[86, 0.22], [131, 0.13], [197, 0.07], [61, 0.18]]) {
tone(t, fg[0]!, 0.26, fg[1]!, 'square', fg[0]! * 0.82);
}
tone(t + 0.1, 74, 0.34, 0.1, 'triangle', 58);
return;
}
if (cue === 'drop') {
// Setting out is the same act in reverse and quieter: one clank, no slack behind it.
for (const fg of [[104, 0.14], [156, 0.08]]) {
tone(t, fg[0]!, 0.18, fg[1]!, 'square', fg[0]! * 0.85);
}
return;
}
if (cue === 'day') {
// The grade-crossing bell: two strikes. Inharmonic partials separate a bell from a beep.
for (const at of [t, t + 0.22]) {