Fix embarrassment gain/decay not tied to NPC observation state
This commit is contained in:
@@ -8,8 +8,10 @@
|
|||||||
#include "AI/NavigationSystemBase.h"
|
#include "AI/NavigationSystemBase.h"
|
||||||
#include "BehaviorTree/BlackboardComponent.h"
|
#include "BehaviorTree/BlackboardComponent.h"
|
||||||
#include "Kismet/GameplayStatics.h"
|
#include "Kismet/GameplayStatics.h"
|
||||||
|
#include "Perception/AISense_Sight.h"
|
||||||
#include "NakedDesire/Global/NakedDesireGameMode.h"
|
#include "NakedDesire/Global/NakedDesireGameMode.h"
|
||||||
#include "NakedDesire/Player/NakedDesireCharacter.h"
|
#include "NakedDesire/Player/NakedDesireCharacter.h"
|
||||||
|
#include "NakedDesire/Stats/StatsManager.h"
|
||||||
|
|
||||||
void ANPCAIController::SetShouldReactToPlayer(const bool Value)
|
void ANPCAIController::SetShouldReactToPlayer(const bool Value)
|
||||||
{
|
{
|
||||||
@@ -19,7 +21,7 @@ void ANPCAIController::SetShouldReactToPlayer(const bool Value)
|
|||||||
void ANPCAIController::OnPossess(APawn* InPawn)
|
void ANPCAIController::OnPossess(APawn* InPawn)
|
||||||
{
|
{
|
||||||
Super::OnPossess(InPawn);
|
Super::OnPossess(InPawn);
|
||||||
|
|
||||||
NavigationSystem = FNavigationSystem::GetCurrent<UNavigationSystemV1>(GetWorld());
|
NavigationSystem = FNavigationSystem::GetCurrent<UNavigationSystemV1>(GetWorld());
|
||||||
GameMode = Cast<ANakedDesireGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
|
GameMode = Cast<ANakedDesireGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
|
||||||
|
|
||||||
@@ -29,7 +31,7 @@ void ANPCAIController::OnPossess(APawn* InPawn)
|
|||||||
|
|
||||||
TArray<AActor*> TargetActors;
|
TArray<AActor*> TargetActors;
|
||||||
UGameplayStatics::GetAllActorsOfClass(GetWorld(), ANPCTargetLocation::StaticClass(), TargetActors);
|
UGameplayStatics::GetAllActorsOfClass(GetWorld(), ANPCTargetLocation::StaticClass(), TargetActors);
|
||||||
|
|
||||||
const int RandomIndex = FMath::RandRange(0, TargetActors.Num() - 1);
|
const int RandomIndex = FMath::RandRange(0, TargetActors.Num() - 1);
|
||||||
Blackboard->SetValueAsVector("TargetLocation", TargetActors[RandomIndex]->GetActorLocation());
|
Blackboard->SetValueAsVector("TargetLocation", TargetActors[RandomIndex]->GetActorLocation());
|
||||||
Blackboard->SetValueAsVector("SpawnLocation", SpawnLocation);
|
Blackboard->SetValueAsVector("SpawnLocation", SpawnLocation);
|
||||||
@@ -37,3 +39,30 @@ void ANPCAIController::OnPossess(APawn* InPawn)
|
|||||||
PlayerCharacter = Cast<ANakedDesireCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
|
PlayerCharacter = Cast<ANakedDesireCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
|
||||||
Blackboard->SetValueAsObject("Player", PlayerCharacter);
|
Blackboard->SetValueAsObject("Player", PlayerCharacter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ANPCAIController::OnUnpossess()
|
||||||
|
{
|
||||||
|
if (bCurrentlyObserving && PlayerCharacter)
|
||||||
|
{
|
||||||
|
PlayerCharacter->StatsManager->SetObserved(false);
|
||||||
|
bCurrentlyObserving = false;
|
||||||
|
}
|
||||||
|
Super::OnUnpossess();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANPCAIController::OnTargetPerceptionUpdated(AActor* Actor, FAIStimulus Stimulus)
|
||||||
|
{
|
||||||
|
Super::OnTargetPerceptionUpdated(Actor, Stimulus);
|
||||||
|
|
||||||
|
if (Actor != PlayerCharacter)
|
||||||
|
return;
|
||||||
|
if (Stimulus.Type != UAISense::GetSenseID<UAISense_Sight>())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const bool bSensed = Stimulus.WasSuccessfullySensed();
|
||||||
|
if (bSensed == bCurrentlyObserving)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bCurrentlyObserving = bSensed;
|
||||||
|
PlayerCharacter->StatsManager->SetObserved(bSensed);
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,14 +4,13 @@
|
|||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "DetourCrowdAIController.h"
|
#include "DetourCrowdAIController.h"
|
||||||
|
#include "Perception/AIPerceptionTypes.h"
|
||||||
#include "NPCAIController.generated.h"
|
#include "NPCAIController.generated.h"
|
||||||
|
|
||||||
class ANakedDesireGameMode;
|
class ANakedDesireGameMode;
|
||||||
class UNavigationSystemV1;
|
class UNavigationSystemV1;
|
||||||
class ANakedDesireCharacter;
|
class ANakedDesireCharacter;
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
UCLASS()
|
UCLASS()
|
||||||
class NAKEDDESIRE_API ANPCAIController : public ADetourCrowdAIController
|
class NAKEDDESIRE_API ANPCAIController : public ADetourCrowdAIController
|
||||||
{
|
{
|
||||||
@@ -19,7 +18,7 @@ class NAKEDDESIRE_API ANPCAIController : public ADetourCrowdAIController
|
|||||||
|
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
ANakedDesireCharacter* PlayerCharacter = nullptr;
|
ANakedDesireCharacter* PlayerCharacter = nullptr;
|
||||||
|
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
const UNavigationSystemV1* NavigationSystem = nullptr;
|
const UNavigationSystemV1* NavigationSystem = nullptr;
|
||||||
|
|
||||||
@@ -29,10 +28,14 @@ class NAKEDDESIRE_API ANPCAIController : public ADetourCrowdAIController
|
|||||||
UPROPERTY(EditDefaultsOnly)
|
UPROPERTY(EditDefaultsOnly)
|
||||||
UBehaviorTree* BehaviorTreeAsset = nullptr;
|
UBehaviorTree* BehaviorTreeAsset = nullptr;
|
||||||
|
|
||||||
|
bool bCurrentlyObserving = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UFUNCTION(BlueprintCallable)
|
UFUNCTION(BlueprintCallable)
|
||||||
void SetShouldReactToPlayer(bool Value);
|
void SetShouldReactToPlayer(bool Value);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void OnPossess(APawn* InPawn) override;
|
virtual void OnPossess(APawn* InPawn) override;
|
||||||
|
virtual void OnUnpossess() override;
|
||||||
|
virtual void OnTargetPerceptionUpdated(AActor* Actor, FAIStimulus Stimulus) override;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -24,7 +24,22 @@ void UStatsManager::TickComponent(float DeltaTime, enum ELevelTick TickType,
|
|||||||
FActorComponentTickFunction* ThisTickFunction)
|
FActorComponentTickFunction* ThisTickFunction)
|
||||||
{
|
{
|
||||||
DecreaseEnergy(0.9f);
|
DecreaseEnergy(0.9f);
|
||||||
DecreaseEmbarrassment(1.0f);
|
|
||||||
|
if (ObserverCount > 0)
|
||||||
|
{
|
||||||
|
// TODO (#05): replace 0.0f with ClothingManager->GetEffectiveCoverage() when that lands.
|
||||||
|
constexpr float CoverageWeight = 0.0f;
|
||||||
|
IncreaseEmbarrassment(EmbarrassmentGainRate * (1.0f - CoverageWeight) * DeltaTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DecreaseEmbarrassment(EmbarrassmentDecayRate * DeltaTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UStatsManager::SetObserved(const bool bObserved, const float CoverageWeight)
|
||||||
|
{
|
||||||
|
ObserverCount = FMath::Max(0, bObserved ? ObserverCount + 1 : ObserverCount - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UStatsManager::IncreaseEmbarrassment(const float Amount)
|
void UStatsManager::IncreaseEmbarrassment(const float Amount)
|
||||||
|
|||||||
@@ -19,9 +19,17 @@ class NAKEDDESIRE_API UStatsManager : public UActorComponent
|
|||||||
float Energy = 1000.0f;
|
float Energy = 1000.0f;
|
||||||
float MaxEnergy = 1000.0f;
|
float MaxEnergy = 1000.0f;
|
||||||
|
|
||||||
|
int32 ObserverCount = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UStatsManager();
|
UStatsManager();
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "Embarrassment")
|
||||||
|
float EmbarrassmentGainRate = 10.0f;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "Embarrassment")
|
||||||
|
float EmbarrassmentDecayRate = 1.0f;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void BeginPlay() override;
|
virtual void BeginPlay() override;
|
||||||
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
|
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
|
||||||
@@ -30,6 +38,10 @@ public:
|
|||||||
float Stamina = 100.0f;
|
float Stamina = 100.0f;
|
||||||
float MaxStamina = 100.0f;
|
float MaxStamina = 100.0f;
|
||||||
|
|
||||||
|
// Called by NPCAIController when sight is gained or lost.
|
||||||
|
// CoverageWeight: fraction of body covered [0..1]; pass 0.0f until #05 (GetEffectiveCoverage) lands.
|
||||||
|
void SetObserved(bool bObserved, float CoverageWeight = 0.0f);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable)
|
UFUNCTION(BlueprintCallable)
|
||||||
void IncreaseEmbarrassment(float Amount);
|
void IncreaseEmbarrassment(float Amount);
|
||||||
void DecreaseEmbarrassment(float Amount);
|
void DecreaseEmbarrassment(float Amount);
|
||||||
|
|||||||
Reference in New Issue
Block a user