Files
Ransom-s-wake/game/presentation/cockpit/cockpit_switch_panel.gd
T
OlivierandClaude Opus 5.5 2c1ea50aba
Quality Gate / Quality Gate (pull_request) Successful in 7m6s
feat(cockpit): replace procedural cockpit with twelve scripted models
Instance twelve Blender-scripted glTF models in the cockpit scene and
rebuild the cabin around them: gauge panel, sonar, switch panel, alert
box, speaker, porthole, hull wall, caged lamps, gas bottle, handrails
and side consoles. Presentation only; no domain, application or world
rule changes beyond enabling glow in the test environment.

- Needles, alert lamps and sonar screen are driven by the existing
  snapshots; the alert box now carries SYS/ATTN/ALRM.
- Depth dial reads percent of certified depth.
- Sonar display restyled as a turquoise holographic relief with a
  shader grid and height scale; SubViewport matches the glass (960x604).
- Cabin lighting retuned: warm pooled lamp light, cool porthole rim,
  lamp shadows, dial backlight.
- Procedural stand-ins removed (bulkhead, tanks, consoles, levers,
  indicator columns, placeholder pipe run, dial face PNGs).
- Tests adapted where nodes disappeared; one assertion removed
  (pipe_segment_count) until the pipe kit is placed.
- Model .glb files are committed without LFS; textures Godot extracts
  next to them at import are ignored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 21:46:46 +02:00

27 lines
676 B
GDScript

class_name CockpitSwitchPanel
extends Node3D
## Imported switch panel. Decorative in this slice: every control stays in its
## exported rest pose and no input reaches it.
const CONTROL_PREFIXES: Array[String] = ["Toggle_", "Rocker_", "Cover_", "Lever_"]
var _controls: Array[Node3D] = []
func _ready() -> void:
for prefix: String in CONTROL_PREFIXES:
for control: Node in find_children("%s*" % prefix, "Node3D", true, false):
_controls.append(control as Node3D)
func control_count() -> int:
return _controls.size()
func controls_are_at_rest() -> bool:
for control: Node3D in _controls:
if not control.rotation.is_zero_approx():
return false
return true