Randoloot/tests/levels/planet_prompt_test.gd
2026-10-25 12:34:56 +01:00

125 lines
5.3 KiB
GDScript

extends Node
var game: Node2D
var manager: Node
func settle() -> void:
await get_tree().process_frame
await get_tree().process_frame
func check_hint(expected: String) -> void:
await settle()
game.player.reset_physics_interpolation()
game.player.get_node("Camera2D").force_update_scroll()
await get_tree().physics_frame
await RenderingServer.frame_post_draw
manager._layout_prompt()
assert(manager._prompt.visible)
assert(manager._text.text.contains(expected))
assert(manager._prompt.size.y < 260 and manager._prompt.size.x <= 320)
assert(manager._prompt.get_global_rect().encloses(manager._text.get_global_rect()))
if manager._land_button.visible:
assert(manager._prompt.get_global_rect().encloses(manager._land_button.get_global_rect()))
assert(get_viewport().get_visible_rect().encloses(manager._prompt.get_global_rect()))
func _ready() -> void:
GameState.system_seed = 8428159
game = preload("res://scenes/game/game.tscn").instantiate()
add_child(game)
await settle()
manager = game.get_node("PlanetExpeditions")
var sprite: Sprite2D = manager.freighter.get_child(0)
assert(is_equal_approx(maxf(sprite.texture.get_width(),sprite.texture.get_height())*sprite.scale.x,285.0))
var style := manager._prompt.get_theme_stylebox("panel") as StyleBoxFlat
assert(style.bg_color.a > 0.75 and style.bg_color.a < 0.9)
var contact := preload("res://scripts/ui/orbital_contact_style.gd")
var extent := Vector2(300,180)
var viewport := Vector2(1280,720)
var center := Vector2(640,360)
assert(contact.beside(center,90,extent,viewport) == Vector2(744,270))
var obstacle: Array[Rect2] = [Rect2(744,270,300,180)]
assert(contact.beside(center,90,extent,viewport,obstacle).x < center.x)
for edge in [Vector2(35,100),Vector2(1245,100),Vector2(35,620),Vector2(1245,620)]:
assert(Rect2(Vector2.ZERO,viewport).encloses(Rect2(contact.beside(edge,90,extent,viewport),extent)))
for enemy in get_tree().get_nodes_in_group("enemies"):
enemy.position = Vector2(-9999,-9999)
game.player.position = Vector2(10000,10000)
game.player.landing_combat_lock = 100
var start := Time.get_ticks_usec()
for frame in 1000:
manager._process(0)
var elapsed := Time.get_ticks_usec()-start
assert(manager._text.text.is_empty() and not manager._prompt.visible)
print("PROMPT BENCH: 1000 hidden combat refreshes=",elapsed," us; text chars=",manager._text.text.length())
game.player.position = game.protected_planet.position
manager._process(0)
assert(not manager._prompt.visible)
for frame in 1000:
manager._process(0)
assert(not manager._prompt.visible)
game.player.landing_combat_lock = 0
manager._process(0)
await check_hint("TLEN")
var blocker := get_tree().get_first_node_in_group("enemies")
blocker.position = game.player.position+Vector2(100,0)
manager._process(0)
assert(not manager._prompt.visible)
game.player.position = manager.freighter.position
blocker.position = game.player.position+Vector2(100,0)
manager._process(0)
assert(not manager._prompt.visible)
blocker.position = Vector2(-9999,-9999)
game.player.position = game.protected_planet.position
manager._process(0)
await check_hint("TLEN")
# Reproduce an oversized panel retained by an earlier combat warning.
manager._prompt.size.y = 21054
manager._text.text = "Old oversized prompt"
game.player.landing_combat_lock = 0
manager._process(0)
await check_hint("TLEN")
assert(not manager._land_button.disabled)
manager._process(0)
await check_hint("ŚREDNIA SZANSA POI")
var camera: Camera2D = game.player.get_node("Camera2D")
var previous_canvas := get_viewport().canvas_transform
camera.enabled = false
get_viewport().canvas_transform = Transform2D(0,Vector2(640,360)-game.protected_planet.global_position)
manager._layout_prompt()
var previous_position: Vector2 = manager._prompt.position
get_viewport().canvas_transform = get_viewport().canvas_transform.translated(Vector2(70,0))
manager._layout_prompt()
assert(manager._prompt.position.distance_to(previous_position) > 10,"Contact card follows the camera while text stays unchanged")
get_viewport().canvas_transform = previous_canvas
camera.enabled = true
camera.force_update_scroll()
await settle()
manager._layout_prompt()
if "--capture-preview" in OS.get_cmdline_user_args():
await RenderingServer.frame_post_draw
get_viewport().get_texture().get_image().save_png("res://artifacts/planet_scan_stats.png")
manager._message_time = 0
manager._process(0)
await check_hint("TLEN")
for visit in 10:
game.player.position = manager.freighter.position
manager._process(0)
await check_hint("FRACHTOWIEC")
assert(manager._land_button.text == "DOKUJ [L]")
if visit == 0 and "--capture-preview" in OS.get_cmdline_user_args():
await RenderingServer.frame_post_draw
get_viewport().get_texture().get_image().save_png("res://artifacts/freighter_prompt_fixed.png")
game.player.position = game.protected_planet.position
manager._process(0)
await check_hint("TLEN")
game.player.position = Vector2(10000,10000)
manager._notice("Krótka wiadomość")
manager._process(0)
await check_hint("Krótka wiadomość")
assert(not manager._land_button.visible)
manager._message_time = 0
manager._process(0)
assert(not manager._prompt.visible)
print("PLANET PROMPT PASS: bounded text, combat, shrink, planet, freighter, scan, messages, on-screen content")
game.queue_free()
await settle()
get_tree().quit()