Game Design, Programming and running a one-man games business…

The current positech plan (posiplan?)

I see no harm in making my immediate future plans public.

In no specific order this is what I have coming up:

1) Release of the 1.47 patch to all partners (valve etc). I did this this morning.
2) Release of the new Race (The Nomads) On my site, in a slightly strange way (details to follow) then on the partner sites when I know it works ok. Teasing screen:

3) Talk to Steam and other partners about selling the Mac copy of GSB.
4) Pre-order / beta access and eventual release of the GSB campaign game.
5) Game IV.

This should last me a good few months. Hopefully the money lasts a good few months too. Ha!

In amongst all this, I’ll be taking the first holiday (only a week) since I moved house, and it will be my Birthday. I also have a visit from a  structural engineer today to tell me if my roof can hold up solar panels or not. I will be mr sad face if he says it cannot.

Nomads

I spent some time today on a new race for GSB. It looks like I’ll release this pack before the campaign is finished. I actually had expected to have finished the campaign and have released it by now, but it’s much more involved than I thought, so I’m still working on it. Once I’ve finished complete bug free playthroughs as 2 different races, I’ll get some people testing it for me, then there will probably be a pre0order beta thing, then release. That is probably another month (best case) of work.

So in the meantime, luckily I have artwork for a new race all complete, and am working on the data and the balance. There is nothing radically different in the race in terms of gameplay yet, but the style is interesting. The backstory is that it’s a very very old race, a bit like the dwellers from The Algebraist (Iain M Banks). Over the years, they have rebuilt their ships from the salvage of their enemies, so you will see that their ships have some rebel engines, some order engines, and various other components. They are also the first race to have multicolored ships. I’m calling them Nomads, and they basically fight out of sheer boredom on their multi million year journey across the universe. They have a cool retro look.

I was lying awake at 2AM this morning unable to sleep, thinking about new weapon and ship modules for that race. This pack will be different, likely no new missions, just the raw fleets for you to use. I had originally thought no new modules, but I think I’ll at least add some variants.

A lot of the more interesting ideas involve a ton of code, which I’d rather not do when I’m so busy with the campaign, but there is plenty of scope for module variants that work within existing parameters. I keep thinking that a very long range sniper laser with high penetration but low tracking speed and low damage could be interesting. Hopefully I’ll do some work on it tomorrow.

Improving the deployment screen in Gratuitous Space Battles

I found this really annoying when playtesting the campaign, and I know people have asked for it before. I want to know if this is an improvement, before I release it in a patch. People were getting vexed because they often had 5 or 6 or 20 cruiser designs of the same race (for example) and the silhouette icons were no help in picking them, so they have to use mouseover tooltips to pick the right one, which is slow. So i have experimented with adding the (cropped) name of the design to the UI: (Please click to enlarge)

Old:

New:

If you play GSB a lot, you might think “yes, I need this!”, but I’d like to know if you think it looks a bit cluttered, or messy, from the point of view of someone just trying the demo for the first time.

Edit: I tried it with a smaller font. Better? or too small?

Newer!:

Basic principles of game optimisation

Making games run faster is a pet topic of mine. Code samples are too specific to help many people, so here are some general principles I’ve learned.

1) Design to avoid the code.

Sounds horrid doesn’t it, but people do it all the time. ‘Skinned’ animation at points like shoulders and knees is CPU intensive and tricky. Ever noticed how many characters in games have big shoulder-pads? Makes life much easier. GSB is a 2D game, mainly because I prefer 2D gameplay, but I can’t ignore the fact that it would be horrendously more draining on the CPU/GPU to be in 3D

2) Run the code offline.

If the output of your code is a one-off, only ever do it once, and before you ship the game. The GSB campaign game code has some really inefficient slow brute force stuff for calculating planet-travel distances. It’s done as a one-off, and the results loaded in at run time. If there are calculations your game makes at run time that are based on data that never changes, just pre-calc them and load in a table, assuming the table is small enough

3) Run the code once, and cache it.

This is the ultimate big win. In the old days, people used tables of cosine/sine lookups, rather than calculating them. Hold on! GSB does that for some stuff too (nothing gameplay critical). Never make a calculation twice in a  function if you can do it once and reference it later. It’s amazing what a difference this makes. even simple stuff like STL list end() calls can mount up with really large containers

4) Don’t run the code every frame.

Not much code has to be run every frame. The minimap in GSB isn’t updated every frame. Can you notice? I can’t, because most frames a ships movement would be ‘sub-pixel’ anyway. If stuff like this seems to jitter, update half the code one frame, the other half the next frame. A frame should be 1/60th of a second. Nobody will notice.

5) Don’t process what isn’t seen.

GSB does some cunning code for all kinds of cosmetic things that only applies if that activity happens onscreen. In theory you can pause the game, scroll around and spot very minor inconsistencies (good luck). With strategy games, most of the time, most of the action isn’t being viewed, so you can skip allsorts of stuff. I don’t update timers for running lights offscreen, for example.

6) Re-order and group stuff.

Graphics cards like to do things in big clumps. give them a single texture, and 50 sprites to draw and they are happy. Give them 50 sprites with different textures and they are not. This is why all the GSB debris is clumped into a single texture, ditto the laser bolts. I also re-order ships in the game code so that similar ones are drawn one after the other, even when drawn as icons. This minimizes texture swaps. Because GSB doesn’t use a z-buffer(for blending reasons), that makes for some spaghetti like code, but it’s worth it. The easiest system I’ve found is to maintain spritelists for different textures. You still draw sprites as normal, but when they draw they just get thrown into the relevant list, and the list gets drawn later.

7) Save stuff for when you are not busy

GSB does this. It’s very tricky, but you can have code that only runs when the CPU is idle. If a laser bolt hits some debris in GSB, the debris explodes. This ONLY happens if the CPU is idling. People spot it occasionally and think it’s l33t. They never spot that it doesn’t happen all the time.

8) Optimize the UI

People get a fast engine then slap some super-slow UI on top. Madness! With a lot of text, icons, dialog box backgrounds and multi-part buttons, you can have crazy overdraw, crazy texture-swaps and huge inefficiency. Keep an eye on it.

Don’t forget that you can also optimize textures too. Some textures are ripe for compression, others not, but you can also do crazy tricks with some stuff, like chop a circle texture into one quarter, and raw it as 4 flipped and mirrored sprites (I do that a lot). Not everyone has 512 MB video cards, and its quicker to load a small texture than a big one anyway.

Most coders probably know all this already, but it doesn’t hurt to recap. It’s easy to forget about optimising and just worry about features, but gamers will thank you for it. I get a lot of people remarking how surprised they are at how well GSB runs on their machine. This is no accident :D.

patch 146

I released patch 1.46 for GSB today. It’s up and running now. This is quite a minor patch, but I thought it worth doing. I must make a mental note to tell steam, stardock etc about it tomorrow. The big feature of the patch is it lets you toggle between the new and the old post-battle stats now with a mere click of a button. Hurrah. The rest is just bug fixes. Apostrophes in usernames cause errors and are no longer allowed, etc…

Tomorrow I’ll be back working on the campaign. There is some new GUI artwork, and a list of bugs to fix. Plus I had some crazy ideas for some gameplay balancing code.

In other news, today was spent partly pacing around the outside of the house seeing where there is room to put solar panels. I’ve long long wanted solar panels, and it would be kinda cool to have positech solar-powered at my end :D It’s pretty scary when you add up how amny units of electricity we use, and then pace out how much space (and cash) is needed to provide all that. Currently, 12 square meters of space is possibly viable, and that’s maybe a third of the requirement. Bah.

One day maybe…