54 lines
1.2 KiB
GDScript
54 lines
1.2 KiB
GDScript
extends BuildingPart
|
|
class_name Producer
|
|
|
|
@export var produced_item: Item
|
|
@export var output_period: float = 0.1
|
|
@export var max_outputs: int = 1
|
|
@export var consumers: Array[Consumer]
|
|
|
|
var last_consumer_idx: int = 0
|
|
#var output_timer: float = 0.0
|
|
#var output_item: Item
|
|
|
|
#func _process(delta: float) -> void:
|
|
#output_timer += delta
|
|
#if output_timer >= output_period:
|
|
#output_timer -= output_period
|
|
#output()
|
|
func can_produce() -> bool:
|
|
return can_send_item(produced_item)
|
|
|
|
func produce() -> bool:
|
|
return send_item(produced_item)
|
|
|
|
func can_send_item(item: Item) -> bool:
|
|
if !enabled:
|
|
return false
|
|
for consumer in consumers:
|
|
if consumer.can_accept_item(item):
|
|
return true
|
|
return false
|
|
|
|
func send_item(item: Item) -> bool:
|
|
if !enabled:
|
|
return false
|
|
if consumers.is_empty():
|
|
return false
|
|
var start_idx: int = last_consumer_idx
|
|
var first_try: bool = true
|
|
var idx: int = start_idx
|
|
while idx != start_idx or first_try:
|
|
idx += 1
|
|
if idx >= consumers.size():
|
|
idx = 0
|
|
first_try = false
|
|
|
|
var consumer: Consumer = consumers[idx]
|
|
var accepted: bool = consumer.offer_item(item)
|
|
if accepted:
|
|
last_consumer_idx = idx
|
|
return true
|
|
return false
|
|
|
|
|