4.2 KiB
4.2 KiB
| 1 | # Hyrule Warriors: Age of Calamity (Koei Tecmo's KTGL engine on NVN, SDK 9.6.0), update v327680 = 1.3.0. | |||||
|---|---|---|---|---|---|---|
| 2 | # RomFS: Koei Tecmo RDB archives (asset/*.rdb index + asset/*.rdb.bin* data, asset/data/*.file), a run of IDRK entries with zlib in chunks. | |||||
| 3 | # The shaders are GLSLC compiler outputs: 118 in main and the rest in KTGL's G2S containers inside the RDB data files (shader_split.py idrk_shaders). | |||||
| 4 | # ---- Identity ---- | |||||
| 5 | title_id | 01002B00111A2000 | ||||
| 6 | program_id | 01002B00111A2000 | ||||
| 7 | # ---- App ---- | |||||
| 8 | name | Hyrule Warriors: Age of Calamity | ||||
| 9 | ipa | HyruleWarriorsAgeOfCalamity.ipa | ||||
| 10 | app_category | public.app-category.action-games | ||||
| 11 | # camera on the right stick | |||||
| 12 | pad_layout | full | ||||
| 13 | # ---- Versions ---- | |||||
| 14 | build | v327680 | 1.3.0 | main=c3cf52bf2b05d7310884971b50bcccb8 | subsdk0=3ab92c3444d4ece2f52417b5d8ee86eb | sdk=95832210b36121e88b4f9b7b66239dad |
| 15 | package | v327680 | ||||
| 16 | shader_versions | v327680 | ||||
| 17 | # ---- Files ---- | |||||
| 18 | # subsdk0 is Nintendo's movie library (NintendoSDK_movie, as in Metroid Dread) | |||||
| 19 | modules | main subsdk0 sdk | ||||
| 20 | romfs_marker | asset/MaterialEditor.rdb.bin | ||||
| 21 | zip_store | .bin:.bin1:.bin2:.bin3:.file:.rdb:.webm:.metallib | ||||
| 22 | # ---- Memory ---- | |||||
| 23 | # The NPDM declares no system resource (META +0x14 = 0): the game uses SetHeapSize. Link's Awakening's partition until measured | |||||
| 24 | mem_reserve | 0x100000000 | ||||
| 25 | mem_alias | 0x10000000 | ||||
| 26 | mem_stack | 0x10000000 | ||||
| 27 | app_pool | 0xCD500000 | ||||
| 28 | # The game sizes its heap as total − used memory (nninitStartup, main+0x8ad318), and SetHeapSize must then fit beside the code: the three modules take 66.6 MB (68 MB rounded), more than the | |||||
| 29 | # 64 MB the host reports by default. SetHeapSize(pool − 64 MB) failed with ResultLimitReached, AllocateMemoryBlock returned 0x1003, the game's malloc was never set up, the 866 MB | |||||
| 30 | # graphics heap allocation failed (main+0x8aeb4c) and nnMain returned at once. 72 MB = the image plus stacks: the heap is 0xc8c00000 (3212 MB) and the game's fifteen sub-heaps (3098 MB) fit | |||||
| 31 | mem_used | 0x4800000 | ||||
| 32 | # ---- Textures ---- | |||||
| 33 | # Movie frames (VP9, NV12 to a buffer): the game copies each frame into a 1280x720 R8 and a 640x360 RG8 texture in a CPU-visible pool and publishes them with | |||||
| 34 | tex_flush_upload | on | ||||
| 35 | # ---- Presentation ---- | |||||
| 36 | # The Switch version shows 30 fps and steps the game a fixed amount per update: a KIDS task waits out 1/30 s and steps the game clock by 1/30 s, the battle steps 1 / the game's frame-rate | |||||
| 37 | # block (30.0), and the event scripts step by the KTGL device's frame rate (59.94 / present interval 2). On 1.3.0 main (patches.py FRAME_STEP) three stubs run the updates at the cap | |||||
| 38 | # and set all three to it (with only a 1/60 s wait the clock and the battles ran at twice real time); the host paces the presents at 60 fps, 30 when 60 does not hold. | |||||
| 39 | # 0 = the Switch original | |||||
| 40 | fps_target | 60 | ||||
| 41 | # The updates step by the cap whatever the hold, so holding late frames only paces the screen: frames are shown as soon as they are ready (the 60fps IPA ran battles at 45–57). | |||||
| 42 | # The iPhone battle's GPU going from 10 to 41 ms a frame was first read as its GPU clock following the hold; the same rise came with no hold at all: the battle runs about 1,000 to | |||||
| 43 | # 2,800 compute dispatches a frame after its first cutscene, which each had an encoder of their own (nvn_mtl.m dispatch_enc) | |||||
| 44 | fps_hold | off | ||||
| 45 | # KTGL binds whole mesh pools (up to ~590,000 vertices) and its soldiers' Half2 / Short2 attributes feed integer shader inputs, which the replay converts on the CPU: | |||||
| 46 | # over the bound ranges that was millions of vertices a frame in battle (26 fps at any target on the Mac); only over the vertices each draw reads. Shadow vertex inputs | |||||
| 47 | # (nvn_mtl.m vin_on) now take those attributes on the GPU; this still serves the draws that keep the CPU conversion (transform feedback, DM_NVN_VCONV_CPU=1) | |||||
| 48 | vconv_range | on | ||||
| 49 | # ---- Shader split ---- | |||||
| 50 | shader_groups | /asset/system.rdb=system /asset/MaterialEditor.rdb=material /asset/FieldEditor4.rdb=field /asset/CharacterEditor.rdb=character /asset/EventMaker3.rdb=event /asset/ScreenLayout.rdb=layout /asset/RRPreview.rdb=preview /asset/KIDSSystemResource.rdb=kids | ||||
| 51 | shader_note | Hyrule Warriors: Age of Calamity shaders |