Compare commits

...
78 Commits
Author SHA1 Message Date
Lector 9718f7d341 feat!: derived select options based on property
Refs: #175
Closes #174
2026-06-27 14:55:52 +02:00
Lector 0c8f3518ea feat!: active usage type for combat styles
Refs: #171
Closes #170
Reviewed-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-27 14:06:46 +02:00
Lukas Obermann 3b3ae6f3a6 feat: optional additional name for magic styles 2026-06-24 22:19:55 +02:00
Lukas Obermann 028e438909 fix!: remove bannzeichen option native name 2026-06-21 22:53:25 +02:00
Lukas Obermann 04f2a32a5e build(release): 0.53.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-21 21:46:25 +02:00
Lukas Obermann 0e25dbf4a7 feat!: add bannzeichen cost map 2026-06-21 21:46:15 +02:00
Lukas Obermann 7e977925b5 feat: separate tradition artifact enhancement identifiers
Still includes them in SpecialAbilityIdentifier group, but now have
their own group as well.
2026-06-21 21:28:44 +02:00
Lukas Obermann 11cadd76ba build(release): 0.52.2
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-21 14:28:11 +02:00
Lukas Obermann 249af59f6a fix: combined unique constraint for botanic regions 2026-06-21 14:28:05 +02:00
Lukas Obermann bb7d59e8b7 build(release): 0.52.1
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-20 08:54:41 +02:00
Lector 1e30f55407 feat: optional translation for combat technique restrictions
Refs: #169
Closes #168
Reviewed-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-20 08:54:20 +02:00
Lukas Obermann b70343ba6e build(release): 0.52.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-19 16:49:38 +02:00
Lector 3b522aa9d7 feat: botanic region uniqueness per parent
Refs: #166
Closes #165
Reviewed-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-19 16:43:50 +02:00
Lector 894fe21536 feat!: enchantment cost map
Refs: #167
Closes #164
2026-06-19 16:40:55 +02:00
Lukas Obermann e89c4390be build(release): 0.51.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-18 20:44:19 +02:00
Lector da1d2459db feat: add schemas for goblin tradition artifact enchantments
Refs: #163
Closes #162
Reviewed-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-18 20:43:41 +02:00
Lector 6c62616285 feat!: rework plants schema
Refs: #161
Closes #160
2026-06-18 14:52:54 +02:00
Lukas Obermann 6c6d7a07fd build(release): 0.50.1
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-14 17:56:01 +02:00
Lukas Obermann 9d97dd4ec9 feat: primary blessing for tradition
This is used to complete each blessing’s tradition list.
2026-06-14 17:55:53 +02:00
Lector 27236a7588 feat: trade secrets for herbal aids
Refs: #159
Closes #158
2026-06-14 17:25:19 +02:00
Lukas Obermann 959a5f1038 build(release): 0.50.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-14 14:14:05 +02:00
Lukas Obermann 3a3af6e574 feat: allow arbitrary text input for enhancements 2026-06-14 14:13:55 +02:00
Lukas Obermann 1d06407eb4 feat!: allow arbitrary AP values for enhancements 2026-06-14 14:04:37 +02:00
Lukas Obermann 89c5a10597 refactor: remove unused check-result based types 2026-06-14 12:21:28 +02:00
Lukas Obermann f6bb84fcb6 build(release): 0.49.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-14 00:12:31 +02:00
Lukas Obermann 64ee1cce6a fix!: add missing skill rating case to parameter expression 2026-06-14 00:12:28 +02:00
Lukas Obermann 500a2631b9 build(release): 0.48.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-13 23:29:23 +02:00
Lukas Obermann 31798ca33f feat!: unify some skill durations and ranges with expressions 2026-06-13 23:29:04 +02:00
Lukas Obermann 296962d3ce build(release): 0.47.4
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-13 22:18:06 +02:00
Lukas Obermann b5ece95103 feat: culture language translations 2026-06-13 22:18:00 +02:00
Lukas Obermann 88da9b1528 build(release): 0.47.3
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-13 13:47:04 +02:00
Lukas Obermann cdb86e9aa6 feat: optional sources for skill applications
This can be used to remove an application in a later revision of a book.
2026-06-13 13:46:50 +02:00
Lukas Obermann b9e4fff14c refactor: unify tradition artifact enchantment translations
This also makes cost_note available to all enchantment entities.
2026-06-13 13:35:39 +02:00
Lukas Obermann 6c9f7a6ec2 fix: profession cantrips must be unique 2026-06-09 09:57:11 +02:00
Lector a7b8e7ec0c feat: level and options for automatic and str. rec. dis/advantages in sub-races
Changed automatic dis/advantages in the sub-race so they take the same
parameters as the other dis/advantages.

Closes #150
Reviewed-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-08 15:05:38 +02:00
Lukas Obermann 13c0d5c6ba build(release): 0.47.2
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-08 10:53:30 +02:00
Lukas Obermann aa556a48c8 feat: optional target category for animist powers 2026-06-08 10:53:25 +02:00
Lukas Obermann fbd29a6e93 build(release): 0.47.1
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-08 10:46:07 +02:00
Lukas Obermann 9ed6e70645 feat: skill check penalty for animist powers 2026-06-08 10:45:57 +02:00
Lukas Obermann af43af87de fix: personality trait effect supports markdown 2026-06-07 23:22:14 +02:00
Lukas Obermann 99fb31e053 build(release): 0.47.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-07 23:16:29 +02:00
Lukas Obermann 4c2228b6d7 fix!: interval for sustained cost map
Closes #145
2026-06-07 23:16:16 +02:00
Lukas Obermann 737fe3742c feat: fixed cantrips for base profession package
Closes #148
2026-06-07 23:13:07 +02:00
Lukas Obermann 1f28470b8f feat: note for commonness-rated entries
Closes #146
2026-06-07 23:10:47 +02:00
Lukas Obermann d4ffbb9111 feat!: personality trait as activatable prerequisite 2026-06-07 23:08:43 +02:00
Lukas Obermann 0284b1dbae build(release): 0.46.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-07 12:42:48 +02:00
Lukas Obermann 47f9e890bb feat!: allow blessed profession 2026-06-07 12:42:40 +02:00
Lukas Obermann 96d70f7237 fix: required language specializations
Language specializations must be as they are a child entity and cannot
be displayed otherwise.
2026-06-07 12:42:17 +02:00
Lukas Obermann a9ea59a802 feat: use library name as display name if available 2026-06-06 15:15:33 +02:00
Lector ae45659ff9 feat: plants entity
Refs: #142
Closes #3
Reviewed-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-06-04 13:45:30 +02:00
Lukas Obermann 2be0fb3c50 docs: explain responsive text in module doc 2026-06-03 15:21:38 +02:00
Lukas Obermann c3654151f0 build(release): 0.45.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-05-31 15:07:14 +02:00
Lukas Obermann 64e7ed1035 feat!: add maximum sr translation 2026-05-31 15:07:11 +02:00
Lukas Obermann 84d5023ea3 build(release): 0.44.1
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-05-31 13:00:11 +02:00
Lukas Obermann c147d16130 feat: full commonness-rated text replacement 2026-05-31 13:00:05 +02:00
Lukas Obermann 97671ca215 build(release): 0.44.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-05-30 09:54:08 +02:00
Lukas Obermann 7fc5fd144a feat!: diease and poison options can be required 2026-05-30 09:54:05 +02:00
Lukas Obermann d42242cc64 build(release): 0.43.3
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-05-30 09:46:48 +02:00
Lukas Obermann ce8f55b9d6 feat: commonness-rated options 2026-05-30 09:46:41 +02:00
Lukas Obermann ee3490218d build(release): 0.43.2
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-05-30 09:34:46 +02:00
Lukas Obermann 2b99d8c994 feat: commonness-rated level 2026-05-30 09:34:42 +02:00
Lukas Obermann d7f8393384 build(release): 0.43.1
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-05-29 14:52:30 +02:00
Lukas Obermann 1c8e84c082 build(deps): upgrade all dependencies 2026-05-29 14:52:20 +02:00
Lukas Obermann e0d27d3f7b build(release): 0.43.0
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-05-29 14:50:08 +02:00
Lector 7afc6b0326 feat!: auto/strong dis/advantages in race variantFeature/race advantage variant
This is a breaking change. Patch for the data is elyukai/optolith-data#1291

Refs: #139
Closes #138
Reviewed-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-05-29 11:59:05 +02:00
Lukas Obermann c2686593cb feat: printed values for lesson packages
Including the AP value and skill base values helps uncovering
inconsistencies and errors in the source books.
2026-05-29 11:52:06 +02:00
Lukas Obermann 18ab60e356 build(vscode): fix task commands 2026-05-29 11:51:06 +02:00
Lukas Obermann 21780be505 feat!: add translation for name of spellcasters
This is required for generating some text for magical traditions.
2026-05-29 11:50:45 +02:00
Lukas Obermann 57b1916f21 feat!: add translations for favored skills 2026-05-29 11:49:55 +02:00
Lukas Obermann 7d32741cd6 build(release): 0.42.4
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-04-10 21:36:49 +02:00
Lukas Obermann 0c13fbae99 perf: remove unnecessary filters in constraint
They are already filtered at the end of the whole array.
2026-04-10 21:25:34 +02:00
Lukas Obermann 4a6648e307 feat: add replacement text option to known item specifics 2026-04-10 21:18:53 +02:00
Lukas Obermann 0e62d30607 build(release): 0.42.3
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-04-10 20:04:10 +02:00
Lukas Obermann 669649ed64 build: fix repository url 2026-04-10 20:04:04 +02:00
Lukas Obermann ab075e11ff build(release): 0.42.2
Signed-off-by: Lukas Obermann <lukas.obermann@icloud.com>
2026-04-10 19:59:26 +02:00
Lukas Obermann 9a9a2bd6a1 feat: known item specifics 2026-04-10 19:57:40 +02:00
Lukas Obermann 28ffda4046 ci: optimize and upgrade jobs and actions 2026-04-01 21:40:26 +02:00
Lukas Obermann a41dbcfc4c build: rename package 2026-04-01 21:39:52 +02:00
114 changed files with 2307 additions and 1143 deletions
+7 -27
View File
@@ -9,15 +9,19 @@ on:
- v[0-9]+.[0-9]+.[0-9]+*
jobs:
build:
publish-npm:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Use Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: 24
registry-url: https://registry.npmjs.org/
- name: Install dependencies
run: npm ci
- name: Build TypeScript (first pass)
@@ -33,29 +37,5 @@ jobs:
run: npm run format:check
- name: Test schema validity
run: npm test
publish-npm:
needs: build
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 24
registry-url: https://registry.npmjs.org/
- name: Install dependencies
run: npm ci
- name: Build TypeScript (first pass)
run: npm run build
continue-on-error: true
- name: Generate Typings
run: npm run generate
- name: Build TypeScript (second pass)
run: npm run build
- name: Publish to npm
run: npm publish --provenance --access public
+3 -3
View File
@@ -10,7 +10,7 @@ on:
branches: [ "main" ]
jobs:
build:
test:
runs-on: ubuntu-latest
@@ -21,9 +21,9 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
+2 -2
View File
@@ -6,7 +6,7 @@
{
"label": "watch ts build",
"type": "shell",
"command": "npm run watch:ts",
"command": "npm run watch",
"isBackground": true,
"group": "build",
"presentation": {
@@ -16,7 +16,7 @@
{
"label": "watch generation from ts",
"type": "shell",
"command": "npm run watch:gen",
"command": "npm run generate:watch",
"isBackground": true,
"group": "build",
"presentation": {
+245
View File
@@ -2,6 +2,251 @@
All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
## [0.53.0](https://github.com/Optolith/database-schema/compare/v0.52.2...v0.53.0) (2026-06-21)
### ⚠ BREAKING CHANGES
* add bannzeichen cost map
### Features
* add bannzeichen cost map ([0e25dbf](https://github.com/Optolith/database-schema/commit/0e25dbf4a70275b9ba87f1d6b50f8e0c5ac806c1))
* separate tradition artifact enhancement identifiers ([7e97792](https://github.com/Optolith/database-schema/commit/7e977925b52135859dc4335dcf4238c1271c1a02))
## [0.52.2](https://github.com/Optolith/database-schema/compare/v0.52.1...v0.52.2) (2026-06-21)
### Bug Fixes
* combined unique constraint for botanic regions ([249af59](https://github.com/Optolith/database-schema/commit/249af59f6ac7549fa91ad756f8f12d4802593a3a))
## [0.52.1](https://github.com/Optolith/database-schema/compare/v0.52.0...v0.52.1) (2026-06-20)
### Features
* optional translation for combat technique restrictions ([1e30f55](https://github.com/Optolith/database-schema/commit/1e30f55407cae829aae2d1a1097c30eff4c68f3a)), closes [#169](https://github.com/Optolith/database-schema/issues/169) [#168](https://github.com/Optolith/database-schema/issues/168)
## [0.52.0](https://github.com/Optolith/database-schema/compare/v0.51.0...v0.52.0) (2026-06-19)
### ⚠ BREAKING CHANGES
* enchantment cost map
### Features
* botanic region uniqueness per parent ([3b522aa](https://github.com/Optolith/database-schema/commit/3b522aa9d7a76b1d8dafa3a89b1712ecba4b0c85)), closes [#166](https://github.com/Optolith/database-schema/issues/166) [#165](https://github.com/Optolith/database-schema/issues/165)
* enchantment cost map ([894fe21](https://github.com/Optolith/database-schema/commit/894fe21536d21c2bbc618ec77279da96f5303f06)), closes [#167](https://github.com/Optolith/database-schema/issues/167) [#164](https://github.com/Optolith/database-schema/issues/164)
## [0.51.0](https://github.com/Optolith/database-schema/compare/v0.50.1...v0.51.0) (2026-06-18)
### ⚠ BREAKING CHANGES
* rework plants schema
### Features
* add schemas for goblin tradition artifact enchantments ([da1d245](https://github.com/Optolith/database-schema/commit/da1d2459db003a624cce4d84c2695b927d7476f0)), closes [#163](https://github.com/Optolith/database-schema/issues/163) [#162](https://github.com/Optolith/database-schema/issues/162)
* rework plants schema ([6c62616](https://github.com/Optolith/database-schema/commit/6c6261628583cda5a27d34c194e5aae69c38a079)), closes [#161](https://github.com/Optolith/database-schema/issues/161) [#160](https://github.com/Optolith/database-schema/issues/160)
## [0.50.1](https://github.com/Optolith/database-schema/compare/v0.50.0...v0.50.1) (2026-06-14)
### Features
* primary blessing for tradition ([9d97dd4](https://github.com/Optolith/database-schema/commit/9d97dd4ec95c8dd42cb6e31873a4702684a941de))
* trade secrets for herbal aids ([27236a7](https://github.com/Optolith/database-schema/commit/27236a75884fdb891a60a0105ebb5ff82147cbc1)), closes [#159](https://github.com/Optolith/database-schema/issues/159) [#158](https://github.com/Optolith/database-schema/issues/158)
## [0.50.0](https://github.com/Optolith/database-schema/compare/v0.49.0...v0.50.0) (2026-06-14)
### ⚠ BREAKING CHANGES
* allow arbitrary AP values for enhancements
### Features
* allow arbitrary AP values for enhancements ([1d06407](https://github.com/Optolith/database-schema/commit/1d06407eb4dee8fec24bc9f8d0d6e31833e4f995))
* allow arbitrary text input for enhancements ([3a3af6e](https://github.com/Optolith/database-schema/commit/3a3af6e574c1a7d05113ebc75d5d6fa1b92c8dce))
## [0.49.0](https://github.com/Optolith/database-schema/compare/v0.48.0...v0.49.0) (2026-06-13)
### ⚠ BREAKING CHANGES
* add missing skill rating case to parameter expression
### Bug Fixes
* add missing skill rating case to parameter expression ([64ee1cc](https://github.com/Optolith/database-schema/commit/64ee1cce6adccc2027bb890289b31e2cea653645))
## [0.48.0](https://github.com/Optolith/database-schema/compare/v0.47.4...v0.48.0) (2026-06-13)
### ⚠ BREAKING CHANGES
* unify some skill durations and ranges with expressions
### Features
* unify some skill durations and ranges with expressions ([31798ca](https://github.com/Optolith/database-schema/commit/31798ca33fab12b1d1c0c6edec0c543173c8f4ac))
## [0.47.4](https://github.com/Optolith/database-schema/compare/v0.47.3...v0.47.4) (2026-06-13)
### Features
* culture language translations ([b5ece95](https://github.com/Optolith/database-schema/commit/b5ece951032138b19cb02dfc8172177bd337b37f))
## [0.47.3](https://github.com/Optolith/database-schema/compare/v0.47.2...v0.47.3) (2026-06-13)
### Features
* level and options for automatic and str. rec. dis/advantages in sub-races ([a7b8e7e](https://github.com/Optolith/database-schema/commit/a7b8e7ec0c6c1c90b8a656b9b19cd156d403382b)), closes [#150](https://github.com/Optolith/database-schema/issues/150)
* optional sources for skill applications ([cdb86e9](https://github.com/Optolith/database-schema/commit/cdb86e9aa6768601c9f017f01bde6d70108db083))
### Bug Fixes
* profession cantrips must be unique ([6c9f7a6](https://github.com/Optolith/database-schema/commit/6c9f7a6ec2bafb35c40680d1199739f1b435e6a9))
## [0.47.2](https://github.com/Optolith/database-schema/compare/v0.47.1...v0.47.2) (2026-06-08)
### Features
* optional target category for animist powers ([aa556a4](https://github.com/Optolith/database-schema/commit/aa556a48c842fabc80b2564c15743fc68b730668))
## [0.47.1](https://github.com/Optolith/database-schema/compare/v0.47.0...v0.47.1) (2026-06-08)
### Features
* skill check penalty for animist powers ([9ed6e70](https://github.com/Optolith/database-schema/commit/9ed6e7064587aaf3ac297c31f116b4eb64889b61))
### Bug Fixes
* personality trait effect supports markdown ([af43af8](https://github.com/Optolith/database-schema/commit/af43af87de963623527e5f0e6d0071d2cd09d7bc))
## [0.47.0](https://github.com/Optolith/database-schema/compare/v0.46.0...v0.47.0) (2026-06-07)
### ⚠ BREAKING CHANGES
* interval for sustained cost map
* personality trait as activatable prerequisite
### Features
* fixed cantrips for base profession package ([737fe37](https://github.com/Optolith/database-schema/commit/737fe3742cdec7997dbb011872d3a0484bb58bfc)), closes [#148](https://github.com/Optolith/database-schema/issues/148)
* note for commonness-rated entries ([1f28470](https://github.com/Optolith/database-schema/commit/1f28470b8fd0516bb1ac3507d3397e8afd6d6378)), closes [#146](https://github.com/Optolith/database-schema/issues/146)
* personality trait as activatable prerequisite ([d4ffbb9](https://github.com/Optolith/database-schema/commit/d4ffbb911165b2bb485d68e6d9b114e5dbce7a2f))
### Bug Fixes
* interval for sustained cost map ([4c2228b](https://github.com/Optolith/database-schema/commit/4c2228b6d7214bc3b9bb3b4f19bf1ac20cff0a76)), closes [#145](https://github.com/Optolith/database-schema/issues/145)
## [0.46.0](https://github.com/Optolith/database-schema/compare/v0.45.0...v0.46.0) (2026-06-07)
### ⚠ BREAKING CHANGES
* allow blessed profession
### Features
* allow blessed profession ([47f9e89](https://github.com/Optolith/database-schema/commit/47f9e890bbc46b37e36ef55b0cfcbecef2a3ef44))
* plants entity ([ae45659](https://github.com/Optolith/database-schema/commit/ae45659ff94656f60dfa803257927e6b11289c92)), closes [#142](https://github.com/Optolith/database-schema/issues/142) [#3](https://github.com/Optolith/database-schema/issues/3)
* use library name as display name if available ([a9ea59a](https://github.com/Optolith/database-schema/commit/a9ea59a8023ea770af45ac6a913c3c70c4f0bc04))
### Bug Fixes
* required language specializations ([96d70f7](https://github.com/Optolith/database-schema/commit/96d70f7237cfae07e24ead363b00d7bee795e47d))
## [0.45.0](https://github.com/Optolith/database-schema/compare/v0.44.1...v0.45.0) (2026-05-31)
### ⚠ BREAKING CHANGES
* add maximum sr translation
### Features
* add maximum sr translation ([64e7ed1](https://github.com/Optolith/database-schema/commit/64e7ed10358a26028c7c1db79a8b9a1d4bce91c5))
## [0.44.1](https://github.com/Optolith/database-schema/compare/v0.44.0...v0.44.1) (2026-05-31)
### Features
* full commonness-rated text replacement ([c147d16](https://github.com/Optolith/database-schema/commit/c147d1613090fc76689bf98891c06e81ee8bf962))
## [0.44.0](https://github.com/Optolith/database-schema/compare/v0.43.3...v0.44.0) (2026-05-30)
### ⚠ BREAKING CHANGES
* diease and poison options can be required
### Features
* diease and poison options can be required ([7fc5fd1](https://github.com/Optolith/database-schema/commit/7fc5fd144adeb561a737bb01bf2d989ea2b3acd6))
## [0.43.3](https://github.com/Optolith/database-schema/compare/v0.43.2...v0.43.3) (2026-05-30)
### Features
* commonness-rated options ([ce8f55b](https://github.com/Optolith/database-schema/commit/ce8f55b9d6d8bec97ceabfb43bd04e85b846c380))
## [0.43.2](https://github.com/Optolith/database-schema/compare/v0.43.1...v0.43.2) (2026-05-30)
### Features
* commonness-rated level ([2b99d8c](https://github.com/Optolith/database-schema/commit/2b99d8c99418101738708f0b34502b236250718a))
## [0.43.1](https://github.com/Optolith/database-schema/compare/v0.43.0...v0.43.1) (2026-05-29)
## [0.43.0](https://github.com/Optolith/database-schema/compare/v0.42.4...v0.43.0) (2026-05-29)
### ⚠ BREAKING CHANGES
* auto/strong dis/advantages in race variantFeature/race advantage variant
* add translation for name of spellcasters
* add translations for favored skills
### Features
* add translation for name of spellcasters ([21780be](https://github.com/Optolith/database-schema/commit/21780be505cf21d08bb2ef7691e613047cb0447f))
* add translations for favored skills ([57b1916](https://github.com/Optolith/database-schema/commit/57b1916f21edbd1acb57c8e0aa3b06f9be6da724))
* auto/strong dis/advantages in race variantFeature/race advantage variant ([7afc6b0](https://github.com/Optolith/database-schema/commit/7afc6b032614b1fae26f54e648eceee3aa49559c)), closes [elyukai/optolith-data#1291](https://github.com/elyukai/optolith-data/issues/1291) [#139](https://github.com/Optolith/database-schema/issues/139) [#138](https://github.com/Optolith/database-schema/issues/138)
* printed values for lesson packages ([c268659](https://github.com/Optolith/database-schema/commit/c2686593cb874e4f18ba86ea51d6c7d59f0cce85))
## [0.42.4](https://github.com/Optolith/database-schema/compare/v0.42.3...v0.42.4) (2026-04-10)
### Features
* add replacement text option to known item specifics ([4a6648e](https://github.com/Optolith/database-schema/commit/4a6648e307a35a62422c923de59b156811da1119))
## [0.42.3](https://github.com/Optolith/database-schema/compare/v0.42.2...v0.42.3) (2026-04-10)
## [0.42.2](https://github.com/elyukai/optolith-database-schema/compare/v0.42.1...v0.42.2) (2026-04-10)
### Features
* known item specifics ([9a9a2bd](https://github.com/elyukai/optolith-database-schema/commit/9a9a2bd6a1a2ff3ee7a3c14cea064a0cce1ee52f))
## [0.42.1](https://github.com/elyukai/optolith-database-schema/compare/v0.42.0...v0.42.1) (2026-03-31)
+249 -200
View File
@@ -1,28 +1,28 @@
{
"name": "optolith-database-schema",
"version": "0.42.1",
"name": "@optolith/database-schema",
"version": "0.53.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "optolith-database-schema",
"version": "0.42.1",
"name": "@optolith/database-schema",
"version": "0.53.0",
"license": "MPL-2.0",
"dependencies": {
"@elyukai/utils": "^0.3.3",
"@elyukai/utils": "^0.3.6",
"tsondb": "^0.20.3",
"yaml": "^2.8.2"
"yaml": "^2.9.0"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@types/node": "^25.5.0",
"commit-and-tag-version": "^12.7.1",
"eslint": "^10.1.0",
"globals": "^17.4.0",
"@types/node": "^25.9.1",
"commit-and-tag-version": "^12.7.3",
"eslint": "^10.4.0",
"globals": "^17.6.0",
"nodemon": "^3.1.14",
"prettier": "^3.8.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.57.1"
"prettier": "^3.8.3",
"typescript": "^6.0.3",
"typescript-eslint": "^8.60.0"
}
},
"node_modules/@babel/code-frame": {
@@ -60,9 +60,9 @@
}
},
"node_modules/@elyukai/utils": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/@elyukai/utils/-/utils-0.3.3.tgz",
"integrity": "sha512-pySG+y+mzJyqPvY5ZT5EnpwpM9zHwBTIr4/FK7Udu+v1zJTq2NUqc0eCSF9KBlxH07lOYSKk2lVx2///+r6Bkg==",
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@elyukai/utils/-/utils-0.3.6.tgz",
"integrity": "sha512-SFij3T0baqFu+G5NGjlHPVpLtKEeVRKg59jiMr7wQwAYM7LLpgoArBLeM/UL98FM0ntmvaRDDEBCfyMcCnsxdA==",
"license": "MPL-2.0"
},
"node_modules/@eslint-community/eslint-utils": {
@@ -108,13 +108,13 @@
}
},
"node_modules/@eslint/config-array": {
"version": "0.23.3",
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz",
"integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==",
"version": "0.23.5",
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
"integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@eslint/object-schema": "^3.0.3",
"@eslint/object-schema": "^3.0.5",
"debug": "^4.3.1",
"minimatch": "^10.2.4"
},
@@ -133,9 +133,9 @@
}
},
"node_modules/@eslint/config-array/node_modules/brace-expansion": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
"integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
"integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -146,13 +146,13 @@
}
},
"node_modules/@eslint/config-array/node_modules/minimatch": {
"version": "10.2.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
"integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
"version": "10.2.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
"integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"brace-expansion": "^5.0.2"
"brace-expansion": "^5.0.5"
},
"engines": {
"node": "18 || 20 || >=22"
@@ -162,22 +162,22 @@
}
},
"node_modules/@eslint/config-helpers": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz",
"integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==",
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz",
"integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@eslint/core": "^1.1.1"
"@eslint/core": "^1.2.1"
},
"engines": {
"node": "^20.19.0 || ^22.13.0 || >=24"
}
},
"node_modules/@eslint/core": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz",
"integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
"integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -209,9 +209,9 @@
}
},
"node_modules/@eslint/object-schema": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz",
"integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==",
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
"integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -219,13 +219,13 @@
}
},
"node_modules/@eslint/plugin-kit": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz",
"integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==",
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
"integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@eslint/core": "^1.1.1",
"@eslint/core": "^1.2.1",
"levn": "^0.4.1"
},
"engines": {
@@ -309,6 +309,19 @@
"integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
"license": "MIT"
},
"node_modules/@nodable/entities": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz",
"integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/nodable"
}
],
"license": "MIT"
},
"node_modules/@preact/signals": {
"version": "2.8.2",
"resolved": "https://registry.npmjs.org/@preact/signals/-/signals-2.8.2.tgz",
@@ -335,6 +348,21 @@
"url": "https://opencollective.com/preact"
}
},
"node_modules/@simple-git/args-pathspec": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz",
"integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==",
"license": "MIT"
},
"node_modules/@simple-git/argv-parser": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz",
"integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==",
"license": "MIT",
"dependencies": {
"@simple-git/args-pathspec": "^1.0.3"
}
},
"node_modules/@types/esrecurse": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
@@ -364,13 +392,13 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "25.5.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz",
"integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
"version": "25.9.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz",
"integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~7.18.0"
"undici-types": ">=7.24.0 <7.24.7"
}
},
"node_modules/@types/normalize-package-data": {
@@ -381,20 +409,20 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz",
"integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz",
"integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.57.1",
"@typescript-eslint/type-utils": "8.57.1",
"@typescript-eslint/utils": "8.57.1",
"@typescript-eslint/visitor-keys": "8.57.1",
"@typescript-eslint/scope-manager": "8.60.0",
"@typescript-eslint/type-utils": "8.60.0",
"@typescript-eslint/utils": "8.60.0",
"@typescript-eslint/visitor-keys": "8.60.0",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.4.0"
"ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -404,9 +432,9 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"@typescript-eslint/parser": "^8.57.1",
"@typescript-eslint/parser": "^8.60.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
@@ -420,16 +448,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz",
"integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz",
"integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/scope-manager": "8.57.1",
"@typescript-eslint/types": "8.57.1",
"@typescript-eslint/typescript-estree": "8.57.1",
"@typescript-eslint/visitor-keys": "8.57.1",
"@typescript-eslint/scope-manager": "8.60.0",
"@typescript-eslint/types": "8.60.0",
"@typescript-eslint/typescript-estree": "8.60.0",
"@typescript-eslint/visitor-keys": "8.60.0",
"debug": "^4.4.3"
},
"engines": {
@@ -441,18 +469,18 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/project-service": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz",
"integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz",
"integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.57.1",
"@typescript-eslint/types": "^8.57.1",
"@typescript-eslint/tsconfig-utils": "^8.60.0",
"@typescript-eslint/types": "^8.60.0",
"debug": "^4.4.3"
},
"engines": {
@@ -463,18 +491,18 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"typescript": ">=4.8.4 <6.0.0"
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz",
"integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz",
"integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.57.1",
"@typescript-eslint/visitor-keys": "8.57.1"
"@typescript-eslint/types": "8.60.0",
"@typescript-eslint/visitor-keys": "8.60.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -485,9 +513,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz",
"integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz",
"integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -498,21 +526,21 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"typescript": ">=4.8.4 <6.0.0"
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz",
"integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz",
"integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.57.1",
"@typescript-eslint/typescript-estree": "8.57.1",
"@typescript-eslint/utils": "8.57.1",
"@typescript-eslint/types": "8.60.0",
"@typescript-eslint/typescript-estree": "8.60.0",
"@typescript-eslint/utils": "8.60.0",
"debug": "^4.4.3",
"ts-api-utils": "^2.4.0"
"ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -523,13 +551,13 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/types": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz",
"integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz",
"integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -541,21 +569,21 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz",
"integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz",
"integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/project-service": "8.57.1",
"@typescript-eslint/tsconfig-utils": "8.57.1",
"@typescript-eslint/types": "8.57.1",
"@typescript-eslint/visitor-keys": "8.57.1",
"@typescript-eslint/project-service": "8.60.0",
"@typescript-eslint/tsconfig-utils": "8.60.0",
"@typescript-eslint/types": "8.60.0",
"@typescript-eslint/visitor-keys": "8.60.0",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
"tinyglobby": "^0.2.15",
"ts-api-utils": "^2.4.0"
"ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -565,7 +593,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"typescript": ">=4.8.4 <6.0.0"
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
@@ -579,9 +607,9 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
"integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
"integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -592,13 +620,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
"version": "10.2.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
"integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
"version": "10.2.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
"integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"brace-expansion": "^5.0.2"
"brace-expansion": "^5.0.5"
},
"engines": {
"node": "18 || 20 || >=22"
@@ -608,16 +636,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz",
"integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz",
"integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.57.1",
"@typescript-eslint/types": "8.57.1",
"@typescript-eslint/typescript-estree": "8.57.1"
"@typescript-eslint/scope-manager": "8.60.0",
"@typescript-eslint/types": "8.60.0",
"@typescript-eslint/typescript-estree": "8.60.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -628,17 +656,17 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz",
"integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz",
"integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.57.1",
"@typescript-eslint/types": "8.60.0",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
@@ -747,9 +775,9 @@
}
},
"node_modules/anymatch/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -821,9 +849,9 @@
}
},
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"version": "1.1.15",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz",
"integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1003,9 +1031,9 @@
"license": "MIT"
},
"node_modules/commit-and-tag-version": {
"version": "12.7.1",
"resolved": "https://registry.npmjs.org/commit-and-tag-version/-/commit-and-tag-version-12.7.1.tgz",
"integrity": "sha512-18+iV9VMPWQ5rryn1nKprvkwqFMx1eOcEwIprjgyGm8Blhsw7WnsFXgyYLIlBF4uG2fcbbps8P7fBZARvaA0VA==",
"version": "12.7.3",
"resolved": "https://registry.npmjs.org/commit-and-tag-version/-/commit-and-tag-version-12.7.3.tgz",
"integrity": "sha512-rbauuCDU98yEHMy/LrNNu8HLTuGv7C2kN/3GXC59L18aJGii0eiryCESb1SEHXNFem2/2ngWG/Pq6qaCqw3aCw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -1673,18 +1701,18 @@
}
},
"node_modules/eslint": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz",
"integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==",
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.0.tgz",
"integrity": "sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.2",
"@eslint/config-array": "^0.23.3",
"@eslint/config-helpers": "^0.5.3",
"@eslint/core": "^1.1.1",
"@eslint/plugin-kit": "^0.6.1",
"@eslint/config-array": "^0.23.5",
"@eslint/config-helpers": "^0.6.0",
"@eslint/core": "^1.2.1",
"@eslint/plugin-kit": "^0.7.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -1771,9 +1799,9 @@
}
},
"node_modules/eslint/node_modules/brace-expansion": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz",
"integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==",
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
"integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1950,9 +1978,9 @@
"license": "MIT"
},
"node_modules/fast-xml-builder": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz",
"integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz",
"integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==",
"dev": true,
"funding": [
{
@@ -1962,13 +1990,14 @@
],
"license": "MIT",
"dependencies": {
"path-expression-matcher": "^1.1.3"
"path-expression-matcher": "^1.5.0",
"xml-naming": "^0.1.0"
}
},
"node_modules/fast-xml-parser": {
"version": "5.5.8",
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz",
"integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==",
"version": "5.8.0",
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.8.0.tgz",
"integrity": "sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg==",
"dev": true,
"funding": [
{
@@ -1978,9 +2007,11 @@
],
"license": "MIT",
"dependencies": {
"fast-xml-builder": "^1.1.4",
"path-expression-matcher": "^1.2.0",
"strnum": "^2.2.0"
"@nodable/entities": "^2.1.0",
"fast-xml-builder": "^1.2.0",
"path-expression-matcher": "^1.5.0",
"strnum": "^2.3.0",
"xml-naming": "^0.1.0"
},
"bin": {
"fxparser": "src/cli/cli.js"
@@ -2317,9 +2348,9 @@
}
},
"node_modules/globals": {
"version": "17.4.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz",
"integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==",
"version": "17.6.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
"integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2349,9 +2380,9 @@
"license": "ISC"
},
"node_modules/handlebars": {
"version": "4.7.8",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
"integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
"version": "4.7.9",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz",
"integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3222,16 +3253,16 @@
}
},
"node_modules/nodemon/node_modules/brace-expansion": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz",
"integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==",
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
"integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^4.0.2"
},
"engines": {
"node": "20 || >=22"
"node": "18 || 20 || >=22"
}
},
"node_modules/nodemon/node_modules/minimatch": {
@@ -3403,9 +3434,9 @@
}
},
"node_modules/path-expression-matcher": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz",
"integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==",
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz",
"integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==",
"dev": true,
"funding": [
{
@@ -3436,9 +3467,9 @@
"license": "MIT"
},
"node_modules/path-to-regexp": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
"integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
"integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
"license": "MIT",
"funding": {
"type": "opencollective",
@@ -3476,9 +3507,9 @@
"license": "ISC"
},
"node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3539,9 +3570,9 @@
}
},
"node_modules/prettier": {
"version": "3.8.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
"integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
"dev": true,
"license": "MIT",
"bin": {
@@ -3592,9 +3623,9 @@
}
},
"node_modules/qs": {
"version": "6.15.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz",
"integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
"version": "6.15.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
"integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.1.0"
@@ -3801,9 +3832,9 @@
}
},
"node_modules/readdirp/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4067,13 +4098,15 @@
"license": "MPL-2.0"
},
"node_modules/simple-git": {
"version": "3.33.0",
"resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.33.0.tgz",
"integrity": "sha512-D4V/tGC2sjsoNhoMybKyGoE+v8A60hRawKQ1iFRA1zwuDgGZCBJ4ByOzZ5J8joBbi4Oam0qiPH+GhzmSBwbJng==",
"version": "3.36.0",
"resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz",
"integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==",
"license": "MIT",
"dependencies": {
"@kwsites/file-exists": "^1.1.1",
"@kwsites/promise-deferred": "^1.1.1",
"@simple-git/args-pathspec": "^1.0.3",
"@simple-git/argv-parser": "^1.1.0",
"debug": "^4.4.0"
},
"funding": {
@@ -4234,9 +4267,9 @@
}
},
"node_modules/strnum": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.1.tgz",
"integrity": "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz",
"integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==",
"dev": true,
"funding": [
{
@@ -4334,14 +4367,14 @@
}
},
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"version": "0.2.16",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
"integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
"picomatch": "^4.0.3"
"picomatch": "^4.0.4"
},
"engines": {
"node": ">=12.0.0"
@@ -4477,9 +4510,9 @@
"license": "MIT"
},
"node_modules/typescript": {
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
"integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -4491,16 +4524,16 @@
}
},
"node_modules/typescript-eslint": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.1.tgz",
"integrity": "sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==",
"version": "8.60.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz",
"integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/eslint-plugin": "8.57.1",
"@typescript-eslint/parser": "8.57.1",
"@typescript-eslint/typescript-estree": "8.57.1",
"@typescript-eslint/utils": "8.57.1"
"@typescript-eslint/eslint-plugin": "8.60.0",
"@typescript-eslint/parser": "8.60.0",
"@typescript-eslint/typescript-estree": "8.60.0",
"@typescript-eslint/utils": "8.60.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4511,7 +4544,7 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/uglify-js": {
@@ -4536,9 +4569,9 @@
"license": "MIT"
},
"node_modules/undici-types": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
"integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"version": "7.24.6",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
"integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
"dev": true,
"license": "MIT"
},
@@ -4681,6 +4714,22 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
"node_modules/xml-naming": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz",
"integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
"license": "MIT",
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -4709,9 +4758,9 @@
"license": "ISC"
},
"node_modules/yaml": {
"version": "2.8.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
"integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
"integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
+13 -13
View File
@@ -1,6 +1,6 @@
{
"name": "optolith-database-schema",
"version": "0.42.1",
"name": "@optolith/database-schema",
"version": "0.53.0",
"description": "Definitions and utilities for the flat-file database of Optolith, a character creation tool for the Pen and Paper RPG “The Dark Eye 5”, and its external integrations into other software.",
"keywords": [
"tde",
@@ -38,24 +38,24 @@
"author": "Lukas Obermann",
"license": "MPL-2.0",
"dependencies": {
"@elyukai/utils": "^0.3.3",
"@elyukai/utils": "^0.3.6",
"tsondb": "^0.20.3",
"yaml": "^2.8.2"
"yaml": "^2.9.0"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@types/node": "^25.5.0",
"commit-and-tag-version": "^12.7.1",
"eslint": "^10.1.0",
"globals": "^17.4.0",
"@types/node": "^25.9.1",
"commit-and-tag-version": "^12.7.3",
"eslint": "^10.4.0",
"globals": "^17.6.0",
"nodemon": "^3.1.14",
"prettier": "^3.8.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.57.1"
"prettier": "^3.8.3",
"typescript": "^6.0.3",
"typescript-eslint": "^8.60.0"
},
"repository": "github:elyukai/optolith-database-schema",
"repository": "github:Optolith/database-schema",
"bugs": {
"url": "https://github.com/elyukai/optolith-database-schema/issues"
"url": "https://github.com/Optolith/database-schema/issues"
},
"type": "module"
}
+48 -10
View File
@@ -17,7 +17,9 @@ import type {
ImprovementCost,
Poison,
PrerequisiteForLevel,
Property_ID,
RequirableSelectOptionIdentifier,
Ritual_ID,
SelectOptionCategory,
SelectOptions,
SelectOptionsAdventurePointsValue,
@@ -28,6 +30,7 @@ import type {
SkillSelectOptionCategoryPrerequisite,
SpecificFromSkillSelectOptionCategoryCategory,
SpecificTargetCategory,
Spell_ID,
TargetCategory,
TradeSecretAdventurePointsValue,
} from "../../gen/types.js"
@@ -67,15 +70,17 @@ const wrapPlainApValue = (
): TradeSecretAdventurePointsValue | undefined =>
apValue === undefined ? undefined : Case("Fixed", apValue)
const matchesSpecificSkillishIdList = (
id: string,
config: SpecificFromSkillSelectOptionCategoryCategory<string>,
const matchesSpecificSkillishIdList = <Ref>(
config: SpecificFromSkillSelectOptionCategoryCategory<Ref>,
matches: (required: Ref) => boolean,
): boolean => {
const isInList = config.list.some(matches)
switch (config.operation.kind) {
case "Intersection":
return config.list.includes(id)
return isInList
case "Difference":
return !config.list.includes(id)
return !isInList
default:
return assertExhaustive(config.operation)
}
@@ -233,14 +238,35 @@ const getDefaultSkillishFilter = <E extends SkillishEntityName>(
const { specific } = category
return specific === undefined
? undefined
: ({ id }) => matchesSpecificSkillishIdList(id, specific)
: ({ id }) => matchesSpecificSkillishIdList(specific, required => required === id)
}
const getDerivedSkillishSelectOptions = <E extends SkillishEntityName>(
const getSpellworkFilter = <E extends "Spell" | "Ritual">(
category: GenericSkillsSelectOptionCategoryCategory<
Case<"Single", Spell_ID | Ritual_ID> | Case<"Property", Property_ID>
>,
): ((instance: { id: string; content: Entity<TSONDBTypes, E> }) => boolean) | undefined => {
const { specific } = category
return specific === undefined
? undefined
: ({ id, content: { property } }) =>
matchesSpecificSkillishIdList(specific, required => {
switch (required.kind) {
case "Single":
return required.Single === id
case "Property":
return property === required.Property
default:
return assertExhaustive(required)
}
})
}
const getDerivedSkillishSelectOptions = <E extends SkillishEntityName, ID>(
database: TSONDB<TSONDBTypes>,
entryId: ActivatableIdentifier,
entity: E,
category: GenericSkillsSelectOptionCategoryCategory<string> & {
category: GenericSkillsSelectOptionCategoryCategory<ID> & {
skill_applications?: SkillApplicationOrUse[] | undefined
skill_uses?: SkillApplicationOrUse[] | undefined
},
@@ -248,7 +274,7 @@ const getDerivedSkillishSelectOptions = <E extends SkillishEntityName>(
bindingCost?: SelectOptionsBindingCostValue<SkillishIdentifier | CombatTechniqueIdentifier>
ap_value?: SelectOptionsAdventurePointsValue<SkillishIdentifier | CombatTechniqueIdentifier>
},
filter = getDefaultSkillishFilter<E>(category),
filter: ((instance: { id: string; content: Entity<TSONDBTypes, E> }) => boolean) | undefined,
) => {
const { prerequisites } = category
const { bindingCost, ap_value } = options
@@ -928,7 +954,10 @@ const getDerivedSelectOptions = (
const matchesIdRequirement =
category.Skills.specific === undefined ||
matchesSpecificSkillishIdList(id, category.Skills.specific)
matchesSpecificSkillishIdList(
category.Skills.specific,
required => required === id,
)
return matchesGroupRequirement && matchesIdRequirement
},
@@ -940,6 +969,7 @@ const getDerivedSelectOptions = (
"Spell",
category.Spells,
selectOptionCategory.Skills,
getSpellworkFilter(category.Spells),
)
case "Rituals":
return getDerivedSkillishSelectOptions(
@@ -948,6 +978,7 @@ const getDerivedSelectOptions = (
"Ritual",
category.Rituals,
selectOptionCategory.Skills,
getSpellworkFilter(category.Rituals),
)
case "LiturgicalChants":
return getDerivedSkillishSelectOptions(
@@ -956,6 +987,7 @@ const getDerivedSelectOptions = (
"LiturgicalChant",
category.LiturgicalChants,
selectOptionCategory.Skills,
getDefaultSkillishFilter(category.LiturgicalChants),
)
case "Ceremonies":
return getDerivedSkillishSelectOptions(
@@ -964,6 +996,7 @@ const getDerivedSelectOptions = (
"Ceremony",
category.Ceremonies,
selectOptionCategory.Skills,
getDefaultSkillishFilter(category.Ceremonies),
)
default:
return assertExhaustive(category)
@@ -980,6 +1013,7 @@ const getDerivedSelectOptions = (
"CloseCombatTechnique",
category.CloseCombatTechniques,
selectOptionCategory.CombatTechniques,
getDefaultSkillishFilter(category.CloseCombatTechniques),
)
case "RangedCombatTechniques":
return getDerivedSkillishSelectOptions(
@@ -988,6 +1022,7 @@ const getDerivedSelectOptions = (
"RangedCombatTechnique",
category.RangedCombatTechniques,
selectOptionCategory.CombatTechniques,
getDefaultSkillishFilter(category.RangedCombatTechniques),
)
default:
return assertExhaustive(category)
@@ -1118,8 +1153,10 @@ const cacheKeyBase: Record<ActivatableIdentifier["kind"], null> = {
FoolsHatEnchantment: null,
GeneralSpecialAbility: null,
Haubenzauber: null,
Hauerkettenzauber: null,
InstrumentEnchantment: null,
KarmaSpecialAbility: null,
Keulenzauber: null,
Krallenkettenzauber: null,
Kristallkugelzauber: null,
LiturgicalStyleSpecialAbility: null,
@@ -1132,6 +1169,7 @@ const cacheKeyBase: Record<ActivatableIdentifier["kind"], null> = {
PactGift: null,
ProtectiveWardingCircleSpecialAbility: null,
RingEnchantment: null,
Schweinetrommelzauber: null,
Sermon: null,
SexSpecialAbility: null,
SickleRitual: null,
@@ -87,6 +87,7 @@ const isPrerequisiteFor = (
case "Text":
case "NoOtherAncestorBloodAdvantage":
case "SexualCharacteristic":
case "PersonalityTrait":
return false
default:
return assertExhaustive(prerequisite)
+9
View File
@@ -47,9 +47,11 @@ export const schema = new Schema<TSONDBTypes>(
Types.BandageOrRemedy,
Types.Bannzeichen,
Types.Beutelzauber,
Types.Biome,
Types.BlessedTradition,
Types.Blessing,
Types.Book,
Types.BotanicRegion,
Types.BowlEnchantment,
Types.BrawlingSpecialAbility,
Types.Brew,
@@ -96,7 +98,10 @@ export const schema = new Schema<TSONDBTypes>(
Types.GoblinRitual,
Types.Guideline,
Types.HairColor,
Types.Hauerkettenzauber,
Types.Haubenzauber,
Types.HerbalAid,
Types.HerbalPreservation,
Types.HomunculusType,
Types.IlluminationLightSource,
Types.IlluminationRefillOrSupply,
@@ -104,6 +109,7 @@ export const schema = new Schema<TSONDBTypes>(
Types.JesterTrick,
Types.Jewelry,
Types.KarmaSpecialAbility,
Types.Keulenzauber,
Types.Krallenkettenzauber,
Types.Kristallkugelzauber,
Types.Laboratory,
@@ -133,6 +139,7 @@ export const schema = new Schema<TSONDBTypes>(
Types.PatronCategory,
Types.PersonalityTrait,
Types.PlayerType,
Types.Plant,
Types.Poison,
Types.Profession,
Types.Property,
@@ -145,6 +152,7 @@ export const schema = new Schema<TSONDBTypes>(
Types.RingEnchantment,
Types.Ritual,
Types.RopeOrChain,
Types.Schweinetrommelzauber,
Types.Script,
Types.Sermon,
Types.Service,
@@ -162,6 +170,7 @@ export const schema = new Schema<TSONDBTypes>(
Types.StaffEnchantment,
Types.State,
Types.Stationery,
Types.SubBiome,
Types.Subject,
Types.Talisman,
Types.TargetCategory,
+2 -1
View File
@@ -2,7 +2,7 @@ import * as DB from "tsondb/schema/dsl"
import { input, levels, maximum, name, name_in_library, range_l10n, rules } from "./_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "./_ActivatableAdventurePointsValue.js"
import { automatic_entries } from "./_ActivatableAutomatic.js"
import { nameBuilderRules } from "./_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "./_ActivatableNames.ts"
import { explicit_select_options, select_options } from "./_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "./_ActivatableSkillApplicationsAndUses.js"
import { AdvantageDisadvantagePrerequisites } from "./_Prerequisite.js"
@@ -55,6 +55,7 @@ export const Advantage = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+20
View File
@@ -146,6 +146,25 @@ const CultureLanguage = DB.TypeAlias(import.meta.url, {
comment: "The language specializations, if any.",
type: DB.Array(LanguageSpecializationIdentifier(), { minItems: 1, uniqueItems: true }),
}),
translations: NestedTranslationMap(
DB.Optional,
"CultureLanguage",
DB.Object(
{
specialization: DB.Optional({
comment:
"The concrete language specialization, if the language allows to specify arbitrary text.",
type: DB.String({ minLength: 1 }),
}),
specializationPrompt: DB.Optional({
comment:
"A different promt fro the language specialization, if the language allows to specify arbitrary text.",
type: DB.String({ minLength: 1 }),
}),
},
{ minProperties: 1 },
),
),
}),
})
@@ -307,6 +326,7 @@ const BlessedCommonProfessionConstraint = DB.Enum(import.meta.url, {
name: "BlessedCommonProfessionConstraint",
values: () => ({
Tradition: DB.EnumCase({ type: DB.IncludeIdentifier(BlessedTraditionConstraint) }),
Profession: DB.EnumCase({ type: DB.IncludeIdentifier(ProfessionConstraint) }),
}),
})
+2 -1
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { input, levels, maximum, name, name_in_library, rules } from "./_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "./_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "./_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "./_ActivatableNames.ts"
import { explicit_select_options, select_options } from "./_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "./_ActivatableSkillApplicationsAndUses.js"
import { AdvantageDisadvantagePrerequisites } from "./_Prerequisite.js"
@@ -56,6 +56,7 @@ export const Disadvantage = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+2 -2
View File
@@ -6,7 +6,7 @@ import {
} from "./_ActivatableSkillCost.js"
import {
DurationUnitValue,
FixedDuration,
ExpressionBasedDuration,
IndefiniteDuration,
} from "./_ActivatableSkillDuration.js"
import {
@@ -188,7 +188,7 @@ const FamiliarsTrickOneTimeDuration = DB.Enum(import.meta.url, {
name: "FamiliarsTrickOneTimeDuration",
values: () => ({
Immediate: DB.EnumCase({ type: null }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(FixedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
Indefinite: DB.EnumCase({ type: DB.IncludeIdentifier(IndefiniteDuration) }),
}),
})
+41 -1
View File
@@ -182,6 +182,11 @@ export const LessonPackage = DB.Entity(import.meta.url, {
comment: "The associated curriculum.",
type: CurriculumIdentifier(),
}),
apValue: DB.Optional({
comment:
"The AP value of the lesson package. This is only used to compare the generated AP value with the one in the book for error checking.",
type: DB.Integer({ minimum: 1 }),
}),
spellwork_changes: DB.Optional({
comment:
"The spell values difference of the lesson package. This field reflects the changes (difference) to the field of the same name in the profession package. If a spell gets to SR 0 because of this, it will be removed completely.",
@@ -233,7 +238,7 @@ const AbilityAdjustment = DB.Enum(import.meta.url, {
values: () => ({
CombatTechnique: DB.EnumCase({ type: DB.IncludeIdentifier(CombatTechniqueAdjustment) }),
Skill: DB.EnumCase({ type: DB.IncludeIdentifier(SkillAdjustment) }),
Spellwork: DB.EnumCase({ type: DB.IncludeIdentifier(SpellworkAdjustment) }),
Spellwork: DB.EnumCase({ type: DB.IncludeIdentifier(SpellworkAdjustmentWithBase) }),
}),
})
@@ -249,6 +254,11 @@ const CombatTechniqueAdjustment = DB.TypeAlias(import.meta.url, {
"The combat technique points that will be added to the current combat technique rating.",
type: DB.Integer({ minimum: -6, maximum: 6 }),
}),
basePoints: DB.Optional({
comment:
"The combat technique rating of the base profession package. This is only used to compare the derived rating from the profession package with the one in the book for error checking. Note that 6 is always added to that number, so to get a base rating of 10, this field should be 4.",
type: DB.Integer({ minimum: 0, maximum: 6 }),
}),
}),
})
@@ -263,6 +273,11 @@ const SkillAdjustment = DB.TypeAlias(import.meta.url, {
comment: "The skill points that will be added to the current skill rating.",
type: DB.Integer({ minimum: -8, maximum: 8 }),
}),
basePoints: DB.Optional({
comment:
"The skill rating of the base profession package. This is only used to compare the derived rating from the profession package with the one in the book for error checking.",
type: DB.Integer({ minimum: 0, maximum: 8 }),
}),
}),
})
@@ -285,3 +300,28 @@ const SpellworkAdjustment = DB.TypeAlias(import.meta.url, {
}),
}),
})
const SpellworkAdjustmentWithBase = DB.TypeAlias(import.meta.url, {
name: "SpellworkAdjustmentWithBase",
type: () =>
DB.Object({
id: DB.Required({
type: DB.IncludeIdentifier(SpellworkIdentifier),
}),
points: DB.Required({
comment:
"The skill points that will be added to the current skill rating. If a spell gets to a skill rating of 0 because of this, it will be removed completely.",
type: DB.Integer({ minimum: -10, maximum: 10 }),
}),
basePoints: DB.Optional({
comment:
"The spell rating of the base profession package. This is only used to compare the derived rating from the profession package with the one in the book for error checking.",
type: DB.Integer({ minimum: 0, maximum: 10 }),
}),
tradition: DB.Optional({
comment:
"The target tradition. If the target spell is not from the Guild Mage tradition, specify the tradition identifier here.",
type: MagicalTraditionIdentifier(),
}),
}),
})
+15
View File
@@ -1042,6 +1042,12 @@ export const Locale = DB.Entity(import.meta.url, {
".input {$value :number} .input {$style :string} {{{$value} years}}": null,
"{$value} years": null,
"years": null,
".input {$value :number} .input {$style :string} {{{$value} dcs.}}": null,
"{$value} dcs.": null,
"dcs.": null,
".input {$value :number} .input {$style :string} {{{$value} decades}}": null,
"{$value} decades": null,
"decades": null,
".input {$value :number} .input {$style :string} {{{$value} cent.}}": null,
"{$value} cent.": null,
"cent.": null,
@@ -1422,6 +1428,7 @@ export const Locale = DB.Entity(import.meta.url, {
"Aspect": null,
"As chosen": null,
"Passive": null,
"Active": null,
"Basic Maneuver": null,
"Special Maneuver": null,
"Volume": null,
@@ -1434,9 +1441,16 @@ export const Locale = DB.Entity(import.meta.url, {
"corresponding liturgical style special ability": null,
"corresponding magic style special ability": null,
"corresponding skill style special ability": null,
"Favored Skills": null,
"The primary attribute of this Tradition is {$attr}.": null,
"This primary attribute of this Tradition is {$attr}; however, {$casters} use only half of this stat (rounded up) to calculate their base AE pool or purchase AE.": null,
"Tradition ({$name}) has no associated primary attribute, meaning {$casters} receive no bonus to the AE pool and cannot purchase additional AE.": null,
".input {$count :number} {{{$baseList}, and {$count} of your choice from the following list: {$selection}}}": null,
// combat special ability -- applicable combat techniques
"All": null,
"All Combat Techniques": null, // for favored combat techniques
"All Combat Techniques used in hunting": null,
"All Close Combat Techniques": null,
"All Ranged Combat Techniques": null,
"Depends on combat style; both combat styles can be used only for their corresponding combat techniques": null,
@@ -1714,6 +1728,7 @@ export const Locale = DB.Entity(import.meta.url, {
"no Liturgies totaling {$apValue} AP": null,
"{$apValue} AP to improve other {$skillsOfGroup}": null,
"{$apValue} AP to distribute among the following skills: {$list}": null,
"maximum SR per skill: {$maxSR}": null,
"no AP to improve other {$skillsOfGroup}": null,
".input {$count :number} {{{$count} cantrips}}": null,
"{$count} from the following list": null,
+1 -1
View File
@@ -62,7 +62,7 @@ const PersonalityTraitEffect = DB.TypeAlias(import.meta.url, {
}),
text: DB.Required({
comment: "The effect text.",
type: DB.String({ minLength: 1 }),
type: DB.String({ minLength: 1, markdown: "inline" }),
}),
}),
})
+4
View File
@@ -255,6 +255,10 @@ export const ProfessionPackage = DB.Entity(import.meta.url, {
comment: "The skill ratings the package grants to the hero.",
type: DB.Array(DB.IncludeIdentifier(SkillRating), { minItems: 1 }),
}),
cantrips: DB.Optional({
comment: "The cantrips the profession receives from the package.",
type: DB.Array(CantripIdentifier(), { minItems: 1, uniqueItems: true }),
}),
spells: DB.Optional({
comment:
"The skill ratings a magical profession receives for spells; these spells are considered activated. Spells from an unfamiliar Tradition, if any, are identified as such.",
+60 -52
View File
@@ -11,6 +11,7 @@ import {
HairColorIdentifier,
RaceIdentifier,
} from "./_Identifier.js"
import { RequirableSelectOptionIdentifier } from "./_IdentifierGroup.js"
import { calculationContainsRaceBase, DerivedCharacteristic } from "./DerivedCharacteristic.ts"
import { ExperienceLevel } from "./ExperienceLevel.js"
import { NestedTranslationMap } from "./Locale.js"
@@ -30,38 +31,6 @@ export const Race = DB.Entity(import.meta.url, {
comment: "The races base values.",
type: DB.IncludeIdentifier(BaseValues),
}),
automatic_advantages: DB.Optional({
comment:
"A list of automatically applied advantages. This does only work for advantages with no further configuration such as level or special selection.",
type: DB.Array(
DB.GenIncludeIdentifier(AutomaticAdvantageDisadvantage, [AdvantageIdentifier()]),
{
minItems: 1,
},
),
}),
automatic_disadvantages: DB.Optional({
comment:
"A list of automatically applied disadvantages. This does only work for disadvantages with no further configuration such as level or special selection.",
type: DB.Array(
DB.GenIncludeIdentifier(AutomaticAdvantageDisadvantage, [DisadvantageIdentifier()]),
{ minItems: 1 },
),
}),
strongly_recommended_advantages: DB.Optional({
comment: "A list of strongly recommended advantages.",
type: DB.Array(
DB.GenIncludeIdentifier(CommonnessRatedAdvantageDisadvantage, [AdvantageIdentifier()]),
{ minItems: 1 },
),
}),
strongly_recommended_disadvantages: DB.Optional({
comment: "A list of strongly recommended disadvantages.",
type: DB.Array(
DB.GenIncludeIdentifier(CommonnessRatedAdvantageDisadvantage, [DisadvantageIdentifier()]),
{ minItems: 1 },
),
}),
hairColorCount: DB.Optional({
comment:
"How many different hair colors a race may have. By default, they have a single one that is for their whole body, but a race may have multiple if their hair color is different for different body parts. Additionally, if the hair color is labelled differently (e.g. scale color), there might be multiple colors for different body parts as well. This should only be set if the hair color count is higher than 1.",
@@ -106,26 +75,6 @@ export const Race = DB.Entity(import.meta.url, {
comment: "The races name.",
type: DB.String({ minLength: 1 }),
}),
attribute_adjustments: DB.Required({
comment: "The respective attribute adjustments text from the source book.",
type: DB.String({ minLength: 1 }),
}),
automatic_advantages: DB.Optional({
comment: "The respective automatic advantages text from the source book.",
type: DB.String({ minLength: 1 }),
}),
automatic_disadvantages: DB.Optional({
comment: "The respective automatic disadvantages text from the source book.",
type: DB.String({ minLength: 1 }),
}),
strongly_recommended_advantages: DB.Optional({
comment: "The respective strongly recommended advantages text from the source book.",
type: DB.String({ minLength: 1 }),
}),
strongly_recommended_disadvantages: DB.Optional({
comment: "The respective strongly recommended disadvantages text from the source book.",
type: DB.String({ minLength: 1 }),
}),
hairColorLabel: DB.Optional({
comment:
"The label for hair colors if it is not a hair color in that sense: Some races may have different labels for hair color such as scale color.",
@@ -247,6 +196,15 @@ const AutomaticAdvantageDisadvantage = DB.GenTypeAlias(import.meta.url, {
comment: "The automatic advantage or disadvantage.",
type: DB.TypeArgument(Identifier),
}),
level: DB.Optional({
comment: "The level of the entry.",
type: DB.Integer({ minimum: 1 }),
}),
options: DB.Optional({
comment:
"Required select options. Order is important. Typically, you only need the first array index, though.",
type: DB.Array(DB.IncludeIdentifier(RequirableSelectOptionIdentifier), { minItems: 1 }),
}),
}),
})
@@ -316,6 +274,36 @@ export const RaceVariant = DB.Entity(import.meta.url, {
comment: "The list of common cultures.",
type: DB.Array(CultureIdentifier(), { minItems: 1 }),
}),
automatic_advantages: DB.Optional({
comment: "A list of automatically applied advantages.",
type: DB.Array(
DB.GenIncludeIdentifier(AutomaticAdvantageDisadvantage, [AdvantageIdentifier()]),
{
minItems: 1,
},
),
}),
automatic_disadvantages: DB.Optional({
comment: "A list of automatically applied disadvantages.",
type: DB.Array(
DB.GenIncludeIdentifier(AutomaticAdvantageDisadvantage, [DisadvantageIdentifier()]),
{ minItems: 1 },
),
}),
strongly_recommended_advantages: DB.Optional({
comment: "A list of strongly recommended advantages.",
type: DB.Array(
DB.GenIncludeIdentifier(AutomaticAdvantageDisadvantage, [AdvantageIdentifier()]),
{ minItems: 1 },
),
}),
strongly_recommended_disadvantages: DB.Optional({
comment: "A list of strongly recommended disadvantages.",
type: DB.Array(
DB.GenIncludeIdentifier(AutomaticAdvantageDisadvantage, [DisadvantageIdentifier()]),
{ minItems: 1 },
),
}),
common_advantages: DB.Optional({
comment: "A list of common advantages.",
type: DB.Array(
@@ -367,6 +355,26 @@ export const RaceVariant = DB.Entity(import.meta.url, {
"The race variants name. If this is the only variant for a base race and thus just provides the missing information without actually being able to select, fill in the name of the base race.",
type: DB.String({ minLength: 1 }),
}),
attribute_adjustments: DB.Optional({
comment: "The respective attribute adjustments text from the source book.",
type: DB.String({ minLength: 1 }),
}),
automatic_advantages: DB.Optional({
comment: "The respective automatic advantages text from the source book.",
type: DB.String({ minLength: 1 }),
}),
automatic_disadvantages: DB.Optional({
comment: "The respective automatic disadvantages text from the source book.",
type: DB.String({ minLength: 1 }),
}),
strongly_recommended_advantages: DB.Optional({
comment: "The respective strongly recommended advantages text from the source book.",
type: DB.String({ minLength: 1 }),
}),
strongly_recommended_disadvantages: DB.Optional({
comment: "The respective strongly recommended disadvantages text from the source book.",
type: DB.String({ minLength: 1 }),
}),
common_advantages: DB.Optional({
comment: "The respective common advantages text from the source book.",
type: DB.String({ minLength: 1 }),
+2 -1
View File
@@ -8,7 +8,7 @@ import { ImprovementCost } from "./_ImprovementCost.js"
import { SkillCheck } from "./_SkillCheck.js"
import { NestedTranslationMap } from "./Locale.js"
import { Errata } from "./source/_Erratum.js"
import { src } from "./source/_PublicationRef.js"
import { optionalSrc, src } from "./source/_PublicationRef.js"
export const Skill = DB.Entity(import.meta.url, {
name: "Skill",
@@ -125,6 +125,7 @@ export const SkillApplication = DB.Entity(import.meta.url, {
comment: "The skill this application belongs to.",
type: SkillIdentifier(),
}),
src: optionalSrc,
translations: NestedTranslationMap(
DB.Required,
"SkillApplication",
+6
View File
@@ -15,6 +15,12 @@ export const name_in_library = DB.Optional({
type: DB.String({ minLength: 1 }),
})
export const additionalName = DB.Optional({
comment:
"A part of the name that is appended in parenthesis. This can be used to specify the group of people that typically uses this entry (e.g. the name of the witch circle for a magic style for witches).\n\nIf `name_in_library` is specified, this will be ignored for places where the `name_in_library` is used.",
type: DB.String({ minLength: 1 }),
})
export const levels = DB.Optional({
comment: "Number of available levels.",
type: DB.Integer({ minimum: 2 }),
+26 -1
View File
@@ -9,6 +9,7 @@ import {
CombatRelatedSpecialAbilityIdentifier,
CombatTechniqueIdentifier,
} from "./_IdentifierGroup.js"
import { NestedTranslationMap } from "./Locale.js"
const CombatSpecialAbilityUsageType = DB.Enum(import.meta.url, {
name: "CombatSpecialAbilityUsageType",
@@ -20,11 +21,25 @@ const CombatSpecialAbilityUsageType = DB.Enum(import.meta.url, {
}),
})
export const usage_type = DB.Required({
const CombatStyleUsageType = DB.Enum(import.meta.url, {
name: "CombatSpecialAbilityTypeUsageType",
comment: "The definition of how the combat special ability style can be used in combat.",
values: () => ({
Passive: DB.EnumCase({ type: null }),
Active: DB.EnumCase({ type: null }),
}),
})
export const special_ability_usage_type = DB.Required({
comment: "The definition of how the combat special ability can be used in combat.",
type: DB.IncludeIdentifier(CombatSpecialAbilityUsageType),
})
export const style_usage_type = DB.Required({
comment: "The definition of how the combat style can be used in combat.",
type: DB.IncludeIdentifier(CombatStyleUsageType),
})
const CombatSpecialAbilityType = DB.Enum(import.meta.url, {
name: "CombatSpecialAbilityType",
comment:
@@ -323,6 +338,16 @@ const SpecificApplicableCombatTechnique = DB.TypeAlias(import.meta.url, {
restriction: DB.Optional({
type: DB.IncludeIdentifier(ApplicableSpecificCombatTechniquesRestriction),
}),
translation: NestedTranslationMap(
DB.Optional,
"SpecificApplicableCombatTechnique",
DB.Object({
restriction: DB.Required({
comment: "The additional restriction of the combat technique.",
type: DB.String({ minLength: 1, markdown: "inline" }),
}),
}),
),
weapons: DB.Optional({
comment: "The specific weapons this combat special ability is only applicable to.",
type: DB.Array(WeaponIdentifier(), { minItems: 1 }),
+23
View File
@@ -31,3 +31,26 @@ const ActivatableNameLevelPlacement = DB.Enum(import.meta.url, {
AfterOptions: DB.EnumCase({ type: null }),
}),
})
export const activatableDisplayNameCustomizer = ({
instance,
instanceDisplayName,
instanceDisplayNameLocaleId,
locales,
}: {
instance: { translations: Record<string, { name: string; name_in_library?: string }> }
instanceDisplayName: string
instanceDisplayNameLocaleId: string | undefined
locales: string[]
}) => {
for (const locale of locales) {
const translation = instance.translations[locale]
if (translation) {
return {
name: translation.name_in_library ?? translation.name,
localeId: locale,
}
}
}
return { name: instanceDisplayName, localeId: instanceDisplayNameLocaleId }
}
+7
View File
@@ -4,6 +4,7 @@ import { DurationUnitValue } from "./_ActivatableSkillDuration.js"
import { AspectIdentifier, PropertyIdentifier } from "./_Identifier.js"
import { VolumePointsOptionReferenceIdentifier } from "./_IdentifierGroup.js"
import { ResponsiveText, ResponsiveTextOptional } from "./_ResponsiveText.js"
import { OneTimeCostMap } from "./_ActivatableSkillCost.js"
const EnchantmentCost = DB.Enum(import.meta.url, {
name: "EnchantmentCost",
@@ -13,6 +14,11 @@ const EnchantmentCost = DB.Enum(import.meta.url, {
}),
})
export const cost_note = DB.Optional({
comment: "A note, appended to the generated cost string in parenthesis.",
type: DB.IncludeIdentifier(ResponsiveTextOptional),
})
export const cost = DB.Optional({
comment: "The cost when casting the entry.",
type: DB.IncludeIdentifier(EnchantmentCost),
@@ -32,6 +38,7 @@ export const ArcaneEnergyCost = DB.Enum(import.meta.url, {
Disjunction: DB.EnumCase({ type: DB.IncludeIdentifier(ArcaneEnergyCostDisjunction) }),
Variable: DB.EnumCase({ type: null }),
ByLevel: DB.EnumCase({ type: DB.IncludeIdentifier(ArcaneEnergyCostByLevel) }),
Map: DB.EnumCase({ type: DB.IncludeIdentifier(OneTimeCostMap) }),
}),
})
+21 -2
View File
@@ -11,6 +11,7 @@ import {
SkillIdentifier,
SpellIdentifier,
TargetCategoryIdentifier,
PropertyIdentifier,
} from "./_Identifier.js"
import {
ActivatableIdentifier,
@@ -211,16 +212,34 @@ const SkillsSelectOptionCategory = DB.TypeAlias(import.meta.url, {
}),
})
const SpellFilter = DB.Enum(import.meta.url, {
name: "SpellFilter",
values: () => ({
Single: DB.EnumCase({ type: SpellIdentifier() }),
Property: DB.EnumCase({ type: PropertyIdentifier() }),
}),
})
const RitualFilter = DB.Enum(import.meta.url, {
name: "RitualFilter",
values: () => ({
Single: DB.EnumCase({ type: RitualIdentifier() }),
Property: DB.EnumCase({ type: PropertyIdentifier() }),
}),
})
const SkillsSelectOptionCategoryCategory = DB.Enum(import.meta.url, {
name: "SkillsSelectOptionCategoryCategory",
values: () => ({
Skills: DB.EnumCase({ type: DB.IncludeIdentifier(SkillSelectOptionCategoryCategory) }),
Spells: DB.EnumCase({
type: DB.GenIncludeIdentifier(GenericSkillsSelectOptionCategoryCategory, [SpellIdentifier()]),
type: DB.GenIncludeIdentifier(GenericSkillsSelectOptionCategoryCategory, [
DB.IncludeIdentifierType(SpellFilter),
]),
}),
Rituals: DB.EnumCase({
type: DB.GenIncludeIdentifier(GenericSkillsSelectOptionCategoryCategory, [
RitualIdentifier(),
DB.IncludeIdentifierType(RitualFilter),
]),
}),
LiturgicalChants: DB.EnumCase({
+19
View File
@@ -7,6 +7,7 @@ import { FastCastingTime, SlowCastingTime } from "./_ActivatableSkillCastingTime
import { OneTimeCost, SustainedCost } from "./_ActivatableSkillCost.js"
import { DurationForOneTime, DurationForSustained } from "./_ActivatableSkillDuration.js"
import { Range } from "./_ActivatableSkillRange.js"
import { MathOperation } from "./_MathExpression.ts"
export const OneTimePerformanceParameters = DB.GenTypeAlias(import.meta.url, {
name: "OneTimePerformanceParameters",
@@ -104,3 +105,21 @@ export const OldParameter = DB.TypeAlias(import.meta.url, {
}),
}),
})
export const ExpressionBasedParameterValue = DB.TypeAlias(import.meta.url, {
name: "ExpressionBasedParameterValue",
type: () =>
DB.GenIncludeIdentifier(MathOperation, [
DB.IncludeIdentifier(ExpressionBasedParameterExpressionValue),
]),
})
const ExpressionBasedParameterExpressionValue = DB.Enum(import.meta.url, {
name: "ExpressionBasedParameterExpressionValue",
values: () => ({
Constant: DB.EnumCase({ type: DB.Integer({ minimum: 1 }) }),
QualityLevels: DB.EnumCase({ type: null }),
SkillPoints: DB.EnumCase({ type: null }),
SkillRating: DB.EnumCase({ type: null }),
}),
})
@@ -1,15 +1,5 @@
import * as DB from "tsondb/schema/dsl"
export const CheckResultValue = DB.Enum(import.meta.url, {
name: "CheckResultValue",
comment: "Defines the derived (unitless) value.",
values: () => ({
QualityLevels: DB.EnumCase({ type: null }),
SkillPoints: DB.EnumCase({ type: null }),
SkillRating: DB.EnumCase({ type: null }),
}),
})
const CheckResultArithmetic = DB.Enum(import.meta.url, {
name: "CheckResultArithmetic",
comment: "Defines how the the `value` is set off against the check result.",
@@ -33,19 +23,3 @@ export const CheckResultBasedModifier = DB.TypeAlias(import.meta.url, {
}),
}),
})
export const CheckResultBased = DB.TypeAlias(import.meta.url, {
name: "CheckResultBased",
comment: "Defines a parameter being based on a check result.",
type: () =>
DB.Object({
base: DB.Required({
comment: "The base value that is derived from the check result.",
type: DB.IncludeIdentifier(CheckResultValue),
}),
modifier: DB.Optional({
comment: "If defined, it modifies the base value.",
type: DB.IncludeIdentifier(CheckResultBasedModifier),
}),
}),
})
+4
View File
@@ -304,6 +304,10 @@ The \`an item the size of a\` would be the *list prefix* string, while the list
minItems: 2,
}),
}),
interval: DB.Required({
comment: "The sustain interval.",
type: DB.IncludeIdentifier(DurationUnitValue),
}),
translations: NestedTranslationMap(
DB.Optional,
"SustainedCostMap",
+9 -13
View File
@@ -1,5 +1,5 @@
import * as DB from "tsondb/schema/dsl"
import { CheckResultBasedModifier, CheckResultValue } from "./_ActivatableSkillCheckResultBased.js"
import { ExpressionBasedParameterValue } from "./_ActivatableSkill.ts"
import { ResponsiveText, ResponsiveTextReplace } from "./_ResponsiveText.js"
import { NestedTranslationMap } from "./Locale.js"
@@ -8,8 +8,7 @@ export const DurationForOneTime = DB.Enum(import.meta.url, {
values: () => ({
Immediate: DB.EnumCase({ type: DB.IncludeIdentifier(Immediate) }),
Permanent: DB.EnumCase({ type: DB.IncludeIdentifier(PermanentDuration) }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(FixedDuration) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
Indefinite: DB.EnumCase({ type: DB.IncludeIdentifier(IndefiniteDuration) }),
}),
})
@@ -84,21 +83,17 @@ export const FixedDuration = DB.TypeAlias(import.meta.url, {
}),
})
export const CheckResultBasedDuration = DB.TypeAlias(import.meta.url, {
name: "CheckResultBasedDuration",
export const ExpressionBasedDuration = DB.TypeAlias(import.meta.url, {
name: "ExpressionBasedDuration",
type: () =>
DB.Object({
is_maximum: DB.Optional({
comment: "If the duration is the maximum duration, so it may end earlier.",
type: DB.Boolean(),
}),
base: DB.Required({
comment: "The base value that is derived from the check result.",
type: DB.IncludeIdentifier(CheckResultValue),
}),
modifier: DB.Optional({
comment: "If defined, it modifies the base value.",
type: DB.IncludeIdentifier(CheckResultBasedModifier),
value: DB.Required({
comment: "An expression that evaluates to the duration.",
type: DB.IncludeIdentifier(ExpressionBasedParameterValue),
}),
unit: DB.Required({
comment: "The duration unit.",
@@ -106,7 +101,7 @@ export const CheckResultBasedDuration = DB.TypeAlias(import.meta.url, {
}),
translations: NestedTranslationMap(
DB.Optional,
"CheckResultBasedDuration",
"ExpressionBasedDuration",
DB.Object({
replacement: DB.Optional({
comment: "A replacement string.",
@@ -155,6 +150,7 @@ export const DurationUnit = DB.Enum(import.meta.url, {
Weeks: DB.EnumCase({ type: null }),
Months: DB.EnumCase({ type: null }),
Years: DB.EnumCase({ type: null }),
Decades: DB.EnumCase({ type: null }),
Centuries: DB.EnumCase({ type: null }),
Actions: DB.EnumCase({ type: null }),
CombatRounds: DB.EnumCase({ type: null }),
+7 -12
View File
@@ -1,5 +1,5 @@
import * as DB from "tsondb/schema/dsl"
import { CheckResultBasedModifier, CheckResultValue } from "./_ActivatableSkillCheckResultBased.js"
import { ExpressionBasedParameterValue } from "./_ActivatableSkill.ts"
import { SkillModificationLevelIdentifier } from "./_Identifier.js"
import { ResponsiveTextOptional, ResponsiveTextReplace } from "./_ResponsiveText.js"
import { NestedTranslationMap } from "./Locale.js"
@@ -42,8 +42,7 @@ const RangeValue = DB.Enum(import.meta.url, {
Self: DB.EnumCase({ type: null }),
Global: DB.EnumCase({ comment: "German: *dereumfassend*", type: null }),
Touch: DB.EnumCase({ type: null }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(FixedRange) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedRange) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedRange) }),
}),
})
@@ -89,21 +88,17 @@ export const FixedRange = DB.TypeAlias(import.meta.url, {
}),
})
const CheckResultBasedRange = DB.TypeAlias(import.meta.url, {
name: "CheckResultBasedRange",
export const ExpressionBasedRange = DB.TypeAlias(import.meta.url, {
name: "ExpressionBasedRange",
type: () =>
DB.Object({
is_maximum: DB.Optional({
comment: "If the range is the maximum range.",
type: DB.Boolean(),
}),
base: DB.Required({
comment: "The base value that is derived from the check result.",
type: DB.IncludeIdentifier(CheckResultValue),
}),
modifier: DB.Optional({
comment: "If defined, it modifies the base value.",
type: DB.IncludeIdentifier(CheckResultBasedModifier),
value: DB.Required({
comment: "An expression that evaluates to the range.",
type: DB.IncludeIdentifier(ExpressionBasedParameterValue),
}),
unit: DB.Required({
comment: "The duration unit.",
+5
View File
@@ -1,4 +1,5 @@
import * as DB from "tsondb/schema/dsl"
import { LanguageIdentifier } from "./_Identifier.js"
export const AlternativeName = DB.TypeAlias(import.meta.url, {
name: "AlternativeName",
@@ -12,5 +13,9 @@ export const AlternativeName = DB.TypeAlias(import.meta.url, {
comment: "The region where this alternative name is used.",
type: DB.String({ minLength: 1 }),
}),
language: DB.Optional({
comment: "The language of that alternative name if any.",
type: LanguageIdentifier(),
}),
}),
})
@@ -1,5 +1,6 @@
import * as DB from "tsondb/schema/dsl"
import { NestedTranslationMap } from "./Locale.js"
import { RequirableSelectOptionIdentifier } from "./_IdentifierGroup.ts"
export const CommonnessRatedAdvantageDisadvantage = DB.GenTypeAlias(import.meta.url, {
name: "CommonnessRatedAdvantageDisadvantage",
@@ -9,18 +10,54 @@ export const CommonnessRatedAdvantageDisadvantage = DB.GenTypeAlias(import.meta.
type: Identifier =>
DB.Object({
id: DB.Required({
comment: "The advantage's or disadvantage's identifier.",
comment: "The advantages or disadvantages identifier.",
type: DB.TypeArgument(Identifier),
}),
level: DB.Optional({
comment: "The level of a commonness-rated advantage or disadvantage.",
type: DB.IncludeIdentifier(CommonnessRatedAdvantageDisadvantageLevel),
}),
options: DB.Optional({
comment: "The options the commonness rating applies to.",
type: DB.Array(DB.IncludeIdentifier(RequirableSelectOptionIdentifier), { minItems: 1 }),
}),
translations: NestedTranslationMap(
DB.Optional,
"CommonnessRatedAdvantageDisadvantage",
DB.Object({
options: DB.Required({
comment: "The options the commonness rating applies to.",
type: DB.String({ minLength: 1 }),
}),
}),
DB.Object(
{
options: DB.Optional({
comment:
"The options the commonness rating applies to. This can be specified if plain options cannot exactly describe the options as written in the publication.",
type: DB.String({ minLength: 1 }),
}),
note: DB.Optional({
comment:
"A note, appended to the generated string in parenthesis. If options are specified as well, both will be in a single set of parentheses, with the note after the options.",
type: DB.String({ minLength: 1 }),
}),
full: DB.Optional({
comment:
"A text that replaces the entire entry. No other text is generated for display, however, providing levels or a selection of options will still be relevant for highlighting entries in the application. This should only be used if the text cannot be generated from other fields at all.",
type: DB.String({ minLength: 1 }),
}),
},
{ minProperties: 1 },
),
),
}),
})
const CommonnessRatedAdvantageDisadvantageLevel = DB.Enum(import.meta.url, {
name: "CommonnessRatedAdvantageDisadvantageLevel",
comment: "The level of a commonness-rated advantage or disadvantage.",
values: () => ({
Constant: DB.EnumCase({ type: DB.Integer({ minimum: 1 }) }),
Range: DB.EnumCase({
type: DB.Object({
min: DB.Required({ type: DB.Integer({ minimum: 1 }) }),
max: DB.Required({ type: DB.Integer({ minimum: 1 }) }),
}),
}),
}),
})
+38 -6
View File
@@ -3,6 +3,7 @@
*/
import * as DB from "tsondb/schema/dsl"
import { input } from "./_Activatable.ts"
import { SkillWithEnhancementsIdentifier } from "./_IdentifierGroup.js"
import { EnhancementPrerequisites } from "./_Prerequisite.js"
import { NestedTranslationMap } from "./Locale.js"
@@ -32,12 +33,9 @@ export const Enhancement = DB.Entity(import.meta.url, {
multipleOf: 2,
}),
}),
adventure_points_modifier: DB.Required({
comment:
"The value to multiply with the numeric representation of the associated skill's improvement cost to form the final AP cost of this enhancement.",
type: DB.Integer({
minimum: 1,
}),
adventurePoints: DB.Required({
comment: "Defines how to determine the AP cost of an enhancement.",
type: DB.IncludeIdentifier(EnhancementAdventurePoints),
}),
prerequisites: DB.Optional({
type: DB.IncludeIdentifier(EnhancementPrerequisites),
@@ -63,6 +61,7 @@ export const Enhancement = DB.Entity(import.meta.url, {
markdown: "block",
}),
}),
input,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
@@ -92,3 +91,36 @@ export const Enhancement = DB.Entity(import.meta.url, {
],
],
})
const EnhancementAdventurePoints = DB.Enum(import.meta.url, {
name: "EnhancementAdventurePoints",
comment: "Defines how to determine the AP cost of an enhancement.",
values: () => ({
DerivedFromImprovementCost: DB.EnumCase({
comment:
"Use the numeric representation of the associated skill's improvement cost as the AP cost of this enhancement.",
type: DB.IncludeIdentifier(DerivedEnhancementAdventurePoints),
}),
Constant: DB.EnumCase({
comment: "Use the specified constant value as the AP cost of this enhancement.",
type: DB.Integer({
minimum: 1,
}),
}),
}),
})
const DerivedEnhancementAdventurePoints = DB.TypeAlias(import.meta.url, {
name: "DerivedEnhancementAdventurePoints",
type: () =>
DB.Object({
multiplier: DB.Required({
comment:
"The value to multiply with the numeric representation of the associated skill's improvement cost to form the final AP cost of this enhancement.",
type: DB.Integer({
minimum: 1,
maximum: 3,
}),
}),
}),
})
+21 -3
View File
@@ -15,7 +15,7 @@ import { CloseCombatTechnique, RangedCombatTechnique } from "./CombatTechnique.j
import { Condition } from "./Condition.js"
import { Continent } from "./Continent.js"
import { Culture } from "./Culture.js"
import { DerivedCharacteristic } from "./DerivedCharacteristic.ts"
import { DerivedCharacteristic } from "./DerivedCharacteristic.js"
import { Disadvantage } from "./Disadvantage.js"
import { Disease } from "./Disease.js"
import { Element } from "./Element.js"
@@ -32,6 +32,8 @@ import { Container } from "./equipment/item/Container.js"
import { Elixir } from "./equipment/item/Elixir.js"
import { EquipmentOfBlessedOnes } from "./equipment/item/EquipmentOfBlessedOnes.js"
import { GemOrPreciousStone } from "./equipment/item/GemOrPreciousStone.js"
import { HerbalAid } from "./equipment/item/HerbalAid.js"
import { HerbalPreservation } from "./equipment/item/HerbalPreservation.js"
import { IlluminationLightSource } from "./equipment/item/IlluminationLightSource.js"
import { IlluminationRefillOrSupply } from "./equipment/item/IlluminationRefillOrSupply.js"
import { Jewelry } from "./equipment/item/Jewelry.js"
@@ -42,22 +44,26 @@ import { MagicalArtifact } from "./equipment/item/MagicalArtifact.js"
import { MusicalInstrument } from "./equipment/item/MusicalInstrument.js"
import { Newspaper } from "./equipment/item/Newspaper.js"
import { OrienteeringAid } from "./equipment/item/OrienteeringAid.js"
import { Plant } from "./equipment/item/Plant.js"
import { Poison } from "./equipment/item/Poison.js"
import { RopeOrChain } from "./equipment/item/RopeOrChain.js"
import { Stationery } from "./equipment/item/Stationery.js"
import { ArmorType } from "./equipment/item/sub/ArmorType.js"
import { Biome } from "./equipment/item/sub/Biome.js"
import { SubBiome } from "./equipment/item/sub/SubBiome.js"
import { Reach } from "./equipment/item/sub/Reach.js"
import { BotanicRegion } from "./equipment/item/sub/BotanicRegion.js"
import { ThievesTool } from "./equipment/item/ThievesTool.js"
import { ToolOfTheTrade } from "./equipment/item/ToolOfTheTrade.js"
import { TravelGearOrTool } from "./equipment/item/TravelGearOrTool.js"
import { Vehicle } from "./equipment/item/Vehicle.js"
import { Weapon } from "./equipment/item/Weapon.js"
import { WeaponAccessory } from "./equipment/item/WeaponAccessory.js"
import { WorkingSupernaturalCreature } from "./equipment/item/WorkingSupernaturalCreature.ts"
import { WorkingSupernaturalCreature } from "./equipment/item/WorkingSupernaturalCreature.js"
import { ExperienceLevel } from "./ExperienceLevel.js"
import { EyeColor } from "./EyeColor.js"
import { HairColor } from "./HairColor.js"
import { Influence } from "./Influence.ts"
import { Influence } from "./Influence.js"
import { Curriculum, Guideline, LessonPackage } from "./Lessons.js"
import { LiturgicalChant } from "./LiturgicalChant.js"
import { AnimistPower } from "./magicalActions/AnimistPower.js"
@@ -142,12 +148,15 @@ import { CauldronEnchantment } from "./traditionArtifacts/CauldronEnchantment.js
import { ChronicleEnchantment } from "./traditionArtifacts/ChronicleEnchantment.js"
import { DaggerRitual } from "./traditionArtifacts/DaggerRitual.js"
import { FoolsHatEnchantment } from "./traditionArtifacts/FoolsHatEnchantment.js"
import { Hauerkettenzauber } from "./traditionArtifacts/Hauerkettenzauber.js"
import { Haubenzauber } from "./traditionArtifacts/Haubenzauber.js"
import { InstrumentEnchantment } from "./traditionArtifacts/InstrumentEnchantment.js"
import { Keulenzauber } from "./traditionArtifacts/Keulenzauber.js"
import { Krallenkettenzauber } from "./traditionArtifacts/Krallenkettenzauber.js"
import { Kristallkugelzauber } from "./traditionArtifacts/Kristallkugelzauber.js"
import { OrbEnchantment } from "./traditionArtifacts/OrbEnchantment.js"
import { RingEnchantment } from "./traditionArtifacts/RingEnchantment.js"
import { Schweinetrommelzauber } from "./traditionArtifacts/Schweinetrommelzauber.js"
import { SickleRitual } from "./traditionArtifacts/SickleRitual.js"
import { SpellSwordEnchantment } from "./traditionArtifacts/SpellSwordEnchantment.js"
import { StaffEnchantment } from "./traditionArtifacts/StaffEnchantment.js"
@@ -187,6 +196,7 @@ export const AttributeIdentifier: () => R = () => R(Attribute)
export const BandageOrRemedyIdentifier: () => R = () => R(BandageOrRemedy)
export const BannzeichenIdentifier: () => R = () => R(Bannzeichen)
export const BeutelzauberIdentifier: () => R = () => R(Beutelzauber)
export const BiomeIdentifier: () => R = () => R(Biome)
export const BlessedTraditionIdentifier: () => R = () => R(BlessedTradition)
export const BlessingIdentifier: () => R = () => R(Blessing)
export const BookIdentifier: () => R = () => R(Book)
@@ -238,6 +248,9 @@ export const GoblinRitualIdentifier: () => R = () => R(GoblinRitual)
export const GuidelineIdentifier: () => R = () => R(Guideline)
export const HairColorIdentifier: () => R = () => R(HairColor)
export const HaubenzauberIdentifier: () => R = () => R(Haubenzauber)
export const HauerkettenZauberIdentifier: () => R = () => R(Hauerkettenzauber)
export const HerbalAidIdentifier: () => R = () => R(HerbalAid)
export const HerbalPreservationIdentifier: () => R = () => R(HerbalPreservation)
export const IlluminationLightSourceIdentifier: () => R = () => R(IlluminationLightSource)
export const IlluminationRefillOrSupplyIdentifier: () => R = () => R(IlluminationRefillOrSupply)
export const InfluenceIdentifier: () => R = () => R(Influence)
@@ -245,6 +258,7 @@ export const InstrumentEnchantmentIdentifier: () => R = () => R(InstrumentEnchan
export const JesterTrickIdentifier: () => R = () => R(JesterTrick)
export const JewelryIdentifier: () => R = () => R(Jewelry)
export const KarmaSpecialAbilityIdentifier: () => R = () => R(KarmaSpecialAbility)
export const KeulenzauberIdentifier: () => R = () => R(Keulenzauber)
export const KrallenkettenzauberIdentifier: () => R = () => R(Krallenkettenzauber)
export const KristallkugelzauberIdentifier: () => R = () => R(Kristallkugelzauber)
export const LaboratoryIdentifier: () => R = () => R(Laboratory)
@@ -278,6 +292,7 @@ export const PactTypeIdentifier: () => R = () => R(PactType)
export const PatronCategoryIdentifier: () => R = () => R(PatronCategory)
export const PatronIdentifier: () => R = () => R(Patron)
export const PersonalityTraitIdentifier: () => R = () => R(PersonalityTrait)
export const PlantIdentifier: () => R = () => R(Plant)
export const PlayerTypeIdentifier: () => R = () => R(PlayerType)
export const PoisonIdentifier: () => R = () => R(Poison)
export const ProfessionIdentifier: () => R = () => R(Profession)
@@ -291,9 +306,11 @@ export const RaceIdentifier: () => R = () => R(Race)
export const RaceVariantIdentifier: () => R = () => R(RaceVariant)
export const RangedCombatTechniqueIdentifier: () => R = () => R(RangedCombatTechnique)
export const ReachIdentifier: () => R = () => R(Reach)
export const BotanicRegionIdentifier: () => R = () => R(BotanicRegion)
export const RingEnchantmentIdentifier: () => R = () => R(RingEnchantment)
export const RitualIdentifier: () => R = () => R(Ritual)
export const RopeOrChainIdentifier: () => R = () => R(RopeOrChain)
export const SchweinetrommelzauberIdentifier: () => R = () => R(Schweinetrommelzauber)
export const ScriptIdentifier: () => R = () => R(Script)
export const SermonIdentifier: () => R = () => R(Sermon)
export const SexPracticeIdentifier: () => R = () => R(SexPractice)
@@ -313,6 +330,7 @@ export const SpellSwordEnchantmentIdentifier: () => R = () => R(SpellSwordEnchan
export const StaffEnchantmentIdentifier: () => R = () => R(StaffEnchantment)
export const StateIdentifier: () => R = () => R(State)
export const StationeryIdentifier: () => R = () => R(Stationery)
export const SubBiomeIdentifier: () => R = () => R(SubBiome)
export const SubjectIdentifier: () => R = () => R(Subject)
export const TargetCategoryIdentifier: () => R = () => R(TargetCategory)
export const ThievesToolIdentifier: () => R = () => R(ThievesTool)
+56 -35
View File
@@ -1,3 +1,4 @@
import { sortObjectKeys } from "@elyukai/utils/object"
import * as DB from "tsondb/schema/dsl"
import {
AdvancedCombatSpecialAbilityIdentifier,
@@ -62,12 +63,14 @@ import {
GeodeRitualIdentifier,
GoblinRitualIdentifier,
HaubenzauberIdentifier,
HauerkettenZauberIdentifier,
IlluminationLightSourceIdentifier,
IlluminationRefillOrSupplyIdentifier,
InstrumentEnchantmentIdentifier,
JesterTrickIdentifier,
JewelryIdentifier,
KarmaSpecialAbilityIdentifier,
KeulenzauberIdentifier,
KrallenkettenzauberIdentifier,
KristallkugelzauberIdentifier,
LaboratoryIdentifier,
@@ -100,6 +103,7 @@ import {
RingEnchantmentIdentifier,
RitualIdentifier,
RopeOrChainIdentifier,
SchweinetrommelzauberIdentifier,
ScriptIdentifier,
SermonIdentifier,
SexPracticeIdentifier,
@@ -164,65 +168,80 @@ export const NewSkillApplicationOrUseParentIdentifier = DB.Enum(import.meta.url,
}),
})
export const SpecialAbilityIdentifier = DB.Enum(import.meta.url, {
name: "SpecialAbilityIdentifier",
export const TraditionArtifactEnchantmentIdentifier = DB.Enum(import.meta.url, {
name: "TraditionArtifactEnchantmentIdentifier",
values: () => ({
AdvancedCombatSpecialAbility: DB.EnumCase({ type: AdvancedCombatSpecialAbilityIdentifier() }),
AdvancedKarmaSpecialAbility: DB.EnumCase({ type: AdvancedKarmaSpecialAbilityIdentifier() }),
AdvancedMagicalSpecialAbility: DB.EnumCase({ type: AdvancedMagicalSpecialAbilityIdentifier() }),
AdvancedSkillSpecialAbility: DB.EnumCase({ type: AdvancedSkillSpecialAbilityIdentifier() }),
AncestorGlyph: DB.EnumCase({ type: AncestorGlyphIdentifier() }),
ArcaneOrbEnchantment: DB.EnumCase({ type: ArcaneOrbEnchantmentIdentifier() }),
AttireEnchantment: DB.EnumCase({ type: AttireEnchantmentIdentifier() }),
Beutelzauber: DB.EnumCase({ type: BeutelzauberIdentifier() }),
BlessedTradition: DB.EnumCase({ type: BlessedTraditionIdentifier() }),
BowlEnchantment: DB.EnumCase({ type: BowlEnchantmentIdentifier() }),
BrawlingSpecialAbility: DB.EnumCase({ type: BrawlingSpecialAbilityIdentifier() }),
CauldronEnchantment: DB.EnumCase({ type: CauldronEnchantmentIdentifier() }),
CeremonialItemSpecialAbility: DB.EnumCase({ type: CeremonialItemSpecialAbilityIdentifier() }),
ChronicleEnchantment: DB.EnumCase({ type: ChronicleEnchantmentIdentifier() }),
CombatSpecialAbility: DB.EnumCase({ type: CombatSpecialAbilityIdentifier() }),
CombatStyleSpecialAbility: DB.EnumCase({ type: CombatStyleSpecialAbilityIdentifier() }),
CommandSpecialAbility: DB.EnumCase({ type: CommandSpecialAbilityIdentifier() }),
DaggerRitual: DB.EnumCase({ type: DaggerRitualIdentifier() }),
FamiliarSpecialAbility: DB.EnumCase({ type: FamiliarSpecialAbilityIdentifier() }),
FatePointSexSpecialAbility: DB.EnumCase({ type: FatePointSexSpecialAbilityIdentifier() }),
FatePointSpecialAbility: DB.EnumCase({ type: FatePointSpecialAbilityIdentifier() }),
FoolsHatEnchantment: DB.EnumCase({ type: FoolsHatEnchantmentIdentifier() }),
GeneralSpecialAbility: DB.EnumCase({ type: GeneralSpecialAbilityIdentifier() }),
Haubenzauber: DB.EnumCase({ type: HaubenzauberIdentifier() }),
Hauerkettenzauber: DB.EnumCase({ type: HauerkettenZauberIdentifier() }),
InstrumentEnchantment: DB.EnumCase({ type: InstrumentEnchantmentIdentifier() }),
KarmaSpecialAbility: DB.EnumCase({ type: KarmaSpecialAbilityIdentifier() }),
Keulenzauber: DB.EnumCase({ type: KeulenzauberIdentifier() }),
Krallenkettenzauber: DB.EnumCase({ type: KrallenkettenzauberIdentifier() }),
Kristallkugelzauber: DB.EnumCase({ type: KristallkugelzauberIdentifier() }),
LiturgicalStyleSpecialAbility: DB.EnumCase({ type: LiturgicalStyleSpecialAbilityIdentifier() }),
LycantropicGift: DB.EnumCase({ type: LycantropicGiftIdentifier() }),
MagicalSign: DB.EnumCase({ type: MagicalSignIdentifier() }),
MagicalSpecialAbility: DB.EnumCase({ type: MagicalSpecialAbilityIdentifier() }),
MagicalTradition: DB.EnumCase({ type: MagicalTraditionIdentifier() }),
MagicStyleSpecialAbility: DB.EnumCase({ type: MagicStyleSpecialAbilityIdentifier() }),
OrbEnchantment: DB.EnumCase({ type: OrbEnchantmentIdentifier() }),
PactGift: DB.EnumCase({ type: PactGiftIdentifier() }),
ProtectiveWardingCircleSpecialAbility: DB.EnumCase({
type: ProtectiveWardingCircleSpecialAbilityIdentifier(),
}),
RingEnchantment: DB.EnumCase({ type: RingEnchantmentIdentifier() }),
Sermon: DB.EnumCase({ type: SermonIdentifier() }),
SexSpecialAbility: DB.EnumCase({ type: SexSpecialAbilityIdentifier() }),
Schweinetrommelzauber: DB.EnumCase({ type: SchweinetrommelzauberIdentifier() }),
SickleRitual: DB.EnumCase({ type: SickleRitualIdentifier() }),
SikaryanDrainSpecialAbility: DB.EnumCase({ type: SikaryanDrainSpecialAbilityIdentifier() }),
SkillStyleSpecialAbility: DB.EnumCase({ type: SkillStyleSpecialAbilityIdentifier() }),
SpellSwordEnchantment: DB.EnumCase({ type: SpellSwordEnchantmentIdentifier() }),
StaffEnchantment: DB.EnumCase({ type: StaffEnchantmentIdentifier() }),
ToyEnchantment: DB.EnumCase({ type: ToyEnchantmentIdentifier() }),
Trinkhornzauber: DB.EnumCase({ type: TrinkhornzauberIdentifier() }),
VampiricGift: DB.EnumCase({ type: VampiricGiftIdentifier() }),
Vision: DB.EnumCase({ type: VisionIdentifier() }),
WandEnchantment: DB.EnumCase({ type: WandEnchantmentIdentifier() }),
WeaponEnchantment: DB.EnumCase({ type: WeaponEnchantmentIdentifier() }),
}),
})
export const SpecialAbilityIdentifier = DB.Enum(import.meta.url, {
name: "SpecialAbilityIdentifier",
values: () =>
sortObjectKeys({
AdvancedCombatSpecialAbility: DB.EnumCase({ type: AdvancedCombatSpecialAbilityIdentifier() }),
AdvancedKarmaSpecialAbility: DB.EnumCase({ type: AdvancedKarmaSpecialAbilityIdentifier() }),
AdvancedMagicalSpecialAbility: DB.EnumCase({
type: AdvancedMagicalSpecialAbilityIdentifier(),
}),
AdvancedSkillSpecialAbility: DB.EnumCase({ type: AdvancedSkillSpecialAbilityIdentifier() }),
AncestorGlyph: DB.EnumCase({ type: AncestorGlyphIdentifier() }),
BlessedTradition: DB.EnumCase({ type: BlessedTraditionIdentifier() }),
BrawlingSpecialAbility: DB.EnumCase({ type: BrawlingSpecialAbilityIdentifier() }),
CeremonialItemSpecialAbility: DB.EnumCase({ type: CeremonialItemSpecialAbilityIdentifier() }),
ChronicleEnchantment: DB.EnumCase({ type: ChronicleEnchantmentIdentifier() }),
CombatSpecialAbility: DB.EnumCase({ type: CombatSpecialAbilityIdentifier() }),
CombatStyleSpecialAbility: DB.EnumCase({ type: CombatStyleSpecialAbilityIdentifier() }),
CommandSpecialAbility: DB.EnumCase({ type: CommandSpecialAbilityIdentifier() }),
FamiliarSpecialAbility: DB.EnumCase({ type: FamiliarSpecialAbilityIdentifier() }),
FatePointSexSpecialAbility: DB.EnumCase({ type: FatePointSexSpecialAbilityIdentifier() }),
FatePointSpecialAbility: DB.EnumCase({ type: FatePointSpecialAbilityIdentifier() }),
GeneralSpecialAbility: DB.EnumCase({ type: GeneralSpecialAbilityIdentifier() }),
KarmaSpecialAbility: DB.EnumCase({ type: KarmaSpecialAbilityIdentifier() }),
LiturgicalStyleSpecialAbility: DB.EnumCase({
type: LiturgicalStyleSpecialAbilityIdentifier(),
}),
LycantropicGift: DB.EnumCase({ type: LycantropicGiftIdentifier() }),
MagicalSign: DB.EnumCase({ type: MagicalSignIdentifier() }),
MagicalSpecialAbility: DB.EnumCase({ type: MagicalSpecialAbilityIdentifier() }),
MagicalTradition: DB.EnumCase({ type: MagicalTraditionIdentifier() }),
MagicStyleSpecialAbility: DB.EnumCase({ type: MagicStyleSpecialAbilityIdentifier() }),
PactGift: DB.EnumCase({ type: PactGiftIdentifier() }),
ProtectiveWardingCircleSpecialAbility: DB.EnumCase({
type: ProtectiveWardingCircleSpecialAbilityIdentifier(),
}),
Sermon: DB.EnumCase({ type: SermonIdentifier() }),
SexSpecialAbility: DB.EnumCase({ type: SexSpecialAbilityIdentifier() }),
SikaryanDrainSpecialAbility: DB.EnumCase({ type: SikaryanDrainSpecialAbilityIdentifier() }),
SkillStyleSpecialAbility: DB.EnumCase({ type: SkillStyleSpecialAbilityIdentifier() }),
VampiricGift: DB.EnumCase({ type: VampiricGiftIdentifier() }),
Vision: DB.EnumCase({ type: VisionIdentifier() }),
...TraditionArtifactEnchantmentIdentifier.type.value.values,
}),
})
export const CombatRelatedSpecialAbilityIdentifier = DB.Enum(import.meta.url, {
name: "CombatRelatedSpecialAbilityIdentifier",
values: () => ({
@@ -407,6 +426,8 @@ export const RequirableSelectOptionIdentifier = DB.Enum(import.meta.url, {
RangedCombatTechnique: DB.EnumCase({ type: RangedCombatTechniqueIdentifier() }),
Property: DB.EnumCase({ type: PropertyIdentifier() }),
Aspect: DB.EnumCase({ type: AspectIdentifier() }),
Disease: DB.EnumCase({ type: DiseaseIdentifier() }),
Poison: DB.EnumCase({ type: PoisonIdentifier() }),
Language: DB.EnumCase({ type: LanguageIdentifier() }),
AnimalShape: DB.EnumCase({ type: AnimalShapeIdentifier() }),
LiturgicalChant: DB.EnumCase({ type: LiturgicalChantIdentifier() }),
+18
View File
@@ -1,3 +1,21 @@
/**
* Originally, this type was created to represent the text of a spell, which can
* be displayed in full on the spell card, but also in a compressed version on
* the character sheet. However, it can be used for any text that has a similar
* requirement.
*
* The `ResponsiveTextReplace` type is a special case where the full and
* compressed versions are not standalone texts, but rather templates that
* include a placeholder (`$1`) for a generated string. The generated string is
* expected to adapt to different size contexts as well.
*
* The `ResponsiveTextOptional` type allows for the possibility that a
* compressed version may not be provided. In such cases, the full text should
* be used in all contexts, and the absence of a compressed version indicates
* that no special formatting is needed for smaller areas.
* @module
*/
import * as DB from "tsondb/schema/dsl"
export const ResponsiveText = DB.TypeAlias(import.meta.url, {
+16 -1
View File
@@ -3,7 +3,14 @@ import { ArmorIdentifier, ArmorTypeIdentifier } from "../../_Identifier.js"
import { NestedTranslationMap } from "../../Locale.js"
import { Errata } from "../../source/_Erratum.js"
import { src } from "../../source/_PublicationRef.js"
import { ComplexComplexity, Cost, RestrictedTo, Weight } from "./_Item.js"
import {
ComplexComplexity,
Cost,
KnownItemSpecifics,
KnownItemSpecificsTranslation,
RestrictedTo,
Weight,
} from "./_Item.js"
export const Armor = DB.Entity(import.meta.url, {
name: "Armor",
@@ -47,6 +54,10 @@ export const Armor = DB.Entity(import.meta.url, {
"Define if during character creation this weapon can only be bought by a specific subset of characters.",
type: DB.IncludeIdentifier(RestrictedTo),
}),
knownItemSpecifics: DB.Optional({
comment: "The armor is a known item, which implies some additional values.",
type: DB.IncludeIdentifier(KnownItemSpecifics),
}),
src,
translations: NestedTranslationMap(
DB.Required,
@@ -76,6 +87,10 @@ export const Armor = DB.Entity(import.meta.url, {
comment: "The armor disadvantage text.",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
knownItemSpecifics: DB.Optional({
comment: "The weapon is a known item, which implies some additional values.",
type: DB.IncludeIdentifier(KnownItemSpecificsTranslation),
}),
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
+67
View File
@@ -0,0 +1,67 @@
import * as DB from "tsondb/schema/dsl"
import { src } from "../../source/_PublicationRef.js"
import { NestedTranslationMap } from "../../Locale.js"
import { WeaponIdentifier, ArmorIdentifier } from "../../_Identifier.js"
import { EffectType, RecipeTradeSecret } from "./_Herbary.js"
export const HerbalAid = DB.Entity(import.meta.url, {
name: "HerbalAid",
namePlural: "HerbalAids",
type: () =>
DB.Object({
types: DB.Required({
comment: "The plant types this aid belongs to.",
type: DB.Array(DB.IncludeIdentifier(EffectType), { minItems: 1, uniqueItems: true }),
}),
crafting_difficulty: DB.Required({
comment: "The difficulty for this aid to craft.",
type: DB.Integer(),
}),
trade_secret: DB.Optional({
comment: "AP value and prerequisites of the herbal aids trade secret.",
type: DB.IncludeIdentifier(RecipeTradeSecret),
}),
combatUse: DB.Optional({
comment: "The armor or weapon this herbal aid represents.",
type: DB.IncludeIdentifier(HerbalAidCombatUse),
}),
src,
translations: NestedTranslationMap(
DB.Required,
"HerbalAid",
DB.Object({
name: DB.Required({
comment: "The herbal aid's name.",
type: DB.String({ minLength: 1 }),
}),
description: DB.Required({
comment: "The herbal aid's description.",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
ingredients: DB.Required({
comment: "The ingredients used to craft this herbal aid.",
type: DB.Array(DB.String({ minLength: 1, markdown: "inline" }), { minItems: 1 }),
}),
typical_tools: DB.Optional({
comment: "The typical tools used to craft this.",
type: DB.Array(DB.String({ minLength: 1, markdown: "inline" }), { minItems: 1 }),
}),
}),
),
}),
instanceDisplayName: {},
uniqueConstraints: [
{
entityMapKeyPath: "translations",
keyPathInEntityMap: "name",
},
],
})
const HerbalAidCombatUse = DB.Enum(import.meta.url, {
name: "HerbalAidCombatUse",
values: () => ({
Weapon: DB.EnumCase({ type: WeaponIdentifier() }),
Armor: DB.EnumCase({ type: ArmorIdentifier() }),
}),
})
@@ -0,0 +1,93 @@
import * as DB from "tsondb/schema/dsl"
import { NestedTranslationMap } from "../../Locale.js"
import { DurationUnit } from "../../_ActivatableSkillDuration.js"
import { ResponsiveTextReplace } from "../../_ResponsiveText.js"
import { Dice } from "../../_Dice.js"
import { MathOperation } from "../../_MathExpression.js"
import { EffectType } from "./_Herbary.js"
import { src } from "../../source/_PublicationRef.js"
export const HerbalPreservation = DB.Entity(import.meta.url, {
name: "HerbalPreservation",
namePlural: "HerbalPreservations",
type: () =>
DB.Object({
types: DB.Required({
comment: "The types of this preservation.",
type: DB.Array(DB.IncludeIdentifier(EffectType), { minItems: 1, uniqueItems: true }),
}),
longevity: DB.Required({
comment: "How long this preservation lasts.",
type: DB.IncludeIdentifier(HerbalPreservationLongevity),
}),
src,
translations: NestedTranslationMap(
DB.Required,
"HerbalPreservation",
DB.Object({
name: DB.Required({
comment: "The herbal preservation's name.",
type: DB.String({ minLength: 1 }),
}),
preparation: DB.Required({
comment: "How to prepare this preservation.",
type: DB.String({ minLength: 1, markdown: "inline" }),
}),
alternative_effect: DB.Required({
comment: "The herbal preservation's alternative effect.",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
}),
),
}),
instanceDisplayName: {},
uniqueConstraints: [
{
entityMapKeyPath: "translations",
keyPathInEntityMap: "name",
},
],
})
export const HerbalPreservationLongevity = DB.TypeAlias(import.meta.url, {
name: "HerbalPreservationLongevity",
type: () =>
DB.Object({
value: DB.Required({
comment: "An expression that evaluates to the duration.",
type: DB.IncludeIdentifier(HerbalPreservationLongevityExpression),
}),
unit: DB.Required({
comment: "The duration unit.",
type: DB.IncludeIdentifier(DurationUnit),
}),
translations: NestedTranslationMap(
DB.Optional,
"HerbalPreservationLongevity",
DB.Object({
replacement: DB.Required({
comment: "A replacement string.",
type: DB.IncludeIdentifier(ResponsiveTextReplace),
}),
}),
),
}),
})
export const HerbalPreservationLongevityExpression = DB.TypeAlias(import.meta.url, {
name: "HerbalPreservationLongevityExpression",
type: () =>
DB.GenIncludeIdentifier(MathOperation, [
DB.IncludeIdentifier(HerbalPreservationLongevityValue),
]),
})
export const HerbalPreservationLongevityValue = DB.Enum(import.meta.url, {
name: "HerbalPreservationLongevityValue",
values: () => ({
Constant: DB.EnumCase({ type: DB.Integer({ minimum: 1 }) }),
Dice: DB.EnumCase({
type: DB.IncludeIdentifier(Dice),
}),
}),
})
+361
View File
@@ -0,0 +1,361 @@
import * as DB from "tsondb/schema/dsl"
import { src } from "../../source/_PublicationRef.js"
import { NestedTranslationMap } from "../../Locale.js"
import { AlternativeName } from "../../_AlternativeNames.js"
import {
BiomeIdentifier,
SubBiomeIdentifier,
BotanicRegionIdentifier,
HerbalAidIdentifier,
HerbalPreservationIdentifier,
ElixirIdentifier,
PoisonIdentifier,
} from "../../_Identifier.js"
import { ResponsiveTextOptional, ResponsiveTextReplace } from "../../_ResponsiveText.js"
import { EffectType, PlantRarity } from "./_Herbary.js"
export const Plant = DB.Entity(import.meta.url, {
name: "Plant",
namePlural: "Plants",
type: () =>
DB.Object({
types: DB.Required({
comment: "The plant types of this plant.",
type: DB.Array(DB.IncludeIdentifier(EffectType), { minItems: 1, uniqueItems: true }),
}),
occurences: DB.Required({
comment: "The biomes this plant occurs in and its rarity in those biomes.",
type: DB.IncludeIdentifier(PlantOccurences),
}),
search_difficulty: DB.Required({
comment: "The search difficulty for this plant.",
type: DB.IncludeIdentifier(PlantDifficulty),
}),
identification_difficulty: DB.Required({
comment: "The identification difficulty for this plant.",
type: DB.IncludeIdentifier(PlantDifficulty),
}),
applications: DB.Required({
comment: "The applications of this plant per quality level.",
type: DB.IncludeIdentifier(PlantApplications),
}),
touch: DB.Optional({
comment: "The plant's touch effect.",
type: DB.IncludeIdentifier(PlantEffect),
}),
inhalation: DB.Optional({
comment: "The plant's inhalation effect.",
type: DB.IncludeIdentifier(PlantEffect),
}),
ingestion: DB.Optional({
comment: "The plant's ingestion effect.",
type: DB.IncludeIdentifier(PlantEffect),
}),
price: DB.Required({
comment: "The price of the plant.",
type: DB.IncludeIdentifier(PlantPrice),
}),
recipes: DB.Optional({
comment: "The herbal aids and elixirs that can be crafted with this plant.",
type: DB.Array(DB.IncludeIdentifier(PlantRecipe), { minItems: 1 }),
}),
longevity: DB.Optional({
comment: "The longevity of the plant.",
type: DB.IncludeIdentifier(PlantLongevity),
}),
src,
translations: NestedTranslationMap(
DB.Required,
"Plant",
DB.Object({
name: DB.Required({
comment: "The plant's name.",
type: DB.String({ minLength: 1 }),
}),
alternative_names: DB.Optional({
comment: "A list of alternative names.",
type: DB.Array(DB.IncludeIdentifier(AlternativeName), { minItems: 1 }),
}),
remedies_and_traditions: DB.Required({
comment: "How this plant is used as a household remedy and in folk traditions.",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
knowledge: DB.Required({
comment:
"What one knows about this plant for each quality level. The first element represents QL 1, the second element QL 2, and so on.",
type: DB.Array(DB.String({ minLength: 1, markdown: "block" }), {
minItems: 3,
maxItems: 6,
}),
}),
}),
),
}),
instanceDisplayName: {},
uniqueConstraints: [
{
entityMapKeyPath: "translations",
keyPathInEntityMap: "name",
},
],
})
const PlantOccurences = DB.TypeAlias(import.meta.url, {
name: "PlantOccurences",
type: () =>
DB.Object(
{
items: DB.Optional({
comment: "The biomes this plant occurs in and its rarity in those biomes.",
type: DB.Array(DB.IncludeIdentifier(PlantOccurrence), { minItems: 1 }),
}),
translation: NestedTranslationMap(
DB.Optional,
"PlantOccurrences",
DB.Object({
note: DB.Required({
comment: "A note to all occurences of this plant",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
}),
),
},
{
minProperties: 1,
},
),
})
const PlantOccurrence = DB.TypeAlias(import.meta.url, {
name: "PlantOccurrence",
type: () =>
DB.Object({
regions: DB.Required({
comment: "Where this plant occurs in.",
type: DB.IncludeIdentifier(PlantOccurrenceTier),
}),
rarity: DB.Required({
comment: "The rarity of this plant in the biome.",
type: DB.IncludeIdentifier(PlantRarity),
}),
translation: NestedTranslationMap(
DB.Optional,
"PlantOccurrence",
DB.Object({
note: DB.Required({
comment: "A note added to this occurrence",
type: DB.String({ minLength: 1, markdown: "inline" }),
}),
}),
),
}),
})
const PlantOccurrenceTier = DB.Enum(import.meta.url, {
name: "PlantOccurrenceTier",
values: () => ({
Biomes: DB.EnumCase({
type: DB.Array(BiomeIdentifier(), { minItems: 1 }),
}),
SubBiomes: DB.EnumCase({
type: DB.Array(SubBiomeIdentifier(), { minItems: 1 }),
}),
BotanicRegions: DB.EnumCase({
type: DB.Array(BotanicRegionIdentifier(), { minItems: 1 }),
}),
}),
})
const PlantDifficulty = DB.Enum(import.meta.url, {
name: "PlantDifficulty",
values: () => ({
Constant: DB.EnumCase({ type: DB.Integer() }),
Indefinite: DB.EnumCase({ type: DB.IncludeIdentifier(IndefinitePlantDescription) }),
}),
})
const IndefinitePlantDescription = DB.TypeAlias(import.meta.url, {
name: "IndefinitePlantDescription",
type: () =>
DB.Object({
translations: NestedTranslationMap(
DB.Required,
"IndefinitePlantDescription",
DB.Object({
description: DB.Required({
comment: "A description of whatever is indefinite of this plant.",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
}),
),
}),
})
const PlantApplications = DB.Enum(import.meta.url, {
name: "PlantApplications",
values: () => ({
Constant: DB.EnumCase({ type: DB.Array(DB.Integer(), { minItems: 6, maxItems: 6 }) }),
Indefinite: DB.EnumCase({ type: DB.IncludeIdentifier(IndefinitePlantDescription) }),
}),
})
const PlantEffect = DB.TypeAlias(import.meta.url, {
name: "PlantEffect",
type: () =>
DB.Object({
types: DB.Optional({
comment: "The effect type of this plant effect.",
type: DB.Array(DB.IncludeIdentifier(EffectType), { minItems: 1, uniqueItems: true }),
}),
translations: NestedTranslationMap(
DB.Required,
"PlantEffectTranslation",
DB.Object({
description: DB.Required({
comment: "The effect of the plant.",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
}),
),
}),
})
const PlantPrice = DB.Enum(import.meta.url, {
name: "PlantPrice",
values: () => ({
Constant: DB.EnumCase({
type: DB.Object({
value: DB.Required({
comment: "The value of the plant in silver coins.",
type: DB.Float({ minimum: 0 }),
}),
cost: DB.Required({
comment: "The cost of the plant in silver coins.",
type: DB.Float({ minimum: 0 }),
}),
}),
}),
Indefinite: DB.EnumCase({ type: DB.IncludeIdentifier(IndefinitePlantPrice) }),
}),
})
const IndefinitePlantPrice = DB.TypeAlias(import.meta.url, {
name: "IndefinitePlantPrice",
type: () =>
DB.Object({
translations: NestedTranslationMap(
DB.Required,
"IndefinitePlantPrice",
DB.Object({
description: DB.Required({
comment: "A description of the price.",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
}),
),
}),
})
const PlantRecipe = DB.Enum(import.meta.url, {
name: "PlantRecipe",
values: () => ({
HerbalAid: DB.EnumCase({ type: DB.IncludeIdentifier(HerbalAidRecipe) }),
Elixir: DB.EnumCase({ type: DB.IncludeIdentifier(ElixirRecipe) }),
Poison: DB.EnumCase({ type: DB.IncludeIdentifier(PoisonRecipe) }),
Indefinite: DB.EnumCase({ type: DB.IncludeIdentifier(IndefiniteRecipe) }),
}),
})
const PlantProductTranslation = DB.Object(
{
note: DB.Optional({
comment:
"A note, appended to the generated string in parenthesis. If the generated is modified using `replacement`, the note is appended to the modifier string.",
type: DB.IncludeIdentifier(ResponsiveTextOptional),
}),
replacement: DB.Optional({
comment:
"A replacement string. If `note` is provided, it is appended to the replaced string.",
type: DB.IncludeIdentifier(ResponsiveTextReplace),
}),
},
{ minProperties: 1 },
)
const HerbalAidRecipe = DB.TypeAlias(import.meta.url, {
name: "HerbalAidRecipe",
type: () =>
DB.Object({
herbal_aid: DB.Required({
comment: "The herbal aid this recipe results in.",
type: HerbalAidIdentifier(),
}),
translation: NestedTranslationMap(DB.Optional, "HerbalAidRecipe", PlantProductTranslation),
}),
})
const ElixirRecipe = DB.TypeAlias(import.meta.url, {
name: "ElixirRecipe",
type: () =>
DB.Object({
elixir: DB.Required({
comment: "The elixir this recipe results in.",
type: ElixirIdentifier(),
}),
translation: NestedTranslationMap(DB.Optional, "ElixirRecipe", PlantProductTranslation),
}),
})
const PoisonRecipe = DB.TypeAlias(import.meta.url, {
name: "PoisonRecipe",
type: () =>
DB.Object({
poison: DB.Required({
comment: "The poison this recipe results in.",
type: PoisonIdentifier(),
}),
translation: NestedTranslationMap(DB.Optional, "PoisonRecipe", PlantProductTranslation),
}),
})
const IndefiniteRecipe = DB.TypeAlias(import.meta.url, {
name: "IndefiniteRecipe",
type: () =>
DB.Object({
translations: NestedTranslationMap(
DB.Required,
"IndefiniteRecipe",
DB.Object({
description: DB.Required({
comment: "A description of the recipe.",
type: DB.String({ minLength: 1, markdown: "inline" }),
}),
}),
),
}),
})
const PlantLongevity = DB.TypeAlias(import.meta.url, {
name: "PlantLongevity",
type: () =>
DB.Object({
preservations: DB.Optional({
comment: "The preservations with alternative effect of this preserved plant",
type: DB.Array(HerbalPreservationIdentifier(), { minItems: 1, uniqueItems: true }),
}),
translations: NestedTranslationMap(
DB.Required,
"PlantLongevity",
DB.Object({
raw: DB.Required({
comment: "The longevity of the raw plant",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
preserved: DB.Optional({
comment: "The longevity of the preserved plant",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
}),
),
}),
})
+17 -1
View File
@@ -3,7 +3,15 @@ import { CloseCombatTechnique, RangedCombatTechnique } from "../../CombatTechniq
import { NestedTranslationMap } from "../../Locale.js"
import { Errata } from "../../source/_Erratum.js"
import { src } from "../../source/_PublicationRef.js"
import { Complexity, Cost, RestrictedTo, StructurePoints, Weight } from "./_Item.js"
import {
Complexity,
Cost,
KnownItemSpecifics,
KnownItemSpecificsTranslation,
RestrictedTo,
StructurePoints,
Weight,
} from "./_Item.js"
import { MeleeWeapon } from "./_MeleeWeapon.js"
import { RangedWeapon } from "./_RangedWeapon.js"
import { checkWeaponCombatTechniqueIntegrity } from "./_Weapon.js"
@@ -57,6 +65,10 @@ export const Weapon = DB.Entity(import.meta.url, {
"Define if during character creation this weapon can only be bought by a specific subset of characters.",
type: DB.IncludeIdentifier(RestrictedTo),
}),
knownItemSpecifics: DB.Optional({
comment: "The weapon is a known item, which implies some additional values.",
type: DB.IncludeIdentifier(KnownItemSpecifics),
}),
src,
translations: NestedTranslationMap(
DB.Required,
@@ -86,6 +98,10 @@ export const Weapon = DB.Entity(import.meta.url, {
comment: "The weapon disadvantage text.",
type: DB.String({ minLength: 1, markdown: "block" }),
}),
knownItemSpecifics: DB.Optional({
comment: "The weapon is a known item, which implies some additional values.",
type: DB.IncludeIdentifier(KnownItemSpecificsTranslation),
}),
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
+12
View File
@@ -19,6 +19,18 @@ export const EffectType = DB.Enum(import.meta.url, {
}),
})
export const PlantRarity = DB.Enum(import.meta.url, {
name: "PlantRarity",
comment: "The rarity of a plant in a biome.",
values: () => ({
Common: DB.EnumCase({ type: null }),
Occasional: DB.EnumCase({ type: null }),
RatherRare: DB.EnumCase({ type: null }),
Rare: DB.EnumCase({ type: null }),
VeryRare: DB.EnumCase({ type: null }),
}),
})
export const LaboratoryLevel = DB.Enum(import.meta.url, {
name: "LaboratoryLevel",
values: () => ({
+205
View File
@@ -7,6 +7,7 @@ import {
ProfessionIdentifier,
RaceIdentifier,
} from "../../_Identifier.js"
import { ResponsiveTextOptional, ResponsiveTextReplace } from "../../_ResponsiveText.ts"
import { NestedTranslationMap } from "../../Locale.js"
import { Errata } from "../../source/_Erratum.js"
import { src } from "../../source/_PublicationRef.js"
@@ -337,3 +338,207 @@ export const RestrictedToBlessedTraditionsScope = DB.Enum(import.meta.url, {
Shamanistic: DB.EnumCase({ type: null }),
}),
})
export const KnownItemSpecifics = DB.TypeAlias(import.meta.url, {
name: "KnownItemSpecifics",
type: () =>
DB.Object({
age: DB.Optional({
comment: "The age of the item is known.",
type: DB.IncludeIdentifier(KnownItemAge),
}),
condition: DB.Optional({
comment: "The condition of the item is known and well specified.",
type: DB.IncludeIdentifier(KnownItemCondition),
}),
stabilityRating: DB.Optional({
comment:
"The breaking point rating (weapon) or sturdiness rating (armor) of the item. Either a specific rating or a general unbreakability.",
type: DB.IncludeIdentifier(KnownItemStabilityRating),
}),
damageLevel: DB.Optional({
comment: "The *Damaged* (weapon) or *Wear* (armor) level of the item, if any.",
type: DB.Integer({ minimum: 1, maximum: 4 }),
}),
collectorsValue: DB.Required({
comment: "The collectors value of the known item.",
type: DB.IncludeIdentifier(CollectorsValue),
}),
}),
})
export const KnownItemSpecificsTranslation = DB.TypeAlias(import.meta.url, {
name: "KnownItemSpecificsTranslation",
type: () =>
DB.Object({
condition: DB.Required({
comment: "The condition of the item.",
type: DB.String({ minLength: 1, markdown: "inline" }),
}),
}),
})
const KnownItemAge = DB.Enum(import.meta.url, {
name: "KnownItemAge",
comment: "The age of the item is known.",
values: () => ({
Antique: DB.EnumCase({ type: null }),
Old: DB.EnumCase({ type: null }),
}),
})
const KnownItemCondition = DB.Enum(import.meta.url, {
name: "KnownItemCondition",
comment: "The condition of the item is known and well specified.",
values: () => ({
Broken: DB.EnumCase({ type: null }),
Poor: DB.EnumCase({ type: null }),
Good: DB.EnumCase({ type: null }),
VeryGood: DB.EnumCase({ type: null }),
AsNew: DB.EnumCase({ type: null }),
}),
})
const KnownItemStabilityRating = DB.Enum(import.meta.url, {
name: "KnownItemStabilityRating",
comment: "Either a specific rating or a general unbreakability.",
values: () => ({
Constant: DB.EnumCase({ type: DB.Integer({ minimum: 1 }) }),
Unbreakable: DB.EnumCase({ type: null }),
}),
})
const CollectorsValue = DB.Enum(import.meta.url, {
name: "CollectorsValue",
comment: "The item has a collectors value.",
values: () => ({
Constant: DB.EnumCase({
comment: "The collectors value is a fixed price in silverthalers.",
type: DB.IncludeIdentifier(ConstantCollectorsValue),
}),
Minimum: DB.EnumCase({
comment:
"The collectors value is a range with an open end and the specified price in silverthalers as the minimum.",
type: DB.IncludeIdentifier(MinimumCollectorsValue),
}),
Invaluable: DB.EnumCase({
comment: "The item is invaluable to collectors.",
type: null,
}),
}),
})
const ConstantCollectorsValue = DB.TypeAlias(import.meta.url, {
name: "ConstantCollectorsValue",
type: () =>
DB.Object({
value: DB.Required({
comment: "The collectors value is a fixed price in silverthalers.",
type: DB.Float({ minimum: { value: 0, isExclusive: true } }),
}),
translations: NestedTranslationMap(
DB.Optional,
"ConstantCollectorsValue",
DB.Object(
{
note: DB.Optional({
comment: "A note, appended to the generated string in parenthesis.",
type: DB.IncludeIdentifier(ResponsiveTextOptional),
}),
replacement: DB.Optional({
comment: "A replacement string.",
type: DB.IncludeIdentifier(ResponsiveTextReplace),
}),
},
{ minProperties: 1 },
),
),
}),
})
const MinimumCollectorsValue = DB.TypeAlias(import.meta.url, {
name: "MinimumCollectorsValue",
type: () =>
DB.Object({
value: DB.Required({
comment:
"The collectors value is a range with an open end and the specified price in silverthalers as the minimum.",
type: DB.Float({ minimum: { value: 0, isExclusive: true } }),
}),
translations: NestedTranslationMap(
DB.Optional,
"MinimumCollectorsValue",
DB.Object(
{
note: DB.Optional({
comment: "A note, appended to the generated string in parenthesis.",
type: DB.IncludeIdentifier(ResponsiveTextOptional),
}),
replacement: DB.Optional({
comment: "A replacement string.",
type: DB.IncludeIdentifier(ResponsiveTextReplace),
}),
},
{ minProperties: 1 },
),
),
}),
})
/*
Possible known item conditions:
-------------------------------
Die Waffe ist antik, aber gut erhalten.
Der Schild ist antik, aber gut erhalten.
Die Waffe ist antik, aber sehr gut erhalten und sieht aus wie neu.
Die Waffe ist antik, aber sehr gut erhalten.
Die Waffe ist zwar antik, aber sehr gut erhalten.
Die Waffe ist antik und weist einige Scharten in der Klinge auf.
Die Waffe ist antik und zerbrochen.
Die Waffe ist antik, aber neuwertig.
Die Waffe ist alt.
Die Waffe ist alt, aber gut gepflegt.
Der Magierstab ist alt, aber gut gepflegt.
Die Waffen sind alt, aber gut gepflegt.
Die Waffe ist alt, aber neuwertig.
Das Schwert ist alt, aber neuwertig.
Die Waffe ist alt, aber gut erhalten.
Die Waffe ist alt, aber sie wurde vermutlich niemals eingesetzt und ist gut erhalten.
Die Waffe ist alt und in schlechtem Zustand.
Die Waffe ist alt und schlecht gepflegt.
Die Waffe ist alt, aber in gepflegtem Zustand.
Die Waffe ist gebraucht.
Die Waffe ist gebraucht, aber neuwertig.
Die Waffe ist gebraucht, aber unzerbrechlich.
Die Waffe ist gebraucht, aber gepflegt.
Die Rüstung ist gebraucht, aber gut erhalten.
Die Rüstung ist gebraucht und in einem schlechten Zustand.
Die Waffe ist neuwertig.
Die Waffe ist neuwertig und unbenutzt.
*leer*
Wenn er gebunden wird, wird der
Stab wie alle Traditionsartefakte nahezu unzerbrechlich.
Sie weist 1 Stufe Beschädigung auf.
Er weist 1 Stufe Beschädigung auf.
Der Bruchfaktor beträgt 14.
Der Bruchfaktor beträgt 12 und sie weist 3 Stufen Beschädigung auf.
Sie ist unzerbrechlich.
Einzig elementares Feuer, das heißer brennt als ein Drachenodem oder ein IGNIFAXIUS, oder aber das Eingreifen eines Gottes können die Axt zerstören.
Einzig elementares Feuer, das heißer brennt als ein Drachenodem oder ein IGNIFAXIUS, spezielle Zauberei oder das Eingreifen eines Gottes können die Axt zerstören.
Die Waffe war lange Zeit dem Salzwasser der Zyklopensee ausgesetzt, was allerdings bei Weitem nicht so große Schäden angerichtet hat, wie zu erwarten wäre.
Die Waffe kann nicht benutzt werden, bis die geborstene Klinge neu geschmiedet wurde.
Sie weist 3 Stufen Verschleiß auf und ist unbrauchbar, bis sie repariert wurde.
Possible collector's values:
----------------------------
750+ S (nur Personen mit sehr zweifelhaftem Ruf würden eine solche Waffe erwerben)
1.500+ S
2.500 S
500+ S (1.500+ S für ein zusammenpassendes Paar)
unbezahlbar
*/
+2 -2
View File
@@ -109,14 +109,14 @@ export const checkWeaponCombatTechniqueIntegrity = (
checkPart(ct.special.has_length, meleeUse.length, "a length", "close", ctId),
checkPart(ct.special.has_reach, meleeUse.reach, "a reach", "close", ctId),
checkPart(ct.special.has_shield_size, meleeUse.size, "a shield size", "close", ctId),
].filter(v => v !== undefined)
]
}),
...Object.entries(instanceContent.ranged_uses ?? {}).flatMap(([ctId, rangedUse]) => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- integrity has been checked, it must be present
const ct = getInstanceById("RangedCombatTechnique", ctId)!
return [
checkPart(ct.special.has_ammunition, rangedUse.ammunition, "an ammunition", "ranged", ctId),
].filter(v => v !== undefined)
]
}),
].filter(v => v !== undefined)
}
+31
View File
@@ -0,0 +1,31 @@
import * as DB from "tsondb/schema/dsl"
import { NestedTranslationMap } from "../../../Locale.js"
import { SubBiome } from "./SubBiome.js"
export const Biome = DB.Entity(import.meta.url, {
name: "Biome",
namePlural: "Biome",
type: () =>
DB.Object({
translations: NestedTranslationMap(
DB.Required,
"Biome",
DB.Object({
name: DB.Required({
comment: "The biome's name.",
type: DB.String({ minLength: 1 }),
}),
}),
),
sub_biomes: DB.Required({
type: DB.ChildEntitiesType(SubBiome),
}),
}),
instanceDisplayName: {},
uniqueConstraints: [
{
entityMapKeyPath: "translations",
keyPathInEntityMap: "name",
},
],
})
@@ -0,0 +1,38 @@
import * as DB from "tsondb/schema/dsl"
import { NestedTranslationMap } from "../../../Locale.js"
import { SubBiomeIdentifier } from "../../../_Identifier.js"
export const BotanicRegion = DB.Entity(import.meta.url, {
name: "BotanicRegion",
namePlural: "BotanicRegions",
type: () =>
DB.Object({
parent: DB.Required({
comment: "The subbiome this region belongs to.",
type: SubBiomeIdentifier(),
}),
translations: NestedTranslationMap(
DB.Required,
"BotanicRegion",
DB.Object({
name: DB.Required({
comment: "The region's name.",
type: DB.String({ minLength: 1 }),
}),
}),
),
}),
parentReferenceKey: "parent",
instanceDisplayName: {},
uniqueConstraints: [
[
{
entityMapKeyPath: "translations",
keyPathInEntityMap: "name",
},
{
keyPath: "parent",
},
],
],
})
+37
View File
@@ -0,0 +1,37 @@
import * as DB from "tsondb/schema/dsl"
import { NestedTranslationMap } from "../../../Locale.js"
import { BiomeIdentifier } from "../../../_Identifier.js"
import { BotanicRegion } from "./BotanicRegion.js"
export const SubBiome = DB.Entity(import.meta.url, {
name: "SubBiome",
namePlural: "SubBiomes",
type: () =>
DB.Object({
parent: DB.Required({
comment: "The biome this sub-biome belongs to.",
type: BiomeIdentifier(),
}),
translations: NestedTranslationMap(
DB.Required,
"SubBiome",
DB.Object({
name: DB.Required({
comment: "The subbiome's name.",
type: DB.String({ minLength: 1 }),
}),
}),
),
regions: DB.Required({
type: DB.ChildEntities(BotanicRegion),
}),
}),
parentReferenceKey: "parent",
instanceDisplayName: {},
uniqueConstraints: [
{
entityMapKeyPath: "translations",
keyPathInEntityMap: "name",
},
],
})
+10 -1
View File
@@ -30,6 +30,8 @@ export { Container } from "./equipment/item/Container.js"
export { Elixir } from "./equipment/item/Elixir.js"
export { EquipmentOfBlessedOnes } from "./equipment/item/EquipmentOfBlessedOnes.js"
export { GemOrPreciousStone } from "./equipment/item/GemOrPreciousStone.js"
export { HerbalAid } from "./equipment/item/HerbalAid.js"
export { HerbalPreservation } from "./equipment/item/HerbalPreservation.js"
export { IlluminationLightSource } from "./equipment/item/IlluminationLightSource.js"
export { IlluminationRefillOrSupply } from "./equipment/item/IlluminationRefillOrSupply.js"
export { Jewelry } from "./equipment/item/Jewelry.js"
@@ -40,18 +42,22 @@ export { MagicalArtifact } from "./equipment/item/MagicalArtifact.js"
export { MusicalInstrument } from "./equipment/item/MusicalInstrument.js"
export { Newspaper } from "./equipment/item/Newspaper.js"
export { OrienteeringAid } from "./equipment/item/OrienteeringAid.js"
export { Plant } from "./equipment/item/Plant.js"
export { Poison } from "./equipment/item/Poison.js"
export { RopeOrChain } from "./equipment/item/RopeOrChain.js"
export { Stationery } from "./equipment/item/Stationery.js"
export { ArmorType } from "./equipment/item/sub/ArmorType.js"
export { Biome } from "./equipment/item/sub/Biome.js"
export { SubBiome } from "./equipment/item/sub/SubBiome.js"
export { Reach } from "./equipment/item/sub/Reach.js"
export { BotanicRegion } from "./equipment/item/sub/BotanicRegion.js"
export { ThievesTool } from "./equipment/item/ThievesTool.js"
export { ToolOfTheTrade } from "./equipment/item/ToolOfTheTrade.js"
export { TravelGearOrTool } from "./equipment/item/TravelGearOrTool.js"
export { Vehicle } from "./equipment/item/Vehicle.js"
export { Weapon } from "./equipment/item/Weapon.js"
export { WeaponAccessory } from "./equipment/item/WeaponAccessory.js"
export { WorkingSupernaturalCreature } from "./equipment/item/WorkingSupernaturalCreature.ts"
export { WorkingSupernaturalCreature } from "./equipment/item/WorkingSupernaturalCreature.js"
export { ExperienceLevel } from "./ExperienceLevel.js"
export { EyeColor } from "./EyeColor.js"
export { FamiliarsTrick } from "./FamiliarsTrick.js"
@@ -142,11 +148,14 @@ export { ChronicleEnchantment } from "./traditionArtifacts/ChronicleEnchantment.
export { DaggerRitual } from "./traditionArtifacts/DaggerRitual.js"
export { FoolsHatEnchantment } from "./traditionArtifacts/FoolsHatEnchantment.js"
export { Haubenzauber } from "./traditionArtifacts/Haubenzauber.js"
export { Hauerkettenzauber } from "./traditionArtifacts/Hauerkettenzauber.js"
export { InstrumentEnchantment } from "./traditionArtifacts/InstrumentEnchantment.js"
export { Keulenzauber } from "./traditionArtifacts/Keulenzauber.js"
export { Krallenkettenzauber } from "./traditionArtifacts/Krallenkettenzauber.js"
export { Kristallkugelzauber } from "./traditionArtifacts/Kristallkugelzauber.js"
export { OrbEnchantment } from "./traditionArtifacts/OrbEnchantment.js"
export { RingEnchantment } from "./traditionArtifacts/RingEnchantment.js"
export { Schweinetrommelzauber } from "./traditionArtifacts/Schweinetrommelzauber.js"
export { SickleRitual } from "./traditionArtifacts/SickleRitual.js"
export { SpellSwordEnchantment } from "./traditionArtifacts/SpellSwordEnchantment.js"
export { StaffEnchantment } from "./traditionArtifacts/StaffEnchantment.js"
+12 -4
View File
@@ -1,13 +1,14 @@
import * as DB from "tsondb/schema/dsl"
import { name_in_library } from "../_Activatable.js"
import { OldParameter } from "../_ActivatableSkill.js"
import { CheckResultBasedDuration, DurationUnitValue } from "../_ActivatableSkillDuration.js"
import { DurationUnitValue, ExpressionBasedDuration } from "../_ActivatableSkillDuration.js"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { AffectedTargetCategories } from "../_ActivatableSkillTargetCategory.ts"
import { PropertyIdentifier, TribeIdentifier } from "../_Identifier.js"
import { ImprovementCost } from "../_ImprovementCost.js"
import { AnimistPowerPrerequisites } from "../_Prerequisite.js"
import { ResponsiveTextOptional } from "../_ResponsiveText.js"
import { SkillCheck } from "../_SkillCheck.js"
import { SkillCheck, SkillCheckPenalty } from "../_SkillCheck.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { PublicationRefs, src } from "../source/_PublicationRef.js"
@@ -21,10 +22,18 @@ export const AnimistPower = DB.Entity(import.meta.url, {
comment: "Lists the linked three attributes used to make a skill check.",
type: DB.IncludeIdentifier(SkillCheck),
}),
check_penalty: DB.Optional({
comment: "In some cases, the target's Spirit or Toughness is applied as a penalty.",
type: DB.IncludeIdentifier(SkillCheckPenalty),
}),
parameters: DB.Required({
comment: "Measurable parameters of an animist power.",
type: DB.IncludeIdentifier(AnimistPowerPerformanceParameters),
}),
target: DB.Optional({
comment: "The target category the kind of creature or object the skill affects.",
type: DB.IncludeIdentifier(AffectedTargetCategories),
}),
property: DB.Required({
comment: "The associated property.",
type: PropertyIdentifier(),
@@ -190,8 +199,7 @@ const OneTimeAnimistPowerDuration = DB.Enum(import.meta.url, {
name: "OneTimeAnimistPowerDuration",
values: () => ({
Immediate: DB.EnumCase({ type: null }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(DurationUnitValue) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
}),
})
+6 -8
View File
@@ -1,8 +1,9 @@
import * as DB from "tsondb/schema/dsl"
import { name_in_library } from "../_Activatable.js"
import { CheckResultBasedDuration } from "../_ActivatableSkillDuration.js"
import { OneTimeCostMap } from "../_ActivatableSkillCost.ts"
import { ExpressionBasedDuration } from "../_ActivatableSkillDuration.js"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { PropertyIdentifier, BannzeichenIdentifier } from "../_Identifier.js"
import { BannzeichenIdentifier, PropertyIdentifier } from "../_Identifier.js"
import { ImprovementCost } from "../_ImprovementCost.js"
import { ResponsiveText, ResponsiveTextOptional } from "../_ResponsiveText.js"
import { SkillCheck } from "../_SkillCheck.js"
@@ -111,6 +112,7 @@ const BannzeichenCost = DB.Enum(import.meta.url, {
values: () => ({
Single: DB.EnumCase({ type: DB.IncludeIdentifier(SingleBannzeichenCost) }),
Disjunction: DB.EnumCase({ type: DB.IncludeIdentifier(BannzeichenCostDisjunction) }),
Map: DB.EnumCase({ type: DB.IncludeIdentifier(OneTimeCostMap) }),
DerivedFromOption: DB.EnumCase({ type: null }),
}),
})
@@ -189,11 +191,11 @@ const BannzeichenDuration = DB.TypeAlias(import.meta.url, {
DB.Object({
slow: DB.Required({
comment: "The duration on slow Bannzeichen application.",
type: DB.IncludeIdentifier(CheckResultBasedDuration),
type: DB.IncludeIdentifier(ExpressionBasedDuration),
}),
fast: DB.Required({
comment: "The duration on fast Bannzeichen application.",
type: DB.IncludeIdentifier(CheckResultBasedDuration),
type: DB.IncludeIdentifier(ExpressionBasedDuration),
}),
}),
})
@@ -236,10 +238,6 @@ export const BannzeichenOption = DB.Entity(import.meta.url, {
The surrounding parenthesis will/should not be included, they will/should be generated.`,
type: DB.String({ minLength: 1 }),
}),
native_name: DB.Required({
comment: "The native name of the Bannzeichen option.",
type: DB.String({ minLength: 1 }),
}),
}),
),
}),
+3 -5
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { OldParameter } from "../_ActivatableSkill.js"
import { IndefiniteOneTimeCost } from "../_ActivatableSkillCost.js"
import { CheckResultBasedDuration, DurationUnitValue } from "../_ActivatableSkillDuration.js"
import { ExpressionBasedDuration } from "../_ActivatableSkillDuration.js"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { PropertyIdentifier } from "../_Identifier.js"
import { ResponsiveText, ResponsiveTextOptional } from "../_ResponsiveText.js"
@@ -125,8 +125,7 @@ const CurseDuration = DB.Enum(import.meta.url, {
name: "CurseDuration",
values: () => ({
Immediate: DB.EnumCase({ type: null }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(DurationUnitValue) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
Indefinite: DB.EnumCase({ type: DB.IncludeIdentifier(IndefiniteCurseDuration) }),
}),
})
@@ -155,7 +154,6 @@ const IndefiniteCurseDuration = DB.TypeAlias(import.meta.url, {
const MaximumIndefiniteCurseDuration = DB.Enum(import.meta.url, {
name: "MaximumIndefiniteCurseDuration",
values: () => ({
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(DurationUnitValue) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
}),
})
+3 -20
View File
@@ -1,6 +1,6 @@
import * as DB from "tsondb/schema/dsl"
import { OldParameter } from "../_ActivatableSkill.js"
import { CheckResultBasedDuration, DurationUnit } from "../_ActivatableSkillDuration.js"
import { ExpressionBasedDuration } from "../_ActivatableSkillDuration.js"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { PropertyIdentifier, SkillModificationLevelIdentifier } from "../_Identifier.js"
import { ResponsiveText } from "../_ResponsiveText.js"
@@ -107,27 +107,11 @@ const DominationRitualCost = DB.TypeAlias(import.meta.url, {
const DominationRitualDuration = DB.Enum(import.meta.url, {
name: "DominationRitualDuration",
values: () => ({
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(FixedDominationRitualDuration) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
Indefinite: DB.EnumCase({ type: DB.IncludeIdentifier(IndefiniteDominationRitualDuration) }),
}),
})
const FixedDominationRitualDuration = DB.TypeAlias(import.meta.url, {
name: "FixedDominationRitualDuration",
type: () =>
DB.Object({
value: DB.Required({
comment: "The (unitless) duration.",
type: DB.Integer({ minimum: 1 }),
}),
unit: DB.Required({
comment: "The duration unit.",
type: DB.IncludeIdentifier(DurationUnit),
}),
}),
})
const IndefiniteDominationRitualDuration = DB.TypeAlias(import.meta.url, {
name: "IndefiniteDominationRitualDuration",
type: () =>
@@ -152,7 +136,6 @@ const IndefiniteDominationRitualDuration = DB.TypeAlias(import.meta.url, {
const MaximumIndefiniteDominationRitualDuration = DB.Enum(import.meta.url, {
name: "MaximumIndefiniteDominationRitualDuration",
values: () => ({
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(FixedDominationRitualDuration) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
}),
})
+2 -3
View File
@@ -2,7 +2,7 @@ import * as DB from "tsondb/schema/dsl"
import { OldParameter } from "../_ActivatableSkill.js"
import { SlowSkillNonModifiableCastingTime } from "../_ActivatableSkillCastingTime.js"
import { OneTimeCostMap } from "../_ActivatableSkillCost.js"
import { CheckResultBasedDuration, DurationUnitValue } from "../_ActivatableSkillDuration.js"
import { ExpressionBasedDuration } from "../_ActivatableSkillDuration.js"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { AffectedTargetCategories } from "../_ActivatableSkillTargetCategory.js"
import { PropertyIdentifier } from "../_Identifier.js"
@@ -152,7 +152,6 @@ const GeodeRitualDuration = DB.Enum(import.meta.url, {
name: "GeodeRitualDuration",
values: () => ({
Immediate: DB.EnumCase({ type: null }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(DurationUnitValue) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
}),
})
+7 -8
View File
@@ -1,17 +1,17 @@
import * as DB from "tsondb/schema/dsl"
import { OldParameter } from "../_ActivatableSkill.js"
import { CheckResultBasedDuration, DurationUnitValue } from "../_ActivatableSkillDuration.js"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { NonModifiableOneTimeCost, NonModifiableSustainedCost } from "../_ActivatableSkillCost.js"
import { ResponsiveTextOptional, ResponsiveTextReplace } from "../_ResponsiveText.js"
import { FixedRange } from "../_ActivatableSkillRange.js"
import { ExpressionBasedDuration } from "../_ActivatableSkillDuration.js"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { ExpressionBasedRange } from "../_ActivatableSkillRange.js"
import { AffectedTargetCategories } from "../_ActivatableSkillTargetCategory.js"
import { PropertyIdentifier } from "../_Identifier.js"
import { ImprovementCost } from "../_ImprovementCost.js"
import { ResponsiveTextOptional, ResponsiveTextReplace } from "../_ResponsiveText.js"
import { SkillCheck, SkillCheckPenalty } from "../_SkillCheck.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { ImprovementCost } from "../_ImprovementCost.js"
export const GoblinRitual = DB.Entity(import.meta.url, {
name: "GoblinRitual",
@@ -212,7 +212,7 @@ const GoblinRitualRangeValue = DB.Enum(import.meta.url, {
Sight: DB.EnumCase({ type: null }),
Self: DB.EnumCase({ type: null }),
Touch: DB.EnumCase({ type: null }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(FixedRange) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedRange) }),
}),
})
@@ -220,7 +220,6 @@ const GoblinRitualDuration = DB.Enum(import.meta.url, {
name: "GoblinRitualDuration",
values: () => ({
Immediate: DB.EnumCase({ type: null }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(DurationUnitValue) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
}),
})
+2 -18
View File
@@ -1,6 +1,6 @@
import * as DB from "tsondb/schema/dsl"
import { OldParameter } from "../_ActivatableSkill.js"
import { CheckResultBasedDuration, DurationUnit } from "../_ActivatableSkillDuration.js"
import { ExpressionBasedDuration } from "../_ActivatableSkillDuration.js"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { AffectedTargetCategories } from "../_ActivatableSkillTargetCategory.js"
import { PropertyIdentifier } from "../_Identifier.js"
@@ -158,22 +158,6 @@ export const JesterTrickDuration = DB.Enum(import.meta.url, {
name: "JesterTrickDuration",
values: () => ({
Immediate: DB.EnumCase({ type: null }),
Fixed: DB.EnumCase({ type: DB.IncludeIdentifier(FixedJesterTrickDuration) }),
CheckResultBased: DB.EnumCase({ type: DB.IncludeIdentifier(CheckResultBasedDuration) }),
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
}),
})
const FixedJesterTrickDuration = DB.TypeAlias(import.meta.url, {
name: "FixedJesterTrickDuration",
type: () =>
DB.Object({
value: DB.Required({
comment: "The (unitless) duration.",
type: DB.Integer({ minimum: 2 }),
}),
unit: DB.Required({
comment: "The duration unit.",
type: DB.IncludeIdentifier(DurationUnit),
}),
}),
})
+3 -3
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { name_in_library } from "../_Activatable.js"
import { OldParameter } from "../_ActivatableSkill.js"
import { CheckResultBasedDuration } from "../_ActivatableSkillDuration.js"
import { ExpressionBasedDuration } from "../_ActivatableSkillDuration.ts"
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
import { MagicalRuneIdentifier, PropertyIdentifier } from "../_Identifier.js"
import { CombatTechniqueIdentifier } from "../_IdentifierGroup.js"
@@ -259,11 +259,11 @@ const MagicalRuneDuration = DB.TypeAlias(import.meta.url, {
DB.Object({
slow: DB.Required({
comment: "The duration on slow rune application.",
type: DB.IncludeIdentifier(CheckResultBasedDuration),
type: DB.IncludeIdentifier(ExpressionBasedDuration),
}),
fast: DB.Required({
comment: "The duration on fast rune application.",
type: DB.IncludeIdentifier(CheckResultBasedDuration),
type: DB.IncludeIdentifier(ExpressionBasedDuration),
}),
}),
})
@@ -78,6 +78,7 @@ export const GeneralPrerequisiteGroup = DB.Enum(import.meta.url, {
SexualCharacteristic: DB.EnumCase({
type: DB.IncludeIdentifier(SexualCharacteristicPrerequisite),
}),
PersonalityTrait: DB.EnumCase({ type: DB.IncludeIdentifier(PersonalityTraitPrerequisite) }),
}),
})
@@ -0,0 +1,18 @@
import * as DB from "tsondb/schema/dsl"
import { PropertyIdentifier } from "../../_Identifier.js"
import { DisplayOption } from "../DisplayOption.js"
export const PropertyPrerequisite = DB.TypeAlias(import.meta.url, {
name: "PropertyPrerequisite",
comment: "Requires a specific property or one of a specific set of properties.",
type: () =>
DB.Object({
id: DB.Required({
comment: "The propertys identifier.",
type: PropertyIdentifier(),
}),
display_option: DB.Optional({
type: DB.IncludeIdentifier(DisplayOption),
}),
}),
})
@@ -1,8 +1,8 @@
import * as DB from "tsondb/schema/dsl"
import { input, levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { combat_techniques, penalty, usage_type } from "../_ActivatableCombat.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { combat_techniques, penalty, special_ability_usage_type } from "../_ActivatableCombat.js"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -18,7 +18,7 @@ export const AdvancedCombatSpecialAbility = DB.Entity(import.meta.url, {
DB.Object({
levels,
nameBuilderRules,
usage_type,
usage_type: special_ability_usage_type,
select_options,
explicit_select_options,
skill_applications,
@@ -48,6 +48,7 @@ export const AdvancedCombatSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -43,6 +43,7 @@ export const AdvancedKarmaSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -43,6 +43,7 @@ export const AdvancedMagicalSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -43,6 +43,7 @@ export const AdvancedSkillSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+2 -1
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -44,6 +44,7 @@ export const AncestorGlyph = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,6 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { activatableDisplayNameCustomizer } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import {
@@ -35,6 +36,11 @@ export const BlessedTradition = DB.Entity(import.meta.url, {
comment: "The traditions aspects, if any.",
type: DB.Array(AspectIdentifier(), { minItems: 2, maxItems: 2 }),
}),
primaryBlessing: DB.Optional({
comment:
"The traditions primary blessing. Leave empty if the tradition does not have one.",
type: BlessingIdentifier(),
}),
restricted_blessings: DB.Optional({
comment:
"If a tradition restricts the possible blessings, the blessings that are **not** allowed.",
@@ -96,6 +102,7 @@ export const BlessedTradition = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,8 +1,8 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { combat_techniques, usage_type } from "../_ActivatableCombat.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { combat_techniques, special_ability_usage_type } from "../_ActivatableCombat.js"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -16,7 +16,7 @@ export const BrawlingSpecialAbility = DB.Entity(import.meta.url, {
DB.Object({
levels,
nameBuilderRules,
usage_type,
usage_type: special_ability_usage_type,
select_options,
explicit_select_options,
maximum,
@@ -42,6 +42,7 @@ export const BrawlingSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { aspectOptional } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
@@ -44,6 +44,7 @@ export const CeremonialItemSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
[
{
@@ -1,8 +1,13 @@
import * as DB from "tsondb/schema/dsl"
import { input, levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { combat_techniques, penalty, penalty_l10n, usage_type } from "../_ActivatableCombat.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
combat_techniques,
penalty,
penalty_l10n,
special_ability_usage_type,
} from "../_ActivatableCombat.js"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -17,7 +22,7 @@ export const CombatSpecialAbility = DB.Entity(import.meta.url, {
DB.Object({
levels,
nameBuilderRules,
usage_type,
usage_type: special_ability_usage_type,
select_options,
explicit_select_options,
skill_applications,
@@ -48,6 +53,7 @@ export const CombatSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -2,8 +2,8 @@ import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { advanced } from "../_ActivatableAdvanced.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { combat_techniques, penalty, type, usage_type } from "../_ActivatableCombat.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { combat_techniques, penalty, type, style_usage_type } from "../_ActivatableCombat.js"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { AdvancedCombatSpecialAbilityIdentifier } from "../_Identifier.js"
@@ -19,7 +19,7 @@ export const CombatStyleSpecialAbility = DB.Entity(import.meta.url, {
DB.Object({
levels,
nameBuilderRules,
usage_type,
usage_type: style_usage_type,
type,
select_options,
explicit_select_options,
@@ -50,6 +50,7 @@ export const CombatStyleSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,8 +1,8 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { combat_techniques, usage_type } from "../_ActivatableCombat.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { combat_techniques, special_ability_usage_type } from "../_ActivatableCombat.js"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -16,7 +16,7 @@ export const CommandSpecialAbility = DB.Entity(import.meta.url, {
DB.Object({
levels,
nameBuilderRules,
usage_type,
usage_type: special_ability_usage_type,
select_options,
explicit_select_options,
maximum,
@@ -42,6 +42,7 @@ export const CommandSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -39,6 +39,7 @@ export const FamiliarSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -39,6 +39,7 @@ export const FatePointSexSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -42,6 +42,7 @@ export const FatePointSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { input, levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -43,6 +43,7 @@ export const GeneralSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -39,6 +39,7 @@ export const KarmaSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -2,7 +2,7 @@ import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { advanced } from "../_ActivatableAdvanced.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { AdvancedKarmaSpecialAbilityIdentifier } from "../_Identifier.js"
@@ -45,6 +45,7 @@ export const LiturgicalStyleSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+2 -1
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -39,6 +39,7 @@ export const LycantropicGift = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,8 +1,8 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { additionalName, levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { advanced } from "../_ActivatableAdvanced.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { AdvancedMagicalSpecialAbilityIdentifier } from "../_Identifier.js"
@@ -34,6 +34,7 @@ export const MagicStyleSpecialAbility = DB.Entity(import.meta.url, {
"MagicStyleSpecialAbility",
DB.Object({
name,
additionalName,
name_in_library,
rules,
ap_value_append,
@@ -45,6 +46,7 @@ export const MagicStyleSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+2
View File
@@ -1,6 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { effect, name, name_in_library } from "../_Activatable.js"
import { ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { activatableDisplayNameCustomizer } from "../_ActivatableNames.ts"
import { propertyOptional } from "../_ActivatableNonMundane.js"
import { OneTimeCostMap } from "../_ActivatableSkillCost.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -42,6 +43,7 @@ export const MagicalSign = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { input, levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -43,6 +43,7 @@ export const MagicalSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+9 -3
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import {
@@ -91,6 +91,11 @@ export const MagicalTradition = DB.Entity(import.meta.url, {
type: DB.String({ minLength: 1 }),
}),
name_in_library,
nameOfSpellcasters: DB.Required({
comment:
"The name of spellcasters of this tradition. This is used to derive special rules from the data set already for this tradition.",
type: DB.String({ minLength: 1 }),
}),
special_rules: DB.Required({
comment:
"The special rules of the tradition. They should be sorted like they are in the book.",
@@ -110,6 +115,7 @@ export const MagicalTradition = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -119,11 +125,11 @@ export const MagicalTradition = DB.Entity(import.meta.url, {
],
})
export const PrimaryAttribute = DB.TypeAlias(import.meta.url, {
const PrimaryAttribute = DB.TypeAlias(import.meta.url, {
name: "PrimaryAttribute",
type: () =>
DB.Object({
id: DB.Optional({
id: DB.Required({
comment: "The attributes identifier.",
type: AttributeIdentifier(),
}),
+2 -1
View File
@@ -2,7 +2,7 @@ import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { automatic_entries } from "../_ActivatableAutomatic.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -45,6 +45,7 @@ export const PactGift = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -50,6 +50,7 @@ export const ProtectiveWardingCircleSpecialAbility = DB.Entity(import.meta.url,
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+2 -1
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -39,6 +39,7 @@ export const Sermon = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -42,6 +42,7 @@ export const SexSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -39,6 +39,7 @@ export const SikaryanDrainSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
@@ -2,7 +2,7 @@ import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { advanced } from "../_ActivatableAdvanced.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { AdvancedSkillStyleSpecialAbilityIdentifier } from "../_IdentifierGroup.ts"
import { GeneralPrerequisites } from "../_Prerequisite.js"
@@ -42,6 +42,7 @@ export const SkillStyleSpecialAbility = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+2 -1
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -39,6 +39,7 @@ export const VampiricGift = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+2 -1
View File
@@ -1,7 +1,7 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum, name, name_in_library, rules } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import { activatableDisplayNameCustomizer, nameBuilderRules } from "../_ActivatableNames.ts"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
@@ -39,6 +39,7 @@ export const Vision = DB.Entity(import.meta.url, {
),
}),
instanceDisplayName: {},
instanceDisplayNameCustomizer: activatableDisplayNameCustomizer,
uniqueConstraints: [
{
entityMapKeyPath: "translations",
+1 -1
View File
@@ -16,7 +16,7 @@ export const Language = DB.Entity(import.meta.url, {
comment: "The continents this language is present on.",
type: DB.Array(DB.IncludeIdentifier(AssociatedContinent), { minItems: 1 }),
}),
specializations: DB.Optional({
specializations: DB.Required({
type: DB.ChildEntities(LanguageSpecialization),
}),
customSpecializations: DB.Optional({
@@ -1,20 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const ArcaneOrbEnchantment = DB.Entity(import.meta.url, {
name: "ArcaneOrbEnchantment",
@@ -34,23 +26,7 @@ export const ArcaneOrbEnchantment = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"ArcaneOrbEnchantment",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("ArcaneOrbEnchantment"),
}),
instanceDisplayName: {},
uniqueConstraints: [
@@ -1,20 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const AttireEnchantment = DB.Entity(import.meta.url, {
name: "AttireEnchantment",
@@ -34,23 +26,7 @@ export const AttireEnchantment = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"AttireEnchantment",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("AttireEnchantment"),
}),
instanceDisplayName: {},
uniqueConstraints: [
+5 -29
View File
@@ -1,20 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const Beutelzauber = DB.Entity(import.meta.url, {
name: "Beutelzauber",
@@ -34,23 +26,7 @@ export const Beutelzauber = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"Beutelzauber",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("Beutelzauber"),
}),
instanceDisplayName: {},
uniqueConstraints: [
@@ -1,20 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const BowlEnchantment = DB.Entity(import.meta.url, {
name: "BowlEnchantment",
@@ -34,23 +26,7 @@ export const BowlEnchantment = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"BowlEnchantment",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("BowlEnchantment"),
}),
instanceDisplayName: {},
uniqueConstraints: [
@@ -1,21 +1,13 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { BrewIdentifier } from "../_Identifier.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const CauldronEnchantment = DB.Entity(import.meta.url, {
name: "CauldronEnchantment",
@@ -40,23 +32,7 @@ export const CauldronEnchantment = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"CauldronEnchantment",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("CauldronEnchantment"),
}),
instanceDisplayName: {},
uniqueConstraints: [
@@ -1,20 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const ChronicleEnchantment = DB.Entity(import.meta.url, {
name: "ChronicleEnchantment",
@@ -34,23 +26,7 @@ export const ChronicleEnchantment = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"ChronicleEnchantment",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("ChronicleEnchantment"),
}),
instanceDisplayName: {},
uniqueConstraints: [
+5 -30
View File
@@ -1,21 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
ArcaneEnergyCost,
BindingCost,
bindingCost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { ArcaneEnergyCost, BindingCost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const DaggerRitual = DB.Entity(import.meta.url, {
name: "DaggerRitual",
@@ -37,23 +28,7 @@ export const DaggerRitual = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"DaggerRitual",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("DaggerRitual"),
}),
instanceDisplayName: {},
uniqueConstraints: [
@@ -1,20 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const FoolsHatEnchantment = DB.Entity(import.meta.url, {
name: "FoolsHatEnchantment",
@@ -36,23 +28,7 @@ export const FoolsHatEnchantment = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"FoolsHatEnchantment",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("FoolsHatEnchantment"),
}),
instanceDisplayName: {},
uniqueConstraints: [
+5 -29
View File
@@ -1,20 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const Haubenzauber = DB.Entity(import.meta.url, {
name: "Haubenzauber",
@@ -34,23 +26,7 @@ export const Haubenzauber = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"Haubenzauber",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("Haubenzauber"),
}),
instanceDisplayName: {},
uniqueConstraints: [
@@ -0,0 +1,36 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.js"
export const Hauerkettenzauber = DB.Entity(import.meta.url, {
name: "Hauerkettenzauber",
namePlural: "Hauerkettenzauber",
type: () =>
DB.Object({
levels,
nameBuilderRules,
maximum,
prerequisites: DB.Optional({
type: DB.IncludeIdentifier(GeneralPrerequisites),
}),
volume,
cost,
property: property(),
ap_value,
src,
translations: translations("Hauerkettenzauber"),
}),
instanceDisplayName: {},
uniqueConstraints: [
{
entityMapKeyPath: "translations",
keyPathInEntityMap: "name_in_library",
keyPathInEntityMapFallback: "name",
},
],
})
@@ -1,20 +1,12 @@
import * as DB from "tsondb/schema/dsl"
import { effect, levels, maximum, name, name_in_library } from "../_Activatable.js"
import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventurePointsValue.js"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.ts"
import {
aeCost,
bindingCost,
cost,
property,
volume,
volume_l10n,
} from "../_ActivatableNonMundane.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { explicit_select_options, select_options } from "../_ActivatableSelectOptions.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { NestedTranslationMap } from "../Locale.js"
import { Errata } from "../source/_Erratum.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.ts"
export const InstrumentEnchantment = DB.Entity(import.meta.url, {
name: "InstrumentEnchantment",
@@ -34,23 +26,7 @@ export const InstrumentEnchantment = DB.Entity(import.meta.url, {
property: property(),
ap_value,
src,
translations: NestedTranslationMap(
DB.Required,
"InstrumentEnchantment",
DB.Object({
name,
name_in_library,
effect,
bindingCost,
aeCost,
volume: volume_l10n,
ap_value_append,
ap_value: ap_value_l10n,
errata: DB.Optional({
type: DB.IncludeIdentifier(Errata),
}),
}),
),
translations: translations("InstrumentEnchantment"),
}),
instanceDisplayName: {},
uniqueConstraints: [
@@ -0,0 +1,37 @@
import * as DB from "tsondb/schema/dsl"
import { levels, maximum } from "../_Activatable.js"
import { ap_value } from "../_ActivatableAdventurePointsValue.js"
import { nameBuilderRules } from "../_ActivatableNames.js"
import { cost, property, volume } from "../_ActivatableNonMundane.js"
import { GeneralPrerequisites } from "../_Prerequisite.js"
import { src } from "../source/_PublicationRef.js"
import { translations } from "./_shared.js"
//Keulenzauber für Goblinzauberinnen
export const Keulenzauber = DB.Entity(import.meta.url, {
name: "Keulenzauber",
namePlural: "Keulenzauber",
type: () =>
DB.Object({
levels,
nameBuilderRules,
maximum,
prerequisites: DB.Optional({
type: DB.IncludeIdentifier(GeneralPrerequisites),
}),
volume,
cost,
property: property(),
ap_value,
src,
translations: translations("Keulenzauber"),
}),
instanceDisplayName: {},
uniqueConstraints: [
{
entityMapKeyPath: "translations",
keyPathInEntityMap: "name_in_library",
keyPathInEntityMapFallback: "name",
},
],
})

Some files were not shown because too many files have changed in this diff Show More