More work on dialogue, portraits, customizer and intro

This commit is contained in:
2025-09-18 09:14:54 -04:00
parent 82c630d668
commit 023e88b84e
80 changed files with 2117 additions and 141 deletions

View File

@@ -1,6 +1,7 @@
class_name Quest extends Resource
#The list of available quests
static var list : Array[Quest]
enum Status{
@@ -31,10 +32,13 @@ class Event:
VICTORY,
DEFEAT
}
var hidden : bool = false
var type : Type = Type.WAIT
var enemies : Array[String] = []
var progress_point : float = 0
var time : float = 1
var time_elapsed
var complete : bool = false
signal completed()
signal failed()
@@ -43,6 +47,21 @@ class Event:
var busy_list : Array = []
var combat_state
var dex_speed : int
func setup() -> void:
pass
func save_dict() -> Dictionary:
var d : Dictionary = {}
d.hidden = hidden
d.type = type
d.enemies = enemies
d.progress_point = progress_point
d.time = time
d.time_elapsed = time_elapsed
d.complete = complete
return d
func start(quest : Quest) -> void:
match(type):
Type.WAIT:
@@ -91,7 +110,7 @@ class Event:
func add_to_turn_queue(combatant) -> void:
#Calculate time
var time = dex_speed / combatant.stats.DEX
var time = dex_speed / max(1, combatant.stats.DEX)
#Walk through list to find insertion point
var idx = -1
for i in range(len(turn_queue)):
@@ -191,12 +210,15 @@ class Event:
CombatState.VICTORY:
time_elapsed += delta
if time_elapsed >= time:
complete = true
completed.emit()
Type.WAIT:
time_elapsed += delta
if time_elapsed >= time:
complete = true
completed.emit()
var base_name : String = ""
var name : String = "A Basic Quest"
var desc : String = "The default quest, with no special anything."
var difficulty : int = 1
@@ -233,6 +255,7 @@ func fail() -> void:
func complete() -> void:
status = Status.COMPLETED
status_changed.emit(Status.COMPLETED)
questview.show_quest_complete()
for reward in rewards.keys():
if reward == "gold":
questor.gain_gold(rewards[reward])
@@ -268,3 +291,46 @@ func difficulty_name() -> String:
4: return "Extreme"
5: return "Legendary"
_: return "Unknown"
static func load_quest_list() -> void:
var path = ProjectSettings.get_setting_with_override("data/quests/directory")
var dir = DirAccess.open(path)
var quest : Quest
if dir:
dir.list_dir_begin()
var filename = dir.get_next()
while filename != "":
if not dir.current_is_dir() and filename.get_extension() == "gd":
var file = load(path + "/" + filename).new()
if file is Quest:
list.append(file)
filename = dir.get_next()
dir.list_dir_end()
static func generate(parameters : Dictionary) -> Quest:
return null
func save_dict() -> Dictionary:
var d : Dictionary = {}
d.name = name
d.base_name = base_name
d.desc = desc
d.difficulty = difficulty
d.location = location
d.steps = steps
#TODO: Convert these!
#d.rewards = rewards
#d.guild_rewards = guild_rewards
d.covenant_cost = covenant_cost
d.length = length
d.progress = progress
d.current_step = current_step
d.taken = taken
d.status = status
var lst : Array = []
for evt in events:
lst.append(evt.save_dict())
d.events = lst
return d

View File

@@ -1,15 +1,35 @@
extends Quest
func _init() -> void:
func setup() -> void:
name = "A Sticky Situation"
var event_weights = [1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,4,4,5]
var num_events = event_weights.pick_random()
var num_events = 3 # event_weights.pick_random()
#The first event is guaranteed to be at the 50% mark.
var first : bool = true
var pranges : Array = []
var margin : float = 0.1
for i in range(num_events):
var evt : Quest.Event = Quest.Event.new()
evt.type = Quest.Event.Type.COMBAT
evt.enemies = ["goo"]
evt.time = 5
if first:
#Make invisible
evt.progress_point = .5
pranges.append([margin, evt.progress_point-margin])
pranges.append([evt.progress_point+margin, 1 - margin])
first = false
else:
evt.hidden = true
pranges.shuffle()
var range = pranges.pop_back()
evt.progress_point = randf_range(range[0], range[1])
if evt.progress_point - range[0] >= 2 * margin:
pranges.append([range[0], evt.progress_point - margin])
if range[1] - evt.progress_point >= 2 * margin:
pranges.append([evt.progress_point + margin, range[1]])
events.append(evt)
events.sort_custom(func(a,b): return a.progress_point < b.progress_point)
desc = "Nestors Woods is facing a slime invasion and the farmers are getting nervous, send an adventurer to help squash that sticky situation!"
location = Quest.Locations.NESTORS_WOODS
rewards = {"exp":10, "gold":5}