@opencharacter/wwn-srd 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +41 -3
  2. package/content/classes/mage.yaml +2 -14
  3. package/content/foci/lucky.yaml +3 -2
  4. package/content/foci/traditional-education.yaml +1 -1
  5. package/content/partials/accursed.yaml +1 -0
  6. package/content/partials/bard.yaml +1 -0
  7. package/content/partials/beastmaster.yaml +1 -0
  8. package/content/partials/blood-priest.yaml +1 -0
  9. package/content/partials/duelist.yaml +1 -0
  10. package/content/partials/healer.yaml +1 -0
  11. package/content/partials/mage.yaml +2 -23
  12. package/content/partials/mageslayer.yaml +1 -0
  13. package/content/partials/skinshifter.yaml +1 -0
  14. package/content/partials/thought-noble.yaml +1 -0
  15. package/content/partials/vowed.yaml +1 -0
  16. package/content/partials/wise.yaml +1 -0
  17. package/content/traditions/elementalist.yaml +8 -0
  18. package/content/traditions/high-mage.yaml +8 -0
  19. package/content/traditions/invoker.yaml +9 -0
  20. package/content/traditions/necromancer.yaml +8 -0
  21. package/dist/i18n/en.js +1 -1
  22. package/dist/i18n/en.json +21 -17
  23. package/dist/index.js +1 -1
  24. package/dist/release.json +3461 -2759
  25. package/i18n/en/content.yaml +13 -15
  26. package/i18n/en.yaml +8 -2
  27. package/pack.yaml +2 -2
  28. package/package.json +2 -2
  29. package/rules/advancement.yaml +7 -9
  30. package/rules/backgrounds.yaml +1 -0
  31. package/rules/classes.yaml +1 -0
  32. package/rules/combat.yaml +2 -2
  33. package/rules/creation-steps.yaml +6 -6
  34. package/rules/creation.yaml +30 -95
  35. package/rules/display.yaml +108 -21
  36. package/rules/foci.yaml +1 -0
  37. package/rules/health.yaml +5 -3
  38. package/rules/magic.yaml +46 -59
  39. package/rules/saves.yaml +1 -1
  40. package/rules/skills.yaml +1 -1
  41. package/rules/tags.yaml +7 -0
  42. package/upgrades/0.1.0-to-0.2.0.yaml +61 -0
package/README.md CHANGED
@@ -18,6 +18,9 @@ Publishing.
18
18
  pnpm add @opencharacter/wwn-srd @opencharacter/engine
19
19
  ```
20
20
 
21
+ This release needs spec 0.3: `@opencharacter/engine` 0.3.0 or later. An engine for an older
22
+ spec refuses it (`spec-version-unsupported`).
23
+
21
24
  The package's default export is the pack's release, ready for `loadRuleset`; its English text is
22
25
  `@opencharacter/wwn-srd/i18n/en`.
23
26
 
@@ -31,9 +34,9 @@ const { ruleset } = loaded;
31
34
 
32
35
  // A random character: attributes, skills and silver rolled, every other pick drawn.
33
36
  const blank = {
34
- specVersion: '0.2.0',
37
+ specVersion: '0.3.0',
35
38
  id: 'new',
36
- packs: [{ id: 'wwn-srd', version: '0.1.0' }],
39
+ packs: [{ id: 'wwn-srd', version: '0.2.0' }],
37
40
  creating: true,
38
41
  };
39
42
  const run = startAction(ruleset, blank, {
@@ -87,7 +90,7 @@ computeSheet(ruleset, made.character).values['wwn-srd:saves.physical']?.value; /
87
90
  - **Gear:** the SRD's weapons, armor, adventuring gear, gear bundles and beasts, with
88
91
  encumbrance in Readied and Stowed items, bundles, worn clothing, coins and movement. A new
89
92
  character rolls 3d6 x 10 silver and buys a weapon, armor and up to six pieces of gear at list
90
- price.
93
+ price; gear it couldn't carry isn't offered.
91
94
  - **Creation:** two starts running `create-character`, in the book's order.
92
95
  - `random`: attributes, three rolls split between Growth and Learning, and silver are rolled;
93
96
  the background, class, partial classes, Foci, arts, spells and purchases are drawn evenly
@@ -95,6 +98,41 @@ computeSheet(ruleset, made.character).values['wwn-srd:saves.physical']?.value; /
95
98
  finishes.
96
99
  - `guided`: the player picks, each pick recommended.
97
100
 
101
+ ## Add-on packs
102
+
103
+ A pack that depends on `wwn-srd` can add content of its types, and creation and advancement offer
104
+ it with the core's, in the guided picks and the random draws: classes, partial classes,
105
+ backgrounds, foci, arts, spells, weapons, armor and gear.
106
+
107
+ - **A Mage's tradition** is `tradition` content: its `key` is a key of the `trad` family, which
108
+ the add-on extends (`families: { 'wwn-srd:trad': [<key>] }`) and declares the fields for
109
+ (`tradition.<key>.tier`, counting the picks as the core's do, and `tradition.<key>.skill`, the
110
+ bonus skill at creation, set by an effect of the content that brings the tradition). A
111
+ tradition that casts from the spell lists joins `spellTrad` too; its spells are those of the
112
+ list named by its key, and the High Magic list.
113
+ - **Spell lists and arts:** a spell's `list` and an art's `tradition` are open enums; an add-on adds
114
+ its tradition's key to them (`extendEnums`). A tradition with arts joins `artTrad` and declares
115
+ `arts.<key>.allowed`, `.taken` and `.owed`, which the art picks and `arts.owed` read. Joining
116
+ `armorTrad` (armor and shields stop its arts, as they stop spells) or `heavyArmorTrad` (medium
117
+ or heavy armor or a large shield do, as for the Duelist) sets when `commit-effort` is offered.
118
+ - **Effort:** a tradition with Effort joins `effortTrad` and declares `effort.<key>.max`,
119
+ `.scene`, `.day`, `.ongoing` and `.free`; the core's `commit-effort` and `release-effort` change
120
+ them for its arts, and a night's rest and a scene's end clear them, as the core's.
121
+ - **Skills:** a skill joins the `skill` family (`families: { 'wwn-srd:skill': [<key>] }`) and
122
+ declares `skills.<key>` (tagged `skill`) and `skillCredit.<key>`; creation and `improve` gain
123
+ and raise it as the core's. A background's table entries (`types.background.fields.freeSkill`,
124
+ `growth1`–`growth6`, `learning1`–`learning8`), a focus's `bonusSkill` and a weapon's `skill`
125
+ are open enums that take its key.
126
+ - **Naming what an add-on adds:** it names each added value, option or key in its own text,
127
+ under the key this pack would use, and `createText` finds it there when the app passes the
128
+ ruleset's `enumOrigins`, `optionOrigins` and `familyOrigins`. For example,
129
+ a tradition `stormcaller` added to `wwn-srd:types.spell.fields.list` is
130
+ `types.spell.fields.list.values.stormcaller.name: Stormcaller` (through `enumOrigins`).
131
+ - **Tagged steps** take an add-on's rules-level `option` and `changes` effects: `creation.purse`
132
+ (the starting silver), `creation.finish` (the last step of creation), `advancement.level` (each
133
+ new level's level and skill points), `rest.night` (a night's rest) and `rest.scene` (the end of
134
+ a scene).
135
+
98
136
  ## Left to the app or the table
99
137
 
100
138
  - **Text effects.** Most arts, Foci and spells change no number on the sheet; their names are
@@ -1,20 +1,8 @@
1
1
  id: classes.mage
2
2
  type: class
3
+ tags: [full-mage]
3
4
  effects:
4
5
  - { target: class.mage, op: add, value: 2 }
5
6
  choices:
6
7
  - id: tradition
7
- from:
8
- options:
9
- - id: high-mage
10
- effects:
11
- - { target: tradition.highmage.tier, op: add, value: 2 }
12
- - id: elementalist
13
- effects:
14
- - { target: tradition.elementalist.tier, op: add, value: 2 }
15
- - id: necromancer
16
- effects:
17
- - { target: tradition.necromancer.tier, op: add, value: 2 }
18
- - id: invoker
19
- effects:
20
- - { target: tradition.invoker.tier, op: add, value: 2 }
8
+ from: { type: tradition }
@@ -5,6 +5,7 @@ fields:
5
5
  requires: low-attribute
6
6
  prerequisites:
7
7
  - id: low-attribute
8
+ # A score that gives -1 or less, whatever later bonuses (Xenoblooded) do to the modifier.
8
9
  when: >-
9
- min(attributes.str.mod, attributes.dex.mod, attributes.con.mod, attributes.int.mod,
10
- attributes.wis.mod, attributes.cha.mod) <= -1
10
+ min(attributes.str.score, attributes.dex.score, attributes.con.score, attributes.int.score,
11
+ attributes.wis.score, attributes.cha.score) <= 7
@@ -9,7 +9,7 @@ prerequisites:
9
9
  choices:
10
10
  # The specialist tradition whose spells and first-level arts the Invoker gains.
11
11
  - id: tradition
12
- from: { values: [highmage, elementalist, necromancer] }
12
+ from: { values: { formula: "keysOf('spellTrad')" } }
13
13
  recommend: "'elementalist'"
14
14
  effects:
15
15
  - { target: invoker.education, op: set, value: pick.value }
@@ -4,6 +4,7 @@ tags: [mage-class]
4
4
  effects:
5
5
  - { target: class.mage, op: add, value: 1 }
6
6
  - { target: tradition.accursed.tier, op: add, value: 1 }
7
+ - { target: tradition.accursed.skill, op: set, value: "'magic'" }
7
8
  choices:
8
9
  # The starting art: Accursed Blade or Accursed Bolt.
9
10
  - id: starting-art
@@ -4,5 +4,6 @@ effects:
4
4
  - { target: chassis.attackExpert, op: add, value: 1 }
5
5
  - { target: chassis.hitsExpert, op: add, value: 1 }
6
6
  - { target: tradition.bard.tier, op: add, value: 1 }
7
+ - { target: tradition.bard.skill, op: set, value: "'perform'" }
7
8
  grants:
8
9
  - { item: arts.bard.a-thousand-tongues }
@@ -4,5 +4,6 @@ tags: [mage-class]
4
4
  effects:
5
5
  - { target: class.mage, op: add, value: 1 }
6
6
  - { target: tradition.beastmaster.tier, op: add, value: 1 }
7
+ - { target: tradition.beastmaster.skill, op: set, value: "'survive'" }
7
8
  grants:
8
9
  - { item: arts.beastmaster.bind-companion }
@@ -4,3 +4,4 @@ tags: [mage-class]
4
4
  effects:
5
5
  - { target: class.mage, op: add, value: 1 }
6
6
  - { target: tradition.bloodpriest.tier, op: add, value: 1 }
7
+ - { target: tradition.bloodpriest.skill, op: set, value: "'pray'" }
@@ -5,5 +5,6 @@ effects:
5
5
  - { target: class.mage, op: add, value: 1 }
6
6
  - { target: chassis.fragile, op: add, value: 1 }
7
7
  - { target: tradition.duelist.tier, op: add, value: 1 }
8
+ - { target: tradition.duelist.skill, op: set, value: "'stab'" }
8
9
  grants:
9
10
  - { item: arts.duelist.favored-weapon }
@@ -4,5 +4,6 @@ tags: [mage-class]
4
4
  effects:
5
5
  - { target: class.mage, op: add, value: 1 }
6
6
  - { target: tradition.healer.tier, op: add, value: 1 }
7
+ - { target: tradition.healer.skill, op: set, value: "'heal'" }
7
8
  grants:
8
9
  - { item: arts.healer.healing-touch }
@@ -8,26 +8,5 @@ effects:
8
8
  choices:
9
9
  - id: tradition
10
10
  unique: partial-traditions
11
- from:
12
- options:
13
- - id: high-mage
14
- prerequisites:
15
- - { id: no-invoker, when: tradition.invoker.tier == 0 }
16
- effects:
17
- - { target: tradition.highmage.tier, op: add, value: 1 }
18
- - id: elementalist
19
- prerequisites:
20
- - { id: no-invoker, when: tradition.invoker.tier == 0 }
21
- effects:
22
- - { target: tradition.elementalist.tier, op: add, value: 1 }
23
- - id: necromancer
24
- prerequisites:
25
- - { id: no-invoker, when: tradition.invoker.tier == 0 }
26
- effects:
27
- - { target: tradition.necromancer.tier, op: add, value: 1 }
28
- - id: invoker
29
- prerequisites:
30
- - id: no-other-caster
31
- when: tradition.highmage.tier + tradition.elementalist.tier + tradition.necromancer.tier == 0
32
- effects:
33
- - { target: tradition.invoker.tier, op: add, value: 1 }
11
+ requiresOption: true
12
+ from: { type: tradition }
@@ -4,6 +4,7 @@ effects:
4
4
  - { target: chassis.attackWarrior, op: add, value: 1 }
5
5
  - { target: chassis.hitsExpert, op: add, value: 1 }
6
6
  - { target: tradition.mageslayer.tier, op: add, value: 1 }
7
+ - { target: tradition.mageslayer.skill, op: set, value: "'magic'" }
7
8
  # Arts at a set rate.
8
9
  grants:
9
10
  - { item: arts.mageslayer.antimage, when: level >= 1 }
@@ -4,5 +4,6 @@ tags: [mage-class]
4
4
  effects:
5
5
  - { target: class.mage, op: add, value: 1 }
6
6
  - { target: tradition.skinshifter.tier, op: add, value: 1 }
7
+ - { target: tradition.skinshifter.skill, op: set, value: "'survive'" }
7
8
  grants:
8
9
  - { item: arts.skinshifter.change-form }
@@ -4,5 +4,6 @@ tags: [mage-class]
4
4
  effects:
5
5
  - { target: class.mage, op: add, value: 1 }
6
6
  - { target: tradition.thoughtnoble.tier, op: add, value: 1 }
7
+ - { target: tradition.thoughtnoble.skill, op: set, value: "'notice'" }
7
8
  grants:
8
9
  - { item: arts.thought-noble.open-mind }
@@ -4,6 +4,7 @@ tags: [mage-class]
4
4
  effects:
5
5
  - { target: class.mage, op: add, value: 1 }
6
6
  - { target: tradition.vowed.tier, op: add, value: 1 }
7
+ - { target: tradition.vowed.skill, op: set, value: 'vowed.skill' }
7
8
  grants:
8
9
  - { item: arts.vowed.martial-style }
9
10
  - { item: arts.vowed.unarmed-might }
@@ -3,6 +3,7 @@ type: partial
3
3
  effects:
4
4
  - { target: chassis.hitsExpert, op: add, value: 1 }
5
5
  - { target: tradition.wise.tier, op: add, value: 1 }
6
+ - { target: tradition.wise.skill, op: set, value: 'wise.skill' }
6
7
  choices:
7
8
  # The skill that suits the Wise's concept.
8
9
  - id: skill
@@ -0,0 +1,8 @@
1
+ id: traditions.elementalist
2
+ type: tradition
3
+ fields:
4
+ key: elementalist
5
+ prerequisites:
6
+ - { id: no-invoker, when: tradition.invoker.tier == 0 }
7
+ effects:
8
+ - { target: tradition.elementalist.skill, op: set, value: "'magic'" }
@@ -0,0 +1,8 @@
1
+ id: traditions.high-mage
2
+ type: tradition
3
+ fields:
4
+ key: highmage
5
+ prerequisites:
6
+ - { id: no-invoker, when: tradition.invoker.tier == 0 }
7
+ effects:
8
+ - { target: tradition.highmage.skill, op: set, value: "'magic'" }
@@ -0,0 +1,9 @@
1
+ id: traditions.invoker
2
+ type: tradition
3
+ fields:
4
+ key: invoker
5
+ prerequisites:
6
+ - id: no-other-caster
7
+ when: tradition.highmage.tier + tradition.elementalist.tier + tradition.necromancer.tier == 0
8
+ effects:
9
+ - { target: tradition.invoker.skill, op: set, value: "'magic'" }
@@ -0,0 +1,8 @@
1
+ id: traditions.necromancer
2
+ type: tradition
3
+ fields:
4
+ key: necromancer
5
+ prerequisites:
6
+ - { id: no-invoker, when: tradition.invoker.tier == 0 }
7
+ effects:
8
+ - { target: tradition.necromancer.skill, op: set, value: "'magic'" }