Fix embarrassment gain/decay not tied to NPC observation state

This commit is contained in:
2026-05-18 22:47:33 +03:00
parent a04b892fe9
commit 2c78e1660e
4 changed files with 66 additions and 7 deletions
@@ -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)
{ {
@@ -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);
}
+6 -3
View File
@@ -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
{ {
@@ -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;
}; };
+16 -1
View File
@@ -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)
+12
View File
@@ -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);