fix: auto-unlock element types when attunement conversion begins — Fabricator now unlocks earth
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m26s

This commit is contained in:
2026-05-28 12:28:27 +02:00
parent aba1265cbc
commit 268baf3916
4 changed files with 17 additions and 23 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
# Circular Dependencies # Circular Dependencies
Generated: 2026-05-28T10:11:54.061Z Generated: 2026-05-28T10:18:57.618Z
No circular dependencies found. ✅ No circular dependencies found. ✅
+1 -2
View File
@@ -1,6 +1,6 @@
{ {
"_meta": { "_meta": {
"generated": "2026-05-28T10:11:52.202Z", "generated": "2026-05-28T10:18:55.814Z",
"description": "Import dependency graph for src/lib/game. Keys are files, values are arrays of files they import.", "description": "Import dependency graph for src/lib/game. Keys are files, values are arrays of files they import.",
"usage": "To find what a file affects, search for its path in the VALUES. To find what a file depends on, look at its KEY entry." "usage": "To find what a file affects, search for its path in the VALUES. To find what a file depends on, look at its KEY entry."
}, },
@@ -95,7 +95,6 @@
], ],
"crafting-actions/crafting-material-actions.ts": [ "crafting-actions/crafting-material-actions.ts": [
"crafting-fabricator.ts", "crafting-fabricator.ts",
"stores/combatStore.ts",
"stores/manaStore.ts", "stores/manaStore.ts",
"stores/uiStore.ts" "stores/uiStore.ts"
], ],
@@ -15,9 +15,10 @@ export function AttunementDebug() {
const handleUnlockAttunement = (id: string) => { const handleUnlockAttunement = (id: string) => {
if (debugUnlockAttunement) { if (debugUnlockAttunement) {
debugUnlockAttunement(id); debugUnlockAttunement(id);
// When unlocking Enchanter, also unlock the transference element // When unlocking an attunement that has a primary mana type, unlock that element
if (id === 'enchanter') { const attunementDef = ATTUNEMENTS_DEF[id];
useManaStore.getState().unlockElement('transference', 500); if (attunementDef?.primaryManaType) {
useManaStore.getState().unlockElement(attunementDef.primaryManaType, 0);
} }
} }
}; };
+11 -17
View File
@@ -167,37 +167,31 @@ export const useGameStore = create<GameCoordinatorStore>()(
meditateTicks = 0; meditateTicks = 0;
} }
// Calculate total attunement conversion per tick // Calculate total attunement conversion and apply to element pools
let totalConversionPerTick = 0; let totalConversionPerTick = 0;
Object.entries(ctx.attunement.attunements).forEach(([id, state]) => {
if (!state.active) return;
const def = ATTUNEMENTS_DEF[id];
if (!def || def.conversionRate <= 0 || !def.primaryManaType) return;
const scaledRate = getAttunementConversionRate(id, state.level || 1);
totalConversionPerTick += scaledRate * HOURS_PER_TICK;
});
// Calculate effective regen
const effectiveRegen = Math.max(0, baseRegen * (1 - incursionStrength) * meditationMultiplier - totalConversionPerTick);
// Mana regeneration
let rawMana = Math.min(ctx.mana.rawMana + effectiveRegen * HOURS_PER_TICK, maxMana);
let elements = { ...ctx.mana.elements }; let elements = { ...ctx.mana.elements };
// Apply attunement conversion
Object.entries(ctx.attunement.attunements).forEach(([id, state]) => { Object.entries(ctx.attunement.attunements).forEach(([id, state]) => {
if (!state.active) return; if (!state.active) return;
const def = ATTUNEMENTS_DEF[id]; const def = ATTUNEMENTS_DEF[id];
if (!def || def.conversionRate <= 0 || !def.primaryManaType) return; if (!def || def.conversionRate <= 0 || !def.primaryManaType) return;
const scaledRate = getAttunementConversionRate(id, state.level || 1); const scaledRate = getAttunementConversionRate(id, state.level || 1);
const conversionThisTick = scaledRate * HOURS_PER_TICK; const conversionThisTick = scaledRate * HOURS_PER_TICK;
totalConversionPerTick += conversionThisTick;
if (elements[def.primaryManaType]) { if (elements[def.primaryManaType]) {
if (!elements[def.primaryManaType].unlocked) {
elements[def.primaryManaType] = { ...elements[def.primaryManaType], unlocked: true };
}
elements[def.primaryManaType].current = Math.min( elements[def.primaryManaType].current = Math.min(
elements[def.primaryManaType].max, elements[def.primaryManaType].max,
elements[def.primaryManaType].current + conversionThisTick elements[def.primaryManaType].current + conversionThisTick,
); );
} }
}); });
const effectiveRegen = Math.max(0, baseRegen * (1 - incursionStrength) * meditationMultiplier - totalConversionPerTick);
// Mana regeneration
let rawMana = Math.min(ctx.mana.rawMana + effectiveRegen * HOURS_PER_TICK, maxMana);
let totalManaGathered = ctx.mana.totalManaGathered; let totalManaGathered = ctx.mana.totalManaGathered;
// Convert action // Convert action