115 lines
4.3 KiB
C++
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
|
|
};
|