124 lines
3.7 KiB
C++
124 lines
3.7 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
#include "AC_PlayerDialogueInterpreter.h"
|
|
|
|
#include "EndlessVendetta/EndlessVendettaCharacter.h"
|
|
|
|
|
|
// Sets default values for this component's properties
|
|
UAC_PlayerDialogueInterpreter::UAC_PlayerDialogueInterpreter()
|
|
{
|
|
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
|
|
// off to improve performance if you don't need them.
|
|
PrimaryComponentTick.bCanEverTick = false;
|
|
|
|
// ...
|
|
}
|
|
|
|
|
|
// Called when the game starts
|
|
void UAC_PlayerDialogueInterpreter::BeginPlay()
|
|
{
|
|
Super::BeginPlay();
|
|
|
|
// ...
|
|
}
|
|
|
|
FDialogueCharacter* UAC_PlayerDialogueInterpreter::GetCharacterSpeakingFromEnum(ECharacterSpeaking CharacterSpeakingEnum) const
|
|
{
|
|
switch (CharacterSpeakingEnum)
|
|
{
|
|
case ECharacterSpeaking::Character1:
|
|
return &CurrentDialogueTree->Character1;
|
|
case ECharacterSpeaking::Character2:
|
|
return &CurrentDialogueTree->Character2;
|
|
case ECharacterSpeaking::Character3:
|
|
return &CurrentDialogueTree->Character3;
|
|
case ECharacterSpeaking::Character4:
|
|
return &CurrentDialogueTree->Character4;
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
// Called every frame
|
|
void UAC_PlayerDialogueInterpreter::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
|
|
{
|
|
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
|
|
|
// ...
|
|
}
|
|
|
|
void UAC_PlayerDialogueInterpreter::StartDialogue(UDialogueTree* DialogueTree)
|
|
{
|
|
CurrentDialogueTree = DialogueTree;
|
|
CurrentTextNode = Cast<UDialogueTextNode>(DialogueTree->RootNodes[0]->ChildrenNodes[0]);
|
|
if (!IsValid(CurrentTextNode)) return;
|
|
CurrentCharacterSpeaking = *GetCharacterSpeakingFromEnum(CurrentTextNode->DialogueCharacterSpeaking);
|
|
OnStartDialogue.Broadcast(CurrentTextNode);
|
|
|
|
if (APlayerController* PlayerController = GetWorld()->GetFirstPlayerController())
|
|
{
|
|
FInputModeUIOnly InputModeData;
|
|
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
|
|
PlayerController->SetInputMode(InputModeData);
|
|
PlayerController->bShowMouseCursor = true;
|
|
}
|
|
}
|
|
|
|
void UAC_PlayerDialogueInterpreter::NextDialogue()
|
|
{
|
|
if (!IsValid(CurrentTextNode)) return;
|
|
if (CurrentTextNode->ChildrenNodes.Num() == 0)
|
|
{
|
|
EndDialogue();
|
|
return;
|
|
}
|
|
if (Cast<UDialogueChoiceNode>(CurrentTextNode->ChildrenNodes[0]))
|
|
{
|
|
CurrentChoiceNode = Cast<UDialogueChoiceNode>(CurrentTextNode->ChildrenNodes[0]);
|
|
OnChoiceDialogue.Broadcast(CurrentChoiceNode);
|
|
CurrentTextNode = nullptr;
|
|
}
|
|
else
|
|
{
|
|
CurrentTextNode = Cast<UDialogueTextNode>(CurrentTextNode->ChildrenNodes[0]);
|
|
CurrentCharacterSpeaking = *GetCharacterSpeakingFromEnum(CurrentTextNode->DialogueCharacterSpeaking);
|
|
OnNextDialogue.Broadcast(CurrentTextNode);
|
|
CurrentChoiceNode = nullptr;
|
|
}
|
|
}
|
|
|
|
void UAC_PlayerDialogueInterpreter::MakeChoiceDialogue(const int Choice)
|
|
{
|
|
if (!IsValid(CurrentChoiceNode)) return;
|
|
if (Cast<UDialogueChoiceNode>(CurrentChoiceNode->ChildrenNodes[Choice]))
|
|
{
|
|
CurrentChoiceNode = Cast<UDialogueChoiceNode>(CurrentChoiceNode->ChildrenNodes[Choice]);
|
|
OnChoiceDialogue.Broadcast(CurrentChoiceNode);
|
|
CurrentTextNode = nullptr;
|
|
}
|
|
else
|
|
{
|
|
CurrentTextNode = Cast<UDialogueTextNode>(CurrentChoiceNode->ChildrenNodes[Choice]);
|
|
CurrentCharacterSpeaking = *GetCharacterSpeakingFromEnum(CurrentTextNode->DialogueCharacterSpeaking);
|
|
OnNextDialogue.Broadcast(CurrentTextNode);
|
|
CurrentChoiceNode = nullptr;
|
|
}
|
|
}
|
|
|
|
void UAC_PlayerDialogueInterpreter::EndDialogue()
|
|
{
|
|
CurrentChoiceNode = nullptr;
|
|
CurrentTextNode = nullptr;
|
|
CurrentCharacterSpeaking = FDialogueCharacter();
|
|
OnEndDialogue.Broadcast();
|
|
|
|
if (APlayerController* PlayerController = GetWorld()->GetFirstPlayerController())
|
|
{
|
|
const FInputModeGameAndUI InputModeData;
|
|
PlayerController->SetInputMode(InputModeData);
|
|
PlayerController->bShowMouseCursor = false;
|
|
}
|
|
}
|