diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md index da0f8f2..1872b5a 100644 --- a/docs/REVIEW_LOG.md +++ b/docs/REVIEW_LOG.md @@ -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. diff --git a/icons/arbalest.svg b/icons/arbalest.svg new file mode 100644 index 0000000..1e67300 --- /dev/null +++ b/icons/arbalest.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/arming_sword.svg b/icons/arming_sword.svg new file mode 100644 index 0000000..d096355 --- /dev/null +++ b/icons/arming_sword.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/baker_rifle.svg b/icons/baker_rifle.svg new file mode 100644 index 0000000..7a95e7b --- /dev/null +++ b/icons/baker_rifle.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/bayonet.svg b/icons/bayonet.svg new file mode 100644 index 0000000..27a77a6 --- /dev/null +++ b/icons/bayonet.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/billhook.svg b/icons/billhook.svg new file mode 100644 index 0000000..d418820 --- /dev/null +++ b/icons/billhook.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/blunderbuss.svg b/icons/blunderbuss.svg new file mode 100644 index 0000000..a428685 --- /dev/null +++ b/icons/blunderbuss.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/boarding_pike.svg b/icons/boarding_pike.svg new file mode 100644 index 0000000..a5793bb --- /dev/null +++ b/icons/boarding_pike.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/brodie.svg b/icons/brodie.svg new file mode 100644 index 0000000..f0963a4 --- /dev/null +++ b/icons/brodie.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/brown_bess.svg b/icons/brown_bess.svg new file mode 100644 index 0000000..daea6b2 --- /dev/null +++ b/icons/brown_bess.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/buff_coat.svg b/icons/buff_coat.svg new file mode 100644 index 0000000..16780ec --- /dev/null +++ b/icons/buff_coat.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/coat_of_plates.svg b/icons/coat_of_plates.svg new file mode 100644 index 0000000..a64f2d1 --- /dev/null +++ b/icons/coat_of_plates.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/cuirass.svg b/icons/cuirass.svg new file mode 100644 index 0000000..2f2f687 --- /dev/null +++ b/icons/cuirass.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/cuirassier.svg b/icons/cuirassier.svg new file mode 100644 index 0000000..5ac09eb --- /dev/null +++ b/icons/cuirassier.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/cutlass.svg b/icons/cutlass.svg new file mode 100644 index 0000000..bf8951b --- /dev/null +++ b/icons/cutlass.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/dirk.svg b/icons/dirk.svg new file mode 100644 index 0000000..beebbb8 --- /dev/null +++ b/icons/dirk.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/falchion.svg b/icons/falchion.svg new file mode 100644 index 0000000..63e751f --- /dev/null +++ b/icons/falchion.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/flail.svg b/icons/flail.svg new file mode 100644 index 0000000..1ebe208 --- /dev/null +++ b/icons/flail.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/flak_jacket.svg b/icons/flak_jacket.svg new file mode 100644 index 0000000..42fc3d0 --- /dev/null +++ b/icons/flak_jacket.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/gambeson.svg b/icons/gambeson.svg new file mode 100644 index 0000000..b2b5d5d --- /dev/null +++ b/icons/gambeson.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/halberd.svg b/icons/halberd.svg new file mode 100644 index 0000000..275fdb5 --- /dev/null +++ b/icons/halberd.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/harness.svg b/icons/harness.svg new file mode 100644 index 0000000..53675ed --- /dev/null +++ b/icons/harness.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/jack_of_plate.svg b/icons/jack_of_plate.svg new file mode 100644 index 0000000..f9207f7 --- /dev/null +++ b/icons/jack_of_plate.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/javelin.svg b/icons/javelin.svg new file mode 100644 index 0000000..040a8d3 --- /dev/null +++ b/icons/javelin.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/lee_enfield.svg b/icons/lee_enfield.svg new file mode 100644 index 0000000..8aadeb3 --- /dev/null +++ b/icons/lee_enfield.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/lobster_pot.svg b/icons/lobster_pot.svg new file mode 100644 index 0000000..6f751f2 --- /dev/null +++ b/icons/lobster_pot.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/longbow.svg b/icons/longbow.svg new file mode 100644 index 0000000..e0403ea --- /dev/null +++ b/icons/longbow.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/longsword.svg b/icons/longsword.svg new file mode 100644 index 0000000..0d0e7ba --- /dev/null +++ b/icons/longsword.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/mace.svg b/icons/mace.svg new file mode 100644 index 0000000..d12fc75 --- /dev/null +++ b/icons/mace.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/maille_shirt.svg b/icons/maille_shirt.svg new file mode 100644 index 0000000..892b36f --- /dev/null +++ b/icons/maille_shirt.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/main_gauche.svg b/icons/main_gauche.svg new file mode 100644 index 0000000..2461109 --- /dev/null +++ b/icons/main_gauche.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/martini.svg b/icons/martini.svg new file mode 100644 index 0000000..6c78a5d --- /dev/null +++ b/icons/martini.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/matchlock.svg b/icons/matchlock.svg new file mode 100644 index 0000000..3a258d1 --- /dev/null +++ b/icons/matchlock.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/pike.svg b/icons/pike.svg new file mode 100644 index 0000000..a3afba7 --- /dev/null +++ b/icons/pike.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/poleaxe.svg b/icons/poleaxe.svg new file mode 100644 index 0000000..4472160 --- /dev/null +++ b/icons/poleaxe.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/quarterstaff.svg b/icons/quarterstaff.svg new file mode 100644 index 0000000..09cb6a9 --- /dev/null +++ b/icons/quarterstaff.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/rapier.svg b/icons/rapier.svg new file mode 100644 index 0000000..c1e8579 --- /dev/null +++ b/icons/rapier.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/sabre.svg b/icons/sabre.svg new file mode 100644 index 0000000..5efd8df --- /dev/null +++ b/icons/sabre.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/sallet.svg b/icons/sallet.svg new file mode 100644 index 0000000..5933355 --- /dev/null +++ b/icons/sallet.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/sling.svg b/icons/sling.svg new file mode 100644 index 0000000..fcecdb7 --- /dev/null +++ b/icons/sling.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/smallsword.svg b/icons/smallsword.svg new file mode 100644 index 0000000..de89afd --- /dev/null +++ b/icons/smallsword.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/trench_club.svg b/icons/trench_club.svg new file mode 100644 index 0000000..f16b073 --- /dev/null +++ b/icons/trench_club.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/war_hammer.svg b/icons/war_hammer.svg new file mode 100644 index 0000000..da132d7 --- /dev/null +++ b/icons/war_hammer.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/webley.svg b/icons/webley.svg new file mode 100644 index 0000000..09f570e --- /dev/null +++ b/icons/webley.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/wheellock.svg b/icons/wheellock.svg new file mode 100644 index 0000000..d2ff044 --- /dev/null +++ b/icons/wheellock.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/packs/armour/000005.ldb b/packs/armour/000005.ldb index 23c0234..b406921 100644 Binary files a/packs/armour/000005.ldb and b/packs/armour/000005.ldb differ diff --git a/packs/armour/000006.log b/packs/armour/000006.log index c6f4221..9d3f468 100644 Binary files a/packs/armour/000006.log and b/packs/armour/000006.log differ diff --git a/packs/armour/LOG b/packs/armour/LOG index 8db5145..35d9afe 100644 --- a/packs/armour/LOG +++ b/packs/armour/LOG @@ -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 diff --git a/packs/armour/LOG.old b/packs/armour/LOG.old index 770d314..e82aeb7 100644 --- a/packs/armour/LOG.old +++ b/packs/armour/LOG.old @@ -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 diff --git a/packs/armour/MANIFEST-000004 b/packs/armour/MANIFEST-000004 index d7bc6c5..1faa5e9 100644 Binary files a/packs/armour/MANIFEST-000004 and b/packs/armour/MANIFEST-000004 differ diff --git a/packs/expedition/LOG b/packs/expedition/LOG index b5ac787..5cb188a 100644 --- a/packs/expedition/LOG +++ b/packs/expedition/LOG @@ -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 diff --git a/packs/expedition/LOG.old b/packs/expedition/LOG.old index 1781c5b..e8755b4 100644 --- a/packs/expedition/LOG.old +++ b/packs/expedition/LOG.old @@ -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 diff --git a/packs/gear/LOG b/packs/gear/LOG index 811e39e..a822e86 100644 --- a/packs/gear/LOG +++ b/packs/gear/LOG @@ -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 diff --git a/packs/gear/LOG.old b/packs/gear/LOG.old index 639cb5b..5b496f0 100644 --- a/packs/gear/LOG.old +++ b/packs/gear/LOG.old @@ -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 diff --git a/packs/npcs/000005.ldb b/packs/npcs/000005.ldb index 796c34c..e0c2b42 100644 Binary files a/packs/npcs/000005.ldb and b/packs/npcs/000005.ldb differ diff --git a/packs/npcs/000006.log b/packs/npcs/000006.log index d76f908..d08f420 100644 Binary files a/packs/npcs/000006.log and b/packs/npcs/000006.log differ diff --git a/packs/npcs/LOG b/packs/npcs/LOG index ad78b89..7530099 100644 --- a/packs/npcs/LOG +++ b/packs/npcs/LOG @@ -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 diff --git a/packs/npcs/LOG.old b/packs/npcs/LOG.old index fe669c4..0921934 100644 --- a/packs/npcs/LOG.old +++ b/packs/npcs/LOG.old @@ -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 diff --git a/packs/npcs/MANIFEST-000004 b/packs/npcs/MANIFEST-000004 index adfab19..178f4b5 100644 Binary files a/packs/npcs/MANIFEST-000004 and b/packs/npcs/MANIFEST-000004 differ diff --git a/packs/powers/LOG b/packs/powers/LOG index b61b0a1..d1faa39 100644 --- a/packs/powers/LOG +++ b/packs/powers/LOG @@ -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 diff --git a/packs/powers/LOG.old b/packs/powers/LOG.old index 7b4f7c5..1fa9f54 100644 --- a/packs/powers/LOG.old +++ b/packs/powers/LOG.old @@ -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 diff --git a/packs/pregens/000005.ldb b/packs/pregens/000005.ldb index 96d12a8..d646217 100644 Binary files a/packs/pregens/000005.ldb and b/packs/pregens/000005.ldb differ diff --git a/packs/pregens/000006.log b/packs/pregens/000006.log index f25632f..71e3acd 100644 Binary files a/packs/pregens/000006.log and b/packs/pregens/000006.log differ diff --git a/packs/pregens/LOG b/packs/pregens/LOG index cc1d782..853d3e6 100644 --- a/packs/pregens/LOG +++ b/packs/pregens/LOG @@ -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 diff --git a/packs/pregens/LOG.old b/packs/pregens/LOG.old index 780e852..396b19e 100644 --- a/packs/pregens/LOG.old +++ b/packs/pregens/LOG.old @@ -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 diff --git a/packs/pregens/MANIFEST-000004 b/packs/pregens/MANIFEST-000004 index 160f5db..a27f077 100644 Binary files a/packs/pregens/MANIFEST-000004 and b/packs/pregens/MANIFEST-000004 differ diff --git a/packs/rules/LOG b/packs/rules/LOG index 24d8c1d..93969b7 100644 --- a/packs/rules/LOG +++ b/packs/rules/LOG @@ -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 diff --git a/packs/rules/LOG.old b/packs/rules/LOG.old index ec69c26..1c00b63 100644 --- a/packs/rules/LOG.old +++ b/packs/rules/LOG.old @@ -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 diff --git a/packs/skills/000005.ldb b/packs/skills/000005.ldb index ed7e1a4..d613d26 100644 Binary files a/packs/skills/000005.ldb and b/packs/skills/000005.ldb differ diff --git a/packs/skills/000006.log b/packs/skills/000006.log index 3c02d65..aa7dd7d 100644 Binary files a/packs/skills/000006.log and b/packs/skills/000006.log differ diff --git a/packs/skills/LOG b/packs/skills/LOG index d703cdc..d63a254 100644 --- a/packs/skills/LOG +++ b/packs/skills/LOG @@ -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 diff --git a/packs/skills/LOG.old b/packs/skills/LOG.old index 64a1a4b..e7d5a10 100644 --- a/packs/skills/LOG.old +++ b/packs/skills/LOG.old @@ -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 diff --git a/packs/skills/MANIFEST-000004 b/packs/skills/MANIFEST-000004 index 8951d45..792e8a1 100644 Binary files a/packs/skills/MANIFEST-000004 and b/packs/skills/MANIFEST-000004 differ diff --git a/packs/slice/LOG b/packs/slice/LOG index cb313c8..e318b43 100644 --- a/packs/slice/LOG +++ b/packs/slice/LOG @@ -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 diff --git a/packs/slice/LOG.old b/packs/slice/LOG.old index 233aaea..58cd2c4 100644 --- a/packs/slice/LOG.old +++ b/packs/slice/LOG.old @@ -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 diff --git a/packs/tables/LOG b/packs/tables/LOG index e879929..06f8dc6 100644 --- a/packs/tables/LOG +++ b/packs/tables/LOG @@ -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 diff --git a/packs/tables/LOG.old b/packs/tables/LOG.old index 8061075..82af5a1 100644 --- a/packs/tables/LOG.old +++ b/packs/tables/LOG.old @@ -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 diff --git a/packs/talents/LOG b/packs/talents/LOG index 0d40464..f71b243 100644 --- a/packs/talents/LOG +++ b/packs/talents/LOG @@ -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 diff --git a/packs/talents/LOG.old b/packs/talents/LOG.old index 9c02d4e..67dbd44 100644 --- a/packs/talents/LOG.old +++ b/packs/talents/LOG.old @@ -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 diff --git a/packs/vehicles/LOG b/packs/vehicles/LOG index 33b0948..8f207a3 100644 --- a/packs/vehicles/LOG +++ b/packs/vehicles/LOG @@ -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 diff --git a/packs/vehicles/LOG.old b/packs/vehicles/LOG.old index 0e4f15b..84849a4 100644 --- a/packs/vehicles/LOG.old +++ b/packs/vehicles/LOG.old @@ -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 diff --git a/packs/weapons/000005.ldb b/packs/weapons/000005.ldb index c4e6863..742beba 100644 Binary files a/packs/weapons/000005.ldb and b/packs/weapons/000005.ldb differ diff --git a/packs/weapons/000006.log b/packs/weapons/000006.log index 59c6e09..4d427a6 100644 Binary files a/packs/weapons/000006.log and b/packs/weapons/000006.log differ diff --git a/packs/weapons/LOG b/packs/weapons/LOG index bee2dbc..5af3add 100644 --- a/packs/weapons/LOG +++ b/packs/weapons/LOG @@ -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 diff --git a/packs/weapons/LOG.old b/packs/weapons/LOG.old index e14a81d..1b028ec 100644 --- a/packs/weapons/LOG.old +++ b/packs/weapons/LOG.old @@ -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 diff --git a/packs/weapons/MANIFEST-000004 b/packs/weapons/MANIFEST-000004 index f176514..6a582af 100644 Binary files a/packs/weapons/MANIFEST-000004 and b/packs/weapons/MANIFEST-000004 differ diff --git a/ringbrp.mjs b/ringbrp.mjs index 10daa8c..5e72221 100644 --- a/ringbrp.mjs +++ b/ringbrp.mjs @@ -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 } })) }); diff --git a/tools/content.mjs b/tools/content.mjs index 54d5d75..2f4c686 100644 --- a/tools/content.mjs +++ b/tools/content.mjs @@ -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 ---------- */ diff --git a/tools/icons.mjs b/tools/icons.mjs index 58a4d1e..45405f4 100644 --- a/tools/icons.mjs +++ b/tools/icons.mjs @@ -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. */ diff --git a/tools/mission.mjs b/tools/mission.mjs index 1ed1eed..0204333 100644 --- a/tools/mission.mjs +++ b/tools/mission.mjs @@ -244,8 +244,64 @@ export function generateMission({ seed = null, rnd = null, ...opts } = {}) { const esc = s => String(s ?? "").replace(/&/g, "&").replace(/ `
| ${h} | `).join("")}
|---|
| ${c} | `).join("")}
${esc(m.classification.note)}
+It is ${esc(m.place)}. You have ${esc(m.duration)}, +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())}
+You are going because ${esc(m.anomaly.containment.toLowerCase().replace(/\.$/, ""))}, +and because somebody has to be able to say afterwards that a department attended.
+ +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.
+ +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.
+ +