5#include "CoreMinimal.h"
6#include "GameplayTagContainer.h"
8#include "Engine/DataTable.h"
9#include "UObject/UnrealType.h"
10#include "QuestData.generated.h"
26UENUM(Blueprintable, BlueprintType, meta = (ScriptName = "EFilterQuestTypePython"))
30 Main
UMETA(DisplayName =
"Main"),
31 Side
UMETA(DisplayName =
"Side"),
32 HumanQuest
UMETA(DisplayName =
"Human"),
33 AlienQuest
UMETA(DisplayName =
"Alien"),
34 RaiderQuest
UMETA(DisplayName =
"Raider"),
35 RobotQuest
UMETA(DisplayName =
"Robot"),
36 ZombieQuest
UMETA(DisplayName =
"Zombie"),
37 Completed
UMETA(DisplayName =
"Completed"),
39 Abandoned
UMETA(DisplayName =
"Abandoned"),
41 Multiple
UMETA(DisplayName =
"Multiple")
49UENUM(Blueprintable, BlueprintType, meta = (ScriptName =
"EQuestLocationPython"))
55UENUM(Blueprintable, BlueprintType, meta = (ScriptName =
"EQuestOutcomePython"))
58 NotStarted
UMETA(DisplayName =
"Not Started"),
59 Active
UMETA(DisplayName =
"Active"),
60 Completed
UMETA(DisplayName =
"Completed"),
62 Abandoned
UMETA(DisplayName =
"Abandoned"),
63 NotAvailable
UMETA(DisplayName =
"Not Available")
119USTRUCT(BlueprintType)
124 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=
"Quest System|Goal")
126 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Quest
System|Goal")
127 int32 ObjectiveAmount = 0;
130 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Quest
System")
131 bool bHasWorldMarker = false;
138USTRUCT(BlueprintType)
143 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=
"Quest System|Goal")
148 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Quest
System|Goal")
149 FString ObjectiveID = {
""};
150 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=
"Quest System|Goal")
151 int32 ObjectiveAmount = 0;
165USTRUCT(BlueprintType)
170 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=
"Reward")
171 int32 Experience = 0;
172 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Reward")
184USTRUCT(BlueprintType)
190 float GetElapsedTime()
const
197 return StartTimeInSeconds;
202 if(GetIsStarted() ==
false)
204 Status = EQuestStatus::Active;
206 if(
const UWorld* World = GEngine->GetWorldFromContextObject(
Owner, EGetWorldErrorMode::LogAndReturnNull))
208 StartTimeInSeconds = World->GetTimeSeconds();
219 Status = EQuestStatus::NotStarted;
223 if(Status != EQuestStatus::Active){
return ElapsedTime;}
224 if(
const UWorld* World = GEngine->GetWorldFromContextObject(
Owner, EGetWorldErrorMode::LogAndReturnNull))
226 const float CurrentTimeInSeconds = World->GetTimeSeconds();
227 ElapsedTime = CurrentTimeInSeconds - StartTimeInSeconds;
233 if(Status != EQuestStatus::Active){
return;}
234 StartTimeInSeconds = -ElapsedTime;
238 if(FailProgress >= RequiredFailProgress)
242 return Status == EQuestStatus::Failed;
248 if(bObjectiveTimed && StartTimeInSeconds >= 0.0f)
250 return ElapsedTime <= TimeToComplete;
255 bool IsFinished(
const int32 RequiredFailProgress,
const int32 RequiredProgress)
const
257 return (FailProgress >= RequiredFailProgress) || (CurrentProgress >= RequiredProgress);
259 bool IsSuccessful(
const int32 RequiredFailProgress,
const int32 RequiredProgress)
const
261 return (CurrentProgress >= RequiredProgress) && (FailProgress < RequiredFailProgress);
264 bool Complete(
const int32 RequiredFailProgress,
const int32 RequiredProgress)
const
266 if(FailProgress >= RequiredFailProgress)
270 return CurrentProgress >= RequiredProgress;
279 return (Status == EQuestStatus::Active);
283 return (Status != EQuestStatus::NotAvailable && Status != EQuestStatus::NotStarted);
287 return Status == EQuestStatus::NotStarted;
291 bool AddProgress(
const int32 Amount,
const int32 RequiredProgress)
293 CurrentProgress += Amount;
294 if(CurrentProgress >= RequiredProgress)
296 CurrentProgress = RequiredProgress;
297 if(Status == EQuestStatus::Active)
299 Status = EQuestStatus::Completed;
308 FailProgress += Amount;
309 if(FailProgress >= RequiredFailProgress)
311 FailProgress = RequiredFailProgress;
312 if(Status == EQuestStatus::Active)
314 Status = EQuestStatus::Failed;
322 return CurrentProgress;
339 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=
"Status")
342 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="ID")
346 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Timed")
347 float StartTimeInSeconds = -1.0f;
348 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Timed")
349 float ElapsedTime = -1.0f;
350 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Progress")
351 int32 FailProgress = 0;
352 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Progress")
353 int32 CurrentProgress = 0;
359USTRUCT(BlueprintType)
364 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=
"General")
365 FString ObjectiveID = "
Default Quest Objective";
366 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="
General")
367 FString ObjectiveDescription = "
Default Description";
368 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="
General")
369 TArray<FString> ObjectiveHints = {
"Objective",
"Hint"};
371 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=
"General")
372 bool bHasWorldMarker = false;
378 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Status")
379 bool bIsOptional = false;
381 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Progress")
382 int32 RequiredFailProgress = 100;
383 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Progress")
384 int32 RequiredProgress = 100;
385 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Progress")
386 bool bShowProgress = true;
387 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Progress")
388 bool bShowFailProgress = true;
391 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Progress")
392 bool bDynamicProgress = false;
396 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Progress")
397 bool bIsUnlockedAtCertainProgress = false;
398 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Progress", meta=(EditCondition=bIsUnlockedAtCertainProgress))
399 int32 UnlockProgressNeeded = 15;
401 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Timed")
402 bool bObjectiveTimed = false;
403 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Timed", meta=(EditCondition=bObjectiveTimed))
404 float TimeToComplete = 10.0f;
406 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Reward")
409 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Status")
413 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Status")
414 bool bBranchObjective = false;
423 return ObjectiveStatus.AddProgress(Amount, RequiredProgress);
428 return ObjectiveStatus.AddFailProgress(Amount, RequiredFailProgress);
432 if(bIsUnlockedAtCertainProgress && CanStart(GetCurrentProgress()) ==
false)
434 ObjectiveStatus.SetObjectiveNotYetStarted();
437 ObjectiveStatus.StartObjective(
Owner);
441 if(bIsUnlockedAtCertainProgress && CanStart(QuestProgress) ==
false)
443 ObjectiveStatus.SetObjectiveNotYetStarted();
446 ObjectiveStatus.StartObjective(
Owner);
450 ObjectiveStatus.ResumeFromElapsedTime();
454 return ObjectiveStatus.SaveObjectiveTime(
Owner);
459 ObjectiveStatus.SetUniqueID(ID);
477 return ObjectiveStatus.GetElapsedTime();
481 return ObjectiveStatus.GetStartTime();
485 return ObjectiveStatus.GetDidCompleteInTime(bObjectiveTimed, TimeToComplete);
489 return ObjectiveStatus.GetCurrentProgress();
493 return ObjectiveStatus.GetFailProgress();
498 return static_cast<float>(GetCurrentProgress()) /
static_cast<float>(RequiredProgress);
502 return static_cast<float>(GetFailProgress()) /
static_cast<float>(RequiredFailProgress);
507 if(bIsUnlockedAtCertainProgress)
509 return TotalProgress >= UnlockProgressNeeded;
515 return ObjectiveStatus.GetIsFailed(RequiredFailProgress);
519 return ObjectiveStatus.IsActive();
523 return ObjectiveStatus.GetIsStarted();
527 return ObjectiveStatus.GetIsNotYetStarted();
532 return ObjectiveStatus.IsFinished(RequiredFailProgress, RequiredProgress);
536 return ObjectiveStatus.IsSuccessful(RequiredFailProgress, RequiredProgress);
541 return ObjectiveStatus.Complete(RequiredFailProgress, RequiredProgress);
545 return ObjectiveStatus.GetStatus();
550 return (ObjectiveID ==
Other.ObjectiveID) && (GetUniqueID() ==
Other.GetUniqueID());
554 return (ObjectiveID !=
Other.ObjectiveID) || ((ObjectiveID ==
Other.ObjectiveID) && (GetUniqueID() !=
Other.GetUniqueID()));
559 return (GetUniqueID() == OtherID);
565 return (GetUniqueID() != OtherID);
582USTRUCT(BlueprintType)
587 void StartQuest(const UObject*
Owner)
589 if(GetQuestStatus() == EQuestStatus::Active){
return;}
590 SetStatus(EQuestStatus::Active);
591 if(
const UWorld* World = GEngine->GetWorldFromContextObject(
Owner, EGetWorldErrorMode::LogAndReturnNull))
593 StartTimeInSeconds = World->GetTimeSeconds();
598 QuestStatus = NewQuestStatus;
602 return QuestStatus == EQuestStatus::Active;
610 TArray<FString> AllObjectiveIDs;
611 for(
const auto& Objective: ObjectiveReferences)
613 if(Objective ==
nullptr){
continue;}
614 AllObjectiveIDs.AddUnique(Objective->ObjectiveID);
616 return AllObjectiveIDs;
620 return ObjectiveReferences.Num();
624 int32 TotalProgress = 0;
625 for(
const auto& Objective : ObjectiveReferences)
627 if(Objective ==
nullptr){
continue;}
628 if(!Objective->bIsOptional)
630 TotalProgress += Objective->GetCurrentProgress();
633 return TotalProgress;
638 int32 TotalRequired = 0;
639 for(
const auto& Objective : ObjectiveReferences)
641 if(Objective ==
nullptr){
continue;}
642 if(!Objective->bIsOptional)
644 TotalRequired += Objective->RequiredProgress;
647 return TotalRequired;
653 if(
const UWorld* World = GEngine->GetWorldFromContextObject(
Owner, EGetWorldErrorMode::LogAndReturnNull))
655 const float CurrentTimeInSeconds = World->GetTimeSeconds();
656 ElapsedTime = CurrentTimeInSeconds - StartTimeInSeconds;
663 if(QuestStatus != EQuestStatus::Active){
return;}
664 StartTimeInSeconds = -ElapsedTime;
669 if(StartTimeInSeconds >= 0.0f)
671 return ElapsedTime <= TimeToComplete;
679 SaveQuestTime(
Owner);
680 QuestOutcome = QuestStatus;
681 if(QuestOutcome != EQuestStatus::Active){
return false;}
686 if(QuestObjective->bIsOptional){
continue;}
687 if(QuestObjective->GetIsFailed())
689 QuestOutcome = EQuestStatus::Failed;
692 if(QuestObjective->bObjectiveTimed && !QuestObjective->GetDidCompleteInTime())
694 QuestOutcome = EQuestStatus::Failed;
698 if(QuestObjective->GetIsFinished() ==
false)
700 QuestOutcome = EQuestStatus::Active;
705 QuestOutcome = EQuestStatus::Completed;
714 return StartTimeInSeconds;
728 TArray<FString> ActiveObjectiveIDs;
729 for(
const auto& Objective : ObjectiveReferences)
731 if(Objective !=
nullptr)
733 if(Objective->GetIsActive())
735 ActiveObjectiveIDs.Add(Objective->ObjectiveID);
739 return ActiveObjectiveIDs;
743 TArray<FString> NotStartedObjectiveIDs;
744 for(
const auto& Objective : ObjectiveReferences)
746 if(Objective !=
nullptr)
748 if(Objective->GetIsNotYetStarted())
750 NotStartedObjectiveIDs.Add(Objective->ObjectiveID);
754 return NotStartedObjectiveIDs;
759 TArray<FString> ActiveObjectiveIDs;
760 for(
const auto& Objective : ObjectiveReferences)
762 if(Objective !=
nullptr)
764 if(Objective->GetIsActive())
766 if(Objective->bHasWorldMarker)
768 ActiveObjectiveIDs.Add(Objective->ObjectiveID);
773 return ActiveObjectiveIDs;
779 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=
"Status")
781 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Status")
786 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Timed")
787 float StartTimeInSeconds = -1.0f;
788 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Timed")
789 float ElapsedTime = -1.0f;
796USTRUCT(BlueprintType)
801 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=
"General")
802 FString QuestID = "QID_01";
804 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="
General")
805 FString QuestName = "Quest Name";
806 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="
General")
807 FString Description = "Quest Description";
809 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="
General")
810 TArray<FString> ObjectiveIDs = {
"QOID_01",
"QOID_02"};
812 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=
"Status")
813 bool bUniqueObjectives = true;
815 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="
General")
816 bool bShowOverallProgress = false;
818 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="
General")
820 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Requirements")
821 TArray<FString> RequiredQuests;
822 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="
General")
823 TArray<FString> QuestsToBeAddedAfterCompletion;
825 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State")
826 bool bCanQuestBeAbandoned = false;
827 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State")
828 bool bCanQuestFail = false;
829 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State")
830 bool bCanRetry = false;
832 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="State")
833 bool bRepeatable = false;
835 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Status")
839 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Timed")
840 bool bQuestTimed = false;
841 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Timed", meta=(EditCondition=bQuestTimed))
842 float TimeToComplete = 10.0f;
844 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Category")
845 FGameplayTag CategoryTag;
846 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Category")
848 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Category")
850 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Category")
851 FGameplayTag LocationTag;
853 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Requirements")
854 int32 RecommendedLevel = 0;
864 Status = QuestStatus;
873 return (QuestID ==
Other.QuestID) && (GetUniqueID() ==
Other.GetUniqueID());
880 return (QuestID !=
Other.QuestID) || (GetUniqueID() !=
Other.GetUniqueID());
884 if(bUniqueObjectives){
return (GetUniqueID() == OtherID);}
885 return (QuestID == OtherID.
ID);
889 if(bUniqueObjectives){
return (GetUniqueID() != OtherID);}
890 return (QuestID != OtherID.
ID);
895 if(QuestID ==
"Default Quest"){
return false;}
896 if(QuestName ==
"Default Name"){
return false;}
897 if(Status.GetObjectivesNum() == 0){
return false;}
903 return EmptyQuestInfo;
908 return Status.GetIsActive();
912 return Status.GetQuestStatus();
916 Status.SetUniqueID(ID);
926 Status.SetStatus(NewQuestStatus);
930 return Status.ObjectiveReferences.Num();
934 return Status.GetTotalProgress();
939 return Status.GetTotalRequiredProgress();
944 return Status.GetElapsedTime();
948 return Status.GetStartTime();
954 Status.StartQuest(
Owner);
958 const float ElapsedTime = Status.SaveQuestTime(
Owner);
963 Status.ResumeFromElapsedTime();
970 return Status.GetDidCompleteInTime(TimeToComplete);
979 TArray<FQuestObjectives> CompletedObjectives;
980 for(
const auto& Objective : Status.ObjectiveReferences)
982 if(Objective ==
nullptr){
continue;}
983 if(Objective->GetIsComplete())
985 CompletedObjectives.AddUnique(*Objective);
988 return CompletedObjectives;
992 return Status.GetActiveObjectiveIDs();
996 return Status.GetNotStartedObjectiveIDs();
1000 return Status.GetActiveObjectiveIDsWithMarkers();
1005 for(
const auto& Objective : GetCompletedObjectives())
1007 FullReward.
Credits += Objective.RewardBonus.Credits;
1008 FullReward.
Experience += Objective.RewardBonus.Experience;
1014 TArray<FQuestObjectives> Objectives;
1015 for(
const auto Objective : Status.ObjectiveReferences)
1017 if(Objective ==
nullptr || Objective->ObjectiveID.IsEmpty())
1019 UE_LOG(LogTemp,
Warning, TEXT(
"Null objective pointer"));
1023 Objectives.Add(ObjectiveCopy);
1032 SaveQuestTime(
Owner);
1033 if(GetIsQuestInTime())
1035 return Status.GetCanBeCompleted(
Owner, QuestOutcome);
1037 QuestOutcome = EQuestStatus::Failed;
1079 return FCrc::MemCrc32(&QuestInfo.
QuestID,
sizeof(QuestInfo.
QuestID));
1082USTRUCT(BlueprintType)
1087 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=
"Quest System")
1089 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Quest
System")
1090 FString QuestName = "Name";
1091 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Quest
System")
1093 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Quest
System")
1095 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Quest
System")
1105 CompletedObjectives = NewCompletedObjectives;
1109 CompletedObjectives = NewCompletedObjectives;
1110 Outcome = FinishedOutcome;
1115USTRUCT(BlueprintType)
1121 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=
"General")
1123 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Stats")
1125 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Stats")
1126 int32 Experience = 0;
1127 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="
Other")
1128 int32 MaximumActiveQuests = 999;
1134 TArray<FQuestOutcome> AllOutcomes;
1135 for(
auto& Quest : ActiveQuests)
1139 if(Quest.GetCanBeCompleted(
Owner, QuestOutcome))
1141 Outcome.
Outcome = QuestOutcome;
1143 Outcome.
QuestID = Quest.GetUniqueID();
1145 AllOutcomes.Add(Outcome);
1163 AddObjectiveToQuests(ExistingPtr);
1166 const int32 Index = Objectives.AddUnique(ObjectiveInfo);
1168 AddObjectiveToQuests(NewPtr);
1181 if(Objective ==
nullptr){
return false;}
1182 for(
auto& Quest : ActiveQuests)
1190 if(Quest.ObjectiveIDs.Contains(Objective->
ObjectiveID))
1192 const bool bAlreadyAdded = Quest.Status.ObjectiveReferences.ContainsByPredicate(
1195 return Existing == Objective;
1200 Quest.Status.ObjectiveReferences.Add(Objective);
1209 for(
const auto& Quest :ActiveQuests)
1211 if(Quest.QuestID == QuestID)
1213 if(UniqueID <= Quest.GetUniqueID().GetUniqueNumber())
1215 UniqueID = Quest.GetUniqueID().GetUniqueNumber() + 1;
1227 const int32 UniqueID = GetNewUniqueID(QuestInfo.
QuestID);
1229 return ActiveQuests.Add(QuestInfo);
1235 for(
auto& Objective : Objectives)
1239 if(QuestInfo.
ObjectiveIDs.Contains(Objective.ObjectiveID))
1241 Objective.StartObjective(
Owner);
1244 return ActiveQuests.AddUnique(QuestInfo);
1248 for(
auto& ActiveQuest : ActiveQuests)
1251 if(ActiveQuest.bUniqueObjectives)
1253 for(
auto& Objective : Objectives)
1255 if(ActiveQuest.ObjectiveIDs.Contains(Objective.ObjectiveID))
1257 if(ActiveQuest.GetUniqueID().GetUniqueNumber() == Objective.GetUniqueID().GetUniqueNumber())
1259 Objective.StartObjective(
Owner, ActiveQuest.GetTotalProgress());
1266 for(
auto& Objective : Objectives)
1268 if(Objective.GetUniqueID().IsUnique()){
continue;}
1269 if(ActiveQuest.GetUniqueID().GetUniqueNumber() == Objective.GetUniqueID().GetUniqueNumber())
1271 Objective.StartObjective(
Owner);
1281 bool bCompleted =
false;
1286 if(Objective.GetIsComplete() || Objective.GetIsActive() ==
false){
continue;}
1288 if(ObjectiveID == Objective.ObjectiveID)
1290 const bool bFinishedObjective = Objective.AddProgress(Amount);
1291 if(bCompleted ==
false)
1293 bCompleted = bFinishedObjective;
1302 bool bCompleted =
false;
1307 if(Objective.GetIsComplete() || Objective.GetIsActive() ==
false){
continue;}
1309 if(ObjectiveID == Objective.GetUniqueID())
1311 bCompleted = Objective.AddProgress(Amount);
1319 bool bCompleted =
false;
1324 if(Objective.GetIsComplete() || Objective.GetIsActive() ==
false){
continue;}
1326 if(ObjectiveID == Objective.ObjectiveID)
1328 bCompleted = Objective.AddFailProgress(Amount);
1335 bool bCompleted =
false;
1340 if(Objective.GetIsComplete() || Objective.GetIsActive() ==
false){
continue;}
1342 if(ObjectiveID == Objective.GetUniqueID())
1344 bCompleted = Objective.AddFailProgress(Amount);
1353 for(
const auto& Quest : ActiveQuests)
1355 if(Quest.QuestID == QuestID)
1357 ObjectiveIDs = Quest.ObjectiveIDs;
1365 for(
const auto& Quest : ActiveQuests)
1367 if(Quest.QuestID == QuestID)
1369 ObjectiveIDs = Quest.GetActiveObjectiveIDs();
1378 for(
const auto& Quest : ActiveQuests)
1380 if(Quest.GetUniqueID() == QuestID)
1382 ObjectiveIDs = Quest.GetActiveObjectiveIDsWithMarkers();
1390 for(
const auto& Objective : Objectives)
1392 if(Objective.ObjectiveID == ObjectiveID)
1394 return Objective.bHasWorldMarker;
1401 for(int32 i = 0; i < ActiveQuests.Num(); i++)
1403 if(ActiveQuests[i].GetUniqueID() == QuestInfo.
GetUniqueID())
1413 for(int32 i = 0; i < ActiveQuests.Num(); i++)
1415 if(ActiveQuests[i].GetUniqueID() == QuestID)
1433 TArray<FString> ObjectiveIDs;
1434 bool bFound =
false;
1435 for(int32 i = 0; i < ActiveQuests.Num(); i++)
1437 if(ActiveQuests[i].GetUniqueID() == QuestInfo.
GetUniqueID())
1440 ObjectiveIDs = ActiveQuests[Index].ObjectiveIDs;
1447 ActiveQuests.RemoveAt(Index);
1448 CheckObjectives(ObjectiveIDs);
1469 for(
const auto& ObjectiveID : ObjectiveIDs)
1472 bool bUsedInOtherQuest =
false;
1476 if(Quest.ObjectiveIDs.Contains(ObjectiveID))
1478 bUsedInOtherQuest =
true;
1481 if(bUsedInOtherQuest)
1497 TArray<FString> ObjectiveIDs;
1500 ObjectiveIDs.Append(Quest.ObjectiveIDs);
1510 TArray<FString> QuestsToBeAdded;
1513 if(QuestID == Quest.QuestID)
1515 QuestsToBeAdded.Append(Quest.QuestsToBeAddedAfterCompletion);
1518 return QuestsToBeAdded;
1524 if(QuestID == Quest.QuestID)
1526 return Quest.QuestName;
1534 TArray<FString> ActiveQuestIDs;
1537 ActiveQuestIDs.Add(Quest.QuestID);
1539 return ActiveQuestIDs;
1543 TArray<FString> ActiveObjectiveIDs;
1544 for (
const auto& Objective: Objectives)
1546 ActiveObjectiveIDs.Add(Objective.ObjectiveID);
1548 return ActiveObjectiveIDs;
1557 for(
const auto& Quest : ActiveQuests)
1559 if(Quest.GetUniqueID() == QuestID)
1569 for(
const auto& Quest : ActiveQuests)
1571 if(Quest.QuestID == QuestID)
1573 return Quest.GetIsActive();
1580 for(
const auto& Quest : ActiveQuests)
1582 if(Quest.GetUniqueID() == QuestID)
1584 return Quest.GetIsActive();
1591 if(ActiveQuests.IsValidIndex(QuestIndex))
1593 return ActiveQuests[QuestIndex].GetIsActive();
1600 if(ActiveQuests.IsValidIndex(QuestIndex))
1602 QuestInfo = ActiveQuests[QuestIndex];
1609 if(ActiveQuests.IsValidIndex(QuestIndex))
1611 QuestID = ActiveQuests[QuestIndex].GetUniqueID();
1619 for(
const auto& Quest : ActiveQuests)
1621 if(Quest.QuestID == QuestID)
1623 return Quest.GetQuestStatus();
1626 return EQuestStatus::NotStarted;
1635 SaveQuestTimes(
Owner);
1636 SaveObjectiveTimes(
Owner);
1640 for(
auto& Quest : ActiveQuests)
1642 if(Quest.GetIsActive())
1644 Quest.ResumeFromElapsedTime();
1647 for(
auto& Objective : Objectives)
1649 if(Objective.GetIsActive())
1651 Objective.ResumeFromElapsedTime();
1659 for(
auto& OldQuest : ActiveQuests)
1661 if(OldQuest.QuestID == UpdatedQuestInfo.
QuestID)
1663 FQuestInfo NewQuestDetails = UpdatedQuestInfo;
1664 NewQuestDetails.
Status = OldQuest.Status;
1665 OldQuest = NewQuestDetails;
1672 for(
auto& OldObjective : Objectives)
1674 if(OldObjective.ObjectiveID == UpdatedObjectiveInfo.
ObjectiveID)
1678 OldObjective = NewObjectiveDetails;
1683 Objectives.Add(UpdatedObjectiveInfo);
1711 for(
auto& Quest : ActiveQuests)
1713 if(Quest.GetUniqueID() == Outcome.
QuestID)
1717 case EQuestStatus::NotStarted:
1718 Quest.SetStatus(Outcome.
Outcome);
1720 case EQuestStatus::Active:
1721 Quest.SetStatus(Outcome.
Outcome);
1723 case EQuestStatus::Completed:
1724 Quest.SetStatus(Outcome.
Outcome);
1725 Outcome.
Reward = Quest.GetFullQuestReward();
1727 case EQuestStatus::Failed:
1728 if(Quest.bCanQuestFail)
1730 Outcome.
Reward = Quest.GetFullQuestReward();
1731 Quest.SetStatus(Outcome.
Outcome);
1738 case EQuestStatus::Abandoned:
1739 if(Quest.bCanQuestBeAbandoned)
1741 Quest.SetStatus(Outcome.
Outcome);
1748 case EQuestStatus::NotAvailable:
1749 Quest.SetStatus(Outcome.
Outcome);
1760 TArray<FQuestInfo> FilteredQuests;
1761 for(
auto& Quest : ActiveQuests)
1763 if(Quest.GetQuestStatus() == QuestFilter)
1765 FilteredQuests.Add(Quest);
1768 return FilteredQuests;
1779 for(
auto& ActiveQuest : ActiveQuests)
1781 ActiveQuest.SaveQuestTime(
Owner);
1786 for(
auto& Objective : Objectives)
1788 Objective.SaveObjectiveTime(
Owner);
1792 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=
"General")
static int32 XP_PER_LEVEL
Definition BaseData.h:707
static int32 MAX_SKILL_LEVEL
Definition BaseData.h:706
@ Failed
Definition InteractionData.h:29
DECLARE_STATS_GROUP(TEXT("LineOfSight Stat Group"), STATGROUP_LineOfSight, STATCAT_Advanced)
DECLARE_CYCLE_STAT(TEXT("Player Component"), STATGROUP_Quests_PlayerComponent, STATGROUP_Quests)
EFilterQuestType
Definition QuestData.h:28
FORCEINLINE uint32 GetTypeHash(const FQuestInfo &QuestInfo)
Definition QuestData.h:1076
EQuestStatus
Definition QuestData.h:57
DECLARE_LOG_CATEGORY_CLASS(LogQuestSystem, Display, All)
EQuestLocation
Definition QuestData.h:51
Definition QuestData.h:1117
bool AddObjectiveToQuests(const FQuestObjectives *Objective)
Definition QuestData.h:1179
bool GetQuestIndex(const FQuestInfo &QuestInfo, int32 &Index) const
Definition QuestData.h:1399
bool GetQuestActiveObjectivesIDs(const FString &QuestID, TArray< FString > &ObjectiveIDs) const
Definition QuestData.h:1363
bool AddObjectiveAmount(const FUniqueID &ObjectiveID, const int32 Amount)
Definition QuestData.h:1300
TArray< FString > GetQuestsToBeAddedAfterCompletion(const FString &QuestID)
Definition QuestData.h:1508
void ResumeQuestsAndObjectives()
Definition QuestData.h:1638
TArray< FQuestInfo > FilterQuests(const EQuestStatus QuestFilter)
Definition QuestData.h:1758
int32 StartQuest(const UObject *Owner, FQuestInfo &QuestInfo)
Definition QuestData.h:1222
bool GetIsQuestActive(const FUniqueID &QuestID) const
Definition QuestData.h:1578
bool UpdateObjectiveDetails(const FQuestObjectives &UpdatedObjectiveInfo)
Definition QuestData.h:1669
void CheckObjectives(TArray< FString > ObjectiveIDs)
Definition QuestData.h:1467
bool RemoveQuest(const FQuestInfo &QuestInfo)
Definition QuestData.h:1430
void CheckAllObjectives()
Definition QuestData.h:1495
bool AddObjective(const FQuestObjectives &ObjectiveInfo)
Definition QuestData.h:1153
TArray< FString > GetQuestIDs()
Definition QuestData.h:1532
bool GetActiveQuest(const FUniqueID &QuestID, FQuestInfo &QuestInfo)
Definition QuestData.h:1555
void SaveQuestTimes(const UObject *Owner)
Definition QuestData.h:1777
void SaveObjectiveTimes(const UObject *Owner)
Definition QuestData.h:1784
bool GetDoesObjectiveHaveWorldMarker(const FString &ObjectiveID) const
Definition QuestData.h:1388
bool GetIsQuestActive(const FString &QuestID) const
Definition QuestData.h:1567
TArray< FString > GetObjectiveIDs()
Definition QuestData.h:1541
bool UpdateQuestStatus(FQuestOutcome &Outcome)
Definition QuestData.h:1709
bool GetQuestIndex(const FUniqueID &QuestID, int32 &Index) const
Definition QuestData.h:1411
EQuestStatus GetQuestStatus(const FString &QuestID) const
Definition QuestData.h:1617
void UpdateQuestDetails(const FQuestInfo &UpdatedQuestInfo)
Check if this is worth doing with this or just putting in GameState component.
Definition QuestData.h:1657
const FQuestObjectives * GetQuestObjectivePtr(const FUniqueID &ObjectiveID) const
Definition QuestData.h:1550
bool GetQuestID(const int32 QuestIndex, FUniqueID &QuestID) const
Definition QuestData.h:1607
bool GetQuest(const int32 QuestIndex, FQuestInfo &QuestInfo) const
Definition QuestData.h:1598
void SaveTimes(const UObject *Owner)
Definition QuestData.h:1633
bool IsValid() const
Definition QuestData.h:1772
bool AddObjectiveFailAmount(const FUniqueID &ObjectiveID, const int32 Amount)
Definition QuestData.h:1333
FString GetQuestName(const FString &QuestID)
Definition QuestData.h:1520
bool GetIsQuestActive(const int32 QuestIndex) const
Definition QuestData.h:1589
bool GetQuestActiveObjectivesIDsWithMarkers(const FUniqueID &QuestID, TArray< FString > &ObjectiveIDs) const
Definition QuestData.h:1376
bool AddObjectiveAmount(const FString &ObjectiveID, const int32 Amount)
Definition QuestData.h:1279
int32 GetLevel() const
Definition QuestData.h:1628
int32 GetNewUniqueID(const FString &QuestID) const
Definition QuestData.h:1206
void StartObjectives(const UObject *Owner)
Definition QuestData.h:1246
bool AddObjectiveFailAmount(const FString &ObjectiveID, const int32 Amount)
Definition QuestData.h:1317
bool GetQuestObjectivesIDs(const FString &QuestID, TArray< FString > &ObjectiveIDs) const
Definition QuestData.h:1351
Definition QuestData.h:121
Definition QuestData.h:798
TArray< FString > GetActiveObjectiveIDs() const
Definition QuestData.h:990
TArray< FQuestObjectives > GetCompletedObjectives() const
Definition QuestData.h:977
void ResumeFromElapsedTime()
Definition QuestData.h:961
bool bUniqueObjectives
Definition QuestData.h:813
bool GetIsQuestInTime() const
Definition QuestData.h:966
float GetElapsedTime() const
Definition QuestData.h:942
bool GetCanBeCompleted(const UObject *Owner, EQuestStatus &QuestOutcome)
Definition QuestData.h:1029
int32 GetTotalRequiredProgress() const
Definition QuestData.h:937
bool operator!=(const FUniqueID &OtherID) const
Definition QuestData.h:887
bool GetIsActive() const
Definition QuestData.h:906
FUniqueID GetUniqueID() const
Definition QuestData.h:918
TArray< FString > GetNotStartedObjectiveIDs() const
Definition QuestData.h:994
int32 GetObjectivesNum() const
Definition QuestData.h:928
TArray< FString > ObjectiveIDs
Definition QuestData.h:810
bool operator==(const FQuestInfo &Other) const
Definition QuestData.h:868
bool operator==(const FUniqueID &OtherID) const
Definition QuestData.h:882
FQuestInfoStatus Status
Definition QuestData.h:836
TArray< FQuestObjectives > GetObjectives() const
Definition QuestData.h:1012
bool IsValid() const
Definition QuestData.h:893
static FQuestInfo Empty()
Definition QuestData.h:900
void SetStatus(const EQuestStatus NewQuestStatus)
Definition QuestData.h:924
void SetUniqueID(const int32 ID)
Definition QuestData.h:914
FString QuestID
Definition QuestData.h:802
bool operator!=(const FQuestInfo &Other) const
Definition QuestData.h:875
FQuestReward GetFullQuestReward() const
Definition QuestData.h:1002
void StartQuest(const UObject *Owner)
Definition QuestData.h:952
int32 GetTotalProgress() const
Definition QuestData.h:932
EQuestStatus GetQuestStatus() const
Definition QuestData.h:910
float SaveQuestTime(const UObject *Owner)
Definition QuestData.h:956
float GetStartTime() const
Definition QuestData.h:946
FQuestInfo(const FQuestInfoStatus &QuestStatus)
Definition QuestData.h:862
TArray< FString > GetActiveObjectiveIDsWithMarkers() const
Definition QuestData.h:998
Definition QuestData.h:584
void ResumeFromElapsedTime()
Definition QuestData.h:661
bool GetCanBeCompleted(const UObject *Owner, EQuestStatus &QuestOutcome)
Definition QuestData.h:676
TArray< FString > GetActiveObjectiveIDs() const
Definition QuestData.h:726
void SetUniqueID(const int32 ID)
Definition QuestData.h:720
bool GetIsActive() const
Definition QuestData.h:600
TArray< FString > GetActiveObjectiveIDsWithMarkers() const
Definition QuestData.h:757
int32 GetTotalRequiredProgress() const
Definition QuestData.h:636
int32 GetTotalProgress() const
Definition QuestData.h:622
TArray< FString > GetAllObjectiveIDs() const
Definition QuestData.h:608
float SaveQuestTime(const UObject *Owner)
Definition QuestData.h:649
float GetElapsedTime() const
Definition QuestData.h:708
TArray< FString > GetNotStartedObjectiveIDs() const
Definition QuestData.h:741
void SetStatus(const EQuestStatus NewQuestStatus)
Definition QuestData.h:596
float GetStartTime() const
Definition QuestData.h:712
TArray< const FQuestObjectives * > ObjectiveReferences
Definition QuestData.h:776
int32 GetObjectivesNum() const
Definition QuestData.h:618
bool GetDidCompleteInTime(const float TimeToComplete) const
Definition QuestData.h:666
int32 GetUniqueID() const
Definition QuestData.h:716
EQuestStatus GetQuestStatus() const
Definition QuestData.h:604
Definition QuestData.h:140
Definition QuestData.h:361
void SetUniqueID(const int32 ID)
Definition QuestData.h:457
FUniqueID GetUniqueID() const
Definition QuestData.h:466
FString ObjectiveID
Definition QuestData.h:365
float GetCurrentProgressPercent() const
Definition QuestData.h:496
bool operator!=(const FUniqueID &OtherID) const
Definition QuestData.h:563
EQuestStatus GetStatus() const
Definition QuestData.h:543
void StartObjective(const UObject *Owner)
Definition QuestData.h:430
bool GetIsActive() const
Definition QuestData.h:517
bool operator==(const FUniqueID &OtherID) const
Definition QuestData.h:557
int32 GetFailProgress() const
Definition QuestData.h:491
bool GetIsStarted() const
Definition QuestData.h:521
float GetStartTime() const
Definition QuestData.h:479
bool GetIsFinished() const
Definition QuestData.h:530
float GetElapsedTime() const
Definition QuestData.h:475
bool GetIsNotYetStarted() const
Definition QuestData.h:525
void StartObjective(const UObject *Owner, const int32 QuestProgress)
Definition QuestData.h:439
FQuestObjectivesStatus ObjectiveStatus
Definition QuestData.h:410
int32 GetCurrentProgress() const
Definition QuestData.h:487
bool operator!=(const FQuestObjectives &Other) const
Definition QuestData.h:552
bool AddProgress(const int32 Amount)
Definition QuestData.h:421
float SaveObjectiveTime(const UObject *Owner)
Definition QuestData.h:452
bool GetIsFailed() const
Definition QuestData.h:513
bool GetDidCompleteInTime() const
Definition QuestData.h:483
bool GetIsSuccessful() const
Definition QuestData.h:534
bool AddFailProgress(const int32 Amount)
Definition QuestData.h:426
float GetFailProgressPercent() const
Definition QuestData.h:500
bool operator==(const FQuestObjectives &Other) const
Definition QuestData.h:548
void ResumeFromElapsedTime()
Definition QuestData.h:448
bool GetIsComplete() const
Definition QuestData.h:539
bool CanStart(const int32 TotalProgress) const
Definition QuestData.h:505
Definition QuestData.h:186
bool GetIsFailed(const int32 RequiredFailProgress) const
Definition QuestData.h:236
bool AddProgress(const int32 Amount, const int32 RequiredProgress)
Definition QuestData.h:291
int32 GetFailProgress() const
Definition QuestData.h:324
float SaveObjectiveTime(const UObject *Owner)
Definition QuestData.h:221
bool GetIsStarted() const
Definition QuestData.h:281
bool IsFinished(const int32 RequiredFailProgress, const int32 RequiredProgress) const
Definition QuestData.h:255
bool AddFailProgress(const int32 Amount, const int32 RequiredFailProgress)
Definition QuestData.h:306
EQuestStatus GetStatus() const
Definition QuestData.h:273
float GetStartTime() const
Definition QuestData.h:195
int32 GetUniqueID() const
Definition QuestData.h:332
bool GetIsNotYetStarted() const
Definition QuestData.h:285
bool GetDidCompleteInTime(const bool bObjectiveTimed=false, const float TimeToComplete=0.0f) const
Not sure if works becuase it needs to stop counting once objective is complete //.
Definition QuestData.h:245
bool IsActive() const
Definition QuestData.h:277
int32 GetCurrentProgress() const
Definition QuestData.h:320
void ResumeFromElapsedTime()
Definition QuestData.h:231
void StartObjective(const UObject *Owner)
Definition QuestData.h:200
bool IsSuccessful(const int32 RequiredFailProgress, const int32 RequiredProgress) const
Definition QuestData.h:259
bool Complete(const int32 RequiredFailProgress, const int32 RequiredProgress) const
Definition QuestData.h:264
void SetObjectiveNotYetStarted()
Definition QuestData.h:217
void SetUniqueID(const int32 NewUID)
Definition QuestData.h:328
Definition QuestData.h:1084
FQuestReward Reward
Definition QuestData.h:1096
EQuestStatus Outcome
Definition QuestData.h:1094
FQuestOutcome(const TArray< FQuestObjectives > &NewCompletedObjectives, const EQuestStatus FinishedOutcome)
Definition QuestData.h:1107
TArray< FQuestObjectives > CompletedObjectives
Definition QuestData.h:1092
FString QuestName
Definition QuestData.h:1090
FQuestOutcome(const TArray< FQuestObjectives > &NewCompletedObjectives)
Definition QuestData.h:1103
FUniqueID QuestID
Definition QuestData.h:1088
Definition QuestData.h:167
int32 Experience
Definition QuestData.h:171
int32 Credits
Definition QuestData.h:173
Definition BaseData.h:253
FString ID
Definition BaseData.h:257
void SetUniqueNumber(const int32 NewID)
Definition BaseData.h:259
int32 GetUniqueNumber() const
Definition BaseData.h:263