Fox Souls

The game is only available on desktop.

The Game Jam

Fox Souls was my entry for Boss Rush Jam 2024. This jam was month long and had the theme of Exchange.

Going into this jam, my only goal was to get back into Unity after not touching it in 2 years. A month would be plenty of time to figure it all out and make something decent-ish. The secondary goal for this jam was to figure out pixel art. I've done a little pixel art in the past, but not much. So making all the assets myself was going to either be really fun or a nightmare.

Starting out

The first thing I did was set up some basic scripts. A player controller script to handle everything from movement to attacking, a level controller to handle things like moving to the next level with the scene loader and a simple enemy to test the player attacks on. I also booted up an old project to see if any of the code I wrote a few years ago could save me some time. Back then I made what I'll call a 'wrapper' for the game, it was a collection of managers for audio, input, UI, game state and dialog. I air-lifted some of the code from the old project and added it to my game jam project. The only scripts I ended up moving over were the UI, game state and audio managers. The rest was either not necessary for this project or I wasn't happy with it and would rather rewrite it later on.

Code Managers

In Unity, scenes are used to contain the game objects for your game. I like to split my games up into scenes based on levels. The first scene the user will enter after loading my game is the MainMenuScene and it includes the UI, audio and game state managers. These managers are singletons and have the do-not-destroy flag set, this means that when we swap scenes these singletons are not destroyed and move on to the next scene with us. To use these managers, I made a script called Speakeasy. This script's purpose is to be the interface between the game's 'wrapper' and the game play code. For example, anytime the player's health changed I would call Speakeasy.UpdatePlayerHealth(number) from the player controller script and then Speakeasy would check to see if the UI manager was available and then tell it to update the UI canvas. Having an interface setup like this is really beneficial for testing, because I don't always need the UI to be there and I can have fallback functions in the interface if needed.

Game play

Now that the 'wrapper' code is out of the way I could focus on gameplay programming. The main things I really wanted to hammer down were the combat and boss design.

The boss designs were influenced by my limited experience with pixel art. Don't get me wrong - I'm happy with the way the pixel art turned out, but I was slow at creating sprites and animations. I heavily leveraged the fact that shooting projectiles and floor based attacks required a lot less pixel art versus melee attacks. Melee attacks would have required a lot more animating or at least I think they would have so I didn't do much more than a charge on the first boss. I was pretty happy with how the boss script turned out. The rotation system was neat, I set up a coroutine system to cycle through an array of abilities and timers. This allowed me to easily update the difficulty based on friends testing the game. If a boss was too hard, I could slow the rate of attacks coming out.

For the player, I added in a simple melee attack on a short timer and a ranged attack that would be enabled after the first boss. I wanted the player to force the player into melee range for most of the time, so I limited the ranged attack by making it 4 projectiles that re-spawn on a timer. This seemed like a good solution for making this a more melee focused game, but the player could also just wait the timer out if they needed to. There was also a companion from the second boss similar to something from Binding of Isaac that would shoot at the boss on a timer.

The Theme

As for the theme, I added in a mechanic where after each boss you can exchange one of your hearts for an upgrade. This was one of the weaker parts of my game. I didn't put much thought into it and the upgrades weren't super impactful.

Conclusion

Overall I was pretty happy with the game. No one mentioned any bugs in the comments, which is awesome. Most people also seemed to enjoy the pixel art and game play. The audio was added last minute and was not the best, so that's definitely something I need to work on next. I was very happy with how the singleton managers ended up working and will be moving forward with that approach in future games.