diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index 3cd0cd7..f8132a3 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -254,6 +254,14 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("weak method-drill follow-up history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-strong")) + { + return TEXT("successful drill-driven recovery history"); + } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-weak")) + { + return TEXT("weak drill-driven recovery history"); + } return SourceLabel.IsEmpty() ? TEXT("n/a") : SourceLabel; } diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp index 486a4e9..1357194 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp @@ -44,6 +44,13 @@ namespace HyperTwistTrainingCoachLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recommended"); } + bool IsMethodDrillRecoveryMemorySource(const FString& SourceLabel) + { + return IsMethodDrillDashboardHandoffSource(SourceLabel) + || SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak"); + } + FString DescribeCoachHandoffKind(const EHyperTwistTrainingCoachHandoffKind HandoffKind) { switch (HandoffKind) @@ -207,6 +214,14 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("weak method-drill follow-up history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-strong")) + { + return TEXT("successful drill-driven recovery history"); + } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-weak")) + { + return TEXT("weak drill-driven recovery history"); + } return SourceLabel.IsEmpty() ? TEXT("none") : SourceLabel; } @@ -1134,7 +1149,7 @@ TArray UHyperTwistTrainingCoachLibrary::DeriveCoachSigna CoachMemorySnapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery; const bool bMethodDrillRecoveryActionSource = - HyperTwistTrainingCoachLibraryInternal::IsMethodDrillDashboardHandoffSource( + HyperTwistTrainingCoachLibraryInternal::IsMethodDrillRecoveryMemorySource( CoachMemorySnapshot.PreferredQueueRecoveryActionSourceLabel ); const float Score = 66.0f diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp index 6f78eca..7659706 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp @@ -79,6 +79,12 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-")); } + bool IsMethodDrillRecoveryCoachMemorySource(const FString& SourceLabel) + { + return SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak"); + } + EHyperTwistTrainingCoachHandoffKind DashboardHandoffKindFromSourceLabel(const FString& SourceLabel) { if (SourceLabel == TEXT("dashboard-handoff-queued") @@ -508,6 +514,51 @@ namespace HyperTwistTrainingRepositoryLibraryInternal 0, 4 ); + const int32 MethodDrillRecoveryStartedCount = + QueueExecutionSummary.StartedMethodDrillQueuedHandoffEventCount + + QueueExecutionSummary.StartedMethodDrillFollowUpHandoffEventCount + + QueueExecutionSummary.StartedMethodDrillRecommendedHandoffEventCount; + const int32 MethodDrillRecoveryCompletedCount = + QueueExecutionSummary.CompletedMethodDrillQueuedHandoffEventCount + + QueueExecutionSummary.CompletedMethodDrillFollowUpHandoffEventCount + + QueueExecutionSummary.CompletedMethodDrillRecommendedHandoffEventCount; + const int32 MethodDrillRecoveryOutstandingCount = FMath::Max( + 0, + MethodDrillRecoveryStartedCount - MethodDrillRecoveryCompletedCount + ); + if (MethodDrillRecoveryStartedCount > 0) + { + Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount; + Snapshot.StrongMethodDrillRecoveryHistoryCount += MethodDrillRecoveryCompletedCount; + Snapshot.WeakMethodDrillRecoveryHistoryCount += MethodDrillRecoveryOutstandingCount; + Snapshot.MethodDrillRecoveryAverageOutcomeScore = + (static_cast(MethodDrillRecoveryCompletedCount) * 100.0f) + / static_cast(MethodDrillRecoveryStartedCount); + } + const bool bStrongMethodDrillRecoveryHistory = + MethodDrillRecoveryStartedCount >= 2 + && MethodDrillRecoveryCompletedCount >= MethodDrillRecoveryOutstandingCount + && Snapshot.MethodDrillRecoveryAverageOutcomeScore >= 55.0f; + const bool bWeakMethodDrillRecoveryHistory = + MethodDrillRecoveryStartedCount >= 2 + && MethodDrillRecoveryOutstandingCount > MethodDrillRecoveryCompletedCount + && Snapshot.MethodDrillRecoveryAverageOutcomeScore <= 45.0f; + const int32 MethodDrillRecoveryLaunchBias = bStrongMethodDrillRecoveryHistory + ? FMath::Clamp( + MethodDrillRecoveryCompletedCount + - MethodDrillRecoveryOutstandingCount + + (Snapshot.MethodDrillRecoveryAverageOutcomeScore >= 75.0f ? 1 : 0), + 1, + 3) + : 0; + const int32 MethodDrillRecoveryPromoteBias = bWeakMethodDrillRecoveryHistory + ? FMath::Clamp( + MethodDrillRecoveryOutstandingCount + - MethodDrillRecoveryCompletedCount + + (QueueExecutionSummary.bHasCompletionGap ? 1 : 0), + 1, + 3) + : 0; if (ExplicitQueuedHandoffSignal > 0 || ExplicitFollowUpHandoffSignal > 0 || ExplicitRecommendedHandoffSignal > 0) @@ -554,13 +605,15 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + ExplicitDeferredFirstQueuedHandoffSignal + ExplicitDeferredFirstFollowUpHandoffSignal + ExplicitMethodDrillQueuedHandoffSignal - + ExplicitMethodDrillFollowUpHandoffSignal; + + ExplicitMethodDrillFollowUpHandoffSignal + + MethodDrillRecoveryLaunchBias; const int32 WeightedRecommendedRecoverySignal = ExplicitRecommendedRecoverySignal + ExplicitRecommendedHandoffSignal + ExplicitDeferredOverflowRecommendedHandoffSignal + ExplicitDeferredFirstRecommendedHandoffSignal - + ExplicitMethodDrillRecommendedHandoffSignal; + + ExplicitMethodDrillRecommendedHandoffSignal + + MethodDrillRecoveryPromoteBias; const bool bQueueHistoryPrefersFollowUp = DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp || (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp @@ -576,7 +629,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + FMath::Min(static_cast(QueueExecutionSummary.DeferredEventCount) * 0.75f, 3.0f) + FMath::Min(static_cast(QueueExecutionSummary.PromotedEventCount), 3.0f) + (DominantDeferredLane != EHyperTwistTrainingCoachGuidanceLane::None ? 1.5f : 0.0f) - - (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f); + - (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f) + + (static_cast(MethodDrillRecoveryPromoteBias) * 1.5f); const float LaunchRecoveryActionPressure = (QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f) + (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 2.5f : 0.0f) @@ -590,7 +644,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal + static_cast(ExplicitDeferredFirstFollowUpHandoffSignal) * 0.5f + static_cast(ExplicitMethodDrillQueuedHandoffSignal) + static_cast(ExplicitMethodDrillFollowUpHandoffSignal) - + static_cast(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f; + + static_cast(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f + + (static_cast(MethodDrillRecoveryLaunchBias) * 1.75f); if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f) { if (PromoteRecoveryActionPressure > LaunchRecoveryActionPressure) @@ -618,6 +673,29 @@ namespace HyperTwistTrainingRepositoryLibraryInternal Snapshot.PreferredQueueRecoveryActionSourceLabel = TEXT("queue-history-balanced-pressure"); } } + if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery + && bStrongMethodDrillRecoveryHistory + && (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-strong"); + } + else if (Snapshot.PreferredQueueRecoveryAction + == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred + && bWeakMethodDrillRecoveryHistory + && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() + || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource( + Snapshot.PreferredQueueRecoveryActionSourceLabel))) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-weak"); + } if (bQueueHistoryPrefersFollowUp) { @@ -634,6 +712,14 @@ namespace HyperTwistTrainingRepositoryLibraryInternal - (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 1 : 0) ); } + if (MethodDrillRecoveryLaunchBias > 0) + { + Snapshot.FollowUpGuidanceContinueBias += MethodDrillRecoveryLaunchBias; + } + if (MethodDrillRecoveryPromoteBias > 0) + { + Snapshot.RecommendedGuidanceContinueBias += MethodDrillRecoveryPromoteBias; + } if (bQueueHistoryPrefersFollowUp && Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred) { @@ -6461,6 +6547,51 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der 0, 4 ); + const int32 MethodDrillRecoveryStartedCount = + QueueExecutionSummary.StartedMethodDrillQueuedHandoffEventCount + + QueueExecutionSummary.StartedMethodDrillFollowUpHandoffEventCount + + QueueExecutionSummary.StartedMethodDrillRecommendedHandoffEventCount; + const int32 MethodDrillRecoveryCompletedCount = + QueueExecutionSummary.CompletedMethodDrillQueuedHandoffEventCount + + QueueExecutionSummary.CompletedMethodDrillFollowUpHandoffEventCount + + QueueExecutionSummary.CompletedMethodDrillRecommendedHandoffEventCount; + const int32 MethodDrillRecoveryOutstandingCount = FMath::Max( + 0, + MethodDrillRecoveryStartedCount - MethodDrillRecoveryCompletedCount + ); + if (MethodDrillRecoveryStartedCount > 0) + { + Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount; + Snapshot.StrongMethodDrillRecoveryHistoryCount += MethodDrillRecoveryCompletedCount; + Snapshot.WeakMethodDrillRecoveryHistoryCount += MethodDrillRecoveryOutstandingCount; + Snapshot.MethodDrillRecoveryAverageOutcomeScore = + (static_cast(MethodDrillRecoveryCompletedCount) * 100.0f) + / static_cast(MethodDrillRecoveryStartedCount); + } + const bool bStrongMethodDrillRecoveryHistory = + MethodDrillRecoveryStartedCount >= 2 + && MethodDrillRecoveryCompletedCount >= MethodDrillRecoveryOutstandingCount + && Snapshot.MethodDrillRecoveryAverageOutcomeScore >= 55.0f; + const bool bWeakMethodDrillRecoveryHistory = + MethodDrillRecoveryStartedCount >= 2 + && MethodDrillRecoveryOutstandingCount > MethodDrillRecoveryCompletedCount + && Snapshot.MethodDrillRecoveryAverageOutcomeScore <= 45.0f; + const int32 MethodDrillRecoveryLaunchBias = bStrongMethodDrillRecoveryHistory + ? FMath::Clamp( + MethodDrillRecoveryCompletedCount + - MethodDrillRecoveryOutstandingCount + + (Snapshot.MethodDrillRecoveryAverageOutcomeScore >= 75.0f ? 1 : 0), + 1, + 3) + : 0; + const int32 MethodDrillRecoveryPromoteBias = bWeakMethodDrillRecoveryHistory + ? FMath::Clamp( + MethodDrillRecoveryOutstandingCount + - MethodDrillRecoveryCompletedCount + + (QueueExecutionSummary.bHasCompletionGap ? 1 : 0), + 1, + 3) + : 0; if (ExplicitQueuedHandoffSignal > 0 || ExplicitFollowUpHandoffSignal > 0 || ExplicitRecommendedHandoffSignal > 0) @@ -6507,13 +6638,15 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + ExplicitDeferredFirstQueuedHandoffSignal + ExplicitDeferredFirstFollowUpHandoffSignal + ExplicitMethodDrillQueuedHandoffSignal - + ExplicitMethodDrillFollowUpHandoffSignal; + + ExplicitMethodDrillFollowUpHandoffSignal + + MethodDrillRecoveryLaunchBias; const int32 WeightedRecommendedRecoverySignal = ExplicitRecommendedRecoverySignal + ExplicitRecommendedHandoffSignal + ExplicitDeferredOverflowRecommendedHandoffSignal + ExplicitDeferredFirstRecommendedHandoffSignal - + ExplicitMethodDrillRecommendedHandoffSignal; + + ExplicitMethodDrillRecommendedHandoffSignal + + MethodDrillRecoveryPromoteBias; const bool bQueueHistoryPrefersFollowUp = DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp || (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp @@ -6529,7 +6662,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + FMath::Min(static_cast(QueueExecutionSummary.DeferredEventCount) * 0.75f, 3.0f) + FMath::Min(static_cast(QueueExecutionSummary.PromotedEventCount), 3.0f) + (DominantDeferredLane != EHyperTwistTrainingCoachGuidanceLane::None ? 1.5f : 0.0f) - - (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f); + - (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f) + + (static_cast(MethodDrillRecoveryPromoteBias) * 1.5f); const float LaunchRecoveryActionPressure = (QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f) + (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 2.5f : 0.0f) @@ -6543,7 +6677,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der + static_cast(ExplicitDeferredFirstFollowUpHandoffSignal) * 0.5f + static_cast(ExplicitMethodDrillQueuedHandoffSignal) + static_cast(ExplicitMethodDrillFollowUpHandoffSignal) - + static_cast(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f; + + static_cast(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f + + (static_cast(MethodDrillRecoveryLaunchBias) * 1.75f); if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f) { if (PromoteRecoveryActionPressure > LaunchRecoveryActionPressure) @@ -6571,6 +6706,29 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der Snapshot.PreferredQueueRecoveryActionSourceLabel = TEXT("queue-history-balanced-pressure"); } } + if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery + && bStrongMethodDrillRecoveryHistory + && (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-strong"); + } + else if (Snapshot.PreferredQueueRecoveryAction + == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred + && bWeakMethodDrillRecoveryHistory + && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() + || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource( + Snapshot.PreferredQueueRecoveryActionSourceLabel))) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-weak"); + } if (bQueueHistoryPrefersFollowUp) { @@ -6587,6 +6745,14 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der - (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 1 : 0) ); } + if (MethodDrillRecoveryLaunchBias > 0) + { + Snapshot.FollowUpGuidanceContinueBias += MethodDrillRecoveryLaunchBias; + } + if (MethodDrillRecoveryPromoteBias > 0) + { + Snapshot.RecommendedGuidanceContinueBias += MethodDrillRecoveryPromoteBias; + } if (bQueueHistoryPrefersFollowUp && Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred) { @@ -8470,6 +8636,25 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.CompletedRecommendedEventCount += 1; } + if (HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel)) + { + const EHyperTwistTrainingCoachHandoffKind CompletedHandoffKind = + HyperTwistTrainingRepositoryLibraryInternal::DashboardHandoffKindFromSourceLabel( + HistoryEntry.StartActionSourceLabel); + if (CompletedHandoffKind == EHyperTwistTrainingCoachHandoffKind::Queue) + { + Summary.CompletedMethodDrillQueuedHandoffEventCount += 1; + } + else if (CompletedHandoffKind == EHyperTwistTrainingCoachHandoffKind::FollowUp) + { + Summary.CompletedMethodDrillFollowUpHandoffEventCount += 1; + } + else if (CompletedHandoffKind == EHyperTwistTrainingCoachHandoffKind::Recommended) + { + Summary.CompletedMethodDrillRecommendedHandoffEventCount += 1; + } + } CompletedCountsByEntryId.FindOrAdd(HistoryEntry.EntryId) += 1; if (Summary.LastCompletedAtUtc.IsEmpty() || HyperTwistTrainingRepositoryLibraryInternal::CompareUtcStrings( diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp index 1836194..28bd62c 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp @@ -600,6 +600,14 @@ FHyperTwistTrainingCoachPanelState UHyperTwistTrainingSubsystem::GetActiveCoachP ActiveCoachMemorySnapshot.WeakMethodDrillFollowUpHistoryCount; PanelState.MethodDrillFollowUpAverageOutcomeScore = ActiveCoachMemorySnapshot.MethodDrillFollowUpAverageOutcomeScore; + PanelState.MethodDrillRecoveryHistoryCount = + ActiveCoachMemorySnapshot.MethodDrillRecoveryHistoryCount; + PanelState.StrongMethodDrillRecoveryHistoryCount = + ActiveCoachMemorySnapshot.StrongMethodDrillRecoveryHistoryCount; + PanelState.WeakMethodDrillRecoveryHistoryCount = + ActiveCoachMemorySnapshot.WeakMethodDrillRecoveryHistoryCount; + PanelState.MethodDrillRecoveryAverageOutcomeScore = + ActiveCoachMemorySnapshot.MethodDrillRecoveryAverageOutcomeScore; PanelState.bRepositoryVerificationPassed = ActiveRepositoryRoundTripVerification.bDidRoundTripPass; PanelState.bRepositoryVerificationNeedsAttention = ActiveRepositoryRoundTripVerification.ResolvedPath.IsEmpty() || !ActiveRepositoryRoundTripVerification.bDidRoundTripPass; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 22d7295..c82d3a1 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -1935,6 +1935,18 @@ struct FHyperTwistTrainingCoachMemorySnapshot UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") float MethodDrillFollowUpAverageOutcomeScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 MethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StrongMethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 WeakMethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float MethodDrillRecoveryAverageOutcomeScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bNeedsCoachIntervention = false; @@ -3657,6 +3669,15 @@ struct FHyperTwistTrainingCoachSessionQueueExecutionSummary UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 StartedMethodDrillRecommendedHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedMethodDrillQueuedHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedMethodDrillFollowUpHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedMethodDrillRecommendedHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 PromotedFollowUpEventCount = 0; @@ -4831,6 +4852,18 @@ struct FHyperTwistTrainingCoachPanelState UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") float MethodDrillFollowUpAverageOutcomeScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 MethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StrongMethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 WeakMethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float MethodDrillRecoveryAverageOutcomeScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 SignalCount = 0;