From d1a94f05b1e1eb49f652f2b7e194f4f4eaa82877 Mon Sep 17 00:00:00 2001 From: Olivier Date: Tue, 6 Oct 2026 20:58:15 +0200 Subject: [PATCH] chore(sites): small cleanups and brief alignment Drop a dead initial value in PlayableBoundsRule, guard DiveSite.configure() when called before the node is in the tree, and align the zone 1 brief with what was built: generic dive_site.tscn, the resolved collision check, and the graybox shader deviation. Co-Authored-By: Claude Opus 5.5 --- docs/briefs/terrain-site-zone1-gameplay.md | 14 +++++++++++--- game/application/sites/playable_bounds_rule.gd | 2 +- game/world/sites/dive_site.gd | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/briefs/terrain-site-zone1-gameplay.md b/docs/briefs/terrain-site-zone1-gameplay.md index 1b20e2f..cd9d4f8 100644 --- a/docs/briefs/terrain-site-zone1-gameplay.md +++ b/docs/briefs/terrain-site-zone1-gameplay.md @@ -51,7 +51,9 @@ négatif. Si c'est confirmé, la collision actuelle est le terrain visuel retourné avant/arrière, et le sonar scanne la collision, pas le maillage. Les tests d'intégration ne le détecteraient pas (ils comptent des échantillons, pas une forme). Le nouvel acteur terrain doit avoir un test qui compare -hauteur visuelle et hauteur de collision en quelques points. +hauteur visuelle et hauteur de collision en quelques points. Résolu : l'acteur +terrain compare collision et champ de hauteur dans +`tests/integration/run_site_terrain_integration.gd`. ## 3. Partis pris de réalisme @@ -241,6 +243,11 @@ de contacts existant les sépare du fond. - Brouillard, lumière directionnelle et particules de la scène de test actuelle sont conservés et réglés par site. +**Écart d'implémentation (graybox)** : le shader livré n'est pas triplanaire. +Il mélange sable et roche par la pente à partir de 20° (sable sous 20°, roche +au-dessus de 40°, fondu entre ; le matériau sonar bascule à 20°) et rend les +rides par modulation d'albédo, sans normal map. À revoir en tranche 6. + ## 8. Architecture proposée | Couche | Élément | Responsabilité | @@ -249,7 +256,7 @@ de contacts existant les sépare du fond. | `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/world/sites/` | `dive_site.tscn` (générique, configurée par une `DiveSiteDefinition`) | scène de 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_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 | @@ -302,7 +309,8 @@ petite définition de site (fixture) comme le ferait le vrai site. 2. `BathymetricTerrainActor` avec tuiles, collision et matériau sonar par position ; migration de l'environnement de test sur une fixture. 3. Script de cuisson et première cuisson du Banc du Vigilant (graybox) ; - bornes jouables ; scène `dive_site_zone1.tscn`. + bornes jouables ; scène générique `dive_site.tscn` configurée par une + `DiveSiteDefinition`. 4. Shader triplanaire et props bornés. 5. Points d'injection pour les trois épaves et le navire (les épaves elles-mêmes appartiennent au reste de la tranche 3). diff --git a/game/application/sites/playable_bounds_rule.gd b/game/application/sites/playable_bounds_rule.gd index bbcfa04..8d7ff7d 100644 --- a/game/application/sites/playable_bounds_rule.gd +++ b/game/application/sites/playable_bounds_rule.gd @@ -29,7 +29,7 @@ func evaluate(position_m: Vector3) -> PlayableBoundsStatus: var direction := Vector3.ZERO if state != PlayableBoundsStatus.State.INSIDE: var centre := _bounds_m.get_center() - var toward := Vector2(centre.x - point.x, centre.y - point.y) + var toward: Vector2 if distance == to_west or distance == to_east: toward = Vector2(signf(centre.x - point.x), 0.0) else: diff --git a/game/world/sites/dive_site.gd b/game/world/sites/dive_site.gd index d73d778..2884b63 100644 --- a/game/world/sites/dive_site.gd +++ b/game/world/sites/dive_site.gd @@ -19,6 +19,8 @@ var _placeholder_count := 0 func configure(definition: DiveSiteDefinition) -> String: + if _terrain == null or _placements_root == null: + return "dive site is not in the scene tree" if definition == null: return "dive site definition is missing" var field := definition.height_field()