feat: click scales with generators (types + quantity), not prod/s
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 20s
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 20s
clickGain = base × prestige × tree × (1 + types×2 + totalOwned×0.05) Click power is now its own system: - Each generator TYPE owned: +2 to click mult (diversity = power) - Each generator UNIT owned: +0.05 (stacking helps but less) - 5 types × 10 each = x13.5 click multiplier from infra alone - Decoupled from prod/s — buying generators boosts BOTH systems ClickPanel shows infra breakdown (types bonus + units bonus).
This commit is contained in:
@@ -19,7 +19,10 @@
|
|||||||
<div class="flex flex-col flex-1">
|
<div class="flex flex-col flex-1">
|
||||||
<span class="gp-value">Gain par clic</span>
|
<span class="gp-value">Gain par clic</span>
|
||||||
<span class="gp-label">
|
<span class="gp-label">
|
||||||
x{b.prestigeMult.toFixed(1)} prestige · x{b.treeMult.toFixed(0)} arbre · x{b.prodBonus.toFixed(1)} prod
|
x{b.prestigeMult.toFixed(1)} prestige · x{b.treeMult.toFixed(0)} arbre · x{b.genBonus.toFixed(1)} infra
|
||||||
|
</span>
|
||||||
|
<span class="gp-label" style="opacity: 0.5;">
|
||||||
|
{b.genTypes} types (+{b.genTypes * 2}) · {b.genTotal} unites (+{(b.genTotal * 0.05).toFixed(1)})
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="gp-value gp-accent-amber text-lg!">{formatNumber(b.total)}</span>
|
<span class="gp-value gp-accent-amber text-lg!">{formatNumber(b.total)}</span>
|
||||||
|
|||||||
@@ -611,12 +611,18 @@ export function applyIdleGains(state: GameState, now: number): GameState {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gain par clic — scale avec la production passive (1% de prod/s en bonus)
|
// Bonus clic depuis les générateurs (diversité + quantité)
|
||||||
|
export function getGeneratorClickBonus(generators: Generator[]): number {
|
||||||
|
const typesOwned = generators.filter((g) => g.owned > 0).length;
|
||||||
|
const totalOwned = generators.reduce((sum, g) => sum + g.owned, 0);
|
||||||
|
return 1 + typesOwned * 2 + totalOwned * 0.05;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gain par clic — scaling propre : base × prestige × arbre × generateurs
|
||||||
export function getClickGain(state: GameState): number {
|
export function getClickGain(state: GameState): number {
|
||||||
const treeClickMult = getClickMultiplierFromTree(state.evolutionTree);
|
const treeClickMult = getClickMultiplierFromTree(state.evolutionTree);
|
||||||
const base = state.clickMultiplier * state.prestigeMultiplier * treeClickMult;
|
const genBonus = getGeneratorClickBonus(state.generators);
|
||||||
const prodBonus = 1 + totalProductionPerSecond(state) * 0.01;
|
return Math.floor(state.clickMultiplier * state.prestigeMultiplier * treeClickMult * genBonus);
|
||||||
return Math.floor(base * prodBonus);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Breakdown complet du clic (pour affichage cockpit)
|
// Breakdown complet du clic (pour affichage cockpit)
|
||||||
@@ -624,7 +630,9 @@ export interface ClickBreakdown {
|
|||||||
base: number;
|
base: number;
|
||||||
prestigeMult: number;
|
prestigeMult: number;
|
||||||
treeMult: number;
|
treeMult: number;
|
||||||
prodBonus: number; // multiplicateur depuis prod passive (1 + prod/s × 0.01)
|
genBonus: number; // multiplicateur depuis generateurs (types + quantite)
|
||||||
|
genTypes: number; // types possedes
|
||||||
|
genTotal: number; // total unites possedees
|
||||||
total: number; // gain par clic (floor)
|
total: number; // gain par clic (floor)
|
||||||
doubleChance: number;
|
doubleChance: number;
|
||||||
critChance: number;
|
critChance: number;
|
||||||
@@ -636,15 +644,16 @@ export function getClickBreakdown(state: GameState): ClickBreakdown {
|
|||||||
const base = state.clickMultiplier;
|
const base = state.clickMultiplier;
|
||||||
const prestigeMult = state.prestigeMultiplier;
|
const prestigeMult = state.prestigeMultiplier;
|
||||||
const treeMult = getClickMultiplierFromTree(state.evolutionTree);
|
const treeMult = getClickMultiplierFromTree(state.evolutionTree);
|
||||||
const pps = totalProductionPerSecond(state);
|
const genBonus = getGeneratorClickBonus(state.generators);
|
||||||
const prodBonus = 1 + pps * 0.01;
|
const genTypes = state.generators.filter((g) => g.owned > 0).length;
|
||||||
const total = Math.floor(base * prestigeMult * treeMult * prodBonus);
|
const genTotal = state.generators.reduce((sum, g) => sum + g.owned, 0);
|
||||||
|
const total = Math.floor(base * prestigeMult * treeMult * genBonus);
|
||||||
const doubleChance = getDoubleClickChance(state.evolutionTree);
|
const doubleChance = getDoubleClickChance(state.evolutionTree);
|
||||||
const critChance = getCritClickChance(state.evolutionTree);
|
const critChance = getCritClickChance(state.evolutionTree);
|
||||||
const autoClicksPerSec = getAutoClicksPerSecond(state.evolutionTree);
|
const autoClicksPerSec = getAutoClicksPerSecond(state.evolutionTree);
|
||||||
const effectivePerSec = autoClicksPerSec * total;
|
const effectivePerSec = autoClicksPerSec * total;
|
||||||
|
|
||||||
return { base, prestigeMult, treeMult, prodBonus, total, doubleChance, critChance, autoClicksPerSec, effectivePerSec };
|
return { base, prestigeMult, treeMult, genBonus, genTypes, genTotal, total, doubleChance, critChance, autoClicksPerSec, effectivePerSec };
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ClickResult {
|
export interface ClickResult {
|
||||||
|
|||||||
Reference in New Issue
Block a user