feat: discipline UI improvements - stat labels, prerequisites, mana type tab
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s

- Add player-friendly label field to statBonus in DisciplineDefinition
- Show prerequisite requirements on locked discipline cards
- Disable activate button for locked disciplines
- Restructure elemental attunement into dedicated 'Mana Types' tab
- Add checkDisciplinePrerequisites utility function
- Update store to enforce prerequisite checking on activation
- Split discipline-prerequisites tests into separate file
This commit is contained in:
2026-05-25 15:20:02 +02:00
parent 2c58186a67
commit 635b3b3f70
21 changed files with 313 additions and 82 deletions
+28
View File
@@ -87,6 +87,34 @@ export function canProceedDiscipline(
return element && element.current >= drain;
}
/**
* Check if a discipline's prerequisites are met.
* Returns { canProceed: boolean, missingPrereqs: string[] }
* where missingPrereqs is a list of prerequisite discipline names that are not yet unlocked.
*/
export function checkDisciplinePrerequisites(
discipline: DisciplineDefinition,
allDisciplines: Record<string, DisciplineState>,
allDefinitions: DisciplineDefinition[],
): { canProceed: boolean; missingPrereqs: string[] } {
if (!discipline.requires || discipline.requires.length === 0) {
return { canProceed: true, missingPrereqs: [] };
}
const missingPrereqs: string[] = [];
for (const reqId of discipline.requires) {
const reqState = allDisciplines[reqId];
// A prerequisite is met if the discipline has XP > 0 (has been practiced)
if (!reqState || reqState.xp <= 0) {
const reqDef = allDefinitions.find((d) => d.id === reqId);
missingPrereqs.push(reqDef?.name ?? reqId);
}
}
return { canProceed: missingPrereqs.length === 0, missingPrereqs };
}
/**
* Get unlocked perks for a discipline
*/