feat: suppression boutique legacy + refonte achievements milestones Clickerz

- Suppression route /boutique + Boutique.jsx, BoutiqueCard.jsx, shop.json, scss associés
  (le GeneratorShop sidebar fait déjà le job)
- Refonte complète achievements : 27 milestones basés sur le GameState réel
  (paliers ressources, générateurs, prestige, évolution, easter eggs humour)
- Suppression ancien système JSON statique + AchievementsCard legacy
- Page achievements : unlocked/locked state-aware, compteur progression
This commit is contained in:
2026-03-20 14:34:48 +01:00
parent 0374602047
commit 0c9170af65
12 changed files with 360 additions and 734 deletions

View File

@@ -1,37 +1,45 @@
import { useState } from "react";
import AchievementsCard from "../components/AchievementsCard";
import "../scss/achievements.scss";
import { useGameStore } from "../store/useGameStore";
import achievements from "../data/Achievements.json";
function Achievements() {
const resources = useGameStore((s) => s.state.resources);
let score = 1;
if (resources >= 25) {
score = Math.floor((resources - 25) / 400) + 1;
} else {
score = 0;
}
return (
<div className="fullachieve">
<h1>Succès</h1>
<div className="achievementscontainer">
<div className="achievementscardcontainer">
{achievements &&
achievements.slice(0, score).map((a) => {
return (
<AchievementsCard
key={a.id}
name={a.name}
description={a.description}
image={a.image}
/>
);
})}
</div>
</div>
</div>
);
}
export default Achievements;
import { useGameStore } from "../store/useGameStore";
import { ACHIEVEMENTS } from "../data/achievements";
import "../scss/achievements.scss";
function Achievements() {
const state = useGameStore((s) => s.state);
const unlocked = ACHIEVEMENTS.filter((a) => a.check(state));
const locked = ACHIEVEMENTS.filter((a) => !a.check(state));
return (
<div className="fullachieve">
<h1>Succès</h1>
<p className="achieve-counter">
{unlocked.length} / {ACHIEVEMENTS.length}
</p>
<div className="achievementscontainer">
<div className="achievementscardcontainer">
{unlocked.map((a) => (
<div key={a.id} className="achieve-card achieve-unlocked">
<span className="achieve-icon">{a.icon}</span>
<div className="achieve-info">
<p className="achieve-name">{a.name}</p>
<p className="achieve-desc">{a.description}</p>
</div>
</div>
))}
{locked.map((a) => (
<div key={a.id} className="achieve-card achieve-locked">
<span className="achieve-icon">🔒</span>
<div className="achieve-info">
<p className="achieve-name">{a.name}</p>
<p className="achieve-desc">???</p>
</div>
</div>
))}
</div>
</div>
</div>
);
}
export default Achievements;