My recent journey of working on Khonsubase led me to some interesting conclusions about “my game project.” For anyone unfamiliar with my story so far, the one consistent theme is that I want to build an MMO in Rust. I quit my job in November 2019 and have been on an ever-evolving quest to build my dream game.
I have several challenges that plagued me in the past year, and if I am not careful, they will continue to obstacles towards shipping an MMO. This post is a bit of self-reflection. If you’re most interested in what “refocusing my efforts means,” jump to the big heading below.
My “dream” game
One of the largest issues is that if you asked me what I was building at some point in the past year, you’d get a different answer. There are many reasons for it, but they mostly stem from the loneliness of working on a project alone, especially in the middle of a pandemic. I had several points during the year where I would get excited at the prospect of working with another person on a project, and I would subconsciously (or in one case, consciously) begin modifying my game concept to fit this idea of working together with those people.
The loss of my dog at the beginning of November, followed by me getting COVID-19 right before Thanksgiving, set me on a period of reflection, trying to figure out why I’m doing what I’m doing. Through the new year, I barely made progress outside of attempting to build the world up for The Honor Sagas. Most of the progress I was done by forcing myself to try to be productive, not out of actual love of what I was doing.
At the beginning of the new year, I started working on Khonsubase. When I thought about working on my game, I still wasn’t looking forward to it, but I had this new fun project to distract me in the meantime. The goal of Khonsubase was to be the project management tool for my game. As I was getting closer to that goal, I realized I was having way more fun working in HTML than I was doing my engine programming. That realization spawned several trains of thought:
User Interface Programming is Difficult
I’m not talking about User Experience design. That is also tricky, but I’m talking about building all the components necessary to create complicated user interfaces, such as scrolling tables. Over half of my time working on Kludgine was trying to build these reusable components. I really like what I have in Kludgine, but there’s so much left to do. And each one of those items to do gets in my way of making a game.
But therein lies the problem, if I don’t do it myself, what are my other choices? The Rust GUI ecosystem is very young, and almost all of the frameworks have pretty major growing pains as of my last attempt to use them. There is some amazing work being done, and things are getting better every day. That being said, I had some specific goals in my head for what I wanted to achieve: accessibility (screen reader support) and full Unicode support for things like in-game chat. These are surprisingly difficult problems.
For accessibility, I’m unaware of any other project that currently integrates both 2d/3d rendering and user interface components that hook into the operating system’s screen reader support. I know it’s possible, but that’s yet another complicated problem to solve.
For Unicode support, you may not be aware, but there is no “universal” font. You’re reading this text in a font that supports the Latin character set, but for Japanese text to be rendered, you need to use a font that supports those characters. Designing proper font-fallback support is a challenge, and most game engines take a pass on trying to do this.
Backward compatibility is hard
I wasn’t fully aware of the backward compatibility limitations of Vulkan when I adopted wgpu for Kludgine. One of the goals of Kludgine was to be a very lightweight engine that performed well on low-end hardware. Once I realized I had made this mistake, I knew I could eventually wait for the OpenGL backend support to stabilize to target older devices, but I might still need to update Kludgine to take advantage of it.
I spent more time working on the engine than the game
Each time I got motivated to jump into working on the game, I would make some progress then run into something I felt like the engine should handle. This meant the engine was making progress, but let’s be real: In a full year, you still couldn’t log in and see yourself next to another person. Sure, I had a lot of great foundations of how things could work, but the story of 2021 was shaping up to be another year of mostly engine development if I wasn’t careful.
Considering a browser game
All of those realizations were piling up, making it impossible for me to get motivated to open my game project back up. The Browser is a superior platform for what I want to develop. Over the past year, I’ve had many ideas, but one has always stuck with me as something I wanted to do: a persistent multiplayer “lemonade stand”-esque game. But, as I began imagining the UI for that game, I got overwhelmed with the scrolling lists, the tables of information, and I knew it had to be a long-term goal.
But, if I embrace running in a browser, making a table of information read by a screen-reader and translated into multiple languages is no big deal. Thus, earlier this week, I started building a prototype:
I took that screenshot because as soon as I hit that point in my prototype, I said to myself, “It’s really coming together.” As I realized what I was thinking, I laughed at the thought of someone overhearing me say that and seeing what I had on my screen.
What was coming together, you ask? You see, there is a triangle rendered using OpenGL on an HTML Canvas element in a web browser, with an HTML/CSS user interface overlaid on top. Everything is being done in Rust in WebAssembly. The user interface is being rendered via yew, a React/Elm-like framework. The app spawns a “render loop” that redraws the canvas. I communicate between the yew app and the render loop using crossbeam – for example, the toggle button acts as a play/pause for the render loop.
I honestly wasn’t expecting any of this to be an issue. The real question for me is whether I really believed it was the right decision or not. Do I walk away from a large amount of work on a custom engine and embrace this new concept?
Each day of the last week took me a step closer to being confident with my decision. This morning, I finally felt ready to share what I’ve been working on.
Refocusing: Two main projects
My focus now is to remove roadblocks from me working on my game and try to get to a point where I’m iterating more quickly.
Archiving: The Honor Sagas
In the end, this game concept was born out of a potential partnership with an author. While I still adore the idea, I have a deep born love of space, and if you were to look at my last update where I talked about my iteration of the game, most of it was not around the “unique” aspects of the universe.
The first order of action was to give up on the idea of building a reusable account management platform. It just complicated everything more than it needed to be. I’ve absorbed the Twitch login support from ncog into my game, and everything is much simpler architecturally.
As far as I’m aware, no one else is currently using Kludgine. I still really love some of its concepts, but there are more competent game engines. I am not ready to say that I don’t ever want to work on this project again, but unless there’s some ancillary reason to use it, I’m not planning on working on it in the near future.
Unarchiving: Cosmic Verge
This past week has been about getting myself back to the same point as I was with The Honor Sagas but in the browser. If you are so inclined, you can try it at cosmicverge.com. The Twitch login works, but it does not do anything other than give you a message, “You’re in!”, so I would encourage you to mostly just try panning the planets around and zooming with your mouse wheel or pinch/zoom. For those who would rather just see an animated gif, here you go:
I was ready to begin working on Character Select in The Honor Sagas. As of this morning, I felt ready to start working on Character Select in Cosmic Verge.
While I’ve been having enough fun working on Cosmic Verge this week, I will switch back soon to get a few more features added as I start really planning Cosmic Verge.
The current Cosmic Verge project needs some cleanup, but I plan on open-sourcing the project in the next week or two. I’m still designing how I’m going to hide the private implementation details, but the majority of the project will be open source.
Beyond that, it’s just down to working on the game. That’s such a liberating thought. I’ll plan on doing another update in a week or two. That update will formally introduce Cosmic Verge and give a rough idea of the gameplay loops/systems I’m hoping to explore.