Files
Dawn-Godot/scripts/UI/QuestMenu.gd

104 lines
2.5 KiB
GDScript

class_name QuestMenu extends Panel
@export var questList:ItemList
@export var questName:Label
@export var closeButton:Button
@export var questObjectiveList:ItemList
@export var questObjectiveInfo:Label
var currentQuestKey
var currentQuestObjective
func _ready() -> void:
hide()
# Setup quests
_updateQuestList()
setQuest(null)
# Connect signals
questList.item_selected.connect(_onQuestSelected)
closeButton.pressed.connect(_onCloseClicked)
questObjectiveList.item_selected.connect(_onQuestObjectiveSelected)
QUEST.questUpdated.connect(_onQuestUpdated)
func _exit_tree() -> void:
questList.item_selected.disconnect(_onQuestSelected)
closeButton.pressed.disconnect(_onCloseClicked)
questObjectiveList.item_selected.disconnect(_onQuestObjectiveSelected)
QUEST.questUpdated.disconnect(_onQuestUpdated)
func setQuest(questKey = null):
if questKey == null || questKey == -1:
currentQuestKey = -1
setQuestObjective(-1)
questList.deselect_all()
return
assert(QUEST.quests.has(questKey), "Quest with key %s does not exist" % questKey)
currentQuestKey = questKey
setQuestObjective(-1)
var quest = QUEST.quests[questKey];
questList.select(questKey)
questName.text = quest.title
questObjectiveList.clear()
questObjectiveList.deselect_all()
for objective in quest.objectives:
questObjectiveList.add_item(objective.title)
func setQuestObjective(objective = null):
if objective == null || objective == -1:
currentQuestObjective = -1
questObjectiveList.deselect_all()
questObjectiveList.clear()
return
assert(QUEST.quests.has(objective), "Quest with key %s does not exist" % objective)
currentQuestObjective = objective
var quest = QUEST.quests[currentQuestKey];
var questObjective = quest.objectives[objective]
questObjectiveList.select(objective)
# Setup Description
var ctx = questObjective.getTransContext()
ctx.addContext("quest", quest.getTransContext())
questObjectiveInfo.text = ctx.trans(questObjective.description)
func open(questKey = null) -> void:
setQuest(questKey)
self.show()
func close() -> void:
self.hide()
func isOpen() -> bool:
return self.visible
# Private methods
func _updateQuestList():
questList.clear()
questList.deselect_all()
for questKey in QUEST.quests:
var q = QUEST.quests[questKey]
questList.add_item(q.title)
# Event handlers
func _onQuestSelected(index:int) -> void:
setQuest(index)
func _onQuestObjectiveSelected(index:int) -> void:
setQuestObjective(index)
func _onQuestUpdated(_q:Quest) -> void:
_updateQuestList()
func _onCloseClicked() -> void:
self.close()