Randoloot/tests/previews/surface_events_preview.gd
2026-10-18 08:43:54 +02:00

93 lines
4.0 KiB
GDScript

extends Node
const EVENTS := preload("res://scripts/planets/surface_events.gd")
func settle() -> void:
for frame in 4:
await get_tree().process_frame
await RenderingServer.frame_post_draw
func _ready() -> void:
GameState.system_level = 3
GameState.captain.credits = 100000
GameState.captain.parts = 100
for key in ["iron","copper","nickel","silicon","tungsten","mercury","sulfur","uranium"]:
GameState.captain.minerals[key] = 100
var profile: Dictionary = preload("res://scripts/planets/planet_profiles.gd").generate(777,1,"Spotkania na powierzchni")
var hard := "--hard" in OS.get_cmdline_user_args()
var prefix := "hard_" if hard else ""
profile.temperature = 100 if hard else 20
profile.oxygen = 0 if hard else 95
profile.flora = 50 if hard else 0
profile.difficulty = 1.0 if hard else 0.0
profile.easy = not hard
var progress: Resource = GameState.captain.expedition
assert(progress.begin_visit(profile))
progress.visit_seed = 0
var surface := Control.new()
surface.set_script(preload("res://scripts/planets/surface_screen.gd"))
surface.captain = GameState.captain
surface.progress = progress
add_child(surface)
surface.set_process(false)
surface.set_physics_process(false)
assert(surface.world.data.events.size() == 1)
var event: Dictionary = surface.world.data.events[0]
var at: Vector2 = event.position
surface.lander.position = at+Vector2(-100,0)
surface._previous_position = surface.lander.position
surface.camera.position = surface.lander.position
surface.camera.reset_smoothing()
var sheet := Image.create(1280,1800,false,Image.FORMAT_RGBA8)
for index in EVENTS.KINDS.size():
event.clear()
event.merge({"kind":EVENTS.KINDS[index],"seed":101+index,"position":at,"complete":false,"discovered":true})
surface._dialog.hide()
surface._event_armed = true
surface._check_events()
assert(surface._dialog.visible)
var snapshot := var_to_str(EVENTS.options(event,GameState.captain,progress))
surface._dialog.hide()
surface._show_event(event)
assert(snapshot == var_to_str(EVENTS.options(event,GameState.captain,progress)))
await settle()
assert(surface._dialog.position.y+surface._dialog.size.y <= get_viewport().get_visible_rect().size.y)
var screenshot := get_viewport().get_texture().get_image()
screenshot.save_png("res://artifacts/%sevent_%s.png" % [prefix,event.kind])
screenshot.convert(Image.FORMAT_RGBA8)
screenshot.resize(640,360,Image.INTERPOLATE_LANCZOS)
sheet.blit_rect(screenshot,Rect2i(0,0,640,360),Vector2i(index%2*640,index/2*360))
if event.kind == "trader":
var pressed := false
for child in surface._choices.get_children():
if child is Button and child.text.begins_with("Kup ") and child.text.contains("rakiet"):
child.pressed.emit()
pressed = true
break
assert(pressed and event.complete and progress.cargo_missiles == event.missile_count)
if event.kind == "scan_cache":
surface._event_action("scan")
assert(event.scanned and not event.complete)
await settle()
get_viewport().get_texture().get_image().save_png("res://artifacts/%sevent_scan_result.png" % prefix)
if event.kind == "evacuation":
event.rolls = [0.0,0.0,0.0]
surface._event_action("help")
assert(event.stage == 1 and not event.complete)
await settle()
get_viewport().get_texture().get_image().save_png("res://artifacts/%sevent_evacuation_stage2.png" % prefix)
sheet.save_png("res://artifacts/%sevents_overview.png" % prefix)
# Lethal event damage follows the same destruction path as a failed POI.
event.clear()
event.merge({"kind":"rescue","seed":333,"position":at,"complete":false})
EVENTS.prepare(event,GameState.captain,progress)
event.rolls = [1.0,1.0,1.0]
progress.lander_hp = 1
var ended := []
surface.finished.connect(func(success: bool): ended.append(success))
await surface._event_action("rescue")
assert(surface._ending and not surface.lander.visible and ended == [false])
progress.finish_visit(GameState.captain,false)
surface.queue_free()
print("EVENT UI PASS: ten dialogs, auto-open, fixed reopened offers, purchase button, scan, evacuation, bounds, lethal damage")
get_tree().quit()