diff --git a/content/README.md b/content/README.md index 13043c6..17dd887 100644 --- a/content/README.md +++ b/content/README.md @@ -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 type de ressource recevra un validateur de contrat avant l'ajout de contenu en volume. + +## Sites + +`sites/.tres` est une `DiveSiteDefinition` ; `sites/_terrain.res` +est son `SiteTerrainData`. Les deux sont produits par +`tools/bake_site_terrain.gd -- ` depuis `tools/sites/_recipe.gd`, +la recette étant le document d'auteur (ADR 0012). Ne pas éditer les fichiers +produits à la main. diff --git a/docs/VERTICAL_SLICE_TECHNICAL_PLAN.md b/docs/VERTICAL_SLICE_TECHNICAL_PLAN.md index 1406e72..c285233 100644 --- a/docs/VERTICAL_SLICE_TECHNICAL_PLAN.md +++ b/docs/VERTICAL_SLICE_TECHNICAL_PLAN.md @@ -3,7 +3,7 @@ ## Statut - 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. - Jalon : verticale jouable, après validation des POC A et B. - 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 +É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. - Construire le terrain graybox, l'épave majeure contemporaine et deux leurres 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` ; 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 - 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 propriétaires et les directions de dépendance ne changent qu'avec un ADR. diff --git a/docs/briefs/terrain-site-zone1-gameplay.md b/docs/briefs/terrain-site-zone1-gameplay.md index 0777fca..8164e83 100644 --- a/docs/briefs/terrain-site-zone1-gameplay.md +++ b/docs/briefs/terrain-site-zone1-gameplay.md @@ -118,9 +118,9 @@ paire d'épaves à plus de 260 m l'une de l'autre. S ``` -Noms de travail : **l'Échine** (crête), **les Deux Frères** (deux pitons -jumeaux), **les Rides** (champ de rides de sable), **la Saignée** (sillon -principal), **le Tombant**. +Noms de travail : **l'Échine** (crête de 6 m de haut), **les Deux Frères** +(deux pitons jumeaux de 6 m de haut), **les Rides** (champ de rides de +sable), **la Saignée** (sillon principal), **le Tombant**. ### 4.3 Les trois épaves et leur terrain @@ -150,20 +150,20 @@ correspond pas au rapport. ### 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 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 pente. Coût : temps et batterie. Récompense : zéro dégât, retour facile à 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 débouche directement sur la proue de la cible. Sombre (les projecteurs deviennent nécessaires), étroit (collisions), en pente (la batterie de remontée compte). Au sonar : une dépression continue, lisible comme une « 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 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 | |---|---|---| -| l'Échine | crête longue, 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 | +| 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, 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 » | | 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 | @@ -243,21 +243,23 @@ de contacts existant les sépare du fond. | 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/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/` | `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 | -| `content/sites/` | `zone1_vigilant.tres` + `zone1_vigilant_height.png` + `zone1_vigilant_mask.png` | 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 | +| `content/sites/` | `zone1_vigilant.tres` + `zone1_vigilant_terrain.res` | données du site | +| `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, -Z nord (convention Godot, convertie une seule fois dans -`TerrainHeightField`), heightmap 16 bits avec `depth_min_m` et `depth_max_m` -explicites. Ces points vont dans un **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). +`TerrainHeightField`). Le terrain est stocké en `SiteTerrainData` au format +`.res` (élévations en float32 et matériaux en octets) produit par la recette +de cuisson ; le PNG 16 bits est écarté (ADR 0012). Ces points sont formalisés +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 le premier cas d'usage du script de cuisson, et la scène de test charge une diff --git a/game/composition/vertical_slice/vertical_slice_root.gd b/game/composition/vertical_slice/vertical_slice_root.gd index 860bd05..e53bbb3 100644 --- a/game/composition/vertical_slice/vertical_slice_root.gd +++ b/game/composition/vertical_slice/vertical_slice_root.gd @@ -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 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 SONAR_DISPLAY_SCENE = preload( "res://game/presentation/sonar/sonar_display.tscn" diff --git a/tests/README.md b/tests/README.md index cbab9ff..9ea8755 100644 --- a/tests/README.md +++ b/tests/README.md @@ -20,4 +20,12 @@ Suites de production actuelles : - `integration/run_vertical_slice_foundation.gd` : composition, mouvement inertiel, caméra indépendante, cockpit 3D fixe, instruments physiques, couche 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.