65 lines
1.6 KiB
GDScript
65 lines
1.6 KiB
GDScript
extends Area2D
|
|
class_name DragonEntity
|
|
|
|
|
|
@export var dragon: DragonSprite
|
|
@export_range(3, 20) var animation_duration: float
|
|
|
|
@export var min_exit_time: float
|
|
@export var max_exit_time: float
|
|
|
|
signal on_pick(properties: DragonProperties)
|
|
signal on_quit(dragon_id: int)
|
|
|
|
var rng: RandomNumberGenerator = RandomNumberGenerator.new()
|
|
var properties: DragonProperties
|
|
|
|
var _start_position: Vector2
|
|
|
|
var _is_flying: bool = false
|
|
|
|
|
|
func _ready() -> void:
|
|
set_process_input(true)
|
|
|
|
|
|
func _queue_exit():
|
|
if not _is_flying:
|
|
dragon.play_idle()
|
|
await get_tree().create_timer(rng.randf_range(min_exit_time, max_exit_time)).timeout
|
|
if not _is_flying:
|
|
dragon.play_walk()
|
|
dragon.walk_right()
|
|
var tween: Tween = get_tree().create_tween()
|
|
tween.tween_property($CollisionShape2D, "position", _start_position, animation_duration)
|
|
tween.tween_callback(_proceed_exit)
|
|
|
|
|
|
func _proceed_exit():
|
|
on_quit.emit(properties.id)
|
|
queue_free()
|
|
|
|
|
|
func play_initial_animation(start_spot: Node2D) -> void:
|
|
if get_parent().position.y < 150:
|
|
_is_flying = true
|
|
dragon.play_fly()
|
|
|
|
$CollisionShape2D.position = start_spot.position
|
|
_start_position = start_spot.position
|
|
var tween = get_tree().create_tween()
|
|
tween.tween_property($CollisionShape2D, "position", Vector2(0, 0), animation_duration)
|
|
tween.tween_callback(_queue_exit)
|
|
|
|
|
|
func _input_event(_viewport, event, _shape_idx) -> void:
|
|
if event is InputEventMouseButton \
|
|
and event.button_index == MOUSE_BUTTON_LEFT \
|
|
and event.is_pressed():
|
|
properties.position = global_position + $CollisionShape2D.position
|
|
on_pick.emit(properties)
|
|
queue_free()
|
|
|
|
|
|
func dress(properties: DragonProperties):
|
|
dragon.dress(properties)
|