diff --git a/CONTRIBUTIONS.txt b/CONTRIBUTIONS.txt
index 0d135dd..94411dc 100644
--- a/CONTRIBUTIONS.txt
+++ b/CONTRIBUTIONS.txt
@@ -17,3 +17,16 @@ res://sounds/Door Hinge Creaking Door.wav
****************************************************************************************************
3maze - res://sounds/owl_notification_005.wav
SmartSoundFX - res://sounds/ORGANIC Paper Book Page Turn Short 02.wav
+
+
+****************************************************************************************************
+** Miotto Sounds **
+****************************************************************************************************
+res://sounds/Paper_Scraping_1.wav
+
+****************************************************************************************************
+** Deed? Check back **
+****************************************************************************************************
+res://sounds/Writing in paper 19.wav
+res://sounds/Various Sounds 06.wav
+res://sounds/Turning Books Pages 52.wav
diff --git a/addons/ReorderableContainer/Icon/reorderable_container_icon.svg b/addons/ReorderableContainer/Icon/reorderable_container_icon.svg
new file mode 100644
index 0000000..2b74119
--- /dev/null
+++ b/addons/ReorderableContainer/Icon/reorderable_container_icon.svg
@@ -0,0 +1,21 @@
+
+
+
diff --git a/addons/ReorderableContainer/Icon/reorderable_container_icon.svg.import b/addons/ReorderableContainer/Icon/reorderable_container_icon.svg.import
new file mode 100644
index 0000000..0ce7f91
--- /dev/null
+++ b/addons/ReorderableContainer/Icon/reorderable_container_icon.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b4kg0ekxkw2lb"
+path="res://.godot/imported/reorderable_container_icon.svg-b137036dec781405c9f5977df10d510b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ReorderableContainer/Icon/reorderable_container_icon.svg"
+dest_files=["res://.godot/imported/reorderable_container_icon.svg-b137036dec781405c9f5977df10d510b.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
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/ReorderableContainer/Icon/reorderable_hbox_icon.svg b/addons/ReorderableContainer/Icon/reorderable_hbox_icon.svg
new file mode 100644
index 0000000..e5266a3
--- /dev/null
+++ b/addons/ReorderableContainer/Icon/reorderable_hbox_icon.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/addons/ReorderableContainer/Icon/reorderable_hbox_icon.svg.import b/addons/ReorderableContainer/Icon/reorderable_hbox_icon.svg.import
new file mode 100644
index 0000000..311f071
--- /dev/null
+++ b/addons/ReorderableContainer/Icon/reorderable_hbox_icon.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bc35o8q35l74"
+path="res://.godot/imported/reorderable_hbox_icon.svg-b8929c984930c1cf79a5dffb0a9bff85.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ReorderableContainer/Icon/reorderable_hbox_icon.svg"
+dest_files=["res://.godot/imported/reorderable_hbox_icon.svg-b8929c984930c1cf79a5dffb0a9bff85.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
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/ReorderableContainer/Icon/reorderable_vbox_icon.svg b/addons/ReorderableContainer/Icon/reorderable_vbox_icon.svg
new file mode 100644
index 0000000..e938e23
--- /dev/null
+++ b/addons/ReorderableContainer/Icon/reorderable_vbox_icon.svg
@@ -0,0 +1,20 @@
+
+
+
diff --git a/addons/ReorderableContainer/Icon/reorderable_vbox_icon.svg.import b/addons/ReorderableContainer/Icon/reorderable_vbox_icon.svg.import
new file mode 100644
index 0000000..ec6b21c
--- /dev/null
+++ b/addons/ReorderableContainer/Icon/reorderable_vbox_icon.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c1rxcwal2patu"
+path="res://.godot/imported/reorderable_vbox_icon.svg-6c0163d38628f550aff9f4fbed5c8a1d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/ReorderableContainer/Icon/reorderable_vbox_icon.svg"
+dest_files=["res://.godot/imported/reorderable_vbox_icon.svg-6c0163d38628f550aff9f4fbed5c8a1d.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
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/addons/ReorderableContainer/plugin.cfg b/addons/ReorderableContainer/plugin.cfg
new file mode 100644
index 0000000..87b3b3b
--- /dev/null
+++ b/addons/ReorderableContainer/plugin.cfg
@@ -0,0 +1,7 @@
+[plugin]
+
+name="ReorderableContainer"
+description="A container similar to BoxContainer but extended with drag-and-drop style reordering functionality, and auto-scroll functionality when placed under ScrollContainer."
+author="FoolLin"
+version="1.2.4"
+script="plugin.gd"
diff --git a/addons/ReorderableContainer/plugin.gd b/addons/ReorderableContainer/plugin.gd
new file mode 100644
index 0000000..a8c7997
--- /dev/null
+++ b/addons/ReorderableContainer/plugin.gd
@@ -0,0 +1,14 @@
+@tool
+extends EditorPlugin
+
+
+func _enter_tree():
+ add_custom_type("ReorderableContainer", "Container", preload("reorderable_container.gd"), preload("Icon/reorderable_container_icon.svg"))
+ add_custom_type("ReorderableVBox", "ReorderableContainer", preload("reorderable_vbox.gd"), preload("Icon/reorderable_vbox_icon.svg"))
+ add_custom_type("ReorderableHBox", "ReorderableContainer", preload("reorderable_hbox.gd"), preload("Icon/reorderable_hbox_icon.svg"))
+
+
+func _exit_tree():
+ remove_custom_type("ReorderableContainer")
+ remove_custom_type("ReorderableVBox")
+ remove_custom_type("ReorderableHBox")
diff --git a/addons/ReorderableContainer/plugin.gd.uid b/addons/ReorderableContainer/plugin.gd.uid
new file mode 100644
index 0000000..398ab06
--- /dev/null
+++ b/addons/ReorderableContainer/plugin.gd.uid
@@ -0,0 +1 @@
+uid://0uea0ywilkmu
diff --git a/addons/ReorderableContainer/reorderable_container.gd b/addons/ReorderableContainer/reorderable_container.gd
new file mode 100644
index 0000000..cb6f73a
--- /dev/null
+++ b/addons/ReorderableContainer/reorderable_container.gd
@@ -0,0 +1,357 @@
+@tool
+@icon("Icon/reorderable_container_icon.svg")
+class_name ReorderableContainer
+extends Container
+## A container that allows its child to be reorder and arranges horizontally or vertically.
+##
+## A container similar to [BoxContainer] but extended with drag-and-drop style reordering functionality,
+## and auto-scroll functionality when placed under [ScrollContainer].[br][br]
+## [b]Note:[/b] This addon also works with SmoothScroll by SpyrexDE.
+##
+## @tutorial(SmoothScroll): https://github.com/SpyrexDE/SmoothScroll
+## @tutorial(Using Containers): https://docs.godotengine.org/en/4.1/tutorials/ui/gui_containers.html
+
+## Emitted when children have been reordered.
+signal reordered(from: int, to: int)
+signal dragging(pos: Vector2)
+signal drag_started(node)
+signal drag_stopped(node)
+## Extend the drop zone length at the start and end of the container.
+## This will ensure that drop input is recognized even outside the container itself.
+const DROP_ZONE_EXTEND = 2000
+
+## The hold duration time in seconds before the holded child will start being drag.
+@export
+var hold_duration := 0.5
+
+## The overall speed of how fast children will move and arrange.
+@export_range(3, 30, 0.01, "or_greater", "or_less")
+var speed := 10.0
+
+## The space between the container's elements, in pixels.
+@export
+var separation := 10: set = set_separation
+func set_separation(value):
+ if value == separation or value < 0:
+ return
+ separation = value
+ _on_sort_children()
+
+
+## if [code]true[/code] the container will arrange its children vertically, rather than horizontally.
+@export var is_vertical := false: set = set_vertical
+func set_vertical(value):
+ if value == is_vertical:
+ return
+ is_vertical = value
+ if is_vertical:
+ custom_minimum_size.x = 0
+ else:
+ custom_minimum_size.y = 0
+ _on_sort_children()
+
+## (Optional) [ScrollContainer] refference. Normally, the addon will automatically check
+## its parent node for [ScrollContainer]. If this is not the case, you can manually specify it here.
+@export
+var scroll_container: ScrollContainer
+
+## The maximum speed of auto scroll.
+@export
+var auto_scroll_speed := 10.0
+
+## The pacentage of how much space auto scroll will take in [ScrollContainer][br][br]
+## [b]Example:[/b] If [code]auto_scroll_range[/code] is 30% (0.3) and [ScrollContainer] height is 100 px,
+## upper part will be 0 to 30 px and lower part will be 70 to 100 px.
+@export_range(0, 0.5)
+var auto_scroll_range := 0.3
+
+## The scrolling threshold in pixel. In a nutshell, user will have hard time trying to drag a child if it too low
+## and user will accidentally drag a child when scrolling if it too high.
+@export
+var scroll_threshold := 30
+
+## Uses when debugging
+@export
+var is_debugging := false
+
+var _scroll_starting_point := 0
+var _is_smooth_scroll := false
+
+var _drop_zones: Array[Rect2] = []
+var _drop_zone_index := -1
+var _expect_child_rect: Array[Rect2] = []
+
+var _focus_child: Control
+var _is_press := false
+var _is_hold := false
+var _current_duration := 0.0
+var _is_using_process := false
+
+
+func _ready():
+ if scroll_container == null and get_parent() is ScrollContainer:
+ scroll_container = get_parent()
+
+ if scroll_container != null and scroll_container.has_method("handle_overdrag"):
+ _is_smooth_scroll = true
+
+ process_mode = Node.PROCESS_MODE_PAUSABLE
+ _adjust_expected_child_rect()
+ if not sort_children.is_connected(_on_sort_children):
+ sort_children.connect(_on_sort_children, CONNECT_PERSIST)
+ if not get_tree().node_added.is_connected(_on_node_added):
+ get_tree().node_added.connect(_on_node_added, CONNECT_PERSIST)
+
+
+func _gui_input(event):
+ if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
+ for _child in get_children():
+ var child := _child as Control
+ if child.get_rect().has_point(get_local_mouse_position()) and event.is_pressed():
+ _focus_child = child
+ _is_press = true
+ elif not event.is_pressed():
+ _is_press = false
+ _is_hold = false
+
+
+func _process(delta):
+ if Engine.is_editor_hint(): return
+
+ _handle_input(delta)
+ if _current_duration >= hold_duration != _is_hold:
+ _is_hold = _current_duration >= hold_duration
+ if _is_hold:
+ _on_start_dragging()
+
+ if _is_hold:
+ _handle_dragging_child_pos(delta)
+ if scroll_container != null:
+ _handle_auto_scroll(delta)
+ elif not _is_hold and _drop_zone_index != -1:
+ _on_stop_dragging()
+
+ if _is_using_process :
+ _on_sort_children(delta)
+
+
+func _handle_input(delta):
+ if scroll_container != null and _is_press and not _is_hold:
+ var scroll_point = scroll_container.scroll_vertical if is_vertical else scroll_container.scroll_horizontal
+ if _current_duration == 0:
+ _scroll_starting_point = scroll_point
+ else:
+ # If user scroll more than scroll_threshold, press is abort.
+ _is_press = true if abs(scroll_point - _scroll_starting_point) <= scroll_threshold else false
+ _current_duration = _current_duration + delta if _is_press else 0.0
+
+
+func _on_start_dragging():
+ # Force _on_sort_children to use process update for linear interpolation
+ _is_using_process = true
+ _focus_child.z_index = 1
+ # Workaround for SmoothScroll addon
+ if _is_smooth_scroll:
+ scroll_container.process_mode = Node.PROCESS_MODE_DISABLED
+ for child in _get_visible_children():
+ child.propagate_call("set_mouse_filter", [MOUSE_FILTER_IGNORE])
+ drag_started.emit(_focus_child)
+
+
+
+func _on_stop_dragging():
+ _focus_child.z_index = 0
+ var focus_child_index := _focus_child.get_index()
+ move_child(_focus_child, _drop_zone_index)
+ reordered.emit(focus_child_index, _drop_zone_index)
+ drag_stopped.emit(_focus_child)
+ _focus_child = null
+ _drop_zone_index = -1
+ if _is_smooth_scroll:
+ scroll_container.pos = -Vector2(scroll_container.scroll_horizontal, scroll_container.scroll_vertical)
+ scroll_container.process_mode = Node.PROCESS_MODE_INHERIT
+ for child in _get_visible_children():
+ child.propagate_call("set_mouse_filter", [MOUSE_FILTER_PASS])
+
+
+func _on_node_added(node):
+ if node is Control and not Engine.is_editor_hint():
+ node.mouse_filter = Control.MOUSE_FILTER_PASS
+
+
+func _handle_dragging_child_pos(delta):
+ if is_vertical:
+ var target_pos = get_local_mouse_position().y - (_focus_child.size.y / 2.0)
+ _focus_child.position.y = lerp(_focus_child.position.y, target_pos, delta * speed)
+ else:
+ var target_pos = get_local_mouse_position().x - (_focus_child.size.x / 2.0)
+ _focus_child.position.x = lerp(_focus_child.position.x, target_pos, delta * speed)
+
+ # Update drop zone index
+ var child_center_pos: Vector2 = _focus_child.get_rect().get_center()
+ for i in range(_drop_zones.size()):
+ var drop_zone = _drop_zones[i]
+ if drop_zone.has_point(child_center_pos):
+ _drop_zone_index = i
+ break
+ elif i == _drop_zones.size() - 1:
+ _drop_zone_index = -1
+ dragging.emit(get_global_mouse_position())
+
+func _handle_auto_scroll(delta):
+ var mouse_g_pos = get_global_mouse_position()
+ var scroll_g_rect = scroll_container.get_global_rect()
+ if is_vertical:
+ var upper = scroll_g_rect.position.y + (scroll_g_rect.size.y * auto_scroll_range)
+ var lower = scroll_g_rect.position.y + (scroll_g_rect.size.y * (1.0 - auto_scroll_range))
+
+ if upper > mouse_g_pos.y:
+ var factor = (upper - mouse_g_pos.y) / (upper - scroll_g_rect.position.y)
+ scroll_container.scroll_vertical -= delta * float(auto_scroll_speed) * 150.0 * factor
+ elif lower < mouse_g_pos.y:
+ var factor = (mouse_g_pos.y - lower) / (scroll_g_rect.end.y - lower)
+ scroll_container.scroll_vertical += delta * float(auto_scroll_speed) * 150.0 * factor
+ else:
+ scroll_container.scroll_vertical = scroll_container.scroll_vertical
+ else:
+ var left = scroll_g_rect.position.x + (scroll_g_rect.size.x * auto_scroll_range)
+ var right = scroll_g_rect.position.x + (scroll_g_rect.size.x * (1.0 - auto_scroll_range))
+
+ if left > mouse_g_pos.x:
+ var factor = (left - mouse_g_pos.x) / (left - scroll_g_rect.position.x)
+ scroll_container.scroll_horizontal -= delta * float(auto_scroll_speed) * 150.0 * factor
+ elif right < mouse_g_pos.x:
+ var factor = (mouse_g_pos.x - right) / (scroll_g_rect.end.x - right)
+ scroll_container.scroll_horizontal += delta * float(auto_scroll_speed) * 150.0 * factor
+ else:
+ scroll_container.scroll_horizontal = scroll_container.scroll_horizontal
+
+
+func _on_sort_children(delta := -1.0):
+ if _is_using_process and delta == -1.0:
+ return
+
+ _adjust_expected_child_rect()
+ _adjust_child_rect(delta)
+ _adjust_drop_zone_rect()
+
+
+func _adjust_expected_child_rect():
+ _expect_child_rect.clear()
+ var children := _get_visible_children()
+ var end_point = 0.0
+ for i in range(children.size()):
+ var child := children[i]
+ var min_size := child.get_combined_minimum_size()
+ if is_vertical:
+ if i == _drop_zone_index:
+ end_point += _focus_child.size.y + separation
+
+ _expect_child_rect.append(Rect2(Vector2(0, end_point), Vector2(size.x, min_size.y)))
+ end_point += min_size.y + separation
+ else:
+ if i == _drop_zone_index:
+ end_point += _focus_child.size.x + separation
+
+ _expect_child_rect.append(Rect2(Vector2(end_point, 0), Vector2(min_size.x, size.y)))
+ end_point += min_size.x + separation
+
+
+func _adjust_child_rect(delta: float = -1.0):
+ var children := _get_visible_children()
+ if children.is_empty():
+ return
+
+ var is_animating := false
+ var end_point := 0.0
+ for i in range(children.size()):
+ var child := children[i]
+ if child.position == _expect_child_rect[i].position and child.size == _expect_child_rect[i].size:
+ continue
+
+ if _is_using_process:
+ is_animating = true
+ child.position = lerp(child.position, _expect_child_rect[i].position, delta * speed)
+ child.size = _expect_child_rect[i].size
+ if (child.position - _expect_child_rect[i].position).length() <= 1.0:
+ child.position = _expect_child_rect[i].position
+ else:
+ child.position = _expect_child_rect[i].position
+ child.size = _expect_child_rect[i].size
+
+ var last_child := children[-1]
+ if is_vertical:
+ if _is_using_process and _drop_zone_index == children.size():
+ custom_minimum_size.y = _expect_child_rect[-1].end.y + _focus_child.size.y + separation
+ elif not _is_using_process:
+ custom_minimum_size.y = last_child.get_rect().end.y
+ else:
+ if _is_using_process and _drop_zone_index == children.size():
+ custom_minimum_size.x = _expect_child_rect[-1].end.x + _focus_child.size.x + separation
+ elif not _is_using_process:
+ custom_minimum_size.x = last_child.get_rect().end.x
+
+ # Adjust rect every process frame until child is dropped and finished lerping
+ # ( return to adjust when sort_children signal is emitted)
+ if not is_animating and _focus_child == null:
+ _is_using_process = false
+
+
+func _adjust_drop_zone_rect():
+ _drop_zones.clear()
+ var children = _get_visible_children()
+ for i in range(children.size()):
+ var drop_zone_rect: Rect2
+ var child := children[i] as Control
+ if is_vertical:
+ if i == 0:
+ # First child
+ drop_zone_rect.position = Vector2(child.position.x, child.position.y - DROP_ZONE_EXTEND)
+ drop_zone_rect.end = Vector2(child.size.x, child.get_rect().get_center().y)
+ _drop_zones.append(drop_zone_rect)
+ else:
+ # In between
+ var prev_child := children[i - 1] as Control
+ drop_zone_rect.position = Vector2(prev_child.position.x, prev_child.get_rect().get_center().y)
+ drop_zone_rect.end = Vector2(child.size.x, child.get_rect().get_center().y)
+ _drop_zones.append(drop_zone_rect)
+ if i == children.size() - 1:
+ # Is also last child
+ drop_zone_rect.position = Vector2(child.position.x, child.get_rect().get_center().y)
+ drop_zone_rect.end = Vector2(child.size.x, child.get_rect().end.y + DROP_ZONE_EXTEND)
+ _drop_zones.append(drop_zone_rect)
+ else:
+ if i == 0:
+ # First child
+ drop_zone_rect.position = Vector2(child.position.x - DROP_ZONE_EXTEND, child.position.y)
+ drop_zone_rect.end = Vector2(child.get_rect().get_center().x, child.size.y)
+ _drop_zones.append(drop_zone_rect)
+ else:
+ # In between
+ var prev_child := children[i - 1] as Control
+ drop_zone_rect.position = Vector2(prev_child.get_rect().get_center().x, prev_child.position.y)
+ drop_zone_rect.end = Vector2(child.get_rect().get_center().x, child.size.y)
+ _drop_zones.append(drop_zone_rect)
+ if i == children.size() - 1:
+ # Is also last child
+ drop_zone_rect.position = Vector2(child.get_rect().get_center().x, child.position.y)
+ drop_zone_rect.end = Vector2(child.get_rect().end.x + DROP_ZONE_EXTEND, child.size.y)
+ _drop_zones.append(drop_zone_rect)
+
+
+func _get_visible_children() -> Array[Control]:
+ var visible_control: Array[Control]
+ for _child in get_children():
+ var child := _child as Control
+ if not child.visible:
+ continue
+ if child == _focus_child and _is_hold:
+ continue
+
+ visible_control.append(child)
+ return visible_control
+
+
+func _print_debug(val):
+ if is_debugging:
+ print(val)
diff --git a/addons/ReorderableContainer/reorderable_container.gd.uid b/addons/ReorderableContainer/reorderable_container.gd.uid
new file mode 100644
index 0000000..621c263
--- /dev/null
+++ b/addons/ReorderableContainer/reorderable_container.gd.uid
@@ -0,0 +1 @@
+uid://jwjxetmu7o2o
diff --git a/addons/ReorderableContainer/reorderable_hbox.gd b/addons/ReorderableContainer/reorderable_hbox.gd
new file mode 100644
index 0000000..b8b3b1f
--- /dev/null
+++ b/addons/ReorderableContainer/reorderable_hbox.gd
@@ -0,0 +1,13 @@
+@tool
+@icon("Icon/reorderable_hbox_icon.svg")
+class_name ReorderableHBox
+extends ReorderableContainer
+
+func set_vertical(value):
+ value = false
+ super.set_vertical(value)
+
+
+func _ready():
+ is_vertical = false
+ super._ready()
diff --git a/addons/ReorderableContainer/reorderable_hbox.gd.uid b/addons/ReorderableContainer/reorderable_hbox.gd.uid
new file mode 100644
index 0000000..9278fe9
--- /dev/null
+++ b/addons/ReorderableContainer/reorderable_hbox.gd.uid
@@ -0,0 +1 @@
+uid://gp5cpsm0gdkx
diff --git a/addons/ReorderableContainer/reorderable_vbox.gd b/addons/ReorderableContainer/reorderable_vbox.gd
new file mode 100644
index 0000000..6458724
--- /dev/null
+++ b/addons/ReorderableContainer/reorderable_vbox.gd
@@ -0,0 +1,13 @@
+@tool
+@icon("Icon/reorderable_vbox_icon.svg")
+class_name ReorderableVBox
+extends ReorderableContainer
+
+func set_vertical(value):
+ value = true
+ super.set_vertical(value)
+
+
+func _ready():
+ is_vertical = true
+ super._ready()
diff --git a/addons/ReorderableContainer/reorderable_vbox.gd.uid b/addons/ReorderableContainer/reorderable_vbox.gd.uid
new file mode 100644
index 0000000..2bba009
--- /dev/null
+++ b/addons/ReorderableContainer/reorderable_vbox.gd.uid
@@ -0,0 +1 @@
+uid://d3mey1366662n
diff --git a/data/quests/sticky_situation.gd b/data/quests/sticky_situation.gd
index 93aee95..d50adf7 100644
--- a/data/quests/sticky_situation.gd
+++ b/data/quests/sticky_situation.gd
@@ -11,7 +11,7 @@ func _init() -> void:
evt.time = 5
events.append(evt)
desc = "Nestor’s Woods is facing a slime invasion and the farmers are getting nervous, send an adventurer to help squash that sticky situation!"
- location =
+ location = Quest.Locations.NESTORS_WOODS
rewards = {"exp":10, "gold":5}
guild_rewards = {"glory":10, "gold":5}
covenant_cost = 5
diff --git a/dialogic/custom_layered_portrait.gd b/dialogic/custom_layered_portrait.gd
new file mode 100644
index 0000000..00bf1e5
--- /dev/null
+++ b/dialogic/custom_layered_portrait.gd
@@ -0,0 +1,3 @@
+@tool
+extends "res://addons/dialogic/Modules/LayeredPortrait/layered_portrait.gd"
+
diff --git a/dialogic/custom_layered_portrait.gd.uid b/dialogic/custom_layered_portrait.gd.uid
new file mode 100644
index 0000000..dadeaea
--- /dev/null
+++ b/dialogic/custom_layered_portrait.gd.uid
@@ -0,0 +1 @@
+uid://0ah5wvuoqupd
diff --git a/dialogic/layered_portrait_player.tscn b/dialogic/layered_portrait_player.tscn
new file mode 100644
index 0000000..1c07571
--- /dev/null
+++ b/dialogic/layered_portrait_player.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=2 format=3 ]
+
+[ext_resource type="Script" path="res://dialogic/custom_layered_portrait.gd" id="1_uubi5"]
+
+[node name="LayeredPortrait" type="CanvasGroup"]
+script = ExtResource("1_uubi5")
+
+[node name="Layer1" type="Sprite2D" parent="."]
+
+[node name="Group1" type="Node2D" parent="."]
+
+[node name="Layer1" type="Sprite2D" parent="Group1"]
+
+[node name="Layer2" type="Sprite2D" parent="Group1"]
diff --git a/dialogic/timelines/game_start.dtl b/dialogic/timelines/game_start.dtl
new file mode 100644
index 0000000..1970c28
--- /dev/null
+++ b/dialogic/timelines/game_start.dtl
@@ -0,0 +1,15 @@
+label Prespeech
+I never imagined that one day I'd be in charge of a guild. To be honest, I never really imagined what my future would look like. I've never been very good at anything.
+I just lived every day working the best I could and hoping that somehow, someway, the world would show me what to do. And then grandma died and left me this letter.
+do Game.switch_scenes("letter")
+[end_timeline]
+label Start Guildcard
+Suddenly I had a purpose. I didn't know it then and I never asked for it, but filling out that card was the first step in becoming a better version of myself.
+do Game.switch_scenes("guild_card")
+Ugh, I hated paperwork and there sure was a lot of it.
+[end_timeline]
+label Start Schedule
+[wait_input]
+do
+[end_timeline]
+label First Portrait Open
diff --git a/dialogic/timelines/letter.dtl.uid b/dialogic/timelines/game_start.dtl.uid
similarity index 100%
rename from dialogic/timelines/letter.dtl.uid
rename to dialogic/timelines/game_start.dtl.uid
diff --git a/dialogic/timelines/intro.dtl b/dialogic/timelines/guild_entrance.dtl
similarity index 100%
rename from dialogic/timelines/intro.dtl
rename to dialogic/timelines/guild_entrance.dtl
diff --git a/dialogic/timelines/intro.dtl.uid b/dialogic/timelines/guild_entrance.dtl.uid
similarity index 100%
rename from dialogic/timelines/intro.dtl.uid
rename to dialogic/timelines/guild_entrance.dtl.uid
diff --git a/dialogic/timelines/letter.dtl b/dialogic/timelines/letter.dtl
deleted file mode 100644
index be605d8..0000000
--- a/dialogic/timelines/letter.dtl
+++ /dev/null
@@ -1,2 +0,0 @@
-[style]
-I never imagined that one day I'd be in charge of a guild. To be honest, I never really imagined what my future would look like. I've never been very good at anything. I just lived every day working the best I could and hoping that somehow, someway, the world would show me what to do. And then my grandma died.
diff --git a/dialogic/timelines/player.dch b/dialogic/timelines/player.dch
index e49608e..674ea53 100644
--- a/dialogic/timelines/player.dch
+++ b/dialogic/timelines/player.dch
@@ -8,12 +8,22 @@
"sound_moods": {},
"style": ""
},
-&"default_portrait": "",
+&"default_portrait": "New portrait",
&"description": "",
&"display_name": "Player",
&"mirror": false,
&"nicknames": ["Guildmaster"],
&"offset": Vector2(0, 0),
-&"portraits": {},
+&"portraits": {
+"New portrait": {
+"export_overrides": {
+"image": ""
+},
+"mirror": false,
+"offset": Vector2(0, 0),
+"scale": 1,
+"scene": "res://dialogic/layered_portrait_player.tscn"
+}
+},
&"scale": 1.0
}
\ No newline at end of file
diff --git a/external/Test Portrait/Farmer_F/body.png.import b/external/Test Portrait/Farmer_F/body.png.import
index b385871..8e18bae 100644
--- a/external/Test Portrait/Farmer_F/body.png.import
+++ b/external/Test Portrait/Farmer_F/body.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://crrd8mpcuync2"
-path="res://.godot/imported/body.png-5a897720f599ec630383f1f3dd8e9e9e.ctex"
+path="res://.godot/imported/body.png-efd5e53b6f03adc4a57de5ce8dc4d3cd.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/body.png"
-dest_files=["res://.godot/imported/body.png-5a897720f599ec630383f1f3dd8e9e9e.ctex"]
+source_file="res://external/test portrait/farmer_f/body.png"
+dest_files=["res://.godot/imported/body.png-efd5e53b6f03adc4a57de5ce8dc4d3cd.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/brow_shadow-1.png.import b/external/Test Portrait/Farmer_F/brow_shadow-1.png.import
index 04efe38..b6487ec 100644
--- a/external/Test Portrait/Farmer_F/brow_shadow-1.png.import
+++ b/external/Test Portrait/Farmer_F/brow_shadow-1.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://pp5ssn5m2n3i"
-path="res://.godot/imported/brow_shadow-1.png-94d923d93f9bc0db18f7b963da1021dd.ctex"
+path="res://.godot/imported/brow_shadow-1.png-8dff8c187d59ecaaefbb84e877b32e20.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/brow_shadow-1.png"
-dest_files=["res://.godot/imported/brow_shadow-1.png-94d923d93f9bc0db18f7b963da1021dd.ctex"]
+source_file="res://external/test portrait/farmer_f/brow_shadow-1.png"
+dest_files=["res://.godot/imported/brow_shadow-1.png-8dff8c187d59ecaaefbb84e877b32e20.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/brow_shadow-2.png.import b/external/Test Portrait/Farmer_F/brow_shadow-2.png.import
index a89758a..6f63278 100644
--- a/external/Test Portrait/Farmer_F/brow_shadow-2.png.import
+++ b/external/Test Portrait/Farmer_F/brow_shadow-2.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://x4e86o28672u"
-path="res://.godot/imported/brow_shadow-2.png-85a8d07465b9b109e67ad99a37d690d1.ctex"
+path="res://.godot/imported/brow_shadow-2.png-b5d8d416acf1ddb95fd785200da8d3ce.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/brow_shadow-2.png"
-dest_files=["res://.godot/imported/brow_shadow-2.png-85a8d07465b9b109e67ad99a37d690d1.ctex"]
+source_file="res://external/test portrait/farmer_f/brow_shadow-2.png"
+dest_files=["res://.godot/imported/brow_shadow-2.png-b5d8d416acf1ddb95fd785200da8d3ce.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/brow_shadow.png.import b/external/Test Portrait/Farmer_F/brow_shadow.png.import
index 3183cba..e584536 100644
--- a/external/Test Portrait/Farmer_F/brow_shadow.png.import
+++ b/external/Test Portrait/Farmer_F/brow_shadow.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://sv7bxo8a12i6"
-path="res://.godot/imported/brow_shadow.png-e4497bbbff21d0b56dc81b07de4f06bc.ctex"
+path="res://.godot/imported/brow_shadow.png-f653be07b461bc5d7a18192996ffb73a.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/brow_shadow.png"
-dest_files=["res://.godot/imported/brow_shadow.png-e4497bbbff21d0b56dc81b07de4f06bc.ctex"]
+source_file="res://external/test portrait/farmer_f/brow_shadow.png"
+dest_files=["res://.godot/imported/brow_shadow.png-f653be07b461bc5d7a18192996ffb73a.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/brows-1.png.import b/external/Test Portrait/Farmer_F/brows-1.png.import
index 9fdac8e..c3e6ee8 100644
--- a/external/Test Portrait/Farmer_F/brows-1.png.import
+++ b/external/Test Portrait/Farmer_F/brows-1.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://tpg08bgn2on7"
-path="res://.godot/imported/brows-1.png-70092c4bb56529f3cdeb7b51925eb071.ctex"
+path="res://.godot/imported/brows-1.png-86a51529282fffa26d497e35e4cc9367.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/brows-1.png"
-dest_files=["res://.godot/imported/brows-1.png-70092c4bb56529f3cdeb7b51925eb071.ctex"]
+source_file="res://external/test portrait/farmer_f/brows-1.png"
+dest_files=["res://.godot/imported/brows-1.png-86a51529282fffa26d497e35e4cc9367.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/brows-2.png.import b/external/Test Portrait/Farmer_F/brows-2.png.import
index bf44252..b6faa7b 100644
--- a/external/Test Portrait/Farmer_F/brows-2.png.import
+++ b/external/Test Portrait/Farmer_F/brows-2.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://brmta1rtiau4a"
-path="res://.godot/imported/brows-2.png-227c9708d0b7fde57b1ef42021508fcf.ctex"
+path="res://.godot/imported/brows-2.png-01beea1c4e9cadf04c529dc849682c8a.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/brows-2.png"
-dest_files=["res://.godot/imported/brows-2.png-227c9708d0b7fde57b1ef42021508fcf.ctex"]
+source_file="res://external/test portrait/farmer_f/brows-2.png"
+dest_files=["res://.godot/imported/brows-2.png-01beea1c4e9cadf04c529dc849682c8a.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/composite.png.import b/external/Test Portrait/Farmer_F/composite.png.import
index f32ac68..e799e0f 100644
--- a/external/Test Portrait/Farmer_F/composite.png.import
+++ b/external/Test Portrait/Farmer_F/composite.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c3wwe6r000gpq"
-path="res://.godot/imported/composite.png-b2c2e474fe243b72bd3471af031774d6.ctex"
+path="res://.godot/imported/composite.png-a68e5c4a777094ce447b89a2ab45b35b.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/composite.png"
-dest_files=["res://.godot/imported/composite.png-b2c2e474fe243b72bd3471af031774d6.ctex"]
+source_file="res://external/test portrait/farmer_f/composite.png"
+dest_files=["res://.godot/imported/composite.png-a68e5c4a777094ce447b89a2ab45b35b.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/ear.png.import b/external/Test Portrait/Farmer_F/ear.png.import
index c287ccf..e495de0 100644
--- a/external/Test Portrait/Farmer_F/ear.png.import
+++ b/external/Test Portrait/Farmer_F/ear.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://caow8dqiog7j4"
-path="res://.godot/imported/ear.png-a1b457892f7236464123f2229af36695.ctex"
+path="res://.godot/imported/ear.png-74df11e092bb05fcc54c7e7478ed4d95.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/ear.png"
-dest_files=["res://.godot/imported/ear.png-a1b457892f7236464123f2229af36695.ctex"]
+source_file="res://external/test portrait/farmer_f/ear.png"
+dest_files=["res://.godot/imported/ear.png-74df11e092bb05fcc54c7e7478ed4d95.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/eye-white-1.png.import b/external/Test Portrait/Farmer_F/eye-white-1.png.import
index cc08b8e..74019a2 100644
--- a/external/Test Portrait/Farmer_F/eye-white-1.png.import
+++ b/external/Test Portrait/Farmer_F/eye-white-1.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://csp7xbtu0tpn7"
-path="res://.godot/imported/eye-white-1.png-fb75b817d294c00ebeee3e6996a2c02e.ctex"
+path="res://.godot/imported/eye-white-1.png-a31a2b044ab6206c129b0739fd4c0c80.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/eye-white-1.png"
-dest_files=["res://.godot/imported/eye-white-1.png-fb75b817d294c00ebeee3e6996a2c02e.ctex"]
+source_file="res://external/test portrait/farmer_f/eye-white-1.png"
+dest_files=["res://.godot/imported/eye-white-1.png-a31a2b044ab6206c129b0739fd4c0c80.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/eyes-iris-1.png.import b/external/Test Portrait/Farmer_F/eyes-iris-1.png.import
index 1901ca1..e279de5 100644
--- a/external/Test Portrait/Farmer_F/eyes-iris-1.png.import
+++ b/external/Test Portrait/Farmer_F/eyes-iris-1.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://mygmunn3voie"
-path="res://.godot/imported/eyes-iris-1.png-3c96067ab402ea99f8e1b1b7db594f4c.ctex"
+path="res://.godot/imported/eyes-iris-1.png-d2077e2e658acf3840075cfe98f86f4e.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/eyes-iris-1.png"
-dest_files=["res://.godot/imported/eyes-iris-1.png-3c96067ab402ea99f8e1b1b7db594f4c.ctex"]
+source_file="res://external/test portrait/farmer_f/eyes-iris-1.png"
+dest_files=["res://.godot/imported/eyes-iris-1.png-d2077e2e658acf3840075cfe98f86f4e.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/eyes-lashes-1.png.import b/external/Test Portrait/Farmer_F/eyes-lashes-1.png.import
index 6121c9e..fa0ee94 100644
--- a/external/Test Portrait/Farmer_F/eyes-lashes-1.png.import
+++ b/external/Test Portrait/Farmer_F/eyes-lashes-1.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://wnkr20dtf734"
-path="res://.godot/imported/eyes-lashes-1.png-8a4535f7647af11ff99b165ee021e8cc.ctex"
+path="res://.godot/imported/eyes-lashes-1.png-1460ddc60d7a087da2d517ce8f1a5faa.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/eyes-lashes-1.png"
-dest_files=["res://.godot/imported/eyes-lashes-1.png-8a4535f7647af11ff99b165ee021e8cc.ctex"]
+source_file="res://external/test portrait/farmer_f/eyes-lashes-1.png"
+dest_files=["res://.godot/imported/eyes-lashes-1.png-1460ddc60d7a087da2d517ce8f1a5faa.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/eyes.png.import b/external/Test Portrait/Farmer_F/eyes.png.import
index 12b4ae4..0977200 100644
--- a/external/Test Portrait/Farmer_F/eyes.png.import
+++ b/external/Test Portrait/Farmer_F/eyes.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dd063tm4qo5nc"
-path="res://.godot/imported/eyes.png-1384a95ac331738bfe48af30a8953f10.ctex"
+path="res://.godot/imported/eyes.png-da6eb5fdf7f113844fe8e5414a1f2331.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/eyes.png"
-dest_files=["res://.godot/imported/eyes.png-1384a95ac331738bfe48af30a8953f10.ctex"]
+source_file="res://external/test portrait/farmer_f/eyes.png"
+dest_files=["res://.godot/imported/eyes.png-da6eb5fdf7f113844fe8e5414a1f2331.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/eyes_shadow.png.import b/external/Test Portrait/Farmer_F/eyes_shadow.png.import
index 1f02358..ac345e4 100644
--- a/external/Test Portrait/Farmer_F/eyes_shadow.png.import
+++ b/external/Test Portrait/Farmer_F/eyes_shadow.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://li44lgsa0ky"
-path="res://.godot/imported/eyes_shadow.png-639516c9b7d6a71a22fcd4597236a89e.ctex"
+path="res://.godot/imported/eyes_shadow.png-c0450e5470a67b3e212b544dfeadc885.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/eyes_shadow.png"
-dest_files=["res://.godot/imported/eyes_shadow.png-639516c9b7d6a71a22fcd4597236a89e.ctex"]
+source_file="res://external/test portrait/farmer_f/eyes_shadow.png"
+dest_files=["res://.godot/imported/eyes_shadow.png-c0450e5470a67b3e212b544dfeadc885.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/hair_bg.png.import b/external/Test Portrait/Farmer_F/hair_bg.png.import
index 0810aed..d83bb4b 100644
--- a/external/Test Portrait/Farmer_F/hair_bg.png.import
+++ b/external/Test Portrait/Farmer_F/hair_bg.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://can8npg0ufr3f"
-path="res://.godot/imported/hair_bg.png-07f942d8008a0d2581909922002bbbe2.ctex"
+path="res://.godot/imported/hair_bg.png-71bd584ff51ea6c704ba2eb2b8124703.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/hair_bg.png"
-dest_files=["res://.godot/imported/hair_bg.png-07f942d8008a0d2581909922002bbbe2.ctex"]
+source_file="res://external/test portrait/farmer_f/hair_bg.png"
+dest_files=["res://.godot/imported/hair_bg.png-71bd584ff51ea6c704ba2eb2b8124703.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/hair_fg.png.import b/external/Test Portrait/Farmer_F/hair_fg.png.import
index 60f342e..5170c99 100644
--- a/external/Test Portrait/Farmer_F/hair_fg.png.import
+++ b/external/Test Portrait/Farmer_F/hair_fg.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://vt17lekvchdg"
-path="res://.godot/imported/hair_fg.png-9f5c6bb27fb0349d9ddfba99f87aa5c6.ctex"
+path="res://.godot/imported/hair_fg.png-9dfae38fbf9812dad9b45d15a1cbd791.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/hair_fg.png"
-dest_files=["res://.godot/imported/hair_fg.png-9f5c6bb27fb0349d9ddfba99f87aa5c6.ctex"]
+source_file="res://external/test portrait/farmer_f/hair_fg.png"
+dest_files=["res://.godot/imported/hair_fg.png-9dfae38fbf9812dad9b45d15a1cbd791.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/hair_fg_shadow.png.import b/external/Test Portrait/Farmer_F/hair_fg_shadow.png.import
index 13e85b8..7dbf97c 100644
--- a/external/Test Portrait/Farmer_F/hair_fg_shadow.png.import
+++ b/external/Test Portrait/Farmer_F/hair_fg_shadow.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cru775pghpate"
-path="res://.godot/imported/hair_fg_shadow.png-41de10e26ae2147aace92ba197b28075.ctex"
+path="res://.godot/imported/hair_fg_shadow.png-609d7f961008e48f548f0e05277dafb4.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/hair_fg_shadow.png"
-dest_files=["res://.godot/imported/hair_fg_shadow.png-41de10e26ae2147aace92ba197b28075.ctex"]
+source_file="res://external/test portrait/farmer_f/hair_fg_shadow.png"
+dest_files=["res://.godot/imported/hair_fg_shadow.png-609d7f961008e48f548f0e05277dafb4.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/hat-bg.png.import b/external/Test Portrait/Farmer_F/hat-bg.png.import
index 41b5407..107e0a5 100644
--- a/external/Test Portrait/Farmer_F/hat-bg.png.import
+++ b/external/Test Portrait/Farmer_F/hat-bg.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dj6fagfp2sbrx"
-path="res://.godot/imported/hat-bg.png-00e20fcd79ddb550d12459624be7d9b1.ctex"
+path="res://.godot/imported/hat-bg.png-972a86d8449c11d1a72a4f21b15efd0a.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/hat-bg.png"
-dest_files=["res://.godot/imported/hat-bg.png-00e20fcd79ddb550d12459624be7d9b1.ctex"]
+source_file="res://external/test portrait/farmer_f/hat-bg.png"
+dest_files=["res://.godot/imported/hat-bg.png-972a86d8449c11d1a72a4f21b15efd0a.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/hat.png.import b/external/Test Portrait/Farmer_F/hat.png.import
index ad9b8b0..db6f143 100644
--- a/external/Test Portrait/Farmer_F/hat.png.import
+++ b/external/Test Portrait/Farmer_F/hat.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b303qa76o5r1m"
-path="res://.godot/imported/hat.png-9bb6fa9d1f7f7503ee26b1749cdf7c0a.ctex"
+path="res://.godot/imported/hat.png-21e48868d0218210b390afa680a1202d.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/hat.png"
-dest_files=["res://.godot/imported/hat.png-9bb6fa9d1f7f7503ee26b1749cdf7c0a.ctex"]
+source_file="res://external/test portrait/farmer_f/hat.png"
+dest_files=["res://.godot/imported/hat.png-21e48868d0218210b390afa680a1202d.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/hat_fg.png.import b/external/Test Portrait/Farmer_F/hat_fg.png.import
index c8bdc32..b24f1f6 100644
--- a/external/Test Portrait/Farmer_F/hat_fg.png.import
+++ b/external/Test Portrait/Farmer_F/hat_fg.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dyeu4kwwnxjn5"
-path="res://.godot/imported/hat_fg.png-e2cae14f649780ea2aba38b34358b587.ctex"
+path="res://.godot/imported/hat_fg.png-2dddd61ae84da22b32d123d3533338c5.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/hat_fg.png"
-dest_files=["res://.godot/imported/hat_fg.png-e2cae14f649780ea2aba38b34358b587.ctex"]
+source_file="res://external/test portrait/farmer_f/hat_fg.png"
+dest_files=["res://.godot/imported/hat_fg.png-2dddd61ae84da22b32d123d3533338c5.ctex"]
[params]
diff --git a/external/Test Portrait/Farmer_F/head.png.import b/external/Test Portrait/Farmer_F/head.png.import
index df71f44..3d2f1a0 100644
--- a/external/Test Portrait/Farmer_F/head.png.import
+++ b/external/Test Portrait/Farmer_F/head.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dbdjaye6srxhx"
-path="res://.godot/imported/head.png-df46fa0b8e2741bbf0fad9b3a03fedea.ctex"
+path="res://.godot/imported/head.png-47039f8abc285b87bb176b5b43ee9a5f.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://external/Test Portrait/Farmer_F/head.png"
-dest_files=["res://.godot/imported/head.png-df46fa0b8e2741bbf0fad9b3a03fedea.ctex"]
+source_file="res://external/test portrait/farmer_f/head.png"
+dest_files=["res://.godot/imported/head.png-47039f8abc285b87bb176b5b43ee9a5f.ctex"]
[params]
diff --git a/external/guildcard-portrait-placeholder.png b/external/guildcard-portrait-placeholder.png
new file mode 100644
index 0000000..5626e0c
Binary files /dev/null and b/external/guildcard-portrait-placeholder.png differ
diff --git a/external/guildcard-portrait-placeholder.png.import b/external/guildcard-portrait-placeholder.png.import
new file mode 100644
index 0000000..ad70528
--- /dev/null
+++ b/external/guildcard-portrait-placeholder.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c5hcva1k5qee0"
+path="res://.godot/imported/guildcard-portrait-placeholder.png-c0bfec06bc2e891650a1650e78889916.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://external/guildcard-portrait-placeholder.png"
+dest_files=["res://.godot/imported/guildcard-portrait-placeholder.png-c0bfec06bc2e891650a1650e78889916.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/external/merchant-placeholder.png b/external/merchant-placeholder.png
new file mode 100644
index 0000000..5d7c11b
Binary files /dev/null and b/external/merchant-placeholder.png differ
diff --git a/external/merchant-placeholder.png.import b/external/merchant-placeholder.png.import
new file mode 100644
index 0000000..44e41cf
--- /dev/null
+++ b/external/merchant-placeholder.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cdqu6oo8lo743"
+path="res://.godot/imported/merchant-placeholder.png-13c0f9bee78f149eb3daefd00b88aa8d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://external/merchant-placeholder.png"
+dest_files=["res://.godot/imported/merchant-placeholder.png-13c0f9bee78f149eb3daefd00b88aa8d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/external/move_marker.aseprite b/external/move_marker.aseprite
new file mode 100644
index 0000000..7f64127
Binary files /dev/null and b/external/move_marker.aseprite differ
diff --git a/external/outline-np.png b/external/outline-np.png
new file mode 100644
index 0000000..f1ba011
Binary files /dev/null and b/external/outline-np.png differ
diff --git a/external/outline-np.png.import b/external/outline-np.png.import
new file mode 100644
index 0000000..868efa0
--- /dev/null
+++ b/external/outline-np.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cnwcvebl0c1it"
+path="res://.godot/imported/outline-np.png-0697bc1c71c69083200c70b4a3720757.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://external/outline-np.png"
+dest_files=["res://.godot/imported/outline-np.png-0697bc1c71c69083200c70b4a3720757.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/external/pom-intro.png b/external/pom-intro.png
new file mode 100644
index 0000000..7d857ec
Binary files /dev/null and b/external/pom-intro.png differ
diff --git a/external/pom-intro.png.import b/external/pom-intro.png.import
new file mode 100644
index 0000000..73d8476
--- /dev/null
+++ b/external/pom-intro.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bdmixnd1mhgfu"
+path="res://.godot/imported/pom-intro.png-7ef40172310857171d345738a7ffed65.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://external/pom-intro.png"
+dest_files=["res://.godot/imported/pom-intro.png-7ef40172310857171d345738a7ffed65.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/external/portrait.clip b/external/portrait.clip
index d48d453..8ed372d 100644
Binary files a/external/portrait.clip and b/external/portrait.clip differ
diff --git a/external/signature.png b/external/signature.png
new file mode 100644
index 0000000..94a63a8
Binary files /dev/null and b/external/signature.png differ
diff --git a/external/signature.png.import b/external/signature.png.import
new file mode 100644
index 0000000..01d3bdd
--- /dev/null
+++ b/external/signature.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://hdjte1ipyyio"
+path="res://.godot/imported/signature.png-5527eb152408fafee8a4b656ff1507f9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://external/signature.png"
+dest_files=["res://.godot/imported/signature.png-5527eb152408fafee8a4b656ff1507f9.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/external/xp.clip b/external/xp.clip
new file mode 100644
index 0000000..c7bbb96
Binary files /dev/null and b/external/xp.clip differ
diff --git a/graphics/first-guild-base.png b/graphics/first-guild-base.png
new file mode 100644
index 0000000..b90be38
Binary files /dev/null and b/graphics/first-guild-base.png differ
diff --git a/graphics/first-guild-base.png.import b/graphics/first-guild-base.png.import
new file mode 100644
index 0000000..d3bdb71
--- /dev/null
+++ b/graphics/first-guild-base.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://do4gn21x5bmdm"
+path="res://.godot/imported/first-guild-base.png-2d43656da3758ae3da4d3e59033f988e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://graphics/first-guild-base.png"
+dest_files=["res://.godot/imported/first-guild-base.png-2d43656da3758ae3da4d3e59033f988e.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/graphics/first-guild-front.png b/graphics/first-guild-front.png
new file mode 100644
index 0000000..e062020
Binary files /dev/null and b/graphics/first-guild-front.png differ
diff --git a/graphics/first-guild-front.png.import b/graphics/first-guild-front.png.import
new file mode 100644
index 0000000..58d092b
--- /dev/null
+++ b/graphics/first-guild-front.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bg5ip7ni3n7qd"
+path="res://.godot/imported/first-guild-front.png-be5b61a04815517e4b07fce70ddaab2b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://graphics/first-guild-front.png"
+dest_files=["res://.godot/imported/first-guild-front.png-be5b61a04815517e4b07fce70ddaab2b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/graphics/first-guild.png b/graphics/first-guild.png
index d79f3d6..03c54e0 100644
Binary files a/graphics/first-guild.png and b/graphics/first-guild.png differ
diff --git a/graphics/move_marker.png b/graphics/move_marker.png
new file mode 100644
index 0000000..83c2cea
Binary files /dev/null and b/graphics/move_marker.png differ
diff --git a/graphics/move_marker.png.import b/graphics/move_marker.png.import
new file mode 100644
index 0000000..cfb63c4
--- /dev/null
+++ b/graphics/move_marker.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bb827iikdiygx"
+path="res://.godot/imported/move_marker.png-9d7e6510cae0af208c9285873d50db6a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://graphics/move_marker.png"
+dest_files=["res://.godot/imported/move_marker.png-9d7e6510cae0af208c9285873d50db6a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/icon.png b/icon.png
new file mode 100644
index 0000000..2abb9df
Binary files /dev/null and b/icon.png differ
diff --git a/icon.png.import b/icon.png.import
new file mode 100644
index 0000000..af7b4e7
--- /dev/null
+++ b/icon.png.import
@@ -0,0 +1,40 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c3kis7t3ahe78"
+path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/project.godot b/project.godot
index 110b554..bbc2a66 100644
--- a/project.godot
+++ b/project.godot
@@ -28,8 +28,8 @@ directories/dch_directory={
"pom": "res://dialogic/characters/pom.dch"
}
directories/dtl_directory={
-"intro": "res://dialogic/timelines/intro.dtl",
-"letter": "res://dialogic/timelines/letter.dtl"
+"game_start": "res://dialogic/timelines/game_start.dtl",
+"guild_entrance": "res://dialogic/timelines/guild_entrance.dtl"
}
glossary/default_case_sensitive=true
extensions_folder="res://addons/dialogic_additions"
@@ -71,7 +71,11 @@ project/assembly_name="pomchronicles"
[editor_plugins]
-enabled=PackedStringArray("res://addons/Todo_Manager/plugin.cfg", "res://addons/dialogic/plugin.cfg")
+enabled=PackedStringArray("res://addons/ReorderableContainer/plugin.cfg", "res://addons/Todo_Manager/plugin.cfg", "res://addons/dialogic/plugin.cfg")
+
+[global_group]
+
+room_obstacles=""
[input]
diff --git a/scenes/game_start.tscn b/scenes/game_start.tscn
new file mode 100644
index 0000000..bf213c4
--- /dev/null
+++ b/scenes/game_start.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=2 format=3 uid="uid://blgri41imul1d"]
+
+[ext_resource type="Script" uid="uid://cpufy3rp4f0gw" path="res://scripts/game_start.gd" id="1_jahr7"]
+
+[node name="Control" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_jahr7")
+
+[node name="ColorRect" type="ColorRect" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+color = Color(0.007298478, 0, 0.13471341, 1)
diff --git a/scenes/guild_card.tscn b/scenes/guild_card.tscn
new file mode 100644
index 0000000..fe6a021
--- /dev/null
+++ b/scenes/guild_card.tscn
@@ -0,0 +1,323 @@
+[gd_scene load_steps=17 format=3 uid="uid://dcpuaq3fcwyxs"]
+
+[ext_resource type="Script" uid="uid://dkrxdaq8d6q55" path="res://scripts/guild_card_scene.gd" id="1_hj0e5"]
+[ext_resource type="Texture2D" uid="uid://c5hcva1k5qee0" path="res://external/guildcard-portrait-placeholder.png" id="1_mmvi8"]
+[ext_resource type="Shader" uid="uid://uxrvcuhjnjgl" path="res://shaders/animated_gradient.gdshader" id="3_3vymb"]
+[ext_resource type="Texture2D" uid="uid://hdjte1ipyyio" path="res://external/signature.png" id="4_ht11g"]
+[ext_resource type="AudioStream" uid="uid://bmm8jhojdt31a" path="res://sounds/Writing in paper 19.wav" id="5_ht11g"]
+
+[sub_resource type="Gradient" id="Gradient_hj0e5"]
+colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1)
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_5cpdt"]
+gradient = SubResource("Gradient_hj0e5")
+
+[sub_resource type="StyleBoxLine" id="StyleBoxLine_3vymb"]
+content_margin_left = 4.0
+content_margin_top = 0.0
+content_margin_right = 4.0
+content_margin_bottom = 0.0
+thickness = 8
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ht11g"]
+content_margin_left = 0.0
+content_margin_top = 0.0
+content_margin_right = 0.0
+content_margin_bottom = 0.0
+bg_color = Color(0.89, 0.75472, 0.5518, 1)
+corner_radius_top_left = 3
+corner_radius_top_right = 3
+corner_radius_bottom_right = 3
+corner_radius_bottom_left = 3
+corner_detail = 5
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3rhvj"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.75686276, 0.62352943, 0.4, 1)
+border_width_bottom = 2
+border_color = Color(0, 0, 0, 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
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tnttg"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.75686276, 0.62352943, 0.4, 1)
+border_width_bottom = 2
+border_color = Color(0, 0, 0, 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
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q4kfw"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.67, 0.5348834, 0.3015, 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
+
+[sub_resource type="StyleBoxLine" id="StyleBoxLine_7irbt"]
+content_margin_left = 4.0
+content_margin_top = 0.0
+content_margin_right = 4.0
+content_margin_bottom = 0.0
+color = Color(1, 1, 1, 1)
+thickness = 4
+
+[sub_resource type="Gradient" id="Gradient_3vymb"]
+offsets = PackedFloat32Array(0.0026385225, 0.047493402, 0.081794195, 1)
+colors = PackedColorArray(1, 0, 0, 1, 0, 0.1333332, 1, 1, 0, 0.02513448, 0.18850878, 1, 0, 0, 0, 1)
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_ht11g"]
+gradient = SubResource("Gradient_3vymb")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_3rhvj"]
+resource_local_to_scene = true
+shader = ExtResource("3_3vymb")
+shader_parameter/gradient = SubResource("GradientTexture1D_ht11g")
+shader_parameter/fringe = 0.008000000001629815
+
+[node name="Guild Card Scene" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_hj0e5")
+
+[node name="ColorRect2" type="ColorRect" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+color = Color(0.007298478, 0, 0.13471341, 1)
+
+[node name="TextureRect" type="TextureRect" parent="."]
+modulate = Color(1, 0.776, 0.52, 1)
+layout_mode = 0
+offset_left = 353.0
+offset_top = 88.99999
+offset_right = 1359.965
+offset_bottom = 1313.5608
+rotation = -0.19356708
+texture = SubResource("GradientTexture1D_5cpdt")
+
+[node name="Label" type="Label" parent="TextureRect"]
+layout_mode = 0
+offset_left = 34.2516
+offset_top = 33.20886
+offset_right = 930.2516
+offset_bottom = 143.20885
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/font_size = 72
+text = "GUILD CHAPTER CHARTER"
+
+[node name="Label2" type="Label" parent="TextureRect"]
+layout_mode = 0
+offset_left = 265.34796
+offset_top = 127.92432
+offset_right = 718.34796
+offset_bottom = 210.92432
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/font_size = 60
+text = "Nestor's Woods"
+
+[node name="HSeparator" type="HSeparator" parent="TextureRect"]
+layout_mode = 0
+offset_left = 97.12344
+offset_top = 190.73767
+offset_right = 892.07495
+offset_bottom = 214.61972
+theme_override_styles/separator = SubResource("StyleBoxLine_3vymb")
+
+[node name="HSeparator2" type="HSeparator" parent="TextureRect"]
+layout_mode = 0
+offset_left = 94.76892
+offset_top = 1138.492
+offset_right = 889.72046
+offset_bottom = 1162.374
+theme_override_styles/separator = SubResource("StyleBoxLine_3vymb")
+
+[node name="ColorRect" type="ColorRect" parent="."]
+layout_mode = 0
+offset_left = 525.0
+offset_top = 352.0
+offset_right = 1452.0
+offset_bottom = 788.0
+color = Color(0, 0, 0, 0.45882353)
+
+[node name="GuildCard" type="Panel" parent="."]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -458.0
+offset_top = -216.0
+offset_right = 458.0
+offset_bottom = 216.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_ht11g")
+
+[node name="PortraitButton" type="TextureButton" parent="GuildCard"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(200, 200)
+layout_mode = 0
+offset_left = 15.0
+offset_top = 63.0
+offset_right = 55.0
+offset_bottom = 103.0
+
+[node name="ColorRect" type="ColorRect" parent="GuildCard/PortraitButton"]
+custom_minimum_size = Vector2(200, 200)
+layout_mode = 0
+offset_right = 200.0
+offset_bottom = 200.0
+mouse_filter = 2
+color = Color(0.75686276, 0.62352943, 0.4, 1)
+
+[node name="TextureRect" type="TextureRect" parent="GuildCard/PortraitButton"]
+modulate = Color(0.6024934, 0.46840662, 0.2634572, 1)
+layout_mode = 0
+offset_right = 200.0
+offset_bottom = 200.0
+mouse_filter = 2
+texture = ExtResource("1_mmvi8")
+expand_mode = 1
+
+[node name="Label" type="Label" parent="GuildCard"]
+layout_mode = 0
+offset_left = 187.0
+offset_right = 736.0
+offset_bottom = 67.0
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/font_size = 48
+text = "Guild Membership Card"
+
+[node name="FirstNameEdit" type="TextEdit" parent="GuildCard"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(300, 60)
+layout_mode = 0
+offset_left = 255.0
+offset_top = 65.0
+offset_right = 555.0
+offset_bottom = 125.0
+theme_override_colors/caret_background_color = Color(0, 0, 0, 0)
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_colors/font_readonly_color = Color(1, 1, 1, 1)
+theme_override_colors/font_placeholder_color = Color(0.3403393, 0.34033933, 0.3403393, 1)
+theme_override_colors/background_color = Color(0, 0, 0, 0)
+theme_override_colors/current_line_color = Color(0, 0, 0, 0)
+theme_override_font_sizes/font_size = 40
+theme_override_styles/normal = SubResource("StyleBoxFlat_3rhvj")
+placeholder_text = "(First Name)"
+
+[node name="LastNameEdit" type="TextEdit" parent="GuildCard"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(300, 60)
+layout_mode = 0
+offset_left = 569.0
+offset_top = 65.0
+offset_right = 869.0
+offset_bottom = 125.0
+theme_override_colors/caret_background_color = Color(0, 0, 0, 0)
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_colors/font_readonly_color = Color(1, 1, 1, 1)
+theme_override_colors/font_placeholder_color = Color(0.3403393, 0.34033933, 0.3403393, 1)
+theme_override_colors/background_color = Color(0, 0, 0, 0)
+theme_override_colors/current_line_color = Color(0, 0, 0, 0)
+theme_override_font_sizes/font_size = 40
+theme_override_styles/normal = SubResource("StyleBoxFlat_tnttg")
+placeholder_text = "(Last Name)"
+
+[node name="Label2" type="Label" parent="GuildCard"]
+layout_mode = 0
+offset_left = 228.0
+offset_top = 74.0
+offset_right = 281.0
+offset_bottom = 129.0
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/font_size = 40
+text = "I, ,
+Do solemnly swear to be an
+adventurer and crap."
+
+[node name="SignButton" type="Button" parent="GuildCard"]
+unique_name_in_owner = true
+layout_mode = 0
+offset_left = 89.0
+offset_top = 284.0
+offset_right = 839.0
+offset_bottom = 380.0
+theme_override_colors/font_color = Color(0.2775273, 0.27752793, 0.27752748, 1)
+theme_override_font_sizes/font_size = 48
+theme_override_styles/normal = SubResource("StyleBoxFlat_q4kfw")
+text = "(Sign Here)"
+
+[node name="HSeparator" type="HSeparator" parent="GuildCard"]
+modulate = Color(0, 0, 0, 1)
+layout_mode = 0
+offset_left = 258.0
+offset_top = 65.0
+offset_right = 552.0
+offset_bottom = 181.0
+mouse_filter = 2
+theme_override_styles/separator = SubResource("StyleBoxLine_7irbt")
+
+[node name="HSeparator3" type="HSeparator" parent="GuildCard"]
+modulate = Color(0, 0, 0, 1)
+layout_mode = 0
+offset_left = 51.0
+offset_top = 329.0
+offset_right = 877.0
+offset_bottom = 445.0
+mouse_filter = 2
+theme_override_styles/separator = SubResource("StyleBoxLine_7irbt")
+
+[node name="HSeparator2" type="HSeparator" parent="GuildCard"]
+modulate = Color(0, 0, 0, 1)
+layout_mode = 0
+offset_left = 573.0
+offset_top = 65.0
+offset_right = 867.0
+offset_bottom = 181.0
+mouse_filter = 2
+theme_override_styles/separator = SubResource("StyleBoxLine_7irbt")
+
+[node name="Signature" type="TextureRect" parent="."]
+unique_name_in_owner = true
+material = SubResource("ShaderMaterial_3rhvj")
+layout_mode = 0
+offset_left = 873.0
+offset_top = 557.0
+offset_right = 1064.0
+offset_bottom = 765.0
+texture = ExtResource("4_ht11g")
+
+[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
+stream = ExtResource("5_ht11g")
+
+[connection signal="pressed" from="GuildCard/PortraitButton" to="." method="_on_portrait_button_pressed"]
+[connection signal="text_changed" from="GuildCard/FirstNameEdit" to="." method="_on_first_name_edit_text_changed"]
+[connection signal="text_changed" from="GuildCard/LastNameEdit" to="." method="_on_last_name_edit_text_changed"]
+[connection signal="pressed" from="GuildCard/SignButton" to="." method="_on_sign_button_pressed"]
diff --git a/scenes/letter.tscn b/scenes/letter.tscn
index 48a4ed0..c3f3c22 100644
--- a/scenes/letter.tscn
+++ b/scenes/letter.tscn
@@ -1,4 +1,6 @@
-[gd_scene load_steps=2 format=3 uid="uid://dytxmk3tg3jg7"]
+[gd_scene load_steps=3 format=3 uid="uid://dytxmk3tg3jg7"]
+
+[ext_resource type="Script" uid="uid://bowfi8npivsxo" path="res://scripts/hold_to_continue.gd" id="1_kg060"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hfigq"]
bg_color = Color(0.47, 0.34466666, 0, 0.38431373)
@@ -16,6 +18,15 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
+[node name="ColorRect4" type="ColorRect" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+color = Color(0.007298478, 0, 0.13471341, 1)
+
[node name="ColorRect2" type="ColorRect" parent="."]
layout_mode = 0
offset_left = 426.99997
@@ -250,3 +261,32 @@ offset_top = 638.0
offset_right = 1367.0
offset_bottom = 766.0
color = Color(0.63, 0.63, 0.63, 1)
+
+[node name="PressToContinue" type="MarginContainer" parent="."]
+custom_minimum_size = Vector2(250, 75)
+layout_mode = 0
+offset_left = 1551.0
+offset_top = 518.0
+offset_right = 1801.0
+offset_bottom = 593.0
+script = ExtResource("1_kg060")
+advance_type = 1
+scene = "game_start"
+label = "Start Guildcard"
+
+[node name="Button" type="TextureButton" parent="PressToContinue"]
+layout_mode = 2
+
+[node name="Label" type="Label" parent="PressToContinue"]
+layout_mode = 2
+text = "Hold Space to Continue ->"
+horizontal_alignment = 1
+
+[node name="ProgressBar" type="ProgressBar" parent="PressToContinue"]
+layout_mode = 2
+size_flags_vertical = 1
+mouse_filter = 2
+show_percentage = false
+
+[connection signal="button_down" from="PressToContinue/Button" to="PressToContinue" method="_on_button_button_down"]
+[connection signal="button_up" from="PressToContinue/Button" to="PressToContinue" method="_on_button_button_up"]
diff --git a/scenes/set_shifts.tscn b/scenes/set_shifts.tscn
index 7aea470..1f4791e 100644
--- a/scenes/set_shifts.tscn
+++ b/scenes/set_shifts.tscn
@@ -1,28 +1,80 @@
-[gd_scene load_steps=2 format=3 uid="uid://b0fifk2nek3lm"]
+[gd_scene load_steps=9 format=3 uid="uid://b0fifk2nek3lm"]
-[sub_resource type="StyleBoxLine" id="StyleBoxLine_cpouh"]
-content_margin_left = 1.0
-content_margin_top = 1.0
-content_margin_right = 1.0
-content_margin_bottom = 1.0
-color = Color(0.5689727, 0.56897277, 0.5689727, 1)
-grow_begin = 180.0
-grow_end = 180.0
-thickness = 3
+[ext_resource type="Script" uid="uid://h61yq7g8mfj3" path="res://scripts/set_shifts.gd" id="1_rxjlm"]
+[ext_resource type="Script" uid="uid://d3mey1366662n" path="res://addons/ReorderableContainer/reorderable_vbox.gd" id="2_532of"]
+[ext_resource type="PackedScene" uid="uid://ctbg44spnjbsa" path="res://templates/shift_cycle.tscn" id="2_rxjlm"]
-[node name="Control" type="MarginContainer"]
-anchors_preset = 15
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_532of"]
+content_margin_left = 0.0
+content_margin_top = 0.0
+content_margin_right = 0.0
+content_margin_bottom = 0.0
+bg_color = Color(0.9768931, 0.7416691, 0.47020185, 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
+
+[sub_resource type="StyleBoxLine" id="StyleBoxLine_532of"]
+content_margin_left = 4.0
+content_margin_top = 0.0
+content_margin_right = 4.0
+content_margin_bottom = 0.0
+thickness = 4
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4epq3"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.47520554, 0.36835867, 0.22654346, 1)
+corner_radius_top_left = 3
+corner_radius_top_right = 3
+corner_radius_bottom_right = 3
+corner_radius_bottom_left = 3
+corner_detail = 5
+
+[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_532of"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_u3f83"]
+content_margin_left = 0.0
+content_margin_top = 0.0
+content_margin_right = 0.0
+content_margin_bottom = 0.0
+bg_color = Color(0.45, 0.45, 0.45, 0.40784314)
+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="Control" type="Control"]
+layout_mode = 3
anchor_right = 1.0
anchor_bottom = 1.0
+offset_bottom = 37.0
grow_horizontal = 2
grow_vertical = 2
+script = ExtResource("1_rxjlm")
+
+[node name="MarginContainer" type="MarginContainer" parent="."]
+layout_mode = 0
+offset_left = 150.0
+offset_top = 100.0
+offset_right = 1770.0
+offset_bottom = 1017.0
theme_override_constants/margin_left = 150
theme_override_constants/margin_top = 100
theme_override_constants/margin_right = 150
theme_override_constants/margin_bottom = 100
[node name="PanelContainer" type="PanelContainer" parent="."]
-layout_mode = 2
+layout_mode = 0
+offset_left = 150.0
+offset_top = 100.0
+offset_right = 1770.0
+offset_bottom = 1017.0
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"]
layout_mode = 2
@@ -35,15 +87,6 @@ theme_override_constants/margin_bottom = 20
layout_mode = 2
theme_override_constants/separation = 15
-[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/PanelContainer"]
-layout_mode = 2
-theme_override_font_sizes/font_size = 42
-text = "Please Set Your Work Shift Cycles"
-horizontal_alignment = 1
-
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
theme_override_constants/separation = 9
@@ -79,69 +122,81 @@ QUESTS WILL NOT MAKE PROGRESS.
"
autowrap_mode = 2
-[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
-layout_mode = 2
-
-[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"]
+[node name="PanelContainer2" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
custom_minimum_size = Vector2(700, 700)
layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_532of")
-[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer"]
+[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2"]
layout_mode = 2
-[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer"]
+[node name="Label" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer"]
layout_mode = 2
-
-[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer/PanelContainer"]
-layout_mode = 2
-
-[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer/PanelContainer/VBoxContainer"]
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-
-[node name="Label" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer/PanelContainer/VBoxContainer/HBoxContainer"]
-custom_minimum_size = Vector2(600, 50)
-layout_mode = 2
-theme_override_font_sizes/font_size = 32
-text = "WORK SHIFT"
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/font_size = 42
+text = "Set Your Work Shift Cycles"
horizontal_alignment = 1
-vertical_alignment = 1
-[node name="TextEdit" type="TextEdit" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer/PanelContainer/VBoxContainer/HBoxContainer"]
-custom_minimum_size = Vector2(65, 50)
+[node name="HSeparator" type="HSeparator" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer"]
layout_mode = 2
-theme_override_font_sizes/font_size = 32
-placeholder_text = "25"
+theme_override_constants/separation = 8
+theme_override_styles/separator = SubResource("StyleBoxLine_532of")
-[node name="VSeparator" type="VSeparator" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer/PanelContainer/VBoxContainer"]
-layout_mode = 2
-theme_override_styles/separator = SubResource("StyleBoxLine_cpouh")
-
-[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer/PanelContainer/VBoxContainer"]
-custom_minimum_size = Vector2(200, 0)
+[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer"]
+clip_contents = false
+custom_minimum_size = Vector2(0, 700)
layout_mode = 2
-[node name="Label" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer/PanelContainer/VBoxContainer/HBoxContainer2"]
-custom_minimum_size = Vector2(600, 50)
+[node name="CycleList" type="Container" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/ScrollContainer"]
+unique_name_in_owner = true
+process_mode = 1
+custom_minimum_size = Vector2(0, 111)
layout_mode = 2
-theme_override_font_sizes/font_size = 32
-text = "OPEN SHIFT"
-horizontal_alignment = 1
-vertical_alignment = 1
+script = ExtResource("2_532of")
+hold_duration = 0.25
+is_vertical = true
+metadata/_custom_type_script = "uid://d3mey1366662n"
-[node name="TextEdit" type="TextEdit" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer/VBoxContainer/PanelContainer/VBoxContainer/HBoxContainer2"]
-custom_minimum_size = Vector2(65, 50)
+[node name="ShiftCycle" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/ScrollContainer/CycleList" instance=ExtResource("2_rxjlm")]
layout_mode = 2
-theme_override_font_sizes/font_size = 32
-placeholder_text = "5"
-[node name="Button" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"]
+[node name="Accept Button" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer"]
layout_mode = 2
+size_flags_vertical = 3
+theme_override_colors/font_color = Color(0.34254947, 0.14302492, 4.813075e-08, 1)
theme_override_font_sizes/font_size = 48
+theme_override_styles/normal = SubResource("StyleBoxFlat_4epq3")
text = "ACCEPT"
-[node name="Button" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
-custom_minimum_size = Vector2(460, 0)
+[node name="VBoxContainer2" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
+
+[node name="Add Shift Button" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2"]
+custom_minimum_size = Vector2(460, 400)
+layout_mode = 2
+size_flags_vertical = 3
theme_override_font_sizes/font_size = 48
text = "ADD SHIFT"
+
+[node name="DeleteBin" type="PanelContainer" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2"]
+unique_name_in_owner = true
+material = SubResource("CanvasItemMaterial_532of")
+custom_minimum_size = Vector2(0, 400)
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_u3f83")
+
+[node name="Label" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/DeleteBin"]
+modulate = Color(0.40832946, 0.40832946, 0.40832946, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 32
+text = "(Drag a Shift Cycle Here to Remove)"
+horizontal_alignment = 1
+vertical_alignment = 1
+autowrap_mode = 2
+
+[connection signal="drag_started" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/ScrollContainer/CycleList" to="." method="_on_drag_started"]
+[connection signal="drag_stopped" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/ScrollContainer/CycleList" to="." method="_on_drag_stopped"]
+[connection signal="dragging" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/ScrollContainer/CycleList" to="." method="_on_drag_moved"]
+[connection signal="sort_children" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/ScrollContainer/CycleList" to="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/ScrollContainer/CycleList" method="_on_sort_children"]
+[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/Accept Button" to="." method="_on_accept_button_pressed"]
+[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/Add Shift Button" to="." method="_on_add_shift_button_pressed"]
diff --git a/scenes/start_menu.tscn b/scenes/start_menu.tscn
index 1ef947c..a25d4bf 100644
--- a/scenes/start_menu.tscn
+++ b/scenes/start_menu.tscn
@@ -30,6 +30,7 @@ offset_bottom = 970.0
[node name="Label" type="Label" parent="VBoxContainer"]
layout_mode = 2
+mouse_filter = 0
theme_override_font_sizes/font_size = 100
text = "PomChronicles:"
horizontal_alignment = 1
@@ -37,6 +38,7 @@ horizontal_alignment = 1
[node name="Label2" type="Label" parent="VBoxContainer"]
modulate = Color(0.45840502, 0.45840508, 0.45840502, 1)
layout_mode = 2
+mouse_filter = 0
theme_override_font_sizes/font_size = 48
text = "We're going to be the bestest guild ever, right? Right?!?"
horizontal_alignment = 1
diff --git a/scripts/game_manager.gd b/scripts/game_manager.gd
index 5cc987b..65ec95c 100644
--- a/scripts/game_manager.gd
+++ b/scripts/game_manager.gd
@@ -5,11 +5,11 @@ var panel : GamePanel = null
var player_profile : Window = null
var quest_log : QuestLog = null
var top_menu : TopMenu = null
-var open : bool = true
+var open : bool = false
var end_shift_confirmation : ConfirmationDialog
var end_shift_confirm_template = preload("res://templates/end_shift_confirmation.tscn")
var player_profile_template = preload("res://templates/player_profile_window.tscn")
-
+var last_screenshot : Image
func _ready() -> void:
DisplayServer.register_additional_output(self)
end_shift_confirmation = end_shift_confirm_template.instantiate()
@@ -44,6 +44,7 @@ func toggle_player_profile():
func end_shift() -> void:
+ take_screenshot()
open = false
if player_profile != null:
toggle_player_profile()
@@ -73,11 +74,15 @@ func notice(msg : String, time : float = 1) -> void:
func calculate_kill_exp(killer : QuestSprite, killed : QuestSprite) -> int:
return clamp(1, (killed.level - killer.level) * 5, 100)
+func take_screenshot() -> void:
+ last_screenshot = get_viewport().get_texture().get_image()
+
func test_save() -> void:
- var image : Image = get_viewport().get_texture().get_image()
+ if open:
+ take_screenshot()
var save_dict = {
"savetime": Time.get_datetime_string_from_system(),
- "screenshot": image.save_png_to_buffer().hex_encode()
+ "screenshot": last_screenshot
}
#Save the guild data
save_dict["guildname"] = Guild.name
@@ -122,4 +127,9 @@ func test_load(filename : String) -> void:
if not parse_result == OK:
printerr("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
return
-
+
+func switch_scenes(scene_name : String) -> void:
+ get_tree().change_scene_to_file("res://scenes/" + scene_name + ".tscn")
+
+func switch_dialogue(timeline_name : String, label : String) -> void:
+ Dialogic.start("res://dialogic/timelines/" + timeline_name + ".dtl", label)
diff --git a/scripts/game_start.gd b/scripts/game_start.gd
new file mode 100644
index 0000000..079f62a
--- /dev/null
+++ b/scripts/game_start.gd
@@ -0,0 +1,6 @@
+extends Control
+
+@onready var timeline : DialogicTimeline = preload("res://dialogic/timelines/game_start.dtl")
+
+func _ready() -> void:
+ Dialogic.start(timeline)
diff --git a/scripts/game_start.gd.uid b/scripts/game_start.gd.uid
new file mode 100644
index 0000000..fc0c387
--- /dev/null
+++ b/scripts/game_start.gd.uid
@@ -0,0 +1 @@
+uid://cpufy3rp4f0gw
diff --git a/scripts/guild_card_scene.gd b/scripts/guild_card_scene.gd
new file mode 100644
index 0000000..c6e1b7b
--- /dev/null
+++ b/scripts/guild_card_scene.gd
@@ -0,0 +1,49 @@
+extends Control
+
+@onready var firstEdit : TextEdit = %FirstNameEdit
+@onready var lastEdit : TextEdit = %LastNameEdit
+@onready var signButton : Button = %SignButton
+@onready var portraitButton : TextureButton = %PortraitButton
+@onready var signature : TextureRect = %Signature
+@onready var write_sound : AudioStreamPlayer = $AudioStreamPlayer
+var first_set : bool = false
+var last_set : bool = false
+var portrait_set : bool = false
+
+func validate_signature() -> void:
+ signButton.disabled = !(first_set and last_set and portrait_set)
+
+func _on_portrait_button_pressed() -> void:
+ #Open the Portrait Screesn
+ portrait_set = true
+ validate_signature()
+
+
+func _on_first_name_edit_text_changed() -> void:
+ if firstEdit.text != "":
+ first_set = true
+ else:
+ last_set = true
+ validate_signature()
+
+
+func _on_last_name_edit_text_changed() -> void:
+ if lastEdit.text != "":
+ last_set = true
+ else:
+ last_set = false
+ validate_signature()
+
+func update_signature_threshold(value : float) -> void:
+ signature.set_instance_shader_parameter("threshold", value)
+
+func _on_sign_button_pressed() -> void:
+ signButton.visible = false
+ var tween = create_tween()
+ write_sound.play()
+ tween.tween_method(update_signature_threshold, -0.1, 1.1, .5)
+
+ #Sign the card.
+ #Dialogic.paused = false
+ #Dialogic.Jump.jump_to_label("")
+ pass # Replace with function body.
diff --git a/scripts/guild_card_scene.gd.uid b/scripts/guild_card_scene.gd.uid
new file mode 100644
index 0000000..a0435da
--- /dev/null
+++ b/scripts/guild_card_scene.gd.uid
@@ -0,0 +1 @@
+uid://dkrxdaq8d6q55
diff --git a/scripts/guild_facade.gd b/scripts/guild_facade.gd
new file mode 100644
index 0000000..ccda88b
--- /dev/null
+++ b/scripts/guild_facade.gd
@@ -0,0 +1,20 @@
+extends Area2D
+
+var overlapping : bool
+var shift_tween : Tween
+func _on_body_entered(body: Node2D) -> void:
+ if overlapping:
+ return
+ if body == Game.player:
+ overlapping = true
+ shift_tween = create_tween()
+ shift_tween.tween_property(self, "modulate:a", .5, .25)
+
+
+func _on_body_exited(body: Node2D) -> void:
+ if !overlapping:
+ return
+ if body == Game.player:
+ overlapping = false
+ shift_tween = create_tween()
+ shift_tween.tween_property(self, "modulate:a", 1.0, .25)
diff --git a/scripts/guild_facade.gd.uid b/scripts/guild_facade.gd.uid
new file mode 100644
index 0000000..3d2ec4d
--- /dev/null
+++ b/scripts/guild_facade.gd.uid
@@ -0,0 +1 @@
+uid://dyn5wwocvkqds
diff --git a/scripts/hold_to_continue.gd b/scripts/hold_to_continue.gd
new file mode 100644
index 0000000..fb8de09
--- /dev/null
+++ b/scripts/hold_to_continue.gd
@@ -0,0 +1,41 @@
+extends MarginContainer
+
+@export var key : Key = KEY_SPACE
+@export var time : float = 3
+@export var advance_type : AdvanceType
+@export var scene : String
+@export var label : String
+@onready var progress_bar : ProgressBar = $ProgressBar
+
+enum AdvanceType{
+ SCENE,
+ DIALOGUE
+}
+var progress : float = 0
+var button_held : bool
+var key_held : bool
+
+func _process(delta: float) -> void:
+ key_held = Input.is_key_pressed(key)
+ if key_held or button_held:
+ progress = min(time, progress + delta)
+ if progress == time:
+ advance()
+ return
+ else:
+ progress = max(0, progress - 2 * delta)
+ progress_bar.value = 100 * progress / time
+
+func advance():
+ match(advance_type):
+ AdvanceType.SCENE:
+ Game.switch_scenes(scene)
+ AdvanceType.DIALOGUE:
+ Game.switch_dialogue(scene, label)
+
+func _on_button_button_down() -> void:
+ button_held = true
+
+
+func _on_button_button_up() -> void:
+ button_held = false
diff --git a/scripts/hold_to_continue.gd.uid b/scripts/hold_to_continue.gd.uid
new file mode 100644
index 0000000..816723f
--- /dev/null
+++ b/scripts/hold_to_continue.gd.uid
@@ -0,0 +1 @@
+uid://bowfi8npivsxo
diff --git a/scripts/player.gd b/scripts/player.gd
index fa1b513..34d3cae 100644
--- a/scripts/player.gd
+++ b/scripts/player.gd
@@ -1,10 +1,12 @@
class_name Player extends Person
+const marker_template = preload("res://templates/move_marker.tscn")
@onready var movement_speed : float = 400.0
@onready var movement_target_position : Vector2 = global_position
@onready var nav_agent : NavigationAgent2D = $NavigationAgent2D
var interaction_target = null
+var marker = null
@export var interaction_range : float = 75
@export var stop_range : float = 25
var data : Adventurer
@@ -28,6 +30,8 @@ func set_movement_target(target : Vector2) -> void:
func _physics_process(delta: float) -> void:
if nav_agent.is_navigation_finished():
+ if marker != null:
+ marker.visible = false
if interaction_target:
try_interact(interaction_target)
#If they have an interaction target within range
@@ -50,8 +54,13 @@ func _unhandled_input(event: InputEvent) -> void:
interaction_target = null
func approach(pos : Vector2) -> void:
+ if marker == null or !is_instance_valid(marker):
+ marker = marker_template.instantiate()
+ Guild.hall.add_child(marker)
var rid = get_world_2d().get_navigation_map()
var point : Vector2 = NavigationServer2D.map_get_closest_point(rid, pos)
+ marker.global_position = point
+ marker.visible = true
set_movement_target(point)
func approach_and_interact(obj : Interactable) -> void:
diff --git a/scripts/set_shifts.gd b/scripts/set_shifts.gd
new file mode 100644
index 0000000..7972a05
--- /dev/null
+++ b/scripts/set_shifts.gd
@@ -0,0 +1,34 @@
+extends Control
+
+@onready var shift_cycle_template = preload("res://templates/shift_cycle.tscn")
+@onready var cycle_list : ReorderableVBox = %CycleList
+@onready var delete_bin : PanelContainer = %DeleteBin
+var delete_tween : Tween
+
+func _ready() -> void:
+ delete_tween = delete_bin.create_tween()
+ delete_tween.tween_property(delete_bin, "self_modulate", Color.WHITE, .3)
+ delete_tween.tween_property(delete_bin, "self_modulate", Color.DIM_GRAY, .3)
+ delete_tween.set_loops(-1)
+ delete_tween.pause()
+ delete_bin.self_modulate = Color.DIM_GRAY
+
+func _on_drag_stopped(cycle : ShiftCycle):
+ cycle.drop()
+ if(delete_bin.get_global_rect().has_point(get_global_mouse_position())
+ and len(cycle_list.get_children()) > 1):
+ delete_tween.pause()
+ delete_bin.self_modulate = Color.DIM_GRAY
+ cycle.queue_free()
+
+func _on_drag_started(cycle : ShiftCycle):
+ cycle.lift()
+ pass
+
+func _on_add_shift_button_pressed() -> void:
+ var cycle = shift_cycle_template.instantiate()
+ cycle_list.add_child(cycle)
+
+
+func _on_accept_button_pressed() -> void:
+ pass # Replace with function body.
diff --git a/scripts/set_shifts.gd.uid b/scripts/set_shifts.gd.uid
new file mode 100644
index 0000000..9df9596
--- /dev/null
+++ b/scripts/set_shifts.gd.uid
@@ -0,0 +1 @@
+uid://h61yq7g8mfj3
diff --git a/scripts/shift_cycle.gd b/scripts/shift_cycle.gd
new file mode 100644
index 0000000..9ba068a
--- /dev/null
+++ b/scripts/shift_cycle.gd
@@ -0,0 +1,84 @@
+class_name ShiftCycle extends Control
+
+@onready var sounds : Dictionary = {
+ "delete":preload("res://sounds/Various Sounds 06.wav"),
+ "lift":preload("res://sounds/Turning Books Pages 52.wav"),
+ "drop":preload("res://sounds/Paper_Scraping_1.wav")
+}
+@onready var panel : PanelContainer = %PanelContainer
+@onready var working_edit : TextEdit = %WorkingEdit
+@onready var open_edit : TextEdit = %OpenEdit
+@onready var shadow : Panel = %Shadow
+@onready var audio_player : AudioStreamPlayer = $AudioStreamPlayer
+
+var last_working_text : String = ""
+var last_open_text : String = ""
+
+
+var work_shift : int = 25
+var open_shift : int = 5
+var regex : RegEx
+var tween : Tween
+var dragging : bool = false
+
+func _init() -> void:
+ regex = RegEx.new()
+ regex.compile("^\\d{1,3}\\z")
+
+
+func _input(event: InputEvent) -> void:
+ if !dragging:
+ return
+ if event is not InputEventMouseMotion:
+ return
+
+func lift() -> void:
+ if tween and tween.is_running():
+ tween.stop()
+ tween = create_tween()
+ tween.tween_property(shadow, "position:y", 10.0, .25 * (10 - shadow.position.y) / 10.0)
+ tween.parallel().tween_property(shadow, "self_modulate:a", 1.0, .25 * (1.0 - shadow.self_modulate.a))
+ tween.parallel().tween_property(panel, "position:y", -10.0, .25 * (panel.position.y + 10.0) / 10.0)
+ audio_player.stream = sounds.lift
+ audio_player.play()
+
+func drop() -> void:
+ if tween and tween.is_running():
+ tween.stop()
+ tween = create_tween()
+ tween.tween_property(shadow, "position:y", 0.0, .25 * shadow.position.y / 10.0)
+ tween.parallel().tween_property(shadow, "self_modulate:a", 0.0, .25 * shadow.self_modulate.a)
+ tween.parallel().tween_property(panel, "position:y", 0.0, .25 * panel.position.y / -10.0)
+ audio_player.stream = sounds.drop
+ audio_player.play()
+
+func _on_working_edit_text_changed() -> void:
+ if !regex.search(working_edit.text) and working_edit.text != "":
+ working_edit.text = last_working_text
+ working_edit.set_caret_column(len(last_working_text))
+ else:
+ last_working_text = working_edit.text
+
+
+func _on_working_edit_text_set() -> void:
+ if !regex.search(working_edit.text) and working_edit.text != "":
+ working_edit.text = last_working_text
+ working_edit.set_caret_column(len(last_working_text))
+ else:
+ last_working_text = working_edit.text
+
+
+func _on_open_edit_text_changed() -> void:
+ if !regex.search(open_edit.text) and open_edit.text != "":
+ open_edit.text = last_open_text
+ open_edit.set_caret_column(len(last_open_text))
+ else:
+ last_open_text = open_edit.text
+
+
+func _on_open_edit_text_set() -> void:
+ if !regex.search(open_edit.text) and open_edit.text != "":
+ open_edit.text = last_open_text
+ open_edit.set_caret_column(len(last_open_text))
+ else:
+ last_open_text = open_edit.text
diff --git a/scripts/shift_cycle.gd.uid b/scripts/shift_cycle.gd.uid
new file mode 100644
index 0000000..35bd556
--- /dev/null
+++ b/scripts/shift_cycle.gd.uid
@@ -0,0 +1 @@
+uid://cuds3hklcm5m5
diff --git a/scripts/start_menu.gd b/scripts/start_menu.gd
index db63e25..dc05fd6 100644
--- a/scripts/start_menu.gd
+++ b/scripts/start_menu.gd
@@ -5,7 +5,7 @@ func _ready() -> void:
%ContinueButton.disabled = !FileAccess.file_exists("user://savefile.save")
func _on_start_button_pressed() -> void:
- get_tree().change_scene_to_file("res://scenes/active_scene.tscn")
+ get_tree().change_scene_to_file("res://scenes/game_start.tscn")
func _on_continue_button_pressed() -> void:
diff --git a/shaders/animated_gradient.gdshader b/shaders/animated_gradient.gdshader
new file mode 100644
index 0000000..5af440f
--- /dev/null
+++ b/shaders/animated_gradient.gdshader
@@ -0,0 +1,27 @@
+shader_type canvas_item;
+
+uniform sampler2D gradient;
+instance uniform float threshold = -0.1;
+uniform float fringe = 0;
+void vertex() {
+ // Called for every vertex the material is visible on.
+}
+
+void fragment() {
+ vec4 col = texture(TEXTURE, UV);
+ float lum = 0.2126*col.r + 0.7152*col.g + 0.0722*col.b;
+ vec4 g_col = texture(gradient, vec2((threshold + fringe) - lum, 0));
+ if(lum > threshold){
+ float fringe_alpha = max(0, (fringe - (lum - threshold))/fringe);
+ COLOR = vec4(g_col.rgb,fringe_alpha * col.a);
+
+ }else{
+ COLOR = vec4(g_col.rgb, col.a);
+ }
+ // Called for every pixel the material is visible on.
+}
+
+//void light() {
+// // Called for every pixel for every light affecting the CanvasItem.
+// // Uncomment to replace the default light processing function with this one.
+//}
diff --git a/shaders/animated_gradient.gdshader.uid b/shaders/animated_gradient.gdshader.uid
new file mode 100644
index 0000000..9598b1f
--- /dev/null
+++ b/shaders/animated_gradient.gdshader.uid
@@ -0,0 +1 @@
+uid://uxrvcuhjnjgl
diff --git a/sounds/Paper_Scraping_1.wav b/sounds/Paper_Scraping_1.wav
new file mode 100644
index 0000000..8323bb0
Binary files /dev/null and b/sounds/Paper_Scraping_1.wav differ
diff --git a/sounds/Paper_Scraping_1.wav.import b/sounds/Paper_Scraping_1.wav.import
new file mode 100644
index 0000000..e6921af
--- /dev/null
+++ b/sounds/Paper_Scraping_1.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://b62f7hq5j76ps"
+path="res://.godot/imported/Paper_Scraping_1.wav-ed4ebf713b4a2fc6fb104a8579b4c850.sample"
+
+[deps]
+
+source_file="res://sounds/Paper_Scraping_1.wav"
+dest_files=["res://.godot/imported/Paper_Scraping_1.wav-ed4ebf713b4a2fc6fb104a8579b4c850.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=2
diff --git a/sounds/Turning Books Pages 52.wav b/sounds/Turning Books Pages 52.wav
new file mode 100644
index 0000000..cdb5879
Binary files /dev/null and b/sounds/Turning Books Pages 52.wav differ
diff --git a/sounds/Turning Books Pages 52.wav.import b/sounds/Turning Books Pages 52.wav.import
new file mode 100644
index 0000000..a257721
--- /dev/null
+++ b/sounds/Turning Books Pages 52.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://cqtu3l6lul4fh"
+path="res://.godot/imported/Turning Books Pages 52.wav-5e6566bd1088dd960847c6bffa4da219.sample"
+
+[deps]
+
+source_file="res://sounds/Turning Books Pages 52.wav"
+dest_files=["res://.godot/imported/Turning Books Pages 52.wav-5e6566bd1088dd960847c6bffa4da219.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=2
diff --git a/sounds/Various Sounds 06.wav b/sounds/Various Sounds 06.wav
new file mode 100644
index 0000000..b28a151
Binary files /dev/null and b/sounds/Various Sounds 06.wav differ
diff --git a/sounds/Various Sounds 06.wav.import b/sounds/Various Sounds 06.wav.import
new file mode 100644
index 0000000..6c68309
--- /dev/null
+++ b/sounds/Various Sounds 06.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://dhp06mu11vvrw"
+path="res://.godot/imported/Various Sounds 06.wav-45605ce0a28cfd304f16a2df4e2ac9fa.sample"
+
+[deps]
+
+source_file="res://sounds/Various Sounds 06.wav"
+dest_files=["res://.godot/imported/Various Sounds 06.wav-45605ce0a28cfd304f16a2df4e2ac9fa.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=2
diff --git a/sounds/Writing in paper 19.wav b/sounds/Writing in paper 19.wav
new file mode 100644
index 0000000..415bade
Binary files /dev/null and b/sounds/Writing in paper 19.wav differ
diff --git a/sounds/Writing in paper 19.wav.import b/sounds/Writing in paper 19.wav.import
new file mode 100644
index 0000000..8485dbb
--- /dev/null
+++ b/sounds/Writing in paper 19.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://bmm8jhojdt31a"
+path="res://.godot/imported/Writing in paper 19.wav-b328e792019d1d348a794214adc113d6.sample"
+
+[deps]
+
+source_file="res://sounds/Writing in paper 19.wav"
+dest_files=["res://.godot/imported/Writing in paper 19.wav-b328e792019d1d348a794214adc113d6.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=2
diff --git a/templates/guildhall.tscn b/templates/guildhall.tscn
index 62092cf..cc6b482 100644
--- a/templates/guildhall.tscn
+++ b/templates/guildhall.tscn
@@ -1,18 +1,19 @@
-[gd_scene load_steps=33 format=4 uid="uid://cd08dp16bixfv"]
+[gd_scene load_steps=35 format=3 uid="uid://cd08dp16bixfv"]
[ext_resource type="Script" uid="uid://ccorfvcfa84gf" path="res://scripts/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://scripts/player.gd" id="2_5n4iw"]
[ext_resource type="Shader" uid="uid://cenbje61a2wi6" path="res://shaders/void_composite.gdshader" id="2_ggqxp"]
[ext_resource type="Texture2D" uid="uid://83ayd5rg7x8l" path="res://graphics/reception-table.png" id="3_13vc8"]
[ext_resource type="Texture2D" uid="uid://cg6ptmynq0aq0" path="res://graphics/basic-sprite.png" id="4_l3mu1"]
[ext_resource type="PackedScene" uid="uid://cf6nnjyp8kv78" path="res://templates/receptionist.tscn" id="5_l3mu1"]
[ext_resource type="Script" uid="uid://2g4ja3a7o2l" path="res://scripts/void_ripple.gd" id="5_nfvtf"]
+[ext_resource type="Texture2D" uid="uid://do4gn21x5bmdm" path="res://graphics/first-guild-base.png" id="6_lsfle"]
[ext_resource type="PackedScene" uid="uid://b3mksvn2jf7e0" path="res://templates/quest_board.tscn" id="7_hph4e"]
+[ext_resource type="Script" uid="uid://dyn5wwocvkqds" path="res://scripts/guild_facade.gd" id="7_o230c"]
+[ext_resource type="Texture2D" uid="uid://bg5ip7ni3n7qd" path="res://graphics/first-guild-front.png" id="8_nfvtf"]
[ext_resource type="Script" uid="uid://bh54wpqgau8hc" path="res://scripts/npc.gd" id="8_nhrwr"]
[ext_resource type="Texture2D" uid="uid://dcrhry67g00vk" path="res://graphics/pom.png" id="9_4bidn"]
[ext_resource type="PackedScene" uid="uid://jbqw0n6dlj08" path="res://templates/speech_bubble.tscn" id="10_6hdsl"]
-[ext_resource type="Texture2D" uid="uid://cg42wsmb3ocfq" path="res://graphics/first-guild.png" id="11_4bidn"]
[ext_resource type="Shader" uid="uid://hr8vdp56p4yo" path="res://shaders/void.tres" id="12_0ydii"]
[ext_resource type="Texture2D" uid="uid://bbh444vapab3y" path="res://graphics/voidcircle.png" id="13_0xaku"]
[ext_resource type="Shader" uid="uid://dvdm8x66gwu2v" path="res://shaders/starfield.tres" id="14_0aygh"]
@@ -40,22 +41,24 @@ shader_parameter/line_color = Color(0.7666664, 0, 1, 1)
offsets = PackedFloat32Array(0, 0.27842227, 0.7447796, 0.9976798, 1)
colors = PackedColorArray(1, 0, 1, 1, 0.6414714, 0, 1, 1, 0.3529412, 0, 1, 1, 0.13464576, 8.6924134e-05, 0.43542284, 1, 0.3529412, 0, 1, 1)
-[sub_resource type="NavigationPolygon" id="NavigationPolygon_w7eqs"]
-vertices = PackedVector2Array(335, 241, 335, 111.36719, 378.1875, 129.53125, 399, 241, 395.97656, 137, 523.21875, 137, 497, 241, 624.0469, 71.046875, 689, 30, 689, 241, 588.78125, 107.5, 497, 305, 399, 305, 630.75, 30, 582.15625, 110.47656)
-polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3), PackedInt32Array(3, 2, 4), PackedInt32Array(3, 4, 5, 6), PackedInt32Array(7, 8, 9, 6, 10), PackedInt32Array(6, 11, 12, 3), PackedInt32Array(7, 13, 8), PackedInt32Array(10, 6, 5, 14)])
-outlines = Array[PackedVector2Array]([PackedVector2Array(315, 60, 330, 93, 399, 122, 520, 122, 580, 95, 610, 64, 618, 15, 695, 15, 695, -18, 317, -19)])
-border_size = 250.0
-agent_radius = 15.0
+[sub_resource type="NavigationPolygon" id="NavigationPolygon_28dkg"]
+vertices = PackedVector2Array(687, 5, 689, -0.328125, 689, 12, 318, 11, 318, 10.8515625, 338, 48, 302, 51, 307, 31, 399, 431, 305, 431, 533, -14, 617.5, -14, 617, -13, 530, 8, 529.65625, -14.1953125, 617, -2, 621, 5, 702, 15, 703, 416, 694, 416, 454, 75, 510, 47, 493, 432, 493, 578, 399, 578, 694, 431, 392, 75)
+polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2), PackedInt32Array(3, 4, 5), PackedInt32Array(6, 7, 3, 5, 8, 9), PackedInt32Array(10, 11, 12), PackedInt32Array(13, 14, 10, 15, 16), PackedInt32Array(17, 18, 19, 20, 21, 2), PackedInt32Array(22, 23, 24, 8, 20), PackedInt32Array(19, 25, 22, 20), PackedInt32Array(8, 5, 26), PackedInt32Array(8, 26, 20), PackedInt32Array(10, 12, 15), PackedInt32Array(0, 2, 21, 13, 16)])
+outlines = Array[PackedVector2Array]([PackedVector2Array(689, 12, 702, 15, 703, 416, 694, 416, 694, 431, 493, 432, 493, 578, 399, 578, 399, 431, 305, 431, 302, 51, 307, 31, 318, 11, 318, -27, 533, -14, 689, -14)])
+source_geometry_mode = 2
+source_geometry_group_name = &"room_obstacles"
+agent_radius = 0.0
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_a3e6t"]
+size = Vector2(211, 203)
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_lsfle"]
+size = Vector2(91.5, 203)
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_l3mu1"]
radius = 15.0
height = 54.0
-[sub_resource type="NavigationPolygon" id="NavigationPolygon_l3mu1"]
-vertices = PackedVector2Array(112, 144, 14, 144, 14, -69, 112, -69)
-polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)])
-outlines = Array[PackedVector2Array]([PackedVector2Array(4, -79, 122, -79, 122, 154, 4, 154)])
-
[sub_resource type="Gradient" id="Gradient_28dkg"]
offsets = PackedFloat32Array(0, 0.15085158, 0.63017035, 1)
colors = PackedColorArray(0, 0, 0, 1, 0, 0.07479378, 0.21630663, 1, 0.11818864, 0.00013856843, 0.3326036, 1, 1.1310726e-06, 1.2032687e-07, 0.37330782, 1)
@@ -163,12 +166,12 @@ position = Vector2(486, 158)
[node name="Line2D" type="Line2D" parent="VoidRipple"]
visible = false
-points = PackedVector2Array(312, 447, 312, 484, 245, 486, 232, 422, 249, 421, 253, 17, 244, 17, 241, -51, 303, -51, 306, -21, 701, -20, 701, -47, 771, -47, 770, 16, 759, 17, 768, 425, 781, 425, 767, 485, 700, 485, 700, 449, 544, 446, 544, 462, 508, 460, 500, 431, 391, 431, 386, 460, 347, 464, 347, 447, 312, 447)
+points = PackedVector2Array(312, 440, 312, 480, 241, 479, 250, 417, 279, 417, 253, 17, 244, 17, 241, -51, 303, -51, 306, -21, 701, -20, 701, -47, 771, -47, 770, 16, 759, 17, 732, 418, 763, 419, 769, 482, 700, 481, 698, 441, 543, 441, 544, 454, 507, 454, 501, 439, 389, 439, 385, 452, 347, 452, 347, 440, 312, 440)
width = 5.0
[node name="Line2D2" type="Line2D" parent="VoidRipple"]
z_index = -1
-points = PackedVector2Array(312, 444, 312, 484, 245, 484, 241, 425, 253, 425, 253, 17, 244, 17, 241, -51, 303, -51, 306, -21, 701, -20, 701, -47, 771, -47, 767, 16, 750, 16, 758, 428, 775, 428, 767, 485, 700, 485, 700, 446, 544, 446, 545, 457, 508, 457, 500, 431, 391, 431, 386, 457, 348, 457, 348, 444, 312, 444)
+points = PackedVector2Array(312, 440, 312, 480, 241, 479, 250, 417, 279, 417, 253, 17, 244, 17, 241, -51, 303, -51, 306, -21, 701, -20, 701, -47, 771, -47, 770, 16, 759, 17, 732, 418, 763, 419, 769, 482, 700, 481, 698, 441, 543, 441, 544, 454, 507, 454, 501, 439, 389, 439, 385, 452, 347, 452, 347, 440, 312, 440)
width = 50.0
default_color = Color(0, 0, 0, 0.46666667)
joint_mode = 2
@@ -177,39 +180,77 @@ antialiased = true
[node name="RoomRegion" type="NavigationRegion2D" parent="."]
z_index = 1
-navigation_polygon = SubResource("NavigationPolygon_w7eqs")
+navigation_polygon = SubResource("NavigationPolygon_28dkg")
-[node name="TileMapLayer" type="TileMapLayer" parent="RoomRegion"]
-visible = false
-tile_map_data = PackedByteArray("AAAFAAIAAAAOAAEAAAAGAAIAAAAOAAEAAAAHAAIAAAAOAAEAAAAIAAIAAAAOAAEAAAAJAAIAAAAOAAEAAAAKAAIAAAAOAAEAAAAHAAEAAAAOAAEAAAAGAAEAAAAOAAEAAAAFAAEAAAAOAAEAAAAKAAEAAAAOAAEAAAAJAAEAAAAOAAEAAAAIAAEAAAAOAAEAAAALAAIAAAACAAUAAAALAAEAAAACAAUAAAAKAAAAAAAOAAEAAAAJAAAAAAAOAAEAAAAIAAAAAAAOAAEAAAAHAAAAAAAOAAEAAAAGAAAAAAAOAAEAAAAFAAAAAAAOAAEAAAALAAAAAAACAAUAAAAFAP//AAACAAQAAAAGAP//AAACAAQAAAAHAP//AAACAAQAAAAIAP//AAACAAQAAAAJAP//AAACAAQAAAAKAP//AAACAAQAAAALAP//AAABAAQAAAAEAP//AAAAAAQAAAAEAAAAAAACAAUAAAAEAAEAAAACAAUAAAAEAAIAAAACAAUAAAAEAAMAAAACAAUAAAAFAAMAAAAOAAEAAAAGAAMAAAAOAAEAAAAHAAMAAAAOAAEAAAAIAAMAAAAOAAEAAAAJAAMAAAAOAAEAAAAKAAMAAAAOAAEAAAALAAMAAAACAAUAAAAEAAQAAAAAAAUAAAAKAAQAAAACAAQAAAALAAQAAAABAAUAAAAFAAQAAAACAAQAAAAHAAQAAAAOAAEAAAAIAAQAAAACAAQAAAAGAAQAAAAOAAEAAAAJAAQAAAACAAQAAAA=")
-tile_set = ExtResource("1_qel1r")
-
-[node name="TileMapLayer2" type="TileMapLayer" parent="RoomRegion"]
-visible = false
-tile_map_data = PackedByteArray("AAANAAAAAAAKABEAAAAOAAAAAAAKABEAAAAPAAAAAAAKABEAAAAQAAAAAAAKABEAAAA=")
-tile_set = ExtResource("1_qel1r")
-
-[node name="Sprite2D" type="Sprite2D" parent="."]
+[node name="Base" type="Sprite2D" parent="."]
z_index = 1
-position = Vector2(497, 136)
-texture = ExtResource("11_4bidn")
+position = Vector2(505, 107)
+texture = ExtResource("6_lsfle")
+
+[node name="Area2D" type="Area2D" parent="."]
+z_index = 50
+position = Vector2(473, 427)
+script = ExtResource("7_o230c")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
+position = Vector2(130.5, -78.5)
+shape = SubResource("RectangleShape2D_a3e6t")
+
+[node name="CollisionShape2D2" type="CollisionShape2D" parent="Area2D"]
+position = Vector2(-127.25, -78.5)
+shape = SubResource("RectangleShape2D_lsfle")
+
+[node name="Front" type="Sprite2D" parent="Area2D"]
+z_index = 1
+position = Vector2(32, -86)
+texture = ExtResource("8_nfvtf")
[node name="Sprites" type="Node2D" parent="."]
-z_index = 2
+z_index = 20
y_sort_enabled = true
+[node name="Npc" type="CharacterBody2D" parent="Sprites"]
+z_index = 1
+position = Vector2(357, -27)
+script = ExtResource("8_nhrwr")
+metadata/_custom_type_script = "uid://bh54wpqgau8hc"
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Sprites/Npc"]
+position = Vector2(1, 16)
+rotation = 1.5707964
+shape = SubResource("CapsuleShape2D_l3mu1")
+
+[node name="Sprite2D" type="Sprite2D" parent="Sprites/Npc"]
+texture = ExtResource("9_4bidn")
+
+[node name="SpeechBubble" parent="Sprites/Npc" instance=ExtResource("10_6hdsl")]
+position = Vector2(44, -93)
+
+[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Sprites/Npc"]
+path_desired_distance = 30.0
+avoidance_enabled = true
+
[node name="Reception Desk" type="StaticBody2D" parent="Sprites"]
-position = Vector2(423, 103)
+position = Vector2(423, -4)
[node name="Sprite2D" type="Sprite2D" parent="Sprites/Reception Desk"]
+position = Vector2(0, 92)
texture = ExtResource("3_13vc8")
offset = Vector2(0, -80)
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Sprites/Reception Desk"]
-polygon = PackedVector2Array(-86, -160, -152, -160, -152, -107, -148, -75, -128, -35, -57, 0, 56, 0, 127, -34, 148, -75, 152, -107, 152, -160, 86, -160, 86, -115, 75, -93, 52, -81, -51, -81, -75, -92, -86, -114)
+position = Vector2(0, 92)
+polygon = PackedVector2Array(-41, -146, -105, -146, -106, -80, -85, -41, -31, -14, 31, -14, 87, -42, 107, -81, 106, -146, 41, -146, 40, -113, 27, -95, -27, -95, -41, -115)
+
+[node name="NavigationObstacle2D" type="NavigationObstacle2D" parent="Sprites/Reception Desk" groups=["room_obstacles"]]
+position = Vector2(0, 93)
+vertices = PackedVector2Array(-105, -146, -106, -80, -85, -41, -31, -14, 31, -14, 87, -42, 107, -81, 106, -146)
+affect_navigation_mesh = true
+carve_navigation_mesh = true
[node name="Receptionist" parent="Sprites" instance=ExtResource("5_l3mu1")]
-position = Vector2(492, 24)
+z_index = -1
+position = Vector2(424, 12)
[node name="Queue" parent="Sprites/Receptionist" index="3"]
position = Vector2(0, 97)
@@ -217,6 +258,7 @@ position = Vector2(0, 97)
[node name="Player" type="CharacterBody2D" parent="Sprites"]
position = Vector2(451, 430)
script = ExtResource("2_5n4iw")
+stop_range = 15.0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Sprites/Player"]
rotation = 1.5707964
@@ -230,34 +272,9 @@ texture = ExtResource("4_l3mu1")
path_desired_distance = 30.0
avoidance_enabled = true
-[node name="EntranceRegion" type="NavigationRegion2D" parent="."]
-position = Vector2(385, 374)
-navigation_polygon = SubResource("NavigationPolygon_l3mu1")
-
-[node name="Quest Board" parent="." instance=ExtResource("7_hph4e")]
+[node name="Quest Board" parent="Sprites" instance=ExtResource("7_hph4e")]
position = Vector2(654, -2)
-[node name="Npc" type="CharacterBody2D" parent="."]
-z_index = 2
-position = Vector2(347, 3)
-script = ExtResource("8_nhrwr")
-metadata/_custom_type_script = "uid://bh54wpqgau8hc"
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Npc"]
-position = Vector2(1, 16)
-rotation = 1.5707964
-shape = SubResource("CapsuleShape2D_l3mu1")
-
-[node name="Sprite2D" type="Sprite2D" parent="Npc"]
-texture = ExtResource("9_4bidn")
-
-[node name="SpeechBubble" parent="Npc" instance=ExtResource("10_6hdsl")]
-position = Vector2(44, -93)
-
-[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Npc"]
-path_desired_distance = 30.0
-avoidance_enabled = true
-
[node name="SubViewport" type="SubViewport" parent="."]
size = Vector2i(1920, 1080)
@@ -319,4 +336,7 @@ grow_vertical = 2
mouse_filter = 2
texture = ExtResource("16_b2pr6")
+[connection signal="body_entered" from="Area2D" to="Area2D" method="_on_body_entered"]
+[connection signal="body_exited" from="Area2D" to="Area2D" method="_on_body_exited"]
+
[editable path="Sprites/Receptionist"]
diff --git a/templates/move_marker.tscn b/templates/move_marker.tscn
new file mode 100644
index 0000000..056c78c
--- /dev/null
+++ b/templates/move_marker.tscn
@@ -0,0 +1,9 @@
+[gd_scene load_steps=2 format=3 uid="uid://dxh5efah45vtn"]
+
+[ext_resource type="Texture2D" uid="uid://bb827iikdiygx" path="res://graphics/move_marker.png" id="1_vy1qu"]
+
+[node name="Node2D" type="Node2D"]
+z_index = 10
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture = ExtResource("1_vy1qu")
diff --git a/templates/portrait.tscn b/templates/portrait.tscn
index 05b7bde..ad79819 100644
--- a/templates/portrait.tscn
+++ b/templates/portrait.tscn
@@ -1,29 +1,29 @@
[gd_scene load_steps=34 format=3 uid="uid://d4f8grsq0umdo"]
[ext_resource type="Script" uid="uid://m86jmtwv1a22" path="res://scripts/adventurer_portrait.gd" id="1_0hknt"]
-[ext_resource type="Script" uid="uid://cntcpe7ofdvyx" path="res://external/Test Portrait/test.gd" id="1_fcl1b"]
-[ext_resource type="Texture2D" uid="uid://dj6fagfp2sbrx" path="res://external/Test Portrait/Farmer_F/hat-bg.png" id="2_pek02"]
-[ext_resource type="Shader" uid="uid://cru1otvka0qn5" path="res://external/Test Portrait/variant_color.gdshader" id="3_b42dv"]
-[ext_resource type="Texture2D" uid="uid://can8npg0ufr3f" path="res://external/Test Portrait/Farmer_F/hair_bg.png" id="4_snu43"]
+[ext_resource type="Script" uid="uid://cntcpe7ofdvyx" path="res://external/test portrait/test.gd" id="1_fcl1b"]
+[ext_resource type="Texture2D" uid="uid://dj6fagfp2sbrx" path="res://external/test portrait/farmer_f/hat-bg.png" id="2_pek02"]
+[ext_resource type="Shader" uid="uid://cru1otvka0qn5" path="res://external/test portrait/variant_color.gdshader" id="3_b42dv"]
+[ext_resource type="Texture2D" uid="uid://can8npg0ufr3f" path="res://external/test portrait/farmer_f/hair_bg.png" id="4_snu43"]
[ext_resource type="Script" uid="uid://cdi0oxcug1hup" path="res://scripts/color_variant.gd" id="5_6ofx4"]
-[ext_resource type="Texture2D" uid="uid://crrd8mpcuync2" path="res://external/Test Portrait/Farmer_F/body.png" id="6_4lhir"]
-[ext_resource type="Material" uid="uid://btx1o4kx78cbx" path="res://external/Test Portrait/tri-skin.tres" id="7_ufq70"]
-[ext_resource type="Texture2D" uid="uid://dbdjaye6srxhx" path="res://external/Test Portrait/Farmer_F/head.png" id="8_n24t2"]
-[ext_resource type="Texture2D" uid="uid://cjs6gcaqkblxv" path="res://external/Test Portrait/gradients/skin/(c)brown.tres" id="8_x7qt0"]
-[ext_resource type="Texture2D" uid="uid://bq1mcdggw8ksg" path="res://external/Test Portrait/gradients/skin/(l)dark.tres" id="9_0hknt"]
-[ext_resource type="Texture2D" uid="uid://li44lgsa0ky" path="res://external/Test Portrait/Farmer_F/eyes_shadow.png" id="9_d4dbv"]
-[ext_resource type="Texture2D" uid="uid://x4e86o28672u" path="res://external/Test Portrait/Farmer_F/brow_shadow-2.png" id="10_8lmmt"]
-[ext_resource type="Texture2D" uid="uid://cru775pghpate" path="res://external/Test Portrait/Farmer_F/hair_fg_shadow.png" id="11_mrkia"]
-[ext_resource type="Texture2D" uid="uid://csp7xbtu0tpn7" path="res://external/Test Portrait/Farmer_F/eye-white-1.png" id="12_fa2yd"]
-[ext_resource type="Texture2D" uid="uid://mygmunn3voie" path="res://external/Test Portrait/Farmer_F/eyes-iris-1.png" id="14_36lkf"]
-[ext_resource type="Texture2D" uid="uid://wnkr20dtf734" path="res://external/Test Portrait/Farmer_F/eyes-lashes-1.png" id="15_n8rvo"]
-[ext_resource type="Texture2D" uid="uid://caow8dqiog7j4" path="res://external/Test Portrait/Farmer_F/ear.png" id="16_c5fh3"]
+[ext_resource type="Texture2D" uid="uid://crrd8mpcuync2" path="res://external/test portrait/farmer_f/body.png" id="6_4lhir"]
+[ext_resource type="Material" uid="uid://btx1o4kx78cbx" path="res://external/test portrait/tri-skin.tres" id="7_ufq70"]
+[ext_resource type="Texture2D" uid="uid://dbdjaye6srxhx" path="res://external/test portrait/farmer_f/head.png" id="8_n24t2"]
+[ext_resource type="Texture2D" uid="uid://cjs6gcaqkblxv" path="res://external/test portrait/gradients/skin/(c)brown.tres" id="8_x7qt0"]
+[ext_resource type="Texture2D" uid="uid://bq1mcdggw8ksg" path="res://external/test portrait/gradients/skin/(l)dark.tres" id="9_0hknt"]
+[ext_resource type="Texture2D" uid="uid://li44lgsa0ky" path="res://external/test portrait/farmer_f/eyes_shadow.png" id="9_d4dbv"]
+[ext_resource type="Texture2D" uid="uid://x4e86o28672u" path="res://external/test portrait/farmer_f/brow_shadow-2.png" id="10_8lmmt"]
+[ext_resource type="Texture2D" uid="uid://cru775pghpate" path="res://external/test portrait/farmer_f/hair_fg_shadow.png" id="11_mrkia"]
+[ext_resource type="Texture2D" uid="uid://csp7xbtu0tpn7" path="res://external/test portrait/farmer_f/eye-white-1.png" id="12_fa2yd"]
+[ext_resource type="Texture2D" uid="uid://mygmunn3voie" path="res://external/test portrait/farmer_f/eyes-iris-1.png" id="14_36lkf"]
+[ext_resource type="Texture2D" uid="uid://wnkr20dtf734" path="res://external/test portrait/farmer_f/eyes-lashes-1.png" id="15_n8rvo"]
+[ext_resource type="Texture2D" uid="uid://caow8dqiog7j4" path="res://external/test portrait/farmer_f/ear.png" id="16_c5fh3"]
[ext_resource type="Texture2D" uid="uid://0dwdi7m62trg" path="res://external/test portrait/gradients/hair/(c)red.tres" id="17_ds2dq"]
-[ext_resource type="Texture2D" uid="uid://vt17lekvchdg" path="res://external/Test Portrait/Farmer_F/hair_fg.png" id="17_vd0s3"]
-[ext_resource type="Texture2D" uid="uid://dyeu4kwwnxjn5" path="res://external/Test Portrait/Farmer_F/hat_fg.png" id="18_ad0yo"]
+[ext_resource type="Texture2D" uid="uid://vt17lekvchdg" path="res://external/test portrait/farmer_f/hair_fg.png" id="17_vd0s3"]
+[ext_resource type="Texture2D" uid="uid://dyeu4kwwnxjn5" path="res://external/test portrait/farmer_f/hat_fg.png" id="18_ad0yo"]
[ext_resource type="Texture2D" uid="uid://bqmnbsxgbrcpw" path="res://external/test portrait/gradients/hair/(l)red.tres" id="18_yxc1x"]
-[ext_resource type="Texture2D" uid="uid://brmta1rtiau4a" path="res://external/Test Portrait/Farmer_F/brows-2.png" id="19_oxjqg"]
-[ext_resource type="Texture2D" uid="uid://c3wwe6r000gpq" path="res://external/Test Portrait/Farmer_F/composite.png" id="25_e6f65"]
+[ext_resource type="Texture2D" uid="uid://brmta1rtiau4a" path="res://external/test portrait/farmer_f/brows-2.png" id="19_oxjqg"]
+[ext_resource type="Texture2D" uid="uid://c3wwe6r000gpq" path="res://external/test portrait/farmer_f/composite.png" id="25_e6f65"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_6ofx4"]
shader = ExtResource("3_b42dv")
diff --git a/templates/portrait_customizer.tscn b/templates/portrait_customizer.tscn
new file mode 100644
index 0000000..c23be89
--- /dev/null
+++ b/templates/portrait_customizer.tscn
@@ -0,0 +1,9 @@
+[gd_scene format=3 uid="uid://dno0a4457twd4"]
+
+[node name="Portrait Customizer" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
diff --git a/templates/profile_popup.tscn b/templates/profile_popup.tscn
index dd992d4..590d37d 100644
--- a/templates/profile_popup.tscn
+++ b/templates/profile_popup.tscn
@@ -6,6 +6,7 @@
[ext_resource type="Texture2D" uid="uid://bblr27slj6ap0" path="res://graphics/portraits/farmer_f.png" id="4_ileh1"]
[node name="Profile Popup" type="Control"]
+z_index = 200
layout_mode = 3
offset_top = -99.0
offset_bottom = -99.0
diff --git a/templates/quest_board.tscn b/templates/quest_board.tscn
index 37cfd68..6a26aaa 100644
--- a/templates/quest_board.tscn
+++ b/templates/quest_board.tscn
@@ -8,7 +8,7 @@
[sub_resource type="BlackboardPlan" id="BlackboardPlan_2xphb"]
-[node name="Quest Board" type="StaticBody2D"]
+[node name="Quest Board" type="StaticBody2D" groups=["room_obstacles"]]
script = ExtResource("1_38mwx")
[node name="QuestBoardWindow" parent="." instance=ExtResource("1_4poi3")]
diff --git a/templates/shift_cycle.tscn b/templates/shift_cycle.tscn
new file mode 100644
index 0000000..b2d889b
--- /dev/null
+++ b/templates/shift_cycle.tscn
@@ -0,0 +1,126 @@
+[gd_scene load_steps=6 format=3 uid="uid://ctbg44spnjbsa"]
+
+[ext_resource type="Script" uid="uid://cuds3hklcm5m5" path="res://scripts/shift_cycle.gd" id="1_rjfcf"]
+[ext_resource type="AudioStream" uid="uid://dq7e5u8j14atb" path="res://sounds/Paper Turn.wav" id="2_04j74"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rxjlm"]
+content_margin_left = 0.0
+content_margin_top = 0.0
+content_margin_right = 0.0
+content_margin_bottom = 0.0
+bg_color = Color(1, 1, 1, 1)
+corner_radius_top_left = 3
+corner_radius_top_right = 3
+corner_radius_bottom_right = 3
+corner_radius_bottom_left = 3
+corner_detail = 5
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rjfcf"]
+content_margin_left = 0.0
+content_margin_top = 0.0
+content_margin_right = 0.0
+content_margin_bottom = 0.0
+bg_color = Color(0.76, 0.589, 0.418, 1)
+corner_radius_top_left = 3
+corner_radius_top_right = 3
+corner_radius_bottom_right = 3
+corner_radius_bottom_left = 3
+corner_detail = 5
+
+[sub_resource type="StyleBoxLine" id="StyleBoxLine_cpouh"]
+content_margin_left = 1.0
+content_margin_top = 1.0
+content_margin_right = 1.0
+content_margin_bottom = 1.0
+color = Color(0.46779883, 0.3432355, 0.19989973, 1)
+grow_begin = 300.0
+grow_end = 202.0
+thickness = 3
+
+[node name="ShiftCycle" type="Control"]
+custom_minimum_size = Vector2(700, 111)
+layout_mode = 3
+offset_right = 700.0
+offset_bottom = 111.0
+script = ExtResource("1_rjfcf")
+
+[node name="Shadow" type="Panel" parent="."]
+unique_name_in_owner = true
+modulate = Color(0, 0, 0, 0.44313726)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_rxjlm")
+
+[node name="PanelContainer" type="PanelContainer" parent="."]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(700, 111)
+layout_mode = 0
+offset_right = 700.0
+offset_bottom = 111.0
+mouse_filter = 1
+theme_override_styles/panel = SubResource("StyleBoxFlat_rjfcf")
+
+[node name="Contents" type="VBoxContainer" parent="PanelContainer"]
+layout_mode = 2
+mouse_filter = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/Contents"]
+custom_minimum_size = Vector2(200, 0)
+layout_mode = 2
+mouse_filter = 2
+
+[node name="Label" type="Label" parent="PanelContainer/Contents/HBoxContainer"]
+custom_minimum_size = Vector2(600, 50)
+layout_mode = 2
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/font_size = 32
+text = "WORK SHIFT"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="WorkingEdit" type="TextEdit" parent="PanelContainer/Contents/HBoxContainer"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(65, 50)
+layout_mode = 2
+mouse_behavior_recursive = 2
+theme_override_font_sizes/font_size = 32
+placeholder_text = "25"
+
+[node name="VSeparator" type="VSeparator" parent="PanelContainer/Contents"]
+layout_mode = 2
+theme_override_styles/separator = SubResource("StyleBoxLine_cpouh")
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/Contents"]
+custom_minimum_size = Vector2(200, 0)
+layout_mode = 2
+mouse_filter = 2
+
+[node name="Label" type="Label" parent="PanelContainer/Contents/HBoxContainer2"]
+custom_minimum_size = Vector2(600, 50)
+layout_mode = 2
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/font_size = 32
+text = "OPEN SHIFT"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="OpenEdit" type="TextEdit" parent="PanelContainer/Contents/HBoxContainer2"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(65, 50)
+layout_mode = 2
+mouse_behavior_recursive = 2
+theme_override_font_sizes/font_size = 32
+placeholder_text = "5"
+
+[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
+stream = ExtResource("2_04j74")
+volume_db = -12.29
+
+[connection signal="text_changed" from="PanelContainer/Contents/HBoxContainer/WorkingEdit" to="." method="_on_working_edit_text_changed"]
+[connection signal="text_changed" from="PanelContainer/Contents/HBoxContainer2/OpenEdit" to="PanelContainer" method="_on_open_edit_text_changed"]
+[connection signal="text_set" from="PanelContainer/Contents/HBoxContainer2/OpenEdit" to="PanelContainer" method="_on_open_edit_text_set"]