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:
@@ -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),
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user