Finishing up my jam game

The game that I started making for GitHub GameOff 2023 is not finished.

I did polish it up, build some better levels, and come up with a title, all in time for the jam deadline on December 1st. The title Symlink, and you can try the jam version of the game here. It has some issues, but it's playable, and the core mechanic works.

Changes since the last post

There are two main changes I made before submitting the game for the jam.

In order to help the players learn the game, I also added a simple tutorial system. While navigating the levels, text boxes will pop up in the top left corner of the screen, explaining the controls, or informing the player about something that a link can be used for (for example: to make a box float in the air).

I wanted to make more levels, but ran out of steam in the last week of November, and so decided to submit it with just the tutorial levels.

Future changes

A screenshot of a Symlink level in the editor

I want to make levels that include multiple types of links, and also in some cases multiple links being active at the same time. In the jam version of the game, if you start creating a link while already having one active, the active one is removed. Changing the code to allow multiple simultaneous links was fairly simple, and I actually ended up removing more code than I added.

I also want to add controller support to the game. This is proving a little more tricky, though, and there are two reasons for that. One is that I need to duplicate all UI that has to do with the controls, to make a version with controller button prompts (or multiple versions, for different controllers). The game needs to dynamically switch between these UI versions, based on whatever device has most recently registered an input.

The other tricky bit is the camera rotation. Godot handles input via input actions: each action that a player can take has a name, and a list of associated buttons. For example, you could have a jump action, which is associated with the space key on the keyboard, as well as the A button on an xbox controller. Pressing either of those means jump. However, the one thing that is not handled this way, is mouse motion. Instead, this is handled by a callback function, which is called every time any input event happens. Check whether the event was a mouse motion event, and if it was, we rotate the camera.

This means that camera rotation needs to be handled in two ways: Via the callback function that checks for mouse motion, but also via an input action associated with the right joystick on a controller. Add into the equation that camera rotation in Symlink is different depending on whether or not the player is currently using the grab action to move a box, and, well, my spaghetti code from the jam simply isn't all that easy to extend. I'll most likely need to redo the way I handle camera rotation completely.