From 3c0caf9c4e9978ebee9c84135b1727211616cdef Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Wed, 29 Apr 2026 18:15:59 +0200 Subject: [PATCH] Persist drill recovery plan posture upstream --- .../HyperTwistCoachDashboardWidget.cpp | 134 ++++++++- .../HyperTwistTrainingCoachLibrary.cpp | 24 +- .../HyperTwistTrainingRepositoryLibrary.cpp | 278 +++++++++++++++++- .../HyperTwistTrainingTypes.h | 18 ++ 4 files changed, 431 insertions(+), 23 deletions(-) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index 99af15a..009044f 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -475,6 +475,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted narrow drill-recovery-structure queued dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-queued")) + { + return TEXT("accepted tight drill-recovery-plan queued dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued")) { return TEXT("accepted strong drill-recovery-packet queued dashboard handoff"); @@ -491,6 +495,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted narrow drill-recovery-structure follow-up dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-follow-up")) + { + return TEXT("accepted tight drill-recovery-plan follow-up dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up")) { return TEXT("accepted strong drill-recovery-packet follow-up dashboard handoff"); @@ -507,6 +515,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted narrow drill-recovery-structure recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-recommended")) + { + return TEXT("accepted tight drill-recovery-plan recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended")) { return TEXT("accepted strong drill-recovery-packet recommended dashboard handoff"); @@ -523,6 +535,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted broad drill-recovery-structure queued dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-queued")) + { + return TEXT("accepted broad drill-recovery-plan queued dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued")) { return TEXT("accepted weak drill-recovery-packet queued dashboard handoff"); @@ -539,6 +555,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted broad drill-recovery-structure follow-up dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-follow-up")) + { + return TEXT("accepted broad drill-recovery-plan follow-up dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up")) { return TEXT("accepted weak drill-recovery-packet follow-up dashboard handoff"); @@ -555,6 +575,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted broad drill-recovery-structure recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-recommended")) + { + return TEXT("accepted broad drill-recovery-plan recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended")) { return TEXT("accepted weak drill-recovery-packet recommended dashboard handoff"); @@ -627,6 +651,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("successful narrow drill-recovery-structure history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-tight")) + { + return TEXT("successful tight drill-recovery-plan history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong")) { return TEXT("successful retained drill-recovery-packet history"); @@ -643,6 +671,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("successful broad drill-recovery-structure redirect history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-broad")) + { + return TEXT("successful broad drill-recovery-plan redirect history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak")) { return TEXT("weak retained drill-recovery-packet history"); @@ -678,13 +710,19 @@ namespace HyperTwistCoachDashboardWidgetInternal const bool bRetainedMethodDrillRecoveryPostureDriven = false, const bool bMethodDrillRecoveryPacketDriven = false, const bool bNarrowMethodDrillRecoveryStructureDriven = false, - const bool bBroadMethodDrillRecoveryStructureDriven = false) + const bool bBroadMethodDrillRecoveryStructureDriven = false, + const bool bTightMethodDrillRecoveryStructurePlanDriven = false, + const bool bBroadMethodDrillRecoveryStructurePlanDriven = false) { if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Strong) { switch (HandoffKind) { case EHyperTwistTrainingCoachHandoffKind::Queue: + if (bTightMethodDrillRecoveryStructurePlanDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-queued"); + } if (bNarrowMethodDrillRecoveryStructureDriven) { return TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-queued"); @@ -697,6 +735,10 @@ namespace HyperTwistCoachDashboardWidgetInternal ? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") : TEXT("dashboard-handoff-method-drill-recovery-strong-queued"); case EHyperTwistTrainingCoachHandoffKind::FollowUp: + if (bTightMethodDrillRecoveryStructurePlanDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-follow-up"); + } if (bNarrowMethodDrillRecoveryStructureDriven) { return TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-follow-up"); @@ -709,6 +751,10 @@ namespace HyperTwistCoachDashboardWidgetInternal ? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") : TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up"); case EHyperTwistTrainingCoachHandoffKind::Recommended: + if (bTightMethodDrillRecoveryStructurePlanDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-recommended"); + } if (bNarrowMethodDrillRecoveryStructureDriven) { return TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-recommended"); @@ -729,6 +775,10 @@ namespace HyperTwistCoachDashboardWidgetInternal switch (HandoffKind) { case EHyperTwistTrainingCoachHandoffKind::Queue: + if (bBroadMethodDrillRecoveryStructurePlanDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-queued"); + } if (bBroadMethodDrillRecoveryStructureDriven) { return TEXT("dashboard-handoff-method-drill-recovery-structure-broad-queued"); @@ -741,6 +791,10 @@ namespace HyperTwistCoachDashboardWidgetInternal ? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") : TEXT("dashboard-handoff-method-drill-recovery-weak-queued"); case EHyperTwistTrainingCoachHandoffKind::FollowUp: + if (bBroadMethodDrillRecoveryStructurePlanDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-follow-up"); + } if (bBroadMethodDrillRecoveryStructureDriven) { return TEXT("dashboard-handoff-method-drill-recovery-structure-broad-follow-up"); @@ -753,6 +807,10 @@ namespace HyperTwistCoachDashboardWidgetInternal ? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") : TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up"); case EHyperTwistTrainingCoachHandoffKind::Recommended: + if (bBroadMethodDrillRecoveryStructurePlanDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-recommended"); + } if (bBroadMethodDrillRecoveryStructureDriven) { return TEXT("dashboard-handoff-method-drill-recovery-structure-broad-recommended"); @@ -1839,6 +1897,22 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() const bool bUseBroadMethodDrillPacketStructureRecovery = CachedCoachPanelState.PreferredQueueRecoveryActionSourceLabel == TEXT("coach-memory-method-drill-follow-up-packet-structure-broad"); + const bool bUseTightMethodDrillRecoveryStructurePlan = + CachedCoachPanelState.PreferredQueueRecoveryActionSourceLabel + == TEXT("coach-memory-method-drill-recovery-structure-plan-tight") + || (MethodDrillRecoveryPacketLaunchBias + == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong + && MethodDrillRecoveryPacketQueueBias.TightContinuationPlanCount > 0 + && MethodDrillRecoveryPacketQueueBias.TightContinuationPlanCount + >= MethodDrillRecoveryPacketQueueBias.BroadRedirectPlanCount); + const bool bUseBroadMethodDrillRecoveryStructurePlan = + CachedCoachPanelState.PreferredQueueRecoveryActionSourceLabel + == TEXT("coach-memory-method-drill-recovery-structure-plan-broad") + || (MethodDrillRecoveryPacketLaunchBias + == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak + && MethodDrillRecoveryPacketQueueBias.BroadRedirectPlanCount > 0 + && MethodDrillRecoveryPacketQueueBias.BroadRedirectPlanCount + >= MethodDrillRecoveryPacketQueueBias.TightContinuationPlanCount); auto StartRunAndRefresh = [this](const FHyperTwistTrainingRunState& RunState) { @@ -1905,7 +1979,9 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() bUseStrongRetainedMethodDrillRecoveryPosture, bUseMethodDrillRecoveryPacketSignal, bUseNarrowMethodDrillPacketStructureRecovery, - bUseBroadMethodDrillPacketStructureRecovery + bUseBroadMethodDrillPacketStructureRecovery, + bUseTightMethodDrillRecoveryStructurePlan, + bUseBroadMethodDrillRecoveryStructurePlan ]( const EHyperTwistTrainingCoachHandoffKind HandoffKind) { @@ -1926,6 +2002,8 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() true, bUseMethodDrillRecoveryPacketSignal, bUseNarrowMethodDrillPacketStructureRecovery, + false, + bUseTightMethodDrillRecoveryStructurePlan, false ); } @@ -1939,7 +2017,9 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() false, true, bUseNarrowMethodDrillPacketStructureRecovery, - bUseBroadMethodDrillPacketStructureRecovery + bUseBroadMethodDrillPacketStructureRecovery, + bUseTightMethodDrillRecoveryStructurePlan, + bUseBroadMethodDrillRecoveryStructurePlan ); } if (bUseMethodDrillRecoverySignal) @@ -1959,7 +2039,9 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() false, bUseMethodDrillRecoveryPacketSignal, bUseNarrowMethodDrillPacketStructureRecovery, - bUseBroadMethodDrillPacketStructureRecovery + bUseBroadMethodDrillPacketStructureRecovery, + bUseTightMethodDrillRecoveryStructurePlan, + bUseBroadMethodDrillRecoveryStructurePlan ); } @@ -8601,6 +8683,32 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() && MethodDrillFollowUpWeighting.WeakPacketRedirectCount > 0 && MethodDrillFollowUpWeighting.WeakPacketRedirectCount >= MethodDrillFollowUpWeighting.StrongPacketContinuationCount; + const bool bHandoffRecommendationUsedTightMethodDrillRecoveryStructurePlan = + HandoffRecommendationKind + != HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None + && EffectiveMethodDrillRecoveryMemoryHandoffBias + == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong + && ((MethodDrillRecoveryPacketHandoffBias.TightContinuationPlanCount > 0 + && MethodDrillRecoveryPacketHandoffBias.TightContinuationPlanCount + >= MethodDrillRecoveryPacketHandoffBias.BroadRedirectPlanCount + && (bHandoffRecommendationUsedMethodDrillRecoveryMemory + || bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture + || bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory)) + || CachedCoachPanelState.PreferredQueueRecoveryActionSourceLabel + == TEXT("coach-memory-method-drill-recovery-structure-plan-tight")); + const bool bHandoffRecommendationUsedBroadMethodDrillRecoveryStructurePlan = + HandoffRecommendationKind + != HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None + && EffectiveMethodDrillRecoveryMemoryHandoffBias + == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak + && ((MethodDrillRecoveryPacketHandoffBias.BroadRedirectPlanCount > 0 + && MethodDrillRecoveryPacketHandoffBias.BroadRedirectPlanCount + >= MethodDrillRecoveryPacketHandoffBias.TightContinuationPlanCount + && (bHandoffRecommendationUsedMethodDrillRecoveryMemory + || bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture + || bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory)) + || CachedCoachPanelState.PreferredQueueRecoveryActionSourceLabel + == TEXT("coach-memory-method-drill-recovery-structure-plan-broad")); if (bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture || bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture) { @@ -8613,7 +8721,11 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong : HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak, true, - bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory, + false, + false, + bHandoffRecommendationUsedTightMethodDrillRecoveryStructurePlan, + bHandoffRecommendationUsedBroadMethodDrillRecoveryStructurePlan ); } else if (bHandoffRecommendationUsedMethodDrillRecoveryMemory @@ -8627,7 +8739,11 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() false, EffectiveMethodDrillRecoveryMemoryHandoffBias, false, - bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory, + false, + false, + bHandoffRecommendationUsedTightMethodDrillRecoveryStructurePlan, + bHandoffRecommendationUsedBroadMethodDrillRecoveryStructurePlan ); } else if (bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory @@ -8641,7 +8757,11 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() false, MethodDrillRecoveryPacketHandoffSourceBias, false, - true + true, + false, + false, + bHandoffRecommendationUsedTightMethodDrillRecoveryStructurePlan, + bHandoffRecommendationUsedBroadMethodDrillRecoveryStructurePlan ); } else if (bHandoffRecommendationUsedStrongMethodDrillFollowUpPacket diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp index 448e12e..fc27f20 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp @@ -88,7 +88,9 @@ namespace HyperTwistTrainingCoachLibraryInternal || SourceLabel == TEXT("coach-memory-method-drill-follow-up-packet-structure-narrow") || SourceLabel == TEXT("coach-memory-method-drill-follow-up-packet-structure-broad") || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-narrow") - || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-broad"); + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-broad") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-tight") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-broad"); } bool IsMethodDrillRecoveryPacketSource(const FString& SourceLabel) @@ -145,12 +147,16 @@ namespace HyperTwistTrainingCoachLibraryInternal || 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-structure-plan-tight-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-recommended") || SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong") || IsNarrowMethodDrillFollowUpPacketStructureSource(SourceLabel) - || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-narrow"); + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-narrow") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-tight"); } bool IsWeakMethodDrillRecoveryMemorySource(const FString& SourceLabel) @@ -167,12 +173,16 @@ namespace HyperTwistTrainingCoachLibraryInternal || 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("dashboard-handoff-method-drill-recovery-structure-plan-broad-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-recommended") || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak") || IsBroadMethodDrillFollowUpPacketStructureSource(SourceLabel) - || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-broad"); + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-broad") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-broad"); } FString DescribeRetainedMethodDrillRecoveryStanceLabel(const FString& SourceLabel) @@ -638,6 +648,10 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("successful narrow drill-recovery-structure history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-tight")) + { + return TEXT("successful tight drill-recovery-plan history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong")) { return TEXT("successful retained drill-recovery-packet history"); @@ -650,6 +664,10 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("successful broad drill-recovery-structure redirect history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-broad")) + { + return TEXT("successful broad drill-recovery-plan redirect history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak")) { return TEXT("weak retained drill-recovery-packet history"); diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp index 49f0646..a680282 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp @@ -100,9 +100,15 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-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") @@ -120,6 +126,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-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"); @@ -150,6 +159,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-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"); @@ -173,6 +185,24 @@ namespace HyperTwistTrainingRepositoryLibraryInternal == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-recommended"); } + bool IsTightMethodDrillRecoveryStructurePlanDashboardHandoffSource(const FString& SourceLabel) + { + return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-queued") + || SourceLabel + == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-follow-up") + || SourceLabel + == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-recommended"); + } + + bool IsBroadMethodDrillRecoveryStructurePlanDashboardHandoffSource(const FString& SourceLabel) + { + return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-queued") + || SourceLabel + == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-follow-up") + || SourceLabel + == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-recommended"); + } + bool IsWeakMethodDrillRecoveryPacketDashboardHandoffSource(const FString& SourceLabel) { return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued") @@ -247,7 +277,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || 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-structure-narrow") - || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-broad"); + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-broad") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-tight") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-structure-plan-broad"); } bool IsStrongMethodDrillRecoveryPacketCoachMemorySource(const FString& SourceLabel) @@ -281,7 +313,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") @@ -298,7 +332,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") @@ -315,7 +351,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-narrow-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-tight-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-broad-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-structure-plan-broad-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") @@ -899,6 +937,28 @@ namespace HyperTwistTrainingRepositoryLibraryInternal BroadMethodDrillRecoveryStructureStartedCount - BroadMethodDrillRecoveryStructureCompletedCount ); + const int32 TightMethodDrillRecoveryStructurePlanStartedCount = + QueueExecutionSummary.StartedTightMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 TightMethodDrillRecoveryStructurePlanPromotedCount = + QueueExecutionSummary.PromotedTightMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 TightMethodDrillRecoveryStructurePlanCompletedCount = + QueueExecutionSummary.CompletedTightMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 TightMethodDrillRecoveryStructurePlanOutstandingCount = FMath::Max( + 0, + TightMethodDrillRecoveryStructurePlanStartedCount + - TightMethodDrillRecoveryStructurePlanCompletedCount + ); + const int32 BroadMethodDrillRecoveryStructurePlanStartedCount = + QueueExecutionSummary.StartedBroadMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 BroadMethodDrillRecoveryStructurePlanPromotedCount = + QueueExecutionSummary.PromotedBroadMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 BroadMethodDrillRecoveryStructurePlanCompletedCount = + QueueExecutionSummary.CompletedBroadMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 BroadMethodDrillRecoveryStructurePlanOutstandingCount = FMath::Max( + 0, + BroadMethodDrillRecoveryStructurePlanStartedCount + - BroadMethodDrillRecoveryStructurePlanCompletedCount + ); if (MethodDrillRecoveryStartedCount > 0) { Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount; @@ -989,6 +1049,30 @@ namespace HyperTwistTrainingRepositoryLibraryInternal 1, 3) : 0; + const int32 TightMethodDrillRecoveryStructurePlanLaunchBias = + (TightMethodDrillRecoveryStructurePlanStartedCount + + TightMethodDrillRecoveryStructurePlanPromotedCount) + >= 2 + ? FMath::Clamp( + (TightMethodDrillRecoveryStructurePlanCompletedCount * 2) + - TightMethodDrillRecoveryStructurePlanOutstandingCount + - TightMethodDrillRecoveryStructurePlanPromotedCount + + 1, + 1, + 3) + : 0; + const int32 BroadMethodDrillRecoveryStructurePlanPromoteBias = + (BroadMethodDrillRecoveryStructurePlanPromotedCount + + BroadMethodDrillRecoveryStructurePlanStartedCount) + >= 2 + ? FMath::Clamp( + BroadMethodDrillRecoveryStructurePlanPromotedCount + + BroadMethodDrillRecoveryStructurePlanOutstandingCount + - BroadMethodDrillRecoveryStructurePlanCompletedCount + + (QueueExecutionSummary.bHasOutstandingDeferredWork ? 1 : 0), + 1, + 3) + : 0; const bool bStrongMethodDrillRecoveryPacketQueuedHandoff = QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketQueuedHandoffEventCount > 0; const bool bStrongMethodDrillRecoveryPacketFollowUpHandoff = @@ -1099,6 +1183,7 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + MethodDrillRecoveryLaunchBias + RetainedMethodDrillRecoveryLaunchBias + RetainedMethodDrillRecoveryPostureLaunchBias + + TightMethodDrillRecoveryStructurePlanLaunchBias + NarrowMethodDrillRecoveryStructureLaunchBias; const int32 WeightedRecommendedRecoverySignal = ExplicitRecommendedRecoverySignal @@ -1109,6 +1194,7 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + MethodDrillRecoveryPromoteBias + RetainedMethodDrillRecoveryPromoteBias + RetainedMethodDrillRecoveryPosturePromoteBias + + BroadMethodDrillRecoveryStructurePlanPromoteBias + BroadMethodDrillRecoveryStructurePromoteBias; const bool bQueueHistoryPrefersFollowUp = DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp @@ -1147,6 +1233,7 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + (static_cast(MethodDrillRecoveryLaunchBias) * 1.75f) + (static_cast(RetainedMethodDrillRecoveryLaunchBias) * 2.0f) + (static_cast(RetainedMethodDrillRecoveryPostureLaunchBias) * 2.25f) + + (static_cast(TightMethodDrillRecoveryStructurePlanLaunchBias) * 2.75f) + (static_cast(NarrowMethodDrillRecoveryStructureLaunchBias) * 2.5f); if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f) { @@ -1204,6 +1291,29 @@ namespace HyperTwistTrainingRepositoryLibraryInternal Snapshot.PreferredQueueRecoveryActionSourceLabel = TEXT("coach-memory-method-drill-recovery-packet-weak"); } + else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery + && TightMethodDrillRecoveryStructurePlanLaunchBias > 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-structure-plan-tight"); + } + else if (Snapshot.PreferredQueueRecoveryAction + == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred + && BroadMethodDrillRecoveryStructurePlanPromoteBias > 0 + && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() + || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource( + Snapshot.PreferredQueueRecoveryActionSourceLabel))) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-structure-plan-broad"); + } else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery && NarrowMethodDrillRecoveryStructureLaunchBias > 0 && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() @@ -1405,12 +1515,24 @@ namespace HyperTwistTrainingRepositoryLibraryInternal ) || CoachMemorySnapshot.PreferredQueueRecoveryActionSourceLabel == TEXT("coach-memory-method-drill-recovery-structure-narrow"); + const bool bTightMethodDrillRecoveryStructurePlanHandoffSource = + HyperTwistTrainingRepositoryLibraryInternal::IsTightMethodDrillRecoveryStructurePlanDashboardHandoffSource( + CoachMemorySnapshot.PreferredCoachHandoffSourceLabel + ) + || CoachMemorySnapshot.PreferredQueueRecoveryActionSourceLabel + == TEXT("coach-memory-method-drill-recovery-structure-plan-tight"); const bool bBroadMethodDrillRecoveryStructureHandoffSource = HyperTwistTrainingRepositoryLibraryInternal::IsBroadMethodDrillRecoveryStructureDashboardHandoffSource( CoachMemorySnapshot.PreferredCoachHandoffSourceLabel ) || CoachMemorySnapshot.PreferredQueueRecoveryActionSourceLabel == TEXT("coach-memory-method-drill-recovery-structure-broad"); + const bool bBroadMethodDrillRecoveryStructurePlanHandoffSource = + HyperTwistTrainingRepositoryLibraryInternal::IsBroadMethodDrillRecoveryStructurePlanDashboardHandoffSource( + CoachMemorySnapshot.PreferredCoachHandoffSourceLabel + ) + || CoachMemorySnapshot.PreferredQueueRecoveryActionSourceLabel + == TEXT("coach-memory-method-drill-recovery-structure-plan-broad"); const bool bStrongMethodDrillRecoveryMemoryHandoffSource = CoachMemorySnapshot.PreferredCoachHandoffSourceLabel.StartsWith( TEXT("coach-memory-dashboard-method-drill-recovery-strong-")) @@ -1423,9 +1545,11 @@ namespace HyperTwistTrainingRepositoryLibraryInternal == TEXT("coach-memory-method-drill-recovery-memory-weak"); const bool bTightMethodDrillRecoveryPlanSource = bStrongMethodDrillRecoveryMemoryHandoffSource + || bTightMethodDrillRecoveryStructurePlanHandoffSource || bNarrowMethodDrillRecoveryStructureHandoffSource; const bool bBroadMethodDrillRecoveryPlanSource = bWeakMethodDrillRecoveryMemoryHandoffSource + || bBroadMethodDrillRecoveryStructurePlanHandoffSource || bBroadMethodDrillRecoveryStructureHandoffSource; if (CoachMemorySnapshot.PreferredCoachHandoffKind == EHyperTwistTrainingCoachHandoffKind::Queue && !CoachBrief.bNeedsCoachReview @@ -7389,6 +7513,28 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der BroadMethodDrillRecoveryStructureStartedCount - BroadMethodDrillRecoveryStructureCompletedCount ); + const int32 TightMethodDrillRecoveryStructurePlanStartedCount = + QueueExecutionSummary.StartedTightMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 TightMethodDrillRecoveryStructurePlanPromotedCount = + QueueExecutionSummary.PromotedTightMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 TightMethodDrillRecoveryStructurePlanCompletedCount = + QueueExecutionSummary.CompletedTightMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 TightMethodDrillRecoveryStructurePlanOutstandingCount = FMath::Max( + 0, + TightMethodDrillRecoveryStructurePlanStartedCount + - TightMethodDrillRecoveryStructurePlanCompletedCount + ); + const int32 BroadMethodDrillRecoveryStructurePlanStartedCount = + QueueExecutionSummary.StartedBroadMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 BroadMethodDrillRecoveryStructurePlanPromotedCount = + QueueExecutionSummary.PromotedBroadMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 BroadMethodDrillRecoveryStructurePlanCompletedCount = + QueueExecutionSummary.CompletedBroadMethodDrillRecoveryStructurePlanHandoffEventCount; + const int32 BroadMethodDrillRecoveryStructurePlanOutstandingCount = FMath::Max( + 0, + BroadMethodDrillRecoveryStructurePlanStartedCount + - BroadMethodDrillRecoveryStructurePlanCompletedCount + ); if (MethodDrillRecoveryStartedCount > 0) { Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount; @@ -7479,6 +7625,30 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der 1, 3) : 0; + const int32 TightMethodDrillRecoveryStructurePlanLaunchBias = + (TightMethodDrillRecoveryStructurePlanStartedCount + + TightMethodDrillRecoveryStructurePlanPromotedCount) + >= 2 + ? FMath::Clamp( + (TightMethodDrillRecoveryStructurePlanCompletedCount * 2) + - TightMethodDrillRecoveryStructurePlanOutstandingCount + - TightMethodDrillRecoveryStructurePlanPromotedCount + + 1, + 1, + 3) + : 0; + const int32 BroadMethodDrillRecoveryStructurePlanPromoteBias = + (BroadMethodDrillRecoveryStructurePlanPromotedCount + + BroadMethodDrillRecoveryStructurePlanStartedCount) + >= 2 + ? FMath::Clamp( + BroadMethodDrillRecoveryStructurePlanPromotedCount + + BroadMethodDrillRecoveryStructurePlanOutstandingCount + - BroadMethodDrillRecoveryStructurePlanCompletedCount + + (QueueExecutionSummary.bHasOutstandingDeferredWork ? 1 : 0), + 1, + 3) + : 0; const int32 StrongMethodDrillFollowUpPacketStartedCount = QueueExecutionSummary.StartedStrongMethodDrillFollowUpPacketQueuedHandoffEventCount + QueueExecutionSummary.StartedStrongMethodDrillFollowUpPacketFollowUpHandoffEventCount @@ -7670,21 +7840,23 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + ExplicitDeferredFirstQueuedHandoffSignal + ExplicitDeferredFirstFollowUpHandoffSignal + ExplicitMethodDrillQueuedHandoffSignal - + ExplicitMethodDrillFollowUpHandoffSignal - + MethodDrillRecoveryLaunchBias - + RetainedMethodDrillRecoveryLaunchBias - + RetainedMethodDrillRecoveryPostureLaunchBias - + NarrowMethodDrillRecoveryStructureLaunchBias; - const int32 WeightedRecommendedRecoverySignal = - ExplicitRecommendedRecoverySignal + + ExplicitMethodDrillFollowUpHandoffSignal + + MethodDrillRecoveryLaunchBias + + RetainedMethodDrillRecoveryLaunchBias + + RetainedMethodDrillRecoveryPostureLaunchBias + + TightMethodDrillRecoveryStructurePlanLaunchBias + + NarrowMethodDrillRecoveryStructureLaunchBias; + const int32 WeightedRecommendedRecoverySignal = + ExplicitRecommendedRecoverySignal + ExplicitRecommendedHandoffSignal + ExplicitDeferredOverflowRecommendedHandoffSignal + ExplicitDeferredFirstRecommendedHandoffSignal - + ExplicitMethodDrillRecommendedHandoffSignal - + MethodDrillRecoveryPromoteBias - + RetainedMethodDrillRecoveryPromoteBias - + RetainedMethodDrillRecoveryPosturePromoteBias - + BroadMethodDrillRecoveryStructurePromoteBias; + + ExplicitMethodDrillRecommendedHandoffSignal + + MethodDrillRecoveryPromoteBias + + RetainedMethodDrillRecoveryPromoteBias + + RetainedMethodDrillRecoveryPosturePromoteBias + + BroadMethodDrillRecoveryStructurePlanPromoteBias + + BroadMethodDrillRecoveryStructurePromoteBias; const bool bQueueHistoryPrefersFollowUp = DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp || (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp @@ -7704,6 +7876,7 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + (static_cast(MethodDrillRecoveryPromoteBias) * 1.5f) + (static_cast(RetainedMethodDrillRecoveryPromoteBias) * 1.75f) + (static_cast(RetainedMethodDrillRecoveryPosturePromoteBias) * 2.0f) + + (static_cast(BroadMethodDrillRecoveryStructurePlanPromoteBias) * 2.75f) + (static_cast(BroadMethodDrillRecoveryStructurePromoteBias) * 2.5f); const float LaunchRecoveryActionPressure = (QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f) @@ -7722,6 +7895,7 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + (static_cast(MethodDrillRecoveryLaunchBias) * 1.75f) + (static_cast(RetainedMethodDrillRecoveryLaunchBias) * 2.0f) + (static_cast(RetainedMethodDrillRecoveryPostureLaunchBias) * 2.25f) + + (static_cast(TightMethodDrillRecoveryStructurePlanLaunchBias) * 2.75f) + (static_cast(NarrowMethodDrillRecoveryStructureLaunchBias) * 2.5f); if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f) { @@ -7778,6 +7952,30 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der Snapshot.PreferredQueueRecoveryActionSourceLabel = TEXT("coach-memory-method-drill-recovery-packet-weak"); } + else if (Snapshot.PreferredQueueRecoveryAction + == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery + && TightMethodDrillRecoveryStructurePlanLaunchBias > 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-structure-plan-tight"); + } + else if (Snapshot.PreferredQueueRecoveryAction + == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred + && BroadMethodDrillRecoveryStructurePlanPromoteBias > 0 + && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() + || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource( + Snapshot.PreferredQueueRecoveryActionSourceLabel))) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-structure-plan-broad"); + } else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery && NarrowMethodDrillRecoveryStructureLaunchBias > 0 && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() @@ -9715,6 +9913,9 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito const bool bNarrowMethodDrillRecoveryStructureDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsNarrowMethodDrillRecoveryStructureDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bTightMethodDrillRecoveryStructurePlanDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsTightMethodDrillRecoveryStructurePlanDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const bool bWeakMethodDrillRecoveryDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); @@ -9727,6 +9928,9 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito const bool bBroadMethodDrillRecoveryStructureDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsBroadMethodDrillRecoveryStructureDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bBroadMethodDrillRecoveryStructurePlanDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsBroadMethodDrillRecoveryStructurePlanDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const bool bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); @@ -9764,6 +9968,10 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedNarrowMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (bTightMethodDrillRecoveryStructurePlanDashboardHandoff) + { + Summary.StartedTightMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } if (bWeakMethodDrillRecoveryPacketDashboardHandoff) { Summary.StartedWeakMethodDrillRecoveryPacketQueuedHandoffEventCount += 1; @@ -9772,6 +9980,10 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedBroadMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (bBroadMethodDrillRecoveryStructurePlanDashboardHandoff) + { + Summary.StartedBroadMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } } else if (DashboardHandoffKind == EHyperTwistTrainingCoachHandoffKind::FollowUp) { @@ -9804,6 +10016,10 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedNarrowMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (bTightMethodDrillRecoveryStructurePlanDashboardHandoff) + { + Summary.StartedTightMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } if (bWeakMethodDrillRecoveryPacketDashboardHandoff) { Summary.StartedWeakMethodDrillRecoveryPacketFollowUpHandoffEventCount += 1; @@ -9812,6 +10028,10 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedBroadMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (bBroadMethodDrillRecoveryStructurePlanDashboardHandoff) + { + Summary.StartedBroadMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } } else if (DashboardHandoffKind == EHyperTwistTrainingCoachHandoffKind::Recommended) { @@ -9844,6 +10064,10 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedNarrowMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (bTightMethodDrillRecoveryStructurePlanDashboardHandoff) + { + Summary.StartedTightMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } if (bWeakMethodDrillRecoveryPacketDashboardHandoff) { Summary.StartedWeakMethodDrillRecoveryPacketRecommendedHandoffEventCount += 1; @@ -9852,6 +10076,10 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedBroadMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (bBroadMethodDrillRecoveryStructurePlanDashboardHandoff) + { + Summary.StartedBroadMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } } if (bStrongMethodDrillRecoveryDashboardHandoff) { @@ -9910,11 +10138,21 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.PromotedNarrowMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (HyperTwistTrainingRepositoryLibraryInternal::IsTightMethodDrillRecoveryStructurePlanDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel)) + { + Summary.PromotedTightMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } if (HyperTwistTrainingRepositoryLibraryInternal::IsBroadMethodDrillRecoveryStructureDashboardHandoffSource( HistoryEntry.StartActionSourceLabel)) { Summary.PromotedBroadMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (HyperTwistTrainingRepositoryLibraryInternal::IsBroadMethodDrillRecoveryStructurePlanDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel)) + { + Summary.PromotedBroadMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } break; case EHyperTwistTrainingCoachSessionQueueEventKind::Completed: Summary.CompletedEventCount += 1; @@ -9935,12 +10173,18 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito const bool bNarrowMethodDrillRecoveryStructureDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsNarrowMethodDrillRecoveryStructureDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bTightMethodDrillRecoveryStructurePlanDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsTightMethodDrillRecoveryStructurePlanDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const bool bWeakMethodDrillRecoveryDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); const bool bBroadMethodDrillRecoveryStructureDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsBroadMethodDrillRecoveryStructureDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bBroadMethodDrillRecoveryStructurePlanDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsBroadMethodDrillRecoveryStructurePlanDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const bool bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); @@ -9970,6 +10214,10 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.CompletedNarrowMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (bTightMethodDrillRecoveryStructurePlanDashboardHandoff) + { + Summary.CompletedTightMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } if (bWeakMethodDrillRecoveryDashboardHandoff) { Summary.CompletedWeakMethodDrillRecoveryMemoryHandoffEventCount += 1; @@ -9978,6 +10226,10 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.CompletedBroadMethodDrillRecoveryStructureHandoffEventCount += 1; } + if (bBroadMethodDrillRecoveryStructurePlanDashboardHandoff) + { + Summary.CompletedBroadMethodDrillRecoveryStructurePlanHandoffEventCount += 1; + } if (bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff) { Summary.CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount += 1; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 095fe07..30a216d 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -3735,6 +3735,24 @@ struct FHyperTwistTrainingCoachSessionQueueExecutionSummary UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 CompletedBroadMethodDrillRecoveryStructureHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedTightMethodDrillRecoveryStructurePlanHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 PromotedTightMethodDrillRecoveryStructurePlanHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedTightMethodDrillRecoveryStructurePlanHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedBroadMethodDrillRecoveryStructurePlanHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 PromotedBroadMethodDrillRecoveryStructurePlanHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedBroadMethodDrillRecoveryStructurePlanHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 CompletedMethodDrillQueuedHandoffEventCount = 0;