From 103f8bbe19cd186c15d06b9975452224a41115a9 Mon Sep 17 00:00:00 2001 From: VinPropane Date: Sun, 12 Apr 2026 16:43:02 -0400 Subject: [PATCH] NEON-29: Add approach treads for green, gold step, violet terrace. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TerracePlatformC_Approach (PCS_*): four cardinals, 7.2 m arms, ~0.104 m rise. TerraceStepB_Approach (TSB_*): S/E/W, 6.2×1.0 m NS treads. TerracePlatformB_Approach (TPB_*): N/E/W with six risers for 0.6 m to floor; south uses existing gold step. New ramp-tint materials. README + plan. --- client/README.md | 9 +- client/scenes/main.tscn | 480 ++++++++++++++++++++++ docs/plans/NEON-29-implementation-plan.md | 5 +- 3 files changed, 488 insertions(+), 6 deletions(-) diff --git a/client/README.md b/client/README.md index fd976aa..9ae939c 100644 --- a/client/README.md +++ b/client/README.md @@ -34,14 +34,15 @@ Elevated walkables use **distinct albedo tints** in `scenes/main.tscn` so screen | `ObstacleC` | `occluder` | Default gray | 2 × 4 | (5, −12) | Tall occluder, south quadrant | | `ObstacleD` | `occluder` | Default gray | 3 × 2 | (−8, −16) | Far-south occluder | | `TerracePlatformA` | `walkable` | **Teal** | 10 × 10, h=0.3 m | (13, −14) | Large SE pad; **three darker-teal approach treads per cardinal** (`TerracePlatformA_Approach` / `PAS_*`) — **1.0 m run** along the climb axis (~0.104 m rise each), wider than the **0.8 m** capsule diameter so the body is not wider than each tread | -| `TerraceStepB` | `walkable` | **Gold** | 6 × 3, h=0.3 m | (−15, 8.5) | NW approach step; bridges floor → TerracePlatformB | -| `TerracePlatformB` | `walkable` | **Violet** | 6 × 6, h=0.6 m | (−15, 13) | Upper NW terrace; reached via TerraceStepB | -| `TerracePlatformC` | `walkable` | **Green** | 8 × 8, h=0.3 m | (14, 14) | NE pad; single-step ascent from floor | +| `TerraceStepB` | `walkable` | **Gold** | 6 × 3, h=0.3 m | (−15, 8.5) | NW approach step; **`TerraceStepB_Approach`** / `TSB_*` — three treads per **S/E/W** (darker gold), **1.0 m** run on NS arms | +| `TerracePlatformB` | `walkable` | **Violet** | 6 × 6, h=0.6 m | (−15, 13) | Upper NW terrace; **`TerracePlatformB_Approach`** / `TPB_*` — **six** treads per **N/E/W** (~0.104 m rise) for **0.6 m** to floor (**south** uses gold step, not violet treads) | +| `TerracePlatformC` | `walkable` | **Green** | 8 × 8, h=0.3 m | (14, 14) | NE pad; **`TerracePlatformC_Approach`** / `PCS_*` — same tread pattern as teal (`PAS_*`), darker green albedo | ### Height variation notes - **Single-step terraces (A, C):** 0.3 m rise — within `agent_max_climb = 0.35`, so the nav mesh routes directly from floor onto the pad; one click suffices. **`TerracePlatformA`** (teal) sits **12 mm** above the main floor slab and has **cardinal walkable treads** (`TerracePlatformA_Approach`) so movement does not rely on a bare vertical box lip; nav rebakes at startup. -- **Two-level terrace B:** floor → `TerraceStepB` (**gold**, 0.3 m) → `TerracePlatformB` (**violet**, +0.3 m). **`agent_max_climb = 0.35`** applies to the nav mesh **and** to **walk step assist**: you cannot cheese the violet deck from the floor in one move — click the **gold step** (or the platform after you are already on the step), not the violet top from below. +- **Two-level terrace B:** floor → `TerraceStepB` (**gold**, 0.3 m) → `TerracePlatformB` (**violet**, +0.3 m). **`agent_max_climb = 0.35`** applies to the nav mesh **and** to **walk step assist**: you cannot cheese the violet deck from the floor in one move — click the **gold step** (or the platform after you are already on the step), not the violet top from below. **Approach treads** on gold (**`TSB_*`**) and on violet’s **north / east / west** (**`TPB_*`**, six risers for 0.6 m) match the teal convention. +- **QA / thin props:** **`PrototypeTerminal`**, **`MoveRejectPedestal`**, **`MoveRejectFarPad`** are unchanged (terminal kiosk, vertical reject demo, near-floor pad). Add ramps or treads later if they need full walk-up treatment. - **Occluders** are plain `StaticBody3D` with no `walkable` tag; the nav bake excludes their top surfaces, so they remain true obstacles for routing. ### Designer / QA limits diff --git a/client/scenes/main.tscn b/client/scenes/main.tscn index 9edf7ff..e34b7cd 100644 --- a/client/scenes/main.tscn +++ b/client/scenes/main.tscn @@ -150,6 +150,51 @@ size = Vector3(1.0, 0.104, 9.2) [sub_resource type="BoxShape3D" id="BoxShape3D_pa_stair_we"] size = Vector3(1.0, 0.104, 9.2) +[sub_resource type="StandardMaterial3D" id="Mat_terrace_platform_c_ramp"] +albedo_color = Color(0.12, 0.48, 0.22, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_pc_stair_ns"] +size = Vector3(7.2, 0.104, 1.0) + +[sub_resource type="BoxShape3D" id="BoxShape3D_pc_stair_ns"] +size = Vector3(7.2, 0.104, 1.0) + +[sub_resource type="BoxMesh" id="BoxMesh_pc_stair_we"] +size = Vector3(1.0, 0.104, 7.2) + +[sub_resource type="BoxShape3D" id="BoxShape3D_pc_stair_we"] +size = Vector3(1.0, 0.104, 7.2) + +[sub_resource type="StandardMaterial3D" id="Mat_terrace_b_step_ramp"] +albedo_color = Color(0.62, 0.45, 0.06, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_tsb_stair_ns"] +size = Vector3(6.2, 0.104, 1.0) + +[sub_resource type="BoxShape3D" id="BoxShape3D_tsb_stair_ns"] +size = Vector3(6.2, 0.104, 1.0) + +[sub_resource type="BoxMesh" id="BoxMesh_tsb_stair_we"] +size = Vector3(1.0, 0.104, 3.2) + +[sub_resource type="BoxShape3D" id="BoxShape3D_tsb_stair_we"] +size = Vector3(1.0, 0.104, 3.2) + +[sub_resource type="StandardMaterial3D" id="Mat_terrace_platform_b_ramp"] +albedo_color = Color(0.35, 0.18, 0.42, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_tpb_stair_ns"] +size = Vector3(6.2, 0.104, 1.0) + +[sub_resource type="BoxShape3D" id="BoxShape3D_tpb_stair_ns"] +size = Vector3(6.2, 0.104, 1.0) + +[sub_resource type="BoxMesh" id="BoxMesh_tpb_stair_we"] +size = Vector3(1.0, 0.104, 6.2) + +[sub_resource type="BoxShape3D" id="BoxShape3D_tpb_stair_we"] +size = Vector3(1.0, 0.104, 6.2) + [node name="Main" type="Node3D" unique_id=1358372723] script = ExtResource("1_main") @@ -454,6 +499,441 @@ surface_material_override/0 = SubResource("Mat_terrace_platform_c") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.15, 0) shape = SubResource("BoxShape3D_terrace_c") +[node name="TerracePlatformC_Approach" type="Node3D" parent="World/NavigationRegion3D" unique_id=3150000] + +[node name="PCS_S1" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150001 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 0.052, 8.6) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_S1" unique_id=3150011] +mesh = SubResource("BoxMesh_pc_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_S1" unique_id=3150012] +shape = SubResource("BoxShape3D_pc_stair_ns") + +[node name="PCS_S2" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150002 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 0.156, 9.05) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_S2" unique_id=3150021] +mesh = SubResource("BoxMesh_pc_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_S2" unique_id=3150022] +shape = SubResource("BoxShape3D_pc_stair_ns") + +[node name="PCS_S3" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150003 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 0.26, 9.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_S3" unique_id=3150031] +mesh = SubResource("BoxMesh_pc_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_S3" unique_id=3150032] +shape = SubResource("BoxShape3D_pc_stair_ns") + +[node name="PCS_N1" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150004 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 0.052, 19.4) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_N1" unique_id=3150041] +mesh = SubResource("BoxMesh_pc_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_N1" unique_id=3150042] +shape = SubResource("BoxShape3D_pc_stair_ns") + +[node name="PCS_N2" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150005 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 0.156, 18.95) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_N2" unique_id=3150051] +mesh = SubResource("BoxMesh_pc_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_N2" unique_id=3150052] +shape = SubResource("BoxShape3D_pc_stair_ns") + +[node name="PCS_N3" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150006 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14, 0.26, 18.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_N3" unique_id=3150061] +mesh = SubResource("BoxMesh_pc_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_N3" unique_id=3150062] +shape = SubResource("BoxShape3D_pc_stair_ns") + +[node name="PCS_W1" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150007 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.5, 0.052, 14) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_W1" unique_id=3150071] +mesh = SubResource("BoxMesh_pc_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_W1" unique_id=3150072] +shape = SubResource("BoxShape3D_pc_stair_we") + +[node name="PCS_W2" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150008 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.95, 0.156, 14) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_W2" unique_id=3150081] +mesh = SubResource("BoxMesh_pc_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_W2" unique_id=3150082] +shape = SubResource("BoxShape3D_pc_stair_we") + +[node name="PCS_W3" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150009 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 0.26, 14) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_W3" unique_id=3150091] +mesh = SubResource("BoxMesh_pc_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_W3" unique_id=3150092] +shape = SubResource("BoxShape3D_pc_stair_we") + +[node name="PCS_E1" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150010 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 19.4, 0.052, 14) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_E1" unique_id=3150101] +mesh = SubResource("BoxMesh_pc_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_E1" unique_id=3150102] +shape = SubResource("BoxShape3D_pc_stair_we") + +[node name="PCS_E2" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150013 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.95, 0.156, 14) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_E2" unique_id=3150111] +mesh = SubResource("BoxMesh_pc_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_E2" unique_id=3150112] +shape = SubResource("BoxShape3D_pc_stair_we") + +[node name="PCS_E3" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach" unique_id=3150014 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.5, 0.26, 14) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_E3" unique_id=3150121] +mesh = SubResource("BoxMesh_pc_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_c_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformC_Approach/PCS_E3" unique_id=3150122] +shape = SubResource("BoxShape3D_pc_stair_we") + +[node name="TerraceStepB_Approach" type="Node3D" parent="World/NavigationRegion3D" unique_id=3160000] + +[node name="TSB_S1" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160001 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.052, 5.6) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_S1" unique_id=3160011] +mesh = SubResource("BoxMesh_tsb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_S1" unique_id=3160012] +shape = SubResource("BoxShape3D_tsb_stair_ns") + +[node name="TSB_S2" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160002 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.156, 6.05) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_S2" unique_id=3160021] +mesh = SubResource("BoxMesh_tsb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_S2" unique_id=3160022] +shape = SubResource("BoxShape3D_tsb_stair_ns") + +[node name="TSB_S3" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160003 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.26, 6.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_S3" unique_id=3160031] +mesh = SubResource("BoxMesh_tsb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_S3" unique_id=3160032] +shape = SubResource("BoxShape3D_tsb_stair_ns") + +[node name="TSB_W1" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160004 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.5, 0.052, 8.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_W1" unique_id=3160041] +mesh = SubResource("BoxMesh_tsb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_W1" unique_id=3160042] +shape = SubResource("BoxShape3D_tsb_stair_we") + +[node name="TSB_W2" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160005 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.05, 0.156, 8.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_W2" unique_id=3160051] +mesh = SubResource("BoxMesh_tsb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_W2" unique_id=3160052] +shape = SubResource("BoxShape3D_tsb_stair_we") + +[node name="TSB_W3" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160006 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.5, 0.26, 8.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_W3" unique_id=3160061] +mesh = SubResource("BoxMesh_tsb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_W3" unique_id=3160062] +shape = SubResource("BoxShape3D_tsb_stair_we") + +[node name="TSB_E1" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160007 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.5, 0.052, 8.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_E1" unique_id=3160071] +mesh = SubResource("BoxMesh_tsb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_E1" unique_id=3160072] +shape = SubResource("BoxShape3D_tsb_stair_we") + +[node name="TSB_E2" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160008 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11, 0.156, 8.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_E2" unique_id=3160081] +mesh = SubResource("BoxMesh_tsb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_E2" unique_id=3160082] +shape = SubResource("BoxShape3D_tsb_stair_we") + +[node name="TSB_E3" type="StaticBody3D" parent="World/NavigationRegion3D/TerraceStepB_Approach" unique_id=3160009 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.5, 0.26, 8.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_E3" unique_id=3160091] +mesh = SubResource("BoxMesh_tsb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_b_step_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerraceStepB_Approach/TSB_E3" unique_id=3160092] +shape = SubResource("BoxShape3D_tsb_stair_we") + +[node name="TerracePlatformB_Approach" type="Node3D" parent="World/NavigationRegion3D" unique_id=3170000] + +[node name="TPB_N1" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170001 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.052, 18.75) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N1" unique_id=3170011] +mesh = SubResource("BoxMesh_tpb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N1" unique_id=3170012] +shape = SubResource("BoxShape3D_tpb_stair_ns") + +[node name="TPB_N2" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170002 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.156, 18.3) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N2" unique_id=3170021] +mesh = SubResource("BoxMesh_tpb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N2" unique_id=3170022] +shape = SubResource("BoxShape3D_tpb_stair_ns") + +[node name="TPB_N3" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170003 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.26, 17.85) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N3" unique_id=3170031] +mesh = SubResource("BoxMesh_tpb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N3" unique_id=3170032] +shape = SubResource("BoxShape3D_tpb_stair_ns") + +[node name="TPB_N4" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170004 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.364, 17.4) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N4" unique_id=3170041] +mesh = SubResource("BoxMesh_tpb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N4" unique_id=3170042] +shape = SubResource("BoxShape3D_tpb_stair_ns") + +[node name="TPB_N5" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170005 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.468, 16.95) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N5" unique_id=3170051] +mesh = SubResource("BoxMesh_tpb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N5" unique_id=3170052] +shape = SubResource("BoxShape3D_tpb_stair_ns") + +[node name="TPB_N6" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170006 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15, 0.572, 16.5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N6" unique_id=3170061] +mesh = SubResource("BoxMesh_tpb_stair_ns") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_N6" unique_id=3170062] +shape = SubResource("BoxShape3D_tpb_stair_ns") + +[node name="TPB_W1" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170007 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20.75, 0.052, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W1" unique_id=3170071] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W1" unique_id=3170072] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_W2" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170008 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20.3, 0.156, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W2" unique_id=3170081] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W2" unique_id=3170082] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_W3" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170009 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.85, 0.26, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W3" unique_id=3170091] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W3" unique_id=3170092] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_W4" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170010 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -19.4, 0.364, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W4" unique_id=3170101] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W4" unique_id=3170102] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_W5" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170013 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.95, 0.468, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W5" unique_id=3170111] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W5" unique_id=3170112] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_W6" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170014 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.5, 0.572, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W6" unique_id=3170121] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_W6" unique_id=3170122] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_E1" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170015 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.25, 0.052, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E1" unique_id=3170131] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E1" unique_id=3170132] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_E2" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170016 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.7, 0.156, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E2" unique_id=3170141] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E2" unique_id=3170142] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_E3" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170017 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.15, 0.26, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E3" unique_id=3170151] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E3" unique_id=3170152] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_E4" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170018 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.6, 0.364, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E4" unique_id=3170161] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E4" unique_id=3170162] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_E5" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170019 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.05, 0.468, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E5" unique_id=3170171] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E5" unique_id=3170172] +shape = SubResource("BoxShape3D_tpb_stair_we") + +[node name="TPB_E6" type="StaticBody3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach" unique_id=3170020 groups=["walkable"]] +collision_mask = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.5, 0.572, 13) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E6" unique_id=3170181] +mesh = SubResource("BoxMesh_tpb_stair_we") +surface_material_override/0 = SubResource("Mat_terrace_platform_b_ramp") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="World/NavigationRegion3D/TerracePlatformB_Approach/TPB_E6" unique_id=3170182] +shape = SubResource("BoxShape3D_tpb_stair_we") + [node name="InteractionMarkers" type="Node3D" parent="World" unique_id=1700003] script = ExtResource("6_rad") diff --git a/docs/plans/NEON-29-implementation-plan.md b/docs/plans/NEON-29-implementation-plan.md index 7cdd2df..08ea223 100644 --- a/docs/plans/NEON-29-implementation-plan.md +++ b/docs/plans/NEON-29-implementation-plan.md @@ -117,9 +117,10 @@ No new automated GDScript tests are added for this story — there is no new GDS - **Teal cardinal / tread shake (rollback):** Aggressive tweaks (**0.16** lift, **1**-tick cooldown, **`descending_stall`** toggling **`floor_block_on_wall`**, **seam-based** step-assist clear, **walk-stall nav replan**) caused **oscillation** on the small approach treads. **Reverted** to **`WALK_STEP_ASSIST_DELTA = 0.11`**, **`WALK_STEP_ASSIST_COOLDOWN_TICKS = 8`**, **no** stall replan, **no** `descending_stall` branch, **no** seam-based assist clear — only the original clear (clean floor without wall, or airborne with no slides). **Climb** wallish snap cap applies only when **`goal.y > feet_y + 0.12`** so shallow tread-to-tread motion is not capped to assist snap every frame. - **Teal pad — geometry wins:** Script-only mitigations still failed in practice; **`TerracePlatformA_Approach`** adds **twelve** `walkable` **`StaticBody3D`** treads (three per cardinal) with **~0.104 m** rise each, **darker teal** albedo, flush to the platform lip — nav + `CharacterBody3D` use **sloped contact** instead of fighting a **single vertical face**. **Follow-up:** tread **run** was **0.45 m** along the climb axis while the capsule **diameter is 0.8 m** — the body was wider than each tread, causing straddle / stuck motion when **entering** and blocking horizontal progress toward the lip when **exiting**. Treads widened to **1.0 m** run with positions re-centered. **`NavigationAgent3D`** `path_desired_distance` / `target_desired_distance` were briefly lowered to **0.22** but that caused **floor** movement to **stall**; **reverted to 0.35**. -## Next session (handoff) +## Approach treads (district convention) -- **World convention:** Use **approach treads** (same idea as **`TerracePlatformA_Approach`** / `PAS_*`) for **all** stair-like raised platforms in the district — not one-off script tweaks per prop. **Smooth ramps** elsewhere are also planned; expected to play nicely with existing bee-line + nav + step assist without special cases. +- **Shipped in scene:** **`TerracePlatformC_Approach`** (`PCS_*`, teal-style **3×4** cardinals, **7.2 m** NS / **WE** span), **`TerraceStepB_Approach`** (`TSB_*`, **S/E/W** only — north meets violet), **`TerracePlatformB_Approach`** (`TPB_*`, **N/E/W**, **six** ~**0.104 m** risers for **0.6 m** deck height; south remains **gold step**). **Smooth ramps** for other props can follow the same rise/run idea without new `player.gd` logic. +- **Not in this pass:** **`PrototypeTerminal`**, **MoveReject** props, **runtime random bumps** — add geometry when those need climbable access. ## Open questions / risks