diff --git a/Content/G2I_Game/Core/BP_GameInstance.uasset b/Content/G2I_Game/Core/BP_GameInstance.uasset index 8a8c4de4..9abb757b 100644 Binary files a/Content/G2I_Game/Core/BP_GameInstance.uasset and b/Content/G2I_Game/Core/BP_GameInstance.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame1.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame1.uasset new file mode 100644 index 00000000..d2609141 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame1.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame2.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame2.uasset new file mode 100644 index 00000000..fecc0346 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame2.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame3.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame3.uasset new file mode 100644 index 00000000..0517366a Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame3.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame4.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame4.uasset new file mode 100644 index 00000000..f19eeda4 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet1_Frame4.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame1.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame1.uasset new file mode 100644 index 00000000..925b4d25 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame1.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame2.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame2.uasset new file mode 100644 index 00000000..ed55405a Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame2.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame3.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame3.uasset new file mode 100644 index 00000000..323cbac6 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet2_Frame3.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame1.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame1.uasset new file mode 100644 index 00000000..6f452d62 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame1.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame2.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame2.uasset new file mode 100644 index 00000000..4dbd31e1 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame2.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame3.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame3.uasset new file mode 100644 index 00000000..d3068852 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/Frames/T_CutSceneBoilerRoom_Sheet3_Frame3.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoom.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoom.uasset new file mode 100644 index 00000000..158386e6 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoom.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet1.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet1.uasset new file mode 100644 index 00000000..29b2f6e9 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet1.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet2.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet2.uasset new file mode 100644 index 00000000..67b1bc4b Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet2.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet3.uasset b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet3.uasset new file mode 100644 index 00000000..fb3297b8 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/CutSceneBoilerRoom/WB_CutSceneBoilerRoomSheet3.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/Textures/T_CutSceneBackground.uasset b/Content/G2I_Game/UI/CutScenes/Textures/T_CutSceneBackground.uasset new file mode 100644 index 00000000..27b1fe47 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/Textures/T_CutSceneBackground.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/Textures/T_MouseIcon.uasset b/Content/G2I_Game/UI/CutScenes/Textures/T_MouseIcon.uasset new file mode 100644 index 00000000..9c517b91 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/Textures/T_MouseIcon.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/Textures/T_ProgressBar.uasset b/Content/G2I_Game/UI/CutScenes/Textures/T_ProgressBar.uasset new file mode 100644 index 00000000..635bb770 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/Textures/T_ProgressBar.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/Textures/T_ProgressBarBackground.uasset b/Content/G2I_Game/UI/CutScenes/Textures/T_ProgressBarBackground.uasset new file mode 100644 index 00000000..99fa4244 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/Textures/T_ProgressBarBackground.uasset differ diff --git a/Content/G2I_Game/UI/CutScenes/Textures/T_SpaceIcon.uasset b/Content/G2I_Game/UI/CutScenes/Textures/T_SpaceIcon.uasset new file mode 100644 index 00000000..03e3b5d6 Binary files /dev/null and b/Content/G2I_Game/UI/CutScenes/Textures/T_SpaceIcon.uasset differ diff --git a/Content/G2I_Game/UI/DA_CutScenesParameters.uasset b/Content/G2I_Game/UI/DA_CutScenesParameters.uasset new file mode 100644 index 00000000..c7a6f586 Binary files /dev/null and b/Content/G2I_Game/UI/DA_CutScenesParameters.uasset differ diff --git a/Content/G2I_Game/UI/DA_StringTablesCatalog.uasset b/Content/G2I_Game/UI/DA_StringTablesCatalog.uasset index 4af05071..c78d71a0 100644 Binary files a/Content/G2I_Game/UI/DA_StringTablesCatalog.uasset and b/Content/G2I_Game/UI/DA_StringTablesCatalog.uasset differ diff --git a/Content/G2I_Game/UI/DA_WidgetsCatalog.uasset b/Content/G2I_Game/UI/DA_WidgetsCatalog.uasset index e003428f..a5fd85b0 100644 Binary files a/Content/G2I_Game/UI/DA_WidgetsCatalog.uasset and b/Content/G2I_Game/UI/DA_WidgetsCatalog.uasset differ diff --git a/Content/G2I_Game/UI/Elements/MI_CircleProgressBar.uasset b/Content/G2I_Game/UI/Elements/MI_CircleProgressBar.uasset new file mode 100644 index 00000000..05367d12 Binary files /dev/null and b/Content/G2I_Game/UI/Elements/MI_CircleProgressBar.uasset differ diff --git a/Content/G2I_Game/UI/Elements/M_CircleProgressBar.uasset b/Content/G2I_Game/UI/Elements/M_CircleProgressBar.uasset new file mode 100644 index 00000000..a7ccf6ce Binary files /dev/null and b/Content/G2I_Game/UI/Elements/M_CircleProgressBar.uasset differ diff --git a/Content/G2I_Game/UI/StringsRu/ST_CutScenes.uasset b/Content/G2I_Game/UI/StringsRu/ST_CutScenes.uasset new file mode 100644 index 00000000..c94410ee Binary files /dev/null and b/Content/G2I_Game/UI/StringsRu/ST_CutScenes.uasset differ diff --git a/Source/G2I/Private/Controls/G2IPlayerController.cpp b/Source/G2I/Private/Controls/G2IPlayerController.cpp index aa025625..8438ae99 100644 --- a/Source/G2I/Private/Controls/G2IPlayerController.cpp +++ b/Source/G2I/Private/Controls/G2IPlayerController.cpp @@ -462,6 +462,12 @@ void AG2IPlayerController::CallPause(const FInputActionValue& Value) SetPause(true); UIManager->OpenWidget(EG2IWidgetNames::Pause); + UIManager->SetupPauseWidget([this]() + { + SetInputMode(FInputModeGameOnly()); + bShowMouseCursor = false; + SetPause(false); + }); } void AG2IPlayerController::SetRotationTowardsCamera(const UCameraComponent& Camera) diff --git a/Source/G2I/Private/Game/G2IGameInstance.cpp b/Source/G2I/Private/Game/G2IGameInstance.cpp index 83727856..cf61f5d4 100644 --- a/Source/G2I/Private/Game/G2IGameInstance.cpp +++ b/Source/G2I/Private/Game/G2IGameInstance.cpp @@ -67,6 +67,11 @@ UG2IWidgetComponentParameters* UG2IGameInstance::GetWidgetComponentParameters() return WidgetComponentsParameters; } +UG2ICutScenesParameters* UG2IGameInstance::GetCutScenesParameters() +{ + return CutScenesParameters; +} + FString UG2IGameInstance::GetMainMenuLevelName() const { return MainMenuLevelName; @@ -98,6 +103,11 @@ EG2ILevelName UG2IGameInstance::GetLevelEnum(const FString& LevelName) const return EG2ILevelName::None; } +EG2ILevelName UG2IGameInstance::GetCurrentLevelEnum() const +{ + return CurrentLevelEnum; +} + bool UG2IGameInstance::IsMainMenuLevel() const { return MainMenuLevelName == CurrentLevelName; diff --git a/Source/G2I/Private/UI/G2IUIManager.cpp b/Source/G2I/Private/UI/G2IUIManager.cpp index 7b91c3bc..b54716e8 100644 --- a/Source/G2I/Private/UI/G2IUIManager.cpp +++ b/Source/G2I/Private/UI/G2IUIManager.cpp @@ -4,6 +4,7 @@ #include "G2ICharacterDaughter.h" #include "G2ICharacterEngineer.h" #include "G2IConfirmationWidget.h" +#include "G2ICutScenesParameters.h" #include "G2IGameInstance.h" #include "G2ILevelLoadingScreen.h" #include "G2IPlayerController.h" @@ -20,6 +21,7 @@ #include "Gameplay/G2IKeyHintWidget.h" #include "HUD/G2IAimingWidget.h" #include "Menu/G2ICreatorsWidget.h" +#include "Menu/G2IPauseWidget.h" #include "Menu/Elements/NumericalRow/G2INumericalMultiValuePropertyRow.h" #include "Menu/Elements/G2IControlListItem.h" #include "Menu/Elements/G2IControlRow.h" @@ -74,7 +76,14 @@ void UG2IUIManager::InitializeDefaultsInStartGame() if (!ensure(WidgetComponentParameters)) { UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), - *UG2IWidgetComponentParameters::StaticClass()->GetName(), *GetName()); + *GetName(), *UG2IWidgetComponentParameters::StaticClass()->GetName()); + } + + CutScenesParameters = GameInstance->GetCutScenesParameters(); + if (!ensure(CutScenesParameters)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), + *GetName(), *UG2ICutScenesParameters::StaticClass()->GetName()); } DisplayManager = NewObject(this); @@ -140,11 +149,83 @@ void UG2IUIManager::InitializeNewLevelUI() const if (GameInstance->IsMainMenuLevel()) { OpenWidget(EG2IWidgetNames::MainMenu); + return; + } + + if (!ensure(DisplayManager)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), *GetName(), + *UG2IUIDisplayManager::StaticClass()->GetName()); + OpenHUD(); + return; + } + + const EG2ILevelName LevelName = GameInstance->GetCurrentLevelEnum(); + +#if WITH_EDITOR + if (!ensure(CutScenesParameters)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), + *GetName(), *UG2ICutScenesParameters::StaticClass()->GetName()); + } + if (!CutScenesParameters->bIsDebugOn) + { + OpenHUD(); + return; + } +#endif + + if (LevelName == EG2ILevelName::BoilerRoom) + { + if (DisplayManager->GetWidget(EG2IWidgetNames::CutSceneStartBoilerRoom)) + { + OpenWidget(EG2IWidgetNames::CutSceneStartBoilerRoom); + return; + } + OpenHUD(); + return; + } + if (LevelName == EG2ILevelName::ChildrenRoom) + { + if (DisplayManager->GetWidget(EG2IWidgetNames::CutSceneStartChildrenRoom)) + { + OpenWidget(EG2IWidgetNames::CutSceneStartChildrenRoom); + return; + } + OpenHUD(); + return; } - else + if (LevelName == EG2ILevelName::Hall) { + if (DisplayManager->GetWidget(EG2IWidgetNames::CutSceneStartHall)) + { + OpenWidget(EG2IWidgetNames::CutSceneStartHall); + return; + } OpenHUD(); + return; + } + + // Other levels + OpenHUD(); +} + +void UG2IUIManager::CloseCutScene(const EG2IWidgetNames WidgetName) const +{ + CloseWidget(WidgetName); + if (WidgetName == EG2IWidgetNames::CutSceneEndGame) + { + if (!ensure(GameInstance)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), *GetName(), + *UG2IGameInstance::StaticClass()->GetName()); + return; + } + GameInstance->LoadMainMenuLevel(); + return; } + + OpenHUD(); } void UG2IUIManager::CloseLevelUI() @@ -660,6 +741,21 @@ void UG2IUIManager::SetActionControl(const FText& ActionName, const FText& KeyNa } } +void UG2IUIManager::SetupPauseWidget(const TFunction& NewContinueAction) const +{ + if (!ensure(DisplayManager)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), *GetName(), + *UG2IUIDisplayManager::StaticClass()->GetName()); + return; + } + if (UG2IPauseWidget *Widget = Cast( + DisplayManager->GetWidget(EG2IWidgetNames::Pause))) + { + Widget->OnContinue = NewContinueAction; + } +} + void UG2IUIManager::SetupControlsWidget(UWidgetSwitcher* CharacterControlsSwitcher) const { if (!ensure(CharacterControlsSwitcher)) diff --git a/Source/G2I/Private/UI/Widgets/CutScenes/G2ICutSceneSheetWidget.cpp b/Source/G2I/Private/UI/Widgets/CutScenes/G2ICutSceneSheetWidget.cpp new file mode 100644 index 00000000..7fb7c0a8 --- /dev/null +++ b/Source/G2I/Private/UI/Widgets/CutScenes/G2ICutSceneSheetWidget.cpp @@ -0,0 +1,20 @@ +#include "CutScenes/G2ICutSceneSheetWidget.h" +#include "Components/Image.h" + +bool UG2ICutSceneSheetWidget::ShowNextFrames() +{ + const int32 FrameSetsNum = FrameImages.Num(); + ++CurrentFrameIndex; + if (CurrentFrameIndex < FrameSetsNum && FrameImages.IsValidIndex(CurrentFrameIndex)) + { + for (UImage *Frame : FrameImages[CurrentFrameIndex].FramesOneClick) + { + if (Frame) + { + Frame->SetVisibility(ESlateVisibility::Visible); + } + } + return true; + } + return false; +} \ No newline at end of file diff --git a/Source/G2I/Private/UI/Widgets/CutScenes/G2ICutSceneWidget.cpp b/Source/G2I/Private/UI/Widgets/CutScenes/G2ICutSceneWidget.cpp new file mode 100644 index 00000000..250302df --- /dev/null +++ b/Source/G2I/Private/UI/Widgets/CutScenes/G2ICutSceneWidget.cpp @@ -0,0 +1,189 @@ +#include "CutScenes/G2ICutSceneWidget.h" +#include "G2I.h" +#include "G2ICutScenesParameters.h" +#include "G2IGameInstance.h" +#include "G2IUIManager.h" +#include "Components/Image.h" +#include "Components/RichTextBlock.h" +#include "Components/WidgetSwitcher.h" +#include "CutScenes/G2ICutSceneSheetWidget.h" + +void UG2ICutSceneWidget::NativePreConstruct() +{ + Super::NativePreConstruct(); + + if (SkipBarImage) + { + SkipBarMaterialInstance = SkipBarImage->GetDynamicMaterial(); + SetSkipPercent(0.f); + } +} + +void UG2ICutSceneWidget::InitializeAfterManagerLoading() +{ + Super::InitializeAfterManagerLoading(); + + if (!ensure(GameInstance)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), + *GetName(), *UG2IGameInstance::StaticClass()->GetName()); + return; + } + const UG2ICutScenesParameters *CutScenesParameters = GameInstance->GetCutScenesParameters(); + if (!ensure(CutScenesParameters)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s in %s"), + *GetName(), *UG2ICutScenesParameters::StaticClass()->GetName(), *GameInstance->GetName()); + return; + } + SkipSpeed = CutScenesParameters->SpeedSkip; +} + +void UG2ICutSceneWidget::NativeTick(const FGeometry& MyGeometry, float InDeltaTime) +{ + Super::NativeTick(MyGeometry, InDeltaTime); + + if (bIsSkipPressed) + { + const float CurrentPercent = GetSkipPercent(); + const float NewPercent = FMath::Clamp(CurrentPercent + SkipSpeed * InDeltaTime, 0.0f, 1.0f); + SetSkipPercent(NewPercent); + if (NewPercent == 1.f) + { + CloseWidget(); + } + } +} + +FReply UG2ICutSceneWidget::NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) +{ + if (!bIsEnabled) + { + return FReply::Unhandled(); + } + + FReply Reply = Super::NativeOnKeyDown(InGeometry, InKeyEvent); + + if (InKeyEvent.GetKey() == SkipKey) + { + bIsSkipPressed = true; + return Reply; + } +#if WITH_EDITOR + if (InKeyEvent.GetKey() == DebugPauseKey) +#else + if (InKeyEvent.GetKey() == PauseKey) +#endif + { + if (!ensure(UIManager)) + { + UE_LOG(LogG2I, Error, TEXT("%s isn't defined in %s"), + *UG2IUIManager::StaticClass()->GetName(), *GetName()); + return Reply; + } + UIManager->OpenWidget(EG2IWidgetNames::Pause); + bIsEnabled = false; + + UIManager->SetupPauseWidget([this]() + { + SetFocus(); + bIsEnabled = true; + }); + } + + return Reply; +} + +FReply UG2ICutSceneWidget::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) +{ + if (!bIsEnabled) + { + return FReply::Unhandled(); + } + + FReply Reply = Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent); + + if (InMouseEvent.IsMouseButtonDown(NextKey)) + { + if (!ensure(SheetsSwitcher)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find SheetsSwitcher"), *GetName()); + CloseWidget(); + return Reply; + } + + UG2ICutSceneSheetWidget *CurrentSheet = Cast(SheetsSwitcher->GetActiveWidget()); + if (CurrentSheet->ShowNextFrames()) + { + return Reply; + } + + const int32 ActiveIndex = SheetsSwitcher->GetActiveWidgetIndex(); + const int32 SheetsNum = SheetsSwitcher->GetNumWidgets(); + if (ActiveIndex < (SheetsNum - 1)) + { + SheetsSwitcher->SetActiveWidgetIndex(ActiveIndex + 1); + return Reply; + } + + CloseWidget(); + } + + return Reply; +} + +FReply UG2ICutSceneWidget::NativeOnKeyUp(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) +{ + FReply Reply = Super::NativeOnKeyUp(InGeometry, InKeyEvent); + + if (InKeyEvent.GetKey() == SkipKey) + { + bIsSkipPressed = false; + SetSkipPercent(0.f); + } + + return Reply; +} + +void UG2ICutSceneWidget::SetSkipPercent(const float Percent) const +{ + if (!ensure(SkipBarMaterialInstance)) + { + UE_LOG(LogG2I, Error, TEXT("%s: SkipBarImage doesn't have material for circle bar"), *GetName()); + return; + } + + float OutValue; + if (!ensure(SkipBarMaterialInstance->GetScalarParameterValue(FName("Percent"), OutValue))) + { + UE_LOG(LogG2I, Error, TEXT("%s: SkipBarImage's material for circle bar doesn't have Percent value"), + *GetName()); + return; + } + + SkipBarMaterialInstance->SetScalarParameterValue(FName("Percent"), Percent); +} + +float UG2ICutSceneWidget::GetSkipPercent() const +{ + float OutValue = 0.f; + if (!ensure(SkipBarMaterialInstance)) + { + UE_LOG(LogG2I, Error, TEXT("%s: SkipBarImage doesn't have material for circle bar"), *GetName()); + return OutValue; + } + + SkipBarMaterialInstance->GetScalarParameterValue(FName("Percent"), OutValue); + return OutValue; +} + +void UG2ICutSceneWidget::CloseWidget() const +{ + if (!ensure(UIManager)) + { + UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), *GetName(), + *UG2IUIManager::StaticClass()->GetName()); + return; + } + UIManager->CloseCutScene(CurrentWidgetName); +} diff --git a/Source/G2I/Private/UI/Widgets/Menu/G2IPauseWidget.cpp b/Source/G2I/Private/UI/Widgets/Menu/G2IPauseWidget.cpp index 57b55868..9177c7d7 100644 --- a/Source/G2I/Private/UI/Widgets/Menu/G2IPauseWidget.cpp +++ b/Source/G2I/Private/UI/Widgets/Menu/G2IPauseWidget.cpp @@ -49,18 +49,12 @@ void UG2IPauseWidget::OnContinueButtonClicked() *UG2IUIManager::StaticClass()->GetName()); return; } - if (!ensure(PlayerController)) + UIManager->CloseWidget(EG2IWidgetNames::Pause); + + if (OnContinue) { - UE_LOG(LogG2I, Error, TEXT("%s: Couldn't find %s"), *GetName(), - *AG2IPlayerController::StaticClass()->GetName()); - return; + OnContinue(); } - - UIManager->CloseUI(); - - PlayerController->SetInputMode(FInputModeGameOnly()); - PlayerController->bShowMouseCursor = false; - PlayerController->SetPause(false); } void UG2IPauseWidget::OnOptionsButtonClicked() diff --git a/Source/G2I/Public/DataDefinitions/Enums/G2IStringTablesTypes.h b/Source/G2I/Public/DataDefinitions/Enums/G2IStringTablesTypes.h index 8e728c42..ef5ee366 100644 --- a/Source/G2I/Public/DataDefinitions/Enums/G2IStringTablesTypes.h +++ b/Source/G2I/Public/DataDefinitions/Enums/G2IStringTablesTypes.h @@ -8,5 +8,6 @@ enum class EG2IStringTablesTypes : uint8 Options UMETA(DisplayName = "String table of options widget"), Creators UMETA(DisplayName = "String table of creators widget"), Controls UMETA(DisplayName = "String table of controls widget"), - TrainingScreen UMETA(DisplayName = "String table of debug HUD with mechanic description") + TrainingScreen UMETA(DisplayName = "String table of debug HUD with mechanic description"), + CutScenes UMETA(DisplayName = "String table of cut scenes") }; \ No newline at end of file diff --git a/Source/G2I/Public/DataDefinitions/Enums/G2IWidgetNames.h b/Source/G2I/Public/DataDefinitions/Enums/G2IWidgetNames.h index bbadc961..26f65447 100644 --- a/Source/G2I/Public/DataDefinitions/Enums/G2IWidgetNames.h +++ b/Source/G2I/Public/DataDefinitions/Enums/G2IWidgetNames.h @@ -20,5 +20,9 @@ enum class EG2IWidgetNames : uint8 EngineerControlsOptions UMETA(DisplayName = "Controls options of engineer widget"), DaughterControlsOptions UMETA(DisplayName = "Controls options of daughter widget"), ControlRow UMETA(DisplayName = "Row of control's option"), - LevelLoadingScreen UMETA(DisplayName = "Loading screen widget for levels loading") + LevelLoadingScreen UMETA(DisplayName = "Loading screen widget for levels loading"), + CutSceneStartBoilerRoom UMETA(DisplayName = "CutScene - in Boiler Room"), + CutSceneStartChildrenRoom UMETA(DisplayName = "CutScene - in Child Room"), + CutSceneStartHall UMETA(DisplayName = "CutScene - in Hall"), + CutSceneEndGame UMETA(DisplayName = "CutScene - End Game") }; \ No newline at end of file diff --git a/Source/G2I/Public/DataDefinitions/G2ICutScenesParameters.h b/Source/G2I/Public/DataDefinitions/G2ICutScenesParameters.h new file mode 100644 index 00000000..5c16b6c1 --- /dev/null +++ b/Source/G2I/Public/DataDefinitions/G2ICutScenesParameters.h @@ -0,0 +1,24 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataAsset.h" +#include "G2ICutScenesParameters.generated.h" + +/** + * Parameters for setup cutscenes + */ +UCLASS() +class G2I_API UG2ICutScenesParameters : public UDataAsset +{ + GENERATED_BODY() + +public: + + UPROPERTY(EditAnywhere, Category = Skip) + float SpeedSkip = 1.f; + +#if WITH_EDITORONLY_DATA + UPROPERTY(EditAnywhere, Category = Skip) + bool bIsDebugOn = true; +#endif +}; diff --git a/Source/G2I/Public/Game/G2IGameInstance.h b/Source/G2I/Public/Game/G2IGameInstance.h index 4270046f..7c52c502 100644 --- a/Source/G2I/Public/Game/G2IGameInstance.h +++ b/Source/G2I/Public/Game/G2IGameInstance.h @@ -4,6 +4,7 @@ #include "Engine/GameInstance.h" #include "G2IGameInstance.generated.h" +class UG2ICutScenesParameters; struct FStreamableHandle; class UG2IWidgetComponentParameters; class UG2IStringTablesCatalog; @@ -15,7 +16,8 @@ enum class EG2ILevelName : uint8 None, TestLevel, BoilerRoom, - ChildrenRoom + ChildrenRoom, + Hall }; DECLARE_MULTICAST_DELEGATE(FPlayerControllerInitDelegate); @@ -50,6 +52,9 @@ class G2I_API UG2IGameInstance : public UGameInstance UPROPERTY(EditAnywhere) TObjectPtr WidgetComponentsParameters; + UPROPERTY(EditAnywhere) + TObjectPtr CutScenesParameters; + UPROPERTY(EditAnywhere) TSoftObjectPtr MainMenuLevel; @@ -83,10 +88,12 @@ class G2I_API UG2IGameInstance : public UGameInstance UG2IWidgetsCatalog *GetWidgetsCatalog(); UG2IStringTablesCatalog *GetStringTablesCatalog(); UG2IWidgetComponentParameters *GetWidgetComponentParameters(); + UG2ICutScenesParameters *GetCutScenesParameters(); FString GetMainMenuLevelName() const; FString GetCurrentLevelName() const; int32 GetIndex(const EG2ILevelName& LevelName) const; EG2ILevelName GetLevelEnum(const FString& LevelName) const; + EG2ILevelName GetCurrentLevelEnum() const; bool IsMainMenuLevel() const; diff --git a/Source/G2I/Public/UI/G2IUIManager.h b/Source/G2I/Public/UI/G2IUIManager.h index 4ca8d2d9..60d80854 100644 --- a/Source/G2I/Public/UI/G2IUIManager.h +++ b/Source/G2I/Public/UI/G2IUIManager.h @@ -3,6 +3,7 @@ #include "CoreMinimal.h" #include "G2IUIManager.generated.h" +class UG2ICutScenesParameters; class UG2IGameInstance; enum class EG2IAimType : uint8; class UG2IWidgetComponentParameters; @@ -49,6 +50,9 @@ class G2I_API UG2IUIManager : public UGameInstanceSubsystem UPROPERTY() TObjectPtr WidgetComponentParameters; + UPROPERTY() + TObjectPtr CutScenesParameters; + FDelegateHandle StartGameDelegateHandle; public: @@ -131,4 +135,10 @@ class G2I_API UG2IUIManager : public UGameInstanceSubsystem void ApplyPropertyValue(const UG2IPropertyRow* PropertyRow) const; void SavePropertyValue(const UG2IPropertyRow* PropertyRow) const; void SetActionControl(const FText& ActionName, const FText& KeyName, UListView* ControlsList) const; + + // ==================== PAUSE WIDGET ==================== + void SetupPauseWidget(const TFunction& NewContinueAction) const; + + // ==================== CUT SCENES WIDGETS ==================== + void CloseCutScene(EG2IWidgetNames WidgetName) const; }; \ No newline at end of file diff --git a/Source/G2I/Public/UI/Widgets/CutScenes/G2ICutSceneSheetWidget.h b/Source/G2I/Public/UI/Widgets/CutScenes/G2ICutSceneSheetWidget.h new file mode 100644 index 00000000..cadfffbb --- /dev/null +++ b/Source/G2I/Public/UI/Widgets/CutScenes/G2ICutSceneSheetWidget.h @@ -0,0 +1,39 @@ +#pragma once + +#include "CoreMinimal.h" +#include "G2IUserWidget.h" +#include "G2ICutSceneSheetWidget.generated.h" + +class UImage; + +USTRUCT(BlueprintType) +struct FG2IFrameSetOneClick +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadWrite, Category = Frames, meta = (ToolTip = "List of frame's images for one click")) + TSet> FramesOneClick; +}; + +/** + * Cut scene's sheet with some frames + */ +UCLASS() +class G2I_API UG2ICutSceneSheetWidget : public UG2IUserWidget +{ + GENERATED_BODY() + +protected: + + UPROPERTY(BlueprintReadWrite, Category = Frames, meta = (ToolTip = "List of frame's images")) + TArray FrameImages; + +private: + + int32 CurrentFrameIndex = -1; + +public: + + bool ShowNextFrames(); + +}; diff --git a/Source/G2I/Public/UI/Widgets/CutScenes/G2ICutSceneWidget.h b/Source/G2I/Public/UI/Widgets/CutScenes/G2ICutSceneWidget.h new file mode 100644 index 00000000..16b6fcc5 --- /dev/null +++ b/Source/G2I/Public/UI/Widgets/CutScenes/G2ICutSceneWidget.h @@ -0,0 +1,77 @@ +#pragma once + +#include "CoreMinimal.h" +#include "G2IUserWidget.h" +#include "G2IWidgetNames.h" +#include "G2ICutSceneWidget.generated.h" + +class UImage; +class UWidgetSwitcher; + +/** + * Base widget with UI of cutscenes + */ +UCLASS() +class G2I_API UG2ICutSceneWidget : public UG2IUserWidget +{ + GENERATED_BODY() + +public: + + UPROPERTY(Transient, meta = (BindWidget)) + TObjectPtr SheetsSwitcher; + + UPROPERTY(meta = (BindWidget)) + TObjectPtr SkipBarImage; + +protected: + + UPROPERTY(EditAnywhere) + EG2IWidgetNames CurrentWidgetName = EG2IWidgetNames::CutSceneStartBoilerRoom; + + UPROPERTY(EditAnywhere, Category = Skip) + FKey SkipKey = EKeys::SpaceBar; + + UPROPERTY(EditAnywhere, Category = Switch) + FKey NextKey = EKeys::LeftMouseButton; + + UPROPERTY(EditAnywhere, Category = Pause) + FKey PauseKey = EKeys::Escape; + +#if WITH_EDITORONLY_DATA + UPROPERTY(EditAnywhere, Category = Pause) + FKey DebugPauseKey = EKeys::Enter; +#endif + +private: + + float SkipSpeed = 1.f; + + bool bIsSkipPressed = false; + + bool bIsEnabled = true; + + UPROPERTY() + TObjectPtr SkipBarMaterialInstance; + +protected: + + virtual void NativePreConstruct() override; + + virtual void InitializeAfterManagerLoading() override; + + virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; + + virtual FReply NativeOnKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override; + + virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override; + + virtual FReply NativeOnKeyUp(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override; + + void SetSkipPercent(float Percent) const; + + float GetSkipPercent() const; + + void CloseWidget() const; + +}; diff --git a/Source/G2I/Public/UI/Widgets/Menu/G2IPauseWidget.h b/Source/G2I/Public/UI/Widgets/Menu/G2IPauseWidget.h index 999f29f5..05e15329 100644 --- a/Source/G2I/Public/UI/Widgets/Menu/G2IPauseWidget.h +++ b/Source/G2I/Public/UI/Widgets/Menu/G2IPauseWidget.h @@ -22,6 +22,10 @@ class G2I_API UG2IPauseWidget : public UG2IUserWidget UPROPERTY(meta = (BindWidget)) TObjectPtr MainMenuButton; +public: + + TFunction OnContinue; + protected: virtual void InitializeAfterManagerLoading() override;