@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,207 @@
1
+ # The optional magic rules: mages (Spellcaster), summoners (Summoner) and the Graced. Each
2
+ # cybernetic system lowers a mage's or summoner's Effort, and a Graced's art points, by its
3
+ # System Strain, at least one point each.
4
+ contentTypes:
5
+ # A spell the mage knows. Prepared spells can be cast.
6
+ spell:
7
+ fields:
8
+ # How long casting Commits Effort: for the day, the scene, either (the caster picks), or no
9
+ # Effort at all.
10
+ effort: { type: enum, values: [day, scene, either, none], required: true }
11
+ duration:
12
+ type: enum
13
+ open: true
14
+ values: [instant, scene, concentration, rounds]
15
+ required: true
16
+ state:
17
+ prepared: { type: boolean, default: false }
18
+ actions:
19
+ - use: cast-spell
20
+
21
+ # A Graced art, bought with art points.
22
+ art:
23
+ fields:
24
+ cost: { type: integer, required: true, min: 1 }
25
+
26
+ # A spirit the summoner has called: its manifestation, how it was summoned and its powers.
27
+ spirit:
28
+ nameFrom: label
29
+ fields:
30
+ # The powers of a spirit without the core spirit's `powers` choice (a homebrew spirit's).
31
+ powerCount: { type: integer, default: 0, min: 0 }
32
+ state:
33
+ label: { type: string, default: '' }
34
+ form:
35
+ type: enum
36
+ values: [spirit-1, spirit-2, spirit-3, physical-1, physical-2, physical-3]
37
+ default: spirit-1
38
+ ritual: { type: boolean, default: true }
39
+ computed:
40
+ # The Effort a summoning Commits for the day: one per power, less one for a ritual
41
+ # summoning, less the Summon skill, at least 1.
42
+ cost:
43
+ type: integer
44
+ formula: >-
45
+ max(1, (item.id == @spirits.spirit ? size(picksOf('powers')) : item.powerCount)
46
+ - (self.ritual ? 1 : 0) - max(0, skills.summon.level))
47
+ actions:
48
+ - use: summon-spirit
49
+
50
+ # A spirit power: each adds one point to a spirit's cost.
51
+ spiritPower:
52
+ grantOnly: true
53
+ copies: { max: 0 }
54
+ fields:
55
+ minLevel: { type: integer, default: 1, min: 1 }
56
+ physicalOnly: { type: boolean, default: false }
57
+
58
+ fields:
59
+ magic.mage: { type: boolean, formula: 'false' }
60
+ magic.summoner: { type: boolean, formula: 'false' }
61
+ magic.graced: { type: boolean, formula: 'false' }
62
+ # Each implanted system costs its System Strain, at least one point.
63
+ magic.cyberPenalty:
64
+ type: integer
65
+ formula: "ceil(sumCopies(max(1, copy.fields.strain), copy.type == 'cyberware'))"
66
+
67
+ # Mage Effort: the better of Int or Wis plus Cast, at least 1. Committed Effort is tracked by
68
+ # how long it is Committed.
69
+ effort.mage.max:
70
+ type: integer
71
+ formula: >-
72
+ magic.mage ? max(1, max(attributes.int.mod, attributes.wis.mod) + skills.cast.level
73
+ - magic.cyberPenalty) : 0
74
+ effort.mage.scene: { type: integer, input: true, default: 0, min: 0 }
75
+ effort.mage.day: { type: integer, input: true, default: 0, min: 0 }
76
+ effort.mage.current:
77
+ type: integer
78
+ formula: max(0, effort.mage.max - effort.mage.scene - effort.mage.day)
79
+ # Spells a mage can have prepared: half their level, rounded up, plus Cast.
80
+ spells.preparedMax:
81
+ type: integer
82
+ formula: 'magic.mage ? max(0, ceil(level / 2) + skills.cast.level) : 0'
83
+ spells.prepared:
84
+ type: integer
85
+ formula: "countCopies(copy.type == 'spell' && copy.state.prepared)"
86
+ limits: { max: spells.preparedMax }
87
+
88
+ # Summoner Effort: the better of Con or Cha plus Summon, at least 1.
89
+ effort.summoner.max:
90
+ type: integer
91
+ formula: >-
92
+ magic.summoner ? max(1, max(attributes.con.mod, attributes.cha.mod) + skills.summon.level
93
+ - magic.cyberPenalty) : 0
94
+ effort.summoner.scene: { type: integer, input: true, default: 0, min: 0 }
95
+ effort.summoner.day: { type: integer, input: true, default: 0, min: 0 }
96
+ effort.summoner.current:
97
+ type: integer
98
+ formula: max(0, effort.summoner.max - effort.summoner.scene - effort.summoner.day)
99
+
100
+ # Graced art points: 2 at 1st level and more as the character rises, less the cyber penalty.
101
+ arts.points:
102
+ type: integer
103
+ formula: >-
104
+ magic.graced ? max(0, [2, 3, 4, 6, 6, 7, 7, 9, 10, 11][level - 1]
105
+ - (countCopies(copy.type == 'cyberware') > 0 ? magic.cyberPenalty : 0)) : 0
106
+ arts.spent:
107
+ type: integer
108
+ formula: "sumCopies(copy.fields.cost, copy.type == 'art')"
109
+ limits: { max: arts.points }
110
+ # Martial Instinct's bonus combat rolls: as many as the highest combat skill, at least one,
111
+ # refreshed by a night's rest.
112
+ arts.bonusRolls.max: { type: integer, formula: 0 }
113
+ arts.bonusRolls.used:
114
+ { type: integer, input: true, default: 0, min: 0, max: 'max(0, arts.bonusRolls.max)' }
115
+
116
+ situational:
117
+ # One of Martial Instinct's bonus rolls, spent on the attack's hit or damage roll.
118
+ - id: bonusRoll
119
+ type: enum
120
+ values: [none, hit, damage]
121
+ default: none
122
+ rolls: [attack, damage]
123
+ # The save resists a spell or magical effect (Occult Pavis).
124
+ - id: versusMagic
125
+ type: boolean
126
+ default: false
127
+ rolls: [save]
128
+
129
+ resultBands:
130
+ overcast:
131
+ - { id: death, when: roll.total <= 1 }
132
+ - { id: mortal, when: roll.total <= 4 }
133
+ - { id: unconscious, when: roll.total <= 8 }
134
+ - { id: stunned, when: roll.total <= 15 }
135
+ - { id: dazed, when: roll.total <= 19 }
136
+ - { id: strained, when: true }
137
+
138
+ actions:
139
+ # Cast a prepared spell: Commit its Effort, or overcast it for none and roll on the overcasting
140
+ # table (d20 + Cast + Con, -2 for a day spell) for its System Strain and worse.
141
+ - id: cast-spell
142
+ tags: [magic, spell]
143
+ available: magic.mage && self.prepared
144
+ params:
145
+ # For spells Committing for the scene or the day.
146
+ commit: { type: enum, values: [scene, day], optional: true }
147
+ overcast: { type: boolean, default: false }
148
+ results: [cast, overcast]
149
+ steps:
150
+ - id: start
151
+ kind: branch
152
+ cases:
153
+ - when: true
154
+ flags:
155
+ commit: >-
156
+ item.effort == 'either' ? (has(params.commit) ? params.commit : 'scene')
157
+ : item.effort
158
+ - id: effort
159
+ kind: changes
160
+ when: "!params.overcast && flags.commit != 'none'"
161
+ changes:
162
+ - { type: adjust, when: "flags.commit == 'scene'", field: effort.mage.scene, by: 1 }
163
+ - { type: adjust, when: "flags.commit == 'day'", field: effort.mage.day, by: 1 }
164
+ - id: overcasting
165
+ kind: roll
166
+ when: params.overcast
167
+ tags: [overcast]
168
+ bands: overcast
169
+ parts:
170
+ - dice: 1d20
171
+ - field: "'skills.cast.level'"
172
+ - field: "'attributes.con.mod'"
173
+ - { value: -2, when: "flags.commit == 'day'" }
174
+ - id: strain
175
+ kind: changes
176
+ when: params.overcast
177
+ changes:
178
+ - type: adjust
179
+ when: "!(steps.overcasting.band in ['death', 'mortal'])"
180
+ field: strain.temporary
181
+ by: "steps.overcasting.band == 'unconscious' ? 4 : steps.overcasting.band == 'stunned' ? 2 : 1"
182
+ - type: set
183
+ when: steps.overcasting.band == 'mortal'
184
+ field: hp.current
185
+ value: 0
186
+ - id: result
187
+ kind: outcome
188
+ result: "params.overcast ? 'overcast' : 'cast'"
189
+ data:
190
+ consequence: "params.overcast ? steps.overcasting.band : 'none'"
191
+
192
+ # Summon a spirit: Commit Summoner Effort for the day, its cost.
193
+ - id: summon-spirit
194
+ tags: [magic, summoning]
195
+ available: magic.summoner
196
+ params:
197
+ # Immediate summonings already made this scene, each adding one point.
198
+ earlier: { type: integer, default: 0, min: 0 }
199
+ results: [summoned]
200
+ steps:
201
+ - id: commit
202
+ kind: changes
203
+ changes:
204
+ - type: adjust
205
+ field: effort.summoner.day
206
+ by: 'self.cost + (self.ritual ? 0 : params.earlier)'
207
+ - { id: result, kind: outcome, result: "'summoned'" }
@@ -0,0 +1,61 @@
1
+ families:
2
+ skill:
3
+ [
4
+ administer,
5
+ connect,
6
+ drive,
7
+ exert,
8
+ fix,
9
+ heal,
10
+ know,
11
+ lead,
12
+ notice,
13
+ perform,
14
+ program,
15
+ punch,
16
+ shoot,
17
+ sneak,
18
+ stab,
19
+ survive,
20
+ talk,
21
+ trade,
22
+ work,
23
+ cast,
24
+ summon,
25
+ ]
26
+
27
+ fields:
28
+ # The level the character has trained, -1 for no skill at all, up to level-4. Creation and
29
+ # advancement raise it; nothing else does.
30
+ 'skills.{skill}.base':
31
+ type: integer
32
+ input: true
33
+ default: -1
34
+ min: -1
35
+ max: 4
36
+ tags: [skill-base, 'skill.{skill}']
37
+ # Skill points banked toward the skill's next level: a Focus's bonus skill taken during
38
+ # advancement counts as three points, and what doesn't buy a level stays here.
39
+ 'skills.{skill}.credit': { type: integer, input: true, default: 0, min: 0, max: 4 }
40
+ # The level checks use: the trained level, or a skillplug's if that is higher.
41
+ 'skills.{skill}.level':
42
+ { type: integer, formula: 'skills.{skill}.base', tags: [skill, 'skill.{skill}'] }
43
+
44
+ # Work names a profession.
45
+ skills.work.profession: { type: string, input: true, default: '' }
46
+
47
+ # Names for a skill's level, for showing it ("Level-1", or "No skill" for -1).
48
+ resultBands:
49
+ skill-level:
50
+ - { id: untrained, when: roll.total < 0 }
51
+ - { id: level-0, when: roll.total == 0 }
52
+ - { id: level-1, when: roll.total == 1 }
53
+ - { id: level-2, when: roll.total == 2 }
54
+ - { id: level-3, when: roll.total == 3 }
55
+ - { id: level-4, when: true }
56
+
57
+ constraints:
58
+ # No character begins play with a skill above level-1.
59
+ - id: creation-skill-cap
60
+ check: >-
61
+ !character.creating || maxList(keysOf('skill'), fieldOf('skills.{skill}.base', x)) <= 1
@@ -0,0 +1,137 @@
1
+ tags:
2
+ # Fields
3
+ - attribute
4
+ - attribute-base
5
+ - attribute-score-mod
6
+ - attribute-mod
7
+ - attribute-mod-bonus
8
+ - attribute-mod-cap
9
+ - attr.str
10
+ - attr.dex
11
+ - attr.con
12
+ - attr.int
13
+ - attr.wis
14
+ - attr.cha
15
+ - skill-base
16
+ - skill.administer
17
+ - skill.connect
18
+ - skill.drive
19
+ - skill.exert
20
+ - skill.fix
21
+ - skill.heal
22
+ - skill.know
23
+ - skill.lead
24
+ - skill.notice
25
+ - skill.perform
26
+ - skill.program
27
+ - skill.punch
28
+ - skill.shoot
29
+ - skill.sneak
30
+ - skill.stab
31
+ - skill.survive
32
+ - skill.talk
33
+ - skill.trade
34
+ - skill.work
35
+ - skill.cast
36
+ - skill.summon
37
+ - save.physical
38
+ - save.evasion
39
+ - save.mental
40
+ - save.luck
41
+
42
+ # Rolls and steps
43
+ - check
44
+ - skill-check
45
+ - skill-dice
46
+ - attack.melee
47
+ - attack.ranged
48
+ - attack.attribute
49
+ - attack.skill
50
+ - attack.burst
51
+ - damage.melee
52
+ - damage.ranged
53
+ - damage.attribute
54
+ - damage.burst
55
+ - damage.punch
56
+ - damage.skill
57
+ - trauma
58
+ - initiative
59
+ - hit-points
60
+ - healing
61
+ - first-aid
62
+ - major-injury
63
+ - overcast
64
+ - creation
65
+ # Steps an add-on pack's rules effects reach.
66
+ - creation.item
67
+ - creation.gear
68
+ - creation.finish
69
+ - building
70
+ - advancement
71
+ - advancement.level
72
+ - skill-pick
73
+ - focus-pick
74
+ - edge-pick
75
+ - reload
76
+ - drug
77
+ - cyber
78
+ - hacking
79
+ - magic
80
+ - spell
81
+ - summoning
82
+ - rest
83
+ - rest.night
84
+ - rest.scene
85
+ - injury
86
+ - armor.heavy
87
+
88
+ # Incoming damage
89
+ - damage.weapon
90
+ - damage.nonlethal
91
+ - damage.traumatic
92
+ - damage.cyberspace
93
+ - damage.direct
94
+
95
+ # Content
96
+ - standard
97
+ - repeatable
98
+ - asks-attribute
99
+ - brings-cyber
100
+ - bars-cyber
101
+ - not-underdog
102
+ - retroactive-points
103
+ - restricted
104
+ - worn
105
+ - vr-crown
106
+ - firearm
107
+ - melee
108
+ - unarmed
109
+ - thrown
110
+ - grenade
111
+ - heavy
112
+ - implant
113
+ - burst
114
+ - suppress
115
+ - braced
116
+ - quick-reload
117
+ - two-handed
118
+ - nonlethal
119
+ - anti-vehicle
120
+ - launcher
121
+ - indirect
122
+ - trap
123
+ - special
124
+ - vehicle-mounted
125
+ - body-blades
126
+ - blade
127
+ - cranial-jack
128
+ - gunlink
129
+ - cybereyes
130
+ - cyberears
131
+ - dermal-armor
132
+ - self-terminating
133
+ - portable
134
+ - flying
135
+ - armored
136
+ - armored-heavy
137
+ - alacrity
@@ -0,0 +1,30 @@
1
+ contentTypes:
2
+ # Vehicles. Fittings and mods are templates that add to the copy's fields; fittings use Power
3
+ # and Mass, and the vehicle must have enough of both.
4
+ vehicle:
5
+ carried: true
6
+ fields:
7
+ cost: { type: integer, default: 0, min: 0 }
8
+ speed: { type: integer, required: true }
9
+ # Armor rating, subtracted from damage. Vehicles tagged `armored` are immune to weapons
10
+ # short of heavy ones or those that can make Traumatic Hits on vehicles.
11
+ armor: { type: integer, default: 0, min: 0 }
12
+ traumaTarget: { type: integer, required: true }
13
+ ac: { type: integer, required: true }
14
+ hp: { type: integer, required: true, min: 1 }
15
+ crew: { type: integer, required: true, min: 1 }
16
+ power: { type: integer, required: true, min: 0 }
17
+ mass: { type: integer, required: true, min: 0 }
18
+ powerUsed: { type: integer, default: 0, min: 0 }
19
+ massUsed: { type: integer, default: 0, min: 0 }
20
+ size: { type: enum, values: [small, medium, large], required: true }
21
+ hardpoints: { type: integer, default: 0, min: 0 }
22
+ state:
23
+ hp: { type: integer, default: item.hp, min: 0, max: item.hp }
24
+ # Bought with an Ace Driver's or Roamer's gear budget.
25
+ focusGear: { type: boolean, default: false }
26
+
27
+ constraints:
28
+ - id: vehicle-power-mass
29
+ copies: { type: vehicle }
30
+ check: item.powerUsed <= item.power && item.massUsed <= item.mass
@@ -0,0 +1,253 @@
1
+ contentTypes:
2
+ # Weapons. A Readied weapon is `equipped`. Firearms track the rounds left in the magazine.
3
+ weapon:
4
+ carried: true
5
+ equippable: true
6
+ fields:
7
+ cost: { type: integer, default: 0, min: 0 }
8
+ enc: { type: integer, min: 0 }
9
+ damage: { type: dice, required: true }
10
+ # The combat skill: `shoot`, `stab` or `punch`. Thrown weapons may also use Exert or Stab.
11
+ skill: { type: enum, values: [shoot, stab, punch], required: true, open: true }
12
+ # The attribute that modifies hit and damage: the better of two where two are listed.
13
+ attribute: { type: enum, values: [str, dex, str-dex, wis, none], required: true }
14
+ rangeNormal: { type: integer, min: 0 }
15
+ rangeLong: { type: integer, min: 0 }
16
+ magazine: { type: integer, min: 1 }
17
+ # Shock: damage on a miss against a target whose Melee AC is at most `shockAc` (any AC when
18
+ # it has none).
19
+ shockDamage: { type: integer, min: 0 }
20
+ shockAc: { type: integer, min: 0 }
21
+ traumaDie: { type: dice }
22
+ traumaRating: { type: integer, min: 1 }
23
+ # Bonuses mods add.
24
+ attackBonus: { type: integer, default: 0 }
25
+ damageBonus: { type: integer, default: 0 }
26
+ shockBonus: { type: integer, default: 0 }
27
+ traumaDieBonus: { type: integer, default: 0 }
28
+ state:
29
+ loaded:
30
+ type: integer
31
+ default: 'has(item.magazine) ? item.magazine : 0'
32
+ min: 0
33
+ max: 'has(item.magazine) ? item.magazine : 0'
34
+ actions:
35
+ - use: attack
36
+ - use: reload
37
+
38
+ # The unarmed attack every character has.
39
+ standardCopies:
40
+ - { type: weapon, where: "'standard' in item.tags" }
41
+
42
+ fields:
43
+ # The highest Melee AC melee Shock treats a target as having: Armsmaster 2, Close Combatant 2
44
+ # and Shocking Assault treat every target as AC 10.
45
+ combat.shockAc: { type: integer, formula: '99' }
46
+ # A bonus to melee and unarmed Shock (Shocking Assault 2).
47
+ combat.shockBonus: { type: integer, formula: '0' }
48
+ # A combat skill added to damage: Stab to melee and thrown weapons and their Shock
49
+ # (Armsmaster), Shoot to ranged weapons (Deadeye). A thrown weapon takes the better one.
50
+ combat.meleeSkillDamage: { type: integer, formula: '0' }
51
+ combat.rangedSkillDamage: { type: integer, formula: '0' }
52
+ # A bonus to hit with melee and thrown weapons, not unarmed attacks (Armsmaster 2).
53
+ combat.meleeHitBonus: { type: integer, formula: '0' }
54
+
55
+ resultBands:
56
+ hit:
57
+ - { id: hit, when: roll.total >= flags.ac, success: true }
58
+ - { id: miss, when: true }
59
+ trauma:
60
+ - { id: traumatic, when: roll.total >= flags.traumaTarget }
61
+ - { id: none, when: true }
62
+
63
+ actions:
64
+ # Attack with a weapon: 1d20 + attack bonus + the attribute modifier + the combat skill (-2
65
+ # with no skill) against the target's Ranged or Melee AC. A hit rolls damage and the Trauma
66
+ # Die; a Traumatic Hit multiplies the damage by the Trauma Rating. A melee miss may still deal
67
+ # Shock. Burst fire spends three rounds for +2 to hit and damage.
68
+ - id: attack
69
+ tags: [attack]
70
+ available: >-
71
+ (self.equipped || 'standard' in item.tags || 'implant' in item.tags)
72
+ && !('trap' in item.tags) && (!has(item.magazine) || self.loaded >= 1)
73
+ params:
74
+ attribute: { type: enum, values: [str, dex, wis], optional: true }
75
+ thrown: { type: boolean, default: false }
76
+ burst: { type: boolean, default: false }
77
+ lethal: { type: boolean, optional: true }
78
+ targetAc: { type: integer, optional: true }
79
+ targetTrauma: { type: integer, optional: true }
80
+ modifier: { type: integer, optional: true }
81
+ participants:
82
+ target:
83
+ max: 1
84
+ fields:
85
+ ac.ranged: { type: integer }
86
+ ac.melee: { type: integer }
87
+ trauma.target: { type: integer, default: 6 }
88
+ results: [hit, miss, rolled]
89
+ steps:
90
+ - id: start
91
+ kind: branch
92
+ cases:
93
+ - when: true
94
+ flags:
95
+ ranged: >-
96
+ has(item.rangeNormal) && (!('melee' in item.tags) || params.thrown)
97
+ thrown: >-
98
+ 'thrown' in item.tags
99
+ || (params.thrown && has(item.rangeNormal) && 'melee' in item.tags)
100
+ attributes: >-
101
+ item.attribute == 'str-dex' ? ['str', 'dex']
102
+ : item.attribute == 'none' ? [] : [item.attribute]
103
+ burst: params.burst && 'burst' in item.tags && self.loaded >= 3
104
+ nonlethal: "has(params.lethal) ? !params.lethal : 'nonlethal' in item.tags"
105
+ - id: pick
106
+ kind: branch
107
+ cases:
108
+ - when: true
109
+ flags:
110
+ attribute: >-
111
+ has(params.attribute) && params.attribute in flags.attributes ? params.attribute
112
+ : size(flags.attributes) == 0 ? ''
113
+ : sortList(flags.attributes, -fieldOf('attributes.{attribute}.mod', x))[0]
114
+ skill: >-
115
+ flags.thrown ? max(skills.shoot.level, skills.stab.level, skills.exert.level)
116
+ : fieldOf('skills.{skill}.level', item.skill)
117
+ ac: >-
118
+ 'grenade' in item.tags ? 10
119
+ : size(participants.target) > 0
120
+ ? (flags.ranged ? participants.target[0].ac.ranged
121
+ : participants.target[0].ac.melee)
122
+ : has(params.targetAc) ? params.targetAc : -1
123
+ meleeAc: >-
124
+ size(participants.target) > 0 ? participants.target[0].ac.melee
125
+ : has(params.targetAc) ? params.targetAc : -1
126
+ traumaTarget: >-
127
+ size(participants.target) > 0 ? participants.target[0].trauma.target
128
+ : has(params.targetTrauma) ? params.targetTrauma : 6
129
+ - id: mod
130
+ kind: branch
131
+ cases:
132
+ - when: true
133
+ flags:
134
+ attrMod: "flags.attribute == '' ? 0 : fieldOf('attributes.{attribute}.mod', flags.attribute)"
135
+ # Armsmaster and Deadeye: a skill's level to damage (and Armsmaster's to Shock).
136
+ skillDamage: >-
137
+ 'unarmed' in item.tags ? 0
138
+ : flags.thrown ? max(combat.meleeSkillDamage, combat.rangedSkillDamage)
139
+ : flags.ranged ? combat.rangedSkillDamage : combat.meleeSkillDamage
140
+ meleeHit: >-
141
+ !('unarmed' in item.tags) && (!flags.ranged || flags.thrown)
142
+ ? combat.meleeHitBonus : 0
143
+ - id: hit
144
+ kind: roll
145
+ tags:
146
+ - attack
147
+ - { formula: "flags.ranged ? 'attack.ranged' : 'attack.melee'" }
148
+ - { formula: "'skill.' + item.skill" }
149
+ bands: hit
150
+ parts:
151
+ - dice: 1d20
152
+ - field: "'combat.attackBonus'"
153
+ - { value: flags.attrMod, tags: [attack.attribute] }
154
+ - { value: 'flags.skill >= 0 ? flags.skill : -2', tags: [attack.skill] }
155
+ - { value: item.attackBonus, when: item.attackBonus != 0 }
156
+ - { value: flags.meleeHit, when: flags.meleeHit != 0 }
157
+ - { value: 2, when: flags.burst, tags: [attack.burst] }
158
+ - { value: params.modifier, when: has(params.modifier) }
159
+ - id: landed
160
+ kind: branch
161
+ cases:
162
+ - when: true
163
+ flags:
164
+ hit: flags.ac < 0 || steps.hit.band == 'hit'
165
+ shock: >-
166
+ has(item.shockDamage) && item.shockDamage > 0 && !flags.ranged
167
+ && (!has(item.shockAc) || flags.meleeAc < 0
168
+ || min(flags.meleeAc, combat.shockAc) <= item.shockAc)
169
+ ? max(0, item.shockDamage + flags.attrMod + item.shockBonus
170
+ + combat.shockBonus + combat.damageBonus + flags.skillDamage)
171
+ : 0
172
+ - id: damage
173
+ kind: roll
174
+ when: flags.hit
175
+ tags:
176
+ - damage
177
+ - { formula: "flags.ranged ? 'damage.ranged' : 'damage.melee'" }
178
+ - { formula: "'skill.' + item.skill" }
179
+ parts:
180
+ - dice: item.damage
181
+ - { value: flags.attrMod, tags: [damage.attribute] }
182
+ - { value: 2, when: flags.burst, tags: [damage.burst] }
183
+ - { value: item.damageBonus, when: item.damageBonus != 0 }
184
+ - { value: flags.skillDamage, when: flags.skillDamage != 0, tags: [damage.skill] }
185
+ - { field: "'combat.damageBonus'" }
186
+ - value: skills.punch.level
187
+ when: "'unarmed' in item.tags && skills.punch.level > 0"
188
+ tags: [damage.punch]
189
+ - id: trauma
190
+ kind: roll
191
+ when: flags.hit && has(item.traumaDie) && !flags.nonlethal
192
+ tags: [trauma]
193
+ bands: trauma
194
+ parts:
195
+ - dice: item.traumaDie
196
+ - { value: item.traumaDieBonus, when: item.traumaDieBonus != 0 }
197
+ - { field: "'combat.traumaBonus'" }
198
+ - id: total
199
+ kind: branch
200
+ cases:
201
+ - when: flags.hit
202
+ flags:
203
+ traumatic: has(steps.trauma) && steps.trauma.band == 'traumatic'
204
+ dealt: >-
205
+ max(0, max(steps.damage.total, flags.shock))
206
+ * (has(steps.trauma) && steps.trauma.band == 'traumatic' ? item.traumaRating : 1)
207
+ - when: true
208
+ flags: { traumatic: false, dealt: flags.shock }
209
+ # Martial Instinct: the bonus roll is spent once the roll it doubles is made.
210
+ - id: bonusRoll
211
+ kind: changes
212
+ when: >-
213
+ situational.bonusRoll != 'none' && arts.bonusRolls.used < arts.bonusRolls.max
214
+ && (situational.bonusRoll == 'hit' || flags.hit)
215
+ changes:
216
+ - { type: adjust, field: arts.bonusRolls.used, by: 1 }
217
+ - id: ammo
218
+ kind: changes
219
+ when: has(item.magazine)
220
+ changes:
221
+ - { type: adjustState, entry: self, key: loaded, by: 'flags.burst ? -3 : -1' }
222
+ - id: deal
223
+ kind: changes
224
+ when: flags.dealt > 0
225
+ to: target
226
+ changes:
227
+ - type: adjust
228
+ field: hp.current
229
+ by: -flags.dealt
230
+ tags:
231
+ - damage
232
+ - damage.weapon
233
+ - { formula: "flags.nonlethal ? ['damage.nonlethal'] : []" }
234
+ - { formula: "flags.traumatic ? ['damage.traumatic'] : []" }
235
+ - id: result
236
+ kind: outcome
237
+ result: "flags.ac < 0 ? 'rolled' : flags.hit ? 'hit' : 'miss'"
238
+ data:
239
+ damage: flags.dealt
240
+ traumatic: flags.traumatic
241
+ shock: flags.shock
242
+
243
+ # Reload a firearm: fill its magazine.
244
+ - id: reload
245
+ tags: [reload]
246
+ available: has(item.magazine) && self.loaded < item.magazine
247
+ results: [reloaded]
248
+ steps:
249
+ - id: fill
250
+ kind: changes
251
+ changes:
252
+ - { type: setState, entry: self, key: loaded, value: item.magazine }
253
+ - { id: result, kind: outcome, result: "'reloaded'" }