From 7cfbbf5cb307872bc76868bf522853761dc303b5 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Fri, 1 May 2026 23:47:36 +0200 Subject: [PATCH] Add generated-mode launch request surface --- .../HyperTwistTrainingRuntimeLibrary.cpp | 27 ++++++++++++++++ .../HyperTwistTrainingSubsystem.cpp | 31 +++++++++++++++++++ .../HyperTwistTrainingRuntimeLibrary.h | 12 +++++++ .../HyperTwistTrainingSubsystem.h | 13 ++++++++ .../HyperTwistTrainingTypes.h | 26 ++++++++++++++++ 5 files changed, 109 insertions(+) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp index 9599bc8..2ef9eb4 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp @@ -130,6 +130,33 @@ bool UHyperTwistTrainingRuntimeLibrary::TryGetActiveImportedGeneratedModeLaunchC return false; } +bool UHyperTwistTrainingRuntimeLibrary::TryGetActiveImportedGeneratedModeLaunchRequest( + UObject* WorldContextObject, + FHyperTwistTrainingImportedGeneratedModeLaunchRequest& OutLaunchRequest +) +{ + if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject)) + { + return TrainingSubsystem->TryGetActiveImportedGeneratedModeLaunchRequest(OutLaunchRequest); + } + + OutLaunchRequest = FHyperTwistTrainingImportedGeneratedModeLaunchRequest(); + return false; +} + +FHyperTwistTrainingImportedGeneratedModeLaunchRequest UHyperTwistTrainingRuntimeLibrary::CreateActiveImportedGeneratedModeLaunchRequest( + UObject* WorldContextObject, + const FString& RequestSource +) +{ + if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject)) + { + return TrainingSubsystem->CreateActiveImportedGeneratedModeLaunchRequest(RequestSource); + } + + return FHyperTwistTrainingImportedGeneratedModeLaunchRequest(); +} + FHyperTwistTrainingRunState UHyperTwistTrainingRuntimeLibrary::ApplyActiveImportedRuntimeSelectorOption( UObject* WorldContextObject, const FString& SelectorId, diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp index 83326ca..773aaf4 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp @@ -771,6 +771,35 @@ bool UHyperTwistTrainingSubsystem::TryGetActiveImportedGeneratedModeLaunchConfig ); } +bool UHyperTwistTrainingSubsystem::TryGetActiveImportedGeneratedModeLaunchRequest( + FHyperTwistTrainingImportedGeneratedModeLaunchRequest& OutLaunchRequest +) const +{ + OutLaunchRequest = ActiveImportedGeneratedModeLaunchRequest; + return OutLaunchRequest.IsStructurallyValid(); +} + +FHyperTwistTrainingImportedGeneratedModeLaunchRequest UHyperTwistTrainingSubsystem::CreateActiveImportedGeneratedModeLaunchRequest( + const FString& RequestSource +) +{ + FHyperTwistTrainingImportedGeneratedModeLaunchConfig LaunchConfig; + if (!TryGetActiveImportedGeneratedModeLaunchConfig(LaunchConfig)) + { + ActiveImportedGeneratedModeLaunchRequest = FHyperTwistTrainingImportedGeneratedModeLaunchRequest(); + return ActiveImportedGeneratedModeLaunchRequest; + } + + ActiveImportedGeneratedModeLaunchRequest = FHyperTwistTrainingImportedGeneratedModeLaunchRequest(); + ActiveImportedGeneratedModeLaunchRequest.RequestId = + FString::Printf(TEXT("generated_launch_%s"), *FGuid::NewGuid().ToString(EGuidFormats::Digits)); + ActiveImportedGeneratedModeLaunchRequest.RequestedAtUtc = FDateTime::UtcNow().ToIso8601(); + ActiveImportedGeneratedModeLaunchRequest.RequestSource = + RequestSource.IsEmpty() ? TEXT("runtime-imported-generated-mode") : RequestSource; + ActiveImportedGeneratedModeLaunchRequest.LaunchConfig = LaunchConfig; + return ActiveImportedGeneratedModeLaunchRequest; +} + FHyperTwistTrainingRunState UHyperTwistTrainingSubsystem::ApplyActiveImportedRuntimeSelectorOption( const FString& SelectorId, const FString& OptionId @@ -2792,6 +2821,7 @@ FHyperTwistTrainingRunState UHyperTwistTrainingSubsystem::StartTrainingRunFromDe ActiveReviewFlowStatus = FHyperTwistTrainingReviewFlowStatus(); ActiveCoachActionPlan = FHyperTwistTrainingCoachActionPlan(); ActiveCoachFollowUpBrief = FHyperTwistCoachBrief(); + ActiveImportedGeneratedModeLaunchRequest = FHyperTwistTrainingImportedGeneratedModeLaunchRequest(); ActiveRunState = UHyperTwistTrainingLibrary::StartTrainingRun(Deck, UserId, SessionId, Mode); bHasActiveRun = ActiveRunState.IsStructurallyValid(); RefreshSummary(); @@ -3107,6 +3137,7 @@ void UHyperTwistTrainingSubsystem::ClearActiveRun() { ActiveRunState = FHyperTwistTrainingRunState(); ActiveRunSummary = FHyperTwistTrainingSessionSummary(); + ActiveImportedGeneratedModeLaunchRequest = FHyperTwistTrainingImportedGeneratedModeLaunchRequest(); ActiveReviewPlanState = FHyperTwistTrainingReviewPlanState(); ActiveCoachActionPlan = FHyperTwistTrainingCoachActionPlan(); bHasActiveRun = false; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h index e1a947d..d9b53cd 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h @@ -60,6 +60,18 @@ public: FHyperTwistTrainingImportedGeneratedModeLaunchConfig& OutLaunchConfig ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training", meta = (WorldContext = "WorldContextObject")) + static bool TryGetActiveImportedGeneratedModeLaunchRequest( + UObject* WorldContextObject, + FHyperTwistTrainingImportedGeneratedModeLaunchRequest& OutLaunchRequest + ); + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training", meta = (WorldContext = "WorldContextObject")) + static FHyperTwistTrainingImportedGeneratedModeLaunchRequest CreateActiveImportedGeneratedModeLaunchRequest( + UObject* WorldContextObject, + const FString& RequestSource + ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training", meta = (WorldContext = "WorldContextObject")) static FHyperTwistTrainingRunState ApplyActiveImportedRuntimeSelectorOption( UObject* WorldContextObject, diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSubsystem.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSubsystem.h index 9417e80..7951236 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSubsystem.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSubsystem.h @@ -48,6 +48,16 @@ public: FHyperTwistTrainingImportedGeneratedModeLaunchConfig& OutLaunchConfig ) const; + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training") + bool TryGetActiveImportedGeneratedModeLaunchRequest( + FHyperTwistTrainingImportedGeneratedModeLaunchRequest& OutLaunchRequest + ) const; + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training") + FHyperTwistTrainingImportedGeneratedModeLaunchRequest CreateActiveImportedGeneratedModeLaunchRequest( + const FString& RequestSource + ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training") FHyperTwistTrainingRunState ApplyActiveImportedRuntimeSelectorOption( const FString& SelectorId, @@ -522,6 +532,9 @@ private: UPROPERTY() FHyperTwistTrainingSessionSummary ActiveRunSummary; + UPROPERTY() + FHyperTwistTrainingImportedGeneratedModeLaunchRequest ActiveImportedGeneratedModeLaunchRequest; + UPROPERTY() FHyperTwistTrainingMethodDrillRunState ActiveMethodDrillRunState; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 32497de..df03018 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -544,6 +544,32 @@ struct FHyperTwistTrainingImportedGeneratedModeLaunchConfig } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingImportedGeneratedModeLaunchRequest +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RequestId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RequestedAtUtc; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RequestSource; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FHyperTwistTrainingImportedGeneratedModeLaunchConfig LaunchConfig; + + bool IsStructurallyValid() const + { + return !RequestId.IsEmpty() + && !RequestedAtUtc.IsEmpty() + && !RequestSource.IsEmpty() + && LaunchConfig.IsStructurallyValid(); + } +}; + USTRUCT(BlueprintType) struct FHyperTwistTrainingDeck {