# Incidents visiteurs (§4.2)

**Objectif :** Visiteurs peuvent rencontrer des incidents (soif, poubelle pleine, banc requis, animal trop loin, envie de photo). Apparition plus fréquente en phase d’attente. Bulle au-dessus du visiteur ; clic = résolution (bonus pièces + attractivité) ; non résolu = timeout puis départ du visiteur et pénalité d’attractivité.

**Référence :** Cahier des charges §2 (Visiteurs et Incidents).

## Impacts

- **State :** `VisitorEntry` étendu avec `incidentType?` ("thirst"|"bin"|"bench"|"animalFar"|"photo"), `incidentSince?`. `attractivityBonusFromIncidents?` (cumul résolus − non résolus).
- **Phase d’attente :** camion en cours (`eggPurchaseTruck`, `truckSale`) ou vente en attente de validation (`asBuyerUndelivered` avec `validated_at` dans le futur).
- **Résolution :** clic sur la bulle → suppression de l’incident, ajout de pièces et bonus d’attractivité.
- **Timeout :** après `IncidentTimeoutSeconds` sans résolution, le visiteur est retiré et une pénalité d’attractivité est appliquée.

## Modifications

- **types.js** : `VisitorEntry` avec `incidentType?`, `incidentSince?` ; `GameState.attractivityBonusFromIncidents?`.
- **config.js** : `Visitor.IncidentChanceBase`, `IncidentChanceWaitMultiplier`, `IncidentTimeoutSeconds`, `IncidentResolveAttractivityBonus`, `IncidentResolveCoinBonus`, `IncidentUnresolvedAttractivityPenalty`.
- **visitor-incidents.js** (nouveau) : `isInWaitPhase(state)`, `tickVisitorIncidents(state, nowUnix)`, `resolveIncident(state, visitorIndex)`, `INCIDENT_TYPES`, `INCIDENT_EMOJI`.
- **game-loop.js** : appel à `tickVisitorIncidents` après `tickVisitorArrivals`.
- **income.js** : `getAttractivityScore` inclut `state.attractivityBonusFromIncidents`.
- **state.js** : au chargement, défaut `attractivityBonusFromIncidents = 0`.
- **main.js** : boucle visiteurs basée sur `state.visitorArrivals.length` ; pour chaque visiteur avec incident, affichage d’une bulle (emoji + tooltip) ; clic appelle `resolveIncident` puis `fullRender`.
- **texts-fr.js** : `incidentLabel` (soif, poubelle pleine, etc.), `incidentBubbleAria`.
- **main.css** : `.visitor-incident-bubble` (position au-dessus du sprite, cliquable).

## Modalités de déploiement

- Client uniquement. Rechargement suffit.

## Modalités d’analyse

- Avoir des visiteurs (billeterie) et attendre ou déclencher une phase d’attente (achat œuf, vente en cours) : des bulles d’incident apparaissent au-dessus de certains visiteurs.
- Clic sur une bulle : incident disparaît, pièces et attractivité augmentent.
- Ne pas cliquer : après le délai configuré, le visiteur disparaît et l’attractivité baisse.
