35 lines
1.1 KiB
GDScript
35 lines
1.1 KiB
GDScript
extends Resource
|
|
class_name SpawnPattern
|
|
|
|
@export var min_distance: int
|
|
@export var max_distance: int
|
|
@export var min_spread: int
|
|
@export var quantity: int
|
|
@export var cluster_size: int
|
|
|
|
func get_spawn_locations() -> Array[Vector2i]:
|
|
var spawns: Array[Vector2i] = []
|
|
var clusters: Array[Vector2] = []
|
|
for cluster_i in range(quantity):
|
|
var cluster
|
|
var is_valid_cluster := false
|
|
while not is_valid_cluster:
|
|
is_valid_cluster = true
|
|
var dist = randf_range(min_distance, max_distance)
|
|
var angle = randf_range(0, 2*PI)
|
|
cluster = Vector2.RIGHT.rotated(angle)
|
|
cluster *= dist
|
|
for old_cluster: Vector2 in clusters:
|
|
is_valid_cluster = is_valid_cluster and old_cluster.distance_to(cluster) > min_spread
|
|
clusters.append(cluster)
|
|
|
|
var local_spawns = [Vector2i(cluster)]
|
|
for point in range(cluster_size - 1):
|
|
var next = local_spawns.pick_random()
|
|
while local_spawns.has(next):
|
|
var next_change = [Vector2i.LEFT, Vector2i.RIGHT, Vector2i.UP, Vector2i.DOWN].pick_random()
|
|
next = next + next_change
|
|
local_spawns.append(next)
|
|
spawns.append_array(local_spawns)
|
|
return spawns
|