diff --git a/docs/reference/_Identifier.md b/docs/reference/_Identifier.md
index 5417daf8..4daf32bd 100644
--- a/docs/reference/_Identifier.md
+++ b/docs/reference/_Identifier.md
@@ -2398,6 +2398,72 @@ The gem or precious stone’s identifier.
---
+### `HerbIdentifier`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`herb` | The herb’s identifier. | See details
+
+#### `tag`
+
+- **Constant:** `"Herb"`
+
+#### `herb`
+
+The herb’s identifier.
+
+- **Type:** Integer
+- **Minimum:** `1`
+
+---
+
+### `HerbalAidIdentifier`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`herbal_aid` | The herbal aid’s identifier. | See details
+
+#### `tag`
+
+- **Constant:** `"HerbalAid"`
+
+#### `herbal_aid`
+
+The herbal aid’s identifier.
+
+- **Type:** Integer
+- **Minimum:** `1`
+
+---
+
+### `HerbalPreserveIdentifier`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`herbal_preserve` | The herbal preserve’s identifier. | See details
+
+#### `tag`
+
+- **Constant:** `"HerbalPreserve"`
+
+#### `herbal_preserve`
+
+The herbal preserve’s identifier.
+
+- **Type:** Integer
+- **Minimum:** `1`
+
+---
+
### `IlluminationLightSourceIdentifier`
- **Type:** Object
@@ -2618,22 +2684,22 @@ The rope or chain’s identifier.
---
-### `StationaryIdentifier`
+### `StationeryIdentifier`
- **Type:** Object
Key | Description | Details
:-- | :-- | :--
-`tag` | | See details
-`stationary` | The stationary’s identifier. | See details
+`tag` | | See details
+`stationery` | The stationery’s identifier. | See details
-#### `tag`
+#### `tag`
-- **Constant:** `"Stationary"`
+- **Constant:** `"Stationery"`
-#### `stationary`
+#### `stationery`
-The stationary’s identifier.
+The stationery’s identifier.
- **Type:** Integer
- **Minimum:** `1`
diff --git a/docs/reference/_IdentifierGroup.md b/docs/reference/_IdentifierGroup.md
index ecebf7e1..c0908108 100644
--- a/docs/reference/_IdentifierGroup.md
+++ b/docs/reference/_IdentifierGroup.md
@@ -1258,7 +1258,7 @@
### `EquipmentIdentifier`
- **Type:** Union
-- **Cases:** EquipmentIdentifier'AmmunitionIdentifier | EquipmentIdentifier'AnimalIdentifier | EquipmentIdentifier'AnimalCareIdentifier | EquipmentIdentifier'ArmorIdentifier | EquipmentIdentifier'BandageOrRemedyIdentifier | EquipmentIdentifier'BookIdentifier | EquipmentIdentifier'CeremonialItemIdentifier | EquipmentIdentifier'ClothesIdentifier | EquipmentIdentifier'ContainerIdentifier | EquipmentIdentifier'ElixirIdentifier | EquipmentIdentifier'EquipmentOfBlessedOnesIdentifier | EquipmentIdentifier'GemOrPreciousStoneIdentifier | EquipmentIdentifier'IlluminationLightSourceIdentifier | EquipmentIdentifier'IlluminationRefillsOrSuppliesIdentifier | EquipmentIdentifier'JewelryIdentifier | EquipmentIdentifier'LiebesspielzeugIdentifier | EquipmentIdentifier'LuxuryGoodIdentifier | EquipmentIdentifier'MagicalArtifactIdentifier | EquipmentIdentifier'MusicalInstrumentIdentifier | EquipmentIdentifier'OrienteeringAidIdentifier | EquipmentIdentifier'PoisonIdentifier | EquipmentIdentifier'RopeOrChainIdentifier | EquipmentIdentifier'StationaryIdentifier | EquipmentIdentifier'ThievesToolIdentifier | EquipmentIdentifier'ToolOfTheTradeIdentifier | EquipmentIdentifier'TravelGearOrToolIdentifier | EquipmentIdentifier'VehicleIdentifier | EquipmentIdentifier'WeaponIdentifier | EquipmentIdentifier'WeaponAccessoryIdentifier
+- **Cases:** EquipmentIdentifier'AmmunitionIdentifier | EquipmentIdentifier'AnimalIdentifier | EquipmentIdentifier'AnimalCareIdentifier | EquipmentIdentifier'ArmorIdentifier | EquipmentIdentifier'BandageOrRemedyIdentifier | EquipmentIdentifier'BookIdentifier | EquipmentIdentifier'CeremonialItemIdentifier | EquipmentIdentifier'ClothesIdentifier | EquipmentIdentifier'ContainerIdentifier | EquipmentIdentifier'ElixirIdentifier | EquipmentIdentifier'EquipmentOfBlessedOnesIdentifier | EquipmentIdentifier'GemOrPreciousStoneIdentifier | EquipmentIdentifier'IlluminationLightSourceIdentifier | EquipmentIdentifier'IlluminationRefillsOrSuppliesIdentifier | EquipmentIdentifier'JewelryIdentifier | EquipmentIdentifier'LiebesspielzeugIdentifier | EquipmentIdentifier'LuxuryGoodIdentifier | EquipmentIdentifier'MagicalArtifactIdentifier | EquipmentIdentifier'MusicalInstrumentIdentifier | EquipmentIdentifier'OrienteeringAidIdentifier | EquipmentIdentifier'PoisonIdentifier | EquipmentIdentifier'RopeOrChainIdentifier | EquipmentIdentifier'StationeryIdentifier | EquipmentIdentifier'ThievesToolIdentifier | EquipmentIdentifier'ToolOfTheTradeIdentifier | EquipmentIdentifier'TravelGearOrToolIdentifier | EquipmentIdentifier'VehicleIdentifier | EquipmentIdentifier'WeaponIdentifier | EquipmentIdentifier'WeaponAccessoryIdentifier
---
@@ -1394,9 +1394,9 @@
---
-### `EquipmentIdentifier'StationaryIdentifier`
+### `EquipmentIdentifier'StationeryIdentifier`
-- **Type:** StationaryIdentifier
+- **Type:** StationeryIdentifier
---
@@ -1473,3 +1473,53 @@
### `ManyNumericIdentifiers[]`
- **Type:** OneNumericIdentifier
+
+---
+
+### `RecipeIdentifier`
+
+- **Type:** Union
+- **Cases:** RecipeIdentifier'ElixirIdentifier | RecipeIdentifier'PoisonIdentifier | RecipeIdentifier'HerbalAidIdentifier | RecipeIdentifier'HerbalPreserveIdentifier
+
+---
+
+### `RecipeIdentifier'ElixirIdentifier`
+
+- **Type:** ElixirIdentifier
+
+---
+
+### `RecipeIdentifier'PoisonIdentifier`
+
+- **Type:** PoisonIdentifier
+
+---
+
+### `RecipeIdentifier'HerbalAidIdentifier`
+
+- **Type:** HerbalAidIdentifier
+
+---
+
+### `RecipeIdentifier'HerbalPreserveIdentifier`
+
+- **Type:** HerbalPreserveIdentifier
+
+---
+
+### `HerbalAidOrPreserveIdentifier`
+
+- **Type:** Union
+- **Cases:** HerbalAidOrPreserveIdentifier'HerbalAidIdentifier | HerbalAidOrPreserveIdentifier'HerbalPreserveIdentifier
+
+---
+
+### `HerbalAidOrPreserveIdentifier'HerbalAidIdentifier`
+
+- **Type:** HerbalAidIdentifier
+
+---
+
+### `HerbalAidOrPreserveIdentifier'HerbalPreserveIdentifier`
+
+- **Type:** HerbalPreserveIdentifier
diff --git a/docs/reference/_SimpleReferences.md b/docs/reference/_SimpleReferences.md
index f7fa452d..de775e74 100644
--- a/docs/reference/_SimpleReferences.md
+++ b/docs/reference/_SimpleReferences.md
@@ -615,3 +615,59 @@ Key | Description | Details
#### `id`
- **Type:** TraditionIdentifier
+
+---
+
+### `RecipeReference`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`id` | | See details
+
+#### `id`
+
+- **Type:** RecipeIdentifier
+
+---
+
+### `HerbalAidReference`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`id` | | See details
+
+#### `id`
+
+- **Type:** HerbalAidIdentifier
+
+---
+
+### `HerbalPreserveReference`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`id` | | See details
+
+#### `id`
+
+- **Type:** HerbalPreserveIdentifier
+
+---
+
+### `HerbReference`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`id` | | See details
+
+#### `id`
+
+- **Type:** HerbIdentifier
diff --git a/docs/reference/equipment/item/Herb.md b/docs/reference/equipment/item/Herb.md
new file mode 100644
index 00000000..8f90ae51
--- /dev/null
+++ b/docs/reference/equipment/item/Herb.md
@@ -0,0 +1,636 @@
+# Herb
+
+## Definitions
+
+### Herb (`Herb`)
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`id` | The herb's identifier. An unique, increasing integer. | See details
+`effect_types` | Effect type(s) of the plant's effect(s) and usage(s). | See details
+`prevalence` | The herb's prevalence per landscape type. | See details
+`search_difficulty` | Modifier for plant lore check when searching for the plant. | See details
+`identification_difficulty` | Modifier for plant lore check when identifying the plant. | See details
+`uses` | Doses of plant material found with a search check per quality level. | See details
+`value` | Value per dose, in silverthalers. | See details
+`cost` | Price per dose, in silverthalers. | See details
+`recipes?` | The recipes the herb is used in. | See details
+`storage_life` | The Storage life of the raw herb. | See details
+`preservation_methods` | The preservation options and respective storage life. | See details
+`src` | | See details
+`translations` | All translations for the entry, identified by IETF language tag (BCP47). | See details
+
+#### `id`
+
+The herb's identifier. An unique, increasing integer.
+
+- **Type:** Integer
+- **Minimum:** `1`
+
+#### `effect_types`
+
+Effect type(s) of the plant's effect(s) and usage(s).
+
+- **Type:** List
+- **Items:** Herb/effect_types[]
+- **Minimum Items:** `1`
+- **Unique Items:** Yes
+
+#### `prevalence`
+
+The herb's prevalence per landscape type.
+
+- **Type:** List
+- **Items:** Herb/prevalence[]
+- **Minimum Items:** `1`
+- **Unique Items:** Yes
+
+#### `search_difficulty`
+
+Modifier for plant lore check when searching for the plant.
+
+- **Type:** Integer
+
+#### `identification_difficulty`
+
+Modifier for plant lore check when identifying the plant.
+
+- **Type:** Integer
+
+#### `uses`
+
+Doses of plant material found with a search check per quality level.
+
+- **Type:** List
+- **Items:** Herb/uses[]
+- **Minimum Items:** `6`
+- **Maximum Items:** `6`
+
+#### `value`
+
+Value per dose, in silverthalers.
+
+- **Type:** Number
+- **Minimum:** `0`
+
+#### `cost`
+
+Price per dose, in silverthalers.
+
+- **Type:** Number
+- **Minimum:** `0`
+
+#### `recipes?`
+
+The recipes the herb is used in.
+
+- **Type:** List
+- **Items:** Herb/recipes[]
+- **Unique Items:** Yes
+
+#### `storage_life`
+
+The Storage life of the raw herb.
+
+- **Type:** StorageLifeRaw
+
+#### `preservation_methods`
+
+The preservation options and respective storage life.
+
+- **Type:** List
+- **Items:** Herb/preservation_methods[]
+
+#### `src`
+
+- **Type:** PublicationRefs
+
+#### `translations`
+
+All translations for the entry, identified by IETF language tag (BCP47).
+
+- **Type:** LocaleMap<HerbTranslation>
+
+---
+
+### `Herb/effect_types[]`
+
+- **Type:** EffectType
+
+---
+
+### `Herb/prevalence[]`
+
+- **Type:** LandscapeTypePrevalences
+
+---
+
+### `Herb/uses[]`
+
+- **Type:** Number
+
+---
+
+### `Herb/recipes[]`
+
+- **Type:** RecipeReference
+
+---
+
+### `Herb/preservation_methods[]`
+
+- **Type:** PreservationMethod
+
+---
+
+### `LandscapeTypePrevalences`
+
+Prevalence and/or conditional prevalence(s) per landscape type.
+
+- **Type:** Union
+- **Cases:** LandscapeTypePrevalences'PrevalenceFarNorth | LandscapeTypePrevalences'PrevalenceVeld | LandscapeTypePrevalences'PrevalenceMarsh | LandscapeTypePrevalences'PrevalenceWoods | LandscapeTypePrevalences'PrevalenceRainForest | LandscapeTypePrevalences'PrevalenceMountains | LandscapeTypePrevalences'PrevalenceDesert | LandscapeTypePrevalences'PrevalenceMaraskan
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceFarNorth`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`prevalence_far_north` | | See details
+
+#### `tag`
+
+- **Constant:** `"PrevalenceFarNorth"`
+
+#### `prevalence_far_north`
+
+- **Type:** List
+- **Items:** LandscapeTypePrevalences'PrevalenceFarNorth/prevalence_far_north[]
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceFarNorth/prevalence_far_north[]`
+
+- **Type:** LandscapeTypePrevalence
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceVeld`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`prevalence_veld` | | See details
+
+#### `tag`
+
+- **Constant:** `"PrevalenceVeld"`
+
+#### `prevalence_veld`
+
+- **Type:** List
+- **Items:** LandscapeTypePrevalences'PrevalenceVeld/prevalence_veld[]
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceVeld/prevalence_veld[]`
+
+- **Type:** LandscapeTypePrevalence
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceMarsh`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`prevalence_marsh` | | See details
+
+#### `tag`
+
+- **Constant:** `"PrevalenceMarsh"`
+
+#### `prevalence_marsh`
+
+- **Type:** List
+- **Items:** LandscapeTypePrevalences'PrevalenceMarsh/prevalence_marsh[]
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceMarsh/prevalence_marsh[]`
+
+- **Type:** LandscapeTypePrevalence
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceWoods`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`prevalence_woods` | | See details
+
+#### `tag`
+
+- **Constant:** `"PrevalenceWoods"`
+
+#### `prevalence_woods`
+
+- **Type:** List
+- **Items:** LandscapeTypePrevalences'PrevalenceWoods/prevalence_woods[]
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceWoods/prevalence_woods[]`
+
+- **Type:** LandscapeTypePrevalence
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceRainForest`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`prevalence_rain_forest` | | See details
+
+#### `tag`
+
+- **Constant:** `"PrevalenceRainForest"`
+
+#### `prevalence_rain_forest`
+
+- **Type:** List
+- **Items:** LandscapeTypePrevalences'PrevalenceRainForest/prevalence_rain_forest[]
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceRainForest/prevalence_rain_forest[]`
+
+- **Type:** LandscapeTypePrevalence
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceMountains`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`prevalence_mountains` | | See details
+
+#### `tag`
+
+- **Constant:** `"PrevalenceMountains"`
+
+#### `prevalence_mountains`
+
+- **Type:** List
+- **Items:** LandscapeTypePrevalences'PrevalenceMountains/prevalence_mountains[]
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceMountains/prevalence_mountains[]`
+
+- **Type:** LandscapeTypePrevalence
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceDesert`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`prevalence_desert` | | See details
+
+#### `tag`
+
+- **Constant:** `"PrevalenceDesert"`
+
+#### `prevalence_desert`
+
+- **Type:** List
+- **Items:** LandscapeTypePrevalences'PrevalenceDesert/prevalence_desert[]
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceDesert/prevalence_desert[]`
+
+- **Type:** LandscapeTypePrevalence
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceMaraskan`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`prevalence_maraskan` | | See details
+
+#### `tag`
+
+- **Constant:** `"PrevalenceMaraskan"`
+
+#### `prevalence_maraskan`
+
+- **Type:** List
+- **Items:** LandscapeTypePrevalences'PrevalenceMaraskan/prevalence_maraskan[]
+
+---
+
+### `LandscapeTypePrevalences'PrevalenceMaraskan/prevalence_maraskan[]`
+
+- **Type:** LandscapeTypePrevalence
+
+---
+
+### `LandscapeTypePrevalence`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`prevalence` | Prevalence class. | See details
+`condition?` | Condition or restrictions concerning the prevalence. | See details
+
+#### `prevalence`
+
+Prevalence class.
+
+- **Type:** PrevalenceClass
+
+#### `condition?`
+
+Condition or restrictions concerning the prevalence.
+
+- **Type:** LocaleMap<NonEmptyString>
+
+---
+
+### `PrevalenceClass`
+
+Prevalence class from 5 (common) down to 1 (very rare)
+
+- **Type:** Union
+- **Cases:** PrevalenceClass'0 | PrevalenceClass'1 | PrevalenceClass'2 | PrevalenceClass'3 | PrevalenceClass'4
+
+---
+
+### `PrevalenceClass'0`
+
+- **Constant:** `"Common"`
+
+---
+
+### `PrevalenceClass'1`
+
+- **Constant:** `"Occasional"`
+
+---
+
+### `PrevalenceClass'2`
+
+- **Constant:** `"NowAndThen"`
+
+---
+
+### `PrevalenceClass'3`
+
+- **Constant:** `"Rare"`
+
+---
+
+### `PrevalenceClass'4`
+
+- **Constant:** `"VeryRare"`
+
+---
+
+### `StorageLifeRaw`
+
+The Storage life of a raw herb.
+
+- **Type:** Union
+- **Cases:** StorageLifeRaw'Default | StorageLifeRaw'Special
+
+---
+
+### `StorageLifeRaw'Default`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`default` | | See details
+
+#### `tag`
+
+- **Constant:** `"Default"`
+
+#### `default`
+
+- **Type:** Object
+
+---
+
+### `StorageLifeRaw'Default/default`
+
+- **Type:** Empty Object
+
+---
+
+### `StorageLifeRaw'Special`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`special` | | See details
+
+#### `tag`
+
+- **Constant:** `"Special"`
+
+#### `special`
+
+- **Type:** LocaleMap<NonEmptyString>
+
+---
+
+### `PreservationMethod`
+
+The preservation options of a herb and respective storage life.
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`method` | | See details
+`storage_life` | | See details
+
+#### `method`
+
+- **Type:** PreservationMethodDescription
+
+#### `storage_life`
+
+- **Type:** StorageLife
+
+---
+
+### `PreservationMethodDescription`
+
+Details on the preservation method of a herb.
+
+- **Type:** Union
+- **Cases:** PreservationMethodDescription'HerbalAidIdentifier | PreservationMethodDescription'HerbalPreserveIdentifier | PreservationMethodDescription'Special
+
+---
+
+### `PreservationMethodDescription'HerbalAidIdentifier`
+
+- **Type:** HerbalAidIdentifier
+
+---
+
+### `PreservationMethodDescription'HerbalPreserveIdentifier`
+
+- **Type:** HerbalPreserveIdentifier
+
+---
+
+### `PreservationMethodDescription'Special`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`tag` | | See details
+`special` | | See details
+
+#### `tag`
+
+- **Constant:** `"Special"`
+
+#### `special`
+
+- **Type:** LocaleMap<NonEmptyString>
+
+---
+
+### `HerbTranslation`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`name` | The name of the herb. | See details
+`alternative_names?` | A list of alternative names. | See details
+`description?` | The plant's description. | See details
+`effect_touch?` | The raw plant's effect(s) when touched. | See details
+`effect_inhale?` | The raw plant's effect(s) when inhaled. | See details
+`effect_ingest?` | The raw plant's effect(s) when ingested. | See details
+`simple_recipe?` | Simple recipes the herb is used in. | See details
+`prevalence_remarks?` | Additional remarks on the prevalence per landscape type of the herb. | See details
+`prevalence_regions` | Description of the plant's regional prevalence. | See details
+`legend_tradition` | Description of traditonal use of and legends about the herb. | See details
+`errata?` | | See details
+
+#### `name`
+
+The name of the herb.
+
+- **Type:** NonEmptyString
+
+#### `alternative_names?`
+
+A list of alternative names.
+
+- **Type:** List
+- **Items:** HerbTranslation/alternative_names[]
+- **Minimum Items:** `1`
+
+#### `description?`
+
+The plant's description.
+
+- **Type:** NonEmptyString
+
+#### `effect_touch?`
+
+The raw plant's effect(s) when touched.
+
+- **Type:** NonEmptyString
+
+#### `effect_inhale?`
+
+The raw plant's effect(s) when inhaled.
+
+- **Type:** NonEmptyString
+
+#### `effect_ingest?`
+
+The raw plant's effect(s) when ingested.
+
+- **Type:** NonEmptyString
+
+#### `simple_recipe?`
+
+Simple recipes the herb is used in.
+
+- **Type:** List
+- **Items:** HerbTranslation/simple_recipe[]
+
+#### `prevalence_remarks?`
+
+Additional remarks on the prevalence per landscape type of the herb.
+
+- **Type:** NonEmptyString
+
+#### `prevalence_regions`
+
+Description of the plant's regional prevalence.
+
+- **Type:** NonEmptyString
+
+#### `legend_tradition`
+
+Description of traditonal use of and legends about the herb.
+
+- **Type:** NonEmptyString
+
+#### `errata?`
+
+- **Type:** Errata
+
+---
+
+### `HerbTranslation/alternative_names[]`
+
+- **Type:** AlternativeName
+
+---
+
+### `HerbTranslation/simple_recipe[]`
+
+- **Type:** NonEmptyString
diff --git a/docs/reference/equipment/item/HerbalAid.md b/docs/reference/equipment/item/HerbalAid.md
new file mode 100644
index 00000000..2b26aa0e
--- /dev/null
+++ b/docs/reference/equipment/item/HerbalAid.md
@@ -0,0 +1,108 @@
+# HerbalAid
+
+## Definitions
+
+### HerbalAid (`HerbalAid`)
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`id` | The aid's identifier. An unique, increasing integer. | See details
+`main_ingredient` | The main ingredient, a herb. | See details
+`alternative_main_ingredient?` | An alternative main ingredient, a herb. | See details
+`production_difficulty` | Modifier for plant lore check when making the aid. | See details
+`translation` | All translations for the entry, identified by IETF language tag (BCP47). | See details
+`src` | | See details
+
+#### `id`
+
+The aid's identifier. An unique, increasing integer.
+
+- **Type:** Integer
+- **Minimum:** `1`
+
+#### `main_ingredient`
+
+The main ingredient, a herb.
+
+- **Type:** HerbReference
+
+#### `alternative_main_ingredient?`
+
+An alternative main ingredient, a herb.
+
+- **Type:** HerbReference
+
+#### `production_difficulty`
+
+Modifier for plant lore check when making the aid.
+
+- **Type:** Integer
+
+#### `translation`
+
+All translations for the entry, identified by IETF language tag (BCP47).
+
+- **Type:** LocaleMap<HerbalAidTranslation>
+
+#### `src`
+
+- **Type:** PublicationRefs
+
+---
+
+### `HerbalAidTranslation`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`name` | Name of the preservation method. | See details
+`description` | Description of the production method and/or effect. | See details
+`additional_ingredients?` | Ingredients beside the main ingredient. | See details
+`typical_tools` | Tools and aids used in the production process. | See details
+`errata?` | | See details
+
+#### `name`
+
+Name of the preservation method.
+
+- **Type:** NonEmptyString
+
+#### `description`
+
+Description of the production method and/or effect.
+
+- **Type:** NonEmptyString
+
+#### `additional_ingredients?`
+
+Ingredients beside the main ingredient.
+
+- **Type:** List
+- **Items:** HerbalAidTranslation/additional_ingredients[]
+- **Minimum Items:** `1`
+
+#### `typical_tools`
+
+Tools and aids used in the production process.
+
+- **Type:** List
+- **Items:** HerbalAidTranslation/typical_tools[]
+
+#### `errata?`
+
+- **Type:** Errata
+
+---
+
+### `HerbalAidTranslation/additional_ingredients[]`
+
+- **Type:** NonEmptyString
+
+---
+
+### `HerbalAidTranslation/typical_tools[]`
+
+- **Type:** NonEmptyString
diff --git a/docs/reference/equipment/item/HerbalPreserve.md b/docs/reference/equipment/item/HerbalPreserve.md
new file mode 100644
index 00000000..ac0232f5
--- /dev/null
+++ b/docs/reference/equipment/item/HerbalPreserve.md
@@ -0,0 +1,79 @@
+# HerbalPreserve
+
+## Definitions
+
+### HerbalPreserve (`HerbalPreserve`)
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`id` | The preserve's identifier. An unique, increasing integer. | See details
+`main_ingredient` | The main ingredient, a herb. | See details
+`storage_life` | The storage life of the product. | See details
+`translation` | All translations for the entry, identified by IETF language tag (BCP47). | See details
+`src` | | See details
+
+#### `id`
+
+The preserve's identifier. An unique, increasing integer.
+
+- **Type:** Integer
+- **Minimum:** `1`
+
+#### `main_ingredient`
+
+The main ingredient, a herb.
+
+- **Type:** HerbReference
+
+#### `storage_life`
+
+The storage life of the product.
+
+- **Type:** StorageLife
+
+#### `translation`
+
+All translations for the entry, identified by IETF language tag (BCP47).
+
+- **Type:** LocaleMap<HerbalPreserveTranslation>
+
+#### `src`
+
+- **Type:** PublicationRefs
+
+---
+
+### `HerbalPreserveTranslation`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`name` | Name of the preservation method. | See details
+`preparation` | Description of the preservation method. | See details
+`alternative_effect` | Alternative effect of the product. | See details
+`errata?` | | See details
+
+#### `name`
+
+Name of the preservation method.
+
+- **Type:** NonEmptyString
+
+#### `preparation`
+
+Description of the preservation method.
+
+- **Type:** NonEmptyString
+
+#### `alternative_effect`
+
+Alternative effect of the product.
+
+- **Type:** NonEmptyString
+
+#### `errata?`
+
+- **Type:** Errata
diff --git a/docs/reference/equipment/item/Poison.md b/docs/reference/equipment/item/Poison.md
index a8ca9f46..2899214f 100644
--- a/docs/reference/equipment/item/Poison.md
+++ b/docs/reference/equipment/item/Poison.md
@@ -296,7 +296,7 @@ Key | Description | Details
#### `unit`
-- **Type:** PoisonTimeUnit
+- **Type:** TimeUnit
---
@@ -315,38 +315,7 @@ Key | Description | Details
#### `unit`
-- **Type:** PoisonTimeUnit
-
----
-
-### `PoisonTimeUnit`
-
-- **Type:** Union
-- **Cases:** PoisonTimeUnit'0 | PoisonTimeUnit'1 | PoisonTimeUnit'2 | PoisonTimeUnit'3
-
----
-
-### `PoisonTimeUnit'0`
-
-- **Constant:** `"CombatRounds"`
-
----
-
-### `PoisonTimeUnit'1`
-
-- **Constant:** `"Minutes"`
-
----
-
-### `PoisonTimeUnit'2`
-
-- **Constant:** `"Hours"`
-
----
-
-### `PoisonTimeUnit'3`
-
-- **Constant:** `"Days"`
+- **Type:** TimeUnit
---
diff --git a/docs/reference/equipment/item/Stationary.md b/docs/reference/equipment/item/Stationery.md
similarity index 69%
rename from docs/reference/equipment/item/Stationary.md
rename to docs/reference/equipment/item/Stationery.md
index fb22f4ff..89bfb9ab 100644
--- a/docs/reference/equipment/item/Stationary.md
+++ b/docs/reference/equipment/item/Stationery.md
@@ -2,6 +2,6 @@
## Definitions
-### `Stationary`
+### `Stationery`
- **Type:** DefaultItem
diff --git a/docs/reference/equipment/item/_Herbary.md b/docs/reference/equipment/item/_Herbary.md
index 2de0dc28..3b8b910c 100644
--- a/docs/reference/equipment/item/_Herbary.md
+++ b/docs/reference/equipment/item/_Herbary.md
@@ -100,3 +100,73 @@ The AP value of the trade secret.
The prerequisites of the trade secret, if any.
- **Type:** PlainGeneralPrerequisites
+
+---
+
+### `StorageLife`
+
+- **Type:** Object
+
+Key | Description | Details
+:-- | :-- | :--
+`value` | The storage life of a (processed) herb. | See details
+`unit` | | See details
+
+#### `value`
+
+The storage life of a (processed) herb.
+
+- **Type:** Integer
+
+#### `unit`
+
+- **Type:** TimeUnit
+
+---
+
+### `TimeUnit`
+
+- **Type:** Union
+- **Cases:** TimeUnit'0 | TimeUnit'1 | TimeUnit'2 | TimeUnit'3 | TimeUnit'4 | TimeUnit'5 | TimeUnit'6
+
+---
+
+### `TimeUnit'0`
+
+- **Constant:** `"CombatRounds"`
+
+---
+
+### `TimeUnit'1`
+
+- **Constant:** `"Minutes"`
+
+---
+
+### `TimeUnit'2`
+
+- **Constant:** `"Hours"`
+
+---
+
+### `TimeUnit'3`
+
+- **Constant:** `"Days"`
+
+---
+
+### `TimeUnit'4`
+
+- **Constant:** `"Weeks"`
+
+---
+
+### `TimeUnit'5`
+
+- **Constant:** `"Months"`
+
+---
+
+### `TimeUnit'6`
+
+- **Constant:** `"Years"`
diff --git a/schema/_Identifier.schema.json b/schema/_Identifier.schema.json
index 3c9f8cc1..593a85cb 100644
--- a/schema/_Identifier.schema.json
+++ b/schema/_Identifier.schema.json
@@ -1960,6 +1960,60 @@
],
"additionalProperties": false
},
+ "HerbIdentifier": {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "Herb"
+ },
+ "herb": {
+ "description": "The herb’s identifier.",
+ "type": "integer",
+ "minimum": 1
+ }
+ },
+ "required": [
+ "tag",
+ "herb"
+ ],
+ "additionalProperties": false
+ },
+ "HerbalAidIdentifier": {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "HerbalAid"
+ },
+ "herbal_aid": {
+ "description": "The herbal aid’s identifier.",
+ "type": "integer",
+ "minimum": 1
+ }
+ },
+ "required": [
+ "tag",
+ "herbal_aid"
+ ],
+ "additionalProperties": false
+ },
+ "HerbalPreserveIdentifier": {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "HerbalPreserve"
+ },
+ "herbal_preserve": {
+ "description": "The herbal preserve’s identifier.",
+ "type": "integer",
+ "minimum": 1
+ }
+ },
+ "required": [
+ "tag",
+ "herbal_preserve"
+ ],
+ "additionalProperties": false
+ },
"IlluminationLightSourceIdentifier": {
"type": "object",
"properties": {
@@ -2140,21 +2194,21 @@
],
"additionalProperties": false
},
- "StationaryIdentifier": {
+ "StationeryIdentifier": {
"type": "object",
"properties": {
"tag": {
- "const": "Stationary"
+ "const": "Stationery"
},
- "stationary": {
- "description": "The stationary’s identifier.",
+ "stationery": {
+ "description": "The stationery’s identifier.",
"type": "integer",
"minimum": 1
}
},
"required": [
"tag",
- "stationary"
+ "stationery"
],
"additionalProperties": false
},
diff --git a/schema/_IdentifierGroup.schema.json b/schema/_IdentifierGroup.schema.json
index 4029e2a0..13a3f221 100644
--- a/schema/_IdentifierGroup.schema.json
+++ b/schema/_IdentifierGroup.schema.json
@@ -706,7 +706,7 @@
"$ref": "./_Identifier.schema.json#/$defs/RopeOrChainIdentifier"
},
{
- "$ref": "./_Identifier.schema.json#/$defs/StationaryIdentifier"
+ "$ref": "./_Identifier.schema.json#/$defs/StationeryIdentifier"
},
{
"$ref": "./_Identifier.schema.json#/$defs/ThievesToolIdentifier"
@@ -748,6 +748,32 @@
"$ref": "#/$defs/OneNumericIdentifier"
},
"minItems": 2
+ },
+ "RecipeIdentifier": {
+ "oneOf": [
+ {
+ "$ref": "./_Identifier.schema.json#/$defs/ElixirIdentifier"
+ },
+ {
+ "$ref": "./_Identifier.schema.json#/$defs/PoisonIdentifier"
+ },
+ {
+ "$ref": "./_Identifier.schema.json#/$defs/HerbalAidIdentifier"
+ },
+ {
+ "$ref": "./_Identifier.schema.json#/$defs/HerbalPreserveIdentifier"
+ }
+ ]
+ },
+ "HerbalAidOrPreserveIdentifier": {
+ "oneOf": [
+ {
+ "$ref": "./_Identifier.schema.json#/$defs/HerbalAidIdentifier"
+ },
+ {
+ "$ref": "./_Identifier.schema.json#/$defs/HerbalPreserveIdentifier"
+ }
+ ]
}
}
}
diff --git a/schema/_SimpleReferences.schema.json b/schema/_SimpleReferences.schema.json
index b7ca6d53..200d95cd 100644
--- a/schema/_SimpleReferences.schema.json
+++ b/schema/_SimpleReferences.schema.json
@@ -517,6 +517,54 @@
"id"
],
"additionalProperties": false
+ },
+ "RecipeReference": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "$ref": "./_IdentifierGroup.schema.json#/$defs/RecipeIdentifier"
+ }
+ },
+ "required": [
+ "id"
+ ],
+ "additionalProperties": false
+ },
+ "HerbalAidReference": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "$ref": "./_Identifier.schema.json#/$defs/HerbalAidIdentifier"
+ }
+ },
+ "required": [
+ "id"
+ ],
+ "additionalProperties": false
+ },
+ "HerbalPreserveReference": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "$ref": "./_Identifier.schema.json#/$defs/HerbalPreserveIdentifier"
+ }
+ },
+ "required": [
+ "id"
+ ],
+ "additionalProperties": false
+ },
+ "HerbReference": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "$ref": "./_Identifier.schema.json#/$defs/HerbIdentifier"
+ }
+ },
+ "required": [
+ "id"
+ ],
+ "additionalProperties": false
}
}
}
diff --git a/schema/equipment/item/Herb.schema.json b/schema/equipment/item/Herb.schema.json
new file mode 100644
index 00000000..5747deca
--- /dev/null
+++ b/schema/equipment/item/Herb.schema.json
@@ -0,0 +1,473 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "$id": "/equipment/item/Herb.schema.json",
+ "$ref": "#/$defs/Herb",
+ "$defs": {
+ "Herb": {
+ "title": "Herb",
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "The herb's identifier. An unique, increasing integer.",
+ "type": "integer",
+ "minimum": 1
+ },
+ "effect_types": {
+ "description": "Effect type(s) of the plant's effect(s) and usage(s).",
+ "type": "array",
+ "items": {
+ "$ref": "./_Herbary.schema.json#/$defs/EffectType"
+ },
+ "minItems": 1,
+ "uniqueItems": true
+ },
+ "prevalence": {
+ "description": "The herb's prevalence per landscape type.",
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalences"
+ },
+ "minItems": 1,
+ "uniqueItems": true
+ },
+ "search_difficulty": {
+ "description": "Modifier for plant lore check when searching for the plant.",
+ "type": "integer"
+ },
+ "identification_difficulty": {
+ "description": "Modifier for plant lore check when identifying the plant.",
+ "type": "integer"
+ },
+ "uses": {
+ "description": "Doses of plant material found with a search check per quality level.",
+ "type": "array",
+ "items": {
+ "type": "number"
+ },
+ "minItems": 6,
+ "maxItems": 6
+ },
+ "value": {
+ "description": "Value per dose, in silverthalers.",
+ "type": "number",
+ "minimum": 0
+ },
+ "cost": {
+ "description": "Price per dose, in silverthalers.",
+ "type": "number",
+ "minimum": 0
+ },
+ "recipes": {
+ "description": "The recipes the herb is used in.",
+ "type": "array",
+ "items": {
+ "$ref": "../../_SimpleReferences.schema.json#/$defs/RecipeReference"
+ },
+ "uniqueItems": true
+ },
+ "storage_life": {
+ "description": "The Storage life of the raw herb.",
+ "$ref": "#/$defs/StorageLifeRaw"
+ },
+ "preservation_methods": {
+ "description": "The preservation options and respective storage life.",
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/PreservationMethod"
+ }
+ },
+ "src": {
+ "$ref": "../../source/_PublicationRef.schema.json#/$defs/PublicationRefs"
+ },
+ "translations": {
+ "description": "All translations for the entry, identified by IETF language tag (BCP47).",
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]{2}-[A-Z]{2}$": {
+ "$ref": "#/$defs/HerbTranslation"
+ }
+ },
+ "minProperties": 1,
+ "additionalProperties": false
+ }
+ },
+ "required": [
+ "id",
+ "effect_types",
+ "prevalence",
+ "search_difficulty",
+ "identification_difficulty",
+ "uses",
+ "value",
+ "cost",
+ "storage_life",
+ "preservation_methods",
+ "src",
+ "translations"
+ ],
+ "additionalProperties": false
+ },
+ "LandscapeTypePrevalences": {
+ "description": "Prevalence and/or conditional prevalence(s) per landscape type.",
+ "oneOf": [
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "PrevalenceFarNorth"
+ },
+ "prevalence_far_north": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalence"
+ }
+ }
+ },
+ "required": [
+ "tag",
+ "prevalence_far_north"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "PrevalenceVeld"
+ },
+ "prevalence_veld": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalence"
+ }
+ }
+ },
+ "required": [
+ "tag",
+ "prevalence_veld"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "PrevalenceMarsh"
+ },
+ "prevalence_marsh": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalence"
+ }
+ }
+ },
+ "required": [
+ "tag",
+ "prevalence_marsh"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "PrevalenceWoods"
+ },
+ "prevalence_woods": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalence"
+ }
+ }
+ },
+ "required": [
+ "tag",
+ "prevalence_woods"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "PrevalenceRainForest"
+ },
+ "prevalence_rain_forest": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalence"
+ }
+ }
+ },
+ "required": [
+ "tag",
+ "prevalence_rain_forest"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "PrevalenceMountains"
+ },
+ "prevalence_mountains": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalence"
+ }
+ }
+ },
+ "required": [
+ "tag",
+ "prevalence_mountains"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "PrevalenceDesert"
+ },
+ "prevalence_desert": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalence"
+ }
+ }
+ },
+ "required": [
+ "tag",
+ "prevalence_desert"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "PrevalenceMaraskan"
+ },
+ "prevalence_maraskan": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/LandscapeTypePrevalence"
+ }
+ }
+ },
+ "required": [
+ "tag",
+ "prevalence_maraskan"
+ ],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "LandscapeTypePrevalence": {
+ "type": "object",
+ "properties": {
+ "prevalence": {
+ "description": "Prevalence class.",
+ "$ref": "#/$defs/PrevalenceClass"
+ },
+ "condition": {
+ "description": "All translations for the entry, identified by IETF language tag (BCP47).",
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]{2}-[A-Z]{2}$": {
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ }
+ },
+ "minProperties": 1,
+ "additionalProperties": false
+ }
+ },
+ "required": [
+ "prevalence"
+ ],
+ "additionalProperties": false
+ },
+ "PrevalenceClass": {
+ "description": "Prevalence class from 5 (common) down to 1 (very rare)",
+ "oneOf": [
+ {
+ "const": "Common"
+ },
+ {
+ "const": "Occasional"
+ },
+ {
+ "const": "NowAndThen"
+ },
+ {
+ "const": "Rare"
+ },
+ {
+ "const": "VeryRare"
+ }
+ ]
+ },
+ "StorageLifeRaw": {
+ "description": "The Storage life of a raw herb.",
+ "oneOf": [
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "Default"
+ },
+ "default": {
+ "type": "object",
+ "properties": {},
+ "required": [],
+ "additionalProperties": false
+ }
+ },
+ "required": [
+ "tag",
+ "default"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "Special"
+ },
+ "special": {
+ "description": "All translations for the entry, identified by IETF language tag (BCP47).",
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]{2}-[A-Z]{2}$": {
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ }
+ },
+ "minProperties": 1,
+ "additionalProperties": false
+ }
+ },
+ "required": [
+ "tag",
+ "special"
+ ],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "PreservationMethod": {
+ "description": "The preservation options of a herb and respective storage life.",
+ "type": "object",
+ "properties": {
+ "method": {
+ "$ref": "#/$defs/PreservationMethodDescription"
+ },
+ "storage_life": {
+ "$ref": "./_Herbary.schema.json#/$defs/StorageLife"
+ }
+ },
+ "required": [
+ "method",
+ "storage_life"
+ ],
+ "additionalProperties": false
+ },
+ "PreservationMethodDescription": {
+ "description": "Details on the preservation method of a herb.",
+ "oneOf": [
+ {
+ "$ref": "../../_Identifier.schema.json#/$defs/HerbalAidIdentifier"
+ },
+ {
+ "$ref": "../../_Identifier.schema.json#/$defs/HerbalPreserveIdentifier"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "tag": {
+ "const": "Special"
+ },
+ "special": {
+ "description": "All translations for the entry, identified by IETF language tag (BCP47).",
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]{2}-[A-Z]{2}$": {
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ }
+ },
+ "minProperties": 1,
+ "additionalProperties": false
+ }
+ },
+ "required": [
+ "tag",
+ "special"
+ ],
+ "additionalProperties": false
+ }
+ ]
+ },
+ "HerbTranslation": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "description": "The name of the herb.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "alternative_names": {
+ "description": "A list of alternative names.",
+ "type": "array",
+ "items": {
+ "$ref": "../../_AlternativeNames.schema.json#/$defs/AlternativeName"
+ },
+ "minItems": 1
+ },
+ "description": {
+ "description": "The plant's description.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "effect_touch": {
+ "description": "The raw plant's effect(s) when touched.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "effect_inhale": {
+ "description": "The raw plant's effect(s) when inhaled.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "effect_ingest": {
+ "description": "The raw plant's effect(s) when ingested.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "simple_recipe": {
+ "description": "Simple recipes the herb is used in.",
+ "type": "array",
+ "items": {
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ }
+ },
+ "prevalence_remarks": {
+ "description": "Additional remarks on the prevalence per landscape type of the herb.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "prevalence_regions": {
+ "description": "Description of the plant's regional prevalence.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "legend_tradition": {
+ "description": "Description of traditonal use of and legends about the herb.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "errata": {
+ "$ref": "../../source/_Erratum.schema.json#/$defs/Errata"
+ }
+ },
+ "required": [
+ "name",
+ "prevalence_regions",
+ "legend_tradition"
+ ],
+ "additionalProperties": false
+ }
+ }
+}
diff --git a/schema/equipment/item/HerbalAid.schema.json b/schema/equipment/item/HerbalAid.schema.json
new file mode 100644
index 00000000..7510a2d4
--- /dev/null
+++ b/schema/equipment/item/HerbalAid.schema.json
@@ -0,0 +1,89 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "$id": "/equipment/item/HerbalAid.schema.json",
+ "$ref": "#/$defs/HerbalAid",
+ "$defs": {
+ "HerbalAid": {
+ "title": "HerbalAid",
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "The aid's identifier. An unique, increasing integer.",
+ "type": "integer",
+ "minimum": 1
+ },
+ "main_ingredient": {
+ "description": "The main ingredient, a herb.",
+ "$ref": "../../_SimpleReferences.schema.json#/$defs/HerbReference"
+ },
+ "alternative_main_ingredient": {
+ "description": "An alternative main ingredient, a herb.",
+ "$ref": "../../_SimpleReferences.schema.json#/$defs/HerbReference"
+ },
+ "production_difficulty": {
+ "description": "Modifier for plant lore check when making the aid.",
+ "type": "integer"
+ },
+ "translation": {
+ "description": "All translations for the entry, identified by IETF language tag (BCP47).",
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]{2}-[A-Z]{2}$": {
+ "$ref": "#/$defs/HerbalAidTranslation"
+ }
+ },
+ "minProperties": 1,
+ "additionalProperties": false
+ },
+ "src": {
+ "$ref": "../../source/_PublicationRef.schema.json#/$defs/PublicationRefs"
+ }
+ },
+ "required": [
+ "id",
+ "main_ingredient",
+ "production_difficulty",
+ "translation",
+ "src"
+ ],
+ "additionalProperties": false
+ },
+ "HerbalAidTranslation": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "description": "Name of the preservation method.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "description": {
+ "description": "Description of the production method and/or effect.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "additional_ingredients": {
+ "description": "Ingredients beside the main ingredient.",
+ "type": "array",
+ "items": {
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "minItems": 1
+ },
+ "typical_tools": {
+ "description": "Tools and aids used in the production process.",
+ "type": "array",
+ "items": {
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ }
+ },
+ "errata": {
+ "$ref": "../../source/_Erratum.schema.json#/$defs/Errata"
+ }
+ },
+ "required": [
+ "name",
+ "description",
+ "typical_tools"
+ ],
+ "additionalProperties": false
+ }
+ }
+}
diff --git a/schema/equipment/item/HerbalPreserve.schema.json b/schema/equipment/item/HerbalPreserve.schema.json
new file mode 100644
index 00000000..50feddac
--- /dev/null
+++ b/schema/equipment/item/HerbalPreserve.schema.json
@@ -0,0 +1,74 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "$id": "/equipment/item/HerbalPreserve.schema.json",
+ "$ref": "#/$defs/HerbalPreserve",
+ "$defs": {
+ "HerbalPreserve": {
+ "title": "HerbalPreserve",
+ "type": "object",
+ "properties": {
+ "id": {
+ "description": "The preserve's identifier. An unique, increasing integer.",
+ "type": "integer",
+ "minimum": 1
+ },
+ "main_ingredient": {
+ "description": "The main ingredient, a herb.",
+ "$ref": "../../_SimpleReferences.schema.json#/$defs/HerbReference"
+ },
+ "storage_life": {
+ "description": "The storage life of the product.",
+ "$ref": "./_Herbary.schema.json#/$defs/StorageLife"
+ },
+ "translation": {
+ "description": "All translations for the entry, identified by IETF language tag (BCP47).",
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]{2}-[A-Z]{2}$": {
+ "$ref": "#/$defs/HerbalPreserveTranslation"
+ }
+ },
+ "minProperties": 1,
+ "additionalProperties": false
+ },
+ "src": {
+ "$ref": "../../source/_PublicationRef.schema.json#/$defs/PublicationRefs"
+ }
+ },
+ "required": [
+ "id",
+ "main_ingredient",
+ "storage_life",
+ "translation",
+ "src"
+ ],
+ "additionalProperties": false
+ },
+ "HerbalPreserveTranslation": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "description": "Name of the preservation method.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "preparation": {
+ "description": "Description of the preservation method.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "alternative_effect": {
+ "description": "Alternative effect of the product.",
+ "$ref": "../../_NonEmptyString.schema.json#/$defs/NonEmptyString"
+ },
+ "errata": {
+ "$ref": "../../source/_Erratum.schema.json#/$defs/Errata"
+ }
+ },
+ "required": [
+ "name",
+ "preparation",
+ "alternative_effect"
+ ],
+ "additionalProperties": false
+ }
+ }
+}
diff --git a/schema/equipment/item/Poison.schema.json b/schema/equipment/item/Poison.schema.json
index 03a24546..77c68229 100644
--- a/schema/equipment/item/Poison.schema.json
+++ b/schema/equipment/item/Poison.schema.json
@@ -237,7 +237,7 @@
"type": "number"
},
"unit": {
- "$ref": "#/$defs/PoisonTimeUnit"
+ "$ref": "./_Herbary.schema.json#/$defs/TimeUnit"
}
},
"required": [
@@ -253,7 +253,7 @@
"$ref": "../../_Dice.schema.json#/$defs/Dice"
},
"unit": {
- "$ref": "#/$defs/PoisonTimeUnit"
+ "$ref": "./_Herbary.schema.json#/$defs/TimeUnit"
}
},
"required": [
@@ -262,22 +262,6 @@
],
"additionalProperties": false
},
- "PoisonTimeUnit": {
- "oneOf": [
- {
- "const": "CombatRounds"
- },
- {
- "const": "Minutes"
- },
- {
- "const": "Hours"
- },
- {
- "const": "Days"
- }
- ]
- },
"IndefinitePoisonTime": {
"type": "object",
"properties": {
diff --git a/schema/equipment/item/Stationary.schema.json b/schema/equipment/item/Stationery.schema.json
similarity index 58%
rename from schema/equipment/item/Stationary.schema.json
rename to schema/equipment/item/Stationery.schema.json
index bdbcb641..0803d167 100644
--- a/schema/equipment/item/Stationary.schema.json
+++ b/schema/equipment/item/Stationery.schema.json
@@ -1,9 +1,9 @@
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
- "$id": "/equipment/item/Stationary.schema.json",
- "$ref": "#/$defs/Stationary",
+ "$id": "/equipment/item/Stationery.schema.json",
+ "$ref": "#/$defs/Stationery",
"$defs": {
- "Stationary": {
+ "Stationery": {
"$ref": "./_Item.schema.json#/$defs/DefaultItem"
}
}
diff --git a/schema/equipment/item/_Herbary.schema.json b/schema/equipment/item/_Herbary.schema.json
index 2368dc9e..2c90c067 100644
--- a/schema/equipment/item/_Herbary.schema.json
+++ b/schema/equipment/item/_Herbary.schema.json
@@ -57,6 +57,48 @@
"ap_value"
],
"additionalProperties": false
+ },
+ "StorageLife": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "description": "The storage life of a (processed) herb.",
+ "type": "integer"
+ },
+ "unit": {
+ "$ref": "#/$defs/TimeUnit"
+ }
+ },
+ "required": [
+ "value",
+ "unit"
+ ],
+ "additionalProperties": false
+ },
+ "TimeUnit": {
+ "oneOf": [
+ {
+ "const": "CombatRounds"
+ },
+ {
+ "const": "Minutes"
+ },
+ {
+ "const": "Hours"
+ },
+ {
+ "const": "Days"
+ },
+ {
+ "const": "Weeks"
+ },
+ {
+ "const": "Months"
+ },
+ {
+ "const": "Years"
+ }
+ ]
}
}
}
diff --git a/src/config/types.ts b/src/config/types.ts
index cb9e929f..f6fb950d 100644
--- a/src/config/types.ts
+++ b/src/config/types.ts
@@ -70,7 +70,7 @@ import * as MusicalInstrument from "../types/equipment/item/MusicalInstrument.js
import * as OrienteeringAid from "../types/equipment/item/OrienteeringAid.js"
import * as Poison from "../types/equipment/item/Poison.js"
import * as RopeOrChain from "../types/equipment/item/RopeOrChain.js"
-import * as Stationary from "../types/equipment/item/Stationary.js"
+import * as Stationery from "../types/equipment/item/Stationery.js"
import * as ThievesTool from "../types/equipment/item/ThievesTool.js"
import * as ToolOfTheTrade from "../types/equipment/item/ToolOfTheTrade.js"
import * as TravelGearOrTool from "../types/equipment/item/TravelGearOrTool.js"
@@ -286,7 +286,7 @@ export type TypeMap = {
spellSwordEnchantments: SpellSwordEnchantment.SpellSwordEnchantment
staffEnchantments: StaffEnchantment.StaffEnchantment
states: State.State
- stationary: Stationary.Stationary
+ stationery: Stationery.Stationery
talismans: Talisman.Talisman
targetCategories: TargetCategory.TargetCategory
thievesTools: ThievesTool.ThievesTool
@@ -441,7 +441,7 @@ export const configMap = {
spellSwordEnchantments: SpellSwordEnchantment.config,
staffEnchantments: StaffEnchantment.config,
states: State.config,
- stationary: Stationary.config,
+ stationery: Stationery.config,
talismans: Talisman.config,
targetCategories: TargetCategory.config,
thievesTools: ThievesTool.config,
diff --git a/src/types/_Identifier.ts b/src/types/_Identifier.ts
index c9d791aa..d05e023d 100644
--- a/src/types/_Identifier.ts
+++ b/src/types/_Identifier.ts
@@ -1214,6 +1214,40 @@ export type GemOrPreciousStoneIdentifier = {
gem_or_precious_stone: number
}
+
+export type HerbIdentifier = {
+ tag: "Herb"
+
+ /**
+ * The herb’s identifier.
+ * @integer
+ * @minimum 1
+ */
+ herb: number
+}
+
+export type HerbalAidIdentifier = {
+ tag: "HerbalAid"
+
+ /**
+ * The herbal aid’s identifier.
+ * @integer
+ * @minimum 1
+ */
+ herbal_aid: number
+}
+
+export type HerbalPreserveIdentifier = {
+ tag: "HerbalPreserve"
+
+ /**
+ * The herbal preserve’s identifier.
+ * @integer
+ * @minimum 1
+ */
+ herbal_preserve: number
+}
+
export type IlluminationLightSourceIdentifier = {
tag: "IlluminationLightSource"
@@ -1324,15 +1358,15 @@ export type RopeOrChainIdentifier = {
rope_or_chain: number
}
-export type StationaryIdentifier = {
- tag: "Stationary"
+export type StationeryIdentifier = {
+ tag: "Stationery"
/**
- * The stationary’s identifier.
+ * The stationery’s identifier.
* @integer
* @minimum 1
*/
- stationary: number
+ stationery: number
}
export type ThievesToolIdentifier = {
diff --git a/src/types/_IdentifierGroup.ts b/src/types/_IdentifierGroup.ts
index 8b88c0de..d645de29 100644
--- a/src/types/_IdentifierGroup.ts
+++ b/src/types/_IdentifierGroup.ts
@@ -242,7 +242,7 @@ export type EquipmentIdentifier =
| Identifier.OrienteeringAidIdentifier
| Identifier.PoisonIdentifier
| Identifier.RopeOrChainIdentifier
- | Identifier.StationaryIdentifier
+ | Identifier.StationeryIdentifier
| Identifier.ThievesToolIdentifier
| Identifier.ToolOfTheTradeIdentifier
| Identifier.TravelGearOrToolIdentifier
@@ -261,3 +261,14 @@ type OneNumericIdentifier = number
* @minItems 2
*/
type ManyNumericIdentifiers = OneNumericIdentifier[]
+
+export type RecipeIdentifier =
+ | Identifier.ElixirIdentifier
+ | Identifier.PoisonIdentifier
+ | Identifier.HerbalAidIdentifier
+ | Identifier.HerbalPreserveIdentifier
+
+export type HerbalAidOrPreserveIdentifier =
+ | Identifier.HerbalAidIdentifier
+ | Identifier.HerbalPreserveIdentifier
+
\ No newline at end of file
diff --git a/src/types/_SimpleReferences.ts b/src/types/_SimpleReferences.ts
index 3bad257d..9b6839b7 100644
--- a/src/types/_SimpleReferences.ts
+++ b/src/types/_SimpleReferences.ts
@@ -1,5 +1,5 @@
-import { AdvantageIdentifier, AnimalTypeIdentifier, AnimistTribeIdentifier, ArmorIdentifier, AspectIdentifier, AttributeIdentifier, BlessedTraditionIdentifier, BlessingIdentifier, CantripIdentifier, CeremonyIdentifier, CloseCombatTechniqueIdentifier, CultureIdentifier, CurriculumIdentifier, DisadvantageIdentifier, ElementIdentifier, EyeColorIdentifier, GuidelineIdentifier, HairColorIdentifier, LanguageIdentifier, LiturgicalChantIdentifier, MagicalTraditionIdentifier, PactCategoryIdentifier, PactDomainIdentifier, PatronCategoryIdentifier, PatronIdentifier, PersonalityTraitIdentifier, ProfessionIdentifier, ProfessionVariantIdentifier, PropertyIdentifier, RaceIdentifier, RangedCombatTechniqueIdentifier, RitualIdentifier, ScriptIdentifier, SkillGroupIdentifier, SkillIdentifier, SocialStatusIdentifier, SpellIdentifier, SubjectIdentifier, TargetCategoryIdentifier, WeaponIdentifier } from "./_Identifier.js"
-import { CombatTechniqueIdentifier, SpellworkIdentifier, TraditionIdentifier } from "./_IdentifierGroup.js"
+import { AdvantageIdentifier, AnimalTypeIdentifier, AnimistTribeIdentifier, ArmorIdentifier, AspectIdentifier, AttributeIdentifier, BlessedTraditionIdentifier, BlessingIdentifier, CantripIdentifier, CeremonyIdentifier, CloseCombatTechniqueIdentifier, CultureIdentifier, CurriculumIdentifier, DisadvantageIdentifier, ElementIdentifier, EyeColorIdentifier, GuidelineIdentifier, HairColorIdentifier, HerbalAidIdentifier, HerbalPreserveIdentifier, HerbIdentifier, LanguageIdentifier, LiturgicalChantIdentifier, MagicalTraditionIdentifier, PactCategoryIdentifier, PactDomainIdentifier, PatronCategoryIdentifier, PatronIdentifier, PersonalityTraitIdentifier, ProfessionIdentifier, ProfessionVariantIdentifier, PropertyIdentifier, RaceIdentifier, RangedCombatTechniqueIdentifier, RitualIdentifier, ScriptIdentifier, SkillGroupIdentifier, SkillIdentifier, SocialStatusIdentifier, SpellIdentifier, SubjectIdentifier, TargetCategoryIdentifier, WeaponIdentifier } from "./_Identifier.js"
+import { CombatTechniqueIdentifier, HerbalAidOrPreserveIdentifier, SpellworkIdentifier, TraditionIdentifier, RecipeIdentifier } from "./_IdentifierGroup.js"
export type FocusRuleSubjectReference = {
id: SubjectIdentifier
@@ -176,3 +176,19 @@ export type ArmorReference = {
export type TraditionReference = {
id: TraditionIdentifier
}
+
+export type RecipeReference = {
+ id: RecipeIdentifier
+}
+
+export type HerbalAidReference = {
+ id: HerbalAidIdentifier
+}
+
+export type HerbalPreserveReference = {
+ id: HerbalPreserveIdentifier
+}
+
+export type HerbReference = {
+ id: HerbIdentifier
+}
diff --git a/src/types/equipment/item/Herb.ts b/src/types/equipment/item/Herb.ts
new file mode 100644
index 00000000..cd02da5c
--- /dev/null
+++ b/src/types/equipment/item/Herb.ts
@@ -0,0 +1,208 @@
+/**
+ * @main Herb
+ */
+
+import { TypeConfig } from "../../../typeConfig.js"
+import { todo } from "../../../validation/builders/integrity.js"
+import { validateEntityFileName } from "../../../validation/builders/naming.js"
+import { createSchemaValidator } from "../../../validation/builders/schema.js"
+import { getFilenamePrefixAsNumericId } from "../../../validation/filename.js"
+import { AlternativeName } from "../../_AlternativeNames.js"
+import { LocaleMap } from "../../_LocaleMap.js"
+import { NonEmptyMarkdown, NonEmptyString } from "../../_NonEmptyString.js"
+import { Errata } from "../../source/_Erratum.js"
+import { PublicationRefs } from "../../source/_PublicationRef.js"
+import { EffectType, StorageLife } from "./_Herbary.js"
+import { RecipeReference } from "../../_SimpleReferences.js"
+import { ElixirIdentifier, HerbalAidIdentifier, HerbalPreserveIdentifier, PoisonIdentifier } from "../../_Identifier.js"
+
+/**
+ * @title Herb
+ */
+export type Herb = {
+ /**
+ * The herb's identifier. An unique, increasing integer.
+ * @integer
+ * @minimum 1
+ */
+ id: number
+
+ /**
+ * Effect type(s) of the plant's effect(s) and usage(s).
+ * @minItems 1
+ * @uniqueItems
+ */
+ effect_types: EffectType[]
+
+ /**
+ * The herb's prevalence per landscape type.
+ * @minItems 1
+ * @uniqueItems
+ */
+ prevalence: LandscapeTypePrevalences[]
+
+ /**
+ * Modifier for plant lore check when searching for the plant.
+ * @integer
+ */
+ search_difficulty: number
+
+ /**
+ * Modifier for plant lore check when identifying the plant.
+ * @integer
+ */
+ identification_difficulty: number
+
+ /**
+ * Doses of plant material found with a search check per quality level.
+ * @minItems 6
+ * @maxItems 6
+ */
+ uses: number[]
+
+ /**
+ * Value per dose, in silverthalers.
+ * @float
+ * @minimum 0
+ */
+ value: number
+
+ /**
+ * Price per dose, in silverthalers.
+ * @float
+ * @minimum 0
+ */
+ cost: number
+
+ /**
+ * The recipes the herb is used in.
+ * @uniqueItems
+ */
+ recipes?: RecipeReference[]
+
+ /**
+ * The Storage life of the raw herb.
+ */
+ storage_life: StorageLifeRaw
+
+ /**
+ * The preservation options and respective storage life.
+ */
+ preservation_methods: PreservationMethod[]
+
+ src: PublicationRefs
+
+ /**
+ * All translations for the entry, identified by IETF language tag (BCP47).
+ */
+ translations: LocaleMap
+}
+
+/**
+ * Prevalence and/or conditional prevalence(s) per landscape type.
+ */
+export type LandscapeTypePrevalences =
+ | { tag: "PrevalenceFarNorth", prevalence_far_north: LandscapeTypePrevalence[] }
+ | { tag: "PrevalenceVeld", prevalence_veld: LandscapeTypePrevalence[] }
+ | { tag: "PrevalenceMarsh", prevalence_marsh: LandscapeTypePrevalence[] }
+ | { tag: "PrevalenceWoods", prevalence_woods: LandscapeTypePrevalence[] }
+ | { tag: "PrevalenceRainForest", prevalence_rain_forest: LandscapeTypePrevalence[] }
+ | { tag: "PrevalenceMountains", prevalence_mountains: LandscapeTypePrevalence[] }
+ | { tag: "PrevalenceDesert", prevalence_desert: LandscapeTypePrevalence[] }
+ | { tag: "PrevalenceMaraskan", prevalence_maraskan: LandscapeTypePrevalence[] }
+ | { tag: "PrevalenceAny", prevalence_any: LandscapeTypePrevalence[] }
+
+export type LandscapeTypePrevalence = {
+ /**
+ * Prevalence class.
+ */
+ prevalence: PrevalenceClass
+ /**
+ * Condition or restrictions concerning the prevalence.
+ */
+ condition?: LocaleMap
+}
+
+/**
+ * Prevalence class from 5 (common) down to 1 (very rare)
+ */
+export type PrevalenceClass =
+ | "Common"
+ | "Occasional"
+ | "NowAndThen"
+ | "Rare"
+ | "VeryRare"
+
+/**
+ * The Storage life of a raw herb.
+ */
+export type StorageLifeRaw =
+ | { tag: "Default", default: {} }
+ | { tag: "Custom", custom: StorageLife }
+ | { tag: "Special", special: LocaleMap }
+
+/**
+ * The preservation options of a herb and respective storage life.
+ */
+export type PreservationMethod = {
+ method: PreservationMethodDescription
+ storage_life: StorageLife
+}
+
+/**
+ * Details on the preservation method of a herb.
+ */
+export type PreservationMethodDescription =
+| HerbalAidIdentifier
+| HerbalPreserveIdentifier
+| PoisonIdentifier
+| ElixirIdentifier
+| { tag: "Special", special: LocaleMap }
+
+export type HerbTranslation = {
+ /**
+ * The name of the herb.
+ */
+ name: NonEmptyString
+
+ /**
+ * A list of alternative names.
+ * @minItems 1
+ */
+ alternative_names?: AlternativeName[]
+
+ /**
+ * The plant's description.
+ */
+ description?: NonEmptyString
+
+ /**
+ * The raw plant's effect(s) when touched.
+ */
+ effect_touch?: NonEmptyString
+
+ /**
+ * The raw plant's effect(s) when inhaled.
+ */
+ effect_inhale?: NonEmptyString
+
+ /**
+ * The raw plant's effect(s) when ingested.
+ */
+ effect_ingest?: NonEmptyString
+
+ /**
+ * Simple recipes the herb is used in.
+ */
+ simple_recipe?: NonEmptyString[]
+
+ errata?: Errata
+}
+
+export const config: TypeConfig = {
+ name: "Herb",
+ id: getFilenamePrefixAsNumericId,
+ integrityValidator: todo("Herb"),
+ schemaValidator: createSchemaValidator(import.meta.url),
+ fileNameValidator: validateEntityFileName,
+}
diff --git a/src/types/equipment/item/HerbalAid.ts b/src/types/equipment/item/HerbalAid.ts
new file mode 100644
index 00000000..f8dac8f1
--- /dev/null
+++ b/src/types/equipment/item/HerbalAid.ts
@@ -0,0 +1,81 @@
+/**
+ * @main HerbalAid
+ */
+
+import { TypeConfig } from "../../../typeConfig.js"
+import { todo } from "../../../validation/builders/integrity.js"
+import { validateEntityFileName } from "../../../validation/builders/naming.js"
+import { createSchemaValidator } from "../../../validation/builders/schema.js"
+import { getFilenamePrefixAsNumericId } from "../../../validation/filename.js"
+import { LocaleMap } from "../../_LocaleMap.js"
+import { NonEmptyString } from "../../_NonEmptyString.js"
+import { Errata } from "../../source/_Erratum.js"
+import { PublicationRefs } from "../../source/_PublicationRef.js"
+import { HerbReference } from "../../_SimpleReferences.js"
+
+/**
+ * @title HerbalAid
+ */
+export type HerbalAid = {
+ /**
+ * The aid's identifier. An unique, increasing integer.
+ * @integer
+ * @minimum 1
+ */
+ id: number
+
+ /**
+ * The main ingredient, a herb.
+ */
+ main_ingredient: HerbReference
+
+ /**
+ * An alternative main ingredient, a herb.
+ */
+ alternative_main_ingredient?: HerbReference
+
+ /**
+ * Modifier for plant lore check when making the aid.
+ * @integer
+ */
+ production_difficulty: number
+
+ /**
+ * All translations for the entry, identified by IETF language tag (BCP47).
+ */
+ translation: LocaleMap
+
+ src: PublicationRefs
+}
+
+export type HerbalAidTranslation = {
+ /**
+ * Name of the preservation method.
+ */
+ name: NonEmptyString
+ /**
+ * Description of the production method and/or effect.
+ */
+ description: NonEmptyString
+
+ /**
+ * Ingredients beside the main ingredient.
+ * @minItems 1
+ */
+ additional_ingredients?: NonEmptyString[]
+
+ /**
+ * Tools and aids used in the production process.
+ */
+ typical_tools: NonEmptyString[]
+
+ errata?: Errata
+}
+
+export const config: TypeConfig = {
+ name: "HerbalAid",
+ id: getFilenamePrefixAsNumericId,
+ integrityValidator: todo("HerbalAid"),
+ schemaValidator: createSchemaValidator(import.meta.url),
+ fileNameValidator: validateEntityFileName,
+}
\ No newline at end of file
diff --git a/src/types/equipment/item/HerbalPreserve.ts b/src/types/equipment/item/HerbalPreserve.ts
new file mode 100644
index 00000000..c0efdd1d
--- /dev/null
+++ b/src/types/equipment/item/HerbalPreserve.ts
@@ -0,0 +1,71 @@
+/**
+ * @main HerbalPreserve
+ */
+
+import { TypeConfig } from "../../../typeConfig.js"
+import { todo } from "../../../validation/builders/integrity.js"
+import { validateEntityFileName } from "../../../validation/builders/naming.js"
+import { createSchemaValidator } from "../../../validation/builders/schema.js"
+import { getFilenamePrefixAsNumericId } from "../../../validation/filename.js"
+import { LocaleMap } from "../../_LocaleMap.js"
+import { NonEmptyString } from "../../_NonEmptyString.js"
+import { Errata } from "../../source/_Erratum.js"
+import { PublicationRefs } from "../../source/_PublicationRef.js"
+import { StorageLife } from "./_Herbary.js"
+import { HerbReference } from "../../_SimpleReferences.js"
+
+/**
+ * @title HerbalPreserve
+ */
+export type HerbalPreserve = {
+ /**
+ * The preserve's identifier. An unique, increasing integer.
+ * @integer
+ * @minimum 1
+ */
+ id: number
+
+ /**
+ * The main ingredient, a herb.
+ */
+ main_ingredient: HerbReference
+
+ /**
+ * The storage life of the product.
+ */
+ storage_life: StorageLife
+
+ /**
+ * All translations for the entry, identified by IETF language tag (BCP47).
+ */
+ translation: LocaleMap
+
+ src: PublicationRefs
+}
+
+export type HerbalPreserveTranslation = {
+ /**
+ * Name of the preservation method.
+ */
+ name: NonEmptyString
+
+ /**
+ * Description of the preservation method.
+ */
+ preparation: NonEmptyString
+
+ /**
+ * Alternative effect of the product.
+ */
+ alternative_effect: NonEmptyString
+
+ errata?: Errata
+}
+
+export const config: TypeConfig = {
+ name: "HerbalPreserve",
+ id: getFilenamePrefixAsNumericId,
+ integrityValidator: todo("HerbalPreserve"),
+ schemaValidator: createSchemaValidator(import.meta.url),
+ fileNameValidator: validateEntityFileName,
+}
\ No newline at end of file
diff --git a/src/types/equipment/item/Poison.ts b/src/types/equipment/item/Poison.ts
index 9b0ff042..85698b5e 100644
--- a/src/types/equipment/item/Poison.ts
+++ b/src/types/equipment/item/Poison.ts
@@ -14,7 +14,7 @@ import { LocaleMap } from "../../_LocaleMap.js"
import { NonEmptyMarkdown, NonEmptyString } from "../../_NonEmptyString.js"
import { Errata } from "../../source/_Erratum.js"
import { PublicationRefs } from "../../source/_PublicationRef.js"
-import { EffectType, LaboratoryLevel, RecipeTradeSecret } from "./_Herbary.js"
+import { EffectType, LaboratoryLevel, RecipeTradeSecret, TimeUnit } from "./_Herbary.js"
/**
* @title Poison
@@ -91,16 +91,14 @@ export type PoisonDuration =
export type ConstantPoisonTime = {
value: number
- unit: PoisonTimeUnit
+ unit: TimeUnit
}
export type DiceBasedPoisonTime = {
dice: Dice
- unit: PoisonTimeUnit
+ unit: TimeUnit
}
-export type PoisonTimeUnit = "CombatRounds" | "Minutes" | "Hours" | "Days"
-
export type IndefinitePoisonTime = {
/**
* All translations for the entry, identified by IETF language tag (BCP47).
diff --git a/src/types/equipment/item/Stationary.ts b/src/types/equipment/item/Stationery.ts
similarity index 75%
rename from src/types/equipment/item/Stationary.ts
rename to src/types/equipment/item/Stationery.ts
index 90bc4def..a62c9248 100644
--- a/src/types/equipment/item/Stationary.ts
+++ b/src/types/equipment/item/Stationery.ts
@@ -1,5 +1,5 @@
/**
- * @main Stationary
+ * @main Stationery
*/
import { TypeConfig } from "../../../typeConfig.js"
@@ -9,12 +9,12 @@ import { createSchemaValidator } from "../../../validation/builders/schema.js"
import { getFilenamePrefixAsNumericId } from "../../../validation/filename.js"
import { DefaultItem } from "./_Item.js"
-export type Stationary = DefaultItem
+export type Stationery = DefaultItem
-export const config: TypeConfig = {
- name: "Stationary",
+export const config: TypeConfig = {
+ name: "Stationery",
id: getFilenamePrefixAsNumericId,
- integrityValidator: todo("Stationary"),
+ integrityValidator: todo("Stationery"),
schemaValidator: createSchemaValidator(import.meta.url),
fileNameValidator: validateEntityFileName,
}
diff --git a/src/types/equipment/item/_Herbary.ts b/src/types/equipment/item/_Herbary.ts
index 35c8ded2..a35738a9 100644
--- a/src/types/equipment/item/_Herbary.ts
+++ b/src/types/equipment/item/_Herbary.ts
@@ -32,3 +32,24 @@ export type RecipeTradeSecret = {
*/
prerequisites?: PlainGeneralPrerequisites
}
+
+export type StorageLife = {
+ /**
+ * The storage life of a (processed) herb.
+ * @integer
+ * @minmum 1
+ */
+ value: number
+ unit: TimeUnit
+}
+
+export type TimeUnit =
+ | "CombatRounds"
+ | "Minutes"
+ | "Hours"
+ | "Days"
+ | "Weeks"
+ | "Months"
+ | "Years"
+
+