From aa6dad4e05bf10750d1c81be8f091034f36f135e Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Sat, 7 Jun 2025 20:35:35 +0200 Subject: [PATCH] minigames hints & cheat menu --- Audio/Sounds/Signal_C.mp3 | Bin 0 -> 33923 bytes .../Blueprints/Characters/BP_Player.uasset | 4 +- .../AgeOfWar/BP_Minigame_AgeOfWar.uasset | 4 +- .../AgeOfWar/UI_Minigame_AgeOfWar.uasset | 4 +- .../BP_Minigame_CrossyRoadManager.uasset | 4 +- .../BP_Minigame_RythmClickManager.uasset | 4 +- .../UI_Minigame_RythmClickCanvas.uasset | 4 +- .../BP_Minigame_SubwaySurfManager.uasset | 4 +- .../Actors/Minigame/BP_Test_AgeOfWar.uasset | 4 +- .../Actors/Minigame/BP_Test_CrossyRoad.uasset | 4 +- .../Actors/Minigame/BP_Test_Fishing.uasset | 4 +- .../Test/Actors/Minigame/BP_Test_Rythm.uasset | 4 +- .../Actors/Minigame/BP_Test_SubwaySurf.uasset | 4 +- .../Lost_Edge/Content/Levels/Test/L_Test.umap | 4 +- .../Content/UI/BP_MainWidgetManager.uasset | 4 +- .../Interactables/UI_InteractableHint.uasset | 4 +- .../Overlays/UI_ControlsHint.uasset | 3 ++ .../Overlays/UI_DevelopBuildWarning.uasset | 4 +- .../Content/UI/Blueprints/UI_CheatMenu.uasset | 3 ++ .../Minigame/AgeOfWar/AgeOfWarManager.cpp | 24 ++++----- .../Minigame/AgeOfWar/AgeOfWarManager.h | 8 +-- .../Minigame/CrossyRoad/CrossyRoadManager.cpp | 11 +---- .../Minigame/CrossyRoad/CrossyRoadManager.h | 6 +-- .../Minigame/Fishing/FishingManager.cpp | 11 +---- .../Private/Minigame/Fishing/FishingManager.h | 6 +-- .../Lost_Edge/Private/Minigame/Minigame.cpp | 41 +++++++++++++--- .../Lost_Edge/Private/Minigame/Minigame.h | 34 +++++++++---- .../Minigame/RythmClick/RythmClickManager.cpp | 11 +---- .../Minigame/RythmClick/RythmClickManager.h | 5 +- .../Minigame/SubwaySurf/SubwaySurfManager.cpp | 11 +---- .../Minigame/SubwaySurf/SubwaySurfManager.h | 6 +-- .../Private/Widgets/WidgetsManager.cpp | 46 +++++++++++++++++- .../Private/Widgets/WidgetsManager.h | 18 ++++++- 33 files changed, 191 insertions(+), 117 deletions(-) create mode 100644 Audio/Sounds/Signal_C.mp3 create mode 100644 UnrealProject/Lost_Edge/Content/UI/Blueprints/Overlays/UI_ControlsHint.uasset create mode 100644 UnrealProject/Lost_Edge/Content/UI/Blueprints/UI_CheatMenu.uasset diff --git a/Audio/Sounds/Signal_C.mp3 b/Audio/Sounds/Signal_C.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..38198edce79bf906db565303a77690d8c67c4026 GIT binary patch literal 33923 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 AAgeOfWarManager::unitStats = {}; const FAgeOfWarUnitStats& AAgeOfWarManager::UnitGetStats(TSubclassOf unitClass) { - check(unitStats.Contains(*unitClass)); - //if(!unitStats.Contains(*unitClass)) - //{ - // static FAgeOfWarUnitStats empty; - // return empty; - //} + //check(unitStats.Contains(*unitClass)); + if(!unitStats.Contains(*unitClass)) + { + static FAgeOfWarUnitStats empty; + return empty; + } return unitStats[unitClass]; } @@ -31,16 +31,12 @@ AAgeOfWarManager::AAgeOfWarManager() camera->SetupAttachment(root); } -void AAgeOfWarManager::Start(APlayerBase* playerPawn, FMinigameEndCallback delegate) +void AAgeOfWarManager::OnStart_Internal() { - if(!playerPawn) - return; - - AMinigame::Start(playerPawn, delegate); - player->LockPlayer(FPlayerLock::All()); player->SwitchToView(this); + InitUI(); FillUnitStats(); TArray units; GetComponents(units); @@ -54,7 +50,7 @@ void AAgeOfWarManager::Start(APlayerBase* playerPawn, FMinigameEndCallback deleg } } -void AAgeOfWarManager::End() +void AAgeOfWarManager::OnEnd_Internal() { for(auto& unit : spawnedUnits) unit->Destroy(); @@ -64,8 +60,6 @@ void AAgeOfWarManager::End() player->ReturnPlayerView(); player->UnlockPlayer(FPlayerLock::All()); - - AMinigame::End(); } void AAgeOfWarManager::UnitKill(AAgeOfWarUnit* unit) diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/AgeOfWar/AgeOfWarManager.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/AgeOfWar/AgeOfWarManager.h index dbcdcb9..a9415fe 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/AgeOfWar/AgeOfWarManager.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/AgeOfWar/AgeOfWarManager.h @@ -16,14 +16,16 @@ public: AAgeOfWarManager(); - virtual void Start(class APlayerBase* playerPawn, FMinigameEndCallback delegate) override; - virtual void End() override; - void UnitKill(class AAgeOfWarUnit* unit); UFUNCTION(BlueprintImplementableEvent) void OnUnitKill(class AAgeOfWarUnit* unit); protected: + virtual void OnStart_Internal() override; + virtual void OnEnd_Internal() override; + + UFUNCTION(BlueprintImplementableEvent) + void InitUI(); UFUNCTION(BlueprintImplementableEvent) void FillUnitStats(); UFUNCTION(BlueprintCallable) diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/CrossyRoad/CrossyRoadManager.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/CrossyRoad/CrossyRoadManager.cpp index f24b032..fd50b2b 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/CrossyRoad/CrossyRoadManager.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/CrossyRoad/CrossyRoadManager.cpp @@ -32,13 +32,8 @@ ACrossyRoadManager::ACrossyRoadManager() mannequin->SetupAttachment(root); } -void ACrossyRoadManager::Start(APlayerBase* playerPawn, FMinigameEndCallback delegate) +void ACrossyRoadManager::OnStart_Internal() { - if(!playerPawn) - return; - - AMinigame::Start(playerPawn, delegate); - player->LockPlayer(FPlayerLock::All()); player->SwitchToView(this); @@ -65,7 +60,7 @@ void ACrossyRoadManager::Start(APlayerBase* playerPawn, FMinigameEndCallback del PrimaryActorTick.SetTickFunctionEnable(true); } -void ACrossyRoadManager::End() +void ACrossyRoadManager::OnEnd_Internal() { PrimaryActorTick.SetTickFunctionEnable(false); @@ -74,8 +69,6 @@ void ACrossyRoadManager::End() player->UnlockPlayer(FPlayerLock::All()); player->ReturnPlayerView(); - - AMinigame::End(); } void ACrossyRoadManager::Hit() diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/CrossyRoad/CrossyRoadManager.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/CrossyRoad/CrossyRoadManager.h index 8865efc..b9e188b 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/CrossyRoad/CrossyRoadManager.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/CrossyRoad/CrossyRoadManager.h @@ -14,9 +14,6 @@ class ACrossyRoadManager : public AMinigame public: ACrossyRoadManager(); - virtual void Start(class APlayerBase* playerPawn, FMinigameEndCallback delegate) override; - virtual void End() override; - void Hit(); void Finish(); @@ -29,6 +26,9 @@ protected: float speed; }; + virtual void OnStart_Internal() override; + virtual void OnEnd_Internal() override; + virtual void PostInitializeComponents() override; virtual void Tick(float deltaTime) override; diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Fishing/FishingManager.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Fishing/FishingManager.cpp index f30d2b4..1ddd71e 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Fishing/FishingManager.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Fishing/FishingManager.cpp @@ -15,13 +15,8 @@ AFishingManager::AFishingManager() context = asset.Object; } -void AFishingManager::Start(APlayerBase* playerPawn, FMinigameEndCallback delegate) +void AFishingManager::OnStart_Internal() { - if(!playerPawn) - return; - - AMinigame::Start(playerPawn, delegate); - player->LockPlayer(FPlayerLock::All()); auto input = ACustomPlayerController::GetInput(); @@ -30,13 +25,11 @@ void AFishingManager::Start(APlayerBase* playerPawn, FMinigameEndCallback delega handler2 = input->BindAction(mapping.Action, ETriggerEvent::Completed, this, &AFishingManager::OnInputUnhold).GetHandle(); } -void AFishingManager::End() +void AFishingManager::OnEnd_Internal() { auto input = ACustomPlayerController::GetInput(); input->RemoveBindingByHandle(handler1); input->RemoveBindingByHandle(handler2); player->UnlockPlayer(FPlayerLock::All()); - - AMinigame::End(); } diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Fishing/FishingManager.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Fishing/FishingManager.h index 59736f1..9ab6b89 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Fishing/FishingManager.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Fishing/FishingManager.h @@ -35,9 +35,6 @@ class AFishingManager : public AMinigame public: AFishingManager(); - virtual void Start(class APlayerBase* playerPawn, FMinigameEndCallback delegate) override; - virtual void End() override; - UFUNCTION(BlueprintImplementableEvent, BlueprintCallable) void CatchSucceed(int32 price); @@ -45,6 +42,9 @@ public: void CatchFailed(); protected: + virtual void OnStart_Internal() override; + virtual void OnEnd_Internal() override; + UFUNCTION(BlueprintImplementableEvent) void OnInputHold(); UFUNCTION(BlueprintImplementableEvent) diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Minigame.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Minigame.cpp index 04186f4..fe4b8b6 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Minigame.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Minigame.cpp @@ -7,27 +7,52 @@ #include "CustomPlayerController.h" #include "PlayerBase.h" +AMinigame* AMinigame::instance = nullptr; + +AMinigame* AMinigame::GetActiveInstance() +{ + return instance; +} + AMinigame::AMinigame() { PrimaryActorTick.bStartWithTickEnabled = false; PrimaryActorTick.bCanEverTick = true; } -void AMinigame::End() -{ - if(callback.IsBound()) - callback.Execute(result, score); - - OnEnd(); -} - void AMinigame::Start(APlayerBase* playerPawn, FMinigameEndCallback delegate) { + if(instance) + return; + instance = this; + player = playerPawn; callback = delegate; if(context.IsValid()) ACustomPlayerController::AppendInputContext(context); + OnStart_Internal(); OnStart(); } + +void AMinigame::End() +{ + if(instance != this) + return; + + ended = true; + if(callback.IsBound()) + callback.Execute(result, score); + + OnEnd_Internal(); + OnEnd(); + + instance = nullptr; +} + +void AMinigame::Restart() +{ + OnRestart_Internal(); + OnRestart(); +} diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Minigame.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Minigame.h index f1f7fdc..6244a0f 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Minigame.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/Minigame.h @@ -18,9 +18,10 @@ DECLARE_DYNAMIC_DELEGATE_TwoParams(FMinigameEndCallback, EMinigameResult, result /** * Interface for all minigame classes. * Any minigame is started/ended/restarted by executing Start()/End()/Restart() on specific instance. + * Only one minigame can be active in the same time to avoid control collisions. * Each call is after broadcasted into a blueprint event also. * On start the caller can pass a OnEndCallback delegate to receive result and score on a minigame end. - * Each minigame can have its own contextInput + * Each minigame can have its own contextInput. */ UCLASS(Abstract, Blueprintable, BlueprintType, MinimalAPI) class AMinigame : public AActor @@ -28,27 +29,36 @@ class AMinigame : public AActor GENERATED_BODY() public: + UFUNCTION(BlueprintPure, meta = (DisplayName = "GetActiveMinigame"), Category = "Minigame") + static AMinigame* GetActiveInstance(); + AMinigame(); UFUNCTION(BlueprintCallable) - virtual void Start(class APlayerBase* playerPawn, FMinigameEndCallback delegate); - UFUNCTION(BlueprintImplementableEvent) - void OnStart(); + void Start(class APlayerBase* playerPawn, FMinigameEndCallback delegate); UFUNCTION(BlueprintCallable) - virtual void End(); - UFUNCTION(BlueprintImplementableEvent) - void OnEnd(); + void End(); UFUNCTION(BlueprintCallable) - virtual void Restart() {} - UFUNCTION(BlueprintImplementableEvent) - void OnRestart(); + void Restart(); UFUNCTION(BlueprintPure) TSoftObjectPtr GetInputMappings() { return context; } protected: + virtual void OnStart_Internal() {} + UFUNCTION(BlueprintImplementableEvent) + void OnStart(); + + virtual void OnEnd_Internal() {} + UFUNCTION(BlueprintImplementableEvent) + void OnEnd(); + + virtual void OnRestart_Internal() {} + UFUNCTION(BlueprintImplementableEvent) + void OnRestart(); + FMinigameEndCallback callback; class APlayerBase* player; @@ -63,5 +73,9 @@ protected: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) TSoftObjectPtr context = nullptr; + +private: + static AMinigame* instance; // active minigame + }; diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/RythmClick/RythmClickManager.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/RythmClick/RythmClickManager.cpp index c664b22..5eb8994 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/RythmClick/RythmClickManager.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/RythmClick/RythmClickManager.cpp @@ -8,19 +8,12 @@ ARythmClickManager::ARythmClickManager() {} -void ARythmClickManager::Start(APlayerBase* playerPawn, FMinigameEndCallback delegate) +void ARythmClickManager::OnStart_Internal() { - if(!playerPawn) - return; - - AMinigame::Start(playerPawn, delegate); - player->LockPlayer(FPlayerLock::All()); } -void ARythmClickManager::End() +void ARythmClickManager::OnEnd_Internal() { player->UnlockPlayer(FPlayerLock::All()); - - AMinigame::End(); } diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/RythmClick/RythmClickManager.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/RythmClick/RythmClickManager.h index 23fc800..9e4c6a6 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/RythmClick/RythmClickManager.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/RythmClick/RythmClickManager.h @@ -14,6 +14,7 @@ class ARythmClickManager : public AMinigame public: ARythmClickManager(); - virtual void Start(class APlayerBase* playerPawn, FMinigameEndCallback delegate) override; - virtual void End() override; +protected: + virtual void OnStart_Internal() override; + virtual void OnEnd_Internal() override; }; diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/SubwaySurf/SubwaySurfManager.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/SubwaySurf/SubwaySurfManager.cpp index 3cf92af..e6eff62 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/SubwaySurf/SubwaySurfManager.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/SubwaySurf/SubwaySurfManager.cpp @@ -32,13 +32,8 @@ ASubwaySurfManager::ASubwaySurfManager() mannequin->SetupAttachment(root); } -void ASubwaySurfManager::Start(APlayerBase* playerPawn, FMinigameEndCallback delegate) +void ASubwaySurfManager::OnStart_Internal() { - if(!playerPawn) - return; - - AMinigame::Start(playerPawn, delegate); - player->LockPlayer(FPlayerLock::All()); player->SwitchToView(this); @@ -61,7 +56,7 @@ void ASubwaySurfManager::Start(APlayerBase* playerPawn, FMinigameEndCallback del PrimaryActorTick.SetTickFunctionEnable(true); } -void ASubwaySurfManager::End() +void ASubwaySurfManager::OnEnd_Internal() { PrimaryActorTick.SetTickFunctionEnable(false); @@ -70,8 +65,6 @@ void ASubwaySurfManager::End() player->UnlockPlayer(FPlayerLock::All()); player->ReturnPlayerView(); - - AMinigame::End(); } void ASubwaySurfManager::Hit() diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/SubwaySurf/SubwaySurfManager.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/SubwaySurf/SubwaySurfManager.h index 654d9e4..dd56392 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/SubwaySurf/SubwaySurfManager.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Minigame/SubwaySurf/SubwaySurfManager.h @@ -21,13 +21,13 @@ class ASubwaySurfManager : public AMinigame public: ASubwaySurfManager(); - virtual void Start(class APlayerBase* playerPawn, FMinigameEndCallback delegate) override; - virtual void End() override; - void Hit(); void Finish(); protected: + virtual void OnStart_Internal() override; + virtual void OnEnd_Internal() override; + virtual void PostInitializeComponents() override; virtual void Tick(float deltaTime) override; diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Widgets/WidgetsManager.cpp b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Widgets/WidgetsManager.cpp index fdb5c53..2931865 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Widgets/WidgetsManager.cpp +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Widgets/WidgetsManager.cpp @@ -151,10 +151,25 @@ void UWidgetsManager::UpdateWidgetsOwner() +void UWidgetsManager::AddOverlayWidget(UUserWidget* widget) +{ + overlayWidgetsInstances.Add(widget); + widget->AddToViewport(); +} + +void UWidgetsManager::RemoveOverlayWidget(UUserWidget* widget) +{ + overlayWidgetsInstances.Remove(widget); + widget->RemoveFromViewport(); +} + + + void UWidgetsManager::ShowMainMenu(bool pause) { mainMenuWidget->Show(pause); - journalWidget->Hide(); + HideJournal(); + HideCheatMenu(); } void UWidgetsManager::HideMainMenu() @@ -164,6 +179,35 @@ void UWidgetsManager::HideMainMenu() +void UWidgetsManager::SwitchCheatMenu() +{ + if(cheatMenuWidget) + HideCheatMenu(); + else + ShowCheatMenu(); +} + +void UWidgetsManager::ShowCheatMenu() +{ + if(cheatMenuWidget || mainMenuWidget->Visibility == ESlateVisibility::Visible) + return; + + if(auto PC = UGameplayStatics::GetPlayerController(GetWorld(), 0)) + cheatMenuWidget = CreateWidget(PC, cheatMenuWidgetClass); + cheatMenuWidget->AddToViewport(100); +} + +void UWidgetsManager::HideCheatMenu() +{ + if(!cheatMenuWidget) + return; + + cheatMenuWidget->RemoveFromParent(); + cheatMenuWidget = nullptr; +} + + + void UWidgetsManager::ShowFpsCount() { if(fpsCountWidget) diff --git a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Widgets/WidgetsManager.h b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Widgets/WidgetsManager.h index 0ddeafa..2403073 100644 --- a/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Widgets/WidgetsManager.h +++ b/UnrealProject/Lost_Edge/Source/Lost_Edge/Private/Widgets/WidgetsManager.h @@ -27,9 +27,21 @@ public: void HideWidgets(); void UpdateWidgetsOwner(); + UFUNCTION(BlueprintCallable, Category = WidgetsManager) + void AddOverlayWidget(class UUserWidget* widget); + UFUNCTION(BlueprintCallable, Category = WidgetsManager) + void RemoveOverlayWidget(class UUserWidget* widget); + void ShowMainMenu(bool pause = true); void HideMainMenu(); + UFUNCTION(BlueprintCallable, Category = WidgetsManager) + void SwitchCheatMenu(); + UFUNCTION(BlueprintCallable, Category = WidgetsManager) + void ShowCheatMenu(); + UFUNCTION(BlueprintCallable, Category = WidgetsManager) + void HideCheatMenu(); + void ShowFpsCount(); void HideFpsCount(); @@ -69,12 +81,16 @@ protected: UPROPERTY(EditDefaultsOnly) TSet> overlayWidgets; // hidden in pause, cutscene - TArray overlayWidgetsInstances; + TSet overlayWidgetsInstances; UPROPERTY(EditDefaultsOnly) TSubclassOf mainMenuWidgetClass; class UMainMenuWidget* mainMenuWidget = nullptr; + UPROPERTY(EditDefaultsOnly) + TSubclassOf cheatMenuWidgetClass; + class UUserWidget* cheatMenuWidget = nullptr; + UPROPERTY(EditDefaultsOnly) TSubclassOf fpsCountWidgetClass; class UUserWidget* fpsCountWidget = nullptr;