The_Dark_Side_of_Earth/vines_petals/vine.gd
2025-10-03 17:09:51 +02:00

63 lines
2.3 KiB
GDScript

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)