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.
Six New Enemies!
We are finally getting into adding more enemies, and we added a ton of them: bat, fire bat, ice bat, sniper skelebot, esper, and desert burrower.
Bat, Fire Bat, and Ice Bat
These all have the same basic movement characteristics: they fly, they swoop and dodge, and tend to flock about you in swarms. Fighting them is a completely different experience from fighting the skelebots.
The regular bats are bad enough, but the fire bats set you on fire for about five seconds (which does damage over time — and stacks from each bat that hits you), and the ice bats freeze you for about five seconds (which slows you down slightly — and again stacks from each bat that hits you, which can all but immobilize you, though you can still fight).
An Aside: Region Level Gating
The bats also brings up the fact that we have level gating for various “population patterns” of enemies. Each chunk that is generated is assigned a population pattern which includes one or more enemy types in various concentrations and in various numbers relative to the size of the chunk. Some of these are demonstrably harder to deal with, no matter what your level is versus the other enemies.
So, the game introduces things to you gradually — everything, really. The harder population patterns, the more complex crafting materials, and so on, aren’t available in the lower-level regions. Every few levels you go up, more and more stuff is appearing around you. Of course, you can strike out into higher-level regions while you are still low-level, that’s just pretty hard.
The regular skelebot is fast and a melee fighter, as anyone following this game knows (tired of skelebots much? Not more than me), but the sniper variant is slower and doesn’t chase you at all. Instead of you kiting it, it kites you, intentionally keeping its distance and firing fireballs at you.
Sure, it’s just a recolor, but the behavior is completely different and running into yellow and red skelebots at once is pretty interesting. In general, my goal with this game is to have a ton of variety by having a lot of base concepts (bats, skelebots, etc) as well as a good number of variants of each thing. People who are familiar with AI War and how crazy huge it is will know just what I mean.
The esper is a magical being that hardly moves at all, and which fires quite strong lightning attacks at you. Your own magic attacks are extremely weak against it, so you’ll need to resort to melee weapons, firearms, or other physical types of attacks to take these out.
In motion, these look particularly cool. Both these and the fire bats also act as light sources, which makes battles with them in the dark forest particularly exciting-looking!
These were just added today, so we don’t have any screenshots of them yet, but they are nearly-invincible enemies that live only in the desert and which roam around at high speeds underground. They don’t chase you at all, but if you come too close to them they will strike out at you for substantial damage. The desert really is a dangerous place!
Magic is ineffective against these as well but you can strike at them with melee attacks and kill them if you dare to get close enough.
New Name Dictionaries!
We now have new sets of names for Darrell, Dawn, and the Neutral Skelebot. There are literally a few million possible combinations of first and last names each.
And that’s only with three characters; by the time we have 60-some sprites, we’ll have north of 50 million possible unique character names, I think — that’s enough that you’ll likely never have two characters named the same thing for as long as you play!
Lots More Coming Up!
We’re in progress on melee attacks, on a new and awesome-looking HUD graphics set (based on the Necromancer GUI skin for Unity), and we’ve got some very cool things up our sleeves for ground-level regions and underground regions. After that we’ll be hitting a lot more crafting materials, weapons, etc, and then I’ll finally be circling back around to more interiors.
It’s exciting times — things really are flying now. Keith has been sick and busy with his other job, which has slowed him down, and all the work with redoing all the shadows and all the characters and enemies in the game really slowed me down on the new content, but even so this has been a huge number of leaps forward in the last two weeks. I also finally sat down and learned how to do rigging in Poser, and the bat animation (only part of which is shown above) is the result. I’m quite excited by the possibilities that this simple new skill opens up!
Anyway, stay tuned for our #9 video hopefully later this week or else definitely next week if we run late. Enjoy!