Projects

Hearts

Multiplayer card game

  • HTML
  • CSS
  • Bootstrap
  • JavaScript
  • Knockout
  • WebSockets
  • Python
  • Flask

An online multiplayer service that allows you to play the card game Hearts against strangers over the Internet.

If no-one is queuing, you can always cheat and open more tabs!

Cuboid

Classroom aid

  • HTML
  • CSS
  • Bootstrap
  • JavaScript
  • jQuery
  • WebGL
  • Three.js

This toy WebGL app shows a cuboid with labelled faces that the user can interact with, for use as a classroom aid. The faces are coloured and labelled according to their orientation on the cuboid and the edges are labelled with their lengths. The interface lets the user generate a cuboid of arbitrary dimensions.

Dots

Classroom aid

  • HTML
  • CSS
  • Bootstrap
  • JavaScript
  • jQuery

This is a very simple web page "game" written by request for use as a classroom aid. Two panes filled with dots are shown, and the goal is to correctly guess which pane has more and/or estimate how many dots are in each pane. The difficulty and number of dots can be adjusted to suit.

FMandel

Mandelbrot set renderer

  • F#
  • .NET

FMandel produces images of the Mandelbrot set similar to those found on Wikipedia. Features include continuous colouring of the set, anti-aliasing and Floyd-Steinberg dithering.

I've long been interested in fractals and was looking for a project that would allow me to try out another functional programming language — FMandel was the result of that endeavour. It also got me a few new desktop wallpapers!

Zombie Duck

JavaScript text adventure

  • HTML
  • CSS
  • JavaScript
  • AngularJS

Zombie Duck started as a silly in-joke after my colleague, Paul Ferguson, told us about the games he used to write for his calculator. One of these was a game where a "zombie duck" would chase you around the screen while you tried to avoid it for as long as possible. I decided to make a text adventure version as an opportunity to practice my JavaScript and check out AngularJS.

DarkRogue

Seven day roguelike in Clojure

  • Clojure
  • Java

In DarkRogue you control a ninja who is tasked with infiltrating an enemy dungeon and assassinating their leader. To get there you must stay out of sight of guards, stealthily attacking them from behind or using smoke bombs to obscure their vision.

DarkRogue was originally my entry into the 2014 Seven Day Roguelike Challenge held by the roguelike community. It was my first time writing a roguelike and, on top of this, my first real project in Clojure. Prior to this my only experience with the language, almost a year previous, was writing a half-functioning raytracer for university coursework. I eventually abandoned the raytracer and completed it in Java.

Unfortunately I found out that I had been a tad too ambitious and didn't manage to complete the game to my liking before the deadline. Still, it taught me a great deal and made me interested in using Clojure for more projects.

Mappy

Map editor for Total Annihilation

  • C#
  • .NET
  • Windows Forms

When I was younger I used to play a lot of Total Annihilation. I also used to make maps (under the name "Armoured Fish"), but I never particularly liked the tools. The official map editor was prone to crashing, and Annihilator, a fan-made editor, had bugs of its own. Since I write software now, I wanted to create a new map editor with a more modern feature-set and fewer bugs.

Creating a whole new map editor turned out to be a lot of work! Writing Mappy taught me a lot about architecting GUI applications and working with obscure binary file formats, but there are still more challenges to overcome to make Mappy the map editor I always wanted to have.

SnappyMap

Generate Total Annihilation terrains from a silhouette

  • C#
  • .NET

SnappyMap is a little command-line terrain generator that I created for fun over a weekend. It takes a black and white image as input and assembles a Total Annihilation map terrain from standard tilesets, using white as land and black as sea. The tilesets are labelled using an XML configuration file and SnappyMap comes with several predefined configurations for standard tilesets.

When making a map, placing the initial tiles can be a laborious task, particularly for larger maps. With SnappyMap, map makers can simply sketch the shape of the map in their favourite image editor, then use SnappyMap to automatically create the initial layout. They can then finish the map off using their choice of map editor.

CheckTdf

Syntax checker for Total Annihilation TDF files

  • C#
  • .NET

This command-line application checks Total Annihilation TDF data files for syntax errors and common mistakes, giving a description and line number for each problem found. It can also scan Total Annihilation archives (.hpi, .ufo, etc.), checking all TDF files inside.

The format itself is a fairly simple text-based key-value store. However, mistakes can easily creep in. Mod authors edit these files directly and the game itself provides little debugging information in the event of an error. More subtle problems in syntactically valid files can pass by silently any may go completely unnoticed. CheckTdf has helped mod authors by finding multiple such problems in the released versions of the most popular mods.

CheckTdf is powered by the TDF parser from my library, TAUtil. The parser itself uses recursive descent and was produced after I established a TDF grammar from examples used in the game.

TAUtil

Library for Total Annihilation file formats

  • C#
  • .NET

This is a C# library for reading and writing Total Annihilation file formats. It started off as part of Mappy, my new map editor, but has since grown enough to stand alone as a separate project.

The file formats for Total Annihilation were already largely documented by the community. However, some details were still not clearly understood, and, with the exception of the HPI archive format, no standard implementation existed for working with them. With TAUtil I hope to fill this gap (at least for .NET programmers) to allow the community to easily create applications that work with TA files.