
- Title ID
- 010020400E1C2000
- Tested build
- 1.0.0 (base)
- Nintendo SDK
- 7.3.2
- Engine
- Unity 2018.3.10f1 IL2CPP
- Graphics API
- NVN
Build this game
Keep [010020400E1C2000] 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.
Base game 1.0.0 (v0), SDK 7.3.2. Unity 2018.3.10f1 IL2CPP with FMOD on NVN. Modules main, subsdk0 (the movie module, which plays StreamingAssets/Movies/*.mp4, H.264 Main and AAC) and sdk; sdk and subsdk0 are DRAGON QUEST XI S's builds (01006C300E9F0000), so that build's cuts apply as they are. No host change was needed. Playable on an iPhone (see Open). On the Mac: the publisher logo, the opening movie with its sound, the title, options, a new game through the tutorial and the prologue (the date card, the opening pictures, choices, the in-game menu, scenario chart and log), at 60 fps as on the Switch (the game asks for present interval 1), with saves; no red line at run time.
What it needs
| Setting | Where | Why |
|---|---|---|
depth_mode zero |
game.tsv |
the game selects near-zero NVN depth; offline pipeline bases must use the matching vertex entry |
DRAGON QUEST XI S's sdk cuts: node area 1 GB → 62 MB, regions of 4 MB and more aligned to 2 MB (SDK 20's) |
dm/tools/sdk_patches.py SDK-wide rules, sdk build fcf93a41… (the constructor at sdk+0x32c450, cuts at +0x32c460 and +0x32c500; AllocateAddressRegion's alignments at +0x32c664, +0x32c66c, +0x32c670) |
they put StandardAllocator's region 64 MB into the alias region; see Memory |
sys_resource 0x1000000 |
game.tsv |
the NPDM's 16 MB of system resource: virtual address memory |
5 GB guest layout with the hardware pool: mem_reserve 0x140000000, mem_alias 0x118000000, mem_stack 0x10000000, app_pool 0xCD500000 |
game.tsv |
Engage's block (256 MB in front + 4.375 GB alias region + 256 MB stack region + 128 MB heap region); Unity 2018.3 maps only inside StandardAllocator's region, so the pool stays as on the Switch |
shader_groups /Data/=data |
game.tsv |
|
No pad_layout (the 2D default) |
game.tsv |
controller only; see Input |
Memory
- The NPDM declares 16 MB of system resource, so
IsVirtualAddressMemoryEnabledis true:nninitStartuphands application pool − used memory to StandardAllocator as virtual address memory, one address region in the alias region, and the game never callsSetMemoryHeapSize(no heap). - Unlike Unity 2020 and 2022 (Ace Attorney Investigations Collection, Monster Train 2: a 1 GB pool), Unity 2018.3 reserves no address regions of its own: every page the game maps lies in StandardAllocator's region, which ends at +3.21 GB of the 4.38 GB alias region. So the hardware pool (3.2 GB) leaves no address space short, and only mapped pages cost memory: 377 MB mapped at the peak over the title, the tutorial and the opening (Mac,
DM_SVCmap log). The NSP script's heap check keeps the hardware pool for this game for the same reason (dm/games/README.md, Adding a game). - On the Mac about 0.6 GB resident at the title and 0.77 GB after ten minutes of story (it grows with each new picture and slows down), 0.4 GB of Metal allocations.
Input
- Controller only: the game reads no touch, docked or handheld (a handheld run with taps on the title's READ logged no touch read). It stays docked at 1920x1080 with the 2D pad layout. Menus answer the left stick as well as the D-pad, and no menu item is selected until a direction is pressed. A advances and selects, B goes back, X opens the menu, Y the scenario chart, L the log, R auto mode.
Files and shaders
- Resolved: offline depth metadata. Base 1.0.0 selects near-zero NVN depth in
regress/runs/20261028-171226-candidate-full-1/log.txt(through frame 5,100), with no later GL switch. A short isolated boot reproduced the call with matching registered module IDs; evidence is in010020400E1C2000-work/depth-mode-audit/boot-20261031/beside the NSPs. The profile now declaresdepth_mode zerofor the shared archive mechanism. This confirms the input; rebuilt archive acceptance and performance were not retested. - The story's pictures are loose PNG / JPG files in
StreamingAssetsthat the game loads itself. - 452 shaders: the 48
Shaderobjects of the player's serialized files (Data/*.assets, the Unity built-ins inData/Resources; 450 subprograms) and the player's 4 GLSLC outputs inmain. - Resolved: the split stopped with "no bundle has a Shader type tree of the same hash to borrow" (hash
8db76007…). There are no bundles, and no game of that Unity version with a bundle was at hand, soSHADER_2018_3inunityfs.py'sKNOWN_TREESis written from AssetRipper's TypeTreeDumps (StructsDump/release/2018.3.10f1.dump), checked node for node against the dump (1,325 nodes, the alignment flags included). It is a layout of its own, older than the common structs: no conservative raster state,BufferBindingwithoutm_ArraySize,ConstantBufferwithoutm_IsPartialCB, the parameters in each subprogram and nom_CommonParameters, one segment per platform (the pre-2019.3 form Cuphead's trees gaveshader_programs). Each of the 48 objects reads to its exact end: 450 subprograms of version 201802150 (older than the local keyword list, which starts at 201806140). - The two built-in
ComputeShaderobjects inunity default resourcesstay unread (a[RED]line in the split): their 2018 layout lists kernels with no unique variants. The game dispatches no compute. - To take one file out of an NSP without extracting the RomFS, filter
nx_extract'sCopyby path. - Direct-image validation (2026-10-27): the merged base writes a
RomFS.imgwith 1,473 resource files (919,413,381 file-data bytes), no RomFS directory. Every image path, size and first 32 bytes matches an independent LibHac manifest. The image scan retains all 452 registered shader rows unchanged and adds 15 compute shaders fromunity default resourcessupported by the current parser; the registered profile's older map/facts therefore stop the full build at table validation. The profile was not changed for this storage work. - Direct-image runtime checked: the current host with the registered 452-shader package rebuilt for chain
157e1b96c8daran 4,200 frames (about 70 seconds) through the opening and tutorial, reading the image in place. The log records the image mount (1,518 entries), 143 filesystem opens and no[RED]lines; the frame-3,600 screenshot shows the tutorial choices. Evidence stays in<NSP folder>/010020400E1C2000-work/direct-romfs-run/. This checks populated-image gameplay; it is not a timing comparison against folder storage.
Mac routes
- From a fresh save,
DM_KEYS="f700:A,f900:LLeft,f1000:LLeft,f1100:LLeft,f1200:A,f1500:A*14/120,f3300:LDown*5/60,f3640:A,f3900:A*35/120"skips the opening movie, starts READ, reads through the tutorial, picks "I'm good (to main story)" and reads into the prologue (the motorbike picture at about frame 6,600).
Found on this game
-
Offline depth metadata: Offline pipeline archive and profile depth disagree.
-
Direct extraction and scanning of a RomFS image: RomFS image build pipeline.
-
Unity 2018.3's
Shaderlayout written out (SHADER_2018_3, from AssetRipper's TypeTreeDumps): Unity Shader layouts written out for players without bundles. -
The heap check keeps the hardware pool for a Unity 2018.3 game that maps only inside StandardAllocator's region: dm/games/README.md, Adding a game.
Open
- Status disagrees: the
game.tsvheader says "Plays on the Mac", docs/development.md says playable on an iPhone.
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.