Add sprain movement placeholder

This commit is contained in:
2026-05-18 13:09:48 -07:00
parent c796a99d89
commit 559a5b237b
8 changed files with 98 additions and 3 deletions
+2
View File
@@ -110,6 +110,7 @@ void AAgrarianDebugHUD::DrawCriticalStats(const UAgrarianSurvivalComponent* Surv
DrawScaledLine(FString::Printf(TEXT("Exhaust %3.0f"), Survival.Exhaustion), X, Y, CriticalStatsTextScale, StatusColor(Survival.Exhaustion, true));
DrawScaledLine(FString::Printf(TEXT("Injury %3.0f"), Survival.InjurySeverity), X, Y, CriticalStatsTextScale, StatusColor(Survival.InjurySeverity, true));
DrawScaledLine(FString::Printf(TEXT("Bleeding %3.0f"), Survival.BleedingSeverity), X, Y, CriticalStatsTextScale, StatusColor(Survival.BleedingSeverity, true));
DrawScaledLine(FString::Printf(TEXT("Sprain %3.0f"), Survival.SprainSeverity), X, Y, CriticalStatsTextScale, StatusColor(Survival.SprainSeverity, true));
DrawScaledLine(FString::Printf(TEXT("Sickness %3.0f"), Survival.SicknessSeverity), X, Y, CriticalStatsTextScale, StatusColor(Survival.SicknessSeverity, true));
}
@@ -337,6 +338,7 @@ void AAgrarianDebugHUD::DrawSurvival(const UAgrarianSurvivalComponent* SurvivalC
DrawLine(FString::Printf(TEXT("Expose: x%.2f %+3.1f C"), SurvivalComponent->CurrentWeatherExposureMultiplier, SurvivalComponent->CurrentWeatherTemperatureOffsetC), X, Y);
DrawLine(FString::Printf(TEXT("Injury: %.0f"), Survival.InjurySeverity), X, Y);
DrawLine(FString::Printf(TEXT("Bleed: %.0f"), Survival.BleedingSeverity), X, Y);
DrawLine(FString::Printf(TEXT("Sprain: %.0f"), Survival.SprainSeverity), X, Y);
DrawLine(FString::Printf(TEXT("Sick: %.0f"), Survival.SicknessSeverity), X, Y);
const FAgrarianCareHistorySnapshot& Care = SurvivalComponent->CareHistory;
DrawLine(FString::Printf(TEXT("Care N/S/T: %.2f %.2f %.2f"), Care.NutritionQuality, Care.SleepQuality, Care.TreatmentQuality), X, Y, FColor::Silver);
@@ -420,6 +420,10 @@ float AAgrarianGameCharacter::CalculateSurvivalMovementMultiplier() const
FVector2D(0.0f, 100.0f),
FVector2D(1.0f, 0.5f),
Survival.InjurySeverity);
const float SprainMultiplier = FMath::GetMappedRangeValueClamped(
FVector2D(0.0f, 100.0f),
FVector2D(1.0f, 0.45f),
Survival.SprainSeverity);
const float SicknessMultiplier = FMath::GetMappedRangeValueClamped(
FVector2D(0.0f, 100.0f),
FVector2D(1.0f, 0.7f),
@@ -429,7 +433,7 @@ float AAgrarianGameCharacter::CalculateSurvivalMovementMultiplier() const
FVector2D(1.0f, 0.55f),
Survival.Exhaustion);
return HungerMultiplier * ThirstMultiplier * InjuryMultiplier * SicknessMultiplier * ExhaustionMultiplier;
return HungerMultiplier * ThirstMultiplier * InjuryMultiplier * SprainMultiplier * SicknessMultiplier * ExhaustionMultiplier;
}
float AAgrarianGameCharacter::CalculateCarryWeightMovementMultiplier() const
@@ -147,7 +147,7 @@ void AAgrarianGamePlayerController::AgrarianSurvival()
const FAgrarianSurvivalSnapshot& Survival = SurvivalComponent->Survival;
ClientMessage(FString::Printf(
TEXT("Health %.1f | Stamina %.1f | Exhaustion %.1f | Hunger %.1f | Thirst %.1f | Temp %.1fC | Injury %.1f | Bleeding %.1f | Sickness %.1f"),
TEXT("Health %.1f | Stamina %.1f | Exhaustion %.1f | Hunger %.1f | Thirst %.1f | Temp %.1fC | Injury %.1f | Bleeding %.1f | Sprain %.1f | Sickness %.1f"),
Survival.Health,
Survival.Stamina,
Survival.Exhaustion,
@@ -156,6 +156,7 @@ void AAgrarianGamePlayerController::AgrarianSurvival()
Survival.BodyTemperature,
Survival.InjurySeverity,
Survival.BleedingSeverity,
Survival.SprainSeverity,
Survival.SicknessSeverity));
}
@@ -73,6 +73,13 @@ void UAgrarianSurvivalComponent::TickComponent(float DeltaTime, ELevelTick TickT
CareHistory.InjuryBurden += BleedingRatio * 0.001f * DeltaTime;
}
if (Survival.SprainSeverity > 0.0f)
{
const float SprainRatio = Survival.SprainSeverity / 100.0f;
Survival.Exhaustion += SprainExhaustionPerSecond * SprainRatio * DeltaTime;
CareHistory.InjuryBurden += SprainRatio * 0.0005f * DeltaTime;
}
if (const UWorld* World = GetWorld())
{
if (const AAgrarianGameState* AgrarianGameState = World->GetGameState<AAgrarianGameState>())
@@ -181,6 +188,7 @@ void UAgrarianSurvivalComponent::AddInjury(float Severity)
const float PositiveSeverity = FMath::Max(0.0f, Severity);
Survival.InjurySeverity += PositiveSeverity;
Survival.BleedingSeverity += PositiveSeverity * 0.35f;
Survival.SprainSeverity += PositiveSeverity * 0.20f;
CareHistory.InjuryBurden += PositiveSeverity / 100.0f;
Survival.Health -= PositiveSeverity * 5.0f;
ClampSurvival();
@@ -222,6 +230,29 @@ void UAgrarianSurvivalComponent::ReduceBleeding(float Amount)
}
}
void UAgrarianSurvivalComponent::AddSprain(float Severity)
{
if (GetOwner() && GetOwner()->HasAuthority())
{
const float PositiveSeverity = FMath::Max(0.0f, Severity);
Survival.SprainSeverity += PositiveSeverity;
CareHistory.InjuryBurden += PositiveSeverity / 200.0f;
ClampSurvival();
ClampCareHistory();
BroadcastSurvivalChanged();
}
}
void UAgrarianSurvivalComponent::ReduceSprain(float Amount)
{
if (GetOwner() && GetOwner()->HasAuthority())
{
Survival.SprainSeverity -= FMath::Max(0.0f, Amount);
ClampSurvival();
BroadcastSurvivalChanged();
}
}
void UAgrarianSurvivalComponent::AddSickness(float Severity)
{
if (GetOwner() && GetOwner()->HasAuthority())
@@ -396,6 +427,7 @@ void UAgrarianSurvivalComponent::ClampSurvival()
Survival.BodyTemperature = FMath::Clamp(Survival.BodyTemperature, 30.0f, 42.0f);
Survival.InjurySeverity = FMath::Clamp(Survival.InjurySeverity, 0.0f, 100.0f);
Survival.BleedingSeverity = FMath::Clamp(Survival.BleedingSeverity, 0.0f, 100.0f);
Survival.SprainSeverity = FMath::Clamp(Survival.SprainSeverity, 0.0f, 100.0f);
Survival.SicknessSeverity = FMath::Clamp(Survival.SicknessSeverity, 0.0f, 100.0f);
}
@@ -78,6 +78,9 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0"))
float BleedingExhaustionPerSecond = 0.04f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0"))
float SprainExhaustionPerSecond = 0.03f;
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
bool IsAlive() const;
@@ -108,6 +111,12 @@ public:
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
void ReduceBleeding(float Amount);
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
void AddSprain(float Severity);
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
void ReduceSprain(float Amount);
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
void AddSickness(float Severity);
+3
View File
@@ -357,6 +357,9 @@ struct FAgrarianSurvivalSnapshot
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival")
float BleedingSeverity = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival")
float SprainSeverity = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival")
float SicknessSeverity = 0.0f;
};