# 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.