Lint: fix errors and remove unused variables
**Motivations:** - Ensure lint config is not degraded and fix all lint errors for pousse workflow. **Root causes:** - Unused variables kept with _ prefix instead of removed (_row, _questReward, _i). - getAnimalBlockOrigin had 5 parameters (max 4). - use of continue statement (no-continue rule). **Correctifs:** - ESLint config verified; no eslint-disable in codebase. - Removed unused variable _row (biome-rules); removed dead function _questReward (quests); removed unused map param _i (state.js). - getAnimalBlockOrigin refactored to 4 params (pos object instead of x, y). - Replaced continue with if (cell) block in normalizeLoadedCells (state.js). - JSDoc param names aligned with _height, _y (biome-rules). **Evolutions:** - (none) **Pages affectées:** - web/js/biome-rules.js - web/js/quests.js - web/js/state.js - web/js/placement.js
This commit is contained in:
25
docs/features/billeterie-flux.md
Normal file
25
docs/features/billeterie-flux.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Billeterie – flux complet
|
||||
|
||||
**Objectif :** Flux d’entrée/sortie conforme aux specs : heures d’ouverture 08h–20h, entrée limitée à 1 visiteur/s, départs après durée de séjour, affluence selon l’heure.
|
||||
|
||||
**Référence :** docs/specs/billeterie.md, visiteur.md, inventaire_heures.md ; plan docs/plan-implementation-specs-animaux-billeterie.md.
|
||||
|
||||
## Impacts
|
||||
|
||||
- **Entrée :** uniquement quand `timeOfDay` dans [OpenHour, CloseHour). Nombre de nouveaux visiteurs par tick plafonné par `MaxEntryPerSecond * secondsPerTick`.
|
||||
- **Départs :** déjà en place (`getStayDurationSeconds`, filtre `arrivedAt + stayDuration`).
|
||||
- **Demande :** `getVisitorDemand` multiplié par un coefficient selon l’heure (08h–10h faible, 10h–16h fort, 16h–18h décroissant, 18h–20h faible, nuit nul).
|
||||
|
||||
## Modifications
|
||||
|
||||
- **web/js/config.js** : `Billeterie.OpenHour`, `Billeterie.CloseHour`, `Billeterie.MaxEntryPerSecond`.
|
||||
- **web/js/income.js** : dans `tickVisitorArrivals`, ne pas ajouter de visiteurs si hors créneau ; plafonner les ajouts par tick avec `MaxEntryPerSecond` et `IncomeTickMs` ; `getVisitorDemandHourMultiplier(timeOfDay)` appliqué dans `getVisitorDemand`.
|
||||
|
||||
## Modalités de déploiement
|
||||
|
||||
Client uniquement. Rechargement suffit.
|
||||
|
||||
## Modalités d'analyse
|
||||
|
||||
- Nuit (timeOfDay < 8 ou >= 20) : aucun nouveau visiteur n’entre.
|
||||
- Jour : nouveaux visiteurs jusqu’à cap et demande, avec au plus 1/s réels (selon tick interval).
|
||||
@@ -28,14 +28,15 @@
|
||||
|
||||
## Non implémenté
|
||||
|
||||
- **Seuls** : pas de règle « animal seul meurt ».
|
||||
- **Seuls** : ~~pas de règle « animal seul meurt ».~~ **Implémenté** : `GameConfig.Animal.MinSameSpeciesInRadius`, `RadiusCells`, `MaxSecondsAlone` ; `checkNotAlone` dans `food.js` ; retrait et `deathCountRecent` si seul depuis trop longtemps.
|
||||
- **Tué par un autre animal d'un autre zoo** : pas de mécanique inter-zoo.
|
||||
- **Niveau de recherche trop inférieur** : pas de vérification niveau recherche vs niveau animal.
|
||||
- **Animal (adulte) vente échouée** : à l'expiration d'une annonce adulte (`isBaby: false`), `deathCountRecent` n'est pas incrémenté (actuellement seul le bébé invendu est compté).
|
||||
- **Niveau de recherche trop inférieur** : ~~pas de vérification niveau recherche vs niveau animal.~~ **Implémenté** : dans `maybeDeathBlock` (food.js), si `def.rarityLevel > getSkillLevel(state)` → retrait et `deathCountRecent`.
|
||||
- **Animal (adulte) vente échouée** : ~~à l'expiration d'une annonce adulte (`isBaby: false`), deathCountRecent n'est pas incrémenté.~~ **Implémenté** : `tickSaleListings` (trade.js) incrémente `deathCountRecent` pour les listings expirés adulte comme bébé.
|
||||
|
||||
## Fichiers
|
||||
|
||||
- `web/js/food.js` : `checkDeathCauses`, `maybeDeathBlock`, `filterPendingBabies`, `filterReceptionAnimals`.
|
||||
- `web/js/trade.js` : `tickSaleListings` (expiration bébé).
|
||||
- `web/js/food.js` : `checkDeathCauses`, `maybeDeathBlock`, `checkNotAlone`, `filterPendingBabies`, `filterReceptionAnimals` ; cause recherche (getSkillLevel), cause seuls (Animal config).
|
||||
- `web/js/trade.js` : `tickSaleListings` (expiration bébé et adulte → deathCountRecent).
|
||||
- `web/js/animal-visits.js` : `lastVisitedAt` pour cause « pas visités ».
|
||||
- `server/db.js` : `expireSaleListings` (bébé invendu).
|
||||
- `web/js/config.js` : `Animal.MinSameSpeciesInRadius`, `RadiusCells`, `MaxSecondsAlone`.
|
||||
|
||||
24
docs/features/feedbacks-visuels-animaux.md
Normal file
24
docs/features/feedbacks-visuels-animaux.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Feedbacks visuels animaux
|
||||
|
||||
**Objectif :** États visuels (froid, chaud, faim, malade, heureux) dérivés des données existantes, sans jauges. Specs : animal_generique.md, temperature.md.
|
||||
|
||||
## Impacts
|
||||
|
||||
- **Rendu :** classes CSS `animal-cold`, `animal-hot`, `animal-hungry`, `animal-sick`, `animal-happy` sur les cellules animal (origine et parties de bloc).
|
||||
- **Logique :** `getAnimalVisualState(cell, state, grid, originKey)` dans animal-visual-state.js : température (avec saison), lastFedAt, lastVisitedAt, seuils config (Food.MaxSecondsWithoutFood, Visitor.MaxSecondsWithoutVisit) pour déduire cold/hot/hungry/sick/happy.
|
||||
|
||||
## Modifications
|
||||
|
||||
- **web/js/animal-visual-state.js** : `getAnimalVisualState` (froid = temp < idéal - tolérance, chaud = temp > idéal + tolérance, hungry = fedAgo > 60 % maxFood, sick = cold ou hot ou hungry ou visitAgo > 80 % maxVisit, happy = aucun problème et bien nourri/visité).
|
||||
- **web/js/ui.js** : import `getAnimalVisualState`, pour chaque cellule animal (origine ou non) récupération de l’origine et application des classes.
|
||||
- **web/css/main.css** : `.animal-cold` (teinte bleutée, givre), `.animal-hot` (rougeâtre), `.animal-hungry` (opacité, icône faim), `.animal-sick` (saturé/brillance réduits), `.animal-happy` (lueur, brillance).
|
||||
|
||||
## Modalités de déploiement
|
||||
|
||||
Client uniquement. Rechargement suffit.
|
||||
|
||||
## Modalités d'analyse
|
||||
|
||||
- Animal sur case froide (ou saison hiver) : classe cold visible.
|
||||
- Animal non nourri depuis longtemps : hungry puis sick.
|
||||
- Animal bien nourri et visité, temp ok : happy.
|
||||
@@ -16,7 +16,7 @@
|
||||
- **state.js**
|
||||
- `buildDefaultCells()` : appelle `buildDefaultRow1Cells()` du module partagé `default-grid-layout.js` (research, billeterie, nursery, reception, food, school en ligne 1).
|
||||
- `addStarterAnimals(state)` : importée depuis `default-grid-layout.js` ; place 6 animaux (3 couples) sur la ligne 2.
|
||||
- `defaultState()` : construit le state puis appelle `addDefaultStarterAnimals(state)` avant retour.
|
||||
- `defaultState()` : construit le state puis appelle `addStarterAnimals(state)` avant retour.
|
||||
- **prestige.js**
|
||||
- Même layout de grille et mêmes 3 couples après reset, via `buildDefaultRow1Cells()` et `addStarterAnimals()` importés de `default-grid-layout.js`. Réinitialisation de `pendingBabies` et `receptionAnimals`.
|
||||
|
||||
|
||||
36
docs/features/saisons-phase.md
Normal file
36
docs/features/saisons-phase.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# Saisons – cycle et impacts
|
||||
|
||||
**Objectif :** Cycle de 4 saisons (Printemps, Été, Automne, Hiver) dérivé du jour de jeu, avec impacts sur température, visiteurs, reproduction et billeterie.
|
||||
|
||||
**Référence :** docs/specs/inventaire_saisons.md, temperature.md, visiteur.md, reproduction.md, billeterie.md ; plan docs/plan-implementation-specs-animaux-billeterie.md.
|
||||
|
||||
## Impacts
|
||||
|
||||
- **State :** `gameDayTotal` (incrémenté à chaque jour de jeu dans `tickTime`), `lastSeason`, `seasonChangeMessage` (pour notification).
|
||||
- **Température :** `getDisplayTemperature` + `getSeasonTemperatureModifier(getCurrentSeason(state))` dans food.js (mort) et reproduction.js (délai naissance).
|
||||
- **Visiteurs :** `getVisitorDemand` multiplié par `getSeasonVisitorMultiplier(season)`.
|
||||
- **Reproduction :** délai multiplié par `(1 + getSeasonReproductionBonus(season))` (Printemps +20 %, Hiver -50 %). En hiver, les espèces adaptées au froid (`biome === "Mountain"`) sont exemptées du malus (`getEffectiveReproductionSeasonBonus` dans reproduction.js).
|
||||
- **Billeterie :** `getVisitorParams` applique `getSeasonTicketPriceMultiplier(season)` sur le paiement entrée (été +20 %, hiver -10 %).
|
||||
- **UI :** toast « C'est le [Saison] ! » à chaque changement de saison (3 s).
|
||||
|
||||
## Modifications
|
||||
|
||||
- **web/js/config.js** : `Season.DaysPerSeason`, `TemperatureModifier`, `VisitorMultiplier`, `ReproductionBonus`, `TicketPriceMultiplier`.
|
||||
- **web/js/time-weather.js** : incrément `gameDayTotal` quand `timeOfDay` dépasse 24.
|
||||
- **web/js/state.js**, **web/js/types.js** : `gameDayTotal`, `lastSeason`, `seasonChangeMessage`.
|
||||
- **web/js/seasons.js** : `getCurrentSeason`, `getSeasonDay`, `getSeasonTemperatureModifier`, `getSeasonVisitorMultiplier`, `getSeasonReproductionBonus`, `getSeasonTicketPriceMultiplier`.
|
||||
- **web/js/game-loop.js** : détection changement de saison, pose `seasonChangeMessage`.
|
||||
- **web/js/food.js** : température effective = base + seasonMod pour `maybeDeathBlock`.
|
||||
- **web/js/reproduction.js** : temp avec seasonMod, facteur × (1 + seasonBonus) ; `getEffectiveReproductionSeasonBonus(season, def)` pour exonérer Mountain en hiver.
|
||||
- **web/js/income.js** : demande × seasonVisitorMult, paiement × seasonTicketPriceMult.
|
||||
- **web/js/ui.js** : toast saison (seasonToastEl), `seasonLabel`, `seasonChangeToast`.
|
||||
- **web/css/main.css** : `.season-toast`.
|
||||
|
||||
## Modalités de déploiement
|
||||
|
||||
Client uniquement. Rechargement suffit.
|
||||
|
||||
## Modalités d'analyse
|
||||
|
||||
- Avancer le temps (DayLengthSeconds court) jusqu’à changement de jour ; vérifier `gameDayTotal` ; après 7 jours (DaysPerSeason), vérifier changement de saison et toast.
|
||||
- Vérifier en été : demande visiteurs plus forte, prix ticket plus élevé ; en hiver : demande plus faible, prix ticket plus bas.
|
||||
42
docs/features/ui-render-extraction.md
Normal file
42
docs/features/ui-render-extraction.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# Extraction du rendu UI (render)
|
||||
|
||||
## Objectif
|
||||
|
||||
Réduire `web/js/ui.js` pour respecter les règles ESLint :
|
||||
- max 250 lignes par fichier
|
||||
- max 40 lignes par fonction
|
||||
|
||||
## Réalisé
|
||||
|
||||
- **no-shadow** : variables `phase` / `weather` dans `updateStatus` renommées en `timePhase` / `weatherVal` ; `mapLevel` dans `fullRender` renommé en `currentMapLevel`.
|
||||
- **Imports inutilisés** : suppression des imports devenus inutiles après utilisation des modules world-map et grid (zoo, conveyor, economy, placement, texts-fr, api-client) ; suppression de la constante `EGG_EMOJI` non utilisée.
|
||||
- **Réutilisation des modules** : `render()` utilise désormais `renderWorldMap(ctx)` de `ui-world-map.js` et `renderGrid(ctx)` de `ui-grid.js` au lieu des anciennes fonctions locales (environ 900 lignes supprimées).
|
||||
- **Refs** : `selectedTokenId`, `emptyCellChoice`, `lastActionWasDrop`, `sellZoneJustDropped` sont passés en refs pour être partagés avec les handlers (grid, sell zone) et les modules.
|
||||
|
||||
# Extraction du rendu UI (render)
|
||||
|
||||
## Objectif
|
||||
|
||||
Réduire `web/js/ui.js` pour respecter les règles ESLint :
|
||||
- max 250 lignes par fichier
|
||||
- max 40 lignes par fonction
|
||||
|
||||
## Réalisé
|
||||
|
||||
- **no-shadow** : variables `phase` / `weather` dans `updateStatus` renommées en `timePhase` / `weatherVal` ; `mapLevel` dans `fullRender` renommé en `currentMapLevel`.
|
||||
- **Imports inutilisés** : suppression des imports devenus inutiles après utilisation des modules world-map et grid (zoo, conveyor, economy, placement, texts-fr, api-client) ; suppression de la constante `EGG_EMOJI` non utilisée.
|
||||
- **Réutilisation des modules** : `render()` utilise désormais `renderWorldMap(ctx)` de `ui-world-map.js` et `renderGrid(ctx)` de `ui-grid.js` au lieu des anciennes fonctions locales (environ 900 lignes supprimées).
|
||||
- **Refs** : `selectedTokenId`, `emptyCellChoice`, `lastActionWasDrop`, `sellZoneJustDropped` sont passés en refs pour être partagés avec les handlers (grid, sell zone) et les modules.
|
||||
- **Extraction en modules** :
|
||||
- `ui-render-dom.js` : `buildUIDOM`, `createTabsStructure`, `updateStatusBody`, `createUpdateStatus`, `createFullRender`, `updateWorldMapUpgradeAndCounters`, `buildFinishContexts`, `finishBuildUIDOM` ; `formatQuestListHtml` pour garder `updateStatusBody` sous 40 lignes ; `finishBuildUIDOM` prend un objet `opts` (max-params) et délègue les contextes à `buildFinishContexts`.
|
||||
- `ui-render-dom-panels.js` : `buildWorldMapWrap`, `buildWorldMapUpgradeZone`, `buildWorldMapTruckDropZone`, `buildWorldMapActions`, `buildWorldMapSection`, `buildPlotUpgradeZone`, `buildGridSection`, `attachSellZoneListeners`, `handleSellZoneClick` ; import de `handleWorldMapTruckDrop` et `handleSellZoneDrop` depuis `ui-render-dom-drops.js`.
|
||||
- `ui-render-dom-drops.js` (nouveau) : handlers de drop pour la carte du monde (camion) et la sell zone ; `handleWorldMapTruckDrop`, `handleSellZoneDrop` exportés ; sous-handlers `handleTruckDropBaby`, `handleTruckDropAnimal`, `handleTruckDropEgg`, `applyNurseryDrop`, `applyReceptionDrop`, `applyGridCellSell` pour rester sous 40 lignes et réduire la complexité.
|
||||
- `ui-render-gamebar.js` : `buildGameBar` et helpers (title, status bar, view switcher, music, auto mode, prestige/restart, quest dropdown) ; import de `buildAutoProfilePicker` depuis `ui-render-gamebar-picker.js`.
|
||||
- `ui-render-gamebar-picker.js` (nouveau) : `buildAutoProfilePicker` avec `buildAutoProfilePickerFamilyStep` et `buildAutoProfilePickerSpecStep` pour respecter max-lines-per-function et max-lines du fichier gamebar.
|
||||
- `ui.js` : `EMOJI_BY_COLOR`, `animalEmoji`, `buildRenderSetup(opts)`, `render(root, opts)` qui appelle `buildUIDOM(root, setup)` ; fichier et fonctions sous les limites.
|
||||
- **Imports nettoyés** : `getPlotUpgradeCost` retiré de panels ; `t` retiré de ui-render-dom ; imports inutilisés retirés de ui-render-gamebar (getSkillLevel, getVisitorCount, getTimePhase, doPrestige, playSound, errorMessage, questDescription, timePhaseLabel, weatherLabel, GameConfig ; textes et auto-mode-profiles conservés dans le picker).
|
||||
|
||||
## État actuel
|
||||
|
||||
- **ESLint** : 0 erreur sur les fichiers modifiés. Les warnings (complexity, etc.) restants sont hors périmètre de cette extraction.
|
||||
- **Fichiers** : `ui.js`, `ui-render-dom.js`, `ui-render-dom-panels.js`, `ui-render-dom-drops.js`, `ui-render-gamebar.js`, `ui-render-gamebar-picker.js` respectent max-lines (250) et max-lines-per-function (40).
|
||||
0
docs/leo.md
Normal file
0
docs/leo.md
Normal file
@@ -1,321 +0,0 @@
|
||||
# Plan d'implémentation – Rappel des grandes règles (cahier des charges 174-324)
|
||||
|
||||
Plan pour implémenter l’intégralité du bloc « Rappel des grandes règles » sans exception. Les phases sont ordonnées par dépendances ; chaque phase livre un ensemble cohérent et testable.
|
||||
|
||||
---
|
||||
|
||||
## 0. Modèle de données et configuration
|
||||
|
||||
**Objectif** : Fondations pour tout le reste (cases avec couleur + température, bâtiments, bébés vs animaux, ventes).
|
||||
|
||||
**Livrables** :
|
||||
- **Cases** : chaque case a une **couleur** (milieu : eau douce, eau salée, montagne, prairie, forêt, etc.) et une **température** (nombre ou plage). Transitions douces = formules d’interpolation entre cases voisines (calcul côté moteur).
|
||||
- **Animaux multi-cases** : définition des types d’animaux qui occupent N×M cases (shape), et stockage dans `grid.cells` (référence à une entité « animal » multi-case ou marquage des cases).
|
||||
- **Types de bâtiments** (remplacement / extension des kinds actuels) :
|
||||
- `research` (Centre de recherche), 7 niveaux
|
||||
- `billeterie`, 7 niveaux
|
||||
- `boutique` (déjà présent en `souvenirShop` → renommer/aligner), 7 niveaux
|
||||
- `nursery`, 7 niveaux (au lieu de 5)
|
||||
- `food` (Nourriture), 7 niveaux
|
||||
- `reception` (Accueil nouveaux animaux), 7 niveaux
|
||||
- `truck` (camion : actuellement métadonnée d’état, pas une case – à trancher : case dédiée ou zone comme aujourd’hui)
|
||||
- `biomeChangeColor` (changement de milieu couleur), 7 niveaux
|
||||
- `biomeChangeTemp` (changement de milieu température), 7 niveaux
|
||||
- **Entités déplaçables** : `baby` (bébé, en nurserie ou en vente), `animal` (adulte, sur carte ou en accueil ou en vente). Plus d’œufs comme objet principal : les zoos exposent des **bébés** et des **animaux** à l’achat/vente.
|
||||
- **Config** : GameConfig étendu (niveaux max à 7 pour les bâtiments listés, coûts, capacités : recherche 10 zoos/unité, billeterie 20 visiteurs/unité, boutique 5 visiteurs/unité, nurserie 1 bébé/unité, nourriture 5 animaux/unité, accueil 1 animal/unité, camion 1/unité).
|
||||
|
||||
**Fichiers impactés** : `web/js/types.js`, `web/js/config.js`, `web/js/state.js`, `server/schema.sql` (si extension game_state), `web/js/loot-tables.js` (animaux avec `cellsWide`, `cellsHigh`, température idéale, score reproduction/survie par milieu).
|
||||
|
||||
**Dépendances** : aucune.
|
||||
|
||||
---
|
||||
|
||||
## 1. Cartes : couleurs et températures des cases
|
||||
|
||||
**Objectif** : Les cases ont une couleur (milieu) et une température ; les transitions sont douces entre cases.
|
||||
|
||||
**Livrables** :
|
||||
- **Couleurs** : élargir les biomes au-delà de prairie/océan/montagne (eau douce, eau salée, montagne, prairie, forêt, etc.) ; chaque case a un `biome` (couleur/milieu) et un `temperature` (valeur ou min/max).
|
||||
- **Transitions douces** : calcul de la couleur et de la température affichées par interpolation avec les cases voisines (ou gradient par position). Export d’une fonction du type `getDisplayColor(x, y, grid)`, `getDisplayTemperature(x, y, grid)`.
|
||||
- **Rendu** : CSS/Canvas ou styles dynamiques pour fond de case selon couleur et température (dégradés entre cases).
|
||||
- **Grille** : les cases forment le cadrillage des cartes (zoo et monde) ; pas de changement de structure, seulement sémantique couleur/température.
|
||||
|
||||
**Fichiers impactés** : `web/js/biome-rules.js` (ou nouveau `cell-environment.js`), `web/js/grid-utils.js`, `web/css/main.css`, `web/js/ui.js` (rendu grille).
|
||||
|
||||
**Dépendances** : Phase 0.
|
||||
|
||||
---
|
||||
|
||||
## 2. Animaux multi-cases
|
||||
|
||||
**Objectif** : Certains animaux prennent plusieurs cases.
|
||||
|
||||
**Livrables** :
|
||||
- **Définition** : dans les données animaux (loot-tables ou équivalent), champs `cellsWide`, `cellsHigh` (ex. 1×1, 2×2). Placement valide si toutes les cases cibles sont vides et dans les limites.
|
||||
- **Stockage** : soit une entité « animal » avec `originKey` (case coin) + `animalId` + `width`, `height`, soit marquage de chaque case avec référence à la même entité. Suppression/mouvement : toute la surface est libérée ou déplacée.
|
||||
- **Règles** : cohérence animal/milieu et température (phase 1) appliquée sur la zone couverte (ex. toutes les cases dans la plage de température idéale ou au moins la case d’origine).
|
||||
- **UI** : affichage d’un sprite ou emprise sur plusieurs cases ; glisser-déposer d’un animal multi-case déplace tout le bloc.
|
||||
|
||||
**Fichiers impactés** : `web/js/loot-tables.js`, `web/js/placement.js`, `web/js/grid-utils.js`, `web/js/ui.js`, `web/js/state.js` (structure cells).
|
||||
|
||||
**Dépendances** : Phase 0, 1.
|
||||
|
||||
---
|
||||
|
||||
## 3. Bâtiments zoo (types et niveaux)
|
||||
|
||||
**Objectif** : Implémenter tous les types de cases « achetables » avec 7 niveaux et leurs effets.
|
||||
|
||||
**Livrables** :
|
||||
- **Centre de recherche** (`research`) : 7 niveaux. Produit des **unités de recherche** par tick (formule par niveau). Stock dans le game_state (ex. `researchPoints`). 1 unité = 10 zoos max couverts (par proximité sur la carte du monde) ; ces zoos débloquent des niveaux d’animaux/bébés. Coût d’upgrade par palier.
|
||||
- **Billeterie** : 7 niveaux. Cap visiteurs en simultané = 20 × niveau (ou 20 par unité comme dans le rappel). Entrée des visiteurs uniquement via la billeterie (voir phase 8). Coût par palier.
|
||||
- **Boutique** : passer à 7 niveaux. 1 unité = 5 visiteurs simultanés max (effet sur revenus quand un visiteur « passe » par une boutique). Coût par palier.
|
||||
- **Nurserie** : 7 niveaux. 1 unité = 1 bébé max en croissance. Effet « plus rapide » et « meilleurs reproducteurs » (à lier à la reproduction, phase 7). Coût par palier.
|
||||
- **Nourriture** : 7 niveaux. 1 unité = 5 animaux max nourris (voir phase 4). Coût par palier.
|
||||
- **Accueil nouveaux animaux** : 7 niveaux. 1 unité = 1 animal en acclimatation. Durée d’acclimatation selon niveau ; à la fin, état « animal prêt » déplaçable sur une case ou sur le camion. Coût par palier.
|
||||
- **Camion** : 7 niveaux. Représentation : soit une case dédiée « camion », soit une zone comme aujourd’hui ; 1 unité = 1 camion. Effets : plus rapide (durée trajet), dégrade moins le score de reproduction avec la durée du transport (à lier aux ventes et au score de reproduction).
|
||||
- **Changement de milieu (couleur)** : 7 niveaux, payant. Permet de modifier la couleur/milieu d’une case (ou d’une zone selon niveau). Effets : plage de température plus précise, améliore reproduction, diminue besoin nourriture, allonge temps avant mort.
|
||||
- **Changement de milieu (température)** : 7 niveaux, payant. Même idée pour la température des cases.
|
||||
|
||||
**Grille au lancement** (à appliquer en phase 11) : 1 Agrandissement zoo, 1 Recherche, 1 Billeterie, 1 Nurserie, 1 Accueil, 1 Nourriture, 1 Camion, 24 cases (3 couleurs). Pas de « changement de milieu » au lancement.
|
||||
|
||||
**Fichiers impactés** : `web/js/config.js`, `web/js/state.js`, `web/js/economy.js`, `web/js/placement.js`, `web/js/zoo.js`, `web/js/ui.js`, `server/` si game_state étendu.
|
||||
|
||||
**Dépendances** : Phase 0.
|
||||
|
||||
---
|
||||
|
||||
## 4. Bébés et flux nurserie / accueil (remplacement œufs)
|
||||
|
||||
**Objectif** : Ce ne sont plus des œufs qui apparaissent dans les zoos mais des bébés ; flux nurserie → bébé mature, achat/accueil → animal prêt.
|
||||
|
||||
**Livrables** :
|
||||
- **Suppression du modèle « œuf »** comme objet acheté sur la carte du monde. Les zoos (et le labo) proposent des **bébés** ou des **animaux adultes** à l’achat.
|
||||
- **Nurserie** : un bébé est « en croissance » dans une case nurserie (1 bébé par unité de capacité). À la fin de la durée : état **bébé mature**. Déplacement possible : vers une case vide du zoo (devient animal) ou vers le camion (mise en vente, voir phase 9).
|
||||
- **Accueil nouveaux animaux** : un animal acheté (ou reçu) est d’abord en **accueil** (1 animal par unité). À la fin de l’acclimatation : **animal prêt**. Déplacement possible : vers une case vide du zoo ou vers le camion (mise en vente).
|
||||
- **Carte du zoo** : on peut **acheter** (occupe la case) : recherche, billeterie, boutique, nurserie, nourriture, accueil, camion, changement de milieu (couleur), changement de milieu (température). On peut **déplacer dessus** (occupe la case) : bébé mature, animal prêt.
|
||||
- **État** : `pendingBabies` / `receptionAnimals` avec `readyAt`, `babyId` / `animalId`, lien vers case nurserie/accueil. Quand `now >= readyAt`, l’entité est déplaçable (bébé mature / animal prêt).
|
||||
|
||||
**Fichiers impactés** : `web/js/state.js`, `web/js/zoo.js`, `web/js/placement.js`, `web/js/hatching.js` (remplacer par croissance bébé + acclimatation), `web/js/conveyor.js` (offres = bébés/animaux, pas œufs), `web/js/ui.js`, `web/js/world-map.js`, API offres.
|
||||
|
||||
**Dépendances** : Phase 0, 3.
|
||||
|
||||
---
|
||||
|
||||
## 5. Nourriture, consommation et morts
|
||||
|
||||
**Objectif** : Chaque animal a une consommation / unité de temps ; sinon il meurt. Toutes les causes de mort listées.
|
||||
|
||||
**Livrables** :
|
||||
- **Nourriture** : par tick, calcul de la consommation totale des animaux du zoo. Les bâtiments « nourriture » ont une capacité (5 animaux × niveau ou 5 par unité). Répartition : nourrir jusqu’à la capacité ; les animaux non nourris accumulent un déficit (ou un timer « sans nourriture »).
|
||||
- **Mort si pas nourri** : au-delà d’un seuil (temps ou déficit), l’animal meurt (retiré de la grille, enregistré pour pénalités attractivité / naissances).
|
||||
- **Autres causes de mort** (toutes à implémenter) :
|
||||
- **Seul** : à définir (ex. animal seul sur l’île sans voisin après un délai).
|
||||
- **Pas visité** : déjà en place (MaxSecondsWithoutVisit).
|
||||
- **Manque de nourriture** : ci-dessus.
|
||||
- **Tué par un autre animal d’un autre zoo** : règle métier (ex. événement rare ou mécanique croisée entre zoos).
|
||||
- **Niveau de recherche trop inférieur** : si niveau du centre de recherche du zoo < seuil requis pour le type d’animal, après un délai l’animal meurt.
|
||||
- **Bébé non vendu dans les délais** : si un bébé en vente n’est pas vendu avant une date limite, il meurt (voir phase 9).
|
||||
- **Bébé de nurserie prêt non placé dans les délais** : si bébé mature n’est pas déplacé (case ou camion) avant un délai, il meurt.
|
||||
- **Animal d’accueil prêt non placé sur la carte après un délai** : idem.
|
||||
- **Animal non placé sur la carte dans les délais (vente échouée)** : si une vente est annulée ou expire sans que l’animal soit récupéré, mort.
|
||||
- **Température trop en écart** : si la température de la case (ou de la zone) n’est pas dans la plage acceptable pour l’animal, après un délai mort.
|
||||
- **Milieu (couleur) trop en écart** : idem pour le biome.
|
||||
- **Historique des morts** : stockage (compteur ou liste récente) pour calcul d’attractivité et de naissances (phases 8 et 7).
|
||||
|
||||
**Fichiers impactés** : `web/js/config.js`, `web/js/state.js`, nouveau `web/js/food.js` (ou dans `income.js`), `web/js/game-loop.js`, `web/js/animal-visits.js` (étendre pour morts), `web/js/loot-tables.js` (température idéale, plages par animal).
|
||||
|
||||
**Dépendances** : Phase 0, 1, 3, 4.
|
||||
|
||||
---
|
||||
|
||||
## 6. Reproduction
|
||||
|
||||
**Objectif** : Après un délai, en proximité d’un autre animal de même type mais issu d’un zoo différent, naissance d’un bébé (nurserie ou vente). Score de reproduction du zoo et adéquation température/milieu influencent.
|
||||
|
||||
**Livrables** :
|
||||
- **Proximité** : deux animaux de même type (même `animalId` ou même « type ») sur des cases adjacentes (ou à distance N). Un des deux doit avoir une origine « autre zoo » (vendue achetée) pour permettre la reproduction.
|
||||
- **Délai** : timer par paire ou par animal ; à l’échéance, génération d’un **bébé**. Le bébé va en nurserie si une place est libre, sinon directement en vente (case de vente sur la carte du monde).
|
||||
- **Score de reproduction du zoo** (voir phase 7) : utilisé pour accélérer l’arrivée du bébé (réduction du délai).
|
||||
- **Température et milieu** : « très bonne adéquation » avec la température/milieu de l’animal réduit le délai ou augmente la chance de reproduction.
|
||||
- **Score de reproduction par milieux (couleurs)** et **score de survie par milieux (couleurs)** : définis dans les données animaux ; utilisés dans les formules de reproduction et de mort.
|
||||
- **Température idéale** : par type d’animal (déjà prévu en phase 5 pour les morts) ; utilisée aussi pour la reproduction.
|
||||
|
||||
**Fichiers impactés** : `web/js/loot-tables.js`, nouveau `web/js/reproduction.js`, `web/js/state.js`, `web/js/game-loop.js`.
|
||||
|
||||
**Dépendances** : Phase 0, 1, 4, 5.
|
||||
|
||||
---
|
||||
|
||||
## 7. Score de reproduction du zoo
|
||||
|
||||
**Objectif** : Nombre de naissances, taux d’alimentation, et score « vendu » attaché aux animaux.
|
||||
|
||||
**Livrables** :
|
||||
- **Nombre de naissances** : compteur dans le game_state (incrémenté à chaque bébé né en reproduction).
|
||||
- **Taux d’alimentation** : ratio (animaux nourris / animaux total) sur une fenêtre ou instantané ; stocké ou dérivé pour l’affichage et les formules.
|
||||
- **Score de reproduction** (valeur agrégée du zoo) : formule combinant naissances, taux d’alimentation, et éventuellement autres facteurs. Exposé pour l’UI (carte du monde : case « score de reproduction » sous le nom du zoo).
|
||||
- **Animal vendu** : quand un animal quitte le zoo (vente), il garde en mémoire le **score de reproduction du zoo au moment de la vente** (pour accélérer l’arrivée d’un bébé dans le zoo acheteur, phase 6).
|
||||
|
||||
**Fichiers impactés** : `web/js/state.js`, `web/js/income.js` ou `web/js/food.js`, `web/js/reproduction.js`, `web/js/trade.js`, `web/js/world-map.js` (affichage score).
|
||||
|
||||
**Dépendances** : Phase 5, 6.
|
||||
|
||||
---
|
||||
|
||||
## 8. Attractivité et visiteurs (billeterie, 1 journée, boutiques)
|
||||
|
||||
**Objectif** : Visiteurs entrent par la billeterie, restent max 1 journée, plus longtemps avec boutiques et nombre d’animaux différents. Attractivité du zoo avec toutes les composantes et pénalités.
|
||||
|
||||
**Livrables** :
|
||||
- **Billeterie** : seule entrée des visiteurs dans le zoo. Capacité simultanée = 20 × niveau billeterie (ou 20 par unité). Le nombre de visiteurs présents est plafonné par cette capacité.
|
||||
- **Durée max 1 journée** : chaque visiteur a une « arrivée » ; il repart au plus tard après 1 journée (temps de jeu). Il repart par la billeterie.
|
||||
- **Temps passé** : les visiteurs restent plus longtemps dans la journée s’il y a des boutiques et plus d’animaux différents (formule à définir).
|
||||
- **Déplacement** : les visiteurs se déplacent en étant attirés (déjà partiellement en place ; conserver et adapter si besoin).
|
||||
- **Attractivité du zoo** (formule globale) :
|
||||
- proportionnelle à la valeur cumulée des animaux du zoo
|
||||
- proportionnelle au nombre d’animaux différents
|
||||
- proportionnelle à la rareté (niveau) des animaux
|
||||
- proportionnelle au taux de remplissage en animaux
|
||||
- **Pénalités** : les morts pénalisent l’attractivité auprès des visiteurs à venir (depuis les villes) ; les morts pénalisent l’apparition de naissances dans le zoo.
|
||||
- **Bonus** : les naissances augmentent l’attractivité auprès des visiteurs à venir ; les naissances augmentent l’apparition d’autres naissances dans le zoo.
|
||||
- **Villes** : nombre de visiteurs maximum vers les zoos (voir phase 10). L’attractivité du zoo détermine combien de ces visiteurs sont « alloués » au zoo.
|
||||
- **Affichage** : sur la carte du monde, sous le nom du zoo : une case « score d’attractivité » (et une « score de reproduction », phase 7).
|
||||
|
||||
**Fichiers impactés** : `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`.
|
||||
|
||||
**Dépendances** : Phase 3, 5, 7.
|
||||
|
||||
---
|
||||
|
||||
## 9. Carte du monde : agrandissement en unités de recherche et compteurs
|
||||
|
||||
**Objectif** : Agrandissement de la carte payé en unités de recherche ; affichage des compteurs et des cases zoo (attractivité, reproduction, vente).
|
||||
|
||||
**Livrables** :
|
||||
- **Agrandissement de la carte** : plus payé en pièces mais en **unités de recherche** produites par les centres de recherche des zoos du joueur. Coût en unités par palier (plus cher par palier, même nombre de cases ajoutées). Si pas assez d’unités, bouton/zone grisé.
|
||||
- **Compteurs** (sur la carte du monde ou dans une barre dédiée) :
|
||||
- Compteur de bébés à vendre (total ou par zoo)
|
||||
- Compteur d’animaux à vendre
|
||||
- Compteur de laboratoires
|
||||
- Compteur de zoos
|
||||
- Compteur de villes
|
||||
- **Cases monde au lancement** : 1 Agrandissement carte, 1 Compteur bébés à vendre, 1 Compteur animaux à vendre, 1 Compteur laboratoires, 1 Compteur zoos, 1 Compteur villes, 1 Accueil, 1 Nourriture, 1 Camion, 24 cases 3 couleurs.
|
||||
- **Case du zoo (joueur et autres)** : 1 case nom du zoo, juste en dessous 1 case score d’attractivité, juste en dessous 1 case score de reproduction, juste en dessous 1 case de vente (voir phase 10). Possibilité d’acheter sur les cases voisines d’autres cases de vente (achats multi-slots).
|
||||
- Même principe pour zoos des autres joueurs et zoos bots.
|
||||
|
||||
**Fichiers impactés** : `web/js/state.js`, `web/js/economy.js`, `web/js/world-map.js`, `web/js/ui.js`, `web/js/config.js`.
|
||||
|
||||
**Dépendances** : Phase 3, 7, 8.
|
||||
|
||||
---
|
||||
|
||||
## 10. Ventes et enchères (bébés et animaux adultes)
|
||||
|
||||
**Objectif** : Bébés et animaux en vente sur la carte du monde ; enchères joueurs/bots ; vendeur valide ou non ; bébé invendu meurt.
|
||||
|
||||
**Livrables** :
|
||||
- **Cases de vente** : sur la carte du monde, sous le nom de chaque zoo, une (ou plusieurs) case(s) de vente affichant un bébé ou un animal à vendre, avec le dernier montant d’enchère.
|
||||
- **Mise en vente** : depuis la carte du zoo, déplacer un animal ou un bébé mature sur le camion → l’entité sort du zoo et apparaît en **vente** sur la carte du monde (case de vente du joueur).
|
||||
- **Enchères** : joueurs et bots peuvent enchérir. Montant initial décidé par le vendeur (ou dérivé d’un prix de base). Après un temps, le **vendeur** choisit de valider ou non la vente (acceptation de la meilleure enchère ou refus).
|
||||
- **Si vente validée** : l’acheteur reçoit le bébé ou l’animal (en accueil dans son zoo, ou en nurserie si bébé). Le score de reproduction du zoo vendeur au moment de la vente est attaché à l’entité (pour accélérer bébé en phase 6).
|
||||
- **Si bébé invendu** (délai dépassé sans vente validée) : le bébé **meurt** (supprimé, pénalités éventuelles).
|
||||
- **Animaux adultes** : les zoos vendent aussi des animaux adultes (pas seulement des bébés) ; même flux : mise sur le camion → case de vente → enchères → validation ou refus.
|
||||
|
||||
**Fichiers impactés** : `web/js/state.js`, `web/js/trade.js`, `web/js/world-map.js`, `web/js/ui.js`, `server/routes/zoos.js` ou nouveau `server/routes/trades.js` (enchères temps réel ou polling), `server/db.js` (table ou champs pour offres de vente / enchères).
|
||||
|
||||
**Dépendances** : Phase 4, 6, 7, 9.
|
||||
|
||||
---
|
||||
|
||||
## 11. Villes
|
||||
|
||||
**Objectif** : Cases des villes avec nom et nombre de visiteurs maximum vers les zoos.
|
||||
|
||||
**Livrables** :
|
||||
- **Cases des villes** : sur la carte du monde, chaque ville a 1 case nom et 1 case « nombre de visiteurs maximum vers les zoos » (capacité totale ou par zoo à définir).
|
||||
- **Règle** : ce nombre limite ou répartit les visiteurs qui peuvent aller vers les zoos (déjà partiellement en place avec CityAttractionScale ; adapter pour un plafond « max visiteurs vers zoos » par ville).
|
||||
|
||||
**Fichiers impactés** : `web/js/config.js`, `web/js/world-map.js`, `web/js/income.js` ou `web/js/visitor-attraction.js`, `web/js/ui.js`.
|
||||
|
||||
**Dépendances** : Phase 8.
|
||||
|
||||
---
|
||||
|
||||
## 12. UI et grille au lancement
|
||||
|
||||
**Objectif** : Grille zoo et monde conformes au rappel ; transitions douces visibles ; tous les types de cases et actions.
|
||||
|
||||
**Livrables** :
|
||||
- **Carte du zoo au lancement** : 1 Agrandissement du zoo (+1 case, payant), 1 Recherche (en haut à gauche), 1 Billeterie, 1 Nurserie, 1 Accueil nouveaux animaux, 1 Nourriture, 1 Camion, 24 cases de 3 couleurs différentes. Positions exactes (ex. 1_1 = Recherche, 2_1 = Billeterie, …) à fixer dans `defaultState()` et config.
|
||||
- **Carte du monde au lancement** : 1 Agrandissement de la carte (payé en unités de recherche), compteurs (bébés, animaux, labos, zoos, villes), 1 Accueil, 1 Nourriture, 1 Camion, 24 cases de 3 couleurs. Layout à définir (même zone que la grille zoo ou zone dédiée).
|
||||
- **Transitions douces** : rendu des couleurs et températures avec interpolation (phase 1) visible sur les deux cartes.
|
||||
- **Actions** : achat sur case vide (recherche, billeterie, boutique, nurserie, nourriture, accueil, camion, changement de milieu couleur, changement de milieu température) ; déplacement sur case vide (bébé mature, animal prêt). Messages d’erreur et feedback clairs.
|
||||
- **Accessibilité** : ARIA, clavier, contraste (règles projet).
|
||||
|
||||
**Fichiers impactés** : `web/js/state.js`, `web/js/ui.js`, `web/js/world-map.js`, `web/css/main.css`.
|
||||
|
||||
**Dépendances** : Toutes les phases précédentes.
|
||||
|
||||
---
|
||||
|
||||
## 13. Migration et compatibilité
|
||||
|
||||
**Objectif** : Anciennes sauvegardes (modèle œufs/école actuel) restent jouables ou migration propre.
|
||||
|
||||
**Livrables** :
|
||||
- **Détection de version** : `game_state.version` ou `game_state.specVersion` pour distinguer « ancien » (œufs, école, 5 niveaux) et « nouveau » (bébés, recherche, 7 niveaux, etc.).
|
||||
- **Migration** : script ou logique au chargement : si ancienne version, soit conversion (œufs → bébés en nurserie, école → centre de recherche niveau 1, etc.), soit message « sauvegarde incompatible, recommencer ».
|
||||
- **API et BDD** : extension de `game_state` (JSONB) pour tous les nouveaux champs ; pas de perte de données existantes si migration choisie.
|
||||
|
||||
**Fichiers impactés** : `web/js/state.js` (loadState, defaultState), `server/routes/zoos.js`, éventuellement script de migration côté serveur.
|
||||
|
||||
**Dépendances** : Toutes les phases 0–12.
|
||||
|
||||
---
|
||||
|
||||
## Synthèse des dépendances
|
||||
|
||||
```
|
||||
0 (modèle) ─┬─ 1 (couleurs/temp) ─┬─ 2 (multi-cases)
|
||||
│ └─ 5 (nourriture/morts)
|
||||
├─ 3 (bâtiments)
|
||||
└─ 4 (bébés/flux)
|
||||
│
|
||||
├─ 5 (nourriture/morts) ─ 7 (score repro)
|
||||
├─ 6 (reproduction) ──── 7
|
||||
├─ 8 (attractivité/visiteurs)
|
||||
├─ 9 (carte monde recherche/compteurs)
|
||||
└─ 10 (ventes/enchères) ─ 11 (villes)
|
||||
│
|
||||
└─ 12 (UI / grilles lancement) ─ 13 (migration)
|
||||
```
|
||||
|
||||
**Ordre recommandé d’implémentation** : 0 → 1 → 3 → 4 → 2 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 12 → 13.
|
||||
|
||||
---
|
||||
|
||||
## Checklist exhaustive (référence 174-324)
|
||||
|
||||
- [ ] Cases : couleur (milieu) + température ; transitions douces
|
||||
- [ ] Animaux multi-cases
|
||||
- [ ] Centre de recherche : 7 niv., unités de recherche, 10 zoos/unité, déblocage niveaux animaux/bébés
|
||||
- [ ] Billeterie : 7 niv., 20 visiteurs/unité, entrée/sortie visiteurs
|
||||
- [ ] Boutique : 7 niv., 5 visiteurs simultanés/unité
|
||||
- [ ] Nurserie : 7 niv., 1 bébé/unité, bébé mature → case ou camion
|
||||
- [ ] Nourriture : 7 niv., consommation/animal, mort si pas nourri, 5 animaux/unité, reproduction
|
||||
- [ ] Accueil nouveaux animaux : 7 niv., 1 animal/unité, animal prêt → case ou camion
|
||||
- [ ] Camion : 7 niv., bébé/animal sur camion → vente carte monde, 1 camion/unité
|
||||
- [ ] Changement de milieu (couleur) : 7 niv., payant
|
||||
- [ ] Changement de milieu (température) : 7 niv., payant
|
||||
- [ ] Bébés animaux (plus d’œufs) ; zoos vendent bébés et animaux adultes
|
||||
- [ ] Morts : 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
|
||||
- [ ] Reproduction : délai, proximité même type autre zoo, score repro, température/milieu adéquats ; score repro/survie par milieu ; température idéale
|
||||
- [ ] Score de reproduction du zoo : naissances, taux alimentation, score vendu sur l’animal
|
||||
- [ ] Attractivité : valeur cumulée, nombre d’animaux différents, rareté, taux remplissage ; pénalités morts ; bonus naissances
|
||||
- [ ] Visiteurs : entrée billeterie, max 1 journée, plus longtemps avec boutiques et diversité animaux, déplacement attiré
|
||||
- [ ] Carte du monde : agrandissement en unités de recherche ; compteurs bébés, animaux, labos, zoos, villes ; cases zoo (nom, attractivité, reproduction, vente) ; villes (nom, max visiteurs vers zoos)
|
||||
- [ ] Ventes : cases de vente sous les zoos ; enchères joueurs/bots ; vendeur valide ou non ; bébé invendu meurt
|
||||
- [ ] Grille zoo au lancement : 1 agrandissement, 1 recherche, 1 billeterie, 1 nurserie, 1 accueil, 1 nourriture, 1 camion, 24 cases 3 couleurs
|
||||
- [ ] Grille monde au lancement : 1 agrandissement carte (recherche), compteurs, 1 accueil, 1 nourriture, 1 camion, 24 cases 3 couleurs
|
||||
- [ ] Migration anciennes sauvegardes / compatibilité
|
||||
192
docs/plan-implementation-specs-animaux-billeterie.md
Normal file
192
docs/plan-implementation-specs-animaux-billeterie.md
Normal file
@@ -0,0 +1,192 @@
|
||||
# Plan d'implémentation – Specs Animaux, Morts, Saisons, Billeterie
|
||||
|
||||
Références : `docs/plan-action-cahier-des-charges.md` (§7 Animaux/morts/saisons, §8 Billeterie), `docs/features/causes-mort-audit.md`, et tous les fichiers de `docs/specs/` concernés.
|
||||
|
||||
---
|
||||
|
||||
## Spécifications couvertes
|
||||
|
||||
| Spec | Périmètre implémenté |
|
||||
|------|----------------------|
|
||||
| **animal_generique.md** | États faim/température/santé ; feedbacks visuels (froid=bleu/givre, chaud=rouge/vapeur, faim=icône, heureux=cœurs) ; pas de jauges. |
|
||||
| **mort_bebe.md** | Causes déjà en place ; conséquence mort adulte vente échouée (aligné). |
|
||||
| **inventaire_saisons.md** | Cycle 4 saisons ; modificateurs météo/température/reproduction/survie/visiteurs. |
|
||||
| **temperature.md** | Modificateur saison (+0 Printemps, +10 Été, -2 Automne, -15 Hiver) ; modificateur jour/nuit (+5 jour, -5 nuit) ; feedback critique (spec déjà partiellement en place via tolerance). |
|
||||
| **reproduction.md** | Impact saisons : Printemps +20% chance, Hiver -50% (sauf animaux froids). |
|
||||
| **billeterie.md** | Flux entrée/sortie ; capacité 20/unité ; ouverture 08h–20h ; 1 visiteur/s max entrée ; modificateurs saison (été +20% prix, hiver -10%). |
|
||||
| **visiteur.md** | Arrivée par billeterie ; durée max (1 journée / stayDuration) ; départ par billeterie ; affluence selon heure (08h–10h faible, 10h–16h fort, >18h nul) ; multiplicateur saison (été x1.5, hiver x0.6, etc.). |
|
||||
| **inventaire_heures.md** | Cycle jour/nuit (déjà timeOfDay) ; billeterie fermée la nuit. |
|
||||
| **centre_recherche.md** | Niveau recherche (skill level) : si rareté animal > niveau recherche → mort (cause « niveau de recherche trop inférieur »). |
|
||||
| **causes-mort-audit.md** | Seuls (animal seul meurt) ; recherche trop basse ; vente adulte échouée (deathCountRecent). |
|
||||
|
||||
---
|
||||
|
||||
## Phase 1 – Causes de mort manquantes
|
||||
|
||||
**Objectif :** Compléter les causes de mort listées dans `docs/features/causes-mort-audit.md` (Non implémenté).
|
||||
|
||||
### 1.1 Vente adulte échouée
|
||||
|
||||
- **Fichier :** `web/js/trade.js`
|
||||
- **Changement :** Dans `tickSaleListings`, lorsque `nowUnix >= listing.endAt` et `listing.isBaby === false`, incrémenter `state.deathCountRecent` (comme pour les bébés).
|
||||
- **Spec :** causes-mort-audit §9.
|
||||
|
||||
### 1.2 Niveau de recherche trop inférieur
|
||||
|
||||
- **Fichier :** `web/js/food.js` (ou module commun appelé par `checkDeathCauses`)
|
||||
- **Logique :** Pour chaque bloc animal sur la grille, récupérer `LootTables.Animals[cell.id].rarityLevel` et le comparer à `getSkillLevel(state)` (depuis `conveyor.js`). Si `rarityLevel > getSkillLevel(state)`, retirer le bloc et incrémenter `deathCountRecent`.
|
||||
- **Config optionnelle :** `GameConfig.Research?.MaxRarityAllowed` ou utiliser directement skill level (1–8) vs rarityLevel (1–5) ; si le projet utilise skill level comme “niveau école” et que la spec centre_recherche parle de “rareté visible”, interpréter : animal de rareté > niveau compétence → mort.
|
||||
- **Fichiers :** `web/js/food.js`, `web/js/config.js` (si config ajoutée), `docs/features/causes-mort-audit.md` (mise à jour).
|
||||
|
||||
### 1.3 Animal seul (solitude)
|
||||
|
||||
- **Spec :** animal_generique “Besoin de congénères (reproduction) ou de solitude (selon espèce)” ; causes-mort-audit §1 “Seuls”.
|
||||
- **Interprétation :** Au moins une règle “animal seul meurt” : si aucun autre animal de la même espèce (même `cell.id`) dans un rayon de N cases (ex. 5), après un délai configurable, retirer l’animal et incrémenter `deathCountRecent`.
|
||||
- **Fichiers :** `web/js/config.js` (`Animal.MinSameSpeciesInRadius`, `Animal.MaxSecondsAlone`), `web/js/food.js` dans `checkDeathCauses` (ou helper) : pour chaque origine animal, compter les autres blocs même `id` dans le rayon ; si 0 et `nowUnix - placedAt > MaxSecondsAlone`, retirer.
|
||||
- **État :** Optionnel si “selon espèce” complique (toutes espèces = besoin congénères par défaut).
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 – Config et données saisons
|
||||
|
||||
**Objectif :** Introduire le cycle de saisons et la config sans encore brancher tous les impacts.
|
||||
|
||||
### 2.1 Config saisons
|
||||
|
||||
- **Fichier :** `web/js/config.js`
|
||||
- **Ajout :** `Season: { DayLengthSeconds: 120, DaysPerSeason: 7 }` (ou 30 jours in-game). `Season.TemperatureModifier: { spring: 0, summer: 10, autumn: -2, winter: -15 }`. `Season.VisitorMultiplier: { spring: 1, summer: 1.5, autumn: 0.8, winter: 0.6 }`. `Season.ReproductionBonus: { spring: 0.2, summer: 0, autumn: 0, winter: -0.5 }` (Hiver -50% sauf animaux froids à traiter dans reproduction).
|
||||
- **Référence :** `docs/specs/inventaire_saisons.md`, `temperature.md`, `visiteur.md`, `reproduction.md`.
|
||||
|
||||
### 2.2 State et temps de jeu “jour”
|
||||
|
||||
- **Fichier :** `web/js/types.js`
|
||||
- **Ajout :** `gameDay?: number` (jour de jeu absolu, dérivé de `timeOfDay` et `DayLengthSeconds`) ou `season?: 'spring'|'summer'|'autumn'|'winter'`, `seasonDay?: number` (jour dans la saison).
|
||||
- **Fichier :** `web/js/time-weather.js` ou nouveau `web/js/seasons.js`
|
||||
- **Logique :** À partir de `state.timeOfDay` et `GameConfig.Time.DayLengthSeconds`, calculer un “game day” (entier). À partir de `gameDay` et `DaysPerSeason`, calculer `season` et `seasonDay`. Exporter `getCurrentSeason(state)`, `getSeasonTemperatureModifier(season)`, `getSeasonVisitorMultiplier(season)`, `getSeasonReproductionBonus(season)`.
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 – Cycle saisons et impacts
|
||||
|
||||
**Objectif :** Brancher la saison sur température, reproduction, visiteurs, billeterie.
|
||||
|
||||
### 3.1 Température affichée / calculée avec saison
|
||||
|
||||
- **Fichiers :** `web/js/placement.js` ou module température existant (ex. `getDisplayTemperature` dans food.js / grid-utils)
|
||||
- **Changement :** `currentTemp = baseBiomeTemp + seasonMod + dayNightMod + caseRegulatorOffset`. Récupérer `seasonMod` depuis `getSeasonTemperatureModifier(getCurrentSeason(state))`.
|
||||
- **Spec :** `temperature.md` (Impact Saisons, Impact Heure / Jour-Nuit).
|
||||
|
||||
### 3.2 Reproduction et saison
|
||||
|
||||
- **Fichier :** `web/js/reproduction.js`
|
||||
- **Changement :** Intégrer un bonus/malus de saison (Printemps +20%, Hiver -50% sauf animaux “froids” selon biome) dans le calcul de chance de reproduction.
|
||||
- **Spec :** `reproduction.md`, `inventaire_saisons.md`.
|
||||
|
||||
### 3.3 Visiteurs et saison
|
||||
|
||||
- **Fichier :** `web/js/income.js`
|
||||
- **Changement :** Dans `getVisitorDemand`, multiplier par `getSeasonVisitorMultiplier(getCurrentSeason(state))`.
|
||||
- **Spec :** `visiteur.md` (Impact Saisons).
|
||||
|
||||
### 3.4 Billeterie – modificateur prix ticket par saison
|
||||
|
||||
- **Fichier :** `web/js/income.js` (ou economy)
|
||||
- **Changement :** Prix ticket base ; si saison été : *1.2 ; si saison hiver : *0.9. Appliquer dans le calcul de `paymentPerVisitor` (entrée).
|
||||
- **Spec :** `billeterie.md` (Impact Saisons).
|
||||
|
||||
### 3.5 Notification changement de saison
|
||||
|
||||
- **Fichier :** `web/js/ui.js` ou game-loop
|
||||
- **Changement :** Lors d’un changement de saison (comparer `getCurrentSeason(state)` à une valeur stockée), afficher un message type “C’est le [Saison] !” (toast ou texte temporaire). Stocker `lastSeason` dans le state si nécessaire.
|
||||
- **Spec :** `inventaire_saisons.md` (Messages SEASON_CHANGE).
|
||||
|
||||
---
|
||||
|
||||
## Phase 4 – Flux billeterie complet
|
||||
|
||||
**Objectif :** Heures d’ouverture, départs explicites, limite 1 visiteur/s à l’entrée.
|
||||
|
||||
### 4.1 Heures d’ouverture (08h–20h)
|
||||
|
||||
- **Fichier :** `web/js/config.js`
|
||||
- **Ajout :** `Billeterie.OpenHour: 8`, `Billeterie.CloseHour: 20` (ou 20h = fermeture, pas d’entrée après).
|
||||
- **Fichier :** `web/js/income.js`
|
||||
- **Changement :** Dans `tickVisitorArrivals`, ne pas ajouter de nouveaux visiteurs si `timeOfDay` est en dehors de [8, 20] (ou équivalent en phase “night”). Utiliser `getTimePhase(state.timeOfDay)` ; si phase “night” ou `timeOfDay < 8` ou `timeOfDay >= 20`, ne pas pousser de nouveaux `{ arrivedAt }`.
|
||||
- **Spec :** `billeterie.md`, `inventaire_heures.md`.
|
||||
|
||||
### 4.2 Départs par billeterie (durée max “1 journée”)
|
||||
|
||||
- **Déjà en place :** `getStayDurationSeconds` et filtre `nowUnix < v.arrivedAt + stayDuration`. S’assurer que la durée est bien “1 journée” (DayLengthSeconds × facteur) selon spec. Optionnel : faire partir les visiteurs vers la “sortie” (billeterie) visuellement.
|
||||
- **Spec :** `visiteur.md` (Durée max, Départ).
|
||||
|
||||
### 4.3 Limite 1 visiteur / seconde à l’entrée
|
||||
|
||||
- **Fichier :** `web/js/income.js`
|
||||
- **Changement :** Dans `tickVisitorArrivals`, au lieu d’ajouter `target - current` d’un coup, limiter le nombre d’entrées sur ce tick à au plus `ceil(dt)` ou 1 par tick si tick = 1s, ou stocker `lastVisitorSpawnAt` et n’ajouter qu’un visiteur par seconde réelle. Adapter selon `IncomeTickMs` (ex. si tick 5s, ajouter au plus 5 nouveaux visiteurs par tick, ou 1 par seconde en interpolant).
|
||||
- **Spec :** `billeterie.md` (“1 visiteur / seconde max”).
|
||||
|
||||
### 4.4 Affluence selon l’heure (optionnel)
|
||||
|
||||
- **Fichier :** `web/js/income.js`
|
||||
- **Changement :** Dans `getVisitorDemand`, appliquer un coefficient selon `timeOfDay` : 08h–10h faible, 10h–16h fort, 16h–18h décroissant, >18h nul (ou très faible). Utiliser `state.timeOfDay` et `getTimePhase`.
|
||||
- **Spec :** `visiteur.md` (Impact Heure / Jour-Nuit).
|
||||
|
||||
---
|
||||
|
||||
## Phase 5 – Feedbacks visuels animaux
|
||||
|
||||
**Objectif :** Pas de jauges ; états visuels dérivés des données existantes (température, nourriture, visite, reproduction).
|
||||
|
||||
### 5.1 Détection des états par cellule animal
|
||||
|
||||
- **Fichier :** nouveau `web/js/animal-visual-state.js` ou dans `web/js/ui.js` / module rendu
|
||||
- **Logique :** Pour une cellule animal (origine) : `getDisplayTemperature`, `lastFedAt`, `lastVisitedAt`, état reproduction (paire proche). Exporter `getAnimalVisualState(cell, state, grid)` → `{ cold: boolean, hot: boolean, hungry: boolean, sick: boolean, happy: boolean }` (sick si proche mort / mal nourri ; happy si récemment visité et nourri et temp ok, ou en reproduction).
|
||||
- **Spec :** `animal_generique.md`, `temperature.md` (Feedback critique).
|
||||
|
||||
### 5.2 Rendu CSS / classes
|
||||
|
||||
- **Fichier :** `web/js/ui.js` (rendu grille)
|
||||
- **Changement :** Pour chaque bloc animal rendu, ajouter des classes CSS selon `getAnimalVisualState` : ex. `animal-cold`, `animal-hot`, `animal-hungry`, `animal-sick`, `animal-happy`. Pas de jauges.
|
||||
- **Fichier :** `web/css/main.css`
|
||||
- **Changement :** Styles pour ces classes : teinte bleutée/givre (froid), rougeâtre/vapeur (chaud), icône faim (lent/maigre), ternes/mouches (malade), cœurs/couleurs vives (heureux). Utiliser filter, box-shadow ou pseudo-éléments pour icônes.
|
||||
- **Spec :** `animal_generique.md` (Vie Quotidienne), `temperature.md` (Feedback critique).
|
||||
|
||||
---
|
||||
|
||||
## Phase 6 – Documentation et clôture
|
||||
|
||||
- Mettre à jour `docs/features/causes-mort-audit.md` (causes implémentées : seuls, recherche, vente adulte).
|
||||
- Créer ou mettre à jour `docs/features/saisons-phase.md` (cycle, config, impacts).
|
||||
- Créer ou mettre à jour `docs/features/billeterie-flux.md` (heures, 1/s, départs).
|
||||
- Créer `docs/features/feedbacks-visuels-animaux.md` (états, classes CSS, pas de jauges).
|
||||
- Vérifier lint, types, compilation.
|
||||
|
||||
---
|
||||
|
||||
## Ordre d’exécution recommandé
|
||||
|
||||
1. **Phase 1** – Causes de mort (trade.js adulte, food.js recherche, optionnel solitude).
|
||||
2. **Phase 2** – Config et module saisons (config.js, seasons.js, types.js).
|
||||
3. **Phase 3** – Impacts saisons (température, reproduction, visiteurs, billeterie, notification).
|
||||
4. **Phase 4** – Flux billeterie (heures, 1/s, affluence heure).
|
||||
5. **Phase 5** – Feedbacks visuels animaux (animal-visual-state.js, ui.js, main.css).
|
||||
6. **Phase 6** – Documentation.
|
||||
|
||||
---
|
||||
|
||||
## Fichiers principaux impactés
|
||||
|
||||
| Fichier | Phases |
|
||||
|---------|--------|
|
||||
| `web/js/trade.js` | 1.1 |
|
||||
| `web/js/food.js` | 1.2, 1.3 |
|
||||
| `web/js/config.js` | 1.2, 1.3, 2.1, 4.1 |
|
||||
| `web/js/types.js` | 2.2 |
|
||||
| `web/js/time-weather.js` ou `web/js/seasons.js` | 2.2, 3.1 |
|
||||
| `web/js/placement.js` ou module température | 3.1 |
|
||||
| `web/js/reproduction.js` | 3.2 |
|
||||
| `web/js/income.js` | 3.3, 3.4, 4.1, 4.3, 4.4 |
|
||||
| `web/js/ui.js` | 3.5, 5.2 |
|
||||
| `web/js/animal-visual-state.js` (nouveau) | 5.1 |
|
||||
| `web/css/main.css` | 5.2 |
|
||||
| `docs/features/*.md` | 6 |
|
||||
@@ -1,131 +0,0 @@
|
||||
# Vérification des phases 0 à 9 avant phase 10
|
||||
|
||||
**Référence :** `docs/plan-implementation-rappel-grandes-regles.md`.
|
||||
**Objectif :** S’assurer que tout le nécessaire pour la phase 10 (Ventes et enchères) est en place.
|
||||
|
||||
---
|
||||
|
||||
## Phase 0 – Modèle de données et configuration
|
||||
|
||||
| Livrable | Statut | Note |
|
||||
|----------|--------|------|
|
||||
| Cases couleur + température | Fait | biome-rules, grid, config |
|
||||
| Animaux multi-cases (shape, stockage) | Fait | cellsWide/cellsHigh dans types, placement, loot-tables |
|
||||
| Types de bâtiments 7 niveaux | Fait | research, billeterie, souvenirShop, nursery, food, reception, truck, biomeChangeColor, biomeChangeTemp dans config |
|
||||
| Entités déplaçables (bébé, animal) | Partiel | pendingBabies, receptionAnimals, saleListings en place ; conveyor et labo utilisent encore des œufs (eggType) |
|
||||
| Config (niveaux max, coûts, capacités) | Fait | GameConfig étendu |
|
||||
|
||||
**Blocant phase 10 :** Non. saleListings, pendingBabies, receptionAnimals sont en place.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1 – Cartes : couleurs et températures
|
||||
|
||||
| Livrable | Statut |
|
||||
|----------|--------|
|
||||
| Biomes / température par case | Fait (biome-rules.js, getDisplayBiome, getDisplayTemperature) |
|
||||
| Transitions douces (interpolation) | Fait |
|
||||
| Rendu grille | Fait |
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 – Animaux multi-cases
|
||||
|
||||
| Livrable | Statut |
|
||||
|----------|--------|
|
||||
| cellsWide / cellsHigh (loot-tables, placement) | Fait |
|
||||
| Stockage et mouvement du bloc | Fait (placement, zoo, hatching) |
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 – Bâtiments zoo (types et niveaux)
|
||||
|
||||
| Livrable | Statut |
|
||||
|----------|--------|
|
||||
| Research, Billeterie, Boutique, Nurserie, Food, Reception, Truck, BiomeColor, BiomeTemp | Fait (config 7 niv., build/upgrade dans zoo, placement, ui) |
|
||||
|
||||
---
|
||||
|
||||
## Phase 4 – Bébés et flux nurserie / accueil
|
||||
|
||||
| Livrable | Statut | Note |
|
||||
|----------|--------|------|
|
||||
| Bébés (nurserie → mature) | Fait | pendingBabies, readyAt, placeMatureBabyOnCell |
|
||||
| Accueil (reception → animal prêt) | Fait | receptionAnimals, placeReceptionAnimalOnCell |
|
||||
| Achat / déplacement (bébé mature, animal prêt) | Fait | zoo, placement, ui |
|
||||
| Suppression complète du modèle « œuf » | Partiel | Conveyor et labo exposent encore des œufs ; bébés/animaux en parallèle |
|
||||
|
||||
**Blocant phase 10 :** Non. Flux bébé/animal et saleListings (nursery full) existent.
|
||||
|
||||
---
|
||||
|
||||
## Phase 5 – Nourriture, consommation et morts
|
||||
|
||||
| Livrable | Statut | Note |
|
||||
|----------|--------|------|
|
||||
| Nourriture (capacité, répartition, lastFedAt) | Fait | food.js, getFoodCapacity, tickFeeding |
|
||||
| Mort si pas nourri | Fait | checkDeathCauses, MaxSecondsWithoutFood |
|
||||
| Pas visité | Fait | MaxSecondsWithoutVisit |
|
||||
| Température / milieu en écart | Fait | maybeDeathBlock (temp + biome) |
|
||||
| Bébé mature non placé à temps | Fait | filterPendingBabies, MaxSecondsMatureNotPlaced |
|
||||
| Animal accueil prêt non placé à temps | Fait | filterReceptionAnimals, MaxSecondsReadyNotPlaced |
|
||||
| Autres causes (seul, tué autre zoo, recherche trop basse, bébé non vendu, vente échouée) | Non fait | Optionnel pour phase 10 ; « bébé invendu meurt » = phase 10 |
|
||||
|
||||
**Blocant phase 10 :** Non.
|
||||
|
||||
---
|
||||
|
||||
## Phase 6 – Reproduction
|
||||
|
||||
| Livrable | Statut |
|
||||
|----------|--------|
|
||||
| Paires même type + autre zoo, adjacentes | Fait (findReproductionPairs, blocksAreAdjacent) |
|
||||
| Délai (score repro, biome, température) | Fait (tickReproduction, timers, dueAt) |
|
||||
| Bébé → nurserie ou vente (saleListings) | Fait (addPendingBaby, NoFreeNursery → saleListings) |
|
||||
|
||||
---
|
||||
|
||||
## Phase 7 – Score de reproduction du zoo
|
||||
|
||||
| Livrable | Statut |
|
||||
|----------|--------|
|
||||
| getReproductionScore (birthCount, feedingRate) | Fait |
|
||||
| Affichage carte monde (score repro) | Fait (world-map-zoo-reproduction-score) |
|
||||
| reproductionScoreAtSale sur vente | Fait (reproduction.js lors du push saleListings) |
|
||||
|
||||
---
|
||||
|
||||
## Phase 8 – Attractivité et visiteurs
|
||||
|
||||
| Livrable | Statut |
|
||||
|----------|--------|
|
||||
| Billeterie = seule entrée, cap 20/unité | Fait (getBilleterieCapacity, tickVisitorArrivals) |
|
||||
| Durée max 1 journée par visiteur | Fait (visitorArrivals, arrivedAt, getStayDurationSeconds) |
|
||||
| Prolongation boutiques / diversité | Fait (getStayMultiplier, StayMultiplierPerShopLevel, StayMultiplierPerSpecies) |
|
||||
| Score attractivité (valeur, espèces, rareté, remplissage, pénalités, bonus) | Fait (getAttractivityScore) |
|
||||
| Affichage carte monde (score attractivité) | Fait (world-map-zoo-attractivity-score) |
|
||||
|
||||
---
|
||||
|
||||
## Phase 9 – Carte du monde : recherche et compteurs
|
||||
|
||||
| Livrable | Statut |
|
||||
|----------|--------|
|
||||
| Agrandissement carte en unités de recherche | Fait (getWorldMapUpgradeResearchCost, tryUpgradeWorldMap) |
|
||||
| Compteurs (bébés à vendre, animaux à vendre, labos, zoos, villes) | Fait (worldMapCounters dans ui.js) |
|
||||
| Case zoo : nom, score attractivité, score reproduction | Fait (world-map-zoo-name, -reproduction-score, -attractivity-score) |
|
||||
| Case de vente sous le zoo | Partiel | Un slot « world-map-zoo-slot » existe ; il affiche conveyor offers (œufs / bébé/animal) ; phase 10 doit y afficher saleListings + enchères |
|
||||
|
||||
**Blocant phase 10 :** Non. Le slot existe ; phase 10 ajoute l’affichage des ventes (saleListings) et les enchères.
|
||||
|
||||
---
|
||||
|
||||
## Synthèse pour la phase 10
|
||||
|
||||
- **Prérequis phase 10 (4, 6, 7, 9) :** Tous satisfaits au niveau nécessaire.
|
||||
- **Manques non bloquants :**
|
||||
- Phase 0/4 : modèle œuf encore présent (conveyor, labo) ; phase 10 peut s’appuyer sur saleListings et bébés/animaux tels qu’ils sont.
|
||||
- Phase 5 : certaines causes de mort (seul, autre zoo, recherche trop basse, bébé non vendu) non implémentées ; « bébé invendu meurt » sera ajouté en phase 10.
|
||||
- Phase 9 : case de vente = slot actuel ; phase 10 y branchera les saleListings et l’UI d’enchères.
|
||||
|
||||
**Conclusion :** On peut démarrer la phase 10 (Ventes et enchères). Les écarts listés ci-dessus pourront être traités en parallèle ou dans les phases suivantes.
|
||||
Reference in New Issue
Block a user