SSF4AE modding: tutorial for the ULSM by doshu

Here’s a more or less basic tutorial about how I built my Ultra Light Stage mod. The aspects that I won’t cover are basic Gimp/Photoshop manipulations, building your own BGM selection and how to convert a TRN stage to any other stage. If need be, those aspects can all be learned quickly either by reading the SSFIV/AE wikis, by searching the net, or simply by thinking on your own and doing try/errors.
Also, the first part of the tutorial is way more detailed (both in text and pictures) than the last ones, since I wrote it a while back to explain how the Training stage edit works on the polycount forums.

Since I build my mod, a lot of progress has been made in the field of custom Training stage’s templates, so instead of blindly followind this tutorial entirely, you should probably just take the parts you need and try to build even better stages than I did (not so hard IMO :p).

Finally, I have to insist that I’m (or was) a total n00b in modding, and that this tutorial might include some really weird and/or not efficient methods for expert modders. I’m repeating myself here, but better safe than sorry^^. Anyway, if you have a better way of doing things, share it! This tutorial will then hopefully be updated ;).

Ok, let’s start with an overview of the needed tools (find those in the wiki and/or with google) :
[]SF4 Assets Explorer
]The Gimp + dds mod
]hexadecimal editor HxD
[]Ryu’s Classic Training Stage mod by hunterk
Quick overview of the whole process :
]extract Ryu’s Classic Training Stage’s dds and observe how it’s made
[]build your own dds from whatever art you find that seems fine (but do not forget to get the author’s authorization if you want to share your work!)
]do the hex magic
[]inject the dds : the stage is done!
]build the 3 preview pics’dds : big, medium and small size
[]build the 2 kind of presentation text : Stage Select and pre-versus screen
]inject the whole thing into the appropriate files
[]mute that annoying announcer !
]Building your own stage
[*]Basic explanations
Ok, so here’s a bit of explanation on how it works. As you’ll see, it really needs only basic picture editing skill, and not anything fancy.

First, let’s look at the “cube” limitations : the edges (this stage was done by hunterk).

As you can see, all the vertical sides of the cube are filled with the same part of the texture, making it “loop” when it reaches the end. The same with the floor/ceiling. In practice, it doesn’t show that much, except when performing some Ultra’s like Ryu’s Metsu Shoryuken.
But what is important here, is that because of that loop, the more the left and right sides of the texture looks alike, the less it will be apparent in the stage. In this case, it’s almost “invisible”.
Secondly, here’s the kind of file the stage’s texture is made of:

Basically, the “floor” part is upside, then comes a thin black line, and the the main background. What is important here for “good” results, is that the floor looks as much as possible like one, as it does from all the above examples (and in the WIP preview screenshot). If the original jpg image’s “floor” isn’t “straight”, or is filled with different objects and such, the result might be awkward (or not, it depends).

For example, let’s first show the results from the 2 pictures above:

All in all, except the crappy resolution problem, those stages look “good” : the floor is “floory”, and the edges of the texture look alike, so it should be pretty “invisible” while playing.

Let’s finish the basic explanations with a “difficult” file to work from (at least for my skills)

That’s it for the basic explanations.

[]Choosing some art and building a dds from it
Basically, you’ll want to work from a picture as high def as possible, even if the dds will only be 1280
800. Also, the scene should ideally be pretty empty in the “front”, thus allowing you to easily build the floor of your stage. It is possible to work from more difficult material, but I’ll leave it to you to find how, explaining it here would be long and tedious.

For my part, I worked mostly on feeling. Just look at the picture, copy whatever part you want to make the floor of without thinking too much about proportions, copy and paste it as a new image, then resize that new image at 1280237. That’s pretty much it for the floor.
Return to the original picture, select the other part of it (Ctrl-I should do the trick if your previous selection was still active), copy paste as new image, then resize to 1280
553. That’s it for the wall.
Create a new black backgrounded 1280*800 image, copy paste the floor into it, position it up (using the arrows make it a breeze to do, no pixel precision needed). Do the same for the wall, except you position it down. There should be around 10 pixels left black in between.
Flip the image horizontally (Image → Transform), then save as a .dds (just name the file whatever .dds when saving). Don’t bother about the compression, it’s not needed.
Before injecting the newly created dds file, you need to make it the exact same size as the original one. To do that, just open both the original and the new dds file into your hex editor, and do the following :

  • on the original file : Ctrl-A ; End ; Ctrl-E ; choose 2EE080 ; Ctrl-C
  • on the new file : Ctrl-A ; End ; Ctrl-V ; Ctrl-S

That should do the trick. Basically, you’re copying what bytes are missing in the new file from the original one. All the files I created were always 2EE070 sections long, that’s how you get the 2EE080 number. Should your file be a different size than that, you will have the adapt this number to that size so that both files are the same size at the end. This method doesn’t work with new files bigger than the original though… (see how I’m a n00b in hex editing? Pretty n00bish I must admit, but it works! I have an idea why it does work, but I’ll gladly hear some real explanation^^).

A last word about applying filters on the dds befrore injecting it. The ingame look of the stage you built won’t be exactly the same as the dds’ look, so you might want to try and apply some filters. Here are the ones I used so far:

  • unsharpen: used mostly for high definition material, like most of the stage of the ULSM. I used it twice on each dds.
  • cartoon: used in combination with “Van Gogh” to make low definition material look ok-ish ingame
    Don’t hesitate to try other filters too!

Ok, you’re good to inject to file into the .emz and test out your newly build stage!

[*]Editing the Stage Select screen

This part is really easy, but quite time consuming. I’ll first specify the particularities of each kind of file needed for the Stage Select screen (dds resolution : actual picture resolution (ratio) / type of compression needed):

  • big preview picture: 1024512 / 710377 (1.88) / BC2/DXT3; the BLD stage needs a 10241024 resolution file (adapt the actual picture size accordingly)
    small preview picture: 128
    128 / 116*89 (1.30) / BC1/DXT1

Then the pre-versus screen:

  • medium preview picture: 512256 / 336214 (1.57) / BC1/DXT1; BLD, KOR, AFX need a 256*256 image, adapt the actual picture size accordingly

And for the text in both screen (up left for the Stage Select screen, up right for the pre-versus’):

  • 256128 or 512128 / Comic Sans MS Bold 34 (Place) and Arial Bold 36 (Stage name) / BC2/DXT3

To avoid you the pain of figuring out which stage’s text needs which resolution, here’s the list of the stages needing a 256*128 dds: AFR, RVR, AFX, VIE, JPN, VCN.

Another time consuming task is figuring which files you need to edit, so here’s the list:
[]***ressource\ui\stage_select*stage_select.emz: for every big/small preview picture and Stage Select screen’s text. Finding the small ones is easy, since the entry name corresponds to the stage name. The big picture/text is much more difficult to find, so here’s a list to help you out (pic/pic/txt/txt; I guess you have to inject the new pic and text twice, in both entries, I haven’t tried to do it at only one place…):
]BLD: I30 / I3E / I8A / I98
[]IND: I33 / I41 / I8D / I9B
]KOR: I36 / I44 / I90 / I9E
[]AFX: I39 / I47 / I93 / IA1
]LBX: I3C / I4A / I96 / IA4
[]USA: I3F / I4D / I99 / IA7
]CHN: I42 / I50 / I9C / IAA
[]RUS: I45 / I53 / I9F / IAD
]BRA: I48 / I56 / IA2 / IB0
[]AFR: I4B / I59 / IA5 / IB3
]VIE: I4E / I5C / IA8 / IB6
[]JPN: I51 / I5F / IAB / IB9
]EUR: I54 / I62 / IAE / IBC
[]SCO: I57 / I65 / IB1 / IBF
]JPX: I5A / I68 / IB4 / IC2
[]LAB: I5D / I6B / IB7 / IC5
]RVR: I60 / I6E / IBA / IC8
[]VCN: I63 / I71 / IBD / ICB
]CNX: I66 / I74 / IC0 / ICE
[]BRX: I69 / I77 / IC3 / ID1
]VNX: I6C / I7A / IC6 / ID4
[*]TRN: I6F / I7D / IC9 / ID7

[*]\ressource\ui\versus\versus*img#.emb.emz*, where # is between 0 and 3: for everything pre-versus screen related. The entries are self explanatory, with JPN_name for the text part, and stage_JPN for the medium preview picture. Just take a look to find out which stage is where (the text and the picture entries can be in different files). Also, img3.emb.emz contains Boxer’s name, so if you’re using a JPN character’s name mod, be sure to swap the original (Balrog) with is counterpart (M. Bison, to be found in some other file).
And finally, though I won’t go through the hassle of explaining Gimp’s image editing manipulations (a small hint about it though, be sure to use the game’s original files as models for the shapes, especially for the small preview image; that way the result will fit perfectly into the game’s screen), I’ll throw a word about the halo thing around the text.
At first, I followed this tutorial. The result was good, but I came around a faster and better looking method after a while: follow all the steps until before applying the first Gaussian filter, then do a select all (CTRL-A), and apply directly a 10 point Gaussian filter. That way, you only have to apply one filter with one setting, removing the need to change the settings from 5 to 10 points every time. Finally, just follow the end steps of the linked tutorial.

Ok, now you’re set, all that’s left is to inject all of your files one by one into the game’s files. A long and boring process if you’re doing every stage at once, but the result is really worth it!
One last word about this part of the process: don’t pay attention if the SF4 assets explorer preview looks messed up, it doesn’t affect the in game result.

[]Mute the announcer
This is quite easy:
]open \ressource\ui\sound\se*VERSUS_SE.csb* with SSFIVAM
[]extract everything in a temporary folder (“unpack” command)
]hexedit the files containing the sounds you want to delete by selecting all and replacing the data with zeros (listen to the files in AM beforehand, to found out the name of the sounds you want to delete)
[*]then inject all the files inside the original file (“replace content with…” command)

There may be a better way, but that one worked great for me^^.
And that’s it for the ULSM tutorial!