Expose gameplay selector merged roster normalized-order lookup

This commit is contained in:
axiomlogicnexus 2026-05-09 02:13:58 +02:00
parent 33661fe8a2
commit a0ddb5be52
9 changed files with 466 additions and 2 deletions

View file

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

View file

@ -1330,6 +1330,27 @@ UHyperTwistTrainingPanelWidget::GetDisplayedCoachGeneratedModeSelectorOptionOwne
);
}
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface
UHyperTwistTrainingPanelWidget::GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface(
const FString& SelectorId,
const int32 NormalizedOrder
) const
{
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface OptionMenuSurface =
GetDisplayedCoachGeneratedModeSelectorOptionMenuSurface(SelectorId);
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface
OptionLaunchRequestPreviewSurface =
GetDisplayedCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface(SelectorId);
return UHyperTwistTrainingCoachLibrary::
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface(
CachedRunState,
SelectorId,
NormalizedOrder,
OptionMenuSurface,
OptionLaunchRequestPreviewSurface
);
}
FHyperTwistTrainingRunState UHyperTwistTrainingPanelWidget::StartCoachRecommendedRun(
const int32 MaxCases,
const FString& StartActionSourceLabel

View file

@ -1311,6 +1311,27 @@ AHyperTwistTrainingSessionActor::GetDisplayedCoachGeneratedModeSelectorOptionOwn
);
}
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface
AHyperTwistTrainingSessionActor::GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface(
const FString& SelectorId,
const int32 NormalizedOrder
) const
{
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface OptionMenuSurface =
GetDisplayedCoachGeneratedModeSelectorOptionMenuSurface(SelectorId);
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface
OptionLaunchRequestPreviewSurface =
GetDisplayedCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface(SelectorId);
return UHyperTwistTrainingCoachLibrary::
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface(
CachedRunState,
SelectorId,
NormalizedOrder,
OptionMenuSurface,
OptionLaunchRequestPreviewSurface
);
}
FHyperTwistTrainingRunState AHyperTwistTrainingSessionActor::StartCoachRecommendedTrainingRun(
const int32 MaxCases
)

View file

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

View file

@ -441,6 +441,13 @@ public:
const FString& PhaseId
) const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface
GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface(
const FString& SelectorId,
int32 NormalizedOrder
) const;
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingRunState StartCoachRecommendedRun(
int32 MaxCases,

View file

@ -422,6 +422,13 @@ public:
const FString& PhaseId
) const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface
GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface(
const FString& SelectorId,
int32 NormalizedOrder
) const;
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingRunState StartCoachRecommendedTrainingRun(int32 MaxCases);

View file

@ -14632,3 +14632,118 @@ struct FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPha
|| bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRosterPhaseIdLookup;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionSplitPhaseCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupInspectSurface
{
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 CurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupLine;
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 LookupNormalizedOrder = -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 bHasLookupNormalizedOrder = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookup = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bStartsOwnedCaseImmediately = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasExactCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookup = 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()
|| !CurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookupLine.IsEmpty()
|| MatchedPhase.IsStructurallyValid()
|| bHasSelector
|| bHasSelection
|| bHasCurrentSelectionLabelProvenancePartitionMergedOrderedRosterNormalizedOrderLookup;
}
};

View file

@ -68,8 +68,8 @@ 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 phase-id lookup inspect surface over the already-cached selector/runtime/request state, so gameplay/Blueprint callers can inspect one retained split-phase row by phase id without scanning the merged ordered roster array themselves
- the current next bounded packet is to expose one thin generated-mode selector option owned execution split-phase current-selection label-provenance partition merged ordered roster normalized-order lookup inspect surface on those same two consumer surfaces 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 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 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
## Current execution-reality references

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 normalized-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 normalized-order lookup inspect surface for a chosen selector id and normalized execution 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. Gameplay and Blueprint callers that needed one specific retained phase row by normalized execution 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 normalized-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 normalized-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 normalized-order lookup inspect surface on both gameplay-facing consumers:
- `UHyperTwistTrainingPanelWidget`
- `AHyperTwistTrainingSessionActor`
- preserve exact matched retained phase row detail when the requested normalized execution 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 normalized execution 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.