An almost complete history of everything I've ever done. Includes
software I've built, talks I've given and events I've helped run.
If a project was never released, the date is roughly when it
In 2023, I was working on Unreal Engine plugins at my own company Redpoint Games.
I delivered a talk covering all of the free and open source tools I've built at Redpoint to automate Unreal Engine, including parallelising builds, running automation tests and so forth.
This talk is structured as an iterative journey, so you can adopt as few or as many of the tools in the presentation as you like, and you'll get benefits along the way.
This talk was not recorded, but you can download the slides as a PDF.
Quick links to the tools mentioned in this presentation are provided below:
- Unreal Engine Scripts: https://src.redpoint.games/redpointgames/unreal-engine-scripts
- GitLab: https://about.gitlab.com/install/#ubuntu
- Io Build Monitor: https://src.redpoint.games/redpointgames/io-build-monitor
- UEFS: https://src.redpoint.games/redpointgames/uefs
- RKM: https://src.redpoint.games/redpointgames/rkm
I built a tool to provision and run Kubernetes clusters across Linux and Windows nodes in a super simple way.
RKM was developed because I tried to set up RKE2 on my build servers, with the intent of running Unreal Engine build jobs in Kubernetes, but it didn't work and the uninstallation process trashed the build servers to the point that I had to reinstall Windows. I designed RKM so that it would keep all of the Kubernetes configuration, assets, storage, etc. under a unique installation directory (
C:\RKM on Windows,
/opt/rkm on Linux). That way I could easily just throw away the Kubernetes install by deleting a folder and let it re-provision the whole thing. By having a single executable start and manage all of the Kubernetes components, it also meant that RKM didn't have to install services system-wide other than itself.
I also did some experimental work on getting Kubernetes to run entirely on Windows, using WSL to run the Linux bits. Unfortunately Windows services can't use WSL so this got blocked on upstream WSL bugs.
As of writing, RKM is used to run UEFS on all the build servers and keep all of the installed software up-to-date, though I don't run build jobs in Kubernetes yet.
I was the lead organiser for Melbourne Global Game Jam 2023, and it was the first one back in-person since the start of the pandemic.I spent all of the jam coordinating with other organisers and volunteers to keep the event running and fixing bugs in the JamCast streaming software, so I did not create a GGJ game in 2023.
In 2022, I was working on Unreal Engine plugins at my own company Redpoint Games.
I delivered an all-day workshop that is designed to give developers the skills they need to write Unreal Engine C++ code. It covers everything from memory management through to exposing custom functionality in blueprints. The course is designed to be accessible even to developers who have not previously written C++ before and are coming from a C# background.
The full workshop is available to watch on YouTube. You can also find it on the Epic Games Learning Portal.
Links to individual sessions, slides and speaker notes are available below. Only the first three sessions have slides prepared; the remainder just have speaker topic prompts which I used to guide the workshop session with feedback from the audience.
- Translation units & the preprocessor: Video, Slides, with Speaker Notes
- C++ memory model: Video, Slides, with Speaker Notes
- Pointers, references, VFT and constness: Video, Slides, with Speaker Notes
- Everything to do with text: Video, Speaker Topic Prompts
- Shared pointers and memory lifetime: Video, Speaker Topic Prompts
- Unreal Engine containers, including maps and arrays: Video, Speaker Topic Prompts
- UObjects and garbage collection: Video, Speaker Topic Prompts
- Delegates and callbacks: Video, Speaker Topic Prompts
- Writing blueprint nodes and subsystems in C++: Video, Speaker Topic Prompts
- The grab bag of useful things: Video, Speaker Topic Prompts
- UnrealBuildTool modules and linking third-party code: Video, Speaker Topic Prompts
I built a build monitor to better visualise complex pipelines on GitLab. Works with the Unreal Engine Scripts to send automation test results in real-time to the dashboard.
I delivered a talk which goes in-depth about how the algorithm in our Matchmaking plugin works, so that other developers can implement it in languages and engines outside of Unreal Engine. The matchmaking algorithm we employ leverages the free lobby APIs available on EOS and Steam, so it's a cost-effective and scalable solution for independent game developers.This talk is currently in the GCAP Vault and not available for public viewing. It will most likely be released on the GCAP YouTube channel prior to GCAP 2023.
Package and use self-contained Unreal Engine installs on Windows, macOS, Docker and Kubernetes.
I started work on UEFS because I wanted to explore solving the "large container image" problem that Unreal Engine containers had - where the Docker images you'd need to run were so massive that it would take hours for a container to get scheduled on a node.
It turns out packaging up Unreal Engine installations and pulling them from registries was useful for more than just Docker, and the main use case then ended up being using it to sync Unreal Engine installs across all of the Windows and macOS build servers. Now instead of having to use Syncthing to keep Unreal Engine installs up-to-date on each machine, the build jobs could just choose to mount whatever Unreal Engine version they wanted to use, and it would just be fetched on demand.
Even more features then naturally arose out of this architecture that resulted in further benefits and increased build performance, such as:
- Virtualising the storage that the package VHDs are served from using WinFSP, so that Unreal Engine could be mounted instantly without waiting for the whole thing to download. UEFS will then fetch the 128kb blocks from the network as they're accessed for the first time.
- Being able to mount the same Unreal Engine install at multiple paths on the system completely eliminated the global mutex that Unreal Engine uses to reserve the engine directory, allowing multiple Unreal Engine build jobs with the same Unreal Engine version to run on the same build server at once.
As of February 2023, there's experimental support for UEFS packages to be mounted as volumes in Kubernetes clusters.
I was one of the organisers for Melbourne Global Game Jam 2022. Although we had hoped to host it in person, we ended up hosting it online due to the spread of the COVID-19 Omicron variant in Australia.I spent most of the jam coordinating with other organisers, keeping the event running and maintaining the JamCast stream, so I did not create a GGJ game in 2022.
In 2021, I was working on Unreal Engine plugins at my own company Redpoint Games. I didn't release more than a few things this year, but I did work on a lot of major features to EOS Online Subsystem, including support for all console platforms.
Developing and selling tools for other game developers to use is a very different market than the consumer market for games. From marketing to providing support, you need a different set of skills to acquire, engage and retain customers.Whether you're game developer looking to get into the middleware space, or an existing middleware developer, this talk will have something for you. I'll be covering how to develop and publish plugins on the Unreal Engine Marketplace, pricing your products, the impacts of running sales and a deep dive on how to ensure you provide a great support experience for your customers.
If you're an Unreal Engine developer with CI/CD setup, you're probably using BuildCookRun to package your game for all the platforms you're targeting. BuildCookRun is inherently slow, because it performs all of its steps sequentially on a single machine.Learn how to drastically reduce your Unreal Engine build times by using BuildGraph instead. In this talk I'll not only cover how to write BuildGraph scripts tailored to your project, but also how to integrate BuildGraph with your CI/CD server to distribute build steps across all of the build machines you have available.
A Momentary Meeting is about exploring an ever-changing world, and the fleeting interactions you have with other people along the way. A multiplayer text adventure where the links between "rooms" changes over time and occasionally you'll meet someone else in the same space. Your meeting is short lived however, as the ever changing world pulls you apart and thrusts you back somewhere nearby.This was made at Global Game Jam 2021, with Chris Chua, Samuel Fawcett, Katelyn Gigante, Max Kearney and myself. The idea was a multiplayer narrative text adventure where you incidentally meet random strangers. I actually spent most my time doing the narrative and writing for this game, rather than the programming. I actually found it quite enjoyable to just write out descriptive scenes for the game.
In 2020, I started working on Unreal Engine plugins at my own company Redpoint Games. Distinct from Redpoint Games prior to 2019, this incarnation is just myself as a sole trader.
Provides blueprint nodes, peer-to-peer networking and an online subsystem.I retired this product in July 2021 due to Discord moving away from servicing games, and most of the relevant features such as presence were merged into the EOS Online Subsystem plugin.
I wrote this tool to migrate documents in from one Google Drive account to another. At the time I was using the legacy version of Google Workspace, and wanted to migrate all of the documents stored in Google Drive to a personal Google account, in case Google ever shutdown the legacy version of Workspace.Unfortunately you can't just change ownership of documents in a Workspace account to personal account, so this tool effectively does the "Make a Copy" operation, mirrors the sharing information, and then deletes the old copy from the Workspace account.
I was one of the technical organisers for Melbourne Global Game Jam 2020. It was hosted at JMC Academy in late January, a few weeks before the COVID-19 pandemic started.I was still working at Network Next at the time, and if I remember correctly, spent most of the jam doing work instead of actually participating in the game jam.
In 2019, I working at Network Next. Of note, this is the only year that I did not attend Global Game Jam in Melbourne as I was in the United States at the time.
Note: This talk was given at GCAP 2019, which I attended on behalf of Network Next. There's a short section starting at 39:00 relating to the use of Network Next which may not reflect my current views on the topic.Multiplayer games are huge and have great potential for long term retention of players, and that leads to ongoing revenue for a studio, but to achieve this, you need to make sure your multiplayer experience is excellent. You won't get that just throwing whatever library you can find on the asset store and hoping for the best. This talk will teach you how to implement multiplayer from the ground up, allowing you to make sure your online player experience is the best it can be.
At Network Next we needed a way to dynamically manage configuration for all the microservices we had and ensure that configuration is kept up-to-date in all of them in near real-time.
configstore takes a schema defined in JSON and then:
- Provides a web administration panel where you can create entities and modify their settings.
- Stores and retrieves data in Google Cloud Firestore. configstore itself is entirely stateless, making it trivial to run in a highly available setup.
- Auto-generates a Go library for you that uses gRPC to watch for configuration changes via the configstore service. The generated Go library provides strongly typed Go objects and keeps everything up-to-date in the microservice.
Working out of Santa Monica, California, I was a full stack engineer at Network Next. Our focus was building a platform that could more optimally route game network traffic over the Internet based on latency, jitter and packet loss.
My work at Network Next involved:
- Developing backend services in Go.
- Developing the front-end portal in React and TypeScript, most of which is still in use as of Sep 2022.
- Implementing and maintaining the Unreal Engine integration for the Network Next SDK.
- Managing the build and deployment process to deploy the platform into Kubernetes on Google Cloud.
- Maintaining the development environment through Skaffold and related tools.
- Ordering, evaluating and managing the relay machines that network traffic was routed over, in locations all around the world.
8 Years of Game Development
This period covers my time at university through to when we wrapped up Redpoint Games (the company). For almost all of this time I worked with Josh Harvey on game prototypes and plans on how to do game development sustainably. By the end of it we almost knew what we were doing, but we didn't have any money left and pursued our own careers in 2019.
In 2018, I was working with Josh and Liam on games at Redpoint Games. At this time Redpoint Games was a company with all three of us as directors. When Redpoint Games reformed in 2020, it was as a sole trader under myself only.
This was the last year we pursued game development as a team. We were unsuccessful in obtaining funding for "Minute of Mayhem" from the local funding body Film Victoria, and we no longer had the financial runway to continue through to the next potential funding round.
react-injectable is a library that makes it easier to dependency inject React contexts into components, while ensuring the TypeScript hinting is correct when using the wrapped components.This library was used heavily in the web frontend for HiveMP (see below), where developers could manage their projects.
At least in 2018, you could not automatically license installations of Unity with Personal licenses. The only way to license a machine was to go through the first-run wizard interactively.
At the time I wrote this, I was doing builds in the cloud which meant that Unity itself needed to be installed on-demand. This project emulated the first-run wizard's calls to the API to obtain a license for Unity and install it on the machine.I don't remember what I was actually running Unity for though; the last game I wrote using Unity would have been in 2015, so I suspect this might have been related to some kind of Unity SDK for HiveMP.
Minute of Mayhem started as a prototype I developed in my last year of university in 2015. The game was initially called Sixty Seconds. The initial prototype was developed in Unity and presented at PAX Australia 2015 (through Swinburne University) and GX Australia (under Redpoint) in 2016. A trailer for the initial prototype when it was shown at PAX Australia is shown below:
Following on from the prototype, we renamed it to Minute of Mayhem and started developing it from scratch in MonoGame using our own Protogame framework. I wrote a lot of features into Protogame throughout Minute of Mayhem's development in 2017 and 2018. A full feature list up until the retirement of the Protogame framework can be found on the GitHub page for Protogame, but it includes things like a full deferred shading pipeline, network replication and hot reloading to name a few.
In 2017 we used Unreal Engine 4 for the first time, and were able to rebuild our work on Minute of Mayhem to date within two weeks. We switched away from Protogame to Unreal Engine and continued development in Unreal Engine until Minute of Mayhem was cancelled in 2018.After it's cancellation, we each pursued our own careers. Notably, this led to me starting work for Network Next as a contractor in the latter half of 2018 and as a full-time employee in early 2019.
Dynamically instantiate sublevels in multiplayer games. Great for procedurally generated worlds!I developed this plugin as part of Minute of Mayhem development, and it was the first plugin I released on the Unreal Engine Marketplace.
gcloudpipeline step for Jenkins that loaded service account credentials in a temporary environment for build jobs. Instead of having to configure gcloud on the build agents manually, it lets you store and load account service account credentials in Jenkins instead.
I was one of the technical organisers for Melbourne Global Game Jam 2018. It was hosted at the Academy of Interactive Entertainment (AIE). At this jam I spent most of the time rewriting JamCast from scratch, so I don't have a GGJ game for this year.
In 2017, I was working with Josh and Liam on games at Redpoint Games. We released Dimension Jump on Steam, and spent most of the year developing on Minute of Mayhem.
I worked with Josh and Matt Kelly on an unreleased internal prototype called The Last City. It was a city builder where you also had to defend your city against giant monsters. Matt lead the design work and Josh and Matt worked together to implement systems and gameplay. I mostly worked on implementing the city simulation in C++.We prototyped this as a week-long game jam out of The Arcade.
I helped organise and run TIGJam Australia 2017 with Chad Toprak and Andrew Brophy. This was the fourth time the game jam ran and it took place at The Arcade co-working space on Kings Way.
The game I made at this game jam was extremely low quality, so much that I'm not even linking a screenshot of it. You can find a screenshot on the TIGJam Australia website if you really want to view it.
Despite several attempts to run TIGJam Australia again, this was the last time the event was run.The Arcade co-working space permanently closed in 2022.
HiveMP was a SaaS platform for game developers.
I initially developed it to support our own games, and by the time it shutdown in 2019 it had support for:
- Event Tracking: Track and report on custom events in your game.
- Integration: Capture reported Steam data, including wishlist actions, sales data and simultaneous players to enable a better reporting experience.
- Reporting: A flexible reporting solution to help you understand your data.
- Licensing: Manage distribution of digital license keys to players and press. Configure expiring license keys to reduce key reseller fraud.
- Revenue Share: Save time and lower costs by using HiveMP's revenue share system. Configure rulesets, enter invoices and payments, and HiveMP will automatically calculate the amounts for revenue share distribution.
- Chat: Cross-platform chat system for one-to-one messages.
- Game Servers: Provision dedicated game servers on-demand.
- Lobbies: Group players together prior to joining servers or starting peer-to-peer games.
- Presence: Real-time online / offline status for players.
- Sessions: Authenticate players on a global account system.
- UGC Cache: Reduce user content download time with UGC caching. Serve user content from edge nodes around the world.
- Scheduling: Schedule HTTPS callbacks at points in the future, and HiveMP will automatically call them for you.
- Search: Fast autocomplete and search indexing for text content.
- NAT Punchthrough: Directly connect players over the Internet for peer-to-peer or player hosted games.
- netcode.io Auth: Authenticate connections to dedicated game servers, preventing denial-of-service and traffic interception.
Of course, almost all of the services it provided are now better served by platforms like EOS, but in 2017 cross-platform gameplay was still difficult for independent developers to do at low cost.Perhaps the most interesting aspect of HiveMP was the revenue share and Steam financial data importing systems. We used this at Redpoint to automatically import the data from the Steam financial data portal so we could run analytics on it and compare against our other analytics sources, such as Google Analytics.
"Dimension Jump is a precision puzzle platformer, where you don't just jump between platforms, you jump between dimensions!"
We released Dimension Jump in March 2017 to positive reviews. We ran a few community streams and had it in a few bundles, and it made around $2000 AUD over it's lifetime.
In 2016 it was not possible to launch games on Steam without first going through Steam Greenlight. We wanted to start using the Steamworks APIs in Minute of Mayhem, but since we weren't approved for Steam we had no access to the backend. To this end, we decided to take the original Dimension Jump game that I'd released years ago, overhaul it and publish it on Steam through Steam Greenlight.
By the time we published Dimension Jump, Steam Greenlight was on the way out, but it gave us a ton of experience in actually shipping a game to consumers on Steam.
The original Dimension Jump was written in Game Maker 7, and we upgraded it to Game Maker Studio 1.4 in the version we released on Steam. However, Game Maker Studio 1.x ceased development and with no cost-effective upgrade path it became impractical to ship updates for the game.In 2019 we made Dimension Jump free with a requirement to join our Discord server. The game wasn't generating revenue at this point, so we decided to use this as a way to build our Discord community. Unfortunately, we didn't take into account that players who got the game for free could leave negative reviews on the store page and we delisted the game from Steam in 2021.
GameTest is a framework for automated end-to-end testing of games. It is intended to take an almost blank slate VM, and simulate a user installing a game through Steam, verifying that the game installs and launches correctly. After that, you can specify custom test scripts to test other behaviour inside your game.I wrote GameTest so we could automatically test Dimension Jump and catch any missing dependencies that needed to be installed with the game via the Steam install scripts.
"Super Ball Brawlers is a 4 player competitive party game where players compete to be the last ball rolling! Roll around and try to knock off the competition! But watch out, all players can control the platform you're rolling on!"
EventHost (previously known as JamHost) is an event hosting platform. Unlike Eventbrite, it basically lets you set up a whole website for your event with multiple pages, which is great for more complex events like Melbourne Global Game Jam.
The very first iteration of it was built for the 2015 game jam. At this time, it was basically a fancy website with a login system so jammers could access information. It wasn't called JamHost at this point and it didn't handle ticket registration or payments.
For the 2016 jam, I added support for it to accept payments and handle registrations directly rather than being imported from Eventbrite. I don't know specifically when I added on-site registration, but I suspect it was for the 2016 jam.
For the 2017 jam, Luis Van Slageren and I ported it from the old PHP framework it was running on to C# and ASP.NET Core, and made it generic enough that any in-person game jam could use it. Thus it was given the name JamHost and provided as a public service:
Over the years JamHost kept getting improvements as we hosted more Melbourne Global Game Jam events, and kept getting updated as JamCast evolved to work with JamHost.
For the 2023 game jam, JamHost was renamed to EventHost because the platform is now generic enough to host many kinds of events and not just game jams:
I wrote a collection of Google Apps Scripts to pull analytics and finance data from the Steam partner portal automatically. We used this for Dimension Jump to pull wishlisting data from Steam into Google Sheets where we could then compare it with e.g. Google Analytics data.This was replaced with the HiveMP Analytics product, but HiveMP was later shut down in 2019.
In 2016, I was working with Josh and Liam on games at Redpoint Games. We were working on Minute of Mayhem. This was also the last year that I worked at PageUp People before I pursued game development full-time at Redpoint Games.
micro-pubsub is a lightweight Pub/Sub service. It's designed to be a replacement for Google Cloud Pub/Sub in environments where you are willing to trade scalability for no cost, such as development environments.
Despite the name, there isn't actually any gameplay here. This was just a weird experiment to try building some sort of AR game that recognised the board space from the captured video stream.
Quoting the Global Game Jam page: "Some weird thing where you point a camera at a table and it detects all the red in the picture to find space for a board game. I don't know, I just wanted to play around with AR. It's recommended you use DroidCam to connect your phone webcam to the Windows app."
This was a solo project made at Global Game Jam 2016. The only photo available is this low resolution featured image from the Global Game Jam page:
In 2015, I finished my final year of university. I don't believe I was working at PageUp People during this year, though if I was it was only part-time. This was also the year I realised I was trans, which made this year a lot rougher than most.
This talk covered how to implement dependency injection in Unity games. Unfortunately the talks at UNITE 2015 weren't recorded (or at least, they're not online any more). However, the slides and source code are still available:
A variety of generic level tools for Unity, released under an MIT license. Includes:
- Editable pathing systems, with components for following paths built in a scene.
- Snap to Grid components.
- Automatic texture tiling.
- Proximity sensor detection for triggering other game objects.
A board game that I developed with Josh Harvey at TIGJam Australia 2015. The idea is a cooperative/competitive board game where the rules perversely incentivise players to create the most impractical, badly designed cities. This photo was taken by either Chad Toprak or Harrison Smith.
We then did more playtesting and development until 2016. Below is a photo from playtesting session in January 2016.After several rounds of playtesting, I think we decided to cancel the project as we couldn't figure out a set of rules that felt good and made sense.
I helped organise and run TIGJam Australia 2015 with Chad Toprak and Andrew Brophy. This was the third time the game jam ran and the final time it was hosted at Inspire9.
Photos of the event taken by Chad Toprak and Harrison Smith can be found on Facebook. Here's one below just in case the Facebook archive goes offline:
Omni was a shell (like Bash) written in PHP. This was as great of an idea as it sounds, and I had to write a PHP module in C++ to provide access to native terminal APIs that weren't available in PHP.At the time this was written, PowerShell was not available for Linux or macOS, so this was an attempt to bring some of the ideas of PowerShell over to Linux.
The Global Game Jam page for this game isn't particularly descriptive, and there doesn't seem to be any gameplay when I'm running the game (in 2022). From the looks of things, it seems to mostly be an experiment in writing game AI.This was a solo project made at Global Game Jam 2015.
This was the first big game project I worked on, and I developed it with Josh Harvey and later Joshua Bradbury. Development started as an experimental project at TIGJam Australia 2012. Because I was arguably still new to game development and had no idea of scope or planning, this was a multiplayer procedurally generated RPG.
There were a lot of mistakes made during the development of this project, and it was eventually cancelled in 2015 after failing to receive any meaningful feedback through the IndieCade judging process.
I wrote a reflection piece on the project in early 2015 that gives more of the history and background of the project, though I haven't read it in a long time so there might be statements in there I no longer stand by.
Of note, this is the project that I first learnt how to write multiplayer / game networking code for, which would be important later on in my career.
Here is the last real video that we made of the game, when it was still in pre-alpha:
Here is an extremely early screenshot of the game back when it was called Tychaia (probably not too soon after TIGJam Australia 2012):
In 2014, I was employed at PageUp People in a developer-operations role. I did try doing university part-time at the start of this year, but with employment as well it was too much and I deferred the rest of my final year university subjects to 2015.
Mir was intended to be an open source re-implementation of Mojang's space exploration game that used the DCPU-16, but I stopped working on it after about a month.
I managed to implement the ship editor, room editor and DCPU-16 emulation (using a third-party library), which you can see below:
A neat little game where each player has a slightly different game map, and you have to work together to solve puzzles. The philosophical viewpoint in this game didn't age particularly well though.This was made at Global Game Jam 2014 with Olek Kalinowski and myself.
In 2013, I did my industry placement at PageUp People. Industry placement was a program in my university course at Swinburne where you would be employed at a software development company for a year of your degree.
This was a little online tool that I wrote for a sci-fi table top role playing game that a few friends and I were running. Players could write journal entries between sessions and planets and various locations could be tracked.
The long term idea was that multiple groups of players could be using the same online system for their sessions, and build off the lore that other groups have written.
I helped organise and run TIGJam Australia 2013 with Chad Toprak and Andrew Brophy. This was the second time the game jam ran and it was hosted at Inspire9.I haven't been able to find a photo archive of this event unfortunately.
cstools was a collection of C# related tooling, designed to integrate with Phabricator. We were using Phabricator at the time to store source code and merge pull requests.It included a linter based on StyleCop and a code coverage tool that would instrument assemblies.
From 2013 to 2015, I contributed to the open source Phabricator project. Phabricator was a collection of web applications for software development. I stopped contributing around 2015 because upstream was no longer receptive to code contributions from external developers, and in 2021 Phabricator ceased to be maintained.
In addition to the myriad of bug fixes I made, I also had a hand in some of the major features of Phabricator, including the build system Harbormaster. Here are some of the notable changes:
- Making Phrequent, the time tracking system, more usable by adding
arc stopcommands to the Arcanist CLI.
- Implementing the core of Harbormaster, the CI build system inside Phabricator and getting it to actually function as a build system. This included running commands remotely over SSH, streaming build logs, and so on.
- Implementing core parts of Drydock, the resource allocation system inside Phabricator. Drydock was used to reserve machines for Harbormaster builds and check out working directories.
- Adding support for C# tooling like unit test execution and linting to Arcanist, so that these checks could run when developers submitted their C# code for code review.
- Building Phragment, which was a hierarchical versioned artifact storage system. We used this to serve game binaries and patches for Unearth builds through the game launcher we'd written.
- Adding early Windows support to Harbormaster and Drydock using WinRM (PowerShell remoting).
Many of my later changes, such as support for Drydock allocating KVM virtual machines, never got merged because the upstream developers stopped accepting external contributions.
As part of employment at PageUp People, I also developed an internal tool called Pipeline that ran inside the PageUp Phabricator instance. This was unfortunately never open sourced or upstreamed, but it was effectively a Phabricator equivalent for Spinnaker and we used it to manage the extremely complex deployment process that could not be encapsulated entirely within Harbormaster build plans.
In 2012, I was undertaking the second year of my university degree at Swinburne University.
This is a set of open source scripts that you would install onto a Linux box that had two Ethernet ports. It would bridge traffic between the networks and throttle or filter traffic based on the computer name and the QuotaTracker configuration. It could also be used to enable "transparent Tor", which would upgrade all traffic from a given machine to be routed over Tor instead.Most consumer routers have quota tracking features these days, but when this was written it wasn't a broadly available feature.
The very first TIGJam Australia that ran! I helped organise this with Andrew Brophy and we hosted it at Inspire9.
Back in 2012, Melbourne Global Game Jam still had a "competitive" feel to it, so the goal of this event was to run something that was super relaxed and no pressure.The photo album for this event was shared on Google+, which Google shutdown in 2018 and thus the photo album is no longer available.
As part of my university course, we had to do a video project. Our group chose to do a documentary on a local hosting of the 23rd Ludum Dare game jam in Melbourne. Includes interviews with Jason Bakker, Davey Wreden, Andrew Brophy and Harry Lee 尚倫.
In early 2012, Mojang announced the development of a space exploration game where ships could be run programs on a virtual CPU, called the DCPU-16. This open source project implemented a toolchain that targeted the CPU architecture, with the intent that tools would be able to run inside the game itself on the CPU. This constraint meant that a lot of existing projects such as LLVM were not suitable for this task, so this was a "ground up" implementation of a toolchain.
I couldn't find many screenshots of this project, but I did find an old tutorial video on YouTube which shows a little bit of what development looked like.
I started the project, but many community members came onboard after only a month. I did a significant amount of the initial development on tools, with other community members improving what I'd written:
- The initial C compiler which was written in C
- This implementation was later replaced with an implementation by another community member, written in C++
- Kernel ABIs and support for those ABIs in the assembler and linker
- Standard C library APIs
I think the most interesting part of this project was implementing the linker; it gave me a hands on experience on how linkers really work for normal architectures, and why they are not able to produce useful error messages in a lot of cases.
This project was effectively abandoned when Mojang cancelled the development of the game that it was being written for. I later worked on an open source game called Mir which used the DCPU-16, but was cancelled after a month of development.
When I was writing the code for Old Man Baby at the "What Would Molyduex?" game jam, I ended up building useful primitives on top of XNA. This code would end up forming the initial version of Protogame, which would later move to MonoGame as XNA was retired.
It would go on to be used in no small number of projects that I developed, including Unearth (Tychaia), Minute of Mayhem and a decent chunk of the game jam games I worked on between 2012 and 2017.
By the time most of my development work moved to Unreal Engine, Protogame had an impressive feature set for an open source game engine. A full feature list is available on the can be found on the GitHub page for Protogame. To give you an idea, it supported 2D & 3D games, deferred lighting, components and transform hierarchy, physics, networking with replication and a UI system.
Towards the latter part of it's lifecycle, I started working on editors, including an experimental integration into MonoDevelop, but the editors never reached full maturity before development of Protogame ceased:
Protogame also spawned a number of other open source projects, including Prototest, Protoinject and Protobuild, the latter of which was adopted upstream by MonoGame before it was eventually retired in 2020.
I stopped development on Protogame when we moved our projects to Unreal Engine.
I worked with Andrew Brophy on a game called "Old Man Baby" at the "What Would Molyduex?" game jam that Harry Lee 尚倫 ran in 2012. The original that I wrote the code for is lost to time, but Andrew Brophy later did a Flash remake of "Old Man Baby" on Kongregate and from memory it's pretty close to the original:
ModBridge was a project to bring forward compatibility to Minecraft mods, and to allow developers to write mods in C# against a standardized API. Mods could also be sandboxed using the C# sandboxing features, allowing mods to be automatically installed from game servers.
It also solved problems with ID conflicts and meant that developers didn't need to decompile Minecraft in order to write mods.
The Minecraft Forum (Archived Page) post includes more historical information about it's development.
I stopped working on this when my focus shifted to the DCPU-16 Toolchain.
I was one of the technical organisers for Melbourne Global Game Jam 2011. I'm fairly confident this jam was hosted at La Trobe University on the Bundoora Campus.I don't think I have a game for this year; I'm pretty sure I would have just been improving JamCast.
In 2011, I was undertaking the first year of my university degree at Swinburne University.
A game project that I developed at university with other students, One Must Die was a first-person shooter where you have to vote off one team member each round. That team member would become the boss antagonist on the next round you play. It was developed in UDK over the course of one semester.
There is also a YouTube video of the gameplay, though it's not edited at all and has the framerate quality you'd expect from desktop recording in 2011.
I made a TF2 map called
koth_pylon. It's King of the Hill game mode with some pylons, and this was my first (and potentially only) time that I used the Source engine's Hammer tool to build a level. You can download it here, and it still works in 2023 if you save it to
steamapps\common\Team Fortress 2\tf\maps and run
map koth_pylon in the developer console.
Clicking on the images below will take you to the full-sized version of the screenshot.
This was a Chrome browser extension that would notify you when new episodes were available on iView, by polling the RSS feed that ABC made available.
It was abandoned a few years later when ABC removed the RSS feed. The Chrome extension page was removed by Google at some point, but you can see a screenshot of what it looked like below.
In 2011, Valve ran an ARG (alternate reality game) for the launch of Portal 2. At the end of the ARG there was a countdown to the Portal 2 launch that could be sped up by having people run certain Steam games.
Coordinating what games everyone should be running on their machines was tedious, and worse, if people continued running a game that had already reached "Computations Complete", then that would lead to wastage as they could be running an "incomplete" game.
I wrote a little .NET desktop client that would check a central server to see what games were still pending, and then it would automatically launch and run those games on the local Steam client based on what the user owned. You could basically just leave it running and it would automatically flick to new games as needed.
A capture from the Wayback Machine on April 18th 2011 shows the countdown:
In the end the ARG only led to the game releasing less than 24 hours early, which I think the community was pretty disappointed with given how much effort had gone into solving the ARG.
A collaborative effort between myself and members of the local game development community, this is a local arcade cabinet featuring locally made and international independent video games. My dad and I did the hardware construction and assembly, while other community members did the artwork and developed the local games.
- Kert Gartner - Attract Screen
- James Filippone - Side Artwork
- June and Peter Rhodes - Construction
- John Sietsma - Financial Donations
- Academy of Interactive Entertainment (AIE) - Original PC
- Guy Blomberg (Mana Bar Melbourne) - Hosting
Winnitron AU features Australian exclusive local games that can't be played anywhere else, including:
- Apple Shampoo by Initials Command
- Cowboy Killa by Andrew Brophy and Greg Lobanov
- Culmination by Daniel Sun
- Forget-Me-Not by Brandon Williamson
- Robot Sharks from Outer Space by Luca Pavone and Sherwin Browne
- Space Twins Turbo by Twisted Shield Interactive (Benn Lockyer, Nina Nikolic and Ben Rejmer)
- Super Retro Bros by Kiera Lord
- Ultra Happy Death Virus HD by Luke Hus, Sandra Gibson, Matthew Elvey-Price and Patrick Clearwater
We built the cabinet out of MDF over the span of several weeks. Additional photos available here: 1 4
It was launched at the March 2011 IGDA Melbourne meetup, and later playable at the Freeplay 2011 festival.
After it's launch, the cabinet was then available to play at the Mana Bar Melbourne until it closed in 2015. Prior to the Mana Bar closing, Craig Peebles did additional work to install extra ventaliation fans to prevent overheating, and by the time that work was complete the Mana Bar had shutdown.
The cabinet ran on the original Winnitron platform, being in the first dozen machines that were built around the world. After the Mana Bar closed, the original Winnitron service at winnitron.ca shutdown, and so the machine wasn't playable until the new Winnitron platform was up and running (now at winnitron.com).
Despite my best efforts, this is the only photo I could find of the Winnitron AU at the Mana Bar. All of the other links I could find in the Wayback Machine are dead, either because the Mana Bar itself shutdown and removed the relevant photos, or the media outlets that covered it no longer have the articles up. The Wayback Machine unfortunately doesn't capture a lot of images, so this low resolution thumbnail is all that we have.
The cabinet was then stored in The Arcade Melbourne (1.0 on City Rd), before being moved as part of the relocation of The Arcade to Kings Way (2.0). It was briefly playable in the latter half of 2021, before being put into storage again with the permanent closure of The Arcade.
I would like to find a new home for the Winnitron AU where it can be played by the public. If you have suggestions, please send me a message on Mastodon.
The first version of JamCast was developed in 2010 during the first Melbourne Global Game Jam (see below). With game developers all in separate rooms, I wrote a version that captured bitmap images from developer desktops and sent them to the projectors in every room - the idea being to give people visibility on what other people were making throughout the jam. Keep in mind that in January 2010, Open Broadcaster Software hadn't even been released, let alone in wide use.
At each Global Game Jam, it developed more features including Slack integration and pulling tweets from Twitter off a hashtag. I also had to adapt it to the unique networking setup of each event over the years, as Melbourne Global Game Jam has been hosted at La Trobe, Swinburne, AIE, JMC Academy and online during the COVID-19 pandemic.
Although there are a few open source iterations of JamCast floating around on the Internet, it is now stored in the same private Git repository as JamHost, since it is now tightly coupled to that online event platform. Hence this entry doesn't link to any of the open source implementations as they're all significantly out-of-date.JamCast now uses Open Broadcaster Software under the hood and relays video streams via NGINX RTMP.
The very first Melbourne Global Game Jam. I attended this and ended up helping with the technical stuff, which is how I ended up being one of the technical organisers for the event for over a decade. This is also where I wrote the very first version of JamCast for streaming people's desktops (though it was basically just screenshots as BMP images over UDP at this point). This jam was hosted at the La Trobe University Bundoora Campus.Apparently there is a 2010 jam listed on this page of jam sites, but it wasn't run by the IGDA Melbourne crew as far as I can tell.
Dimension Jump (the one released on Steam) was actually a remaster of an earlier freeware game I'd made and released on GameJolt. It was the first game I'd made after being stuck for a few years feeling like any idea I came up with would be derivative. It was only after talking with another member of the Game Maker Community that had made a relatively popular game and having them point out that most of their own game ideas are derivative in some form and that games evolve beyond their initial idea that I was able to get back into game development and create Dimension Jump.
This original game differs from the later remaster in a few ways:
- The remaster introduced the level editor and all of the Steam-related features like level sharing and leaderboards.
- The original had a much steeper difficulty curve; we spent a lot of time on the remaster making sure that the tutorials and first set of levels were really easy to pick up to prevent people quitting the game early.
- The original had themed sections; you can see in the screenshots below that one of the sections was themed as cave exploration / adventure and the other section was apocalyptic cityscape.
- The original had freeware music; the remaster had music made for it by a contractor.
- The original had an actual area that would move around in to access the levels which you can see in the screenshots below; the remaster has a more conventional menu system for level select.
- In the original, some levels limited the number of times you could dimension jump (seen in screenshot #4). This ran anthetical to the design of the game though, so we removed this system in the remaster.
- The remaster added proper support for 16:9 screen resolutions and updated the engine to Game Maker Studio 1.4 (the original was Game Maker 6).
The Ancient Times
Beyond this point we start getting into my high school years. Many of the projects here are ancient, and are really here for completeness rather than any sense of quality.
In 2010, I took a gap year between the final year of high school and university. It was mostly spent developing Roket3D and running RoketGames (see earlier years for information on both of these).
.p2pdomain extension. It was written in C#.
I wrote a packaging format for Linux called AppTools that was designed to support side-by-side library installs and mount and run applications from self-contained packages. That is, you could download the self-executing package, run it, and the AppTools wrapper would take care of mounting the package to a temporary directory and running the application.
This project was eventually abandoned as I could not get the filesystem format stable, and the distribution I was writing it for (elementary OS) ended up basing their distribution on Ubuntu rather than using AppTools for packaging.These days Snap provides the self-contained packages idea that AppTools was pursuing.
In 2009, I was in my final year of high school.
In and around 2009, I ran a game hosting website called RoketGames. I'm not sure of the exact date when this was operating from and to, because at some point between 2009 and 2011 most of the data was lost due to an exploit on the shared hosting service that it was operating on.
What I've managed to construct here is from a backup that I managed to find (and at the time I didn't know I had). The backup that contained user data unfortunately only has DOS-style 8.3 filenames for everything, so it wasn't possible to get something very useable to explore beyond taking the screenshots below.
RoketGames competed with other sites like GameJolt (which is still around!) and YoYoGames back when they did game hosting for Game Maker games. It hosted games, had blogs and forums, had online service APIs with an overlay (like the Steam overlay) and an instant game launcher called YAIPP. Towards the end of it's life, I also pursued supporting commercial games, allowing developers to connect their PayPal accounts and sell games through the platform, though there was never sufficient use to sustain operational costs and the advertisements didn't cover costs either.
After the shared hosting service was exploited, I was never able to restore the website source code and it died out.
Clicking on the images below will take you to the full-sized version of the screenshot.
More screenshots: 5
A weird little shoot-em-up I made in one night. The player is controlled by the mouse cursor, and you have to shoot and then absorb the enemies to manage the size of the player over time. The music is procedurally generated and thus, absolutely terrible. You could try playing it on mute, but it would detract from the tension.
Integrates with RoketGames which was a game hosting platform I running at the time. Of course, those APIs are long since gone and don't work any more.
In 2008, I was in Year 11 of high school.
YoYo Games (the creators of Game Maker) ran a game jam in late 2008. This is a 2D RTS game that I made for it.
This was an unreleased sequel to The Thing 2. The last build I have is from October 2008, so I'm pretty sure development stopped around then. It overhauled the graphics, added co-op multiplayer (via DirectPlay) and the collisions seem to be less buggy.
This software sorted documents in a folder based on their file type. The idea is that you could set it up to watch your Downloads folder and it would automatically move files to the desired location based on whether they were images, videos and so forth. It doesn't run at all on Windows 11, so the only screenshot of this I could get is of the download page on the old Roket Productions website.
It was initially shareware with a commercial upgrade, and later made freeware.
A digital card game that was kind of based on 500. I'm pretty sure Josh Harvey and I developed the game rules together, but it's been a while. The strategy is try and play cards towards the middle so you don't win or lose each hand. Included online play, which obviously no longer works.
You can also play Zero with just a normal deck of cards and 3 other players. The rules (as explained by the ZeroPC game) are:
In the game of Zero, a player deals and the person to their right starts leading. The person who leads may pick any card from their hand to lead with, excluding either Joker.
Each player takes their turn in playing a card after the person has lead. The turns rotate anti-clockwise. If a suit is played, and the person has that suit in their hand, they must play a card of that suit or the Joker with the same color as the suit lead. If the person cannot play a card that matches the suit, then they may offsuit, throwing out a card of another suit. The card thrown out has no value and it is not counted when working out who won or lost the trick (excluding special cases). The person who plays the highest card of the suit lead starts leading next turn. The person who plays the lowest card of that suit places all of the cards played into their hand. The first person to have no cards left in their hand wins.
When a suit is lead, and every other player offsuits, then the person who played the lowest value card by number loses the trick. The person who lead, leads again.
The order of card values from lowest to highest are: 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A, Joker.
In 2008 I built a 3D RTS in Game Maker with a few friends. Game Maker didn't have the ability to batch render 3D models, which resulted in extremely poor performance for any non-trivial map, ultimately hindering any further development of the game.
That said, I still think this is pretty good considering what Game Maker was capable of at the time.
In 2007, I was in Year 10 of high school.
Redpoint Games has had a lot of previous company names:
- Roket Productions
- Roket Enterprises
- Redpoint Software
- Redpoint Games
In 2007 it was called Roket Productions and as can probably be expected, there was a website listing all of the projects and services we had available. A screenshot of the home page can be seen below:
This was an unofficial sequel to a platforming game made by a different person. The player character is bouncy (and has no jump key). It featured a level editor and an online level pack system. It initially had a release around a December 2007 and updated throughout 2008.
The very first game engine I ever wrote. It was written in C++ and used Irrlicht for 3D rendering, Lua for scripting and Newton Physics for physics simulation. It had a light-weight C++ generator that would automatically generate Lua binding code for all of the native classes. I modified Lua to support things like a first-class type system and an 'is' operator for type comparisons. Reflecting on this in 2022, it is astounding that I was 15 years old when I was first developing this and publishing this on the Internet.
To emphasize the context in which this software was developed:
- It is so old that source control history only starts in 2010. It would have initially been stored in Subversion, before moving to Mercurial. I'm not sure it was ever developed in Git; I suspect Google Code might have converted the repository when they exported it to GitHub after Google Code closed down.
- For the first few years of development, Unity wasn't available for independent game developers to make 3D games in. The release of Unity as a low-cost 3D game engine is what killed the development of this engine once it was made freely available to developers. If I remember correctly, the original audience for this engine were game developers who wanted to go beyond what Game Maker was capable of; once Unity released their free tier there was no longer a market for the engine.
- I think the IDE started development in 2010. It was later repurposed for the MOAI game engine (which I did some contracting work for in 2011) but was never released.
I've included some screenshots from the Wayback Machine below. Images link to the Wayback Machine capture of the page. The first image is from December 2007.
Ah yes, "lost it all in a USB crash". Classic 2007. A later capture shows it's evolution during 2008.And yes, the name that my friends and I used for our projects during this period was "Roket Productions". We were 15 - don't hold it against us.
In 2006, I was in Year 9 of high school.
In 2006 I started a website called Game Making Resources. It was effectively an online database of assets that people could use in their Game Maker games, and people could submit assets they made:
Game Making Resources was built on top of PHPBB3, which is why the site styling looks so similar to the default theme of PHPBB3.
At some point after the site was originally made, I implemented a bot that would crawl the asset/resource forums in the Game Maker Community and add listings for all of the topics where people were listing their assets, so that users wouldn't have to manually add them to Game Making Resources. It was a neat exercise in writing a HTTP robot and parsing HTML.
In early 2009, I added a "Where in the world?" page where developers using Game Maker could add their location so people could see (anonymously) where Game Maker users were around the world.
Somewhere in or after 2010 the site ceased operation, likely because it was on the same hosting provider as RoketGames when that got exploited and thus the data was lost.
In 2005, I was in Year 8 of high school. This is as far back as my archives go, and mostly consists of really old games I was making in Game Maker at the time.
This is an incomplete list of things that I haven't yet properly added to this page. I still need to go back and figure out when they were originally released and get screenshots, etc. for them:
- Dx: Distributed Extensions for .NET
- Work done at PageUp People between 2013 and 2015
- Pivot game engine (never released)
- Ancient stuff I have in a folder called "Project Backup 2009"
- Ancient games including Planet Attack II (cancelled)
- Time Effects Engine for Game Maker
- Total Annihilation Launcher (for mods)
- TrackMania Nations and TrackMania United maps