@opencharacter/wwn-srd 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +144 -0
  2. package/README.md +147 -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 +8 -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 +11 -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 +18 -0
  302. package/content/partials/bard.yaml +9 -0
  303. package/content/partials/beastmaster.yaml +9 -0
  304. package/content/partials/blood-priest.yaml +7 -0
  305. package/content/partials/duelist.yaml +10 -0
  306. package/content/partials/expert.yaml +6 -0
  307. package/content/partials/healer.yaml +9 -0
  308. package/content/partials/mage.yaml +12 -0
  309. package/content/partials/mageslayer.yaml +21 -0
  310. package/content/partials/skinshifter.yaml +9 -0
  311. package/content/partials/thought-noble.yaml +9 -0
  312. package/content/partials/vowed.yaml +41 -0
  313. package/content/partials/warrior.yaml +6 -0
  314. package/content/partials/wise.yaml +45 -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/traditions/elementalist.yaml +8 -0
  399. package/content/traditions/high-mage.yaml +8 -0
  400. package/content/traditions/invoker.yaml +9 -0
  401. package/content/traditions/necromancer.yaml +8 -0
  402. package/content/weapons/blackjack.yaml +8 -0
  403. package/content/weapons/claw-blades.yaml +10 -0
  404. package/content/weapons/club.yaml +10 -0
  405. package/content/weapons/crossbow.yaml +10 -0
  406. package/content/weapons/dagger.yaml +12 -0
  407. package/content/weapons/great-club.yaml +11 -0
  408. package/content/weapons/great-hammer.yaml +11 -0
  409. package/content/weapons/great-hurlant.yaml +11 -0
  410. package/content/weapons/great-sword.yaml +11 -0
  411. package/content/weapons/halberd.yaml +11 -0
  412. package/content/weapons/hand-axe.yaml +12 -0
  413. package/content/weapons/hand-hurlant.yaml +10 -0
  414. package/content/weapons/heavy-spear.yaml +11 -0
  415. package/content/weapons/large-bow.yaml +11 -0
  416. package/content/weapons/large-shield-bash.yaml +11 -0
  417. package/content/weapons/light-spear.yaml +12 -0
  418. package/content/weapons/long-hurlant.yaml +11 -0
  419. package/content/weapons/long-sword.yaml +9 -0
  420. package/content/weapons/mace.yaml +10 -0
  421. package/content/weapons/pike.yaml +11 -0
  422. package/content/weapons/short-sword.yaml +9 -0
  423. package/content/weapons/small-bow.yaml +10 -0
  424. package/content/weapons/small-shield-bash.yaml +9 -0
  425. package/content/weapons/staff.yaml +10 -0
  426. package/content/weapons/stiletto.yaml +10 -0
  427. package/content/weapons/throwing-blade.yaml +11 -0
  428. package/content/weapons/unarmed.yaml +9 -0
  429. package/content/weapons/war-axe.yaml +11 -0
  430. package/content/weapons/war-hammer.yaml +9 -0
  431. package/dist/i18n/en.d.ts +3 -0
  432. package/dist/i18n/en.js +2 -0
  433. package/dist/i18n/en.json +1175 -0
  434. package/dist/index.d.ts +3 -0
  435. package/dist/index.js +2 -0
  436. package/dist/release.json +35918 -0
  437. package/i18n/en/content.yaml +472 -0
  438. package/i18n/en.yaml +702 -0
  439. package/pack.yaml +12 -0
  440. package/package.json +58 -3
  441. package/rules/advancement.yaml +186 -0
  442. package/rules/attributes.yaml +30 -0
  443. package/rules/backgrounds.yaml +60 -0
  444. package/rules/classes.yaml +77 -0
  445. package/rules/combat.yaml +241 -0
  446. package/rules/creation-steps.yaml +258 -0
  447. package/rules/creation.yaml +383 -0
  448. package/rules/display.yaml +684 -0
  449. package/rules/equipment.yaml +45 -0
  450. package/rules/foci.yaml +58 -0
  451. package/rules/health.yaml +178 -0
  452. package/rules/magic.yaml +471 -0
  453. package/rules/saves.yaml +62 -0
  454. package/rules/skills.yaml +93 -0
  455. package/rules/tags.yaml +93 -0
  456. package/upgrades/0.1.0-to-0.2.0.yaml +61 -0
@@ -0,0 +1,258 @@
1
+ actions:
2
+ # A background table entry: a skill, `any` or `combat` skill, or `any-stat`, `physical` or
3
+ # `mental` attribute points.
4
+ - id: background-entry
5
+ available: false
6
+ params:
7
+ entry: { type: string }
8
+ random: { type: boolean, default: false }
9
+ results: [gained]
10
+ steps:
11
+ - id: skill
12
+ kind: action
13
+ when: "!(params.entry in ['any-stat', 'physical', 'mental'])"
14
+ use: gain-skill
15
+ params: { skill: params.entry, random: params.random }
16
+ - id: attribute
17
+ kind: action
18
+ when: "params.entry in ['any-stat', 'physical', 'mental']"
19
+ use: gain-attributes
20
+ params: { kind: params.entry, random: params.random }
21
+ - id: result
22
+ kind: outcome
23
+ result: "'gained'"
24
+
25
+ # Gaining a skill at creation: level-0, or level-1 if it is already level-0. A skill already
26
+ # at level-1, or a choice (`any`, `combat`, `punch-stab`, `perform-sneak`, `specialist`), is a
27
+ # pick among the skills still below level-1; a Focus's pick leaves out Magic.
28
+ #
29
+ # With `points` (a Focus gained after first level), the skill gets that many skill points
30
+ # instead: levels as far as they pay, the rest kept as credit toward the next. A skill at
31
+ # level-4 sends them to another.
32
+ - id: gain-skill
33
+ available: false
34
+ params:
35
+ skill: { type: string }
36
+ random: { type: boolean, default: false }
37
+ focus: { type: boolean, default: false }
38
+ points: { type: integer, default: 0, min: 0 }
39
+ results: [gained]
40
+ steps:
41
+ - id: setup
42
+ kind: branch
43
+ sheet: proposed
44
+ cases:
45
+ - when: true
46
+ flags:
47
+ cap: 'params.points > 0 ? 4 : 1'
48
+ direct: >-
49
+ params.skill in keysOf('skill')
50
+ && fieldOf('skills.{skill}', params.skill) < (params.points > 0 ? 4 : 1)
51
+ allowed: >-
52
+ params.skill == 'combat' && (skills.stab < 1 || skills.shoot < 1 || skills.punch < 1)
53
+ ? ['stab', 'shoot', 'punch']
54
+ : params.skill == 'punch-stab' && (skills.punch < 1 || skills.stab < 1)
55
+ ? ['punch', 'stab']
56
+ : params.skill == 'perform-sneak' && (skills.perform < 1 || skills.sneak < 1)
57
+ ? ['perform', 'sneak']
58
+ : params.skill == 'specialist'
59
+ ? filterList(keysOf('skill'), !(x in ['magic', 'stab', 'shoot', 'punch']))
60
+ : params.focus ? filterList(keysOf('skill'), x != 'magic')
61
+ : keysOf('skill')
62
+ - id: pick
63
+ kind: choice
64
+ sheet: proposed
65
+ when: '!flags.direct'
66
+ random: params.random
67
+ options:
68
+ values: { formula: flags.allowed }
69
+ where: "fieldOf('skills.{skill}', value) < flags.cap"
70
+ recommend: options[0]
71
+ - id: target
72
+ kind: branch
73
+ sheet: proposed
74
+ cases:
75
+ - when: flags.direct || has(steps.pick)
76
+ flags:
77
+ target: 'flags.direct ? params.skill : steps.pick.picked'
78
+ from: "fieldOf('skills.{skill}', flags.direct ? params.skill : steps.pick.picked)"
79
+ credit: >-
80
+ fieldOf('skillCredit.{skill}', flags.direct ? params.skill : steps.pick.picked)
81
+ + params.points
82
+ # Skill points: a level costs one more than the level bought.
83
+ - id: spend
84
+ kind: branch
85
+ when: params.points > 0 && has(flags.target)
86
+ cases:
87
+ - when: true
88
+ flags:
89
+ first: 'flags.credit >= flags.from + 2 ? 1 : 0'
90
+ left: 'flags.credit >= flags.from + 2 ? flags.credit - flags.from - 2 : flags.credit'
91
+ - id: spend2
92
+ kind: branch
93
+ when: params.points > 0 && has(flags.target)
94
+ cases:
95
+ - when: true
96
+ flags:
97
+ second: 'flags.from + flags.first < 4 && flags.left >= flags.from + flags.first + 2 ? 1 : 0'
98
+ - id: raise
99
+ kind: changes
100
+ when: has(flags.target)
101
+ changes:
102
+ - type: adjust
103
+ when: params.points == 0
104
+ field: { formula: "fieldId('skills.{skill}', flags.target)" }
105
+ by: 1
106
+ - type: adjust
107
+ when: params.points > 0 && flags.first + flags.second > 0
108
+ field: { formula: "fieldId('skills.{skill}', flags.target)" }
109
+ by: flags.first + flags.second
110
+ - type: set
111
+ when: params.points > 0
112
+ field: { formula: "fieldId('skillCredit.{skill}', flags.target)" }
113
+ value: >-
114
+ flags.second > 0 ? flags.left - flags.from - flags.first - 2 : flags.left
115
+ - id: result
116
+ kind: outcome
117
+ result: "'gained'"
118
+
119
+ # Background attribute points: +1 to any attribute, or +2 to one physical (or mental)
120
+ # attribute or +1 to two. None goes past 18.
121
+ - id: gain-attributes
122
+ available: false
123
+ params:
124
+ kind: { type: enum, values: [any-stat, physical, mental] }
125
+ random: { type: boolean, default: false }
126
+ results: [gained]
127
+ steps:
128
+ - id: one
129
+ kind: choice
130
+ sheet: proposed
131
+ when: "params.kind == 'any-stat'"
132
+ random: params.random
133
+ options:
134
+ values: [str, dex, con, int, wis, cha]
135
+ where: "fieldOf('attributes.{attr}.score', value) < 18"
136
+ recommend: "sortList(options, fieldOf('attributes.{attr}.score', x))[0]"
137
+ changes:
138
+ - { type: adjust, field: { formula: "'attributes.' + picked.id + '.score'" }, by: 1 }
139
+ - id: two
140
+ kind: allocate
141
+ sheet: proposed
142
+ when: "params.kind != 'any-stat'"
143
+ fields:
144
+ type: field
145
+ where: >-
146
+ params.kind == 'physical'
147
+ ? item.id in [@attributes.str.score, @attributes.dex.score, @attributes.con.score]
148
+ : item.id in [@attributes.int.score, @attributes.wis.score, @attributes.cha.score]
149
+ budget: 2
150
+ spend: upTo
151
+ limit: 18 - field.value
152
+ random: true
153
+ - id: result
154
+ kind: outcome
155
+ result: "'gained'"
156
+
157
+ # A Focus: a new one at its first level, or the next level of one held. A new Focus asks its
158
+ # own choices, then gives its bonus skill.
159
+ - id: pick-focus
160
+ available: false
161
+ params:
162
+ kind: { type: enum, values: [any, combat, noncombat] }
163
+ random: { type: boolean, default: false }
164
+ points: { type: integer, default: 0, min: 0 }
165
+ results: [picked]
166
+ steps:
167
+ - id: focus
168
+ kind: choice
169
+ sheet: proposed
170
+ random: params.random
171
+ options:
172
+ content:
173
+ type: focus
174
+ where: >-
175
+ (params.kind == 'any' || params.kind in item.tags)
176
+ && (!params.random || !('gm-defined' in item.tags))
177
+ && (item.repeatable || sumCopies(copy.state.level,
178
+ copy.type == 'focus' && copy.item == item.id) < item.maxLevel)
179
+ && (item.requires == 'none'
180
+ || (item.requires == 'mage' && class.mage > 0)
181
+ || (item.requires == 'non-mage' && class.mage == 0)
182
+ || (item.requires == 'expert' && class.expert > 0)
183
+ || (item.requires == 'invoker' && tradition.invoker.tier > 0)
184
+ || (item.requires == 'low-attribute' && min(attributes.str.score,
185
+ attributes.dex.score, attributes.con.score, attributes.int.score,
186
+ attributes.wis.score, attributes.cha.score) <= 7))
187
+ recommend: options[0]
188
+ - id: held
189
+ kind: branch
190
+ sheet: proposed
191
+ cases:
192
+ - when: true
193
+ flags:
194
+ raise: >-
195
+ countCopies(copy.type == 'focus' && copy.item == steps.focus.picked
196
+ && copy.state.level < steps.focus.item.maxLevel) > 0
197
+ - id: take
198
+ kind: changes
199
+ changes:
200
+ - type: adjustState
201
+ when: flags.raise
202
+ copies:
203
+ { type: focus, where: 'item.id == steps.focus.picked && self.level < item.maxLevel' }
204
+ limit: 1
205
+ key: level
206
+ by: 1
207
+ - type: addItem
208
+ when: '!flags.raise'
209
+ entry: { item: steps.focus.picked, state: { level: 1 } }
210
+ - id: focusChoices
211
+ kind: choice
212
+ when: '!flags.raise'
213
+ random: params.random
214
+ options: { pending: { entry: 'steps.take.added[0]' } }
215
+ recommend: options[0]
216
+ - id: bonusSkill
217
+ kind: action
218
+ when: "!flags.raise && steps.focus.item.bonusSkill != 'none'"
219
+ use: gain-skill
220
+ params:
221
+ skill: >-
222
+ steps.focus.item.bonusSkill == 'specialist' && has(steps.focusChoices)
223
+ && size(steps.focusChoices.picked) > 0
224
+ ? steps.focusChoices.picked[0] : steps.focus.item.bonusSkill
225
+ random: params.random
226
+ focus: true
227
+ points: params.points
228
+ - id: result
229
+ kind: outcome
230
+ result: "'picked'"
231
+
232
+ # The arts each tradition still owes, one pick at a time.
233
+ - id: pick-arts
234
+ available: false
235
+ params:
236
+ random: { type: boolean, default: false }
237
+ results: [picked]
238
+ steps:
239
+ - id: arts
240
+ kind: choice
241
+ sheet: proposed
242
+ random: params.random
243
+ repeat: { max: arts.owed, min: arts.owed }
244
+ options:
245
+ content:
246
+ type: art
247
+ where: >-
248
+ fieldOf('arts.{artTrad}.owed', item.tradition) > 0
249
+ && (countCopies(copy.item == item.id) == 0 || 'repeatable' in item.tags)
250
+ && level >= item.minLevel && !('granted' in item.tags)
251
+ && (!has(item.requiresArt) || countCopies(copy.item == item.requiresArt) > 0)
252
+ recommend: options[0]
253
+ changes:
254
+ - type: addItem
255
+ entry: { item: picked.id }
256
+ - id: result
257
+ kind: outcome
258
+ result: "'picked'"
@@ -0,0 +1,383 @@
1
+ creation:
2
+ - { id: guided, action: create-character }
3
+ - { id: random, action: create-character, params: { random: true }, random: true }
4
+
5
+ actions:
6
+ # Both starts, in the book's order: attributes, background and its skills, class, Foci, the
7
+ # free skill, the tradition's skill, arts and spells, hit points, then equipment. The random
8
+ # start rolls where the book has a table (attributes, background, Growth and Learning) and
9
+ # draws evenly among the options where it doesn't.
10
+ - id: create-character
11
+ tags: [creation]
12
+ available: "character.creating && countCopies(copy.type == 'class') == 0"
13
+ params:
14
+ random: { type: boolean, default: false }
15
+ results: [created]
16
+ steps:
17
+ # Attributes: 3d6 in order with one raised to 14, or the array placed freely.
18
+ - id: method
19
+ kind: choice
20
+ when: '!params.random'
21
+ options: [{ id: roll }, { id: array }]
22
+ recommend: "'roll'"
23
+ - id: rolled
24
+ kind: branch
25
+ cases:
26
+ - when: "params.random || steps.method.picked == 'roll'"
27
+ steps:
28
+ - { id: str, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
29
+ - { id: dex, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
30
+ - { id: con, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
31
+ - { id: int, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
32
+ - { id: wis, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
33
+ - { id: cha, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
34
+ - id: scores
35
+ kind: changes
36
+ changes:
37
+ - { type: set, field: attributes.str.score, value: steps.str.total }
38
+ - { type: set, field: attributes.dex.score, value: steps.dex.total }
39
+ - { type: set, field: attributes.con.score, value: steps.con.total }
40
+ - { type: set, field: attributes.int.score, value: steps.int.total }
41
+ - { type: set, field: attributes.wis.score, value: steps.wis.total }
42
+ - { type: set, field: attributes.cha.score, value: steps.cha.total }
43
+ # One rolled score becomes 14; the lowest is recommended.
44
+ - id: fourteen
45
+ kind: choice
46
+ sheet: proposed
47
+ options:
48
+ values: [str, dex, con, int, wis, cha]
49
+ where: "fieldOf('attributes.{attr}.score', value) < 14"
50
+ recommend: "sortList(options, fieldOf('attributes.{attr}.score', x))[0]"
51
+ changes:
52
+ - {
53
+ type: set,
54
+ field: { formula: "'attributes.' + picked.id + '.score'" },
55
+ value: 14,
56
+ }
57
+ - when: "steps.method.picked == 'array'"
58
+ steps:
59
+ - id: array
60
+ kind: allocate
61
+ fields: { type: field, where: "'attribute' in item.tags" }
62
+ values: [14, 12, 11, 10, 9, 7]
63
+ recommend:
64
+ attributes.str.score: 14
65
+ attributes.dex.score: 12
66
+ attributes.con.score: 11
67
+ attributes.int.score: 10
68
+ attributes.wis.score: 9
69
+ attributes.cha.score: 7
70
+
71
+ # Background: the SRD's two, drawn evenly for the random start.
72
+ - id: background
73
+ kind: choice
74
+ random: params.random
75
+ options: { content: { type: background } }
76
+ recommend: options[0]
77
+ changes:
78
+ - type: addItem
79
+ entry: { id: background, item: picked.id }
80
+ - id: tables
81
+ kind: branch
82
+ cases:
83
+ - when: true
84
+ flags:
85
+ growth: >-
86
+ [steps.background.item.growth1, steps.background.item.growth2,
87
+ steps.background.item.growth3, steps.background.item.growth4,
88
+ steps.background.item.growth5, steps.background.item.growth6]
89
+ learning: >-
90
+ [steps.background.item.learning1, steps.background.item.learning2,
91
+ steps.background.item.learning3, steps.background.item.learning4,
92
+ steps.background.item.learning5, steps.background.item.learning6,
93
+ steps.background.item.learning7, steps.background.item.learning8]
94
+ - id: freeSkill
95
+ kind: action
96
+ use: background-entry
97
+ params: { entry: steps.background.item.freeSkill, random: params.random }
98
+
99
+ # The background's skills: two picks from Learning, or three rolls split between Growth and
100
+ # Learning (the random start rolls).
101
+ - id: skills
102
+ kind: choice
103
+ when: '!params.random'
104
+ options: [{ id: pick }, { id: roll-tables }]
105
+ recommend: "'pick'"
106
+ - id: learn
107
+ kind: branch
108
+ cases:
109
+ - when: "!params.random && steps.skills.picked == 'pick'"
110
+ steps:
111
+ - id: learning
112
+ kind: choice
113
+ repeat: { max: 2, min: 2 }
114
+ # Each Learning entry once: an entry the table has twice may be picked twice.
115
+ options:
116
+ values: { formula: flags.learning }
117
+ where: "value != 'any' && picks < countList(flags.learning, x == value)"
118
+ recommend: options[0]
119
+ - id: learned1
120
+ kind: action
121
+ use: background-entry
122
+ params:
123
+ entry: steps.learning.picked[0]
124
+ - id: learned2
125
+ kind: action
126
+ use: background-entry
127
+ params:
128
+ entry: steps.learning.picked[1]
129
+ - id: rolls
130
+ kind: branch
131
+ cases:
132
+ - when: "params.random || steps.skills.picked == 'roll-tables'"
133
+ steps:
134
+ - id: table1
135
+ kind: choice
136
+ random: params.random
137
+ options: [{ id: growth }, { id: learning }]
138
+ recommend: "'learning'"
139
+ - id: die1
140
+ kind: roll
141
+ tags: [creation]
142
+ parts: [{ dice: "steps.table1.picked == 'growth' ? 1d6 : 1d8" }]
143
+ - id: rolled1
144
+ kind: action
145
+ use: background-entry
146
+ params:
147
+ entry: >-
148
+ steps.table1.picked == 'growth' ? flags.growth[steps.die1.total - 1]
149
+ : flags.learning[steps.die1.total - 1]
150
+ random: params.random
151
+ - id: table2
152
+ kind: choice
153
+ random: params.random
154
+ options: [{ id: growth }, { id: learning }]
155
+ recommend: "'learning'"
156
+ - id: die2
157
+ kind: roll
158
+ tags: [creation]
159
+ parts: [{ dice: "steps.table2.picked == 'growth' ? 1d6 : 1d8" }]
160
+ - id: rolled2
161
+ kind: action
162
+ use: background-entry
163
+ params:
164
+ entry: >-
165
+ steps.table2.picked == 'growth' ? flags.growth[steps.die2.total - 1]
166
+ : flags.learning[steps.die2.total - 1]
167
+ random: params.random
168
+ - id: table3
169
+ kind: choice
170
+ random: params.random
171
+ options: [{ id: growth }, { id: learning }]
172
+ recommend: "'learning'"
173
+ - id: die3
174
+ kind: roll
175
+ tags: [creation]
176
+ parts: [{ dice: "steps.table3.picked == 'growth' ? 1d6 : 1d8" }]
177
+ - id: rolled3
178
+ kind: action
179
+ use: background-entry
180
+ params:
181
+ entry: >-
182
+ steps.table3.picked == 'growth' ? flags.growth[steps.die3.total - 1]
183
+ : flags.learning[steps.die3.total - 1]
184
+ random: params.random
185
+
186
+ # Class, then what it asks: a Mage's tradition, an Adventurer's two partial classes and a
187
+ # partial Mage's tradition, a Vowed's skill.
188
+ - id: class
189
+ kind: choice
190
+ random: params.random
191
+ options: { content: { type: class } }
192
+ recommend: options[0]
193
+ changes:
194
+ - type: addItem
195
+ entry: { id: class, item: picked.id }
196
+ - id: classChoices
197
+ kind: choice
198
+ random: params.random
199
+ options: { pending: { entry: 'steps.class.added[0]' } }
200
+ recommend: options[0]
201
+
202
+ # Foci: one combat Focus with any Warrior, one non-combat Focus with any Expert, and one of
203
+ # any kind. Picking a Focus again takes its second level.
204
+ - id: warriorFocus
205
+ kind: action
206
+ sheet: proposed
207
+ when: class.warrior > 0
208
+ use: pick-focus
209
+ params: { kind: "'combat'", random: params.random }
210
+ - id: expertFocus
211
+ kind: action
212
+ sheet: proposed
213
+ when: class.expert > 0
214
+ use: pick-focus
215
+ params: { kind: "'noncombat'", random: params.random }
216
+ - id: freeFocus
217
+ kind: action
218
+ use: pick-focus
219
+ params: { kind: "'any'", random: params.random }
220
+
221
+ # One skill of the player's choice.
222
+ - id: freePick
223
+ kind: action
224
+ use: gain-skill
225
+ params: { skill: "'any'", random: params.random }
226
+
227
+ # Each tradition's bonus skill (`tradition.<key>.skill`): Magic for most Mages, the class's
228
+ # own skill for the rest, in tradition order.
229
+ - id: traditionSkills
230
+ kind: branch
231
+ sheet: proposed
232
+ cases:
233
+ - when: true
234
+ flags:
235
+ traditionSkills: >-
236
+ mapList(filterList(keysOf('trad'), fieldOf('tradition.{trad}.tier', x) > 0
237
+ && fieldOf('tradition.{trad}.skill', x) != ''), fieldOf('tradition.{trad}.skill', x))
238
+ - id: traditionSkill
239
+ kind: group
240
+ when: size(flags.traditionSkills) > 0
241
+ repeat: { while: size(steps.traditionSkill) < size(flags.traditionSkills), max: 15 }
242
+ steps:
243
+ - id: gain
244
+ kind: action
245
+ sheet: proposed
246
+ use: gain-skill
247
+ params:
248
+ skill: flags.traditionSkills[size(steps.traditionSkill)]
249
+ random: params.random
250
+
251
+ # The arts each tradition lets a new mage pick, and the first-level spells they know.
252
+ - id: arts
253
+ kind: action
254
+ use: pick-arts
255
+ params: { random: params.random }
256
+ - id: spells
257
+ kind: choice
258
+ sheet: proposed
259
+ when: spells.starting > 0
260
+ random: params.random
261
+ repeat: { max: spells.starting, min: spells.starting }
262
+ options:
263
+ content:
264
+ type: spell
265
+ where: >-
266
+ item.level == 1 && countCopies(copy.item == item.id) == 0
267
+ && (item.list == 'high' || (item.list in keysOf('trad')
268
+ && (fieldOf('tradition.{trad}.tier', item.list) > 0
269
+ || invoker.education == item.list)))
270
+ recommend: options[0]
271
+ changes:
272
+ - type: addItem
273
+ entry: { item: picked.id, state: { prepared: spells.prepared < spells.preparedMax } }
274
+
275
+ # Hit points: 1d6 plus the class's bonus and Constitution, at least 1.
276
+ - id: hitPoints
277
+ kind: roll
278
+ sheet: proposed
279
+ tags: [creation]
280
+ parts:
281
+ - dice: 1d6
282
+ - field: "'hp.dieBonus'"
283
+ - field: "'attributes.con.mod'"
284
+ - id: hp
285
+ kind: changes
286
+ changes:
287
+ - { type: set, field: hp.rolled, value: 'max(1, steps.hitPoints.total)' }
288
+
289
+ # Starting gear: 3d6 x 10 silver, spent at list price on a weapon, armor and gear (the
290
+ # SRD's other choice, a package, is the GM's to provide). A copper price is paid in
291
+ # silver, the change in copper. The random start draws each purchase among those it can
292
+ # afford; spellcasters and the Vowed skip armor, which hinders their magic.
293
+ - { id: silverRoll, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
294
+ - id: purse
295
+ tags: [creation.purse]
296
+ kind: changes
297
+ changes:
298
+ - { type: adjust, field: coins.silver, by: steps.silverRoll.total * 10 }
299
+ - id: weapon
300
+ kind: choice
301
+ sheet: proposed
302
+ random: params.random
303
+ repeat: { max: 1 }
304
+ options:
305
+ content:
306
+ type: weapon
307
+ where: >-
308
+ !(item.id in [@weapons.unarmed, @weapons.large-shield-bash,
309
+ @weapons.small-shield-bash])
310
+ && (item.costUnit == 'cp' ? ceil(item.cost / 10) : item.cost) <= coins.silver
311
+ recommend: >-
312
+ filterList([spells.mode != 'none' || tradition.vowed.tier > 0 ? @weapons.staff
313
+ : class.warrior > 0 || class.expert > 0 ? @weapons.short-sword
314
+ : @weapons.light-spear, options[0]], x in options)[0]
315
+ changes:
316
+ - { type: addItem, entry: { item: picked.id, equipped: true } }
317
+ - &pay
318
+ type: adjust
319
+ field: coins.silver
320
+ by: "-(picked.item.costUnit == 'cp' ? ceil(picked.item.cost / 10) : picked.item.cost)"
321
+ - &change
322
+ type: adjust
323
+ field: coins.copper
324
+ when: "picked.item.costUnit == 'cp'"
325
+ by: ceil(picked.item.cost / 10) * 10 - picked.item.cost
326
+ - id: armorBuy
327
+ kind: choice
328
+ sheet: proposed
329
+ options: [{ id: buy-armor }, { id: no-armor }]
330
+ recommend: "spells.mode != 'none' || tradition.vowed.tier > 0 ? 'no-armor' : 'buy-armor'"
331
+ # Body armor and a shield, one of each.
332
+ - id: armor
333
+ kind: choice
334
+ sheet: proposed
335
+ when: "steps.armorBuy.picked == 'buy-armor'"
336
+ random: params.random
337
+ repeat: { max: 2 }
338
+ options:
339
+ content:
340
+ type: armor
341
+ where: >-
342
+ (item.category == 'shield' ? !armor.shield : armor.wornEnc < 0)
343
+ && (item.costUnit == 'cp' ? ceil(item.cost / 10) : item.cost) <= coins.silver
344
+ recommend: >-
345
+ filterList([@armor.linothorax, @armor.large-shield, @armor.war-shirt, options[0]],
346
+ x in options)[0]
347
+ changes:
348
+ - { type: addItem, entry: { item: picked.id, equipped: true } }
349
+ - *pay
350
+ - *change
351
+ # Up to six pieces of gear, one of each, no more than the character can carry.
352
+ - id: gear
353
+ kind: choice
354
+ sheet: proposed
355
+ random: params.random
356
+ repeat: { max: 6 }
357
+ options:
358
+ content:
359
+ type: gear
360
+ where: >-
361
+ picks == 0
362
+ && (item.costUnit == 'cp' ? ceil(item.cost / 10) : item.cost) <= coins.silver
363
+ && (item.id == @gear.backpack ? enc.readied + item.enc <= enc.readiedLimit + 4
364
+ : enc.stowed + item.enc <= enc.stowedLimit + 8)
365
+ recommend: >-
366
+ filterList([@gear.backpack, @gear.rations, @gear.waterskin, @gear.tinder-box,
367
+ @gear.torch, @gear.rope, options[0]], x in options)[0]
368
+ changes:
369
+ - type: addItem
370
+ entry: { item: picked.id, equipped: 'picked.id == @gear.backpack' }
371
+ - *pay
372
+ - *change
373
+
374
+ - id: finish
375
+ tags: [creation.finish]
376
+ kind: changes
377
+ sheet: proposed
378
+ changes:
379
+ - { type: set, field: hp.current, value: hp.max }
380
+ - { type: finishCreation }
381
+ - id: result
382
+ kind: outcome
383
+ result: "'created'"