2022-05-23 18:41:30 +00:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
#include "LyraSettingsShared.h"
|
2022-09-13 07:18:28 +00:00
|
|
|
|
|
|
|
#include "CoreGlobals.h"
|
2022-05-23 18:41:30 +00:00
|
|
|
#include "Framework/Application/SlateApplication.h"
|
2022-09-13 07:18:28 +00:00
|
|
|
#include "HAL/IConsoleManager.h"
|
|
|
|
#include "Internationalization/Culture.h"
|
|
|
|
#include "Internationalization/CulturePointer.h"
|
|
|
|
#include "Internationalization/Internationalization.h"
|
2022-05-23 18:41:30 +00:00
|
|
|
#include "Kismet/GameplayStatics.h"
|
2022-09-13 07:18:28 +00:00
|
|
|
#include "Math/UnrealMathSSE.h"
|
|
|
|
#include "Misc/App.h"
|
|
|
|
#include "Misc/AssertionMacros.h"
|
|
|
|
#include "Misc/ConfigCacheIni.h"
|
2022-05-23 18:41:30 +00:00
|
|
|
#include "Player/LyraLocalPlayer.h"
|
2022-09-13 07:18:28 +00:00
|
|
|
#include "Rendering/RenderingCommon.h"
|
|
|
|
#include "Rendering/SlateRenderer.h"
|
|
|
|
#include "SubtitleDisplaySubsystem.h"
|
|
|
|
#include "Templates/Casts.h"
|
2022-05-23 18:41:30 +00:00
|
|
|
|
|
|
|
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<ULyraSettingsShared>(Slot);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SharedSettings == nullptr)
|
|
|
|
{
|
|
|
|
SharedSettings = Cast<ULyraSettingsShared>(UGameplayStatics::CreateSaveGameObject(ULyraSettingsShared::StaticClass()));
|
|
|
|
}
|
|
|
|
|
|
|
|
SharedSettings->Initialize(const_cast<ULyraLocalPlayer*>(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()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|