feat: arbre d'évolution 3 voies — ponte/marais/adaptation

18 nœuds (6/branche), nœuds exclusifs (pick one), reset gratuit.
Nouveaux effets : double_click, auto_click, crit, generator_boost,
cost_reduction, prestige_dna_bonus, offline_boost, threshold_reduction.
UI 3 colonnes colorées, seuil prestige dynamique, coût réduit.
75 tests (tous passent).
This commit is contained in:
2026-03-28 11:52:51 +01:00
parent 3ba10dad5f
commit ae50908bc9
7 changed files with 405 additions and 76 deletions

View File

@@ -10,6 +10,7 @@ import {
applyClick,
buyGenerator,
buyEvolutionNode,
resetEvolutionTree,
applyPrestige,
canPrestige as canPrestigeCheck,
totalProductionPerSecond,
@@ -65,10 +66,12 @@ interface GameStore {
buy: (genId: string) => void;
buyNode: (nodeId: string) => void;
prestige: () => void;
resetTree: () => void;
reset: () => void;
loadFromServer: (serverState: GameState) => void;
initGuest: () => void;
generatorCost: typeof genCost;
generatorCostWithTree: (gen: Parameters<typeof genCost>[0]) => number;
}
function hydrateWithOffline(saved: GameState, now: number): { state: GameState; report: OfflineReport | null } {
@@ -194,6 +197,18 @@ export const useGameStore = create<GameStore>((set, get) => ({
});
},
resetTree: () => {
if (!get().ready) return;
set((s) => {
const updated = resetEvolutionTree(s.state);
saveLocal(updated);
return {
state: updated,
productionPerSecond: totalProductionPerSecond(updated),
};
});
},
reset: () => {
const fresh = { ...DEFAULT_STATE, lastTick: Date.now(), lastOnline: Date.now() };
saveLocal(fresh);
@@ -233,4 +248,5 @@ export const useGameStore = create<GameStore>((set, get) => ({
},
generatorCost: genCost,
generatorCostWithTree: (gen) => genCost(gen, get().state.evolutionTree),
}));