# Audit des causes de mort (§12)

**Référence :** Cahier des charges §12 (Mort).

## Liste du cahier

1. Seuls  
2. Pas visités  
3. Manque de nourriture  
4. Tué par un autre animal d'un autre zoo  
5. Niveau de recherche trop inférieur par rapport au niveau de l'animal  
6. Bébé non vendu dans les délais  
7. Bébé de nurserie prêt non placé dans les délais  
8. Animal d'accueil prêt non placé sur la carte après un délai  
9. Animal non placé sur la carte dans les délais (vente échouée)  
10. Température trop en écart avec la température de l'animal  
11. Milieu (couleur) trop en écart avec la température de l'animal  

## Implémenté

- **Pas visités** : `Visitor.MaxSecondsWithoutVisit`, `checkDeathCauses` → `maybeDeathBlock` (visitedOk), `food.js` + `animal-visits.js`.
- **Manque de nourriture** : `Food.MaxSecondsWithoutFood`, `maybeDeathBlock` (fedOk), `tickFeeding` / `checkDeathCauses`.
- **Température en écart** : `maybeDeathBlock` (tempOk), `getDisplayTemperature`, `idealTemperature` / `temperatureTolerance` (loot-tables).
- **Milieu (couleur) en écart** : `maybeDeathBlock` (biomeOk), `isAnimalAllowedOnBiome`, `getDisplayBiome`.
- **Bébé nurserie prêt non placé** : `Nursery.MaxSecondsMatureNotPlaced`, `filterPendingBabies` dans `checkDeathCauses`.
- **Animal accueil prêt non placé** : `Reception.MaxSecondsReadyNotPlaced`, `filterReceptionAnimals` dans `checkDeathCauses`.
- **Bébé non vendu dans les délais** : `Sale.ListingDurationSeconds`, `tickSaleListings` (trade.js) ; annonce expirée et `isBaby` → `deathCountRecent` incrémenté. Côté serveur : `expireSaleListings` (db.js).

## Non implémenté

- **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.~~ **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`, `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`.
