@opencharacter/wwn-srd 0.0.0-stage → 0.1.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 (451) hide show
  1. package/LICENSE +144 -0
  2. package/README.md +109 -2
  3. package/content/armor/buff-coat.yaml +7 -0
  4. package/content/armor/cuirass-and-greaves.yaml +7 -0
  5. package/content/armor/grand-plate.yaml +7 -0
  6. package/content/armor/great-armor.yaml +7 -0
  7. package/content/armor/large-shield.yaml +6 -0
  8. package/content/armor/linothorax.yaml +6 -0
  9. package/content/armor/mail-hauberk.yaml +7 -0
  10. package/content/armor/mail-shirt.yaml +6 -0
  11. package/content/armor/pieced-armor.yaml +7 -0
  12. package/content/armor/plate-armor.yaml +7 -0
  13. package/content/armor/scaled-armor.yaml +7 -0
  14. package/content/armor/small-shield.yaml +6 -0
  15. package/content/armor/war-robe.yaml +7 -0
  16. package/content/armor/war-shirt.yaml +7 -0
  17. package/content/arts/accursed/accursed-blade.yaml +5 -0
  18. package/content/arts/accursed/accursed-bolt.yaml +5 -0
  19. package/content/arts/accursed/bewitching-distraction.yaml +5 -0
  20. package/content/arts/accursed/compelling-shriek.yaml +5 -0
  21. package/content/arts/accursed/devils-bargain.yaml +4 -0
  22. package/content/arts/accursed/dire-pact.yaml +4 -0
  23. package/content/arts/accursed/lying-face.yaml +5 -0
  24. package/content/arts/accursed/night-black-eyes.yaml +4 -0
  25. package/content/arts/accursed/pacted-protection.yaml +4 -0
  26. package/content/arts/accursed/rob-vitality.yaml +5 -0
  27. package/content/arts/accursed/scourging-curse.yaml +5 -0
  28. package/content/arts/accursed/shadowed-steps.yaml +5 -0
  29. package/content/arts/accursed/snaring-speech.yaml +5 -0
  30. package/content/arts/accursed/sorcerous-battery.yaml +5 -0
  31. package/content/arts/accursed/soul-consumption.yaml +5 -0
  32. package/content/arts/accursed/tendrils-of-night.yaml +5 -0
  33. package/content/arts/accursed/unseen-steps.yaml +5 -0
  34. package/content/arts/accursed/weeping-wounds.yaml +5 -0
  35. package/content/arts/accursed/weight-of-sin.yaml +5 -0
  36. package/content/arts/bard/a-thousand-tongues.yaml +5 -0
  37. package/content/arts/bard/battle-cry.yaml +5 -0
  38. package/content/arts/bard/cursed-tune.yaml +5 -0
  39. package/content/arts/bard/deft-fingers.yaml +6 -0
  40. package/content/arts/bard/entangle-incantation.yaml +5 -0
  41. package/content/arts/bard/evoke-emotion.yaml +5 -0
  42. package/content/arts/bard/inspire-dread.yaml +5 -0
  43. package/content/arts/bard/keen-senses.yaml +4 -0
  44. package/content/arts/bard/liberating-song.yaml +5 -0
  45. package/content/arts/bard/rally.yaml +5 -0
  46. package/content/arts/bard/soothe-the-savage.yaml +5 -0
  47. package/content/arts/bard/soothing-graces.yaml +4 -0
  48. package/content/arts/bard/swift-misdirection.yaml +5 -0
  49. package/content/arts/beastmaster/beast-ward.yaml +5 -0
  50. package/content/arts/beastmaster/bind-companion.yaml +5 -0
  51. package/content/arts/beastmaster/eyes-of-the-beast.yaml +5 -0
  52. package/content/arts/beastmaster/feral-toughness.yaml +8 -0
  53. package/content/arts/beastmaster/howl-of-distant-summons.yaml +5 -0
  54. package/content/arts/beastmaster/know-the-weak-spot.yaml +5 -0
  55. package/content/arts/beastmaster/mind-call.yaml +5 -0
  56. package/content/arts/beastmaster/natural-weaponry.yaml +10 -0
  57. package/content/arts/beastmaster/savage-senses.yaml +5 -0
  58. package/content/arts/beastmaster/shared-vitality.yaml +5 -0
  59. package/content/arts/beastmaster/swift-healing.yaml +5 -0
  60. package/content/arts/beastmaster/tongue-of-the-beasts.yaml +5 -0
  61. package/content/arts/blood-priest/a-thousand-tongues.yaml +5 -0
  62. package/content/arts/blood-priest/armor-of-god.yaml +11 -0
  63. package/content/arts/blood-priest/divine-guidance.yaml +5 -0
  64. package/content/arts/blood-priest/fear-no-flame.yaml +5 -0
  65. package/content/arts/blood-priest/god-wills-it.yaml +5 -0
  66. package/content/arts/blood-priest/light-of-faith.yaml +5 -0
  67. package/content/arts/blood-priest/merciful-healing.yaml +5 -0
  68. package/content/arts/blood-priest/sanctified-ward.yaml +5 -0
  69. package/content/arts/blood-priest/smite-the-wicked.yaml +5 -0
  70. package/content/arts/blood-priest/transubstantiation.yaml +5 -0
  71. package/content/arts/blood-priest/turn-false-life.yaml +5 -0
  72. package/content/arts/blood-priest/words-of-mercy.yaml +5 -0
  73. package/content/arts/blood-priest/wrath-of-the-most-high.yaml +5 -0
  74. package/content/arts/duelist/blood-for-blood.yaml +5 -0
  75. package/content/arts/duelist/burst-of-speed.yaml +5 -0
  76. package/content/arts/duelist/code-duello.yaml +5 -0
  77. package/content/arts/duelist/crushing-superiority.yaml +5 -0
  78. package/content/arts/duelist/dauntless-step.yaml +5 -0
  79. package/content/arts/duelist/dodge-doom.yaml +5 -0
  80. package/content/arts/duelist/favored-weapon.yaml +13 -0
  81. package/content/arts/duelist/forced-engagement.yaml +5 -0
  82. package/content/arts/duelist/gentlemans-withdrawal.yaml +5 -0
  83. package/content/arts/duelist/graceful-leap.yaml +5 -0
  84. package/content/arts/duelist/lightning-draw.yaml +5 -0
  85. package/content/arts/duelist/piercing-strike.yaml +5 -0
  86. package/content/arts/duelist/spiritual-weapon.yaml +5 -0
  87. package/content/arts/duelist/unbindable.yaml +5 -0
  88. package/content/arts/duelist/unworthy-rabble.yaml +5 -0
  89. package/content/arts/duelist/whirling-evasion.yaml +10 -0
  90. package/content/arts/elementalist/beckoned-deluge.yaml +5 -0
  91. package/content/arts/elementalist/earthsight.yaml +5 -0
  92. package/content/arts/elementalist/elemental-blast.yaml +5 -0
  93. package/content/arts/elementalist/elemental-resilience.yaml +5 -0
  94. package/content/arts/elementalist/elemental-sparks.yaml +5 -0
  95. package/content/arts/elementalist/flamesight.yaml +5 -0
  96. package/content/arts/elementalist/pavis-of-elements.yaml +8 -0
  97. package/content/arts/elementalist/petrifying-stare.yaml +5 -0
  98. package/content/arts/elementalist/rune-of-destruction.yaml +5 -0
  99. package/content/arts/elementalist/steps-of-air.yaml +5 -0
  100. package/content/arts/elementalist/stunning-shock.yaml +5 -0
  101. package/content/arts/elementalist/thermal-shield.yaml +5 -0
  102. package/content/arts/healer/empowered-healer.yaml +4 -0
  103. package/content/arts/healer/facile-healer.yaml +4 -0
  104. package/content/arts/healer/far-healer.yaml +4 -0
  105. package/content/arts/healer/final-repose.yaml +5 -0
  106. package/content/arts/healer/healers-eye.yaml +5 -0
  107. package/content/arts/healer/healers-knife.yaml +4 -0
  108. package/content/arts/healer/healing-touch.yaml +6 -0
  109. package/content/arts/healer/limb-restoration.yaml +8 -0
  110. package/content/arts/healer/purge-ailment.yaml +5 -0
  111. package/content/arts/healer/refined-restoration.yaml +4 -0
  112. package/content/arts/healer/revive-the-fallen.yaml +8 -0
  113. package/content/arts/healer/swift-healer.yaml +4 -0
  114. package/content/arts/healer/tireless-vigor.yaml +5 -0
  115. package/content/arts/healer/vital-furnace.yaml +5 -0
  116. package/content/arts/high-mage/arcane-lexicon.yaml +5 -0
  117. package/content/arts/high-mage/counter-magic.yaml +5 -0
  118. package/content/arts/high-mage/empowered-sorcery.yaml +5 -0
  119. package/content/arts/high-mage/hang-sorcery.yaml +5 -0
  120. package/content/arts/high-mage/inexorable-effect.yaml +5 -0
  121. package/content/arts/high-mage/iron-resolution.yaml +5 -0
  122. package/content/arts/high-mage/preparatory-countermagic.yaml +5 -0
  123. package/content/arts/high-mage/psychic-conversion.yaml +4 -0
  124. package/content/arts/high-mage/restrained-casting.yaml +5 -0
  125. package/content/arts/high-mage/retain-sorcery.yaml +5 -0
  126. package/content/arts/high-mage/sense-magic.yaml +5 -0
  127. package/content/arts/high-mage/suppress-magic.yaml +5 -0
  128. package/content/arts/high-mage/swift-casting.yaml +5 -0
  129. package/content/arts/high-mage/ward-allies.yaml +5 -0
  130. package/content/arts/high-mage/wizards-grandeur.yaml +5 -0
  131. package/content/arts/mageslayer/absolute-negation.yaml +6 -0
  132. package/content/arts/mageslayer/antimage.yaml +8 -0
  133. package/content/arts/mageslayer/dispel-enchantment.yaml +6 -0
  134. package/content/arts/mageslayer/disrupt-sorcery.yaml +6 -0
  135. package/content/arts/mageslayer/immaculate-body.yaml +5 -0
  136. package/content/arts/mageslayer/immaculate-mind.yaml +5 -0
  137. package/content/arts/mageslayer/know-your-prey.yaml +7 -0
  138. package/content/arts/mageslayer/magebane.yaml +5 -0
  139. package/content/arts/mageslayer/share-the-pain.yaml +6 -0
  140. package/content/arts/mageslayer/spellshield.yaml +5 -0
  141. package/content/arts/mageslayer/ward-ally.yaml +6 -0
  142. package/content/arts/mageslayer/witchfinder.yaml +6 -0
  143. package/content/arts/necromancer/bonetalker.yaml +5 -0
  144. package/content/arts/necromancer/cold-flesh.yaml +6 -0
  145. package/content/arts/necromancer/consume-life-energy.yaml +4 -0
  146. package/content/arts/necromancer/false-death.yaml +5 -0
  147. package/content/arts/necromancer/gravesight.yaml +5 -0
  148. package/content/arts/necromancer/keeper-of-the-gate.yaml +5 -0
  149. package/content/arts/necromancer/life-bridge.yaml +5 -0
  150. package/content/arts/necromancer/master-of-bones.yaml +5 -0
  151. package/content/arts/necromancer/red-harvest.yaml +5 -0
  152. package/content/arts/necromancer/unaging.yaml +4 -0
  153. package/content/arts/necromancer/uncanny-ichor.yaml +4 -0
  154. package/content/arts/necromancer/unliving-persistence.yaml +5 -0
  155. package/content/arts/skinshifter/change-form.yaml +6 -0
  156. package/content/arts/skinshifter/eyes-of-the-hawk.yaml +4 -0
  157. package/content/arts/skinshifter/feline-leap.yaml +4 -0
  158. package/content/arts/skinshifter/feral-prowess.yaml +4 -0
  159. package/content/arts/skinshifter/intrinsic-armor.yaml +4 -0
  160. package/content/arts/skinshifter/manifest-wings.yaml +4 -0
  161. package/content/arts/skinshifter/monkeys-road.yaml +4 -0
  162. package/content/arts/skinshifter/octopus-embrace.yaml +4 -0
  163. package/content/arts/skinshifter/perfect-mimicry.yaml +4 -0
  164. package/content/arts/skinshifter/pliant-flesh.yaml +4 -0
  165. package/content/arts/skinshifter/savage-talons.yaml +4 -0
  166. package/content/arts/skinshifter/sculptors-beauty.yaml +4 -0
  167. package/content/arts/skinshifter/serpents-kiss.yaml +5 -0
  168. package/content/arts/skinshifter/warform.yaml +4 -0
  169. package/content/arts/skinshifter/wisdom-of-fin-and-scale.yaml +4 -0
  170. package/content/arts/thought-noble/block-memory.yaml +5 -0
  171. package/content/arts/thought-noble/elicitation-of-truth.yaml +8 -0
  172. package/content/arts/thought-noble/facile-speech.yaml +7 -0
  173. package/content/arts/thought-noble/far-speech.yaml +5 -0
  174. package/content/arts/thought-noble/hypercognition.yaml +5 -0
  175. package/content/arts/thought-noble/iconograph.yaml +5 -0
  176. package/content/arts/thought-noble/impress-imperative.yaml +5 -0
  177. package/content/arts/thought-noble/mind-light.yaml +4 -0
  178. package/content/arts/thought-noble/mind-over-matter.yaml +5 -0
  179. package/content/arts/thought-noble/mirror-mask.yaml +5 -0
  180. package/content/arts/thought-noble/open-mind.yaml +6 -0
  181. package/content/arts/thought-noble/positive-association.yaml +5 -0
  182. package/content/arts/thought-noble/read-intent.yaml +5 -0
  183. package/content/arts/thought-noble/surface-apprehension.yaml +5 -0
  184. package/content/arts/thought-noble/thoughts-like-razors.yaml +5 -0
  185. package/content/arts/thought-noble/unthinkable-thought.yaml +5 -0
  186. package/content/arts/vowed/brutal-counter.yaml +5 -0
  187. package/content/arts/vowed/faultless-awareness.yaml +4 -0
  188. package/content/arts/vowed/hurling-throw.yaml +5 -0
  189. package/content/arts/vowed/inward-eye.yaml +5 -0
  190. package/content/arts/vowed/leap-of-the-heavens.yaml +5 -0
  191. package/content/arts/vowed/martial-style.yaml +9 -0
  192. package/content/arts/vowed/masters-vigor.yaml +4 -0
  193. package/content/arts/vowed/mob-justice.yaml +5 -0
  194. package/content/arts/vowed/nimble-ascent.yaml +5 -0
  195. package/content/arts/vowed/purified-body.yaml +5 -0
  196. package/content/arts/vowed/revivifying-breath.yaml +5 -0
  197. package/content/arts/vowed/shattering-strike.yaml +5 -0
  198. package/content/arts/vowed/style-weaponry.yaml +4 -0
  199. package/content/arts/vowed/unarmed-might.yaml +10 -0
  200. package/content/arts/vowed/unarmored-defense.yaml +11 -0
  201. package/content/arts/vowed/unobtrusive-step.yaml +5 -0
  202. package/content/arts/wise/auspicious-undertaking.yaml +5 -0
  203. package/content/arts/wise/compel-truth.yaml +5 -0
  204. package/content/arts/wise/deliver-oracle.yaml +5 -0
  205. package/content/arts/wise/dread-awe.yaml +5 -0
  206. package/content/arts/wise/elite-ties.yaml +5 -0
  207. package/content/arts/wise/erudite.yaml +5 -0
  208. package/content/arts/wise/evil-eye.yaml +5 -0
  209. package/content/arts/wise/find-object.yaml +5 -0
  210. package/content/arts/wise/folk-friend.yaml +5 -0
  211. package/content/arts/wise/healer.yaml +7 -0
  212. package/content/arts/wise/holy-sanctity.yaml +5 -0
  213. package/content/arts/wise/ill-fate.yaml +5 -0
  214. package/content/arts/wise/luck-blessing.yaml +5 -0
  215. package/content/arts/wise/personal-impunity.yaml +5 -0
  216. package/content/arts/wise/read-omens.yaml +5 -0
  217. package/content/arts/wise/skilled.yaml +5 -0
  218. package/content/arts/wise/war-curse.yaml +5 -0
  219. package/content/backgrounds/artisan.yaml +18 -0
  220. package/content/backgrounds/barbarian.yaml +18 -0
  221. package/content/classes/adventurer.yaml +16 -0
  222. package/content/classes/expert.yaml +6 -0
  223. package/content/classes/mage.yaml +20 -0
  224. package/content/classes/warrior.yaml +8 -0
  225. package/content/foci/alert.yaml +10 -0
  226. package/content/foci/armored-magic.yaml +9 -0
  227. package/content/foci/armsmaster.yaml +20 -0
  228. package/content/foci/artisan.yaml +5 -0
  229. package/content/foci/assassin.yaml +5 -0
  230. package/content/foci/authority.yaml +5 -0
  231. package/content/foci/close-combatant.yaml +8 -0
  232. package/content/foci/connected.yaml +5 -0
  233. package/content/foci/cultured.yaml +5 -0
  234. package/content/foci/deadeye.yaml +11 -0
  235. package/content/foci/dealmaker.yaml +5 -0
  236. package/content/foci/developed-attribute.yaml +23 -0
  237. package/content/foci/die-hard.yaml +5 -0
  238. package/content/foci/diplomatic-grace.yaml +5 -0
  239. package/content/foci/gifted-chirurgeon.yaml +11 -0
  240. package/content/foci/henchkeeper.yaml +5 -0
  241. package/content/foci/impervious-defense.yaml +5 -0
  242. package/content/foci/impostor.yaml +5 -0
  243. package/content/foci/lucky.yaml +10 -0
  244. package/content/foci/nullifier.yaml +7 -0
  245. package/content/foci/poisoner.yaml +5 -0
  246. package/content/foci/polymath.yaml +10 -0
  247. package/content/foci/rider.yaml +5 -0
  248. package/content/foci/shocking-assault.yaml +9 -0
  249. package/content/foci/snipers-eye.yaml +5 -0
  250. package/content/foci/special-origin.yaml +5 -0
  251. package/content/foci/specialist.yaml +38 -0
  252. package/content/foci/spirit-familiar.yaml +5 -0
  253. package/content/foci/traditional-education.yaml +15 -0
  254. package/content/foci/trapmaster.yaml +5 -0
  255. package/content/foci/unarmed-combatant.yaml +16 -0
  256. package/content/foci/unique-gift.yaml +5 -0
  257. package/content/foci/valiant-defender.yaml +5 -0
  258. package/content/foci/well-met.yaml +3 -0
  259. package/content/foci/whirlwind-assault.yaml +5 -0
  260. package/content/foci/xenoblooded.yaml +22 -0
  261. package/content/gear/arrows.yaml +5 -0
  262. package/content/gear/artisans-equipment.yaml +6 -0
  263. package/content/gear/backpack.yaml +6 -0
  264. package/content/gear/battle-horse.yaml +5 -0
  265. package/content/gear/boots.yaml +6 -0
  266. package/content/gear/candle.yaml +5 -0
  267. package/content/gear/cart.yaml +4 -0
  268. package/content/gear/common-clothes.yaml +6 -0
  269. package/content/gear/cooking-utensils.yaml +5 -0
  270. package/content/gear/criminal-tools.yaml +6 -0
  271. package/content/gear/crowbar.yaml +5 -0
  272. package/content/gear/draft-horse.yaml +5 -0
  273. package/content/gear/dungeoneering-kit.yaml +6 -0
  274. package/content/gear/fine-clothes.yaml +6 -0
  275. package/content/gear/firewood.yaml +6 -0
  276. package/content/gear/flask.yaml +5 -0
  277. package/content/gear/grappling-hook.yaml +5 -0
  278. package/content/gear/healers-pouch.yaml +5 -0
  279. package/content/gear/hurlant-bolts.yaml +5 -0
  280. package/content/gear/iron-spikes.yaml +5 -0
  281. package/content/gear/lantern.yaml +5 -0
  282. package/content/gear/mirror.yaml +4 -0
  283. package/content/gear/mule.yaml +5 -0
  284. package/content/gear/noble-clothes.yaml +6 -0
  285. package/content/gear/noble-courtier-outfit.yaml +6 -0
  286. package/content/gear/oil.yaml +6 -0
  287. package/content/gear/paper.yaml +4 -0
  288. package/content/gear/performers-implements.yaml +6 -0
  289. package/content/gear/rations.yaml +5 -0
  290. package/content/gear/riding-horse.yaml +5 -0
  291. package/content/gear/rope.yaml +5 -0
  292. package/content/gear/sack.yaml +5 -0
  293. package/content/gear/shovel.yaml +5 -0
  294. package/content/gear/small-tool.yaml +5 -0
  295. package/content/gear/tinder-box.yaml +4 -0
  296. package/content/gear/torch.yaml +7 -0
  297. package/content/gear/waterskin.yaml +5 -0
  298. package/content/gear/wilderness-travel-gear.yaml +6 -0
  299. package/content/gear/working-dog.yaml +5 -0
  300. package/content/gear/writing-kit.yaml +5 -0
  301. package/content/partials/accursed.yaml +17 -0
  302. package/content/partials/bard.yaml +8 -0
  303. package/content/partials/beastmaster.yaml +8 -0
  304. package/content/partials/blood-priest.yaml +6 -0
  305. package/content/partials/duelist.yaml +9 -0
  306. package/content/partials/expert.yaml +6 -0
  307. package/content/partials/healer.yaml +8 -0
  308. package/content/partials/mage.yaml +33 -0
  309. package/content/partials/mageslayer.yaml +20 -0
  310. package/content/partials/skinshifter.yaml +8 -0
  311. package/content/partials/thought-noble.yaml +8 -0
  312. package/content/partials/vowed.yaml +40 -0
  313. package/content/partials/warrior.yaml +6 -0
  314. package/content/partials/wise.yaml +44 -0
  315. package/content/spells/elementalist/aqueous-harmony.yaml +5 -0
  316. package/content/spells/elementalist/boreal-wings.yaml +5 -0
  317. package/content/spells/elementalist/burrower-below.yaml +5 -0
  318. package/content/spells/elementalist/calcifying-scourge.yaml +5 -0
  319. package/content/spells/elementalist/elemental-favor.yaml +5 -0
  320. package/content/spells/elementalist/elemental-guardian.yaml +5 -0
  321. package/content/spells/elementalist/elemental-spy.yaml +5 -0
  322. package/content/spells/elementalist/elemental-vallation.yaml +5 -0
  323. package/content/spells/elementalist/flame-scrying.yaml +5 -0
  324. package/content/spells/elementalist/flame-without-end.yaml +5 -0
  325. package/content/spells/elementalist/fury-of-the-elements.yaml +5 -0
  326. package/content/spells/elementalist/like-the-stones.yaml +5 -0
  327. package/content/spells/elementalist/pact-of-stone-and-sea.yaml +5 -0
  328. package/content/spells/elementalist/tremors-of-the-depths.yaml +5 -0
  329. package/content/spells/elementalist/wind-walking.yaml +5 -0
  330. package/content/spells/high/abdication-of-temporal-presence.yaml +5 -0
  331. package/content/spells/high/adopt-the-simulacular-visage.yaml +5 -0
  332. package/content/spells/high/apprehending-the-arcane-form.yaml +5 -0
  333. package/content/spells/high/banishment-to-the-black-glass-labyrinth.yaml +5 -0
  334. package/content/spells/high/calculation-of-the-evoked-servitor.yaml +5 -0
  335. package/content/spells/high/calculation-of-the-phantasmal-eidolon.yaml +5 -0
  336. package/content/spells/high/casting-forth-the-inner-eye.yaml +5 -0
  337. package/content/spells/high/cognitive-supersession-of-the-inferior-orders.yaml +5 -0
  338. package/content/spells/high/conjunct-the-vital-viscera.yaml +5 -0
  339. package/content/spells/high/conjunction-of-the-inexorable-step.yaml +5 -0
  340. package/content/spells/high/contingent-excision-of-arcana.yaml +5 -0
  341. package/content/spells/high/coruscating-coffin.yaml +5 -0
  342. package/content/spells/high/damnation-of-the-sense.yaml +5 -0
  343. package/content/spells/high/dazzling-prismatic-hemicycle.yaml +5 -0
  344. package/content/spells/high/decree-of-ligneous-dissolution.yaml +5 -0
  345. package/content/spells/high/decree-of-lithic-dissolution.yaml +5 -0
  346. package/content/spells/high/deluge-of-hell.yaml +5 -0
  347. package/content/spells/high/disjunctive-temporal-reversion.yaml +5 -0
  348. package/content/spells/high/earth-as-clay.yaml +5 -0
  349. package/content/spells/high/evert-the-inwardness.yaml +5 -0
  350. package/content/spells/high/excellent-transpicuous-transformation.yaml +5 -0
  351. package/content/spells/high/exhalation-of-congelating-cold.yaml +5 -0
  352. package/content/spells/high/extirpate-arcana.yaml +5 -0
  353. package/content/spells/high/foresightful-apprehension.yaml +5 -0
  354. package/content/spells/high/glass-chimes-of-the-bamboo-terrace.yaml +5 -0
  355. package/content/spells/high/grinding-geas.yaml +5 -0
  356. package/content/spells/high/howl-of-light.yaml +5 -0
  357. package/content/spells/high/imperceptible-cerebral-divulgence.yaml +5 -0
  358. package/content/spells/high/ineluctable-shackles-of-volition.yaml +5 -0
  359. package/content/spells/high/inexorable-imputation.yaml +5 -0
  360. package/content/spells/high/invocation-of-the-invincible-citadel.yaml +5 -0
  361. package/content/spells/high/jade-palanquin-of-the-faceless-god.yaml +5 -0
  362. package/content/spells/high/long-amber-moment.yaml +5 -0
  363. package/content/spells/high/mantle-of-disjecting-dissection.yaml +5 -0
  364. package/content/spells/high/obnubilation-of-the-will.yaml +5 -0
  365. package/content/spells/high/ochre-sigil-of-juxtaposition.yaml +5 -0
  366. package/content/spells/high/open-the-high-road.yaml +5 -0
  367. package/content/spells/high/phantasmal-mimesis.yaml +5 -0
  368. package/content/spells/high/phobic-storm.yaml +5 -0
  369. package/content/spells/high/pierce-the-pallid-gate.yaml +5 -0
  370. package/content/spells/high/prudentially-transient-abnegation-of-life.yaml +5 -0
  371. package/content/spells/high/resounding-temporal-echo.yaml +5 -0
  372. package/content/spells/high/scorn-the-fetters-of-earth.yaml +5 -0
  373. package/content/spells/high/sigil-of-aeolian-auctoritas.yaml +5 -0
  374. package/content/spells/high/torment-of-tumefaction.yaml +5 -0
  375. package/content/spells/high/touch-of-elucidating-intangibility.yaml +5 -0
  376. package/content/spells/high/vallation-of-specified-exclusion.yaml +5 -0
  377. package/content/spells/high/velocitous-imbuement.yaml +5 -0
  378. package/content/spells/high/verdant-vallation.yaml +5 -0
  379. package/content/spells/high/visitation-of-the-clement-clime.yaml +5 -0
  380. package/content/spells/high/wardpact-invocation.yaml +5 -0
  381. package/content/spells/high/wind-of-the-final-repose.yaml +5 -0
  382. package/content/spells/necromancer/augment-mortal-vitality.yaml +5 -0
  383. package/content/spells/necromancer/boneshaper.yaml +5 -0
  384. package/content/spells/necromancer/call-of-the-tomb.yaml +5 -0
  385. package/content/spells/necromancer/command-the-dead.yaml +5 -0
  386. package/content/spells/necromancer/compel-flesh.yaml +5 -0
  387. package/content/spells/necromancer/enfeebling-wave.yaml +5 -0
  388. package/content/spells/necromancer/everlasting.yaml +5 -0
  389. package/content/spells/necromancer/festering-curse.yaml +5 -0
  390. package/content/spells/necromancer/final-death.yaml +5 -0
  391. package/content/spells/necromancer/forgetting-the-grave.yaml +5 -0
  392. package/content/spells/necromancer/merge-souls.yaml +5 -0
  393. package/content/spells/necromancer/query-the-skull.yaml +5 -0
  394. package/content/spells/necromancer/raise-corpse.yaml +5 -0
  395. package/content/spells/necromancer/raise-grave-knight.yaml +5 -0
  396. package/content/spells/necromancer/smite-the-dead.yaml +5 -0
  397. package/content/spells/necromancer/terrible-liveliness.yaml +5 -0
  398. package/content/weapons/blackjack.yaml +8 -0
  399. package/content/weapons/claw-blades.yaml +10 -0
  400. package/content/weapons/club.yaml +10 -0
  401. package/content/weapons/crossbow.yaml +10 -0
  402. package/content/weapons/dagger.yaml +12 -0
  403. package/content/weapons/great-club.yaml +11 -0
  404. package/content/weapons/great-hammer.yaml +11 -0
  405. package/content/weapons/great-hurlant.yaml +11 -0
  406. package/content/weapons/great-sword.yaml +11 -0
  407. package/content/weapons/halberd.yaml +11 -0
  408. package/content/weapons/hand-axe.yaml +12 -0
  409. package/content/weapons/hand-hurlant.yaml +10 -0
  410. package/content/weapons/heavy-spear.yaml +11 -0
  411. package/content/weapons/large-bow.yaml +11 -0
  412. package/content/weapons/large-shield-bash.yaml +11 -0
  413. package/content/weapons/light-spear.yaml +12 -0
  414. package/content/weapons/long-hurlant.yaml +11 -0
  415. package/content/weapons/long-sword.yaml +9 -0
  416. package/content/weapons/mace.yaml +10 -0
  417. package/content/weapons/pike.yaml +11 -0
  418. package/content/weapons/short-sword.yaml +9 -0
  419. package/content/weapons/small-bow.yaml +10 -0
  420. package/content/weapons/small-shield-bash.yaml +9 -0
  421. package/content/weapons/staff.yaml +10 -0
  422. package/content/weapons/stiletto.yaml +10 -0
  423. package/content/weapons/throwing-blade.yaml +11 -0
  424. package/content/weapons/unarmed.yaml +9 -0
  425. package/content/weapons/war-axe.yaml +11 -0
  426. package/content/weapons/war-hammer.yaml +9 -0
  427. package/dist/i18n/en.d.ts +3 -0
  428. package/dist/i18n/en.js +2 -0
  429. package/dist/i18n/en.json +1171 -0
  430. package/dist/index.d.ts +3 -0
  431. package/dist/index.js +2 -0
  432. package/dist/release.json +35216 -0
  433. package/i18n/en/content.yaml +474 -0
  434. package/i18n/en.yaml +696 -0
  435. package/pack.yaml +12 -0
  436. package/package.json +58 -3
  437. package/rules/advancement.yaml +188 -0
  438. package/rules/attributes.yaml +30 -0
  439. package/rules/backgrounds.yaml +59 -0
  440. package/rules/classes.yaml +76 -0
  441. package/rules/combat.yaml +241 -0
  442. package/rules/creation-steps.yaml +258 -0
  443. package/rules/creation.yaml +448 -0
  444. package/rules/display.yaml +597 -0
  445. package/rules/equipment.yaml +45 -0
  446. package/rules/foci.yaml +57 -0
  447. package/rules/health.yaml +176 -0
  448. package/rules/magic.yaml +484 -0
  449. package/rules/saves.yaml +62 -0
  450. package/rules/skills.yaml +93 -0
  451. package/rules/tags.yaml +86 -0
@@ -0,0 +1,176 @@
1
+ fields:
2
+ # The rolled maximum: each level's hit dice plus the per-die bonus and Constitution modifier.
3
+ hp.rolled: { type: integer, input: true, default: 1, min: 1 }
4
+ # Die Hard adds 2 a level on top.
5
+ hp.max: { type: integer, formula: hp.rolled, min: 1 }
6
+ hp.current: { type: integer, input: true, default: 1, min: 0, max: hp.max }
7
+
8
+ strain.max: { type: integer, formula: attributes.con.score }
9
+ strain.current: { type: integer, input: true, default: 0, min: 0, max: strain.max }
10
+
11
+ conditions.frail: { type: boolean, input: true, default: false }
12
+ conditions.mortallyWounded: { type: boolean, input: true, default: false }
13
+
14
+ followUps:
15
+ # At zero hit points a hero is mortally wounded (or dies, if Frail).
16
+ - id: downed
17
+ becomes: hp.current == 0 && !conditions.mortallyWounded
18
+ required: true
19
+ action: fall
20
+
21
+ actions:
22
+ - id: fall
23
+ tags: [health]
24
+ available: hp.current == 0 && !conditions.mortallyWounded
25
+ results: [mortally-wounded, dead]
26
+ steps:
27
+ - id: down
28
+ kind: changes
29
+ when: '!conditions.frail'
30
+ changes:
31
+ - { type: set, field: conditions.mortallyWounded, value: true }
32
+ - id: result
33
+ kind: outcome
34
+ result: "conditions.frail ? 'dead' : 'mortally-wounded'"
35
+
36
+ # Stabilized: back with 1 hit point after ten minutes, and Frail.
37
+ - id: stabilize
38
+ tags: [health]
39
+ available: conditions.mortallyWounded
40
+ results: [stabilized]
41
+ steps:
42
+ - id: stable
43
+ kind: changes
44
+ changes:
45
+ - { type: set, field: conditions.mortallyWounded, value: false }
46
+ - { type: set, field: conditions.frail, value: true }
47
+ - { type: set, field: hp.current, value: 1 }
48
+ - id: result
49
+ kind: outcome
50
+ result: "'stabilized'"
51
+
52
+ - id: take-damage
53
+ tags: [health]
54
+ params:
55
+ amount: { type: integer, min: 0 }
56
+ results: [taken]
57
+ steps:
58
+ - id: deal
59
+ kind: changes
60
+ changes:
61
+ - {
62
+ type: adjust,
63
+ when: params.amount > 0,
64
+ field: hp.current,
65
+ by: -params.amount,
66
+ tags: [damage],
67
+ }
68
+ - id: result
69
+ kind: outcome
70
+ result: "'taken'"
71
+
72
+ # Magical healing also ends Mortally Wounded and Frail; strain is the healer's to add.
73
+ - id: heal
74
+ tags: [health]
75
+ params:
76
+ amount: { type: integer, min: 0 }
77
+ magical: { type: boolean, default: false }
78
+ strain: { type: integer, default: 0, min: 0 }
79
+ results: [healed, too-strained]
80
+ steps:
81
+ - id: strained
82
+ kind: outcome
83
+ when: params.strain > 0 && strain.current + params.strain > strain.max
84
+ result: "'too-strained'"
85
+ - id: restore
86
+ kind: changes
87
+ changes:
88
+ - {
89
+ type: adjust,
90
+ when: params.amount > 0,
91
+ field: hp.current,
92
+ by: params.amount,
93
+ tags: [healing],
94
+ }
95
+ - { type: adjust, when: params.strain > 0, field: strain.current, by: params.strain }
96
+ - { type: set, when: params.magical, field: conditions.mortallyWounded, value: false }
97
+ - { type: set, when: params.magical, field: conditions.frail, value: false }
98
+ - id: result
99
+ kind: outcome
100
+ result: "'healed'"
101
+
102
+ # First aid: 1d6 plus the healer's Heal skill (-1 without it), 1 System Strain each time.
103
+ - id: first-aid
104
+ tags: [health]
105
+ available: strain.current < strain.max && hp.current < hp.max
106
+ params:
107
+ healerSkill: { type: integer, default: -1, min: -1, max: 4 }
108
+ results: [healed]
109
+ steps:
110
+ - id: roll
111
+ kind: roll
112
+ tags: [healing]
113
+ parts:
114
+ - dice: 1d6
115
+ - value: params.healerSkill
116
+ - id: restore
117
+ kind: changes
118
+ changes:
119
+ - { type: adjust, field: hp.current, by: 'max(0, steps.roll.total)', tags: [healing] }
120
+ - { type: adjust, field: strain.current, by: 1 }
121
+ - id: result
122
+ kind: outcome
123
+ result: "'healed'"
124
+ data:
125
+ healed: max(0, steps.roll.total)
126
+
127
+ # A good night's rest: level in hit points and one System Strain back unless Frail; spells
128
+ # and Effort committed for the day or the scene return.
129
+ - id: rest
130
+ tags: [rest]
131
+ results: [rested]
132
+ steps:
133
+ - id: recover
134
+ kind: changes
135
+ changes:
136
+ - {
137
+ type: adjust,
138
+ when: '!conditions.frail',
139
+ field: hp.current,
140
+ by: level,
141
+ tags: [healing],
142
+ }
143
+ - {
144
+ type: adjust,
145
+ when: '!conditions.frail && strain.current > 0',
146
+ field: strain.current,
147
+ by: -1,
148
+ }
149
+ - { type: set, field: spells.castsUsed, value: 0 }
150
+ - { type: set, field: spells.pointsUsed, value: 0 }
151
+ - type: set
152
+ forEach: keysOf('effortTrad')
153
+ field: { formula: "'effort.' + x + '.day'" }
154
+ value: 0
155
+ - type: set
156
+ forEach: keysOf('effortTrad')
157
+ field: { formula: "'effort.' + x + '.scene'" }
158
+ value: 0
159
+ - id: result
160
+ kind: outcome
161
+ result: "'rested'"
162
+
163
+ - id: end-scene
164
+ tags: [rest]
165
+ results: [ended]
166
+ steps:
167
+ - id: reclaim
168
+ kind: changes
169
+ changes:
170
+ - type: set
171
+ forEach: keysOf('effortTrad')
172
+ field: { formula: "'effort.' + x + '.scene'" }
173
+ value: 0
174
+ - id: result
175
+ kind: outcome
176
+ result: "'ended'"
@@ -0,0 +1,484 @@
1
+ families:
2
+ trad:
3
+ [
4
+ highmage,
5
+ elementalist,
6
+ necromancer,
7
+ healer,
8
+ vowed,
9
+ accursed,
10
+ bard,
11
+ beastmaster,
12
+ bloodpriest,
13
+ duelist,
14
+ mageslayer,
15
+ skinshifter,
16
+ thoughtnoble,
17
+ invoker,
18
+ wise,
19
+ ]
20
+ effortTrad:
21
+ [
22
+ highmage,
23
+ elementalist,
24
+ necromancer,
25
+ healer,
26
+ vowed,
27
+ accursed,
28
+ bard,
29
+ beastmaster,
30
+ bloodpriest,
31
+ duelist,
32
+ mageslayer,
33
+ skinshifter,
34
+ thoughtnoble,
35
+ ]
36
+ artTrad:
37
+ [
38
+ highmage,
39
+ elementalist,
40
+ necromancer,
41
+ healer,
42
+ vowed,
43
+ accursed,
44
+ bard,
45
+ beastmaster,
46
+ bloodpriest,
47
+ duelist,
48
+ mageslayer,
49
+ skinshifter,
50
+ thoughtnoble,
51
+ wise,
52
+ ]
53
+ effortSpan: [scene, day, ongoing]
54
+
55
+ fields:
56
+ # 2 for a full Mage of the tradition, 1 for a partial one, 0 otherwise.
57
+ 'tradition.{trad}.tier': { type: integer, formula: 0, tags: [tradition-tier] }
58
+
59
+ # How the character casts: a full caster, one partial caster, two partial casters, an
60
+ # Invoker (full or partial), or none.
61
+ spells.mode:
62
+ type: enum
63
+ values: [none, full, partial, dual, invoker, partial-invoker]
64
+ formula: >-
65
+ tradition.invoker.tier == 2 ? 'invoker'
66
+ : tradition.invoker.tier == 1 ? 'partial-invoker'
67
+ : tradition.highmage.tier == 2 || tradition.elementalist.tier == 2
68
+ || tradition.necromancer.tier == 2 ? 'full'
69
+ : (tradition.highmage.tier == 1 ? 1 : 0) + (tradition.elementalist.tier == 1 ? 1 : 0)
70
+ + (tradition.necromancer.tier == 1 ? 1 : 0) >= 2 ? 'dual'
71
+ : tradition.highmage.tier == 1 || tradition.elementalist.tier == 1
72
+ || tradition.necromancer.tier == 1 ? 'partial'
73
+ : 'none'
74
+ spells.maxLevel:
75
+ type: integer
76
+ formula: >-
77
+ spells.mode == 'full' || spells.mode == 'invoker' ? [1, 1, 2, 2, 3, 3, 4, 4, 5, 5][level - 1]
78
+ : spells.mode == 'partial' || spells.mode == 'partial-invoker'
79
+ ? [1, 1, 1, 1, 2, 2, 2, 2, 3, 3][level - 1]
80
+ : spells.mode == 'dual' ? [1, 1, 1, 2, 2, 2, 3, 3, 3, 4][level - 1]
81
+ : 0
82
+ # Spells cast a day (an Invoker spends spell points instead).
83
+ spells.castsPerDay:
84
+ type: integer
85
+ formula: >-
86
+ spells.mode == 'full' ? [1, 1, 2, 2, 3, 3, 4, 4, 5, 6][level - 1]
87
+ : spells.mode == 'partial' ? [1, 1, 1, 2, 2, 3, 3, 3, 4, 4][level - 1]
88
+ : spells.mode == 'dual' ? [1, 1, 2, 2, 2, 3, 3, 4, 4, 5][level - 1]
89
+ : 0
90
+ spells.preparedMax:
91
+ type: integer
92
+ formula: >-
93
+ spells.mode == 'full' ? [3, 3, 4, 5, 6, 7, 8, 9, 10, 12][level - 1]
94
+ : spells.mode == 'partial' ? [2, 3, 3, 4, 5, 6, 7, 7, 8, 9][level - 1]
95
+ : spells.mode == 'dual' ? [3, 4, 5, 6, 8, 9, 10, 12, 13, 15][level - 1]
96
+ : spells.mode == 'invoker'
97
+ ? max(0, [2, 3, 4, 4, 5, 6, 7, 7, 8, 9][level - 1] + attributes.int.mod)
98
+ : spells.mode == 'partial-invoker'
99
+ ? max(0, [1, 3, 3, 4, 4, 5, 5, 6, 6, 7][level - 1] + attributes.int.mod)
100
+ : 0
101
+ spells.castsUsed: { type: integer, input: true, default: 0, min: 0 }
102
+ spells.castsLeft: { type: integer, formula: 'max(0, spells.castsPerDay - spells.castsUsed)' }
103
+ # An Invoker's spell points: a cast spends the spell's level.
104
+ spells.points:
105
+ type: integer
106
+ formula: >-
107
+ spells.mode == 'invoker' ? max(0, [1, 3, 4, 5, 6, 7, 8, 9, 10, 11][level - 1] + attributes.int.mod)
108
+ : spells.mode == 'partial-invoker'
109
+ ? max(0, [1, 1, 2, 2, 3, 3, 4, 4, 5, 6][level - 1] + attributes.int.mod)
110
+ : 0
111
+ spells.pointsUsed: { type: integer, input: true, default: 0, min: 0 }
112
+ spells.pointsLeft: { type: integer, formula: 'max(0, spells.points - spells.pointsUsed)' }
113
+ spells.prepared:
114
+ type: integer
115
+ formula: "countCopies(copy.type == 'spell' && copy.state.prepared)"
116
+ # Spells a new character knows: four for a full caster or two partial casters, two for one.
117
+ spells.starting:
118
+ type: integer
119
+ formula: >-
120
+ spells.mode == 'full' || spells.mode == 'dual' || spells.mode == 'invoker' ? 4
121
+ : spells.mode == 'partial' || spells.mode == 'partial-invoker' ? 2 : 0
122
+ # An Invoker's Traditional Education: the tradition whose spells and first-level arts they
123
+ # gain, or ''.
124
+ invoker.education: { type: string, formula: "''" }
125
+
126
+ # Effort: each tradition has its own pool. A full class's is 1 plus a skill and an attribute
127
+ # modifier; a partial one has 1 less; the partial-only classes give theirs whole. At least 1.
128
+ effort.highmage.max:
129
+ type: integer
130
+ formula: >-
131
+ tradition.highmage.tier == 0 ? (invoker.education == 'highmage' ? max(1, max(0, skills.magic)) : 0)
132
+ : max(1, 1 + max(0, skills.magic) + max(attributes.int.mod, attributes.cha.mod) - (tradition.highmage.tier == 1 ? 1 : 0))
133
+ effort.elementalist.max:
134
+ type: integer
135
+ formula: >-
136
+ tradition.elementalist.tier == 0 ? (invoker.education == 'elementalist' ? max(1, max(0, skills.magic)) : 0)
137
+ : max(1, 1 + max(0, skills.magic) + max(attributes.int.mod, attributes.cha.mod) - (tradition.elementalist.tier == 1 ? 1 : 0))
138
+ effort.necromancer.max:
139
+ type: integer
140
+ formula: >-
141
+ tradition.necromancer.tier == 0 ? (invoker.education == 'necromancer' ? max(1, max(0, skills.magic)) : 0)
142
+ : max(1, 1 + max(0, skills.magic) + max(attributes.int.mod, attributes.cha.mod) - (tradition.necromancer.tier == 1 ? 1 : 0))
143
+ effort.healer.max:
144
+ type: integer
145
+ formula: >-
146
+ tradition.healer.tier == 0 ? 0
147
+ : max(1, max(0, skills.heal) + max(attributes.int.mod, attributes.cha.mod))
148
+ effort.vowed.max:
149
+ type: integer
150
+ formula: >-
151
+ tradition.vowed.tier == 0 ? 0
152
+ : max(1, (vowed.skill == '' ? 0 : max(0, fieldOf('skills.{skill}', vowed.skill))) + attributes.bestMod)
153
+ effort.accursed.max:
154
+ type: integer
155
+ formula: >-
156
+ tradition.accursed.tier == 0 ? 0
157
+ : max(1, max(0, skills.magic) + max(attributes.int.mod, attributes.cha.mod))
158
+ effort.bard.max:
159
+ type: integer
160
+ formula: >-
161
+ tradition.bard.tier == 0 ? 0
162
+ : max(1, max(0, skills.perform) + attributes.cha.mod)
163
+ effort.beastmaster.max:
164
+ type: integer
165
+ formula: >-
166
+ tradition.beastmaster.tier == 0 ? 0
167
+ : max(1, max(0, skills.survive) + max(attributes.wis.mod, attributes.cha.mod))
168
+ effort.bloodpriest.max:
169
+ type: integer
170
+ formula: >-
171
+ tradition.bloodpriest.tier == 0 ? 0
172
+ : max(1, max(0, skills.pray) + max(attributes.wis.mod, attributes.cha.mod))
173
+ effort.duelist.max:
174
+ type: integer
175
+ formula: >-
176
+ tradition.duelist.tier == 0 ? 0
177
+ : max(1, max(0, skills.stab) + max(attributes.dex.mod, attributes.int.mod))
178
+ effort.mageslayer.max:
179
+ type: integer
180
+ formula: >-
181
+ tradition.mageslayer.tier == 0 ? 0
182
+ : max(1, max(0, skills.magic) + max(attributes.int.mod, attributes.con.mod))
183
+ effort.skinshifter.max:
184
+ type: integer
185
+ formula: >-
186
+ tradition.skinshifter.tier == 0 ? 0
187
+ : max(1, max(0, skills.survive) + max(attributes.con.mod, attributes.cha.mod))
188
+ effort.thoughtnoble.max:
189
+ type: integer
190
+ formula: >-
191
+ tradition.thoughtnoble.tier == 0 ? 0
192
+ : max(1, max(0, skills.notice) + max(attributes.int.mod, attributes.wis.mod))
193
+ # Effort committed for the scene, for the day, and for as long as a power lasts.
194
+ 'effort.{effortTrad}.{effortSpan}': { type: integer, input: true, default: 0, min: 0 }
195
+ 'effort.{effortTrad}.free':
196
+ type: integer
197
+ formula: >-
198
+ max(0, effort.{effortTrad}.max - effort.{effortTrad}.scene - effort.{effortTrad}.day
199
+ - effort.{effortTrad}.ongoing)
200
+
201
+ # The skill a Vowed's order teaches, and a Wise's, as a family key of `skill`.
202
+ vowed.skill: { type: string, formula: "''" }
203
+ wise.skill: { type: string, formula: "''" }
204
+ # A Wise's art progression: four arts by level 4 for a priest, witch or seer, fewer for an
205
+ # esoteric one.
206
+ wise.path: { type: enum, values: [none, priest, witch, seer, esoteric], formula: "'none'" }
207
+
208
+ # Arts picked from each tradition's list; the ones a tradition grants don't count.
209
+ arts.highmage.allowed:
210
+ type: integer
211
+ formula: >-
212
+ tradition.highmage.tier == 2 ? [2, 3, 3, 4, 4, 5, 5, 6, 6, 7][level - 1]
213
+ : tradition.highmage.tier == 1 ? [1, 2, 3, 3, 3, 4, 4, 4, 5, 5][level - 1]
214
+ : invoker.education == 'highmage' ? (tradition.invoker.tier == 2 ? 2 : 1) : 0
215
+ arts.elementalist.allowed:
216
+ type: integer
217
+ formula: >-
218
+ tradition.elementalist.tier == 2 ? [1, 2, 2, 3, 3, 4, 4, 5, 5, 6][level - 1]
219
+ : tradition.elementalist.tier == 1 ? [1, 1, 2, 2, 2, 3, 3, 3, 4, 4][level - 1]
220
+ : invoker.education == 'elementalist' ? (tradition.invoker.tier == 2 ? 1 : 1) : 0
221
+ arts.necromancer.allowed:
222
+ type: integer
223
+ formula: >-
224
+ tradition.necromancer.tier == 2 ? [2, 3, 3, 4, 4, 5, 5, 6, 6, 7][level - 1]
225
+ : tradition.necromancer.tier == 1 ? [1, 2, 3, 3, 3, 4, 4, 4, 5, 5][level - 1]
226
+ : invoker.education == 'necromancer' ? (tradition.invoker.tier == 2 ? 2 : 1) : 0
227
+ arts.healer.allowed:
228
+ type: integer
229
+ formula: >-
230
+ tradition.healer.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
231
+ arts.vowed.allowed:
232
+ type: integer
233
+ formula: >-
234
+ tradition.vowed.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
235
+ arts.accursed.allowed:
236
+ type: integer
237
+ formula: >-
238
+ tradition.accursed.tier > 0 ? [1, 1, 1, 1, 1, 1, 1, 1, 1, 1][level - 1] : 0
239
+ arts.bard.allowed:
240
+ type: integer
241
+ formula: >-
242
+ tradition.bard.tier > 0 ? [1, 2, 2, 3, 3, 4, 4, 5, 5, 6][level - 1] : 0
243
+ arts.beastmaster.allowed:
244
+ type: integer
245
+ formula: >-
246
+ tradition.beastmaster.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
247
+ arts.bloodpriest.allowed:
248
+ type: integer
249
+ formula: >-
250
+ tradition.bloodpriest.tier > 0 ? [2, 3, 3, 4, 5, 6, 6, 7, 7, 8][level - 1] : 0
251
+ arts.duelist.allowed:
252
+ type: integer
253
+ formula: >-
254
+ tradition.duelist.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
255
+ arts.mageslayer.allowed:
256
+ type: integer
257
+ formula: >-
258
+ tradition.mageslayer.tier > 0 ? [0, 0, 0, 0, 0, 0, 0, 0, 0, 0][level - 1] : 0
259
+ arts.skinshifter.allowed:
260
+ type: integer
261
+ formula: >-
262
+ tradition.skinshifter.tier > 0 ? [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1] : 0
263
+ arts.thoughtnoble.allowed:
264
+ type: integer
265
+ formula: >-
266
+ tradition.thoughtnoble.tier > 0 ? [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][level - 1] : 0
267
+ arts.wise.allowed:
268
+ type: integer
269
+ formula: >-
270
+ tradition.wise.tier == 0 ? 0
271
+ : wise.path == 'esoteric' ? [1, 1, 2, 2, 3, 3, 4, 4, 5, 5][level - 1]
272
+ : [1, 2, 2, 3, 4, 5, 5, 6, 6, 7][level - 1]
273
+ 'arts.{artTrad}.taken':
274
+ type: integer
275
+ formula: "countCopies(copy.type == 'art' && copy.fields.tradition == '{artTrad}')"
276
+ 'arts.{artTrad}.owed':
277
+ { type: integer, formula: 'max(0, arts.{artTrad}.allowed - arts.{artTrad}.taken)' }
278
+ arts.owed:
279
+ type: integer
280
+ formula: >-
281
+ arts.highmage.owed
282
+ + arts.elementalist.owed
283
+ + arts.necromancer.owed
284
+ + arts.healer.owed
285
+ + arts.vowed.owed
286
+ + arts.accursed.owed
287
+ + arts.bard.owed
288
+ + arts.beastmaster.owed
289
+ + arts.bloodpriest.owed
290
+ + arts.duelist.owed
291
+ + arts.mageslayer.owed
292
+ + arts.skinshifter.owed
293
+ + arts.thoughtnoble.owed
294
+ + arts.wise.owed
295
+
296
+ # Armored Magic's level, and whether worn armor or a shield stops spells and arts.
297
+ magic.armoredLevel: { type: integer, formula: 0 }
298
+ magic.hindered:
299
+ type: boolean
300
+ formula: >-
301
+ (armor.wornEnc >= 0 && magic.armoredLevel < 2
302
+ && !(magic.armoredLevel == 1 && armor.wornEnc <= 2))
303
+ || (armor.shield && magic.armoredLevel < 1)
304
+ # Duelist arts: not in medium or heavy armor or with a large shield.
305
+ duelist.hindered:
306
+ type: boolean
307
+ formula: armor.wornHeavy || (armor.shield && armor.shieldAc >= 14)
308
+
309
+ contentTypes:
310
+ spell:
311
+ fields:
312
+ level: { type: integer, required: true, min: 1, max: 5 }
313
+ list: { type: enum, values: [high, elementalist, necromancer], required: true }
314
+ state:
315
+ prepared: { type: boolean, default: false }
316
+ actions:
317
+ - use: cast-spell
318
+
319
+ art:
320
+ fields:
321
+ tradition:
322
+ type: enum
323
+ values:
324
+ [
325
+ highmage,
326
+ elementalist,
327
+ necromancer,
328
+ healer,
329
+ vowed,
330
+ accursed,
331
+ bard,
332
+ beastmaster,
333
+ bloodpriest,
334
+ duelist,
335
+ mageslayer,
336
+ skinshifter,
337
+ thoughtnoble,
338
+ wise,
339
+ ]
340
+ required: true
341
+ # How long using it commits a point of Effort, if it does.
342
+ effort: { type: enum, values: [none, scene, day, ongoing], default: none }
343
+ minLevel: { type: integer, default: 1, min: 1, max: 10 }
344
+ # An art that must be held first.
345
+ requiresArt: { type: id, of: art }
346
+ state:
347
+ # An art whose Effort stays committed while it lasts.
348
+ active: { type: boolean, default: false }
349
+ actions:
350
+ - use: commit-effort
351
+ - use: release-effort
352
+
353
+ constraints:
354
+ - id: spells-prepared
355
+ check: spells.prepared <= spells.preparedMax
356
+ data: { limit: spells.preparedMax }
357
+ # A mage can learn only spells they can cast, from lists their traditions teach.
358
+ - id: spell-known
359
+ copies: { type: spell }
360
+ check: >-
361
+ item.level <= spells.maxLevel
362
+ && (item.list == 'high' ? spells.mode != 'none'
363
+ : item.list == 'elementalist'
364
+ ? tradition.elementalist.tier > 0 || invoker.education == 'elementalist'
365
+ : tradition.necromancer.tier > 0 || invoker.education == 'necromancer')
366
+ - id: art-tradition
367
+ copies: { type: art }
368
+ check: >-
369
+ fieldOf('tradition.{trad}.tier', item.tradition) > 0 || invoker.education == item.tradition
370
+ - id: arts-allowed
371
+ check: >-
372
+ arts.highmage.taken <= arts.highmage.allowed
373
+ && arts.elementalist.taken <= arts.elementalist.allowed
374
+ && arts.necromancer.taken <= arts.necromancer.allowed
375
+ && arts.healer.taken <= arts.healer.allowed
376
+ && arts.vowed.taken <= arts.vowed.allowed
377
+ && arts.accursed.taken <= arts.accursed.allowed
378
+ && arts.bard.taken <= arts.bard.allowed
379
+ && arts.beastmaster.taken <= arts.beastmaster.allowed
380
+ && arts.bloodpriest.taken <= arts.bloodpriest.allowed
381
+ && arts.duelist.taken <= arts.duelist.allowed
382
+ && arts.mageslayer.taken <= arts.mageslayer.allowed
383
+ && arts.skinshifter.taken <= arts.skinshifter.allowed
384
+ && arts.thoughtnoble.taken <= arts.thoughtnoble.allowed
385
+ && arts.wise.taken <= arts.wise.allowed
386
+ - id: effort-committed
387
+ check: >-
388
+ effort.highmage.scene + effort.highmage.day + effort.highmage.ongoing <= effort.highmage.max
389
+ && effort.elementalist.scene + effort.elementalist.day + effort.elementalist.ongoing <= effort.elementalist.max
390
+ && effort.necromancer.scene + effort.necromancer.day + effort.necromancer.ongoing <= effort.necromancer.max
391
+ && effort.healer.scene + effort.healer.day + effort.healer.ongoing <= effort.healer.max
392
+ && effort.vowed.scene + effort.vowed.day + effort.vowed.ongoing <= effort.vowed.max
393
+ && effort.accursed.scene + effort.accursed.day + effort.accursed.ongoing <= effort.accursed.max
394
+ && effort.bard.scene + effort.bard.day + effort.bard.ongoing <= effort.bard.max
395
+ && effort.beastmaster.scene + effort.beastmaster.day + effort.beastmaster.ongoing <= effort.beastmaster.max
396
+ && effort.bloodpriest.scene + effort.bloodpriest.day + effort.bloodpriest.ongoing <= effort.bloodpriest.max
397
+ && effort.duelist.scene + effort.duelist.day + effort.duelist.ongoing <= effort.duelist.max
398
+ && effort.mageslayer.scene + effort.mageslayer.day + effort.mageslayer.ongoing <= effort.mageslayer.max
399
+ && effort.skinshifter.scene + effort.skinshifter.day + effort.skinshifter.ongoing <= effort.skinshifter.max
400
+ && effort.thoughtnoble.scene + effort.thoughtnoble.day + effort.thoughtnoble.ongoing <= effort.thoughtnoble.max
401
+
402
+ actions:
403
+ # Casting a prepared spell spends a casting, or an Invoker's spell points.
404
+ - id: cast-spell
405
+ tags: [spell]
406
+ available: >-
407
+ self.prepared && item.level <= spells.maxLevel && !magic.hindered
408
+ && (spells.mode == 'invoker' || spells.mode == 'partial-invoker'
409
+ ? spells.pointsLeft >= item.level : spells.castsLeft > 0)
410
+ results: [cast]
411
+ steps:
412
+ - id: spend
413
+ kind: changes
414
+ changes:
415
+ - type: adjust
416
+ when: "spells.mode == 'invoker' || spells.mode == 'partial-invoker'"
417
+ field: spells.pointsUsed
418
+ by: item.level
419
+ - type: adjust
420
+ when: "spells.mode != 'invoker' && spells.mode != 'partial-invoker'"
421
+ field: spells.castsUsed
422
+ by: 1
423
+ - id: result
424
+ kind: outcome
425
+ result: "'cast'"
426
+ data:
427
+ level: item.level
428
+
429
+ - id: commit-effort
430
+ tags: [art]
431
+ available: >-
432
+ item.effort != 'none' && level >= item.minLevel && !(item.effort == 'ongoing' && self.active)
433
+ && item.tradition != 'wise' && fieldOf('effort.{effortTrad}.free', item.tradition) > 0
434
+ && (item.tradition in ['highmage', 'elementalist', 'necromancer', 'vowed'] ? !magic.hindered
435
+ : item.tradition == 'duelist' ? !duelist.hindered : true)
436
+ results: [committed]
437
+ steps:
438
+ - id: commit
439
+ kind: changes
440
+ changes:
441
+ - type: adjust
442
+ field: { formula: "'effort.' + item.tradition + '.' + item.effort" }
443
+ by: 1
444
+ # A copy keeps its state; an art a class grants, its grant's saved state.
445
+ - type: setState
446
+ when: "item.effort == 'ongoing' && !('granted' in item.tags)"
447
+ entry: self
448
+ key: active
449
+ value: true
450
+ - type: setState
451
+ when: "item.effort == 'ongoing' && 'granted' in item.tags"
452
+ grant: self
453
+ key: active
454
+ value: true
455
+ - id: result
456
+ kind: outcome
457
+ result: "'committed'"
458
+
459
+ # Reclaim the Effort an art keeps committed, ending it.
460
+ - id: release-effort
461
+ tags: [art]
462
+ available: "item.effort == 'ongoing' && self.active"
463
+ results: [released]
464
+ steps:
465
+ - id: release
466
+ kind: changes
467
+ changes:
468
+ - type: adjust
469
+ when: "fieldOf('effort.{effortTrad}.ongoing', item.tradition) > 0"
470
+ field: { formula: "'effort.' + item.tradition + '.ongoing'" }
471
+ by: -1
472
+ - type: setState
473
+ when: "!('granted' in item.tags)"
474
+ entry: self
475
+ key: active
476
+ value: false
477
+ - type: setState
478
+ when: "'granted' in item.tags"
479
+ grant: self
480
+ key: active
481
+ value: false
482
+ - id: result
483
+ kind: outcome
484
+ result: "'released'"