Restructured files and worked on more complex quest progression
This commit is contained in:
1
data/items/accessory.gd
Normal file
1
data/items/accessory.gd
Normal file
@@ -0,0 +1 @@
|
||||
extends Equipment
|
||||
1
data/items/accessory.gd.uid
Normal file
1
data/items/accessory.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cgj83ykwblo6h
|
||||
1
data/items/armor.gd
Normal file
1
data/items/armor.gd
Normal file
@@ -0,0 +1 @@
|
||||
extends Equipment
|
||||
1
data/items/armor.gd.uid
Normal file
1
data/items/armor.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://br7m0m1b3pt7u
|
||||
1
data/items/blueprint.gd
Normal file
1
data/items/blueprint.gd
Normal file
@@ -0,0 +1 @@
|
||||
extends Item
|
||||
1
data/items/blueprint.gd.uid
Normal file
1
data/items/blueprint.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bsacg2p5p52i6
|
||||
1
data/items/consumable.gd
Normal file
1
data/items/consumable.gd
Normal file
@@ -0,0 +1 @@
|
||||
class_name Consumable extends Item
|
||||
1
data/items/consumable.gd.uid
Normal file
1
data/items/consumable.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://u4b5geefms0g
|
||||
1
data/items/equipment.gd
Normal file
1
data/items/equipment.gd
Normal file
@@ -0,0 +1 @@
|
||||
class_name Equipment extends Item
|
||||
1
data/items/equipment.gd.uid
Normal file
1
data/items/equipment.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://8rqg7oxmunog
|
||||
1
data/items/item.gd
Normal file
1
data/items/item.gd
Normal file
@@ -0,0 +1 @@
|
||||
class_name Item extends Object
|
||||
1
data/items/item.gd.uid
Normal file
1
data/items/item.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dir7x2m1stwg2
|
||||
1
data/items/recipe.gd
Normal file
1
data/items/recipe.gd
Normal file
@@ -0,0 +1 @@
|
||||
extends Item
|
||||
1
data/items/recipe.gd.uid
Normal file
1
data/items/recipe.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dng2w33raj38l
|
||||
1
data/items/resource.gd
Normal file
1
data/items/resource.gd
Normal file
@@ -0,0 +1 @@
|
||||
extends Item
|
||||
1
data/items/resource.gd.uid
Normal file
1
data/items/resource.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cjbonsakj28qs
|
||||
1
data/items/weapon.gd
Normal file
1
data/items/weapon.gd
Normal file
@@ -0,0 +1 @@
|
||||
extends Equipment
|
||||
1
data/items/weapon.gd.uid
Normal file
1
data/items/weapon.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bgn8ipx38g28o
|
||||
@@ -1 +0,0 @@
|
||||
Aseir, Haseid, Kheed, Zasheir, Fodel, Glar, Grigor, Igan, Ivor, Kosef, Mival, Pavel, Sergor, Darvin, Dorn, Evendur, Gorstag, Helm, Morn, Randal, Stedd, Ander, Blath, Bran, Frath, Geth, Lander, Luth, Malcer, Stor, Taman, Bareris, Kethoth, Mumed, Urhur, Borivik, Faurgar, Jandar, Kanithar, Madislak, Ralmevik, Shaumar, Vladislak, Chen, Chi, Fai, Jiang, Jun, Lian, Long, Meng, Shan, Wen, Anton, Diero, Marcon, Pieron, Rimardo, Romero, Salazar, Umbero, Atala, Ceidil, Hama, Jasmal, Meilil, Yasheira, Zasheida, Arveene, Esvele, Jhessail, Kerri, Lureene, Miri, Rowan, Tessele, Alethra, Kara, Katernin, Mara, Natali, Olma, Tana, Zora Betha, Cefrey, Kethra, Mara, Olga, Silifrey, Westra, Arizima, Chathi, Nephis, Nulara, Murithi, Sefris, Thola, Umara, Zolis, Hulmarra, Immith, Imzel, Navarra, Shevarra, Tammith. Yuldra, Bai, Chao, Jia, Lei, Mei, Qiao, Shui, Tai, Balama, Dona, Faila, Jalana, Luisa, Marta, Quara, Selise, Vonda
|
||||
BIN
graphics/pom.png
Normal file
BIN
graphics/pom.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
40
graphics/pom.png.import
Normal file
40
graphics/pom.png.import
Normal file
@@ -0,0 +1,40 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dcrhry67g00vk"
|
||||
path="res://.godot/imported/pom.png-b0a176fce3fc3f408ca2ec22564352a4.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://graphics/pom.png"
|
||||
dest_files=["res://.godot/imported/pom.png-b0a176fce3fc3f408ca2ec22564352a4.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
|
||||
68
scenes/start_menu.tscn
Normal file
68
scenes/start_menu.tscn
Normal file
@@ -0,0 +1,68 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://cnvl7f3066u7o"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dco3n63irwntu" path="res://scripts/start_menu.gd" id="1_ouf4f"]
|
||||
|
||||
[node name="Start Menu" 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_ouf4f")
|
||||
|
||||
[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, 0, 0, 1)
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" 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 = -630.0
|
||||
offset_top = -247.0
|
||||
offset_right = 630.0
|
||||
offset_bottom = -39.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 100
|
||||
text = "PomChronicles:"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="Label2" type="Label" parent="VBoxContainer"]
|
||||
modulate = Color(0.45840502, 0.45840508, 0.45840502, 1)
|
||||
layout_mode = 2
|
||||
theme_override_font_sizes/font_size = 48
|
||||
text = "We're going to be the bestest guild ever, right? Right?!?"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="Button" type="Button" parent="."]
|
||||
modulate = Color(4.415934, 4.415934, 4.415934, 1)
|
||||
custom_minimum_size = Vector2(1000, 250)
|
||||
layout_mode = 1
|
||||
anchors_preset = -1
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -75.5
|
||||
offset_top = 154.5
|
||||
offset_right = 75.5
|
||||
offset_bottom = 229.5
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme_override_font_sizes/font_size = 48
|
||||
text = "START"
|
||||
|
||||
[connection signal="pressed" from="Button" to="." method="_on_button_pressed"]
|
||||
@@ -27,6 +27,7 @@ var job : JobData
|
||||
var stats : StatBlock
|
||||
var gold : int = 0
|
||||
var quest : Quest
|
||||
var inventory : Dictionary[Vector2, Item] = {}
|
||||
|
||||
func _init() -> void:
|
||||
stats = StatBlock.new()
|
||||
@@ -53,6 +54,20 @@ func assign_quest(quest : Quest) -> void:
|
||||
func full_name() -> String:
|
||||
return given_name + " " + surname
|
||||
|
||||
func gain_level() -> void:
|
||||
level += 1
|
||||
#TODO: Make stats improve based on job
|
||||
Game.notice("%s has reached level %d!" % [full_name(), level])
|
||||
|
||||
func gain_exp(amount : int) -> void:
|
||||
exp += amount
|
||||
while exp >= get_tnl():
|
||||
exp -= get_tnl()
|
||||
gain_level()
|
||||
|
||||
func gain_gold(amount :int) -> void:
|
||||
gold += amount
|
||||
|
||||
func get_tnl() -> int:
|
||||
if job:
|
||||
return job.get_tnl(level)
|
||||
|
||||
@@ -6,14 +6,11 @@ var quest_log : QuestLog = null
|
||||
var top_menu : TopMenu = null
|
||||
var active : bool = true
|
||||
var end_shift_confirmation : ConfirmationDialog
|
||||
var end_shift_confirm_template = preload("res://end_shift_confirmation.tscn")
|
||||
var end_shift_confirm_template = preload("res://templates/end_shift_confirmation.tscn")
|
||||
func _ready() -> void:
|
||||
DisplayServer.register_additional_output(self)
|
||||
end_shift_confirmation = end_shift_confirm_template.instantiate()
|
||||
add_child(end_shift_confirmation)
|
||||
#var file =FileAccess.open("res://name.txt",FileAccess.READ)
|
||||
#var text =file.get_line()
|
||||
#var nmnames = text.remove_chars(" ").split(",")
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if active and Input.is_action_just_pressed("switch modes"):
|
||||
|
||||
@@ -15,8 +15,7 @@ func generate_quest() -> void:
|
||||
func update_quest_window() -> void:
|
||||
if quest:
|
||||
%NameField.text = quest.name
|
||||
match(quest.difficulty):
|
||||
1: %DifficultyField.text = "Trivial"
|
||||
%DifficultyField.text = quest.difficulty_name()
|
||||
%LocationField.text = quest.location
|
||||
#for reward in quest.rewards.:
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@ extends Node
|
||||
|
||||
const visitors = {
|
||||
"test": {
|
||||
"data":preload("res://test_adventurer.tscn"),
|
||||
"sprite":preload("res://test_adventurer_sprite.tscn")
|
||||
"data":preload("res://templates/test_adventurer.tscn"),
|
||||
"sprite":preload("res://templates/test_adventurer_sprite.tscn")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
class_name GamePanel extends MarginContainer
|
||||
|
||||
const notice_template = preload("res://notice_panel.tscn")
|
||||
const quest_progress_bar_template = preload("res://quest_progress_bar.tscn")
|
||||
const notice_template = preload("res://templates/notice_panel.tscn")
|
||||
const quest_progress_bar_template = preload("res://templates/quest_progress_bar.tscn")
|
||||
|
||||
signal time_changed(time : float)
|
||||
|
||||
@@ -15,8 +15,8 @@ func _process(delta: float) -> void:
|
||||
|
||||
func add_quest_progress_bar(quest : Quest) -> void:
|
||||
var qpb : QuestProgressBar = quest_progress_bar_template.instantiate()
|
||||
qpb.setup(quest)
|
||||
%QuestList.add_child(qpb)
|
||||
qpb.setup(quest)
|
||||
#TODO: Change the hero portrait to match
|
||||
if quest.steps > 1:
|
||||
for i in range(quest.steps-1):
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
extends PanelContainer
|
||||
|
||||
const npc_profile_window_template = preload("res://npc_profile_window.tscn")
|
||||
const npc_profile_window_template = preload("res://templates/npc_profile_window.tscn")
|
||||
var _enabled: bool
|
||||
var enabled: bool:
|
||||
get:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
class_name Npc extends Person
|
||||
|
||||
const popup_template = preload("res://profile_popup.tscn")
|
||||
const popup_template = preload("res://templates/profile_popup.tscn")
|
||||
var profile_popup
|
||||
|
||||
@export var is_player : bool = false
|
||||
|
||||
@@ -6,9 +6,27 @@ enum Status{
|
||||
TAKEN,
|
||||
IN_PROGRESS,
|
||||
COMPLETED,
|
||||
FAILED
|
||||
FAILED,
|
||||
CLOSED
|
||||
}
|
||||
|
||||
class Event:
|
||||
enum Type{
|
||||
WAIT,
|
||||
COMBAT,
|
||||
CHOICE
|
||||
}
|
||||
var type : Type = Type.WAIT
|
||||
var enemies : Array[String] = []
|
||||
var time : float = 1
|
||||
var time_elapsed
|
||||
signal completed()
|
||||
|
||||
func process(delta : float) -> void:
|
||||
#TODO: Make quest combat work
|
||||
time_elapsed += delta
|
||||
if time_elapsed >= time:
|
||||
completed.emit()
|
||||
|
||||
var name : String = "A Basic Quest"
|
||||
var desc : String = "The default quest, with no special anything."
|
||||
@@ -17,10 +35,7 @@ var location : String
|
||||
var steps : int = 1
|
||||
var rewards : Dictionary
|
||||
var length : float = 10
|
||||
var step_outcomes : Array = [
|
||||
{"pass":"I succeeded!", "fail":"I failed!"}
|
||||
]
|
||||
|
||||
var events : Array[Event] = []
|
||||
|
||||
|
||||
var progress : float = 0
|
||||
@@ -57,6 +72,8 @@ func complete() -> void:
|
||||
#else it's a guild item they'll bring back for us
|
||||
Game.notice("%s completed the quest '%s'!" % [questor.full_name(), name])
|
||||
|
||||
func num_events() -> int:
|
||||
return len(events)
|
||||
#TODO: Put in quest requirements
|
||||
func is_eligible(member : AdventurerData) -> bool:
|
||||
return !taken
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
class_name QuestBoardEntry extends Button
|
||||
|
||||
|
||||
const quest_window_template = preload("res://quest_window.tscn")
|
||||
const quest_window_template = preload("res://templates/quest_window.tscn")
|
||||
var quest : Quest = null
|
||||
@onready var tex_icon : TextureRect = %Icon
|
||||
@onready var name_label : Label = %NameLabel
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
class_name QuestBoardWindow extends Popup
|
||||
|
||||
const entry_template = preload("res://quest_board_entry.tscn")
|
||||
const entry_template = preload("res://templates/quest_board_entry.tscn")
|
||||
|
||||
@onready var entry_list : VBoxContainer = %Entries
|
||||
|
||||
|
||||
45
scripts/quest_info_window.gd
Normal file
45
scripts/quest_info_window.gd
Normal file
@@ -0,0 +1,45 @@
|
||||
extends Window
|
||||
|
||||
@onready var nameLabel : Label = %NameLabel
|
||||
@onready var difficultyLabel : Label = %DifficultyLabel
|
||||
@onready var locationLabel : Label = %LocationLabel
|
||||
@onready var advRewardList : GridContainer = %AdventurerRewardList
|
||||
@onready var guildRewardList : GridContainer = %GuildRewardList
|
||||
var quest : Quest
|
||||
|
||||
func setup(qst : Quest) -> void:
|
||||
quest = qst
|
||||
quest.status_changed.connect(_on_quest_changed)
|
||||
update()
|
||||
#TODO: Show quest rewards
|
||||
|
||||
func update() -> void:
|
||||
nameLabel.text = quest.name
|
||||
difficultyLabel.text = quest.difficulty_name()
|
||||
locationLabel.text = quest.location
|
||||
#TODO: Show the current status of the quest
|
||||
|
||||
func close() -> void:
|
||||
hide()
|
||||
queue_free()
|
||||
|
||||
func _on_quest_changed(status : Quest.Status) -> void:
|
||||
if status == Quest.Status.CLOSED:
|
||||
close()
|
||||
else:
|
||||
update()
|
||||
|
||||
func _on_remove_quest_confirm() -> void:
|
||||
Guild.remove_quest(quest)
|
||||
close()
|
||||
|
||||
func _on_remove_quest_cancel() -> void:
|
||||
%ConfirmDialog.hide()
|
||||
|
||||
|
||||
func _on_remove_button_pressed() -> void:
|
||||
pass
|
||||
|
||||
|
||||
func _on_back_button_pressed() -> void:
|
||||
close()
|
||||
1
scripts/quest_info_window.gd.uid
Normal file
1
scripts/quest_info_window.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cip5x34n08ilk
|
||||
@@ -1,6 +1,6 @@
|
||||
class_name QuestLog extends Control
|
||||
|
||||
const entry_template = preload("res://quest_log_entry.tscn")
|
||||
const entry_template = preload("res://templates/quest_log_entry.tscn")
|
||||
|
||||
@onready var entry_list : VBoxContainer = %Entries
|
||||
var entries : Array[QuestLogEntry] = []
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
extends PanelContainer
|
||||
|
||||
const quest_info_window_template = preload("res://templates/quest_info_window.tscn")
|
||||
|
||||
var _enabled: bool
|
||||
var enabled: bool:
|
||||
@@ -30,7 +31,10 @@ func setup(qst : Quest) -> void:
|
||||
func _on_gui_input(event: InputEvent) -> void:
|
||||
var evt = event as InputEventMouseButton
|
||||
if evt and evt.button_index == MOUSE_BUTTON_LEFT and evt.pressed:
|
||||
print("Quest clicked!")
|
||||
var wnd = quest_info_window_template.instantiate()
|
||||
add_child(wnd)
|
||||
wnd.setup(quest)
|
||||
wnd.popup_centered()
|
||||
|
||||
func _on_quest_status_changed(status: Quest.Status) -> void:
|
||||
match(status):
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
class_name QuestProgressBar extends Control
|
||||
|
||||
const waypoint_template = preload("res://waypoint.tscn")
|
||||
const waypoint_template = preload("res://templates/waypoint.tscn")
|
||||
var length : float
|
||||
var waypoints : Array = []
|
||||
var waypoints : Array[Waypoint] = []
|
||||
@onready var hero_offset : Vector2 = %Hero.position
|
||||
@onready var hero : HeroIcon = %Hero
|
||||
@onready var heroLabel : Label = %HeroLabel
|
||||
@onready var startpoint : Endpoint = %Start
|
||||
@onready var endpoint : Endpoint = %End
|
||||
@onready var bar : TextureProgressBar = $ProgressBar
|
||||
@onready var path : Control = %Path
|
||||
@onready var speech_bubble = %SpeechBubble
|
||||
var quest : Quest = null
|
||||
var current_event : Quest.Event = null
|
||||
var time_elapsed : float = 0
|
||||
var next_waypoint = 0
|
||||
#signal value_changed(value : float)
|
||||
#var min_value
|
||||
#var max_value
|
||||
@@ -22,15 +26,14 @@ var time_elapsed : float = 0
|
||||
#var allow_greater
|
||||
func _ready() -> void:
|
||||
length = path.size.x
|
||||
if quest:
|
||||
#Generate the waypoints
|
||||
generate_waypoints()
|
||||
#TODO: Change the hero's portrait
|
||||
bar.value = quest.progress
|
||||
hero.position = hero_offset + Vector2(length * bar.value / bar.max_value, 0)
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if time_elapsed < quest.length:
|
||||
if current_event != null:
|
||||
if current_event.type != Quest.Event.Type.COMBAT:
|
||||
current_event.process(delta)
|
||||
else:
|
||||
time_elapsed += delta
|
||||
progress_quest()
|
||||
|
||||
@@ -40,16 +43,20 @@ func generate_waypoints():
|
||||
wp.queue_free()
|
||||
waypoints = []
|
||||
|
||||
for i in range(1,quest.steps):
|
||||
var pct : float = i / float(quest.steps)
|
||||
add_waypoint( pct, quest.step_outcomes[i])
|
||||
#Include the "end" in the count
|
||||
var num = quest.num_events()+1
|
||||
for i in range(1,num):
|
||||
var pct : float = i / float(num)
|
||||
add_waypoint( pct, quest.events[i-1])
|
||||
|
||||
func add_waypoint(pct : float, msgs : Dictionary):
|
||||
func add_waypoint(pct : float, event : Quest.Event):
|
||||
var wp = waypoint_template.instantiate()
|
||||
waypoints.append(wp)
|
||||
wp.percent = pct
|
||||
#TODO: Make events matter
|
||||
wp.event = event
|
||||
%Waypoints.add_child(wp)
|
||||
wp.global_position = global_position + Vector2(pct * length - 16, -9)
|
||||
wp.global_position = %Waypoints.global_position + Vector2(pct * length - 16, -9)
|
||||
if bar.value / bar.max_value >= pct:
|
||||
wp.fill = true
|
||||
|
||||
@@ -59,13 +66,36 @@ func update_waypoints(value : float) -> void:
|
||||
wp.fill = (bar.value / bar.max_value >= wp.percent)
|
||||
endpoint.fill = (bar.value / bar.max_value >= endpoint.percent)
|
||||
|
||||
func start_event(event : Quest.Event, offset : float) -> void:
|
||||
current_event = event
|
||||
current_event.completed.connect(_on_event_complete)
|
||||
event.time_elapsed = offset
|
||||
|
||||
func setup(quest : Quest) -> void:
|
||||
self.quest = quest
|
||||
heroLabel.text = quest.questor.full_name()
|
||||
time_elapsed = 0
|
||||
#Generate the waypoints
|
||||
generate_waypoints()
|
||||
#TODO: Change the hero's portrait
|
||||
bar.value = quest.progress
|
||||
|
||||
func progress_quest() -> void:
|
||||
bar.value = clampf(time_elapsed / quest.length, 0, bar.max_value)
|
||||
var pct = time_elapsed / quest.length
|
||||
if next_waypoint < len(waypoints) and pct >= waypoints[next_waypoint].percent:
|
||||
start_event(waypoints[next_waypoint].event, (pct - waypoints[next_waypoint].percent) * quest.length)
|
||||
pct = waypoints[next_waypoint].percent
|
||||
waypoints[next_waypoint].blink(true)
|
||||
bar.value = clampf(pct, 0, bar.max_value)
|
||||
hero.position = hero_offset + Vector2(length * bar.value / bar.max_value, 0)
|
||||
if time_elapsed >= quest.length:
|
||||
quest.complete()
|
||||
update_waypoints(bar.value)
|
||||
|
||||
|
||||
func _on_event_complete() -> void:
|
||||
#TODO: Show event message!
|
||||
speech_bubble.show_message("Event complete!")
|
||||
waypoints[next_waypoint].blink(false)
|
||||
next_waypoint += 1
|
||||
current_event = null
|
||||
|
||||
@@ -2,4 +2,4 @@ extends Control
|
||||
|
||||
|
||||
func _on_button_pressed() -> void:
|
||||
get_tree().change_scene_to_file()
|
||||
get_tree().change_scene_to_file("res://scenes/active_scene.tscn")
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
extends Node2D
|
||||
|
||||
var test_adv = preload("res://test_adventurer.tscn")
|
||||
var test_adv = preload("res://templates/test_adventurer.tscn")
|
||||
func _ready() -> void:
|
||||
#var adv : AdventurerData = test_adv.instantiate() as AdventurerData
|
||||
#Guild.register_guild_member(adv)
|
||||
var quest : Quest = Quest.new()
|
||||
var evt : Quest.Event = Quest.Event.new()
|
||||
evt.time = 10
|
||||
quest.events.append(evt)
|
||||
Guild.add_quest(quest)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
class_name TopMenu extends Control
|
||||
|
||||
const member_panel_entry_template = preload("res://member_panel_entry.tscn")
|
||||
const quest_panel_entry_template = preload("res://quest_panel_entry.tscn")
|
||||
const guild_info_window_template = preload("res://guild_info_window.tscn")
|
||||
const member_panel_entry_template = preload("res://templates/member_panel_entry.tscn")
|
||||
const quest_panel_entry_template = preload("res://templates/quest_panel_entry.tscn")
|
||||
const guild_info_window_template = preload("res://templates/guild_info_window.tscn")
|
||||
|
||||
@onready var members_list = %MembersList
|
||||
@onready var members = %Members
|
||||
|
||||
@@ -4,7 +4,7 @@ extends NinePatchRect
|
||||
@onready var timer : Timer = %Timer
|
||||
|
||||
func _ready() -> void:
|
||||
show_message("TESTING, 1 2 3\nTESTING!!!!")
|
||||
pass
|
||||
|
||||
|
||||
func show_message(msg : String, show_time : float = 1.0) -> void:
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
class_name Waypoint extends Control
|
||||
|
||||
var event : Quest.Event = null
|
||||
var percent : float = 0
|
||||
var filled: bool
|
||||
var blink_tween : Tween
|
||||
var blinking : bool = false
|
||||
var fill: bool :
|
||||
get:
|
||||
return filled
|
||||
@@ -9,10 +12,22 @@ var fill: bool :
|
||||
if value != filled:
|
||||
set_fill(value)
|
||||
|
||||
func blink(blnk : bool) -> void:
|
||||
if blinking == blnk:
|
||||
return
|
||||
blinking = blnk
|
||||
if blinking:
|
||||
blink_tween = create_tween()
|
||||
blink_tween.tween_property($Dot,"modulate:a", 0, .5)
|
||||
blink_tween.tween_property($Dot,"modulate:a", 1, .5)
|
||||
blink_tween.set_loops(-1)
|
||||
else:
|
||||
blink_tween.stop()
|
||||
blink_tween = null
|
||||
|
||||
func set_fill(value : bool) -> void:
|
||||
filled = value
|
||||
if value:
|
||||
if value and !blinking:
|
||||
$Dot.visible = true
|
||||
$Fill.modulate = Color.SEA_GREEN
|
||||
else:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=11 format=4 uid="uid://cd08dp16bixfv"]
|
||||
[gd_scene load_steps=14 format=4 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"]
|
||||
@@ -7,6 +7,9 @@
|
||||
[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="PackedScene" uid="uid://b3mksvn2jf7e0" path="res://templates/quest_board.tscn" id="7_hph4e"]
|
||||
[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"]
|
||||
|
||||
[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)
|
||||
@@ -81,4 +84,25 @@ navigation_polygon = SubResource("NavigationPolygon_l3mu1")
|
||||
[node name="Quest Board" parent="." instance=ExtResource("7_hph4e")]
|
||||
position = Vector2(935, 32)
|
||||
|
||||
[node name="Npc" type="CharacterBody2D" parent="."]
|
||||
z_index = 1
|
||||
position = Vector2(400, 27)
|
||||
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
|
||||
|
||||
[editable path="Sprites/Receptionist"]
|
||||
|
||||
@@ -106,7 +106,10 @@ layout_mode = 2
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_q6wja")
|
||||
text = "Show Quests"
|
||||
|
||||
[node name="QuestProgressList" type="ScrollContainer" parent="VBoxContainer"]
|
||||
[node name="Panel" type="PanelContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="QuestProgressList" type="ScrollContainer" parent="VBoxContainer/Panel"]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
clip_contents = false
|
||||
@@ -114,7 +117,7 @@ custom_minimum_size = Vector2(260, 100)
|
||||
layout_mode = 2
|
||||
horizontal_scroll_mode = 0
|
||||
|
||||
[node name="QuestList" type="VBoxContainer" parent="VBoxContainer/QuestProgressList"]
|
||||
[node name="QuestList" type="VBoxContainer" parent="VBoxContainer/Panel/QuestProgressList"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(300, 100)
|
||||
layout_mode = 2
|
||||
|
||||
131
templates/quest_info_window.tscn
Normal file
131
templates/quest_info_window.tscn
Normal file
@@ -0,0 +1,131 @@
|
||||
[gd_scene load_steps=6 format=3 uid="uid://map4n3vxmud3"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cip5x34n08ilk" path="res://scripts/quest_info_window.gd" id="1_87ctw"]
|
||||
[ext_resource type="Texture2D" uid="uid://bldpiytpdrge6" path="res://graphics/icon.svg" id="2_isnli"]
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_fkhvq"]
|
||||
outline_size = 2
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_cyayr"]
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_w0qqq"]
|
||||
outline_size = 3
|
||||
|
||||
[node name="Quest Info Window" type="Window"]
|
||||
oversampling_override = 1.0
|
||||
title = "Quest Information"
|
||||
size = Vector2i(500, 620)
|
||||
wrap_controls = true
|
||||
unresizable = true
|
||||
popup_window = true
|
||||
script = ExtResource("1_87ctw")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
anchors_preset = -1
|
||||
offset_right = 500.0
|
||||
offset_bottom = 620.0
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="VBoxContainer/HBoxContainer2"]
|
||||
layout_mode = 2
|
||||
texture = ExtResource("2_isnli")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer2"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Quest Name"
|
||||
label_settings = SubResource("LabelSettings_fkhvq")
|
||||
|
||||
[node name="NameLabel" type="Label" parent="VBoxContainer/HBoxContainer2/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
modulate = Color(0.6542321, 0.6542321, 0.654232, 1)
|
||||
custom_minimum_size = Vector2(365, 35)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
text = "A Simple Task"
|
||||
label_settings = SubResource("LabelSettings_cyayr")
|
||||
|
||||
[node name="Label2" type="Label" parent="VBoxContainer/HBoxContainer2/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Difficulty"
|
||||
label_settings = SubResource("LabelSettings_w0qqq")
|
||||
|
||||
[node name="DifficultyLabel" type="Label" parent="VBoxContainer/HBoxContainer2/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
modulate = Color(0.6542321, 0.6542321, 0.654232, 1)
|
||||
custom_minimum_size = Vector2(365, 35)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
text = "(Difficulty)"
|
||||
|
||||
[node name="Label3" type="Label" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Location"
|
||||
label_settings = SubResource("LabelSettings_w0qqq")
|
||||
|
||||
[node name="LocationLabel" type="Label" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
modulate = Color(0.6542321, 0.6542321, 0.654232, 1)
|
||||
custom_minimum_size = Vector2(480, 35)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
text = "(Location)"
|
||||
|
||||
[node name="Label4" type="Label" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Adventurer Reward"
|
||||
label_settings = SubResource("LabelSettings_w0qqq")
|
||||
|
||||
[node name="AdventurerRewardPanel" type="PanelContainer" parent="VBoxContainer"]
|
||||
custom_minimum_size = Vector2(480, 150)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="AdventurerRewardList" type="GridContainer" parent="VBoxContainer/AdventurerRewardPanel"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label5" type="Label" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Guild Reward"
|
||||
label_settings = SubResource("LabelSettings_w0qqq")
|
||||
|
||||
[node name="GuildRewardPanel" type="PanelContainer" parent="VBoxContainer"]
|
||||
custom_minimum_size = Vector2(480, 150)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="GuildRewardList" type="GridContainer" parent="VBoxContainer/GuildRewardPanel"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="RemoveButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
custom_minimum_size = Vector2(248, 60)
|
||||
layout_mode = 2
|
||||
text = "REMOVE"
|
||||
|
||||
[node name="BackButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
custom_minimum_size = Vector2(248, 60)
|
||||
layout_mode = 2
|
||||
text = "BACK"
|
||||
|
||||
[node name="ConfirmDialog" type="ConfirmationDialog" parent="."]
|
||||
unique_name_in_owner = true
|
||||
oversampling_override = 1.0
|
||||
title = "Remove Quest"
|
||||
size = Vector2i(329, 100)
|
||||
visible = true
|
||||
ok_button_text = "Yes, Remove it"
|
||||
dialog_text = "Do you really wish to remove this quest?"
|
||||
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/RemoveButton" to="." method="_on_remove_button_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/BackButton" to="." method="_on_back_button_pressed"]
|
||||
[connection signal="canceled" from="ConfirmDialog" to="." method="_on_remove_quest_cancel"]
|
||||
[connection signal="confirmed" from="ConfirmDialog" to="." method="_on_remove_quest_confirm"]
|
||||
@@ -52,6 +52,16 @@ pivot_offset = Vector2(125, 0)
|
||||
size_flags_horizontal = 4
|
||||
script = ExtResource("1_3w4v3")
|
||||
|
||||
[node name="HeroLabel" type="Label" parent="."]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 0
|
||||
offset_left = 30.0
|
||||
offset_top = 2.0
|
||||
offset_right = 223.0
|
||||
offset_bottom = 25.0
|
||||
text = "Hero Name Here"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="ProgressBar" type="TextureProgressBar" parent="."]
|
||||
custom_minimum_size = Vector2(213, 14)
|
||||
layout_mode = 0
|
||||
@@ -143,7 +153,9 @@ position = Vector2(-1, -12)
|
||||
texture = ExtResource("6_lufuo")
|
||||
script = ExtResource("7_nby1n")
|
||||
|
||||
[node name="UpdateBubble" type="NinePatchRect" parent="ProgressBar/Hero"]
|
||||
[node name="SpeechBubble" type="NinePatchRect" parent="ProgressBar/Hero"]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
clip_contents = true
|
||||
anchors_preset = -1
|
||||
anchor_left = 1.0
|
||||
@@ -168,7 +180,7 @@ axis_stretch_horizontal = 1
|
||||
axis_stretch_vertical = 1
|
||||
script = ExtResource("9_pq74m")
|
||||
|
||||
[node name="Label" type="Label" parent="ProgressBar/Hero/UpdateBubble"]
|
||||
[node name="Label" type="Label" parent="ProgressBar/Hero/SpeechBubble"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 0
|
||||
offset_left = 5.0
|
||||
@@ -182,7 +194,7 @@ text = "testing one 1 2 3"
|
||||
vertical_alignment = 1
|
||||
autowrap_mode = 2
|
||||
|
||||
[node name="Timer" type="Timer" parent="ProgressBar/Hero/UpdateBubble"]
|
||||
[node name="Timer" type="Timer" parent="ProgressBar/Hero/SpeechBubble"]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="Container" type="Container" parent="ProgressBar"]
|
||||
@@ -199,4 +211,4 @@ offset_top = 34.0
|
||||
offset_right = 231.0
|
||||
offset_bottom = 54.0
|
||||
|
||||
[connection signal="timeout" from="ProgressBar/Hero/UpdateBubble/Timer" to="ProgressBar/Hero/UpdateBubble" method="_on_timer_timeout"]
|
||||
[connection signal="timeout" from="ProgressBar/Hero/SpeechBubble/Timer" to="ProgressBar/Hero/SpeechBubble" method="_on_timer_timeout"]
|
||||
|
||||
@@ -155,6 +155,7 @@ text = "Generate Quest"
|
||||
|
||||
[node name="GenerateQuestDialog" type="Control" parent="."]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
layout_mode = 1
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
@@ -182,7 +183,6 @@ grow_vertical = 2
|
||||
|
||||
[node name="GenerateQuest" type="VBoxContainer" parent="GenerateQuestDialog/Window"]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="GenerateQuestDialog/Window/GenerateQuest"]
|
||||
@@ -300,6 +300,7 @@ text = "BACK"
|
||||
|
||||
[node name="PostQuest" type="VBoxContainer" parent="GenerateQuestDialog/Window"]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="GenerateQuestDialog/Window/PostQuest"]
|
||||
|
||||
Reference in New Issue
Block a user