I’ve made a flash version of the classic Amiga/Intellivision game Biplanes. I’m more or less happy with it, however I’ve spent too much time fiddling with minutia and I wanted it wrapped up before this weekend’s mini Ludum Dare. So this arbitrary end point will do.

Yes.

So, this is a remake of Peter Mason’s Amiga game Biplane Duel & its update Salmon-Pink Max (from 22 years ago! *weeps*) which turned up on the coverdisks of Amiga Format and Amiga Power way back in the early 90s. It is a magnificently tight two player competitive game, and aside from one unfortunate bug, tuned to perfection. For many years, it was a constant go-to game to be dug out from the great pile of old coverdisks when friends were round of an evening.

The Amiga version was itself a remake of an old Intellivision game called, funnily enough, Biplanes, which has a reputation for being the most popular game within Mattel’s own Intellivision programming team.

That’s the history.

The purpose of this for me was to have implemented a full game with actual graphics and sound, without having to worry about the real hard work yet, ie design. TIGSource are running a competition of with the theme “Versus”, and that seemed as good an excuse as any to finally get on with the project. I’ve no intention of going anywhere near TIGSource with this, as it’s not my game.

If you look at screenshots of Peter Mason’s game, you will see that I have literally recreated all the art and done my best to get the sound and gameplay as close as I could.

One point before you have a go, getting the plane in the air is a little tricky at first. Your plane doesn’t have a lot of power and can’t fly upwards particularly well.

Oh, also, it’s 2 player only

Get Adobe Flash player
Things I have learned: Reverse engineering the mechanics and “feel” of a game is rather difficult.

I did expect this, however I had thought I would be able to get it closer in the time it took. What behaviour is a consequence of another mechanic, and what behaviour is individually implemented? Does it matter? Tweak one behaviour into existence, break another behaviour, tweak second behaviour back into existence, break first behaviour again, decide they should be handled separately, break something else.

There must be a better way, I’ve only been at this a few weeks I may yet figure it out. I’m not planning on remaking more games at the moment, however if I have a mechanic in mind it would be best if I could translate that into functional code.

I think I got it close enough that if you don’t play it side by side with the original it feels like the Amiga game. If you do play it side by side it’s quite obvious that I haven’t got it *quite* correct, it’s a little sluggish compared to the original, and the when you lose control of your biplane you begin to fall too soon.

Things I have learned: MP3 doesn’t loop well.

I wasted a couple of hours driving myself round the bend trying to get an mp3 file to loop cleanly for an engine sound. It turns out that between encoders and decoders you are quite likely to end up with an unavoidable pause in your looped sound.

I mostly got around this with a little application called MP3Loop which I found along with an explanation that there was a reason I wasn’t having much success. The resulting MP3 still had a tiny glitch between loops, which I reduced the impact of by creating a longer mp3 which contained many loops of the original sound, so the final sound only glitches every 10 seconds and is much less noticeable.

Things I have learned: MP3 doesn’t pitch shift well.

You may notice that the engine sounds have some pretty nasty artifacting in the sound while it is changing pitch. If I had more time I would try creating the engine sound at stepped frequencies in the range I want the sound to play then shift between them rather than trying to pitch bend one sample. I’m not sure how that well that would work in practice. I may also be wrong about the cause of the artifacting, it’s an assumption that the pitch shifting is to blame.

Things I have learned: Drawing is lots of fun.

The thing I am most pleased out of the whole project are the how plane graphics turned out. That was fun. The explosions aren’t consistent in style between the planes and the balloon, I am aware. Apologies.

Things I have learned: White noise is versatile.

The explosion and shot noises are layered white noise with some fade out, pitch shifting and phaser applied. I found Audacity to be quite decent for this purpose.

I couldn’t recreate an engine sound I was happy with in this manner, so opted for recording the exhaust of my car, slowing it down while retaining pitch, then boosting some of the high bass frequencies to add a bit of harsh ‘chug’ into the sound. I’m still not quite happy with that sound, and the artifacting really doesn’t help. But, out of time.

Things I have learned: Keyboards are not good input devices for multiplayer games.

On my Mac, I can control both planes at once. On my PC ‘A’ key presses aren’t registered if you are pressing up and ‘W’ at the same time. Shift to ESDF instead of WASD and it’s fine. On a friend’s laptop WASD and ESDF both work perfectly fine, but neither plane can fire unless you stop accelerating. As a hacky workaround I have put options in place for selecting between WASD and ESDF for player two and having two possible fire buttons for each player. The additional fire buttons were thrown in at the utter last minute, and past my self imposed “don’t work on this game anymore” limit. So I don’t actually know how much they will actually help.

One thing that may genuinely get me returning to this game in the future would be to attempt to implement network multiplayer code. Of all the outstanding issues, the one I most feel lets the project down is this one.

Reading back I sound more unhappy with this project than I actually am. I think it’s good ‘enough’, it’s just not perfect.

2 Comments (and 2 trackbacks)