We're transitioning the video creation duties from myself to Erik, and in the process of that we're having a few technical difficulties that are requiring some updates to his machine and so forth. So that's delayed the video for our progress report #9, but I wanted to go ahead and do a written update (and we have new screenshots
) in the meantime.
Ideally we'll have the video ready sometime later this week, but no promises as yet. So what's new? Let's hit some of the cool new technical stuff -- skip down if you're not into that sort of thing.
Previously, the game used individual images in sequence for animations, instead of sprite
dictionaries (with texture offsets into a single image, in other words). This is consistent with AI War and Tidalis, and it has the advantage of being easy to update and easy to code to (and with SlimDX's wrapper of ISprite3DX, it was the only
way to do sprites).
However, it has two disadvantages: first, being slower to load off disk, and second being more wasteful of VRAM and RAM, and thus minorly hurting performance if you have a lot of animations on different frames all onscreen at the same time. Now we're using sprite dictionaries, which I'm creating using a handy GDI+ helper program that I've been working on to let me manipulate AVWW-specific PNGs in various formats.
Proper Character Animation Offsets
This is another Big Deal thing that I did with the GDI+ helper program I'm talking about. The problem is a bit tough to explain, but bear with me. I'm rendering characters such as Darrell in Poser, and using three different cameras to do so; one for front, one for back, and one for the side (which gets mirrored in-game).
Each camera is at an arbitrary distance from the character, but showing the whole character, and
the characters are rendered very large, at 400+ pixels instead of 128px like they are shown in-game. Then I have to shrink each frame down to 128px in another program, and then I've got my animation frames. In the past, I had been doing a simple Trim operation in a Photoshop script, and then scaling them down to 128px by height.
Problem? That makes every frame of the animation exactly centered, and exactly 128px high from the bottom of the character's feet to the top of their head. But your feet rise and fall as you run, and your head bobs up and down. For that matter, your weight shifts from left to right, and thus the overall sprite is not perfectly centered in each frame (if any of them).
That's what should
have been happening, and what I was
exporting from Poser, but my Photoshop script was normalizing it all out so that the animations looked subtly wrong in-game. Using my GDI+ program, I've now got an automated way of analyzing an entire batch of frames from one camera for one character and using the resulting data to fit the character in 128px square roughly centered and with the proper head bobbing, feet rising, and weight shifting. The difference is dramatic
. I look forward to showing you that in the video when we get that out.
More Character Animation Frames, And Animated Shadows
Previously we only had 12 frames per side on each character, which was still a total of 39 frames per character (including the three standing poses). And we only had one static shadow image. Why? Because it took long enough to export 39 frames from Poser, and because I was worried about RAM usage and disk loading times in AI War, when all those images were separate.
By adding the capability to have sprite dictionaries, this also let me feel comfortable with upping it from 12 to 30 frames per side per character (so 93 frames in all per character), as well as adding in animated and directional shadows (so another 93 frames for the shadows, too).
The result is that not only do the characters now look correct
(see above), they also look wonderfully fluid in their movement, as do their shadows. At a full 60fps or higher, it really looks particularly nice. I also figured out that I can just render a "movie" in Poser to a series of PNGs, which saves me from (d'oh) exporting each frame one by one to the Queue Manager. Poser is new to me, but I'm getting a much better handle on it lately now that I'm really sitting down with it more.
In-Game Shadow Skewing
Know how the shadows in the game come out of the back of things and skew off to the upper left? Previously, that was just a flat prerendered image. That had two major disadvantages: first of all, it takes up an absolutely enormous amount of image space, and thus uses way too much RAM. Secondly, because of the way I was handling that via yet another automated Photoshop script, it didn't always look as good as it could (big and small objects tended to fade differently over distance, for example).
Now I've re-rendered all
the shadow images in the game using the same Photoshop script of mine, but not bent to the side. The AVWW engine now has the capability to skew sprites, which is new to our engine, and it uses that for the shadows to get an effect that is very similar to what we had before, but way
more friendly to RAM, nicer looking, and compatible with even older cards that don't support textures larger than 1024 in size (no guarantees on performance on a card that old, but it will at least work).
The other cool thing I did with these new shadow images was that I shrunk them all by 60% in their base images, so that they fit inside the same size image as their original source -- so if Darrell is 128px square, his shadow will fit inside that now, too. Previously, his shadow was in a 512px square, which is why there was no way I was going to try animating that -- too much RAM! The game scales the shadows back up so that they look normal, and there's no quality loss at all because of the fact that... it's a shadow! It's supposed to look diffuse and fuzzy at the edges. The fuzzier the better, actually, given the style of shadows we're showing here.
New Character: Dawn
So we finally have a new character in addition to Darrell and the Neutral Skelebot! She's the first woman in the game, but there will be tons more character sprites for players to choose
from, and to encounter as NPCs.
My private goal from a while back had been 60 such sprites, but I was iffy if I could hit that because Darrell took me about 6 hours to create (when I was still learning so much about Poser). Now, with all the various process improvements I've made in the last two weeks, and the automation tools I've added via my GDI+ helper program, I estimate that each character will only take about 30 minutes from start to finish. So 60 character sprites is looking quite feasible, and maybe I can even exceed that; that would be nice!
Because of the need to have full 30 frames on all the other characters and monsters, all of the existing ones have been re-rendered. I also improved their visual look quite a bit when it comes to the skelebots in particular. Now they have one arm and leg larger than the other, for instance, so that you can actually track them visually while they are moving.
Before it looked like their animation was half the length it was, because having their left or right legs forward looked
far too much the same! Now they look a bit more stylized, as well as just much higher quality animated in general; you'll like the video.
The game now has a lot of different kinds of weather. In non-windstorm times, we have: sunny (well, we always had that), light snow (in the snow areas, mainly), light rain (the junkyards are a great place to find that, but also other places have a small chance of having it), and blowing sand (in the desert, but not always).
During windstorms (every four tiles as you move, see the counter in the upper right of the world map), you get the following kinds of weather: snowstorm (in any of the snow areas), rainstorm (in most sunny or light rain areas), sandstorm (always the desert), and firestorm (always the lava flats).
Windstorms are such a huge part of the game, but now is the first time we've had an actual visual component to them. Plus just having calmer weather at other random times is a favorite thing of mine to do, anyway. We obviously don't have any weather in space in AI War, but that was something we did a lot of in Tidalis.
Main Menu Visual Improvements
Until now, we've only had a basic main menu that was just a rip from AI War with slightly different graphics. That was always to be temporary, but it's surprising how much more polished the game suddenly feels by having a proper main menu (including story scroll). That scrolling story from the main menu is now included in the main AVWW page
, by the way.
The main menu shows as a background a randomly-created chunk of world, which is pretty cool to see the variety right even in the main menu every time you load up the game.
Related to this, we also now have the ability to create and load multiple worlds via the interface, which is quite nice. There's no limit on the number of worlds you can create, but it will show 10 per page.
New Objects, New Hands On Deck
We've also got a ton of new objects in the game, although most of them aren't being seeded in yet. I think 9 miscellaneous objects are in, then we have 9 flower sprites of various sorts, and we have something like 33 new vehicles, including some futuristic ones from the ice age time period. All broken, of course.
Erik, our PR guy, is also now helping out with some of the actual game development work, and so that's helping me out in a major way to be able to do more art faster, and then having him "wire them up" to have proper collision boxes and other metadata through a handy in-game tool we created for that purpose. So that's been a big help for our creation process, although we're just getting started with that.