Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9718f7d341 | ||
|
|
0c8f3518ea | ||
|
|
3b3ae6f3a6 | ||
|
|
028e438909 | ||
|
|
04f2a32a5e | ||
|
|
0e25dbf4a7 | ||
|
|
7e977925b5 | ||
|
|
11cadd76ba | ||
|
|
249af59f6a | ||
|
|
bb7d59e8b7 | ||
|
|
1e30f55407 | ||
|
|
b70343ba6e | ||
|
|
3b522aa9d7 | ||
|
|
894fe21536 | ||
|
|
e89c4390be | ||
|
|
da1d2459db | ||
|
|
6c62616285 | ||
|
|
6c6d7a07fd | ||
|
|
9d97dd4ec9 | ||
|
|
27236a7588 | ||
|
|
959a5f1038 | ||
|
|
3a3af6e574 | ||
|
|
1d06407eb4 | ||
|
|
89c5a10597 | ||
|
|
f6bb84fcb6 | ||
|
|
64ee1cce6a | ||
|
|
500a2631b9 | ||
|
|
31798ca33f | ||
|
|
296962d3ce | ||
|
|
b5ece95103 | ||
|
|
88da9b1528 | ||
|
|
cdb86e9aa6 | ||
|
|
b9e4fff14c | ||
|
|
6c9f7a6ec2 | ||
|
|
a7b8e7ec0c | ||
|
|
13c0d5c6ba | ||
|
|
aa556a48c8 | ||
|
|
fbd29a6e93 | ||
|
|
9ed6e70645 | ||
|
|
af43af87de | ||
|
|
99fb31e053 | ||
|
|
4c2228b6d7 | ||
|
|
737fe3742c | ||
|
|
1f28470b8f | ||
|
|
d4ffbb9111 | ||
|
|
0284b1dbae | ||
|
|
47f9e890bb | ||
|
|
96d70f7237 | ||
|
|
a9ea59a802 | ||
|
|
ae45659ff9 | ||
|
|
2be0fb3c50 | ||
|
|
c3654151f0 | ||
|
|
64e7ed1035 | ||
|
|
84d5023ea3 | ||
|
|
c147d16130 | ||
|
|
97671ca215 | ||
|
|
7fc5fd144a | ||
|
|
d42242cc64 | ||
|
|
ce8f55b9d6 | ||
|
|
ee3490218d | ||
|
|
2b99d8c994 | ||
|
|
d7f8393384 | ||
|
|
1c8e84c082 | ||
|
|
e0d27d3f7b | ||
|
|
7afc6b0326 | ||
|
|
c2686593cb | ||
|
|
18ab60e356 | ||
|
|
21780be505 | ||
|
|
57b1916f21 | ||
|
|
7d32741cd6 | ||
|
|
0c13fbae99 | ||
|
|
4a6648e307 | ||
|
|
0e62d30607 | ||
|
|
669649ed64 | ||
|
|
ab075e11ff | ||
|
|
9a9a2bd6a1 | ||
|
|
28ffda4046 | ||
|
|
a41dbcfc4c | ||
|
|
002a807b5b | ||
|
|
2dd0be7197 | ||
|
|
35dbe49c60 | ||
|
|
78dcb9a737 | ||
|
|
72198eec2a | ||
|
|
2c531ce8df | ||
|
|
5c8a164428 | ||
|
|
849fca45db | ||
|
|
7d8bcd89ba | ||
|
|
daa049cea9 | ||
|
|
99466ed0ee | ||
|
|
750ddb1548 | ||
|
|
bd931ffcb6 |
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
Vendored
+2
-2
@@ -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": {
|
||||
|
||||
+271
@@ -2,6 +2,277 @@
|
||||
|
||||
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)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add Bannzeichen entity ([2dd0be7](https://github.com/elyukai/optolith-database-schema/commit/2dd0be71977a447248c6916c89d624d4290601e1)), closes [#135](https://github.com/elyukai/optolith-database-schema/issues/135) [#133](https://github.com/elyukai/optolith-database-schema/issues/133)
|
||||
* add goblin rituals entity ([78dcb9a](https://github.com/elyukai/optolith-database-schema/commit/78dcb9a737ca7c76370942168163b6b9ca3971ce)), closes [#132](https://github.com/elyukai/optolith-database-schema/issues/132) [#131](https://github.com/elyukai/optolith-database-schema/issues/131)
|
||||
|
||||
## [0.42.0](https://github.com/elyukai/optolith-database-schema/compare/v0.41.0...v0.42.0) (2026-03-23)
|
||||
|
||||
|
||||
### ⚠ BREAKING CHANGES
|
||||
|
||||
* adjust translations for 0.41.0 schema changes
|
||||
* do not confuse rules tab with rules term in entry texts
|
||||
* require hair and eye color specifications
|
||||
|
||||
### Features
|
||||
|
||||
* add familiars trick magical tradition restriction ([5c8a164](https://github.com/elyukai/optolith-database-schema/commit/5c8a164428d3e2a706bf07f106e1c7aecc8cb1af)), closes [#126](https://github.com/elyukai/optolith-database-schema/issues/126) [#106](https://github.com/elyukai/optolith-database-schema/issues/106)
|
||||
* adjust translations for 0.41.0 schema changes ([849fca4](https://github.com/elyukai/optolith-database-schema/commit/849fca45dbfcd48e8fa99a30ee375d37738c55f3))
|
||||
* do not confuse rules tab with rules term in entry texts ([7d8bcd8](https://github.com/elyukai/optolith-database-schema/commit/7d8bcd89baebcea6db20c442cb26aa48ea9268cc))
|
||||
* hair color label and hair color count ([750ddb1](https://github.com/elyukai/optolith-database-schema/commit/750ddb154824ab1e2de557084655297aa19e86fd)), closes [#116](https://github.com/elyukai/optolith-database-schema/issues/116)
|
||||
* require hair and eye color specifications ([99466ed](https://github.com/elyukai/optolith-database-schema/commit/99466ed0eec6676c0a8a0259bfc7480988284f41))
|
||||
* skill rating as check-result-based base value ([bd931ff](https://github.com/elyukai/optolith-database-schema/commit/bd931ffcb671e7b34a79d8d3f6b11da586a21859)), closes [#125](https://github.com/elyukai/optolith-database-schema/issues/125)
|
||||
|
||||
## [0.41.0](https://github.com/elyukai/optolith-database-schema/compare/v0.40.0...v0.41.0) (2026-03-21)
|
||||
|
||||
|
||||
|
||||
@@ -31,3 +31,16 @@ Make sure to always restart the editor when you make changes, as the database sc
|
||||
If you create branches in this repository, use either `feature/<topic>` or `fix/<topic>` as the branch name and replace `<topic>` with a kebab case version of what the branch is going to do. Branches are merged using squash merge, so commits within a pull request do not have to follow any naming convention, just do what you can work with best.
|
||||
|
||||
Alternatively, you can fork the repository and create pull requests from there.
|
||||
|
||||
## New entities
|
||||
|
||||
If you add new entities, there are some additional steps to take.
|
||||
|
||||
1. Add the corresponding identifier to the `src/types/_Identifier.ts` file. Just duplicate an existing one, adjust the referenced entity at the end and make sure the variable/function name is the entity name plus `Identifier` and is inserted into the list of identifiers in alphabetical order.
|
||||
2. Check `src/types/_IdentifierGroup.ts` if you need to add the entity to any existing identifier group. For example, if you add another special ability entity, add it to the `SpecialAbilityIdentifier` group; if it is a combat-related special ability, add it to the `CombatRelatedSpecialAbilityIdentifier` group as well.
|
||||
3. **If it is not a child entity:** Export the entity declaration alone from `src/types/index.ts`.
|
||||
4. **If it is not a child entity:** Add the entity declaration to the schema definition in `src/main.ts` in alphabetical order.
|
||||
|
||||
## Formatting and linting
|
||||
|
||||
This repository makes use of linting via ESLint and formatting via Prettier. It can be helpful to use available editor extensions when contributing to fix errors before they appear in your PR. Formatting and linting is checked for every pull request and must succeed in order to be able to accept your PR.
|
||||
|
||||
Generated
+249
-200
@@ -1,28 +1,28 @@
|
||||
{
|
||||
"name": "optolith-database-schema",
|
||||
"version": "0.41.0",
|
||||
"name": "@optolith/database-schema",
|
||||
"version": "0.53.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "optolith-database-schema",
|
||||
"version": "0.41.0",
|
||||
"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
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "optolith-database-schema",
|
||||
"version": "0.41.0",
|
||||
"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
@@ -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)
|
||||
|
||||
+11
@@ -45,10 +45,13 @@ export const schema = new Schema<TSONDBTypes>(
|
||||
Types.AttireEnchantment,
|
||||
Types.Attribute,
|
||||
Types.BandageOrRemedy,
|
||||
Types.Bannzeichen,
|
||||
Types.Beutelzauber,
|
||||
Types.Biome,
|
||||
Types.BlessedTradition,
|
||||
Types.Blessing,
|
||||
Types.Book,
|
||||
Types.BotanicRegion,
|
||||
Types.BowlEnchantment,
|
||||
Types.BrawlingSpecialAbility,
|
||||
Types.Brew,
|
||||
@@ -92,9 +95,13 @@ export const schema = new Schema<TSONDBTypes>(
|
||||
Types.GemOrPreciousStone,
|
||||
Types.GeneralSpecialAbility,
|
||||
Types.GeodeRitual,
|
||||
Types.GoblinRitual,
|
||||
Types.Guideline,
|
||||
Types.HairColor,
|
||||
Types.Hauerkettenzauber,
|
||||
Types.Haubenzauber,
|
||||
Types.HerbalAid,
|
||||
Types.HerbalPreservation,
|
||||
Types.HomunculusType,
|
||||
Types.IlluminationLightSource,
|
||||
Types.IlluminationRefillOrSupply,
|
||||
@@ -102,6 +109,7 @@ export const schema = new Schema<TSONDBTypes>(
|
||||
Types.JesterTrick,
|
||||
Types.Jewelry,
|
||||
Types.KarmaSpecialAbility,
|
||||
Types.Keulenzauber,
|
||||
Types.Krallenkettenzauber,
|
||||
Types.Kristallkugelzauber,
|
||||
Types.Laboratory,
|
||||
@@ -131,6 +139,7 @@ export const schema = new Schema<TSONDBTypes>(
|
||||
Types.PatronCategory,
|
||||
Types.PersonalityTrait,
|
||||
Types.PlayerType,
|
||||
Types.Plant,
|
||||
Types.Poison,
|
||||
Types.Profession,
|
||||
Types.Property,
|
||||
@@ -143,6 +152,7 @@ export const schema = new Schema<TSONDBTypes>(
|
||||
Types.RingEnchantment,
|
||||
Types.Ritual,
|
||||
Types.RopeOrChain,
|
||||
Types.Schweinetrommelzauber,
|
||||
Types.Script,
|
||||
Types.Sermon,
|
||||
Types.Service,
|
||||
@@ -160,6 +170,7 @@ export const schema = new Schema<TSONDBTypes>(
|
||||
Types.StaffEnchantment,
|
||||
Types.State,
|
||||
Types.Stationery,
|
||||
Types.SubBiome,
|
||||
Types.Subject,
|
||||
Types.Talisman,
|
||||
Types.TargetCategory,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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) }),
|
||||
}),
|
||||
})
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -6,10 +6,14 @@ import {
|
||||
} from "./_ActivatableSkillCost.js"
|
||||
import {
|
||||
DurationUnitValue,
|
||||
FixedDuration,
|
||||
ExpressionBasedDuration,
|
||||
IndefiniteDuration,
|
||||
} from "./_ActivatableSkillDuration.js"
|
||||
import { AnimalTypeIdentifier, PropertyIdentifier } from "./_Identifier.js"
|
||||
import {
|
||||
AnimalTypeIdentifier,
|
||||
MagicalTraditionIdentifier,
|
||||
PropertyIdentifier,
|
||||
} from "./_Identifier.js"
|
||||
import { ResponsiveText } from "./_ResponsiveText.js"
|
||||
import { NestedTranslationMap } from "./Locale.js"
|
||||
import { Errata } from "./source/_Erratum.js"
|
||||
@@ -25,9 +29,15 @@ export const FamiliarsTrick = DB.Entity(import.meta.url, {
|
||||
animal_types: DB.Required({
|
||||
comment: `The animal types this trick is available to. Either it is available to all or only a list of specific animal types.
|
||||
|
||||
If no animal types are given, the animal disease applies to all animal types.`,
|
||||
If no animal types are given, the familiars trick applies to all animal types.`,
|
||||
type: DB.Array(AnimalTypeIdentifier(), { uniqueItems: true }),
|
||||
}),
|
||||
traditions: DB.Optional({
|
||||
comment: `The magical traditions whose familiars can use this trick. Either it is available to all or only a list of specific traditions.
|
||||
|
||||
If no traditions are given, the familiars trick is not restricted by the magical tradition at all.`,
|
||||
type: DB.Array(MagicalTraditionIdentifier(), { uniqueItems: true, minItems: 1 }),
|
||||
}),
|
||||
parameters: DB.Required({
|
||||
comment: "Measurable parameters of a familiar’s trick.",
|
||||
type: DB.IncludeIdentifier(FamiliarsTrickPerformanceParameters),
|
||||
@@ -178,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
@@ -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(),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
+25
-6
@@ -101,7 +101,7 @@ export const Locale = DB.Entity(import.meta.url, {
|
||||
"Personal Data": null,
|
||||
"Character Sheet": null,
|
||||
"Pact": null,
|
||||
"Rules": null,
|
||||
"Rule Set": null,
|
||||
"Race, Culture & Profession": null,
|
||||
"Race": null,
|
||||
"Culture": null,
|
||||
@@ -970,6 +970,7 @@ export const Locale = DB.Entity(import.meta.url, {
|
||||
"Object": null,
|
||||
|
||||
"Effect": null,
|
||||
"Rules": null,
|
||||
"Casting Time": null,
|
||||
"Ritual Time": null,
|
||||
"Liturgical Time": null,
|
||||
@@ -1041,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,
|
||||
@@ -1421,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,
|
||||
@@ -1433,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,
|
||||
@@ -1633,6 +1648,8 @@ export const Locale = DB.Entity(import.meta.url, {
|
||||
".input {$value :number} {{{$value}%}}": null,
|
||||
"Animal Types": null,
|
||||
"Communicability to Intelligent Creatures": null,
|
||||
"childhood disease": null,
|
||||
"magical disease": null,
|
||||
|
||||
// personality traits
|
||||
"Can be combined with": null,
|
||||
@@ -1660,10 +1677,7 @@ export const Locale = DB.Entity(import.meta.url, {
|
||||
"depends on spent AE": null,
|
||||
|
||||
// races
|
||||
"Life Point Base Value": null,
|
||||
"Spirit Base Value": null,
|
||||
"Toughness Base Value": null,
|
||||
"Movement Base Value": null,
|
||||
"{$derivedCharacteristic} Base Value": null,
|
||||
"Attribute Adjustments": null,
|
||||
"one attribute of your choice": null,
|
||||
"Common Cultures": null,
|
||||
@@ -1707,12 +1721,14 @@ export const Locale = DB.Entity(import.meta.url, {
|
||||
"no Skill Specialization for a {$skillOfGroup}": null,
|
||||
".input {$count :number} {{{$count} of the following combat techniques {$rating}}}": null,
|
||||
".input {$count :number} {{{$previous}, {$count} others {$rating}}}": null,
|
||||
"{$previous}, all others {$rating}": null,
|
||||
"{$previous}, the others {$rating}": null,
|
||||
"Curses totaling {$apValue} AP": null,
|
||||
"no Curses totaling {$apValue} AP": null,
|
||||
"Liturgies totaling {$apValue} AP": null,
|
||||
"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,
|
||||
@@ -1725,6 +1741,9 @@ export const Locale = DB.Entity(import.meta.url, {
|
||||
"Enhancements": null,
|
||||
"SR {$value}": null,
|
||||
".input {$hiddenCount :number} {{Prerequisites}}": null,
|
||||
"Spell Enhancement {$spell}": null,
|
||||
"Ritual Enhancement {$ritual}": null,
|
||||
"Liturgical Enhancement {$liturgicalChantOrCeremony}": null,
|
||||
|
||||
// Library Entry Subtitles
|
||||
"Profession Package": null,
|
||||
|
||||
@@ -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" }),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -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.",
|
||||
|
||||
+68
-50
@@ -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,37 +31,10 @@ export const Race = DB.Entity(import.meta.url, {
|
||||
comment: "The race’s base values.",
|
||||
type: DB.IncludeIdentifier(BaseValues),
|
||||
}),
|
||||
automatic_advantages: DB.Optional({
|
||||
hairColorCount: 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 },
|
||||
),
|
||||
"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.",
|
||||
type: DB.Integer({ minimum: 2 }),
|
||||
}),
|
||||
weight: DB.Required({
|
||||
comment: "Configuration for random weight generation.",
|
||||
@@ -101,24 +75,9 @@ export const Race = DB.Entity(import.meta.url, {
|
||||
comment: "The race’s 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.",
|
||||
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.",
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
errata: DB.Optional({
|
||||
@@ -237,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 }),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -306,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(
|
||||
@@ -334,12 +332,12 @@ export const RaceVariant = DB.Entity(import.meta.url, {
|
||||
{ minItems: 1 },
|
||||
),
|
||||
}),
|
||||
hair_color: DB.Optional({
|
||||
hair_color: DB.Required({
|
||||
comment:
|
||||
"An array containing 20 (numeric) hair color identifiers. The array also represents the 20-sided die for a random hair color.",
|
||||
type: DB.Array(HairColorIdentifier(), { minItems: 20, maxItems: 20 }),
|
||||
}),
|
||||
eye_color: DB.Optional({
|
||||
eye_color: DB.Required({
|
||||
comment:
|
||||
"An array containing 20 (numeric) eye color identifiers. The array also represents the 20-sided die for a random eye color.",
|
||||
type: DB.Array(EyeColorIdentifier(), { minItems: 20, maxItems: 20 }),
|
||||
@@ -357,6 +355,26 @@ export const RaceVariant = DB.Entity(import.meta.url, {
|
||||
"The race variant’s 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
@@ -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",
|
||||
|
||||
@@ -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 }),
|
||||
|
||||
@@ -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 }),
|
||||
|
||||
@@ -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 }
|
||||
}
|
||||
|
||||
@@ -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) }),
|
||||
}),
|
||||
})
|
||||
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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,14 +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 }),
|
||||
}),
|
||||
})
|
||||
|
||||
const CheckResultArithmetic = DB.Enum(import.meta.url, {
|
||||
name: "CheckResultArithmetic",
|
||||
comment: "Defines how the the `value` is set off against the check result.",
|
||||
@@ -32,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),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -56,7 +56,7 @@ const ModifiableOneTimeCost = DB.TypeAlias(import.meta.url, {
|
||||
}),
|
||||
})
|
||||
|
||||
const NonModifiableOneTimeCost = DB.TypeAlias(import.meta.url, {
|
||||
export const NonModifiableOneTimeCost = DB.TypeAlias(import.meta.url, {
|
||||
name: "NonModifiableOneTimeCost",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
@@ -247,7 +247,7 @@ const ModifiableSustainedCost = DB.TypeAlias(import.meta.url, {
|
||||
}),
|
||||
})
|
||||
|
||||
const NonModifiableSustainedCost = DB.TypeAlias(import.meta.url, {
|
||||
export const NonModifiableSustainedCost = DB.TypeAlias(import.meta.url, {
|
||||
name: "NonModifiableSustainedCost",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
@@ -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",
|
||||
|
||||
@@ -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 }),
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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 advantage’s or disadvantage’s 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 }) }),
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -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,30 +44,36 @@ 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"
|
||||
import { Tribe } from "./magicalActions/AnimistPower_Tribe.js"
|
||||
import { Bannzeichen } from "./magicalActions/Bannzeichen.js"
|
||||
import { Curse } from "./magicalActions/Curse.js"
|
||||
import { DominationRitual } from "./magicalActions/DominationRitual.js"
|
||||
import { ElvenMagicalSong } from "./magicalActions/ElvenMagicalSong.js"
|
||||
import { GeodeRitual } from "./magicalActions/GeodeRitual.js"
|
||||
import { GoblinRitual } from "./magicalActions/GoblinRitual.js"
|
||||
import { JesterTrick } from "./magicalActions/JesterTrick.js"
|
||||
import { MagicalDance } from "./magicalActions/MagicalDance.js"
|
||||
import { MagicalMelody } from "./magicalActions/MagicalMelody.js"
|
||||
@@ -140,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"
|
||||
@@ -183,7 +194,9 @@ export const AspectIdentifier: () => R = () => R(Aspect)
|
||||
export const AttireEnchantmentIdentifier: () => R = () => R(AttireEnchantment)
|
||||
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)
|
||||
@@ -231,9 +244,13 @@ export const GeneralSelectOptionIdentifier: () => R = () => R(GeneralSelectOptio
|
||||
export { GeneralSelectOptionIdentifier as GeneralIdentifier }
|
||||
export const GeneralSpecialAbilityIdentifier: () => R = () => R(GeneralSpecialAbility)
|
||||
export const GeodeRitualIdentifier: () => R = () => R(GeodeRitual)
|
||||
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)
|
||||
@@ -241,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)
|
||||
@@ -274,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)
|
||||
@@ -287,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)
|
||||
@@ -309,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)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { sortObjectKeys } from "@elyukai/utils/object"
|
||||
import * as DB from "tsondb/schema/dsl"
|
||||
import {
|
||||
AdvancedCombatSpecialAbilityIdentifier,
|
||||
@@ -20,6 +21,7 @@ import {
|
||||
AttireEnchantmentIdentifier,
|
||||
AttributeIdentifier,
|
||||
BandageOrRemedyIdentifier,
|
||||
BannzeichenIdentifier,
|
||||
BeutelzauberIdentifier,
|
||||
BlessedTraditionIdentifier,
|
||||
BlessingIdentifier,
|
||||
@@ -59,13 +61,16 @@ import {
|
||||
GeneralIdentifier,
|
||||
GeneralSpecialAbilityIdentifier,
|
||||
GeodeRitualIdentifier,
|
||||
GoblinRitualIdentifier,
|
||||
HaubenzauberIdentifier,
|
||||
HauerkettenZauberIdentifier,
|
||||
IlluminationLightSourceIdentifier,
|
||||
IlluminationRefillOrSupplyIdentifier,
|
||||
InstrumentEnchantmentIdentifier,
|
||||
JesterTrickIdentifier,
|
||||
JewelryIdentifier,
|
||||
KarmaSpecialAbilityIdentifier,
|
||||
KeulenzauberIdentifier,
|
||||
KrallenkettenzauberIdentifier,
|
||||
KristallkugelzauberIdentifier,
|
||||
LaboratoryIdentifier,
|
||||
@@ -98,6 +103,7 @@ import {
|
||||
RingEnchantmentIdentifier,
|
||||
RitualIdentifier,
|
||||
RopeOrChainIdentifier,
|
||||
SchweinetrommelzauberIdentifier,
|
||||
ScriptIdentifier,
|
||||
SermonIdentifier,
|
||||
SexPracticeIdentifier,
|
||||
@@ -162,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: () => ({
|
||||
@@ -337,6 +358,7 @@ export const LiturgyIdentifier = DB.Enum(import.meta.url, {
|
||||
export const MagicalActionIdentifier = DB.Enum(import.meta.url, {
|
||||
name: "MagicalActionIdentifier",
|
||||
values: () => ({
|
||||
Bannzeichen: DB.EnumCase({ type: BannzeichenIdentifier() }),
|
||||
Curse: DB.EnumCase({ type: CurseIdentifier() }),
|
||||
ElvenMagicalSong: DB.EnumCase({ type: ElvenMagicalSongIdentifier() }),
|
||||
DominationRitual: DB.EnumCase({ type: DominationRitualIdentifier() }),
|
||||
@@ -345,6 +367,7 @@ export const MagicalActionIdentifier = DB.Enum(import.meta.url, {
|
||||
JesterTrick: DB.EnumCase({ type: JesterTrickIdentifier() }),
|
||||
AnimistPower: DB.EnumCase({ type: AnimistPowerIdentifier() }),
|
||||
GeodeRitual: DB.EnumCase({ type: GeodeRitualIdentifier() }),
|
||||
GoblinRitual: DB.EnumCase({ type: GoblinRitualIdentifier() }),
|
||||
ZibiljaRitual: DB.EnumCase({ type: ZibiljaRitualIdentifier() }),
|
||||
MagicalRune: DB.EnumCase({ type: MagicalRuneIdentifier() }),
|
||||
}),
|
||||
@@ -403,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() }),
|
||||
|
||||
@@ -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, {
|
||||
|
||||
@@ -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),
|
||||
}),
|
||||
|
||||
@@ -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 aid�s 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),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
@@ -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" }),
|
||||
}),
|
||||
}),
|
||||
),
|
||||
}),
|
||||
})
|
||||
@@ -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),
|
||||
}),
|
||||
|
||||
@@ -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: () => ({
|
||||
|
||||
@@ -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 collector’s 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 collector’s value.",
|
||||
values: () => ({
|
||||
Constant: DB.EnumCase({
|
||||
comment: "The collector’s value is a fixed price in silverthalers.",
|
||||
type: DB.IncludeIdentifier(ConstantCollectorsValue),
|
||||
}),
|
||||
Minimum: DB.EnumCase({
|
||||
comment:
|
||||
"The collector’s 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 collector’s 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 collector’s 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
|
||||
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
],
|
||||
],
|
||||
})
|
||||
@@ -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",
|
||||
},
|
||||
],
|
||||
})
|
||||
+12
-1
@@ -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"
|
||||
@@ -62,10 +68,12 @@ export { LiturgicalChant } from "./LiturgicalChant.js"
|
||||
export { Locale } from "./Locale.js"
|
||||
export { AnimistPower } from "./magicalActions/AnimistPower.js"
|
||||
export { Tribe } from "./magicalActions/AnimistPower_Tribe.js"
|
||||
export { Bannzeichen } from "./magicalActions/Bannzeichen.js"
|
||||
export { Curse } from "./magicalActions/Curse.js"
|
||||
export { DominationRitual } from "./magicalActions/DominationRitual.js"
|
||||
export { ElvenMagicalSong } from "./magicalActions/ElvenMagicalSong.js"
|
||||
export { GeodeRitual } from "./magicalActions/GeodeRitual.js"
|
||||
export { GoblinRitual } from "./magicalActions/GoblinRitual.js"
|
||||
export { JesterTrick } from "./magicalActions/JesterTrick.js"
|
||||
export { MagicalDance } from "./magicalActions/MagicalDance.js"
|
||||
export { MagicalMelody } from "./magicalActions/MagicalMelody.js"
|
||||
@@ -140,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"
|
||||
|
||||
@@ -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) }),
|
||||
}),
|
||||
})
|
||||
|
||||
|
||||
@@ -0,0 +1,276 @@
|
||||
import * as DB from "tsondb/schema/dsl"
|
||||
import { name_in_library } from "../_Activatable.js"
|
||||
import { OneTimeCostMap } from "../_ActivatableSkillCost.ts"
|
||||
import { ExpressionBasedDuration } from "../_ActivatableSkillDuration.js"
|
||||
import { ActivatableSkillEffect } from "../_ActivatableSkillEffect.js"
|
||||
import { BannzeichenIdentifier, PropertyIdentifier } from "../_Identifier.js"
|
||||
import { ImprovementCost } from "../_ImprovementCost.js"
|
||||
import { ResponsiveText, ResponsiveTextOptional } from "../_ResponsiveText.js"
|
||||
import { SkillCheck } from "../_SkillCheck.js"
|
||||
import { NestedTranslationMap } from "../Locale.js"
|
||||
import { Errata } from "../source/_Erratum.js"
|
||||
import { src } from "../source/_PublicationRef.js"
|
||||
|
||||
export const Bannzeichen = DB.Entity(import.meta.url, {
|
||||
name: "Bannzeichen",
|
||||
namePlural: "Bannzeichen",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
options: DB.Required({
|
||||
comment: `The options the Bannzeichen has, if any.
|
||||
|
||||
If there are multiple options, the Bannzeichen may be activated for each option, that is, multiple times.`,
|
||||
type: DB.ChildEntities(BannzeichenOption),
|
||||
}),
|
||||
check: DB.Required({
|
||||
comment: "Lists the linked three attributes used to make a skill check.",
|
||||
type: DB.IncludeIdentifier(SkillCheck),
|
||||
}),
|
||||
parameters: DB.Required({
|
||||
comment: "Measurable parameters of a Bannzeichen.",
|
||||
type: DB.IncludeIdentifier(BannzeichenPerformanceParameters),
|
||||
}),
|
||||
property: DB.Required({
|
||||
comment: "The associated property.",
|
||||
type: PropertyIdentifier(),
|
||||
}),
|
||||
improvement_cost: DB.Required({
|
||||
comment: "States which column is used to improve the skill.",
|
||||
type: DB.IncludeIdentifier(BannzeichenImprovementCost),
|
||||
}),
|
||||
src,
|
||||
translations: NestedTranslationMap(
|
||||
DB.Required,
|
||||
"Bannzeichen",
|
||||
DB.Object({
|
||||
name: DB.Required({
|
||||
comment: `The Bannzeichen’s name.
|
||||
|
||||
If the Bannzeichen has an option, the option’s name will/should not be included in the name as well as its surrounding parenthesis. It will/should be combined on demand.`,
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
name_in_library,
|
||||
native_name: DB.Optional({
|
||||
comment:
|
||||
"The native name of the Bannzeichen. It has to be specified unless it is defined by an option.",
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
effect: DB.Required({
|
||||
comment:
|
||||
"The effect description may be either a plain text or a text that is divided by a list of effects for each quality level. It may also be a list for each two quality levels.",
|
||||
type: DB.IncludeIdentifier(ActivatableSkillEffect),
|
||||
}),
|
||||
cost: DB.Optional({
|
||||
comment: "The ae-cost of the Bannzeichen",
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
crafting_time: DB.Optional({
|
||||
comment: "The crafting time of the Bannzeichen",
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
duration: DB.Optional({
|
||||
comment: "The duration of the Bannzeichen",
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
errata: DB.Optional({
|
||||
type: DB.IncludeIdentifier(Errata),
|
||||
}),
|
||||
}),
|
||||
),
|
||||
}),
|
||||
instanceDisplayName: {},
|
||||
uniqueConstraints: [
|
||||
{
|
||||
entityMapKeyPath: "translations",
|
||||
keyPathInEntityMap: "name",
|
||||
},
|
||||
],
|
||||
})
|
||||
|
||||
const BannzeichenPerformanceParameters = DB.TypeAlias(import.meta.url, {
|
||||
name: "BannzeichenPerformanceParameters",
|
||||
comment: "Measurable parameters of a Bannzeichen.",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
cost: DB.Required({
|
||||
comment: "The AE cost.",
|
||||
type: DB.IncludeIdentifier(BannzeichenCost),
|
||||
}),
|
||||
crafting_time: DB.Required({
|
||||
comment: "The crafting time.",
|
||||
type: DB.IncludeIdentifier(BannzeichenCraftingTime),
|
||||
}),
|
||||
duration: DB.Required({
|
||||
comment: "The duration.",
|
||||
type: DB.IncludeIdentifier(BannzeichenDuration),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const BannzeichenCost = DB.Enum(import.meta.url, {
|
||||
name: "BannzeichenCost",
|
||||
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 }),
|
||||
}),
|
||||
})
|
||||
|
||||
const SingleBannzeichenCost = DB.TypeAlias(import.meta.url, {
|
||||
name: "SingleBannzeichenCost",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
value: DB.Required({
|
||||
comment: "The AE cost value.",
|
||||
type: DB.Integer({ minimum: 1 }),
|
||||
}),
|
||||
translations: NestedTranslationMap(
|
||||
DB.Optional,
|
||||
"SingleBannzeichenCost",
|
||||
DB.Object({
|
||||
note: DB.Required({
|
||||
comment: "A note, appended to the generated string in parenthesis.",
|
||||
type: DB.IncludeIdentifier(ResponsiveTextOptional),
|
||||
}),
|
||||
}),
|
||||
),
|
||||
}),
|
||||
})
|
||||
|
||||
const BannzeichenCostDisjunction = DB.TypeAlias(import.meta.url, {
|
||||
name: "BannzeichenCostDisjunction",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
list: DB.Required({
|
||||
comment: "A set of possible AE cost values.",
|
||||
type: DB.Array(DB.IncludeIdentifier(SingleBannzeichenCost), {
|
||||
minItems: 2,
|
||||
uniqueItems: true,
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const BannzeichenCraftingTimePerCountable = DB.TypeAlias(import.meta.url, {
|
||||
name: "BannzeichenCraftingTimePerCountable",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
translations: NestedTranslationMap(
|
||||
DB.Required,
|
||||
"BannzeichenCraftingTimePerCountable",
|
||||
DB.Object({
|
||||
countable: DB.Required({
|
||||
comment: "The countable entity name.",
|
||||
type: DB.IncludeIdentifier(ResponsiveText),
|
||||
}),
|
||||
}),
|
||||
),
|
||||
}),
|
||||
})
|
||||
|
||||
const BannzeichenCraftingTime = DB.TypeAlias(import.meta.url, {
|
||||
name: "BannzeichenCraftingTime",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
value: DB.Required({
|
||||
comment: "The crafting time in actions.",
|
||||
type: DB.Integer({ minimum: 1 }),
|
||||
}),
|
||||
per: DB.Optional({
|
||||
comment:
|
||||
"The crafting time has to be per a specific countable entity, e.g. `8 Actions per person`.",
|
||||
type: DB.IncludeIdentifier(BannzeichenCraftingTimePerCountable),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const BannzeichenDuration = DB.TypeAlias(import.meta.url, {
|
||||
name: "BannzeichenDuration",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
slow: DB.Required({
|
||||
comment: "The duration on slow Bannzeichen application.",
|
||||
type: DB.IncludeIdentifier(ExpressionBasedDuration),
|
||||
}),
|
||||
fast: DB.Required({
|
||||
comment: "The duration on fast Bannzeichen application.",
|
||||
type: DB.IncludeIdentifier(ExpressionBasedDuration),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const BannzeichenImprovementCost = DB.Enum(import.meta.url, {
|
||||
name: "BannzeichenImprovementCost",
|
||||
values: () => ({
|
||||
Constant: DB.EnumCase({ type: DB.IncludeIdentifier(ImprovementCost) }),
|
||||
DerivedFromOption: DB.EnumCase({ type: null }),
|
||||
}),
|
||||
})
|
||||
|
||||
export const BannzeichenOption = DB.Entity(import.meta.url, {
|
||||
name: "BannzeichenOption",
|
||||
namePlural: "BannzeichenOptions",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
parent: DB.Required({
|
||||
comment: "The Bannzeichen this option belongs to.",
|
||||
type: BannzeichenIdentifier(),
|
||||
}),
|
||||
cost: DB.Optional({
|
||||
comment: "The option-specific AE cost.",
|
||||
type: DB.IncludeIdentifier(SingleBannzeichenCost),
|
||||
}),
|
||||
improvement_cost: DB.Optional({
|
||||
comment: "The option-specific improvement cost.",
|
||||
type: DB.IncludeIdentifier(ImprovementCost),
|
||||
}),
|
||||
suboption: DB.Optional({
|
||||
type: DB.IncludeIdentifier(BannzeichenSuboption),
|
||||
}),
|
||||
translations: NestedTranslationMap(
|
||||
DB.Required,
|
||||
"BannzeichenOption",
|
||||
DB.Object({
|
||||
name: DB.Required({
|
||||
comment: `The Bannzeichen option’s name.
|
||||
|
||||
The surrounding parenthesis will/should not be included, they will/should be generated.`,
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
}),
|
||||
),
|
||||
}),
|
||||
parentReferenceKey: "parent",
|
||||
instanceDisplayName: {},
|
||||
})
|
||||
|
||||
const BannzeichenSuboption = DB.Enum(import.meta.url, {
|
||||
name: "BannzeichenSuboption",
|
||||
values: () => ({
|
||||
Custom: DB.EnumCase({
|
||||
comment: "The sub-option may be defined by the user (as a arbitrary text).",
|
||||
type: DB.IncludeIdentifier(CustomBannzeichenSuboption),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const CustomBannzeichenSuboption = DB.TypeAlias(import.meta.url, {
|
||||
name: "CustomBannzeichenSuboption",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
translations: NestedTranslationMap(
|
||||
DB.Required,
|
||||
"CustomBannzeichenSuboption",
|
||||
DB.Object(
|
||||
{
|
||||
examples: DB.Optional({
|
||||
comment: "One or more examples for the suboption.",
|
||||
type: DB.Array(DB.String({ minLength: 1 }), { minItems: 1, uniqueItems: true }),
|
||||
}),
|
||||
},
|
||||
{ minProperties: 1 },
|
||||
),
|
||||
),
|
||||
}),
|
||||
})
|
||||
@@ -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) }),
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -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,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) }),
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -0,0 +1,225 @@
|
||||
import * as DB from "tsondb/schema/dsl"
|
||||
import { OldParameter } from "../_ActivatableSkill.js"
|
||||
import { NonModifiableOneTimeCost, NonModifiableSustainedCost } from "../_ActivatableSkillCost.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"
|
||||
|
||||
export const GoblinRitual = DB.Entity(import.meta.url, {
|
||||
name: "GoblinRitual",
|
||||
namePlural: "GoblinRituals",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
check: DB.Required({
|
||||
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 a goblin ritual.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualPerformanceParameters),
|
||||
}),
|
||||
target: DB.Required({
|
||||
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(),
|
||||
}),
|
||||
improvement_cost: DB.Required({
|
||||
comment: "States which column is used to improve the skill.",
|
||||
type: DB.IncludeIdentifier(ImprovementCost),
|
||||
}),
|
||||
src,
|
||||
translations: NestedTranslationMap(
|
||||
DB.Required,
|
||||
"GoblinRitual",
|
||||
DB.Object({
|
||||
name: DB.Required({
|
||||
comment: "The goblin ritual’s name.",
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
effect: DB.Required({
|
||||
comment:
|
||||
"The effect description may be either a plain text or a text that is divided by a list of effects for each quality level. It may also be a list for each two quality levels.",
|
||||
type: DB.IncludeIdentifier(ActivatableSkillEffect),
|
||||
}),
|
||||
casting_time: DB.Optional({
|
||||
isDeprecated: true,
|
||||
type: DB.IncludeIdentifier(OldParameter),
|
||||
}),
|
||||
cost: DB.Optional({
|
||||
isDeprecated: true,
|
||||
type: DB.IncludeIdentifier(OldParameter),
|
||||
}),
|
||||
range: DB.Optional({
|
||||
isDeprecated: true,
|
||||
type: DB.IncludeIdentifier(OldParameter),
|
||||
}),
|
||||
duration: DB.Optional({
|
||||
isDeprecated: true,
|
||||
type: DB.IncludeIdentifier(OldParameter),
|
||||
}),
|
||||
target: DB.Optional({
|
||||
isDeprecated: true,
|
||||
type: DB.String({ minLength: 1 }),
|
||||
}),
|
||||
errata: DB.Optional({
|
||||
type: DB.IncludeIdentifier(Errata),
|
||||
}),
|
||||
}),
|
||||
),
|
||||
}),
|
||||
instanceDisplayName: {},
|
||||
uniqueConstraints: [
|
||||
{
|
||||
entityMapKeyPath: "translations",
|
||||
keyPathInEntityMap: "name",
|
||||
},
|
||||
],
|
||||
})
|
||||
|
||||
const GoblinRitualPerformanceParameters = DB.Enum(import.meta.url, {
|
||||
name: "GoblinRitualPerformanceParameters",
|
||||
comment: "Measurable parameters of a goblin ritual.",
|
||||
values: () => ({
|
||||
OneTime: DB.EnumCase({ type: DB.IncludeIdentifier(GoblinRitualOneTimePerformanceParameters) }),
|
||||
Sustained: DB.EnumCase({
|
||||
type: DB.IncludeIdentifier(GoblinRitualSustainedPerformanceParameters),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const GoblinRitualSustainedPerformanceParameters = DB.TypeAlias(import.meta.url, {
|
||||
name: "GoblinRitualSustainedPerformanceParameters",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
casting_time: DB.Required({
|
||||
comment: "The casting time.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualCastingTime),
|
||||
}),
|
||||
cost: DB.Required({
|
||||
comment: "The AE cost.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualSustainedCost),
|
||||
}),
|
||||
range: DB.Required({
|
||||
comment: "The range.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualRange),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const GoblinRitualOneTimePerformanceParameters = DB.TypeAlias(import.meta.url, {
|
||||
name: "GoblinRitualOneTimePerformanceParameters",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
casting_time: DB.Required({
|
||||
comment: "The casting time.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualCastingTime),
|
||||
}),
|
||||
cost: DB.Required({
|
||||
comment: "The AE cost.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualOneTimeCost),
|
||||
}),
|
||||
range: DB.Required({
|
||||
comment: "The range.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualRange),
|
||||
}),
|
||||
duration: DB.Required({
|
||||
comment: "The duration.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualDuration),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const GoblinRitualCastingTime = DB.TypeAlias(import.meta.url, {
|
||||
name: "GoblinRitualCastingTime",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
value: DB.Required({
|
||||
type: DB.Integer({ minimum: 1 }),
|
||||
}),
|
||||
unit: DB.Required({
|
||||
type: DB.IncludeIdentifier(GoblinRitualCastingTimeUnit),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
const GoblinRitualCastingTimeUnit = DB.Enum(import.meta.url, {
|
||||
name: "GoblinRitualCastingTimeUnit",
|
||||
values: () => ({
|
||||
Actions: DB.EnumCase({ type: null }),
|
||||
Minutes: DB.EnumCase({ type: null }),
|
||||
Hours: DB.EnumCase({ type: null }),
|
||||
}),
|
||||
})
|
||||
|
||||
const GoblinRitualOneTimeCost = DB.TypeAlias(import.meta.url, {
|
||||
name: "GoblinRitualOneTimeCost",
|
||||
type: () => DB.IncludeIdentifier(NonModifiableOneTimeCost),
|
||||
})
|
||||
|
||||
const GoblinRitualSustainedCost = DB.TypeAlias(import.meta.url, {
|
||||
name: "GoblinRitualSustainedCost",
|
||||
type: () => DB.IncludeIdentifier(NonModifiableSustainedCost),
|
||||
})
|
||||
|
||||
const GoblinRitualRange = DB.TypeAlias(import.meta.url, {
|
||||
name: "GoblinRitualRange",
|
||||
type: () =>
|
||||
DB.Object({
|
||||
value: DB.Required({
|
||||
comment: "The range value.",
|
||||
type: DB.IncludeIdentifier(GoblinRitualRangeValue),
|
||||
}),
|
||||
translations: NestedTranslationMap(
|
||||
DB.Optional,
|
||||
"GoblinRitualRange",
|
||||
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 GoblinRitualRangeValue = DB.Enum(import.meta.url, {
|
||||
name: "GoblinRitualRangeValue",
|
||||
values: () => ({
|
||||
Sight: DB.EnumCase({ type: null }),
|
||||
Self: DB.EnumCase({ type: null }),
|
||||
Touch: DB.EnumCase({ type: null }),
|
||||
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedRange) }),
|
||||
}),
|
||||
})
|
||||
|
||||
const GoblinRitualDuration = DB.Enum(import.meta.url, {
|
||||
name: "GoblinRitualDuration",
|
||||
values: () => ({
|
||||
Immediate: DB.EnumCase({ type: null }),
|
||||
Expression: DB.EnumCase({ type: DB.IncludeIdentifier(ExpressionBasedDuration) }),
|
||||
}),
|
||||
})
|
||||
@@ -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),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -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 property�s 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",
|
||||
|
||||
@@ -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 tradition’s aspects, if any.",
|
||||
type: DB.Array(AspectIdentifier(), { minItems: 2, maxItems: 2 }),
|
||||
}),
|
||||
primaryBlessing: DB.Optional({
|
||||
comment:
|
||||
"The tradition’s 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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 attribute’s identifier.",
|
||||
type: AttributeIdentifier(),
|
||||
}),
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -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: [
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user