Credibility pass: the code reads as one hand's work. Dead plumbing and copies removed, four claims the source does not support corrected, and inherited kit text re-read for this game

Engine: the facade re-exports the board in one block; describe() and the
dead letters preference, void ply, the King-taken line, the identity maps
and the unused imports are gone; SIDE_NAMES is the one spelling of a side;
the drake's hunter comment no longer claims only four kinds reach the air.
Prose: no shatranj and no sitting duck, which Gygax never wrote; the Thief
statistic and the Basilisk's "one trick" are gone; lessons say what the
board shows instead of repeating the panel; a Thief's leap counts four.
Browser: one keyboard walk, in BoardArtwork; the lesson board and page share
one game and one inspected piece; the chronicle's possessive is told, not
patched by a regex; the chronicle colours and the reading layout are global
rules instead of three copies; the guide and the about panel say what the
code and the article actually do.
Server and docs: the room server states that it is the kit's, kept whole;
the skills, the deploy README and the share card name files that exist.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CCLa2PaEeCj8njQZSWGqHx
This commit is contained in:
Eric WagonerandClaude Fable 5.1 committed 2026-10-26 22:38:00 -04:00
1 parent 944e4e8306
commit 0be89a1dfe
28 files changed
+227 -340

No files matched your search

+12 -12
View File
@@ -1,8 +1,8 @@
// The lessons: one scene a piece, each a small position with something to
// see and a move to make. The page shows the boards the scene needs, says
// what to look at, takes the move from the player, and tells what came of
// it. Every scene's move is checked legal by a test, and every claim in
// the words is checked against board.ts there too.
// it. A test plays every scene's move through the engine and checks the
// captures, the freeze and the mate the words promise.
import { type Cell, type Side, CELLS, square } from './board';
@@ -37,7 +37,7 @@ export const SCENES: Scene[] = [
before: 'Twelve of these stand in a wall at the start. A Warrior steps one square straight ahead, never two, and takes one square diagonally ahead, as a pawn does. The Unicorn at 2c3 blocks this one’s step, but the Warrior at 2d3 is on its diagonal.',
task: 'Take the Scarlet Warrior. Tap your Warrior at 2c2, then 2d3.',
moves: [['2c2', '2d3']],
after: 'The Warrior falls, and yours stands on the d file now. A Warrior that reaches the far rank stands up a Hero, with no choice about it, which is a real gain but not a queen. There is no double step and no capture in passing, because Gygax limited the Warrior to the old single step of shatranj, and so every advance is a commitment.',
after: 'The Warrior falls, and yours stands on the d file now. A Warrior that reaches the far rank stands up a Hero, with no choice about it, which is a real gain but not a queen. There is no double step and no capture in passing, so every advance is a commitment.',
aside: 'That is a legal move, but the Warrior at 2d3 is the one to take. Set the scene again and look for it.'
},
{
@@ -49,7 +49,7 @@ export const SCENES: Scene[] = [
before: 'The war elephant is a rook by another name. It runs any distance along a rank or a file while the way is clear, and never leaves the land. The a file is open from your corner to the Thief at 2a6.',
task: 'Take the Thief. Tap the Oliphant at 2a1, then 2a6.',
moves: [['2a1', '2a6']],
after: 'On a board twelve squares wide an open file runs a long way, and the Oliphant is the piece that owns it. Remember what the sky can do, though. An Oliphant standing on the land beneath an enemy Dragon is as good as lost, because it cannot strike back upward.',
after: 'On a board twelve squares wide an open file runs a long way, and the Oliphant is the piece that owns it. Look up before you settle on a file, though. The Oliphant cannot strike at the air, so an enemy Dragon over the squares ahead of it takes it at leisure.',
aside: 'A legal move, but the Thief at 2a6 is the one to take. Set the scene again and look for it.'
},
{
@@ -73,7 +73,7 @@ export const SCENES: Scene[] = [
before: 'The bishop of the land, quick along the diagonals. From 2d1 the diagonal runs e2, f3, g4 and on to the Oliphant at 2h5, with nothing in the way.',
task: 'Take the Oliphant. Tap the Thief, then 2h5.',
moves: [['2d1', '2h5']],
after: 'Five squares in one move, and a five-point piece for a four-point one. A Thief’s work is in the middle ranks, which is where the Dragon hunts from the air, so it is the piece most often lost to a strike from above. Two Thieves cover both colours of square.',
after: 'Four squares in one move, and a five-point piece for a four-point one. A Thief’s work is in the middle ranks, which is where the Dragon hunts from the air, so look up before you leave it there. Two Thieves cover both colours of square.',
aside: 'A legal move, but the Oliphant at 2h5 is the one to take. Set the scene again and look for it.'
},
{
@@ -97,7 +97,7 @@ export const SCENES: Scene[] = [
before: 'The one piece at home on every board. It moves one square in any direction wherever it stands, and it can step straight up or down to the board above or below. A Scarlet Sylph hovers directly over it.',
task: 'Step up into the air and take the Sylph. Tap the Cleric, then 3e4 on the upper board.',
moves: [['2e4', '3e4']],
after: 'The Cleric is in the air now and moves there exactly as it did on the land. Gygax says not to underestimate it. Of the five kinds of piece that can visit all three boards, it is the only one that plays the same on each, and he values it at nine, above the Dragon.',
after: 'The Cleric is in the air now and moves there exactly as it did on the land. Nothing else that visits all three boards keeps its moves on each, which is why Gygax values it at nine, above the Dragon.',
aside: 'A legal move, but the step up to 3e4 is the one to see. Set the scene again and look for it.'
},
{
@@ -109,7 +109,7 @@ export const SCENES: Scene[] = [
before: 'On the land the Mage is a queen. Here it is in the air, where it can only step one square along a rank or file, or move straight up or down. Straight down two boards is the underworld, and a Scarlet Basilisk sits there at 1c4. The land square between, 2c4, is empty, and it has to be, because the Mage does not vault.',
task: 'Descend two boards and take the Basilisk. Tap the Mage, then 1c4 on the lowest board.',
moves: [['3c4', '1c4']],
after: 'The Basilisk is crushed and the Mage stands in the underworld, where it is a shadow of itself, one step at a time. Gygax warns against bringing the Mage out early, since lesser pieces develop by chasing it. Its moves between boards serve it best as an escape.',
after: 'The Basilisk is crushed and the Mage stands in the underworld, where it is a shadow of itself, one step at a time. Gygax warns against bringing the Mage out early, since lesser pieces develop by chasing it.',
aside: 'A legal move, but the drop to 1c4 is the one to see. Set the scene again and look for it.'
},
{
@@ -145,7 +145,7 @@ export const SCENES: Scene[] = [
before: 'Half eagle and half lion. In the air the Griffon leaps two squares one way and three the other, so the Warrior at 3f7 is one leap away. It can also swoop to the land, onto any of the four squares diagonally beside the square beneath it. The Thief at 2e5 is one of those four.',
task: 'Swoop down and take the Thief. Tap the Griffon, then 2e5 on the middle board.',
moves: [['3d4', '2e5']],
after: 'The Thief is gone, and the Griffon is on the land, where it has lost its wings and creeps one square diagonally until it climbs back. Drop to pick off a defender and climb before the land can gather. In the air it is worth a little more than a Hero, and nothing on the land sees its leap coming.',
after: 'The Thief is gone, and the Griffon is on the land, where it has lost its wings and creeps one square diagonally until it climbs back. A Griffon that drops is a Griffon that must climb again, so drop for something worth two moves. Nothing on the land sees its leap coming.',
aside: 'A legal move, but the swoop onto the Thief at 2e5 is the one to see. Set the scene again and look for it.'
},
{
@@ -169,7 +169,7 @@ export const SCENES: Scene[] = [
before: 'A miner of the underworld. It walks one square forward or sideways without taking, and takes one square diagonally ahead, so the Warrior at 1e5 is in reach. It can also strike straight up at the land. A Scarlet Hero has stopped at 2d4, directly over it.',
task: 'Burst up and take the Hero. Tap the Dwarf, then 2d4 on the middle board.',
moves: [['1d4', '2d4']],
after: 'A Dwarf is a mine beneath the land, and a piece that settles above one is taken. On the land it keeps the same moves, and it comes back down only onto an empty square beneath it. Gygax says the Dwarves play little part early, and make the best outposts late, if you have not hurried them forward.',
after: 'The square above a Dwarf is a trap for anything that settles there. On the land the Dwarf keeps the same moves, and it comes back down only onto an empty square beneath it. Gygax says the Dwarves play little part early, and make the best outposts late, if you have not hurried them forward.',
aside: 'A legal move, but the strike up at the Hero on 2d4 is the one to see. Set the scene again and look for it.'
},
{
@@ -181,7 +181,7 @@ export const SCENES: Scene[] = [
before: 'The serpent whose gaze turns to stone. A Basilisk moves one square forward or diagonally forward, taking what is there, or one square straight back, and never leaves the underworld. Whatever enemy stands on the land directly above it cannot move, take or threaten anything. The Scarlet Mage stands at 2e4. The square beneath it, 1e4, is one step ahead of your Basilisk.',
task: 'Slither under the Mage. Tap the Basilisk, then 1e4.',
moves: [['1e3', '1e4']],
after: 'The Mage is frozen where it stands, and will be until the Basilisk moves or is taken. Gygax says an immobilised piece can be treated as if it did not exist, except that it still blocks its square. His own trick runs the other way too. Stand a piece of yours over your own Basilisk, and whatever takes it is frozen on the spot for you to take at your leisure.',
after: 'The Mage is frozen where it stands, and will be until the Basilisk moves or is taken. Gygax says an immobilised piece can be treated as if it did not exist, except that it still blocks its square. Stand a piece of yours over your own Basilisk and the trick runs the other way.',
aside: 'A legal move, but 1e4, beneath the Mage, is the one to see. Set the scene again and look for it.'
},
{
@@ -202,10 +202,10 @@ export const SCENES: Scene[] = [
pieces: { '2g1': 'gK', '2g8': 'sO', '2f2': 'gW', '2h2': 'gW' },
side: 'gold',
levels: [3, 2, 1],
before: 'The whole game. The King moves one square in any direction on the land, and one step straight up or down between boards. Here it is in check, because the Scarlet Oliphant looks down the open g file. Nothing of yours can take the Oliphant or step into the file, so the King must move. Two squares on the land are safe, and it could also climb into the air or dig into the underworld.',
before: 'The King is the whole game. It moves one square in any direction on the land, and one step straight up or down between boards. Here it is in check, because the Scarlet Oliphant looks down the open g file. Nothing of yours can take the Oliphant or step into the file, so the King must move. Two squares on the land are safe, and it could also climb into the air or dig into the underworld.',
task: 'Step out of check along the rank. Tap the King, then 2f1 or 2h1.',
moves: [['2g1', '2f1'], ['2g1', '2h1']],
after: 'Safe, and still on the land. The King could have climbed or dug instead, but off the land a King can do nothing except come straight back, and Gygax calls it a sitting duck there. At the table, keep two more things in mind. The square beneath your King is where an enemy Basilisk would freeze it, and your Dragon above it is its roof.',
after: 'Safe, and still on the land. The King could have climbed or dug instead, but off the land a King can do nothing except come straight back, and Gygax says it is easily trapped there. At the table, keep two more things in mind. The square beneath your King is where an enemy Basilisk would freeze it, and your Dragon above it is its roof.',
aside: 'That is out of check, but off the land the King can only come back. Set the scene again and stay on the land.'
},
{