From fff0233d3c19ffdd872eb5aa3d00bd688a594cae Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Wed, 29 Apr 2026 15:08:50 +0200 Subject: [PATCH] Label retained drill recovery posture upstream --- .../HyperTwistCoachDashboardWidget.cpp | 223 ++++++++++-- .../HyperTwistTrainingCoachLibrary.cpp | 81 ++++- .../HyperTwistTrainingRepositoryLibrary.cpp | 317 ++++++++++++++++-- .../HyperTwistTrainingTypes.h | 12 + 4 files changed, 572 insertions(+), 61 deletions(-) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index dd0d4d8..23b06db 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -177,7 +177,8 @@ namespace HyperTwistCoachDashboardWidgetInternal bool IsQueueRecoveryMemorySource(const FString& SourceLabel) { return SourceLabel.StartsWith(TEXT("coach-memory-queue-")) - || IsDashboardHandoffGuidanceSource(SourceLabel); + || IsDashboardHandoffGuidanceSource(SourceLabel) + || SourceLabel.StartsWith(TEXT("coach-memory-method-drill-recovery-")); } FString DescribeCoachMemorySourceLabel(const FString& SourceLabel) @@ -222,26 +223,50 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted strong drill-recovery-memory queued handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-queued")) + { + return TEXT("accepted strong retained drill-recovery-posture queued handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-strong-follow-up")) { return TEXT("accepted strong drill-recovery-memory follow-up handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-follow-up")) + { + return TEXT("accepted strong retained drill-recovery-posture follow-up handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-strong-recommended")) { return TEXT("accepted strong drill-recovery-memory recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-recommended")) + { + return TEXT("accepted strong retained drill-recovery-posture recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-queued")) { return TEXT("accepted weak drill-recovery-memory queued handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-queued")) + { + return TEXT("accepted weak retained drill-recovery-posture queued handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-follow-up")) { return TEXT("accepted weak drill-recovery-memory follow-up handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-follow-up")) + { + return TEXT("accepted weak retained drill-recovery-posture follow-up handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-recommended")) { return TEXT("accepted weak drill-recovery-memory recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-recommended")) + { + return TEXT("accepted weak retained drill-recovery-posture recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-queued")) { return TEXT("accepted queued handoff history"); @@ -302,26 +327,50 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted strong drill-recovery-memory queued dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")) + { + return TEXT("accepted strong retained drill-recovery-posture queued dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up")) { return TEXT("accepted strong drill-recovery-memory follow-up dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")) + { + return TEXT("accepted strong retained drill-recovery-posture follow-up dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended")) { return TEXT("accepted strong drill-recovery-memory recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended")) + { + return TEXT("accepted strong retained drill-recovery-posture recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued")) { return TEXT("accepted weak drill-recovery-memory queued dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")) + { + return TEXT("accepted weak retained drill-recovery-posture queued dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up")) { return TEXT("accepted weak drill-recovery-memory follow-up dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")) + { + return TEXT("accepted weak retained drill-recovery-posture follow-up dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended")) { return TEXT("accepted weak drill-recovery-memory recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended")) + { + return TEXT("accepted weak retained drill-recovery-posture recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-queued")) { return TEXT("accepted deferred-overflow queued outcome handoff"); @@ -382,10 +431,18 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("successful retained drill-recovery-memory history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong")) + { + return TEXT("successful retained drill-recovery-posture history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak")) { return TEXT("weak retained drill-recovery-memory history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak")) + { + return TEXT("weak retained drill-recovery-posture history"); + } return SourceLabel.IsEmpty() ? TEXT("n/a") : SourceLabel; } @@ -409,18 +466,25 @@ namespace HyperTwistCoachDashboardWidgetInternal const bool bDeferredFirstSuppressionDriven, const bool bMethodDrillDriven = false, const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = - EMethodDrillRecoveryMemoryBias::None) + EMethodDrillRecoveryMemoryBias::None, + const bool bRetainedMethodDrillRecoveryPostureDriven = false) { if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Strong) { switch (HandoffKind) { case EHyperTwistTrainingCoachHandoffKind::Queue: - return TEXT("dashboard-handoff-method-drill-recovery-strong-queued"); + return bRetainedMethodDrillRecoveryPostureDriven + ? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") + : TEXT("dashboard-handoff-method-drill-recovery-strong-queued"); case EHyperTwistTrainingCoachHandoffKind::FollowUp: - return TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up"); + return bRetainedMethodDrillRecoveryPostureDriven + ? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") + : TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up"); case EHyperTwistTrainingCoachHandoffKind::Recommended: - return TEXT("dashboard-handoff-method-drill-recovery-strong-recommended"); + return bRetainedMethodDrillRecoveryPostureDriven + ? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") + : TEXT("dashboard-handoff-method-drill-recovery-strong-recommended"); default: return FString(); } @@ -430,11 +494,17 @@ namespace HyperTwistCoachDashboardWidgetInternal switch (HandoffKind) { case EHyperTwistTrainingCoachHandoffKind::Queue: - return TEXT("dashboard-handoff-method-drill-recovery-weak-queued"); + return bRetainedMethodDrillRecoveryPostureDriven + ? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") + : TEXT("dashboard-handoff-method-drill-recovery-weak-queued"); case EHyperTwistTrainingCoachHandoffKind::FollowUp: - return TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up"); + return bRetainedMethodDrillRecoveryPostureDriven + ? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") + : TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up"); case EHyperTwistTrainingCoachHandoffKind::Recommended: - return TEXT("dashboard-handoff-method-drill-recovery-weak-recommended"); + return bRetainedMethodDrillRecoveryPostureDriven + ? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended") + : TEXT("dashboard-handoff-method-drill-recovery-weak-recommended"); default: return FString(); } @@ -1247,6 +1317,25 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() MethodDrillRecoveryMemoryHistoryEntries, true ); + const bool bUseStrongRetainedMethodDrillRecoveryPosture = + !bHasDeferredFirstSuppressionSignal + && QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount > 0 + && (QueueRecoveryWeighting.PreferredActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery + || (!QueueRecoveryWeighting.IsStructurallyValid() && bUpstreamPrefersLaunchRecovery)) + && (QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchReducedCount > 0 + || QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount + >= QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteCount); + const bool bUseWeakRetainedMethodDrillRecoveryPosture = + !bHasDeferredFirstSuppressionSignal + && !DeferredEntryId.IsEmpty() + && QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteCount > 0 + && (QueueRecoveryWeighting.PreferredActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::PromoteDeferred + || (!QueueRecoveryWeighting.IsStructurallyValid() && !bUpstreamPrefersLaunchRecovery)) + && (QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteReducedCount > 0 + || QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteCount + >= QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount); auto StartRunAndRefresh = [this](const FHyperTwistTrainingRunState& RunState) { @@ -1267,7 +1356,8 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() bHasDeferredFirstSuppressionSignal, bPrefersFollowUp, bUseMethodDrillRecoverySignal, - RetainedMethodDrillRecoveryMemoryBias + bUseStrongRetainedMethodDrillRecoveryPosture, + bUseWeakRetainedMethodDrillRecoveryPosture ]( const TCHAR* AppliedActionLabel, const FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind ActionKind, @@ -1284,12 +1374,12 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() bBeforeCompletionGap, bHasDeferredFirstSuppressionSignal && bPrefersFollowUp, bUseMethodDrillRecoverySignal, - bUseMethodDrillRecoverySignal - && RetainedMethodDrillRecoveryMemoryBias - == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong, - bUseMethodDrillRecoverySignal - && RetainedMethodDrillRecoveryMemoryBias - == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak, + bUseStrongRetainedMethodDrillRecoveryPosture + && ActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery, + bUseWeakRetainedMethodDrillRecoveryPosture + && ActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::PromoteDeferred, bSucceeded ); UpdateDashboardPresentation(); @@ -1299,7 +1389,8 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() [ bHasDeferredFirstSuppressionSignal, bUseMethodDrillRecoverySignal, - RetainedMethodDrillRecoveryMemoryBias + RetainedMethodDrillRecoveryMemoryBias, + bUseStrongRetainedMethodDrillRecoveryPosture ]( const EHyperTwistTrainingCoachHandoffKind HandoffKind) { @@ -1310,6 +1401,16 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() true ); } + if (bUseStrongRetainedMethodDrillRecoveryPosture) + { + return HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel( + HandoffKind, + false, + false, + HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong, + true + ); + } if (bUseMethodDrillRecoverySignal) { return HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel( @@ -6928,6 +7029,8 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() bool bHandoffRecommendationUsedDeferredFirstSuppressionSignal = false; bool bHandoffRecommendationUsedMethodDrillWeighting = false; bool bHandoffRecommendationUsedMethodDrillRecoveryMemory = false; + bool bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture = false; + bool bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture = false; const HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias CurrentMethodDrillRecoveryMemoryBias = HyperTwistCoachDashboardWidgetInternal::ResolveMethodDrillRecoveryMemoryBias( @@ -6954,6 +7057,44 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() != HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None ? RetainedMethodDrillRecoveryMemoryHandoffBias : CurrentMethodDrillRecoveryMemoryBias; + auto UsesStrongRetainedMethodDrillRecoveryPostureForKind = [ + &HandoffHistoryBias + ](const HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind Kind) + { + switch (Kind) + { + case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue: + return HandoffHistoryBias.StrongRetainedMethodDrillQueueAcceptedDeltaCount > 0 + || HandoffHistoryBias.StrongRetainedMethodDrillQueueRecommendationCount > 0; + case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::FollowUp: + return HandoffHistoryBias.StrongRetainedMethodDrillFollowUpAcceptedDeltaCount > 0 + || HandoffHistoryBias.StrongRetainedMethodDrillFollowUpRecommendationCount > 0; + case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Recommended: + return HandoffHistoryBias.StrongRetainedMethodDrillRecommendedAcceptedDeltaCount > 0 + || HandoffHistoryBias.StrongRetainedMethodDrillRecommendedRecommendationCount > 0; + default: + return false; + } + }; + auto UsesWeakRetainedMethodDrillRecoveryPostureForKind = [ + &HandoffHistoryBias + ](const HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind Kind) + { + switch (Kind) + { + case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue: + return HandoffHistoryBias.WeakRetainedMethodDrillQueueAcceptedDeltaCount > 0 + || HandoffHistoryBias.WeakRetainedMethodDrillQueueRecommendationCount > 0; + case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::FollowUp: + return HandoffHistoryBias.WeakRetainedMethodDrillFollowUpAcceptedDeltaCount > 0 + || HandoffHistoryBias.WeakRetainedMethodDrillFollowUpRecommendationCount > 0; + case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Recommended: + return HandoffHistoryBias.WeakRetainedMethodDrillRecommendedAcceptedDeltaCount > 0 + || HandoffHistoryBias.WeakRetainedMethodDrillRecommendedRecommendationCount > 0; + default: + return false; + } + }; if (!bCanUseCoachHandoff) { CoachHandoffRecommendationStatusLine = @@ -7358,11 +7499,45 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() } bDisplayedCoachHandoffRecommendationUsedDeferredFirstSuppressionSignal = bHandoffRecommendationUsedDeferredFirstSuppressionSignal; + bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture = + !bHandoffRecommendationUsedDeferredFirstSuppressionSignal + && HandoffRecommendationKind + != HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None + && EffectiveMethodDrillRecoveryMemoryHandoffBias + == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong + && UsesStrongRetainedMethodDrillRecoveryPostureForKind(HandoffRecommendationKind) + && (bHandoffRecommendationUsedHistory + || bHandoffRecommendationUsedMethodDrillRecoveryMemory); + bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture = + !bHandoffRecommendationUsedDeferredFirstSuppressionSignal + && HandoffRecommendationKind + != HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None + && EffectiveMethodDrillRecoveryMemoryHandoffBias + == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak + && UsesWeakRetainedMethodDrillRecoveryPostureForKind(HandoffRecommendationKind) + && (bHandoffRecommendationUsedHistory + || bHandoffRecommendationUsedMethodDrillRecoveryMemory); bDisplayedCoachHandoffRecommendationUsedMethodDrillWeighting = bHandoffRecommendationUsedMethodDrillWeighting - || bHandoffRecommendationUsedMethodDrillRecoveryMemory; - if (bHandoffRecommendationUsedMethodDrillRecoveryMemory - && RetainedMethodDrillRecoveryMemoryHandoffBias + || bHandoffRecommendationUsedMethodDrillRecoveryMemory + || bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture + || bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture; + if (bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture + || bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture) + { + DisplayedCoachHandoffMethodDrillRecoveryMemoryStartActionSourceLabel = + HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel( + DisplayedCoachHandoffRecommendationKind, + false, + false, + bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture + ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong + : HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak, + true + ); + } + else if (bHandoffRecommendationUsedMethodDrillRecoveryMemory + && EffectiveMethodDrillRecoveryMemoryHandoffBias != HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None) { DisplayedCoachHandoffMethodDrillRecoveryMemoryStartActionSourceLabel = @@ -7370,7 +7545,7 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() DisplayedCoachHandoffRecommendationKind, false, false, - RetainedMethodDrillRecoveryMemoryHandoffBias + EffectiveMethodDrillRecoveryMemoryHandoffBias ); } @@ -7482,12 +7657,8 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() bRecommendedReadyForHandoff, bHandoffRecommendationUsedDeferredFirstSuppressionSignal, bHandoffRecommendationUsedMethodDrillWeighting, - bHandoffRecommendationUsedMethodDrillRecoveryMemory - && EffectiveMethodDrillRecoveryMemoryHandoffBias - == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong, - bHandoffRecommendationUsedMethodDrillRecoveryMemory - && EffectiveMethodDrillRecoveryMemoryHandoffBias - == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak + bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture, + bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture ); FString QueuedRunLabel = CachedCoachPanelState.NextQueueSourceLabel.IsEmpty() ? TEXT("Start Queue") diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp index f5d8bb6..a23ec9e 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp @@ -47,7 +47,13 @@ namespace HyperTwistTrainingCoachLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") - || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended"); + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended"); } bool IsMethodDrillRecoveryMemorySource(const FString& SourceLabel) @@ -55,6 +61,8 @@ namespace HyperTwistTrainingCoachLibraryInternal return IsMethodDrillDashboardHandoffSource(SourceLabel) || SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak"); } @@ -62,18 +70,30 @@ namespace HyperTwistTrainingCoachLibraryInternal bool IsStrongMethodDrillRecoveryMemorySource(const FString& SourceLabel) { return SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-strong-")) + || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-")) || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong"); } bool IsWeakMethodDrillRecoveryMemorySource(const FString& SourceLabel) { return SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-weak-")) + || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-")) || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak"); } @@ -108,7 +128,8 @@ namespace HyperTwistTrainingCoachLibraryInternal bool IsQueueRecoveryMemorySource(const FString& SourceLabel) { return SourceLabel.StartsWith(TEXT("coach-memory-queue-")) - || IsDashboardHandoffGuidanceSource(SourceLabel); + || IsDashboardHandoffGuidanceSource(SourceLabel) + || IsMethodDrillRecoveryMemorySource(SourceLabel); } FString DescribeCoachMemorySourceLabel(const FString& SourceLabel) @@ -173,6 +194,18 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted strong drill-recovery-memory recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-queued")) + { + return TEXT("accepted strong retained drill-recovery-posture queued handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-follow-up")) + { + return TEXT("accepted strong retained drill-recovery-posture follow-up handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-recommended")) + { + return TEXT("accepted strong retained drill-recovery-posture recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-queued")) { return TEXT("accepted weak drill-recovery-memory queued handoff history"); @@ -185,6 +218,18 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted weak drill-recovery-memory recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-queued")) + { + return TEXT("accepted weak retained drill-recovery-posture queued handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-follow-up")) + { + return TEXT("accepted weak retained drill-recovery-posture follow-up handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-recommended")) + { + return TEXT("accepted weak retained drill-recovery-posture recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-queue-follow-up")) { return TEXT("queue follow-up recovery memory"); @@ -241,6 +286,18 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted strong drill-recovery-memory recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")) + { + return TEXT("accepted strong retained drill-recovery-posture queued dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")) + { + return TEXT("accepted strong retained drill-recovery-posture follow-up dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended")) + { + return TEXT("accepted strong retained drill-recovery-posture recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued")) { return TEXT("accepted weak drill-recovery-memory queued dashboard handoff"); @@ -253,6 +310,18 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted weak drill-recovery-memory recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")) + { + return TEXT("accepted weak retained drill-recovery-posture queued dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")) + { + return TEXT("accepted weak retained drill-recovery-posture follow-up dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended")) + { + return TEXT("accepted weak retained drill-recovery-posture recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-queued")) { return TEXT("accepted deferred-overflow queued outcome handoff"); @@ -317,6 +386,14 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("weak retained drill-recovery-memory history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong")) + { + return TEXT("successful retained drill-recovery-posture history"); + } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak")) + { + return TEXT("weak retained drill-recovery-posture history"); + } return SourceLabel.IsEmpty() ? TEXT("none") : SourceLabel; } diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp index 1fac8cf..c8c5ded 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp @@ -79,9 +79,15 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended") || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-")); } @@ -89,14 +95,36 @@ namespace HyperTwistTrainingRepositoryLibraryInternal { return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") - || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended"); + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended"); } bool IsWeakMethodDrillRecoveryDashboardHandoffSource(const FString& SourceLabel) { return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") - || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended"); + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended"); + } + + bool IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource( + const FString& SourceLabel) + { + return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended"); + } + + bool IsWeakRetainedMethodDrillRecoveryPostureDashboardHandoffSource( + const FString& SourceLabel) + { + return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended"); } bool IsMethodDrillRecoveryCoachMemorySource(const FString& SourceLabel) @@ -104,7 +132,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal return SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong") - || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak"); + || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak"); } EHyperTwistTrainingCoachHandoffKind DashboardHandoffKindFromSourceLabel(const FString& SourceLabel) @@ -114,7 +144,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-deferred-first-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") - || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued")) + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")) { return EHyperTwistTrainingCoachHandoffKind::Queue; } @@ -123,7 +155,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-deferred-first-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") - || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up")) + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")) { return EHyperTwistTrainingCoachHandoffKind::FollowUp; } @@ -132,7 +166,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-deferred-first-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") - || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended")) + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended")) { return EHyperTwistTrainingCoachHandoffKind::Recommended; } @@ -153,7 +189,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal const bool bDeferredFirstDriven = false, const bool bMethodDrillDriven = false, const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = - EMethodDrillRecoveryMemoryBias::None + EMethodDrillRecoveryMemoryBias::None, + const bool bRetainedMethodDrillRecoveryPostureDriven = false ) { switch (HandoffKind) @@ -164,11 +201,19 @@ namespace HyperTwistTrainingRepositoryLibraryInternal if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Strong) { + if (bRetainedMethodDrillRecoveryPostureDriven) + { + return TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-queued"); + } return TEXT("coach-memory-dashboard-method-drill-recovery-strong-queued"); } if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Weak) { + if (bRetainedMethodDrillRecoveryPostureDriven) + { + return TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-queued"); + } return TEXT("coach-memory-dashboard-method-drill-recovery-weak-queued"); } return TEXT("coach-memory-dashboard-method-drill-queued"); @@ -186,11 +231,19 @@ namespace HyperTwistTrainingRepositoryLibraryInternal if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Strong) { + if (bRetainedMethodDrillRecoveryPostureDriven) + { + return TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-follow-up"); + } return TEXT("coach-memory-dashboard-method-drill-recovery-strong-follow-up"); } if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Weak) { + if (bRetainedMethodDrillRecoveryPostureDriven) + { + return TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-follow-up"); + } return TEXT("coach-memory-dashboard-method-drill-recovery-weak-follow-up"); } return TEXT("coach-memory-dashboard-method-drill-follow-up"); @@ -208,11 +261,19 @@ namespace HyperTwistTrainingRepositoryLibraryInternal if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Strong) { + if (bRetainedMethodDrillRecoveryPostureDriven) + { + return TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-recommended"); + } return TEXT("coach-memory-dashboard-method-drill-recovery-strong-recommended"); } if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Weak) { + if (bRetainedMethodDrillRecoveryPostureDriven) + { + return TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-recommended"); + } return TEXT("coach-memory-dashboard-method-drill-recovery-weak-recommended"); } return TEXT("coach-memory-dashboard-method-drill-recommended"); @@ -611,6 +672,24 @@ namespace HyperTwistTrainingRepositoryLibraryInternal WeakMethodDrillRecoveryMemoryStartedCount - WeakMethodDrillRecoveryMemoryCompletedCount ); + const int32 StrongRetainedMethodDrillRecoveryPostureStartedCount = + QueueExecutionSummary.StartedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount; + const int32 StrongRetainedMethodDrillRecoveryPostureCompletedCount = + QueueExecutionSummary.CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount; + const int32 StrongRetainedMethodDrillRecoveryPostureOutstandingCount = FMath::Max( + 0, + StrongRetainedMethodDrillRecoveryPostureStartedCount + - StrongRetainedMethodDrillRecoveryPostureCompletedCount + ); + const int32 WeakRetainedMethodDrillRecoveryPostureStartedCount = + QueueExecutionSummary.StartedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount; + const int32 WeakRetainedMethodDrillRecoveryPostureCompletedCount = + QueueExecutionSummary.CompletedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount; + const int32 WeakRetainedMethodDrillRecoveryPostureOutstandingCount = FMath::Max( + 0, + WeakRetainedMethodDrillRecoveryPostureStartedCount + - WeakRetainedMethodDrillRecoveryPostureCompletedCount + ); if (MethodDrillRecoveryStartedCount > 0) { Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount; @@ -662,6 +741,24 @@ namespace HyperTwistTrainingRepositoryLibraryInternal 1, 3) : 0; + const int32 RetainedMethodDrillRecoveryPostureLaunchBias = + StrongRetainedMethodDrillRecoveryPostureStartedCount > 0 + ? FMath::Clamp( + (StrongRetainedMethodDrillRecoveryPostureCompletedCount * 2) + - StrongRetainedMethodDrillRecoveryPostureOutstandingCount + + 1, + 1, + 3) + : 0; + const int32 RetainedMethodDrillRecoveryPosturePromoteBias = + WeakRetainedMethodDrillRecoveryPostureStartedCount > 0 + ? FMath::Clamp( + (WeakRetainedMethodDrillRecoveryPostureOutstandingCount * 2) + - WeakRetainedMethodDrillRecoveryPostureCompletedCount + + 1, + 1, + 3) + : 0; if (ExplicitQueuedHandoffSignal > 0 || ExplicitFollowUpHandoffSignal > 0 || ExplicitRecommendedHandoffSignal > 0) @@ -669,11 +766,16 @@ namespace HyperTwistTrainingRepositoryLibraryInternal if (ExplicitQueuedHandoffSignal >= ExplicitFollowUpHandoffSignal && ExplicitQueuedHandoffSignal >= ExplicitRecommendedHandoffSignal) { - const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = + const bool bRetainedMethodDrillRecoveryPostureDriven = ExplicitMethodDrillQueuedHandoffSignal > 0 + && RetainedMethodDrillRecoveryPostureLaunchBias > 0; + const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = + bRetainedMethodDrillRecoveryPostureDriven + ? EMethodDrillRecoveryMemoryBias::Strong + : (ExplicitMethodDrillQueuedHandoffSignal > 0 && RetainedMethodDrillRecoveryLaunchBias > 0 ? EMethodDrillRecoveryMemoryBias::Strong - : EMethodDrillRecoveryMemoryBias::None; + : EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Queue; Snapshot.PreferredCoachHandoffSourceLabel = HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( @@ -681,16 +783,22 @@ namespace HyperTwistTrainingRepositoryLibraryInternal ExplicitDeferredOverflowQueuedHandoffSignal > 0, ExplicitDeferredFirstQueuedHandoffSignal > 0, ExplicitMethodDrillQueuedHandoffSignal > 0, - MethodDrillRecoveryMemoryBias + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven ); } else if (ExplicitFollowUpHandoffSignal >= ExplicitRecommendedHandoffSignal) { - const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = + const bool bRetainedMethodDrillRecoveryPostureDriven = ExplicitMethodDrillFollowUpHandoffSignal > 0 + && RetainedMethodDrillRecoveryPostureLaunchBias > 0; + const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = + bRetainedMethodDrillRecoveryPostureDriven + ? EMethodDrillRecoveryMemoryBias::Strong + : (ExplicitMethodDrillFollowUpHandoffSignal > 0 && RetainedMethodDrillRecoveryLaunchBias > 0 ? EMethodDrillRecoveryMemoryBias::Strong - : EMethodDrillRecoveryMemoryBias::None; + : EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp; Snapshot.PreferredCoachHandoffSourceLabel = HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( @@ -698,16 +806,22 @@ namespace HyperTwistTrainingRepositoryLibraryInternal ExplicitDeferredOverflowFollowUpHandoffSignal > 0, ExplicitDeferredFirstFollowUpHandoffSignal > 0, ExplicitMethodDrillFollowUpHandoffSignal > 0, - MethodDrillRecoveryMemoryBias + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven ); } else { - const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = + const bool bRetainedMethodDrillRecoveryPostureDriven = ExplicitMethodDrillRecommendedHandoffSignal > 0 + && RetainedMethodDrillRecoveryPosturePromoteBias > 0; + const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = + bRetainedMethodDrillRecoveryPostureDriven + ? EMethodDrillRecoveryMemoryBias::Weak + : (ExplicitMethodDrillRecommendedHandoffSignal > 0 && RetainedMethodDrillRecoveryPromoteBias > 0 ? EMethodDrillRecoveryMemoryBias::Weak - : EMethodDrillRecoveryMemoryBias::None; + : EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Recommended; Snapshot.PreferredCoachHandoffSourceLabel = HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( @@ -715,7 +829,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal ExplicitDeferredOverflowRecommendedHandoffSignal > 0, ExplicitDeferredFirstRecommendedHandoffSignal > 0, ExplicitMethodDrillRecommendedHandoffSignal > 0, - MethodDrillRecoveryMemoryBias + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven ); } } @@ -728,7 +843,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + ExplicitMethodDrillQueuedHandoffSignal + ExplicitMethodDrillFollowUpHandoffSignal + MethodDrillRecoveryLaunchBias - + RetainedMethodDrillRecoveryLaunchBias; + + RetainedMethodDrillRecoveryLaunchBias + + RetainedMethodDrillRecoveryPostureLaunchBias; const int32 WeightedRecommendedRecoverySignal = ExplicitRecommendedRecoverySignal + ExplicitRecommendedHandoffSignal @@ -736,7 +852,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + ExplicitDeferredFirstRecommendedHandoffSignal + ExplicitMethodDrillRecommendedHandoffSignal + MethodDrillRecoveryPromoteBias - + RetainedMethodDrillRecoveryPromoteBias; + + RetainedMethodDrillRecoveryPromoteBias + + RetainedMethodDrillRecoveryPosturePromoteBias; const bool bQueueHistoryPrefersFollowUp = DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp || (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp @@ -754,7 +871,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + (DominantDeferredLane != EHyperTwistTrainingCoachGuidanceLane::None ? 1.5f : 0.0f) - (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f) + (static_cast(MethodDrillRecoveryPromoteBias) * 1.5f) - + (static_cast(RetainedMethodDrillRecoveryPromoteBias) * 1.75f); + + (static_cast(RetainedMethodDrillRecoveryPromoteBias) * 1.75f) + + (static_cast(RetainedMethodDrillRecoveryPosturePromoteBias) * 2.0f); const float LaunchRecoveryActionPressure = (QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f) + (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 2.5f : 0.0f) @@ -770,7 +888,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + static_cast(ExplicitMethodDrillFollowUpHandoffSignal) + static_cast(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f + (static_cast(MethodDrillRecoveryLaunchBias) * 1.75f) - + (static_cast(RetainedMethodDrillRecoveryLaunchBias) * 2.0f); + + (static_cast(RetainedMethodDrillRecoveryLaunchBias) * 2.0f) + + (static_cast(RetainedMethodDrillRecoveryPostureLaunchBias) * 2.25f); if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f) { if (PromoteRecoveryActionPressure > LaunchRecoveryActionPressure) @@ -799,6 +918,29 @@ namespace HyperTwistTrainingRepositoryLibraryInternal } } if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery + && RetainedMethodDrillRecoveryPostureLaunchBias > 0 + && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() + || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillDashboardHandoffSource( + Snapshot.PreferredQueueRecoveryActionSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource( + Snapshot.PreferredQueueRecoveryActionSourceLabel))) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-posture-strong"); + } + else if (Snapshot.PreferredQueueRecoveryAction + == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred + && RetainedMethodDrillRecoveryPosturePromoteBias > 0 + && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() + || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource( + Snapshot.PreferredQueueRecoveryActionSourceLabel))) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-posture-weak"); + } + else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery && RetainedMethodDrillRecoveryLaunchBias > 0 && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) @@ -6770,6 +6912,24 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der WeakMethodDrillRecoveryMemoryStartedCount - WeakMethodDrillRecoveryMemoryCompletedCount ); + const int32 StrongRetainedMethodDrillRecoveryPostureStartedCount = + QueueExecutionSummary.StartedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount; + const int32 StrongRetainedMethodDrillRecoveryPostureCompletedCount = + QueueExecutionSummary.CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount; + const int32 StrongRetainedMethodDrillRecoveryPostureOutstandingCount = FMath::Max( + 0, + StrongRetainedMethodDrillRecoveryPostureStartedCount + - StrongRetainedMethodDrillRecoveryPostureCompletedCount + ); + const int32 WeakRetainedMethodDrillRecoveryPostureStartedCount = + QueueExecutionSummary.StartedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount; + const int32 WeakRetainedMethodDrillRecoveryPostureCompletedCount = + QueueExecutionSummary.CompletedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount; + const int32 WeakRetainedMethodDrillRecoveryPostureOutstandingCount = FMath::Max( + 0, + WeakRetainedMethodDrillRecoveryPostureStartedCount + - WeakRetainedMethodDrillRecoveryPostureCompletedCount + ); if (MethodDrillRecoveryStartedCount > 0) { Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount; @@ -6821,6 +6981,24 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der 1, 3) : 0; + const int32 RetainedMethodDrillRecoveryPostureLaunchBias = + StrongRetainedMethodDrillRecoveryPostureStartedCount > 0 + ? FMath::Clamp( + (StrongRetainedMethodDrillRecoveryPostureCompletedCount * 2) + - StrongRetainedMethodDrillRecoveryPostureOutstandingCount + + 1, + 1, + 3) + : 0; + const int32 RetainedMethodDrillRecoveryPosturePromoteBias = + WeakRetainedMethodDrillRecoveryPostureStartedCount > 0 + ? FMath::Clamp( + (WeakRetainedMethodDrillRecoveryPostureOutstandingCount * 2) + - WeakRetainedMethodDrillRecoveryPostureCompletedCount + + 1, + 1, + 3) + : 0; if (ExplicitQueuedHandoffSignal > 0 || ExplicitFollowUpHandoffSignal > 0 || ExplicitRecommendedHandoffSignal > 0) @@ -6828,12 +7006,17 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der if (ExplicitQueuedHandoffSignal >= ExplicitFollowUpHandoffSignal && ExplicitQueuedHandoffSignal >= ExplicitRecommendedHandoffSignal) { + const bool bRetainedMethodDrillRecoveryPostureDriven = + ExplicitMethodDrillQueuedHandoffSignal > 0 + && RetainedMethodDrillRecoveryPostureLaunchBias > 0; const HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = - ExplicitMethodDrillQueuedHandoffSignal > 0 + bRetainedMethodDrillRecoveryPostureDriven + ? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Strong + : (ExplicitMethodDrillQueuedHandoffSignal > 0 && RetainedMethodDrillRecoveryLaunchBias > 0 ? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Strong - : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None; + : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Queue; Snapshot.PreferredCoachHandoffSourceLabel = HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( @@ -6841,17 +7024,23 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der ExplicitDeferredOverflowQueuedHandoffSignal > 0, ExplicitDeferredFirstQueuedHandoffSignal > 0, ExplicitMethodDrillQueuedHandoffSignal > 0, - MethodDrillRecoveryMemoryBias + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven ); } else if (ExplicitFollowUpHandoffSignal >= ExplicitRecommendedHandoffSignal) { + const bool bRetainedMethodDrillRecoveryPostureDriven = + ExplicitMethodDrillFollowUpHandoffSignal > 0 + && RetainedMethodDrillRecoveryPostureLaunchBias > 0; const HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = - ExplicitMethodDrillFollowUpHandoffSignal > 0 + bRetainedMethodDrillRecoveryPostureDriven + ? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Strong + : (ExplicitMethodDrillFollowUpHandoffSignal > 0 && RetainedMethodDrillRecoveryLaunchBias > 0 ? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Strong - : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None; + : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp; Snapshot.PreferredCoachHandoffSourceLabel = HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( @@ -6859,17 +7048,23 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der ExplicitDeferredOverflowFollowUpHandoffSignal > 0, ExplicitDeferredFirstFollowUpHandoffSignal > 0, ExplicitMethodDrillFollowUpHandoffSignal > 0, - MethodDrillRecoveryMemoryBias + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven ); } else { + const bool bRetainedMethodDrillRecoveryPostureDriven = + ExplicitMethodDrillRecommendedHandoffSignal > 0 + && RetainedMethodDrillRecoveryPosturePromoteBias > 0; const HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = - ExplicitMethodDrillRecommendedHandoffSignal > 0 + bRetainedMethodDrillRecoveryPostureDriven + ? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Weak + : (ExplicitMethodDrillRecommendedHandoffSignal > 0 && RetainedMethodDrillRecoveryPromoteBias > 0 ? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Weak - : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None; + : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Recommended; Snapshot.PreferredCoachHandoffSourceLabel = HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( @@ -6877,7 +7072,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der ExplicitDeferredOverflowRecommendedHandoffSignal > 0, ExplicitDeferredFirstRecommendedHandoffSignal > 0, ExplicitMethodDrillRecommendedHandoffSignal > 0, - MethodDrillRecoveryMemoryBias + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven ); } } @@ -6890,7 +7086,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + ExplicitMethodDrillQueuedHandoffSignal + ExplicitMethodDrillFollowUpHandoffSignal + MethodDrillRecoveryLaunchBias - + RetainedMethodDrillRecoveryLaunchBias; + + RetainedMethodDrillRecoveryLaunchBias + + RetainedMethodDrillRecoveryPostureLaunchBias; const int32 WeightedRecommendedRecoverySignal = ExplicitRecommendedRecoverySignal + ExplicitRecommendedHandoffSignal @@ -6898,7 +7095,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + ExplicitDeferredFirstRecommendedHandoffSignal + ExplicitMethodDrillRecommendedHandoffSignal + MethodDrillRecoveryPromoteBias - + RetainedMethodDrillRecoveryPromoteBias; + + RetainedMethodDrillRecoveryPromoteBias + + RetainedMethodDrillRecoveryPosturePromoteBias; const bool bQueueHistoryPrefersFollowUp = DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp || (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp @@ -6916,7 +7114,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + (DominantDeferredLane != EHyperTwistTrainingCoachGuidanceLane::None ? 1.5f : 0.0f) - (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f) + (static_cast(MethodDrillRecoveryPromoteBias) * 1.5f) - + (static_cast(RetainedMethodDrillRecoveryPromoteBias) * 1.75f); + + (static_cast(RetainedMethodDrillRecoveryPromoteBias) * 1.75f) + + (static_cast(RetainedMethodDrillRecoveryPosturePromoteBias) * 2.0f); const float LaunchRecoveryActionPressure = (QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f) + (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 2.5f : 0.0f) @@ -6932,7 +7131,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + static_cast(ExplicitMethodDrillFollowUpHandoffSignal) + static_cast(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f + (static_cast(MethodDrillRecoveryLaunchBias) * 1.75f) - + (static_cast(RetainedMethodDrillRecoveryLaunchBias) * 2.0f); + + (static_cast(RetainedMethodDrillRecoveryLaunchBias) * 2.0f) + + (static_cast(RetainedMethodDrillRecoveryPostureLaunchBias) * 2.25f); if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f) { if (PromoteRecoveryActionPressure > LaunchRecoveryActionPressure) @@ -6961,6 +7161,29 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der } } if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery + && RetainedMethodDrillRecoveryPostureLaunchBias > 0 + && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() + || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillDashboardHandoffSource( + Snapshot.PreferredQueueRecoveryActionSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource( + Snapshot.PreferredQueueRecoveryActionSourceLabel))) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-posture-strong"); + } + else if (Snapshot.PreferredQueueRecoveryAction + == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred + && RetainedMethodDrillRecoveryPosturePromoteBias > 0 + && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() + || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource( + Snapshot.PreferredQueueRecoveryActionSourceLabel))) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-posture-weak"); + } + else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery && RetainedMethodDrillRecoveryLaunchBias > 0 && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) @@ -8832,6 +9055,12 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito const bool bWeakMethodDrillRecoveryDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); + const bool bWeakRetainedMethodDrillRecoveryPostureDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsWeakRetainedMethodDrillRecoveryPostureDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); if (DashboardHandoffKind == EHyperTwistTrainingCoachHandoffKind::Queue) { Summary.StartedQueuedHandoffEventCount += 1; @@ -8888,6 +9117,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedWeakMethodDrillRecoveryMemoryHandoffEventCount += 1; } + if (bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff) + { + Summary.StartedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount += 1; + } + if (bWeakRetainedMethodDrillRecoveryPostureDashboardHandoff) + { + Summary.StartedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount += 1; + } if (Summary.LastStartedAtUtc.IsEmpty() || HyperTwistTrainingRepositoryLibraryInternal::CompareUtcStrings( HistoryEntry.EventAtUtc, @@ -8944,6 +9181,12 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito const bool bWeakMethodDrillRecoveryDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); + const bool bWeakRetainedMethodDrillRecoveryPostureDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsWeakRetainedMethodDrillRecoveryPostureDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const EHyperTwistTrainingCoachHandoffKind CompletedHandoffKind = HyperTwistTrainingRepositoryLibraryInternal::DashboardHandoffKindFromSourceLabel( HistoryEntry.StartActionSourceLabel); @@ -8967,6 +9210,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.CompletedWeakMethodDrillRecoveryMemoryHandoffEventCount += 1; } + if (bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff) + { + Summary.CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount += 1; + } + if (bWeakRetainedMethodDrillRecoveryPostureDashboardHandoff) + { + Summary.CompletedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount += 1; + } } CompletedCountsByEntryId.FindOrAdd(HistoryEntry.EntryId) += 1; if (Summary.LastCompletedAtUtc.IsEmpty() diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 229c036..d0c34b4 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -3690,6 +3690,18 @@ struct FHyperTwistTrainingCoachSessionQueueExecutionSummary UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 CompletedWeakMethodDrillRecoveryMemoryHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 PromotedFollowUpEventCount = 0;