62 lines
1.6 KiB
GDScript
62 lines
1.6 KiB
GDScript
extends Unit
|
|
class_name Citizen
|
|
|
|
signal task_available(task: CitizenManager.Task)
|
|
|
|
var task: CitizenManager.Task = null
|
|
var carried_item: ItemNode = null
|
|
const item_node_scene: PackedScene = preload("res://objects/resource.tscn")
|
|
|
|
func _process(delta: float) -> void:
|
|
super(delta)
|
|
$Body.flip_h = !(facing >= PI/2 or facing <= -PI/2)
|
|
$Arms.flip_h = !(facing >= PI/2 or facing <= -PI/2)
|
|
$Body.z_index = 0 if (facing > 0) else 1
|
|
$Body.frame = 0 if (facing > 0) else 1
|
|
|
|
#target = get_global_mouse_position()
|
|
|
|
|
|
func assign_task(t: CitizenManager.Task):
|
|
task = t
|
|
var ok: bool = await task.execute(self)
|
|
if !ok:
|
|
task_available.emit(task)
|
|
task = null
|
|
|
|
func pickup_item_from_building(item: Item, building: Machine) -> bool:
|
|
if building.fetch_item_from_storage(item, 1):
|
|
var item_node: ItemNode = item_node_scene.instantiate()
|
|
pickup_item_node(item_node)
|
|
item_node.item_type = item
|
|
return true
|
|
return false
|
|
|
|
func store_item_in_contruction_site(construction_site: Building) -> bool:
|
|
if carried_item == null:
|
|
return false
|
|
construction_site.add_build_material(carried_item)
|
|
return true
|
|
|
|
func store_item_in_machine(machine: Machine) -> bool:
|
|
if carried_item == null:
|
|
return false
|
|
if !machine.can_accept_item(carried_item.item_type):
|
|
return false
|
|
return machine.offer_item(carried_item)
|
|
|
|
func pickup_item_node(item_node: ItemNode):
|
|
$Arms.add_child(item_node)
|
|
#item_node.z_index = -1
|
|
item_node.position = Vector2(0,0)
|
|
carried_item = item_node
|
|
|
|
func drop_item_node():
|
|
if carried_item == null:
|
|
return
|
|
carried_item.reparent(get_parent())
|
|
carried_item = null
|
|
|
|
func is_idle() -> bool:
|
|
return task == null
|