diff --git a/src/Ryujinx.HLE/HOS/SystemState/SystemLanguage.cs b/src/Ryujinx.HLE/HOS/SystemState/SystemLanguage.cs
index 8e7a44005..f5b7fc0f1 100644
--- a/src/Ryujinx.HLE/HOS/SystemState/SystemLanguage.cs
+++ b/src/Ryujinx.HLE/HOS/SystemState/SystemLanguage.cs
@@ -20,7 +20,5 @@ namespace Ryujinx.HLE.HOS.SystemState
SimplifiedChinese,
TraditionalChinese,
BrazilianPortuguese,
- Polish,
- Thai,
}
}
diff --git a/src/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs b/src/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs
index 74378b153..91277232c 100644
--- a/src/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs
+++ b/src/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs
@@ -23,9 +23,7 @@ namespace Ryujinx.HLE.HOS.SystemState
"es-419",
"zh-Hans",
"zh-Hant",
- "pt-BR",
- "pl",
- "th"
+ "pt-BR"
];
internal long DesiredKeyboardLayout { get; private set; }
diff --git a/src/Ryujinx.HLE/HOS/SystemState/TitleLanguage.cs b/src/Ryujinx.HLE/HOS/SystemState/TitleLanguage.cs
index e651410ce..e3bfb9165 100644
--- a/src/Ryujinx.HLE/HOS/SystemState/TitleLanguage.cs
+++ b/src/Ryujinx.HLE/HOS/SystemState/TitleLanguage.cs
@@ -18,7 +18,5 @@ namespace Ryujinx.HLE.HOS.SystemState
TraditionalChinese,
SimplifiedChinese,
BrazilianPortuguese,
- Polish,
- Thai,
}
}
diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
index 2d822a87e..7373e2f45 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs
@@ -8,7 +8,6 @@ using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.Gpu;
using Ryujinx.HLE.Loaders.Executables;
-using Ryujinx.HLE.Utilities;
using Ryujinx.Memory;
using System.Linq;
using static Ryujinx.HLE.HOS.ModLoader;
@@ -87,18 +86,11 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions
if (!isHomebrew && programId > 0x010000000000FFFF)
{
- ApplicationControlProperty.ApplicationTitle[] titles =
- NacpHelper.GetTitleEntries(in nacpData.Value);
-
- int langIdx = (int)device.System.State.DesiredTitleLanguage;
- if (langIdx < titles.Length)
- {
- programName = titles[langIdx].NameString.ToString();
- }
+ programName = nacpData.Value.Title[(int)device.System.State.DesiredTitleLanguage].NameString.ToString();
if (string.IsNullOrWhiteSpace(programName))
{
- foreach (ApplicationControlProperty.ApplicationTitle appTitle in titles)
+ foreach (ApplicationControlProperty.ApplicationTitle appTitle in nacpData.Value.Title)
{
if (appTitle.Name[0] != 0)
continue;
diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
index d34b7fddc..48b5b724c 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
@@ -194,22 +194,15 @@ namespace Ryujinx.HLE.Loaders.Processes
{
nacpStorage.Read(0, nacpData.ByteSpan);
- ApplicationControlProperty.ApplicationTitle[] titles =
- Utilities.NacpHelper.GetTitleEntries(in nacpData.Value);
+ programName = nacpData.Value.Title[(int)_device.System.State.DesiredTitleLanguage].NameString.ToString();
- int langIdx = (int)_device.System.State.DesiredTitleLanguage;
- if (langIdx < titles.Length)
- {
- programName = titles[langIdx].NameString.ToString();
- }
-
- if ((int)TitleLanguage.AmericanEnglish < titles.Length &&
- "Switch Verification" == titles[(int)TitleLanguage.AmericanEnglish].NameString.ToString())
+ if ("Switch Verification" ==
+ nacpData.Value.Title[(int)TitleLanguage.AmericanEnglish].NameString.ToString())
throw new InvalidOperationException();
if (string.IsNullOrWhiteSpace(programName))
{
- foreach (ApplicationControlProperty.ApplicationTitle nacpTitles in titles)
+ foreach (ApplicationControlProperty.ApplicationTitle nacpTitles in nacpData.Value.Title)
{
if (nacpTitles.Name[0] != 0)
continue;
diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
index 7782b0a51..d6e492317 100644
--- a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
+++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs
@@ -5,7 +5,6 @@ using Ryujinx.Common.Logging;
using Ryujinx.Cpu;
using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.HLE.Loaders.Processes.Extensions;
-using Ryujinx.HLE.Utilities;
using Ryujinx.Horizon.Common;
namespace Ryujinx.HLE.Loaders.Processes
@@ -55,17 +54,11 @@ namespace Ryujinx.HLE.Loaders.Processes
{
ulong programId = metaLoader.ProgramId;
- ApplicationControlProperty.ApplicationTitle[] titles =
- NacpHelper.GetTitleEntries(in ApplicationControlProperties);
-
- if ((int)titleLanguage < titles.Length)
- {
- Name = titles[(int)titleLanguage].NameString.ToString();
- }
+ Name = ApplicationControlProperties.Title[(int)titleLanguage].NameString.ToString();
if (string.IsNullOrWhiteSpace(Name))
{
- foreach (ApplicationControlProperty.ApplicationTitle appTitle in titles)
+ foreach (ApplicationControlProperty.ApplicationTitle appTitle in ApplicationControlProperties.Title)
{
if (appTitle.Name[0] != 0)
continue;
diff --git a/src/Ryujinx.HLE/Utilities/NacpHelper.cs b/src/Ryujinx.HLE/Utilities/NacpHelper.cs
deleted file mode 100644
index bbcf12708..000000000
--- a/src/Ryujinx.HLE/Utilities/NacpHelper.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-using System.Buffers.Binary;
-using System.IO;
-using System.IO.Compression;
-using System.Runtime.InteropServices;
-using LibHac.Ns;
-
-namespace Ryujinx.HLE.Utilities
-{
- public static class NacpHelper
- {
- private const int UncompressedTitleCount = 16;
- private const int CompressedTitleCount = 32;
- private const int TitleEntrySize = 0x300;
- private const int TitleCompressionByteIndex = 1; // offset within Reserved3214
-
- ///
- /// Returns the resolved title entries from an NACP. When the title block is zlib-compressed
- /// (indicated by a compression flag at NACP offset 0x3215), the first 0x3000 bytes are treated
- /// as a raw-deflate compressed blob that decompresses to 0x6000 bytes containing up to 32 title
- /// entries. Otherwise the 16 uncompressed entries are returned directly.
- ///
- public static ApplicationControlProperty.ApplicationTitle[] GetTitleEntries(
- ref readonly ApplicationControlProperty nacp)
- {
- byte titleCompression = nacp.Reserved3214[TitleCompressionByteIndex];
-
- if (titleCompression != 1)
- {
- var titles = new ApplicationControlProperty.ApplicationTitle[UncompressedTitleCount];
- for (int i = 0; i < UncompressedTitleCount; i++)
- titles[i] = nacp.Title[i];
- return titles;
- }
-
- ReadOnlySpan titleBytes = MemoryMarshal.AsBytes(
- (ReadOnlySpan)nacp.Title);
-
- ushort compressedBlobSize = BinaryPrimitives.ReadUInt16LittleEndian(titleBytes);
- ReadOnlySpan compressedBlob = titleBytes.Slice(2, compressedBlobSize);
-
- byte[] decompressed = new byte[CompressedTitleCount * TitleEntrySize];
-
- using (var compressedStream = new MemoryStream(compressedBlob.ToArray()))
- using (var deflateStream = new DeflateStream(compressedStream, CompressionMode.Decompress))
- {
- int totalRead = 0;
- while (totalRead < decompressed.Length)
- {
- int read = deflateStream.Read(decompressed, totalRead, decompressed.Length - totalRead);
- if (read == 0)
- break;
- totalRead += read;
- }
- }
-
- var result = new ApplicationControlProperty.ApplicationTitle[CompressedTitleCount];
- for (int i = 0; i < CompressedTitleCount; i++)
- {
- result[i] = MemoryMarshal.Read(
- decompressed.AsSpan(i * TitleEntrySize, TitleEntrySize));
- }
-
- return result;
- }
- }
-}
diff --git a/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs b/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs
index a58f1bae5..7640967c6 100644
--- a/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs
+++ b/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs
@@ -58,10 +58,7 @@ namespace Ryujinx.Horizon.Sdk.Ns
public RepairFlagValue RepairFlag;
public byte ProgramIndex;
public RequiredNetworkServiceLicenseOnLaunchValue RequiredNetworkServiceLicenseOnLaunchFlag;
- public byte ApplicationErrorCodePrefix;
- public TitleCompressionValue TitleCompression;
- public byte AcdIndex;
- public byte ApparentPlatform;
+ public Array4 Reserved3214;
public ApplicationNeighborDetectionClientConfiguration NeighborDetectionClientConfiguration;
public ApplicationJitConfiguration JitConfiguration;
public RequiredAddOnContentsSetBinaryDescriptor RequiredAddOnContentsSetBinaryDescriptors;
@@ -133,8 +130,6 @@ namespace Ryujinx.Horizon.Sdk.Ns
TraditionalChinese = 13,
SimplifiedChinese = 14,
BrazilianPortuguese = 15,
- Polish = 16,
- Thai = 17,
}
public enum Organization
@@ -307,11 +302,5 @@ namespace Ryujinx.Horizon.Sdk.Ns
Deny = 0,
Allow = 1,
}
-
- public enum TitleCompressionValue : byte
- {
- Disable = 0,
- Enable = 1,
- }
}
}
diff --git a/src/Ryujinx/Headless/Windows/WindowBase.cs b/src/Ryujinx/Headless/Windows/WindowBase.cs
index 062589179..49b2a389a 100644
--- a/src/Ryujinx/Headless/Windows/WindowBase.cs
+++ b/src/Ryujinx/Headless/Windows/WindowBase.cs
@@ -167,9 +167,7 @@ namespace Ryujinx.Headless
ApplicationControlProperty nacp = activeProcess.ApplicationControlProperties;
int desiredLanguage = (int)Device.System.State.DesiredTitleLanguage;
- ApplicationControlProperty.ApplicationTitle[] titles = Ryujinx.HLE.Utilities.NacpHelper.GetTitleEntries(in nacp);
- string titleName = desiredLanguage < titles.Length ? titles[desiredLanguage].NameString.ToString() : string.Empty;
- string titleNameSection = string.IsNullOrWhiteSpace(titleName) ? string.Empty : $" - {titleName}";
+ string titleNameSection = string.IsNullOrWhiteSpace(nacp.Title[desiredLanguage].NameString.ToString()) ? string.Empty : $" - {nacp.Title[desiredLanguage].NameString.ToString()}";
string titleVersionSection = string.IsNullOrWhiteSpace(nacp.DisplayVersionString.ToString()) ? string.Empty : $" v{nacp.DisplayVersionString.ToString()}";
string titleIdSection = string.IsNullOrWhiteSpace(activeProcess.ProgramIdText) ? string.Empty : $" ({activeProcess.ProgramIdText.ToUpper()})";
string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)";
diff --git a/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs
index b734529bc..2831802fe 100644
--- a/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs
+++ b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs
@@ -22,9 +22,9 @@ using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS.SystemState;
-using Ryujinx.HLE.Utilities;
using Ryujinx.HLE.Loaders.Npdm;
using Ryujinx.HLE.Loaders.Processes.Extensions;
+using Ryujinx.HLE.Utilities;
using System;
using System.Collections.Generic;
using System.IO;
@@ -440,10 +440,8 @@ namespace Ryujinx.Ava.Systems.AppLibrary
GetApplicationInformation(ref controlHolder.Value, ref application);
- ApplicationControlProperty.ApplicationTitle[] verifyTitles =
- NacpHelper.GetTitleEntries(in controlHolder.Value);
- if ((int)TitleLanguage.AmericanEnglish < verifyTitles.Length &&
- "Switch Verification" == verifyTitles[(int)TitleLanguage.AmericanEnglish].NameString.ToString())
+ if ("Switch Verification" == controlHolder.Value
+ .Title[(int)TitleLanguage.AmericanEnglish].NameString.ToString())
return false;
}
else
@@ -1393,13 +1391,10 @@ namespace Ryujinx.Ava.Systems.AppLibrary
{
_ = Enum.TryParse(DesiredLanguage.ToString(), out TitleLanguage desiredTitleLanguage);
- ApplicationControlProperty.ApplicationTitle[] titles =
- NacpHelper.GetTitleEntries(in controlData);
-
- if (titles.Length > (int)desiredTitleLanguage)
+ if (controlData.Title.Length > (int)desiredTitleLanguage)
{
- data.Name = titles[(int)desiredTitleLanguage].NameString.ToString();
- data.Developer = titles[(int)desiredTitleLanguage].PublisherString.ToString();
+ data.Name = controlData.Title[(int)desiredTitleLanguage].NameString.ToString();
+ data.Developer = controlData.Title[(int)desiredTitleLanguage].PublisherString.ToString();
}
else
{
@@ -1409,7 +1404,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary
if (string.IsNullOrWhiteSpace(data.Name))
{
- foreach (ApplicationControlProperty.ApplicationTitle controlTitle in titles)
+ foreach (ref readonly ApplicationControlProperty.ApplicationTitle controlTitle in controlData.Title)
{
if (!controlTitle.NameString.IsEmpty())
{
@@ -1422,7 +1417,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary
if (string.IsNullOrWhiteSpace(data.Developer))
{
- foreach (ApplicationControlProperty.ApplicationTitle controlTitle in titles)
+ foreach (ref readonly ApplicationControlProperty.ApplicationTitle controlTitle in controlData.Title)
{
if (!controlTitle.PublisherString.IsEmpty())
{
diff --git a/src/Ryujinx/Systems/Configuration/System/Language.cs b/src/Ryujinx/Systems/Configuration/System/Language.cs
index 4cf91feb6..dd44dff37 100644
--- a/src/Ryujinx/Systems/Configuration/System/Language.cs
+++ b/src/Ryujinx/Systems/Configuration/System/Language.cs
@@ -24,8 +24,6 @@ namespace Ryujinx.Ava.Systems.Configuration.System
SimplifiedChinese,
TraditionalChinese,
BrazilianPortuguese,
- Polish,
- Thai,
}
public static class LanguageEnumHelper
diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs
index fbb212b4a..cb325f0b6 100644
--- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs
+++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs
@@ -168,10 +168,7 @@ namespace Ryujinx.Ava.UI.Views.Main
if (!ViewModel.IsGameRunning)
return;
- ApplicationControlProperty.ApplicationTitle[] titles = Ryujinx.HLE.Utilities.NacpHelper.GetTitleEntries(
- in ViewModel.AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties);
- int langIdx = (int)ViewModel.AppHost.Device.System.State.DesiredTitleLanguage;
- string name = langIdx < titles.Length ? titles[langIdx].NameString.ToString() : string.Empty;
+ string name = ViewModel.AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties.Title[(int)ViewModel.AppHost.Device.System.State.DesiredTitleLanguage].NameString.ToString();
await StyleableAppWindow.ShowAsync(
new CheatWindow(