Expose gameplay selector delivery-mode roster preview surface
This commit is contained in:
parent
f6dfac73e3
commit
0b63bba137
9 changed files with 829 additions and 2 deletions
|
|
@ -7283,6 +7283,485 @@ UHyperTwistTrainingCoachLibrary::
|
|||
return Surface;
|
||||
}
|
||||
|
||||
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface
|
||||
UHyperTwistTrainingCoachLibrary::
|
||||
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(
|
||||
const FHyperTwistTrainingRunState& RunState,
|
||||
const FString& SelectorId,
|
||||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface& OptionMenuSurface,
|
||||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface&
|
||||
OptionLaunchRequestPreviewSurface
|
||||
)
|
||||
{
|
||||
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface
|
||||
Surface;
|
||||
Surface.SelectorId = SelectorId;
|
||||
Surface.SelectorLabel = OptionMenuSurface.SelectorLabel;
|
||||
Surface.BindingLabel = OptionMenuSurface.BindingLabel;
|
||||
Surface.Headline =
|
||||
TEXT("Generated Mode Selector Option Owned-Execution Delivery-Mode Roster/Allowed-Mode Retention Preview");
|
||||
Surface.bHasSelector = OptionMenuSurface.bHasSelector;
|
||||
|
||||
if (!SelectorId.IsEmpty())
|
||||
{
|
||||
Surface.Headline = OptionMenuSurface.SelectorLabel.IsEmpty()
|
||||
? FString::Printf(
|
||||
TEXT("Generated Mode Selector Option Owned-Execution Delivery-Mode Roster/Allowed-Mode Retention Preview: %s"),
|
||||
*SelectorId
|
||||
)
|
||||
: FString::Printf(
|
||||
TEXT("Generated Mode Selector Option Owned-Execution Delivery-Mode Roster/Allowed-Mode Retention Preview: %s"),
|
||||
*OptionMenuSurface.SelectorLabel
|
||||
);
|
||||
}
|
||||
|
||||
if (SelectorId.IsEmpty())
|
||||
{
|
||||
Surface.StatusLine =
|
||||
TEXT("Generated-mode selector option owned-execution delivery-mode roster/allowed-mode retention preview requires a selector id from the active selector roster.");
|
||||
Surface.DeliveryModeRosterSummaryLine = TEXT("Deck delivery roster: n/a");
|
||||
Surface.AllowedModeRosterSummaryLine = TEXT("Allowed-mode roster: n/a");
|
||||
Surface.CurrentSelectionDeliveryModeRosterLine = TEXT("Current selection: n/a");
|
||||
Surface.DetailLine = OptionLaunchRequestPreviewSurface.StatusLine.IsEmpty()
|
||||
? TEXT("Launch-request preview: n/a")
|
||||
: FString::Printf(
|
||||
TEXT("Launch-request preview: %s"),
|
||||
*OptionLaunchRequestPreviewSurface.StatusLine
|
||||
);
|
||||
return Surface;
|
||||
}
|
||||
|
||||
const FHyperTwistTrainingImportedRuntimeSurface& RuntimeSurface =
|
||||
RunState.ActiveDeck.ImportedRuntimeSurface;
|
||||
const bool bHasGeneratedModeSurface = RuntimeSurface.IsStructurallyValid()
|
||||
&& RuntimeSurface.SurfaceKind.Equals(TEXT("generated-mode"), ESearchCase::IgnoreCase);
|
||||
const FHyperTwistTrainingCase* SeedCase = RunState.ActiveDeck.Cases.FindByPredicate(
|
||||
[](const FHyperTwistTrainingCase& Candidate)
|
||||
{
|
||||
return Candidate.IsStructurallyValid();
|
||||
}
|
||||
);
|
||||
|
||||
const auto DescribeDeliveryMode = [](
|
||||
const EHyperTwistTrainingDeliveryMode DeliveryMode
|
||||
) -> FString
|
||||
{
|
||||
switch (DeliveryMode)
|
||||
{
|
||||
case EHyperTwistTrainingDeliveryMode::Timer:
|
||||
return TEXT("Timer");
|
||||
case EHyperTwistTrainingDeliveryMode::VirtualCube:
|
||||
return TEXT("Virtual Cube");
|
||||
case EHyperTwistTrainingDeliveryMode::SmartDevice:
|
||||
return TEXT("Smart Device");
|
||||
case EHyperTwistTrainingDeliveryMode::RecognitionAssisted:
|
||||
return TEXT("Recognition Assisted");
|
||||
case EHyperTwistTrainingDeliveryMode::CoachReviewed:
|
||||
return TEXT("Coach Reviewed");
|
||||
default:
|
||||
return TEXT("Unknown");
|
||||
}
|
||||
};
|
||||
|
||||
const auto BuildModeLabels = [&DescribeDeliveryMode](
|
||||
const TArray<EHyperTwistTrainingDeliveryMode>& DeliveryModes
|
||||
) -> TArray<FString>
|
||||
{
|
||||
TArray<FString> Labels;
|
||||
Labels.Reserve(DeliveryModes.Num());
|
||||
for (const EHyperTwistTrainingDeliveryMode DeliveryMode : DeliveryModes)
|
||||
{
|
||||
Labels.Add(DescribeDeliveryMode(DeliveryMode));
|
||||
}
|
||||
|
||||
return Labels;
|
||||
};
|
||||
|
||||
const auto BuildModeRosterLine = [&BuildModeLabels](
|
||||
const FString& Prefix,
|
||||
const TArray<EHyperTwistTrainingDeliveryMode>& DeliveryModes,
|
||||
TArray<FString>& OutLabels
|
||||
) -> FString
|
||||
{
|
||||
OutLabels = BuildModeLabels(DeliveryModes);
|
||||
const FString LabelSummary = OutLabels.Num() > 0
|
||||
? FString::Join(OutLabels, TEXT(", "))
|
||||
: FString(TEXT("none"));
|
||||
return FString::Printf(TEXT("%s: %s"), *Prefix, *LabelSummary);
|
||||
};
|
||||
|
||||
if (!RunState.IsStructurallyValid() || !bHasGeneratedModeSurface)
|
||||
{
|
||||
Surface.StatusLine = OptionMenuSurface.StatusLine.IsEmpty()
|
||||
? TEXT("Generated-mode selector option owned-execution delivery-mode roster/allowed-mode retention preview is not currently available.")
|
||||
: OptionMenuSurface.StatusLine;
|
||||
Surface.DeliveryModeRosterSummaryLine = TEXT("Deck delivery roster: n/a");
|
||||
Surface.AllowedModeRosterSummaryLine = TEXT("Allowed-mode roster: n/a");
|
||||
Surface.CurrentSelectionDeliveryModeRosterLine =
|
||||
OptionMenuSurface.bHasUnresolvedSelectionDetail
|
||||
? OptionMenuSurface.UnresolvedSelectionLine
|
||||
: (OptionMenuSurface.bHasSelection
|
||||
? TEXT("Current selection remains cached, but no active owned-execution delivery-mode roster preview is available.")
|
||||
: TEXT("Current selection: unresolved"));
|
||||
Surface.DetailLine = FString::Printf(
|
||||
TEXT("Launch-request preview: %s"),
|
||||
OptionLaunchRequestPreviewSurface.StatusLine.IsEmpty()
|
||||
? TEXT("n/a")
|
||||
: *OptionLaunchRequestPreviewSurface.StatusLine
|
||||
);
|
||||
return Surface;
|
||||
}
|
||||
|
||||
for (const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewEntrySurface&
|
||||
PreviewEntry : OptionLaunchRequestPreviewSurface.OptionEntries)
|
||||
{
|
||||
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewEntrySurface
|
||||
Entry;
|
||||
Entry.OptionId = PreviewEntry.OptionId;
|
||||
Entry.Label = PreviewEntry.Label;
|
||||
Entry.OptionValue = PreviewEntry.OptionValue;
|
||||
Entry.LaunchRequestPreviewKind = PreviewEntry.LaunchRequestPreviewKind;
|
||||
Entry.bMatchesCurrentSelection = PreviewEntry.bMatchesCurrentSelection;
|
||||
Entry.bStartsOwnedCaseImmediately = PreviewEntry.bStartsOwnedCaseImmediately;
|
||||
|
||||
switch (PreviewEntry.LaunchRequestPreviewKind)
|
||||
{
|
||||
case EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::
|
||||
DirectOwnedCaseStart:
|
||||
{
|
||||
FHyperTwistTrainingCase MatchingCase;
|
||||
if (UHyperTwistTrainingCatalogLibrary::TryGetImportedRuntimeSelectorOptionCaseFromDeck(
|
||||
RunState.ActiveDeck,
|
||||
SelectorId,
|
||||
PreviewEntry.OptionId,
|
||||
MatchingCase))
|
||||
{
|
||||
Entry.PreviewDeckDeliveryModes = RunState.ActiveDeck.DeliveryModes;
|
||||
Entry.DeliveryModeRosterLine = BuildModeRosterLine(
|
||||
TEXT("Deck delivery modes retained on execute"),
|
||||
Entry.PreviewDeckDeliveryModes,
|
||||
Entry.PreviewDeckDeliveryModeLabels
|
||||
);
|
||||
Entry.bRetainsActiveDeckDeliveryModeRoster = true;
|
||||
Entry.bHasExactDeliveryModeRosterPreview = true;
|
||||
|
||||
if (MatchingCase.AllowedDeliveryModes.Num() > 0)
|
||||
{
|
||||
Entry.PreviewAllowedDeliveryModes = MatchingCase.AllowedDeliveryModes;
|
||||
Entry.AllowedModeSourceLine =
|
||||
TEXT("Allowed-mode source: exact covered-case allowed-mode roster retained on direct covered-case start.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Entry.PreviewAllowedDeliveryModes = RunState.ActiveDeck.DeliveryModes;
|
||||
Entry.bAllowedModeRosterFallsBackToDeckModes = true;
|
||||
Entry.AllowedModeSourceLine =
|
||||
TEXT("Allowed-mode source: covered owned case imposes no additional delivery-mode restriction, so the effective allowed-mode roster matches the retained active deck delivery roster.");
|
||||
}
|
||||
|
||||
Entry.AllowedModeRosterLine = BuildModeRosterLine(
|
||||
TEXT("Allowed modes on execute"),
|
||||
Entry.PreviewAllowedDeliveryModes,
|
||||
Entry.PreviewAllowedDeliveryModeLabels
|
||||
);
|
||||
Entry.PreviewStabilityLine =
|
||||
TEXT("Preview stability: exact direct owned-execution modality roster from covered-case launch.");
|
||||
Entry.bHasExactAllowedModeRosterPreview = true;
|
||||
Entry.bCanPreview = true;
|
||||
++Surface.DirectExactOptionCount;
|
||||
++Surface.RetainedDeckDeliveryModeRosterOptionCount;
|
||||
++Surface.ExactAllowedModeRosterOptionCount;
|
||||
if (Entry.bAllowedModeRosterFallsBackToDeckModes)
|
||||
{
|
||||
++Surface.DeckFallbackAllowedModeRosterOptionCount;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Entry.DeliveryModeRosterLine = TEXT("Deck delivery modes retained on execute: unavailable");
|
||||
Entry.AllowedModeRosterLine = TEXT("Allowed modes on execute: unavailable");
|
||||
Entry.AllowedModeSourceLine =
|
||||
TEXT("Allowed-mode source: unavailable because the covered case could not be re-resolved from the active deck.");
|
||||
Entry.PreviewStabilityLine = TEXT("Preview stability: unavailable");
|
||||
Entry.bCanPreview = false;
|
||||
++Surface.UnavailableOptionCount;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::
|
||||
StoredRequestReusable:
|
||||
case EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::
|
||||
RefreshRequired:
|
||||
{
|
||||
if (SeedCase == nullptr)
|
||||
{
|
||||
Entry.DeliveryModeRosterLine =
|
||||
TEXT("Deck delivery modes retained on execute: unavailable");
|
||||
Entry.AllowedModeRosterLine = TEXT("Allowed modes on execute: unavailable");
|
||||
Entry.AllowedModeSourceLine =
|
||||
TEXT("Allowed-mode source: unavailable because the active generated-mode surface has no structurally valid seed case.");
|
||||
Entry.PreviewStabilityLine = TEXT("Preview stability: unavailable");
|
||||
Entry.bCanPreview = false;
|
||||
++Surface.UnavailableOptionCount;
|
||||
break;
|
||||
}
|
||||
|
||||
Entry.PreviewDeckDeliveryModes = RunState.ActiveDeck.DeliveryModes;
|
||||
Entry.DeliveryModeRosterLine = BuildModeRosterLine(
|
||||
TEXT("Deck delivery modes retained on execute"),
|
||||
Entry.PreviewDeckDeliveryModes,
|
||||
Entry.PreviewDeckDeliveryModeLabels
|
||||
);
|
||||
Entry.bRetainsActiveDeckDeliveryModeRoster = true;
|
||||
Entry.bHasExactDeliveryModeRosterPreview = true;
|
||||
|
||||
if (SeedCase->AllowedDeliveryModes.Num() > 0)
|
||||
{
|
||||
Entry.PreviewAllowedDeliveryModes = SeedCase->AllowedDeliveryModes;
|
||||
}
|
||||
else
|
||||
{
|
||||
Entry.PreviewAllowedDeliveryModes = RunState.ActiveDeck.DeliveryModes;
|
||||
Entry.bAllowedModeRosterFallsBackToDeckModes = true;
|
||||
}
|
||||
|
||||
const int32 AllowedModeCountBeforeAugment =
|
||||
Entry.PreviewAllowedDeliveryModes.Num();
|
||||
Entry.PreviewAllowedDeliveryModes.AddUnique(
|
||||
PreviewEntry.HypotheticalDeliveryMode
|
||||
);
|
||||
Entry.bAllowedModeRosterAddsExecutionMode =
|
||||
Entry.PreviewAllowedDeliveryModes.Num() > AllowedModeCountBeforeAugment;
|
||||
Entry.AllowedModeRosterLine = BuildModeRosterLine(
|
||||
TEXT("Allowed modes on execute"),
|
||||
Entry.PreviewAllowedDeliveryModes,
|
||||
Entry.PreviewAllowedDeliveryModeLabels
|
||||
);
|
||||
|
||||
const FString ExecuteModeLabel = DescribeDeliveryMode(
|
||||
PreviewEntry.HypotheticalDeliveryMode
|
||||
);
|
||||
if (Entry.bAllowedModeRosterFallsBackToDeckModes)
|
||||
{
|
||||
Entry.AllowedModeSourceLine =
|
||||
Entry.bAllowedModeRosterAddsExecutionMode
|
||||
? FString::Printf(
|
||||
TEXT("Allowed-mode source: generated owned execution falls back to the active deck delivery roster, then widens it with %s."),
|
||||
*ExecuteModeLabel
|
||||
)
|
||||
: FString::Printf(
|
||||
TEXT("Allowed-mode source: generated owned execution falls back to the active deck delivery roster, and %s is already included."),
|
||||
*ExecuteModeLabel
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
Entry.AllowedModeSourceLine =
|
||||
Entry.bAllowedModeRosterAddsExecutionMode
|
||||
? FString::Printf(
|
||||
TEXT("Allowed-mode source: exact seed-case allowed-mode roster retained, then widened with %s."),
|
||||
*ExecuteModeLabel
|
||||
)
|
||||
: FString::Printf(
|
||||
TEXT("Allowed-mode source: exact seed-case allowed-mode roster retained, and %s is already included."),
|
||||
*ExecuteModeLabel
|
||||
);
|
||||
}
|
||||
|
||||
Entry.PreviewStabilityLine =
|
||||
PreviewEntry.LaunchRequestPreviewKind
|
||||
== EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::
|
||||
StoredRequestReusable
|
||||
? TEXT("Preview stability: exact while execute reuses the current stored request.")
|
||||
: TEXT("Preview stability: exact even though execute still needs launch-request refresh.");
|
||||
Entry.bHasExactAllowedModeRosterPreview = true;
|
||||
Entry.bCanPreview = true;
|
||||
++Surface.GeneratedExactOptionCount;
|
||||
++Surface.RetainedDeckDeliveryModeRosterOptionCount;
|
||||
++Surface.ExactAllowedModeRosterOptionCount;
|
||||
if (Entry.bAllowedModeRosterFallsBackToDeckModes)
|
||||
{
|
||||
++Surface.DeckFallbackAllowedModeRosterOptionCount;
|
||||
}
|
||||
if (Entry.bAllowedModeRosterAddsExecutionMode)
|
||||
{
|
||||
++Surface.ExecutionModeAugmentedAllowedModeRosterOptionCount;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::
|
||||
UnresolvedAfterChoice:
|
||||
Entry.DeliveryModeRosterLine =
|
||||
TEXT("Deck delivery modes retained on execute: blocked until every required selector is resolved.");
|
||||
Entry.AllowedModeRosterLine =
|
||||
TEXT("Allowed modes on execute: blocked until every required selector is resolved.");
|
||||
Entry.AllowedModeSourceLine =
|
||||
TEXT("Allowed-mode source: blocked while selector coverage remains incomplete.");
|
||||
Entry.PreviewStabilityLine =
|
||||
TEXT("Preview stability: blocked while selector coverage remains incomplete.");
|
||||
Entry.bPreviewBlocked = true;
|
||||
Entry.bCanPreview = true;
|
||||
++Surface.BlockedOptionCount;
|
||||
break;
|
||||
|
||||
case EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::
|
||||
PayloadUnavailable:
|
||||
Entry.DeliveryModeRosterLine =
|
||||
TEXT("Deck delivery modes retained on execute: blocked until a structurally valid launch payload can be derived.");
|
||||
Entry.AllowedModeRosterLine =
|
||||
TEXT("Allowed modes on execute: blocked until a structurally valid launch payload can be derived.");
|
||||
Entry.AllowedModeSourceLine =
|
||||
TEXT("Allowed-mode source: blocked while the hypothetical generated-mode payload remains structurally invalid.");
|
||||
Entry.PreviewStabilityLine =
|
||||
TEXT("Preview stability: blocked while the hypothetical generated-mode payload remains structurally invalid.");
|
||||
Entry.bPreviewBlocked = true;
|
||||
Entry.bCanPreview = true;
|
||||
++Surface.BlockedOptionCount;
|
||||
break;
|
||||
|
||||
case EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::Unavailable:
|
||||
case EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::None:
|
||||
default:
|
||||
Entry.DeliveryModeRosterLine = TEXT("Deck delivery modes retained on execute: unavailable");
|
||||
Entry.AllowedModeRosterLine = TEXT("Allowed modes on execute: unavailable");
|
||||
Entry.AllowedModeSourceLine = TEXT("Allowed-mode source: unavailable");
|
||||
Entry.PreviewStabilityLine = TEXT("Preview stability: unavailable");
|
||||
Entry.bCanPreview = false;
|
||||
++Surface.UnavailableOptionCount;
|
||||
break;
|
||||
}
|
||||
|
||||
const FString EntryDetail = Entry.AllowedModeSourceLine.IsEmpty()
|
||||
? Entry.PreviewStabilityLine
|
||||
: FString::Printf(
|
||||
TEXT("%s | %s"),
|
||||
*Entry.PreviewStabilityLine,
|
||||
*Entry.AllowedModeSourceLine
|
||||
);
|
||||
Entry.DetailLine = PreviewEntry.DetailLine.IsEmpty()
|
||||
? EntryDetail
|
||||
: FString::Printf(TEXT("%s | %s"), *EntryDetail, *PreviewEntry.DetailLine);
|
||||
|
||||
if (Entry.bMatchesCurrentSelection)
|
||||
{
|
||||
Surface.bCurrentSelectionHasExactDeliveryModeRosterPreview =
|
||||
Entry.bHasExactDeliveryModeRosterPreview;
|
||||
Surface.bCurrentSelectionHasExactAllowedModeRosterPreview =
|
||||
Entry.bHasExactAllowedModeRosterPreview;
|
||||
Surface.bCurrentSelectionRetainsActiveDeckDeliveryModeRoster =
|
||||
Entry.bRetainsActiveDeckDeliveryModeRoster;
|
||||
Surface.bCurrentSelectionAllowedModeRosterFallsBackToDeckModes =
|
||||
Entry.bAllowedModeRosterFallsBackToDeckModes;
|
||||
Surface.bCurrentSelectionAllowedModeRosterAddsExecutionMode =
|
||||
Entry.bAllowedModeRosterAddsExecutionMode;
|
||||
Surface.CurrentSelectionDeliveryModeRosterLine = FString::Printf(
|
||||
TEXT("%s | %s | %s"),
|
||||
*Entry.DeliveryModeRosterLine,
|
||||
*Entry.AllowedModeRosterLine,
|
||||
*Entry.PreviewStabilityLine
|
||||
);
|
||||
}
|
||||
|
||||
Surface.OptionEntries.Add(MoveTemp(Entry));
|
||||
}
|
||||
|
||||
Surface.bHasOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewOptions =
|
||||
Surface.OptionEntries.Num() > 0;
|
||||
Surface.bHasDirectDeliveryModeRosterAllowedModeRetentionPreviewOptions =
|
||||
Surface.DirectExactOptionCount > 0;
|
||||
Surface.bHasGeneratedDeliveryModeRosterAllowedModeRetentionPreviewOptions =
|
||||
Surface.GeneratedExactOptionCount > 0;
|
||||
Surface.bHasBlockedDeliveryModeRosterAllowedModeRetentionPreviewOptions =
|
||||
Surface.BlockedOptionCount > 0;
|
||||
|
||||
Surface.DeliveryModeRosterSummaryLine = Surface.OptionEntries.Num() > 0
|
||||
? FString::Printf(
|
||||
TEXT("Deck delivery roster: %d retained active-deck roster | %d blocked | %d unavailable"),
|
||||
Surface.RetainedDeckDeliveryModeRosterOptionCount,
|
||||
Surface.BlockedOptionCount,
|
||||
Surface.UnavailableOptionCount
|
||||
)
|
||||
: TEXT("Deck delivery roster: no imported options");
|
||||
Surface.AllowedModeRosterSummaryLine = Surface.OptionEntries.Num() > 0
|
||||
? FString::Printf(
|
||||
TEXT("Allowed-mode roster: %d exact | %d deck-fallback | %d execute-mode widened | %d blocked | %d unavailable"),
|
||||
Surface.ExactAllowedModeRosterOptionCount,
|
||||
Surface.DeckFallbackAllowedModeRosterOptionCount,
|
||||
Surface.ExecutionModeAugmentedAllowedModeRosterOptionCount,
|
||||
Surface.BlockedOptionCount,
|
||||
Surface.UnavailableOptionCount
|
||||
)
|
||||
: TEXT("Allowed-mode roster: no imported options");
|
||||
|
||||
if (Surface.CurrentSelectionDeliveryModeRosterLine.IsEmpty())
|
||||
{
|
||||
if (OptionMenuSurface.bHasUnresolvedSelectionDetail)
|
||||
{
|
||||
Surface.CurrentSelectionDeliveryModeRosterLine =
|
||||
OptionMenuSurface.UnresolvedSelectionLine;
|
||||
}
|
||||
else if (OptionMenuSurface.bHasSelection)
|
||||
{
|
||||
Surface.CurrentSelectionDeliveryModeRosterLine =
|
||||
TEXT("Current selection has no additional owned-execution delivery-mode roster preview.");
|
||||
}
|
||||
else if (OptionMenuSurface.bHasSelector)
|
||||
{
|
||||
Surface.CurrentSelectionDeliveryModeRosterLine =
|
||||
TEXT("Current selection: unresolved");
|
||||
}
|
||||
else
|
||||
{
|
||||
Surface.CurrentSelectionDeliveryModeRosterLine = TEXT("Current selection: n/a");
|
||||
}
|
||||
}
|
||||
|
||||
if (OptionMenuSurface.bHasSelector && Surface.OptionEntries.Num() > 0)
|
||||
{
|
||||
Surface.StatusLine = FString::Printf(
|
||||
TEXT("Generated-mode selector option owned-execution delivery-mode roster/allowed-mode retention preview exposes %d direct exact option%s, %d generated exact option%s, %d blocked option%s, and %d unavailable option%s."),
|
||||
Surface.DirectExactOptionCount,
|
||||
Surface.DirectExactOptionCount == 1 ? TEXT("") : TEXT("s"),
|
||||
Surface.GeneratedExactOptionCount,
|
||||
Surface.GeneratedExactOptionCount == 1 ? TEXT("") : TEXT("s"),
|
||||
Surface.BlockedOptionCount,
|
||||
Surface.BlockedOptionCount == 1 ? TEXT("") : TEXT("s"),
|
||||
Surface.UnavailableOptionCount,
|
||||
Surface.UnavailableOptionCount == 1 ? TEXT("") : TEXT("s")
|
||||
);
|
||||
}
|
||||
else if (OptionMenuSurface.bHasSelector)
|
||||
{
|
||||
Surface.StatusLine =
|
||||
TEXT("Generated-mode selector option owned-execution delivery-mode roster/allowed-mode retention preview is active, but this selector does not expose imported options.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Surface.StatusLine = OptionMenuSurface.StatusLine.IsEmpty()
|
||||
? TEXT("Generated-mode selector option owned-execution delivery-mode roster/allowed-mode retention preview is not currently available.")
|
||||
: OptionMenuSurface.StatusLine;
|
||||
}
|
||||
|
||||
const FString SelectorSummary = Surface.SelectorLabel.IsEmpty()
|
||||
? (Surface.SelectorId.IsEmpty() ? FString(TEXT("n/a")) : Surface.SelectorId)
|
||||
: Surface.SelectorLabel;
|
||||
const FString BindingSummary = Surface.BindingLabel.IsEmpty()
|
||||
? FString(TEXT("n/a"))
|
||||
: Surface.BindingLabel;
|
||||
Surface.DetailLine = FString::Printf(
|
||||
TEXT("Launch-request preview: %s | Selector: %s | Binding: %s"),
|
||||
OptionLaunchRequestPreviewSurface.StatusLine.IsEmpty()
|
||||
? TEXT("n/a")
|
||||
: *OptionLaunchRequestPreviewSurface.StatusLine,
|
||||
*SelectorSummary,
|
||||
*BindingSummary
|
||||
);
|
||||
|
||||
return Surface;
|
||||
}
|
||||
|
||||
FHyperTwistTrainingCoachQueueControlSurface
|
||||
UHyperTwistTrainingCoachLibrary::DeriveCoachQueueControlSurface(
|
||||
const FHyperTwistTrainingCoachSessionQueueState& QueueState,
|
||||
|
|
|
|||
|
|
@ -1005,6 +1005,25 @@ UHyperTwistTrainingPanelWidget::GetDisplayedCoachGeneratedModeSelectorOptionOwne
|
|||
);
|
||||
}
|
||||
|
||||
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface
|
||||
UHyperTwistTrainingPanelWidget::GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(
|
||||
const FString& SelectorId
|
||||
) const
|
||||
{
|
||||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface OptionMenuSurface =
|
||||
GetDisplayedCoachGeneratedModeSelectorOptionMenuSurface(SelectorId);
|
||||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface
|
||||
OptionLaunchRequestPreviewSurface =
|
||||
GetDisplayedCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface(SelectorId);
|
||||
return UHyperTwistTrainingCoachLibrary::
|
||||
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(
|
||||
CachedRunState,
|
||||
SelectorId,
|
||||
OptionMenuSurface,
|
||||
OptionLaunchRequestPreviewSurface
|
||||
);
|
||||
}
|
||||
|
||||
FHyperTwistTrainingRunState UHyperTwistTrainingPanelWidget::StartCoachRecommendedRun(
|
||||
const int32 MaxCases,
|
||||
const FString& StartActionSourceLabel
|
||||
|
|
|
|||
|
|
@ -986,6 +986,25 @@ AHyperTwistTrainingSessionActor::GetDisplayedCoachGeneratedModeSelectorOptionOwn
|
|||
);
|
||||
}
|
||||
|
||||
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface
|
||||
AHyperTwistTrainingSessionActor::GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(
|
||||
const FString& SelectorId
|
||||
) const
|
||||
{
|
||||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface OptionMenuSurface =
|
||||
GetDisplayedCoachGeneratedModeSelectorOptionMenuSurface(SelectorId);
|
||||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface
|
||||
OptionLaunchRequestPreviewSurface =
|
||||
GetDisplayedCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface(SelectorId);
|
||||
return UHyperTwistTrainingCoachLibrary::
|
||||
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(
|
||||
CachedRunState,
|
||||
SelectorId,
|
||||
OptionMenuSurface,
|
||||
OptionLaunchRequestPreviewSurface
|
||||
);
|
||||
}
|
||||
|
||||
FHyperTwistTrainingRunState AHyperTwistTrainingSessionActor::StartCoachRecommendedTrainingRun(
|
||||
const int32 MaxCases
|
||||
)
|
||||
|
|
|
|||
|
|
@ -847,4 +847,14 @@ public:
|
|||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface&
|
||||
OptionLaunchRequestPreviewSurface
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
|
||||
static FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface
|
||||
DeriveCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(
|
||||
const FHyperTwistTrainingRunState& RunState,
|
||||
const FString& SelectorId,
|
||||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface& OptionMenuSurface,
|
||||
const FHyperTwistTrainingCoachGeneratedModeSelectorOptionLaunchRequestPreviewSurface&
|
||||
OptionLaunchRequestPreviewSurface
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -338,6 +338,12 @@ public:
|
|||
const FString& SelectorId
|
||||
) const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
|
||||
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface
|
||||
GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(
|
||||
const FString& SelectorId
|
||||
) const;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach")
|
||||
FHyperTwistTrainingRunState StartCoachRecommendedRun(
|
||||
int32 MaxCases,
|
||||
|
|
|
|||
|
|
@ -319,6 +319,12 @@ public:
|
|||
const FString& SelectorId
|
||||
) const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
|
||||
FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface
|
||||
GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(
|
||||
const FString& SelectorId
|
||||
) const;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach")
|
||||
FHyperTwistTrainingRunState StartCoachRecommendedTrainingRun(int32 MaxCases);
|
||||
|
||||
|
|
|
|||
|
|
@ -11527,3 +11527,187 @@ struct FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeckIdRu
|
|||
|| bHasOwnedExecutionDeckIdRuntimeSurfaceRetentionPreviewOptions;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewEntrySurface
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString OptionId;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString Label;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString OptionValue;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind LaunchRequestPreviewKind =
|
||||
EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::None;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString DeliveryModeRosterLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString AllowedModeRosterLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString AllowedModeSourceLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString PreviewStabilityLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString DetailLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<EHyperTwistTrainingDeliveryMode> PreviewDeckDeliveryModes;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> PreviewDeckDeliveryModeLabels;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<EHyperTwistTrainingDeliveryMode> PreviewAllowedDeliveryModes;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FString> PreviewAllowedDeliveryModeLabels;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bMatchesCurrentSelection = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bStartsOwnedCaseImmediately = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bHasExactDeliveryModeRosterPreview = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bHasExactAllowedModeRosterPreview = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bRetainsActiveDeckDeliveryModeRoster = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bAllowedModeRosterFallsBackToDeckModes = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bAllowedModeRosterAddsExecutionMode = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bPreviewBlocked = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bCanPreview = false;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !OptionId.IsEmpty()
|
||||
|| !Label.IsEmpty()
|
||||
|| !DeliveryModeRosterLine.IsEmpty()
|
||||
|| !AllowedModeRosterLine.IsEmpty()
|
||||
|| LaunchRequestPreviewKind
|
||||
!= EHyperTwistTrainingCoachGeneratedModeOptionLaunchRequestPreviewKind::None
|
||||
|| bCanPreview;
|
||||
}
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface
|
||||
{
|
||||
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 DeliveryModeRosterSummaryLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString AllowedModeRosterSummaryLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString CurrentSelectionDeliveryModeRosterLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
FString DetailLine;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
TArray<FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewEntrySurface>
|
||||
OptionEntries;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 DirectExactOptionCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 GeneratedExactOptionCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 BlockedOptionCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 UnavailableOptionCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 RetainedDeckDeliveryModeRosterOptionCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 ExactAllowedModeRosterOptionCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 DeckFallbackAllowedModeRosterOptionCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
int32 ExecutionModeAugmentedAllowedModeRosterOptionCount = 0;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bHasSelector = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bHasOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewOptions = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bHasDirectDeliveryModeRosterAllowedModeRetentionPreviewOptions = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bHasGeneratedDeliveryModeRosterAllowedModeRetentionPreviewOptions = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bHasBlockedDeliveryModeRosterAllowedModeRetentionPreviewOptions = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bCurrentSelectionHasExactDeliveryModeRosterPreview = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bCurrentSelectionHasExactAllowedModeRosterPreview = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bCurrentSelectionRetainsActiveDeckDeliveryModeRoster = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bCurrentSelectionAllowedModeRosterFallsBackToDeckModes = false;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
|
||||
bool bCurrentSelectionAllowedModeRosterAddsExecutionMode = false;
|
||||
|
||||
bool IsStructurallyValid() const
|
||||
{
|
||||
return !StatusLine.IsEmpty()
|
||||
|| !SelectorId.IsEmpty()
|
||||
|| OptionEntries.Num() > 0
|
||||
|| bHasSelector
|
||||
|| bHasOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewOptions;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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 deck-id / runtime-surface retention preview surface over the already-cached selector/runtime/request state, so gameplay/Blueprint callers can render retained container id and imported runtime-surface posture for a chosen option without rebuilding generated deck composition rules directly
|
||||
- the current next bounded packet is to expose one thin generated-mode selector option owned execution delivery-modes roster / allowed-mode retention preview surface on those same two consumer surfaces so gameplay/Blueprint callers can render retained execution-modality posture for a chosen option without rebuilding generated deck composition rules directly
|
||||
- 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 delivery-mode roster / allowed-mode retention preview surface over the already-cached selector/runtime/request state, so gameplay/Blueprint callers can render retained execution-modality posture for a chosen option without rebuilding generated deck composition rules directly
|
||||
- the current next bounded packet is to expose one thin generated-mode selector option owned execution real-scramble / virtual-cube / smart-cube capability retention preview surface on those same two consumer surfaces so gameplay/Blueprint callers can render retained deck capability posture for a chosen option without rebuilding generated deck composition rules directly
|
||||
- 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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,104 @@
|
|||
# HyperTwist Phase 4 gameplay generated-mode selector option owned execution delivery-mode roster / allowed-mode retention preview surface packet
|
||||
|
||||
Created on `2026-05-08`
|
||||
|
||||
Status:
|
||||
|
||||
- first-party HyperTwist packet
|
||||
- bounded Phase `4` gameplay-facing consumer slice
|
||||
|
||||
## Purpose
|
||||
|
||||
This packet closes the next thin gameplay-facing consumer seam above the panel-widget and session-actor generated-mode selector option owned execution deck-id / runtime-surface retention preview surface by exposing one parameterized owned execution delivery-mode roster / allowed-mode retention preview surface for a chosen selector id.
|
||||
|
||||
The open tasks were:
|
||||
|
||||
- stop forcing gameplay / Blueprint callers to rebuild retained deck delivery-mode rosters and effective case allowed-mode rosters just to explain what execution modality posture a chosen imported option would keep on execute
|
||||
- expose direct covered-case modality retention plus generated owned-execution allowed-mode widening on the same thin consumer lane
|
||||
- expose resulting effective allowed-mode posture without widening into backend execution behavior
|
||||
|
||||
It is not:
|
||||
|
||||
- a selector-dispatch behavior change
|
||||
- a generated-mode launch-request persistence behavior change
|
||||
- a generated-mode execution deck synthesis change
|
||||
- a broader gameplay UI composition pass
|
||||
|
||||
## Scope
|
||||
|
||||
Bounded lane:
|
||||
|
||||
- add first-party owned execution delivery-mode roster / allowed-mode retention preview surfaces in shared training types
|
||||
- add a coach-library helper that projects retained deck delivery modes plus effective allowed-mode rosters over the already-landed launch-request preview surface and active run state
|
||||
- expose that parameterized modality-roster preview surface on `HyperTwistTrainingPanelWidget` and `HyperTwistTrainingSessionActor`
|
||||
- keep the derivation presentation-only and rooted in the already-owned selector/runtime/request surfaces
|
||||
|
||||
Out of scope:
|
||||
|
||||
- changing selector-choice apply behavior
|
||||
- changing stored launch-request creation, refresh, or execute behavior
|
||||
- changing generated-mode execution deck synthesis
|
||||
- widening into dashboard-only or broader gameplay composition work
|
||||
|
||||
## Why this was the right next packet
|
||||
|
||||
Before this slice:
|
||||
|
||||
- gameplay-facing panel/session consumers already exposed truthful owned case identity, prompt presentation, execution modality, execution scope, provenance posture, deck-title / selection-policy posture, and deck-id / runtime-surface retention for imported selector options
|
||||
- callers could tell what owned execution would run, how it would present, and what execution container/runtime identity it would keep
|
||||
|
||||
But one thin consumer seam was still open:
|
||||
|
||||
- callers still had to reconstruct retained deck delivery-mode rosters, case allowed-mode fallback semantics, and the generated owned-execution rule that widens the allowed roster with the execute delivery mode if they wanted to explain resulting execution-modality posture
|
||||
|
||||
That meant:
|
||||
|
||||
- single-mode execution preview was already thin and reusable
|
||||
- but roster-level deck/case modality posture still leaked generated deck composition rules into callers
|
||||
|
||||
So the next bounded move was:
|
||||
|
||||
- keep the already-landed owned execution deck-id / runtime-surface retention preview surface unchanged in behavior
|
||||
- reuse the already-cached launch-request preview surface and active run state to expose one narrow owned execution delivery-mode roster / allowed-mode retention preview surface above it
|
||||
|
||||
## What landed
|
||||
|
||||
Primary code changes:
|
||||
|
||||
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h`
|
||||
- added `FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewEntrySurface`
|
||||
- added `FHyperTwistTrainingCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface`
|
||||
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingCoachLibrary.h`
|
||||
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp`
|
||||
- added `DeriveCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(...)`
|
||||
- delivery-mode roster / allowed-mode retention preview is derived from cached run state plus the already-landed launch-request preview surface
|
||||
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingPanelWidget.h`
|
||||
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp`
|
||||
- added `GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(const FString& SelectorId)`
|
||||
- `UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSessionActor.h`
|
||||
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSessionActor.cpp`
|
||||
- added `GetDisplayedCoachGeneratedModeSelectorOptionOwnedExecutionDeliveryModeRosterAllowedModeRetentionPreviewSurface(const FString& SelectorId)`
|
||||
|
||||
Surface behavior:
|
||||
|
||||
- reports exact retained active-deck delivery-mode rosters for both direct covered-case starts and generated owned-execution paths
|
||||
- reports exact covered-case allowed-mode rosters when direct covered cases explicitly restrict delivery modes
|
||||
- reports direct covered-case fallback to the retained active deck delivery roster when the covered case imposes no additional delivery-mode restriction
|
||||
- reports exact generated owned-execution allowed-mode rosters, including the bounded clean-room rule that falls back to the active deck delivery roster when the seed case has no explicit allowed modes and then `AddUnique`s the execute delivery mode
|
||||
- distinguishes generated choices whose execute delivery mode actually widens the retained allowed-mode roster from those whose execute mode was already present
|
||||
- keeps unresolved or payload-invalid choices inspectable as blocked modality-roster preview states instead of collapsing them into a generic unavailable branch
|
||||
- keeps the surface presentation-only and compatible with the already-landed launch / execution, request-alignment, stored-request delta, launch-request payload / refresh-preview, launch-request metadata / origin-notes preview, launch-request envelope / request-source preview, owned execution case / canonical-state preview, owned execution prompt preview, owned execution delivery preview, owned execution scope preview, owned execution provenance preview, owned execution deck-title / selection-policy preview, and owned execution deck-id / runtime-surface retention preview surfaces
|
||||
|
||||
## Validation
|
||||
|
||||
Validation target:
|
||||
|
||||
- full `Development Editor|Win64` build of `C:\HyperTwist\UnrealHyperTwist\UnrealHyperTwist.sln`
|
||||
|
||||
Result:
|
||||
|
||||
- passed with `0` warnings and `0` errors
|
||||
|
||||
## Follow-on
|
||||
|
||||
The next bounded packet on this same gameplay-facing consumer lane should stay thin and expose one generated-mode selector option owned execution real-scramble / virtual-cube / smart-cube capability retention preview surface so callers can render retained deck capability posture for a chosen option without rebuilding generated deck composition rules directly.
|
||||
Loading…
Add table
Reference in a new issue