Skip to content

Commit

Permalink
HLE: extract custom NACP data functionality into a static helper for …
Browse files Browse the repository at this point in the history
…generic reuse elsewhere, and clarify magic numbers.
  • Loading branch information
GreemDev committed Dec 7, 2024
1 parent eda4f43 commit 290a6ad
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 20 deletions.
37 changes: 37 additions & 0 deletions src/Ryujinx.HLE/StructHelpers.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
31 changes: 11 additions & 20 deletions src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
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;
Expand Down Expand Up @@ -126,32 +127,22 @@ public async void OpenSettings(object sender, RoutedEventArgs e)

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);
}
Expand Down

0 comments on commit 290a6ad

Please sign in to comment.