THROUGH TRAIN: art prompt sheet, and a runner for it
Prompts for all 43 assets - 16 duty-roster portraits, 14 NPC portraits from TT_CAST, and the 13 scene plates, none of which had a recorded prompt, so none of them could be regenerated. Art direction is frontier newspaper engraving, and the present-day Bureau material is drawn in the same 1881 hand as Cordera with modern people composed as tintype portraits, so the two halves read as one document. Three rules are written into the sheet because they protect meaning rather than style: nothing modern is drawn on the 1881 side, the train is absence rather than a glowing spectre, and nobody is lit as a villain. tools/gen-art.mjs parses the sheet rather than keeping a second copy of the prompts, expands the style tokens and drives mj-gen. Dry run by default, because --run fires paid generations. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b31b1028a9
commit
c6924d6ea8
@@ -0,0 +1,139 @@
|
||||
# THROUGH TRAIN — Artwork Prompt Sheet
|
||||
|
||||
Generation prompts for every plate and portrait in TT-004 · Mercy Draw. Kept here so
|
||||
regeneration is possible; per house convention the prompt is part of the document.
|
||||
|
||||
Generate with the Midjourney bridge:
|
||||
|
||||
mj-gen "<prompt>"
|
||||
|
||||
---
|
||||
|
||||
## Art direction for this scenario
|
||||
|
||||
House base style is ink sketch / pencil illustration — hand-drawn, single-weight line,
|
||||
sparse wash, negative space, never photorealistic. THROUGH TRAIN adds one line:
|
||||
|
||||
> **Frontier newspaper engraving.** Woodcut cross-hatching, sepia wash, tea-stained
|
||||
> paper grain, low raking sun and dust. Everything is drawn as though it were printed
|
||||
> in Nevada in 1881 — *including the present-day Bureau material.*
|
||||
|
||||
That last clause is the conceit and it is deliberate. The Bureau, Stores and the
|
||||
Registry are drawn in the same 1881 hand as Cordera, so the two halves of the scenario
|
||||
look like one document. Present-day people are composed as **tintype studio portraits**:
|
||||
oval vignette, plate edge, hands placed. They are still modern British civil servants in
|
||||
drab modern dress — the *framing* is nineteenth-century, not the clothes. It quietly
|
||||
tells the players where this case is going before anybody says so.
|
||||
|
||||
### Style tokens
|
||||
|
||||
Append the matching token to every prompt. Repeat it verbatim so the set stays coherent.
|
||||
|
||||
| Token | Text |
|
||||
|---|---|
|
||||
| `[BASE]` | hand-drawn ink and pencil illustration, single-weight line work, sparse sepia wash, heavy negative space, woodcut cross-hatching, 1880s frontier newspaper engraving, tea-stained paper grain, not photorealistic |
|
||||
| `[MODERN]` | `[BASE]` + composed as an 1880s tintype studio portrait, oval vignette, plate edge, plain ground `--style raw --s 250 --ar 2:3` |
|
||||
| `[PERIOD]` | `[BASE]` + 1881 Nevada Territory, carte-de-visite framing, plain ground `--style raw --s 250 --ar 2:3` |
|
||||
| `[PLATE]` | `[BASE]` + `--style raw --s 300 --ar 3:2` |
|
||||
|
||||
Adjust the `--v` flag to whatever Midjourney version you are on; the prompts are written
|
||||
to work without one.
|
||||
|
||||
---
|
||||
|
||||
## A · Duty roster portraits
|
||||
|
||||
Sixteen agents; THROUGH TRAIN runs four to six of them. Files land in
|
||||
`art/portraits/pc_<key>.webp`. All use `[MODERN]`.
|
||||
|
||||
| ID | Agent | Prompt |
|
||||
|---|---|---|
|
||||
| `pc_holloway` | Marta Holloway, 44, Field Lead | waist-up portrait of a composed white British woman of 44, short greying hair pinned back, plain dark jacket over a shirt, reading a document she is about to sign, expression of settled authority, a small coin envelope held between two fingers, nineteen years of doing this in the eyes, `[MODERN]` |
|
||||
| `pc_okonkwo` | Ben Okonkwo, 33, Containment | waist-up portrait of a very large Black British man of 33, close-cropped hair, heavy shoulders filling the frame, plain work jacket, hands loose at his sides, calm and entirely unbothered, the shape of a man who goes through doors first, `[MODERN]` |
|
||||
| `pc_sandoval` | Rey Sandoval, 37, Overwatch | waist-up portrait of a lean Latina woman of 37, hair tied back hard, quiet watchful eyes looking slightly off-camera at something distant, plain dark coat, a worn paperback tucked in the breast pocket, stillness rather than menace, `[MODERN]` |
|
||||
| `pc_bhattacharya` | Arun Bhattacharya, 56, Registry | waist-up portrait of a South Asian British man of 56, silver at the temples, spectacles, cardigan under a jacket, a brass slide rule held like a pen, the mild expression of a man who has read the file you are about to lie about, `[MODERN]` |
|
||||
| `pc_rahimi` | Soraya Rahimi, 41, Settlements | waist-up portrait of an Iranian British woman of 41, dark hair to the shoulder, warm and extremely level gaze, plain blouse and jacket, hands folded over a folded agreement, the poise of someone who has never once had to raise her voice, `[MODERN]` |
|
||||
| `pc_nkemdirim` | Dr Chidi Nkemdirim, 32, doctor | waist-up portrait of a Black British man of 32, neat short beard, plain shirt with the sleeves turned back, a dead pager clipped at the belt, calm and faintly startled at the same time, eleven months into work he was not trained for, `[MODERN]` |
|
||||
| `pc_kowalczyk` | Marek Kowalczyk, 30, engineer | waist-up portrait of a Polish man of 30, cropped fair hair, sturdy build, work jacket over a collared shirt, an old resharpened hand tool held loosely, unimpressed and mildly sceptical expression, `[MODERN]` |
|
||||
| `pc_finch` | Wren Finch, 26, criminal | waist-up portrait of a small wiry white British woman of 26, cropped dark hair, sharp quick eyes, plain zipped jacket, a single door key on a ring hooked over one finger, wary and amused, a person watching the exits, `[MODERN]` |
|
||||
| `pc_agyeman` | Joseph Agyeman, 52, police | waist-up portrait of a Black British man of 52, grey at the temples, broad and settled, plain overcoat, a wristwatch with a worn leather strap, twenty-six years of taking statements in the set of the jaw, `[MODERN]` |
|
||||
| `pc_lindqvist` | Prof Åke Lindqvist, 63, professor | waist-up portrait of an elderly Swedish man of 63, white hair, half-moon glasses, tweed jacket with a book under one arm, kindly and abstracted, the look of a man consulted once and never quite sent home, `[MODERN]` |
|
||||
| `pc_pollard` | Gareth Pollard, 47, Warden | waist-up portrait of a heavy-set white British man of 47, weathered face, thick coat buttoned to the throat, a wind-up alarm clock in one hand, patient and unhurried, a man who has sat awake with worse than you, `[MODERN]` |
|
||||
| `pc_ashcroft` | Dominic Ashcroft, 38, Anchor | waist-up portrait of a white British man of 38 who reads three years older, neat dark hair, plain suit, half a cut school tie showing at the pocket, faintly out of register with the frame as though printed a moment late, holding very still, `[MODERN]` |
|
||||
| `pc_braithwaite` | Neil Braithwaite, 51, Pathology | waist-up portrait of a white British man of 51, thinning hair, spectacles, plain shirt and knitted tie, a fountain pen capped in his fingers, addressing something on the table rather than the viewer, `[MODERN]` |
|
||||
| `pc_renshaw` | Kate Renshaw, 44, Interview | waist-up portrait of a white British woman of 44, dark hair loosely up, open and disarming expression that is doing more work than it admits, plain cardigan, a small hair clip pinned to her lapel that is not hers, `[MODERN]` |
|
||||
| `pc_sharrock` | Danny Sharrock, 42, builder | waist-up portrait of a big white British man of 42, sunburnt forearms, high-vis stripe just visible under a plain jacket, a battered tobacco tin in one fist, blunt and cheerful, mid-sentence and about to say something loudly, `[MODERN]` |
|
||||
| `pc_ferriby` | Colin Ferriby, 29, IT | waist-up portrait of a pale white British man of 29, unbrushed hair, plain fleece over a collared shirt, a dead hard drive with a handwritten label held in both hands like evidence, avoiding the camera, more comfortable with the logs than the room, `[MODERN]` |
|
||||
|
||||
---
|
||||
|
||||
## B · NPC portraits
|
||||
|
||||
Files: `art/portraits/tt_<key>.webp`. Bureau staff use `[MODERN]`; everyone in 1881
|
||||
uses `[PERIOD]`.
|
||||
|
||||
### Bureau, present day
|
||||
|
||||
| ID | NPC | Prompt |
|
||||
|---|---|---|
|
||||
| `tt_bewley` | Mr Bewley, Registry | waist-up portrait of a British man in his sixties, thin white hair, cardigan under a jacket, reading glasses pushed up onto his forehead, a buff case file open in his hands, entirely open and helpful expression, a man confidently telling you something that is wrong, `[MODERN]` |
|
||||
| `tt_prosser` | Mr Prosser, Stores | waist-up portrait of a stocky British man of about fifty behind a stores counter, brown warehouse coat, arms folded, absolutely immovable expression, nineteen years of the same conversation, framed like a frontier gunsmith across his counter, `[MODERN]` |
|
||||
|
||||
### Cordera, 1881
|
||||
|
||||
| ID | NPC | Prompt |
|
||||
|---|---|---|
|
||||
| `tt_rance` | Rance Doyle, miner | waist-up portrait of a hard-handed white miner in his thirties, 1881 Nevada, work shirt and braces, three days of beard, jaw set, grief held down under anger, eleven weeks unpaid and a brother missing since yesterday, `[PERIOD]` |
|
||||
| `tt_shard` | Mr Shard, company detective | waist-up portrait of a neat American man of about forty, 1881, good hat and a decent coat, pleasant unhurried smile that does not reach the eyes, a notebook held half-closed, a man buying drinks and collecting names, `[PERIOD]` |
|
||||
| `tt_cordera_man` | Cordera man (town) | waist-up portrait of an ordinary Nevada miner of about thirty, 1881, battered hat, coal dust in the creases of his face, a holstered revolver he would rather not use, angry and frightened and owed money, not a killer, `[PERIOD]` |
|
||||
| `tt_tom_doyle` | Tom Doyle, 24 | waist-up portrait of a young white man of twenty-four, 1881 Nevada, open friendly face, ill-fitting coat, hat held in his hands, faintly embarrassed, the youngest man in the car, asking after the road home, `[PERIOD]` |
|
||||
| `tt_kell` | Marius Kell, engineer | waist-up portrait of a railway engineer of about fifty-five, 1881, overalls and a soft cap, the right side of his face burnt smooth and shiny by a firebox door, deeply tired, one hand still curled as though around a regulator, `[PERIOD]` |
|
||||
| `tt_vane` | Elias Vane, surveyor | waist-up portrait of a lean educated man of about fifty, 1881, dark coat and waistcoat, a rolled survey chart under his arm, seated alone, the still and unforgiven expression of a man who has had a very long time to understand what he signed, `[PERIOD]` |
|
||||
| `tt_bligh` | Hester Bligh, conductor | waist-up portrait of a woman of about forty-five in an 1881 railway conductor's coat and cap, a ticket punch and a tally book at her belt, competent and unsentimental, caught mid-count, the person who organised the water rota, `[PERIOD]` |
|
||||
| `tt_reyes` | Ada Reyes, telegraph operator | waist-up portrait of a Mexican-American woman of about thirty, 1881, plain high-collared dress and an eyeshade, one hand resting on a telegraph key, a dispatcher's book open in front of her, sharp and already ahead of everyone in town, `[PERIOD]` |
|
||||
| `tt_merritt` | Cass Merritt, hired guard | waist-up portrait of a broad calm American man in his forties, 1881, long good coat, holstered revolver, a folded letter of engagement in his breast pocket, entirely unexcited, a competent man doing the job he was paid for, `[PERIOD]` |
|
||||
| `tt_ambrose` | Josiah Ambrose, writ man | waist-up portrait of a big weathered miner of about forty, 1881, worn coat, a sealed court writ held up in one hand as though it were a warrant card, righteous and exhausted, a man certain the law is on his side, `[PERIOD]` |
|
||||
| `tt_coat` | Company guard | waist-up portrait of a hired railway guard of about thirty, 1881, long dark coat and a company badge, a Webley revolver, flat professional stare, one of three interchangeable men at the front of car three, `[PERIOD]` |
|
||||
| `tt_writman` | Cordera miner (writ men) | waist-up portrait of a frightened angry miner of about thirty-five, 1881, a Martini-Henry rifle held across his chest, no soldier, shabby coat, unpaid and shooting at men who are shooting at him, `[PERIOD]` |
|
||||
|
||||
---
|
||||
|
||||
## C · Scene plates
|
||||
|
||||
Existing files, `art/scenes/<id>.webp`. All use `[PLATE]`.
|
||||
|
||||
| ID | Where used | Prompt |
|
||||
|---|---|---|
|
||||
| `tt_01_draw` | Cover plate | wide desert wash in Nevada Territory at midday, a dry quarter-mile draw with a made railway grade along the south side and nothing on it, and above the empty north bench a faint impossible line of track drawn in ghost hatching where no railway has ever been, dust, low sage, enormous sky, no figures, `[PLATE]` |
|
||||
| `tt_11_bureau` | Act One, the Bureau | a drab British government corridor with a wooden counter, a ledger open on it, a lift indicator showing four of six floors, floor-polish shine and stacked buff files, a birthday card propped up going round, unglamorous and quiet, drawn in frontier engraving hatching as though printed in 1881, `[PLATE]` |
|
||||
| `tt_02_stores` | Act One, Stores | a stores counter in a government basement, a man in a brown warehouse coat behind it, and laid out on the counter in a neat row the 1881 issue — Webley revolvers, a Martini-Henry rifle, oil lanterns, a brass compass, a pocket watch, a spyglass, buff coats, a chirurgeon's roll, iron manacles, period coin — with a modern mobile phone set aside in a tray, composed like a frontier gunsmith's counter, `[PLATE]` |
|
||||
| `tt_12_northbench` | Act Two, the crossing | a strip of empty scrub on the wrong side of a dry wash at 11:40, ordinary sage and gravel, and the air over it going wrong — not shimmering but mis-drawn, the hatching itself out of register, a line of ghost track suggested and then not there, four small figures at the edge of frame for scale, `[PLATE]` |
|
||||
| `tt_04_cordera` | Act Two, Cordera | a Nevada Territory railroad and mining town of eighteen hundred people in 1881 seen from a rise — woodsmoke, a water tank, a grid of plank roofs, a mine head above the town, frozen mud in the main street, horses at the rails, coal dust, low winter sun and long shadows, `[PLATE]` |
|
||||
| `tt_13_standoff` | Act Three, the standoff | six unpaid miners standing across a muddy 1881 main street facing the viewer, hats down, rifles and revolvers held low and not aimed, the leader a half-step ahead with one hand out, tense but not yet violent, wet ruts and horse breath in cold air, a conversation about to go wrong rather than a gunfight, `[PLATE]` |
|
||||
| `tt_03_bench` | Act Four, the grade | a made railway grade running along the south side of a dry wash, ballast and tie marks, empty rails climbing, and coming up the grade a locomotive working hard that is drawn entirely in absent line — visible smoke and motion with nothing solid inside it, the ground beneath it undisturbed, `[PLATE]` |
|
||||
| `tt_05_boarding` | Act Four, the tower | an 1881 timber railway water tower standing beside a grade at the top of a climb, spout swung out, a slow-moving locomotive and cars passing beneath it, one small figure crouched on the tower platform judging the drop onto a moving roof, twelve feet, forty seconds, dust and steam, `[PLATE]` |
|
||||
| `tt_06_car` | Act Five, car three | the interior of an 1881 passenger car between passes, warm and crowded, sixty-odd people in wooden seats, coats hung over the windows, a child asleep across two seats under a coat, a water bucket and a rota chalked on the panelling, overturned seats braced at both ends of the car, coal smoke and lamplight, people who have made a home of four minutes, `[PLATE]` |
|
||||
| `tt_08_gunfight` | Act Five, the four minutes | a gunfight down the length of an 1881 passenger car, powder smoke in lamplight, men firing from behind overturned seats at both ends, passengers flat on the floor between them with their arms over their heads, a young man falling at mid-car, nobody heroic, everybody frightened, the same four minutes for the two millionth time, `[PLATE]` |
|
||||
| `tt_09_payroll` | Act Five, the paper | the interior of an 1881 freight car, a strongbox bolted to the floor with a company seal, a leather satchel with a rolled survey chart, and on the boards beside them two documents laid side by side — a letter of engagement and a sealed court writ, both genuine, both naming the same money, a lantern hanging above, `[PLATE]` |
|
||||
| `tt_10_couple` | Act Five, the coupling | the gap between two moving 1881 railway carriages seen from the platform edge, coupling and chains jerking, sleepers blurring past below, iron handrails, dust and wind, a hand reaching for the far rail, thirty miles an hour of nothing underneath, `[PLATE]` |
|
||||
| `tt_07_after` | Epilogue, the register | a quiet British Registry room, a wide desk under a window, a ledger open with a long column of sixty-one handwritten names, a form part-completed, one pair of hands writing, an empty chair opposite, nothing supernatural at all, drawn in the same frontier engraving hatching as the rest, `[PLATE]` |
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
|
||||
- **Nothing modern is drawn crossing over.** No plate shows a mobile phone, a modern
|
||||
weapon or modern dress on the 1881 side. Standing Order 9 is a visual rule as well as
|
||||
a mechanical one, and the art should never contradict it.
|
||||
- **The train is drawn as absence, not as a ghost.** In `tt_01_draw`, `tt_12_northbench`
|
||||
and `tt_03_bench` it is line that is missing rather than a translucent spectre. If a
|
||||
generation comes back with a glowing phantom locomotive, reroll it — that is the wrong
|
||||
scenario.
|
||||
- **Nobody is lit as a villain.** Merritt, Ambrose, Rance and the two generic ranks are
|
||||
drawn as tired working men with a case. No sneers, no shadowed eyes, no black hats
|
||||
against white hats.
|
||||
- Keep alternates in an archive folder; portraits feed the character sheets.
|
||||
|
||||
---
|
||||
|
||||
*Private convention play materials — not for sale or distribution.*
|
||||
@@ -0,0 +1,125 @@
|
||||
/**
|
||||
* Art generation runner.
|
||||
*
|
||||
* Reads a scenario art prompt sheet, expands its style tokens, and either prints
|
||||
* the mj-gen commands or runs them. The markdown IS the source of truth — the
|
||||
* prompts are not duplicated here, for the same reason the rules journal is
|
||||
* generated from rules.mjs: two copies of a prompt is one copy too many.
|
||||
*
|
||||
* node tools/gen-art.mjs print every command (default, safe)
|
||||
* node tools/gen-art.mjs --run actually invoke mj-gen
|
||||
* node tools/gen-art.mjs --only pc_finch one asset, or a comma-separated list
|
||||
* node tools/gen-art.mjs --only pc_ prefix match works too
|
||||
* node tools/gen-art.mjs --force regenerate assets that already exist
|
||||
* node tools/gen-art.mjs --sheet <path> a different prompt sheet
|
||||
*
|
||||
* --run requires mj-gen on PATH. It is deliberately not the default: this fires
|
||||
* paid generations, and forty-three of them is not something to do by typo.
|
||||
*/
|
||||
import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
||||
import { spawnSync } from "node:child_process";
|
||||
import path from "node:path";
|
||||
|
||||
const argv = process.argv.slice(2);
|
||||
const flag = n => argv.includes(n);
|
||||
const opt = (n, d) => { const i = argv.indexOf(n); return i >= 0 ? argv[i + 1] : d; };
|
||||
|
||||
const SHEET = path.resolve(opt("--sheet", "docs/scenarios/THROUGH_TRAIN_ART.md"));
|
||||
const RUN = flag("--run");
|
||||
const FORCE = flag("--force");
|
||||
const ONLY = (opt("--only", "") || "").split(",").map(s => s.trim()).filter(Boolean);
|
||||
|
||||
/* ---------------------------------------------------------------- parse */
|
||||
|
||||
const rows = readFileSync(SHEET, "utf8")
|
||||
.split(/\r?\n/)
|
||||
.filter(l => /^\|/.test(l) && !/^\|\s*-+/.test(l))
|
||||
.map(l => l.replace(/^\|/, "").replace(/\|\s*$/, "").split("|").map(c => c.trim()));
|
||||
|
||||
const tokens = {};
|
||||
const assets = [];
|
||||
|
||||
for (const cells of rows) {
|
||||
if (cells.length === 2) {
|
||||
const m = cells[0].match(/^`(\[[A-Z]+\])`$/);
|
||||
if (m) tokens[m[1]] = cells[1];
|
||||
} else if (cells.length === 3) {
|
||||
const m = cells[0].match(/^`([a-z0-9_]+)`$/);
|
||||
if (m) assets.push({ id: m[1], label: cells[1], raw: cells[2] });
|
||||
}
|
||||
}
|
||||
|
||||
if (!Object.keys(tokens).length) throw new Error(`no style tokens found in ${SHEET}`);
|
||||
if (!assets.length) throw new Error(`no asset rows found in ${SHEET}`);
|
||||
|
||||
/* -------------------------------------------------------------- expand */
|
||||
|
||||
const expand = (s, depth = 0) => {
|
||||
if (depth > 8) throw new Error(`style token loop: ${s.slice(0, 60)}`);
|
||||
const out = s.replace(/\[([A-Z]+)\]/g, (whole, name) =>
|
||||
tokens[`[${name}]`] !== undefined ? tokens[`[${name}]`] : whole);
|
||||
return out === s ? out : expand(out, depth + 1);
|
||||
};
|
||||
|
||||
const tidy = s => s
|
||||
.replace(/`/g, "")
|
||||
.replace(/\s*\+\s*/g, ", ")
|
||||
.replace(/\s*,\s*,\s*/g, ", ")
|
||||
.replace(/\s+/g, " ")
|
||||
.replace(/,\s*(--)/g, " $1")
|
||||
.trim();
|
||||
|
||||
/* Portraits and scenes live in different folders; a numeric suffix means a plate. */
|
||||
const destOf = id =>
|
||||
id.startsWith("pc_") ? "art/portraits"
|
||||
: /^tt_\d/.test(id) ? "art/scenes"
|
||||
: "art/portraits";
|
||||
|
||||
/* ----------------------------------------------------------------- run */
|
||||
|
||||
const selected = assets.filter(a =>
|
||||
!ONLY.length || ONLY.some(o => a.id === o || a.id.startsWith(o)));
|
||||
|
||||
if (!selected.length) {
|
||||
console.error(`nothing matched --only ${ONLY.join(",")}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
/* No shell anywhere below: a prompt is full of quotes, commas and double dashes,
|
||||
and concatenating that into a command line is how you lose an afternoon. */
|
||||
if (RUN && spawnSync("mj-gen", ["--help"]).error?.code === "ENOENT") {
|
||||
console.error("mj-gen is not on PATH — run this on the machine that has the Midjourney bridge.");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let made = 0, skipped = 0;
|
||||
|
||||
for (const a of selected) {
|
||||
const dir = destOf(a.id);
|
||||
const out = path.join(dir, `${a.id}.webp`);
|
||||
const prompt = tidy(expand(a.raw));
|
||||
|
||||
if (!FORCE && existsSync(out)) {
|
||||
console.log(`skip ${a.id.padEnd(20)} exists — use --force to regenerate`);
|
||||
skipped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!RUN) {
|
||||
console.log(`\n# ${a.id} — ${a.label}\n# -> ${out}\nmj-gen "${prompt}"`);
|
||||
made++;
|
||||
continue;
|
||||
}
|
||||
|
||||
mkdirSync(dir, { recursive: true });
|
||||
console.log(`gen ${a.id.padEnd(20)} ${a.label}`);
|
||||
const r = spawnSync("mj-gen", [prompt], { stdio: "inherit" });
|
||||
if (r.status !== 0) {
|
||||
console.error(`FAILED on ${a.id} (exit ${r.status}) — stopping so you can look at it.`);
|
||||
process.exit(r.status || 1);
|
||||
}
|
||||
made++;
|
||||
}
|
||||
|
||||
console.log(`\n${RUN ? "generated" : "printed"} ${made}, skipped ${skipped}, of ${assets.length} in the sheet.`);
|
||||
if (!RUN) console.log("Nothing was generated. Add --run on a machine with mj-gen.");
|
||||
Reference in New Issue
Block a user