xiandie/scene/entity/ux/player_os.gd
2025-07-03 01:40:34 +08:00

83 lines
2.4 KiB
GDScript

class_name PlayerOS extends Control
signal os_finished(translation_key)
@onready var os_pausing_timer = %OSTimer as Timer
@onready var os_label = %OSLabel as DialogueLabel
@onready var os_contaner = %PanelContainer as PanelContainer
var os_tween: Tween
func _ready() -> void:
if Engine.is_editor_hint():
# 显示 os 效果
os_contaner.modulate.a = 1.0
os_label.text = "os 测试文本"
return
os_contaner.modulate.a = 0.0
os_label.text = ""
os_pausing_timer.timeout.connect(_on_os_pausing_timeout)
os_finished.connect(func(_k): locking = false)
var locking := false:
set(val):
if val != locking:
locking = val
if val:
SceneManager.lock_player()
else:
SceneManager.unlock_player()
var last_finished_callback: Callable
func pop_os(lines: Array, translation_key: String) -> void:
if os_tween and os_tween.is_valid():
os_tween.kill()
if last_finished_callback:
last_finished_callback.call()
else:
printerr("PlayerOS: last_finished_callback is not set, please check the code.")
locking = true
os_tween = create_tween()
os_label.text = ""
os_tween.tween_property(os_contaner, "modulate:a", 1.0, 0.2)
for line in lines:
# os_pausing_timer 启动最小时长 0.01 秒
var duration = max(GlobalConfigManager.config.os_wait_time, 0.01)
os_tween.tween_callback(_os_load_line.bind(line, duration))
os_tween.tween_property(os_contaner, "modulate:a", 0.0, 0.2)
last_finished_callback = os_finished.emit.bind(translation_key)
os_tween.tween_callback(last_finished_callback)
func _os_load_line(line: DialogueLine, duration: float):
os_label.dialogue_line = line
os_label.type_out()
if GlobalConfigManager.config.os_auto_end:
if os_label.finished_typing.is_connected(os_pausing_timer.start):
os_label.finished_typing.disconnect(os_pausing_timer.start)
os_label.finished_typing.connect(os_pausing_timer.start.bind(duration), CONNECT_ONE_SHOT)
os_tween.pause()
func _on_os_pausing_timeout():
if os_tween and os_tween.is_valid():
os_tween.play()
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("interact"):
if os_label.is_typing:
get_viewport().set_input_as_handled()
os_label.skip_typing()
elif (
not os_pausing_timer.is_stopped()
or (not GlobalConfigManager.config.os_auto_end and os_tween and os_tween.is_valid())
):
get_viewport().set_input_as_handled()
os_pausing_timer.stop()
_on_os_pausing_timeout()