@opencharacter/swn-revised 0.1.0 → 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 (78) hide show
  1. package/README.md +64 -10
  2. package/content/classes/adventurer.yaml +2 -0
  3. package/content/classes/expert.yaml +2 -0
  4. package/content/classes/psychic.yaml +6 -6
  5. package/content/classes/warrior.yaml +2 -0
  6. package/content/foci/psychic-training.yaml +1 -0
  7. package/content/foci/specialist.yaml +1 -1
  8. package/content/foci/wild-psychic-talent.yaml +1 -0
  9. package/content/kits/barbarian.yaml +17 -0
  10. package/content/kits/blade.yaml +17 -0
  11. package/content/kits/civilian.yaml +12 -0
  12. package/content/kits/credits.yaml +11 -0
  13. package/content/kits/gunslinger.yaml +16 -0
  14. package/content/kits/hacker.yaml +18 -0
  15. package/content/kits/medic.yaml +18 -0
  16. package/content/kits/scout.yaml +19 -0
  17. package/content/kits/soldier.yaml +16 -0
  18. package/content/kits/technician.yaml +19 -0
  19. package/content/kits/thief.yaml +19 -0
  20. package/content/partial-classes/psychic.yaml +4 -6
  21. package/content/styles/expert-nimble.yaml +11 -0
  22. package/content/styles/expert-smart.yaml +11 -0
  23. package/content/styles/expert-smooth.yaml +11 -0
  24. package/content/styles/psychic-adept.yaml +11 -0
  25. package/content/styles/psychic-seer.yaml +11 -0
  26. package/content/styles/warrior-leader.yaml +11 -0
  27. package/content/styles/warrior-melee.yaml +11 -0
  28. package/content/styles/warrior-ranged.yaml +11 -0
  29. package/content/techniques/psychic-succor.yaml +16 -3
  30. package/content/weapons/advanced-bow.yaml +0 -2
  31. package/content/weapons/anti-vehicle-laser.yaml +0 -2
  32. package/content/weapons/combat-rifle.yaml +0 -2
  33. package/content/weapons/combat-shotgun.yaml +0 -2
  34. package/content/weapons/conversion-bow.yaml +0 -2
  35. package/content/weapons/crude-pistol.yaml +0 -2
  36. package/content/weapons/distortion-cannon.yaml +0 -2
  37. package/content/weapons/heavy-machine-gun.yaml +0 -2
  38. package/content/weapons/hydra-array.yaml +0 -2
  39. package/content/weapons/laser-pistol.yaml +0 -2
  40. package/content/weapons/laser-rifle.yaml +0 -2
  41. package/content/weapons/mag-pistol.yaml +0 -2
  42. package/content/weapons/mag-rifle.yaml +0 -2
  43. package/content/weapons/musket.yaml +0 -2
  44. package/content/weapons/plasma-projector.yaml +0 -2
  45. package/content/weapons/primitive-bow.yaml +0 -2
  46. package/content/weapons/railgun.yaml +0 -2
  47. package/content/weapons/revolver.yaml +0 -2
  48. package/content/weapons/rifle.yaml +0 -2
  49. package/content/weapons/rocket-launcher.yaml +0 -2
  50. package/content/weapons/semi-auto-pistol.yaml +0 -2
  51. package/content/weapons/shear-rifle.yaml +0 -2
  52. package/content/weapons/shotgun.yaml +0 -2
  53. package/content/weapons/sniper-rifle.yaml +0 -2
  54. package/content/weapons/spike-thrower.yaml +0 -2
  55. package/content/weapons/submachine-gun.yaml +0 -2
  56. package/content/weapons/thermal-pistol.yaml +0 -2
  57. package/content/weapons/thunder-gun.yaml +0 -2
  58. package/content/weapons/void-carbine.yaml +0 -2
  59. package/content/weapons/vortex-cannon.yaml +0 -2
  60. package/content/weapons/wheatcutter-belt.yaml +0 -2
  61. package/dist/i18n/en.js +1 -1
  62. package/dist/i18n/en.json +140 -85
  63. package/dist/index.js +1 -1
  64. package/dist/release.json +5068 -3511
  65. package/i18n/en/content.yaml +105 -63
  66. package/i18n/en/rules.yaml +35 -22
  67. package/pack.yaml +2 -2
  68. package/package.json +2 -2
  69. package/rules/advancement.yaml +30 -9
  70. package/rules/character.yaml +30 -5
  71. package/rules/checks.yaml +8 -2
  72. package/rules/combat.yaml +11 -2
  73. package/rules/creation.yaml +164 -366
  74. package/rules/gear.yaml +16 -4
  75. package/rules/layout.yaml +4 -2
  76. package/rules/psionics.yaml +64 -4
  77. package/rules/start.yaml +46 -32
  78. package/rules/tags.yaml +11 -0
package/README.md CHANGED
@@ -16,6 +16,9 @@ edition only, with the author's permission; nothing from the paid deluxe edition
16
16
  pnpm add @opencharacter/swn-revised @opencharacter/engine
17
17
  ```
18
18
 
19
+ This release needs spec 0.3: `@opencharacter/engine` 0.3.0 or later. An engine for an older
20
+ spec refuses it (`spec-version-unsupported`).
21
+
19
22
  The package's default export is the pack's release, ready for `loadRuleset`; its English text is
20
23
  `@opencharacter/swn-revised/i18n/en` (also as JSON, `release.json` and `i18n/en.json`).
21
24
 
@@ -29,9 +32,9 @@ const { ruleset } = loaded;
29
32
 
30
33
  // A random character from the quick creation tables: every table is rolled.
31
34
  const blank = {
32
- specVersion: '0.2.0',
35
+ specVersion: '0.3.0',
33
36
  id: 'basil',
34
- packs: [{ id: 'swn-revised', version: '0.1.0' }],
37
+ packs: [{ id: 'swn-revised', version: '0.2.0' }],
35
38
  creating: true,
36
39
  };
37
40
  const run = startAction(ruleset, blank, {
@@ -82,11 +85,12 @@ sheet.values['swn-revised:saves.physical']?.value; // 15 less the better of Str
82
85
  Learning table, or three rolls split between the Growth and Learning tables; a class (an
83
86
  Adventurer picks two partial classes); a Psychic's two disciplines or a Partial Psychic's
84
87
  one; one focus level, plus the Expert's non-combat and the Warrior's combat one; a hobby
85
- skill; hit points; an equipment package or 2d6 × 100 credits.
86
- - `quick` and `random`, the quick creation tables: class and style (d8), background (d20),
87
- two disciplines for a psychic (d6), foci from the style's row (d6) and a bonus skill (d20).
88
- `random` rolls every table, so an automatic run finishes the character; the equipment
89
- package is drawn among the ten packages and the credits roll.
88
+ skill; hit points; an equipment package or 2d6 × 100 credits (the class's own package,
89
+ its `kit`, recommended).
90
+ - `quick` and `random`, the quick creation tables: class and style (the eight styles, d8),
91
+ background (d20), two disciplines for a psychic (d6), foci from the style's row (d6) and a
92
+ bonus skill (d20). `random` rolls every table, so an automatic run finishes the character;
93
+ the equipment package is drawn among the ten packages and the credits roll.
90
94
  - Every skill pick follows the book: a skill's first pick is level-0, the second level-1,
91
95
  and a third is any other non-psychic skill below level-1. A psychic skill raised to level-1
92
96
  brings a free level-1 technique.
@@ -118,12 +122,62 @@ sheet.values['swn-revised:saves.physical']?.value; // 15 less the better of Str
118
122
  - **Combat:** attack bonus, `attack` (d20 + attack bonus + combat skill, −2 untrained, +
119
123
  modifier, +1 for energy weapons, +2 for burst fire) against the target's AC, damage, Shock on
120
124
  a miss, ammunition and `reload`; Armor Class from the best armor, a shield and Dexterity.
121
- - **System Strain:** permanent from cyberware, temporary from drugs; `use-drug` and
122
- `trigger-cyberware` refuse what would pass Constitution. `rest` restores hit points, Strain,
125
+ - **System Strain:** permanent from cyberware, temporary from drugs; `use-drug`,
126
+ `trigger-cyberware` and Psychic Succor (given the target's `strain.total` and `strain.max`)
127
+ refuse what would pass Constitution. `rest` restores hit points, Strain,
123
128
  Effort and the once-a-scene abilities.
124
129
  - **Encumbrance:** Readied (equipped) items up to half Strength, Stowed up to Strength, and the
125
- lightly and heavily encumbered bands.
130
+ lightly and heavily encumbered bands. An equipment package readies its items, then stows
131
+ readied gear and all but one weapon while they fit, so a weak character starts within the
132
+ limits where the package allows; armor stays worn.
126
133
  - **Equipment:** every armor, ranged, melee and heavy weapon, general equipment and
127
134
  pharmaceutical, and cyberware item of the free edition, with the equipment packages.
128
135
 
129
136
  Starships, vehicles, drones and gear mods are not modeled.
137
+
138
+ ## Add-on packs
139
+
140
+ A pack that depends on `swn-revised` can add content of its types, and creation offers it with the
141
+ core's, in the guided picks and in the random draws (a die with a face per option, the book's die
142
+ with the core content alone):
143
+
144
+ - **Classes and backgrounds** join the full procedure. A class names its recommended package in
145
+ `kit`.
146
+ - **Styles** (`style`) join the quick tables: the class, the six scores and, for the book's
147
+ styles only, `table`, the style's column of the quick foci table. A style without one picks
148
+ its foci as the full procedure does (one of any kind, plus the class's extra non-combat and
149
+ combat ones).
150
+ - **Equipment packages** (`kit`) are content: a package's own `unpack` action (`listed: false`)
151
+ adds its gear and sets the credits. The starting-gear action adds the package as the entry
152
+ `kit`, runs its `unpack`, then removes it, so only the gear stays.
153
+ - **Foci** join every focus pick; the tags `needs-psionics` and `no-psionics` limit one to
154
+ characters with psionic access or without it.
155
+ - **Open enums:** weapon `ammo`, gear `category` and `kind` (what a weapon reloads with), and
156
+ armor `category`. An add-on lists new values in `extendEnums`
157
+ (`'swn-revised:types.weapon.fields.ammo': [spikes]`) and names them in its text.
158
+ - **Naming what an add-on adds:** it names each added value, option or key in its own text,
159
+ under the key this pack would use, and `createText` finds it there when the app passes the
160
+ ruleset's `enumOrigins`, `optionOrigins` and `familyOrigins`. For example,
161
+ `spikes` added to `swn-revised:types.weapon.fields.ammo` is
162
+ `types.weapon.fields.ammo.values.spikes.name: Spike magazine` (through `enumOrigins`).
163
+ - **Tagged steps** take an add-on's rules-level `option` and `changes` effects: `creation.kit`
164
+ (the starting package pick: an added option replaces the package), `creation.focus` and
165
+ `level-up.focus` (a focus pick at creation or on advancement: an added option is taken instead
166
+ of a focus), `creation.finish` (the last changes of both creation actions, before creation
167
+ ends), `level-up.level` (each new level's skill points), `rest.night` (a night's rest) and
168
+ `rest.scene` (the end of a scene).
169
+
170
+ - **Skills and psychic disciplines** are families: an added skill joins `skill` and `general` or
171
+ `combat` (`families: { 'swn-revised:skill': [xenology], 'swn-revised:general': [xenology] }`), a
172
+ discipline `skill` and `psychic`, and the add-on declares its `skills.<key>.level` (tagged
173
+ `skill` and `skill.general`, `skill.combat` or `skill.psychic`), `.dice` and `.credit`, and its
174
+ check tag (`check.<key>`). The core's changes reach them through `fieldId`, so creation,
175
+ `raise-skill`, focus points and `skill-check` gain, raise and roll them. The enums that hold a
176
+ skill are open and take its key: a background's entries (`freeSkill`, `quick1`, `quick2`,
177
+ `growth1`–`growth6`, `learning1`–`learning8`), a focus's `skill`, a weapon's `skill`, and the
178
+ parameters `gain-skill.entry`, `focus-skill-points.entry`, `raise-skill.skill` and
179
+ `skill-check.skill`; a discipline's also `psionics.discipline`, a technique's `discipline` and
180
+ `pick-technique.discipline`, so a new skill level picks its techniques. The Partial Psychic's
181
+ and Psychic Training's discipline choices take it through `extendChoices`. The psychic classes
182
+ grant each trained discipline's core technique (`core: true`, its `discipline` the key), so an
183
+ added discipline's core technique comes with it.
@@ -1,5 +1,7 @@
1
1
  id: classes.adventurer
2
2
  type: class
3
+ fields:
4
+ kit: kits.gunslinger
3
5
  choices:
4
6
  - id: partials
5
7
  pick: 2
@@ -1,5 +1,7 @@
1
1
  id: classes.expert
2
2
  type: class
3
+ fields:
4
+ kit: kits.technician
3
5
  effects:
4
6
  - { target: class.focus.noncombat, op: add, value: 1 }
5
7
  - { target: class.expertPoints, op: add, value: 1 }
@@ -1,11 +1,11 @@
1
1
  id: classes.psychic
2
2
  type: class
3
+ fields:
4
+ kit: kits.medic
3
5
  effects:
4
6
  - { target: psionics.access, op: set, value: "'unrestricted'" }
5
7
  grants:
6
- - { item: techniques.psychic-succor, when: skills.biopsionics.level >= 0 }
7
- - { item: techniques.psychic-refinement, when: skills.metapsionics.level >= 0 }
8
- - { item: techniques.oracle, when: skills.precognition.level >= 0 }
9
- - { item: techniques.telekinetic-manipulation, when: skills.telekinesis.level >= 0 }
10
- - { item: techniques.telepathic-contact, when: skills.telepathy.level >= 0 }
11
- - { item: techniques.personal-apportation, when: skills.teleportation.level >= 0 }
8
+ # Each discipline the psychic has grants its core technique, an add-on's discipline too.
9
+ - forEach: keysOf('psychic')
10
+ when: "fieldOf('skills.{psychic}.level', x) >= 0"
11
+ item: { query: { type: technique, where: item.core && item.discipline == x } }
@@ -1,5 +1,7 @@
1
1
  id: classes.warrior
2
2
  type: class
3
+ fields:
4
+ kit: kits.soldier
3
5
  effects:
4
6
  - { target: class.focus.combat, op: add, value: 1 }
5
7
  - { target: hp.perLevel, op: add, value: 2 }
@@ -1,5 +1,6 @@
1
1
  id: foci.psychic-training
2
2
  type: focus
3
+ tags: [needs-psionics]
3
4
  fields:
4
5
  kind: psychic
5
6
  skill: chosen
@@ -31,6 +31,6 @@ choices:
31
31
  }
32
32
  recommend: "'fix'"
33
33
  effects:
34
- - target: { fields: { where: "item.id == 'swn-revised:skills.' + pick.value + '.dice'" } }
34
+ - target: { fields: { where: "item.id == fieldId('skills.{skill}.dice', pick.value)" } }
35
35
  op: atLeast
36
36
  value: self.level + 2
@@ -1,5 +1,6 @@
1
1
  id: foci.wild-psychic-talent
2
2
  type: focus
3
+ tags: [no-psionics]
3
4
  fields:
4
5
  kind: psychic
5
6
  skill: none
@@ -0,0 +1,17 @@
1
+ id: kits.barbarian
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.spear'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.light-primitive-armor'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'armor.shield'", equipped: true } }
13
+ - { type: addItem, entry: { item: "'weapons.knife'", equipped: true } }
14
+ - { type: addItem, entry: { item: "'gear.backpack-tl0'", equipped: true } }
15
+ - { type: addItem, entry: { item: "'gear.rations-1-day'", quantity: 7 } }
16
+ - { type: addItem, entry: { item: "'gear.rope-tl0'" } }
17
+ - { type: set, field: credits.current, value: 500 }
@@ -0,0 +1,17 @@
1
+ id: kits.blade
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.monoblade-sword'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.woven-body-armor'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'armor.secure-clothing'" } }
13
+ - { type: addItem, entry: { item: "'weapons.thermal-knife'", equipped: true } }
14
+ - { type: addItem, entry: { item: "'gear.backpack-tl0'", equipped: true } }
15
+ - { type: addItem, entry: { item: "'gear.compad'" } }
16
+ - { type: addItem, entry: { item: "'gear.lazarus-patch'" } }
17
+ - { type: set, field: credits.current, value: 50 }
@@ -0,0 +1,12 @@
1
+ id: kits.civilian
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'armor.secure-clothing'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'gear.compad'" } }
12
+ - { type: set, field: credits.current, value: 700 }
@@ -0,0 +1,11 @@
1
+ id: kits.credits
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - { id: credits, kind: roll, tags: [creation], parts: [{ dice: 2d6 }] }
8
+ - id: gear
9
+ kind: changes
10
+ changes:
11
+ - { type: set, field: credits.current, value: steps.credits.total * 100 }
@@ -0,0 +1,16 @@
1
+ id: kits.gunslinger
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.laser-pistol'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.armored-undersuit'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'weapons.monoblade-knife'", equipped: true } }
13
+ - { type: addItem, entry: { item: "'gear.power-cell-a'", quantity: 8 } }
14
+ - { type: addItem, entry: { item: "'gear.backpack-tl0'", equipped: true } }
15
+ - { type: addItem, entry: { item: "'gear.compad'" } }
16
+ - { type: set, field: credits.current, value: 100 }
@@ -0,0 +1,18 @@
1
+ id: kits.hacker
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.laser-pistol'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.secure-clothing'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'gear.postech-toolkit'" } }
13
+ - { type: addItem, entry: { item: "'gear.spare-parts'", quantity: 3 } }
14
+ - { type: addItem, entry: { item: "'gear.power-cell-a'", quantity: 2 } }
15
+ - { type: addItem, entry: { item: "'gear.dataslab'" } }
16
+ - { type: addItem, entry: { item: "'gear.metatool'" } }
17
+ - { type: addItem, entry: { item: "'gear.line-shunt'", quantity: 2 } }
18
+ - { type: set, field: credits.current, value: 100 }
@@ -0,0 +1,18 @@
1
+ id: kits.medic
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.laser-pistol'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.secure-clothing'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'gear.lazarus-patch'", quantity: 4 } }
13
+ - { type: addItem, entry: { item: "'gear.lift'", quantity: 2 } }
14
+ - { type: addItem, entry: { item: "'gear.backpack-tl0'", equipped: true } }
15
+ - { type: addItem, entry: { item: "'gear.medkit'" } }
16
+ - { type: addItem, entry: { item: "'gear.compad'" } }
17
+ - { type: addItem, entry: { item: "'gear.bioscanner'" } }
18
+ - { type: set, field: credits.current, value: 25 }
@@ -0,0 +1,19 @@
1
+ id: kits.scout
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.laser-rifle'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.armored-vacc-suit'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'weapons.knife'", equipped: true } }
13
+ - { type: addItem, entry: { item: "'gear.survey-scanner'" } }
14
+ - { type: addItem, entry: { item: "'gear.survival-kit'" } }
15
+ - { type: addItem, entry: { item: "'gear.binoculars-tl3'" } }
16
+ - { type: addItem, entry: { item: "'gear.power-cell-a'", quantity: 8 } }
17
+ - { type: addItem, entry: { item: "'gear.backpack-tl0'", equipped: true } }
18
+ - { type: addItem, entry: { item: "'gear.compad'" } }
19
+ - { type: set, field: credits.current, value: 25 }
@@ -0,0 +1,16 @@
1
+ id: kits.soldier
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.combat-rifle'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.woven-body-armor'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'weapons.knife'", equipped: true } }
13
+ - { type: addItem, entry: { item: "'gear.ammo-20-rounds'", quantity: 4 } }
14
+ - { type: addItem, entry: { item: "'gear.backpack-tl0'", equipped: true } }
15
+ - { type: addItem, entry: { item: "'gear.compad'" } }
16
+ - { type: set, field: credits.current, value: 100 }
@@ -0,0 +1,19 @@
1
+ id: kits.technician
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.laser-pistol'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.armored-undersuit'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'weapons.monoblade-knife'", equipped: true } }
13
+ - { type: addItem, entry: { item: "'gear.postech-toolkit'" } }
14
+ - { type: addItem, entry: { item: "'gear.spare-parts'", quantity: 6 } }
15
+ - { type: addItem, entry: { item: "'gear.power-cell-a'", quantity: 4 } }
16
+ - { type: addItem, entry: { item: "'gear.backpack-tl0'", equipped: true } }
17
+ - { type: addItem, entry: { item: "'gear.dataslab'" } }
18
+ - { type: addItem, entry: { item: "'gear.metatool'" } }
19
+ - { type: set, field: credits.current, value: 200 }
@@ -0,0 +1,19 @@
1
+ id: kits.thief
2
+ type: kit
3
+ actions:
4
+ - id: unpack
5
+ listed: false
6
+ steps:
7
+ - id: gear
8
+ kind: changes
9
+ changes:
10
+ - { type: addItem, entry: { item: "'weapons.laser-pistol'", equipped: true } }
11
+ - { type: addItem, entry: { item: "'armor.armored-undersuit'", equipped: true } }
12
+ - { type: addItem, entry: { item: "'weapons.monoblade-knife'", equipped: true } }
13
+ - { type: addItem, entry: { item: "'gear.climbing-harness'" } }
14
+ - { type: addItem, entry: { item: "'gear.low-light-goggles'" } }
15
+ - { type: addItem, entry: { item: "'gear.power-cell-a'", quantity: 2 } }
16
+ - { type: addItem, entry: { item: "'gear.backpack-tl0'", equipped: true } }
17
+ - { type: addItem, entry: { item: "'gear.compad'" } }
18
+ - { type: addItem, entry: { item: "'gear.metatool'" } }
19
+ - { type: set, field: credits.current, value: 25 }
@@ -10,9 +10,7 @@ choices:
10
10
  effects:
11
11
  - { target: psionics.discipline, op: set, value: pick.value }
12
12
  grants:
13
- - { item: techniques.psychic-succor, when: skills.biopsionics.level >= 0 }
14
- - { item: techniques.psychic-refinement, when: skills.metapsionics.level >= 0 }
15
- - { item: techniques.oracle, when: skills.precognition.level >= 0 }
16
- - { item: techniques.telekinetic-manipulation, when: skills.telekinesis.level >= 0 }
17
- - { item: techniques.telepathic-contact, when: skills.telepathy.level >= 0 }
18
- - { item: techniques.personal-apportation, when: skills.teleportation.level >= 0 }
13
+ # Each discipline the psychic has grants its core technique, an add-on's discipline too.
14
+ - forEach: keysOf('psychic')
15
+ when: "fieldOf('skills.{psychic}.level', x) >= 0"
16
+ item: { query: { type: technique, where: item.core && item.discipline == x } }
@@ -0,0 +1,11 @@
1
+ id: styles.expert-nimble
2
+ type: style
3
+ fields:
4
+ class: classes.expert
5
+ table: 2
6
+ str: 10
7
+ dex: 14
8
+ con: 12
9
+ int: 11
10
+ wis: 9
11
+ cha: 7
@@ -0,0 +1,11 @@
1
+ id: styles.expert-smart
2
+ type: style
3
+ fields:
4
+ class: classes.expert
5
+ table: 0
6
+ str: 10
7
+ dex: 12
8
+ con: 11
9
+ int: 14
10
+ wis: 7
11
+ cha: 9
@@ -0,0 +1,11 @@
1
+ id: styles.expert-smooth
2
+ type: style
3
+ fields:
4
+ class: classes.expert
5
+ table: 1
6
+ str: 7
7
+ dex: 9
8
+ con: 10
9
+ int: 12
10
+ wis: 11
11
+ cha: 14
@@ -0,0 +1,11 @@
1
+ id: styles.psychic-adept
2
+ type: style
3
+ fields:
4
+ class: classes.psychic
5
+ table: 7
6
+ str: 12
7
+ dex: 10
8
+ con: 14
9
+ int: 9
10
+ wis: 11
11
+ cha: 7
@@ -0,0 +1,11 @@
1
+ id: styles.psychic-seer
2
+ type: style
3
+ fields:
4
+ class: classes.psychic
5
+ table: 6
6
+ str: 9
7
+ dex: 11
8
+ con: 12
9
+ int: 10
10
+ wis: 14
11
+ cha: 7
@@ -0,0 +1,11 @@
1
+ id: styles.warrior-leader
2
+ type: style
3
+ fields:
4
+ class: classes.warrior
5
+ table: 5
6
+ str: 7
7
+ dex: 10
8
+ con: 9
9
+ int: 11
10
+ wis: 12
11
+ cha: 14
@@ -0,0 +1,11 @@
1
+ id: styles.warrior-melee
2
+ type: style
3
+ fields:
4
+ class: classes.warrior
5
+ table: 3
6
+ str: 14
7
+ dex: 9
8
+ con: 12
9
+ int: 7
10
+ wis: 10
11
+ cha: 11
@@ -0,0 +1,11 @@
1
+ id: styles.warrior-ranged
2
+ type: style
3
+ fields:
4
+ class: classes.warrior
5
+ table: 4
6
+ str: 9
7
+ dex: 14
8
+ con: 12
9
+ int: 10
10
+ wis: 7
11
+ cha: 11
@@ -6,15 +6,28 @@ fields:
6
6
  core: true
7
7
  actions:
8
8
  # Heals by Biopsionics level (level-0 only stabilizes) and adds System Strain to the target:
9
- # two points if they were mortally wounded. The Effort is the app's to Commit.
9
+ # two points if they were mortally wounded. The Effort is the app's to Commit. A target whose
10
+ # System Strain can't take it isn't helped.
10
11
  - id: succor
11
12
  tags: [psionics]
12
13
  params:
13
14
  mortallyWounded: { type: boolean, default: false }
14
15
  participants:
15
- target: { max: 1 }
16
- results: [healed]
16
+ target:
17
+ max: 1
18
+ fields:
19
+ strain.total: { type: integer }
20
+ strain.max: { type: integer }
21
+ results: [healed, failed]
17
22
  steps:
23
+ - id: strained
24
+ kind: outcome
25
+ when: >-
26
+ size(participants.target) > 0 && has(participants.target[0].strain.total)
27
+ && has(participants.target[0].strain.max)
28
+ && participants.target[0].strain.total + (params.mortallyWounded ? 2 : 1)
29
+ > participants.target[0].strain.max
30
+ result: "'failed'"
18
31
  - id: heal
19
32
  kind: roll
20
33
  when: skills.biopsionics.level >= 1
@@ -11,5 +11,3 @@ fields:
11
11
  cost: 50
12
12
  enc: 2
13
13
  techLevel: 3
14
- state:
15
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  heavy: true
15
15
  cost: 10000
16
16
  techLevel: 4
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  cost: 300
15
15
  enc: 2
16
16
  techLevel: 3
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  cost: 300
15
15
  enc: 2
16
16
  techLevel: 3
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -11,5 +11,3 @@ fields:
11
11
  cost: 500
12
12
  enc: 2
13
13
  techLevel: 4
14
- state:
15
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  cost: 20
15
15
  enc: 1
16
16
  techLevel: 2
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  cost: 1250
15
15
  enc: 2
16
16
  techLevel: 5
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -15,5 +15,3 @@ fields:
15
15
  cost: 5000
16
16
  enc: 3
17
17
  techLevel: 3
18
- state:
19
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  heavy: true
15
15
  cost: 20000
16
16
  techLevel: 4
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  cost: 200
15
15
  enc: 1
16
16
  techLevel: 4
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -15,5 +15,3 @@ fields:
15
15
  cost: 300
16
16
  enc: 2
17
17
  techLevel: 4
18
- state:
19
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -13,5 +13,3 @@ fields:
13
13
  cost: 400
14
14
  enc: 1
15
15
  techLevel: 4
16
- state:
17
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -13,5 +13,3 @@ fields:
13
13
  cost: 500
14
14
  enc: 2
15
15
  techLevel: 4
16
- state:
17
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  cost: 30
15
15
  enc: 2
16
16
  techLevel: 2
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -14,5 +14,3 @@ fields:
14
14
  cost: 400
15
15
  enc: 2
16
16
  techLevel: 4
17
- state:
18
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }
@@ -11,5 +11,3 @@ fields:
11
11
  cost: 15
12
12
  enc: 2
13
13
  techLevel: 1
14
- state:
15
- loaded: { type: integer, min: 0, max: item.magazine, default: item.magazine }