@opencharacter/cwn-srd 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. package/LICENSE +144 -0
  2. package/README.md +170 -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 +41 -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 +2531 -0
  540. package/dist/index.d.ts +3 -0
  541. package/dist/index.js +2 -0
  542. package/dist/release.json +38279 -0
  543. package/i18n/en/backgrounds.yaml +20 -0
  544. package/i18n/en/cyberware.yaml +299 -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 +1491 -0
  552. package/pack.yaml +13 -0
  553. package/package.json +58 -3
  554. package/rules/advancement.yaml +163 -0
  555. package/rules/armor.yaml +81 -0
  556. package/rules/attributes.yaml +46 -0
  557. package/rules/backgrounds.yaml +102 -0
  558. package/rules/building.yaml +467 -0
  559. package/rules/character.yaml +100 -0
  560. package/rules/checks.yaml +187 -0
  561. package/rules/contacts.yaml +10 -0
  562. package/rules/creation.yaml +398 -0
  563. package/rules/cyberware.yaml +162 -0
  564. package/rules/drones.yaml +38 -0
  565. package/rules/edges.yaml +80 -0
  566. package/rules/foci.yaml +118 -0
  567. package/rules/gear.yaml +185 -0
  568. package/rules/hacking.yaml +131 -0
  569. package/rules/layout.yaml +426 -0
  570. package/rules/magic.yaml +207 -0
  571. package/rules/skills.yaml +61 -0
  572. package/rules/tags.yaml +137 -0
  573. package/rules/vehicles.yaml +30 -0
  574. package/rules/weapons.yaml +253 -0
@@ -0,0 +1,467 @@
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
+ listed: false
11
+ tags: [building]
12
+ params:
13
+ code:
14
+ type: enum
15
+ open: true
16
+ values:
17
+ [
18
+ administer,
19
+ connect,
20
+ drive,
21
+ exert,
22
+ fix,
23
+ heal,
24
+ know,
25
+ lead,
26
+ notice,
27
+ perform,
28
+ program,
29
+ punch,
30
+ shoot,
31
+ sneak,
32
+ stab,
33
+ survive,
34
+ talk,
35
+ trade,
36
+ work,
37
+ cast,
38
+ summon,
39
+ combat,
40
+ any,
41
+ punch-stab,
42
+ noncombat,
43
+ ]
44
+ random: { type: boolean, default: false }
45
+ results: [raised, points]
46
+ steps:
47
+ - id: start
48
+ kind: branch
49
+ sheet: proposed
50
+ cases:
51
+ - when: true
52
+ flags:
53
+ points: '!character.creating'
54
+ candidates: >-
55
+ filterList(keysOf('skill'),
56
+ (params.code == x
57
+ || (params.code == 'combat' && x in ['punch', 'shoot', 'stab'])
58
+ || (params.code == 'punch-stab' && x in ['punch', 'stab'])
59
+ || (params.code == 'noncombat'
60
+ && !(x in ['punch', 'shoot', 'stab', 'cast', 'summon']))
61
+ || (params.code == 'any' && !(x in ['cast', 'summon'])))
62
+ && (!character.creating || fieldOf('skills.{skill}.base', x) < 1))
63
+ # Every skill the pick could name is level-1 already: any other non-magical skill.
64
+ - id: fallback
65
+ kind: branch
66
+ sheet: proposed
67
+ when: size(flags.candidates) == 0
68
+ cases:
69
+ - when: true
70
+ flags:
71
+ candidates: >-
72
+ filterList(keysOf('skill'),
73
+ !(x in ['cast', 'summon']) && fieldOf('skills.{skill}.base', x) < 1)
74
+ - id: skill
75
+ kind: choice
76
+ tags: [skill-pick]
77
+ options: { values: { formula: flags.candidates } }
78
+ when: size(flags.candidates) > 1
79
+ random: params.random
80
+ recommend: flags.candidates[0]
81
+ # A single candidate needs no question.
82
+ - id: picked
83
+ kind: branch
84
+ cases:
85
+ - when: true
86
+ flags: { skill: 'has(steps.skill) ? steps.skill.picked : flags.candidates[0]' }
87
+ - id: raise
88
+ kind: changes
89
+ when: '!flags.points'
90
+ changes:
91
+ - type: adjust
92
+ field: { formula: "fieldId('skills.{skill}.base', flags.skill)" }
93
+ by: 1
94
+ # Three points (and any credit) buy levels in order: level-0 costs 1, level-1 2, and so on.
95
+ - id: pool
96
+ kind: branch
97
+ sheet: proposed
98
+ when: flags.points
99
+ cases:
100
+ - when: true
101
+ flags:
102
+ level: fieldOf('skills.{skill}.base', flags.skill)
103
+ pool: 3 + fieldOf('skills.{skill}.credit', flags.skill)
104
+ - id: buy1
105
+ kind: branch
106
+ when: flags.points && flags.level < 4 && flags.pool >= flags.level + 2
107
+ cases:
108
+ - when: true
109
+ flags: { pool: flags.pool - flags.level - 2, level: flags.level + 1 }
110
+ - id: buy2
111
+ kind: branch
112
+ when: flags.points && flags.level < 4 && flags.pool >= flags.level + 2
113
+ cases:
114
+ - when: true
115
+ flags: { pool: flags.pool - flags.level - 2, level: flags.level + 1 }
116
+ - id: buy3
117
+ kind: branch
118
+ when: flags.points && flags.level < 4 && flags.pool >= flags.level + 2
119
+ cases:
120
+ - when: true
121
+ flags: { pool: flags.pool - flags.level - 2, level: flags.level + 1 }
122
+ - id: spend
123
+ kind: changes
124
+ when: flags.points
125
+ changes:
126
+ - type: set
127
+ field: { formula: "fieldId('skills.{skill}.base', flags.skill)" }
128
+ value: flags.level
129
+ - type: set
130
+ field: { formula: "fieldId('skills.{skill}.credit', flags.skill)" }
131
+ value: 'flags.level >= 4 ? 0 : flags.pool'
132
+ - type: adjust
133
+ when: flags.level >= 4 && flags.pool > 0
134
+ field: skillPoints.unspent
135
+ by: flags.pool
136
+ - id: done
137
+ kind: outcome
138
+ result: "flags.points ? 'points' : 'raised'"
139
+ data: { skill: flags.skill }
140
+
141
+ # An attribute bonus from a background's Growth table: +1 to any attribute, or +2 to physical
142
+ # or mental attributes, split between two of them as the player likes. No score passes 18.
143
+ - id: gain-attribute
144
+ listed: false
145
+ tags: [building]
146
+ params:
147
+ code: { type: enum, values: [any-stat-1, physical-2, mental-2] }
148
+ random: { type: boolean, default: false }
149
+ results: [raised]
150
+ steps:
151
+ - id: start
152
+ kind: branch
153
+ sheet: proposed
154
+ cases:
155
+ - when: true
156
+ flags:
157
+ amount: "params.code == 'any-stat-1' ? 1 : 2"
158
+ group: >-
159
+ params.code == 'physical-2' ? ['str', 'dex', 'con']
160
+ : params.code == 'mental-2' ? ['int', 'wis', 'cha']
161
+ : ['str', 'dex', 'con', 'int', 'wis', 'cha']
162
+ # The recommendation: all of it to the highest score it fits under 18.
163
+ - id: best
164
+ kind: branch
165
+ sheet: proposed
166
+ cases:
167
+ - when: true
168
+ flags:
169
+ best: >-
170
+ sortList(filterList(flags.group,
171
+ fieldOf('attributes.{attribute}.base', x) <= 18 - flags.amount),
172
+ -fieldOf('attributes.{attribute}.base', x))
173
+ - id: boost
174
+ kind: allocate
175
+ sheet: proposed
176
+ fields:
177
+ type: field
178
+ where: >-
179
+ 'attribute-base' in item.tags
180
+ && countList(flags.group, ('attr.' + x) in item.tags) > 0
181
+ budget: flags.amount
182
+ spend: upTo
183
+ limit: 18 - field.value
184
+ random: params.random
185
+ recommend:
186
+ 'attributes.{attribute}.base': >-
187
+ size(flags.best) > 0 && flags.best[0] == '{attribute}' ? flags.amount : 0
188
+ - { id: result, kind: outcome, result: "'raised'" }
189
+
190
+ # A new Focus at level 1, or a Focus the character has raised to level 2, with its bonus skill
191
+ # and the gear it brings.
192
+ - id: gain-focus
193
+ available: foci.taken < foci.allowed
194
+ tags: [building, advancement]
195
+ params:
196
+ random: { type: boolean, default: false }
197
+ results: [gained]
198
+ steps:
199
+ # A new Focus, or the second level of one the character has: asked only when there is one
200
+ # to raise.
201
+ - id: mode
202
+ kind: choice
203
+ sheet: proposed
204
+ when: "countCopies(copy.type == 'focus' && copy.state.level < copy.fields.maxLevel) > 0"
205
+ options: [{ id: new }, { id: raise }]
206
+ recommend: "'new'"
207
+ random: params.random
208
+ - id: picked
209
+ kind: branch
210
+ cases:
211
+ - when: true
212
+ flags: { mode: "has(steps.mode) ? steps.mode.picked : 'new'" }
213
+ - id: focus
214
+ kind: choice
215
+ when: flags.mode == 'new'
216
+ tags: [focus-pick]
217
+ sheet: proposed
218
+ options:
219
+ content:
220
+ type: focus
221
+ where: >-
222
+ ('repeatable' in item.tags || countCopies(copy.item == item.id) == 0)
223
+ && !('brings-cyber' in item.tags
224
+ && (magic.graced || countCopies('bars-cyber' in copy.tags) > 0))
225
+ && !('bars-cyber' in item.tags && (underdog || magic.mage || magic.summoner
226
+ || magic.graced || countCopies(copy.type == 'cyberware' && copy.fields.strain > 0) > 0))
227
+ recommend: options[0]
228
+ random: params.random
229
+ - id: raised
230
+ kind: choice
231
+ when: flags.mode == 'raise'
232
+ sheet: proposed
233
+ options:
234
+ copies: { type: focus, where: self.level < item.maxLevel }
235
+ recommend: options[0]
236
+ random: params.random
237
+ changes:
238
+ - { type: setState, entry: picked, key: level, value: 2 }
239
+ # The Specialist's skill, which is its bonus skill too.
240
+ - id: specialty
241
+ kind: choice
242
+ when: has(steps.focus) && has(steps.focus.item.bonusSkill) && steps.focus.item.bonusSkill == 'noncombat'
243
+ options:
244
+ values:
245
+ [
246
+ administer,
247
+ connect,
248
+ drive,
249
+ exert,
250
+ fix,
251
+ heal,
252
+ know,
253
+ lead,
254
+ notice,
255
+ perform,
256
+ program,
257
+ sneak,
258
+ survive,
259
+ talk,
260
+ trade,
261
+ work,
262
+ ]
263
+ recommend: options[0]
264
+ random: params.random
265
+ # All Natural's first attribute pick.
266
+ - id: attribute
267
+ kind: choice
268
+ when: has(steps.focus) && 'asks-attribute' in steps.focus.item.tags
269
+ options: { values: [str, dex, con, int, wis, cha] }
270
+ recommend: options[0]
271
+ random: params.random
272
+ - id: add
273
+ kind: changes
274
+ when: has(steps.focus)
275
+ changes:
276
+ - type: addItem
277
+ when: '!has(steps.specialty) && !has(steps.attribute)'
278
+ entry: { item: steps.focus.picked }
279
+ - type: addItem
280
+ when: has(steps.specialty)
281
+ entry:
282
+ item: steps.focus.picked
283
+ choices: { skill: [{ option: { formula: steps.specialty.picked } }] }
284
+ - type: addItem
285
+ when: has(steps.attribute)
286
+ entry:
287
+ item: steps.focus.picked
288
+ choices: { attribute-1: [{ option: { formula: steps.attribute.picked } }] }
289
+ - type: addItem
290
+ forEach: steps.focus.item.startingItems
291
+ entry: { item: x }
292
+ # The new Focus's other choices (All Natural's later attribute picks).
293
+ - id: picks
294
+ kind: choice
295
+ when: has(steps.focus)
296
+ options: { pending: { entry: 'steps.add.added[0]' } }
297
+ random: params.random
298
+ - id: cyber
299
+ kind: changes
300
+ sheet: proposed
301
+ when: >-
302
+ has(steps.focus) && size(steps.focus.item.startingCyber) > 0
303
+ && strain.total + steps.focus.item.startingCyberStrain <= strain.max && !magic.graced
304
+ changes:
305
+ - type: addItem
306
+ forEach: steps.focus.item.startingCyber
307
+ entry: { item: x }
308
+ - id: bonus
309
+ kind: action
310
+ when: has(steps.focus) && has(steps.focus.item.bonusSkill)
311
+ use: gain-skill
312
+ params:
313
+ code: "steps.focus.item.bonusSkill == 'noncombat' ? steps.specialty.picked : steps.focus.item.bonusSkill"
314
+ random: params.random
315
+ - id: bonus2
316
+ kind: action
317
+ when: has(steps.focus) && has(steps.focus.item.bonusSkill2)
318
+ use: gain-skill
319
+ params: { code: steps.focus.item.bonusSkill2, random: params.random }
320
+ - id: levelTwo
321
+ kind: action
322
+ when: has(steps.raised) && has(steps.raised.item.levelTwoSkill)
323
+ use: gain-skill
324
+ params: { code: steps.raised.item.levelTwoSkill, random: params.random }
325
+ - id: gear
326
+ kind: action
327
+ when: has(steps.focus) && has(steps.focus.item.gearBudget)
328
+ use: acquire-focus-gear
329
+ params: { kind: steps.focus.item.gearBudget, random: params.random }
330
+ - { id: done, kind: outcome, result: "'gained'" }
331
+
332
+ # An Edge in one of the rules' Edge choices, with its bonus skill and what it brings.
333
+ - id: gain-edge
334
+ tags: [building]
335
+ available: >-
336
+ size(picksOf('edge-1')) == 0 || size(picksOf('edge-2')) == 0
337
+ || (level >= 5 && size(picksOf('edge-5')) == 0)
338
+ || (underdog && size(picksOf('underdog-edge')) == 0)
339
+ params:
340
+ choice: { type: enum, values: [edge-1, edge-2, edge-5, underdog-edge] }
341
+ random: { type: boolean, default: false }
342
+ results: [gained, closed]
343
+ steps:
344
+ # The 5th-level Edge waits for 5th level, the Underdog Rule's for the rule; a taken one is
345
+ # taken.
346
+ - id: closed
347
+ kind: outcome
348
+ sheet: proposed
349
+ when: >-
350
+ (params.choice == 'edge-5' && level < 5) || (params.choice == 'underdog-edge' && !underdog)
351
+ || (params.choice == 'edge-1' && size(picksOf('edge-1')) > 0)
352
+ || (params.choice == 'edge-2' && size(picksOf('edge-2')) > 0)
353
+ || (params.choice == 'edge-5' && size(picksOf('edge-5')) > 0)
354
+ || (params.choice == 'underdog-edge' && size(picksOf('underdog-edge')) > 0)
355
+ result: "'closed'"
356
+ - id: edge
357
+ kind: choice
358
+ tags: [edge-pick]
359
+ sheet: proposed
360
+ options:
361
+ content:
362
+ type: edge
363
+ where: >-
364
+ ('repeatable' in item.tags || !(item.id in edges.taken))
365
+ && (!item.magic || (campaign.magic && params.choice != 'underdog-edge'
366
+ && params.choice != 'edge-5'))
367
+ && !('not-underdog' in item.tags && (underdog || params.choice == 'underdog-edge'))
368
+ && !('brings-cyber' in item.tags
369
+ && (magic.graced || countCopies('bars-cyber' in copy.tags) > 0))
370
+ recommend: options[0]
371
+ random: params.random
372
+ changes:
373
+ - { type: choose, path: { choice: '[params.choice]' }, option: picked.id }
374
+ - id: attribute
375
+ kind: choice
376
+ when: steps.edge.item.asksAttribute
377
+ options: { values: [str, dex, int, wis, cha] }
378
+ recommend: options[0]
379
+ random: params.random
380
+ changes:
381
+ - type: choose
382
+ path: { choice: "[params.choice, steps.edge.picked, 'attribute']" }
383
+ option: picked.id
384
+ - id: bonus
385
+ kind: action
386
+ when: has(steps.edge.item.bonusSkill)
387
+ use: gain-skill
388
+ params: { code: steps.edge.item.bonusSkill, random: params.random }
389
+ # Educated's bonus skill point per level counts from 1st level when it is taken later.
390
+ - id: retro
391
+ kind: changes
392
+ sheet: proposed
393
+ when: "!character.creating && 'retroactive-points' in steps.edge.item.tags"
394
+ changes:
395
+ - { type: adjust, field: skillPoints.unspent, by: level - 1 }
396
+ - id: items
397
+ kind: changes
398
+ when: size(steps.edge.item.startingItems) > 0 || steps.edge.item.friendContacts > 0
399
+ changes:
400
+ - type: addItem
401
+ forEach: steps.edge.item.startingItems
402
+ entry: { item: x }
403
+ - type: addItem
404
+ when: steps.edge.item.friendContacts > 0
405
+ entry: { item: "'contacts.contact'", state: { bond: "'friend'" } }
406
+ - id: cyber
407
+ kind: changes
408
+ sheet: proposed
409
+ when: >-
410
+ size(steps.edge.item.startingCyber) > 0
411
+ && strain.total + steps.edge.item.startingCyberStrain <= strain.max && !magic.graced
412
+ changes:
413
+ - type: addItem
414
+ forEach: steps.edge.item.startingCyber
415
+ entry: { item: x }
416
+ - id: programs
417
+ kind: choice
418
+ when: steps.edge.item.programElements > 0
419
+ sheet: proposed
420
+ options:
421
+ content: { type: program, where: picks == 0 }
422
+ repeat: { max: steps.edge.item.programElements, min: steps.edge.item.programElements }
423
+ random: params.random
424
+ recommend: options[0]
425
+ changes:
426
+ - type: addItem
427
+ entry: { item: picked.id, state: { source: "'edge'" } }
428
+ - id: wired
429
+ kind: action
430
+ when: steps.edge.item.cyberBudget > 0
431
+ use: acquire-wired-cyber
432
+ params: { random: params.random }
433
+ - id: spells
434
+ kind: choice
435
+ when: steps.edge.item.spells > 0
436
+ sheet: proposed
437
+ options:
438
+ content: { type: spell, where: picks == 0 }
439
+ repeat: { max: steps.edge.item.spells, min: steps.edge.item.spells }
440
+ random: params.random
441
+ recommend: options[0]
442
+ changes:
443
+ - type: addItem
444
+ entry: { item: picked.id }
445
+ # Graced: the first level's art points.
446
+ - id: arts
447
+ kind: choice
448
+ when: steps.edge.item.buysArts
449
+ sheet: proposed
450
+ options:
451
+ content:
452
+ type: art
453
+ where: >-
454
+ item.cost <= arts.points - arts.spent && countCopies(copy.item == item.id) == 0
455
+ && !('alacrity' in item.tags && countCopies('alacrity' in copy.tags) > 0)
456
+ repeat: { max: 4 }
457
+ random: params.random
458
+ recommend: options[0]
459
+ changes:
460
+ - type: addItem
461
+ entry: { item: picked.id }
462
+ - id: focus
463
+ kind: action
464
+ when: steps.edge.item.extraFocus
465
+ use: gain-focus
466
+ params: { random: params.random }
467
+ - { 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