Category Archives: DevLogs

Jetboard Joust Devlog #105 – Trailer Trash pt 2

Please wishlist Jetboard Joust on Steam here.

Well, the trailer’s finally done – thank God! As with the last instalment I ran into a few issues along the way and got distracted by (necessary) bugfixes. Here’s a brief summary of how things panned out…

1. Oh, Bugger!
The thing about doing a trailer is that it makes you capture and scrutinize a shedload of gameplay footage AND deviate from your ‘learned’ methods of playing your own game. The consequence of both these things is that you uncover new bugs.

I ran into a few new bugs when working on this section of the trailer, most of them related to trying out different weapon types on the bosses. The most significant of these was that there were major deficiencies in the raycasting algorithm I was using to work out damage caused by explosive weapons. Turned out I was only calculating collisions based on axis-aligned bounding boxes (fine for smaller enemies, not fine for the more complex outlines of some bosses). So I had to redo the algorithm to work properly with convex polygons.

There were also issues in the way damage was distributed via ‘proxies’ (e.g. different parts of the same boss) which had to be looked at and problems with the ‘particle storm‘ weapon which were very fiddly to debug.

2. Enemies and Weapons
The next twenty-ish second chunk of the trailer aims to give an overview of the variety of weapons and enemies in the game. I split the into eight 2.5ish edits, taking the timings from the ‘Enter The Gungeon’ gameplay trailer which seemed to pace the edits about as fast as you can get whilst still making sense of what’s going on. Managed to squeeze a brief glimpse of the weapon upgrade process in here too – I wanted to convey visually that there’s upgrade paths available for the weapons.

The edits were made by grabbing a shedload of footage and then whittling it down to the ‘best’ short segment. This was a time-consuming process. I set up levels artificially so I was only dealing with one enemy at a time – ‘real’ gameplay footage proved too confusing as there was just too much going on most of the time.

3. Bosses
The next twenty seconds or so provide a five second ‘reveal’ of the first four bosses. That’s only enough time to sneak a look at the first attack phase of each but I think that’s enough – I’m bit worried about giving too much away as it is. As with the previous stage, I had to grab a ton of footage and then whittle it down to the ‘best’ edits. I also had to bear in mind the transitions between the edits whilst grabbing the footage, i.e. make sure the player was positioned onscreen at a point where a smooth transition would be possible so the viewer’s eye never has to make a disconcerting jump. I found this was particularly important when dealing with very short cuts. I had to re-shoot a couple of edits in both this section and the last in order to get these transitions smooth.

4. Out With A Bang
Initially this section was simply a glimpse at the final boss fight but I felt that just cutting to titles after this seemed rather lame. Consequently I worked on a more ‘scripted’ take where the player flies over the final boss and then takes it out with an R.P.G. It’s not possible to do this in the actual game (the fight has about five stages) but it acts as a significantly more punchy ending to the trailer.

I had to do multiple takes of this to get it right as I needed to fly over the boss, shoot it accurately, and then position the player accurately in the middle of the screen all without doing anything visually unappealing like crash into the edges of the screen or flipping left/right too much. there were plenty of bloopers – including some where I fired the R.P.G. in completely the wrong direction.

5. Outro Titles
I ended up doing these in code and positioning them over the last section in After Effects using chromakeying. Initially I thought I’d animate them in After Effects but I just found this far too fiddly. Fortunately I was able to use the in-game logo ‘entrance’ without having to change anything much so it was mainly about animating the subheadings with the release date etc. I like the way the smoke is still dissipating in the background as the titles appear!

6. Back To The Beginning
Lastly, I went back to the start of the trailer. I was every-so-slightly over 1:30 seconds so I edited the initial titles down a bit. As some people had commented that the player appeared to come ‘out of nowhere’ a bit (I kind of agreed with this) I tried panning across to the player before going back to the alien babies/abductions. This seemed to work. I also made the player blink in this cut to bring him to life a bit (done in After Effects) and added ‘abduction’ and ‘mutation’ text with pans and zooms with the rest of the action.

Now I think we’re finally there. Next task – Steam page and assets!

Dev Time: 8 days
Total Dev Time: approx 300 days

previous

The Final Trailer In All Its Glory

mockup_3x
Raycasting Now Works Correctly With Convex Collision Polygons

mockup_3x
Fixing ‘Proxy’ Collision Detection Bugs

Jetboard Joust Devlog #104 – Trailer Trash pt 1

Decided to split this devlog in two as making a videogame trailer is a fairly long process, particularly when you don’t know what the hell you’re doing! Plus there’s been a couple of other things that needed attending to before I felt I could really progress as I’d like.

1. Audio FX
Firstly I had to do some more work on the in-game audio. There were a number of actions I felt required fx that didn’t have any (some pretty important such as unlocking weapons and worlds) and a couple I wasn’t happy with. I spent a couple of days on this. There are now around 270 individual effects files in the game, and that’s not including background music and loops! I think the audio is a pretty distinctive part of the game due to the fact it’s all produced from scratch on analogue gear – no stock samples here, folks!

2. Performance Optimisations
Secondly, as I was recording a bunch of action footage I began to notice frame-rate drop at a few points where there was really intense action on screen. This was exclusively at places where enemies that release a bunch of ‘offspring’ are destroyed by a weapon that kills the enemy and all it’s offspring in one fell swoop (e.g. the jetboard attack). The resulting explosion-and-bonus-fest was just a bit too much.

So, I worked on some optimisations for the above. This included adding object pooling for every object that’s generated when an enemy is destroyed, combining multiple smaller explosions and/or smoke clouds that are very close together (and instantiated in the same frame) into one larger one, and pre-caching of the terrain elements that pickups might hit as they fall (rather than calculating this every frame). I’ve also let some offspring ‘escape’ in the above scenario as I didn’t like it when absolutely everything got destroyed. I no longer see any frame rate drop now, even when there’s a shitload of fireworks going on, and I’m running a Mac from 2008!

3. Start The Trailer
Before starting the trailer I read through a number of very helpful blogs on the subject by Kert Gartner and M. Joshua. Here is a particularly good one.

3.1 Choose The Tools
One of the most useful practical tips I picked up from these was a pointer to an app called Screenflow that will grab 1080 game footage at 60fps even on my ancient Mac. I’ve been through a bunch of these screen capture applications (Snapz Pro, Capto, Screenium) but Screenflow is the only one that will do this. Capto is cheap and neat (this is what I’ve used for most of my animated GIFs and devlog posts) but will sometimes compress really heavily for no apparent reason, Screenium is almost as good as Screenflow (and cheaper), will let you record a set area AND remembers this rea (really useful) but it still compresses a bit even at the highest settings (plus I found it’s editing tools a tad clumsy and prone to crashing). For the purposes of recording gameplay footage for trailers Screenflow definitely comes out tops.

3.2 Intro
Probably the hardest part of the trailer to get right is the first 15 seconds. You don’t want to lose the user’s interest and you have to attempt to communicate the core mechanics of your game in as short a time as possible (without being overly didactic). I’m still not sure I’m 100% there but I think what I’ve come up with does a reasonable job of communicating abductions, mutations, the jetboard attack and the general carnage of the game in that timeframe. To get this footage I used a combination of scripted events (i.e. faking things through coding) and playing through a set sequence over and over again until I managed to one-shot all the enemies in a way that looked effortless and ‘readable’ enough.

3.3 Shock & Awe
After this initial intro section comes just under another 15 seconds of what I’m referring to as ‘shock and awe’. This is a high-octane segment that focusses mainly on the destruction wrought by the jetboard attack but also features a couple of other weapons. This is all ‘real’ gameplay footage, I just recorded a load of stuff to get a variety of enemies and palettes. I deliberately try and move the action from one side of the screen to the other here.

3.4 Breathing Space
Lastly comes just over 10 seconds of ‘breathing space’. A longer cut in which we see the destruction of a boss, the opening of a treasure chamber and the discovery of a new weapon. This section has a certain amount of scripting (reducing the bosses health and getting rid of some onscreen distractions) but is largely the result of playthrough after playthrough to get things looking slick and pulled off in as short a time as possible.

I’ve tried to keep the player’s position onscreen consistent between cuts so that the viewer’s eyes can easily track what’s going on. I’m also zooming/panning across the action where appropriate in order to avoid ‘dead’ areas of screenspace and create variety. I thought this might be overly distracting but it doesn’t seem to be.

So now we have just under 45 seconds of trailer done which is approximately half of it. Next step, around 20 seconds on enemies and weapons, 20 seconds on bosses, and a five second closer!

Dev Time: 10 days (inc 2 days audio and 2.5 days performance optimisations)
Total Dev Time: approx 292 days

previous

Jetboard Joust Devlog #103 – A Broader Palette

Well, I reckon this has been the longest break between devlog updates so far. I’ve had two contract jobs on, one of which turned into a bit of a never-ending spiral with the client refusing to pay me unless I kept adding additional functionality (for free). Shame, as it was kind of a nice project otherwise. I have a bit of a rule about not working for startups which I broke for that one as I knew the person involved and was interested in the concept.

I’ve also had a lot to do at a rental property I own which needed considerable TLC between tenants and which was built to a very shoddy standard. Grinding out and re-doing grouting between floor tiles in the bathroom was a horrendous job – hope I never have to do that again!

Anyway, you don’t want to hear about that shit. The bulk of the work on Jetboard Joust has been in finalising the main palettes for each of the five ‘worlds’ that comprise the game. I’m going to have four main palettes per world, plus a bunch of ‘bonus’ palettes that can be unlocked by completing specific levels.

I probably should have coded a tool to make this process easier but I just couldn’t face it when the time I had available was very piecemeal, generally half a day here and there between contract work and property maintenance! Consequently my working process was pretty inefficient, basically editing a big PNG of all the palettes in Photoshop before recompiling and running the game to see how things looked.

There are ten colours per palette in the game and the following items can all have a different palette applied (though in practice many share the same palette)

– Player
– Enemies (three types)
– Bosses
– Pickups
– Terrain
– Floor
– Background parallax (both layers)

To design the palettes I used a combination of reference material and inspiration from messing around with colour association using coolors.co and a simple colour ramp generator.

The actual palettes themselves I’ll list below and detail the specific inspiration where appropriate. These are all in the order they appear in the vids.

World One
I wanted to start the game with earthy, muted colours and then progress to more vibrant colours as the user moves through the worlds, as well as slowly introducing different palettes for different sprites. The first palette is the slightly gameboy-ish one I’ve been using from day one and I gradually add more subtle hues to this as we move on. There’s no specific inspiration for the palettes in this world though I was looking a bit at army camouflage designs for the third palette here which is currently named ‘Going Commando’.

World Two
Each of these palettes had a different inspiration, only two of them particularly related.

1. No Space To Scream
A good ‘segue’ palette from the muted colours of world one. This is inspired by the colour scheme for the branding of the original Alien movie.

2. Deep Dive
Inspired by photographs of coral reefs. As the boss in this world is a giant alien robot-fish this seemed appropriate somehow.

3. Neon Flux
Inspired by neon-heavy nighttime shots of cities, particularly Tokyo. Visually it has the feel of being a much more saturated version of the previous palette.

4. Aliens on Acid
Originally inspired by the ‘Alien’ colour scheme as was the first palette, only with colours so saturated it almost has an early arcade / ZX Spectrum feel.

World Three
We go back to a slightly more ‘muted’ feel for these palettes, all of which have their inspiration from vintage designs.

1. Stan and Jack
Inspired by the cheaply printed colours of early comic books, particularly the Marvel stuff.

2. Dead Red Revolution
Partly inspired by poster art from ‘Grindhouse’ style movies (I have a large poster for ‘Death Proof’ on the wall of my studio) and partly by the artwork for Red Dead Redemption which has a similar ‘vintage’ feel.

3. Forbidden Fruit
Inspired by a poster for the 50s sci-fi classic ‘Forbidden Planet’ – I’m really pleased with this one.

4. Retro Apocalypse
Inspired by some cover art for a 50s or 60s pulp sci-fi novel. I am not convinced by this one. It kind of works but some of the sprites just don’t. Needs more work!

World Four
All inspired by various ‘horror’ related themes! We move back to some pretty saturated colours for these ones.

1. Dead Evil
Inspired by the original posters for Sam Raimi’s ‘Evil Dead’ movie.

2. House of Hammers
Inspired by the poster art for various low-rent Hammer horror films. This is another one I’m particularly pleased with.

3. Toil and Trouble
I went for deliberately clichéd ‘Halloween’ style colours for this one. Very saturated and ‘in your face’ but I think it works.

4. Black Mass
Inspired by various different, more modern, horror film posters – as well as the artwork for the ‘American Horror Story’ TV series (which I thought was terrible and never made it past the first series).

World Five
These were mainly inspired by the manual artwork for early Atari arcade cabinets. I absolutely love that stuff and it also adorns the walls of my studio (alongside the aforementioned Death Proof poster and paintings by Basquiat and Tapies).

1. Rayguns at Dawn
Inspired by the ‘Space Duel’ manual art.

2. Planet X
I forget what inspired this specifically (oops) but I’m pretty sure it was the cover art for another vintage pulp sci-fi novel.

3. Gravity’s Rainbow
Inspired by the ‘Gravitar’ manual art. This is one of my favourite palettes in the game.

4. Prospero’s Cabinet
Inspired by the ‘Tempest’ manual art.

There’s still the bonus palettes to be finalised, I’ve done quite a few of them and there’s a lot of nods in there to 8bit home computers and consoles. That’ll be the subject of another post though! Hopefully things will move a little quicker over the next few weeks, next task is to fill in a few gaps in the audio then do a pretty much final teaser vid and get my Steam page up (I probably should have done the latter months ago).

Dev Time: 10 days (pretty broad estimate)!
Total Dev Time: approx 292 days

previous

World Two Palettes – Aliens and Oceanography

World Five Palettes – Atari Arcade Manual Art

mockup_3x
Awesome Atari Arcade Manual Art

mockup_3x
The Forbidden Planet Poster That Inspired One Of My Favourite Palettes

Jetboard Joust Devlog #102 – It’s the Little Things…

So… following on from my last post about bugs, here’s everything that was on that Trello TODO list that’s more of an ‘improvement’ than a bug (though of course, fixing bugs is always an improvement)!

1. Different Damage Types
I’ve added different damage types – physical, fire, plasma and jetboard and given enemies the ability to be resistant (or vulnerable) to certain type of attack. Some weapons deal out a combination of damage attacks. I’ve also added armour upgrades that increase the player’s resistance to these various damage types.

2. Object Pooling
I’ve added object pooling as described here to the flamethrower and antimatter gun, both of which were spitting out a ton of new objects per frame which was causing some slowdown if a bunch of enemies appeared armed with the same weapon type.

3. Destructible Buildings / Enemy Bones
I’ve massively improved the animations for destructible buildings and also added rubble which interacts (to an extent) with the player. Buildings now take damage from explosive weapons as well as the jetboard attack, adding to the immersive destruction. Enemy bones and rubble now spin in the air when disturbed with great force – this can look pretty cool under certain scenarios, totally pointless in terms of gameplay but cool!

I’ve also been through and designed skulls for every enemy and added shrapnel as well as bones as that seemed more appropriate for seom enemies.

4. Improved Explosions
I’ve added a bunch more visual ‘snap and crackle’ to the explosions. Spent way to long on this for something that only last a few frames and ended up going down a complete rabbit-hole writing a custom shader based on Voroni patterns (to give the ‘crackle’ effect) which still doesn’t work quite the way I wanted but I think will get the job done. I spent time doing some frame-by-frame analysis of a bunch of pixelart explosions I liked – one thing that surprised me is that the initial ‘whiteout’ flash in many explosions is often preceded by a ‘blackout’ frame. Of course I had to add one!

5. Improved Camera
One of my many arch-nemesises (or should that arch-nemesi?) throughout this project has been the bloody camera. Been back and re-worked it yet again, radically simplifying the code and ending up with a result that’s much better for it. Still little work to do but I think it’s finally almost there. Whereas before I was positioning the camera based on speed/time moving in one direction and enemy position I now rely solely on enemy position and only use speed/time moving in one direction if there aren’t any enemies nearby. I also take difficulty into account when calculating the ‘weighting’ of enemies.

6. Improved Jetboard Attack Visuals
I felt this needed more ‘punch’. It was one of the first things I designed and, as a result, was looking somewhat lacklustre compared to the rest of the visuals. I’ve added particle trails to the jetboard, a subtle shader effect that approximates the attack area, camera shake and a camera jolt. I think the result has miles more ‘oomph’ than it did before.

Oh yeah, I also made the jetboard attack quench fire if the player is alight and safely detonate any ‘stuck’ explosives (cluster bombs or limpet mines).

7. Improved Bomber Enemy
I didn’t like the way these guys pretty much ignored the player as they were attacked, just soaking up bullets until they exploded. I’ve made them get much more aggro when they take damage now which gives them a load more personality.

8. Improved Mother Enemy
This enemy was a bit too much of a ‘bullet sponge’ as well. I revisited the art for this one as I felt it looked a little flat, then I reworked the enemies it gives birth to, making them much more aggressive so it feels more akin to the ‘swarmer’ enemy in Defender that inspired it. I also changed the ‘bullets’ it fires, replacing them with little ‘space invader’ type characters that have far more personality and are far less annoying (though no less difficult).

9. Improved Squocket Enemy
As mentioned in the last post, the AI for this enemy was buggy so I rewrote it. The bullets it fired were also pretty lame and quite annoying so I’ve replaced them with these little ‘baby squocket’ dudes which (can you see a theme here?) have far more personality and are harder but somehow less annoying and more ‘fair’ at the same time! The screen capture software I use went a bit glitchy when capturing the video for these so apologies for that!

10. Improved Baiter Enemy
More of the above here! The enemy itself I was happy with but it’s bullets were really annoying so I’ve replaced them with another little mini invader.

11. Re-routed Treasure Chambers
I had placed these deliberately sporadically throughout the game world so that it would take tons of plays through to get to all of them but in retrospect I think that would have been too annoying. Consequently I’ve reworked things so that you should be able to get all the key treasure from any particular world in three ‘passes’ (or less using teleports). This has meant there’s not much treasure at the outer reaches of the game ‘pyramid’ so I might have to add a few bonus treasure chambers in those outlying reasons to give players a reason to go there other than sheer completionism.

There’s been loads of other minor improvements too but those have been the major ones. Next step I think I need to finalise the main game palettes and then start thinking about a ‘final’ (?) demo movie! The end is almost in sight people…

Dev Time: 7 days (ish)
Total Dev Time: approx 282 days

previous

mockup_3x
Unlocking Plasma Armour

mockup_3x
Destroying Buildings And Playing Amongst The Rubble

mockup_3x
Explosions With More Snap & Crackle

mockup_3x
Bombers Are No Longer Bullet Sponges

Gratuitous Showing Off of the New Jetboard Visuals


The Improved ‘Mother’ Enemy, (Defender Swarmer)


The Improved ‘Squocket’ Enemy and It’s Offspring

mockup_3x
Re-routing the Treasure Chambers

Jetboard Joust Devlog #101 – Bug Days

Yup, it’s been a while (again). I’ve really had my head down trawling through a list of bugs and small(ish) improvements that I’ve been noting down in Trello over the past few weeks. Desperately trying to keep the motivation up. Have also had a bit of contract work on (which is welcome given the current state of the BitBull coffers) which isn’t over yet either.

So I’m just gonna bore you with a long list of these bugs as this shit is all part of the joy of gamedev. The improvements, which I’ll cover in the next post, are rather more interesting. As well as these there’s been a ton of other minor fixes and a lot of just going through and checking stuff over.

1. Max Out Weapon Damage
Weapons that dealt out damage for more than one frame were often inflicting more damage than they should if they came into contact with an enemy over the course of several frames. This was particularly apparent on bosses which often have a large vulnerable area and multiple ‘proxy’ parts that do damage to the main character. I now keep a ‘damage record’ for these weapons over the course of their lifespan to ensure they don’t exceed the maximum damage to any particular enemy.

2. Fake Frame Rate Judder
Sometime it could appear that the frame rate was juddering if multiple enemies were destroyed in quick succession. This is because I deliberately drop a frame with each explosion to add to the jolt effect. I’ve now implemented something so that this ‘drop frame’ can’t happen too much in quick succession.

3. Palette Fixes
There were multiple issues with things being drawn in the correct palette – particularly with weapons that should be drawn in the same palette as the enemy that fired them. These issues were exacerbated by the fact that I’ve now added three possible palettes for different enemy types. Been through and fixed all these.

4. Bones and Rubble Not Wrapping
Enemy bones and the rubble from destroyed buildings weren’t wrapping with the rest of the world in relation to the player. This had me scratching my head a bit at first – there are a ton of these sprites so I don’t want to check them for wrapping every frame. In the end I figured I could get away with just checking one per frame (the wrapping doesn’t have to be accurate as it always happens way outside the player’s view). This works fine and has zero performance impact!

5. Check Level Up Rate and Damage Scaling for All Enemies
Some of these were wrong so I’ve been through the laborious process of checking all the scaling parameters =for every enemy.

6. Splitting Crawlers
Under some scenarios the ‘crawler’ enemies were doing weird shit, splitting in two and stuff. I think I’ve fixed this (it was to do with the algorithm that positioned them sometime positioning them out of the player’s ‘wrap zone’) but it was such a hard bug to replicate I can’t be sure so I’ve also added some code to ‘paint over’ the bug should it happen again (I hope)!

7. Levels Completing Too Early
This could happen with enemies that split into multiple offspring when destroyed. Had to write something toi account for this in teh code that checks for level completion.

8. Parallax Scrolling Glitches
Keen observers may have noticed this on some of the GIFs – elements of the parallax scrolling kept moving when they shouldn’t and, on very rare occasions, could completely glitch out. This was a real pain in the arse to fix for something that should really be pretty simple – in the end I re-wrote pretty much all the parallax scrolling code from scratch.

9. RPG Anim Playing Constantly Post-Mutation
RPG weapon would glitch out if the enemy that was armed with it mutated. This was another one that was a real pain in the arse to fix (hard to replicate). In the end I figured out it was to do with object pooling.

10. Flamethrower Not Working On Egg Sacks
Easy fix

11. Jetsuit Pickup Not Wrapping
…and doing other weird shit like disappearing. I’d implemented this in a rather hacky way for some reason so went back and wrote it as a ‘proper’ pickup.

12. Invaders Getting Stuck
Blocks of invader enemies could get wedged between a high building and the top of the screen and end up not moving. Fairly straightforward fix.

13. Title Screen Glitch
Title screen could get weirdly offset if the player exited the game whilst in a treasure chamber(!). Fixed this along with a few other game over / exit issues.

14. Treasure Chamber Escape
Player’s could jump out of a treasure chamber using the jetboard attack and end up falling endlessly through the void beneath! Fixed.

15. Buggy Bombers / Gravity Hammer
Bomber enemies were glitching out sometimes when struck by the gravity hammer. Fixed this and have also gone through and checked a bunch of other enemies against the gravity hammer (which has probably ended up being the most PITA of all the weapons).

16. Player Jump Anim Constantly Playing
This could happen sometimes after a jetboard attack. Was surprisingly difficult to fix, largely because I haven’t touched that part of the code for something like three years now!

17. Teleports Skipping Levels
Fixed various bugs to do with the selection of levels when teleporting.

18. Teleports Blocking Chamber Entrances
Sometimes teleports and warp gates could appear over the treasure chamber entrance making it impossible to enter the chamber. Easy fix.

19. Disappearing HUD
Sometimes the HUD wouldn’t appear correctly on the upgrades screen meaning the user had no idea how much cash they had to spend. Fixed.

20. Enemies Appearing ‘Inside’ Buildings
Problems with some of the algorithms that position enemies as they teleport in. Fixed.

21. Scanner Rendering Of Destroyed Buildings
The scanner rendering of destroyed buildings was glitching out if the building was destroyed after it had wrapped relative to the player. Fixed, with some difficulty. At least this one was easy to replicate!

22. Explosive Raycasting Issues
There were some issues relating to the removal/blocking of enemies in the raycasting checks that are carried out for explosive weapons. Fixed these and also tweaked the raycasting code for much better damage distribution, plus made all explosive items inherit from the same class and got rid of a load of dodgy ‘cut and paste’ code.

23. Squockets Getting Stuck On Buildings
Sometimes the ‘Squocket’ enemies could get wedged somewhere and just keep banging their heads against a brick wall. I wasn’t entirely happy with the tracking code for this enemy anyway so re-wrote the bulk of it.

24. Limpet Mines and Collision Proxies
Limpet mines were sticking to collision proxies that weren’t transferring damage in their current state, rendering them pointless. Does that mean anything to you? Probably not, but it was an easy fix.

Dev Time: 7 days (very approximately)
Total Dev Time: approx 275 days

previous

mockup_3x
The Joy of a TODO List That’s Now DONE

Bug Day!

Jetboard Joust Devlog #100 – Die and Try Again!

This blog should really have been Configuring Things Out pt. 2 but I thought ‘Die and Try Again’ was more appropriate really.

Now all the enemies and weapons are finally done I’ve been going back over the game worlds, playtesting and (re)adjusting all the various character/weapon stats and levelling rates. The only way of balancing the weapons is to simply play the game a lot, and if I feel I’m either avoiding particular weapon because it’s too weak, or that I’m constantly gravitating towards a particular weapon because it’s too overpowered, I tweak the stats as appropriate. It’s been a very time consuming process and I have to say I’ve been at something of a low ebb whilst doing it.

Unlike fixing a bug, you don’t ever get to the point where you think something is ‘done’, and I know I’m going to have to go through this whole process again at least one more time to refine things further before the game is complete. It’s really getting to me now.

The thing that’s made this phase so much tougher than the first configuration ‘pass’ is that I’ve been through every single boss and mini-boss fight in the first four worlds and attempted to adjust the difficulty for each. There are over fifty of these and, by nature, they are supposed to be tough, so this entails a *lot* of failure both in terms of dying in-game and in terms of setting the difficulty level either too easy or too hard.

Most of these challenges are mini-boss battles featuring the Guardian enemy and a new weapon unlock or upgrade. To maintain a certain amount of narrative ‘flow’ (and to stop me being lazy) I’m having the enemies guarding the unlocks armed with the same weapon they are protecting. The strength of the enemy is heavily dependent on the strength of the weapon, therefore a tweak to the stats of said weapon (because I think it’s too weak or too strong in-game) has a knock-on effect in every single battle that features it. It’s a cyclical process and one that I’m starting to think could go on forever, like painting the Forth Bridge. On a good day though I see it more as a kind of gradual ‘whittling down’ with every pass getting me nearer to the ideal balance.

It also makes a difference what weapons are available to the player during these battles. I was choosing these weapons completely randomly (but based on a consistent seed) though towards the end of the process I realised this wasn’t working and I needed a better balance of weapon choices. Consequently I’ve divided the weapons into four categories – long range, short range, wide range and explosive, and I make sure a balance of weapons from each category is chosen. I think I may ditch the consistent seed as well so each time you enter a level the weapon choice is a lottery, albeit a balanced one.

There’s also been a myriad of bugs and other gameplay tweaks I’ve made along the way though at this stage I’m trying to restrict myself to fixing bugs/tweaks that actually affect the balance of gameplay and noting everything else down on Trello cards for later attention. There’s currently around fifty of the Trello cards (groan) and there’s at least another ten things I haven’t noted down yet!

I’ve also been back through the first four major boss fights and made a proper attempt to balance the difficulty of these with the (rough) stats the player should have achieved by that point in-game. If you’ve been following this blog you’ll remember how much time I’ve spent on these boss fights already, so it’s been doubly demotivating having to go back to them, debug them again, run through the fight procedure again and again AND again whilst discovering yet more bugs and issues that need fixing. On a positive note though, it’s been nice to revisit them in different colour palettes.

Lastly, and I know this is going to sound like archetypal first-world moaning, I’ve been surprised how physically exhausting this process has been. Basically playing (often ludicrously difficult) boss fights for eight hours a day for eight or nine days straight takes its toll. I try to be as careful as I can be about posture but my shoulders ache, my wrists and elbow joints ache, and my back is fucked. Yes, I know it’s not exactly working down a mine, but being physically in pain doesn’t do wonders for one’s motivation. I can’t wait to finish this game and take a break from this shit.

Oh yeah – one thing that’s kept me going through this process is the fact that I can just turn the game sound off and listen to music. I’ve finally succumbed to subscribing to Spotify and have been listening to a lot of Tangerine Dream. Strange coincidence – I finally got round to watching Netflix’s enjoyable Bandersnatch interactive movie at the same time and what does that feature? A ZX Spectrum game developer slowly going insane trying to finish a game whilst listening to lots of Tangerine Dream! Weird…

Right, on to those Trello cards…

Dev Time: 8.5 days
Total Dev Time: approx 268 days

previous

mockup_3x
The ‘Spinner’ Boss In Colour

mockup_3x
The ‘Squirmer’ Boss In Colour

R.P.G. Guardians. Die and Try Again – and Again, and Again…

Jetboard Joust Devlog #99 – Weapons of Mass Destruction

One of the things that’s struck me whilst going through and actually playing Jetboard Joust (rather than working on individual parts in isolation) is that one of the most satisfying aspects of the game is when you get to take out loads of enemies in one go with a really destructive weapon such as the R.P.G. or Grenade Launcher.

So I decided to emphasise this side of the gameplay a little more before I finally drew a line under enemies and weapon types. I wanted to add some more ‘swarm’ type enemies and another super-destructive weapon to assist in taking them out.

Rather than work on new enemies from scratch (I really need to get this game done!!) I thought I’d re-engineer some of the ancillary enemies I’d created for the boss fights. There’s three of these, and they all fit together pretty well as a kind of ‘set’ of weird alien invertebrates – jellyfish, squid, and a kind of carnivorous worm!

Given the nature of these enemies, and that fact that they’re only going to exist in fairly large batches, I thought it would be nice to have them born from some kind of egg sack rather than teleporting into the game individually like everything else. I spent a fair bit of time working on a nice, pulsating egg sack(!) and think the end result works pretty well. The egg sack is the same for each time of enemy but I quite like the idea that you’re not quite sure what you’ll be in store for when you burst it open!

Then, just because I wanted to, I also added another enemy that’s like a really tiny version of the baiter-inspired enemy that acts as the game’s time cop. As it looks like a tiny UFO it’s also a reference to the big and little UFOs in Asteroids. These don’t spawn from egg sacks though!

The new weapon is something I’d been thinking about for some time (and even unsuccessfully experimented with a bit) but only became a solid idea after seeing the scene where Rico takes out the tanker bug in Starship Troopers (again, sorry to keep going on about that film).

I’m calling it the ‘Cluster Bomb’ – it fires a single explosive charge which splits into several smaller charges when it explodes, these smaller charges then repeat the procedure. Each charge is sticky, which means it will become attached to any enemy that comes into contact with it. The charges only detonate after a certain time period, not on impact.

As you can imagine, this weapon rapidly creates full-on mayhem. Originally I had each charge leaving a smoke trail when it explodes but, unfortunately, this was causing the refresh rate to drop when tons of charges were fired at once (by the player and enemies) so I think I’m going to have to stick to just using particles for most of the explosions. Shame, as it looked really cool with all the smoke, but I guess running all those individual custom shaders at once is asking too much. In later versions I’ve added a very slight randomness to the time the charges deonate so everything’s not quite so symmetrical, I think I prefer it like this.

I’ve also been working on a couple of new palettes. One using the (now slightly #indiedev cliché) red and black ‘Downwell’ style palette and another based on the colours available on the Commodore 64. I really like the C64 one. As I was always a Spectrum guy I’m realising the genius of whoever picked those 16 colours 35 years too late! I like the Downwell palette too but I couldn’t get it to work with visually with the background parallax so I decided to lose the background and stick with the three colours. It is retro after all…

Dev Time: 4 days
Total Dev Time: approx 259.5 days

previous | next

mockup_3x
Taking Out a Batch of Mini-Squockets with the Cluster Bomb

mockup_3x
Cluster Bomb vs Jellyfish

mockup_3x
Mass Destruction of Mini-Squirmers

mockup_3x
I Call These Enemies the ‘Little Bastards’!

Jetboard Joust Devlog #98 – Not *That* Kind of Bug!

Onto the last of the ‘classic videogame’ enemies now, this one draws its inspiration mainly from the wonderful ‘Space Invaders’ style shooter ‘Galaxian‘ and, to a lesser extent, its sequel ‘Galaga’. It’s also heavily inspired by my recent re-watching of Paul Verhoven’s marvellously cheesy Sci-Fi gorefest ‘Starship Troopers’. I’m calling it the ‘Swooper’!

I’d been thinking of doing a Galaxians-style enemy for some time but it was watching the ridiculous (but genius) scene in Starship Troopers where Rico takes out the tanker bug that really cemented the idea in my head. A similar bug would fit perfectly into the Jetboard Joust world and also really suit the ‘Galaxians’ style of attack.

So I started by working on the basic movement style which was really very simple, I use LERPing to rotate the enemy towards the player whilst applying a constant velocity in the direction the enemy is currently facing. This worked fine once I’d tweaked the parameters, resulting on a nice circling motion of the enemy round the player which I felt was quite insect-like.

What was more complex was to get the enemies flying in formation. My standard approach to this kind of problem, and one I also used in this case, is to create a ‘hive mind’ class that manages the positioning of all the enemies. The individual enemies can report back to the ‘hive mind’ with various info regarding their environment but it’s the hive that tells them where to position themselves.

I tested a number of different algorithms for this – the one I ended up with allocates a leader for the hive who operates effectively as a solo entity with the movement pattern I described above. The hive mind calculates the ideal positioning of the other enemies in the swarm and I use LERPing again to move them towards this ideal position as well as to rotate them to align with the leader’s current rotation.

If certain parameters are met some of the swarms member’s will go solo, leaving the pack to chase the player in a more aggressive manner. The hive mind class manages this to make sure the entire swarm doesn’t break up at once.

I was particularly pleased with the way the swarm reorganises itself once one of its members is destroyed or goes solo to chase the player!

The art for this enemy came together very quickly (for a change) – I used the tanker bug from Starship Troopers as my only reference and it just kind of worked! The thing that took longest was getting the rotation of the wings to line up properly when the bugs are in flight. My only slight worry with the art is that I’ve used very dark colours – this makes it look pretty badass most of the time but it might be too hard to see clearly in some palettes.

I was so pleased with the way this enemy came together that I added a smaller version, the Mini-Swooper! This operate in exactly the same way as the larger version only more of them can leave the pack at once and they don’t fire at the player, they just attack them physically. They are also faster.

As a footnote – until looking it up just recently I was always convinced that ‘Galaxian’ was called ‘Galaxians’. It actually freaked me out a bit it was called ‘Galaxian’! Must be one of those collective false memory things like being convinced the Monopoly man wore a monocle!

Dev Time: 2 days
Total Dev Time: approx 255.5 days

previous | next

mockup_3x
Badass Bugs – Taking Out A Couple of Swoopers

mockup_3x
Mini Swooper Mayhem

Jetboard Joust Devlog #97 – Creepy Crawlies!

No prizes for guessing the classic arcade game that’s the inspiration for this latest enemy – yup, it’s another of Atari’s masterpieces – Centipede! Working title for this enemy is the ‘Scuttler’ (I already have a ‘Crawler‘ and a ‘Squirmer‘)!

The mechanics of this enemy are pretty simple, I thought the hardest thing to get right would be the algorithm that makes the segments ‘follow’ the head (I’ve had to right similar code in the past and got myself into a right mess) but the code I came up with, unbelievably, worked pretty much right of the bat!

There’s probably a better way of doing it but my basic approach here is to ‘remember’ the direction each segment is travelling and to continue moving in that direction by default each frame. If the total horizontal and vertical distance between one segment and the next is less than the desired segment spacing no movement occurs. If the segment aligns horizontally or vertically with the segment in front we switch orientation (i.e. from horizontal to vertical or vice versa). This seems to work well enough for my purposes but if anyone has any better ways of doing this I’d be interested to hear them as it’s a gamedev problem I seem to run into quite a bit.

Unlike the Atari Centipede I don’t have any mushrooms to run into to initiate a change of direction so I had to improvise a bit here. Changing direction when it hits buildings was an obvious one, but I also have it switch direction when it hits the edge of the screen (i.e. camera area) and, with a certain amount of leeway, when it aligns with the player on the opposing axis. This approach seems to maintain an authentic ‘Centipede’ feel whilst working within the confines of the Jetboard Joust gameplay.

I also added a slight ‘sway’ to the segments as they move as a fixed horizontal or vertical movement just seemed too ‘static’ in context even though it would have been truer to the original game. I want to tip my hat to these classics rather than slavishly replicate them.

Of course I also had to have the centipede splitting into two when it’s health is reduced which means things can get pretty manic (in a good way, though I’ve toned it down a bit since this video as things were getting too out of hand too quickly).

I’ve also been working on a Centipede style retro arcade palette but have been running into a few issues trying to get this to look good across all sprites. The red outline you can see is used on some of the sprites in the original arcade game. I like the way it looks here as I designed the sprite around it but it looks terrible on many of the sprites I’ve already designed so I think I’m going to have to use a more generic approach. If I ever make another game I’m going to make sure I treat my outline colour as a completely separate part of the palette – lesson learned!

Dev Time: 2 days
Total Dev Time: approx 253.5 days

previous

mockup_3x
Close Up Of The Scuttler – Centipede Tribute Palette!

Jetboard Joust Devlog #96 – Splitting Up!

Bit fed up with parameter tweaking, so before I finish the final first round of config by going through the treasure chamber guardians and bosses I thought I’d try and get the final non-jetboarding enemies wrapped up.

There’s going to be three of them in all I think, and I’m pretty keen to have each of them be a mini-homage to a classic arcade game, much like of already included one to Space Invaders. First up is Asteroids and an enemy I’m tentatively calling the ‘splitter’.

Originally I had imagined this enemy being a kind of giant jellyfish that split into smaller versions of itself when attacked, but then I happened across the first Starship Troopers movie whilst late-night channel surfing one evening.

It’s a pretty good movie and I haven’t seen it for ages so I ended up sticking with it to the end, and whilst watching it occurred to me that the theme of humans battling off waves of attacks from an insectoid alien race (often with fairly ‘conventional’ weaponry) wasn’t too far removed from Jetboard Joust!

I also thought that the gelatinous ‘brain bug’ at the end of the movie would work very well as an enemy that could split into smaller versions of itself so I used this as the inspiration behind my designs for the ‘splitter’. I drew inspiration partly from the movie and partly from an illustration I found from a 1970s board game version of the book which was simpler and more comic-like.

Rather than try and draw the entire enemy as one piece of art I wanted to build it from smaller components so I could easily make versions at different sizes. First off I created a pulsing body. I tried a number of different versions of this and ended up using a variation of the segments from the ‘squirmer‘ boss. The segments all pulse at the same rate with but start from a randomised offset.

I then added a series of eyes based on the eyes from the ‘spinner‘ boss and a mouth based on the mouth from the mini worms that the ‘squirmer’ gives birth to. It took a while to get the placement of the eyes right, the end result heavily references the movie ‘brain bug’.

Once I was happy with the general placement of the eyes and mouth I needed to make them feel part of the pulsing body as, when simply placed statically they looked far too ‘stuck on’.

I ended up linking each facial feature with a body segment and changing the location of that feature based on the current scale of that segment. This seemed to work pretty well in giving the impression that the features and body were joined rather than overlaid layers.

Enemy movement, as in Asteroids, is very straightforward as – a simple linear motion with a reflective bounce when an obstruction is hit. What was slightly tricky was deciding what to do when the enemy left the camera area. Originally I had it wrapping immediately to the other side of the camera (true to Asteroids). This was kind of cool, and I really liked the fact it was true to its roots, but unfortunately it made the gameplay way too intense – particularly when other enemies were encountered at the same time. I didn’t like the way it made the scanner look broken either.

So I tried simply having them wrap when they reach the edge of the game ‘world’ but this wasn’t intense enough and kind of dull. Eventually I settled on a halfway house between the two, if the enemies are offscreen or nearing the edge of the screen a decision is made as to whether the quickest route to the player is to travel in the same direction or to reverse direction (I take world wrapping and the current player velocity into account). The enemy switches direction (or not) based on this. This keeps the gameplay intense as things tend to cluster round the player but it still makes sense within the overall gameplay paradigm – and it doesn’t make the scanner look like it’s broken.

Something else I’ve been doing which has taken up at least a day of this dev time is working on a ZX Spectrum themed palette and improving some of my palette code. I can now have three different palettes for enemies as opposed to just one. Whilst doing this I discovered some bugs in my palette shaders which were particularly apparent when dealing with 100% RGB values as are used in some of these retro palettes, these are now fixed.

Dev Time: 4 days
Total Dev Time: approx 251.5 days

previous | next

mockup_3x
The Brain Bug from the 1970s Starship Troopers Board Game

mockup_3x
The Final ‘Splitter’ Design

Asteroids-Style Wrap Logic – Too Much Mayhem / Broken Scanner!


The Final ‘Splitter’ Alongside Other Enemies – ZX Spectrum Palette