refactor: eliminate as any type casts across 18 source files
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m34s

- Fix computeDisciplineEffects() to not require GameState parameter
- Fix getUnifiedEffects() to accept proper partial state type
- Replace upgradeEffects as any with proper UnifiedEffects type
- Replace explicit : any annotations with proper types (ComputedEffects, DesignProgress, SpellDef, etc.)
- Fix activity-log.ts eventType casting
- Fix crafting-design.ts computedEffects and designProgress types
- Fix page.tsx grimoire spell rendering with proper SpellDef property names
- Fix StatsTab ManaStatsSection with proper ManaStatsEffects interface
- Remove unused imports (useDisciplineStore from page.tsx, LeftPanel.tsx)

Remaining: 1 as any in craftingStore.ts (pre-existing CraftingStore/GameState architectural mismatch)
This commit is contained in:
2026-05-20 17:22:52 +02:00
parent df316c2865
commit 742a992d59
36 changed files with 1820 additions and 1460 deletions
+42 -25
View File
@@ -4,12 +4,12 @@
// - Skill upgrade effects (from milestone upgrades)
// - Equipment enchantment effects (from enchanted gear)
import type { GameState, EquipmentInstance } from './types';
import type { EquipmentInstance } from './types';
import { ENCHANTMENT_EFFECTS } from './data/enchantment-effects';
import { computeEffects } from './effects/upgrade-effects';
import { hasSpecial, SPECIAL_EFFECTS } from './effects/special-effects';
import { computeDisciplineEffects } from './effects/discipline-effects';
import type { ComputedEffects } from './upgrade-effects.types';
import type { ComputedEffects } from './effects/upgrade-effects.types';
// Re-export for convenience
export { computeEffects } from './effects/upgrade-effects';
@@ -65,12 +65,6 @@ export function computeEquipmentEffects(
return { bonuses, multipliers, specials };
}
// ─── Discipline Effects Integration ──────────────────────────────────────────
export function getDisciplineEffects(state: GameState) {
return computeDisciplineEffects(state);
}
// ─── Unified Computed Effects ─────────────────────────────────────────────────
export interface UnifiedEffects extends ComputedEffects {
@@ -87,11 +81,10 @@ export function computeAllEffects(
skillTiers: Record<string, number>,
equipmentInstances: Record<string, EquipmentInstance>,
equippedInstances: Record<string, string | null>,
gameState: GameState
): UnifiedEffects {
const upgradeEffects = computeEffects(skillUpgrades, skillTiers);
const equipmentEffects = computeEquipmentEffects(equipmentInstances, equippedInstances, upgradeEffects.enchantmentPowerMultiplier);
const disciplineEffects = getDisciplineEffects(gameState);
const disciplineEffects = computeDisciplineEffects();
const perElementCapBonus: Record<string, number> = { ...upgradeEffects.perElementCapBonus };
for (const [key, value] of Object.entries(equipmentEffects.bonuses)) {
@@ -137,49 +130,73 @@ export function computeAllEffects(
return merged;
}
export function getUnifiedEffects(state: Pick<GameState, 'skillUpgrades' | 'skillTiers' | 'equipmentInstances' | 'equippedInstances'>): UnifiedEffects {
export function getUnifiedEffects(state: {
skillUpgrades?: Record<string, string[]>;
skillTiers?: Record<string, number>;
equipmentInstances?: Record<string, EquipmentInstance>;
equippedInstances?: Record<string, string | null>;
}): UnifiedEffects {
return computeAllEffects(
state.skillUpgrades || {},
state.skillTiers || {},
state.equipmentInstances || {},
state.equippedInstances || {},
state as unknown as GameState
);
}
// ─── Stat Computation with All Effects ───────────────────────────────────────
export function computeTotalMaxMana(
state: Pick<GameState, 'skills' | 'prestigeUpgrades' | 'skillUpgrades' | 'skillTiers' | 'equipmentInstances' | 'equippedInstances'>,
state: {
skills?: Record<string, number>;
prestigeUpgrades?: Record<string, number>;
skillUpgrades?: Record<string, string[]>;
skillTiers?: Record<string, number>;
equipmentInstances?: Record<string, EquipmentInstance>;
equippedInstances?: Record<string, string | null>;
},
effects?: UnifiedEffects
): number {
const pu = state.prestigeUpgrades;
const skillMult = effects?.skillLevelMultiplier || 1;
const base = 100 + ((state.skills || {}).manaWell || 0) * 100 * skillMult + ((pu || {}).manaWell || 0) * 500;
if (!effects) effects = getUnifiedEffects(state as any);
return Math.floor((base + effects.maxManaBonus) * effects.maxManaMultiplier);
const resolvedEffects = effects || getUnifiedEffects(state);
return Math.floor((base + resolvedEffects.maxManaBonus) * resolvedEffects.maxManaMultiplier);
}
export function computeTotalRegen(
state: Pick<GameState, 'skills' | 'prestigeUpgrades' | 'skillUpgrades' | 'skillTiers' | 'equipmentInstances' | 'equippedInstances'>,
state: {
skills?: Record<string, number>;
prestigeUpgrades?: Record<string, number>;
skillUpgrades?: Record<string, string[]>;
skillTiers?: Record<string, number>;
equipmentInstances?: Record<string, EquipmentInstance>;
equippedInstances?: Record<string, string | null>;
},
effects?: UnifiedEffects
): number {
const pu = state.prestigeUpgrades;
const temporalBonus = 1 + (pu.temporalEcho || 0) * 0.1;
const temporalBonus = 1 + ((pu?.temporalEcho || 0)) * 0.1;
const skillMult = effects?.skillLevelMultiplier || 1;
const base = 2 + (state.skills.manaFlow || 0) * 1 * skillMult + (state.skills.manaSpring || 0) * 2 * skillMult + (pu.manaFlow || 0) * 0.5;
const base = 2 + (state.skills?.manaFlow || 0) * 1 * skillMult + (state.skills?.manaSpring || 0) * 2 * skillMult + (pu?.manaFlow || 0) * 0.5;
let regen = base * temporalBonus;
if (!effects) effects = getUnifiedEffects(state as any);
regen = (regen + effects.regenBonus + effects.permanentRegenBonus) * effects.regenMultiplier;
const resolvedEffects = effects || getUnifiedEffects(state);
regen = (regen + resolvedEffects.regenBonus + resolvedEffects.permanentRegenBonus) * resolvedEffects.regenMultiplier;
return regen;
}
export function computeTotalClickMana(
state: Pick<GameState, 'skills' | 'skillUpgrades' | 'skillTiers' | 'equipmentInstances' | 'equippedInstances'>,
state: {
skills?: Record<string, number>;
skillUpgrades?: Record<string, string[]>;
skillTiers?: Record<string, number>;
equipmentInstances?: Record<string, EquipmentInstance>;
equippedInstances?: Record<string, string | null>;
},
effects?: UnifiedEffects
): number {
const skillMult = effects?.skillLevelMultiplier || 1;
const base = 1 + (state.skills.manaTap || 0) * 1 * skillMult + (state.skills.manaSurge || 0) * 3 * skillMult;
if (!effects) effects = getUnifiedEffects(state as any);
return Math.floor((base + effects.clickManaBonus) * effects.clickManaMultiplier);
}
const base = 1 + (state.skills?.manaTap || 0) * 1 * skillMult + (state.skills?.manaSurge || 0) * 3 * skillMult;
const resolvedEffects = effects || getUnifiedEffects(state);
return Math.floor((base + resolvedEffects.clickManaBonus) * resolvedEffects.clickManaMultiplier);
}