Gamedev Bootstrapping
November 23, 2020
Happy Turkey Day!
In the wake of a global pandemic and a recent shift in my career trajectory, I've decided to start a game development project. I'll be posting progress updates in this online forum. My first objective is to get everything bootstrapped so inremental improvements are easier to make on a more flexible schedule.
In this post, I'll only be covering the high level game concepts and discuss the initial prototype that I created last week.
Project Purpse
Last week (Nov. 16-21), I created a game prototype from start to finish. The prototype captures the interactive concept though it has many bugs and no story or onboarding experience. The concept of the game is a text-based adventure that is meant to feel like a possible real-world scenario of scripting and hacking. The most critical gameplay goals are (in order):
- Making analytical decision-making interesting and compelling
- Telling a good story about the nature of humans and human civilization
- Offering a high level view into how computer systems actually work
- Capturing the addictive experience of writing computer code
The most critical goals for my own time investment in this project are:
- Rebuilding the habit of software development (I've been more "hands-off" as an engineering manager for the last couple years)
- Building something that indie game enthusiasts would enjoy
- Making a real game from beautiful cyberpunk and/or sci-fi interfaces
- Satisfying a creative desire to use computer graphics and rendering skills
- Try using the Godot game engine. I've used Unity and Unreal but I want to try something new.
This is first and foremost a personal project, but it also serves a professional purpose.
Game Narrative and Design
The game narrative context is pretty simple. In the future, true AI is developed and the singularity rapidly follows but not in the way that it's often been characterized. Robots don't becoming sentient beings and outsmarting humans to become our machine overlords. Instead, they exist entirely in the confines of host computers that run the AIs. The AIs do learn and adapt extremely quickly (think microsecond timescales) but operate only with digital input and output signals that their receive from their host computers.
The player enters this world as a newly created AI which is a creation of yet another AI. Your creator starts by training you (which serves to onboard the player to the non-traditional CLI input). But you must learn how to attack and defend other AIs in a quest to secure the most precious resource: electrical energy sources.
Though the game is envisioned as a tactical RPG, I'm specifically going to be focused on the goals above. The most important goal being that a real, playable game actually gets released publicly (which I will prioritize above all else).
Though the prototype works –it is 100% text only and it has a few input and output bugs. As a consequence, I won't be releasing it publicly, but it has served it's purpose.
Lessons Learned So Far
The purpose of the prototype was to learn as much as I could about how to design the interactive loops that could achieve the gameplay experience goals. It also served as a refresher for many of the design challenges for interactive game development. Here are some key lessons that I learned:
- For a sophisticated text-based input to work, I need to have a very flexible and forgiving command processing system. I wrestled far too much with the C++ type system in my initial implementation.
- Most commands will have specific targets that have a specific type. This must be very clearly communicated to the user and it must be easy to enforce in the UI. This implies that the code can easily perform the right lookup in a standard fashion.
- Unit testing will be critical for any basic primitives that I write. I spent too much time with interactive testing. I will need to be able to run the core engine code (and tests) outside of Godot but conveniently integrate them to Godot scripts and objects.
- I will need some good quality implementations of some key technical primitives for a finite state machine, event dispatching, stream processing, text logging, and a hierarchical node graph.
- Before I go far in developing in C++, I need to ensure that I have a set of standard conventions for getters/setters, pointers/references, RAII, memory ownership, and polymorphism/TMP. I fiddled with some C++17 features in the prototype and it got messy quickly.
Most importantly, I also realized that a text-based game of this kind will be extremely abstract to most users (even developers). The first challenges to solve will be in onboarding the player to this digital world and to make sure the gameplay moves and strategies are well understood (and quickly).