The last couple of days have been all about getting everything packed and ready to go because I’m heading south to visit family and friends. Literally heading south right now because, for the first time since I started doing these journeys, there’s actuallly a working wifi service on the coach! So here I am composing a blog post whilst listening to ProTracker modules, sipping diet Coke and zooming down the M1 – I think we’re coming up on Leicester soon – how pretentious is that?!
Well okay, not particularly because it’s old hat for most people but the coaches on this run haven ‘t previously offered wifi and, although I know there’s a streaming service available so they must be reasonably confident of the bandwidth, I’m quite surprised at how quick the connection actually is. The down side is that its being filtered with OpenDNS/Cisco Umbrella and a few of my regular haunts like Atari Age aren’t available so those poor souls will have to survive without my “wit and wisdom” until later.
I had a quick stab at circumventing the filtering of course, but both Opera’s VPN and TeamViewer won’t connect and forcing the DNS to 22.214.171.124 failed as well; hardly surprising of course because I wouldn’t expect Cisco to miss any of those tricks, but still a pain considering I’m seeing “invalid” certificate errors from WordPress.com and YouTube amongst others. Anyway, I’ve managed to kill most of an hour and about half of the battery on my old Dell D630 with this ramble so I might as well kick it out… there’ll be at least one post this coming week but I’m not sure when and “normal” services will resume after that.
There hasn’t been much time for coding since the start of the new year, apart from spending a while prodding around a little at Vallation, mostly because another member of Cosine is considering a port and I’d forgotten how some of the level data was organised!
Previously I have pondered about coding something under the C64CD label as a practical demonstration of what processes are actually involved when writing a game; as already noted, my first thought is always “let’s do a scrolling shoot ’em up” but the idea of a tile-based version of Co-Axis didn’t really feel right so the project was pushed to the back burner until a recent Facebook post from Karolj Nadj about writing his first Run Length Encoding routine set me thinking; I’ve already got one of those, so could the scrolling background for a game be compressed that way rather than using tiles?
Run length encoding works by tokenising clusters of the same byte, so if there are twelve $64s in a row in the data they’re reduced down to three bytes which are a copy of the byte itself, a flag of some kind to say it’s going to be repeated and the number of times it should repeat; something like the gaps between landscape details on a scrolling background for example can be compressed quite a bit. With that in mind, out came my four year BlitzMax RLE compression code and the messy, self-modifying 6502-flavoured unpacker for a few tests and, after throwing some test data together and adding a couple of loops to convert the incoming map data to columns rather than rows, it seems to be reducing to around a third of its previous length which is sufficient for what I have in mind.
These early trials also found a bug within the RLE compressor code; because the length is a byte and can’t be higher than $FE there’s a sanity check in the code which stops the currently encoding run when it hits that value and forces a new one to start… all very sensible if I hadn’t forgotten to properly finish that first run in the data before moving on. Instead it only wrote the byte and a trigger for the run but no length value, meaning the 6502 end would pick up the next byte and use that instead, completely mangling the data in the process. This went undetected because the only practical use my RLE code had been put to previously was compressing streams of AY register changes for my prototype Apple II Mockingboard music driver where the data there changes too often for the bug to appear.
Lazer Force is one of the myriad budget shooters which materialised in the mid 1980s on the C64, hailing from Codemasters and programmed by Gavin Raeburn who already had a couple of shoot ’em up previously distributed by Alpha Omega and the bi-directional, horizontal blaster Thunderbolt, which was distributed by Codies.
The levels are divided into four parts; a very busy vertically scrolling shooter with tons of character bullets and fast moving nasties leads into a Centipede-inspired affair which is overlaid by more of the chaotic sprite-based enemies.
These high octane battles are followed by a significantly more sedate refuelling sequence where the player’s ship must be precisely placed on the docking bay of a mothership as it drifts back and forth across the screen and, regardless of if that sequence is completed successfully, there’s also one of those tunnel navigation games where the terrain is randomly generated; the player earns more points for going faster but risks losing control and mashing the craft into a wall before the timer runs out.
Whilst the first couple of phases are simple but often frustratingly difficult fun, the latter two feel as though they were just tacked on as an afterthought. Suddenly transitioning from thumb blistering action to the slow-paced docking stage and back breaks the flow of the game up. There are going to be players who enjoy that calm between each main assault’s storm, but I’ve always felt that the long break between action sequences dragged me out of “the zone”, which is problematic in a game where fast reactions are so important to survival.
The sound is probably best described as okay – it certainly isn’t one of David Whittaker’s more memorable tracks and too “jolly” for a shoot ’em up – and, although the graphics are reasonable throughout, some of the levels are a little sparse presumably to keep the character set use down to a minimum. But, despite having some flaws, Lazer Force is still a fun budget blaster; I got my money’s worth from the couple of quid handed over all those years ago and still enjoy playing it occasionally but, as old age sets in, that high difficulty seems far harsher now than it ever did to my teenage self.