diff --git a/assets/locales.json b/assets/locales.json
index 1158fd5a0..8b60c04bd 100644
--- a/assets/locales.json
+++ b/assets/locales.json
@@ -2089,7 +2089,7 @@
"pl_PL": "Całkowity czas gry: {0}",
"pt_BR": "Tempo total de jogo: {0}",
"ru_RU": "",
- "sv_SE": "",
+ "sv_SE": "Total speltid: {0}",
"th_TH": "",
"tr_TR": "Toplam Oyun Süresi: {0}",
"uk_UA": "",
@@ -7214,7 +7214,7 @@
"pl_PL": "",
"pt_BR": "Configuração encontrada:\n\nNome:\t{0}\nGUID:\t{1}\n\n Aguardando conexão do controle...",
"ru_RU": "",
- "sv_SE": "",
+ "sv_SE": "Konfiguration hittad:\n\nNamn:\t{0}\nGUID:\t{1}\n\n Väntar på anslutning till kontroller...",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -13139,7 +13139,7 @@
"pl_PL": "",
"pt_BR": "Falha em atualizar a versão do Ryujinx recebida do servidor de atualização.",
"ru_RU": "",
- "sv_SE": "",
+ "sv_SE": "Det gick inte att konvertera Ryujinx-versionen som mottogs från uppdateringsservern.",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -16564,7 +16564,7 @@
"pl_PL": "",
"pt_BR": "Se esta opção está ativada nas configurações customizadas, as configurações globais de entrada serão usadas.\n\nNas configurações globais: você pode ativar ou desativá-las se necessário; está configuração será herdada por qualquer nova configuração customizada criada.",
"ru_RU": "Если эта опция включена в пользовательских настройках, будет использована глобальная конфигурация ввода.\n\nВ глобальных настройках: переключите эту опцию по своему усмотрению, это будет унаследовано для вновь созданых пользовательских конфигураций",
- "sv_SE": "",
+ "sv_SE": "Om det här alternativet är aktiverat i anpassade inställningar kommer den globala inmatningskonfigurationen att användas.\n\nI de globala inställningarna: du kan aktivera eller inaktivera det efter behov; den här inställningen kommer att ärvas av alla nya anpassade konfigurationer som skapas.",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
@@ -23439,7 +23439,7 @@
"pl_PL": "",
"pt_BR": "Ver Registro",
"ru_RU": "",
- "sv_SE": "",
+ "sv_SE": "Visa ändringslogg",
"th_TH": "ด",
"tr_TR": "",
"uk_UA": "",
@@ -24539,7 +24539,7 @@
"pl_PL": "Gry i Aplikacje",
"pt_BR": "Jogos e Aplicativos",
"ru_RU": "Игры и Приложения",
- "sv_SE": "Spel och Applikationer",
+ "sv_SE": "Spel och applikationer",
"th_TH": "",
"tr_TR": "Oyunlar ve Uygulamalar",
"uk_UA": "Ігри та Додатки",
@@ -24589,7 +24589,7 @@
"pl_PL": "Problemy i Cechy",
"pt_BR": "Problemas e Características",
"ru_RU": "Проблемы и Особенности",
- "sv_SE": "Problem och Egenskaper",
+ "sv_SE": "Problem och egenskaper",
"th_TH": "",
"tr_TR": "Sorunlar ve Özellikler",
"uk_UA": "Проблеми та Особливості",
diff --git a/src/Ryujinx/Systems/AppHost.cs b/src/Ryujinx/Systems/AppHost.cs
index 74005400c..1c5f64309 100644
--- a/src/Ryujinx/Systems/AppHost.cs
+++ b/src/Ryujinx/Systems/AppHost.cs
@@ -75,6 +75,7 @@ namespace Ryujinx.Ava.Systems
private readonly long _ticksPerFrame;
private readonly Stopwatch _chrono;
+ private readonly Stopwatch _playTimer;
private long _ticks;
private readonly AccountManager _accountManager;
@@ -175,6 +176,7 @@ namespace Ryujinx.Ava.Systems
_chrono = new Stopwatch();
_ticksPerFrame = Stopwatch.Frequency / TargetFps;
+ _playTimer = new Stopwatch();
if (ApplicationPath.StartsWith("@SystemContent"))
{
@@ -565,6 +567,7 @@ namespace Ryujinx.Ava.Systems
public void Stop()
{
_isActive = false;
+ _playTimer.Stop();
}
private void Exit()
@@ -616,7 +619,7 @@ namespace Ryujinx.Ava.Systems
private void Dispose()
{
if (Device.Processes != null)
- MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText);
+ MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText, _playTimer.Elapsed);
ConfigurationState.Instance.System.IgnoreMissingServices.Event -= UpdateIgnoreMissingServicesState;
ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState;
@@ -635,6 +638,7 @@ namespace Ryujinx.Ava.Systems
_gpuCancellationTokenSource.Dispose();
_chrono.Stop();
+ _playTimer.Stop();
}
public void DisposeGpu()
@@ -868,6 +872,7 @@ namespace Ryujinx.Ava.Systems
ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText,
appMetadata => appMetadata.UpdatePreGame()
);
+ _playTimer.Start();
return true;
}
@@ -877,6 +882,7 @@ namespace Ryujinx.Ava.Systems
Device?.System.TogglePauseEmulation(false);
_viewModel.IsPaused = false;
+ _playTimer.Start();
_viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI);
Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed");
}
@@ -886,6 +892,7 @@ namespace Ryujinx.Ava.Systems
Device?.System.TogglePauseEmulation(true);
_viewModel.IsPaused = true;
+ _playTimer.Stop();
_viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI, LocaleManager.Instance[LocaleKeys.Paused]);
Logger.Info?.Print(LogClass.Emulation, "Emulation was paused");
}
diff --git a/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs
index 9d8488aeb..8940657b0 100644
--- a/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs
+++ b/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs
@@ -33,19 +33,11 @@ namespace Ryujinx.Ava.Systems.AppLibrary
///
/// Updates and . Call this after a game ends.
///
- public void UpdatePostGame()
+ /// The active gameplay time this past session.
+ public void UpdatePostGame(TimeSpan playTime)
{
- DateTime? prevLastPlayed = LastPlayed;
UpdatePreGame();
-
- if (!prevLastPlayed.HasValue)
- {
- return;
- }
-
- TimeSpan diff = DateTime.UtcNow - prevLastPlayed.Value;
- double newTotalSeconds = TimePlayed.Add(diff).TotalSeconds;
- TimePlayed = TimeSpan.FromSeconds(Math.Round(newTotalSeconds, MidpointRounding.AwayFromZero));
+ TimePlayed += playTime;
}
}
}
diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
index 8b9b04511..5e7df4d62 100644
--- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
@@ -1688,8 +1688,8 @@ namespace Ryujinx.Ava.UI.ViewModels
RendererHostControl.Focus();
});
- public static void UpdateGameMetadata(string titleId)
- => ApplicationLibrary.LoadAndSaveMetaData(titleId, appMetadata => appMetadata.UpdatePostGame());
+ public static void UpdateGameMetadata(string titleId, TimeSpan playTime)
+ => ApplicationLibrary.LoadAndSaveMetaData(titleId, appMetadata => appMetadata.UpdatePostGame(playTime));
public void RefreshFirmwareStatus()
{