TowerGame/scripts/units/citizen.gd

64 lines
1.7 KiB
GDScript

extends Unit
class_name Citizen
@onready var body: Sprite3D = $Body
@onready var hands: Sprite3D = $Body/Hands
var task: Task = null
var working: bool = false
func _ready() -> void:
held_item_meshinstance = $"Body/Hands/Held Item"
func _process(delta: float) -> void:
super(delta)
var camera: Camera3D
if Engine.is_editor_hint():
camera = EditorInterface.get_editor_viewport_3d(0).get_camera_3d()
else:
camera = get_viewport().get_camera_3d()
var facing_direction: Vector3 = -global_basis.z
var camera_local_facing: Vector3 = facing_direction * camera.global_basis
var facing_away: bool = camera_local_facing.z < 0
var facing_right: bool = camera_local_facing.x > 0
body.frame = 1 if facing_away else 0
#hands.frame = 1 if facing_away else 0
body.flip_h = facing_right
hands.flip_h = facing_right
if !working and task != null:
working = true
var ok: bool = await task.execute(self)
if !ok:
CitizenManager._instance.add_task(task)
task = null
working = false
func assign_task(t: Task) -> void:
task = t
func is_idle() -> bool:
return task == null
func put_item_in_building_materials(building: Building) -> bool:
building._add_build_material(held_item)
held_item = null
return true
func put_item_in_building_storage(building: Building) -> bool:
if building.consumer == null:
return false
if !building.consumer.offer_item(held_item):
return false
held_item = null
return true
func build_building(building: Building) -> bool:
var build_action: UnitAction.BuildAction = UnitAction.BuildAction.new()
build_action.building = building
action = build_action
var ok: bool = await wait_for_task_update() == TaskStatus.DONE
return ok