+ No {system === 'pf2e' ? 'ancestry' : 'race'} selected — you can continue (handy for homebrew), but its ability bonuses, HP, speed, and skills won’t be applied.
+
+ )}
{selectedClass && selectedOrigin && (() => {
const synergy = raceSynergyNote(selectedOrigin.meta ?? '', selectedClass.keyAbilities);
if (!synergy) return null;
@@ -658,7 +744,17 @@ export function CreationWizard({ campaign, onClose }: { campaign?: Campaign | un
const value = base + racial + asi;
const isKey = selectedClass?.keyAbilities.includes(a);
const fMin = method === 'pointbuy' ? POINT_BUY_MIN : 1;
- const fMax = method === 'pointbuy' ? POINT_BUY_MAX : 30;
+ // Point-buy caps each field at what the remaining budget can afford,
+ // so the user can't overspend and wonder why Next is disabled.
+ const fMax = method === 'pointbuy'
+ ? (() => {
+ let best = pb[i]!;
+ for (let cand = pb[i]! + 1; cand <= POINT_BUY_MAX; cand++) {
+ if (pointBuyRemaining(pb.map((x, j) => (j === i ? cand : x))) >= 0) best = cand; else break;
+ }
+ return best;
+ })()
+ : 30;
return (
{ABILITY_ABBR[a]}{isKey && }
@@ -694,7 +790,9 @@ export function CreationWizard({ campaign, onClose }: { campaign?: Campaign | un
{stepName === 'Skills' && (
{system === 'pf2e' ? 'These start at the Trained proficiency rank; you can raise ranks as you level up.' : 'You gain proficiency in these skills, adding your proficiency bonus to checks.'}
{grantedSkillSources.length > 0 && (
@@ -708,13 +806,6 @@ export function CreationWizard({ campaign, onClose }: { campaign?: Campaign | un
)}
- {level > 1 && (
-
- {system === 'pf2e'
- ? 'Higher-level characters also gain skill increases at levels 3, 5, 7, 9… — apply those from the character sheet’s level-up flow.'
- : 'Some classes gain extra skill/expertise picks as they level — apply those from the character sheet’s level-up flow.'}
-
Pick your cantrips and a few starting spells — about {suggestedSpells} is a good start at level {level}. Search by name; you can always adjust on the sheet later.
-
These are the spells you {system === 'pf2e' ? 'know (your repertoire)' : 'know (the spells you’ve learned)'}. You prepare or cast them from slots on the character sheet.
+
+ {(() => {
+ // Prepared casters re-select daily from a book/list; known casters have a
+ // fixed repertoire. Different mental model, so spell out which applies.
+ const prepared = (system === '5e' ? ['cleric', 'druid', 'paladin', 'wizard', 'artificer'] : ['wizard', 'cleric', 'druid', 'witch', 'magus', 'animist'])
+ .includes((selectedClass?.name ?? '').toLowerCase());
+ return prepared ? (
+ <>As a prepared caster, these go into your {system === 'pf2e' ? 'spellbook/list' : 'spellbook'} — each day you prepare a subset on the sheet, so pick a versatile starting set.>
+ ) : (
+ <>These are the spells you know (your repertoire) — a fixed list you cast from slots; you can swap picks when you level up.>
+ );
+ })()}
+
suggestedSpells + 4 ? 'text-warning' : 'text-muted')}>
{spellPicks.length} selected{spellPicks.length > suggestedSpells + 4 ? ' — that’s quite a few; you can trim some later if you like.' : ''}
@@ -800,7 +948,11 @@ export function CreationWizard({ campaign, onClose }: { campaign?: Campaign | un