98 lines
3.5 KiB
GDScript3
98 lines
3.5 KiB
GDScript3
|
|
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
|