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