New art assets, work on implementing more adventurer behavior and making them work better together, and steps towards completing the first quest loop.

This commit is contained in:
2025-07-31 08:44:26 -04:00
parent c0a2c058ba
commit 38a7ed85b0
66 changed files with 1112 additions and 658 deletions

3
.gitignore vendored
View File

@@ -1,3 +1,6 @@
# Godot 4+ specific ignores # Godot 4+ specific ignores
.godot/ .godot/
/android/ /android/
#limboai ignores
/addons/limboai/
/demo/

View File

@@ -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="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://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://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="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"] [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"] [node name="Active Scene" type="Node2D"]
script = ExtResource("1_8p2cu") script = ExtResource("1_8p2cu")
[node name="Guildhall" parent="." instance=ExtResource("1_fcxuj")] [node name="Guildhall" parent="." instance=ExtResource("1_fcxuj")]
position = Vector2(421, 161) position = Vector2(421, 161)
[node name="NavigationRegion2D" parent="Guildhall" index="0"] [node name="CollisionShape2D" parent="Guildhall/Sprites/CharacterBody2D" index="0"]
position = Vector2(-8, 25) shape = SubResource("CapsuleShape2D_d0hfk")
[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="VisitorSpawner" type="Node2D" parent="Guildhall"] [node name="VisitorSpawner" type="Node2D" parent="Guildhall"]
position = Vector2(505, 870) position = Vector2(505, 870)
script = ExtResource("6_d0hfk") script = ExtResource("6_d0hfk")
total_visitors = 5 total_visitors = 3
[node name="Timer" type="Timer" parent="Guildhall/VisitorSpawner"] [node name="Timer" type="Timer" parent="Guildhall/VisitorSpawner"]
@@ -62,7 +34,7 @@ offset_top = 23.0
offset_right = 1903.0 offset_right = 1903.0
offset_bottom = 185.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 layout_mode = 2
[node name="Notices" type="Control" parent="UI/VBoxContainer"] [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")] [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"] [connection signal="timeout" from="Guildhall/VisitorSpawner/Timer" to="Guildhall/VisitorSpawner" method="_on_timer_timeout"]
[editable path="Guildhall"] [editable path="Guildhall"]

View File

@@ -1,19 +1,25 @@
class_name Adventurer extends CharacterBody2D 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_speed : float = 400.0
@onready var movement_target_position : Vector2 = global_position @onready var movement_target_position : Vector2 = global_position
@onready var nav_agent : NavigationAgent2D = $NavigationAgent2D @onready var nav_agent : NavigationAgent2D = $NavigationAgent2D
var data : AdventurerData = null var data : AdventurerData = null
var interaction_target = 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 @onready var bubble : SpeechBubble = $SpeechBubble
@export var interaction_range : float = 75 @export var interaction_range : float = 75
@export var stop_range : float = 25 @export var stop_range : float = 25
signal navigation_finished()
signal navigation_failed()
func _ready() -> void: func _ready() -> void:
state_machine.actor = self nav_agent.navigation_finished.connect(_on_nav_agent_finished)
state_machine.start() pass
func _physics_process(delta: float) -> void: func _physics_process(delta: float) -> void:
if nav_agent.is_navigation_finished(): if nav_agent.is_navigation_finished():
@@ -23,15 +29,26 @@ func _physics_process(delta: float) -> void:
#clear the target #clear the target
#try_interact #try_interact
return return
var curr_pos: Vector2 = global_position var curr_pos: Vector2 = global_position
var next_path_pos: Vector2 = nav_agent.get_next_path_position() var next_path_pos: Vector2 = nav_agent.get_next_path_position()
velocity = curr_pos.direction_to(next_path_pos) * movement_speed velocity = curr_pos.direction_to(next_path_pos) * movement_speed
move_and_slide() 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: func approach(pos : Vector2) -> void:
stuck = false
var rid = get_world_2d().get_navigation_map() var rid = get_world_2d().get_navigation_map()
var point : Vector2 = NavigationServer2D.map_get_closest_point(rid, pos) var point : Vector2 = NavigationServer2D.map_get_closest_point(rid, pos)
set_movement_target(point) set_movement_target(point)
@@ -57,3 +74,6 @@ func set_movement_target(target : Vector2) -> void:
func show_speech_bubble(bubble_type : String) -> void: func show_speech_bubble(bubble_type : String) -> void:
bubble.try_show_speech(bubble_type) bubble.try_show_speech(bubble_type)
func _on_nav_agent_finished() -> void:
navigation_finished.emit()

BIN
ai/icons/stopwatch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1 @@
uid://ders6t7axct24

48
ai/tasks/actions/go_to.gd Normal file
View File

@@ -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)

View File

@@ -0,0 +1 @@
uid://h113xg55h4r8

View File

@@ -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

View File

@@ -0,0 +1 @@
uid://bsq5dxul0uto

View File

@@ -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)

View File

@@ -0,0 +1 @@
uid://767b4fdlrgr

View File

@@ -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

View File

@@ -0,0 +1 @@
uid://xom38ohdwfms

View File

@@ -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

View File

@@ -0,0 +1 @@
uid://bcbfnm21rtkuo

View File

@@ -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"

View File

@@ -0,0 +1 @@
uid://b2vuw12mttm40

145
ai/trees/adventurer.tres Normal file
View File

@@ -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")

View File

@@ -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")

BIN
basic-sprite.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

40
basic-sprite.png.import Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -1 +0,0 @@
uid://bewrajxqdutsu

View File

@@ -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)

View File

@@ -1 +0,0 @@
uid://dthatmb3if73u

View File

@@ -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)

View File

@@ -1 +0,0 @@
uid://cggu0yihq0unt

View File

@@ -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])

View File

@@ -1 +0,0 @@
uid://u81fhi8157bg

View File

@@ -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)

View File

@@ -1 +0,0 @@
uid://djd8pv5xbgud3

View File

@@ -1,6 +0,0 @@
extends StateNode
func execute(subject, ...args : Array) -> void:
if !subject.busy:
subject.queue.try_advance()
complete_state()

View File

@@ -1 +0,0 @@
uid://csicx3fpxv7xt

View File

@@ -1 +0,0 @@
extends StateNode

View File

@@ -1 +0,0 @@
uid://b0ewnwcibhu21

View File

@@ -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)

View File

@@ -1 +0,0 @@
uid://y85swbbk8kbd

View File

@@ -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)

View File

@@ -1 +0,0 @@
uid://c27ctn874rdns

View File

@@ -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()

View File

@@ -1 +0,0 @@
uid://e8we6nmaob1k

View File

@@ -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 = []

View File

@@ -1 +0,0 @@
uid://dl3b5aywu1hf6

View File

@@ -9,9 +9,9 @@ var end_shift_confirm_template = preload("res://end_shift_confirmation.tscn")
func _ready() -> void: func _ready() -> void:
end_shift_confirmation = end_shift_confirm_template.instantiate() end_shift_confirmation = end_shift_confirm_template.instantiate()
add_child(end_shift_confirmation) add_child(end_shift_confirmation)
var file =FileAccess.open("res://name.txt",FileAccess.READ) #var file =FileAccess.open("res://name.txt",FileAccess.READ)
var text =file.get_line() #var text =file.get_line()
var nmnames = text.remove_chars(" ").split(",") #var nmnames = text.remove_chars(" ").split(",")
func _process(delta: float) -> void: func _process(delta: float) -> void:
if active and Input.is_action_just_pressed("switch modes"): if active and Input.is_action_just_pressed("switch modes"):

View File

@@ -20,6 +20,11 @@ func register_guild_member(member : AdventurerData, first : bool = false) -> voi
if first: if first:
Game.notice("%s has joined the guild!" % member.name, 5) 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: func add_quest(quest : Quest) -> void:
quests[quest] = false quests[quest] = false
Game.quest_log.add_entry(quest) Game.quest_log.add_entry(quest)

View File

@@ -4,7 +4,9 @@ class_name GuildEmployee extends Adventurer
@onready var queue : GuildQueue = $Queue @onready var queue : GuildQueue = $Queue
var busy : bool var busy : bool
signal service_provided()
func interact(interactor, type : String = "") -> void: func interact(interactor, type : String = "") -> void:
if type == "register": if type == "register":
Guild.register_guild_member(interactor.data, true) Guild.register_guild_member(interactor.data, true)
service_provided.emit()

View File

@@ -5,11 +5,18 @@ var length : int :
return len(members) return len(members)
@export var direction : Vector2 = Vector2.ZERO @export var direction : Vector2 = Vector2.ZERO
var members : Array[Adventurer] = [] var members : Array[Adventurer] = []
var front : Adventurer :
get: return null if len(members) == 0 else members[0]
signal advanced() signal advanced()
func add_member(member : Adventurer) -> void: func add_member(member : Adventurer) -> void:
members.append(member) 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: func try_advance() -> Adventurer:
if length > 0: if length > 0:
@@ -18,6 +25,18 @@ func try_advance() -> Adventurer:
return null return null
func advance() -> Adventurer: func advance() -> Adventurer:
var member = members.pop_front()
advanced.emit() 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)

View File

@@ -1,10 +1,13 @@
class_name Guildhall extends Node2D class_name Guildhall extends Node2D
var employees : Dictionary[String, GuildEmployee] = {} var employees : Dictionary[String, GuildEmployee] = {}
var board : QuestBoard
@onready var sprite_node : Node2D = $Sprites
@onready var nav_region : NavigationRegion2D = $RoomRegion
func _ready() -> void: func _ready() -> void:
Guild.hall = self Guild.hall = self
for child in get_children(): for child in sprite_node.get_children():
if child is GuildEmployee: if child is GuildEmployee:
register_employee(child) register_employee(child)
@@ -14,4 +17,4 @@ func register_employee(employee: GuildEmployee) -> void:
func add_sprite(sprite : Adventurer) -> void: func add_sprite(sprite : Adventurer) -> void:
add_child(sprite) sprite_node.add_child(sprite)

View File

@@ -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="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="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="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://cg6ptmynq0aq0" path="res://basic-sprite.png" id="4_l3mu1"]
[ext_resource type="Texture2D" uid="uid://cbamfadh7wwr7" path="res://speech-blip.png" id="4_2wofw"] [ext_resource type="PackedScene" uid="uid://cf6nnjyp8kv78" path="res://receptionist.tscn" id="5_l3mu1"]
[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"]
[sub_resource type="NavigationPolygon" id="NavigationPolygon_w7eqs"] [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) 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), 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)]) polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3), PackedInt32Array(0, 3, 4, 5), PackedInt32Array(5, 4, 6, 7)])
sample_partition_type = 1 border_size = 500.0
agent_radius = 40.0
[sub_resource type="CircleShape2D" id="CircleShape2D_5n4iw"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_l3mu1"]
radius = 35.0 radius = 15.0
height = 54.0
[sub_resource type="Animation" id="Animation_bog1h"] [sub_resource type="NavigationPolygon" id="NavigationPolygon_l3mu1"]
length = 0.001 vertices = PackedVector2Array(117.96875, 286, 9.96875, 286, 9.03125, 0, 117.03125, 0)
tracks/0/type = "value" polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
tracks/0/imported = false outlines = Array[PackedVector2Array]([PackedVector2Array(-1, -10, 127, -10, 128, 296, 0, 296)])
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="Guildhall" type="Node2D"] [node name="Guildhall" type="Node2D"]
script = ExtResource("1_lsinl") script = ExtResource("1_lsinl")
[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."] [node name="RoomRegion" type="NavigationRegion2D" parent="."]
navigation_polygon = SubResource("NavigationPolygon_w7eqs") navigation_polygon = SubResource("NavigationPolygon_w7eqs")
[node name="TileMapLayer" type="TileMapLayer" parent="NavigationRegion2D"] [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//AAACAAQAAAARAAAAAAACAAUAAAARAAEAAAACAAUAAAARAAIAAAACAAUAAAARAAMAAAACAAUAAAARAAQAAAACAAUAAAARAAUAAAACAAUAAAARAAYAAAACAAUAAAARAAcAAAACAAUAAAARAAgAAAACAAUAAAARAAkAAAACAAUAAAAQAAoAAAACAAQAAAAPAAoAAAACAAQAAAAOAAoAAAACAAQAAAANAAoAAAACAAQAAAAMAAoAAAACAAQAAAALAAoAAAACAAQAAAAKAAoAAAACAAQAAAAJAAoAAAAGAAUAAAAIAAoAAAAFAAAAAAAHAAoAAAAFAAAAAAAGAAoAAAAFAAQAAAAFAAoAAAACAAQAAAAEAAoAAAACAAQAAAADAAoAAAACAAQAAAACAAoAAAACAAQAAAABAAoAAAACAAQAAAAAAAoAAAACAAQAAAD//wkAAAACAAUAAAD//wAAAAACAAUAAAD//wEAAAACAAUAAAD//wIAAAACAAUAAAD//wMAAAACAAUAAAD//wQAAAACAAUAAAD//wUAAAACAAUAAAD//wYAAAACAAUAAAD//wcAAAACAAUAAAD//wgAAAACAAUAAAAHAAsAAAAFAAAAAAAIAAsAAAAFAAAAAAAHAAwAAAAFAAAAAAAIAAwAAAAFAAAAAAAHAA0AAAAFAAAAAAAIAA0AAAAFAAAAAAAAAAAAAAAOAAEAAAA=") 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") tile_set = ExtResource("1_qel1r")
collision_visibility_mode = 1 collision_visibility_mode = 1
navigation_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_map_data = PackedByteArray("AAAEAAEAAAASAAwAAAAFAAEAAAATAAwAAAAGAAEAAAATAAwAAAAHAAEAAAATAAwAAAAIAAEAAAATAAwAAAAJAAEAAAATAAwAAAAKAAEAAAATAAwAAAALAAEAAAAUAAwAAAANAAAAAAAKABEAAAAOAAAAAAAKABEAAAAPAAAAAAAKABEAAAAQAAAAAAAKABEAAAA=")
tile_set = ExtResource("1_qel1r") tile_set = ExtResource("1_qel1r")
[node name="CharacterBody2D" type="CharacterBody2D" parent="."] [node name="Sprites" type="Node2D" parent="."]
position = Vector2(241, 364) 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") script = ExtResource("2_5n4iw")
[node name="Sprite2D" type="Sprite2D" parent="CharacterBody2D"] [node name="CollisionShape2D" type="CollisionShape2D" parent="Sprites/CharacterBody2D"]
scale = Vector2(0.5, 0.5) rotation = 1.5707964
texture = ExtResource("2_w7eqs") 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 path_desired_distance = 30.0
avoidance_enabled = true avoidance_enabled = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="CharacterBody2D"] [node name="EntranceRegion" type="NavigationRegion2D" parent="."]
shape = SubResource("CircleShape2D_5n4iw") position = Vector2(448, 600)
navigation_polygon = SubResource("NavigationPolygon_l3mu1")
[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")
}

View File

@@ -1,4 +1,4 @@
class_name GamePanel extends PanelContainer class_name GamePanel extends MarginContainer
const notice_template = preload("res://notice_panel.tscn") const notice_template = preload("res://notice_panel.tscn")
const quest_progress_bar_template = preload("res://quest_progress_bar.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: func switch_panel(active : bool) -> void:
%Active.visible = active %OpenList.visible = active
%Passive.visible = !active %WorkingList.visible = !active
func _on_end_shift_pressed() -> void: 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) update_visitor_count(spawner.total_visitors - spawner.visitors_remaining, spawner.total_visitors)
func update_visitor_count(current : int, total : int) -> void: 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: func notice(msg : String, time : float) -> void:
var ntc : NoticePanel = notice_template.instantiate() var ntc : NoticePanel = notice_template.instantiate()
$MarginContainer.add_child(ntc) %Notices.add_child(ntc)
ntc.message = msg ntc.message = msg
ntc.duration = time ntc.duration = time

View File

@@ -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://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="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"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q6wja"]
anchors_preset = 15 content_margin_left = 4.0
anchor_right = 1.0 content_margin_top = 4.0
anchor_bottom = 1.0 content_margin_right = 4.0
offset_right = -870.0 content_margin_bottom = 4.0
offset_bottom = -526.0 bg_color = Color(0.32774815, 0.3295362, 0.561609, 0.6)
grow_horizontal = 2 corner_radius_top_left = 3
grow_vertical = 2 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") script = ExtResource("1_pdekv")
[node name="Timer" type="Timer" parent="."] [node name="Timer" type="Timer" parent="."]
wait_time = 400000.0 wait_time = 400000.0
autostart = true autostart = true
[node name="MarginContainer" type="MarginContainer" parent="."] [node name="OpenShift" type="PanelContainer" parent="."]
visible = false
layout_mode = 2 layout_mode = 2
theme_override_constants/margin_left = 20 theme_override_styles/panel = ExtResource("2_b7y1i")
theme_override_constants/margin_top = 20
theme_override_constants/margin_right = 20
theme_override_constants/margin_bottom = 20
[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 unique_name_in_owner = true
layout_mode = 2 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 layout_mode = 2
theme_override_font_sizes/font_size = 28 theme_override_font_sizes/font_size = 28
text = "Time til Next Shift" text = "Time til Next Shift"
horizontal_alignment = 1 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 layout_mode = 2
theme_override_font_sizes/font_size = 28 theme_override_font_sizes/font_size = 28
text = "000:00:00.00" text = "000:00:00.00"
script = ExtResource("2_5rs2c") script = ExtResource("2_5rs2c")
[node name="VisitorsLabel" type="Label" parent="MarginContainer/Passive"] [node name="Button" type="Button" parent="OpenShift/Margin/OpenList"]
layout_mode = 2 layout_mode = 2
theme_override_font_sizes/font_size = 28 theme_override_styles/normal = SubResource("StyleBoxFlat_q6wja")
text = "000:00:00.00" text = "CLOSE GUILD"
script = ExtResource("2_5rs2c")
[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 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 clip_contents = false
custom_minimum_size = Vector2(260, 100) custom_minimum_size = Vector2(260, 100)
layout_mode = 2 layout_mode = 2
horizontal_scroll_mode = 0 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) custom_minimum_size = Vector2(300, 100)
layout_mode = 2 layout_mode = 2
[node name="Active" type="VBoxContainer" parent="MarginContainer"] [node name="Notices" type="VBoxContainer" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
visible = false
layout_mode = 2 layout_mode = 2
[node name="Label" type="Label" parent="MarginContainer/Active"] [connection signal="time_changed" from="." to="OpenShift/Margin/OpenList/TimerLabel" method="_on_time_changed"]
layout_mode = 2 [connection signal="pressed" from="OpenShift/Margin/OpenList/Button" to="OpenShift" method="_on_end_shift_pressed"]
theme_override_font_sizes/font_size = 28 [connection signal="pressed" from="WorkingShift/MarginContainer/WorkingList/Button" to="OpenShift" method="_on_end_shift_pressed"]
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"]

BIN
open_shift_panel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -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

View File

@@ -38,6 +38,10 @@ project/assembly_name="pomchronicles"
] ]
} }
[limbo_ai]
behavior_tree/behavior_tree_default_dir="res://demo/ai/trees"
[rendering] [rendering]
textures/canvas_textures/default_texture_filter=0 textures/canvas_textures/default_texture_filter=0

View File

@@ -1,8 +1,18 @@
extends Interactable class_name QuestBoard extends Interactable
@onready var polygon : CollisionPolygon2D = $CollisionPolygon2D @onready var polygon : CollisionPolygon2D = $CollisionPolygon2D
@onready var window : QuestBoardWindow = $QuestBoardWindow @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: func _input(event : InputEvent) -> void:
var evt : InputEventMouseButton = event as InputEventMouseButton var evt : InputEventMouseButton = event as InputEventMouseButton
if evt and evt.button_index == MOUSE_BUTTON_LEFT and evt.pressed: 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: if interactor is Player:
window.populate(Guild.quests.keys()) window.populate(Guild.quests.keys())
window.popup_centered() 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

43
receptionist.tscn Normal file
View File

@@ -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")

114
speech_bubble.tscn Normal file
View File

@@ -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")
}

View File

@@ -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

View File

@@ -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

View File

@@ -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="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://cg6ptmynq0aq0" path="res://basic-sprite.png" id="2_aos2b"]
[ext_resource type="Texture2D" uid="uid://cbamfadh7wwr7" path="res://speech-blip.png" id="3_71qlo"] [ext_resource type="PackedScene" uid="uid://jbqw0n6dlj08" path="res://speech_bubble.tscn" id="3_aos2b"]
[ext_resource type="Texture2D" uid="uid://1mmg270gotb1" path="res://busy-dots.png" id="4_ay0uu"] [ext_resource type="BehaviorTree" uid="uid://dght2flegv70i" path="res://ai/trees/adventurer.tres" id="6_006nh"]
[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"]
[sub_resource type="CircleShape2D" id="CircleShape2D_5n4iw"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_aos2b"]
radius = 35.0 radius = 15.0
height = 54.0
[sub_resource type="Animation" id="Animation_bog1h"] [sub_resource type="BlackboardPlan" id="BlackboardPlan_tdl5m"]
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")
}
[node name="AdventurerSprite" type="CharacterBody2D"] [node name="AdventurerSprite" type="CharacterBody2D"]
script = ExtResource("1_wif60") 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="."] [node name="Sprite2D" type="Sprite2D" parent="."]
modulate = Color(0, 1, 0, 1) modulate = Color(0, 1, 0, 1)
scale = Vector2(0.5, 0.5) position = Vector2(0, -64)
texture = ExtResource("2_rwbq5") texture = ExtResource("2_aos2b")
[node name="NavigationAgent2D" type="NavigationAgent2D" parent="."] [node name="NavigationAgent2D" type="NavigationAgent2D" parent="."]
path_desired_distance = 30.0 path_desired_distance = 30.0
avoidance_enabled = true avoidance_enabled = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="."] [node name="SpeechBubble" parent="." instance=ExtResource("3_aos2b")]
shape = SubResource("CircleShape2D_5n4iw") position = Vector2(44, -141)
[node name="SpeechBubble" type="Sprite2D" parent="."] [node name="BTPlayer" type="BTPlayer" parent="."]
visible = false behavior_tree = ExtResource("6_006nh")
position = Vector2(39, -42) blackboard_plan = SubResource("BlackboardPlan_tdl5m")
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")

4
test_limbo.gd Normal file
View File

@@ -0,0 +1,4 @@
extends CharacterBody2D
var busy : bool = false

1
test_limbo.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://cgsnqeb1dg23d

BIN
working_shift_panel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -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