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