
- Title ID
- 01003E601E324000
- Tested build
- 1.1.2
- Nintendo SDK
- 16.2.6
- Engine
- Unreal Engine 4.27
- Graphics API
- NVN
Build this game
Keep [01003E601E324000] 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 1.1.2 (v262144) over the base game, SDK 16.2.6. Square Enix, Unreal Engine 4.27.2 (SDK MW+EpicGames+UnrealEngine-4_27_2 in main): everything in one pak whose index is encrypted, NVN, CRIWARE sound (a 6-channel AudioOut beside the audio renderer) and Sofdec movies (.usm, decoded on CRI Mana's own threads). Modules main, subsdk0 (NintendoSDK_movie, which main imports from) and sdk. 60 fps (30 on the Switch) by the host's write of Unreal's present interval.
Status: brought up on the Mac on 2026-10-31: the logos and the opening movie, the title, a new adventure log (name entry, appearance, voice language, objective marker, difficulty), the autosave tutorial, the opening (the voice in the dark, the forest path and the cliff by the waterfalls, walked by the player, the personality questions) into the prologue (the monster in the cave and by the well), the autosave written and continued from the title after a restart, at 60 fps with sound. No red line at run time; about 2.6 GB resident. Not built for the iPhone yet.
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 |
fps_target 60 |
game.tsv, hle_fpslock.c |
the host writes 1 into rhi.SyncInterval; see Frame rate |
FMallocBinned3 constructor call cut, with gate OBS_UE_MALLOC |
the rewriter's engine-wide rule (dm/tools/ue_malloc.py), no build ID |
its pools take 37 GB of the engine region; the host's allocator runs Unreal's heap (hle_uemalloc.c); see Memory |
Engine region given what the alias region has room for, 2.81 GB: gate OBS_UE_REGION on the store of its size |
the rewriter's engine-wide rule (dm/tools/ue_region.py), no build ID; the host's room (hle_svc.c) |
Unreal's nninitStartup reserves 62 GB by default |
| Node area cut 1 GB → 62 MB, regions aligned to 2 MB | dm/tools/sdk_patches.py function-matched cuts (MATCH_CUTS), sdk build a5cb2175… |
the same AddressRegionManager as the other Unreal games' SDKs; matched by the code, no fixed address |
3.75 GB guest block: mem_reserve 0xF0000000, mem_alias 0xC8000000, mem_stack 0x10000000, app_pool 0xCD500000 |
game.tsv |
DRAGON QUEST VII Reimagined's layout: alias region = node area + the engine region + 256 MB for regions made later; 256 MB stacks, 384 MB heap region |
sys_resource 0x5000000 |
game.tsv |
the NPDM declares 80 MB of system resource |
pad_layout full |
game.tsv |
the 3D layout (a D-pad and a right stick), as Octopath Traveler II and DRAGON QUEST VII Reimagined. It plays with the controller, so it stays docked (1920x1080) |
Frame rate
- Current: 60 fps (30 on the Switch). The game's Switch device profile (
Nicola/Config/Switch/SwitchDeviceProfiles.ini) setsrhi.syncinterval=2, the present interval 2 it asks for whiler.VSync=1(BaseSwitchEngine.ini) locks presents to vsync; no config setsFrameRateLimitort.MaxFPS. The host writes 1 intorhi.SyncInterval(hle_fpslock.c, found by its name as in every Unreal game) whenever the game sets it back, and the game then asks for present interval 1 itself. - Unreal steps the game by the time that really passed: from the same autosave, the same 0.6 s stick press scrolled the prologue's cave by 245 px at 60 fps and 240 px at 30 fps (
run/ab.sh, phase correlation of the shots before and after). DM_FPS_TARGET=30(Documents/env.txton the iPhone) keeps the game's own 30 and saves power.- The texture streaming pool is the game's own concern here: its Switch profile sets
r.Streaming.PoolSize=850, soue_texture_poolis not set.
Memory
- As DRAGON QUEST VII Reimagined (0100A9D01C446000):
nninitStartupneeds virtual address memory and reserves 62 GB for the engine; the rewriter's engine-wide rules cut the allocator's constructor and gate the region's size. The log's[mem] Unreal's engine region: 62.00 GB asked, 2.81 GB of address space, what the alias region has room forshows it. - On the Mac through the opening and the prologue: up to +0.75 GB of the alias region with 0.5 GB mapped, an Unreal heap (host malloc zone) of 1 GB, about 2.6 GB resident.
Files and shaders
- Resolved: offline depth metadata. Update 1.1.2 selects near-zero NVN depth in
run/final.log(through frame 4,500), with no later GL switch. A short isolated boot reproduced the call with matching registered module IDs; evidence is in01003E601E324000-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. - One pak,
Nicola/Content/Paks/Nicola-Switch_0_P.pak(7.4 GB, 172,665 files, version 11 with the magic 0xcc from the end, Oodle and Zlib blocks; the profile'sromfs_marker): the cooked packages, CRIWARE.awbbanks (BGM, English and Japanese voices) and.usmmovies, and the two shader code archives. The index is AES-256 encrypted, and so are 41 config files. - Resolved: no window of
mainholds the pak key. The callback that hands the key to the engine loads two 16-byte literals from separate places and stores them as one;uepak.pynow reads such keys from the code: An Unreal pak key split into two 16-byte literals. - Shaders:
ShaderArchive-Global-SF_GLSL_SWITCH.ushaderbytecode(1,554 shaders) andShaderArchive-Nicola-SF_GLSL_SWITCH.ushaderbytecode(46,743), stored in the pak, every shader an LZ4 block (uepak.pylz4_shaders, no host run). 47,298 unique shaders (3,823 vertex, 40,605 pixel, 2,831 compute, 39 geometry); the Mac libraries took 2 h 12 min to compile on the first build. - One geometry shader seen in play writes only the layer, and its vertex shader draws with its layer entry points instead (the host's general rule).
Add-on content
- The NSP folder holds 5 DLC NSPs with a licence only (103 KB each, no content); the host reports the indices as owned. Nothing in the opening asks for them.
Mac routes
- The work folder's
run/ctl.shdrives a run started withDM_CTL(wait S/snap NAME), andrun/ab.sh <tag> [VAR=value…]boots, continues from the autosave in the first slot, presses the stick left for 0.6 s and takes shots before and after (the frame-rate check above): 05, Scripted input.
Found on this game
General mechanisms used here:
- An Unreal pak key split into two 16-byte literals in
main's code (uepak.pycode_keys): An Unreal pak key split into two 16-byte literals, 01, Compressed RomFS content. - Offline depth metadata: Offline pipeline archive and profile depth disagree.
Open
- The iPhone: no IPA built or tested yet.
- Only the opening and the prologue were played; the first town, a battle and a church save are not tested yet. 38 of the 39 geometry shaders have not been seen in play.
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.