Blog 3.0 I make games.
2022 Retrospective
TL;DR
Started working seriously on a new game: Ephemeris.
What Did I Do In 2021?
In my last retrospective I talked about a major redesign of Overcrowded and mentioned starting on a side project (over Christmas) named Ephemeris.
Placeholder Software
Dissonance Voice Chat
This year we’ve released 7 updates for Dissonance with a number of improvements:
- Added a new audio synchronisation system which detects extreme packet loss and briefly interrupts audio playback to fully reset the system.
- Added a brand new way to do positional audio, based on spatial hashes. This does not scale cost with the numbers of listeners, so it can handle huge crowds.
- Fixed some strange MacOS bugs to do with marshalling between C++ and C# components. It seems like Unity used to do it technically wrong and we relied on the old but wrong behaviour, so when they fixed it we ended up with a regression.
- Added x86_64 support for Android (this used to be for emulators only, but it seems like some Chromebooks are now x86_64).
- Added a way for server side scripts to intercept raw audio packets. We used this to integrate with Toxmod for a client.
- Implemented a new way to subscribe to the raw audio stream from the Dissonance microphone.
- Added Magic Leap 2 support.
- Added Apple M1 support.
- Vastly improved audio quality of RNNoise.
- Added an “offline comms network” which makes Dissonance think it’s in a chat session even when there’s no network.
- Two major new integrations: FMOD Recording and FMOD Playback
New Audio Subscriber
This is an interesting feature not because of what it is, but rather due to the motivations behind it and the lessons learned. Ever since release Dissonance has had a way to subscribe to the raw audio that the Dissonance microphone is recording, some people have used this to show a frequency spectrum as you speak, or to record everything you say to a file.
This subscriber system was always built to be high performance and not particularly easy to use - all the audio is delivered on a background thread (the audio recording thread) which must not be blocked for a long period of time (e.g. doing IO). The documentation explained this and included a very quick-n-dirty script to show how you could transfer audio across to the main thread. We didn’t expect anyone to actually use this script, it was just an example and not something suitable for real world use.
Inevitably every time someone contacted me asking for support about this feature their code would include a copy of the example code, adapted to their use case. I’m definitely not blaming the users here - in fact copying examples from the documentation and adapting them is the right way to do things if you’re unfamiliar with a system! This one was totally on us not understanding that example code should always be production quality!
Toxmod
Toxmod is an automatic content moderation system for voice. It monitors realtime voice streams and flags potential bad behaviour for moderators to review, acting as a filter to cut out the 99% of content which isn’t a problem. When moderating voice this is critically important!
Unfortunately this isn’t available as a plugin for Dissonance since it was developed for a client. But I would encourage anyone else who is serious about moderating voice chat in games to consider Toxmod.
Overcrowded
For the last two years I’ve talked about the struggle to release “Overcrowded”, our asset for steering behaviours and local avoidance. If you check the Placeholder Software store page you’ll see that it has still not released!
As I said last year we had to initiate a total rewrite of the asset due to Unity announcing that ECS would not be available on some versions of Unity 2021. With hindsight this was a mistake because in the time it has taken us to do that rewrite ECS has become fully stabilised and released version 1.0 - we should have just waited. Eventually in mid 2022 we decided to put the project on hold, both of us were getting pretty burned out with the project and initiating another rewrite back to the new ECS 1.0
was definitely not feasible.
We may revisit the project next year, possibly releasing something much smaller than originally planned as a first step in releasing several smaller assets which work together to provide the complete Overcrowded feature set we had originally planned.
WasmBox
Our next project after Ephemeris is a total change of direction: we’re developing a WebAssembly (WASM) integration for Unity. This is based on wasmtime-dotnet and extends it with a number of features such as safe job system support, precompiling WASM at build time etc. We’ll be releasing this very soon, feel free to contact me (martin@placeholder-software.co.uk) if this is something you’d be interested in testing out.
Blogging
As you’ve probably noticed I wrote no new blog posts in 2022, sorry about that. However, I have recently started a new project that’s a bit like a blog: Ephemeris Notes. These are my notes created during the development of Ephemeris on all sorts of relevant topics: games, films, TV, rocketry, weaponry, integrators, floating point accuracy etc. I’m actively adding new content to this all of the time and some of what I write is like a mini article/blog post explaining something to myself. For example this article about floating point precision where I explore the benefits of using different unit scales.
Ephemeris
Ephemeris is a game project that I have been working on as a side project all year. Ephemeris is intended to be a realistic space combat tactics simulator akin to Children Of A Dead Earth. As mentioned above I’m writing development notes on the project, so if this sounds like the kind of game you’d be interested in check those out and maybe join the Discord.
I worked on one version of the project on and off throughout the year, using an asset store package called Gravity Engine to drive the core simulation and Space Graphics Toolkit for most of the graphics. I made some really great progress, putting together a realistic map of the entire solar system with full support for modding in new bodies all driven with an on-rails simulation for the planets and an n-body simulation for the spacecraft.


This was as much a research/learning project as much as it was a serious attempt to make a game. One of the things I learned it that while Gravity Engine is pretty good it really doesn’t fit with how I want things to work - I really want a fully deterministic simulation which runs in the Unity ECS for maximum performance.
As an experiment just before Christmas 2022 I started on a project to write my own gravity system in ECS, just to see how hard it would be. When I started I honestly wasn’t sure if I was going to use it, in fact I expected to discover that it was all vastly more difficult than I expected and to return to using Gravity Engine. Instead I’ve written a hybrid N-Body simulator (all gravity sources such as planets and moons are on rails, all space craft are n-body simulated) which spreads the load across all cores and has a variable timestep to reduce the amount of work necessary. I’m very happy with this and I’m going to be moving across all of the work I did previously to this new project.

This has given a new lease of life to the project - I can now see a path to a high performance multiplayer orbital combat simulation which would never have been possible with Gravity Engine. I’m excited to get working on this in the new year!
Save The Spire
This year we ran another Cylon community gamejam. This year we all suggested a topic and then voted on them to generate a ranked list of themes, this left us with an extremely opened ended theme:
1: Magic 2: Factory 3: Space 4: Indirect Unit Control 5: Zachlike 6: Multiplayer 7: Princess Of Mars 8: Yolol 9: Completely html/CSS/JavaScript game
This year I decided to do a very weird project that I didn’t really expect to work very well as a game. For me that’s the great thing about a gamejam - I can build something weird and wonderful to explore a new bit of game design without having to commit to it or really have any expectations of it.
The game is called “Save The Spire”. You discover a huge magical (1) structure floating through the sky (3) which appears to be some kind of arcane (1) factory (2). There are some units standing on the structure which you cannot directly control (4), instead you can place down new walkways (which the units will walk over to and build). There are various clues hidden around the factory as to how it works and it’s your job to piece them together (5 ish) and restore the factory to working order.
You can download it to try it out here.
As a game this didn’t really work (and that’s fine!). I think with some more careful game design and art direction it could maybe be made to work. There were a few common complaints from all the players:
- The start of the game gives no direction at all. The game is meant be to mysterious and encourage you to explore, but it’s a bit too mysterious at the moment.
- Golem spawner (little block with a floating Darwinian in it) looks identical to a golem (a normal Darwinian) so it’s unclear it’s something special.
- It’s a bit repetitive. There are multiple elements that need connecting up and they are all a bit different, but not enough. I simply didn’t have enough time to create more variations.
- It’s too simple. Once you have worked out that connecting things together makes things happen you can win by just connecting everything to everything. There’s never a reason not to connect two things!
Overall I have to say I’m quite happy with this feedback. Everyone agreed the core of the game is something unusual and interesting. The negative feedback is mostly stuff I had anticipated - it just needed a lot more tweaking and maybe one more major mechanic to being it all together (which I didn’t have time to do in a jam).
Projects
Margarine
This is a 3D game for the PicoSystem - and RP2040 based handheld console. It uses a Wolfenstein style raycast renderer to draw 3D (ish) environments. Even at the low resolution of the PicoSystem (240x240) it’s driving the RP2040 CPU as hard as possible to manage this!
SolarBlaze
This year we had a solar system installed (panels and battery). The inverter is obviously a computer system capable of monitoring the system, recording statistics, reporting them back to the manufacturer etc but we’re completely locked out of it! Instead the only way we can monitor the system is to use the app which is provided - that can’t be used on PC, has no option to export the data and is generally quite rubbish.
Fortunately someone has built a project called lxp bridge which interprets the inverter messages and logs them to an MQTT endpoint in a useful format. I’ve used this to build SolarBlaze, which is a Blazor based front end to monitor the data. It’s quite rough at the moment, but once the sun is shining again I’ll get back to working on this and will consider publishing it as a project anyone can use (with proper setup instructions etc).
Interesting Stuff
Some other interesting things that I encountered in 2021 in no particular order:
- Blazor
- Raspberry Pi Pico
- r/cyberdeck
- PicoSystem
- WASI
- Inochi 2D
- Docusaurus
- Catalyst
- BFlat
- MOOS
- Castlevania
- Spotify
archive
- 2022 Retrospective 01 Jan 2023
- 2021 Retrospective 30 Dec 2021
- Yolol Parsing 26 Feb 2021
- Building A Toy Compiler 25 Feb 2021
- 2020 Retrospective 31 Dec 2020
- The Yard Sale 16 Sep 2020
- 2019 Retrospective 31 Dec 2019
- 2018 Retrospective 02 Jan 2019
- Lessons In Network Protocol Design Learned The Hard Way 23 Jun 2018
- Dithering About Dither 27 Mar 2018
- 2017 Retrospective 13 Jan 2018
- Unity Ongui 04 Dec 2017
- Dissonance Voip Pipeline 19 Feb 2017
- 2016 Retrospective 01 Jan 2017
- Dual Contouring In 2d 27 Dec 2016
- Procedural Generation For Dummies: Building Footprints 07 May 2016
- Procedural Generation For Dummies: Half Edge Geometry 30 Mar 2016
- Fixed Permalinks 21 Mar 2016
- Procedural Generation For Dummies: Galaxy Generation 14 Jan 2016
- 2015 Retrospective 04 Jan 2016
- Procedural Generation For Dummies: Lot Subdivision 27 Dec 2015
- Procedural Generation For Dummies 11 Dec 2015
- Procedural Generation For Dummies: Road Generation 11 Dec 2015
- Deferred Transparency 09 Oct 2015
- Xna In 2015 24 Aug 2015
- Node Machine 26 Jun 2015
- Procedural Generation Of Facades And Other Miscellania 29 May 2015
- This Path Was Made For Walking 23 Apr 2015
- Cross Chunk Navmeshes 27 Mar 2015
- Changelog 27 06 Mar 2015
- Drawing Stuff On Other Stuff With Deferred Screenspace Decals 27 Feb 2015
- Random Gibberish 22 Feb 2015
- This Wall Is Sticky 17 Feb 2015
- Changelog 25 08 Feb 2015
- 2014 Retrospective 13 Jan 2015
- Super Sonic Sound 08 Jan 2015
- Sandboxing Is Dead Long Live Sandboxing 22 Dec 2014
- Changelog 22 B 14 Dec 2014
- Changelog 22 07 Dec 2014
- Possible Interruption To Service 06 Dec 2014
- The Game Programmer Awakens (changelog 21b) 30 Nov 2014
- The Return Of The Programmer (changelog 21) 16 Nov 2014
- The Return Of The Vending Machines 26 Oct 2014
- There Are Vending Machines Everywhere 16 Oct 2014
- Changelog 20 12 Oct 2014
- Ragdolls Are Hard 05 Oct 2014
- Changelog 19 28 Sep 2014
- The Return Of The Game Programmer 21 Sep 2014
- The Ball Is Picked Back Up 17 Aug 2014
- It's Good To Be Back 03 Aug 2014
- Serious Injury 21 Jul 2014
- We Marveled At Our Own Magnificence As We Gave Birth To Ai 14 Jul 2014
- Changelog 17 06 Jul 2014
- Changelog 16 29 Jun 2014
- Happy Birthday 22 Jun 2014
- Changelog 14 15 Jun 2014
- Losing My Way 08 Jun 2014
- Wildcard 02 Jun 2014
- Changelog 13 25 May 2014
- Changelog 12 16 May 2014
- WAI NO VIDEO (Again) 11 May 2014
- Changelog 10 04 May 2014
- Changelog 9 27 Apr 2014
- Changelog 8 20 Apr 2014
- Long Overdue Style Upgrade 18 Apr 2014
- WAI NO VIDEO 13 Apr 2014
- Changelog 7 07 Apr 2014
- Changelog 6 30 Mar 2014
- Changelog 5 23 Mar 2014
- Changelog 4 16 Mar 2014
- This Is Madness! 11 Mar 2014
- Changelog 3 09 Mar 2014
- Changelog 2 02 Mar 2014
- Changelog 1 23 Feb 2014
- Changelog 0 15 Feb 2014
- Payday The Heist 2 13 Jan 2014
- 730 Days Later 01 Jan 2014
- I Just Needed A Rest 12 Nov 2013
- Splinter Cell Blacklist 27 Aug 2013
- Gruelling Homework Assignment 26 Aug 2013
- Scripting Is Dead Long Live Scripting 14 Aug 2013
- The Reports Of My Death Are Greatly Exaggerated 05 Aug 2013
- 27 Gigawatts Of Cake 11 Jun 2013
- Trees Are Well Behaved 22 May 2013
- A Brief Project Update 14 May 2013
- Finite State Machines (are Boring) 16 Apr 2013
- Pathfinding 10 Apr 2013
- Artificial Stupidity Series 08 Apr 2013
- Valve Need To Stop Reading My Mind (and Other Miscellanea) 20 Mar 2013
- Elements Of Style 26 Feb 2013
- Moving To Axmingholmesbury 23 Feb 2013
- The Future Is Steamy 08 Feb 2013
- Mathematical Trickery 22 Jan 2013
- Thinking Aloud About Release 09 Jan 2013
- Game Developers Don't Make Timetables 03 Jan 2013
- What Is Heist? 20 Dec 2012
- How Does Procedural Generation Work? 14 Dec 2012
- Why Does Heist Keep Crashing? 07 Dec 2012
- What Isn't Procedural Generation? 23 Nov 2012
- What Is Procedural Generation? 18 Nov 2012
- Procedural Generation Series 15 Nov 2012
- Packet Encoding(3) 12 Nov 2012
- Packet Encoding(2) 08 Nov 2012
- Packet Encoding 07 Nov 2012
- Deployment Hax 28 Oct 2012
- Wibbly Wobbly Pipey Wipey 24 Oct 2012
- New Release(2) 24 Oct 2012
- New Release 20 Oct 2012
- Say What? 17 Oct 2012
- Get Up And Initiate That Session 15 Oct 2012
- Topological My Dear Watson 14 Oct 2012
- Omg Wtf Multiplayer 13 Oct 2012
- Full Steam Ahead 24 Sep 2012
- You Should Check Out Greenlight 01 Sep 2012
- It's Full Of Entities 20 Aug 2012
- Persistence 06 Aug 2012
- I'll Be Back 01 Aug 2012
- Artificial Stupidity 24 Jul 2012
- Overindulgence 16 Jul 2012
- Not My Cup Of Tea 09 Jul 2012
- Artsy Stuff 02 Jul 2012
- This Was A Triumph 25 Jun 2012
- Multiplayer Release 18 Jun 2012
- Fortnightly Fun 10 Jun 2012
- New Blog 31 May 2012