Files
ProjectEleri/Source/ProjectEleri/DialogueSystem/SpeechDataAsset.cpp

108 lines
3.4 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "SpeechDataAsset.h"
#include <ProjectEleri/GameEventSystem/GameEventSubsystem.h>
#include <Kismet/GameplayStatics.h>
#include "InventoryComponent.h"
#include "Speech.h"
#include "Misc/DataValidation.h"
#include "QuestSystem/QuestSubsystem.h"
bool FEventRequirement::TestRequirement(const UObject* WorldContext) const
{
const UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContext);
if (!GameInstance) return false;
switch (RequirementType)
{
case EEventRequirementType::Event:
{
const UGameEventSubsystem* GameEventSubsystem = GameInstance->GetSubsystem<UGameEventSubsystem>();
if (!GameEventSubsystem) return false;
const EEventStage EventStage = GameEventSubsystem->GetEventStage(EventAsset);
return bMustAchieveEvent?
EventStage >= Stage :
EventStage < Stage;
}
case EEventRequirementType::Quest:
{
const UQuestSubsystem* QuestSubsystem = GameInstance->GetSubsystem<UQuestSubsystem>();
if (!QuestSubsystem) return false;
const EQuestStatus CurrentQuestStatus = QuestSubsystem->GetQuestStatus(QuestTag);
const bool bMeetsReq = CurrentQuestStatus >= QuestStatus;
return bMeetsReq == bEqual;
}
case EEventRequirementType::Item:
{
const UInventoryComponent* InventoryComponent = UMainBlueprintFunctionLibrary::GetPlayerInventory(WorldContext);
if (!InventoryComponent) return false;
if (InventoryComponent->GetStackForItem(Item) < Stacks)
return false;
return true;
}
case EEventRequirementType::Max:
break;
}
return true;
}
bool FPlayerSpeakToDialogue::PassesRequirements(const UObject* WorldContext) const
{
for (const FEventRequirement& Requirement : EventRequirements)
{
if (!Requirement.TestRequirement(WorldContext)) return false;
}
return true;
}
bool USpeechDataAsset::TestRequirements(const UWorld* World)
{
for (const FEventRequirement& EventReq : EventRequirements)
{
if (!EventReq.TestRequirement(World))
return false;
}
return true;
}
FText USpeechDataAsset::GetFormattedDialogueLine(const int32 Index, const TMap<FString, FText> ReplacementMap)
{
if (DialogueLines.Num() - 1 < Index || Index < 0)
return FText();
return ReplaceTextInLine(DialogueLines[Index].DialogueLine, ReplacementMap);
}
FText USpeechDataAsset::ReplaceTextInLine(const FText& Text, TMap<FString, FText> ReplacementMap)
{
FFormatNamedArguments Args;
for (const TTuple<FString, FText>& ReplacementPair : ReplacementMap)
{
Args.Add(ReplacementPair.Key, ReplacementPair.Value);
}
return FText::Format(Text, Args);
}
EDataValidationResult USpeechDataAsset::IsDataValid(class FDataValidationContext& Context) const
{
EDataValidationResult Result = Super::IsDataValid(Context);
if (bIsStartingDialogue && EventRequirements.IsEmpty())
{
Context.AddError(FText::FromString(TEXT("Cannot be a starting dialogue without an event requirement")));
Result = EDataValidationResult::Invalid;
}
return Result;
}