Ship the LAST ADMISSION plates as showable images
A third journal in the adventure — LAST ADMISSION — Show the players — holding the seven scene plates and the floor plan as eight image pages at player visibility. Right-click, Show Players, done. title.show is false and there is no caption, on purpose: the table gets the picture and nothing else. No heading telling them which room this is, no label naming the thing on the stairs. The page NAMES exist only for the GM's sidebar so the right one can be found in a hurry under pressure, and the players never see them. Ordered by when each comes up, not by asset number, for the same reason. The builder throws if a plate is missing from disk, because a missing image is a blank frame on a projector in front of six people. Verified in Foundry: eight pages import at OBSERVER, the image loads, and the rendered page contains no headings, no figcaption and no text at all. Version 1.0.3. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
51bd8e618a
commit
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