Save/Load a prayer

Happy Thanksgiving!

In the past 7 days of work (this short week plus the previous week), I finished Outsider’s engine and core UI flows, which means all major game features are in place! This includes everything from before, plus the recently coded state persistence (aka Save/Load game) and the main scripting engine.

This might sound like the game is closer to completion than I had advertised, but… not really. The fun begins now as the work shifts from coding the game’s engine into polish and, more importantly, content. As is the case for most narrative games, the bulk of the development time will be spent creating art, dialogue and music; not “plain code”. Focusing on coding in the past weeks was a good idea because I moved much faster than I would have if I had constantly task-switched. The downside is that I now face a ton of work away from my areas of expertise; I’m a professional software engineer and not a musician or writer, after all.

Speaking of software engineering, the “state persistence” work was some of the hardest and most design-intensive I’ve done since I started with the game. Godot provides a few tools for implementing save games, but none of them are very helpful for stateful games such as Outsider. It’s an area where the engine can improve as its many solutions are, at best, half-baked approaches. Even deciding what I should use took a nontrivial amount of time.

Building the Save/Load feature required building the internal game’s “data schema”, which was harder than I anticipated; I spent multiple days rewriting it. Every rewrite would set me back a few hours and require deleting a bunch of code I had just written. Persistence paid, and eventually, I got to a fairly polished schema that didn’t require much change to the rest of the code… As most software engineers know, it’s not easy to arrive at a simple solution for a hard problem!

As you’ve read here before, I like to spend a percentage of my development time in making myself more efficient. With my growing experience in Godot, I solved a longstanding problem in Outsider… It’s hard to explain it, but, in a nutshell, the game now adapts to a range of screen aspect ratios and adds black bars automatically only in extreme situations. This isn’t something I had the skills to implement a few months ago, so it’s a bit of a testament to my progress.

One funny thing about the current codebase is that it hasn’t been growing quickly despite the many new features I added in the past few weeks. The reason is that I’ve been refactoring it consistently, and much of my earlier code got replaced by smarter (from a Godot standpoint) ways of doing the same thing. I estimate that I completely wasted around 4-5 weeks of work over the past 4 months due to my lack of Godot (and game development) experience… :( Around 70% of the code present during the first playtesting has been rewritten! :-O

Going forward, I’m just a week away from the game’s “minimum viable product”/MVP! I don’t want to send the MVP for playtesting, though; instead, I’ll try adding many “nonessential” features to ensure a great playtesting experience in late December or early January. I’ll let the Discord folks know once I’m a couple of weeks away from the new build!