using System.Collections.Generic; using System.IO; namespace libhac { public class Nacp { public NacpLang[] Languages { get; } = new NacpLang[0x10]; public string Isbn { get; } public byte StartupUserAccount { get; } public byte TouchScreenUsageMode { get; } public byte AocRegistrationType { get; } public int AttributeFlag { get; } public uint SupportedLanguageFlag { get; } public uint ParentalControlFlag { get; } public byte Screenshot { get; } public byte VideoCapture { get; } public byte DataLossConfirmation { get; } public byte PlayLogPolicy { get; } public ulong PresenceGroupId { get; } public sbyte[] RatingAge { get; } = new sbyte[32]; public string DisplayVersion { get; } public ulong AddOnContentBaseId { get; } public ulong SaveDataOwnerId { get; } public long UserAccountSaveDataSize { get; } public long UserAccountSaveDataJournalSize { get; } public long DeviceSaveDataSize { get; } public long DeviceSaveDataJournalSize { get; } public long BcatDeliveryCacheStorageSize { get; } public string ApplicationErrorCodeCategory { get; } public ulong[] LocalCommunicationId { get; } = new ulong[8]; public byte LogoType { get; } public byte LogoHandling { get; } public byte RuntimeAddOnContentInstall { get; } public byte[] Reserved00 { get; } public byte CrashReport { get; } public byte Hdcp { get; } public ulong SeedForPseudoDeviceId { get; } public string BcatPassphrase { get; } public byte Reserved01 { get; } public byte[] Reserved02 { get; } public long UserAccountSaveDataSizeMax { get; } public long UserAccountSaveDataJournalSizeMax { get; } public long DeviceSaveDataSizeMax { get; } public long DeviceSaveDataJournalSizeMax { get; } public long TemporaryStorageSize { get; } public long CacheStorageSize { get; } public long CacheStorageJournalSize { get; } public long CacheStorageDataAndJournalSizeMax { get; } public short CacheStorageIndex { get; } public byte[] Reserved03 { get; } public List PlayLogQueryableApplicationId { get; } = new List(); public byte PlayLogQueryCapability { get; } public byte RepairFlag { get; } public byte ProgramIndex { get; } public long TotalSaveDataSize { get; } public long UserTotalSaveDataSize { get; } public long DeviceTotalSaveDataSize { get; } public Nacp() { } public Nacp(BinaryReader reader) { var start = reader.BaseStream.Position; for (int i = 0; i < 16; i++) { Languages[i] = new NacpLang(reader); } Isbn = reader.ReadUtf8Z(37); reader.BaseStream.Position = start + 0x3025; StartupUserAccount = reader.ReadByte(); TouchScreenUsageMode = reader.ReadByte(); AocRegistrationType = reader.ReadByte(); AttributeFlag = reader.ReadInt32(); SupportedLanguageFlag = reader.ReadUInt32(); ParentalControlFlag = reader.ReadUInt32(); Screenshot = reader.ReadByte(); VideoCapture = reader.ReadByte(); DataLossConfirmation = reader.ReadByte(); PlayLogPolicy = reader.ReadByte(); PresenceGroupId = reader.ReadUInt64(); for (int i = 0; i < RatingAge.Length; i++) { RatingAge[i] = reader.ReadSByte(); } DisplayVersion = reader.ReadUtf8Z(16); reader.BaseStream.Position = start + 0x3070; AddOnContentBaseId = reader.ReadUInt64(); SaveDataOwnerId = reader.ReadUInt64(); UserAccountSaveDataSize = reader.ReadInt64(); UserAccountSaveDataJournalSize = reader.ReadInt64(); DeviceSaveDataSize = reader.ReadInt64(); DeviceSaveDataJournalSize = reader.ReadInt64(); BcatDeliveryCacheStorageSize = reader.ReadInt64(); ApplicationErrorCodeCategory = reader.ReadUtf8Z(8); reader.BaseStream.Position = start + 0x30B0; for (int i = 0; i < LocalCommunicationId.Length; i++) { LocalCommunicationId[i] = reader.ReadUInt64(); } LogoType = reader.ReadByte(); LogoHandling = reader.ReadByte(); RuntimeAddOnContentInstall = reader.ReadByte(); Reserved00 = reader.ReadBytes(3); CrashReport = reader.ReadByte(); Hdcp = reader.ReadByte(); SeedForPseudoDeviceId = reader.ReadUInt64(); BcatPassphrase = reader.ReadUtf8Z(65); reader.BaseStream.Position = start + 0x3148; UserAccountSaveDataSizeMax = reader.ReadInt64(); UserAccountSaveDataJournalSizeMax = reader.ReadInt64(); DeviceSaveDataSizeMax = reader.ReadInt64(); DeviceSaveDataJournalSizeMax = reader.ReadInt64(); TemporaryStorageSize = reader.ReadInt64(); CacheStorageSize = reader.ReadInt64(); CacheStorageJournalSize = reader.ReadInt64(); CacheStorageDataAndJournalSizeMax = reader.ReadInt64(); CacheStorageIndex = reader.ReadInt16(); Reserved03 = reader.ReadBytes(6); for (int i = 0; i < 16; i++) { var value = reader.ReadUInt64(); if (value != 0) PlayLogQueryableApplicationId.Add(value); } PlayLogQueryCapability = reader.ReadByte(); RepairFlag = reader.ReadByte(); ProgramIndex = reader.ReadByte(); UserTotalSaveDataSize = UserAccountSaveDataSize + UserAccountSaveDataJournalSize; DeviceTotalSaveDataSize = DeviceSaveDataSize + DeviceSaveDataJournalSize; TotalSaveDataSize = UserTotalSaveDataSize + DeviceTotalSaveDataSize; } } public class NacpLang { public string Title { get; } public string Developer { get; } public NacpLang() { } public NacpLang(BinaryReader reader) { var start = reader.BaseStream.Position; Title = reader.ReadUtf8Z(); reader.BaseStream.Position = start + 0x200; Developer = reader.ReadUtf8Z(); reader.BaseStream.Position = start + 0x300; } } }