#pragma once

#include "CoreMinimal.h"
#include "BaseSurvivorAnimInstance.h"
#include "GameplayTagContainer.h"
#include "UObject/NoExportTypes.h"
#include "LocomotionSurvivorSubAnimInstance.generated.h"

class UCurveFloat;
class UBlendSpace;
class UAimOffsetBlendSpace;
class UBlendSpace1D;
class UAimOffsetBlendSpace1D;
class UAnimSequence;

UCLASS(Blueprintable, NonTransient)
class DBDANIMATION_API ULocomotionSurvivorSubAnimInstance : public UBaseSurvivorAnimInstance
{
	GENERATED_BODY()

protected:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FGameplayTag _recoveringInteractionTag;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FGameplayTag _allowNavigationWhileRecoverTag;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FGameplayTag _modifyLocomotionScaleTag;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _aimOffsetYawInterpolationSpeed;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _aimOffsetYawDeadzoneStart;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _aimOffsetYawDrasticChangeUpperLimit;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _aimOffsetYawDrasticChangeLowerLimit;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _aimOffsetYawDrasticChangeInterpolationSpeed;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UCurveFloat* _aimOffsetYawInterpolateEaseIn;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UCurveFloat* _aimOffsetYawInterpolateEaseOut;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _aimOffsetYawInterpolationEaseInLength;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _aimOffsetYawInterpolationEaseOutDistance;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _isPlayerInPerkInteractionToFloat;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool _isCrawlRecover;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _explicitTimeLookAtStand;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _lookAtAlpha;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _strafingDirection;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _strafingSpeed;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _strafingSpeedDefaultValue;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _locomotionPlayrate;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _locomotionPlayrateDefaultValue;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _locomotionStartPosition;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isUsingHeavyCarry;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isUsingLightCarry;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool _isHealthy;

	UPROPERTY(EditAnywhere)
	FGameplayTag _bsLocomotionStandFlag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _aoLookAtStandLocoTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _bsBankingTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _bsCrouchWalkTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _bsLookAtCrouchTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asFlashlightStandTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asStandIdleTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asLookAtStandDownTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asLookAtStandFrontTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asLookAtStandUpTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asStandQuickLeftToRightTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asStandQuickRightToLeftTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asCarryIdleLightTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asCarryIdleHeavyTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asCarryIdleWITag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asCarryIdleTTTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _bsCrawlToStandTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asDeepWoundTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asCrawlRecoverTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asCrawlTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _aoCrawlTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asCrawlToDeadTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _asDeadTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _carryIdleLightNeckTag;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UBlendSpace* _bsLocomotionStand;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAimOffsetBlendSpace* _aoLookAtStandLoco;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UBlendSpace1D* _bsBanking;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UBlendSpace* _bsCrouchWalk;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAimOffsetBlendSpace1D* _bsLookAtCrouch;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asFlashlightStand;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asStandIdle;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asLookAtStandDown;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asLookAtStandFront;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asLookAtStandUp;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asStandQuickLeftToRight;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asStandQuickRightToLeft;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asCarryIdleLight;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asCarryIdleHeavy;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asCarryIdleWI;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asCarryIdleTT;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UBlendSpace1D* _bsCrawlToStand;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asDeepWound;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asCrawlRecover;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asCrawl;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAimOffsetBlendSpace1D* _aoCrawl;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asCrawlToDead;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _asDead;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UAnimSequence* _carryIdleLightNeckAnimation;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool _isRecoveringWhileCrawling;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool _isTenacityPerkActive;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _wasMovingResetTime;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool _isIdle;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _shouldPlayLowerCarryAnimation;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isRunning;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isCrouching;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isCrawling;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isDead;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _walkAnimSpeed;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _walkAnimStartOffset;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _walkAnimPlayRateMultiplier;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _wasLastDamageSourceDeepWounds;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isStrafing;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isUsingDeadHard;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _direction;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isUsingAimItem;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _aimOffsetPitch;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _aimOffsetYaw;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isAimOffsetYawInDeadZone;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isBeingCarried;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _crawlingDirectionWhileMoving;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _crawlMovingJustStopped;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isImmobilized;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _canUseLookAtRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _cannotUseLookAtRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _lookAtStandIdleToQuickLeftToRightRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _lookAtStandIdleToQuickRightToLeftRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _mainConduitToDeadRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _mainConduitToCrawlRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _mainConduitToDeepWoundToCrawlRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _mainConduitToConduitToLocomotionRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _conduitToLocomotionToCrouchRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _conduitToLocomotionToWalkRunRule;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _conduitToLocomotionToStandIdle;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _lookAtAlphaBlendMultiDown;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _lookAtAlphaBlendMultiCenter;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _lookAtAlphaBlendMultiUp;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _isDrasticAimOffsetYawChangeDetected;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	bool _lightOnNeckWhenCarried;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient)
	float _aimOffsetYawInterpolated;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _aimOffsetYawClampValue;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _maxParadiseWalkCycleOffSet;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _minParadiseWalkPlayRateMultiplier;

	UPROPERTY(EditAnywhere)
	TArray<FGameplayTag> _lowerCarryAnimationPresenceTags;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FGameplayTagContainer _lightOnNeckWhenCarriedPresenceTag;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FVector2D _lookAtNormalizationVector;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FVector2D _lookAtMiddleToDownVector;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FVector2D _lookAtMiddleToUpVector;

public:
	ULocomotionSurvivorSubAnimInstance();
};

FORCEINLINE uint32 GetTypeHash(const ULocomotionSurvivorSubAnimInstance) { return 0; }
