If the last post was worth a few thousand words, on account of it’s images, then this one might be worth quite a lot more than that, as I’ve had quite some progress in the visual parts of the Wintermute-engine, without further ado, ten improvements from the last post:
1: Alpha-blending now works properly
As you might remember from my last post, alpha blending was sort of non-existent in the code at that point. I did do specific skipping of completely transparent pixels, but that didn’t prove to pretty:
_sev commented on my last blogpost:
“I recommend to take a look at the code of RenderedImage::blit() in engines/sword25/gfx/image/renderedimage.cpp”
Which I did, and although I haven’t completed the refactoring into common-code that he asked for yet, I did add the code to my own branch, which gives the following result:
Notice that the trees look a lot better, along with the bars on the wall. The hair is also less jaggy, although that is not that visible in this small screenshot. A little downside about the current solution is that it is quite CPU-intensive. But that’s a problem for another day, for now it atleast works properly.
2: Bitmap-fonts are drawn correctly now
Previously, the bitmap-fonts were drawn with some rather weird offsets, making the characters have odd spacing. The transparency in those images were also quite off:
Now, these bitmap-fonts are BMPs, which have rather quirky alpha-channels, the original WMELite-code had this comment hanging around:
// convert 32-bit BMPs to 24-bit or they appear totally transparent (does any app actually write alpha in BMP properly?)
Which explained that part of the problem, I clearly had to replace the existing alpha-channel with the colour key specified by the game.
As for the weird spacing, the engine uses BSurface::IsTransparentAtLite to detect the width of the characters. This is also the reason why the engine explicitly requires the characters to be left-aligned.
Now IsTransparentAtLite was one of the functions that were stubbed when I removed the SDL2-requirement, so adding in new code to check for transparency solved that problem:
3: Sprite scaling works
If you look at that last picture, do you notice anything else that’s different from the previous ones? Yeah, Baxter is a bit smaller, and for a good reason, the code I borrowed from the Sword 2.5-engine included scaling before drawing, which solves quite a few issues. Previously if you tried to walk up to the door, Baxter would walk in-place, and not seem to go anywhere, simply because he couldn’t “walk into the screen” in any visible fashion (he would have had to get smaller to show it). But now, he’s scaled accordingly. That screenshot is actually quite close to this screenshot from the original WME Lite-engine, that you might remember from my last post:
Yes, there are a few minor differencies, for one, there’s some definite breakage in the gradient that makes up the road he’s standing on, but the important bit here is, that this is the very first scene in the game, without any movement done, if you compare this to the first two images in this post, notice how he was way to big to begin with? Well, that’s solved now.
4: Sprite mirroring works
One of the features that were missing from WME Lite, when compared to the full Wintermute-engine, was sprite mirroring/rotation, since the Sword 2.5 code I borrowed also contained support for vertical/horizontal flips, it was rather straight-forward to add that little feature back in. Now for testing this, I had to find a game that used it, which in this case was the game Rosemary. Walking left in this game was done by simply mirroring the walk-right sprites, which made it look rather odd without sprite mirroring enabled:
Now, simply hooking the right data back up to the blit-code from Sword 2.5, made this look way better:
5: Fixed some bugs that crept in while refactoring code
I also had a few issues with another silly bug: After adding in handling of key-presses, every key seemed to trigger the exit-game dialogue. After hunting that one for quite some time, I realized that I’d made a silly mistake in the event-handling in PlatformSDL.cpp, right after the case for case Common::EVENT_KEYDOWN: was case Common::EVENT_QUIT: and… there was no break; between them…
6: Fixed speaking to characters (and in doing so, most of the sound)
Previously, if you tried to talk to any character in Dirty Split, the conversation would be cut short, this was because the engine needs to know the length of the text, to know how long it should wait before issuing new lines of text, and unlocking the objects that are speaking. When I did the sound-system before the last blog-post, I only added in the necessary bits for getting something to play, but I didn’t bother doing all the various other functions. Specifically GetLength() proved to be quite important for this little tidbit, as it was previously just stubbed to 0. Explaining the rather short conversations.
What remains to be done in the sound-system, is (among other smaller things) supporting loops and seeking in the audio.
7: Added detection for a few more games
I changed the detection-scheme to use the Advanced Detector so that I could easily flag the various games for how compatible they were, as well as detect them based on more detail than the original detection solution. Now, adding every single game to this list will be a never-ending job, as new games are made all the time, but at least the known good and known bad games should be added over time. Particularly the known bad ones should be important to add here (such as all the 3D-games), so that the users will know why their particular game won’t work. Another thing planned for this solution, is to have a simple fallback that registers unknown games by simply finding a data.dcp file that doesn’t match any known ones. This should allow playing any new or in-development titles without having to first put the hashes into ScummVM.
The currently added games are:
I’ll happily add more, if anyone has any good suggestions, but these at least let me test a few of the functions in the engines rather thorougly.
8: TrueType-font support
And this is how it currently looks in ScummVM:
For comparison’s sake, both of these use Arial at the moment, but long term, if users want to have Arial or something similar used with their games, they’ll have to put a copy of the font file in their game folder.
One of the things that are handled fine at this point though, is text-wrapping:
9: Screen refreshing now works
Especially the particle engine in the above shot gives use problems. Anyway, making the entire screen draw a color between frames made things quite a lot prettier: