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 +30 -0
- package/README.md +196 -0
- package/data/legacy_aliases.js +38 -0
- package/data/overrides.js +276 -0
- package/data/spells.generated.js +57844 -0
- package/dist/icon.svg +8 -0
- package/dist/index.html +60088 -0
- package/dist/manifest.webmanifest +14 -0
- package/dist/sw.js +55 -0
- package/notice.md +248 -0
- package/package.json +28 -0
- package/src/classes.js +312 -0
- package/src/engine.js +1111 -0
- package/src/icon.svg +8 -0
- package/src/manifest.webmanifest +14 -0
- package/src/styles.css +353 -0
- package/src/sw.js +55 -0
- package/src/template.html +154 -0
- package/tools/build.py +62 -0
- package/tools/build_spells.py +391 -0
- package/tools/migrate_cleric_overrides.py +102 -0
- package/tools/test.mjs +536 -0
package/src/classes.js
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
CLASS CONFIG + shared caster tables
|
|
3
|
+
Each class is data the engine consumes; adding a class is a
|
|
4
|
+
config edit, not an engine change.
|
|
5
|
+
============================================================ */
|
|
6
|
+
|
|
7
|
+
/* Slots-per-rank by character level for a FULL caster (Cleric, Wizard,
|
|
8
|
+
Druid, Witch, Sorcerer, Bard, Oracle). Cantrips are separate.
|
|
9
|
+
Rank r unlocks at level (2r-1) with 2 slots, becomes 3 the next level,
|
|
10
|
+
and rank 10 is only ever a single slot (levels 19-20). */
|
|
11
|
+
function fullCasterSlots(level){
|
|
12
|
+
const slots={};
|
|
13
|
+
const maxRank=Math.min(10, Math.ceil(level/2));
|
|
14
|
+
for(let r=1;r<=maxRank;r++){
|
|
15
|
+
const unlock=2*r-1;
|
|
16
|
+
if(level<unlock) continue;
|
|
17
|
+
if(r===10) slots[r]=1;
|
|
18
|
+
else if(level===unlock) slots[r]=2;
|
|
19
|
+
else slots[r]=3;
|
|
20
|
+
}
|
|
21
|
+
return slots;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Partial caster (Magus, Summoner): ~4 slots concentrated in the top two ranks,
|
|
25
|
+
shedding lower ranks from L5; never reaches 10th rank. Verified vs. the AoN
|
|
26
|
+
"Spells per Day" tables. */
|
|
27
|
+
function partialCasterSlots(level){
|
|
28
|
+
if(level<=0) return {};
|
|
29
|
+
if(level===1) return {1:1};
|
|
30
|
+
if(level===2) return {1:2};
|
|
31
|
+
if(level===3) return {1:2,2:1};
|
|
32
|
+
if(level===4) return {1:2,2:2};
|
|
33
|
+
const H=Math.min(9, Math.floor((level+1)/2)); // highest rank, capped at 9th
|
|
34
|
+
const slots={};
|
|
35
|
+
if(H-1>=1) slots[H-1]=2;
|
|
36
|
+
slots[H]=2;
|
|
37
|
+
return slots;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Psychic: full rank progression but only 2 slots per rank (a newly-gained rank
|
|
41
|
+
starts at 1), reaching 10th rank (1 slot) at level 19. */
|
|
42
|
+
function psychicSlots(level){
|
|
43
|
+
const slots={};
|
|
44
|
+
const maxRank=Math.min(10, Math.ceil(level/2));
|
|
45
|
+
for(let r=1;r<=maxRank;r++){
|
|
46
|
+
const unlock=2*r-1;
|
|
47
|
+
if(level<unlock) continue;
|
|
48
|
+
if(r===10) slots[r]=1;
|
|
49
|
+
else if(level===unlock) slots[r]=1;
|
|
50
|
+
else slots[r]=2;
|
|
51
|
+
}
|
|
52
|
+
return slots;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* [minLevel, proficiency bonus] for spell DC / spell attack, highest first.
|
|
56
|
+
Bonus = 2/4/6/8 for trained/expert/master/legendary.
|
|
57
|
+
Wizard, Druid, Sorcerer, Bard, Oracle, Psychic and the Cloistered Cleric
|
|
58
|
+
doctrine all reach expert@7, master@15, legendary@19 (verified vs. Foundry). */
|
|
59
|
+
const FULL_CASTER_PROF=[[19,8],[15,6],[7,4],[1,2]];
|
|
60
|
+
/* Magus & Summoner: expert@9, master@17, no legendary (verified vs. Foundry). */
|
|
61
|
+
const PARTIAL_CASTER_PROF=[[17,6],[9,4],[1,2]];
|
|
62
|
+
/* Warpriest doctrine differs: expert@11, master@19 (no legendary). Kept here
|
|
63
|
+
for when Cleric doctrine selection is added. */
|
|
64
|
+
const WARPRIEST_PROF=[[19,6],[11,4],[1,2]];
|
|
65
|
+
|
|
66
|
+
const TRADITION_LABEL={arcane:"Arcane",divine:"Divine",occult:"Occult",primal:"Primal"};
|
|
67
|
+
|
|
68
|
+
/* Sorcerer bloodlines -> magical tradition (Player Core). */
|
|
69
|
+
const BLOODLINES={
|
|
70
|
+
aberrant:{label:"Aberrant",tradition:"occult"},
|
|
71
|
+
angelic:{label:"Angelic",tradition:"divine"},
|
|
72
|
+
demonic:{label:"Demonic",tradition:"divine"},
|
|
73
|
+
diabolic:{label:"Diabolic",tradition:"divine"},
|
|
74
|
+
draconic:{label:"Draconic",tradition:"arcane"},
|
|
75
|
+
elemental:{label:"Elemental",tradition:"primal"},
|
|
76
|
+
fey:{label:"Fey",tradition:"primal"},
|
|
77
|
+
hag:{label:"Hag",tradition:"occult"},
|
|
78
|
+
imperial:{label:"Imperial",tradition:"arcane"},
|
|
79
|
+
undead:{label:"Undead",tradition:"divine"},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const CORE_HELP=[
|
|
83
|
+
["What do the numbers at the top mean?",
|
|
84
|
+
"<b>Spell DC</b> is the number enemies must beat on a saving throw against your spells. <b>Spell attack</b> is what you add to a d20 when a spell says 'make a spell attack' (against the target's AC). Both come from your level + spellcasting proficiency + your key ability modifier — the app works them out for you."],
|
|
85
|
+
["Prepared vs. spontaneous casting",
|
|
86
|
+
"<b>Prepared</b> casters (Cleric, Wizard, Druid, Witch) lock specific spells into their slots each morning — a slot can only cast the spell you put in it. <b>Spontaneous</b> casters (Sorcerer, Bard, Oracle) instead learn a <b>repertoire</b> and can cast any spell in it using a slot of the right rank. This app tracks whichever your class uses."],
|
|
87
|
+
["Spell slots & casting",
|
|
88
|
+
"A <b>spell slot</b> is one casting. Prepared casters spend the slot they loaded a spell into; spontaneous casters spend any slot of the right rank on any repertoire spell of that rank. On <b>Cast Today</b>, tap <b>Cast</b> to spend a slot — it greys out so you always know what's left. <b>Rest & reset</b> refreshes everything for a new day."],
|
|
89
|
+
["Cantrips",
|
|
90
|
+
"<b>Cantrips</b> can be cast <b>as many times as you like</b>, all day, and automatically scale to your level so they never feel weak. Most casters prepare or know 5."],
|
|
91
|
+
["Heightening a spell",
|
|
92
|
+
"Casting a spell in a higher-rank slot makes it stronger — that's <b>heightening</b>. Each spell card shows its <b>Heightened</b> line. Prepared casters drop a lower-rank spell into a higher slot; spontaneous casters can only heighten a spell that's one of their <b>signature spells</b>."],
|
|
93
|
+
["Signature spells (spontaneous only)",
|
|
94
|
+
"A spontaneous caster's known spells are normally locked to the rank they learned. Mark a spell as a <b>signature spell</b> (the ★ in your repertoire) and you can cast it using any higher-rank slot to heighten it automatically. You typically pick one signature spell per spell rank."],
|
|
95
|
+
["Focus spells & Refocus",
|
|
96
|
+
"<b>Focus spells</b> (domain, order, hex, composition, revelation, bloodline…) are cast using <b>Focus Points</b> from a small shared pool (max 3) and auto-heighten to half your level. Add the ones you know in <b>Prepare</b>, then spend points on <b>Cast Today</b>. Spend 10 minutes to <b>Refocus</b> and recover points between encounters. (Focus <i>cantrips</i>, like a bard's Courageous Anthem, are free and at-will.)"],
|
|
97
|
+
["Saving throws & degrees of success",
|
|
98
|
+
"Many spells list a save like <b>Basic Fortitude</b>. 'Basic' means: Critical Success = no effect, Success = half, Failure = full, Critical Failure = double. Non-basic saves have their own listed effects. You crit by beating (or missing) the DC by 10+."],
|
|
99
|
+
["Remaster vs. legacy (original) rules",
|
|
100
|
+
"This app uses the current <b>Remaster</b> spell names and rules. If your group still plays the <b>original</b> (pre-Remaster) edition, most spells are identical — and renamed ones show a small <i>“formerly …”</i> note, so you can also <b>search by the old name</b> (e.g. searching <b>Magic Missile</b> finds <b>Force Barrage</b>). A few legacy spells that weren't changed are still listed under their original names too.<br><br>A few wording changes to keep in mind: spell <b>rank</b> = spell <b>level</b>; <b>vitality</b>/<b>void</b> damage = the old <b>positive</b>/<b>negative</b>; and <b>holy</b>/<b>unholy</b> replace the old <b>good</b>/<b>evil</b> alignment damage. The numbers and effects are the same."],
|
|
101
|
+
["Multiple characters, backup & sharing",
|
|
102
|
+
"Tap the <b>👤</b> button (top right) to keep <b>several characters</b> and switch between them — each remembers its own prepared spells. From there you can also <b>Export</b> a character to a code to back it up or send to a friend, and <b>Import</b> a code someone shares with you. Everything is stored on your device."],
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
const CLASSES={
|
|
106
|
+
/* ---------------- CLERIC ---------------- */
|
|
107
|
+
cleric:{
|
|
108
|
+
id:"cleric", name:"Cleric", icon:"⛪",
|
|
109
|
+
tagline:"Divine prepared caster · the party's main healer",
|
|
110
|
+
tradition:"divine", keyAbility:"Wisdom", keyAbilityShort:"Wis",
|
|
111
|
+
casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
|
|
112
|
+
doctrines:{
|
|
113
|
+
cloistered:{label:"Cloistered Cleric", prof:FULL_CASTER_PROF},
|
|
114
|
+
warpriest:{label:"Warpriest", prof:WARPRIEST_PROF},
|
|
115
|
+
},
|
|
116
|
+
features:[{type:"divineFont", healSlug:"heal", harmSlug:"harm"}],
|
|
117
|
+
help:[
|
|
118
|
+
["What does a cleric actually do?",
|
|
119
|
+
"You're a divine spellcaster. Each morning you <b>Prepare</b> a set of spells, then cast them during the day. You also get <b>Divine Font</b> — a pile of free <b>Heal</b> (or Harm) spells — which makes you the party's main healer."],
|
|
120
|
+
["Divine Font (your free heals)",
|
|
121
|
+
"At level 1 you chose a <b>Healing</b> or <b>Harmful Font</b>. It gives you extra casts of <b>Heal</b> (or Harm) each day equal to <b>1 + your Charisma modifier</b>, <b>separate</b> from your normal slots and always cast at your highest spell rank."],
|
|
122
|
+
["The three-action Heal (and Harm)",
|
|
123
|
+
"<b>Heal</b>'s power changes with how many actions you spend:<br>◆ <b>1 action</b>: touch one creature.<br>◆◆ <b>2 actions</b>: heal at 30 ft <b>and</b> add a flat +8 HP.<br>◆◆◆ <b>3 actions</b>: heal everyone (and damage undead) in a 30-ft burst around you."],
|
|
124
|
+
["Doctrine & your spell DC",
|
|
125
|
+
"Pick your <b>doctrine</b> in the character section. A <b>Cloistered Cleric</b>'s spell DC becomes expert at 7, master at 15, and legendary at 19; a <b>Warpriest</b>'s becomes expert at 11 and master at 19. The app adjusts your Spell DC and attack to match your choice. Levels 1–6 are identical either way."],
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
/* ---------------- WIZARD ---------------- */
|
|
130
|
+
wizard:{
|
|
131
|
+
id:"wizard", name:"Wizard", icon:"🪄",
|
|
132
|
+
tagline:"Arcane prepared caster · the widest spell list",
|
|
133
|
+
tradition:"arcane", keyAbility:"Intelligence", keyAbilityShort:"Int",
|
|
134
|
+
casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
|
|
135
|
+
preview:true,
|
|
136
|
+
features:[
|
|
137
|
+
{type:"extraSlots", key:"school", icon:"🎓", label:"Arcane school slot",
|
|
138
|
+
note:"One extra slot of each rank you can cast, which must hold a spell from your chosen school / curriculum."},
|
|
139
|
+
{type:"dailyResource", key:"bonded", icon:"🔗", label:"Drain Bonded Item", uses:1,
|
|
140
|
+
note:"Once per day, recast a spell you already cast today without spending its slot."},
|
|
141
|
+
],
|
|
142
|
+
help:[
|
|
143
|
+
["What does a wizard do?",
|
|
144
|
+
"You're an <b>Arcane</b> prepared caster with the broadest spell list in the game. You Prepare spells each morning from your spellbook, leaning on control and damage like <b>Fireball</b> plus utility."],
|
|
145
|
+
["Arcane school slot",
|
|
146
|
+
"Your school (curriculum) gives you <b>one extra prepared slot of every rank</b> you can cast. Fill the 🎓 slots with spells from your school. The app adds these slots automatically."],
|
|
147
|
+
["Drain Bonded Item",
|
|
148
|
+
"Once per day you can <b>Drain your Bonded Item</b> to recast a spell you've already cast that day, without spending another slot. Tick the 🔗 tracker on Cast Today when you use it."],
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
/* ---------------- DRUID ---------------- */
|
|
153
|
+
druid:{
|
|
154
|
+
id:"druid", name:"Druid", icon:"🌿",
|
|
155
|
+
tagline:"Primal prepared caster · nature's versatility",
|
|
156
|
+
tradition:"primal", keyAbility:"Wisdom", keyAbilityShort:"Wis",
|
|
157
|
+
casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
|
|
158
|
+
preview:true,
|
|
159
|
+
features:[{type:"note", title:"Druidic order", text:"Pick your order's focus spells (Heal Animal, Tempest Surge, Wild/Untamed Form…) in the Focus section below. Companion/familiar bookkeeping stays on your sheet."}],
|
|
160
|
+
help:[
|
|
161
|
+
["What does a druid do?",
|
|
162
|
+
"You're a <b>Primal</b> prepared caster tied to nature, with strong healing, control, and battlefield spells. Many druids also use order focus spells to shapeshift (coming soon to the app)."],
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
/* ---------------- WITCH ---------------- */
|
|
167
|
+
witch:{
|
|
168
|
+
id:"witch", name:"Witch", icon:"🔮",
|
|
169
|
+
tagline:"Prepared caster · your patron sets the tradition",
|
|
170
|
+
traditionFrom:"patron", defaultTradition:"occult",
|
|
171
|
+
keyAbility:"Intelligence", keyAbilityShort:"Int",
|
|
172
|
+
casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
|
|
173
|
+
preview:true,
|
|
174
|
+
features:[{type:"note", title:"Hexes & familiar", text:"Choose your patron's tradition above, then add your hex focus spells in the Focus section below. Familiar details stay on your sheet."}],
|
|
175
|
+
help:[
|
|
176
|
+
["What does a witch do?",
|
|
177
|
+
"You're a prepared caster whose <b>patron</b> grants your magic — set your patron's <b>tradition</b> (arcane, divine, occult, or primal) in the character section, and your spell list follows. Witches also cast <b>hexes</b> through a familiar (coming soon)."],
|
|
178
|
+
],
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
/* ---------------- SORCERER ---------------- */
|
|
182
|
+
sorcerer:{
|
|
183
|
+
id:"sorcerer", name:"Sorcerer", icon:"✨",
|
|
184
|
+
tagline:"Spontaneous caster · magic in the blood",
|
|
185
|
+
traditionFrom:"bloodline", keyAbility:"Charisma", keyAbilityShort:"Cha",
|
|
186
|
+
casting:"spontaneous", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
|
|
187
|
+
preview:true,
|
|
188
|
+
features:[
|
|
189
|
+
{type:"signature"},
|
|
190
|
+
{type:"note", title:"Bloodline magic", text:"Add your bloodline focus spells in the Focus section below. Blood-magic side effects are described on each spell but tracked by you."},
|
|
191
|
+
],
|
|
192
|
+
help:[
|
|
193
|
+
["What does a sorcerer do?",
|
|
194
|
+
"You're a <b>spontaneous</b> caster whose <b>bloodline</b> sets your tradition. You build a <b>repertoire</b> of known spells and cast any of them using slots of the right rank — flexible turn to turn."],
|
|
195
|
+
["Signature spells",
|
|
196
|
+
"Mark spells as <b>signature</b> (the ★) so you can cast them with higher-rank slots to heighten them. Pick one per spell rank for the most flexibility (e.g., a signature damage spell scales all game)."],
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
|
|
200
|
+
/* ---------------- BARD ---------------- */
|
|
201
|
+
bard:{
|
|
202
|
+
id:"bard", name:"Bard", icon:"🎵",
|
|
203
|
+
tagline:"Occult spontaneous caster · master of support",
|
|
204
|
+
tradition:"occult", keyAbility:"Charisma", keyAbilityShort:"Cha",
|
|
205
|
+
casting:"spontaneous", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
|
|
206
|
+
preview:true,
|
|
207
|
+
features:[
|
|
208
|
+
{type:"signature"},
|
|
209
|
+
{type:"note", title:"Compositions & muse", text:"Add your composition focus spells (Courageous Anthem, Counter Performance…) in the Focus section below."},
|
|
210
|
+
],
|
|
211
|
+
help:[
|
|
212
|
+
["What does a bard do?",
|
|
213
|
+
"You're an <b>Occult</b> <b>spontaneous</b> caster and the game's best supporter. You build a repertoire and cast flexibly, and your composition cantrips/focus spells buff the party (coming soon)."],
|
|
214
|
+
["Signature spells",
|
|
215
|
+
"Mark spells as <b>signature</b> (the ★) to heighten them with higher-rank slots. One per rank is the usual choice."],
|
|
216
|
+
],
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
/* ---------------- ORACLE ---------------- */
|
|
220
|
+
oracle:{
|
|
221
|
+
id:"oracle", name:"Oracle", icon:"👁",
|
|
222
|
+
tagline:"Divine spontaneous caster · power at a price",
|
|
223
|
+
tradition:"divine", keyAbility:"Charisma", keyAbilityShort:"Cha",
|
|
224
|
+
casting:"spontaneous", slots:"full", prof:FULL_CASTER_PROF, cantrips:5,
|
|
225
|
+
preview:true,
|
|
226
|
+
features:[
|
|
227
|
+
{type:"signature"},
|
|
228
|
+
{type:"note", title:"Mystery & revelations", text:"Add your revelation focus spells in the Focus section below. Your escalating oracular curse is tracked on your sheet."},
|
|
229
|
+
],
|
|
230
|
+
help:[
|
|
231
|
+
["What does an oracle do?",
|
|
232
|
+
"You're a <b>Divine</b> <b>spontaneous</b> caster channeling a <b>mystery</b>. You build a repertoire and cast flexibly; your revelation spells deepen an escalating <b>curse</b> (coming soon)."],
|
|
233
|
+
["Signature spells",
|
|
234
|
+
"Mark spells as <b>signature</b> (the ★) to heighten them with higher-rank slots — usually one per spell rank."],
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
/* ---------------- MAGUS ---------------- */
|
|
238
|
+
magus:{
|
|
239
|
+
id:"magus", name:"Magus", icon:"⚔️",
|
|
240
|
+
tagline:"Arcane half-caster · blade and spell as one",
|
|
241
|
+
tradition:"arcane", keyAbility:"Intelligence", keyAbilityShort:"Int",
|
|
242
|
+
casting:"prepared", slots:"partial", prof:PARTIAL_CASTER_PROF, cantrips:5,
|
|
243
|
+
preview:true,
|
|
244
|
+
features:[{type:"note", title:"Spellstrike & conflux spells", text:"Add your conflux focus spells (Force Fang, etc.) in the Focus section. Spellstrike itself is a martial action recharged by Arcane Cascade — track it on your sheet. You have only a few spell slots, always in your top two ranks."}],
|
|
245
|
+
help:[
|
|
246
|
+
["What does a magus do?",
|
|
247
|
+
"You're a martial <b>Arcane</b> caster who fuses weapon strikes with spells via <b>Spellstrike</b>. You only get a <b>handful of spell slots</b> (always your two highest ranks), so each prepared spell is precious — often a damaging spell to channel through Spellstrike."],
|
|
248
|
+
["Why so few slots?",
|
|
249
|
+
"The magus trades spell quantity for martial power. From level 5 you stop preparing your lowest ranks entirely — the app only shows the slots you actually have. Your spell DC uses <b>Intelligence</b>."],
|
|
250
|
+
],
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
/* ---------------- SUMMONER ---------------- */
|
|
254
|
+
summoner:{
|
|
255
|
+
id:"summoner", name:"Summoner", icon:"👹",
|
|
256
|
+
tagline:"Half-caster · you and your eidolon, as one",
|
|
257
|
+
traditionFrom:"patron", defaultTradition:"arcane",
|
|
258
|
+
traditionChoiceLabel:"Eidolon's tradition",
|
|
259
|
+
traditionChoiceHint:"your eidolon's essence sets your spell tradition",
|
|
260
|
+
keyAbility:"Charisma", keyAbilityShort:"Cha",
|
|
261
|
+
casting:"spontaneous", slots:"partial", prof:PARTIAL_CASTER_PROF, cantrips:5,
|
|
262
|
+
preview:true,
|
|
263
|
+
features:[
|
|
264
|
+
{type:"signature"},
|
|
265
|
+
{type:"note", title:"Eidolon & shared life", text:"Choose your eidolon's tradition above and add evolution focus spells in the Focus section. You get only a few slots (top two ranks). Your shared HP pool and the eidolon's actions stay on your sheet."},
|
|
266
|
+
],
|
|
267
|
+
help:[
|
|
268
|
+
["What does a summoner do?",
|
|
269
|
+
"You and your <b>eidolon</b> act as a team, sharing a Hit Point pool. You're a <b>spontaneous</b> caster with very few slots — pick your eidolon's <b>tradition</b> above, build a small repertoire, and lean on your eidolon in combat."],
|
|
270
|
+
["Few slots, top ranks only",
|
|
271
|
+
"Like the magus, you cap at four slots in your two highest ranks and never reach 10th rank. Mark signature spells to heighten them into your higher slots."],
|
|
272
|
+
],
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
/* ---------------- PSYCHIC ---------------- */
|
|
276
|
+
psychic:{
|
|
277
|
+
id:"psychic", name:"Psychic", icon:"🧠",
|
|
278
|
+
tagline:"Occult spontaneous caster · few spells, mighty cantrips",
|
|
279
|
+
tradition:"occult", keyAbility:"Int or Cha", keyAbilityShort:"Key",
|
|
280
|
+
casting:"spontaneous", slots:"psychic", prof:FULL_CASTER_PROF, cantrips:5,
|
|
281
|
+
preview:true,
|
|
282
|
+
features:[
|
|
283
|
+
{type:"signature"},
|
|
284
|
+
{type:"note", title:"Psi cantrips, Amps & Unleash Psyche", text:"Your psi cantrips appear in the Focus section — cast them at will, and spend a Focus Point to Amp them (use Refocus to recover). Your spell DC uses Intelligence or Charisma, whichever your conscious mind chose. Unleash Psyche is tracked on your sheet."},
|
|
285
|
+
],
|
|
286
|
+
help:[
|
|
287
|
+
["What does a psychic do?",
|
|
288
|
+
"You're an <b>Occult</b> <b>spontaneous</b> caster who turns <b>cantrips</b> into your main weapon by <b>Amping</b> them, backed by a small pool of stronger spell slots. Your spell DC uses <b>Intelligence or Charisma</b> depending on your conscious mind."],
|
|
289
|
+
["Few slots, strong cantrips",
|
|
290
|
+
"You get only two slots per rank (one for a newly-gained rank), so cantrips and Amps carry much of your output. Mark signature spells to heighten them into higher slots."],
|
|
291
|
+
],
|
|
292
|
+
},
|
|
293
|
+
|
|
294
|
+
/* ---------------- ANIMIST ---------------- */
|
|
295
|
+
animist:{
|
|
296
|
+
id:"animist", name:"Animist", icon:"🕯️",
|
|
297
|
+
tagline:"Divine prepared caster · channels apparitions (spirits)",
|
|
298
|
+
tradition:"divine", keyAbility:"Wisdom", keyAbilityShort:"Wis",
|
|
299
|
+
casting:"prepared", slots:"full", prof:FULL_CASTER_PROF, cantrips:4,
|
|
300
|
+
preview:true,
|
|
301
|
+
features:[{type:"note", title:"Apparitions & vessel spells", text:"You prepare divine spells; your attuned apparitions grant a vessel focus spell (add the ones you know in the Focus section below) and a separate spontaneous repertoire of apparition spells that stays on your character sheet."}],
|
|
302
|
+
help:[
|
|
303
|
+
["What does an animist do?",
|
|
304
|
+
"You're a <b>Divine</b> prepared caster who channels <b>apparitions</b> — spirits that lend you power. You prepare divine spells like a cleric, and your attuned apparitions grant extra spells plus a <b>vessel</b> focus spell. The app tracks your divine slots, cantrips and DC; apparition attunement and the apparition repertoire stay on your sheet (coming soon)."],
|
|
305
|
+
["Cantrips & apparitions",
|
|
306
|
+
"You know <b>4 cantrips</b> — two you choose plus two granted by your attuned apparitions. Your <b>vessel</b> focus spell (from your primary apparition) appears in the Focus section; cast it with Focus Points like other focus spells."],
|
|
307
|
+
],
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
/* Order shown in the class picker. */
|
|
312
|
+
const CLASS_ORDER=["cleric","wizard","druid","witch","sorcerer","bard","oracle","magus","summoner","psychic","animist"];
|