feat(sites): dive on the Banc du Vigilant by default

Zone 1 becomes the default dive site; the foundation suite still selects the
calibration site explicitly. Documents the site suites, the site content
workflow and the authored heightfield terrain (ADR 0012), and aligns the zone 1
brief with the baked data (storage format, route lengths, 6 m ridge and
pinnacles).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
OlivierandClaude Sonnet 5.5 committed 2026-10-06 20:25:19 +02:00
1 parent a1493434e4
commit e00c97091b
5 files changed
+44 -19

No files matched your search

+8
View File
@@ -7,3 +7,11 @@ Une ressource décrit des données et référence des identifiants stables. Elle
duplique pas une règle de gameplay et ne dépend pas d'une scène de POC. Chaque duplique pas une règle de gameplay et ne dépend pas d'une scène de POC. Chaque
type de ressource recevra un validateur de contrat avant l'ajout de contenu en type de ressource recevra un validateur de contrat avant l'ajout de contenu en
volume. volume.
## Sites
`sites/<nom>.tres` est une `DiveSiteDefinition` ; `sites/<nom>_terrain.res`
est son `SiteTerrainData`. Les deux sont produits par
`tools/bake_site_terrain.gd -- <nom>` depuis `tools/sites/<nom>_recipe.gd`,
la recette étant le document d'auteur (ADR 0012). Ne pas éditer les fichiers
produits à la main.
+9 -2
View File
@@ -3,7 +3,7 @@
## Statut ## Statut
- Date : 10 août 2026. - Date : 10 août 2026.
- Dernière révision d'implémentation : 4 octobre 2026. - Dernière révision d'implémentation : 6 octobre 2026.
- État : cadrage approuvé, tranches 0, 1 et 1.5 implémentées ; tranche 2 en cours. - État : cadrage approuvé, tranches 0, 1 et 1.5 implémentées ; tranche 2 en cours.
- Jalon : verticale jouable, après validation des POC A et B. - Jalon : verticale jouable, après validation des POC A et B.
- Durée directrice du plan général : quatre à six mois. - Durée directrice du plan général : quatre à six mois.
@@ -864,6 +864,11 @@ rotation et remplacement d'un relevé.
### Tranche 3 — site et découverte ### Tranche 3 — site et découverte
État au 2026-10-06 : terrain du site implémenté. Le Banc du Vigilant
(`content/sites/zone1_vigilant.tres`) est chargé par `Nouvelle partie` ; ses
placements d'épaves sont encore des volumes graybox métalliques. Voir
`docs/briefs/terrain-site-zone1-gameplay.md` et l'ADR 0012.
- Ajouter carte limitée, position persistante du navire et sonar de surface. - Ajouter carte limitée, position persistante du navire et sonar de surface.
- Construire le terrain graybox, l'épave majeure contemporaine et deux leurres - Construire le terrain graybox, l'épave majeure contemporaine et deux leurres
extérieurs modulaires. extérieurs modulaires.
@@ -946,7 +951,9 @@ Une fois ce document approuvé, créer des ADR séparés pour :
`docs/adr/0009-player-knowledge-driven-progression.md` ; `docs/adr/0009-player-knowledge-driven-progression.md` ;
7. la limitation de la V1 à une surface bathymétrique unique, formalisée dans 7. la limitation de la V1 à une surface bathymétrique unique, formalisée dans
`docs/adr/0010-single-surface-bathymetry-for-v1.md` ; un modèle hybride `docs/adr/0010-single-surface-bathymetry-for-v1.md` ; un modèle hybride
nécessitera un prototype et un nouvel ADR lorsqu'un site concret l'exigera. nécessitera un prototype et un nouvel ADR lorsqu'un site concret l'exigera ;
8. le terrain de site en champ de hauteur authoré, formalisé dans
`docs/adr/0012-authored-heightfield-dive-sites.md`.
Les noms de classes peuvent évoluer pendant la tranche 0. Les responsabilités, Les noms de classes peuvent évoluer pendant la tranche 0. Les responsabilités,
les propriétaires et les directions de dépendance ne changent qu'avec un ADR. les propriétaires et les directions de dépendance ne changent qu'avec un ADR.
+17 -15
View File
@@ -118,9 +118,9 @@ paire d'épaves à plus de 260 m l'une de l'autre.
S S
``` ```
Noms de travail : **l'Échine** (crête), **les Deux Frères** (deux pitons Noms de travail : **l'Échine** (crête de 6 m de haut), **les Deux Frères**
jumeaux), **les Rides** (champ de rides de sable), **la Saignée** (sillon (deux pitons jumeaux de 6 m de haut), **les Rides** (champ de rides de
principal), **le Tombant**. sable), **la Saignée** (sillon principal), **le Tombant**.
### 4.3 Les trois épaves et leur terrain ### 4.3 Les trois épaves et leur terrain
@@ -150,20 +150,20 @@ correspond pas au rapport.
### 4.4 Les deux routes vers la cible ### 4.4 Les deux routes vers la cible
**Route sûre — par l'Échine (≈ 420 m, 26–32 m).** Depuis le navire, suivre la **Route sûre — par l'Échine (≈ 470 m, 26–32 m).** Depuis le navire, suivre la
crête longue vers le sud. Elle est lumineuse, large, sans obstacle, et se lit crête longue vers le sud. Elle est lumineuse, large, sans obstacle, et se lit
d'un seul scan. Elle mène au bord du plateau au-dessus de la Saignée : il d'un seul scan. Elle mène au bord du plateau au-dessus de la Saignée : il
faut ensuite descendre dans le sillon par son extrémité nord, à faible faut ensuite descendre dans le sillon par son extrémité nord, à faible
pente. Coût : temps et batterie. Récompense : zéro dégât, retour facile à pente. Coût : temps et batterie. Récompense : zéro dégât, retour facile à
estimer. estimer.
**Route risquée — par la Saignée (≈ 260 m, 36–48 m).** Un sillon de 12 à **Route risquée — par la Saignée (≈ 370 m, 36–48 m).** Un sillon de 12 à
18 m de large, aux parois de 8 à 10 m, qui coupe le plateau en diagonale et 18 m de large, aux parois de 8 à 10 m, qui coupe le plateau en diagonale et
débouche directement sur la proue de la cible. Sombre (les projecteurs débouche directement sur la proue de la cible. Sombre (les projecteurs
deviennent nécessaires), étroit (collisions), en pente (la batterie de deviennent nécessaires), étroit (collisions), en pente (la batterie de
remontée compte). Au sonar : une dépression continue, lisible comme une remontée compte). Au sonar : une dépression continue, lisible comme une
« ouverture possible » (GDP §7.2, point 4). Aucune paroi ne surplombe, donc « ouverture possible » (GDP §7.2, point 4). Aucune paroi ne surplombe, donc
compatible ADR 0010. Récompense : moitié moins de distance. compatible ADR 0010. Récompense : trajet plus court et direct sur la proue.
**Le tombant — la tentation (50–64 m).** Pas une route : une pente qui **Le tombant — la tentation (50–64 m).** Pas une route : une pente qui
descend sous la rupture. L'objet secondaire (1 unité, ~200 €) repose à 62 m, descend sous la rupture. L'objet secondaire (1 unité, ~200 €) repose à 62 m,
@@ -179,8 +179,8 @@ amers reconnaissables au sonar à 95 m :
| Amer | Forme sonar | Rôle | | Amer | Forme sonar | Rôle |
|---|---|---| |---|---|---|
| l'Échine | crête longue, orientée nord-sud | fil d'Ariane entre le navire et la cible | | l'Échine | crête longue de 6 m de haut, orientée nord-sud | fil d'Ariane entre le navire et la cible |
| les Deux Frères | deux pitons jumeaux, 9 m de haut, 20 m d'écart | repère ouest unique, sert à se recaler | | les Deux Frères | deux pitons jumeaux, 6 m de haut, 20 m d'écart | repère ouest unique, sert à se recaler |
| les Rides | ondulations régulières de 1 m | signe « plateau nord, navire proche » | | les Rides | ondulations régulières de 1 m | signe « plateau nord, navire proche » |
| la Saignée | sillon rectiligne, bords nets | entrée de la route risquée | | la Saignée | sillon rectiligne, bords nets | entrée de la route risquée |
| la rupture de pente | ligne continue de rupture | « ne pas dépasser » et limite sud | | la rupture de pente | ligne continue de rupture | « ne pas dépasser » et limite sud |
@@ -243,21 +243,23 @@ de contacts existant les sépare du fond.
| Couche | Élément | Responsabilité | | Couche | Élément | Responsabilité |
|---|---|---| |---|---|---|
| `game/domain/sites/` | `DiveSiteDefinition` (Resource typée) | id, chemin de scène, heightmap, masque, origine, taille de cellule, profondeur de référence, limites jouables, position de départ, mouillage, placements d'épaves, zones d'écho, réflectivités | | `game/domain/sites/` | `DiveSiteDefinition` (Resource typée) | identifiant, nom affiché, `SiteTerrainData`, limites jouables, position et cap de départ, placements (épaves, leurres, objet secondaire, débris), routes de contrôle |
| `game/domain/sites/` | `TerrainHeightField` (RefCounted pur) | lecture de hauteur et de matériau à une position, conversion monde ↔ cellule, bornes ; testable sans scène | | `game/domain/sites/` | `TerrainHeightField` (RefCounted pur) | lecture de hauteur et de matériau à une position, conversion monde ↔ cellule, bornes ; testable sans scène |
| `game/application/sites/` | `PlayableBoundsRule` | « hors zone » comme résultat typé depuis la télémétrie ; émet un avertissement, jamais un mur | | `game/application/sites/` | `PlayableBoundsRule` | « hors zone » comme résultat typé depuis la télémétrie ; émet un avertissement, jamais un mur |
| `game/world/sites/` | `BathymetricTerrainActor` | construit tuiles, collision et matériau depuis la définition ; expose matériau sonar par position | | `game/world/sites/` | `BathymetricTerrainActor` | construit tuiles, collision et matériau depuis la définition ; expose matériau sonar par position |
| `game/world/sites/` | `dive_site_zone1.tscn` | scène du site : terrain, environnement, points d'injection pour épaves et navire | | `game/world/sites/` | `dive_site_zone1.tscn` | scène du site : terrain, environnement, points d'injection pour épaves et navire |
| `game/composition/` | câblage | charge la définition, instancie le site, injecte la règle de bornes | | `game/composition/` | câblage | charge la définition, instancie le site, injecte la règle de bornes |
| `content/sites/` | `zone1_vigilant.tres` + `zone1_vigilant_height.png` + `zone1_vigilant_mask.png` | données du site | | `content/sites/` | `zone1_vigilant.tres` + `zone1_vigilant_terrain.res` | données du site |
| `tools/` (hors runtime) | script de cuisson | produit les PNG depuis une description de primitives géomorphologiques ; déterministe, versionné, jamais appelé par le jeu | | `tools/` (hors runtime) | script de cuisson | produit le `.res` depuis une description de primitives géomorphologiques ; déterministe, versionné, jamais appelé par le jeu |
Les conventions du contrat : hauteur en mètres négatifs vers le bas, +X est, Les conventions du contrat : hauteur en mètres négatifs vers le bas, +X est,
-Z nord (convention Godot, convertie une seule fois dans -Z nord (convention Godot, convertie une seule fois dans
`TerrainHeightField`), heightmap 16 bits avec `depth_min_m` et `depth_max_m` `TerrainHeightField`). Le terrain est stocké en `SiteTerrainData` au format
explicites. Ces points vont dans un **ADR 0012 — terrain de site en champ de `.res` (élévations en float32 et matériaux en octets) produit par la recette
hauteur authoré**, requis par les guardrails §5 et §11 (nouveau contrat de de cuisson ; le PNG 16 bits est écarté (ADR 0012). Ces points sont formalisés
données persistant dans le dépôt). dans l'**ADR 0012 — terrain de site en champ de hauteur authoré**, requis par
les guardrails §5 et §11 (nouveau contrat de données persistant dans le
dépôt).
`vehicle_test_environment.gd` perd sa formule analytique : la formule devient `vehicle_test_environment.gd` perd sa formule analytique : la formule devient
le premier cas d'usage du script de cuisson, et la scène de test charge une le premier cas d'usage du script de cuisson, et la scène de test charge une
@@ -58,7 +58,7 @@ const RebindResult = preload("res://game/application/input/rebind_result.gd")
const MAIN_MENU_SCENE = preload("res://game/presentation/main_menu/main_menu_screen.tscn") const MAIN_MENU_SCENE = preload("res://game/presentation/main_menu/main_menu_screen.tscn")
const DIVE_WORLD_SCENE_PATH := "res://game/composition/vertical_slice/dive_world.tscn" const DIVE_WORLD_SCENE_PATH := "res://game/composition/vertical_slice/dive_world.tscn"
const DEFAULT_SITE_PATH := "res://content/sites/vehicle_test.tres" const DEFAULT_SITE_PATH := "res://content/sites/zone1_vigilant.tres"
const COCKPIT_HUD_SCENE = preload("res://game/presentation/cockpit/cockpit_hud.tscn") const COCKPIT_HUD_SCENE = preload("res://game/presentation/cockpit/cockpit_hud.tscn")
const SONAR_DISPLAY_SCENE = preload( const SONAR_DISPLAY_SCENE = preload(
"res://game/presentation/sonar/sonar_display.tscn" "res://game/presentation/sonar/sonar_display.tscn"
+9 -1
View File
@@ -20,4 +20,12 @@ Suites de production actuelles :
- `integration/run_vertical_slice_foundation.gd` : composition, mouvement - `integration/run_vertical_slice_foundation.gd` : composition, mouvement
inertiel, caméra indépendante, cockpit 3D fixe, instruments physiques, couche inertiel, caméra indépendante, cockpit 3D fixe, instruments physiques, couche
d'alerte, sonar bathymétrique partagé, pause des ticks et remappage avec d'alerte, sonar bathymétrique partagé, pause des ticks et remappage avec
conflit. conflit ;
- `unit/run_site_domain_tests.gd` : données de terrain, champ de hauteur,
définition de site et ses placements/routes ;
- `unit/run_site_application_tests.gd` : règle de limites jouables ;
- `unit/run_site_baker_tests.gd` : primitives et déterminisme de la cuisson ;
- `contract/run_site_content_tests.gd` : règles de contenu du Banc du Vigilant
(profondeurs, routes, amers) ;
- `integration/run_site_terrain_integration.gd` : collision égale au champ,
matériaux sonar par cellule, scène de site et budget de chargement.