Files
builazoo/docs/plan-action-cahier-des-charges.md
Nicolas Cantu e031c9a1d2 Initial commit
**Motivations:**
- Initialisation du versionning git pour le projet

**Root causes:**
- N/A (Nouveau projet)

**Correctifs:**
- N/A

**Evolutions:**
- Structure initiale du projet
- Ajout du .gitignore

**Pages affectées:**
- Tous les fichiers
2026-03-03 22:24:17 +01:00

174 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Plan d'action Alignement du code avec le cahier des charges
Document de référence : `docs/cahier des charges.md`.
Objectif : identifier les écarts entre le cahier des charges (version actuelle) et le code, puis ordonner les mises à jour.
---
## 1. Démarrage et grille au lancement (§1, §10, §11)
### Écarts
- **Démarrage autonome (§1)** : ~~Le joueur doit commencer avec 3 couples reproducteurs… Non implémenté~~ **Implémenté** : `default-grid-layout.js` + `addStarterAnimals(state)` placent 6 animaux (3 couples Meadow/Ocean/Mountain) en ligne 2.
- **Grille zoo au lancement (§10)** : ~~pas de recherche, billeterie, accueil, nourriture, ni 24 cases~~ **Implémenté** : `buildDefaultRow1Cells()` (research, billeterie, nursery, reception, food, school) ligne 1 ; 24 cases vides lignes 36.
- **Grille monde au lancement (§11)** : 1 Agrandissement carte, compteurs (bébés, animaux, labos, zoos, villes) présents dans lUI ; Accueil/Nourriture/Camion couverts par la zone camion et les panneaux ventes. Documenté dans `docs/features/grille-lancement.md`.
### Actions
1. ~~Définir le layout…~~ Fait : `default-grid-layout.js`, `buildDefaultRow1Cells()`, `addStarterAnimals()`.
2. ~~Adapter buildDefaultCells()~~ Fait : appelle `buildDefaultRow1Cells()`.
3. ~~Placer 3 couples reproducteurs~~ Fait : `addStarterAnimals(state)` dans `defaultState()` et `doPrestige()`.
4. Documenter layout carte du monde : fait dans `docs/features/grille-lancement.md` (§11).
**Fichiers concernés :** `web/js/state.js`, `web/js/config.js`, `web/js/placement.js` (ou `grid-utils.js`), éventuellement `web/js/main-bootstrap.js`, `docs/features/` (fiche grille au lancement).
---
## 2. Mode automatique et 50 profils (§5)
### Écart
- Le cahier exige **50 archétypes de profils** (Conservateurs 110, Éleveurs 1120, Commerçants 2130, Expansionnistes 3140, Scientifiques 4150), avec **sélection hiérarchique** : Famille → Spécialisation (pas une simple liste déroulante). Chaque profil affiche priorités et risques.
- Le code na que **3 profils** (`fast` / `slow` / `balanced`) et **aucune UI** de choix de profil (uniquement `autoModeProfile` dans le state).
### Actions
1. Introduire un **modèle de données des 50 profils** : identifiant, famille, spécialisation, libellé, paramètres (seuil dépense, fréquence, types danimaux préférés, etc.), priorité et risques (texte ou clés i18n).
2. Étendre `GameState` (ou équivalent) pour stocker le **profil choisi** (ex. id du profil ou famille + spécialisation) au lieu de seulement `autoModeProfile: "fast"|"slow"|"balanced"`.
3. Adapter la **logique bot / mode auto** (`bot-zoo.js`, `game-loop.js`) pour utiliser les paramètres du profil sélectionné (seuils, fréquences, priorités).
4. Ajouter une **interface de sélection hiérarchique** : étape 1 = choix de la Famille (Conservateur, Éleveur, Commerçant, Expansionniste, Scientifique), étape 2 = choix de la Spécialisation dans la famille, avec affichage des priorités et risques. Remplacer/augmenter le simple toggle mode auto actuel.
5. Centraliser les libellés et textes dans `texts-fr.js` (noms des familles, spécialisations, priorités, risques).
**Fichiers concernés :** `web/js/types.js`, `web/js/bot-zoo.js`, `web/js/game-loop.js`, `web/js/ui.js`, `web/js/texts-fr.js`, nouveau module optionnel `web/js/auto-mode-profiles.js` (définition des 50 profils).
---
## 3. Ventes Validation différée et sablier (§13)
### Écart
- Le cahier impose une **validation différée de 10 minutes** en base : lachat nest effectif (transfert de propriété et de fonds) quà la fin de ce délai ; un **sablier** doit safficher sur la transaction pendant ce temps.
- Le code actuel valide la vente **immédiatement** à lacceptation (accept → sold, transfert de pièces et livraison côté acheteur sans délai).
### Actions
1. Étendre le **schéma BDD** des ventes : ajouter un champ type `validated_at` (ou `pending_until`) pour marquer la fin du délai de 10 minutes après acceptation ; conserver `sold_at` comme date dacceptation par le vendeur.
2. Adapter la **logique métier serveur** : à laccept, créer la vente en statut « vendu en attente » et enregistrer lheure de validation future ; un cron ou un traitement à la lecture vérifie `now >= validated_at` pour effectuer le transfert de pièces et marquer la vente comme définitivement validée. Lacheteur ne peut « récupérer » quaprès cette validation.
3. **API** : exposer pour chaque vente (côté vendeur et acheteur) létat « en attente de validation » et le temps restant (ou `validated_at`). Le client affiche le sablier à partir de ces infos.
4. **Client** : sur la carte du monde / panneau ventes, afficher un **sablier** (ou compte à rebours) pour les ventes vendues mais pas encore validées ; désactiver le bouton « Récupérer » jusquà validation définitive.
**Fichiers concernés :** `server/schema.sql` ou migrations, `server/db.js`, `server/routes/sales.js`, `web/js/api-client.js`, `web/js/ui.js`, `web/js/types.js`, `docs/features/ventes-encheres-phase10.md`.
---
## 4. Visiteurs, incidents et invités de luxe (§2, §10)
### Écarts
- **Disparition des animaux (§2)** : ~~Un animal non visité pendant une durée configurable (ex. 5 min) doit être retiré. À vérifier / implémenter.~~ **Implémenté** : `Visitor.MaxSecondsWithoutVisit` (300 s), `tickAnimalVisits` (mise à jour `lastVisitedAt`), `checkDeathCauses` (retrait si dépassement). Documenté dans `docs/features/attractivite-visiteurs-phase8.md`.
- **Incidents et exigences (§2)** : Les visiteurs peuvent rencontrer des problèmes (soif, poubelle pleine, banc requis, animal trop loin, envie de photo) ; apparition contextuelle en phase dattente ; bulle dicône ; résolution par clic ou action ; impact attractivité et pièces. **Implémenté** : voir `docs/features/incidents-visiteurs-phase4.md`.
- **Invités de luxe (§2)** : Une part des visiteurs (ex. 8 %) paie plus lentrée et dépense plus en boutique. **Implémenté** : `getVisitorParams` (income.js) applique `LuxuryGuestChance`, `LuxuryEntryMultiplier` sur lentrée et `LuxuryShopMultiplier` sur le bonus boutique ; les revenus visiteurs en tiennent compte.
### Actions
1. **Visitor.MaxSecondsWithoutVisit** : Ajouter la config, et dans la boucle de jeu (ou module visiteurs) retirer les animaux non visités depuis plus de X secondes ; mettre à jour `deathCountRecent` ou équivalent si le cahier le lie aux morts.
2. **Incidents** : Modéliser les types dincidents (soif, poubelle, banc, animal loin, photo), les associer aux visiteurs, gérer laffichage des bulles et le clic/action de résolution ; appliquer bonus/malus attractivité et pièces. Config pour fréquence en phase dattente.
3. **Invités de luxe** : Introduire un flag ou type « luxe » sur une part des visiteurs (ex. 8 %) et modifier le calcul des revenus (entrée + boutique) pour ces visiteurs.
**Fichiers concernés :** `web/js/config.js`, `web/js/income.js` (ou module visiteurs), `web/js/game-loop.js`, `web/js/ui.js` (bulles, clics), `web/js/types.js`, `web/js/texts-fr.js`.
---
## 5. Carte du monde Villes, stagnation, camions NPC (§3)
### Écarts
- **Villes (§3, §11)** : Plus le zoo est proche dune ville, plus il attire de visiteurs (formule dattraction). Cases villes : 1 case nom, 1 case nombre max visiteurs vers les zoos. **Implémenté** : `maxVisitorsTowardZoos` par ville dans config ; `getCityAttraction` plafonne la contribution par ville ; carte du monde affiche nom + « max N » par ville (voir `docs/features/villes-phase11.md`).
- **Stagnation (§3)** : Zoos qui névoluent pas subissent une baisse progressive du multiplicateur de visiteurs (jusquà un plancher, ex. 10 %). **Implémenté** : getStagnationMultiplier, lastEvolutionAt (voir attractivite-visiteurs-phase8).
- **Camions NPC (§3)** : Des camions (ventes dœufs entre zoos) sont visibles sur la carte, en mouvement entre deux zoos, ajoutés périodiquement par la boucle de jeu. **Implémenté** : `world-map.js` (`addNpcTruckSale`, `shouldAddNpcTruck`, `pruneTruckSales`) ; game-loop appelle `shouldAddNpcTruck` / `addNpcTruckSale` ; ui.js affiche `worldTruckSales` dans `worldMapNpcTrucksEl` avec position interpolée selon `truckMs`.
### Actions
1. **Villes** : Vérifier / implémenter la formule dattraction (proximité zooville + valeur des animaux) et le plafond « max visiteurs vers zoos » par ville ; afficher sur la carte les cases ville avec nom et compteur max visiteurs (voir `docs/features/villes-phase11.md`).
2. **Stagnation** : Suivre la « dernière action dévolution » par zoo (ou par joueur) ; appliquer un multiplicateur de visiteurs dégressif jusquà un plancher (ex. 10 %) si aucune action depuis un délai configurable.
3. **Camions NPC** : Sassurer que la boucle de jeu et lUI créent et affichent bien des camions entre zoos (animations interpolées) selon la config existante.
**Fichiers concernés :** `web/js/config.js`, `web/js/income.js` ou module attractivité, `web/js/ui.js` (carte du monde, villes), `web/js/game-loop.js`, `docs/features/villes-phase11.md`.
---
## 6. Interface et barre du haut (§4)
### Écarts
- **Rafraîchissement (§4)** : La barre du haut ne doit pas être reconstruite à chaque mise à jour ; seules les parties dynamiques (indicateurs, grille, carte) sont rafraîchies. **Vérifié** : `setState()` appelle la closure `fullRender()` retournée par `render()` ; celle-ci ne recrée pas le DOM de la barre, elle appelle seulement `updateStatus()` puis `renderWorldMap()` et `renderGrid()`. La barre est créée une seule fois au premier `render(root, opts)`.
- **Pas donglets avec titres** : Pas donglets « Carte du zoo » / « Carte du monde » avec titres ; un seul sélecteur (icônes zoo / monde). À vérifier dans lUI.
- **Message derreur** : Masqué et ne prenant pas de place lorsquil ny a pas derreur. **Fait** : `setError("")` met `errEl.hidden = true` ; la règle CSS `.error-msg[hidden] { display: none; margin: 0; padding: 0; min-height: 0; }` garantit labsence demprise au layout.
### Actions
1. **Barre** : Isoler la barre dans des composants ou nactualiser que les nœuds dynamiques (indicateurs, icônes) au lieu de recréer toute la barre à chaque rendu.
2. **Onglets** : Supprimer ou ne pas afficher de titres donglets « Carte du zoo » / « Carte du monde » si présents ; garder uniquement le sélecteur icônes.
3. **Erreur** : Sassurer que le message derreur est caché (et noccupe pas despace) quand `errorMsg` est vide.
**Fichiers concernés :** `web/js/ui.js`.
---
## 7. Animaux Feedbacks visuels, morts, saisons (§12)
### Écarts
- **Feedbacks visuels (§12)** : Froid (bleuâtre, givre), chaud (rougeâtre, vapeur), faim (lent, maigre, icône), maladie/mort proche (couché, ternes, mouches), heureux/reproduction (cœurs, couleurs vives). Pas de jauges. Non implémenté côté rendu.
- **Mort (§12)** : Toutes les causes listées (seuls, pas visités, nourriture, tué autre zoo, 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). Partiellement implémentées ; recensement dans `docs/features/causes-mort-audit.md`.
- **Saisons (§12)** : Les 4 saisons influencent météo, température, bonus/malus reproduction et survie. Non implémenté.
### Actions
1. **Feedbacks** : Définir les états visuels des animaux (froid, chaud, faim, maladie, heureux) à partir des données déjà calculées (température, nourriture, visite, etc.) et adapter le rendu (CSS, teintes, icônes) sans ajouter de jauges.
2. **Morts** : Auditer les causes de mort dans le code et les comparer à la liste du §12 ; implémenter les manquantes (délais bébé mature / accueil / vente échouée, température/milieu, etc.).
3. **Saisons** : Introduire une notion de saison (Printemps, Été, Automne, Hiver) liée au temps de jeu ou à la date ; faire évoluer météo, température et formules de reproduction/survie selon la saison.
**Fichiers concernés :** `web/js/loot-tables.js`, `web/js/game-loop.js`, `web/js/income.js` (ou modules nourriture/visiteurs), `web/js/ui.js` (rendu animaux), `web/js/config.js`, `web/js/types.js`.
---
## 8. Billeterie Flux explicite (§7, §10)
### Écart
- Le cahier indique que la **billeterie** (entrée des visiteurs, 20 visiteurs/unité) et le flux arrivée/départ/retour selon lattraction sont **non implémentés** (§7). Le code a déjà une capacité billeterie et un plafond de visiteurs ; le flux « entrée par la billeterie, départ avant fin de journée, retour selon attraction » reste à préciser et à coder.
### Actions
1. Clarifier le **design** : arrivée des visiteurs depuis les villes → billeterie (cap), durée max 1 journée, départ par la billeterie, retour selon attractivité.
2. Implémenter le flux dans le module visiteurs / income : génération des arrivées, suivi du temps passé, départ, et réinjection selon attractivité (en lien avec phase Villes si besoin).
**Fichiers concernés :** `web/js/income.js`, `web/js/config.js`, `docs/features/` (fiche billeterie).
---
## 9. Références et cohérence
- **Règles économie (§1)** : Compatibilité anciennes sauvegardes (animal inconnu → c0_r0, œuf inconnu → Color_1) : déjà gérée dans `normalizeLoadedCells` / loadState.
- **Sécurité (§1)** : Pas de confiance au client, limitation fréquence, traçabilité : à garder en tête pour toute évolution API/serveur.
- **BDD et comptes** : Rester aligné avec `docs/bdd-comptes.md` pour tout changement de schéma ou de flux 401/404/200.
---
## 10. Ordre recommandé des mises à jour
1. **Grille au lancement + 3 couples reproducteurs** (§1, §10) prérequis pour un démarrage conforme.
2. **Ventes validation différée + sablier** (§13) changement métier important et visible.
3. **Mode automatique 50 profils et UI hiérarchique** (§5) grosse évolution UX et données.
4. **Visitor.MaxSecondsWithoutVisit + disparition animaux** (§2) rapide si la boucle de jeu existe déjà.
5. **Interface barre non reconstruite, erreur masquée** (§4) rapide.
6. **Villes formule attraction + cases** (§3, §11) voir `docs/features/villes-phase11.md`.
7. **Stagnation** (§3) après ou avec le module visiteurs.
8. **Incidents visiteurs + invités de luxe** (§2) après flux visiteurs stable.
9. **Feedbacks visuels animaux + causes de mort manquantes** (§12) progressif.
10. **Saisons** (§12) après température/milieu et reproduction.
11. **Billeterie flux complet** (§7, §10) après design validé.
Ce plan peut être découpé en fiches `docs/features/` ou en issues par bloc, et réordonné selon les priorités du projet.