Add sprain movement placeholder
This commit is contained in:
@@ -645,7 +645,10 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe
|
|||||||
`BleedingSeverity`, applies lightweight health/exhaustion pressure while
|
`BleedingSeverity`, applies lightweight health/exhaustion pressure while
|
||||||
bleeding, adds bleeding from generic injuries, exposes add/reduce hooks, and
|
bleeding, adds bleeding from generic injuries, exposes add/reduce hooks, and
|
||||||
shows bleeding in debug HUD and console survival output.
|
shows bleeding in debug HUD and console survival output.
|
||||||
- [ ] Add sprain or movement penalty placeholder.
|
- [x] Add sprain or movement penalty placeholder. Survival now tracks replicated
|
||||||
|
`SprainSeverity`, generic injuries can seed sprain severity, active sprains
|
||||||
|
add light exhaustion pressure, movement speed includes an explicit sprain
|
||||||
|
multiplier, and debug HUD/console output display sprain state.
|
||||||
- [x] Add cold exposure damage.
|
- [x] Add cold exposure damage.
|
||||||
- [x] Add starvation damage.
|
- [x] Add starvation damage.
|
||||||
- [x] Add dehydration damage.
|
- [x] Add dehydration damage.
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
def require(path: Path, snippet: str) -> None:
|
||||||
|
text = path.read_text(encoding="utf-8")
|
||||||
|
if snippet not in text:
|
||||||
|
raise SystemExit(f"{path.relative_to(ROOT)} missing {snippet!r}")
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
types = ROOT / "Source" / "AgrarianGame" / "AgrarianTypes.h"
|
||||||
|
survival_h = ROOT / "Source" / "AgrarianGame" / "AgrarianSurvivalComponent.h"
|
||||||
|
survival_cpp = ROOT / "Source" / "AgrarianGame" / "AgrarianSurvivalComponent.cpp"
|
||||||
|
character_cpp = ROOT / "Source" / "AgrarianGame" / "AgrarianGameCharacter.cpp"
|
||||||
|
hud = ROOT / "Source" / "AgrarianGame" / "AgrarianDebugHUD.cpp"
|
||||||
|
controller = ROOT / "Source" / "AgrarianGame" / "AgrarianGamePlayerController.cpp"
|
||||||
|
roadmap = ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md"
|
||||||
|
|
||||||
|
require(types, "float SprainSeverity = 0.0f;")
|
||||||
|
require(survival_h, "float SprainExhaustionPerSecond = 0.03f;")
|
||||||
|
require(survival_h, "void AddSprain(float Severity);")
|
||||||
|
require(survival_h, "void ReduceSprain(float Amount);")
|
||||||
|
require(survival_cpp, "Survival.SprainSeverity += PositiveSeverity * 0.20f;")
|
||||||
|
require(survival_cpp, "Survival.Exhaustion += SprainExhaustionPerSecond * SprainRatio * DeltaTime;")
|
||||||
|
require(survival_cpp, "void UAgrarianSurvivalComponent::AddSprain")
|
||||||
|
require(survival_cpp, "void UAgrarianSurvivalComponent::ReduceSprain")
|
||||||
|
require(survival_cpp, "Survival.SprainSeverity = FMath::Clamp(Survival.SprainSeverity, 0.0f, 100.0f);")
|
||||||
|
require(character_cpp, "const float SprainMultiplier = FMath::GetMappedRangeValueClamped")
|
||||||
|
require(character_cpp, "InjuryMultiplier * SprainMultiplier * SicknessMultiplier")
|
||||||
|
require(hud, "Sprain")
|
||||||
|
require(controller, "Sprain %.1f")
|
||||||
|
require(roadmap, "[x] Add sprain or movement penalty placeholder.")
|
||||||
|
|
||||||
|
print("PASS: sprain movement placeholder is present.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -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("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("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("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));
|
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("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("Injury: %.0f"), Survival.InjurySeverity), X, Y);
|
||||||
DrawLine(FString::Printf(TEXT("Bleed: %.0f"), Survival.BleedingSeverity), 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);
|
DrawLine(FString::Printf(TEXT("Sick: %.0f"), Survival.SicknessSeverity), X, Y);
|
||||||
const FAgrarianCareHistorySnapshot& Care = SurvivalComponent->CareHistory;
|
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);
|
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(0.0f, 100.0f),
|
||||||
FVector2D(1.0f, 0.5f),
|
FVector2D(1.0f, 0.5f),
|
||||||
Survival.InjurySeverity);
|
Survival.InjurySeverity);
|
||||||
|
const float SprainMultiplier = FMath::GetMappedRangeValueClamped(
|
||||||
|
FVector2D(0.0f, 100.0f),
|
||||||
|
FVector2D(1.0f, 0.45f),
|
||||||
|
Survival.SprainSeverity);
|
||||||
const float SicknessMultiplier = FMath::GetMappedRangeValueClamped(
|
const float SicknessMultiplier = FMath::GetMappedRangeValueClamped(
|
||||||
FVector2D(0.0f, 100.0f),
|
FVector2D(0.0f, 100.0f),
|
||||||
FVector2D(1.0f, 0.7f),
|
FVector2D(1.0f, 0.7f),
|
||||||
@@ -429,7 +433,7 @@ float AAgrarianGameCharacter::CalculateSurvivalMovementMultiplier() const
|
|||||||
FVector2D(1.0f, 0.55f),
|
FVector2D(1.0f, 0.55f),
|
||||||
Survival.Exhaustion);
|
Survival.Exhaustion);
|
||||||
|
|
||||||
return HungerMultiplier * ThirstMultiplier * InjuryMultiplier * SicknessMultiplier * ExhaustionMultiplier;
|
return HungerMultiplier * ThirstMultiplier * InjuryMultiplier * SprainMultiplier * SicknessMultiplier * ExhaustionMultiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
float AAgrarianGameCharacter::CalculateCarryWeightMovementMultiplier() const
|
float AAgrarianGameCharacter::CalculateCarryWeightMovementMultiplier() const
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ void AAgrarianGamePlayerController::AgrarianSurvival()
|
|||||||
|
|
||||||
const FAgrarianSurvivalSnapshot& Survival = SurvivalComponent->Survival;
|
const FAgrarianSurvivalSnapshot& Survival = SurvivalComponent->Survival;
|
||||||
ClientMessage(FString::Printf(
|
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.Health,
|
||||||
Survival.Stamina,
|
Survival.Stamina,
|
||||||
Survival.Exhaustion,
|
Survival.Exhaustion,
|
||||||
@@ -156,6 +156,7 @@ void AAgrarianGamePlayerController::AgrarianSurvival()
|
|||||||
Survival.BodyTemperature,
|
Survival.BodyTemperature,
|
||||||
Survival.InjurySeverity,
|
Survival.InjurySeverity,
|
||||||
Survival.BleedingSeverity,
|
Survival.BleedingSeverity,
|
||||||
|
Survival.SprainSeverity,
|
||||||
Survival.SicknessSeverity));
|
Survival.SicknessSeverity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,13 @@ void UAgrarianSurvivalComponent::TickComponent(float DeltaTime, ELevelTick TickT
|
|||||||
CareHistory.InjuryBurden += BleedingRatio * 0.001f * DeltaTime;
|
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 UWorld* World = GetWorld())
|
||||||
{
|
{
|
||||||
if (const AAgrarianGameState* AgrarianGameState = World->GetGameState<AAgrarianGameState>())
|
if (const AAgrarianGameState* AgrarianGameState = World->GetGameState<AAgrarianGameState>())
|
||||||
@@ -181,6 +188,7 @@ void UAgrarianSurvivalComponent::AddInjury(float Severity)
|
|||||||
const float PositiveSeverity = FMath::Max(0.0f, Severity);
|
const float PositiveSeverity = FMath::Max(0.0f, Severity);
|
||||||
Survival.InjurySeverity += PositiveSeverity;
|
Survival.InjurySeverity += PositiveSeverity;
|
||||||
Survival.BleedingSeverity += PositiveSeverity * 0.35f;
|
Survival.BleedingSeverity += PositiveSeverity * 0.35f;
|
||||||
|
Survival.SprainSeverity += PositiveSeverity * 0.20f;
|
||||||
CareHistory.InjuryBurden += PositiveSeverity / 100.0f;
|
CareHistory.InjuryBurden += PositiveSeverity / 100.0f;
|
||||||
Survival.Health -= PositiveSeverity * 5.0f;
|
Survival.Health -= PositiveSeverity * 5.0f;
|
||||||
ClampSurvival();
|
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)
|
void UAgrarianSurvivalComponent::AddSickness(float Severity)
|
||||||
{
|
{
|
||||||
if (GetOwner() && GetOwner()->HasAuthority())
|
if (GetOwner() && GetOwner()->HasAuthority())
|
||||||
@@ -396,6 +427,7 @@ void UAgrarianSurvivalComponent::ClampSurvival()
|
|||||||
Survival.BodyTemperature = FMath::Clamp(Survival.BodyTemperature, 30.0f, 42.0f);
|
Survival.BodyTemperature = FMath::Clamp(Survival.BodyTemperature, 30.0f, 42.0f);
|
||||||
Survival.InjurySeverity = FMath::Clamp(Survival.InjurySeverity, 0.0f, 100.0f);
|
Survival.InjurySeverity = FMath::Clamp(Survival.InjurySeverity, 0.0f, 100.0f);
|
||||||
Survival.BleedingSeverity = FMath::Clamp(Survival.BleedingSeverity, 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);
|
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"))
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0"))
|
||||||
float BleedingExhaustionPerSecond = 0.04f;
|
float BleedingExhaustionPerSecond = 0.04f;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0"))
|
||||||
|
float SprainExhaustionPerSecond = 0.03f;
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
|
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
|
||||||
bool IsAlive() const;
|
bool IsAlive() const;
|
||||||
|
|
||||||
@@ -108,6 +111,12 @@ public:
|
|||||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
|
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
|
||||||
void ReduceBleeding(float Amount);
|
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")
|
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
|
||||||
void AddSickness(float Severity);
|
void AddSickness(float Severity);
|
||||||
|
|
||||||
|
|||||||
@@ -357,6 +357,9 @@ struct FAgrarianSurvivalSnapshot
|
|||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival")
|
||||||
float BleedingSeverity = 0.0f;
|
float BleedingSeverity = 0.0f;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival")
|
||||||
|
float SprainSeverity = 0.0f;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival")
|
||||||
float SicknessSeverity = 0.0f;
|
float SicknessSeverity = 0.0f;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user