class_name Vine extends Node2D var petal_location : Vector2 @export var vine_locations : Array[Vector2] @export var bud_resource : PackedScene @onready var grid : Grid = get_tree().get_root().get_node("main/Earth/Grid") var img_path = "res://vines_petals/vine_active_green.png" func draw_vine(pos1 : Vector2, pos2 : Vector2): var sprite = Sprite2D.new() get_tree().get_root().get_node("main").add_child(sprite) sprite.texture = ResourceLoader.load(img_path) sprite.position = (pos1 + pos2)/2.0 sprite.rotation = (pos1 - pos2).angle() + PI/2 sprite.scale *= (pos1 - pos2).length() * 1 / sprite.texture.get_width() sprite.scale.x = 3 sprite.z_index = -1 func grow_vine_sequence(location1 : Vector2, offset1 : Vector2, location2: Vector2, offset2 : Vector2, num_segments: int, grow_bud = false): var pos1 = grid.get_world_position(location1, offset1) var pos2 = grid.get_world_position(location2, offset2) var positions = [] positions.append(pos1) var segment_length = (pos1 - pos2).length() / num_segments var offsets = generate_random_offsets(num_segments, 0.6 * segment_length) for i in range(num_segments - 1): var t = (i + 1) * 1.0/num_segments var center = t * pos2 + (1 - t) * pos1 var offset = offsets[i + 1] * (pos2 - pos1).normalized().rotated(PI/2) positions.append(center + offset) positions.append(pos2) for i in range(num_segments): draw_vine(positions[i], positions[i+1]) await get_tree().create_timer(0.2).timeout if grow_bud and location2.y > 0: spawn_bud(location2, offset2) func generate_random_offsets(segment_count, max_second_derivative): var differences = [] var last_diff = 0 for i in range(segment_count): var new_diff = last_diff + randf_range(-max_second_derivative, max_second_derivative) differences.append(new_diff) last_diff = new_diff var sum = 0.0 for i in range(segment_count): sum += differences[i] var correction = - sum / segment_count for i in range(segment_count): differences[i] += correction var ret = [] var next_val = 0 for i in range(segment_count): ret.append(next_val) next_val += differences[i] return ret func spawn_bud(location, offset): var bud = bud_resource.instantiate() bud.location = location bud.offset = offset bud.vine = self get_tree().get_root().get_node("main").add_child(bud)