**Motivations:** - Centraliser les fichiers Cursor (rules, skills, agents, commands, hooks) par user et par projet **Root causes:** - N/A **Correctifs:** - N/A **Evolutions:** - desk: rules, skills-cursor, agents, commands, hooks, argv/hooks/mcp.json - ncantu: README placeholder - 4NK_node, algo, builazoo, ia_local, lecoffre_ng, lecoffre_ng_pprod, lecoffre_ng_test: .cursor contents **Pages affectées:** - cursor/desk/, cursor/ncantu/, cursor/<project>/
12 KiB
Plan Cursor – Rappel des grandes règles (174-324)
Exécution dans l’ordre : Phase 0 → 1 → 3 → 4 → 2 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 → 13.
Référence détaillée : docs/plan-implementation-rappel-grandes-regles.md.
PHASE 0 – Modèle de données et configuration
FILES: web/js/types.js | web/js/config.js | web/js/state.js | web/js/loot-tables.js
STEPS:
- types.js – Ajouter/étendre :
biome?: stringettemperature?: numbersur les cases (ou sur la grille par case).- Nouveaux kinds de cell :
research,billeterie,food,reception,biomeChangeColor,biomeChangeTemp. GardersouvenirShop(alias boutique),nursery, camion reste zone/state. - Types pour bébé/vente :
PendingBaby,ReceptionAnimal,SaleListing(babyId/animalId, zooId, price, endAt, reproductionScoreAtSale?). - Animal multi-case : sur
AnimalCellajouteroriginKey?: string,cellsWide?: number,cellsHigh?: number(optionnel, défaut 1). - GameState :
researchPoints?: number,pendingBabies?: PendingBaby[],receptionAnimals?: ReceptionAnimal[],saleListings?: SaleListing[],deathCountRecent?: number,birthCount?: number,feedingRate?: number.
- config.js – Ajouter blocs (tous MaxLevel: 7 sauf si indiqué) :
Research: { MaxLevel: 7, ZoosPerUnit: 10, BaseUpgradeCost, UpgradeGrowth, PointsPerTickPerLevel }Billeterie: { MaxLevel: 7, VisitorsPerUnit: 20, BaseUpgradeCost, UpgradeGrowth }Food: { MaxLevel: 7, AnimalsPerUnit: 5, BaseUpgradeCost, UpgradeGrowth }Reception: { MaxLevel: 7, AnimalsPerUnit: 1, BaseUpgradeCost, UpgradeGrowth, AcclimatationSecondsBase }BiomeChangeColor: { MaxLevel: 7, BaseUpgradeCost, UpgradeGrowth }BiomeChangeTemp: { MaxLevel: 7, BaseUpgradeCost, UpgradeGrowth }- Mettre
Nursery.MaxLevel = 7,SouvenirShop.MaxLevel = 7,Truck.MaxLevel = 7.
- state.js – Dans
defaultState():researchPoints: 0,pendingBabies: [],receptionAnimals: [],saleListings: [],deathCountRecent: 0,birthCount: 0. Prévoir cellules initiales pour recherche, billeterie, nourriture, accueil (voir phase 12 pour positions exactes). - loot-tables.js – Pour chaque animal :
cellsWide: 1,cellsHigh: 1(extensible en 2x2 plus tard),idealTemperature?: number,temperatureTolerance?: number,reproductionScoreByBiome?: Record<string,number>,survivalScoreByBiome?: Record<string,number>.
DONE_WHEN: Types compilent, config lue, defaultState contient les nouveaux champs, loot-tables exporte les champs animaux. Pas de régression sur le jeu actuel (ancien state reste valide).
PHASE 1 – Cartes : couleurs et températures
FILES: web/js/biome-rules.js | web/js/grid-utils.js | web/css/main.css | web/js/ui.js
STEPS:
- Étendre biomes : eau douce, eau salée, montagne, prairie, forêt (au moins 5). Attribuer à chaque case un
biomeet untemperature(dérivés de la position ou stockés). - Exporter
getDisplayBiome(x, y, grid)etgetDisplayTemperature(x, y, grid)avec interpolation des voisins. - Rendu CSS : classes ou variables par biome et par plage de température ; dégradés entre cases.
- Grille zoo et monde utilisent ces fonctions pour le fond des cases.
DONE_WHEN: Les cases affichent une couleur/milieu et une température avec transition douce.
PHASE 3 – Bâtiments zoo (7 niveaux)
FILES: web/js/config.js | web/js/state.js | web/js/economy.js | web/js/placement.js | web/js/zoo.js | web/js/ui.js
STEPS:
- Coûts d’upgrade pour research, billeterie, food, reception, biomeChangeColor, biomeChangeTemp (formules exponentielle comme Plot).
- Placement : construction sur case vide pour research, billeterie, food, reception, biomeChangeColor, biomeChangeTemp. Upgrade sur clic comme aujourd’hui pour nursery/souvenirShop.
- Recherche : tick produit researchPoints (formule par niveau des cells research). Agrandissement carte consomme researchPoints (phase 9).
- Billeterie / Boutique : capacités (visiteurs/unité) utilisées en phase 8.
- UI : icônes et libellés pour chaque type de bâtiment ; affichage niveau et flèche upgrade si possible.
DONE_WHEN: Tous les bâtiments sont constructibles et upgradeables à 7 niveaux ; recherche produit des points.
PHASE 4 – Bébés et flux (remplacement œufs)
FILES: web/js/state.js | web/js/zoo.js | web/js/placement.js | web/js/hatching.js | web/js/conveyor.js | web/js/ui.js | web/js/world-map.js
STEPS:
- Remplacer
pendingEggTokens/ œufs parpendingBabies(bébé en croissance en nurserie) et offres = bébés ou animaux adultes. - Nurserie : slot avec bébé en croissance ; durée selon niveau nurserie ; à la fin état « bébé mature » déplaçable (case zoo → animal, ou camion → vente).
- Accueil : animal acheté/reçu va en
receptionAnimals; durée acclimatation ; à la fin « animal prêt » déplaçable (case zoo ou camion). - Conveyor/offres : générer offres de bébés et d’animaux (pas d’œufs). Achat envoie en nurserie (bébé) ou en accueil (animal).
- UI : afficher bébé mature / animal prêt ; glisser vers case vide ou camion.
DONE_WHEN: Plus d’œufs ; achat bébé/animal → nurserie/accueil → mature/prêt → placement ou vente.
PHASE 2 – Animaux multi-cases
FILES: web/js/loot-tables.js | web/js/placement.js | web/js/grid-utils.js | web/js/ui.js | web/js/state.js
STEPS:
- Définir
cellsWide,cellsHighdans loot-tables (par défaut 1). - Placement : vérifier que toutes les cases (originKey + largeur/hauteur) sont vides et dans les limites.
- Stockage : une entrée par case avec référence à l’origine (originKey) ou une entité avec originKey + dimensions.
- Suppression / déplacement : libérer ou déplacer tout le bloc.
- UI : dessiner l’animal sur plusieurs cases ; drag déplace le bloc.
DONE_WHEN: Au moins un type d’animal 2x2 (ou 1x2) placeable et déplaçable.
PHASE 5 – Nourriture, consommation, morts
FILES: web/js/config.js | web/js/state.js | web/js/food.js (new) | web/js/game-loop.js | web/js/animal-visits.js | web/js/loot-tables.js
STEPS:
- Module
food.js: par tick, calculer consommation totale ; capacité nourriture = sum(food buildings × AnimalsPerUnit) ; répartir ; animaux non nourris reçoivent un déficit ou timer. - Mort si pas nourri au-delà d’un seuil ; retirer de la grille ; incrémenter deathCountRecent.
- Implémenter toutes les autres causes de mort (seul, pas visité, recherche trop basse, bébé non vendu à temps, bébé mature non placé à temps, animal accueil non placé à temps, vente échouée, température/milieu en écart). Appeler une fonction
checkDeathCauses(state, nowUnix)dans la game loop. - loot-tables : température idéale et tolérances par animal.
DONE_WHEN: Les animaux non nourris meurent ; les autres causes de mort sont branchées (même si certaines règles sont simplifiées au début).
PHASE 6 – Reproduction
FILES: web/js/loot-tables.js | web/js/reproduction.js (new) | web/js/state.js | web/js/game-loop.js
STEPS:
- Détecter paires d’animaux même type, origine « autre zoo » pour au moins un, en proximité (adjacent ou distance N).
- Timer par paire ou par animal ; à l’échéance créer un bébé → nurserie si place, sinon en vente. Utiliser score de reproduction du zoo et adéquation température/milieu pour réduire le délai.
- Exposer score de reproduction par milieu et survie par milieu depuis loot-tables.
DONE_WHEN: Une paire admissible peut produire un bébé après un délai ; le bébé va en nurserie ou en vente.
PHASE 7 – Score de reproduction du zoo
FILES: web/js/state.js | web/js/food.js | web/js/reproduction.js | web/js/trade.js | web/js/world-map.js
STEPS:
- birthCount incrémenté à chaque naissance ; feedingRate = ratio nourris/total (ou fenêtre glissante).
- Formule score agrégé = f(birthCount, feedingRate, …). Exposer dans state et sur la carte du monde (case sous le nom du zoo).
- À la vente, attacher
reproductionScoreAtSaleà l’entité vendue (pour phase 6 côté acheteur).
DONE_WHEN: Score de reproduction affiché ; vendu porte le score du zoo vendeur.
PHASE 8 – Attractivité et visiteurs
FILES: web/js/income.js | web/js/visitor-attraction.js | web/js/config.js | web/js/state.js | web/js/ui.js | web/js/world-map.js
STEPS:
- Entrée visiteurs uniquement via billeterie ; cap = Billeterie.VisitorsPerUnit × niveau total billeterie.
- Durée max 1 journée par visiteur ; sortie par billeterie. Temps passé prolongé par boutiques et diversité animaux.
- Formule attractivité : valeur cumulée, nombre d’espèces, rareté, taux remplissage ; pénalités morts ; bonus naissances.
- Affichage score d’attractivité sous le nom du zoo sur la carte du monde.
DONE_WHEN: Visiteurs plafonnés par billeterie ; attractivité calculée et affichée.
PHASE 9 – Carte du monde (recherche + compteurs)
FILES: web/js/state.js | web/js/economy.js | web/js/world-map.js | web/js/ui.js | web/js/config.js
STEPS:
- Agrandissement carte payé en researchPoints (pas en pièces). Coût par palier en unités de recherche. Bouton grisé si pas assez.
- Compteurs : bébés à vendre, animaux à vendre, laboratoires, zoos, villes (affichage sur la carte ou barre).
- Case zoo : nom, score attractivité, score reproduction, case de vente (phase 10).
DONE_WHEN: Agrandissement carte consomme researchPoints ; compteurs affichés.
PHASE 10 – Ventes et enchères
FILES: web/js/state.js | web/js/trade.js | web/js/world-map.js | web/js/ui.js | server/routes/zoos.js ou server/routes/trades.js | server/db.js
STEPS:
- Cases de vente sous chaque zoo sur la carte du monde ; afficher bébé ou animal à vendre + dernier montant enchère.
- Depuis le zoo : glisser bébé mature ou animal sur le camion → création d’une entrée saleListings (zoo du joueur).
- API enchères : créer/consulter offres, enchérir, valider/refuser vente par le vendeur. Si délai dépassé sans vente validée pour un bébé → mort du bébé.
- Vente validée : acheteur reçoit bébé (nurserie) ou animal (accueil) ; reproductionScoreAtSale attaché.
DONE_WHEN: Mise en vente depuis le zoo ; enchères joueurs/bots ; validation vendeur ; bébé invendu meurt.
PHASE 11 – Villes
FILES: web/js/config.js | web/js/world-map.js | web/js/income.js | web/js/ui.js
STEPS:
- Chaque ville : 1 case nom, 1 case « nombre max visiteurs vers zoos ». Config ou state.
- Répartir ou limiter les visiteurs vers les zoos selon ce plafond et l’attractivité.
DONE_WHEN: Villes affichent le max visiteurs ; la règle limite ou répartit les visiteurs.
PHASE 12 – UI et grilles au lancement
FILES: web/js/state.js | web/js/ui.js | web/js/world-map.js | web/css/main.css
STEPS:
- Grille zoo au lancement : 1 agrandissement, 1 recherche, 1 billeterie, 1 nurserie, 1 accueil, 1 nourriture, 1 camion, 24 cases 3 couleurs. Positions fixes dans defaultState().
- Grille monde au lancement : 1 agrandissement carte (recherche), compteurs, 1 accueil, 1 nourriture, 1 camion, 24 cases 3 couleurs.
- Transitions douces visibles (phase 1). Actions : achat sur case vide (tous les types), déplacement bébé mature / animal prêt. Accessibilité ARIA/clavier/contraste.
DONE_WHEN: Les deux grilles de lancement sont conformes au cahier ; toutes les actions sont accessibles.
PHASE 13 – Migration et compatibilité
FILES: web/js/state.js | server/routes/zoos.js
STEPS:
- specVersion ou version dans game_state (ex. 1 = ancien œufs/école, 2 = rappel grandes règles).
- Au load : si version 1, soit migration (œufs → bébés, école → research niv 1, etc.), soit message « sauvegarde incompatible ».
- API accepte game_state étendu (JSONB) sans casser les anciens champs.
DONE_WHEN: Anciennes sauvegardes migrées ou refusées proprement ; nouvelles sauvegardes complètes.