diff --git a/src/components/game/ManaDisplay.tsx b/src/components/game/ManaDisplay.tsx index 460d7a2..cbbb598 100755 --- a/src/components/game/ManaDisplay.tsx +++ b/src/components/game/ManaDisplay.tsx @@ -39,26 +39,37 @@ export function ManaDisplay({ .sort((a, b) => b[1].current - a[1].current); return ( - + {/* Raw Mana - Main Display */}
- {fmt(rawMana)} - / {fmt(maxMana)} + {fmt(rawMana)} + / {fmt(maxMana)}
-
- +{fmtDec(effectiveRegen)} mana/hr {meditationMultiplier > 1.01 && ({fmtDec(meditationMultiplier, 1)}x med)} +
+ +{fmtDec(effectiveRegen)} mana/hr {meditationMultiplier > 1.01 && ({fmtDec(meditationMultiplier, 1)}x med)}
{/* Elemental Mana Pools */} {unlockedElements.length > 0 && ( -
+
{expanded && ( -
+
{unlockedElements.map(([id, state]) => { const elem = ELEMENTS[id]; if (!elem) return null; @@ -90,7 +102,11 @@ export function ManaDisplay({ return (
{elem.sym} @@ -98,16 +114,16 @@ export function ManaDisplay({ {elem.name}
-
+
-
+
{fmt(state.current)}/{fmt(state.max)}
diff --git a/src/components/game/StatsTab/ActiveUpgradesSection.tsx b/src/components/game/StatsTab/ActiveUpgradesSection.tsx index 7e7b824..a13df87 100644 --- a/src/components/game/StatsTab/ActiveUpgradesSection.tsx +++ b/src/components/game/StatsTab/ActiveUpgradesSection.tsx @@ -14,24 +14,24 @@ interface ActiveUpgradesSectionProps { export function ActiveUpgradesSection({ selectedUpgrades }: ActiveUpgradesSectionProps) { if (selectedUpgrades.length === 0) { return ( - + - + Active Skill Upgrades (0) -
No skill upgrades selected yet. Level skills to 5 or 10 to choose upgrades.
+
No skill upgrades selected yet. Level skills to 5 or 10 to choose upgrades.
); } return ( - + - + Active Skill Upgrades ({selectedUpgrades.length}) @@ -39,26 +39,26 @@ export function ActiveUpgradesSection({ selectedUpgrades }: ActiveUpgradesSectio
{selectedUpgrades.map(({ skillId, upgrade }) => ( -
+
- {upgrade.name} - + {upgrade.name} + {SKILLS_DEF[skillId]?.name || skillId}
-
{upgrade.desc}
+
{upgrade.desc}
{upgrade.effect.type === 'multiplier' && ( -
+
+{Math.round((upgrade.effect.value! - 1) * 100)}% {upgrade.effect.stat}
)} {upgrade.effect.type === 'bonus' && ( -
+
+{upgrade.effect.value} {upgrade.effect.stat}
)} {upgrade.effect.type === 'special' && ( -
+
⚡ {upgrade.effect.specialDesc || 'Special effect active'}
)} @@ -68,4 +68,4 @@ export function ActiveUpgradesSection({ selectedUpgrades }: ActiveUpgradesSectio ); -} +} \ No newline at end of file diff --git a/src/components/game/StatsTab/CombatStatsSection.tsx b/src/components/game/StatsTab/CombatStatsSection.tsx index 6fa5fb8..5e6e37d 100644 --- a/src/components/game/StatsTab/CombatStatsSection.tsx +++ b/src/components/game/StatsTab/CombatStatsSection.tsx @@ -24,9 +24,9 @@ export function CombatStatsSection({ activeSpellDef, pactMultiplier }: CombatSta }); return ( - + - + Combat Stats @@ -35,50 +35,50 @@ export function CombatStatsSection({ activeSpellDef, pactMultiplier }: CombatSta
- Active Spell Base Damage: - {activeSpellDef?.dmg || 5} + Active Spell Base Damage: + {activeSpellDef?.dmg || 5}
- Combat Training Bonus: - +{(skills.combatTrain || 0) * 5} + Combat Training Bonus: + +{(skills.combatTrain || 0) * 5}
- Arcane Fury Multiplier: - ×{fmtDec(1 + (skills.arcaneFury || 0) * 0.1, 2)} + Arcane Fury Multiplier: + ×{fmtDec(1 + (skills.arcaneFury || 0) * 0.1, 2)}
- Elemental Mastery: - ×{fmtDec(1 + (skills.elementalMastery || 0) * 0.15, 2)} + Elemental Mastery: + ×{fmtDec(1 + (skills.elementalMastery || 0) * 0.15, 2)}
- Guardian Bane: - ×{fmtDec(1 + (skills.guardianBane || 0) * 0.2, 2)} (vs guardians) + Guardian Bane: + ×{fmtDec(1 + (skills.guardianBane || 0) * 0.2, 2)} (vs guardians)
- Critical Hit Chance: - {((skills.precision || 0) * 5)}% + Critical Hit Chance: + {((skills.precision || 0) * 5)}%
- Critical Multiplier: - 1.5x + Critical Multiplier: + 1.5x
- Spell Echo Chance: - {((skills.spellEcho || 0) * 10)}% + Spell Echo Chance: + {((skills.spellEcho || 0) * 10)}%
- Pact Multiplier: - ×{fmtDec(pactMultiplier, 2)} + Pact Multiplier: + ×{fmtDec(pactMultiplier, 2)}
-
- Total Damage: - {fmt(activeSpellDef ? activeSpellDef.dmg * pactMultiplier : 0)} +
+ Total Damage: + {fmt(activeSpellDef ? activeSpellDef.dmg * pactMultiplier : 0)}
); -} +} \ No newline at end of file diff --git a/src/components/game/StatsTab/ElementStatsSection.tsx b/src/components/game/StatsTab/ElementStatsSection.tsx index 73ffd55..f1be1bc 100644 --- a/src/components/game/StatsTab/ElementStatsSection.tsx +++ b/src/components/game/StatsTab/ElementStatsSection.tsx @@ -27,9 +27,9 @@ export function ElementStatsSection({ elemMax }: ElementStatsSectionProps) { }; return ( - + - + Element Stats @@ -38,40 +38,40 @@ export function ElementStatsSection({ elemMax }: ElementStatsSectionProps) {
- Element Capacity: - {elemMax} + Element Capacity: + {elemMax}
- Elem. Attunement Bonus: - +{getElemAttunementBonus()} + Elem. Attunement Bonus: + +{getElemAttunementBonus()}
- Prestige Attunement: - +{(prestigeUpgrades.elementalAttune || 0) * 25} + Prestige Attunement: + +{(prestigeUpgrades.elementalAttune || 0) * 25}
- Unlocked Elements: - {Object.values(elements || {}).filter((e: any) => e.unlocked).length} / {Object.keys(ELEMENTS).length} + Unlocked Elements: + {Object.values(elements || {}).filter((e: any) => e.unlocked).length} / {Object.keys(ELEMENTS).length}
- Elem. Crafting Bonus: - ×{fmtDec(1 + (skills.elemCrafting || 0) * 0.25, 2)} + Elem. Crafting Bonus: + ×{fmtDec(1 + (skills.elemCrafting || 0) * 0.25, 2)}
- -
Elemental Mana Pools:
+ +
Elemental Mana Pools:
{Object.entries(elements) .filter(([, state]: [string, any]) => state.unlocked) .map(([id, state]: [string, any]) => { const def = ELEMENTS[id]; return ( -
-
{def?.sym}
-
{state.current}/{state.max}
+
+
{def?.sym}
+
{state.current}/{state.max}
); })} @@ -79,4 +79,4 @@ export function ElementStatsSection({ elemMax }: ElementStatsSectionProps) { ); -} +} \ No newline at end of file diff --git a/src/components/game/StatsTab/LoopStatsSection.tsx b/src/components/game/StatsTab/LoopStatsSection.tsx index 09f59fa..99c6716 100644 --- a/src/components/game/StatsTab/LoopStatsSection.tsx +++ b/src/components/game/StatsTab/LoopStatsSection.tsx @@ -4,7 +4,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Separator } from '@/components/ui/separator'; import { RotateCcw } from 'lucide-react'; import { fmt } from '@/lib/game/stores'; -import { useCombatStore, usePrestigeStore, useManaStore } from '@/lib/game/stores'; +import { useCombatStore, usePrestigeStore, useManaStore, useSkillStore } from '@/lib/game/stores'; export function LoopStatsSection() { const spells = useCombatStore((s) => s.spells); @@ -20,49 +20,49 @@ export function LoopStatsSection() { const totalSkillLevels = Object.values(skills || {}).reduce((a: number, b: number) => a + b, 0); return ( - + - + Loop Stats
-
-
{loopCount}
-
Loops Completed
+
+
{loopCount}
+
Loops Completed
-
-
{fmt(insight)}
-
Current Insight
+
+
{fmt(insight)}
+
Current Insight
-
-
{fmt(totalInsight)}
-
Total Insight
+
+
{fmt(totalInsight)}
+
Total Insight
-
-
{maxFloorReached}
-
Max Floor
+
+
{maxFloorReached}
+
Max Floor
- +
-
-
{spellsLearned}
-
Spells Learned
+
+
{spellsLearned}
+
Spells Learned
-
-
{totalSkillLevels}
-
Total Skill Levels
+
+
{totalSkillLevels}
+
Total Skill Levels
-
-
{fmt(totalManaGathered)}
-
Total Mana Gathered
+
+
{fmt(totalManaGathered)}
+
Total Mana Gathered
-
-
{memorySlots}
-
Memory Slots
+
+
{memorySlots}
+
Memory Slots
diff --git a/src/components/game/StatsTab/ManaStatsSection.tsx b/src/components/game/StatsTab/ManaStatsSection.tsx index be24615..d217faa 100644 --- a/src/components/game/StatsTab/ManaStatsSection.tsx +++ b/src/components/game/StatsTab/ManaStatsSection.tsx @@ -32,13 +32,13 @@ export function ManaStatsSection({ const prestigeUpgrades = usePrestigeStore((s) => s.prestigeUpgrades); const getTierMultiplier = (skillId: string) => { - return 1; // Simplified - import from skill-evolution in real implementation + return 1; }; return ( - + - + Mana Stats @@ -47,12 +47,12 @@ export function ManaStatsSection({
- Base Max Mana: - 100 + Base Max Mana: + 100
- Mana Well Bonus: - + Mana Well Bonus: + {(() => { const mw = skillTiers?.manaWell || 1; const tieredSkillId = mw > 1 ? `manaWell_t${mw}` : 'manaWell'; @@ -63,34 +63,34 @@ export function ManaStatsSection({
- Prestige Mana Well: - +{fmt((prestigeUpgrades.manaWell || 0) * 500)} + Prestige Mana Well: + +{fmt((prestigeUpgrades.manaWell || 0) * 500)}
{upgradeEffects.maxManaBonus > 0 && (
- Upgrade Mana Bonus: - +{fmt(upgradeEffects.maxManaBonus)} + Upgrade Mana Bonus: + +{fmt(upgradeEffects.maxManaBonus)}
)} {upgradeEffects.maxManaMultiplier > 1 && (
- Upgrade Mana Multiplier: - ×{fmtDec(upgradeEffects.maxManaMultiplier, 2)} + Upgrade Mana Multiplier: + ×{fmtDec(upgradeEffects.maxManaMultiplier, 2)}
)} -
- Total Max Mana: - {fmt(maxMana)} +
+ Total Max Mana: + {fmt(maxMana)}
- Base Regen: - 2/hr + Base Regen: + 2/hr
- Mana Flow Bonus: - + Mana Flow Bonus: + {(() => { const mf = skillTiers?.manaFlow || 1; const tieredSkillId = mf > 1 ? `manaFlow_t${mf}` : 'manaFlow'; @@ -101,37 +101,37 @@ export function ManaStatsSection({
- Mana Spring Bonus: - +{(skills.manaSpring || 0) * 2}/hr + Mana Spring Bonus: + +{(skills.manaSpring || 0) * 2}/hr
- Prestige Mana Flow: - +{fmtDec((prestigeUpgrades.manaFlow || 0) * 0.5)}/hr + Prestige Mana Flow: + +{fmtDec((prestigeUpgrades.manaFlow || 0) * 0.5)}/hr
- Temporal Echo: - ×{fmtDec(1 + (prestigeUpgrades.temporalEcho || 0) * 0.1, 2)} + Temporal Echo: + ×{fmtDec(1 + (prestigeUpgrades.temporalEcho || 0) * 0.1, 2)}
-
- Base Regen: - {fmtDec(baseRegen, 2)}/hr +
+ Base Regen: + {fmtDec(baseRegen, 2)}/hr
{upgradeEffects.regenBonus > 0 && (
- Upgrade Regen Bonus: - +{fmtDec(upgradeEffects.regenBonus, 2)}/hr + Upgrade Regen Bonus: + +{fmtDec(upgradeEffects.regenBonus, 2)}/hr
)} {upgradeEffects.permanentRegenBonus > 0 && (
- Permanent Regen Bonus: - +{fmtDec(upgradeEffects.permanentRegenBonus, 2)}/hr + Permanent Regen Bonus: + +{fmtDec(upgradeEffects.permanentRegenBonus, 2)}/hr
)} {upgradeEffects.regenMultiplier > 1 && (
- Upgrade Regen Multiplier: - ×{fmtDec(upgradeEffects.regenMultiplier, 2)} + Upgrade Regen Multiplier: + ×{fmtDec(upgradeEffects.regenMultiplier, 2)}
)}
@@ -139,36 +139,36 @@ export function ManaStatsSection({
- Click Mana Value: - +{clickMana} + Click Mana Value: + +{clickMana}
- Mana Tap Bonus: - +{skills.manaTap || 0} + Mana Tap Bonus: + +{skills.manaTap || 0}
- Mana Surge Bonus: - +{(skills.manaSurge || 0) * 3} + Mana Surge Bonus: + +{(skills.manaSurge || 0) * 3}
- Mana Overflow: - ×{fmtDec(1 + (skills.manaOverflow || 0) * 0.25, 2)} + Mana Overflow: + ×{fmtDec(1 + (skills.manaOverflow || 0) * 0.25, 2)}
- Meditation Multiplier: - 1.5 ? 'text-purple-400' : 'text-gray-300'}`}> + Meditation Multiplier: + 1.5 ? 'text-[var(--mana-stellar)]' : 'text-[var(--text-secondary)]'}`}> {fmtDec(meditationMultiplier, 2)}x
- Incursion Strength: - {Math.round(upgradeEffects.incursionStrength * 100)}% + Incursion Strength: + {Math.round(upgradeEffects.incursionStrength * 100)}%
-
- Effective Regen: - {fmtDec(effectiveRegen, 2)}/hr +
+ Effective Regen: + {fmtDec(effectiveRegen, 2)}/hr
@@ -177,67 +177,67 @@ export function ManaStatsSection({ upgradeEffects.hasDesperateWells || upgradeEffects.manaCascadeBonus > 0 || upgradeEffects.manaWaterfallBonus > 0) && ( <> -
Special Effects
+
Special Effects
{upgradeEffects.hasSteadyStream && ( -
- Steady Stream: - Immune to incursion +
+ Steady Stream: + Immune to incursion
)} {upgradeEffects.manaCascadeBonus > 0 && ( -
- Mana Cascade: - +{fmtDec(upgradeEffects.manaCascadeBonus, 2)}/hr +
+ Mana Cascade: + +{fmtDec(upgradeEffects.manaCascadeBonus, 2)}/hr
)} {upgradeEffects.manaWaterfallBonus > 0 && ( -
- Mana Waterfall: - +{fmtDec(upgradeEffects.manaWaterfallBonus, 2)}/hr +
+ Mana Waterfall: + +{fmtDec(upgradeEffects.manaWaterfallBonus, 2)}/hr
)} {upgradeEffects.hasFlowSurge && ( -
- Flow Surge: - Clicks +100% regen for 1hr +
+ Flow Surge: + Clicks +100% regen for 1hr
)} {upgradeEffects.hasManaOverflow && ( -
- Mana Overflow: - Raw can exceed max by 20% +
+ Mana Overflow: + Raw can exceed max by 20%
)} {upgradeEffects.hasEternalFlow && ( -
- Eternal Flow: - Regen immune to ALL penalties +
+ Eternal Flow: + Regen immune to ALL penalties
)} {upgradeEffects.hasManaTorrent && upgradeEffects.rawMana > maxMana * 0.75 && ( -
- Mana Torrent: - +50% regen (high mana) +
+ Mana Torrent: + +50% regen (high mana)
)} {upgradeEffects.hasDesperateWells && upgradeEffects.rawMana < maxMana * 0.25 && ( -
- Desperate Wells: - +50% regen (low mana) +
+ Desperate Wells: + +50% regen (low mana)
)}
)} {/* Element Max */} -
+
- Element Capacity: - {elemMax} + Element Capacity: + {elemMax}
); -} +} \ No newline at end of file diff --git a/src/components/game/StatsTab/PactStatusSection.tsx b/src/components/game/StatsTab/PactStatusSection.tsx index 54cd60d..9919d7c 100644 --- a/src/components/game/StatsTab/PactStatusSection.tsx +++ b/src/components/game/StatsTab/PactStatusSection.tsx @@ -19,9 +19,9 @@ export function PactStatusSection({ pactMultiplier, pactInsightMultiplier }: Pac const pactInterferenceMitigation = prestigeUpgrades?.pactInterferenceMitigation || 0; return ( - + - + Pact Status @@ -30,41 +30,41 @@ export function PactStatusSection({ pactMultiplier, pactInsightMultiplier }: Pac
- Pact Slots: - {signedPacts.length} / {1 + (prestigeUpgrades.pactCapacity || 0)} + Pact Slots: + {signedPacts.length} / {1 + (prestigeUpgrades.pactCapacity || 0)}
- Damage Multiplier: - ×{fmtDec(pactMultiplier, 2)} + Damage Multiplier: + ×{fmtDec(pactMultiplier, 2)}
- Insight Multiplier: - ×{fmtDec(pactInsightMultiplier, 2)} + Insight Multiplier: + ×{fmtDec(pactInsightMultiplier, 2)}
{signedPacts.length > 1 && ( <>
- Interference Mitigation: - {Math.min(pactInterferenceMitigation, 5) * 10}% + Interference Mitigation: + {Math.min(pactInterferenceMitigation, 5) * 10}%
{pactInterferenceMitigation >= 5 && (
- Synergy Bonus: - +{(pactInterferenceMitigation - 5) * 10}% + Synergy Bonus: + +{(pactInterferenceMitigation - 5) * 10}%
)} )}
-
Unlocked Mana Types:
+
Unlocked Mana Types:
{Object.keys(elements).map((id) => { const state = elements[id]; if (!state.unlocked) return null; const elem = ELEMENTS[id]; return ( - + {elem?.sym} {elem?.name} ); @@ -75,4 +75,4 @@ export function PactStatusSection({ pactMultiplier, pactInsightMultiplier }: Pac ); -} +} \ No newline at end of file diff --git a/src/components/game/StatsTab/StudyStatsSection.tsx b/src/components/game/StatsTab/StudyStatsSection.tsx index 2626691..9eaf6f5 100644 --- a/src/components/game/StatsTab/StudyStatsSection.tsx +++ b/src/components/game/StatsTab/StudyStatsSection.tsx @@ -14,9 +14,9 @@ export function StudyStatsSection({ studySpeedMult, studyCostMult }: StudyStatsS const skills = useSkillStore((s) => s.skills); return ( - + - + Study Stats @@ -25,32 +25,32 @@ export function StudyStatsSection({ studySpeedMult, studyCostMult }: StudyStatsS
- Study Speed: - ×{fmtDec(studySpeedMult, 2)} + Study Speed: + ×{fmtDec(studySpeedMult, 2)}
- Quick Learner Bonus: - +{((skills.quickLearner || 0) * 10)}% + Quick Learner Bonus: + +{((skills.quickLearner || 0) * 10)}%
- Study Cost: - {Math.round(studyCostMult * 100)}% + Study Cost: + {Math.round(studyCostMult * 100)}%
- Focused Mind Bonus: - -{((skills.focusedMind || 0) * 5)}% + Focused Mind Bonus: + -{((skills.focusedMind || 0) * 5)}%
- Progress Retention: - {Math.round((1 + (skills.knowledgeRetention || 0) * 0.2) * 100)}% + Progress Retention: + {Math.round((1 + (skills.knowledgeRetention || 0) * 0.2) * 100)}%
); -} +} \ No newline at end of file diff --git a/src/components/game/layout/TabBar.tsx b/src/components/game/layout/TabBar.tsx index c88294b..6280472 100644 --- a/src/components/game/layout/TabBar.tsx +++ b/src/components/game/layout/TabBar.tsx @@ -55,32 +55,13 @@ const TAB_GROUPS = [ name: 'Meta', tabs: [ { value: 'achievements', label: 'Achieve', icon: Trophy, mobileLabel: 'Achieve' }, - { value: 'lab', label: 'Lab', icon: FlaskConical, mobileLabel: 'Lab' }, { value: 'stats', label: 'Stats', icon: BarChart3, mobileLabel: 'Stats' }, - { value: 'grimoire', label: 'Grimoire', icon: BookOpen, mobileLabel: 'Grimoire' }, { value: 'debug', label: 'Debug', icon: Wrench, mobileLabel: 'Debug' }, ] } ]; export function TabBar({ activeTab, onTabChange, isMobile = false }: TabBarProps) { - const [longPressTimer, setLongPressTimer] = useState(null); - - const handleLongPressStart = (value: string) => { - const timer = setTimeout(() => { - // Show tooltip on long press for mobile - onTabChange(value); - }, 500); - setLongPressTimer(timer); - }; - - const handleLongPressEnd = () => { - if (longPressTimer) { - clearTimeout(longPressTimer); - setLongPressTimer(null); - } - }; - if (isMobile) { return ( @@ -98,16 +79,11 @@ export function TabBar({ activeTab, onTabChange, isMobile = false }: TabBarProps