123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 |
- // Fill out your copyright notice in the Description page of Project Settings.
- #include "Condition/EzAbilityCommonConditions.h"
- #include "EzAbilityContext.h"
- #include "EzAbilityNodeDescriptionHelpers.h"
- #define LOCTEXT_NAMESPACE "Ability"
- namespace UE::EzAbility::Conditions
- {
- template<typename T>
- bool CompareNumbers(const T Left, const T Right, const EGenericCheck Operator)
- {
- switch (Operator)
- {
- case EGenericCheck::Equal:
- return Left == Right;
- break;
- case EGenericCheck::NotEqual:
- return Left != Right;
- break;
- case EGenericCheck::Less:
- return Left < Right;
- break;
- case EGenericCheck::LessOrEqual:
- return Left <= Right;
- break;
- case EGenericCheck::Greater:
- return Left > Right;
- break;
- case EGenericCheck::GreaterOrEqual:
- return Left >= Right;
- break;
- default:
- ensureMsgf(false, TEXT("Unhandled operator %d"), Operator);
- return false;
- break;
- }
- }
- }
- //----------------------------------------------------------------------//
- // FAbilityCompareIntCondition
- //----------------------------------------------------------------------//
- bool FAbilityCompareIntCondition::TestCondition(FEzAbilityContext& Context) const
- {
- const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
- const bool bResult = UE::EzAbility::Conditions::CompareNumbers<int32>(InstanceData.Left, InstanceData.Right, Operator);
- return bResult ^ bInvert;
- }
- #if WITH_EDITOR
- FText FAbilityCompareIntCondition::GetDescription(const FGuid& ID, FEzAbilityDataView InstanceDataView, const IEzAbilityBindingLookup& BindingLookup, EEzAbilityNodeFormatting Formatting) const
- {
- const FInstanceDataType* InstanceData = InstanceDataView.GetPtr<FInstanceDataType>();
- check(InstanceData);
- FText LeftValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Left)), Formatting);
- if (LeftValue.IsEmpty())
- {
- LeftValue = FText::AsNumber(InstanceData->Left);
- }
- FText RightValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Right)), Formatting);
- if (RightValue.IsEmpty())
- {
- RightValue = FText::AsNumber(InstanceData->Right);
- }
- const FText InvertText = UE::EzAbility::DescHelpers::GetInvertText(bInvert, Formatting);
- const FText OperatorText = UE::EzAbility::DescHelpers::GetOperatorText(Operator, Formatting);
- return FText::FormatNamed(LOCTEXT("CompareInt", "{EmptyOrNot}{Left} {Op} {Right}"),
- TEXT("EmptyOrNot"), InvertText,
- TEXT("Left"),LeftValue,
- TEXT("Op"), OperatorText,
- TEXT("Right"),RightValue);
- }
- #endif
- //----------------------------------------------------------------------//
- // FAbilityCompareFloatCondition
- //----------------------------------------------------------------------//
- bool FAbilityCompareFloatCondition::TestCondition(FEzAbilityContext& Context) const
- {
- const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
- const bool bResult = UE::EzAbility::Conditions::CompareNumbers<double>(InstanceData.Left, InstanceData.Right, Operator);
- return bResult ^ bInvert;
- }
- #if WITH_EDITOR
- FText FAbilityCompareFloatCondition::GetDescription(const FGuid& ID, FEzAbilityDataView InstanceDataView, const IEzAbilityBindingLookup& BindingLookup, EEzAbilityNodeFormatting Formatting) const
- {
- const FInstanceDataType* InstanceData = InstanceDataView.GetPtr<FInstanceDataType>();
- check(InstanceData);
- FNumberFormattingOptions Options;
- Options.MinimumFractionalDigits = 1;
- Options.MaximumFractionalDigits = 3;
- FText LeftValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Left)), Formatting);
- if (LeftValue.IsEmpty())
- {
- LeftValue = FText::AsNumber(InstanceData->Left, &Options);
- }
- FText RightValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Right)), Formatting);
- if (RightValue.IsEmpty())
- {
- RightValue = FText::AsNumber(InstanceData->Right, &Options);
- }
- const FText InvertText = UE::EzAbility::DescHelpers::GetInvertText(bInvert, Formatting);
- const FText OperatorText = UE::EzAbility::DescHelpers::GetOperatorText(Operator, Formatting);
- return FText::FormatNamed(LOCTEXT("CompareFloat", "{EmptyOrNot}{Left} {Op} {Right}"),
- TEXT("EmptyOrNot"), InvertText,
- TEXT("Left"),LeftValue,
- TEXT("Op"), OperatorText,
- TEXT("Right"),RightValue);
- }
- #endif
- //----------------------------------------------------------------------//
- // FAbilityCompareBoolCondition
- //----------------------------------------------------------------------//
- bool FAbilityCompareBoolCondition::TestCondition(FEzAbilityContext& Context) const
- {
- const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
-
- return (InstanceData.bLeft == InstanceData.bRight) ^ bInvert;
- }
- #if WITH_EDITOR
- FText FAbilityCompareBoolCondition::GetDescription(const FGuid& ID, FEzAbilityDataView InstanceDataView, const IEzAbilityBindingLookup& BindingLookup, EEzAbilityNodeFormatting Formatting) const
- {
- const FInstanceDataType* InstanceData = InstanceDataView.GetPtr<FInstanceDataType>();
- check(InstanceData);
- FText LeftValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, bLeft)), Formatting);
- if (LeftValue.IsEmpty())
- {
- LeftValue = UE::EzAbility::DescHelpers::GetBoolText(InstanceData->bLeft, Formatting);
- }
- FText RightValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, bRight)), Formatting);
- if (RightValue.IsEmpty())
- {
- RightValue = UE::EzAbility::DescHelpers::GetBoolText(InstanceData->bRight, Formatting);
- }
- const FText InvertText = UE::EzAbility::DescHelpers::GetInvertText(bInvert, Formatting);
- const FText Format = (Formatting == EEzAbilityNodeFormatting::RichText)
- ? LOCTEXT("CompareBoolRich", "{EmptyOrNot}{Left} <s>is</> {Right}")
- : LOCTEXT("CompareBool", "{EmptyOrNot}{Left} is {Right}");
- return FText::FormatNamed(Format,
- TEXT("EmptyOrNot"), InvertText,
- TEXT("Left"),LeftValue,
- TEXT("Right"),RightValue);
- }
- #endif
- //----------------------------------------------------------------------//
- // FAbilityCompareEnumCondition
- //----------------------------------------------------------------------//
- bool FAbilityCompareEnumCondition::TestCondition(FEzAbilityContext& Context) const
- {
- const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
- return (InstanceData.Left == InstanceData.Right) ^ bInvert;
- }
- #if WITH_EDITOR
- FText FAbilityCompareEnumCondition::GetDescription(const FGuid& ID, FEzAbilityDataView InstanceDataView, const IEzAbilityBindingLookup& BindingLookup, EEzAbilityNodeFormatting Formatting) const
- {
- const FInstanceDataType* InstanceData = InstanceDataView.GetPtr<FInstanceDataType>();
- check(InstanceData);
- FText LeftValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Left)), Formatting);
- if (LeftValue.IsEmpty())
- {
- if (InstanceData->Left.Enum)
- {
- LeftValue = InstanceData->Left.Enum->GetDisplayNameTextByValue(InstanceData->Left.Value);
- }
- else
- {
- LeftValue = LOCTEXT("None", "None");
- }
- }
- FText RightValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Right)), Formatting);
- if (RightValue.IsEmpty())
- {
- if (InstanceData->Left.Enum)
- {
- RightValue = InstanceData->Right.Enum->GetDisplayNameTextByValue(InstanceData->Right.Value);
- }
- else
- {
- RightValue = LOCTEXT("None", "None");
- }
- }
- const FText InvertText = UE::EzAbility::DescHelpers::GetInvertText(bInvert, Formatting);
- const FText Format = (Formatting == EEzAbilityNodeFormatting::RichText)
- ? LOCTEXT("CompareEnumRich", "{EmptyOrNot}{Left} <s>is</> {Right}")
- : LOCTEXT("CompareEnum", "{EmptyOrNot}{Left} is {Right}");
- return FText::FormatNamed(Format,
- TEXT("EmptyOrNot"), InvertText,
- TEXT("Left"),LeftValue,
- TEXT("Right"),RightValue);
- }
- void FAbilityCompareEnumCondition::OnBindingChanged(const FGuid& ID, FEzAbilityDataView InstanceData, const FEzAbilityPropertyPath& SourcePath, const FEzAbilityPropertyPath& TargetPath, const IEzAbilityBindingLookup& BindingLookup)
- {
- if (!TargetPath.GetStructID().IsValid())
- {
- return;
- }
- FInstanceDataType& Instance = InstanceData.GetMutable<FInstanceDataType>();
- // Left has changed, update enums from the leaf property.
- if (!TargetPath.IsPathEmpty()
- && TargetPath.GetSegments().Last().GetName() == GET_MEMBER_NAME_CHECKED(FInstanceDataType, Left))
- {
- if (const FProperty* LeafProperty = BindingLookup.GetPropertyPathLeafProperty(SourcePath))
- {
- // Handle both old stype namespace enums and new class enum properties.
- UEnum* NewEnum = nullptr;
- if (const FByteProperty* ByteProperty = CastField<FByteProperty>(LeafProperty))
- {
- NewEnum = ByteProperty->GetIntPropertyEnum();
- }
- else if (const FEnumProperty* EnumProperty = CastField<FEnumProperty>(LeafProperty))
- {
- NewEnum = EnumProperty->GetEnum();
- }
- if (Instance.Left.Enum != NewEnum)
- {
- Instance.Left.Initialize(NewEnum);
- }
- }
- else
- {
- Instance.Left.Initialize(nullptr);
- }
- if (Instance.Right.Enum != Instance.Left.Enum)
- {
- Instance.Right.Initialize(Instance.Left.Enum);
- }
- }
- }
- #endif
- //----------------------------------------------------------------------//
- // FAbilityCompareDistanceCondition
- //----------------------------------------------------------------------//
- bool FAbilityCompareDistanceCondition::TestCondition(FEzAbilityContext& Context) const
- {
- const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
- const FVector::FReal Left = FVector::DistSquared(InstanceData.Source, InstanceData.Target);
- const FVector::FReal Right = FMath::Square(InstanceData.Distance);
- const bool bResult = UE::EzAbility::Conditions::CompareNumbers<FVector::FReal>(Left, Right, Operator);
- return bResult ^ bInvert;
- }
- #if WITH_EDITOR
- FText FAbilityCompareDistanceCondition::GetDescription(const FGuid& ID, FEzAbilityDataView InstanceDataView, const IEzAbilityBindingLookup& BindingLookup, EEzAbilityNodeFormatting Formatting) const
- {
- const FInstanceDataType* InstanceData = InstanceDataView.GetPtr<FInstanceDataType>();
- check(InstanceData);
- FNumberFormattingOptions Options;
- Options.MinimumFractionalDigits = 1;
- Options.MaximumFractionalDigits = 3;
- FText SourceValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Source)), Formatting);
- if (SourceValue.IsEmpty())
- {
- SourceValue = InstanceData->Source.ToText();
- }
- FText TargetValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Target)), Formatting);
- if (TargetValue.IsEmpty())
- {
- TargetValue = InstanceData->Target.ToText();
- }
- FText DistanceValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Distance)), Formatting);
- if (DistanceValue.IsEmpty())
- {
- DistanceValue = FText::AsNumber(InstanceData->Distance, &Options);
- }
- const FText OperatorText = UE::EzAbility::DescHelpers::GetOperatorText(Operator, Formatting);
- const FText InvertText = UE::EzAbility::DescHelpers::GetInvertText(bInvert, Formatting);
- const FText Format = (Formatting == EEzAbilityNodeFormatting::RichText)
- ? LOCTEXT("CompareDistanceRich", "{EmptyOrNot}<s>Distance from</> {Source} <s>to</> {Target} {Op} {Distance}")
- : LOCTEXT("CompareDistance", "{EmptyOrNot}Distance from {Source} to {Target} {Op} {Distance}");
- return FText::FormatNamed(Format,
- TEXT("EmptyOrNot"), InvertText,
- TEXT("Source"), SourceValue,
- TEXT("Target"), TargetValue,
- TEXT("Op"), OperatorText,
- TEXT("Distance"), DistanceValue);
- }
- #endif
- //----------------------------------------------------------------------//
- // FAbilityRandomCondition
- //----------------------------------------------------------------------//
- bool FAbilityRandomCondition::TestCondition(FEzAbilityContext& Context) const
- {
- const FInstanceDataType& InstanceData = Context.GetInstanceData(*this);
- return FMath::FRandRange(0.0f, 1.0f) < InstanceData.Threshold;
- }
- #if WITH_EDITOR
- FText FAbilityRandomCondition::GetDescription(const FGuid& ID, FEzAbilityDataView InstanceDataView, const IEzAbilityBindingLookup& BindingLookup, EEzAbilityNodeFormatting Formatting) const
- {
- const FInstanceDataType* InstanceData = InstanceDataView.GetPtr<FInstanceDataType>();
- check(InstanceData);
- FNumberFormattingOptions Options;
- Options.MinimumFractionalDigits = 1;
- Options.MaximumFractionalDigits = 3;
- FText ThresholdValue = BindingLookup.GetBindingSourceDisplayName(FEzAbilityPropertyPath(ID, GET_MEMBER_NAME_CHECKED(FInstanceDataType, Threshold)), Formatting);
- if (ThresholdValue.IsEmpty())
- {
- ThresholdValue = FText::AsNumber(InstanceData->Threshold, &Options);
- }
- const FText Format = (Formatting == EEzAbilityNodeFormatting::RichText)
- ? LOCTEXT("RandomRich", "<s>Random [0..1] <</> {Threshold}")
- : LOCTEXT("Random", "Random [0..1] < {Threshold}");
- return FText::FormatNamed(Format,
- TEXT("Threshold"), ThresholdValue);
- }
- #endif
- #undef LOCTEXT_NAMESPACE
|