@opencharacter/5e-srd-5.1 0.1.0 → 0.3.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 (101) hide show
  1. package/README.md +58 -7
  2. package/content/backgrounds/acolyte.yaml +22 -0
  3. package/content/classes/barbarian.yaml +57 -0
  4. package/content/classes/bard.yaml +68 -0
  5. package/content/classes/cleric.yaml +83 -0
  6. package/content/classes/druid.yaml +61 -0
  7. package/content/classes/fighter.yaml +75 -0
  8. package/content/classes/monk.yaml +47 -0
  9. package/content/classes/paladin.yaml +76 -0
  10. package/content/classes/ranger.yaml +69 -0
  11. package/content/classes/rogue.yaml +59 -0
  12. package/content/classes/sorcerer.yaml +64 -0
  13. package/content/classes/warlock.yaml +71 -7
  14. package/content/classes/wizard.yaml +56 -0
  15. package/content/features/druid/natural-recovery.yaml +23 -45
  16. package/content/features/sorcerer/dragon-ancestor.yaml +1 -43
  17. package/content/features/sorcerer/elemental-affinity.yaml +29 -8
  18. package/content/features/sorcerer/metamagic.yaml +1 -93
  19. package/content/features/wizard/arcane-recovery.yaml +22 -67
  20. package/content/hunter-tactics/colossus-slayer.yaml +4 -0
  21. package/content/hunter-tactics/escape-the-horde.yaml +4 -0
  22. package/content/hunter-tactics/evasion.yaml +6 -0
  23. package/content/hunter-tactics/giant-killer.yaml +4 -0
  24. package/content/hunter-tactics/horde-breaker.yaml +4 -0
  25. package/content/hunter-tactics/multiattack-defense.yaml +4 -0
  26. package/content/hunter-tactics/stand-against-the-tide.yaml +4 -0
  27. package/content/hunter-tactics/steel-will.yaml +4 -0
  28. package/content/hunter-tactics/uncanny-dodge.yaml +6 -0
  29. package/content/hunter-tactics/volley.yaml +6 -0
  30. package/content/hunter-tactics/whirlwind-attack.yaml +6 -0
  31. package/content/invocations/bewitching-whispers.yaml +4 -2
  32. package/content/invocations/dreadful-word.yaml +4 -2
  33. package/content/invocations/eldritch-spear.yaml +3 -2
  34. package/content/invocations/minions-of-chaos.yaml +4 -2
  35. package/content/invocations/mire-the-mind.yaml +4 -2
  36. package/content/invocations/sculptor-of-flesh.yaml +4 -2
  37. package/content/invocations/sign-of-ill-omen.yaml +4 -2
  38. package/content/invocations/thief-of-five-fates.yaml +4 -2
  39. package/content/magic-items/arrow-of-slaying.yaml +1 -0
  40. package/content/magic-items/bag-of-holding.yaml +2 -0
  41. package/content/magic-items/efficient-quiver.yaml +2 -0
  42. package/content/magic-items/handy-haversack.yaml +2 -0
  43. package/content/magic-items/holy-avenger.yaml +9 -2
  44. package/content/magic-items/necklace-of-prayer-beads.yaml +1 -1
  45. package/content/magic-items/portable-hole.yaml +2 -0
  46. package/content/magic-items/ring-of-x-ray-vision.yaml +6 -0
  47. package/content/magic-items/robe-of-the-archmagi.yaml +1 -1
  48. package/content/magic-items/staff-of-charming.yaml +17 -12
  49. package/content/magic-items/staff-of-fire.yaml +9 -2
  50. package/content/magic-items/staff-of-frost.yaml +9 -2
  51. package/content/magic-items/staff-of-healing.yaml +9 -2
  52. package/content/magic-items/staff-of-power.yaml +2 -1
  53. package/content/magic-items/staff-of-swarming-insects.yaml +17 -12
  54. package/content/magic-items/staff-of-the-magi.yaml +2 -1
  55. package/content/magic-items/staff-of-the-python.yaml +7 -2
  56. package/content/magic-items/staff-of-the-woodlands.yaml +2 -1
  57. package/content/magic-items/staff-of-withering.yaml +9 -2
  58. package/content/metamagic/careful-spell.yaml +11 -0
  59. package/content/metamagic/distant-spell.yaml +11 -0
  60. package/content/metamagic/empowered-spell.yaml +22 -0
  61. package/content/metamagic/extended-spell.yaml +11 -0
  62. package/content/metamagic/heightened-spell.yaml +11 -0
  63. package/content/metamagic/quickened-spell.yaml +11 -0
  64. package/content/metamagic/subtle-spell.yaml +11 -0
  65. package/content/metamagic/twinned-spell.yaml +16 -0
  66. package/content/races/half-orc.yaml +0 -2
  67. package/content/races/tiefling.yaml +0 -3
  68. package/content/spells/death-ward.yaml +11 -0
  69. package/content/spells/eldritch-blast.yaml +1 -1
  70. package/content/subclasses/hunter.yaml +4 -29
  71. package/content/templates/eldritch-spear.yaml +4 -0
  72. package/content/traits/infernal-legacy.yaml +24 -2
  73. package/content/traits/relentless-endurance.yaml +11 -10
  74. package/content/weapons/javelin.yaml +1 -1
  75. package/dist/i18n/en.js +1 -1
  76. package/dist/i18n/en.json +301 -224
  77. package/dist/index.js +1 -1
  78. package/dist/release.json +6564 -7424
  79. package/i18n/en/monster-rules.yaml +1 -1
  80. package/i18n/en/type-fields.yaml +7 -0
  81. package/i18n/en.yaml +292 -246
  82. package/pack.yaml +2 -2
  83. package/package.json +2 -2
  84. package/rules/advancement.yaml +67 -38
  85. package/rules/checks.yaml +1 -1
  86. package/rules/classes.yaml +25 -4
  87. package/rules/combat.yaml +8 -2
  88. package/rules/conditions.yaml +1 -0
  89. package/rules/content-types.yaml +64 -4
  90. package/rules/core.yaml +6 -16
  91. package/rules/creation.yaml +26 -36
  92. package/rules/display.yaml +20 -11
  93. package/rules/equipment.yaml +13 -16
  94. package/rules/magic-items.yaml +19 -1
  95. package/rules/monsters.yaml +8 -2
  96. package/rules/rest.yaml +2 -73
  97. package/rules/spellcasting.yaml +1 -0
  98. package/rules/starting-equipment.yaml +17 -646
  99. package/rules/tags.yaml +12 -12
  100. package/upgrades/0.1.0-to-0.2.0.yaml +62 -0
  101. package/upgrades/0.2.0-to-0.3.0.yaml +152 -0
@@ -3,79 +3,34 @@ type: feature
3
3
  actions:
4
4
  - id: arcane-recovery
5
5
  tags: [feature]
6
- results: [too-many, recovered]
7
- available: '!self.arcaneRecoveryUsed'
8
- params:
9
- level1: { type: integer, optional: true }
10
- level2: { type: integer, optional: true }
11
- level3: { type: integer, optional: true }
12
- level4: { type: integer, optional: true }
13
- level5: { type: integer, optional: true }
6
+ results: [recovered]
7
+ available: >-
8
+ !self.arcaneRecoveryUsed
9
+ && spellSlots.level1.used + spellSlots.level2.used + spellSlots.level3.used
10
+ + spellSlots.level4.used + spellSlots.level5.used > 0
14
11
  steps:
15
- - id: counts
16
- kind: branch
17
- cases:
18
- - when: true
19
- flags:
20
- level1: 'has(params.level1) ? params.level1 : 0'
21
- level2: 'has(params.level2) ? params.level2 : 0'
22
- level3: 'has(params.level3) ? params.level3 : 0'
23
- level4: 'has(params.level4) ? params.level4 : 0'
24
- level5: 'has(params.level5) ? params.level5 : 0'
25
- - id: total
26
- kind: branch
27
- cases:
28
- - when: true
29
- flags:
30
- levels: flags.level1 + 2 * flags.level2 + 3 * flags.level3 + 4 * flags.level4 + 5 * flags.level5
31
- - id: tooMany
32
- kind: outcome
33
- when: >-
34
- flags.levels == 0 || flags.levels > ceil(self.level / 2)
35
- || flags.level1 < 0 || flags.level1 > spellSlots.level1.used
36
- || flags.level2 < 0 || flags.level2 > spellSlots.level2.used
37
- || flags.level3 < 0 || flags.level3 > spellSlots.level3.used
38
- || flags.level4 < 0 || flags.level4 > spellSlots.level4.used
39
- || flags.level5 < 0 || flags.level5 > spellSlots.level5.used
40
- result: "'too-many'"
41
- data:
42
- maxLevels: ceil(self.level / 2)
12
+ # One spent slot per pick, of 5th level or lower, while the levels fit under half the
13
+ # wizard level.
14
+ - id: slots
15
+ kind: choice
16
+ options:
17
+ values: [1, 2, 3, 4, 5]
18
+ where: >-
19
+ countList(steps.slots.values, x == value)
20
+ < fieldOf('spellSlots.level{slot}.used', value)
21
+ && sumList(steps.slots.values, x) + value <= ceil(self.level / 2)
22
+ repeat: { max: ceil(self.level / 2), min: 1 }
23
+ prefer: value
24
+ changes:
25
+ - type: adjust
26
+ field: { formula: "'spellSlots.level' + string(picked.value) + '.used'" }
27
+ by: -1
43
28
  - id: recover
44
29
  kind: changes
45
30
  changes:
46
31
  - { type: setState, entry: self, key: arcaneRecoveryUsed, value: true }
47
- - {
48
- type: adjust,
49
- field: spellSlots.level1.used,
50
- by: -flags.level1,
51
- when: flags.level1 > 0,
52
- }
53
- - {
54
- type: adjust,
55
- field: spellSlots.level2.used,
56
- by: -flags.level2,
57
- when: flags.level2 > 0,
58
- }
59
- - {
60
- type: adjust,
61
- field: spellSlots.level3.used,
62
- by: -flags.level3,
63
- when: flags.level3 > 0,
64
- }
65
- - {
66
- type: adjust,
67
- field: spellSlots.level4.used,
68
- by: -flags.level4,
69
- when: flags.level4 > 0,
70
- }
71
- - {
72
- type: adjust,
73
- field: spellSlots.level5.used,
74
- by: -flags.level5,
75
- when: flags.level5 > 0,
76
- }
77
32
  - id: result
78
33
  kind: outcome
79
34
  result: "'recovered'"
80
35
  data:
81
- levels: flags.levels
36
+ levels: sumList(steps.slots.values, x)
@@ -0,0 +1,4 @@
1
+ id: hunter-tactics.colossus-slayer
2
+ type: hunterTactic
3
+ fields:
4
+ feature: hunters-prey
@@ -0,0 +1,4 @@
1
+ id: hunter-tactics.escape-the-horde
2
+ type: hunterTactic
3
+ fields:
4
+ feature: defensive-tactics
@@ -0,0 +1,6 @@
1
+ id: hunter-tactics.evasion
2
+ type: hunterTactic
3
+ fields:
4
+ feature: superior-hunters-defense
5
+ grants:
6
+ - { item: features.evasion }
@@ -0,0 +1,4 @@
1
+ id: hunter-tactics.giant-killer
2
+ type: hunterTactic
3
+ fields:
4
+ feature: hunters-prey
@@ -0,0 +1,4 @@
1
+ id: hunter-tactics.horde-breaker
2
+ type: hunterTactic
3
+ fields:
4
+ feature: hunters-prey
@@ -0,0 +1,4 @@
1
+ id: hunter-tactics.multiattack-defense
2
+ type: hunterTactic
3
+ fields:
4
+ feature: defensive-tactics
@@ -0,0 +1,4 @@
1
+ id: hunter-tactics.stand-against-the-tide
2
+ type: hunterTactic
3
+ fields:
4
+ feature: superior-hunters-defense
@@ -0,0 +1,4 @@
1
+ id: hunter-tactics.steel-will
2
+ type: hunterTactic
3
+ fields:
4
+ feature: defensive-tactics
@@ -0,0 +1,6 @@
1
+ id: hunter-tactics.uncanny-dodge
2
+ type: hunterTactic
3
+ fields:
4
+ feature: superior-hunters-defense
5
+ grants:
6
+ - { item: features.rogue.uncanny-dodge }
@@ -0,0 +1,6 @@
1
+ id: hunter-tactics.volley
2
+ type: hunterTactic
3
+ fields:
4
+ feature: multiattack
5
+ grants:
6
+ - { item: features.ranger.volley }
@@ -0,0 +1,6 @@
1
+ id: hunter-tactics.whirlwind-attack
2
+ type: hunterTactic
3
+ fields:
4
+ feature: multiattack
5
+ grants:
6
+ - { item: features.ranger.whirlwind-attack }
@@ -1,5 +1,7 @@
1
1
  id: invocations.bewitching-whispers
2
2
  type: invocation
3
+ state:
4
+ used: { type: boolean, default: false }
3
5
  prerequisites:
4
6
  - id: level
5
7
  when: self.level >= 7
@@ -12,9 +14,9 @@ effects:
12
14
  op: option
13
15
  when: >-
14
16
  action.item.id == @spells.compulsion && flags.slot == pactSlots.level
15
- && pactSlots.used < pactSlots.max && !self.bewitchingWhispersUsed
17
+ && pactSlots.used < pactSlots.max && !self.used
16
18
  value:
17
19
  id: invocation
18
20
  changes:
19
21
  - { type: adjust, field: pactSlots.used, by: 1 }
20
- - { type: setState, entry: self, key: bewitchingWhispersUsed, value: true }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -1,5 +1,7 @@
1
1
  id: invocations.dreadful-word
2
2
  type: invocation
3
+ state:
4
+ used: { type: boolean, default: false }
3
5
  prerequisites:
4
6
  - id: level
5
7
  when: self.level >= 7
@@ -12,9 +14,9 @@ effects:
12
14
  op: option
13
15
  when: >-
14
16
  action.item.id == @spells.confusion && flags.slot == pactSlots.level
15
- && pactSlots.used < pactSlots.max && !self.dreadfulWordUsed
17
+ && pactSlots.used < pactSlots.max && !self.used
16
18
  value:
17
19
  id: invocation
18
20
  changes:
19
21
  - { type: adjust, field: pactSlots.used, by: 1 }
20
- - { type: setState, entry: self, key: dreadfulWordUsed, value: true }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -3,5 +3,6 @@ type: invocation
3
3
  prerequisites:
4
4
  - id: spell
5
5
  when: '@spells.eldritch-blast in spells.warlock'
6
- effects:
7
- - { target: eldritchBlast.range, op: atLeast, value: 300 }
6
+ keepsTemplates:
7
+ - template: templates.eldritch-spear
8
+ content: { type: spell, where: 'item.id == @spells.eldritch-blast' }
@@ -1,5 +1,7 @@
1
1
  id: invocations.minions-of-chaos
2
2
  type: invocation
3
+ state:
4
+ used: { type: boolean, default: false }
3
5
  prerequisites:
4
6
  - id: level
5
7
  when: self.level >= 9
@@ -12,9 +14,9 @@ effects:
12
14
  op: option
13
15
  when: >-
14
16
  action.item.id == @spells.conjure-elemental && flags.slot == pactSlots.level
15
- && pactSlots.used < pactSlots.max && !self.minionsOfChaosUsed
17
+ && pactSlots.used < pactSlots.max && !self.used
16
18
  value:
17
19
  id: invocation
18
20
  changes:
19
21
  - { type: adjust, field: pactSlots.used, by: 1 }
20
- - { type: setState, entry: self, key: minionsOfChaosUsed, value: true }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -1,5 +1,7 @@
1
1
  id: invocations.mire-the-mind
2
2
  type: invocation
3
+ state:
4
+ used: { type: boolean, default: false }
3
5
  prerequisites:
4
6
  - id: level
5
7
  when: self.level >= 5
@@ -12,9 +14,9 @@ effects:
12
14
  op: option
13
15
  when: >-
14
16
  action.item.id == @spells.slow && flags.slot == pactSlots.level
15
- && pactSlots.used < pactSlots.max && !self.mireTheMindUsed
17
+ && pactSlots.used < pactSlots.max && !self.used
16
18
  value:
17
19
  id: invocation
18
20
  changes:
19
21
  - { type: adjust, field: pactSlots.used, by: 1 }
20
- - { type: setState, entry: self, key: mireTheMindUsed, value: true }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -1,5 +1,7 @@
1
1
  id: invocations.sculptor-of-flesh
2
2
  type: invocation
3
+ state:
4
+ used: { type: boolean, default: false }
3
5
  prerequisites:
4
6
  - id: level
5
7
  when: self.level >= 7
@@ -12,9 +14,9 @@ effects:
12
14
  op: option
13
15
  when: >-
14
16
  action.item.id == @spells.polymorph && flags.slot == pactSlots.level
15
- && pactSlots.used < pactSlots.max && !self.sculptorOfFleshUsed
17
+ && pactSlots.used < pactSlots.max && !self.used
16
18
  value:
17
19
  id: invocation
18
20
  changes:
19
21
  - { type: adjust, field: pactSlots.used, by: 1 }
20
- - { type: setState, entry: self, key: sculptorOfFleshUsed, value: true }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -1,5 +1,7 @@
1
1
  id: invocations.sign-of-ill-omen
2
2
  type: invocation
3
+ state:
4
+ used: { type: boolean, default: false }
3
5
  prerequisites:
4
6
  - id: level
5
7
  when: self.level >= 5
@@ -12,9 +14,9 @@ effects:
12
14
  op: option
13
15
  when: >-
14
16
  action.item.id == @spells.bestow-curse && flags.slot == pactSlots.level
15
- && pactSlots.used < pactSlots.max && !self.signOfIllOmenUsed
17
+ && pactSlots.used < pactSlots.max && !self.used
16
18
  value:
17
19
  id: invocation
18
20
  changes:
19
21
  - { type: adjust, field: pactSlots.used, by: 1 }
20
- - { type: setState, entry: self, key: signOfIllOmenUsed, value: true }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -1,5 +1,7 @@
1
1
  id: invocations.thief-of-five-fates
2
2
  type: invocation
3
+ state:
4
+ used: { type: boolean, default: false }
3
5
  grants:
4
6
  - { item: spells.bane }
5
7
  effects:
@@ -9,9 +11,9 @@ effects:
9
11
  op: option
10
12
  when: >-
11
13
  action.item.id == @spells.bane && flags.slot == pactSlots.level
12
- && pactSlots.used < pactSlots.max && !self.thiefOfFiveFatesUsed
14
+ && pactSlots.used < pactSlots.max && !self.used
13
15
  value:
14
16
  id: invocation
15
17
  changes:
16
18
  - { type: adjust, field: pactSlots.used, by: 1 }
17
- - { type: setState, entry: self, key: thiefOfFiveFatesUsed, value: true }
19
+ - { type: setState, pick: owner, key: used, value: true }
@@ -7,6 +7,7 @@ fields: { rarity: very-rare }
7
7
  state:
8
8
  slays:
9
9
  type: enum
10
+ open: true
10
11
  values:
11
12
  [
12
13
  aberration,
@@ -4,3 +4,5 @@ fields:
4
4
  category: wondrous-item
5
5
  rarity: uncommon
6
6
  weight: 15
7
+ effects:
8
+ - { target: carrying.stowCapacity, op: add, value: 500 * self.quantity }
@@ -4,3 +4,5 @@ fields:
4
4
  category: wondrous-item
5
5
  rarity: uncommon
6
6
  weight: 2
7
+ effects:
8
+ - { target: carrying.quivers, op: add, value: self.quantity }
@@ -4,3 +4,5 @@ fields:
4
4
  category: wondrous-item
5
5
  rarity: rare
6
6
  weight: 5
7
+ effects:
8
+ - { target: carrying.stowCapacity, op: add, value: 120 * self.quantity }
@@ -1,8 +1,15 @@
1
1
  id: magic-items.holy-avenger
2
2
  type: template
3
- tags: [magic, attunement.paladin]
3
+ tags: [magic]
4
4
  appliesTo: { type: weapon, where: "'sword' in item.tags" }
5
- fields: { rarity: legendary, requiresAttunement: true, attackBonus: 3, damageBonus: 3 }
5
+ fields:
6
+ {
7
+ attunementClasses: [classes.paladin],
8
+ rarity: legendary,
9
+ requiresAttunement: true,
10
+ attackBonus: 3,
11
+ damageBonus: 3,
12
+ }
6
13
  effects:
7
14
  - target: { rolls: [damage], from: self }
8
15
  op: add
@@ -1,7 +1,7 @@
1
1
  id: magic-items.necklace-of-prayer-beads
2
2
  type: magicItem
3
- tags: [attunement.cleric, attunement.druid, attunement.paladin]
4
3
  fields:
4
+ attunementClasses: [classes.cleric, classes.druid, classes.paladin]
5
5
  category: wondrous-item
6
6
  rarity: rare
7
7
  requiresAttunement: true
@@ -3,3 +3,5 @@ type: magicItem
3
3
  fields:
4
4
  category: wondrous-item
5
5
  rarity: rare
6
+ effects:
7
+ - { target: carrying.stowUnlimited, op: set, value: true }
@@ -28,3 +28,9 @@ actions:
28
28
  - id: result
29
29
  kind: outcome
30
30
  result: "has(steps.save) && steps.save.result == 'failure' ? 'exhausted' : 'seeing'"
31
+ effects:
32
+ - target: { steps: [rest.long] }
33
+ op: changes
34
+ when: self.used
35
+ value:
36
+ changes: [{ type: setState, entry: self, key: used, value: false }]
@@ -1,7 +1,7 @@
1
1
  id: magic-items.robe-of-the-archmagi
2
2
  type: magicItem
3
- tags: [attunement.sorcerer, attunement.warlock, attunement.wizard]
4
3
  fields:
4
+ attunementClasses: [classes.sorcerer, classes.warlock, classes.wizard]
5
5
  category: wondrous-item
6
6
  rarity: legendary
7
7
  requiresAttunement: true
@@ -1,18 +1,23 @@
1
1
  id: magic-items.staff-of-charming
2
2
  type: template
3
- tags:
4
- [
5
- magic,
6
- staff,
7
- attunement.bard,
8
- attunement.cleric,
9
- attunement.druid,
10
- attunement.sorcerer,
11
- attunement.warlock,
12
- attunement.wizard,
13
- ]
3
+ tags: [magic, staff]
14
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
15
- fields: { rarity: rare, requiresAttunement: true, maxCharges: 10, recharge: 1d8 + 2 }
5
+ fields:
6
+ {
7
+ attunementClasses:
8
+ [
9
+ classes.bard,
10
+ classes.cleric,
11
+ classes.druid,
12
+ classes.sorcerer,
13
+ classes.warlock,
14
+ classes.wizard,
15
+ ],
16
+ rarity: rare,
17
+ requiresAttunement: true,
18
+ maxCharges: 10,
19
+ recharge: 1d8 + 2,
20
+ }
16
21
  state:
17
22
  charges: { type: integer, min: 0, max: item.maxCharges, default: item.maxCharges }
18
23
  grants:
@@ -1,8 +1,15 @@
1
1
  id: magic-items.staff-of-fire
2
2
  type: template
3
- tags: [magic, staff, attunement.druid, attunement.sorcerer, attunement.warlock, attunement.wizard]
3
+ tags: [magic, staff]
4
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
5
- fields: { rarity: very-rare, requiresAttunement: true, maxCharges: 10, recharge: 1d6 + 4 }
5
+ fields:
6
+ {
7
+ attunementClasses: [classes.druid, classes.sorcerer, classes.warlock, classes.wizard],
8
+ rarity: very-rare,
9
+ requiresAttunement: true,
10
+ maxCharges: 10,
11
+ recharge: 1d6 + 4,
12
+ }
6
13
  state:
7
14
  charges: { type: integer, min: 0, max: item.maxCharges, default: item.maxCharges }
8
15
  grants:
@@ -1,8 +1,15 @@
1
1
  id: magic-items.staff-of-frost
2
2
  type: template
3
- tags: [magic, staff, attunement.druid, attunement.sorcerer, attunement.warlock, attunement.wizard]
3
+ tags: [magic, staff]
4
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
5
- fields: { rarity: very-rare, requiresAttunement: true, maxCharges: 10, recharge: 1d6 + 4 }
5
+ fields:
6
+ {
7
+ attunementClasses: [classes.druid, classes.sorcerer, classes.warlock, classes.wizard],
8
+ rarity: very-rare,
9
+ requiresAttunement: true,
10
+ maxCharges: 10,
11
+ recharge: 1d6 + 4,
12
+ }
6
13
  state:
7
14
  charges: { type: integer, min: 0, max: item.maxCharges, default: item.maxCharges }
8
15
  grants:
@@ -1,8 +1,15 @@
1
1
  id: magic-items.staff-of-healing
2
2
  type: template
3
- tags: [magic, staff, attunement.bard, attunement.cleric, attunement.druid]
3
+ tags: [magic, staff]
4
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
5
- fields: { rarity: rare, requiresAttunement: true, maxCharges: 10, recharge: 1d6 + 4 }
5
+ fields:
6
+ {
7
+ attunementClasses: [classes.bard, classes.cleric, classes.druid],
8
+ rarity: rare,
9
+ requiresAttunement: true,
10
+ maxCharges: 10,
11
+ recharge: 1d6 + 4,
12
+ }
6
13
  state:
7
14
  charges: { type: integer, min: 0, max: item.maxCharges, default: item.maxCharges }
8
15
  grants:
@@ -1,9 +1,10 @@
1
1
  id: magic-items.staff-of-power
2
2
  type: template
3
- tags: [magic, staff, attunement.sorcerer, attunement.warlock, attunement.wizard]
3
+ tags: [magic, staff]
4
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
5
5
  fields:
6
6
  {
7
+ attunementClasses: [classes.sorcerer, classes.warlock, classes.wizard],
7
8
  rarity: very-rare,
8
9
  requiresAttunement: true,
9
10
  maxCharges: 20,
@@ -1,18 +1,23 @@
1
1
  id: magic-items.staff-of-swarming-insects
2
2
  type: template
3
- tags:
4
- [
5
- magic,
6
- staff,
7
- attunement.bard,
8
- attunement.cleric,
9
- attunement.druid,
10
- attunement.sorcerer,
11
- attunement.warlock,
12
- attunement.wizard,
13
- ]
3
+ tags: [magic, staff]
14
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
15
- fields: { rarity: rare, requiresAttunement: true, maxCharges: 10, recharge: 1d6 + 4 }
5
+ fields:
6
+ {
7
+ attunementClasses:
8
+ [
9
+ classes.bard,
10
+ classes.cleric,
11
+ classes.druid,
12
+ classes.sorcerer,
13
+ classes.warlock,
14
+ classes.wizard,
15
+ ],
16
+ rarity: rare,
17
+ requiresAttunement: true,
18
+ maxCharges: 10,
19
+ recharge: 1d6 + 4,
20
+ }
16
21
  state:
17
22
  charges: { type: integer, min: 0, max: item.maxCharges, default: item.maxCharges }
18
23
  grants:
@@ -1,9 +1,10 @@
1
1
  id: magic-items.staff-of-the-magi
2
2
  type: template
3
- tags: [magic, staff, attunement.sorcerer, attunement.warlock, attunement.wizard]
3
+ tags: [magic, staff]
4
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
5
5
  fields:
6
6
  {
7
+ attunementClasses: [classes.sorcerer, classes.warlock, classes.wizard],
7
8
  rarity: legendary,
8
9
  requiresAttunement: true,
9
10
  maxCharges: 50,
@@ -1,5 +1,10 @@
1
1
  id: magic-items.staff-of-the-python
2
2
  type: template
3
- tags: [magic, staff, attunement.cleric, attunement.druid, attunement.warlock]
3
+ tags: [magic, staff]
4
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
5
- fields: { rarity: uncommon, requiresAttunement: true }
5
+ fields:
6
+ {
7
+ attunementClasses: [classes.cleric, classes.druid, classes.warlock],
8
+ rarity: uncommon,
9
+ requiresAttunement: true,
10
+ }
@@ -1,9 +1,10 @@
1
1
  id: magic-items.staff-of-the-woodlands
2
2
  type: template
3
- tags: [magic, staff, attunement.druid]
3
+ tags: [magic, staff]
4
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
5
5
  fields:
6
6
  {
7
+ attunementClasses: [classes.druid],
7
8
  rarity: rare,
8
9
  requiresAttunement: true,
9
10
  maxCharges: 10,
@@ -1,8 +1,15 @@
1
1
  id: magic-items.staff-of-withering
2
2
  type: template
3
- tags: [magic, staff, attunement.cleric, attunement.druid, attunement.warlock]
3
+ tags: [magic, staff]
4
4
  appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
5
- fields: { rarity: rare, requiresAttunement: true, maxCharges: 3, recharge: 1d3 }
5
+ fields:
6
+ {
7
+ attunementClasses: [classes.cleric, classes.druid, classes.warlock],
8
+ rarity: rare,
9
+ requiresAttunement: true,
10
+ maxCharges: 3,
11
+ recharge: 1d3,
12
+ }
6
13
  state:
7
14
  charges: { type: integer, min: 0, max: item.maxCharges, default: item.maxCharges }
8
15
  effects:
@@ -0,0 +1,11 @@
1
+ id: metamagic.careful-spell
2
+ type: metamagic
3
+ effects:
4
+ - target: { choices: [metamagic] }
5
+ op: option
6
+ when: 'has(action.item.save) && sorcery.left >= 1'
7
+ value:
8
+ id: careful
9
+ flags: { metamagic: "'careful'" }
10
+ changes:
11
+ - { type: adjustState, entry: self, key: sorceryPointsSpent, by: 1 }
@@ -0,0 +1,11 @@
1
+ id: metamagic.distant-spell
2
+ type: metamagic
3
+ effects:
4
+ - target: { choices: [metamagic] }
5
+ op: option
6
+ when: 'sorcery.left >= 1'
7
+ value:
8
+ id: distant
9
+ flags: { metamagic: "'distant'" }
10
+ changes:
11
+ - { type: adjustState, entry: self, key: sorceryPointsSpent, by: 1 }