xiandie/util/util.gd

61 lines
1.7 KiB
GDScript

extends Node
#### Timer
func wait(duration: float) -> void:
if duration <= 0:
return
await get_tree().create_timer(duration).timeout
func timer(duration: float, callable: Callable) -> SceneTreeTimer:
var t = get_tree().create_timer(duration, false)
t.timeout.connect(callable)
return t
#### Canvas
func shake_layer(layer: CanvasLayer, duration: float, delta := 2.0, fps := 20.0) -> void:
var tween = layer.create_tween()
# shake layer's offset
var origin_offset = layer.offset
var count = int(duration * fps)
var delta_t = 1.0 / fps
for i in range(count):
var offset = Vector2(randf_range(-delta, delta), randf_range(-delta, delta))
tween.tween_property(layer, "offset", origin_offset + offset, delta_t)
# tween back to origin
tween.tween_property(layer, "offset", origin_offset, delta_t)
###### Dialogue
func concact_content_from_lines(lines := []):
if lines.is_empty():
return ""
var content = ""
for i in range(len(lines) - 1):
var line = lines[i] as DialogueLine
content += TranslationServer.tr(line.translation_key) + "\n"
# last line without "\n"
content += TranslationServer.tr(lines[-1].translation_key)
return content
func get_lines(res: DialogueResource, title: String) -> Array:
var lines = []
var current_line = await res.get_next_dialogue_line(title)
while current_line:
lines.append(current_line)
if current_line.next_id != "end":
current_line = await res.get_next_dialogue_line(current_line.next_id)
else:
break
return lines
# pop os lines
func generate_lines(content: String) -> Array:
var text = "~ title\n" + content + "\n=> END"
var res = DialogueManager.create_resource_from_text(text)
return await get_lines(res, "title")