feat: click panel breakdown + guide updated
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
ClickPanel in Production tab — full click breakdown: - Gain per click with formula (base × prestige × tree) - Double Ponte chance (+ how to unlock if not) - Crit Ponte chance (+ how to unlock if not) - Auto-Ponte rate + effective prod/s - Hint to invest in Ponte branch when no tree bonuses Guide updated with 11 sections: - Ponte (clic) section — breakdown, double/crit/auto explained - Generateurs section — effective prod, multi-buy, share bars - Prestige section — quadratic scaling formula explained - Arbre section — 3 branches + convergence detailed - Capstones section — all 3 + convergence alpha/omega
This commit is contained in:
83
Frontend/src/lib/components/ClickPanel.svelte
Normal file
83
Frontend/src/lib/components/ClickPanel.svelte
Normal file
@@ -0,0 +1,83 @@
|
||||
<script lang="ts">
|
||||
import { game } from '$lib/stores/game.svelte';
|
||||
import { getClickBreakdown } from '$lib/core/economy';
|
||||
import { formatNumber } from '$lib/utils/formatNumber';
|
||||
import CollapsiblePanel from './CollapsiblePanel.svelte';
|
||||
|
||||
let b = $derived(getClickBreakdown(game.state));
|
||||
</script>
|
||||
|
||||
<CollapsiblePanel title="Ponte (clic)" badge="{formatNumber(b.total)}/clic" accentClass="" defaultOpen={false}>
|
||||
<!-- Main click value -->
|
||||
<div class="gp-row gp-row--active">
|
||||
<div class="flex flex-col">
|
||||
<span class="gp-value">Gain par clic</span>
|
||||
<span class="gp-label">base {b.base} × prestige x{b.prestigeMult.toFixed(1)} × arbre x{b.treeMult.toFixed(1)}</span>
|
||||
</div>
|
||||
<span class="gp-value gp-accent-green text-lg!">{formatNumber(b.total)}</span>
|
||||
</div>
|
||||
|
||||
<!-- Double ponte -->
|
||||
<div class="gp-row {b.doubleChance > 0 ? 'gp-row--unlocked' : 'gp-row--locked'}">
|
||||
<div class="flex flex-col">
|
||||
<span class="gp-value text-[0.7rem]!">Double Ponte</span>
|
||||
<span class="gp-label">
|
||||
{#if b.doubleChance > 0}
|
||||
{(b.doubleChance * 100).toFixed(0)}% chance × 2 tetards
|
||||
{:else}
|
||||
Branche Ponte — "Double Ponte" (5 ADN)
|
||||
{/if}
|
||||
</span>
|
||||
</div>
|
||||
{#if b.doubleChance > 0}
|
||||
<span class="gp-label gp-accent-purple">{(b.doubleChance * 100).toFixed(0)}%</span>
|
||||
{:else}
|
||||
<span class="gp-label">—</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<!-- Crit -->
|
||||
<div class="gp-row {b.critChance > 0 ? 'gp-row--unlocked' : 'gp-row--locked'}">
|
||||
<div class="flex flex-col">
|
||||
<span class="gp-value text-[0.7rem]!">Ponte Critique</span>
|
||||
<span class="gp-label">
|
||||
{#if b.critChance > 0}
|
||||
{(b.critChance * 100).toFixed(0)}% chance × 10 tetards
|
||||
{:else}
|
||||
Branche Ponte — "Ponte Critique" (20 ADN)
|
||||
{/if}
|
||||
</span>
|
||||
</div>
|
||||
{#if b.critChance > 0}
|
||||
<span class="gp-label gp-accent-amber">{(b.critChance * 100).toFixed(0)}%</span>
|
||||
{:else}
|
||||
<span class="gp-label">—</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<!-- Auto-click -->
|
||||
<div class="gp-row {b.autoClicksPerSec > 0 ? 'gp-row--unlocked' : 'gp-row--locked'}">
|
||||
<div class="flex flex-col">
|
||||
<span class="gp-value text-[0.7rem]!">Auto-Ponte</span>
|
||||
<span class="gp-label">
|
||||
{#if b.autoClicksPerSec > 0}
|
||||
{b.autoClicksPerSec.toFixed(1)}/s × {formatNumber(b.total)} = {formatNumber(b.effectivePerSec)}/s
|
||||
{:else}
|
||||
Capstone Ponte — "Ponte Automatique" (200 ADN)
|
||||
{/if}
|
||||
</span>
|
||||
</div>
|
||||
{#if b.autoClicksPerSec > 0}
|
||||
<span class="gp-label gp-accent-green">{formatNumber(b.effectivePerSec)}/s</span>
|
||||
{:else}
|
||||
<span class="gp-label">—</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<!-- How to boost hint -->
|
||||
{#if b.treeMult <= 1}
|
||||
<div class="text-center py-1">
|
||||
<span class="gp-label gp-accent-amber">Depense ton ADN dans la branche Ponte pour booster tes clics</span>
|
||||
</div>
|
||||
{/if}
|
||||
</CollapsiblePanel>
|
||||
@@ -617,6 +617,35 @@ export function getClickGain(state: GameState): number {
|
||||
return state.clickMultiplier * state.prestigeMultiplier * treeClickMult;
|
||||
}
|
||||
|
||||
// Breakdown complet du clic (pour affichage cockpit)
|
||||
export interface ClickBreakdown {
|
||||
base: number;
|
||||
prestigeMult: number;
|
||||
treeMult: number;
|
||||
total: number;
|
||||
doubleChance: number; // 0-1
|
||||
critChance: number; // 0-1
|
||||
autoClicksPerSec: number;
|
||||
effectivePerSec: number; // total × (1 + double × 1 + crit × 9) + autoClicks × total
|
||||
}
|
||||
|
||||
export function getClickBreakdown(state: GameState): ClickBreakdown {
|
||||
const base = state.clickMultiplier;
|
||||
const prestigeMult = state.prestigeMultiplier;
|
||||
const treeMult = getClickMultiplierFromTree(state.evolutionTree);
|
||||
const total = base * prestigeMult * treeMult;
|
||||
const doubleChance = getDoubleClickChance(state.evolutionTree);
|
||||
const critChance = getCritClickChance(state.evolutionTree);
|
||||
const autoClicksPerSec = getAutoClicksPerSecond(state.evolutionTree);
|
||||
|
||||
// Expected value per click = total × (1 + doubleChance × 1 + critChance × 9)
|
||||
const expectedPerClick = total * (1 + doubleChance + critChance * 9);
|
||||
// Auto-clicks produce total per auto-click (no double/crit on auto)
|
||||
const effectivePerSec = autoClicksPerSec * total;
|
||||
|
||||
return { base, prestigeMult, treeMult, total, doubleChance, critChance, autoClicksPerSec, effectivePerSec };
|
||||
}
|
||||
|
||||
export interface ClickResult {
|
||||
state: GameState;
|
||||
gain: number;
|
||||
|
||||
@@ -20,26 +20,63 @@
|
||||
icon: '🔄',
|
||||
title: 'Boucle de jeu',
|
||||
content: [
|
||||
'**1. Clique** pour pondre des tetards. Achete des **generateurs** (Nid, Mare, Marecage...) qui produisent des tetards automatiquement.',
|
||||
'**2. Prestige** quand tu atteins 1M de tetards. Tu perds tes tetards et generateurs, mais tu gagnes de l\'**ADN Ancestral** et un multiplicateur permanent.',
|
||||
'**3. Arbre d\'Evolution** — depense ton ADN dans 3 branches : Ponte (clics), Marais (production), Adaptation (offline/ADN).',
|
||||
'**1. Clique** pour pondre des tetards. Achete des **generateurs** pour produire automatiquement.',
|
||||
'**2. Prestige** quand tu atteins le seuil de tetards. Reset tetards et generateurs, mais gagne de l\'**ADN Ancestral** + un multiplicateur permanent.',
|
||||
'**3. Arbre d\'Evolution** — depense ton ADN dans 3 branches pour booster ta production, tes clics, et ta progression.',
|
||||
'**4. Repete** — chaque prestige est plus rapide grace aux bonus accumules. Le seuil monte pour garder le challenge.',
|
||||
],
|
||||
},
|
||||
{
|
||||
icon: '★',
|
||||
title: 'Capstones',
|
||||
icon: '👆',
|
||||
title: 'Ponte (clic)',
|
||||
content: [
|
||||
'**Ponte Automatique** — auto-click 1/s qui scale avec les upgrades',
|
||||
'**Symbiose Totale** — chaque type de generateur booste les autres',
|
||||
'**Memoire du Marais** — offline cap passe a 75%, duree 8h',
|
||||
'Chaque clic rapporte : **base × prestige × arbre**. Le panneau "Ponte" dans Production te montre le breakdown complet.',
|
||||
'**Double Ponte** — chance de doubler le gain (branche Ponte, 5 ADN)',
|
||||
'**Ponte Critique** — chance de ×10 (branche Ponte, 20 ADN)',
|
||||
'**Auto-Ponte** — clics automatiques par seconde (capstone Ponte, 200 ADN). Scale avec les repeatables.',
|
||||
'Le panneau montre aussi les gains auto-ponte/s — ta production passive par les clics.',
|
||||
],
|
||||
},
|
||||
{
|
||||
icon: '🏭',
|
||||
title: 'Generateurs',
|
||||
content: [
|
||||
'5 generateurs (Nid → Lac Mystique). Chaque unite produit des tetards/s automatiquement.',
|
||||
'Le cockpit Production montre la **production effective** (avec tous les bonus) et le **+X/s** que le prochain achat ajoute.',
|
||||
'**Achat multiple** — x1, x5, x10, ou MAX. Le cout et la quantite s\'affichent sur le bouton.',
|
||||
'La **barre de part** montre quelle fraction de ta production vient de chaque type.',
|
||||
],
|
||||
},
|
||||
{
|
||||
icon: '🧬',
|
||||
title: 'Convergence',
|
||||
title: 'Prestige',
|
||||
content: [
|
||||
'Avec un capstone + des noeuds d\'une 2e branche → **Convergence Alpha** (+10% tous effets).',
|
||||
'Avec 2 capstones → evolue en **Convergence Omega** (-20% cout post-capstones).',
|
||||
'Le prestige reset tes tetards et generateurs. Tu gagnes de l\'**ADN Ancestral** et un multiplicateur permanent (×0.1 par prestige).',
|
||||
'Le **seuil augmente** a chaque prestige : 1M × (1 + 0.1 × N)². Plus tu prestiges, plus il faut de tetards.',
|
||||
'L\'arbre et les cosmetiques sont **conserves**. Chaque prestige offre **1 reset d\'arbre gratuit**.',
|
||||
'Les noeuds Adaptation peuvent **reduire le seuil** — strategique pour prestige plus souvent.',
|
||||
],
|
||||
},
|
||||
{
|
||||
icon: '🌳',
|
||||
title: 'Arbre d\'Evolution',
|
||||
content: [
|
||||
'3 branches + Convergence. Depense ton ADN pour debloquer des noeuds permanents.',
|
||||
'**Ponte** — booste tes clics : multiplicateur, double ponte, critique, auto-ponte',
|
||||
'**Marais** — booste la production : multiplicateur, Nid boost, synergie entre types',
|
||||
'**Adaptation** — booste la progression : bonus ADN, offline, reduction seuil prestige',
|
||||
'Chaque branche a un **capstone** (noeud final puissant) + des **post-capstones** repeatables a l\'infini.',
|
||||
],
|
||||
},
|
||||
{
|
||||
icon: '★',
|
||||
title: 'Capstones & Convergence',
|
||||
content: [
|
||||
'**Ponte Automatique** — auto-clic 1/s qui scale avec les upgrades',
|
||||
'**Symbiose Totale** — chaque type de generateur booste les autres',
|
||||
'**Memoire du Marais** — offline cap a 75%, duree 8h',
|
||||
'**Convergence Alpha** (1 capstone + tier 3 d\'une 2e branche) → +10% tous effets',
|
||||
'**Convergence Omega** (2 capstones) → +10% tous effets + -20% cout post-capstones',
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
import { formatNumber } from '$lib/utils/formatNumber';
|
||||
import CockpitHeader from '$lib/components/CockpitHeader.svelte';
|
||||
import GeneratorShop from '$lib/components/GeneratorShop.svelte';
|
||||
import ClickPanel from '$lib/components/ClickPanel.svelte';
|
||||
import PrestigePanel from '$lib/components/PrestigePanel.svelte';
|
||||
import EvolutionTree from '$lib/components/EvolutionTree.svelte';
|
||||
import MilestoneBar from '$lib/components/MilestoneBar.svelte';
|
||||
@@ -80,6 +81,7 @@
|
||||
<SidebarTabs tabs={sidebarTabs}>
|
||||
{#snippet children(activeTab)}
|
||||
{#if activeTab === 'production'}
|
||||
<ClickPanel />
|
||||
<GeneratorShop />
|
||||
<PrestigePanel />
|
||||
{:else if activeTab === 'evolution'}
|
||||
|
||||
Reference in New Issue
Block a user