227 Commits
Author SHA1 Message Date
slaguru666andClaude Opus 5 7973b0ed7d make-pdf: print a scenario as an A4 GM document
Chrome headless is the only print engine on these machines, and its page
rules are real: one section per page, tables and read-aloud blocks never
split, cite markers dropped, and the scenario's own 01 plate as a cover.
npm run pdf docs/scenarios/<FILE>.md writes docs/print/<FILE>.pdf.

Named make-pdf rather than scenario-pdf on purpose: check-scenarios treats
every tools/scenario-* file as scenario text, so the first name swept a
stylesheet's point sizes into the figures corpus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 19:09:52 +01:00
slaguru666andClaude Opus 5 0fa1106b90 STANDING ORDER v2.1: the same case, cut to the bone
640 lines to 462, thirteen journal pages to ten. The story is unchanged: the
slow, the unarmed 1974 Board, the committee that only takes its own clause 5
evidence, the vote that springs Annex D, and the children who already know
the song. What went is the apparatus around it — the countdown table, the
clue trail, the exhibit sub-sections, the eighteen-row location list, the
separate Undersigned and red-herring sections (now one paragraph), and
SO-H06. Three acts, three exhibits, three pressures, three choices.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 18:59:48 +01:00
slaguru666andClaude Opus 5 cd4aa8bcbb STANDING ORDER v2.0: the argument is the adventure
Rebuilt to Tim's brief. Time below runs at half speed, so the intake looks
fifty-odd and is eighty-odd, and the Seat's own instruments agree with Centre
that the war happened. The Board goes in dressed as 1974 and unarmed; Act Two
is a committee that only accepts the three exhibits its own clause 5 names.
Winning the vote is what arms the trap: surfacing triggers Annex D, and the
Address is Mr Smith's song. The children are found after the argument is won,
not before. Hatcher's Undersigned are the red herring and the key to telling
a forged mark from a real one.

Handout pack and the warden actor follow the new brief; SO-H06 added.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 18:06:41 +01:00
slaguru666andClaude Opus 5 362b32843f STANDING ORDER: twenty more plates of the underground
The stuff between the numbered rooms, in the same 1974 two-ink screen print:
the blast door from inside, the stair, the exchange, the laundry, washroom,
stores, water gallery, cloakroom, kitchen, chapel, workshop, library, barber's
corner, mushroom beds, play space, a family cabin, battery room, ventilation
gallery, haulage incline and the memorial garden. All twenty ride in the
adventure's plate list as 21-40.

Six were regenerated for daylight or the wrong century, and so_27 needed three
attempts: 'changing room' is this scenario's blocked phrase. Both lessons are
in the art sheet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 12:34:13 +01:00
slaguru666andClaude Opus 5 633f02319b The martlet lands: 47 of 48 creature plates
Generated on the first attempt once it was the only job in flight, which is
another mark against the banned-word story it was used to support.

One thing to know before it reaches a table: a martlet is the heraldic bird
drawn WITHOUT FEET, and this plate has feet, with claws. The prompt says "the
little bird drawn with no feet, which therefore has none" — and naming a
thing to exclude it puts it in, which is recorded in the vault from the CLEAN
GROUND art ("no birds, no sheep" produced livestock). Fixing it means
rewording the creature's own description positively, which is content, so it
is left for Tim rather than changed here.

moor_cat is the one that did not land, and it is now well characterised:
its job is ACCEPTED and STARTS — the bot posts — and Midjourney then DELETES
its own post. That is the image being flagged mid-generation rather than the
prompt being refused, which is why six attempts, three hypotheses and a
prompt bisection all came to nothing. It keeps its procedural portrait, which
since this evening is drawn as a quadruped with eight hit locations rather
than as a man.

~/bin/mj-blocked now distinguishes all three modes: nothing posted (refused
before starting), posted and deleted (image flagged), posted and still there
(genuinely running). The first version would have called the deleted case
"not blocked" and been wrong.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 02:16:25 +01:00
slaguru666andClaude Opus 5 27ef3e3693 Correction: "bare" was not the trigger. Remove it from BANNED
0b51d4e claimed the martlet's three stalls were caused by the word "bare" and
said it was diagnosed rather than guessed. It was guessed.

The evidence was one successful regeneration with that word replaced. Run
again afterwards with "bare" restored and nothing else changed, the same
prompt was accepted in seconds. The variable that actually differed was that
the successful run was the only job in flight — and the word was believed
because a memory note from 16 September already named it, which is a reason
to suspect a conclusion rather than to trust it.

Two further hypotheses tested and also dead: moor_cat's full prompt is
accepted immediately, so it is not blocked either; and four jobs fired two
seconds apart were all answered, so it is not a concurrency limit at that
scale. What made those two fail six times between them is not reproducible
now, and this commit does not claim to know.

The throw-instead-of-warn stays: for a genuinely banned word, a warning
printed into a log predicts a job that never arrives and never errors. The
armour wording stays too, because it reads better — not as a workaround.

~/bin/mj-blocked is the tool this needed from the start. It sends a prompt
and reports within two minutes whether the bot answered at all, because a
refusal is ephemeral and never reaches the channel, so silence there is the
only thing that separates a banned word from a slow one. Three sessions have
now spent 30-minute timeouts on this question.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 02:12:10 +01:00
slaguru666andClaude Opus 5 0b51d4e778 "bare" is a banned word, and BANNED now refuses instead of warning
Diagnosed rather than guessed. The martlet failed three times over ninety
minutes while the gryphon succeeded in the same background run, so it was
neither the service nor the account nor the window. Regenerating it with the
single word "bare" replaced and nothing else changed brought it back
immediately.

It comes from armourWords at naturalArmour 0 — Midjourney reads it as nudity
— and thirteen creatures carried it, every one of them a creature with no
natural armour. That band says "thin-skinned, nothing between it and a blow"
now.

BANNED returned its hits as `warnings` for the caller to print. A warning in
a log nobody reads is precisely what let this stall three times, because the
failure it predicts is a job that never arrives and never fails, which looks
exactly like the service being slow. promptFor throws now, as it does for an
over-long negative list, and says why the refusal is invisible. All 204 specs
still build; a planted "corpse" is refused.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 02:04:00 +01:00
slaguru666andClaude Opus 5 4892f42939 The gryphon, third attempt, correct on both counts
Eagle head and beak, wings fully drawn, lion hindquarters, four legs, on a
plinth — and drawn rather than plated. The first render had no wings and no
beak because the prompt read `species` where the shape lives in `bodyPlan`.
The second had the anatomy and came back as a mech, because the armour clause
opened with the word "armoured" and that is the word Midjourney draws.

Portrait and 2x2 token derived and the pack rebuilt. gryphon-fixed.webp — the
mech, kept while it was the only version with the right anatomy — is removed:
no spec referenced it, and a second picture of the same creature in the
shipped art is a thing for somebody to pick up by mistake.

Worth recording for the diagnosis of the other two: this succeeded in the
same background run where martlet and moor_cat each failed a third time. So
the failures are not the service, not the account and not the window. It is
those two prompts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 02:02:19 +01:00
slaguru666andClaude Opus 5 0b2c650151 Rebuild the weapons pack after the body-plan declarations
LevelDB renumbers its files on every build, so this is filename churn around
unchanged content: 70 weapons, the 10 natural attacks still carrying
flags.ringbrp.plans. Committed so the tree is clean rather than left dirty
for the next person to wonder about.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 01:25:46 +01:00
slaguru666andClaude Opus 5 3e915b6bfd A checklist for verifying the generators in a live world
The three sidebar buttons build actors through Actor.create, compendium reads
and a dialog, and check-behaviour says in its own header that it cannot reach
any of that. The derivations are covered by 450 forged combinations and 210
posting × tier pairs; the glue is covered by nothing, and no world was
running to exercise it.

So this is the shortest path from a launched world to knowing. Every expected
value in it was derived by running the code — drawKitFor for the kit rows,
forgeCreature at seed 7 for the forge rows — rather than written from memory.

It also says what a failure means: a wrong number points at the derivation
and should reproduce from the CLI, while a missing item or a dialog that does
not open points at the glue and will not.

One figure in the first draft — "476 guarded combinations" — was invented.
Replaced with the two the guards actually print. A verification document that
carries a made-up number is worse than none, because it is read as the
authority on what to expect.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 01:23:15 +01:00
slaguru666andClaude Opus 5 dda8238a12 Generated NPCs get the full skill list, like everything else does
"When I create a new NPC or Threat they do not have a set of skills" was the
original report, and the kit fix did not cover all of it. A generated NPC
carried its posting's core plus two support — about eight rows — so a GM
asked for Listen or Dodge or Spot by a player had nothing on the sheet to
roll.

generateCharacter has called grantFullSkillList since it was written, and
build-packs gives all 62 to every packed creature, so the generated NPC was
the only actor in the game without them. It calls it now, in the same place
the PC path does: after the items, before stowOverload.

check-generator holds all three construction paths to it. A shared finishing
step that one of three callers omits is invisible from inside that caller,
which is why it is worth a check rather than a memory. Proved by removing the
call again.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 01:20:13 +01:00
slaguru666andClaude Opus 5 98ca282b89 check-anatomy: a creature's shape comes from bodyPlan, never species
Three tools read spec.species to decide a creature's SHAPE and all three were
wrong the same way, because every creature with a non-human body carries
species "baseline" and says what it is in bodyPlan:

  mj-queue        drew a wingless gryphon
  make-portraits  drew a human silhouette for 48 creatures
  bestiary        published "26 of them are not human-shaped" when it is 74

Each was found by looking at the neighbour of the one before, which is not a
method — the fourth would have been found by a fourth accident. A line that
feeds a shape function from species without naming a resolved plan is the
whole defect, in one line, every time, so it is checkable.

Proved against the real thing rather than a planted one: checking out each
file's parent commit from history makes the guard report that file, at the
line the fix touched, and the current tree is clean.

The first version required the literal `bodyPlan` on the line and so reported
all three FIXED call sites, because the correct form resolves a local `plan`
once and then falls back to species on the next line — and that fallback is
right. A guard that calls the corrected code broken is exactly what
check-rules was reported for earlier tonight, one file over.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 01:18:06 +01:00
slaguru666andClaude Opus 5 9cdb6a23b3 BESTIARY.md said 26 creatures are not human-shaped. It is 74
The document counted shape by `species`, which is vesh and cadence and
nothing else, so all 32 quadrupeds and all 16 winged creatures were counted
as people. It also printed each creature's hit-location count from the same
field, giving a person's 7 to a bull, a gryphon and every other body in the
book.

Third place tonight to read `species` where the shape lives in `bodyPlan`,
after mj-queue's anatomy clause — which drew a wingless gryphon — and
make-portraits' silhouette. Each was found by looking at the neighbour of the
one before it, and the third was the only one facing a reader.

The at-a-glance table marks quadrupeds Q and winged W beside the existing V
and C, because a two-ton quadruped and a man in a coat carried the same blank
and that table is the part that gets printed.

check-bestiary passes, which is worth stating precisely: it holds the
document against the statblocks, and both sides were reading the same wrong
field, so it was correct throughout and had nothing to say.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 01:16:00 +01:00
slaguru666andClaude Opus 5 45df79d712 make-portraits: draw the body plan, not the species
portraitSvg read `spec.species` for both the silhouette and the hit-location
table. Every creature with a non-human body carries `species: "baseline"` and
says what it is in `bodyPlan`, so the guildhall gryphon's own generated
portrait described it as "baseline, 7 hit locations" and drew a human figure
for an eagle-lion with wings. 48 creatures were affected — 32 quadrupeds and
16 winged.

It is the same defect, in the same shape, as the anatomy clause in
mj-queue.mjs: that one read `species` where the shape lives in `bodyPlan`,
and drew a wingless gryphon. I fixed it there earlier tonight and did not
look one file over, in the other tool that draws a creature from its
statblock. R-264 settled this rule for the harness — `bodyPlan ?? species` —
and build-packs:294 writes it to the actor's speciesProfile.

Only two files change on disk, because 46 of the 48 already have hand-drawn
plates and are correctly skipped. Those two are martlet and moor_cat, whose
Midjourney art has now failed twice, so they are exactly the creatures
falling back on the generated figure: martlet is winged with 10 locations and
moor_cat quadruped with 8, where both were human before.

The other 139 rewrote byte-identically, which is what a deterministic
generator should do and is worth knowing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 01:13:30 +01:00
slaguru666andClaude Opus 5 e7a584cc60 CREATURE_FORGE_PLAN: mark all five phases built
It opened "Status: plan only. Nothing below is built" while four of the five
phases had shipped, and its state table described a repo of 76 statblocks
with no simulator and no portraits — 204, six measuring guards and 47 plates
ago. A plan that misreports what exists sends the next reader to build it
again.

The table is kept rather than deleted because the design argues from it, with
a second column saying where each row landed. Part 5 is marked built and NOT
yet run in a world, which is the honest state.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:44:01 +01:00
slaguru666andClaude Opus 5 3b65877a94 Tiers say what they are worth, and the ladder is guarded
Measuring the tier knob showed it works — one creature against the four
agents check-lethality freezes, deaths per fight climb 0.01, 0.04, 0.32,
0.91, 1.43 across the five tiers for a large brute, and monotonically for
hunters and flyers too.

It also showed the labels oversell. "Deadly" at tier 3 kills a third of an
agent and wipes the team three times in a thousand. A GM reaching for a word
like that is owed the figure behind it, and the forge's whole argument is
that its output can be interrogated — the tier list was the one part of it
that could not be. Each tier now carries a measured `worth` line, printed by
`forge list` and under the tier selector in the dialog.

check-forge measures the ladder and fails if it ever goes down, across three
roles and five tiers. Both the labels and the worth lines are claims about
behaviour that any change to the skill bands, the hide base or the
characteristic multiplier could falsify without touching a word. Proved by
weakening tier 4: three roles report the inversion by name.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:42:39 +01:00
slaguru666andClaude Opus 5 869dc748a8 check-lethality: an unmeasured creature is a failure, not a note
A creature with no entry in the baseline was printed as a note and then
counted in the success line, which read "every one fighting exactly as
recorded" while N of them had no record to fight differently from. The claim
was false by exactly the number in the note above it, and a note is the part
a green build does not get read for.

It is the same shape this guard was already on the wrong side of once: before
the seam fix it measured 47 creatures and printed OK for 184.

Recording a new creature is one --update in the commit that adds it, which
this guard's own failure message has always instructed. Proved by planting a
creature with no baseline: it now stops the build and names it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:38:50 +01:00
slaguru666andClaude Opus 5 533f2d8093 mj-queue: cap the --no list, and refuse to build past it
The gryphon fix added six armour negatives and three weapon ones, which took
the prompt to eight --no terms. This project has a recorded case where ten or
more never returned a grid at all while the same prompt with four came back
in two minutes — and a job that never arrives is indistinguishable from a
moderation refusal, because those are ephemeral and never appear in the
channel either. It cost twenty minutes of wondering whether the account was
out of fast hours, and the note about it was written down precisely so it
would not be diagnosed from scratch a second time. I walked into it anyway.

Trimmed to three armour terms and one weapon term, which puts every prompt at
five. promptFor now throws above six and names the offending terms, so the
next person to reach for a long negative list is stopped at the tool rather
than by a half-hour stall. All 204 specs build under the cap.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:35:21 +01:00
slaguru666andClaude Opus 5 25d8f04a65 check-armed: a creature must be able to use what it carries
check-kits has asserted this for the 36 postings since it was written — "every
posting can use what it carries" is in its success line. Nothing asserted it
for the creatures, and 35 of them hold a weapon they have no skill for. The
hollow man has a dagger and no knife. The hulk haunt has a boarding axe and
no axe. One PREGEN carries a pistol she cannot fire.

It is not cosmetic. simulate.mjs sorts a combatant's arms by expected damage
and an unskilled weapon sits at the 1% floor, so it loses to the creature's
own fists every time: the statblock advertises a dagger and the thing
punches. That is R-310's defect written down rather than generated.

Recorded, not fixed. Giving each of the 35 the missing skill means choosing a
rating, and a rating is a balance decision that moves check-lethality's
numbers for every creature touched — that belongs to whoever owns the game.
The 35 are held at a ratchet that may shrink and may never grow, so no new
creature can be written holding something it cannot use.

Specs are expanded through the register first. A spec written as a job has no
skills of its own, and judging one unexpanded reports a Field Officer as
unable to fire the pistol her own posting issues her.

--update refused to create the record it needs on its first run, because with
no file on disk all 35 existing cases counted as new. The first recording is
the baseline; only later ones are held to the ratchet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:32:24 +01:00
slaguru666andClaude Opus 5 09e33907fa Forge a creature from inside Foundry
CREATURE_FORGE_PLAN Part 5. A third button on the Actors sidebar, beside New
agent and New NPC. Pick what it does, how big it is and how bad it is; the
card underneath describes what those settings will actually produce, because
the argument for a derivation over a form is that it can be interrogated, and
choosing between "brute" and "sentinel" from two nouns is not interrogating
anything. The card is itself forged rather than written, so it cannot
describe a creature the derivation would not make.

generateCreature reads the catalogues out of the packs and calls the same
forgeCreature the CLI calls. Natural attacks carry their body-plan
declarations into flags.ringbrp.plans so the engine can read them.

The plan asks that the panel and the CLI cannot diverge, and importing one
derivation was most of that guarantee but not all of it: the two feed it from
DIFFERENT catalogues — content.mjs on one side, the built compendium on the
other. check-forge now builds the engine's view straight out of packs/weapons
and requires both to forge the same creature.

It found a divergence on its first run, in 40 of 90 pairs. The fallback took
the first usable natural attack from the caller's list, and that list arrives
in declaration order from content.mjs and in id order from the pack, so a
tiny vesh brute was punching for the CLI and constricting at the table. The
derivation may not depend on its caller's iteration order; it imposes its
own now.

Not yet verified in a running Foundry. The pure derivation is covered by 450
guarded combinations and the catalogue seam by the agreement check above, but
Actor.create, the pack reads and the dialog itself are the part
check-behaviour says outright it cannot reach. They need a world open, and
that has not happened yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:28:57 +01:00
slaguru666andClaude Opus 5 d7def0b31e The forge: derive a creature, and say which rule made each number
CREATURE_FORGE_PLAN Part 3. `new` prints a spec as source in the shape the
bestiary files are written in, `explain` prints the rule behind every value,
`measure` fights it against the party check-lethality freezes, and `list`
shows the knobs.

The derivation is forge.mjs at the ROOT, beside rules.mjs and postings.mjs
and under the same law: pure, no Foundry, no catalogues. Part 5 asks for an
in-Foundry panel that forges a variant at the table and says it must not
diverge from the CLI. One derivation in a module both import is the only way
to guarantee that rather than argue it.

Natural attacks now declare which body plans can make them, in the weapon
catalogue, for the same reason a weapon already names the skill that fires
it: the weapon is the thing that knows. Anatomy cannot answer it — a body
plan records that a creature has a head, not that the head has horns.

`explain` earned itself on the first run. A large brute derived with a
baseline body could not gore, trample or hoof, and the trace said so; the
finished statblock alone would have shipped bulls that bite. The role picks
the body now, a non-baseline species overrides it, and --body beats both.

check-forge (guard 26) derives all 450 combinations of role, size, tier and
species and puts each through the bestiary's own validate(). Three mutations
were planted in the forge to test it, and it caught one. Dropping the seed
was caught. Dropping the brawl grant was a genuine no-op, since every role
already lists brawl. Dropping the body-plan filter left all 450 rows green
while the success line read "armed with something its body can use" — the
guard read the location table and never used it. It checks each issued weapon
against the catalogue's own declaration now, and the same mutation produces
500 failures.

check-rules' inline-armour pattern matched any clamp containing the word, and
false-positived three times in one evening on counts that were never damage.
damageAfterArmour is a subtraction, so the pattern requires one. A guard that
makes people contort working code to keep it quiet is training them badly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:22:39 +01:00
slaguru666andClaude Opus 5 5351c25fda Ship the bestiary art: 47 plates and tokens, as webp
The illustrations were sitting in art/creatures/, where nothing looked for
them. build-packs resolves a creature's picture by stem under art/portraits/,
so none of the 47 reached the game.

tools/make-art.py (was make-tokens.py) now derives both from one plate:
art/portraits/<key>.webp and art/tokens/<key>.webp. Same drawing, so the
token cannot disagree with the portrait — the argument mj-queue already makes
for deriving prompts from statblocks.

Webp because every one of the 309 art files already here is one, at 160-220
KB. The raw Midjourney plates are 2.3 MB each; 47 of them would have put 93
MB into a 29 MB repository permanently, for pictures nothing renders at that
size. At quality 88 a plate is ~300 KB with the pencil hatching intact. The
plates stay on disk as working files and are gitignored.

The token lookup in build-packs was a hardcoded `.png`, so the first webp
token would have silently fallen back to the portrait and Foundry would have
gone back to cropping a 2:3 plate into a circle. Portraits and tokens now
share one resolver and one extension list.

146 of 147 npcs carry a portrait and 46 a derived token.

Also: the gryphon came back as a mech a second time. The first fix branched
the armour SIMILE on era while both arms still opened with the word
"armoured", and that word is what Midjourney draws — changing the reasoning
is not the same as changing the cause. No natural creature's prompt contains
"armour" now, and negativesFor() asks for plate, machinery and worn armour to
be left out, because a word choice is an argument and a --no is closer to a
guarantee.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:14:51 +01:00
slaguru666andClaude Opus 5 4dd72c6248 Generated NPCs draw their posting's kit
generateNPC read R.core, R.support and R.label. It never read R.kit, so the
role card's DRAWS FROM STORES promised a Containment officer nine items and
the actor arrived holding a utility knife with a flat naturalArmour standing
in for armour it was never issued.

postings.mjs now owns the decision — drawKitFor(role, tier, {classify}) plus
a draw table per tier — because the engine resolves kit keys against the
compendium and check-generator resolves them against content.mjs, and the two
cannot import each other. Classification comes from catalogue membership and
never from the key: climbing_kit is "Breaching charges" and prybar is "Entry
bar", so anything reading a key's spelling is wrong in that posting first.

The weapon↔skill pairing table is gone. Each weapon item already names the
skill that fires it, so the skill is granted from the weapon, and a generated
NPC cannot hold what it cannot use. THREATS.attacks is now creature-tiers
only; those two keep their natural attacks on top of what they drew.

Armour is an item. naturalArmour drops to 0 on the four human tiers, where
the number was standing in for the item, and stays on the two creature tiers,
where it stacks with drawn armour as locationArmourFor already intends.

check-generator (guard 25) was written first and observed failing on nine
counts against unchanged source. One of its assertions was itself wrong —
it read for the creature-tier restriction after the loop instead of before
it, and so reported the fixed code as broken; re-scoped, it passes on the fix
and still fails against git show HEAD:ringbrp.mjs.

Measured with the new tools/npc-cohort.mjs, 2000 runs, seed 11, against the
party check-lethality freezes. Apex · Containment 68.2% -> 88.5% wipe,
Anomalous · Containment 0.3% -> 19.2%, and Dangerous · Field Lead got weaker
because its posting carries one pistol where the tier used to hand it a
rifle. Full table and three incidental findings in R-310.

Two of those findings are guards, not content. check-rules failed on a
comment that quoted the pattern it hunts for, so comment-only lines are
skipped now. update-readme held the guard list as a hardcoded array whose own
comments recorded it going stale twice; it reads the check script instead,
and so does the count-word rewrite that was separately capped at sixteen.

Not changed, and flagged in R-310: breach_suit and riot_shield declare no
coverage, so they armour every location including the head. The location
counterplay NPC_KIT_PLAN.md relies on does not exist, and that is a balance
decision rather than a side effect of this one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:08:12 +01:00
slaguru666andClaude Opus 5 8dbe885a34 Add check-seam: one definition of the NPC population
collectSpecs() in tools/all-specs.mjs is the single place that decides
which specs exist. Nine modules were importing NPCS and PREGENS straight
from content.mjs instead, so each carried its own idea of the population
and measured a different subset of the game. check-lethality was the
clearest case: it scored 47 creatures and reported OK for all 184.

check-seam (guard 24, first in the suite) scans every module and fails if
anything but all-specs.mjs names NPCS or PREGENS in a content.mjs import.
The nine violators are re-pointed at the seam.

Re-recording check-focus's baseline against the full 184 raised it from
47 packs to 138 and surfaced one creature focus fire does not help: the
dun cow. Rather than re-record that away, the guard now requires the
advice section of BESTIARY.md to name every such exception, and
bestiary.mjs generates the sentence.

The first version of that check asked whether the name appeared anywhere
in BESTIARY.md, which every creature's own heading satisfies — deleting
the exception sentence still passed. It reads only the
"Shooting at something that moves" section now, and the mutation test
fails as it should.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:52:18 +01:00
slaguru666andClaude Opus 5 f68b98190f bestiary + check-powers: read the seam, and classify what that reveals
bestiary.mjs built the document from NPCS, so it described 47 creatures of
147 while check-bestiary agreed with it — two things agreeing is not
verification when both read the same wrong source. It reads collectSpecs()
now: 184 creatures across 5 sections, every one with a measured lethality
figure, which only works because check-lethality was fixed first.

Three faults surfaced fixing it:

  - a second NPCS reference in focusParagraph()
  - which then broke on `rows`, because focusParagraph declares its own
    local `rows` for focus-fire data and shadowed the creature list. Keyed
    lookup now, so the shadowing cannot bite again.
  - the document grouped on the raw role tag against a list of four, and
    `if (!group.length) continue` DROPS an unlisted tag rather than
    mis-filing it. Nine of the twelve tags were absent, so those creatures
    would not have appeared at all. Twelve tags now map onto five sections,
    with a new "Beasts and heraldry", and a completeness assertion counts
    every creature into a section and fails if one is unplaced.

check-powers was the fifth consumer bypassing all-specs.mjs. It reconciled
its counts against BESTIARY while reading NPCS, so it called the document
wrong when the document was right.

Reading the real population then demanded 101 classifications. All 101 are
done and NOT ONE was wired. That is the right answer, not a shortfall:
the three available effects describe the creature — its own attack rating,
the damage it takes, whether it feels defence stacking — and essentially
every power is conditional on a place, a posture, a round count, a weapon
type, an attacker count, a named agent, or Coherence. R-275 records what
wiring one anyway costs: 25.1% to 75.2% on a single creature.

The near-misses are the evidence the reluctance was applied, not recited:
tangie's "HALF damage" is edged-only and ends in open flame; the_heron is
+30% or -20% depending on movement the harness does not have, so which
branch applies is undecidable; mirrorline's halving lands on an AGENT, not
on the creature, so wiring it would have protected the wrong combatant;
yale's defence waiver is capped at two attackers and its written counter is
a fourth agent, which defenceStacking:"ignores" cannot express.

Classifications live in four band files and are spread into POWERS last, so
a hand-written entry always wins a collision. 142 classified: 2 wired, 78
beyond the harness with a reason, 62 not fight rules.

All 23 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:28:13 +01:00
slaguru666andClaude Opus 5 4d591f635d check-lethality: read the shared seam, not content.mjs
It imported NPCS directly, so once the bestiary moved into its own files it
measured 47 of 147 and printed OK. A guard blind to two thirds of what it
guards is not a guard, and this one failed silently — the worse kind.

Now reads collectSpecs(), the list check-creatures, make-portraits and
mj-queue already share. Scenario casts come in with the bestiary: they were
never measured, and they should have been, since the Act Three standoff
this repository publishes wipe rates for IS a scenario cast. 184 specs at
roughly 47ms each, about nine seconds.

Switched BEFORE re-recording, to prove the change moved nothing: the run
against the old baseline reported all 47 existing creatures fighting
exactly as recorded. The --update is then verifiably additive — 47 to 184,
137 added, 0 changed, 0 lost.

Still fail-open on arrival: an unbaselined creature is a note, not a
failure, so this printed "OK, 137 new" while 137 creatures were unguarded.
Left as the author wrote it rather than changed under a content drop, but
it is the same shape as the three classifier bugs in 00f6a1e and worth
closing.

First thing it found, invisible until now: march_stone is authored "it
kills perhaps one person a century" and measures 43.5% wipe, 2.72 of 4
down, over 22 rounds. naturalArmour 14 is the highest in the game — the
Apex tier is 7 — so the party cannot hurt it and it grinds them down. The
prose and the statblock describe different creatures.

All 23 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:14:37 +01:00
slaguru666andClaude Opus 5 8a591b7853 Tokens: derive them from the illustration, and size them by SIZ
Three faults, all in how an actor reaches the table.

THE TOKEN WAS THE PORTRAIT. prototypeToken.texture pointed at the portrait
file, which is a 2:3 field-guide plate — full figure on plain ground.
Foundry draws a token square, so it was squeezing a tall plate into it and
showing a torso. tools/make-tokens.py now derives a 512px circular RGBA
token from the same illustration: not a second Midjourney pass, because
that would double the spend and still give a token that does not quite
match its own portrait. Sized by the subject's DIAGONAL, since these
creatures are tall and narrow and padding by the longest side wasted a
third of the circle. Padded, never cropped — cropping to a square clipped
the first gryphon's head off.

EVERY TOKEN WAS 1x1. A hearth hob, a carthorse and a SIZ 32 dun cow all
held one square. Footprint now comes from SIZ, cut at 21 and 30: 132 at
1x1, 14 at 2x2, 1 at 3x3.

THE 100 CREATURES WERE IN NO COMPENDIUM. build-packs reads NPCS directly
rather than collectSpecs(), so the bestiary validated, was drawn, had
prompts written, and did not exist in the game. The npcs pack held 47
actors; it holds 147 now.

That is the fourth consumer found bypassing all-specs.mjs, whose own header
calls one-definition-only "this repository's one standing law" —
bestiary.mjs and check-lethality.mjs still do. check-lethality is the one
that matters: it cannot see the new creatures, so it is measuring 47 of
147 while reporting OK.

All 23 guards pass. npm run build is red at update-readme for an unrelated
pre-existing reason: the README advertises a guard list that package.json
no longer matches.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:00:57 +01:00
slaguru666andClaude Opus 5 00f6a1e30f Art pipeline: the prompt asked for a person, and got one
Three fail-open classifiers, each reading a field that is not where the
bestiary keeps the answer. Found by generating one creature before
spending the allowance on forty-eight; art/creatures/gryphon-u1.png is a
WINGLESS gryphon, from a spec whose bodyPlan is "winged".

1. anatomyWords() read `species`. Shape lives in `bodyPlan` — that is the
   field selecting the hit-location table. 44 of the 100 new creatures are
   species "baseline" with bodyPlan quadruped or winged, so every one fell
   to the silent branch and asked for no shape at all.

2. isPersonSpec() ended `if (tag) return true` — an unrecognised role tag
   means person. MONSTER_TAGS listed three tags; the bestiary uses twelve,
   so 43 creatures were prompted as "portrait of X, waist-up portrait".
   Now bodyPlan decides first, structurally, because a tag list is free
   text that grows and bodyPlan is enforced by the engine.

3. ROLE_CLASS knew the same three tags, so HERALDRY fell through to
   "carries nothing manufactured and armour >= 4 -> anomalous". Six
   centuries of carved stone were classed as far-side machinery, and the
   armour clause duly asked for a mech. ROLE_CLASS now carries all twelve,
   and the heavy-armour wording follows era: machinery for future and
   anomalous, "hide and scale thick as carved stone" for the rest.

Also in this commit: all 100 creatures re-pointed onto the natural attacks
added in 3feac39 — 41 of 100 changed, the rest keeping grasp or punch
because that is genuinely what they do. Three manoeuvres stay as prose and
say so explicitly: dun_cow's and bull_azure's charge, gryphon's stoop and
drop, tup's blind side. Portraits redrawn, since era decides their hue.

All 23 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 22:55:43 +01:00
slaguru666andClaude Opus 5 3feac39b51 WEAPONS: eight natural attacks, so an animal can fight as itself
The catalogue had `punch` (1d3) and `grasp` (1d6+1 blunt) and nothing else
a creature owns. Every biter and gorer in the bestiary therefore carried a
grasping limb and stated its real damage in tactics prose, which
simulate.mjs cannot read. Two silent consequences: the measured damage was
the grasp's rather than the creature's, and because grasp is blunt, the
edged and piercing wound paths never fired for any animal in the game — a
boar's tusk, a wolf's bite and a gryphon's talon all resolved as blunt.

  bite      1d6     piercing      gore      1d8+1  piercing
  claw      1d6     edged         hoof      1d6+2  blunt
  talon     1d6+1   piercing      trample   1d10   blunt
  beak      1d6+1   piercing      constrict 1d6    blunt

All fam "brawl", like punch and grasp, so they need no new skill family and
arrive usable. Calibrated against the melee line already in the table:
dagger 1d4+2, baton 1d6+2, machete 1d8+1, prybar 1d10.

Reported independently by three of the four bestiary authors. All 23 guards
pass. Nothing uses these yet — the creatures are re-pointed next.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 22:47:55 +01:00
slaguru666andClaude Opus 5 32eaee1eb0 Bestiary: 100 creatures across four bands, with portraits
Folklore of the isles, water and the drowned, anomalous far-side, and
beasts and heraldry — 25 each, in four source files wired into
collectSpecs(). check-creatures passes at 204 specs across 13 sources and
the full 23-guard suite is green.

The population this was meant to fix:

  non-human body plan   4 -> 48   (29 quadruped, 15 winged)
  vesh / cadence        5/5 -> 13/13
  creatures            47 -> 147

CREATURE_FORGE_PLAN.md called the unused location tables the reason to
build any of this; the quadruped and winged plans now carry a bestiary
rather than three dogs and a heraldic beast.

Art is procedural: 102 SVG portraits composed from each creature's own
body geometry, so a cadence portrait has five headless bodies because its
location table has five. The 17 hand-made portraits are untouched.
BESTIARY_ART.md carries 204 derived Midjourney prompts for the ones worth
illustrating properly later.

Known and unfixed, reported by three of the four authors independently:
WEAPONS has no bite, claw, gore, hoof or talon, so every creature that
kills with its mouth carries `grasp` and states its real damage in prose.
simulate.mjs measures the grasp. Next commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 22:45:48 +01:00
slaguru666andClaude Opus 5 d186d29238 NPC kit: creature tiers draw kit too, and their armour stacks
Anomalous and Apex now draw weapons, armour and gear from the posting on
top of the natural attacks they already carry. Their hide stays, and
locationArmourFor adds worn pieces to it, so Apex · Containment stands at
17 torso armour: 7 hide, 7 breaching suit, 3 riot shield raised. Mean
damage across the 61 weapons is 6.9 and the heaviest ordinary one means
9.0, so nothing but the Unmaker reliably breaks it.

Chosen deliberately with that number in hand. The spec records the
counterplay already in the rules — the shield only counts raised, and
exposedHideFor halves hide on a grounded creature outside the vital — and
obliges Phase 5 to simulate both tiers standing and grounded rather than
assert a lethality band.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 22:28:27 +01:00
slaguru666andClaude Opus 5 8b088fb3f0 NPC kit: design for issuing the posting's stores to generated NPCs
generateNPC reads R.core, R.support and R.label. It does not read R.kit,
which generateDialog prints as DRAWS FROM STORES and generateCharacter
issues. The card promises a marksman rifle and a breaching suit; the actor
gets a utility knife.

Design: the posting says what it carries, the tier says how much of it and
how good with it. Kit keys classify by which pack they resolve in rather
than by a second hand-written list. Attacks derive from the issued weapon's
own skillFamilyId/skillSpecialisationId, which retires the weapon-to-skill
pairing table. Armour becomes an equipped item and naturalArmour drops to 0
on the four human tiers, which moves the numbers and so gets measured.

check-generator.mjs is written first and observed failing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 22:15:57 +01:00
slaguru666andClaude Opus 5 750cbd257d Character sheet: reload button for ranged weapons
A reload icon sits beside the ammo count in the readied-weapon strip and
the weapons table, for any weapon with a magazine. It tops the weapon up
from its reserve (rules.reloadFor, spot-checked), posts the new count and
the weapon's reload time to chat, and warns when the weapon is already
full or the reserve is empty.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 18:21:57 +01:00
slaguru666andClaude Opus 5 1e0deb2ef0 Attack card: humanoid and quadruped damage buttons
The single Roll damage button becomes two, with person and paw icons. Each
rolls damage and then a hit location. A targeted token still uses its own
anatomy; with no target the blow is placed on the chosen body plan and
shown, with nothing applied. Both buttons disable after either is used.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 18:12:48 +01:00
slaguru666andClaude Opus 5 197bdf9fb0 STANDING ORDER: every face and every room below
Four new portraits (Joan Wetherlaw at last, Ruth Cotter, Nell Teague,
Mr Ogden) and eleven interior plates, one for each underground location
that had none, in the two-ink civil defence style. Bewley and Prosser
reuse their THROUGH TRAIN portraits. Journals now show 20 plates and 12
faces. The art sheet corrects the v1.0 diagnosis: Joan's prompt was
being refused, not the account out of hours.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 15:53:58 +01:00
slaguru666andClaude Opus 5 b04db4d8e3 STANDING ORDER: player-facing case brief and print pack
SO-H01 becomes the full Registry case brief: what the department knows
about Bellhouse, the 1974 return and the stamp, the orders, conduct,
access and the Stores issue. Nothing about the song, the children or
Centre's letters. STANDING_ORDER_HANDOUTS.html prints it on A4 with the
enclosed 1974 Seat return (SO-H02) and Mr Smith's mark.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 14:49:39 +01:00
slaguru666andClaude Opus 5 d89acbac93 STANDING ORDER: section map draws the pit galleries, key in order
The section now shows 13, 14, 15 and 18 on a third level with the
incline from the plant floor, instead of footnoting them as not drawn,
and the key runs 6-18 in number order in two columns. Sheet 6 moves the
incline to the plant's north end to match.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 14:28:32 +01:00
slaguru666andClaude Opus 5 2c05b6b8f7 STANDING ORDER: where a thousand people live
Five more blueprint sheets: the 1962 dormitories and laundry (240
berths), the canteen, kitchen, bakery and officers' cabins (20), and
three sheets of the Estate, 213 family dwellings on three coal roads
(737). With Edith and Kit Marlow that is the 999; the scenario now
shows the sum. Section map issue 3 adds 16-18, and sheet 6 is mirrored
so the pipe room lies south of the plant as the section draws it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 12:13:51 +01:00
slaguru666andClaude Opus 5 3151b912f6 STANDING ORDER: make the blueprints one coherent building
Eight sheets laid out to match the section: north to the left, Level 1
lobby to sick bay, Level 2 creche to plant, an incline to the pit
galleries, and every corridor end naming the sheet it reaches. Rooms
now share walls (the corridor gap had doors opening onto rock); adds an
armoury, a pipe room beside the plant, and a Vigil hall sized for 999
standing. bellhouse-plans.mjs --check holds doors, swings, furniture,
lettering and reachability, and runs in npm run check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:56:45 +01:00
slaguru666andClaude Opus 5 33f2b62070 STANDING ORDER: seven blueprint scenes of the underground
Drawn by tools/bellhouse-plans.mjs from declared rooms: lobby, control
room, registry, sick bay, creche, vigil hall and plant, coal roads and
the Sump. 2800x2000 at 5 ft to the square, added to the Adventure and
keyed in the Locations table.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:43:02 +01:00
slaguru666andClaude Opus 5 5ae31944ee STANDING ORDER v1.1: simpler case; the children carry the song
Cut the register mechanic, the census creature, the paperwork route and
half the clues. The under-twelves know Mr Smith's song from the nightly
creche speaker, so Act Three is a choice: burn the tape and take the
children into care, keep the families below, or cure them with a cut
tape first.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:34:15 +01:00
slaguru666andClaude Opus 5 2ba5838d46 STANDING ORDER: Mr Smith is a Cthulhu Mythos messenger, not Vesh
Tim's ruling. He comes from Outside and speaks for the powers that sleep
there, which the department has no heading for; the census in the Registry
is a Vesh working for him. The open question is marked decided.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:19:26 +01:00
slaguru666andClaude Opus 5 c3ac694ed9 STANDING ORDER v1.0: the rewrite
The agents now cross into Bellhouse on a diplomatic brief to bring its people
home. A thousand people (118 of the 1974 intake, 881 born below) run the Seat
like a 1970s council, kept down by ninety-day renewals from "Centre", which
is Mr Smith, planted in THROUGH TRAIN. His experiment is procedural and
quiet: a bulletin response, a crèche lullaby, a shared dream, the children's
drawings, a steered establishment. Act One is the briefing, the moor and the
crossing into Enquiries. Act Two is the site, and the detention the Controller
orders on Centre's circular, measured and cited. Act Three is Annex D: at a
thousand the Seat broadcasts an Address that enrols whoever hears it, and the
table must silence it before or while they release the Seat under clause 4.

Same site, people and plates. Two cast actors (the wardens, Teague). New
handouts SO-H05 (Centre's circular) and SO-H06 (terms of engagement). The
section map's key is relabelled (issue 2). Status is honest: v0.7's five desk
passes tested a different plot, and this needs its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:15:38 +01:00
slaguru666andClaude Opus 5 514e0c903e THROUGH TRAIN: plant Mr Smith
The man who told Vane what the chart had to say now has a name: a Mr Smith,
with the company's paper, whom the company never employed. Vane names him if
asked and cannot picture his face. A "do not resolve" line says who he is not
to be explained here: he is the thread into STANDING ORDER.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:15:38 +01:00
slaguru666andClaude Opus 5 e80f7bb564 detention-tables: measure STANDING ORDER's Act Two fight, and hold it
A second scenario gets pack-tables' arrangement: four configs (Teague plus
one, three or five wardens) against the declared six and the four-player
cut, 2000 runs at seed 11, cap 400, recorded to detention-baseline.json,
citeable as "detention", and --check added to npm run check.

standingorder joins all-specs' SCENARIOS, and simulate.mjs now reads that
list instead of keeping its own copy, so a new cast is fightable the day it
is registered. The lethality, focus and pack baselines are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 11:15:38 +01:00
slaguru666andClaude Opus 5 0fa21263b4 STANDING ORDER: an Adventure compendium, built from the document
New pack ringbrp.standingorder, in the Scenarios folder. It holds the GM
journal (13 pages, one per section), the three player handouts, nine plates
to show, six faces and the Bellhouse section map as a scene. No cast actors,
because nobody in the case has a stat block.

The GM pages are read from docs/scenarios/STANDING_ORDER.md at build time
rather than transcribed, so the compendium cannot drift from the document the
desk passes ran against. STATUS and Open questions are left out as authoring
notes; STATUS's "not obvious" list leads page 1.

Doc fixes found on the way: the Act Two heading still said ~55 min against a
75-minute budget; STATUS said four passes and "no desk playtest run" after
five; the runtime open question still called 45/55/50 unbacked.
figures-baseline: generator enrolled at 0; STANDING_ORDER.md leaves the
uncited list because it cites.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 10:35:32 +01:00
slaguru666andClaude Opus 5 e780181e07 Rebuild the rules pack: R-273's opposed-roll section never reached it
cdbb2e3 added "When two people want opposite things" to the rules text but did
not rebuild packs/rules, so the compendium has been a section behind the
source since. Content-checked against HEAD: this is the only page that differs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 10:35:32 +01:00
slaguru666andClaude Opus 5 1d42fb2444 STANDING ORDER v0.7: pass 5 verifies the retry fix, and catches my own error
A narrow verification pass rather than a session: does Act Two land where v0.6
budgets it now that a failed filed-clue roll costs a scene instead of ten
minutes? Seed 4471.

THE RETRY FIX WORKS AND DOES NOT DO WHAT v0.6 ASSUMED. Forced both filed clues
to fail — about one table in seven, since each is a 37% miss at these ratings.
Under the old rule that was twenty minutes and a party standing in Registry
waiting; under the new one Pennyfeather fetches each while they do something
else and it costs nothing, while the roll still means something. So the fix
removes up to twenty minutes of VARIANCE. It does not shorten the typical case,
and Act Two uncut is 75 minutes whether or not anybody fails a filed roll.

AND v0.6 CONTAINED AN ARITHMETIC CONTRADICTION I PUT THERE. The Runtime row
budgeted Act Two at 65 — pass 4's figure, measured with nineteen minutes of cuts
taken — while the Pacing Note two screens later said the correct number of cuts
to plan for is zero. Both cannot be true; it was a ten-minute overrun written in
on purpose. The three prior passes reconcile exactly (75 uncut, and pass 4's 66
is 75 − 19 + 10), so the number was never in doubt, only which configuration it
belonged to. I measured under one configuration, changed the configuration, and
kept the number.

Act Two is now budgeted at its uncut base of 75. Acts of 45 / 75 / 50 is 2h50 of
play, 3h00 wall with the break, in a 3h15 slot — fifteen minutes of real slack
rather than twenty-five claimed ones. The cuts stay optional, which keeps Kit
Marlow's scene, which pass 4 showed is the price of the likeliest ending.

The timing section now records that 75 is the uncut base three passes agree on,
and that the retry fix moved the worst case and not the typical one, so nobody
re-derives the same error the next time the slot moves.

All twenty-one guards pass. Five passes; what is left is human beings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:26:44 +01:00
slaguru666andClaude Opus 5 1a6c1474da STANDING ORDER v0.6: the slot is 3h15
Decided rather than worked around. Four passes measured Act Two's floor at about
66 minutes against a budget that said 55; the alternative was twelve minutes out
of the sick bay, which is where Revelation 3's best route lives. The slot moved,
because 3h00 was an assumption and the sick bay is not.

2h50 of play in three acts of 45 / 65 / 50 plus the break, in a 3h15 slot. Act
Two is budgeted at the 66 pass 4 actually measured with every cut taken, not at
the 56 the retry fix predicts, because nothing has measured the fix. The
twenty-five minutes of slack are deliberate: the house standard says a scenario
landing to the minute with zero slack is a fail for a table of strangers, and
every figure came off a desk pass run by a GM who already knew the document.

THE CUTS ARE NO LONGER DEFAULTS, which is the real answer to pass 4's finding
rather than a workaround for it. They existed because Act Two had to lose twenty
minutes it did not have. At 3h15 the correct number to plan for is zero — and
that retires the trap where the cheapest default cut hollowed out the price of
the likeliest ending.

AND THE REBUDGET EXPOSED AN OLDER DEFECT. The Countdown put step 3 at +1h20 and
step 4 at +2h00, measured from the blast door — so under every budget this
scenario has ever had, both fired AFTER Act Two ended. Both are backstops for
Essential revelations: step 3 is the second road to the sum and step 4 is
Revelation 3's last resort. They were arriving too late to back anything up. The
whole table is re-timed inside the act at +15 / +35 / +45 / +60, the reference
point is stated, and Act One's Stealth roll moves step 2 within that window
instead of pushing Teague past the end of the act.

The act checkpoints were trailing their own acts too — the signing one left five
minutes for the decision. A checkpoint is a point you can still correct from, so
the sum is wanted at 1:40 with twenty minutes of Act Two left, and Act Three's
is ten minutes in. Running times are printed so they mean something.

All twenty-one guards pass. What is left is human beings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:15:38 +01:00
slaguru666andClaude Opus 5 4148d13768 STANDING ORDER v0.5: desk playtest 4, the clock with the cuts taken
The pass three passes had not run: an honest session at six players, no
contrarian choices and no forced branches, with the Pacing Note's cuts taken
exactly as written. Seed 6620. Nineteen minutes cut — pipe room folded, Kit
Marlow to the corridor, census dropped.

THE CUTS DID NOT CLOSE THE GAP, AND ONE RETRY UNDID MOST OF THEM. Act Two asks
for six rolls whose failure case was "ten minutes and a second attempt", roughly
two fail in an average session, and a single failed Research handed back ten of
the nineteen minutes that had just been cut. The Pacing Note's arithmetic was
sized against the act's length and never against its variance, so it could not
hold. A failed roll on a filed clue now costs a SCENE instead — Pennyfeather
fetches it while the party do something else — which keeps the roll meaningful
and costs nothing on the clock.

THE CHEAPEST CUT GUTS THE LIKELIEST ENDING. The Pacing Note priced moving Kit
Marlow to a corridor at "the drawings". This pass took that cut and then reached
the narrow row of ending 3 — the likeliest one, since it needs a single dossier
item — whose entire price is that the sixty-one stay unrecorded. Kit is the
sixty-one made into a person and her own entry says she must be a person before
she is a price. The cut is re-costed honestly, and the corridor version now has
to do her one job: she shows them a drawing and asks whether she got the blue
right.

The blanket Act One failure case named Joan for all seven clues, and Joan does
not go down the adit. Clues 6 and 7 now have their own: time, never access,
because the door has never been locked. Joan herself is at the farm AND walks up
with them, so the moor walk has somebody in it. And 13b came off the dice after
a 98 lost the reason the proper channel failed — the thematic centre of the case
— which is now written at the bottom of Pennyfeather's own sheet.

Act Two's floor is about 66 minutes against a budget of 55, measured across
three passes at 75 uncut, 70 uncut and 66 fully cut. The retry fix should
recover most of that and nothing has measured it. THE REMAINING QUESTION IS A
BUDGET DECISION AND IT IS TIM'S: move the slot to 3h15, or take twelve minutes
out of the sick bay and lose Revelation 3's best route. Written up in Open
questions and deliberately not decided here.

All twenty-one guards pass. Four passes, every content defect they found fixed.
What is left is human beings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:10:50 +01:00
slaguru666andClaude Opus 5 3db28885f0 STANDING ORDER v0.4: desk playtest 3, player chair, contrarian
The cadence's third pass: a full session choosing contrarily at every fork,
forced to the one ending nothing had reached. Seed 3307. The party skipped the
scenario's best NPC, told the antagonist the truth before anyone else, refused
the hospitality, split so the wrong specialist was in every room, took a
resident to the surface, and cancelled.

BOTH OF PASS 1'S HEADLINE FIXES WORK, AND ONE WORKS BETTER THAN WRITTEN. The pen
held above the paper converted the ending from pass 2's ninety-second reflex
into a real argument about whether a narrow amendment they could no longer reach
beat a cancellation they could. And Pennyfeather's spoken cost landed on a party
who had failed the birth register, so the sixty-one arrived as new information at
the moment of decision — which is better than knowing in advance, and clue 14 is
demoted to Supporting on the strength of it.

THE SUM HAD ONE ROUTE AND NO FALLBACK. Pass 1 found the Revelation 3 fallback
circular and it was repaired with three roads; nobody then asked whether the
other essential revelations had the same shape. The contrarian split put Insight
40 in Registry instead of 63, one roll failed, and the party cancelled the
Standing Order having never learned why it was urgent. Worse, the clue asked for
a roll that Pennyfeather's own roster line contradicted — she hands the sheet to
anybody who asks her a straight question. The roster line wins: the sum is no
longer behind a roll at all, the Insight now buys what she did about it, and the
establishment return she posts at Countdown step 3 is a second road for a table
that never thinks to ask her anything. Fixing an instance is not fixing a class.

TWO OF THREE HOOKS ROUTED THE PARTY AROUND THE ACT'S ENGINE. Only one hook
involves the farm, and a professional team with a grid reference drives past it
— so Act One ran fifteen minutes short with nobody in it, and both its Essential
clues lost their stated failure case, which is Joan pointing at them. She is now
at the vent head, where the woman in her own entry would be anyway, and no route
into the act can miss her.

Also: the pen pause was staged only for a Teague who stood down and now prints
the hostile version; a photograph brought back down is answered; refusing the tea
is answered; and an uninformed cancellation is written as the ending it deserves
to be, since a party who do the right thing by accident is the best possible
close for a case about people doing the wrong thing correctly.

All twenty-one guards pass.

Three passes and none of them a normal table: GM chair with bad dice, a branch
stress, and a deliberately contrarian run. Pass 3 landed on the 150-minute budget
only because one act collapsed and the other spent the difference. No pass has
run Act Two with its cuts taken. That, and human beings, is what is left.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 22:58:49 +01:00
slaguru666andClaude Opus 5 bd1b6e71f2 STANDING ORDER v0.3: desk playtest 2, Act Three stress
The house cadence's second pass is a stress re-run of the weakest act. Pass 1
resolved Act Three in eight minutes of fifty and left three of its four branches
untested, so this forces each in turn on seed 8143 — and runs the three creature
encounters through tools/playthrough.mjs, the same runFight the lethality and
focus baselines come from, against this scenario's own declared six rather than
the frozen four.

THE THREE DOSSIER SCENES CHANGED NOTHING. The party assembled one item of three
and rolled 62 against 63 — exactly the roll they would have made with all three,
because Borrowed Authority says items improve the credential and never the roll.
Correct as a rule, catastrophic as staging: the act's best three scenes had no
effect any player could see, and pass 1 could not find it because there the
amendment failed and the question never arose. The items now buy scope instead.
Same roll, three different worlds: a narrow amendment that stops the ash and
leaves the site sealed, a lifted seal, or records above ground for the sixty-one
so Kit Marlow can leave.

ALL THREE CREATURES ARE INVISIBLE TO THE DICE. STERILISATION ORDER, THE
CORRECTION and ENUMERATED are all classified outOfCombat in powers.mjs, so every
measured number is a measurement of the creature's arms and legs and of nothing
that makes it frightening. That is correct bookkeeping, not a defect in the
guard, and it means the GM's text carries the whole threat at the climax. It
did not. The overwriter now comes with four printed corrections specific to this
case, and with the fact that force does not work: measured, one of them cannot
meaningfully hurt anybody and five grind for forty rounds finishing nothing, so
the end of the world was landing as an inconclusive scuffle.

EXPOSURE wiped all six in fifteen rounds with five dead, without the
sterilisation blast firing at all. The warning was right and understated. It now
prints the six-round countdown that lived only in the bestiary entry, the
argue-down as a named Borrowed Authority stretch, and what a failure costs —
five rounds reaches the adit and does not reach the crèche.

The best ending was three sentences, less than the failure branch beneath it,
and now plays out properly: the tannoy, nobody cheering, Pennyfeather filing it,
and Joan sweeping a yard that stays swept.

The four-player cut was one sentence from disaster. Science (Biology) and
Medicine are the only skills that vanish with Okonkwo and Nkemdirim, the cut
note happened to reassign exactly those two clues, and check-rollable never saw
any of it because the cast declaration names six and the cut is prose. Both
clues are now written on Knowledge and Insight for every table size, so nothing
load-bearing depends on an unguarded sentence.

All twenty-one guards pass, and the document has entered check-figures' strict
regime now that it carries citations.

Still untested: ending 1, and with it Pennyfeather speaking the cost and the pen
held above the paper — pass 1's two headline fixes. Pass 3 is the player chair,
contrarian, and should cancel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 22:31:06 +01:00
slaguru666andClaude Opus 5 07bc09129e art sheet: record what actually rendered, and why Joan did not
Eight plates and six of seven portraits are on disk. Joan Wetherlaw's portrait
stalled three times — twice on the bridge's full 1800s window and once on
deliberately reworded prompt text, which rules out both the prompt and
deduplication. The thirteen before it returned in about forty-five seconds and
everything after ~21:20 hung, which looks like fast GPU hours running out
mid-batch.

The sheet listed every stem as though it existed and named the plates by their
pre-conversion stems rather than the webp files actually committed. Both fixed,
with the retry instructions and the note that mj-gen exits 0 on a timeout, so
the file is the thing to check and not the exit code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 22:14:49 +01:00
slaguru666andClaude Opus 5 123e08612e STANDING ORDER v0.2: desk playtest 1, and its fix list applied
GM chair, all six cast pregens played as archetypes, every beat rolled on a
seeded roller (mulberry32, seed 5291, rolls consumed in printed order) so the
run is re-checkable rather than remembered. Fourteen plates and portraits too.

The pass found three things worth the afternoon.

REVELATION 3 WAS NEVER DELIVERED, AND ITS FALLBACK WAS CIRCULAR. The Psychology
roll with Marlow failed, the Larkhall fallback failed, and the only route left
was a file in Marlow's private quarters that nothing in the scenario told the
players existed — findable only by knowing the thing it reveals. A fallback that
requires the revelation it is a fallback for is not a fallback. The file now
lives in the sick-bay day room where they already have reason to be, there is a
second independent route through Pennyfeather and the 1974 return's CASUALTIES
NIL, and the Vigil is an automatic backstop under all three.

Psychology was the wrong skill anyway: the audit put the best in the cast at 40,
a coin flip on the moral centre of the case, while the Casting table credited
Renshaw with it as a strength. It is Insight now — 63, genuinely hers, and a
better fit for a woman who is ashamed rather than confused.

THE MOST OBVIOUS PLAYER MOVE HAD NO PRINTED ANSWER. The talker told the
Controller there had been no war, four minutes in, and the document said
nothing. Now printed in three mouths, plus what happens when they take a
resident up to see the sky — which works, harms nobody, and solves nothing.

ACT THREE RESOLVED IN EIGHT MINUTES OF A FIFTY-MINUTE ACT. The amendment failed
and the party cancelled inside ninety seconds, because falling through to the
end of the world is so much worse than the alternative that nobody deliberated
— and they cancelled without knowing it kills the sixty-one children, because
Pennyfeather was two corridors away. She now stands at the Controller's elbow
and says the number out loud before the pen moves, and a failed amendment holds
Sowerby's pen above the paper for one full round.

Also: Act Two ran 75 against 55 and now has a real Pacing Note; the Act One
Stealth roll bought nothing and now buys when Teague finds them; time inside
versus outside is ruled in the text; the census is marked optional because
missing it cost nothing; and Containment gets the one beat the heavy's 3/10
verdict asked for.

All twenty-one guards still pass, and check-figures still records this document
at zero bare figures.

Untested: ending 2, a successful amendment, the quarantine unit, four players.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 21:43:50 +01:00
slaguru666andClaude Opus 5 70acc1e60b STANDING ORDER: a three-act post-apocalyptic crossing case
Two hundred and six people went underground in 1974 to govern the country after
the war. There was no war. The Deputy Controller filed the drill as live, on
purpose, to save the site a fortnight of arguing about whether it was allowed to
start — and reality took the filing.

The apocalypse in this one is clerical. At renewal 211 the site's population
record exceeds the surviving population of the region it governs, and a record
that cannot hold both resolves by correcting the region. Act Two shows the
players the sum; Act Three is the decision, and all three endings cost
something. Cancelling the order kills the sixty-one children born below, who
have no record above ground. The text says so and does not offer the GM a way to
make it painless.

Deliberately not CLEAN GROUND. That case is a filed valley found by accident and
resolved by cancellation; this is a filed institution the department built on
purpose, and its best ending amends the order's scope rather than cancelling it
— a Borrowed Authority problem, which is the setting's own thesis about
arrangements beating fights.

Three existing bestiary creatures, nothing new to build: the census counts in
the Registry, the overwriter performs the correction if the renewal goes
through, and the quarantine unit is the failure state you argue down.

Cast declared as a different six from CLEAN GROUND's so the two cases exercise
different sheets. All twenty-one guards pass: check-scenarios resolves 115 tags,
check-rollable holds every route to the declared cast, and check-figures records
the document at zero bare figures — it cites no measured number because it
prints none, the quarantine unit's lethality included.

The section drawing is hand-built SVG and must stay that way: every label on it
is load-bearing and no generator holds legible text. Numbered callouts with a
key beneath, per AFTERIMAGE v3.1.

NOT playtested. Not once, desk or human. Every timing in it is a guess.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 21:14:01 +01:00
slaguru666andClaude Opus 5 fa30909dc9 handouts: the print rule zeroed the padding the slug depended on
Rendering the pack to PDF to print it showed the GM filing slug printed on top
of the first line of three of the four sheets — both almanac tables and the
minute's "Copy 3 of 4" line.

The cause is one declaration. .slug is position:absolute at top:6mm, and what
kept sheet content clear of it was .sheet's 18mm screen padding. The print
block then said padding: 0, so in print — and only in print — content started
at the very top and ran under the slug. On screen the pack looked perfect,
which is why it survived being built, checked and shipped.

Fixed by keeping a top padding in print: padding: 11mm 0 0. Side and bottom
margins still come from @page, so nothing else moves.

check-handouts could not see this and is not at fault for it: it holds the
pack's STRUCTURE — the two almanac sheets sharing one class and one set of
columns, every line reading 41 mi, nothing under 11pt — and a collision between
an absolutely positioned element and the flow is a property of the rendering,
not the markup. It took rendering the file and looking at the pages.

The almanac trick itself is unaffected and was verified in the PDF: H03a and
H03b print identically but for their dates and their counts, forty-one against
fifty-three.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 22:59:39 +01:00
slaguru666andClaude Opus 5 fbe6288c94 CLEAN GROUND: re-roll the column plate, and record what the crossing costs
cg_05_column re-rolled and replaced. It now has Ivy a half-step ahead of the
line with both hands held open and visible, which is the beat the read-aloud
actually describes — "one woman walks forward with her hands held where you can
see them". The line behind her is still drawn uniformly, so the six at the back
remain indistinguishable, which is the one hard rule in the notes.

cg_04_crossing is unchanged. Seven attempts did not beat the original: the
plate has to be grey and dead and empty, and the generator supplies any two.
The original's livestock are confirmed real rather than rocks — a crop of the
hillside shows grazing animals and a barn — so the defect stands, recorded in
STATUS rather than quietly kept.

What the failures taught is now in CLEAN_GROUND_ART.md, because it is worth
more than the plate:

- Naming a thing to exclude it puts it in. "No birds, no sheep, no movement"
  and "the grey is dust and not snow" produced, respectively, livestock and
  snow. Both negations summoned what they forbade.
- Steering off snow steers into summer: the moor comes back green and alive,
  which is worse than either.
- A long --no list stalls the job outright. Four consecutive prompts with ten
  or more exclusions never produced a grid; the same prompt with four returned
  in two minutes.
- Filter words costing a 30-minute timeout each: wound, dead ground, lifeless,
  smothered, and shot — including in "nobody in shot".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 22:02:03 +01:00
slaguru666andClaude Opus 5 310d342767 CLEAN GROUND v0.25 — the artwork, generated and placed
Seventeen assets through the Midjourney bridge: six NPC portraits at 512x512 in
art/portraits/cg_*.webp and eleven scene plates at 1024x682 in
art/scenes/cg_*.webp, matching the dimensions every other scenario in the
system already uses. CLEAN GROUND had none; LAST_ADMISSION has 8 plates,
OPEN_DAY 10, THROUGH_TRAIN 13.

The art direction holds: 1962 Ministry drawing-office hand, pen and ink with
pencil shading, dyeline blue-grey wash, buff card grain and a ruled margin, so
the far side is drawn on the same paper as the Registry corridor. Ivy reads as
competent rather than frail, and cg_05_column obeys the one hard rule in the
notes — the six at the back are drawn exactly like the other thirty-five.

Three prompts had to be reworded around Midjourney's filter, which declines
ephemerally and leaves mj-gen waiting out its full 30-minute timeout on
silence. "An empty dog lead WOUND twice round one fist" cost 23 minutes before
the pattern was recognised; "nobody in SHOT" and "nothing behind its face" were
found by scanning the remaining prompts rather than by hitting them.

Two misses recorded in STATUS rather than quietly kept:

- cg_04_crossing appears to have livestock on the hillside, and the point of
  that scene is that every sheep is gone.
- cg_05_column has no Ivy; the line is uniform where the text has one woman a
  half-step forward with her hands open.

Neither stops the scenario running. Eight of the seventeen were inspected
against their briefs in detail, including every plate carrying an explicit rule.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 21:19:39 +01:00
slaguru666andClaude Opus 5 fe92f6ceb2 CLEAN GROUND art sheet: square portraits, and the word photograph out of the tokens
Two corrections found by checking the repo before generating rather than after.

The sheet said --ar 2:3 for portraits, copied from THROUGH TRAIN's tokens.
Every raster portrait in art/portraits is 512x512, all sixteen, and every scene
plate in art/scenes is 1024x682 across all three scenarios that have them.
Foundry wants a square portrait. Corrected to --ar 1:1.

And the token said 'composed as a 1962 personnel-file photograph'. The conceit
is that the framing is a file record, but leaving the word photograph in the
prompt fights --no photography and pulls the generation to photorealism, which
is the house gotcha already written down from the Day One prompts. 'Composed
square-on like a 1962 personnel record card' gets the framing without the word.

--no photography, photorealism added to all three tokens.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:43:09 +01:00
slaguru666andClaude Opus 5 d0db7954bc check-figures: the guard's body belongs behind the entry-point check
The fold exported scanDocument for the string tests, and importing it also ran
the guard. check-behaviour imports that module, so a figure defect called
process.exit(1) inside check-behaviour: it reported check-figures' failure under
its own name having run zero of its 108 tests.

The build went red, which is why this was survivable, but it went red in the
wrong place and every behavioural test was silently not running while appearing
to. A guard that stops another guard from running, and cannot say so, is the
worst version of the fault this file exists to catch.

Body now sits behind import.meta.main, the idiom step5-split.mjs already uses.
Importing yields the four readers and nothing else. Tested by spawning a fresh
process, because the property is "importing has no effect" and a source
assertion would pass on a file that grew a second side effect elsewhere.

Reverting the check fails exactly one test. With a defect planted,
check-behaviour runs 108 green and check-figures fails in its own slot.

Mine, introduced by R-307. R-309.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:39:46 +01:00
slaguru666andClaude Opus 5 bd9b3bdd27 check-figures: use the capture's position, not a search for its text
R-308. Read the fold as a stranger at its author's request. Two of the three
risks they flagged are sound: isProse drops nothing that carries a citation
(scanned the whole corpus), and the duration exclusion earns its place, since
"runs" now means three things in this corpus and only the cell can tell them
apart.

The third is real. numEnd used line.indexOf(m[1], m.index), which finds the
first copy of the digits at or after the match start rather than the copy that
was captured:

  "The wipe rate of 74 in ten is 74%<!-- cite: ... -->."
     value=74  numAt=17  marked=FALSE

A correctly cited figure reported bare, because numEnd lands mid-sentence and
the marker test reads " in ten is 74%...". Fixed with the d flag: m.indices[1]
gives the capture's real position and there is nothing to search for.

Narrow to reach — it needs the wipe-rate shape, the only one with a wide gap
before its capture, and an integer duplicate inside that gap; a decimal cannot
do it because [^.] will not span a decimal point. Three attempts failed for
that reason before the fourth worked, which is why this is recorded as narrow
rather than theoretical.

Worth fixing anyway because its direction is the bad one: a miss costs one
figure, a false positive on correct prose costs the guard.

Seven-case battery re-run, every restore byte-identical.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:35:43 +01:00
slaguru666andClaude Opus 5 b946a28312 check-figures: the fold — one guard, three readers, and the boundary between them
check-unmarked is gone and check-figures holds all of it. Three readers, each
authoritative where the corpus gives it authority: a named phrasing anywhere,
a column header inside tables, and bold in prose only.

The boundary is the finding rather than the union. Bold is a publication mark
in prose and an emphasis mark in a table — nine measurement columns mix bold
with plain, all correctly cited, and in the mixed-force table the two bolded
rows are exactly the two the prose underneath singles out. So the bold reader
stays silent in a table and the header rules there alone. Neither guard could
have found this alone: each had half the evidence and read it as the other's bug.

Union of both word lists, because each had a gap the other covered — wipes and
runs. A proposal to drop runs? was made and withdrawn; it would have dropped the
p99 column, which is R-299's own defect committed a second time.

Exclusions test cells, never header words: prose, denominator, duration. No
threshold rule touches a header, or "Past 15 rounds" loses two cited figures.

Two integration defects, both caught by the ported tests: the readers stopped at
different ends of one figure so the dedupe missed it (identity is where the
number starts), and blanking prose cells for every reader dropped twelve real
figures out of THROUGH_TRAIN's ratchet (the prose rule belongs to the column
pass alone).

Kept from R-299: opt-in rule, ratchet and its leave-the-loose-set branch, the
UNCITEABLE check, NOT_A_MEASUREMENT, comments blanked not stripped. Added
waivers, with an empty reason fatal and every waiver printed on a green build.

21 guards, 107 behavioural tests, 139 figures — 115 marked, 6 waived.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:29:14 +01:00
slaguru666andClaude Opus 5 4363b545a0 docs: R-306 — the merged design reproduces the answer from two implementations
A second implementation of the three settled rules, written from the
description alone rather than from the peer's code or the agreed list, lands on
the same nine columns and the same single exclusion. Two unlike
implementations of the same three sentences agreeing is the property a design
needs before anybody builds it.

Also tabulates where each of the evening's counts came from: 44% and 57% and
64% and 'at least 7' and 8 each came from an operation on the numbers; 9 came
from opening the disputed columns and reading them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:20:59 +01:00
slaguru666andClaude Opus 5 4df8064559 docs: R-305 addendum — nine, now by inspection rather than assertion
R-305 asserted the shared seven were all genuine without opening them, which is
the error the entry exists to correct, committed inside the correction. Opened
all nine: every cell cited, none prose, every column mixing bold with plain.

The peer's final count of eight is their own vocabulary's nine minus the false
positive, an arithmetic that never contained 'Then wipes' because wiped? cannot
match wipes. The union was agreed and their own set was counted.

Nothing in the design turns on it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:18:49 +01:00
slaguru666andClaude Opus 5 c59dc45117 docs: R-305 — the union, not the intersection: nine columns
R-304's rate was an artefact; the proposed correction, retreating to the seven
both vocabularies agree on, overshoots. Opening every disputed column instead
of comparing totals: 'Then wipes' is genuine and check-unmarked misses it
because wiped? does not match wipes; '1 in 100 runs past' is genuine and
check-figures misses it because its vocabulary has rounds? and not runs; only
THROUGH_TRAIN's 'Measured over 300 runs' is a false positive, and there the
cells are whole sentences and the bold wraps a clause.

So nine, and the shape matters more than the number: each vocabulary has a real
gap the other covers, which argues for the union of both word lists.

Refuses one recommendation. Dropping runs? from the header vocabulary would
also drop the p99 column, whose cells cite fight-tail cut.p99 and column.p99
and which R-269 added because the median is not a plan. That is the R-299
failure again — a guard narrowing itself until the figure it exists to watch
falls outside. The real exclusion wanted is 'a column whose cells are sentences
rather than values', which is testable; subtracting a word cannot tell the two
cases apart.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:16:27 +01:00
slaguru666andClaude Opus 5 ae72953a9d docs: R-304 — bold means two different things, and that decides the merge
Recomputed the peer's bolding scan rather than quoting it. Eight measurement
columns are inconsistently bolded, and that count is robust; the RATE is not —
44% under check-figures' vocabulary, 57% under check-unmarked's, because the
two do not define 'measurement column' the same way. Anybody quoting a
percentage has to say whose vocabulary produced it.

The cause is not carelessness but a second convention: in prose the corpus
bolds what it publishes, in a table it bolds the rows it wants read. The two
bolded rows of the mixed-force table are exactly the two the prose below it
singles out.

That divides the merge on evidence — prose takes bold-as-published, tables take
column-inherits-header with bold ignored entirely as a signal — and explains
the asymmetry R-303 found from both sides as one cause with two symptoms.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:13:04 +01:00
slaguru666andClaude Opus 5 5e3635ffed docs: R-303 — the two guards are disjoint in both directions
R-302 showed check-unmarked catching what check-figures misses. I had taken
that, plus a preference for structure over vocabulary, as grounds for folding
check-figures in as a secondary pass. The converse test contradicts it: five
unbolded cells in a measurement column, markers stripped, fail check-figures
and pass check-unmarked, whose strict class requires bold by design.

So the relationship is symmetric. The shapes are the weak half and should fold
in behind the structural classes; the column-header rule is not a shape and
belongs beside bold-as-published, not under it.

Also records what a merged guard must face rather than inherit: this corpus
bolds inconsistently inside tables, which is invisible to a reader and
load-bearing for a class keyed on boldness.

Both runs in throwaway worktrees, never the shared tree. No merge performed;
the decision sits with the humans.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:11:11 +01:00
slaguru666andClaude Opus 5 e2a474b246 docs: R-302 — correcting R-300, the pathspec was not the fault
R-300 blamed `git add -A` for eead663 carrying my uncommitted edits.
check-figures' author checked and it was not that: they staged two exact
paths. The tree agrees — eead663 holds CLEAN_GROUND.md and CLEAN_GROUND_ART.md
only, while my modified step5-split.mjs and untracked check-unmarked.mjs are
absent, both of which `git add -A` would have taken.

`git add <file>` takes the whole file including another session's edits to it,
so a pathspec stops you sweeping files you did not touch and does nothing about
the one you did. Their pre-commit `npm run check` passed because my uncommitted
module was in the shared tree: the commit was broken, the working copy was not.

I asserted a mechanism I never looked at, in an entry whose technical finding
was correct. The correction came from the session it accused.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:09:05 +01:00
slaguru666andClaude Opus 5 e8faac73db docs: R-301 — the narrow repair to R-299, and what R-300 got right
A cell inherits the measurement status of its column: a different mechanism
from the shapes rather than more of them, because the document says what the
column is and the vocabulary has to guess how somebody will phrase a figure.

Records the two bugs in the repair, and why the first matters more than the
blind spot it fixed: scanning raw cell text reported ~130 correctly-cited rows
as unheld, and a guard that calls the good material broken teaches its reader
to stop reading the output.

Leaves the merge question open on purpose. Two readers that disagree are how
three of this session's defects were found.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:05:09 +01:00
slaguru666andClaude Opus 5 e9f7d458f0 check-figures: a cell inherits its column's header
R-300 was right, and it was right with a live defect rather than an argument:
a bare **24** in a table whose own header row says "Median rounds", reported
OK by this guard, against a baseline holding 25. The scan read one line at a
time, so measurement status living two lines above was invisible.

Fixed by reading the header. A cell now inherits the measurement status of its
column — which is a claim the DOCUMENT makes, rather than one this file's
vocabulary has to anticipate. That is the narrow repair, and it is deliberately
a different mechanism from the shapes: the shapes guess at phrasing, the header
does not have to.

The general point in R-300 still stands and the file now says so where the
shapes are defined: a vocabulary learned from the marked figures cannot contain
the phrasing of the figure nobody marked. check-unmarked attacks that from the
other end, treating bold as the corpus's own mark of a published figure.

Two bugs found while testing, both mine, both caught before commit:

- A citation marker is full of digits and none of them are figures. "packs
  line.hollow6.hurt" holds a 6; "fight-tail cut.over15" holds a 15. Scanning
  raw cell text reported roughly 130 correctly-cited rows as unheld — the
  best-marked tables in the corpus. Comments are now blanked rather than
  removed, so every offset still points at the right character.
- "3.48 of 6" — the 6 is the party size the mean is out of, not a measurement.

Coverage goes from 25 figures, 7 marked, to 120 figures, 102 marked.

Proved again by breaking it, five ways, every restore byte-identical: the
historical bare **24** fails at its own line, a stripped prose marker fails, a
planted "median 24 rounds" fails, a new bare figure in an uncited document
trips the ratchet, and neither a threshold column header nor any of the 102
cited cells fires.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:04:45 +01:00
slaguru666andClaude Opus 5 960fb6be27 check-unmarked: the figures a vocabulary cannot name, and a repair to HEAD
eead663 committed a document citing `step5 unsettledFactor` while the module
that would export it was still uncommitted in another session's working tree,
so `check-cited` fails on a fresh checkout of HEAD. step5-split.mjs is included
here to repair that; the key derives Act Four's 1.29 from the raw proportions,
which is the figure R-294 exists about.

check-figures (R-299) reports OK on the "24" it was written to catch. Its own
entry names why: the eight shapes were read off figures that are already cited,
so the vocabulary is learned from the marked figures and cannot contain the
phrasing of the one nobody marked. Line 1272 is a table cell whose measurement
status lives in the header two rows above it, and figuresIn reads one line.

check-unmarked reads structure instead of vocabulary: a bold percentage or
decimal in an opted-in document, and a bold number in a table whose header row
names a measurement. Twelve unmarked figures in CLEAN GROUND; eleven correct
and unheld, one the stale 24 that line 1142 had been citing correctly as 25 for
130 lines. Waivers carry a reason, an empty one is fatal, and every waiver
prints on a green build.

Two guards now cover one question, which is one too many. The right end state
is the structural classes folded in beside check-figures' SHAPES, keeping its
opt-in rule and ratchet. That fold is offered to its author rather than taken.

Twelve string tests on unmarkedIn (88 -> 100), both halves mutation-checked.
Twenty-two guards green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:56:38 +01:00
slaguru666andClaude Opus 5 eead6633c8 CLEAN GROUND v0.24 — artwork prompt sheet, and an art claim that was too wide
The Casting section said "Portraits already exist in art/portraits for all
six. No new art needed." The first sentence is true and verified on disk. The
second was only ever true of the cast, and sitting at the foot of Casting it
read as a statement about the scenario. It is not: the six named NPCs have no
portraits, there is no map, and there are no scene plates at all — while
LAST_ADMISSION has 8, OPEN_DAY 10 and THROUGH_TRAIN 13. Not one cg_* asset
exists anywhere in art/.

Nothing in "Still to do" mentioned it either; that list held only a human run
and a slot, both resolved.

So: the claim is scoped to the cast and points at the gap, the gap is on the
outstanding list where a reader looks, and CLEAN_GROUND_ART.md now carries the
prompts — 6 NPC portraits and 11 scene plates, 17 ids, none colliding with a
file already on disk.

Art direction follows the house pattern (base style plus one scenario line).
THROUGH TRAIN draws the present day in an 1881 hand; CLEAN GROUND draws
everything as a sheet from the 1962 file — including the far side, because the
valley is not a place, it is a filed document nobody cancelled. Same paper,
same margin, same grain on both sides of the seam.

The notes carry the rules that matter: the six at the back are never singled
out in the column plate (the text says do not linger on them, and a plate that
picks them out gives away Act Three in Act Two), nobody in the column is lit as
a victim, nothing glows, the understudy is never drawn as a monster, and the
grey is not snow.

Creatures stay in BESTIARY_ART.md; the handout pack is done and its almanac
pages must not be illustrated, since their trick is that the two sheets are
identical and check-handouts holds that.

21 guards green; the sheet classifies as a record, not a playable scenario.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:54:14 +01:00
slaguru666andClaude Opus 5 9897d55b67 docs: R-299 — check-figures, the twenty-first guard
Records the blind spot (check-cited can only resolve markers that exist), why
the net is narrow (an earlier draft found 282 candidates, nearly all prose),
the opt-in rule and ratchet, and the two things it found before being wired in
— 74.9% printed bare twice, and 'the longest fight is 120 rounds' where 120 is
the exact field check-cited refuses to let anybody cite.

Two rules each right, and together a hole: refusing the citation while the
document printed the number left the least stable figure in the suite as the
only one nothing held.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:45:13 +01:00
slaguru666andClaude Opus 5 91a104e682 check-figures: the twenty-first guard — figures with nothing holding them
check-cited resolves every citation marker against the artifact it names, and
has one structural blind spot: it can only resolve the markers that exist. A
measured figure written into prose with no marker beside it is not a failed
citation, it is not a citation at all, and nothing looks at it again.

Desk pass 11 proved it. "A median 24 rounds" sat in the Pacing Note and "24 if
the column joins" in EXPOSURE, against a baseline holding 21 at two of the
column joining and 25 at three, through every pass that checked citations.

This reads the figures instead of the markers. Narrow by design: an earlier
draft matched any number within 45 characters of a measurement word and found
282 candidates, nearly all prose ("down 140 steps", "an engineer on his
rounds", "01:06"). The shapes here are the phrasings the documents actually use
when quoting the simulator, each read off a figure that is cited somewhere.

Opt-in rule: a document that uses citations must mark every measurement figure.
One that cites nothing is held by a ratchet instead — turning three unguarded
scenarios red is how a guard gets switched off on the day it is written — and
joins the strict regime the moment it gains its first marker.

It found three things in CLEAN GROUND before it was wired in:

- 74.9% printed bare twice while cited correctly four times, and that is the
  figure that was published at 58.7% until the truncated sweep was found.
- "the longest fight is 120 rounds" — 120 is exactly packs cut.hollow6.longest,
  the field check-cited REFUSES to let anybody cite because a sample maximum
  moves by a third on a re-seed. Refusing the citation while printing the number
  left the least stable figure in the suite as the only one nothing held. The
  sentence now leans on the guarantee that is actually strong: check-packs
  refuses to record a sweep in which anything reached the cap.

Proved by breaking it, four ways, with byte-identical restores: a stripped
marker fails, a planted "median 24 rounds" fails at its own line, a new bare
figure in an uncited document trips the ratchet, and a threshold column header
("Past 15 rounds") does not fire — that last one was a real false positive in
the first draft, which tested the matched text rather than its context.

v0.23. 21 guards.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:44:47 +01:00
slaguru666andClaude Opus 5 a1f9e0dca2 docs: R-298 — desk pass 11, v0.22, and the cross-session error
Six findings applied. The one worth reading: two blocks two hundred lines
apart specified two different fights for the same trigger, both mine, and the
mild one predates the measurement.

Records the stale 'median 24 rounds' that no guard could see because it
carried no citation marker, and the fifth instance of a reader unable to see
its own format.

And the cross-session half: I re-derived b5's 4.90% exactly and shipped it
with their false premise attached. The arithmetic was never the part that
could be wrong. Sharper than that — the scenario has no Transposition beat at
all, so it was a right number with no question attached and the premise
arrived to give it one. The house mission structure does make the return a
Transposition roll, which is why the instinct was persuasive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:35:19 +01:00
slaguru666andClaude Opus 5 3af4c55f12 docs: playtest 11 — record what changed on the way into v0.22
Fix 5 as written said a fight costs the northern seam, the depot and telling
Ivy. The Pacing Note names telling Ivy among the three things never to cut,
so the applied version says two go and the third is compressed or moves to
the stump. Written from memory of the act rather than from the Pacing Note.

And applying it found a stale figure no guard could see: 'median 24 rounds'
in two places, where the baseline says 21 at two of the column joining and 25
at three. It survived because it carried no citation marker, and check-cited
can only resolve markers that exist. Fifth reader caught unable to see its
own format.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:34:46 +01:00
slaguru666andClaude Opus 5 65ae156477 CLEAN GROUND v0.22 — pass 11's six fixes
1. EXPOSURE's "what to do instead of a fight" said "use three". That predates
   the measurement and described a fight the party never has: three of the
   column alone is five rounds and 0.1% wiped, where the trigger's real force
   is a median 21 rounds and 0.97 deaths. It now points at the mixed-force
   table instead of carrying its own number, and keeps the good half of the
   sentence.
2. New "The valley at dawn" block: the count moves. H03a says forty-one and
   the players are holding it. Do not correct the handout — Ivy counts every
   morning, so tomorrow she writes a smaller number and the sheet becomes a
   record of what they did. The Close's arithmetic moves with it.
3. Ivy is ruled out of the target pool, explicitly, where the GM decides how
   many of the column join in. She walked toward the guns, which puts her in
   front of the column rather than in it, and the Close is hers.
4. A dead PC now has an answer where only a taken PC did: Registry sends the
   next name on the sixteen-name duty roster, through the seam inside the
   hour, knowing nothing — which buys the table a recap.
5. Act Three names what a fight costs rather than only that it costs: the
   northern seam and the depot go, and telling Ivy cannot (the Pacing Note
   lists it among the three never to cut), so it is compressed or it happens
   at the stump, which the Close already branches on.
6. The anchor block assumed cooperation in every line. It now answers the
   party that shoots: they are never stranded, because the crossing will not
   close on its own — they walk home with nobody holding the door and come
   back thin.

Also corrected two stale uncited figures found while applying fix 5: "median
24 rounds" at the Pacing Note and "24 if the column joins" in EXPOSURE. The
baseline says 21 at two joining and 25 at three; 24 is neither, and had no
citation marker to resolve. Both now read 21 and cite packs.line.hollow6col2.

And two stale STATUS counts: "seven desk passes" listed ten, and "three
post-passes" where there are nine. Counted rather than incremented.

20 guards green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:34:07 +01:00
slaguru666andClaude Opus 5 78e92a2dc8 docs: playtest 11 post-pass — the 4.90% answers a question the scenario never asks
No [CUS: Transposition - ...] beat exists anywhere in CLEAN GROUND. The house
mission structure requires a Transposition roll per agent on the return
(tools/mission.mjs:343), which is where the instinct came from, but this
scenario's crossing is a standing open door rather than an aimed one. The 63
appears at 1011 and 1479 and both are characterisation, never a roll.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:27:56 +01:00
slaguru666andClaude Opus 5 a8f48df50e docs: playtest 11 — correct finding 6's premise
Finding 6 shipped saying that shooting the thing wearing the anchor strands
the party. It does not. Line 136: the crossing is "open since the felling,
widest at dusk, and it will not close on its own", and the "seam closes for
good" at 1356 is the cancellation ending, a deliberate act rather than a
clock. The party can always walk home.

The 4.90% was correct and irrelevant. Session b5 reported the gap with that
number attached to an unchecked premise; I verified the number and inherited
the premise, which is not the same as checking the claim. b5 caught it and
sent the correction unprompted.

The finding is stronger corrected. The answer to "we shoot it" is not that
they are stuck — it is that they walk home through the stump with nobody
holding the door and come back thin, which is one step onto the road that
ends as the thing they just shot. Built from 136, 256-259, 1012 and 1494,
four places that have never been stood next to each other. The man who
would have held that door is the one person who already knew what it cost.

Post-pass added recording how a verified figure lent its credibility to an
unverified sentence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:27:08 +01:00
slaguru666andClaude Opus 5 cd3be7128f docs: desk playtest 11 — the fight the players choose
The last of the original four untested branches, played: a party that opens
fire at the Act Three swap. Seed 7311 for the played fight, 2000 runs at
seed 11 for the distribution around it.

The party survives the fight and the document does not survive the aftermath.
Six findings:

1. Two blocks two hundred lines apart specify two different fights for the
   same trigger. "Use three" is a five-round skirmish that kills nobody
   (0.1% wiped); the mixed force it should name takes 21 rounds and buries
   an agent (8.3% wiped, 0.97 deaths). The mild one predates the measurement.
2. "Forty-one" appears sixteen times and is load-bearing arithmetic. A fight
   moves the count and the handout in the players' hands does not.
3. Ivy is unplaced in the one scene that decides whether the Close happens.
4. A taken PC gets six lines; a dead one gets nothing, at a mean of 0.97 per
   fight in a convention one-shot.
5. A fight in Act Three ends Act Three. Say which three things are lost.
6. The party shooting the thing while it wears the anchor — found by the
   concurrent session, verified here: Transposition 63 is Ashcroft's alone
   and the other five are on the 1% floor, so killing it leaves a 4.90%
   chance anybody opens a door home, and no Close.

Every figure checked against tools/pack-tables-baseline.json rather than
recalled. 20 guards green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:25:27 +01:00
slaguru666andClaude Opus 5 4b491b18cf CLEAN GROUND v0.21 — the anchor is the way home, and the Close has an ending
Applies desk pass 10's five fixes.

1. The accepted-and-taken branch has a consequence now. One session in five
   or six reaches it, and the document had nothing: Ashcroft holds the door
   everyone else goes through, Transposition 63 is his, and the Close cannot
   happen until somebody is back through — three facts printed in three
   places that had never met. The way home now WORKS, and works beautifully,
   because the thing does not need to escape the party, it needs them to
   walk it home and it is carrying the skill that gets them there. It holds
   the door properly because that is what the file says an anchor does. The
   GM is told to play the gratitude: somebody at the table will say thank
   you, and that is the scene.
2. Act Three's "real scene" is written. It was one sentence claiming to be
   the act's centre. Ivy is told or she is not; if she is, she asks how long
   they have known, goes and sits with the line, and does not tell them.
   And the Close now answers it — if she was told she does not come south to
   ask whether there is a north, she comes to ask "Well?", because she is no
   longer asking for the truth, she is asking what they are for. Act Three's
   real scene is load-bearing instead of decorative.
3. The Close has a failure case, which it was the only scene in the document
   to lack. Nobody writes anything and the entry stays filed by default —
   the second ending arrived at by omission, played as an ending. Covers the
   clock, the split table, a dead Ivy, and a party too far down to sign.
4. Four across and then cancel anyway is priced as a third ending rather
   than a failed second one, and Ivy chooses the four, not the agents. She
   picks the youngest and she is not among them.
5. The depot Research has a special: the 1962 cancellation form, blank,
   filed by somebody who expected this to end. It is the paper they sign in
   the Close and it has been waiting sixty-four years.

npm run check: 20 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:16:06 +01:00
slaguru666andClaude Opus 5 2ee44cef79 Desk playtest 10: the Close, and the branch nine passes never reached
Three parts: a census of twelve independent seeds rolled only as far as the
three outstanding branches; a played session on the seed that reached two of
them at once (4417); and a read of the Close, the only act never given a pass.

The census settles the "still untested" list. Ashcroft accepted and was taken
in 3 of 12 — one session in five or six, not rare, and nine passes missing it
was ordinary luck. The swap succeeded twice against an expected five, which is
a mildly cold run at p~0.05 and is recorded as noise: the four consecutive
failures passes 6-9 reported are the same thing from the other end.

1. The branch nobody had reached is the one the document has no answer for.
   Act Four says taking the party's muscle "is a better scene than the anchor
   being it" and then, one bullet later, arranges the anchor being it in 37%
   of games. Ashcroft is not an interchangeable body: he holds the door
   everyone else goes through, Transposition 63 is his, and the Close cannot
   happen until somebody is back through. The document states all three facts
   separately and never puts them together. The only guidance on a taken PC is
   two sentences about the player's evening.
   And it is worse than a gap, because the thing now has a reason to
   cooperate: an understudy wearing the anchor does not need to escape the
   party, it needs them to walk it home, and it holds the door properly
   because that is what the file says an anchor does. That is the best scene
   in the scenario and it is not written.
2. "Telling Ivy. Or not telling her" is called the act's real scene and is one
   sentence — no read-aloud, no failure case, nothing downstream — in a
   document that gives the fumbled Medicine six lines. And the Close opens
   with Ivy asking whether there is a north, which only works if she was never
   told. Its "works in both branches" covers how the PARTY learned, not
   whether IVY was told.
3. The Close is the only scene in the document with no failure case, and its
   failures are likely: the clock, a split table, a dead Ivy, a downed party.
4. "Four across, then cancel anyway" is a third ending, not a failed second
   one, and choosing the four is the most brutal question the case can ask.
5. A critical Research at the depot, with nothing written above the success —
   the second consecutive pass to land an unwritten special on the first
   honest session after check-outcomes recorded 83.7%.

Five fixes listed, unapplied. npm run check: 20 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:12:43 +01:00
slaguru666andClaude Opus 5 137ab82541 R-297: place the step-5 citation markers — 32 of them, no prose touched
Every figure in CLEAN GROUND's step-5 material now resolves against
tools/step5-split.mjs, which enumerates rather than stores: the countdown rows, the
two-case table and its blend, the Act Four reasoning, the counterfactual pair and
the POW×5 targets.

No prose changed -- stripping every HTML comment from the result diffs
byte-identical against HEAD, which is the check worth having when editing another
session's document.

Proved live: raising Okonkwo's POW to 13 in a worktree makes Braithwaite the lowest
in the room and eleven of the thirty-two markers go red at once, each naming the
path and saying nothing can be re-recorded. The three figures that went bad in this
document were all in prose rather than tables, which is why the prose is marked and
not just the tables.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:37:51 +01:00
slaguru666andClaude Opus 5 7afd5b86cc R-296: the review log entry for the pack tables
The work landed in a5c4378 under the subject "R-294", which was already
taken by the peer session's derived-source resolver. R-295 was taken too,
so renumbering to 295 as I first proposed would have collided with
something already in the log. Read the log before writing rather than
accepting the correction: it runs to R-295, both of those entries are
theirs, and mine is R-296.

The commit subject stays wrong; rewriting a pushed subject to fix a number
is worth less than the entry pointing at it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:36:08 +01:00
slaguru666andClaude Opus 5 47f2df9446 v0.20.1: "nearly quadruples" was wrong by three times, in the last two places
Desk pass 9's first fix, applied. The countdown's unsettled row and the Act
Four paragraph both compared 14.5% against 3.8%, and the 3.8% is the rate
against Ashcroft at his undiminished 85 — a contest that never happens,
because if he refuses the thing reaches for the lowest POW in the room.

Against what a table actually rolls: 11.3% at six players (Okonkwo), 10.0% in
the four-player cut (Braithwaite), 14.5% if he accepted. The factor is 1.29,
not 3.9. Both places now name who the target actually is, and the paragraph
carries the correction inline so the claim cannot be re-derived from the old
framing.

What is NOT wrong, and the text says so: the trade THE OFFER describes is
real and the taken rate genuinely moves 40.7% to 48.7%. One consequence was
overstated, by three times.

Written in v0.15, repeated in v0.16, and survived v0.19.1 correcting the
identical error in the table beside it. Flagged again by the peer session
while mapping citation paths, which is the third time this figure has been
caught by somebody reading it rather than by anything checking it — and the
argument for the derived-source markers now going onto it.

npm run check: 20 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:34:35 +01:00
slaguru666andClaude Opus 5 c2f7249d4d R-295: derive the counterfactual too, and name it hadHeRefused
Matching the step-5 prose against the derived source before placing markers left
five figures unmatched: 21.9, 74.3 and 3.8, twice each. They are the thing against
Ashcroft's undiminished 85 -- the contest that never happens, which Act Four prints
on purpose to price what THE OFFER sold.

Derived now as hadHeRefused, so the counterfactual is held to the rule like
everything else and carries a name that cannot be mistaken for an event. Quoting
those three as odds a GM meets is what went wrong in two sentences and a table.

Markers not placed: CLEAN_GROUND.md is c0's and they are in it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:32:46 +01:00
slaguru666andClaude Opus 5 a5c4378521 R-294: EXPOSURE's tables measured into an artifact, and 58.7% was 74.9%
Desk pass 9 found the scenario's most consequential table held by nothing:
~30 sampled figures, no baseline, catchable only by re-running the exact
command. lethality-baseline.json does not cover them — it measures creatures
SOLO against a frozen four-agent party that is not this cast.

Building the measurer found the figures were also wrong.

simulate.mjs's CLI calls runFight with no options, so every published figure
was measured at the default 40-round ceiling — and runFight does not report
truncation, it scores whoever is standing when the loop stops. Measured at
400:

  line.column6      14.8% -> 15.2%    34/2000 truncated
  line.hollow6col2   7.8% ->  8.3%   129
  line.hollow6col3  28.7% -> 30.1%   264
  cut.hollow6       58.7% -> 74.9%   578   <- 29% of runs never finished

Fourteen points on the single most alarming number in the case, and the one
v0.16 added specifically to warn four-player tables. fight-tail learned this
in R-270 and carries an assertUncensored; EXPOSURE's own tables never got
one. The longest fight at cap 400 is 120 rounds and 400 vs 2000 are
identical, so the cap is comfortable rather than merely sufficient.

tools/pack-tables.mjs measures all 17 configs against the DERIVED cast via
castAndCut, using measure()'s exact discipline — one rng threaded through
every run, not a reseed per run, because reseeding is a different stream and
would not reproduce the published table. It refuses to report or record a
truncated sweep.

tools/check-packs.mjs holds the baseline against the game, so the pair is not
a loop: check-cited holds the prose against the record, this holds the record
against the harness. Hard claims read `now` and never `base`: nothing
truncated, the party equals the declared cast, config floor, and more of the
same creature may not make the party safer. Figures compare exactly, since
the runs are deterministic.

Verified by breaking it: a drifted baseline, CAP lowered to 40, and a removed
config each turn it red, and --update refuses outright rather than recording
a truncated sweep. The removed-config test first passed for a bad reason —
MIN_CONFIGS is a floor and 16 clears it — so a dropped-config check was added
and re-tested on a row in no monotonic chain. All files restored
byte-identical after each probe.

EXPOSURE's three tables and the nine prose figures around them are rebuilt
from the artifact with citation markers; the multi-seed stability claims were
re-measured too (the cut is 74.9/72.7/75.0/73.5 across four seeds, not
58.7/60.5/60.3/59.8). CLEAN GROUND v0.20.

npm run check: 20 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:32:35 +01:00
slaguru666andClaude Opus 5 fb6e2cf321 R-294: check-cited resolves derived figures against the rule, not a stored copy
c0 argued a baseline for the step-5 split would be a cache of the rule and a guard
over it would mostly assert that arithmetic has not changed. Right objection,
wrong conclusion: do not store it. ARTIFACTS now takes a { derive } entry as well
as a file path -- enumerated on this build, nothing stored, and no --update able
to silence a real disagreement between the document and the game.

tools/step5-split.mjs enumerates all 10,000 pairs through opposedContestFor with
its targets derived: 55 and 60 are the lowest POWx5 in the six and in the cut, 42
is applyDifficulty(85, "difficult"). Two different rules produce those three
numbers -- the accepted row is a named exception, not the lowest of anything -- and
a test fails if anyone unifies them. A tie in "the lowest POW in the room" is
fatal rather than silently resolved; it fired for real in testing.

Proved four ways, including raising Okonkwo's POW to 13: the lowest moves to
Braithwaite, refused.held goes 48.1 to 52.4, and the citation that was correct a
moment earlier fails. The figure follows the rule.

Landed unused -- the markers are c0's to place in their own file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:25:49 +01:00
slaguru666andClaude Opus 5 90cb251358 Pass 9 post-pass: the uncited surface counted, and it is not where I said
Fix 2 asked for the audit; here it is, and it reorders the fix list.

101 percentages in CLEAN_GROUND.md, 67 of them computed statistics rather
than skill ratings, 14 cited, 53 held by nothing. They split two ways and the
kind finding 1 was about is the safer one: a deterministic figure that drifts
can be caught by anyone who re-derives it in a second.

The exposed surface is EXPOSURE's two pack tables and the 58.7% four-player
figure — 2000-run samples against the declared cast, catchable only by
re-running the exact command, and behind no artifact at all. I had assumed
lethality-baseline.json covered them. It does not: it measures each creature
SOLO against the frozen party holloway/okonkwo/nkemdirim/ferriby, a different
four agents, storing {wipe, down, rounds}. The document's tables read "of 6"
and fight packs of three, six and ten. None of 3.48, 4.79, 5.97, 0.42, 3.03
or 58.7 appears in any baseline in tools/.

Recorded as a decision: derived figures want to resolve against the rule at
check time, since a stored baseline for them is a cache of arithmetic;
sampled figures want a baseline, since re-running them is expensive and
noisy. Same problem, different mechanisms.

Census and the baseline's shape counted here rather than taken from the peer
session that raised the gap.

npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:18:01 +01:00
slaguru666andClaude Opus 5 15c2e93b5f Desk playtest 9: the regression pass
An audit, not a session. Five versions of fixes went in today, all by one
author, and the last three passes each found a defect introduced by the fix
for the previous one. Every fix from passes 4-8 re-checked against the
document: did it land, is it still true, did it break a neighbour.

1. "THE OFFER nearly quadruples the unsettled rate" is false as a statement
   about play. It compares 14.5% against 3.8%, and the 3.8% is the same
   counterfactual v0.19.1 removed from the table one commit ago: Ashcroft at
   his full 85 is never a target, because if he refuses the countdown reaches
   for Okonkwo. The real comparison is 14.5% against 11.3% at six players and
   10.0% in the cut — a factor of 1.29, not 3.9. Printed in two places, both
   of which v0.19.1 walked past while correcting the identical error beside
   them. The trade the document describes is real and the taken rate really
   does move 40.7% -> 48.7%; only the size of that one consequence is wrong.
2. All 27 fixes from passes 4-8 are present, which is not the reassurance it
   sounds like. Nothing has gone missing; three of the four defects the last
   three passes found were created or preserved BY a fix, and a presence
   check cannot see any of them. What would have caught finding 1 is the
   thing check-cited does for figures backed by an artifact — and the 3.8% is
   enumerated from the rule, so nothing holds it. Every uncited number in the
   document is a number nothing is holding.
3. The understudy carries a dagger (1d4+2) and has no knife skill, so it
   swings at the 1% floor and the harness correctly picks its punch — every
   EXPOSURE figure is right. But EXPOSURE's load-bearing first lesson says
   flatly "it is a 1d3 punch", and a GM who reads the sheet sees a knife and
   one combat skill. Measured both ways: arming the knife at brawl 60 moves
   0.55 hurt to 0.73 and 0.00 deaths to 0.01, still 0.0% wiped, still two
   rounds. The thesis survives; it is a documentation gap and is reported at
   that size. content.mjs restored byte-identical after the test.

Confirmation session, seed 2260: step 5 landed on "they hold" — the branch
v0.19 wrote one commit ago — in the very next session, and by the route that
makes the case for it, both sides succeeding with the tie going to the person
being acted upon. Ashcroft refused a fourth time (63%, a 16% run) and the
swap failed a fourth time (roughly a coin flip, so 1 in 16); both recorded so
neither is read as a pattern.

Four fixes listed, unapplied. npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:14:20 +01:00
slaguru666andClaude Opus 5 d68e394fa4 v0.19.1: the 74.3% is a counterfactual, not an event
Desk pass 8's finding 1 listed four targets for countdown step 5 and one of
them cannot happen. If Ashcroft REFUSES THE OFFER the thing does not reach
for him — it reaches for the lowest POW in the room, which is Okonkwo. The
21.9% / 74.3% pair lives in Act Four to price what accepting sold: what it
would cost him if it tried. No table ever rolls it.

v0.19 carried that straight into the new table under a heading reading "It
reaches for", which is the one place it is unambiguously wrong. Rebuilt
around the two cases that actually occur, with the split Act Two decides:

  Ashcroft refused  63% of games  -> Okonkwo 55   taken 40.7  hold 48.1  uns 11.3
  Ashcroft accepted 37%           -> Ashcroft 42  taken 48.7  hold 36.8  uns 14.5
  across all games                               taken 43.6  hold 43.9  uns 12.5

63/37 is the Insight 63 itself: he refuses on anything that is not a failure
or a fumble. The warning is now inline in the table rather than left for the
reader to derive.

The finding is unharmed and the fix was right — the held outcome is still the
likeliest single result and was still unwritten. What was wrong was framing
74.3% as a number a GM meets.

It propagated before it was caught: the peer session read pass 8 and replied
that 74.3% "is the number a GM meets, not the 48.1%", repeating the error out
of my own fix list. That is what a wrong number in a fix list does, and it is
the argument for correcting the record rather than only the scenario. Pass 8's
fix list is amended and carries a post-pass.

npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:08:26 +01:00
slaguru666andClaude Opus 5 daf77f4aac R-293: a desk playtest is a record, not a scenario with rolls in it
Counting the readers that had broken on their own format turned up one nothing had
caught. docs/scenarios holds scenarios, eight playtest records and two art prompt
sheets, and every guard treated all three as scenarios -- harmless for citations
and skill spellings, false for reachability. Six quotations across passes 4, 6 and
7 were checked as live rolls, so a record of a session already played could fail
the build over a skill nobody can reach. Planting Science (Physics) in pass 4 fails
before the split and passes after; the same skill in CLEAN_GROUND still fails.

Classified by the document's own H1, not its filename, because tools/scenario-*
naming is what swept a tools file into this corpus in R-268. An unclassified
document is fatal: an allowlist that silently drops what it does not recognise
would take a new scenario out of reachability checking on the day it was written.

89 rolls across 18 files becomes 83 across 8.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:05:03 +01:00
slaguru666andClaude Opus 5 6171d1e9b9 CLEAN GROUND v0.19 — the outcome where somebody holds
Applies desk pass 8's five fixes, and adopts R-292's TAG_OPEN.

1. Step 5 now has all three of its outcomes. opposedContestFor returns taken,
   held and unsettled; the document printed the first and the third. "They
   hold" is 48.1% against the default target, 52.4% against Braithwaite and
   74.3% against an Ashcroft who refused — which v0.17 established is what
   most tables have, so the middle column is the one they will play. It gets
   its own countdown row, its own table, and read-aloud of its own, and the
   COMES TO NOTHING paragraph is now explicitly the unsettled case so it can
   stop being the nearest text to an outcome it is not about. The reason
   they held is the case's own argument arriving as good news: a person with
   a life on the record is a difficult document to overwrite. Every figure
   re-enumerated over all 10,000 roll pairs before writing.
2. EXPOSURE's five things are six, in order, under a heading that says six.
   Introduced in my own v0.16 and survived two versions; asserting a unique
   match protects against editing the wrong text and not against inserting in
   the wrong place.
3. EXPOSURE opens with a one-minute box. The body is untouched — nothing in
   it is padding — but 3,176 words is sixteen minutes about the encounter the
   document exists to prevent, and a GM with thirty minutes of prep now has
   somewhere to stop.
4. The stale open question is closed. Braithwaite has not been on the
   critical path since v0.14 un-gated the tell, and pass 6 ran the act with
   the Xenology and the Psychology both failed.
5. Act Four's Psychology has a special: which file it thinks it is, and how
   recently it read it. It corrects them on Prichard's service history — it
   is not remembering, it is citing.

Coverage 6 -> 7 specials, so the cited figure moved 85% -> 83.7% and
check-cited caught the prose before I did, which is what it is for.

R-292 adopted: outcome-coverage now composes its body onto check-scenarios'
TAG_OPEN through tagRe, so the two readers cannot drift on what starts a tag
while keeping the different bodies they need — and tagRe's fresh matcher per
call avoids the shared-lastIndex defect, this file being the second caller
that would have found it. Verified identical across all seven spellings.

npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:04:32 +01:00
slaguru666andClaude Opus 5 df38be794b Desk playtest 8: the cold read, and the outcome nobody wrote
Two halves: the document taken as a GM meeting it thirty minutes before a
slot, measured rather than impressioned; and an honest session, six players,
seed 5108, nothing forced. Three versions of fixes had landed since anything
was played, every one written by somebody who already knew the document.

1. The climactic roll has three outcomes and the document describes two.
   opposedContestFor returns taken, resisted outright, and unsettled. The
   taken and unsettled figures are printed and both reproduce exactly, so the
   source has always been right. Resisted outright appears nowhere — 48.1%
   against the default target, 74.3% against an Ashcroft who refused, which
   v0.17 established is what most tables have. It is the single most likely
   result of the scenario's climax. Worse than an omission: the paragraph
   below is headed WHEN STEP 5 COMES TO NOTHING, is entirely about unsettled,
   and carries the beat's only read-aloud — so a GM whose agent simply won
   finds text written for a different outcome. Enumerated over all 10,000
   roll pairs; no seed.
2. EXPOSURE's "five things" are six and run 1, 2, 3, 4, 6, 5. Introduced in
   my own v0.16 (aa3ae24) and survived two versions, five guard additions and
   a peer's sweep. The insertion anchored on the end of item 4's block, which
   sits before item 5 in the file; asserting a unique match protects against
   editing the wrong text and not at all against inserting in the wrong
   place. No guard can see this and none should be built for it — seven
   passes of dice found nothing here because dice never read a heading.
3. EXPOSURE is 3,176 words, 18% of the document, 2.5x the act it sits inside,
   in a scenario whose thesis is that the fight is not the point. Recorded as
   a judgement, not a defect: nothing in it is padding and I wrote the largest
   block of it. But it is sixteen minutes about the encounter the document
   exists to prevent.
4. An open question the fixes already answered — Xenology has not been on the
   critical path since v0.14 un-gated the tell, and pass 6 ran the act with it
   and the Psychology both failed.
5. check-outcomes measured 85% of sessions hitting an unwritten special; the
   next honest session hit one, on Act Four's Psychology. One session is not a
   rate, but the number describes something real.

Working: v0.17's Swinburne special fired and is right. No broken cross-
references; every counted claim but EXPOSURE's checks out. Swap failed a
third time running and Ashcroft refused a third time — both what the numbers
predict, recorded so the next pass reads no streak into them.

Five fixes listed, unapplied. npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:58:32 +01:00
slaguru666andClaude Opus 5 3a31e0c9b0 R-292: share where a tag starts, not what it says
c0 asked whether tagsIn should return indices so beatLikeIn could take spans from
it. No -- that widens this file's signature to serve another, and R-291 already
fails when the two disagree. But detection is not prevention, and there is a third
thing to share.

The two patterns differ in their bodies for good reasons: tagsIn captures the whole
tag for skillsIn to split, outcome-coverage stops at the em-dash because the
outcome follows. What was copied into both files, and what drifted, is the opening
-- the literal \[CUS:, widened by R-290 here and left behind there. TAG_OPEN is now
exported as a string with tagRe(body) composing a fresh matcher onto it; fresh
because a shared /g regex carries lastIndex between callers.

22 tags before and after, c0's body composed onto TAG_OPEN gives the same 22 its
own pattern does, 19 guards green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:55:02 +01:00
slaguru666andClaude Opus 5 8a051f7f2b R-291 follow-up: one tag pattern, so the two readers cannot disagree
R-291 measured check-scenarios' tagsIn against this file's readers and found
them apart on three spellings. tagsIn was widened for case and spacing around
the colon; outcome-coverage's strict half still carried the case-sensitive
literal, so `[cus: Spot — x]` was READ by one guard and reported unparseable
by the other. The build failed, which is the safe direction, but it failed
saying the tag could not be read while another guard had just read it.

beatsIn and beatLikeIn now share one TAG pattern, widened to agree with
tagsIn. Measured across seven spellings: the five both strict readers accept
now agree in all three, and `[CUS Spot]` and `[CUS= Spot]` are still refused
by both and still named by the loose counter, so the canary keeps its teeth.

Verified on the real document that this is a spelling fix and nothing else —
beats 21, quoted 1, unparsed 0, stated 18/6/6, session figures unchanged, so
the baseline is untouched. A lowercase tag planted in the acts is now read by
check-outcomes, check-scenarios and check-rollable alike; the file was
restored byte-identical after the test. R-291's own assertion still passes.

Found by the peer session measuring my file rather than trusting it, which is
the fourth reader this session to be caught describing or reading its own
format wrongly.

npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:52:11 +01:00
slaguru666andClaude Opus 5 ed851b76e3 R-291: assert that a tag one reader accepts stays visible to the other
c0 asked whether R-290's widening of tagsIn reaches past outcome-coverage's loose
counter, which would zero its unparsed count for the wrong reason and retire a
canary. It does not -- 22 beats from each reader on CLEAN_GROUND.md, nothing that
tagsIn accepts invisible to the other guard -- but "does not today" decays quietly,
so it is now a test importing both real functions rather than a copy of either
pattern. Mutation-checked: widening tagsIn to accept [CUS Spot] turns it red.

Measuring it found something the question did not ask about, recorded in the log:
for [cus: ...], [CUS : ...] and [ CUS: ...] the two guards disagree -- tagsIn reads
the tag, beatLikeIn calls it unparseable -- because beatsIn's strict half kept the
case-sensitive literal. The build stops, which is the safe direction, but names the
wrong thing. outcome-coverage.mjs is c0's file and the call is theirs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:50:05 +01:00
slaguru666andClaude Opus 5 ae8179bd9b R-290: the same spelling gap in tagsIn and the POWER marker
Swept every reader that parses a human-written marker. Two more had R-289's
fail-open.

tagsIn matched a literal [CUS:, so [cus: Spot], [Cus: Spot], [CUS : Spot] and
[ CUS: Spot] all read as nothing -- and it is the corpus reader behind
check-scenarios' skill validation and check-rollable's reachability, so a beat
spelled any of those four ways was checked by neither while both printed OK. The
corpus contains no such tag today; the 88-to-89 roll count during this work was c0
writing v0.18, verified against HEAD's reader on the same tree.

The POWER: marker had it with nothing covering it. bestiary.mjs and check-powers'
own scan both used the literal, so a creature added with "Power:" generates no
entry line and is never reported unclassified -- check-powers passes green on it,
measured on a clone with its dodge skills stripped so the dodger-count assertion
could not fire instead. Reader now takes POWER\s*: and stays uppercase, because
power: occurs in ordinary prose; an asymmetric counter names the rest, and was
measured against content.mjs first (41 strict, zero loose outside them).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:47:35 +01:00
slaguru666andClaude Opus 5 9c2ce9d905 R-290: check-outcomes — a beat that names a roll must say what it does
Desk pass 7's finding, turned into the nineteenth guard. check-rollable asks
whether a skill is reachable at 25% by the declared cast; pass 5 found that
is rollability, not competence; pass 7 found it is also not coverage. A beat
could be reachable, well-rated and silent about every band but the one the GM
improvises, and the whole suite stayed green.

tools/outcome-coverage.mjs measures. Beats are located structurally — the
bullet that owns the tag and its children, ending at the next bullet of the
same or shallower indent or the next heading, because R-287 is what an
unbounded scope does. Band widths are counted by grading all 100 results
through gradeRoll, never by arithmetic on fumbleStart, which is off by one
and was written wrongly twice this session before being caught. Ratings come
from the declared cast via R-286's reader, best-in-cast per skill, because
that is the die a table actually rolls.

tools/check-outcomes.mjs holds it, in two kinds:

  RATCHET — stated failure/fumble/special counts may improve and may not
  regress; unwritten-band exposure may fall and may not rise. --update
  re-records these, because freezing them would make every improvement fail.

  HARD CLAIMS — read from what is measured NOW, never from the baseline, so
  --update cannot silence them: a floor of 18 beats (check-cited once passed
  with zero citations), no beat bare of every band, every scope structurally
  bounded and none over 5% of the file, no unparseable tag, no beat naming a
  skill the cast has no rating for.

Verified by breaking it: a stripped beat, a broken tag regex, an unparseable
tag and a removed failure case each turn it red; the file and baseline were
restored byte-identical after each; and --update with a bare beat present
re-records the baseline and still fails.

Two bare beats found and filled while building it — the six at the back, and
the Insight that is deliberately indistinguishable on a success and a miss,
which now says so rather than saying nothing. Coverage 16/21 failure, 5
fumble, 4 special at the start; 18/21, 6 and 6 now.

The three figures are cited against the artifact rather than typed, which was
the peer session's condition and the right one: pass 7 hand-counted 22 beats
where there are 21 (Act Three's warning QUOTES a beat, and a hand count reads
the quotation as one — R-286 in the other direction), and its other three
counts were stale within one commit.

Its first catch was its author: the STATUS line announcing this guard
contained a beat-shaped tag and was counted as a beat. The reader was not
changed — prose shaped like a beat is what this file is for — and the error
message now names the fenced block as the place to write an example. Minutes
later check-cited refused a citation-shaped comment in the post-pass about
citations. Three readers, three authors describing their own format inside
it, each caught by a guard built for a different pass.

CLEAN GROUND v0.18. npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:47:25 +01:00
slaguru666andClaude Opus 5 2cf9721fa3 R-289: test the cast reader on strings, and fix the spelling that found
Both earlier cast defects were shown by editing CLEAN_GROUND.md in the shared tree,
which is how this session came within a git checkout of c0's uncommitted work and
is also the weaker test. Seven cases now live in check-behaviour as strings.

Writing them found a live one: "<!-- cast : ... -->", one space before the colon,
matched nothing -- not an empty declaration R-288 would refuse but no declaration
at all, so check-rollable widened to the whole duty roster and printed its usual OK
line. check-cited's three spellings again. The reader now takes cast\s*:.

castLikeIn adds the asymmetric half: anything comment-shaped containing cast\w* the
reader did not consume is named by check-rollable, so a spelling nobody anticipated
fails the build instead of silently declaring nobody. Looser than the reader on
purpose -- a false alarm costs a reword, the opposite error costs a guard that
checks the wrong six people and says OK.

Tests then mutation-checked for being load-bearing, each mutation asserted to have
applied after a first pass where three silently did not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:41:19 +01:00
slaguru666andClaude Opus 5 e3d222cacf R-288: an empty cast declaration is fatal; a missing one still falls back
c0's point on R-286: the reader is unambiguous now, but the roster fallback that
made the failure look like success is still reachable. Narrowly closed -- sixteen
of the seventeen scenarios declare no cast and are rightly checked against the
whole roster, so only a marker that is PRESENT and names nobody is refused, with
its line named. Replacing the declaration with <!-- cast: --> passes before this
change and fails after it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:31:41 +01:00
slaguru666andClaude Opus 5 f3caaab04d R-287: assert the scope anchors in check-behaviour, and end them structurally
indexOf returns -1 for a name that is gone and slice(0, -1) is everything but one
character, so a scope anchored on a moved name does not shrink or fail -- it
becomes the file. Renaming the end anchor took one test's body from 3,184
characters to 30,825 with the assertion still passing. The other site windowed
burstAttack at 4,000 characters over a function that runs 4,305.

bodyOf asserts the anchor and ends at the next top-level function. A missing anchor
now says which anchor and what would have happened, where the old code reported
"burstAttack still calls rollWeaponDamage" -- a claim about a call when the truth
was a claim about a name.

Also records the rest of the sweep, including the guards deliberately left alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:30:36 +01:00
slaguru666andClaude Opus 5 0453255ecc R-286: one cast declaration, and a mention of one is not a declaration
CLEAN_GROUND.md contains two things matching <!-- cast: ... -->: the real
declaration, and the warning ten lines below it that quotes the marker inside
backticks and matches with an empty capture. check-rollable and declared-cast both
took .match(), first hit wins, so the arrangement has been correct only because the
declaration comes first.

Move that warning above the list and check-rollable reads a cast of nobody, falls
back to ROSTER_BEST, and prints the same OK line having held every skill in the
document to the full duty roster instead of the declared six. Instrumented and read
off: "the duty roster" against "its declared cast of 6".

castMarkersIn blanks code spans and fenced blocks before scanning (padded, so line
numbers still point at the source) and refuses more than one surviving marker,
naming every line. check-rollable imports it instead of carrying a second regex, so
the guard that checks the cast and the guards that measure the fight cannot
disagree about who is in it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:30:36 +01:00
slaguru666andClaude Opus 5 ecbad45fc6 CLEAN GROUND v0.17 — the good rolls now buy something
Applies desk pass 7's five fixes. The pass found the document covering two
bands out of five: seventeen failure cases written, four fumbles, three
specials — against 90.8% of sessions containing a special or critical on a
beat that says nothing, and 36.0% containing an unwritten fumble.

1. Specials written where they matter, starting with the two pass 7 rolled.
   A critical Persuade on Swinburne now buys her coming to the stump AND
   talking on the way — the dog went for something on the seam side in June
   and came back wrong, four months earlier than the case otherwise offers
   it. Previously a 1 bought what a plain success buys, which is worse than
   the fumble, and the fumble buys a dog. A special Xenology, a special
   Medicine (how long ago it stopped — the almanac's gap before the almanac)
   and a special Spot (the third set circles and goes back toward the seam)
   likewise. GM ESSENTIALS now states the shape the existing three share:
   portable, private or early, never more conversation.
2. The Act Three swap beat points at EXPOSURE. v0.16 named that beat as the
   trigger for the fight it measured and left the beat silent, with
   "survivable" as the last word before the decision — which is about the
   swap, not about what follows.
3. Every fumble branch prints its band. Three of four did not, and the one
   that did was the one written in v0.16.
4. The fumbled Medicine and fumbled Spot are written. Pass 7 hit both cold
   and lost ten minutes, because four beautifully specific fumble branches
   make their absence elsewhere read as an oversight rather than a licence.
5. Act Four says which branch its headline figures are for. Ashcroft refuses
   about five times in eight — passes 6 and 7 both did — and the 48.7%/14.5%
   pair is printed far more prominently than the 21.9%/3.8% one most tables
   will be in.

Every band printed was re-derived from resolveBands/gradeRoll by enumeration
rather than arithmetic, which is where the off-by-one lives.

Pass 7's finding 3 overstated itself and is corrected in the same commit: the
Close's fumble branch does name a skill, inheriting the Anomaly Lore tag from
the bullet above it. Post-pass appended.

npm run check: 18 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:30:04 +01:00
slaguru666andClaude Opus 5 4ae4e13196 Desk playtest 7: an honest session, and the three bands nobody wrote
Full session, six players, seed 7742, nothing forced. Pass 6 forced its
triggers on purpose; this one takes what the dice give, because a forced pass
proves a branch works and cannot say how often a GM meets one.

It reached neither thing pass 6 asked for — no fight, and Ashcroft refused
THE OFFER again. What it found is what both of those are instances of.

1. The document covers two bands out of five. Seventeen failure cases are
   written across the acts, which is the house rule honoured properly. Four
   beats state a fumble. Three state a special or a critical. Enumerated
   through gradeRoll against the cast's best rating for each of the 22
   rollable beats: 42.1% of sessions contain a fumble and 36.0% contain one
   with no written case; 93.9% contain a special or better and 90.8%
   contain one on a beat that says nothing. Specials are not rare — 13% at
   63, 11% at 53 — and the scenario asks for 22 rolls. This seed landed on
   four uncovered bands in thirteen rolls, three of them GOOD rolls: a
   critical Persuade on Swinburne that buys less than the fumble does, and
   a special Xenology with nothing above the success.
2. v0.16 wrote the trigger into EXPOSURE and never wrote EXPOSURE into the
   trigger. The Act Three swap beat is named in the new mixed-fight block as
   the moment that starts the fight, and it carries no pointer back; its last
   word before the decision is "survivable". Act Two has done this correctly
   for versions. Five locations across 1,100 lines to adjudicate one beat.
3. Three of the four fumble branches do not print their band, and the one
   that does is the one written in v0.16 — the fix landed where it was being
   thought about, not where the same need already existed. The Close's is
   worse: "on a fumble asking the question" names no skill at all.

The v0.16 fumble clause earned itself immediately: 99 against Medicine 53 is
a fumble, and v0.15's wording read it as a plain failure.

Timing: ~3:35 against 3:40 at six players with no cuts taken. First honest
pass to land inside the clock unaided.

Two fumbles in thirteen rolls is a 4.4% event and is recorded as an
illustration, not a rate. Five fixes listed, unapplied. npm run check: 18
guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:25:03 +01:00
slaguru666andClaude Opus 5 67e76639f3 R-285: scope the defence-stacking rules to the section that owns them
R-284 scoped the factored-rating rule to the creature's entry and left the
defence-stacking rules matching anywhere on the page, so the exemption sentence
and the "Across N creatures that spend defences" count were accepted wherever they
happened to sit. Moving the exemption line out of its section into the redcap's
statblock -- the page silent exactly where a GM reads the stripping advice --
passes at R-284 and fails here; confirmed by running HEAD's copy against the same
tree.

The owning slice is not always the creature's entry. A factored rating belongs to
the creature; the ladder exemption is an answer to the paragraph it sits in and is
generated into "## Shooting at something that moves", so scoping that rule to
"### Redcap" would have failed a correct page. sliceOf now takes a heading at any
level and each rule names the slice that owns its claim.

A renamed section fails by name rather than scoping to nothing, which is the shape
of every guard that passes because it found nothing to check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:22:04 +01:00
slaguru666andClaude Opus 5 aa3ae24ef2 CLEAN GROUND v0.16 — the fight it was never measuring, and R-283
Applies desk pass 6's seven fixes.

1. EXPOSURE now measures the fight the table will have. Every row in the old
   table was one force fighting alone, and the six at the back are never
   alone — they walk inside forty-one refugees. Six hollow men wipe 0.0%;
   with two of the column joining, 7.8%; with three, 28.7%. Two is now the
   stated default, because two people out of forty-one losing their heads
   while their neighbours are shot is not a large number.
2. The four-player block has hollow-man rows: 0.3% at three, 58.7% at six,
   99.9% with two of the column. Its only hollow-man figure before was the
   six-player 0.0%, so a GM running the cut was reading somebody else's
   table — for the encounter the party is likeliest to choose, because the
   six at the back are the only figures the scenario says are not people.
   GM ESSENTIALS item 3 carries the same correction.
3. Act Three's warning named a roll that does not exist. Its twenty-minute
   bomb hangs off "Anomaly Lore — what a peg is"; the depot entry is a
   Research roll. Pass 4's post-pass inherited the conflation from this
   warning and is corrected too.
4. GM ESSENTIALS states the real fumble band. fumbleStart is
   101 - ceil((101-band)/20), tested before the 96-99 clause: 00 at 85,
   99-00 at 63, 98-00 at 53, 97-00 at 40. Four times what "00 always
   fumbles" implies, in a case that rolls Spot 40 across two acts. Pass 4's
   correction was right at 63 by luck and would have been wrong at 53.
5. Sixth EXPOSURE lesson: a fight costs the session. Median 13 rounds on the
   printed row, 24 mixed, 30 at four players — sixty to ninety minutes in an
   act budgeted at fifty. The Pacing Note now says what to do when one
   starts, and not to absorb a fight and the peg fumble in the same act.
6. The fumbled Xenology is written. At 53 it fumbles on 98-00 and Braithwaite
   puts his name to a baseline human in front of everybody. The un-gated tell
   still arrives; it now costs the party its expert.
7. R-283: simulate.mjs described a mixed force as N of whichever spec came
   first, so six hollow men and six of the column printed as "12 x Hollow
   man" — two fights 88 points of wipe rate apart under one label. The
   composition was always right and the report was not. Uniform and --spread
   output are byte-identical, so nothing already published goes stale.

Every figure re-run before writing rather than carried over. npm run check:
18 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:16:17 +01:00
slaguru666andClaude Opus 5 1a2ca44c52 R-284: report a wrong figure as a wrong figure, and read the right entry
R-283 left the intact-sentence-wrong-number case falling through to omission, so
the guard said BESTIARY "does not state" a rating the page was stating. reads()
now has a shape tier between strict and loose: the strict pattern with its value
slot loosened, reporting which of the two numbers moved.

Scoped the per-creature rules while adding it. They read the whole page, and each
is the only rule of its kind today, so a page-wide match found the right line by
luck; a second attackFactor creature would have let the courier's rule match that
creature's sentence and report the courier correct. They now read the creature's
own "### Name" entry -- proved by deleting the courier's line and planting an
identical one under the redcap: still omission, where before it would have passed.

Five discriminations plus the decoy, proved in a worktree with the message read.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:15:24 +01:00
slaguru666andClaude Opus 5 327d060eb1 R-283: tell a reworded bestiary sentence apart from a missing one
R-282 matched the page with String.includes, so rewording the exemption sentence
reported "BESTIARY never says it is off the stripping ladder" -- sending a
maintainer after a sentence that is sitting right there, and never naming the
real problem, which is a pattern that has silently stopped reading.

Each textual rule now reads twice. Strict is the sentence as it stands and is
tighter than before (the bold and the full stop, not the bare clause a substring
accepted); loose is the same claim in any wording. Strict passes, loose-only is
reported as a reword with the line quoted and the page presumed right, neither is
the omission.

The loose anchor was wrong on its first pass in the way that matters: "a sentence
with 40% and 80%" also matched the courier's own statblock line, so deleting the
sentence reported a reword and quoted the statblock back. It now excludes that
generated marker, which makes it a test of the claim and not of the digits, and
degrades to omission rather than to a false reword.

Four discriminations proved in a worktree with the message read in each.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:12:33 +01:00
slaguru666andClaude Opus 5 e70d25271f Desk playtest 6: the four branches five passes never reached
A branch pass, not a session pass. Seed 3319. For each untested branch the
roller draws from the stream until the roll lands in the target band; every
roll downstream of it is taken as it falls, and the draw counts are printed.

All four branches work as written. The Swinburne fumble is better than the
drawer, the re-cut peg costs the twenty minutes the text promises, and a
failed Xenology no longer strands Act Four — the v0.14 un-gated tell carried
the act with BOTH gated lines failed, which is the strongest result here.

What the pass actually found is outside the branches:

1. The fight the table produces is not the fight the document measures. The
   six at the back stand inside forty-one refugees. Six hollow men alone wipe
   0.0%; with two of the column joining, 7.8%; with three, 28.7%. Stable
   across four seeds. EXPOSURE measures the two forces separately and never
   says what the column does when somebody fires into it.
2. At four players six hollow men wipe 58.7%, and the only hollow-man figure
   in the document is the six-player 0.0%. EXPOSURE's four-player block —
   which exists to say the cut is a different game — has no hollow-man row.
   The curve from three to six is 0.3% to 58.7%.
3. The Act Three warning names the wrong roll. Its twenty-minute bomb hangs
   off "Anomaly Lore — what a peg is"; the depot entry is a Research roll.
   Pass 4 inherited the same confusion and nobody noticed, because the text
   it was checked against carried the error.
4. GM ESSENTIALS understates every fumble band. "00 always fumbles" reads as
   1%; fumbleStart is 101 - ceil((101-band)/20), tested first, so Spot 40
   fumbles on 97-00. Four times what the summary implies, in a scenario that
   rolls Spot 40 through two acts.
5. EXPOSURE prices fights in bodies and never in minutes. Median 13 rounds
   printed, 24 mixed, 30 at four players.

Also: simulate.mjs labels a mixed force with the first spec's name and the
total count, so 6 hollow men + 6 column prints as "12 x Hollow man". The
composition is right and the header is not; every figure above came out of a
run whose header lied about what was fought.

First run in six passes where Ashcroft refused THE OFFER, and the first where
a player character was taken.

Seven fixes listed, unapplied. npm run check: 18 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:09:48 +01:00
slaguru666andClaude Opus 5 1a80d3637c R-282: guard the bestiary against the powers, including the next one
check-bestiary proves the page matches its generator, and the generator had never
heard of powers.mjs -- so the redcap sat in "the ones that take the most
stripping" under eighteen green guards while its own entry said it never spends a
defence. Two files agreeing with each other while both disagree with the engine
is a quorum, not a check.

check-powers now asserts per effect kind what the page must say: defenceStacking
requires the creature off the stripping list, named as exempt, and the "across N
creatures that spend defences" count reconciled against powers.mjs; attackFactor
requires the rating the simulator actually uses printed as a number, which the
courier's entry now carries.

The clause that matters is the failure on an unknown effect kind -- a wired effect
with no DOCUMENT_RULE fails the build, so the next one cannot arrive without
somebody deciding what the document owes it. Without that this would guard the
mistake already made and nothing else.

Proved three ways in a worktree, exit codes read directly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:01:04 +01:00
slaguru666andClaude Opus 5 8705b00631 CLEAN GROUND v0.15 — the four-player cut, fixed
Applies desk pass 5's five fixes and corrects a claim the pass itself
overstated.

1. The cut cannot see. Pollard's Spot 53 is the best in the declared cast
   (others 40/40/40/35/35) and he is the first agent the scaling notes
   drop. At five players and fewer his clues — the stump, the six at the
   back, the lorry — are given, not rolled for. check-rollable cannot warn
   about this: it tests the 25% floor, not competence.
2. The split table now has a four-player column. Four of its five rows
   named Pollard or Okonkwo, or said "all six".
3. The Pacing Note says the cuts are sized for six. At four, keep the
   northern seam; pass 5 ran 3:15 with every cut taken.
4. The line rests twenty minutes at four players — Ashcroft is aside for
   THE OFFER, so three agents are talking, not five.
5. Act Four records that THE OFFER nearly quadruples the unsettled rate:
   14.5% if Ashcroft accepted against 3.8% if he refused. Accepting makes
   him both the likeliest person to be taken and the likeliest reason the
   beat resolves into nothing.

Verified against roster.mjs rather than recalled, which caught pass 5's own
error: Spot 53 is the best in the CAST, not the roster — four agents carry
58. Post-pass appended. The check also found that Agyeman's 58 makes the
substitution the scaling notes already name the single best answer to the
cut, which is now written in.

npm run check: 18 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:58:14 +01:00
slaguru666andClaude Opus 5 81ff44e70e The bestiary was still describing the fight R-275 changed
Two things in the generated document had gone stale the moment powers reached the
simulator, and eighteen guards were green over both because nothing connects
powers.mjs to bestiary.mjs.

The dodge-ladder section listed Redcap among "the ones that take the most
stripping" and counted it in "across 47 creatures", when NOT TIRED means it never
spends a defence at all -- the exact opposite of what its own entry says three
pages down. It is off the ladder now, the count reads 46 that spend defences, and
the page names it: stripping is not a plan against it, killing it is.

And the paragraph listing what the harness does and does not model never mentioned
that it fights 39 of the 41 creatures with a power without it. It now says so, and
counts from powers.mjs rather than stating it, including the 14 that are fight
rules it cannot express -- so every figure for one of those is the creature with
its best trick taken away.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:55:36 +01:00
slaguru666andClaude Opus 5 97f5cbbcae Desk playtest 5: the four-player cut, played for the first time
Seed 8815, four players — Ashcroft, Bhattacharya, Renshaw, Braithwaite. Every
rating pulled from roster.mjs before rolling, which is the direct consequence
of pass 4 having typed six of sixteen from memory.

The cut is the most measured thing in this project and had never been played.
EXPOSURE prices its fights, check-firstblood holds its swing, check-attackers
holds what each of the four contributes -- and no pass in four had run a
session with Pollard and Okonkwo off the table.

THE RESULT IS NOT ABOUT COMBAT. The fights were never the problem. What breaks
is the party's eyes: POLLARD'S SPOT 53 IS THE HIGHEST IN THE ENTIRE ROSTER AND
HE IS THE FIRST PERSON THE SCALING NOTES DROP. At five players the party's eyes
go from 53 to 40; at four they stay at 40 with a 35 alongside. This run missed
the stump (79 vs 40) and the six at the back (67 vs 35), both Pollard's lane in
the six-player game, both clues the scenario leans on.

check-rollable cannot see this, and the reason is worth keeping: it asks
whether every named skill is reachable at 25% or better, and Spot 40 clears 25
comfortably. It is a rollability check, not a competence check, and the cut is
where the difference bites. The scaling note's only stated cost of dropping
Pollard is that "the cordon loses its shield", which is about a fight, in a
scenario whose first two acts are almost entirely looking at things.

Second finding: FOUR OF THE FIVE PARTY-SPLIT ROWS NAME PEOPLE WHO ARE NOT
THERE. The table is introduced as the fallback for a table that will not choose
its own splits -- and at four players the fallback does not exist, which is
exactly when it is most needed.

Timing runs the other way from pass 4: ~3:15, twenty-five minutes SHORT, because
four people ask fewer questions. Nothing in the Pacing Note says the cuts are
player-count dependent, so a GM following it at a small table finishes early.

The unsettled countdown fired for a second pass running. Recorded with the
caveat that both passes had Ashcroft accept THE OFFER, so both used the
Difficult branch -- 14.5% unsettled against 3.8% if he refuses. Not two draws
from the same distribution, and the document prints only one of those figures.

Five fixes listed, none applied. Also listed: what five passes have still never
tested -- the Swinburne fumble, the re-cut-the-peg fumble, a failed Xenology,
and any fight at all.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:41:39 +01:00
slaguru666andClaude Opus 5 303472f0ab The bestiary said "in doubt" and the rule no longer means that
R-280 widened admission from a [15,85] band to "the spread rate stands clear of
both ends by more than its own noise", which admits fights that are nearly
settled -- the_choir at 99.3%, the_stanchion at 6% -- as long as their noise is
smaller still. The page went on saying "whose outcome was ever in doubt", which
was a fair description of the band and is a loose one of the rule.

It now says "whose odds leave room for a difference to show", and the provenance
line prints the admission rule itself, read from the artifact rather than
paraphrased, so the page cannot drift from the guard again. The rule is phrased
as a clause in check-focus for that reason.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:41:14 +01:00
slaguru666 ae06df8e04 Correct desk pass 4: six of sixteen ratings were typed from memory
Found while setting up pass 5 by pulling the sheets from roster.mjs instead of
recalling them. The d100s are unchanged; only what they were compared against
was wrong, and three outcomes flip:

  Pollard  Spot, the stump        58 -> 53   success becomes fail
  Bhattacharya Anomaly Lore       58 -> 63   FUMBLE becomes plain failure
  Braithwaite Xenology (Baseline) 45 -> 53   fail becomes success

So three things pass 4 reported did not happen. The re-cut-the-peg fumble never
fired -- 98 against 63 is a plain failure, 96-99 never succeed -- which means
the ten-minute chase and the whole of finding 2 rest on a roll the seed did not
produce. Braithwaite's Xenology succeeded, so the scenario's one
single-point-of-failure remains untested after five passes rather than having
'finally come up in play'. And Pollard missed the stump.

Read correctly, the same seed lands near 3:34 -- six minutes UNDER budget
rather than six over.

Findings 1, 3 and 5 are untouched: the special was a real 7, the Swinburne
fumble a real 00, and THE OFFER's staging is not a dice question. Finding 2's
conclusion also survives because it never depended on the roll -- Act Three is
budgeted at 50, the text predicts the fumble costs 20, and nothing connected
that to the cut. The reasoning was right and the evidence was invented, and the
scenario now says so instead of citing a playtest that did not happen.

The Pacing Note's slack claim is withdrawn rather than replaced. One seed read
two ways gave 3:46 and 3:34, and the gap between them is about the size of the
margin being argued over. It now tells a GM the shape -- every scene has
something that ends it, the cuts are real, Act Three is the likeliest overrun --
rather than a number a desk pass cannot produce.

npm run check: 17 guards, exit 0.
2026-09-13 14:39:12 +01:00
slaguru666andClaude Opus 5 fa484071cd R-281: a ratchet, because "helps in all of them" survives the advice decaying
R-280 left the claim satisfiable by a gain of 0.2. The artifact now records how
many measurable packs clear their own noise -- reliable: {aboveNoise: 36, of: 38}
-- and the check refuses if that share falls. It may rise freely.

A ratchet rather than a threshold: any threshold here would be a number I chose,
and choosing one just under the current value is what produced MEASURABLE =
[15,85]. A share rather than a count, so widening admission cannot pay it off.

Proved three ways in worktrees: making focus fire actively bad fires the drift
check first, which is correct; making it unreliable and re-recording fires the
older claim at 37 of 38; and claiming a better past, 38 of 38, is refused by the
ratchet itself. The ratchet bites exactly where the old claim does not -- between
"still helps everywhere" and "helps as reliably as it did", which is where a slow
degradation lives.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:34:10 +01:00
slaguru666andClaude Opus 5 c127184763 CLEAN GROUND v0.14: pass 4's fixes, and one finding corrected in the applying
Five fixes from desk playtest 4. One of them was wrong and the correction is
the more useful half.

1. A SPECIAL ON THE COLUMN PERSUADE NOW BUYS SOMETHING PORTABLE. It bought
   more conversation, which the line's rest clock then took away -- a player
   in pass 4 said "I rolled a 7 and got less time", which is a good roll
   punished by a timing device. It now buys the almanac early, or a name from
   1962, or "the six at the back don't eat". Each travels out of the scene, so
   the line still stands up on schedule and the roll still paid.

2. ACT THREE'S TWENTY-MINUTE BOMB IS NOW BUDGETED -- and this is the finding
   that was wrong. The pass said the re-cut-the-peg fumble had "no duration and
   no ender". It has both, and always did: the text says a table will spend
   twenty minutes on it and to let them try it exactly once. What was missing
   is that ACT THREE IS BUDGETED AT 50 AND THE TEXT PREDICTS 50 + 20, with
   nothing connecting the fumble to the cut that pays for it. Act Three now
   opens with that warning and makes the northern-seam cut compulsory the
   moment the fumble lands. The clause itself is untouched; it was already
   right.

3. A FUMBLED PERSUADE ON SWINBURNE HAS AN ANSWER. She does not produce the
   photocopy -- she produces the dog, walks them to the stump in silence, and
   H01 reaches them later from the coroner, confirming rather than revealing.
   Better staging than the drawer, and the GM should not regret the fumble.

4. THE SLACK CLAIM IS HONEST NOW. The Pacing Note said ten minutes. Pass 4 on
   a hostile seed finished at ~3:46 with one cut unspent: four minutes and a
   cut. Ten is the friendly-seed number and is what a GM would have planned
   against.

5. THE OFFER'S STAGING ACCIDENT IS NOW DELIBERATE. Moving it inside the column
   scene was purely a time saving; the side-effect is that the offer has no
   audience and Ashcroft returns to a conversation that carried on without him.
   Written down so nobody moves it back.

The correction to 2 is recorded in the playtest document as its own lesson: a
reading made while looking for faults finds faults that are not there about as
readily as ones that are. Apply fixes against the source, not against the notes.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:31:20 +01:00
slaguru666andClaude Opus 5 3d83fbde93 R-280: the band replaced by the test it was standing in for
MEASURABLE = [15,85] proxied for "can this fight move at all". The direct form,
in the units the guard already uses: the spread rate must stand clear of both
ends by more than its own noise. Deliberately blind to the gain -- admitting the
sizes where focus fire clears its noise would make the guard's claim true by
construction. Size is still picked on nearest-an-even-fight.

31 measurable became 38. the_arrears returns at 6.3, and switchboard arrives at
8.1 -- the second largest gain in the artifact, thrown away for being one point
past a round number. Four of the eight carry effects larger than most rows the
band already admitted.

Two of them do not clear their own noise: the_choir has 0.7 points of headroom
and used 0.2, the_stanchion has six and used 0.2. Above-noise falls 31/31 to
36/38 and the bestiary prints 36. That is two measurements reporting no
detectable effect, which the band suppressed by refusing to take them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:27:13 +01:00
slaguru666andClaude Opus 5 23262855b4 Desk playtest 4: the clock, against v0.13's recut timings
Seed 6142, banding from rules.mjs rather than estimated, every roll logged.
Run because desk pass 1's 4:25 describes a scenario that no longer exists --
Act Two was 65 minutes when that pass ran and is now 45.

VERDICT: the clock holds, and for the reason it was built to. Every beat in
Act Two ended on something written into the text rather than on GM judgement,
which is what the recut was for and what the 65-minute version never had. The
run landed at ~3:46 against 3:40, with two of three Pacing Note cuts taken and
the third still in hand -- the first time this scenario has finished a pass
with a cut unspent.

A hostile seed, deliberately not re-rolled: two fumbles, eight failures, and
the party's one reliable Act Four test missing. A clock only tested under lucky
rolls is not tested, because failure is what generates table time.

THREE THINGS THE DICE FOUND, none of them about minutes:

- A SPECIAL FIGHTS THE REST CLOCK. Renshaw rolled 7 against 63 and the column
  opened up at exactly the moment the scene wanted to end. A GM who has just
  rewarded a good roll will not then stand the line up. The roleplay-first
  archetype's verdict was "I rolled a 7 and got less time", which is the only
  sour note in the session and a real design fault.

- THE RE-CUT-THE-PEG FUMBLE HAS NO DURATION. The clause is one of the best
  things in the document and the text itself says a table will chase it. It
  added ten minutes with no guidance about what ends it.

- A FUMBLED PERSUADE ON SWINBURNE HAS NO ANSWER. H01's failure case is written
  for a party who did not ask, not one that asked badly. Predates v0.13, and
  the third pass running to find the failure cases written for absence rather
  than for bad rolls.

WHAT WORKED, WRITTEN BLIND: the unsettled countdown outcome added in v0.12 was
asked for on its first ever roll -- the understudy fumbled 100 against
Ashcroft's failure on the Difficult branch, so the contest came back unsettled.
That is the 14.5% case, it is the aggressor-fumble the rule's author left for
this document to price, and the price is right. No fix needed.

Also confirmed: THE OFFER running inside the column scene costs zero wall
clock, and has a side-effect worth keeping on purpose -- the aside has no
audience, so Ashcroft returns to a conversation that moved on without him.

Five fixes listed, none applied. npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:23:59 +01:00
slaguru666andClaude Opus 5 a7e4dd7754 R-279: what the_arrears was claiming, and why dropping it is the wrong kind of right
It claimed focus fire is worth 6.3 points against two of them, 14.7% to 21%.
Measured independently at 4000 runs x 3 seeds: 14.2% to 20.4%, gain 6.2, which is
2.4x its own noise and 44% of the base. The claim was true and reproduces.

What failed is a threshold. MEASURABLE is [15,85] and the scan's estimate of a
boundary value moved 14.7 to 14.4. And the creature is a step -- 85.7% at one,
14.2% at two, 0.4% at three -- so no pack size gives an even fight and the band's
endpoints fall in the gap. The band records nothing about a creature whose
defining property is having no middle.

Not moving the band to 14: fitting a threshold to the datum it excludes is how a
guard stops being a test. But the band is a proxy for "can this fight move", and
the direct test -- does the gain clear its own noise -- is already in the
artifact and answers yes. Replacing the proxy is a decision about all 47, not a
fix, and not mine to take unasked.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:21:31 +01:00
slaguru666andClaude Opus 5 a7eca91a9c R-278: raising SCAN_RUNS found that SCAN_RUNS had never been read
Asked to raise the scan until the redcap's pack size stopped flipping. Measured
the threshold -- unstable at 3000 and 4000, stable across twenty seeds at 6000 --
raised it, and the re-record took fifteen seconds, which was impossible.

winRate takes three parameters and pickSize passed SCAN_RUNS as a fourth.
JavaScript discards it, so every scan has always run at RUNS and SCAN_RUNS has
never been read by anything. The fix I was asked to make was inert in the same
way as the thing it was fixing.

winRate takes runs now. The redcap is still n=3 with gain 6.3, arrived at stably
rather than luckily; the_arrears drops out of the measurable band at an honest
scan, 31 packs to 30; the_committee moves 2 to 6 and stays pinned. Claim check
still passes, bestiary regenerated.

The only signal was a number being too small. A fifteen-second re-record is good
news, and good news is what nobody investigates.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:18:46 +01:00
slaguru666andClaude Opus 5 00e5a993cc CLEAN GROUND v0.13: Act Two cut from 65 minutes to 45, and the clock now fits
The scenario ran 20 minutes over the house budget (3h30 play plus a ten-minute
break, 3h40 wall clock) and Act Two carried all of it at 65 minutes. It is now
45, and the session lands at 3:40 exactly: 45 + 45 + 50 + 45 + 25 = 210 minutes
of play.

NOTHING WAS DELETED. The twenty minutes came out of structure, which is the
only kind of cut that survives contact with a table:

- THE CROSSING IS CAPPED AT FIVE. It was "let the silence sit until a player
  breaks it", which is open-ended by construction. If the table is still quiet
  at minute five the Geiger finds its own voice. A silence that has stopped
  being tense is just a pause.

- THE OFFER RUNS INSIDE THE COLUMN SCENE, not beside it. It was "somewhere in
  this act, take Ashcroft's player aside for one minute" -- a separate slot.
  Run during the line's rest, while the other players are talking to Ivy, it
  costs nothing, because the table is already occupied.

- THE LINE'S REST IS THE ACT'S CLOCK, and this is the cut that does the work.
  The column walks every day and stops to rest, not to meet people. Ivy talks
  for as long as the line is sitting down, and the line sits for twenty-five
  minutes; then the old ones stand up, because they always do. The scene ends
  on the GM's schedule through the scenario's own premise rather than through
  a GM deciding to move things along -- and it is the loop showing itself for
  the first time, which makes the timer do dramatic work as well as temporal.

The Pacing Note now carries 65 minutes of further cuts against what was a
55-minute problem, so there is about ten minutes of genuine slack for a table
that talks. That is the first slack this scenario has ever had. It also now
says where to cut if the break arrives late: Act Three's depot search, never
Act Four, which is the shortest act with the most to do.

Also fixed a stale duplicate: the Overview said "Runtime: 4h00" while STATUS
and the timing table said otherwise. Every runtime figure in the document now
agrees, and the remaining mentions of 4h00 are explicitly historical.

CAVEAT, STATED IN THE DOCUMENT: desk pass 1's 4:25 predates this restructure
and no fourth desk pass has been run against the new timings. The first human
run is also the first test of this clock.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:17:34 +01:00
slaguru666andClaude Opus 5 38012d56ff R-277: n=3 is right for the redcap, and R-276 was wrong about why
check-focus picks the pack size nearest an even fight. For the redcap that is
n=3 at 28.0% against n=2's 73.4% -- correct, and also where focus fire is worth
most. But the margin is 1.4 points and the scan is 400 runs: run across eight
seeds it picks 3 seven times and 2 once, and the recorded gain would move 6.3 to
4.9 with it.

R-276's explanation was wrong. Its table was measured against the CLEAN GROUND
cut, which it never named. Against the frozen party a lone redcap is worth 0.4
rather than 6.1, because that party wins 98.9% and nothing shows against a
ceiling. The power is worth most where the fight is in doubt -- 3.8 at n=2, 3.1
at n=3, nothing at either end. Not outnumbered. Undecided.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:11:20 +01:00
slaguru666andClaude Opus 5 e21446b164 CLEAN GROUND: say plainly that it runs 20 minutes long
Found while revising the Contingency 2027 prep deadlines. The house standard
(docs/house-standards.md in the convention repo) allows 3h30 of play inside the
four-hour slot plus a ten-minute break -- about 3h40 wall clock against roughly
3h15 of content. This document has always budgeted 4h00, which is the whole
slot with nothing either side, and never said that was over.

Worse, the Pacing Note's ~25 minutes of cuts read as slack and are not: desk
pass 1 ran 4:25, so taking every cut lands at 4:00, still 20 minutes past the
house budget. A GM reading "4h00 including a break" alongside "the Pacing Note
carries cuts" would reasonably conclude there was room to spare. There is none.

STATUS now carries the overrun, and the two honest ways out are written down
rather than left implicit: find another 20 minutes, most likely in Act Two's
65, or declare it a deliberate exception and run it where nothing follows --
which at Contingency 2027 it does, Sunday afternoon with only a reserve behind
it. Not decided; that is Tim's call.

Until then the instruction is explicit: assume an overrun and take the cuts
from the start rather than deciding at the break.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:09:21 +01:00
slaguru666andClaude Opus 5 7fc0da3ecf R-276 correction: check-lethality fights solo, and I read the wrong column
Asked to re-record the lethality baseline against a lone redcap, I read the tool
and found it already does: measure(party, [spec]), with a comment saying "Solo,
because a creature is the unit under test". My claim that it fights packs came
from memory of check-focus, whose redcap is n: 3.

The lethality figure was also not hiding the power. Wipe rate moved 0.7% to 0.9%
because one redcap cannot wipe four agents whatever it ignores -- that column is
at its floor. Agents down moved 0.55 to 0.74 of 4, a 35% relative increase, which
is the column I did not look at.

No baseline re-recorded: it is already solo and was re-recorded in R-275.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:08:04 +01:00
slaguru666andClaude Opus 5 8fa691c4aa R-276: NOT TIRED is visible in play, and worth nothing where we measure it
Played four agents against one redcap. Two dodges in one round, both at 75 --
DEFENCE_STEP is -30, so the second would have been 45 and the roll of 70 would
have failed. The wiring fires.

Measured with and without, 2000 x 3 seeds: the power costs the party 6.1 points
against a lone redcap and 0.1 against three of them. It is a rule about being
outnumbered -- a lone defender spends four defences a round, a pack spends one
each -- which is why check-lethality moved only 0.7% to 0.9%. The baseline fights
redcaps in a pack, the configuration where the power is worth nothing, so that
figure is the floor rather than the effect.

Not presented as evidence: at seed 3 the party wins with the power on and is wiped
with it off, which is stream divergence rather than direction.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:02:54 +01:00
slaguru666andClaude Opus 5 dee2c8f776 CLEAN GROUND: booked — Contingency 2027, Sunday 31 January, afternoon
Slot 9. Recorded in STATUS and both open questions closed. The convention
repo (slaguru666/contingency2027) carries the booking and points back at this
file rather than copying it: seventeen guards check the scenario here, and a
copy over there would be a second version nothing checks.

That spends the Sunday afternoon re-run reserve, which was real slack. The
convention schedule note now names this game as the one that gives if prep on
the eight booked games slips — it is the newest, least tested, and the only one
whose absence costs nobody a booked seat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 11:32:08 +01:00
slaguru666andClaude Opus 5 32ca982369 R-275: the harness had never read a creature's power
41 statblocks carry a POWER in their tactics and simulate.mjs read none of them,
so a redcap that ignores the cumulative defence penalty has been measured as a
creature that tires -- in check-lethality, in check-focus, and in every figure
published about it. The defect was not that the powers were unimplemented, it was
that nothing said they were not.

powers.mjs classifies all 41: 2 wired, 14 notSimulable with a stated reason, 25
not fight rules. check-powers refuses an unclassified POWER and refuses a
notSimulable without a reason -- and it does not test that the harness imports a
power, it fights the creature with and without and requires the two to disagree.

Moved: the courier 9.4% to 1.0% wiped (it attacks at half while carrying), the
redcap 0.7% to 0.9% (small, because these fights rarely spend a second defence).

ARGENT AND GULES was wired and then un-wired: it tripled the supporter's wipe rate
to 75.2% because the harness has no ground and applied the borough-ground condition
unconditionally. Same reason THE PULL is not wired. I had wired one and refused the
other on identical facts.

Lethality and focus re-recorded, bestiary regenerated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 11:05:11 +01:00
slaguru666andClaude Opus 5 9f3a63174f CLEAN GROUND v0.12: convention one-shot, the print pack, and the real opposed roll
Tim settled the last two questions: convention one-shot, and rules.mjs gains a
real opposed roll (landed by a peer session at R-273). Both decisions change
the document, and the one-shot unblocked the print pack.

THE PRINT PACK — docs/scenarios/CLEAN_GROUND_HANDOUTS.html, guard 17.

Four A4 sheets, self-contained, no external fonts or assets: H01 the coroner's
note on white, H02 the 1962 committee minute on cream with photocopy grain,
H03a and H03b the almanac on ruled paper. 11pt floor throughout.

The binding constraint is that H03a and H03b must print identically or the
almanac trick dies, so that is structural rather than careful: they share one
`.almanac` class and every dimension comes from a variable defined once. There
is no selector anywhere that names one page and not the other, and
check-handouts fails the build if one appears, if their markup structures
diverge, if their columns differ, if any row stops reading "41 mi", if the
counts stop being forty-one now against fifty-three then, or if the pack and
the scenario drift apart.

It earned itself immediately: its first run failed my own pack for five rules
at 10.5pt, under the house 11pt floor. Rendering was checked visually too,
which caught two things no guard would have — the "TO CLEAN GROUND" header
colliding with NOTES, and the writing crossing the red margin rule instead of
starting right of it.

THE ONE-SHOT. Countdown step 6 said "and this is a campaign", which the
decision contradicts. Rewritten, and the Close's "leave it filed" ending now
says how to land it tonight: do not end on "you'll be back", because the table
never will and a hook they cannot take reads as an unfinished scenario. Name
the next agent who gets sent, and have Registry thank them.

THE OPPOSED ROLL. The scenario-local ruling is deleted; GM ESSENTIALS points
at the game. Both beats were re-priced against the real rule by enumerating
all 10,000 roll pairs -- exact, no seeds -- and two things fell out:

  THE OFFER IS PRICED. Ashcroft refusing is taken 21.9% of the time, the
  safest file at the table. Accepting: 48.7%, past Braithwaite's 37.6%.
  Accepting does not make him a bit more vulnerable, it makes him the easiest
  person in the room, and the countdown reaches for the easiest.

  STEP 5 CAN COME TO NOTHING, 14.5% of the time against an Ashcroft who
  accepted, and that row fires once and is marked permanent. Previously a
  silent gap in a climactic beat. It is now a written outcome with read-aloud
  text: the reach fails, it wears the wrong face for a moment, the party learns
  what it is and cannot prove it, and the clock still turns to step 6.

Also: update-readme's count-word list ran out at sixteen, one guard after its
own comment warned about hardcoded lists going stale. It failed loudly rather
than silently, so it is an inconvenience and not a defect. Extended.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:50:03 +01:00
slaguru666andClaude Opus 5 dd3d818893 R-274: the opposed roll works and the combat never reaches it
Played the hollow man against the cut. THE FILE IS YOURS NOW never fires --
simulate.mjs reads statblocks and weapons and has no concept of tactics, so
R-273 closed a gap in rules.mjs and left the same gap one layer out.

Resolved by hand it behaves: every roll pair enumerated for both beats. The
tie-break carries it -- at POWx5 100 against 60 the aggressor still only takes
them 48% of the time, because equal bands go to whoever is being acted upon.

Act Four prices THE OFFER: accepting it moves Ashcroft from the safest person in
the room to the least safe, 21.9% to 48.7%, past Braithwaite's 37.6%. And that
once-only row no-ops 14.5% of the time against him, which Act Three can absorb
and a permanent countdown beat may not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:45:32 +01:00
slaguru666andClaude Opus 5 cdbb2e34ee R-273: the opposed roll, built where the authority lives
The content has called for 'opposed POWx5' since before the rule existed -- the
hollow man's tactics, CLEAN GROUND twice, slice-text three times -- and rules.mjs
defined none. A scenario carried a local ruling that said in its own text it was a
ruling and not a rule.

Generalises that ruling rather than inventing another: both sides roll, the better
band wins, only the ladder the game already has. Ties go to whoever is being acted
upon, which is what defenceOutcomeFor has always said; the scenario's 'favour the
agent' gave the same answer only because no agent ever initiates one. Neither side
succeeding leaves the contest unsettled rather than won, which the two beats need
in opposite directions.

Two exports at the scenario session's request: opposedOutcomeFor compares graded
levels and carries both, so a caller can price a fumbled attempt without this file
deciding what a fumble costs; opposedContestFor runs it from ratings and rolls with
per-side difficulty, so 'resists at Difficult' does not put applyDifficulty back
into a document. Spot-checked against the real Act Four beat: 55 against 85 at
Difficult, which is 42.

Page 1 states it by asking it -- the tie-break and the margin are computed from the
rule at build time, so the book cannot drift from the engine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:42:17 +01:00
slaguru666andClaude Opus 5 d03b3208e5 check-cited: the counter watching for invisible markers was itself case-blind
Fourth variant of the same defect, found by the peer session probing sideways.
Neither CITE nor ANY_CITE carried the `i` flag, and ANY_CITE required a literal
"cite:" with no space before the colon. So three plausible spellings were
invisible to the reader AND to the counter that exists to catch invisible
markers:

  <!-- Cite: first-blood cut.swing -->     OK 25, exit 0
  <!-- CITE: first-blood cut.swing -->     OK 25, exit 0
  <!-- cite : first-blood cut.swing -->    OK 25, exit 0

Each of those was verified carrying a citation printing 41 against an artifact
holding 40, and each reported OK with a count byte-identical to a clean tree.
The count check could not see them because it was looking for the same literal
the reader was. Capitalising the first word of a comment is not an exotic
mistake.

The two patterns are now deliberately asymmetric, which is the actual fix:

  CITE      tolerates case and spaces around the colon, so those spellings
            simply work when correctly placed.
  ANY_CITE  stays looser still, so a spelling neither of us anticipated is
            counted and named rather than skipped.

The reader accepts only what the format specifies; the counter recognises
anything a person might have meant as a citation; the difference is reported.
The failure text now covers misspelling as well as misplacement, since the
unread set can be either.

Matrix verified, exit codes read directly: a wrong value fails under all four
spellings including no-spaces; a right value passes under all of them, counting
26; a misplaced-and-capitalised marker fails; a marker missing its path fails;
clean tree OK 25 with no false positive.

Four iterations of this guard, four variants of one defect -- something that
exists and is never read -- and all four were found by the session that did not
write it.

npm run check: 16 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:33:17 +01:00
slaguru666andClaude Opus 5 0de463c470 check-cited: make the regex match its own error message, and name the right lines
Two residual defects in the marker check added at 4d7d93a, both found by the
peer session that found the original.

1. THE REGEX WAS LOOSER THAN ITS DOCUMENTATION. The failure text has always
   promised the comment must follow its figure "immediately, with nothing but
   markup between", but CITE's separators were \s*, which spans newlines — so
   a marker on the line after its number resolved and was checked, contrary to
   the stated rule. Tightened to [ \t] throughout.

   Verified safe before changing it: matched under the loose pattern 25, under
   the tight pattern 25, so no citation in CLEAN GROUND relies on crossing a
   newline. There is no finding in the document.

2. THE OFFENDER REPORT WAS RIGHT ABOUT THE COUNT AND WRONG ABOUT THE LINES.
   It filtered line by line, so a valid cross-line citation was printed as an
   offender whenever some other marker was genuinely unread — a maintainer
   told "line 15 is broken" would have edited a working citation. That is the
   headline defect fixed an hour ago one level down: correct verdict, wrong
   reason.

   Offenders are now located by position across the whole text, so the lines
   named are exactly the markers no CITE match covers. This is the fix that
   matters independently of the regex: a marker spanning lines would still be
   counted once by ANY_CITE and named nowhere, so tightening alone leaves a
   narrower version of the same bug, and position-based reporting stays
   correct if anyone ever loosens the separator again.

Placement battery, exit codes read directly: clean tree OK 25 no false
positive; one word between number and marker fails; bare marker alone fails;
two on a line with one attached fails naming only the unattached; cross-line
now fails rather than silently passing.

Three iterations of this guard, three variants of one defect — a marker or a
message that exists and is not read — and all three were found by the session
that did not write it.

npm run check: 16 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:29:45 +01:00
slaguru666andClaude Opus 5 4d7d93abc8 check-cited: a citation marker nothing reads now fails the build
A misplaced marker failed open. CITE requires the comment to sit immediately
after its figure; put one word between them and the citation is silently
skipped while the run still reports OK with the same count as a clean tree:

  The longest fight seen ran **67** rounds.<!-- cite: fight-tail cut.longest -->
  check-cited: OK — 25 cited figures ...

That marker names a field the guard is supposed to refuse outright, and the
guard never saw it. Worse than an absent citation, because whoever wrote it
believes they added a check — and worse still in a guard written yesterday to
catch exactly this shape of defect.

Every `<!-- cite:` occurrence is now counted and compared against what the
parser actually read; any difference fails and prints the offending line.
Verified on both placement failures: a marker one word from its number, and a
marker on its own line with no number at all. The failure headline was also
wrong for this class -- it claimed a figure mismatched its artifact -- and now
covers both.

Found by a peer session writing a bad citation by accident while testing.

npm run check: 16 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:24:32 +01:00
slaguru666andClaude Opus 5 8279cdfda8 R-272: guard the tail, and stop prose drifting from its artifacts
Three things Tim asked for together: measure the long end of a fight, make the
swing check bite on stale prose, and record in rules.mjs the coincidence that
hid an invented rule from two readers.

GUARD 15 — check-fight-tail, on tools/fight-tail.mjs.

Fourteen guards measured this scenario's combat and none could see a long
fight, because every one of them averages. The cap is the measurement here, so
the tool passes its own (400, not runFight's default 40) and --update refuses
to record anything reaching it. Verified by lowering it back to 40: the cut
loses 20 fights to the ceiling, the six-a-side 117, 107 of those ending
neither won nor wiped, and the recorder stops.

Two claims, both read from a fresh measurement rather than the baseline, so
--update cannot silence them. "The long end is twice the median" was rejected
as a claim because it is true of both encounters and so distinguishes nothing.
Instead: a fight past 15 rounds wipes the party materially more often than a
short one, and the SIX-A-SIDE fight is the longer one (median 14 vs 10.7) --
R-270 showing up as duration, since a disabled fighter keeps fighting 30
points down. The cut is shorter because it is decisive, not safer.

GUARD 16 — check-cited, on tools/check-cited.mjs.

check-firstblood and check-attackers catch the game changing; neither reads
the document. Re-record after a re-cast and the artifact updates, the guard
goes green, and the prose keeps printing the old number under a citation
saying where the new one lives. So citations are now machine-readable --
**40**<!-- cite: first-blood cut.swing --> -- and resolved on every build. 25
of them. It failed three times on its first runs, all real: a config keyed
"column" that the prose called "line", two figures rounded 32.3 -> 32, and a
vacuous pass on zero citations, now fatal in its own right.

It also refuses citation of unstable fields. fight-tail.longest may not reach
prose: same party, same seeds, same runs, and renaming a config moved it 71 ->
90 rounds, because seedFor derives the stream from the id. Across seven
labels -- median spread 0, p95 1, p99 3, longest 21. A sample maximum reads
like a bound and is a property of the label. EXPOSURE states p99 instead.
Same discipline on the deadlier ratio: 2.42 with seed spread 1.1, so the
document gives its direction and declines to quote its size.

RULES.MJS — one comment, no rule change.

Over resolveLocationHit: its two thresholds are unrelated and usually agree.
disabled is a fraction of the pool per location; majorWound is ceil(hp/2) and
feeds only dyingLimitFor; neither removes anyone from a fight, which is
conditionFor at 2 hit points or a destroyed head. At 10 hp, leg/abdomen/chest
capacity is 5 and majorWoundFor is 5, and those locations take 12 of 20 melee
results and 15 of 20 ranged -- so two readers reconstructed a rule that does
not exist, checked it against the log, and were confirmed by it. The note
says to test an arm, the only place the difference shows.

Guards verified to bite, not assumed: drift, re-cast, censoring, the longest
refusal, the rounding catch and the vacuous-pass catch were each forced and
each failed the build with the right guidance, then restored.

npm run check: 16 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:20:25 +01:00
slaguru666andClaude Opus 5 14c34449e3 R-271: measure the tail, and a round cap that scores a long fight as a draw
Fourteen guards all average, so none can see how long a fight might run. 6000
fights per configuration: the cut runs a median of 11 and a 95th of 22, the
six-a-side line a median of 14 and a 95th of 32, and the longest seen are 71 and
79. The line is the LONGER fight, because more bodies means more of them fighting
on at reduced skill rather than dropping. Length predicts death: 61.6% of cut
fights past fifteen rounds are wipes against 42.0% of shorter ones.

maxRounds = 40 is the default every guard runs at and a fight reaching it is
scored as neither wipe nor win -- censoring 0.2% of cut fights and 1.87% of the
line's. Measured before proposing anything: uncensored, the swing moves 39.8 to
39.9 and 14.8 to 15.1, against a recorded noise of 2.1. The cap stays, documented
rather than corrected, because the cure is four re-recorded baselines.

Also R-270 addendum: the hit table is weighted toward the locations where the two
thresholds coincide -- 12 of 20 melee results, 15 of 20 ranged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:08:09 +01:00
slaguru666andClaude Opus 5 74e45b15e7 R-270: a rule I invented, and the coincidence that hid it
R-266 said a fighter goes down at half maximum hit points and called it one rule
in both directions. conditionFor puts someone down at hp <= 2; majorWoundFor is
ceil(hp/2) and feeds only how long the dying last; a location is disabled by
resolveLocationHit at its own locationMaxHp capacity.

The reason it survived reading: for a 10-point neighbour majorWoundFor is 5 and a
leg, abdomen or chest holds exactly 5, and for a 12-point agent both are 6. On the
locations that get hit most the invented rule returns the real one's answer, and
the narration prints MAJOR WOUND and disabled on the same line. Arms and heads are
where they part, and I had not looked at an arm.

Found by the scenario session going to rules.mjs to verify a different correction
of mine and reading the next function along. Both errors made the fight look
easier than it is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:03:34 +01:00
slaguru666andClaude Opus 5 6e46ad0909 CLEAN GROUND v0.11.1: correct the mechanism under the first-blood swing
Two wrong mechanisms in one sentence of my own v0.10 prose. The measured swing
of 40 is unaffected -- what was wrong was the explanation I gave for it, which
I wrote from intuition rather than from rules.mjs.

1. "every disable removes an attacker" -- it does not. locationEffectsFor
   (rules.mjs:461) charges 30 points off physical for a ruined leg or
   manipulation for a ruined arm, and simulate.mjs:305 applies the
   manipulation penalty to melee and ranged attacks alike. A 40% attacker
   disabled is a 10% attacker, not an absent one: still swinging, still
   drawing attacks, still a target. A slope, not a cliff.

2. "both sides go down at half their maximum hit points" -- also wrong, and
   this one nobody flagged. Half maximum hit points is majorWoundFor, the
   MAJOR WOUND threshold, which feeds dyingLimitFor and decides how long a
   dying character lasts. It has nothing to do with leaving the fight.
   conditionFor (rules.mjs:1630) puts somebody down at 2 hit points or on a
   destroyed head, and that is the only thing that stops them acting.

The paragraph now states the real loop and warns the GM off the wrong one,
because playing disables as removals gets the fight wrong in the party's
favour -- the direction that makes a party-ending encounter feel survivable.

Credit where due: the first error was caught by a peer session correcting
prose it had sent me twice. I found the second only because I verified the
first against rules.mjs instead of taking it on assertion.

npm run check: 14 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:01:11 +01:00
slaguru666andClaude Opus 5 765b3518db R-269: the fourth quadrant, and a disable does not remove anybody
Seed 16 is the missing corner -- party takes first blood in round 1 and is wiped
anyway -- and it runs 24 rounds. Its last five are Neil dropped by a critical
through armour, then Dominic alone at 1%, failing three times, then dying. That
is what three effective attackers costs at a table when a fight goes long.

Corrects a mechanism I had written twice: a disabling hit does not remove an
attacker, it charges 30 points off physical or manipulation per locationEffectsFor.
Bhattacharya keeps swinging at 10 for four rounds. A slope, not a cliff.

Neither guard fired and neither was wrong: the fight sits in the 25.5% the swing
does not cover, and no guard measures the tail because all of them average.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:59:06 +01:00
slaguru666andClaude Opus 5 dc801f7e9f CLEAN GROUND v0.11: Dodge 68, and Ashcroft is busy rather than sidelined
Two holes a peer session's per-agent measurements pointed at. Their scratch
figures are not used; both edits are sourced to published numbers or to the
guard that now holds them.

EXPOSURE gains a fifth point: the party's sheets read about twice as effective
as they are, and the number doing it is the column's Dodge 68. That is
arithmetic off two published values, not a measurement -- Dodge 68 on The
Quiet Neighbours (tools/content.mjs, printed by the bestiary) and one defence
spent per incoming blow, so a 40% attack against a fresh dodge connects about
one time in eight. Nothing in the document said so, and grep for "expect to
hit" / "hit rate" / "lands about" returned nothing at all.

The point carries its own way out: DEFENCE_STEP is -30, so a defender who has
dodged once meets the next blow at 38%, then 8%, then the floor. Spend their
dodges rather than out-shooting them. That is also the other half of why the
four-player cut is a different game -- three attackers cannot spend three
defenders' dodges and six can, so the missing attacker is the one who would
have made everybody else's shots land.

The recorded landing rates agree and are now citeable (16-18%, above the naive
one-in-eight because most blows are not the first of their round), so the
sub-bullet cites tools/attackers-baseline.json rather than asserting.

The scaling note's Ashcroft warning gains the sharper reading: he is not
sidelined, he is busy and ineffective -- 9.2 attacks a fight of which 1% land
and 0.1% disable anybody, both held by check-attackers. A player who cannot
act knows to do something else; a player rolling once a round for an hour
thinks he is fighting. So the note now says what to give him instead, using
only what is on his sheet: First Aid 40, Dodge 63, Insight 63, the anchor.

Verified rather than relayed: Dodge 68 at tools/content.mjs, DEFENCE_STEP -30
and the per-round reset in rules.mjs and simulate.mjs, the three fighters'
skills at 40/40/35, and the per-attack rates re-measured independently across
three seeds before the baseline existed (17.6-18.3 / 17.4-17.6 / 15.5-16.2 /
1.0%, against the recorded 17.8 / 17.3 / 16.2 / 1.0).

npm run check: 14 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:58:14 +01:00
slaguru666andClaude Opus 5 0b86c5ffc3 R-268: guard the sentence that names a player's character
CLEAN GROUND prints that the four-player cut is three effective attackers and
that Ashcroft is not one. Nothing checked it, and a GM reads it aloud to decide
who a real player spends four hours being.

effective-attackers.mjs measures per attack, not per fight: counted per fight
Braithwaite leads on disables, but only because his armour buys him a third more
swings -- per attack he is the weakest of the three. Both rates are recorded and
only the per-attack one is reasoned from. Asserts exact drift, then the sentence:
three clear 5% of attacks disabling, one does not, and that one is Ashcroft.
Re-recording does not silence the claim check; verified in a worktree.

declared-cast.mjs holds the cast marker reading both scenario guards need, rather
than a copy in each. It was briefly named scenario-cast.mjs, which check-scenarios
sweeps into the scenario corpus -- its own example marker was read as a real cast.

update-readme dropped any guard that exited non-zero, so check-rollable vanished
from the README and the count word fell to thirteen while fourteen guards ran. A
missing line is now fatal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:56:01 +01:00
slaguru666andClaude Opus 5 a0d15ad7a9 CLEAN GROUND v0.10: EXPOSURE reframed on the first disabling blow
The old EXPOSURE paragraph read the fight at round five and quoted bucket
figures no guard held. Round five is where the outcome becomes legible; round
two is where it is decided. Reframed on the first disabling blow and cited to
tools/first-blood-baseline.json, so every figure in the paragraph is one the
build re-measures:

  cut   50.3% first blood at mean round 1.8, 25.5% vs 65.5% wipes, swing 40
  line  54.1% at round 1.3, 7.8% vs 23.2%, swing 15.4

An earlier draft carried 43 for the cut swing from a single seed. Three seeds
give 40.0. The note stays in the document.

Also adds a Casting coupling warning: the declared cast in the `cast:` marker
is load-bearing on check-rollable and check-firstblood, and re-casting
invalidates the recorded swing. Verified rather than assumed — swapping
braithwaite for agyeman in the marker fails both guards and the build, and
check-firstblood names the fix:

  "The recorded swing describes the old cast; re-record with --update,
   do not revert the cast."

npm run check: 13 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:50:07 +01:00
slaguru666andClaude Opus 5 60995b28c2 R-267 addendum: read the cast, do not copy it
I told the scenario session that this guard turns a silent re-cast into a build
failure, and it accepted the coupling on that basis. The cast was hardcoded, so
a re-cast would have left it measuring the old six and reporting success.

Reads the <!-- cast: --> marker check-rollable established, drops the two the
scaling note drops by name rather than by position, and refuses to run if the
marker is gone. Verified by re-casting CLEAN GROUND in a throwaway worktree and
watching the guard name the change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:45:38 +01:00
slaguru666andClaude Opus 5 996bd248d3 CLEAN GROUND: one status block, and the end of the build archaeology
A stand-in GM opening this had no single place to start: the state of the document
lived across three playtest logs, twenty commit messages, a status paragraph and a
checklist at the foot. Worse, the two written accounts had drifted apart — the
status paragraph still said the scenario "wants a stress re-run of Act Four, a
player-chair pass", both of which were done and committed, and the foot checklist
still said v0.8 in a v0.9 document with a sentence broken in half.

STATUS now sits at the top and answers the questions a GM actually arrives with:
what version, can I run it (yes, from this file alone), is it convention-ready (no —
never played by human beings, no print pack), what playtesting exists and at which
seeds, how long it runs and where the cuts are, how many players.

Then the three things that are not obvious, as pointers rather than restatements,
because GM ESSENTIALS is where rules live: opposed rolls use a scenario-local ruling
since rules.mjs has none; Ashcroft cannot fight and his player must be told before
the game; and the lethal encounter is the column in Act Two, not the monster in Act
Four, which cannot hurt anybody.

The foot checklist is deleted rather than corrected. Every item on it was either
struck through or now in STATUS, its history is in the logs and the commits, and
keeping a second account of what is outstanding is what let the first one drift.
Open Questions stays as the single home for decisions and STATUS says so in a line
instead of holding a copy — the same rule this repository applies to rule formulas,
applied to prose about state.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:42:39 +01:00
slaguru666andClaude Opus 5 ce1103ec0d R-267: a guarded home for the first disabling blow
Another session verified R-266's measurement, agreed the frame was better than
its own, and declined to publish it because the figure had no guarded lineage a
doubter could re-derive. It was right, and the fix costs 0.7s of build time --
which is the number I should have checked before calling it a reading tool and
not a guard.

first-blood.mjs gains --update/--check and is now both the reader and the
measurement of record; check-firstblood.mjs is a thin wrapper over it, the same
shape as check-bestiary. Compares the recorded figures exactly, then asserts only
what a page would claim: first blood lands within 5 points of even in the cut,
and its swing exceeds the six-a-side line's by more than both noises.

Recording it moved the swing from the scratch run's 43 to 40 against a
seed-to-seed spread of 2.1 -- high by more than its own noise, which is the
argument in miniature. update-readme's COUNT_WORD could not reach thirteen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:42:31 +01:00
slaguru666andClaude Opus 5 8e5a30a263 CLEAN GROUND v0.9: the anchor cannot fight, and the cut is three
Reading two narrated fights from another session showed Dominic attacking at
`vs 1`, four times in one of them. Confirmed against the sheet rather than the
log: weapons is empty and his only combat skill is Firearm (Pistol) 43, with
nothing to fire. So the four-player cut fights with Renshaw and Bhattacharya on
compact pistols and Braithwaite on a knife — a quarter of the party out of any
fight, and a large part of why EXPOSURE already said violence at four players is
party-ending without knowing that was the reason.

A defect I introduced. "He carries no weapon, and the GM must not fix it" was
written as characterisation about an anchor having both hands full, and was never
checked against a fight.

Not fixed by arming him, which would cost the character to solve what is really a
briefing failure. Said out loud instead: his entry now states the 1% plainly and
instructs the GM to tell his player BEFORE the game that Dodge 63, First Aid 40,
Insight 63 and the anchor are his set-piece. A player who is not told will roll at
1% for twenty minutes and conclude the sheet is broken, which is the actual harm
here. The scaling note carries the three-attacker arithmetic and points at Agyeman
as fixing the sum as well as the lane; EXPOSURE names the cause in its own prose.

Also recorded in the pass-3 log, deliberately NOT applied: the bimodality now has a
mechanism — both sides disable at half max HP, so each disable thins the return fire
and makes the next likelier, and first blood is a true coin worth 43 points of wipe
rate in the cut against 14 at six-vs-six. It reproduces exactly. It stays out of the
scenario because it comes from a reading tool with no guarded baseline, and a
GM-facing page may not carry a figure nobody can re-derive. The duller published
sentence is the checkable one. If that measurement gets a guarded home the paragraph
should be reframed around the first disabling blow, which is the better frame.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:39:22 +01:00
slaguru666andClaude Opus 5 19ed0b5f0f R-266: the coin is the first disabling blow, and it lands in round two
Reading both ends of the four-player cut — seed 5's sweep and seed 2's wipe —
says the fight is not decided by round five but by whoever lands the first
disabling hit, on average in round two. Both sides disable on one good blow, so
each one thins the return fire and makes the next likelier; nothing pulls a
fight back toward the middle.

tools/first-blood.mjs measures it: 49.7/50.3 on who strikes first, and 23.1% vs
66.5% wipes on either side of that. Six against six is the control at 8.6% vs
22.4%. A reading tool, not a guard — it records nothing, and no figure from it
goes on a generated page.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:36:05 +01:00
slaguru666andClaude Opus 5 6b95a2c5a5 CLEAN GROUND v0.8: the player chair found the refusals, and both needed deciding
Desk pass 3 is committed alongside — full session from the player chair, choosing
against the scenario at every junction, seed 5580 with one corrected branch at
7731. Every failure case and every pass-2 fix held. What it found instead were the
two things players do that no GM-chair pass can reach, because both are refusals
rather than rolls.

"We are not going through." Three acts live on the far side and the document had
no line about declining to cross, which is the most professionally sensible choice
a party can make after reading a coroner's note about a man who walked himself to
death. Answered now with a reason and not a compulsion: the entry is pegged to a
tree that no longer exists, so a seam with no peg does not sit still — waiting does
not make it safer, it makes it unfindable, and the forty-one go with it. Registry
says that once and leaves the choice alone. A party that still refuses gets a real
ending in ten minutes rather than four railroaded hours.

"Can we cancel it from in here." A Research fumble and an Anomaly Lore success both
landed on a question the document could not answer either way. Decided rather than
fudged: cancellation is a REGISTRY ACT ON OUR SIDE, because the entry is a record
and the record is held here. So it cannot be done from inside, somebody has to be
back through before it happens, and anyone still in the duplicate when it goes goes
with it, having never been filed as being there. The Close now costs not only what
they choose but who is standing where when it takes effect, and if they are bringing
anyone through those two questions collide.

Also: Ray Teasdale, the clearance foreman the timeline always implied and the roster
never carried — a Persuade success in pass 3 bought an interview with a man who did
not exist. Act One's failure case no longer assumes the party is at the farm, since
pass 3 spent the act twenty miles away and the automatic notch sat uselessly on the
other side of the county. The re-cut is answered on a success as well as a fumble,
with the reason: the entry is pegged to the older authority and there is no older
tree. Fix 7's conditional target moved onto the countdown row, because I missed it
myself eight minutes after writing it. A special for reading the child.

And the bimodality paragraph, which took three attempts to earn its place: held when
its citation failed, verified after another session found the cause — three separate
random generators, so a seed named a different fight in each tool — and corrected
once more when its illustration turned out to compare targeting modes rather than
the two ends. Published now as 23% nobody down against 45% everybody, decided by
round five, with the focus-fire claim removed.

Twenty-three fixes across three passes. The cadence is complete; what remains is the
print pack and two decisions that are not a scenario's to make.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:34:37 +01:00
slaguru666andClaude Opus 5 e84c85be02 R-265: name the denominator the two-down row is zero out of
The round-five race line read "zero in 2000 fights", which invites the reading
that no fight in the run was a wipe. It is zero out of the 84 that reach round
five with two of the three down — a small bucket, and the sentence should say so
before the figure goes to print in a scenario.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 01:17:51 +01:00
slaguru666andClaude Opus 5 8627fa3536 One generator, so a citation names one fight (R-265)
tools/playthrough.mjs exists to show a reader why a measured number is what it is. I cited
it to another session — read seed 2, see the wipe the 45% row is made of — and the
reproduction failed in front of them. They reported different outcomes at both seeds and
guessed the cause correctly from outside: the two tools were not drawing from the same
stream.

They were not. simulate.mjs used a private mulberry32 makeRng; playthrough.mjs had its own
LCG written to look like it. Both deterministic, both reproducible alone, and "seed 2"
named a different fight in each — which breaks the only thing the tool is for. Its own
comment claimed a seed here names the same fight there. check-focus carried a third copy of
that LCG, so the two guards described the same game with different dice.

makeRng is exported and both files use it. A playthrough seed is now exactly the first
fight of simulate.mjs --seed <n>: --runs 1 --seed 2 and the playthrough give 9 rounds, 4 of
4 down, 1 dead, both.

The other half was my citation rather than the code: the command I sent omitted --mode, so
it plays both targeting arms and prints two fights. They read the last line, I quoted the
first. The summary line now names the arm.

check-focus re-recorded under the shared stream; figures move a point or two. What it buys
is that the bimodality analysis now reproduces the published means exactly — 2.31, 3.03,
0.40, 0.42 against the four rows CLEAN GROUND publishes. Under the old LCG it agreed to
within a decimal, which looked like corroboration and was two experiments landing near each
other.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 01:11:41 +01:00
slaguru666andClaude Opus 5 796bb7df73 CLEAN GROUND: the second EXPOSURE table, and four ratios that moved with it
Another session re-pinned the main exposure table at 8f3e1ff after the harness
correction, and left the surrounding prose to me, which was the right split. Two
things were still outstanding.

The four-player cut carries its OWN table, nested inside a numbered list well below
the main one, and it was still on pre-correction figures: 3.24 / 2.09 / 40.2% / 0.85
and 4.00 / 3.98 / 99.1% / 1.45. Re-measured to 3.25 / 2.31 / 45.0% / 0.98 and
4.00 / 3.99 / 99.8% / 1.46. Easy table to miss and worth naming in the provenance so
the next reader does not have to work out which tables were in scope.

Four prose claims quoted ratios that no longer held. Six of the column wipe one party
in seven rather than one in twelve; ten wipe nine in ten rather than five in six; at
four players three wipe nearly half rather than two in five; and six hollow men take
a median thirteen rounds, not twelve. "Three of them is survivable" now also says
somebody dies in about one run in six, because deaths per run went 0.11 to 0.16.

Independently confirmed rather than taken on trust: my own run of the section's
published command, at its own declared cast of six and seed 11, matched the other
session's figures exactly on every comparable row — understudy 0.55 / 0.01 / 0.0% /
2 rounds, six of the column 4.79 / 3.03 / 14.8% / 1.55 / 14 rounds, ten 5.97 / 5.87 /
90.8% / 2.75, six hollow men 3.48 / 0.42 / 13 rounds. Two sessions measuring
separately and agreeing is better evidence than one measuring twice.

The argument the section exists to make is unchanged and slightly stronger. The
understudy still cannot hurt six agents; the column is deadlier; the steep stretch is
still between six and ten bodies. The cause is nothing about the column — a torso
vest no longer protects a head, so every unhelmeted agent is easier to hurt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:59:45 +01:00
slaguru666andClaude Opus 5 6e3ea8fa19 playthrough: read a scenario's own encounter, against its own cast
The tool could only narrate the guard's fight — the frozen four, at the pack size
focus-baseline records. CLEAN GROUND's EXPOSURE table measures something else entirely: a
declared cast of six at counts of 1, 3, 6, 10 and 15, which is the fight a GM running that
case will actually referee and the one whose numbers we have just re-pinned.

--creature, --count, --party, --seed and --mode now mirror tools/simulate.mjs, so a row
measured there can be read here in words. Positional form still works.

  node tools/playthrough.mjs --creature quiet_neighbours_npc --count 6 \
    --party ashcroft,bhattacharya,renshaw,braithwaite,pollard,okonkwo --seed 11

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:55:45 +01:00
slaguru666andClaude Opus 5 8f3e1ff48e CLEAN GROUND: re-pin EXPOSURE against the corrected harness
The table was measured at 5450521 and marked due for re-measurement, because R-264 changed
what simulate.mjs measures: hit location by body plan rather than species, armour per
location rather than one scalar, and flyers grounded by a lost wing. Re-run at 6f33525
with the cast, counts, runs and seed the section already declares.

The finding the section exists to publish is unchanged — the understudy still cannot hurt
six agents (0.55 hurt, 0.01 down, 0.0% wiped) and the curve between six and ten of the
column is still the steep part. What moved is the cost of fighting the column, and the
reason is the armour fix rather than anything about the column: a torso vest no longer
protects a head, so every unhelmeted agent is easier to hurt.

  six of the column   8.6% -> 14.8% wiped, 2.38 -> 3.03 down, 1.18 -> 1.55 deaths/run
  ten of the column  83.5% -> 90.8% wiped, 5.69 -> 5.87 down
  six hollow men      0.15 -> 0.42 down, 12 -> 13 rounds

Both spot-checked by running the published command rather than my own script, which is the
claim the section makes to a reader.

This file is timevans-c0's work and the re-measurement was its open note; it committed v0.7
first, so this lands as a separate commit on top rather than entangled with it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:52:09 +01:00
slaguru666andClaude Opus 5 6f33525b3a CLEAN GROUND v0.7: pass 2's seven fixes, and an opposed roll the game has not got
Desk pass 2 stressed Act Four across five contrarian branches at seed 9314 and is
committed alongside. The fixes from pass 1 held — beat 3's ungated tell worked and
the four-beat spine stopped the sprawl — but the stress found seven more holes.

The serious one: rehearsal step 5 is beat 3's guaranteed fallback, and in branch C
both sides rolled successes, which rules.mjs has no way to resolve. It defines no
opposed roll at all, while the hollow man's tactics text, slice-text.mjs and this
scenario all ask for one. Same class as Scent and Science (Botany): content naming
a mechanic the engine cannot perform.

GM ESSENTIALS now carries a SCENARIO-LOCAL ruling so the case is playable — both
roll, better band wins, ties to the agent, both fail and nothing happens — using
only banding the game already has, labelled a local ruling rather than a rule.
rules.mjs is untouched: whether the system gains a real opposed roll is not a
scenario's call, it is logged as an open question, and the text says to delete the
local ruling if that rule ever lands.

Verified against rules.mjs's own banding rather than by eye. Branch C now resolves
to Okonkwo resisting on equal bands. Branch D, with fix 7, has the understudy
prefer Ashcroft if he accepted THE OFFER, resisting at Difficult —
applyDifficulty(85,"difficult") is 42, the system's own grade and not a number I
invented — which finally makes the fiction and the numbers agree, because a
compromised anchor was previously the hardest man in the room to take.

Also in: the early-kill branch, which pass 2 measured at ten minutes of act and
thirty-five of dead air, now continues as Braithwaite's twenty minutes over a body
wearing Prichard's face, with nobody having yet asked where the real Prichard is;
a miss for Psychology, since the best line in the document cannot sit behind one
40% roll; a critical result for Borrowed Authority, which happens one roll in
twenty-five; step 5's target named as the lowest POW in the room, Okonkwo at 55%,
because a thing that has practised thirty years takes the easiest file; and one
sentence saying the hollow man's anchor immunity does NOT transfer, set up by
Ashcroft being skipped in Act Three so that he draws the wrong conclusion.

The EXPOSURE table is marked correct-as-of-5450521 and still needs re-pinning: the
harness rewrite landed at ad5fd57 and moved two of its four creatures. Not done
here, because it was a note in pass 2 rather than one of the seven.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:50:20 +01:00
slaguru666andClaude Opus 5 ad5fd57568 The harness was fighting a different animal (R-264)
Reading a narrated supporter fight showed it being hit on armR and head. It has wings; it
has never had arms. Three defects, all in the pipeline every published number comes from.

1. It located hits by species, not body plan — simulate.mjs read defender.species where
   the game writes spec.bodyPlan ?? spec.species ?? "baseline" into speciesProfile
   (build-packs.mjs:294). The barghest, kelpie and church grim were fought on two legs
   with arms, and the supporter with no wings, so the fight its tactics call the one the
   agents can win could not occur in a measured fight.
2. Armour was one scalar for the whole creature, and the harness's locations had no
   armour field. Bare wings, the grounded halving and the vital exemption — R-254 and
   R-255 — were invisible to every number. Worn armour was summed the same way, which put
   a stab vest on a cleaner's head.
3. Nothing was ever grounded: a wing could be ruined and the creature kept flying.

Fixed in the game's order — locate, then apply what that location carries, every term
imported from rules.mjs. A ruined wing calls groundedPlanFor and the wounds carry across
by severity through remapLocationDamage, the function _preUpdate uses.

A bug of mine no guard would have caught: remapLocationDamage returns { damage, moved,
rescaled } and my first draft passed the whole object where a damage map was expected, so
every wound a creature carried was forgiven the moment it came down. check-lethality would
have passed it — fewer wounds means a longer fight, which reads as a number moving, and
this commit moves numbers. Found by probing a landing by hand.

20 of 47 creatures moved, 18 deadlier and 2 less. The supporter goes 69.3% -> 25.1% wiped,
3.38 -> 2.16 down, second deadliest to fourth: it was being measured as a 30-hit-point
creature in uniform armour 9 that could not be grounded. The small rises elsewhere are the
party's armour no longer covering locations it never protected.

check-focus then caught the page overclaiming, which is what it is for: focus fire still
helps in all 30 but only 28 clear their own noise where 31 of 31 did. The guard was
asserting more than the page needs — the bestiary prints that count from the artifact and
cannot overstate it — so it now checks only what the page asserts outright, and the page
rewrote itself to "in 28 of them".

Both baselines re-recorded. Minor version, not a patch: the published numbers changed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:42:52 +01:00
slaguru666andClaude Opus 5 5dcaaf519a The simulator can be read now, not just totalled (R-263)
Every guard here reports a number per creature, and a number cannot say why a fight went
the way it did. That gap is what produced R-258 through R-260: each written from a side
harness built to watch a fight, each modelling something slightly different from the game,
two of the three wrong in ways no guard could catch because no guard was involved.

runFight takes an optional `say` sink. It reports what the simulator already decided — the
attack roll and its target, a defence and the penalty it was made at, the landing level
after a dodge downgrades it, damage against armour before and after armourAgainst, the
location, major wounds, disablement, death. It never touches the generator, so a narrated
fight and a silent one are the same fight; check-lethality and check-focus both still
match their baselines exactly with the hook in place.

tools/playthrough.mjs (npm run play) is its consumer, in the same commit deliberately: a
hook with no reader is the exact defect this project keeps finding in its own rules, and
adding one to the measurement pipeline with only a scratchpad file calling it would have
been committing the thing I have spent the session removing. Pack size comes from
focus-baseline.json so the fight you read is the fight check-focus measures; creatures
recorded as pinned are played solo.

Three redcaps, seed 20260913, same seed both ways. Spread fire: wiped in 10 rounds, 3
dead, and all three redcaps still standing — 39 hit points spread three ways so that none
of it finished anything. Focus fire: same opening, diverging at one target choice in round
1, party wins in 20 with two up. The +13.2 points check-focus records, seen once instead
of averaged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:30:14 +01:00
slaguru666andClaude Opus 5 104b588e86 R-262: the second R-261, renumbered, deferring to the one that was committed
Two sessions numbered an entry against the same committed log, which ended at
R-260, and both picked R-261. Mine was written first but was uncommitted, so the
other session could not have seen it and had every reason to think the number was
free. When it staged docs/REVIEW_LOG.md my entry was sitting in the file, so it
went out inside 1d915c5 under that commit's message, and HEAD reached origin with
two R-261 headings in it.

Mine renumbers to R-262 and moves below theirs so the log stays monotonic. Theirs
keeps R-261 because theirs is the one that was committed; this diff moves and
renumbers nothing but my own prose, and their entry appears in it only as context.

The hazard is now a matter of record in both directions: their note at the foot of
R-261 caught check-rollable arriving from another session mid-build and handled it
without clobbering anything, and this is the same collision on a file whose
convention is to append to the end. A shared working tree makes the end of
REVIEW_LOG.md the likeliest place for two sessions to meet, and an uncommitted
entry there has no claim on its own number.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:16:04 +01:00
slaguru666andClaude Opus 5 1d915c55cf check-focus: the focus-fire claim is an artifact, not a sentence (R-261)
R-258 put a tactic on a GM-facing page from an unguarded harness, R-259 found it worth
nothing, R-260 found the replacement right for the wrong reason. Three corrections, each
landing as prose with nothing checking it — the arrangement that let ddc4f99 describe a
game nobody was playing.

tools/focus-baseline.json records, per creature, the pack size and the spread-fire and
focus-fire win rates. check-focus re-measures all of it on every build and compares
exactly, with the party, seeds, run count and seeding scheme recorded alongside so numbers
taken under different conditions are refused rather than compared. The bestiary READS the
artifact instead of restating it, and check-bestiary refuses a page that has fallen behind
it. Page, guard and simulator cannot disagree.

The pack size is recorded rather than re-chosen: a fight at 0% or 100% cannot show an
effect, and a guard that picked again each run would let a changed creature move quietly
to a different question and pass. 31 of 47 creatures land in the measurable band; the
other 16 are recorded as pinned, with the rate that pinned them.

It guards the claim as well as the numbers. The page says focus fire helps in every fight
in doubt; check-focus fails if any row's gain reaches zero or stops clearing its own
noise. That failure means rewrite the page, not re-record the baseline.

The run count was chosen by evidence. 1000 x 3 seeds costs 8.5s and takes the suite from
2.5s to 13.7s. I tried 500 to halve it and the claim-check failed — at 500 runs one row
no longer clears its noise, so "without exception" is not supported by that much
sampling. Recording twice at 1000 gives byte-identical files.

Negative-tested four ways, all firing: a creature quietly made nimbler (redcap dodge
75 -> 85, spread 40.6% -> 27.6%), a baseline under different seeds, a hand-edited page,
and the claim failing at 500 runs.

Guard eleven (check-rollable) arrived from another session mid-build; this is twelve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:13:28 +01:00
slaguru666andClaude Opus 5 555fa761c0 check-rollable: guard eleven, because a real skill is not the same as a route
check-scenarios resolves every skill a scenario NAMES against the catalogue, which
is a different question from whether anybody present can roll it. CLEAN GROUND
shipped four commits with three clues gated on Track (base 10), Navigate (base 10)
and Science (Botany) — base 1, so the 1% floor was the whole of it — and every
guard passed, because all three are perfectly real skills. A desk playtest found
it by auditing the acts against the sheets the scenario casts. That audit is
mechanical, so it belongs in the build.

Two tiers. Corpus-wide, some roster agent must reach VIABLE for every skill any
scenario names. Per scenario, a document that DECLARES its cast is held to that
cast instead, and that is the tier that catches this defect class.

The cast is declared rather than inferred, and that is the interesting part. The
first version scraped pc_ keys out of the prose and swept up the substitutes named
in CLEAN GROUND's player-count scaling — a cast of nine instead of six, which put
Sandoval and his Track 35 in scope and made the guard pass the very bug it was
written for. A guard that guesses the cast is worse than none, because it reports
success. CLEAN GROUND now carries a cast comment and the guard reads it off the raw
text, since scenarioText strips HTML comments.

Verified load-bearing rather than assumed: re-injecting the original Track tag into
the real CLEAN_GROUND.md fails the guard, naming the skill, the base chance and the
declared cast. Worth recording that the corpus-wide tier would never have caught
it — Lindqvist trains Botany at 40, so it is rollable by the roster and simply not
by the six who were cast. The first fixture test passed for that reason and misled
me; only the declared-cast tier finds this.

VIABLE is 25 and is justified, not picked: it is the commonest base chance in the
catalogue, what an untrained agent brings to Spot, Listen or Brawl, so it is the
level the game itself treats as worth attempting. Below it a clue is not gated, it
is buried.

check-scenarios exports its tag parser rather than growing a second copy, behind
the invokedDirectly pattern simulate.mjs already uses; a duplicated parser is
exactly what this repository's one standing law forbids. update-readme then caught
me fairly — it cross-checks the advertised guard list against npm run check — so
the guard is registered there too and the README advertises eleven in all three
places.

No REVIEW_LOG entry: the log is clean at R-260 and is being appended to every few
minutes by concurrent work, so the end of that file is the likeliest place to
collide. Left for whoever next touches it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:10:00 +01:00
slaguru666andClaude Opus 5 48216bae10 Focus fire across all 47, and the same confound one turn later (R-260)
Measured in simulate.mjs. For each creature, the pack size whose spread-fire win rate
lands nearest 50% — a fight at 0% or 100% cannot show an effect, which is why R-259's
first sample was three-quarters useless — then focus versus spread, 2000 fights across
three seeds.

31 of 47 creatures had a pack size that could show anything. Focus fire helped 31 of 31,
by more than that row's own noise 31 of 31 times, mean +12.8 points. Best is 6x The
margin, 40.4% -> 61.1%. The other 16 are unmeasurable rather than unaffected: eleven are
trivial six at a time, five are hopeless in pairs.

R-259's decomposition was confounded, and I wrote it while correcting a confound. It
credited the defence ladder with 4-5 points by comparing dodge <=30% against dodge >=55%
— but the low-dodge samples were PAIRS and the high-dodge ones TRIOS. Held at a fixed
pack size, dodge is worth 1-2 points. Pack size is the driver: 8.0 points for a pair,
14-15 for three or more, then flat. What focus fire buys is that a dead creature stops
attacking and a half-dead one does not attack any less.

Two failures, one cause: comparing groups that differ in more than the thing being
measured. The control is cheap and I did not run it until the third time.

The bestiary advised concentrating fire and gave the ladder as the reason — right advice,
wrong reason. It now gives the reason that survives measurement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:03:02 +01:00
slaguru666andClaude Opus 5 bf8db68383 CLEAN GROUND v0.6: the eight fixes desk pass 1 earned, and its log
Desk pass 1 is committed alongside, seed 4271 and the roll stream printed, so
the run is re-checkable rather than remembered. It failed the scenario, which is
what it was for.

The pre-flight audit did the real damage before a die was rolled: Track, Navigate
and Science (Botany) were named by the acts and rollable by nobody in the cast,
and Botany is base 1 — the same unusable-test defect fixed in Act Four two
commits earlier and left standing in Act One. check-scenarios cannot see this; it
resolves skill names and has no opinion on whether anyone present can roll one.

Then the dice found the rest. Xenology (Baseline) failed and Act Four had no
route left, which is the concentration risk logged as an open question arriving
as a dead end on the first run. A fumbled Anomaly Lore had no written result and
I invented a ruling at the desk. Act One's failure case backstopped arrival
rather than the peg. The act ran 4:25 against 3:55 on three lucky rolls.

Fixed: the notch is automatic and the three broken routes moved onto Spot,
Knowledge and Anomaly Lore; every roll in the document now carries a written
miss; the Act Four tell is ungated, with Xenology buying it early and privately
instead of holding the only key; the fumble is answered by the re-cut delusion,
tried once, failing in silence; Act Four has a four-beat spine because with no
mechanical threat the structure has to be in the text; and THE OFFER finally
fires Ashcroft's seam, priced at 2 Coherence he must accept before being told.

Verified by re-running seed 4271 through the rewritten acts, so the identical
rolls that broke the run were put back through the fix. Every one now has an
answer, and Act One's three must-land clues all land despite two failures.

Timing is improved and NOT solved: cuts recover 20-25 minutes, landing near
4:00-4:05 on a 3:55 budget, and on-the-minute is a fail for strangers. A third
cut is likely needed and the candidate is named. Whether Act Four's spine holds
45 minutes, and whether THE OFFER plays as a decision, cannot be settled from a
desk and are recorded as such.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 00:00:29 +01:00
slaguru666andClaude Opus 5 995f3fa94e The firing order was worth nothing, measured properly (R-259)
R-258 put a tactic in the bestiary on the strength of a table-side harness — cheapest
weapon first, best weapon last, 10.7 points of win rate across 24 orderings. Measured in
simulate.mjs, the pipeline every published number comes from, it is worth +0.27 points,
with per-seed differences of -1.5 to +1.8 against 2.6 points of noise on a single arm.
Zero.

The toy lied for two reasons, both mine. Its party had one uniquely valuable weapon (an
anti-materiel rifle the borough does not own, so unhalved, worth double anything else) so
there was something to sequence around; the frozen party is 4.09, 3.98, 1.43, 1.43 —
two near-identical pairs. And the toy fixed the order every round, while the game
re-rolls Reaction every round and has no rule for holding an action, which I checked
before measuring. The order is not a decision the rules offer, and I had written table
advice for it.

The page is corrected: the ladder stays, because it is derived and true, and it now says
you cannot choose who goes first.

What is worth doing, measured the same way: committing a round's attacks to one target,
in fights that can actually move (a fight at 0.2% or 100% cannot show an effect and three
of my first four samples were pinned there). Against dodge <= 30% focus fire gains 7.6
points, which is just killing attackers sooner; against dodge >= 55% it gains 12.2, so
about 4-5 points is the defence ladder and the rest is arithmetic unrelated to dodging.
Separating them needed contested fights at both ends of the dodge range — without that
control I would have credited all 13.8 points against three redcaps to the ladder, which
is R-255's mistake again.

runFight gained two hooks, off by default and unused by the baseline: partySequence
rearranges the party within the slots initiative already gave them, leaving enemies where
they fell so the experiment isolates agent order from who acts before the creature; and
partyTargets "focus" concentrates fire. Both roll the same dice, and check-lethality
confirms all 47 creatures still fight exactly as recorded.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:58:22 +01:00
slaguru666andClaude Opus 5 f932a79121 The firing order, in the bestiary, generated (R-258)
DEFENCE_STEP is -30, so a creature's Dodge is not a percentage it has for a round — it is
one it has once or twice. The median dodge in the book is 45% and goes 45 -> 15 -> 1
inside a single round. No player-facing document said so, which hid a real decision:
what order the party shoots in.

The bestiary now has a section on it. Only a landing hit spends a defence, so a miss
strips nothing; each landing hit makes the next attack of that round easier; therefore
the cheapest reliable weapon fires first and the one you most need to land fires last —
against the supporter, the weapon the borough does not own.

Everything it states is generated from DEFENCE_STEP, resolveBands and the statblocks: the
step, the ladder, the median, the spread (13 of 47 creatures stripped by one landing hit,
25 by two, 9 by three) and the list of the hardest to strip. Negative-tested by setting
the step to -15 and -20; the page rewrites itself both times. No win rates are published:
the ordering measurements come from a table-side harness that ignores wound penalties,
bleeding and dying, so the page states the mechanism and quotes no percentages.

My first draft used the dodgiest creature in the book as the worked example — 80%, three
landing hits to strip — directly beneath a claim that the first attack of the round eats
the dodge. True of a modest dodge, false of a good one, and both were on the same page.

tools/bestiary.mjs --check has existed since the document did, with the comment "(for the
guards)", and no guard ever ran it: a check written and wired to nothing, the same shape
as every rule found computed and never read. That was tolerable while the page restated
statblocks and is not now that it derives from rules — change DEFENCE_STEP and the
document lies to a GM. check-bestiary.mjs is the tenth guard, negative-tested both ways
it can fail: a rule change that staler the page, and a hand-edit of the page.
update-readme flagged it as "run by the build, not advertised" before I listed it, and
the README's count word went from nine to ten by itself.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:51:04 +01:00
slaguru666andClaude Opus 5 15da21d265 CLEAN GROUND: the understudy cannot hurt them and the refugees can
Measured rather than asserted: tools/simulate.mjs, 2000 runs a row at seed 11
against the named cast of six, at a clean tree, with the command in the section
so any figure can be re-checked after a rule moves. Re-ran two rows to confirm
determinism before publishing them.

The understudy alone is 0.48 of six hurt, no wipes, median two rounds — a 1d3
punch at 60%. Six of the column wipe one party in twelve and ten wipe five in
six, with the curve between them almost vertical. So the lethal encounter in
this scenario is not the monster in Act Four, it is the refugees in Act Two,
which is the case's moral argument turning out to be its combat maths too.

Four consequences written up for the GM: do not buff the understudy, because the
horror is that it passed every test the party had; adding hollow men buys rounds
and not danger, and six of them cost a median twelve rounds that the Close then
pays for; the column must never become a threat, for the second reason that the
table will lose; and the four-player cut is a different game, where three of the
column already wipe two parties in five.

Every row is a floor — the harness models no bleeding, Panic, Coherence, cover
or fire modes, and Panic and Coherence are both live here. Act Two now carries a
pointer to the section, since that is where the dangerous encounter is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:45:01 +01:00
slaguru666andClaude Opus 5 5450521ed2 CLEAN GROUND: four sheets of paper, one of which is a trick
CG-H01 is a coroner holding something he cannot file — unfiled man, ninety-year
-old joints on a forty-year-old body, and boots resoled nine times by hand,
which is the premise in one detail and is not pointed at.

CG-H02 is the 1962 minute. Paragraph 4 has the Registrar warning that a place
recorded as the place the displaced go must afterwards be furnished with
displaced persons, and the Committee noting it without regarding it as an
obstacle. Paragraph 5 orders a review that was never held. It is minuted by
A.E.W., Clerk (Junior), who is Bhattacharya's predecessor, so that sheet goes
into his hand and nothing is said.

CG-H03a and CG-H03b are one almanac page each, eleven years apart, same hand
and same ruled paper. Seven days of weather and miles walked, and a column
headed TO CLEAN GROUND reading 41 mi on every line of both. Laid side by side
there is no roll and no explanation: the table says it out loud. The counts
carry the cost — fifty-three then, forty-one now.

Numbers checked against the rest of the document: 41 survivors including the
six hollow men, 11 duplicated miles, and the 41-mile figure inherited from 1962
when it was true on the real map and untestable from inside ever since.

Still outstanding: a print-ready A4 pack at 11pt. H03a and H03b must print
identically or the trick dies.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:38:13 +01:00
slaguru666andClaude Opus 5 c3a337314f One armourAgainst, in the authority, shared with the harness (R-257)
Left open by R-256. Two rules decided how a hit meets armour — armourAgainst (a critical
ignores it, a special halves it, rounded down) and damageAfterArmour (what is left never
goes below zero). Both lived in ringbrp.mjs, which is the game. Neither lived in
rules.mjs, which is the authority, so the guard that forbids redefining a rule had
nothing to forbid. tools/simulate.mjs applied armour from its own inline copies of both,
as it had since it was written.

They agreed, which is the whole point. Nothing published was wrong and no guard could
have said they were two things rather than one. But every number in BESTIARY.md, every
row of the lethality baseline and every measurement quoted from R-251 onward comes out of
that harness: change how a special hit meets armour and the game changes, the numbers
describing the game do not, and all nine guards still pass. Same shape as ddc4f99, with
no tolerance to blame and no reason it would ever have surfaced.

Both rules now live in rules.mjs. ringbrp.mjs imports and re-exports them because they
are public API at game.ringbrp. The simulator imports them. Verified live in the world
that game.ringbrp.armourAgainst and the rules.mjs export are the same function object,
not two that agree.

Proof it changed nothing: check-lethality replays 47 creatures over 2000 fights each and
every one fights exactly as recorded — no tolerance, no drift — across roughly four
million resolved attacks, all of which now go through the moved rule.

check-rules fails any file outside rules.mjs that halves armour or subtracts it inline,
naming file and line. Negative-tested by restoring the harness's original three lines
verbatim (both patterns fire) and by redefining armourAgainst in ringbrp.mjs, which the
name-based guard now catches because the rule finally lives somewhere it belongs to.
Arriving in rules.mjs also tripped the spot-check requirement immediately: eight new
spot-checks, and what a special does to hide 9 is now written down once.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:33:58 +01:00
slaguru666andClaude Opus 5 bb10613992 CLEAN GROUND: three things the GM says out loud, and the words they must not
The crossing, the first sight of the column, and Ivy at the stump — placed in
their acts rather than collected in a section, so the GM meets each one where
it is needed. Four sentences, three and three.

The notes around them carry more than the prose does. The crossing must not say
nuclear, 1962 or ash: the Geiger says the first, Bhattacharya says the second,
and ash is a word a player should reach for unaided. The column's six at the
back are the hollow men and are one item in a list, not a pause. Ivy's question
is reported rather than quoted so it survives both branches, and she does not
argue, plead or bargain — anything that makes her pitiable cheapens a decision
that has to be taken by people who respect her.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:30:06 +01:00
slaguru666andClaude Opus 5 f847cb2171 The sheet header said 9 while the body said 4 (R-256)
Verifying R-255 on a live sheet found the rule working everywhere it was built and
contradicted in the first place a GM looks. The header's ARMOUR field is the hide the
creature HAS; on a grounded beast the hit-location table under it read 4 and the header
still read 9. Nothing computes off that field, so nothing in the code was wrong. It was
wrong at the table.

The field stays editable and stays 9 — that is the creature's hide and what a GM types
into. Under it, when system.grounded is set, the sheet now says what is in play:
DOWN: 4 · CHEST 9, derived from exposedHideFor rather than from a second opinion, with
the reason on the tooltip. Verified live: no badge in the air, and grounded the badge and
the location table agree at 4 with the forequarters at 9.

check-rules forbids redefining a rule by NAME, which misses how this goes wrong in
practice — nobody redefines exposedHideFor, they write Math.floor(hide / 2) in the sheet
because it is cheaper than an import. I wrote that version first and check-rules passed
it. It now fails any file outside rules.mjs that halves a hide inline, naming file and
line; check files are exempt because stating the expected value independently is what a
test is for.

That guard also turned up something I have not fixed, recorded in R-256: armourAgainst
lives in ringbrp.mjs rather than rules.mjs, and tools/simulate.mjs has its own inline copy
of it. They agree today so no published number is wrong, but every figure in the bestiary
and the lethality baseline comes out of that simulator.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:29:41 +01:00
slaguru666andClaude Opus 5 c0d33ee81d Hide 9, grounded 4, vital exempt — the borough is worth 56 points again
R-254 shipped the belly rule and called +6.4 points "modest on purpose". That read the
wrong statistic. +6.4 measured whether grounding helps; the question was whether the
borough still matters, and the gap between fighting the supporter on borough ground and
off it had fallen from 60.6 points to 44.9. Half damage from every departmental weapon is
meant to be the fight's central problem, and I had quietly taken sixteen points off it
while reporting a small number about something else. Same error as R-251.

Three changes that only work together:

  - hide 7 -> 9, restoring the weight on the axis that should hurt
  - grounded still halves it, 9 -> 4, which an ordinary round beats
  - exposedHideFor now takes the location's kind and leaves `vital` unhalved: a beast on
    its belly is not presenting its chest to the floor

Measured: 28.4% on borough ground flying, 68.4% grounded, 84.6% off it — a 56.2 point gap
against 44.9 before. Predicted 28.4 / 84.3 / 55.9 before building.

The composition of the three hide functions lives in prepareDerivedData where no test
could reach it, and check-anatomy's guard 6 is deliberately one-sided so it would not
have caught the vital losing its exemption. check-behaviour now composes the same
expression from the real supporter spec and the real tables. Negative-tested four ways:
removing the exemption, un-baring the wings, removing the halving, and inflating the hide
past what a round can beat each fail it with the right message.

Cost: the supporter goes from fifth to second deadliest creature in the book (2.84 -> 3.38
down, 46.8% -> 69.3% wiped). check-lethality refused the build until that row was
deliberately re-recorded.

BESTIARY.md printed the new hide and said nothing about it halving, because the body-plan
blurb predates the rule. The README said "eight guards" in three sentences above a
generated block listing nine. Both are the signature defect in prose: a number written
down that nothing reads. Both now generate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:15:35 +01:00
slaguru666andClaude Opus 5 ee4e687c6c CLEAN GROUND casts six from the duty roster, and Scent was never a test
No new sheets: Ashcroft, Bhattacharya, Renshaw, Braithwaite, Pollard and
Okonkwo, cast for six non-overlapping lanes with an act each. Skill figures
read out of expandFromRegister rather than retyped, so the compendium stays
the authority.

Two defects the casting found. Scent's base chance is 0, so the 1% floor was
the whole of it and Act Four's "only test that works" was a roll nobody could
make; it is Xenology (Baseline) now, which is what the skill is for. That puts
the one reliable test on Braithwaite's sheet alone, so the scaling note refuses
to let him be dropped and the risk is logged as an open question.

Bhattacharya's private box now carries RESERVE ENTRY, which hands the
briefing-or-discover decision to a player instead of the GM.

Still an outline: no read-aloud, handouts, Act Four exposure model or playtest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:14:23 +01:00
slaguru666andClaude Opus 5 ca040b7926 The belly is not armoured (R-254)
R-95 made losing a wing change the animal. R-96 took the hide off the
wing so losing one was possible. Separately each was right and each was
measured. Together they gave the party a soft target and deleted it the
moment the party hit it:

  winged     6/20 ranged faces land on armour 0 (a bare wing)
  quadruped  0/20

A service round on borough ground averages 3.75 after halving — 3.75
through a bare wing, 0 through hide 7 — so grounding the creature took
the party's chance of winning from 44.9% to 1.4%, while its own tactics
told the GM that grounding it was the fight they could actually win.

Found by measuring something else. Every aimed-shot configuration made
the party worse, and the most aggressive was the worst: aiming at a wing
at -20% grounds it in 99% of fights and HALVES the win rate to 10.1%.
Buying the objective reliably was the fastest way to lose, which only
makes sense if the objective is a trap. So no aimed-shot rule; the
problem was never the lack of one.

It also retires the "+31 points" I reported for grounding at 1.7.3. That
was win-rate-if-grounded against win-rate-if-not — selection bias, since
the parties that grounded it were the ones shooting well. Forcing the
grounding gives the causal value and it was -43. A correlation of +31
and a causation of -43 out of the same mechanic.

The fix: a heraldic beast is armoured the way it is drawn, across the
back and the flanks. On its belly half that hide is no longer in the
way, so exposedHideFor halves natural armour while system.grounded is
set. Hide 7 becomes 3.

                      flying   grounded   worth
  on borough ground    45.3%     51.7%    +6.4
  off borough ground   90.6%     97.9%    +7.3

Modest deliberately. Grounding should help, not decide — the borough is
still the real answer. Losing its damage modifier was worth +26.5 and
would have made the wing the whole fight.

check-anatomy gains a sixth property: a flyer must not be harder to hurt
on the ground than in the air. The first version probed at a single
4-point round and declared the fix broken, because 4 sits inside the one
band where a bare wing beats a halved hide — below 5 damage the creature
really is better off grounded, above it much worse. Integrating across
1-12 gives 2.83 flying against 3.75 grounded and reads it correctly.
Negative-tested against 1.7.8's behaviour, which it names.

The lethality baseline is unchanged: its simulation never grounds
anything, so system.grounded never comes up there.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:57:31 +01:00
slaguru666andClaude Opus 5 97fe2704e8 Measure creatures over 2000 runs, not 200 (R-253)
R-252 established that a recorded figure carried several points of slack
at 200 runs and that only more runs narrows it. This is that.

Measured by taking every creature under four different base seeds and
looking at how far the four answers sat apart, which is the noise a GM
reading the bestiary is unknowingly trusting:

                   mean spread    worst creature
  200 runs          1.28 points     11.5 points
  2000 runs         0.36 points      2.7 points

The worst case is what mattered. One creature's published wipe rate
could be eleven points from the same creature rolled with different
dice, on a figure printed in docs/BESTIARY.md for somebody to plan an
evening around. Under three now.

It corrected 19 of 47 published figures, mean 0.35 points: the arrears
6% -> 8.9%, the supporter 44% -> 46.8%, the nuckelavee 13.5% -> 16%.
Each was a sampling artefact printed as a property.

The cost is the part worth recording, because it is why this was never
done. I guessed "maybe a minute of build time" when I suggested it,
which was wrong by a factor of thirty and would have been a fair reason
to say no:

  check-lethality alone   0.29s -> 1.88s
  whole nine-guard suite           2.55s

BESTIARY.md regenerates from the baseline, so its run count follows
automatically; its header now also says the seeds are derived per
creature, since "at seed 11" stopped being the whole truth in R-252.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:33:40 +01:00
slaguru666andClaude Opus 5 2dbea88d4b Seed the lethality sim per creature (R-252)
Each creature now derives its own seed from its key, FNV-1a mixed into
the base seed, instead of every one of them being measured against seed
11.

This is the second reading of the request and the one I had not tested.
What I checked before was position independence — whether a creature's
numbers depend on its neighbours — and that was already true and still
is: inserting a creature ahead of the barghest changes 0 of 47 existing
rows under the new scheme, same as the old. What was NOT true is that
each creature had its own dice. All forty-seven faced the same two
hundred sequences.

Measured, because the argument for doing it is better than the result:

                                  shared 11   per-creature
  mean wipe rate across bestiary     5.67%        5.67%
  mean agents down                   0.538        0.522
  rows changed                         --        34 of 47

Seed 11 was not biasing the book. There was no systematic luck to
remove, and the aggregate is unmoved to two decimal places. What the
change buys is decorrelation: the error in each row no longer comes from
the same draw as every other row.

The useful number fell out of the comparison rather than the change.
Individual creatures moved up to four points of wipe rate purely from
being handed different dice — the courier 3.5% -> 7.5%, the long walker
66.5% -> 62.5%, quarantine unit 84.5% -> 88.5%. That is the sampling
noise inside any single recorded figure at 200 runs, and it means these
numbers are an exact regression fingerprint and a loose description of a
creature at the same time. Only more runs narrows the second; more seeds
does not. R-252 says so on the page.

seedMode is recorded alongside the numbers and checked, because changing
how a seed is derived moves every row without changing SEED itself. A
baseline from the old scheme is now refused rather than compared against
this one silently and wrongly — verified by running the new code against
the old file before re-recording.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:28:45 +01:00
slaguru666andClaude Opus 5 e54ce9130d R-251: measure what ddc4f99 actually did, four commits late
The baseline needed no re-recording — e5dc9b5 already captured these
numbers, it matches HEAD's code exactly, and it differs from 4b71859's
in precisely the 26 entries ddc4f99 moved. What was missing was any
record of WHAT that change did, since it was folded silently into a
commit about wings.

Isolated by replaying 322389b and ddc4f99 against the same party, seed
and counts, so the figures are ddc4f99's own and not contaminated by the
four commits after it:

  creatures whose numbers moved          26 of 46
  deadlier                                3
  less deadly                             8
  unchanged wipe rate, moved elsewhere   15
  mean change in wipe rate               -0.17 points

Routing every blow through a hit location REDISTRIBUTED lethality
without raising it. Creatures with one big attack got slightly less
dangerous, because a blow that used to come off a single pool now has to
beat the armour covering wherever it landed; creatures that attack often
got slightly more dangerous, because they now accumulate damage in a
limb and disable it. Across the bestiary those cancel to within a fifth
of a point. Largest moves: the courier 6% -> 3.5%, the arrears 7.5% ->
9.5%, the stanchion 26% -> 28%, the long walker 68% -> 66.5%.

The log entry also records the two corrections I owe this thread, both
from explaining before measuring: the seeding was always per creature,
and the claim in check-lethality's header that I called untrue was true.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:24:34 +01:00
slaguru666andClaude Opus 5 4cfacd47fe check-lethality compares exactly, because it already seeded per creature (R-97)
I asked for this on a false premise of my own: I reported that adding a
creature shifted a shared random stream and perturbed every other
creature's recorded number. That is not true and the code never did it.
measure() builds its own mulberry32 from the seed on every call, and
check-lethality calls it once per creature, so a creature's numbers do
not depend on its neighbours or its position. Measured rather than
argued: inserting a creature ahead of the barghest changes 0 of 47
existing entries. The file's own claim — "the only thing that can move
the number is a change to the rules or to the creature" — was accurate
all along, and my last commit message says otherwise. It is wrong.

The real cause, found by replaying each commit against the baseline as
committed at 4b71859:

  4b71859  baseline recorded            0 of 46 differ
  322389b  bestiary                     0 of 46 differ
  ddc4f99  hit locations reach combat  26 of 46 differ   <-- here
  a90c4f3 .. e5dc9b5                   26 of 46 differ

ddc4f99 routed every ordinary blow through the hit location table. That
is the largest change the combat system has had and it moved 26 of 46
creatures, which is correct and expected. What is not correct is that
nobody noticed for four commits: each creature moved by one or two
points, the guard allowed six, and it reported OK while describing a
game nobody was playing.

So the tolerance goes. It exists for sampling noise and there is no
sampling noise here — same party, same seed, same counts, and two
recordings of unchanged code are byte-identical. Anything that moves is
a real change, which is the entire point of the file. `rounds` is now
compared too; it was recorded and then never read, so a creature could
take a round longer to kill forever without a word.

Because exactness only means something if the measurement is exact, the
guard now proves it instead of assuming it: one creature measured twice
must come back identical, and it says so plainly if a future change
reaches for Math.random.

Negative-tested. A 2% change to locationMaxHp now trips 8 creatures at
+1.5 and +0.5 points of wipe rate — every one of which the old tolerance
would have passed. Breaking determinism is caught and named.

Also fixes update-readme, which advertised 8 guards while the build ran
9: check-anatomy was added without touching the list, which is precisely
what the comment above that list already warned had happened once. The
list is no longer trusted — it is checked against the `check` script in
package.json, and refuses to write a README advertising a different set
than the build runs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:22:19 +01:00
slaguru666andClaude Opus 5 e5dc9b5299 Hide does not grow on membrane (R-96)
Option H, measured before it was built. Losing a wing already mattered
once it happened — a grounded supporter was 40.5% to be killed against
9.3% for one still flying, a swing of thirty points. It almost never
happened: the wings carried the creature's own six points of heraldic
hide, so folding one meant beating armour six eight times over, and it
occurred in 9% of fights. The rule was reachable, not weak, and every
option that made grounding HURT more moved the win rate by under five
points because you cannot spend a state you never reach.

So the lever is the wing, not the consequence. A location may now be
`bare`: worn armour still covers it — barding a wing works exactly as
before — but the animal's own hide stops at the edge of the membrane.
The supporter's wings are bare, and it gets the toughness back where a
six-hundred-year-old record should carry it: hide 6 -> 7, CON 20 -> 36,
so 22 hit points become 30. STR and SIZ are untouched, so the damage
modifier stays +2d6.

Measured over 20,000 fights against the same four agents:

                        grounded    on borough    off borough
  before                     9%       12.5% win    85.6% win / 14.4% wiped
  after                     67%       22.1% win    83.5% win / 16.5% wiped

The wing shot becomes the play. Fighting it on borough ground stays a
losing proposition, so ARGENT AND GULES is still the real answer and
grounding improves a bad fight rather than replacing the solution — and
the fight off borough ground keeps its teeth, marginally more lethal
than before rather than less. Bare wings ALONE was the trap: it made
grounding routine and turned the off-ground fight into a 96% walkover
with a 3.8% wipe rate, buying the text at the cost of the encounter.

check-anatomy gains the property this whole thread was about: a plan
whose behaviour turns on losing a wing must not armour that wing with
the creature's own hide, or the rule is decoration. Negative-tested by
putting the hide back.

Also re-records the lethality baseline, which was ALREADY stale: HEAD's
own code reproduced 27 of its 47 entries differently, because the
supporter joined NPCS in ddc4f99 and shifted the shared random stream
for every creature measured after it. Every drift sat under the guard's
six-point tolerance, so it passed while being wrong. Worth knowing that
the file's claim — "the only thing that can move the number is a change
to the rules or to the creature" — is not currently true: adding any
creature perturbs the rest. Seeding per creature would fix it and is
not done here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:16:54 +01:00
slaguru666andClaude Opus 5 77465baa30 A flyer with a hole in a wing is a quadruped (R-95)
The supporter's tactics have said this since it was written: "It is a
flyer, and a flyer with a hole in a wing is a quadruped: disable either
wing and it is on the ground for the rest of the scene, which is the
fight the agents can actually win."

Playing a full combat against it showed the sentence was decoration.
`flightLost` was computed, printed on the NPC sheet as GROUNDED, and
read by nothing. Both wings disabled cost 20% off PHYSICAL rolls, and
Brawl is a MELEE category, so woundPenaltyFrom returned 0 and a grounded
supporter attacked at exactly the 75% and exactly the 1d6+1+2d6 it had
in the air. In the played fight it was grounded from round five and went
on to kill one agent, knock out a second and leave a third dying.

Losing a wing now changes the animal. A plan declares what it becomes —
winged says `grounded: "quadruped"` — and hitLocationRoll drops the
creature onto that plan the moment a wing is disabled or destroyed. The
wings leave its hit chart and the six ranged faces they covered go back
to the body: vital hits rise from 3 faces in 20 to 5. Every other wound
moves across on the R-94 remap with its severity intact.

The wing's own damage is deliberately dropped rather than carried, and
cleared in its own update so the remap never sees it. A ruined wing must
not arrive as a ruined foreleg — the creature is not lamed, it is
earthbound, and the injury has already been paid out as the change of
shape.

check-anatomy gains a fifth property: a declared landing must exist,
must have no wings of its own, must not itself be a flyer, must have
room for every wound the flyer was carrying without two collapsing onto
one location, and must not heal a disabled location on the way down.
Three induced failures confirm it fires; the third — landing somewhere
with too few locations — passed at first because I had not stated the
capacity property, and the guard was sharpened until it caught it.

Measured, and reported honestly: this does NOT deliver the fight the
tactics text promises. Over 4,000 simulated fights the win rate moves
12.7% -> 12.1% on borough ground and 85.8% -> 86.3% off it, because
grounding only happens in 9% of fights there and arrives late. What
actually decides this encounter is ARGENT AND GULES: 11.4% win on
borough ground against 85.4% off it. The wing rule is now real and
mechanical, but the creature's advice still points the GM at the wrong
lever.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:02:30 +01:00
slaguru666andClaude Opus 5 4a80cc1eca Body plans keep what a wound MEANT, not just its number (R-94b)
1.7.1 carried wounds across a change of body plan by moving the raw
points. Playing it showed that is the wrong invariant. A location is
disabled at its maximum and destroyed at twice it, those maxima come
from `frac`, and the plans disagree — an arm is 0.35 of the body and a
foreleg 0.42 — so moving the number silently changed the meaning.
Measured across the 20 plan changes: 234 severity flips, 138 of them
turning a location that was merely disabled into a destroyed one. A
destroyed arm arrived as a working-ish foreleg; two disabled arms
stacked onto one Vesh grasping limb and arrived destroyed.

So severity is now the invariant. A hurt location arrives hurt, a
disabled one disabled, a destroyed one destroyed; the points are
rescaled to the destination's own maximum to keep that true, and two
wounds sharing one location take the worse rather than the sum, because
relabelling a creature's anatomy must not destroy a limb that nothing
in play destroyed.

Correspondence is now stated rather than inferred. Every location gains
a plan-independent `slot` (lowerR, upperL, vital, head...), and the
remap matches on slot first. The previous version inferred it from
`kind` plus table order, which inverted left and right on every
crossing: a wounded right arm came back as the opposite hind leg. Where
a destination has no matching slot the fallback prefers the same side
and the same height, so a wing becomes a foreleg rather than a hind leg
and a left wing becomes a LEFT arm. The vesh and the cadence are not
bilateral — one grasping limb, five interchangeable units — so their
slots carry no side, which is a fix to my own first pass: giving them
sided slots was a category error the side guard caught.

check-anatomy now proves all four promises over every ordered pair and
severity band: nothing is stranded, severity is preserved, left never
becomes right and fore never becomes hind between bilateral plans, and
no update deletes a wound it is also setting. 432 carried wounds, 0
flips, down from 234. Five induced failures confirm each assertion
fires; two of my first attempts at those did NOT fire and were sharpened
until they did.

Played through in a live world: a church grim filed as a humanoid with a
destroyed right arm, a disabled left arm and a hurt chest becomes a dog
with a destroyed right foreleg, a disabled left foreleg and hurt
forequarters, and converts back to exactly the wounds it started with.
Its penalties correctly stop being manipulation and start being
movement — a man with two ruined arms drops his weapon, a dog with two
ruined forelegs cannot run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 16:42:57 +01:00
slaguru666andClaude Opus 5 a90c4f3e71 Carry wounds across a change of body plan (R-94)
locationDamage is keyed by location id and prepareDerivedData reads only
the keys belonging to the current plan, so changing speciesProfile on a
wounded actor stranded every wound it had. Found on a live Barghest that
had been shot in the leg and chest as a humanoid and then switched to
quadruped: 5 points under `legR` and 7 under `chest`, exactly its 12
missing hit points, sitting under keys no quadruped location answers to.
It read on the sheet as a badly hurt dog with eight pristine locations.

Stored and never read — the same defect this system keeps producing.

rules.mjs gains remapLocationDamage, which carries wounds across by KIND,
because kind is what the rules act on. Exact-kind matches are claimed
first in table order, so the obvious pairings land before any fallback
competes for them; that ordering is what makes the arms become the
forelegs going one way and the forelegs become the arms coming back.
Overflow past a location's destroyed ceiling is reported, not dropped.

It also gains locationDamageReplacement, which exists because the first
version of this fix had the bug it was fixing. Foundry merges object
updates so the outgoing keys must be deleted by name (R-93), but a
deletion and an assignment of the SAME key do not both apply — the
deletion wins. quadruped and winged share every location but the wings,
so switching between them emitted `-=hindLegR` alongside `hindLegR: 5`
and threw the wound away. Caught in live testing, not by reading.

Guards, both negative-tested before being wired in:
  - check-anatomy now walks all 20 ordered plan pairs and asserts every
    wound lands on a location the destination has, the arithmetic closes,
    the round trip does not leak, and no update both sets and deletes the
    same key.
  - check-rules gains 13 spot-checks over both new rules.

Verified in a running Foundry: baseline -> quadruped -> winged ->
quadruped -> baseline conserves all 12 points with no orphans, returns
to exactly {legR: 5, chest: 7}, and whispers the GM a receipt of what
moved each time.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 16:29:16 +01:00
slaguru666andClaude Opus 5 ddc4f99ff4 Hit locations reach ordinary combat, and creatures get a body
THE DEFECT. locationFor had ONE caller in the engine, hitLocationRoll, and
hitLocationRoll was called from fall, burn, detonate and burstAttack. Falling,
fire, explosions and automatic fire. Nothing else. rollWeaponDamage rolled dice,
printed a number and returned it, so the chat Damage button, the character
sheet's damage button and the item sheet's all stopped there.

A grenade knew which arm it took off. A sword did not.

Every individual piece was already correct - the tables, per-location armour and
coverage, disable and destroy thresholds, Major Wound, dying, death, the figure
on the sheet. They simply were not joined up, which is why this reads as a wiring
change rather than a new subsystem.

- rollWeaponDamage now carries through to hitLocationRoll: it rolls the location,
  applies that location's armour, applies the wound, and handles the rest through
  the machinery that already owned it. Nothing here re-implements any of that
- locationModeFor picks the melee or ranged column from the weapon's class. The
  two columns have always differed and nothing was choosing between them
- with no target it does exactly what it did before and SAYS SO on a card, rather
  than failing quietly
- burstAttack opts out with locate:false - it rolls its own location per round,
  and letting both fire would have applied every round of a burst twice

BODY PLANS. Two new tables: quadruped (four legs, fore/hindquarters, neck, a head
that is hard to reach) and winged (that, plus wings). Forequarters are the vital.
DISABLE EITHER WING AND IT CANNOT FLY, which is the fight a party can win.
Barghest, Kelpie and Church grim were all species "baseline" - a black dog, a
horse and a grave-hound, each hit-located with two arms and a chest. Fixed. Added
"The supporter", a winged heraldic beast, so the new table is exercised by real
content instead of existing unused.

Body plan is a NEW FIELD, not a species. A bear is not a playable people with
characteristic dice and talents, so creature specs take bodyPlan and the playable
species list is untouched.

THE NPC SHEET had no hit locations at all - 102 lines against the character
sheet's 627 - while every NPC in the game had them derived and wired to
consequences. It now carries the body-plan selector, the figure, the per-location
table, the condition and a GROUNDED flag. The sheet class already extended the
character sheet, so it already HAD the context; the template never used it.

FOUND IN PASSING, by the new guard: kind "body" - the abdomen, the trunk, the
hindquarters - did nothing whatever. Its printed effect has always promised "-30%
to all Physical actions and bleeding 1 hit point per round until First Aid" and
the code delivered none of it, on every body plan including the humanoid default.
It now bleeds 1, or 2 destroyed, exactly as bodyX says.

NEW GUARD: check-anatomy. Every body plan must cover 1-20 exactly once in BOTH
modes, every location must be drawn and every drawn shape must be a location, and
every kind must be one locationEffectsFor acts on, has effect text for, and has a
destruction outcome. Verified it fails on a d20 gap, a shapeless limb and an
unhandled kind before wiring it in. Ninth guard.

VERIFIED IN A RUNNING FOUNDRY, not just unit-tested: melee bar reads the Melee
column and the rifle reads Ranged on the same creature; forequarters graded as a
vital hit; a maxed wing set flightLost and the sheet said GROUNDED; the real chat
Damage button rolled 1D20 15, found the right foreleg, applied 12 through armour,
disabled the leg and took the dog from 16 to 4; and with nothing targeted nothing
was touched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 15:46:11 +01:00
slaguru666andClaude Opus 5 748e061b56 CLEAN GROUND: an outline where the department authored its own monster
A v0.1 rough outline, freely adapted from A Hollow Tree (2023) — the walk
north that never arrives, and a predator that imitates. Everything else
comes out of the system: a 1962 reserve entry that was never cancelled,
forty-one people looping eleven duplicated miles, and Borrowed Authority
as a detector that can only tell filed from unfiled.

Uses existing bestiary entries only. Marked not-runnable: no pregens,
read-aloud, handouts, Act Four exposure model or playtest yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 13:25:44 +01:00
slaguru666andClaude Opus 5 339d5dd8dc test runs the guards through bun, not through npm
`test` was "npm run check", so reaching bun meant shelling out to npm
first. It is "bun run check" now — one runner, and npm is out of the
path.

Not the eight-guard chain copied into `test`: that is the same shape of
mistake the rule formulas made before rules.mjs existed, a list written
twice and changed once. `check` stays the only place the guards are
named.

Verified: npm test exit 0, bun run test exit 0, bun run check exit 0.

Worth knowing: bare `bun test` does NOT run this. It is bun's own test
runner, it matches no files here, and it exits with an error. The ways
in are `npm test`, `bun run test` and `bun run check` — which is what
the README already tells you to use.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 17:44:16 +01:00
slaguru666andClaude Opus 5 54a759e057 Run the guards under bun, including the two new ones
Rebased onto the creature-forge work, which had added check-creatures
and check-lethality to the chain and had `check` back on node. Taking
either side whole would have been wrong: the node side loses bun, the
bun side silently drops the two new guards. So the runner is bun and the
guard list is upstream's, all eight of them.

Only `check` and `readme` move. build, icons, portraits, bestiary, mj
and simulate stay on node — they were never part of this change, and
build writes LevelDB packs through classic-level.

Verified before committing: each guard run individually under bun, then
`npm run check` end to end, exit 0.

  check-rules       103 rules, 33 files
  check-kits        OK
  check-lang        995 keys, no collisions
  check-templates   19 templates compile
  check-behaviour   67 behavioural tests
  check-scenarios   9 files, 62 mechanic tags
  check-creatures   101 actor specs across 8 sources
  check-lethality   46 creatures, none drifted more than 6 points

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 17:41:27 +01:00
slaguru666andClaude Opus 5 0c0996858f A GM screen taken from the rules that actually run
The figures a GM reaches for mid-scene, on one page: the order of
operations, the circumstance ladder, how a roll bands, reaction, the
combat round, hit locations, wounds and bleeding, both tracks, the way
home, the stations, and the environment.

Every number was checked by running the function rather than by reading
it — 58 of 58 against rules.mjs, including the eight that moved out of
ringbrp.mjs. That matters more than usual here, because `design/` still
carries four rulings the code has overtaken: hit points as CON+MAS, a
Major Wound at max(9, HP/3), "no hit locations, final", and marksmanship
style fixed by home-world gravity. rules.mjs is the authority and the
page says so at the top.

It is also written to drop straight onto a Loom board: 34 cards, 23
links, nothing swallowed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 17:18:51 +01:00
slaguru666andClaude Opus 5 322389bc8a A bestiary a GM can actually read, and the defect it found immediately
Forty-six creatures and no way to look at them. They live in content.mjs, which is
source code, and in the compendium, which shows one actor at a time behind two clicks.
A GM prepping a case can browse neither, so in practice the bestiary was whatever the
GM happened to remember writing.

docs/BESTIARY.md is generated, never hand-written, for the reason the rules journal is
generated from rules.mjs: a reference that can disagree with the thing it references is
worse than no reference. It opens with a one-page table sorted by how much of a party
each creature puts on the floor - the part that gets printed - then an entry each with
characteristics, attack, the POWER line pulled out of the tactics, and the measured
figure read straight from the lethality baseline. Every number is derived, so the
document cannot drift, and check-lethality already refuses the build if the measurements
move.

IT FOUND SOMETHING IN ITS FIRST RUN. The generic heavy natural attack is keyed `grasp`
and was NAMED "Vesh grasp limb". Twenty-two creatures carry it and five are Vesh, so the
at-a-glance table cheerfully printed "Vesh grasp limb" against a black dog, a kelpie, a
church grim and an apple tree. Renamed to "Grasping limb"; the key is untouched, so
every kit reference and every built pack still resolves. That defect was invisible for
as long as nobody could see the bestiary in one place, which is the argument for the
document.

The caveats are given more room than the numbers, deliberately. The measured column is
SOLO against ONE frozen party, and the document says so three times: encounter lethality
moves with how many there are and, much harder, with who the players brought - the same
fight runs 0% to 100% across party choice. It points at --spread rather than pretending
a single figure is an answer.

Also records the real remaining gap: 21 creatures fight with nothing but their own
bodies and still carry human anatomy, so the barghest can be shot in the left arm. The
machinery to fix that is built and measured; what is missing is anatomy tables for the
shapes they actually are - a quadruped, an immobile object, a swarm.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 16:43:39 +01:00
slaguru666andClaude Opus 5 4b718595fe check-lethality: guard eight, and the README stops advertising a subset
Seven guards checked that content is WELL FORMED. None checked what it DOES, so a
change to a damage modifier, a hit-point formula or the armour value on a service vest
could double a creature's lethality without touching one line of that creature - and
nothing in the build would notice, because the creature did not change.

Built as a regression test rather than the hand-declared bands the creature-forge plan
described. Bands are the wrong shape here: declaring "keepers: dangerous" across
forty-six creatures means inventing forty-six judgements, and after --spread it is
clear the interesting question is not "is this dangerous" - that has no single answer -
but "is this the same as it was". A recorded baseline answers exactly that, needs no
authoring, and cannot be argued with.

Every creature is measured solo against a FROZEN party of four, two armed postings and
two trades, at a fixed seed, so the only thing that can move a number is a change to
the rules or to the creature. Tolerances are 6 points of wipe rate and 0.35 agents,
which is outside the noise floor of 200 runs - a guard that cries wolf gets deleted.

Verified by tampering: told the baseline the nuckelavee was harmless and the guard
caught it at +16.5 points and +1.67 agents down, exit 1. Runs in half a second, so it
joins the pre-build checks rather than being something to remember to run.

Also: the README's guard block was a hardcoded list of four while the suite was seven.
It had silently stopped mentioning every guard added after it was written, including
check-creatures and check-scenarios. Now all eight, and the prose says eight.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 21:20:09 +01:00
slaguru666andClaude Opus 5 414dbd7037 simulate --spread: one number was the wrong instrument
THROUGH TRAIN Act Three publishes a single figure for its standoff - "the party is
wiped in 24% of runs" - and tells the GM not to soften it. Measured against every party
the duty roster can field, that fight runs from 0% to 100%.

It is not that the published number is wrong. It is that no single number can be right
for this fight, because the answer was settled at character selection: four armed
postings walk it, four trades are massacred, and the GM reading one figure is reading
somebody else's session.

--spread measures the encounter against every C(16,4) party - 1820 of them, exhaustive
rather than sampled, about a minute - and reports the floor, the median and the ceiling
with the parties that produce them. Exhaustive on purpose: a GM planning a session
wants the actual worst case, not an estimate of it.

It also prints each agent's effect on the wipe rate averaged over every party they
appear in, which is the line that gets used at the table. For the Act Three standoff:

  okonkwo   -43.2 points        ashcroft  +16.1
  sandoval  -17.7               nkemdirim +13.5
  holloway  -15.9               ferriby   +12.4

Okonkwo is worth forty-three points of wipe rate on his own. That is a scene-shaping
fact about the encounter that no amount of re-measuring the median would surface.

The published tables are NOT rewritten here. What to do about a 100-point spread is a
design decision - constrain the party, print a range, or rebalance the fight - and it
belongs to whoever wrote the scenario.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 21:17:28 +01:00
slaguru666andClaude Opus 5 2d4f7f18be Twenty-four new creatures, and the anatomies finally get used
The bestiary goes 22 to 46: eight more FOLKLORE, eight more HORROR, eight more
FORWARD. Ten of the forty-six are now Vesh or Cadence, up from two.

That ratio is the point. Both anatomies have had complete hit-location tables, body
geometry, species talents and location effects for the whole life of this project and
nothing used either, so none of it ran outside the character generator. They are now
written to be WORTH the anatomy rather than to wear it:

- The relay is five Cadence bodies holding a crossing open, and the crossing closes
  as they are destroyed. No vital, no head, 10% off everything per body lost - it
  cannot be dropped and cannot be ignored, which is the species argument entire.
- The courier is a Vesh that fights at half rating while its one grasp limb is full.
  Disable the limb and it drops the consignment and fights properly. The whole
  encounter turns on a trade the party has to work out.
- The census cannot be usefully fought at all: no head means no killing shot, so the
  fight lasts until somebody opens the ridge, by which time it has counted everyone.
- Knockers are the only folklore Cadence, and the committee is a Cadence because a
  committee IS several bodies and one decision.

The rest is written to the house line that most of these are arrangements rather than
fights, because a bestiary where every answer is a gun has one page. The washer at the
ford will not fight and cannot be made to; the apple tree man wants a drink it has been
owed since 1961; the waiting room's exit was never locked and nobody stands up.

Measured, 250 runs against four duty-roster agents, seed 11. Nothing accidental turned
up: the non-combat entries sit at 0.0-0.1 agents hurt, the fighters at 1.4-2.3, and the
only creature over a 10% solo wipe is the stanchion at 14.4% - which is a fixed object
with 12 armour whose own tactics say it is a demolition problem and not a fight. The
harness can only force a fight, so read that number as "the party punched the pillar".

Art regenerated: 24 new portraits, and the eight new non-humans verified to draw
exactly as many body parts as their location tables have entries.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 21:11:04 +01:00
slaguru666andClaude Opus 5 94479641b3 simulate: locate the damage
The harness measured a game in which every blow went to a general pool. That was
tolerable while every creature was a baseline human and merely wrong once the bestiary
had a Cadence in it: a creature whose entire mechanical identity is being whittled down
body by body was being measured as a person with an odd portrait, and the number it
printed was about nobody.

locationFor and resolveLocationHit move from ringbrp.mjs to rules.mjs, and the
category mapping inside woundPenaltyFor becomes woundPenaltyFrom beside them, for the
reason applyDifficulty and resolveBands moved before them: node cannot load the engine,
and the harness may not own a second copy of a rule. All three arrive with the
spot-checks they never had - 103 rules now, 346 formulas verified.

What the loop does now: 1d20 against the DEFENDER's own species table, melee finding
limbs and shooting finding centre of mass; damage to that location and to the general
pool, so the two agree; disabled at the location maximum and destroyed at twice it,
cumulatively. Then the consequences actually apply - a destroyed head is unconscious
immediately (conditionFor has always accepted that flag and was never passed it, so a
headshot used to leave the target swinging), a ruined arm costs -30 to every attack
including shooting, a ruined leg costs -30 to dodge, and each Cadence body lost costs
the whole creature -10 to everything.

Verified as mechanics rather than as numbers that moved: no species can return a
location it does not have across all 40 rolls; vesh and cadence have no head at any
roll and cadence has no vital either; a vesh ridge is hit 3/20 where a human head is
1/20, which is the "long target rather than a small one" the tables were designed for.
A built Cadence has five bodies at 4 points each and no vital; a built Vesh has six
locations with the ridge the largest.

Measured consequences, seed 11, 400 runs, four duty-roster agents:

  keepers x6      31.0% -> 36.5% wiped
  the_choir x11    0.3% ->  0.0% wiped, and now degrading as bodies go rather than
                   being a person who cannot be shot in the head
  long_walker      42.0% wiped, which nothing had ever measured

Still no bleeding, panic, Coherence, cover, range bands or fire modes. Still a floor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 21:05:25 +01:00
slaguru666andClaude Opus 5 f88c31649c The bestiary's first non-human creatures
vesh and cadence have had complete hit-location tables, body geometry, species talents
and location effects since they were written, and no creature had ever used either. So
none of that had run outside the character generator, and the whole bestiary was
hit-located as a person - including a black dog and a stack of paper.

THE CHOIR IS A CADENCE. It always was: its tactics say "run them as ELEVEN separate
bodies with one initiative between them", which is Distributed and Quorum described in
prose because the species that models it had no users. Retagged, and given the two
talents. No scenario prose refers to it, so nothing else moves.

PRECEDENT is new, and is a Vesh - the first. Built to exercise what makes the species
different rather than to be another sack of hit points: no head, so no fight against
one ends on a lucky roll, and a sensory ridge for a vital that runs the length of its
back and is correspondingly easy to hit. It is also not hostile, which is the point;
the encounter is a conversation with something that answers questions about an event
that has not happened yet.

Two things left deliberately unfixed and written down rather than fudged:

- The choir is eleven in the fiction and five in the location table. Reconciling it
  properly means giving cadence a per-creature body count, which stops the table being
  a constant and makes the paper doll follow it. That is the right fix and it is not a
  small one. A note on the spec says so.
- Precedent gets unblinking but not out_of_step, though SPECIES.vesh grants both. An
  npc actor has no Coherence track, and out_of_step costs 1 to use.

Also corrects a comment in creature-schema.mjs claiming Out of Step is vesh-locked. It
is not - five postings and a roster agent offer it to humans, and locking it would take
it off all six. SPECIES[x].talents is what a species is GRANTED; TALENTS[].species is
what only that species may HAVE. Two different fields, and only the second locks.

Simulated: Precedent 0.68 of 4 hurt over 3 rounds, no wipes. The choir alone is
trivial; at the eleven its own tactics call for, 3.05 of 4 hurt, median 18 rounds, 0.3%
wipes. Read both as floors - the harness does not model hit locations, so a Cadence's
entire mechanical identity is exactly what it cannot yet measure.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:57:17 +01:00
slaguru666andClaude Opus 5 bbe7b92459 Stop tracking LevelDB's LOG; it churns on read, not on change
LOG is LevelDB's diagnostic text — "Delete type=3 #1" and compaction notes — and it is
rewritten every time a pack is OPENED. Not rebuilt: opened. So all eighteen went dirty
whenever anything merely read the compendia, Foundry and any verification script
alike, and pack churn kept turning up in commits that had not touched any content.

Verified disposable before ignoring rather than assumed: a copy of packs/npcs with LOG
and LOG.old deleted opens cleanly, reads back all 21 actors, and LevelDB writes itself
a fresh LOG on open.

CURRENT and MANIFEST-* stay committed, deliberately. They are how a fresh clone finds
the data, and ignoring them would ship compendia nobody can open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:44:38 +01:00
slaguru666andClaude Opus 5 77e9aadc79 Rebuild packs; every actor now carries a portrait
76 of 76, up from 16. The npcs pack goes from every creature on the generic silhouette
to all 21 with art, and each token carries the same face as its sheet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:33:32 +01:00
slaguru666andClaude Opus 5 187a317a0a mj-queue: the illustrated upgrade path, without a self-bot
The Mac bridge posts /imagine to Discord with a user token. It is not ported here and
should not be: Midjourney's terms since 27 May 2026 forbid automated access, there is
no official API, and the bridge's own memory note records Discord silently dropping
its interactions from 22 July — which is what enforcement looks like from inside. A
Windows clone would be a second self-bot on the same account.

So this does everything except talk to Discord, which turns out to be most of the
work. `next` derives a prompt from the creature's spec and puts it on the clipboard;
you paste it yourself; `file` or `watch` renames the download to the canonical name
and retires the generated placeholder. One at a time, because the memory note is
explicit that concurrent jobs in one channel steal each other's grids.

Prompts are derived, not written — anatomy from the location table, scale from SIZ,
build from STR against SIZ, plating from naturalArmour — so they cannot drift from the
statblock. Three things learned by reading the data rather than assuming it:

- tactics is written for a GM, not an illustrator. "Advances by bounds, 15 m per
  round" put a rate of fire in an art prompt. role is the one-line essence and is
  already the sentence you would hand an artist. Sentences carrying mechanics are
  dropped; dates and ages are kept.
- era is the wrong test for whether something is a person. It classified Mr Bewley of
  the Registry and everyone in 1881 Cordera as monsters, because their kit is old.
- 18 creatures are species "baseline" and are not human-shaped — a black dog, a case
  file that eats case files, a machine that has decided it is the site. The prompt
  refuses to describe a body it cannot verify, and `list` names them. That is a
  statblock to write, not something to paper over here.

`sheet` emits a prompt sheet that the existing gen-art.mjs parses unchanged, so if the
bridge ever works again the whole bestiary drives from it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:33:16 +01:00
slaguru666andClaude Opus 5 9ddea43720 make-portraits: every creature gets art it cannot disagree with
Sixty of the seventy-six actors had no portrait. The sixteen that did are the
hand-made duty roster; the whole bestiary and every scenario NPC fell back to a
generic silhouette.

The point is not that this is free. A portrait composed from anatomy.mjs cannot
contradict the statblock, because it is drawn from the numbers the hit-location roll
uses: silhouette from BODY_ART, height from SIZ, build from STR against SIZ, plating
from naturalArmour, a mark for the primary weapon's class. A Cadence would get five
bodies because its table has five. Nothing has to be kept in step.

Colour carries what a GM wants off a thumbnail — whether the thing is a person,
folklore, recovered machinery, or the far side. That reads the shouted category the
role lines already carry (FOLKLORE, HORROR, FORWARD), which nothing was using, and
falls back to structure for the ones with no tag.

build-packs resolves portraits by stem and extension rather than an exact .webp
filename, so a creature gains art without an edit to content.mjs and a hand-made
raster always beats the generated diagram. A spec that NAMES a portrait and has none
is still a hard build failure.

These read as diagrammatic field-guide plates and will not match the Midjourney agent
portraits. That split is deliberate: the agents are the cast, the bestiary is case
material.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:32:53 +01:00
slaguru666andClaude Opus 5 24b183642f all-specs: one place that knows where the actors are
check-creatures collects every spec in the repo, including the rule that a scenario
cast is any exported array whose entries carry characteristics — so a new scenario is
covered the day it is written. That rule is a definition, and two more tools are about
to need it.

Lifted into tools/all-specs.mjs and imported back. check-creatures reports the same
76 specs across the same 8 sources; this is a move, not a change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:32:39 +01:00
slaguru666andClaude Opus 5 255b146753 Species anatomy moves where node can read it
RINGBRP.locationTables and RINGBRP.bodyArt lived inside ringbrp.mjs, which no tool
can import — it touches game, Hooks and foundry at load. So nothing outside Foundry
could ask how many hit locations a Cadence has, or what shape a Vesh is, which is
exactly what art generated from a statblock needs to know.

Moved byte for byte to anatomy.mjs and assigned back, the same move rules.mjs got
when the simulator needed the combat rules. One definition, two readers.

check-rules matched those tables with a regex against ringbrp.mjs and went blind the
moment they moved — it reported "could not read locationTables" and the species check
silently stopped running. It imports the value now. A guard that parses source text
breaks when the source is refactored; one that imports it cannot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:32:30 +01:00
slaguru666andClaude Opus 5 0633589061 Rebuild packs for the posting talent pools
Roster agents carry no talents of their own; they expand from their posting at build
time, so changing the pools left the compendia a version behind the register.

Rebuilt with Foundry stopped. Verified by reading the built pack back: 36 packed actors,
none carrying Unblinking, Distributed or Quorum. No lost/ directories, so the packs took
the write without needing repair.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:34:46 +01:00
slaguru666andClaude Opus 5 b0981008b3 No posting may grant a species
Eighteen postings offered vesh or cadence biology to any agent who took them: unblinking
nine times, quorum seven, distributed three. That is the root cause behind the six
characters check-creatures caught — they were not rogue, they had taken talents their own
postings advertised, and every newly generated agent would have done the same.

Unblinking is the clearest case. It is cat: species, species: vesh, and its own rule text
reads "A Vesh has no face to read and does not need to read yours". Nine postings offered
it, including Interview, Pathology and the doctor trade.

Each of the nineteen slots is replaced with a talent drawn from what the posting actually
does rather than from what was nearest alphabetically: Registry gets Requisition, the
Anchor gets Echo Sense, Disposal gets Clean Scene, Signals gets Chain of Custody and Dead
Reckoning. No pool gained a duplicate, and no talent is left unused — every legal talent
is now offered by at least two postings.

The guard lives in check-kits, which is the file that validates postings, and it imports
TALENT_SPECIES from creature-schema.mjs so there is one definition of which talents are
locked rather than two. check-creatures was looking at characters; nothing was looking at
the pools they were picked from. Verified by reintroducing unblinking on the doctor trade
and watching it fail, not merely by watching it pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:34:37 +01:00
slaguru666andClaude Opus 5 85c1062106 Pause overlay: tighten the caption, lift the field grid
Both found by looking at the thing render, which nothing had done before — the earlier
work on this overlay was verified through the CSSOM because the browser pane would not
composite frames, so the geometry and timing were confirmed and the LOOK was not.

Michroma is already a wide face, and .4em on top of it set GAME PAUSED at 176px against
a 190px field: 93%, running bracket to bracket, so the readout was competing with the
lock for the same width. .22em measures 154px, 81%, leaving 18px clear at each bracket.
text-indent moves with it so the word stays optically centred.

The field grid was drawn at opacity .3, which composited over the void band is 1.44:1
against its own ground. On a dark table map that is not a faint grid, it is no grid at
all. .45 measures 1.80:1 — present as texture, still far below the 3.1:1 --rb-line is
chosen for, so the amber lock stays the only thing asking for attention.

Both measured in a browser with Michroma confirmed loaded, not estimated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:27:17 +01:00
slaguru666andClaude Opus 5 8d7508077c Rebuild packs, and correct the guard count in the README
The talent fixes changed source without the compendia following, so the packs said
Braithwaite had Unblinking while roster.mjs said Clean Scene. Rebuilt with Foundry
stopped. Verified in the built pack: no agent carries a vesh talent, and Ashcroft keeps
Out of Step beside Borrowed Hour and Not Quite Here, which is now legal because it is
anomalous rather than species.

The README's guard box regenerated with the new totals, and its prose said "five guards"
in three places when there are seven.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:15:45 +01:00
slaguru666andClaude Opus 5 4ded53f9b5 Fix: npm run build has never worked on Windows
Both spawners built their argument with a file URL's .pathname, which on Windows is
"/C:/Users/...". Node resolves that against the drive root, so the build spawned
"C:\C:\Users\...\check-rules.mjs" and aborted on a module it could not find.

update-readme.mjs had the same bug and swallowed it in a bare catch, so instead of
failing it silently wrote a README whose guard box was empty — "0 guard lines" where
there should be four. A Windows build therefore could not happen, and if it had, it
would have quietly deleted the guard output from the README.

Same root as the packs/ CRLF bug: this repository has only ever been built on macOS and
Linux, where .pathname happens to be a usable path.

Also adds check-creatures to the pre-build guards, which it was missing, so the build
and npm run check now refuse the same things.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:15:33 +01:00
slaguru666andClaude Opus 5 2c547efe72 simulate: a lethality harness that uses the real rules
THROUGH TRAIN publishes "MEASURED, 400 runs each" and a 24% wipe rate; the starter
publishes its own table. Nothing in this repository could produce either number, so both
were claims rather than results and neither could be re-checked after a rule moved.

The harness knows no rules of its own. Everything comes out of rules.mjs, because a
harness with its own copy of the combat loop measures a game nobody is playing and
drifts silently the first time a rule changes. Two things had to move for that to be
possible:

  applyDifficulty, resolveBands and gradeRoll -> rules.mjs. The whole of d100 resolution
  lived in ringbrp.mjs, which node cannot import. All three are pure, so they moved and
  the engine re-exports them; no caller changes. check-rules then refused them for having
  no spot-check, so they now have fifteen, covering the 1% floor, the 96-99 rule and
  00-always-fumbles. They had none in their entire life inside the engine.

  expandFromRegister -> tools/expand-spec.mjs. A roster agent is written as a job and a
  rank and carries no skills or kit; everything it can do is derived at build time by a
  function locked inside build-packs.mjs, which cannot be imported because importing it
  runs the build. A simulated agent expanded by a second copy of that logic is not the
  agent that gets packed. Moved verbatim; both sides import one copy.

Deterministic throughout: same creature, party and seed, same numbers, which is what
lets a published table be verified rather than remembered.

What it finds: for the Act Three standoff the seed barely matters (0.5-2.8% wipe across
five seeds, eight rounds throughout) and party composition dominates everything. Four
support agents against the six miners wipe 92.8% of the time; swap in the heavy and the
warden and it is 0.3%. The published 24% is not a property of the encounter, and no
single figure can be.

Models Reaction re-rolled each round, banding, graded defences, the stacking defence
penalty, damage by band, major wounds and the dying clock. Does NOT yet model hit
locations, bleeding, panic, cover, range bands or fire modes, all of which make a losing
fight worse. Read the output as a floor, never a ceiling.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:10:05 +01:00
slaguru666andClaude Opus 5 c3002e93c9 check-creatures: validate every actor spec, and fix the vesh talents it found
Nothing validated creature specs. check-kits validates postings and check-scenarios
validates prose; buildActor throws on an unknown skill or item key and is silent about
everything else, so species, marksmanship style, characteristic blocks, species-locked
talents and misspelt field names could all be wrong and still build, pack and play.
Every packed actor once shipped as species "hominid" and the whole cast was hit-located
as something the rules do not contain.

tools/creature-schema.mjs derives every allowed value from the catalogues rather than
retyping them: skills from SKILL_CATALOGUE, kit from the item catalogues, species from
SPECIES, stats from CHARACTERISTIC_DICE, and the two marksmanship styles out of the
language file. It reports every problem with a spec rather than dying on the first, and
names the nearest real key. It also reports fields buildActor never reads, because
"armours:" is not an error, it is an actor that silently equips nothing.

On its first run it found six baseline humans carrying vesh biology. "unblinking" is
cat: species, species: vesh, and its own rule text reads "A Vesh has no face to read".
Out of Step is reclassified as anomalous with a Coherence cost, which is what every
talent in that category has and what the Anchor who is three years older than his
birthday says always wanted to be; the other five are swapped to agency and field
talents that fit them.

Not fixed here: the root cause is upstream in postings.mjs, where twelve posting talent
pools still offer unblinking, distributed or quorum to any agent. Picking replacements
across those is a design decision, not a mechanical one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:09:43 +01:00
slaguru666andClaude Opus 5 10f588b666 Plan: the creature forge
Five parts - schema and validator, lethality harness, forge CLI, procedural portraits, Foundry importer - built on three findings: the species machinery (vesh, cadence) is fully implemented and completely unused, the published measured lethality tables cannot be reproduced by anything in the repo, and RINGBRP.figures already holds the per-species geometry procedural portraits would need.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:08:36 +01:00
slaguru666andClaude Opus 5 c6924d6ea8 THROUGH TRAIN: art prompt sheet, and a runner for it
Prompts for all 43 assets - 16 duty-roster portraits, 14 NPC portraits from TT_CAST, and the 13 scene plates, none of which had a recorded prompt, so none of them could be regenerated.

Art direction is frontier newspaper engraving, and the present-day Bureau material is drawn in the same 1881 hand as Cordera with modern people composed as tintype portraits, so the two halves read as one document. Three rules are written into the sheet because they protect meaning rather than style: nothing modern is drawn on the 1881 side, the train is absence rather than a glowing spectre, and nobody is lit as a villain.

tools/gen-art.mjs parses the sheet rather than keeping a second copy of the prompts, expands the style tokens and drives mj-gen. Dry run by default, because --run fires paid generations.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:08:36 +01:00
slaguru666andClaude Opus 5 b31b1028a9 Rebuild the pause overlay as a containment hold
The uniselector rotated forever, which is the one thing a hunting stepping switch never does, and it was carrying two outright bugs: the motion trail pointed the way the arm was going rather than the way it came, because conic angles run clockwise from the origin and the tip was declared first; and the hub pip ran on a free 2.6s sine against a 7.7s arm, so the light drifted permanently out of phase with the mechanism and meant nothing.

Replaced with an instrument that acquires, locks, reports and lets go: a static field, four corner brackets that close and snap, a scan line reading down the field at exactly cycle/3 so its third pass always lands on the lock, and a readout welded to the same cycle. Every layer reads --rb-pause-cycle, so nothing can drift. The field offset is derived from the column rather than measured and pasted in.

Also ignores the impeccable hook cache and keeps its config, which records why broken-image is suppressed for a stylesheet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:08:23 +01:00
slaguru666andClaude Opus 5 2332b449ba Refresh package-lock
The committed lockfile predated the handlebars devDependency and carried the wrong name and licence metadata. Regenerated by npm install; no dependency actually changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:08:22 +01:00
slaguru666andClaude Opus 5 f0edd54e83 Mark packs/ binary so Windows checkouts stop corrupting the compendia
core.autocrlf=true rewrites packs/*/CURRENT from "MANIFEST-000002\n" to "MANIFEST-000002\r\n" on checkout. LevelDB then tries to open a manifest whose filename ends in a carriage return, fails with "The filename, directory name, or volume label syntax is incorrect", and Foundry runs RepairDB across all eighteen packs on first launch.

The packs are therefore broken from the moment they are cloned, and the only visible symptom is a pile of lost/ directories in git status. Linux and macOS checkouts are unaffected, which is why this went unnoticed.

The committed blobs are already LF, so no renormalisation is needed: this only affects the smudge side.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 21:29:11 +01:00
slaguru666andClaude Opus 5 214e207cc6 THROUGH TRAIN: north bench plate without the park bench
Midjourney read "bench" as furniture in the first version. Regenerated with the
word removed and "no furniture" stated: two coated figures from behind, empty
ground, a dry gully, the town's water tank on the far horizon. Emptiness is the
subject, which is what the scene is for - they arrived where the paperwork says
the railway is.

All thirteen plates are real art and there are no placeholders left.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 19:34:51 +01:00
slaguru666andClaude Opus 5 8a4d093a13 THROUGH TRAIN: the Bureau plate, and no placeholders left
tt_11_bureau regenerated after the first attempt timed out, converted to the
house plate format. All thirteen plates are now real art.

A version of tt_12_northbench without the word "bench" in the prompt is still
rendering; the current one is good apart from the park bench Midjourney put in
the desert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 19:33:59 +01:00
slaguru666andClaude Opus 5 67b6f61c64 THROUGH TRAIN: two of the three new plates are real art now
tt_12_northbench and tt_13_standoff replace the placeholder copies. Converted to
the house plate format, 1024x682 webp, to match the other ten.

The Bureau plate timed out in Midjourney at 1800s waiting for a grid and is still
a placeholder; it is regenerating.

Known flaw in tt_12_northbench: Midjourney read "bench" as furniture and put a
park bench in the Nevada scrub. Everything else about the plate is right - two
coated figures, empty ground, no railway, the town smoking on the horizon - so it
ships while a version without the word regenerates.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 19:32:55 +01:00
slaguru666andClaude Opus 5 973b4a53aa THROUGH TRAIN rewritten into five acts
Act One is now an induction at the Bureau, Act Two puts the players through the
crossing and makes them find the train, Act Three is a town-side obstacle, Act
Four is the boarding, Act Five is the four minutes. 4h00 in five acts, was 3h30
in three.

The restructure earns one thing the old shape could not: THE CROSSING OPENS WHERE
THE RECORD SAYS THE LINE IS, which is an empty bench of scrub on the wrong side of
the wash. The agents arrive where the paperwork put the railway, not where the
railway is, so the fraud is the ground under their feet and finding the train is
real work. Registry's file has this wrong and Bewley believes the file.

- Act Three: Rance Doyle and five unpaid miners take the agents for company
  detectives, and they are not wrong to. Resolves on what the players SAY - no
  roll makes it go away, no roll makes it a fight. Losing costs them the 1881
  issue, not their lives. His brother Tom is aboard and dies at minute two of
  every pass, which is the wiring between the acts
- new cast: Bewley, Prosser, Rance Doyle, Shard, Tom Doyle, Cordera man
- new handouts: the company notice, and the six names in Ambrose's hand
- 8 GM pages, 10 handouts, 15 actors, 13 plates

MEASURED, 400 runs each: the Act Three standoff is 0.4/4 hurt from cover and
1.25/4 in the open, both ending early - but FOUGHT TO A FINISH it puts 1.75 of 4
down and wipes the party in 24% of runs. The early stop is what makes the act
survivable, not the miners being weak. My first draft of that table was guessed
and wrong in all three rows.

FOUND AND FIXED: there is no Ride skill in this game and never has been. The
boarding set-piece has asked for "[CUS: Ride, then Athletics]" since it was
written, through a playtest, which is an instruction to roll a thing nobody has.
Horses are now handled by a local and the agent rolls Athletics.

NEW GUARD: check-scenarios resolves every [CUS: Skill] tag in every scenario
against SKILL_CATALOGUE and fails the build on a skill that does not exist.
Verified it fails on the real bug before wiring it in. Sixth guard.

NOTE: the three new plates (Bureau, north bench, standoff) are placeholders in
this commit - Midjourney is still rendering them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 19:25:20 +01:00
slaguru666andClaude Opus 5 24b1aaa682 Development: skills improve from what beat you, not what worked
Reversed experience. A skill is marked when it FAILS - failure or fumble - and
never when it works, and the improvement roll is the same reversal: roll OVER
your rating and the skill goes up 1d6. Nobody learns anything from the lock that
opened first time.

The two halves pull against each other on purpose, so ratings converge instead of
running away. Simulated over 2000 campaigns: a 10% and an 85% skill start 75
points apart and are 11 apart after 60 cases.

- rules.mjs owns it: DEVELOPMENT, developmentMarksOn, developmentImproves,
  developmentCeiling, developmentGainFor
- trainingCap has been on the skill schema and the item sheet since it was
  written and nothing has ever read it. Development reads it now: a skill stops
  at its own cap, and everything else stops at DEVELOPMENT.ceiling, because a
  d6 gain could otherwise push a 98% skill past 100
- GM opens the phase from a GM-only toggle in the token controls; it posts a
  card naming every agent and their marked count, and puts a Development button
  on each sheet. Players press their own
- the toggle re-reads the setting on change, since getSceneControlButtons only
  fires at load and the button would otherwise lie if the phase were opened by
  the API or a second GM
- rules journal and player primer rewritten from the tables; the old text
  described the pre-reversal rule on both halves
- 7 spot-checks, 4 behaviour tests; verified end to end in a running Foundry

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 23:23:03 +01:00
slaguru666andClaude Opus 5 99e78f440a "Somebody you knew" costs one point, not two
At two, the closing beat of a hard case broke four agents in five at the same
moment. A whole party freezing or bolting on the final scene reads as arithmetic
rather than grief, which is the opposite of what the trigger is for. Found by
playing THROUGH TRAIN end to end.

Replayed the same beat from the same party state — Holloway 3, Okonkwo 2,
Bhattacharya 4, Nkemdirim 3, Finch 2 — with the new cost: one agent breaks, the
rest carry it at 3 and 4 with the penalties that implies. That is the shape it
wanted.

"It said your name" stays at two, and is now the only two-point trigger in the
list, which is right — it should be the singular worst thing that can happen to
somebody.

The rules journal and the player primer both generate their trigger tables from
PANIC_TRIGGERS, so both already print the new number.

Version 1.4.2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 22:38:45 +01:00
slaguru666andClaude Opus 5 c05d488b9d Play THROUGH TRAIN end to end; fix three scenes the dice could not reach
Ran the whole case with five agents — briefing, kit swap, Mercy Draw, the
crossing, Cordera, the water tower, the four minutes, the locomotive, the
brakes, the register. It completed, and it exposed one serious defect and two
smaller ones. All three are the same shape: the scenario put dice in front of
things the fiction says should simply happen.

  1. THE ENDING WAS UNREACHABLE. Convincing Kell to stop was gated on Persuade
     or Status. Only THREE of the ten duty-roster agents have either trained —
     the Field Lead has Persuade 15 and Status 15. Three separate attempts on
     him all failed and the scenario had no way to end; I narrated it as working
     because otherwise there was no ending, which is exactly the improvisation a
     scenario is supposed to prevent.

     It now takes NO ROLL if the party can tell Kell one true thing about his own
     train — the coal, the four minutes, the north bench. He has waited a
     hundred and forty-five years for somebody who knows what is wrong to say
     so. Only a party that knows nothing rolls, at average, and a failure costs
     a pass rather than the ending.

  2. THE PAPERS NEEDED PERSUADE. Showing one side the other's document is the
     move the scenario is proudest of, and it sat behind Persuade at −30%:
     15% became 1%. Both men WANT their paper read — Merritt is proud of his
     letter, Ambrose's whole grievance is that nobody has looked at his writ.
     No roll, between passes.

  3. THE BOARDING SORTED ITSELF BADLY. Athletics runs 25–60% across the roster.
     Putting all five on the water tower left the doctor and the Registry officer
     missing twice each, carried across on the department's plank, passengers in
     their own set-piece, two passes gone. The text now names which route suits
     whom before they choose.

What worked, and is worth recording: the automatic clues absorbed two failed
rolls in Act One without the trail stalling; Standing Order 9 caught Okonkwo
checking a wristwatch in an 1881 street and cost a Coherence and a clock tick;
the fumble-is-a-fall rule fired on a 100 at the tower for five damage; the
exposure table held — one hit across the whole fight, on the agent who left
cover to work on Doyle; and the reset landed exactly as intended, with Doyle
standing up at the top of the car and Nkemdirim's hit staying where it was.

Version 1.4.1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 22:34:23 +01:00
slaguru666andClaude Opus 5 391c6a3679 Rebuild packs cleanly
LevelDB LOG timestamps only — no content change. Committed so the tree matches a
build made with Foundry stopped, which is the state the published archive should
carry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 22:27:52 +01:00
slaguru666andClaude Opus 5 5bc46879c7 THROUGH TRAIN: put the gunfight inside the loop
The loop is no longer just a train going round. It is FOUR MINUTES with a
gunfight in it, and those four minutes have run about two million times.

Two sides, and neither is the villain. Cass Merritt and three hired men have a
signed letter of engagement from the company telling them to surrender the
payroll to nobody "upon any pretext whatsoever, including the presentation of
any paper". Josiah Ambrose and four Cordera miners have a sealed writ of
attachment from a territorial judge naming that same payroll against eleven
weeks of unpaid wages. Both documents are genuine. Neither man has seen the
other's. The company sold the same money twice and is not aboard. Both are
handouts now, and they only mean anything held in the same hand.

The mission is restated everywhere it appears — briefing page, case brief, GM
essentials: CLOSE IT. Closing the crossing does not kill anybody, it lets them
go. The loop ends, 3 November 1881 resumes from 11:44, and everyone aboard walks
forward into the life they would have had — including Ambrose and a miner named
Doyle, who did not survive the real four minutes. The agents are not choosing
who lives; they are choosing to stop holding history still, having met the
people it lands on.

The standing order is louder in three places: NOTHING MODERN GOES THROUGH.

Two things the playtest found, both now written into the text:

  - THE FIGHT WAS A TPK GENERATOR. Modelled with all nine shooters firing at the
    party it wiped them 171 times in 200. The model was wrong — the two sides
    are shooting at EACH OTHER — so the scenario now carries a measured exposure
    table: head down draws nothing, acting from cover costs half a party member
    and no wipes over 300 runs, moving in the open costs one, and going for the
    payroll box wipes more than half of all parties. The GM is told to say that
    last row out loud BEFORE anybody commits to it.

  - THE LOOP RESETS AND THE AGENTS DO NOT. Everyone who belongs to 1881 is back
    up unhurt on the next pass. The agents keep their wounds. Nothing said so,
    and a player who assumes otherwise takes risks that kill them. It is now
    stated in capitals in both documents, with the played pass that prompted it
    — two of four down at 0 hit points, one untouched because he stayed on the
    floor.

Nine cast members, eight handouts, ten plates.

Version 1.4.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 22:20:00 +01:00
slaguru666andClaude Opus 5 774e95dea8 THROUGH TRAIN — the crossing starter, and two more playtest fixes
A train has been running the same four miles of track since 3 November 1881. It
has never stopped. Sixty-one people are aboard and all of them are alive.

The supernatural is science fiction underneath, which is the point. A railway
company laid track to a filed survey instead of to the ground, then described the
line as being where it was not — ten thousand times, in timetables and waybills
and telegraph orders, for six months, at a constant speed. Reality keeps a record
of what belongs where, and that is the most patient argument there is. The record
gave way with No. 9 inside it, and the RUNNING is what holds the crossing open: a
standing wave sustained by its own motion the way a bow sustains a note.

So the players must board a train that cannot stop, and then find that sixty-one
people at six passes is four hours they do not have. The ending is what they
choose to do about arithmetic they cannot beat, in front of a conductor holding
the manifest. No roll resolves it.

It is also the case that teaches Standing Order 9: NOTHING MODERN GOES THROUGH.
Using a modern object across costs a Coherence and moves the clock; carrying it
costs nothing; anchors are exempt. The catalogue already had the 1881 issue —
Webley, Martini-Henry, oil lantern, brass compass, pocket watch, buff coat,
laudanum — so the constraint needed no new content and gives the table something
to feel in the first twenty minutes.

Ships as docs/scenarios/THROUGH_TRAIN.md and a Foundry Adventure: 7 GM pages, 6
handouts including the survey that started it and a manifest deliberately held
back to Act Three, the case file at Containment 6 / Resources 5 / Clearance 4
with its four legs loaded, four of the people aboard, and 7 plates to show.

Two fixes from playing it:

  - Bhattacharya's RESEARCH was 1%. Placing the new skills last night I swapped
    Occult into Registry's core and took Research out — a records office that
    cannot look anything up. Research is back in core; Antiquities gets its
    Knowledge back the same way.

  - The boarding was unrunnable. At halved skill the set-piece put four agents on
    12–31% and all four missed, which stalls the one scene the scenario is built
    around. It is an average roll now and only a fumble is a fall, with the
    reason written into the text so nobody "fixes" it back. Re-run: 3 of 4 aboard
    on the first pass and one waiting for the next, which is the shape it wanted.

Version 1.3.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 00:25:19 +01:00
slaguru666andClaude Opus 5 37b4043746 Play a full case, then fix what it found
Ran THE HOLLOW ROAD with five agents — approach, crossing, contact, the thing on
the road, extraction, debrief — with panic and Coherence both live. It ran clean
and it found one thing that mattered.

ANOMALY LORE 0. Marta Holloway, Field Lead, Senior Field Officer, could not roll
the department's signature skill. Nor could Okonkwo. Induction was gated to
TRADES on the reasoning that a career posting is itself the agency training —
but 17 of the 25 postings do not list anomaly lore, its printed base is 0 on
purpose, and nothing else supplies it. So the people who joined the department
straight out of school were the only ones who never received its basic training,
which is exactly backwards.

Induction is a FLOOR for everybody now, posting or trade, in the live generator
and the pack builder both. It never demotes: Bhattacharya keeps Registry's 63,
Holloway goes 0 → 43, Okonkwo 0 → 33. All twenty built agents verified non-zero.

Two GM tools the case showed were missing, both found by feeling the friction
rather than by reading anything:

  - clearPanic(actors). Panic clears when the scene does — one line in the book
    and, until now, five sheets edited by hand while the table waited. It leaves
    Coherence alone, which is the whole point of having two tracks.
  - partyState(). Everybody's hit points, panic and Coherence in one card. With
    five agents the alternative is asking "what are you on?" five times a scene,
    which is friction a table absorbs silently and then blames on the game.

And the player-facing gap: the primer never mentioned panic. Players got a
one-page aide-memoire for a track they now meet in the first scene. It has a
page of its own and a row on the cheat sheet, both generated from the same
tables as the rules.

One thing I reported as a bug and withdraw: Okonkwo's "Firearm (Pistol) 5%" was
me rolling the wrong weapon. He carries a marksman rifle at 53%. check-kits was
right.

Version 1.2.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 00:10:28 +01:00
slaguru666andClaude Opus 5 7ec7efd29b Replay the scene with the fumble rule; expose panicReliefFor
Ran the east corridor again with fresh dice and every relief attempt routed
through easePanic, fumbles included.

The rule did not fire this time. All three attempts failed cleanly — Psychology
58 against 40, and two POW×5 rolls at 66 and 76 — so nobody was punished for
trying. That is worth reporting as loudly as a hit would have been: two
play-throughs in and a fumbled relief has come up once, which is about right for
something meant to be a memorable disaster rather than a tax.

Braithwaite still broke at 5 on "it said your name" and fled. Marrow went down
in a single round to a special with the entry bar — 19 through armour — against
the 4.5-round average the thirty-run tuning gave, so that was dice, not balance.

Then the question the rule actually raises. Relief rolls are made at your own
panic penalty, so the worse you are the worse your odds AND the wider your fumble
range — and now a fumble adds a point. That is a feedback loop, so I measured it
rather than trusting it, 300 runs per row:

    from 2, POW×5 60%   280 calm ·  0 broke
    from 3, POW×5 60%   227 calm ·  2 broke
    from 4, POW×5 60%   138 calm · 31 broke
    from 4, POW×5 50%    96 calm · 35 broke
    from 4, POW×5 85%   267 calm ·  5 broke

Recovery dominates everywhere. The worst case — overwhelmed, weak POW, no help —
spirals into breaking about one time in eight, which is a bad night rather than a
trap. No change needed.

Also: panicReliefFor and panicAfter were missing from the API, which I only
noticed because measuring the loop needed them and the alternative was
re-implementing the rule in the test — the exact duplication check-rules exists
to forbid. Both exposed.

Version 1.1.3.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 23:31:35 +01:00
slaguru666andClaude Opus 5 5aaae186e0 A fumbled relief attempt puts a point on
Trying to steady somebody and making it worse is the most familiar thing on that
list, and until now it was the only outcome that cost nothing.

Done as a NEGATIVE relief rather than a second code path: panicReliefFor returns
-1 on a fumble, and easePanic already subtracts what it is given, so subtracting
a negative raises the track. One number, one direction, no branch that could
drift from the other. The clamp still holds — fumbling at 5 stays at 5.

The chat card had to be told, because otherwise it prints the word "Psychology"
over a number that has just gone UP and the table reads that as a bug rather than
as the rule. It now leads with a red FUMBLED tag.

Guarded three ways: a spot-check in check-rules for the -1 itself, and two
behaviour tests — one that the sign survives easePanic's subtraction and
actually raises the track, one that it cannot push past the top. A test on the
constant alone would have passed even if easePanic had healed on a fumble.

Verified live: 2 → fumble → 3 → success → 2 → special → 0, and a fumble at 5
staying at 5, with the cards reading correctly.

Version 1.1.2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 23:25:46 +01:00
slaguru666andClaude Opus 5 20306d83d9 Play a scene with panic; tighten one reference row
Ran LAST ADMISSION's east corridor with the six civilians and real dice. The
track works end to end and, more importantly, the penalty REACHES things:
Ferriby at panic 3 swung at Old Marrow with Brawl 25% printed and 15% effective,
while Sharrock at panic 1 rolled his full 58%. That is the whole point of the
track and it is the part that is usually decoration.

The arc played well. Lights out took four of them to 1. The body took Braithwaite
and Ferriby to 2. Enderby counting took three of them again. Braithwaite fumbled
his Psychology roll trying to talk Colin down, then it said his name — 5, broke,
fled, came back at 3. Renshaw steadied herself on POW×5 and dropped to 1.

One thing I got wrong and one thing worth knowing:

  - I flagged a 99 grading as a fumble as a bug. It is not. A 58% skill fumbles
    on 98-00, and both the primer and the rules page say so in those words. The
    "96-99 never succeed / 00 always fumbles" pair are floor rules, not the whole
    fumble range. Only the quick-reference row was ambiguous — it now says
    "never succeeds ... and is a fumble if it is inside your fumble range".

  - The civilians cannot use two of the three new skills. Occult, Religion and
    Psychology sit at 5% on the "(before)" sheets, so in the prologue the only
    relief that works is POW×5 at 50-85%. That is correct — a site foreman is
    not an occultist — but it means the skills are an AGENT'S tools, and the
    prologue is deliberately the game without them. The agents have them where
    they should: Bhattacharya Occult 63, Lindqvist 58, Renshaw Psychology 40,
    Braithwaite Religion 35.

Version 1.1.1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 21:58:30 +01:00
slaguru666andClaude Opus 5 cbad87ba98 Add Occult, Religion and Psychology, and the Panic track
From the first game's list. The three skills are not decoration — they are the
levers on the new track, which is why they arrived together.

PANIC, 0 to 5, up. It is the other half of Coherence and the rules page says so
in the first line, because a table that confuses them will make the wrong call
at the worst moment:

    Coherence   what knowing has cost you       weeks     10-0, down
    Panic       what is happening to you NOW    minutes    0-5, up

A trigger gives a point with NO ROLL. Asking for a die to find out whether you
are frightened slows the scene and tells the player how to feel; the die is for
getting rid of it, which is the interesting direction.

    0 steady · 1 rattled · 2 shaken -5% · 3 losing it -10%
    4 overwhelmed -20% · 5 broken

The first point is free on purpose, so the opening shock of a scene costs the
table nothing. At 5 you break — freeze, flee or fixate, choose fast — and come
back at 3, not at 0, because breaking is not a rest.

Relief is where the skills come in. A success takes one point, a special takes
two. Psychology is the only thing that steadies somebody who is NOT you.
Religion steadies you alone and does not care whether you are right. Occult is
the odd one: naming a thing correctly, out loud, helps everybody who can hear —
the department's actual work, and the only relief that reaches a room. Plus
POW×5 to steady yourself, and your anchor object once per case, which is what
that briefing scene was for.

The three skills are placed in six registers rather than left floating: Occult
to the professor and to Registry, Psychology to the doctor and to Interview,
Religion to Antiquities and Pathology.

Guards, because a track nothing reads is this project's oldest failure: the five
new rules carry spot-checks in check-rules, and check-behaviour gains nine tests
— the free first point, monotonic penalties, only 5 breaking, clamping at both
ends, breaking not clearing the track, special taking two, every band/trigger/
relief having a label, and every relief naming a skill the catalogue actually
has.

Verified in a live game: penalty reaches the roll (58 → 58 → 53 → 48 → 38 for
panic 0-4, criticals and specials recomputed with it), the full arc runs 0 → 2 →
4 → eased to 2 → pushed to 5 → breaks → 3 with no errors, the sheet shows the
band, and the rules journal has a Panic page generated from the same tables.

Version 1.1.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 22:55:11 +01:00
slaguru666andClaude Opus 5 ab619f4b73 Remove the dice textures and the whole Dice So Nice path
Deleted: the seven PNGs in dice/, tools/make-dice-textures.mjs, the `npm run
dice` script, the RB_DICE colourset and texture tables, diceSetFor, the
diceSoNiceReady hook, and rbDressDice — which was tagging ten roll sites with
coloursets that no longer existed. 99 lines of module, plus the assets.
README and DEPLOY updated; they still advertised all of it.

Recoverable with `git revert` if it is ever wanted back.

This also explains the 01-that-was-12. The RESULT was never wrong: skillRoll
rolls one 1d100 and grades on roll.total, and the chat card derives the tens and
units it prints from that same total. Checked all 100 values of percentileFaces
and 60 live rolls — the printed faces reconstruct the graded number every time,
with no mismatches.

What disagreed was the ANIMATION. The custom addDicePreset labels registered for
d100 and d10 remapped which physical face means what, so Dice So Nice could land
showing 01 while the roll behind it was 12. Nothing downstream ever read the
animated faces, so no roll was ever adjudicated on the wrong number — but a
table watching the dice had every reason to believe otherwise, which is its own
kind of wrong. Disabling the skins in 1.0.6 already removed it; deleting them
makes it permanent.

Verified in a running Foundry after removal: skill roll, weapon damage, hit
location, major wound and Coherence all resolve and post their cards, no errors,
and game.ringbrp.diceSetFor is gone from the API.

Version 1.0.7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 22:45:52 +01:00
slaguru666andClaude Opus 5 9b6c61ffcb Turn the custom Dice So Nice skins off
Registering them with "preferred" made them the default for everybody in the
world, which overrides whatever dice a player had already chosen — the system
helping itself to a setting that belongs to the user. Off at the author's
request.

One named constant rather than a settings API: this codebase registers no game
settings at all, and adding that surface, its lang keys and its UI to switch one
feature off is more machinery than the job needs. Flip RB_DICE_ENABLED to true
and everything below it still works.

The textures in dice/ and the generator behind `npm run dice` are left alone.
Nothing reads them while this is false, and deleting work in order to turn a
feature off is a poor trade.

Verified in a running Foundry with Dice So Nice active: "custodians" is no
longer among the registered systems, and preferredSystem has gone back to
"standard" rather than ours.

Version 1.0.6.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 20:34:22 +01:00
slaguru666andClaude Opus 5 0852427586 Fix the pause: it would not hide, it was off centre, and it was too small
Three faults in 1.0.4, and the first was the serious one.

  1. It never went away. Core hides the overlay with `#pause { display: none }`
     and shows it with `#pause.paused { display: flex }`. 1.0.4 styled the BARE
     #pause with display:flex, which wins on specificity, so unpausing removed
     the class and changed nothing — GAME PAUSED sat over the table for the rest
     of the session. Every rule here is now scoped to `.paused` and `display` is
     not set anywhere.

  2. It was off centre because I repositioned it. Core already centres it: a
     full-width band at top calc(50vh - 100px), column flex, centred both ways,
     pointer-events none. That layout was correct and 1.0.4 fought it with
     left/bottom/transform. It is left alone now; only the height changes, and
     the top moves up by exactly half the extra so the centring holds.

  3. It was small: a 322x116 panel in the corner. It is now core's full-width
     band at 300px with a 170px dial — against core's own 100px — and the
     caption at 24px to match core's.

Guarded: check-behaviour now parses the stylesheet and fails any rule that sets
display on an unscoped #pause. Verified it bites. It strips CSS comments first,
because the first version of the guard reported the comment explaining the
guard — which is exactly what the template guard did last time, so that is twice
now and the lesson is written down properly.

Verified by driving the real toggle: running → display none, box 0x0, no class;
paused → display flex, 341x302, centre X exactly on the viewport centre;
unpaused again → display none, box 0x0.

Version 1.0.5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 19:31:35 +01:00
562 changed files with 43764 additions and 771 deletions
+15
View File
@@ -0,0 +1,15 @@
# The compendia in packs/ are LevelDB databases, and they are BINARY.
#
# Without this, a checkout on Windows (core.autocrlf=true, which is the Git for
# Windows default) rewrites packs/*/CURRENT from "MANIFEST-000002\n" to
# "MANIFEST-000002\r\n". LevelDB then tries to open a manifest whose filename
# ends in a carriage return, fails with "The filename, directory name, or volume
# label syntax is incorrect", and Foundry runs RepairDB across all eighteen packs
# on first launch. The packs are broken from the moment they are cloned and the
# only visible symptom is a pile of lost/ directories in git status.
#
# Linux and macOS checkouts are unaffected, which is why this went unnoticed.
packs/** -text -diff
# Generated art is binary too; same reasoning, less catastrophic.
*.webp -text -diff
+29 -1
View File
@@ -1,9 +1,37 @@
# Restorable with `npm install` — the pack builder needs classic-level.
node_modules/
# LevelDB runtime locks. The pack DATA is committed on purpose (see README):
# LevelDB runtime scratch. The pack DATA is committed on purpose (see README):
# a remote Foundry needs the built compendia, and building them requires Node.
#
# LOG is LevelDB's own diagnostic text — "Delete type=3 #1", compaction notes — and it
# is rewritten every time a pack is OPENED, not only when one is rebuilt. Tracking it
# meant all eighteen went dirty whenever anything merely READ the compendia, Foundry
# and any verification script included, which was most of the noise in git status here
# and the reason pack churn kept appearing in commits that had not touched content.
#
# Verified disposable before ignoring: a pack copy with LOG and LOG.old deleted opens
# correctly, reads back all its documents, and LevelDB writes a fresh LOG on open.
#
# CURRENT and MANIFEST-* are deliberately NOT in this list. They are how a fresh clone
# finds the data, and ignoring them would ship a compendium nobody can open.
packs/*/LOCK
packs/*/LOG
packs/*/LOG.old
# macOS
.DS_Store
# Impeccable design-hook scratch; the config beside it records real decisions.
.impeccable/hook.cache.json
# The creature currently taken from the illustration queue (tools/mj-queue.mjs).
# Machine-local working state, not a fact about the repo.
.mj-inflight
# Raw Midjourney plates and the superseded PNG tokens. Working files, not deliverables:
# tools/make-art.py derives art/portraits/<key>.webp and art/tokens/<key>.webp from these,
# and only the derivatives ship. 47 plates at 2.3 MB each would be 93 MB of history for
# pictures nothing renders at that size. Keep the originals; do not commit them.
art/creatures/
art/tokens/*.png
+17
View File
@@ -0,0 +1,17 @@
{
"detector": {
"ignoreRules": [],
"ignoreFiles": [],
"ignoreValues": [
{
"rule": "broken-image",
"value": "*",
"files": [
"styles/ringbrp.css"
],
"createdAt": "2026-08-30T18:38:10.587Z",
"reason": "Claude: stylesheet, not markup — the only <img> mentions are prose in comments documenting Foundry's core pause DOM (<figure id=pause> holding an <img>) and the #pause img selector. No image tag can exist in a .css file."
}
]
}
}
+37 -14
View File
@@ -28,7 +28,8 @@ git clone https://gitea.timevans.uk/slaguru666/RingBRP.git ringbrp
```
Requires **Foundry v13+** (verified against v14.364). No modules are required. Dice So
Nice is supported but optional — the system registers four of its own dice textures.
Nice works if you have it, using your own dice — the system ships no dice skins and does
not touch anybody's dice settings.
### Deploying to a remote Foundry server
@@ -47,7 +48,7 @@ packs or regenerate art on that machine:
```bash
npm install # pulls classic-level, used to write the LevelDB packs
npm run build # rebuilds packs/ from tools/content.mjs
npm run check # the three guards; the build refuses to run if they fail
npm run check # the twenty-five guards; the build refuses to run if they fail
```
To update a deployed server: `git pull` and restart Foundry. If the pull touches
@@ -63,14 +64,14 @@ changing underneath a running server.
|---|---|
| **Postings** | 25, each with a key characteristic, trained skills, talents and its own kit |
| **Trades** | 10 ordinary jobs the department recruits from, plus induction |
| **Catalogue** | 236 items — 123 gear, 62 weapons, 32 armour, 19 vehicles |
| **Skills / talents** | 59 skills, 19 talents |
| **Bestiary** | 21 statblocks across folklore, horror and the far side |
| **Catalogue** | 244 items — 123 gear, 70 weapons, 32 armour, 19 vehicles |
| **Skills / talents** | 62 skills, 19 talents |
| **Bestiary** | 184 statblocks across folklore, horror and the far side |
| **Eras** | modern, antique, future, anomalous — the agency is old and never abolishes anything |
| **Icons** | 292, all generated from `tools/icons.mjs`; no external art |
| **Starter scenario** | **BLACK PLATFORM**, a six-player action starter, importable as a single Adventure |
| **Compendia** | pregens, NPCs, skills, weapons, armour, gear, vehicles, powers, tables, rules, the starter |
| **Rules journal** | 12 pages, generated from `rules.mjs` so the book cannot drift from the code |
| **Rules journal** | 13 pages, generated from `rules.mjs` so the book cannot drift from the code |
<!-- box:end -->
---
@@ -152,19 +153,20 @@ template.json data model for every Actor and Item type
templates/ Handlebars sheets
styles/ one stylesheet
lang/en.json all user-facing text
icons/ dice/ fonts/ generated art
icons/ fonts/ art/ generated art
packs/ built LevelDB compendia (committed — see Deploying)
tools/
content.mjs the catalogue: skills, weapons, armour, gear, vehicles, NPCs
build-packs.mjs builds packs/ — runs the three guards first and refuses on failure
build-packs.mjs builds packs/ — runs the twenty-five guards first and refuses on failure
make-icons.mjs draws all 231 icons
make-dice-textures.mjs
rules-text.mjs generates the rules journal FROM rules.mjs
mission.mjs the case generator
mission-tables.mjs its content tables
check-rules.mjs guard: no rule may be defined twice
check-kits.mjs guard: every posting's kit must exist and be usable
check-lang.mjs guard: no localisation key may be both a value and a branch
check-lethality.mjs guard: no creature may quietly change what it does to a party
check-rollable.mjs guard: no clue may hide behind a roll nobody present can make
docs/REVIEW_LOG.md the design and defect log, R-1 onward
```
@@ -176,13 +178,34 @@ stops being identity-equal to what it aliases, if a constant is re-declared as a
literal, or if an exported rule has no spot-check. The packs used to be built under
one set of numbers and played under another; this makes that impossible to ship.
The build runs all three guards before it writes anything:
The build runs all twenty-five guards before it writes anything:
<!-- guards:start -->
```
check-rules: OK — 87 rules, 21 files scanned, 3 aliases + 41 constant sets checked, 275 formulas verified
check-kits: OK — 25 roles, 10 trades, 218 catalogue items, every kit key resolves, every posting can use what it carries, every loadout distinct
check-lang: OK — en.json, 945 keys, no leaf/branch collisions
check-behaviour: OK — 45 behavioural tests
check-seam: OK — 75 modules scanned, only all-specs.mjs reads NPCS/PREGENS from content.mjs
check-generator: OK — 210 posting × tier pairs draw from their own stores, 129 weapons issued, each with the skill it names
check-forge: OK — 450 creatures derived across 6 roles × 5 sizes × 5 tiers × 3 species, every one valid, armed with something its body can use, and reproducible from its seed; 90 of them forged identically from the built pack and from content.mjs; the tier ladder climbs across 15 measured fights
check-armed: OK — 35 creature(s) hold a weapon they have no skill for, every one on the record; no new ones
check-rules: OK — 113 rules, 73 files scanned, 3 aliases + 46 constant sets checked, 417 formulas verified
check-kits: OK — 25 roles, 10 trades, 226 catalogue items, every kit key resolves, every posting can use what it carries, every loadout distinct
check-lang: OK — en.json, 1044 keys, no leaf/branch collisions
check-templates: OK — 19 templates compile
check-behaviour: OK — 108 behavioural tests
check-scenarios: OK — 30 scenario files, 111 mechanic tags, every skill named resolves against 62 catalogue entries
check-rollable: OK — 101 rolls across 10 playable scenarios (records and art sheets are not rolls), every one reachable at 25% or better by somebody present
check-outcomes: OK — 21 beats, 18 state a failure, 6 a fumble, 8 a special; 81.3% of sessions hit a special with nothing written, down from 83.7% recorded
check-creatures: OK — 204 actor specs across 13 sources, every characteristic, skill, kit key, talent, species and style resolves, no duplicate keys
check-powers: OK — 142 powers classified, 2 wired and each one measurably changes its fight and is accounted for in the bestiary, 78 recorded as beyond the harness with a reason, 62 not fight rules
check-anatomy: OK — 5 body plans, 36 locations, d20 complete in both modes, every location drawn, every kind handled and destructible, 20 plan changes carried 432 wounds with their severity intact, 1 flyer(s) with a survivable landing
check-lethality: OK — 184 creatures, every one fighting exactly as recorded against the frozen party
check-focus: OK — focus fire measured against 138 packs, helps in 137 of them, 130 by more than their own noise; no measurable help against The dun cow, named in BESTIARY.md
check-firstblood: OK — the first disabling blow is worth 40 points of wipe rate in the four-player cut, 15.4 in the six-a-side line
check-attackers: OK — three of the four-player cut disable on 11.1% of their attacks or better, and one of them on 0.1%
check-fight-tail: OK — a fight past 15 rounds wipes the party 1.4x as often in the four-player cut and 2.4x at six a side, and nothing was truncated
check-packs: OK — 17 pack fights, 2000 runs each at seed 11, nothing truncated at 400 rounds, every figure matching the record
check-cited: OK — 187 cited figures across 30 scenario files resolve against 8 baselines
check-figures: 6 figure(s) waived, each on the record:
check-handouts: OK — 4 handouts, the two almanac pages identical in structure and columns, every line 41 miles from clean ground, nothing under 11pt
check-bestiary: OK — 184 creatures, the document matches the game
```
<!-- guards:end -->
+187
View File
@@ -0,0 +1,187 @@
/**
* Species anatomy: where a creature can be hit, and what it looks like.
*
* This lived inside ringbrp.mjs, where only Foundry could reach it. Node cannot import
* the engine — it touches `game`, `Hooks` and `foundry` at load — so any tool that wants
* to know a Cadence has five bodies and no head had no way to ask. tools/make-portraits
* and tools/mj-queue both need exactly that, for the same reason rules.mjs exists: art
* generated from the creature's own geometry CANNOT contradict its hit-location table,
* because they are the same numbers.
*
* Moved byte for byte. ringbrp.mjs now assigns RINGBRP.locationTables and RINGBRP.bodyArt
* from here, so the engine and the tools read one definition. There is no second copy.
*/
/* Location fractions are of TOTAL hit points. They were sized against the old
26-point pool; halving HP left a leg at 4 against a sidearm doing 4-6 through
armour, so 64% of hits crippled the limb they struck. Raised so a sidearm
cripples ~40% of the time and a rifle ~55%. */
export const LOCATION_TABLES = {
baseline: {
label: "RINGBRP.Species.Baseline",
locations: [
{ id: "legR", label: "RINGBRP.Loc.LegR", melee: [1, 4], ranged: [1, 3], frac: 0.42, kind: "leg" , slot: "lowerR" },
{ id: "legL", label: "RINGBRP.Loc.LegL", melee: [5, 8], ranged: [4, 6], frac: 0.42, kind: "leg" , slot: "lowerL" },
{ id: "abdomen", label: "RINGBRP.Loc.Abdomen", melee: [9, 11], ranged: [7, 10], frac: 0.42, kind: "body" , slot: "body" },
{ id: "chest", label: "RINGBRP.Loc.Chest", melee: [12, 12], ranged: [11, 15], frac: 0.5, kind: "vital", slot: "vital" },
{ id: "armR", label: "RINGBRP.Loc.ArmR", melee: [13, 15], ranged: [16, 17], frac: 0.35, kind: "arm" , slot: "upperR" },
{ id: "armL", label: "RINGBRP.Loc.ArmL", melee: [16, 18], ranged: [18, 19], frac: 0.35, kind: "arm" , slot: "upperL" },
{ id: "head", label: "RINGBRP.Loc.Head", melee: [19, 20], ranged: [20, 20], frac: 0.4, kind: "head" , slot: "head" }
]
},
/* A QUADRUPED — a bear, a horse, a hound, a big cat. Four legs, a barrel divided
into forequarters (heart and lungs, the killing shot) and hindquarters, a neck
worth aiming at, and a head that is HARDER to hit than a man's because it is
carried low and swung. The standard BRP animal table, split by attack type for
the same reason baseline is: a man with a spear is down among the legs, a man
with a rifle is looking at a broadside. */
quadruped: {
label: "RINGBRP.Species.Quadruped",
locations: [
{ id: "hindLegR", label: "RINGBRP.Loc.HindLegR", melee: [1, 3], ranged: [1, 2], frac: 0.42, kind: "leg" , slot: "lowerR" },
{ id: "hindLegL", label: "RINGBRP.Loc.HindLegL", melee: [4, 6], ranged: [3, 4], frac: 0.42, kind: "leg" , slot: "lowerL" },
{ id: "hindQtr", label: "RINGBRP.Loc.HindQtr", melee: [7, 9], ranged: [5, 8], frac: 0.42, kind: "body" , slot: "body" },
{ id: "foreQtr", label: "RINGBRP.Loc.ForeQtr", melee: [10, 12], ranged: [9, 13], frac: 0.5, kind: "vital", slot: "vital" },
{ id: "foreLegR", label: "RINGBRP.Loc.ForeLegR", melee: [13, 15], ranged: [14, 15], frac: 0.42, kind: "leg" , slot: "upperR" },
{ id: "foreLegL", label: "RINGBRP.Loc.ForeLegL", melee: [16, 18], ranged: [16, 17], frac: 0.42, kind: "leg" , slot: "upperL" },
{ id: "neck", label: "RINGBRP.Loc.Neck", melee: [19, 19], ranged: [18, 19], frac: 0.4, kind: "neck" , slot: "neck" },
{ id: "head", label: "RINGBRP.Loc.Head", melee: [20, 20], ranged: [20, 20], frac: 0.4, kind: "head" , slot: "head" }
]
},
/* A WINGED QUADRUPED — a dragon, a wyvern, a griffon. The quadruped, plus the two
things that make it a different fight: wings you can shoot down. On the ground
the wings are folded high and hard to reach; in the air they are the broadest
target on the animal, which is why the ranged column gives them six faces and
the melee column two. DISABLE ONE AND IT CANNOT FLY — see locationEffectsFor. */
winged: {
label: "RINGBRP.Species.Winged",
/* "a flyer with a hole in a wing is a quadruped" — the supporter's own tactics.
Disable either wing and the creature stops being a flyer: it drops to this plan,
the wings leave its hit table, and the six ranged faces they occupied go back to
the body it is now standing on. Declared here rather than in the engine so a
future flyer only has to say what it becomes. */
grounded: "quadruped",
locations: [
{ id: "hindLegR", label: "RINGBRP.Loc.HindLegR", melee: [1, 3], ranged: [1, 2], frac: 0.42, kind: "leg" , slot: "lowerR" },
{ id: "hindLegL", label: "RINGBRP.Loc.HindLegL", melee: [4, 6], ranged: [3, 4], frac: 0.42, kind: "leg" , slot: "lowerL" },
{ id: "hindQtr", label: "RINGBRP.Loc.HindQtr", melee: [7, 9], ranged: [5, 6], frac: 0.42, kind: "body" , slot: "body" },
{ id: "foreQtr", label: "RINGBRP.Loc.ForeQtr", melee: [10, 12], ranged: [7, 9], frac: 0.5, kind: "vital", slot: "vital" },
{ id: "foreLegR", label: "RINGBRP.Loc.ForeLegR", melee: [13, 14], ranged: [10, 10], frac: 0.42, kind: "leg" , slot: "upperR" },
{ id: "foreLegL", label: "RINGBRP.Loc.ForeLegL", melee: [15, 16], ranged: [11, 11], frac: 0.42, kind: "leg" , slot: "upperL" },
{ id: "wingR", label: "RINGBRP.Loc.WingR", melee: [17, 17], ranged: [12, 14], frac: 0.35, kind: "wing" , slot: "wingR", bare: true },
{ id: "wingL", label: "RINGBRP.Loc.WingL", melee: [18, 18], ranged: [15, 17], frac: 0.35, kind: "wing" , slot: "wingL", bare: true },
{ id: "neck", label: "RINGBRP.Loc.Neck", melee: [19, 19], ranged: [18, 19], frac: 0.4, kind: "neck" , slot: "neck" },
{ id: "head", label: "RINGBRP.Loc.Head", melee: [20, 20], ranged: [20, 20], frac: 0.4, kind: "head" , slot: "head" }
]
},
/* A VESH is bilaterally ASYMMETRIC: one long grasping limb, one short bracing
limb, and no head at all — the senses run along a dorsal ridge. There is no
single killing shot to the skull because there is no skull. The ridge is the
vital, and it is a long target rather than a small one. */
vesh: {
label: "RINGBRP.Species.Vesh",
locations: [
{ id: "footBrace", label: "RINGBRP.Loc.BraceFoot", melee: [1, 3], ranged: [1, 3], frac: 0.42, kind: "leg" , slot: "lower" },
{ id: "limbBrace", label: "RINGBRP.Loc.BraceLimb", melee: [4, 8], ranged: [4, 7], frac: 0.42, kind: "brace" , slot: "brace" },
{ id: "lowTrunk", label: "RINGBRP.Loc.LowerTrunk", melee: [9, 12], ranged: [8, 12], frac: 0.42, kind: "body" , slot: "body" },
{ id: "upTrunk", label: "RINGBRP.Loc.UpperTrunk", melee: [13, 15], ranged: [13, 15], frac: 0.42, kind: "body" , slot: "vital" },
{ id: "limbGrasp", label: "RINGBRP.Loc.GraspLimb", melee: [16, 18], ranged: [16, 17], frac: 0.35, kind: "grasp" , slot: "upper" },
{ id: "ridge", label: "RINGBRP.Loc.Ridge", melee: [19, 20], ranged: [18, 20], frac: 0.5, kind: "ridge" , slot: "head" }
]
},
/* A CADENCE is not one body. It is four to six small bodies that together are
one person, and the location roll picks which body you hit. Killing a body
does not kill the person — it reduces them. There is no vital and no head:
every body carries an equal share, and the person degrades as they are
whittled down. This is why shooting a Cadence feels like nothing is working. */
cadence: {
label: "RINGBRP.Species.Cadence",
locations: [
{ id: "bodyA", label: "RINGBRP.Loc.BodyA", melee: [1, 4], ranged: [1, 4], frac: 0.28, kind: "unit" , slot: "body" },
{ id: "bodyB", label: "RINGBRP.Loc.BodyB", melee: [5, 8], ranged: [5, 8], frac: 0.28, kind: "unit" , slot: "vital" },
{ id: "bodyC", label: "RINGBRP.Loc.BodyC", melee: [9, 12], ranged: [9, 12], frac: 0.28, kind: "unit" , slot: "head" },
{ id: "bodyD", label: "RINGBRP.Loc.BodyD", melee: [13, 16], ranged: [13, 16], frac: 0.28, kind: "unit" , slot: "lower" },
{ id: "bodyE", label: "RINGBRP.Loc.BodyE", melee: [17, 20], ranged: [17, 20], frac: 0.28, kind: "unit" , slot: "upper" }
]
}
};
/**
* The figure drawn on the combat tab. One entry per species profile, keyed by the
* same location ids as the table above, so a species that has a location gets a
* shape and one that does not simply has none — no separate list to keep in step.
*
* Deliberately blocky: these are readable at sheet size and honest about the
* anatomy. A Vesh is asymmetric with no head; a Cadence is five separate bodies.
*/
export const BODY_ART = {
baseline: {
viewBox: "0 0 120 196",
parts: {
head: { t: "ellipse", cx: 60, cy: 21, rx: 15, ry: 17 },
chest: { t: "rect", x: 40, y: 42, w: 40, h: 40, rx: 9 },
abdomen: { t: "rect", x: 44, y: 84, w: 32, h: 30, rx: 8 },
armR: { t: "rect", x: 18, y: 45, w: 17, h: 64, rx: 8 },
armL: { t: "rect", x: 85, y: 45, w: 17, h: 64, rx: 8 },
legR: { t: "rect", x: 43, y: 117, w: 15, h: 72, rx: 7 },
legL: { t: "rect", x: 62, y: 117, w: 15, h: 72, rx: 7 }
}
},
/* Side-on, because a quadruped seen from the front tells you nothing about which
end you hit. Landscape viewBox — the partial reads it from here, so a body plan
that is wider than it is tall simply draws that way. */
quadruped: {
viewBox: "0 0 208 132",
parts: {
hindQtr: { t: "rect", x: 34, y: 42, w: 58, h: 44, rx: 14 },
foreQtr: { t: "rect", x: 88, y: 38, w: 62, h: 50, rx: 14 },
neck: { t: "path", d: "M142 44 L176 24 L188 40 L154 62 Z" },
head: { t: "ellipse", cx: 186, cy: 28, rx: 19, ry: 14 },
hindLegR: { t: "rect", x: 40, y: 84, w: 13, h: 44, rx: 6 },
hindLegL: { t: "rect", x: 60, y: 84, w: 13, h: 44, rx: 6 },
foreLegR: { t: "rect", x: 104, y: 86, w: 13, h: 42, rx: 6 },
foreLegL: { t: "rect", x: 124, y: 86, w: 13, h: 42, rx: 6 }
}
},
/* The quadruped with both wings drawn spread rather than folded, because the
table's ranged column assumes a thing in the air. */
winged: {
viewBox: "0 0 208 132",
parts: {
wingR: { t: "path", d: "M96 40 L44 6 L18 26 L74 52 Z" },
wingL: { t: "path", d: "M100 44 L58 92 L82 116 L114 62 Z" },
hindQtr: { t: "rect", x: 34, y: 44, w: 56, h: 40, rx: 13 },
foreQtr: { t: "rect", x: 86, y: 40, w: 60, h: 46, rx: 13 },
neck: { t: "path", d: "M138 46 L172 26 L184 42 L150 64 Z" },
head: { t: "ellipse", cx: 184, cy: 30, rx: 18, ry: 13 },
hindLegR: { t: "rect", x: 42, y: 82, w: 12, h: 40, rx: 6 },
hindLegL: { t: "rect", x: 60, y: 82, w: 12, h: 40, rx: 6 },
foreLegR: { t: "rect", x: 102, y: 84, w: 12, h: 38, rx: 6 },
foreLegL: { t: "rect", x: 120, y: 84, w: 12, h: 38, rx: 6 }
}
},
/* One long grasping limb, one short bracing limb, a trunk that leans, and the
sensory ridge running down the back instead of a head. */
vesh: {
viewBox: "0 0 120 196",
parts: {
ridge: { t: "path", d: "M44 18 L70 14 L76 96 L52 100 Z" },
upTrunk: { t: "path", d: "M40 34 L70 30 L74 84 L44 88 Z" },
lowTrunk: { t: "path", d: "M44 90 L74 86 L78 132 L48 136 Z" },
limbGrasp: { t: "path", d: "M74 36 L96 44 L104 148 L86 150 L82 60 Z" },
limbBrace: { t: "rect", x: 20, y: 52, w: 16, h: 48, rx: 8 },
footBrace: { t: "path", d: "M46 136 L78 132 L84 188 L58 190 Z" }
}
},
/* Five bodies, one person. No vital, no head, every body an equal share. */
cadence: {
viewBox: "0 0 120 196",
parts: {
bodyA: { t: "ellipse", cx: 34, cy: 52, rx: 20, ry: 24 },
bodyB: { t: "ellipse", cx: 86, cy: 44, rx: 20, ry: 24 },
bodyC: { t: "ellipse", cx: 60, cy: 100, rx: 20, ry: 24 },
bodyD: { t: "ellipse", cx: 28, cy: 148, rx: 20, ry: 24 },
bodyE: { t: "ellipse", cx: 88, cy: 152, rx: 20, ry: 24 }
}
}
};
+213
View File
@@ -0,0 +1,213 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2400" height="1700" viewBox="0 0 2400 1700">
<!-- BELLHOUSE — RSG 12, section looking west. Player handout for STANDING ORDER.
DRAWN, NOT GENERATED. Every label here is load-bearing and Midjourney will not
hold legible text or accurate geography. Two rules from AFTERIMAGE v3.1:
numbered callouts with a key BENEATH the drawing (which kills every collision),
and the drawing says only what the site says — it shows where the rooms are and
nothing about the sum, which is Act Two's work.
Two inks only, matching the plates: black and civil-defence orange on newsprint. -->
<defs>
<style>
.ink { fill:none; stroke:#1d1b18; stroke-width:5; }
.ink2 { fill:none; stroke:#1d1b18; stroke-width:3; }
.thin { fill:none; stroke:#1d1b18; stroke-width:2; }
.room { fill:#faf6ec; stroke:#1d1b18; stroke-width:5; }
.rock { fill:#e6dfd0; stroke:#1d1b18; stroke-width:5; }
.orange { fill:#d4541e; }
.ornk { fill:none; stroke:#d4541e; stroke-width:5; }
.ash { fill:#d4541e; opacity:.20; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700;
font-size:46px; fill:#1d1b18; letter-spacing:7px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:23px;
fill:#1d1b18; letter-spacing:2px; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700;
font-size:30px; fill:#faf6ec; text-anchor:middle; }
.key { font-family:'Courier New',Courier,monospace; font-size:25px; fill:#1d1b18; }
.keyb { font-family:'Courier New',Courier,monospace; font-weight:700;
font-size:25px; fill:#1d1b18; }
.note { font-family:'Courier New',Courier,monospace; font-size:22px; fill:#5d574c; }
</style>
<pattern id="hatch" width="14" height="14" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
<line x1="0" y1="0" x2="0" y2="14" stroke="#1d1b18" stroke-width="1.5" opacity=".38"/>
</pattern>
</defs>
<rect width="2400" height="1700" fill="#f2ece0"/>
<rect x="48" y="48" width="2304" height="1604" class="thin"/>
<text x="92" y="118" class="ttl">BELLHOUSE — RSG 12</text>
<text x="92" y="156" class="sub">SECTION LOOKING WEST · SHELDON MOOR · COMMISSIONED 1962</text>
<!-- ─── surface ─────────────────────────────────────────────────────── -->
<!-- ash band: begins at the edge (2) and runs east over everything -->
<rect x="700" y="392" width="1560" height="34" class="ash"/>
<!-- ground line -->
<path class="ink" d="M140 426 H2260"/>
<!-- rock mass below -->
<path class="rock" d="M140 426 H2260 V1280 H140 Z"/>
<rect x="140" y="426" width="2120" height="854" fill="url(#hatch)" opacity=".5"/>
<!-- heather tufts along the surface -->
<g class="thin">
<path d="M190 426 l-9-20 M203 426 l4-22 M216 426 l11-18"/>
<path d="M430 426 l-9-20 M443 426 l4-22 M456 426 l11-18"/>
<path d="M900 426 l-9-20 M913 426 l4-22 M926 426 l11-18"/>
<path d="M1300 426 l-9-20 M1313 426 l4-22 M1326 426 l11-18"/>
<path d="M2150 426 l-9-20 M2163 426 l4-22 M2176 426 l11-18"/>
</g>
<!-- 1 · Wetherlaw farm -->
<path class="room" d="M250 426 v-96 h150 v96 Z"/>
<path class="ink2" d="M238 330 L325 276 L412 330"/>
<circle cx="325" cy="262" r="26" class="orange"/>
<text x="325" y="272" class="num">1</text>
<!-- 2 · the ash edge: a hard vertical boundary -->
<path class="ornk" d="M700 426 V352"/>
<circle cx="700" cy="318" r="26" class="orange"/>
<text x="700" y="328" class="num">2</text>
<!-- 3 · vent head -->
<path class="room" d="M1716 426 v-40 h68 v40 Z"/>
<path class="ink" d="M1692 386 h116"/>
<circle cx="1750" cy="330" r="26" class="orange"/>
<text x="1750" y="340" class="num">3</text>
<path class="thin" d="M1750 356 V380"/>
<!-- 4 · postal pipe head -->
<path class="ink2" d="M1880 426 v-30 h26 v30"/>
<circle cx="1893" cy="330" r="26" class="orange"/>
<text x="1893" y="340" class="num">4</text>
<path class="thin" d="M1893 356 V392"/>
<!-- 5 · adit portal -->
<path class="room" d="M2044 426 v-62 h96 v62 Z"/>
<circle cx="2092" cy="318" r="26" class="orange"/>
<text x="2092" y="328" class="num">5</text>
<!-- the adit itself, sloping down to the blast door -->
<path class="room" d="M2140 426 L2140 486 L1840 686 L1840 626 Z"/>
<!-- ─── below ───────────────────────────────────────────────────────── -->
<!-- 6 · blast door & lobby -->
<rect x="1620" y="626" width="220" height="150" class="room"/>
<path class="ornk" d="M1840 626 V776"/>
<circle cx="1730" cy="700" r="26" class="orange"/>
<text x="1730" y="710" class="num">6</text>
<!-- 7 · Control Room -->
<rect x="1180" y="626" width="400" height="150" class="room"/>
<circle cx="1380" cy="700" r="26" class="orange"/>
<text x="1380" y="710" class="num">7</text>
<!-- 8 · Registry -->
<rect x="760" y="626" width="380" height="150" class="room"/>
<g class="thin">
<path d="M800 646 V756 M840 646 V756 M880 646 V756 M920 646 V756 M960 646 V756 M1000 646 V756 M1040 646 V756 M1080 646 V756"/>
</g>
<circle cx="950" cy="700" r="26" class="orange"/>
<text x="950" y="710" class="num">8</text>
<!-- 9 · Sick bay -->
<rect x="360" y="626" width="360" height="150" class="room"/>
<g class="thin"><path d="M392 736 h70 M492 736 h70 M592 736 h70"/></g>
<circle cx="540" cy="686" r="26" class="orange"/>
<text x="540" y="696" class="num">9</text>
<!-- the spine corridor -->
<path class="room" d="M360 796 H1840 V846 H360 Z"/>
<!-- 10 · crèche & school -->
<rect x="360" y="866" width="360" height="200" class="room"/>
<circle cx="540" cy="966" r="26" class="orange"/>
<text x="540" y="976" class="num">10</text>
<!-- 11 · pipe room -->
<rect x="760" y="866" width="260" height="200" class="room"/>
<circle cx="890" cy="966" r="26" class="orange"/>
<text x="890" y="976" class="num">11</text>
<!-- the pneumatic line, pipe room to the surface head -->
<path class="ornk" d="M760 900 H740 V540 H1893 V426" stroke-dasharray="14 10"/>
<!-- 12 · plant floor -->
<rect x="1060" y="866" width="520" height="200" class="room"/>
<circle cx="1320" cy="966" r="26" class="orange"/>
<text x="1320" y="976" class="num">12</text>
<g class="thin">
<circle cx="1140" cy="966" r="34"/><circle cx="1230" cy="966" r="34"/>
</g>
<!-- 16 · dormitories, 17 · canteen and quarters (issue 3) -->
<rect x="1620" y="866" width="100" height="200" class="room"/>
<g class="thin"><path d="M1640 900 V1040 M1660 900 V1040 M1680 900 V1040 M1700 900 V1040"/></g>
<circle cx="1670" cy="966" r="26" class="orange"/>
<text x="1670" y="976" class="num">16</text>
<rect x="1740" y="866" width="100" height="200" class="room"/>
<circle cx="1790" cy="966" r="26" class="orange"/>
<text x="1790" y="976" class="num">17</text>
<path class="room" d="M1580 1006 H1620 V1026 H1580 Z"/>
<path class="room" d="M1720 1006 H1740 V1026 H1720 Z"/>
<!-- ventilation shaft, plant floor to the vent head -->
<path class="thin" d="M1580 950 H1600 V566 H1750 V426" stroke-dasharray="10 8"/>
<!-- ─── pit galleries (issue 3) ─────────────────────────────────────── -->
<!-- incline, plant floor north end down to the coal roads -->
<path class="room" d="M1500 1066 L1560 1066 L1650 1150 L1590 1150 Z"/>
<!-- 14 · coal roads, unlined -->
<rect x="700" y="1150" width="950" height="54" class="room" stroke-dasharray="16 9"/>
<g class="thin"><path d="M760 1177 h40 M840 1177 h40 M920 1177 h40 M1360 1177 h40 M1440 1177 h40 M1520 1177 h40"/></g>
<circle cx="1180" cy="1177" r="26" class="orange"/>
<text x="1180" y="1187" class="num">14</text>
<!-- 13 · Vigil hall, south of the roads -->
<rect x="660" y="1162" width="40" height="30" class="room" stroke-width="0"/>
<rect x="360" y="1122" width="300" height="120" class="room"/>
<circle cx="510" cy="1182" r="26" class="orange"/>
<text x="510" y="1192" class="num">13</text>
<!-- 15 · the Sump, a stair below the roads -->
<rect x="1000" y="1204" width="24" height="16" class="room" stroke-width="0"/>
<rect x="900" y="1218" width="260" height="50" class="room"/>
<circle cx="1030" cy="1243" r="22" class="orange"/>
<text x="1030" y="1252" class="num" font-size="26">15</text>
<!-- 18 · the Estate, north of the roads: three roads of dwellings -->
<rect x="1650" y="1162" width="40" height="30" class="room" stroke-width="0"/>
<rect x="1690" y="1122" width="550" height="140" class="room"/>
<g class="thin">
<path d="M1690 1162 H2240 M1690 1192 H2240 M1690 1222 H2240"/>
<path d="M1720 1122 V1162 M1750 1122 V1162 M1780 1122 V1162 M1810 1122 V1162 M1840 1122 V1162 M1870 1122 V1162 M1900 1122 V1162 M2030 1122 V1162 M2060 1122 V1162 M2090 1122 V1162 M2120 1122 V1162 M2150 1122 V1162 M2180 1122 V1162 M2210 1122 V1162"/>
<path d="M1720 1222 V1262 M1750 1222 V1262 M1780 1222 V1262 M1810 1222 V1262 M1840 1222 V1262 M1870 1222 V1262 M1900 1222 V1262 M2030 1222 V1262 M2060 1222 V1262 M2090 1222 V1262 M2120 1222 V1262 M2150 1222 V1262 M2180 1222 V1262 M2210 1222 V1262"/>
</g>
<circle cx="1965" cy="1192" r="26" class="orange"/>
<text x="1965" y="1202" class="num">18</text>
<text x="140" y="1312" class="note">rock mass hatched · pit galleries dashed · pneumatic line dashed orange · ventilation dashed black · not to scale</text>
<!-- ─── key ─────────────────────────────────────────────────────────── -->
<path class="ink2" d="M92 1336 H2308"/>
<text x="92" y="1378" class="keyb">ABOVE</text>
<text x="980" y="1378" class="keyb">BELOW</text>
<g class="key">
<text x="92" y="1418">1 · Wetherlaw farm — coal soot in the yard</text>
<text x="92" y="1452">2 · The soot edge — straight 400 m, then a right angle</text>
<text x="92" y="1486">3 · Vent head — warm, smells of a coal fire; the crossing</text>
<text x="92" y="1520">4 · Postal pipe — 4-inch pneumatic; Centre answers</text>
<text x="92" y="1554">5 · The adit — backfilled 1975</text>
<text x="980" y="1418">6 · Lobby and Enquiries — the blast lock</text>
<text x="980" y="1452">7 · Control Room and studio — the safe</text>
<text x="980" y="1486">8 · Registry — the Order</text>
<text x="980" y="1520">9 · Sick bay and maternity</text>
<text x="980" y="1554">10 · Crèche and school</text>
<text x="980" y="1588">11 · Pipe room — Centre's in-tray</text>
<text x="980" y="1622">12 · Plant floor — boilers, transmitter</text>
<text x="1650" y="1418">13 · Vigil hall</text>
<text x="1650" y="1452">14 · Coal roads — beds, Buffer Depot</text>
<text x="1650" y="1486">15 · The Sump</text>
<text x="1650" y="1520">16 · Dormitories — 240 berths</text>
<text x="1650" y="1554">17 · Canteen, kitchen and officers' cabins</text>
<text x="1650" y="1588">18 · The Estate — 213 family dwellings</text>
</g>
<!-- reference box, house convention -->
<rect x="92" y="1570" width="640" height="72" class="thin"/>
<text x="112" y="1600" class="note">SO-H04 · SECTION · STANDING ORDER</text>
<text x="112" y="1630" class="note">ISSUE 3 · NOT TO BE REMOVED FROM THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

+398
View File
@@ -0,0 +1,398 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — CANTEEN &amp; QUARTERS. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="100" width="2700" height="300" class="rm2"/>
<text x="1150" y="230" class="lbl">LOWER CORRIDOR</text>
<line x1="2700" y1="340" x2="2785" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="2485.2" y="60" class="sub exit">DORMITORIES · SHEET 9 →</text>
<rect x="50" y="400" width="1350" height="1100" class="rm"/>
<text x="80" y="475" class="lbl">CANTEEN</text>
<circle cx="1355" cy="445" r="30" class="numc"/><text x="1355" y="458" class="num">17</text>
<rect x="120" y="560" width="520" height="60" class="fur"/>
<rect x="132" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="132" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="720" y="560" width="520" height="60" class="fur"/>
<rect x="732" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="732" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="520" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="626" width="34" height="34" rx="6" class="fur"/>
<rect x="120" y="750" width="520" height="60" class="fur"/>
<rect x="132" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="132" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="720" y="750" width="520" height="60" class="fur"/>
<rect x="732" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="732" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="816" width="34" height="34" rx="6" class="fur"/>
<rect x="120" y="940" width="520" height="60" class="fur"/>
<rect x="132" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="132" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="720" y="940" width="520" height="60" class="fur"/>
<rect x="732" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="732" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="1006" width="34" height="34" rx="6" class="fur"/>
<rect x="120" y="1130" width="520" height="60" class="fur"/>
<rect x="132" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="132" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="720" y="1130" width="520" height="60" class="fur"/>
<rect x="732" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="732" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="1090" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="1196" width="34" height="34" rx="6" class="fur"/>
<rect x="120" y="1320" width="520" height="60" class="fur"/>
<rect x="132" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="132" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="178" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="224" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="270" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="316" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="362" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="408" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="454" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="500" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="546" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="592" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="720" y="1320" width="520" height="60" class="fur"/>
<rect x="732" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="732" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="778" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="824" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="916" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="962" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="1008" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="1054" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="1100" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="1146" y="1386" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="1280" width="34" height="34" rx="6" class="fur"/>
<rect x="1192" y="1386" width="34" height="34" rx="6" class="fur"/>
<text x="100" y="1480" class="pen" transform="rotate(-1 100 1480)">four sittings — 6, 7, 8 and 9 o'clock</text>
<rect x="1400" y="400" width="600" height="700" class="rm"/>
<text x="1430" y="475" class="lbl">KITCHEN</text>
<rect x="1420" y="550" width="60" height="500" class="fur"/>
<text x="1495" y="1060" class="sub">servery</text>
<rect x="1640" y="520" width="320" height="100" class="fur"/>
<text x="1800" y="577" class="fl" font-size="20">RANGES</text>
<rect x="1640" y="680" width="320" height="120" class="fur"/>
<text x="1800" y="747" class="fl" font-size="20">COPPERS</text>
<rect x="1580" y="880" width="360" height="80" class="fur"/>
<text x="1760" y="927" class="fl" font-size="20">PREP</text>
<line x1="1400" y1="550" x2="1400" y2="1050" class="gap"/>
<rect x="1400" y="1100" width="600" height="400" class="rm"/>
<text x="1430" y="1175" class="lbl">BAKERY</text>
<rect x="1460" y="1260" width="220" height="140" class="fur"/>
<text x="1570" y="1337" class="fl" font-size="20">OVEN</text>
<rect x="1860" y="1240" width="100" height="220" class="fur"/>
<path d="M1860 1265H1960M1860 1290H1960M1860 1315H1960M1860 1340H1960M1860 1365H1960M1860 1390H1960M1860 1415H1960M1860 1440H1960" class="fine"/>
<rect x="2000" y="400" width="325" height="220" class="rm"/>
<rect x="2000" y="620" width="325" height="220" class="rm"/>
<rect x="2000" y="840" width="325" height="220" class="rm"/>
<rect x="2000" y="1060" width="325" height="220" class="rm"/>
<rect x="2000" y="1280" width="325" height="220" class="rm"/>
<rect x="2325" y="400" width="100" height="1100" class="rm2"/>
<rect x="2425" y="400" width="325" height="220" class="rm"/>
<rect x="2425" y="620" width="325" height="220" class="rm"/>
<rect x="2425" y="840" width="325" height="220" class="rm"/>
<rect x="2425" y="1060" width="325" height="220" class="rm"/>
<rect x="2425" y="1280" width="325" height="220" class="rm"/>
<rect x="2030" y="420" width="90" height="180" class="fur"/>
<line x1="2030" y1="465" x2="2120" y2="465" class="fine"/>
<rect x="2160" y="420" width="70" height="60" class="fur"/>
<line x1="2325" y1="510" x2="2325" y2="590" class="gap"/>
<path d="M2325 510L2245 510A80 80 0 0 0 2325 590" class="swing"/>
<text x="2130" y="595" class="sub">C1</text>
<rect x="2630" y="420" width="90" height="180" class="fur"/>
<line x1="2630" y1="465" x2="2720" y2="465" class="fine"/>
<rect x="2530" y="420" width="70" height="60" class="fur"/>
<line x1="2425" y1="510" x2="2425" y2="590" class="gap"/>
<path d="M2425 510L2505 510A80 80 0 0 1 2425 590" class="swing"/>
<text x="2520" y="595" class="sub">C2</text>
<rect x="2030" y="640" width="90" height="180" class="fur"/>
<line x1="2030" y1="685" x2="2120" y2="685" class="fine"/>
<rect x="2160" y="640" width="70" height="60" class="fur"/>
<line x1="2325" y1="730" x2="2325" y2="810" class="gap"/>
<path d="M2325 730L2245 730A80 80 0 0 0 2325 810" class="swing"/>
<text x="2130" y="815" class="sub">C3</text>
<rect x="2630" y="640" width="90" height="180" class="fur"/>
<line x1="2630" y1="685" x2="2720" y2="685" class="fine"/>
<rect x="2530" y="640" width="70" height="60" class="fur"/>
<line x1="2425" y1="730" x2="2425" y2="810" class="gap"/>
<path d="M2425 730L2505 730A80 80 0 0 1 2425 810" class="swing"/>
<text x="2520" y="815" class="sub">C4</text>
<rect x="2030" y="860" width="90" height="180" class="fur"/>
<line x1="2030" y1="905" x2="2120" y2="905" class="fine"/>
<rect x="2160" y="860" width="70" height="60" class="fur"/>
<line x1="2325" y1="950" x2="2325" y2="1030" class="gap"/>
<path d="M2325 950L2245 950A80 80 0 0 0 2325 1030" class="swing"/>
<text x="2130" y="1035" class="sub">C5</text>
<rect x="2630" y="860" width="90" height="180" class="fur"/>
<line x1="2630" y1="905" x2="2720" y2="905" class="fine"/>
<rect x="2530" y="860" width="70" height="60" class="fur"/>
<line x1="2425" y1="950" x2="2425" y2="1030" class="gap"/>
<path d="M2425 950L2505 950A80 80 0 0 1 2425 1030" class="swing"/>
<text x="2520" y="1035" class="sub">C6</text>
<rect x="2030" y="1080" width="90" height="180" class="fur"/>
<line x1="2030" y1="1125" x2="2120" y2="1125" class="fine"/>
<rect x="2160" y="1080" width="70" height="60" class="fur"/>
<line x1="2325" y1="1170" x2="2325" y2="1250" class="gap"/>
<path d="M2325 1170L2245 1170A80 80 0 0 0 2325 1250" class="swing"/>
<text x="2130" y="1255" class="sub">C7</text>
<rect x="2630" y="1080" width="90" height="180" class="fur"/>
<line x1="2630" y1="1125" x2="2720" y2="1125" class="fine"/>
<rect x="2530" y="1080" width="70" height="60" class="fur"/>
<line x1="2425" y1="1170" x2="2425" y2="1250" class="gap"/>
<path d="M2425 1170L2505 1170A80 80 0 0 1 2425 1250" class="swing"/>
<text x="2520" y="1255" class="sub">C8</text>
<rect x="2030" y="1300" width="90" height="180" class="fur"/>
<line x1="2030" y1="1345" x2="2120" y2="1345" class="fine"/>
<rect x="2160" y="1300" width="70" height="60" class="fur"/>
<line x1="2325" y1="1390" x2="2325" y2="1470" class="gap"/>
<path d="M2325 1390L2245 1390A80 80 0 0 0 2325 1470" class="swing"/>
<text x="2130" y="1475" class="sub">C9</text>
<rect x="2630" y="1300" width="90" height="180" class="fur"/>
<line x1="2630" y1="1345" x2="2720" y2="1345" class="fine"/>
<rect x="2530" y="1300" width="70" height="60" class="fur"/>
<line x1="2425" y1="1390" x2="2425" y2="1470" class="gap"/>
<path d="M2425 1390L2505 1390A80 80 0 0 1 2425 1470" class="swing"/>
<text x="2520" y="1475" class="sub">C10</text>
<text x="2010" y="1550" class="sub">OFFICERS' CABINS · 2 BERTHS EACH</text>
<text x="2020" y="1610" class="pen" transform="rotate(-1 2020 1610)">C1 — Controller</text>
<line x1="2325" y1="400" x2="2425" y2="400" class="gap2"/>
<line x1="200" y1="400" x2="300" y2="400" class="gap"/>
<path d="M200 400L200 300A100 100 0 0 1 300 400" class="swing"/>
<line x1="1100" y1="400" x2="1200" y2="400" class="gap"/>
<path d="M1100 400L1100 300A100 100 0 0 1 1200 400" class="swing"/>
<line x1="1840" y1="400" x2="1940" y2="400" class="gap"/>
<path d="M1840 400L1840 300A100 100 0 0 1 1940 400" class="swing"/>
<line x1="1720" y1="1100" x2="1820" y2="1100" class="gap"/>
<path d="M1720 1100L1720 1200A100 100 0 0 0 1820 1100" class="swing"/>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 10 OF 13 · LEVEL 2 · QUARTERS</text>
<text x="1924" y="1815" class="ttl">CANTEEN &amp; QUARTERS</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/10 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

+152
View File
@@ -0,0 +1,152 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — CONTROL ROOM. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="100" width="2700" height="300" class="rm2"/>
<text x="1150" y="230" class="lbl">MAIN CORRIDOR</text>
<line x1="100" y1="340" x2="15" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="20" y="60" class="sub exit">← LOBBY · SHEET 1</text>
<line x1="2700" y1="340" x2="2785" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="2523" y="60" class="sub exit">REGISTRY · SHEET 3 →</text>
<rect x="100" y="400" width="1300" height="900" class="rm"/>
<text x="130" y="475" class="lbl">CONTROL ROOM</text>
<text x="130" y="513" class="sub">Controller's floor</text>
<circle cx="1355" cy="445" r="30" class="numc"/><text x="1355" y="458" class="num">7</text>
<rect x="160" y="560" width="1180" height="90" class="fur"/>
<text x="750" y="612" class="fl" font-size="20">CONSOLE · DIALS · TANNOY DESK</text>
<rect x="240" y="665" width="34" height="34" rx="6" class="fur"/>
<rect x="380" y="665" width="34" height="34" rx="6" class="fur"/>
<rect x="520" y="665" width="34" height="34" rx="6" class="fur"/>
<rect x="660" y="665" width="34" height="34" rx="6" class="fur"/>
<rect x="800" y="665" width="34" height="34" rx="6" class="fur"/>
<rect x="940" y="665" width="34" height="34" rx="6" class="fur"/>
<rect x="1080" y="665" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="665" width="34" height="34" rx="6" class="fur"/>
<rect x="350" y="810" width="600" height="250" class="fur"/>
<text x="650" y="942" class="fl" font-size="20">SITUATION MAP · REGION 12</text>
<rect x="390" y="750" width="34" height="34" rx="6" class="fur"/>
<rect x="390" y="1080" width="34" height="34" rx="6" class="fur"/>
<rect x="630" y="750" width="34" height="34" rx="6" class="fur"/>
<rect x="630" y="1080" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="750" width="34" height="34" rx="6" class="fur"/>
<rect x="870" y="1080" width="34" height="34" rx="6" class="fur"/>
<circle cx="1230" cy="1150" r="55" class="fur"/>
<text x="1230" y="1157" class="fl" font-size="18">SCOPE</text>
<text x="900" y="1270" class="pen" transform="rotate(-2 900 1270)">SEALED 1974 — by order</text>
<rect x="1400" y="400" width="600" height="500" class="rm"/>
<text x="1430" y="475" class="lbl">CONTROLLER</text>
<text x="1430" y="513" class="sub">E. Sowerby</text>
<rect x="1520" y="580" width="240" height="110" class="fur"/>
<text x="1640" y="642" class="fl" font-size="20">DESK</text>
<rect x="1620" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="1910" y="430" width="70" height="360" class="fur"/>
<path d="M1910 455H1980M1910 480H1980M1910 505H1980M1910 530H1980M1910 555H1980M1910 580H1980M1910 605H1980M1910 630H1980M1910 655H1980M1910 680H1980M1910 705H1980M1910 730H1980M1910 755H1980M1910 780H1980" class="fine"/>
<text x="1730" y="860" class="sub">files · Centre</text>
<rect x="1400" y="900" width="600" height="600" class="rm"/>
<text x="1430" y="975" class="lbl">STUDIO</text>
<text x="1430" y="1013" class="sub">broadcast · 1962</text>
<rect x="1560" y="1070" width="200" height="120" class="fur"/>
<circle cx="1610" cy="1120" r="32" class="fine"/>
<circle cx="1710" cy="1120" r="32" class="fine"/>
<text x="1660" y="1182" class="fl" font-size="15">TAPE DECK</text>
<rect x="1890" y="925" width="80" height="80" class="fur"/>
<path d="M1890 925l80 80M1970 925l-80 80" class="fine"/>
<text x="1930" y="1035" class="fl" font-size="16">SAFE</text>
<rect x="1520" y="1260" width="260" height="90" class="fur"/>
<text x="1650" y="1312" class="fl" font-size="20">MIXER</text>
<rect x="1630" y="1370" width="34" height="34" rx="6" class="fur"/>
<circle cx="1920" cy="1370" r="30" class="fur"/>
<text x="1920" y="1377" class="fl" font-size="18">MIC</text>
<text x="1430" y="1475" class="pen" transform="rotate(-1 1430 1475)">new tape rec'd from Centre 2019</text>
<rect x="2000" y="400" width="750" height="500" class="rm"/>
<text x="2030" y="475" class="lbl">SECRETARIAT</text>
<text x="2030" y="513" class="sub">minutes · rotas</text>
<rect x="2060" y="610" width="160" height="80" class="fur"/>
<rect x="2120" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="2280" y="610" width="160" height="80" class="fur"/>
<rect x="2340" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="2500" y="610" width="160" height="80" class="fur"/>
<rect x="2560" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="2040" y="820" width="300" height="55" class="fur"/>
<path d="M2065 820V875M2090 820V875M2115 820V875M2140 820V875M2165 820V875M2190 820V875M2215 820V875M2240 820V875M2265 820V875M2290 820V875M2315 820V875" class="fine"/>
<rect x="2000" y="900" width="750" height="600" class="rm"/>
<text x="2030" y="975" class="lbl">COMMS</text>
<text x="2030" y="1013" class="sub">teleprinters · switchboard</text>
<rect x="2100" y="1090" width="130" height="100" class="fur"/>
<text x="2165" y="1147" class="fl" font-size="20">TP</text>
<rect x="2270" y="1090" width="130" height="100" class="fur"/>
<text x="2335" y="1147" class="fl" font-size="20">TP</text>
<rect x="2060" y="1270" width="500" height="90" class="fur"/>
<text x="2310" y="1322" class="fl" font-size="20">SWITCHBOARD</text>
<rect x="2160" y="1390" width="34" height="34" rx="6" class="fur"/>
<rect x="2360" y="1390" width="34" height="34" rx="6" class="fur"/>
<text x="2440" y="1130" class="pen" transform="rotate(4 2440 1130)">no line out</text>
<line x1="220" y1="400" x2="320" y2="400" class="gap"/>
<path d="M220 400L220 300A100 100 0 0 1 320 400" class="swing"/>
<line x1="1480" y1="400" x2="1580" y2="400" class="gap"/>
<path d="M1480 400L1480 300A100 100 0 0 1 1580 400" class="swing"/>
<line x1="2580" y1="400" x2="2680" y2="400" class="gap"/>
<path d="M2580 400L2580 300A100 100 0 0 1 2680 400" class="swing"/>
<line x1="1400" y1="1160" x2="1400" y2="1260" class="gap"/>
<path d="M1400 1160L1300 1160A100 100 0 0 0 1400 1260" class="swing"/>
<line x1="1440" y1="900" x2="1530" y2="900" class="gap"/>
<path d="M1440 900L1440 810A90 90 0 0 1 1530 900" class="swing"/>
<line x1="2610" y1="900" x2="2710" y2="900" class="gap"/>
<path d="M2610 900L2610 800A100 100 0 0 1 2710 900" class="swing"/>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 2 OF 13 · LEVEL 1 · GOVERNMENT</text>
<text x="1924" y="1815" class="ttl">CONTROL ROOM</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/02 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

+202
View File
@@ -0,0 +1,202 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — CRECHE &amp; SCHOOL. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="100" width="2400" height="300" class="rm2"/>
<text x="950" y="230" class="lbl">LOWER CORRIDOR</text>
<rect x="2450" y="100" width="300" height="300" class="rm2"/>
<path d="M2450 130H2750M2450 160H2750M2450 190H2750M2450 220H2750M2450 250H2750M2450 280H2750M2450 310H2750M2450 340H2750M2450 370H2750" class="fine"/>
<rect x="2578" y="232" width="44" height="30" fill="#11417d"/>
<text x="2600" y="255" class="fl" font-size="19">UP</text>
<text x="2060" y="60" class="sub">UP TO LEVEL 1 · SHEET 4</text>
<line x1="2450" y1="150" x2="2450" y2="350" class="gap2"/>
<line x1="100" y1="340" x2="15" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="20" y="60" class="sub exit">← PIPE ROOM &amp; PLANT · SHEET 6</text>
<rect x="100" y="400" width="500" height="400" class="rm"/>
<text x="130" y="475" class="lbl">CLOAKS</text>
<circle cx="130" cy="530" r="7" fill="#e8f1fb"/>
<circle cx="130" cy="580" r="7" fill="#e8f1fb"/>
<circle cx="130" cy="630" r="7" fill="#e8f1fb"/>
<circle cx="130" cy="680" r="7" fill="#e8f1fb"/>
<circle cx="130" cy="730" r="7" fill="#e8f1fb"/>
<rect x="100" y="800" width="500" height="500" class="rm"/>
<text x="130" y="875" class="lbl">STAFF</text>
<text x="130" y="913" class="sub">K. Marlow</text>
<rect x="150" y="1020" width="90" height="200" class="fur"/>
<line x1="150" y1="1065" x2="240" y2="1065" class="fine"/>
<rect x="340" y="960" width="180" height="80" class="fur"/>
<text x="430" y="1007" class="fl" font-size="20">DESK</text>
<rect x="600" y="400" width="1000" height="700" class="rm"/>
<text x="630" y="475" class="lbl">SCHOOLROOM</text>
<circle cx="1555" cy="445" r="30" class="numc"/><text x="1555" y="458" class="num">10</text>
<rect x="700" y="520" width="500" height="25" class="fur"/>
<text x="700" y="590" class="sub">BLACKBOARD</text>
<rect x="1280" y="560" width="200" height="90" class="fur"/>
<text x="1380" y="612" class="fl" font-size="20">TEACHER</text>
<rect x="700" y="690" width="130" height="60" class="fur"/>
<rect x="700" y="810" width="130" height="60" class="fur"/>
<rect x="700" y="930" width="130" height="60" class="fur"/>
<rect x="900" y="690" width="130" height="60" class="fur"/>
<rect x="900" y="810" width="130" height="60" class="fur"/>
<rect x="900" y="930" width="130" height="60" class="fur"/>
<rect x="1100" y="690" width="130" height="60" class="fur"/>
<rect x="1100" y="810" width="130" height="60" class="fur"/>
<rect x="1100" y="930" width="130" height="60" class="fur"/>
<rect x="1300" y="690" width="130" height="60" class="fur"/>
<rect x="1300" y="810" width="130" height="60" class="fur"/>
<rect x="1300" y="930" width="130" height="60" class="fur"/>
<text x="1240" y="1070" class="pen" transform="rotate(-2 1240 1070)">atlas: 1971 edition</text>
<rect x="1600" y="400" width="1150" height="700" class="rm"/>
<text x="1630" y="475" class="lbl">PLAYROOM</text>
<rect x="1620" y="420" width="1110" height="16" fill="#e8f1fb" opacity=".5"/>
<text x="1630" y="540" class="sub">pinned drawings along this wall</text>
<rect x="1800" y="660" width="400" height="260" class="fur"/>
<text x="2000" y="797" class="fl" font-size="20">RUG</text>
<circle cx="2350" cy="700" r="35" class="fur"/>
<circle cx="2540" cy="640" r="35" class="fur"/>
<circle cx="2460" cy="880" r="35" class="fur"/>
<circle cx="1720" cy="990" r="35" class="fur"/>
<rect x="2560" y="960" width="140" height="110" class="fur"/>
<text x="2630" y="1020.6" class="fl" font-size="16">TOYS</text>
<rect x="600" y="1100" width="1400" height="500" class="rm"/>
<text x="630" y="1175" class="lbl">DORMITORY</text>
<text x="630" y="1213" class="sub">under-twelves</text>
<rect x="660" y="1240" width="70" height="130" class="fur"/>
<line x1="660" y1="1285" x2="730" y2="1285" class="fine"/>
<rect x="660" y="1440" width="70" height="130" class="fur"/>
<line x1="660" y1="1485" x2="730" y2="1485" class="fine"/>
<rect x="755" y="1240" width="70" height="130" class="fur"/>
<line x1="755" y1="1285" x2="825" y2="1285" class="fine"/>
<rect x="755" y="1440" width="70" height="130" class="fur"/>
<line x1="755" y1="1485" x2="825" y2="1485" class="fine"/>
<rect x="850" y="1240" width="70" height="130" class="fur"/>
<line x1="850" y1="1285" x2="920" y2="1285" class="fine"/>
<rect x="850" y="1440" width="70" height="130" class="fur"/>
<line x1="850" y1="1485" x2="920" y2="1485" class="fine"/>
<rect x="945" y="1240" width="70" height="130" class="fur"/>
<line x1="945" y1="1285" x2="1015" y2="1285" class="fine"/>
<rect x="945" y="1440" width="70" height="130" class="fur"/>
<line x1="945" y1="1485" x2="1015" y2="1485" class="fine"/>
<rect x="1040" y="1240" width="70" height="130" class="fur"/>
<line x1="1040" y1="1285" x2="1110" y2="1285" class="fine"/>
<rect x="1040" y="1440" width="70" height="130" class="fur"/>
<line x1="1040" y1="1485" x2="1110" y2="1485" class="fine"/>
<rect x="1135" y="1240" width="70" height="130" class="fur"/>
<line x1="1135" y1="1285" x2="1205" y2="1285" class="fine"/>
<rect x="1135" y="1440" width="70" height="130" class="fur"/>
<line x1="1135" y1="1485" x2="1205" y2="1485" class="fine"/>
<rect x="1230" y="1240" width="70" height="130" class="fur"/>
<line x1="1230" y1="1285" x2="1300" y2="1285" class="fine"/>
<rect x="1230" y="1440" width="70" height="130" class="fur"/>
<line x1="1230" y1="1485" x2="1300" y2="1485" class="fine"/>
<rect x="1325" y="1240" width="70" height="130" class="fur"/>
<line x1="1325" y1="1285" x2="1395" y2="1285" class="fine"/>
<rect x="1325" y="1440" width="70" height="130" class="fur"/>
<line x1="1325" y1="1485" x2="1395" y2="1485" class="fine"/>
<rect x="1420" y="1240" width="70" height="130" class="fur"/>
<line x1="1420" y1="1285" x2="1490" y2="1285" class="fine"/>
<rect x="1420" y="1440" width="70" height="130" class="fur"/>
<line x1="1420" y1="1485" x2="1490" y2="1485" class="fine"/>
<rect x="1515" y="1240" width="70" height="130" class="fur"/>
<line x1="1515" y1="1285" x2="1585" y2="1285" class="fine"/>
<rect x="1515" y="1440" width="70" height="130" class="fur"/>
<line x1="1515" y1="1485" x2="1585" y2="1485" class="fine"/>
<rect x="1610" y="1240" width="70" height="130" class="fur"/>
<line x1="1610" y1="1285" x2="1680" y2="1285" class="fine"/>
<rect x="1610" y="1440" width="70" height="130" class="fur"/>
<line x1="1610" y1="1485" x2="1680" y2="1485" class="fine"/>
<rect x="1705" y="1240" width="70" height="130" class="fur"/>
<line x1="1705" y1="1285" x2="1775" y2="1285" class="fine"/>
<rect x="1705" y="1440" width="70" height="130" class="fur"/>
<line x1="1705" y1="1485" x2="1775" y2="1485" class="fine"/>
<rect x="1800" y="1240" width="70" height="130" class="fur"/>
<line x1="1800" y1="1285" x2="1870" y2="1285" class="fine"/>
<rect x="1800" y="1440" width="70" height="130" class="fur"/>
<line x1="1800" y1="1485" x2="1870" y2="1485" class="fine"/>
<rect x="1895" y="1240" width="70" height="130" class="fur"/>
<line x1="1895" y1="1285" x2="1965" y2="1285" class="fine"/>
<rect x="1895" y="1440" width="70" height="130" class="fur"/>
<line x1="1895" y1="1485" x2="1965" y2="1485" class="fine"/>
<circle cx="1320" cy="1140" r="16" class="fur"/>
<path d="M1344 1124a24 24 0 0 1 0 32M1354 1114a38 38 0 0 1 0 52" class="fine"/>
<text x="1420" y="1210" class="pen" transform="rotate(-1 1420 1210)">speaker fitted 2019 — 03:00 nightly</text>
<rect x="2000" y="1100" width="750" height="500" class="rm"/>
<text x="2030" y="1175" class="lbl">WASHROOM</text>
<circle cx="2200" cy="1290" r="30" class="fur"/>
<circle cx="2320" cy="1290" r="30" class="fur"/>
<circle cx="2440" cy="1290" r="30" class="fur"/>
<circle cx="2560" cy="1290" r="30" class="fur"/>
<circle cx="2680" cy="1290" r="30" class="fur"/>
<rect x="2140" y="1430" width="500" height="80" class="fur"/>
<text x="2390" y="1477" class="fl" font-size="20">BATHS</text>
<line x1="380" y1="400" x2="480" y2="400" class="gap"/>
<path d="M380 400L380 300A100 100 0 0 1 480 400" class="swing"/>
<line x1="600" y1="500" x2="600" y2="600" class="gap"/>
<path d="M600 500L700 500A100 100 0 0 1 600 600" class="swing"/>
<line x1="1600" y1="640" x2="1600" y2="740" class="gap"/>
<path d="M1600 640L1700 640A100 100 0 0 1 1600 740" class="swing"/>
<line x1="960" y1="1100" x2="1060" y2="1100" class="gap"/>
<path d="M960 1100L960 1200A100 100 0 0 0 1060 1100" class="swing"/>
<line x1="400" y1="800" x2="500" y2="800" class="gap"/>
<path d="M400 800L400 900A100 100 0 0 0 500 800" class="swing"/>
<line x1="600" y1="1160" x2="600" y2="1260" class="gap"/>
<path d="M600 1160L500 1160A100 100 0 0 0 600 1260" class="swing"/>
<line x1="2000" y1="1260" x2="2000" y2="1360" class="gap"/>
<path d="M2000 1260L2100 1260A100 100 0 0 1 2000 1360" class="swing"/>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 5 OF 13 · LEVEL 2 · WELFARE</text>
<text x="1924" y="1815" class="ttl">CRECHE &amp; SCHOOL</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/05 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

+356
View File
@@ -0,0 +1,356 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — DORMITORIES. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="100" width="2700" height="300" class="rm2"/>
<text x="1150" y="230" class="lbl">LOWER CORRIDOR</text>
<line x1="2700" y1="340" x2="2785" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="2409.6" y="60" class="sub exit">PLANT &amp; PIPE ROOM · SHEET 6 →</text>
<line x1="100" y1="340" x2="15" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="20" y="60" class="sub exit">← CANTEEN &amp; QUARTERS · SHEET 10</text>
<rect x="50" y="400" width="550" height="1100" class="rm"/>
<text x="80" y="1475" class="lbl">HALL A · 60</text>
<circle cx="555" cy="445" r="30" class="numc"/><text x="555" y="458" class="num">16</text>
<rect x="70" y="510" width="60" height="130" class="fur"/>
<line x1="70" y1="555" x2="130" y2="555" class="fine"/>
<rect x="142" y="510" width="60" height="130" class="fur"/>
<line x1="142" y1="555" x2="202" y2="555" class="fine"/>
<rect x="214" y="510" width="60" height="130" class="fur"/>
<line x1="214" y1="555" x2="274" y2="555" class="fine"/>
<rect x="286" y="510" width="60" height="130" class="fur"/>
<line x1="286" y1="555" x2="346" y2="555" class="fine"/>
<rect x="358" y="510" width="60" height="130" class="fur"/>
<line x1="358" y1="555" x2="418" y2="555" class="fine"/>
<rect x="430" y="510" width="60" height="130" class="fur"/>
<line x1="430" y1="555" x2="490" y2="555" class="fine"/>
<rect x="70" y="740" width="60" height="130" class="fur"/>
<line x1="70" y1="785" x2="130" y2="785" class="fine"/>
<rect x="142" y="740" width="60" height="130" class="fur"/>
<line x1="142" y1="785" x2="202" y2="785" class="fine"/>
<rect x="214" y="740" width="60" height="130" class="fur"/>
<line x1="214" y1="785" x2="274" y2="785" class="fine"/>
<rect x="286" y="740" width="60" height="130" class="fur"/>
<line x1="286" y1="785" x2="346" y2="785" class="fine"/>
<rect x="358" y="740" width="60" height="130" class="fur"/>
<line x1="358" y1="785" x2="418" y2="785" class="fine"/>
<rect x="430" y="740" width="60" height="130" class="fur"/>
<line x1="430" y1="785" x2="490" y2="785" class="fine"/>
<rect x="70" y="870" width="60" height="130" class="fur"/>
<line x1="70" y1="915" x2="130" y2="915" class="fine"/>
<rect x="142" y="870" width="60" height="130" class="fur"/>
<line x1="142" y1="915" x2="202" y2="915" class="fine"/>
<rect x="214" y="870" width="60" height="130" class="fur"/>
<line x1="214" y1="915" x2="274" y2="915" class="fine"/>
<rect x="286" y="870" width="60" height="130" class="fur"/>
<line x1="286" y1="915" x2="346" y2="915" class="fine"/>
<rect x="358" y="870" width="60" height="130" class="fur"/>
<line x1="358" y1="915" x2="418" y2="915" class="fine"/>
<rect x="430" y="870" width="60" height="130" class="fur"/>
<line x1="430" y1="915" x2="490" y2="915" class="fine"/>
<rect x="70" y="1100" width="60" height="130" class="fur"/>
<line x1="70" y1="1145" x2="130" y2="1145" class="fine"/>
<rect x="142" y="1100" width="60" height="130" class="fur"/>
<line x1="142" y1="1145" x2="202" y2="1145" class="fine"/>
<rect x="214" y="1100" width="60" height="130" class="fur"/>
<line x1="214" y1="1145" x2="274" y2="1145" class="fine"/>
<rect x="286" y="1100" width="60" height="130" class="fur"/>
<line x1="286" y1="1145" x2="346" y2="1145" class="fine"/>
<rect x="358" y="1100" width="60" height="130" class="fur"/>
<line x1="358" y1="1145" x2="418" y2="1145" class="fine"/>
<rect x="430" y="1100" width="60" height="130" class="fur"/>
<line x1="430" y1="1145" x2="490" y2="1145" class="fine"/>
<rect x="70" y="1230" width="60" height="130" class="fur"/>
<line x1="70" y1="1275" x2="130" y2="1275" class="fine"/>
<rect x="142" y="1230" width="60" height="130" class="fur"/>
<line x1="142" y1="1275" x2="202" y2="1275" class="fine"/>
<rect x="214" y="1230" width="60" height="130" class="fur"/>
<line x1="214" y1="1275" x2="274" y2="1275" class="fine"/>
<rect x="286" y="1230" width="60" height="130" class="fur"/>
<line x1="286" y1="1275" x2="346" y2="1275" class="fine"/>
<rect x="358" y="1230" width="60" height="130" class="fur"/>
<line x1="358" y1="1275" x2="418" y2="1275" class="fine"/>
<rect x="430" y="1230" width="60" height="130" class="fur"/>
<line x1="430" y1="1275" x2="490" y2="1275" class="fine"/>
<line x1="495" y1="400" x2="585" y2="400" class="gap"/>
<path d="M495 400L495 310A90 90 0 0 1 585 400" class="swing"/>
<rect x="600" y="400" width="550" height="1100" class="rm"/>
<text x="630" y="1475" class="lbl">HALL B · 60</text>
<rect x="620" y="510" width="60" height="130" class="fur"/>
<line x1="620" y1="555" x2="680" y2="555" class="fine"/>
<rect x="692" y="510" width="60" height="130" class="fur"/>
<line x1="692" y1="555" x2="752" y2="555" class="fine"/>
<rect x="764" y="510" width="60" height="130" class="fur"/>
<line x1="764" y1="555" x2="824" y2="555" class="fine"/>
<rect x="836" y="510" width="60" height="130" class="fur"/>
<line x1="836" y1="555" x2="896" y2="555" class="fine"/>
<rect x="908" y="510" width="60" height="130" class="fur"/>
<line x1="908" y1="555" x2="968" y2="555" class="fine"/>
<rect x="980" y="510" width="60" height="130" class="fur"/>
<line x1="980" y1="555" x2="1040" y2="555" class="fine"/>
<rect x="620" y="740" width="60" height="130" class="fur"/>
<line x1="620" y1="785" x2="680" y2="785" class="fine"/>
<rect x="692" y="740" width="60" height="130" class="fur"/>
<line x1="692" y1="785" x2="752" y2="785" class="fine"/>
<rect x="764" y="740" width="60" height="130" class="fur"/>
<line x1="764" y1="785" x2="824" y2="785" class="fine"/>
<rect x="836" y="740" width="60" height="130" class="fur"/>
<line x1="836" y1="785" x2="896" y2="785" class="fine"/>
<rect x="908" y="740" width="60" height="130" class="fur"/>
<line x1="908" y1="785" x2="968" y2="785" class="fine"/>
<rect x="980" y="740" width="60" height="130" class="fur"/>
<line x1="980" y1="785" x2="1040" y2="785" class="fine"/>
<rect x="620" y="870" width="60" height="130" class="fur"/>
<line x1="620" y1="915" x2="680" y2="915" class="fine"/>
<rect x="692" y="870" width="60" height="130" class="fur"/>
<line x1="692" y1="915" x2="752" y2="915" class="fine"/>
<rect x="764" y="870" width="60" height="130" class="fur"/>
<line x1="764" y1="915" x2="824" y2="915" class="fine"/>
<rect x="836" y="870" width="60" height="130" class="fur"/>
<line x1="836" y1="915" x2="896" y2="915" class="fine"/>
<rect x="908" y="870" width="60" height="130" class="fur"/>
<line x1="908" y1="915" x2="968" y2="915" class="fine"/>
<rect x="980" y="870" width="60" height="130" class="fur"/>
<line x1="980" y1="915" x2="1040" y2="915" class="fine"/>
<rect x="620" y="1100" width="60" height="130" class="fur"/>
<line x1="620" y1="1145" x2="680" y2="1145" class="fine"/>
<rect x="692" y="1100" width="60" height="130" class="fur"/>
<line x1="692" y1="1145" x2="752" y2="1145" class="fine"/>
<rect x="764" y="1100" width="60" height="130" class="fur"/>
<line x1="764" y1="1145" x2="824" y2="1145" class="fine"/>
<rect x="836" y="1100" width="60" height="130" class="fur"/>
<line x1="836" y1="1145" x2="896" y2="1145" class="fine"/>
<rect x="908" y="1100" width="60" height="130" class="fur"/>
<line x1="908" y1="1145" x2="968" y2="1145" class="fine"/>
<rect x="980" y="1100" width="60" height="130" class="fur"/>
<line x1="980" y1="1145" x2="1040" y2="1145" class="fine"/>
<rect x="620" y="1230" width="60" height="130" class="fur"/>
<line x1="620" y1="1275" x2="680" y2="1275" class="fine"/>
<rect x="692" y="1230" width="60" height="130" class="fur"/>
<line x1="692" y1="1275" x2="752" y2="1275" class="fine"/>
<rect x="764" y="1230" width="60" height="130" class="fur"/>
<line x1="764" y1="1275" x2="824" y2="1275" class="fine"/>
<rect x="836" y="1230" width="60" height="130" class="fur"/>
<line x1="836" y1="1275" x2="896" y2="1275" class="fine"/>
<rect x="908" y="1230" width="60" height="130" class="fur"/>
<line x1="908" y1="1275" x2="968" y2="1275" class="fine"/>
<rect x="980" y="1230" width="60" height="130" class="fur"/>
<line x1="980" y1="1275" x2="1040" y2="1275" class="fine"/>
<line x1="1045" y1="400" x2="1135" y2="400" class="gap"/>
<path d="M1045 400L1045 310A90 90 0 0 1 1135 400" class="swing"/>
<rect x="1150" y="400" width="550" height="1100" class="rm"/>
<text x="1180" y="1475" class="lbl">HALL C · 60</text>
<rect x="1170" y="510" width="60" height="130" class="fur"/>
<line x1="1170" y1="555" x2="1230" y2="555" class="fine"/>
<rect x="1242" y="510" width="60" height="130" class="fur"/>
<line x1="1242" y1="555" x2="1302" y2="555" class="fine"/>
<rect x="1314" y="510" width="60" height="130" class="fur"/>
<line x1="1314" y1="555" x2="1374" y2="555" class="fine"/>
<rect x="1386" y="510" width="60" height="130" class="fur"/>
<line x1="1386" y1="555" x2="1446" y2="555" class="fine"/>
<rect x="1458" y="510" width="60" height="130" class="fur"/>
<line x1="1458" y1="555" x2="1518" y2="555" class="fine"/>
<rect x="1530" y="510" width="60" height="130" class="fur"/>
<line x1="1530" y1="555" x2="1590" y2="555" class="fine"/>
<rect x="1170" y="740" width="60" height="130" class="fur"/>
<line x1="1170" y1="785" x2="1230" y2="785" class="fine"/>
<rect x="1242" y="740" width="60" height="130" class="fur"/>
<line x1="1242" y1="785" x2="1302" y2="785" class="fine"/>
<rect x="1314" y="740" width="60" height="130" class="fur"/>
<line x1="1314" y1="785" x2="1374" y2="785" class="fine"/>
<rect x="1386" y="740" width="60" height="130" class="fur"/>
<line x1="1386" y1="785" x2="1446" y2="785" class="fine"/>
<rect x="1458" y="740" width="60" height="130" class="fur"/>
<line x1="1458" y1="785" x2="1518" y2="785" class="fine"/>
<rect x="1530" y="740" width="60" height="130" class="fur"/>
<line x1="1530" y1="785" x2="1590" y2="785" class="fine"/>
<rect x="1170" y="870" width="60" height="130" class="fur"/>
<line x1="1170" y1="915" x2="1230" y2="915" class="fine"/>
<rect x="1242" y="870" width="60" height="130" class="fur"/>
<line x1="1242" y1="915" x2="1302" y2="915" class="fine"/>
<rect x="1314" y="870" width="60" height="130" class="fur"/>
<line x1="1314" y1="915" x2="1374" y2="915" class="fine"/>
<rect x="1386" y="870" width="60" height="130" class="fur"/>
<line x1="1386" y1="915" x2="1446" y2="915" class="fine"/>
<rect x="1458" y="870" width="60" height="130" class="fur"/>
<line x1="1458" y1="915" x2="1518" y2="915" class="fine"/>
<rect x="1530" y="870" width="60" height="130" class="fur"/>
<line x1="1530" y1="915" x2="1590" y2="915" class="fine"/>
<rect x="1170" y="1100" width="60" height="130" class="fur"/>
<line x1="1170" y1="1145" x2="1230" y2="1145" class="fine"/>
<rect x="1242" y="1100" width="60" height="130" class="fur"/>
<line x1="1242" y1="1145" x2="1302" y2="1145" class="fine"/>
<rect x="1314" y="1100" width="60" height="130" class="fur"/>
<line x1="1314" y1="1145" x2="1374" y2="1145" class="fine"/>
<rect x="1386" y="1100" width="60" height="130" class="fur"/>
<line x1="1386" y1="1145" x2="1446" y2="1145" class="fine"/>
<rect x="1458" y="1100" width="60" height="130" class="fur"/>
<line x1="1458" y1="1145" x2="1518" y2="1145" class="fine"/>
<rect x="1530" y="1100" width="60" height="130" class="fur"/>
<line x1="1530" y1="1145" x2="1590" y2="1145" class="fine"/>
<rect x="1170" y="1230" width="60" height="130" class="fur"/>
<line x1="1170" y1="1275" x2="1230" y2="1275" class="fine"/>
<rect x="1242" y="1230" width="60" height="130" class="fur"/>
<line x1="1242" y1="1275" x2="1302" y2="1275" class="fine"/>
<rect x="1314" y="1230" width="60" height="130" class="fur"/>
<line x1="1314" y1="1275" x2="1374" y2="1275" class="fine"/>
<rect x="1386" y="1230" width="60" height="130" class="fur"/>
<line x1="1386" y1="1275" x2="1446" y2="1275" class="fine"/>
<rect x="1458" y="1230" width="60" height="130" class="fur"/>
<line x1="1458" y1="1275" x2="1518" y2="1275" class="fine"/>
<rect x="1530" y="1230" width="60" height="130" class="fur"/>
<line x1="1530" y1="1275" x2="1590" y2="1275" class="fine"/>
<line x1="1595" y1="400" x2="1685" y2="400" class="gap"/>
<path d="M1595 400L1595 310A90 90 0 0 1 1685 400" class="swing"/>
<rect x="1700" y="400" width="550" height="1100" class="rm"/>
<text x="1730" y="1475" class="lbl">HALL D · 60</text>
<rect x="1720" y="510" width="60" height="130" class="fur"/>
<line x1="1720" y1="555" x2="1780" y2="555" class="fine"/>
<rect x="1792" y="510" width="60" height="130" class="fur"/>
<line x1="1792" y1="555" x2="1852" y2="555" class="fine"/>
<rect x="1864" y="510" width="60" height="130" class="fur"/>
<line x1="1864" y1="555" x2="1924" y2="555" class="fine"/>
<rect x="1936" y="510" width="60" height="130" class="fur"/>
<line x1="1936" y1="555" x2="1996" y2="555" class="fine"/>
<rect x="2008" y="510" width="60" height="130" class="fur"/>
<line x1="2008" y1="555" x2="2068" y2="555" class="fine"/>
<rect x="2080" y="510" width="60" height="130" class="fur"/>
<line x1="2080" y1="555" x2="2140" y2="555" class="fine"/>
<rect x="1720" y="740" width="60" height="130" class="fur"/>
<line x1="1720" y1="785" x2="1780" y2="785" class="fine"/>
<rect x="1792" y="740" width="60" height="130" class="fur"/>
<line x1="1792" y1="785" x2="1852" y2="785" class="fine"/>
<rect x="1864" y="740" width="60" height="130" class="fur"/>
<line x1="1864" y1="785" x2="1924" y2="785" class="fine"/>
<rect x="1936" y="740" width="60" height="130" class="fur"/>
<line x1="1936" y1="785" x2="1996" y2="785" class="fine"/>
<rect x="2008" y="740" width="60" height="130" class="fur"/>
<line x1="2008" y1="785" x2="2068" y2="785" class="fine"/>
<rect x="2080" y="740" width="60" height="130" class="fur"/>
<line x1="2080" y1="785" x2="2140" y2="785" class="fine"/>
<rect x="1720" y="870" width="60" height="130" class="fur"/>
<line x1="1720" y1="915" x2="1780" y2="915" class="fine"/>
<rect x="1792" y="870" width="60" height="130" class="fur"/>
<line x1="1792" y1="915" x2="1852" y2="915" class="fine"/>
<rect x="1864" y="870" width="60" height="130" class="fur"/>
<line x1="1864" y1="915" x2="1924" y2="915" class="fine"/>
<rect x="1936" y="870" width="60" height="130" class="fur"/>
<line x1="1936" y1="915" x2="1996" y2="915" class="fine"/>
<rect x="2008" y="870" width="60" height="130" class="fur"/>
<line x1="2008" y1="915" x2="2068" y2="915" class="fine"/>
<rect x="2080" y="870" width="60" height="130" class="fur"/>
<line x1="2080" y1="915" x2="2140" y2="915" class="fine"/>
<rect x="1720" y="1100" width="60" height="130" class="fur"/>
<line x1="1720" y1="1145" x2="1780" y2="1145" class="fine"/>
<rect x="1792" y="1100" width="60" height="130" class="fur"/>
<line x1="1792" y1="1145" x2="1852" y2="1145" class="fine"/>
<rect x="1864" y="1100" width="60" height="130" class="fur"/>
<line x1="1864" y1="1145" x2="1924" y2="1145" class="fine"/>
<rect x="1936" y="1100" width="60" height="130" class="fur"/>
<line x1="1936" y1="1145" x2="1996" y2="1145" class="fine"/>
<rect x="2008" y="1100" width="60" height="130" class="fur"/>
<line x1="2008" y1="1145" x2="2068" y2="1145" class="fine"/>
<rect x="2080" y="1100" width="60" height="130" class="fur"/>
<line x1="2080" y1="1145" x2="2140" y2="1145" class="fine"/>
<rect x="1720" y="1230" width="60" height="130" class="fur"/>
<line x1="1720" y1="1275" x2="1780" y2="1275" class="fine"/>
<rect x="1792" y="1230" width="60" height="130" class="fur"/>
<line x1="1792" y1="1275" x2="1852" y2="1275" class="fine"/>
<rect x="1864" y="1230" width="60" height="130" class="fur"/>
<line x1="1864" y1="1275" x2="1924" y2="1275" class="fine"/>
<rect x="1936" y="1230" width="60" height="130" class="fur"/>
<line x1="1936" y1="1275" x2="1996" y2="1275" class="fine"/>
<rect x="2008" y="1230" width="60" height="130" class="fur"/>
<line x1="2008" y1="1275" x2="2068" y2="1275" class="fine"/>
<rect x="2080" y="1230" width="60" height="130" class="fur"/>
<line x1="2080" y1="1275" x2="2140" y2="1275" class="fine"/>
<line x1="2145" y1="400" x2="2235" y2="400" class="gap"/>
<path d="M2145 400L2145 310A90 90 0 0 1 2235 400" class="swing"/>
<text x="630" y="1065" class="pen" transform="rotate(-1 630 1065)">bunks by age — see Registry</text>
<rect x="2250" y="400" width="500" height="550" class="rm"/>
<text x="2280" y="475" class="lbl">ABLUTIONS</text>
<circle cx="2330" cy="550" r="28" class="fur"/>
<circle cx="2420" cy="550" r="28" class="fur"/>
<circle cx="2510" cy="550" r="28" class="fur"/>
<circle cx="2600" cy="550" r="28" class="fur"/>
<circle cx="2690" cy="550" r="28" class="fur"/>
<rect x="2280" y="790" width="90" height="130" class="fur"/>
<text x="2325" y="859.55" class="fl" font-size="13">WC</text>
<rect x="2390" y="790" width="90" height="130" class="fur"/>
<text x="2435" y="859.55" class="fl" font-size="13">WC</text>
<rect x="2500" y="790" width="90" height="130" class="fur"/>
<text x="2545" y="859.55" class="fl" font-size="13">WC</text>
<rect x="2610" y="790" width="90" height="130" class="fur"/>
<text x="2655" y="859.55" class="fl" font-size="13">WC</text>
<text x="2280" y="690" class="pen" transform="rotate(-2 2280 690)">hot water Tues/Fri</text>
<rect x="2250" y="950" width="500" height="550" class="rm"/>
<text x="2280" y="1025" class="lbl">LAUNDRY</text>
<rect x="2290" y="1090" width="180" height="120" class="fur"/>
<text x="2380" y="1154.9" class="fl" font-size="14">COPPERS</text>
<rect x="2530" y="1090" width="180" height="120" class="fur"/>
<text x="2620" y="1154.9" class="fl" font-size="14">MANGLE</text>
<rect x="2300" y="1340" width="420" height="60" class="fur"/>
<path d="M2325 1340V1400M2350 1340V1400M2375 1340V1400M2400 1340V1400M2425 1340V1400M2450 1340V1400M2475 1340V1400M2500 1340V1400M2525 1340V1400M2550 1340V1400M2575 1340V1400M2600 1340V1400M2625 1340V1400M2650 1340V1400M2675 1340V1400M2700 1340V1400" class="fine"/>
<text x="2300" y="1470" class="sub">drying racks</text>
<line x1="2520" y1="400" x2="2620" y2="400" class="gap"/>
<path d="M2520 400L2520 300A100 100 0 0 1 2620 400" class="swing"/>
<line x1="2530" y1="950" x2="2620" y2="950" class="gap"/>
<path d="M2530 950L2530 1040A90 90 0 0 0 2620 950" class="swing"/>
<line x1="2250" y1="1220" x2="2250" y2="1300" class="gap"/>
<path d="M2250 1220L2330 1220A80 80 0 0 1 2250 1300" class="swing"/>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 9 OF 13 · LEVEL 2 · QUARTERS</text>
<text x="1924" y="1815" class="ttl">DORMITORIES</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/09 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

+589
View File
@@ -0,0 +1,589 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — THE ESTATE · MIDDLE. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="240" width="2700" height="100" class="rock"/>
<text x="70" y="315" class="lbl">No.4 ROAD</text>
<rect x="100" y="40" width="200" height="200" class="rm"/>
<line x1="210" y1="240" x2="290" y2="240" class="gap"/>
<path d="M210 240L210 160A80 80 0 0 1 290 240" class="swing"/>
<rect x="115" y="55" width="60" height="130" class="fur"/>
<line x1="115" y1="100" x2="175" y2="100" class="fine"/>
<rect x="210" y="60" width="70" height="50" class="fur"/>
<text x="115" y="225" class="sub">4/51</text>
<rect x="100" y="340" width="200" height="200" class="rm"/>
<line x1="210" y1="340" x2="290" y2="340" class="gap"/>
<path d="M210 340L210 420A80 80 0 0 0 290 340" class="swing"/>
<rect x="115" y="395" width="60" height="130" class="fur"/>
<line x1="115" y1="440" x2="175" y2="440" class="fine"/>
<rect x="210" y="460" width="70" height="50" class="fur"/>
<text x="115" y="380" class="sub">4/52</text>
<rect x="300" y="40" width="200" height="200" class="rm"/>
<line x1="410" y1="240" x2="490" y2="240" class="gap"/>
<path d="M410 240L410 160A80 80 0 0 1 490 240" class="swing"/>
<rect x="315" y="55" width="60" height="130" class="fur"/>
<line x1="315" y1="100" x2="375" y2="100" class="fine"/>
<rect x="410" y="60" width="70" height="50" class="fur"/>
<text x="315" y="225" class="sub">4/49</text>
<rect x="300" y="340" width="200" height="200" class="rm"/>
<line x1="410" y1="340" x2="490" y2="340" class="gap"/>
<path d="M410 340L410 420A80 80 0 0 0 490 340" class="swing"/>
<rect x="315" y="395" width="60" height="130" class="fur"/>
<line x1="315" y1="440" x2="375" y2="440" class="fine"/>
<rect x="410" y="460" width="70" height="50" class="fur"/>
<text x="315" y="380" class="sub">4/50</text>
<rect x="500" y="40" width="200" height="200" class="rm"/>
<line x1="610" y1="240" x2="690" y2="240" class="gap"/>
<path d="M610 240L610 160A80 80 0 0 1 690 240" class="swing"/>
<rect x="515" y="55" width="60" height="130" class="fur"/>
<line x1="515" y1="100" x2="575" y2="100" class="fine"/>
<rect x="610" y="60" width="70" height="50" class="fur"/>
<text x="515" y="225" class="sub">4/47</text>
<rect x="500" y="340" width="200" height="200" class="rm"/>
<line x1="610" y1="340" x2="690" y2="340" class="gap"/>
<path d="M610 340L610 420A80 80 0 0 0 690 340" class="swing"/>
<rect x="515" y="395" width="60" height="130" class="fur"/>
<line x1="515" y1="440" x2="575" y2="440" class="fine"/>
<rect x="610" y="460" width="70" height="50" class="fur"/>
<text x="515" y="380" class="sub">4/48</text>
<rect x="700" y="40" width="200" height="200" class="rm"/>
<line x1="810" y1="240" x2="890" y2="240" class="gap"/>
<path d="M810 240L810 160A80 80 0 0 1 890 240" class="swing"/>
<rect x="715" y="55" width="60" height="130" class="fur"/>
<line x1="715" y1="100" x2="775" y2="100" class="fine"/>
<rect x="810" y="60" width="70" height="50" class="fur"/>
<text x="715" y="225" class="sub">4/45</text>
<rect x="700" y="340" width="200" height="200" class="rm"/>
<line x1="810" y1="340" x2="890" y2="340" class="gap"/>
<path d="M810 340L810 420A80 80 0 0 0 890 340" class="swing"/>
<rect x="715" y="395" width="60" height="130" class="fur"/>
<line x1="715" y1="440" x2="775" y2="440" class="fine"/>
<rect x="810" y="460" width="70" height="50" class="fur"/>
<text x="715" y="380" class="sub">4/46</text>
<rect x="900" y="40" width="200" height="200" class="rm"/>
<line x1="1010" y1="240" x2="1090" y2="240" class="gap"/>
<path d="M1010 240L1010 160A80 80 0 0 1 1090 240" class="swing"/>
<rect x="915" y="55" width="60" height="130" class="fur"/>
<line x1="915" y1="100" x2="975" y2="100" class="fine"/>
<rect x="1010" y="60" width="70" height="50" class="fur"/>
<text x="915" y="225" class="sub">4/43</text>
<rect x="900" y="340" width="200" height="200" class="rm"/>
<line x1="1010" y1="340" x2="1090" y2="340" class="gap"/>
<path d="M1010 340L1010 420A80 80 0 0 0 1090 340" class="swing"/>
<rect x="915" y="395" width="60" height="130" class="fur"/>
<line x1="915" y1="440" x2="975" y2="440" class="fine"/>
<rect x="1010" y="460" width="70" height="50" class="fur"/>
<text x="915" y="380" class="sub">4/44</text>
<rect x="1100" y="40" width="200" height="200" class="rm"/>
<line x1="1210" y1="240" x2="1290" y2="240" class="gap"/>
<path d="M1210 240L1210 160A80 80 0 0 1 1290 240" class="swing"/>
<rect x="1115" y="55" width="60" height="130" class="fur"/>
<line x1="1115" y1="100" x2="1175" y2="100" class="fine"/>
<rect x="1210" y="60" width="70" height="50" class="fur"/>
<text x="1115" y="225" class="sub">4/41</text>
<rect x="1100" y="340" width="200" height="200" class="rm"/>
<line x1="1210" y1="340" x2="1290" y2="340" class="gap"/>
<path d="M1210 340L1210 420A80 80 0 0 0 1290 340" class="swing"/>
<rect x="1115" y="395" width="60" height="130" class="fur"/>
<line x1="1115" y1="440" x2="1175" y2="440" class="fine"/>
<rect x="1210" y="460" width="70" height="50" class="fur"/>
<text x="1115" y="380" class="sub">4/42</text>
<rect x="1300" y="40" width="200" height="200" class="rm"/>
<line x1="1410" y1="240" x2="1490" y2="240" class="gap"/>
<path d="M1410 240L1410 160A80 80 0 0 1 1490 240" class="swing"/>
<rect x="1315" y="55" width="60" height="130" class="fur"/>
<line x1="1315" y1="100" x2="1375" y2="100" class="fine"/>
<rect x="1410" y="60" width="70" height="50" class="fur"/>
<text x="1315" y="225" class="sub">4/39</text>
<rect x="1500" y="40" width="200" height="200" class="rm"/>
<line x1="1610" y1="240" x2="1690" y2="240" class="gap"/>
<path d="M1610 240L1610 160A80 80 0 0 1 1690 240" class="swing"/>
<rect x="1515" y="55" width="60" height="130" class="fur"/>
<line x1="1515" y1="100" x2="1575" y2="100" class="fine"/>
<rect x="1610" y="60" width="70" height="50" class="fur"/>
<text x="1515" y="225" class="sub">4/37</text>
<rect x="1500" y="340" width="200" height="200" class="rm"/>
<line x1="1610" y1="340" x2="1690" y2="340" class="gap"/>
<path d="M1610 340L1610 420A80 80 0 0 0 1690 340" class="swing"/>
<rect x="1515" y="395" width="60" height="130" class="fur"/>
<line x1="1515" y1="440" x2="1575" y2="440" class="fine"/>
<rect x="1610" y="460" width="70" height="50" class="fur"/>
<text x="1515" y="380" class="sub">4/38</text>
<rect x="1700" y="40" width="200" height="200" class="rm"/>
<line x1="1810" y1="240" x2="1890" y2="240" class="gap"/>
<path d="M1810 240L1810 160A80 80 0 0 1 1890 240" class="swing"/>
<rect x="1715" y="55" width="60" height="130" class="fur"/>
<line x1="1715" y1="100" x2="1775" y2="100" class="fine"/>
<rect x="1810" y="60" width="70" height="50" class="fur"/>
<text x="1715" y="225" class="sub">4/35</text>
<rect x="1700" y="340" width="200" height="200" class="rm"/>
<line x1="1810" y1="340" x2="1890" y2="340" class="gap"/>
<path d="M1810 340L1810 420A80 80 0 0 0 1890 340" class="swing"/>
<rect x="1715" y="395" width="60" height="130" class="fur"/>
<line x1="1715" y1="440" x2="1775" y2="440" class="fine"/>
<rect x="1810" y="460" width="70" height="50" class="fur"/>
<text x="1715" y="380" class="sub">4/36</text>
<rect x="1900" y="40" width="200" height="200" class="rm"/>
<line x1="2010" y1="240" x2="2090" y2="240" class="gap"/>
<path d="M2010 240L2010 160A80 80 0 0 1 2090 240" class="swing"/>
<rect x="1915" y="55" width="60" height="130" class="fur"/>
<line x1="1915" y1="100" x2="1975" y2="100" class="fine"/>
<rect x="2010" y="60" width="70" height="50" class="fur"/>
<text x="1915" y="225" class="sub">4/33</text>
<rect x="1900" y="340" width="200" height="200" class="rm"/>
<line x1="2010" y1="340" x2="2090" y2="340" class="gap"/>
<path d="M2010 340L2010 420A80 80 0 0 0 2090 340" class="swing"/>
<rect x="1915" y="395" width="60" height="130" class="fur"/>
<line x1="1915" y1="440" x2="1975" y2="440" class="fine"/>
<rect x="2010" y="460" width="70" height="50" class="fur"/>
<text x="1915" y="380" class="sub">4/34</text>
<rect x="2100" y="40" width="200" height="200" class="rm"/>
<line x1="2210" y1="240" x2="2290" y2="240" class="gap"/>
<path d="M2210 240L2210 160A80 80 0 0 1 2290 240" class="swing"/>
<rect x="2115" y="55" width="60" height="130" class="fur"/>
<line x1="2115" y1="100" x2="2175" y2="100" class="fine"/>
<rect x="2210" y="60" width="70" height="50" class="fur"/>
<text x="2115" y="225" class="sub">4/31</text>
<rect x="2100" y="340" width="200" height="200" class="rm"/>
<line x1="2210" y1="340" x2="2290" y2="340" class="gap"/>
<path d="M2210 340L2210 420A80 80 0 0 0 2290 340" class="swing"/>
<rect x="2115" y="395" width="60" height="130" class="fur"/>
<line x1="2115" y1="440" x2="2175" y2="440" class="fine"/>
<rect x="2210" y="460" width="70" height="50" class="fur"/>
<text x="2115" y="380" class="sub">4/32</text>
<rect x="2300" y="40" width="200" height="200" class="rm"/>
<line x1="2410" y1="240" x2="2490" y2="240" class="gap"/>
<path d="M2410 240L2410 160A80 80 0 0 1 2490 240" class="swing"/>
<rect x="2315" y="55" width="60" height="130" class="fur"/>
<line x1="2315" y1="100" x2="2375" y2="100" class="fine"/>
<rect x="2410" y="60" width="70" height="50" class="fur"/>
<text x="2315" y="225" class="sub">4/29</text>
<rect x="2300" y="340" width="200" height="200" class="rm"/>
<line x1="2410" y1="340" x2="2490" y2="340" class="gap"/>
<path d="M2410 340L2410 420A80 80 0 0 0 2490 340" class="swing"/>
<rect x="2315" y="395" width="60" height="130" class="fur"/>
<line x1="2315" y1="440" x2="2375" y2="440" class="fine"/>
<rect x="2410" y="460" width="70" height="50" class="fur"/>
<text x="2315" y="380" class="sub">4/30</text>
<rect x="2500" y="40" width="200" height="200" class="rm"/>
<line x1="2610" y1="240" x2="2690" y2="240" class="gap"/>
<path d="M2610 240L2610 160A80 80 0 0 1 2690 240" class="swing"/>
<rect x="2520" y="60" width="80" height="80" class="fur"/>
<text x="2560" y="104.2" class="fl" font-size="12">PRIVY</text>
<rect x="2500" y="340" width="200" height="200" class="rm"/>
<line x1="2610" y1="340" x2="2690" y2="340" class="gap"/>
<path d="M2610 340L2610 420A80 80 0 0 0 2690 340" class="swing"/>
<rect x="2515" y="395" width="60" height="130" class="fur"/>
<line x1="2515" y1="440" x2="2575" y2="440" class="fine"/>
<rect x="2610" y="460" width="70" height="50" class="fur"/>
<text x="2515" y="380" class="sub">4/28</text>
<rect x="1300" y="340" width="200" height="420" class="rock"/>
<line x1="1300" y1="340" x2="1500" y2="340" class="rgap"/>
<line x1="1300" y1="760" x2="1500" y2="760" class="rgap"/>
<rect x="50" y="760" width="2700" height="100" class="rock"/>
<text x="130" y="835" class="lbl">No.5 ROAD</text>
<rect x="100" y="560" width="200" height="200" class="rm"/>
<line x1="210" y1="760" x2="290" y2="760" class="gap"/>
<path d="M210 760L210 680A80 80 0 0 1 290 760" class="swing"/>
<rect x="115" y="575" width="60" height="130" class="fur"/>
<line x1="115" y1="620" x2="175" y2="620" class="fine"/>
<rect x="210" y="580" width="70" height="50" class="fur"/>
<text x="115" y="745" class="sub">5/51</text>
<rect x="100" y="860" width="200" height="200" class="rm"/>
<line x1="210" y1="860" x2="290" y2="860" class="gap"/>
<path d="M210 860L210 940A80 80 0 0 0 290 860" class="swing"/>
<rect x="115" y="915" width="60" height="130" class="fur"/>
<line x1="115" y1="960" x2="175" y2="960" class="fine"/>
<rect x="210" y="980" width="70" height="50" class="fur"/>
<text x="115" y="900" class="sub">5/52</text>
<rect x="300" y="560" width="200" height="200" class="rm"/>
<line x1="410" y1="760" x2="490" y2="760" class="gap"/>
<path d="M410 760L410 680A80 80 0 0 1 490 760" class="swing"/>
<rect x="315" y="575" width="60" height="130" class="fur"/>
<line x1="315" y1="620" x2="375" y2="620" class="fine"/>
<rect x="410" y="580" width="70" height="50" class="fur"/>
<text x="315" y="745" class="sub">5/49</text>
<rect x="300" y="860" width="200" height="200" class="rm"/>
<line x1="410" y1="860" x2="490" y2="860" class="gap"/>
<path d="M410 860L410 940A80 80 0 0 0 490 860" class="swing"/>
<rect x="315" y="915" width="60" height="130" class="fur"/>
<line x1="315" y1="960" x2="375" y2="960" class="fine"/>
<rect x="410" y="980" width="70" height="50" class="fur"/>
<text x="315" y="900" class="sub">5/50</text>
<rect x="500" y="560" width="200" height="200" class="rm"/>
<line x1="610" y1="760" x2="690" y2="760" class="gap"/>
<path d="M610 760L610 680A80 80 0 0 1 690 760" class="swing"/>
<rect x="515" y="575" width="60" height="130" class="fur"/>
<line x1="515" y1="620" x2="575" y2="620" class="fine"/>
<rect x="610" y="580" width="70" height="50" class="fur"/>
<text x="515" y="745" class="sub">5/47</text>
<rect x="500" y="860" width="200" height="200" class="rm"/>
<line x1="610" y1="860" x2="690" y2="860" class="gap"/>
<path d="M610 860L610 940A80 80 0 0 0 690 860" class="swing"/>
<rect x="515" y="915" width="60" height="130" class="fur"/>
<line x1="515" y1="960" x2="575" y2="960" class="fine"/>
<rect x="610" y="980" width="70" height="50" class="fur"/>
<text x="515" y="900" class="sub">5/48</text>
<rect x="700" y="560" width="200" height="200" class="rm"/>
<line x1="810" y1="760" x2="890" y2="760" class="gap"/>
<path d="M810 760L810 680A80 80 0 0 1 890 760" class="swing"/>
<rect x="715" y="575" width="60" height="130" class="fur"/>
<line x1="715" y1="620" x2="775" y2="620" class="fine"/>
<rect x="810" y="580" width="70" height="50" class="fur"/>
<text x="715" y="745" class="sub">5/45</text>
<rect x="700" y="860" width="200" height="200" class="rm"/>
<line x1="810" y1="860" x2="890" y2="860" class="gap"/>
<path d="M810 860L810 940A80 80 0 0 0 890 860" class="swing"/>
<rect x="715" y="915" width="60" height="130" class="fur"/>
<line x1="715" y1="960" x2="775" y2="960" class="fine"/>
<rect x="810" y="980" width="70" height="50" class="fur"/>
<text x="715" y="900" class="sub">5/46</text>
<rect x="900" y="560" width="200" height="200" class="rm"/>
<line x1="1010" y1="760" x2="1090" y2="760" class="gap"/>
<path d="M1010 760L1010 680A80 80 0 0 1 1090 760" class="swing"/>
<rect x="915" y="575" width="60" height="130" class="fur"/>
<line x1="915" y1="620" x2="975" y2="620" class="fine"/>
<rect x="1010" y="580" width="70" height="50" class="fur"/>
<text x="915" y="745" class="sub">5/43</text>
<rect x="900" y="860" width="200" height="200" class="rm"/>
<line x1="1010" y1="860" x2="1090" y2="860" class="gap"/>
<path d="M1010 860L1010 940A80 80 0 0 0 1090 860" class="swing"/>
<rect x="915" y="915" width="60" height="130" class="fur"/>
<line x1="915" y1="960" x2="975" y2="960" class="fine"/>
<rect x="1010" y="980" width="70" height="50" class="fur"/>
<text x="915" y="900" class="sub">5/44</text>
<rect x="1100" y="560" width="200" height="200" class="rm"/>
<line x1="1210" y1="760" x2="1290" y2="760" class="gap"/>
<path d="M1210 760L1210 680A80 80 0 0 1 1290 760" class="swing"/>
<rect x="1115" y="575" width="60" height="130" class="fur"/>
<line x1="1115" y1="620" x2="1175" y2="620" class="fine"/>
<rect x="1210" y="580" width="70" height="50" class="fur"/>
<text x="1115" y="745" class="sub">5/41</text>
<rect x="1100" y="860" width="200" height="200" class="rm"/>
<line x1="1210" y1="860" x2="1290" y2="860" class="gap"/>
<path d="M1210 860L1210 940A80 80 0 0 0 1290 860" class="swing"/>
<rect x="1115" y="915" width="60" height="130" class="fur"/>
<line x1="1115" y1="960" x2="1175" y2="960" class="fine"/>
<rect x="1210" y="980" width="70" height="50" class="fur"/>
<text x="1115" y="900" class="sub">5/42</text>
<rect x="1500" y="560" width="200" height="200" class="rm"/>
<line x1="1610" y1="760" x2="1690" y2="760" class="gap"/>
<path d="M1610 760L1610 680A80 80 0 0 1 1690 760" class="swing"/>
<rect x="1515" y="575" width="60" height="130" class="fur"/>
<line x1="1515" y1="620" x2="1575" y2="620" class="fine"/>
<rect x="1610" y="580" width="70" height="50" class="fur"/>
<text x="1515" y="745" class="sub">5/37</text>
<rect x="1500" y="860" width="200" height="200" class="rm"/>
<line x1="1610" y1="860" x2="1690" y2="860" class="gap"/>
<path d="M1610 860L1610 940A80 80 0 0 0 1690 860" class="swing"/>
<rect x="1515" y="915" width="60" height="130" class="fur"/>
<line x1="1515" y1="960" x2="1575" y2="960" class="fine"/>
<rect x="1610" y="980" width="70" height="50" class="fur"/>
<text x="1515" y="900" class="sub">5/38</text>
<rect x="1700" y="560" width="200" height="200" class="rm"/>
<line x1="1810" y1="760" x2="1890" y2="760" class="gap"/>
<path d="M1810 760L1810 680A80 80 0 0 1 1890 760" class="swing"/>
<rect x="1715" y="575" width="60" height="130" class="fur"/>
<line x1="1715" y1="620" x2="1775" y2="620" class="fine"/>
<rect x="1810" y="580" width="70" height="50" class="fur"/>
<text x="1715" y="745" class="sub">5/35</text>
<rect x="1700" y="860" width="200" height="200" class="rm"/>
<line x1="1810" y1="860" x2="1890" y2="860" class="gap"/>
<path d="M1810 860L1810 940A80 80 0 0 0 1890 860" class="swing"/>
<rect x="1715" y="915" width="60" height="130" class="fur"/>
<line x1="1715" y1="960" x2="1775" y2="960" class="fine"/>
<rect x="1810" y="980" width="70" height="50" class="fur"/>
<text x="1715" y="900" class="sub">5/36</text>
<rect x="1900" y="560" width="200" height="200" class="rm"/>
<line x1="2010" y1="760" x2="2090" y2="760" class="gap"/>
<path d="M2010 760L2010 680A80 80 0 0 1 2090 760" class="swing"/>
<rect x="1915" y="575" width="60" height="130" class="fur"/>
<line x1="1915" y1="620" x2="1975" y2="620" class="fine"/>
<rect x="2010" y="580" width="70" height="50" class="fur"/>
<text x="1915" y="745" class="sub">5/33</text>
<rect x="1900" y="860" width="200" height="200" class="rm"/>
<line x1="2010" y1="860" x2="2090" y2="860" class="gap"/>
<path d="M2010 860L2010 940A80 80 0 0 0 2090 860" class="swing"/>
<rect x="1915" y="915" width="60" height="130" class="fur"/>
<line x1="1915" y1="960" x2="1975" y2="960" class="fine"/>
<rect x="2010" y="980" width="70" height="50" class="fur"/>
<text x="1915" y="900" class="sub">5/34</text>
<rect x="2100" y="560" width="200" height="200" class="rm"/>
<line x1="2210" y1="760" x2="2290" y2="760" class="gap"/>
<path d="M2210 760L2210 680A80 80 0 0 1 2290 760" class="swing"/>
<rect x="2115" y="575" width="60" height="130" class="fur"/>
<line x1="2115" y1="620" x2="2175" y2="620" class="fine"/>
<rect x="2210" y="580" width="70" height="50" class="fur"/>
<text x="2115" y="745" class="sub">5/31</text>
<rect x="2100" y="860" width="200" height="200" class="rm"/>
<line x1="2210" y1="860" x2="2290" y2="860" class="gap"/>
<path d="M2210 860L2210 940A80 80 0 0 0 2290 860" class="swing"/>
<rect x="2115" y="915" width="60" height="130" class="fur"/>
<line x1="2115" y1="960" x2="2175" y2="960" class="fine"/>
<rect x="2210" y="980" width="70" height="50" class="fur"/>
<text x="2115" y="900" class="sub">5/32</text>
<rect x="2300" y="560" width="200" height="200" class="rm"/>
<line x1="2410" y1="760" x2="2490" y2="760" class="gap"/>
<path d="M2410 760L2410 680A80 80 0 0 1 2490 760" class="swing"/>
<rect x="2315" y="575" width="60" height="130" class="fur"/>
<line x1="2315" y1="620" x2="2375" y2="620" class="fine"/>
<rect x="2410" y="580" width="70" height="50" class="fur"/>
<text x="2315" y="745" class="sub">5/29</text>
<rect x="2300" y="860" width="200" height="200" class="rm"/>
<line x1="2410" y1="860" x2="2490" y2="860" class="gap"/>
<path d="M2410 860L2410 940A80 80 0 0 0 2490 860" class="swing"/>
<rect x="2315" y="915" width="60" height="130" class="fur"/>
<line x1="2315" y1="960" x2="2375" y2="960" class="fine"/>
<rect x="2410" y="980" width="70" height="50" class="fur"/>
<text x="2315" y="900" class="sub">5/30</text>
<rect x="2500" y="560" width="200" height="200" class="rm"/>
<line x1="2610" y1="760" x2="2690" y2="760" class="gap"/>
<path d="M2610 760L2610 680A80 80 0 0 1 2690 760" class="swing"/>
<rect x="2515" y="575" width="60" height="130" class="fur"/>
<line x1="2515" y1="620" x2="2575" y2="620" class="fine"/>
<rect x="2610" y="580" width="70" height="50" class="fur"/>
<text x="2515" y="745" class="sub">5/27</text>
<rect x="2500" y="860" width="200" height="200" class="rm"/>
<line x1="2610" y1="860" x2="2690" y2="860" class="gap"/>
<path d="M2610 860L2610 940A80 80 0 0 0 2690 860" class="swing"/>
<rect x="2515" y="915" width="60" height="130" class="fur"/>
<line x1="2515" y1="960" x2="2575" y2="960" class="fine"/>
<rect x="2610" y="980" width="70" height="50" class="fur"/>
<text x="2515" y="900" class="sub">5/28</text>
<rect x="1300" y="860" width="200" height="420" class="rock"/>
<line x1="1300" y1="860" x2="1500" y2="860" class="rgap"/>
<line x1="1300" y1="1280" x2="1500" y2="1280" class="rgap"/>
<rect x="50" y="1280" width="2700" height="100" class="rock"/>
<text x="70" y="1355" class="lbl">No.6 ROAD</text>
<rect x="100" y="1080" width="200" height="200" class="rm"/>
<line x1="210" y1="1280" x2="290" y2="1280" class="gap"/>
<path d="M210 1280L210 1200A80 80 0 0 1 290 1280" class="swing"/>
<rect x="115" y="1095" width="60" height="130" class="fur"/>
<line x1="115" y1="1140" x2="175" y2="1140" class="fine"/>
<rect x="210" y="1100" width="70" height="50" class="fur"/>
<text x="115" y="1265" class="sub">6/51</text>
<rect x="100" y="1380" width="200" height="200" class="rm"/>
<line x1="210" y1="1380" x2="290" y2="1380" class="gap"/>
<path d="M210 1380L210 1460A80 80 0 0 0 290 1380" class="swing"/>
<rect x="120" y="1480" width="80" height="80" class="fur"/>
<text x="160" y="1524.2" class="fl" font-size="12">PRIVY</text>
<rect x="300" y="1080" width="200" height="200" class="rm"/>
<line x1="410" y1="1280" x2="490" y2="1280" class="gap"/>
<path d="M410 1280L410 1200A80 80 0 0 1 490 1280" class="swing"/>
<rect x="315" y="1095" width="60" height="130" class="fur"/>
<line x1="315" y1="1140" x2="375" y2="1140" class="fine"/>
<rect x="410" y="1100" width="70" height="50" class="fur"/>
<text x="315" y="1265" class="sub">6/49</text>
<rect x="300" y="1380" width="200" height="200" class="rm"/>
<line x1="410" y1="1380" x2="490" y2="1380" class="gap"/>
<path d="M410 1380L410 1460A80 80 0 0 0 490 1380" class="swing"/>
<rect x="315" y="1435" width="60" height="130" class="fur"/>
<line x1="315" y1="1480" x2="375" y2="1480" class="fine"/>
<rect x="410" y="1500" width="70" height="50" class="fur"/>
<text x="315" y="1420" class="sub">6/50</text>
<rect x="500" y="1080" width="200" height="200" class="rm"/>
<line x1="610" y1="1280" x2="690" y2="1280" class="gap"/>
<path d="M610 1280L610 1200A80 80 0 0 1 690 1280" class="swing"/>
<rect x="515" y="1095" width="60" height="130" class="fur"/>
<line x1="515" y1="1140" x2="575" y2="1140" class="fine"/>
<rect x="610" y="1100" width="70" height="50" class="fur"/>
<text x="515" y="1265" class="sub">6/47</text>
<rect x="500" y="1380" width="200" height="200" class="rm"/>
<line x1="610" y1="1380" x2="690" y2="1380" class="gap"/>
<path d="M610 1380L610 1460A80 80 0 0 0 690 1380" class="swing"/>
<rect x="515" y="1435" width="60" height="130" class="fur"/>
<line x1="515" y1="1480" x2="575" y2="1480" class="fine"/>
<rect x="610" y="1500" width="70" height="50" class="fur"/>
<text x="515" y="1420" class="sub">6/48</text>
<rect x="700" y="1080" width="200" height="200" class="rm"/>
<line x1="810" y1="1280" x2="890" y2="1280" class="gap"/>
<path d="M810 1280L810 1200A80 80 0 0 1 890 1280" class="swing"/>
<rect x="715" y="1095" width="60" height="130" class="fur"/>
<line x1="715" y1="1140" x2="775" y2="1140" class="fine"/>
<rect x="810" y="1100" width="70" height="50" class="fur"/>
<text x="715" y="1265" class="sub">6/45</text>
<rect x="700" y="1380" width="200" height="200" class="rm"/>
<line x1="810" y1="1380" x2="890" y2="1380" class="gap"/>
<path d="M810 1380L810 1460A80 80 0 0 0 890 1380" class="swing"/>
<rect x="715" y="1435" width="60" height="130" class="fur"/>
<line x1="715" y1="1480" x2="775" y2="1480" class="fine"/>
<rect x="810" y="1500" width="70" height="50" class="fur"/>
<text x="715" y="1420" class="sub">6/46</text>
<rect x="900" y="1080" width="200" height="200" class="rm"/>
<line x1="1010" y1="1280" x2="1090" y2="1280" class="gap"/>
<path d="M1010 1280L1010 1200A80 80 0 0 1 1090 1280" class="swing"/>
<rect x="915" y="1095" width="60" height="130" class="fur"/>
<line x1="915" y1="1140" x2="975" y2="1140" class="fine"/>
<rect x="1010" y="1100" width="70" height="50" class="fur"/>
<text x="915" y="1265" class="sub">6/43</text>
<rect x="900" y="1380" width="200" height="200" class="rm"/>
<line x1="1010" y1="1380" x2="1090" y2="1380" class="gap"/>
<path d="M1010 1380L1010 1460A80 80 0 0 0 1090 1380" class="swing"/>
<rect x="915" y="1435" width="60" height="130" class="fur"/>
<line x1="915" y1="1480" x2="975" y2="1480" class="fine"/>
<rect x="1010" y="1500" width="70" height="50" class="fur"/>
<text x="915" y="1420" class="sub">6/44</text>
<rect x="1100" y="1080" width="200" height="200" class="rm"/>
<line x1="1210" y1="1280" x2="1290" y2="1280" class="gap"/>
<path d="M1210 1280L1210 1200A80 80 0 0 1 1290 1280" class="swing"/>
<rect x="1115" y="1095" width="60" height="130" class="fur"/>
<line x1="1115" y1="1140" x2="1175" y2="1140" class="fine"/>
<rect x="1210" y="1100" width="70" height="50" class="fur"/>
<text x="1115" y="1265" class="sub">6/41</text>
<rect x="1100" y="1380" width="200" height="200" class="rm"/>
<line x1="1210" y1="1380" x2="1290" y2="1380" class="gap"/>
<path d="M1210 1380L1210 1460A80 80 0 0 0 1290 1380" class="swing"/>
<rect x="1115" y="1435" width="60" height="130" class="fur"/>
<line x1="1115" y1="1480" x2="1175" y2="1480" class="fine"/>
<rect x="1210" y="1500" width="70" height="50" class="fur"/>
<text x="1115" y="1420" class="sub">6/42</text>
<rect x="1300" y="1380" width="200" height="200" class="rm"/>
<line x1="1410" y1="1380" x2="1490" y2="1380" class="gap"/>
<path d="M1410 1380L1410 1460A80 80 0 0 0 1490 1380" class="swing"/>
<rect x="1315" y="1435" width="60" height="130" class="fur"/>
<line x1="1315" y1="1480" x2="1375" y2="1480" class="fine"/>
<rect x="1410" y="1500" width="70" height="50" class="fur"/>
<text x="1315" y="1420" class="sub">6/40</text>
<rect x="1500" y="1080" width="200" height="200" class="rm"/>
<line x1="1610" y1="1280" x2="1690" y2="1280" class="gap"/>
<path d="M1610 1280L1610 1200A80 80 0 0 1 1690 1280" class="swing"/>
<rect x="1515" y="1095" width="60" height="130" class="fur"/>
<line x1="1515" y1="1140" x2="1575" y2="1140" class="fine"/>
<rect x="1610" y="1100" width="70" height="50" class="fur"/>
<text x="1515" y="1265" class="sub">6/37</text>
<rect x="1500" y="1380" width="200" height="200" class="rm"/>
<line x1="1610" y1="1380" x2="1690" y2="1380" class="gap"/>
<path d="M1610 1380L1610 1460A80 80 0 0 0 1690 1380" class="swing"/>
<rect x="1515" y="1435" width="60" height="130" class="fur"/>
<line x1="1515" y1="1480" x2="1575" y2="1480" class="fine"/>
<rect x="1610" y="1500" width="70" height="50" class="fur"/>
<text x="1515" y="1420" class="sub">6/38</text>
<rect x="1700" y="1080" width="200" height="200" class="rm"/>
<line x1="1810" y1="1280" x2="1890" y2="1280" class="gap"/>
<path d="M1810 1280L1810 1200A80 80 0 0 1 1890 1280" class="swing"/>
<rect x="1715" y="1095" width="60" height="130" class="fur"/>
<line x1="1715" y1="1140" x2="1775" y2="1140" class="fine"/>
<rect x="1810" y="1100" width="70" height="50" class="fur"/>
<text x="1715" y="1265" class="sub">6/35</text>
<rect x="1700" y="1380" width="200" height="200" class="rm"/>
<line x1="1810" y1="1380" x2="1890" y2="1380" class="gap"/>
<path d="M1810 1380L1810 1460A80 80 0 0 0 1890 1380" class="swing"/>
<rect x="1715" y="1435" width="60" height="130" class="fur"/>
<line x1="1715" y1="1480" x2="1775" y2="1480" class="fine"/>
<rect x="1810" y="1500" width="70" height="50" class="fur"/>
<text x="1715" y="1420" class="sub">6/36</text>
<rect x="1900" y="1080" width="200" height="200" class="rm"/>
<line x1="2010" y1="1280" x2="2090" y2="1280" class="gap"/>
<path d="M2010 1280L2010 1200A80 80 0 0 1 2090 1280" class="swing"/>
<rect x="1915" y="1095" width="60" height="130" class="fur"/>
<line x1="1915" y1="1140" x2="1975" y2="1140" class="fine"/>
<rect x="2010" y="1100" width="70" height="50" class="fur"/>
<text x="1915" y="1265" class="sub">6/33</text>
<rect x="1900" y="1380" width="200" height="200" class="rm"/>
<line x1="2010" y1="1380" x2="2090" y2="1380" class="gap"/>
<path d="M2010 1380L2010 1460A80 80 0 0 0 2090 1380" class="swing"/>
<rect x="1915" y="1435" width="60" height="130" class="fur"/>
<line x1="1915" y1="1480" x2="1975" y2="1480" class="fine"/>
<rect x="2010" y="1500" width="70" height="50" class="fur"/>
<text x="1915" y="1420" class="sub">6/34</text>
<rect x="2100" y="1080" width="200" height="200" class="rm"/>
<line x1="2210" y1="1280" x2="2290" y2="1280" class="gap"/>
<path d="M2210 1280L2210 1200A80 80 0 0 1 2290 1280" class="swing"/>
<rect x="2115" y="1095" width="60" height="130" class="fur"/>
<line x1="2115" y1="1140" x2="2175" y2="1140" class="fine"/>
<rect x="2210" y="1100" width="70" height="50" class="fur"/>
<text x="2115" y="1265" class="sub">6/31</text>
<rect x="2100" y="1380" width="200" height="200" class="rm"/>
<line x1="2210" y1="1380" x2="2290" y2="1380" class="gap"/>
<path d="M2210 1380L2210 1460A80 80 0 0 0 2290 1380" class="swing"/>
<rect x="2115" y="1435" width="60" height="130" class="fur"/>
<line x1="2115" y1="1480" x2="2175" y2="1480" class="fine"/>
<rect x="2210" y="1500" width="70" height="50" class="fur"/>
<text x="2115" y="1420" class="sub">6/32</text>
<rect x="2300" y="1080" width="200" height="200" class="rm"/>
<line x1="2410" y1="1280" x2="2490" y2="1280" class="gap"/>
<path d="M2410 1280L2410 1200A80 80 0 0 1 2490 1280" class="swing"/>
<rect x="2315" y="1095" width="60" height="130" class="fur"/>
<line x1="2315" y1="1140" x2="2375" y2="1140" class="fine"/>
<rect x="2410" y="1100" width="70" height="50" class="fur"/>
<text x="2315" y="1265" class="sub">6/29</text>
<rect x="2300" y="1380" width="200" height="200" class="rm"/>
<line x1="2410" y1="1380" x2="2490" y2="1380" class="gap"/>
<path d="M2410 1380L2410 1460A80 80 0 0 0 2490 1380" class="swing"/>
<rect x="2315" y="1435" width="60" height="130" class="fur"/>
<line x1="2315" y1="1480" x2="2375" y2="1480" class="fine"/>
<rect x="2410" y="1500" width="70" height="50" class="fur"/>
<text x="2315" y="1420" class="sub">6/30</text>
<rect x="2500" y="1080" width="200" height="200" class="rm"/>
<line x1="2610" y1="1280" x2="2690" y2="1280" class="gap"/>
<path d="M2610 1280L2610 1200A80 80 0 0 1 2690 1280" class="swing"/>
<rect x="2520" y="1100" width="80" height="80" class="fur"/>
<text x="2560" y="1144.2" class="fl" font-size="12">TAP</text>
<rect x="2500" y="1380" width="200" height="200" class="rm"/>
<line x1="2610" y1="1380" x2="2690" y2="1380" class="gap"/>
<path d="M2610 1380L2610 1460A80 80 0 0 0 2690 1380" class="swing"/>
<rect x="2515" y="1435" width="60" height="130" class="fur"/>
<line x1="2515" y1="1480" x2="2575" y2="1480" class="fine"/>
<rect x="2610" y="1500" width="70" height="50" class="fur"/>
<text x="2515" y="1420" class="sub">6/28</text>
<line x1="2700" y1="810" x2="2785" y2="810" class="arw" marker-end="url(#ah)"/>
<text x="2550" y="835" class="sub exit">SHEET 11 →</text>
<line x1="90" y1="810" x2="15" y2="810" class="arw" marker-end="url(#ah)"/>
<text x="340" y="835" class="sub exit">← SHEET 13</text>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 12 OF 13 · PIT GALLERIES</text>
<text x="1924" y="1815" class="ttl">THE ESTATE · MIDDLE</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/12 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

+588
View File
@@ -0,0 +1,588 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — THE ESTATE · NORTH. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="240" width="2700" height="100" class="rock"/>
<text x="70" y="315" class="lbl">No.4 ROAD</text>
<rect x="100" y="40" width="200" height="200" class="rm"/>
<line x1="210" y1="240" x2="290" y2="240" class="gap"/>
<path d="M210 240L210 160A80 80 0 0 1 290 240" class="swing"/>
<rect x="115" y="55" width="60" height="130" class="fur"/>
<line x1="115" y1="100" x2="175" y2="100" class="fine"/>
<rect x="210" y="60" width="70" height="50" class="fur"/>
<text x="115" y="225" class="sub">4/77</text>
<rect x="100" y="340" width="200" height="200" class="rm"/>
<line x1="210" y1="340" x2="290" y2="340" class="gap"/>
<path d="M210 340L210 420A80 80 0 0 0 290 340" class="swing"/>
<rect x="115" y="395" width="60" height="130" class="fur"/>
<line x1="115" y1="440" x2="175" y2="440" class="fine"/>
<rect x="210" y="460" width="70" height="50" class="fur"/>
<text x="115" y="380" class="sub">4/78</text>
<rect x="300" y="40" width="200" height="200" class="rm"/>
<line x1="410" y1="240" x2="490" y2="240" class="gap"/>
<path d="M410 240L410 160A80 80 0 0 1 490 240" class="swing"/>
<rect x="315" y="55" width="60" height="130" class="fur"/>
<line x1="315" y1="100" x2="375" y2="100" class="fine"/>
<rect x="410" y="60" width="70" height="50" class="fur"/>
<text x="315" y="225" class="sub">4/75</text>
<rect x="300" y="340" width="200" height="200" class="rm"/>
<line x1="410" y1="340" x2="490" y2="340" class="gap"/>
<path d="M410 340L410 420A80 80 0 0 0 490 340" class="swing"/>
<rect x="315" y="395" width="60" height="130" class="fur"/>
<line x1="315" y1="440" x2="375" y2="440" class="fine"/>
<rect x="410" y="460" width="70" height="50" class="fur"/>
<text x="315" y="380" class="sub">4/76</text>
<rect x="500" y="40" width="200" height="200" class="rm"/>
<line x1="610" y1="240" x2="690" y2="240" class="gap"/>
<path d="M610 240L610 160A80 80 0 0 1 690 240" class="swing"/>
<rect x="515" y="55" width="60" height="130" class="fur"/>
<line x1="515" y1="100" x2="575" y2="100" class="fine"/>
<rect x="610" y="60" width="70" height="50" class="fur"/>
<text x="515" y="225" class="sub">4/73</text>
<rect x="500" y="340" width="200" height="200" class="rm"/>
<line x1="610" y1="340" x2="690" y2="340" class="gap"/>
<path d="M610 340L610 420A80 80 0 0 0 690 340" class="swing"/>
<rect x="515" y="395" width="60" height="130" class="fur"/>
<line x1="515" y1="440" x2="575" y2="440" class="fine"/>
<rect x="610" y="460" width="70" height="50" class="fur"/>
<text x="515" y="380" class="sub">4/74</text>
<rect x="700" y="40" width="200" height="200" class="rm"/>
<line x1="810" y1="240" x2="890" y2="240" class="gap"/>
<path d="M810 240L810 160A80 80 0 0 1 890 240" class="swing"/>
<rect x="715" y="55" width="60" height="130" class="fur"/>
<line x1="715" y1="100" x2="775" y2="100" class="fine"/>
<rect x="810" y="60" width="70" height="50" class="fur"/>
<text x="715" y="225" class="sub">4/71</text>
<rect x="700" y="340" width="200" height="200" class="rm"/>
<line x1="810" y1="340" x2="890" y2="340" class="gap"/>
<path d="M810 340L810 420A80 80 0 0 0 890 340" class="swing"/>
<rect x="715" y="395" width="60" height="130" class="fur"/>
<line x1="715" y1="440" x2="775" y2="440" class="fine"/>
<rect x="810" y="460" width="70" height="50" class="fur"/>
<text x="715" y="380" class="sub">4/72</text>
<rect x="900" y="40" width="200" height="200" class="rm"/>
<line x1="1010" y1="240" x2="1090" y2="240" class="gap"/>
<path d="M1010 240L1010 160A80 80 0 0 1 1090 240" class="swing"/>
<rect x="915" y="55" width="60" height="130" class="fur"/>
<line x1="915" y1="100" x2="975" y2="100" class="fine"/>
<rect x="1010" y="60" width="70" height="50" class="fur"/>
<text x="915" y="225" class="sub">4/69</text>
<rect x="900" y="340" width="200" height="200" class="rm"/>
<line x1="1010" y1="340" x2="1090" y2="340" class="gap"/>
<path d="M1010 340L1010 420A80 80 0 0 0 1090 340" class="swing"/>
<rect x="915" y="395" width="60" height="130" class="fur"/>
<line x1="915" y1="440" x2="975" y2="440" class="fine"/>
<rect x="1010" y="460" width="70" height="50" class="fur"/>
<text x="915" y="380" class="sub">4/70</text>
<rect x="1100" y="40" width="200" height="200" class="rm"/>
<line x1="1210" y1="240" x2="1290" y2="240" class="gap"/>
<path d="M1210 240L1210 160A80 80 0 0 1 1290 240" class="swing"/>
<rect x="1115" y="55" width="60" height="130" class="fur"/>
<line x1="1115" y1="100" x2="1175" y2="100" class="fine"/>
<rect x="1210" y="60" width="70" height="50" class="fur"/>
<text x="1115" y="225" class="sub">4/67</text>
<rect x="1100" y="340" width="200" height="200" class="rm"/>
<line x1="1210" y1="340" x2="1290" y2="340" class="gap"/>
<path d="M1210 340L1210 420A80 80 0 0 0 1290 340" class="swing"/>
<rect x="1115" y="395" width="60" height="130" class="fur"/>
<line x1="1115" y1="440" x2="1175" y2="440" class="fine"/>
<rect x="1210" y="460" width="70" height="50" class="fur"/>
<text x="1115" y="380" class="sub">4/68</text>
<rect x="1300" y="40" width="200" height="200" class="rm"/>
<line x1="1410" y1="240" x2="1490" y2="240" class="gap"/>
<path d="M1410 240L1410 160A80 80 0 0 1 1490 240" class="swing"/>
<rect x="1315" y="55" width="60" height="130" class="fur"/>
<line x1="1315" y1="100" x2="1375" y2="100" class="fine"/>
<rect x="1410" y="60" width="70" height="50" class="fur"/>
<text x="1315" y="225" class="sub">4/65</text>
<rect x="1500" y="40" width="200" height="200" class="rm"/>
<line x1="1610" y1="240" x2="1690" y2="240" class="gap"/>
<path d="M1610 240L1610 160A80 80 0 0 1 1690 240" class="swing"/>
<rect x="1515" y="55" width="60" height="130" class="fur"/>
<line x1="1515" y1="100" x2="1575" y2="100" class="fine"/>
<rect x="1610" y="60" width="70" height="50" class="fur"/>
<text x="1515" y="225" class="sub">4/63</text>
<rect x="1500" y="340" width="200" height="200" class="rm"/>
<line x1="1610" y1="340" x2="1690" y2="340" class="gap"/>
<path d="M1610 340L1610 420A80 80 0 0 0 1690 340" class="swing"/>
<rect x="1515" y="395" width="60" height="130" class="fur"/>
<line x1="1515" y1="440" x2="1575" y2="440" class="fine"/>
<rect x="1610" y="460" width="70" height="50" class="fur"/>
<text x="1515" y="380" class="sub">4/64</text>
<rect x="1700" y="40" width="200" height="200" class="rm"/>
<line x1="1810" y1="240" x2="1890" y2="240" class="gap"/>
<path d="M1810 240L1810 160A80 80 0 0 1 1890 240" class="swing"/>
<rect x="1715" y="55" width="60" height="130" class="fur"/>
<line x1="1715" y1="100" x2="1775" y2="100" class="fine"/>
<rect x="1810" y="60" width="70" height="50" class="fur"/>
<text x="1715" y="225" class="sub">4/61</text>
<rect x="1700" y="340" width="200" height="200" class="rm"/>
<line x1="1810" y1="340" x2="1890" y2="340" class="gap"/>
<path d="M1810 340L1810 420A80 80 0 0 0 1890 340" class="swing"/>
<rect x="1715" y="395" width="60" height="130" class="fur"/>
<line x1="1715" y1="440" x2="1775" y2="440" class="fine"/>
<rect x="1810" y="460" width="70" height="50" class="fur"/>
<text x="1715" y="380" class="sub">4/62</text>
<rect x="1900" y="40" width="200" height="200" class="rm"/>
<line x1="2010" y1="240" x2="2090" y2="240" class="gap"/>
<path d="M2010 240L2010 160A80 80 0 0 1 2090 240" class="swing"/>
<rect x="1915" y="55" width="60" height="130" class="fur"/>
<line x1="1915" y1="100" x2="1975" y2="100" class="fine"/>
<rect x="2010" y="60" width="70" height="50" class="fur"/>
<text x="1915" y="225" class="sub">4/59</text>
<rect x="1900" y="340" width="200" height="200" class="rm"/>
<line x1="2010" y1="340" x2="2090" y2="340" class="gap"/>
<path d="M2010 340L2010 420A80 80 0 0 0 2090 340" class="swing"/>
<rect x="1915" y="395" width="60" height="130" class="fur"/>
<line x1="1915" y1="440" x2="1975" y2="440" class="fine"/>
<rect x="2010" y="460" width="70" height="50" class="fur"/>
<text x="1915" y="380" class="sub">4/60</text>
<rect x="2100" y="40" width="200" height="200" class="rm"/>
<line x1="2210" y1="240" x2="2290" y2="240" class="gap"/>
<path d="M2210 240L2210 160A80 80 0 0 1 2290 240" class="swing"/>
<rect x="2115" y="55" width="60" height="130" class="fur"/>
<line x1="2115" y1="100" x2="2175" y2="100" class="fine"/>
<rect x="2210" y="60" width="70" height="50" class="fur"/>
<text x="2115" y="225" class="sub">4/57</text>
<rect x="2100" y="340" width="200" height="200" class="rm"/>
<line x1="2210" y1="340" x2="2290" y2="340" class="gap"/>
<path d="M2210 340L2210 420A80 80 0 0 0 2290 340" class="swing"/>
<rect x="2115" y="395" width="60" height="130" class="fur"/>
<line x1="2115" y1="440" x2="2175" y2="440" class="fine"/>
<rect x="2210" y="460" width="70" height="50" class="fur"/>
<text x="2115" y="380" class="sub">4/58</text>
<rect x="2300" y="40" width="200" height="200" class="rm"/>
<line x1="2410" y1="240" x2="2490" y2="240" class="gap"/>
<path d="M2410 240L2410 160A80 80 0 0 1 2490 240" class="swing"/>
<rect x="2315" y="55" width="60" height="130" class="fur"/>
<line x1="2315" y1="100" x2="2375" y2="100" class="fine"/>
<rect x="2410" y="60" width="70" height="50" class="fur"/>
<text x="2315" y="225" class="sub">4/55</text>
<rect x="2300" y="340" width="200" height="200" class="rm"/>
<line x1="2410" y1="340" x2="2490" y2="340" class="gap"/>
<path d="M2410 340L2410 420A80 80 0 0 0 2490 340" class="swing"/>
<rect x="2315" y="395" width="60" height="130" class="fur"/>
<line x1="2315" y1="440" x2="2375" y2="440" class="fine"/>
<rect x="2410" y="460" width="70" height="50" class="fur"/>
<text x="2315" y="380" class="sub">4/56</text>
<rect x="2500" y="40" width="200" height="200" class="rm"/>
<line x1="2610" y1="240" x2="2690" y2="240" class="gap"/>
<path d="M2610 240L2610 160A80 80 0 0 1 2690 240" class="swing"/>
<rect x="2520" y="60" width="80" height="80" class="fur"/>
<text x="2560" y="104.2" class="fl" font-size="12">PRIVY</text>
<rect x="2500" y="340" width="200" height="200" class="rm"/>
<line x1="2610" y1="340" x2="2690" y2="340" class="gap"/>
<path d="M2610 340L2610 420A80 80 0 0 0 2690 340" class="swing"/>
<rect x="2515" y="395" width="60" height="130" class="fur"/>
<line x1="2515" y1="440" x2="2575" y2="440" class="fine"/>
<rect x="2610" y="460" width="70" height="50" class="fur"/>
<text x="2515" y="380" class="sub">4/54</text>
<rect x="1300" y="340" width="200" height="420" class="rock"/>
<line x1="1300" y1="340" x2="1500" y2="340" class="rgap"/>
<line x1="1300" y1="760" x2="1500" y2="760" class="rgap"/>
<rect x="50" y="760" width="2700" height="100" class="rock"/>
<text x="70" y="835" class="lbl">No.5 ROAD</text>
<rect x="100" y="560" width="200" height="200" class="rm"/>
<line x1="210" y1="760" x2="290" y2="760" class="gap"/>
<path d="M210 760L210 680A80 80 0 0 1 290 760" class="swing"/>
<rect x="115" y="575" width="60" height="130" class="fur"/>
<line x1="115" y1="620" x2="175" y2="620" class="fine"/>
<rect x="210" y="580" width="70" height="50" class="fur"/>
<text x="115" y="745" class="sub">5/77</text>
<rect x="100" y="860" width="200" height="200" class="rm"/>
<line x1="210" y1="860" x2="290" y2="860" class="gap"/>
<path d="M210 860L210 940A80 80 0 0 0 290 860" class="swing"/>
<rect x="115" y="915" width="60" height="130" class="fur"/>
<line x1="115" y1="960" x2="175" y2="960" class="fine"/>
<rect x="210" y="980" width="70" height="50" class="fur"/>
<text x="115" y="900" class="sub">5/78</text>
<rect x="300" y="560" width="200" height="200" class="rm"/>
<line x1="410" y1="760" x2="490" y2="760" class="gap"/>
<path d="M410 760L410 680A80 80 0 0 1 490 760" class="swing"/>
<rect x="315" y="575" width="60" height="130" class="fur"/>
<line x1="315" y1="620" x2="375" y2="620" class="fine"/>
<rect x="410" y="580" width="70" height="50" class="fur"/>
<text x="315" y="745" class="sub">5/75</text>
<rect x="300" y="860" width="200" height="200" class="rm"/>
<line x1="410" y1="860" x2="490" y2="860" class="gap"/>
<path d="M410 860L410 940A80 80 0 0 0 490 860" class="swing"/>
<rect x="315" y="915" width="60" height="130" class="fur"/>
<line x1="315" y1="960" x2="375" y2="960" class="fine"/>
<rect x="410" y="980" width="70" height="50" class="fur"/>
<text x="315" y="900" class="sub">5/76</text>
<rect x="500" y="560" width="200" height="200" class="rm"/>
<line x1="610" y1="760" x2="690" y2="760" class="gap"/>
<path d="M610 760L610 680A80 80 0 0 1 690 760" class="swing"/>
<rect x="515" y="575" width="60" height="130" class="fur"/>
<line x1="515" y1="620" x2="575" y2="620" class="fine"/>
<rect x="610" y="580" width="70" height="50" class="fur"/>
<text x="515" y="745" class="sub">5/73</text>
<rect x="500" y="860" width="200" height="200" class="rm"/>
<line x1="610" y1="860" x2="690" y2="860" class="gap"/>
<path d="M610 860L610 940A80 80 0 0 0 690 860" class="swing"/>
<rect x="515" y="915" width="60" height="130" class="fur"/>
<line x1="515" y1="960" x2="575" y2="960" class="fine"/>
<rect x="610" y="980" width="70" height="50" class="fur"/>
<text x="515" y="900" class="sub">5/74</text>
<rect x="700" y="560" width="200" height="200" class="rm"/>
<line x1="810" y1="760" x2="890" y2="760" class="gap"/>
<path d="M810 760L810 680A80 80 0 0 1 890 760" class="swing"/>
<rect x="715" y="575" width="60" height="130" class="fur"/>
<line x1="715" y1="620" x2="775" y2="620" class="fine"/>
<rect x="810" y="580" width="70" height="50" class="fur"/>
<text x="715" y="745" class="sub">5/71</text>
<rect x="700" y="860" width="200" height="200" class="rm"/>
<line x1="810" y1="860" x2="890" y2="860" class="gap"/>
<path d="M810 860L810 940A80 80 0 0 0 890 860" class="swing"/>
<rect x="715" y="915" width="60" height="130" class="fur"/>
<line x1="715" y1="960" x2="775" y2="960" class="fine"/>
<rect x="810" y="980" width="70" height="50" class="fur"/>
<text x="715" y="900" class="sub">5/72</text>
<rect x="900" y="560" width="200" height="200" class="rm"/>
<line x1="1010" y1="760" x2="1090" y2="760" class="gap"/>
<path d="M1010 760L1010 680A80 80 0 0 1 1090 760" class="swing"/>
<rect x="915" y="575" width="60" height="130" class="fur"/>
<line x1="915" y1="620" x2="975" y2="620" class="fine"/>
<rect x="1010" y="580" width="70" height="50" class="fur"/>
<text x="915" y="745" class="sub">5/69</text>
<rect x="900" y="860" width="200" height="200" class="rm"/>
<line x1="1010" y1="860" x2="1090" y2="860" class="gap"/>
<path d="M1010 860L1010 940A80 80 0 0 0 1090 860" class="swing"/>
<rect x="915" y="915" width="60" height="130" class="fur"/>
<line x1="915" y1="960" x2="975" y2="960" class="fine"/>
<rect x="1010" y="980" width="70" height="50" class="fur"/>
<text x="915" y="900" class="sub">5/70</text>
<rect x="1100" y="560" width="200" height="200" class="rm"/>
<line x1="1210" y1="760" x2="1290" y2="760" class="gap"/>
<path d="M1210 760L1210 680A80 80 0 0 1 1290 760" class="swing"/>
<rect x="1115" y="575" width="60" height="130" class="fur"/>
<line x1="1115" y1="620" x2="1175" y2="620" class="fine"/>
<rect x="1210" y="580" width="70" height="50" class="fur"/>
<text x="1115" y="745" class="sub">5/67</text>
<rect x="1100" y="860" width="200" height="200" class="rm"/>
<line x1="1210" y1="860" x2="1290" y2="860" class="gap"/>
<path d="M1210 860L1210 940A80 80 0 0 0 1290 860" class="swing"/>
<rect x="1115" y="915" width="60" height="130" class="fur"/>
<line x1="1115" y1="960" x2="1175" y2="960" class="fine"/>
<rect x="1210" y="980" width="70" height="50" class="fur"/>
<text x="1115" y="900" class="sub">5/68</text>
<rect x="1500" y="560" width="200" height="200" class="rm"/>
<line x1="1610" y1="760" x2="1690" y2="760" class="gap"/>
<path d="M1610 760L1610 680A80 80 0 0 1 1690 760" class="swing"/>
<rect x="1515" y="575" width="60" height="130" class="fur"/>
<line x1="1515" y1="620" x2="1575" y2="620" class="fine"/>
<rect x="1610" y="580" width="70" height="50" class="fur"/>
<text x="1515" y="745" class="sub">5/63</text>
<rect x="1500" y="860" width="200" height="200" class="rm"/>
<line x1="1610" y1="860" x2="1690" y2="860" class="gap"/>
<path d="M1610 860L1610 940A80 80 0 0 0 1690 860" class="swing"/>
<rect x="1515" y="915" width="60" height="130" class="fur"/>
<line x1="1515" y1="960" x2="1575" y2="960" class="fine"/>
<rect x="1610" y="980" width="70" height="50" class="fur"/>
<text x="1515" y="900" class="sub">5/64</text>
<rect x="1700" y="560" width="200" height="200" class="rm"/>
<line x1="1810" y1="760" x2="1890" y2="760" class="gap"/>
<path d="M1810 760L1810 680A80 80 0 0 1 1890 760" class="swing"/>
<rect x="1715" y="575" width="60" height="130" class="fur"/>
<line x1="1715" y1="620" x2="1775" y2="620" class="fine"/>
<rect x="1810" y="580" width="70" height="50" class="fur"/>
<text x="1715" y="745" class="sub">5/61</text>
<rect x="1700" y="860" width="200" height="200" class="rm"/>
<line x1="1810" y1="860" x2="1890" y2="860" class="gap"/>
<path d="M1810 860L1810 940A80 80 0 0 0 1890 860" class="swing"/>
<rect x="1715" y="915" width="60" height="130" class="fur"/>
<line x1="1715" y1="960" x2="1775" y2="960" class="fine"/>
<rect x="1810" y="980" width="70" height="50" class="fur"/>
<text x="1715" y="900" class="sub">5/62</text>
<rect x="1900" y="560" width="200" height="200" class="rm"/>
<line x1="2010" y1="760" x2="2090" y2="760" class="gap"/>
<path d="M2010 760L2010 680A80 80 0 0 1 2090 760" class="swing"/>
<rect x="1915" y="575" width="60" height="130" class="fur"/>
<line x1="1915" y1="620" x2="1975" y2="620" class="fine"/>
<rect x="2010" y="580" width="70" height="50" class="fur"/>
<text x="1915" y="745" class="sub">5/59</text>
<rect x="1900" y="860" width="200" height="200" class="rm"/>
<line x1="2010" y1="860" x2="2090" y2="860" class="gap"/>
<path d="M2010 860L2010 940A80 80 0 0 0 2090 860" class="swing"/>
<rect x="1915" y="915" width="60" height="130" class="fur"/>
<line x1="1915" y1="960" x2="1975" y2="960" class="fine"/>
<rect x="2010" y="980" width="70" height="50" class="fur"/>
<text x="1915" y="900" class="sub">5/60</text>
<rect x="2100" y="560" width="200" height="200" class="rm"/>
<line x1="2210" y1="760" x2="2290" y2="760" class="gap"/>
<path d="M2210 760L2210 680A80 80 0 0 1 2290 760" class="swing"/>
<rect x="2115" y="575" width="60" height="130" class="fur"/>
<line x1="2115" y1="620" x2="2175" y2="620" class="fine"/>
<rect x="2210" y="580" width="70" height="50" class="fur"/>
<text x="2115" y="745" class="sub">5/57</text>
<rect x="2100" y="860" width="200" height="200" class="rm"/>
<line x1="2210" y1="860" x2="2290" y2="860" class="gap"/>
<path d="M2210 860L2210 940A80 80 0 0 0 2290 860" class="swing"/>
<rect x="2115" y="915" width="60" height="130" class="fur"/>
<line x1="2115" y1="960" x2="2175" y2="960" class="fine"/>
<rect x="2210" y="980" width="70" height="50" class="fur"/>
<text x="2115" y="900" class="sub">5/58</text>
<rect x="2300" y="560" width="200" height="200" class="rm"/>
<line x1="2410" y1="760" x2="2490" y2="760" class="gap"/>
<path d="M2410 760L2410 680A80 80 0 0 1 2490 760" class="swing"/>
<rect x="2315" y="575" width="60" height="130" class="fur"/>
<line x1="2315" y1="620" x2="2375" y2="620" class="fine"/>
<rect x="2410" y="580" width="70" height="50" class="fur"/>
<text x="2315" y="745" class="sub">5/55</text>
<rect x="2300" y="860" width="200" height="200" class="rm"/>
<line x1="2410" y1="860" x2="2490" y2="860" class="gap"/>
<path d="M2410 860L2410 940A80 80 0 0 0 2490 860" class="swing"/>
<rect x="2315" y="915" width="60" height="130" class="fur"/>
<line x1="2315" y1="960" x2="2375" y2="960" class="fine"/>
<rect x="2410" y="980" width="70" height="50" class="fur"/>
<text x="2315" y="900" class="sub">5/56</text>
<rect x="2500" y="560" width="200" height="200" class="rm"/>
<line x1="2610" y1="760" x2="2690" y2="760" class="gap"/>
<path d="M2610 760L2610 680A80 80 0 0 1 2690 760" class="swing"/>
<rect x="2515" y="575" width="60" height="130" class="fur"/>
<line x1="2515" y1="620" x2="2575" y2="620" class="fine"/>
<rect x="2610" y="580" width="70" height="50" class="fur"/>
<text x="2515" y="745" class="sub">5/53</text>
<rect x="2500" y="860" width="200" height="200" class="rm"/>
<line x1="2610" y1="860" x2="2690" y2="860" class="gap"/>
<path d="M2610 860L2610 940A80 80 0 0 0 2690 860" class="swing"/>
<rect x="2515" y="915" width="60" height="130" class="fur"/>
<line x1="2515" y1="960" x2="2575" y2="960" class="fine"/>
<rect x="2610" y="980" width="70" height="50" class="fur"/>
<text x="2515" y="900" class="sub">5/54</text>
<rect x="1300" y="860" width="200" height="420" class="rock"/>
<line x1="1300" y1="860" x2="1500" y2="860" class="rgap"/>
<line x1="1300" y1="1280" x2="1500" y2="1280" class="rgap"/>
<rect x="50" y="1280" width="2700" height="100" class="rock"/>
<text x="70" y="1355" class="lbl">No.6 ROAD</text>
<rect x="100" y="1080" width="200" height="200" class="rm"/>
<line x1="210" y1="1280" x2="290" y2="1280" class="gap"/>
<path d="M210 1280L210 1200A80 80 0 0 1 290 1280" class="swing"/>
<rect x="115" y="1095" width="60" height="130" class="fur"/>
<line x1="115" y1="1140" x2="175" y2="1140" class="fine"/>
<rect x="210" y="1100" width="70" height="50" class="fur"/>
<text x="115" y="1265" class="sub">6/77</text>
<rect x="100" y="1380" width="200" height="200" class="rm"/>
<line x1="210" y1="1380" x2="290" y2="1380" class="gap"/>
<path d="M210 1380L210 1460A80 80 0 0 0 290 1380" class="swing"/>
<rect x="120" y="1480" width="80" height="80" class="fur"/>
<text x="160" y="1524.2" class="fl" font-size="12">PRIVY</text>
<rect x="300" y="1080" width="200" height="200" class="rm"/>
<line x1="410" y1="1280" x2="490" y2="1280" class="gap"/>
<path d="M410 1280L410 1200A80 80 0 0 1 490 1280" class="swing"/>
<rect x="315" y="1095" width="60" height="130" class="fur"/>
<line x1="315" y1="1140" x2="375" y2="1140" class="fine"/>
<rect x="410" y="1100" width="70" height="50" class="fur"/>
<text x="315" y="1265" class="sub">6/75</text>
<rect x="300" y="1380" width="200" height="200" class="rm"/>
<line x1="410" y1="1380" x2="490" y2="1380" class="gap"/>
<path d="M410 1380L410 1460A80 80 0 0 0 490 1380" class="swing"/>
<rect x="315" y="1435" width="60" height="130" class="fur"/>
<line x1="315" y1="1480" x2="375" y2="1480" class="fine"/>
<rect x="410" y="1500" width="70" height="50" class="fur"/>
<text x="315" y="1420" class="sub">6/76</text>
<rect x="500" y="1080" width="200" height="200" class="rm"/>
<line x1="610" y1="1280" x2="690" y2="1280" class="gap"/>
<path d="M610 1280L610 1200A80 80 0 0 1 690 1280" class="swing"/>
<rect x="515" y="1095" width="60" height="130" class="fur"/>
<line x1="515" y1="1140" x2="575" y2="1140" class="fine"/>
<rect x="610" y="1100" width="70" height="50" class="fur"/>
<text x="515" y="1265" class="sub">6/73</text>
<rect x="500" y="1380" width="200" height="200" class="rm"/>
<line x1="610" y1="1380" x2="690" y2="1380" class="gap"/>
<path d="M610 1380L610 1460A80 80 0 0 0 690 1380" class="swing"/>
<rect x="515" y="1435" width="60" height="130" class="fur"/>
<line x1="515" y1="1480" x2="575" y2="1480" class="fine"/>
<rect x="610" y="1500" width="70" height="50" class="fur"/>
<text x="515" y="1420" class="sub">6/74</text>
<rect x="700" y="1080" width="200" height="200" class="rm"/>
<line x1="810" y1="1280" x2="890" y2="1280" class="gap"/>
<path d="M810 1280L810 1200A80 80 0 0 1 890 1280" class="swing"/>
<rect x="715" y="1095" width="60" height="130" class="fur"/>
<line x1="715" y1="1140" x2="775" y2="1140" class="fine"/>
<rect x="810" y="1100" width="70" height="50" class="fur"/>
<text x="715" y="1265" class="sub">6/71</text>
<rect x="700" y="1380" width="200" height="200" class="rm"/>
<line x1="810" y1="1380" x2="890" y2="1380" class="gap"/>
<path d="M810 1380L810 1460A80 80 0 0 0 890 1380" class="swing"/>
<rect x="715" y="1435" width="60" height="130" class="fur"/>
<line x1="715" y1="1480" x2="775" y2="1480" class="fine"/>
<rect x="810" y="1500" width="70" height="50" class="fur"/>
<text x="715" y="1420" class="sub">6/72</text>
<rect x="900" y="1080" width="200" height="200" class="rm"/>
<line x1="1010" y1="1280" x2="1090" y2="1280" class="gap"/>
<path d="M1010 1280L1010 1200A80 80 0 0 1 1090 1280" class="swing"/>
<rect x="915" y="1095" width="60" height="130" class="fur"/>
<line x1="915" y1="1140" x2="975" y2="1140" class="fine"/>
<rect x="1010" y="1100" width="70" height="50" class="fur"/>
<text x="915" y="1265" class="sub">6/69</text>
<rect x="900" y="1380" width="200" height="200" class="rm"/>
<line x1="1010" y1="1380" x2="1090" y2="1380" class="gap"/>
<path d="M1010 1380L1010 1460A80 80 0 0 0 1090 1380" class="swing"/>
<rect x="915" y="1435" width="60" height="130" class="fur"/>
<line x1="915" y1="1480" x2="975" y2="1480" class="fine"/>
<rect x="1010" y="1500" width="70" height="50" class="fur"/>
<text x="915" y="1420" class="sub">6/70</text>
<rect x="1100" y="1080" width="200" height="200" class="rm"/>
<line x1="1210" y1="1280" x2="1290" y2="1280" class="gap"/>
<path d="M1210 1280L1210 1200A80 80 0 0 1 1290 1280" class="swing"/>
<rect x="1115" y="1095" width="60" height="130" class="fur"/>
<line x1="1115" y1="1140" x2="1175" y2="1140" class="fine"/>
<rect x="1210" y="1100" width="70" height="50" class="fur"/>
<text x="1115" y="1265" class="sub">6/67</text>
<rect x="1100" y="1380" width="200" height="200" class="rm"/>
<line x1="1210" y1="1380" x2="1290" y2="1380" class="gap"/>
<path d="M1210 1380L1210 1460A80 80 0 0 0 1290 1380" class="swing"/>
<rect x="1115" y="1435" width="60" height="130" class="fur"/>
<line x1="1115" y1="1480" x2="1175" y2="1480" class="fine"/>
<rect x="1210" y="1500" width="70" height="50" class="fur"/>
<text x="1115" y="1420" class="sub">6/68</text>
<rect x="1300" y="1380" width="200" height="200" class="rm"/>
<line x1="1410" y1="1380" x2="1490" y2="1380" class="gap"/>
<path d="M1410 1380L1410 1460A80 80 0 0 0 1490 1380" class="swing"/>
<rect x="1315" y="1435" width="60" height="130" class="fur"/>
<line x1="1315" y1="1480" x2="1375" y2="1480" class="fine"/>
<rect x="1410" y="1500" width="70" height="50" class="fur"/>
<text x="1315" y="1420" class="sub">6/66</text>
<rect x="1500" y="1080" width="200" height="200" class="rm"/>
<line x1="1610" y1="1280" x2="1690" y2="1280" class="gap"/>
<path d="M1610 1280L1610 1200A80 80 0 0 1 1690 1280" class="swing"/>
<rect x="1515" y="1095" width="60" height="130" class="fur"/>
<line x1="1515" y1="1140" x2="1575" y2="1140" class="fine"/>
<rect x="1610" y="1100" width="70" height="50" class="fur"/>
<text x="1515" y="1265" class="sub">6/63</text>
<rect x="1500" y="1380" width="200" height="200" class="rm"/>
<line x1="1610" y1="1380" x2="1690" y2="1380" class="gap"/>
<path d="M1610 1380L1610 1460A80 80 0 0 0 1690 1380" class="swing"/>
<rect x="1515" y="1435" width="60" height="130" class="fur"/>
<line x1="1515" y1="1480" x2="1575" y2="1480" class="fine"/>
<rect x="1610" y="1500" width="70" height="50" class="fur"/>
<text x="1515" y="1420" class="sub">6/64</text>
<rect x="1700" y="1080" width="200" height="200" class="rm"/>
<line x1="1810" y1="1280" x2="1890" y2="1280" class="gap"/>
<path d="M1810 1280L1810 1200A80 80 0 0 1 1890 1280" class="swing"/>
<rect x="1715" y="1095" width="60" height="130" class="fur"/>
<line x1="1715" y1="1140" x2="1775" y2="1140" class="fine"/>
<rect x="1810" y="1100" width="70" height="50" class="fur"/>
<text x="1715" y="1265" class="sub">6/61</text>
<rect x="1700" y="1380" width="200" height="200" class="rm"/>
<line x1="1810" y1="1380" x2="1890" y2="1380" class="gap"/>
<path d="M1810 1380L1810 1460A80 80 0 0 0 1890 1380" class="swing"/>
<rect x="1715" y="1435" width="60" height="130" class="fur"/>
<line x1="1715" y1="1480" x2="1775" y2="1480" class="fine"/>
<rect x="1810" y="1500" width="70" height="50" class="fur"/>
<text x="1715" y="1420" class="sub">6/62</text>
<rect x="1900" y="1080" width="200" height="200" class="rm"/>
<line x1="2010" y1="1280" x2="2090" y2="1280" class="gap"/>
<path d="M2010 1280L2010 1200A80 80 0 0 1 2090 1280" class="swing"/>
<rect x="1915" y="1095" width="60" height="130" class="fur"/>
<line x1="1915" y1="1140" x2="1975" y2="1140" class="fine"/>
<rect x="2010" y="1100" width="70" height="50" class="fur"/>
<text x="1915" y="1265" class="sub">6/59</text>
<rect x="1900" y="1380" width="200" height="200" class="rm"/>
<line x1="2010" y1="1380" x2="2090" y2="1380" class="gap"/>
<path d="M2010 1380L2010 1460A80 80 0 0 0 2090 1380" class="swing"/>
<rect x="1915" y="1435" width="60" height="130" class="fur"/>
<line x1="1915" y1="1480" x2="1975" y2="1480" class="fine"/>
<rect x="2010" y="1500" width="70" height="50" class="fur"/>
<text x="1915" y="1420" class="sub">6/60</text>
<rect x="2100" y="1080" width="200" height="200" class="rm"/>
<line x1="2210" y1="1280" x2="2290" y2="1280" class="gap"/>
<path d="M2210 1280L2210 1200A80 80 0 0 1 2290 1280" class="swing"/>
<rect x="2115" y="1095" width="60" height="130" class="fur"/>
<line x1="2115" y1="1140" x2="2175" y2="1140" class="fine"/>
<rect x="2210" y="1100" width="70" height="50" class="fur"/>
<text x="2115" y="1265" class="sub">6/57</text>
<rect x="2100" y="1380" width="200" height="200" class="rm"/>
<line x1="2210" y1="1380" x2="2290" y2="1380" class="gap"/>
<path d="M2210 1380L2210 1460A80 80 0 0 0 2290 1380" class="swing"/>
<rect x="2115" y="1435" width="60" height="130" class="fur"/>
<line x1="2115" y1="1480" x2="2175" y2="1480" class="fine"/>
<rect x="2210" y="1500" width="70" height="50" class="fur"/>
<text x="2115" y="1420" class="sub">6/58</text>
<rect x="2300" y="1080" width="200" height="200" class="rm"/>
<line x1="2410" y1="1280" x2="2490" y2="1280" class="gap"/>
<path d="M2410 1280L2410 1200A80 80 0 0 1 2490 1280" class="swing"/>
<rect x="2315" y="1095" width="60" height="130" class="fur"/>
<line x1="2315" y1="1140" x2="2375" y2="1140" class="fine"/>
<rect x="2410" y="1100" width="70" height="50" class="fur"/>
<text x="2315" y="1265" class="sub">6/55</text>
<rect x="2300" y="1380" width="200" height="200" class="rm"/>
<line x1="2410" y1="1380" x2="2490" y2="1380" class="gap"/>
<path d="M2410 1380L2410 1460A80 80 0 0 0 2490 1380" class="swing"/>
<rect x="2315" y="1435" width="60" height="130" class="fur"/>
<line x1="2315" y1="1480" x2="2375" y2="1480" class="fine"/>
<rect x="2410" y="1500" width="70" height="50" class="fur"/>
<text x="2315" y="1420" class="sub">6/56</text>
<rect x="2500" y="1080" width="200" height="200" class="rm"/>
<line x1="2610" y1="1280" x2="2690" y2="1280" class="gap"/>
<path d="M2610 1280L2610 1200A80 80 0 0 1 2690 1280" class="swing"/>
<rect x="2520" y="1100" width="80" height="80" class="fur"/>
<text x="2560" y="1144.2" class="fl" font-size="12">TAP</text>
<rect x="2500" y="1380" width="200" height="200" class="rm"/>
<line x1="2610" y1="1380" x2="2690" y2="1380" class="gap"/>
<path d="M2610 1380L2610 1460A80 80 0 0 0 2690 1380" class="swing"/>
<rect x="2515" y="1435" width="60" height="130" class="fur"/>
<line x1="2515" y1="1480" x2="2575" y2="1480" class="fine"/>
<rect x="2610" y="1500" width="70" height="50" class="fur"/>
<text x="2515" y="1420" class="sub">6/54</text>
<line x1="2700" y1="810" x2="2785" y2="810" class="arw" marker-end="url(#ah)"/>
<text x="2550" y="835" class="sub exit">SHEET 12 →</text>
<text x="350" y="1360" class="pen" transform="rotate(-1 350 1360)">west face: worked out 1958</text>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 13 OF 13 · PIT GALLERIES</text>
<text x="1924" y="1815" class="ttl">THE ESTATE · NORTH</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/13 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

+591
View File
@@ -0,0 +1,591 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — THE ESTATE · SOUTH. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="240" width="2700" height="100" class="rock"/>
<text x="70" y="315" class="lbl">No.4 ROAD</text>
<circle cx="2705" cy="285" r="30" class="numc"/><text x="2705" y="298" class="num">18</text>
<rect x="100" y="40" width="200" height="200" class="rm"/>
<line x1="210" y1="240" x2="290" y2="240" class="gap"/>
<path d="M210 240L210 160A80 80 0 0 1 290 240" class="swing"/>
<rect x="115" y="55" width="60" height="130" class="fur"/>
<line x1="115" y1="100" x2="175" y2="100" class="fine"/>
<rect x="210" y="60" width="70" height="50" class="fur"/>
<text x="115" y="225" class="sub">4/25</text>
<rect x="100" y="340" width="200" height="200" class="rm"/>
<line x1="210" y1="340" x2="290" y2="340" class="gap"/>
<path d="M210 340L210 420A80 80 0 0 0 290 340" class="swing"/>
<rect x="115" y="395" width="60" height="130" class="fur"/>
<line x1="115" y1="440" x2="175" y2="440" class="fine"/>
<rect x="210" y="460" width="70" height="50" class="fur"/>
<text x="115" y="380" class="sub">4/26</text>
<rect x="300" y="40" width="200" height="200" class="rm"/>
<line x1="410" y1="240" x2="490" y2="240" class="gap"/>
<path d="M410 240L410 160A80 80 0 0 1 490 240" class="swing"/>
<rect x="315" y="55" width="60" height="130" class="fur"/>
<line x1="315" y1="100" x2="375" y2="100" class="fine"/>
<rect x="410" y="60" width="70" height="50" class="fur"/>
<text x="315" y="225" class="sub">4/23</text>
<rect x="300" y="340" width="200" height="200" class="rm"/>
<line x1="410" y1="340" x2="490" y2="340" class="gap"/>
<path d="M410 340L410 420A80 80 0 0 0 490 340" class="swing"/>
<rect x="315" y="395" width="60" height="130" class="fur"/>
<line x1="315" y1="440" x2="375" y2="440" class="fine"/>
<rect x="410" y="460" width="70" height="50" class="fur"/>
<text x="315" y="380" class="sub">4/24</text>
<rect x="500" y="40" width="200" height="200" class="rm"/>
<line x1="610" y1="240" x2="690" y2="240" class="gap"/>
<path d="M610 240L610 160A80 80 0 0 1 690 240" class="swing"/>
<rect x="515" y="55" width="60" height="130" class="fur"/>
<line x1="515" y1="100" x2="575" y2="100" class="fine"/>
<rect x="610" y="60" width="70" height="50" class="fur"/>
<text x="515" y="225" class="sub">4/21</text>
<rect x="500" y="340" width="200" height="200" class="rm"/>
<line x1="610" y1="340" x2="690" y2="340" class="gap"/>
<path d="M610 340L610 420A80 80 0 0 0 690 340" class="swing"/>
<rect x="515" y="395" width="60" height="130" class="fur"/>
<line x1="515" y1="440" x2="575" y2="440" class="fine"/>
<rect x="610" y="460" width="70" height="50" class="fur"/>
<text x="515" y="380" class="sub">4/22</text>
<rect x="700" y="40" width="200" height="200" class="rm"/>
<line x1="810" y1="240" x2="890" y2="240" class="gap"/>
<path d="M810 240L810 160A80 80 0 0 1 890 240" class="swing"/>
<rect x="715" y="55" width="60" height="130" class="fur"/>
<line x1="715" y1="100" x2="775" y2="100" class="fine"/>
<rect x="810" y="60" width="70" height="50" class="fur"/>
<text x="715" y="225" class="sub">4/19</text>
<rect x="700" y="340" width="200" height="200" class="rm"/>
<line x1="810" y1="340" x2="890" y2="340" class="gap"/>
<path d="M810 340L810 420A80 80 0 0 0 890 340" class="swing"/>
<rect x="715" y="395" width="60" height="130" class="fur"/>
<line x1="715" y1="440" x2="775" y2="440" class="fine"/>
<rect x="810" y="460" width="70" height="50" class="fur"/>
<text x="715" y="380" class="sub">4/20</text>
<rect x="900" y="40" width="200" height="200" class="rm"/>
<line x1="1010" y1="240" x2="1090" y2="240" class="gap"/>
<path d="M1010 240L1010 160A80 80 0 0 1 1090 240" class="swing"/>
<rect x="915" y="55" width="60" height="130" class="fur"/>
<line x1="915" y1="100" x2="975" y2="100" class="fine"/>
<rect x="1010" y="60" width="70" height="50" class="fur"/>
<text x="915" y="225" class="sub">4/17</text>
<rect x="900" y="340" width="200" height="200" class="rm"/>
<line x1="1010" y1="340" x2="1090" y2="340" class="gap"/>
<path d="M1010 340L1010 420A80 80 0 0 0 1090 340" class="swing"/>
<rect x="915" y="395" width="60" height="130" class="fur"/>
<line x1="915" y1="440" x2="975" y2="440" class="fine"/>
<rect x="1010" y="460" width="70" height="50" class="fur"/>
<text x="915" y="380" class="sub">4/18</text>
<rect x="1100" y="40" width="200" height="200" class="rm"/>
<line x1="1210" y1="240" x2="1290" y2="240" class="gap"/>
<path d="M1210 240L1210 160A80 80 0 0 1 1290 240" class="swing"/>
<rect x="1115" y="55" width="60" height="130" class="fur"/>
<line x1="1115" y1="100" x2="1175" y2="100" class="fine"/>
<rect x="1210" y="60" width="70" height="50" class="fur"/>
<text x="1115" y="225" class="sub">4/15</text>
<rect x="1100" y="340" width="200" height="200" class="rm"/>
<line x1="1210" y1="340" x2="1290" y2="340" class="gap"/>
<path d="M1210 340L1210 420A80 80 0 0 0 1290 340" class="swing"/>
<rect x="1115" y="395" width="60" height="130" class="fur"/>
<line x1="1115" y1="440" x2="1175" y2="440" class="fine"/>
<rect x="1210" y="460" width="70" height="50" class="fur"/>
<text x="1115" y="380" class="sub">4/16</text>
<rect x="1300" y="40" width="200" height="200" class="rm"/>
<line x1="1410" y1="240" x2="1490" y2="240" class="gap"/>
<path d="M1410 240L1410 160A80 80 0 0 1 1490 240" class="swing"/>
<rect x="1315" y="55" width="60" height="130" class="fur"/>
<line x1="1315" y1="100" x2="1375" y2="100" class="fine"/>
<rect x="1410" y="60" width="70" height="50" class="fur"/>
<text x="1315" y="225" class="sub">4/13</text>
<rect x="1500" y="40" width="200" height="200" class="rm"/>
<line x1="1610" y1="240" x2="1690" y2="240" class="gap"/>
<path d="M1610 240L1610 160A80 80 0 0 1 1690 240" class="swing"/>
<rect x="1515" y="55" width="60" height="130" class="fur"/>
<line x1="1515" y1="100" x2="1575" y2="100" class="fine"/>
<rect x="1610" y="60" width="70" height="50" class="fur"/>
<text x="1515" y="225" class="sub">4/11</text>
<rect x="1500" y="340" width="200" height="200" class="rm"/>
<line x1="1610" y1="340" x2="1690" y2="340" class="gap"/>
<path d="M1610 340L1610 420A80 80 0 0 0 1690 340" class="swing"/>
<rect x="1515" y="395" width="60" height="130" class="fur"/>
<line x1="1515" y1="440" x2="1575" y2="440" class="fine"/>
<rect x="1610" y="460" width="70" height="50" class="fur"/>
<text x="1515" y="380" class="sub">4/12</text>
<rect x="1700" y="40" width="200" height="200" class="rm"/>
<line x1="1810" y1="240" x2="1890" y2="240" class="gap"/>
<path d="M1810 240L1810 160A80 80 0 0 1 1890 240" class="swing"/>
<rect x="1715" y="55" width="60" height="130" class="fur"/>
<line x1="1715" y1="100" x2="1775" y2="100" class="fine"/>
<rect x="1810" y="60" width="70" height="50" class="fur"/>
<text x="1715" y="225" class="sub">4/09</text>
<rect x="1700" y="340" width="200" height="200" class="rm"/>
<line x1="1810" y1="340" x2="1890" y2="340" class="gap"/>
<path d="M1810 340L1810 420A80 80 0 0 0 1890 340" class="swing"/>
<rect x="1715" y="395" width="60" height="130" class="fur"/>
<line x1="1715" y1="440" x2="1775" y2="440" class="fine"/>
<rect x="1810" y="460" width="70" height="50" class="fur"/>
<text x="1715" y="380" class="sub">4/10</text>
<rect x="1900" y="40" width="200" height="200" class="rm"/>
<line x1="2010" y1="240" x2="2090" y2="240" class="gap"/>
<path d="M2010 240L2010 160A80 80 0 0 1 2090 240" class="swing"/>
<rect x="1915" y="55" width="60" height="130" class="fur"/>
<line x1="1915" y1="100" x2="1975" y2="100" class="fine"/>
<rect x="2010" y="60" width="70" height="50" class="fur"/>
<text x="1915" y="225" class="sub">4/07</text>
<rect x="1900" y="340" width="200" height="200" class="rm"/>
<line x1="2010" y1="340" x2="2090" y2="340" class="gap"/>
<path d="M2010 340L2010 420A80 80 0 0 0 2090 340" class="swing"/>
<rect x="1915" y="395" width="60" height="130" class="fur"/>
<line x1="1915" y1="440" x2="1975" y2="440" class="fine"/>
<rect x="2010" y="460" width="70" height="50" class="fur"/>
<text x="1915" y="380" class="sub">4/08</text>
<rect x="2100" y="40" width="200" height="200" class="rm"/>
<line x1="2210" y1="240" x2="2290" y2="240" class="gap"/>
<path d="M2210 240L2210 160A80 80 0 0 1 2290 240" class="swing"/>
<rect x="2115" y="55" width="60" height="130" class="fur"/>
<line x1="2115" y1="100" x2="2175" y2="100" class="fine"/>
<rect x="2210" y="60" width="70" height="50" class="fur"/>
<text x="2115" y="225" class="sub">4/05</text>
<rect x="2100" y="340" width="200" height="200" class="rm"/>
<line x1="2210" y1="340" x2="2290" y2="340" class="gap"/>
<path d="M2210 340L2210 420A80 80 0 0 0 2290 340" class="swing"/>
<rect x="2115" y="395" width="60" height="130" class="fur"/>
<line x1="2115" y1="440" x2="2175" y2="440" class="fine"/>
<rect x="2210" y="460" width="70" height="50" class="fur"/>
<text x="2115" y="380" class="sub">4/06</text>
<rect x="2300" y="40" width="200" height="200" class="rm"/>
<line x1="2410" y1="240" x2="2490" y2="240" class="gap"/>
<path d="M2410 240L2410 160A80 80 0 0 1 2490 240" class="swing"/>
<rect x="2315" y="55" width="60" height="130" class="fur"/>
<line x1="2315" y1="100" x2="2375" y2="100" class="fine"/>
<rect x="2410" y="60" width="70" height="50" class="fur"/>
<text x="2315" y="225" class="sub">4/03</text>
<rect x="2300" y="340" width="200" height="200" class="rm"/>
<line x1="2410" y1="340" x2="2490" y2="340" class="gap"/>
<path d="M2410 340L2410 420A80 80 0 0 0 2490 340" class="swing"/>
<rect x="2315" y="395" width="60" height="130" class="fur"/>
<line x1="2315" y1="440" x2="2375" y2="440" class="fine"/>
<rect x="2410" y="460" width="70" height="50" class="fur"/>
<text x="2315" y="380" class="sub">4/04</text>
<rect x="2500" y="40" width="200" height="200" class="rm"/>
<line x1="2610" y1="240" x2="2690" y2="240" class="gap"/>
<path d="M2610 240L2610 160A80 80 0 0 1 2690 240" class="swing"/>
<rect x="2520" y="60" width="80" height="80" class="fur"/>
<text x="2560" y="104.2" class="fl" font-size="12">PRIVY</text>
<rect x="2500" y="340" width="200" height="200" class="rm"/>
<line x1="2610" y1="340" x2="2690" y2="340" class="gap"/>
<path d="M2610 340L2610 420A80 80 0 0 0 2690 340" class="swing"/>
<rect x="2515" y="395" width="60" height="130" class="fur"/>
<line x1="2515" y1="440" x2="2575" y2="440" class="fine"/>
<rect x="2610" y="460" width="70" height="50" class="fur"/>
<text x="2515" y="380" class="sub">4/02</text>
<rect x="1300" y="340" width="200" height="420" class="rock"/>
<line x1="1300" y1="340" x2="1500" y2="340" class="rgap"/>
<line x1="1300" y1="760" x2="1500" y2="760" class="rgap"/>
<rect x="50" y="760" width="2700" height="100" class="rock"/>
<text x="130" y="835" class="lbl">No.5 ROAD</text>
<rect x="100" y="560" width="200" height="200" class="rm"/>
<line x1="210" y1="760" x2="290" y2="760" class="gap"/>
<path d="M210 760L210 680A80 80 0 0 1 290 760" class="swing"/>
<rect x="115" y="575" width="60" height="130" class="fur"/>
<line x1="115" y1="620" x2="175" y2="620" class="fine"/>
<rect x="210" y="580" width="70" height="50" class="fur"/>
<text x="115" y="745" class="sub">5/25</text>
<rect x="100" y="860" width="200" height="200" class="rm"/>
<line x1="210" y1="860" x2="290" y2="860" class="gap"/>
<path d="M210 860L210 940A80 80 0 0 0 290 860" class="swing"/>
<rect x="115" y="915" width="60" height="130" class="fur"/>
<line x1="115" y1="960" x2="175" y2="960" class="fine"/>
<rect x="210" y="980" width="70" height="50" class="fur"/>
<text x="115" y="900" class="sub">5/26</text>
<rect x="300" y="560" width="200" height="200" class="rm"/>
<line x1="410" y1="760" x2="490" y2="760" class="gap"/>
<path d="M410 760L410 680A80 80 0 0 1 490 760" class="swing"/>
<rect x="315" y="575" width="60" height="130" class="fur"/>
<line x1="315" y1="620" x2="375" y2="620" class="fine"/>
<rect x="410" y="580" width="70" height="50" class="fur"/>
<text x="315" y="745" class="sub">5/23</text>
<rect x="300" y="860" width="200" height="200" class="rm"/>
<line x1="410" y1="860" x2="490" y2="860" class="gap"/>
<path d="M410 860L410 940A80 80 0 0 0 490 860" class="swing"/>
<rect x="315" y="915" width="60" height="130" class="fur"/>
<line x1="315" y1="960" x2="375" y2="960" class="fine"/>
<rect x="410" y="980" width="70" height="50" class="fur"/>
<text x="315" y="900" class="sub">5/24</text>
<rect x="500" y="560" width="200" height="200" class="rm"/>
<line x1="610" y1="760" x2="690" y2="760" class="gap"/>
<path d="M610 760L610 680A80 80 0 0 1 690 760" class="swing"/>
<rect x="515" y="575" width="60" height="130" class="fur"/>
<line x1="515" y1="620" x2="575" y2="620" class="fine"/>
<rect x="610" y="580" width="70" height="50" class="fur"/>
<text x="515" y="745" class="sub">5/21</text>
<rect x="500" y="860" width="200" height="200" class="rm"/>
<line x1="610" y1="860" x2="690" y2="860" class="gap"/>
<path d="M610 860L610 940A80 80 0 0 0 690 860" class="swing"/>
<rect x="515" y="915" width="60" height="130" class="fur"/>
<line x1="515" y1="960" x2="575" y2="960" class="fine"/>
<rect x="610" y="980" width="70" height="50" class="fur"/>
<text x="515" y="900" class="sub">5/22</text>
<rect x="700" y="560" width="200" height="200" class="rm"/>
<line x1="810" y1="760" x2="890" y2="760" class="gap"/>
<path d="M810 760L810 680A80 80 0 0 1 890 760" class="swing"/>
<rect x="715" y="575" width="60" height="130" class="fur"/>
<line x1="715" y1="620" x2="775" y2="620" class="fine"/>
<rect x="810" y="580" width="70" height="50" class="fur"/>
<text x="715" y="745" class="sub">5/19</text>
<rect x="700" y="860" width="200" height="200" class="rm"/>
<line x1="810" y1="860" x2="890" y2="860" class="gap"/>
<path d="M810 860L810 940A80 80 0 0 0 890 860" class="swing"/>
<rect x="715" y="915" width="60" height="130" class="fur"/>
<line x1="715" y1="960" x2="775" y2="960" class="fine"/>
<rect x="810" y="980" width="70" height="50" class="fur"/>
<text x="715" y="900" class="sub">5/20</text>
<rect x="900" y="560" width="200" height="200" class="rm"/>
<line x1="1010" y1="760" x2="1090" y2="760" class="gap"/>
<path d="M1010 760L1010 680A80 80 0 0 1 1090 760" class="swing"/>
<rect x="915" y="575" width="60" height="130" class="fur"/>
<line x1="915" y1="620" x2="975" y2="620" class="fine"/>
<rect x="1010" y="580" width="70" height="50" class="fur"/>
<text x="915" y="745" class="sub">5/17</text>
<rect x="900" y="860" width="200" height="200" class="rm"/>
<line x1="1010" y1="860" x2="1090" y2="860" class="gap"/>
<path d="M1010 860L1010 940A80 80 0 0 0 1090 860" class="swing"/>
<rect x="915" y="915" width="60" height="130" class="fur"/>
<line x1="915" y1="960" x2="975" y2="960" class="fine"/>
<rect x="1010" y="980" width="70" height="50" class="fur"/>
<text x="915" y="900" class="sub">5/18</text>
<rect x="1100" y="560" width="200" height="200" class="rm"/>
<line x1="1210" y1="760" x2="1290" y2="760" class="gap"/>
<path d="M1210 760L1210 680A80 80 0 0 1 1290 760" class="swing"/>
<rect x="1115" y="575" width="60" height="130" class="fur"/>
<line x1="1115" y1="620" x2="1175" y2="620" class="fine"/>
<rect x="1210" y="580" width="70" height="50" class="fur"/>
<text x="1115" y="745" class="sub">5/15</text>
<rect x="1100" y="860" width="200" height="200" class="rm"/>
<line x1="1210" y1="860" x2="1290" y2="860" class="gap"/>
<path d="M1210 860L1210 940A80 80 0 0 0 1290 860" class="swing"/>
<rect x="1115" y="915" width="60" height="130" class="fur"/>
<line x1="1115" y1="960" x2="1175" y2="960" class="fine"/>
<rect x="1210" y="980" width="70" height="50" class="fur"/>
<text x="1115" y="900" class="sub">5/16</text>
<rect x="1500" y="560" width="200" height="200" class="rm"/>
<line x1="1610" y1="760" x2="1690" y2="760" class="gap"/>
<path d="M1610 760L1610 680A80 80 0 0 1 1690 760" class="swing"/>
<rect x="1515" y="575" width="60" height="130" class="fur"/>
<line x1="1515" y1="620" x2="1575" y2="620" class="fine"/>
<rect x="1610" y="580" width="70" height="50" class="fur"/>
<text x="1515" y="745" class="sub">5/11</text>
<rect x="1500" y="860" width="200" height="200" class="rm"/>
<line x1="1610" y1="860" x2="1690" y2="860" class="gap"/>
<path d="M1610 860L1610 940A80 80 0 0 0 1690 860" class="swing"/>
<rect x="1515" y="915" width="60" height="130" class="fur"/>
<line x1="1515" y1="960" x2="1575" y2="960" class="fine"/>
<rect x="1610" y="980" width="70" height="50" class="fur"/>
<text x="1515" y="900" class="sub">5/12</text>
<rect x="1700" y="560" width="200" height="200" class="rm"/>
<line x1="1810" y1="760" x2="1890" y2="760" class="gap"/>
<path d="M1810 760L1810 680A80 80 0 0 1 1890 760" class="swing"/>
<rect x="1715" y="575" width="60" height="130" class="fur"/>
<line x1="1715" y1="620" x2="1775" y2="620" class="fine"/>
<rect x="1810" y="580" width="70" height="50" class="fur"/>
<text x="1715" y="745" class="sub">5/09</text>
<rect x="1700" y="860" width="200" height="200" class="rm"/>
<line x1="1810" y1="860" x2="1890" y2="860" class="gap"/>
<path d="M1810 860L1810 940A80 80 0 0 0 1890 860" class="swing"/>
<rect x="1715" y="915" width="60" height="130" class="fur"/>
<line x1="1715" y1="960" x2="1775" y2="960" class="fine"/>
<rect x="1810" y="980" width="70" height="50" class="fur"/>
<text x="1715" y="900" class="sub">5/10</text>
<rect x="1900" y="560" width="200" height="200" class="rm"/>
<line x1="2010" y1="760" x2="2090" y2="760" class="gap"/>
<path d="M2010 760L2010 680A80 80 0 0 1 2090 760" class="swing"/>
<rect x="1915" y="575" width="60" height="130" class="fur"/>
<line x1="1915" y1="620" x2="1975" y2="620" class="fine"/>
<rect x="2010" y="580" width="70" height="50" class="fur"/>
<text x="1915" y="745" class="sub">5/07</text>
<rect x="1900" y="860" width="200" height="200" class="rm"/>
<line x1="2010" y1="860" x2="2090" y2="860" class="gap"/>
<path d="M2010 860L2010 940A80 80 0 0 0 2090 860" class="swing"/>
<rect x="1915" y="915" width="60" height="130" class="fur"/>
<line x1="1915" y1="960" x2="1975" y2="960" class="fine"/>
<rect x="2010" y="980" width="70" height="50" class="fur"/>
<text x="1915" y="900" class="sub">5/08</text>
<rect x="2100" y="560" width="200" height="200" class="rm"/>
<line x1="2210" y1="760" x2="2290" y2="760" class="gap"/>
<path d="M2210 760L2210 680A80 80 0 0 1 2290 760" class="swing"/>
<rect x="2115" y="575" width="60" height="130" class="fur"/>
<line x1="2115" y1="620" x2="2175" y2="620" class="fine"/>
<rect x="2210" y="580" width="70" height="50" class="fur"/>
<text x="2115" y="745" class="sub">5/05</text>
<rect x="2100" y="860" width="200" height="200" class="rm"/>
<line x1="2210" y1="860" x2="2290" y2="860" class="gap"/>
<path d="M2210 860L2210 940A80 80 0 0 0 2290 860" class="swing"/>
<rect x="2115" y="915" width="60" height="130" class="fur"/>
<line x1="2115" y1="960" x2="2175" y2="960" class="fine"/>
<rect x="2210" y="980" width="70" height="50" class="fur"/>
<text x="2115" y="900" class="sub">5/06</text>
<rect x="2300" y="560" width="200" height="200" class="rm"/>
<line x1="2410" y1="760" x2="2490" y2="760" class="gap"/>
<path d="M2410 760L2410 680A80 80 0 0 1 2490 760" class="swing"/>
<rect x="2315" y="575" width="60" height="130" class="fur"/>
<line x1="2315" y1="620" x2="2375" y2="620" class="fine"/>
<rect x="2410" y="580" width="70" height="50" class="fur"/>
<text x="2315" y="745" class="sub">5/03</text>
<rect x="2300" y="860" width="200" height="200" class="rm"/>
<line x1="2410" y1="860" x2="2490" y2="860" class="gap"/>
<path d="M2410 860L2410 940A80 80 0 0 0 2490 860" class="swing"/>
<rect x="2315" y="915" width="60" height="130" class="fur"/>
<line x1="2315" y1="960" x2="2375" y2="960" class="fine"/>
<rect x="2410" y="980" width="70" height="50" class="fur"/>
<text x="2315" y="900" class="sub">5/04</text>
<rect x="2500" y="560" width="200" height="200" class="rm"/>
<line x1="2610" y1="760" x2="2690" y2="760" class="gap"/>
<path d="M2610 760L2610 680A80 80 0 0 1 2690 760" class="swing"/>
<rect x="2515" y="575" width="60" height="130" class="fur"/>
<line x1="2515" y1="620" x2="2575" y2="620" class="fine"/>
<rect x="2610" y="580" width="70" height="50" class="fur"/>
<text x="2515" y="745" class="sub">5/01</text>
<rect x="2500" y="860" width="200" height="200" class="rm"/>
<line x1="2610" y1="860" x2="2690" y2="860" class="gap"/>
<path d="M2610 860L2610 940A80 80 0 0 0 2690 860" class="swing"/>
<rect x="2515" y="915" width="60" height="130" class="fur"/>
<line x1="2515" y1="960" x2="2575" y2="960" class="fine"/>
<rect x="2610" y="980" width="70" height="50" class="fur"/>
<text x="2515" y="900" class="sub">5/02</text>
<rect x="1300" y="860" width="200" height="420" class="rock"/>
<line x1="1300" y1="860" x2="1500" y2="860" class="rgap"/>
<line x1="1300" y1="1280" x2="1500" y2="1280" class="rgap"/>
<rect x="50" y="1280" width="2700" height="100" class="rock"/>
<text x="70" y="1355" class="lbl">No.6 ROAD</text>
<rect x="100" y="1080" width="200" height="200" class="rm"/>
<line x1="210" y1="1280" x2="290" y2="1280" class="gap"/>
<path d="M210 1280L210 1200A80 80 0 0 1 290 1280" class="swing"/>
<rect x="115" y="1095" width="60" height="130" class="fur"/>
<line x1="115" y1="1140" x2="175" y2="1140" class="fine"/>
<rect x="210" y="1100" width="70" height="50" class="fur"/>
<text x="115" y="1265" class="sub">6/25</text>
<rect x="100" y="1380" width="200" height="200" class="rm"/>
<line x1="210" y1="1380" x2="290" y2="1380" class="gap"/>
<path d="M210 1380L210 1460A80 80 0 0 0 290 1380" class="swing"/>
<rect x="120" y="1480" width="80" height="80" class="fur"/>
<text x="160" y="1524.2" class="fl" font-size="12">PRIVY</text>
<rect x="300" y="1080" width="200" height="200" class="rm"/>
<line x1="410" y1="1280" x2="490" y2="1280" class="gap"/>
<path d="M410 1280L410 1200A80 80 0 0 1 490 1280" class="swing"/>
<rect x="315" y="1095" width="60" height="130" class="fur"/>
<line x1="315" y1="1140" x2="375" y2="1140" class="fine"/>
<rect x="410" y="1100" width="70" height="50" class="fur"/>
<text x="315" y="1265" class="sub">6/23</text>
<rect x="300" y="1380" width="200" height="200" class="rm"/>
<line x1="410" y1="1380" x2="490" y2="1380" class="gap"/>
<path d="M410 1380L410 1460A80 80 0 0 0 490 1380" class="swing"/>
<rect x="315" y="1435" width="60" height="130" class="fur"/>
<line x1="315" y1="1480" x2="375" y2="1480" class="fine"/>
<rect x="410" y="1500" width="70" height="50" class="fur"/>
<text x="315" y="1420" class="sub">6/24</text>
<rect x="500" y="1080" width="200" height="200" class="rm"/>
<line x1="610" y1="1280" x2="690" y2="1280" class="gap"/>
<path d="M610 1280L610 1200A80 80 0 0 1 690 1280" class="swing"/>
<rect x="515" y="1095" width="60" height="130" class="fur"/>
<line x1="515" y1="1140" x2="575" y2="1140" class="fine"/>
<rect x="610" y="1100" width="70" height="50" class="fur"/>
<text x="515" y="1265" class="sub">6/21</text>
<rect x="500" y="1380" width="200" height="200" class="rm"/>
<line x1="610" y1="1380" x2="690" y2="1380" class="gap"/>
<path d="M610 1380L610 1460A80 80 0 0 0 690 1380" class="swing"/>
<rect x="515" y="1435" width="60" height="130" class="fur"/>
<line x1="515" y1="1480" x2="575" y2="1480" class="fine"/>
<rect x="610" y="1500" width="70" height="50" class="fur"/>
<text x="515" y="1420" class="sub">6/22</text>
<rect x="700" y="1080" width="200" height="200" class="rm"/>
<line x1="810" y1="1280" x2="890" y2="1280" class="gap"/>
<path d="M810 1280L810 1200A80 80 0 0 1 890 1280" class="swing"/>
<rect x="715" y="1095" width="60" height="130" class="fur"/>
<line x1="715" y1="1140" x2="775" y2="1140" class="fine"/>
<rect x="810" y="1100" width="70" height="50" class="fur"/>
<text x="715" y="1265" class="sub">6/19</text>
<rect x="700" y="1380" width="200" height="200" class="rm"/>
<line x1="810" y1="1380" x2="890" y2="1380" class="gap"/>
<path d="M810 1380L810 1460A80 80 0 0 0 890 1380" class="swing"/>
<rect x="715" y="1435" width="60" height="130" class="fur"/>
<line x1="715" y1="1480" x2="775" y2="1480" class="fine"/>
<rect x="810" y="1500" width="70" height="50" class="fur"/>
<text x="715" y="1420" class="sub">6/20</text>
<rect x="900" y="1080" width="200" height="200" class="rm"/>
<line x1="1010" y1="1280" x2="1090" y2="1280" class="gap"/>
<path d="M1010 1280L1010 1200A80 80 0 0 1 1090 1280" class="swing"/>
<rect x="915" y="1095" width="60" height="130" class="fur"/>
<line x1="915" y1="1140" x2="975" y2="1140" class="fine"/>
<rect x="1010" y="1100" width="70" height="50" class="fur"/>
<text x="915" y="1265" class="sub">6/17</text>
<rect x="900" y="1380" width="200" height="200" class="rm"/>
<line x1="1010" y1="1380" x2="1090" y2="1380" class="gap"/>
<path d="M1010 1380L1010 1460A80 80 0 0 0 1090 1380" class="swing"/>
<rect x="915" y="1435" width="60" height="130" class="fur"/>
<line x1="915" y1="1480" x2="975" y2="1480" class="fine"/>
<rect x="1010" y="1500" width="70" height="50" class="fur"/>
<text x="915" y="1420" class="sub">6/18</text>
<rect x="1100" y="1080" width="200" height="200" class="rm"/>
<line x1="1210" y1="1280" x2="1290" y2="1280" class="gap"/>
<path d="M1210 1280L1210 1200A80 80 0 0 1 1290 1280" class="swing"/>
<rect x="1115" y="1095" width="60" height="130" class="fur"/>
<line x1="1115" y1="1140" x2="1175" y2="1140" class="fine"/>
<rect x="1210" y="1100" width="70" height="50" class="fur"/>
<text x="1115" y="1265" class="sub">6/15</text>
<rect x="1100" y="1380" width="200" height="200" class="rm"/>
<line x1="1210" y1="1380" x2="1290" y2="1380" class="gap"/>
<path d="M1210 1380L1210 1460A80 80 0 0 0 1290 1380" class="swing"/>
<rect x="1115" y="1435" width="60" height="130" class="fur"/>
<line x1="1115" y1="1480" x2="1175" y2="1480" class="fine"/>
<rect x="1210" y="1500" width="70" height="50" class="fur"/>
<text x="1115" y="1420" class="sub">6/16</text>
<rect x="1300" y="1380" width="200" height="200" class="rm"/>
<line x1="1410" y1="1380" x2="1490" y2="1380" class="gap"/>
<path d="M1410 1380L1410 1460A80 80 0 0 0 1490 1380" class="swing"/>
<rect x="1315" y="1435" width="60" height="130" class="fur"/>
<line x1="1315" y1="1480" x2="1375" y2="1480" class="fine"/>
<rect x="1410" y="1500" width="70" height="50" class="fur"/>
<text x="1315" y="1420" class="sub">6/14</text>
<rect x="1500" y="1080" width="200" height="200" class="rm"/>
<line x1="1610" y1="1280" x2="1690" y2="1280" class="gap"/>
<path d="M1610 1280L1610 1200A80 80 0 0 1 1690 1280" class="swing"/>
<rect x="1515" y="1095" width="60" height="130" class="fur"/>
<line x1="1515" y1="1140" x2="1575" y2="1140" class="fine"/>
<rect x="1610" y="1100" width="70" height="50" class="fur"/>
<text x="1515" y="1265" class="sub">6/11</text>
<rect x="1500" y="1380" width="200" height="200" class="rm"/>
<line x1="1610" y1="1380" x2="1690" y2="1380" class="gap"/>
<path d="M1610 1380L1610 1460A80 80 0 0 0 1690 1380" class="swing"/>
<rect x="1515" y="1435" width="60" height="130" class="fur"/>
<line x1="1515" y1="1480" x2="1575" y2="1480" class="fine"/>
<rect x="1610" y="1500" width="70" height="50" class="fur"/>
<text x="1515" y="1420" class="sub">6/12</text>
<rect x="1700" y="1080" width="200" height="200" class="rm"/>
<line x1="1810" y1="1280" x2="1890" y2="1280" class="gap"/>
<path d="M1810 1280L1810 1200A80 80 0 0 1 1890 1280" class="swing"/>
<rect x="1715" y="1095" width="60" height="130" class="fur"/>
<line x1="1715" y1="1140" x2="1775" y2="1140" class="fine"/>
<rect x="1810" y="1100" width="70" height="50" class="fur"/>
<text x="1715" y="1265" class="sub">6/09</text>
<rect x="1700" y="1380" width="200" height="200" class="rm"/>
<line x1="1810" y1="1380" x2="1890" y2="1380" class="gap"/>
<path d="M1810 1380L1810 1460A80 80 0 0 0 1890 1380" class="swing"/>
<rect x="1715" y="1435" width="60" height="130" class="fur"/>
<line x1="1715" y1="1480" x2="1775" y2="1480" class="fine"/>
<rect x="1810" y="1500" width="70" height="50" class="fur"/>
<text x="1715" y="1420" class="sub">6/10</text>
<rect x="1900" y="1080" width="200" height="200" class="rm"/>
<line x1="2010" y1="1280" x2="2090" y2="1280" class="gap"/>
<path d="M2010 1280L2010 1200A80 80 0 0 1 2090 1280" class="swing"/>
<rect x="1915" y="1095" width="60" height="130" class="fur"/>
<line x1="1915" y1="1140" x2="1975" y2="1140" class="fine"/>
<rect x="2010" y="1100" width="70" height="50" class="fur"/>
<text x="1915" y="1265" class="sub">6/07</text>
<rect x="1900" y="1380" width="200" height="200" class="rm"/>
<line x1="2010" y1="1380" x2="2090" y2="1380" class="gap"/>
<path d="M2010 1380L2010 1460A80 80 0 0 0 2090 1380" class="swing"/>
<rect x="1915" y="1435" width="60" height="130" class="fur"/>
<line x1="1915" y1="1480" x2="1975" y2="1480" class="fine"/>
<rect x="2010" y="1500" width="70" height="50" class="fur"/>
<text x="1915" y="1420" class="sub">6/08</text>
<rect x="2100" y="1080" width="200" height="200" class="rm"/>
<line x1="2210" y1="1280" x2="2290" y2="1280" class="gap"/>
<path d="M2210 1280L2210 1200A80 80 0 0 1 2290 1280" class="swing"/>
<rect x="2115" y="1095" width="60" height="130" class="fur"/>
<line x1="2115" y1="1140" x2="2175" y2="1140" class="fine"/>
<rect x="2210" y="1100" width="70" height="50" class="fur"/>
<text x="2115" y="1265" class="sub">6/05</text>
<rect x="2100" y="1380" width="200" height="200" class="rm"/>
<line x1="2210" y1="1380" x2="2290" y2="1380" class="gap"/>
<path d="M2210 1380L2210 1460A80 80 0 0 0 2290 1380" class="swing"/>
<rect x="2115" y="1435" width="60" height="130" class="fur"/>
<line x1="2115" y1="1480" x2="2175" y2="1480" class="fine"/>
<rect x="2210" y="1500" width="70" height="50" class="fur"/>
<text x="2115" y="1420" class="sub">6/06</text>
<rect x="2300" y="1080" width="200" height="200" class="rm"/>
<line x1="2410" y1="1280" x2="2490" y2="1280" class="gap"/>
<path d="M2410 1280L2410 1200A80 80 0 0 1 2490 1280" class="swing"/>
<rect x="2315" y="1095" width="60" height="130" class="fur"/>
<line x1="2315" y1="1140" x2="2375" y2="1140" class="fine"/>
<rect x="2410" y="1100" width="70" height="50" class="fur"/>
<text x="2315" y="1265" class="sub">6/03</text>
<rect x="2300" y="1380" width="200" height="200" class="rm"/>
<line x1="2410" y1="1380" x2="2490" y2="1380" class="gap"/>
<path d="M2410 1380L2410 1460A80 80 0 0 0 2490 1380" class="swing"/>
<rect x="2315" y="1435" width="60" height="130" class="fur"/>
<line x1="2315" y1="1480" x2="2375" y2="1480" class="fine"/>
<rect x="2410" y="1500" width="70" height="50" class="fur"/>
<text x="2315" y="1420" class="sub">6/04</text>
<rect x="2500" y="1080" width="200" height="200" class="rm"/>
<line x1="2610" y1="1280" x2="2690" y2="1280" class="gap"/>
<path d="M2610 1280L2610 1200A80 80 0 0 1 2690 1280" class="swing"/>
<rect x="2520" y="1100" width="80" height="80" class="fur"/>
<text x="2560" y="1144.2" class="fl" font-size="12">TAP</text>
<rect x="2500" y="1380" width="200" height="200" class="rm"/>
<line x1="2610" y1="1380" x2="2690" y2="1380" class="gap"/>
<path d="M2610 1380L2610 1460A80 80 0 0 0 2690 1380" class="swing"/>
<rect x="2515" y="1435" width="60" height="130" class="fur"/>
<line x1="2515" y1="1480" x2="2575" y2="1480" class="fine"/>
<rect x="2610" y="1500" width="70" height="50" class="fur"/>
<text x="2515" y="1420" class="sub">6/02</text>
<line x1="2700" y1="810" x2="2785" y2="810" class="arw" marker-end="url(#ah)"/>
<text x="2420" y="835" class="sub exit">No.3 ROAD · SHEET 7 →</text>
<line x1="90" y1="810" x2="15" y2="810" class="arw" marker-end="url(#ah)"/>
<text x="340" y="835" class="sub exit">← SHEET 12</text>
<text x="1600" y="325" class="pen" transform="rotate(-1 1600 325)">lined by residents from 1979 · see housing list</text>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 11 OF 13 · PIT GALLERIES</text>
<text x="1924" y="1815" class="ttl">THE ESTATE · SOUTH</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/11 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

+149
View File
@@ -0,0 +1,149 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — LOBBY &amp; ENQUIRIES. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="100" y="600" width="400" height="600" class="rm"/>
<text x="130" y="675" class="lbl">BLAST LOCK</text>
<text x="130" y="713" class="sub">outer lock</text>
<rect x="78" y="800" width="44" height="200" class="blast"/>
<path d="M78 820l44 -20M78 840l44 -20M78 860l44 -20M78 880l44 -20M78 900l44 -20M78 920l44 -20M78 940l44 -20M78 960l44 -20M78 980l44 -20M78 1000l44 -20" class="fine"/>
<circle cx="310" cy="960" r="100" fill="none" stroke="#ffe98a" stroke-width="4" stroke-dasharray="14 10"/>
<text x="150" y="1150" class="pen" transform="rotate(-3 150 1150)">air goes wrong here</text>
<text x="20" y="760" class="sub">ADIT</text>
<rect x="500" y="600" width="400" height="600" class="rm"/>
<text x="530" y="675" class="lbl">DECONTAM.</text>
<text x="530" y="713" class="sub">showers · lockers</text>
<circle cx="670" cy="840" r="30" class="fur"/>
<circle cx="670" cy="960" r="30" class="fur"/>
<circle cx="670" cy="1080" r="30" class="fur"/>
<rect x="790" y="740" width="80" height="420" class="fur"/>
<path d="M790 765H870M790 790H870M790 815H870M790 840H870M790 865H870M790 890H870M790 915H870M790 940H870M790 965H870M790 990H870M790 1015H870M790 1040H870M790 1065H870M790 1090H870M790 1115H870M790 1140H870" class="fine"/>
<rect x="900" y="300" width="1000" height="1200" class="rm"/>
<text x="930" y="375" class="lbl">LOBBY</text>
<text x="930" y="413" class="sub">public waiting</text>
<circle cx="1855" cy="345" r="30" class="numc"/><text x="1855" y="358" class="num">6</text>
<rect x="1420" y="500" width="380" height="80" class="fur"/>
<text x="1610" y="547" class="fl" font-size="20">ENQUIRIES COUNTER</text>
<rect x="1720" y="580" width="80" height="240" class="fur"/>
<rect x="1000" y="840" width="290" height="40" class="fur"/>
<rect x="1020" y="895" width="34" height="34" rx="6" class="fur"/>
<rect x="1120" y="895" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="895" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="1040" width="290" height="40" class="fur"/>
<rect x="1020" y="1095" width="34" height="34" rx="6" class="fur"/>
<rect x="1120" y="1095" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="1095" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="1240" width="290" height="40" class="fur"/>
<rect x="1020" y="1295" width="34" height="34" rx="6" class="fur"/>
<rect x="1120" y="1295" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="1295" width="34" height="34" rx="6" class="fur"/>
<rect x="1400" y="1440" width="360" height="35" class="fur"/>
<text x="1580" y="1462.4" class="fl" font-size="14">NOTICEBOARD</text>
<text x="1360" y="1390" class="pen" transform="rotate(-1 1360 1390)">housing list — see Mr Ogden</text>
<rect x="1900" y="300" width="450" height="450" class="rm"/>
<text x="1930" y="375" class="lbl">ENQUIRIES</text>
<text x="1930" y="413" class="sub">Mr Ogden</text>
<rect x="2020" y="490" width="200" height="100" class="fur"/>
<text x="2120" y="547" class="fl" font-size="20">DESK</text>
<rect x="2100" y="610" width="34" height="34" rx="6" class="fur"/>
<rect x="2270" y="390" width="60" height="240" class="fur"/>
<path d="M2270 415H2330M2270 440H2330M2270 465H2330M2270 490H2330M2270 515H2330M2270 540H2330M2270 565H2330M2270 590H2330M2270 615H2330" class="fine"/>
<circle cx="2290" cy="700" r="25" class="fur"/>
<text x="2290" y="707" class="fl" font-size="18">☎</text>
<rect x="1900" y="750" width="450" height="400" class="rm"/>
<text x="1930" y="825" class="lbl">INTERVIEW</text>
<text x="1930" y="863" class="sub">does not lock</text>
<rect x="2020" y="930" width="220" height="110" class="fur"/>
<text x="2130" y="992" class="fl" font-size="20">TABLE</text>
<rect x="2040" y="885" width="34" height="34" rx="6" class="fur"/>
<rect x="2170" y="885" width="34" height="34" rx="6" class="fur"/>
<rect x="2040" y="1050" width="34" height="34" rx="6" class="fur"/>
<rect x="2170" y="1050" width="34" height="34" rx="6" class="fur"/>
<rect x="2350" y="300" width="400" height="450" class="rm"/>
<text x="2380" y="375" class="lbl">ARMOURY</text>
<rect x="2380" y="500" width="340" height="60" class="fur"/>
<path d="M2405 500V560M2430 500V560M2455 500V560M2480 500V560M2505 500V560M2530 500V560M2555 500V560M2580 500V560M2605 500V560M2630 500V560M2655 500V560M2680 500V560M2705 500V560" class="fine"/>
<text x="2380" y="610" class="sub">arms rack</text>
<text x="2380" y="710" class="pen" transform="rotate(-2 2380 710)">key: Controller</text>
<rect x="2350" y="750" width="400" height="400" class="rm"/>
<text x="2380" y="825" class="lbl">WARDENS'</text>
<text x="2380" y="863" class="sub">post</text>
<rect x="2400" y="1020" width="240" height="50" class="fur"/>
<path d="M2425 1020V1070M2450 1020V1070M2475 1020V1070M2500 1020V1070M2525 1020V1070M2550 1020V1070M2575 1020V1070M2600 1020V1070M2625 1020V1070" class="fine"/>
<text x="2400" y="1115" class="sub">truncheons</text>
<rect x="1900" y="1150" width="850" height="300" class="rm2"/>
<text x="1940" y="1340" class="lbl">MAIN CORRIDOR</text>
<line x1="2700" y1="1240" x2="2785" y2="1240" class="arw" marker-end="url(#ah)"/>
<text x="1920" y="1505" class="sub exit">CONTROL, REGISTRY, SICK BAY · SHEETS 2–4 →</text>
<line x1="500" y1="860" x2="500" y2="960" class="gap"/>
<path d="M500 860L600 860A100 100 0 0 1 500 960" class="swing"/>
<line x1="900" y1="860" x2="900" y2="960" class="gap"/>
<path d="M900 860L1000 860A100 100 0 0 1 900 960" class="swing"/>
<line x1="1900" y1="430" x2="1900" y2="530" class="gap"/>
<path d="M1900 430L1800 430A100 100 0 0 0 1900 530" class="swing"/>
<line x1="1900" y1="890" x2="1900" y2="990" class="gap"/>
<path d="M1900 890L1800 890A100 100 0 0 0 1900 990" class="swing"/>
<line x1="2660" y1="750" x2="2740" y2="750" class="gap"/>
<path d="M2660 750L2660 670A80 80 0 0 1 2740 750" class="swing"/>
<line x1="2350" y1="850" x2="2350" y2="930" class="gap"/>
<path d="M2350 850L2270 850A80 80 0 0 0 2350 930" class="swing"/>
<line x1="2440" y1="1150" x2="2540" y2="1150" class="gap"/>
<path d="M2440 1150L2440 1250A100 100 0 0 0 2540 1150" class="swing"/>
<line x1="1900" y1="1200" x2="1900" y2="1400" class="gap2"/>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 1 OF 13 · LEVEL 1 · ENTRY</text>
<text x="1924" y="1815" class="ttl">LOBBY &amp; ENQUIRIES</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/01 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

+137
View File
@@ -0,0 +1,137 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — PIPE ROOM &amp; PLANT. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="100" width="2700" height="300" class="rm2"/>
<text x="1150" y="230" class="lbl">LOWER CORRIDOR</text>
<line x1="2700" y1="340" x2="2785" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="2548.2" y="60" class="sub exit">CRECHE · SHEET 5 →</text>
<line x1="100" y1="340" x2="15" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="20" y="60" class="sub exit">← DORMITORIES &amp; CANTEEN · SHEETS 9–10</text>
<rect x="50" y="400" width="1950" height="700" class="rm"/>
<text x="80" y="475" class="lbl">PLANT FLOOR</text>
<circle cx="1955" cy="445" r="30" class="numc"/><text x="1955" y="458" class="num">12</text>
<rect x="1560" y="560" width="340" height="260" class="fur"/>
<text x="1730" y="697" class="fl" font-size="20">COAL BOILER</text>
<rect x="1220" y="560" width="240" height="200" class="fur"/>
<text x="1340" y="667" class="fl" font-size="20">GEN 1</text>
<rect x="920" y="560" width="240" height="200" class="fur"/>
<text x="1040" y="667" class="fl" font-size="20">GEN 2</text>
<rect x="140" y="540" width="680" height="60" class="fur"/>
<text x="480" y="577" class="fl" font-size="20">DUCTING</text>
<rect x="540" y="720" width="240" height="160" class="fur"/>
<text x="660" y="807" class="fl" font-size="20">PUMPS</text>
<rect x="220" y="720" width="240" height="160" class="fur"/>
<text x="340" y="807" class="fl" font-size="20">FILTERS</text>
<text x="920" y="930" class="pen" transform="rotate(-2 920 930)">coal up from No.2 road</text>
<rect x="2000" y="400" width="750" height="600" class="rm"/>
<text x="2030" y="475" class="lbl">PIPE ROOM</text>
<text x="2030" y="513" class="sub">Centre's in-tray</text>
<circle cx="2705" cy="445" r="30" class="numc"/><text x="2705" y="458" class="num">11</text>
<circle cx="2380" cy="690" r="55" class="fur"/>
<text x="2380" y="697" class="fl" font-size="18">PIPE</text>
<text x="2030" y="820" class="sub">4" pneumatic from moor ↑</text>
<rect x="2540" y="630" width="160" height="140" class="fur"/>
<text x="2620" y="705.25" class="fl" font-size="15">IN-TRAY</text>
<rect x="2040" y="910" width="400" height="50" class="fur"/>
<path d="M2065 910V960M2090 910V960M2115 910V960M2140 910V960M2165 910V960M2190 910V960M2215 910V960M2240 910V960M2265 910V960M2290 910V960M2315 910V960M2340 910V960M2365 910V960M2390 910V960M2415 910V960" class="fine"/>
<text x="2320" y="570" class="pen" transform="rotate(-2 2320 570)">every 90 days</text>
<rect x="2000" y="1000" width="750" height="500" class="rm"/>
<text x="2030" y="1075" class="lbl">STORES</text>
<text x="2030" y="1113" class="sub">issue counter</text>
<rect x="2040" y="1190" width="440" height="60" class="fur"/>
<text x="2260" y="1227" class="fl" font-size="20">COUNTER</text>
<rect x="2040" y="1360" width="620" height="60" class="fur"/>
<path d="M2065 1360V1420M2090 1360V1420M2115 1360V1420M2140 1360V1420M2165 1360V1420M2190 1360V1420M2215 1360V1420M2240 1360V1420M2265 1360V1420M2290 1360V1420M2315 1360V1420M2340 1360V1420M2365 1360V1420M2390 1360V1420M2415 1360V1420M2440 1360V1420M2465 1360V1420M2490 1360V1420M2515 1360V1420M2540 1360V1420M2565 1360V1420M2590 1360V1420M2615 1360V1420M2640 1360V1420" class="fine"/>
<rect x="2650" y="1050" width="70" height="260" class="fur"/>
<path d="M2650 1075H2720M2650 1100H2720M2650 1125H2720M2650 1150H2720M2650 1175H2720M2650 1200H2720M2650 1225H2720M2650 1250H2720M2650 1275H2720M2650 1300H2720" class="fine"/>
<rect x="50" y="1100" width="300" height="400" class="rm2"/>
<path d="M50 1130H350M50 1160H350M50 1190H350M50 1220H350M50 1250H350M50 1280H350M50 1310H350M50 1340H350M50 1370H350M50 1400H350M50 1430H350M50 1460H350M50 1490H350" class="fine"/>
<rect x="148" y="1282" width="104" height="30" fill="#11417d"/>
<text x="200" y="1305" class="fl" font-size="19">INCLINE</text>
<text x="40" y="1560" class="sub">↓ PIT GALLERIES · SHEET 7</text>
<rect x="350" y="1100" width="500" height="400" class="rm"/>
<text x="380" y="1175" class="lbl">COAL HOPPER</text>
<rect x="430" y="1240" width="340" height="200" class="fur"/>
<text x="600" y="1347" class="fl" font-size="20">HOPPER</text>
<rect x="850" y="1100" width="1150" height="450" class="rm"/>
<text x="880" y="1175" class="lbl">TRANSMITTER</text>
<text x="880" y="1213" class="sub">feed to mast</text>
<rect x="950" y="1290" width="500" height="90" class="fur"/>
<path d="M975 1290V1380M1000 1290V1380M1025 1290V1380M1050 1290V1380M1075 1290V1380M1100 1290V1380M1125 1290V1380M1150 1290V1380M1175 1290V1380M1200 1290V1380M1225 1290V1380M1250 1290V1380M1275 1290V1380M1300 1290V1380M1325 1290V1380M1350 1290V1380M1375 1290V1380M1400 1290V1380M1425 1290V1380" class="fine"/>
<text x="950" y="1430" class="sub">valve racks</text>
<rect x="1540" y="1230" width="220" height="140" class="fur"/>
<text x="1650" y="1307" class="fl" font-size="20">PANEL</text>
<line x1="1920" y1="1340" x2="1920" y2="1140" class="arw" marker-end="url(#ah)"/>
<text x="1560" y="1520" class="sub">MAST CABLE ↑ MOOR</text>
<line x1="340" y1="400" x2="440" y2="400" class="gap"/>
<path d="M340 400L340 300A100 100 0 0 1 440 400" class="swing"/>
<line x1="1460" y1="400" x2="1560" y2="400" class="gap"/>
<path d="M1460 400L1460 300A100 100 0 0 1 1560 400" class="swing"/>
<line x1="2460" y1="400" x2="2560" y2="400" class="gap"/>
<path d="M2460 400L2460 300A100 100 0 0 1 2560 400" class="swing"/>
<line x1="2000" y1="860" x2="2000" y2="960" class="gap"/>
<path d="M2000 860L1900 860A100 100 0 0 0 2000 960" class="swing"/>
<line x1="2340" y1="1000" x2="2440" y2="1000" class="gap"/>
<path d="M2340 1000L2340 1100A100 100 0 0 0 2440 1000" class="swing"/>
<line x1="100" y1="1100" x2="300" y2="1100" class="gap"/>
<line x1="450" y1="1100" x2="750" y2="1100" class="gap"/>
<line x1="1790" y1="1100" x2="1890" y2="1100" class="gap"/>
<path d="M1790 1100L1790 1200A100 100 0 0 0 1890 1100" class="swing"/>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 6 OF 13 · LEVEL 2 · SERVICES</text>
<text x="1924" y="1815" class="ttl">PIPE ROOM &amp; PLANT</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/06 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

+132
View File
@@ -0,0 +1,132 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — REGISTRY. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="100" width="2700" height="300" class="rm2"/>
<text x="1150" y="230" class="lbl">MAIN CORRIDOR</text>
<line x1="100" y1="340" x2="15" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="20" y="60" class="sub exit">← CONTROL ROOM · SHEET 2</text>
<line x1="2700" y1="340" x2="2785" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="2523" y="60" class="sub exit">SICK BAY · SHEET 4 →</text>
<rect x="100" y="400" width="900" height="700" class="rm"/>
<text x="130" y="475" class="lbl">PUBLIC COUNTER</text>
<circle cx="955" cy="445" r="30" class="numc"/><text x="955" y="458" class="num">8</text>
<rect x="100" y="740" width="740" height="70" class="fur"/>
<text x="470" y="782" class="fl" font-size="20">COUNTER</text>
<text x="850" y="790" class="sub">flap</text>
<rect x="160" y="590" width="34" height="34" rx="6" class="fur"/>
<rect x="300" y="590" width="34" height="34" rx="6" class="fur"/>
<rect x="440" y="590" width="34" height="34" rx="6" class="fur"/>
<rect x="560" y="590" width="200" height="45" class="fur"/>
<text x="660" y="617.05" class="fl" font-size="13">TAKE A NUMBER</text>
<text x="140" y="1060" class="pen" transform="rotate(-2 140 1060)">complaints: allow 11 weeks</text>
<rect x="1000" y="400" width="1200" height="1100" class="rm"/>
<text x="1030" y="475" class="lbl">RECORDS</text>
<rect x="1100" y="560" width="60" height="760" class="fur"/>
<path d="M1100 585H1160M1100 610H1160M1100 635H1160M1100 660H1160M1100 685H1160M1100 710H1160M1100 735H1160M1100 760H1160M1100 785H1160M1100 810H1160M1100 835H1160M1100 860H1160M1100 885H1160M1100 910H1160M1100 935H1160M1100 960H1160M1100 985H1160M1100 1010H1160M1100 1035H1160M1100 1060H1160M1100 1085H1160M1100 1110H1160M1100 1135H1160M1100 1160H1160M1100 1185H1160M1100 1210H1160M1100 1235H1160M1100 1260H1160M1100 1285H1160M1100 1310H1160" class="fine"/>
<rect x="1250" y="560" width="60" height="760" class="fur"/>
<path d="M1250 585H1310M1250 610H1310M1250 635H1310M1250 660H1310M1250 685H1310M1250 710H1310M1250 735H1310M1250 760H1310M1250 785H1310M1250 810H1310M1250 835H1310M1250 860H1310M1250 885H1310M1250 910H1310M1250 935H1310M1250 960H1310M1250 985H1310M1250 1010H1310M1250 1035H1310M1250 1060H1310M1250 1085H1310M1250 1110H1310M1250 1135H1310M1250 1160H1310M1250 1185H1310M1250 1210H1310M1250 1235H1310M1250 1260H1310M1250 1285H1310M1250 1310H1310" class="fine"/>
<rect x="1400" y="560" width="60" height="760" class="fur"/>
<path d="M1400 585H1460M1400 610H1460M1400 635H1460M1400 660H1460M1400 685H1460M1400 710H1460M1400 735H1460M1400 760H1460M1400 785H1460M1400 810H1460M1400 835H1460M1400 860H1460M1400 885H1460M1400 910H1460M1400 935H1460M1400 960H1460M1400 985H1460M1400 1010H1460M1400 1035H1460M1400 1060H1460M1400 1085H1460M1400 1110H1460M1400 1135H1460M1400 1160H1460M1400 1185H1460M1400 1210H1460M1400 1235H1460M1400 1260H1460M1400 1285H1460M1400 1310H1460" class="fine"/>
<rect x="1550" y="560" width="60" height="760" class="fur"/>
<path d="M1550 585H1610M1550 610H1610M1550 635H1610M1550 660H1610M1550 685H1610M1550 710H1610M1550 735H1610M1550 760H1610M1550 785H1610M1550 810H1610M1550 835H1610M1550 860H1610M1550 885H1610M1550 910H1610M1550 935H1610M1550 960H1610M1550 985H1610M1550 1010H1610M1550 1035H1610M1550 1060H1610M1550 1085H1610M1550 1110H1610M1550 1135H1610M1550 1160H1610M1550 1185H1610M1550 1210H1610M1550 1235H1610M1550 1260H1610M1550 1285H1610M1550 1310H1610" class="fine"/>
<rect x="1700" y="560" width="60" height="760" class="fur"/>
<path d="M1700 585H1760M1700 610H1760M1700 635H1760M1700 660H1760M1700 685H1760M1700 710H1760M1700 735H1760M1700 760H1760M1700 785H1760M1700 810H1760M1700 835H1760M1700 860H1760M1700 885H1760M1700 910H1760M1700 935H1760M1700 960H1760M1700 985H1760M1700 1010H1760M1700 1035H1760M1700 1060H1760M1700 1085H1760M1700 1110H1760M1700 1135H1760M1700 1160H1760M1700 1185H1760M1700 1210H1760M1700 1235H1760M1700 1260H1760M1700 1285H1760M1700 1310H1760" class="fine"/>
<rect x="1850" y="560" width="60" height="760" class="fur"/>
<path d="M1850 585H1910M1850 610H1910M1850 635H1910M1850 660H1910M1850 685H1910M1850 710H1910M1850 735H1910M1850 760H1910M1850 785H1910M1850 810H1910M1850 835H1910M1850 860H1910M1850 885H1910M1850 910H1910M1850 935H1910M1850 960H1910M1850 985H1910M1850 1010H1910M1850 1035H1910M1850 1060H1910M1850 1085H1910M1850 1110H1910M1850 1135H1910M1850 1160H1910M1850 1185H1910M1850 1210H1910M1850 1235H1910M1850 1260H1910M1850 1285H1910M1850 1310H1910" class="fine"/>
<rect x="2000" y="560" width="60" height="760" class="fur"/>
<path d="M2000 585H2060M2000 610H2060M2000 635H2060M2000 660H2060M2000 685H2060M2000 710H2060M2000 735H2060M2000 760H2060M2000 785H2060M2000 810H2060M2000 835H2060M2000 860H2060M2000 885H2060M2000 910H2060M2000 935H2060M2000 960H2060M2000 985H2060M2000 1010H2060M2000 1035H2060M2000 1060H2060M2000 1085H2060M2000 1110H2060M2000 1135H2060M2000 1160H2060M2000 1185H2060M2000 1210H2060M2000 1235H2060M2000 1260H2060M2000 1285H2060M2000 1310H2060" class="fine"/>
<text x="1040" y="1450" class="sub">BIRTHS · DEATHS · HOUSING · RATIONS · 1974–</text>
<rect x="2200" y="400" width="550" height="500" class="rm"/>
<text x="2230" y="475" class="lbl">REGISTRAR</text>
<text x="2230" y="513" class="sub">A. Pennyfeather</text>
<rect x="2320" y="580" width="220" height="100" class="fur"/>
<text x="2430" y="637" class="fl" font-size="20">DESK</text>
<rect x="2410" y="710" width="34" height="34" rx="6" class="fur"/>
<rect x="2200" y="900" width="550" height="600" class="rm"/>
<text x="2230" y="975" class="lbl">STRONGROOM</text>
<text x="2230" y="1013" class="sub">standing orders</text>
<rect x="2630" y="1010" width="80" height="80" class="fur"/>
<path d="M2630 1010l80 80M2710 1010l-80 80" class="fine"/>
<text x="2670" y="1120" class="fl" font-size="16">SAFE</text>
<rect x="2250" y="1140" width="350" height="70" class="fur"/>
<path d="M2275 1140V1210M2300 1140V1210M2325 1140V1210M2350 1140V1210M2375 1140V1210M2400 1140V1210M2425 1140V1210M2450 1140V1210M2475 1140V1210M2500 1140V1210M2525 1140V1210M2550 1140V1210M2575 1140V1210" class="fine"/>
<rect x="2250" y="1340" width="350" height="70" class="fur"/>
<path d="M2275 1340V1410M2300 1340V1410M2325 1340V1410M2350 1340V1410M2375 1340V1410M2400 1340V1410M2425 1340V1410M2450 1340V1410M2475 1340V1410M2500 1340V1410M2525 1340V1410M2550 1340V1410M2575 1340V1410" class="fine"/>
<rect x="100" y="1100" width="900" height="400" class="rm"/>
<text x="130" y="1175" class="lbl">TYPING POOL</text>
<rect x="140" y="1230" width="180" height="80" class="fur"/>
<rect x="210" y="1340" width="34" height="34" rx="6" class="fur"/>
<rect x="410" y="1230" width="180" height="80" class="fur"/>
<rect x="480" y="1340" width="34" height="34" rx="6" class="fur"/>
<rect x="680" y="1230" width="180" height="80" class="fur"/>
<rect x="750" y="1340" width="34" height="34" rx="6" class="fur"/>
<line x1="320" y1="400" x2="420" y2="400" class="gap"/>
<path d="M320 400L320 300A100 100 0 0 1 420 400" class="swing"/>
<line x1="2420" y1="400" x2="2520" y2="400" class="gap"/>
<path d="M2420 400L2420 300A100 100 0 0 1 2520 400" class="swing"/>
<line x1="1000" y1="930" x2="1000" y2="1030" class="gap"/>
<path d="M1000 930L900 930A100 100 0 0 0 1000 1030" class="swing"/>
<line x1="2200" y1="800" x2="2200" y2="890" class="gap"/>
<path d="M2200 800L2110 800A90 90 0 0 0 2200 890" class="swing"/>
<line x1="2630" y1="900" x2="2720" y2="900" class="gap"/>
<path d="M2630 900L2630 810A90 90 0 0 1 2720 900" class="swing"/>
<line x1="620" y1="1100" x2="720" y2="1100" class="gap"/>
<path d="M620 1100L620 1000A100 100 0 0 1 720 1100" class="swing"/>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 3 OF 13 · LEVEL 1 · GOVERNMENT</text>
<text x="1924" y="1815" class="ttl">REGISTRY</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/03 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

+187
View File
@@ -0,0 +1,187 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — SICK BAY. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="100" width="2400" height="300" class="rm2"/>
<text x="1150" y="230" class="lbl">MAIN CORRIDOR</text>
<line x1="100" y1="340" x2="15" y2="340" class="arw" marker-end="url(#ah)"/>
<text x="20" y="60" class="sub exit">← REGISTRY · SHEET 3</text>
<rect x="2450" y="100" width="300" height="300" class="rm2"/>
<path d="M2450 130H2750M2450 160H2750M2450 190H2750M2450 220H2750M2450 250H2750M2450 280H2750M2450 310H2750M2450 340H2750M2450 370H2750" class="fine"/>
<rect x="2566" y="232" width="68" height="30" fill="#11417d"/>
<text x="2600" y="255" class="fl" font-size="19">DOWN</text>
<text x="1960" y="60" class="sub">DOWN TO LEVEL 2 · SHEET 5</text>
<line x1="2450" y1="150" x2="2450" y2="350" class="gap2"/>
<rect x="100" y="400" width="600" height="500" class="rm"/>
<text x="130" y="475" class="lbl">RECEPTION</text>
<circle cx="655" cy="445" r="30" class="numc"/><text x="655" y="458" class="num">9</text>
<rect x="160" y="570" width="300" height="70" class="fur"/>
<text x="310" y="612" class="fl" font-size="20">DESK</text>
<rect x="160" y="720" width="34" height="34" rx="6" class="fur"/>
<rect x="260" y="720" width="34" height="34" rx="6" class="fur"/>
<rect x="360" y="720" width="34" height="34" rx="6" class="fur"/>
<rect x="460" y="720" width="34" height="34" rx="6" class="fur"/>
<rect x="700" y="400" width="1200" height="600" class="rm"/>
<text x="730" y="475" class="lbl">GENERAL WARD</text>
<text x="730" y="513" class="sub">eighteen beds</text>
<rect x="760" y="530" width="90" height="200" class="fur"/>
<line x1="760" y1="575" x2="850" y2="575" class="fine"/>
<rect x="760" y="790" width="90" height="190" class="fur"/>
<line x1="760" y1="835" x2="850" y2="835" class="fine"/>
<rect x="870" y="530" width="90" height="200" class="fur"/>
<line x1="870" y1="575" x2="960" y2="575" class="fine"/>
<rect x="870" y="790" width="90" height="190" class="fur"/>
<line x1="870" y1="835" x2="960" y2="835" class="fine"/>
<rect x="980" y="530" width="90" height="200" class="fur"/>
<line x1="980" y1="575" x2="1070" y2="575" class="fine"/>
<rect x="980" y="790" width="90" height="190" class="fur"/>
<line x1="980" y1="835" x2="1070" y2="835" class="fine"/>
<rect x="1090" y="530" width="90" height="200" class="fur"/>
<line x1="1090" y1="575" x2="1180" y2="575" class="fine"/>
<rect x="1090" y="790" width="90" height="190" class="fur"/>
<line x1="1090" y1="835" x2="1180" y2="835" class="fine"/>
<rect x="1200" y="530" width="90" height="200" class="fur"/>
<line x1="1200" y1="575" x2="1290" y2="575" class="fine"/>
<rect x="1200" y="790" width="90" height="190" class="fur"/>
<line x1="1200" y1="835" x2="1290" y2="835" class="fine"/>
<rect x="1310" y="530" width="90" height="200" class="fur"/>
<line x1="1310" y1="575" x2="1400" y2="575" class="fine"/>
<rect x="1310" y="790" width="90" height="190" class="fur"/>
<line x1="1310" y1="835" x2="1400" y2="835" class="fine"/>
<rect x="1420" y="530" width="90" height="200" class="fur"/>
<line x1="1420" y1="575" x2="1510" y2="575" class="fine"/>
<rect x="1420" y="790" width="90" height="190" class="fur"/>
<line x1="1420" y1="835" x2="1510" y2="835" class="fine"/>
<rect x="1530" y="530" width="90" height="200" class="fur"/>
<line x1="1530" y1="575" x2="1620" y2="575" class="fine"/>
<rect x="1530" y="790" width="90" height="190" class="fur"/>
<line x1="1530" y1="835" x2="1620" y2="835" class="fine"/>
<rect x="1640" y="530" width="90" height="200" class="fur"/>
<line x1="1640" y1="575" x2="1730" y2="575" class="fine"/>
<rect x="1640" y="790" width="90" height="190" class="fur"/>
<line x1="1640" y1="835" x2="1730" y2="835" class="fine"/>
<rect x="1900" y="400" width="400" height="300" class="rm"/>
<text x="1930" y="475" class="lbl">SIDE ROOM</text>
<text x="1930" y="513" class="sub">Mrs Marlow</text>
<rect x="2190" y="420" width="90" height="180" class="fur"/>
<line x1="2190" y1="465" x2="2280" y2="465" class="fine"/>
<rect x="2090" y="540" width="34" height="34" rx="6" class="fur"/>
<rect x="1930" y="630" width="140" height="50" class="fur"/>
<path d="M1955 630V680M1980 630V680M2005 630V680M2030 630V680M2055 630V680" class="fine"/>
<rect x="2300" y="400" width="450" height="300" class="rm"/>
<text x="2330" y="475" class="lbl">DISPENSARY</text>
<rect x="2330" y="510" width="390" height="55" class="fur"/>
<path d="M2355 510V565M2380 510V565M2405 510V565M2430 510V565M2455 510V565M2480 510V565M2505 510V565M2530 510V565M2555 510V565M2580 510V565M2605 510V565M2630 510V565M2655 510V565M2680 510V565M2705 510V565" class="fine"/>
<rect x="1900" y="700" width="850" height="300" class="rm"/>
<text x="1930" y="775" class="lbl">MEDICAL OFFICER</text>
<text x="1930" y="813" class="sub">Dr Larkhall</text>
<rect x="2320" y="820" width="200" height="100" class="fur"/>
<text x="2420" y="877" class="fl" font-size="20">DESK</text>
<rect x="2660" y="730" width="60" height="240" class="fur"/>
<path d="M2660 755H2720M2660 780H2720M2660 805H2720M2660 830H2720M2660 855H2720M2660 880H2720M2660 905H2720M2660 930H2720M2660 955H2720" class="fine"/>
<rect x="2390" y="930" width="34" height="34" rx="6" class="fur"/>
<rect x="700" y="1000" width="700" height="500" class="rm"/>
<text x="730" y="1075" class="lbl">DELIVERY</text>
<text x="730" y="1113" class="sub">maternity</text>
<rect x="1000" y="1180" width="220" height="100" class="fur"/>
<line x1="1045" y1="1180" x2="1045" y2="1280" class="fine"/>
<circle cx="1290" cy="1240" r="35" class="fur"/>
<text x="1290" y="1247" class="fl" font-size="18">COT</text>
<text x="740" y="1460" class="pen" transform="rotate(-2 740 1460)">Cotter — due Thurs</text>
<rect x="1400" y="1000" width="600" height="500" class="rm"/>
<text x="1430" y="1075" class="lbl">THEATRE</text>
<rect x="1580" y="1160" width="240" height="100" class="fur"/>
<text x="1700" y="1217" class="fl" font-size="20">TABLE</text>
<circle cx="1890" cy="1120" r="40" class="fur"/>
<rect x="1430" y="1400" width="300" height="60" class="fur"/>
<path d="M1455 1400V1460M1480 1400V1460M1505 1400V1460M1530 1400V1460M1555 1400V1460M1580 1400V1460M1605 1400V1460M1630 1400V1460M1655 1400V1460M1680 1400V1460M1705 1400V1460" class="fine"/>
<rect x="100" y="900" width="600" height="600" class="rm"/>
<text x="130" y="975" class="lbl">ISOLATION</text>
<rect x="100" y="1100" width="300" height="400" class="rm"/>
<rect x="400" y="1100" width="300" height="400" class="rm"/>
<rect x="180" y="1260" width="90" height="200" class="fur"/>
<line x1="180" y1="1305" x2="270" y2="1305" class="fine"/>
<rect x="480" y="1260" width="90" height="200" class="fur"/>
<line x1="480" y1="1305" x2="570" y2="1305" class="fine"/>
<text x="440" y="1060" class="pen" transform="rotate(-1 440 1060)">unused since '78</text>
<line x1="350" y1="400" x2="450" y2="400" class="gap"/>
<path d="M350 400L350 300A100 100 0 0 1 450 400" class="swing"/>
<line x1="2340" y1="400" x2="2430" y2="400" class="gap"/>
<path d="M2340 400L2340 310A90 90 0 0 1 2430 400" class="swing"/>
<line x1="700" y1="600" x2="700" y2="700" class="gap"/>
<path d="M700 600L600 600A100 100 0 0 0 700 700" class="swing"/>
<line x1="1900" y1="500" x2="1900" y2="600" class="gap"/>
<path d="M1900 500L1800 500A100 100 0 0 0 1900 600" class="swing"/>
<line x1="1900" y1="820" x2="1900" y2="920" class="gap"/>
<path d="M1900 820L1800 820A100 100 0 0 0 1900 920" class="swing"/>
<line x1="1000" y1="1000" x2="1100" y2="1000" class="gap"/>
<path d="M1000 1000L1000 1100A100 100 0 0 0 1100 1000" class="swing"/>
<line x1="1620" y1="1000" x2="1720" y2="1000" class="gap"/>
<path d="M1620 1000L1620 1100A100 100 0 0 0 1720 1000" class="swing"/>
<line x1="320" y1="900" x2="420" y2="900" class="gap"/>
<path d="M320 900L320 800A100 100 0 0 1 420 900" class="swing"/>
<line x1="250" y1="1100" x2="330" y2="1100" class="gap"/>
<path d="M250 1100L250 1180A80 80 0 0 0 330 1100" class="swing"/>
<line x1="520" y1="1100" x2="600" y2="1100" class="gap"/>
<path d="M520 1100L520 1180A80 80 0 0 0 600 1100" class="swing"/>
<line x1="2120" y1="700" x2="2200" y2="700" class="gap"/>
<path d="M2120 700L2120 620A80 80 0 0 1 2200 700" class="swing"/>
<line x1="2580" y1="700" x2="2660" y2="700" class="gap"/>
<path d="M2580 700L2580 620A80 80 0 0 1 2660 700" class="swing"/>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 4 OF 13 · LEVEL 1 · WELFARE</text>
<text x="1924" y="1815" class="ttl">SICK BAY</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/04 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

+178
View File
@@ -0,0 +1,178 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — COAL ROADS &amp; SUMP. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="150" width="300" height="300" class="rm2"/>
<path d="M50 180H350M50 210H350M50 240H350M50 270H350M50 300H350M50 330H350M50 360H350M50 390H350M50 420H350" class="fine"/>
<rect x="148" y="282" width="104" height="30" fill="#11417d"/>
<text x="200" y="305" class="fl" font-size="19">INCLINE</text>
<text x="30" y="120" class="sub">↑ PLANT FLOOR · SHEET 6</text>
<rect x="350" y="150" width="2400" height="300" class="rock"/>
<text x="370" y="225" class="lbl">No.2 COAL ROAD</text>
<text x="370" y="263" class="sub">growing beds under lamps</text>
<circle cx="2705" cy="195" r="30" class="numc"/><text x="2705" y="208" class="num">14</text>
<line x1="350" y1="200" x2="350" y2="400" class="rgap"/>
<rect x="880" y="180" width="190" height="55" class="fur"/>
<path d="M905 180V235M930 180V235M955 180V235M980 180V235M1005 180V235M1030 180V235M1055 180V235" class="fine"/>
<rect x="880" y="365" width="190" height="55" class="fur"/>
<path d="M905 365V420M930 365V420M955 365V420M980 365V420M1005 365V420M1030 365V420M1055 365V420" class="fine"/>
<rect x="1100" y="180" width="190" height="55" class="fur"/>
<path d="M1125 180V235M1150 180V235M1175 180V235M1200 180V235M1225 180V235M1250 180V235M1275 180V235" class="fine"/>
<rect x="1100" y="365" width="190" height="55" class="fur"/>
<path d="M1125 365V420M1150 365V420M1175 365V420M1200 365V420M1225 365V420M1250 365V420M1275 365V420" class="fine"/>
<rect x="1320" y="180" width="190" height="55" class="fur"/>
<path d="M1345 180V235M1370 180V235M1395 180V235M1420 180V235M1445 180V235M1470 180V235M1495 180V235" class="fine"/>
<rect x="1320" y="365" width="190" height="55" class="fur"/>
<path d="M1345 365V420M1370 365V420M1395 365V420M1420 365V420M1445 365V420M1470 365V420M1495 365V420" class="fine"/>
<rect x="1540" y="180" width="190" height="55" class="fur"/>
<path d="M1565 180V235M1590 180V235M1615 180V235M1640 180V235M1665 180V235M1690 180V235M1715 180V235" class="fine"/>
<rect x="1540" y="365" width="190" height="55" class="fur"/>
<path d="M1565 365V420M1590 365V420M1615 365V420M1640 365V420M1665 365V420M1690 365V420M1715 365V420" class="fine"/>
<rect x="1760" y="180" width="190" height="55" class="fur"/>
<path d="M1785 180V235M1810 180V235M1835 180V235M1860 180V235M1885 180V235M1910 180V235M1935 180V235" class="fine"/>
<rect x="1760" y="365" width="190" height="55" class="fur"/>
<path d="M1785 365V420M1810 365V420M1835 365V420M1860 365V420M1885 365V420M1910 365V420M1935 365V420" class="fine"/>
<rect x="1980" y="180" width="190" height="55" class="fur"/>
<path d="M2005 180V235M2030 180V235M2055 180V235M2080 180V235M2105 180V235M2130 180V235M2155 180V235" class="fine"/>
<rect x="1980" y="365" width="190" height="55" class="fur"/>
<path d="M2005 365V420M2030 365V420M2055 365V420M2080 365V420M2105 365V420M2130 365V420M2155 365V420" class="fine"/>
<rect x="2200" y="180" width="190" height="55" class="fur"/>
<path d="M2225 180V235M2250 180V235M2275 180V235M2300 180V235M2325 180V235M2350 180V235M2375 180V235" class="fine"/>
<rect x="2200" y="365" width="190" height="55" class="fur"/>
<path d="M2225 365V420M2250 365V420M2275 365V420M2300 365V420M2325 365V420M2350 365V420M2375 365V420" class="fine"/>
<rect x="2420" y="180" width="190" height="55" class="fur"/>
<path d="M2445 180V235M2470 180V235M2495 180V235M2520 180V235M2545 180V235M2570 180V235M2595 180V235" class="fine"/>
<rect x="2420" y="365" width="190" height="55" class="fur"/>
<path d="M2445 365V420M2470 365V420M2495 365V420M2520 365V420M2545 365V420M2570 365V420M2595 365V420" class="fine"/>
<line x1="2700" y1="300" x2="2785" y2="300" class="arw" marker-end="url(#ah)"/>
<text x="2497.8" y="120" class="sub exit">VIGIL HALL · SHEET 8 →</text>
<rect x="900" y="450" width="200" height="300" class="rock"/>
<rect x="1700" y="450" width="200" height="300" class="rock"/>
<rect x="1100" y="450" width="600" height="300" class="rm"/>
<text x="1130" y="525" class="lbl">BUFFER DEPOT</text>
<text x="1130" y="563" class="sub">tins · blankets · oil</text>
<rect x="1140" y="640" width="520" height="50" class="fur"/>
<path d="M1165 640V690M1190 640V690M1215 640V690M1240 640V690M1265 640V690M1290 640V690M1315 640V690M1340 640V690M1365 640V690M1390 640V690M1415 640V690M1440 640V690M1465 640V690M1490 640V690M1515 640V690M1540 640V690M1565 640V690M1590 640V690M1615 640V690M1640 640V690" class="fine"/>
<rect x="50" y="750" width="1850" height="300" class="rock"/>
<text x="80" y="825" class="lbl">No.3 COAL ROAD</text>
<text x="80" y="863" class="sub">trout tanks</text>
<line x1="100" y1="1000" x2="15" y2="1000" class="arw" marker-end="url(#ah)"/>
<text x="30" y="1100" class="sub exit">← THE ESTATE · SHEET 11</text>
<rect x="600" y="810" width="230" height="180" class="fur"/>
<text x="715" y="905.6" class="fl" font-size="16">TANK</text>
<rect x="880" y="810" width="230" height="180" class="fur"/>
<text x="995" y="905.6" class="fl" font-size="16">TANK</text>
<rect x="1160" y="810" width="230" height="180" class="fur"/>
<text x="1275" y="905.6" class="fl" font-size="16">TANK</text>
<rect x="1440" y="810" width="230" height="180" class="fur"/>
<text x="1555" y="905.6" class="fl" font-size="16">TANK</text>
<rect x="1900" y="650" width="850" height="500" class="rock"/>
<text x="1930" y="725" class="lbl">HEN RUN</text>
<rect x="2000" y="990" width="90" height="90" class="fur"/>
<rect x="2130" y="990" width="90" height="90" class="fur"/>
<rect x="2260" y="990" width="90" height="90" class="fur"/>
<rect x="2390" y="990" width="90" height="90" class="fur"/>
<rect x="2520" y="990" width="90" height="90" class="fur"/>
<rect x="2650" y="990" width="90" height="90" class="fur"/>
<text x="2030" y="860" class="pen" transform="rotate(-2 2030 860)">eggs → Welfare, Tues/Fri</text>
<rect x="1300" y="1050" width="300" height="400" class="rm2"/>
<path d="M1300 1080H1600M1300 1110H1600M1300 1140H1600M1300 1170H1600M1300 1200H1600M1300 1230H1600M1300 1260H1600M1300 1290H1600M1300 1320H1600M1300 1350H1600M1300 1380H1600M1300 1410H1600M1300 1440H1600" class="fine"/>
<rect x="1380" y="1232" width="140" height="30" fill="#11417d"/>
<text x="1450" y="1255" class="fl" font-size="19">SUMP STAIR</text>
<rect x="100" y="1150" width="1200" height="200" class="rm"/>
<text x="130" y="1280" class="lbl">THE SUMP</text>
<circle cx="1255" cy="1195" r="30" class="numc"/><text x="1255" y="1208" class="num">15</text>
<rect x="100" y="1350" width="300" height="450" class="rm"/>
<text x="120" y="1440" class="lbl">CELL 1</text>
<rect x="150" y="1540" width="90" height="200" class="fur"/>
<line x1="150" y1="1585" x2="240" y2="1585" class="fine"/>
<line x1="290" y1="1350" x2="380" y2="1350" class="gap"/>
<path d="M290 1350L290 1440A90 90 0 0 0 380 1350" class="swing"/>
<rect x="400" y="1350" width="300" height="450" class="rm"/>
<text x="420" y="1440" class="lbl">CELL 2</text>
<rect x="450" y="1540" width="90" height="200" class="fur"/>
<line x1="450" y1="1585" x2="540" y2="1585" class="fine"/>
<line x1="590" y1="1350" x2="680" y2="1350" class="gap"/>
<path d="M590 1350L590 1440A90 90 0 0 0 680 1350" class="swing"/>
<rect x="700" y="1350" width="300" height="450" class="rm"/>
<text x="720" y="1440" class="lbl">CELL 3</text>
<rect x="750" y="1540" width="90" height="200" class="fur"/>
<line x1="750" y1="1585" x2="840" y2="1585" class="fine"/>
<line x1="890" y1="1350" x2="980" y2="1350" class="gap"/>
<path d="M890 1350L890 1440A90 90 0 0 0 980 1350" class="swing"/>
<rect x="1000" y="1350" width="300" height="450" class="rm"/>
<text x="1020" y="1440" class="lbl">CELL 4</text>
<rect x="1050" y="1540" width="90" height="200" class="fur"/>
<line x1="1050" y1="1585" x2="1140" y2="1585" class="fine"/>
<line x1="1190" y1="1350" x2="1280" y2="1350" class="gap"/>
<path d="M1190 1350L1190 1440A90 90 0 0 0 1280 1350" class="swing"/>
<rect x="880" y="1180" width="200" height="80" class="fur"/>
<text x="980" y="1227" class="fl" font-size="20">WARDEN</text>
<text x="130" y="1870" class="pen" transform="rotate(-1 130 1870)">locks: 1962 pattern — oil them</text>
<line x1="1350" y1="1050" x2="1550" y2="1050" class="rgap"/>
<line x1="1300" y1="1200" x2="1300" y2="1300" class="gap"/>
<line x1="900" y1="450" x2="1100" y2="450" class="rgap"/>
<line x1="900" y1="750" x2="1100" y2="750" class="rgap"/>
<line x1="1700" y1="450" x2="1900" y2="450" class="rgap"/>
<line x1="1700" y1="750" x2="1900" y2="750" class="rgap"/>
<line x1="1100" y1="520" x2="1100" y2="620" class="gap"/>
<path d="M1100 520L1000 520A100 100 0 0 0 1100 620" class="swing"/>
<line x1="1900" y1="850" x2="1900" y2="950" class="gap"/>
<path d="M1900 850L2000 850A100 100 0 0 1 1900 950" class="swing"/>
<rect x="1750" y="1210" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="1774" y="1254" class="tb" font-weight="700">KEY</text>
<path d="M1780 1290L1780 1360A70 70 0 0 0 1850 1290" class="swing"/>
<line x1="1780" y1="1290" x2="1850" y2="1290" stroke="#e8f1fb" stroke-width="7"/>
<text x="1880" y="1330" class="tb">DOOR</text>
<circle cx="2110" cy="1320" r="26" class="numc"/>
<text x="2110" y="1332" class="num" font-size="30">7</text>
<text x="2150" y="1330" class="tb">LOCATION No.</text>
<text x="1780" y="1410" class="pen" font-size="25">pencil</text>
<text x="1880" y="1410" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="1780" y="1442" width="70" height="44" class="rock"/>
<text x="1880" y="1472" class="tb">= UNLINED MINE WORKINGS</text>
<text x="1780" y="1540" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 7 OF 13 · PIT GALLERIES</text>
<text x="1924" y="1815" class="ttl">COAL ROADS &amp; SUMP</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/07 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

+327
View File
@@ -0,0 +1,327 @@
<svg xmlns="http://www.w3.org/2000/svg" width="2800" height="2000" viewBox="0 0 2800 2000">
<!-- STANDING ORDER — VIGIL HALL. Generated by tools/bellhouse-plans.mjs; edit that, not this. -->
<defs>
<style>
.rm { fill:#154a8a; stroke:#e8f1fb; stroke-width:7; }
.rm2 { fill:#11417d; stroke:#e8f1fb; stroke-width:5; }
.rock { fill:#0e3668; stroke:#9fbde0; stroke-width:4; stroke-dasharray:18 10; }
.gap { stroke:#154a8a; stroke-width:12; }
.gap2 { stroke:#11417d; stroke-width:12; }
.rgap { stroke:#0e3668; stroke-width:12; }
.swing { fill:none; stroke:#e8f1fb; stroke-width:3; }
.fur { fill:#1b579c; stroke:#cfe0f3; stroke-width:3; }
.fine { fill:none; stroke:#cfe0f3; stroke-width:2; }
.blast { fill:#0a2f5c; stroke:#e8f1fb; stroke-width:4; }
.arw { stroke:#e8f1fb; stroke-width:4; }
.grid { stroke:#2a5d9c; stroke-width:1; }
.numc { fill:#e8f1fb; }
.num { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:36px;
fill:#123f78; text-anchor:middle; }
.lbl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:30px;
fill:#f4f8fd; letter-spacing:2px; }
.sub { font-family:'Courier New',Courier,monospace; font-size:21px; fill:#b9d0ea; }
.exit { font-weight:700; fill:#e8f1fb; }
.fl { font-family:'Courier New',Courier,monospace; font-size:18px; fill:#e8f1fb;
text-anchor:middle; }
.ttl { font-family:'Courier New',Courier,monospace; font-weight:700; font-size:34px;
fill:#f4f8fd; letter-spacing:3px; }
.tb { font-family:'Courier New',Courier,monospace; font-size:20px; fill:#dbe8f6; }
.pen { font-family:'Bradley Hand','Noteworthy','Marker Felt',cursive; font-size:27px;
fill:#ffe98a; }
</style>
<marker id="ah" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M0 0L10 5L0 10z" fill="#e8f1fb"/>
</marker>
</defs>
<rect width="2800" height="2000" fill="#123f78"/>
<path d="M100 0V2000M200 0V2000M300 0V2000M400 0V2000M500 0V2000M600 0V2000M700 0V2000M800 0V2000M900 0V2000M1000 0V2000M1100 0V2000M1200 0V2000M1300 0V2000M1400 0V2000M1500 0V2000M1600 0V2000M1700 0V2000M1800 0V2000M1900 0V2000M2000 0V2000M2100 0V2000M2200 0V2000M2300 0V2000M2400 0V2000M2500 0V2000M2600 0V2000M2700 0V2000M0 100H2800M0 200H2800M0 300H2800M0 400H2800M0 500H2800M0 600H2800M0 700H2800M0 800H2800M0 900H2800M0 1000H2800M0 1100H2800M0 1200H2800M0 1300H2800M0 1400H2800M0 1500H2800M0 1600H2800M0 1700H2800M0 1800H2800M0 1900H2800" class="grid"/>
<rect x="50" y="700" width="200" height="400" class="rock"/>
<text x="20" y="660" class="sub">← SHEET 7</text>
<rect x="250" y="100" width="2450" height="1400" class="rm"/>
<text x="280" y="1460" class="lbl">VIGIL HALL</text>
<circle cx="2655" cy="145" r="30" class="numc"/><text x="2655" y="158" class="num">13</text>
<rect x="800" y="140" width="1200" height="190" class="fur"/>
<text x="1400" y="242.7" class="fl" font-size="22">PLATFORM</text>
<rect x="900" y="105" width="1000" height="22" class="fur"/>
<text x="2030" y="145" class="sub">ROLL OF HONOUR</text>
<rect x="1360" y="350" width="80" height="50" class="fur"/>
<text x="1460" y="395" class="sub">lectern</text>
<rect x="450" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="505" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="560" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="615" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="670" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="725" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="780" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="835" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="890" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="945" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1055" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1110" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1165" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1275" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1330" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1495" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1550" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1605" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1660" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1715" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1770" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1825" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1880" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1935" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="1990" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="2045" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="2100" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="2155" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="2210" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="2265" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="2320" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="2375" y="500" width="34" height="34" rx="6" class="fur"/>
<rect x="450" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="505" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="560" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="615" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="670" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="725" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="780" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="835" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="890" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="945" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1055" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1110" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1165" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1275" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1330" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1495" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1550" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1605" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1660" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1715" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1770" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1825" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1880" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1935" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="1990" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="2045" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="2100" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="2155" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="2210" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="2265" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="2320" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="2375" y="580" width="34" height="34" rx="6" class="fur"/>
<rect x="450" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="505" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="560" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="615" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="670" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="725" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="780" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="835" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="890" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="945" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1055" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1110" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1165" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1275" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1330" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1495" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1550" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1605" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1660" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1715" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1770" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1825" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1880" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1935" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="1990" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="2045" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="2100" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="2155" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="2210" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="2265" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="2320" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="2375" y="660" width="34" height="34" rx="6" class="fur"/>
<rect x="450" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="505" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="560" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="615" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="670" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="725" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="780" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="835" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="890" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="945" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1055" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1110" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1165" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1275" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1330" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1495" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1550" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1605" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1660" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1715" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1770" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1825" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1880" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1935" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="1990" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="2045" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="2100" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="2155" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="2210" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="2265" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="2320" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="2375" y="740" width="34" height="34" rx="6" class="fur"/>
<rect x="450" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="505" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="560" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="615" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="670" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="725" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="780" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="835" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="890" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="945" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1055" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1110" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1165" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1275" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1330" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1495" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1550" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1605" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1660" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1715" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1770" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1825" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1880" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1935" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="1990" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="2045" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="2100" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="2155" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="2210" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="2265" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="2320" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="2375" y="820" width="34" height="34" rx="6" class="fur"/>
<rect x="450" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="505" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="560" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="615" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="670" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="725" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="780" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="835" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="890" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="945" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1055" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1110" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1165" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1275" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1330" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1495" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1550" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1605" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1660" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1715" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1770" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1825" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1880" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1935" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="1990" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="2045" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="2100" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="2155" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="2210" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="2265" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="2320" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="2375" y="900" width="34" height="34" rx="6" class="fur"/>
<rect x="450" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="505" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="560" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="615" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="670" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="725" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="780" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="835" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="890" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="945" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1000" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1055" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1110" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1165" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1220" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1275" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1330" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1495" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1550" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1605" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1660" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1715" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1770" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1825" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1880" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1935" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="1990" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="2045" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="2100" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="2155" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="2210" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="2265" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="2320" y="980" width="34" height="34" rx="6" class="fur"/>
<rect x="2375" y="980" width="34" height="34" rx="6" class="fur"/>
<circle cx="290" cy="460" r="16" class="fur"/>
<path d="M314 444a24 24 0 0 1 0 32M324 434a38 38 0 0 1 0 52" class="fine"/>
<circle cx="290" cy="1140" r="16" class="fur"/>
<path d="M314 1124a24 24 0 0 1 0 32M324 1114a38 38 0 0 1 0 52" class="fine"/>
<rect x="1850" y="1220" width="140" height="140" class="fur"/>
<text x="1920" y="1294.9" class="fl" font-size="14">STACK</text>
<rect x="2030" y="1220" width="140" height="140" class="fur"/>
<text x="2100" y="1294.9" class="fl" font-size="14">STACK</text>
<rect x="2210" y="1220" width="140" height="140" class="fur"/>
<text x="2280" y="1294.9" class="fl" font-size="14">STACK</text>
<text x="600" y="1240" class="pen" transform="rotate(-2 600 1240)">Thursday: chairs out — all 999 stand</text>
<text x="1560" y="1440" class="sub">standing room</text>
<line x1="250" y1="760" x2="250" y2="940" class="gap"/>
<path d="M250 760L430 760A180 180 0 0 1 250 940" class="swing"/>
<line x1="2700" y1="750" x2="2700" y2="850" class="gap"/>
<path d="M2700 750L2600 750A100 100 0 0 0 2700 850" class="swing"/>
<text x="2320" y="720" class="sub">fire exit → galleries</text>
<rect x="30" y="1610" width="640" height="380" fill="#0f3a70" stroke="#e8f1fb" stroke-width="3"/>
<text x="54" y="1654" class="tb" font-weight="700">KEY</text>
<path d="M60 1690L60 1760A70 70 0 0 0 130 1690" class="swing"/>
<line x1="60" y1="1690" x2="130" y2="1690" stroke="#e8f1fb" stroke-width="7"/>
<text x="160" y="1730" class="tb">DOOR</text>
<circle cx="390" cy="1720" r="26" class="numc"/>
<text x="390" y="1732" class="num" font-size="30">7</text>
<text x="430" y="1730" class="tb">LOCATION No.</text>
<text x="60" y="1810" class="pen" font-size="25">pencil</text>
<text x="160" y="1810" class="tb">= AMENDED AT THE SEAT, 1974–2026</text>
<rect x="60" y="1842" width="70" height="44" class="rock"/>
<text x="160" y="1872" class="tb">= UNLINED MINE WORKINGS</text>
<text x="60" y="1940" class="tb">1 SQUARE = 5 FT · NORTH ←</text>
<rect x="1900" y="1650" width="870" height="330" fill="#0f3a70" stroke="#e8f1fb" stroke-width="5"/>
<line x1="1900" y1="1760" x2="2770" y2="1760" stroke="#e8f1fb" stroke-width="3"/>
<line x1="1900" y1="1900" x2="2770" y2="1900" stroke="#e8f1fb" stroke-width="3"/>
<text x="1924" y="1694" class="tb">REGIONAL SEAT OF GOVERNMENT 12 · BELLHOUSE</text>
<text x="1924" y="1738" class="tb">SHEET 8 OF 13 · PIT GALLERIES</text>
<text x="1924" y="1815" class="ttl">VIGIL HALL</text>
<text x="1924" y="1866" class="tb">SCALE: ONE SQUARE = 5 FT · SECTION: SO-H04</text>
<text x="1924" y="1950" class="tb">DRG RSG12/08 · ISSUED 1962 · COPY NOT TO LEAVE THE SEAT</text>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

+21
View File
@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Afterimage</title>
<desc>Afterimage — baseline, SIZ 11, 7 hit locations, natural armour 0, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(0 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="39.0" ry="5.5" fill="hsl(0 66% 17%)" opacity="0.8"/>
<g transform="translate(90.49 80.45) scale(0.6251 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(0 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(0 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+25
View File
@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Anglesmith</title>
<desc>Anglesmith — vesh, SIZ 15, 6 hit locations, natural armour 5, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(3 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="56.8" ry="7.9" fill="hsl(3 66% 17%)" opacity="0.8"/>
<g transform="translate(73.40 59.38) scale(0.9100 0.8726)">
<path d="M44 18 L70 14 L76 96 L52 100 Z" fill="hsl(3 78% 84%)" stroke="hsl(3 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<path d="M40 34 L70 30 L74 84 L44 88 Z" fill="hsl(3 78% 84%)" stroke="hsl(3 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<path d="M44 90 L74 86 L78 132 L48 136 Z" fill="hsl(3 78% 84%)" stroke="hsl(3 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<path d="M74 36 L96 44 L104 148 L86 150 L82 60 Z" fill="hsl(3 78% 84%)" stroke="hsl(3 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="20" y="52" width="16" height="48" rx="8" fill="hsl(3 78% 84%)" stroke="hsl(3 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<path d="M46 136 L78 132 L84 188 L58 190 Z" fill="hsl(3 78% 84%)" stroke="hsl(3 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<path d="M44 18 L70 14 L76 96 L52 100 Z" fill="none" stroke="hsl(3 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<path d="M40 34 L70 30 L74 84 L44 88 Z" fill="none" stroke="hsl(3 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<path d="M44 90 L74 86 L78 132 L48 136 Z" fill="none" stroke="hsl(3 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<path d="M74 36 L96 44 L104 148 L86 150 L82 60 Z" fill="none" stroke="hsl(3 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="20" y="52" width="16" height="48" rx="8" fill="none" stroke="hsl(3 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<path d="M46 136 L78 132 L84 188 L58 190 Z" fill="none" stroke="hsl(3 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(3 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(3 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The apple tree man</title>
<desc>The apple tree man — baseline, SIZ 19, 7 hit locations, natural armour 8, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(31 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(31 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="59.0" ry="8.3" fill="hsl(31 44% 17%)" opacity="0.8"/>
<g transform="translate(71.31 40.19) scale(0.9448 0.9705)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(31 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(31 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(31 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(31 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(31 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(31 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(31 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(31 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(31 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The auditor</title>
<desc>The auditor — baseline, SIZ 11, 7 hit locations, natural armour 4, future. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(271 58% 30%)"/>
<path d="M200 0H256v56z" fill="hsl(271 78% 62%)" opacity="0.55"/>
<ellipse cx="128.0" cy="230.4" rx="46.5" ry="6.5" fill="hsl(271 66% 17%)" opacity="0.8"/>
<g transform="translate(83.31 80.45) scale(0.7448 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(271 78% 84%)" stroke="hsl(271 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(271 78% 84%)" stroke="hsl(271 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(271 78% 84%)" stroke="hsl(271 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(271 78% 84%)" stroke="hsl(271 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(271 78% 84%)" stroke="hsl(271 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(271 78% 84%)" stroke="hsl(271 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(271 78% 84%)" stroke="hsl(271 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(271 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(271 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(271 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(271 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(271 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(271 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(271 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(271 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(271 78% 62%)" stroke-width="5"/>
<path d="M18 212h220" stroke="hsl(271 78% 62%)" stroke-width="2" opacity="0.65"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Backscatter</title>
<desc>Backscatter — baseline, SIZ 16, 7 hit locations, natural armour 9, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(355 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="59.9" ry="8.4" fill="hsl(355 66% 17%)" opacity="0.8"/>
<g transform="translate(70.36 54.44) scale(0.9606 0.8978)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(355 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(355 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(355 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(355 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(355 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(355 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(355 78% 62%)" stroke-width="9.65" opacity="0.88" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(355 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(355 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Barghest</title>
<desc>Barghest — baseline, SIZ 15, 7 hit locations, natural armour 3, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(41 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(41 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="58.6" ry="8.2" fill="hsl(41 44% 17%)" opacity="0.8"/>
<g transform="translate(71.66 59.38) scale(0.9390 0.8726)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(41 50% 78%)" stroke="hsl(41 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(41 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(41 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(41 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The bear-ward's bear</title>
<desc>The bear-ward's bear — baseline, SIZ 20, 7 hit locations, natural armour 5, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(22 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(22 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="66.7" ry="9.3" fill="hsl(22 44% 17%)" opacity="0.8"/>
<g transform="translate(63.82 35.60) scale(1.0696 0.9939)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(22 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(22 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Black Annis</title>
<desc>Black Annis — baseline, SIZ 16, 7 hit locations, natural armour 4, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(40 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(40 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="69.7" ry="9.8" fill="hsl(40 44% 17%)" opacity="0.8"/>
<g transform="translate(60.97 54.44) scale(1.1171 0.8978)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(40 50% 78%)" stroke="hsl(40 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(40 50% 78%)" stroke="hsl(40 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(40 50% 78%)" stroke="hsl(40 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(40 50% 78%)" stroke="hsl(40 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(40 50% 78%)" stroke="hsl(40 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(40 50% 78%)" stroke="hsl(40 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(40 50% 78%)" stroke="hsl(40 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(40 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(40 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(40 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(40 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(40 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(40 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(40 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(40 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(40 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The bog offering</title>
<desc>The bog offering — baseline, SIZ 11, 7 hit locations, natural armour 1, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(35 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(35 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.8" ry="6.8" fill="hsl(35 44% 17%)" opacity="0.8"/>
<g transform="translate(81.12 80.45) scale(0.7813 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(35 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(35 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Boggart</title>
<desc>Boggart — baseline, SIZ 5, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(44 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(44 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="46.2" ry="6.5" fill="hsl(44 44% 17%)" opacity="0.8"/>
<g transform="translate(83.60 120.53) scale(0.7400 0.5606)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(44 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(44 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The boobrie</title>
<desc>The boobrie — baseline, SIZ 21, 7 hit locations, natural armour 3, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(26 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(26 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="63.4" ry="8.9" fill="hsl(26 44% 17%)" opacity="0.8"/>
<g transform="translate(67.06 31.09) scale(1.0156 1.0169)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(26 50% 78%)" stroke="hsl(26 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(26 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(26 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(26 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(26 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(26 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(26 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(26 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(26 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(26 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Callum Pike</title>
<desc>Callum Pike — baseline, SIZ 15, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(204 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="54.9" ry="7.7" fill="hsl(204 66% 17%)" opacity="0.8"/>
<g transform="translate(75.19 59.38) scale(0.8801 0.8726)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(204 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The Conductor</title>
<desc>The Conductor — baseline, SIZ 14, 7 hit locations, natural armour 4, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(352 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="55.4" ry="7.8" fill="hsl(352 66% 17%)" opacity="0.8"/>
<g transform="translate(74.77 64.43) scale(0.8872 0.8468)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(352 78% 84%)" stroke="hsl(352 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(352 78% 84%)" stroke="hsl(352 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(352 78% 84%)" stroke="hsl(352 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(352 78% 84%)" stroke="hsl(352 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(352 78% 84%)" stroke="hsl(352 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(352 78% 84%)" stroke="hsl(352 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(352 78% 84%)" stroke="hsl(352 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(352 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(352 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(352 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(352 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(352 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(352 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(352 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(352 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(352 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Dr Elin Shaw</title>
<desc>Dr Elin Shaw — baseline, SIZ 11, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(204 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="44.1" ry="6.2" fill="hsl(204 66% 17%)" opacity="0.8"/>
<g transform="translate(85.59 80.45) scale(0.7068 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(204 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(204 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Ticket inspector</title>
<desc>Ticket inspector — baseline, SIZ 12, 7 hit locations, natural armour 2, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(346 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(346 66% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(346 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(346 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Leah Hall</title>
<desc>Leah Hall — baseline, SIZ 11, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(199 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.8" ry="6.8" fill="hsl(199 66% 17%)" opacity="0.8"/>
<g transform="translate(81.12 80.45) scale(0.7813 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(199 78% 84%)" stroke="hsl(199 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(199 78% 84%)" stroke="hsl(199 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(199 78% 84%)" stroke="hsl(199 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(199 78% 84%)" stroke="hsl(199 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(199 78% 84%)" stroke="hsl(199 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(199 78% 84%)" stroke="hsl(199 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(199 78% 84%)" stroke="hsl(199 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(199 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(199 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Mara Venn</title>
<desc>Mara Venn — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(30 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(30 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(30 44% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(30 50% 78%)" stroke="hsl(30 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(30 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(30 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Martin Cole</title>
<desc>Martin Cole — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(207 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(207 66% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(207 78% 84%)" stroke="hsl(207 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(207 78% 84%)" stroke="hsl(207 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(207 78% 84%)" stroke="hsl(207 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(207 78% 84%)" stroke="hsl(207 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(207 78% 84%)" stroke="hsl(207 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(207 78% 84%)" stroke="hsl(207 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(207 78% 84%)" stroke="hsl(207 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(207 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(207 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Nia Mercer</title>
<desc>Nia Mercer — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(205 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="45.9" ry="6.4" fill="hsl(205 66% 17%)" opacity="0.8"/>
<g transform="translate(83.84 74.95) scale(0.7360 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(205 78% 84%)" stroke="hsl(205 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(205 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(205 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Owen Dey</title>
<desc>Owen Dey — baseline, SIZ 12, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(43 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(43 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(43 44% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(43 50% 78%)" stroke="hsl(43 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(43 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(43 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Sennen Roake</title>
<desc>Sennen Roake — baseline, SIZ 10, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(193 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="47.1" ry="6.6" fill="hsl(193 66% 17%)" opacity="0.8"/>
<g transform="translate(82.70 86.15) scale(0.7551 0.7360)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(193 78% 84%)" stroke="hsl(193 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(193 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(193 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The azure bull</title>
<desc>The azure bull — baseline, SIZ 21, 7 hit locations, natural armour 6, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(48 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(48 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="69.5" ry="9.7" fill="hsl(48 44% 17%)" opacity="0.8"/>
<g transform="translate(61.20 31.09) scale(1.1134 1.0169)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(48 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(48 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(48 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(48 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(48 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(48 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(48 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(48 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(48 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The cade lamb</title>
<desc>The cade lamb — baseline, SIZ 7, 7 hit locations, natural armour 1, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(44 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(44 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="41.8" ry="5.9" fill="hsl(44 44% 17%)" opacity="0.8"/>
<g transform="translate(87.78 105.00) scale(0.6703 0.6398)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(44 50% 78%)" stroke="hsl(44 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(44 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(44 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(44 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(44 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(44 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(44 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(44 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(44 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(44 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The cailleach</title>
<desc>The cailleach — baseline, SIZ 12, 7 hit locations, natural armour 2, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(31 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(31 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(31 44% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(31 50% 78%)" stroke="hsl(31 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(31 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(31 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(31 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(31 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(31 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(31 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(31 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(31 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(31 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+21
View File
@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Carried over</title>
<desc>Carried over — baseline, SIZ 4, 7 hit locations, natural armour 0, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(345 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="37.9" ry="5.3" fill="hsl(345 66% 17%)" opacity="0.8"/>
<g transform="translate(91.59 132.66) scale(0.6068 0.4987)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(345 78% 84%)" stroke="hsl(345 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(345 78% 84%)" stroke="hsl(345 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(345 78% 84%)" stroke="hsl(345 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(345 78% 84%)" stroke="hsl(345 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(345 78% 84%)" stroke="hsl(345 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(345 78% 84%)" stroke="hsl(345 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(345 78% 84%)" stroke="hsl(345 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(345 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(345 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The carrion file</title>
<desc>The carrion file — baseline, SIZ 9, 7 hit locations, natural armour 6, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(6 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="54.7" ry="7.7" fill="hsl(6 66% 17%)" opacity="0.8"/>
<g transform="translate(75.44 92.09) scale(0.8759 0.7056)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(6 78% 84%)" stroke="hsl(6 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(6 78% 62%)" stroke-width="7.10" opacity="0.70" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(6 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(6 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The cauld lad</title>
<desc>The cauld lad — baseline, SIZ 9, 7 hit locations, natural armour 0, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(27 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(27 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="47.9" ry="6.7" fill="hsl(27 44% 17%)" opacity="0.8"/>
<g transform="translate(81.97 92.09) scale(0.7671 0.7056)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(27 50% 78%)" stroke="hsl(27 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(27 50% 78%)" stroke="hsl(27 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(27 50% 78%)" stroke="hsl(27 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(27 50% 78%)" stroke="hsl(27 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(27 50% 78%)" stroke="hsl(27 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(27 50% 78%)" stroke="hsl(27 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(27 50% 78%)" stroke="hsl(27 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(27 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(27 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Ceyla Marspont</title>
<desc>Ceyla Marspont — baseline, SIZ 13, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(210 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="47.7" ry="6.7" fill="hsl(210 66% 17%)" opacity="0.8"/>
<g transform="translate(82.15 69.62) scale(0.7642 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(210 78% 84%)" stroke="hsl(210 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(210 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(210 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The changeling</title>
<desc>The changeling — baseline, SIZ 5, 7 hit locations, natural armour 1, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(35 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(35 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="41.0" ry="5.7" fill="hsl(35 44% 17%)" opacity="0.8"/>
<g transform="translate(88.60 120.53) scale(0.6567 0.5606)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(35 50% 78%)" stroke="hsl(35 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(35 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(35 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(35 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Church grim</title>
<desc>Church grim — baseline, SIZ 14, 7 hit locations, natural armour 5, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(22 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(22 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="55.4" ry="7.8" fill="hsl(22 44% 17%)" opacity="0.8"/>
<g transform="translate(74.77 64.43) scale(0.8872 0.8468)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(22 50% 78%)" stroke="hsl(22 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(22 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(22 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(22 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cleaner (contractor)</title>
<desc>Cleaner (contractor) — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(206 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.3" ry="7.0" fill="hsl(206 66% 17%)" opacity="0.8"/>
<g transform="translate(79.59 74.95) scale(0.8069 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(206 78% 84%)" stroke="hsl(206 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(206 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(206 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cleaner (marksman)</title>
<desc>Cleaner (marksman) — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(197 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="52.4" ry="7.3" fill="hsl(197 66% 17%)" opacity="0.8"/>
<g transform="translate(77.57 74.95) scale(0.8404 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(197 78% 84%)" stroke="hsl(197 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(197 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(197 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The cockatrice</title>
<desc>The cockatrice — baseline, SIZ 5, 7 hit locations, natural armour 2, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(21 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(21 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="44.1" ry="6.2" fill="hsl(21 44% 17%)" opacity="0.8"/>
<g transform="translate(85.60 120.53) scale(0.7067 0.5606)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(21 50% 78%)" stroke="hsl(21 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(21 50% 78%)" stroke="hsl(21 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(21 50% 78%)" stroke="hsl(21 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(21 50% 78%)" stroke="hsl(21 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(21 50% 78%)" stroke="hsl(21 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(21 50% 78%)" stroke="hsl(21 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(21 50% 78%)" stroke="hsl(21 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(21 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(21 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(21 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(21 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(21 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(21 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(21 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(21 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(21 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

+23
View File
@@ -0,0 +1,23 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Counterpoint</title>
<desc>Counterpoint — cadence, SIZ 11, 5 hit locations, natural armour 3, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(5 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="50.9" ry="7.1" fill="hsl(5 66% 17%)" opacity="0.8"/>
<g transform="translate(79.01 80.45) scale(0.8165 0.7651)">
<ellipse cx="34" cy="52" rx="20" ry="24" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="86" cy="44" rx="20" ry="24" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="100" rx="20" ry="24" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="28" cy="148" rx="20" ry="24" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="88" cy="152" rx="20" ry="24" fill="hsl(5 78% 84%)" stroke="hsl(5 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="34" cy="52" rx="20" ry="24" fill="none" stroke="hsl(5 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<ellipse cx="86" cy="44" rx="20" ry="24" fill="none" stroke="hsl(5 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<ellipse cx="60" cy="100" rx="20" ry="24" fill="none" stroke="hsl(5 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<ellipse cx="28" cy="148" rx="20" ry="24" fill="none" stroke="hsl(5 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<ellipse cx="88" cy="152" rx="20" ry="24" fill="none" stroke="hsl(5 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(5 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(5 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The crossroads man</title>
<desc>The crossroads man — baseline, SIZ 13, 7 hit locations, natural armour 3, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(36 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(36 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="64.9" ry="9.1" fill="hsl(36 44% 17%)" opacity="0.8"/>
<g transform="translate(65.62 69.62) scale(1.0396 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(36 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(36 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(36 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(36 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(36 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(36 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cu sidhe</title>
<desc>Cu sidhe — baseline, SIZ 17, 7 hit locations, natural armour 4, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(37 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(37 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="61.3" ry="8.6" fill="hsl(37 44% 17%)" opacity="0.8"/>
<g transform="translate(69.08 49.60) scale(0.9820 0.9225)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(37 50% 78%)" stroke="hsl(37 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(37 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(37 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Cuckoo array</title>
<desc>Cuckoo array — baseline, SIZ 20, 7 hit locations, natural armour 7, future. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(273 58% 30%)"/>
<path d="M200 0H256v56z" fill="hsl(273 78% 62%)" opacity="0.55"/>
<ellipse cx="128.0" cy="230.4" rx="60.4" ry="8.5" fill="hsl(273 66% 17%)" opacity="0.8"/>
<g transform="translate(69.95 35.60) scale(0.9676 0.9939)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(273 78% 84%)" stroke="hsl(273 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(273 78% 84%)" stroke="hsl(273 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(273 78% 84%)" stroke="hsl(273 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(273 78% 84%)" stroke="hsl(273 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(273 78% 84%)" stroke="hsl(273 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(273 78% 84%)" stroke="hsl(273 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(273 78% 84%)" stroke="hsl(273 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(273 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(273 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(273 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(273 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(273 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(273 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(273 78% 62%)" stroke-width="7.95" opacity="0.76" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(273 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(273 78% 62%)" stroke-width="5"/>
<path d="M18 212h220" stroke="hsl(273 78% 62%)" stroke-width="2" opacity="0.65"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The cut walker</title>
<desc>The cut walker — baseline, SIZ 13, 7 hit locations, natural armour 1, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(355 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="59.6" ry="8.3" fill="hsl(355 66% 17%)" opacity="0.8"/>
<g transform="translate(70.69 69.62) scale(0.9551 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(355 78% 84%)" stroke="hsl(355 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(355 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(355 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(355 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(355 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(355 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(355 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(355 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(355 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(355 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The drain heron</title>
<desc>The drain heron — baseline, SIZ 7, 7 hit locations, natural armour 1, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(48 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(48 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="49.8" ry="7.0" fill="hsl(48 44% 17%)" opacity="0.8"/>
<g transform="translate(80.08 105.00) scale(0.7986 0.6398)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(48 50% 78%)" stroke="hsl(48 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(48 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(48 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(48 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(48 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(48 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(48 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(48 78% 62%)" stroke-width="2.85" opacity="0.40" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(48 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(48 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

+23
View File
@@ -0,0 +1,23 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The drowned crew</title>
<desc>The drowned crew — cadence, SIZ 12, 5 hit locations, natural armour 2, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(0 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="52.4" ry="7.3" fill="hsl(0 66% 17%)" opacity="0.8"/>
<g transform="translate(77.57 74.95) scale(0.8404 0.7931)">
<ellipse cx="34" cy="52" rx="20" ry="24" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="86" cy="44" rx="20" ry="24" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="100" rx="20" ry="24" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="28" cy="148" rx="20" ry="24" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="88" cy="152" rx="20" ry="24" fill="hsl(0 78% 84%)" stroke="hsl(0 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="34" cy="52" rx="20" ry="24" fill="none" stroke="hsl(0 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<ellipse cx="86" cy="44" rx="20" ry="24" fill="none" stroke="hsl(0 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<ellipse cx="60" cy="100" rx="20" ry="24" fill="none" stroke="hsl(0 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<ellipse cx="28" cy="148" rx="20" ry="24" fill="none" stroke="hsl(0 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<ellipse cx="88" cy="152" rx="20" ry="24" fill="none" stroke="hsl(0 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(0 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(0 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+27
View File
@@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The drowned parish</title>
<desc>The drowned parish — baseline, SIZ 11, 7 hit locations, natural armour 2, anomalous. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(346 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.8" ry="6.8" fill="hsl(346 66% 17%)" opacity="0.8"/>
<g transform="translate(81.12 80.45) scale(0.7813 0.7651)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(346 78% 84%)" stroke="hsl(346 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(346 78% 62%)" stroke-width="3.70" opacity="0.46" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(346 62% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none"
stroke="hsl(346 78% 62%)" stroke-width="5" stroke-dasharray="42 21" stroke-dashoffset="11"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The dullahan</title>
<desc>The dullahan — baseline, SIZ 15, 7 hit locations, natural armour 5, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(38 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(38 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="62.1" ry="8.7" fill="hsl(38 44% 17%)" opacity="0.8"/>
<g transform="translate(68.30 59.38) scale(0.9951 0.8726)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(38 50% 78%)" stroke="hsl(38 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(38 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(38 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(38 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(38 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(38 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(38 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(38 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M4 34L30 8l5 5L9 39z" fill="hsl(38 38% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(38 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The dun cow</title>
<desc>The dun cow — baseline, SIZ 32, 7 hit locations, natural armour 8, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(32 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(32 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="68.1" ry="9.5" fill="hsl(32 44% 17%)" opacity="0.8"/>
<g transform="translate(62.53 17.92) scale(1.0912 1.0841)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(32 50% 78%)" stroke="hsl(32 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(32 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(32 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(32 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(32 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(32 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(32 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(32 78% 62%)" stroke-width="8.80" opacity="0.82" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(32 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(32 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Dunn Halvorsen</title>
<desc>Dunn Halvorsen — baseline, SIZ 10, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(209 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="42.2" ry="5.9" fill="hsl(209 66% 17%)" opacity="0.8"/>
<g transform="translate(87.43 86.15) scale(0.6762 0.7360)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(209 78% 84%)" stroke="hsl(209 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(209 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(209 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Duplicate (of an agent)</title>
<desc>Duplicate (of an agent) — baseline, SIZ 12, 7 hit locations, natural armour 0, modern. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(204 58% 30%)"/>
<ellipse cx="128.0" cy="230.4" rx="48.2" ry="6.7" fill="hsl(204 66% 17%)" opacity="0.8"/>
<g transform="translate(81.67 74.95) scale(0.7721 0.7931)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(204 78% 84%)" stroke="hsl(204 66% 17%)" stroke-width="3" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 20h26v7H16l-4 9H6z" fill="hsl(204 62% 48%)"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(204 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The eagle displayed</title>
<desc>The eagle displayed — baseline, SIZ 9, 7 hit locations, natural armour 4, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(45 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(45 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="58.1" ry="8.1" fill="hsl(45 44% 17%)" opacity="0.8"/>
<g transform="translate(72.11 92.09) scale(0.9315 0.7056)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(45 50% 78%)" stroke="hsl(45 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5.40" opacity="0.58" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(45 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(45 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>Eel mother</title>
<desc>Eel mother — baseline, SIZ 19, 7 hit locations, natural armour 5, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(36 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(36 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="63.9" ry="8.9" fill="hsl(36 44% 17%)" opacity="0.8"/>
<g transform="translate(66.55 40.19) scale(1.0241 0.9705)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(36 50% 78%)" stroke="hsl(36 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(36 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(36 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(36 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(36 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(36 78% 62%)" stroke-width="6.25" opacity="0.64" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(36 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(36 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

+26
View File
@@ -0,0 +1,26 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="256" height="256">
<title>The enfield</title>
<desc>The enfield — baseline, SIZ 13, 7 hit locations, natural armour 3, antique. Generated by tools/make-portraits.mjs; do not edit by hand.</desc>
<rect width="256" height="256" rx="30" fill="hsl(23 38% 27%)"/>
<path d="M0 0h52L0 52z" fill="hsl(23 44% 17%)"/>
<ellipse cx="128.0" cy="230.4" rx="53.9" ry="7.5" fill="hsl(23 44% 17%)" opacity="0.8"/>
<g transform="translate(76.16 69.62) scale(0.8640 0.8203)">
<ellipse cx="60" cy="21" rx="15" ry="17" fill="hsl(23 50% 78%)" stroke="hsl(23 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="hsl(23 50% 78%)" stroke="hsl(23 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="hsl(23 50% 78%)" stroke="hsl(23 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="hsl(23 50% 78%)" stroke="hsl(23 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="hsl(23 50% 78%)" stroke="hsl(23 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="hsl(23 50% 78%)" stroke="hsl(23 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="hsl(23 50% 78%)" stroke="hsl(23 44% 17%)" stroke-width="3" stroke-linejoin="round"/>
<ellipse cx="60" cy="21" rx="15" ry="17" fill="none" stroke="hsl(23 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="40" y="42" width="40" height="40" rx="9" fill="none" stroke="hsl(23 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="44" y="84" width="32" height="30" rx="8" fill="none" stroke="hsl(23 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="18" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(23 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="85" y="45" width="17" height="64" rx="8" fill="none" stroke="hsl(23 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="43" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(23 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
<rect x="62" y="117" width="15" height="72" rx="7" fill="none" stroke="hsl(23 78% 62%)" stroke-width="4.55" opacity="0.52" stroke-linejoin="round"/>
</g>
<g transform="translate(194 198) scale(1.15)" opacity="0.92"><path d="M6 8c8 6 12 16 12 30M18 6c8 6 12 16 12 30M30 8c6 6 9 14 9 26" fill="none" stroke="hsl(23 38% 48%)" stroke-width="4" stroke-linecap="round"/></g>
<rect x="6" y="6" width="244" height="244" rx="26" fill="none" stroke="hsl(23 78% 62%)" stroke-width="5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Some files were not shown because too many files have changed in this diff Show More