Files
music-spinner/hat_cycler.gd
2026-02-10 06:09:33 +01:00

60 lines
1.4 KiB
GDScript

extends Marker3D
@onready var hat_anchor = self
var current_hat: Node3D
var hat_index := 0
var hat_scenes: Array[PackedScene] = []
@export var hats_folder := "res://hat_scenes/"
@export var cycle_interval := 3.0
func _ready():
load_hat_scenes(hats_folder)
if hat_scenes.size() > 0:
equip_hat(hat_scenes[hat_index])
start_cycling()
else:
push_warning("No hat scenes found in: " + hats_folder)
func load_hat_scenes(path: String):
var dir := DirAccess.open(path)
if dir == null:
push_error("Could not open hat folder: " + path)
return
dir.list_dir_begin()
while true:
var file_name = dir.get_next()
if file_name == "":
break
if dir.current_is_dir():
continue
if file_name.ends_with(".tscn"):
var scene_path = path.path_join(file_name)
var hat_scene = load(scene_path)
if hat_scene is PackedScene:
hat_scenes.append(hat_scene)
dir.list_dir_end()
hat_scenes.sort_custom(func(a, b): return a.resource_path < b.resource_path)
func start_cycling():
var timer = Timer.new()
timer.wait_time = cycle_interval
timer.autostart = true
timer.one_shot = false
timer.timeout.connect(_on_cycle_timeout)
add_child(timer)
func _on_cycle_timeout():
if hat_scenes.size() == 0:
return
hat_index = (hat_index + 1) % hat_scenes.size()
equip_hat(hat_scenes[hat_index])
func equip_hat(scene: PackedScene):
if current_hat:
current_hat.queue_free()
var hat = scene.instantiate()
hat_anchor.add_child(hat)
current_hat = hat