Sfoglia il codice sorgente

HLE: extract custom NACP data functionality into a static helper for generic reuse elsewhere, and clarify magic numbers.

Evan Husted 1 anno fa
parent
commit
290a6ad5de

+ 37 - 0
src/Ryujinx.HLE/StructHelpers.cs

@@ -0,0 +1,37 @@
+using LibHac.Common;
+using LibHac.Ns;
+using System;
+using System.Text;
+
+namespace Ryujinx.HLE
+{
+    public static class StructHelpers
+    {
+        public static BlitStruct<ApplicationControlProperty> CreateCustomNacpData(string name, string version)
+        {
+            // https://switchbrew.org/wiki/NACP
+            const int OffsetOfDisplayVersion = 0x3060;
+            
+            // https://switchbrew.org/wiki/NACP#ApplicationTitle
+            const int TotalApplicationTitles = 0x10;
+            const int SizeOfApplicationTitle = 0x300;
+            const int OffsetOfApplicationPublisherStrings = 0x200;
+            
+            
+            var nacpData = new BlitStruct<ApplicationControlProperty>(1);
+
+            // name and publisher buffer
+            // repeat once for each locale (the ApplicationControlProperty has 16 locales)
+            for (int i = 0; i < TotalApplicationTitles; i++)
+            {
+                Encoding.ASCII.GetBytes(name).AsSpan().CopyTo(nacpData.ByteSpan[(i * SizeOfApplicationTitle)..]);
+                "Ryujinx"u8.CopyTo(nacpData.ByteSpan[(i * SizeOfApplicationTitle + OffsetOfApplicationPublisherStrings)..]);
+            }
+            
+            // version buffer
+            Encoding.ASCII.GetBytes(version).AsSpan().CopyTo(nacpData.ByteSpan[OffsetOfDisplayVersion..]);
+
+            return nacpData;
+        }
+    }
+}

+ 11 - 20
src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs

@@ -13,6 +13,7 @@ using Ryujinx.Ava.UI.ViewModels;
 using Ryujinx.Ava.UI.Windows;
 using Ryujinx.Common;
 using Ryujinx.Common.Utilities;
+using Ryujinx.HLE;
 using Ryujinx.UI.App.Common;
 using Ryujinx.UI.Common;
 using Ryujinx.UI.Common.Configuration;
@@ -126,32 +127,22 @@ namespace Ryujinx.Ava.UI.Views.Main
 
         public async void OpenMiiApplet(object sender, RoutedEventArgs e)
         {
-            const string name = "miiEdit";
-            const ulong programId = 0x0100000000001009;
-            string contentPath = ViewModel.ContentManager.GetInstalledContentPath(programId, StorageId.BuiltInSystem, NcaContentType.Program);
+            const string AppletName = "miiEdit";
+            const ulong AppletProgramId = 0x0100000000001009;
+            const string AppletVersion = "1.0.0";
+            
+            string contentPath = ViewModel.ContentManager.GetInstalledContentPath(AppletProgramId, StorageId.BuiltInSystem, NcaContentType.Program);
 
             if (!string.IsNullOrEmpty(contentPath))
             {
                 ApplicationData applicationData = new()
                 {
-                    Name = name,
-                    Id = programId,
-                    Path = contentPath,
+                    Name = AppletName,
+                    Id = AppletProgramId,
+                    Path = contentPath
                 };
-
-                string version = "1.0.0";
-                var nacpData = new BlitStruct<ApplicationControlProperty>(1);
-
-                //version buffer
-                Encoding.ASCII.GetBytes(version).AsSpan().CopyTo(nacpData.ByteSpan.Slice(0x3060));
-
-                //name and distributor buffer
-                //repeat once for each locale (the ApplicationControlProperty has 16 locales)
-                for (int i = 0; i < 0x10; i++)
-                {
-                    Encoding.ASCII.GetBytes(name).AsSpan().CopyTo(nacpData.ByteSpan.Slice(i * 0x300));
-                    "Ryujinx"u8.ToArray().AsSpan().CopyTo(nacpData.ByteSpan.Slice(i * 0x300 + 0x200));
-                }
+                
+                var nacpData = StructHelpers.CreateCustomNacpData(AppletName, AppletVersion);
 
                 await ViewModel.LoadApplication(applicationData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen, nacpData);
             }