@opencharacter/cwn-srd 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. package/LICENSE +144 -0
  2. package/README.md +131 -2
  3. package/content/armor/armored-clothing.yaml +10 -0
  4. package/content/armor/heavy-armored-suit.yaml +14 -0
  5. package/content/armor/impact-jacket.yaml +11 -0
  6. package/content/armor/light-armored-suit.yaml +13 -0
  7. package/content/armor/medium-armored-suit.yaml +13 -0
  8. package/content/armor/ordinary-clothing.yaml +8 -0
  9. package/content/armor/plated-longcoat.yaml +12 -0
  10. package/content/armor/reinforced-clothing.yaml +9 -0
  11. package/content/armor/reinforced-longcoat.yaml +10 -0
  12. package/content/armor/riot-shield.yaml +9 -0
  13. package/content/armor/street-leathers.yaml +9 -0
  14. package/content/armor/war-harness.yaml +10 -0
  15. package/content/armor-accessories/absorption-plates.yaml +13 -0
  16. package/content/armor-accessories/joint-reinforcement.yaml +10 -0
  17. package/content/armor-mods/absorption-pads.yaml +7 -0
  18. package/content/armor-mods/active-response.yaml +7 -0
  19. package/content/armor-mods/biostabilizing.yaml +5 -0
  20. package/content/armor-mods/customized.yaml +8 -0
  21. package/content/armor-mods/discreet-design.yaml +9 -0
  22. package/content/armor-mods/flexible.yaml +7 -0
  23. package/content/armor-mods/quickchange.yaml +5 -0
  24. package/content/armor-mods/sealed.yaml +5 -0
  25. package/content/armor-mods/tailored-rig.yaml +14 -0
  26. package/content/armor-mods/trauma-dampers.yaml +7 -0
  27. package/content/armor-mods/whisperlight.yaml +7 -0
  28. package/content/arts/alacrity-basic.yaml +6 -0
  29. package/content/arts/alacrity-improved.yaml +6 -0
  30. package/content/arts/alacrity-sublime.yaml +6 -0
  31. package/content/arts/arcane-senses.yaml +4 -0
  32. package/content/arts/arcane-skill.yaml +4 -0
  33. package/content/arts/blades-of-will.yaml +4 -0
  34. package/content/arts/brazen-thews.yaml +11 -0
  35. package/content/arts/faultless-grace.yaml +11 -0
  36. package/content/arts/flying-steps.yaml +4 -0
  37. package/content/arts/hand-of-doom.yaml +9 -0
  38. package/content/arts/hundred-faces.yaml +4 -0
  39. package/content/arts/inexhaustible-vigor.yaml +11 -0
  40. package/content/arts/martial-instinct.yaml +16 -0
  41. package/content/arts/occult-pavis.yaml +9 -0
  42. package/content/arts/personal-void.yaml +4 -0
  43. package/content/arts/refulgent-vitality.yaml +4 -0
  44. package/content/arts/skin-of-steel.yaml +14 -0
  45. package/content/arts/sorcerous-sight.yaml +4 -0
  46. package/content/arts/spiritbane.yaml +4 -0
  47. package/content/backgrounds/bum.yaml +18 -0
  48. package/content/backgrounds/bureaucrat.yaml +18 -0
  49. package/content/backgrounds/clergy.yaml +18 -0
  50. package/content/backgrounds/coder.yaml +18 -0
  51. package/content/backgrounds/corp-security.yaml +18 -0
  52. package/content/backgrounds/corper.yaml +18 -0
  53. package/content/backgrounds/criminal.yaml +18 -0
  54. package/content/backgrounds/doctor.yaml +18 -0
  55. package/content/backgrounds/drone-jockey.yaml +18 -0
  56. package/content/backgrounds/ganger.yaml +18 -0
  57. package/content/backgrounds/laborer.yaml +18 -0
  58. package/content/backgrounds/law-enforcement.yaml +18 -0
  59. package/content/backgrounds/manager.yaml +18 -0
  60. package/content/backgrounds/outlander.yaml +18 -0
  61. package/content/backgrounds/performer.yaml +18 -0
  62. package/content/backgrounds/soldier.yaml +18 -0
  63. package/content/backgrounds/spy.yaml +18 -0
  64. package/content/backgrounds/streetwalker.yaml +18 -0
  65. package/content/backgrounds/technician.yaml +18 -0
  66. package/content/backgrounds/trader.yaml +18 -0
  67. package/content/contacts/contact.yaml +2 -0
  68. package/content/cyberdeck-mods/bespoke-code-optimization.yaml +6 -0
  69. package/content/cyberdeck-mods/buffer-circuits.yaml +7 -0
  70. package/content/cyberdeck-mods/cpu-overclocking.yaml +7 -0
  71. package/content/cyberdeck-mods/memory-expansion.yaml +7 -0
  72. package/content/cyberdeck-mods/polymorphic-intrusion-algorithms.yaml +8 -0
  73. package/content/cyberdeck-mods/skeletal-case.yaml +8 -0
  74. package/content/cyberdeck-mods/thermal-exhaust-case.yaml +8 -0
  75. package/content/cyberdecks/beowulf.yaml +9 -0
  76. package/content/cyberdecks/icepick.yaml +9 -0
  77. package/content/cyberdecks/scrap-deck.yaml +9 -0
  78. package/content/cyberdecks/synapse.yaml +9 -0
  79. package/content/cyberdecks/taifu.yaml +9 -0
  80. package/content/cyberdecks/tanto.yaml +9 -0
  81. package/content/cyberdecks/tizona.yaml +9 -0
  82. package/content/cyberware/active-sense-processor.yaml +14 -0
  83. package/content/cyberware/aesthetic-augmentation-suite.yaml +11 -0
  84. package/content/cyberware/assisted-glide-system.yaml +7 -0
  85. package/content/cyberware/banshee-module.yaml +7 -0
  86. package/content/cyberware/body-blades-i.yaml +15 -0
  87. package/content/cyberware/body-blades-ii.yaml +15 -0
  88. package/content/cyberware/coordination-augment-i.yaml +11 -0
  89. package/content/cyberware/coordination-augment-ii.yaml +14 -0
  90. package/content/cyberware/courier-memory.yaml +7 -0
  91. package/content/cyberware/cranial-jack.yaml +13 -0
  92. package/content/cyberware/cyberears.yaml +9 -0
  93. package/content/cyberware/cybereyes.yaml +9 -0
  94. package/content/cyberware/cyberlimb.yaml +7 -0
  95. package/content/cyberware/cybernetic-infrastructure-baseline.yaml +10 -0
  96. package/content/cyberware/deadman-circuit.yaml +7 -0
  97. package/content/cyberware/dermal-armor-i.yaml +11 -0
  98. package/content/cyberware/dermal-armor-ii.yaml +11 -0
  99. package/content/cyberware/dermal-armor-iii.yaml +11 -0
  100. package/content/cyberware/dermal-armor-trauma-shielding.yaml +8 -0
  101. package/content/cyberware/discretion-insurance-unit.yaml +7 -0
  102. package/content/cyberware/ear-mod-filter.yaml +8 -0
  103. package/content/cyberware/ear-mod-positional-detection.yaml +8 -0
  104. package/content/cyberware/ear-mod-sonar.yaml +8 -0
  105. package/content/cyberware/ear-mod-tracer.yaml +8 -0
  106. package/content/cyberware/emergency-stabilization-factor.yaml +7 -0
  107. package/content/cyberware/enhanced-reflexes-i.yaml +7 -0
  108. package/content/cyberware/enhanced-reflexes-ii.yaml +8 -0
  109. package/content/cyberware/enhanced-reflexes-iii.yaml +8 -0
  110. package/content/cyberware/eye-mod-dazzler.yaml +9 -0
  111. package/content/cyberware/eye-mod-flechette-launcher.yaml +11 -0
  112. package/content/cyberware/eye-mod-impostor.yaml +8 -0
  113. package/content/cyberware/eye-mod-infrared-vision.yaml +8 -0
  114. package/content/cyberware/eye-mod-low-light-vision.yaml +8 -0
  115. package/content/cyberware/eye-mod-tactical-view.yaml +8 -0
  116. package/content/cyberware/eye-mod-zoom.yaml +8 -0
  117. package/content/cyberware/fleshmod.yaml +7 -0
  118. package/content/cyberware/full-body-conversion.yaml +11 -0
  119. package/content/cyberware/funes-complex.yaml +7 -0
  120. package/content/cyberware/gunlink.yaml +9 -0
  121. package/content/cyberware/headcomm.yaml +7 -0
  122. package/content/cyberware/hemosynthetic-filter-system.yaml +7 -0
  123. package/content/cyberware/holdout-cavity.yaml +7 -0
  124. package/content/cyberware/iron-hand-aegis.yaml +7 -0
  125. package/content/cyberware/limbgun.yaml +7 -0
  126. package/content/cyberware/medical-support-readout.yaml +7 -0
  127. package/content/cyberware/medusa-implant.yaml +7 -0
  128. package/content/cyberware/muscle-fiber-replacement-i.yaml +11 -0
  129. package/content/cyberware/muscle-fiber-replacement-ii.yaml +11 -0
  130. package/content/cyberware/neolimb.yaml +11 -0
  131. package/content/cyberware/neural-buffer.yaml +27 -0
  132. package/content/cyberware/omnihand.yaml +7 -0
  133. package/content/cyberware/poseidon-implants.yaml +7 -0
  134. package/content/cyberware/prosthetic-cyber-i.yaml +7 -0
  135. package/content/cyberware/prosthetic-cyber-ii.yaml +7 -0
  136. package/content/cyberware/reaction-booster-i.yaml +11 -0
  137. package/content/cyberware/reaction-booster-ii.yaml +11 -0
  138. package/content/cyberware/recovery-support-unit.yaml +7 -0
  139. package/content/cyberware/redundant-systems.yaml +7 -0
  140. package/content/cyberware/regulated-anagathic-substrate.yaml +7 -0
  141. package/content/cyberware/remote-control-unit.yaml +12 -0
  142. package/content/cyberware/retribution-shield.yaml +8 -0
  143. package/content/cyberware/sealed-systems-implant.yaml +7 -0
  144. package/content/cyberware/sensory-recorder.yaml +7 -0
  145. package/content/cyberware/sharkskin-electrodes.yaml +7 -0
  146. package/content/cyberware/shock-fists.yaml +8 -0
  147. package/content/cyberware/skillplug-jack-i.yaml +11 -0
  148. package/content/cyberware/skillplug-jack-ii.yaml +11 -0
  149. package/content/cyberware/skillplug-wiring.yaml +11 -0
  150. package/content/cyberware/skinmod.yaml +6 -0
  151. package/content/cyberware/skull-citadel.yaml +7 -0
  152. package/content/cyberware/skyborn-shielding.yaml +7 -0
  153. package/content/cyberware/stick-pads.yaml +7 -0
  154. package/content/cyberware/synthears.yaml +9 -0
  155. package/content/cyberware/syntheyes.yaml +9 -0
  156. package/content/cyberware/synthlimb.yaml +7 -0
  157. package/content/cyberware/therapeutic-control-dampers.yaml +7 -0
  158. package/content/cyberware/titan-gun-system.yaml +7 -0
  159. package/content/cyberware/trajectory-optimization-node.yaml +7 -0
  160. package/content/cyberware/viper-sting.yaml +7 -0
  161. package/content/cyberware/zombie-wires.yaml +8 -0
  162. package/content/cyberware-complications/bad-connection.yaml +4 -0
  163. package/content/cyberware-complications/blatant.yaml +4 -0
  164. package/content/cyberware-complications/complicated.yaml +4 -0
  165. package/content/cyberware-complications/debilitating.yaml +4 -0
  166. package/content/cyberware-complications/exhausting.yaml +4 -0
  167. package/content/cyberware-complications/fussy.yaml +4 -0
  168. package/content/cyberware-complications/inefficient.yaml +6 -0
  169. package/content/cyberware-complications/loud.yaml +4 -0
  170. package/content/cyberware-complications/petty-annoyance.yaml +4 -0
  171. package/content/cyberware-complications/power-hungry.yaml +4 -0
  172. package/content/cyberware-complications/uncooperative.yaml +4 -0
  173. package/content/cyberware-complications/unreliable.yaml +4 -0
  174. package/content/cyberware-mods/biocapacitors.yaml +6 -0
  175. package/content/cyberware-mods/durable-system.yaml +7 -0
  176. package/content/cyberware-mods/firewalled.yaml +6 -0
  177. package/content/cyberware-mods/hardened-weave.yaml +8 -0
  178. package/content/cyberware-mods/low-maintenance.yaml +6 -0
  179. package/content/cyberware-mods/monoblade.yaml +7 -0
  180. package/content/cyberware-mods/profile-adjustment.yaml +6 -0
  181. package/content/cyberware-mods/quick-detach.yaml +6 -0
  182. package/content/cyberware-mods/tailored-interface.yaml +8 -0
  183. package/content/cyberware-mods/targeting-processor.yaml +6 -0
  184. package/content/drone-fittings/ablative-code-buffer.yaml +7 -0
  185. package/content/drone-fittings/altitude-boost-unit.yaml +7 -0
  186. package/content/drone-fittings/ammo-caddy.yaml +7 -0
  187. package/content/drone-fittings/ammo-supply.yaml +7 -0
  188. package/content/drone-fittings/assisted-boost-burner.yaml +7 -0
  189. package/content/drone-fittings/cargo-space.yaml +8 -0
  190. package/content/drone-fittings/command-deck-follow.yaml +7 -0
  191. package/content/drone-fittings/command-deck-kill.yaml +7 -0
  192. package/content/drone-fittings/command-deck-patrol.yaml +7 -0
  193. package/content/drone-fittings/command-deck-watch.yaml +7 -0
  194. package/content/drone-fittings/emergency-evac-litter.yaml +7 -0
  195. package/content/drone-fittings/emissions-shielding.yaml +7 -0
  196. package/content/drone-fittings/enhanced-structure.yaml +8 -0
  197. package/content/drone-fittings/extended-range.yaml +7 -0
  198. package/content/drone-fittings/glider-grips.yaml +7 -0
  199. package/content/drone-fittings/improved-armor.yaml +9 -0
  200. package/content/drone-fittings/improved-targeting-logic.yaml +7 -0
  201. package/content/drone-fittings/laser-comms.yaml +7 -0
  202. package/content/drone-fittings/manipulator-tendrils.yaml +7 -0
  203. package/content/drone-fittings/memory-banks.yaml +7 -0
  204. package/content/drone-fittings/no-touch-web.yaml +7 -0
  205. package/content/drone-fittings/sleep-mode.yaml +7 -0
  206. package/content/drone-fittings/stealth-package.yaml +7 -0
  207. package/content/drone-fittings/suicide-charge.yaml +7 -0
  208. package/content/drone-fittings/telescopic-optics.yaml +7 -0
  209. package/content/drone-fittings/thermal-optics.yaml +7 -0
  210. package/content/drone-fittings/trauma-response-suite.yaml +7 -0
  211. package/content/drone-fittings/voice-broadcast.yaml +7 -0
  212. package/content/drone-fittings/wallcrawler.yaml +7 -0
  213. package/content/drone-fittings/weapon-hardpoint.yaml +8 -0
  214. package/content/drone-mods/additional-fitting.yaml +8 -0
  215. package/content/drone-mods/additional-hardpoint.yaml +8 -0
  216. package/content/drone-mods/battery-swapping.yaml +7 -0
  217. package/content/drone-mods/boosted-engine.yaml +7 -0
  218. package/content/drone-mods/heavy-plating.yaml +9 -0
  219. package/content/drone-mods/quick-launch.yaml +7 -0
  220. package/content/drone-mods/redundant-systems.yaml +8 -0
  221. package/content/drone-mods/stripped-fittings.yaml +9 -0
  222. package/content/drones/hummingbird.yaml +14 -0
  223. package/content/drones/javelin.yaml +14 -0
  224. package/content/drones/kerberos.yaml +11 -0
  225. package/content/drones/kraken.yaml +11 -0
  226. package/content/drones/mouse.yaml +14 -0
  227. package/content/drones/pitbull.yaml +14 -0
  228. package/content/drones/roach.yaml +14 -0
  229. package/content/drones/shrike.yaml +11 -0
  230. package/content/drones/sunfish.yaml +14 -0
  231. package/content/drugs/avalanche.yaml +5 -0
  232. package/content/drugs/boneshaker.yaml +5 -0
  233. package/content/drugs/chokeout.yaml +4 -0
  234. package/content/drugs/control-delete.yaml +4 -0
  235. package/content/drugs/hellbender.yaml +4 -0
  236. package/content/drugs/lurch.yaml +7 -0
  237. package/content/drugs/madeleine.yaml +4 -0
  238. package/content/drugs/medical-prescription.yaml +4 -0
  239. package/content/drugs/olympus.yaml +6 -0
  240. package/content/drugs/panacea.yaml +5 -0
  241. package/content/drugs/pillow.yaml +5 -0
  242. package/content/drugs/psycho.yaml +4 -0
  243. package/content/drugs/reset.yaml +6 -0
  244. package/content/drugs/sand.yaml +4 -0
  245. package/content/drugs/trauma-patch.yaml +4 -0
  246. package/content/drugs/window.yaml +5 -0
  247. package/content/edges/educated.yaml +10 -0
  248. package/content/edges/face.yaml +4 -0
  249. package/content/edges/focused.yaml +9 -0
  250. package/content/edges/ghost.yaml +4 -0
  251. package/content/edges/graced.yaml +9 -0
  252. package/content/edges/hacker.yaml +12 -0
  253. package/content/edges/hard-to-kill.yaml +9 -0
  254. package/content/edges/killing-blow.yaml +11 -0
  255. package/content/edges/masterful-expertise.yaml +2 -0
  256. package/content/edges/on-target.yaml +8 -0
  257. package/content/edges/operators-fortune.yaml +2 -0
  258. package/content/edges/prodigy.yaml +29 -0
  259. package/content/edges/spellcaster.yaml +10 -0
  260. package/content/edges/summoner.yaml +9 -0
  261. package/content/edges/veterans-luck.yaml +2 -0
  262. package/content/edges/voice-of-the-people.yaml +8 -0
  263. package/content/edges/wired.yaml +10 -0
  264. package/content/foci/ace-driver.yaml +10 -0
  265. package/content/foci/alert.yaml +4 -0
  266. package/content/foci/all-natural.yaml +40 -0
  267. package/content/foci/armsmaster.yaml +16 -0
  268. package/content/foci/assassin.yaml +4 -0
  269. package/content/foci/authority.yaml +4 -0
  270. package/content/foci/close-combatant.yaml +9 -0
  271. package/content/foci/cyberdoc.yaml +7 -0
  272. package/content/foci/deadeye.yaml +8 -0
  273. package/content/foci/diplomat.yaml +4 -0
  274. package/content/foci/drone-pilot.yaml +19 -0
  275. package/content/foci/expert-programmer.yaml +16 -0
  276. package/content/foci/healer.yaml +13 -0
  277. package/content/foci/henchkeeper.yaml +4 -0
  278. package/content/foci/many-faces.yaml +5 -0
  279. package/content/foci/pop-idol.yaml +9 -0
  280. package/content/foci/roamer.yaml +10 -0
  281. package/content/foci/safe-haven.yaml +4 -0
  282. package/content/foci/shocking-assault.yaml +12 -0
  283. package/content/foci/snipers-eye.yaml +4 -0
  284. package/content/foci/specialist.yaml +36 -0
  285. package/content/foci/tinker.yaml +12 -0
  286. package/content/foci/unarmed-combatant.yaml +14 -0
  287. package/content/foci/unique-gift.yaml +4 -0
  288. package/content/foci/unregistered.yaml +4 -0
  289. package/content/foci/whirlwind-assault.yaml +4 -0
  290. package/content/gear/active-hearing-protection.yaml +5 -0
  291. package/content/gear/ammunition.yaml +4 -0
  292. package/content/gear/anti-flash-goggles.yaml +5 -0
  293. package/content/gear/backpack.yaml +7 -0
  294. package/content/gear/basic-smartphone.yaml +4 -0
  295. package/content/gear/binoculars.yaml +5 -0
  296. package/content/gear/bus-pass-monthly.yaml +4 -0
  297. package/content/gear/cheap-vr-crown.yaml +7 -0
  298. package/content/gear/climbing-kit.yaml +5 -0
  299. package/content/gear/empty-magazine.yaml +5 -0
  300. package/content/gear/fashionable-clothing.yaml +7 -0
  301. package/content/gear/fashionable-smartphone.yaml +4 -0
  302. package/content/gear/gas-mask.yaml +5 -0
  303. package/content/gear/handheld-radio.yaml +5 -0
  304. package/content/gear/haute-couture-clothing.yaml +7 -0
  305. package/content/gear/ir-goggles.yaml +5 -0
  306. package/content/gear/kit-basic-tools.yaml +5 -0
  307. package/content/gear/kit-cyberdoc.yaml +5 -0
  308. package/content/gear/kit-medkit.yaml +5 -0
  309. package/content/gear/kit-survival.yaml +5 -0
  310. package/content/gear/lockpicks.yaml +5 -0
  311. package/content/gear/maintenance-supplies.yaml +5 -0
  312. package/content/gear/manufacturers-installation-kit.yaml +5 -0
  313. package/content/gear/military-ration.yaml +5 -0
  314. package/content/gear/ordinary-clothes.yaml +7 -0
  315. package/content/gear/portable-video-camera.yaml +5 -0
  316. package/content/gear/smartphone-service-plan.yaml +4 -0
  317. package/content/gear/surgical-theater-tools-level-1.yaml +5 -0
  318. package/content/gear/surgical-theater-tools-level-2.yaml +4 -0
  319. package/content/gear/surgical-theater-tools-level-3.yaml +4 -0
  320. package/content/gear/ultralight-tab-radio.yaml +5 -0
  321. package/content/gear/wearable-light.yaml +7 -0
  322. package/content/programs/subjects/avatar.yaml +6 -0
  323. package/content/programs/subjects/barrier.yaml +6 -0
  324. package/content/programs/subjects/camera.yaml +6 -0
  325. package/content/programs/subjects/cyber.yaml +6 -0
  326. package/content/programs/subjects/datafile.yaml +6 -0
  327. package/content/programs/subjects/door.yaml +6 -0
  328. package/content/programs/subjects/drone.yaml +6 -0
  329. package/content/programs/subjects/machine.yaml +6 -0
  330. package/content/programs/subjects/program.yaml +6 -0
  331. package/content/programs/subjects/sensor.yaml +6 -0
  332. package/content/programs/subjects/transmission.yaml +6 -0
  333. package/content/programs/subjects/turret.yaml +6 -0
  334. package/content/programs/verbs/activate.yaml +12 -0
  335. package/content/programs/verbs/analyze.yaml +12 -0
  336. package/content/programs/verbs/append.yaml +10 -0
  337. package/content/programs/verbs/blind.yaml +9 -0
  338. package/content/programs/verbs/deactivate.yaml +12 -0
  339. package/content/programs/verbs/decrypt.yaml +10 -0
  340. package/content/programs/verbs/defend.yaml +9 -0
  341. package/content/programs/verbs/delude.yaml +9 -0
  342. package/content/programs/verbs/erase.yaml +11 -0
  343. package/content/programs/verbs/frisk.yaml +11 -0
  344. package/content/programs/verbs/ghost.yaml +8 -0
  345. package/content/programs/verbs/glitch.yaml +10 -0
  346. package/content/programs/verbs/hijack.yaml +9 -0
  347. package/content/programs/verbs/kill.yaml +10 -0
  348. package/content/programs/verbs/lock.yaml +10 -0
  349. package/content/programs/verbs/paralyze.yaml +9 -0
  350. package/content/programs/verbs/replace.yaml +10 -0
  351. package/content/programs/verbs/sabotage.yaml +12 -0
  352. package/content/programs/verbs/sense.yaml +9 -0
  353. package/content/programs/verbs/siege.yaml +9 -0
  354. package/content/programs/verbs/silence.yaml +9 -0
  355. package/content/programs/verbs/stun.yaml +11 -0
  356. package/content/programs/verbs/terminate.yaml +10 -0
  357. package/content/programs/verbs/unlock.yaml +12 -0
  358. package/content/skillplugs/level-0.yaml +35 -0
  359. package/content/skillplugs/level-1.yaml +35 -0
  360. package/content/skillplugs/level-2.yaml +35 -0
  361. package/content/skillplugs/level-3.yaml +37 -0
  362. package/content/spells/arson.yaml +5 -0
  363. package/content/spells/blast.yaml +5 -0
  364. package/content/spells/blastwave.yaml +5 -0
  365. package/content/spells/bless.yaml +5 -0
  366. package/content/spells/cleanse-toxin.yaml +5 -0
  367. package/content/spells/cloak.yaml +5 -0
  368. package/content/spells/combat-precognition.yaml +5 -0
  369. package/content/spells/compulsion.yaml +5 -0
  370. package/content/spells/curse.yaml +5 -0
  371. package/content/spells/detect-target.yaml +5 -0
  372. package/content/spells/dispel.yaml +5 -0
  373. package/content/spells/disrupt.yaml +5 -0
  374. package/content/spells/emotion.yaml +5 -0
  375. package/content/spells/far-senses.yaml +5 -0
  376. package/content/spells/glide.yaml +5 -0
  377. package/content/spells/haste.yaml +5 -0
  378. package/content/spells/heal-injury.yaml +5 -0
  379. package/content/spells/illumination.yaml +5 -0
  380. package/content/spells/mirage.yaml +5 -0
  381. package/content/spells/muffle.yaml +5 -0
  382. package/content/spells/paralysis.yaml +5 -0
  383. package/content/spells/psychic-interrogation.yaml +5 -0
  384. package/content/spells/slow.yaml +5 -0
  385. package/content/spells/soul-link.yaml +5 -0
  386. package/content/spells/stun.yaml +5 -0
  387. package/content/spells/stunwave.yaml +5 -0
  388. package/content/spells/triage.yaml +5 -0
  389. package/content/spirit-powers/airy-steps.yaml +2 -0
  390. package/content/spirit-powers/artifice-wise.yaml +2 -0
  391. package/content/spirit-powers/aura-of-destruction.yaml +2 -0
  392. package/content/spirit-powers/curse.yaml +2 -0
  393. package/content/spirit-powers/ensnare.yaml +4 -0
  394. package/content/spirit-powers/favor.yaml +2 -0
  395. package/content/spirit-powers/feral-pact.yaml +2 -0
  396. package/content/spirit-powers/finned-swiftness.yaml +2 -0
  397. package/content/spirit-powers/flesh-of-clay.yaml +2 -0
  398. package/content/spirit-powers/ghostly-presence.yaml +2 -0
  399. package/content/spirit-powers/hideous-talons.yaml +4 -0
  400. package/content/spirit-powers/iron-eidolon.yaml +4 -0
  401. package/content/spirit-powers/merciful-hands.yaml +2 -0
  402. package/content/spirit-powers/mighty-form.yaml +4 -0
  403. package/content/spirit-powers/mislead.yaml +2 -0
  404. package/content/spirit-powers/misty-form.yaml +2 -0
  405. package/content/spirit-powers/mortal-disguise.yaml +2 -0
  406. package/content/spirit-powers/myrmidons-shield.yaml +2 -0
  407. package/content/spirit-powers/namebearer.yaml +2 -0
  408. package/content/spirit-powers/natural-immunity.yaml +2 -0
  409. package/content/spirit-powers/poltergeist.yaml +2 -0
  410. package/content/spirit-powers/skilled.yaml +2 -0
  411. package/content/spirit-powers/spiderlegs.yaml +2 -0
  412. package/content/spirit-powers/spirit-of-war.yaml +4 -0
  413. package/content/spirit-powers/spirit-whispers.yaml +2 -0
  414. package/content/spirit-powers/spirits-eye.yaml +2 -0
  415. package/content/spirit-powers/swift-pursuit.yaml +2 -0
  416. package/content/spirit-powers/violent-will.yaml +4 -0
  417. package/content/spirits/spirit.yaml +11 -0
  418. package/content/syndromes/brutal.yaml +4 -0
  419. package/content/syndromes/candid.yaml +4 -0
  420. package/content/syndromes/cold.yaml +4 -0
  421. package/content/syndromes/distant.yaml +4 -0
  422. package/content/syndromes/exultant.yaml +4 -0
  423. package/content/syndromes/fearless.yaml +4 -0
  424. package/content/syndromes/hypervigilant.yaml +4 -0
  425. package/content/syndromes/murderous.yaml +4 -0
  426. package/content/syndromes/ravenous.yaml +4 -0
  427. package/content/syndromes/savage.yaml +4 -0
  428. package/content/syndromes/secretive.yaml +4 -0
  429. package/content/syndromes/stressed.yaml +4 -0
  430. package/content/vehicle-fittings/advanced-sensors.yaml +7 -0
  431. package/content/vehicle-fittings/afterburners.yaml +8 -0
  432. package/content/vehicle-fittings/armor-plating.yaml +8 -0
  433. package/content/vehicle-fittings/cargo-space.yaml +6 -0
  434. package/content/vehicle-fittings/crash-pod.yaml +8 -0
  435. package/content/vehicle-fittings/ecm-emitter.yaml +8 -0
  436. package/content/vehicle-fittings/emissions-cloaking.yaml +8 -0
  437. package/content/vehicle-fittings/extra-durability.yaml +9 -0
  438. package/content/vehicle-fittings/extra-passengers.yaml +8 -0
  439. package/content/vehicle-fittings/field-portable.yaml +7 -0
  440. package/content/vehicle-fittings/ghost-driver.yaml +8 -0
  441. package/content/vehicle-fittings/hardpoint-support.yaml +10 -0
  442. package/content/vehicle-fittings/jack-control-port.yaml +7 -0
  443. package/content/vehicle-fittings/limpet-mount-medium.yaml +8 -0
  444. package/content/vehicle-fittings/limpet-mount-small.yaml +8 -0
  445. package/content/vehicle-fittings/living-quarters.yaml +8 -0
  446. package/content/vehicle-fittings/medbay.yaml +9 -0
  447. package/content/vehicle-fittings/offroad-package.yaml +9 -0
  448. package/content/vehicle-fittings/power-system-large.yaml +9 -0
  449. package/content/vehicle-fittings/power-system-medium.yaml +9 -0
  450. package/content/vehicle-fittings/power-system-small.yaml +8 -0
  451. package/content/vehicle-fittings/sealed-atmosphere.yaml +9 -0
  452. package/content/vehicle-fittings/smugglers-hold.yaml +7 -0
  453. package/content/vehicle-fittings/targeting-board.yaml +9 -0
  454. package/content/vehicle-fittings/tool-rack.yaml +8 -0
  455. package/content/vehicle-mods/augmented-armor.yaml +7 -0
  456. package/content/vehicle-mods/drone-hub.yaml +6 -0
  457. package/content/vehicle-mods/extra-seating.yaml +7 -0
  458. package/content/vehicle-mods/integrated-magazines.yaml +6 -0
  459. package/content/vehicle-mods/personalized-controls.yaml +6 -0
  460. package/content/vehicle-mods/power-system-upgrade.yaml +7 -0
  461. package/content/vehicle-mods/q-cladding.yaml +6 -0
  462. package/content/vehicle-mods/reactive-defenses.yaml +8 -0
  463. package/content/vehicle-mods/reinforced-chassis.yaml +8 -0
  464. package/content/vehicle-mods/remote-sensors.yaml +6 -0
  465. package/content/vehicle-mods/supplementary-tanks.yaml +6 -0
  466. package/content/vehicle-mods/ultralight-components.yaml +8 -0
  467. package/content/vehicle-mods/upgraded-speed.yaml +8 -0
  468. package/content/vehicles/apc.yaml +16 -0
  469. package/content/vehicles/car.yaml +14 -0
  470. package/content/vehicles/casra.yaml +17 -0
  471. package/content/vehicles/dropcraft.yaml +17 -0
  472. package/content/vehicles/gev.yaml +16 -0
  473. package/content/vehicles/helicopter.yaml +16 -0
  474. package/content/vehicles/micro-flyer.yaml +15 -0
  475. package/content/vehicles/motorcycle.yaml +14 -0
  476. package/content/vehicles/tank.yaml +16 -0
  477. package/content/vehicles/truck.yaml +14 -0
  478. package/content/weapon-mods/autotargeting.yaml +7 -0
  479. package/content/weapon-mods/body-blades-1.yaml +17 -0
  480. package/content/weapon-mods/body-blades-2.yaml +17 -0
  481. package/content/weapon-mods/concealed.yaml +4 -0
  482. package/content/weapon-mods/customized.yaml +6 -0
  483. package/content/weapon-mods/extended-mag.yaml +7 -0
  484. package/content/weapon-mods/hand-of-doom.yaml +16 -0
  485. package/content/weapon-mods/heavy-sabot.yaml +7 -0
  486. package/content/weapon-mods/integral-toxins.yaml +8 -0
  487. package/content/weapon-mods/onboard-gunlink.yaml +5 -0
  488. package/content/weapon-mods/predictive-guidance.yaml +8 -0
  489. package/content/weapon-mods/reel-wires.yaml +5 -0
  490. package/content/weapon-mods/savage-impact.yaml +8 -0
  491. package/content/weapon-mods/shock-burst.yaml +4 -0
  492. package/content/weapon-mods/stun-rounds.yaml +13 -0
  493. package/content/weapon-mods/thermal-charge.yaml +8 -0
  494. package/content/weapon-mods/unarmed-combatant-2.yaml +7 -0
  495. package/content/weapon-mods/unarmed-combatant.yaml +11 -0
  496. package/content/weapons/advanced-big-sword.yaml +15 -0
  497. package/content/weapons/advanced-bow.yaml +17 -0
  498. package/content/weapons/advanced-club.yaml +15 -0
  499. package/content/weapons/advanced-knife.yaml +16 -0
  500. package/content/weapons/advanced-sword.yaml +14 -0
  501. package/content/weapons/anti-materiel-rifle.yaml +19 -0
  502. package/content/weapons/automatic-rifle.yaml +18 -0
  503. package/content/weapons/big-club.yaml +16 -0
  504. package/content/weapons/big-sword.yaml +15 -0
  505. package/content/weapons/club.yaml +17 -0
  506. package/content/weapons/combat-rifle.yaml +18 -0
  507. package/content/weapons/combat-shotgun.yaml +18 -0
  508. package/content/weapons/demo-charge.yaml +17 -0
  509. package/content/weapons/drone-cannon.yaml +17 -0
  510. package/content/weapons/eye-flechette.yaml +14 -0
  511. package/content/weapons/flash-grenade.yaml +14 -0
  512. package/content/weapons/frag-grenade.yaml +16 -0
  513. package/content/weapons/gas-grenade.yaml +14 -0
  514. package/content/weapons/grenade-launcher.yaml +15 -0
  515. package/content/weapons/headshot-pod.yaml +17 -0
  516. package/content/weapons/heavy-machine-gun.yaml +20 -0
  517. package/content/weapons/heavy-pistol.yaml +15 -0
  518. package/content/weapons/knife.yaml +16 -0
  519. package/content/weapons/land-mine-anti-personnel.yaml +14 -0
  520. package/content/weapons/land-mine-anti-vehicle.yaml +15 -0
  521. package/content/weapons/light-pistol.yaml +15 -0
  522. package/content/weapons/main-tank-gun.yaml +17 -0
  523. package/content/weapons/mortar.yaml +17 -0
  524. package/content/weapons/mounted-autogun.yaml +18 -0
  525. package/content/weapons/rifle.yaml +16 -0
  526. package/content/weapons/rocket-launcher.yaml +17 -0
  527. package/content/weapons/semi-auto-shotgun.yaml +16 -0
  528. package/content/weapons/shotgun.yaml +16 -0
  529. package/content/weapons/shrieker-gun.yaml +15 -0
  530. package/content/weapons/smoke-grenade.yaml +14 -0
  531. package/content/weapons/sniper-rifle.yaml +18 -0
  532. package/content/weapons/spear.yaml +16 -0
  533. package/content/weapons/submachine-gun.yaml +17 -0
  534. package/content/weapons/sword.yaml +14 -0
  535. package/content/weapons/taser-pistol.yaml +14 -0
  536. package/content/weapons/unarmed.yaml +13 -0
  537. package/dist/i18n/en.d.ts +3 -0
  538. package/dist/i18n/en.js +2 -0
  539. package/dist/i18n/en.json +2506 -0
  540. package/dist/index.d.ts +3 -0
  541. package/dist/index.js +2 -0
  542. package/dist/release.json +37339 -0
  543. package/i18n/en/backgrounds.yaml +20 -0
  544. package/i18n/en/cyberware.yaml +298 -0
  545. package/i18n/en/edges.yaml +41 -0
  546. package/i18n/en/foci.yaml +184 -0
  547. package/i18n/en/gear.yaml +252 -0
  548. package/i18n/en/magic.yaml +174 -0
  549. package/i18n/en/tech.yaml +472 -0
  550. package/i18n/en/weapons.yaml +99 -0
  551. package/i18n/en.yaml +1467 -0
  552. package/pack.yaml +13 -0
  553. package/package.json +58 -3
  554. package/rules/advancement.yaml +157 -0
  555. package/rules/armor.yaml +81 -0
  556. package/rules/attributes.yaml +42 -0
  557. package/rules/backgrounds.yaml +98 -0
  558. package/rules/building.yaml +445 -0
  559. package/rules/character.yaml +100 -0
  560. package/rules/checks.yaml +174 -0
  561. package/rules/contacts.yaml +10 -0
  562. package/rules/creation.yaml +395 -0
  563. package/rules/cyberware.yaml +156 -0
  564. package/rules/drones.yaml +38 -0
  565. package/rules/edges.yaml +78 -0
  566. package/rules/foci.yaml +115 -0
  567. package/rules/gear.yaml +176 -0
  568. package/rules/hacking.yaml +131 -0
  569. package/rules/layout.yaml +417 -0
  570. package/rules/magic.yaml +199 -0
  571. package/rules/skills.yaml +61 -0
  572. package/rules/tags.yaml +129 -0
  573. package/rules/vehicles.yaml +30 -0
  574. package/rules/weapons.yaml +251 -0
@@ -0,0 +1,445 @@
1
+ # The building blocks creation and advancement share: gaining a skill, an attribute bonus, an
2
+ # Edge and a Focus. Each takes `random`, which draws its picks instead of recommending them.
3
+ actions:
4
+ # A skill pick. During creation the skill goes up one level: the first time to level-0, the
5
+ # second to level-1, and a third time the player picks any other skill not already level-1.
6
+ # During advancement (a Focus's or Edge's bonus skill) it is three skill points toward the
7
+ # skill, which may raise it past the level the character could normally buy; what doesn't buy a
8
+ # level stays as credit toward it. On a skill already at level-4 the points go to the pool.
9
+ - id: gain-skill
10
+ tags: [building]
11
+ params:
12
+ code:
13
+ type: enum
14
+ values:
15
+ [
16
+ administer,
17
+ connect,
18
+ drive,
19
+ exert,
20
+ fix,
21
+ heal,
22
+ know,
23
+ lead,
24
+ notice,
25
+ perform,
26
+ program,
27
+ punch,
28
+ shoot,
29
+ sneak,
30
+ stab,
31
+ survive,
32
+ talk,
33
+ trade,
34
+ work,
35
+ cast,
36
+ summon,
37
+ combat,
38
+ any,
39
+ punch-stab,
40
+ noncombat,
41
+ ]
42
+ random: { type: boolean, default: false }
43
+ results: [raised, points]
44
+ steps:
45
+ - id: start
46
+ kind: branch
47
+ sheet: proposed
48
+ cases:
49
+ - when: true
50
+ flags:
51
+ points: '!character.creating'
52
+ candidates: >-
53
+ filterList(keysOf('skill'),
54
+ (params.code == x
55
+ || (params.code == 'combat' && x in ['punch', 'shoot', 'stab'])
56
+ || (params.code == 'punch-stab' && x in ['punch', 'stab'])
57
+ || (params.code == 'noncombat'
58
+ && !(x in ['punch', 'shoot', 'stab', 'cast', 'summon']))
59
+ || (params.code == 'any' && !(x in ['cast', 'summon'])))
60
+ && (!character.creating || fieldOf('skills.{skill}.base', x) < 1))
61
+ # Every skill the pick could name is level-1 already: any other non-magical skill.
62
+ - id: fallback
63
+ kind: branch
64
+ sheet: proposed
65
+ when: size(flags.candidates) == 0
66
+ cases:
67
+ - when: true
68
+ flags:
69
+ candidates: >-
70
+ filterList(keysOf('skill'),
71
+ !(x in ['cast', 'summon']) && fieldOf('skills.{skill}.base', x) < 1)
72
+ - id: skill
73
+ kind: choice
74
+ tags: [skill-pick]
75
+ options: { values: { formula: flags.candidates } }
76
+ when: size(flags.candidates) > 1
77
+ random: params.random
78
+ recommend: flags.candidates[0]
79
+ # A single candidate needs no question.
80
+ - id: picked
81
+ kind: branch
82
+ cases:
83
+ - when: true
84
+ flags: { skill: 'has(steps.skill) ? steps.skill.picked : flags.candidates[0]' }
85
+ - id: raise
86
+ kind: changes
87
+ when: '!flags.points'
88
+ changes:
89
+ - type: adjust
90
+ field: { formula: "'skills.' + flags.skill + '.base'" }
91
+ by: 1
92
+ # Three points (and any credit) buy levels in order: level-0 costs 1, level-1 2, and so on.
93
+ - id: pool
94
+ kind: branch
95
+ sheet: proposed
96
+ when: flags.points
97
+ cases:
98
+ - when: true
99
+ flags:
100
+ level: fieldOf('skills.{skill}.base', flags.skill)
101
+ pool: 3 + fieldOf('skills.{skill}.credit', flags.skill)
102
+ - id: buy1
103
+ kind: branch
104
+ when: flags.points && flags.level < 4 && flags.pool >= flags.level + 2
105
+ cases:
106
+ - when: true
107
+ flags: { pool: flags.pool - flags.level - 2, level: flags.level + 1 }
108
+ - id: buy2
109
+ kind: branch
110
+ when: flags.points && flags.level < 4 && flags.pool >= flags.level + 2
111
+ cases:
112
+ - when: true
113
+ flags: { pool: flags.pool - flags.level - 2, level: flags.level + 1 }
114
+ - id: buy3
115
+ kind: branch
116
+ when: flags.points && flags.level < 4 && flags.pool >= flags.level + 2
117
+ cases:
118
+ - when: true
119
+ flags: { pool: flags.pool - flags.level - 2, level: flags.level + 1 }
120
+ - id: spend
121
+ kind: changes
122
+ when: flags.points
123
+ changes:
124
+ - type: set
125
+ field: { formula: "'skills.' + flags.skill + '.base'" }
126
+ value: flags.level
127
+ - type: set
128
+ field: { formula: "'skills.' + flags.skill + '.credit'" }
129
+ value: 'flags.level >= 4 ? 0 : flags.pool'
130
+ - type: adjust
131
+ when: flags.level >= 4 && flags.pool > 0
132
+ field: skillPoints.unspent
133
+ by: flags.pool
134
+ - id: done
135
+ kind: outcome
136
+ result: "flags.points ? 'points' : 'raised'"
137
+ data: { skill: flags.skill }
138
+
139
+ # An attribute bonus from a background's Growth table: +1 to any attribute, or +2 to physical
140
+ # or mental attributes, split between two of them as the player likes. No score passes 18.
141
+ - id: gain-attribute
142
+ tags: [building]
143
+ params:
144
+ code: { type: enum, values: [any-stat-1, physical-2, mental-2] }
145
+ random: { type: boolean, default: false }
146
+ steps:
147
+ - id: start
148
+ kind: branch
149
+ sheet: proposed
150
+ cases:
151
+ - when: true
152
+ flags:
153
+ amount: "params.code == 'any-stat-1' ? 1 : 2"
154
+ group: >-
155
+ params.code == 'physical-2' ? ['str', 'dex', 'con']
156
+ : params.code == 'mental-2' ? ['int', 'wis', 'cha']
157
+ : ['str', 'dex', 'con', 'int', 'wis', 'cha']
158
+ # The recommendation: all of it to the highest score it fits under 18.
159
+ - id: best
160
+ kind: branch
161
+ sheet: proposed
162
+ cases:
163
+ - when: true
164
+ flags:
165
+ best: >-
166
+ sortList(filterList(flags.group,
167
+ fieldOf('attributes.{attribute}.base', x) <= 18 - flags.amount),
168
+ -fieldOf('attributes.{attribute}.base', x))
169
+ - id: boost
170
+ kind: allocate
171
+ sheet: proposed
172
+ fields:
173
+ type: field
174
+ where: >-
175
+ 'attribute-base' in item.tags
176
+ && countList(flags.group, ('attr.' + x) in item.tags) > 0
177
+ budget: flags.amount
178
+ spend: upTo
179
+ limit: 18 - field.value
180
+ random: params.random
181
+ recommend:
182
+ 'attributes.{attribute}.base': >-
183
+ size(flags.best) > 0 && flags.best[0] == '{attribute}' ? flags.amount : 0
184
+
185
+ # A new Focus at level 1, or a Focus the character has raised to level 2, with its bonus skill
186
+ # and the gear it brings.
187
+ - id: gain-focus
188
+ tags: [building, advancement]
189
+ params:
190
+ random: { type: boolean, default: false }
191
+ results: [gained]
192
+ steps:
193
+ # A new Focus, or the second level of one the character has: asked only when there is one
194
+ # to raise.
195
+ - id: mode
196
+ kind: choice
197
+ sheet: proposed
198
+ when: "countCopies(copy.type == 'focus' && copy.state.level < copy.fields.maxLevel) > 0"
199
+ options: [{ id: new }, { id: raise }]
200
+ recommend: "'new'"
201
+ random: params.random
202
+ - id: picked
203
+ kind: branch
204
+ cases:
205
+ - when: true
206
+ flags: { mode: "has(steps.mode) ? steps.mode.picked : 'new'" }
207
+ - id: focus
208
+ kind: choice
209
+ when: flags.mode == 'new'
210
+ tags: [focus-pick]
211
+ sheet: proposed
212
+ options:
213
+ content:
214
+ type: focus
215
+ where: >-
216
+ ('repeatable' in item.tags || countCopies(copy.item == item.id) == 0)
217
+ && !('brings-cyber' in item.tags
218
+ && (magic.graced || countCopies(copy.item == @foci.all-natural) > 0))
219
+ && !(item.id == @foci.all-natural && (underdog || magic.mage || magic.summoner
220
+ || magic.graced || countCopies(copy.type == 'cyberware' && copy.fields.strain > 0) > 0))
221
+ recommend: options[0]
222
+ random: params.random
223
+ - id: raised
224
+ kind: choice
225
+ when: flags.mode == 'raise'
226
+ sheet: proposed
227
+ options:
228
+ copies: { type: focus, where: self.level < item.maxLevel }
229
+ recommend: options[0]
230
+ random: params.random
231
+ changes:
232
+ - { type: setState, entry: picked, key: level, value: 2 }
233
+ # The Specialist's skill, which is its bonus skill too.
234
+ - id: specialty
235
+ kind: choice
236
+ when: has(steps.focus) && has(steps.focus.item.bonusSkill) && steps.focus.item.bonusSkill == 'noncombat'
237
+ options:
238
+ values:
239
+ [
240
+ administer,
241
+ connect,
242
+ drive,
243
+ exert,
244
+ fix,
245
+ heal,
246
+ know,
247
+ lead,
248
+ notice,
249
+ perform,
250
+ program,
251
+ sneak,
252
+ survive,
253
+ talk,
254
+ trade,
255
+ work,
256
+ ]
257
+ recommend: options[0]
258
+ random: params.random
259
+ # All Natural's first attribute pick.
260
+ - id: attribute
261
+ kind: choice
262
+ when: has(steps.focus) && 'asks-attribute' in steps.focus.item.tags
263
+ options: { values: [str, dex, con, int, wis, cha] }
264
+ recommend: options[0]
265
+ random: params.random
266
+ - id: add
267
+ kind: changes
268
+ when: has(steps.focus)
269
+ changes:
270
+ - type: addItem
271
+ when: '!has(steps.specialty) && !has(steps.attribute)'
272
+ entry: { item: steps.focus.picked }
273
+ - type: addItem
274
+ when: has(steps.specialty)
275
+ entry:
276
+ item: steps.focus.picked
277
+ choices: { skill: [{ option: { formula: steps.specialty.picked } }] }
278
+ - type: addItem
279
+ when: has(steps.attribute)
280
+ entry:
281
+ item: steps.focus.picked
282
+ choices: { attribute-1: [{ option: { formula: steps.attribute.picked } }] }
283
+ - type: addItem
284
+ forEach: steps.focus.item.startingItems
285
+ entry: { item: x }
286
+ # The new Focus's other choices (All Natural's later attribute picks).
287
+ - id: picks
288
+ kind: choice
289
+ when: has(steps.focus)
290
+ options: { pending: { entry: 'steps.add.added[0]' } }
291
+ random: params.random
292
+ - id: cyber
293
+ kind: changes
294
+ sheet: proposed
295
+ when: >-
296
+ has(steps.focus) && size(steps.focus.item.startingCyber) > 0
297
+ && strain.total + steps.focus.item.startingCyberStrain <= strain.max && !magic.graced
298
+ changes:
299
+ - type: addItem
300
+ forEach: steps.focus.item.startingCyber
301
+ entry: { item: x }
302
+ - id: bonus
303
+ kind: action
304
+ when: has(steps.focus) && has(steps.focus.item.bonusSkill)
305
+ use: gain-skill
306
+ params:
307
+ code: "steps.focus.item.bonusSkill == 'noncombat' ? steps.specialty.picked : steps.focus.item.bonusSkill"
308
+ random: params.random
309
+ - id: bonus2
310
+ kind: action
311
+ when: has(steps.focus) && has(steps.focus.item.bonusSkill2)
312
+ use: gain-skill
313
+ params: { code: steps.focus.item.bonusSkill2, random: params.random }
314
+ - id: levelTwo
315
+ kind: action
316
+ when: has(steps.raised) && has(steps.raised.item.levelTwoSkill)
317
+ use: gain-skill
318
+ params: { code: steps.raised.item.levelTwoSkill, random: params.random }
319
+ - id: gear
320
+ kind: action
321
+ when: has(steps.focus) && has(steps.focus.item.gearBudget)
322
+ use: acquire-focus-gear
323
+ params: { kind: steps.focus.item.gearBudget, random: params.random }
324
+ - { id: done, kind: outcome, result: "'gained'" }
325
+
326
+ # An Edge in one of the rules' Edge choices, with its bonus skill and what it brings.
327
+ - id: gain-edge
328
+ tags: [building]
329
+ params:
330
+ choice: { type: enum, values: [edge-1, edge-2, edge-5, underdog-edge] }
331
+ random: { type: boolean, default: false }
332
+ results: [gained]
333
+ steps:
334
+ - id: edge
335
+ kind: choice
336
+ tags: [edge-pick]
337
+ sheet: proposed
338
+ options:
339
+ content:
340
+ type: edge
341
+ where: >-
342
+ ('repeatable' in item.tags || !(item.id in edges.taken))
343
+ && (!item.magic || (campaign.magic && params.choice != 'underdog-edge'
344
+ && params.choice != 'edge-5'))
345
+ && !('not-underdog' in item.tags && (underdog || params.choice == 'underdog-edge'))
346
+ && !('brings-cyber' in item.tags
347
+ && (magic.graced || countCopies(copy.item == @foci.all-natural) > 0))
348
+ recommend: options[0]
349
+ random: params.random
350
+ changes:
351
+ - { type: choose, path: { choice: '[params.choice]' }, option: picked.id }
352
+ - id: attribute
353
+ kind: choice
354
+ when: steps.edge.item.asksAttribute
355
+ options: { values: [str, dex, int, wis, cha] }
356
+ recommend: options[0]
357
+ random: params.random
358
+ changes:
359
+ - type: choose
360
+ path: { choice: "[params.choice, steps.edge.picked, 'attribute']" }
361
+ option: picked.id
362
+ - id: bonus
363
+ kind: action
364
+ when: has(steps.edge.item.bonusSkill)
365
+ use: gain-skill
366
+ params: { code: steps.edge.item.bonusSkill, random: params.random }
367
+ # Educated's bonus skill point per level counts from 1st level when it is taken later.
368
+ - id: retro
369
+ kind: changes
370
+ sheet: proposed
371
+ when: "!character.creating && 'retroactive-points' in steps.edge.item.tags"
372
+ changes:
373
+ - { type: adjust, field: skillPoints.unspent, by: level - 1 }
374
+ - id: items
375
+ kind: changes
376
+ when: size(steps.edge.item.startingItems) > 0 || steps.edge.item.friendContacts > 0
377
+ changes:
378
+ - type: addItem
379
+ forEach: steps.edge.item.startingItems
380
+ entry: { item: x }
381
+ - type: addItem
382
+ when: steps.edge.item.friendContacts > 0
383
+ entry: { item: "'contacts.contact'", state: { bond: "'friend'" } }
384
+ - id: cyber
385
+ kind: changes
386
+ sheet: proposed
387
+ when: >-
388
+ size(steps.edge.item.startingCyber) > 0
389
+ && strain.total + steps.edge.item.startingCyberStrain <= strain.max && !magic.graced
390
+ changes:
391
+ - type: addItem
392
+ forEach: steps.edge.item.startingCyber
393
+ entry: { item: x }
394
+ - id: programs
395
+ kind: choice
396
+ when: steps.edge.item.programElements > 0
397
+ sheet: proposed
398
+ options:
399
+ content: { type: program, where: picks == 0 }
400
+ repeat: { max: steps.edge.item.programElements, min: steps.edge.item.programElements }
401
+ random: params.random
402
+ recommend: options[0]
403
+ changes:
404
+ - type: addItem
405
+ entry: { item: picked.id, state: { source: "'edge'" } }
406
+ - id: wired
407
+ kind: action
408
+ when: steps.edge.item.cyberBudget > 0
409
+ use: acquire-wired-cyber
410
+ params: { random: params.random }
411
+ - id: spells
412
+ kind: choice
413
+ when: steps.edge.item.spells > 0
414
+ sheet: proposed
415
+ options:
416
+ content: { type: spell, where: picks == 0 }
417
+ repeat: { max: steps.edge.item.spells, min: steps.edge.item.spells }
418
+ random: params.random
419
+ recommend: options[0]
420
+ changes:
421
+ - type: addItem
422
+ entry: { item: picked.id }
423
+ # Graced: the first level's art points.
424
+ - id: arts
425
+ kind: choice
426
+ when: steps.edge.item.buysArts
427
+ sheet: proposed
428
+ options:
429
+ content:
430
+ type: art
431
+ where: >-
432
+ item.cost <= arts.points - arts.spent && countCopies(copy.item == item.id) == 0
433
+ && !('alacrity' in item.tags && countCopies('alacrity' in copy.tags) > 0)
434
+ repeat: { max: 4 }
435
+ random: params.random
436
+ recommend: options[0]
437
+ changes:
438
+ - type: addItem
439
+ entry: { item: picked.id }
440
+ - id: focus
441
+ kind: action
442
+ when: steps.edge.item.extraFocus
443
+ use: gain-focus
444
+ params: { random: params.random }
445
+ - { id: done, kind: outcome, result: "'gained'" }
@@ -0,0 +1,100 @@
1
+ families:
2
+ save: [physical, evasion, mental, luck]
3
+
4
+ fields:
5
+ # Optional rules the campaign uses. Magic opens the magical Edges and skills; alienation tracks
6
+ # the psychological cost of cyber.
7
+ campaign.magic: { type: boolean, input: true, default: false }
8
+ campaign.alienation: { type: boolean, input: true, default: false }
9
+
10
+ # Experience levels run from 1 to 10. The table is the fast or the slow one.
11
+ level: { type: integer, input: true, default: 1, min: 1, max: 10 }
12
+ xp.current: { type: integer, input: true, default: 0, min: 0 }
13
+ xp.track: { type: enum, values: [fast, slow], input: true, default: fast }
14
+ # The experience total the next level needs (0 at 10th level).
15
+ xp.next:
16
+ type: integer
17
+ formula: >-
18
+ level >= 10 ? 0
19
+ : (xp.track == 'fast' ? [0, 3, 6, 12, 18, 27, 39, 54, 72, 93]
20
+ : [0, 6, 15, 24, 36, 51, 69, 87, 105, 139])[level]
21
+
22
+ # Hit points: the rolled maximum is saved; the maximum is what effects make of it.
23
+ hp.rolled: { type: integer, input: true, default: 1, min: 1 }
24
+ hp.max: { type: integer, formula: hp.rolled, min: 1 }
25
+ hp.current: { type: integer, input: true, default: 0, min: 0, max: hp.max }
26
+ # Frail: stabilized from mortal injury. Another drop to zero kills; no natural healing.
27
+ hp.frail: { type: boolean, input: true, default: false }
28
+
29
+ # Saving throws: roll 1d20 equal or over the target. 16 minus level and the better modifier.
30
+ saves.physical:
31
+ type: integer
32
+ tags: [save, save.physical]
33
+ formula: 16 - level - max(attributes.str.mod, attributes.con.mod)
34
+ saves.evasion:
35
+ type: integer
36
+ tags: [save, save.evasion]
37
+ formula: 16 - level - max(attributes.dex.mod, attributes.int.mod)
38
+ saves.mental:
39
+ type: integer
40
+ tags: [save, save.mental]
41
+ formula: 16 - level - max(attributes.wis.mod, attributes.cha.mod)
42
+ saves.luck: { type: integer, tags: [save, save.luck], formula: 16 - level }
43
+
44
+ # Combat basics.
45
+ combat.attackBonus: { type: integer, formula: floor(level / 2) }
46
+ # Added to every hit point damage roll and to Shock (Killing Blow).
47
+ combat.damageBonus: { type: integer, formula: '0' }
48
+ # Added to every Trauma Die the character rolls.
49
+ combat.traumaBonus: { type: integer, formula: '0' }
50
+ combat.initiative: { type: integer, formula: attributes.dex.mod }
51
+ combat.move: { type: integer, formula: '10' }
52
+ trauma.target: { type: integer, formula: '6' }
53
+ # Armor Class before Dexterity: 10 unarmored, or what armor or dermal plating sets.
54
+ ac.ranged.base: { type: integer, formula: '10' }
55
+ ac.melee.base: { type: integer, formula: '10' }
56
+ ac.ranged: { type: integer, formula: ac.ranged.base + attributes.dex.mod }
57
+ ac.melee: { type: integer, formula: ac.melee.base + attributes.dex.mod }
58
+
59
+ # Money and lifestyle. Lifestyle moves the System Strain maximum.
60
+ money: { type: integer, input: true, default: 0, min: 0 }
61
+ lifestyle:
62
+ type: enum
63
+ values: [squatter, slum, middle, fine, luxury]
64
+ input: true
65
+ default: middle
66
+ lifestyle.strain:
67
+ type: integer
68
+ formula: "[-2, -1, 0, 1, 2][indexOf(['squatter', 'slum', 'middle', 'fine', 'luxury'], lifestyle)]"
69
+
70
+ # Starting languages beyond the city's lingua franca and a native tongue: one for Know or
71
+ # Connect at level-0, two at level-1 or better, each.
72
+ languages.extra:
73
+ type: integer
74
+ formula: >-
75
+ (skills.know.level >= 1 ? 2 : skills.know.level >= 0 ? 1 : 0)
76
+ + (skills.connect.level >= 1 ? 2 : skills.connect.level >= 0 ? 1 : 0)
77
+ languages.known: { type: string, input: true, default: '' }
78
+
79
+ # Character advancement.
80
+ skillPoints.unspent: { type: integer, input: true, default: 0, min: 0 }
81
+ # Skill points spent on attribute boosts: at most five, ever.
82
+ advancement.attributeBoosts: { type: integer, input: true, default: 0, min: 0, max: 5 }
83
+ # The Underdog Rule: a bonus Edge for a modifier total of -1 or less. It forbids buying
84
+ # attribute boosts later.
85
+ underdog: { type: boolean, input: true, default: false }
86
+
87
+ # Notes the player writes: a name is the app's; the goal is part of the sheet.
88
+ goal: { type: string, input: true, default: '' }
89
+
90
+ constraints:
91
+ # The Underdog Rule's modifier total holds at the end of creation; later gains don't matter.
92
+ - id: underdog-modifiers
93
+ check: '!character.creating || !underdog || attributes.modTotal <= -1'
94
+ - id: underdog-boosts
95
+ check: '!underdog || advancement.attributeBoosts == 0'
96
+
97
+ followUps:
98
+ - id: level-up
99
+ while: '!character.creating && level < 10 && xp.current >= xp.next'
100
+ action: level-up