Jump to content

Oddworld - Stranger's Wrath (2005) - Model formats


Pepsee

Recommended Posts

Hello, all!

I am writing regarding a file format I've been looking to rip for a while and have been unable to. (Specifically - These .geo files)

An early dev build of one of my favorite games of all time, Oddworld Stranger's Wrath surfaced sometime last year and it has the source files for most of the content.

This game was developed entirely within Maya.

I have a VERY old Blender 2.49b script that uses Python v26 in order to import bundles and assets from the 2010 HD re-release of the game, however it has issues importing certain models even from that version, let alone models from the Xbox version or this dev version...

I hope it helps so I'll upload the script I had for years here from M. Szkaradek123.

Thank you so much for your time, I really hope we are able to finally preview these assets!
spacer.png

 

Edited by Pepsee
Link to comment
Share on other sites

  • Engineer

Hello Pepsee,

before you send someone into a maybe frustrating job I'd really recommend to show some results with the blender script from the 2010 release of OSW.

btw, I don't remember the script(s) of AlphaTwentyThree. (The Blender script was from M. Szkaradek123, iirc.)

 

bossfight_turretcart.png

  • Like 1
Link to comment
Share on other sites

13 minutes ago, shak-otay said:

Hello Pepsee,

before you send someone into a maybe frustrating job I'd really recommend to show some results with the blender script from the 2010 release of OSW.

btw, I don't remember the script(s) of AlphaTwentyThree. (The Blender script was from M. Szkaradek123, iirc.)

 

bossfight_turretcart.png

Hey, Shako!!

Happy to see you again! Apologies... I could not remember the exact details, I'll edit my original post, thank you!

Also as you suggested here are some results of the script:

image.thumb.png.f8892d151b0a39ea0e368e1ffc297476.pngimage.thumb.png.e22e35ee79c5eb85bbaf1a8eff97f96d.pngimage.thumb.png.8c391d9929c39b4029ac6a7ae917061a.png

Edited by Pepsee
  • Like 1
Link to comment
Share on other sites

13 minutes ago, shak-otay said:

Thanks. So before someone starts from scratch he should have a look at the python scripts, imho (though they were always a little bit hard to understand for me).

(What were the results with the script from AlphaTwentyThree?)

Sadly, no luck, no error message either. It seems the format is different from that of the files extracted from the bundles on the OG Xbox/PC - here is what it should look like (geo.meshinfo)
image.png.fbb617db9d91acdab5c226bb0805676f.png

I tried following the same process as before since the source .geo files were not working, so I tried opening a bundle, however - when I try opening for instance npc_20.smb from Game\data\bundles\Region_05\level_05\ I get this error:
image.png.22e5e14152a9d1096b1b42b55f37d203.png

npc_20.rar

Link to comment
Share on other sites

3 minutes ago, shak-otay said:

Was there any smb file that had been extracted successfully?

Seems lm_level_05_tgl.smb contains a big texture (but not extracted by the py script):

 

level5-smb.png

I tried multiple, ranging from NPC smb's to level SMB's, no luck in any of them..

Link to comment
Share on other sites

10 minutes ago, Pepsee said:

I tried multiple, ranging from NPC smb's to level SMB's, no luck in any of them..

I can try uploading samples from the OG Xbox version.
I don't know if they will help much..

At least the SMB's are extractable with the script.

The models don't import however sadly... Only a select few..
I've been trying to get the wolvark semi-auto to import for ages.

Link to comment
Share on other sites

  • Engineer

Fine.

..\Blender249[Oddworld Stranger's Wrath][PC][SMD][2016
-06-04]\npc_17.smb
======================================================================
fileCnt  5
\data\textures\character\icons\Wolvark_Semi_Auto.tga
\data\textures\attachments\outlaw_SemiAutoNormal.bmp
\data\textures\attachments\outlaw_SemiAuto.tga
\data\geometry\characters\wolvarkSemiAuto\wolvarkSemiAuto.geo
wshtr_wolvark|wshtr_rt|wshtr_stb|wshtr_spn1|wshtr_spn2|wshtr_clvL|wshtr_bcpL|wsh
tr_clvR|wshtr_bcpR|wshtr_lgL|wshtr_shnL|wshtr_nklL|wshtr_bllL|wshtr_bllL_nd|wsht
r_lgR|wshtr_shnR|wshtr_nklR|wshtr_bllR|wshtr_bllR_nd|wshtr_nk|wshtr_hd|wshtr_fac
e|wshtr_earL|wshtr_earR|wshtr_frmL|wshtr_frmR|wshtr_wrstL|wshtr_grbL|wshtr_wrstR
|wshtr_grbR|wshtr_grndL|wshtr_grndR|wshtr_jw|wshtr_mBrwL|wshtr_mBrwR|wshtr_mFng1
L|wshtr_mFngL_nd|wshtr_tl|wshtr_tl_nd|wshtr_uprLipM|wshtr_weapnode_ranged_wpn1|w
shtr_lwrLipM|wshtr_mFng1R|wshtr_weapnode_ranged_mzzl1|
\data\textures\character\wolvarkSemiAuto\wolvarkSemiAuto_Colormap.tga
\data\textures\character\wolvarkSemiAuto\wolvarkSemiAuto_Normal.bmp
\data\geometry\attachments\Wlvrk_Weapons\Wlvrk_SemiAutoRifle.geo
B
C
B
C
B
C
A
E
B
C
B
C
A
AA
AA
AA
AA
BB
AA
AA
CC

Seems smb files with node type 6 don't work: (if node[0][1] in [6]:)

Only [0] (A), [1] (B,C) and [20] (E) are feasible.

Edited by shak-otay
Link to comment
Share on other sites

3 minutes ago, shak-otay said:

Fine.

..\Blender249[Oddworld Stranger's Wrath][PC][SMD][2016
-06-04]\npc_17.smb
======================================================================
fileCnt  5
\data\textures\character\icons\Wolvark_Semi_Auto.tga
\data\textures\attachments\outlaw_SemiAutoNormal.bmp
\data\textures\attachments\outlaw_SemiAuto.tga
\data\geometry\characters\wolvarkSemiAuto\wolvarkSemiAuto.geo
wshtr_wolvark|wshtr_rt|wshtr_stb|wshtr_spn1|wshtr_spn2|wshtr_clvL|wshtr_bcpL|wsh
tr_clvR|wshtr_bcpR|wshtr_lgL|wshtr_shnL|wshtr_nklL|wshtr_bllL|wshtr_bllL_nd|wsht
r_lgR|wshtr_shnR|wshtr_nklR|wshtr_bllR|wshtr_bllR_nd|wshtr_nk|wshtr_hd|wshtr_fac
e|wshtr_earL|wshtr_earR|wshtr_frmL|wshtr_frmR|wshtr_wrstL|wshtr_grbL|wshtr_wrstR
|wshtr_grbR|wshtr_grndL|wshtr_grndR|wshtr_jw|wshtr_mBrwL|wshtr_mBrwR|wshtr_mFng1
L|wshtr_mFngL_nd|wshtr_tl|wshtr_tl_nd|wshtr_uprLipM|wshtr_weapnode_ranged_wpn1|w
shtr_lwrLipM|wshtr_mFng1R|wshtr_weapnode_ranged_mzzl1|
\data\textures\character\wolvarkSemiAuto\wolvarkSemiAuto_Colormap.tga
\data\textures\character\wolvarkSemiAuto\wolvarkSemiAuto_Normal.bmp
\data\geometry\attachments\Wlvrk_Weapons\Wlvrk_SemiAutoRifle.geo
B
C
B
C
B
C
A
E
B
C
B
C
A
AA
AA
AA
AA
BB
AA
AA
CC

Seems smb files with node type 6 don't work: (if node[0][1] in [6]:)

Only [0] (A), [1] (B,C) and [20] (E) are feasible.

Is there any way compatibility with these ones can be added? 😟

Link to comment
Share on other sites

  • Engineer

Simplest idea was to skip [6] but the result was an empty output folder.

The start address of the second node of npc_20.smb is wrong - no idea, why.

Added 61 to patch it, still no change in outcome.

edit: surprise, I managed to extract lm_level_05_tgl.smb

(Some meshes and pics but I'm lacking the correct params.)

 

crossbow.png

Edited by shak-otay
  • Like 1
Link to comment
Share on other sites

14 hours ago, shak-otay said:

Simplest idea was to skip [6] but the result was an empty output folder.

The start address of the second node of npc_20.smb is wrong - no idea, why.

Added 61 to patch it, still no change in outcome.

edit: surprise, I managed to extract lm_level_05_tgl.smb

(Some meshes and pics but I'm lacking the correct params.)

 

crossbow.png

Okay, I've actually gotten something to somewhat work..

So using the .geo files from here, if you rename the extension from .geo to .smb and run the script it actually exports something from it:
image.png.ba8df0c3a832789be430ab04fcbeb8a6.png

Sadly however the mesh or skeleton do not import using the script and put out this error:

image.png.9d3a4e22f479ef1739b27826ed5ea3c7.png

I tried even renaming the output files to the appropriate extensions but still the same error:

image.png.29299b656b7b92e4d51fafa5f5f36804.png
I attached the renamed .geo to .smb as well as the extracted files below!

wolvarkLeader.rar

Edited by Pepsee
Link to comment
Share on other sites

  • Engineer

You may compare to npc_10_05.skeleton, which launches an errror, too, but the skeleton is displayed.

I tried to patch the script for wolvarkLeader_00.skeleton, but the structure is too different. (Only boneCount 46 is found correctly.)

Rewrite of code required, imho.

Would be easier to give the skel_builder from Durik a try or AmateurSkeletonHunter from Bigchillghost.

 

skel_boneCount.png

 

edit: here the bone names as a start:

wledr_wledr
wledr_rt
wledr_stb
wledr_spn1
wledr_jGuncrank
wledr_jGunbarrel
wledr_rudderL
wledr_rudderR
wledr_jPropeller
wledr_spn2
wledr_spn3
wledr_nck
wledr_hd
wledr_hd_nd
wledr_face
wledr_jw
wledr_lwrLipM
wledr_lwrLipM_nd
wledr_mBrwL
wledr_mBrwL_nd
wledr_mBrwR
wledr_mBrwR_nd
wledr_earL
wledr_earL_nd
wledr_earR
wledr_earR_nd
wledr_uprLipM
wledr_uprLipM_nd
wledr_clvL
wledr_bcpL
wledr_frmL
wledr_wrstL
wledr_mFng1L
wledr_mFngL_nd
wledr_clvR
wledr_bcpR
wledr_frmR
wledr_wrstR
wledr_mFng1R
wledr_mFngR_nd
wledr_grbL
wledr_grbR
wledr_weapnode_ranged_wpn1
wledr_weapnode_ranged_mzzl1
wledr_grndL
wledr_grndR

 

Edited by shak-otay
  • Like 1
Link to comment
Share on other sites

49 minutes ago, shak-otay said:

You may compare to npc_10_05.skeleton, which launches an errror, too, but the skeleton is displayed.

I tried to patch the script for wolvarkLeader_00.skeleton, but the structure is too different. (Only boneCount 46 is found correctly.)

Rewrite of code required, imho.

Would be easier to give the skel_builder from Durik a try or AmateurSkeletonHunter from Bigchillghost.

 

skel_boneCount.png

This should offer some useful insight:
https://talonbrave.info/2023/06/25/anoddworld.html

It talks about the SMB's

  • Like 1
Link to comment
Share on other sites

  • Engineer

Nice reading. Could be a start for more coding but my general feeling is like so:

Quote

From the standpoint of reverse-engineering, the format is terrible to reverse because there doesn’t appear to be any mechanism for knowing up-front how large a given struct/class is going to be (meaning we can’t cleanly skip the ones we don’t want or don’t have reversed),

Maybe time for you to dive into coding? (After 5 years...:classic_biggrin:)

I could give you some support from time to time (it won't become a project of mine as I have several open projects of my own).

Btw, we were talking about this and that all the time and it would make sense, imho, to focus on 3 to 5 problematic files only, get that solved

and transfer the solutions to similar files.

Iirc I had expanded the mesh types to recognize 87, 108, 112 and 120.

The latter is missing from the script I pmed you October 2019, here's what needs to be added:

			elif mesh.b[5]==120:
				for m in range(mesh.b[3]):
					mesh.vertUVList.append(p.short(2,'h',11))
					p.B(4)
					mesh.vertPosList.append(p.short(3,'h',16))

 

  • Like 1
Link to comment
Share on other sites

1 hour ago, shak-otay said:

Nice reading. Could be a start for more coding but my general feeling is like so:

Maybe time for you to dive into coding? (After 5 years...:classic_biggrin:)

I could give you some support from time to time (it won't become a project of mine as I have several open projects of my own).

Btw, we were talking about this and that all the time and it would make sense, imho, to focus on 3 to 5 problematic files only, get that solved

and transfer the solutions to similar files.

Iirc I had expanded the mesh types to recognize 87, 108, 112 and 120.

The latter is missing from the script I pmed you October 2019, here's what needs to be added:

			elif mesh.b[5]==120:
				for m in range(mesh.b[3]):
					mesh.vertUVList.append(p.short(2,'h',11))
					p.B(4)
					mesh.vertPosList.append(p.short(3,'h',16))

 

If so then I think the Xbox files are a more tangible format to reverse engineer rather than the dev files... I have packed together multiple characters. (7 in total, 5 of which have issues importing with either the base script or your edited version)
The two folders with working model imports are:

  • Wolvark handler
  • Shock Tank

The rest have issues...

In fact I'll make a list here for convenience so we can document which files are compatible and which have issues:

image.thumb.png.57fe15e95dfffaba4ad8a6d309ba777b.png

Sample_Chars.rar

Edited by Pepsee
  • Like 1
Link to comment
Share on other sites

4 minutes ago, shak-otay said:

You need to be more specifi; the npc_16_46 from wolvark_grenadier imports without issues.

My apologies, I was referring to the meshes themselves, skeletons work fine for all.

Edited by Pepsee
Link to comment
Share on other sites

56 minutes ago, shak-otay said:

Could you add the "unknow[n] mesh type" number(s) to your table?

For wolvarkGrenadier it's 96.

I have returned with the unknown mesh type numbers.

Here is a list of my findings:

image.thumb.png.a8dff84eee6a891ba5becb8c2635e7f7.png

P.S: I noticed that attachments such as weapons or hats/helmets use Mesh Type 98, or in some rare cases 110.

In the case of unsubscriptable files, this is the error message I get, (I am unable to get the unknown mesh type number because of this)😞

Traceback (most recent call last):
  File "starter.py", line 558, in Parser
    p.i(8)
  File "starter.py", line 190, in meshinfoParser
    if n==8:
  File "D:\Downloads\Tools\blender-2.49b-windows\python26.zip\ntpath.py", line 198, in basename
    return split(p)[1]
  File "D:\Downloads\Tools\blender-2.49b-windows\python26.zip\ntpath.py", line 170, in split
    d, p = splitdrive(p)
  File "D:\Downloads\Tools\blender-2.49b-windows\python26.zip\ntpath.py", line 125, in splitdrive
    if p[1:2] == ':':
TypeError: 'NoneType' object is unsubscriptable

 

Edited by Pepsee
  • Like 1
Link to comment
Share on other sites

  • Engineer

Thanks for the effort.

"None" has to be skipped to avoid this. (You still can't code, can you?)

example:

			no = g.word(g.i(1)[0])
			print ">>>",no
			if no != None:
				x = os.path.basename(no)
				split = x.split('.')[0]
				texName= g.dirname+os.sep+split+'.dds'
				model.texDiffList.append(texName)

 

  • Like 1
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...