@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
@@ -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
+ }
@@ -3,8 +3,6 @@ type: race
3
3
  fields:
4
4
  speed: 30
5
5
  size: medium
6
- state:
7
- relentlessEnduranceUsed: { type: boolean, default: false }
8
6
  effects:
9
7
  - { target: abilities.str.base, op: add, value: 2 }
10
8
  - { target: abilities.con.base, op: add, value: 1 }
@@ -3,9 +3,6 @@ type: race
3
3
  fields:
4
4
  speed: 30
5
5
  size: medium
6
- state:
7
- hellishRebukeUsed: { type: boolean, default: false }
8
- darknessUsed: { type: boolean, default: false }
9
6
  effects:
10
7
  - { target: abilities.int.base, op: add, value: 1 }
11
8
  - { target: abilities.cha.base, op: add, value: 2 }
@@ -11,5 +11,16 @@ fields:
11
11
  material: false
12
12
  durationUnit: hour
13
13
  durationAmount: 8
14
+ applied: true
14
15
  actions:
15
16
  - use: cast-spell
17
+ effects:
18
+ - id: ward
19
+ target: { incoming: { fields: [hp.current], tags: [damage] } }
20
+ op: atLeast
21
+ value: -(hp.current + hp.temp - 1)
22
+ when: hp.current > 0 && hp.current + hp.temp + incoming.amount <= 0
23
+ scope: applied
24
+ duration: { amount: 8, unit: hour }
25
+ then:
26
+ - { type: removeEffect, entry: self }
@@ -65,5 +65,5 @@ actions:
65
65
  data:
66
66
  critical: flags.critical
67
67
  attack: steps.attack.total
68
- range: eldritchBlast.range
68
+ range: item.range
69
69
  push: 'has(steps.damage) ? eldritchBlast.push : 0'
@@ -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
@@ -0,0 +1,4 @@
1
+ id: templates.eldritch-spear
2
+ type: template
3
+ appliesTo: { type: spell }
4
+ fields: { range: 300 }
@@ -1,9 +1,25 @@
1
1
  id: traits.infernal-legacy
2
2
  type: trait
3
+ state:
4
+ hellishRebukeUsed: { type: boolean, default: false }
5
+ darknessUsed: { type: boolean, default: false }
3
6
  # The option casts at 2nd level with Charisma (`slot` and `castAbility`), whatever slot the app
4
7
  # passed and even when a class knows the spell. A spell no class knows is also in spells.limited, so
5
8
  # no slot is offered for it.
6
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 }
7
23
  - { target: spellcasting.racial.mod, op: set, value: abilities.cha.mod }
8
24
  - { target: spellcasting.racial.dc, op: set, value: 8 + proficiency.bonus + abilities.cha.mod }
9
25
  - { target: spellcasting.racial.attack, op: set, value: proficiency.bonus + abilities.cha.mod }
@@ -41,7 +57,10 @@ effects:
41
57
  id: hellish-rebuke
42
58
  flags: { slot: 2, castAbility: "'cha'" }
43
59
  changes:
44
- - { type: setState, entry: self, key: hellishRebukeUsed, value: true }
60
+ - type: setState
61
+ grant: owner
62
+ key: hellishRebukeUsed
63
+ value: true
45
64
  - target: { choices: [spell-cost] }
46
65
  op: option
47
66
  when: >-
@@ -50,7 +69,10 @@ effects:
50
69
  id: darkness
51
70
  flags: { slot: 2, castAbility: "'cha'" }
52
71
  changes:
53
- - { type: setState, entry: self, key: darknessUsed, value: true }
72
+ - type: setState
73
+ grant: owner
74
+ key: darknessUsed
75
+ value: true
54
76
  grants:
55
77
  - item: spells.thaumaturgy
56
78
  - item: spells.hellish-rebuke
@@ -1,28 +1,29 @@
1
1
  id: traits.relentless-endurance
2
2
  type: trait
3
+ state:
4
+ used: { type: boolean, default: false }
3
5
  followUps:
4
6
  - id: relentless-endurance
5
7
  becomes: hp.current == 0
6
- when: >-
7
- countCopies(has(copy.state.relentlessEnduranceUsed)
8
- && !copy.state.relentlessEnduranceUsed) > 0
8
+ when: '!self.used'
9
9
  action: relentless-endurance
10
10
  actions:
11
11
  - id: relentless-endurance
12
12
  tags: [feature]
13
13
  results: [endured]
14
- available: >-
15
- hp.current == 0 && countCopies(has(copy.state.relentlessEnduranceUsed)
16
- && !copy.state.relentlessEnduranceUsed) > 0
14
+ available: hp.current == 0 && !self.used
17
15
  steps:
18
16
  - id: endure
19
17
  kind: changes
20
18
  changes:
21
19
  - { type: set, field: hp.current, value: 1 }
22
- - type: setState
23
- copies: { type: race, where: has(self.relentlessEnduranceUsed) }
24
- key: relentlessEnduranceUsed
25
- value: true
20
+ - { type: setState, grant: self, key: used, value: true }
26
21
  - id: result
27
22
  kind: outcome
28
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