extends Node @export var farmers: Array[Node3D] @export var colors: Array[Color] @export var main_anim_player: AnimationPlayer var dress_anim_player: AnimationPlayer func _ready() -> void: if farmers.is_empty(): return for farmer in farmers: if farmer: farmer.hide() var selected_farmer = farmers.pick_random() if selected_farmer: selected_farmer.show() dress_anim_player = selected_farmer.get_node_or_null("AnimationPlayer") if main_anim_player and dress_anim_player: main_anim_player.current_animation_changed.connect(_on_animation_sync) main_anim_player.animation_started.connect(_on_animation_sync) if main_anim_player.current_animation != "": _on_animation_sync(main_anim_player.current_animation) dress_anim_player.seek(main_anim_player.current_animation_position) if colors.size() > 0: var parts_to_color = ["pants", "shirt"] var shared_color = colors.pick_random() for part_name in parts_to_color: var piece_node = _find_mesh_case_insensitive(selected_farmer, part_name) if piece_node: var mat = StandardMaterial3D.new() mat.albedo_color = shared_color piece_node.set_surface_override_material(0, mat) func _on_animation_sync(anim_name: StringName) -> void: if dress_anim_player and dress_anim_player.has_animation(anim_name): dress_anim_player.play(anim_name) dress_anim_player.speed_scale = main_anim_player.speed_scale func _find_mesh_case_insensitive(parent: Node, part_name: String) -> MeshInstance3D: var target = part_name.to_lower() for child in parent.get_children(): if child.name.to_lower().contains(target) and child is MeshInstance3D: return child var found = _find_mesh_case_insensitive(child, target) if found: return found return null