Skip to content
View in the app

A better way to browse. Learn more.

ResHax

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
Help us keep the site running.
Zero Tolerance for Disrespect

[Slayer Engine] Indiana Jones And The Emperor's Tomb (PC) - MSH AND MTX Files

Featured Replies

@Jason Voorhees
most characters and props are stored as .msh files, the actual levels are more complicated. Things like walls, floors, stairs, terrain, doors, and collision geometry are stored inside the game’s .SLS level files, so I wrote my own extraction and conversion tools in Python. I first examined the files in a hex editor and compared lots of different models to find recurring structures.

  1. From that, I worked out where the files store:

    • vertices

    • triangles

    • triangle strips

    • normals

    • UV coordinates

    • materials

    • texture references

    • bones

    • skin weights

    • object positions and rotations

  2. I used the game’s original linker .map files and Ghidra to figure out the Slayer Engine stuff.

  3. The mesh format actually has several variations. Some models use different vertex layouts, and normals aren’t always stored the same way.

  4. The game also uses both normal triangle lists and triangle strips. The custom converter turns them into ordinary triangles and removes the empty “stitching” triangles that the engine uses.

  5. Textures are stored separately in .mtx archives (compressed DXT1 or DXT5 textures) which were figured out by others already. The custom converter matches each material with the correct extracted texture and then exports the model as a glTF .glb file.

  6. Characters files contain skeletons, bone mappings, skin weights, and per-material bone palettes. I am trying to reconstruct all of that so Godot imports them as properly rigged characters with a Skeleton3D. The animations come from separate .ban and .boneanim files, which also need custom parsers but i havent fully figured that out yet.

  7. For each level, the custom parser pipeline reads the .SLS file and extracts:

    • the world architecture

    • placed props

    • characters

    • terrain

    • doors and moving platforms

    • collision volumes

    • lights

    • triggers

    • spawn positions

    • all the original transforms

  8. It then converts the geometry to GLB and automatically generates the Godot scene with everything placed in the correct position.

  9. I also used Ninja Ripper occasionally to capture individual draw calls from the running game as ground for searching.

  10. It was mainly a way to compare my converted geometry and UVs with what the original game actually rendered.

  11. Ninja Ripper captures are affected by camera culling and repeated model instances, so they aren’t as reliable.

Edited by nochnichda

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.