108 lines
3.4 KiB
C++
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;
|
|
}
|