Missed part 1? read it here first: https://chequered.ink/the-making-of-gamedevdan-vs-life-part-1/
Missed part 2? read it here first: https://chequered.ink/the-making-of-gamedevdan-vs-life-part-2/

Updating Old Games

The launcher may have looked complicated, especially if you’re new to game development, but once you know the core principles it really doesn’t take much time to create something similar. The hardest part of development on GameDevDan vs Life was actually getting my old projects to run smoothly on new PCs.

cosmos_errors_oh_dear

antibody_blast_dnd_action_broke
Importing my old projects into GameMaker frequently resulted in errors like this

The oldest game in the pack was originally created in 2007 using GameMaker 6.1, some were made using GameMaker 7, 8 and 8.1 and some were made in GameMaker: Studio. Technology moves fast and it’s obvious that an 11 year-old game made in an equally-old version of GameMaker was going to need some changes to meet today’s standards. GameMaker: Studio actually does a pretty good job of reporting issues with your old projects so that you can find new workarounds, but that doesn’t mean it was all plain sailing.

The most frequent source of error in my old projects was bad practice on my part. I was a complete novice when I made a lot of the older games and GameMaker used to be a little bit too forgiving. A number of times I had to correct rookie mistakes like giving two resources the same name or treating undefined variables as 0. Those things are generally easy to fix but they can be time consuming if there are several cases in each project. Still, I am glad that I made those mistakes in the past and learned something from them.

After fixing my own problems I ran into the other main source of error: changes in the GameMaker language. GameMaker has changed a lot in the last decade, as you’d expect, and there are a whole bunch of functions which have either changed or become completely obsolete between GameMaker 6.1 and GameMaker: Studio. Very quickly I realised that many of these functions had been used repeatedly throughout my older projects so I came up with a plan: Write a script for each “broken” function which I could load into any old project to fix the problem.

Breezing Through Repetitive Repairs

Audio

The most affected area of my old projects with regard to obsolete functions was, without a doubt, audio. The best way to ensure compatibility with newer PCs in GameMaker is to switch on the “New Audio Engine” in the Global Game Settings, but most of my projects used the old engine. Even in the new engine there are functions I used to be fond of which have become obsolete, such as audio_play_music.

If switching audio engines was simply a matter of checking a box or using “find and replace” this problem wouldn’t require any special treatment. However, the old audio engine and the new audio engine use a different number of arguments for each function so the simplest thing to do was to write a series of container scripts that would pass the old functions into the new functions with the additional arguments set to a specific value, as shown below:

/// playSound( index );

audio_play_sound( argument0 , 1, false);
/// loopSound ( index );

audio_play_sound( argument0, 1, true);

Now this problem does indeed become a simple case of “find and replace”: replace the old functions with these new container scripts. If I had a lot more time on my hands it would have been advisable to do this the “proper” way to cut out the scripts in the middle. But it worked out a lot better for my own personal wellbeing to do it this way, and there’s no noticeable downside.

Highscores

Another common problem that I probably share with many older GameMaker users, is that I used to rely on the built in “show highscore” function. This function used to pop up a separate window showing the player their current highscores from 1 to 10. This is poor user experience, and I’m glad it’s no longer an option in GameMaker, but it did mean writing a new script to overcome the problem. Without too much work it’s quite easy to write a highscore drawing script as follows:

for (var i = 0; i < 10; i++) {

    draw_text( 16, 16 + (i*32), myHighScores[i]);

}

This code would draw a table of 10 highscores, stored in the array myHighScores, on the screen. This is pretty much the way I replaced the “show highscore” function in my old projects.

Message Boxes

In the old, PC-only versions of GameMaker there used to be functions which allowed developers to change the appearance of the standard “Windows” text box. This could then be displayed using the show_message function. It was amateurish, and not very mobile-friendly, which is probably why this feature no longer exists in GameMaker: Studio. However I had used this feature a number of times in old projects to create dialogue boxes. Fixing this involved writing a new script that would not only display a message, but also pause the rest of the game in the background (as show_message used to do). The easiest way to replicate this behaviour would be to deactivate all of the objects in the room when the message is showing and draw a representation of the current scene behind a dialogue box. But that didn’t feel right, so this time around I actually put in the extra effort to pause the game by having the relevant objects check that there wasn’t a message box on the screen before running their usual routines.

cosmos_origins_textbox

cosmos_origins_textbox_new
On the left Cosmos Origins with the old “show_message” system; on the right Cosmos Origins with the new workaround script, in which I included a way of allowing text to be colored or “shaken” in the middle of a string. Much better.

And Other Stuff

Those were the most common problems I faced but naturally there were a few other problems, not least my teenage habit of playing fast and loose with copyright law. Thankfully there were a wealth of creative commons assets available to hide my shame. As long as I could avoid “reinventing the wheel” for each issue development stayed on course, but there are some games that just couldn’t be rescued.

Recognising a Lost Cause

Throughout the whole process there are games that just didn’t make the cut. Some were made as part of a team, and I couldn’t secure permission from the other members, others were simply broken beyond all hope of repair. But early on in the pack’s development I had promised 50 games, and I was going to deliver 50 games.

The Mystery of Bockston House

The Mystery of Bockston House was one of my first ever Android games and one of my most successful. The game garnered around 20,000 downloads in just a couple of weeks without any real advertising or press coverage. It was also made purely in HTML5 - not GameMaker - and made use of non-commercial creative commons assets. This obviously presented a problem because I wanted the game to be represented in GameDevDan vs Life, but I’d have to replace all the assets and it would be the only game in the pack to force open the user’s browser.

Eventually I came to a decision: the game would be represented in the pack but I’d recreate it entirely from scratch in GameMaker.

tmobh_old

tmobh_new
Left: The old version of TMOBH, warts and all; Right: The new version created for GameDevDan vs Life.

Recreating the game not only allowed me to add new features and improve the gameplay, but also to take the game in a completely new direction adding humour to the mix rather than the serious edge of the original.

The game played so well as a standalone we ended up releasing it on iPhone, iPad and Android back in October, long before we expected to finish GameDevDan vs Life.

Brash Kangaroo

With 49 out of 50 games completed and in the pack there was just one more game to go: Brash Kangaroo. The game had featured in all of the early lists I had drawn up for GameDevDan vs Life, but there were a couple of problems. First, it was a fangame. I tried to completely rebrand it, but ultimately I couldn’t escape the feeling that I was using somebody else’s work in a commercial project.

brash_kangaroo
Some of the rebranded sprites from “Brash Kangaroo” - You can probably guess the game series on which it was originally based, but I’m not going to spell it out for you!

The second problem? The game really wasn’t that good. I’ll be the first to admit that’s true of several games in the pack, it is a journey from novice to professional after all. The difference with Brash Kangaroo is it would have been the last game in the pack. It should have felt like a cherry-on-top, not a chore. That’s when I decided to take the opportunity to do something a little more special. I would create something to bring together my whole career in a neat little package and include that as the 50th game.

Super Jam Land Kart Racing

The plan? Create a kart racing game featuring characters, locations and items from the other games in the pack. Like the Robo Red Panda from Last One Standing? You can drive his go kart. A huge fan of Antibody Blast? Why not chuck some squidgy fat cells out the back of your car. This would be the game to really sell the pack, to bring new life to all of my old creations.

SJLKR
Super Jam Land Kart Racing

Since the day I first opened GameMaker I have always wanted to create a kart racing game. Something about the vibrant graphics, the hectic gameplay, the energy, just makes this the best type of game out there. So I challenged myself to create one for GameDevDan vs Life, and I went all in. The game features 12 characters, 16 tracks, Grand Prix mode and Quick Race mode, all for up to 4 players.

Originally I considered making the game “locked” until the player had finished all of the other games in the pack, or making the characters and tracks “locked” until the player had completed the games in which they appeared. In the end I decided that was asking too much of the players and doing a great disservice to GameDevDan vs Life. Why shut away arguably the most exciting game in the entire pack?

I could write a whole book on the challenges I faced creating Super Jam Land Kart Racing, so I won’t go into more detail here, except to say that the game is finished and it’s probably my favourite thing in the whole pack.

Bringing it All Together

With the Launcher and all 50 games completed, all I had to do was prepare the pack for release. The game is now up on Steam, awaiting its release date of March 15th 2018, and I made sure I threw in a few achievements to make it worth the wait. I have folders and folders of GIFs ready to tweet (people seem to love those) and hundreds of press emails awaiting reply.

It’s only when I reached this point that I realised the scale of the project and its importance to me, emotionally. It signifies a break with the past, but also a celebration of it. This pack represents 10 years of my life, 50 of my proudest achievements, a journey from boy to man… and all of it made in GameMaker.

Written by Dan

Managing Director and mobile development whizz.