Compare commits

..

8 Commits

Author SHA1 Message Date
ssc19940105
59277e49c5 Update Simplified Chinese Translation (#51) 2024-10-23 11:20:22 -05:00
Evan Husted
8e8ad0f37e go away dependabot 2024-10-23 09:54:39 -05:00
Evan Husted
b883de5d67 Update dependabot.yml
STOP OPENING THE DAMN AVALONIA PRS
2024-10-23 09:47:56 -05:00
Evan Husted
1040ec4e53 Update dependabot.yml
Stop trying to bother berry
2024-10-23 09:38:41 -05:00
MaxLastBreath
4d1ebaf9ba Ava UI : Set the Default Controller to Pro Controller. (#37)
* Set the Default Controller to Pro Controller.

- Let's be honest nobody is using JoyCon pair on their PC.
- It looks nicer and more accurate to more traditional controllers.
- Fixes issues with UltraCam mods and other such mods with lack of proper Dual Joycon support.

* Change standard configuration too.
2024-10-23 06:56:58 -05:00
TheToid
dc3267f152 Ensure we unselect the previously selected update when auto selcting a new update (#30) 2024-10-21 23:22:13 -05:00
Keaton
f76a97c976 Replace 'Expand DRAM' option with dropdown menu (#32)
Allows to use mods that require a larger memory pool to allocate from.
2024-10-21 23:16:41 -05:00
TheToid
0f3c7f920b Fix for duplicate controller names under Ava when two controllers of the same type are attached (#29) 2024-10-21 10:25:14 -05:00
56 changed files with 497 additions and 190 deletions

View File

@@ -1,40 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: weekly
labels:
- "infra"
reviewers:
- TSRBerry
commit-message:
prefix: "ci"
- package-ecosystem: nuget
directory: /
open-pull-requests-limit: 10
schedule:
interval: daily
labels:
- "infra"
reviewers:
- TSRBerry
commit-message:
prefix: nuget
groups:
Avalonia:
patterns:
- "*Avalonia*"
Silk.NET:
patterns:
- "Silk.NET*"
OpenTK:
patterns:
- "OpenTK*"
SixLabors:
patterns:
- "SixLabors*"
NUnit:
patterns:
- "NUnit*"

View File

@@ -492,7 +492,7 @@ namespace Ryujinx.Common.Collections
Start = start; Start = start;
End = end; End = end;
Max = end; Max = end;
Values = [ new RangeNode<TKey, TValue>(start, end, value) ]; Values = [new RangeNode<TKey, TValue>(start, end, value)];
Parent = parent; Parent = parent;
} }
} }

View File

@@ -4,8 +4,8 @@ using System.Diagnostics;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Runtime.Intrinsics.X86;
using System.Runtime.Intrinsics; using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
namespace Ryujinx.Common namespace Ryujinx.Common
@@ -67,18 +67,198 @@ namespace Ryujinx.Common
private static ReadOnlySpan<byte> Xxh3KSecret => private static ReadOnlySpan<byte> Xxh3KSecret =>
[ [
0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, 0xb8,
0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, 0xfe,
0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, 0x6c,
0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, 0x39,
0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, 0x23,
0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, 0xa4,
0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, 0x4b,
0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, 0xbe,
0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, 0x7c,
0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, 0x01,
0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, 0x81,
0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e 0x2c,
0xf7,
0x21,
0xad,
0x1c,
0xde,
0xd4,
0x6d,
0xe9,
0x83,
0x90,
0x97,
0xdb,
0x72,
0x40,
0xa4,
0xa4,
0xb7,
0xb3,
0x67,
0x1f,
0xcb,
0x79,
0xe6,
0x4e,
0xcc,
0xc0,
0xe5,
0x78,
0x82,
0x5a,
0xd0,
0x7d,
0xcc,
0xff,
0x72,
0x21,
0xb8,
0x08,
0x46,
0x74,
0xf7,
0x43,
0x24,
0x8e,
0xe0,
0x35,
0x90,
0xe6,
0x81,
0x3a,
0x26,
0x4c,
0x3c,
0x28,
0x52,
0xbb,
0x91,
0xc3,
0x00,
0xcb,
0x88,
0xd0,
0x65,
0x8b,
0x1b,
0x53,
0x2e,
0xa3,
0x71,
0x64,
0x48,
0x97,
0xa2,
0x0d,
0xf9,
0x4e,
0x38,
0x19,
0xef,
0x46,
0xa9,
0xde,
0xac,
0xd8,
0xa8,
0xfa,
0x76,
0x3f,
0xe3,
0x9c,
0x34,
0x3f,
0xf9,
0xdc,
0xbb,
0xc7,
0xc7,
0x0b,
0x4f,
0x1d,
0x8a,
0x51,
0xe0,
0x4b,
0xcd,
0xb4,
0x59,
0x31,
0xc8,
0x9f,
0x7e,
0xc9,
0xd9,
0x78,
0x73,
0x64,
0xea,
0xc5,
0xac,
0x83,
0x34,
0xd3,
0xeb,
0xc3,
0xc5,
0x81,
0xa0,
0xff,
0xfa,
0x13,
0x63,
0xeb,
0x17,
0x0d,
0xdd,
0x51,
0xb7,
0xf0,
0xda,
0x49,
0xd3,
0x16,
0x55,
0x26,
0x29,
0xd4,
0x68,
0x9e,
0x2b,
0x16,
0xbe,
0x58,
0x7d,
0x47,
0xa1,
0xfc,
0x8f,
0xf8,
0xb8,
0xd1,
0x7a,
0xd0,
0x31,
0xce,
0x45,
0xcb,
0x3a,
0x8f,
0x95,
0x16,
0x04,
0x28,
0xaf,
0xd7,
0xfb,
0xca,
0xbb,
0x4b,
0x40,
0x7e
]; ];
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -551,6 +731,6 @@ namespace Ryujinx.Common
}; };
} }
#endregion #endregion
} }
} }

View File

@@ -7,10 +7,10 @@ namespace Ryujinx.Common
public static T AlignUp<T>(T value, T size) where T : IBinaryInteger<T> public static T AlignUp<T>(T value, T size) where T : IBinaryInteger<T>
=> (value + (size - T.One)) & -size; => (value + (size - T.One)) & -size;
public static T AlignDown<T>(T value, T size) where T : IBinaryInteger<T> public static T AlignDown<T>(T value, T size) where T : IBinaryInteger<T>
=> value & -size; => value & -size;
public static T DivRoundUp<T>(T value, T dividend) where T : IBinaryInteger<T> public static T DivRoundUp<T>(T value, T dividend) where T : IBinaryInteger<T>
=> (value + (dividend - T.One)) / dividend; => (value + (dividend - T.One)) / dividend;
public static int Pow2RoundDown(int value) => BitOperations.IsPow2(value) ? value : Pow2RoundUp(value) >> 1; public static int Pow2RoundDown(int value) => BitOperations.IsPow2(value) ? value : Pow2RoundUp(value) >> 1;

View File

@@ -72,7 +72,7 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.H264
Flush(); Flush();
} }
public readonly Span<byte> AsSpan() public readonly Span<byte> AsSpan()
=> new Span<byte>(workBuffer)[.._offset]; => new Span<byte>(workBuffer)[.._offset];
public void WriteU(uint value, int valueSize) => WriteBits((int)value, valueSize); public void WriteU(uint value, int valueSize) => WriteBits((int)value, valueSize);

View File

@@ -114,7 +114,7 @@ namespace Ryujinx.Graphics.Texture
_height == other._height && _height == other._height &&
_stride == other._stride && _stride == other._stride &&
_bytesPerPixel == other._bytesPerPixel; _bytesPerPixel == other._bytesPerPixel;
return !other._isLinear && _layoutConverter.LayoutMatches(other._layoutConverter); return !other._isLinear && _layoutConverter.LayoutMatches(other._layoutConverter);
} }

View File

@@ -589,12 +589,12 @@ namespace Ryujinx.HLE.FileSystem
// So, we check it early for a better user experience. // So, we check it early for a better user experience.
if (_virtualFileSystem.KeySet.HeaderKey.IsZeros()) if (_virtualFileSystem.KeySet.HeaderKey.IsZeros())
throw new MissingKeyException("HeaderKey is empty. Cannot decrypt NCA headers."); throw new MissingKeyException("HeaderKey is empty. Cannot decrypt NCA headers.");
Dictionary<ulong, List<(NcaContentType type, string path)>> updateNcas = new(); Dictionary<ulong, List<(NcaContentType type, string path)>> updateNcas = new();
if (Directory.Exists(firmwarePackage)) if (Directory.Exists(firmwarePackage))
return VerifyAndGetVersionDirectory(firmwarePackage); return VerifyAndGetVersionDirectory(firmwarePackage);
if (!File.Exists(firmwarePackage)) if (!File.Exists(firmwarePackage))
throw new FileNotFoundException("Firmware file does not exist."); throw new FileNotFoundException("Firmware file does not exist.");
@@ -620,7 +620,7 @@ namespace Ryujinx.HLE.FileSystem
return null; return null;
SystemVersion VerifyAndGetVersionDirectory(string firmwareDirectory) SystemVersion VerifyAndGetVersionDirectory(string firmwareDirectory)
=> VerifyAndGetVersion(new LocalFileSystem(firmwareDirectory)); => VerifyAndGetVersion(new LocalFileSystem(firmwareDirectory));
SystemVersion VerifyAndGetVersionZip(ZipArchive archive) SystemVersion VerifyAndGetVersionZip(ZipArchive archive)

View File

@@ -30,6 +30,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
MemoryArrange.MemoryArrange4GiBAppletDev => 2048 * MiB, MemoryArrange.MemoryArrange4GiBAppletDev => 2048 * MiB,
MemoryArrange.MemoryArrange6GiB => 4916 * MiB, MemoryArrange.MemoryArrange6GiB => 4916 * MiB,
MemoryArrange.MemoryArrange8GiB => 6964 * MiB, MemoryArrange.MemoryArrange8GiB => 6964 * MiB,
MemoryArrange.MemoryArrange12GiB => 11060 * MiB,
_ => throw new ArgumentException($"Invalid memory arrange \"{arrange}\"."), _ => throw new ArgumentException($"Invalid memory arrange \"{arrange}\"."),
}; };
} }
@@ -43,7 +44,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
MemoryArrange.MemoryArrange4GiBSystemDev => 448 * MiB, MemoryArrange.MemoryArrange4GiBSystemDev => 448 * MiB,
MemoryArrange.MemoryArrange6GiB => 562 * MiB, MemoryArrange.MemoryArrange6GiB => 562 * MiB,
MemoryArrange.MemoryArrange6GiBAppletDev => 2193 * MiB, MemoryArrange.MemoryArrange6GiBAppletDev => 2193 * MiB,
MemoryArrange.MemoryArrange8GiB => 562 * MiB, MemoryArrange.MemoryArrange8GiB or
MemoryArrange.MemoryArrange12GiB => 562 * MiB,
_ => throw new ArgumentException($"Invalid memory arrange \"{arrange}\"."), _ => throw new ArgumentException($"Invalid memory arrange \"{arrange}\"."),
}; };
} }
@@ -71,6 +73,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
MemorySize.MemorySize4GiB => 4 * GiB, MemorySize.MemorySize4GiB => 4 * GiB,
MemorySize.MemorySize6GiB => 6 * GiB, MemorySize.MemorySize6GiB => 6 * GiB,
MemorySize.MemorySize8GiB => 8 * GiB, MemorySize.MemorySize8GiB => 8 * GiB,
MemorySize.MemorySize12GiB => 12 * GiB,
_ => throw new ArgumentException($"Invalid memory size \"{size}\"."), _ => throw new ArgumentException($"Invalid memory size \"{size}\"."),
}; };
} }

View File

@@ -8,5 +8,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
MemoryArrange6GiB, MemoryArrange6GiB,
MemoryArrange6GiBAppletDev, MemoryArrange6GiBAppletDev,
MemoryArrange8GiB, MemoryArrange8GiB,
MemoryArrange12GiB,
} }
} }

View File

@@ -5,5 +5,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
MemorySize4GiB = 0, MemorySize4GiB = 0,
MemorySize6GiB = 1, MemorySize6GiB = 1,
MemorySize8GiB = 2, MemorySize8GiB = 2,
MemorySize12GiB = 3,
} }
} }

View File

@@ -6,11 +6,12 @@ namespace Ryujinx.HLE
public enum MemoryConfiguration public enum MemoryConfiguration
{ {
MemoryConfiguration4GiB = 0, MemoryConfiguration4GiB = 0,
MemoryConfiguration4GiBAppletDev = 1, MemoryConfiguration6GiB = 1,
MemoryConfiguration4GiBSystemDev = 2, MemoryConfiguration8GiB = 2,
MemoryConfiguration6GiB = 3, MemoryConfiguration12GiB = 3,
MemoryConfiguration6GiBAppletDev = 4, MemoryConfiguration4GiBAppletDev = 4,
MemoryConfiguration8GiB = 5, MemoryConfiguration4GiBSystemDev = 5,
MemoryConfiguration6GiBAppletDev = 6,
} }
static class MemoryConfigurationExtensions static class MemoryConfigurationExtensions
@@ -28,6 +29,7 @@ namespace Ryujinx.HLE
MemoryConfiguration.MemoryConfiguration6GiB => MemoryArrange.MemoryArrange6GiB, MemoryConfiguration.MemoryConfiguration6GiB => MemoryArrange.MemoryArrange6GiB,
MemoryConfiguration.MemoryConfiguration6GiBAppletDev => MemoryArrange.MemoryArrange6GiBAppletDev, MemoryConfiguration.MemoryConfiguration6GiBAppletDev => MemoryArrange.MemoryArrange6GiBAppletDev,
MemoryConfiguration.MemoryConfiguration8GiB => MemoryArrange.MemoryArrange8GiB, MemoryConfiguration.MemoryConfiguration8GiB => MemoryArrange.MemoryArrange8GiB,
MemoryConfiguration.MemoryConfiguration12GiB => MemoryArrange.MemoryArrange12GiB,
_ => throw new AggregateException($"Invalid memory configuration \"{configuration}\"."), _ => throw new AggregateException($"Invalid memory configuration \"{configuration}\"."),
}; };
} }
@@ -42,6 +44,7 @@ namespace Ryujinx.HLE
MemoryConfiguration.MemoryConfiguration6GiB or MemoryConfiguration.MemoryConfiguration6GiB or
MemoryConfiguration.MemoryConfiguration6GiBAppletDev => MemorySize.MemorySize6GiB, MemoryConfiguration.MemoryConfiguration6GiBAppletDev => MemorySize.MemorySize6GiB,
MemoryConfiguration.MemoryConfiguration8GiB => MemorySize.MemorySize8GiB, MemoryConfiguration.MemoryConfiguration8GiB => MemorySize.MemorySize8GiB,
MemoryConfiguration.MemoryConfiguration12GiB => MemorySize.MemorySize12GiB,
_ => throw new AggregateException($"Invalid memory configuration \"{configuration}\"."), _ => throw new AggregateException($"Invalid memory configuration \"{configuration}\"."),
}; };
} }
@@ -56,6 +59,7 @@ namespace Ryujinx.HLE
MemoryConfiguration.MemoryConfiguration6GiB or MemoryConfiguration.MemoryConfiguration6GiB or
MemoryConfiguration.MemoryConfiguration6GiBAppletDev => 6 * GiB, MemoryConfiguration.MemoryConfiguration6GiBAppletDev => 6 * GiB,
MemoryConfiguration.MemoryConfiguration8GiB => 8 * GiB, MemoryConfiguration.MemoryConfiguration8GiB => 8 * GiB,
MemoryConfiguration.MemoryConfiguration12GiB => 12 * GiB,
_ => throw new AggregateException($"Invalid memory configuration \"{configuration}\"."), _ => throw new AggregateException($"Invalid memory configuration \"{configuration}\"."),
}; };
} }

View File

@@ -18,7 +18,7 @@ namespace Ryujinx.Headless.SDL2
public bool TextProcessingEnabled public bool TextProcessingEnabled
{ {
get => Volatile.Read(ref _canProcessInput); get => Volatile.Read(ref _canProcessInput);
set set
{ {
Volatile.Write(ref _canProcessInput, value); Volatile.Write(ref _canProcessInput, value);

View File

@@ -1,5 +1,6 @@
using CommandLine; using CommandLine;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.HLE;
using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.HOS.SystemState;
namespace Ryujinx.Headless.SDL2 namespace Ryujinx.Headless.SDL2
@@ -219,8 +220,8 @@ namespace Ryujinx.Headless.SDL2
// Hacks // Hacks
[Option("expand-ram", Required = false, Default = false, HelpText = "Expands the RAM amount on the emulated system from 4GiB to 8GiB.")] [Option("dram-size", Required = false, Default = MemoryConfiguration.MemoryConfiguration4GiB, HelpText = "Set the RAM amount on the emulated system.")]
public bool ExpandRAM { get; set; } public MemoryConfiguration DramSize { get; set; }
[Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")] [Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")]
public bool IgnoreMissingServices { get; set; } public bool IgnoreMissingServices { get; set; }

View File

@@ -562,7 +562,7 @@ namespace Ryujinx.Headless.SDL2
_userChannelPersistence, _userChannelPersistence,
renderer, renderer,
new SDL2HardwareDeviceDriver(), new SDL2HardwareDeviceDriver(),
options.ExpandRAM ? MemoryConfiguration.MemoryConfiguration8GiB : MemoryConfiguration.MemoryConfiguration4GiB, options.DramSize,
window, window,
options.SystemLanguage, options.SystemLanguage,
options.SystemRegion, options.SystemRegion,

View File

@@ -147,7 +147,8 @@ namespace Ryujinx.Input.SDL2
public void Rumble(float lowFrequency, float highFrequency, uint durationMs) public void Rumble(float lowFrequency, float highFrequency, uint durationMs)
{ {
if (!Features.HasFlag(GamepadFeaturesFlag.Rumble)) return; if (!Features.HasFlag(GamepadFeaturesFlag.Rumble))
return;
ushort lowFrequencyRaw = (ushort)(lowFrequency * ushort.MaxValue); ushort lowFrequencyRaw = (ushort)(lowFrequency * ushort.MaxValue);
ushort highFrequencyRaw = (ushort)(highFrequency * ushort.MaxValue); ushort highFrequencyRaw = (ushort)(highFrequency * ushort.MaxValue);
@@ -260,12 +261,13 @@ namespace Ryujinx.Input.SDL2
{ {
if (_buttonsUserMapping.Count == 0) if (_buttonsUserMapping.Count == 0)
return rawState; return rawState;
// ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator
foreach (ButtonMappingEntry entry in _buttonsUserMapping) foreach (ButtonMappingEntry entry in _buttonsUserMapping)
{ {
if (!entry.IsValid) continue; if (!entry.IsValid)
continue;
// Do not touch state of button already pressed // Do not touch state of button already pressed
if (!result.IsPressed(entry.To)) if (!result.IsPressed(entry.To))
@@ -291,11 +293,28 @@ namespace Ryujinx.Input.SDL2
return value * ConvertRate; return value * ConvertRate;
} }
private JoyconConfigControllerStick<GamepadInputId, Common.Configuration.Hid.Controller.StickInputId> GetLogicalJoyStickConfig(StickInputId inputId)
{
switch (inputId)
{
case StickInputId.Left:
if (_configuration.RightJoyconStick.Joystick == Common.Configuration.Hid.Controller.StickInputId.Left)
return _configuration.RightJoyconStick;
else
return _configuration.LeftJoyconStick;
case StickInputId.Right:
if (_configuration.LeftJoyconStick.Joystick == Common.Configuration.Hid.Controller.StickInputId.Right)
return _configuration.LeftJoyconStick;
else
return _configuration.RightJoyconStick;
}
return null;
}
public (float, float) GetStick(StickInputId inputId) public (float, float) GetStick(StickInputId inputId)
{ {
if (inputId == StickInputId.Unbound) if (inputId == StickInputId.Unbound)
return (0.0f, 0.0f); return (0.0f, 0.0f);
(short stickX, short stickY) = GetStickXY(inputId); (short stickX, short stickY) = GetStickXY(inputId);
@@ -304,24 +323,22 @@ namespace Ryujinx.Input.SDL2
if (HasConfiguration) if (HasConfiguration)
{ {
if ((inputId == StickInputId.Left && _configuration.LeftJoyconStick.InvertStickX) || var joyconStickConfig = GetLogicalJoyStickConfig(inputId);
(inputId == StickInputId.Right && _configuration.RightJoyconStick.InvertStickX))
{
resultX = -resultX;
}
if ((inputId == StickInputId.Left && _configuration.LeftJoyconStick.InvertStickY) || if (joyconStickConfig != null)
(inputId == StickInputId.Right && _configuration.RightJoyconStick.InvertStickY))
{ {
resultY = -resultY; if (joyconStickConfig.InvertStickX)
} resultX = -resultX;
if ((inputId == StickInputId.Left && _configuration.LeftJoyconStick.Rotate90CW) || if (joyconStickConfig.InvertStickY)
(inputId == StickInputId.Right && _configuration.RightJoyconStick.Rotate90CW)) resultY = -resultY;
{
float temp = resultX; if (joyconStickConfig.Rotate90CW)
resultX = resultY; {
resultY = -temp; float temp = resultX;
resultX = resultY;
resultY = -temp;
}
} }
} }

View File

@@ -986,6 +986,10 @@ namespace Ryujinx.UI.App.Common
var shouldSelect = !currentlySelected.HasValue || var shouldSelect = !currentlySelected.HasValue ||
currentlySelected.Value.TitleUpdate.Version < update.Version; currentlySelected.Value.TitleUpdate.Version < update.Version;
_titleUpdates.AddOrUpdate((update, shouldSelect)); _titleUpdates.AddOrUpdate((update, shouldSelect));
if (currentlySelected.HasValue && shouldSelect)
_titleUpdates.AddOrUpdate((currentlySelected.Value.TitleUpdate, false));
SaveTitleUpdatesForGame(update.TitleIdBase); SaveTitleUpdatesForGame(update.TitleIdBase);
numUpdatesLoaded++; numUpdatesLoaded++;

View File

@@ -3,6 +3,7 @@ using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities; using Ryujinx.Common.Utilities;
using Ryujinx.HLE;
using Ryujinx.UI.Common.Configuration.System; using Ryujinx.UI.Common.Configuration.System;
using Ryujinx.UI.Common.Configuration.UI; using Ryujinx.UI.Common.Configuration.UI;
using System.Collections.Generic; using System.Collections.Generic;
@@ -15,7 +16,7 @@ namespace Ryujinx.UI.Common.Configuration
/// <summary> /// <summary>
/// The current version of the file format /// The current version of the file format
/// </summary> /// </summary>
public const int CurrentVersion = 53; public const int CurrentVersion = 54;
/// <summary> /// <summary>
/// Version of the configuration file format /// Version of the configuration file format
@@ -245,7 +246,7 @@ namespace Ryujinx.UI.Common.Configuration
/// <summary> /// <summary>
/// Expands the RAM amount on the emulated system from 4GiB to 8GiB /// Expands the RAM amount on the emulated system from 4GiB to 8GiB
/// </summary> /// </summary>
public bool ExpandRam { get; set; } public MemoryConfiguration DramSize { get; set; }
/// <summary> /// <summary>
/// Enable or disable ignoring missing services /// Enable or disable ignoring missing services

View File

@@ -7,6 +7,7 @@ using Ryujinx.Common.Configuration.Hid.Keyboard;
using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Graphics.Vulkan; using Ryujinx.Graphics.Vulkan;
using Ryujinx.HLE;
using Ryujinx.UI.Common.Configuration.System; using Ryujinx.UI.Common.Configuration.System;
using Ryujinx.UI.Common.Configuration.UI; using Ryujinx.UI.Common.Configuration.UI;
using Ryujinx.UI.Common.Helper; using Ryujinx.UI.Common.Helper;
@@ -366,7 +367,7 @@ namespace Ryujinx.UI.Common.Configuration
/// <summary> /// <summary>
/// Defines the amount of RAM available on the emulated system, and how it is distributed /// Defines the amount of RAM available on the emulated system, and how it is distributed
/// </summary> /// </summary>
public ReactiveObject<bool> ExpandRam { get; private set; } public ReactiveObject<MemoryConfiguration> DramSize { get; private set; }
/// <summary> /// <summary>
/// Enable or disable ignoring missing services /// Enable or disable ignoring missing services
@@ -400,8 +401,8 @@ namespace Ryujinx.UI.Common.Configuration
AudioBackend.Event += static (sender, e) => LogValueChange(e, nameof(AudioBackend)); AudioBackend.Event += static (sender, e) => LogValueChange(e, nameof(AudioBackend));
MemoryManagerMode = new ReactiveObject<MemoryManagerMode>(); MemoryManagerMode = new ReactiveObject<MemoryManagerMode>();
MemoryManagerMode.Event += static (sender, e) => LogValueChange(e, nameof(MemoryManagerMode)); MemoryManagerMode.Event += static (sender, e) => LogValueChange(e, nameof(MemoryManagerMode));
ExpandRam = new ReactiveObject<bool>(); DramSize = new ReactiveObject<MemoryConfiguration>();
ExpandRam.Event += static (sender, e) => LogValueChange(e, nameof(ExpandRam)); DramSize.Event += static (sender, e) => LogValueChange(e, nameof(DramSize));
IgnoreMissingServices = new ReactiveObject<bool>(); IgnoreMissingServices = new ReactiveObject<bool>();
IgnoreMissingServices.Event += static (sender, e) => LogValueChange(e, nameof(IgnoreMissingServices)); IgnoreMissingServices.Event += static (sender, e) => LogValueChange(e, nameof(IgnoreMissingServices));
AudioVolume = new ReactiveObject<float>(); AudioVolume = new ReactiveObject<float>();
@@ -721,7 +722,7 @@ namespace Ryujinx.UI.Common.Configuration
AudioBackend = System.AudioBackend, AudioBackend = System.AudioBackend,
AudioVolume = System.AudioVolume, AudioVolume = System.AudioVolume,
MemoryManagerMode = System.MemoryManagerMode, MemoryManagerMode = System.MemoryManagerMode,
ExpandRam = System.ExpandRam, DramSize = System.DramSize,
IgnoreMissingServices = System.IgnoreMissingServices, IgnoreMissingServices = System.IgnoreMissingServices,
UseHypervisor = System.UseHypervisor, UseHypervisor = System.UseHypervisor,
GuiColumns = new GuiColumns GuiColumns = new GuiColumns
@@ -834,7 +835,7 @@ namespace Ryujinx.UI.Common.Configuration
System.AudioBackend.Value = AudioBackend.SDL2; System.AudioBackend.Value = AudioBackend.SDL2;
System.AudioVolume.Value = 1; System.AudioVolume.Value = 1;
System.MemoryManagerMode.Value = MemoryManagerMode.HostMappedUnsafe; System.MemoryManagerMode.Value = MemoryManagerMode.HostMappedUnsafe;
System.ExpandRam.Value = false; System.DramSize.Value = MemoryConfiguration.MemoryConfiguration4GiB;
System.IgnoreMissingServices.Value = false; System.IgnoreMissingServices.Value = false;
System.UseHypervisor.Value = true; System.UseHypervisor.Value = true;
Multiplayer.LanInterfaceId.Value = "0"; Multiplayer.LanInterfaceId.Value = "0";
@@ -897,7 +898,7 @@ namespace Ryujinx.UI.Common.Configuration
Backend = InputBackendType.WindowKeyboard, Backend = InputBackendType.WindowKeyboard,
Id = "0", Id = "0",
PlayerIndex = PlayerIndex.Player1, PlayerIndex = PlayerIndex.Player1,
ControllerType = ControllerType.JoyconPair, ControllerType = ControllerType.ProController,
LeftJoycon = new LeftJoyconCommonConfig<Key> LeftJoycon = new LeftJoyconCommonConfig<Key>
{ {
DpadUp = Key.Up, DpadUp = Key.Up,
@@ -1127,7 +1128,7 @@ namespace Ryujinx.UI.Common.Configuration
Backend = InputBackendType.WindowKeyboard, Backend = InputBackendType.WindowKeyboard,
Id = "0", Id = "0",
PlayerIndex = PlayerIndex.Player1, PlayerIndex = PlayerIndex.Player1,
ControllerType = ControllerType.JoyconPair, ControllerType = ControllerType.ProController,
LeftJoycon = new LeftJoyconCommonConfig<Key> LeftJoycon = new LeftJoyconCommonConfig<Key>
{ {
DpadUp = Key.Up, DpadUp = Key.Up,
@@ -1513,6 +1514,15 @@ namespace Ryujinx.UI.Common.Configuration
configurationFileUpdated = true; configurationFileUpdated = true;
} }
if (configurationFileFormat.Version < 54)
{
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 54.");
configurationFileFormat.DramSize = MemoryConfiguration.MemoryConfiguration4GiB;
configurationFileUpdated = true;
}
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog; Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
Graphics.ResScale.Value = configurationFileFormat.ResScale; Graphics.ResScale.Value = configurationFileFormat.ResScale;
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom; Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
@@ -1559,7 +1569,7 @@ namespace Ryujinx.UI.Common.Configuration
System.AudioBackend.Value = configurationFileFormat.AudioBackend; System.AudioBackend.Value = configurationFileFormat.AudioBackend;
System.AudioVolume.Value = configurationFileFormat.AudioVolume; System.AudioVolume.Value = configurationFileFormat.AudioVolume;
System.MemoryManagerMode.Value = configurationFileFormat.MemoryManagerMode; System.MemoryManagerMode.Value = configurationFileFormat.MemoryManagerMode;
System.ExpandRam.Value = configurationFileFormat.ExpandRam; System.DramSize.Value = configurationFileFormat.DramSize;
System.IgnoreMissingServices.Value = configurationFileFormat.IgnoreMissingServices; System.IgnoreMissingServices.Value = configurationFileFormat.IgnoreMissingServices;
System.UseHypervisor.Value = configurationFileFormat.UseHypervisor; System.UseHypervisor.Value = configurationFileFormat.UseHypervisor;
UI.GuiColumns.FavColumn.Value = configurationFileFormat.GuiColumns.FavColumn; UI.GuiColumns.FavColumn.Value = configurationFileFormat.GuiColumns.FavColumn;

View File

@@ -14,8 +14,8 @@ namespace Ryujinx.UI.Common
public static class DiscordIntegrationModule public static class DiscordIntegrationModule
{ {
public static Timestamps StartedAt { get; set; } public static Timestamps StartedAt { get; set; }
private static readonly string _description = ReleaseInformation.IsValid private static readonly string _description = ReleaseInformation.IsValid
? $"v{ReleaseInformation.Version} {ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelRepo}@{ReleaseInformation.BuildGitHash}" ? $"v{ReleaseInformation.Version} {ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelRepo}@{ReleaseInformation.BuildGitHash}"
: "dev build"; : "dev build";
@@ -80,7 +80,7 @@ namespace Ryujinx.UI.Common
}, },
Details = TruncateToByteLength($"Playing {appMeta.Title}"), Details = TruncateToByteLength($"Playing {appMeta.Title}"),
State = appMeta.LastPlayed.HasValue && appMeta.TimePlayed.TotalSeconds > 5 State = appMeta.LastPlayed.HasValue && appMeta.TimePlayed.TotalSeconds > 5
? $"Total play time: {appMeta.TimePlayed.Humanize(2, false)}" ? $"Total play time: {appMeta.TimePlayed.Humanize(2, false)}"
: "Never played", : "Never played",
Timestamps = Timestamps.Now Timestamps = Timestamps.Now
}); });
@@ -120,7 +120,7 @@ namespace Ryujinx.UI.Common
_discordClient?.Dispose(); _discordClient?.Dispose();
} }
private static readonly string[] _discordGameAssetKeys = private static readonly string[] _discordGameAssetKeys =
[ [
"01002da013484000", // The Legend of Zelda: Skyward Sword HD "01002da013484000", // The Legend of Zelda: Skyward Sword HD
"01007ef00011e000", // The Legend of Zelda: Breath of the Wild "01007ef00011e000", // The Legend of Zelda: Breath of the Wild

View File

@@ -98,7 +98,6 @@ namespace Ryujinx.UI.Common.Helper
if (baseApplicationExtension is not (".nro" or ".nso")) if (baseApplicationExtension is not (".nro" or ".nso"))
return IsFirmwareValid(contentManager, out error); return IsFirmwareValid(contentManager, out error);
error = UserError.Success;
} }
error = UserError.ApplicationNotFound; error = UserError.ApplicationNotFound;

View File

@@ -9,7 +9,7 @@ namespace Ryujinx.UI.Common.Helper
{ {
if (activeProcess == null) if (activeProcess == null)
return string.Empty; return string.Empty;
string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}"; string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}";
string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}"; string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}";
string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})"; string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})";

View File

@@ -87,7 +87,8 @@ namespace Ryujinx.UI.Common.Helper
foreach (string path in titleUpdateMetadata.Paths) foreach (string path in titleUpdateMetadata.Paths)
{ {
if (!File.Exists(path)) continue; if (!File.Exists(path))
continue;
try try
{ {
@@ -104,7 +105,7 @@ namespace Ryujinx.UI.Common.Helper
if (controlNca is null || patchNca is null) if (controlNca is null || patchNca is null)
continue; continue;
ApplicationControlProperty controlData = new(); ApplicationControlProperty controlData = new();
using UniqueRef<IFile> nacpFile = new(); using UniqueRef<IFile> nacpFile = new();
@@ -144,7 +145,7 @@ namespace Ryujinx.UI.Common.Helper
return result; return result;
} }
private static string PathToGameUpdatesJson(ulong applicationIdBase) private static string PathToGameUpdatesJson(ulong applicationIdBase)
=> Path.Combine(AppDataManager.GamesDirPath, applicationIdBase.ToString("x16"), "updates.json"); => Path.Combine(AppDataManager.GamesDirPath, applicationIdBase.ToString("x16"), "updates.json");
} }
} }

View File

@@ -34,10 +34,10 @@ namespace Ryujinx.UI.Common.SystemInfo
{ {
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())
return new WindowsSystemInfo(); return new WindowsSystemInfo();
if (OperatingSystem.IsLinux()) if (OperatingSystem.IsLinux())
return new LinuxSystemInfo(); return new LinuxSystemInfo();
if (OperatingSystem.IsMacOS()) if (OperatingSystem.IsMacOS())
return new MacOSSystemInfo(); return new MacOSSystemInfo();

View File

@@ -22,8 +22,8 @@ namespace Ryujinx.Ava
public class App : Application public class App : Application
{ {
internal static string FormatTitle(LocaleKeys? windowTitleKey = null) internal static string FormatTitle(LocaleKeys? windowTitleKey = null)
=> windowTitleKey is null => windowTitleKey is null
? $"Ryujinx {Program.Version}" ? $"Ryujinx {Program.Version}"
: $"Ryujinx {Program.Version} - {LocaleManager.Instance[windowTitleKey.Value]}"; : $"Ryujinx {Program.Version} - {LocaleManager.Instance[windowTitleKey.Value]}";
public static MainWindow MainWindow => Current! public static MainWindow MainWindow => Current!

View File

@@ -541,7 +541,7 @@ namespace Ryujinx.Ava
{ {
if (Device.Processes != null) if (Device.Processes != null)
MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText); MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText);
ConfigurationState.Instance.System.IgnoreMissingServices.Event -= UpdateIgnoreMissingServicesState; ConfigurationState.Instance.System.IgnoreMissingServices.Event -= UpdateIgnoreMissingServicesState;
ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState; ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState;
@@ -786,7 +786,7 @@ namespace Ryujinx.Ava
return false; return false;
} }
ApplicationMetadata appMeta = ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText, ApplicationMetadata appMeta = ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText,
appMetadata => appMetadata.UpdatePreGame() appMetadata => appMetadata.UpdatePreGame()
); );
@@ -845,9 +845,7 @@ namespace Ryujinx.Ava
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}"); Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}");
// Initialize Configuration. // Initialize Configuration.
var memoryConfiguration = ConfigurationState.Instance.System.ExpandRam var memoryConfiguration = ConfigurationState.Instance.System.DramSize.Value;
? MemoryConfiguration.MemoryConfiguration8GiB
: MemoryConfiguration.MemoryConfiguration4GiB;
Device = new Switch(new HLEConfiguration( Device = new Switch(new HLEConfiguration(
VirtualFileSystem, VirtualFileSystem,
@@ -867,7 +865,7 @@ namespace Ryujinx.Ava
ConfigurationState.Instance.System.EnableInternetAccess, ConfigurationState.Instance.System.EnableInternetAccess,
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
ConfigurationState.Instance.System.FsGlobalAccessLogMode, ConfigurationState.Instance.System.FsGlobalAccessLogMode,
ConfigurationState.Instance.System.SystemTimeOffset, ConfigurationState.Instance.System.SystemTimeOffset,
ConfigurationState.Instance.System.TimeZone, ConfigurationState.Instance.System.TimeZone,
ConfigurationState.Instance.System.MemoryManagerMode, ConfigurationState.Instance.System.MemoryManagerMode,
ConfigurationState.Instance.System.IgnoreMissingServices, ConfigurationState.Instance.System.IgnoreMissingServices,

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "هاكات", "SettingsTabSystemHacks": "هاكات",
"SettingsTabSystemHacksNote": "قد يتسبب في عدم الاستقرار", "SettingsTabSystemHacksNote": "قد يتسبب في عدم الاستقرار",
"SettingsTabSystemExpandDramSize": "استخدام تخطيط الذاكرة البديل (المطورين)", "SettingsTabSystemDramSize": "استخدام تخطيط الذاكرة البديل (المطورين)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "تجاهل الخدمات المفقودة", "SettingsTabSystemIgnoreMissingServices": "تجاهل الخدمات المفقودة",
"SettingsTabGraphics": "الرسومات", "SettingsTabGraphics": "الرسومات",
"SettingsTabGraphicsAPI": "API الرسومات ", "SettingsTabGraphicsAPI": "API الرسومات ",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Hacks", "SettingsTabSystemHacks": "Hacks",
"SettingsTabSystemHacksNote": " (Kann Fehler verursachen)", "SettingsTabSystemHacksNote": " (Kann Fehler verursachen)",
"SettingsTabSystemExpandDramSize": "Erweitere DRAM Größe auf 6GiB", "SettingsTabSystemDramSize": "DRAM Größe:",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Ignoriere fehlende Dienste", "SettingsTabSystemIgnoreMissingServices": "Ignoriere fehlende Dienste",
"SettingsTabGraphics": "Grafik", "SettingsTabGraphics": "Grafik",
"SettingsTabGraphicsAPI": "Grafik-API", "SettingsTabGraphicsAPI": "Grafik-API",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Μικροδιορθώσεις", "SettingsTabSystemHacks": "Μικροδιορθώσεις",
"SettingsTabSystemHacksNote": " (Μπορεί να προκαλέσουν αστάθεια)", "SettingsTabSystemHacksNote": " (Μπορεί να προκαλέσουν αστάθεια)",
"SettingsTabSystemExpandDramSize": "Επέκταση μεγέθους DRAM στα 6GiB", "SettingsTabSystemDramSize": "Μέγεθος DRAM:",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Αγνόηση υπηρεσιών που λείπουν", "SettingsTabSystemIgnoreMissingServices": "Αγνόηση υπηρεσιών που λείπουν",
"SettingsTabGraphics": "Γραφικά", "SettingsTabGraphics": "Γραφικά",
"SettingsTabGraphicsAPI": "API Γραφικά", "SettingsTabGraphicsAPI": "API Γραφικά",

View File

@@ -149,7 +149,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Hacks", "SettingsTabSystemHacks": "Hacks",
"SettingsTabSystemHacksNote": "May cause instability", "SettingsTabSystemHacksNote": "May cause instability",
"SettingsTabSystemExpandDramSize": "Expand DRAM to 8GiB", "SettingsTabSystemDramSize": "DRAM size:",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Ignore Missing Services", "SettingsTabSystemIgnoreMissingServices": "Ignore Missing Services",
"SettingsTabGraphics": "Graphics", "SettingsTabGraphics": "Graphics",
"SettingsTabGraphicsAPI": "Graphics API", "SettingsTabGraphicsAPI": "Graphics API",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Hacks", "SettingsTabSystemHacks": "Hacks",
"SettingsTabSystemHacksNote": " (Pueden causar inestabilidad)", "SettingsTabSystemHacksNote": " (Pueden causar inestabilidad)",
"SettingsTabSystemExpandDramSize": "Usar diseño alternativo de memoria (Desarrolladores)", "SettingsTabSystemDramSize": "Tamaño DRAM:",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Ignorar servicios no implementados", "SettingsTabSystemIgnoreMissingServices": "Ignorar servicios no implementados",
"SettingsTabGraphics": "Gráficos", "SettingsTabGraphics": "Gráficos",
"SettingsTabGraphicsAPI": "API de gráficos", "SettingsTabGraphicsAPI": "API de gráficos",

View File

@@ -149,7 +149,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Hacks", "SettingsTabSystemHacks": "Hacks",
"SettingsTabSystemHacksNote": "Cela peut causer des instabilités", "SettingsTabSystemHacksNote": "Cela peut causer des instabilités",
"SettingsTabSystemExpandDramSize": "Étendre la mémoire à 8GiO", "SettingsTabSystemDramSize": "Taille de la DRAM:",
"SettingsTabSystemDramSize4GiB": "4GiO",
"SettingsTabSystemDramSize6GiB": "6GiO",
"SettingsTabSystemDramSize8GiB": "8GiO",
"SettingsTabSystemDramSize12GiB": "12GiO",
"SettingsTabSystemIgnoreMissingServices": "Ignorer les services manquants", "SettingsTabSystemIgnoreMissingServices": "Ignorer les services manquants",
"SettingsTabGraphics": "Graphismes", "SettingsTabGraphics": "Graphismes",
"SettingsTabGraphicsAPI": "API Graphique", "SettingsTabGraphicsAPI": "API Graphique",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "האצות", "SettingsTabSystemHacks": "האצות",
"SettingsTabSystemHacksNote": "עלול לגרום לאי יציבות", "SettingsTabSystemHacksNote": "עלול לגרום לאי יציבות",
"SettingsTabSystemExpandDramSize": "השתמש בפריסת זיכרון חלופית (נועד למפתחים)", "SettingsTabSystemDramSize": "השתמש בפריסת זיכרון חלופית (נועד למפתחים)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "התעלם משירותים חסרים", "SettingsTabSystemIgnoreMissingServices": "התעלם משירותים חסרים",
"SettingsTabGraphics": "גרפיקה", "SettingsTabGraphics": "גרפיקה",
"SettingsTabGraphicsAPI": "ממשק גראפי", "SettingsTabGraphicsAPI": "ממשק גראפי",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Espedienti", "SettingsTabSystemHacks": "Espedienti",
"SettingsTabSystemHacksNote": "Possono causare instabilità", "SettingsTabSystemHacksNote": "Possono causare instabilità",
"SettingsTabSystemExpandDramSize": "Usa layout di memoria alternativo (per sviluppatori)", "SettingsTabSystemDramSize": "Usa layout di memoria alternativo (per sviluppatori)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Ignora servizi mancanti", "SettingsTabSystemIgnoreMissingServices": "Ignora servizi mancanti",
"SettingsTabGraphics": "Grafica", "SettingsTabGraphics": "Grafica",
"SettingsTabGraphicsAPI": "API grafica", "SettingsTabGraphicsAPI": "API grafica",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "ハック", "SettingsTabSystemHacks": "ハック",
"SettingsTabSystemHacksNote": " (挙動が不安定になる可能性があります)", "SettingsTabSystemHacksNote": " (挙動が不安定になる可能性があります)",
"SettingsTabSystemExpandDramSize": "DRAMサイズを6GiBに拡大する", "SettingsTabSystemDramSize": "DRAMサイズ:",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "未実装サービスを無視する", "SettingsTabSystemIgnoreMissingServices": "未実装サービスを無視する",
"SettingsTabGraphics": "グラフィックス", "SettingsTabGraphics": "グラフィックス",
"SettingsTabGraphicsAPI": "グラフィックスAPI", "SettingsTabGraphicsAPI": "グラフィックスAPI",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "해킹", "SettingsTabSystemHacks": "해킹",
"SettingsTabSystemHacksNote": "불안정성을 유발할 수 있음", "SettingsTabSystemHacksNote": "불안정성을 유발할 수 있음",
"SettingsTabSystemExpandDramSize": "대체 메모리 레이아웃 사용(개발자)", "SettingsTabSystemDramSize": "대체 메모리 레이아웃 사용(개발자)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "누락된 서비스 무시", "SettingsTabSystemIgnoreMissingServices": "누락된 서비스 무시",
"SettingsTabGraphics": "그래픽", "SettingsTabGraphics": "그래픽",
"SettingsTabGraphicsAPI": "그래픽 API", "SettingsTabGraphicsAPI": "그래픽 API",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Hacki", "SettingsTabSystemHacks": "Hacki",
"SettingsTabSystemHacksNote": " (mogą powodować niestabilność)", "SettingsTabSystemHacksNote": " (mogą powodować niestabilność)",
"SettingsTabSystemExpandDramSize": "Użyj alternatywnego układu pamięci (Deweloperzy)", "SettingsTabSystemDramSize": "Użyj alternatywnego układu pamięci (Deweloperzy)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Ignoruj Brakujące Usługi", "SettingsTabSystemIgnoreMissingServices": "Ignoruj Brakujące Usługi",
"SettingsTabGraphics": "Grafika", "SettingsTabGraphics": "Grafika",
"SettingsTabGraphicsAPI": "Graficzne API", "SettingsTabGraphicsAPI": "Graficzne API",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Hacks", "SettingsTabSystemHacks": "Hacks",
"SettingsTabSystemHacksNote": " (Pode causar instabilidade)", "SettingsTabSystemHacksNote": " (Pode causar instabilidade)",
"SettingsTabSystemExpandDramSize": "Expandir memória para 6GiB", "SettingsTabSystemDramSize": "Tamanho da DRAM:",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Ignorar serviços não implementados", "SettingsTabSystemIgnoreMissingServices": "Ignorar serviços não implementados",
"SettingsTabGraphics": "Gráficos", "SettingsTabGraphics": "Gráficos",
"SettingsTabGraphicsAPI": "API gráfica", "SettingsTabGraphicsAPI": "API gráfica",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Хаки", "SettingsTabSystemHacks": "Хаки",
"SettingsTabSystemHacksNote": "Возможна нестабильная работа", "SettingsTabSystemHacksNote": "Возможна нестабильная работа",
"SettingsTabSystemExpandDramSize": "Использовать альтернативный макет памяти (для разработчиков)", "SettingsTabSystemDramSize": "Использовать альтернативный макет памяти (для разработчиков)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Игнорировать отсутствующие службы", "SettingsTabSystemIgnoreMissingServices": "Игнорировать отсутствующие службы",
"SettingsTabGraphics": "Графика", "SettingsTabGraphics": "Графика",
"SettingsTabGraphicsAPI": "Графические API", "SettingsTabGraphicsAPI": "Графические API",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "แฮ็ก", "SettingsTabSystemHacks": "แฮ็ก",
"SettingsTabSystemHacksNote": "อาจทำให้เกิดข้อผิดพลาดได้", "SettingsTabSystemHacksNote": "อาจทำให้เกิดข้อผิดพลาดได้",
"SettingsTabSystemExpandDramSize": "ใช้รูปแบบหน่วยความจำสำรอง (โหมดนักพัฒนา)", "SettingsTabSystemDramSize": "ใช้รูปแบบหน่วยความจำสำรอง (โหมดนักพัฒนา)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "ไม่สนใจบริการที่ขาดหายไป", "SettingsTabSystemIgnoreMissingServices": "ไม่สนใจบริการที่ขาดหายไป",
"SettingsTabGraphics": "กราฟิก", "SettingsTabGraphics": "กราฟิก",
"SettingsTabGraphicsAPI": "กราฟฟิก API", "SettingsTabGraphicsAPI": "กราฟฟิก API",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Hack'ler", "SettingsTabSystemHacks": "Hack'ler",
"SettingsTabSystemHacksNote": " (dengesizlik oluşturabilir)", "SettingsTabSystemHacksNote": " (dengesizlik oluşturabilir)",
"SettingsTabSystemExpandDramSize": "Alternatif bellek düzeni kullan (Geliştirici)", "SettingsTabSystemDramSize": "Alternatif bellek düzeni kullan (Geliştirici)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Eksik Servisleri Görmezden Gel", "SettingsTabSystemIgnoreMissingServices": "Eksik Servisleri Görmezden Gel",
"SettingsTabGraphics": "Grafikler", "SettingsTabGraphics": "Grafikler",
"SettingsTabGraphicsAPI": "Grafikler API", "SettingsTabGraphicsAPI": "Grafikler API",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "Хитрощі", "SettingsTabSystemHacks": "Хитрощі",
"SettingsTabSystemHacksNote": " (може викликати нестабільність)", "SettingsTabSystemHacksNote": " (може викликати нестабільність)",
"SettingsTabSystemExpandDramSize": "Використовувати альтернативне розташування пам'яті (розробники)", "SettingsTabSystemDramSize": "Використовувати альтернативне розташування пам'яті (розробники)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "Ігнорувати відсутні служби", "SettingsTabSystemIgnoreMissingServices": "Ігнорувати відсутні служби",
"SettingsTabGraphics": "Графіка", "SettingsTabGraphics": "Графіка",
"SettingsTabGraphicsAPI": "Графічний API", "SettingsTabGraphicsAPI": "Графічний API",

View File

@@ -10,7 +10,10 @@
"SettingsTabSystemUseHypervisor": "使用 Hypervisor 虚拟化", "SettingsTabSystemUseHypervisor": "使用 Hypervisor 虚拟化",
"MenuBarFile": "文件(_F)", "MenuBarFile": "文件(_F)",
"MenuBarFileOpenFromFile": "加载游戏文件(_L)", "MenuBarFileOpenFromFile": "加载游戏文件(_L)",
"MenuBarFileOpenFromFileError": "未发现应用",
"MenuBarFileOpenUnpacked": "加载解包后的游戏(_U)", "MenuBarFileOpenUnpacked": "加载解包后的游戏(_U)",
"MenuBarFileLoadDlcFromFolder": "从文件夹加载DLC",
"MenuBarFileLoadTitleUpdatesFromFolder": "从文件夹加载游戏更新",
"MenuBarFileOpenEmuFolder": "打开 Ryujinx 系统目录", "MenuBarFileOpenEmuFolder": "打开 Ryujinx 系统目录",
"MenuBarFileOpenLogsFolder": "打开日志目录", "MenuBarFileOpenLogsFolder": "打开日志目录",
"MenuBarFileExit": "退出(_E)", "MenuBarFileExit": "退出(_E)",
@@ -102,8 +105,9 @@
"SettingsTabGeneralHideCursorOnIdle": "自动隐藏", "SettingsTabGeneralHideCursorOnIdle": "自动隐藏",
"SettingsTabGeneralHideCursorAlways": "始终隐藏", "SettingsTabGeneralHideCursorAlways": "始终隐藏",
"SettingsTabGeneralGameDirectories": "游戏目录", "SettingsTabGeneralGameDirectories": "游戏目录",
"SettingsTabGeneralAutoloadDirectories": "自动加载DLC/游戏更新目录",
"SettingsTabGeneralAdd": "添加", "SettingsTabGeneralAdd": "添加",
"SettingsTabGeneralRemove": "删除", "SettingsTabGeneralRemove": "删除",
"SettingsTabSystem": "系统", "SettingsTabSystem": "系统",
"SettingsTabSystemCore": "核心", "SettingsTabSystemCore": "核心",
"SettingsTabSystemSystemRegion": "系统区域:", "SettingsTabSystemSystemRegion": "系统区域:",
@@ -145,7 +149,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "修改", "SettingsTabSystemHacks": "修改",
"SettingsTabSystemHacksNote": "会导致模拟器不稳定", "SettingsTabSystemHacksNote": "会导致模拟器不稳定",
"SettingsTabSystemExpandDramSize": "使用开发机的内存布局(开发人员使用)", "SettingsTabSystemDramSize": "使用开发机的内存布局(开发人员使用)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "忽略缺失的服务", "SettingsTabSystemIgnoreMissingServices": "忽略缺失的服务",
"SettingsTabGraphics": "图形", "SettingsTabGraphics": "图形",
"SettingsTabGraphicsAPI": "图形 API", "SettingsTabGraphicsAPI": "图形 API",
@@ -405,6 +413,7 @@
"GameListContextMenuToggleFavorite": "收藏", "GameListContextMenuToggleFavorite": "收藏",
"GameListContextMenuToggleFavoriteToolTip": "切换游戏的收藏状态", "GameListContextMenuToggleFavoriteToolTip": "切换游戏的收藏状态",
"SettingsTabGeneralTheme": "主题:", "SettingsTabGeneralTheme": "主题:",
"SettingsTabGeneralThemeAuto": "自动",
"SettingsTabGeneralThemeDark": "深色(暗黑)", "SettingsTabGeneralThemeDark": "深色(暗黑)",
"SettingsTabGeneralThemeLight": "浅色(亮色)", "SettingsTabGeneralThemeLight": "浅色(亮色)",
"ControllerSettingsConfigureGeneral": "配置", "ControllerSettingsConfigureGeneral": "配置",
@@ -555,6 +564,9 @@
"AddGameDirBoxTooltip": "输入要添加的游戏目录", "AddGameDirBoxTooltip": "输入要添加的游戏目录",
"AddGameDirTooltip": "添加游戏目录到列表中", "AddGameDirTooltip": "添加游戏目录到列表中",
"RemoveGameDirTooltip": "移除选中的目录", "RemoveGameDirTooltip": "移除选中的目录",
"AddAutoloadDirBoxTooltip": "输入需要添加到列表中的自动加载目录",
"AddAutoloadDirTooltip": "添加一个自动加载目录到列表中",
"RemoveAutoloadDirTooltip": "移除被选中的自动加载目录",
"CustomThemeCheckTooltip": "使用自定义的 Avalonia 主题作为模拟器菜单的外观", "CustomThemeCheckTooltip": "使用自定义的 Avalonia 主题作为模拟器菜单的外观",
"CustomThemePathTooltip": "自定义主题的目录", "CustomThemePathTooltip": "自定义主题的目录",
"CustomThemeBrowseTooltip": "查找自定义主题", "CustomThemeBrowseTooltip": "查找自定义主题",
@@ -567,7 +579,7 @@
"TimeTooltip": "更改系统时间", "TimeTooltip": "更改系统时间",
"VSyncToggleTooltip": "模拟控制台的垂直同步,开启后会降低大部分游戏的帧率。关闭后,可以获得更高的帧率,但也可能导致游戏画面加载耗时更长或卡住。\n\n在游戏中可以使用热键进行切换默认为 F1 键)。\n\n如果不确定请保持开启状态。", "VSyncToggleTooltip": "模拟控制台的垂直同步,开启后会降低大部分游戏的帧率。关闭后,可以获得更高的帧率,但也可能导致游戏画面加载耗时更长或卡住。\n\n在游戏中可以使用热键进行切换默认为 F1 键)。\n\n如果不确定请保持开启状态。",
"PptcToggleTooltip": "缓存已编译的游戏指令,这样每次游戏加载时就无需重新编译。\n\n可以减少卡顿和启动时间提高游戏响应速度。\n\n如果不确定请保持开启状态。", "PptcToggleTooltip": "缓存已编译的游戏指令,这样每次游戏加载时就无需重新编译。\n\n可以减少卡顿和启动时间提高游戏响应速度。\n\n如果不确定请保持开启状态。",
"LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", "LowPowerPptcToggleTooltip": "使用三分之一的核心数加载PPTC.",
"FsIntegrityToggleTooltip": "启动游戏时检查游戏文件的完整性,并在日志中记录损坏的文件。\n\n对性能没有影响用于排查故障。\n\n如果不确定请保持开启状态。", "FsIntegrityToggleTooltip": "启动游戏时检查游戏文件的完整性,并在日志中记录损坏的文件。\n\n对性能没有影响用于排查故障。\n\n如果不确定请保持开启状态。",
"AudioBackendTooltip": "更改音频处理引擎。\n\n推荐选择“SDL2”另外“OpenAL”和“SoundIO”可以作为备选选择“无”将没有声音。\n\n如果不确定请设置为“SDL2”。", "AudioBackendTooltip": "更改音频处理引擎。\n\n推荐选择“SDL2”另外“OpenAL”和“SoundIO”可以作为备选选择“无”将没有声音。\n\n如果不确定请设置为“SDL2”。",
"MemoryManagerTooltip": "更改模拟器内存映射和访问的方式,对模拟器 CPU 的性能影响很大。\n\n如果不确定请设置为“跳过检查的本机映射”。", "MemoryManagerTooltip": "更改模拟器内存映射和访问的方式,对模拟器 CPU 的性能影响很大。\n\n如果不确定请设置为“跳过检查的本机映射”。",
@@ -599,6 +611,8 @@
"DebugLogTooltip": "在控制台中显示调试日志。\n\n仅在特别需要时使用此功能因为它会导致日志信息难以阅读并降低模拟器性能。", "DebugLogTooltip": "在控制台中显示调试日志。\n\n仅在特别需要时使用此功能因为它会导致日志信息难以阅读并降低模拟器性能。",
"LoadApplicationFileTooltip": "选择 Switch 游戏文件并加载", "LoadApplicationFileTooltip": "选择 Switch 游戏文件并加载",
"LoadApplicationFolderTooltip": "选择解包后的 Switch 游戏目录并加载", "LoadApplicationFolderTooltip": "选择解包后的 Switch 游戏目录并加载",
"LoadDlcFromFolderTooltip": "打开文件资源管理器以选择一个或多个文件夹来批量加载DLC。",
"LoadTitleUpdatesFromFolderTooltip": "打开文件资源管理器以选择一个或多个文件夹来批量加载游戏更新。",
"OpenRyujinxFolderTooltip": "打开 Ryujinx 模拟器系统目录", "OpenRyujinxFolderTooltip": "打开 Ryujinx 模拟器系统目录",
"OpenRyujinxLogsTooltip": "打开日志存放的目录", "OpenRyujinxLogsTooltip": "打开日志存放的目录",
"ExitTooltip": "退出 Ryujinx 模拟器", "ExitTooltip": "退出 Ryujinx 模拟器",
@@ -650,6 +664,8 @@
"OpenSetupGuideMessage": "打开安装指南", "OpenSetupGuideMessage": "打开安装指南",
"NoUpdate": "无更新(或不加载游戏更新)", "NoUpdate": "无更新(或不加载游戏更新)",
"TitleUpdateVersionLabel": "游戏更新的版本 {0}", "TitleUpdateVersionLabel": "游戏更新的版本 {0}",
"TitleBundledUpdateVersionLabel": "捆绑:版本 {0}",
"TitleBundledDlcLabel": "捆绑:",
"RyujinxInfo": "Ryujinx - 信息", "RyujinxInfo": "Ryujinx - 信息",
"RyujinxConfirm": "Ryujinx - 确认", "RyujinxConfirm": "Ryujinx - 确认",
"FileDialogAllTypes": "全部类型", "FileDialogAllTypes": "全部类型",
@@ -707,10 +723,17 @@
"DlcWindowTitle": "管理 {0} ({1}) 的 DLC", "DlcWindowTitle": "管理 {0} ({1}) 的 DLC",
"ModWindowTitle": "管理 {0} ({1}) 的 MOD", "ModWindowTitle": "管理 {0} ({1}) 的 MOD",
"UpdateWindowTitle": "游戏更新管理器", "UpdateWindowTitle": "游戏更新管理器",
"UpdateWindowUpdateAddedMessage": "{0} 个更新被添加",
"UpdateWindowBundledContentNotice": "捆绑的更新无法被移除,只可被禁用。",
"CheatWindowHeading": "适用于 {0} [{1}] 的金手指", "CheatWindowHeading": "适用于 {0} [{1}] 的金手指",
"BuildId": "游戏版本 ID", "BuildId": "游戏版本 ID",
"DlcWindowBundledContentNotice": "捆绑的DLC无法被移除只可被禁用。",
"DlcWindowHeading": "{0} 个 DLC", "DlcWindowHeading": "{0} 个 DLC",
"ModWindowHeading": "{0} 个 MOD", "DlcWindowDlcAddedMessage": "{0} 个DLC被添加",
"AutoloadDlcAddedMessage": "{0} 个DLC被添加",
"AutoloadUpdateAddedMessage": "{0} 个游戏更新被添加",
"AutoloadDlcAndUpdateAddedMessage": "{0} 个DLC和{1} 个游戏更新被添加",
"ModWindowHeading": "{0} Mod(s)",
"UserProfilesEditProfile": "编辑所选", "UserProfilesEditProfile": "编辑所选",
"Cancel": "取消", "Cancel": "取消",
"Save": "保存", "Save": "保存",
@@ -756,10 +779,11 @@
"GraphicsAATooltip": "抗锯齿是一种图形处理技术,用于减少图像边缘的锯齿状现象,使图像更加平滑。\n\nFXAA快速近似抗锯齿是一种性能开销相对较小的抗锯齿方法但可能会使得整体图像看起来有些模糊。\n\nSMAA增强型子像素抗锯齿则更加精细它会尝试找到锯齿边缘并平滑它们相比 FXAA 有更好的图像质量,但性能开销可能会稍大一些。\n\n如果开启了 FSRFidelityFX Super Resolution超级分辨率锐画技术来提高性能或图像质量不建议再启用抗锯齿因为它们会产生不必要的图形处理开销或者相互之间效果不协调。\n\n在游戏运行时通过点击下面的“应用”按钮可以使设置生效你可以将设置窗口移开并试验找到您喜欢的游戏画面效果。\n\n如果不确定请保持为“无”。", "GraphicsAATooltip": "抗锯齿是一种图形处理技术,用于减少图像边缘的锯齿状现象,使图像更加平滑。\n\nFXAA快速近似抗锯齿是一种性能开销相对较小的抗锯齿方法但可能会使得整体图像看起来有些模糊。\n\nSMAA增强型子像素抗锯齿则更加精细它会尝试找到锯齿边缘并平滑它们相比 FXAA 有更好的图像质量,但性能开销可能会稍大一些。\n\n如果开启了 FSRFidelityFX Super Resolution超级分辨率锐画技术来提高性能或图像质量不建议再启用抗锯齿因为它们会产生不必要的图形处理开销或者相互之间效果不协调。\n\n在游戏运行时通过点击下面的“应用”按钮可以使设置生效你可以将设置窗口移开并试验找到您喜欢的游戏画面效果。\n\n如果不确定请保持为“无”。",
"GraphicsAALabel": "抗锯齿:", "GraphicsAALabel": "抗锯齿:",
"GraphicsScalingFilterLabel": "缩放过滤:", "GraphicsScalingFilterLabel": "缩放过滤:",
"GraphicsScalingFilterTooltip": "选择在分辨率缩放时将使用的缩放过滤器。\n\nBilinear双线性过滤对于3D游戏效果较好是一个安全的默认选项。\n\nNearest最近邻过滤推荐用于像素艺术游戏。\n\nFSR超级分辨率锐画只是一个锐化过滤器不推荐与 FXAA 或 SMAA 抗锯齿一起使用。\n\n在游戏运行时通过点击下面的“应用”按钮可以使设置生效你可以将设置窗口移开并试验找到您喜欢的游戏画面效果。\n\n如果不确定请保持为“Bilinear双线性过滤”。", "GraphicsScalingFilterTooltip": "选择在分辨率缩放时将使用的缩放过滤器。\n\nBilinear双线性过滤对于3D游戏效果较好是一个安全的默认选项。\n\nNearest最近邻过滤推荐用于像素艺术游戏。\n\nFSR超级分辨率锐画只是一个锐化过滤器不推荐与 FXAA 或 SMAA 抗锯齿一起使用。\n\nArea局部过滤当渲染分辨率大于窗口实际分辨率推荐该选项。该选项在渲染比例大于2.0的情况下,可以实现超采样的效果。\n\n在游戏运行时通过点击下面的“应用”按钮可以使设置生效你可以将设置窗口移开并试验找到您喜欢的游戏画面效果。\n\n如果不确定请保持为“Bilinear双线性过滤”。",
"GraphicsScalingFilterBilinear": "Bilinear双线性过滤", "GraphicsScalingFilterBilinear": "Bilinear双线性过滤",
"GraphicsScalingFilterNearest": "Nearest最近邻过滤", "GraphicsScalingFilterNearest": "Nearest最近邻过滤",
"GraphicsScalingFilterFsr": "FSR超级分辨率锐画技术", "GraphicsScalingFilterFsr": "FSR超级分辨率锐画技术",
"GraphicsScalingFilterArea": "Area局部过滤",
"GraphicsScalingFilterLevelLabel": "等级", "GraphicsScalingFilterLevelLabel": "等级",
"GraphicsScalingFilterLevelTooltip": "设置 FSR 1.0 的锐化等级,数值越高,图像越锐利。", "GraphicsScalingFilterLevelTooltip": "设置 FSR 1.0 的锐化等级,数值越高,图像越锐利。",
"SmaaLow": "SMAA 低质量", "SmaaLow": "SMAA 低质量",

View File

@@ -145,7 +145,11 @@
"SettingsTabSystemAudioBackendSDL2": "SDL2", "SettingsTabSystemAudioBackendSDL2": "SDL2",
"SettingsTabSystemHacks": "補釘修正", "SettingsTabSystemHacks": "補釘修正",
"SettingsTabSystemHacksNote": "可能導致模擬器不穩定", "SettingsTabSystemHacksNote": "可能導致模擬器不穩定",
"SettingsTabSystemExpandDramSize": "使用替代的記憶體配置 (開發者專用)", "SettingsTabSystemDramSize": "使用替代的記憶體配置 (開發者專用)",
"SettingsTabSystemDramSize4GiB": "4GiB",
"SettingsTabSystemDramSize6GiB": "6GiB",
"SettingsTabSystemDramSize8GiB": "8GiB",
"SettingsTabSystemDramSize12GiB": "12GiB",
"SettingsTabSystemIgnoreMissingServices": "忽略缺少的模擬器功能", "SettingsTabSystemIgnoreMissingServices": "忽略缺少的模擬器功能",
"SettingsTabGraphics": "圖形", "SettingsTabGraphics": "圖形",
"SettingsTabGraphicsAPI": "圖形 API", "SettingsTabGraphicsAPI": "圖形 API",

View File

@@ -21,7 +21,8 @@ namespace Ryujinx.Ava.Common.Locale
new CompiledBindingPathBuilder() new CompiledBindingPathBuilder()
.Property(PropertyInfo, PropertyInfoAccessorFactory.CreateInpcPropertyAccessor) .Property(PropertyInfo, PropertyInfoAccessorFactory.CreateInpcPropertyAccessor)
.Build() .Build()
) { Source = LocaleManager.Instance } )
{ Source = LocaleManager.Instance }
.ProvideValue(serviceProvider); .ProvideValue(serviceProvider);
} }
} }

View File

@@ -80,8 +80,8 @@ namespace Ryujinx.Ava.Common.Locale
} }
// If the locale doesn't contain the key return the default one. // If the locale doesn't contain the key return the default one.
return _localeDefaultStrings.TryGetValue(key, out string defaultValue) return _localeDefaultStrings.TryGetValue(key, out string defaultValue)
? defaultValue ? defaultValue
: key.ToString(); // If the locale text doesn't exist return the key. : key.ToString(); // If the locale text doesn't exist return the key.
} }
set set

View File

@@ -72,23 +72,23 @@ namespace Ryujinx.Ava
EnableMultiTouch = true, EnableMultiTouch = true,
EnableIme = true, EnableIme = true,
EnableInputFocusProxy = Environment.GetEnvironmentVariable("XDG_CURRENT_DESKTOP") == "gamescope", EnableInputFocusProxy = Environment.GetEnvironmentVariable("XDG_CURRENT_DESKTOP") == "gamescope",
RenderingMode = UseHardwareAcceleration RenderingMode = UseHardwareAcceleration
? [ X11RenderingMode.Glx, X11RenderingMode.Software ] ? [X11RenderingMode.Glx, X11RenderingMode.Software]
: [ X11RenderingMode.Software ], : [X11RenderingMode.Software],
}) })
.With(new Win32PlatformOptions .With(new Win32PlatformOptions
{ {
WinUICompositionBackdropCornerRadius = 8.0f, WinUICompositionBackdropCornerRadius = 8.0f,
RenderingMode = UseHardwareAcceleration RenderingMode = UseHardwareAcceleration
? [ Win32RenderingMode.AngleEgl, Win32RenderingMode.Software ] ? [Win32RenderingMode.AngleEgl, Win32RenderingMode.Software]
: [ Win32RenderingMode.Software ], : [Win32RenderingMode.Software],
}); });
private static void Initialize(string[] args) private static void Initialize(string[] args)
{ {
// Ensure Discord presence timestamp begins at the absolute start of when Ryujinx is launched // Ensure Discord presence timestamp begins at the absolute start of when Ryujinx is launched
DiscordIntegrationModule.StartedAt = Timestamps.Now; DiscordIntegrationModule.StartedAt = Timestamps.Now;
// Parse arguments // Parse arguments
CommandLineState.ParseArguments(args); CommandLineState.ParseArguments(args);
@@ -203,7 +203,7 @@ namespace Ryujinx.Ava
// Check if docked mode was overriden. // Check if docked mode was overriden.
if (CommandLineState.OverrideDockedMode.HasValue) if (CommandLineState.OverrideDockedMode.HasValue)
ConfigurationState.Instance.System.EnableDockedMode.Value = CommandLineState.OverrideDockedMode.Value; ConfigurationState.Instance.System.EnableDockedMode.Value = CommandLineState.OverrideDockedMode.Value;
// Check if HideCursor was overridden. // Check if HideCursor was overridden.
if (CommandLineState.OverrideHideCursor is not null) if (CommandLineState.OverrideHideCursor is not null)
@@ -214,7 +214,7 @@ namespace Ryujinx.Ava
"always" => HideCursorMode.Always, "always" => HideCursorMode.Always,
_ => ConfigurationState.Instance.HideCursor, _ => ConfigurationState.Instance.HideCursor,
}; };
// Check if hardware-acceleration was overridden. // Check if hardware-acceleration was overridden.
if (CommandLineState.OverrideHardwareAcceleration != null) if (CommandLineState.OverrideHardwareAcceleration != null)

View File

@@ -136,7 +136,7 @@ namespace Ryujinx.Ava.UI.Applet
_hiddenTextBox.CaretIndex = cursorBegin; _hiddenTextBox.CaretIndex = cursorBegin;
}); });
public void SetText(string text, int cursorBegin, int cursorEnd) => public void SetText(string text, int cursorBegin, int cursorEnd) =>
Dispatcher.UIThread.Post(() => Dispatcher.UIThread.Post(() =>
{ {
_hiddenTextBox.Text = text; _hiddenTextBox.Text = text;

View File

@@ -224,7 +224,7 @@ namespace Ryujinx.Ava.UI.Controls
{ {
if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
return; return;
string ptcDir = Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu"); string ptcDir = Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu");
string mainDir = Path.Combine(ptcDir, "0"); string mainDir = Path.Combine(ptcDir, "0");
string backupDir = Path.Combine(ptcDir, "1"); string backupDir = Path.Combine(ptcDir, "1");

View File

@@ -199,7 +199,7 @@ namespace Ryujinx.Ava.UI.Helpers
string secondaryText, string secondaryText,
string acceptButton, string acceptButton,
string closeButton, string closeButton,
string title) string title)
=> ShowTextDialog( => ShowTextDialog(
title, title,
primary, primary,
@@ -215,7 +215,7 @@ namespace Ryujinx.Ava.UI.Helpers
string acceptButtonText, string acceptButtonText,
string cancelButtonText, string cancelButtonText,
string title, string title,
UserResult primaryButtonResult = UserResult.Yes) UserResult primaryButtonResult = UserResult.Yes)
=> await ShowTextDialog( => await ShowTextDialog(
string.IsNullOrWhiteSpace(title) ? LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle] : title, string.IsNullOrWhiteSpace(title) ? LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle] : title,
primaryText, primaryText,
@@ -226,7 +226,7 @@ namespace Ryujinx.Ava.UI.Helpers
(int)Symbol.Help, (int)Symbol.Help,
primaryButtonResult); primaryButtonResult);
internal static async Task<UserResult> CreateLocalizedConfirmationDialog(string primaryText, string secondaryText) internal static async Task<UserResult> CreateLocalizedConfirmationDialog(string primaryText, string secondaryText)
=> await CreateConfirmationDialog( => await CreateConfirmationDialog(
primaryText, primaryText,
secondaryText, secondaryText,
@@ -234,7 +234,7 @@ namespace Ryujinx.Ava.UI.Helpers
LocaleManager.Instance[LocaleKeys.InputDialogNo], LocaleManager.Instance[LocaleKeys.InputDialogNo],
LocaleManager.Instance[LocaleKeys.RyujinxConfirm]); LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
internal static async Task CreateUpdaterInfoDialog(string primary, string secondaryText) internal static async Task CreateUpdaterInfoDialog(string primary, string secondaryText)
=> await ShowTextDialog( => await ShowTextDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle], LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle],
primary, primary,
@@ -244,7 +244,7 @@ namespace Ryujinx.Ava.UI.Helpers
LocaleManager.Instance[LocaleKeys.InputDialogOk], LocaleManager.Instance[LocaleKeys.InputDialogOk],
(int)Symbol.Important); (int)Symbol.Important);
internal static async Task CreateWarningDialog(string primary, string secondaryText) internal static async Task CreateWarningDialog(string primary, string secondaryText)
=> await ShowTextDialog( => await ShowTextDialog(
LocaleManager.Instance[LocaleKeys.DialogWarningTitle], LocaleManager.Instance[LocaleKeys.DialogWarningTitle],
primary, primary,

View File

@@ -39,8 +39,8 @@ namespace Ryujinx.Ava.UI.Helpers
await ContentDialogHelper.CreateInfoDialog( await ContentDialogHelper.CreateInfoDialog(
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogMessage, errorCode, GetErrorTitle(error)), LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogMessage, errorCode, GetErrorTitle(error)),
GetErrorDescription(error), GetErrorDescription(error),
"", "",
LocaleManager.Instance[LocaleKeys.InputDialogOk], LocaleManager.Instance[LocaleKeys.InputDialogOk],
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogTitle, errorCode)); LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogTitle, errorCode));
} }

View File

@@ -45,7 +45,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
private PlayerIndex _playerId; private PlayerIndex _playerId;
private int _controller; private int _controller;
private int _controllerNumber; private readonly int _controllerNumber;
private string _controllerImage; private string _controllerImage;
private int _device; private int _device;
private object _configViewModel; private object _configViewModel;
@@ -433,12 +433,28 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public void LoadDevices() public void LoadDevices()
{ {
string GetGamepadName(IGamepad gamepad, int controllerNumber)
{
return $"{GetShortGamepadName(gamepad.Name)} ({controllerNumber})";
}
string GetUniqueGamepadName(IGamepad gamepad, ref int controllerNumber)
{
string name = GetGamepadName(gamepad, controllerNumber);
if (Devices.Any(controller => controller.Name == name))
{
controllerNumber++;
name = GetGamepadName(gamepad, controllerNumber);
}
return name;
}
lock (Devices) lock (Devices)
{ {
Devices.Clear(); Devices.Clear();
DeviceList.Clear(); DeviceList.Clear();
Devices.Add((DeviceType.None, Disabled, LocaleManager.Instance[LocaleKeys.ControllerSettingsDeviceDisabled])); Devices.Add((DeviceType.None, Disabled, LocaleManager.Instance[LocaleKeys.ControllerSettingsDeviceDisabled]));
int controllerNumber = 0;
foreach (string id in _mainWindow.InputManager.KeyboardDriver.GamepadsIds) foreach (string id in _mainWindow.InputManager.KeyboardDriver.GamepadsIds)
{ {
using IGamepad gamepad = _mainWindow.InputManager.KeyboardDriver.GetGamepad(id); using IGamepad gamepad = _mainWindow.InputManager.KeyboardDriver.GetGamepad(id);
@@ -455,17 +471,11 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
if (gamepad != null) if (gamepad != null)
{ {
if (Devices.Any(controller => GetShortGamepadId(controller.Id) == GetShortGamepadId(gamepad.Id))) string name = GetUniqueGamepadName(gamepad, ref controllerNumber);
{ Devices.Add((DeviceType.Controller, id, name));
_controllerNumber++;
}
Devices.Add((DeviceType.Controller, id, $"{GetShortGamepadName(gamepad.Name)} ({_controllerNumber})"));
} }
} }
_controllerNumber = 0;
DeviceList.AddRange(Devices.Select(x => x.Name)); DeviceList.AddRange(Devices.Select(x => x.Name));
Device = Math.Min(Device, DeviceList.Count); Device = Math.Min(Device, DeviceList.Count);
} }
@@ -679,7 +689,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
if (!File.Exists(path)) if (!File.Exists(path))
{ {
var index = ProfilesList.IndexOf(ProfileName); int index = ProfilesList.IndexOf(ProfileName);
if (index != -1) if (index != -1)
{ {
ProfilesList.RemoveAt(index); ProfilesList.RemoveAt(index);

View File

@@ -913,7 +913,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public KeyGesture PauseKey public KeyGesture PauseKey
{ {
get => KeyGesture.Parse(_pauseKey); get => KeyGesture.Parse(_pauseKey);
set set
{ {
_pauseKey = value.ToString(); _pauseKey = value.ToString();

View File

@@ -14,6 +14,7 @@ using Ryujinx.Common.Configuration.Multiplayer;
using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.GraphicsDriver;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Graphics.Vulkan; using Ryujinx.Graphics.Vulkan;
using Ryujinx.HLE;
using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS.Services.Time.TimeZone; using Ryujinx.HLE.HOS.Services.Time.TimeZone;
using Ryujinx.UI.Common.Configuration; using Ryujinx.UI.Common.Configuration;
@@ -154,7 +155,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool EnableInternetAccess { get; set; } public bool EnableInternetAccess { get; set; }
public bool EnableFsIntegrityChecks { get; set; } public bool EnableFsIntegrityChecks { get; set; }
public bool IgnoreMissingServices { get; set; } public bool IgnoreMissingServices { get; set; }
public bool ExpandDramSize { get; set; } public MemoryConfiguration DramSize { get; set; }
public bool EnableShaderCache { get; set; } public bool EnableShaderCache { get; set; }
public bool EnableTextureRecompression { get; set; } public bool EnableTextureRecompression { get; set; }
public bool EnableMacroHLE { get; set; } public bool EnableMacroHLE { get; set; }
@@ -444,7 +445,7 @@ namespace Ryujinx.Ava.UI.ViewModels
EnableVsync = config.Graphics.EnableVsync; EnableVsync = config.Graphics.EnableVsync;
EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks; EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks;
ExpandDramSize = config.System.ExpandRam; DramSize = config.System.DramSize;
IgnoreMissingServices = config.System.IgnoreMissingServices; IgnoreMissingServices = config.System.IgnoreMissingServices;
// CPU // CPU
@@ -545,7 +546,7 @@ namespace Ryujinx.Ava.UI.ViewModels
config.System.SystemTimeOffset.Value = Convert.ToInt64((CurrentDate.ToUnixTimeSeconds() + CurrentTime.TotalSeconds) - DateTimeOffset.Now.ToUnixTimeSeconds()); config.System.SystemTimeOffset.Value = Convert.ToInt64((CurrentDate.ToUnixTimeSeconds() + CurrentTime.TotalSeconds) - DateTimeOffset.Now.ToUnixTimeSeconds());
config.Graphics.EnableVsync.Value = EnableVsync; config.Graphics.EnableVsync.Value = EnableVsync;
config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks; config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks;
config.System.ExpandRam.Value = ExpandDramSize; config.System.DramSize.Value = DramSize;
config.System.IgnoreMissingServices.Value = IgnoreMissingServices; config.System.IgnoreMissingServices.Value = IgnoreMissingServices;
// CPU // CPU

View File

@@ -143,14 +143,14 @@ namespace Ryujinx.Ava.UI.Views.Main
} }
} }
public async void OpenAmiiboWindow(object sender, RoutedEventArgs e) public async void OpenAmiiboWindow(object sender, RoutedEventArgs e)
=> await ViewModel.OpenAmiiboWindow(); => await ViewModel.OpenAmiiboWindow();
public async void OpenCheatManagerForCurrentApp(object sender, RoutedEventArgs e) public async void OpenCheatManagerForCurrentApp(object sender, RoutedEventArgs e)
{ {
if (!ViewModel.IsGameRunning) if (!ViewModel.IsGameRunning)
return; return;
string name = ViewModel.AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties.Title[(int)ViewModel.AppHost.Device.System.State.DesiredTitleLanguage].NameString.ToString(); string name = ViewModel.AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties.Title[(int)ViewModel.AppHost.Device.System.State.DesiredTitleLanguage].NameString.ToString();
await new CheatWindow( await new CheatWindow(
@@ -186,7 +186,8 @@ namespace Ryujinx.Ava.UI.Views.Main
private async void ChangeWindowSize_Click(object sender, RoutedEventArgs e) private async void ChangeWindowSize_Click(object sender, RoutedEventArgs e)
{ {
if (sender is not MenuItem { Tag: string resolution }) return; if (sender is not MenuItem { Tag: string resolution })
return;
(int height, int width) = resolution.Split(' ') (int height, int width) = resolution.Split(' ')
.Into(parts => (int.Parse(parts[0]), int.Parse(parts[1]))); .Into(parts => (int.Parse(parts[0]), int.Parse(parts[1])));

View File

@@ -1,4 +1,4 @@
<UserControl <UserControl
x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsSystemView" x:Class="Ryujinx.Ava.UI.Views.Settings.SettingsSystemView"
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
@@ -203,15 +203,36 @@
Foreground="{DynamicResource SecondaryTextColor}" Foreground="{DynamicResource SecondaryTextColor}"
Text="{locale:Locale SettingsTabSystemHacksNote}" /> Text="{locale:Locale SettingsTabSystemHacksNote}" />
</StackPanel> </StackPanel>
<StackPanel
Margin="10,0,0,0"
Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Text="{locale:Locale SettingsTabSystemDramSize}"
Width="250" />
<ComboBox
SelectedIndex="{Binding DramSize}"
ToolTip.Tip="{locale:Locale DRamTooltip}"
HorizontalContentAlignment="Left"
Width="350">
<ComboBoxItem>
<TextBlock Text="{locale:Locale SettingsTabSystemDramSize4GiB}" />
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="{locale:Locale SettingsTabSystemDramSize6GiB}" />
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="{locale:Locale SettingsTabSystemDramSize8GiB}" />
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="{locale:Locale SettingsTabSystemDramSize12GiB}" />
</ComboBoxItem>
</ComboBox>
</StackPanel>
<StackPanel <StackPanel
Margin="10,0,0,0" Margin="10,0,0,0"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
Orientation="Vertical"> Orientation="Vertical">
<CheckBox
IsChecked="{Binding ExpandDramSize}"
ToolTip.Tip="{locale:Locale DRamTooltip}">
<TextBlock Text="{locale:Locale SettingsTabSystemExpandDramSize}" />
</CheckBox>
<CheckBox <CheckBox
IsChecked="{Binding IgnoreMissingServices}" IsChecked="{Binding IgnoreMissingServices}"
ToolTip.Tip="{locale:Locale IgnoreMissingServicesTooltip}"> ToolTip.Tip="{locale:Locale IgnoreMissingServicesTooltip}">
@@ -221,4 +242,4 @@
</StackPanel> </StackPanel>
</Border> </Border>
</ScrollViewer> </ScrollViewer>
</UserControl> </UserControl>

View File

@@ -83,7 +83,7 @@ namespace Ryujinx.Ava.UI.Windows
TitleBar.ExtendsContentIntoTitleBar = true; TitleBar.ExtendsContentIntoTitleBar = true;
TitleBar.TitleBarHitTestType = TitleBarHitTestType.Complex; TitleBar.TitleBarHitTestType = TitleBarHitTestType.Complex;
// NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point. // NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point.
StatusBarHeight = StatusBarView.StatusBar.MinHeight; StatusBarHeight = StatusBarView.StatusBar.MinHeight;
@@ -665,8 +665,9 @@ namespace Ryujinx.Ava.UI.Windows
? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadUpdateAddedMessage], numUpdatesAdded) ? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadUpdateAddedMessage], numUpdatesAdded)
: null; : null;
if (msg is null) return; if (msg is null)
return;
Dispatcher.UIThread.InvokeAsync(async () => Dispatcher.UIThread.InvokeAsync(async () =>
{ {