The Making of - Star Squadron - Student Driver

From the title alone you can tell that this isn't a game that takes itself all that seriously, and why should it? It's a simple 2D space shooter where your only real weapon is a canon that shoots ping pong balls. That's right. As a Star Squadron cadet, you're primed for adventure, intrigue, and intergalactic state-sponsored violence, but all that has to wait until you get your driver's license. Apparently, your instructors no longer trust you following a recent "incident," so they have set up a series of courses on a derelict space freighter orbiting the martian moon of Phobos. The hope is that you will do less damage this way.

Your instructors tell you they scanned the place for life forms and found nothing, so you shouldn't run into baddies. Spoiler alert: they lied. The place is crawling with spooky ghost-like creatures who will eat you for lunch if they, in fact, ate lunch. The good news is that with a bit of practice you can use your canon to push enemies away and, if you're lucky, push them into hazards and eliminate them in the most passive-aggressive way imaginable. Something about a game where you're basically defenseless appealed to me. Your best bet is to run away unless you know the level really well and can cat-and-mouse them into an advantageous position. It's rare, but when it happens it feels really good. Trust me.

Working From the Inside Out

Some background: in the early 2000's I made about 35 games in Flash. That was back when Flash was a thing. Since then, I've built a handful of games in Javascript (Impact engine) and iOS for fun or for clients. It's always a blast to work on projects like this. When I discovered the Godot Engine a while ago, I immediately became attracted to the idea of making a game for PC and Mac. Mobile games are fun to make, but it's always a struggle to work around the strict input limitations. In short: I missed buttons. Making something for keyboard and mouse felt like the old days- riding through town in a car nicer than the one I actually drove with the wind whipping through hair I have not had for decades. Fun stuff.

For projects like this, especially ones where there is no "client," I like to work in an inside-out fashion. This means that I work on a core idea, a game mechanic usually, and build out from there. I do not start with a fully realized idea with storyboards and concept art. Yes, this is the ideal and most efficient way to do this, but when I'm building something as a team of one with no deadline or stakeholders, I'm more interested in the process than the product. Yes, I wound up with a game-like thing at the end of this process, but my intent was to have a good time learning about the Godot engine as well as to exercise some creative muscles.

I started with the game mechanic of a frictionless environment. The original version used the same control scheme as Asteroids, though as I added more complex stages and hazards I realized that the rotate-and-thrust mechanic would not work. Instead I went with more traditional controls that behave in a frictionless Asteroids way. For example, when you hit the up key, your ship rotates to the up position and thrusts in that direction, etc. I added a trailing Line2D element to show the player the path they've taken to emphasize how nimble you can be, or should try to be, while playing the game. The on-screen instructions warn against putting the pedal to the metal, so to speak. Feathering the gas is the way to go. Otherwise, you'll end up with a face full of lightning, and that's liable to ruin your afternoon.

From a difficulty standpoint, I wanted the game to be fairly easy to play through but with the time element giving users a bonus for being fast as well as bonuses for exploring the levels and finding power-ups, there is at least a modicum of balance for players to experience the game in a way that fits their style of play.

Three Game Suspension

The theming of the game came from working outwards from the main game mechanic. I wanted a time element. I wanted obstacles that wouldn't work so well in open space without some kind of boundary to the play area. It made sense for the levels to be "inside" something else. The early gameplay reminded me of a cheap 2D version of Descent, having not played Descent at the time. (Side note: after the game was complete, I played Descent's spiritual successor Overload and really liked it.) The ship inside a ship idea worked but I struggled to come up with some way of tying it together. The driving test concept hit me as the dumbest possible way to accomplish this, but I have a soft spot for improbably dumb ideas that also kind of work, so I was powerless to resist its allure. I mentioned the title to a friend who writes kids' books, and he (probably humoring me) said he loved it. It's so painfully silly that it projects an attitude to the player as if to say, "you shouldn't take this very seriously because obviously I haven't." It lowers expectations, lowers the stakes, and as someone who is very comfortable having my work ignored, that idea appealed to me on a visceral level.

Most of the cut scenes were written in a single session lasting no more than an hour or so. The whole thing was so silly and dumb, the flavor text wrote itself. Of course these people have put you in harm's way, and of course they're going to suspend the person responsible from the Star Squadron softball league for three (perhaps even four) games. It was enormously fun. I might need to try making a visual novel next, but I have a lot of research to do for something like that since I'm not familiar with the genre.

Godot: Fairly Rad

As engines go, Godot is quite good. On a scale from Lame to Super Rad, I'd put it somewhere in the neighborhood of Fairly Rad. This was my first full-scale game in Godot, so I kept the scope of the game fairly small. That's one of the reasons why it's free. The other reason is I don't need your money. I don't want it. Maybe I'll charge for games at some point, but I'll need to get over feeling gross about it. I spent 3 months working on this and spent $100 to Steam for the privilege of giving it away, and I'd do it again in a heartbeat. I want people to play it, waste 10 minutes then complain about it on Reddit. It's the circle of life, Simba. If you made something and people didn't complain about it on the Internet, did it ever really exist?

Godot and GDScript in general is very flexible. I'm still learning the ins and the outs of Godot, but all the basics are there. If you're used to Unity, nodes are the basic building block of everything, and instead of C# you code in GDScript which looks like Python (if you squint) but is not in any way actually Python. You can use a singleton to handle persistent data such a game saves, score, Steam connectivity, etc. Your nodes can access the singleton instance from anywhere and you can move from one Scene to another with the singleton as your gameController-like object. I haven't tried it with multiplayer or other game formats that would challenge that kind of structure, but so far it works surprisingly well. By that I mean that I have expressed surprise on several occasions over how well the structure works. The Godot app will crash in OSX on a fairly regular basis, so keep backups and use git for version control. The crashes never corrupted data, thank Zuul.

Lighting

Lighting in Godot is one of its strong suits. You can manipulate the lighting to create atmospheric, moody levels which look fancier than they really are. The headlight on the front of the player's ship came from playing around with the Godot lighting tools. The effect is almost like a 3D light in a 2D environment. You can see some of that effect in the game trailer. I ended up using a Canvas item to darken the screen not illuminated by the headlight or other in-game lights to make the effect more pronounced. When I build a game like this, I usually hang my hat on an idea or a game mechanic that I like well enough to keep me going through the stuff I like less, to motivate me to tweak and build and tweak again until I like the other elements just as much. For this game, the lighting was definitely one of those elements.

Pathfinding

Another Godot highlight is pathfinding. In the old days, home-brewing your own pathfinding algorithms was a recipe for disaster. It was fiddly and sucked up resources at run time. Godot's pathfinding, used for the enemy AI in this game, is ridiculously amazing. I ended up debouncing the calls to the pathfinding functions to keep the enemy AI from killing performance, but the initial setup of the pathfinding using the Navigation2D and adding navigation data to my tilesets was so easy, I actually didn't believe it was working until one of those suckers came careening around a few obstacles and tagged me. I may have said out loud "that was so easy, I feel kind of guilty." I probably did. It might be one one of the code-along Twitch streams I did during the development and testing of the game.

Go Earn Your License

I had a ball making this stupid game, and I hope you enjoy it. If you don't, I get it, but please don't be offended if I don't put a reminder on my phone to find time to care because I can't do that. The game is done, and it takes a herculean effort to even pretend to care. I don't even have much regard for what I think of the game, and I'm me!

Talking about stuff you've made feels silly, dumb, and darkly wrong, so I'll stop now. To say that I hate marketing the things I make would be such an understatement that even thinking about it makes me hate myself just a little. But don't worry about me. I'll be fine. Save yourself. Go off and make something of yourself.

See for yourself and waste an hour or two you will never get back: Star Squadron: Student Driver on Steam

You can also check out a nerdy Reddit thread I posted about the technical aspects of developing with Godot for Steam for OSX.