xiandie/scene/prop/prop_inspector.gd

197 lines
6.0 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@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():
if status == STATUS_HIDDEN:
return
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))
# 如果没有 notes_texture自动使用黑色遮罩
func pop_standard_inspection(
cover_texture, notes_texture, inspection_note, centered := false, wide := 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
if wide:
content_label.custom_minimum_size.x = 250
else:
content_label.custom_minimum_size.x = 150
# # shrink back
# content_label.size.x = 150
content_label.text = inspection_note.replace("<br>", "\n").strip_edges()
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()
var balloon
func pop_prop_inspection(
prop_key: String, cover_texture: Texture2D, use_default_bg: bool, display_words_only: bool
):
if status != STATUS_HIDDEN and status != STATUS_INSPECTING_PROP:
_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 text = "~ title\n"
if not display_words_only:
text += obtain_str + ": " + prop_title + "[#item]\n"
# 道具的一句话说明
text += tr(prop_key + "_说明").replace("<br>", "\n").strip_edges() + "\n"
text += "=> END"
var current_prop_res = DialogueManager.create_resource_from_text(text)
# 手动跳过的同时显示下一句
if is_instance_valid(balloon):
balloon.queue_free()
else:
DialogueManager.dialogue_ended.connect(
_on_inspecting_prop_words_ended, CONNECT_ONE_SHOT
)
balloon = preload("res://scene/dialog/balloon.tscn").instantiate()
DialogueManager.show_dialogue_balloon_scene(balloon, current_prop_res, "title")
SceneManager.freeze_player(0)
func _on_inspecting_prop_words_ended(_res):
_hide()
func _show_prop_words(line_id: String):
# 如果手动退出 ballon同时退出 prop inspector
if line_id == "3":
_hide()
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)
elif status == STATUS_INSPECTING_PROP:
# # STATUS_INSPECTING_PROP 直接退出
# # 因为 input 优先被 ballon 获得,然后被 inspector 获得
# # 所以此时必然没有 ballon 存在
_hide()