mirror of
https://github.com/Steffo99/hella-farm.git
synced 2024-11-24 17:14:23 +00:00
35 lines
757 B
GDScript3
35 lines
757 B
GDScript3
|
extends Node
|
||
|
class_name SpawnerChoice
|
||
|
|
||
|
|
||
|
@export var spawners: Array[Spawner] = []
|
||
|
@export var weights: Array[int] = []
|
||
|
|
||
|
|
||
|
func compute_total_weight() -> int:
|
||
|
var total = 0
|
||
|
for weight in weights:
|
||
|
if weight < 0:
|
||
|
Log.e(self, "Weight with negative value detected.")
|
||
|
total += weight
|
||
|
return total
|
||
|
|
||
|
func select_spawner() -> Spawner:
|
||
|
var total = compute_total_weight()
|
||
|
var sampled = Random.rng.randi_range(0, total - 1)
|
||
|
var idx = -1
|
||
|
while sampled >= 0:
|
||
|
idx += 1
|
||
|
sampled -= weights[idx]
|
||
|
return spawners[idx]
|
||
|
|
||
|
func spawn():
|
||
|
select_spawner().spawn()
|
||
|
|
||
|
|
||
|
func _ready():
|
||
|
if len(spawners) != len(weights):
|
||
|
Log.e(self, "Spawners and weights are different lengths.")
|
||
|
if compute_total_weight() <= 0:
|
||
|
Log.e(self, "Weight total is less or equal to 0.")
|