@opencharacter/swn-revised 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 (321) hide show
  1. package/LICENSE +147 -0
  2. package/README.md +182 -2
  3. package/content/armor/armored-undersuit.yaml +8 -0
  4. package/content/armor/armored-vacc-suit.yaml +8 -0
  5. package/content/armor/assault-suit.yaml +8 -0
  6. package/content/armor/combat-field-uniform.yaml +8 -0
  7. package/content/armor/deflector-array.yaml +8 -0
  8. package/content/armor/field-emitter-panoply.yaml +9 -0
  9. package/content/armor/force-pavis.yaml +9 -0
  10. package/content/armor/heavy-primitive-armor.yaml +8 -0
  11. package/content/armor/icarus-harness.yaml +8 -0
  12. package/content/armor/light-primitive-armor.yaml +8 -0
  13. package/content/armor/medium-primitive-armor.yaml +8 -0
  14. package/content/armor/secure-clothing.yaml +8 -0
  15. package/content/armor/security-armor.yaml +8 -0
  16. package/content/armor/shield.yaml +9 -0
  17. package/content/armor/storm-armor.yaml +9 -0
  18. package/content/armor/vestimentum.yaml +8 -0
  19. package/content/armor/warpaint.yaml +8 -0
  20. package/content/armor/woven-body-armor.yaml +8 -0
  21. package/content/backgrounds/barbarian.yaml +20 -0
  22. package/content/backgrounds/clergy.yaml +20 -0
  23. package/content/backgrounds/courtesan.yaml +20 -0
  24. package/content/backgrounds/criminal.yaml +20 -0
  25. package/content/backgrounds/dilettante.yaml +20 -0
  26. package/content/backgrounds/entertainer.yaml +20 -0
  27. package/content/backgrounds/merchant.yaml +20 -0
  28. package/content/backgrounds/noble.yaml +20 -0
  29. package/content/backgrounds/official.yaml +20 -0
  30. package/content/backgrounds/peasant.yaml +20 -0
  31. package/content/backgrounds/physician.yaml +20 -0
  32. package/content/backgrounds/pilot.yaml +20 -0
  33. package/content/backgrounds/politician.yaml +20 -0
  34. package/content/backgrounds/scholar.yaml +20 -0
  35. package/content/backgrounds/soldier.yaml +20 -0
  36. package/content/backgrounds/spacer.yaml +20 -0
  37. package/content/backgrounds/technician.yaml +20 -0
  38. package/content/backgrounds/thug.yaml +20 -0
  39. package/content/backgrounds/vagabond.yaml +20 -0
  40. package/content/backgrounds/worker.yaml +20 -0
  41. package/content/classes/adventurer.yaml +9 -0
  42. package/content/classes/expert.yaml +16 -0
  43. package/content/classes/psychic.yaml +11 -0
  44. package/content/classes/warrior.yaml +29 -0
  45. package/content/cyberware/adrenal-suppression-pump.yaml +17 -0
  46. package/content/cyberware/bioadaptation-augments.yaml +6 -0
  47. package/content/cyberware/body-arsenal-array.yaml +6 -0
  48. package/content/cyberware/body-sculpting.yaml +6 -0
  49. package/content/cyberware/dermal-armor.yaml +8 -0
  50. package/content/cyberware/drone-control-link.yaml +6 -0
  51. package/content/cyberware/eelskin-capacitor-mesh.yaml +7 -0
  52. package/content/cyberware/gecko-anchors.yaml +6 -0
  53. package/content/cyberware/ghost-talker-transceiver.yaml +6 -0
  54. package/content/cyberware/holdout-cavity.yaml +6 -0
  55. package/content/cyberware/holoskin-emitters.yaml +6 -0
  56. package/content/cyberware/identity-submersion-trigger.yaml +6 -0
  57. package/content/cyberware/immunofiltration-system.yaml +6 -0
  58. package/content/cyberware/induced-coma-trigger.yaml +6 -0
  59. package/content/cyberware/neurointruder-alert.yaml +11 -0
  60. package/content/cyberware/panspectral-optics.yaml +6 -0
  61. package/content/cyberware/pressure-sheathing.yaml +6 -0
  62. package/content/cyberware/prosthetic-limb.yaml +6 -0
  63. package/content/cyberware/revenant-wiring.yaml +6 -0
  64. package/content/cyberware/slowtime-window.yaml +7 -0
  65. package/content/cyberware/stabilization-overrides.yaml +8 -0
  66. package/content/cyberware/tagger-nanites.yaml +7 -0
  67. package/content/cyberware/toxin-injector.yaml +7 -0
  68. package/content/cyberware/twitchlock-actuators.yaml +7 -0
  69. package/content/foci/alert.yaml +9 -0
  70. package/content/foci/armsman.yaml +9 -0
  71. package/content/foci/assassin.yaml +5 -0
  72. package/content/foci/authority.yaml +5 -0
  73. package/content/foci/close-combatant.yaml +7 -0
  74. package/content/foci/connected.yaml +5 -0
  75. package/content/foci/die-hard.yaml +7 -0
  76. package/content/foci/diplomat.yaml +10 -0
  77. package/content/foci/gunslinger.yaml +8 -0
  78. package/content/foci/hacker.yaml +10 -0
  79. package/content/foci/healer.yaml +7 -0
  80. package/content/foci/henchkeeper.yaml +7 -0
  81. package/content/foci/ironhide.yaml +7 -0
  82. package/content/foci/psychic-training.yaml +19 -0
  83. package/content/foci/savage-fray.yaml +5 -0
  84. package/content/foci/shocking-assault.yaml +8 -0
  85. package/content/foci/sniper.yaml +10 -0
  86. package/content/foci/specialist.yaml +36 -0
  87. package/content/foci/star-captain.yaml +5 -0
  88. package/content/foci/starfarer.yaml +5 -0
  89. package/content/foci/tinker.yaml +5 -0
  90. package/content/foci/unarmed-combatant.yaml +11 -0
  91. package/content/foci/unique-gift.yaml +6 -0
  92. package/content/foci/wanderer.yaml +5 -0
  93. package/content/foci/wild-psychic-talent.yaml +21 -0
  94. package/content/gear/ammo-20-rounds.yaml +9 -0
  95. package/content/gear/ammo-missile.yaml +8 -0
  96. package/content/gear/atmofilter.yaml +7 -0
  97. package/content/gear/backpack-tl0.yaml +7 -0
  98. package/content/gear/backpack-tl4.yaml +7 -0
  99. package/content/gear/bezoar.yaml +9 -0
  100. package/content/gear/binoculars-tl3.yaml +7 -0
  101. package/content/gear/binoculars-tl4.yaml +7 -0
  102. package/content/gear/bioscanner.yaml +7 -0
  103. package/content/gear/black-slab.yaml +7 -0
  104. package/content/gear/brainwave.yaml +8 -0
  105. package/content/gear/climbing-harness.yaml +7 -0
  106. package/content/gear/comm-server.yaml +7 -0
  107. package/content/gear/compad.yaml +7 -0
  108. package/content/gear/data-phase-tap.yaml +7 -0
  109. package/content/gear/data-protocol.yaml +7 -0
  110. package/content/gear/dataslab.yaml +7 -0
  111. package/content/gear/field-radio.yaml +7 -0
  112. package/content/gear/glowbug.yaml +7 -0
  113. package/content/gear/grapnel-launcher.yaml +7 -0
  114. package/content/gear/grav-chute-tl4.yaml +7 -0
  115. package/content/gear/grav-chute-tl5.yaml +7 -0
  116. package/content/gear/grav-harness.yaml +7 -0
  117. package/content/gear/hush.yaml +8 -0
  118. package/content/gear/instapanel.yaml +8 -0
  119. package/content/gear/lazarus-patch.yaml +8 -0
  120. package/content/gear/lift.yaml +11 -0
  121. package/content/gear/line-shunt.yaml +7 -0
  122. package/content/gear/low-light-goggles.yaml +7 -0
  123. package/content/gear/medkit.yaml +7 -0
  124. package/content/gear/metatool.yaml +7 -0
  125. package/content/gear/navcomp.yaml +7 -0
  126. package/content/gear/portabox.yaml +7 -0
  127. package/content/gear/postech-toolkit.yaml +7 -0
  128. package/content/gear/power-cell-a.yaml +9 -0
  129. package/content/gear/power-cell-b.yaml +8 -0
  130. package/content/gear/pressure-tent.yaml +7 -0
  131. package/content/gear/pretech-cosmetic.yaml +9 -0
  132. package/content/gear/pretech-toolkit.yaml +7 -0
  133. package/content/gear/psych.yaml +8 -0
  134. package/content/gear/rations-1-day.yaml +8 -0
  135. package/content/gear/remote-link-unit.yaml +7 -0
  136. package/content/gear/reverie.yaml +9 -0
  137. package/content/gear/rope-tl0.yaml +7 -0
  138. package/content/gear/rope-tl4.yaml +7 -0
  139. package/content/gear/scout-report.yaml +7 -0
  140. package/content/gear/solar-recharger.yaml +7 -0
  141. package/content/gear/spare-parts.yaml +8 -0
  142. package/content/gear/squeal.yaml +8 -0
  143. package/content/gear/stiletto-charge.yaml +6 -0
  144. package/content/gear/storage-unit.yaml +7 -0
  145. package/content/gear/survey-scanner.yaml +7 -0
  146. package/content/gear/survival-kit.yaml +7 -0
  147. package/content/gear/tailored-antiallergens.yaml +7 -0
  148. package/content/gear/telekinetic-generator.yaml +7 -0
  149. package/content/gear/telescoping-pole.yaml +7 -0
  150. package/content/gear/thermal-flare.yaml +7 -0
  151. package/content/gear/tightbeam-link-unit.yaml +7 -0
  152. package/content/gear/trade-goods.yaml +8 -0
  153. package/content/gear/trade-metals.yaml +8 -0
  154. package/content/gear/translator-torc.yaml +7 -0
  155. package/content/gear/tsunami.yaml +9 -0
  156. package/content/gear/vacc-fresher.yaml +7 -0
  157. package/content/gear/vacc-skin.yaml +7 -0
  158. package/content/gear/vacc-suit.yaml +7 -0
  159. package/content/kits/barbarian.yaml +17 -0
  160. package/content/kits/blade.yaml +17 -0
  161. package/content/kits/civilian.yaml +12 -0
  162. package/content/kits/credits.yaml +11 -0
  163. package/content/kits/gunslinger.yaml +16 -0
  164. package/content/kits/hacker.yaml +18 -0
  165. package/content/kits/medic.yaml +18 -0
  166. package/content/kits/scout.yaml +19 -0
  167. package/content/kits/soldier.yaml +16 -0
  168. package/content/kits/technician.yaml +19 -0
  169. package/content/kits/thief.yaml +19 -0
  170. package/content/partial-classes/expert.yaml +5 -0
  171. package/content/partial-classes/psychic.yaml +16 -0
  172. package/content/partial-classes/warrior.yaml +7 -0
  173. package/content/styles/expert-nimble.yaml +11 -0
  174. package/content/styles/expert-smart.yaml +11 -0
  175. package/content/styles/expert-smooth.yaml +11 -0
  176. package/content/styles/psychic-adept.yaml +11 -0
  177. package/content/styles/psychic-seer.yaml +11 -0
  178. package/content/styles/warrior-leader.yaml +11 -0
  179. package/content/styles/warrior-melee.yaml +11 -0
  180. package/content/styles/warrior-ranged.yaml +11 -0
  181. package/content/techniques/accelerated-succor.yaml +10 -0
  182. package/content/techniques/alternate-outcome.yaml +10 -0
  183. package/content/techniques/anguished-vision.yaml +10 -0
  184. package/content/techniques/burdened-apportation.yaml +10 -0
  185. package/content/techniques/cloak-powers.yaml +10 -0
  186. package/content/techniques/concert-of-minds.yaml +10 -0
  187. package/content/techniques/cursed-luck.yaml +59 -0
  188. package/content/techniques/deep-intrusion.yaml +10 -0
  189. package/content/techniques/destinys-shield.yaml +10 -0
  190. package/content/techniques/effortless-apportation.yaml +10 -0
  191. package/content/techniques/facile-mind.yaml +10 -0
  192. package/content/techniques/far-thought.yaml +10 -0
  193. package/content/techniques/flawless-mastery.yaml +10 -0
  194. package/content/techniques/force-puppetry.yaml +10 -0
  195. package/content/techniques/forced-outcome.yaml +10 -0
  196. package/content/techniques/holistic-optimization-patterning.yaml +10 -0
  197. package/content/techniques/impact-sump.yaml +10 -0
  198. package/content/techniques/impervious-pavis-of-will.yaml +10 -0
  199. package/content/techniques/intuitive-response.yaml +10 -0
  200. package/content/techniques/invincible-stand.yaml +10 -0
  201. package/content/techniques/kinetic-transversal.yaml +10 -0
  202. package/content/techniques/major-organ-restoration.yaml +10 -0
  203. package/content/techniques/mastered-succor.yaml +10 -0
  204. package/content/techniques/memory-editing.yaml +10 -0
  205. package/content/techniques/metadimensional-friction.yaml +10 -0
  206. package/content/techniques/metamorph.yaml +10 -0
  207. package/content/techniques/mindtracing.yaml +10 -0
  208. package/content/techniques/neural-trap.yaml +10 -0
  209. package/content/techniques/not-my-time.yaml +10 -0
  210. package/content/techniques/offensive-apportation.yaml +10 -0
  211. package/content/techniques/oracle.yaml +6 -0
  212. package/content/techniques/organic-purification-protocols.yaml +10 -0
  213. package/content/techniques/perceptive-dislocation.yaml +10 -0
  214. package/content/techniques/personal-apportation.yaml +6 -0
  215. package/content/techniques/pressure-field.yaml +10 -0
  216. package/content/techniques/proficient-apportation.yaml +10 -0
  217. package/content/techniques/prophecy.yaml +10 -0
  218. package/content/techniques/psychic-refinement.yaml +11 -0
  219. package/content/techniques/psychic-static.yaml +10 -0
  220. package/content/techniques/psychic-succor.yaml +52 -0
  221. package/content/techniques/psychic-tutelage.yaml +10 -0
  222. package/content/techniques/quintessential-reconstruction.yaml +10 -0
  223. package/content/techniques/reactive-telekinesis.yaml +10 -0
  224. package/content/techniques/reflex-response.yaml +10 -0
  225. package/content/techniques/remote-repair.yaml +10 -0
  226. package/content/techniques/rift-reduplication.yaml +10 -0
  227. package/content/techniques/sense-the-need.yaml +10 -0
  228. package/content/techniques/slip-field.yaml +10 -0
  229. package/content/techniques/spatial-awareness.yaml +10 -0
  230. package/content/techniques/spatial-synchrony-mandala.yaml +10 -0
  231. package/content/techniques/stutterjump.yaml +10 -0
  232. package/content/techniques/suppress-cognition.yaml +10 -0
  233. package/content/techniques/surge-momentum.yaml +10 -0
  234. package/content/techniques/suspended-manifestation.yaml +10 -0
  235. package/content/techniques/synthetic-adaptation.yaml +10 -0
  236. package/content/techniques/tangible-force-construct.yaml +10 -0
  237. package/content/techniques/telekinetic-armory.yaml +10 -0
  238. package/content/techniques/telekinetic-expertise.yaml +10 -0
  239. package/content/techniques/telekinetic-flight.yaml +10 -0
  240. package/content/techniques/telekinetic-manipulation.yaml +6 -0
  241. package/content/techniques/telekinetic-ram.yaml +10 -0
  242. package/content/techniques/telepathic-assault.yaml +10 -0
  243. package/content/techniques/telepathic-contact.yaml +6 -0
  244. package/content/techniques/teratic-overload.yaml +10 -0
  245. package/content/techniques/terminal-reflection.yaml +10 -0
  246. package/content/techniques/thermokinesis.yaml +10 -0
  247. package/content/techniques/tissue-integrity-field.yaml +10 -0
  248. package/content/techniques/transmit-thought.yaml +10 -0
  249. package/content/techniques/unity-of-thought.yaml +10 -0
  250. package/content/templates/trained-unarmed.yaml +9 -0
  251. package/content/weapons/advanced-bow.yaml +13 -0
  252. package/content/weapons/anti-vehicle-laser.yaml +16 -0
  253. package/content/weapons/combat-rifle.yaml +16 -0
  254. package/content/weapons/combat-shotgun.yaml +16 -0
  255. package/content/weapons/conversion-bow.yaml +13 -0
  256. package/content/weapons/crude-pistol.yaml +16 -0
  257. package/content/weapons/demo-charge.yaml +13 -0
  258. package/content/weapons/distortion-cannon.yaml +16 -0
  259. package/content/weapons/grenade.yaml +14 -0
  260. package/content/weapons/heavy-machine-gun.yaml +17 -0
  261. package/content/weapons/hydra-array.yaml +16 -0
  262. package/content/weapons/knife.yaml +7 -0
  263. package/content/weapons/large-advanced-weapon.yaml +13 -0
  264. package/content/weapons/large-primitive-weapon.yaml +12 -0
  265. package/content/weapons/laser-pistol.yaml +16 -0
  266. package/content/weapons/laser-rifle.yaml +17 -0
  267. package/content/weapons/mag-pistol.yaml +15 -0
  268. package/content/weapons/mag-rifle.yaml +15 -0
  269. package/content/weapons/medium-advanced-weapon.yaml +13 -0
  270. package/content/weapons/medium-primitive-weapon.yaml +12 -0
  271. package/content/weapons/monoblade-knife.yaml +7 -0
  272. package/content/weapons/monoblade-sword.yaml +4 -0
  273. package/content/weapons/musket.yaml +16 -0
  274. package/content/weapons/plasma-projector.yaml +16 -0
  275. package/content/weapons/primitive-bow.yaml +13 -0
  276. package/content/weapons/railgun.yaml +16 -0
  277. package/content/weapons/revolver.yaml +15 -0
  278. package/content/weapons/rifle.yaml +15 -0
  279. package/content/weapons/rocket-launcher.yaml +16 -0
  280. package/content/weapons/semi-auto-pistol.yaml +15 -0
  281. package/content/weapons/shear-rifle.yaml +17 -0
  282. package/content/weapons/shotgun.yaml +15 -0
  283. package/content/weapons/small-advanced-weapon.yaml +14 -0
  284. package/content/weapons/small-primitive-weapon.yaml +13 -0
  285. package/content/weapons/sniper-rifle.yaml +15 -0
  286. package/content/weapons/spear.yaml +8 -0
  287. package/content/weapons/spike-thrower.yaml +16 -0
  288. package/content/weapons/stun-baton.yaml +14 -0
  289. package/content/weapons/submachine-gun.yaml +16 -0
  290. package/content/weapons/suit-ripper.yaml +11 -0
  291. package/content/weapons/thermal-knife.yaml +7 -0
  292. package/content/weapons/thermal-pistol.yaml +16 -0
  293. package/content/weapons/thunder-gun.yaml +16 -0
  294. package/content/weapons/unarmed.yaml +8 -0
  295. package/content/weapons/void-carbine.yaml +15 -0
  296. package/content/weapons/vortex-cannon.yaml +14 -0
  297. package/content/weapons/wheatcutter-belt.yaml +14 -0
  298. package/dist/i18n/en.d.ts +3 -0
  299. package/dist/i18n/en.js +2 -0
  300. package/dist/i18n/en.json +1411 -0
  301. package/dist/index.d.ts +3 -0
  302. package/dist/index.js +2 -0
  303. package/dist/release.json +31795 -0
  304. package/i18n/en/content.yaml +436 -0
  305. package/i18n/en/foci.yaml +199 -0
  306. package/i18n/en/rules.yaml +772 -0
  307. package/i18n/en/text.yaml +249 -0
  308. package/i18n/en.yaml +1 -0
  309. package/pack.yaml +15 -0
  310. package/package.json +58 -3
  311. package/rules/advancement.yaml +482 -0
  312. package/rules/character.yaml +139 -0
  313. package/rules/checks.yaml +166 -0
  314. package/rules/combat.yaml +321 -0
  315. package/rules/core.yaml +111 -0
  316. package/rules/creation.yaml +431 -0
  317. package/rules/gear.yaml +188 -0
  318. package/rules/layout.yaml +197 -0
  319. package/rules/psionics.yaml +165 -0
  320. package/rules/start.yaml +417 -0
  321. package/rules/tags.yaml +71 -0
@@ -0,0 +1,417 @@
1
+ constraints:
2
+ - id: creation-focus
3
+ check: "!character.creating || countCopies(copy.type == 'focus') > 0"
4
+
5
+ actions:
6
+ # The full procedure.
7
+ - id: create-character
8
+ tags: [creation]
9
+ available: character.creating && countCopies(copy.type == 'class') == 0
10
+ results: [created]
11
+ steps:
12
+ - id: method
13
+ kind: choice
14
+ options: [{ id: roll }, { id: array }]
15
+ recommend: "'roll'"
16
+ - id: scores
17
+ kind: branch
18
+ cases:
19
+ - when: "steps.method.picked == 'roll'"
20
+ steps:
21
+ - { id: str, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
22
+ - { id: dex, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
23
+ - { id: con, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
24
+ - { id: int, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
25
+ - { id: wis, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
26
+ - { id: cha, kind: roll, tags: [creation], parts: [{ dice: 3d6 }] }
27
+ - id: rolled
28
+ kind: changes
29
+ changes:
30
+ - { type: set, field: attributes.str.score, value: steps.str.total }
31
+ - { type: set, field: attributes.dex.score, value: steps.dex.total }
32
+ - { type: set, field: attributes.con.score, value: steps.con.total }
33
+ - { type: set, field: attributes.int.score, value: steps.int.total }
34
+ - { type: set, field: attributes.wis.score, value: steps.wis.total }
35
+ - { type: set, field: attributes.cha.score, value: steps.cha.total }
36
+ # A rolled character may set one attribute to 14: the lowest, by default.
37
+ - id: fourteen
38
+ kind: choice
39
+ options: { values: { formula: "keysOf('attr') + ['none']" } }
40
+ recommend: >-
41
+ minList([steps.str.total, steps.dex.total, steps.con.total, steps.int.total,
42
+ steps.wis.total, steps.cha.total], x) >= 14 ? 'none'
43
+ : ['str', 'dex', 'con', 'int', 'wis', 'cha'][indexOf([steps.str.total,
44
+ steps.dex.total, steps.con.total, steps.int.total, steps.wis.total,
45
+ steps.cha.total], minList([steps.str.total, steps.dex.total,
46
+ steps.con.total, steps.int.total, steps.wis.total, steps.cha.total], x))]
47
+ changes:
48
+ - type: set
49
+ when: "picked.id != 'none'"
50
+ field: { formula: "'attributes.' + picked.id + '.score'" }
51
+ value: 14
52
+ - when: true
53
+ steps:
54
+ - id: array
55
+ kind: allocate
56
+ fields: { type: field, where: "'attribute' in item.tags" }
57
+ values: [14, 12, 11, 10, 9, 7]
58
+ recommend:
59
+ attributes.str.score: 11
60
+ attributes.dex.score: 14
61
+ attributes.con.score: 12
62
+ attributes.int.score: 10
63
+ attributes.wis.score: 9
64
+ attributes.cha.score: 7
65
+ - id: background
66
+ kind: choice
67
+ options: { content: { type: background } }
68
+ recommend: options[0]
69
+ changes:
70
+ - type: addItem
71
+ entry: { id: background, item: picked.id }
72
+ - id: free
73
+ kind: action
74
+ use: gain-skill
75
+ params: { entry: steps.background.item.freeSkill }
76
+ - id: skills
77
+ kind: choice
78
+ options: [{ id: quick }, { id: pick }, { id: rolls }]
79
+ recommend: "'quick'"
80
+ - id: tables
81
+ kind: branch
82
+ cases:
83
+ - when: "steps.skills.picked == 'quick'"
84
+ steps:
85
+ - id: quick1
86
+ kind: action
87
+ use: gain-skill
88
+ params: { entry: steps.background.item.quick1 }
89
+ - id: quick2
90
+ kind: action
91
+ use: gain-skill
92
+ params: { entry: steps.background.item.quick2 }
93
+ # Two picks from the Learning table, Any Skill excepted.
94
+ - when: "steps.skills.picked == 'pick'"
95
+ flags:
96
+ learning: >-
97
+ [steps.background.item.learning1, steps.background.item.learning2,
98
+ steps.background.item.learning3, steps.background.item.learning4,
99
+ steps.background.item.learning5, steps.background.item.learning6,
100
+ steps.background.item.learning7, steps.background.item.learning8]
101
+ steps:
102
+ - id: learn1
103
+ kind: choice
104
+ recommend: options[0]
105
+ options: { values: { formula: "filterList(flags.learning, x != 'any-skill')" } }
106
+ - { id: gain1, kind: action, use: gain-skill, params: { entry: steps.learn1.picked } }
107
+ - id: learn2
108
+ kind: choice
109
+ recommend: options[0]
110
+ options: { values: { formula: "filterList(flags.learning, x != 'any-skill')" } }
111
+ - { id: gain2, kind: action, use: gain-skill, params: { entry: steps.learn2.picked } }
112
+ # Three rolls, each on the Growth table (d6) or the Learning table (d8).
113
+ - when: true
114
+ flags:
115
+ growth: >-
116
+ [steps.background.item.growth1, steps.background.item.growth2,
117
+ steps.background.item.growth3, steps.background.item.growth4,
118
+ steps.background.item.growth5, steps.background.item.growth6]
119
+ learning: >-
120
+ [steps.background.item.learning1, steps.background.item.learning2,
121
+ steps.background.item.learning3, steps.background.item.learning4,
122
+ steps.background.item.learning5, steps.background.item.learning6,
123
+ steps.background.item.learning7, steps.background.item.learning8]
124
+ steps:
125
+ - id: table1
126
+ kind: choice
127
+ options: [{ id: growth }, { id: learning }]
128
+ recommend: "'learning'"
129
+ - id: roll1
130
+ kind: roll
131
+ tags: [creation]
132
+ parts: [{ dice: "steps.table1.picked == 'growth' ? 1d6 : 1d8" }]
133
+ - id: rolled1
134
+ kind: action
135
+ use: gain-skill
136
+ params:
137
+ entry: >-
138
+ steps.table1.picked == 'growth' ? flags.growth[steps.roll1.total - 1]
139
+ : flags.learning[steps.roll1.total - 1]
140
+ - id: table2
141
+ kind: choice
142
+ options: [{ id: growth }, { id: learning }]
143
+ recommend: "'learning'"
144
+ - id: roll2
145
+ kind: roll
146
+ tags: [creation]
147
+ parts: [{ dice: "steps.table2.picked == 'growth' ? 1d6 : 1d8" }]
148
+ - id: rolled2
149
+ kind: action
150
+ use: gain-skill
151
+ params:
152
+ entry: >-
153
+ steps.table2.picked == 'growth' ? flags.growth[steps.roll2.total - 1]
154
+ : flags.learning[steps.roll2.total - 1]
155
+ - id: table3
156
+ kind: choice
157
+ options: [{ id: growth }, { id: learning }]
158
+ recommend: "'learning'"
159
+ - id: roll3
160
+ kind: roll
161
+ tags: [creation]
162
+ parts: [{ dice: "steps.table3.picked == 'growth' ? 1d6 : 1d8" }]
163
+ - id: rolled3
164
+ kind: action
165
+ use: gain-skill
166
+ params:
167
+ entry: >-
168
+ steps.table3.picked == 'growth' ? flags.growth[steps.roll3.total - 1]
169
+ : flags.learning[steps.roll3.total - 1]
170
+ - id: class
171
+ kind: choice
172
+ options: { content: { type: class } }
173
+ recommend: options[0]
174
+ changes:
175
+ - type: addItem
176
+ entry: { id: class, item: picked.id }
177
+ - id: classPicks
178
+ kind: choice
179
+ options: { pending: { entry: "'class'" } }
180
+ # A Psychic picks two psychic skills (the same twice is level-1); a Partial Psychic has
181
+ # their discipline at level-0.
182
+ - id: psychic1
183
+ kind: action
184
+ sheet: proposed
185
+ when: "psionics.access == 'unrestricted'"
186
+ use: gain-skill
187
+ params: { entry: "'any-psychic'" }
188
+ - id: psychic2
189
+ kind: action
190
+ sheet: proposed
191
+ when: "psionics.access == 'unrestricted'"
192
+ use: gain-skill
193
+ params: { entry: "'any-psychic'" }
194
+ - id: partialPsychic
195
+ kind: action
196
+ sheet: proposed
197
+ when: "psionics.access == 'restricted' && psionics.discipline != 'none'"
198
+ use: gain-skill
199
+ params: { entry: psionics.discipline }
200
+ # One focus level of any kind, then the Expert's non-combat and the Warrior's combat one.
201
+ - id: focus1
202
+ kind: action
203
+ use: gain-focus
204
+ - id: focus2
205
+ kind: action
206
+ sheet: proposed
207
+ when: class.focus.noncombat > 0
208
+ use: gain-focus
209
+ params: { kind: "'noncombat'" }
210
+ - id: focus3
211
+ kind: action
212
+ sheet: proposed
213
+ when: class.focus.combat > 0
214
+ use: gain-focus
215
+ params: { kind: "'combat'" }
216
+ # One more non-psychic skill: a hobby or a natural talent.
217
+ - id: hobby
218
+ kind: action
219
+ use: gain-skill
220
+ params: { entry: "'any-skill'" }
221
+ - id: hp
222
+ kind: roll
223
+ tags: [creation]
224
+ parts: [{ dice: 1d6 }]
225
+ - id: gear
226
+ kind: action
227
+ use: starting-gear
228
+ - id: hitPoints
229
+ tags: [creation.finish]
230
+ kind: changes
231
+ sheet: proposed
232
+ changes:
233
+ - { type: set, field: hp.rolled, value: 'max(1, steps.hp.total + attributes.con.mod)' }
234
+ - id: finish
235
+ kind: changes
236
+ sheet: proposed
237
+ changes:
238
+ - { type: set, field: hp.current, value: hp.max }
239
+ - { type: finishCreation }
240
+ - { id: result, kind: outcome, result: "'created'" }
241
+
242
+ # The quick tables: class and style (a d8 over the book's eight styles; add-on packs may add
243
+ # styles), background (d20), two psychic disciplines (d6) for a psychic, foci (d6 on the
244
+ # style's row) and a bonus skill (d20). With `random`, every table is rolled; otherwise each is
245
+ # a pick.
246
+ - id: quick-character
247
+ tags: [creation]
248
+ available: character.creating && countCopies(copy.type == 'class') == 0
249
+ params:
250
+ random: { type: boolean, default: false }
251
+ results: [created]
252
+ steps:
253
+ - id: style
254
+ kind: choice
255
+ random: params.random
256
+ recommend: 'filterList([@styles.expert-smart, options[0]], x in options)[0]'
257
+ options: { content: { type: style } }
258
+ - id: setup
259
+ kind: changes
260
+ changes:
261
+ - type: addItem
262
+ entry: { id: class, item: steps.style.item.class }
263
+ - { type: set, field: attributes.str.score, value: steps.style.item.str }
264
+ - { type: set, field: attributes.dex.score, value: steps.style.item.dex }
265
+ - { type: set, field: attributes.con.score, value: steps.style.item.con }
266
+ - { type: set, field: attributes.int.score, value: steps.style.item.int }
267
+ - { type: set, field: attributes.wis.score, value: steps.style.item.wis }
268
+ - { type: set, field: attributes.cha.score, value: steps.style.item.cha }
269
+ - id: background
270
+ kind: choice
271
+ random: params.random
272
+ recommend: options[0]
273
+ options: { content: { type: background } }
274
+ changes:
275
+ - type: addItem
276
+ entry: { id: background, item: picked.id }
277
+ - id: free
278
+ kind: action
279
+ use: gain-skill
280
+ params: { entry: steps.background.item.freeSkill, random: params.random }
281
+ - id: quick1
282
+ kind: action
283
+ use: gain-skill
284
+ params: { entry: steps.background.item.quick1, random: params.random }
285
+ - id: quick2
286
+ kind: action
287
+ use: gain-skill
288
+ params: { entry: steps.background.item.quick2, random: params.random }
289
+ - id: psychic1
290
+ kind: action
291
+ sheet: proposed
292
+ when: "psionics.access == 'unrestricted'"
293
+ use: gain-skill
294
+ params: { entry: "'any-psychic'", random: params.random }
295
+ - id: psychic2
296
+ kind: action
297
+ sheet: proposed
298
+ when: "psionics.access == 'unrestricted'"
299
+ use: gain-skill
300
+ params: { entry: "'any-psychic'", random: params.random }
301
+ # A style with a row of the book's foci table rolls on it; another (an add-on pack's) picks
302
+ # foci as the full procedure does.
303
+ - id: focusRoll
304
+ kind: choice
305
+ when: has(steps.style.item.table)
306
+ random: params.random
307
+ recommend: options[0]
308
+ options:
309
+ - { id: row1, flags: { row: 0 } }
310
+ - { id: row2, flags: { row: 1 } }
311
+ - { id: row3, flags: { row: 2 } }
312
+ - { id: row4, flags: { row: 3 } }
313
+ - { id: row5, flags: { row: 4 } }
314
+ - { id: row6, flags: { row: 5 } }
315
+ # Each entry: the focus, the bonus skill it gives, and a Specialist's skill.
316
+ - id: foci
317
+ kind: branch
318
+ cases:
319
+ - when: '!has(steps.style.item.table)'
320
+ flags: { foci: '[]' }
321
+ - when: true
322
+ flags:
323
+ foci: >-
324
+ [[[['specialist', 'fix', 'fix'], ['die-hard', 'none', '']], [['hacker', 'program', ''], ['tinker', 'fix', '']], [['specialist', 'know', 'know'], ['healer', 'heal', '']], [['specialist', 'fix', 'fix'], ['tinker', 'fix', '']], [['healer', 'heal', ''], ['ironhide', 'none', '']], [['specialist', 'fix', 'fix'], ['hacker', 'program', '']]], [[['diplomat', 'talk', ''], ['connected', 'connect', '']], [['specialist', 'talk', 'talk'], ['die-hard', 'none', '']], [['diplomat', 'talk', ''], ['alert', 'notice', '']], [['specialist', 'lead', 'lead'], ['authority', 'lead', '']], [['healer', 'heal', ''], ['specialist', 'talk', 'talk']], [['specialist', 'notice', 'notice'], ['specialist', 'talk', 'talk']]], [[['specialist', 'pilot', 'pilot'], ['starfarer', 'pilot', '']], [['healer', 'heal', ''], ['die-hard', 'none', '']], [['tinker', 'fix', ''], ['gunslinger', 'shoot', '']], [['specialist', 'sneak', 'sneak'], ['assassin', 'sneak', '']], [['specialist', 'sneak', 'sneak'], ['specialist', 'exert', 'exert']], [['specialist', 'perform', 'perform'], ['specialist', 'sneak', 'sneak']]], [[['savage-fray', 'stab', ''], ['shocking-assault', 'punch-or-stab', '']], [['assassin', 'sneak', ''], ['specialist', 'sneak', 'sneak']], [['armsman', 'stab', ''], ['close-combatant', 'any-combat', '']], [['close-combatant', 'any-combat', ''], ['savage-fray', 'stab', '']], [['ironhide', 'none', ''], ['die-hard', 'none', '']], [['unarmed-combatant', 'punch', ''], ['close-combatant', 'any-combat', '']]], [[['gunslinger', 'shoot', ''], ['close-combatant', 'any-combat', '']], [['sniper', 'shoot', ''], ['specialist', 'sneak', 'sneak']], [['assassin', 'sneak', ''], ['specialist', 'sneak', 'sneak']], [['ironhide', 'none', ''], ['die-hard', 'none', '']], [['gunslinger', 'shoot', ''], ['tinker', 'fix', '']], [['close-combatant', 'any-combat', ''], ['alert', 'notice', '']]], [[['gunslinger', 'shoot', ''], ['authority', 'lead', '']], [['ironhide', 'none', ''], ['connected', 'connect', '']], [['armsman', 'stab', ''], ['specialist', 'lead', 'lead']], [['gunslinger', 'shoot', ''], ['specialist', 'talk', 'talk']], [['assassin', 'sneak', ''], ['die-hard', 'none', '']], [['close-combatant', 'any-combat', ''], ['henchkeeper', 'lead', '']]], [[['alert', 'notice', '']], [['healer', 'heal', '']], [['specialist', 'notice', 'notice']], [['psychic-training', 'any-psychic', '']], [['savage-fray', 'stab', '']], [['hacker', 'program', '']]], [[['armsman', 'stab', '']], [['ironhide', 'none', '']], [['die-hard', 'none', '']], [['psychic-training', 'any-psychic', '']], [['healer', 'heal', '']], [['unarmed-combatant', 'punch', '']]]][steps.style.item.table][flags.row]
325
+ - id: focus1
326
+ kind: changes
327
+ when: size(flags.foci) > 0
328
+ changes:
329
+ - type: addItem
330
+ entry: { item: "'foci.' + flags.foci[0][0]" }
331
+ - id: focusSkill1
332
+ kind: action
333
+ when: size(flags.foci) > 0
334
+ use: gain-skill
335
+ params:
336
+ entry: "flags.foci[0][0] == 'specialist' ? flags.foci[0][2] : flags.foci[0][1]"
337
+ random: params.random
338
+ - id: focusPicks1
339
+ kind: choice
340
+ when: size(flags.foci) > 0
341
+ options: { pending: { entry: 'steps.focus1.added[0]' } }
342
+ recommend: >-
343
+ choice.id == 'skill' ? flags.foci[0][2]
344
+ : choice.id == 'discipline' && has(steps.focusSkill1.data)
345
+ && steps.focusSkill1.data.skill in options ? steps.focusSkill1.data.skill
346
+ : options[0]
347
+ - id: focus2
348
+ kind: changes
349
+ when: size(flags.foci) > 1
350
+ changes:
351
+ - type: addItem
352
+ entry: { item: "'foci.' + flags.foci[1][0]" }
353
+ - id: focusSkill2
354
+ kind: action
355
+ when: size(flags.foci) > 1
356
+ use: gain-skill
357
+ params:
358
+ entry: "flags.foci[1][0] == 'specialist' ? flags.foci[1][2] : flags.foci[1][1]"
359
+ random: params.random
360
+ - id: focusPicks2
361
+ kind: choice
362
+ when: size(flags.foci) > 1
363
+ options: { pending: { entry: 'steps.focus2.added[0]' } }
364
+ recommend: >-
365
+ choice.id == 'skill' ? flags.foci[1][2]
366
+ : choice.id == 'discipline' && has(steps.focusSkill2.data)
367
+ && steps.focusSkill2.data.skill in options ? steps.focusSkill2.data.skill
368
+ : options[0]
369
+ - id: anyFocus
370
+ kind: action
371
+ when: '!has(steps.style.item.table)'
372
+ use: gain-focus
373
+ params: { random: params.random }
374
+ - id: noncombatFocus
375
+ kind: action
376
+ sheet: proposed
377
+ when: '!has(steps.style.item.table) && class.focus.noncombat > 0'
378
+ use: gain-focus
379
+ params: { kind: "'noncombat'", random: params.random }
380
+ - id: combatFocus
381
+ kind: action
382
+ sheet: proposed
383
+ when: '!has(steps.style.item.table) && class.focus.combat > 0'
384
+ use: gain-focus
385
+ params: { kind: "'combat'", random: params.random }
386
+ # The d20 table: every non-psychic skill in order, then a level-0 skill raised to level-1.
387
+ - id: bonus
388
+ kind: choice
389
+ random: params.random
390
+ recommend: options[0]
391
+ options:
392
+ values: { formula: "sortList(keysOf('general') + keysOf('combat')) + ['raise-zero']" }
393
+ - id: bonusSkill
394
+ kind: action
395
+ use: gain-skill
396
+ params: { entry: steps.bonus.picked, random: params.random }
397
+ - id: hp
398
+ kind: roll
399
+ tags: [creation]
400
+ parts: [{ dice: 1d6 }]
401
+ - id: gear
402
+ kind: action
403
+ use: starting-gear
404
+ params: { random: params.random }
405
+ - id: hitPoints
406
+ tags: [creation.finish]
407
+ kind: changes
408
+ sheet: proposed
409
+ changes:
410
+ - { type: set, field: hp.rolled, value: 'max(1, steps.hp.total + attributes.con.mod)' }
411
+ - id: finish
412
+ kind: changes
413
+ sheet: proposed
414
+ changes:
415
+ - { type: set, field: hp.current, value: hp.max }
416
+ - { type: finishCreation }
417
+ - { id: result, kind: outcome, result: "'created'" }
@@ -0,0 +1,71 @@
1
+ tags:
2
+ - attribute
3
+ - attr-mod
4
+ - skill
5
+ - skill.general
6
+ - skill.combat
7
+ - skill.psychic
8
+ - save
9
+ - save.physical
10
+ - save.evasion
11
+ - save.mental
12
+ - ac
13
+ - check
14
+ - check.social
15
+ - check.administer
16
+ - check.connect
17
+ - check.exert
18
+ - check.fix
19
+ - check.heal
20
+ - check.know
21
+ - check.lead
22
+ - check.notice
23
+ - check.perform
24
+ - check.pilot
25
+ - check.program
26
+ - check.punch
27
+ - check.shoot
28
+ - check.sneak
29
+ - check.stab
30
+ - check.survive
31
+ - check.talk
32
+ - check.trade
33
+ - check.work
34
+ - check.biopsionics
35
+ - check.metapsionics
36
+ - check.precognition
37
+ - check.telekinesis
38
+ - check.telepathy
39
+ - check.teleportation
40
+ - initiative
41
+ - attack
42
+ - attack.punch
43
+ - attack.shoot
44
+ - attack.stab
45
+ - damage
46
+ - damage.nonlethal
47
+ - healing
48
+ - health
49
+ - combat
50
+ - psionics
51
+ # Foci open only to a character with psionic access, or only to one without.
52
+ - needs-psionics
53
+ - no-psionics
54
+ - strain
55
+ - torch
56
+ - creation
57
+ # Choice and changes steps an add-on pack's rules effects reach.
58
+ - creation.focus
59
+ - creation.kit
60
+ - creation.finish
61
+ - level-up.focus
62
+ - level-up.level
63
+ - rest.night
64
+ - rest.scene
65
+ - level-up
66
+ - failed-check
67
+ - missed-attack
68
+ - melee
69
+ - ranged
70
+ - heavy
71
+ - unarmed