
GDEX and Split Screen
Here are the highlights:
- Demo’ed the game at a game convention
- Tweaked and rewrote a lot of game mechanics to prep for demo
- Launched a basic website
- Added split-screen multiplayer, but still working on the UI
- Rust LOC: 53,950 (+9,271)
GDEX

I made this “neon” sign with some LED strips that I found on clearance for $25 at Walmart. It’s mounted to a shelf that I took out of my basement. It got a lot of compliments.
When I started this project, I set a do-or-die milestone that I’d show the game at a local game convention named “GDEX”. The convention was ten months away and if I didn’t have something presentable by then I needed to reevaluate my life choices. While I didn’t hit my goal of being completely done with the game, I did have a solid vertical slice and many of the larger infrastructure pieces in place. I give myself a passing grade, not an A+, maybe not even a B, but still passing, so I’m going to keep at it.
About ten years ago I tried being a solo game dev and set a similar milestone for myself. But I didn’t hit it. I had dropped down to part-time at my job and theoretically spent the rest of my time on my game. What really happened is that I gave my paid job my most productive working hours and left none for myself. I was only getting paid for 24 hours/week but I was getting just as much work done as before. When I did find the willpower to work on my game, I struggled to focus and found myself working on lots of little side projects or just being lazy. I feel more mature now and it’s easier to stay on task and make progress every day. I think becoming a father and pushing myself through eight years at Google helped me figure out what I actually want to do with my life.
Lately, I have been feeling down on myself about my slow progress and doubting whether other people would like the game. It feels immature and unmanly to be effectively unemployed when I have a child. It felt different ten years ago when I was still paying my bills with my part-time job and didn’t have to worry about taking care of someone else. Sure, I saved a ton of money working at Google but spending savings doesn’t feel the same as actively earning money, even though the savings is earned money from the past. So hitting this milestone and seeing people play the game meant a lot.

I procrastinated on my booth, and it really needed more signage and decoration.
GDEX is a pretty small convention. Like many things, it was better before Covid. It was divided into three main sections: indie game developer booths for people to demo games, lectures about game dev, and a large arcade. It was held in a hotel with an attached convention center with a weird ring-shaped layout. The developer booths were on one side of the ring and the lectures and arcade were on the other side with a ~5 minute walk through hotel hallways between them. I don’t know how many people went to the arcade but I know not that many went to the developer booths. Despite that, I managed to have people playing my game most of Friday and Saturday. I only had like four people on Sunday. I would have been really upset if I was trying to make sales, but instead I was interested in play testing, market research, and my own milestones; so I am happy with it.
Solar Slam is very well suited for conventions and fairs. It’s easy to learn, accommodates groups, and is entertaining for spectators. Eight people can play at once so I don’t need a small computer lab for people to try it. Most booths could only fit 2-3 computers so they fundamentally couldn’t reach the same throughput. I might try getting a booth at local street fairs in the spring to reach a wider audience.
I was really impressed with the wide range of people that not only liked the game, but got into it. Groups of friends liked it, parents and kids liked it, couples liked it, and random solo players liked it. A few people played it for an hour straight. A couple of folks come back for seconds. I thought one guy was about to break a controller when a hit didn’t land the way they wanted. That’s paradoxically a great sign. The game is incredibly simple and bare-bones, but it has a solid core. Adding gamepad/controller support was a pain (more on this later) but it’s undoubtedly the way the game is meant to be played. I encountered one argumentative / toxic player and it convinced me that I’m going to need to hire a social media manager when the game launches. I’m not cut out for that shit.
Roque, a friend from Google, came to help me with the show. It was nice to see him and I hope he enjoyed the event. I felt bad because the conference was like 1/3 of what it used to be so there wasn’t much for him to do. He’s working on a couple of games too.
I ran into two other Xooglers (what former Google employees call ourselves) while I was packing up. They were from a neighboring team when I worked there. If we were still working we might have crossed paths in bugs or design docs. So this little convention had at least four people from the same division. It’s a small world.
One of my long-standing todo’s was to make a website for the game. I bought the domain name in February but hadn’t done anything with it yet. I couldn’t go to this convention without one so solar-slam.com is now live. I don’t know the first thing about web-dev but AI recommended that I use “Astro” to build it. It’s a some-assembly-required framework for making mostly static websites like blogs. It compiles markdown and javascript into an optimized static website that can be uploaded to Cloudflare’s free hosting service. It’s nothing fancy, but it’s good enough for now. I wish I had setup an email sign-up form before the convention too, but oh well.

Penny for scale
I ordered stickers for my booth, but they arrived after the convention. If you want one, send me your address and I’ll mail you some.
Controller Support

I need a better workflow for random neon graphics.
Adding split-screen controller support was a lot harder than I expected and I’m not done yet. There’s the obvious issues like having more than one player at a time and having controllers connect and disconnect but the main thing I’m struggling with is the UI/UX. I now understand why so many games are designed around controllers even after they’re ported to PC. Controller UI is really hard.
Godot identifies all input devices using an integer ID. The keyboard is hardcoded to 16, the mouse is 32, and -1 means all devices. Controllers are assigned the first available number when they connect. When a controller disconnects and reconnects, there’s no way to tell if it was the same physical device reconnecting, so you need to guess which player to reassign it to.
One of my first hurdles was creating a “Local Player” abstraction that can own input devices. Note that “devices” needs to be plural because mouse and keyboard are separate devices. Then I needed a way to create, update, and destroy players as needed when controllers connect and disconnect. But that logic is situational and it changes based on the application state. Plugging in a controller on one screen will add a player but plugging one in mid-game can only reconnect existing players.
In addition to “local players,” I needed to differentiate “lobby players” who are from the server, and “sim players” that are used by the game’s simulation layer. Each human has three IDs and they need information propagated between them like their name, color, and icons. The UI also needs to notice changes like if someone changes their color in the lobby or enables color-blind mode. I’ve had a hard time keeping the code from turning into spaghetti. Even if I was OK with it being spaghetti, Rust wouldn’t let me get away with it and would refuse to compile. So I needed a robust solution whether I wanted it or not.
Godot has very poor split-screen support. The built-in UI elements don’t differentiate between devices or send events based on which player used them. So there’s no way to tell if player 1 or player 2 clicked a button, I only know that someone clicked it. One way around that is to give each player a dedicated UI with dedicated buttons and somehow keep them from clicking other people’s buttons. But you can’t do that because there’s no way for two UI elements to be focused at the same time, which is critical for controller-based UI navigation.
Surprisingly, this made my neon-boondoggles a bit of a blessing in disguise because I had already created my own set of custom UI elements. I have total control over how they’re implemented so I can work around Godot’s gotchas. Mine now reports which player clicked the button and supports filtering input based on players, and I’m still working on the multi-focus bug. For the convention, I used a virtual-mouse pointer UI where the players moved a mouse pointer with the joysticks. It worked well enough, but the UI was unintuitive and the buttons flickered randomly as focus jumped around.

The little spaceships on the buttons are chips saying what powers each player selected. “404” is my default texture for missing icons.
One of my game mechanics is that players pick a loadout of abilities at the start of the game. They can pick an engine, weapon, and (eventually) defensive ability, plus they can (eventually) pick a different ship/skin and a color. My virtual-mouse UI used a buffet of buttons with a different section for each one. Players needed to make a selection for each and then click “ready.” It’s easy enough to use with a real mouse and some explanation, but it was awkward for new players on controllers. It also won’t scale well if I add 30+ ships, and 30+ abilities. It would be an intimidating grid of buttons.

Eventually, players will be able to customize the design of their sign
I want to make more of a wizard-style UI where each player gets a dedicated little window where they flip through abilities, clicking “ok” to lock in and start selecting the next one. That’s when I ran into the only-one-focused-control bug. I’m not looking forward to building a work-around for it and fixing the myriad of random bugs that are going to come from it.
I’m continually amazed at how much general infrastructure work is required to make a game. Making the actual game seems like it’s only 20% of the problem. I’ll get through it eventually.
Some icons by https://icons8.com