// Copyright Epic Games, Inc. All Rights Reserved. #include "LyraSettingsShared.h" #include "Framework/Application/SlateApplication.h" #include "Engine/LocalPlayer.h" #include "Kismet/GameplayStatics.h" #include "Player/LyraLocalPlayer.h" #include "Internationalization/Culture.h" static FString SHARED_SETTINGS_SLOT_NAME = TEXT("SharedGameSettings"); namespace LyraSettingsSharedCVars { static float DefaultGamepadLeftStickInnerDeadZone = 0.25f; static FAutoConsoleVariableRef CVarGamepadLeftStickInnerDeadZone( TEXT("gpad.DefaultLeftStickInnerDeadZone"), DefaultGamepadLeftStickInnerDeadZone, TEXT("Gamepad left stick inner deadzone") ); static float DefaultGamepadRightStickInnerDeadZone = 0.25f; static FAutoConsoleVariableRef CVarGamepadRightStickInnerDeadZone( TEXT("gpad.DefaultRightStickInnerDeadZone"), DefaultGamepadRightStickInnerDeadZone, TEXT("Gamepad right stick inner deadzone") ); } ULyraSettingsShared::ULyraSettingsShared() { FInternationalization::Get().OnCultureChanged().AddUObject(this, &ThisClass::OnCultureChanged); GamepadMoveStickDeadZone = LyraSettingsSharedCVars::DefaultGamepadLeftStickInnerDeadZone; GamepadLookStickDeadZone = LyraSettingsSharedCVars::DefaultGamepadRightStickInnerDeadZone; } void ULyraSettingsShared::Initialize(ULyraLocalPlayer* LocalPlayer) { check(LocalPlayer); OwningPlayer = LocalPlayer; } void ULyraSettingsShared::SaveSettings() { check(OwningPlayer); UGameplayStatics::SaveGameToSlot(this, SHARED_SETTINGS_SLOT_NAME, OwningPlayer->GetLocalPlayerIndex()); } /*static*/ ULyraSettingsShared* ULyraSettingsShared::LoadOrCreateSettings(const ULyraLocalPlayer* LocalPlayer) { ULyraSettingsShared* SharedSettings = nullptr; // If the save game exists, load it. if (UGameplayStatics::DoesSaveGameExist(SHARED_SETTINGS_SLOT_NAME, LocalPlayer->GetLocalPlayerIndex())) { USaveGame* Slot = UGameplayStatics::LoadGameFromSlot(SHARED_SETTINGS_SLOT_NAME, LocalPlayer->GetLocalPlayerIndex()); SharedSettings = Cast(Slot); } if (SharedSettings == nullptr) { SharedSettings = Cast(UGameplayStatics::CreateSaveGameObject(ULyraSettingsShared::StaticClass())); } SharedSettings->Initialize(const_cast(LocalPlayer)); SharedSettings->ApplySettings(); return SharedSettings; } void ULyraSettingsShared::ApplySettings() { ApplySubtitleOptions(); ApplyBackgroundAudioSettings(); ApplyCultureSettings(); } void ULyraSettingsShared::SetColorBlindStrength(int32 InColorBlindStrength) { InColorBlindStrength = FMath::Clamp(InColorBlindStrength, 0, 10); if (ColorBlindStrength != InColorBlindStrength) { ColorBlindStrength = InColorBlindStrength; FSlateApplication::Get().GetRenderer()->SetColorVisionDeficiencyType( (EColorVisionDeficiency)(int32)ColorBlindMode, (int32)ColorBlindStrength, true, false); } } int32 ULyraSettingsShared::GetColorBlindStrength() const { return ColorBlindStrength; } void ULyraSettingsShared::SetColorBlindMode(EColorBlindMode InMode) { if (ColorBlindMode != InMode) { ColorBlindMode = InMode; FSlateApplication::Get().GetRenderer()->SetColorVisionDeficiencyType( (EColorVisionDeficiency)(int32)ColorBlindMode, (int32)ColorBlindStrength, true, false); } } EColorBlindMode ULyraSettingsShared::GetColorBlindMode() const { return ColorBlindMode; } void ULyraSettingsShared::ApplySubtitleOptions() { if (USubtitleDisplaySubsystem* SubtitleSystem = USubtitleDisplaySubsystem::Get(OwningPlayer)) { FSubtitleFormat SubtitleFormat; SubtitleFormat.SubtitleTextSize = SubtitleTextSize; SubtitleFormat.SubtitleTextColor = SubtitleTextColor; SubtitleFormat.SubtitleTextBorder = SubtitleTextBorder; SubtitleFormat.SubtitleBackgroundOpacity = SubtitleBackgroundOpacity; SubtitleSystem->SetSubtitleDisplayOptions(SubtitleFormat); } } ////////////////////////////////////////////////////////////////////// void ULyraSettingsShared::SetAllowAudioInBackgroundSetting(ELyraAllowBackgroundAudioSetting NewValue) { if (ChangeValueAndDirty(AllowAudioInBackground, NewValue)) { ApplyBackgroundAudioSettings(); } } void ULyraSettingsShared::ApplyBackgroundAudioSettings() { if (OwningPlayer && OwningPlayer->IsPrimaryPlayer()) { FApp::SetUnfocusedVolumeMultiplier((AllowAudioInBackground != ELyraAllowBackgroundAudioSetting::Off) ? 1.0f : 0.0f); } } ////////////////////////////////////////////////////////////////////// void ULyraSettingsShared::ApplyCultureSettings() { if (bResetToDefaultCulture) { const FCulturePtr SystemDefaultCulture = FInternationalization::Get().GetDefaultCulture(); check(SystemDefaultCulture.IsValid()); const FString CultureToApply = SystemDefaultCulture->GetName(); if (FInternationalization::Get().SetCurrentCulture(CultureToApply)) { // Clear this string GConfig->RemoveKey(TEXT("Internationalization"), TEXT("Culture"), GGameUserSettingsIni); GConfig->Flush(false, GGameUserSettingsIni); } bResetToDefaultCulture = false; } else if (!PendingCulture.IsEmpty()) { // SetCurrentCulture may trigger PendingCulture to be cleared (if a culture change is broadcast) so we take a copy of it to work with const FString CultureToApply = PendingCulture; if (FInternationalization::Get().SetCurrentCulture(CultureToApply)) { // Note: This is intentionally saved to the users config // We need to localize text before the player logs in and very early in the loading screen GConfig->SetString(TEXT("Internationalization"), TEXT("Culture"), *CultureToApply, GGameUserSettingsIni); GConfig->Flush(false, GGameUserSettingsIni); } ClearPendingCulture(); } } void ULyraSettingsShared::ResetCultureToCurrentSettings() { ClearPendingCulture(); bResetToDefaultCulture = false; } const FString& ULyraSettingsShared::GetPendingCulture() const { return PendingCulture; } void ULyraSettingsShared::SetPendingCulture(const FString& NewCulture) { PendingCulture = NewCulture; bResetToDefaultCulture = false; bIsDirty = true; } void ULyraSettingsShared::OnCultureChanged() { ClearPendingCulture(); bResetToDefaultCulture = false; } void ULyraSettingsShared::ClearPendingCulture() { PendingCulture.Reset(); } bool ULyraSettingsShared::IsUsingDefaultCulture() const { FString Culture; GConfig->GetString(TEXT("Internationalization"), TEXT("Culture"), Culture, GGameUserSettingsIni); return Culture.IsEmpty(); } void ULyraSettingsShared::ResetToDefaultCulture() { ClearPendingCulture(); bResetToDefaultCulture = true; bIsDirty = true; } ////////////////////////////////////////////////////////////////////// void ULyraSettingsShared::ApplyInputSensitivity() { }