NACP: Difference between revisions

Created page with "Roughly equivalent to non-gfx areas of 3DS SMDH. Also includes a string for the display-version of this title. All strings are UTF-8, unlike SMDH which uses UTF-16. Total siz..."
 
Added info from a GameShare S2 NACP, etc.
 
(48 intermediate revisions by 8 users not shown)
Line 1: Line 1:
Roughly equivalent to non-gfx areas of 3DS SMDH. Also includes a string for the display-version of this title. All strings are UTF-8, unlike SMDH which uses UTF-16.
This is '''control.nacp''', "nn::ns::ApplicationControlProperty".
 
Roughly equivalent to non-gfx areas of 3DS SMDH. All strings for language-entries are UTF-8, unlike SMDH which uses UTF-16.


Total size is 0x4000-bytes.
Total size is 0x4000-bytes.


=Structure=
= Structure =
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 11: Line 13:
|-
|-
| 0x0
| 0x0
| 0x2400
| 0x3000 (0x300 * 16)
| Language entries
| [[#ApplicationTitle|Title]]
|-
| 0x3000
| 0x25
| Isbn
|-
|-
| 0x2400
| 0x3025
| 0xC00
| 0x1
| Normally all-zero? Maybe more language entries?
| StartupUserAccount
|-
|-
| 0x3000
| 0x3026
| ...
| 0x1
| ...
| UserAccountSwitchLock
|-
| 0x3027
| 0x1
| AddOnContentRegistrationType
|-
| 0x3028
| 0x4
| AttributeFlag
|-
| 0x302C
| 0x4
| SupportedLanguageFlag
|-
| 0x3030
| 0x4
| ParentalControlFlag
|-
| 0x3034
| 0x1
| Screenshot
|-
| 0x3035
| 0x1
| [[#VideoCapture]]
|-
| 0x3036
| 0x1
| DataLossConfirmation
|-
| 0x3037
| 0x1
| [[#PlayLogPolicy]]
|-
| 0x3038
| 0x8
| PresenceGroupId
|-
| 0x3040
| 0x20
| RatingAge
|-
| 0x3060
| 0x10
| DisplayVersion
|-
| 0x3070
| 0x8
| AddOnContentBaseId
|-
| 0x3078
| 0x8
| SaveDataOwnerId
|-
| 0x3080
| 0x8
| UserAccountSaveDataSize
|-
| 0x3088
| 0x8
| UserAccountSaveDataJournalSize
|-
| 0x3090
| 0x8
| DeviceSaveDataSize
|-
| 0x3098
| 0x8
| DeviceSaveDataJournalSize
|-
| 0x30A0
| 0x8
| BcatDeliveryCacheStorageSize
|-
| 0x30A8
| 0x8
| ApplicationErrorCodeCategory
|-
| 0x30B0
| 0x40 (0x8 * 8)
| LocalCommunicationId
|-
| 0x30F0
| 0x1
| LogoType
|-
| 0x30F1
| 0x1
| LogoHandling
|-
| 0x30F2
| 0x1
| RuntimeAddOnContentInstall
|-
| 0x30F3
| 0x1
| RuntimeParameterDelivery
|-
| 0x30F4
| 0x1
| AppropriateAgeForChina
|-
| 0x30F5
| 0x1
| Reserved
|-
| 0x30F6
| 0x1
| CrashReport
|-
| 0x30F7
| 0x1
| Hdcp
|-
| 0x30F8
| 0x8
| SeedForPseudoDeviceId
|-
| 0x3100
| 0x41
| [[BCAT_Content_Container|BcatPassphrase]] (all-zero when unused)
|-
| 0x3141
| 0x1
| StartupUserAccountOption
|-
| 0x3142
| 0x6
| ReservedForUserAccountSaveDataOperation
|-
| 0x3148
| 0x8
| UserAccountSaveDataSizeMax
|-
| 0x3150
| 0x8
| UserAccountSaveDataJournalSizeMax
|-
| 0x3158
| 0x8
| DeviceSaveDataSizeMax
|-
| 0x3160
| 0x8
| DeviceSaveDataJournalSizeMax
|-
| 0x3168
| 0x8
| TemporaryStorageSize
|-
| 0x3170
| 0x8
| CacheStorageSize
|-
| 0x3178
| 0x8
| CacheStorageJournalSize
|-
| 0x3180
| 0x8
| CacheStorageDataAndJournalSizeMax
|-
| 0x3188
| 0x2
| CacheStorageIndexMax
|-
| 0x318A
| 0x1
| Reserved
|-
| 0x318B
| 0x1
| RuntimeUpgrade
|-
| 0x318C
| 0x4
| SupportingLimitedApplicationLicenses
|-
| 0x3190
| 0x80 (0x8 * 16)
| PlayLogQueryableApplicationId
|-
| 0x3210
| 0x1
| PlayLogQueryCapability
|-
| 0x3211
| 0x1
| RepairFlag
|-
| 0x3212
| 0x1
| ProgramIndex
|-
| 0x3213
| 0x1
| RequiredNetworkServiceLicenseOnLaunchFlag
|-
| 0x3214
| 0x1
| [20.0.0+] [[#ApplicationErrorCodePrefix|ApplicationErrorCodePrefix]]
|-
| 0x3215
| 0x1
| Reserved
|-
| 0x3216
| 0x1
| [20.0.0+] AcdIndex
|-
| 0x3217
| 0x1
| [20.0.0+] [[#ApparentPlatform|ApparentPlatform]]
|-
| 0x3218
| 0x198
| [[#ApplicationNeighborDetectionClientConfiguration|NeighborDetectionClientConfiguration]]
|-
| 0x33B0
| 0x10
| [[#ApplicationJitConfiguration|JitConfiguration]]
|-
| 0x33C0
| 0x40
| [[#RequiredAddOnContentsSetBinaryDescriptor|RequiredAddOnContentsSetBinaryDescriptor]]
|-
| 0x3400
| 0x1
| PlayReportPermission
|-
| 0x3401
| 0x1
| CrashScreenshotForProd
|-
| 0x3402
| 0x1
| CrashScreenshotForDev
|-
| 0x3403
| 0x1
| ContentsAvailabilityTransitionPolicy
|-
| 0x3404
| 0x4
| Reserved
|-
| 0x3408
| 0x40
| [[#AccessibleLaunchRequiredVersionValue|AccessibleLaunchRequiredVersion]]
|-
| 0x3448
| 0x89
| [20.0.0+] [[#ApplicationControlDataCondition|ApplicationControlDataCondition]]
|-
| 0x34D1
| 0x1
| [20.0.0+] InitialProgramIndex
|-
| 0x34D2
| 0x2
| Reserved
|-
| 0x34D4
| 0x4
| [20.0.0+] AccessibleProgramIndexFlags
|-
| 0x34D8
| 0x1
| [20.0.0+] AlbumFileExport
|-
| 0x34D9
| 0x7
| Reserved
|-
| 0x34E0
| 0x80
| [20.0.0+] [[#SaveDataCertificateBytes|SaveDataCertificateBytes]]
|-
| 0x3560
| 0x1
| [20.0.0+] HasInGameVoiceChat
|-
| 0x3561
| 0x3
| Reserved
|-
| 0x3564
| 0x4
| [20.0.0+] SupportedExtraAddOnContentFlag
|-
| 0x3568
| 0x698
| Reserved
|-
| 0x3C00
| 0x400
| [20.0.0+] [[#PlatformSpecificRegion|PlatformSpecificRegion]]
|}
|}


==Language Entry==
== ApplicationTitle ==
Total size is 0x300-bytes.
Total size is 0x300-bytes.


Line 34: Line 336:
| 0x0
| 0x0
| 0x200
| 0x200
| Application name string
| Application name strings
|-
|-
| 0x200
| 0x200
| 0x100
| 0x100
| Application developer string
| Application publisher strings
|}
 
Entry index for each [[Settings_services#LanguageCode|language]]:
 
{| class="wikitable" border="1"
|-
! Entry-index || Icon [[NCA_Content_FS#FS-type3|language]] filename
|-
| 0 || "AmericanEnglish"
|-
| 1 || "BritishEnglish"
|-
| 2 || "Japanese"
|-
| 3 || "French"
|-
| 4 || "German"
|-
| 5 || "LatinAmericanSpanish"
|-
| 6 || "Spanish"
|-
| 7 || "Italian"
|-
| 8 || "Dutch"
|-
| 9 || "CanadianFrench"
|-
| 10 || "Portuguese"
|-
| 11 || "Russian"
|-
| 12 || "Korean"
|-
| 13 || "TraditionalChinese"
|-
| 14 || "SimplifiedChinese"
|-
| 15 || [10.1.0+] "BrazilianPortuguese"
|}
|}
Official apps tend to have most of the title entries' strings set only to English. Some apps don't have certain title entries set at all.
== VideoCapture ==
This is the enum used to determine how gameplay recording can occur, if at all.
{| class="wikitable" border="1"
|-
! Value || Meaning
|-
| 0 || Disabled
|-
| 1 || Enabled
|-
| 2 || Automatic
|}
When this value is 0, gameplay cannot be recorded. When this value is 1, the game must manually sacrifice some of its heap as transfer memory for AM's IApplicationProxy->InitializeGamePlayRecording(). When this value is 2, AM will call NS->BoostSystemMemoryResourceSize(), and allocate the required memory for recording automatically without the usermode process having to do anything.
== PlayLogPolicy ==
[[Applet_Manager_services|AM]] passes [[Shared_Database_services#PlayLogPolicy|this]] to [[Shared_Database_services|pdm:ntfy]] cmd9.
== PlayLogQueryCapability ==
This is used with [[Applet_Manager_services|AM]] commands QueryApplicationPlayStatistics and QueryApplicationPlayStatisticsByUid, to verify whether querying the specified titleIDs are allowed. When not allowed, error 0x3E880 is returned.
{| class="wikitable" border="1"
|-
! Value || Meaning || Description
|-
| 0 || None || The specified titleIDs must match the user-process titleID.
|-
| 1 || WhiteList || The specified titleIDs must match the user-process titleID, or one of the titleIDs from PlayLogQueryableApplicationId.
|-
| 2 || All || All titleIDs are allowed.
|}
== ApplicationErrorCodePrefix ==
S1 games (including S2-Edition) built for [20.0.0+] set this to 0x2. This is set to 0x3 with S2-only games.
== ApparentPlatform ==
This is 0x0 with S1 games. This is set to 0x1 with S2-only and Switch 2 Edition games.
== ApplicationNeighborDetectionClientConfiguration ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x18
| [[#ApplicationNeighborDetectionGroupConfiguration|SendGroupConfiguration]]
|-
| 0x18
| 0x180 (0x18 * 16)
| [[#ApplicationNeighborDetectionGroupConfiguration|ReceivableGroupConfigurations]]
|}
=== ApplicationNeighborDetectionGroupConfiguration ===
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
| GroupId
|-
| 0x8
| 0x10
| Key
|}
== ApplicationJitConfiguration ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
| Flags
|-
| 0x8
| 0x8
| MemorySize
|}
== RequiredAddOnContentsSetBinaryDescriptor ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x40 (0x2 * 32)
| Descriptors
|}
== AccessibleLaunchRequiredVersionValue ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x40 (0x8 * 8)
| Array of [[NCM_services#ApplicationId|ApplicationId]]
|}
== ApplicationControlDataCondition ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8 (0x1 * 8)
| Type
|-
| 0x8
| 0x80 (0x10 * 8)
| [[#ApplicationControlDataConditionData|Data]]
|-
| 0x88
| 0x1
| Count
|}
=== ApplicationControlDataConditionData ===
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x1
| Priority
|-
| 0x1
| 0x7
| Reserved
|-
| 0x8
| 0x2
| AocIndex
|-
| 0xA
| 0x6
| Reserved
|}
== SaveDataCertificateBytes ==
When initialized, the first two bytes here are both 0x1. With S2-only games, the second byte is instead set to 0x4.
u8 +0x11 is 0x0 with S1 games, this is 0x1 with S2-only games.
== PlatformSpecificRegion ==
Data here is only initialized with S2-only games.