feat: UX game — stats live, production détaillée, prestige visible, badge achievements
- Click-zone : production/s, puissance ponte, multiplicateur toujours visibles - GeneratorShop : production totale en header, prod individuelle par générateur - PrestigePanel : toujours affiché (hint "Atteins 1M" si pas encore dispo) - Badge achievements X/27 dans la sidebar avec lien vers /achievements - Landing : tadpole sprite animé en accroche visuelle
This commit is contained in:
@@ -6,35 +6,48 @@ import { formatNumber } from "../utils/formatNumber";
|
||||
export function GeneratorShop() {
|
||||
const generators = useGameStore((s) => s.state.generators);
|
||||
const resources = useGameStore((s) => s.state.resources);
|
||||
const productionPerSecond = useGameStore((s) => s.productionPerSecond);
|
||||
const buy = useGameStore((s) => s.buy);
|
||||
const generatorCost = useGameStore((s) => s.generatorCost);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-3 p-4 rounded-xl bg-gray-900/80 backdrop-blur-sm max-w-md w-full">
|
||||
<h2 className="text-lg font-bold text-white">Générateurs</h2>
|
||||
<div className="flex flex-col gap-2 p-4 rounded-xl bg-gray-900/80 backdrop-blur-sm max-w-md w-full">
|
||||
<div className="flex justify-between items-center">
|
||||
<h2 className="text-sm font-bold text-white">Générateurs</h2>
|
||||
<span className="text-xs text-emerald-400 font-medium">
|
||||
{formatNumber(productionPerSecond)}/s
|
||||
</span>
|
||||
</div>
|
||||
{generators.map((gen) => {
|
||||
const cost = generatorCost(gen);
|
||||
const canAfford = resources >= cost;
|
||||
const currentProd = gen.baseProduction * gen.owned;
|
||||
|
||||
return (
|
||||
<div
|
||||
key={gen.id}
|
||||
className={`flex items-center justify-between gap-3 p-3 rounded-lg border transition-colors ${
|
||||
className={`flex items-center justify-between gap-2 p-2.5 rounded-lg border transition-colors ${
|
||||
canAfford
|
||||
? "border-emerald-500/50 bg-emerald-950/30 hover:bg-emerald-950/50"
|
||||
: "border-gray-700/50 bg-gray-800/30 opacity-60"
|
||||
}`}
|
||||
>
|
||||
<div className="flex flex-col min-w-0">
|
||||
<span className="text-white font-semibold text-sm">{gen.name}</span>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="text-white font-semibold text-sm">{gen.name}</span>
|
||||
{gen.owned > 0 && (
|
||||
<span className="text-emerald-400 text-xs font-medium">x{gen.owned}</span>
|
||||
)}
|
||||
</div>
|
||||
<span className="text-gray-400 text-xs">
|
||||
+{gen.baseProduction}/s · x{gen.owned}
|
||||
+{gen.baseProduction}/s chacun
|
||||
{gen.owned > 0 && ` · ${formatNumber(currentProd)}/s total`}
|
||||
</span>
|
||||
</div>
|
||||
<button
|
||||
onClick={() => buy(gen.id)}
|
||||
disabled={!canAfford}
|
||||
className={`shrink-0 px-3 py-1.5 rounded-md text-sm font-medium transition-colors cursor-pointer ${
|
||||
className={`shrink-0 px-3 py-1.5 rounded-md text-xs font-medium transition-colors cursor-pointer ${
|
||||
canAfford
|
||||
? "bg-emerald-600 hover:bg-emerald-500 text-white"
|
||||
: "bg-gray-700 text-gray-500 cursor-not-allowed"
|
||||
|
||||
Reference in New Issue
Block a user