From d705ed0496c763f71eb9d20d49850ec1f648fa46 Mon Sep 17 00:00:00 2001 From: Bo Thompson Date: Wed, 6 Aug 2025 04:17:27 -0400 Subject: [PATCH] More work on taking quests --- adventurer.gd | 29 +--------- guildhall.tscn | 16 +++--- member_panel_entry.gd | 4 +- npc.gd | 31 +++++++++++ npc.gd.uid | 1 + person.gd | 1 + person.gd.uid | 1 + player.gd | 6 ++- quest.gd | 22 ++++++-- quest_board.gd | 1 + quest_board_entry.gd | 13 +++-- quest_board_entry.tscn | 5 +- quest_board_window.gd | 8 +-- quest_board_window.tscn | 12 ++++- quest_log.gd | 1 - quest_log_entry.gd | 4 ++ quest_window.gd | 36 +++++++++++++ quest_window.gd.uid | 1 + quest_window.tscn | 116 ++++++++++++++++++++++++++++++++++++++++ test_scene.gd | 4 +- top_menu.gd | 12 ++++- top_menu.tscn | 18 ++----- 22 files changed, 270 insertions(+), 72 deletions(-) create mode 100644 npc.gd create mode 100644 npc.gd.uid create mode 100644 person.gd create mode 100644 person.gd.uid create mode 100644 quest_window.gd create mode 100644 quest_window.gd.uid create mode 100644 quest_window.tscn diff --git a/adventurer.gd b/adventurer.gd index 7ef52eb..1b48c58 100644 --- a/adventurer.gd +++ b/adventurer.gd @@ -1,33 +1,6 @@ -class_name Adventurer extends CharacterBody2D +class_name Adventurer extends Npc -const popup_template = preload("res://profile_popup.tscn") -var profile_popup -@onready var bt_player : BTPlayer = $BTPlayer -@export var movement_speed : float = 400.0 -@onready var movement_target_position : Vector2 = global_position -@onready var nav_agent : NavigationAgent2D = $NavigationAgent2D - -var data : AdventurerData = null -var interaction_target = null -var last_position : Vector2 = Vector2.ZERO -var stuck : bool = false -var stuck_time_remaining : float = 0 -var busy : bool = false -var _activity : String = "" -var activity : String : - get: - return _activity - set(value): - _activity = value - if profile_popup: - profile_popup.change_activity(_activity) -@onready var bubble : SpeechBubble = $SpeechBubble -@export var interaction_range : float = 75 -@export var stop_range : float = 25 - -signal navigation_finished() -signal navigation_failed() func _ready() -> void: nav_agent.navigation_finished.connect(_on_nav_agent_finished) diff --git a/guildhall.tscn b/guildhall.tscn index b37e7f6..0b0476c 100644 --- a/guildhall.tscn +++ b/guildhall.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=4 uid="uid://cd08dp16bixfv"] +[gd_scene load_steps=14 format=4 uid="uid://cd08dp16bixfv"] [ext_resource type="Script" uid="uid://ccorfvcfa84gf" path="res://guildhall.gd" id="1_lsinl"] [ext_resource type="TileSet" uid="uid://6im0g3eg6sr4" path="res://test_tiles.tres" id="1_qel1r"] @@ -7,7 +7,9 @@ [ext_resource type="Texture2D" uid="uid://cg6ptmynq0aq0" path="res://basic-sprite.png" id="4_l3mu1"] [ext_resource type="PackedScene" uid="uid://cf6nnjyp8kv78" path="res://receptionist.tscn" id="5_l3mu1"] [ext_resource type="Texture2D" uid="uid://bnt2dlv7kxw7s" path="res://questboard.png" id="6_2wofw"] +[ext_resource type="Script" uid="uid://blo7tb5135vfm" path="res://quest_board.gd" id="7_bog1h"] [ext_resource type="Script" uid="uid://b0q2233msdtgo" path="res://guild_queue.gd" id="7_hph4e"] +[ext_resource type="PackedScene" uid="uid://drrtypncppjps" path="res://quest_board_window.tscn" id="8_uo85v"] [sub_resource type="NavigationPolygon" id="NavigationPolygon_w7eqs"] vertices = PackedVector2Array(591.3203, 170.54688, 591.3125, 170.53906, 614.1094, 159.47656, 694.9531, 80.92969, 694.9375, 80.921875, 702.6406, 67, 1053, 67, 1053, 605, 665.27344, 134.64063, 35, 605, 578.35156, 176.85938, 512.60156, 177.99219, 445.89844, 179.14063, 35, 35, 432.14063, 172.14844, 432.14063, 172.14063, 406.6172, 159.21875, 368.17188, 139.71875, 368.17188, 139.71094, 357.59375, 134.42969, 326.3125, 77.5625, 324.82813, 35, 325.8828, 65.21875) @@ -25,10 +27,6 @@ vertices = PackedVector2Array(117.96875, 286, 9.96875, 286, 9.03125, 0, 117.0312 polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3)]) outlines = Array[PackedVector2Array]([PackedVector2Array(-1, -10, 127, -10, 128, 296, 0, 296)]) -[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_hph4e"] -radius = 25.0 -height = 282.0 - [node name="Guildhall" type="Node2D"] script = ExtResource("1_lsinl") @@ -85,14 +83,18 @@ navigation_polygon = SubResource("NavigationPolygon_l3mu1") [node name="Quest Board" type="StaticBody2D" parent="."] position = Vector2(935, 32) +script = ExtResource("7_bog1h") + +[node name="QuestBoardWindow" parent="Quest Board" instance=ExtResource("8_uo85v")] [node name="Sprite2D" type="Sprite2D" parent="Quest Board"] position = Vector2(0, -64) texture = ExtResource("6_2wofw") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Quest Board"] +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Quest Board"] +position = Vector2(-1, 11) rotation = 1.5707964 -shape = SubResource("CapsuleShape2D_hph4e") +polygon = PackedVector2Array(-39.999996, 128, -26.999994, 139, -3.9999943, 139, 12.000006, 129, 13.999994, -127, -7.6293945e-06, -140, -30.000008, -140, -43.000008, -126) [node name="Queue" type="Node2D" parent="Quest Board"] position = Vector2(-12, 44) diff --git a/member_panel_entry.gd b/member_panel_entry.gd index f721c24..659c834 100644 --- a/member_panel_entry.gd +++ b/member_panel_entry.gd @@ -18,8 +18,8 @@ func enable(en: bool) -> void: else: mouse_filter=Control.MOUSE_FILTER_IGNORE -func setup(adv : AdventurerData) -> void: - data = adv +func setup(member : AdventurerData) -> void: + data = member %NameLabel.text = data.given_name + " " + data.surname %LevelLabel.text = str(data.level) if data.job: diff --git a/npc.gd b/npc.gd new file mode 100644 index 0000000..0529149 --- /dev/null +++ b/npc.gd @@ -0,0 +1,31 @@ +class_name Npc extends Person + +const popup_template = preload("res://profile_popup.tscn") +var profile_popup + +@export var is_player : bool = false +@onready var bt_player : BTPlayer = $BTPlayer +@export var movement_speed : float = 400.0 +@onready var movement_target_position : Vector2 = global_position +@onready var nav_agent : NavigationAgent2D = $NavigationAgent2D + +var data : AdventurerData = null +var interaction_target = null +var last_position : Vector2 = Vector2.ZERO +var stuck : bool = false +var stuck_time_remaining : float = 0 +var busy : bool = false +var _activity : String = "" +var activity : String : + get: + return _activity + set(value): + _activity = value + if profile_popup: + profile_popup.change_activity(_activity) +@onready var bubble : SpeechBubble = $SpeechBubble +@export var interaction_range : float = 75 +@export var stop_range : float = 25 + +signal navigation_finished() +signal navigation_failed() diff --git a/npc.gd.uid b/npc.gd.uid new file mode 100644 index 0000000..0a34131 --- /dev/null +++ b/npc.gd.uid @@ -0,0 +1 @@ +uid://bh54wpqgau8hc diff --git a/person.gd b/person.gd new file mode 100644 index 0000000..3b1d7f4 --- /dev/null +++ b/person.gd @@ -0,0 +1 @@ +class_name Person extends CharacterBody2D diff --git a/person.gd.uid b/person.gd.uid new file mode 100644 index 0000000..a01b85c --- /dev/null +++ b/person.gd.uid @@ -0,0 +1 @@ +uid://cr3kvsepqabgt diff --git a/player.gd b/player.gd index 2cf8b26..7f02396 100644 --- a/player.gd +++ b/player.gd @@ -1,4 +1,4 @@ -class_name Player extends CharacterBody2D +class_name Player extends Person @onready var movement_speed : float = 400.0 @onready var movement_target_position : Vector2 = global_position @@ -7,8 +7,12 @@ class_name Player extends CharacterBody2D var interaction_target = null @export var interaction_range : float = 75 @export var stop_range : float = 25 +var data : AdventurerData + func _ready() -> void: Game.player = self + data = AdventurerData.new() + data.name = "Player" setup.call_deferred() diff --git a/quest.gd b/quest.gd index 4fea093..fdce65b 100644 --- a/quest.gd +++ b/quest.gd @@ -1,6 +1,12 @@ class_name Quest extends Object - + +enum Status{ + OPEN, + TAKEN, + IN_PROGRESS, + COMPLETED +} var name : String = "A Basic Quest" @@ -20,9 +26,19 @@ var current_step : int = 0 var taken : bool = false var questor : AdventurerData = null -var entry : QuestLogEntry = null +signal status_changed(status : Status) func initiate(member : AdventurerData) -> void: questor = member taken = true - entry.update() + status_changed.emit(Status.TAKEN) + +func difficulty_name() -> String: + match(difficulty): + 0: return "None" + 1: return "Trivial" + 2: return "Moderate" + 3: return "Severe" + 4: return "Extreme" + 5: return "Legendary" + _: return "Unknown" diff --git a/quest_board.gd b/quest_board.gd index e0e3fb5..ef0b7e1 100644 --- a/quest_board.gd +++ b/quest_board.gd @@ -1,5 +1,6 @@ class_name QuestBoard extends Interactable + @onready var polygon : CollisionPolygon2D = $CollisionPolygon2D @onready var window : QuestBoardWindow = $QuestBoardWindow diff --git a/quest_board_entry.gd b/quest_board_entry.gd index 80e0b11..c8be1d7 100644 --- a/quest_board_entry.gd +++ b/quest_board_entry.gd @@ -1,7 +1,9 @@ -class_name QuestBoardEntry extends TextureButton +class_name QuestBoardEntry extends Button + +const quest_window_template = preload("res://quest_window.tscn") var quest : Quest = null -@onready var icon : TextureRect = %Icon +@onready var tex_icon : TextureRect = %Icon @onready var name_label : Label = %NameLabel @onready var status_label : Label = %StatusLabel @@ -15,5 +17,8 @@ func update() -> void: func _on_pressed() -> void: - if pressed: - Guild.assign_quest(player.member, quest) + var window = quest_window_template.instantiate() + window.setup(quest, true) + add_child(window) + window.popup_centered() + diff --git a/quest_board_entry.tscn b/quest_board_entry.tscn index 3e0aa52..39bdf32 100644 --- a/quest_board_entry.tscn +++ b/quest_board_entry.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://hsks1qah12sh" path="res://quest_board_entry.gd" id="1_qfdrh"] [ext_resource type="Texture2D" uid="uid://bldpiytpdrge6" path="res://icon.svg" id="2_ovx2i"] -[node name="QuestBoardEntry" type="TextureButton"] +[node name="QuestBoardEntry" type="Button"] custom_minimum_size = Vector2(200, 50) offset_right = 200.0 offset_bottom = 50.0 @@ -13,16 +13,19 @@ script = ExtResource("1_qfdrh") layout_mode = 0 offset_right = 40.0 offset_bottom = 40.0 +mouse_filter = 2 [node name="Icon" type="TextureRect" parent="HBoxContainer"] unique_name_in_owner = true custom_minimum_size = Vector2(50, 50) layout_mode = 2 +mouse_filter = 2 texture = ExtResource("2_ovx2i") expand_mode = 1 [node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] layout_mode = 2 +mouse_filter = 2 [node name="NameLabel" type="Label" parent="HBoxContainer/VBoxContainer"] unique_name_in_owner = true diff --git a/quest_board_window.gd b/quest_board_window.gd index 075d1bf..4608c78 100644 --- a/quest_board_window.gd +++ b/quest_board_window.gd @@ -1,9 +1,9 @@ -class_name QuestBoardWindow extends Window +class_name QuestBoardWindow extends Popup -const entry_template = preload("res://quest_log_entry.tscn") +const entry_template = preload("res://quest_board_entry.tscn") @onready var entry_list : VBoxContainer = %Entries -var entries : Array[QuestLogEntry] = [] +var entries : Array[QuestBoardEntry] = [] func populate(quests : Array[Quest]) -> void: for entry in entries: @@ -14,7 +14,7 @@ func populate(quests : Array[Quest]) -> void: add_entry(quest) func add_entry(quest : Quest) -> void: - var qle : QuestLogEntry = entry_template.instantiate() + var qle : QuestBoardEntry = entry_template.instantiate() entries.append(qle) entry_list.add_child(qle) qle.setup(quest) diff --git a/quest_board_window.tscn b/quest_board_window.tscn index d9bf545..3835503 100644 --- a/quest_board_window.tscn +++ b/quest_board_window.tscn @@ -2,19 +2,25 @@ [ext_resource type="Script" uid="uid://de4lnikqqk7b4" path="res://quest_board_window.gd" id="1_0tsne"] -[node name="QuestBoardWindow" type="Window"] +[node name="QuestBoardWindow" type="PopupPanel"] +handle_input_locally = false oversampling_override = 1.0 title = "Quest Board" size = Vector2i(231, 282) -popup_window = true +visible = true script = ExtResource("1_0tsne") [node name="MarginContainer" type="MarginContainer" parent="."] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +offset_left = 4.0 +offset_top = 4.0 +offset_right = -4.0 +offset_bottom = -4.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 theme_override_constants/margin_left = 5 theme_override_constants/margin_top = 5 theme_override_constants/margin_right = 5 @@ -23,9 +29,11 @@ theme_override_constants/margin_bottom = 5 [node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer"] custom_minimum_size = Vector2(205, 215) layout_mode = 2 +mouse_filter = 2 [node name="Entries" type="VBoxContainer" parent="MarginContainer/ScrollContainer"] unique_name_in_owner = true layout_mode = 2 +mouse_filter = 2 [connection signal="close_requested" from="." to="." method="_on_close_requested"] diff --git a/quest_log.gd b/quest_log.gd index ae92ec2..977542d 100644 --- a/quest_log.gd +++ b/quest_log.gd @@ -10,7 +10,6 @@ func _ready() -> void: func add_entry(quest : Quest) -> void: var qle : QuestLogEntry = entry_template.instantiate() - quest.entry = qle entries.append(qle) entry_list.add_child(qle) qle.setup(quest) diff --git a/quest_log_entry.gd b/quest_log_entry.gd index bf89990..7a49c65 100644 --- a/quest_log_entry.gd +++ b/quest_log_entry.gd @@ -9,6 +9,10 @@ func setup(quest : Quest) -> void: self.quest = quest name_label.text = quest.name status_label.text = "Available" if !quest.taken else "Unavailable" + quest.status_changed.connect(_on_quest_status_changed) func update() -> void: status_label.text = "Available" if !quest.taken else "Unavailable" + +func _on_quest_status_changed(status : Quest.Status) -> void: + update() diff --git a/quest_window.gd b/quest_window.gd new file mode 100644 index 0000000..f2d9fe8 --- /dev/null +++ b/quest_window.gd @@ -0,0 +1,36 @@ +extends Window + +var quest : Quest + +func setup(qst : Quest, board : bool) -> void: + quest = qst + quest.status_changed.connect(_on_quest_status_changed) + %NameField.text = quest.name + %DifficultyField.text = quest.difficulty_name() + %LocationField.text = quest.location + if !board: + %AcceptButton.hide() + + if quest.taken: + %StatusField.text = "Taken" + %AcceptButton.disabled = true + else: + %StatusField.text = "OPEN" + %AcceptButton.disabled = false + + +func _on_quest_status_changed(status : Quest.Status) -> void: + if status == Quest.Status.COMPLETED: + queue_free() + if quest.taken: + %StatusField.text = "Taken" + %AcceptButton.disabled = true + else: + %StatusField.text = "OPEN" + %AcceptButton.disabled = false + +func _on_accept_pressed() -> void: + Guild.assign_quest(Game.player.data, quest) + +func _on_close_button_pressed() -> void: + queue_free() diff --git a/quest_window.gd.uid b/quest_window.gd.uid new file mode 100644 index 0000000..20b5bd7 --- /dev/null +++ b/quest_window.gd.uid @@ -0,0 +1 @@ +uid://b3flxu0sduc1 diff --git a/quest_window.tscn b/quest_window.tscn new file mode 100644 index 0000000..92093f0 --- /dev/null +++ b/quest_window.tscn @@ -0,0 +1,116 @@ +[gd_scene load_steps=3 format=3 uid="uid://ba2wunbmxgevl"] + +[ext_resource type="Script" uid="uid://b3flxu0sduc1" path="res://quest_window.gd" id="1_qk27i"] +[ext_resource type="Texture2D" uid="uid://bldpiytpdrge6" path="res://icon.svg" id="2_bctmf"] + +[node name="QuestWindow" type="Popup"] +oversampling_override = 1.0 +size = Vector2i(500, 655) +visible = true +exclusive = true +script = ExtResource("1_qk27i") + +[node name="PostQuest" type="VBoxContainer" parent="."] +unique_name_in_owner = true + +[node name="HBoxContainer2" type="HBoxContainer" parent="PostQuest"] +layout_mode = 2 + +[node name="TextureRect" type="TextureRect" parent="PostQuest/HBoxContainer2"] +layout_mode = 2 +texture = ExtResource("2_bctmf") + +[node name="VBoxContainer" type="VBoxContainer" parent="PostQuest/HBoxContainer2"] +layout_mode = 2 + +[node name="Label" type="Label" parent="PostQuest/HBoxContainer2/VBoxContainer"] +layout_mode = 2 +text = "Quest Name" + +[node name="NameField" type="Label" parent="PostQuest/HBoxContainer2/VBoxContainer"] +unique_name_in_owner = true +modulate = Color(0.7204674, 0.7204675, 0.7204674, 1) +custom_minimum_size = Vector2(365, 35) +layout_mode = 2 +size_flags_vertical = 3 +text = "A Simple Task" + +[node name="Label2" type="Label" parent="PostQuest/HBoxContainer2/VBoxContainer"] +layout_mode = 2 +text = "Difficulty" + +[node name="DifficultyField" type="Label" parent="PostQuest/HBoxContainer2/VBoxContainer"] +unique_name_in_owner = true +modulate = Color(0.7204674, 0.7204675, 0.7204674, 1) +custom_minimum_size = Vector2(365, 35) +layout_mode = 2 +size_flags_vertical = 3 +text = "Trivial" + +[node name="Label3" type="Label" parent="PostQuest"] +layout_mode = 2 +text = "Location" + +[node name="LocationField" type="Label" parent="PostQuest"] +unique_name_in_owner = true +modulate = Color(0.72156864, 0.72156864, 0.72156864, 1) +custom_minimum_size = Vector2(480, 35) +layout_mode = 2 +size_flags_vertical = 3 +text = "Nestor Woods" + +[node name="Label4" type="Label" parent="PostQuest"] +layout_mode = 2 +text = "Reward" + +[node name="RewardField" type="TextEdit" parent="PostQuest"] +unique_name_in_owner = true +modulate = Color(0.7204674, 0.7204675, 0.7204674, 1) +custom_minimum_size = Vector2(480, 300) +layout_mode = 2 +size_flags_vertical = 3 +text = "Reward" +editable = false +context_menu_enabled = false +emoji_menu_enabled = false +shortcut_keys_enabled = false +selecting_enabled = false +deselect_on_focus_loss_enabled = false +drag_and_drop_selection_enabled = false +virtual_keyboard_enabled = false +virtual_keyboard_show_on_focus = false +middle_mouse_paste_enabled = false +empty_selection_clipboard_enabled = false +tab_input_mode = false +use_default_word_separators = false + +[node name="Label5" type="Label" parent="PostQuest"] +layout_mode = 2 +text = "Status" + +[node name="StatusField" type="Label" parent="PostQuest"] +unique_name_in_owner = true +modulate = Color(0.7204674, 0.7204675, 0.7204674, 1) +custom_minimum_size = Vector2(480, 35) +layout_mode = 2 +size_flags_vertical = 3 +text = "(Status here)" + +[node name="OptionsList" type="HBoxContainer" parent="PostQuest"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="AcceptButton" type="Button" parent="PostQuest/OptionsList"] +unique_name_in_owner = true +custom_minimum_size = Vector2(248, 60) +layout_mode = 2 +text = "ACCEPT" + +[node name="CloseButton" type="Button" parent="PostQuest/OptionsList"] +unique_name_in_owner = true +custom_minimum_size = Vector2(248, 60) +layout_mode = 2 +text = "CLOSE" + +[connection signal="pressed" from="PostQuest/OptionsList/AcceptButton" to="." method="_on_accept_pressed"] +[connection signal="pressed" from="PostQuest/OptionsList/CloseButton" to="." method="_on_close_button_pressed"] diff --git a/test_scene.gd b/test_scene.gd index 1d04e52..3e1ce0c 100644 --- a/test_scene.gd +++ b/test_scene.gd @@ -2,7 +2,7 @@ extends Node2D var test_adv = preload("res://test_adventurer.tscn") func _ready() -> void: - var adv : AdventurerData = test_adv.instantiate() as AdventurerData - Guild.register_guild_member(adv) + #var adv : AdventurerData = test_adv.instantiate() as AdventurerData + #Guild.register_guild_member(adv) var quest : Quest = Quest.new() Guild.add_quest(quest) diff --git a/top_menu.gd b/top_menu.gd index e16bd88..ca3e7ea 100644 --- a/top_menu.gd +++ b/top_menu.gd @@ -9,20 +9,28 @@ const quest_panel_entry_template = preload("res://quest_panel_entry.tscn") @onready var quests = %Quests func _ready() -> void: Game.top_menu = self + +func hide_submenus() -> void: + members.visible = false + quests.visible = false func _on_members_button_pressed() -> void: + if !members.visible: + hide_submenus() members.visible = !members.visible for child in members_list.get_children(): child.enabled = members.visible func _on_quests_button_pressed() -> void: + if !quests.visible: + hide_submenus() quests.visible = !quests.visible for child in quest_list.get_children(): child.enabled = quests.visible -func add_member(data : AdventurerData) -> void: +func add_member(member : AdventurerData) -> void: var entry = member_panel_entry_template.instantiate() - entry.setup(data) + entry.setup(member) members_list.add_child(entry) func add_quest(quest : Quest) -> void: diff --git a/top_menu.tscn b/top_menu.tscn index 7ac8057..c87cec7 100644 --- a/top_menu.tscn +++ b/top_menu.tscn @@ -24,6 +24,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 script = ExtResource("1_o3fau") [node name="Menu" type="Control" parent="."] @@ -74,9 +75,9 @@ texture_hover = ExtResource("6_8h6j7") unique_name_in_owner = true visible = false anchors_preset = 0 -offset_top = 53.0 +offset_top = 109.0 offset_right = 40.0 -offset_bottom = 93.0 +offset_bottom = 149.0 [node name="Panel" type="PanelContainer" parent="Members"] layout_mode = 0 @@ -143,19 +144,6 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("9_ehkcg") -[node name="ColorRect" type="ColorRect" parent="GenerateQuestDialog"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -4.0 -offset_top = 9.0 -offset_right = -4.0 -offset_bottom = 9.0 -grow_horizontal = 2 -grow_vertical = 2 -color = Color(0, 0, 0, 0.42745098) - [node name="Window" type="PanelContainer" parent="GenerateQuestDialog"] layout_mode = 1 anchors_preset = 8