fix(#165,#166,#167,#168,#169,#171,#172): resolve 7 open bug issues

#172 - Grimoire tab: removed dead 'loaded' state guard that permanently showed loading
#169 - Transference Mana Flow: added elements param to checkDisciplinePrerequisites so mana type unlocks are verified
#168 - Perk descriptions: wired 4 broken perks (enchant-2, channel-1, golem-2, efficiency-1) with actual bonus effects; fixed enchant-1 interval (5→50); fixed study-mana-enchantments stat (maxMana→maxManaBonus)
#171 - Shields: removed all shield equipment (4 types), recipes, category, slot mappings; added 'shields' to AGENTS.md banned list
#166 - regenMultiplier: merged disciplineEffects.multipliers.regenMultiplier into computeAllEffects()
#165 - Meditation cap: added meditationCap display to ManaStatsSection UI; updated perk description
#167 - XP accumulation: added Meditative Mastery base discipline with disciplineXpBonus stat; wired into tick pipeline
This commit is contained in:
2026-05-28 09:32:43 +02:00
parent 27500f37b7
commit 8cebea9586
26 changed files with 153 additions and 125 deletions
@@ -3,7 +3,6 @@ import {
Sparkles,
Package,
Sword,
Shield,
Shirt,
Crown,
Wrench
@@ -11,7 +10,6 @@ import {
export const CATEGORY_ICONS: Record<string, typeof Sword> = {
caster: Sword,
shield: Shield,
catalyst: Sparkles,
head: Crown,
body: Shirt,
@@ -24,7 +24,7 @@ const BRANCH_RECIPE_IDS = new Set([
'oakStaff', 'arcanistStaff', 'battlestaff', 'arcanistCirclet', 'arcanistRobe',
'voidCatalyst', 'arcanistPendant',
'crystalBlade', 'arcanistBlade', 'voidBlade', 'battleHelm', 'battleRobe',
'battleBoots', 'combatGauntlets', 'runicShield', 'manaShield',
'battleBoots', 'combatGauntlets',
]);
function isWizardBranch(recipe: FabricatorRecipe): boolean {
@@ -34,8 +34,7 @@ function isWizardBranch(recipe: FabricatorRecipe): boolean {
function isPhysicalBranch(recipe: FabricatorRecipe): boolean {
return ['crystalBlade', 'arcanistBlade', 'voidBlade', 'battleHelm',
'battleRobe', 'battleBoots', 'combatGauntlets', 'runicShield',
'manaShield'].includes(recipe.id);
'battleRobe', 'battleBoots', 'combatGauntlets'].includes(recipe.id);
}
function RecipeCard({
+1 -1
View File
@@ -257,7 +257,7 @@ export const DisciplinesTab: React.FC = () => {
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{activeTab?.items.map((disc) => {
const discState = disciplines[disc.id] ?? { xp: 0, paused: true };
const prereqCheck = checkDisciplinePrerequisites(disc, disciplines, ALL_DISCIPLINES);
const prereqCheck = checkDisciplinePrerequisites(disc, disciplines, ALL_DISCIPLINES, elements);
return (
<DisciplineCard
key={disc.id}
+5 -1
View File
@@ -25,7 +25,11 @@ export function StatsTab() {
return (
<div className="space-y-4">
<ManaStatsSection
stats={{ ...manaStats, rawMana: manaStats.maxMana }}
stats={{
...manaStats,
rawMana: manaStats.maxMana,
meditationCap: manaStats.meditationCap,
}}
elemMax={elemMax}
/>
<CombatStatsSection
@@ -11,6 +11,7 @@ export interface ManaStatsData {
effectiveRegen: number;
clickMana: number;
meditationMultiplier: number;
meditationCap: number;
upgradeEffects: ComputedEffects;
incursionStrength: number;
rawMana: number;
@@ -124,6 +125,10 @@ export function ManaStatsSection({ stats, elemMax }: ManaStatsSectionProps) {
{fmtDec(meditationMultiplier, 2)}x
</span>
</div>
<div className="flex justify-between text-sm">
<span style={{ color: 'var(--text-muted)' }}>Meditation Cap:</span>
<span style={{ color: 'var(--text-secondary)' }}>{fmtDec(stats.meditationCap, 1)}x</span>
</div>
<div className="flex justify-between text-sm">
<span style={{ color: 'var(--text-muted)' }}>Incursion Strength:</span>
<span style={{ color: 'var(--color-danger)' }}>{Math.round(incursionStrength * 100)}%</span>