Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
53481bdfc1 |
@@ -426,6 +426,13 @@ If there is time — and there usually is, because this ends early — she says
|
||||
|
||||
## Artwork
|
||||
|
||||
**Showing them at the table.** The adventure ships a third journal,
|
||||
**LAST ADMISSION — Show the players**, holding these as eight image pages at player
|
||||
visibility. Right-click a page and *Show Players*: the table gets the picture and
|
||||
nothing else — no heading, no caption, no label naming what they are looking at. The
|
||||
page names are for the GM's sidebar and the players never see them.
|
||||
|
||||
|
||||
**Style line:** flat editorial vector, deep navy and pale yellow with warm off-white,
|
||||
1970s British public-information poster, `--style raw --ar 3:2 --v 6`.
|
||||
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.231003 174603000 Delete type=3 #1
|
||||
2026/08/12-19:12:20.951787 172dab000 Delete type=3 #1
|
||||
|
||||
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.298648 173df7000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.036764 172dab000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.232848 174603000 Delete type=3 #1
|
||||
2026/08/12-19:12:20.954786 17259f000 Delete type=3 #1
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.282484 173df7000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.015776 172dab000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.266480 174603000 Delete type=3 #1
|
||||
2026/08/12-19:12:20.996296 1735b7000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.293373 173df7000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.030689 17259f000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.252536 174603000 Delete type=3 #1
|
||||
2026/08/12-19:12:20.979932 17259f000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.290196 172ddf000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.025079 172dab000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.286378 174603000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.020396 17259f000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.297168 1735eb000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.035224 1735b7000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.224954 172ddf000 Delete type=3 #1
|
||||
2026/08/12-19:12:20.942094 17259f000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.291920 1735eb000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.028001 17259f000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.276268 174603000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.007789 17259f000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.270666 173df7000 Delete type=3 #1
|
||||
2026/08/12-19:12:21.001198 172dab000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.227877 174603000 Delete type=3 #1
|
||||
2026/08/12-19:12:20.946329 173dc3000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.234705 1735eb000 Delete type=3 #1
|
||||
2026/08/12-19:12:20.956885 17259f000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
2026/08/12-19:01:54.229633 174603000 Delete type=3 #1
|
||||
2026/08/12-19:12:20.948434 17259f000 Delete type=3 #1
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"id": "ringbrp",
|
||||
"title": "The Custodians",
|
||||
"description": "A Basic Roleplaying game of agents who cross the crossing to contain what should not be there — and who come back a little less from here each time.",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.3",
|
||||
"compatibility": {
|
||||
"minimum": 13,
|
||||
"verified": "14.364"
|
||||
|
||||
+50
-3
@@ -461,6 +461,38 @@ function journalDoc(name, key, pages) {
|
||||
return { doc: { _id: id, name, pages: pageDocs.map(p => p._id), categories: [], ...BASE() }, pages: pageDocs, id };
|
||||
}
|
||||
|
||||
/**
|
||||
* A journal of nothing but pictures, for showing to players.
|
||||
*
|
||||
* title.show is FALSE and there is no caption on purpose: when the GM hits Show Players
|
||||
* the table gets the image and nothing else — no heading telling them which room this
|
||||
* is, no label naming the thing they are looking at. The page NAME is for the GM's list
|
||||
* in the sidebar, so they can find the right one in a hurry; the players never see it.
|
||||
*/
|
||||
function imageJournal(name, key, plates) {
|
||||
const id = idFor(`journal:${key}`);
|
||||
const pageDocs = plates.map((p, i) => {
|
||||
// A missing plate is a blank frame on a projector in front of six people.
|
||||
if (!existsSync(path.join(ROOT, p.src))) throw new Error(`${name}: no plate at ${p.src}`);
|
||||
return {
|
||||
_id: idFor(`journal:${key}:${i}`),
|
||||
name: p.name, type: "image",
|
||||
title: { show: false, level: 1 },
|
||||
src: `systems/ringbrp/${p.src}`,
|
||||
image: { caption: "" },
|
||||
text: { format: 1, content: "", markdown: "" },
|
||||
video: { controls: true, volume: 0.5 },
|
||||
system: {}, sort: (i + 1) * 100, ownership: { default: 2 }, flags: {},
|
||||
category: null
|
||||
};
|
||||
});
|
||||
return {
|
||||
doc: { _id: id, name, pages: pageDocs.map(p => p._id), categories: [],
|
||||
...BASE(), ownership: { default: 2 }, flags: { ringbrp: { brand: true } } },
|
||||
pages: pageDocs, id
|
||||
};
|
||||
}
|
||||
|
||||
/* ---------------- writer ---------------- */
|
||||
|
||||
/**
|
||||
@@ -842,6 +874,19 @@ function cullandScene() {
|
||||
castDocs.push(actorDoc);
|
||||
}
|
||||
|
||||
// The plates, one per page, for showing at the table. Named for what the GM will be
|
||||
// looking for under pressure, ordered by when it comes up.
|
||||
const showJournal = imageJournal("LAST ADMISSION — Show the players", "la_show", [
|
||||
{ name: "1 · The house, from the drive", src: "art/scenes/la_01_hall.webp" },
|
||||
{ name: "2 · Floor plan — Culland Hall", src: "art/maps/culland-hall.webp" },
|
||||
{ name: "3 · Backstage — the green room", src: "art/scenes/la_06_green.webp" },
|
||||
{ name: "4 · The east corridor", src: "art/scenes/la_03_corridor.webp" },
|
||||
{ name: "5 · The nursery", src: "art/scenes/la_04_nursery.webp" },
|
||||
{ name: "6 · The glasshouse — Old Marrow", src: "art/scenes/la_05_glass.webp" },
|
||||
{ name: "7 · The stairs — the woman standing", src: "art/scenes/la_07_stairs.webp" },
|
||||
{ name: "8 · The car park, afterwards", src: "art/scenes/la_08_carpark.webp" }
|
||||
]);
|
||||
|
||||
const gmJournal = journalDoc("LAST ADMISSION — Run the prologue", "la_gm", L.LA_PAGES);
|
||||
const handouts = journalDoc("LAST ADMISSION — Player handouts", "la_handouts", L.LA_HANDOUTS);
|
||||
handouts.doc.ownership = { default: 2 };
|
||||
@@ -870,8 +915,9 @@ function cullandScene() {
|
||||
actors: castDocs,
|
||||
items: [],
|
||||
journal: [
|
||||
{ ...gmJournal.doc, pages: gmJournal.pages },
|
||||
{ ...handouts.doc, pages: handouts.pages }
|
||||
{ ...gmJournal.doc, pages: gmJournal.pages },
|
||||
{ ...handouts.doc, pages: handouts.pages },
|
||||
{ ...showJournal.doc, pages: showJournal.pages }
|
||||
],
|
||||
scenes: [cullandScene()], combats: [], tables: [], macros: [], cards: [], playlists: [], folders: [],
|
||||
sort: 0, ...BASE()
|
||||
@@ -879,7 +925,8 @@ function cullandScene() {
|
||||
|
||||
await writePack("lastadmission", [[`!adventures!${advId}`, adventure]]);
|
||||
console.log(` lastadm LAST ADMISSION — ${castDocs.length} cast, `
|
||||
+ `${L.LA_PAGES.length} GM pages, ${L.LA_HANDOUTS.length} handouts`);
|
||||
+ `${L.LA_PAGES.length} GM pages, ${L.LA_HANDOUTS.length} handouts, `
|
||||
+ `${showJournal.pages.length} plates to show`);
|
||||
}
|
||||
|
||||
// OPEN DAY — the prologue. A much smaller adventure than BLACK PLATFORM: no case file,
|
||||
|
||||
Reference in New Issue
Block a user