extends SceneTree # Headless gameplay test: run with # godot --headless -s res://tests/test_surface_profiles.gd # Forgejo #51: a landed gas giant needs its own background shader instead of # lunar_surface.gdshader recoloured (craters reading as regolith, not # atmosphere). Verifies: # 1. the gas profile resolves a background_shader different from rocky's # (rocky's stays null - "keep the scene's existing shader") # 2. PlanetSurfaceController._compose_surface() actually swaps the # background material's shader when landing on a gas giant # 3. landing on a rocky planet leaves the scene's own lunar shader in # place - a null background_shader is a no-op, not a forced reset # # PlanetSurfaceController's _ready() (which calls _compose_surface()) does # not fire synchronously inside add_child() for a -s entry-point script - # it's deferred to the next frame, same as ResourceReadout's was for #49 - # so every read of the composed shader below waits a frame after add_child() # rather than checking on the same one. var game_state: Node var lunar_shader: Shader var gas_shader: Shader var rocky_shader_after_compose: Shader var scene: Node var stage: int = 0 var elapsed: float = 0.0 func _initialize() -> void: game_state = root.get_node("GameState") lunar_shader = load("res://lunar_surface.gdshader") # Loaded by path into a local, not referenced by its bare global # class_name - same load-order hazard PlanetSetups.gd and # PlanetSurfaceController.gd already work around: the class_name cache # isn't guaranteed warm before an import pass has run. var surface_profiles: Script = load("res://PlanetSurfaceProfiles.gd") var rocky_profile: Resource = surface_profiles.get_profile("rocky") var gas_profile: Resource = surface_profiles.get_profile("gas") if rocky_profile.background_shader != null: print("TEST_SURFACE_PROFILES: FAIL (rocky profile sets a background_shader - it should stay null)") quit(1) return if gas_profile.background_shader == null: print("TEST_SURFACE_PROFILES: FAIL (gas profile has no background_shader set)") quit(1) return gas_shader = gas_profile.background_shader if gas_shader == lunar_shader: print("TEST_SURFACE_PROFILES: FAIL (gas profile points at the lunar shader, not its own)") quit(1) return game_state.planet_definition_id = "rocky" scene = load("res://PlanetSurface.tscn").instantiate() root.add_child(scene) func _process(delta: float) -> bool: elapsed += delta match stage: 0: if elapsed < 0.2: return false var rocky_bg: ShaderMaterial = scene.get_node("BackgroundLayer/LunarBackground").material rocky_shader_after_compose = rocky_bg.shader scene.free() game_state.planet_definition_id = "gas_giant" scene = load("res://PlanetSurface.tscn").instantiate() root.add_child(scene) elapsed = 0.0 stage = 1 return false 1: if elapsed < 0.2: return false var gas_bg: ShaderMaterial = scene.get_node("BackgroundLayer/LunarBackground").material scene.free() if rocky_shader_after_compose != lunar_shader: print("TEST_SURFACE_PROFILES: FAIL (landing on a rocky planet changed the background shader)") quit(1) return true if gas_bg.shader != gas_shader: print("TEST_SURFACE_PROFILES: FAIL (landing on a gas giant did not swap in gas_surface.gdshader)") quit(1) return true if gas_bg.shader == lunar_shader: print("TEST_SURFACE_PROFILES: FAIL (gas surface still uses the lunar shader)") quit(1) return true print("TEST_SURFACE_PROFILES: PASS") quit(0) return true return false