@tool class_name PropInspector extends CanvasLayer enum { STATUS_HIDDEN, STATUS_INSPECTING_PROP, STATUS_INSPECTING_COVER, STATUS_INSPECTING_NOTES } # must be connected to signal quit_and_hidden @onready var notes_bg = %NotesBG as TextureRect @onready var prop_bg = %PropBG as TextureRect @onready var origin_texture = %OriginPropTexture as TextureRect @onready var full_texture = %FullTexture as TextureRect @onready var content_label = %ContentLabel as Label @onready var tip_label = %TipLabel as Label var tip_cover = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_阅读") var tip_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_收起") var texture_cover: Texture2D var texture_notes: Texture2D var status := STATUS_HIDDEN var blinking_tween: Tween # Called when the node enters the scene tree for the first time. func _ready() -> void: tip_label.text = tip_cover if Engine.is_editor_hint(): return visible = false layer = GlobalConfig.CANVAS_LAYER_PROP_INSPECTOR origin_texture.modulate.a = 0.0 prop_bg.modulate.a = 0.0 full_texture.modulate.a = 0.0 content_label.modulate.a = 0.0 tip_label.modulate.a = 0.0 func _hide(): status = STATUS_HIDDEN var tween = create_tween() tween.tween_property(origin_texture, "modulate:a", 0.0, 0.3) tween.parallel().tween_property(full_texture, "modulate:a", 0.0, 0.3) tween.parallel().tween_property(content_label, "modulate:a", 0.0, 0.15) if blinking_tween and blinking_tween.is_running(): blinking_tween.stop() tween.parallel().tween_property(tip_label, "modulate:a", 0.0, 0.15) tween.tween_callback(_post_hide) SceneManager.release_player() func _post_hide(): origin_texture.texture = null full_texture.texture = null texture_cover = null texture_notes = null content_label.text = "" tip_label.text = tip_cover notes_bg.visible = false visible = false quit_and_hidden.emit() func _blink_label(init := true): if status == STATUS_HIDDEN: return blinking_tween = create_tween() if init: blinking_tween.tween_property(tip_label, "modulate:a", 0.8, 2.0) blinking_tween.tween_callback(_blink_label.bind(false)) else: blinking_tween.tween_property(tip_label, "modulate:a", 0.5, 1.0) blinking_tween.tween_callback(_blink_label.bind(true)) func pop_standard_inspection(cover_texture, notes_texture, inspection_note, centered := false): if centered: content_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER else: content_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_LEFT if status != STATUS_HIDDEN: _hide() status = STATUS_INSPECTING_COVER visible = true full_texture.texture = cover_texture texture_cover = cover_texture texture_notes = notes_texture content_label.text = inspection_note SceneManager.freeze_player(0) var tween = create_tween() tween.tween_property(full_texture, "modulate:a", 1.0, 0.15) tip_label.text = tip_cover _blink_label() func pop_prop_inspection(prop_key: String, cover_texture: Texture2D, use_default_bg := false): if status != STATUS_HIDDEN: _hide() if not cover_texture: push_error("PropInspector: cover_texture is not set") return status = STATUS_INSPECTING_PROP visible = true var tween = create_tween() if use_default_bg: prop_bg.visible = true origin_texture.texture = cover_texture full_texture.texture = null tween.tween_property(origin_texture, "modulate:a", 1.0, 0.15) tween.tween_property(prop_bg, "modulate:a", 1.0, 0.15) else: origin_texture.texture = null full_texture.texture = cover_texture tween.tween_property(full_texture, "modulate:a", 1.0, 0.15) content_label.text = "" tip_label.text = "" # 显示道具获得提示 if prop_key: var obtain_str = tr("ui_获得") var prop_title = tr(prop_key) # var detail = tr(prop_key + "_说明") var text = "~ title\n" + obtain_str + ": " + prop_title text += "[#item]\n=> END" var prop_res = DialogueManager.create_resource_from_text(text) var balloon = preload("res://scene/dialog/balloon.tscn").instantiate() # 手动跳过的同时隐藏 balloon.manually_skipped_line.connect(_hide) DialogueManager.show_dialogue_balloon_scene(balloon, prop_res, "title") SceneManager.freeze_player(0) func _unhandled_input(event: InputEvent) -> void: if status == STATUS_HIDDEN: return if event.is_action_pressed("cancel"): get_viewport().set_input_as_handled() _hide() if event.is_action_pressed("interact"): get_viewport().set_input_as_handled() # STATUS_INSPECTING_COVER 与 STATUS_INSPECTING_NOTES 之间互相切换 if status == STATUS_INSPECTING_COVER: # inspect notes status = STATUS_INSPECTING_NOTES if not texture_notes: notes_bg.visible = true else: full_texture.texture = texture_notes tip_label.text = tip_notes create_tween().tween_property(content_label, "modulate:a", 1.0, 0.2) elif status == STATUS_INSPECTING_NOTES: # inspect cover status = STATUS_INSPECTING_COVER notes_bg.visible = false full_texture.texture = texture_cover tip_label.text = tip_cover create_tween().tween_property(content_label, "modulate:a", 0.0, 0.2) # STATUS_INSPECTING_PROP 直接退出 elif status == STATUS_INSPECTING_PROP: _hide()