Making of Soulstand
As the course was not one of the biggest ones in computer science, we were advised not to use more than 60-80 hours per person to finish the project. This suggested time limit defined the scope for our game: it should be a little game where game design and asset creation wouldn’t take a huge portion of time. Hence we came up with a concept of a classic avoid-’em-up 2D game with 8-bit graphics. In the beginning we named our game Last Stand, but as we came closer to making the game public we changed the name to Soulstand. This was because we found lots of other games named Last Stand in various game portals and markets as well.
The idea of Soulstand goes as follows: Your job is to defend the soul of a knight who has fallen in battle. Bad spirits try to eat this poor soul away as they emerge from four directions. In order to defend the soul you must hit the bad spirits away by using your sword and by utilizing various powerups. The game starts slow but speeds up the more bad spirits are smashed on the horizon. Finally – when the level of difficulty is too much to handle – you must drop your sword and let the soul vanish to its eternal rest. The knight turns into a tombstone and the game shows your score. The score is saved in case you are willing to re-attempt and hone your sword skills.
When we started developing Soulstand we did the division of labor as follows: Matti gets to design the game and create all the pixel art and I get to do the programming. I was already familiar with creating quite a good project structure using Phaser JS so getting the prototype run didn’t take long. In a couple of hours we had a nice, idling sprite of a knight floating in the center of the screen and some enemies approaching it repeatedly. When I pressed Right on my keyboard, the knight swang his sword according to my input, and if the sword hit an enemy, it made it disappear. The soul of a knight – a new game character – was born! Easy peasy, you might say. It was quite easy, in fact, until our common enemy named The Feature Creep came to pay a visit.
In my restless dreams I saw that thing, approaching me and mumbling hella lot of game ideas. In the first night it whispered: “You made bad spirits disappear by making the knight hit them with his sword. Cool! But lazy.. Can’t you make it any more fun? I want it to be more fun. Make them fly!” It didn’t let me go until I told it where Matti lives.
After that night I woke up, paralyzed by this thing whom I first thought to be my friend. I felt an urging need to write new code. New variables! New functions! New classes! Thus Soulstand’s scope exploded, and The Feature Creep was well fed and happy. I made enemies fly by rotating them around their axises on hit, and I also tweaked the game’s difficulty to have a little bit of randomness. Me and Matti came up with a lot of new ideas. In the end we implemented these features to Soulstand:
- Critical Hits (accurately timed hits which give extra score)
- Bonus mode (activates by comboing critical hits 10 times, increases score per hit)
- Flash Strikes (power-up, long distance strikes to all directions simultaneously)
- Worm Holes (power-up, sucks all spirits from one direction for 5 seconds)
- Bubble Shield (power-up, +1 armor point)
- Enhanced Game Over -animation (night falls and the knight turns into a tombstone)
Here’s some features we didn’t include in the game:
- Level selection
- Boss fights
- Online scoreboard
Luckily we managed to decide what want to create for the game for it to be more fun and what we don’t need or what would take too much time. These features, however, took us plenty of time and we had to continue the project after the course for quite some time. The course version of Soulstand had easier difficulty and only the bubble shield as power-up. Still, we got great grades since Soulstand consisted of almost everything that beginner level programming courses are about: classes, object pools, versatile data structures, input handling etc. The final version of Soulstand had to wait for many, many months for it to become complete. This was due to the fact that me and Matti developed the game only randomly aside our main jobs. Sometimes we were motivated and sometimes we were not. What usually decreased the motivation on my part were the last bugs of Soulstand, which were quite nasty. Sometimes, for example, when my score was so big that everything moved in super speed, some spirits started to behave differently, like they were in some 2x speed invulnerability mode. Occasionally some dead sprites could also “flash” in the game world for a nano second… These bugs still give me nightmares. If I recall correctly, Soulstand is my #1 project when speaking of how much time I have used for fixing a single bug.
But hey, we made it! Soulstand is complete! Developing the game from 95 % complete to 100 % complete was worth the effort and taught us so much. In various articles and books I’ve read many developers recommend finishing your games no matter what and they also encourage you to not give up on your projects. I completely understand this now. It’s a huge learning opportunity and it requires dedication and perseverance. Even though Soulstand may seem like a little game, it’s big to us, and it stands proudly and reminds us that we have developed a nice 5-minute-game with a set of thoroughly considered features. It’s great to continue from here.
Soulstand is currently playble on itch.io.