Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 05/06/2025 in all areas

  1. Added support for version 4 of locres to UE4localizationsTool Added to row editor, edit or add new Item ID for row UE4localizationsTool-v2.7.2.zip
    4 points
  2. Json to Txt Converter v3 Fixed some issues — it now extracts English and Japanese voice-over dialogs separately. To use it, modify the for key in ['4', '5'] parts in both scripts to match your game's structure. Simply open the auth and sound_auth JSON files, identify which keys contain the dialog lines, and update that section of the code accordingly. DragonEnginejson.7z
    4 points
  3. Python code to extract the texts: import struct, codecs BIN = "/mnt/data/menu_decompress.dat" OUT = "/mnt/data/menu_decompress_output.txt" be16 = lambda b, o: struct.unpack_from(">H", b, o)[0] le32 = lambda b, o: struct.unpack_from("<I", b, o)[0] be32 = lambda b, o: struct.unpack_from(">I", b, o)[0] def read_wstr_be(buf, off): raw = bytearray() while off + 1 < len(buf): val = be16(buf, off) off += 2 if val == 0: break raw += val.to_bytes(2, "big") return raw.decode("utf-16-be", errors="replace") with open(BIN, "rb") as f: data = f.read() p = 8 name_len = le32(data, p) p += 4 + name_len + 1 p += 1 + 4 + 4 + 20 + 4 + 8 base = p max_num = be16(data, p) p += 2 count = be16(data, p) p += 2 data_pos = p p += count * 4 num_blocks = be16(data, p) p += 2 tbl = p memo, visiting = {}, set() def tex(idx): if idx == 0: return "" if idx in memo: return memo[idx] if idx in visiting: memo[idx] = "" return "" visiting.add(idx) node_off = data_pos + idx * 4 if node_off + 3 >= len(data): visiting.remove(idx) memo[idx] = "" return "" right = be16(data, node_off) left = be16(data, node_off + 2) s = read_wstr_be(data, node_off) if left == 0 else tex(left) + tex(right) visiting.remove(idx) memo[idx] = s return s out = [] ptr = tbl for _ in range(num_blocks): if ptr + 12 > len(data): break data_u = be32(data, ptr + 4) + base loc = be32(data, ptr + 8) + base + 2 ptr += 12 if loc - 2 >= len(data): continue rec_cnt = be16(data, loc - 2) pos_tmp = data_u for r in range(rec_cnt + 1): ent_off = loc + r * 4 if ent_off + 1 >= len(data): break end = be16(data, ent_off) + data_u if end > len(data): break pos = pos_tmp buf = [] while pos < end: b = data[pos] if b < max_num: buf.append(tex(b + 1)) pos += 1 elif b < 255: val = be16(data, pos) - 255 * max_num buf.append(tex(val + 1)) pos += 2 else: # b == 255 val = be16(data, pos + 1) buf.append(tex(val + 1)) pos += 3 out.append("".join(buf)) pos_tmp = pos with codecs.open(OUT, "w", "utf-8") as f: f.write("\n".join(out)) I can also work on repack if I find spare time.
    4 points
  4. Requirements UABEA PXR.py (For text extract and import) UnityPlayer.dll FFPR_FontTool (Optional, for font editing) Locating and Editing Texts Text files are stored inside the message_assets_all file "FINAL FANTASY_Data\StreamingAssets\aa\StandaloneWindows64" Open this file with UABEA and Select the four English text files by holding Ctrl and left click: system_en, story_mes_en, story_cha_en, etc_text_en On the right panel, click Plugins and export as txt. Create a new folder and move these exported .txt files into it. Download PXR.py and place it inside the same folder. Run the PXR.py and type 1 to extract the texts. Edit the generated merged_output_en.txt file as you want. After editing run PXR.py again and type 2 to import edited texts. Open message_assets_all with UABEA again, choose txt files > Plugins > Import.txt and choose the "merged" folder. And do Ctrl + S to save. Font Editing (Fonts are located in FINAL FANTASY_Data\StreamingAssets) Run FFPR_FontTool. Choose option D, then drag the font_en.bundle file into the tool. Choose a random name to extract the font files. This will decrypt the bundle. Open the extracted font files in UABEA. Select SE-ALPSTN and sqex-MonoSix files, then click Plugins > Export.ttf to export them. Edit the fonts, or you can use another font if you wish. After that Plugins > Import fonts with UABEA. Run FFPR_FontTool again, choose option E, drag your edited font files, and save as font_en.bundle. Textures Locations common_title.bundle: Title Screen Textures common_assets.bundle: Title Logo and Language Textures hit_sprite.bundle: Hit Textures miss_sprite.bundle: Miss Textures Installation For mods to work properly, you need to use the "UnityPlayer CRC Check Bypass" mod otherwise your mod will not work. https://www.nexusmods.com/finalfantasypixelremaster/mods/90 Credit: Shiryu64 on Moogles & Mods Discord FINAL_FANTASY_PIXEL_REMASTER_FONT_MODDING_TUTORIAL.pdf
    3 points
  5. So, I have been trying to make a script to generate .Obj files automatically from the game's psp files. To explain all the details: A .psp contains the meshes, animations and textures of a single 3D object. And they look something like this: The meshes are stored in .PSO files, while the animations are in .PSA, and the textures in .PSI (don't care about those two yet). Since there can be multiple meshes, textures, and animations in a single file, information like what texture corresponds to what mesh and such is stored in a .PSM file: I haven't really tried to check what the list of floats could possibly mean for the meshes so far. I have no idea. Alright, and here is what the PSO files look like, finally: Using the triangle strip algorithm from @Sparagas 's triangle generator in my script, I have managed to somewhat successfully re-construct the individual meshes from the .pso files: If you look closely, though, you can see there are these ugly triangle spikes coming out of the model. But if you look even closer, you can see the mesh is actually full of them: (There are also a lot of overlapping faces but that's another thing) From my understanding of tri-strips, this is probably intended? The result is good enough that my guess is the developers used a sub-optimal tri-strip conversion algorithm, and all these spikes aren't actually meant to be displayed, which is why most of them are inside the mesh and not outside. This doesn't explain what's up with the ones outside though. And, another problem: some of the models are missing a few faces! You can see on the top picture that the gun and the parallelogram-thingy have holes on their surfaces. But HoiHoi-san's head doesn't seem to have any. Weird! So, all that's left is figuring out: If there is a way to make all the visible spikes go away Why the missing faces If there is a way to fix the overlapping faces And all of this should be able to be done by a script, of course. I'll leave the raw .psp, .pso, and .obj files if anybody wants to take a look. And also my python script (it requires Open3D, which was a pain to install and is pretty resource heavy, if you can adapt it to something else I highly recommend you do that instead LOL). I'll also leave the textures here if anyone wants to figure that out. pointVisualizer.py HoiHoiFiles.7z
    3 points
  6. Here's a QuickBMS script to extract the .pix archives with proper names. You can analyse it and write a file spec from it. pix.zip
    3 points
  7. Oh, here is my script. It is based in other script that I made before. A lot of PS2 games use that mesh format with tags, I just changed a few things here and there: fmt_legend_of_spyro_ps2_mdg.py
    3 points
  8. Version 1.0.0

    307 downloads

    My old tool for TLOU2 PS4 fixed to work with PC files. Unpack .psarc files with UnPSARC_v2.7, and then you can use any .PAK file with the tool. Use command line, or just drop .PAK file onto the .exe Work same as old tool, described here: https://web.archive.org/web/20230819184855/https://forum.xentax.com/viewtopic.php?t=22580 After extraction, model and skeleton are in separate files. So they must be manually combined to work together. SMD model & skeleton can be just imported separately and then connected in blender. For ascii it will not work, so you have to open model in text editor, remove first line (0), which is bone number, and copy-paste skeleton there instead of that zero. So far tested on models, textures, maps - all looks fine. Animations are probably wrong, i can look into that later.
    3 points
  9. Yeah, these models are a pain in the ass, lol. Sometimes after vertices is a kind of Flag but not in this case. And there is other problem.. I tried to read all meshes but all appear in the center, that is not good(image1), I exported like that and moved the meshes(image2) using Blender. Maybe you need the skeleton(?) I also read Uvs but I need to scale Y axis and rotate, weird.. So yes, buffer size is 16 bytes: 12 bytes(3 Floats) for vertices and 4 bytes(2 shorts) for Uvs. I can't do more, this is a mess..
    2 points
  10. The Tyrannosaurus Rex Female Is Coming Soon ;D - !!!ROAR!!! Something As Survived ;D
    2 points
  11. I am here mostly to ask questions and see if I can figure out this reverse engineering stuff ^^ I have been working on ripping all the assets from Ichigeki Sacchuu!! HoiHoi-San and coding my own asset extractor/importer for the game. I am still new to coding things that aren't web-pages, so its all a mess for now LOL. See ya around.
    2 points
  12. Hello, the problem has been widely discussed in this forum without a final result, afaik. It depends on the triangle strips algo used and/or stop markers (if any) for face building. edit: no markers found (There's a similar problem with "skipfaces", see posts from roocker666 but I think it's not related here.) edit: those bytes at vertex start +12 seem to be uvs, as you've assumed, so 12 bit tx, 12 bit tv? A little bit uncommon.
    2 points
  13. I, together with AI, have created a tool to export/import PNGs from FONT0.bin. The compression method is similar to LZ (though I'm not sure about the specifics). Editing steps: 1. Export. 2. Edit the PNG — the edited PNG must be in indexed format. 3. Edit the JSON — it contains information such as width, height, left, and top. Adjust these to fit the new characters. 4. Save. Note: Try to make the edited font smaller than the original. It seems the game allocates a fixed amount of memory for fonts. Fortunately, the compression works correctly. FONT0_Tool.zip
    2 points
  14. The models are in the .drp files, once extracted from the .pix archives. Textures are .x2m (not sure what format) Most models have several submeshes, so it will need proper analysis and a script to get all of the mesh data properly. Just a manual example of one submesh:
    2 points
  15. 2 points
  16. help how ? Sharing is the way..
    2 points
  17. Version 1.5.0

    9 downloads

    With this tool, you will be able to decompress and compress, unpack and pack the .bin files related to the game's texts and maybe graphics.
    2 points
  18. Small World is it? I was helping a spanish guy in Xentax discord about this exactly game a few days ago. I made a tool to unpack/pack descompress/compress LZSS compression. The tool is in Modern Portuguese, my native language, but is easy to understand. GsS_Lzss_Tool_v2.zip
    2 points
  19. I can't be the only one checking this thread daily for any updates 🤣🤣🤣
    2 points
  20. Hello, for the Guardian_Fire dragon Dave's (DKDave?, dunno) script collects 997 small vertex chunks with 3 to 16 vertices, afaics. First 0080026C block has 11 elements in each sub block (0B000000 after first signature 0080026C). Vertex block signature is 02800B68, maybe the 0B is the count again (as it's known from vif signatures). I've rectangular bordered the first and last vertex of the first chunk in black, the green block seems to contain the uv data as shorts, tx, ty, unk1, unk2, so 11x8 bytes . edit: uvs ok so far (I think), except the for the garbage at the lower left corner:
    2 points
  21. O.K, here's Noesis script. Not sure how to assign material + texture to it. from inc_noesis import * import noesis import rapi import os def registerNoesisTypes(): handle = noesis.register("Bright Light", ".ea3") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadModel(handle, noepyLoadModel) noesis.logPopup() return 1 def noepyCheckType(data): bs = NoeBitStream(data) if len(data) < 20: return 0 return 1 def noepyLoadModel(data, mdlList): bs = NoeBitStream(data) baseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName())) ctx = rapi.rpgCreateContext() Underline = "_" # Header Start bs.read(4) # Sign TotalFileSize = bs.readUInt() MatrixOffset = bs.readUInt() MeshDataBaseOffset = bs.readUInt() # Base Offset bs.read(16) Matrix4x4 = bs.read(64) BBox = bs.read(32) Unknown_0 = bs.readUInt() UnknownOffset = bs.readUInt() MaterialIndex = bs.readUInt() MaterialIndexOffset = bs.readUInt() TextureCount = bs.readUInt() MaterialInfoOffset = bs.readUInt() Unknown_1 = bs.readUInt() Unknown_2 = bs.readUInt() BoneMatrixOffset = bs.readUInt() Unknown_3 = bs.readUInt() Unknown_4 = bs.readUInt() Unknown_5 = bs.readUInt() Unknown_6 = bs.readUInt() Unknown_7 = bs.readUInt() RootOffset = bs.readUInt() Unknown_8 = bs.readUInt() # Header End MaterialPropOffsetList = [] TextureIndexList = [] TextureNameList = [] ShapeInfoOffsetList = [] MaterialIndexList = [] bs.seek(MaterialIndexOffset, NOESEEK_ABS) for i in range(0, MaterialIndex): MaterialPropOffsetList.append(bs.readUInt()) TextureMapCount = bs.readUByte() bs.read(11) for i in range(0, MaterialIndex): MaterialPropOffset = MaterialPropOffsetList[i] bs.seek(MaterialPropOffset, NOESEEK_ABS) TextureIndexList.append(bs.readUByte()) bs.read(7) bs.seek(MaterialInfoOffset, NOESEEK_ABS) TextureNameOffset = bs.readUInt() bs.seek(TextureNameOffset, NOESEEK_ABS) for j in range(0, TextureCount): TextureNameList.append(bs.readString()) TextureName = TextureNameList[j] bs.seek(UnknownOffset, NOESEEK_ABS) bs.read(80) MeshIndex = bs.readUInt() bs.read(4) MeshInfoOffset = bs.readUInt() bs.seek(MeshInfoOffset, NOESEEK_ABS) for k in range(0, MeshIndex): BBox = bs.read(32) ShapeInfoOffsetList.append(bs.readUInt()) Unknown_0 = bs.readUInt() UnknownOffset = bs.readUInt() MaterialIndexList.append(bs.readUByte()) bs.read(3) for k in range(0, MeshIndex): ShapeIndexDigfmt = "{:04d}".format(k) ShapeInfoOffset = ShapeInfoOffsetList[k] MaterialIndex = MaterialIndexList[k] bs.seek(ShapeInfoOffset, NOESEEK_ABS) bs.read(20) IndexOffset = bs.readUInt() + MeshDataBaseOffset bs.read(10) IndexCount = bs.readUShort() Stride = bs.readUByte() Unknown_9 = bs.readUByte() VertexCount = bs.readUShort() bs.read(24) VertexBuffer = bs.readBytes(VertexCount * Stride) bs.seek(IndexOffset, NOESEEK_ABS) IndexBuffer = bs.readBytes(IndexCount * 2) rapi.rpgBindPositionBufferOfs(VertexBuffer, noesis.RPGEODATA_FLOAT, Stride, 0) rapi.rpgBindUV1BufferOfs(VertexBuffer, noesis.RPGEODATA_FLOAT, Stride, 24) rapi.rpgBindNormalBufferOfs(VertexBuffer, noesis.RPGEODATA_FLOAT, Stride, 12) rapi.rpgSetName(baseName + Underline + ShapeIndexDigfmt) rapi.rpgSetMaterial(TextureNameList[TextureIndexList[MaterialIndexList[k]]]) rapi.rpgCommitTriangles(IndexBuffer, noesis.RPGEODATA_USHORT, IndexCount, noesis.RPGEO_TRIANGLE_STRIP) mdl = rapi.rpgConstructModel() mdlList.append(mdl) return 1
    2 points
  22. Version 1.0.1

    227 downloads

    Final Fantasy VII Rebirth tool Exports static and skeletal characters, maps (including nanites). In addition to all DLLs provided here, it requires global.ucas file from the game, it must be in the same folder as .EXE. Usage is similar to previous FF7remake tool. See below. Main difference is that nanite maps (using nanites) are exported in DMF format (download blender plugin for it here). Tool usage: You can use the tool to convert individual assets, or all assets in a folder. 1. To convert one asset, drop asset file onto the tool, or run the tool from command line with asset filename as parameter. If asset file contains a texture, it will create "texture.db" file with information for later use in map extraction. If asset file contains static or skeletal mesh, in will be exported to ASCII. Raw data will also be saved in "staticmesh.raw" & "skeletalmesh.raw" folders for later use in map extraction. If asset file contains a material, it will export material info in a text file, and create "material.db" file with information for later use in map extraction. If "material.db" file already exists next to the tool, it will be updated with newly found materials. If asset file contains a blueprint, it will create "blueprint.db" file with information for later use in map extraction. If "blueprint.db" file already exists next to the tool, it will be updated with newly found blueprints. 2. To convert all assets in a folder, place the tool in that folder and run it. Tool will search that folder and all subfolders for .uasset files and try converting them all. When prompted "are you sure?" you can press "enter" to confirm or Ctrl-C to cancel. 3. To convert maps, drop .umap file onto the tool, or run the tool from command line with umap filename as parameter. Current version will extract static meshes, skeletal meshes, blueprint-generated meshes and nanite "terrain streams" from a map. For map extraction to work, "staticmesh.raw" and "skeletalmesh.raw" folders with previously extracted data must be in the same folder with the tool. If some models will be missing, tool will give messages. If "blueprint.db" file will be next to the tool, it will try and place all models mentioned in blueprints on the map. There's no proper blueprint support, so some models may be placed incorrectly. If "texture.db" file will be next to the tool, it will be used to assign proper material names to nanite parts of a map instead of hashes.
    2 points
  23. Here's bms for unpack. comtype zstd get BaseFileName basename idstring ERPK get Version uint32 getdstring Dummy 0x8 get ResourceTableOffset uint32 getdstring Dummy 0x4 get ResourceTableSize uint32 getdstring Dummy 0x4 get DataBaseOffset uint32 goto ResourceTableOffset get ResourceCount uint32 get ChunksCount uint32 for i = 0 < ResourceCount get ResourceInfoSize uint32 get StrLen ushort getdstring Dummy 0x7 math StrLen - 7 getdstring FileName StrLen getdstring FileType 0x10 getdstring Dummy 0x4 get ChunkCount ubyte for j = 0 < ChunkCount getdstring Sign 0x4 get Offset uint32 get Unknown_0 uint32 get DecompressedSize uint32 get Unknown_1 uint32 get Unknown_2 uint32 get Unknown_3 ubyte get CompreesedSize uint32 get Unknown_4 uint32 string Name p= "%s/%s" BaseFileName FileName math Offset + DataBaseOffset if ChunkCount < 2 if CompreesedSize == DecompressedSize log Name Offset DecompressedSize else clog Name Offset CompreesedSize DecompressedSize endif else if CompreesedSize == DecompressedSize append 0 log Name Offset DecompressedSize else append 0 clog Name Offset CompreesedSize DecompressedSize endif endif next j get Unknown_5 uint32 get Unknown_6 uint32 get Unknown_7 uint32 get Unknown_8 uint32 next i
    1 point
  24. Sorry, but format seems to be too complicated and I'm not interested in dealing with it right now. But maybe other ResHax users will be able to help, we'll see.
    1 point
  25. Oh yeah I got that far already, atleast for the compression methods. I`ve been working on the decompression for about 2 days now and decompressing each chunk seems complicated, as I am not really that experienced at all. Thanks for answering that quick though.
    1 point
  26. OK, having looked into it a little more, I believe all the "prop"s refer to "propdef"s in the GEO file. This also applies to some other object types, for example "dynamics" (these are objects you can knock around the level), "car"s, "Glass" and other types of props - "AnimProp"s and "ScriptProp"s. There may be other examples of these types of objects in other levels, I'm just going off of the Movie Lot for the time being. The rotation thing doesn't seem exclusive to these props either; I'm just now noticing that there are some 'terrain' objects which also have this problem. It may be scripts that are doing this after all, I'm not sure. One other thing I noticed, looking through the .TXT file in the level folder (which seems to be an export file from the tool the developers were using), there are also "collision" meshes that aren't listed in the .GEO or .INS file; my guess is that either the .BIN file, .DAT file or MOTIONS.ZAL are involved somehow. The tool also misses "AnimObj"s and "panorama" - the skybox. Here's an example though. These are the prop_planterA's (not the islandplanters as I first thought) that are all oriented the same way. And this wooden ramp (not a prop) is supposed to be facing towards the canopy (so you can jump up to it). And the hundreds of ceiling scenery objects which are completely out of whack...
    1 point
  27. So after i decompressed BIN i used this bms from luigi to unpack it but without file names. You'll get *.NTX files. These are textures. I wrote Noesis script for them. from inc_noesis import * import noesis import rapi import os def registerNoesisTypes(): handle = noesis.register("Tekken 6 - Xbox 360 Texture", ".ntx") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA) noesis.logPopup() return 1 def noepyCheckType(data): bs = NoeBitStream(data,NOE_BIGENDIAN) if len(data) < 20: return 0 return 1 def noepyLoadRGBA(data, texList): bs = NoeBitStream(data,NOE_BIGENDIAN) BaseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName())) bs.read(7) TextureCount = bs.readUByte() bs.read(8) for i in range(TextureCount): TextureNum = "_{:04d}".format(i) cPos = bs.tell() bs.read(8) RawDataSize = bs.readUInt() RawDataOffset = bs.readUShort() Var3 = bs.readUShort() MipMaps = bs.readUShort() PixelFormat = bs.readUShort() TextureWidth = bs.readUShort() TextureHeight = bs.readUShort() bs.seek(cPos, NOESEEK_ABS) bs.read(RawDataOffset) data = bs.readBytes(RawDataSize) if PixelFormat == 0: data = rapi.swapEndianArray(data, 2) texFmt = noesis.NOESISTEX_DXT1 elif PixelFormat == 1: data = rapi.swapEndianArray(data, 2) texFmt = noesis.NOESISTEX_DXT3 elif PixelFormat == 2: data = rapi.swapEndianArray(data, 2) texFmt = noesis.NOESISTEX_DXT5 texList.append(NoeTexture(BaseName + TextureNum, TextureWidth, TextureHeight, data, texFmt)) return 1
    1 point
  28. ################################### get BaseFileName basename idstring "HP10" get ResourceCount uint32 get Unknown_0_Offset uint32 get Unknown_1 uint32 get FileNamesOffset uint32 get DataBaseOffset uint32 get Unknown_4 uint32 get Unknown_5 uint32 for i = 0 < ResourceCount get Unknown_0 uint32 get Unknown_1 uint32 get Unknown_2 uint32 get Unknown_3 uint32 get Offset[i] uint32 get Size[i] uint32 get FileType uint32 get Unknown_4 uint32 math Offset[i] + DataBaseOffset next i goto FileNamesOffset for i = 0 < ResourceCount get FileName[i] string next i for i = 0 < ResourceCount string FileName p= "%s/%s" BaseFileName FileName[i] log FileName Offset[i] Size[i] next i *.pkchr unpack script
    1 point
  29. WDF file seems to store some graphics. You can view them using ImageHeat https://github.com/bartlomiejduda/ImageHeat
    1 point
  30. "It seems to be from the palette. Try to keep the palette order intact. Use an application like GIMP so that the palette order stays the same as the original. Some image editing tools tend to change the palette colors using their own algorithms."
    1 point
  31. Thanks! Using offzip with fa_t111.pix results in some .vap (textures?) and .dat files. Found some strings: One .dat checked: Face indices are a little bit annoying. This sub mesh built at least from 178 vertices:
    1 point
  32. 1 point
  33. PSS fully supports VBR video streams, just not in its initial version. But you got it right that before the newer SDK leaks got available, we had to make custom PSS with CBR video streams and hope that the game won't freak out about it. As for muxing, yeah, you just have to add another stream in the program stream setting or the .mux file and specify its type as "data." That's it, pretty self-explainatory once you try it once; though data-type streams have one nuance: it's mandatory to set their bitrate value manually, and the PSS won't work correctly if you got it wrong. @P-chan Good luck with your upcoming patches!
    1 point
  34. @morrigan Technically, you can multiplex PSS with AC3 audio just fine as a data-type stream even with the old v1.00 build of ps2str from 1999, but that version of the tool cannot properly mux VBR m2v, so it's kind of borderline useless. 2001-ish to the latest PS2 SDKs include ps2str v1.08, which is widely available on its own these days. @P-chan Mux the AC3 track as a data stream via ps2str v1.08, just be sure to set its bitrate to 56000 bytes/sec (assuming that it's a standard 448 kbps AC3).
    1 point
  35. Welcome to the forum 🙂
    1 point
  36. I didn't know about the -fileopenlog command the first time I needed it.
    1 point
  37. The table at the start of the file (from offset 0xa0), has 2 parts - relative offsets to the bone names and the material names
    1 point
  38. .psc its just text file. .dat container with files insede (txt,psc,dds,abc) .xex idk from offset ~8191 it is too dense, possibly compressed or encrypted EDIT: first link in google ("XEX is the executable file format used by the Xbox 360 operating system. It seems to be a crypto and packing container for PPC PE executable files.") i make script for unpack your *.dat file: unpack.py
    1 point
  39. OK!, I added Uvs and vertex colors but in some meshes of the head(mouth and nose)this looks weird.. Each mesh has 4 buffers: vertbuf, Unkbuf, Uvbuf and Vcolbuf. So probably those meshes have differences in Unkbuf, Uvbuf and Vcolbuf(not in vertbuf because polygons look fine). So you need to check those meshes with Hex editor to see what is happening there, the problem is in the last meshes of the file(from 869 to 997). Here are some images, you can see that vertex colors and Uvs of those meshes are a mess.. By the way, thanks for Uvs format @shak-otay
    1 point
  40. This Python script should do the trick: import os def convert_to_utf16(input_path: str, output_path: str) -> None: print("Starting convert...") with open(input_path, 'rt', encoding='utf-8') as f_in: content = f_in.read() with open(output_path, 'wb') as f_out: f_out.write(b'\xff\xfe') f_out.write(content.encode('utf-16-le')) print("Convert success!") def convert_all_txt_in_folder(input_folder: str, output_folder: str) -> None: os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.lower().endswith('.txt'): input_path = os.path.join(input_folder, filename) base_name = os.path.splitext(filename)[0] output_filename = f"{base_name}_utf16le.txt" output_path = os.path.join(output_folder, output_filename) convert_to_utf16(input_path, output_path) print(f'Converted: {filename} -> {output_filename}') if __name__ == '__main__': convert_all_txt_in_folder('C:\\Users\\User\\Desktop\\UTF_FILES\\input', 'C:\\Users\\User\\Desktop\\UTF_FILES\\output')
    1 point
  41. Successfully viewed the correct image now, thanks for everyone's help! Since I could only accept one answer, I went with Rabatini's. The script even came with a GUI, though the interface seems to be in Portuguese, fortunately, it wasn't too hard to understand. DKDave also provided important hints, letting me know which color format and swizzle type to choose. Many thanks!
    1 point
  42. I managed to revive my old 3dsmax and started the MHK2 maxscript but dunno whether the colors are correct:
    1 point
  43. Hi again! Sry for the comment, I managed to fix all the issues. Sry for the question.
    1 point
  44. What are you planning to do? I reversed it a long time ago. xbox version is easier. I want to make remake in cryengine but I don't have a time...
    1 point
  45. The first value in each file entry is the start sector of the file in the iso, so you don't need to extract the SIREN.xxx files first. I've attached a script that should work. siren_tbl.zip
    1 point
  46. .arc file unpack/repack: https://steamcommunity.com/sharedfiles/filedetails/?id=601818667 nativePC\rom\message\message.pck -> attached files: swuforce export/import tools dragons_dogma_pck.rar
    1 point
  47. Huge thanks to swuforce for the scripts! Use: 1.) Download and istall the autoit: https://www.autoitscript.com/site/autoit/downloads/ 2.) Search the script and paste in "Include (put these files to your AutoIt Include folder)" folder. 3.) Start the game script export-import tool. (some scripts are already out of date)
    1 point
  48. Version 0.9.0

    600 downloads

    Tool to grab AES key from UE4-UE5 game engine
    1 point
×
×
  • Create New...