Back to Top

As a child I used to draw new levels for Sonic The Hedgehog games on scrap paper. As an adult, not much has changed, except it's not Sonic anymore.
As well as working on full games, with the long-term view to turning a profit from them eventually, in this page I will also be detailing various games-related projects.


ARENA 2080

Play it here in-browser

  • ARENA 2080 was a game made with Benjamin Davis. He did the coding and I did the art and sound.
  • It was made in a week and a day, as part of the Games Prototype Challenge.
  • Quite a few features got cut because of the time constraint, but we ended up with a more focused game as a result.
  • It's an arena beat-em-up with a rock-paper-scissors colour-coded specials mechanic. It's difficult, but fun!


Prototype download: Windows Mac

2010 - ongoing
  • Cloudforest is going to be a short platforming game. You can't kill enemies, only stun them and run past.
  • It has mostly been my vehicle for learning about OpenGL 3, among other things - it's written in Python, sometimes a slow language, so uploading display work to the graphics card keeps things running fast.
  • As I haven't ben able to find satisfactory documentation on OpenGL 3 it has been a constant struggle, hence the long development time. However, I am intending to keep working on it.
  • I have also learnt that making your own level-creation tools is decidedly unfun, so the next step is to hook in something like Tiled instead.
  • Next steps also include a graphical overhaul, and adding threading.


Concept art

2008 - 2010
  • TurnShip was one of the first games I got fully involved with making, with two others (Benjamin Davis and Pete Lord-Murray).
  • I started off just doing graphics, and ended up working on the coding.
  • It was a steampunk isometric strategy game, where you controlled a fleet of airships (based on chess pieces) in battle.
  • The demo was purely online-multiplayer, but the full game was to have a single-player campaign, as shown in the concept art.
  • I learnt a lot about development from this, including the last 10% of development actually being more like 90%!

Coding Exercises


Porybot is a chatterbot written in python. He connects to IRC chatrooms, and can be taught to repeat various phrases.
If you see this in the bottom right of the layout: it means he is currently online, and can be chatted to here. You can also click on the icon to find out more about him.
Because of the amount of data he processes, he is run on my personal computer, and as such his info site can't always be reached. If he's online, click on his icon to see it.

Porybot uses threading to run multiple handlers and connections; he connects to IRC and the Pokengine MMO. These both share Factoids, his library of this=thats.
There is a Context, so that he understands who is who, and that users in both MMO and IRC can be the same person; and there is a (for now private) WebSockets-enabled in-browser console connection, which shows everything he is connected to.

He currently knows over 1500 facts, and has been spoken to more than 14000 times. Thanks to the information users have taught him, he has been described as a "maybe slightly braindamaged, maybe foreign, sort-of-troll". He's a way off his Turing Test certificate yet.


Pokengine is an in-browser recreation of the world in the Pokemon series of games, but as a WebSockets-enabled MMO. I don't have much to do with the main coding (other than helping debug) but I help out with tools now and then, as well as with art and music.

Data scraping

Pokemon have around 50 individual pieces of information associated with them, for things like height and weight, attack power and health, happiness and breeding. Given that there are over 650 pokemon, inputting this all into the Pokengine database would have been a lot of work.
Using Python, I wrote a program that went though pages on Bulbapedia, a pokemon wiki. It read the contents of the Edit pages, used Regex to sort out what information was useful, and then used curl to send the data to a receiver on Pokengine.
The script worked perfectly well, but I discovered afterwards that a different website, Veekun, actually had all the information in CSV files. Live and learn.

Image processing

Pokemon have in-battle sprite art at 80x80px. However, most pokemon are smaller than that, leading to a lot of whitespace around them. I wrote a script using ImageMagick, a free image manipulation library, that automatically trimmed off all whitespace.

Pokedex reading

Pokengine also includes fan-made pokemon; some of these were only available in this format, a fake screenshot of a "Pokedex" page from the Gameboy pokemon games, as shown.

Not all of these were formatted in exactly the same way, and there was no transparency to these images. In a similar vein to the whitespace processing above, I wrote a program that:
  • Separated the animated GIF into two frames.
  • Extracted the image of the pokemon.
  • Used a fill method to make the background transparent, trimmed it and saved it as a new image.
  • Extracted the footprint ont he top right, converting it to black on transparent, and saved it.
  • Tested the area around the first letter of each information field until the letter matched up with the font.
  • Read in the data starting from that point, using curl to send it to an online database.
  • Repeated for 300 of these images.
I find it very satisfying when a script can be run in a few minutes that saves hours of work.

Weather pattern simulation

Pokemon has strong themes of ecology and biodiversty running through it; as such, different pokemon will appear depending on the weather.
Rather than just defining weather on each map, I thought it would be more interesting to have overarching weather patterns. Using a random number generator seeded with the current date and time, along with some formulae involving sine waves to even things out, I made a rainfall simulator.
The date on the image is backwards (it's for the 2nd of january, 2013 at 1am). The map in red, yellow and green shows cities, forests and paths between them.
Because the random generator was seeded, weather forecasts were possible with very little processing time, and with the sine formula, weather moved across the map in waves.
I am planning a more involved version of this that takes elevation into account, along with defined areas where it should always be dry or wet.

RMXP Importer

RMXP stands for RPG Maker XP - a program that allows you to make RPG games with little-to-no coding involved. It is used by a lot of people making pokemon fangames.
Due to increased interest in Pokengine, some creators were interested in moving their games from RMXP. I have been making a convertor.
  • I managed to decode the binary-encoded format used by RMXP - it turned out to be Ruby's Marshal.
  • I learnt just enough ruby to import the files and export them as the slightly more readable YAML (unfortunately my preference, JSON, was not compatible...)
  • Then, moving on to python, the YAML files are read and data extracted. Not all data is able to be moved, but I have been able to map the environments, solid objects and NPC characters to their Pokengine equivalents.

3D Modelling

My most significant adventure in 3D modelling to date was the recreation of a Magikarp:

I found the closest official images I could to side-on and front-on, and adjusted them for perspective to make myself a guide.
I then began putting things together with vertex points and polygons, using Blender.
I modelled one side entirely and then mirrored it along the Z axis.
Complete render with UV mapped texture.

I also did some rigging and animating, but unfortunately the video capture turned it all red.