@opencharacter/swn-revised 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 (302) hide show
  1. package/LICENSE +147 -0
  2. package/README.md +128 -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 +7 -0
  42. package/content/classes/expert.yaml +14 -0
  43. package/content/classes/psychic.yaml +11 -0
  44. package/content/classes/warrior.yaml +27 -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 +18 -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 +20 -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/partial-classes/expert.yaml +5 -0
  160. package/content/partial-classes/psychic.yaml +18 -0
  161. package/content/partial-classes/warrior.yaml +7 -0
  162. package/content/techniques/accelerated-succor.yaml +10 -0
  163. package/content/techniques/alternate-outcome.yaml +10 -0
  164. package/content/techniques/anguished-vision.yaml +10 -0
  165. package/content/techniques/burdened-apportation.yaml +10 -0
  166. package/content/techniques/cloak-powers.yaml +10 -0
  167. package/content/techniques/concert-of-minds.yaml +10 -0
  168. package/content/techniques/cursed-luck.yaml +59 -0
  169. package/content/techniques/deep-intrusion.yaml +10 -0
  170. package/content/techniques/destinys-shield.yaml +10 -0
  171. package/content/techniques/effortless-apportation.yaml +10 -0
  172. package/content/techniques/facile-mind.yaml +10 -0
  173. package/content/techniques/far-thought.yaml +10 -0
  174. package/content/techniques/flawless-mastery.yaml +10 -0
  175. package/content/techniques/force-puppetry.yaml +10 -0
  176. package/content/techniques/forced-outcome.yaml +10 -0
  177. package/content/techniques/holistic-optimization-patterning.yaml +10 -0
  178. package/content/techniques/impact-sump.yaml +10 -0
  179. package/content/techniques/impervious-pavis-of-will.yaml +10 -0
  180. package/content/techniques/intuitive-response.yaml +10 -0
  181. package/content/techniques/invincible-stand.yaml +10 -0
  182. package/content/techniques/kinetic-transversal.yaml +10 -0
  183. package/content/techniques/major-organ-restoration.yaml +10 -0
  184. package/content/techniques/mastered-succor.yaml +10 -0
  185. package/content/techniques/memory-editing.yaml +10 -0
  186. package/content/techniques/metadimensional-friction.yaml +10 -0
  187. package/content/techniques/metamorph.yaml +10 -0
  188. package/content/techniques/mindtracing.yaml +10 -0
  189. package/content/techniques/neural-trap.yaml +10 -0
  190. package/content/techniques/not-my-time.yaml +10 -0
  191. package/content/techniques/offensive-apportation.yaml +10 -0
  192. package/content/techniques/oracle.yaml +6 -0
  193. package/content/techniques/organic-purification-protocols.yaml +10 -0
  194. package/content/techniques/perceptive-dislocation.yaml +10 -0
  195. package/content/techniques/personal-apportation.yaml +6 -0
  196. package/content/techniques/pressure-field.yaml +10 -0
  197. package/content/techniques/proficient-apportation.yaml +10 -0
  198. package/content/techniques/prophecy.yaml +10 -0
  199. package/content/techniques/psychic-refinement.yaml +11 -0
  200. package/content/techniques/psychic-static.yaml +10 -0
  201. package/content/techniques/psychic-succor.yaml +39 -0
  202. package/content/techniques/psychic-tutelage.yaml +10 -0
  203. package/content/techniques/quintessential-reconstruction.yaml +10 -0
  204. package/content/techniques/reactive-telekinesis.yaml +10 -0
  205. package/content/techniques/reflex-response.yaml +10 -0
  206. package/content/techniques/remote-repair.yaml +10 -0
  207. package/content/techniques/rift-reduplication.yaml +10 -0
  208. package/content/techniques/sense-the-need.yaml +10 -0
  209. package/content/techniques/slip-field.yaml +10 -0
  210. package/content/techniques/spatial-awareness.yaml +10 -0
  211. package/content/techniques/spatial-synchrony-mandala.yaml +10 -0
  212. package/content/techniques/stutterjump.yaml +10 -0
  213. package/content/techniques/suppress-cognition.yaml +10 -0
  214. package/content/techniques/surge-momentum.yaml +10 -0
  215. package/content/techniques/suspended-manifestation.yaml +10 -0
  216. package/content/techniques/synthetic-adaptation.yaml +10 -0
  217. package/content/techniques/tangible-force-construct.yaml +10 -0
  218. package/content/techniques/telekinetic-armory.yaml +10 -0
  219. package/content/techniques/telekinetic-expertise.yaml +10 -0
  220. package/content/techniques/telekinetic-flight.yaml +10 -0
  221. package/content/techniques/telekinetic-manipulation.yaml +6 -0
  222. package/content/techniques/telekinetic-ram.yaml +10 -0
  223. package/content/techniques/telepathic-assault.yaml +10 -0
  224. package/content/techniques/telepathic-contact.yaml +6 -0
  225. package/content/techniques/teratic-overload.yaml +10 -0
  226. package/content/techniques/terminal-reflection.yaml +10 -0
  227. package/content/techniques/thermokinesis.yaml +10 -0
  228. package/content/techniques/tissue-integrity-field.yaml +10 -0
  229. package/content/techniques/transmit-thought.yaml +10 -0
  230. package/content/techniques/unity-of-thought.yaml +10 -0
  231. package/content/templates/trained-unarmed.yaml +9 -0
  232. package/content/weapons/advanced-bow.yaml +15 -0
  233. package/content/weapons/anti-vehicle-laser.yaml +18 -0
  234. package/content/weapons/combat-rifle.yaml +18 -0
  235. package/content/weapons/combat-shotgun.yaml +18 -0
  236. package/content/weapons/conversion-bow.yaml +15 -0
  237. package/content/weapons/crude-pistol.yaml +18 -0
  238. package/content/weapons/demo-charge.yaml +13 -0
  239. package/content/weapons/distortion-cannon.yaml +18 -0
  240. package/content/weapons/grenade.yaml +14 -0
  241. package/content/weapons/heavy-machine-gun.yaml +19 -0
  242. package/content/weapons/hydra-array.yaml +18 -0
  243. package/content/weapons/knife.yaml +7 -0
  244. package/content/weapons/large-advanced-weapon.yaml +13 -0
  245. package/content/weapons/large-primitive-weapon.yaml +12 -0
  246. package/content/weapons/laser-pistol.yaml +18 -0
  247. package/content/weapons/laser-rifle.yaml +19 -0
  248. package/content/weapons/mag-pistol.yaml +17 -0
  249. package/content/weapons/mag-rifle.yaml +17 -0
  250. package/content/weapons/medium-advanced-weapon.yaml +13 -0
  251. package/content/weapons/medium-primitive-weapon.yaml +12 -0
  252. package/content/weapons/monoblade-knife.yaml +7 -0
  253. package/content/weapons/monoblade-sword.yaml +4 -0
  254. package/content/weapons/musket.yaml +18 -0
  255. package/content/weapons/plasma-projector.yaml +18 -0
  256. package/content/weapons/primitive-bow.yaml +15 -0
  257. package/content/weapons/railgun.yaml +18 -0
  258. package/content/weapons/revolver.yaml +17 -0
  259. package/content/weapons/rifle.yaml +17 -0
  260. package/content/weapons/rocket-launcher.yaml +18 -0
  261. package/content/weapons/semi-auto-pistol.yaml +17 -0
  262. package/content/weapons/shear-rifle.yaml +19 -0
  263. package/content/weapons/shotgun.yaml +17 -0
  264. package/content/weapons/small-advanced-weapon.yaml +14 -0
  265. package/content/weapons/small-primitive-weapon.yaml +13 -0
  266. package/content/weapons/sniper-rifle.yaml +17 -0
  267. package/content/weapons/spear.yaml +8 -0
  268. package/content/weapons/spike-thrower.yaml +18 -0
  269. package/content/weapons/stun-baton.yaml +14 -0
  270. package/content/weapons/submachine-gun.yaml +18 -0
  271. package/content/weapons/suit-ripper.yaml +11 -0
  272. package/content/weapons/thermal-knife.yaml +7 -0
  273. package/content/weapons/thermal-pistol.yaml +18 -0
  274. package/content/weapons/thunder-gun.yaml +18 -0
  275. package/content/weapons/unarmed.yaml +8 -0
  276. package/content/weapons/void-carbine.yaml +17 -0
  277. package/content/weapons/vortex-cannon.yaml +16 -0
  278. package/content/weapons/wheatcutter-belt.yaml +16 -0
  279. package/dist/i18n/en.d.ts +3 -0
  280. package/dist/i18n/en.js +2 -0
  281. package/dist/i18n/en.json +1356 -0
  282. package/dist/index.d.ts +3 -0
  283. package/dist/index.js +2 -0
  284. package/dist/release.json +30238 -0
  285. package/i18n/en/content.yaml +394 -0
  286. package/i18n/en/foci.yaml +199 -0
  287. package/i18n/en/rules.yaml +759 -0
  288. package/i18n/en/text.yaml +249 -0
  289. package/i18n/en.yaml +1 -0
  290. package/pack.yaml +15 -0
  291. package/package.json +58 -3
  292. package/rules/advancement.yaml +461 -0
  293. package/rules/character.yaml +114 -0
  294. package/rules/checks.yaml +160 -0
  295. package/rules/combat.yaml +312 -0
  296. package/rules/core.yaml +111 -0
  297. package/rules/creation.yaml +633 -0
  298. package/rules/gear.yaml +176 -0
  299. package/rules/layout.yaml +195 -0
  300. package/rules/psionics.yaml +105 -0
  301. package/rules/start.yaml +403 -0
  302. package/rules/tags.yaml +60 -0
@@ -0,0 +1,403 @@
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 != ''"
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
+ kind: changes
230
+ sheet: proposed
231
+ changes:
232
+ - { type: set, field: hp.rolled, value: 'max(1, steps.hp.total + attributes.con.mod)' }
233
+ - id: finish
234
+ kind: changes
235
+ sheet: proposed
236
+ changes:
237
+ - { type: set, field: hp.current, value: hp.max }
238
+ - { type: finishCreation }
239
+ - { id: result, kind: outcome, result: "'created'" }
240
+
241
+ # The quick tables: class and style (d8), background (d20), two psychic disciplines (d6) for
242
+ # a psychic, foci (d6 on the style's row) and a bonus skill (d20). With `random`, every table
243
+ # is rolled; otherwise each is a pick.
244
+ - id: quick-character
245
+ tags: [creation]
246
+ available: character.creating && countCopies(copy.type == 'class') == 0
247
+ params:
248
+ random: { type: boolean, default: false }
249
+ results: [created]
250
+ steps:
251
+ - id: style
252
+ kind: choice
253
+ random: params.random
254
+ recommend: options[0]
255
+ options:
256
+ - id: expert-smart
257
+ flags: { style: 0, class: "'classes.expert'", scores: '[10, 12, 11, 14, 7, 9]' }
258
+ - id: expert-smooth
259
+ flags: { style: 1, class: "'classes.expert'", scores: '[7, 9, 10, 12, 11, 14]' }
260
+ - id: expert-nimble
261
+ flags: { style: 2, class: "'classes.expert'", scores: '[10, 14, 12, 11, 9, 7]' }
262
+ - id: warrior-melee
263
+ flags: { style: 3, class: "'classes.warrior'", scores: '[14, 9, 12, 7, 10, 11]' }
264
+ - id: warrior-ranged
265
+ flags: { style: 4, class: "'classes.warrior'", scores: '[9, 14, 12, 10, 7, 11]' }
266
+ - id: warrior-leader
267
+ flags: { style: 5, class: "'classes.warrior'", scores: '[7, 10, 9, 11, 12, 14]' }
268
+ - id: psychic-seer
269
+ flags: { style: 6, class: "'classes.psychic'", scores: '[9, 11, 12, 10, 14, 7]' }
270
+ - id: psychic-adept
271
+ flags: { style: 7, class: "'classes.psychic'", scores: '[12, 10, 14, 9, 11, 7]' }
272
+ - id: setup
273
+ kind: changes
274
+ changes:
275
+ - type: addItem
276
+ entry: { id: class, item: flags.class }
277
+ - { type: set, field: attributes.str.score, value: 'flags.scores[0]' }
278
+ - { type: set, field: attributes.dex.score, value: 'flags.scores[1]' }
279
+ - { type: set, field: attributes.con.score, value: 'flags.scores[2]' }
280
+ - { type: set, field: attributes.int.score, value: 'flags.scores[3]' }
281
+ - { type: set, field: attributes.wis.score, value: 'flags.scores[4]' }
282
+ - { type: set, field: attributes.cha.score, value: 'flags.scores[5]' }
283
+ - id: background
284
+ kind: choice
285
+ random: params.random
286
+ recommend: options[0]
287
+ options: { content: { type: background } }
288
+ changes:
289
+ - type: addItem
290
+ entry: { id: background, item: picked.id }
291
+ - id: free
292
+ kind: action
293
+ use: gain-skill
294
+ params: { entry: steps.background.item.freeSkill, random: params.random }
295
+ - id: quick1
296
+ kind: action
297
+ use: gain-skill
298
+ params: { entry: steps.background.item.quick1, random: params.random }
299
+ - id: quick2
300
+ kind: action
301
+ use: gain-skill
302
+ params: { entry: steps.background.item.quick2, random: params.random }
303
+ - id: psychic1
304
+ kind: action
305
+ when: flags.style >= 6
306
+ use: gain-skill
307
+ params: { entry: "'any-psychic'", random: params.random }
308
+ - id: psychic2
309
+ kind: action
310
+ when: flags.style >= 6
311
+ use: gain-skill
312
+ params: { entry: "'any-psychic'", random: params.random }
313
+ - id: focusRoll
314
+ kind: choice
315
+ random: params.random
316
+ recommend: options[0]
317
+ options:
318
+ - { id: row1, flags: { row: 0 } }
319
+ - { id: row2, flags: { row: 1 } }
320
+ - { id: row3, flags: { row: 2 } }
321
+ - { id: row4, flags: { row: 3 } }
322
+ - { id: row5, flags: { row: 4 } }
323
+ - { id: row6, flags: { row: 5 } }
324
+ # Each entry: the focus, the bonus skill it gives, and a Specialist's skill.
325
+ - id: foci
326
+ kind: branch
327
+ cases:
328
+ - when: true
329
+ flags:
330
+ foci: >-
331
+ [[[['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', '']]]][flags.style][flags.row]
332
+ - id: focus1
333
+ kind: changes
334
+ changes:
335
+ - type: addItem
336
+ entry: { item: "'foci.' + flags.foci[0][0]" }
337
+ - id: focusSkill1
338
+ kind: action
339
+ use: gain-skill
340
+ params:
341
+ entry: "flags.foci[0][0] == 'specialist' ? flags.foci[0][2] : flags.foci[0][1]"
342
+ random: params.random
343
+ - id: focusPicks1
344
+ kind: choice
345
+ options: { pending: { entry: 'steps.focus1.added[0]' } }
346
+ recommend: >-
347
+ choice.id == 'skill' ? flags.foci[0][2]
348
+ : choice.id == 'discipline' && has(steps.focusSkill1.data)
349
+ && steps.focusSkill1.data.skill in options ? steps.focusSkill1.data.skill
350
+ : options[0]
351
+ - id: focus2
352
+ kind: changes
353
+ when: size(flags.foci) > 1
354
+ changes:
355
+ - type: addItem
356
+ entry: { item: "'foci.' + flags.foci[1][0]" }
357
+ - id: focusSkill2
358
+ kind: action
359
+ when: size(flags.foci) > 1
360
+ use: gain-skill
361
+ params:
362
+ entry: "flags.foci[1][0] == 'specialist' ? flags.foci[1][2] : flags.foci[1][1]"
363
+ random: params.random
364
+ - id: focusPicks2
365
+ kind: choice
366
+ when: size(flags.foci) > 1
367
+ options: { pending: { entry: 'steps.focus2.added[0]' } }
368
+ recommend: >-
369
+ choice.id == 'skill' ? flags.foci[1][2]
370
+ : choice.id == 'discipline' && has(steps.focusSkill2.data)
371
+ && steps.focusSkill2.data.skill in options ? steps.focusSkill2.data.skill
372
+ : options[0]
373
+ # The d20 table: every non-psychic skill in order, then a level-0 skill raised to level-1.
374
+ - id: bonus
375
+ kind: choice
376
+ random: params.random
377
+ recommend: options[0]
378
+ options:
379
+ values: { formula: "sortList(keysOf('general') + keysOf('combat')) + ['raise-zero']" }
380
+ - id: bonusSkill
381
+ kind: action
382
+ use: gain-skill
383
+ params: { entry: steps.bonus.picked, random: params.random }
384
+ - id: hp
385
+ kind: roll
386
+ tags: [creation]
387
+ parts: [{ dice: 1d6 }]
388
+ - id: gear
389
+ kind: action
390
+ use: starting-gear
391
+ params: { random: params.random }
392
+ - id: hitPoints
393
+ kind: changes
394
+ sheet: proposed
395
+ changes:
396
+ - { type: set, field: hp.rolled, value: 'max(1, steps.hp.total + attributes.con.mod)' }
397
+ - id: finish
398
+ kind: changes
399
+ sheet: proposed
400
+ changes:
401
+ - { type: set, field: hp.current, value: hp.max }
402
+ - { type: finishCreation }
403
+ - { id: result, kind: outcome, result: "'created'" }
@@ -0,0 +1,60 @@
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
+ - strain
52
+ - torch
53
+ - creation
54
+ - level-up
55
+ - failed-check
56
+ - missed-attack
57
+ - melee
58
+ - ranged
59
+ - heavy
60
+ - unarmed