@heroiclands/package-build 22.17.1 → 22.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/bin/content-commands.mjs +21 -23
- package/docs/api.md +4 -14
- package/docs/commands.md +19 -18
- package/docs/reference/format-details.md +27 -45
- package/docs/reference/note-types.md +1 -1
- package/engine/actor-compiler.mjs +5 -5
- package/engine/address-diff.mjs +32 -279
- package/engine/art-fields.mjs +8 -5
- package/engine/content-format.yaml +4 -4
- package/engine/content-index.mjs +28 -3
- package/engine/content-lint.mjs +3 -182
- package/engine/frontmatter-lint.mjs +112 -59
- package/engine/helpers.mjs +15 -3
- package/engine/index.mjs +0 -3
- package/engine/map-graphviz.mjs +4 -1
- package/engine/note-frontmatter.mjs +1 -0
- package/engine/note-vocabulary.mjs +1 -13
- package/engine/subtype-registry.mjs +2 -6
- package/engine/systems.mjs +11 -13
- package/package.json +1 -1
- package/types/engine/actor-compiler.d.mts +5 -5
- package/types/engine/address-diff.d.mts +18 -107
- package/types/engine/art-fields.d.mts +4 -5
- package/types/engine/frontmatter-lint.d.mts +14 -0
- package/types/engine/helpers.d.mts +12 -1
- package/types/engine/index.d.mts +0 -1
- package/types/engine/note-vocabulary.d.mts +0 -9
- package/types/engine/subtype-registry.d.mts +2 -6
- package/types/engine/systems.d.mts +6 -6
- package/engine/note-renames.mjs +0 -134
- package/types/engine/note-renames.d.mts +0 -102
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @heroiclands/package-build
|
|
2
2
|
|
|
3
|
+
## 22.17.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
Being notes can identify encounterable NPCs, playable characters, and creatures with a checked subtype.
|
|
8
|
+
|
|
9
|
+
**Content notes**
|
|
10
|
+
|
|
11
|
+
- Notes can carry an additional system-specific block in their frontmatter.
|
|
12
|
+
|
|
13
|
+
**Content checks**
|
|
14
|
+
|
|
15
|
+
- Lint and link checks report unresolved references in SoHL system fields.
|
|
16
|
+
|
|
3
17
|
## 22.17.1
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/bin/content-commands.mjs
CHANGED
|
@@ -70,7 +70,12 @@ import { lintContentCharset } from "../engine/content-charset.mjs";
|
|
|
70
70
|
import { lintContentHtml } from "../engine/content-html.mjs";
|
|
71
71
|
import { lintContentIcons } from "../engine/content-icons.mjs";
|
|
72
72
|
import { lintContentImages } from "../engine/content-images.mjs";
|
|
73
|
-
import {
|
|
73
|
+
import {
|
|
74
|
+
declaredSystems,
|
|
75
|
+
lintFrontmatter,
|
|
76
|
+
systemAddressFindings,
|
|
77
|
+
systemBlocksFor,
|
|
78
|
+
} from "../engine/frontmatter-lint.mjs";
|
|
74
79
|
import { loadContentFormat } from "../engine/content-format.mjs";
|
|
75
80
|
import {
|
|
76
81
|
checkDeclaredFields,
|
|
@@ -124,7 +129,6 @@ import { reportFindings } from "./report.mjs";
|
|
|
124
129
|
import {
|
|
125
130
|
readItemAddresses,
|
|
126
131
|
diffItemAddresses,
|
|
127
|
-
declaredPredecessors,
|
|
128
132
|
noteFilesById,
|
|
129
133
|
locateAddressFinding,
|
|
130
134
|
addressFindingMessage,
|
|
@@ -1449,6 +1453,13 @@ function linksCommand() {
|
|
|
1449
1453
|
homepageLinks,
|
|
1450
1454
|
usedManifest,
|
|
1451
1455
|
} = auditLinks(index);
|
|
1456
|
+
const systemReferences = index.notes.flatMap((note) =>
|
|
1457
|
+
systemAddressFindings(note, {
|
|
1458
|
+
index,
|
|
1459
|
+
schemas: { ...ENGINE_NOTE_SCHEMAS, ...NOTE_SCHEMAS },
|
|
1460
|
+
systems: systemBlocksFor(config, { schemaSystem: "sohl" }),
|
|
1461
|
+
}),
|
|
1462
|
+
);
|
|
1452
1463
|
|
|
1453
1464
|
for (const d of deadAnchors) {
|
|
1454
1465
|
emitDiagnostic({
|
|
@@ -1486,6 +1497,7 @@ function linksCommand() {
|
|
|
1486
1497
|
`${f.path} — frontmatter is data and is never resolved`,
|
|
1487
1498
|
});
|
|
1488
1499
|
}
|
|
1500
|
+
for (const finding of systemReferences) emitDiagnostic(finding);
|
|
1489
1501
|
|
|
1490
1502
|
// The package homepage. Its addresses are markdown links and
|
|
1491
1503
|
// `landing:` url/href fields rather than wikilinks — it is
|
|
@@ -1506,6 +1518,7 @@ function linksCommand() {
|
|
|
1506
1518
|
deadEmbeds.length +
|
|
1507
1519
|
unlabelledLinks.length +
|
|
1508
1520
|
frontmatterLinks.length +
|
|
1521
|
+
systemReferences.length +
|
|
1509
1522
|
homepageLinks.length;
|
|
1510
1523
|
if (failures) {
|
|
1511
1524
|
log.error(`${failures} link problem(s) across ${index.notes.length} note(s).`);
|
|
@@ -2258,21 +2271,11 @@ function depsCommand() {
|
|
|
2258
2271
|
* `addresses diff` — report every published `(type, shortcode)` this build no
|
|
2259
2272
|
* longer publishes, against a released artifact.
|
|
2260
2273
|
*
|
|
2261
|
-
*
|
|
2262
|
-
*
|
|
2263
|
-
*
|
|
2264
|
-
* still in front of the author.
|
|
2265
|
-
*
|
|
2266
|
-
* **Its own command rather than a step of `package compile`.** It reads a
|
|
2267
|
-
* *second* artifact that the compile knows nothing about and that has to be
|
|
2268
|
-
* obtained separately, and it is a question about a release rather than about a
|
|
2269
|
-
* build — a repository between releases has nothing to compare against.
|
|
2274
|
+
* Compare this package's compiled Item addresses with the release artifact
|
|
2275
|
+
* named by `--from`. The command reports departed addresses and locates
|
|
2276
|
+
* findings against the current content tree or baseline artifact.
|
|
2270
2277
|
*
|
|
2271
|
-
*
|
|
2272
|
-
* takes the artifact — the `.zip` a release publishes, or a directory built
|
|
2273
|
-
* from one — for the same reason `deps fetch --from` does: a command that
|
|
2274
|
-
* reaches the network on its own is not reproducible and fails strangely
|
|
2275
|
-
* offline. In a release workflow the artifact is one line ahead of it:
|
|
2278
|
+
* `--from` accepts a release `.zip` or a directory built from one:
|
|
2276
2279
|
*
|
|
2277
2280
|
* ```sh
|
|
2278
2281
|
* gh release download v0.8.2 -p system.zip -D build/baseline
|
|
@@ -2332,10 +2335,6 @@ async function diffAddresses(config, argv) {
|
|
|
2332
2335
|
readItemAddresses(currentDirs),
|
|
2333
2336
|
{
|
|
2334
2337
|
baseline: label,
|
|
2335
|
-
// Read whether or not anything departed: an id match needs no tree,
|
|
2336
|
-
// but the diff decides rename-versus-withdrawal as it walks the
|
|
2337
|
-
// baseline, so the declarations have to be in hand before it does.
|
|
2338
|
-
predecessors: declaredPredecessors(config.paths.content, corpus),
|
|
2339
2338
|
},
|
|
2340
2339
|
);
|
|
2341
2340
|
if (!findings.length) {
|
|
@@ -2343,9 +2342,8 @@ async function diffAddresses(config, argv) {
|
|
|
2343
2342
|
return;
|
|
2344
2343
|
}
|
|
2345
2344
|
|
|
2346
|
-
//
|
|
2347
|
-
//
|
|
2348
|
-
// from.
|
|
2345
|
+
// The tree locates a matched document; otherwise the baseline locates the
|
|
2346
|
+
// departed address.
|
|
2349
2347
|
const noteFiles = noteFilesById(config.paths.content, corpus);
|
|
2350
2348
|
const severity = argv.strict ? "error" : "warning";
|
|
2351
2349
|
for (const finding of findings) {
|
package/docs/api.md
CHANGED
|
@@ -347,7 +347,7 @@ The note types the engine itself declares — vocabulary that is a fact about th
|
|
|
347
347
|
|
|
348
348
|
### `engine.noteVocabulary`
|
|
349
349
|
|
|
350
|
-
|
|
350
|
+
An addressed content note accepts exactly these top-level keys, in this order: `shortcode`, `name`, `type`, `subType`, `description`, `tags`, `data`, `hm3`, `sohl`, `dnd5e`. A key outside this list is an error. The address vocabulary recognizes three systems: `sohl`, `hm3`, and `dnd5e`. No dnd5e-specific document types are declared. Within that shape, the closed vocabularies are the `data:` container and each type's `subType`.
|
|
351
351
|
|
|
352
352
|
| Export | Signature | Returns | Use it when |
|
|
353
353
|
| ------------------------- | -------------------------------------------- | ---------------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
@@ -358,7 +358,7 @@ The closed half of a note's frontmatter: the `data:` container and each type's `
|
|
|
358
358
|
| `DECLARED_TAGS` | `const DECLARED_TAGS` | — | looking up the tags a note type may declare, grouped |
|
|
359
359
|
| `declaredTags` | `declaredTags(type, groups)` | `readonly string[]` | reading the declared tags a note of a type may carry, flattened |
|
|
360
360
|
| `applicableTagGroups` | `applicableTagGroups(type, groups)` | `object[]` | reading the declared tag groups that apply to a note type |
|
|
361
|
-
| `exclusiveTagGroups` | `exclusiveTagGroups(type, groups)` | `Array<{slot, tags}>` | reading
|
|
361
|
+
| `exclusiveTagGroups` | `exclusiveTagGroups(type, groups)` | `Array<{slot, tags}>` | reading single-valued tag slots declared for a note type |
|
|
362
362
|
| `hasTag` | `hasTag(fm, tag)` | `boolean` | checking whether a note carries a given tag, whatever scalar-or-list form it was authored in |
|
|
363
363
|
| `isDraftNote` | `isDraftNote(fm)` | `boolean` | checking whether a note is tagged as an unfinished draft |
|
|
364
364
|
| `isGmNote` | `isGmNote(fm)` | `boolean` | checking whether a note is restricted to GM-facing output |
|
|
@@ -607,13 +607,13 @@ The map from each place, drawn for the site: `package-build site` draws the map
|
|
|
607
607
|
|
|
608
608
|
### `engine.systems`
|
|
609
609
|
|
|
610
|
-
The closed registry of system ids, and the `none` that stands for no system at all. An unknown system value is an error; adding a system is a data change to this registry rather than a hardcoded set scattered through the pipeline.
|
|
610
|
+
The closed registry of system ids, and the `none` that stands for no system at all. An unknown system value is an error; adding a system is a data change to this registry rather than a hardcoded set scattered through the pipeline. The registry recognizes `sohl`, `hm3`, and `dnd5e`; no dnd5e-specific document types are declared.
|
|
611
611
|
|
|
612
612
|
| Export | Signature | Returns | Use it when |
|
|
613
613
|
| ---------------------- | -------------------------------------- | ------------------------------- | -------------------------------------------------------------------------------------- |
|
|
614
614
|
| `NO_SYSTEM` | `const NO_SYSTEM` | — | naming a systemless asset or Foundry document |
|
|
615
615
|
| `NOTE_SYSTEM` | `const NOTE_SYSTEM` | — | naming readable note content across web, book and Foundry |
|
|
616
|
-
| `SYSTEM_IDS` | `const SYSTEM_IDS` | — | enumerating
|
|
616
|
+
| `SYSTEM_IDS` | `const SYSTEM_IDS` | — | enumerating game system ids accepted in configuration and addresses |
|
|
617
617
|
| `SYSTEM_SEGMENTS` | `const SYSTEM_SEGMENTS` | — | enumerating the game systems, `note` and `none` |
|
|
618
618
|
| `isSystemId` | `isSystemId(value)` | `boolean` | checking whether a value names a game system this toolchain knows (`none` is rejected) |
|
|
619
619
|
| `isSystemSegment` | `isSystemSegment(value)` | `boolean` | checking whether a value is something the `<system>` address segment may hold |
|
|
@@ -809,16 +809,6 @@ The id a note's document is filed under: its pinned `id:`, when a note authors o
|
|
|
809
809
|
| `noteDocId` | `function noteDocId(fm,` | {string\|undefined} The document's `_id`, or `undefined` when the note has no address to derive one from. | The document id a note compiles under: its pin, or its address. |
|
|
810
810
|
| `resolveNoteId` | `function resolveNoteId(fm, opts)` | {object\|null\|undefined} `fm`, for chaining. | Fill a note's `id` in place, so everything downstream reads one value. |
|
|
811
811
|
|
|
812
|
-
### `engine.noteRenames`
|
|
813
|
-
|
|
814
|
-
The shortcodes a note declares it used to be published under. A package's `(type, shortcode)` addresses are a published interface, and `addresses diff` reports what a build stopped publishing — telling a **rename** from a **withdrawal** by matching document ids across two releases. The property that rested on is gone: an id is derived from the canonical address, which carries the shortcode, so renaming a shortcode moves the id too: both sides of the join move together, the match finds nothing, and a rename is reported as a withdrawal with no successor named.
|
|
815
|
-
|
|
816
|
-
| Export | Signature | Returns | Use it when |
|
|
817
|
-
| --------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------- |
|
|
818
|
-
| `renamedFromEntries` | `function renamedFromEntries(fm)` | {readonly unknown[]} The authored entries, in authored order; empty when the note declares none. | The `renamedFrom:` entries a note authors, exactly as authored. |
|
|
819
|
-
| `renamedFrom` | `function renamedFrom(fm)` | {string[]} The declared predecessor shortcodes. | The well-formed shortcodes among a note's `renamedFrom:` entries. |
|
|
820
|
-
| `declaresRenamedFrom` | `function declaresRenamedFrom(fm)` | {boolean} `true` when the key is present and not null. | Whether a note declares the key at all, however malformed its value. |
|
|
821
|
-
|
|
822
812
|
### `engine.metadataIndex`
|
|
823
813
|
|
|
824
814
|
The published content index — the artifact packages exchange addresses through. **A package publishes its own index; a consumer fetches the ones it depends on.** That is the whole mechanism, and it replaces a vendored link manifest that each repository committed a copy of every other repository's file into. Vendoring failed three ways, and only the last is about staleness:
|
package/docs/commands.md
CHANGED
|
@@ -1859,8 +1859,11 @@ checks frontmatter against the declared vocabulary and each system's `sohl:`
|
|
|
1859
1859
|
it), that an icon a note writes is one the registry declares, and that
|
|
1860
1860
|
markup inside a note's body does not smuggle in a character the charset
|
|
1861
1861
|
check cannot see. `--no-references` turns off the check that a frontmatter
|
|
1862
|
-
shortcode reference lands,
|
|
1863
|
-
|
|
1862
|
+
shortcode reference lands, including references in schema-declared system
|
|
1863
|
+
fields, for a tree whose cross-package references it cannot see. Address
|
|
1864
|
+
references in system fields resolve against this package and its declared
|
|
1865
|
+
dependencies; exact Item UUID validation remains part of compilation. Reads
|
|
1866
|
+
the content tree named by `root`, defaulting to
|
|
1864
1867
|
`paths.content`; writes nothing.
|
|
1865
1868
|
|
|
1866
1869
|
**OPTIONS**
|
|
@@ -2073,7 +2076,9 @@ retired — every link is an address), a wikilink authored in frontmatter
|
|
|
2073
2076
|
(which is data and is never resolved), and a package homepage's markdown
|
|
2074
2077
|
links and `landing:` addresses, which are published verbatim and use no
|
|
2075
2078
|
wikilink at all. Also reports a vendored foreign-package content index that
|
|
2076
|
-
has drifted out of reach, naming `package-build deps fetch` as the fix.
|
|
2079
|
+
has drifted out of reach, naming `package-build deps fetch` as the fix. Resolves
|
|
2080
|
+
address-valued SoHL system fields declared by the installed schema against this
|
|
2081
|
+
package and its declared dependencies.
|
|
2077
2082
|
Reads the content tree named by `root`, defaulting to `paths.content`, and
|
|
2078
2083
|
the cached content indexes of any declared dependency; writes nothing.
|
|
2079
2084
|
|
|
@@ -2683,19 +2688,15 @@ package-build addresses diff --from <zip|dir> [--strict]
|
|
|
2683
2688
|
**DESCRIPTION**
|
|
2684
2689
|
|
|
2685
2690
|
Reports every published `(type, shortcode)` address this build no longer
|
|
2686
|
-
publishes, against a released artifact
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
its
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
explicit: a command that reaches the network on its own is not
|
|
2696
|
-
reproducible. A finding is placed against the tree, at the note that made
|
|
2697
|
-
the rename, not against the compiled output it was read from. Reads the
|
|
2698
|
-
baseline artifact and the current content tree; writes nothing.
|
|
2691
|
+
publishes, against a released artifact. A departed address is identified as
|
|
2692
|
+
renamed when the same document id appears under another address; otherwise it
|
|
2693
|
+
is reported as withdrawn. An id derived from the canonical address changes
|
|
2694
|
+
with its shortcode. The old address is reported as withdrawn; the new address
|
|
2695
|
+
appears in the current package and produces no finding. Pair those addresses
|
|
2696
|
+
by hand. A pinned id lets the command identify the same document at its new
|
|
2697
|
+
address. `--from` names the baseline explicitly: a release's `.zip`, or the
|
|
2698
|
+
directory built from one. The command reads the baseline artifact and current
|
|
2699
|
+
content tree and writes diagnostics only.
|
|
2699
2700
|
|
|
2700
2701
|
**OPTIONS**
|
|
2701
2702
|
|
|
@@ -2710,8 +2711,8 @@ baseline artifact and the current content tree; writes nothing.
|
|
|
2710
2711
|
|
|
2711
2712
|
**EXIT STATUS**
|
|
2712
2713
|
|
|
2713
|
-
1 if `diff` is named with no `--from`. Without `--strict`, a
|
|
2714
|
-
|
|
2714
|
+
1 if `diff` is named with no `--from`. Without `--strict`, a departed address
|
|
2715
|
+
is reported as a warning and does not fail the run. With
|
|
2715
2716
|
`--strict`, 1 if any address is no longer published. 1 on any other thrown
|
|
2716
2717
|
error (the baseline declaring an Item pack this build does not have, or
|
|
2717
2718
|
this repository declaring no Item pack at all to diff). Otherwise 0.
|
|
@@ -303,10 +303,16 @@ has three regions:
|
|
|
303
303
|
| **Top level** | The note's identity, name, description, and publication | An error |
|
|
304
304
|
| **`data:`** | The subject itself, shared by systems | An error |
|
|
305
305
|
| **`hm3:` / `sohl:`** | The subject as one system's documents | An error |
|
|
306
|
+
| **`dnd5e:`** | A declared system block with no document field schema | Unchecked |
|
|
306
307
|
|
|
307
308
|
The complete top-level allowlist, in its required order, is `shortcode`, `name`,
|
|
308
|
-
`type`, `subType`, `description`, `tags`, `data`, `hm3`, `sohl`.
|
|
309
|
-
|
|
309
|
+
`type`, `subType`, `description`, `tags`, `data`, `hm3`, `sohl`, `dnd5e`. The
|
|
310
|
+
address vocabulary recognizes three systems: `sohl`, `hm3`, and `dnd5e`. Omit
|
|
311
|
+
fields that do not apply. The first fields of a typical note look like this:
|
|
312
|
+
|
|
313
|
+
The `dnd5e` system id is accepted in configuration and addresses. No
|
|
314
|
+
dnd5e-specific document types are declared, so the block has no field
|
|
315
|
+
vocabulary for lint or a compiler to check.
|
|
310
316
|
|
|
311
317
|
```yaml
|
|
312
318
|
---
|
|
@@ -410,7 +416,6 @@ is declared, so a near miss is a finding that names what you probably meant.
|
|
|
410
416
|
| **place character** | `place` | `fortified`, `temple`, `market`, `trading`, `merchant`, `mining`, `fishing`, `naval`, `military`, `imperial`, `provincial`, `coastal`, `river`, `lakeside`, `hill`, `mountain`, `valley`, `forest`, `woodland`, `inland`, `island`, `frontier`, `border`, `craft`, `caravan`, `pilgrimage`, `holy`, `sacred`, `free`, `ford`, `portage`, `pass`, `well` |
|
|
411
417
|
| **place scale** | `place` / `region` | `continent` |
|
|
412
418
|
| **being station** | `being` | `tradesfolk`, `common-folk`, `soldiery`, `administration`, `clergy`, `mages`, `underworld`, `dependents`, `guilded`, `unguilded` |
|
|
413
|
-
| **being kind** | `being` | `character`, `creature` |
|
|
414
419
|
| **state** | any | `draft` |
|
|
415
420
|
| **audience** | any | `gm` |
|
|
416
421
|
|
|
@@ -484,48 +489,25 @@ first because a person may be several at once and because nothing ranks
|
|
|
484
489
|
**A continent is a region carrying a tag, not a subtype**, because structurally it
|
|
485
490
|
is a region: the same fields, the same parent chain, everything but scale.
|
|
486
491
|
|
|
487
|
-
#### A being's
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
| `
|
|
494
|
-
|
|
|
495
|
-
| `
|
|
496
|
-
| `
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
**Nothing else fills the slot, and nothing else is refused for failing to.** A
|
|
508
|
-
being tagged `undead` or `beast-of-burden` is describing the subject in the
|
|
509
|
-
author's own words, in a region that is open, and this build has no standing to
|
|
510
|
-
take that back. What is refused is a near miss of one of the two — `charcter`
|
|
511
|
-
drops the note out of every query for characters while the list still renders —
|
|
512
|
-
and the two of them together. Those are the only two refusals a closed tag
|
|
513
|
-
vocabulary can make here, and both are errors, so a build carrying one fails.
|
|
514
|
-
|
|
515
|
-
**The same two words name two other things, and neither is this.** `hm3.type`
|
|
516
|
-
takes `character` or `creature` as the HM3 _document_ a being compiles to, in a
|
|
517
|
-
system block rather than in `tags:`. The note itself uses `type: being`; `type: character` is refused.
|
|
518
|
-
Three namespaces, one pair of words; the tag is the system-agnostic one, and it
|
|
519
|
-
is the only one that describes the subject rather than a document.
|
|
520
|
-
|
|
521
|
-
**Neither the book nor the website branches on the kind.** One flow serves both
|
|
522
|
-
— the authored image, then the infobox, then the prose — and a creature's box is
|
|
523
|
-
simply shorter, because it has less in it. A section with nothing to put in it is
|
|
524
|
-
not emitted at all, so a creature with no equipment has no `EQUIPMENT` heading
|
|
525
|
-
rather than an empty one, exactly as rule 4 of [the infobox](#the-infobox) drops
|
|
526
|
-
a row with no value. The tag classifies the subject, which is what makes a list
|
|
527
|
-
of the creatures in a setting a thing a query can ask for; it is not an
|
|
528
|
-
instruction to a renderer.
|
|
492
|
+
#### A being's subtype describes the subject
|
|
493
|
+
|
|
494
|
+
`being` accepts the optional top-level values `npc`, `character`, and `creature`.
|
|
495
|
+
The subtype classifies the note's subject; it does not select a Foundry Actor
|
|
496
|
+
document type.
|
|
497
|
+
|
|
498
|
+
| `subType` | the subject is |
|
|
499
|
+
| ----------- | --------------------------------------------------------------------------------------------------------------- |
|
|
500
|
+
| `npc` | A character meant to be encountered. It may describe a reusable template and need not be a singular individual. |
|
|
501
|
+
| `character` | A detailed, playable, singular individual. |
|
|
502
|
+
| `creature` | Any being that is neither a character nor an NPC. |
|
|
503
|
+
|
|
504
|
+
`hm3.type` remains the HM3 document selector and must be `character` or
|
|
505
|
+
`creature` when an HM3 being block is present. SoHL continues to compile beings
|
|
506
|
+
as `Actor.being`. The note subtype and each system's document type answer
|
|
507
|
+
different questions.
|
|
508
|
+
|
|
509
|
+
Tags remain open descriptive terms. A being may carry tags such as `undead`,
|
|
510
|
+
`soldiery`, or `draft`; those tags do not replace the `subType` classification.
|
|
529
511
|
|
|
530
512
|
The mapping tables below describe the **document** destinations. A key that
|
|
531
513
|
appears in no table still reaches the web page; it simply reaches no Foundry
|
|
@@ -28,7 +28,7 @@ These fields are accepted by every note type. A field's value can still be irrel
|
|
|
28
28
|
|
|
29
29
|
### being
|
|
30
30
|
|
|
31
|
-
**Subtypes:**
|
|
31
|
+
**Subtypes:** `npc`, `character`, `creature`.
|
|
32
32
|
|
|
33
33
|
| Field | Shape | Meaning |
|
|
34
34
|
| -------------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -448,11 +448,11 @@ export class SystemActorCompiler extends BasePackCompiler {
|
|
|
448
448
|
* The actor's two pieces of art, resolved, with the being default beneath
|
|
449
449
|
* them.
|
|
450
450
|
*
|
|
451
|
-
* **The default
|
|
452
|
-
*
|
|
453
|
-
*
|
|
454
|
-
*
|
|
455
|
-
*
|
|
451
|
+
* **The default follows the note's `subType`**, with tags as a compatibility
|
|
452
|
+
* fallback for content trees that have not migrated. Both addresses belong
|
|
453
|
+
* to the package that ships them. A tree whose index cannot answer an
|
|
454
|
+
* address — a dependency not yet fetched — falls through to the document
|
|
455
|
+
* subtype's own default, so the document is never left with no art.
|
|
456
456
|
*
|
|
457
457
|
* `tokenIcon` unset follows `icon`, and the fallback is applied after
|
|
458
458
|
* resolution rather than before: a note naming an icon and no token icon
|