@opencharacter/swn-revised 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +147 -0
- package/README.md +128 -2
- package/content/armor/armored-undersuit.yaml +8 -0
- package/content/armor/armored-vacc-suit.yaml +8 -0
- package/content/armor/assault-suit.yaml +8 -0
- package/content/armor/combat-field-uniform.yaml +8 -0
- package/content/armor/deflector-array.yaml +8 -0
- package/content/armor/field-emitter-panoply.yaml +9 -0
- package/content/armor/force-pavis.yaml +9 -0
- package/content/armor/heavy-primitive-armor.yaml +8 -0
- package/content/armor/icarus-harness.yaml +8 -0
- package/content/armor/light-primitive-armor.yaml +8 -0
- package/content/armor/medium-primitive-armor.yaml +8 -0
- package/content/armor/secure-clothing.yaml +8 -0
- package/content/armor/security-armor.yaml +8 -0
- package/content/armor/shield.yaml +9 -0
- package/content/armor/storm-armor.yaml +9 -0
- package/content/armor/vestimentum.yaml +8 -0
- package/content/armor/warpaint.yaml +8 -0
- package/content/armor/woven-body-armor.yaml +8 -0
- package/content/backgrounds/barbarian.yaml +20 -0
- package/content/backgrounds/clergy.yaml +20 -0
- package/content/backgrounds/courtesan.yaml +20 -0
- package/content/backgrounds/criminal.yaml +20 -0
- package/content/backgrounds/dilettante.yaml +20 -0
- package/content/backgrounds/entertainer.yaml +20 -0
- package/content/backgrounds/merchant.yaml +20 -0
- package/content/backgrounds/noble.yaml +20 -0
- package/content/backgrounds/official.yaml +20 -0
- package/content/backgrounds/peasant.yaml +20 -0
- package/content/backgrounds/physician.yaml +20 -0
- package/content/backgrounds/pilot.yaml +20 -0
- package/content/backgrounds/politician.yaml +20 -0
- package/content/backgrounds/scholar.yaml +20 -0
- package/content/backgrounds/soldier.yaml +20 -0
- package/content/backgrounds/spacer.yaml +20 -0
- package/content/backgrounds/technician.yaml +20 -0
- package/content/backgrounds/thug.yaml +20 -0
- package/content/backgrounds/vagabond.yaml +20 -0
- package/content/backgrounds/worker.yaml +20 -0
- package/content/classes/adventurer.yaml +7 -0
- package/content/classes/expert.yaml +14 -0
- package/content/classes/psychic.yaml +11 -0
- package/content/classes/warrior.yaml +27 -0
- package/content/cyberware/adrenal-suppression-pump.yaml +17 -0
- package/content/cyberware/bioadaptation-augments.yaml +6 -0
- package/content/cyberware/body-arsenal-array.yaml +6 -0
- package/content/cyberware/body-sculpting.yaml +6 -0
- package/content/cyberware/dermal-armor.yaml +8 -0
- package/content/cyberware/drone-control-link.yaml +6 -0
- package/content/cyberware/eelskin-capacitor-mesh.yaml +7 -0
- package/content/cyberware/gecko-anchors.yaml +6 -0
- package/content/cyberware/ghost-talker-transceiver.yaml +6 -0
- package/content/cyberware/holdout-cavity.yaml +6 -0
- package/content/cyberware/holoskin-emitters.yaml +6 -0
- package/content/cyberware/identity-submersion-trigger.yaml +6 -0
- package/content/cyberware/immunofiltration-system.yaml +6 -0
- package/content/cyberware/induced-coma-trigger.yaml +6 -0
- package/content/cyberware/neurointruder-alert.yaml +11 -0
- package/content/cyberware/panspectral-optics.yaml +6 -0
- package/content/cyberware/pressure-sheathing.yaml +6 -0
- package/content/cyberware/prosthetic-limb.yaml +6 -0
- package/content/cyberware/revenant-wiring.yaml +6 -0
- package/content/cyberware/slowtime-window.yaml +7 -0
- package/content/cyberware/stabilization-overrides.yaml +8 -0
- package/content/cyberware/tagger-nanites.yaml +7 -0
- package/content/cyberware/toxin-injector.yaml +7 -0
- package/content/cyberware/twitchlock-actuators.yaml +7 -0
- package/content/foci/alert.yaml +9 -0
- package/content/foci/armsman.yaml +9 -0
- package/content/foci/assassin.yaml +5 -0
- package/content/foci/authority.yaml +5 -0
- package/content/foci/close-combatant.yaml +7 -0
- package/content/foci/connected.yaml +5 -0
- package/content/foci/die-hard.yaml +7 -0
- package/content/foci/diplomat.yaml +10 -0
- package/content/foci/gunslinger.yaml +8 -0
- package/content/foci/hacker.yaml +10 -0
- package/content/foci/healer.yaml +7 -0
- package/content/foci/henchkeeper.yaml +7 -0
- package/content/foci/ironhide.yaml +7 -0
- package/content/foci/psychic-training.yaml +18 -0
- package/content/foci/savage-fray.yaml +5 -0
- package/content/foci/shocking-assault.yaml +8 -0
- package/content/foci/sniper.yaml +10 -0
- package/content/foci/specialist.yaml +36 -0
- package/content/foci/star-captain.yaml +5 -0
- package/content/foci/starfarer.yaml +5 -0
- package/content/foci/tinker.yaml +5 -0
- package/content/foci/unarmed-combatant.yaml +11 -0
- package/content/foci/unique-gift.yaml +6 -0
- package/content/foci/wanderer.yaml +5 -0
- package/content/foci/wild-psychic-talent.yaml +20 -0
- package/content/gear/ammo-20-rounds.yaml +9 -0
- package/content/gear/ammo-missile.yaml +8 -0
- package/content/gear/atmofilter.yaml +7 -0
- package/content/gear/backpack-tl0.yaml +7 -0
- package/content/gear/backpack-tl4.yaml +7 -0
- package/content/gear/bezoar.yaml +9 -0
- package/content/gear/binoculars-tl3.yaml +7 -0
- package/content/gear/binoculars-tl4.yaml +7 -0
- package/content/gear/bioscanner.yaml +7 -0
- package/content/gear/black-slab.yaml +7 -0
- package/content/gear/brainwave.yaml +8 -0
- package/content/gear/climbing-harness.yaml +7 -0
- package/content/gear/comm-server.yaml +7 -0
- package/content/gear/compad.yaml +7 -0
- package/content/gear/data-phase-tap.yaml +7 -0
- package/content/gear/data-protocol.yaml +7 -0
- package/content/gear/dataslab.yaml +7 -0
- package/content/gear/field-radio.yaml +7 -0
- package/content/gear/glowbug.yaml +7 -0
- package/content/gear/grapnel-launcher.yaml +7 -0
- package/content/gear/grav-chute-tl4.yaml +7 -0
- package/content/gear/grav-chute-tl5.yaml +7 -0
- package/content/gear/grav-harness.yaml +7 -0
- package/content/gear/hush.yaml +8 -0
- package/content/gear/instapanel.yaml +8 -0
- package/content/gear/lazarus-patch.yaml +8 -0
- package/content/gear/lift.yaml +11 -0
- package/content/gear/line-shunt.yaml +7 -0
- package/content/gear/low-light-goggles.yaml +7 -0
- package/content/gear/medkit.yaml +7 -0
- package/content/gear/metatool.yaml +7 -0
- package/content/gear/navcomp.yaml +7 -0
- package/content/gear/portabox.yaml +7 -0
- package/content/gear/postech-toolkit.yaml +7 -0
- package/content/gear/power-cell-a.yaml +9 -0
- package/content/gear/power-cell-b.yaml +8 -0
- package/content/gear/pressure-tent.yaml +7 -0
- package/content/gear/pretech-cosmetic.yaml +9 -0
- package/content/gear/pretech-toolkit.yaml +7 -0
- package/content/gear/psych.yaml +8 -0
- package/content/gear/rations-1-day.yaml +8 -0
- package/content/gear/remote-link-unit.yaml +7 -0
- package/content/gear/reverie.yaml +9 -0
- package/content/gear/rope-tl0.yaml +7 -0
- package/content/gear/rope-tl4.yaml +7 -0
- package/content/gear/scout-report.yaml +7 -0
- package/content/gear/solar-recharger.yaml +7 -0
- package/content/gear/spare-parts.yaml +8 -0
- package/content/gear/squeal.yaml +8 -0
- package/content/gear/stiletto-charge.yaml +6 -0
- package/content/gear/storage-unit.yaml +7 -0
- package/content/gear/survey-scanner.yaml +7 -0
- package/content/gear/survival-kit.yaml +7 -0
- package/content/gear/tailored-antiallergens.yaml +7 -0
- package/content/gear/telekinetic-generator.yaml +7 -0
- package/content/gear/telescoping-pole.yaml +7 -0
- package/content/gear/thermal-flare.yaml +7 -0
- package/content/gear/tightbeam-link-unit.yaml +7 -0
- package/content/gear/trade-goods.yaml +8 -0
- package/content/gear/trade-metals.yaml +8 -0
- package/content/gear/translator-torc.yaml +7 -0
- package/content/gear/tsunami.yaml +9 -0
- package/content/gear/vacc-fresher.yaml +7 -0
- package/content/gear/vacc-skin.yaml +7 -0
- package/content/gear/vacc-suit.yaml +7 -0
- package/content/partial-classes/expert.yaml +5 -0
- package/content/partial-classes/psychic.yaml +18 -0
- package/content/partial-classes/warrior.yaml +7 -0
- package/content/techniques/accelerated-succor.yaml +10 -0
- package/content/techniques/alternate-outcome.yaml +10 -0
- package/content/techniques/anguished-vision.yaml +10 -0
- package/content/techniques/burdened-apportation.yaml +10 -0
- package/content/techniques/cloak-powers.yaml +10 -0
- package/content/techniques/concert-of-minds.yaml +10 -0
- package/content/techniques/cursed-luck.yaml +59 -0
- package/content/techniques/deep-intrusion.yaml +10 -0
- package/content/techniques/destinys-shield.yaml +10 -0
- package/content/techniques/effortless-apportation.yaml +10 -0
- package/content/techniques/facile-mind.yaml +10 -0
- package/content/techniques/far-thought.yaml +10 -0
- package/content/techniques/flawless-mastery.yaml +10 -0
- package/content/techniques/force-puppetry.yaml +10 -0
- package/content/techniques/forced-outcome.yaml +10 -0
- package/content/techniques/holistic-optimization-patterning.yaml +10 -0
- package/content/techniques/impact-sump.yaml +10 -0
- package/content/techniques/impervious-pavis-of-will.yaml +10 -0
- package/content/techniques/intuitive-response.yaml +10 -0
- package/content/techniques/invincible-stand.yaml +10 -0
- package/content/techniques/kinetic-transversal.yaml +10 -0
- package/content/techniques/major-organ-restoration.yaml +10 -0
- package/content/techniques/mastered-succor.yaml +10 -0
- package/content/techniques/memory-editing.yaml +10 -0
- package/content/techniques/metadimensional-friction.yaml +10 -0
- package/content/techniques/metamorph.yaml +10 -0
- package/content/techniques/mindtracing.yaml +10 -0
- package/content/techniques/neural-trap.yaml +10 -0
- package/content/techniques/not-my-time.yaml +10 -0
- package/content/techniques/offensive-apportation.yaml +10 -0
- package/content/techniques/oracle.yaml +6 -0
- package/content/techniques/organic-purification-protocols.yaml +10 -0
- package/content/techniques/perceptive-dislocation.yaml +10 -0
- package/content/techniques/personal-apportation.yaml +6 -0
- package/content/techniques/pressure-field.yaml +10 -0
- package/content/techniques/proficient-apportation.yaml +10 -0
- package/content/techniques/prophecy.yaml +10 -0
- package/content/techniques/psychic-refinement.yaml +11 -0
- package/content/techniques/psychic-static.yaml +10 -0
- package/content/techniques/psychic-succor.yaml +39 -0
- package/content/techniques/psychic-tutelage.yaml +10 -0
- package/content/techniques/quintessential-reconstruction.yaml +10 -0
- package/content/techniques/reactive-telekinesis.yaml +10 -0
- package/content/techniques/reflex-response.yaml +10 -0
- package/content/techniques/remote-repair.yaml +10 -0
- package/content/techniques/rift-reduplication.yaml +10 -0
- package/content/techniques/sense-the-need.yaml +10 -0
- package/content/techniques/slip-field.yaml +10 -0
- package/content/techniques/spatial-awareness.yaml +10 -0
- package/content/techniques/spatial-synchrony-mandala.yaml +10 -0
- package/content/techniques/stutterjump.yaml +10 -0
- package/content/techniques/suppress-cognition.yaml +10 -0
- package/content/techniques/surge-momentum.yaml +10 -0
- package/content/techniques/suspended-manifestation.yaml +10 -0
- package/content/techniques/synthetic-adaptation.yaml +10 -0
- package/content/techniques/tangible-force-construct.yaml +10 -0
- package/content/techniques/telekinetic-armory.yaml +10 -0
- package/content/techniques/telekinetic-expertise.yaml +10 -0
- package/content/techniques/telekinetic-flight.yaml +10 -0
- package/content/techniques/telekinetic-manipulation.yaml +6 -0
- package/content/techniques/telekinetic-ram.yaml +10 -0
- package/content/techniques/telepathic-assault.yaml +10 -0
- package/content/techniques/telepathic-contact.yaml +6 -0
- package/content/techniques/teratic-overload.yaml +10 -0
- package/content/techniques/terminal-reflection.yaml +10 -0
- package/content/techniques/thermokinesis.yaml +10 -0
- package/content/techniques/tissue-integrity-field.yaml +10 -0
- package/content/techniques/transmit-thought.yaml +10 -0
- package/content/techniques/unity-of-thought.yaml +10 -0
- package/content/templates/trained-unarmed.yaml +9 -0
- package/content/weapons/advanced-bow.yaml +15 -0
- package/content/weapons/anti-vehicle-laser.yaml +18 -0
- package/content/weapons/combat-rifle.yaml +18 -0
- package/content/weapons/combat-shotgun.yaml +18 -0
- package/content/weapons/conversion-bow.yaml +15 -0
- package/content/weapons/crude-pistol.yaml +18 -0
- package/content/weapons/demo-charge.yaml +13 -0
- package/content/weapons/distortion-cannon.yaml +18 -0
- package/content/weapons/grenade.yaml +14 -0
- package/content/weapons/heavy-machine-gun.yaml +19 -0
- package/content/weapons/hydra-array.yaml +18 -0
- package/content/weapons/knife.yaml +7 -0
- package/content/weapons/large-advanced-weapon.yaml +13 -0
- package/content/weapons/large-primitive-weapon.yaml +12 -0
- package/content/weapons/laser-pistol.yaml +18 -0
- package/content/weapons/laser-rifle.yaml +19 -0
- package/content/weapons/mag-pistol.yaml +17 -0
- package/content/weapons/mag-rifle.yaml +17 -0
- package/content/weapons/medium-advanced-weapon.yaml +13 -0
- package/content/weapons/medium-primitive-weapon.yaml +12 -0
- package/content/weapons/monoblade-knife.yaml +7 -0
- package/content/weapons/monoblade-sword.yaml +4 -0
- package/content/weapons/musket.yaml +18 -0
- package/content/weapons/plasma-projector.yaml +18 -0
- package/content/weapons/primitive-bow.yaml +15 -0
- package/content/weapons/railgun.yaml +18 -0
- package/content/weapons/revolver.yaml +17 -0
- package/content/weapons/rifle.yaml +17 -0
- package/content/weapons/rocket-launcher.yaml +18 -0
- package/content/weapons/semi-auto-pistol.yaml +17 -0
- package/content/weapons/shear-rifle.yaml +19 -0
- package/content/weapons/shotgun.yaml +17 -0
- package/content/weapons/small-advanced-weapon.yaml +14 -0
- package/content/weapons/small-primitive-weapon.yaml +13 -0
- package/content/weapons/sniper-rifle.yaml +17 -0
- package/content/weapons/spear.yaml +8 -0
- package/content/weapons/spike-thrower.yaml +18 -0
- package/content/weapons/stun-baton.yaml +14 -0
- package/content/weapons/submachine-gun.yaml +18 -0
- package/content/weapons/suit-ripper.yaml +11 -0
- package/content/weapons/thermal-knife.yaml +7 -0
- package/content/weapons/thermal-pistol.yaml +18 -0
- package/content/weapons/thunder-gun.yaml +18 -0
- package/content/weapons/unarmed.yaml +8 -0
- package/content/weapons/void-carbine.yaml +17 -0
- package/content/weapons/vortex-cannon.yaml +16 -0
- package/content/weapons/wheatcutter-belt.yaml +16 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.js +2 -0
- package/dist/i18n/en.json +1356 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/release.json +30238 -0
- package/i18n/en/content.yaml +394 -0
- package/i18n/en/foci.yaml +199 -0
- package/i18n/en/rules.yaml +759 -0
- package/i18n/en/text.yaml +249 -0
- package/i18n/en.yaml +1 -0
- package/pack.yaml +15 -0
- package/package.json +58 -3
- package/rules/advancement.yaml +461 -0
- package/rules/character.yaml +114 -0
- package/rules/checks.yaml +160 -0
- package/rules/combat.yaml +312 -0
- package/rules/core.yaml +111 -0
- package/rules/creation.yaml +633 -0
- package/rules/gear.yaml +176 -0
- package/rules/layout.yaml +195 -0
- package/rules/psionics.yaml +105 -0
- package/rules/start.yaml +403 -0
- package/rules/tags.yaml +60 -0
package/rules/gear.yaml
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
fields:
|
|
2
|
+
# Armor Class: the best armor worn (or an innate AC), a shield, and Dexterity.
|
|
3
|
+
ac.innate: { type: integer, formula: 0 }
|
|
4
|
+
ac.armor:
|
|
5
|
+
type: integer
|
|
6
|
+
formula: >-
|
|
7
|
+
max(10, ac.innate, maxCopies(copy.fields.ac, copy.type == 'armor' && copy.equipped
|
|
8
|
+
&& !copy.fields.shield))
|
|
9
|
+
ac.shield:
|
|
10
|
+
type: integer
|
|
11
|
+
formula: "maxCopies(copy.fields.ac, copy.type == 'armor' && copy.equipped && copy.fields.shield)"
|
|
12
|
+
ac.value:
|
|
13
|
+
type: integer
|
|
14
|
+
tags: [ac]
|
|
15
|
+
formula: >-
|
|
16
|
+
(ac.shield > 0 ? (ac.armor >= ac.shield ? ac.armor + 1 : ac.shield) : ac.armor)
|
|
17
|
+
+ attributes.dex.mod
|
|
18
|
+
# Against firearms and advanced melee weapons, primitive armor and shields count as AC 10.
|
|
19
|
+
ac.advanced:
|
|
20
|
+
type: integer
|
|
21
|
+
tags: [ac]
|
|
22
|
+
formula: >-
|
|
23
|
+
max(10, ac.innate, maxCopies(copy.fields.ac, copy.type == 'armor' && copy.equipped
|
|
24
|
+
&& !copy.fields.shield && copy.fields.category != 'primitive'))
|
|
25
|
+
+ (maxCopies(copy.fields.ac, copy.type == 'armor' && copy.equipped && copy.fields.shield
|
|
26
|
+
&& copy.fields.category != 'primitive') > 0 ? 1 : 0)
|
|
27
|
+
+ attributes.dex.mod
|
|
28
|
+
|
|
29
|
+
# Damage bonuses from foci: the Stab skill to melee and thrown weapons (Armsman), the Shoot skill
|
|
30
|
+
# to ranged ones (Gunslinger).
|
|
31
|
+
damage.melee: { type: integer, formula: 0 }
|
|
32
|
+
damage.ranged: { type: integer, formula: 0 }
|
|
33
|
+
shock.bonus: { type: integer, formula: 0 }
|
|
34
|
+
# Melee Shock that treats every target as AC 10 (Shocking Assault, Close Combatant).
|
|
35
|
+
shock.anyAc: { type: boolean, formula: false }
|
|
36
|
+
# Unmodified damage on a miss (Armsman, Gunslinger, Unarmed Combatant).
|
|
37
|
+
miss.melee: { type: dice, formula: 0 }
|
|
38
|
+
miss.ranged: { type: dice, formula: 0 }
|
|
39
|
+
miss.punch: { type: dice, formula: 0 }
|
|
40
|
+
# Primitive melee weapons and fists that count as advanced (Armsman, Unarmed Combatant).
|
|
41
|
+
combat.meleeAdvanced: { type: boolean, formula: false }
|
|
42
|
+
combat.punchAdvanced: { type: boolean, formula: false }
|
|
43
|
+
|
|
44
|
+
# Encumbrance: Readied (equipped) items up to half Strength, Stowed items up to Strength.
|
|
45
|
+
encumbrance.strength: { type: integer, formula: attributes.str.score }
|
|
46
|
+
encumbrance.readied:
|
|
47
|
+
type: integer
|
|
48
|
+
formula: >-
|
|
49
|
+
sumCopies(copy.fields.enc * ceil(copy.quantity / copy.fields.bundle), has(copy.fields.enc)
|
|
50
|
+
&& copy.equipped && !copy.state.stored)
|
|
51
|
+
encumbrance.stowed:
|
|
52
|
+
type: integer
|
|
53
|
+
formula: >-
|
|
54
|
+
sumCopies(copy.fields.enc * ceil(copy.quantity / copy.fields.bundle), has(copy.fields.enc)
|
|
55
|
+
&& !copy.equipped && !copy.state.stored)
|
|
56
|
+
encumbrance.readiedLimit: { type: integer, formula: floor(encumbrance.strength / 2) }
|
|
57
|
+
encumbrance.stowedLimit: { type: integer, formula: encumbrance.strength }
|
|
58
|
+
# 0 unencumbered, 1 lightly (2 more Readied or 4 more Stowed), 2 heavily (as much again),
|
|
59
|
+
# 3 more than that.
|
|
60
|
+
encumbrance.level:
|
|
61
|
+
type: integer
|
|
62
|
+
limits: { max: 2 }
|
|
63
|
+
formula: >-
|
|
64
|
+
max(encumbrance.readied <= encumbrance.readiedLimit ? 0
|
|
65
|
+
: encumbrance.readied <= encumbrance.readiedLimit + 2 ? 1
|
|
66
|
+
: encumbrance.readied <= encumbrance.readiedLimit + 4 ? 2 : 3,
|
|
67
|
+
encumbrance.stowed <= encumbrance.stowedLimit ? 0
|
|
68
|
+
: encumbrance.stowed <= encumbrance.stowedLimit + 4 ? 1
|
|
69
|
+
: encumbrance.stowed <= encumbrance.stowedLimit + 8 ? 2 : 3)
|
|
70
|
+
movement: { type: integer, formula: '[10, 7, 5, 0][encumbrance.level]' }
|
|
71
|
+
|
|
72
|
+
# System Strain: permanent from cyberware, the rest temporary. It may not pass Constitution.
|
|
73
|
+
strain.permanent:
|
|
74
|
+
type: integer
|
|
75
|
+
formula: "sumCopies(copy.fields.strain, copy.type == 'cyberware' && has(copy.fields.strain))"
|
|
76
|
+
strain.current: { type: integer, input: true, default: 0, min: 0 }
|
|
77
|
+
strain.total:
|
|
78
|
+
type: integer
|
|
79
|
+
formula: strain.permanent + strain.current
|
|
80
|
+
limits: { max: strain.max }
|
|
81
|
+
strain.max: { type: integer, formula: attributes.con.score }
|
|
82
|
+
|
|
83
|
+
standardCopies:
|
|
84
|
+
- { type: weapon, where: "'unarmed' in item.tags" }
|
|
85
|
+
|
|
86
|
+
contentTypes:
|
|
87
|
+
weapon:
|
|
88
|
+
carried: true
|
|
89
|
+
equippable: true
|
|
90
|
+
fields:
|
|
91
|
+
damage: { type: dice, required: true }
|
|
92
|
+
skill: { type: enum, values: [punch, shoot, stab], required: true }
|
|
93
|
+
attribute: { type: enum, values: [str, dex, str-dex] }
|
|
94
|
+
range: { type: integer, min: 0 }
|
|
95
|
+
maxRange: { type: integer, min: 0 }
|
|
96
|
+
magazine: { type: integer, min: 1 }
|
|
97
|
+
ammo: { type: enum, values: [rounds, cell-a, cell-b, missile] }
|
|
98
|
+
shock: { type: integer, min: 0 }
|
|
99
|
+
shockAc: { type: integer, min: 0 }
|
|
100
|
+
burst: { type: boolean, default: false }
|
|
101
|
+
suppress: { type: boolean, default: false }
|
|
102
|
+
# Energy weapons: +1 to hit.
|
|
103
|
+
energy: { type: boolean, default: false }
|
|
104
|
+
# Firearms and TL4 melee weapons ignore primitive armor.
|
|
105
|
+
advanced: { type: boolean, default: false }
|
|
106
|
+
heavy: { type: boolean, default: false }
|
|
107
|
+
thrown: { type: boolean, default: false }
|
|
108
|
+
nonlethal: { type: boolean, default: false }
|
|
109
|
+
# Always rolls against this AC (a grenade).
|
|
110
|
+
fixedAc: { type: integer }
|
|
111
|
+
reloadActions: { type: integer, default: 1, min: 1 }
|
|
112
|
+
cost: { type: integer, min: 0 }
|
|
113
|
+
enc: { type: integer, min: 0 }
|
|
114
|
+
bundle: { type: integer, default: 1, min: 1 }
|
|
115
|
+
techLevel: { type: integer, min: 0, max: 6 }
|
|
116
|
+
state:
|
|
117
|
+
stored: { type: boolean, default: false }
|
|
118
|
+
actions:
|
|
119
|
+
- use: attack
|
|
120
|
+
- use: reload
|
|
121
|
+
|
|
122
|
+
armor:
|
|
123
|
+
carried: true
|
|
124
|
+
equippable: true
|
|
125
|
+
fields:
|
|
126
|
+
ac: { type: integer, required: true, min: 10 }
|
|
127
|
+
category: { type: enum, values: [primitive, street, combat, powered], required: true }
|
|
128
|
+
shield: { type: boolean, default: false }
|
|
129
|
+
# Strength counted higher for encumbrance while worn.
|
|
130
|
+
strength: { type: integer, default: 0, min: 0 }
|
|
131
|
+
cost: { type: integer, min: 0 }
|
|
132
|
+
enc: { type: integer, min: 0 }
|
|
133
|
+
bundle: { type: integer, default: 1, min: 1 }
|
|
134
|
+
techLevel: { type: integer, min: 0, max: 6 }
|
|
135
|
+
state:
|
|
136
|
+
stored: { type: boolean, default: false }
|
|
137
|
+
effects:
|
|
138
|
+
- target: encumbrance.strength
|
|
139
|
+
op: add
|
|
140
|
+
value: item.strength
|
|
141
|
+
when: self.equipped && item.strength > 0
|
|
142
|
+
|
|
143
|
+
gear:
|
|
144
|
+
carried: true
|
|
145
|
+
equippable: true
|
|
146
|
+
fields:
|
|
147
|
+
category:
|
|
148
|
+
type: enum
|
|
149
|
+
required: true
|
|
150
|
+
values: [ammo-power, communications, computing, field, pharmaceutical, tools-medical]
|
|
151
|
+
# What a weapon reloads with.
|
|
152
|
+
kind: { type: enum, values: [rounds, cell-a, cell-b, missile] }
|
|
153
|
+
# A drug: the Heal skill needed to apply it, the System Strain it adds and what it heals.
|
|
154
|
+
healSkill: { type: integer, min: 0 }
|
|
155
|
+
strain: { type: integer, default: 0, min: 0 }
|
|
156
|
+
heal: { type: dice }
|
|
157
|
+
healAddsSkill: { type: boolean, default: false }
|
|
158
|
+
cost: { type: integer, min: 0 }
|
|
159
|
+
enc: { type: integer, min: 0 }
|
|
160
|
+
# How many make one item of encumbrance when packed together.
|
|
161
|
+
bundle: { type: integer, default: 1, min: 1 }
|
|
162
|
+
techLevel: { type: integer, min: 0, max: 6 }
|
|
163
|
+
state:
|
|
164
|
+
stored: { type: boolean, default: false }
|
|
165
|
+
actions:
|
|
166
|
+
- use: use-drug
|
|
167
|
+
|
|
168
|
+
cyberware:
|
|
169
|
+
fields:
|
|
170
|
+
strain: { type: integer, required: true, min: 0 }
|
|
171
|
+
# System Strain each time it is triggered.
|
|
172
|
+
activationStrain: { type: integer, default: 0, min: 0 }
|
|
173
|
+
cost: { type: integer, min: 0 }
|
|
174
|
+
techLevel: { type: integer, min: 0, max: 6 }
|
|
175
|
+
actions:
|
|
176
|
+
- use: trigger-cyberware
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
display:
|
|
2
|
+
groups:
|
|
3
|
+
- id: attributes
|
|
4
|
+
priority: 0
|
|
5
|
+
members: { type: field, where: "'attribute' in item.tags" }
|
|
6
|
+
- id: saves
|
|
7
|
+
priority: 0
|
|
8
|
+
members: { type: field, where: "'save' in item.tags" }
|
|
9
|
+
- id: skills
|
|
10
|
+
priority: 0
|
|
11
|
+
members: { type: field, where: "'skill.general' in item.tags || 'skill.combat' in item.tags" }
|
|
12
|
+
- id: psychic-skills
|
|
13
|
+
priority: 1
|
|
14
|
+
showWhen: "psionics.access != 'none'"
|
|
15
|
+
members: { type: field, where: "'skill.psychic' in item.tags" }
|
|
16
|
+
- id: condition
|
|
17
|
+
priority: 0
|
|
18
|
+
- id: combat
|
|
19
|
+
priority: 0
|
|
20
|
+
- id: psionics
|
|
21
|
+
priority: 1
|
|
22
|
+
showWhen: "psionics.access != 'none' || effort.max > 0"
|
|
23
|
+
- id: advancement
|
|
24
|
+
priority: 2
|
|
25
|
+
- id: carrying
|
|
26
|
+
priority: 2
|
|
27
|
+
- id: attacks
|
|
28
|
+
kind: actions
|
|
29
|
+
priority: 0
|
|
30
|
+
members: { type: action, where: "'attack' in item.tags || 'combat' in item.tags" }
|
|
31
|
+
- id: checks
|
|
32
|
+
kind: actions
|
|
33
|
+
priority: 0
|
|
34
|
+
members:
|
|
35
|
+
type: action
|
|
36
|
+
where: "'check' in item.tags || 'save' in item.tags || 'initiative' in item.tags"
|
|
37
|
+
- id: health-actions
|
|
38
|
+
kind: actions
|
|
39
|
+
priority: 1
|
|
40
|
+
members: { type: action, where: "'health' in item.tags || 'strain' in item.tags" }
|
|
41
|
+
- id: psionic-actions
|
|
42
|
+
kind: actions
|
|
43
|
+
priority: 1
|
|
44
|
+
members: { type: action, where: "'psionics' in item.tags" }
|
|
45
|
+
- id: advancement-actions
|
|
46
|
+
kind: actions
|
|
47
|
+
priority: 2
|
|
48
|
+
visibility: background
|
|
49
|
+
members: { type: action, where: "'level-up' in item.tags || 'creation' in item.tags" }
|
|
50
|
+
- id: class
|
|
51
|
+
kind: content
|
|
52
|
+
priority: 0
|
|
53
|
+
members: { type: class }
|
|
54
|
+
- id: background
|
|
55
|
+
kind: content
|
|
56
|
+
priority: 0
|
|
57
|
+
members: { type: background }
|
|
58
|
+
- id: foci
|
|
59
|
+
kind: content
|
|
60
|
+
priority: 0
|
|
61
|
+
members: { type: focus }
|
|
62
|
+
- id: techniques
|
|
63
|
+
kind: content
|
|
64
|
+
priority: 1
|
|
65
|
+
showWhen: "hasChoice('technique') || psionics.access != 'none' || effort.max > 0"
|
|
66
|
+
members: { type: technique }
|
|
67
|
+
sectionBy: item.level
|
|
68
|
+
- id: weapons
|
|
69
|
+
kind: content
|
|
70
|
+
priority: 1
|
|
71
|
+
members: { type: weapon }
|
|
72
|
+
- id: armor
|
|
73
|
+
kind: content
|
|
74
|
+
priority: 1
|
|
75
|
+
members: { type: armor }
|
|
76
|
+
- id: gear
|
|
77
|
+
kind: content
|
|
78
|
+
priority: 2
|
|
79
|
+
members: { type: gear }
|
|
80
|
+
sectionBy: item.category
|
|
81
|
+
- id: cyberware
|
|
82
|
+
kind: content
|
|
83
|
+
priority: 2
|
|
84
|
+
members: { type: cyberware }
|
|
85
|
+
types:
|
|
86
|
+
class: { quantity: { hidden: true } }
|
|
87
|
+
background: { quantity: { hidden: true } }
|
|
88
|
+
focus:
|
|
89
|
+
quantity: { hidden: true }
|
|
90
|
+
state:
|
|
91
|
+
level: { priority: 0 }
|
|
92
|
+
technique:
|
|
93
|
+
quantity: { hidden: true }
|
|
94
|
+
state:
|
|
95
|
+
committed: { priority: 0, showWhen: self.committed > 0 }
|
|
96
|
+
cyberware: { quantity: { hidden: true } }
|
|
97
|
+
weapon:
|
|
98
|
+
state:
|
|
99
|
+
loaded: { priority: 0, input: { widget: track }, showWhen: has(item.magazine) }
|
|
100
|
+
fields:
|
|
101
|
+
damage: { format: dice }
|
|
102
|
+
fields:
|
|
103
|
+
level: { groups: [advancement], priority: 0, visibility: primary }
|
|
104
|
+
xp.current: { groups: [advancement], priority: 0, with: [{ field: xp.next, as: max }] }
|
|
105
|
+
xp.next: { groups: [advancement], priority: 1 }
|
|
106
|
+
skillPoints.general: { groups: [advancement], priority: 1 }
|
|
107
|
+
skillPoints.expert: { groups: [advancement], priority: 1, showWhen: class.expertPoints > 0 }
|
|
108
|
+
skillPoints.psychic:
|
|
109
|
+
{ groups: [advancement], priority: 1, showWhen: "psionics.access != 'none'" }
|
|
110
|
+
skillPoints.training: { groups: [advancement], priority: 1, showWhen: skillPoints.training > 0 }
|
|
111
|
+
attributes.boosts: { groups: [advancement], priority: 2 }
|
|
112
|
+
'skills.{skill}.credit':
|
|
113
|
+
{ groups: [advancement], priority: 3, showWhen: 'skills.{skill}.credit > 0' }
|
|
114
|
+
hp.current:
|
|
115
|
+
groups: [condition]
|
|
116
|
+
priority: 0
|
|
117
|
+
visibility: primary
|
|
118
|
+
with: [{ field: hp.max, as: max }]
|
|
119
|
+
rolls: [{ action: take-damage }, { action: heal }]
|
|
120
|
+
hp.max: { groups: [condition], priority: 1 }
|
|
121
|
+
hp.rolled: { groups: [condition], priority: 2 }
|
|
122
|
+
hp.perLevel: { hidden: true }
|
|
123
|
+
strain.current:
|
|
124
|
+
groups: [condition]
|
|
125
|
+
priority: 0
|
|
126
|
+
with: [{ field: strain.max, as: max }, { field: strain.permanent, as: detail }]
|
|
127
|
+
strain.total: { groups: [condition], priority: 1 }
|
|
128
|
+
strain.permanent: { groups: [condition], priority: 1 }
|
|
129
|
+
strain.max: { groups: [condition], priority: 1 }
|
|
130
|
+
scene.expertReroll:
|
|
131
|
+
groups: [condition]
|
|
132
|
+
priority: 1
|
|
133
|
+
showWhen: 'countCopies(copy.item == @classes.expert) > 0'
|
|
134
|
+
input: { widget: checkbox }
|
|
135
|
+
scene.warriorLuck:
|
|
136
|
+
groups: [condition]
|
|
137
|
+
priority: 1
|
|
138
|
+
showWhen: 'countCopies(copy.item == @classes.warrior) > 0'
|
|
139
|
+
input: { widget: checkbox }
|
|
140
|
+
ac.value: { groups: [combat], priority: 0, visibility: primary }
|
|
141
|
+
ac.advanced: { groups: [combat], priority: 1 }
|
|
142
|
+
combat.attackBonus: { groups: [combat], priority: 0, visibility: primary }
|
|
143
|
+
credits.current: { groups: [carrying], priority: 0 }
|
|
144
|
+
encumbrance.readied:
|
|
145
|
+
{ groups: [carrying], priority: 0, with: [{ field: encumbrance.readiedLimit, as: max }] }
|
|
146
|
+
encumbrance.stowed:
|
|
147
|
+
{ groups: [carrying], priority: 0, with: [{ field: encumbrance.stowedLimit, as: max }] }
|
|
148
|
+
encumbrance.level: { groups: [carrying], priority: 1 }
|
|
149
|
+
movement: { groups: [carrying], priority: 1 }
|
|
150
|
+
henchmen.max: { groups: [carrying], priority: 2, showWhen: henchmen.max > 0 }
|
|
151
|
+
effort.available:
|
|
152
|
+
groups: [psionics]
|
|
153
|
+
priority: 0
|
|
154
|
+
with: [{ field: effort.max, as: max }]
|
|
155
|
+
rolls: [{ action: commit-effort }]
|
|
156
|
+
effort.max: { groups: [psionics], priority: 1 }
|
|
157
|
+
effort.scene: { groups: [psionics], priority: 1 }
|
|
158
|
+
effort.day: { groups: [psionics], priority: 1 }
|
|
159
|
+
effort.active: { groups: [psionics], priority: 1, showWhen: effort.active > 0 }
|
|
160
|
+
effort.torched: { groups: [psionics], priority: 2 }
|
|
161
|
+
psionics.access: { groups: [psionics], priority: 1 }
|
|
162
|
+
psionics.discipline: { groups: [psionics], priority: 1, showWhen: "psionics.discipline != ''" }
|
|
163
|
+
psionics.training: { hidden: true }
|
|
164
|
+
effort.bonus: { hidden: true }
|
|
165
|
+
effort.wild: { hidden: true }
|
|
166
|
+
class.focus.combat: { hidden: true }
|
|
167
|
+
class.focus.noncombat: { hidden: true }
|
|
168
|
+
class.expertPoints: { hidden: true }
|
|
169
|
+
ac.armor: { hidden: true }
|
|
170
|
+
ac.innate: { hidden: true }
|
|
171
|
+
ac.shield: { hidden: true }
|
|
172
|
+
damage.melee: { hidden: true }
|
|
173
|
+
damage.ranged: { hidden: true }
|
|
174
|
+
shock.bonus: { hidden: true }
|
|
175
|
+
shock.anyAc: { hidden: true }
|
|
176
|
+
miss.melee: { hidden: true }
|
|
177
|
+
miss.ranged: { hidden: true }
|
|
178
|
+
miss.punch: { hidden: true }
|
|
179
|
+
combat.meleeAdvanced: { hidden: true }
|
|
180
|
+
combat.punchAdvanced: { hidden: true }
|
|
181
|
+
encumbrance.strength: { hidden: true }
|
|
182
|
+
'attributes.{attr}.score':
|
|
183
|
+
with: [{ field: 'attributes.{attr}.mod', as: detail }]
|
|
184
|
+
'skills.{general}.level':
|
|
185
|
+
rolls: [{ action: skill-check, params: { skill: '{general}' } }]
|
|
186
|
+
'skills.{combat}.level':
|
|
187
|
+
rolls: [{ action: skill-check, params: { skill: '{combat}' } }]
|
|
188
|
+
'skills.{psychic}.level':
|
|
189
|
+
rolls: [{ action: skill-check, params: { skill: '{psychic}' } }]
|
|
190
|
+
'skills.{general}.dice': { hidden: true }
|
|
191
|
+
'skills.{combat}.dice': { hidden: true }
|
|
192
|
+
'skills.{psychic}.dice': { hidden: true }
|
|
193
|
+
saves.physical: { rolls: [{ action: saving-throw, params: { save: physical } }] }
|
|
194
|
+
saves.evasion: { rolls: [{ action: saving-throw, params: { save: evasion } }] }
|
|
195
|
+
saves.mental: { rolls: [{ action: saving-throw, params: { save: mental } }] }
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
fields:
|
|
2
|
+
# Cursed Luck is on the character: attacks against them and damage they take roll twice and
|
|
3
|
+
# keep the better.
|
|
4
|
+
psionics.cursedLuck: { type: boolean, formula: false }
|
|
5
|
+
effort.bonus: { type: integer, formula: 0 }
|
|
6
|
+
# A wild talent's Effort, for a character who isn't a psychic.
|
|
7
|
+
effort.wild: { type: integer, formula: 0 }
|
|
8
|
+
effort.max:
|
|
9
|
+
type: integer
|
|
10
|
+
formula: >-
|
|
11
|
+
psionics.access == 'none' ? effort.wild
|
|
12
|
+
: max(1, 1 + maxFields(f.value, 'skill.psychic' in f.tags)
|
|
13
|
+
+ max(attributes.wis.mod, attributes.con.mod)) + effort.bonus
|
|
14
|
+
# Effort Committed until the end of the scene, and until the next night's rest.
|
|
15
|
+
effort.scene: { type: integer, input: true, default: 0, min: 0 }
|
|
16
|
+
effort.day: { type: integer, input: true, default: 0, min: 0 }
|
|
17
|
+
# Effort gained by torching, which lasts for the scene.
|
|
18
|
+
effort.torched: { type: integer, input: true, default: 0, min: 0 }
|
|
19
|
+
# Effort Committed for as long as a technique lasts, held on the technique: its copy, the
|
|
20
|
+
# pick that chose it, or the grant of a core technique. Each technique adds its own.
|
|
21
|
+
effort.active: { type: integer, formula: 0 }
|
|
22
|
+
effort.available:
|
|
23
|
+
type: integer
|
|
24
|
+
formula: effort.max + effort.torched - effort.scene - effort.day - effort.active
|
|
25
|
+
limits: { min: 0 }
|
|
26
|
+
|
|
27
|
+
effects:
|
|
28
|
+
- target: { rolls: [attack, damage] }
|
|
29
|
+
op: rollModifier
|
|
30
|
+
value: { kind: advantage, of: roll }
|
|
31
|
+
when: >-
|
|
32
|
+
has(participants.target) && size(participants.target) > 0
|
|
33
|
+
&& participants.target[0].psionics.cursedLuck
|
|
34
|
+
|
|
35
|
+
contentTypes:
|
|
36
|
+
technique:
|
|
37
|
+
copies: { perItem: 1 }
|
|
38
|
+
fields:
|
|
39
|
+
discipline:
|
|
40
|
+
type: enum
|
|
41
|
+
required: true
|
|
42
|
+
values: [biopsionics, metapsionics, precognition, telekinesis, telepathy, teleportation]
|
|
43
|
+
level: { type: integer, required: true, min: 0, max: 4 }
|
|
44
|
+
# The discipline's core technique: every psychic with the skill has it.
|
|
45
|
+
core: { type: boolean, default: false }
|
|
46
|
+
state:
|
|
47
|
+
# Effort Committed to keep the technique going, until it is released.
|
|
48
|
+
committed: { type: integer, default: 0, min: 0 }
|
|
49
|
+
effects:
|
|
50
|
+
- { target: effort.active, op: add, value: self.committed }
|
|
51
|
+
actions:
|
|
52
|
+
- use: sustain-technique
|
|
53
|
+
- use: release-technique
|
|
54
|
+
|
|
55
|
+
constraints:
|
|
56
|
+
# Only psychics have psychic skills, and a restricted psychic only their one discipline.
|
|
57
|
+
- id: psychic-skills
|
|
58
|
+
check: >-
|
|
59
|
+
psionics.access == 'unrestricted'
|
|
60
|
+
|| sumFields(f.value >= 0 && (psionics.access == 'none'
|
|
61
|
+
|| f.id != 'swn-revised:skills.' + psionics.discipline + '.level') ? 1 : 0,
|
|
62
|
+
'skill.psychic' in f.tags) == 0
|
|
63
|
+
|
|
64
|
+
actions:
|
|
65
|
+
# Commit a point of Effort for as long as the technique lasts: it stays Committed on the
|
|
66
|
+
# technique until the psychic releases it, ending the power.
|
|
67
|
+
- id: sustain-technique
|
|
68
|
+
tags: [psionics]
|
|
69
|
+
available: effort.available > 0
|
|
70
|
+
results: [committed]
|
|
71
|
+
steps:
|
|
72
|
+
- &held
|
|
73
|
+
id: held
|
|
74
|
+
kind: branch
|
|
75
|
+
cases:
|
|
76
|
+
- when: true
|
|
77
|
+
flags:
|
|
78
|
+
# Where the technique is held: its own copy, a focus's pick (Wild Psychic Talent)
|
|
79
|
+
# or a psychic class's grant (a core technique). The owning copy's type tells.
|
|
80
|
+
held: >-
|
|
81
|
+
countCopies(copy.id == self.id && copy.type == 'technique') > 0 ? 'copy'
|
|
82
|
+
: countCopies(copy.id == self.id && copy.type == 'focus') > 0 ? 'pick'
|
|
83
|
+
: 'grant'
|
|
84
|
+
- id: commit
|
|
85
|
+
kind: changes
|
|
86
|
+
changes:
|
|
87
|
+
- { type: adjustState, when: "flags.held == 'copy'", entry: self, key: committed, by: 1 }
|
|
88
|
+
- { type: adjustState, when: "flags.held == 'pick'", pick: self, key: committed, by: 1 }
|
|
89
|
+
- { type: adjustState, when: "flags.held == 'grant'", grant: self, key: committed, by: 1 }
|
|
90
|
+
- { id: result, kind: outcome, result: "'committed'" }
|
|
91
|
+
|
|
92
|
+
# Reclaim the Effort a technique holds, ending it.
|
|
93
|
+
- id: release-technique
|
|
94
|
+
tags: [psionics]
|
|
95
|
+
available: self.committed > 0
|
|
96
|
+
results: [released]
|
|
97
|
+
steps:
|
|
98
|
+
- *held
|
|
99
|
+
- id: release
|
|
100
|
+
kind: changes
|
|
101
|
+
changes:
|
|
102
|
+
- { type: setState, when: "flags.held == 'copy'", entry: self, key: committed, value: 0 }
|
|
103
|
+
- { type: setState, when: "flags.held == 'pick'", pick: self, key: committed, value: 0 }
|
|
104
|
+
- { type: setState, when: "flags.held == 'grant'", grant: self, key: committed, value: 0 }
|
|
105
|
+
- { id: result, kind: outcome, result: "'released'" }
|