extends Node2D @export var leaf_texture: Texture2D @export var spawn_markers: Node2D @export var destination_markers: Node2D @export_range(0.0, 60.0) var minimum_schedule_gap := 20.0 @export_range(1.0, 61.0) var maximum_schedule_gap := 60.0 var _spawn_markers: Array[Marker2D] = [] var _destination_markers: Array[Marker2D] = [] var _spawn_schedule := 0.0 var _spawn_timer := 0.0 # Private Methods func _ready() -> void: for child in spawn_markers.get_children(): _spawn_markers.append(child) for child in destination_markers.get_children(): _destination_markers.append(child) _set_random_spawn_schedule() # At spawn, we might want to spawn some leaves sooner... _spawn_schedule -= randf_range(0.0, _spawn_schedule) _spawn_schedule = max(0, _spawn_schedule) print("%s - Leaf Spawn Schedule: %f" % [get_parent().name, _spawn_schedule]) func _process(delta: float) -> void: _spawn_timer += delta if _spawn_timer >= _spawn_schedule: _spawn_timer = 0.0 _set_random_spawn_schedule() var spawn := _get_random_spawn_point() var destination := _get_random_destination_point() # TODO Refactor this into scene var sprite := Sprite2D.new() sprite.texture = leaf_texture sprite.position = spawn sprite.rotate(deg_to_rad(randf_range(0, 360))) var tween := get_tree().create_tween().tween_property(sprite, "position", destination, randf_range(2.0, 3.0)) tween.finished.connect( func(): var timer := get_tree().create_timer(randf_range(8.0, 15.0)) timer.timeout.connect( func(): if !sprite: return var tween2 := get_tree().create_tween().tween_property(sprite, "self_modulate:a", 0.0, randf_range(4.0, 6.0)) tween2.finished.connect( func(): if !sprite: return sprite.queue_free() ) ) ) add_child(sprite) func _set_random_spawn_schedule() -> void: _spawn_schedule = randf_range(minimum_schedule_gap, maximum_schedule_gap) func _get_random_spawn_point() -> Vector2: var idx := randi_range(0, len(_spawn_markers) - 1) var marker := _spawn_markers[idx] return marker.position func _get_random_destination_point() -> Vector2: var idx := randi_range(0, len(_destination_markers) - 1) var marker := _destination_markers[idx] var offset := Vector2(randf_range(-5.0, 5.0), randf_range(-5.0, 5.0)) return marker.position + offset