diff --git a/.gitignore b/.gitignore index 0af181c..c026d40 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ # Godot 4+ specific ignores .godot/ /android/ +#limboai ignores +/addons/limboai/ +/demo/ \ No newline at end of file diff --git a/active_scene.tscn b/active_scene.tscn index 1ac2f5e..57f5b92 100644 --- a/active_scene.tscn +++ b/active_scene.tscn @@ -1,56 +1,28 @@ -[gd_scene load_steps=9 format=3 uid="uid://dfa6ep4o53s08"] +[gd_scene load_steps=7 format=3 uid="uid://dfa6ep4o53s08"] [ext_resource type="Script" uid="uid://cci652umkym1f" path="res://test_scene.gd" id="1_8p2cu"] [ext_resource type="PackedScene" uid="uid://cd08dp16bixfv" path="res://guildhall.tscn" id="1_fcxuj"] [ext_resource type="PackedScene" uid="uid://c8ofw6na082gv" path="res://main_panel.tscn" id="2_8p2cu"] [ext_resource type="PackedScene" uid="uid://dly7in8ql1fn4" path="res://quest_log.tscn" id="4_tro8a"] -[ext_resource type="Script" uid="uid://blo7tb5135vfm" path="res://quest_board.gd" id="5_46fpu"] -[ext_resource type="Texture2D" uid="uid://bldpiytpdrge6" path="res://icon.svg" id="5_eenn6"] -[ext_resource type="PackedScene" uid="uid://drrtypncppjps" path="res://quest_board_window.tscn" id="5_uh7v7"] [ext_resource type="Script" uid="uid://bnbljf6u2d3kh" path="res://visitor_spawner.gd" id="6_d0hfk"] +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_d0hfk"] +radius = 15.0 +height = 54.0 + [node name="Active Scene" type="Node2D"] script = ExtResource("1_8p2cu") [node name="Guildhall" parent="." instance=ExtResource("1_fcxuj")] position = Vector2(421, 161) -[node name="NavigationRegion2D" parent="Guildhall" index="0"] -position = Vector2(-8, 25) - -[node name="QuestBoard" type="StaticBody2D" parent="Guildhall/NavigationRegion2D" index="2"] -position = Vector2(942, 31) -input_pickable = true -script = ExtResource("5_46fpu") - -[node name="Sprite2D" type="Sprite2D" parent="Guildhall/NavigationRegion2D/QuestBoard"] -scale = Vector2(1.84375, 0.4375) -texture = ExtResource("5_eenn6") - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Guildhall/NavigationRegion2D/QuestBoard"] -polygon = PackedVector2Array(-118, -28, 118, -28, 118, 28, -118, 29) - -[node name="QuestBoardWindow" parent="Guildhall/NavigationRegion2D/QuestBoard" instance=ExtResource("5_uh7v7")] -position = Vector2i(0, 36) - -[node name="CharacterBody2D" parent="Guildhall" index="1"] -interaction_range = 100.0 - -[node name="NavigationAgent2D" parent="Guildhall/CharacterBody2D" index="1"] -path_desired_distance = 100.0 -target_desired_distance = 75.0 - -[node name="Queue" parent="Guildhall/Receptionist" index="3"] -position = Vector2(-6, 186) -direction = Vector2(0, 1) - -[node name="StateMachine" parent="Guildhall/Receptionist" index="4"] -starting_state = "Advance Queue" +[node name="CollisionShape2D" parent="Guildhall/Sprites/CharacterBody2D" index="0"] +shape = SubResource("CapsuleShape2D_d0hfk") [node name="VisitorSpawner" type="Node2D" parent="Guildhall"] position = Vector2(505, 870) script = ExtResource("6_d0hfk") -total_visitors = 5 +total_visitors = 3 [node name="Timer" type="Timer" parent="Guildhall/VisitorSpawner"] @@ -62,7 +34,7 @@ offset_top = 23.0 offset_right = 1903.0 offset_bottom = 185.0 -[node name="PanelContainer" parent="UI/VBoxContainer" instance=ExtResource("2_8p2cu")] +[node name="MainPanel" parent="UI/VBoxContainer" instance=ExtResource("2_8p2cu")] layout_mode = 2 [node name="Notices" type="Control" parent="UI/VBoxContainer"] @@ -70,7 +42,6 @@ layout_mode = 2 [node name="Quest Log" parent="UI" instance=ExtResource("4_tro8a")] -[connection signal="input_event" from="Guildhall/NavigationRegion2D/QuestBoard" to="Guildhall/NavigationRegion2D/QuestBoard" method="_input_event"] [connection signal="timeout" from="Guildhall/VisitorSpawner/Timer" to="Guildhall/VisitorSpawner" method="_on_timer_timeout"] [editable path="Guildhall"] diff --git a/adventurer.gd b/adventurer.gd index c01b6fd..92ff0ce 100644 --- a/adventurer.gd +++ b/adventurer.gd @@ -1,19 +1,25 @@ class_name Adventurer extends CharacterBody2D -@onready var state_machine : StateMachine = $StateMachine +@onready var bt_player : BTPlayer = $BTPlayer @onready var movement_speed : float = 400.0 @onready var movement_target_position : Vector2 = global_position @onready var nav_agent : NavigationAgent2D = $NavigationAgent2D var data : AdventurerData = null var interaction_target = null +var last_position : Vector2 = Vector2.ZERO +var stuck : bool = false +var stuck_time_remaining : float = 0 @onready var bubble : SpeechBubble = $SpeechBubble @export var interaction_range : float = 75 @export var stop_range : float = 25 +signal navigation_finished() +signal navigation_failed() + func _ready() -> void: - state_machine.actor = self - state_machine.start() + nav_agent.navigation_finished.connect(_on_nav_agent_finished) + pass func _physics_process(delta: float) -> void: if nav_agent.is_navigation_finished(): @@ -23,15 +29,26 @@ func _physics_process(delta: float) -> void: #clear the target #try_interact return - var curr_pos: Vector2 = global_position var next_path_pos: Vector2 = nav_agent.get_next_path_position() velocity = curr_pos.direction_to(next_path_pos) * movement_speed move_and_slide() - + #If they virtually didn't move + if !stuck: + if (global_position - last_position).length_squared() < 5: + stuck = true + stuck_time_remaining = 1 + else: + if stuck_time_remaining > 0: + stuck_time_remaining -= delta + if stuck_time_remaining <= 0: + nav_agent.target_position = global_position + navigation_failed.emit() + last_position = global_position func approach(pos : Vector2) -> void: + stuck = false var rid = get_world_2d().get_navigation_map() var point : Vector2 = NavigationServer2D.map_get_closest_point(rid, pos) set_movement_target(point) @@ -57,3 +74,6 @@ func set_movement_target(target : Vector2) -> void: func show_speech_bubble(bubble_type : String) -> void: bubble.try_show_speech(bubble_type) + +func _on_nav_agent_finished() -> void: + navigation_finished.emit() diff --git a/ai/icons/stopwatch.png b/ai/icons/stopwatch.png new file mode 100644 index 0000000..860d798 Binary files /dev/null and b/ai/icons/stopwatch.png differ diff --git a/ai/icons/stopwatch.png.import b/ai/icons/stopwatch.png.import new file mode 100644 index 0000000..1045bbb --- /dev/null +++ b/ai/icons/stopwatch.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ho4mpdraykbv" +path="res://.godot/imported/stopwatch.png-693f4af9e4bcbeda164482669808a0d8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ai/icons/stopwatch.png" +dest_files=["res://.godot/imported/stopwatch.png-693f4af9e4bcbeda164482669808a0d8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ai/tasks/actions/get_quest.gd b/ai/tasks/actions/get_quest.gd new file mode 100644 index 0000000..b2aada8 --- /dev/null +++ b/ai/tasks/actions/get_quest.gd @@ -0,0 +1,103 @@ +#* +#* use_guild_service.gd +#* +@tool +extends BTAction +## Moves the agent to the specified position, favoring horizontal movement. [br] +## Returns [code]SUCCESS[/code] when close to the target position (see [member tolerance]); +## otherwise returns [code]RUNNING[/code]. + + +enum Phases { + ARRIVE, + QUEUE, + WAIT, + OBTAIN, + COMPLETE +} + +var board : QuestBoard + +var queue : GuildQueue +var wait_time_remaining : float = 0 +var phase : Phases + + +func _generate_name() -> String: + return "Get a Quest" + +func _enter() -> void: + var brd = Guild.hall.board + if !brd: + printerr("Get a Quest: Board not found!") + return + board = brd + queue = board.queue + phase = Phases.ARRIVE + queue.add_member(agent) + agent.approach(queue.get_last_position()) + agent.navigation_finished.connect(_on_navigation_complete) + agent.navigation_failed.connect(_on_navigation_failed) + +func _tick(delta: float) -> Status: + if board == null: + return FAILURE + match(phase): + Phases.ARRIVE: + if wait_time_remaining > 0: + wait_time_remaining -= delta + if wait_time_remaining <= 0: + agent.navigation_finished.connect(_on_navigation_complete) + agent.approach(queue.get_member_position(agent)) + Phases.QUEUE: + pass + Phases.WAIT: + pass + Phases.OBTAIN: + if wait_time_remaining: + wait_time_remaining -= delta + if wait_time_remaining <= 0: + board.interaction_complete.connect(_on_interaction_complete) + board.interact(agent, "quest") + phase = Phases.OBTAIN + Phases.COMPLETE: + return SUCCESS + return RUNNING + +func _on_navigation_complete() -> void: + agent.navigation_finished.disconnect(_on_navigation_complete) + agent.navigation_failed.disconnect(_on_navigation_failed) + queue.advanced.connect(_on_queue_advanced) + phase = Phases.QUEUE + +func _on_navigation_failed() -> void: + wait_time_remaining = randf_range(.5, 2) + agent.navigation_finished.disconnect(_on_navigation_complete) + +func get_quest(): + phase = Phases.OBTAIN + wait_time_remaining = randf_range(2,5) + agent.show_speech_bubble("busy") + +func wait(): + wait_time_remaining = 1 + phase = Phases.WAIT + + +func _on_queue_advanced() -> void: + if queue.front == agent: + queue.advanced.disconnect(_on_queue_advanced) + if board.busy: + wait() + else: + get_quest() + pass + +func _on_interaction_complete() -> void: + board.interaction_complete.disconnect(_on_interaction_complete) + if agent.data.quest != null: + agent.show_speech_bubble("happy", 1.5) + else: + agent.show_speech_bubble("angry", 1.5) + queue.remove_member(agent) + phase = Phases.COMPLETE diff --git a/ai/tasks/actions/get_quest.gd.uid b/ai/tasks/actions/get_quest.gd.uid new file mode 100644 index 0000000..c4cdd6e --- /dev/null +++ b/ai/tasks/actions/get_quest.gd.uid @@ -0,0 +1 @@ +uid://ders6t7axct24 diff --git a/ai/tasks/actions/go_to.gd b/ai/tasks/actions/go_to.gd new file mode 100644 index 0000000..acee1f5 --- /dev/null +++ b/ai/tasks/actions/go_to.gd @@ -0,0 +1,48 @@ +#* +#* go_to.gd +#* +@tool +extends BTAction +## Moves the agent to the specified position, favoring horizontal movement. [br] +## Returns [code]SUCCESS[/code] when close to the target position (see [member tolerance]); +## otherwise returns [code]RUNNING[/code]. + +## Blackboard variable that stores the target position (Vector2) +@export var target_position_var := &"pos" +var wait_time_remaining : float = 0 +var goal_position : Vector2 + +var done : bool + +func _generate_name() -> String: + return "Go to Position: %s" % [LimboUtility.decorate_var(target_position_var)] + +func _enter() -> void: + done = false + goal_position = blackboard.get_var(target_position_var, Vector2.ZERO) + go_to(goal_position) + +func _tick(delta: float) -> Status: + if done: + return SUCCESS + #If we were interrupted, wait a little bit and try again + if wait_time_remaining > 0: + wait_time_remaining -= delta + if wait_time_remaining <= 0: + go_to(goal_position) + return RUNNING + +func go_to(pos : Vector2) -> void: + agent.navigation_finished.connect(_on_navigation_complete) + agent.navigation_failed.connect(_on_navigation_failed) + agent.approach(pos) + +func _on_navigation_complete() -> void: + agent.navigation_finished.disconnect(_on_navigation_complete) + agent.navigation_failed.disconnect(_on_navigation_failed) + done = true + +func _on_navigation_failed() -> void: + wait_time_remaining = randf_range(.5, 2) + agent.navigation_finished.disconnect(_on_navigation_complete) + agent.navigation_failed.disconnect(_on_navigation_failed) diff --git a/ai/tasks/actions/go_to.gd.uid b/ai/tasks/actions/go_to.gd.uid new file mode 100644 index 0000000..f02eb45 --- /dev/null +++ b/ai/tasks/actions/go_to.gd.uid @@ -0,0 +1 @@ +uid://h113xg55h4r8 diff --git a/ai/tasks/actions/use_guild_service.gd b/ai/tasks/actions/use_guild_service.gd new file mode 100644 index 0000000..c2b7164 --- /dev/null +++ b/ai/tasks/actions/use_guild_service.gd @@ -0,0 +1,111 @@ +#* +#* use_guild_service.gd +#* +@tool +extends BTAction +## Moves the agent to the specified position, favoring horizontal movement. [br] +## Returns [code]SUCCESS[/code] when close to the target position (see [member tolerance]); +## otherwise returns [code]RUNNING[/code]. + + +enum Phases { + ARRIVE, + QUEUE, + WAIT, + SERVICE, + COMPLETE +} + +## Blackboard variable that stores the target position (Vector2) +@export var employee_name : String = "" + +## Variable that stores desired speed (float) +@export var service_name : String = "" + +var employee : GuildEmployee +var queue : GuildQueue +var wait_time_remaining : float = 0 +var phase : Phases + + +func _generate_name() -> String: + return "Use Guild Service (%s) - %s" % [ + employee_name, + service_name + ] + +func _enter() -> void: + var emp = Guild.hall.employees.get(employee_name) + if !emp: + printerr("Use Guild Service (%s) - %s, '%s' not found!", employee_name, service_name, employee_name) + return + employee = emp + queue = employee.queue + phase = Phases.ARRIVE + queue.add_member(agent) + agent.approach(queue.get_last_position()) + agent.navigation_finished.connect(_on_navigation_complete) + agent.navigation_failed.connect(_on_navigation_failed) + +func _tick(delta: float) -> Status: + if employee == null: + return FAILURE + match(phase): + Phases.ARRIVE: + if wait_time_remaining > 0: + wait_time_remaining -= delta + if wait_time_remaining <= 0: + agent.navigation_finished.connect(_on_navigation_complete) + agent.approach(queue.get_member_position(agent)) + Phases.QUEUE: + pass + Phases.WAIT: + pass + Phases.SERVICE: + if wait_time_remaining > 0: + wait_time_remaining -= delta + if wait_time_remaining <= 0: + employee.service_provided.connect(_on_service_complete) + employee.interact(agent, service_name) + Phases.COMPLETE: + return SUCCESS + return RUNNING + +func _on_navigation_complete() -> void: + agent.navigation_finished.disconnect(_on_navigation_complete) + agent.navigation_failed.disconnect(_on_navigation_failed) + queue.advanced.connect(_on_queue_advanced) + phase = Phases.QUEUE + +func _on_navigation_failed() -> void: + wait_time_remaining = randf_range(.5, 2) + agent.navigation_finished.disconnect(_on_navigation_complete) + +func use_service(): + phase = Phases.SERVICE + wait_time_remaining = randf_range(2,5) + #TODO: Make them both do the talking emoji + agent.show_speech_bubble("talk") + employee.show_speech_bubble("talk") + +func wait(): + wait_time_remaining = 1 + phase = Phases.WAIT + + +func _on_queue_advanced() -> void: + if queue.front == agent: + queue.advanced.disconnect(_on_queue_advanced) + if employee.busy: + wait() + else: + use_service() + pass + +func _on_service_complete() -> void: + employee.service_provided.disconnect(_on_service_complete) + agent.show_speech_bubble("") + employee.show_speech_bubble("") + queue.remove_member(agent) + phase = Phases.COMPLETE + diff --git a/ai/tasks/actions/use_guild_service.gd.uid b/ai/tasks/actions/use_guild_service.gd.uid new file mode 100644 index 0000000..c20a81b --- /dev/null +++ b/ai/tasks/actions/use_guild_service.gd.uid @@ -0,0 +1 @@ +uid://bsq5dxul0uto diff --git a/ai/tasks/actions/wander.gd b/ai/tasks/actions/wander.gd new file mode 100644 index 0000000..b51e1a4 --- /dev/null +++ b/ai/tasks/actions/wander.gd @@ -0,0 +1,50 @@ +#* +#* go_to.gd +#* +@tool +extends BTAction +## Moves the agent to the specified position, favoring horizontal movement. [br] +## Returns [code]SUCCESS[/code] when close to the target position (see [member tolerance]); +## otherwise returns [code]RUNNING[/code]. + +var wait_time_remaining : float = 0 +var goal_position : Vector2 +var retries : int +var done : bool + +func _generate_name() -> String: + return "Wander to New Position" + +func _enter() -> void: + done = false + retries = 0 + goal_position = NavigationServer2D.region_get_random_point(Guild.hall.nav_region.get_rid(),1,false) + go_to(goal_position) + +func _tick(delta: float) -> Status: + if done: + return SUCCESS + #If we were interrupted, wait a little bit and try again + if wait_time_remaining > 0: + wait_time_remaining -= delta + if wait_time_remaining <= 0: + go_to(goal_position) + return RUNNING + +func go_to(pos : Vector2) -> void: + agent.navigation_finished.connect(_on_navigation_complete) + agent.navigation_failed.connect(_on_navigation_failed) + agent.approach(pos) + +func _on_navigation_complete() -> void: + agent.navigation_finished.disconnect(_on_navigation_complete) + agent.navigation_failed.disconnect(_on_navigation_failed) + done = true + +func _on_navigation_failed() -> void: + wait_time_remaining = randf_range(.5, 2) + retries += 1 + if retries >= 3: + done = true + agent.navigation_finished.disconnect(_on_navigation_complete) + agent.navigation_failed.disconnect(_on_navigation_failed) diff --git a/ai/tasks/actions/wander.gd.uid b/ai/tasks/actions/wander.gd.uid new file mode 100644 index 0000000..5cb2892 --- /dev/null +++ b/ai/tasks/actions/wander.gd.uid @@ -0,0 +1 @@ +uid://767b4fdlrgr diff --git a/ai/tasks/conditions/has_quest.gd b/ai/tasks/conditions/has_quest.gd new file mode 100644 index 0000000..967c7e7 --- /dev/null +++ b/ai/tasks/conditions/has_quest.gd @@ -0,0 +1,7 @@ +extends BTCondition +var invert : bool +func _tick(delta: float) -> Status: + if agent.data and ((agent.data.quest == null) == invert): + return SUCCESS + else: + return FAILURE diff --git a/ai/tasks/conditions/has_quest.gd.uid b/ai/tasks/conditions/has_quest.gd.uid new file mode 100644 index 0000000..58cf852 --- /dev/null +++ b/ai/tasks/conditions/has_quest.gd.uid @@ -0,0 +1 @@ +uid://xom38ohdwfms diff --git a/ai/tasks/conditions/is_unregistered.gd b/ai/tasks/conditions/is_unregistered.gd new file mode 100644 index 0000000..c7a0eb8 --- /dev/null +++ b/ai/tasks/conditions/is_unregistered.gd @@ -0,0 +1,7 @@ +extends BTCondition + +func _tick(delta: float) -> Status: + if agent.data and !Guild.has_guild_member(agent.data): + return SUCCESS + else: + return FAILURE diff --git a/ai/tasks/conditions/is_unregistered.gd.uid b/ai/tasks/conditions/is_unregistered.gd.uid new file mode 100644 index 0000000..7971b09 --- /dev/null +++ b/ai/tasks/conditions/is_unregistered.gd.uid @@ -0,0 +1 @@ +uid://bcbfnm21rtkuo diff --git a/ai/tasks/decorators/busy.gd b/ai/tasks/decorators/busy.gd new file mode 100644 index 0000000..810acf0 --- /dev/null +++ b/ai/tasks/decorators/busy.gd @@ -0,0 +1,22 @@ +@tool +extends BTDecorator + + +var prev_busy : bool + +func _get_task_icon(): + return load("res://ai/icons/stopwatch.png") + + +func _enter() -> void: + if agent.get("busy") != null: + prev_busy = agent.busy + agent.busy = true + +func _exit() -> void: + if agent.get("busy") != null: + agent.busy = prev_busy + +# Called to generate a display name for the task (requires @tool). +func _generate_name() -> String: + return "Busy" diff --git a/ai/tasks/decorators/busy.gd.uid b/ai/tasks/decorators/busy.gd.uid new file mode 100644 index 0000000..d25fda1 --- /dev/null +++ b/ai/tasks/decorators/busy.gd.uid @@ -0,0 +1 @@ +uid://b2vuw12mttm40 diff --git a/ai/trees/adventurer.tres b/ai/trees/adventurer.tres new file mode 100644 index 0000000..1f83901 --- /dev/null +++ b/ai/trees/adventurer.tres @@ -0,0 +1,145 @@ +[gd_resource type="BehaviorTree" load_steps=42 format=3 uid="uid://dght2flegv70i"] + +[ext_resource type="Script" uid="uid://h113xg55h4r8" path="res://ai/tasks/actions/go_to.gd" id="1_s3kkm"] +[ext_resource type="Script" uid="uid://bsq5dxul0uto" path="res://ai/tasks/actions/use_guild_service.gd" id="2_1441p"] +[ext_resource type="Script" uid="uid://767b4fdlrgr" path="res://ai/tasks/actions/wander.gd" id="2_fe6jf"] +[ext_resource type="Script" uid="uid://b2vuw12mttm40" path="res://ai/tasks/decorators/busy.gd" id="2_mtixs"] +[ext_resource type="Script" uid="uid://bcbfnm21rtkuo" path="res://ai/tasks/conditions/is_unregistered.gd" id="3_mtixs"] +[ext_resource type="Script" uid="uid://xom38ohdwfms" path="res://ai/tasks/conditions/has_quest.gd" id="4_1441p"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_6h604"] +var/pos/name = &"pos" +var/pos/type = 5 +var/pos/value = Vector2(0, 0) +var/pos/hint = 0 +var/pos/hint_string = "" +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 0.0 +var/speed/hint = 0 +var/speed/hint_string = "" + +[sub_resource type="BTComment" id="BTComment_fe6jf"] +custom_name = "Walk from the entrance to the designated start point of the guild." + +[sub_resource type="BBVariant" id="BBVariant_1441p"] +type = 5 +saved_value = Vector2(900, 700) +resource_name = "(900.0, 700.0)" + +[sub_resource type="BTSetVar" id="BTSetVar_mtixs"] +variable = &"pos" +value = SubResource("BBVariant_1441p") + +[sub_resource type="BTAction" id="BTAction_0kac8"] +script = ExtResource("1_s3kkm") + +[sub_resource type="BTWait" id="BTWait_s3kkm"] +duration = 1.5 + +[sub_resource type="BTAction" id="BTAction_nqy1p"] +script = ExtResource("2_fe6jf") + +[sub_resource type="BTSequence" id="BTSequence_s3kkm"] +custom_name = "Enter the Guild" +children = [SubResource("BTSetVar_mtixs"), SubResource("BTAction_0kac8"), SubResource("BTWait_s3kkm"), SubResource("BTAction_nqy1p")] + +[sub_resource type="BTDecorator" id="BTDecorator_nqy1p"] +children = [SubResource("BTSequence_s3kkm")] +script = ExtResource("2_mtixs") + +[sub_resource type="BTRunLimit" id="BTRunLimit_1441p"] +children = [SubResource("BTDecorator_nqy1p")] + +[sub_resource type="BTComment" id="BTComment_0kac8"] +custom_name = "Always try to register as a guildmember as their first action" + +[sub_resource type="BTCondition" id="BTCondition_s18yy"] +script = ExtResource("3_mtixs") + +[sub_resource type="BTAction" id="BTAction_700su"] +script = ExtResource("2_1441p") +employee_name = "Receptionist" +service_name = "register" + +[sub_resource type="BTAction" id="BTAction_s18yy"] +script = ExtResource("2_fe6jf") + +[sub_resource type="BTSequence" id="BTSequence_1441p"] +custom_name = "Register as a Guildmember" +children = [SubResource("BTCondition_s18yy"), SubResource("BTAction_700su"), SubResource("BTAction_s18yy")] + +[sub_resource type="BTDecorator" id="BTDecorator_700su"] +children = [SubResource("BTSequence_1441p")] +script = ExtResource("2_mtixs") + +[sub_resource type="BTCondition" id="BTCondition_mtixs"] +script = ExtResource("4_1441p") + +[sub_resource type="BTAction" id="BTAction_fe6jf"] +script = ExtResource("2_1441p") +employee_name = "Questboard" +service_name = "get_quest" + +[sub_resource type="BTAction" id="BTAction_mwsop"] +script = ExtResource("2_fe6jf") + +[sub_resource type="BTSequence" id="BTSequence_nqy1p"] +custom_name = "Get a Quest" +children = [SubResource("BTCondition_mtixs"), SubResource("BTAction_fe6jf"), SubResource("BTAction_mwsop")] + +[sub_resource type="BTDecorator" id="BTDecorator_s18yy"] +children = [SubResource("BTSequence_nqy1p")] +script = ExtResource("2_mtixs") + +[sub_resource type="BTProbability" id="BTProbability_s3kkm"] +children = [SubResource("BTDecorator_s18yy")] + +[sub_resource type="BTComment" id="BTComment_mwsop"] +custom_name = "TODO: Make them talk to a random other adventurer" + +[sub_resource type="BTDecorator" id="BTDecorator_jq6fo"] +children = [SubResource("BTComment_mwsop")] +script = ExtResource("2_mtixs") + +[sub_resource type="BTCooldown" id="BTCooldown_mtixs"] +duration = 5.0 +trigger_on_failure = true +children = [SubResource("BTDecorator_jq6fo")] + +[sub_resource type="BTProbability" id="BTProbability_1441p"] +children = [SubResource("BTCooldown_mtixs")] +_enabled = false + +[sub_resource type="BTWait" id="BTWait_8lwgx"] +duration = 3.0 +custom_name = "Idle" + +[sub_resource type="BTProbability" id="BTProbability_gc1l4"] +children = [SubResource("BTWait_8lwgx")] + +[sub_resource type="BTAction" id="BTAction_jq6fo"] +script = ExtResource("2_fe6jf") + +[sub_resource type="BTProbability" id="BTProbability_8lwgx"] +children = [SubResource("BTAction_jq6fo")] + +[sub_resource type="BTProbabilitySelector" id="BTProbabilitySelector_mtixs"] +children = [SubResource("BTProbability_s3kkm"), SubResource("BTProbability_1441p"), SubResource("BTProbability_gc1l4"), SubResource("BTProbability_8lwgx")] + +[sub_resource type="BTComment" id="BTComment_y4ura"] +custom_name = "TODO: Make them wander to a random location after the interaction" + +[sub_resource type="BTSequence" id="BTSequence_4w6ij"] +children = [SubResource("BTProbabilitySelector_mtixs"), SubResource("BTComment_y4ura")] + +[sub_resource type="BTSelector" id="BTSelector_mwsop"] +children = [SubResource("BTComment_fe6jf"), SubResource("BTRunLimit_1441p"), SubResource("BTComment_0kac8"), SubResource("BTDecorator_700su"), SubResource("BTSequence_4w6ij")] + +[sub_resource type="BTRepeat" id="BTRepeat_s3kkm"] +forever = true +children = [SubResource("BTSelector_mwsop")] + +[resource] +blackboard_plan = SubResource("BlackboardPlan_6h604") +root_task = SubResource("BTRepeat_s3kkm") diff --git a/ai/trees/receptionist.tres b/ai/trees/receptionist.tres new file mode 100644 index 0000000..94fa9bc --- /dev/null +++ b/ai/trees/receptionist.tres @@ -0,0 +1,34 @@ +[gd_resource type="BehaviorTree" load_steps=9 format=3 uid="uid://dxyx7tjsd7khq"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_1q5ck"] + +[sub_resource type="BBVariant" id="BBVariant_68j5j"] +type = 1 +saved_value = false +resource_name = "false" + +[sub_resource type="BTCheckAgentProperty" id="BTCheckAgentProperty_tkyhk"] +property = &"busy" +value = SubResource("BBVariant_68j5j") + +[sub_resource type="BBNode" id="BBNode_1q5ck"] +saved_value = NodePath("Queue") +resource_name = "Queue" + +[sub_resource type="BTCallMethod" id="BTCallMethod_xsfkt"] +node = SubResource("BBNode_1q5ck") +method = &"try_advance" + +[sub_resource type="BTSequence" id="BTSequence_1q5ck"] +children = [SubResource("BTCheckAgentProperty_tkyhk"), SubResource("BTCallMethod_xsfkt")] + +[sub_resource type="BTCooldown" id="BTCooldown_qle3k"] +duration = 2.0 +children = [SubResource("BTSequence_1q5ck")] + +[sub_resource type="BTRepeat" id="BTRepeat_aurho"] +children = [SubResource("BTCooldown_qle3k")] + +[resource] +blackboard_plan = SubResource("BlackboardPlan_1q5ck") +root_task = SubResource("BTRepeat_aurho") diff --git a/basic-sprite.png b/basic-sprite.png new file mode 100644 index 0000000..f3b7b8f Binary files /dev/null and b/basic-sprite.png differ diff --git a/basic-sprite.png.import b/basic-sprite.png.import new file mode 100644 index 0000000..8dd85b7 --- /dev/null +++ b/basic-sprite.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg6ptmynq0aq0" +path="res://.godot/imported/basic-sprite.png-8651af0edadac4b9f3511ab9d4ca3c8a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://basic-sprite.png" +dest_files=["res://.godot/imported/basic-sprite.png-8651af0edadac4b9f3511ab9d4ca3c8a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/fsm/interact_with_employee.gd b/fsm/interact_with_employee.gd deleted file mode 100644 index 1541041..0000000 --- a/fsm/interact_with_employee.gd +++ /dev/null @@ -1,39 +0,0 @@ -extends StateNode - -@export var employee_name : String = "" -@export var speech_bubble : String = "" -@export var wait_duration : float = 1 -@export var interaction_args : Array[String] = [] -var wait_remaining : float = 0 - -var employee : GuildEmployee -var actor - -func exit() -> void: - actor.show_speech_bubble("") - -func _process(delta: float) -> void: - if wait_remaining > 0: - wait_remaining -= delta - if wait_remaining <= 0: - wait_remaining = 0 - employee.interact(actor, interaction_args[0]) - complete_state() - -func execute(subject, ...args : Array) -> void: - wait_remaining = wait_duration - actor = subject - - if len(args) > 0 and args[0] != "": - subject.show_speech_bubble(speech_bubble) - - #TODO: Possibly an error later with preexisting and extended lists - for arg in args.slice(1): - interaction_args.append(arg) - var emp = Guild.hall.employees.get(employee_name) - - if emp == null: - printerr("Employee %s not found!" % employee_name) - complete_state() - else: - employee = emp diff --git a/fsm/interact_with_employee.gd.uid b/fsm/interact_with_employee.gd.uid deleted file mode 100644 index e079014..0000000 --- a/fsm/interact_with_employee.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bewrajxqdutsu diff --git a/fsm/machines/newbie.gd b/fsm/machines/newbie.gd deleted file mode 100644 index b59c986..0000000 --- a/fsm/machines/newbie.gd +++ /dev/null @@ -1,27 +0,0 @@ -extends StateMachine - - -func advance_state() -> void: - var last_state = curr_state - var args : Array = [actor] - exit_state(curr_state) - match(last_state.name): - "Wait": - if last_state.next_state != "": - if !states.has(last_state.next_state): - printerr("Tried to switch to missing state %s" % last_state.next_state) - pass - enter_state(states[last_state.next_state]) - args.append_array(last_state.next_state_args) - else: - pass - "Queue": - enter_state(states["Wait"]) - args.append_array(["busy", "Interact With Employee"]) - "Register": - enter_state(states["Register"]) - "Leave": - enter_state(states["Leave"]) - - if curr_state != null: - curr_state.execute.callv(args) diff --git a/fsm/machines/newbie.gd.uid b/fsm/machines/newbie.gd.uid deleted file mode 100644 index c178394..0000000 --- a/fsm/machines/newbie.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dthatmb3if73u diff --git a/fsm/machines/receptionist.gd b/fsm/machines/receptionist.gd deleted file mode 100644 index cbd7199..0000000 --- a/fsm/machines/receptionist.gd +++ /dev/null @@ -1,23 +0,0 @@ -extends StateMachine - - -func advance_state() -> void: - var last_state = curr_state - var args : Array = [actor] - exit_state(curr_state) - match(last_state.name): - "Wait": - if last_state.next_state != "": - if !states.has(last_state.next_state): - printerr("Tried to switch to missing state %s" % last_state.next_state) - pass - enter_state(states[last_state.next_state]) - args.append_array(last_state.next_state_args) - else: - pass - "Advance Queue": - enter_state(states["Wait"]) - args.append_array(["", "Advance Queue"]) - - if curr_state != null: - curr_state.execute.callv(args) diff --git a/fsm/machines/receptionist.gd.uid b/fsm/machines/receptionist.gd.uid deleted file mode 100644 index 8f94348..0000000 --- a/fsm/machines/receptionist.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cggu0yihq0unt diff --git a/fsm/machines/state_machine.gd b/fsm/machines/state_machine.gd deleted file mode 100644 index 1f7a77a..0000000 --- a/fsm/machines/state_machine.gd +++ /dev/null @@ -1,43 +0,0 @@ -class_name StateMachine extends Node - -@export var starting_state : String = "" -var states : Dictionary[String, StateNode] = {} -var curr_state : StateNode = null -var actor = null -func _ready() -> void: - for child in get_children(): - if child is StateNode: - states[child.name] = child - child.state_machine = self - child.completed.connect(_on_state_completed) - - -func start() -> void: - if starting_state != "": - var state : StateNode = states.get(starting_state) - if state == null: - printerr("Starting state not found! Expected %s" % [starting_state]) - else: - enter_state(state) - curr_state.execute(actor) - -func exit_state(state : StateNode) -> void: - curr_state.exit() - curr_state = null - pass - -func enter_state(state : StateNode) -> void: - curr_state = state - curr_state.enter() - pass - - -func advance_state() -> void: - pass - - -func _on_state_completed(state : StateNode) -> void: - if state == curr_state: - advance_state() - else: - printerr("Wrong state completed! %s when expecting %s" % [state.name, curr_state]) diff --git a/fsm/machines/state_machine.gd.uid b/fsm/machines/state_machine.gd.uid deleted file mode 100644 index 617afd7..0000000 --- a/fsm/machines/state_machine.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://u81fhi8157bg diff --git a/fsm/machines/test.gd b/fsm/machines/test.gd deleted file mode 100644 index 06e8cf6..0000000 --- a/fsm/machines/test.gd +++ /dev/null @@ -1,22 +0,0 @@ -extends StateMachine - -func advance_state() -> void: - var last_state = curr_state - var args : Array = [actor] - exit_state(curr_state) - match(last_state.name): - "Wait": - if last_state.next_state != "": - if !states.has(last_state.next_state): - printerr("Tried to switch to missing state %s" % last_state.next_state) - pass - enter_state(states[last_state.next_state]) - args.append_array(last_state.next_state_args) - else: - pass - "Test": - enter_state(states["Wait"]) - args.append_array(["busy", "Test"]) - - if curr_state != null: - curr_state.execute.callv(args) diff --git a/fsm/machines/test.gd.uid b/fsm/machines/test.gd.uid deleted file mode 100644 index 01c3f2e..0000000 --- a/fsm/machines/test.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://djd8pv5xbgud3 diff --git a/fsm/nodes/advance_queue.gd b/fsm/nodes/advance_queue.gd deleted file mode 100644 index 9173724..0000000 --- a/fsm/nodes/advance_queue.gd +++ /dev/null @@ -1,6 +0,0 @@ -extends StateNode - -func execute(subject, ...args : Array) -> void: - if !subject.busy: - subject.queue.try_advance() - complete_state() diff --git a/fsm/nodes/advance_queue.gd.uid b/fsm/nodes/advance_queue.gd.uid deleted file mode 100644 index 9f9e8b9..0000000 --- a/fsm/nodes/advance_queue.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://csicx3fpxv7xt diff --git a/fsm/nodes/leave.gd b/fsm/nodes/leave.gd deleted file mode 100644 index a350eda..0000000 --- a/fsm/nodes/leave.gd +++ /dev/null @@ -1 +0,0 @@ -extends StateNode diff --git a/fsm/nodes/leave.gd.uid b/fsm/nodes/leave.gd.uid deleted file mode 100644 index 15b310d..0000000 --- a/fsm/nodes/leave.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b0ewnwcibhu21 diff --git a/fsm/nodes/queue.gd b/fsm/nodes/queue.gd deleted file mode 100644 index 1f8c630..0000000 --- a/fsm/nodes/queue.gd +++ /dev/null @@ -1,51 +0,0 @@ -extends StateNode - -@export var employee : String = "" - -var target -var actor -var in_queue -var queued_at : GuildQueue -var next_state : String -var next_state_args : Array = [] - - -func execute(subject, ...args : Array) -> void: - actor = subject - #find the receptionist queue - var queue = Guild.hall.employees[employee].queue - #join the queue - join_queue(queue) - reposition_queue(queue.length-1) - - subject.nav_agent.navigation_finished.connect(_on_navigation_finished) - -func _on_navigation_finished() -> void: - actor.nav_agent.navigation_finished.disconnect(_on_navigation_finished) - if !in_queue: - complete_state() - -func join_queue(queue : GuildQueue) -> void: - queue.add_member(actor) - in_queue = true - queued_at = queue - queue.advanced.connect(_on_queue_advanced) - -func leave_queue() -> void: - in_queue = false - queued_at.advanced.disconnect(_on_queue_advanced) - queued_at = null - -func reposition_queue(idx : int) -> void: - var queue = queued_at - #if zero approach the receptionist with the intent to use her service at navigation complete. - actor.approach(queue.global_position + idx * queue.direction * 75) - -func _on_queue_advanced() -> void: - #find our place within the queue - var idx : int = queued_at.members.find(actor) - #We aren't in the queue, time to advance - if idx < 0: - leave_queue() - else: - reposition_queue(idx) diff --git a/fsm/nodes/queue.gd.uid b/fsm/nodes/queue.gd.uid deleted file mode 100644 index 5978983..0000000 --- a/fsm/nodes/queue.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://y85swbbk8kbd diff --git a/fsm/nodes/state_node.gd b/fsm/nodes/state_node.gd deleted file mode 100644 index 5f815b3..0000000 --- a/fsm/nodes/state_node.gd +++ /dev/null @@ -1,17 +0,0 @@ -class_name StateNode extends Node - -var state_machine : StateMachine = null -signal completed(state : StateNode) - - -func enter() -> void: - pass - -func exit() -> void: - pass - -func execute(subject, ...args : Array) -> void: - pass - -func complete_state() -> void: - completed.emit(self) diff --git a/fsm/nodes/state_node.gd.uid b/fsm/nodes/state_node.gd.uid deleted file mode 100644 index bed885e..0000000 --- a/fsm/nodes/state_node.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c27ctn874rdns diff --git a/fsm/nodes/test.gd b/fsm/nodes/test.gd deleted file mode 100644 index 8f0c587..0000000 --- a/fsm/nodes/test.gd +++ /dev/null @@ -1,13 +0,0 @@ -extends StateNode - - -@export var message : String = "" -var target -func execute(subject, ...args : Array) -> void: - subject.approach(Game.player.global_position) - subject.nav_agent.navigation_finished.connect(_on_navigation_finished) - target = subject - -func _on_navigation_finished() -> void: - target.nav_agent.navigation_finished.disconnect(_on_navigation_finished) - complete_state() diff --git a/fsm/nodes/test.gd.uid b/fsm/nodes/test.gd.uid deleted file mode 100644 index de75bbe..0000000 --- a/fsm/nodes/test.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://e8we6nmaob1k diff --git a/fsm/nodes/wait.gd b/fsm/nodes/wait.gd deleted file mode 100644 index 0d14d77..0000000 --- a/fsm/nodes/wait.gd +++ /dev/null @@ -1,34 +0,0 @@ -extends StateNode - - -@export var wait_duration : float = 1 -var wait_remaining : float = 0 -var next_state : String -var next_state_args : Array = [] -var actor -func exit() -> void: - actor.show_speech_bubble("") - -func _process(delta: float) -> void: - if wait_remaining > 0: - wait_remaining -= delta - if wait_remaining <= 0: - wait_remaining = 0 - complete_state() - -func execute(subject, ...args : Array) -> void: - wait_remaining = wait_duration - actor = subject - - if len(args) > 0 and args[0] != "": - subject.show_speech_bubble(args[0]) - - if len(args) > 1 and args[1] != "": - next_state = args[1] - else: - next_state = "" - - if len(args) > 2 and args[2] != "": - next_state_args = args[2] - else: - next_state_args = [] diff --git a/fsm/nodes/wait.gd.uid b/fsm/nodes/wait.gd.uid deleted file mode 100644 index 87fc662..0000000 --- a/fsm/nodes/wait.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dl3b5aywu1hf6 diff --git a/game_manager.gd b/game_manager.gd index 11b3ee5..ee5412a 100644 --- a/game_manager.gd +++ b/game_manager.gd @@ -9,9 +9,9 @@ var end_shift_confirm_template = preload("res://end_shift_confirmation.tscn") func _ready() -> void: end_shift_confirmation = end_shift_confirm_template.instantiate() add_child(end_shift_confirmation) - var file =FileAccess.open("res://name.txt",FileAccess.READ) - var text =file.get_line() - var nmnames = text.remove_chars(" ").split(",") + #var file =FileAccess.open("res://name.txt",FileAccess.READ) + #var text =file.get_line() + #var nmnames = text.remove_chars(" ").split(",") func _process(delta: float) -> void: if active and Input.is_action_just_pressed("switch modes"): diff --git a/guild.gd b/guild.gd index 869efbf..667ba39 100644 --- a/guild.gd +++ b/guild.gd @@ -20,6 +20,11 @@ func register_guild_member(member : AdventurerData, first : bool = false) -> voi if first: Game.notice("%s has joined the guild!" % member.name, 5) +func has_guild_member(member : AdventurerData) -> bool: + if member == null: + return false + return members.has(member) + func add_quest(quest : Quest) -> void: quests[quest] = false Game.quest_log.add_entry(quest) diff --git a/guild_employee.gd b/guild_employee.gd index 6b2ed1a..ce7c4af 100644 --- a/guild_employee.gd +++ b/guild_employee.gd @@ -4,7 +4,9 @@ class_name GuildEmployee extends Adventurer @onready var queue : GuildQueue = $Queue var busy : bool +signal service_provided() func interact(interactor, type : String = "") -> void: if type == "register": Guild.register_guild_member(interactor.data, true) + service_provided.emit() diff --git a/guild_queue.gd b/guild_queue.gd index aa44e8e..4914554 100644 --- a/guild_queue.gd +++ b/guild_queue.gd @@ -5,11 +5,18 @@ var length : int : return len(members) @export var direction : Vector2 = Vector2.ZERO var members : Array[Adventurer] = [] + +var front : Adventurer : + get: return null if len(members) == 0 else members[0] + signal advanced() func add_member(member : Adventurer) -> void: members.append(member) - #TODO: Instead retrieve the array length with a getter + +func remove_member(member : Adventurer) -> void: + members.erase(member) + func try_advance() -> Adventurer: if length > 0: @@ -18,6 +25,18 @@ func try_advance() -> Adventurer: return null func advance() -> Adventurer: - var member = members.pop_front() advanced.emit() - return member + return front + +func get_last_position() -> Vector2: + return get_index_position(length - 1) + +func get_index_position(idx : int) -> Vector2: + return global_position + idx * 100 * direction + +func get_member_position(member) -> Vector2: + var idx = members.find(member) + if idx == -1: + return Vector2.ZERO + else: + return get_index_position(idx) diff --git a/guildhall.gd b/guildhall.gd index 2940b80..b96be44 100644 --- a/guildhall.gd +++ b/guildhall.gd @@ -1,10 +1,13 @@ class_name Guildhall extends Node2D var employees : Dictionary[String, GuildEmployee] = {} +var board : QuestBoard +@onready var sprite_node : Node2D = $Sprites +@onready var nav_region : NavigationRegion2D = $RoomRegion func _ready() -> void: Guild.hall = self - for child in get_children(): + for child in sprite_node.get_children(): if child is GuildEmployee: register_employee(child) @@ -14,4 +17,4 @@ func register_employee(employee: GuildEmployee) -> void: func add_sprite(sprite : Adventurer) -> void: - add_child(sprite) + sprite_node.add_child(sprite) diff --git a/guildhall.tscn b/guildhall.tscn index fbb1bfb..12241a8 100644 --- a/guildhall.tscn +++ b/guildhall.tscn @@ -1,191 +1,65 @@ -[gd_scene load_steps=19 format=4 uid="uid://cd08dp16bixfv"] +[gd_scene load_steps=9 format=4 uid="uid://cd08dp16bixfv"] [ext_resource type="Script" uid="uid://ccorfvcfa84gf" path="res://guildhall.gd" id="1_lsinl"] [ext_resource type="TileSet" uid="uid://6im0g3eg6sr4" path="res://test_tiles.tres" id="1_qel1r"] [ext_resource type="Script" uid="uid://dolqtw1ye4ras" path="res://player.gd" id="2_5n4iw"] -[ext_resource type="Texture2D" uid="uid://bldpiytpdrge6" path="res://icon.svg" id="2_w7eqs"] -[ext_resource type="Texture2D" uid="uid://cbamfadh7wwr7" path="res://speech-blip.png" id="4_2wofw"] -[ext_resource type="Script" uid="uid://b2unuudq5qfl" path="res://guild_employee.gd" id="4_g7jyq"] -[ext_resource type="Script" uid="uid://b0q2233msdtgo" path="res://guild_queue.gd" id="5_13vc8"] -[ext_resource type="Script" uid="uid://cggu0yihq0unt" path="res://fsm/machines/receptionist.gd" id="6_13vc8"] -[ext_resource type="Script" uid="uid://csicx3fpxv7xt" path="res://fsm/nodes/advance_queue.gd" id="7_hph4e"] -[ext_resource type="Script" uid="uid://dl3b5aywu1hf6" path="res://fsm/nodes/wait.gd" id="8_bog1h"] -[ext_resource type="Script" uid="uid://w57riwplc00t" path="res://speech_bubble.gd" id="10_50x1e"] -[ext_resource type="Texture2D" uid="uid://chnk20ey5qxfh" path="res://speech-emojis.png" id="11_50x1e"] +[ext_resource type="Texture2D" uid="uid://cg6ptmynq0aq0" path="res://basic-sprite.png" id="4_l3mu1"] +[ext_resource type="PackedScene" uid="uid://cf6nnjyp8kv78" path="res://receptionist.tscn" id="5_l3mu1"] [sub_resource type="NavigationPolygon" id="NavigationPolygon_w7eqs"] -vertices = PackedVector2Array(814, 70.03906, 1070, 68.96094, 778, 138, 778, 54, 814, 10, 10, 10, 246, 54, 10, 630, 246, 138, 458, 630, 1070, 28, 1078, 28, 1078, 630, 566, 630, 566, 886, 458, 886) -polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2), PackedInt32Array(0, 2, 3), PackedInt32Array(4, 0, 3), PackedInt32Array(5, 4, 3), PackedInt32Array(5, 3, 6), PackedInt32Array(7, 5, 6), PackedInt32Array(7, 6, 8), PackedInt32Array(9, 7, 8), PackedInt32Array(9, 8, 2), PackedInt32Array(1, 10, 11), PackedInt32Array(1, 11, 12), PackedInt32Array(2, 1, 12), PackedInt32Array(2, 12, 13), PackedInt32Array(9, 2, 13), PackedInt32Array(9, 13, 14), PackedInt32Array(9, 14, 15)]) -sample_partition_type = 1 +vertices = PackedVector2Array(808, 168, 808, 58, 1048, 58, 1048, 600, 40, 600, 216, 168, 40, 40, 216, 40) +polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3), PackedInt32Array(0, 3, 4, 5), PackedInt32Array(5, 4, 6, 7)]) +border_size = 500.0 +agent_radius = 40.0 -[sub_resource type="CircleShape2D" id="CircleShape2D_5n4iw"] -radius = 35.0 +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_l3mu1"] +radius = 15.0 +height = 54.0 -[sub_resource type="Animation" id="Animation_bog1h"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite2D3:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [0] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Sprite2D3:position") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0, 0)] -} - -[sub_resource type="Animation" id="Animation_13vc8"] -resource_name = "busy" -length = 0.7000034 -loop_mode = 1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite2D3:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), -"update": 1, -"values": [0, 1, 8, 9, 16, 17, 24, 25] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Sprite2D3:position") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0, 0)] -} - -[sub_resource type="Animation" id="Animation_lsinl"] -resource_name = "talk" -length = 0.40000334 -loop_mode = 1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite2D3:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0, -3)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Sprite2D3:frame") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1), -"update": 1, -"values": [2, 3, 10, 3, 2] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_uo85v"] -_data = { -&"RESET": SubResource("Animation_bog1h"), -&"busy": SubResource("Animation_13vc8"), -&"talk": SubResource("Animation_lsinl") -} +[sub_resource type="NavigationPolygon" id="NavigationPolygon_l3mu1"] +vertices = PackedVector2Array(117.96875, 286, 9.96875, 286, 9.03125, 0, 117.03125, 0) +polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)]) +outlines = Array[PackedVector2Array]([PackedVector2Array(-1, -10, 127, -10, 128, 296, 0, 296)]) [node name="Guildhall" type="Node2D"] script = ExtResource("1_lsinl") -[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."] +[node name="RoomRegion" type="NavigationRegion2D" parent="."] navigation_polygon = SubResource("NavigationPolygon_w7eqs") -[node name="TileMapLayer" type="TileMapLayer" parent="NavigationRegion2D"] -tile_map_data = PackedByteArray("AAABAAEAAAAOAAEAAAACAAEAAAAOAAEAAAADAAEAAAAOAAEAAAAEAAEAAAAOAAEAAAAFAAIAAAAOAAEAAAAGAAIAAAAOAAEAAAAHAAIAAAAOAAEAAAAIAAIAAAAOAAEAAAAJAAIAAAAOAAEAAAAKAAIAAAAOAAEAAAAHAAEAAAAOAAEAAAAGAAEAAAAOAAEAAAAFAAEAAAAOAAEAAAACAAIAAAAOAAEAAAADAAIAAAAOAAEAAAAEAAIAAAAOAAEAAAABAAIAAAAOAAEAAAABAAMAAAAOAAEAAAABAAQAAAAOAAEAAAACAAQAAAAOAAEAAAADAAQAAAAOAAEAAAAEAAQAAAAOAAEAAAAFAAQAAAAOAAEAAAAGAAQAAAAOAAEAAAAHAAQAAAAOAAEAAAAIAAQAAAAOAAEAAAAJAAQAAAAOAAEAAAAJAAMAAAAOAAEAAAAKAAMAAAAOAAEAAAAKAAEAAAAOAAEAAAAJAAEAAAAOAAEAAAAIAAEAAAAOAAEAAAADAAMAAAAOAAEAAAACAAMAAAAOAAEAAAAEAAMAAAAOAAEAAAAFAAMAAAAOAAEAAAAGAAMAAAAOAAEAAAAHAAMAAAAOAAEAAAAIAAMAAAAOAAEAAAAKAAQAAAAOAAEAAAALAAQAAAAOAAEAAAALAAMAAAAOAAEAAAALAAIAAAAOAAEAAAALAAEAAAAOAAEAAAAKAAAAAAAOAAEAAAAJAAAAAAAOAAEAAAAIAAAAAAAOAAEAAAAHAAAAAAAOAAEAAAAGAAAAAAAOAAEAAAAFAAAAAAAOAAEAAAAEAAAAAAAOAAEAAAADAAAAAAAOAAEAAAACAAAAAAAOAAEAAAABAAAAAAAOAAEAAAAAAAEAAAAOAAEAAAAAAAIAAAAOAAEAAAAAAAMAAAAOAAEAAAAAAAQAAAAOAAEAAAAAAAUAAAAOAAEAAAAAAAYAAAAOAAEAAAAAAAcAAAAOAAEAAAAAAAgAAAAOAAEAAAAAAAkAAAAOAAEAAAABAAkAAAAOAAEAAAACAAkAAAAOAAEAAAADAAkAAAAOAAEAAAAEAAkAAAAOAAEAAAAFAAkAAAAOAAEAAAAGAAkAAAAOAAEAAAAHAAkAAAAOAAEAAAAIAAkAAAAOAAEAAAAJAAkAAAAOAAEAAAAKAAkAAAAOAAEAAAALAAkAAAAOAAEAAAAMAAkAAAAOAAEAAAANAAkAAAAOAAEAAAAOAAkAAAAOAAEAAAAPAAkAAAAOAAEAAAAQAAkAAAAOAAEAAAAQAAgAAAAOAAEAAAAQAAcAAAAOAAEAAAAQAAYAAAAOAAEAAAAQAAUAAAAOAAEAAAAQAAQAAAAOAAEAAAAQAAMAAAAOAAEAAAAQAAIAAAAOAAEAAAAQAAEAAAAOAAEAAAAQAAAAAAAOAAEAAAAPAAAAAAAOAAEAAAAOAAAAAAAOAAEAAAANAAAAAAAOAAEAAAAMAAAAAAAOAAEAAAALAAAAAAAOAAEAAAAPAAEAAAAOAAEAAAAOAAEAAAAOAAEAAAANAAEAAAAOAAEAAAAMAAEAAAAOAAEAAAAMAAIAAAAOAAEAAAANAAIAAAAOAAEAAAAOAAIAAAAOAAEAAAAPAAIAAAAOAAEAAAAMAAMAAAAOAAEAAAAMAAQAAAAOAAEAAAANAAQAAAAOAAEAAAAOAAQAAAAOAAEAAAAPAAQAAAAOAAEAAAAOAAUAAAAOAAEAAAANAAUAAAAOAAEAAAAMAAUAAAAOAAEAAAALAAUAAAAOAAEAAAAKAAYAAAAOAAEAAAAJAAYAAAAOAAEAAAAIAAcAAAAOAAEAAAAJAAcAAAAOAAEAAAAKAAcAAAAOAAEAAAALAAcAAAAOAAEAAAAMAAcAAAAOAAEAAAANAAYAAAAOAAEAAAAOAAYAAAAOAAEAAAAPAAYAAAAOAAEAAAAPAAcAAAAOAAEAAAAOAAgAAAAOAAEAAAAPAAgAAAAOAAEAAAAPAAUAAAAOAAEAAAAOAAMAAAAOAAEAAAAOAAcAAAAOAAEAAAAPAAMAAAAOAAEAAAAMAAYAAAAOAAEAAAALAAgAAAAOAAEAAAAMAAgAAAAOAAEAAAANAAcAAAAOAAEAAAANAAgAAAAOAAEAAAANAAMAAAAOAAEAAAAKAAUAAAAOAAEAAAAIAAgAAAAOAAEAAAAJAAgAAAAOAAEAAAALAAYAAAAOAAEAAAAKAAgAAAAOAAEAAAAHAAgAAAAOAAEAAAAGAAgAAAAOAAEAAAACAAgAAAAOAAEAAAABAAgAAAAOAAEAAAABAAcAAAAOAAEAAAABAAYAAAAOAAEAAAABAAUAAAAOAAEAAAACAAUAAAAOAAEAAAACAAYAAAAOAAEAAAADAAYAAAAOAAEAAAAEAAYAAAAOAAEAAAAFAAYAAAAOAAEAAAAGAAYAAAAOAAEAAAAHAAYAAAAOAAEAAAAIAAYAAAAOAAEAAAAFAAUAAAAOAAEAAAAGAAUAAAAOAAEAAAAHAAUAAAAOAAEAAAAIAAUAAAAOAAEAAAAJAAUAAAAOAAEAAAAEAAUAAAAOAAEAAAADAAUAAAAOAAEAAAADAAcAAAAOAAEAAAACAAcAAAAOAAEAAAAEAAcAAAAOAAEAAAAFAAcAAAAOAAEAAAAGAAcAAAAOAAEAAAAHAAcAAAAOAAEAAAAFAAgAAAAOAAEAAAAEAAgAAAAOAAEAAAADAAgAAAAOAAEAAAARAP//AAABAAQAAAARAAoAAAABAAUAAAD//woAAAAAAAUAAAD/////AAAAAAQAAAAAAP//AAACAAQAAAABAP//AAACAAQAAAACAP//AAACAAQAAAADAP//AAACAAQAAAAEAP//AAACAAQAAAAFAP//AAACAAQAAAAGAP//AAACAAQAAAAHAP//AAACAAQAAAAIAP//AAACAAQAAAAJAP//AAACAAQAAAAKAP//AAACAAQAAAALAP//AAACAAQAAAAMAP//AAACAAQAAAANAP//AAACAAQAAAAOAP//AAACAAQAAAAPAP//AAACAAQAAAAQAP//AAACAAQAAAARAAAAAAACAAUAAAARAAEAAAACAAUAAAARAAIAAAACAAUAAAARAAMAAAACAAUAAAARAAQAAAACAAUAAAARAAUAAAACAAUAAAARAAYAAAACAAUAAAARAAcAAAACAAUAAAARAAgAAAACAAUAAAARAAkAAAACAAUAAAAQAAoAAAACAAQAAAAPAAoAAAACAAQAAAAOAAoAAAACAAQAAAANAAoAAAACAAQAAAAMAAoAAAACAAQAAAALAAoAAAACAAQAAAAKAAoAAAACAAQAAAAJAAoAAAAGAAUAAAAIAAoAAAAFAAAAAAAHAAoAAAAFAAAAAAAGAAoAAAAFAAQAAAAFAAoAAAACAAQAAAAEAAoAAAACAAQAAAADAAoAAAACAAQAAAACAAoAAAACAAQAAAABAAoAAAACAAQAAAAAAAoAAAACAAQAAAD//wkAAAACAAUAAAD//wAAAAACAAUAAAD//wEAAAACAAUAAAD//wIAAAACAAUAAAD//wMAAAACAAUAAAD//wQAAAACAAUAAAD//wUAAAACAAUAAAD//wYAAAACAAUAAAD//wcAAAACAAUAAAD//wgAAAACAAUAAAAHAAsAAAAFAAAAAAAIAAsAAAAFAAAAAAAHAAwAAAAFAAAAAAAIAAwAAAAFAAAAAAAHAA0AAAAFAAAAAAAIAA0AAAAFAAAAAAAAAAAAAAAOAAEAAAA=") +[node name="TileMapLayer" type="TileMapLayer" parent="RoomRegion"] +tile_map_data = PackedByteArray("AAABAAEAAAAOAAEAAAACAAEAAAAOAAEAAAADAAEAAAAOAAEAAAAEAAEAAAAOAAEAAAAFAAIAAAAOAAEAAAAGAAIAAAAOAAEAAAAHAAIAAAAOAAEAAAAIAAIAAAAOAAEAAAAJAAIAAAAOAAEAAAAKAAIAAAAOAAEAAAAHAAEAAAAOAAEAAAAGAAEAAAAOAAEAAAAFAAEAAAAOAAEAAAACAAIAAAAOAAEAAAADAAIAAAAOAAEAAAAEAAIAAAAOAAEAAAABAAIAAAAOAAEAAAABAAMAAAAOAAEAAAABAAQAAAAOAAEAAAACAAQAAAAOAAEAAAADAAQAAAAOAAEAAAAEAAQAAAAOAAEAAAAFAAQAAAAOAAEAAAAGAAQAAAAOAAEAAAAHAAQAAAAOAAEAAAAIAAQAAAAOAAEAAAAJAAQAAAAOAAEAAAAJAAMAAAAOAAEAAAAKAAMAAAAOAAEAAAAKAAEAAAAOAAEAAAAJAAEAAAAOAAEAAAAIAAEAAAAOAAEAAAADAAMAAAAOAAEAAAACAAMAAAAOAAEAAAAEAAMAAAAOAAEAAAAFAAMAAAAOAAEAAAAGAAMAAAAOAAEAAAAHAAMAAAAOAAEAAAAIAAMAAAAOAAEAAAAKAAQAAAAOAAEAAAALAAQAAAAOAAEAAAALAAMAAAAOAAEAAAALAAIAAAAOAAEAAAALAAEAAAAOAAEAAAAKAAAAAAAOAAEAAAAJAAAAAAAOAAEAAAAIAAAAAAAOAAEAAAAHAAAAAAAOAAEAAAAGAAAAAAAOAAEAAAAFAAAAAAAOAAEAAAAEAAAAAAAOAAEAAAADAAAAAAAOAAEAAAACAAAAAAAOAAEAAAABAAAAAAAOAAEAAAAAAAEAAAAOAAEAAAAAAAIAAAAOAAEAAAAAAAMAAAAOAAEAAAAAAAQAAAAOAAEAAAAAAAUAAAAOAAEAAAAAAAYAAAAOAAEAAAAAAAcAAAAOAAEAAAAAAAgAAAAOAAEAAAAAAAkAAAAOAAEAAAABAAkAAAAOAAEAAAACAAkAAAAOAAEAAAADAAkAAAAOAAEAAAAEAAkAAAAOAAEAAAAFAAkAAAAOAAEAAAAGAAkAAAAOAAEAAAAHAAkAAAAOAAEAAAAIAAkAAAAOAAEAAAAJAAkAAAAOAAEAAAAKAAkAAAAOAAEAAAALAAkAAAAOAAEAAAAMAAkAAAAOAAEAAAANAAkAAAAOAAEAAAAOAAkAAAAOAAEAAAAPAAkAAAAOAAEAAAAQAAkAAAAOAAEAAAAQAAgAAAAOAAEAAAAQAAcAAAAOAAEAAAAQAAYAAAAOAAEAAAAQAAUAAAAOAAEAAAAQAAQAAAAOAAEAAAAQAAMAAAAOAAEAAAAQAAIAAAAOAAEAAAAQAAEAAAAOAAEAAAAQAAAAAAAOAAEAAAAPAAAAAAAOAAEAAAAOAAAAAAAOAAEAAAANAAAAAAAOAAEAAAAMAAAAAAAOAAEAAAALAAAAAAAOAAEAAAAPAAEAAAAOAAEAAAAOAAEAAAAOAAEAAAANAAEAAAAOAAEAAAAMAAEAAAAOAAEAAAAMAAIAAAAOAAEAAAANAAIAAAAOAAEAAAAOAAIAAAAOAAEAAAAPAAIAAAAOAAEAAAAMAAMAAAAOAAEAAAAMAAQAAAAOAAEAAAANAAQAAAAOAAEAAAAOAAQAAAAOAAEAAAAPAAQAAAAOAAEAAAAOAAUAAAAOAAEAAAANAAUAAAAOAAEAAAAMAAUAAAAOAAEAAAALAAUAAAAOAAEAAAAKAAYAAAAOAAEAAAAJAAYAAAAOAAEAAAAIAAcAAAAOAAEAAAAJAAcAAAAOAAEAAAAKAAcAAAAOAAEAAAALAAcAAAAOAAEAAAAMAAcAAAAOAAEAAAANAAYAAAAOAAEAAAAOAAYAAAAOAAEAAAAPAAYAAAAOAAEAAAAPAAcAAAAOAAEAAAAOAAgAAAAOAAEAAAAPAAgAAAAOAAEAAAAPAAUAAAAOAAEAAAAOAAMAAAAOAAEAAAAOAAcAAAAOAAEAAAAPAAMAAAAOAAEAAAAMAAYAAAAOAAEAAAALAAgAAAAOAAEAAAAMAAgAAAAOAAEAAAANAAcAAAAOAAEAAAANAAgAAAAOAAEAAAANAAMAAAAOAAEAAAAKAAUAAAAOAAEAAAAIAAgAAAAOAAEAAAAJAAgAAAAOAAEAAAALAAYAAAAOAAEAAAAKAAgAAAAOAAEAAAAHAAgAAAAOAAEAAAAGAAgAAAAOAAEAAAACAAgAAAAOAAEAAAABAAgAAAAOAAEAAAABAAcAAAAOAAEAAAABAAYAAAAOAAEAAAABAAUAAAAOAAEAAAACAAUAAAAOAAEAAAACAAYAAAAOAAEAAAADAAYAAAAOAAEAAAAEAAYAAAAOAAEAAAAFAAYAAAAOAAEAAAAGAAYAAAAOAAEAAAAHAAYAAAAOAAEAAAAIAAYAAAAOAAEAAAAFAAUAAAAOAAEAAAAGAAUAAAAOAAEAAAAHAAUAAAAOAAEAAAAIAAUAAAAOAAEAAAAJAAUAAAAOAAEAAAAEAAUAAAAOAAEAAAADAAUAAAAOAAEAAAADAAcAAAAOAAEAAAACAAcAAAAOAAEAAAAEAAcAAAAOAAEAAAAFAAcAAAAOAAEAAAAGAAcAAAAOAAEAAAAHAAcAAAAOAAEAAAAFAAgAAAAOAAEAAAAEAAgAAAAOAAEAAAADAAgAAAAOAAEAAAARAP//AAABAAQAAAARAAoAAAABAAUAAAD//woAAAAAAAUAAAD/////AAAAAAQAAAAAAP//AAACAAQAAAABAP//AAACAAQAAAACAP//AAACAAQAAAADAP//AAACAAQAAAAEAP//AAACAAQAAAAFAP//AAACAAQAAAAGAP//AAACAAQAAAAHAP//AAACAAQAAAAIAP//AAACAAQAAAAJAP//AAACAAQAAAAKAP//AAACAAQAAAALAP//AAACAAQAAAAMAP//AAACAAQAAAANAP//AAACAAQAAAAOAP//AAACAAQAAAAPAP//AAACAAQAAAAQAP//AAACAAQAAAARAAAAAAACAAUAAAARAAEAAAACAAUAAAARAAIAAAACAAUAAAARAAMAAAACAAUAAAARAAQAAAACAAUAAAARAAUAAAACAAUAAAARAAYAAAACAAUAAAARAAcAAAACAAUAAAARAAgAAAACAAUAAAARAAkAAAACAAUAAAAQAAoAAAACAAQAAAAPAAoAAAACAAQAAAAOAAoAAAACAAQAAAANAAoAAAACAAQAAAAMAAoAAAACAAQAAAALAAoAAAACAAQAAAAKAAoAAAACAAQAAAAJAAoAAAAGAAUAAAAGAAoAAAAFAAQAAAAFAAoAAAACAAQAAAAEAAoAAAACAAQAAAADAAoAAAACAAQAAAACAAoAAAACAAQAAAABAAoAAAACAAQAAAAAAAoAAAACAAQAAAD//wkAAAACAAUAAAD//wAAAAACAAUAAAD//wEAAAACAAUAAAD//wIAAAACAAUAAAD//wMAAAACAAUAAAD//wQAAAACAAUAAAD//wUAAAACAAUAAAD//wYAAAACAAUAAAD//wcAAAACAAUAAAD//wgAAAACAAUAAAAAAAAAAAAOAAEAAAA=") tile_set = ExtResource("1_qel1r") collision_visibility_mode = 1 navigation_visibility_mode = 1 -[node name="TileMapLayer2" type="TileMapLayer" parent="NavigationRegion2D"] +[node name="TileMapLayer2" type="TileMapLayer" parent="RoomRegion"] tile_map_data = PackedByteArray("AAAEAAEAAAASAAwAAAAFAAEAAAATAAwAAAAGAAEAAAATAAwAAAAHAAEAAAATAAwAAAAIAAEAAAATAAwAAAAJAAEAAAATAAwAAAAKAAEAAAATAAwAAAALAAEAAAAUAAwAAAANAAAAAAAKABEAAAAOAAAAAAAKABEAAAAPAAAAAAAKABEAAAAQAAAAAAAKABEAAAA=") tile_set = ExtResource("1_qel1r") -[node name="CharacterBody2D" type="CharacterBody2D" parent="."] -position = Vector2(241, 364) +[node name="Sprites" type="Node2D" parent="."] +z_index = 1 +y_sort_enabled = true + +[node name="Receptionist" parent="Sprites" instance=ExtResource("5_l3mu1")] +position = Vector2(512, -27) + +[node name="CharacterBody2D" type="CharacterBody2D" parent="Sprites"] +position = Vector2(202, 389) script = ExtResource("2_5n4iw") -[node name="Sprite2D" type="Sprite2D" parent="CharacterBody2D"] -scale = Vector2(0.5, 0.5) -texture = ExtResource("2_w7eqs") +[node name="CollisionShape2D" type="CollisionShape2D" parent="Sprites/CharacterBody2D"] +rotation = 1.5707964 +shape = SubResource("CapsuleShape2D_l3mu1") -[node name="NavigationAgent2D" type="NavigationAgent2D" parent="CharacterBody2D"] +[node name="Sprite2D" type="Sprite2D" parent="Sprites/CharacterBody2D"] +position = Vector2(0, -64) +texture = ExtResource("4_l3mu1") + +[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Sprites/CharacterBody2D"] path_desired_distance = 30.0 avoidance_enabled = true -[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"] -shape = SubResource("CircleShape2D_5n4iw") - -[node name="Receptionist" type="CharacterBody2D" parent="."] -modulate = Color(1.7602391, 1.7602391, 1.7602391, 1) -position = Vector2(518, 32) -script = ExtResource("4_g7jyq") - -[node name="Sprite2D" type="Sprite2D" parent="Receptionist"] -modulate = Color(0, 1, 0, 1) -scale = Vector2(0.5, 0.5) -texture = ExtResource("2_w7eqs") - -[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Receptionist"] -path_desired_distance = 30.0 -avoidance_enabled = true - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Receptionist"] -shape = SubResource("CircleShape2D_5n4iw") - -[node name="Queue" type="Node2D" parent="Receptionist"] -position = Vector2(-6, 133) -script = ExtResource("5_13vc8") - -[node name="StateMachine" type="Node" parent="Receptionist"] -script = ExtResource("6_13vc8") - -[node name="Wait" type="Node" parent="Receptionist/StateMachine"] -script = ExtResource("8_bog1h") -wait_duration = 3.0 - -[node name="Advance Queue" type="Node" parent="Receptionist/StateMachine"] -script = ExtResource("7_hph4e") - -[node name="SpeechBubble" type="Sprite2D" parent="Receptionist"] -position = Vector2(39, -42) -texture = ExtResource("4_2wofw") -script = ExtResource("10_50x1e") - -[node name="Sprite2D3" type="Sprite2D" parent="Receptionist/SpeechBubble"] -texture = ExtResource("11_50x1e") -hframes = 8 -vframes = 8 - -[node name="AnimationPlayer" type="AnimationPlayer" parent="Receptionist/SpeechBubble"] -libraries = { -&"": SubResource("AnimationLibrary_uo85v") -} +[node name="EntranceRegion" type="NavigationRegion2D" parent="."] +position = Vector2(448, 600) +navigation_polygon = SubResource("NavigationPolygon_l3mu1") diff --git a/main_panel.gd b/main_panel.gd index 3c58daa..e391367 100644 --- a/main_panel.gd +++ b/main_panel.gd @@ -1,4 +1,4 @@ -class_name GamePanel extends PanelContainer +class_name GamePanel extends MarginContainer const notice_template = preload("res://notice_panel.tscn") const quest_progress_bar_template = preload("res://quest_progress_bar.tscn") @@ -24,8 +24,8 @@ func add_quest_progress_bar(quest : Quest) -> void: func switch_panel(active : bool) -> void: - %Active.visible = active - %Passive.visible = !active + %OpenList.visible = active + %WorkingList.visible = !active func _on_end_shift_pressed() -> void: @@ -39,11 +39,11 @@ func connect_visitor_spawner(spawner : VisitorSpawner) -> void: update_visitor_count(spawner.total_visitors - spawner.visitors_remaining, spawner.total_visitors) func update_visitor_count(current : int, total : int) -> void: - %Passive/VisitorsLabel.text = "Visitors: %d/%d" % [current, total] + %OpenList/VisitorsLabel.text = "Visitors: %d/%d" % [current, total] func notice(msg : String, time : float) -> void: var ntc : NoticePanel = notice_template.instantiate() - $MarginContainer.add_child(ntc) + %Notices.add_child(ntc) ntc.message = msg ntc.duration = time diff --git a/main_panel.tscn b/main_panel.tscn index 79bb45e..1bdc5c2 100644 --- a/main_panel.tscn +++ b/main_panel.tscn @@ -1,91 +1,119 @@ -[gd_scene load_steps=3 format=3 uid="uid://c8ofw6na082gv"] +[gd_scene load_steps=6 format=3 uid="uid://c8ofw6na082gv"] [ext_resource type="Script" uid="uid://dhw85vqlvw33s" path="res://main_panel.gd" id="1_pdekv"] [ext_resource type="Script" uid="uid://4jrp67ckp7vt" path="res://timer_label.gd" id="2_5rs2c"] +[ext_resource type="StyleBox" uid="uid://by1jk8r2avjp4" path="res://styles/open_shift_panel.tres" id="2_b7y1i"] +[ext_resource type="StyleBox" uid="uid://b7vjpwageyi6m" path="res://styles/working_shift_panel.tres" id="4_b7y1i"] -[node name="MainPanel" type="PanelContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = -870.0 -offset_bottom = -526.0 -grow_horizontal = 2 -grow_vertical = 2 +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q6wja"] +content_margin_left = 4.0 +content_margin_top = 4.0 +content_margin_right = 4.0 +content_margin_bottom = 4.0 +bg_color = Color(0.32774815, 0.3295362, 0.561609, 0.6) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +corner_detail = 5 + +[node name="MainPanel" type="MarginContainer"] +offset_right = 319.0 +offset_bottom = 189.0 +theme_override_constants/margin_left = 0 +theme_override_constants/margin_top = 0 +theme_override_constants/margin_right = 0 script = ExtResource("1_pdekv") [node name="Timer" type="Timer" parent="."] wait_time = 400000.0 autostart = true -[node name="MarginContainer" type="MarginContainer" parent="."] +[node name="OpenShift" type="PanelContainer" parent="."] +visible = false layout_mode = 2 -theme_override_constants/margin_left = 20 -theme_override_constants/margin_top = 20 -theme_override_constants/margin_right = 20 -theme_override_constants/margin_bottom = 20 +theme_override_styles/panel = ExtResource("2_b7y1i") -[node name="Passive" type="VBoxContainer" parent="MarginContainer"] +[node name="Margin" type="MarginContainer" parent="OpenShift"] +layout_mode = 2 +theme_override_constants/margin_top = -20 +theme_override_constants/margin_right = -80 + +[node name="OpenList" type="VBoxContainer" parent="OpenShift/Margin"] unique_name_in_owner = true layout_mode = 2 +alignment = 1 -[node name="Label" type="Label" parent="MarginContainer/Passive"] +[node name="Label" type="Label" parent="OpenShift/Margin/OpenList"] layout_mode = 2 theme_override_font_sizes/font_size = 28 text = "Time til Next Shift" horizontal_alignment = 1 -[node name="TimerLabel" type="Label" parent="MarginContainer/Passive"] +[node name="TimerLabel" type="Label" parent="OpenShift/Margin/OpenList"] +layout_mode = 2 +theme_override_font_sizes/font_size = 28 +text = "00:00:00.00" +horizontal_alignment = 1 +script = ExtResource("2_5rs2c") + +[node name="VisitorsLabel" type="Label" parent="OpenShift/Margin/OpenList"] layout_mode = 2 theme_override_font_sizes/font_size = 28 text = "000:00:00.00" script = ExtResource("2_5rs2c") -[node name="VisitorsLabel" type="Label" parent="MarginContainer/Passive"] +[node name="Button" type="Button" parent="OpenShift/Margin/OpenList"] layout_mode = 2 -theme_override_font_sizes/font_size = 28 -text = "000:00:00.00" -script = ExtResource("2_5rs2c") +theme_override_styles/normal = SubResource("StyleBoxFlat_q6wja") +text = "CLOSE GUILD" -[node name="QuestProgressList" type="ScrollContainer" parent="MarginContainer/Passive"] +[node name="WorkingShift" type="PanelContainer" parent="."] +visible = false +layout_mode = 2 +theme_override_styles/panel = ExtResource("4_b7y1i") + +[node name="MarginContainer" type="MarginContainer" parent="WorkingShift"] +layout_mode = 2 +theme_override_constants/margin_left = -80 +theme_override_constants/margin_top = -20 + +[node name="WorkingList" type="VBoxContainer" parent="WorkingShift/MarginContainer"] unique_name_in_owner = true +layout_mode = 2 + +[node name="Label" type="Label" parent="WorkingShift/MarginContainer/WorkingList"] +layout_mode = 2 +theme_override_font_sizes/font_size = 28 +text = "Time til Next Shift" +horizontal_alignment = 1 + +[node name="TimerLabel" type="Label" parent="WorkingShift/MarginContainer/WorkingList"] +layout_mode = 2 +theme_override_font_sizes/font_size = 28 +text = "000:00:00.00" +script = ExtResource("2_5rs2c") + +[node name="Button" type="Button" parent="WorkingShift/MarginContainer/WorkingList"] +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxFlat_q6wja") +text = "Show Quests" + +[node name="QuestProgressList" type="ScrollContainer" parent="."] +visible = false clip_contents = false custom_minimum_size = Vector2(260, 100) layout_mode = 2 horizontal_scroll_mode = 0 -[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/Passive/QuestProgressList"] +[node name="VBoxContainer" type="VBoxContainer" parent="QuestProgressList"] custom_minimum_size = Vector2(300, 100) layout_mode = 2 -[node name="Active" type="VBoxContainer" parent="MarginContainer"] +[node name="Notices" type="VBoxContainer" parent="."] unique_name_in_owner = true -visible = false layout_mode = 2 -[node name="Label" type="Label" parent="MarginContainer/Active"] -layout_mode = 2 -theme_override_font_sizes/font_size = 28 -text = "Time til Next Shift" -horizontal_alignment = 1 - -[node name="TimerLabel" type="Label" parent="MarginContainer/Active"] -layout_mode = 2 -theme_override_font_sizes/font_size = 28 -text = "00:00:00.00" -horizontal_alignment = 1 -script = ExtResource("2_5rs2c") - -[node name="Label3" type="Label" parent="MarginContainer/Active"] -visible = false -layout_mode = 2 -theme_override_font_sizes/font_size = 28 -text = "00:00:00.00" -horizontal_alignment = 1 - -[node name="Button" type="Button" parent="MarginContainer/Active"] -layout_mode = 2 -text = "END SHIFT" - -[connection signal="time_changed" from="." to="MarginContainer/Passive/TimerLabel" method="_on_time_changed"] -[connection signal="time_changed" from="." to="MarginContainer/Active/TimerLabel" method="_on_time_changed"] -[connection signal="pressed" from="MarginContainer/Active/Button" to="." method="_on_end_shift_pressed"] +[connection signal="time_changed" from="." to="OpenShift/Margin/OpenList/TimerLabel" method="_on_time_changed"] +[connection signal="pressed" from="OpenShift/Margin/OpenList/Button" to="OpenShift" method="_on_end_shift_pressed"] +[connection signal="pressed" from="WorkingShift/MarginContainer/WorkingList/Button" to="OpenShift" method="_on_end_shift_pressed"] diff --git a/open_shift_panel.png b/open_shift_panel.png new file mode 100644 index 0000000..71717c6 Binary files /dev/null and b/open_shift_panel.png differ diff --git a/open_shift_panel.png.import b/open_shift_panel.png.import new file mode 100644 index 0000000..f005507 --- /dev/null +++ b/open_shift_panel.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgf0ow1t18yqf" +path="res://.godot/imported/open_shift_panel.png-b4e397711e29b830c9d9a5e0da2dffec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://open_shift_panel.png" +dest_files=["res://.godot/imported/open_shift_panel.png-b4e397711e29b830c9d9a5e0da2dffec.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.godot b/project.godot index 7d11e05..f9ee753 100644 --- a/project.godot +++ b/project.godot @@ -38,6 +38,10 @@ project/assembly_name="pomchronicles" ] } +[limbo_ai] + +behavior_tree/behavior_tree_default_dir="res://demo/ai/trees" + [rendering] textures/canvas_textures/default_texture_filter=0 diff --git a/quest_board.gd b/quest_board.gd index aa98cee..e0e3fb5 100644 --- a/quest_board.gd +++ b/quest_board.gd @@ -1,8 +1,18 @@ -extends Interactable +class_name QuestBoard extends Interactable @onready var polygon : CollisionPolygon2D = $CollisionPolygon2D @onready var window : QuestBoardWindow = $QuestBoardWindow +var busy : bool + +signal interaction_complete() + +func _ready() -> void: + register_board.call_deferred() + +func register_board() -> void: + Guild.hall.board = self + func _input(event : InputEvent) -> void: var evt : InputEventMouseButton = event as InputEventMouseButton if evt and evt.button_index == MOUSE_BUTTON_LEFT and evt.pressed: @@ -15,3 +25,8 @@ func interact(interactor, type : String = "") -> void: if interactor is Player: window.populate(Guild.quests.keys()) window.popup_centered() + elif type == "quest": + #Go through all quests and create a list of open quests suitable for their level + #If that list is zero, return without giving them a quest + #Else pick a random quest from the list and assign it to them + pass diff --git a/receptionist.tscn b/receptionist.tscn new file mode 100644 index 0000000..a62d960 --- /dev/null +++ b/receptionist.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=8 format=3 uid="uid://cf6nnjyp8kv78"] + +[ext_resource type="Script" uid="uid://b2unuudq5qfl" path="res://guild_employee.gd" id="1_vwytd"] +[ext_resource type="Texture2D" uid="uid://cg6ptmynq0aq0" path="res://basic-sprite.png" id="2_dlmqr"] +[ext_resource type="Script" uid="uid://b0q2233msdtgo" path="res://guild_queue.gd" id="3_wurf5"] +[ext_resource type="PackedScene" uid="uid://jbqw0n6dlj08" path="res://speech_bubble.tscn" id="4_dlmqr"] +[ext_resource type="BehaviorTree" uid="uid://dxyx7tjsd7khq" path="res://ai/trees/receptionist.tres" id="7_qmbsn"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_dlmqr"] +radius = 15.0 +height = 54.0 + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_xsrct"] + +[node name="Receptionist" type="CharacterBody2D"] +modulate = Color(1.7602391, 1.7602391, 1.7602391, 1) +position = Vector2(0, -64) +script = ExtResource("1_vwytd") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(0, 63.999992) +rotation = 1.5707964 +shape = SubResource("CapsuleShape2D_dlmqr") + +[node name="Sprite2D" type="Sprite2D" parent="."] +modulate = Color(0, 0.40784314, 1, 1) +texture = ExtResource("2_dlmqr") + +[node name="NavigationAgent2D" type="NavigationAgent2D" parent="."] +path_desired_distance = 30.0 +avoidance_enabled = true + +[node name="Queue" type="Node2D" parent="."] +position = Vector2(0, 141) +script = ExtResource("3_wurf5") +direction = Vector2(0, 1) + +[node name="SpeechBubble" parent="." instance=ExtResource("4_dlmqr")] +position = Vector2(44, -77) + +[node name="BTPlayer" type="BTPlayer" parent="."] +behavior_tree = ExtResource("7_qmbsn") +blackboard_plan = SubResource("BlackboardPlan_xsrct") diff --git a/speech_bubble.tscn b/speech_bubble.tscn new file mode 100644 index 0000000..ef93a69 --- /dev/null +++ b/speech_bubble.tscn @@ -0,0 +1,114 @@ +[gd_scene load_steps=8 format=3 uid="uid://jbqw0n6dlj08"] + +[ext_resource type="Texture2D" uid="uid://cbamfadh7wwr7" path="res://speech-blip.png" id="1_ra651"] +[ext_resource type="Script" uid="uid://w57riwplc00t" path="res://speech_bubble.gd" id="2_n7y37"] +[ext_resource type="Texture2D" uid="uid://chnk20ey5qxfh" path="res://speech-emojis.png" id="3_iafp4"] + +[sub_resource type="Animation" id="Animation_bog1h"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D3:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D3:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} + +[sub_resource type="Animation" id="Animation_13vc8"] +resource_name = "busy" +length = 0.7000034 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D3:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 8, 9, 16, 17, 24, 25] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D3:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} + +[sub_resource type="Animation" id="Animation_lsinl"] +resource_name = "talk" +length = 0.40000334 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D3:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -3)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D3:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 1, +"values": [2, 3, 10, 3, 2] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_uo85v"] +_data = { +&"RESET": SubResource("Animation_bog1h"), +&"busy": SubResource("Animation_13vc8"), +&"talk": SubResource("Animation_lsinl") +} + +[node name="SpeechBubble" type="Sprite2D"] +visible = false +position = Vector2(25, -26) +scale = Vector2(2, 2) +texture = ExtResource("1_ra651") +script = ExtResource("2_n7y37") + +[node name="Sprite2D3" type="Sprite2D" parent="."] +texture = ExtResource("3_iafp4") +hframes = 8 +vframes = 8 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_uo85v") +} diff --git a/styles/open_shift_panel.tres b/styles/open_shift_panel.tres new file mode 100644 index 0000000..aa8b89a --- /dev/null +++ b/styles/open_shift_panel.tres @@ -0,0 +1,10 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=3 uid="uid://by1jk8r2avjp4"] + +[ext_resource type="Texture2D" uid="uid://bgf0ow1t18yqf" path="res://open_shift_panel.png" id="1_vv6wn"] + +[resource] +texture = ExtResource("1_vv6wn") +texture_margin_left = 40.0 +texture_margin_top = 44.0 +texture_margin_right = 117.0 +texture_margin_bottom = 48.0 diff --git a/styles/working_shift_panel.tres b/styles/working_shift_panel.tres new file mode 100644 index 0000000..c527cf6 --- /dev/null +++ b/styles/working_shift_panel.tres @@ -0,0 +1,10 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=3 uid="uid://b7vjpwageyi6m"] + +[ext_resource type="Texture2D" uid="uid://uhovyed0br4e" path="res://working_shift_panel.png" id="1_tfsob"] + +[resource] +texture = ExtResource("1_tfsob") +texture_margin_left = 117.0 +texture_margin_top = 48.0 +texture_margin_right = 48.0 +texture_margin_bottom = 35.0 diff --git a/test_adventurer_sprite.tscn b/test_adventurer_sprite.tscn index 0fb8e29..2812041 100644 --- a/test_adventurer_sprite.tscn +++ b/test_adventurer_sprite.tscn @@ -1,114 +1,35 @@ -[gd_scene load_steps=16 format=3 uid="uid://dew8gxu55ex6q"] +[gd_scene load_steps=7 format=3 uid="uid://dew8gxu55ex6q"] [ext_resource type="Script" uid="uid://cjqumk0kw2vte" path="res://adventurer.gd" id="1_wif60"] -[ext_resource type="Texture2D" uid="uid://bldpiytpdrge6" path="res://icon.svg" id="2_rwbq5"] -[ext_resource type="Texture2D" uid="uid://cbamfadh7wwr7" path="res://speech-blip.png" id="3_71qlo"] -[ext_resource type="Texture2D" uid="uid://1mmg270gotb1" path="res://busy-dots.png" id="4_ay0uu"] -[ext_resource type="Script" uid="uid://w57riwplc00t" path="res://speech_bubble.gd" id="4_rwbq5"] -[ext_resource type="Script" uid="uid://dl3b5aywu1hf6" path="res://fsm/nodes/wait.gd" id="6_1cj4e"] -[ext_resource type="Script" uid="uid://dthatmb3if73u" path="res://fsm/machines/newbie.gd" id="6_snss2"] -[ext_resource type="Script" uid="uid://e8we6nmaob1k" path="res://fsm/nodes/test.gd" id="7_ux5kh"] -[ext_resource type="Script" uid="uid://bewrajxqdutsu" path="res://fsm/interact_with_employee.gd" id="9_snss2"] -[ext_resource type="Script" uid="uid://y85swbbk8kbd" path="res://fsm/nodes/queue.gd" id="10_1cj4e"] -[ext_resource type="Script" uid="uid://b0ewnwcibhu21" path="res://fsm/nodes/leave.gd" id="11_ux5kh"] +[ext_resource type="Texture2D" uid="uid://cg6ptmynq0aq0" path="res://basic-sprite.png" id="2_aos2b"] +[ext_resource type="PackedScene" uid="uid://jbqw0n6dlj08" path="res://speech_bubble.tscn" id="3_aos2b"] +[ext_resource type="BehaviorTree" uid="uid://dght2flegv70i" path="res://ai/trees/adventurer.tres" id="6_006nh"] -[sub_resource type="CircleShape2D" id="CircleShape2D_5n4iw"] -radius = 35.0 +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_aos2b"] +radius = 15.0 +height = 54.0 -[sub_resource type="Animation" id="Animation_bog1h"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite2D3:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [0] -} - -[sub_resource type="Animation" id="Animation_13vc8"] -resource_name = "busy" -length = 0.7000034 -loop_mode = 1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite2D3:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), -"update": 1, -"values": [0, 1, 2, 3, 4, 5, 6, 0] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_uo85v"] -_data = { -&"RESET": SubResource("Animation_bog1h"), -&"busy": SubResource("Animation_13vc8") -} +[sub_resource type="BlackboardPlan" id="BlackboardPlan_tdl5m"] [node name="AdventurerSprite" type="CharacterBody2D"] script = ExtResource("1_wif60") -interaction_range = null -stop_range = null + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +rotation = 1.5707964 +shape = SubResource("CapsuleShape2D_aos2b") [node name="Sprite2D" type="Sprite2D" parent="."] modulate = Color(0, 1, 0, 1) -scale = Vector2(0.5, 0.5) -texture = ExtResource("2_rwbq5") +position = Vector2(0, -64) +texture = ExtResource("2_aos2b") [node name="NavigationAgent2D" type="NavigationAgent2D" parent="."] path_desired_distance = 30.0 avoidance_enabled = true -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -shape = SubResource("CircleShape2D_5n4iw") +[node name="SpeechBubble" parent="." instance=ExtResource("3_aos2b")] +position = Vector2(44, -141) -[node name="SpeechBubble" type="Sprite2D" parent="."] -visible = false -position = Vector2(39, -42) -texture = ExtResource("3_71qlo") -script = ExtResource("4_rwbq5") - -[node name="Sprite2D3" type="Sprite2D" parent="SpeechBubble"] -position = Vector2(0, -4) -texture = ExtResource("4_ay0uu") -hframes = 2 -vframes = 4 - -[node name="AnimationPlayer" type="AnimationPlayer" parent="SpeechBubble"] -libraries = { -&"": SubResource("AnimationLibrary_uo85v") -} - -[node name="StateMachine" type="Node" parent="."] -script = ExtResource("6_snss2") -starting_state = "Queue" - -[node name="Wait" type="Node" parent="StateMachine"] -script = ExtResource("6_1cj4e") -wait_duration = 3.0 - -[node name="Test" type="Node" parent="StateMachine"] -script = ExtResource("7_ux5kh") -message = "TEST COMPLETE!" - -[node name="Interact With Employee" type="Node" parent="StateMachine"] -script = ExtResource("9_snss2") -employee_name = "Receptionist" -speech_bubble = "Talk" -wait_duration = null -interaction_args = Array[String](["register"]) - -[node name="Queue" type="Node" parent="StateMachine"] -script = ExtResource("10_1cj4e") -employee = "Receptionist" - -[node name="Node" type="Node" parent="StateMachine"] -script = ExtResource("11_ux5kh") +[node name="BTPlayer" type="BTPlayer" parent="."] +behavior_tree = ExtResource("6_006nh") +blackboard_plan = SubResource("BlackboardPlan_tdl5m") diff --git a/test_limbo.gd b/test_limbo.gd new file mode 100644 index 0000000..5360193 --- /dev/null +++ b/test_limbo.gd @@ -0,0 +1,4 @@ +extends CharacterBody2D + + +var busy : bool = false diff --git a/test_limbo.gd.uid b/test_limbo.gd.uid new file mode 100644 index 0000000..4c2ebae --- /dev/null +++ b/test_limbo.gd.uid @@ -0,0 +1 @@ +uid://cgsnqeb1dg23d diff --git a/working_shift_panel.png b/working_shift_panel.png new file mode 100644 index 0000000..3da65ba Binary files /dev/null and b/working_shift_panel.png differ diff --git a/working_shift_panel.png.import b/working_shift_panel.png.import new file mode 100644 index 0000000..be9fc4f --- /dev/null +++ b/working_shift_panel.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uhovyed0br4e" +path="res://.godot/imported/working_shift_panel.png-781dd400cffdd75c157d56019ee2f944.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://working_shift_panel.png" +dest_files=["res://.godot/imported/working_shift_panel.png-781dd400cffdd75c157d56019ee2f944.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1