@opencharacter/orc-2e 0.2.0 → 0.3.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 (288) hide show
  1. package/README.md +69 -12
  2. package/content/classes/alchemist/fields/bomber.yaml +1 -1
  3. package/content/classes/alchemist/fields/chirurgeon.yaml +1 -1
  4. package/content/classes/alchemist/fields/mutagenist.yaml +1 -1
  5. package/content/classes/alchemist/fields/toxicologist.yaml +1 -1
  6. package/content/classes/alchemist.yaml +2 -34
  7. package/content/classes/barbarian/animals/ape.yaml +1 -1
  8. package/content/classes/barbarian/animals/bear.yaml +1 -1
  9. package/content/classes/barbarian/animals/bull.yaml +1 -1
  10. package/content/classes/barbarian/animals/cat.yaml +1 -1
  11. package/content/classes/barbarian/animals/deer.yaml +1 -1
  12. package/content/classes/barbarian/animals/frog.yaml +1 -1
  13. package/content/classes/barbarian/animals/shark.yaml +1 -1
  14. package/content/classes/barbarian/animals/snake.yaml +1 -1
  15. package/content/classes/barbarian/animals/wolf.yaml +1 -1
  16. package/content/classes/barbarian/instincts/animal.yaml +2 -14
  17. package/content/classes/barbarian/instincts/dragon.yaml +1 -2
  18. package/content/classes/barbarian/instincts/fury.yaml +1 -1
  19. package/content/classes/barbarian/instincts/giant.yaml +1 -1
  20. package/content/classes/barbarian/instincts/spirit.yaml +1 -2
  21. package/content/classes/barbarian/instincts/superstition.yaml +1 -1
  22. package/content/classes/barbarian/raging.yaml +3 -1
  23. package/content/classes/barbarian.yaml +2 -36
  24. package/content/classes/bard/muses/enigma.yaml +1 -1
  25. package/content/classes/bard/muses/maestro.yaml +1 -1
  26. package/content/classes/bard/muses/polymath.yaml +1 -1
  27. package/content/classes/bard/muses/warrior.yaml +1 -1
  28. package/content/classes/bard.yaml +2 -34
  29. package/content/classes/champion/causes/desecration.yaml +1 -1
  30. package/content/classes/champion/causes/grandeur.yaml +1 -1
  31. package/content/classes/champion/causes/iniquity.yaml +1 -1
  32. package/content/classes/champion/causes/justice.yaml +1 -1
  33. package/content/classes/champion/causes/liberation.yaml +1 -1
  34. package/content/classes/champion/causes/obedience.yaml +1 -1
  35. package/content/classes/champion/causes/redemption.yaml +1 -1
  36. package/content/classes/champion.yaml +2 -37
  37. package/content/classes/cleric/doctrines/cloistered-cleric.yaml +1 -1
  38. package/content/classes/cleric/doctrines/warpriest.yaml +1 -1
  39. package/content/classes/cleric.yaml +2 -28
  40. package/content/classes/druid/orders/animal.yaml +1 -1
  41. package/content/classes/druid/orders/leaf.yaml +1 -1
  42. package/content/classes/druid/orders/storm.yaml +1 -1
  43. package/content/classes/druid/orders/untamed.yaml +1 -1
  44. package/content/classes/druid.yaml +2 -34
  45. package/content/classes/fighter.yaml +1 -26
  46. package/content/classes/investigator.yaml +1 -26
  47. package/content/classes/monk.yaml +1 -26
  48. package/content/classes/oracle/mysteries/ancestors.yaml +3 -1
  49. package/content/classes/oracle/mysteries/battle.yaml +5 -1
  50. package/content/classes/oracle/mysteries/bones.yaml +3 -1
  51. package/content/classes/oracle/mysteries/cosmos.yaml +3 -1
  52. package/content/classes/oracle/mysteries/flames.yaml +3 -1
  53. package/content/classes/oracle/mysteries/life.yaml +4 -1
  54. package/content/classes/oracle/mysteries/lore.yaml +5 -1
  55. package/content/classes/oracle/mysteries/tempest.yaml +3 -1
  56. package/content/classes/oracle.yaml +2 -38
  57. package/content/classes/ranger/edges/flurry.yaml +1 -1
  58. package/content/classes/ranger/edges/outwit.yaml +1 -1
  59. package/content/classes/ranger/edges/precision.yaml +1 -1
  60. package/content/classes/ranger.yaml +2 -29
  61. package/content/classes/rogue/rackets/mastermind.yaml +1 -1
  62. package/content/classes/rogue/rackets/ruffian.yaml +1 -1
  63. package/content/classes/rogue/rackets/scoundrel.yaml +1 -1
  64. package/content/classes/rogue/rackets/thief.yaml +1 -1
  65. package/content/classes/rogue.yaml +2 -34
  66. package/content/classes/sorcerer/bloodlines/aberrant.yaml +1 -1
  67. package/content/classes/sorcerer/bloodlines/angelic.yaml +1 -1
  68. package/content/classes/sorcerer/bloodlines/demonic.yaml +1 -1
  69. package/content/classes/sorcerer/bloodlines/diabolic.yaml +1 -1
  70. package/content/classes/sorcerer/bloodlines/draconic.yaml +1 -1
  71. package/content/classes/sorcerer/bloodlines/elemental.yaml +1 -1
  72. package/content/classes/sorcerer/bloodlines/fey.yaml +1 -1
  73. package/content/classes/sorcerer/bloodlines/hag.yaml +1 -1
  74. package/content/classes/sorcerer/bloodlines/imperial.yaml +1 -1
  75. package/content/classes/sorcerer/bloodlines/undead.yaml +1 -1
  76. package/content/classes/sorcerer.yaml +2 -40
  77. package/content/classes/swashbuckler.yaml +1 -26
  78. package/content/classes/witch/patrons/faiths-flamekeeper.yaml +1 -1
  79. package/content/classes/witch/patrons/inscribed-one.yaml +1 -1
  80. package/content/classes/witch/patrons/resentment.yaml +1 -1
  81. package/content/classes/witch/patrons/silence-in-snow.yaml +1 -1
  82. package/content/classes/witch/patrons/spinner-of-threads.yaml +1 -1
  83. package/content/classes/witch/patrons/starless-shadow.yaml +1 -1
  84. package/content/classes/witch/patrons/wilding-steward.yaml +1 -1
  85. package/content/classes/witch.yaml +2 -37
  86. package/content/classes/wizard/schools/ars-grammatica.yaml +1 -1
  87. package/content/classes/wizard/schools/battle-magic.yaml +1 -1
  88. package/content/classes/wizard/schools/boundary.yaml +1 -1
  89. package/content/classes/wizard/schools/civic-wizardry.yaml +1 -1
  90. package/content/classes/wizard/schools/mentalism.yaml +1 -1
  91. package/content/classes/wizard/schools/protean-form.yaml +1 -1
  92. package/content/classes/wizard/schools/unified-magical-theory.yaml +1 -1
  93. package/content/classes/wizard/theses/experimental-spellshaping.yaml +1 -1
  94. package/content/classes/wizard/theses/improved-familiar-attunement.yaml +1 -1
  95. package/content/classes/wizard/theses/spell-blending.yaml +1 -1
  96. package/content/classes/wizard/theses/spell-substitution.yaml +1 -1
  97. package/content/classes/wizard/theses/staff-nexus.yaml +1 -1
  98. package/content/classes/wizard.yaml +3 -46
  99. package/content/domains/advanced/air.yaml +7 -0
  100. package/content/domains/advanced/ambition.yaml +7 -0
  101. package/content/domains/advanced/cities.yaml +7 -0
  102. package/content/domains/advanced/confidence.yaml +7 -0
  103. package/content/domains/advanced/creation.yaml +7 -0
  104. package/content/domains/advanced/darkness.yaml +7 -0
  105. package/content/domains/advanced/death.yaml +7 -0
  106. package/content/domains/advanced/destruction.yaml +7 -0
  107. package/content/domains/advanced/dreams.yaml +7 -0
  108. package/content/domains/advanced/earth.yaml +7 -0
  109. package/content/domains/advanced/family.yaml +7 -0
  110. package/content/domains/advanced/fate.yaml +7 -0
  111. package/content/domains/advanced/fire.yaml +7 -0
  112. package/content/domains/advanced/freedom.yaml +7 -0
  113. package/content/domains/advanced/healing.yaml +7 -0
  114. package/content/domains/advanced/indulgence.yaml +7 -0
  115. package/content/domains/advanced/knowledge.yaml +7 -0
  116. package/content/domains/advanced/luck.yaml +7 -0
  117. package/content/domains/advanced/magic.yaml +7 -0
  118. package/content/domains/advanced/might.yaml +7 -0
  119. package/content/domains/advanced/moon.yaml +7 -0
  120. package/content/domains/advanced/nature.yaml +7 -0
  121. package/content/domains/advanced/nightmares.yaml +7 -0
  122. package/content/domains/advanced/pain.yaml +7 -0
  123. package/content/domains/advanced/passion.yaml +7 -0
  124. package/content/domains/advanced/perfection.yaml +7 -0
  125. package/content/domains/advanced/protection.yaml +7 -0
  126. package/content/domains/advanced/secrecy.yaml +7 -0
  127. package/content/domains/advanced/sun.yaml +7 -0
  128. package/content/domains/advanced/travel.yaml +7 -0
  129. package/content/domains/advanced/trickery.yaml +7 -0
  130. package/content/domains/advanced/truth.yaml +7 -0
  131. package/content/domains/advanced/tyranny.yaml +7 -0
  132. package/content/domains/advanced/undeath.yaml +7 -0
  133. package/content/domains/advanced/water.yaml +7 -0
  134. package/content/domains/advanced/wealth.yaml +7 -0
  135. package/content/domains/advanced/zeal.yaml +7 -0
  136. package/content/domains/air.yaml +6 -0
  137. package/content/domains/ambition.yaml +6 -0
  138. package/content/domains/cities.yaml +6 -0
  139. package/content/domains/confidence.yaml +6 -0
  140. package/content/domains/creation.yaml +6 -0
  141. package/content/domains/darkness.yaml +6 -0
  142. package/content/domains/death.yaml +6 -0
  143. package/content/domains/destruction.yaml +6 -0
  144. package/content/domains/dreams.yaml +6 -0
  145. package/content/domains/earth.yaml +6 -0
  146. package/content/domains/family.yaml +6 -0
  147. package/content/domains/fate.yaml +6 -0
  148. package/content/domains/fire.yaml +6 -0
  149. package/content/domains/freedom.yaml +6 -0
  150. package/content/domains/healing.yaml +6 -0
  151. package/content/domains/indulgence.yaml +6 -0
  152. package/content/domains/knowledge.yaml +6 -0
  153. package/content/domains/luck.yaml +6 -0
  154. package/content/domains/magic.yaml +6 -0
  155. package/content/domains/might.yaml +6 -0
  156. package/content/domains/moon.yaml +6 -0
  157. package/content/domains/nature.yaml +6 -0
  158. package/content/domains/nightmares.yaml +6 -0
  159. package/content/domains/pain.yaml +6 -0
  160. package/content/domains/passion.yaml +6 -0
  161. package/content/domains/perfection.yaml +6 -0
  162. package/content/domains/protection.yaml +6 -0
  163. package/content/domains/secrecy.yaml +6 -0
  164. package/content/domains/sun.yaml +6 -0
  165. package/content/domains/travel.yaml +6 -0
  166. package/content/domains/trickery.yaml +6 -0
  167. package/content/domains/truth.yaml +6 -0
  168. package/content/domains/tyranny.yaml +6 -0
  169. package/content/domains/undeath.yaml +6 -0
  170. package/content/domains/water.yaml +6 -0
  171. package/content/domains/wealth.yaml +6 -0
  172. package/content/domains/zeal.yaml +6 -0
  173. package/content/effects/treated-disease.yaml +4 -0
  174. package/content/effects/treated-poison.yaml +4 -0
  175. package/content/feats/ancestry/gnome-obsession.yaml +1 -39
  176. package/content/feats/ancestry/tengu-feather-fan.yaml +3 -3
  177. package/content/feats/archetype/barbarian/barbarian-dedication.yaml +0 -2
  178. package/content/feats/archetype/champion/champions-reaction.yaml +1 -11
  179. package/content/feats/archetype/investigator/skill-mastery.yaml +2 -58
  180. package/content/feats/archetype/rogue/skill-mastery.yaml +2 -58
  181. package/content/feats/champion/deitys-domain.yaml +1 -22
  182. package/content/feats/cleric/advanced-domain.yaml +1 -187
  183. package/content/feats/cleric/domain-initiate.yaml +1 -199
  184. package/content/feats/oracle/domain-acumen.yaml +4 -138
  185. package/content/feats/skill/skill-training.yaml +1 -55
  186. package/content/feats/sorcerer/arcane-evolution.yaml +1 -26
  187. package/content/feats/sorcerer/occult-evolution.yaml +1 -26
  188. package/content/gear/compass-lensatic.yaml +1 -0
  189. package/content/gear/compass.yaml +1 -0
  190. package/content/gear/crowbar-levered.yaml +1 -0
  191. package/content/gear/crowbar.yaml +1 -0
  192. package/content/shields/specific/reflecting-shield.yaml +1 -1
  193. package/content/shields/specific/spellguard-shield.yaml +1 -0
  194. package/content/spells/agile-feet.yaml +1 -0
  195. package/content/spells/appearance-of-wealth.yaml +1 -0
  196. package/content/spells/athletic-rush.yaml +1 -0
  197. package/content/spells/bit-of-luck.yaml +1 -0
  198. package/content/spells/charming-touch.yaml +1 -0
  199. package/content/spells/cloak-of-shadow.yaml +1 -0
  200. package/content/spells/creative-splash.yaml +1 -0
  201. package/content/spells/cry-of-destruction.yaml +1 -0
  202. package/content/spells/dazzling-flash.yaml +1 -0
  203. package/content/spells/deaths-call.yaml +1 -0
  204. package/content/spells/face-in-the-crowd.yaml +1 -0
  205. package/content/spells/fire-ray.yaml +1 -0
  206. package/content/spells/guidance.yaml +2 -0
  207. package/content/spells/healers-blessing.yaml +1 -0
  208. package/content/spells/hurtling-stone.yaml +1 -0
  209. package/content/spells/ignite-ambition.yaml +1 -0
  210. package/content/spells/magics-vessel.yaml +1 -0
  211. package/content/spells/moonbeam.yaml +1 -0
  212. package/content/spells/overstuff.yaml +1 -0
  213. package/content/spells/perfected-mind.yaml +1 -0
  214. package/content/spells/protectors-sacrifice.yaml +1 -0
  215. package/content/spells/pushing-gust.yaml +1 -0
  216. package/content/spells/read-fate.yaml +1 -0
  217. package/content/spells/savor-the-sting.yaml +1 -0
  218. package/content/spells/scholarly-recollection.yaml +1 -0
  219. package/content/spells/soothing-words.yaml +1 -0
  220. package/content/spells/sudden-shift.yaml +1 -0
  221. package/content/spells/sure-strike.yaml +2 -0
  222. package/content/spells/sweet-dream.yaml +1 -0
  223. package/content/spells/tidal-surge.yaml +1 -0
  224. package/content/spells/touch-of-obedience.yaml +1 -0
  225. package/content/spells/touch-of-undeath.yaml +1 -0
  226. package/content/spells/true-target.yaml +2 -0
  227. package/content/spells/unimpeded-stride.yaml +1 -0
  228. package/content/spells/veil-of-confidence.yaml +1 -0
  229. package/content/spells/vibrant-thorns.yaml +1 -0
  230. package/content/spells/waking-nightmare.yaml +1 -0
  231. package/content/spells/weapon-surge.yaml +3 -0
  232. package/content/spells/whispering-quiet.yaml +1 -0
  233. package/content/spells/word-of-truth.yaml +1 -0
  234. package/dist/i18n/en.js +1 -1
  235. package/dist/i18n/en.json +196 -207
  236. package/dist/index.js +1 -1
  237. package/dist/release.json +7103 -3825
  238. package/i18n/en/ancestry-dragonblood.yaml +2 -2
  239. package/i18n/en/archetypes.yaml +6 -6
  240. package/i18n/en/backgrounds.yaml +6 -3
  241. package/i18n/en/battle-forms.yaml +0 -1
  242. package/i18n/en/champion.yaml +1 -1
  243. package/i18n/en/cleric.yaml +151 -149
  244. package/i18n/en/equipment.yaml +4 -1
  245. package/i18n/en/oracle.yaml +0 -38
  246. package/i18n/en/rogue.yaml +3 -3
  247. package/i18n/en/spellcasting.yaml +2 -2
  248. package/i18n/en/type-fields.yaml +2 -0
  249. package/i18n/en.yaml +19 -1
  250. package/pack.yaml +2 -2
  251. package/package.json +2 -2
  252. package/rules/advancement.yaml +1 -0
  253. package/rules/afflictions.yaml +2 -0
  254. package/rules/alchemist.yaml +14 -3
  255. package/rules/ancestry-feats.yaml +55 -13
  256. package/rules/archetypes.yaml +1 -0
  257. package/rules/barbarian.yaml +8 -21
  258. package/rules/bard.yaml +10 -4
  259. package/rules/building.yaml +7 -1
  260. package/rules/champion.yaml +3 -2
  261. package/rules/checks.yaml +1 -1
  262. package/rules/cleric.yaml +13 -3
  263. package/rules/conditions.yaml +1 -0
  264. package/rules/core.yaml +1 -0
  265. package/rules/creation.yaml +18 -0
  266. package/rules/druid.yaml +3 -2
  267. package/rules/equipment.yaml +7 -1
  268. package/rules/heritages.yaml +1 -1
  269. package/rules/investigator.yaml +3 -11
  270. package/rules/layout.yaml +19 -6
  271. package/rules/lores-pc2.yaml +176 -38
  272. package/rules/lores.yaml +226 -50
  273. package/rules/monk.yaml +2 -5
  274. package/rules/oracle.yaml +5 -3
  275. package/rules/ranger.yaml +3 -3
  276. package/rules/rogue.yaml +6 -1
  277. package/rules/skill-actions-athletics.yaml +1 -2
  278. package/rules/skill-actions-stealth.yaml +1 -2
  279. package/rules/skills.yaml +173 -56
  280. package/rules/sorcerer.yaml +16 -4
  281. package/rules/spellcasting.yaml +94 -24
  282. package/rules/spells-high.yaml +3 -3
  283. package/rules/strikes.yaml +3 -1
  284. package/rules/swashbuckler.yaml +4 -17
  285. package/rules/tags.yaml +6 -0
  286. package/rules/witch.yaml +2 -1
  287. package/rules/wizard.yaml +5 -3
  288. package/upgrades/0.2.0-to-0.3.0.yaml +657 -0
@@ -1,6 +1,6 @@
1
1
  id: classes.cleric.doctrines.cloistered-cleric
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: cleric.doctrine }
4
4
  effects:
5
5
  - { target: cleric.doctrine, op: set, value: "'cloistered'" }
6
6
  - { target: saves.fortitude.rank, op: atLeast, value: 2, when: level >= 3 }
@@ -1,6 +1,6 @@
1
1
  id: classes.cleric.doctrines.warpriest
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: cleric.doctrine }
4
4
  effects:
5
5
  - { target: cleric.doctrine, op: set, value: "'warpriest'" }
6
6
  - { target: defenses.light.rank, op: atLeast, value: 'level >= 13 ? 2 : 1' }
@@ -121,38 +121,12 @@ choices:
121
121
  effects:
122
122
  - { target: attacks.favoredWeapons, op: grant, value: { formula: pick.id } }
123
123
  - id: doctrine
124
- from:
125
- items: [classes.cleric.doctrines.cloistered-cleric, classes.cleric.doctrines.warpriest]
124
+ from: { type: feature, where: "item.classOption == 'cleric.doctrine'" }
126
125
  - id: skills
127
126
  unique: skill-training
128
127
  pick: 2 + max(0, attributes.int.mod)
129
128
  from:
130
- values:
131
- [
132
- skill.acrobatics,
133
- skill.arcana,
134
- skill.athletics,
135
- skill.crafting,
136
- skill.deception,
137
- skill.diplomacy,
138
- skill.intimidation,
139
- skill.medicine,
140
- skill.nature,
141
- skill.occultism,
142
- skill.performance,
143
- skill.religion,
144
- skill.society,
145
- skill.stealth,
146
- skill.survival,
147
- skill.thievery,
148
- skill.lore.academia,
149
- skill.lore.circus,
150
- skill.lore.farming,
151
- skill.lore.legal,
152
- skill.lore.scribing,
153
- skill.lore.underworld,
154
- skill.lore.warfare,
155
- ]
129
+ values: { formula: skills.offered }
156
130
  where: '!(value in skills.trained) && !(value in skills.chosen) || value in choice.picks'
157
131
  effects:
158
132
  - { target: skills.chosen, op: grant, value: { formula: pick.value } }
@@ -1,6 +1,6 @@
1
1
  id: classes.druid.orders.animal
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: druid.order }
4
4
  effects:
5
5
  - { target: druid.order, op: set, value: "'animal'" }
6
6
  - { target: druid.orders, op: grant, value: { tag: druid-order.animal } }
@@ -1,6 +1,6 @@
1
1
  id: classes.druid.orders.leaf
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: druid.order }
4
4
  effects:
5
5
  - { target: druid.order, op: set, value: "'leaf'" }
6
6
  - { target: druid.orders, op: grant, value: { tag: druid-order.leaf } }
@@ -1,6 +1,6 @@
1
1
  id: classes.druid.orders.storm
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: druid.order }
4
4
  effects:
5
5
  - { target: druid.order, op: set, value: "'storm'" }
6
6
  - { target: druid.orders, op: grant, value: { tag: druid-order.storm } }
@@ -1,6 +1,6 @@
1
1
  id: classes.druid.orders.untamed
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: druid.order }
4
4
  effects:
5
5
  - { target: druid.order, op: set, value: "'untamed'" }
6
6
  - { target: druid.orders, op: grant, value: { tag: druid-order.untamed } }
@@ -49,14 +49,7 @@ grants:
49
49
  - { item: features.druid.primal-hierophant, when: level >= 19 }
50
50
  choices:
51
51
  - id: order
52
- from:
53
- items:
54
- [
55
- classes.druid.orders.animal,
56
- classes.druid.orders.leaf,
57
- classes.druid.orders.storm,
58
- classes.druid.orders.untamed,
59
- ]
52
+ from: { type: feature, where: "item.classOption == 'druid.order'" }
60
53
  - id: voice-of-nature
61
54
  unique: feats
62
55
  from: { items: [feats.druid.animal-empathy, feats.druid.plant-empathy] }
@@ -64,32 +57,7 @@ choices:
64
57
  unique: skill-training
65
58
  pick: 2 + max(0, attributes.int.mod)
66
59
  from:
67
- values:
68
- [
69
- skill.acrobatics,
70
- skill.arcana,
71
- skill.athletics,
72
- skill.crafting,
73
- skill.deception,
74
- skill.diplomacy,
75
- skill.intimidation,
76
- skill.medicine,
77
- skill.nature,
78
- skill.occultism,
79
- skill.performance,
80
- skill.religion,
81
- skill.society,
82
- skill.stealth,
83
- skill.survival,
84
- skill.thievery,
85
- skill.lore.academia,
86
- skill.lore.circus,
87
- skill.lore.farming,
88
- skill.lore.legal,
89
- skill.lore.scribing,
90
- skill.lore.underworld,
91
- skill.lore.warfare,
92
- ]
60
+ values: { formula: skills.offered }
93
61
  where: '!(value in skills.trained) && !(value in skills.chosen) || value in choice.picks'
94
62
  effects:
95
63
  - { target: skills.chosen, op: grant, value: { formula: pick.value } }
@@ -62,32 +62,7 @@ choices:
62
62
  unique: skill-training
63
63
  pick: 3 + max(0, attributes.int.mod)
64
64
  from:
65
- values:
66
- [
67
- skill.acrobatics,
68
- skill.arcana,
69
- skill.athletics,
70
- skill.crafting,
71
- skill.deception,
72
- skill.diplomacy,
73
- skill.intimidation,
74
- skill.medicine,
75
- skill.nature,
76
- skill.occultism,
77
- skill.performance,
78
- skill.religion,
79
- skill.society,
80
- skill.stealth,
81
- skill.survival,
82
- skill.thievery,
83
- skill.lore.academia,
84
- skill.lore.circus,
85
- skill.lore.farming,
86
- skill.lore.legal,
87
- skill.lore.scribing,
88
- skill.lore.underworld,
89
- skill.lore.warfare,
90
- ]
65
+ values: { formula: skills.offered }
91
66
  where: '!(value in skills.trained) && !(value in skills.chosen) || value in choice.picks'
92
67
  effects:
93
68
  - { target: skills.chosen, op: grant, value: { formula: pick.value } }
@@ -117,32 +117,7 @@ choices:
117
117
  unique: skill-training
118
118
  pick: 4 + max(0, attributes.int.mod)
119
119
  from:
120
- values:
121
- [
122
- skill.acrobatics,
123
- skill.arcana,
124
- skill.athletics,
125
- skill.crafting,
126
- skill.deception,
127
- skill.diplomacy,
128
- skill.intimidation,
129
- skill.medicine,
130
- skill.nature,
131
- skill.occultism,
132
- skill.performance,
133
- skill.religion,
134
- skill.society,
135
- skill.stealth,
136
- skill.survival,
137
- skill.thievery,
138
- skill.lore.academia,
139
- skill.lore.circus,
140
- skill.lore.farming,
141
- skill.lore.legal,
142
- skill.lore.scribing,
143
- skill.lore.underworld,
144
- skill.lore.warfare,
145
- ]
120
+ values: { formula: skills.offered }
146
121
  where: '!(value in skills.trained) && !(value in skills.chosen) || value in choice.picks'
147
122
  effects:
148
123
  - { target: skills.chosen, op: grant, value: { formula: pick.value } }
@@ -48,32 +48,7 @@ choices:
48
48
  unique: skill-training
49
49
  pick: 4 + max(0, attributes.int.mod)
50
50
  from:
51
- values:
52
- [
53
- skill.acrobatics,
54
- skill.arcana,
55
- skill.athletics,
56
- skill.crafting,
57
- skill.deception,
58
- skill.diplomacy,
59
- skill.intimidation,
60
- skill.medicine,
61
- skill.nature,
62
- skill.occultism,
63
- skill.performance,
64
- skill.religion,
65
- skill.society,
66
- skill.stealth,
67
- skill.survival,
68
- skill.thievery,
69
- skill.lore.academia,
70
- skill.lore.circus,
71
- skill.lore.farming,
72
- skill.lore.legal,
73
- skill.lore.scribing,
74
- skill.lore.underworld,
75
- skill.lore.warfare,
76
- ]
51
+ values: { formula: skills.offered }
77
52
  where: '!(value in skills.trained) && !(value in skills.chosen) || value in choice.picks'
78
53
  effects:
79
54
  - { target: skills.chosen, op: grant, value: { formula: pick.value } }
@@ -1,7 +1,9 @@
1
1
  id: classes.oracle.mysteries.ancestors
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: oracle.mystery }
4
4
  effects:
5
+ - { target: oracle.domains, op: grant, value: { item: domains.death } }
6
+ - { target: oracle.domains, op: grant, value: { item: domains.family } }
5
7
  - { target: oracle.mystery, op: set, value: "'ancestors'" }
6
8
  - {
7
9
  target: skills.trained,
@@ -1,7 +1,11 @@
1
1
  id: classes.oracle.mysteries.battle
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: oracle.mystery }
4
4
  effects:
5
+ - { target: oracle.domains, op: grant, value: { item: domains.destruction } }
6
+ - { target: oracle.domains, op: grant, value: { item: domains.might } }
7
+ - { target: oracle.domains, op: grant, value: { item: domains.protection } }
8
+ - { target: oracle.domains, op: grant, value: { item: domains.zeal } }
5
9
  - { target: oracle.mystery, op: set, value: "'battle'" }
6
10
  - {
7
11
  target: skills.trained,
@@ -1,7 +1,9 @@
1
1
  id: classes.oracle.mysteries.bones
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: oracle.mystery }
4
4
  effects:
5
+ - { target: oracle.domains, op: grant, value: { item: domains.death } }
6
+ - { target: oracle.domains, op: grant, value: { item: domains.undeath } }
5
7
  - { target: oracle.mystery, op: set, value: "'bones'" }
6
8
  - {
7
9
  target: skills.trained,
@@ -1,7 +1,9 @@
1
1
  id: classes.oracle.mysteries.cosmos
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: oracle.mystery }
4
4
  effects:
5
+ - { target: oracle.domains, op: grant, value: { item: domains.darkness } }
6
+ - { target: oracle.domains, op: grant, value: { item: domains.moon } }
5
7
  - { target: oracle.mystery, op: set, value: "'cosmos'" }
6
8
  - {
7
9
  target: skills.trained,
@@ -1,7 +1,9 @@
1
1
  id: classes.oracle.mysteries.flames
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: oracle.mystery }
4
4
  effects:
5
+ - { target: oracle.domains, op: grant, value: { item: domains.fire } }
6
+ - { target: oracle.domains, op: grant, value: { item: domains.sun } }
5
7
  - { target: oracle.mystery, op: set, value: "'flames'" }
6
8
  - {
7
9
  target: skills.trained,
@@ -1,7 +1,10 @@
1
1
  id: classes.oracle.mysteries.life
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: oracle.mystery }
4
4
  effects:
5
+ - { target: oracle.domains, op: grant, value: { item: domains.death } }
6
+ - { target: oracle.domains, op: grant, value: { item: domains.healing } }
7
+ - { target: oracle.domains, op: grant, value: { item: domains.pain } }
5
8
  - { target: oracle.mystery, op: set, value: "'life'" }
6
9
  - {
7
10
  target: skills.trained,
@@ -1,7 +1,11 @@
1
1
  id: classes.oracle.mysteries.lore
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: oracle.mystery }
4
4
  effects:
5
+ - { target: oracle.domains, op: grant, value: { item: domains.knowledge } }
6
+ - { target: oracle.domains, op: grant, value: { item: domains.magic } }
7
+ - { target: oracle.domains, op: grant, value: { item: domains.secrecy } }
8
+ - { target: oracle.domains, op: grant, value: { item: domains.truth } }
5
9
  - { target: oracle.mystery, op: set, value: "'lore'" }
6
10
  - {
7
11
  target: skills.trained,
@@ -1,7 +1,9 @@
1
1
  id: classes.oracle.mysteries.tempest
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: oracle.mystery }
4
4
  effects:
5
+ - { target: oracle.domains, op: grant, value: { item: domains.air } }
6
+ - { target: oracle.domains, op: grant, value: { item: domains.water } }
5
7
  - { target: oracle.mystery, op: set, value: "'tempest'" }
6
8
  - {
7
9
  target: skills.trained,
@@ -52,48 +52,12 @@ grants:
52
52
  choices:
53
53
  # Asked first, so the free skills leave its skill out.
54
54
  - id: mystery
55
- from:
56
- items:
57
- [
58
- classes.oracle.mysteries.ancestors,
59
- classes.oracle.mysteries.battle,
60
- classes.oracle.mysteries.bones,
61
- classes.oracle.mysteries.cosmos,
62
- classes.oracle.mysteries.flames,
63
- classes.oracle.mysteries.life,
64
- classes.oracle.mysteries.lore,
65
- classes.oracle.mysteries.tempest,
66
- ]
55
+ from: { type: feature, where: "item.classOption == 'oracle.mystery'" }
67
56
  - id: skills
68
57
  unique: skill-training
69
58
  pick: 3 + max(0, attributes.int.mod)
70
59
  from:
71
- values:
72
- [
73
- skill.acrobatics,
74
- skill.arcana,
75
- skill.athletics,
76
- skill.crafting,
77
- skill.deception,
78
- skill.diplomacy,
79
- skill.intimidation,
80
- skill.medicine,
81
- skill.nature,
82
- skill.occultism,
83
- skill.performance,
84
- skill.religion,
85
- skill.society,
86
- skill.stealth,
87
- skill.survival,
88
- skill.thievery,
89
- skill.lore.academia,
90
- skill.lore.circus,
91
- skill.lore.farming,
92
- skill.lore.legal,
93
- skill.lore.scribing,
94
- skill.lore.underworld,
95
- skill.lore.warfare,
96
- ]
60
+ values: { formula: skills.offered }
97
61
  where: '!(value in skills.trained) && !(value in skills.chosen) || value in choice.picks'
98
62
  effects:
99
63
  - { target: skills.chosen, op: grant, value: { formula: pick.value } }
@@ -1,6 +1,6 @@
1
1
  id: classes.ranger.edges.flurry
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: ranger.hunters-edge }
4
4
  # The edge replaces the Strike's penalty part: the Strike's own penalty (`flags.map`) less 2 per
5
5
  # step, 3 at 17th.
6
6
  effects:
@@ -1,6 +1,6 @@
1
1
  id: classes.ranger.edges.outwit
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: ranger.hunters-edge }
4
4
  # AC against the prey is `defenses.acPrey`, which the prey's Strikes and spell attacks read when you
5
5
  # are their target.
6
6
  effects:
@@ -1,6 +1,6 @@
1
1
  id: classes.ranger.edges.precision
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: ranger.hunters-edge }
4
4
  # Hits on the prey are counted in `prey.hits` on each hit and reset at the start of the turn. Two
5
5
  # Strikes in one action (Double Slice) both read the count as the action starts.
6
6
  effects:
@@ -62,39 +62,12 @@ choices:
62
62
  - { target: attributes.dex.boosts, op: add, value: 1 }
63
63
  - { target: class.keyAttribute, op: set, value: "'dex'" }
64
64
  - id: hunters-edge
65
- from:
66
- items:
67
- [classes.ranger.edges.flurry, classes.ranger.edges.outwit, classes.ranger.edges.precision]
65
+ from: { type: feature, where: "item.classOption == 'ranger.hunters-edge'" }
68
66
  - id: skills
69
67
  unique: skill-training
70
68
  pick: 4 + max(0, attributes.int.mod)
71
69
  from:
72
- values:
73
- [
74
- skill.acrobatics,
75
- skill.arcana,
76
- skill.athletics,
77
- skill.crafting,
78
- skill.deception,
79
- skill.diplomacy,
80
- skill.intimidation,
81
- skill.medicine,
82
- skill.nature,
83
- skill.occultism,
84
- skill.performance,
85
- skill.religion,
86
- skill.society,
87
- skill.stealth,
88
- skill.survival,
89
- skill.thievery,
90
- skill.lore.academia,
91
- skill.lore.circus,
92
- skill.lore.farming,
93
- skill.lore.legal,
94
- skill.lore.scribing,
95
- skill.lore.underworld,
96
- skill.lore.warfare,
97
- ]
70
+ values: { formula: skills.offered }
98
71
  where: '!(value in skills.trained) && !(value in skills.chosen) || value in choice.picks'
99
72
  effects:
100
73
  - { target: skills.chosen, op: grant, value: { formula: pick.value } }
@@ -1,6 +1,6 @@
1
1
  id: classes.rogue.rackets.mastermind
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: rogue.racket }
4
4
  effects:
5
5
  - { target: rogue.racket, op: set, value: "'mastermind'" }
6
6
  - {
@@ -1,6 +1,6 @@
1
1
  id: classes.rogue.rackets.ruffian
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: rogue.racket }
4
4
  effects:
5
5
  - { target: rogue.racket, op: set, value: "'ruffian'" }
6
6
  - {
@@ -1,6 +1,6 @@
1
1
  id: classes.rogue.rackets.scoundrel
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: rogue.racket }
4
4
  effects:
5
5
  - { target: rogue.racket, op: set, value: "'scoundrel'" }
6
6
  - {
@@ -1,6 +1,6 @@
1
1
  id: classes.rogue.rackets.thief
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: rogue.racket }
4
4
  effects:
5
5
  - { target: rogue.racket, op: set, value: "'thief'" }
6
6
  - {
@@ -47,14 +47,7 @@ choices:
47
47
  # The racket first: it names the other key attributes the rogue may take, and its own choice (a
48
48
  # mastermind's skill) is asked right after it, before the free skills.
49
49
  - id: racket
50
- from:
51
- items:
52
- [
53
- classes.rogue.rackets.mastermind,
54
- classes.rogue.rackets.ruffian,
55
- classes.rogue.rackets.scoundrel,
56
- classes.rogue.rackets.thief,
57
- ]
50
+ from: { type: feature, where: "item.classOption == 'rogue.racket'" }
58
51
  - id: key-attribute
59
52
  from:
60
53
  options:
@@ -81,32 +74,7 @@ choices:
81
74
  unique: skill-training
82
75
  pick: 7 + max(0, attributes.int.mod)
83
76
  from:
84
- values:
85
- [
86
- skill.acrobatics,
87
- skill.arcana,
88
- skill.athletics,
89
- skill.crafting,
90
- skill.deception,
91
- skill.diplomacy,
92
- skill.intimidation,
93
- skill.medicine,
94
- skill.nature,
95
- skill.occultism,
96
- skill.performance,
97
- skill.religion,
98
- skill.society,
99
- skill.stealth,
100
- skill.survival,
101
- skill.thievery,
102
- skill.lore.academia,
103
- skill.lore.circus,
104
- skill.lore.farming,
105
- skill.lore.legal,
106
- skill.lore.scribing,
107
- skill.lore.underworld,
108
- skill.lore.warfare,
109
- ]
77
+ values: { formula: skills.offered }
110
78
  where: '!(value in skills.trained) && !(value in skills.chosen) || value in choice.picks'
111
79
  effects:
112
80
  - { target: skills.chosen, op: grant, value: { formula: pick.value } }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.aberrant
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'aberrant'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'occult'" }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.angelic
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'angelic'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'divine'" }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.demonic
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'demonic'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'divine'" }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.diabolic
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'diabolic'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'divine'" }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.draconic
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'draconic'" }
6
6
  - {
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.elemental
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'elemental'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'primal'" }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.fey
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'fey'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'primal'" }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.hag
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'hag'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'occult'" }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.imperial
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'imperial'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'arcane'" }
@@ -1,6 +1,6 @@
1
1
  id: classes.sorcerer.bloodlines.undead
2
2
  type: feature
3
- fields: { level: 1 }
3
+ fields: { level: 1, classOption: sorcerer.bloodline }
4
4
  effects:
5
5
  - { target: sorcerer.bloodline, op: set, value: "'undead'" }
6
6
  - { target: spellcasting.tradition, op: set, value: "'divine'" }