Phase 4: Study effects (first 6)
This commit is contained in:
+70
-2
@@ -725,6 +725,9 @@ function makeInitial(overrides: Partial<GameState> = {}): GameState {
|
|||||||
|
|
||||||
currentStudyTarget: null,
|
currentStudyTarget: null,
|
||||||
|
|
||||||
|
// Study momentum tracking (for STUDY_MOMENTUM effect)
|
||||||
|
consecutiveStudyHours: 0,
|
||||||
|
|
||||||
insight: overrides.insight || 0,
|
insight: overrides.insight || 0,
|
||||||
totalInsight: overrides.totalInsight || 0,
|
totalInsight: overrides.totalInsight || 0,
|
||||||
prestigeUpgrades: pu,
|
prestigeUpgrades: pu,
|
||||||
@@ -945,15 +948,57 @@ export const useGameStore = create<GameStore>()(
|
|||||||
let spells = state.spells;
|
let spells = state.spells;
|
||||||
let log = state.log;
|
let log = state.log;
|
||||||
let unlockedEffects = state.unlockedEffects;
|
let unlockedEffects = state.unlockedEffects;
|
||||||
|
let consecutiveStudyHours = state.consecutiveStudyHours;
|
||||||
|
|
||||||
if (state.currentAction === 'study' && currentStudyTarget) {
|
if (state.currentAction === 'study' && currentStudyTarget) {
|
||||||
const studySpeedMult = getStudySpeedMultiplier(skills);
|
// Calculate base study speed
|
||||||
const progressGain = HOURS_PER_TICK * studySpeedMult;
|
let studySpeedMult = getStudySpeedMultiplier(skills);
|
||||||
|
|
||||||
|
// DEEP_CONCENTRATION: +20% study speed when mana > 90%
|
||||||
|
if (hasSpecial(effects, SPECIAL_EFFECTS.DEEP_CONCENTRATION) && state.rawMana > maxMana * 0.9) {
|
||||||
|
studySpeedMult *= 1.20;
|
||||||
|
}
|
||||||
|
|
||||||
|
// STUDY_MOMENTUM: +5% study speed per consecutive hour
|
||||||
|
if (hasSpecial(effects, SPECIAL_EFFECTS.STUDY_MOMENTUM)) {
|
||||||
|
studySpeedMult *= (1 + consecutiveStudyHours * 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
// QUICK_MASTERY: -20% study time for final 3 levels
|
||||||
|
if (hasSpecial(effects, SPECIAL_EFFECTS.QUICK_MASTERY) && currentStudyTarget.type === 'skill') {
|
||||||
|
const currentLevel = skills[currentStudyTarget.id] || 0;
|
||||||
|
const maxLevel = SKILLS_DEF[currentStudyTarget.id]?.max || 1;
|
||||||
|
if (currentLevel >= maxLevel - 3) {
|
||||||
|
// Reduce required time by 20% (multiply speed by 1.25)
|
||||||
|
studySpeedMult *= 1.25;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate progress gain
|
||||||
|
let progressGain = HOURS_PER_TICK * studySpeedMult;
|
||||||
|
|
||||||
|
// QUICK_GRASP: 5% chance double study progress per hour
|
||||||
|
if (hasSpecial(effects, SPECIAL_EFFECTS.QUICK_GRASP) && Math.random() < 0.05) {
|
||||||
|
progressGain *= 2;
|
||||||
|
log = [`⚡ Quick Grasp activated! Double progress!`, ...log.slice(0, 49)];
|
||||||
|
}
|
||||||
|
|
||||||
currentStudyTarget = {
|
currentStudyTarget = {
|
||||||
...currentStudyTarget,
|
...currentStudyTarget,
|
||||||
progress: currentStudyTarget.progress + progressGain,
|
progress: currentStudyTarget.progress + progressGain,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// KNOWLEDGE_ECHO: 10% chance instant study
|
||||||
|
if (hasSpecial(effects, SPECIAL_EFFECTS.KNOWLEDGE_ECHO) && Math.random() < 0.10) {
|
||||||
|
currentStudyTarget = {
|
||||||
|
...currentStudyTarget,
|
||||||
|
progress: currentStudyTarget.required,
|
||||||
|
};
|
||||||
|
log = [`✨ Knowledge Echo! Study instantaneously completed!`, ...log.slice(0, 49)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increment consecutive study hours for STUDY_MOMENTUM
|
||||||
|
consecutiveStudyHours++;
|
||||||
// Check if study is complete
|
// Check if study is complete
|
||||||
if (currentStudyTarget.progress >= currentStudyTarget.required) {
|
if (currentStudyTarget.progress >= currentStudyTarget.required) {
|
||||||
if (currentStudyTarget.type === 'skill') {
|
if (currentStudyTarget.type === 'skill') {
|
||||||
@@ -992,6 +1037,27 @@ export const useGameStore = create<GameStore>()(
|
|||||||
currentStudyTarget = null;
|
currentStudyTarget = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Parallel Study processing (PARALLEL_STUDY special effect)
|
||||||
|
let parallelStudyTarget = state.parallelStudyTarget;
|
||||||
|
if (parallelStudyTarget && state.currentAction === 'study') {
|
||||||
|
// Parallel study progresses at 50% speed
|
||||||
|
const parallelProgressGain = HOURS_PER_TICK * 0.5;
|
||||||
|
parallelStudyTarget = {
|
||||||
|
...parallelStudyTarget,
|
||||||
|
progress: parallelStudyTarget.progress + parallelProgressGain,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check if parallel study is complete
|
||||||
|
if (parallelStudyTarget.progress >= parallelStudyTarget.required) {
|
||||||
|
const skillId = parallelStudyTarget.id;
|
||||||
|
const currentLevel = skills[skillId] || 0;
|
||||||
|
const newLevel = currentLevel + 1;
|
||||||
|
skills = { ...skills, [skillId]: newLevel };
|
||||||
|
skillProgress = { ...skillProgress, [skillId]: 0 };
|
||||||
|
log = [`✅ ${SKILLS_DEF[skillId]?.name} Lv.${newLevel} mastered (parallel study)!`, ...log.slice(0, 49)];
|
||||||
|
parallelStudyTarget = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Convert action - auto convert mana
|
// Convert action - auto convert mana
|
||||||
if (state.currentAction === 'convert') {
|
if (state.currentAction === 'convert') {
|
||||||
@@ -1469,6 +1535,7 @@ export const useGameStore = create<GameStore>()(
|
|||||||
currentRoom,
|
currentRoom,
|
||||||
incursionStrength,
|
incursionStrength,
|
||||||
currentStudyTarget,
|
currentStudyTarget,
|
||||||
|
parallelStudyTarget,
|
||||||
skills,
|
skills,
|
||||||
skillProgress,
|
skillProgress,
|
||||||
spells,
|
spells,
|
||||||
@@ -1480,6 +1547,7 @@ export const useGameStore = create<GameStore>()(
|
|||||||
flowSurgeEndTime,
|
flowSurgeEndTime,
|
||||||
comboHitCount,
|
comboHitCount,
|
||||||
floorHitCount,
|
floorHitCount,
|
||||||
|
consecutiveStudyHours,
|
||||||
...craftingUpdates,
|
...craftingUpdates,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -174,6 +174,9 @@ export interface GameState {
|
|||||||
// Parallel Study Target (for Parallel Mind milestone upgrade)
|
// Parallel Study Target (for Parallel Mind milestone upgrade)
|
||||||
parallelStudyTarget: StudyTarget | null;
|
parallelStudyTarget: StudyTarget | null;
|
||||||
|
|
||||||
|
// Study Momentum tracking (for STUDY_MOMENTUM special effect)
|
||||||
|
consecutiveStudyHours: number; // Tracks consecutive hours of studying
|
||||||
|
|
||||||
// Golemancy (summoned golems)
|
// Golemancy (summoned golems)
|
||||||
golemancy: GolemancyState;
|
golemancy: GolemancyState;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user