La-Torreta-del-Drac/scenes/dragon_list/dragon_list_view.gd

90 lines
2.2 KiB
GDScript

extends Window
class_name DragonList
var _library: DragonLibrary
var _dragons: Array[DragonListEntry]
@export var dragon_list_entry_template: PackedScene
@export var dragon_list_pivot: Node2D
@onready var dragger: DraggableWindow = $CanvasLayer/Dragger
@export var origin_name_label: Label
@export var dragon_name_label: Label
var _index_showing: int = 0
var _pivot_start_pos: Vector2
func _ready() -> void:
dragger.on_drag.connect(_on_drag)
_pivot_start_pos = dragon_list_pivot.position
func _on_drag(offset: Vector2i):
position += offset
func set_library(library: DragonLibrary):
_library = library
for i in len(_library.dragons):
_instantiate_dragon(_library.dragons[i], i)
_play_idle_animations()
_show_dragon(library.dragons[0])
func _instantiate_dragon(dragon: DragonProperties, offset_step: int):
var instance: DragonListEntry = dragon_list_entry_template.instantiate()
dragon_list_pivot.add_child(instance)
instance.position.x += offset_step * 110
_dragons.push_back(instance)
func _show_dragon(dragon: DragonProperties):
origin_name_label.text = dragon.origin
dragon_name_label.text = dragon.name
func _on_close_pressed() -> void:
queue_free()
func _on_dragon_previous_pressed() -> void:
if _index_showing == 0:
return
_index_showing -= 1
_move_to_position(-110 * _index_showing)
_show_dragon(_library.dragons[_index_showing])
func _on_dragon_next_pressed() -> void:
if _index_showing == len(_library.dragons) - 1:
return
_index_showing += 1
_move_to_position(-110 * _index_showing)
_show_dragon(_library.dragons[_index_showing])
func _move_to_position(target_position: int):
var tween = create_tween()
_play_walk_animations()
var new_pos: Vector2 = _pivot_start_pos + Vector2(target_position, 0)
_face_direction(new_pos.x < dragon_list_pivot.position.x)
tween.tween_property(dragon_list_pivot, "position", new_pos, 1.0).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
tween.tween_callback(_play_idle_animations)
func _play_idle_animations():
for dragon in _dragons:
dragon.play_animation('idle')
func _play_walk_animations():
for dragon in _dragons:
dragon.play_animation('walk')
func _face_direction(left: bool):
for dragon in _dragons:
dragon.face_direction(left)