feat: discipline UI improvements - stat labels, prerequisites, mana type tab
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m23s
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:
@@ -20,7 +20,7 @@ const rawMastery: DisciplineDefinition = {
|
||||
manaType: 'raw',
|
||||
baseCost: 5,
|
||||
description: 'Learn to harness raw mana more efficiently.',
|
||||
statBonus: { stat: 'maxManaBonus', baseValue: 10 },
|
||||
statBonus: { stat: 'maxManaBonus', baseValue: 10, label: 'Max Mana Bonus' },
|
||||
difficultyFactor: 100,
|
||||
scalingFactor: 50,
|
||||
drainBase: 1,
|
||||
@@ -42,14 +42,14 @@ const rawMastery: DisciplineDefinition = {
|
||||
],
|
||||
};
|
||||
|
||||
const elementalAttunement: DisciplineDefinition = {
|
||||
id: 'elemental-attunement',
|
||||
name: 'Elemental Attunement',
|
||||
const attuneFire: DisciplineDefinition = {
|
||||
id: 'attune-fire',
|
||||
name: 'Fire Attunement',
|
||||
attunement: DisciplinesAttunementType.BASE,
|
||||
manaType: 'fire',
|
||||
baseCost: 10,
|
||||
description: 'Begin focusing raw mana into fire.',
|
||||
statBonus: { stat: 'elementCap_fire', baseValue: 5 },
|
||||
statBonus: { stat: 'elementCap_fire', baseValue: 5, label: 'Fire Element Cap' },
|
||||
difficultyFactor: 150,
|
||||
scalingFactor: 75,
|
||||
drainBase: 2,
|
||||
@@ -71,7 +71,7 @@ const cappedPerkDiscipline: DisciplineDefinition = {
|
||||
manaType: 'raw',
|
||||
baseCost: 1,
|
||||
description: 'Test discipline with capped perk.',
|
||||
statBonus: { stat: 'testStat', baseValue: 1 },
|
||||
statBonus: { stat: 'testStat', baseValue: 1, label: 'Test Stat' },
|
||||
difficultyFactor: 100,
|
||||
scalingFactor: 100,
|
||||
drainBase: 1,
|
||||
@@ -196,28 +196,28 @@ describe('canActivateDiscipline', () => {
|
||||
});
|
||||
|
||||
it('should return true when required element is unlocked', () => {
|
||||
const result = canActivateDiscipline(elementalAttunement, {
|
||||
const result = canActivateDiscipline(attuneFire, {
|
||||
elements: { fire: { unlocked: true } },
|
||||
});
|
||||
expect(result).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false when required element is locked', () => {
|
||||
const result = canActivateDiscipline(elementalAttunement, {
|
||||
const result = canActivateDiscipline(attuneFire, {
|
||||
elements: { fire: { unlocked: false } },
|
||||
});
|
||||
expect(result).toBe(false);
|
||||
});
|
||||
|
||||
it('should return falsy when required element does not exist', () => {
|
||||
const result = canActivateDiscipline(elementalAttunement, {
|
||||
const result = canActivateDiscipline(attuneFire, {
|
||||
elements: {},
|
||||
});
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should return falsy when elements is undefined', () => {
|
||||
const result = canActivateDiscipline(elementalAttunement, {});
|
||||
const result = canActivateDiscipline(attuneFire, {});
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
});
|
||||
@@ -255,16 +255,16 @@ describe('canProceedDiscipline', () => {
|
||||
});
|
||||
|
||||
it('should return true when element mana is sufficient', () => {
|
||||
const state: DisciplineState = { id: 'elemental-attunement', xp: 0, paused: false };
|
||||
const result = canProceedDiscipline(elementalAttunement, state, {
|
||||
const state: DisciplineState = { id: 'attune-fire', xp: 0, paused: false };
|
||||
const result = canProceedDiscipline(attuneFire, state, {
|
||||
elements: { fire: { current: 100, max: 100, unlocked: true } },
|
||||
});
|
||||
expect(result).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false when element mana is insufficient', () => {
|
||||
const state: DisciplineState = { id: 'elemental-attunement', xp: 10000, paused: false };
|
||||
const result = canProceedDiscipline(elementalAttunement, state, {
|
||||
const state: DisciplineState = { id: 'attune-fire', xp: 10000, paused: false };
|
||||
const result = canProceedDiscipline(attuneFire, state, {
|
||||
elements: { fire: { current: 0, max: 100, unlocked: true } },
|
||||
});
|
||||
expect(result).toBe(false);
|
||||
@@ -340,10 +340,10 @@ describe('calculateDisciplineStats', () => {
|
||||
});
|
||||
|
||||
it('should sum stats from multiple active disciplines', () => {
|
||||
const disciplines = [rawMastery, elementalAttunement];
|
||||
const disciplines = [rawMastery, attuneFire];
|
||||
const states: DisciplineState[] = [
|
||||
{ id: 'raw-mastery', xp: 50, paused: false },
|
||||
{ id: 'elemental-attunement', xp: 75, paused: false },
|
||||
{ id: 'attune-fire', xp: 75, paused: false },
|
||||
];
|
||||
const result = calculateDisciplineStats(disciplines, states);
|
||||
expect(result.maxManaBonus).toBeGreaterThan(0);
|
||||
@@ -351,10 +351,10 @@ describe('calculateDisciplineStats', () => {
|
||||
});
|
||||
|
||||
it('should skip paused disciplines', () => {
|
||||
const disciplines = [rawMastery, elementalAttunement];
|
||||
const disciplines = [rawMastery, attuneFire];
|
||||
const states: DisciplineState[] = [
|
||||
{ id: 'raw-mastery', xp: 50, paused: false },
|
||||
{ id: 'elemental-attunement', xp: 75, paused: true },
|
||||
{ id: 'attune-fire', xp: 75, paused: true },
|
||||
];
|
||||
const result = calculateDisciplineStats(disciplines, states);
|
||||
expect(result.maxManaBonus).toBeGreaterThan(0);
|
||||
@@ -362,7 +362,7 @@ describe('calculateDisciplineStats', () => {
|
||||
});
|
||||
|
||||
it('should handle missing state for a discipline', () => {
|
||||
const disciplines = [rawMastery, elementalAttunement];
|
||||
const disciplines = [rawMastery, attuneFire];
|
||||
const states: DisciplineState[] = [
|
||||
{ id: 'raw-mastery', xp: 50, paused: false },
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user