@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.
@@ -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 | Values | Description |
4688
- | ------------------ | --------- | ------------------------------------------ |
4689
- | `templatePriority` | `number` | Template priority, _null_ = not a template |
4690
- | `masteryLevel` | `number` | HM3 mastery level |
4691
- | `parentSkill` | `Address` | Parent skill this skill specializes |
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 | Values | Description |
4855
- | -------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
4856
- | `epoch` | canonical `<year>.<day>` | The canonical day that equals calendar year 1, day 1 |
4857
- | `months` | `{ name, abbreviation?, days }[]` | Ordered months; their days sum to the world's year |
4858
- | `months[].name` | `string`, required | The month's name |
4859
- | `months[].abbreviation` | `string` | Its short form, for a compact date |
4860
- | `months[].days` | `integer`, required | How many days the month holds |
4861
- | `weekdays` | `{ name, abbreviation? }[]` | Ordered week days, indexed from zero; weeks run continuously |
4862
- | `weekdays[].name` | `string`, required | The day's name |
4863
- | `weekdays[].abbreviation` | `string` | Its short form, for a compact date |
4864
- | `seasons` | `{ name, abbreviation?, start }[]` | Seasons starting on one-based days of year |
4865
- | `seasons[].name` | `string`, required | The season's name |
4866
- | `seasons[].abbreviation` | `string` | Its short form, for a compact date |
4867
- | `seasons[].start` | `integer`, required | The one-based day of the year it begins; starts increase down the list |
4868
- | `namedDays` | `{ name, abbreviation?, day }[]` | Names assigned to one-based days of year |
4869
- | `namedDays[].name` | `string`, required | The day's name |
4870
- | `namedDays[].abbreviation` | `string` | Its short form, for a compact date |
4871
- | `namedDays[].day` | `integer`, required | The one-based day of the year it names, distinct within the calendar |
4872
- | `eras` | `{ shortcode, name, abbreviation?, marker?, proclaimedBy?, start, label? }[]` | Year counts; `start` is `null` or an in-calendar year |
4873
- | `eras[].shortcode` | `string`, required | The era's own segment of `<calendar>.<era>`, unique within the calendar |
4874
- | `eras[].name` | `string`, required | The era's name |
4875
- | `eras[].marker` | `string` | Uppercase letters and digits, beginning with a letter, unique across the corpus; an authored date names the era by it |
4876
- | `eras[].abbreviation` | `string` | Its short form, for a compact date |
4877
- | `eras[].proclaimedBy` | `Address` | The body that began the reckoning |
4878
- | `eras[].start` | `null` or `integer`, required | The calendar year the era begins; `null` for the era before year 1 |
4879
- | `eras[].label` | `string` or `{ after?, before? }` | How a date in the era reads, around one `{date}` slot; a string is `after` |
4880
- | `eras[].label.after` | `string` | How a date from the era's start reads, with exactly one `{date}` |
4881
- | `eras[].label.before` | `string` | How a date before the era's start reads, with exactly one `{date}` |
4882
- | `formats` | map of names to Calendaria patterns | Named date formats; `std` is the preferred default |
4883
- | `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 |
4884
- | `form` | `string` | `literature` only: the kind of work in its people's own terms — `epic`, `saga`, `praise-song`, `elegy`. Free text |
4885
- | `subjects` | `Address[]` | `literature` only: the beings, places, gods and other notes the work concerns, and any event, as `note#id` |
4886
- | `language` | `Address` | `literature` only: the tongue it is composed in, naming a skill note with `subType: language` |
4887
- | `events` | event entries — see [Events](#events) | What happened to or at this subject: dated, attributed 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 | 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. |
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 | Shape | Meaning |
520
- | ---------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
521
- | `data.epoch` | a canonical `<year>.<day>` | Canonical day when calendar year 1, day 1 begins — `1.1`. |
522
- | `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. |
523
- | `data.weekdays` | list of `{ name, abbreviation? }` | The days of the week this calendar names, in order. A calendar with no week writes none. |
524
- | `data.seasons` | list of `{ name, abbreviation?, start }` | The seasons this calendar marks, starting on numbered days of the year. |
525
- | `data.namedDays` | list of `{ name, abbreviation?, day }` | Names assigned to particular days of the year. |
526
- | `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. |
527
- | `data.formats` | map of named Calendaria format strings | Named patterns for reading and writing this calendar's dates. |
528
- | `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. |
529
- | `data.form` | string | The kind of work in its people's own terms — an epic, a saga, a praise-song, an elegy. Free text. |
530
- | `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`. |
531
- | `data.language` | an Address | The tongue the work is composed in, as a language skill note. |
532
- | `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. |
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