pf2e-spellbook 1.0.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/LICENSE ADDED
@@ -0,0 +1,30 @@
1
+ This LICENSE applies to the application CODE of pf2e-spellbook only.
2
+
3
+ The Pathfinder spell content bundled in this package (data/spells.generated.js
4
+ and the inlined copy in dist/index.html) is owned by Paizo Inc. and is licensed
5
+ separately under the ORC and OGL licenses. The MIT grant below does NOT cover
6
+ that content. See notice.md for those terms and the required attribution.
7
+
8
+ ----------------------------------------------------------------------
9
+
10
+ MIT License
11
+
12
+ Copyright (c) 2026 Whyte Erminae
13
+
14
+ Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ of this software and associated documentation files (the "Software"), to deal
16
+ in the Software without restriction, including without limitation the rights
17
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ copies of the Software, and to permit persons to whom the Software is
19
+ furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be included in all
22
+ copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,196 @@
1
+ # PF2e Spellbook
2
+
3
+ An interactive, mobile-first Pathfinder 2e (Remaster) spellbook for players.
4
+ Pick your class, prepare your day's spells, and track your castings during play —
5
+ all in a single offline HTML file you can text to a player.
6
+
7
+ Grew out of the original single-class `clerictest.html`. Now data-driven: spell
8
+ data is shared across the four magical traditions and each class is a config object.
9
+
10
+ ## Status
11
+
12
+ All ten spellcasting classes are playable end-to-end (levels 1–20): prepare / build a
13
+ repertoire, track castings, and manage **focus spells**.
14
+
15
+ | Class | Tradition | Casting | Class features modelled |
16
+ |-------|-----------|---------|--------------------------|
17
+ | **Cleric** | Divine | prepared (full) | Divine Font · domain focus spells |
18
+ | **Wizard** | Arcane | prepared (full) | Arcane school slot (+1/rank) · Drain Bonded Item · school focus |
19
+ | **Druid** | Primal | prepared (full) | order focus spells |
20
+ | **Witch** | patron's choice | prepared (full) | patron-tradition selector · hexes (focus) |
21
+ | **Sorcerer** | bloodline's | spontaneous (full) | bloodline→tradition · signature spells · bloodline focus |
22
+ | **Bard** | Occult | spontaneous (full) | signature spells · compositions (focus) |
23
+ | **Oracle** | Divine | spontaneous (full) | signature spells · revelations (focus) |
24
+ | **Magus** | Arcane | prepared (half) | top-two-rank slots · conflux focus spells |
25
+ | **Summoner** | eidolon's choice | spontaneous (half) | eidolon-tradition selector · signature · evolution focus |
26
+ | **Psychic** | Occult | spontaneous (2/rank) | psi cantrips + Amps (focus pool) · signature spells |
27
+
28
+ Slot tables verified against the Archives of Nethys "Spells per Day" tables; spell-DC
29
+ proficiency curves verified against the Foundry pf2e class data (full casters
30
+ expert@7/master@15/legendary@19; Magus & Summoner expert@9/master@17).
31
+
32
+ **Focus spells** are fully supported across all classes: a shared Focus-Point pool
33
+ (max 3), Refocus, auto-heightening, at-will focus cantrips, and a searchable
34
+ **focus checklist** (type your domain / bloodline / order to filter a long list).
35
+
36
+ ### At-the-table features
37
+
38
+ - **Computed effects at the cast rank.** Cast cards show the real dice for the rank
39
+ you're casting at (e.g. Fireball in a rank-5 slot shows **💥 10d6 fire**; Heal at
40
+ rank 2 shows **✚ 2d8**), for the ~380 spells with interval heightening.
41
+ - **Sustained-spell tracker.** Sustained spells get a ⏳ button; active ones show in a
42
+ "Sustaining now" bar so you don't forget to Sustain each turn.
43
+ - **Browse filters.** Filter the spell list by **save** (Fort/Reflex/Will/none),
44
+ **action cost**, and **trait** (e.g. "fire", "healing", "incapacitation").
45
+ - **Rituals browser** (📜 Rituals chip) — all 150 rituals with their primary/secondary
46
+ checks, available to any class.
47
+ - **Cleric doctrine** toggle (Cloistered / Warpriest) adjusts your spell DC correctly.
48
+
49
+ ### Rules editions (Remaster + legacy)
50
+
51
+ The app uses **Remaster** names and rules (matching the source data), but is built to
52
+ serve groups still on the **original/legacy** edition too:
53
+
54
+ - Mechanically the two editions are identical for what this app tracks (slot tables,
55
+ proficiency curves, spell DC, focus pools, casting models), so both are supported.
56
+ - Spells renamed in the Remaster carry a *"formerly …"* note and are **searchable by
57
+ their old name** (e.g. searching *Magic Missile* finds *Force Barrage*) — in Browse
58
+ and in the Prepare dropdowns. Old names are sourced from a verified alias map plus
59
+ auto-extraction of "(Remaster of X)" notes in the curated text.
60
+ - Legacy spells that were never changed remain listed under their original names.
61
+
62
+ App features: **multiple saved characters**, **export/import** a character as a
63
+ shareable code, **works fully offline**, **installable** as a PWA when hosted over
64
+ HTTPS (a service worker caches the app; the 👤 menu shows an **Install app** button
65
+ when the browser supports it), a **📥 Save offline copy** button that downloads the
66
+ whole spellbook as one keep-forever file, a built-in beginner Help guide, and a
67
+ **data version stamp** (in the 👤 menu).
68
+
69
+ All character and prepared-spell data lives in the browser's `localStorage` **on the
70
+ player's own device** — nothing is uploaded anywhere, and there is no account or
71
+ server. The 👤 menu states this plainly to reassure players.
72
+
73
+ Manual on the player's sheet (noted in-app): Spellstrike, the summoner's shared HP /
74
+ eidolon actions, Unleash Psyche, and a few subclass effects (blood magic, oracular
75
+ curse, companions/familiars).
76
+
77
+ ## Using it
78
+
79
+ Open `dist/index.html` in any browser — no server, no install, works offline. State
80
+ is saved in the browser's localStorage per device.
81
+
82
+ Players have three ways to keep it:
83
+
84
+ 1. **Just open the file.** Texted or downloaded, `dist/index.html` is fully
85
+ self-contained and runs offline from `file://`.
86
+ 2. **📥 Save offline copy** (in the 👤 menu) downloads the whole spellbook as a single
87
+ `pf2e-spellbook.html` they can re-open any time with no internet.
88
+ 3. **Install app** — when you host the app over HTTPS (see below), a service worker
89
+ caches it and supporting browsers offer to install it to the home screen / app
90
+ launcher; the 👤 menu surfaces an **Install app** button when that's available.
91
+ On iPhone/iPad use Safari → Share → *Add to Home Screen*.
92
+
93
+ ## Hosting on GitHub Pages
94
+
95
+ The hosted (installable) version needs four files served together from the same
96
+ folder — they're all produced by the build into `dist/`:
97
+
98
+ ```
99
+ dist/index.html the app
100
+ dist/sw.js service worker (offline cache; cache-busted per build)
101
+ dist/manifest.webmanifest PWA manifest (name, colours, icon)
102
+ dist/icon.svg app icon
103
+ ```
104
+
105
+ To deploy with GitHub Pages, serve the contents of `dist/` at the site root. A simple
106
+ approach is to publish the `dist/` folder (e.g. copy its contents to a `gh-pages`
107
+ branch, or point Pages at a `/docs` folder containing the same four files):
108
+
109
+ ```sh
110
+ npm run build # writes dist/{index.html,sw.js,manifest.webmanifest,icon.svg}
111
+
112
+ # Example: publish via a gh-pages branch
113
+ git switch --orphan gh-pages
114
+ cp dist/index.html dist/sw.js dist/manifest.webmanifest dist/icon.svg .
115
+ git add index.html sw.js manifest.webmanifest icon.svg
116
+ git commit -m "Deploy PF2e Spellbook"
117
+ git push -u origin gh-pages
118
+ # then: repo Settings → Pages → Branch: gh-pages / root
119
+ ```
120
+
121
+ The service worker is **network-first** for the page (so a redeploy is picked up the
122
+ next time the player is online) and **cache-first** for assets; each build stamps a
123
+ fresh cache name so old caches are cleared automatically. If you only need the offline
124
+ file and not installability, you can ignore `sw.js`/`manifest.webmanifest`/`icon.svg`
125
+ and just share `index.html`.
126
+
127
+ ## Building
128
+
129
+ The shippable file `dist/index.html` is assembled from the sources in `src/` and
130
+ `data/` by a small Python build (no dependencies, stdlib only):
131
+
132
+ ```sh
133
+ python3 tools/build.py # -> dist/index.html (or: npm run build)
134
+ ```
135
+
136
+ ### Tests
137
+
138
+ A headless [jsdom](https://github.com/jsdom/jsdom) suite loads the built
139
+ `dist/index.html` and drives the real UI (200+ assertions across all classes,
140
+ casting models, focus, heightening math, filters, legacy aliases, multi-character,
141
+ the offline/install UI, and a data-integrity guard):
142
+
143
+ ```sh
144
+ npm install # one-time: installs jsdom (devDependency)
145
+ npm test # build is assumed current; or `npm run check` to build + test
146
+ ```
147
+
148
+ ### Project layout
149
+
150
+ ```
151
+ src/template.html shell with <!--INJECT--> markers (views, nav, header)
152
+ src/styles.css all styling
153
+ src/classes.js CLASSES config + shared slot / proficiency tables
154
+ src/engine.js the data-driven engine (rendering, state, casting)
155
+ src/sw.js service worker (offline cache, copied to dist/ as-is)
156
+ src/manifest.webmanifest PWA manifest (copied to dist/)
157
+ src/icon.svg app icon (copied to dist/)
158
+ data/spells.generated.js ALL spells + rituals, built from Foundry (do not hand-edit)
159
+ data/overrides.js curated plain-English descriptions (hand-edited)
160
+ data/legacy_aliases.js pre-Remaster spell names (hand-edited)
161
+ tools/build_spells.py Foundry JSON -> data/spells.generated.js (+ version stamp)
162
+ tools/build.py inline everything -> dist/index.html
163
+ tools/test.mjs headless jsdom test suite (npm test)
164
+ ```
165
+
166
+ ### Regenerating the spell data
167
+
168
+ Spell data is generated from the open Foundry VTT `pf2e` system. Pull just the
169
+ spell pack (a few MB), then transform it:
170
+
171
+ ```sh
172
+ git clone --depth 1 --filter=blob:none --sparse \
173
+ https://github.com/foundryvtt/pf2e.git pf2e-data
174
+ cd pf2e-data && git sparse-checkout set packs/pf2e/spells && cd ..
175
+
176
+ python3 tools/build_spells.py --src pf2e-data/packs/pf2e/spells \
177
+ --out data/spells.generated.js
178
+ python3 tools/build.py
179
+ ```
180
+
181
+ `data/overrides.js` is **not** overwritten by regeneration — any slug present
182
+ there shadows the generated description with your friendlier wording (the
183
+ "hybrid" approach). Add an entry there to simplify any spell's text.
184
+
185
+ ## Credits & Licensing
186
+
187
+ The software source code, user interface, and architecture for `pf2e-spellbook` are licensed under the MIT License (see `LICENSE` file).
188
+
189
+ **ORC Notice**
190
+ This product is licensed under the ORC License located at the Library of Congress at TX 9-307-067 and available online at various locations. All warranties are disclaimed as set forth therein.
191
+
192
+ **Attribution Notice**
193
+ This application uses Licensed Material governed by the ORC License, including game mechanics and spell concepts originally created by Paizo Inc. Any Adapted Licensed Material created by [Your Name] is similarly licensed under the ORC License.
194
+
195
+ **Reserved Material Notice**
196
+ The proprietary software source code, user interface design, logos, and layout of `pf2e-spellbook` are hereby designated as Reserved Material and are entirely excluded from the ORC License.
@@ -0,0 +1,38 @@
1
+ /* Legacy (pre-Remaster) spell names.
2
+ The app uses Remaster names (matching the Foundry pf2e data). This map lets a
3
+ group still playing the original/legacy rules find spells that were renamed in
4
+ the Remaster — by search, by a "formerly …" note, and in the Prepare dropdowns.
5
+
6
+ Remaster slug -> [old name(s)]. Only true 1:1 renames whose legacy version was
7
+ removed from the data are listed; spells that still exist under both names
8
+ (e.g. Acid Splash / Caustic Blast) need no alias. Verified against the data.
9
+
10
+ The engine ALSO auto-extracts "(Remaster of X)" / "(Formerly X)" notes from
11
+ spell descriptions, so curated entries contribute aliases automatically. */
12
+ const LEGACY_ALIASES = {
13
+ "runic-weapon": ["Magic Weapon"],
14
+ "runic-body": ["Magic Fang"],
15
+ "mystic-armor": ["Mage Armor"],
16
+ "telekinetic-hand": ["Mage Hand"],
17
+ "force-barrage": ["Magic Missile"],
18
+ "ignition": ["Produce Flame"],
19
+ "breathe-fire": ["Burning Hands"],
20
+ "dizzying-colors": ["Color Spray"],
21
+ "enfeeble": ["Ray of Enfeeblement"],
22
+ "holy-light": ["Searing Light"],
23
+ "noise-blast": ["Sound Burst"],
24
+ "see-the-unseen": ["See Invisibility"],
25
+ "translate": ["Comprehend Language", "Comprehend Languages"],
26
+ "everlight": ["Continual Flame"],
27
+ "peaceful-rest": ["Gentle Repose"],
28
+ "infuse-vitality": ["Disrupting Weapons"],
29
+ "ring-of-truth": ["Zone of Truth"],
30
+ "vampiric-feast": ["Vampiric Touch"],
31
+ "vitality-lash": ["Disrupt Undead"],
32
+ "cleanse-cuisine": ["Purify Food and Drink"],
33
+ "void-warp": ["Chill Touch"],
34
+ "revealing-light": ["Glitterdust"],
35
+ "anointed-ground": ["Sanctified Ground"],
36
+ "calm": ["Calm Emotions"],
37
+ "laughing-fit": ["Hideous Laughter"]
38
+ };
@@ -0,0 +1,276 @@
1
+ /* Curated, beginner-friendly overrides (the "teaching" voice).
2
+ Any slug here shadows the auto-generated text. Hand-edited —
3
+ add an entry for any spell whose wording you want to simplify. */
4
+ const SPELL_OVERRIDES = {
5
+ "air-bubble": {
6
+ "description": "Trigger: a creature within range enters an environment where it can't breathe. A bubble of fresh air forms around its mouth and nose, letting it breathe normally. Ends if the target re-enters breathable air."
7
+ },
8
+ "anointed-ground": {
9
+ "description": "Sanctify the area against a chosen category (aberrations, celestials, dragons, fiends, monitors, or undead). Creatures in the area gain a +1 status bonus to AC, attack rolls, damage, and saves against creatures of that type. (Remaster of Sanctified Ground.)"
10
+ },
11
+ "augury": {
12
+ "description": "Cast over 10 minutes. Glimpse the future of a course of action within the next 30 minutes. The GM reveals: good, bad, mixed, or nothing. A secret DC 6 flat check can make the result 'nothing', so 'nothing' is never fully reliable."
13
+ },
14
+ "bane": {
15
+ "description": "Enemies in the emanation must succeed at a Will save or take a -1 status penalty to attack rolls while in the area. Once per round you can Sustain to grow the radius by 10 feet and force newly-included enemies to save. Bane can counteract bless."
16
+ },
17
+ "bind-undead": {
18
+ "description": "Seize control of a mindless undead, giving it the minion trait so it obeys you. Ends at once if you or your allies act with hostility toward it. Heightening raises the maximum level of undead you can control."
19
+ },
20
+ "bless": {
21
+ "description": "You and your allies in the emanation gain a +1 status bonus to attack rolls. Once per round you can Sustain to grow the emanation by 10 feet. Bless can counteract bane."
22
+ },
23
+ "blindness": {
24
+ "description": "Try to blind the target. Success: blinded until the start of your next turn. Failure: blinded 1 minute. Critical Failure: blinded permanently."
25
+ },
26
+ "blood-vendetta": {
27
+ "description": "Trigger: a creature deals piercing, slashing, or persistent bleed damage to you (you must be able to bleed). Curse the target with 2d6 persistent bleed (Will save). Success: half. Failure: full bleed plus weakness 1 to piercing & slashing until it ends. Critical Failure: double bleed plus that weakness.",
28
+ "heightened": "(+2) The persistent bleed increases by 2d6."
29
+ },
30
+ "calm": {
31
+ "description": "Soothe creatures into a nonviolent state (Will save). Success: -1 status penalty to attacks. Failure: emotion effects suppressed and it can't take hostile actions; outside hostility ends the effect for it. Critical Failure: as failure, but outside hostility doesn't end it."
32
+ },
33
+ "chilling-darkness": {
34
+ "description": "Fire a ray of unholy darkness: ranged spell attack vs AC. Deal 5d6 cold damage (double on a crit). A holy target also takes 5d6 spirit damage. Attempts to counteract magical light it passes through.",
35
+ "heightened": "(+1) Cold damage +2d6, and spirit damage vs holy +2d6."
36
+ },
37
+ "cleanse-affliction": {
38
+ "description": "Choose a curse, disease, or poison on the target. If it has advanced past stage 1, reduce its stage by 1 (only once per case).",
39
+ "heightened": "(3rd) Also attempt to counteract a disease or poison. (4th) Also attempt to counteract a curse, disease, or poison."
40
+ },
41
+ "cleanse-cuisine": {
42
+ "description": "Improve and purify food and drink in the area — turning water into a fine beverage, enhancing food, and removing toxins or contamination. It doesn't prevent future spoilage or add nutrition. (Formerly Purify Food and Drink.)",
43
+ "heightened": "(+2) The area increases by 1 more contiguous cubic foot."
44
+ },
45
+ "clear-mind": {
46
+ "description": "Attempt to counteract one effect imposing fleeing, frightened, or stupefied. If you just miss the counteract, instead suppress it until the start of your next turn. Can't affect curses, diseases, or innate conditions.",
47
+ "heightened": "(4th) Adds confused, controlled, slowed. (6th) Adds doomed. (8th) Adds stunned."
48
+ },
49
+ "command": {
50
+ "description": "Issue a hard-to-ignore one-word command: approach, flee, drop what it holds, drop prone, or stand in place. Failure: the target spends its first action next turn obeying. Critical Failure: it spends all its actions next turn obeying.",
51
+ "heightened": "(5th) Target up to 10 creatures."
52
+ },
53
+ "create-food": {
54
+ "description": "Cast over 1 hour. Create bland but nourishing food enough to feed 6 Medium creatures for a day; it spoils after 1 day. Smaller creatures eat less, larger creatures much more.",
55
+ "heightened": "(4th) Feeds 12. (6th) Feeds 50. (8th) Feeds 200."
56
+ },
57
+ "create-water": {
58
+ "description": "Conjure 2 gallons of fresh, drinkable water into containers or onto the ground near you. If not drunk, it evaporates after 1 day."
59
+ },
60
+ "crisis-of-faith": {
61
+ "description": "Assault the target with doubt for 6d6 mental damage — or 6d8 if it can cast divine spells. Success: half. Failure: full, and a divine caster is stupefied 1 for 1 round. Critical Failure: double, stupefied 1, and a divine caster can't cast divine spells for 1 round.",
62
+ "heightened": "(+1) Damage +2d6 (or +2d8 vs a divine caster)."
63
+ },
64
+ "darkness": {
65
+ "description": "Create a shroud of darkness. Nonmagical light gives off no light in the area, and magical light of the spell's rank or lower is suppressed. From outside it looks like a globe of pure darkness; creatures can't see in or out.",
66
+ "heightened": "(4th) Creatures with darkvision (not greater) can barely see through it, treating targets within as concealed."
67
+ },
68
+ "darkvision": {
69
+ "description": "You gain darkvision for the duration, seeing in areas of darkness.",
70
+ "heightened": "(3rd) Touch, 1 willing creature. (5th) Touch, 1 willing creature, lasts until your next daily preparations."
71
+ },
72
+ "daze": {
73
+ "description": "Jolt a creature's mind, dealing 1d6 mental damage with a basic Will save. On a critical failure the target also becomes stunned 1.",
74
+ "heightened": "(+2) The damage increases by 1d6."
75
+ },
76
+ "deafness": {
77
+ "description": "The target may lose its hearing (Fortitude), then is temporarily immune for 1 minute. Success: deafened 1 round. Failure: deafened 10 minutes. Critical Failure: deafened permanently."
78
+ },
79
+ "detect-magic": {
80
+ "description": "Send out a magical pulse that tells you whether any magic is present in the area, but not the school, rank, or location. You can ignore your own magic and that of allies. Illusion magic is only detected if its rank is lower than your spell's rank.",
81
+ "heightened": "(3rd) You also learn the rank of the most powerful magic detected. (4th) As 3rd, plus you pinpoint the highest-rank source to a 5-foot cube (imprecise)."
82
+ },
83
+ "dispel-magic": {
84
+ "description": "Attempt a counteract check to unravel the target magic. If you counteract a magic item, it becomes mundane for 10 minutes. You automatically fail against artifacts and the like."
85
+ },
86
+ "divine-lance": {
87
+ "description": "Make a ranged spell attack to hurl spiritual energy. On a hit, deal 2d4 spirit damage (double on a critical hit). When you cast it, choose holy or unholy; this affects creatures of the opposing trait under the sanctified rules.",
88
+ "heightened": "(+1) The damage increases by 1d4."
89
+ },
90
+ "dream-message": {
91
+ "description": "Send a one-way message (up to 1 minute of speech) into the target's dreams. If asleep, it gets the message at once; otherwise the next time it sleeps.",
92
+ "heightened": "(4th) Up to 10 creatures you know and have met, same message to all."
93
+ },
94
+ "environmental-endurance": {
95
+ "description": "Cast over 10 minutes. Choose severe cold or severe heat; the target is protected from that dangerous temperature (but not extreme temperatures).",
96
+ "heightened": "(3rd) Protected from both severe cold and severe heat. (5th) Protected from severe and extreme cold and heat."
97
+ },
98
+ "everlight": {
99
+ "description": "The touched gemstone glows with bright light in a 20-foot radius (dim for 20 more) in a color you choose. Ends if the gemstone breaks. (Remaster of Continual Flame.)"
100
+ },
101
+ "fear": {
102
+ "description": "Instill fear. Critical Success: unaffected. Success: frightened 1. Failure: frightened 2. Critical Failure: frightened 3 and fleeing for 1 round.",
103
+ "heightened": "(3rd) Target up to 5 creatures."
104
+ },
105
+ "forbidding-ward": {
106
+ "description": "Protect an ally against a specific enemy. The target ally gains a +1 status bonus to AC and saving throws against that enemy's attacks, spells, and other effects.",
107
+ "heightened": "(6th) The status bonus increases to +2."
108
+ },
109
+ "guidance": {
110
+ "description": "Grant the target a +1 status bonus to one attack roll, Perception check, saving throw, or skill check before the duration ends. The target chooses which roll to use it on before rolling; the spell then ends and the target is temporarily immune for 1 hour."
111
+ },
112
+ "harm": {
113
+ "description": "Channel void energy to harm the living or knit the undead. A living target takes 1d8 void damage (basic Fortitude); a willing undead target regains 1d8 HP. ◆ 1 action: touch one creature. ◆◆ 2 actions: range 30 ft, one creature, and a healed undead regains an extra 8 HP (1d8+8). ◆◆◆ 3 actions: 30-foot emanation affecting all living and undead in the area (no +8).",
114
+ "heightened": "(+1) Healing/damage increases by 1d8, and the 2-action bonus increases by 8."
115
+ },
116
+ "heal": {
117
+ "description": "Channel vital energy to heal the living or sear the undead. A living target regains 1d8 HP; an undead target takes 1d8 vitality damage (basic Fortitude). ◆ 1 action: touch one creature. ◆◆ 2 actions: range 30 ft, one creature, and a healed living creature regains an extra 8 HP (so 1d8+8). ◆◆◆ 3 actions: 30-foot emanation affecting all living and undead in the area (no +8).",
118
+ "heightened": "(+1) Healing/damage increases by 1d8, and the 2-action bonus increases by 8."
119
+ },
120
+ "heroism": {
121
+ "description": "Grant the target a +1 status bonus to attack rolls, Perception, saving throws, and skill checks.",
122
+ "heightened": "(6th) Bonus increases to +2. (9th) Bonus increases to +3."
123
+ },
124
+ "holy-light": {
125
+ "description": "Fire a blazing ray of light: make a ranged spell attack vs AC. Deal 5d6 fire damage (double on a crit). An unholy target also takes 5d6 spirit damage. If the light passes through magical darkness, it attempts to counteract that darkness. (Remaster of Searing Light.)",
126
+ "heightened": "(+1) Fire damage +2d6, and spirit damage vs unholy +2d6."
127
+ },
128
+ "infuse-vitality": {
129
+ "description": "Infuse allies' Strikes with vital energy: each target's unarmed and weapon Strikes deal an extra 1d4 vitality damage (typically harms only undead). A holy caster can make this spell and the Strikes holy. (Formerly Disrupting Weapons.)",
130
+ "heightened": "(3rd) Extra damage becomes 2d4. (5th) Extra damage becomes 3d4."
131
+ },
132
+ "light": {
133
+ "description": "Create an orb of light that sheds bright light in a 20-foot radius (and dim light for 20 more feet). You can attach it to a willing creature so it moves with them. Sustain to move the orb up to 60 feet. You can have up to four Light spells active at once.",
134
+ "heightened": "(4th) The orb sheds bright light in a 60-foot radius (dim for 60 more)."
135
+ },
136
+ "locate": {
137
+ "description": "Learn the direction to the nearest target object (a named one, or the nearest of a type). It gives direction only, not distance, and is blocked by lead and running water. It can't find creatures at base rank.",
138
+ "heightened": "(5th) Can instead locate a specific creature or a type of creature."
139
+ },
140
+ "marvelous-mount": {
141
+ "description": "Cast over 10 minutes. Conjure a Large fantastical mount (Speed 40 ft) as the target's minion. It bears only the target and its gear, uses the target's AC and saves, and is destroyed if it takes more than 10 damage at once.",
142
+ "heightened": "(3rd) Can walk on water. (4th) Speed 60. (5th) Speed 60 and fly Speed 60. (6th) Speed/fly 80."
143
+ },
144
+ "mending": {
145
+ "description": "Repair a damaged object, restoring 5 Hit Points per spell rank. If this brings it above its Broken Threshold, the broken condition is removed.",
146
+ "heightened": "(2nd) Target up to 1 Bulk. (3rd) Target up to 2 Bulk."
147
+ },
148
+ "moonlight-ray": {
149
+ "description": "Fire a ray of holy moonlight: ranged spell attack vs AC. Deal 5d6 cold damage that counts as silver (double on a crit). An unholy target also takes 5d6 spirit damage. Attempts to counteract magical darkness it passes through.",
150
+ "heightened": "(+1) Cold damage +2d6, and spirit damage vs unholy +2d6."
151
+ },
152
+ "mystic-armor": {
153
+ "description": "Shimmering energy wards you, granting a +1 item bonus to AC (max Dex +5). You use your unarmored proficiency to calculate AC while protected.",
154
+ "heightened": "(4th) Also +1 item bonus to saves. (6th) +2 AC, +1 saves. (8th) +2 AC, +2 saves. (10th) +3 AC, +3 saves."
155
+ },
156
+ "noise-blast": {
157
+ "description": "A cacophonous blast deals 2d10 sonic damage (Fortitude). Success: half. Failure: full and deafened 1 round. Critical Failure: double, deafened 1 minute, and stunned 1. (Remaster of Sound Burst.)",
158
+ "heightened": "(+1) The damage increases by 1d10."
159
+ },
160
+ "peaceful-rest": {
161
+ "description": "The corpse doesn't decay, can't be made into undead, and isn't eaten by ordinary pests. Its duration doesn't count against time limits for spells like raise dead. (Remaster of Gentle Repose.)",
162
+ "heightened": "(5th) Duration unlimited; takes 1 more action and costs 6 gp of embalming fluid."
163
+ },
164
+ "prestidigitation": {
165
+ "description": "Perform a minor magical trick. Each time you Sustain, choose one effect: cook (chill, warm, or flavor 1 lb of nonliving material), lift (raise a light unattended object 1 foot), make (create a temporary crude object — not a usable tool/weapon), or tidy (color, clean, or soil a light object). It can't deal damage or cause conditions."
166
+ },
167
+ "protection": {
168
+ "description": "Ward a creature against harm: it gains a +1 status bonus to Armor Class and saving throws.",
169
+ "heightened": "(3rd) The benefits also affect all your allies in a 10-foot emanation around the target."
170
+ },
171
+ "radiant-globe": {
172
+ "description": "Create a dome of brilliant light. Physical ranged ammunition entering the area is destroyed. A creature making a ranged attack into or through it must succeed at a Fortitude save or be dazzled 1 round (blinded 1 round on a critical failure)."
173
+ },
174
+ "read-aura": {
175
+ "description": "Spend 1 minute to detect whether an object is magical and, if so, learn the school of magic. You and those you advise gain a +2 circumstance bonus to Identify Magic on it. An illusion's aura is detected only if its rank is lower than this spell's.",
176
+ "heightened": "(3rd) Target up to 10 objects. (6th) Target any number of objects."
177
+ },
178
+ "resist-energy": {
179
+ "description": "Choose acid, cold, electricity, fire, or sonic; the target and its gear gain resistance 5 against it.",
180
+ "heightened": "(4th) Resistance 10, up to 2 targets. (7th) Resistance 15, up to 5 targets."
181
+ },
182
+ "revealing-light": {
183
+ "description": "A wash of light (Reflex) makes creatures dazzled; an invisible creature becomes concealed instead, and a creature concealed by other means loses that concealment. Success: 2 rounds. Failure: 1 minute. Critical Failure: 10 minutes. (Remaster of Faerie Fire/Glitterdust.)"
184
+ },
185
+ "ring-of-truth": {
186
+ "description": "Create a zone exposing deceit: creatures in it take a -2 status penalty to Deception, and a bell rings whenever someone in the area knowingly lies (the Will save sets how reliably lies are caught). (Remaster of Zone of Truth.)"
187
+ },
188
+ "runic-body": {
189
+ "description": "Glowing runes cover the target. Its unarmed attacks become +1 striking: +1 item bonus to attack rolls and one extra damage die (two dice total).",
190
+ "heightened": "(6th) +2 greater striking (three dice). (9th) +3 major striking (four dice)."
191
+ },
192
+ "runic-weapon": {
193
+ "description": "The target becomes a +1 striking weapon: +1 item bonus to attack rolls and one extra weapon damage die (two dice total).",
194
+ "heightened": "(6th) +2 greater striking (three dice). (9th) +3 major striking (four dice)."
195
+ },
196
+ "sanctuary": {
197
+ "description": "Ward the target; a creature trying to attack it must first attempt a Will save. Success: it can attack. Failure: it wastes the action and can't attack the target this turn. Critical Failure: it can't attack the target for the rest of the duration. If the warded creature takes a hostile action, the spell ends."
198
+ },
199
+ "see-the-unseen": {
200
+ "description": "You see invisible creatures as concealed (blurred) rather than undetectable, and see incorporeal creatures within 10 feet of a surface. You gain a +2 status bonus to disbelieve illusions. (Remaster of See Invisibility.)",
201
+ "heightened": "(5th) Duration increases to 8 hours."
202
+ },
203
+ "share-life": {
204
+ "description": "Link your life force to the target's. It takes half damage from effects dealing HP damage, and you take the rest (you don't apply your own resistances/weaknesses to it). Ends if the target moves more than 30 feet away, or if either of you drops to 0 HP."
205
+ },
206
+ "shield": {
207
+ "description": "Raise a magical shield of force (counts as Raise a Shield), gaining a +1 circumstance bonus to AC with no hand needed. You can use Shield Block with it (Hardness 5). After it takes Shield Block damage the spell ends and can't be cast again for 10 minutes.",
208
+ "heightened": "(+2) The shield's Hardness increases by 5."
209
+ },
210
+ "sigil": {
211
+ "description": "Mark a creature or object with a magical sigil (about 1 sq inch) of your design. You can make it visible or invisible and toggle it with an Interact action. It can be removed with 5 minutes of work; on a creature it fades after 1 week.",
212
+ "heightened": "(3rd) Lasts 1 month. (5th) Lasts 1 year. (7th) Permanent."
213
+ },
214
+ "silence": {
215
+ "description": "The target produces no sound, so creatures can't notice it by hearing alone. It can't make sonic attacks, use auditory actions, or cast spells with verbal/audible components unless they have the subtle trait.",
216
+ "heightened": "(4th) Instead silences a 10-foot emanation around the creature, affecting all sound within."
217
+ },
218
+ "sound-body": {
219
+ "description": "Attempt to counteract one effect imposing blinded, dazzled, deafened, enfeebled, or sickened. If you just miss, instead suppress it until the start of your next turn. Can't affect curses, diseases, or innate conditions.",
220
+ "heightened": "(4th) Adds drained, slowed. (6th) Adds petrified. (8th) Adds stunned."
221
+ },
222
+ "speak-with-plants": {
223
+ "description": "Ask questions of and receive answers from nearby plants and fungi. They keep their normal intelligence and attitude, so their answers may be limited.",
224
+ "heightened": "(4th) Duration increases to 8 hours."
225
+ },
226
+ "spirit-link": {
227
+ "description": "Form a link to share another creature's pain. When you cast it and at the start of each of your turns, if the target is below maximum HP it regains 2 HP and you lose that many. This transfer can't be increased or reduced by other effects.",
228
+ "heightened": "(+1) The Hit Points transferred increases by 2."
229
+ },
230
+ "spiritual-armament": {
231
+ "description": "Create a ghostly echo of a weapon you wield and fling it: make a spell attack vs AC. On a hit deal 2d8 of the weapon's damage type (or spirit, if worse for the target); double on a crit. It uses and adds to your multiple attack penalty. Sustain to attack again.",
232
+ "heightened": "(+2) The damage increases by 1d8."
233
+ },
234
+ "stabilize": {
235
+ "description": "Channel vitality to halt a creature's slide toward death. The target loses the dying condition, though it remains unconscious at 0 Hit Points."
236
+ },
237
+ "status": {
238
+ "description": "While you and the target are on the same plane and alive, you stay aware of the target's direction, distance, and any conditions affecting it.",
239
+ "heightened": "(4th) Range 30 feet, up to 10 creatures."
240
+ },
241
+ "sure-footing": {
242
+ "description": "Attempt to counteract one effect imposing clumsy, grabbed, or paralyzed. If you just miss, instead suppress it until the start of your next turn. Can't affect curses, diseases, or innate conditions.",
243
+ "heightened": "(4th) Adds immobilized, restrained, slowed. (6th) Adds petrified. (8th) Adds stunned."
244
+ },
245
+ "translate": {
246
+ "description": "The target understands a single language it is hearing or reading at casting (not codes or metaphor). If several known languages are present, the target picks one; otherwise it's random. (Remaster of Comprehend Language.)",
247
+ "heightened": "(3rd) The target can also speak the language. (4th) Up to 10 targets who can also speak it."
248
+ },
249
+ "vampiric-feast": {
250
+ "description": "Leech the target's lifeblood for 6d6 void damage. You gain temporary HP equal to half the void damage dealt (after resistances), lasting up to 1 minute. (Remaster of Vampiric Touch.)",
251
+ "heightened": "(+1) The damage increases by 2d6."
252
+ },
253
+ "vitality-lash": {
254
+ "description": "Sear undeath with the energy of Creation's Forge, dealing 2d6 vitality damage with a basic Fortitude save. On a critical failure the target is also enfeebled 1 until the start of your next turn. (Remaster replacement for Disrupt Undead.)",
255
+ "heightened": "(+1) The damage increases by 1d6."
256
+ },
257
+ "void-warp": {
258
+ "description": "Twist the void against a living creature, dealing 2d4 void damage with a basic Fortitude save. On a critical failure the target is also enfeebled 1 until the start of your next turn.",
259
+ "heightened": "(+1) The damage increases by 1d4."
260
+ },
261
+ "wanderers-guide": {
262
+ "description": "Choose a destination and receive an inspired overland route. While you and your allies travel that route, treat difficult-terrain movement penalties as half. No effect in encounter mode. Recasting replaces the previous route."
263
+ },
264
+ "water-breathing": {
265
+ "description": "Cast over 1 minute. The targets can breathe underwater.",
266
+ "heightened": "(3rd) Duration 8 hours. (4th) Until your next daily preparations."
267
+ },
268
+ "water-walk": {
269
+ "description": "The target can walk on the surface of water and other liquids without sinking. It can go under if it wishes but must Swim; this doesn't grant water breathing.",
270
+ "heightened": "(4th) Range 30 feet, duration 1 hour, up to 10 targets."
271
+ },
272
+ "whirling-scarves": {
273
+ "description": "Force scarves swirl around you, granting concealment vs melee and ranged attacks (ranged attackers face a DC 6 flat check instead of DC 5). When a melee attack against you fails, that attacker takes a -1 circumstance penalty to further attacks with that weapon until end of its turn.",
274
+ "heightened": "(+2) The penalty and the ranged flat-check DC each increase by 1."
275
+ }
276
+ };