Files
ProjectEleri/Source/ProjectEleri/DialogueSystem/SpeechDataAsset.h

115 lines
4.3 KiB
C++

// 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<USpeechDataAsset> NextSpeechDataAsset;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ForceInlineRow, Categories = "Dialogue|Event"))
FGameplayTag GameplayTag;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Eleri|Event Requirment")
TArray<FEventRequirement> 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<FEventRequirement> EventRequirements;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Eleri|Speech", meta = (AllowedClasses = "/Script/ProjectEleri.NpcBaseCharacter"))
TSoftClassPtr<AActor> 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<FLineData> DialogueLines;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Eleri|Options")
TArray<FPlayerSpeakToDialogue> PlayerSpeechMap;
UFUNCTION()
bool TestRequirements(const UWorld* World);
UFUNCTION(BlueprintCallable, Category = "Eleri|Options")
FText GetFormattedDialogueLine(const int32 Index, const TMap<FString, FText> ReplacementMap);
UFUNCTION(BlueprintPure, Category = "Eleri|Options")
static FText ReplaceTextInLine(const FText& Text, TMap<FString, FText> ReplacementMap);
#if WITH_EDITOR
virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override;
#endif
};