A player briefing, and the historical range

The generator was already writing the timeline, the cast and the texture and
filing all of it behind the GM screen. New PLAYERS page: a read-aloud opening,
what it is like there, what is known so far, who is there and what they want —
but never what they lie about. Page ownership is now declared by the page rather
than guessed from its index, which would have hidden any second player page.

Historical range: 38 weapons (from 6) and 14 armours (from 2), each with its
period stated, from arming swords and longbows through matchlocks and Brown Bess
to the Lee-Enfield and a trench club. Five new skills to hang them on, including
Firearm (Muzzle-loader), because a muzzle-loader is not a rifle.

275 icons; every weapon maps to a real skill and every item has art. Catalogue is
206 items across four eras.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-08-10 23:02:20 +01:00
co-authored by Claude Opus 5
parent 22a5067153
commit e2d0ed5bb2
90 changed files with 685 additions and 83 deletions
+47
View File
@@ -3973,3 +3973,50 @@ Verified in play on PLAIN HARBOUR: extraction failed at 47%, the card read *"You
out, but not cleanly. The window has narrowed... The way home: −10% on every
Transposition roll"*, the clock went to 1, and all four crossings took −10%. Nobody
lost a hit point.
## A briefing, and a millennium of ironmongery
**The players now get a briefing, not a memo.** The generator was already writing the
timeline, the cast and two lines of texture that are the best prose in the whole
document — and filing every word of it behind the GM screen. A new PLAYERS page:
- a read-aloud opening built from the classification, the place and the window;
- **what it is like there** — the texture, with the note that none of it is in the
file, because the file was written by somebody who was not there;
- **what is known so far** — the timeline as a table;
- **who is there** — the cast by name, role, and what they want from you, but never
what they lie about, which stays on the GM page where it belongs;
- and a short "before you go" that tells a new player the three things this game
expects of them: sign for your kit, bring somebody who can make an arrangement,
keep your anchor on you.
Ownership is now **declared by the page** rather than guessed from its index — the
old `i === 0 ? 2 : 0` would have silently hidden any second player page. Two player
pages, four GM pages, 300 seeds checked clean.
Two bugs in my own prose, caught by reading the output: `classification.texture` is a
LIST and was being printed comma-joined into a sentence, and the "since then..."
line was reaching for the last timeline entry, which is *the team crosses* — so every
briefing ended "since then it has not stopped, and the team crosses."
**The historical range.** The department has been running since before it had a name
and has never thrown anything away.
- **38 historical weapons** (from 6): arming sword, longsword, falchion, war hammer,
mace, military flail, poleaxe, halberd, billhook, pike, quarterstaff, dirk, longbow,
arbalest, sling, javelin, rapier, main gauche, matchlock, wheellock, blunderbuss,
boarding pike, cavalry sabre, smallsword, cutlass, Brown Bess, Baker rifle, socket
bayonet, Martini-Henry, Webley, Lee-Enfield, trench club — each with its period
stated, because a GM handing out a matchlock should know it is a matchlock.
- **14 historical armours** (from 2): gambeson, maille shirt, coat of plates, cuirass,
full harness, buff coat, sallet and bevor, lobster-tail helmet, jack of plate,
cuirassier armour, Brodie helmet, flak jacket. Weight is the point — full harness is
9 AP and 25 kg, and the free-carry rule does the rest.
- **Five new skills** to hang it on: Melee Weapon (Polearm), Melee Weapon (Flail),
Missile Weapon (Sling), Missile Weapon (Thrown), and **Firearm (Muzzle-loader)** —
because a muzzle-loader is not a rifle and loading it is the skill.
- **275 icons**, all generated; every weapon maps to a real skill and every item has
art, both checked.
Catalogue is now **206 items**: 118 gear, 62 weapons, 25 armour, 14 vehicles — 145
modern, 77 antique, 34 future, 19 anomalous.
+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(344 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(344 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(344 80% 64%)" stroke-width="4"/>
<path d="M14 58h100v12H14z M52 40h12v46H52z" fill="hsl(344 55% 82%)" stroke="none"/>
<path d="M20 46c18 8 18 28 0 36M108 46c-18 8-18 28 0 36" fill="none" stroke="hsl(344 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 565 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(20 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(20 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(20 80% 64%)" stroke-width="4"/>
<path d="M64 8l10 10v58H54V18z M40 76h48v10H40z M58 86h12v34H58z" fill="hsl(20 55% 82%)" stroke="none"/>
<path d="M62 20h4v52h-4z M60 108h8v8h-8z" fill="hsl(20 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 502 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(330 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(330 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(330 80% 64%)" stroke-width="4"/>
<path d="M10 66h96l14-6v8l-14 6v6H62l-10 14H24l10-14H10z" fill="hsl(330 55% 82%)" stroke="none"/>
<path d="M40 70h26v6H40z M66 56l8-8 6 6-8 8z" fill="hsl(330 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 503 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(56 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(56 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(56 80% 64%)" stroke-width="4"/>
<path d="M78 12l12 12-44 44-12-12z M40 60l12 12-8 12-16-4z M34 84l10 10-16 16-10-10z" fill="hsl(56 55% 82%)" stroke="none"/>
<path d="M74 22l6 6-38 38-6-6z" fill="hsl(56 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 512 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(50 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(50 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(50 80% 64%)" stroke-width="4"/>
<path d="M52 14h14v106H52z M66 20c22 0 34 14 34 26s-12 24-34 24z" fill="hsl(50 55% 82%)" stroke="none"/>
<path d="M72 30c12 2 18 10 18 16s-6 14-18 16z" fill="hsl(50 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 507 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(324 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(324 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(324 80% 64%)" stroke-width="4"/>
<path d="M12 46h58v10H12z M12 60h58v10H12z M70 44l30 16-30 16z" fill="hsl(324 55% 82%)" stroke="none"/>
<path d="M100 52h16v16h-16z M20 48h14v4H20z" fill="hsl(324 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 508 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(352 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(352 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(352 80% 64%)" stroke-width="4"/>
<path d="M62 8l10 26-10 12-10-12z M58 46h12v74H58z" fill="hsl(352 55% 82%)" stroke="none"/>
<path d="M60 20h8v12h-8z M56 92h16v6H56z" fill="hsl(352 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 493 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(235 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(235 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(235 80% 64%)" stroke-width="4"/>
<path d="M22 34h84v34c0 26-20 46-42 52-22-6-42-26-42-52z" fill="hsl(235 55% 82%)" stroke="none"/>
<path d="M44 56h14M70 56h14" fill="none" stroke="hsl(235 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 550 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(44 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(44 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(44 80% 64%)" stroke-width="4"/>
<path d="M10 66h96l14-6v8l-14 6v6H62l-10 14H24l10-14H10z" fill="hsl(44 55% 82%)" stroke="none"/>
<path d="M40 70h26v6H40z M66 56l8-8 6 6-8 8z" fill="hsl(44 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 498 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(239 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(239 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(239 80% 64%)" stroke-width="4"/>
<path d="M42 22h44l12 16v62H30V38z" fill="hsl(239 55% 82%)" stroke="none"/>
<path d="M64 22v78 M30 54h68" fill="none" stroke="hsl(239 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 529 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(175 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(175 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(175 80% 64%)" stroke-width="4"/>
<path d="M40 20h48l10 18v56a10 10 0 0 1-10 10H40a10 10 0 0 1-10-10V38z" fill="hsl(175 55% 82%)" stroke="none"/>
<path d="M64 20v84 M38 46h20M74 46h20" fill="none" stroke="hsl(175 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 574 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(221 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(221 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(221 80% 64%)" stroke-width="4"/>
<path d="M64 12l40 14v40c0 28-18 44-40 50-22-6-40-22-40-50V26z" fill="hsl(221 55% 82%)" stroke="none"/>
<path d="M64 26l26 10v30c0 18-12 28-26 32-14-4-26-14-26-32V36z" fill="hsl(221 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 527 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(157 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(157 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(157 80% 64%)" stroke-width="4"/>
<path d="M64 12l40 14v40c0 28-18 44-40 50-22-6-40-22-40-50V26z" fill="hsl(157 55% 82%)" stroke="none"/>
<path d="M64 26l26 10v30c0 18-12 28-26 32-14-4-26-14-26-32V36z" fill="hsl(157 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 527 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(72 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(72 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(72 80% 64%)" stroke-width="4"/>
<path d="M64 8l10 10v58H54V18z M40 76h48v10H40z M58 86h12v34H58z" fill="hsl(72 55% 82%)" stroke="none"/>
<path d="M62 20h4v52h-4z M60 108h8v8h-8z" fill="hsl(72 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 502 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(8 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(8 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(8 80% 64%)" stroke-width="4"/>
<path d="M78 12l12 12-44 44-12-12z M40 60l12 12-8 12-16-4z M34 84l10 10-16 16-10-10z" fill="hsl(8 55% 82%)" stroke="none"/>
<path d="M74 22l6 6-38 38-6-6z" fill="hsl(8 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 507 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(44 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(44 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(44 80% 64%)" stroke-width="4"/>
<path d="M64 8l10 10v58H54V18z M40 76h48v10H40z M58 86h12v34H58z" fill="hsl(44 55% 82%)" stroke="none"/>
<path d="M62 20h4v52h-4z M60 108h8v8h-8z" fill="hsl(44 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 502 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(348 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(348 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(348 80% 64%)" stroke-width="4"/>
<path d="M44 100l40-72 14 8-40 72z M84 18a12 12 0 1 1 18 10 12 12 0 0 1-18-10z" fill="hsl(348 55% 82%)" stroke="none"/>
<path d="M52 96l32-58" fill="none" stroke="hsl(348 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 566 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(181 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(181 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(181 80% 64%)" stroke-width="4"/>
<path d="M40 20h48l10 18v56a10 10 0 0 1-10 10H40a10 10 0 0 1-10-10V38z" fill="hsl(181 55% 82%)" stroke="none"/>
<path d="M64 20v84 M38 46h20M74 46h20" fill="none" stroke="hsl(181 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 574 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(189 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(189 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(189 80% 64%)" stroke-width="4"/>
<path d="M42 22h44l12 16v62H30V38z" fill="hsl(189 55% 82%)" stroke="none"/>
<path d="M64 22v78 M30 54h68" fill="none" stroke="hsl(189 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 529 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(358 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(358 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(358 80% 64%)" stroke-width="4"/>
<path d="M62 8l10 26-10 12-10-12z M58 46h12v74H58z" fill="hsl(358 55% 82%)" stroke="none"/>
<path d="M60 20h8v12h-8z M56 92h16v6H56z" fill="hsl(358 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 493 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(169 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(169 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(169 80% 64%)" stroke-width="4"/>
<path d="M64 12l40 14v40c0 28-18 44-40 50-22-6-40-22-40-50V26z" fill="hsl(169 55% 82%)" stroke="none"/>
<path d="M64 26l26 10v30c0 18-12 28-26 32-14-4-26-14-26-32V36z" fill="hsl(169 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 527 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(229 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(229 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(229 80% 64%)" stroke-width="4"/>
<path d="M40 20h48l10 18v56a10 10 0 0 1-10 10H40a10 10 0 0 1-10-10V38z" fill="hsl(229 55% 82%)" stroke="none"/>
<path d="M64 20v84 M38 46h20M74 46h20" fill="none" stroke="hsl(229 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 574 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(26 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(26 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(26 80% 64%)" stroke-width="4"/>
<path d="M62 8l10 26-10 12-10-12z M58 46h12v74H58z" fill="hsl(26 55% 82%)" stroke="none"/>
<path d="M60 20h8v12h-8z M56 92h16v6H56z" fill="hsl(26 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 488 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(54 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(54 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(54 80% 64%)" stroke-width="4"/>
<path d="M12 60h84l20-8v12l-14 6v8H60l-8 14H32l8-14H12z" fill="hsl(54 55% 82%)" stroke="none"/>
<path d="M46 66h30v6H46z M84 52h10v8H84z" fill="hsl(54 40% 52%)" stroke="none"/>
<path d="M116 58h6v10h-6z" fill="hsl(54 80% 64%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 558 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(247 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(247 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(247 80% 64%)" stroke-width="4"/>
<path d="M22 34h84v34c0 26-20 46-42 52-22-6-42-26-42-52z" fill="hsl(247 55% 82%)" stroke="none"/>
<path d="M44 56h14M70 56h14" fill="none" stroke="hsl(247 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 550 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(338 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(338 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(338 80% 64%)" stroke-width="4"/>
<path d="M40 16c30 14 30 82 0 96M36 12v104" fill="none" stroke="hsl(338 55% 82%)" stroke-width="9" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M40 16l52 48-52 48" fill="hsl(338 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 536 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(12 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(12 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(12 80% 64%)" stroke-width="4"/>
<path d="M64 8l10 10v58H54V18z M40 76h48v10H40z M58 86h12v34H58z" fill="hsl(12 55% 82%)" stroke="none"/>
<path d="M62 20h4v52h-4z M60 108h8v8h-8z" fill="hsl(12 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 502 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(54 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(54 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(54 80% 64%)" stroke-width="4"/>
<path d="M44 100l40-72 14 8-40 72z M84 18a12 12 0 1 1 18 10 12 12 0 0 1-18-10z" fill="hsl(54 55% 82%)" stroke="none"/>
<path d="M52 96l32-58" fill="none" stroke="hsl(54 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 561 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(183 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(183 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(183 80% 64%)" stroke-width="4"/>
<path d="M40 20h48l10 18v56a10 10 0 0 1-10 10H40a10 10 0 0 1-10-10V38z" fill="hsl(183 55% 82%)" stroke="none"/>
<path d="M40 40h12v12H40zM60 40h12v12H60zM80 40h10v12H80zM50 56h12v12H50zM70 56h12v12H70zM40 72h12v12H40zM60 72h12v12H60zM80 72h10v12H80z" fill="hsl(183 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 610 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(64 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(64 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(64 80% 64%)" stroke-width="4"/>
<path d="M78 12l12 12-44 44-12-12z M40 60l12 12-8 12-16-4z M34 84l10 10-16 16-10-10z" fill="hsl(64 55% 82%)" stroke="none"/>
<path d="M74 22l6 6-38 38-6-6z" fill="hsl(64 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 512 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(326 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(326 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(326 80% 64%)" stroke-width="4"/>
<path d="M12 60h84l20-8v12l-14 6v8H60l-8 14H32l8-14H12z" fill="hsl(326 55% 82%)" stroke="none"/>
<path d="M46 66h30v6H46z M84 52h10v8H84z" fill="hsl(326 40% 52%)" stroke="none"/>
<path d="M116 58h6v10h-6z" fill="hsl(326 80% 64%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 564 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(334 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(334 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(334 80% 64%)" stroke-width="4"/>
<path d="M10 66h96l14-6v8l-14 6v6H62l-10 14H24l10-14H10z" fill="hsl(334 55% 82%)" stroke="none"/>
<path d="M40 70h26v6H40z M66 56l8-8 6 6-8 8z" fill="hsl(334 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 503 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(58 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(58 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(58 80% 64%)" stroke-width="4"/>
<path d="M62 8l10 26-10 12-10-12z M58 46h12v74H58z" fill="hsl(58 55% 82%)" stroke="none"/>
<path d="M60 20h8v12h-8z M56 92h16v6H56z" fill="hsl(58 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 488 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(6 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(6 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(6 80% 64%)" stroke-width="4"/>
<path d="M52 14h14v106H52z M66 20c22 0 34 14 34 26s-12 24-34 24z" fill="hsl(6 55% 82%)" stroke="none"/>
<path d="M72 30c12 2 18 10 18 16s-6 14-18 16z" fill="hsl(6 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 502 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(2 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(2 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(2 80% 64%)" stroke-width="4"/>
<path d="M52 12h24v92H52z M44 104h40v14H44z" fill="hsl(2 55% 82%)" stroke="none"/>
<path d="M58 24h12v70H58z M52 12l-8-6h40l-8 6z" fill="hsl(2 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 482 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(344 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(344 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(344 80% 64%)" stroke-width="4"/>
<path d="M64 8l10 10v58H54V18z M40 76h48v10H40z M58 86h12v34H58z" fill="hsl(344 55% 82%)" stroke="none"/>
<path d="M62 20h4v52h-4z M60 108h8v8h-8z" fill="hsl(344 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 507 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(68 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(68 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(68 80% 64%)" stroke-width="4"/>
<path d="M64 8l10 10v58H54V18z M40 76h48v10H40z M58 86h12v34H58z" fill="hsl(68 55% 82%)" stroke="none"/>
<path d="M62 20h4v52h-4z M60 108h8v8h-8z" fill="hsl(68 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 502 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(163 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(163 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(163 80% 64%)" stroke-width="4"/>
<path d="M22 34h84v34c0 26-20 46-42 52-22-6-42-26-42-52z" fill="hsl(163 55% 82%)" stroke="none"/>
<path d="M44 56h14M70 56h14" fill="none" stroke="hsl(163 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 550 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(46 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(46 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(46 80% 64%)" stroke-width="4"/>
<path d="M32 20c40 0 24 44 64 44M32 64c40 0 24 44 64 44" fill="none" stroke="hsl(46 55% 82%)" stroke-width="9" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 477 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(336 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(336 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(336 80% 64%)" stroke-width="4"/>
<path d="M64 8l10 10v58H54V18z M40 76h48v10H40z M58 86h12v34H58z" fill="hsl(336 55% 82%)" stroke="none"/>
<path d="M62 20h4v52h-4z M60 108h8v8h-8z" fill="hsl(336 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 507 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(46 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(46 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(46 80% 64%)" stroke-width="4"/>
<path d="M44 100l40-72 14 8-40 72z M84 18a12 12 0 1 1 18 10 12 12 0 0 1-18-10z" fill="hsl(46 55% 82%)" stroke="none"/>
<path d="M52 96l32-58" fill="none" stroke="hsl(46 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 561 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(354 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(354 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(354 80% 64%)" stroke-width="4"/>
<path d="M44 100l40-72 14 8-40 72z M84 18a12 12 0 1 1 18 10 12 12 0 0 1-18-10z" fill="hsl(354 55% 82%)" stroke="none"/>
<path d="M52 96l32-58" fill="none" stroke="hsl(354 40% 52%)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 566 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(50 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(50 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(50 80% 64%)" stroke-width="4"/>
<path d="M20 60h48l8-8h18v12l-10 6v10H56l-8 14H26l8-14H20z" fill="hsl(50 55% 82%)" stroke="none"/>
<path d="M44 56a10 10 0 1 1 0 20 10 10 0 0 1 0-20z M28 70h14v8H28z" fill="hsl(50 40% 52%)" stroke="none"/>
<path d="M110 58h10v10h-10z" fill="hsl(50 80% 64%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 589 B

+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
<rect width="128" height="128" rx="20" fill="hsl(36 38% 30%)"/>
<path d="M0 0h30L0 30z" fill="hsl(36 44% 22%)"/>
<rect x="5" y="5" width="118" height="118" rx="16" fill="none" stroke="hsl(36 80% 64%)" stroke-width="4"/>
<path d="M18 64h44l40-16v10L70 74v8H56l-10 16H22l10-16H18z" fill="hsl(36 55% 82%)" stroke="none"/>
<path d="M56 54l10-8 6 8-8 8z M26 72h16v8H26z" fill="hsl(36 40% 52%)" stroke="none"/>
</svg>

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.973855 176c6b000 Recovering log #3
2026/08/10-22:32:12.973885 176c6b000 Level-0 table #5: started
2026/08/10-22:32:12.974038 176c6b000 Level-0 table #5: 1902 bytes OK
2026/08/10-22:32:12.974280 176c6b000 Delete type=0 #3
2026/08/10-22:32:12.974308 176c6b000 Delete type=3 #2
2026/08/10-23:01:08.486571 174d33000 Recovering log #3
2026/08/10-23:01:08.486599 174d33000 Level-0 table #5: started
2026/08/10-23:01:08.486723 174d33000 Level-0 table #5: 3269 bytes OK
2026/08/10-23:01:08.486979 174d33000 Delete type=0 #3
2026/08/10-23:01:08.487023 174d33000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.503621 173c33000 Delete type=3 #1
2026/08/10-23:01:00.231905 1712a7000 Delete type=3 #1
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.981648 175c53000 Recovering log #3
2026/08/10-22:32:12.981671 175c53000 Level-0 table #5: started
2026/08/10-22:32:12.981789 175c53000 Level-0 table #5: 4129 bytes OK
2026/08/10-22:32:12.982001 175c53000 Delete type=0 #3
2026/08/10-22:32:12.982027 175c53000 Delete type=3 #2
2026/08/10-23:01:08.493618 174527000 Recovering log #3
2026/08/10-23:01:08.493643 174527000 Level-0 table #5: started
2026/08/10-23:01:08.493808 174527000 Level-0 table #5: 4129 bytes OK
2026/08/10-23:01:08.494041 174527000 Delete type=0 #3
2026/08/10-23:01:08.494071 174527000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.529273 173427000 Delete type=3 #1
2026/08/10-23:01:00.256291 17028f000 Delete type=3 #1
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.974890 175c53000 Recovering log #3
2026/08/10-22:32:12.974992 175c53000 Level-0 table #5: started
2026/08/10-22:32:12.975288 175c53000 Level-0 table #5: 27954 bytes OK
2026/08/10-22:32:12.975563 175c53000 Delete type=0 #3
2026/08/10-22:32:12.975595 175c53000 Delete type=3 #2
2026/08/10-23:01:08.487664 174527000 Recovering log #3
2026/08/10-23:01:08.487759 174527000 Level-0 table #5: started
2026/08/10-23:01:08.488053 174527000 Level-0 table #5: 27954 bytes OK
2026/08/10-23:01:08.488346 174527000 Delete type=0 #3
2026/08/10-23:01:08.488387 174527000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.505520 173427000 Delete type=3 #1
2026/08/10-23:01:00.233897 17028f000 Delete type=3 #1
Binary file not shown.
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.967115 176c6b000 Recovering log #3
2026/08/10-22:32:12.967360 176c6b000 Level-0 table #5: started
2026/08/10-22:32:12.967874 176c6b000 Level-0 table #5: 60660 bytes OK
2026/08/10-22:32:12.968240 176c6b000 Delete type=0 #3
2026/08/10-22:32:12.968279 176c6b000 Delete type=3 #2
2026/08/10-23:01:08.479221 174527000 Recovering log #3
2026/08/10-23:01:08.479486 174527000 Level-0 table #5: started
2026/08/10-23:01:08.480007 174527000 Level-0 table #5: 64974 bytes OK
2026/08/10-23:01:08.480345 174527000 Delete type=0 #3
2026/08/10-23:01:08.480411 174527000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.516977 173427000 Delete type=3 #1
2026/08/10-23:01:00.243997 1712a7000 Delete type=3 #1
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.971869 176c6b000 Recovering log #3
2026/08/10-22:32:12.971889 176c6b000 Level-0 table #5: started
2026/08/10-22:32:12.971986 176c6b000 Level-0 table #5: 3295 bytes OK
2026/08/10-22:32:12.972215 176c6b000 Delete type=0 #3
2026/08/10-22:32:12.972245 176c6b000 Delete type=3 #2
2026/08/10-23:01:08.484216 174d33000 Recovering log #3
2026/08/10-23:01:08.484239 174d33000 Level-0 table #5: started
2026/08/10-23:01:08.484351 174d33000 Level-0 table #5: 3295 bytes OK
2026/08/10-23:01:08.484635 174d33000 Delete type=0 #3
2026/08/10-23:01:08.484666 174d33000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.523352 17443f000 Delete type=3 #1
2026/08/10-23:01:00.249869 171ab3000 Delete type=3 #1
Binary file not shown.
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.964849 176c6b000 Recovering log #3
2026/08/10-22:32:12.965070 176c6b000 Level-0 table #5: started
2026/08/10-22:32:12.965545 176c6b000 Level-0 table #5: 54921 bytes OK
2026/08/10-22:32:12.965828 176c6b000 Delete type=0 #3
2026/08/10-22:32:12.965870 176c6b000 Delete type=3 #2
2026/08/10-23:01:08.476733 174527000 Recovering log #3
2026/08/10-23:01:08.476990 174527000 Level-0 table #5: started
2026/08/10-23:01:08.477569 174527000 Level-0 table #5: 57435 bytes OK
2026/08/10-23:01:08.477881 174527000 Delete type=0 #3
2026/08/10-23:01:08.477921 174527000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.512409 173c33000 Delete type=3 #1
2026/08/10-23:01:00.239525 171ab3000 Delete type=3 #1
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.977501 175c53000 Recovering log #3
2026/08/10-22:32:12.977559 175c53000 Level-0 table #5: started
2026/08/10-22:32:12.977822 175c53000 Level-0 table #5: 24724 bytes OK
2026/08/10-22:32:12.978082 175c53000 Delete type=0 #3
2026/08/10-22:32:12.978112 175c53000 Delete type=3 #2
2026/08/10-23:01:08.489989 174527000 Recovering log #3
2026/08/10-23:01:08.490045 174527000 Level-0 table #5: started
2026/08/10-23:01:08.490287 174527000 Level-0 table #5: 24724 bytes OK
2026/08/10-23:01:08.490582 174527000 Delete type=0 #3
2026/08/10-23:01:08.490609 174527000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.527542 173427000 Delete type=3 #1
2026/08/10-23:01:00.254751 17028f000 Delete type=3 #1
Binary file not shown.
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.969519 176c6b000 Recovering log #3
2026/08/10-22:32:12.969561 176c6b000 Level-0 table #5: started
2026/08/10-22:32:12.969704 176c6b000 Level-0 table #5: 6679 bytes OK
2026/08/10-22:32:12.969923 176c6b000 Delete type=0 #3
2026/08/10-22:32:12.969956 176c6b000 Delete type=3 #2
2026/08/10-23:01:08.481697 175d4b000 Recovering log #3
2026/08/10-23:01:08.481745 175d4b000 Level-0 table #5: started
2026/08/10-23:01:08.481926 175d4b000 Level-0 table #5: 7486 bytes OK
2026/08/10-23:01:08.482244 175d4b000 Delete type=0 #3
2026/08/10-23:01:08.482280 175d4b000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.496771 172c1b000 Delete type=3 #1
2026/08/10-23:01:00.226054 1712a7000 Delete type=3 #1
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.978843 176c6b000 Recovering log #3
2026/08/10-22:32:12.978881 176c6b000 Level-0 table #5: started
2026/08/10-22:32:12.979146 176c6b000 Level-0 table #5: 16892 bytes OK
2026/08/10-22:32:12.979428 176c6b000 Delete type=0 #3
2026/08/10-22:32:12.979473 176c6b000 Delete type=3 #2
2026/08/10-23:01:08.491211 175d4b000 Recovering log #3
2026/08/10-23:01:08.491246 175d4b000 Level-0 table #5: started
2026/08/10-23:01:08.491445 175d4b000 Level-0 table #5: 16892 bytes OK
2026/08/10-23:01:08.491649 175d4b000 Delete type=0 #3
2026/08/10-23:01:08.491673 175d4b000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.521709 173427000 Delete type=3 #1
2026/08/10-23:01:00.248248 1712a7000 Delete type=3 #1
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.980418 177477000 Recovering log #3
2026/08/10-22:32:12.980441 177477000 Level-0 table #5: started
2026/08/10-22:32:12.980589 177477000 Level-0 table #5: 3739 bytes OK
2026/08/10-22:32:12.980853 177477000 Delete type=0 #3
2026/08/10-22:32:12.980897 177477000 Delete type=3 #2
2026/08/10-23:01:08.492361 174d33000 Recovering log #3
2026/08/10-23:01:08.492389 174d33000 Level-0 table #5: started
2026/08/10-23:01:08.492537 174d33000 Level-0 table #5: 3739 bytes OK
2026/08/10-23:01:08.492829 174d33000 Delete type=0 #3
2026/08/10-23:01:08.492874 174d33000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.519333 17443f000 Delete type=3 #1
2026/08/10-23:01:00.246465 17028f000 Delete type=3 #1
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.970762 175c53000 Recovering log #3
2026/08/10-22:32:12.970797 175c53000 Level-0 table #5: started
2026/08/10-22:32:12.970957 175c53000 Level-0 table #5: 5105 bytes OK
2026/08/10-22:32:12.971239 175c53000 Delete type=0 #3
2026/08/10-22:32:12.971280 175c53000 Delete type=3 #2
2026/08/10-23:01:08.482999 174527000 Recovering log #3
2026/08/10-23:01:08.483024 174527000 Level-0 table #5: started
2026/08/10-23:01:08.483159 174527000 Level-0 table #5: 5105 bytes OK
2026/08/10-23:01:08.483436 174527000 Delete type=0 #3
2026/08/10-23:01:08.483488 174527000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.499747 17443f000 Delete type=3 #1
2026/08/10-23:01:00.228585 17028f000 Delete type=3 #1
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.976337 17645f000 Recovering log #3
2026/08/10-22:32:12.976362 17645f000 Level-0 table #5: started
2026/08/10-22:32:12.976676 17645f000 Level-0 table #5: 5012 bytes OK
2026/08/10-22:32:12.976911 17645f000 Delete type=0 #3
2026/08/10-22:32:12.976944 17645f000 Delete type=3 #2
2026/08/10-23:01:08.489065 174d33000 Recovering log #3
2026/08/10-23:01:08.489088 174d33000 Level-0 table #5: started
2026/08/10-23:01:08.489205 174d33000 Level-0 table #5: 5012 bytes OK
2026/08/10-23:01:08.489400 174d33000 Delete type=0 #3
2026/08/10-23:01:08.489423 174d33000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.507484 17443f000 Delete type=3 #1
2026/08/10-23:01:00.235861 171ab3000 Delete type=3 #1
Binary file not shown.
Binary file not shown.
+5 -5
View File
@@ -1,5 +1,5 @@
2026/08/10-22:32:12.972748 175c53000 Recovering log #3
2026/08/10-22:32:12.972787 175c53000 Level-0 table #5: started
2026/08/10-22:32:12.972935 175c53000 Level-0 table #5: 7240 bytes OK
2026/08/10-22:32:12.973189 175c53000 Delete type=0 #3
2026/08/10-22:32:12.973238 175c53000 Delete type=3 #2
2026/08/10-23:01:08.485281 174527000 Recovering log #3
2026/08/10-23:01:08.485346 174527000 Level-0 table #5: started
2026/08/10-23:01:08.485576 174527000 Level-0 table #5: 14767 bytes OK
2026/08/10-23:01:08.485871 174527000 Delete type=0 #3
2026/08/10-23:01:08.485924 174527000 Delete type=3 #2
+1 -1
View File
@@ -1 +1 @@
2026/08/10-22:32:04.502054 173427000 Delete type=3 #1
2026/08/10-23:01:00.230385 171ab3000 Delete type=3 #1
Binary file not shown.
+3 -1
View File
@@ -2709,7 +2709,9 @@ export async function generateMissionCase({ seed = null, notify = true, ...opts
// These were the wrong way round — the brief was set to NONE and the four
// secret pages to INHERIT, so a GM opening the entry to the table to share the
// brief would have published the truth, the opposition and the whole plot.
ownership: { default: i === 0 ? 2 : 0 }
// Ownership is declared by the page, not guessed from its index. Adding a
// second player page silently hid it when this read `i === 0`.
ownership: { default: pg.players ? 2 : 0 }
}))
});
+73 -2
View File
@@ -27,6 +27,10 @@ export const SKILL_CATALOGUE = [
// The boarding axe and the entrenching tool both declare spec "axe" and the
// catalogue had no such skill, so neither could ever be rated above zero.
["melee_weapon", "axe", "melee", 5, "Melee Weapon (Axe)"],
// The historical range needs somewhere to hang a halberd and a flail. Everything
// else fits an existing specialisation: a mace is a club, a dirk is a knife.
["melee_weapon", "polearm", "melee", 5, "Melee Weapon (Polearm)"],
["melee_weapon", "flail", "melee", 5, "Melee Weapon (Flail)"],
["variable_sword", "", "melee", 5, "Variable Sword"],
// ranged
["firearm", "pistol", "ranged", 5, "Firearm (Pistol)"],
@@ -35,6 +39,10 @@ export const SKILL_CATALOGUE = [
["energy_weapon", "rifle", "ranged", 5, "Energy Weapon (Rifle)"],
["flashlight_laser", "", "ranged", 5, "Flashlight Laser"],
["missile_weapon", "bow", "ranged", 5, "Missile Weapon (Bow)"],
["missile_weapon", "sling", "ranged", 5, "Missile Weapon (Sling)"],
["missile_weapon", "thrown", "ranged", 15, "Missile Weapon (Thrown)"],
// A muzzle-loader is not a rifle. Loading is the skill and it is a different one.
["firearm", "muzzleloader", "ranged", 5, "Firearm (Muzzle-loader)"],
["heavy_weapon", "", "ranged", 5, "Heavy Weapon"],
// communication
["bargain", "", "comm", 5, "Bargain"],
@@ -120,7 +128,55 @@ export const WEAPONS = [
/* ---------- FUTURE. Recovered from somewhere ahead. ---------- */
{ key: "gauss_pistol",name: "Gauss sidearm", cls: "energy", fam: "energy_weapon", spec: "pistol", dmg: "1d8+4", wound: "piercing", mod: false, ranges: [15,45,120], fire: "single", cap: 24, mass: 0.9, era: "future", trad: "tradition_transposed", energy: 4, desc: "No propellant and no report — a tap, and a hole. Ammunition is not manufacturable here." },
{ key: "gauss_rifle", name: "Gauss lance-rifle", cls: "energy", fam: "energy_weapon", spec: "rifle", dmg: "1d12+4", wound: "piercing", mod: false, ranges: [40,120,300], fire: "single", cap: 12, mass: 3.8, era: "future", trad: "tradition_transposed", energy: 8, desc: "Punches an entry wound and an exit wound and very little between them." },
{ key: "monoblade", name: "Monofilament blade",cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d10+2", wound: "edged", mod: false, mono: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.4, era: "future", trad: "tradition_transposed", desc: "Cuts armour as though it were not there. Handle with the sheath on." }
{ key: "monoblade", name: "Monofilament blade",cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d10+2", wound: "edged", mod: false, mono: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.4, era: "future", trad: "tradition_transposed", desc: "Cuts armour as though it were not there. Handle with the sheath on." },
/* ==================================================================
THE HISTORICAL RANGE
The department has been running since before it had a name, and it
has never thrown anything away. Everything below is either still in
a store somewhere in the building, or came back through a crossing
with somebody. The period note is not decoration — a GM handing out
a matchlock should know it is a matchlock.
================================================================== */
/* --- medieval --- */
{ key: "arming_sword", name: "Arming sword", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+1", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.2, era: "antique", trad: "tradition_local", desc: "Medieval. A yard of cross-hilted steel. The plain, correct answer to most of the fifteenth century." },
{ key: "longsword", name: "Longsword", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d10+1", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.6, era: "antique", trad: "tradition_local", desc: "Medieval. Hand and a half. Wants room and rewards someone who has been taught." },
{ key: "falchion", name: "Falchion", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.5, era: "antique", trad: "tradition_local", desc: "Medieval. Heavy at the tip and unsubtle. A cleaver that got above itself." },
{ key: "war_hammer", name: "War hammer", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d8+2", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.7, era: "antique", trad: "tradition_local", desc: "Medieval. For plate, which it does not cut so much as dent inwards." },
{ key: "mace", name: "Mace", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d8+1", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.4, era: "antique", trad: "tradition_local", desc: "Medieval. Flanged. Requires no skill worth the name and never breaks." },
{ key: "flail", name: "Military flail", cls: "melee", fam: "melee_weapon", spec: "flail", dmg: "1d10", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 2.0, era: "antique", trad: "tradition_local", desc: "Medieval. Goes round a shield and is nearly as dangerous behind you as in front." },
{ key: "poleaxe", name: "Poleaxe", cls: "melee", fam: "melee_weapon", spec: "polearm", dmg: "1d10+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 3.0, era: "antique", trad: "tradition_local", desc: "Medieval. Axe, hammer and spike on six feet of ash. The best answer to armour anyone found before gunpowder." },
{ key: "halberd", name: "Halberd", cls: "melee", fam: "melee_weapon", spec: "polearm", dmg: "1d10+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 3.2, era: "antique", trad: "tradition_local", desc: "Medieval. Cut, thrust or pull a rider off a horse. Useless indoors and the department keeps eleven." },
{ key: "billhook", name: "Billhook", cls: "melee", fam: "melee_weapon", spec: "polearm", dmg: "1d8+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 2.6, era: "antique", trad: "tradition_local", desc: "Medieval. A hedging tool with ambitions. Every parish had a rack of them." },
{ key: "pike", name: "Pike", cls: "melee", fam: "melee_weapon", spec: "spear", dmg: "1d10+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 4.5, era: "antique", trad: "tradition_local", desc: "Medieval to Civil War. Sixteen feet. Magnificent in a field, absurd in a corridor." },
{ key: "quarterstaff", name: "Quarterstaff", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d8", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.8, era: "antique", trad: "tradition_local", desc: "Medieval. Six foot of ash. Legal to carry, which is most of the point." },
{ key: "dirk", name: "Dirk", cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d4+2", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.4, era: "antique", trad: "tradition_local", desc: "Medieval onward. Long in the blade for a knife and worn where a knife is not expected." },
{ key: "longbow", name: "Longbow", cls: "bow", fam: "missile_weapon", spec: "bow", dmg: "1d10+1", wound: "piercing", mod: false, ranges: [30,90,180], fire: "fast", cap: 1, mass: 1.0, era: "antique", trad: "tradition_local", desc: "Medieval. Yew, and a draw weight that deforms the man who uses it. Faster than any firearm here." },
{ key: "arbalest", name: "Arbalest", cls: "bow", fam: "missile_weapon", spec: "bow", dmg: "1d12", wound: "piercing", mod: false, ranges: [25,60,130], fire: "slow", cap: 1, mass: 5.0, era: "antique", trad: "tradition_local", desc: "Medieval. Steel prod, windlass span. One shot, and it goes through what it hits." },
{ key: "sling", name: "Sling", cls: "bow", fam: "missile_weapon", spec: "sling", dmg: "1d8", wound: "blunt", mod: false, ranges: [20,50,110], fire: "fast", cap: 1, mass: 0.1, era: "antique", trad: "tradition_local", desc: "Ancient, and never actually obsolete. Ammunition is whatever is on the ground." },
{ key: "javelin", name: "Javelin", cls: "thrown", fam: "missile_weapon", spec: "thrown", dmg: "1d8+1", wound: "piercing", mod: true, ranges: [10,20,40], fire: "fast", cap: 1, mass: 0.9, era: "antique", trad: "tradition_local", desc: "Ancient. Thrown, and then it is on the ground and somebody else has it." },
/* --- early modern --- */
{ key: "rapier", name: "Rapier", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.1, era: "antique", trad: "tradition_local", desc: "Early modern. A yard and a half of point. For duels and for men who expect to be attacked in a street." },
{ key: "main_gauche", name: "Main gauche", cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d4+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.5, era: "antique", trad: "tradition_local", desc: "Early modern. The left-hand dagger. Its real job is catching the other man's blade." },
{ key: "matchlock", name: "Matchlock musket", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "1d10+2", wound: "piercing", mod: false, ranges: [15,40,90], fire: "slow", cap: 1, mass: 4.8, era: "antique", trad: "tradition_local", desc: "Early modern. A burning cord and a prayer. Announces itself for a hundred yards before it fires." },
{ key: "wheellock", name: "Wheellock pistol", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "1d8+1", wound: "piercing", mod: false, ranges: [8,18,35], fire: "slow", cap: 1, mass: 1.6, era: "antique", trad: "tradition_local", desc: "Early modern. Clockwork ignition, ruinously expensive, and it works in the rain." },
{ key: "blunderbuss", name: "Blunderbuss", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "2d6+2", wound: "piercing", mod: false, ranges: [5,12,25], fire: "slow", cap: 1, mass: 4.0, era: "antique", trad: "tradition_local", desc: "Early modern. Load it with whatever is to hand. Terrible past twenty feet and decisive within it." },
{ key: "boarding_pike", name: "Boarding pike", cls: "melee", fam: "melee_weapon", spec: "spear", dmg: "1d8+2", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 2.4, era: "antique", trad: "tradition_local", desc: "Early modern. Short enough for a deck. The department has them because the department used to have ships." },
/* --- Napoleonic and Victorian --- */
{ key: "sabre", name: "Cavalry sabre", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+2", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.3, era: "antique", trad: "tradition_local", desc: "Napoleonic. Curved, and meant to be used going past somebody at speed." },
{ key: "smallsword", name: "Smallsword", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d6+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.6, era: "antique", trad: "tradition_local", desc: "Georgian. Worn with a coat, not with armour. Kills quietly and leaves very little to see." },
{ key: "cutlass", name: "Cutlass", cls: "melee", fam: "melee_weapon", spec: "sword", dmg: "1d8+1", wound: "edged", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.1, era: "antique", trad: "tradition_local", desc: "Georgian. Short, heavy, and it does not care what it hits on the backswing." },
{ key: "brown_bess", name: "Brown Bess", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "1d10+3", wound: "piercing", mod: false, ranges: [20,50,100], fire: "slow", cap: 1, mass: 4.4, era: "antique", trad: "tradition_local", desc: "Napoleonic. Smoothbore, inaccurate, and it will take an arm off at fifty yards." },
{ key: "baker_rifle", name: "Baker rifle", cls: "firearm", fam: "firearm", spec: "muzzleloader", dmg: "1d10+2", wound: "piercing", mod: false, ranges: [40,110,250], fire: "slow", cap: 1, mass: 4.2, era: "antique", trad: "tradition_local", desc: "Napoleonic. Rifled, and slow to load precisely because it is. The first weapon here that rewards patience." },
{ key: "bayonet", name: "Socket bayonet", cls: "melee", fam: "melee_weapon", spec: "knife", dmg: "1d6+1", wound: "piercing", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 0.5, era: "antique", trad: "tradition_local", desc: "Napoleonic onward. On the end of a musket it is a spear; off it, an awkward knife." },
{ key: "martini", name: "Martini-Henry", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "2d6+2", wound: "piercing", mod: false, ranges: [50,150,350], fire: "slow", cap: 1, mass: 4.0, era: "antique", trad: "tradition_local", desc: "Victorian. Single shot, falling block, and a recoil that has bruised generations." },
{ key: "webley", name: "Webley revolver", cls: "firearm", fam: "firearm", spec: "pistol", dmg: "1d10", wound: "piercing", mod: false, ranges: [10,25,50], fire: "fast", cap: 6, mass: 1.1, era: "antique", trad: "tradition_local", desc: "Victorian to the Great War. Breaks open, ejects all six at once, and is still in a drawer upstairs." },
{ key: "lee_enfield", name: "Lee-Enfield", cls: "firearm", fam: "firearm", spec: "rifle", dmg: "2d6+2", wound: "piercing", mod: false, ranges: [60,200,500], fire: "fast", cap: 10, mass: 4.0, era: "antique", trad: "tradition_local", desc: "Great War. Ten rounds and a bolt a trained man works without looking. The best rifle in this list." },
{ key: "trench_club", name: "Trench club", cls: "melee", fam: "melee_weapon", spec: "club", dmg: "1d8+1", wound: "blunt", mod: true, ranges: [0,0,0], fire: "", cap: 0, mass: 1.2, era: "antique", trad: "tradition_local", desc: "Great War. Made in the line out of a table leg and some nails. Quiet, which was the point." }
];
/* ---------- armour (v0.5 §4.8) ---------- */
@@ -138,7 +194,22 @@ export const ARMOURS = [
{ key: "oilcloth_coat", name: "Oilcloth coat", points: 1, mass: 3.0, era: "antique", trad: "tradition_local", desc: "Keeps the weather out and very little else." },
{ key: "brigandine", name: "Brigandine", points: 4, mass: 9.0, era: "antique", trad: "tradition_local", desc: "Plates riveted between cloth. Heavy, quiet, and older than the agency." },
{ key: "hardsuit", name: "Sealed hardsuit", points: 9, mass: 12.0, era: "future", trad: "tradition_transposed", desc: "Sealed, powered and not from here. Also a breathing set — see Gear." }
{ key: "hardsuit", name: "Sealed hardsuit", points: 9, mass: 12.0, era: "future", trad: "tradition_transposed", desc: "Sealed, powered and not from here. Also a breathing set — see Gear." },
/* --- the historical range. Weight is the point: everything here protects
well and costs you the ability to run in it. --- */
{ key: "gambeson", name: "Gambeson", points: 2, mass: 4.5, era: "antique", trad: "tradition_local", desc: "Medieval. Quilted linen, thirty layers. Worn alone by the poor and under everything by everyone else." },
{ key: "maille_shirt", name: "Maille shirt", points: 4, mass: 7.5, era: "antique", trad: "tradition_local", desc: "Medieval. Stops a cut completely and a spike not at all. Wear it over the gambeson or regret it." },
{ key: "coat_of_plates", name: "Coat of plates", points: 6, mass: 11, era: "antique", trad: "tradition_local", desc: "Medieval. Iron plates riveted inside a fabric coat. The compromise that held for a century." },
{ key: "cuirass", name: "Cuirass", points: 6, mass: 9, era: "antique", trad: "tradition_local", desc: "Early modern. Breast and back. Proof against a pistol at any sensible distance, and stated so by the armourer." },
{ key: "harness", name: "Full harness", points: 9, mass: 25, era: "antique", trad: "tradition_local", desc: "Medieval. Head to foot, articulated, and far more wearable than people think — until the third hour." },
{ key: "buff_coat", name: "Buff coat", points: 3, mass: 5, era: "antique", trad: "tradition_local", desc: "Civil War. Thick ox hide to the knee. Turns a sword, ignores a ball, and never dries out." },
{ key: "sallet", name: "Sallet and bevor", points: 5, mass: 3.2, era: "antique", trad: "tradition_local", desc: "Medieval. Covers the head and the throat and takes most of your hearing with it." },
{ key: "lobster_pot", name: "Lobster-tail helmet", points: 4, mass: 2.6, era: "antique", trad: "tradition_local", desc: "Civil War. Three bars across the face. You can see out; that is all that can be said for it." },
{ key: "jack_of_plate", name: "Jack of plate", points: 4, mass: 6, era: "antique", trad: "tradition_local", desc: "Tudor. Small iron plates stitched between canvas. Looks like a coat until somebody hits it." },
{ key: "cuirassier", name: "Cuirassier armour", points: 8, mass: 18, era: "antique", trad: "tradition_local", desc: "Early modern. Three-quarter plate for a man on a horse. On foot it is a punishment." },
{ key: "brodie", name: "Brodie helmet", points: 3, mass: 1.3, era: "antique", trad: "tradition_local", desc: "Great War. A steel plate on a strap. Designed against shrapnel from above and honest about it." },
{ key: "flak_jacket", name: "Flak jacket", points: 4, mass: 8.5, era: "antique", trad: "tradition_local", desc: "Second War. Manganese plates in a waistcoat. Heavy, hot, and it has saved a great many people." }
];
/* ---------- gear ---------- */
+30 -1
View File
@@ -147,7 +147,36 @@ export const ICON_MAP = {
/* ---- borrowed authority ---- */
authority:["folder","device",0], authority_flagged:["folder","device",26],
authority_burned:["folder","device",-26]
authority_burned:["folder","device",-26],
/* ---- the historical range: medieval ---- */
arming_sword:["sword","melee",-4,"antique"], longsword:["sword","melee",-12,"antique"],
falchion:["sword","melee",20,"antique"], war_hammer:["club","melee",-30,"antique"],
mace:["club","melee",30,"antique"], flail:["club","melee",-36,"antique"],
poleaxe:["axe","melee",-18,"antique"], halberd:["spear","melee",-26,"antique"],
billhook:["axe","melee",26,"antique"], pike:["spear","melee",34,"antique"],
quarterstaff:["bar","melee",-22,"antique"], dirk:["blade","melee",-16,"antique"],
longbow:["bow","weapon",-30,"antique"], arbalest:["crossbow","weapon",-24,"antique"],
sling:["rope","weapon",38,"antique"], javelin:["spear","weapon",18,"antique"],
/* ---- early modern ---- */
rapier:["sword","melee",-40,"antique"], main_gauche:["blade","melee",40,"antique"],
matchlock:["musket","weapon",-34,"antique"], wheellock:["flintlock","weapon",28,"antique"],
blunderbuss:["shotgun","weapon",-44,"antique"], boarding_pike:["spear","melee",-32,"antique"],
/* ---- Napoleonic, Victorian, and the Great War ---- */
sabre:["sword","melee",44,"antique"], smallsword:["sword","melee",-48,"antique"],
cutlass:["sword","melee",48,"antique"], brown_bess:["musket","weapon",36,"antique"],
baker_rifle:["musket","weapon",-38,"antique"], bayonet:["blade","melee",32,"antique"],
martini:["rifle","weapon",-42,"antique"], webley:["revolver","weapon",42,"antique"],
lee_enfield:["rifle","weapon",46,"antique"], trench_club:["club","melee",22,"antique"],
/* ---- historical armour ---- */
gambeson:["jacket","armour",-16,"antique"], maille_shirt:["mail","armour",-22,"antique"],
coat_of_plates:["vest","armour",-30,"antique"], cuirass:["plate","armour",16,"antique"],
harness:["plate","armour",-36,"antique"], buff_coat:["jacket","armour",34,"antique"],
sallet:["mask","armour",-42,"antique"], lobster_pot:["mask","armour",42,"antique"],
jack_of_plate:["vest","armour",24,"antique"], cuirassier:["plate","armour",-48,"antique"],
brodie:["mask","armour",30,"antique"], flak_jacket:["vest","armour",-24,"antique"]
};
/** Skill category -> icon key. */
+58 -1
View File
@@ -244,8 +244,64 @@ export function generateMission({ seed = null, rnd = null, ...opts } = {}) {
const esc = s => String(s ?? "").replace(/&/g, "&amp;").replace(/</g, "&lt;");
const ul = xs => `<ul>${xs.map(x => `<li>${esc(x)}</li>`).join("")}</ul>`;
/** A table, escaped. Cells may carry markup only when the caller has escaped it. */
const table = (head, rows) =>
`<table><thead><tr>${head.map(h => `<th>${h}</th>`).join("")}</tr></thead><tbody>`
+ rows.map(r => `<tr>${r.map(c => `<td>${c}</td>`).join("")}</tr>`).join("")
+ `</tbody></table>`;
/** The player-facing brief. Everything here is true as far as the agency knows. */
/**
* The players' page. Everything on it is something an agent would be told, or would
* see on arrival — the cast's names and what they want, but never what they lie
* about; the texture of the place, but never why it is like that.
*
* The generator was already writing all of this and filing every word of it behind
* the GM screen: the timeline, the people, and the two lines of texture that are the
* best writing in the whole document. A player brief that opens on a classification
* note is a memo. This is a briefing.
*/
export function introPage(m) {
const first = m.timeline[0];
// The LAST timeline entry is the team's own arrival — "today: the team crosses" —
// which makes nonsense of "since then, ...". Use the last thing that happened
// before they did.
const prior = m.timeline.filter(t => !/team crosses/i.test(t.what));
const recent = prior[prior.length - 1] ?? first;
return `
<h2>Read this out</h2>
<p><em>${esc(m.classification.note)}</em></p>
<p>It is <strong>${esc(m.place)}</strong>. You have <strong>${esc(m.duration)}</strong>,
and the department has been clear that this is the window and not an estimate.
${esc(first.when.charAt(0).toUpperCase() + first.when.slice(1))}, ${esc(first.what.toLowerCase())}
Since then it has not stopped. Most recently, ${esc(recent.what.toLowerCase())}</p>
<p>You are going because ${esc(m.anomaly.containment.toLowerCase().replace(/\.$/, ""))},
and because somebody has to be able to say afterwards that a department attended.</p>
<h2>What it is like there</h2>
${ul(m.texture)}
<p>None of that is in the file. It is what you will notice in the first ten minutes,
and the file was written by somebody who was not there.</p>
<h2>What is known so far</h2>
${table(["When", "What"], m.timeline.map(t => [esc(t.when), esc(t.what)]))}
<h2>Who is there</h2>
${table(["Name", "Who they are", "What they want from you"],
m.cast.map(c => [`<strong>${esc(c.name)}</strong>`, esc(c.role), esc(c.wants)]))}
<p>They are not adversaries. Two of them will be helpful and at least one of them is
not telling you everything, which is ordinary and is not the same as lying.</p>
<h2>Before you go</h2>
<ul>
<li>Draw your kit. What you do not sign for, you do not have.</li>
<li>Somebody had better be able to make an arrangement, because most cases close that
way and this one is no exception.</li>
<li>Your anchor stays on you. It is the way back and it is the reason you are still
you when you get there.</li>
</ul>`;
}
export function briefPage(m) {
// The brief used to open on a classification note and never say where the site
// was, how long the team had, what was likely to be in the way, or how they were
@@ -368,7 +424,8 @@ ${m.timeline.map(t => `<tr><td><strong>${esc(t.when)}</strong></td><td>${esc(t.w
/** The whole case as journal pages, ready to be written into a compendium. */
export function missionPages(m) {
return [
{ name: `${m.codename} · Brief`, content: briefPage(m) },
{ name: `${m.codename} · Briefing`, content: introPage(m), players: true },
{ name: `${m.codename} · Orders`, content: briefPage(m), players: true },
{ name: `${m.codename} · The truth`, content: truthPage(m) },
{ name: `${m.codename} · Opposition`, content: castPage(m) },
{ name: `${m.codename} · Phases`, content: phasesPage(m) },