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:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,6 @@
|
||||
# Godot 4+ specific ignores
|
||||
.godot/
|
||||
/android/
|
||||
#limboai ignores
|
||||
/addons/limboai/
|
||||
/demo/
|
||||
@@ -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"]
|
||||
|
||||
@@ -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()
|
||||
|
||||
BIN
ai/icons/stopwatch.png
Normal file
BIN
ai/icons/stopwatch.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
40
ai/icons/stopwatch.png.import
Normal file
40
ai/icons/stopwatch.png.import
Normal 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
|
||||
103
ai/tasks/actions/get_quest.gd
Normal file
103
ai/tasks/actions/get_quest.gd
Normal 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
|
||||
1
ai/tasks/actions/get_quest.gd.uid
Normal file
1
ai/tasks/actions/get_quest.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ders6t7axct24
|
||||
48
ai/tasks/actions/go_to.gd
Normal file
48
ai/tasks/actions/go_to.gd
Normal 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)
|
||||
1
ai/tasks/actions/go_to.gd.uid
Normal file
1
ai/tasks/actions/go_to.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://h113xg55h4r8
|
||||
111
ai/tasks/actions/use_guild_service.gd
Normal file
111
ai/tasks/actions/use_guild_service.gd
Normal 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
|
||||
|
||||
1
ai/tasks/actions/use_guild_service.gd.uid
Normal file
1
ai/tasks/actions/use_guild_service.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bsq5dxul0uto
|
||||
50
ai/tasks/actions/wander.gd
Normal file
50
ai/tasks/actions/wander.gd
Normal 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)
|
||||
1
ai/tasks/actions/wander.gd.uid
Normal file
1
ai/tasks/actions/wander.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://767b4fdlrgr
|
||||
7
ai/tasks/conditions/has_quest.gd
Normal file
7
ai/tasks/conditions/has_quest.gd
Normal 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
|
||||
1
ai/tasks/conditions/has_quest.gd.uid
Normal file
1
ai/tasks/conditions/has_quest.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://xom38ohdwfms
|
||||
7
ai/tasks/conditions/is_unregistered.gd
Normal file
7
ai/tasks/conditions/is_unregistered.gd
Normal 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
|
||||
1
ai/tasks/conditions/is_unregistered.gd.uid
Normal file
1
ai/tasks/conditions/is_unregistered.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bcbfnm21rtkuo
|
||||
22
ai/tasks/decorators/busy.gd
Normal file
22
ai/tasks/decorators/busy.gd
Normal 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"
|
||||
1
ai/tasks/decorators/busy.gd.uid
Normal file
1
ai/tasks/decorators/busy.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b2vuw12mttm40
|
||||
145
ai/trees/adventurer.tres
Normal file
145
ai/trees/adventurer.tres
Normal 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")
|
||||
34
ai/trees/receptionist.tres
Normal file
34
ai/trees/receptionist.tres
Normal 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
BIN
basic-sprite.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
40
basic-sprite.png.import
Normal file
40
basic-sprite.png.import
Normal 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
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
uid://bewrajxqdutsu
|
||||
@@ -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)
|
||||
@@ -1 +0,0 @@
|
||||
uid://dthatmb3if73u
|
||||
@@ -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)
|
||||
@@ -1 +0,0 @@
|
||||
uid://cggu0yihq0unt
|
||||
@@ -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])
|
||||
@@ -1 +0,0 @@
|
||||
uid://u81fhi8157bg
|
||||
@@ -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)
|
||||
@@ -1 +0,0 @@
|
||||
uid://djd8pv5xbgud3
|
||||
@@ -1,6 +0,0 @@
|
||||
extends StateNode
|
||||
|
||||
func execute(subject, ...args : Array) -> void:
|
||||
if !subject.busy:
|
||||
subject.queue.try_advance()
|
||||
complete_state()
|
||||
@@ -1 +0,0 @@
|
||||
uid://csicx3fpxv7xt
|
||||
@@ -1 +0,0 @@
|
||||
extends StateNode
|
||||
@@ -1 +0,0 @@
|
||||
uid://b0ewnwcibhu21
|
||||
@@ -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)
|
||||
@@ -1 +0,0 @@
|
||||
uid://y85swbbk8kbd
|
||||
@@ -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)
|
||||
@@ -1 +0,0 @@
|
||||
uid://c27ctn874rdns
|
||||
@@ -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()
|
||||
@@ -1 +0,0 @@
|
||||
uid://e8we6nmaob1k
|
||||
@@ -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 = []
|
||||
@@ -1 +0,0 @@
|
||||
uid://dl3b5aywu1hf6
|
||||
@@ -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"):
|
||||
|
||||
5
guild.gd
5
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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
202
guildhall.tscn
202
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")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
132
main_panel.tscn
132
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"]
|
||||
|
||||
BIN
open_shift_panel.png
Normal file
BIN
open_shift_panel.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
40
open_shift_panel.png.import
Normal file
40
open_shift_panel.png.import
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
43
receptionist.tscn
Normal file
43
receptionist.tscn
Normal 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
114
speech_bubble.tscn
Normal 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")
|
||||
}
|
||||
10
styles/open_shift_panel.tres
Normal file
10
styles/open_shift_panel.tres
Normal 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
|
||||
10
styles/working_shift_panel.tres
Normal file
10
styles/working_shift_panel.tres
Normal 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
|
||||
@@ -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")
|
||||
|
||||
4
test_limbo.gd
Normal file
4
test_limbo.gd
Normal file
@@ -0,0 +1,4 @@
|
||||
extends CharacterBody2D
|
||||
|
||||
|
||||
var busy : bool = false
|
||||
1
test_limbo.gd.uid
Normal file
1
test_limbo.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cgsnqeb1dg23d
|
||||
BIN
working_shift_panel.png
Normal file
BIN
working_shift_panel.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
40
working_shift_panel.png.import
Normal file
40
working_shift_panel.png.import
Normal 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
|
||||
Reference in New Issue
Block a user