// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Engine/DataAsset.h" #include "ProjectEleri/GameEventSystem/GameEventDataAsset.h" #include "QuestSystem/QuestTypes.h" #include "SpeechDataAsset.generated.h" struct FLineData; class USpeechDataAsset; UENUM(BlueprintType) enum class EEventRequirementType : uint8 { Event, Quest, Item, Max UMETA(Hidden) }; USTRUCT(BlueprintType) struct FEventRequirement { GENERATED_BODY() UPROPERTY(EditDefaultsOnly, BlueprintReadWrite) EEventRequirementType RequirementType; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition = "RequirementType == EEventRequirementType::Event", EditConditionHides, MetaClass = "/Script/ProjectEleri.GameEventDataAsset")) FSoftObjectPath EventAsset; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition = "RequirementType == EEventRequirementType::Event", EditConditionHides)) EEventStage Stage; // if this is false the event must not be unlocked UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition = "RequirementType == EEventRequirementType::Event", EditConditionHides)) bool bMustAchieveEvent = true; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition = "RequirementType == EEventRequirementType::Quest", EditConditionHides, GameplayTagFilter = "Quests")) FGameplayTag QuestTag; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition = "RequirementType == EEventRequirementType::Quest", EditConditionHides, GameplayTagFilter = "Quests")) EQuestStatus QuestStatus; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition = "RequirementType == EEventRequirementType::Quest", EditConditionHides, GameplayTagFilter = "Quests")) bool bEqual = true; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition = "RequirementType == EEventRequirementType::Item", EditConditionHides, Categories = "Items")) FPrimaryAssetId Item; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta = (EditCondition = "RequirementType == EEventRequirementType::Item", EditConditionHides)) int32 Stacks = 1; bool TestRequirement(const UObject* WorldContext) const; }; USTRUCT(BlueprintType) struct FPlayerSpeakToDialogue { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadWrite) bool bEndDialogueAfterSelecting = true; UPROPERTY(EditAnywhere, BlueprintReadWrite) FText PlayerSpeak; UPROPERTY(EditAnywhere, BlueprintReadWrite) TSoftObjectPtr NextSpeechDataAsset; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ForceInlineRow, Categories = "Dialogue|Event")) FGameplayTag GameplayTag; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Eleri|Event Requirment") TArray EventRequirements; bool PassesRequirements(const UObject* WorldContext) const; }; /** * */ UCLASS(BlueprintType) class PROJECTELERI_API USpeechDataAsset : public UDataAsset { GENERATED_BODY() public: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Eleri|Event Requirment") TArray EventRequirements; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Eleri|Speech", meta = (AllowedClasses = "/Script/ProjectEleri.NpcBaseCharacter")) TSoftClassPtr Npc; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Eleri|Speech", meta = (Categories = "Quests")) FGameplayTagContainer StartQuests; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Eleri|Speech") FText PlayerAsk; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Eleri|Speech") bool bIsStartingDialogue; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Eleri|Speech") TArray DialogueLines; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Eleri|Options") TArray PlayerSpeechMap; UFUNCTION() bool TestRequirements(const UWorld* World); UFUNCTION(BlueprintCallable, Category = "Eleri|Options") FText GetFormattedDialogueLine(const int32 Index, const TMap ReplacementMap); UFUNCTION(BlueprintPure, Category = "Eleri|Options") static FText ReplaceTextInLine(const FText& Text, TMap ReplacementMap); #if WITH_EDITOR virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override; #endif };