# Phase 6 – Reproduction

**Objectif :** Deux animaux de même type, dont au moins un provient d’un autre zoo, en proximité produisent un bébé après un délai. Le délai est réduit par le score de reproduction du zoo et l’adéquation température/milieu.

**Référence :** `docs/plan-implementation-rappel-grandes-regles.md` phase 6.

## Impacts

- Nouveau module `web/js/reproduction.js` (détection de paires, timers, naissances).
- État : `reproductionTimers`, `fromOtherZoo` sur animaux et bébés.
- Bébés créés par reproduction vont en nurserie si place libre, sinon en `saleListings` (vente phase 10).

## Modifications

- **types.js** : `AnimalCell.fromOtherZoo?`, `PendingBaby.fromOtherZoo?`, `GameState.reproductionTimers?`.
- **config.js** : `Reproduction.BaseSeconds`, `Reproduction.MaxDistance`.
- **state.js** : `defaultState.reproductionTimers`, migration `loadState` pour `reproductionTimers`.
- **zoo.js** : `addPendingBaby(state, animalId, fromOtherZoo?)`, `placeMatureBabyOnCell` / `placeReceptionAnimalOnCell` renseignent `fromOtherZoo` sur l’animal placé ; `tryBuyBaby` appelle `addPendingBaby(..., true)`.
- **reproduction.js** : `getReproductionScore`, `getBiomeReproductionFactor`, `getTemperatureFactor`, `findReproductionPairs`, `tickReproduction` ; appel depuis la game loop après `checkDeathCauses`.

## Modalités de déploiement

- Aucun déploiement serveur. Rechargement client suffit.

## Modalités d’analyse

- Vérifier en jeu : placer deux animaux de même type (dont un acheté en accueil/conveyor) sur deux cases adjacentes ; après le délai (réduit par score/biome/temp), un bébé apparaît en nurserie ou en vente.
- `state.reproductionTimers` doit contenir les paires en attente avec `dueAt` ; après échéance, entrée retirée et `birthCount` incrémenté.
