@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.
- package/README.md +53 -3
- package/content/backgrounds/acolyte.yaml +22 -0
- package/content/classes/barbarian.yaml +57 -0
- package/content/classes/bard.yaml +68 -0
- package/content/classes/cleric.yaml +83 -0
- package/content/classes/druid.yaml +61 -0
- package/content/classes/fighter.yaml +75 -0
- package/content/classes/monk.yaml +47 -0
- package/content/classes/paladin.yaml +76 -0
- package/content/classes/ranger.yaml +69 -0
- package/content/classes/rogue.yaml +59 -0
- package/content/classes/sorcerer.yaml +64 -0
- package/content/classes/warlock.yaml +71 -0
- package/content/classes/wizard.yaml +56 -0
- package/content/features/sorcerer/dragon-ancestor.yaml +1 -43
- package/content/features/sorcerer/elemental-affinity.yaml +29 -8
- package/content/features/sorcerer/metamagic.yaml +1 -93
- package/content/features/wizard/arcane-recovery.yaml +4 -4
- package/content/hunter-tactics/colossus-slayer.yaml +4 -0
- package/content/hunter-tactics/escape-the-horde.yaml +4 -0
- package/content/hunter-tactics/evasion.yaml +6 -0
- package/content/hunter-tactics/giant-killer.yaml +4 -0
- package/content/hunter-tactics/horde-breaker.yaml +4 -0
- package/content/hunter-tactics/multiattack-defense.yaml +4 -0
- package/content/hunter-tactics/stand-against-the-tide.yaml +4 -0
- package/content/hunter-tactics/steel-will.yaml +4 -0
- package/content/hunter-tactics/uncanny-dodge.yaml +6 -0
- package/content/hunter-tactics/volley.yaml +6 -0
- package/content/hunter-tactics/whirlwind-attack.yaml +6 -0
- package/content/invocations/bewitching-whispers.yaml +1 -6
- package/content/invocations/dreadful-word.yaml +1 -6
- package/content/invocations/minions-of-chaos.yaml +1 -6
- package/content/invocations/mire-the-mind.yaml +1 -6
- package/content/invocations/sculptor-of-flesh.yaml +1 -6
- package/content/invocations/sign-of-ill-omen.yaml +1 -6
- package/content/invocations/thief-of-five-fates.yaml +1 -6
- package/content/magic-items/arrow-of-slaying.yaml +1 -0
- package/content/magic-items/bag-of-holding.yaml +2 -0
- package/content/magic-items/efficient-quiver.yaml +2 -0
- package/content/magic-items/handy-haversack.yaml +2 -0
- package/content/magic-items/holy-avenger.yaml +9 -2
- package/content/magic-items/necklace-of-prayer-beads.yaml +1 -1
- package/content/magic-items/portable-hole.yaml +2 -0
- package/content/magic-items/ring-of-x-ray-vision.yaml +6 -0
- package/content/magic-items/robe-of-the-archmagi.yaml +1 -1
- package/content/magic-items/staff-of-charming.yaml +17 -12
- package/content/magic-items/staff-of-fire.yaml +9 -2
- package/content/magic-items/staff-of-frost.yaml +9 -2
- package/content/magic-items/staff-of-healing.yaml +9 -2
- package/content/magic-items/staff-of-power.yaml +2 -1
- package/content/magic-items/staff-of-swarming-insects.yaml +17 -12
- package/content/magic-items/staff-of-the-magi.yaml +2 -1
- package/content/magic-items/staff-of-the-python.yaml +7 -2
- package/content/magic-items/staff-of-the-woodlands.yaml +2 -1
- package/content/magic-items/staff-of-withering.yaml +9 -2
- package/content/metamagic/careful-spell.yaml +11 -0
- package/content/metamagic/distant-spell.yaml +11 -0
- package/content/metamagic/empowered-spell.yaml +22 -0
- package/content/metamagic/extended-spell.yaml +11 -0
- package/content/metamagic/heightened-spell.yaml +11 -0
- package/content/metamagic/quickened-spell.yaml +11 -0
- package/content/metamagic/subtle-spell.yaml +11 -0
- package/content/metamagic/twinned-spell.yaml +16 -0
- package/content/subclasses/hunter.yaml +4 -29
- package/content/traits/infernal-legacy.yaml +15 -2
- package/content/traits/relentless-endurance.yaml +6 -0
- package/content/weapons/javelin.yaml +1 -1
- package/dist/i18n/en.js +1 -1
- package/dist/i18n/en.json +277 -201
- package/dist/index.js +1 -1
- package/dist/release.json +5795 -5769
- package/i18n/en/monster-rules.yaml +1 -1
- package/i18n/en/type-fields.yaml +7 -0
- package/i18n/en.yaml +268 -223
- package/pack.yaml +2 -2
- package/package.json +2 -2
- package/rules/advancement.yaml +67 -38
- package/rules/checks.yaml +1 -1
- package/rules/classes.yaml +25 -3
- package/rules/combat.yaml +3 -2
- package/rules/conditions.yaml +1 -0
- package/rules/content-types.yaml +61 -4
- package/rules/core.yaml +6 -16
- package/rules/creation.yaml +20 -34
- package/rules/display.yaml +20 -5
- package/rules/equipment.yaml +13 -16
- package/rules/magic-items.yaml +19 -1
- package/rules/monsters.yaml +7 -1
- package/rules/rest.yaml +2 -36
- package/rules/spellcasting.yaml +1 -5
- package/rules/starting-equipment.yaml +17 -646
- package/rules/tags.yaml +12 -12
- 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 }
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
id: magic-items.holy-avenger
|
|
2
2
|
type: template
|
|
3
|
-
tags: [magic
|
|
3
|
+
tags: [magic]
|
|
4
4
|
appliesTo: { type: weapon, where: "'sword' in item.tags" }
|
|
5
|
-
fields:
|
|
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
|
|
@@ -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:
|
|
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
|
|
3
|
+
tags: [magic, staff]
|
|
4
4
|
appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
|
|
5
|
-
fields:
|
|
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
|
|
3
|
+
tags: [magic, staff]
|
|
4
4
|
appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
|
|
5
|
-
fields:
|
|
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
|
|
3
|
+
tags: [magic, staff]
|
|
4
4
|
appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
|
|
5
|
-
fields:
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
3
|
+
tags: [magic, staff]
|
|
4
4
|
appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
|
|
5
|
-
fields:
|
|
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
|
|
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
|
|
3
|
+
tags: [magic, staff]
|
|
4
4
|
appliesTo: { type: weapon, where: 'item.id == @weapons.quarterstaff' }
|
|
5
|
-
fields:
|
|
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
|
-
|
|
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
|
-
|
|
73
|
+
grant: owner
|
|
61
74
|
key: darknessUsed
|
|
62
75
|
value: true
|
|
63
76
|
grants:
|