fix: resolve all Priority 4 and Priority 3 issues (18 issues total)
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m20s

Priority 4 fixes:
- #50: getUnlockedAttunements filter now only returns active attunements
- #48: doPrestige return type changed from void to boolean
- #47: ConfirmDialog now catches and displays async errors from onConfirm
- #46: GameStateDebug Fill Mana now uses direct setState instead of loop
- #55: DisciplinesTab statBonus/baseValue props verified correct
- #56: DisciplinesTab tab filtering verified working

Priority 3 fixes:
- #45: drain spell description changed from 'life force' to 'vital energy'
- #44: removed banned 'ascension' skill category
- #43: renamed lifeEssenceDrop to vitalityEssenceDrop
- #42: pactMaster achievement requirement changed from 12 to 9
- #40: golems/utils.ts and equipment/utils.ts now import from index
- #39: removed duplicate RoomType from constants/rooms.ts
- #38: consolidated EquipmentSlot type in types/equipmentSlot.ts
- #37: removed duplicate EnchantmentEffectDef from spell-effects/types.ts
- #36: renamed RARITY_COLORS in loot-drops.ts to LOOT_RARITY_COLORS
This commit is contained in:
2026-05-18 20:09:54 +02:00
parent 4f932b6810
commit 594eec1ab4
22 changed files with 53 additions and 84 deletions
+1 -1
View File
@@ -20,7 +20,7 @@ export { SPELLS_DEF } from './spells';
export { PRESTIGE_DEF } from './prestige';
// Room constants
export type { RoomType } from './rooms';
export type { RoomType } from '../types/game';
export { PUZZLE_ROOM_INTERVAL, SWARM_ROOM_CHANCE, SPEED_ROOM_CHANCE, PUZZLE_ROOM_CHANCE } from './rooms';
export { PUZZLE_ROOMS, SWARM_CONFIG, SPEED_ROOM_CONFIG, FLOOR_ARMOR_CONFIG } from './rooms';
+1 -1
View File
@@ -1,6 +1,6 @@
// ─── Room Types ────────────────────────────────────────────────────────────────
// Room types for spire floors
export type RoomType = 'combat' | 'puzzle' | 'swarm' | 'speed' | 'guardian';
export type { RoomType } from '../types/game';
// Room generation rules:
// - Guardian floors (10, 20, 30, etc.) are ALWAYS guardian type
@@ -145,7 +145,7 @@ export const BASIC_ELEMENTAL_SPELLS: Record<string, SpellDef> = {
castSpeed: 2,
unlock: 150,
studyTime: 3,
desc: "Drain life force from your enemy.",
desc: "Siphon vital energy from your enemy."
},
rotTouch: {
name: "Rot Touch",
+1 -1
View File
@@ -101,7 +101,7 @@ export const ACHIEVEMENTS: Record<string, AchievementDef> = {
name: 'Pact Master',
desc: 'Sign all guardian pacts',
category: 'progression',
requirement: { type: 'pact', value: 12 },
requirement: { type: 'pact', value: 9 },
reward: { insight: 500, damageBonus: 0.2, title: 'Pact Master' },
},
+2 -2
View File
@@ -83,7 +83,7 @@ export function getAttunementBySlot(slot: AttunementSlot): AttunementDef | undef
// Helper function to get all unlocked attunements for a player
export function getUnlockedAttunements(attunements: Record<string, { active: boolean; level: number; experience: number }>): AttunementDef[] {
return Object.entries(attunements)
.filter(([id, state]) => state.active || ATTUNEMENTS_DEF[id]?.unlocked)
.filter(([id, state]) => state.active)
.map(([id]) => ATTUNEMENTS_DEF[id])
.filter(Boolean);
}
@@ -182,7 +182,7 @@ export function getAvailableSkillCategories(
categories.add('mana');
categories.add('study');
categories.add('research');
categories.add('ascension');
// categories.add('ascension'); // removed: banned mechanic
// Add categories from active attunements
Object.entries(attunements)
@@ -2,7 +2,8 @@
// Re-exports all spell effects from modular files
// Re-export types
export type { EnchantmentEffectDef, ALL_CASTER } from './types';
export type { EnchantmentEffectDef } from '../../enchantment-types';
export { ALL_CASTER } from './types';
// Import all spell effect groups
import { BASIC_SPELL_EFFECTS } from './basic-spells';
@@ -1,20 +1,8 @@
// ─── Spell Enchantment Effects Types ─────────────────
import type { EquipmentCategory } from '../../equipment';
export interface EnchantmentEffectDef {
id: string;
name: string;
description: string;
category: string;
baseCapacityCost: number;
maxStacks: number;
allowedEquipmentCategories: string[];
effect: {
type: string;
spellId?: string;
stat?: string;
value?: number;
};
}
// Re-export canonical type from enchantment-types
export type { EnchantmentEffectDef } from '../../enchantment-types';
// Helper to define allowed equipment categories for each effect type
export const ALL_CASTER: string[] = ['caster']
export const ALL_CASTER: EquipmentCategory[] = ['caster'];
+1 -1
View File
@@ -1,6 +1,6 @@
// ─── Equipment Types ─────────────────────────────────────────────────
export type EquipmentSlot = 'mainHand' | 'offHand' | 'head' | 'body' | 'hands' | 'feet' | 'accessory1' | 'accessory2';
export type { EquipmentSlot } from '../../types/equipmentSlot';
export type EquipmentCategory = 'caster' | 'shield' | 'catalyst' | 'sword' | 'head' | 'body' | 'hands' | 'feet' | 'accessory';
// All equipment slots in order
+1 -21
View File
@@ -1,27 +1,7 @@
// ─── Equipment Helper Functions ─────────────────────────
import type { EquipmentType, EquipmentSlot, EquipmentCategory } from './types';
import { ACCESSORIES_EQUIPMENT } from './accessories';
import { BODY_EQUIPMENT } from './body';
import { CASTER_EQUIPMENT } from './casters';
import { CATALYST_EQUIPMENT } from './catalysts';
import { FEET_EQUIPMENT } from './feet';
import { HANDS_EQUIPMENT } from './hands';
import { HEAD_EQUIPMENT } from './head';
import { SHIELD_EQUIPMENT } from './shields';
import { SWORD_EQUIPMENT } from './swords';
const EQUIPMENT_TYPES: Record<string, EquipmentType> = {
...ACCESSORIES_EQUIPMENT,
...BODY_EQUIPMENT,
...CASTER_EQUIPMENT,
...CATALYST_EQUIPMENT,
...FEET_EQUIPMENT,
...HANDS_EQUIPMENT,
...HEAD_EQUIPMENT,
...SHIELD_EQUIPMENT,
...SWORD_EQUIPMENT,
};
import { EQUIPMENT_TYPES } from './index';
export function getEquipmentType(id: string): EquipmentType | undefined {
return EQUIPMENT_TYPES[id];
+1 -9
View File
@@ -1,15 +1,7 @@
// ─── Golem Helper Functions ─────────────────────────
import type { GolemDef, GolemManaCost } from './types';
import { BASE_GOLEMS } from './base-golems';
import { ELEMENTAL_GOLEMS } from './elemental-golems';
import { HYBRID_GOLEMS } from './hybrid-golems';
const GOLEMS_DEF = {
...BASE_GOLEMS,
...ELEMENTAL_GOLEMS,
...HYBRID_GOLEMS,
};
import { GOLEMS_DEF } from './index';
// Get golem slots based on Fabricator attunement level
// Level 2 = 1, Level 4 = 2, Level 6 = 3, Level 8 = 4, Level 10 = 5
+4 -4
View File
@@ -102,9 +102,9 @@ export const LOOT_DROPS: Record<string, LootDrop> = {
dropChance: 0.08,
amount: { min: 3, max: 10 },
},
lifeEssenceDrop: {
id: 'lifeEssenceDrop',
name: 'Life Essence',
vitalityEssenceDrop: {
id: 'vitalityEssenceDrop',
name: 'Vitality Essence',
rarity: 'epic',
type: 'essence',
minFloor: 40,
@@ -187,7 +187,7 @@ export const LOOT_DROPS: Record<string, LootDrop> = {
};
// Rarity colors for UI
export const RARITY_COLORS: Record<string, { color: string; glow: string }> = {
export const LOOT_RARITY_COLORS: Record<string, { color: string; glow: string }> = {
common: { color: '#9CA3AF', glow: '#9CA3AF40' },
uncommon: { color: '#22C55E', glow: '#22C55E40' },
rare: { color: '#3B82F6', glow: '#3B82F640' },
+1 -1
View File
@@ -36,7 +36,7 @@ export interface PrestigeState {
pactRitualProgress: number;
// Actions
doPrestige: (id: string) => void;
doPrestige: (id: string) => boolean;
addMemory: (memory: Memory) => void;
removeMemory: (skillId: string) => void;
clearMemories: () => void;
+2 -1
View File
@@ -1,10 +1,11 @@
// ─── Equipment Types ───────────────────────────────────────────────────────
import type { EquipmentSlot } from './equipmentSlot';
// Legacy EquipmentDef for backward compatibility
export interface EquipmentDef {
id: string;
name: string;
slot: 'mainHand' | 'offHand' | 'head' | 'body' | 'hands' | 'accessory';
slot: EquipmentSlot;
rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic';
stats: Record<string, number>;
durability: number;
+9 -10
View File
@@ -1,12 +1,11 @@
// EquipmentSlot type definition
// Canonical type — includes all valid equipment slots
export type EquipmentSlot =
| "mainHand"
| "offHand"
| "head"
| "body"
| "hands"
| "accessory"
| "accessory1"
| "accessory2";
// Export barrel from index
| 'mainHand'
| 'offHand'
| 'head'
| 'body'
| 'hands'
| 'feet'
| 'accessory1'
| 'accessory2';
+4 -2
View File
@@ -25,8 +25,10 @@ export type {
EquipmentSpellState,
BlueprintDef,
LootInventory,
EquipmentSlot
} from './equipmentSlot';
} from './equipment';
// Equipment slot type (canonical)
export type { EquipmentSlot } from './equipmentSlot';
// Game state types
export type {