More work on taking quests

This commit is contained in:
2025-08-06 04:17:27 -04:00
parent 2c99ece532
commit d705ed0496
22 changed files with 270 additions and 72 deletions

View File

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

View File

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

View File

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

31
npc.gd Normal file
View File

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

1
npc.gd.uid Normal file
View File

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

1
person.gd Normal file
View File

@@ -0,0 +1 @@
class_name Person extends CharacterBody2D

1
person.gd.uid Normal file
View File

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

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
class_name QuestBoard extends Interactable
@onready var polygon : CollisionPolygon2D = $CollisionPolygon2D
@onready var window : QuestBoardWindow = $QuestBoardWindow

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

36
quest_window.gd Normal file
View File

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

1
quest_window.gd.uid Normal file
View File

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

116
quest_window.tscn Normal file
View File

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

View File

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

View File

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

View File

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