It’s been a little while since I ventured a post onto the blog, as I’ve been extra busy doing contract work. One of these days we’re going to have a game that sells enough that I don’t have to do contract work, but that day hasn’t happened yet. We have high hopes for Revenge of the Titans, though! Who knows, maybe we’ll even manage a retail deal, or Steam?
So, here’s what we’ve been up to since the last blog post…
We’ve been hard at work putting in lots of little touches into the game that polish it up in many tiny little ways. I can’t really overstate the importance of little bits of polish. People do actually notice this stuff, and every time someone thinks, “Ah! That’s cool”, we have increased the chances that people will buy the game. So, we’ve now got little shortcuts on the main HUD for the last 3 building types created, accessible with a click or a hotkey (1-3). It’s just got a slightly more natural flow than opening the shop each time. Similarly we’ve got shortcuts for all the non-exotic powerups on the HUD next to the powerup tab, too; so that’s the freeze, shield, smartbomb, repair, and bezerk powerups all accessible with hotkeys or a single click as well.
We’ve got a “BASE UNDER ATTACK!” warning and “BASE SHIELDS CRITICAL!” warning, under a flashing base icon on the HUD; you can tap B or click it to instantly zoom back to your base(s) and cycle through them. Of course, on Earth, there’s only the one base.
Similarly we’ve got a “RELOAD TURRET!” warning, and associated hotkey T and button that will flash, and allow you to instantly zoom to the next empty turret.
And lastly we’ve got a “FACTORY FULL!” warning, and corresponding hotkey F and button, which does the same for factories that are full and awaiting collection.
There’s now a bit more of a delay at the start of a level (which gets longer the bigger the level is), which gives you a few more seconds to survey the terrain and where the gidrahs are coming from, before you start constructing your base. The levels are now slightly longer, to allow for this extra time, plus a bit more time with factories producing money.
Factories now shut down a short while after the gidrahs stop coming. There was a very simple exploit before that allowed you to carefully funnel your gidrahs so that they could get stuck behind a wall and trundle out one at a time, to be shot. This made the levels last so long that you could amass a huge pile of factories producing unfeasibly huge amounts of money. Now the factories only produce for a while so you need to get them built quickly and harvest them as efficiently as possible.
I’ve been doing a lot of game balance twiddling. The Earth levels, which comprise the first half of what we intend to be the game demo, are meant to be a “tutorial” of sorts. They introduce each of the main buildings one level at a time, and I’ve just embarked on an in-game tip system that will constantly bombard the player with hints as to where they’re going wrong during play.
Unfortunately I was beginning to realise I’d been playing the Earth levels for, ooh, about a year now, and I was getting rather good at them, milking them for as much cash as possible, using the minimum buildings in the optimum configuration, and generally being the saviour of Earth quite consistently. Even more unfortunately, I kept adjusting the game difficulty to compensate for my own brilliance, forgetting somehow that “EASY SELLS!” in the process (the exact opposite of what Microsoft seems to think), and also forgetting especially that “HARD TUTORIAL DEFINITELY DOESN’T SELL!” even more. I was getting to the point where I was getting my ass whupped by level 8 and enjoying the challenge; of course, that shouldn’t have been happening at all. The first 10 levels are meant to be super-easy introductions to the concepts of the game! Even the next 10 levels, on the Moon, are meant to be very easy, because we want people to complete them and buy the next 30 levels of game with all the piles of extra stuff in them.
The wake-up call was getting my 11-year old nephew to have a go at the game (without the constant barrage of automated tips, I had to hover over his shoulder and tell him what to do – bad sign). He got kicked in fairly quickly by level 8, and the only comment he made about the game was, “It’s hard.”
Right now then, I’m making all sort of strange and alien decisions to make things almost trivially easy for Earth. Reducing hit points, slowing gidrahs down, cheapening buildings, making them more effective, etc. I will test it out on my ever-suffering girlfriend later tonight and see if she manages to easily pwn the boss on level 10. (I actually gave the boss armour so it could only be destroyed by heavy blasters! Am I some kind of idiot?)
This game, despite its apparently diminutive stature (still running in our odd native 320×320 resolution), is rather pushing the performance boundaries of even the most hardcore computers. About a month ago I was getting maybe 20fps on my 1.6GHz dualcore AMD64 laptop with integrated NVidia chipset – ouch! It’s supposed to run at 60fps.
We’re actually pretty much hammering the 2D capabilities of the system somewhat. About a month ago, we were drawing approximately 1,300 – 1,500 sprites per frame, in approximately 70-130 draw calls. That sounds like it should be pretty trivial for a system to cope with – 1,500 sprites is after all only 6,000 vertices.
It turns out we’ve come across that age-old Java problem: getting data into buffers for OpenGL to draw is probably being hampered by lots of unnecessary bounds checks. I’ve cut down the problem now by agressively culling entities sprites which are suitably far offscreen to be definitely not visible; now we’re down to about 800-1,000 sprites per frame, and getting double the frame rate. The actual writing of sprites to the data buffers takes approximately 7.5% of a frame here on my uber-l33t i7 rig (1.2ms). Actually drawing them takes 35% of a frame (5.8ms) on my super Nvidia card. That leaves 9.5ms or so to do game logic – on the fastest most powerful computer I could afford 12 months ago. All the UI interaction, collision detection, gidrah pathfinding AI, animation, movement, targeting, etc, all has to be done inside that 9.5ms. On my uber-rig, it gets the lot done in 3ms. Realistically I’m targeting computers two generations behind this one, which will be approximately one quarter as powerful overall.
I wish they’d supply a switch to disable bounds checking so I could, if nothing else, at least prove to myself that’s slowing things down. I’d leave it disabled of course 🙂 I will explore performance tuning in a further blog post later this month.
What’s Left To Do
I’ve got to get the tips system working nicely so that it provides a constant “over-the-shoulder” commentary on what you’re doing for the first 10 levels or so. I also intend to use it to put in a few scripted speeches from the characters in the game.
I’m also working on a silent MJPEG video codec. I’ve found a nice pure Java JPEG decoder in IBM’s SWT source code, which I’ve hoiked and plonked into SPGL. This will be the basis of some fairly inefficient full-motion video rendering. I’d really, really like an H264 or even DivX codec but inexplicably no-one has produced a pure Java version of either, at least, not without massive library dependencies.
Chaz has got to do all the graphics for the Moon, Mars, Saturn, and Titan – that’s all the aliens, rocks, floor, scenery, and the story screens – a tall order. I suspect that this means the game will now not be ready until Easter, which is a bummer because we’re broke, as usual.
The story screens are probably going to take the most time. I suppose now I know this I can consider getting some semi-professional voiceovers done for them. Any volunteers? (The hint in that request is “volunteer” – we have no money :P)
I know you’re all dying to know what I’ve been listening to lately. Behold, the Cardiacs.
Seren turned 1 on New Years Eve. Had a great party. House was overrun by small children. Then I contracted gastroenteritis (probably norovirus). On the bright side I lost half a stone in 48 hours, which neatly compensates for the giant feasts of Christmas. According to the doctor I am now no longer overweight. Hurrah for disease!
One long rambling post this. This is what happens when you don’t post regularly.