@opencharacter/5e-srd-5.1 0.2.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 (93) hide show
  1. package/README.md +53 -3
  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 -0
  14. package/content/classes/wizard.yaml +56 -0
  15. package/content/features/sorcerer/dragon-ancestor.yaml +1 -43
  16. package/content/features/sorcerer/elemental-affinity.yaml +29 -8
  17. package/content/features/sorcerer/metamagic.yaml +1 -93
  18. package/content/features/wizard/arcane-recovery.yaml +4 -4
  19. package/content/hunter-tactics/colossus-slayer.yaml +4 -0
  20. package/content/hunter-tactics/escape-the-horde.yaml +4 -0
  21. package/content/hunter-tactics/evasion.yaml +6 -0
  22. package/content/hunter-tactics/giant-killer.yaml +4 -0
  23. package/content/hunter-tactics/horde-breaker.yaml +4 -0
  24. package/content/hunter-tactics/multiattack-defense.yaml +4 -0
  25. package/content/hunter-tactics/stand-against-the-tide.yaml +4 -0
  26. package/content/hunter-tactics/steel-will.yaml +4 -0
  27. package/content/hunter-tactics/uncanny-dodge.yaml +6 -0
  28. package/content/hunter-tactics/volley.yaml +6 -0
  29. package/content/hunter-tactics/whirlwind-attack.yaml +6 -0
  30. package/content/invocations/bewitching-whispers.yaml +1 -6
  31. package/content/invocations/dreadful-word.yaml +1 -6
  32. package/content/invocations/minions-of-chaos.yaml +1 -6
  33. package/content/invocations/mire-the-mind.yaml +1 -6
  34. package/content/invocations/sculptor-of-flesh.yaml +1 -6
  35. package/content/invocations/sign-of-ill-omen.yaml +1 -6
  36. package/content/invocations/thief-of-five-fates.yaml +1 -6
  37. package/content/magic-items/arrow-of-slaying.yaml +1 -0
  38. package/content/magic-items/bag-of-holding.yaml +2 -0
  39. package/content/magic-items/efficient-quiver.yaml +2 -0
  40. package/content/magic-items/handy-haversack.yaml +2 -0
  41. package/content/magic-items/holy-avenger.yaml +9 -2
  42. package/content/magic-items/necklace-of-prayer-beads.yaml +1 -1
  43. package/content/magic-items/portable-hole.yaml +2 -0
  44. package/content/magic-items/ring-of-x-ray-vision.yaml +6 -0
  45. package/content/magic-items/robe-of-the-archmagi.yaml +1 -1
  46. package/content/magic-items/staff-of-charming.yaml +17 -12
  47. package/content/magic-items/staff-of-fire.yaml +9 -2
  48. package/content/magic-items/staff-of-frost.yaml +9 -2
  49. package/content/magic-items/staff-of-healing.yaml +9 -2
  50. package/content/magic-items/staff-of-power.yaml +2 -1
  51. package/content/magic-items/staff-of-swarming-insects.yaml +17 -12
  52. package/content/magic-items/staff-of-the-magi.yaml +2 -1
  53. package/content/magic-items/staff-of-the-python.yaml +7 -2
  54. package/content/magic-items/staff-of-the-woodlands.yaml +2 -1
  55. package/content/magic-items/staff-of-withering.yaml +9 -2
  56. package/content/metamagic/careful-spell.yaml +11 -0
  57. package/content/metamagic/distant-spell.yaml +11 -0
  58. package/content/metamagic/empowered-spell.yaml +22 -0
  59. package/content/metamagic/extended-spell.yaml +11 -0
  60. package/content/metamagic/heightened-spell.yaml +11 -0
  61. package/content/metamagic/quickened-spell.yaml +11 -0
  62. package/content/metamagic/subtle-spell.yaml +11 -0
  63. package/content/metamagic/twinned-spell.yaml +16 -0
  64. package/content/subclasses/hunter.yaml +4 -29
  65. package/content/traits/infernal-legacy.yaml +15 -2
  66. package/content/traits/relentless-endurance.yaml +6 -0
  67. package/content/weapons/javelin.yaml +1 -1
  68. package/dist/i18n/en.js +1 -1
  69. package/dist/i18n/en.json +277 -201
  70. package/dist/index.js +1 -1
  71. package/dist/release.json +5795 -5769
  72. package/i18n/en/monster-rules.yaml +1 -1
  73. package/i18n/en/type-fields.yaml +7 -0
  74. package/i18n/en.yaml +268 -223
  75. package/pack.yaml +2 -2
  76. package/package.json +2 -2
  77. package/rules/advancement.yaml +67 -38
  78. package/rules/checks.yaml +1 -1
  79. package/rules/classes.yaml +25 -3
  80. package/rules/combat.yaml +3 -2
  81. package/rules/conditions.yaml +1 -0
  82. package/rules/content-types.yaml +61 -4
  83. package/rules/core.yaml +6 -16
  84. package/rules/creation.yaml +20 -34
  85. package/rules/display.yaml +20 -5
  86. package/rules/equipment.yaml +13 -16
  87. package/rules/magic-items.yaml +19 -1
  88. package/rules/monsters.yaml +7 -1
  89. package/rules/rest.yaml +2 -36
  90. package/rules/spellcasting.yaml +1 -5
  91. package/rules/starting-equipment.yaml +17 -646
  92. package/rules/tags.yaml +12 -12
  93. package/upgrades/0.2.0-to-0.3.0.yaml +152 -0
@@ -19,9 +19,4 @@ effects:
19
19
  id: invocation
20
20
  changes:
21
21
  - { type: adjust, field: pactSlots.used, by: 1 }
22
- - {
23
- type: setState,
24
- picks: { where: 'item.id == @invocations.bewitching-whispers' },
25
- key: used,
26
- value: true,
27
- }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -19,9 +19,4 @@ effects:
19
19
  id: invocation
20
20
  changes:
21
21
  - { type: adjust, field: pactSlots.used, by: 1 }
22
- - {
23
- type: setState,
24
- picks: { where: 'item.id == @invocations.dreadful-word' },
25
- key: used,
26
- value: true,
27
- }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -19,9 +19,4 @@ effects:
19
19
  id: invocation
20
20
  changes:
21
21
  - { type: adjust, field: pactSlots.used, by: 1 }
22
- - {
23
- type: setState,
24
- picks: { where: 'item.id == @invocations.minions-of-chaos' },
25
- key: used,
26
- value: true,
27
- }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -19,9 +19,4 @@ effects:
19
19
  id: invocation
20
20
  changes:
21
21
  - { type: adjust, field: pactSlots.used, by: 1 }
22
- - {
23
- type: setState,
24
- picks: { where: 'item.id == @invocations.mire-the-mind' },
25
- key: used,
26
- value: true,
27
- }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -19,9 +19,4 @@ effects:
19
19
  id: invocation
20
20
  changes:
21
21
  - { type: adjust, field: pactSlots.used, by: 1 }
22
- - {
23
- type: setState,
24
- picks: { where: 'item.id == @invocations.sculptor-of-flesh' },
25
- key: used,
26
- value: true,
27
- }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -19,9 +19,4 @@ effects:
19
19
  id: invocation
20
20
  changes:
21
21
  - { type: adjust, field: pactSlots.used, by: 1 }
22
- - {
23
- type: setState,
24
- picks: { where: 'item.id == @invocations.sign-of-ill-omen' },
25
- key: used,
26
- value: true,
27
- }
22
+ - { type: setState, pick: owner, key: used, value: true }
@@ -16,9 +16,4 @@ effects:
16
16
  id: invocation
17
17
  changes:
18
18
  - { type: adjust, field: pactSlots.used, by: 1 }
19
- - {
20
- type: setState,
21
- picks: { where: 'item.id == @invocations.thief-of-five-fates' },
22
- key: used,
23
- value: true,
24
- }
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 }
@@ -0,0 +1,22 @@
1
+ id: metamagic.empowered-spell
2
+ type: metamagic
3
+ # Rerolls, once, the lowest damage dice at or below half their faces, up to the Charisma modifier
4
+ # (at least one).
5
+ effects:
6
+ - target: { rolls: [damage.spell] }
7
+ op: rollModifier
8
+ value:
9
+ kind: reroll
10
+ below: 'floor(maxOf(dieOf(roll.item.damage)) / 2)'
11
+ once: true
12
+ count: max(1, abilities.cha.mod)
13
+ when: >-
14
+ has(flags.metamagic) && flags.metamagic == 'empowered' && has(roll.item.damage)
15
+ - target: { choices: [metamagic] }
16
+ op: option
17
+ when: 'has(action.item.damage) && sorcery.left >= 1'
18
+ value:
19
+ id: empowered
20
+ flags: { metamagic: "'empowered'" }
21
+ changes:
22
+ - { type: adjustState, entry: self, key: sorceryPointsSpent, by: 1 }
@@ -0,0 +1,11 @@
1
+ id: metamagic.extended-spell
2
+ type: metamagic
3
+ effects:
4
+ - target: { choices: [metamagic] }
5
+ op: option
6
+ when: 'sorcery.left >= 1'
7
+ value:
8
+ id: extended
9
+ flags: { metamagic: "'extended'" }
10
+ changes:
11
+ - { type: adjustState, entry: self, key: sorceryPointsSpent, by: 1 }
@@ -0,0 +1,11 @@
1
+ id: metamagic.heightened-spell
2
+ type: metamagic
3
+ effects:
4
+ - target: { choices: [metamagic] }
5
+ op: option
6
+ when: 'has(action.item.save) && sorcery.left >= 3'
7
+ value:
8
+ id: heightened
9
+ flags: { metamagic: "'heightened'" }
10
+ changes:
11
+ - { type: adjustState, entry: self, key: sorceryPointsSpent, by: 3 }
@@ -0,0 +1,11 @@
1
+ id: metamagic.quickened-spell
2
+ type: metamagic
3
+ effects:
4
+ - target: { choices: [metamagic] }
5
+ op: option
6
+ when: 'sorcery.left >= 2'
7
+ value:
8
+ id: quickened
9
+ flags: { metamagic: "'quickened'" }
10
+ changes:
11
+ - { type: adjustState, entry: self, key: sorceryPointsSpent, by: 2 }
@@ -0,0 +1,11 @@
1
+ id: metamagic.subtle-spell
2
+ type: metamagic
3
+ effects:
4
+ - target: { choices: [metamagic] }
5
+ op: option
6
+ when: 'sorcery.left >= 1'
7
+ value:
8
+ id: subtle
9
+ flags: { metamagic: "'subtle'" }
10
+ changes:
11
+ - { type: adjustState, entry: self, key: sorceryPointsSpent, by: 1 }
@@ -0,0 +1,16 @@
1
+ id: metamagic.twinned-spell
2
+ type: metamagic
3
+ effects:
4
+ - target: { choices: [metamagic] }
5
+ op: option
6
+ when: 'sorcery.left >= max(1, action.item.level)'
7
+ value:
8
+ id: twinned
9
+ flags: { metamagic: "'twinned'" }
10
+ changes:
11
+ - {
12
+ type: adjustState,
13
+ entry: self,
14
+ key: sorceryPointsSpent,
15
+ by: 'max(1, action.item.level)',
16
+ }
@@ -4,39 +4,14 @@ fields:
4
4
  class: classes.ranger
5
5
  choices:
6
6
  - id: hunters-prey
7
- from:
8
- options:
9
- - id: colossus-slayer
10
- effects:
11
- - { target: hunter.colossusSlayer, op: set, value: true }
12
- - { id: giant-killer }
13
- - { id: horde-breaker }
7
+ from: { type: hunterTactic, where: "item.feature == 'hunters-prey'" }
14
8
  when: self.level >= 3
15
9
  - id: defensive-tactics
16
- from:
17
- options:
18
- - { id: escape-the-horde }
19
- - { id: multiattack-defense }
20
- - { id: steel-will }
10
+ from: { type: hunterTactic, where: "item.feature == 'defensive-tactics'" }
21
11
  when: self.level >= 7
22
12
  - id: multiattack
23
- from:
24
- options:
25
- - id: volley
26
- grants:
27
- - { item: features.ranger.volley }
28
- - id: whirlwind-attack
29
- grants:
30
- - { item: features.ranger.whirlwind-attack }
13
+ from: { type: hunterTactic, where: "item.feature == 'multiattack'" }
31
14
  when: self.level >= 11
32
15
  - id: superior-hunters-defense
33
- from:
34
- options:
35
- - id: evasion
36
- grants:
37
- - { item: features.evasion }
38
- - { id: stand-against-the-tide }
39
- - id: uncanny-dodge
40
- grants:
41
- - { item: features.rogue.uncanny-dodge }
16
+ from: { type: hunterTactic, where: "item.feature == 'superior-hunters-defense'" }
42
17
  when: self.level >= 15
@@ -7,6 +7,19 @@ state:
7
7
  # passed and even when a class knows the spell. A spell no class knows is also in spells.limited, so
8
8
  # no slot is offered for it.
9
9
  effects:
10
+ - target: { steps: [rest.long] }
11
+ op: changes
12
+ when: self.hellishRebukeUsed || self.darknessUsed
13
+ value:
14
+ changes:
15
+ - {
16
+ type: setState,
17
+ grant: owner,
18
+ key: hellishRebukeUsed,
19
+ value: false,
20
+ when: self.hellishRebukeUsed,
21
+ }
22
+ - { type: setState, grant: owner, key: darknessUsed, value: false, when: self.darknessUsed }
10
23
  - { target: spellcasting.racial.mod, op: set, value: abilities.cha.mod }
11
24
  - { target: spellcasting.racial.dc, op: set, value: 8 + proficiency.bonus + abilities.cha.mod }
12
25
  - { target: spellcasting.racial.attack, op: set, value: proficiency.bonus + abilities.cha.mod }
@@ -45,7 +58,7 @@ effects:
45
58
  flags: { slot: 2, castAbility: "'cha'" }
46
59
  changes:
47
60
  - type: setState
48
- grants: { where: 'item.id == @traits.infernal-legacy' }
61
+ grant: owner
49
62
  key: hellishRebukeUsed
50
63
  value: true
51
64
  - target: { choices: [spell-cost] }
@@ -57,7 +70,7 @@ effects:
57
70
  flags: { slot: 2, castAbility: "'cha'" }
58
71
  changes:
59
72
  - type: setState
60
- grants: { where: 'item.id == @traits.infernal-legacy' }
73
+ grant: owner
61
74
  key: darknessUsed
62
75
  value: true
63
76
  grants:
@@ -21,3 +21,9 @@ actions:
21
21
  - id: result
22
22
  kind: outcome
23
23
  result: "'endured'"
24
+ effects:
25
+ - target: { steps: [rest.long] }
26
+ op: changes
27
+ when: self.used
28
+ value:
29
+ changes: [{ type: setState, grant: owner, key: used, value: false }]
@@ -1,6 +1,6 @@
1
1
  id: weapons.javelin
2
2
  type: weapon
3
- tags: [simple, melee, thrown, property.range]
3
+ tags: [simple, melee, thrown, property.range, quiver.javelin]
4
4
  fields:
5
5
  category: simple
6
6
  range: melee