@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,156 @@
1
+ contentTypes:
2
+ # Implanted cyberware. Each system adds its System Strain as permanent strain.
3
+ cyberware:
4
+ fields:
5
+ cost: { type: integer, default: 0, min: 0 }
6
+ category:
7
+ type: enum
8
+ values: [body, head, skin, limb, sensory, medical, nerve]
9
+ required: true
10
+ concealment: { type: enum, values: [medical, touch, sight], required: true }
11
+ strain: { type: decimal, default: 0, min: 0 }
12
+ # Eye and ear mods cost half their strain with a pair of cybereyes or cyberears.
13
+ eyeMod: { type: boolean, default: false }
14
+ earMod: { type: boolean, default: false }
15
+ # System Strain triggering the system costs, for systems that cost it every time.
16
+ triggerStrain: { type: integer, min: 1 }
17
+ # The base Armor Class dermal plating gives, and a bonus to the Trauma Target.
18
+ baseAc: { type: integer }
19
+ traumaMod: { type: integer, default: 0 }
20
+ state:
21
+ # Damaged cyber is useless until repaired.
22
+ damaged: { type: boolean, default: false }
23
+ # Bought with the Wired Edge's budget.
24
+ wired: { type: boolean, default: false }
25
+ effects:
26
+ - id: ranged-ac
27
+ target: ac.ranged.base
28
+ op: set
29
+ value: item.baseAc
30
+ when: has(item.baseAc) && !self.damaged
31
+ - id: melee-ac
32
+ target: ac.melee.base
33
+ op: set
34
+ value: item.baseAc
35
+ when: has(item.baseAc) && !self.damaged
36
+ - id: trauma
37
+ target: trauma.target
38
+ op: add
39
+ value: item.traumaMod
40
+ when: item.traumaMod != 0 && !self.damaged
41
+ actions:
42
+ - use: trigger-cyber
43
+
44
+ # A skillplug chip, slotted (`equipped`) in a skillplug jack: a skill at its level. Physical
45
+ # skills need a Skillplug Jack II, and level-2 and level-3 plugs Skillplug Wiring.
46
+ skillplug:
47
+ carried: true
48
+ equippable: true
49
+ fields:
50
+ cost: { type: integer, default: 0, min: 0 }
51
+ plugLevel: { type: integer, required: true, min: 0, max: 3 }
52
+
53
+ # Optional alienation: a chrome syndrome raises the alienation the character can bear.
54
+ syndrome:
55
+ fields:
56
+ alienation: { type: integer, required: true, min: 0 }
57
+ effects:
58
+ - { id: allowance, target: alienation.max, op: add, value: item.alienation }
59
+
60
+ fields:
61
+ cyber.eyes:
62
+ type: boolean
63
+ formula: "countCopies(copy.type == 'cyberware' && 'cybereyes' in copy.tags) > 0"
64
+ # The best skillplug jack implanted (1 for Jack I, 2 for Jack II) and Skillplug Wiring.
65
+ cyber.plugJack: { type: integer, formula: '0' }
66
+ cyber.plugWiring: { type: boolean, formula: 'false' }
67
+ cyber.ears:
68
+ type: boolean
69
+ formula: "countCopies(copy.type == 'cyberware' && 'cyberears' in copy.tags) > 0"
70
+ # Strain from implants, eye and ear mods halved by a pair of cybereyes or cyberears.
71
+ strain.cyber:
72
+ type: decimal
73
+ formula: >-
74
+ sumCopies(copy.fields.strain
75
+ * ((copy.fields.eyeMod && cyber.eyes) || (copy.fields.earMod && cyber.ears) ? 0.5 : 1),
76
+ copy.type == 'cyberware')
77
+ # Implant strain the body ignores (Cybernetic Infrastructure Baseline).
78
+ strain.cyberIgnored: { type: decimal, formula: '0' }
79
+ # A cyberdoc's maintenance lowers implant strain by one or two points until the next one.
80
+ strain.maintenanceRelief: { type: integer, input: true, default: 0, min: 0, max: 2 }
81
+ # Other permanent strain: Hypervigilant, linked magic items, an implant complication.
82
+ strain.otherPermanent: { type: decimal, input: true, default: 0, min: 0 }
83
+ strain.permanent:
84
+ type: decimal
85
+ formula: >-
86
+ max(0, strain.cyber - strain.cyberIgnored - strain.maintenanceRelief) + strain.otherPermanent
87
+ # Strain from drugs, healing and cyber activation; one point goes each night's rest.
88
+ strain.temporary: { type: integer, input: true, default: 0, min: 0 }
89
+ strain.total:
90
+ type: decimal
91
+ formula: strain.permanent + strain.temporary
92
+ limits: { max: strain.max }
93
+ # The Constitution score the maximum counts (20 for a full body conversion).
94
+ strain.constitution: { type: integer, formula: attributes.con.score }
95
+ strain.max: { type: integer, formula: strain.constitution + lifestyle.strain }
96
+
97
+ # The Wired Edge's budget and the cyber bought with it.
98
+ cyber.wiredBudget: { type: integer, formula: '0' }
99
+ cyber.wiredUsed:
100
+ type: integer
101
+ formula: "sumCopies(copy.fields.cost, copy.type == 'cyberware' && copy.state.wired)"
102
+
103
+ # Optional: cyberware alienation. Each system adds its strain rounded up, two more for Nerve
104
+ # cyber; going over the Wisdom score (plus the chrome syndromes' allowances) is cyber-induced
105
+ # psychosis.
106
+ alienation.permanent:
107
+ type: integer
108
+ formula: >-
109
+ sumCopies(ceil(copy.fields.strain
110
+ * ((copy.fields.eyeMod && cyber.eyes) || (copy.fields.earMod && cyber.ears) ? 0.5 : 1))
111
+ + (copy.fields.category == 'nerve' ? 2 : 0), copy.type == 'cyberware')
112
+ alienation.current: { type: integer, input: true, default: 0, min: 0 }
113
+ alienation.max: { type: integer, formula: attributes.wis.score }
114
+ alienation.total:
115
+ type: integer
116
+ formula: max(alienation.permanent, alienation.current)
117
+ limits: { max: 'campaign.alienation ? alienation.max : 1000' }
118
+
119
+ constraints:
120
+ - id: wired-budget
121
+ check: cyber.wiredUsed <= cyber.wiredBudget
122
+
123
+ actions:
124
+ # Trigger a system that costs System Strain each use. It can't be triggered past the maximum.
125
+ - id: trigger-cyber
126
+ tags: [cyber]
127
+ available: >-
128
+ has(item.triggerStrain) && !self.damaged && strain.total + item.triggerStrain <= strain.max
129
+ steps:
130
+ - id: strain
131
+ kind: changes
132
+ changes:
133
+ - { type: adjust, field: strain.temporary, by: item.triggerStrain }
134
+
135
+ # Pick cyber with the Wired Edge's budget: new systems the character's strain can carry.
136
+ - id: acquire-wired-cyber
137
+ tags: [building]
138
+ params:
139
+ random: { type: boolean, default: false }
140
+ steps:
141
+ - id: cyber
142
+ kind: choice
143
+ sheet: proposed
144
+ options:
145
+ content:
146
+ type: cyberware
147
+ where: >-
148
+ item.cost <= cyber.wiredBudget - cyber.wiredUsed
149
+ && strain.total + item.strain <= strain.max
150
+ && countCopies(copy.item == item.id) == 0
151
+ repeat: { max: 8 }
152
+ recommend: options[0]
153
+ random: params.random
154
+ changes:
155
+ - type: addItem
156
+ entry: { item: picked.id, state: { wired: true } }
@@ -0,0 +1,38 @@
1
+ contentTypes:
2
+ # Drones. Portable ones (tagged `portable`) have Encumbrance; fittings and mods are templates
3
+ # that add to the copy's fields.
4
+ drone:
5
+ carried: true
6
+ equippable: true
7
+ fields:
8
+ cost: { type: integer, default: 0, min: 0 }
9
+ enc: { type: integer, min: 0 }
10
+ ac: { type: integer, required: true }
11
+ traumaTarget: { type: integer, required: true }
12
+ hp: { type: integer, required: true, min: 1 }
13
+ fittings: { type: integer, default: 0, min: 0 }
14
+ fittingsUsed: { type: integer, default: 0, min: 0 }
15
+ move: { type: integer, required: true, min: 0 }
16
+ moveKind: { type: enum, values: [ground, fly, swim], required: true }
17
+ hardpoints: { type: integer, default: 0, min: 0 }
18
+ state:
19
+ hp: { type: integer, default: item.hp, min: 0, max: item.hp }
20
+ # Bought with a Drone Pilot's gear budget.
21
+ focusGear: { type: boolean, default: false }
22
+
23
+ fields:
24
+ # A pilot's attack bonus with a drone's guns: their attack bonus, Int or Dex, and the better of
25
+ # Drive or Program.
26
+ drones.attackBonus:
27
+ type: integer
28
+ formula: >-
29
+ combat.attackBonus + max(attributes.int.mod, attributes.dex.mod)
30
+ + max(skills.drive.level, skills.program.level)
31
+ # Drones a pilot can command at once: one with a control board, one plus Drive with a Remote
32
+ # Control Unit.
33
+ drones.commandable: { type: integer, formula: '1' }
34
+
35
+ constraints:
36
+ - id: drone-fittings
37
+ copies: { type: drone }
38
+ check: item.fittingsUsed <= item.fittings
@@ -0,0 +1,78 @@
1
+ contentTypes:
2
+ # Edges are picked in the rules-level choices below: two at creation, a bonus one under the
3
+ # Underdog Rule, and a third at 5th level.
4
+ edge:
5
+ copies: { max: 0 }
6
+ fields:
7
+ # The skill the Edge grants as a bonus skill: a skill, `combat` (a combat skill) or `any`.
8
+ bonusSkill:
9
+ type: enum
10
+ values:
11
+ [
12
+ administer,
13
+ connect,
14
+ drive,
15
+ exert,
16
+ fix,
17
+ heal,
18
+ know,
19
+ lead,
20
+ notice,
21
+ perform,
22
+ program,
23
+ punch,
24
+ shoot,
25
+ sneak,
26
+ stab,
27
+ survive,
28
+ talk,
29
+ trade,
30
+ work,
31
+ cast,
32
+ summon,
33
+ combat,
34
+ any,
35
+ ]
36
+ # A magical Edge: only in campaigns with magic, only for new characters, and never as the
37
+ # Underdog Rule's bonus Edge.
38
+ magic: { type: boolean, default: false }
39
+ # What taking the Edge brings besides its effects, which the action that gains it adds: gear
40
+ # by content ID, program elements, a cyber budget, spells, a Focus pick, Friend Contacts.
41
+ startingItems: { type: set, of: string, default: [] }
42
+ # Cyberware it brings, installed when the character's System Strain can take it all.
43
+ startingCyber: { type: set, of: string, default: [] }
44
+ startingCyberStrain: { type: decimal, default: 0, min: 0 }
45
+ programElements: { type: integer, default: 0, min: 0 }
46
+ cyberBudget: { type: integer, default: 0, min: 0 }
47
+ spells: { type: integer, default: 0, min: 0 }
48
+ extraFocus: { type: boolean, default: false }
49
+ friendContacts: { type: integer, default: 0, min: 0 }
50
+ # The Edge buys Graced arts with its art points.
51
+ buysArts: { type: boolean, default: false }
52
+ # The Edge asks for an attribute (Prodigy).
53
+ asksAttribute: { type: boolean, default: false }
54
+ effects:
55
+ - id: taken
56
+ target: edges.taken
57
+ op: grant
58
+ value: { formula: item.id }
59
+
60
+ fields:
61
+ edges.taken: { type: set, of: edge }
62
+ # Extra hit points on each hit die (Hard to Kill).
63
+ hp.dieBonus: { type: integer, formula: '0' }
64
+ # Skill points each level brings (Educated adds one).
65
+ skillPoints.perLevel: { type: integer, formula: '3' }
66
+
67
+ choices:
68
+ - id: edge
69
+ slots: [1, 2, 5]
70
+ unique: edges
71
+ when: slot < 5 || level >= 5
72
+ from: { type: edge }
73
+ eligible: (campaign.magic || !item.magic) && (slot < 5 || !item.magic)
74
+ - id: underdog-edge
75
+ unique: edges
76
+ when: underdog
77
+ from: { type: edge }
78
+ eligible: '!item.magic'
@@ -0,0 +1,115 @@
1
+ contentTypes:
2
+ # A Focus is a copy with its level: the first time it is chosen it is level 1, the second time
3
+ # level 2. Specialist may be taken again for another skill.
4
+ focus:
5
+ fields:
6
+ maxLevel: { type: integer, default: 2, min: 1, max: 2 }
7
+ # Bonus skills on taking the first level: a skill or `combat`, `any`, `punch-stab`, or
8
+ # `noncombat` (the Specialist's skill). `bonusSkill2` is a second one.
9
+ bonusSkill:
10
+ type: enum
11
+ values:
12
+ [
13
+ administer,
14
+ connect,
15
+ drive,
16
+ exert,
17
+ fix,
18
+ heal,
19
+ know,
20
+ lead,
21
+ notice,
22
+ perform,
23
+ program,
24
+ punch,
25
+ shoot,
26
+ sneak,
27
+ stab,
28
+ survive,
29
+ talk,
30
+ trade,
31
+ work,
32
+ combat,
33
+ any,
34
+ punch-stab,
35
+ noncombat,
36
+ ]
37
+ bonusSkill2:
38
+ type: enum
39
+ values:
40
+ [
41
+ administer,
42
+ connect,
43
+ drive,
44
+ exert,
45
+ fix,
46
+ heal,
47
+ know,
48
+ lead,
49
+ notice,
50
+ perform,
51
+ program,
52
+ punch,
53
+ shoot,
54
+ sneak,
55
+ stab,
56
+ survive,
57
+ talk,
58
+ trade,
59
+ work,
60
+ ]
61
+ # A bonus skill on taking the second level (Ace Driver's Fix).
62
+ levelTwoSkill:
63
+ type: enum
64
+ values:
65
+ [
66
+ administer,
67
+ connect,
68
+ drive,
69
+ exert,
70
+ fix,
71
+ heal,
72
+ know,
73
+ lead,
74
+ notice,
75
+ perform,
76
+ program,
77
+ punch,
78
+ shoot,
79
+ sneak,
80
+ stab,
81
+ survive,
82
+ talk,
83
+ trade,
84
+ work,
85
+ ]
86
+ # Gear the first level brings, by content ID, and the gear budget it opens.
87
+ startingItems: { type: set, of: string, default: [] }
88
+ # Cyberware it brings, installed when the character's System Strain can take it all.
89
+ startingCyber: { type: set, of: string, default: [] }
90
+ startingCyberStrain: { type: decimal, default: 0, min: 0 }
91
+ gearBudget: { type: enum, values: [vehicle, drone] }
92
+ state:
93
+ level: { type: integer, default: 1, min: 1, max: item.maxLevel }
94
+
95
+ fields:
96
+ # Focus levels the character may have: one at creation, one more at levels 2, 5, 7 and 10, and
97
+ # one per Focused Edge.
98
+ foci.allowed:
99
+ type: integer
100
+ formula: '1 + (level >= 2 ? 1 : 0) + (level >= 5 ? 1 : 0) + (level >= 7 ? 1 : 0) + (level >= 10 ? 1 : 0)'
101
+ foci.taken:
102
+ type: integer
103
+ formula: "sumCopies(copy.state.level, copy.type == 'focus')"
104
+
105
+ constraints:
106
+ - id: foci-allowed
107
+ check: foci.taken <= foci.allowed
108
+ - id: focus-once
109
+ copies: { type: focus, where: "!('repeatable' in item.tags)" }
110
+ check: countCopies(copy.item == item.id) <= 1
111
+
112
+ followUps:
113
+ - id: gain-focus
114
+ while: '!character.creating && foci.taken < foci.allowed'
115
+ action: gain-focus
@@ -0,0 +1,176 @@
1
+ contentTypes:
2
+ # Mission gear: kits, tools, clothing, comms. Readied gear is `equipped`.
3
+ gear:
4
+ carried: true
5
+ equippable: true
6
+ fields:
7
+ cost: { type: integer, default: 0, min: 0 }
8
+ # Encumbrance; none for gear that fits in a pocket. Gear tagged `worn` (clothing, packs)
9
+ # counts nothing while Readied.
10
+ enc: { type: integer, min: 0 }
11
+
12
+ # Pharmaceuticals and street drugs. `minHeal` is the Heal skill needed to administer one (none
13
+ # for anyone); `strain` the System Strain a dose adds.
14
+ drug:
15
+ carried: true
16
+ fields:
17
+ cost: { type: integer, default: 0, min: 0 }
18
+ enc: { type: integer, default: 1, min: 0 }
19
+ minHeal: { type: integer, min: 0 }
20
+ strain: { type: integer, default: 0, min: 0 }
21
+ # Hit points a dose heals, plus the Heal skill of whoever applies it.
22
+ healDice: { type: dice }
23
+ actions:
24
+ - use: use-drug
25
+
26
+ fields:
27
+ # Encumbrance: Readied gear up to half Strength, Stowed gear up to Strength. A character may
28
+ # push past both by two Readied and four Stowed, twice, losing Move each time.
29
+ enc.readied:
30
+ type: integer
31
+ formula: >-
32
+ sumCopies(copy.fields.enc * copy.quantity,
33
+ has(copy.fields.enc) && copy.equipped && !('worn' in copy.tags))
34
+ limits: { max: enc.readiedMax + 4 }
35
+ enc.stowed:
36
+ type: integer
37
+ formula: >-
38
+ sumCopies(copy.fields.enc * copy.quantity, has(copy.fields.enc) && !copy.equipped)
39
+ limits: { max: enc.stowedMax + 8 }
40
+ enc.readiedMax: { type: integer, formula: floor(attributes.str.score / 2) }
41
+ enc.stowedMax: { type: integer, formula: attributes.str.score }
42
+ # How far past the limits the load is: 0, 1 (Move 7 m) or 2 (Move 5 m).
43
+ enc.overload:
44
+ type: integer
45
+ formula: >-
46
+ min(2, max(0, max(ceil((enc.readied - enc.readiedMax) / 2),
47
+ ceil((enc.stowed - enc.stowedMax) / 4))))
48
+
49
+ # Mods a tech can keep maintained: Int and Con modifiers plus three times Fix (Tinker doubles
50
+ # it, and at level 2 counts Fix one level higher).
51
+ maintenance.multiplier: { type: integer, formula: '1' }
52
+ maintenance.fixBonus: { type: integer, formula: '0' }
53
+ maintenance.max:
54
+ type: integer
55
+ formula: >-
56
+ max(0, attributes.int.mod + attributes.con.mod
57
+ + 3 * min(5, max(0, skills.fix.level + maintenance.fixBonus))) * maintenance.multiplier
58
+ # Mods the character keeps up, counted by the player.
59
+ maintenance.used: { type: integer, input: true, default: 0, min: 0 }
60
+
61
+ # Focus gear budgets (Ace Driver and Roamer for vehicles, Drone Pilot for drones), and what the
62
+ # character's focus gear costs against them.
63
+ budget.vehicle: { type: integer, formula: '0' }
64
+ budget.drone: { type: integer, formula: '0' }
65
+ budget.vehicleUsed:
66
+ type: integer
67
+ formula: "sumCopies(copy.fields.cost, copy.type == 'vehicle' && copy.state.focusGear)"
68
+ budget.droneUsed:
69
+ type: integer
70
+ formula: "sumCopies(copy.fields.cost, copy.type == 'drone' && copy.state.focusGear)"
71
+
72
+ effects:
73
+ - id: overload
74
+ target: combat.move
75
+ op: add
76
+ value: '-[0, 3, 5][enc.overload]'
77
+ when: enc.overload > 0
78
+
79
+ constraints:
80
+ - id: vehicle-budget
81
+ check: budget.vehicleUsed <= budget.vehicle
82
+ - id: drone-budget
83
+ check: budget.droneUsed <= budget.drone
84
+
85
+ actions:
86
+ # Take a dose: spends the copy, adds its System Strain and, for healing drugs, heals.
87
+ - id: use-drug
88
+ tags: [drug]
89
+ available: self.quantity > 0
90
+ params:
91
+ healerSkill: { type: integer, optional: true }
92
+ steps:
93
+ - id: heal
94
+ kind: roll
95
+ when: has(item.healDice)
96
+ tags: [healing]
97
+ parts:
98
+ - dice: item.healDice
99
+ - value: 'has(params.healerSkill) ? params.healerSkill : 0'
100
+ - id: take
101
+ kind: changes
102
+ changes:
103
+ - { type: adjustQuantity, entry: self, by: -1 }
104
+ - { type: adjust, when: item.strain > 0, field: strain.temporary, by: item.strain }
105
+ - { type: adjust, when: has(steps.heal), field: hp.current, by: steps.heal.total }
106
+
107
+ # Buy vehicles or drones with a Focus's gear budget: the dearest one the budget buys is
108
+ # recommended. More are offered while the budget lasts, the dearest that still fits recommended,
109
+ # so an automatic run spends the budget; a player stops with `#done`.
110
+ - id: acquire-focus-gear
111
+ tags: [building]
112
+ available: budget.vehicle > budget.vehicleUsed || budget.drone > budget.droneUsed
113
+ params:
114
+ kind: { type: enum, values: [vehicle, drone] }
115
+ random: { type: boolean, default: false }
116
+ steps:
117
+ - id: vehicle
118
+ kind: choice
119
+ when: params.kind == 'vehicle'
120
+ sheet: proposed
121
+ options:
122
+ content:
123
+ type: vehicle
124
+ where: >-
125
+ item.cost <= budget.vehicle - budget.vehicleUsed && !('restricted' in item.tags)
126
+ prefer: item.cost
127
+ random: params.random
128
+ changes:
129
+ - type: addItem
130
+ entry: { item: picked.id, state: { focusGear: true } }
131
+ - id: vehicles
132
+ kind: choice
133
+ when: params.kind == 'vehicle'
134
+ sheet: proposed
135
+ options:
136
+ content:
137
+ type: vehicle
138
+ where: >-
139
+ item.cost <= budget.vehicle - budget.vehicleUsed && !('restricted' in item.tags)
140
+ repeat: { max: 5 }
141
+ prefer: item.cost
142
+ random: params.random
143
+ changes:
144
+ - type: addItem
145
+ entry: { item: picked.id, state: { focusGear: true } }
146
+ - id: drone
147
+ kind: choice
148
+ when: params.kind == 'drone'
149
+ sheet: proposed
150
+ options:
151
+ content:
152
+ type: drone
153
+ where: >-
154
+ item.cost <= budget.drone - budget.droneUsed && !('restricted' in item.tags)
155
+ && (!has(item.enc) || enc.stowed + item.enc <= enc.stowedMax)
156
+ prefer: item.cost
157
+ random: params.random
158
+ changes:
159
+ - type: addItem
160
+ entry: { item: picked.id, state: { focusGear: true } }
161
+ - id: drones
162
+ kind: choice
163
+ when: params.kind == 'drone'
164
+ sheet: proposed
165
+ options:
166
+ content:
167
+ type: drone
168
+ where: >-
169
+ item.cost <= budget.drone - budget.droneUsed && !('restricted' in item.tags)
170
+ && (!has(item.enc) || enc.stowed + item.enc <= enc.stowedMax)
171
+ repeat: { max: 5 }
172
+ prefer: item.cost
173
+ random: params.random
174
+ changes:
175
+ - type: addItem
176
+ entry: { item: picked.id, state: { focusGear: true } }
@@ -0,0 +1,131 @@
1
+ contentTypes:
2
+ # Cyberdecks. The best deck the character carries is the one they hack with.
3
+ cyberdeck:
4
+ carried: true
5
+ equippable: true
6
+ fields:
7
+ cost: { type: integer, default: 0, min: 0 }
8
+ enc: { type: integer, min: 0 }
9
+ bonusAccess: { type: integer, default: 0 }
10
+ memory: { type: integer, default: 0, min: 0 }
11
+ shielding: { type: integer, default: 0, min: 0 }
12
+ cpu: { type: integer, default: 0, min: 0 }
13
+ state:
14
+ # Shielding spent absorbing Stun and Kill damage; it regenerates after fifteen minutes.
15
+ shieldingUsed: { type: integer, default: 0, min: 0 }
16
+ effects:
17
+ - { id: access, target: hacking.deck.bonusAccess, op: set, value: item.bonusAccess }
18
+ - { id: memory, target: hacking.memory.max, op: set, value: item.memory }
19
+ - { id: cpu, target: hacking.cpu, op: set, value: item.cpu }
20
+ - { id: shielding, target: hacking.shielding.max, op: set, value: item.shielding }
21
+ - id: shield
22
+ target: { incoming: { fields: [hp.current], tags: [damage.cyberspace] } }
23
+ op: add
24
+ value: min(item.shielding - self.shieldingUsed, -incoming.amount)
25
+ when: >-
26
+ self.equipped && item.shielding > self.shieldingUsed && incoming.amount < 0
27
+ then:
28
+ - type: adjustState
29
+ entry: self
30
+ key: shieldingUsed
31
+ by: min(item.shielding - self.shieldingUsed, -incoming.amount)
32
+
33
+ # Program elements in deck Memory: Verbs (what to do) and Subjects (what to do it to).
34
+ program:
35
+ carried: true
36
+ fields:
37
+ cost: { type: integer, default: 0, min: 0 }
38
+ kind: { type: enum, values: [verb, subject], required: true }
39
+ # A Verb's valid Subject types, the Access it costs and its skill check modifier.
40
+ targets: { type: set, of: string, default: [] }
41
+ accessCost: { type: integer, default: 1, min: 0 }
42
+ checkMod: { type: integer, default: 0 }
43
+ # A Subject's type.
44
+ subjectType: { type: enum, values: [avatar, data, device, cyber, program] }
45
+ state:
46
+ # Bought on the street, written and maintained by the hacker, or one of the Hacker Edge's
47
+ # eight free elements.
48
+ source: { type: enum, values: [bought, written, edge], default: bought }
49
+ actions:
50
+ - use: run-program
51
+
52
+ fields:
53
+ hacking.deck.bonusAccess: { type: integer, formula: '0' }
54
+ hacking.memory.max: { type: integer, formula: '0' }
55
+ hacking.cpu: { type: integer, formula: '0' }
56
+ hacking.shielding.max: { type: integer, formula: '0' }
57
+ hacking.shielding.current:
58
+ type: integer
59
+ formula: >-
60
+ maxCopies(copy.fields.shielding - copy.state.shieldingUsed,
61
+ copy.type == 'cyberdeck' && copy.equipped)
62
+ # Access: Intelligence modifier, Program skill and the deck's bonus. It refreshes once a day.
63
+ hacking.access.max:
64
+ type: integer
65
+ formula: max(0, attributes.int.mod + skills.program.level + hacking.deck.bonusAccess)
66
+ hacking.access.spent: { type: integer, input: true, default: 0, min: 0 }
67
+ hacking.access.current:
68
+ { type: integer, formula: 'max(0, hacking.access.max - hacking.access.spent)' }
69
+ # Memory: one unit per program element (half with Expert Programmer 2) and per datafile.
70
+ hacking.datafiles: { type: integer, input: true, default: 0, min: 0 }
71
+ hacking.memory.perElement: { type: decimal, formula: '1' }
72
+ hacking.memory.used:
73
+ type: integer
74
+ formula: "ceil(countCopies(copy.type == 'program') * hacking.memory.perElement) + hacking.datafiles"
75
+ limits: { max: hacking.memory.max }
76
+ # Verbs and Subjects a hacker can write and keep current: two per level of Program skill.
77
+ hacking.programming.max:
78
+ type: integer
79
+ formula: 'skills.program.level >= 1 ? 2 * skills.program.level : 0'
80
+ hacking.programming.used:
81
+ type: integer
82
+ formula: "countCopies(copy.type == 'program' && copy.state.source == 'written')"
83
+ limits: { max: hacking.programming.max }
84
+
85
+ actions:
86
+ # Run a program: this Verb with a Subject in Memory. Pay the Verb's Access and roll Int/Program
87
+ # against the security difficulty; a failure loses the Access.
88
+ - id: run-program
89
+ tags: [hacking]
90
+ available: >-
91
+ item.kind == 'verb' && hacking.cpu > 0 && hacking.access.current >= item.accessCost
92
+ params:
93
+ difficulty: { type: integer, optional: true }
94
+ wireless: { type: boolean, default: false }
95
+ crown: { type: boolean, default: false }
96
+ modifier: { type: integer, optional: true }
97
+ results: [success, failure, rolled]
98
+ steps:
99
+ - id: subject
100
+ kind: choice
101
+ options:
102
+ copies:
103
+ type: program
104
+ where: item.kind == 'subject' && item.subjectType in action.item.targets
105
+ recommend: options[0]
106
+ - id: start
107
+ kind: branch
108
+ cases:
109
+ - when: true
110
+ flags: { dc: 'has(params.difficulty) ? params.difficulty : -1' }
111
+ - id: check
112
+ kind: roll
113
+ tags: [hacking, skill-check, skill.program, attr.int]
114
+ bands: check
115
+ parts:
116
+ - { dice: 2d6kh2, tags: [skill-dice] }
117
+ - field: "'attributes.int.mod'"
118
+ - field: "'skills.program.level'"
119
+ - { value: item.checkMod, when: item.checkMod != 0 }
120
+ - { value: -2, when: params.wireless }
121
+ - { value: -1, when: params.crown }
122
+ - { value: params.modifier, when: has(params.modifier) }
123
+ - id: pay
124
+ kind: changes
125
+ when: item.accessCost > 0
126
+ changes:
127
+ - { type: adjust, field: hacking.access.spent, by: item.accessCost }
128
+ - id: result
129
+ kind: outcome
130
+ result: "flags.dc < 0 ? 'rolled' : steps.check.band"
131
+ data: { total: steps.check.total }