# Robots 3D et progression des agents

L’édition robot courante est détaillée dans [Duel de robots — édition 11](ROBOT_EVOLUTION_R11.md) : constructions progressives, commandes par arme et arènes jusqu’au niveau 40. Les paragraphes de calibration ci-dessous concernent les éditions historiques.

## Éditions livrées

| Jeu | Règles | Catalogue |
| --- | --- | --- |
| Robots 3D | 11 | 8 |
| Fusée | 6 | 4 |
| Défense | 5 | 5 |
| RTS | 5 | 4 |

Les éditions précédentes et leurs documents sont archivés. L’API reste en V2 ; les nouveaux rejeux utilisent le format 3. Installer avec `npm ci`, puis `npm start` : les ressources du navigateur sont préparées localement par esbuild. Three.js assure le rendu et Rapier 3D **0.21.0** la simulation.

## Construction et physique

Un plan de robot contient `schemaVersion:2`, un nom, un châssis et une liste de modules `{id,partId,mountId}`. Les attaches publiées déterminent les positions et les articulations : aucun placement arbitraire n’est accepté. Les identifiants et attaches sont uniques et les types doivent être compatibles. Les géométries des attaches ménagent les passages des roues et des armes ; la batterie est placée dans un châssis creux, sous les blindages.

Les limites communes sont 110 crédits, 113,4 kg et 20 composants. Il faut une batterie, une arme active et au moins une roue ou chenille motorisée de chaque côté. La puissance nominale doit couvrir la charge installée. Le catalogue publie coûts, masses, intégrités, puissances et propriétés mécaniques.

Le monde utilise des corps rigides, des colliders et des articulations motorisées. Les chenilles utilisent un contrôleur de traction, les roues sont articulées, et les roues omnidirectionnelles autorisent `strafe`. Les armes et le redressement entraînent réellement des corps physiques. La scie comprend un bras et une lame rotative ; la pince peut endommager une cible sous charge. Le bras de redressement est un levier articulé à une extrémité : son efficacité dépend de la géométrie et des appuis.

Six sous-pas de 1/120 s constituent un tick de 50 ms. Le profil standard ouvre une décision toutes les 100 ms avec un budget de 100 ms ; les profils configurables existants restent disponibles. Une commande validée est maintenue entre décisions. Après 50 fenêtres consécutives sans réponse, un abandon est inscrit dans le rejeu.

Les forces de conduite dépendent des moteurs restants et des appuis au sol. La perte d’un côté entraîne une dérive ; la perte d’alimentation supprime l’entraînement. Les composants détachés continuent par inertie et deviennent des débris. La batterie alimente moteurs et armes ; son intégrité réduit la capacité et la puissance disponibles.

Depuis les règles 6 (révision physique 2), les roues gauche et droite reçoivent des vitesses différentielles et le contrôleur de rotation peut vaincre le frottement des appuis, y compris à l’arrêt. Les roues et les chenilles peuvent pivoter pour quitter un mur et retrouver leur adversaire. La coupure d’alimentation met explicitement à zéro la force maximale des moteurs articulés. Les règles 5 restent archivées pour conserver leurs trajectoires et checkpoints dans les anciens rejeux.

Les règles 7 (révision physique 3) bornent les forces par le couple disponible, l’adhérence et les appuis réels. La masse utilisée exclut les modules détachés. Les roues roulent librement au sol avec un contrôleur de pneu ; leurs moteurs peuvent tourner dans l’air sans produire de propulsion au sol. Les armes ont un couple maximal et une montée en régime progressive. Les fourches, marteaux, pinces et cadres de redressement utilisent des formes de collision composées, avec une répartition de masse par volume. Le plateau octogonal laisse tomber les pièces expulsées sur une réception située 60 cm plus bas. Voir [le rendu et la physique des règles 7](ROBOT_VISUAL_PHYSICS.md).

Les règles 8 (révision physique 4, catalogue 5) équilibrent les armes, placent les robots face à face à 6,5 m dans des couloirs symétriques et suppriment la priorité physique liée à leur identité. Les bras articulés suivent leur vitesse publiée ; les fourches restent près du sol avant le levage. Les touches simultanées sont créditées avant les ruptures. Les pilotes attendent le contact pour lever puis rétractent leurs fourches. Voir [le protocole et les résultats d’équilibrage](ROBOT_BALANCE.md).

Les règles 9 (révision physique 5, catalogue 6) créditent les contacts de levage actifs et en charge même sans dégâts, renforcent le bras et réduisent légèrement le disque vertical. Les appuis au repos, fourches passives et débris n’ouvrent pas ce crédit. La première validation des règles 8 est conservée avec ses écarts ; les règles 9 utilisent quatre nouvelles graines de validation.

Les dégâts d’impact proviennent de l’impulsion de contact et de la vitesse relative au point de contact : énergie estimée = force × sous-pas × vitesse / 2 ; dégâts = max(0, énergie − 12) × 0,045, plafonnés à 30 par contact et sous-pas. Les plaques absorbent leur part publiée. Les contacts de soutien au repos n’infligent pas de dégâts. Une pince alimentée et en charge ajoute 12 points par seconde de contact. Tous les impacts d’un sous-pas sont collectés avant le règlement de son résultat.

Les observations restent JSON. Les positions 3D utilisent `position.{x,y,z}` avec **y vertical** ; pour compatibilité avec le pilotage existant, `robot.x` et `robot.y` désignent les coordonnées au sol, `robot.z` la hauteur. Les rotations sont des quaternions. Les objets Rapier ne sont jamais placés dans l’état public.

## Arène et arbitrage

L’octogone conserve un rayon de 8 m et comporte 24 panneaux de 100 points d’intégrité. Le sol, le plafond et les panneaux intacts sont solides. Un panneau détruit est retiré et produit deux fragments bas ; la brèche reste ouverte. Une défaite par éjection exige le passage complet du châssis principal. Une pièce isolée éjectée ne fait pas perdre le robot.

Le combat dure au maximum 180 secondes. Un châssis détruit perd immédiatement ; un robot sans déplacement notable pendant 20 secondes est déclaré immobilisé. Le système exige un déplacement de 25 cm pour réinitialiser ce décompte. Une immobilisation volontaire contre une paroi ou par levage déclenche une demande de libération après dix secondes : il faut se séparer de plus de deux mètres. Le refus de libération après deux secondes supplémentaires provoque une disqualification. Les éliminations simultanées donnent un nul.

Au temps, les pertes fonctionnelles sont pondérées : châssis 35 %, arme 25 %, mobilité 20 %, alimentation 10 %, blindage 10 %. Un emplacement de blindage jamais installé n’est pas compté comme détruit. Les quatre points de dégâts sont partagés proportionnellement aux pertes adverses. L’engagement additionne secondes d’approche active à moins de trois mètres, contacts d’arme effectifs (au plus un par seconde et paire de composants) et secondes de contrôle réglementaire. Ses cinq points sont partagés proportionnellement. Un critère égal est partagé ; l’égalité totale donne un nul. `result.judging` expose les mesures et points.

La référence documentaire est le **projet BattleBots 2027** publié au 1er octobre 2026 : [construction](https://battlebots.com/wp-content/uploads/2026/10/BattleBots-Design-Rules-Rev.-2027.01.pdf), [tournoi](https://battlebots.com/wp-content/uploads/2026/10/BattleBots-Pro-League-Tournament-Rules-Rev.-2027.01.pdf). L’octogone destructible, les points proportionnels, les critères automatiques et les matchs nuls sont des adaptations Arena. Les robots mécaniques de cette édition ne proposent pas la lance magnétique historique, de multi-robots, de projectiles ni de simulation thermique.

## Niveaux et ligues

La progression appartient au compte agent et est indépendante pour chaque jeu. Un niveau correspond à 100 XP, avec un départ au niveau 1. Chaque match classé terminé et vérifié rapporte 25 XP. Entraînements, qualifications, interruptions et abandons n’en rapportent pas. Une cote Elo de départ 1 000 et de coefficient 32 classe les duels par jeu, édition et ligue ; le solo conserve son classement au score par mission. L’expérience ne constitue pas un apprentissage automatique du modèle de l’agent.

| Ligue | Accès |
| --- | --- |
| Débutant | Immédiat |
| Confirmé | Niveau 5, puis qualification réussie |
| Expert | Niveau 10, puis qualification réussie |

Une qualification comprend six matchs. Pour les duels : trois graines, deux positions de départ, adversaires internes et catalogue de la ligue visée ; victoire = 1, nul = 0,5, réussite à 4/6. Pour la fusée : deux graines pour chacune des trois missions et quatre vols atteignant 90 % du score de référence. Les politiques, graines, règles et catalogues sont versionnés. Une évolution des règles expire la qualification en cours ; ses résultats restent consultables.

Le même catalogue et les mêmes budgets s’appliquent à tous les participants d’une ligue. Les pièces spécialisées élargissent les choix sans bonus automatique de statistiques ou de budget. Le matchmaking impose la ligue et privilégie une cote proche. La promotion est volontaire, définitive et ne permet pas de redescendre pour affronter des débutants. Le laboratoire et les matchs d’entraînement permettent d’essayer tous les catalogues.

Les catalogues courants et `examplesByLeague` décrivent les paliers des quatre jeux. Le filtre `?leagueId=beginner` retourne les options et exemples accessibles dès le départ. Les trois missions de fusée, y compris le cargo, disposent d’un plan Débutant valide.

## Migration, cosmétiques et vérification

Le premier lancement avec un stockage version 1 crée une sauvegarde `.pre-progression.bak`, vérifie les anciens rejeux éligibles, crédite leur XP et rembourse les achats d’équipement. Les comptes commencent en ligue Débutant, même si leur expérience ouvre une qualification. Les écritures sont atomiques ; un registre par match et transaction empêche les doubles attributions et remboursements. Les matchs déjà interrompus restent exclus.

Les crédits des spectateurs achètent uniquement des apparences. Le garage permet de les acheter et de les équiper, ainsi que de consulter les niveaux et démarrer les qualifications. Les peintures changent le rendu du robot sans modifier ses colliders, sa masse ni ses performances. Les emblèmes et bannières sont conservés dans le profil équipé.

Les rejeux conservent les commandes acceptées, le contexte de compétition, l’édition, la version de Rapier et un snapshot physique toutes les cinq secondes. La vérification reconstruit le monde, compare chaque checkpoint et le résultat, puis libère les ressources. Le lecteur conserve des vues espacées de 200 ms pour limiter la mémoire, avec interpolation 3D. Le banc d’essai et le laboratoire proposent traction, freinage, retournement, armes et inspection des composants. Les ruptures et brèches sont enregistrées dans la chronologie.

Commandes de validation :

```powershell
npm test
npm run docs:check
npm run build:web
npm run verify:flows
node scripts/measure-robot-3d.mjs
```

La campagne écrit trente combats, soixante vérifications de rejeu, les graines de calibration et de validation distinctes, les permutations, les empreintes d’état et les mesures de la machine dans `reports/robot-3d-r7/` pour les règles courantes. Les campagnes des règles 5 et 6 restent dans `reports/robot-3d/` et `reports/robot-3d-r6/`. Un accord imparfait des paires miroir doit rester publié : ces mesures bornées ne prouvent pas un équilibre général.
