Jump to content

Helldivers 2 Model Extraction Help!


Skelethor

Recommended Posts

17 minutes ago, h3x3r said:

Well i figured it out. You need just drop that wav over "vgmstream-cli.exe" and it will convert it to playable wav.

any easy way to auto batch export all audio into readable format or is it going to be a pain like all WWise affected games that I have worked with previously (Death stranding, GTFO, Nier automata)

Link to comment
Share on other sites

It's simple as never. Don't worry. I am still working on bms script. I found another sound container with BKHD header which include wems.

Unpack it to the vgmstream folder next to the vgmstream-cli.exe.

Wait for updated bms script i am working on.

Or use this as temp solution.

######################################################
#  Helldivers 2 - Texture / Mesh / Material  Dumper  #
######################################################
get BaseFileName basename

Open FDDE "" 0

get Magic long
get UnknownCount long
get Files long
getdstring Dummy 0x3C
getdstring Dummy UnknownCount*32

for i = 0 < Files
	endian big
	get FileNameCRC0 long
	get FileNameCRC1 long
	endian little
	get FileTypeCRC64 longlong
	get MainFileOffset long
    get Unknown_0 long
    get StreamFileOffset long
    get Unknown_1 long
    get GpuResourcesFileOffset long
    get Unknown_2 long
    get Unknown_3 long
    get Unknown_4 long
    get Unknown_5 long
    get Unknown_6 long
    get MainFileSize long
    get StreamFileSize long
    get GpuResourcesFileSize long
    get Unknown_7 long
    get Unknown_8 long
    get FileNum long
	savepos EndTable
	
	if FileTypeCRC64 == 14790446551990181426
		if StreamFileSize != 0
			Open FDDE stream 1
			goto MainFileOffset
			getdstring Dummy 0xC0
			savepos MainFileOffset
			string Name p= "%s_textures/0x%04X%04X.dds" BaseFileName FileNameCRC0 FileNameCRC1
			append 0
			log Name MainFileOffset 148 0
			log Name StreamFileOffset StreamFileSize 1
		else
			Open FDDE gpu_resources 2
			goto MainFileOffset
			getdstring Dummy 0xC0
			savepos MainFileOffset
			string Name p= "%s_textures/0x%04X%04X.dds" BaseFileName FileNameCRC0 FileNameCRC1
			append 0
			log Name MainFileOffset 148 0
			log Name GpuResourcesFileOffset GpuResourcesFileSize 2
		endif
		
	elif FileTypeCRC64 == 16187218042980615487
		if GpuResourcesFileSize != 0 && MainFileSize != 0
			Open FDDE gpu_resources 2
			string MdlInfoName p= "%s_meshes/0x%04X%04X.meshinfo" BaseFileName FileNameCRC0 FileNameCRC1
			string MdlDataName p= "%s_meshes/0x%04X%04X.mesh" BaseFileName FileNameCRC0 FileNameCRC1
			log MdlInfoName MainFileOffset MainFileSize 0
			log MdlDataName GpuResourcesFileOffset GpuResourcesFileSize 2
		endif
		
	elif FileTypeCRC64 == 16915718763308572383
		if MainFileSize != 0
			string MatInfoName p= "%s_meshes/mat/0x%04X%04X.mat" BaseFileName FileNameCRC0 FileNameCRC1
			log MatInfoName MainFileOffset MainFileSize 0
		endif
		
	elif FileTypeCRC64 == 5785811756662211598
		if StreamFileSize != 0
			Open FDDE stream 1
			string SoundName p= "%s_sound/0x%04X%04X.wem" BaseFileName FileNameCRC0 FileNameCRC1
			log SoundName StreamFileOffset StreamFileSize 1
		endif
	endif
	goto EndTable
next i

 

vgmstream-win64.7z

Edited by h3x3r
Link to comment
Share on other sites

3 minutes ago, h3x3r said:

Put unpacked wems to the sound folder and run convert_wem_to_wav.bat.

I found some sounds in: 2e24ba9dd702da5c so you can try

Cheers, will look into it later today.

Link to comment
Share on other sites

image.thumb.png.d379f39ea00a7fc460c9666fe7a68ce5.png

Bik Videos! Still haven't figured out why the .mesh files occasionally just have 8 extra bytes at the start, but I've got my BMS script to export quite a lot more data now.

Edit: My variant of h3x3r's BMS script is in the same repository as the Hellextractor tool: https://github.com/Xaymar/Hellextractor/tree/root/extra/QuickBMS. I'm not entirely sure on how complete it is.

Edit 2: Fonts are 0x05106B81DCD58A13, with a 0x80 prefix in the main data. But not all of them have the same length prefix, really want to know what decides the prefix length.

Edit 3: WWise Sound Banks are 0x535A7BD3E650D799. contains multi-language audio. Might need to feed them through this tool.

Edit 4: Original BMS script is seemingly correct. Some of the GPU_RESOURCES and STREAM files have additional data attached, but I do not yet understand what it is. If one export fails, just use a different file - it's not like the game engine doesn't create several identical clones of the files anyway. Half the game size is quite literally the game duplicating assets.

Edited by Xaymar
Link to comment
Share on other sites

2 hours ago, Xaymar said:

image.thumb.png.d379f39ea00a7fc460c9666fe7a68ce5.png

Bik Videos! Still haven't figured out why the .mesh files occasionally just have 8 extra bytes at the start, but I've got my BMS script to export quite a lot more data now.

Edit: My variant of h3x3r's BMS script is in the same repository as the Hellextractor tool: https://github.com/Xaymar/Hellextractor/tree/root/extra/QuickBMS. I'm not entirely sure on how complete it is.

Edit 2: Fonts are 0x05106B81DCD58A13, with a 0x80 prefix in the main data. But not all of them have the same length prefix, really want to know what decides the prefix length.

Edit 3: WWise Sound Banks are 0x535A7BD3E650D799. contains multi-language audio. Might need to feed them through this tool.

Edit 4: Original BMS script is seemingly correct. Some of the GPU_RESOURCES and STREAM files have additional data attached, but I do not yet understand what it is. If one export fails, just use a different file - it's not like the game engine doesn't create several identical clones of the files anyway. Half the game size is quite literally the game duplicating assets.

I am somewhat new to this, how would I go about building Hellextractor?

Link to comment
Share on other sites

2 minutes ago, orion42m said:

I am somewhat new to this, how would I go about building Hellextractor?

  1. Install the latest CMake and a compatible compiler (Visual Studio Community Edition works fine).
  2. Download and extract the repository to a place you can remember.
  3. Open CMake-GUI
    1. Set the source directory to the directory that has the CMakeLists.txt file.
    2. Set the build directory to a directory of your choice. Must be different than source directory.
    3. Click Generate and follow through with what it asks you, leave things at default unless you know what you're doing.
    4. Click Open Project
  4. In Visual Studio:
    1. In the top navigation bar, change Debug to Release.
    2. In the menu bar click Build, then click Build Project.
    3. Wait.
  5. Binary files will be present in the <build directory>/Release/ directory.
Link to comment
Share on other sites

53 minutes ago, h3x3r said:

BTW i think that meshInfo should be append to the mesh since they share same filetype.

Considering that there is always one offset pointing to the end of the MeshInfo file - or rather, 8 bytes before the end - it's likely that this may be the case. I'm not sure if it is truly like this in the engine, as I don't have a copy of it to test with, but it'd make more sense than this random odd 8 bytes at the start of random .mesh files.

Edit: Theory doesn't work out. The meshinfo file for the random ones with 8 extra bytes at the start is perfectly identical. Not even a single bit is different.

Edit 2: I love that the Stingray engine still treats the entire filesystem as if it were a Hard Disk Drive or Optical Media. It's super wasteful, considering that it duplicates data everywhere, but it also means it doesn't have to seek around for relevant files - a horribly slow operation on HDDs and Optical Media.

Edited by Xaymar
Link to comment
Share on other sites

57 minutes ago, Xaymar said:

Considering that there is always one offset pointing to the end of the MeshInfo file - or rather, 8 bytes before the end - it's likely that this may be the case. I'm not sure if it is truly like this in the engine, as I don't have a copy of it to test with, but it'd make more sense than this random odd 8 bytes at the start of random .mesh files.

Edit: Theory doesn't work out. The meshinfo file for the random ones with 8 extra bytes at the start is perfectly identical. Not even a single bit is different.

Edit 2: I love that the Stingray engine still treats the entire filesystem as if it were a Hard Disk Drive or Optical Media. It's super wasteful, considering that it duplicates data everywhere, but it also means it doesn't have to seek around for relevant files - a horribly slow operation on HDDs and Optical Media.

Yeah, 120 GB and counting, Is there a script to convert the .meshinfo files or do I need to manually convert them all?

Edited by orion42m
Link to comment
Share on other sites

59 minutes ago, Xaymar said:

Considering that there is always one offset pointing to the end of the MeshInfo file - or rather, 8 bytes before the end - it's likely that this may be the case. I'm not sure if it is truly like this in the engine, as I don't have a copy of it to test with, but it'd make more sense than this random odd 8 bytes at the start of random .mesh files.

Edit: Theory doesn't work out. The meshinfo file for the random ones with 8 extra bytes at the start is perfectly identical. Not even a single bit is different.

Edit 2: I love that the Stingray engine still treats the entire filesystem as if it were a Hard Disk Drive or Optical Media. It's super wasteful, considering that it duplicates data everywhere, but it also means it doesn't have to seek around for relevant files - a horribly slow operation on HDDs and Optical Media.

Also is there a way to more easily navigate this mess?

Link to comment
Share on other sites

9 minutes ago, orion42m said:

Yeah, 120 GB and counting, Is there a script to convert the .meshinfo files or do I need to manually convert them all?

There's a script further up in a spoiler somewhere. The entire format is not quite well understood yet, so nothing solid.

6 minutes ago, orion42m said:

Also is there a way to more easily navigate this mess?

Nope. The Stingray Engine converts filenames to ids, which seem to be unique per project. We'd need to figure out an Id -> Name map, and apply it as needed. Unless someone knows the exact process by which ids are created, this is as good as it gets.

Link to comment
Share on other sites

It appears as if the corrupted files are a result of QuickBMS. If you manually jump to the offsets in the respective files, or use anything else (like python, or c++), all files export just fine. However if you use QuickBMS, at complete random, some of the exported files end up with 8 bytes inserted at the start. The 8 bytes it inserts exist at a much earlier or later location, but are not anywhere close to the actual data being copied. So i guess we've got that figured out now.

Link to comment
Share on other sites

Anyone familiar with IDA code. Here is that hash function.

Spoiler
  {
    .maxstack 8
    ldarg.0
    call     instance void [mscorlib]System.Object::.ctor()
    ldarg.0
    newobj   instance void class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string>::.ctor()
    stfld    class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string> Stingray.Console.ReverseIdLookup::_map
    ldarg.0
    ldfld    class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string> Stingray.Console.ReverseIdLookup::_map
    ldc.i4.0
    conv.i8
    ldstr    asc_1429A                  // ""
    callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string>::set_Item(var<u1>, !!T0)
    ldarg.0
    ldarg.1
    call     instance void Stingray.Console.ReverseIdLookup::ReadFile(string path)
    ret
  }

  .method public hidebysig instance string Lookup(unsigned int64 id)
  {
    .maxstack 8
    ldarg.0
    ldfld    class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string> Stingray.Console.ReverseIdLookup::_map
    ldarg.1
    callvirt instance var<u1> class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string>::get_Item(void)
    ret
  }

  .method public hidebysig instance string LookupOrHex(unsigned int64 id)
                                        // CODE XREF: Stingray.Console.LoadingProfiler__DrawScope+57↑p
                                        // Stingray.Console.LoadingProfiler__DrawUnfinishedScope+3A↑p ...
  {
    .maxstack 8
    ldarg.0
    ldfld    class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string> Stingray.Console.ReverseIdLookup::_map
    ldarg.1
    callvirt instance bool class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string>::ContainsKey(var<u1>)
    brfalse.s loc_A5BB
    ldarg.0
    ldfld    class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string> Stingray.Console.ReverseIdLookup::_map
    ldarg.1
    callvirt instance var<u1> class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string>::get_Item(void)
    ret

loc_A5BB:                               // CODE XREF: Stingray.Console.ReverseIdLookup__LookupOrHex+C↑j
    ldarga.s 1
    ldstr    aX                         // "X"
    call     instance string [mscorlib]System.UInt64::ToString(string)
    ret
  }

  .method private hidebysig instance void ReadFile(string path)
                                        // CODE XREF: Stingray.Console.ReverseIdLookup__.ctor+25↑p
  {
    .maxstack 5
    .locals init (unsigned int8[] V0,
                  int32 V1,
                  int32 V2,
                  string V3,
                  unsigned int8[] V4)
    ldarg.1
    call     bool [mscorlib]System.IO.File::Exists(string)
    brtrue.s loc_A5D9
    ret

loc_A5D9:                               // CODE XREF: Stingray.Console.ReverseIdLookup__ReadFile+6↑j
    ldarg.1
    ldc.i4.3
    call     unsigned int8[] [common]Stingray.FileUtils::ReadAllBytes(string, valuetype [mscorlib]System.IO.FileShare)
    stloc.0
    ldc.i4.0
    stloc.1
    ldc.i4.0
    stloc.2
    br.s     loc_A626

loc_A5E7:                               // CODE XREF: Stingray.Console.ReverseIdLookup__ReadFile+5A↓j
    ldloc.0
    ldloc.2
    ldelem.u1
    brtrue.s loc_A622
    call     class [mscorlib]System.Text.Encoding [mscorlib]System.Text.Encoding::get_UTF8()
    ldloc.0
    ldloc.1
    ldloc.2
    ldloc.1
    sub
    callvirt instance string [mscorlib]System.Text.Encoding::GetString(unsigned int8[], int32, int32)
    stloc.3
    call     class [mscorlib]System.Text.Encoding [mscorlib]System.Text.Encoding::get_UTF8()
    ldloc.3
    callvirt instance unsigned int8[] [mscorlib]System.Text.Encoding::GetBytes(string)
    stloc.s  4
    ldarg.0
    ldfld    class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string> Stingray.Console.ReverseIdLookup::_map
    ldarg.0
    ldloc.s  4
    ldc.i4.0
    call     instance unsigned int64 Stingray.Console.ReverseIdLookup::MurmurHash64(unsigned int8[] data, unsigned int32 seed)
    ldloc.3
    callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`2<unsigned int64, string>::set_Item(var<u1>, !!T0)
    ldloc.2
    ldc.i4.1
    add
    stloc.1

loc_A622:                               // CODE XREF: Stingray.Console.ReverseIdLookup__ReadFile+1A↑j
    ldloc.2
    ldc.i4.1
    add
    stloc.2

loc_A626:                               // CODE XREF: Stingray.Console.ReverseIdLookup__ReadFile+15↑j
    ldloc.2
    ldloc.0
    ldlen
    conv.i4
    blt.s    loc_A5E7
    ret
  }

  .method private hidebysig instance unsigned int64 MurmurHash64(unsigned int8[] data, unsigned int32 seed)
                                        // CODE XREF: Stingray.Console.ReverseIdLookup__ReadFile+43↑p
  {
    .maxstack 4
    .locals init (int32 V0,
                  unsigned int64 V1,
                  int32 V2,
                  int32 V3,
                  unsigned int8& pinned V4,
                  unsigned int64* V5,
                  unsigned int64 V6,
                  unsigned int8& pinned V7)
    ldarg.1
    ldlen
    conv.i4
    stloc.0
    ldarg.2
    conv.u8
    ldloc.0
    conv.i8
    ldc.i8   0xC6A4A7935BD1E995
    mul
    xor
    stloc.1
    ldloc.0
    ldc.i4.8
    rem
    stloc.2
    ldloc.0
    ldc.i4.8
    div
    stloc.3
    ldloc.3
    ldc.i4.0
    ble.s    loc_A6AD
    ldarg.1
    ldc.i4.0
    ldelema  [mscorlib]System.Byte
    stloc.s  4
    ldloc.s  4
    conv.i
    stloc.s  5
    br.s     loc_A6A6

loc_A660:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+77↓j
    ldloc.s  5
    ldind.i8
    stloc.s  6
    ldloc.s  6
    ldc.i8   0xC6A4A7935BD1E995
    mul
    stloc.s  6
    ldloc.s  6
    ldloc.s  6
    ldc.i4.s 0x2F
    shr.un
    xor
    stloc.s  6
    ldloc.s  6
    ldc.i8   0xC6A4A7935BD1E995
    mul
    stloc.s  6
    ldloc.1
    ldloc.s  6
    xor
    stloc.1
    ldloc.1
    ldc.i8   0xC6A4A7935BD1E995
    mul
    stloc.1
    ldloc.3
    ldc.i4.1
    sub
    stloc.3
    ldloc.s  5
    ldc.i4.8
    add
    stloc.s  5

loc_A6A6:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+2E↑j
    ldloc.3
    brtrue.s loc_A660
    ldc.i4.0
    conv.u
    stloc.s  4

loc_A6AD:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+1E↑j
    ldloc.2
    ldc.i4.0
    ble      loc_A74C
    ldarg.1
    ldc.i4.8
    ldloc.0
    ldc.i4.8
    div
    mul
    ldelema  [mscorlib]System.Byte
    stloc.s  7
    ldloc.2
    ldc.i4.1
    sub
    switch   loc_A734, loc_A728, loc_A71B, loc_A70E, loc_A701, loc_A6F4, loc_A6E7
    br.s     loc_A748

loc_A6E7:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+94↑j
    ldloc.1
    ldloc.s  7
    conv.i
    ldc.i4.6
    add
    ldind.u1
    conv.u8
    ldc.i4.s 0x30
    shl
    xor
    stloc.1

loc_A6F4:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+94↑j
    ldloc.1
    ldloc.s  7
    conv.i
    ldc.i4.5
    add
    ldind.u1
    conv.u8
    ldc.i4.s 0x28
    shl
    xor
    stloc.1

loc_A701:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+94↑j
    ldloc.1
    ldloc.s  7
    conv.i
    ldc.i4.4
    add
    ldind.u1
    conv.u8
    ldc.i4.s 0x20
    shl
    xor
    stloc.1

loc_A70E:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+94↑j
    ldloc.1
    ldloc.s  7
    conv.i
    ldc.i4.3
    add
    ldind.u1
    conv.u8
    ldc.i4.s 0x18
    shl
    xor
    stloc.1

loc_A71B:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+94↑j
    ldloc.1
    ldloc.s  7
    conv.i
    ldc.i4.2
    add
    ldind.u1
    conv.u8
    ldc.i4.s 0x10
    shl
    xor
    stloc.1

loc_A728:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+94↑j
    ldloc.1
    ldloc.s  7
    conv.i
    ldc.i4.1
    add
    ldind.u1
    conv.u8
    ldc.i4.8
    shl
    xor
    stloc.1

loc_A734:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+94↑j
    ldloc.1
    ldloc.s  7
    conv.i
    ldind.u1
    conv.u8
    xor
    stloc.1
    ldloc.1
    ldc.i8   0xC6A4A7935BD1E995
    mul
    stloc.1

loc_A748:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+B5↑j
    ldc.i4.0
    conv.u
    stloc.s  7

loc_A74C:                               // CODE XREF: Stingray.Console.ReverseIdLookup__MurmurHash64+7F↑j
    ldloc.1
    ldloc.1
    ldc.i4.s 0x2F
    shr.un
    xor
    stloc.1
    ldloc.1
    ldc.i8   0xC6A4A7935BD1E995
    mul
    stloc.1
    ldloc.1
    ldloc.1
    ldc.i4.s 0x2F
    shr.un
    xor
    stloc.1
    ldloc.1
    ret
  }
}
}

 

 

Link to comment
Share on other sites

Yeah I know it's probably murmur but how to get filenames from game? Maybe some hook can do that but with that protection game has it won't be easy. With old exe there is a command which delay that protection but not for long.

Link to comment
Share on other sites

If the game uses filenames, you'll likely find them in clear text in one of the files related to the game. If it doesn't, then the best you can do is generate millions of hashes and find matches eventually. The limitations for an engine from 2018 that is cross platform would be:

  • maximum path length of 255 (Windows), 224 (Xbox), or 192 (PS4).
  • Each directory/file name likely matches the regex [a-zA-Z0-9_]+
    • File extensions follow a similar naming.
  • Human factor:
    • it's unlikely to be several hundred directories deep
    • directory and file names are unlikely to be a single or two characters.
    • related files are usually named and placed in similar directories.
      • i.e. content/enemies/bugs/charger/diffuse.dds + content/enemeis/bugs/charger/normal.dds

If you want to attempt the former, try the strings command. There's a Windows version by Microsoft here: https://learn.microsoft.com/en-us/sysinternals/downloads/strings

Edit: A dictionary based attack would likely end up extremely effective.

Edit 2: File Type and File Name are separate, seems like the engine strips off the extension.

Edited by Xaymar
Link to comment
Share on other sites

1 hour ago, h3x3r said:

One filename - 4 fileTypes.

file-Types.jpg

I haven't actively done any reversing for Helldivers 2 but I've done some for Vermintide 2 which uses the same base engine. Here's a hash dictionary of the known extensions for that game. I can see that at least the first file type you have there matches the `.bones` file type.
 

Spoiler

ac2b738a374cf583 actor
931e336d7646cc26 animation
dcfb9e18fff13984 animation_curves
44957ef5a3a368e4 animation_set
3eed05ba83af5090 apb
7ffdb779b04e4ed1 baked_lighting
aa5965f03029fa18 bik
e301e8af94e3b5a3 blend_set
18dead01056b72e9 bones
b7893adf7567506a chroma
f7b361bde8b4dd03 common
fe9754bd19814a47 common_package
0001a6d201e87086 compiled_shader
82645835e6b73232 config
69108ded1e3e634b crypto
8fd0d44d20650b68 data
64298613551f58d4 dds
ed74b77c6d447d84 disabled
9831ca893b0d087d entity
92d3ee038eeb610d flow
6a00deed7d3b235a flow_editor
9efe0a916aae7880 font
d526a27da14f1dc5 ini
fa4a8e091a91201e ivf
a62f9297dc969e85 keys
2a690fd348fe9ac5 level
a14e8dfa2cd117e2 lua
eac0b497876adedf material
48ff313713a997a1 mesh
3fcdd69156a46417 mod
b277b11fe4a61d37 mouse_cursor
169de9566953d264 navdata
3b1fa9e8f6bac374 network_config
ad9c6d9ed1e5e77a package
a8193123526fad64 particles
5f7203c8f280dab8 physics
22bd082459e868d8 physics_data
bf21403a3ab0bbb1 physics_properties
46cab355bd8d4d37 prototype
27862fe24795319c render_config
d37e11a77baafc01 resource
9d0a795bfe818d19 scene
cce8d5b5f5ae333f shader
e5ee32a477239a93 shader_library
9e5c3cc74575aeb5 shader_library_group
fe73c7dcff8a7ca5 shading_environment
250e0a11ac8e26f8 shading_environment_mapping
a27b4d04a9ba6f9e slug
e9fc9ea7042e5ec0 slug_album
90641b51c98b7aac sound
d8b27864a97ffdd7 sound_environment
f97af9983c05b950 spu_job
a486d4045106165c state_machine
bb0279e548747a0a statemachine_editor
0d972bab10b40fd3 strings
ad2d3fa30d9ab394 surface_properties
cd4238c6a0c69e32 texture
91f98cecac930de8 timestamp
94616b1760e1c463 timpani
99736be1fff739a4 timpani_bank
00a3e6c59a2b9c6c timpani_master
19c792357c99f49b tome
e0a48d0be9a7453f unit
8c074c8f95e7841b user_settings
f7505933166d6755 vector_field
6ad9817aa72d9533 volume
786f65c00a816b19 wav
535a7bd3e650d799 wwise_bank
af32095c82f2b070 wwise_dep
d50a8b7e1c82b110 wwise_metadata
504b55235d21440e wwise_stream
76015845a6003765 xml
712d6e3dd1024c9c ugg
a99510c6e86dd3c2 upb
2bbcabe5074ade9e input
52014e20a7fdccef xp
7b82d55316f98c9b vista
de8c9d00247f8fc6 w7
0605775c0481181b w8
293bb3b1982c6d5a main
b6b3099f78886ff9 win32
d596cd750e4e279f zD

 

Edited by Unordinal
  • Like 2
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...