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 <noreply@anthropic.com>
This commit is contained in:
OlivierandClaude Opus 5.5 committed 2026-10-06 20:58:15 +02:00
1 parent 4470450dfd
commit d1a94f05b1
3 files changed
+14 -4

No files matched your search

+11 -3
View File
@@ -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 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, 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 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 ## 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 - Brouillard, lumière directionnelle et particules de la scène de test
actuelle sont conservés et réglés par site. 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 ## 8. Architecture proposée
| Couche | Élément | Responsabilité | | 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/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.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 | | `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 | | `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 | | `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 2. `BathymetricTerrainActor` avec tuiles, collision et matériau sonar par
position ; migration de l'environnement de test sur une fixture. position ; migration de l'environnement de test sur une fixture.
3. Script de cuisson et première cuisson du Banc du Vigilant (graybox) ; 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. 4. Shader triplanaire et props bornés.
5. Points d'injection pour les trois épaves et le navire (les épaves 5. Points d'injection pour les trois épaves et le navire (les épaves
elles-mêmes appartiennent au reste de la tranche 3). elles-mêmes appartiennent au reste de la tranche 3).
@@ -29,7 +29,7 @@ func evaluate(position_m: Vector3) -> PlayableBoundsStatus:
var direction := Vector3.ZERO var direction := Vector3.ZERO
if state != PlayableBoundsStatus.State.INSIDE: if state != PlayableBoundsStatus.State.INSIDE:
var centre := _bounds_m.get_center() 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: if distance == to_west or distance == to_east:
toward = Vector2(signf(centre.x - point.x), 0.0) toward = Vector2(signf(centre.x - point.x), 0.0)
else: else:
+2
View File
@@ -19,6 +19,8 @@ var _placeholder_count := 0
func configure(definition: DiveSiteDefinition) -> String: func configure(definition: DiveSiteDefinition) -> String:
if _terrain == null or _placements_root == null:
return "dive site is not in the scene tree"
if definition == null: if definition == null:
return "dive site definition is missing" return "dive site definition is missing"
var field := definition.height_field() var field := definition.height_field()