diff --git a/README.md b/README.md
index 03e7f18..2a37d12 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@ In the creator, the Concept page only has a "Rules preset" selector. Presets are
### Skills, proficiency and expertise
-- `creation.advanced_unlock_cost`: pool points needed to unlock an advanced skill (free if a profession or proficiency covers it).
+- `creation.advanced_unlock_cost`: pool points needed to unlock an advanced skill (free if the character's profession grants proficiency in it; proficiency picks do not unlock a skill).
- `creation.free_proficiencies`: free proficiency picks every character gets. Talents can add more with `"proficiency_picks": N` (see "Versatile Training").
- Proficiency is +`proficiency_bonus`; two picks on one skill (a profession proficiency counts as one) give Expertise, +`expertise_bonus`.
diff --git a/backend/app/derive.py b/backend/app/derive.py
index 9faa5b4..bc347cf 100644
--- a/backend/app/derive.py
+++ b/backend/app/derive.py
@@ -37,7 +37,7 @@ def compute(ch: dict, rules: dict) -> dict:
pips = prof_pip + max(0, free_pips)
prof = [0, cr["proficiency_bonus"], cr["expertise_bonus"]][pips]
unlocked = s["id"] in (ch.get("unlocked") or [])
- usable = s["type"] == "basic" or unlocked or prof > 0 # advanced skills must be unlocked
+ usable = s["type"] == "basic" or unlocked or prof_pip > 0 # advanced skills must be unlocked (a profession proficiency does it for free)
best = max(attrs[a] for a in s["attrs"]) # with several attributes the higher one counts
skills.append({**s, "points": pts, "prof": prof, "pips": pips, "usable": usable, "unlocked": unlocked,
"total": best + pts + prof})
diff --git a/backend/data/rules.json b/backend/data/rules.json
index 7530cf1..b8a06e5 100644
--- a/backend/data/rules.json
+++ b/backend/data/rules.json
@@ -421,7 +421,7 @@
"Proficiency: +10. Expertise: +20.",
"Every character gets 2 free proficiency picks on top of the profession's proficiencies. A talent can grant 2 more.",
"Putting two proficiency picks into the same skill makes it Expertise (a profession proficiency counts as one of the two).",
- "Proficiency in an advanced skill unlocks it for free.",
+ "Proficiency picks can only be used on skills you can use, so an advanced skill has to be unlocked first.",
"Groups: Combat, Survival, Social, Technical, Knowledge & Mental."
]
},
diff --git a/frontend/src/Creator.jsx b/frontend/src/Creator.jsx
index 20ba1b9..2bac4bc 100644
--- a/frontend/src/Creator.jsx
+++ b/frontend/src/Creator.jsx
@@ -134,6 +134,7 @@ export default function Creator({ rules: baseRules, user, loadRequest, clearLoad
// Click on pip k (1 = Proficient, 2 = Expertise) of a skill: sets the skill's total pips to k, or one lower if already there.
const clickPip = (s, k) => {
+ if (!s.usable) return flash('Unlock this advanced skill first.')
const target = s.pips >= k ? k - 1 : k
const wantFree = Math.max(0, target - s.profPip)
if (wantFree - s.freePips > c.profLeft) return flash('No proficiency picks left.')
@@ -263,7 +264,7 @@ export default function Creator({ rules: baseRules, user, loadRequest, clearLoad
Skills
At most half the attribute per skill. Advanced skills must be unlocked first for {c.unlockCost} points from the pool
- (free if your profession grants them). The pool size comes from the rules preset.
+ (free if your profession grants proficiency in them). The pool size comes from the rules preset.
Proficiency adds +{cr.proficiency_bonus}. Two picks on the same skill make it Expertise (+{cr.expertise_bonus}); a profession proficiency counts as one of them.
- Proficiency in an advanced skill unlocks it for free. The talent "Versatile Training" grants 2 more picks.
+ Proficiency picks only work on skills you can use, so unlock an advanced skill first. The talent "Versatile Training" grants 2 more picks.
{rules.skill_groups.map((g) => (
@@ -295,8 +296,8 @@ export default function Creator({ rules: baseRules, user, loadRequest, clearLoad
Training
{[1, 2].map((k) => (
))}