diff --git a/actors/base_actor/base_actor.gd b/actors/base_actor/base_actor.gd index 93354be..69c1e9a 100644 --- a/actors/base_actor/base_actor.gd +++ b/actors/base_actor/base_actor.gd @@ -2,7 +2,7 @@ extends Node3D class_name Actor -enum ACTOR_STATE {INACTIVE, ACTIVE} +enum ACTOR_STATE {INACTIVE, ACTIVE, IDLE} var actor_state = null: set = state_change @@ -17,6 +17,12 @@ var time = 0 var current_tile = null: set = change_current_tile var current_room = null +var lookup_actor_to_task = [] +var current_task: Dictionary + + +@onready var task_creator: TaskCreator = $TaskCreator + signal current_tile_request func state_change(state): @@ -24,22 +30,47 @@ func state_change(state): match state: ACTOR_STATE.ACTIVE: $SelfMesh.set_material_override(red) - next_step = Vector3(1, 0, 1) - + ACTOR_STATE.IDLE: + if lookup_actor_to_task: + current_task = lookup_actor_to_task[0] + else: + var target = Vector3i(randi_range(1, 32), 0, randi_range(1, 32)) + $SelfMesh.set_material_override(null) + task_creator.create_task( + self, + self, + target, + ) + +#func task_check(): + #if lookup_actor_to_task: + #current_task = lookup_actor_to_task[0] + #next_step = current_task.location + #actor_state = ACTOR_STATE.ACTIVE func _process(delta: float) -> void: #var velocity = Vector3.ZERO - if actor_state == ACTOR_STATE.ACTIVE: - - get_current_tile() - - if next_step: - if self.position.distance_to(next_step) > .1: - #velocity = self.position.direction_to(next_step) * temp_speed - position = lerp(next_step, self.position, 0.995) - else: - actor_state = ACTOR_STATE.INACTIVE + match actor_state: + ACTOR_STATE.ACTIVE: + get_current_tile() + + if next_step: + if self.position.distance_to(next_step) > 1: + #velocity = self.position.direction_to(next_step) * temp_speed + position = lerp(Vector3(next_step), self.position, 0.995) + else: + var completed_task = lookup_actor_to_task.pop_front() + current_task = {} + task_creator.complete_task(self, completed_task) + actor_state = ACTOR_STATE.IDLE + + ACTOR_STATE.IDLE: + if lookup_actor_to_task: + current_task = lookup_actor_to_task[0] + next_step = current_task.location + actor_state = ACTOR_STATE.ACTIVE + pass func get_current_tile(): emit_signal("current_tile_request", self) diff --git a/actors/base_actor/base_actor.tscn b/actors/base_actor/base_actor.tscn index c1b3fd7..6cc5428 100644 --- a/actors/base_actor/base_actor.tscn +++ b/actors/base_actor/base_actor.tscn @@ -1,11 +1,14 @@ -[gd_scene load_steps=3 format=3 uid="uid://jcmf542by4e6"] +[gd_scene load_steps=4 format=3 uid="uid://jcmf542by4e6"] [ext_resource type="Script" uid="uid://dilighbu5t233" path="res://actors/base_actor/base_actor.gd" id="1_fkyrj"] +[ext_resource type="PackedScene" uid="uid://btpcj4sv1qgck" path="res://task_creator.tscn" id="2_onjxy"] [sub_resource type="CapsuleMesh" id="CapsuleMesh_wghh8"] [node name="BaseActor" type="Node3D"] script = ExtResource("1_fkyrj") +[node name="TaskCreator" parent="." instance=ExtResource("2_onjxy")] + [node name="SelfMesh" type="MeshInstance3D" parent="."] mesh = SubResource("CapsuleMesh_wghh8") diff --git a/places/base_place/base_place.gd b/places/base_place/base_place.gd index 9a4aaa9..6912f80 100644 --- a/places/base_place/base_place.gd +++ b/places/base_place/base_place.gd @@ -8,6 +8,8 @@ var load_room = preload("res://places/base_place/base_room.tscn") var load_door = preload("res://tiles/base_tile/base_door.tscn") var load_actor = preload("res://actors/base_actor/base_actor.tscn") +@onready var task_list: Node = $TaskList + #Contains all tiles in a workplace. var lookup_place_to_tile: Dictionary = {} #Contains all rooms in a workplace. @@ -326,7 +328,7 @@ func confirm_object(): current_object.lookup_door_to_tile[tile_2] = tile_2_door_face elif current_object is Actor: - current_object.actor_state = Actor.ACTOR_STATE.ACTIVE + current_object.actor_state = Actor.ACTOR_STATE.IDLE current_room = null current_placement = [] @@ -358,3 +360,13 @@ func give_tile(actor): func _on_actor_container_child_entered_tree(node: Node) -> void: node.connect("current_tile_request", give_tile) + if node.has_node("TaskCreator"): + var tasker = node.get_node("TaskCreator") + tasker.connect("record_task", record_task) + tasker.connect("finish_task", finish_task) + +func record_task(task): + task_list.record_task(task) + +func finish_task(source, task): + task_list.finish_task(source, task) diff --git a/places/base_place/base_place.tscn b/places/base_place/base_place.tscn index 4169129..e01afe2 100644 --- a/places/base_place/base_place.tscn +++ b/places/base_place/base_place.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=2 format=3 uid="uid://bujuwgn3y42ek"] +[gd_scene load_steps=3 format=3 uid="uid://bujuwgn3y42ek"] [ext_resource type="Script" uid="uid://n4vvqmlmq5fp" path="res://places/base_place/base_place.gd" id="1_uq3a8"] +[ext_resource type="Script" uid="uid://3tnkke3ugl3t" path="res://places/base_place/task_list.gd" id="2_tkpnh"] [node name="BasePlace" type="Node3D" groups=["SaveObjects"]] script = ExtResource("1_uq3a8") @@ -16,5 +17,8 @@ transform = Transform3D(1, 0, 0, 0, 0.345446, 0.938439, 0, -0.938439, 0.345446, [node name="ActorContainer" type="Node" parent="."] +[node name="TaskList" type="Node" parent="."] +script = ExtResource("2_tkpnh") + [connection signal="child_entered_tree" from="TileContainer" to="." method="_on_tile_container_child_entered_tree"] [connection signal="child_entered_tree" from="ActorContainer" to="." method="_on_actor_container_child_entered_tree"] diff --git a/places/base_place/task_list.gd b/places/base_place/task_list.gd new file mode 100644 index 0000000..a2e9073 --- /dev/null +++ b/places/base_place/task_list.gd @@ -0,0 +1,26 @@ +extends Node + +class_name TaskList + +var unassigned_tasks = [] + +var assigned_task_dict: Dictionary = {} + +func record_task(task): + if task.assignment: + var assignment: Actor = task["assignment"] + var assignment_task_list: Array = [] + assign_task(task, assignment) + #assignment_task_list.append(task) + if not assigned_task_dict.has(assignment): + assigned_task_dict[assignment] = [] + assigned_task_dict[assignment].append(task) + +func finish_task(source, task): + var source_task_array = assigned_task_dict[source] + var finished_task_index = source_task_array.find(task) + var finished_task = source_task_array.pop_at(finished_task_index) + print(finished_task) + +func assign_task(task, assignment: Actor): + assignment.lookup_actor_to_task.append(task) diff --git a/places/base_place/task_list.gd.uid b/places/base_place/task_list.gd.uid new file mode 100644 index 0000000..4392578 --- /dev/null +++ b/places/base_place/task_list.gd.uid @@ -0,0 +1 @@ +uid://3tnkke3ugl3t diff --git a/places/place_manager.gd b/places/place_manager.gd index 2882667..025e3d8 100644 --- a/places/place_manager.gd +++ b/places/place_manager.gd @@ -94,9 +94,3 @@ func _on_area_3d_input_event(_camera, _event, event_position, _normal, _shade_id emit_signal("room_built") else: place.hover_object(event_position) - - - - - - pass # Replace with function body. diff --git a/task_creator.gd b/task_creator.gd new file mode 100644 index 0000000..3b071d3 --- /dev/null +++ b/task_creator.gd @@ -0,0 +1,33 @@ +extends Node + +class_name TaskCreator + +signal record_task +signal finish_task + +var task_list = null + +func _ready(): + pass + +func create_task( + source: Object, + assignment = null, + location = null, + interaction = null, + urgency = null, +): + var task: Dictionary = { + "source": source, + "assignment": assignment, + "location": location, + "interaction": interaction, + "urgency": urgency, + } + emit_signal("record_task", task) + +func complete_task( + source, + task +): + emit_signal("finish_task", source, task) diff --git a/task_creator.gd.uid b/task_creator.gd.uid new file mode 100644 index 0000000..cc393f8 --- /dev/null +++ b/task_creator.gd.uid @@ -0,0 +1 @@ +uid://crchqrpts6q1i diff --git a/task_creator.tscn b/task_creator.tscn new file mode 100644 index 0000000..f85f787 --- /dev/null +++ b/task_creator.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://btpcj4sv1qgck"] + +[ext_resource type="Script" uid="uid://crchqrpts6q1i" path="res://task_creator.gd" id="1_atcl4"] + +[node name="TaskCreator" type="Node"] +script = ExtResource("1_atcl4")