
- Title ID
- 010031F019294000
- Tested build
- 2.20
- Nintendo SDK
- 17.5.8
- Engine
- Unity 2022.3.30f1 IL2CPP, CRIWARE, FMOD
- Graphics API
- NVN
Build this game
Keep [010031F019294000] in your file names, put the base game, update and DLC in one folder and run the script. Follow the build guide, then the sideloading guide. Needs an iPhone 15 Pro or newer, or an M1 iPad or later.
Technical notes
The project's own record of bringing this game up: what its profile needs and why, what was found and what is still open.
Update 2.20 (v458752) over the base game, SDK 17.5.8. Unity 2022.3.30f1 IL2CPP on NVN, with CRIWARE (ADX sound; the story movies are Sofdec USM files that CRI Mana decodes in software) and FMOD. Modules main, subsdk0 (NintendoSDK_movie) and sdk. The 37 DLC NSPs are licences only. Plays on the Mac at 60 fps, as on the Switch: the title, a new save, the story's opening movie, and the tutorial island (rolling, the camera, the Spin Dash). An unsigned IPA has not been built; iOS is untested.
What it needs
| Setting | Where | Why |
|---|---|---|
| Node area cut 1 GB → 62 MB and 2 MB region alignment | dm/tools/sdk_patches.py SDK-wide rules, sdk build 71b1a025… (sdk+0x139468 / +0x1394fc; +0x139654, +0x13965c, +0x139660) |
the SDK-wide function-matched cuts (node area implementation 4, alignment implementation 4); no cut is registered for the build |
sys_resource 0x1000000 |
game.tsv |
the NPDM's 16 MB of system resource: virtual address memory |
app_pool 0x40000000 |
game.tsv |
the heap check's choice: with the hardware pool the alias region was used up to +4.26 GB of 4.38 GB; see Memory |
mem_stack 0x28000000 (640 MB), mem_alias 0x100000000 (4 GB) in the 5 GB block |
game.tsv |
with every other profile's 256 MB stack region, thread creation aborted on some boots; see Memory |
depth_mode zero |
game.tsv |
the game calls nvnDeviceSetDepthMode with near = 0; it only decides the mode of the pipeline bases made before the game runs |
shader_groups /Data/=data |
game.tsv |
everything is under Data/: the player's serialized files and the StreamingAssets bundles |
No code of the game is cut. The game asks for present interval 1, so it needs no frame-rate key.
Memory
nninitStartuphands application pool − used memory toStandardAllocator::Initialize(nullptr, size)as one address region (it returns tomain+0x10f7140) and never callsSetMemoryHeapSize, as in the other Unity games with virtual address memory. With the 1 GB pool that region is 0.91 GB at alias +0.06 GB.- Unity's own allocator (
main+0x1b8402c) reserves most of its regions as 4 MB or 2 MB plus 0x3f000 bytes, which the 2 MB region alignment rounds to 6 MB and 4 MB of address space. - Resolved: an
nn::diagabort atsdk+0x13b2b8(Result 0) on some boots, at the title. The backtrace isnn::os::detail::ThreadManager::CreateThread(sdk+0x135608) →ThreadManagerImplByHorizon::MapAliasStack.StackGuardManager::MapAtRandomAddress(sdk+0x138140) asksAddressSpaceAllocatorBase::AllocateSpace(sdk+0x139070) for a random place for the new stack in the stack region;AllocateSpacetries 512 random addresses and returns 0 when none has the stack and its guard pages free, andMapAliasStackaborts on that (its third outcome; the other, 2, is a failed map that it retries). WithDM_THR=1 DM_SVC=1, the game maps 48 stacks into the stack region in its first 30 s, 106 MB in all: 33 of 1 MB and nine of 8 MB. In the 256 MB stack region every other profile uses, the start positions an existing stack rules out for a new 8 MB one add up to more than the region, so the 512 tries find none on some boots. Horizon gives a 39-bit process a 2 GB stack region. A 640 MB stack region, taken from the alias region in the same 5 GB block (an iPhone has no room for a larger block), holds them; see Thread stacks placed at random in the stack region. - Current: the alias region reached +3.25 GB of its 4 GB in the tutorial island, with at most 1.50 GB mapped; about 2.2 to 2.5 GB resident and 0.8 to 0.9 GB of Metal allocations on the Mac, flat over a 15-minute run. That run mapped 52 stacks, 138 MB in all (13 of 8 MB), into the 640 MB stack region.
Files and shaders
- RomFS: 12,442 files, 3.49 GB; 12,294 UnityFS bundles (1.63 GB), 24 USM movies (1.69 GB) and the CRI ADX banks (
.acb/.awb), nearly all underData/StreamingAssets. - 59,226 shaders from
Data/and the player's GLSLC outputs inmain; all build for the Mac. - Resolved: a red
texture type mismatchline for URP'sCopyDepth(a3d53d20b89e6015, at the title:declares slot 128 as Metal type 2, texture … is type 4). The shader reads the multisample depth throughtexture2d_ms, which the reflection reader recorded as 2D; the binding was right. See Multisample texture slots.
Frame rate
- Current: 60 fps on the Mac (an Apple M6, headless): frame time p50 16.7 ms, p95 19.4 ms on the tutorial island while other builds compiled shaders on the same Mac.
Audio and movies
- CRI ADX sound and FMOD through one six-channel
AudioOut. - The story movies are USM files that CRI Mana decodes on its own threads (
CriManaDecodeThread,CRI MPV Worker) into textures the game draws; they play with no host support. A press shows "A Skip"; A then opens "Skip movie?" with No selected.
Mac routes
- Build with
scripts/build_ipa_from_nsp.py <NSP folder> -k <prod.keys> --platform mac; its last line runs the game. The picture is a 1280x720 crop of the 1920x1080 window texture (nvnWindowSetCrop): screenshots fromDM_CTL/DM_NVN_SHOTneedDM_NVN_SHOT_OUT=1280x720(or the window's size) to show the crop rather than the whole texture. - From a fresh save, through
DM_CTL: A at "Press any Button!" (about 20 s after boot), A (the autosave notice), A ("Creating save data"). The opening movie starts; A, A, Left, A skips it. A (the tilt card) starts the tutorial island: tilt the left stick to roll, the right stick turns the camera, and A goes through the dialogue. The Spin Dash wants B released while the stick is still tilted:B~0.6,B+LUp~0.6,LUp~1as three lines.
Testing
- 2026-10-30, Mac (headless, no audio), this profile in the worktree: the route above from a fresh save through the opening movie, the tutorial island's rolling and camera steps, the next movie and the Spin Dash lesson, with no red line once the shaders were built.
- 2026-10-30, Mac (headless, no audio), 15 minutes of scripted play on the tutorial island (
DM_SVC=1 DM_THR=1): 50,000 frames at 60 fps (p95 20.9 ms), no red line, no crash. - 2026-10-30,
--platform macfrom this profile indm/games: the split checked against these tables with no mismatch; all 59,226 shaders built and stamped, the pipeline prebuild 21 minutes. The first build, from the provisional profile on a Mac shared with other shader builds, took 2 hours (shaders 79 minutes).
Open
- iOS: no IPA built yet; untested on a device.
- Not checked: the story's first world, the battle and multiplayer modes, sound on a Mac with audio out.
- Only update 2.20 is registered. Other versions come from a derived profile.
Found on this game
- Thread stacks placed at random in the stack region: the 640 MB stack region.
- Multisample texture slots:
texture2d_msanddepth2d_msread as their own types, and zero multisample textures for unbound ones. - An SDK 17.5.8 instance of the SDK's address-region node area, cut by the SDK-wide rule.
These notes are republished from the nxnative repository under its MIT license (license and attribution). The original, which may be newer, is the game's notes on GitHub. This site hosts no game files.