@heroiclands/package-build 23.3.0 → 23.3.1
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 +12 -0
- package/bin/content-commands.mjs +293 -2
- package/docs/commands.md +183 -0
- package/docs/content-format.md +2 -0
- package/docs/reference/format-details.md +211 -39
- package/docs/reference/note-types.md +97 -80
- package/engine/appearance-profile.mjs +330 -0
- package/engine/content-format.yaml +2 -0
- package/engine/data-keys.mjs +20 -4
- package/engine/language-names.mjs +634 -0
- package/engine/literature-notes.mjs +62 -27
- package/engine/note-vocabulary.mjs +161 -2
- package/engine/npc-generate.mjs +633 -0
- package/package.json +1 -1
- package/types/engine/appearance-profile.d.mts +94 -0
- package/types/engine/data-keys.d.mts +2 -2
- package/types/engine/language-names.d.mts +140 -0
- package/types/engine/literature-notes.d.mts +14 -3
- package/types/engine/npc-generate.d.mts +124 -0
|
@@ -3679,6 +3679,164 @@ The words, and what each means:
|
|
|
3679
3679
|
|
|
3680
3680
|
<!-- being-look:end -->
|
|
3681
3681
|
|
|
3682
|
+
#### Appearance profiles
|
|
3683
|
+
|
|
3684
|
+
**A culture states what its people look like in `data.appearanceProfile`**, and
|
|
3685
|
+
`package-build npc new` draws a person of that culture from it — see
|
|
3686
|
+
[the command](../commands.md#package-build-npc-new). Only a `lore` note of
|
|
3687
|
+
`subType: culture` takes the key; on any other note it is an error at the key.
|
|
3688
|
+
|
|
3689
|
+
The profile has six keys, all required:
|
|
3690
|
+
|
|
3691
|
+
- `frame`, `eye_color`, `hair_color`, `skin_color` and `complexion` each map
|
|
3692
|
+
words of that field's [vocabulary](#a-beings-look) to positive weights. A
|
|
3693
|
+
word's chance of being drawn is its weight over the sum of the weights in its
|
|
3694
|
+
map; a word left out is never drawn.
|
|
3695
|
+
- `height` maps a `gender` word to a range, `{min, max}`, each a height in
|
|
3696
|
+
metres or feet and inches as `data.height` takes it. `female` and `male` are
|
|
3697
|
+
required. A gender with no range of its own draws from the span of every
|
|
3698
|
+
range the profile states.
|
|
3699
|
+
|
|
3700
|
+
Weight is not in the profile. It follows from the height and frame drawn: each
|
|
3701
|
+
frame word means a band of body-mass index, so a heavy frame always weighs more
|
|
3702
|
+
than a light one of the same height.
|
|
3703
|
+
|
|
3704
|
+
| Frame | Body-mass index (kg/m²) |
|
|
3705
|
+
| --------- | ----------------------- |
|
|
3706
|
+
| `scant` | 16.5 to 19 |
|
|
3707
|
+
| `light` | 19 to 21.5 |
|
|
3708
|
+
| `medium` | 21.5 to 24.5 |
|
|
3709
|
+
| `heavy` | 24.5 to 28 |
|
|
3710
|
+
| `massive` | 28 to 33 |
|
|
3711
|
+
|
|
3712
|
+
```yaml
|
|
3713
|
+
shortcode: khelathi
|
|
3714
|
+
name: { full: The Khelâthi }
|
|
3715
|
+
type: lore
|
|
3716
|
+
subType: culture
|
|
3717
|
+
data:
|
|
3718
|
+
appearanceProfile:
|
|
3719
|
+
frame: { light: 2, medium: 5, heavy: 2 }
|
|
3720
|
+
eye_color: { brown: 6, dark_brown: 3, hazel: 1 }
|
|
3721
|
+
hair_color: { black: 6, dark_brown: 3 }
|
|
3722
|
+
skin_color: { tawny: 5, olive: 3, brown: 2 }
|
|
3723
|
+
complexion: { clear: 3, weathered: 2, smooth: 2 }
|
|
3724
|
+
height:
|
|
3725
|
+
female:
|
|
3726
|
+
min: 4' 11"
|
|
3727
|
+
max: 5' 8"
|
|
3728
|
+
male:
|
|
3729
|
+
min: 5' 4"
|
|
3730
|
+
max: 6' 3"
|
|
3731
|
+
```
|
|
3732
|
+
|
|
3733
|
+
`package-build lint` checks the profile, with a finding at the word, weight or
|
|
3734
|
+
key at fault: a word outside its field's vocabulary or from another field's
|
|
3735
|
+
list, a weight that is not a positive number, a word map with no words, a
|
|
3736
|
+
missing key, a missing `female` or `male` range, a height that does not read,
|
|
3737
|
+
a range whose `min` is above its `max`, and a `height` key that is not a
|
|
3738
|
+
gender.
|
|
3739
|
+
|
|
3740
|
+
`package-build npc new` refuses a culture that states no profile, naming the
|
|
3741
|
+
culture note.
|
|
3742
|
+
|
|
3743
|
+
#### Name lists
|
|
3744
|
+
|
|
3745
|
+
**A language states how its speakers are named in `data.names`**, and
|
|
3746
|
+
`package-build npc new` draws a person's name from it, or checks a name it is
|
|
3747
|
+
given against it — see [the command](../commands.md#package-build-npc-new).
|
|
3748
|
+
Only a `skill` note of `subType: language` takes the key; on any other skill it
|
|
3749
|
+
is an error at the key. A culture reaches the lists through `data.language`,
|
|
3750
|
+
which names the language skill note its people speak, so cultures sharing a
|
|
3751
|
+
tongue share its lists.
|
|
3752
|
+
|
|
3753
|
+
The lists have two required keys, and any number of lists named by the
|
|
3754
|
+
language:
|
|
3755
|
+
|
|
3756
|
+
- `pattern` is the name's shape: placeholders such as `{given}` and `{clan}`,
|
|
3757
|
+
each naming a list, with the text around them written as it stands. Text may
|
|
3758
|
+
sit directly against a placeholder, as `sen` does in `"{given.male}sen"`.
|
|
3759
|
+
`"{given} {clan}"` puts the given name first, `"{family} {given}"` puts the
|
|
3760
|
+
family name first, and `"{given} yra {clan}"` joins the two with a particle.
|
|
3761
|
+
A pattern takes one of three forms:
|
|
3762
|
+
- **one pattern**, which every name takes;
|
|
3763
|
+
- **a list of patterns**, for a tongue whose people are named in several
|
|
3764
|
+
forms — by standing, by place, or by given name alone. A name may take any
|
|
3765
|
+
of them, and a drawn name takes one of them;
|
|
3766
|
+
- **a map of `gender` words** to a pattern or a list of them, for a tongue
|
|
3767
|
+
whose forms differ by gender. A gender with no pattern of its own takes
|
|
3768
|
+
every pattern stated.
|
|
3769
|
+
- `given` maps a `gender` word to a list of given names. `female` and `male`
|
|
3770
|
+
are required. `{given}` draws from the list for the person's gender, or from
|
|
3771
|
+
every given list together where that gender has none. `{given.<gender>}`
|
|
3772
|
+
draws from that gender's list whatever the person's gender, as a patronymic
|
|
3773
|
+
draws a father's name.
|
|
3774
|
+
- Every other key is a list of names that the placeholder of the same name
|
|
3775
|
+
draws from. A list name is letters, digits and underscores, beginning with a
|
|
3776
|
+
letter.
|
|
3777
|
+
|
|
3778
|
+
Each placeholder draws one name from its list, each name as likely as any
|
|
3779
|
+
other, and a drawn name takes one of its gender's patterns, each as likely as
|
|
3780
|
+
any other.
|
|
3781
|
+
|
|
3782
|
+
A tongue whose people are named by standing states each form in a list:
|
|
3783
|
+
|
|
3784
|
+
```yaml
|
|
3785
|
+
shortcode: khelathilng
|
|
3786
|
+
name: { full: Khelâthi Language }
|
|
3787
|
+
type: skill
|
|
3788
|
+
subType: language
|
|
3789
|
+
data:
|
|
3790
|
+
names:
|
|
3791
|
+
pattern: ["{given} {house}", "{given} ez {place}", "{given}"]
|
|
3792
|
+
given:
|
|
3793
|
+
female: [Rethutê, Agosi, Ahmuzê]
|
|
3794
|
+
male: [Aguri, Khelemûr, Gezebari]
|
|
3795
|
+
house: [Reth'el'Lêru, Uqa'el'Lêru]
|
|
3796
|
+
place: [Zileti, Iqu, Lut-Psaqa]
|
|
3797
|
+
```
|
|
3798
|
+
|
|
3799
|
+
A Khelâthi culture names its tongue with `language: skill-khelathilng`. A
|
|
3800
|
+
person drawn from these lists is called something like _Rethutê Reth'el'Lêru_,
|
|
3801
|
+
_Khelemûr ez Iqu_ or _Ahmuzê_, and a name an author gives in any of the three
|
|
3802
|
+
forms fits. A name fits when it takes one of the gender's patterns with every
|
|
3803
|
+
placeholder filled by a name of its list, the given name from the list for the
|
|
3804
|
+
person's gender: _Agosi ez Zileti_ fits a woman and not a man, and _Aguri ez
|
|
3805
|
+
Lut_ fits nobody, because _Lut_ is not in `place`. Names compare in Unicode
|
|
3806
|
+
NFC, so a precomposed and a decomposed accent are the same letter.
|
|
3807
|
+
|
|
3808
|
+
A tongue whose people carry a parent's name, with an ending that depends on
|
|
3809
|
+
their own gender, keys its patterns by gender:
|
|
3810
|
+
|
|
3811
|
+
```yaml
|
|
3812
|
+
shortcode: northlng
|
|
3813
|
+
name: { full: Northern Language }
|
|
3814
|
+
type: skill
|
|
3815
|
+
subType: language
|
|
3816
|
+
data:
|
|
3817
|
+
names:
|
|
3818
|
+
pattern:
|
|
3819
|
+
male: "{given} {given.male}sen"
|
|
3820
|
+
female: "{given} {given.male}dóttir"
|
|
3821
|
+
given:
|
|
3822
|
+
female: [Sigrid, Astrid, Ragna]
|
|
3823
|
+
male: [Ulf, Harald, Torvald]
|
|
3824
|
+
```
|
|
3825
|
+
|
|
3826
|
+
A man drawn from these lists is called something like _Ulf Torvaldsen_ and a
|
|
3827
|
+
woman _Astrid Ulfdóttir_: the second name is a man's given name either way,
|
|
3828
|
+
with the ending the pattern for the person's gender gives it. _Ulf
|
|
3829
|
+
Haralddóttir_ does not fit a man, because it has the form of the women's
|
|
3830
|
+
pattern.
|
|
3831
|
+
|
|
3832
|
+
`package-build lint` checks the lists, with a finding at the pattern, list,
|
|
3833
|
+
name or key at fault: a pattern with an unmatched brace or no placeholder, a
|
|
3834
|
+
placeholder that names no list, a `{given.<gender>}` whose gender has no given
|
|
3835
|
+
list, a dotted placeholder on a list other than `given`, a list that no pattern
|
|
3836
|
+
names, a list name a placeholder cannot spell, an empty list of patterns or of
|
|
3837
|
+
names, an empty name, a missing `pattern` or `given`, a missing `female` or
|
|
3838
|
+
`male` list, and a `pattern` or `given` key that is not a gender.
|
|
3839
|
+
|
|
3682
3840
|
#### The bodies a being belongs to, and its standing in each
|
|
3683
3841
|
|
|
3684
3842
|
**Membership**: `{rank: number, office: string, societies: string[]}` — `rank`
|
|
@@ -4684,11 +4842,16 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
4684
4842
|
- combat
|
|
4685
4843
|
- combattechnique
|
|
4686
4844
|
|
|
4687
|
-
| `data` property
|
|
4688
|
-
|
|
|
4689
|
-
| `templatePriority`
|
|
4690
|
-
| `masteryLevel`
|
|
4691
|
-
| `parentSkill`
|
|
4845
|
+
| `data` property | Values | Description |
|
|
4846
|
+
| -------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
4847
|
+
| `templatePriority` | `number` | Template priority, _null_ = not a template |
|
|
4848
|
+
| `masteryLevel` | `number` | HM3 mastery level |
|
|
4849
|
+
| `parentSkill` | `Address` | Parent skill this skill specializes |
|
|
4850
|
+
| `names` | `{ pattern, given, <name>... }` | `language` only: how its speakers are named, for `package-build npc new` — see [name lists](#name-lists) |
|
|
4851
|
+
| `names.pattern` | `string`, `string[]` or map of `gender` words to either, required | Placeholders such as `{given}`, `{given.male}` and `{clan}`, each naming a list, with literal text around them; a list states several forms, a map each gender's forms |
|
|
4852
|
+
| `names.given` | map of `gender` words to lists of names, required | Given names by gender; `female` and `male` are required |
|
|
4853
|
+
| `names.given.<name>` | `string[]` | The given names of one gender |
|
|
4854
|
+
| `names.<name>` | `string[]` | A list the placeholder of the same name draws from |
|
|
4692
4855
|
|
|
4693
4856
|
if a `sohl` property is present, a SoHL item of type "skill" is created.
|
|
4694
4857
|
|
|
@@ -4851,40 +5014,49 @@ naming any other note is an error at the value. A `lore` note that states no cul
|
|
|
4851
5014
|
none, since a `lore` note has no `data.parents` to inherit through; a culture note reads as
|
|
4852
5015
|
its own Address in the index. See [Culture in the index](#culture-in-the-index).
|
|
4853
5016
|
|
|
4854
|
-
| `data` property
|
|
4855
|
-
|
|
|
4856
|
-
| `epoch`
|
|
4857
|
-
| `months`
|
|
4858
|
-
| `months[].name`
|
|
4859
|
-
| `months[].abbreviation`
|
|
4860
|
-
| `months[].days`
|
|
4861
|
-
| `weekdays`
|
|
4862
|
-
| `weekdays[].name`
|
|
4863
|
-
| `weekdays[].abbreviation`
|
|
4864
|
-
| `seasons`
|
|
4865
|
-
| `seasons[].name`
|
|
4866
|
-
| `seasons[].abbreviation`
|
|
4867
|
-
| `seasons[].start`
|
|
4868
|
-
| `namedDays`
|
|
4869
|
-
| `namedDays[].name`
|
|
4870
|
-
| `namedDays[].abbreviation`
|
|
4871
|
-
| `namedDays[].day`
|
|
4872
|
-
| `eras`
|
|
4873
|
-
| `eras[].shortcode`
|
|
4874
|
-
| `eras[].name`
|
|
4875
|
-
| `eras[].marker`
|
|
4876
|
-
| `eras[].abbreviation`
|
|
4877
|
-
| `eras[].proclaimedBy`
|
|
4878
|
-
| `eras[].start`
|
|
4879
|
-
| `eras[].label`
|
|
4880
|
-
| `eras[].label.after`
|
|
4881
|
-
| `eras[].label.before`
|
|
4882
|
-
| `formats`
|
|
4883
|
-
| `culture`
|
|
4884
|
-
| `form`
|
|
4885
|
-
| `subjects`
|
|
4886
|
-
| `language`
|
|
4887
|
-
| `events`
|
|
5017
|
+
| `data` property | Values | Description |
|
|
5018
|
+
| ------------------------------------- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
5019
|
+
| `epoch` | canonical `<year>.<day>` | The canonical day that equals calendar year 1, day 1 |
|
|
5020
|
+
| `months` | `{ name, abbreviation?, days }[]` | Ordered months; their days sum to the world's year |
|
|
5021
|
+
| `months[].name` | `string`, required | The month's name |
|
|
5022
|
+
| `months[].abbreviation` | `string` | Its short form, for a compact date |
|
|
5023
|
+
| `months[].days` | `integer`, required | How many days the month holds |
|
|
5024
|
+
| `weekdays` | `{ name, abbreviation? }[]` | Ordered week days, indexed from zero; weeks run continuously |
|
|
5025
|
+
| `weekdays[].name` | `string`, required | The day's name |
|
|
5026
|
+
| `weekdays[].abbreviation` | `string` | Its short form, for a compact date |
|
|
5027
|
+
| `seasons` | `{ name, abbreviation?, start }[]` | Seasons starting on one-based days of year |
|
|
5028
|
+
| `seasons[].name` | `string`, required | The season's name |
|
|
5029
|
+
| `seasons[].abbreviation` | `string` | Its short form, for a compact date |
|
|
5030
|
+
| `seasons[].start` | `integer`, required | The one-based day of the year it begins; starts increase down the list |
|
|
5031
|
+
| `namedDays` | `{ name, abbreviation?, day }[]` | Names assigned to one-based days of year |
|
|
5032
|
+
| `namedDays[].name` | `string`, required | The day's name |
|
|
5033
|
+
| `namedDays[].abbreviation` | `string` | Its short form, for a compact date |
|
|
5034
|
+
| `namedDays[].day` | `integer`, required | The one-based day of the year it names, distinct within the calendar |
|
|
5035
|
+
| `eras` | `{ shortcode, name, abbreviation?, marker?, proclaimedBy?, start, label? }[]` | Year counts; `start` is `null` or an in-calendar year |
|
|
5036
|
+
| `eras[].shortcode` | `string`, required | The era's own segment of `<calendar>.<era>`, unique within the calendar |
|
|
5037
|
+
| `eras[].name` | `string`, required | The era's name |
|
|
5038
|
+
| `eras[].marker` | `string` | Uppercase letters and digits, beginning with a letter, unique across the corpus; an authored date names the era by it |
|
|
5039
|
+
| `eras[].abbreviation` | `string` | Its short form, for a compact date |
|
|
5040
|
+
| `eras[].proclaimedBy` | `Address` | The body that began the reckoning |
|
|
5041
|
+
| `eras[].start` | `null` or `integer`, required | The calendar year the era begins; `null` for the era before year 1 |
|
|
5042
|
+
| `eras[].label` | `string` or `{ after?, before? }` | How a date in the era reads, around one `{date}` slot; a string is `after` |
|
|
5043
|
+
| `eras[].label.after` | `string` | How a date from the era's start reads, with exactly one `{date}` |
|
|
5044
|
+
| `eras[].label.before` | `string` | How a date before the era's start reads, with exactly one `{date}` |
|
|
5045
|
+
| `formats` | map of names to Calendaria patterns | Named date formats; `std` is the preferred default |
|
|
5046
|
+
| `culture` | `Address` | The people this lore belongs to — for a `literature` note, the people whose work it is — naming a lore note with `subType: culture`; not on a `culture` note |
|
|
5047
|
+
| `form` | `string` | `literature` only: the kind of work in its people's own terms — `epic`, `saga`, `praise-song`, `elegy`. Free text |
|
|
5048
|
+
| `subjects` | `Address[]` | `literature` only: the beings, places, gods and other notes the work concerns, and any event, as `note#id` |
|
|
5049
|
+
| `language` | `Address` | `literature` and `culture` only: the tongue a work is composed in, or a culture's people speak, naming a skill note with `subType: language`; `package-build npc new` draws a culture's names from that language's [name lists](#name-lists) |
|
|
5050
|
+
| `events` | event entries — see [Events](#events) | What happened to or at this subject: dated, attributed events |
|
|
5051
|
+
| `appearanceProfile` | `{ frame, eye_color, hair_color, skin_color, complexion, height }` | `culture` only: what its people look like, for `package-build npc new` — see [appearance profiles](#appearance-profiles) |
|
|
5052
|
+
| `appearanceProfile.frame` | map of `frame` words to positive weights, required | How often each frame is drawn |
|
|
5053
|
+
| `appearanceProfile.eye_color` | map of `eye_color` words to positive weights, required | How often each eye colour is drawn |
|
|
5054
|
+
| `appearanceProfile.hair_color` | map of `hair_color` words to positive weights, required | How often each hair colour is drawn |
|
|
5055
|
+
| `appearanceProfile.skin_color` | map of `skin_color` words to positive weights, required | How often each skin colour is drawn |
|
|
5056
|
+
| `appearanceProfile.complexion` | map of `complexion` words to positive weights, required | How often each complexion is drawn |
|
|
5057
|
+
| `appearanceProfile.height` | map of `gender` words to `{ min, max }`, required | Height ranges by gender; `female` and `male` are required |
|
|
5058
|
+
| `appearanceProfile.height.<name>.min` | height in metres or feet and inches, required | The shortest height drawn for that gender |
|
|
5059
|
+
| `appearanceProfile.height.<name>.max` | height in metres or feet and inches, required | The tallest height drawn for that gender |
|
|
4888
5060
|
|
|
4889
5061
|
`data.events` is available on every `lore` subType, and is described in full under [Events](#events).
|
|
4890
5062
|
|
|
@@ -443,12 +443,20 @@ These fields are accepted by every note type. A field's value can still be irrel
|
|
|
443
443
|
|
|
444
444
|
**Subtypes:** `social`, `nature`, `craft`, `lore`, `language`, `script`, `mystical`, `physical`, `combat`, `combattechnique`.
|
|
445
445
|
|
|
446
|
-
| Field | Shape
|
|
447
|
-
| ----------------------- |
|
|
448
|
-
| `data.icon` | an Address
|
|
449
|
-
| `data.templatePriority` | number
|
|
450
|
-
| `data.masteryLevel` | number
|
|
451
|
-
| `data.parentSkill` | an Address
|
|
446
|
+
| Field | Shape | Meaning |
|
|
447
|
+
| ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
448
|
+
| `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
|
|
449
|
+
| `data.templatePriority` | number | Template priority; unset means the note is not a template. |
|
|
450
|
+
| `data.masteryLevel` | number | Mastery before any modifier. |
|
|
451
|
+
| `data.parentSkill` | an Address | The skill this one specialises. |
|
|
452
|
+
| `data.names` | a language's name lists | How this language's speakers are named, for `package-build npc new`: `pattern` builds a name from placeholders such as "{given} {clan}" and literal text, `given` maps a gender to a list of given names, `female` and `male` required, and every other key is a list of names a placeholder of the same name draws from. A language skill note only. See [name lists](format-details.md#name-lists). |
|
|
453
|
+
|
|
454
|
+
**Inner keys** — a key a field's value does not declare is an error at its own line and column.
|
|
455
|
+
|
|
456
|
+
| Key | Shape | Required | Meaning |
|
|
457
|
+
| -------------------- | --------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
458
|
+
| `data.names.pattern` | a pattern such as "{given} {clan}", a list of them, or a map of genders to either | yes | How a name is built: each `{list}` placeholder is filled from the list of that name, `{given.<gender>}` from that gender's given names, and the text around them is written as it stands. A list states every form a name may take; a map keyed by gender states each gender's forms, and a gender with none takes every pattern stated. |
|
|
459
|
+
| `data.names.given` | a map of genders to lists of names | yes | Given names by gender word. A gender with no list draws from every given list together. |
|
|
452
460
|
|
|
453
461
|
**System mappings**
|
|
454
462
|
|
|
@@ -516,83 +524,92 @@ These fields are accepted by every note type. A field's value can still be irrel
|
|
|
516
524
|
|
|
517
525
|
Lore records in-world knowledge. A `culture` describes a people; a `custom` describes how they practice a rite, observance, or usage. A `material` describes a physical constituent and its qualities, which may vary by region. See the [lore subtype definitions](format-details.md#type-lore) for the complete vocabulary.
|
|
518
526
|
|
|
519
|
-
| Field
|
|
520
|
-
|
|
|
521
|
-
| `data.epoch`
|
|
522
|
-
| `data.months`
|
|
523
|
-
| `data.weekdays`
|
|
524
|
-
| `data.seasons`
|
|
525
|
-
| `data.namedDays`
|
|
526
|
-
| `data.eras`
|
|
527
|
-
| `data.formats`
|
|
528
|
-
| `data.culture`
|
|
529
|
-
| `data.form`
|
|
530
|
-
| `data.subjects`
|
|
531
|
-
| `data.language`
|
|
532
|
-
| `data.events`
|
|
527
|
+
| Field | Shape | Meaning |
|
|
528
|
+
| ------------------------ | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
529
|
+
| `data.epoch` | a canonical `<year>.<day>` | Canonical day when calendar year 1, day 1 begins — `1.1`. |
|
|
530
|
+
| `data.months` | list of `{ name, abbreviation?, days }` | The months this calendar keeps, in order — position in the list is position in the year, and the day counts sum to the world's year. |
|
|
531
|
+
| `data.weekdays` | list of `{ name, abbreviation? }` | The days of the week this calendar names, in order. A calendar with no week writes none. |
|
|
532
|
+
| `data.seasons` | list of `{ name, abbreviation?, start }` | The seasons this calendar marks, starting on numbered days of the year. |
|
|
533
|
+
| `data.namedDays` | list of `{ name, abbreviation?, day }` | Names assigned to particular days of the year. |
|
|
534
|
+
| `data.eras` | list of `{ shortcode, name, marker?, abbreviation?, proclaimedBy?, start, label? }` | The year-counts kept in this calendar. A marker names one era and uses these months. |
|
|
535
|
+
| `data.formats` | map of named Calendaria format strings | Named patterns for reading and writing this calendar's dates. |
|
|
536
|
+
| `data.culture` | an Address | The people this lore belongs to — for a work of literature, the people whose work it is — as a culture lore note. A culture note is its own culture, and states the field only as itself. |
|
|
537
|
+
| `data.form` | string | The kind of work in its people's own terms — an epic, a saga, a praise-song, an elegy. Free text. |
|
|
538
|
+
| `data.subjects` | list of Addresses | The beings, places, gods and other notes the work concerns, and each event it concerns, named as `place-ironfells#sack`. |
|
|
539
|
+
| `data.language` | an Address | The tongue the work is composed in, or on a culture note the tongue its people speak, as a language skill note. `package-build npc new` draws a culture's names from its language's `data.names`. A `literature` or `culture` note only. |
|
|
540
|
+
| `data.events` | list of event entries | What happened to or at this subject — each entry one dated, attributed event: a founding, a war, a fall, or an occasion that recurs. |
|
|
541
|
+
| `data.appearanceProfile` | an appearance profile | What this culture's people look like, for `package-build npc new`: `frame`, `eye_color`, `hair_color`, `skin_color` and `complexion` each map words of that field's vocabulary to positive weights, and `height` maps a gender to a `{min, max}` range, `female` and `male` required. A culture note only. See [appearance profiles](format-details.md#appearance-profiles). |
|
|
533
542
|
|
|
534
543
|
**Inner keys** — a key a field's value does not declare is an error at its own line and column.
|
|
535
544
|
|
|
536
|
-
| Key | Shape | Required | Meaning
|
|
537
|
-
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | -------- |
|
|
538
|
-
| `data.months[].name` | a string | yes | What it is called.
|
|
539
|
-
| `data.months[].abbreviation` | a string | no | Its short form, for a compact date.
|
|
540
|
-
| `data.months[].days` | a whole number of days | yes | How many days the month holds.
|
|
541
|
-
| `data.weekdays[].name` | a string | yes | What it is called.
|
|
542
|
-
| `data.weekdays[].abbreviation` | a string | no | Its short form, for a compact date.
|
|
543
|
-
| `data.seasons[].name` | a string | yes | What it is called.
|
|
544
|
-
| `data.seasons[].abbreviation` | a string | no | Its short form, for a compact date.
|
|
545
|
-
| `data.seasons[].start` | a one-based day of the year, as a whole number | yes | The day of the year the season begins.
|
|
546
|
-
| `data.namedDays[].name` | a string | yes | What it is called.
|
|
547
|
-
| `data.namedDays[].abbreviation` | a string | no | Its short form, for a compact date.
|
|
548
|
-
| `data.namedDays[].day` | a one-based day of the year, as a whole number | yes | The day of the year it names.
|
|
549
|
-
| `data.eras[].shortcode` | the era's own shortcode, unique within the calendar — an era is addressed `<calendar shortcode>.<era shortcode>` | yes | The era's own segment of `<calendar>.<era>`.
|
|
550
|
-
| `data.eras[].name` | a string | yes | What it is called.
|
|
551
|
-
| `data.eras[].marker` | uppercase letters and digits, beginning with a letter | no | The marker an authored date names the era by, unique across the corpus.
|
|
552
|
-
| `data.eras[].abbreviation` | a string | no | Its short form, for a compact date.
|
|
553
|
-
| `data.eras[].proclaimedBy` | an Address | no | The body that began the reckoning.
|
|
554
|
-
| `data.eras[].start` | `null`, or the calendar year the era begins, as a whole number | yes | The calendar year the era begins; `null` for the era before year 1.
|
|
555
|
-
| `data.eras[].label` | a string, or an `{ after, before }` map | no | How a date in the era reads, around one `{date}` slot.
|
|
556
|
-
| `data.eras[].label.after` | a string with one `{date}` slot | no | How a date in the era reads.
|
|
557
|
-
| `data.eras[].label.before` | a string with one `{date}` slot | no | How a date before the era's start reads.
|
|
558
|
-
| `data.events[].id` | an address segment | no | The event's name within its note — lowercase letters and digits.
|
|
559
|
-
| `data.events[].kind` | one `eventKind` value | no | What sort of thing happened.
|
|
560
|
-
| `data.events[].depth` | one `depth` value | no | How far the event's history reaches.
|
|
561
|
-
| `data.events[].when` | a date, or `"0.<day>"` | yes | When it happened, or the anchor and first instance of an event that recurs.
|
|
562
|
-
| `data.events[].until` | a date | no | When a continuous event ended, or where a recurring series stopped.
|
|
563
|
-
| `data.events[].recurs` | `{ every }` or `{ on }` | no | How further occurrences are found; absent for an event that happened once.
|
|
564
|
-
| `data.events[].recurs.every` | a whole number of years, 1 or more | no | A period counted on the canonical axis from `when`.
|
|
565
|
-
| `data.events[].recurs.on` | a list of dates, strictly increasing, each later than `when` | no | Recorded occurrences beyond the first, in place of a period.
|
|
566
|
-
| `data.events[].summary` | a string | yes | What happened, stated plainly.
|
|
567
|
-
| `data.events[].standing` | one `standing` value | no | What the world's evidence supports.
|
|
568
|
-
| `data.events[].names` | `{ name, by, gloss? }[]` | no | The event's names in the world, each with who uses it.
|
|
569
|
-
| `data.events[].names[].name` | a string | yes | One name the event goes by in the world.
|
|
570
|
-
| `data.events[].names[].by` | an Address naming an `affiliation`, `lore`, `place`, `being` or `skill` note | yes | Who uses that name — a people, a polity, a faith, a place, a tongue.
|
|
571
|
-
| `data.events[].names[].gloss` | a string | no | What the name means, or how it is used.
|
|
572
|
-
| `data.events[].where` | `{ locus?, reach? }` | no | Where it happened, and where it was felt.
|
|
573
|
-
| `data.events[].where.locus` | a list of Addresses, each defaulting to `place` | no | Where the event physically happened; each resolves to a place.
|
|
574
|
-
| `data.events[].where.reach` | `{ place, how, knowledge, attributedTo? }[]` | no | Where the event was felt, and whether each place knows why.
|
|
575
|
-
| `data.events[].where.reach[].place` | an Address, defaulting to `place` | yes | A place where the event was felt.
|
|
576
|
-
| `data.events[].where.reach[].how` | a string | yes | One clause: a consequence someone in that place could notice.
|
|
577
|
-
| `data.events[].where.reach[].knowledge` | one `knowledge` value | yes | Whether that place connects what it felt to this event.
|
|
578
|
-
| `data.events[].where.reach[].attributedTo` | an Address, defaulting to `lore`, naming an event or a `lore` note | no | Only beside `knowledge: misattributed` — the cause that place names instead.
|
|
579
|
-
| `data.events[].who` | `{ ref, role }[]` | no | Who took part, and as what.
|
|
580
|
-
| `data.events[].who[].ref` | an Address naming a `being`, `affiliation` or `lore` note | yes | A participant — a being, a people, an affiliation.
|
|
581
|
-
| `data.events[].who[].role` | one `role` value | yes | What the participant was to the event.
|
|
582
|
-
| `data.events[].follows` | `{ event, how, note? }[]` | no | The earlier events this one follows from.
|
|
583
|
-
| `data.events[].follows[].event` | an Address, defaulting to `lore`, anchored to an `event` where its note holds several | yes | The earlier event; it resolves to exactly one event.
|
|
584
|
-
| `data.events[].follows[].how` | one `followsHow` value | yes | How this event follows from it.
|
|
585
|
-
| `data.events[].follows[].note` | a string | no | One clause saying what connects the two.
|
|
586
|
-
| `data.events[].accounts` | `{ by, says, agrees, withholds? }[]` | no | What each people, polity, faith or place says about it.
|
|
587
|
-
| `data.events[].accounts[].by` | an Address naming an `affiliation`, `lore`, `place` or `being` note | yes | Who holds the account.
|
|
588
|
-
| `data.events[].accounts[].says` | a string | yes | What they say happened, in their terms.
|
|
589
|
-
| `data.events[].accounts[].agrees` | one `agrees` value | yes | How far their account agrees with `summary`.
|
|
590
|
-
| `data.events[].accounts[].withholds` | a string | no | What they decline to say.
|
|
591
|
-
| `data.events[].unresolved` | a list of strings | no | What the world itself has not settled.
|
|
592
|
-
| `data.events[].sources` | a list of Addresses | no | The notes that state or support the event; each resolves.
|
|
593
|
-
| `data.events[].stated` | `{ calendar, text }` | no | The date as one tradition writes it in its own reckoning.
|
|
594
|
-
| `data.events[].stated.calendar` | an Address, or a lore shortcode | yes | The calendar that tradition reckons in — a `lore` note with `subType: calendar`.
|
|
595
|
-
| `data.events[].stated.text` | a string | yes | The date as that tradition writes it.
|
|
545
|
+
| Key | Shape | Required | Meaning |
|
|
546
|
+
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------ |
|
|
547
|
+
| `data.months[].name` | a string | yes | What it is called. |
|
|
548
|
+
| `data.months[].abbreviation` | a string | no | Its short form, for a compact date. |
|
|
549
|
+
| `data.months[].days` | a whole number of days | yes | How many days the month holds. |
|
|
550
|
+
| `data.weekdays[].name` | a string | yes | What it is called. |
|
|
551
|
+
| `data.weekdays[].abbreviation` | a string | no | Its short form, for a compact date. |
|
|
552
|
+
| `data.seasons[].name` | a string | yes | What it is called. |
|
|
553
|
+
| `data.seasons[].abbreviation` | a string | no | Its short form, for a compact date. |
|
|
554
|
+
| `data.seasons[].start` | a one-based day of the year, as a whole number | yes | The day of the year the season begins. |
|
|
555
|
+
| `data.namedDays[].name` | a string | yes | What it is called. |
|
|
556
|
+
| `data.namedDays[].abbreviation` | a string | no | Its short form, for a compact date. |
|
|
557
|
+
| `data.namedDays[].day` | a one-based day of the year, as a whole number | yes | The day of the year it names. |
|
|
558
|
+
| `data.eras[].shortcode` | the era's own shortcode, unique within the calendar — an era is addressed `<calendar shortcode>.<era shortcode>` | yes | The era's own segment of `<calendar>.<era>`. |
|
|
559
|
+
| `data.eras[].name` | a string | yes | What it is called. |
|
|
560
|
+
| `data.eras[].marker` | uppercase letters and digits, beginning with a letter | no | The marker an authored date names the era by, unique across the corpus. |
|
|
561
|
+
| `data.eras[].abbreviation` | a string | no | Its short form, for a compact date. |
|
|
562
|
+
| `data.eras[].proclaimedBy` | an Address | no | The body that began the reckoning. |
|
|
563
|
+
| `data.eras[].start` | `null`, or the calendar year the era begins, as a whole number | yes | The calendar year the era begins; `null` for the era before year 1. |
|
|
564
|
+
| `data.eras[].label` | a string, or an `{ after, before }` map | no | How a date in the era reads, around one `{date}` slot. |
|
|
565
|
+
| `data.eras[].label.after` | a string with one `{date}` slot | no | How a date in the era reads. |
|
|
566
|
+
| `data.eras[].label.before` | a string with one `{date}` slot | no | How a date before the era's start reads. |
|
|
567
|
+
| `data.events[].id` | an address segment | no | The event's name within its note — lowercase letters and digits. |
|
|
568
|
+
| `data.events[].kind` | one `eventKind` value | no | What sort of thing happened. |
|
|
569
|
+
| `data.events[].depth` | one `depth` value | no | How far the event's history reaches. |
|
|
570
|
+
| `data.events[].when` | a date, or `"0.<day>"` | yes | When it happened, or the anchor and first instance of an event that recurs. |
|
|
571
|
+
| `data.events[].until` | a date | no | When a continuous event ended, or where a recurring series stopped. |
|
|
572
|
+
| `data.events[].recurs` | `{ every }` or `{ on }` | no | How further occurrences are found; absent for an event that happened once. |
|
|
573
|
+
| `data.events[].recurs.every` | a whole number of years, 1 or more | no | A period counted on the canonical axis from `when`. |
|
|
574
|
+
| `data.events[].recurs.on` | a list of dates, strictly increasing, each later than `when` | no | Recorded occurrences beyond the first, in place of a period. |
|
|
575
|
+
| `data.events[].summary` | a string | yes | What happened, stated plainly. |
|
|
576
|
+
| `data.events[].standing` | one `standing` value | no | What the world's evidence supports. |
|
|
577
|
+
| `data.events[].names` | `{ name, by, gloss? }[]` | no | The event's names in the world, each with who uses it. |
|
|
578
|
+
| `data.events[].names[].name` | a string | yes | One name the event goes by in the world. |
|
|
579
|
+
| `data.events[].names[].by` | an Address naming an `affiliation`, `lore`, `place`, `being` or `skill` note | yes | Who uses that name — a people, a polity, a faith, a place, a tongue. |
|
|
580
|
+
| `data.events[].names[].gloss` | a string | no | What the name means, or how it is used. |
|
|
581
|
+
| `data.events[].where` | `{ locus?, reach? }` | no | Where it happened, and where it was felt. |
|
|
582
|
+
| `data.events[].where.locus` | a list of Addresses, each defaulting to `place` | no | Where the event physically happened; each resolves to a place. |
|
|
583
|
+
| `data.events[].where.reach` | `{ place, how, knowledge, attributedTo? }[]` | no | Where the event was felt, and whether each place knows why. |
|
|
584
|
+
| `data.events[].where.reach[].place` | an Address, defaulting to `place` | yes | A place where the event was felt. |
|
|
585
|
+
| `data.events[].where.reach[].how` | a string | yes | One clause: a consequence someone in that place could notice. |
|
|
586
|
+
| `data.events[].where.reach[].knowledge` | one `knowledge` value | yes | Whether that place connects what it felt to this event. |
|
|
587
|
+
| `data.events[].where.reach[].attributedTo` | an Address, defaulting to `lore`, naming an event or a `lore` note | no | Only beside `knowledge: misattributed` — the cause that place names instead. |
|
|
588
|
+
| `data.events[].who` | `{ ref, role }[]` | no | Who took part, and as what. |
|
|
589
|
+
| `data.events[].who[].ref` | an Address naming a `being`, `affiliation` or `lore` note | yes | A participant — a being, a people, an affiliation. |
|
|
590
|
+
| `data.events[].who[].role` | one `role` value | yes | What the participant was to the event. |
|
|
591
|
+
| `data.events[].follows` | `{ event, how, note? }[]` | no | The earlier events this one follows from. |
|
|
592
|
+
| `data.events[].follows[].event` | an Address, defaulting to `lore`, anchored to an `event` where its note holds several | yes | The earlier event; it resolves to exactly one event. |
|
|
593
|
+
| `data.events[].follows[].how` | one `followsHow` value | yes | How this event follows from it. |
|
|
594
|
+
| `data.events[].follows[].note` | a string | no | One clause saying what connects the two. |
|
|
595
|
+
| `data.events[].accounts` | `{ by, says, agrees, withholds? }[]` | no | What each people, polity, faith or place says about it. |
|
|
596
|
+
| `data.events[].accounts[].by` | an Address naming an `affiliation`, `lore`, `place` or `being` note | yes | Who holds the account. |
|
|
597
|
+
| `data.events[].accounts[].says` | a string | yes | What they say happened, in their terms. |
|
|
598
|
+
| `data.events[].accounts[].agrees` | one `agrees` value | yes | How far their account agrees with `summary`. |
|
|
599
|
+
| `data.events[].accounts[].withholds` | a string | no | What they decline to say. |
|
|
600
|
+
| `data.events[].unresolved` | a list of strings | no | What the world itself has not settled. |
|
|
601
|
+
| `data.events[].sources` | a list of Addresses | no | The notes that state or support the event; each resolves. |
|
|
602
|
+
| `data.events[].stated` | `{ calendar, text }` | no | The date as one tradition writes it in its own reckoning. |
|
|
603
|
+
| `data.events[].stated.calendar` | an Address, or a lore shortcode | yes | The calendar that tradition reckons in — a `lore` note with `subType: calendar`. |
|
|
604
|
+
| `data.events[].stated.text` | a string | yes | The date as that tradition writes it. |
|
|
605
|
+
| `data.appearanceProfile.frame` | a map of words to weights | yes | Weighted `frame` words; a word left out is never drawn. |
|
|
606
|
+
| `data.appearanceProfile.eye_color` | a map of words to weights | yes | Weighted `eye_color` words; a word left out is never drawn. |
|
|
607
|
+
| `data.appearanceProfile.hair_color` | a map of words to weights | yes | Weighted `hair_color` words; a word left out is never drawn. |
|
|
608
|
+
| `data.appearanceProfile.skin_color` | a map of words to weights | yes | Weighted `skin_color` words; a word left out is never drawn. |
|
|
609
|
+
| `data.appearanceProfile.complexion` | a map of words to weights | yes | Weighted `complexion` words; a word left out is never drawn. |
|
|
610
|
+
| `data.appearanceProfile.height` | a map of genders to height ranges | yes | Height ranges keyed by gender; a gender with no range draws from the span of every range stated. |
|
|
611
|
+
| `data.appearanceProfile.height.<name>.min` | a height in metres or feet and inches | yes | The shortest height drawn. |
|
|
612
|
+
| `data.appearanceProfile.height.<name>.max` | a height in metres or feet and inches | yes | The tallest height drawn. |
|
|
596
613
|
|
|
597
614
|
### map
|
|
598
615
|
|