Quests & Quest Sets

Table of Contents

  1. UPulseQuest – Quest Definition
    1. Properties
    2. Editor validation
  2. Quest Flags (EPulseQuestFlags)
  3. UPulseQuestSet – Quest Pool
    1. Properties
    2. Editor validation
  4. UPulseQuestData – Runtime Quest State
    1. Key read-only properties (Blueprint-accessible)
    2. Blueprint API
    3. Events
    4. Objective tracking
  5. UPulseQuestInstance – Quest Execution (Server Only)
    1. Key API
  6. EPulseQuestFinishResult
  7. FPulseQuestAddParams

UPulseQuest – Quest Definition

UPulseQuest is a const Data Asset that statically describes a quest. One asset per quest; multiple managers can run quests of the same definition.

Properties

Property Type Description
Tag FGameplayTag Unique runtime identifier for this quest. Required.
DisplayName FText Human-readable name for UI
Description FText Quest description for UI
DefaultFlags int32 (bitmask) EPulseQuestFlags applied at quest start
QuestDataClass TSubclassOf<UPulseQuestData> Runtime data class (defaults to base class)
MetaData UObject* Optional context object (icons, rewards, …)
StateTree FStateTreeReference StateTree asset (schema: UPulseQuestStateTreeSchema)

Editor validation

The asset reports errors if:

  • Tag is not set.
  • StateTree asset is missing or not compiled.

Quest Flags (EPulseQuestFlags)

Applied as a bitmask from both the Data Asset and FPulseQuestAddParams:

Flag Value Behavior
PQF_NoSave 1 << 0 Quest is excluded from save/load
PQF_NoStartOnLoad 1 << 1 Quest is not auto-started when loading a save (without a Director)
// C++ – add flags before starting
FPulseQuestAddParams Params = FPulseQuestAddParams::FromQuestTag(QuestTag);
Params.AddFlags(EPulseQuestFlags::PQF_NoSave);

UPulseQuestSet – Quest Pool

A Quest Set defines which quests a manager is allowed to start.

Properties

Property Type Description
Quests TSet<UPulseQuest*> Direct quest references
QuestSets TSet<UPulseQuestSet*> Nested sets (transitively searched)

The set builds an internal TMap<FGameplayTag, UPulseQuest*> for O(1) lookup. This map is rebuilt on PostLoad and on PostEditChangeProperty.

Editor validation

Errors are reported for:

  • Null entries in Quests or QuestSets.
  • Circular references between nested QuestSets.

UPulseQuestData – Runtime Quest State

Every running quest has an associated UPulseQuestData instance that:

  • Is replicated to the owning client.
  • Stores the finish state and objective tracking data.
  • Implements IPulseQuestSaveInterface for serialization.

Key read-only properties (Blueprint-accessible)

Property Type Description
Quest const UPulseQuest* Back-reference to the definition
FinishState EPulseQuestFinishResult None while running; set on stop
QuestFlags int32 Replicated bitmask
bLoadedFromSaveGame bool True if this quest was restored from a save
QuestDataViewModel UMVVMPulseQuest* Lazy-created MVVM ViewModel

Blueprint API

GetQuestManager()           → TScriptInterface<IPulseQuestManagerInterface>
GetQuestTag()               → FGameplayTag
IsStopped()                 → bool
IsStopped(OutResult)        → bool + EPulseQuestFinishResult
IsClientData()              → bool (false on server/authority)
IsObjectiveFinished(SaveID) → bool
GetObjectiveFinishStatus(SaveID) → EPulseObjectiveCompletionStatus
GetQuestDataViewModel()     → UMVVMPulseQuest*

Events

FPulseQuestDataStoppedEventDynamic OnStopped;    // Blueprint assignable
FPulseQuestDataStoppedEvent OnStoppedNative;     // C++ multicast

Objective tracking

QuestData tracks which objectives have finished in the current branch:

bool IsObjectiveFinished(const FName& SaveID) const;
EPulseObjectiveCompletionStatus GetObjectiveFinishStatus(const FName& SaveID) const;

// Allow restarting an objective by clearing its finished record:
void RemoveFinishedObjectiveId(const FName& SaveID);

UPulseQuestInstance – Quest Execution (Server Only)

UPulseQuestInstance wraps the StateTree execution context for a single running quest. It exists only on the server (Authority).

Subclasses:

  • UPulseQuestManagerInstance – used by UPulseQuestManager
  • UPulseSharedQuestInstance – used by APulseSharedQuestHost

Key API

bool Init(const FGameplayTag& Tag, const UPulseQuest& Quest);
bool Start();
void Stop(EPulseQuestFinishResult Result);
void Tick(float DeltaTime);
void SendEvent(const FGameplayTag EventTag, const FConstStructView Payload = {}, FName Origin = {});
void SendEvent(const FStateTreeEvent& Event);
FString GetCurrentState() const;
FGameplayTag GetQuestTag() const;
UPulseQuestData* GetQuestData() const;
bool IsFinished() const;

OnFinished event fires (C++ delegate) when the instance reaches a terminal state.


EPulseQuestFinishResult

Value Meaning
None Quest is still running
Success Quest completed successfully
Failure Quest failed
Stopped Quest was stopped without a result (e.g. manager reset)

FPulseQuestAddParams

Used to start a quest with optional overrides:

FPulseQuestAddParams Params;
Params.QuestTag = MyQuestTag;
Params.AddFlags(EPulseQuestFlags::PQF_NoSave);
// Optional: callback when added
Params.OnAdded = FPulseQuestAddParams::FQuestAdded::CreateLambda(
    [](bool bAdded){ /* … */ });

Helper factory:

FPulseQuestAddParams::FromQuestTag(QuestTag);

Back to top

Copyright © 2026 LuQ Studios. Distributed under the MIT License.

This site uses Just the Docs, a documentation theme for Jekyll.