From a43d932aa8e717eeba6a0a4e9e932aeb378fdaf1 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Wed, 29 Apr 2026 16:21:37 +0200 Subject: [PATCH] Persist drill follow-up packet learning upstream --- .../HyperTwistCoachDashboardWidget.cpp | 87 ++++++++++ .../HyperTwistTrainingCoachLibrary.cpp | 54 ++++++- .../HyperTwistTrainingRepositoryLibrary.cpp | 150 +++++++++++++++++- .../HyperTwistTrainingSubsystem.cpp | 12 +- .../HyperTwistTrainingTypes.h | 18 +++ 5 files changed, 309 insertions(+), 12 deletions(-) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index cb882a7..5c1ae6a 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -336,6 +336,30 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted weak retained drill-recovery-posture recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-follow-up-packet-strong-queued")) + { + return TEXT("accepted strong drill-follow-up-packet queued handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-follow-up-packet-strong-follow-up")) + { + return TEXT("accepted strong drill-follow-up-packet follow-up handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-follow-up-packet-strong-recommended")) + { + return TEXT("accepted strong drill-follow-up-packet recommended handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-follow-up-packet-weak-queued")) + { + return TEXT("accepted weak drill-follow-up-packet queued handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-follow-up-packet-weak-follow-up")) + { + return TEXT("accepted weak drill-follow-up-packet follow-up handoff history"); + } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-follow-up-packet-weak-recommended")) + { + return TEXT("accepted weak drill-follow-up-packet recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-queued")) { return TEXT("accepted queued handoff history"); @@ -669,6 +693,42 @@ namespace HyperTwistCoachDashboardWidgetInternal } } + FString DashboardMethodDrillFollowUpPacketSourceLabel( + const EHyperTwistTrainingCoachHandoffKind HandoffKind, + const EMethodDrillRecoveryMemoryBias PacketBias) + { + if (PacketBias == EMethodDrillRecoveryMemoryBias::Strong) + { + switch (HandoffKind) + { + case EHyperTwistTrainingCoachHandoffKind::Queue: + return TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-queued"); + case EHyperTwistTrainingCoachHandoffKind::FollowUp: + return TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-follow-up"); + case EHyperTwistTrainingCoachHandoffKind::Recommended: + return TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-recommended"); + default: + return FString(); + } + } + if (PacketBias == EMethodDrillRecoveryMemoryBias::Weak) + { + switch (HandoffKind) + { + case EHyperTwistTrainingCoachHandoffKind::Queue: + return TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-queued"); + case EHyperTwistTrainingCoachHandoffKind::FollowUp: + return TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-follow-up"); + case EHyperTwistTrainingCoachHandoffKind::Recommended: + return TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-recommended"); + default: + return FString(); + } + } + + return FString(); + } + const FHyperTwistCoachSignal* FindCoachSignalById( const TArray& Signals, const TCHAR* SignalId) @@ -8118,6 +8178,22 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() || bHandoffRecommendationUsedMethodDrillRecoveryMemory || bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture || bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture; + const bool bHandoffRecommendationUsedStrongMethodDrillFollowUpPacket = + bHandoffRecommendationUsedMethodDrillWeighting + && HandoffRecommendationKind + != HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None + && MethodDrillFollowUpWeighting.bPreferDrillFollowUp + && MethodDrillFollowUpWeighting.StrongPacketContinuationCount > 0 + && MethodDrillFollowUpWeighting.StrongPacketContinuationCount + >= MethodDrillFollowUpWeighting.WeakPacketRedirectCount; + const bool bHandoffRecommendationUsedWeakMethodDrillFollowUpPacket = + bHandoffRecommendationUsedMethodDrillWeighting + && HandoffRecommendationKind + != HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None + && MethodDrillFollowUpWeighting.bPreferCoachHandoff + && MethodDrillFollowUpWeighting.WeakPacketRedirectCount > 0 + && MethodDrillFollowUpWeighting.WeakPacketRedirectCount + >= MethodDrillFollowUpWeighting.StrongPacketContinuationCount; if (bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture || bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture) { @@ -8161,6 +8237,17 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() true ); } + else if (bHandoffRecommendationUsedStrongMethodDrillFollowUpPacket + || bHandoffRecommendationUsedWeakMethodDrillFollowUpPacket) + { + DisplayedCoachHandoffMethodDrillRecoveryMemoryStartActionSourceLabel = + HyperTwistCoachDashboardWidgetInternal::DashboardMethodDrillFollowUpPacketSourceLabel( + DisplayedCoachHandoffRecommendationKind, + bHandoffRecommendationUsedStrongMethodDrillFollowUpPacket + ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong + : HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak + ); + } CoachHandoffRecommendationDetailLine = FString::Printf( TEXT("Closure continuation bias %d | Closure suppression bias %d | Queue ready: %s | Follow-up ready: %s | Recommended ready: %s | Preferred lane: %s | Memory source: %s%s%s%s%s%s%s%s | Launch bias: %s from %s | broadened/tightened history %d/%d | deferred tightened launches %d | deferred launch cases %d%s | Handoff history preferred: %s"), diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp index f15a6bc..63ee550 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp @@ -42,6 +42,12 @@ namespace HyperTwistTrainingCoachLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-recommended") || 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") @@ -356,6 +362,30 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted drill-driven recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-queued")) + { + return TEXT("accepted strong drill-follow-up-packet queued dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-follow-up")) + { + return TEXT("accepted strong drill-follow-up-packet follow-up dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-recommended")) + { + return TEXT("accepted strong drill-follow-up-packet recommended dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-queued")) + { + return TEXT("accepted weak drill-follow-up-packet queued dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-follow-up")) + { + return TEXT("accepted weak drill-follow-up-packet follow-up dashboard handoff"); + } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-recommended")) + { + return TEXT("accepted weak drill-follow-up-packet recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued")) { return TEXT("accepted strong drill-recovery-memory queued dashboard handoff"); @@ -472,10 +502,18 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("successful method-drill follow-up history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-follow-up-packet-strong")) + { + return TEXT("successful drill-follow-up-packet history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-follow-up-weak")) { return TEXT("weak method-drill follow-up history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-follow-up-packet-weak")) + { + return TEXT("weak drill-follow-up-packet history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-strong")) { return TEXT("successful drill-driven recovery history"); @@ -639,10 +677,14 @@ namespace HyperTwistTrainingCoachLibraryInternal { const bool bPreferredGuidanceSource = CoachMemorySnapshot.PreferredGuidanceSourceLabel - == TEXT("coach-memory-method-drill-follow-up-strong"); + == TEXT("coach-memory-method-drill-follow-up-strong") + || CoachMemorySnapshot.PreferredGuidanceSourceLabel + == TEXT("coach-memory-method-drill-follow-up-packet-strong"); const bool bPreferredHandoffSource = CoachMemorySnapshot.PreferredCoachHandoffSourceLabel - == TEXT("coach-memory-method-drill-follow-up-strong"); + == TEXT("coach-memory-method-drill-follow-up-strong") + || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel.StartsWith( + TEXT("coach-memory-dashboard-method-drill-follow-up-packet-strong-")); if (CoachMemorySnapshot.MethodDrillFollowUpHistoryCount <= 0 && !bPreferredGuidanceSource && !bPreferredHandoffSource) @@ -674,10 +716,14 @@ namespace HyperTwistTrainingCoachLibraryInternal { const bool bPreferredGuidanceSource = CoachMemorySnapshot.PreferredGuidanceSourceLabel - == TEXT("coach-memory-method-drill-follow-up-weak"); + == TEXT("coach-memory-method-drill-follow-up-weak") + || CoachMemorySnapshot.PreferredGuidanceSourceLabel + == TEXT("coach-memory-method-drill-follow-up-packet-weak"); const bool bPreferredHandoffSource = CoachMemorySnapshot.PreferredCoachHandoffSourceLabel - == TEXT("coach-memory-method-drill-follow-up-weak"); + == TEXT("coach-memory-method-drill-follow-up-weak") + || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel.StartsWith( + TEXT("coach-memory-dashboard-method-drill-follow-up-packet-weak-")); if (CoachMemorySnapshot.MethodDrillFollowUpHistoryCount <= 0 && !bPreferredGuidanceSource && !bPreferredHandoffSource) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp index 470fe0a..4759051 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp @@ -76,6 +76,12 @@ namespace HyperTwistTrainingRepositoryLibraryInternal return SourceLabel == TEXT("dashboard-handoff-method-drill-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-recommended") || 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") @@ -117,6 +123,13 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended"); } + bool IsStrongMethodDrillFollowUpPacketDashboardHandoffSource(const FString& SourceLabel) + { + return SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-recommended"); + } + bool IsWeakMethodDrillRecoveryDashboardHandoffSource(const FString& SourceLabel) { return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") @@ -137,6 +150,13 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended"); } + bool IsWeakMethodDrillFollowUpPacketDashboardHandoffSource(const FString& SourceLabel) + { + return SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-recommended"); + } + bool IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource( const FString& SourceLabel) { @@ -191,6 +211,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-queued") || SourceLabel == TEXT("dashboard-handoff-deferred-first-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-queued") || 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-weak-queued") @@ -204,6 +226,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-follow-up") || SourceLabel == TEXT("dashboard-handoff-deferred-first-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-follow-up") || 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-weak-follow-up") @@ -217,6 +241,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-recommended") || SourceLabel == TEXT("dashboard-handoff-deferred-first-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up-packet-weak-recommended") || 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-weak-recommended") @@ -7118,18 +7144,88 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der 1, 3) : 0; + const int32 StrongMethodDrillFollowUpPacketStartedCount = + QueueExecutionSummary.StartedStrongMethodDrillFollowUpPacketQueuedHandoffEventCount + + QueueExecutionSummary.StartedStrongMethodDrillFollowUpPacketFollowUpHandoffEventCount + + QueueExecutionSummary.StartedStrongMethodDrillFollowUpPacketRecommendedHandoffEventCount; + const int32 WeakMethodDrillFollowUpPacketStartedCount = + QueueExecutionSummary.StartedWeakMethodDrillFollowUpPacketQueuedHandoffEventCount + + QueueExecutionSummary.StartedWeakMethodDrillFollowUpPacketFollowUpHandoffEventCount + + QueueExecutionSummary.StartedWeakMethodDrillFollowUpPacketRecommendedHandoffEventCount; + if (StrongMethodDrillFollowUpPacketStartedCount > 0 + && StrongMethodDrillFollowUpPacketStartedCount + >= WeakMethodDrillFollowUpPacketStartedCount) + { + const int32 MethodDrillFollowUpPacketBias = FMath::Clamp( + StrongMethodDrillFollowUpPacketStartedCount + - WeakMethodDrillFollowUpPacketStartedCount + + 1, + 1, + 3 + ); + Snapshot.FollowUpGuidanceContinueBias += MethodDrillFollowUpPacketBias; + Snapshot.SuppressedPrimaryQueuePressureCount += FMath::Max( + 1, + MethodDrillFollowUpPacketBias - 1 + ); + if (Snapshot.PreferredGuidanceLane == EHyperTwistTrainingCoachGuidanceLane::None + || Snapshot.PreferredGuidanceLane + == EHyperTwistTrainingCoachGuidanceLane::Recommended + || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("recommendation-history")) + || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("coach-memory-method-drill"))) + { + Snapshot.PreferredGuidanceLane = + EHyperTwistTrainingCoachGuidanceLane::FollowUp; + Snapshot.PreferredGuidanceSourceLabel = + TEXT("coach-memory-method-drill-follow-up-packet-strong"); + } + } + else if (WeakMethodDrillFollowUpPacketStartedCount > 0) + { + const int32 MethodDrillFollowUpPacketRedirectBias = FMath::Clamp( + WeakMethodDrillFollowUpPacketStartedCount + - StrongMethodDrillFollowUpPacketStartedCount + + 1, + 1, + 2 + ); + Snapshot.RecommendedGuidanceContinueBias += MethodDrillFollowUpPacketRedirectBias; + Snapshot.SuppressedFollowUpQueuePressureCount += MethodDrillFollowUpPacketRedirectBias; + if (Snapshot.PreferredGuidanceLane == EHyperTwistTrainingCoachGuidanceLane::None + || Snapshot.PreferredGuidanceLane + == EHyperTwistTrainingCoachGuidanceLane::FollowUp + || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("coach-memory-method-drill"))) + { + Snapshot.PreferredGuidanceLane = + EHyperTwistTrainingCoachGuidanceLane::Recommended; + Snapshot.PreferredGuidanceSourceLabel = + TEXT("coach-memory-method-drill-follow-up-packet-weak"); + } + } const bool bStrongMethodDrillRecoveryPacketQueuedHandoff = QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketQueuedHandoffEventCount > 0; const bool bStrongMethodDrillRecoveryPacketFollowUpHandoff = QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketFollowUpHandoffEventCount > 0; const bool bStrongMethodDrillRecoveryPacketRecommendedHandoff = QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketRecommendedHandoffEventCount > 0; + const bool bStrongMethodDrillFollowUpPacketQueuedHandoff = + QueueExecutionSummary.StartedStrongMethodDrillFollowUpPacketQueuedHandoffEventCount > 0; + const bool bStrongMethodDrillFollowUpPacketFollowUpHandoff = + QueueExecutionSummary.StartedStrongMethodDrillFollowUpPacketFollowUpHandoffEventCount > 0; + const bool bStrongMethodDrillFollowUpPacketRecommendedHandoff = + QueueExecutionSummary.StartedStrongMethodDrillFollowUpPacketRecommendedHandoffEventCount > 0; const bool bWeakMethodDrillRecoveryPacketQueuedHandoff = QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketQueuedHandoffEventCount > 0; const bool bWeakMethodDrillRecoveryPacketFollowUpHandoff = QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketFollowUpHandoffEventCount > 0; const bool bWeakMethodDrillRecoveryPacketRecommendedHandoff = QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketRecommendedHandoffEventCount > 0; + const bool bWeakMethodDrillFollowUpPacketQueuedHandoff = + QueueExecutionSummary.StartedWeakMethodDrillFollowUpPacketQueuedHandoffEventCount > 0; + const bool bWeakMethodDrillFollowUpPacketFollowUpHandoff = + QueueExecutionSummary.StartedWeakMethodDrillFollowUpPacketFollowUpHandoffEventCount > 0; + const bool bWeakMethodDrillFollowUpPacketRecommendedHandoff = + QueueExecutionSummary.StartedWeakMethodDrillFollowUpPacketRecommendedHandoffEventCount > 0; if (ExplicitQueuedHandoffSignal > 0 || ExplicitFollowUpHandoffSignal > 0 || ExplicitRecommendedHandoffSignal > 0) @@ -7150,7 +7246,11 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Queue; Snapshot.PreferredCoachHandoffSourceLabel = - bStrongMethodDrillRecoveryPacketQueuedHandoff + bStrongMethodDrillFollowUpPacketQueuedHandoff + ? TEXT("coach-memory-dashboard-method-drill-follow-up-packet-strong-queued") + : (bWeakMethodDrillFollowUpPacketQueuedHandoff + ? TEXT("coach-memory-dashboard-method-drill-follow-up-packet-weak-queued") + : (bStrongMethodDrillRecoveryPacketQueuedHandoff ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-queued") : (bWeakMethodDrillRecoveryPacketQueuedHandoff ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-queued") @@ -7161,7 +7261,7 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der ExplicitMethodDrillQueuedHandoffSignal > 0, MethodDrillRecoveryMemoryBias, bRetainedMethodDrillRecoveryPostureDriven - )); + )))); } else if (ExplicitFollowUpHandoffSignal >= ExplicitRecommendedHandoffSignal) { @@ -7178,7 +7278,11 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp; Snapshot.PreferredCoachHandoffSourceLabel = - bStrongMethodDrillRecoveryPacketFollowUpHandoff + bStrongMethodDrillFollowUpPacketFollowUpHandoff + ? TEXT("coach-memory-dashboard-method-drill-follow-up-packet-strong-follow-up") + : (bWeakMethodDrillFollowUpPacketFollowUpHandoff + ? TEXT("coach-memory-dashboard-method-drill-follow-up-packet-weak-follow-up") + : (bStrongMethodDrillRecoveryPacketFollowUpHandoff ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-follow-up") : (bWeakMethodDrillRecoveryPacketFollowUpHandoff ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-follow-up") @@ -7189,7 +7293,7 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der ExplicitMethodDrillFollowUpHandoffSignal > 0, MethodDrillRecoveryMemoryBias, bRetainedMethodDrillRecoveryPostureDriven - )); + )))); } else { @@ -7206,7 +7310,11 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Recommended; Snapshot.PreferredCoachHandoffSourceLabel = - bStrongMethodDrillRecoveryPacketRecommendedHandoff + bStrongMethodDrillFollowUpPacketRecommendedHandoff + ? TEXT("coach-memory-dashboard-method-drill-follow-up-packet-strong-recommended") + : (bWeakMethodDrillFollowUpPacketRecommendedHandoff + ? TEXT("coach-memory-dashboard-method-drill-follow-up-packet-weak-recommended") + : (bStrongMethodDrillRecoveryPacketRecommendedHandoff ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-recommended") : (bWeakMethodDrillRecoveryPacketRecommendedHandoff ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-recommended") @@ -7217,7 +7325,7 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der ExplicitMethodDrillRecommendedHandoffSignal > 0, MethodDrillRecoveryMemoryBias, bRetainedMethodDrillRecoveryPostureDriven - )); + )))); } } const int32 WeightedFollowUpRecoverySignal = @@ -9209,12 +9317,18 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito const bool bStrongMethodDrillRecoveryDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsStrongMethodDrillRecoveryDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bStrongMethodDrillFollowUpPacketDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsStrongMethodDrillFollowUpPacketDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const bool bStrongMethodDrillRecoveryPacketDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsStrongMethodDrillRecoveryPacketDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); const bool bWeakMethodDrillRecoveryDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bWeakMethodDrillFollowUpPacketDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillFollowUpPacketDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const bool bWeakMethodDrillRecoveryPacketDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryPacketDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); @@ -9239,6 +9353,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedMethodDrillQueuedHandoffEventCount += 1; } + if (bStrongMethodDrillFollowUpPacketDashboardHandoff) + { + Summary.StartedStrongMethodDrillFollowUpPacketQueuedHandoffEventCount += 1; + } + if (bWeakMethodDrillFollowUpPacketDashboardHandoff) + { + Summary.StartedWeakMethodDrillFollowUpPacketQueuedHandoffEventCount += 1; + } if (bStrongMethodDrillRecoveryPacketDashboardHandoff) { Summary.StartedStrongMethodDrillRecoveryPacketQueuedHandoffEventCount += 1; @@ -9263,6 +9385,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedMethodDrillFollowUpHandoffEventCount += 1; } + if (bStrongMethodDrillFollowUpPacketDashboardHandoff) + { + Summary.StartedStrongMethodDrillFollowUpPacketFollowUpHandoffEventCount += 1; + } + if (bWeakMethodDrillFollowUpPacketDashboardHandoff) + { + Summary.StartedWeakMethodDrillFollowUpPacketFollowUpHandoffEventCount += 1; + } if (bStrongMethodDrillRecoveryPacketDashboardHandoff) { Summary.StartedStrongMethodDrillRecoveryPacketFollowUpHandoffEventCount += 1; @@ -9287,6 +9417,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedMethodDrillRecommendedHandoffEventCount += 1; } + if (bStrongMethodDrillFollowUpPacketDashboardHandoff) + { + Summary.StartedStrongMethodDrillFollowUpPacketRecommendedHandoffEventCount += 1; + } + if (bWeakMethodDrillFollowUpPacketDashboardHandoff) + { + Summary.StartedWeakMethodDrillFollowUpPacketRecommendedHandoffEventCount += 1; + } if (bStrongMethodDrillRecoveryPacketDashboardHandoff) { Summary.StartedStrongMethodDrillRecoveryPacketRecommendedHandoffEventCount += 1; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp index 28bd62c..f7de66e 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp @@ -223,8 +223,12 @@ namespace HyperTwistTrainingSubsystemInternal { if (CoachMemorySnapshot.PreferredGuidanceSourceLabel == TEXT("coach-memory-method-drill-follow-up-strong") + || CoachMemorySnapshot.PreferredGuidanceSourceLabel + == TEXT("coach-memory-method-drill-follow-up-packet-strong") || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel - == TEXT("coach-memory-method-drill-follow-up-strong")) + == TEXT("coach-memory-method-drill-follow-up-strong") + || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel.StartsWith( + TEXT("coach-memory-dashboard-method-drill-follow-up-packet-strong-"))) { return true; } @@ -240,8 +244,12 @@ namespace HyperTwistTrainingSubsystemInternal { if (CoachMemorySnapshot.PreferredGuidanceSourceLabel == TEXT("coach-memory-method-drill-follow-up-weak") + || CoachMemorySnapshot.PreferredGuidanceSourceLabel + == TEXT("coach-memory-method-drill-follow-up-packet-weak") || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel - == TEXT("coach-memory-method-drill-follow-up-weak")) + == TEXT("coach-memory-method-drill-follow-up-weak") + || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel.StartsWith( + TEXT("coach-memory-dashboard-method-drill-follow-up-packet-weak-"))) { return true; } diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index cd52c39..db54ff9 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -3669,6 +3669,24 @@ struct FHyperTwistTrainingCoachSessionQueueExecutionSummary UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 StartedMethodDrillRecommendedHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedStrongMethodDrillFollowUpPacketQueuedHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedStrongMethodDrillFollowUpPacketFollowUpHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedStrongMethodDrillFollowUpPacketRecommendedHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedWeakMethodDrillFollowUpPacketQueuedHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedWeakMethodDrillFollowUpPacketFollowUpHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedWeakMethodDrillFollowUpPacketRecommendedHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 StartedStrongMethodDrillRecoveryPacketQueuedHandoffEventCount = 0;