Files
Kalulu/sources/minigames/jellyfish/jellyfish.gd
T
2025-09-18 15:26:44 +02:00

132 lines
3.5 KiB
GDScript

@tool
class_name Jellyfish
extends Control
signal pressed(stimulus: Dictionary)
enum Colors {
Red,
Green,
}
const ANIMATIONS_BODY: Array[SpriteFrames] = [
preload("res://sources/minigames/jellyfish/blue_jellyfish_animations_body.tres"),
preload("res://sources/minigames/jellyfish/pink_jellyfish_animations_body.tres"),
]
const ANIMATIONS_ARMS: Array[SpriteFrames] = [
preload("res://sources/minigames/jellyfish/blue_jellyfish_animations_arms.tres"),
preload("res://sources/minigames/jellyfish/pink_jellyfish_animations_arms.tres"),
]
const SCALES: Array[Vector2] = [
Vector2(1.,1.),
Vector2(1.25, 1.25)
]
const SCALE_FACTOR: float = 0.2
@export var color: int = Colors.Red:
set(value):
color = value
if animated_sprite_body:
animated_sprite_body.sprite_frames = ANIMATIONS_BODY[color]
else:
Log.error("Jellyfish: no animated sprite body")
if animated_sprite_arms:
animated_sprite_arms.sprite_frames = ANIMATIONS_ARMS[color]
else:
Log.error("Jellyfish: no animated sprite arms")
scale = SCALES[color] * (1. + randf() * SCALE_FACTOR)
# Handles sprite size
sprite_control.resized.emit()
var stimulus: Dictionary = {}:
set(value):
stimulus = value
if label:
if value.has("Grapheme"):
label.text = value.Grapheme
else:
label.text = ""
@onready var sprite_control: SpriteControl = $SpriteControl
@onready var animated_sprite_body: AnimatedSprite2D = %AnimatedSprite2D_Body
@onready var animated_sprite_arms: AnimatedSprite2D = %AnimatedSprite2D_Arms
@onready var label: Label = %AutoSizeLabel.get_node("Label")
@onready var highlight_fx: HighlightFX = %HighlightFX
@onready var right_fx: RightFX = %RightFX
@onready var wrong_fx: WrongFX = %WrongFX
@onready var text_box_sprite_2d: Sprite2D = %TextBox_Sprite2D
@onready var text_box_outline_sprite_2d: Sprite2D = %TextBox_Outline_Sprite2D
func _ready() -> void:
stimulus = stimulus
var rand: float = randf()
color = Colors.Red if rand < 0.7 else Colors.Green
var rand_frame: int = randi_range(0, animated_sprite_body.sprite_frames.get_frame_count("idle") - 1)
animated_sprite_body.frame = rand_frame
animated_sprite_arms.frame = rand_frame
idle()
func is_idle() -> bool:
return animated_sprite_body.animation == "idle"
func happy() -> void:
play_animation_by_name("happy")
func idle() -> void:
play_animation_by_name("idle")
func hit() -> void:
play_animation_by_name("hit")
func play_animation_by_name(animation_name: String) -> void:
animated_sprite_body.play(animation_name)
animated_sprite_arms.play(animation_name)
func highlight() -> void:
highlight_fx.play()
func stop_highlight() -> void:
highlight_fx.stop()
func right() -> void:
label.label_settings = label.label_settings.duplicate()
label.label_settings.font_color = Color("#009444")
text_box_sprite_2d.self_modulate = Color("#e6f3e0")
text_box_outline_sprite_2d.self_modulate = Color("#009344")
text_box_outline_sprite_2d.visible = true
right_fx.play()
await right_fx.finished
func wrong() -> void:
label.label_settings = label.label_settings.duplicate()
label.label_settings.font_color = Color("#be1e2d")
text_box_sprite_2d.self_modulate = Color("#fce6e6")
text_box_outline_sprite_2d.self_modulate = Color("#be1e2d")
text_box_outline_sprite_2d.visible = true
wrong_fx.play()
await wrong_fx.finished
func _on_gui_input(event: InputEvent) -> void:
if event.is_action_pressed("left_click"):
pressed.emit(stimulus)
func delete() -> void:
var tween: Tween = create_tween()
tween.tween_property(self, "modulate:a", 0, 2)
await tween.finished
queue_free()