Files
2026-05-02 20:03:54 -03:00

72 lines
1.8 KiB
GDScript

extends Node2D
var _blinking = null:
set = _set_blinking
@onready var _animation_player: AnimationPlayer = $AnimationPlayer
@onready var _blinking_timer: Timer = $BlinkTimer
@onready var _closed_eyes_timer: Timer = $ClosedTimer
@onready var _left_eye: Sprite2D = $LeftEye
@onready var _right_eye: Sprite2D = $RightEye
var eyes_textures = {
"open": preload("./texture/parts/eye_open.png"),
"closed": preload("./texture/parts/eye_close.png"),
}
var current_face = null:
set = _set_face
func _ready() -> void:
_blinking_timer.timeout.connect(_on_blink_timer_timeout)
_set_blinking(true)
current_face = "default"
func _set_blinking(value: bool) -> void:
_blinking = value
if _blinking:
_blinking_timer.start()
else:
_blinking_timer.stop()
func _on_blink_timer_timeout() -> void:
# Play secondary action rather than blink
if randf_range(0.0, 1.0) > 0.9:
_animation_player.play("look_around")
await _animation_player.animation_finished
else:
# Close eyes
_set_eyes("closed")
_closed_eyes_timer.start(randf_range(0.1, 0.25))
await _closed_eyes_timer.timeout
# Return to current eyes
_set_eyes("open")
if randf_range(0.0, 1.0) > 0.8:
_blinking_timer.wait_time = randf_range(0.1, 0.15)
else:
_blinking_timer.wait_time = randf_range(1.0, 4.0)
_blinking_timer.start()
func _set_eyes(eyes_name: String) -> void:
_left_eye.texture = eyes_textures[eyes_name]
_right_eye.texture = eyes_textures[eyes_name]
func _set_face(face_name: String) -> void:
if current_face == face_name:
return
current_face = face_name
_animation_player.play("RESET")
_animation_player.seek(0.0, true)
if face_name == "default":
_set_blinking(true)
return
_set_blinking(false)
if !_animation_player.has_animation(face_name):
push_error("Can't set GDBot's face to: '" + face_name + "'")
return
_animation_player.play(face_name)