The game uses Spike Chunsoft own model structure SRD https://wiki.spiralframework.info/wiki/SRD with a different extension, I tried to use the Spiral tool for Danganronpa V3 extraction, but the UVs are messed up, the textures come out fine though.
.srd -------> .npk (pointer/reference file for the model and texture data)
.srdi ------> .npki (raw model data)
.srdv ------> .npkv (raw texture data)
I’ve been skimming through the first 2 files to understand the model structure with the help of hex2obj, and I think I got it, but don’t have the knowledge to put it into a script. I’ll try to explain myself using Luffy (Marineford) model with the character id “character_000” and the interface from h2o, please bear with me if I say some gibberish. character_000.7z sample
In the character_000.npk file there are $VTX entries that points to the submeshes data in the character_000.npki, each with a $RSI sub-entry, and this last one ends with $CT0.

This is the first $VTX entry in character_000.npk, it points to the straw hat submesh in character_000.npki
20 bytes after $VTX we have the submesh vertices count 75 04, in reverse byte ordering 0x475 = 1141 decimal.
28 bytes after $RSI we have the vertices start address 00 00 00, and right below it, after 13 bytes, the face indices start address E0 AB 01, 0x1abe0, 1 byte after it we have the face indices block length 80 2B, 0x2b80 when divided by 2 we get the FI count 0x15c0 = 5568 decimal.
To get the UV start address we must add the bytes in blue to the vertices start address, they’re not always in the same position in the $VTX section, but they are preceded by 00 00 20 00 00 00 after the vertices block length, which is always after the 30 00 00 00 bytes in the $VTX section: 0x0 + 0x16490 UV start address.
For the FVFsize we divide the vertices block length by the vertices count:
0xd5f0 / 0x475 = 0x30 = 48 decimal (haven’t found models with other value).
To get size UVB we need to subtract the values in blue from the values in purple 1 byte after the vertices address and divide the difference by the vertices count: (0x1abe0 – 0x16490) / 0x475 = 0x10 = 16 decimal (some are 8 and some 16).
And if I understood the hex2obj tutorial correctly the values between the vertices block and the UVs block should be the submesh’s normals, we can get their start address if we add the vertices block length to the vertices start address: 0x0 + 0xd5f0 = 0xd5f0.
Before the $CT0 we have the name of the submesh, in this case C_HUT.
Open the character_000.npki in hex2obj and input the calculated values from character_000.npk

After this cumbersome explanation here is an example with the next submesh, the left eye. See that the vertices block length and values in blue aren’t in the same position as the previous $VTX.
Code: Select all
Vertices start address: 0x1d760 vertices count: 0x6d = 109 decimal
Face indices start address: 0x1fce0 FI count: 0x438/2 = 0x21c = 540 decimal
FVFsize: 0x1470 / 0x6d = 0x30 = 48 decimal
UV start address: 0x1d760 + 0x2210 = 0x1f970 Size UVB: 0x2578 – 0x2210 / 0x6d = 8
Normals? start address: 0x1d760 + 0x1470 = 0x1ebd0
I know it is lazy of me to just request a noesis script but after reading the tutorials here I really don't get it, I hope this information would be useful to anyone wanting to help with the coding part.










