Thursday, December 3, 2009

Unreal Championship progress...








Yeah, it's been a while since I've worked extensively on this game, but yesterday I had lots of time on my hands so I went at it. Before I go any further, I'd like to thank Chrono Archangel find a certain XNet function (XNetGetEthernetLinkStatus). Without his l337 google skills, I might not be posting this right now!

Unreal Championship goes comfortably to the menus (and is more interactive) with little or no problems. So far this is only for the NTSC version. It required a small handful of hacks, but so far it looking good. Since the game uses time based updates, you don't have to worry about it going to fast when VSync isn't enabled :) I also learned a few new tricks when emulating this game! Even though UT2003 for PC is practically the identical in many ways, IMO this game is too different so I say it's safe to consider this game an Xbox exclusive (that's one reason why I own both).

If you look at the screens, you'll notice that it looks as if termites have been eating some of the textures. "What is it?" Not 100% sure, but my guess is either it's another swizzling issue, or it's a palettised 8-bit texture and the conversion from D3DFMT_P8 -> D3DFMT_A8R8G8B8 isn't perfected yet. One thing I noticed was that so far, XACT wasn't really used much after loading one wave bank (which was surprising), so I might not have to implement the whole XACT API after all (which would be a major sigh of relief).

Now for the list of hacks needed. The first one I should have mentioned before. Sorry to those who tried running this game on my branch before with no success.
  1. At one point, I was trying to add a missing DirectSound API and I couldn't generate a digital signature for it. So what I did was I made a copy of my xbe and filled that function call with NOPs using a hex editor.
  2. Disabled overlay updates so that the second video can play. The first video works without the hack, but when the second one plays without the hack, it will cause a crash inside of the DirectDraw DLL. I couldn't think of a better solution at the time so I did this.
  3. For some reason, Unreal likes to lock it's textures at each level until it fails. So I had to tell EmuIDirect3DTexture8_LockRect to fail when the texture level is higher than 5.
  4. This last hack probably won't work for everyone, but I added a hack in EmuIDirect3DDevice8_SetIndicies to stop it from crashing because the IndexBuffer pointer appears to be bogus. If you get a CreateIndexBuffer failed error when trying to go passed the first menu screen, try it again.
These were some dirty and totally ugly hacks used (and I had a feeling that this was going to happen anyway). Oh well, as long as it works, right?

"So, what's stopping it from getting us in game?" Okay, here's where it get's complicated. It's bad enough that Unreal Championship uses features that are rarely used in Xbox games (or should I say features that we're not used to emulating for Cxbx?) which makes things a bit more complicated, but it's biggest feature is getting to us. Unreal Championship was the first console game in history that supported [executable] patches for the game. This means that in order to run that patch, it has to execute a new .xbe file. Cxbx is currently not capable of doing that. But what if it's not there? What it appears to be doing is loading the default.xbe over again if it isn't. It may have been designed like this as a cheap way of clearing most data from memory. So, that's the problem... but what about a solution? Here's an idea. I added the function XLaunchNewImage today to see what it was trying to do. Just as I stated above, it's just re-executing itself. Wouldn't that just start everything over? No, not really. Fortunately, the XDKs documentation on XLaunchNewImage is quite adequate, well written and very informative. Since an Xbox .xbe's entry point (void __cdecl main()) does not take any parameters (i.e. no command line), they have to be set using XLaunchNewImage. The function XGetLaunchInfo is used to retrieve the the data set by XLaunchNewImage. Since Unreal appears to be going back to the entry point after attempting to reload default.xbe, there's a chance that we can fool it by saving the params from the last call from XLaunchNewImage so that they can be retrieved by XGetLaunchInfo. This might work, and it might not. It's worth a try, and so far, I don't see any other options as of now. I'll give it a try, but just know this. I can't guarantee that I can get this one in-game. I can only guarantee my best efforts!

One more thing, I'm looking for anything on the .xbx file format. What is an .xbx file? It's a customized texture format for the Xbox. Since Unreal Championship calls XGWriteSurfaceOrTextureToXPR to create it's icons, it would be ideal to be able to create this functionality just in case the icon is actually used. So if you can find any tools, have any source code that deals with this file format, let me know!

Before I conclude this update, I just want to thank all the Cxbx supporters and fans that have been keeping up with us for all this time. Chrono Archangel, Mr. Fabulous, saintseiya, nokiaman, and more, I really appreciate you all!

Shogun.

10 comments:

  1. Yeah, I love to read progress on this emu, your blog is quite enjoyable.

    ReplyDelete
  2. Great to see you're making progress again!

    As for reading icons from an Xbox Packed Resource - what a coincidense! Last two days, I've been working on decoding the default.xbe Icon's in Dxbx - see http://dxbx.svn.sourceforge.net/viewvc/dxbx?view=rev&revision=492 and http://dxbx.svn.sourceforge.net/viewvc/dxbx?view=rev&revision=493 for my code.

    PS: I believe we've got some unfinished business - are you still inclined to go through with that?

    ReplyDelete
  3. Exelent, but on XBOX 1 i love one geme, Serious Sam XBOX

    ReplyDelete
  4. i call this : the magic of blues ...hehe

    awesone you´re rocking and kicking asses hehe

    ReplyDelete
  5. ..wow i want to cry ...blueshogun is a heroe of xbox emulation ....wow..is very fine be alive for see this..thanks blues...thanks..someday like emu3dtypes could be opengl..glx, glew and glut hehe opengl is awesone...
    blueshogun...for me is a pride to know you're a great friend. congratulations at your hadr but successful work..greetings

    ReplyDelete
  6. Cool!
    Oh hey, I've been thinking, do you think there could be any similarities between CXBX and the Xbox Emulator on the 360? I do believe that the one for the 360 is PowerPC based though. Also, I know it's way to early to ask but what's your opinion on the possibility of an Xbox 360 emulator within the next 5 years?

    ReplyDelete
  7. I doubt either emulators are related as surely the one on 360 uses LLE.

    360 emulator? I think that is possible even today, but not one that actually plays games. It would probably run homebrew and probably would only see a few intro screens with a commercial game. At this rate, you can't emulate 360 using traditional emulation methods. I'd recommend static rec. Either way, I don't have the PC hardware necessary to try it. I'm more intersted in emulating Xbox1 than 360 because not only is Xbox1 much better documented these days, but It's more of a possibility with current hardware.

    ReplyDelete
  8. This is incredible. Thank you!

    ReplyDelete