diff --git a/Content/Blueprints/Combat_UI/CombatCharacter.uasset b/Content/Blueprints/Combat_UI/CombatCharacter.uasset index e2549fb..017cf9c 100644 --- a/Content/Blueprints/Combat_UI/CombatCharacter.uasset +++ b/Content/Blueprints/Combat_UI/CombatCharacter.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4cfb8f22195ddc24190aac87fde22f1ae8d7a945ec921c4425f3b17160d63362 -size 158940 +oid sha256:e139c8980e9de73d4d1274c639429bb451901b34cfa778e41c4e9a274d55ea33 +size 167176 diff --git a/Content/Blueprints/Quests/Quest_Start.uasset b/Content/Blueprints/Quests/Quest_Start.uasset new file mode 100644 index 0000000..c6cb680 --- /dev/null +++ b/Content/Blueprints/Quests/Quest_Start.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24083ce082d9ee2d3ee3999793f3d511279e2c90fae0f31197cdb07cf43b72c7 +size 7432 diff --git a/Source/the_twilight_abyss/BaseItems/InventoryComponent.h b/Source/the_twilight_abyss/BaseItems/InventoryComponent.h index 1ec1fb1..1800160 100644 --- a/Source/the_twilight_abyss/BaseItems/InventoryComponent.h +++ b/Source/the_twilight_abyss/BaseItems/InventoryComponent.h @@ -45,5 +45,4 @@ public: UFUNCTION() void RemoveItem(UEatableItems* Item); - }; diff --git a/Source/the_twilight_abyss/Quest/FWorldState.h b/Source/the_twilight_abyss/Quest/FWorldState.h deleted file mode 100644 index a8bd535..0000000 Binary files a/Source/the_twilight_abyss/Quest/FWorldState.h and /dev/null differ diff --git a/Source/the_twilight_abyss/Quest/Quest.cpp b/Source/the_twilight_abyss/Quest/Quest.cpp index ff166ae..30a51cf 100644 --- a/Source/the_twilight_abyss/Quest/Quest.cpp +++ b/Source/the_twilight_abyss/Quest/Quest.cpp @@ -3,18 +3,45 @@ #include "Quest.h" -bool UQuest::CheckConditions(FJsonObject WorldState) +#include "the_twilight_abyss/BaseItems/InventoryComponent.h" + +bool UQuest::CheckConditions(UWorldState* WorldState) const { - if (Conditions.Values.IsEmpty()) return true; + if (IsValid(Goals)) return true; + if (WorldStateMatch(WorldState, Goals)) return true; return false; } -bool UQuest::CheckPreConditions(FJsonObject WorldState) +bool UQuest::CheckPreConditions(UWorldState* WorldState) const { - if (PreConditions.Values.IsEmpty()) return true; + if (IsValid(PreConditions)) return true; + if (WorldStateMatch(WorldState, PreConditions)) return true; return false; } -void UQuest::ApplyRewards() +void UQuest::ApplyRewards(UInventoryComponent* Inventory) { + for (UBaseItem* Item : Rewards) + { + Inventory->AddItem(Item); + } +} + +bool UQuest::WorldStateMatch(UWorldState* A, UWorldState* B) +{ + for (UBaseItem* Item : B->Items) + { + if (!A->Items.Contains(Item) && Item->StackCount > A->Items[A->Items.Find(Item)]->StackCount) + { + return false; + } + } + for (TTuple Flag : B->QuestFlags) + { + if (!A->QuestFlags.Contains(Flag.Key) || A->QuestFlags[Flag.Key] != Flag.Value) + { + return false; + } + } + return true; } diff --git a/Source/the_twilight_abyss/Quest/Quest.h b/Source/the_twilight_abyss/Quest/Quest.h index acfa2b4..50a249c 100644 --- a/Source/the_twilight_abyss/Quest/Quest.h +++ b/Source/the_twilight_abyss/Quest/Quest.h @@ -3,29 +3,37 @@ #pragma once #include "CoreMinimal.h" -#include "UObject/NoExportTypes.h" -#include "../PlayerTemp/TempCharacter.h" +#include "UWorldState.h" #include "Quest.generated.h" -/** - * - */ -UCLASS() +UENUM(BlueprintType) +enum class EQuestLine : uint8 +{ + Main UMETA(DisplayName="Main"), + Sub UMETA(DisplayName="Sub") +}; + +UCLASS(Abstract, BlueprintType, Blueprintable, EditInlineNew, DefaultToInstanced) class THE_TWILIGHT_ABYSS_API UQuest : public UObject { GENERATED_BODY() + public: + UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) FText Title; + UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) FText Description; - FString QuestLine; - UQuest* ParentQuest; - FJsonObject Conditions; - FJsonObject PreConditions; + UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) + EQuestLine QuestLine; + UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, NoClear, Instanced) + UWorldState* Goals; + UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Instanced) + UWorldState* PreConditions; + UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, NoClear, Instanced) + TArray Rewards; - //TODO: Rewards - - bool CheckConditions(FJsonObject WorldState); - bool CheckPreConditions(FJsonObject WorldState); - void ApplyRewards(); - //TODO: CreateQuest + bool CheckConditions(UWorldState* WorldState) const; + bool CheckPreConditions(UWorldState* WorldState) const; + void ApplyRewards(UInventoryComponent* Inventory); + static bool WorldStateMatch(UWorldState* A, UWorldState* B); }; diff --git a/Source/the_twilight_abyss/Quest/QuestSystem.cpp b/Source/the_twilight_abyss/Quest/QuestSystem.cpp index 828bce0..2860e3c 100644 --- a/Source/the_twilight_abyss/Quest/QuestSystem.cpp +++ b/Source/the_twilight_abyss/Quest/QuestSystem.cpp @@ -20,8 +20,8 @@ UQuestSystem::UQuestSystem() void UQuestSystem::BeginPlay() { Super::BeginPlay(); - - + PlayerInventory = GetOwner()->FindComponentByClass(); + PlayerInventory->OnInventoryUpdated.AddDynamic(this, &UQuestSystem::CheckActiveQuestConditions); } @@ -29,7 +29,6 @@ void UQuestSystem::BeginPlay() void UQuestSystem::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); - } void UQuestSystem::CheckActiveQuestConditions() @@ -38,15 +37,28 @@ void UQuestSystem::CheckActiveQuestConditions() { if (Quest->CheckConditions(GetWorldState())) { + GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Quest Completed!")); CompletedQuests.Add(Quest); - Quest->ApplyRewards(); + Quest->ApplyRewards(PlayerInventory); } } } -FJsonObject UQuestSystem::GetWorldState() +UWorldState* UQuestSystem::GetWorldState() const { - FJsonObject WorldState = FJsonObject(); + UWorldState* WorldState = NewObject(); + WorldState->Items = PlayerInventory->Items; + WorldState->QuestFlags = QuestFlags; return WorldState; } +void UQuestSystem::AddQuest(UQuest* Quest) +{ + ActiveQuests.Add(Quest); +} + +void UQuestSystem::AddQuestFlag(const FString FlagName, const bool FlagValue) +{ + QuestFlags.Add(FlagName, FlagValue); + CheckActiveQuestConditions(); +} diff --git a/Source/the_twilight_abyss/Quest/QuestSystem.h b/Source/the_twilight_abyss/Quest/QuestSystem.h index d105bf4..247ff21 100644 --- a/Source/the_twilight_abyss/Quest/QuestSystem.h +++ b/Source/the_twilight_abyss/Quest/QuestSystem.h @@ -7,6 +7,8 @@ #include "Components/TextBlock.h" #include "Blueprint/UserWidget.h" #include "Quest.h" +#include "UWorldState.h" +#include "../BaseItems/InventoryComponent.h" #include "QuestSystem.generated.h" UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent)) @@ -18,9 +20,11 @@ public: // Sets default values for this component's properties UQuestSystem(); + UPROPERTY(EditAnywhere, BlueprintReadOnly) TArray ActiveQuests; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly) TArray CompletedQuests; - TArray CompletedQuestLines; + UPROPERTY(EditAnywhere) TMap QuestFlags; protected: @@ -36,5 +40,13 @@ public: // Called every frame virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; void CheckActiveQuestConditions(); - FJsonObject GetWorldState(); + UWorldState* GetWorldState() const; + + UFUNCTION(BlueprintCallable) + void AddQuest(UQuest* Quest); + UFUNCTION(BlueprintCallable) + void AddQuestFlag(FString FlagName, bool FlagValue); + +private: + UInventoryComponent* PlayerInventory; }; diff --git a/Source/the_twilight_abyss/Quest/UWorldState.h b/Source/the_twilight_abyss/Quest/UWorldState.h new file mode 100644 index 0000000..1a17f5c Binary files /dev/null and b/Source/the_twilight_abyss/Quest/UWorldState.h differ