Expose gameplay selector merged roster evaluation-order lookup

This commit is contained in:
axiomlogicnexus 2026-05-09 02:31:32 +02:00
parent a0ddb5be52
commit bc6e7f0fdc
10 changed files with 471 additions and 2 deletions

View file

@ -13258,6 +13258,257 @@ UHyperTwistTrainingCoachLibrary::
return Surface;
}
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface
UHyperTwistTrainingCoachLibrary::
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface(
const FHyperTwistTrainingRunState& RunState,
const FString& SelectorId,
const int32 EvaluationOrder,
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface& OptionMenuSurface,
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface&
OptionLaunchRequestPreviewSurface
)
{
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterInspectSurface
MergedOrderedRosterSurface =
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterInspectSurface(
RunState,
SelectorId,
OptionMenuSurface,
OptionLaunchRequestPreviewSurface
);
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface
Surface;
Surface.SelectorId = MergedOrderedRosterSurface.SelectorId;
Surface.SelectorLabel = MergedOrderedRosterSurface.SelectorLabel;
Surface.BindingLabel = MergedOrderedRosterSurface.BindingLabel;
Surface.Headline =
TEXT("Generated Mode Selector Option Owned-Execution Split-Phase Current-Selection Label-Provenance Partition Merged Ordered Roster Evaluation-Order Lookup Inspect");
Surface.bHasSelector = MergedOrderedRosterSurface.bHasSelector;
Surface.bHasSelection = MergedOrderedRosterSurface.bHasSelection;
Surface.bSelectionMatchesAvailableOption =
MergedOrderedRosterSurface.bSelectionMatchesAvailableOption;
Surface.CurrentSelectionSelectionLine =
MergedOrderedRosterSurface.CurrentSelectionSelectionLine;
Surface.LookupEvaluationOrder = EvaluationOrder;
Surface.bHasLookupEvaluationOrder = EvaluationOrder >= 0;
Surface.MergedOrderedPhaseCountLine =
MergedOrderedRosterSurface.MergedOrderedPhaseCountLine;
Surface.CurrentSelectionOptionId =
MergedOrderedRosterSurface.CurrentSelectionOptionId;
Surface.CurrentSelectionOptionLabel =
MergedOrderedRosterSurface.CurrentSelectionOptionLabel;
Surface.CurrentSelectionOptionValue =
MergedOrderedRosterSurface.CurrentSelectionOptionValue;
Surface.LaunchRequestPreviewKind =
MergedOrderedRosterSurface.LaunchRequestPreviewKind;
Surface.bStartsOwnedCaseImmediately =
MergedOrderedRosterSurface.bStartsOwnedCaseImmediately;
Surface.bRetainsActiveDeckSplitPhaseFusion =
MergedOrderedRosterSurface.bRetainsActiveDeckSplitPhaseFusion;
Surface.bPreviewBlocked = MergedOrderedRosterSurface.bPreviewBlocked;
Surface.bCanPreview = MergedOrderedRosterSurface.bCanPreview;
if (!SelectorId.IsEmpty())
{
const FString SelectorHeadlineValue = OptionMenuSurface.SelectorLabel.IsEmpty()
? SelectorId
: OptionMenuSurface.SelectorLabel;
Surface.Headline = Surface.bHasLookupEvaluationOrder
? FString::Printf(
TEXT("Generated Mode Selector Option Owned-Execution Split-Phase Current-Selection Label-Provenance Partition Merged Ordered Roster Evaluation-Order Lookup Inspect: %s [evaluation #%d]"),
*SelectorHeadlineValue,
EvaluationOrder
)
: FString::Printf(
TEXT("Generated Mode Selector Option Owned-Execution Split-Phase Current-Selection Label-Provenance Partition Merged Ordered Roster Evaluation-Order Lookup Inspect: %s"),
*SelectorHeadlineValue
);
}
if (Surface.bHasLookupEvaluationOrder)
{
if (const FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterInspectPhaseSurface*
MatchedPhase = MergedOrderedRosterSurface.MergedOrderedPhases.FindByPredicate(
[EvaluationOrder](
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterInspectPhaseSurface& PhaseSurface
)
{
return PhaseSurface.EvaluationOrder == EvaluationOrder;
}
))
{
Surface.MatchedPhase = *MatchedPhase;
Surface.MatchedNormalizedOrder = MatchedPhase->NormalizedOrder;
Surface.bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookup =
true;
Surface.bHasExactCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookup =
MergedOrderedRosterSurface.bHasExactCurrentSelectionLabelProvenancePartitionMergedOrderedRoster;
Surface.bMatchedExplicitLabelPartition =
MatchedPhase->bBelongsToExplicitLabelPartition;
Surface.bMatchedFallbackLabelPartition =
MatchedPhase->bBelongsToFallbackLabelPartition;
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
FString::Printf(
TEXT("Current-selection merged ordered evaluation-order lookup on execute: evaluation phase #%d resolves to phase id %s with normalized phase #%d and label %s."),
MatchedPhase->EvaluationOrder,
*MatchedPhase->PhaseId,
MatchedPhase->NormalizedOrder,
*MatchedPhase->NormalizedLabel
);
Surface.MatchedPhaseOrderLine = MatchedPhase->OrderLine;
Surface.MatchedPhaseIdLine = FString::Printf(
TEXT("Requested evaluation-order phase id on execute: %s"),
*MatchedPhase->PhaseId
);
Surface.MatchedPhaseLabelLine = MatchedPhase->LabelLine;
Surface.MatchedPhasePartitionLine =
MatchedPhase->LabelProvenancePartitionLine;
}
}
if (Surface.bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookup)
{
Surface.StatusLine = FString::Printf(
TEXT("Generated-mode selector option owned-execution split-phase current-selection merged ordered roster evaluation-order lookup inspect exposes retained evaluation phase #%d for the active selection."),
Surface.LookupEvaluationOrder
);
}
else if (!Surface.bHasLookupEvaluationOrder)
{
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
TEXT("Current-selection merged ordered evaluation-order lookup on execute: no evaluation order requested.");
Surface.MatchedPhaseOrderLine =
TEXT("Requested evaluation phase order on execute: unavailable");
Surface.MatchedPhaseIdLine =
TEXT("Requested evaluation-order phase id on execute: unavailable");
Surface.MatchedPhaseLabelLine =
TEXT("Requested evaluation-order phase label on execute: unavailable");
Surface.MatchedPhasePartitionLine =
TEXT("Requested evaluation-order phase partition on execute: unavailable");
Surface.StatusLine =
TEXT("Generated-mode selector option owned-execution split-phase current-selection merged ordered roster evaluation-order lookup inspect is active, but no evaluation order was requested.");
}
else if (OptionMenuSurface.bHasUnresolvedSelectionDetail)
{
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
OptionMenuSurface.UnresolvedSelectionLine;
Surface.MatchedPhaseOrderLine =
TEXT("Requested evaluation phase order on execute: unavailable until the cached selection resolves to an imported option.");
Surface.MatchedPhaseIdLine =
TEXT("Requested evaluation-order phase id on execute: unavailable until the cached selection resolves to an imported option.");
Surface.MatchedPhaseLabelLine =
TEXT("Requested evaluation-order phase label on execute: unavailable until the cached selection resolves to an imported option.");
Surface.MatchedPhasePartitionLine =
TEXT("Requested evaluation-order phase partition on execute: unavailable until the cached selection resolves to an imported option.");
Surface.StatusLine =
TEXT("Generated-mode selector option owned-execution split-phase current-selection merged ordered roster evaluation-order lookup inspect is active, but the cached selection no longer matches an imported option.");
}
else if (MergedOrderedRosterSurface.bPreviewBlocked)
{
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
MergedOrderedRosterSurface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterLine;
Surface.MatchedPhaseOrderLine =
TEXT("Requested evaluation phase order on execute: blocked until execute-time merged ordered roster inspection is available.");
Surface.MatchedPhaseIdLine =
TEXT("Requested evaluation-order phase id on execute: blocked until execute-time merged ordered roster inspection is available.");
Surface.MatchedPhaseLabelLine =
TEXT("Requested evaluation-order phase label on execute: blocked until execute-time merged ordered roster inspection is available.");
Surface.MatchedPhasePartitionLine =
TEXT("Requested evaluation-order phase partition on execute: blocked until execute-time merged ordered roster inspection is available.");
Surface.StatusLine =
TEXT("Generated-mode selector option owned-execution split-phase current-selection merged ordered roster evaluation-order lookup inspect resolves the active selection, but execute-time evaluation-order lookup remains blocked.");
}
else if (MergedOrderedRosterSurface.bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRoster)
{
Surface.bLookupMissesRetainedRoster = true;
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
FString::Printf(
TEXT("Current-selection merged ordered evaluation-order lookup on execute: evaluation phase #%d is not retained in the merged ordered roster."),
EvaluationOrder
);
Surface.MatchedPhaseOrderLine =
TEXT("Requested evaluation phase order on execute: no retained phase matches that evaluation order");
Surface.MatchedPhaseIdLine =
TEXT("Requested evaluation-order phase id on execute: no retained phase matches that evaluation order");
Surface.MatchedPhaseLabelLine =
TEXT("Requested evaluation-order phase label on execute: no retained phase matches that evaluation order");
Surface.MatchedPhasePartitionLine =
TEXT("Requested evaluation-order phase partition on execute: no retained phase matches that evaluation order");
Surface.StatusLine =
TEXT("Generated-mode selector option owned-execution split-phase current-selection merged ordered roster evaluation-order lookup inspect resolves the active selection, but the requested evaluation order is not retained.");
}
else if (MergedOrderedRosterSurface.bHasExactCurrentSelectionLabelProvenancePartitionMergedOrderedRoster)
{
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
TEXT("Current-selection merged ordered evaluation-order lookup on execute: none");
Surface.MatchedPhaseOrderLine =
TEXT("Requested evaluation phase order on execute: none");
Surface.MatchedPhaseIdLine =
TEXT("Requested evaluation-order phase id on execute: none");
Surface.MatchedPhaseLabelLine =
TEXT("Requested evaluation-order phase label on execute: none");
Surface.MatchedPhasePartitionLine =
TEXT("Requested evaluation-order phase partition on execute: none");
Surface.StatusLine =
TEXT("Generated-mode selector option owned-execution split-phase current-selection merged ordered roster evaluation-order lookup inspect resolves the active selection, and no surviving phases are currently retained.");
}
else if (OptionMenuSurface.bHasSelection)
{
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
TEXT("Current selection has no additional owned-execution split-phase merged ordered roster evaluation-order lookup preview.");
Surface.MatchedPhaseOrderLine =
TEXT("Requested evaluation phase order on execute: unavailable");
Surface.MatchedPhaseIdLine =
TEXT("Requested evaluation-order phase id on execute: unavailable");
Surface.MatchedPhaseLabelLine =
TEXT("Requested evaluation-order phase label on execute: unavailable");
Surface.MatchedPhasePartitionLine =
TEXT("Requested evaluation-order phase partition on execute: unavailable");
Surface.StatusLine =
TEXT("Generated-mode selector option owned-execution split-phase current-selection merged ordered roster evaluation-order lookup inspect is active, but the current selection does not expose merged ordered roster lookup detail.");
}
else if (OptionMenuSurface.bHasSelector)
{
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
TEXT("Current selection: unresolved");
Surface.MatchedPhaseOrderLine =
TEXT("Requested evaluation phase order on execute: unresolved");
Surface.MatchedPhaseIdLine =
TEXT("Requested evaluation-order phase id on execute: unresolved");
Surface.MatchedPhaseLabelLine =
TEXT("Requested evaluation-order phase label on execute: unresolved");
Surface.MatchedPhasePartitionLine =
TEXT("Requested evaluation-order phase partition on execute: unresolved");
Surface.StatusLine =
TEXT("Generated-mode selector option owned-execution split-phase current-selection merged ordered roster evaluation-order lookup inspect is active, but this selector is currently unresolved.");
}
else
{
Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine =
TEXT("Current selection: n/a");
Surface.MatchedPhaseOrderLine =
TEXT("Requested evaluation phase order on execute: n/a");
Surface.MatchedPhaseIdLine =
TEXT("Requested evaluation-order phase id on execute: n/a");
Surface.MatchedPhaseLabelLine =
TEXT("Requested evaluation-order phase label on execute: n/a");
Surface.MatchedPhasePartitionLine =
TEXT("Requested evaluation-order phase partition on execute: n/a");
Surface.StatusLine = MergedOrderedRosterSurface.StatusLine;
}
Surface.DetailLine = FString::Printf(
TEXT("%s | %s | %s"),
*Surface.CurrentSelectionSelectionLine,
*Surface.CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine,
*Surface.MatchedPhasePartitionLine
);
return Surface;
}
FHyperTwistTrainingCoachQueueControlSurface
UHyperTwistTrainingCoachLibrary::DeriveCoachQueueControlSurface(
const FHyperTwistTrainingCoachSessionQueueState& QueueState,

View file

@ -1351,6 +1351,27 @@ UHyperTwistTrainingPanelWidget::GetDisplayedCoachGeneratedModeSelectorOptionOwne
);
}
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface
UHyperTwistTrainingPanelWidget::GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface(
const FString& SelectorId,
const int32 EvaluationOrder
) const
{
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface OptionMenuSurface =
GetDisplayedCoachGeneratedModeSelectorOptionMenuSurface(SelectorId);
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface
OptionLaunchRequestPreviewSurface =
GetDisplayedCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface(SelectorId);
return UHyperTwistTrainingCoachLibrary::
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface(
CachedRunState,
SelectorId,
EvaluationOrder,
OptionMenuSurface,
OptionLaunchRequestPreviewSurface
);
}
FHyperTwistTrainingRunState UHyperTwistTrainingPanelWidget::StartCoachRecommendedRun(
const int32 MaxCases,
const FString& StartActionSourceLabel

View file

@ -1332,6 +1332,27 @@ AHyperTwistTrainingSessionActor::GetDisplayedCoachGeneratedModeSelectorOptionOwn
);
}
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface
AHyperTwistTrainingSessionActor::GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface(
const FString& SelectorId,
const int32 EvaluationOrder
) const
{
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface OptionMenuSurface =
GetDisplayedCoachGeneratedModeSelectorOptionMenuSurface(SelectorId);
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface
OptionLaunchRequestPreviewSurface =
GetDisplayedCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface(SelectorId);
return UHyperTwistTrainingCoachLibrary::
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface(
CachedRunState,
SelectorId,
EvaluationOrder,
OptionMenuSurface,
OptionLaunchRequestPreviewSurface
);
}
FHyperTwistTrainingRunState AHyperTwistTrainingSessionActor::StartCoachRecommendedTrainingRun(
const int32 MaxCases
)

View file

@ -1029,4 +1029,15 @@ public:
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface&
OptionLaunchRequestPreviewSurface
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface(
const FHyperTwistTrainingRunState& RunState,
const FString& SelectorId,
int32 EvaluationOrder,
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface& OptionMenuSurface,
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface&
OptionLaunchRequestPreviewSurface
);
};

View file

@ -448,6 +448,13 @@ public:
int32 NormalizedOrder
) const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface
GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface(
const FString& SelectorId,
int32 EvaluationOrder
) const;
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingRunState StartCoachRecommendedRun(
int32 MaxCases,

View file

@ -429,6 +429,13 @@ public:
int32 NormalizedOrder
) const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface
GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface(
const FString& SelectorId,
int32 EvaluationOrder
) const;
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingRunState StartCoachRecommendedTrainingRun(int32 MaxCases);

View file

@ -14747,3 +14747,121 @@ struct FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPha
|| bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookup;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupInspectSurface
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SelectorId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SelectorLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString BindingLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString Headline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString StatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString CurrentSelectionSelectionLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString MergedOrderedPhaseCountLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString MatchedPhaseOrderLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString MatchedPhaseIdLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString MatchedPhaseLabelLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString MatchedPhasePartitionLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString DetailLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterInspectPhaseSurface
MatchedPhase;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString CurrentSelectionOptionId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString CurrentSelectionOptionLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString CurrentSelectionOptionValue;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind LaunchRequestPreviewKind =
EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::None;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 LookupEvaluationOrder = -1;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 MatchedNormalizedOrder = -1;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasSelector = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasSelection = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bSelectionMatchesAvailableOption = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasLookupEvaluationOrder = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookup = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bStartsOwnedCaseImmediately = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasExactCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookup = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bRetainsActiveDeckSplitPhaseFusion = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bMatchedExplicitLabelPartition = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bMatchedFallbackLabelPartition = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bLookupMissesRetainedRoster = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bPreviewBlocked = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bCanPreview = false;
bool IsStructurallyValid() const
{
return !StatusLine.IsEmpty()
|| !SelectorId.IsEmpty()
|| !CurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookupLine.IsEmpty()
|| MatchedPhase.IsStructurallyValid()
|| bHasSelector
|| bHasSelection
|| bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRosterEvaluationOrderLookup;
}
};

View file

@ -68,7 +68,7 @@ Current correction call from the source-exposed audit and current execution refr
- the imported generated-mode gap is closed; request/config/selection plumbing and the bounded clean-room executor are already landed in first-party code
- the latest landed bounded `Phase 4` packet closes the retained-idle comparison/outcome actionability gap at the end of the recognition-assisted coach-to-review continuity lane, and the final retained-surface confirmation pass now leaves that closure lane functionally complete
- the retained idle widget surface now keeps retained comparison and decision history inspectable without continuing to advertise live launch or guidance-outcome actions once the coach-to-review loop has already collapsed to truthful closed-loop idle
- the latest landed bounded `Phase 4` packet stays on that same gameplay-facing consumer lane and adds one thin generated-mode selector option owned execution split-phase current-selection label-provenance partition merged ordered roster normalized-order lookup inspect surface over the already-cached selector/runtime/request state, so gameplay/Blueprint callers can inspect one retained split-phase row by normalized execution order without scanning the merged ordered roster array themselves
- the latest landed bounded `Phase 4` packet stays on that same gameplay-facing consumer lane and adds one thin generated-mode selector option owned execution split-phase current-selection label-provenance partition merged ordered roster evaluation-order lookup inspect surface over the already-cached selector/runtime/request state, so gameplay/Blueprint callers can inspect one retained split-phase row by evaluation order without scanning the merged ordered roster array themselves
- the current next bounded packet should stay on that same gameplay-facing consumer lane and only add another thin retained-row convenience inspect surface if a real gameplay or Blueprint caller still needs one over the already-landed merged ordered roster inspect surface, instead of widening into broader UI or backend work
- the current execution-discipline rule that broad refactor / monolith-splitting work should not interrupt the active bounded roadmap packet unless structure is actually blocking it

View file

@ -0,0 +1,33 @@
# HyperTwist Phase 4 gameplay generated-mode selector option owned execution split-phase current-selection label-provenance partition merged ordered roster evaluation-order lookup inspect surface packet
## Goal
Close the next thin gameplay-facing consumer seam above the current-selection label-provenance partition merged ordered roster inspect surface by exposing one current-selection merged ordered roster evaluation-order lookup inspect surface for a chosen selector id and retained evaluation order.
## Why this packet exists
The current-selection label-provenance partition merged ordered roster inspect surface already exposed the active selection's retained split phases in one ordered list with explicit-label versus phase-id-fallback partition tagging. The already-landed phase-id and normalized-order lookup surfaces covered two retained-row address paths, but gameplay and Blueprint callers that needed one specific retained phase row by evaluation order still had to scan that merged ordered roster array themselves to find the requested retained row and then preserve truthful blocked, unresolved, or missing-row posture.
This packet removes that caller-side lookup step. It exposes one thin current-selection merged ordered roster evaluation-order lookup inspect surface that composes the already-landed merged ordered roster inspect surface and returns the matched retained phase row when one exists, while preserving truthful no-request, unresolved-selection, blocked-preview, no-retained-phase, and retained-roster-miss posture.
## What changed
- add a first-party owned execution split-phase current-selection merged ordered roster evaluation-order lookup inspect surface in shared training types
- derive that surface in the coach library by composing the already-landed current-selection merged ordered roster inspect surface instead of reimplementing merged-roster construction logic
- expose the current-selection merged ordered roster evaluation-order lookup inspect surface on both gameplay-facing consumers:
- `UHyperTwistTrainingPanelWidget`
- `AHyperTwistTrainingSessionActor`
- preserve exact matched retained phase row detail when the requested evaluation order is present in the active selection's merged ordered retained-phase roster
- preserve truthful lookup-miss, unresolved cached-selection, and blocked-preview posture when a matching retained phase row cannot yet be exposed
## Validation
- full `Development Editor|Win64` solution build for `C:\HyperTwist\UnrealHyperTwist\UnrealHyperTwist.sln`
## Result
Gameplay and Blueprint callers can now inspect one retained split-phase row for the active selection by evaluation order without scanning the merged ordered roster array themselves.
## Next bounded slice
Stay on the same gameplay-facing consumer lane and only add another thin retained-row convenience inspect surface if a real gameplay or Blueprint caller still needs one over the already-landed merged ordered roster inspect surface; otherwise keep broader UI and backend widening deferred.

View file

@ -30,4 +30,4 @@ Gameplay and Blueprint callers can now inspect one retained split-phase row for
## Next bounded slice
Stay on the same gameplay-facing consumer lane and only add another thin retained-row convenience inspect surface if a real gameplay or Blueprint caller still needs one over the already-landed merged ordered roster inspect surface; otherwise keep broader UI and backend widening deferred.
Stay on the same gameplay-facing consumer lane and add one thin current-selection merged ordered roster evaluation-order lookup inspect surface for a chosen selector id and evaluation order, composed over the already-landed merged ordered roster inspect surface so callers can resolve one retained split-phase row by evaluation order without rescanning the merged roster array themselves.