TowerGame/objects/units/citizen.gd

76 lines
2.1 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
enum WorkStatus { NONE, CONSTRUCTING_BUILDING }
var work_status: WorkStatus
var work_building: Building = null
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
if work_status == WorkStatus.CONSTRUCTING_BUILDING:
work_building.build_progress += delta
if work_building.build_state == Building.BuildState.READY:
send_task_update(TaskStatus.DONE)
elif work_building.build_state != Building.BuildState.BUILDING:
send_task_update(TaskStatus.IMPOSSIBLE)
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:
work_building = building
work_status = WorkStatus.CONSTRUCTING_BUILDING
var ok: bool = await wait_for_task_update() == TaskStatus.DONE
work_building = null
work_status = WorkStatus.NONE
return ok