Expose higher-dimensional runtime activation in training surfaces
This commit is contained in:
parent
dbd48d0965
commit
10b66a37c3
13 changed files with 405 additions and 2 deletions
|
|
@ -290,6 +290,31 @@ bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivation
|
|||
return false;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivationProfileByRuntimeModeId(
|
||||
const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog& Catalog,
|
||||
const FString& RuntimeModeId,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
)
|
||||
{
|
||||
if (RuntimeModeId.IsEmpty())
|
||||
{
|
||||
OutProfile = FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile();
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile : Catalog.Profiles)
|
||||
{
|
||||
if (Profile.MatchesRuntimeModeId(RuntimeModeId))
|
||||
{
|
||||
OutProfile = Profile;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
OutProfile = FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryResolvePuzzleDefinition(
|
||||
const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog& Catalog,
|
||||
const FString& ActivationProfileIdOrPuzzleId,
|
||||
|
|
@ -299,7 +324,12 @@ bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryResolvePuzzleDefinit
|
|||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile Profile;
|
||||
const bool bResolved =
|
||||
TryGetRuntimeActivationProfileById(Catalog, ActivationProfileIdOrPuzzleId, Profile)
|
||||
|| TryGetRuntimeActivationProfileByPuzzleId(Catalog, ActivationProfileIdOrPuzzleId, Profile);
|
||||
|| TryGetRuntimeActivationProfileByPuzzleId(Catalog, ActivationProfileIdOrPuzzleId, Profile)
|
||||
|| TryGetRuntimeActivationProfileByRuntimeModeId(
|
||||
Catalog,
|
||||
ActivationProfileIdOrPuzzleId,
|
||||
Profile
|
||||
);
|
||||
if (!bResolved)
|
||||
{
|
||||
OutDefinition = FHyperTwistPuzzleDefinitionRef();
|
||||
|
|
|
|||
|
|
@ -128,6 +128,13 @@ void UHyperTwistTrainingPanelWidget::RefreshTrainingState()
|
|||
this,
|
||||
CachedLatestGeneratedModeLaunchRequestForActiveDeck
|
||||
);
|
||||
if (!UHyperTwistTrainingRuntimeLibrary::TryGetActiveHigherDimensionalRuntimeActivationProfile(
|
||||
this,
|
||||
CachedHigherDimensionalRuntimeActivationProfile))
|
||||
{
|
||||
CachedHigherDimensionalRuntimeActivationProfile =
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile();
|
||||
}
|
||||
CachedMethodDrillRunState = UHyperTwistTrainingRuntimeLibrary::GetActiveMethodDrillRunState(this);
|
||||
CachedMethodDrillSummary = UHyperTwistTrainingRuntimeLibrary::GetActiveMethodDrillSummary(this);
|
||||
CachedMethodDrillDiagnosticPacket =
|
||||
|
|
@ -399,6 +406,17 @@ FString UHyperTwistTrainingPanelWidget::GetDisplayedGeneratedModeExecutionBlocke
|
|||
return LastGeneratedModeExecutionBlockedReason;
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingPanelWidget::HasDisplayedHigherDimensionalRuntimeActivationProfile() const
|
||||
{
|
||||
return CachedHigherDimensionalRuntimeActivationProfile.IsStructurallyValid();
|
||||
}
|
||||
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile
|
||||
UHyperTwistTrainingPanelWidget::GetDisplayedHigherDimensionalRuntimeActivationProfile() const
|
||||
{
|
||||
return CachedHigherDimensionalRuntimeActivationProfile;
|
||||
}
|
||||
|
||||
FHyperTwistTrainingDeck UHyperTwistTrainingPanelWidget::BuildActiveCoachRecommendedDeck(const int32 MaxCases)
|
||||
{
|
||||
CachedCoachRecommendedDeck = UHyperTwistTrainingRuntimeLibrary::BuildActiveCoachRecommendedDeck(
|
||||
|
|
|
|||
|
|
@ -139,6 +139,86 @@ namespace HyperTwistTrainingRuntimeLibraryInternal
|
|||
: TEXT("handoff")))
|
||||
);
|
||||
}
|
||||
|
||||
void AddUniqueCandidate(TArray<FString>& Candidates, const FString& Candidate)
|
||||
{
|
||||
if (Candidate.IsEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (const FString& ExistingCandidate : Candidates)
|
||||
{
|
||||
if (ExistingCandidate.Equals(Candidate, ESearchCase::IgnoreCase))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Candidates.Add(Candidate);
|
||||
}
|
||||
|
||||
bool TryResolveHigherDimensionalRuntimeActivationProfile(
|
||||
const FHyperTwistTrainingRunState& RunState,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
)
|
||||
{
|
||||
const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog Catalog =
|
||||
UHyperTwistTrainingHigherDimensionalRuntimeLibrary::BuildBundledHigherDimensionalRuntimeActivationCatalog();
|
||||
|
||||
TArray<FString> CandidateRuntimeModeIds;
|
||||
if (RunState.ImportedGeneratedModeLaunchRequest.IsStructurallyValid())
|
||||
{
|
||||
AddUniqueCandidate(
|
||||
CandidateRuntimeModeIds,
|
||||
RunState.ImportedGeneratedModeLaunchRequest.LaunchConfig.RuntimeModeId
|
||||
);
|
||||
}
|
||||
|
||||
for (const FString& CandidateRuntimeModeId : CandidateRuntimeModeIds)
|
||||
{
|
||||
if (UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivationProfileByRuntimeModeId(
|
||||
Catalog,
|
||||
CandidateRuntimeModeId,
|
||||
OutProfile))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
TArray<FString> CandidatePuzzleIds;
|
||||
if (RunState.CurrentSelection.TrainingCase.IsStructurallyValid())
|
||||
{
|
||||
AddUniqueCandidate(CandidatePuzzleIds, RunState.CurrentSelection.TrainingCase.PuzzleId);
|
||||
}
|
||||
|
||||
if (RunState.ImportedGeneratedModeLaunchRequest.IsStructurallyValid())
|
||||
{
|
||||
AddUniqueCandidate(
|
||||
CandidatePuzzleIds,
|
||||
RunState.ImportedGeneratedModeLaunchRequest.LaunchConfig.PuzzleId
|
||||
);
|
||||
}
|
||||
|
||||
if (RunState.ReplayPacket.PuzzleDefinition.IsStructurallyValid())
|
||||
{
|
||||
AddUniqueCandidate(CandidatePuzzleIds, RunState.ReplayPacket.PuzzleDefinition.PuzzleId);
|
||||
}
|
||||
|
||||
for (const FString& CandidatePuzzleId : CandidatePuzzleIds)
|
||||
{
|
||||
if (UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivationProfileByPuzzleId(
|
||||
Catalog,
|
||||
CandidatePuzzleId,
|
||||
OutProfile))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
OutProfile = FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
UHyperTwistTrainingSubsystem* UHyperTwistTrainingRuntimeLibrary::GetTrainingSubsystem(UObject* WorldContextObject)
|
||||
|
|
@ -7041,6 +7121,40 @@ bool UHyperTwistTrainingRuntimeLibrary::TryGetBundledHigherDimensionalRuntimeAct
|
|||
);
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingRuntimeLibrary::TryGetBundledHigherDimensionalRuntimeActivationProfileByRuntimeModeId(
|
||||
const FString& RuntimeModeId,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
)
|
||||
{
|
||||
return UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivationProfileByRuntimeModeId(
|
||||
GetBundledHigherDimensionalRuntimeActivationCatalog(),
|
||||
RuntimeModeId,
|
||||
OutProfile
|
||||
);
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalRuntimeActivationProfileForRunState(
|
||||
const FHyperTwistTrainingRunState& RunState,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
)
|
||||
{
|
||||
return HyperTwistTrainingRuntimeLibraryInternal::TryResolveHigherDimensionalRuntimeActivationProfile(
|
||||
RunState,
|
||||
OutProfile
|
||||
);
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingRuntimeLibrary::TryGetActiveHigherDimensionalRuntimeActivationProfile(
|
||||
UObject* WorldContextObject,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
)
|
||||
{
|
||||
return TryGetHigherDimensionalRuntimeActivationProfileForRunState(
|
||||
GetActiveTrainingRunState(WorldContextObject),
|
||||
OutProfile
|
||||
);
|
||||
}
|
||||
|
||||
bool UHyperTwistTrainingRuntimeLibrary::TryResolveBundledHigherDimensionalPuzzleDefinition(
|
||||
const FString& ActivationProfileIdOrPuzzleId,
|
||||
FHyperTwistPuzzleDefinitionRef& OutDefinition
|
||||
|
|
|
|||
|
|
@ -228,6 +228,13 @@ void AHyperTwistTrainingSessionActor::RefreshCachedTrainingState()
|
|||
this,
|
||||
CachedLatestGeneratedModeLaunchRequestForActiveDeck
|
||||
);
|
||||
if (!UHyperTwistTrainingRuntimeLibrary::TryGetActiveHigherDimensionalRuntimeActivationProfile(
|
||||
this,
|
||||
CachedHigherDimensionalRuntimeActivationProfile))
|
||||
{
|
||||
CachedHigherDimensionalRuntimeActivationProfile =
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile();
|
||||
}
|
||||
CachedActiveTrainingSessionTemplates =
|
||||
UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingSessionTemplates(this);
|
||||
if (AutoStartUserId.IsEmpty())
|
||||
|
|
@ -372,6 +379,17 @@ FString AHyperTwistTrainingSessionActor::GetDisplayedGeneratedModeExecutionBlock
|
|||
return LastGeneratedModeExecutionBlockedReason;
|
||||
}
|
||||
|
||||
bool AHyperTwistTrainingSessionActor::HasDisplayedHigherDimensionalRuntimeActivationProfile() const
|
||||
{
|
||||
return CachedHigherDimensionalRuntimeActivationProfile.IsStructurallyValid();
|
||||
}
|
||||
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile
|
||||
AHyperTwistTrainingSessionActor::GetDisplayedHigherDimensionalRuntimeActivationProfile() const
|
||||
{
|
||||
return CachedHigherDimensionalRuntimeActivationProfile;
|
||||
}
|
||||
|
||||
FHyperTwistTrainingDeck AHyperTwistTrainingSessionActor::BuildCoachRecommendedDeck(const int32 MaxCases)
|
||||
{
|
||||
CachedCoachRecommendedDeck = UHyperTwistTrainingRuntimeLibrary::BuildActiveCoachRecommendedDeck(
|
||||
|
|
|
|||
|
|
@ -114,6 +114,12 @@ struct FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile
|
|||
&& CandidatePuzzleId.Equals(PuzzleId, ESearchCase::IgnoreCase);
|
||||
}
|
||||
|
||||
bool MatchesRuntimeModeId(const FString& CandidateRuntimeModeId) const
|
||||
{
|
||||
return !CandidateRuntimeModeId.IsEmpty()
|
||||
&& CandidateRuntimeModeId.Equals(RuntimeModeId, ESearchCase::IgnoreCase);
|
||||
}
|
||||
|
||||
FHyperTwistPuzzleDefinitionRef ToDefinitionRef() const
|
||||
{
|
||||
FHyperTwistPuzzleDefinitionRef Definition;
|
||||
|
|
@ -151,6 +157,7 @@ struct FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog
|
|||
|
||||
TSet<FString> SeenProfileIds;
|
||||
TSet<FString> SeenPuzzleIds;
|
||||
TSet<FString> SeenRuntimeModeIds;
|
||||
for (const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile : Profiles)
|
||||
{
|
||||
if (!Profile.IsStructurallyValid())
|
||||
|
|
@ -170,8 +177,15 @@ struct FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog
|
|||
return false;
|
||||
}
|
||||
|
||||
const FString NormalizedRuntimeModeId = Profile.RuntimeModeId.ToLower();
|
||||
if (SeenRuntimeModeIds.Contains(NormalizedRuntimeModeId))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SeenProfileIds.Add(NormalizedProfileId);
|
||||
SeenPuzzleIds.Add(NormalizedPuzzleId);
|
||||
SeenRuntimeModeIds.Add(NormalizedRuntimeModeId);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -202,6 +216,13 @@ public:
|
|||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional")
|
||||
static bool TryGetRuntimeActivationProfileByRuntimeModeId(
|
||||
const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog& Catalog,
|
||||
const FString& RuntimeModeId,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional")
|
||||
static bool TryResolvePuzzleDefinition(
|
||||
const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog& Catalog,
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include "CoreMinimal.h"
|
||||
#include "Blueprint/UserWidget.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingCoachLibrary.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingTypes.h"
|
||||
#include "HyperTwistTrainingPanelWidget.generated.h"
|
||||
|
||||
|
|
@ -110,6 +111,9 @@ public:
|
|||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|Imported")
|
||||
FString LastGeneratedModeExecutionBlockedReason;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|HigherDimensional")
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile CachedHigherDimensionalRuntimeActivationProfile;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training")
|
||||
FHyperTwistTrainingRepositoryRoundTripVerification CachedRepositoryRoundTripVerification;
|
||||
|
||||
|
|
@ -215,6 +219,13 @@ public:
|
|||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Imported")
|
||||
FString GetDisplayedGeneratedModeExecutionBlockedReason() const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|HigherDimensional")
|
||||
bool HasDisplayedHigherDimensionalRuntimeActivationProfile() const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|HigherDimensional")
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile
|
||||
GetDisplayedHigherDimensionalRuntimeActivationProfile() const;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach")
|
||||
FHyperTwistTrainingDeck BuildActiveCoachRecommendedDeck(int32 MaxCases);
|
||||
|
||||
|
|
|
|||
|
|
@ -3388,6 +3388,24 @@ public:
|
|||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional")
|
||||
static bool TryGetBundledHigherDimensionalRuntimeActivationProfileByRuntimeModeId(
|
||||
const FString& RuntimeModeId,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional")
|
||||
static bool TryGetHigherDimensionalRuntimeActivationProfileForRunState(
|
||||
const FHyperTwistTrainingRunState& RunState,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional", meta = (WorldContext = "WorldContextObject"))
|
||||
static bool TryGetActiveHigherDimensionalRuntimeActivationProfile(
|
||||
UObject* WorldContextObject,
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile
|
||||
);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional")
|
||||
static bool TryResolveBundledHigherDimensionalPuzzleDefinition(
|
||||
const FString& ActivationProfileIdOrPuzzleId,
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include "CoreMinimal.h"
|
||||
#include "GameFramework/Actor.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingCoachLibrary.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h"
|
||||
#include "HyperTwistTraining/HyperTwistTrainingTypes.h"
|
||||
#include "HyperTwistTrainingSessionActor.generated.h"
|
||||
|
||||
|
|
@ -97,6 +98,9 @@ public:
|
|||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|Imported")
|
||||
FString LastGeneratedModeExecutionBlockedReason;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|HigherDimensional")
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile CachedHigherDimensionalRuntimeActivationProfile;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training")
|
||||
FHyperTwistTrainingRepositoryRoundTripVerification CachedRepositoryRoundTripVerification;
|
||||
|
||||
|
|
@ -192,6 +196,13 @@ public:
|
|||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Imported")
|
||||
FString GetDisplayedGeneratedModeExecutionBlockedReason() const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|HigherDimensional")
|
||||
bool HasDisplayedHigherDimensionalRuntimeActivationProfile() const;
|
||||
|
||||
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|HigherDimensional")
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile
|
||||
GetDisplayedHigherDimensionalRuntimeActivationProfile() const;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach")
|
||||
FHyperTwistTrainingDeck BuildCoachRecommendedDeck(int32 MaxCases);
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,41 @@ namespace HyperTwistHigherDimensionalPhase6CTestInternal
|
|||
Deck.Cases = {TrainingCase};
|
||||
return Deck;
|
||||
}
|
||||
|
||||
FHyperTwistTrainingImportedGeneratedModeLaunchRequest MakeGeneratedModeLaunchRequest(
|
||||
const FString& DeckId,
|
||||
const FString& TrainingSessionId,
|
||||
const FString& PuzzleId,
|
||||
const FString& RuntimeModeId
|
||||
)
|
||||
{
|
||||
FHyperTwistTrainingImportedRuntimeSelectorChoice SelectorChoice;
|
||||
SelectorChoice.SelectorId = TEXT("family-mode");
|
||||
SelectorChoice.SelectorBinding = TEXT("family-mode");
|
||||
SelectorChoice.SelectedValue = TEXT("order3");
|
||||
SelectorChoice.DisplayValue = TEXT("Order 3");
|
||||
|
||||
FHyperTwistTrainingImportedGeneratedModeLaunchConfig LaunchConfig;
|
||||
LaunchConfig.DeckId = DeckId;
|
||||
LaunchConfig.UserId = TEXT("phase6c-user");
|
||||
LaunchConfig.TrainingSessionId = TrainingSessionId;
|
||||
LaunchConfig.DeliveryMode = EHyperTwistTrainingDeliveryMode::VirtualCube;
|
||||
LaunchConfig.PuzzleId = PuzzleId;
|
||||
LaunchConfig.SurfaceId = TEXT("phase6c/imported-runtime-surface");
|
||||
LaunchConfig.SurfaceLabel = TEXT("Phase 6C Imported Runtime Surface");
|
||||
LaunchConfig.RuntimeModeId = RuntimeModeId;
|
||||
LaunchConfig.GeneratorType = TEXT("cleanroom-generated-mode");
|
||||
LaunchConfig.SelectorChoices = {SelectorChoice};
|
||||
LaunchConfig.OriginPaths = {TEXT("phase6c/generated-mode")};
|
||||
LaunchConfig.Notes = TEXT("Phase 6C contract test launch request.");
|
||||
|
||||
FHyperTwistTrainingImportedGeneratedModeLaunchRequest Request;
|
||||
Request.RequestId = FString::Printf(TEXT("%s/request"), *DeckId);
|
||||
Request.RequestedAtUtc = TEXT("2026-06-13T00:00:00Z");
|
||||
Request.RequestSource = TEXT("phase6c-contract-test");
|
||||
Request.LaunchConfig = LaunchConfig;
|
||||
return Request;
|
||||
}
|
||||
}
|
||||
|
||||
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||
|
|
@ -137,4 +172,101 @@ bool FHyperTwistHigherDimensionalPhase6CTrainingRunDefinitionBridgeTest::RunTest
|
|||
return true;
|
||||
}
|
||||
|
||||
IMPLEMENT_SIMPLE_AUTOMATION_TEST(
|
||||
FHyperTwistHigherDimensionalPhase6CRunStateActivationResolutionTest,
|
||||
"HyperTwist.FirstParty.HigherDimensional.Phase6C.RunStateActivationResolution",
|
||||
EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter
|
||||
)
|
||||
|
||||
bool FHyperTwistHigherDimensionalPhase6CRunStateActivationResolutionTest::RunTest(const FString& Parameters)
|
||||
{
|
||||
const FHyperTwistTrainingRunState Magic120CellRun = UHyperTwistTrainingLibrary::StartTrainingRun(
|
||||
HyperTwistHigherDimensionalPhase6CTestInternal::MakeDeck(
|
||||
TEXT("phase6c/magic120cell-resolution"),
|
||||
TEXT("polychoron/magic120cell")
|
||||
),
|
||||
TEXT("phase6c-user"),
|
||||
TEXT("phase6c-magic120cell-resolution-session"),
|
||||
EHyperTwistTrainingDeliveryMode::VirtualCube
|
||||
);
|
||||
TestTrue(TEXT("The Magic120Cell resolution run must start structurally valid."), Magic120CellRun.IsStructurallyValid());
|
||||
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile Magic120CellProfile;
|
||||
TestTrue(
|
||||
TEXT("The Magic120Cell run must resolve a higher-dimensional activation profile from its run state."),
|
||||
UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalRuntimeActivationProfileForRunState(
|
||||
Magic120CellRun,
|
||||
Magic120CellProfile
|
||||
)
|
||||
);
|
||||
TestEqual(TEXT("The Magic120Cell run must resolve the canonical activation profile id."), Magic120CellProfile.ActivationProfileId, TEXT("magic120cell-cleanroom-runtime-activation"));
|
||||
TestEqual(TEXT("The Magic120Cell run must resolve the canonical runtime mode id."), Magic120CellProfile.RuntimeModeId, TEXT("magic120cell-full-color-runtime-v1"));
|
||||
|
||||
FHyperTwistTrainingRunState RuntimeModeFallbackRun = UHyperTwistTrainingLibrary::StartTrainingRun(
|
||||
HyperTwistHigherDimensionalPhase6CTestInternal::MakeDeck(
|
||||
TEXT("phase6c/runtime-mode-fallback"),
|
||||
TEXT("cube/3x3x3")
|
||||
),
|
||||
TEXT("phase6c-user"),
|
||||
TEXT("phase6c-runtime-mode-fallback-session"),
|
||||
EHyperTwistTrainingDeliveryMode::VirtualCube
|
||||
);
|
||||
TestTrue(TEXT("The runtime-mode fallback run must start structurally valid."), RuntimeModeFallbackRun.IsStructurallyValid());
|
||||
|
||||
RuntimeModeFallbackRun.ImportedGeneratedModeLaunchRequest =
|
||||
HyperTwistHigherDimensionalPhase6CTestInternal::MakeGeneratedModeLaunchRequest(
|
||||
RuntimeModeFallbackRun.ActiveDeck.DeckId,
|
||||
RuntimeModeFallbackRun.Session.TrainingSessionId,
|
||||
TEXT("cube/3x3x3"),
|
||||
TEXT("magiccube5d-order3-runtime-v1")
|
||||
);
|
||||
TestTrue(
|
||||
TEXT("The runtime-mode fallback launch request must stay structurally valid."),
|
||||
RuntimeModeFallbackRun.ImportedGeneratedModeLaunchRequest.IsStructurallyValid()
|
||||
);
|
||||
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile RuntimeModeProfile;
|
||||
TestTrue(
|
||||
TEXT("The runtime-mode fallback run must resolve by runtime mode id even when the run puzzle is not higher-dimensional."),
|
||||
UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalRuntimeActivationProfileForRunState(
|
||||
RuntimeModeFallbackRun,
|
||||
RuntimeModeProfile
|
||||
)
|
||||
);
|
||||
TestEqual(TEXT("The runtime-mode fallback run must resolve the MagicCube5D activation profile."), RuntimeModeProfile.ActivationProfileId, TEXT("magiccube5d-cleanroom-runtime-activation"));
|
||||
TestEqual(TEXT("The runtime-mode fallback run must resolve the canonical MagicCube5D puzzle id."), RuntimeModeProfile.PuzzleId, TEXT("hypercube/magiccube5d/order3"));
|
||||
|
||||
FHyperTwistPuzzleDefinitionRef RuntimeModeDefinition;
|
||||
TestTrue(
|
||||
TEXT("The bundled higher-dimensional resolver must also accept runtime mode ids directly."),
|
||||
UHyperTwistTrainingRuntimeLibrary::TryResolveBundledHigherDimensionalPuzzleDefinition(
|
||||
TEXT("magiccube5d-order3-runtime-v1"),
|
||||
RuntimeModeDefinition
|
||||
)
|
||||
);
|
||||
TestEqual(TEXT("The runtime-mode definition resolution must map back to the canonical MagicCube5D puzzle id."), RuntimeModeDefinition.PuzzleId, TEXT("hypercube/magiccube5d/order3"));
|
||||
|
||||
FHyperTwistTrainingRunState ClassicRun = UHyperTwistTrainingLibrary::StartTrainingRun(
|
||||
HyperTwistHigherDimensionalPhase6CTestInternal::MakeDeck(
|
||||
TEXT("phase6c/classic-negative"),
|
||||
TEXT("cube/3x3x3")
|
||||
),
|
||||
TEXT("phase6c-user"),
|
||||
TEXT("phase6c-classic-negative-session"),
|
||||
EHyperTwistTrainingDeliveryMode::VirtualCube
|
||||
);
|
||||
TestTrue(TEXT("The classic negative-control run must start structurally valid."), ClassicRun.IsStructurallyValid());
|
||||
|
||||
FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile MissingProfile;
|
||||
TestFalse(
|
||||
TEXT("A classic run without a higher-dimensional imported launch request must not resolve an activation profile."),
|
||||
UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalRuntimeActivationProfileForRunState(
|
||||
ClassicRun,
|
||||
MissingProfile
|
||||
)
|
||||
);
|
||||
TestFalse(TEXT("The negative-control resolved profile must stay empty."), MissingProfile.IsStructurallyValid());
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -352,6 +352,8 @@ Closure read:
|
|||
### 6C — Magic120Cell & MagicCube5D
|
||||
- [x] Resolve the Phase `6C` widening posture as an Unreal clean-room activation lane above the bounded retained `Magic120Cell` / `MagicCube5D` donor contracts and the retained `Hyperspeedcube` runtime anchor
|
||||
- [x] Land a first-party higher-dimensional runtime-activation catalog with canonical `Magic120Cell` and `MagicCube5D` launch definitions, primary contract ids, default selection posture, and no external-process requirement
|
||||
- `2026-06-13` continuation proof: current code now resolves the active higher-dimensional activation profile from training run state through both canonical puzzle ids and imported generated-mode `RuntimeModeId` fallback, then mirrors that resolved profile through the training runtime library plus the live training panel and session-actor caches
|
||||
- `2026-06-13` Windows checkpoint: the primary reverse-SSH lane rebuilt the slice in isolated worktree `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded` / UnrealBuildTool `Total execution time: 1061.50 seconds`, and targeted `UnrealEditor-Cmd` automation found `5` tests under `HyperTwist.FirstParty.HigherDimensional.Phase6C` and passed all `5`, including `RunStateActivationResolution`
|
||||
- [ ] Implement the full owned interactive `120-cell` and `5D` projection/runtime surfaces in Unreal above the new activation catalog
|
||||
- [ ] Widen the new activation catalog into actual map-level launch, interaction, and persistence execution for the dedicated families
|
||||
|
||||
|
|
@ -512,4 +514,10 @@ Recommended next widening order:
|
|||
canonical `polychoron/magic120cell` and `hypercube/magiccube5d/order3`
|
||||
puzzle definitions, primary donor-boundary contract ids, and default
|
||||
launch-selection posture without widening into an external-process bridge
|
||||
- `2026-06-13`: the next `Phase 6C` continuation widened that owned activation
|
||||
lane into active run-state/runtime surfaces by resolving higher-dimensional
|
||||
activation through both puzzle-id and imported generated-mode
|
||||
`RuntimeModeId` paths, mirroring the result into the training panel/session
|
||||
caches, and validating the slice on `localhost:22022` with `5` passing
|
||||
`HyperTwist.FirstParty.HigherDimensional.Phase6C` tests
|
||||
- later classic-cube polish only when a concrete presentation gap remains, not as the default next move
|
||||
|
|
|
|||
|
|
@ -164,6 +164,19 @@ UnrealBuildTool `Total execution time: 2829.95 seconds`, and targeted
|
|||
compile proof to current higher-dimensional activation-catalog proof on the
|
||||
same primary reverse-SSH lane.
|
||||
|
||||
Later `2026-06-13` continuation proof on that same primary lane validated the
|
||||
active runtime-surface widening above the landed `Phase 6C` packet without
|
||||
opening a new host/runtime branch: the isolated Windows worktree
|
||||
`C:\HyperTwist_worktrees\phase10validate` rebuilt the updated runtime-library,
|
||||
training-panel, and session-actor exposure slice with `Result: Succeeded` and
|
||||
UnrealBuildTool `Total execution time: 1061.50 seconds`, then targeted
|
||||
`UnrealEditor-Cmd` automation found `5` tests under
|
||||
`HyperTwist.FirstParty.HigherDimensional.Phase6C` and passed all `5`,
|
||||
including `RunStateActivationResolution`, with
|
||||
`**** TEST COMPLETE. EXIT CODE: 0 ****`. This extends the doctrine from the
|
||||
earlier activation-catalog checkpoint into current active-run and
|
||||
`RuntimeModeId` fallback proof on the same primary reverse-SSH lane.
|
||||
|
||||
Operational reading:
|
||||
|
||||
- use `localhost:22022` as the primary reverse-SSH lane
|
||||
|
|
|
|||
|
|
@ -266,7 +266,7 @@ repo.
|
|||
| Dedicated `120-cell` symmetry-aware focus view profiles | Implemented now | landed `Magic120Cell` `Phase 6R-AL` | Current bounded settings-derived projection, symmetry preset, logical-visibility, per-cell visibility, and center-cell focus posture are live above the landed dedicated `120-cell` runtime-profile seam without widening into renderer, host-shell, or generic topology ownership. |
|
||||
| Dedicated `5D` family runtime profile and persistence boundary | Implemented now | landed `MagicCube5D` packet | Current bounded family-specific widening is live beneath the retained `Hyperspeedcube` runtime anchor. |
|
||||
| Dedicated `5D` projection and focus view profiles | Implemented now | landed `MagicCube5D` `Phase 6R-AM` | Current bounded settings-derived projection-distance, stereo posture, per-face visibility, accent emphasis, and fifth-axis focus posture are live above the landed dedicated `5D` runtime-profile seam without widening into renderer, host-shell, or generic hyper-runtime ownership. |
|
||||
| Higher-dimensional clean-room runtime activation catalog | Implemented now | landed `Phase 6C` activation packet | First-party current code now resolves canonical `polychoron/magic120cell` and `hypercube/magiccube5d/order3` puzzle definitions, default launch posture, primary donor-boundary contract ids, and the no-external-process clean-room stance above the retained `Magic120Cell` / `MagicCube5D` contracts and the retained `Hyperspeedcube` runtime anchor. |
|
||||
| Higher-dimensional clean-room runtime activation catalog | Implemented now | landed `Phase 6C` activation packet | First-party current code now resolves canonical `polychoron/magic120cell` and `hypercube/magiccube5d/order3` puzzle definitions, default launch posture, primary donor-boundary contract ids, and the no-external-process clean-room stance above the retained `Magic120Cell` / `MagicCube5D` contracts and the retained `Hyperspeedcube` runtime anchor. The current continuation also resolves the active higher-dimensional activation profile from live training run state through both puzzle-id and imported generated-mode `RuntimeModeId` paths, then mirrors that resolved profile through the training runtime library plus the training panel/session caches; the primary `localhost:22022` Windows lane passed all `5` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests on `2026-06-13`. |
|
||||
| Broad non-Euclidean interaction shell and host ownership | Deep-source grounded retained | `MagicTile` retained remainder | Broad interaction-shell, WinForms/OpenTK host ownership, and generic runtime replacement remain deferred after the landed `Phase 6R-T` slice. |
|
||||
|
||||
### 7. Speech input and voice sidecars
|
||||
|
|
|
|||
|
|
@ -98,6 +98,15 @@ Current consolidated milestone snapshot:
|
|||
`Magic120Cell` and `MagicCube5D` puzzle definitions above the retained donor
|
||||
bundles and the retained `Hyperspeedcube` runtime anchor; the remaining gap
|
||||
is the actual interactive runtime, not the posture decision
|
||||
- `2026-06-13`: the next `Phase 6C` continuation widened that activation lane
|
||||
into active runtime surfaces by resolving higher-dimensional activation
|
||||
through both canonical puzzle ids and imported generated-mode
|
||||
`RuntimeModeId` fallback, then mirroring the resolved profile through the
|
||||
training runtime library and the live training panel/session caches; the
|
||||
primary `localhost:22022` Windows lane rebuilt the slice with `Result:
|
||||
Succeeded` and passed all `5`
|
||||
`HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including
|
||||
`RunStateActivationResolution`
|
||||
|
||||
- the canonical HyperTwist repo-row portfolio is now treated as `75` rows, not `71`
|
||||
- currently implemented rows are now `35`, not `20`
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue