While not much has been said about it, over the past few months Morning's Wrath for the Mac (OS X) has been in production and is now in testing. It is an experiment to probe the supposedly untapped indie game market on Mac. More on this later.
Development has started on the final Morning's Wrath patch, One Patch to Rule Them All!
It will offically bring Morning's Wrath to version 2.0, and is primarily a technology patch (performance and usability improvements). We hope to address
many of the shortcomings that players have voiced with Morning's Wrath, mainly concerning video hardware compatibility, control responsiveness and pathfinding improvement, enemy AI and no respawn, and an overall more performant and pleasurable user experience.
While this is virtually another games worth of engine changes this patch will be offered for free and will come pre-loaded on all new purchases after the patch has been released.
When thinking about Malathedra I knew we needed a good intro. Morning's Wrath used a scripted intro which was a bit dull, as such somthing needed to change.
When dealing with an intro you have about three choices:
- 1. In-Game cinematic, using the game to do the intro
- 2. Scriptable cinematic system, displaying pictures and text
- 3. Full motion video
Now for those of you who don't know, Malathedra has to be good.. REAL good, which means when it comes to an intro we need the best.
So I had made up my mind, we were using full motion video for an intro, but then the question was, what format to use and how to display it.
After a bit of investigation it seemd my two main choices were DirectShow, and avi or some other format, or a new video technology called Theora, I had heard about Theora from coldacid's journal a while back and tucked it away until the time was right.
From the looks of things theora is still very new (listed as alpha) which would make us an early adopter which I personally like.
Pros and Cons
-We're already using DirectX
-It handles display of the video
-Limited to windows
-Requires external codec for certain video
-Overly complex (COM based and more features that we need)
-No need for external codec
-Compact and straight forward to use (much like vorbis)
-Requires you stream and display the data yourself
-Complex YUV to RGB conversion
-Very limited real-world usage as of yet
Since one of our potential goals is porting the S3Engine 1.0 to Mac, I wanted to not rely on a windows-centric format, also the potential nightmares of improper or non-present external codecs did not thrill me. Given this coupled with adding to our list of open-source middleware I decided to give theora a whirl.
Overall implementation was painless, and the harder things were getting the libraries built to static libs, which was in the grand scheme relatively painless.
The hardest thing was the YUV to RGB conversion code, the straight up color conversion from YUV to RGB is trivial, however theora organizes it's data (possibly the standard I dunno) so that the Y plane and the UV planes can have different dimensions.
In this case the Y(luminance) data may be 320x240 pixels, and the U and V data may be 160x120 (1/4 the video size), this subsampled data must be 'stretched' when you convert the frame into a planner RGB format (a dynamic texture) for display, I had limited success trying to do the conversions myself, as writing software 'blitter' functoins are both cumbersome and easy to make mistakes with, however I was able to find some sample code which did the conversion for me, so with a little fustration and a little googling I was able to get a theora video rendering in the S3Engine in about 6 hours worth of effort.
With this addition the S3Engine now can play a theora ogg file which switches the engine into 'video mode' and displays the video full-frame (with aspect ratio correction), videos can be played via the scripting system with the playVideo("data/video1.ogg"); command.
This was a great feature to add and will add just a bit more to the Malathedra experience, and if we're going to succeed we need every bit we can get :)