🚴 Cycliste by Bounito
Guide autonome · édition 7 octobre 2026

Le manuel complet de
Cycliste by Bounito 🚴‍♂️

Comprendre la simulation, gérer l’effort, les rapports, la fatigue, l’hydratation et les équipiers, créer une route ou importer un parcours BRouter, exploiter l’aspiration et lire les statuts de course.

✅ PC + mobile ✅ CSS & JS inclus ✅ Sans dépendance 🧪 IA & latéral en évolution
☰ Sommaire du guide
Démarrage · Principes · Tactique · Aspiration · Food · Terrain · CSV · Lexique · Historique

🚦 Démarrage rapide

Le principe est simple à prendre en main : tu contrôles ton coureur et peux aussi donner des ordres à tes équipiers. La difficulté vient de l’équilibre entre effort, cadence, fatigue, hydratation, terrain, vent et aspiration.

Choisir ou générer une course. Utilise 🎲 Générer route pour un terrain fictif, ou 🗺 Charger route pour un CSV BRouter réel.
Préparer les équipes. Avec 👥 Générer équipes, choisis ton équipe, les adversaires et les caractéristiques des coureurs.
Régler ton effort. Commence autour de 60–70 %. Au-dessus de 60 %, la fatigue commence à s’accumuler ; en dessous, tu récupères progressivement.
Surveiller les instruments. ❤️ cardio, ⚡ watts, ⏱ vitesse, 🥁 cadence, 💧 hydratation, 🔋 fatigue et 💨 aspiration donnent une lecture immédiate de la situation.
Jouer la tactique. Place-toi dans une roue, protège-toi avec un équipier, récupère avant une difficulté ou lance une attaque au bon moment.
🎯 Idée centrale : gagner n’est pas simplement « mettre 100 % ». Un effort très élevé augmente les watts à court terme, mais dégrade la fatigue et peut faire exploser ta performance plus tard.

🧠 Principes du jeu

⚡ Puissance

La puissance disponible dépend de la puissance maximale du coureur, de l’effort, de l’efficacité de pédalage, de la fatigue et de l’hydratation.

⛰ Terrain

La pente modifie fortement la force à fournir. Le poids du cycliste, du vélo et de l’eau transportée est pris en compte.

🌬 Air

Le vent et la traînée aérodynamique deviennent essentiels à vitesse élevée. L’aspiration réduit la surface aérodynamique effective.

🔋 Endurance

La fatigue augmente au-dessus d’un effort soutenu et redescend en levant le pied. Chaque coureur possède sa propre résistance à la fatigue.

👥 Peloton

L’IA cherche à rester dans les groupes, à recoller aux groupes proches et peut ralentir si un groupe plus important revient derrière.

♟ Tactique

Les adversaires peuvent protéger un leader, attaquer, suivre une attaque, basculer en récupération ou maintenir une échappée.

Simulation ≠ modèle biomécanique scientifique. Le moteur cherche un compromis jouable : les lois physiques principales sont présentes, puis simplifiées pour produire des décisions tactiques lisibles.

🖥 Interface & vues

📈 Course & profil

Vue longitudinale du parcours, positions des coureurs et profil. Le zoom permet de passer d’une lecture globale (km) à une lecture très rapprochée (mètres).

🚁 Vue hélico

Vue du dessus pour lire le placement latéral, les dépassements, les sillages et la position des coureurs sur la largeur de la route.

📍 Mini-carte GPS

Disponible pour les parcours CSV avec coordonnées exploitables. Elle suit le coureur observé et peut afficher fond cartographique ou satellite si les services de tuiles sont accessibles.

📊 Classements & tables

Classement, équipe, caractéristiques des coureurs, puissance, état, énergie, hydratation et autres télémétries peuvent être dépliés.

👁 Coureur observé / coureur contrôlé : l’interface permet de suivre d’autres coureurs. Lorsqu’un coureur adverse est observé, le panneau de contrôle disparaît. Le contrôle direct d’un équipier existe dans la logique récente mais reste une zone en stabilisation ; voir status.

🚴 Statuts des coureurs

Les statuts décrivent l’intention tactique active d’un coureur IA. Ils influencent son effort cible et ses décisions.

⚙ PelotonComportement normal : suivre le rythme, recoller à un groupe proche, gérer la pente.
🛡️ ProtectLe coureur se place au service d’une cible, généralement devant elle pour lui offrir une roue et un abri.
⚡ AttaqueEffort très élevé pour créer un écart. Une attaque réussie peut évoluer en échappée.
💨 ÉchappéeLe coureur a fait le trou et maintient un effort soutenu mais inférieur à l’attaque initiale.
♻ RécupérationEffort réduit pour faire redescendre la fatigue. Une récupération forcée reste prioritaire tant que le niveau n’est pas suffisamment redescendu.
↗️ SuitRéaction à une offensive d’un équipier : le coureur cherche sa roue et adapte son effort à la distance.
Seuils actuels notables : une fatigue très élevée peut forcer la récupération ; une attaque devient une échappée quand le coureur a gagné environ 100 m par rapport à son écart de départ.

♟ Équipe & tactique

Chaque équipier de ton équipe peut recevoir une consigne. Les adversaires suivent leur propre IA, avec un leader choisi en fonction notamment de la puissance maximale et de la résistance à la fatigue.

🤖 Auto

L’équipier prend ses propres décisions : peloton, protection, attaque, suivi ou récupération.

🛡️ Protéger

Il cherche à se placer autour de la cible et à lui offrir un abri. Plusieurs protecteurs se répartissent en file.

⚡ Attaquer

Il déclenche une offensive, sauf s’il est trop fatigué ; il peut ensuite passer en échappée.

♻ Récupérer

Il réduit son effort pour retrouver des réserves. Utile avant une côte ou après un relais très coûteux.

Subtilités tactiques

  • Un coureur isolé devant peut réduire légèrement son effort lorsqu’un groupe plus important revient derrière.
  • Un petit trou vers le groupe devant provoque au contraire une hausse d’effort pour recoller.
  • Un équipier autonome peut décider de protéger le leader s’il est proche et assez frais.
  • Certains équipiers peuvent réagir à une attaque de leur propre équipe et tenter de prendre la roue.
  • Le placement latéral est influencé à la fois par le retour vers le centre, l’aspiration et l’évitement des autres coureurs.

⚙ Physique & subtilités de simulation

🧍 Masse réellement déplacée

La masse utilisée pour la résistance de route inclut le poids du coureur, l’eau encore dans la gourde et environ 9 kg pour le vélo/équipement. Une gourde pleine de 500 ml ajoute donc environ 0,5 kg.

📐 Pente

La pente est calculée à partir des altitudes autour du point courant. En montée, la composante gravitaire augmente fortement la puissance nécessaire.

🌬 Vent signé

Vent positif = vent de face ; vent négatif = vent favorable. Le calcul aérodynamique utilise la vitesse d’air relative.

↔ Placement latéral

Les bords de route peuvent augmenter la résistance au roulement. Ce module reste expérimental et très sensible au réglage de pénalité latérale.

❤️ Cardio

Le cardio suit progressivement une cible liée aux watts et à la pente. Il sert d’indicateur physiologique plutôt que de contrôle direct.

🌡 Température

La température évolue selon l’altitude et de petites variations locales. Le modèle applique environ −6 °C / 1000 m de gain d’altitude.

⚠ Paramètre latéral : l’interface parle de « pénalité (%) », mais la formule actuelle l’emploie comme facteur multiplicatif dans le coefficient de roulement. À considérer comme un réglage technique/expérimental, pas comme un pourcentage physique strict.

💨 Principe d’aspiration

L’aspiration dépend à la fois de la distance longitudinale et du décalage latéral. Le sillage est représenté comme un cône qui s’élargit derrière le cycliste de tête.

🚫 Trop près

À environ 1,8 m, le bonus retombe à zéro. Cela évite de considérer un chevauchement quasi physique comme une aspiration parfaite.

🎯 Zone idéale

Le maximum se situe autour de 2,5 m derrière le coureur précédent, si l’alignement latéral est bon.

🌫 Fin du sillage

L’effet décroît ensuite jusqu’à disparaître vers 12 m.

  • L’aspiration est inactive à faible vitesse : le coureur suiveur et la source doivent dépasser environ 20 km/h.
  • Le cône s’élargit approximativement de 0,25 m de demi-largeur près de la source à 1,35 m vers sa fin.
  • Un coureur plus grand procure légèrement plus d’abri à un coureur plus petit.
  • Plusieurs sillages peuvent contribuer, mais avec des gains décroissants : ils ne s’additionnent pas naïvement.
  • Le réglage Réduction d’air par aspiration vaut 15 % par défaut. C’est une réduction de traînée maximale appliquée au modèle aérodynamique, pas un bonus direct de 15 % à la vitesse.
Conseil : dans la vue 🚁, cherche une roue à 2–4 m et reste dans l’axe du cône. S’écarter latéralement permet de dépasser, mais fait perdre progressivement l’abri.

🍫 Food, fatigue & hydratation

La version actuelle ne simule pas un système nutritionnel complexe en calories/glucides : la nourriture agit directement sur la fatigue. L’eau, elle, agit sur le niveau d’hydratation.

🍫 Barres énergétiques

  • Stock au départ : 3 barres.
  • Effet par défaut : −15 points de fatigue.
  • Le réglage « Fatigue retirée par barre » peut être modifié.
  • Une barre ne donne pas directement des watts : elle restaure la capacité à en produire en réduisant la fatigue.

💧 Gourde

  • Contenu initial d’un coureur : 500 ml.
  • Une action « Boire » consomme 100 ml.
  • Chaque prise rend +5 points d’hydratation.
  • Boire diminue aussi le poids transporté, puisque l’eau restante est incluse dans la masse.

Comment l’hydratation baisse

La perte augmente avec la puissance au-delà d’un seuil et avec la chaleur. À partir de 20 °C, le facteur thermique monte progressivement jusqu’à environ ×1,8 à très forte température. La température locale dépend aussi de l’altitude.

UI vs mécanique : certaines anciennes mentions affichent « +15 % d’énergie » pour une barre. Le comportement réel du code actuel est bien une réduction de la fatigue, pas un remplissage séparé d’une jauge d’énergie.
IA : les coureurs IA peuvent boire automatiquement lorsque leur hydratation descend sous un seuil, tant qu’il reste de l’eau.

⚙ Rapports, cadence & efficacité

Le jeu possède 16 rapports. Leur développement va approximativement de 1,4 m à 14 m par tour de pédale, avec une progression régulière.

🥁 Cadence cible

L’interface indique une zone confortable autour de 80–95 tr/min. L’IA vise en pratique environ 88 tr/min avec une petite variation individuelle.

🤖 Dérailleur automatique

En mode auto, le rapport change quand la cadence s’éloigne suffisamment de la cible, avec un délai entre deux changements pour éviter l’oscillation.

L’efficacité de pédalage reste maximale proche de la cadence cible. Plus l’écart devient grand, plus une partie de la puissance théorique est perdue. Cela donne un intérêt réel au choix du rapport sans transformer le jeu en simulateur de transmission complet.

🎲 Créer un terrain généré

Le générateur construit un profil continu à partir de plusieurs familles d’ondulations. Il crée aussi une sinuosité locale et des éléments de décor.

RéglagePlageEffet
📏 Distance5–250 kmLongueur totale du parcours.
⛰️ Relief0–100Amplitude globale des variations d’altitude.
🌊 Profil0–1000 = longues ondulations ; 100 = terrain plus nerveux et rapproché.
🎲 Irrégularité0–100Ajoute surtout les petites bosses et variations courtes.
↪️ Sinuosité0–100Génère un coût de virage local utilisé par l’affichage et la route.
⛰️ Altitude départ0–2500 mAltitude de référence au départ.

La résolution actuelle vise environ un point de terrain tous les 25 m, ce qui permet une pente locale beaucoup plus fine que les premières versions.

🎨 Décor : arbres, herbe, rochers, haies, maisons, poteaux ou bâtiments sont répartis selon l’altitude, la pente et un aléa. Ils sont visuels : ils ne constituent pas des obstacles de gameplay.

🗺 Importer une carte CSV BRouter

Le jeu accepte le format CSV exporté par BRouter Web ↗. Il reconnaît automatiquement un séparateur tabulation, point-virgule ou virgule.

Ouvre BRouter Web, trace ton itinéraire et utilise son export CSV.
Dans Cycliste, clique sur 🗺 Charger route, puis choisis ton fichier CSV.
Le jeu contrôle les colonnes obligatoires, calcule la distance, le dénivelé positif, la sinuosité et les types de route.
Valide avec Commencer la course !. La course est réinitialisée et tous les coureurs sont replacés au départ.

Colonnes

ColonneObligatoireUtilisation
Longitude✅Position GPS. Accepte degrés décimaux ou microdegrés.
Latitude✅Position GPS. Accepte degrés décimaux ou microdegrés.
Elevation✅Altitude du tronçon, utilisée pour le profil et la pente.
Distance✅Longueur du tronçon ; la somme donne la distance totale.
TurnCost◻ optionnelCoût de virage. Sert à construire la sinuosité du parcours.
WayTags◻ optionnelPermet d’extraire le type de voie via highway=....
Autres colonnes BRouter◻Peuvent rester présentes : elles sont simplement ignorées si non utilisées.
Longitude\tLatitude\tElevation\tDistance\tCostPerKm\tElevCost\tTurnCost\tNodeCost\tInitialCost\tWayTags\tNodeTags\tTime\tEnergy
Exemple réel : le parcours Saint‑Malo → Dinard fourni au projet utilise exactement cette structure, avec des tags tels que highway=secondary, surface=asphalt ou junction=roundabout.
Contrôles : un fichier doit contenir au moins un tronçon valide et une route d’au moins 100 m. Une latitude/longitude, une altitude ou une distance non numérique provoque une erreur avec le numéro de ligne.

👥 Création des équipes

Le générateur d’équipes fonctionne en deux étapes : sélection des équipes puis personnalisation des coureurs.

Choisis ton équipe. Le premier coureur de cette équipe devient le joueur.
Choisis les adversaires. Il faut au moins une équipe adverse.
Règle la variation. Puissance, endurance, poids et taille sont tirés autour de valeurs moyennes.
Génère les coureurs. Tu peux ensuite modifier individuellement le nom, la puissance, l’endurance, le poids et la taille.
Démarre. Le jeu remplace les anciennes équipes et réinitialise la course.

Équipes prédéfinies

🐔 Coqs 🇫🇷 · ♉ Bulls 🇺🇸 · 🌄 Verde 🇧🇷 · 🐉 Dragons 🇨🇳 · ⚔ Vikings 🇳🇴 · 🍕 Squadra 🇮🇹 · 🌸 Sakura 🇯🇵 · 🐆 Panthers 🇿🇦 · 🦅 Condors 🇨🇴 · 🏔️ Alpen 🇨🇭 · 🦁 Lions 🇬🇧 · 🦘 Kangaroos 🇦🇺.

⚡ Puissance max

Base génération : 400 W. Variation par défaut ±25 W ; plage de l’éditeur de génération autour de 350–450 W.

🔋 Endurance

Base 1,00×. Plus la valeur est haute, moins la fatigue s’accumule à effort identique.

🧍 Poids

Base 75 kg. Le poids influence surtout les montées et la résistance de roulement.

📏 Taille

Base 178 cm. Elle influence légèrement la surface aérodynamique et l’abri fourni.

Subtilité : le réglage global du joueur autorise une puissance max bien plus large (200–800 W) que l’éditeur de génération standard. Ce sont donc deux portes d’entrée différentes pour l’équilibrage.

⌨ Contrôles PC & mobile

PC — raccourcis réellement actifs

↑ / ↓Effort ±5 %.
A Z E REffort −5 / −1 / +1 / +5.
← / →Petit déplacement latéral manuel.
EspacePause / reprise.
BBoire 100 ml.
MManger une barre.
1…7Zoom 60 km → 10 m.
O / PVitesse simulation −/+ 0,5×.
COuvrir/fermer le classement.
Documentation historique obsolète : le pied de page du jeu mentionne encore « ← → rapport ». Dans le code actuel, ces touches modifient le placement latéral ; les rapports se règlent via les boutons du dérailleur lorsque le mode auto est désactivé.

Mobile

Sous environ 600 px, les contrôles passent en panneaux : 🏋️ effort, 🩺 corps, ⚙️ dérailleur, 👥 équipe. Un seul panneau est affiché à la fois afin de limiter la hauteur occupée. Les boutons sont agrandis pour le tactile.

🔊 Commentateur vocal

Le commentateur repose sur la synthèse vocale du navigateur (SpeechSynthesis). Il peut annoncer les changements de statut et des informations contextuelles de course.

🗣 Voix

Choix parmi les voix disponibles dans le navigateur/système.

⏩ Vitesse

Réglable de 0,2× à 2×. Valeur initiale autour de 1,08.

🎵 Tonalité

Réglable de 0,2 à 2. Valeur initiale autour de 0,90.

Les commentaires peuvent porter sur le peloton, la protection, les attaques, les échappées, la récupération et le suivi d’un équipier. Les développements récents ajoutent aussi des commentaires d’ambiance : kilomètres, pente, vent, température, hydratation, énergie, aspiration et situation de course.

🧪 Status des fonctionnalités

StatusFonctionÉtat actuel
✅ StableEffort / watts / vitesseCœur du moteur de course, utilisé par tous les coureurs.
✅ StableFatigue / récupérationAccumulation au-dessus de 60 % d’effort, récupération en dessous.
✅ StableHydratation / gourdePerte selon effort + température ; 5 prises de 100 ml par gourde initiale.
✅ Stable16 rapports / cadence autoDérailleur automatique et rendement de cadence actifs.
✅ StableTerrain généréRelief, profil, irrégularité, sinuosité, altitude et décor.
✅ StableImport CSV BRouterAltitude, distance, GPS, TurnCost, WayTags et mini-carte.
✅ StableGénérateur d’équipesChoix équipes, adversaires, variations et édition individuelle.
🧪 ÉvolutifAspiration 2DDistance + cône latéral + taille + contributions multiples.
🧪 ÉvolutifTrajectoires latéralesRecentrement, recherche de roue, évitement, collision et dépassement encore en réglage.
🧪 ÉvolutifIA tactiquePeloton, protection, attaque, échappée, récupération et suivi ; paramètres encore affinés.
⚠ À surveillerContrôle effort d’un équipierZone ayant encore produit des incohérences fin septembre ; vérifier l’interaction IA / contrôle manuel.
🧪 ÉvolutifCommentateur TTSFonctionnel, enrichi progressivement avec contexte et anti-répétition.

🛠 FAQ & dépannage

Le CSV est refusé : « Colonnes requises »
Vérifie la casse exacte de Longitude, Latitude, Elevation et Distance. Ce sont les quatre colonnes obligatoires.
La mini-carte n’apparaît pas
La route doit provenir d’un CSV avec coordonnées GPS valides. Même avec un CSV correct, les fonds de carte nécessitent l’accès aux serveurs de tuiles ; un blocage réseau peut laisser la carte sans fond.
Pourquoi je perds de la vitesse en bord de route ?
Le placement latéral peut augmenter la résistance au roulement. Ce mécanisme est volontaire mais encore expérimental et peut être accentué par le réglage de pénalité latérale.
Pourquoi manger ne fait pas monter une jauge « énergie » ?
Dans le code actuel, la barre diminue directement la fatigue. Le mot « énergie » est surtout un libellé d’interface historique.
Pourquoi une attaque s’arrête ou passe en récupération ?
La fatigue peut devenir prioritaire. Une attaque doit aussi réellement créer un écart pour être transformée en échappée.
Pourquoi l’aspiration disparaît lorsque je décale le vélo ?
Le sillage est désormais bidimensionnel : tu peux rester à la bonne distance mais sortir latéralement du cône.

📚 Lexique complet

Les mots techniques du guide renvoient vers cette section. Utilise la recherche pour filtrer instantanément.

💨 Aspiration / Draft

Réduction de traînée obtenue en restant dans le sillage d’un ou plusieurs coureurs. Dépend de la distance et du décalage latéral.

⚡ Attaque

Phase d’effort très élevé destinée à créer rapidement un écart avec le groupe.

💨 Breakaway / Échappée

État d’un coureur ayant réussi à faire le trou et qui maintient ensuite une allure soutenue.

🗺 BRouter

Outil de calcul d’itinéraire dont l’export CSV sert de format de référence pour charger une route réelle.

🥁 Cadence

Nombre de tours de pédale par minute. Une cadence proche de la cible maximise l’efficacité de la puissance demandée.

❤️ Cardio / HR

Fréquence cardiaque simulée, affichée en battements par minute et liée surtout aux watts et à la pente.

💥 Collision

Garde-fou du placement latéral visant à éviter que deux vélos occupent physiquement la même zone.

🎮 Controlled rider

Coureur qui reçoit actuellement les commandes d’effort. Il peut être distinct du simple coureur observé selon le contexte.

⚙ Dérailleur / Gear

Système de 16 rapports. En automatique, le jeu ajuste le rapport pour rester proche de la cadence cible.

⛰ Dénivelé +

Somme des gains d’altitude positifs successifs sur un parcours importé.

📏 Développement

Distance parcourue pour un tour de pédale sur un rapport donné, de ~1,4 à 14 m dans la version actuelle.

🏋️ Effort

Consigne de 0 à 100 % servant à déterminer la puissance demandée. Au-dessus de 60 %, la fatigue s’accumule.

🔋 Endurance / Fatigue resistance

Coefficient individuel qui modifie la vitesse d’accumulation de fatigue.

🔋 Fatigue

Jauge interne 0–100. Plus elle est élevée, plus la puissance réellement produite est pénalisée.

↗️ Following / Suit

État où un coureur adapte son effort pour rester proche d’un équipier en attaque ou en échappée.

📐 Grade / Pente

Variation d’altitude rapportée à la distance horizontale, exprimée en pourcentage.

👥 Groupe

Ensemble de coureurs reliés par des écarts inférieurs à une distance donnée, utilisé par l’IA pour recoller ou attendre.

💧 Hydratation

État hydrique du coureur. Elle baisse avec le temps, la puissance et la chaleur et remonte lorsqu’il boit.

🤖 IA

Logique qui pilote les coureurs non contrôlés : effort, statut, ordre, rapport, boisson et placement.

🎲 Irrégularité

Paramètre du générateur qui augmente surtout l’amplitude des petites variations de relief.

↔ Lateral

Position gauche/droite du coureur par rapport à l’axe de la route, exprimée en mètres.

⭐ Leader

Coureur de référence d’une équipe IA, choisi par un score combinant notamment puissance et endurance.

📍 Microdegrés

Format entier de coordonnées GPS utilisé par certains exports : la valeur est divisée par 1 000 000 pour retrouver des degrés décimaux.

⚙ Peloton

État tactique normal où le coureur suit le rythme collectif et réagit aux groupes voisins.

📐 Pente

Voir Grade. Son effet sur la vitesse dépend aussi de la masse totale.

🧍 Poids / Weight

Masse corporelle du coureur. Le calcul de déplacement ajoute l’eau transportée et environ 9 kg pour le vélo/équipement.

⚡ Puissance / Watts

Puissance mécanique instantanée effectivement produite après application de l’effort, de la cadence, de la fatigue et de l’hydratation.

🛡️ Protect / Protection

État où un équipier se positionne pour servir de roue et d’abri à une cible.

♻ Recovery / Récupération

État tactique à faible effort destiné à faire redescendre la fatigue.

🛣 Road type

Type de voie extrait du tag BRouter highway=... : secondary, residential, cycleway, footway, etc.

↪️ Sinuosité

Indicateur de caractère tournant d’une route. Sur CSV, il est dérivé des valeurs de TurnCost.

〰 Smoothstep

Interpolation douce utilisée notamment pour faire monter puis descendre l’intensité de l’aspiration sans rupture brutale.

🌡 Température

Condition locale calculée à partir d’une température de départ, de l’altitude et de variations lentes ; elle accélère la perte hydrique.

⏱ Tick / DT

Pas de temps simulé entre deux mises à jour du moteur. Il est distinct de la fréquence d’affichage.

↪ TurnCost

Valeur BRouter associée au coût d’un changement de direction ou d’un virage. Cycliste l’utilise pour dériver une sinuosité locale.

👁 Viewed rider

Coureur actuellement affiché/suivi dans les vues et panneaux. Il n’est pas forcément contrôlable s’il appartient à une autre équipe.

🌬 Vent / Wind

Vent signé utilisé dans la vitesse d’air : positif de face, négatif favorable.

🏷 WayTags

Champ textuel BRouter décrivant la voie : type highway, revêtement, vitesse, aménagement cyclable, etc.

🔎 Zoom / View span

Distance visible sur le canvas principal. Les niveaux actuels couvrent 60 km, 10 km, 2 km, 200 m, 50 m, 20 m et 10 m.

🕰 Historique du développement

Chronologie reconstituée à partir des versions et échanges de développement disponibles. Les dates correspondent aux jalons attestés ; les idées historiques non présentes dans la version actuelle sont signalées.

🌱 Première idée et premier prototype

Naissance du concept : jeu cycliste HTML/JS fondé sur effort, dénivelé, vent, fatigue, hydratation/gourde, rapports, cardio, puissance, aspiration, travail d’équipe et profil de dénivelé. Le premier prototype autonome est défini avec 1 joueur, 3 équipiers IA et plusieurs adversaires soumis aux mêmes contraintes.

⛰ Terrain et aspiration initiale

Le relief généré par sommes de sinusoïdes apparaît. L’aspiration est déjà présente avec un sillage longitudinal d’environ 18 m ; les premières corrections portent sur son rendu et sa cohérence visuelle.

🔎 Zoom et échelle des cyclistes

Le dessin des coureurs devient dépendant du niveau de zoom. Le problème des vélos corrects à 50 m mais trop gros à 200 m lance la réflexion sur une échelle d’affichage cohérente.

🗺 Routes réelles, GPS et finesse du terrain

L’import de parcours CSV/BRouter, la mini-carte GPS et les coûts de route prennent de l’importance. Le jeu passe à 16 rapports ; la pente est affinée et la génération de terrain évolue vers une résolution proche de 25 m.

💧 Hydratation, IA peloton et rafraîchissement UI

Travail sur la séparation des pertes hydriques liées à l’effort et à la température, sur le rythme de rafraîchissement de l’interface et sur le comportement du peloton vis-à-vis des groupes devant et derrière.

🔊 Commentateur, mobile et aspiration affinée

Ajout des réglages TTS, des commentaires d’ambiance, des contrôles mobiles par panneaux, des cartes de parcours, du nom des coureurs sur le torse et d’une aspiration plus réaliste avec zone optimale proche de 2,5 m.

🚁 Vue hélico et placement latéral

Introduction de la position latérale des coureurs, de la logique de dépassement/évitement, d’une vue du dessus sur environ 20 m, des cônes d’aspiration colorés et du défilement des repères de distance.

📱 Responsive métrique

Décision structurante : lorsqu’un zoom de 20 m est choisi, le jeu doit montrer exactement 20 m aussi bien sur mobile que sur grand écran. Refonte du rapport mètres ↔ pixels et prise en compte du devicePixelRatio.

🍫 Ravitaillement : cadrage gameplay

Discussion des règles de ravitaillement. Le parcours Saint‑Malo → Dinard de 12,4 km sert de cas concret ; le principe retenu reste un stock embarqué par coureur, sans ravitaillement externe nécessaire sur ce type de course.

👥 Générateur d’équipes et sélection des coureurs

La version publiée inclut une sélection plus riche des équipes/coureurs. Le contrôle de l’effort d’un équipier fait apparaître une interaction délicate entre le coureur observé, le coureur contrôlé et la logique IA.

🧪 Stabilisation du contrôle d’équipier

Le bug de contrôle d’effort des coéquipiers reste un chantier actif. Il devient l’un des principaux points de stabilisation de la logique équipe/IA.

📚 Consolidation documentaire

Création de ce guide autonome pour figer les règles, subtilités, raccourcis, imports, statuts, lexique et historique de développement autour de la version courante.

📜 Historique ≠ fonctionnalités actuelles : certaines idées du tout premier concept, comme la vessie, ont fait partie de la réflexion initiale mais ne sont pas présentes comme mécanique active dans la version documentée ici.