Making a Playdate game in a weekend for a jam!
I HAVE FINALLY DONE IT. So many abandoned games lay in my waste but it has always been a goal of mine to make some kind of video game. It's an art form I've really come to appreciate more and more especially as I've started and failed to complete so many over the last decade or so.
Making games is hard. A new kind of hard. Coming up with what feels like a compelling idea is a challenge in any art but making a game feels like it demands something much more -- the difficulty in hooking and maintaining player engagement sounds similar to, perhaps, writing a movie or a song but -- because the player is an (inter)active participant in the piece the maker is presented with a new and task of creating a balanced challenge for the player. The extra addition of interactivity and the expectation players have when installing any kind of video game really narrows the sweet spot of success.
Then of course there's the more obvious difficulty of just how much raw work goes into game making. Game logic must be programmed, possibly even physics simulations; art must be created -- that means the concept of characters to all the possible animations to the background to the menu screens; music must be written and recorded to fit the game; sound effects have to be carefully designed and implemented. Not only do all of these needs span across multiple (and deep) art specialties, the scale of all of it all even for a small game is overwhelmingly intimidating...and it grows exponentially with game complexity.
Luckily there's a lot of tools out there to help bootstrap people into game making. Fully-fledged and ubiquitous game engines like Unity and Unreal seemingly make up a large portion of indies and even some AAA games and the former even has an OpenSource alternative in the form of Godot. Engines like these at their very basic help with scene management, playing and rendering art/music, input handling, and other functionality that just about every game needs. Many (like the ones listed) go way further, adding physics simulation, lighting, pathfinding, and countless other useful tools. ALSO for the engines mentioned there are robust collections of extensions and tools other developers have made in order to improve workflow even more. That is really all to say that the complexity of making games is softened at least a little by the existence of flourishing (& free) communities and tools as game making has become more accessible for folks of all skill levels.
My first game sits on the shoulders of many tools, the first being the platform itself: the Panic Playdate
What a lovely little console. Y'all know I love specialty and novel hardware and I'm so glad there are designers out there still making and supporting stuff like this. The main oddities are thus: the playdate has a 1-bit (black and white only) screen with no backlight that reads closer to eink....and there's a crank. Pretty "quirky" or whatever! I preordered one after they were announced and waiting my long ass time to get one (the parts shortages ahhhhhhh). Since then I've really enjoyed lurking the communities and playing as many games as I can manage -- some are truly inspiring!
The extra great thing about the playdate is that it is also a devkit. Anyone can just download the SDK, start making games, uploading them to their device, and sharing them with folks to test. It is so encouraged to make games for this console that the company who makes them created a web app for people with no programming or game dev knowledge to jump right in (called pulp). You don't even need to have a playdate device in hand yet to give game dev a try on the platform -- the SDK comes with a simulator!
I feel that the experience developing for the playdate is not unlike the famous PICO-8. By imposing many limitations on the game designer and providing an easy-to-iterate experience the playdate developers are encouraged to be focused but explorative. Especially with the SDK's Lua support, trying out a quick idea just to see if it works on the console is a breeze and makes it easier and more fun to "feel out" what works as you discover the potential (or lack of potential) for an idea. After many failed attempts to build games in the larger engines mentioned earlier, this felt like a great place for me to be.
But I still left many unfinished playdate scribbles unfinished in my quest. I started a little pinball game, a tattooing minigame, a rhythm game, and I even tried to create an impuse based physics engine to use in other projects. None of them quite got finished or panned out how I liked.
Then came a nice set of coincidences. My girlfriend decided to head home to see her family one weekend and happened to tell me the moment I saw a tweet reminding me of PlayJam4 happening over the same few days. Daylight savings time had just ended and there's a lot less daylight and warmth to go around outside so I would have plenty of time to try and complete something for this jam. The theme was announced that Friday ("Your Time Is Up") and I got to scribbling.
All of my previous (unfinished) playdate projects had been written 100% in C for my own stubbornness and learning opportunity. I'm a criminal when it comes to premature optimization and I don't get to program that low level very often so that had so far been my language of choice for playdate dev. That was going to change for this, though, as I knew I needed to be able to iterate a lot faster and not get hung up on memory issues. So, I looked around all the sample apps in the PlaydateSDK that use the Lua language and checked out existing tools that might exist for that environment.
Lucky for me, switching to Lua opened up a ton of libraries and examples to work from as it seems most stick to this environment for playdate dev, at least as of now. For my project I ended up using the Noble Engine which just made for really simple "Scene" and input management. It also nicely provides a template repository so I just cloned that and got to it! The one other library I used was AnimatedSprite which simplifies playing sprite animations from an imagetable (a collection of images in the playdate sdk) and adds state management to sprite animations. I think NobleEngine has its own animation system that I probably should have looked into deeper but this worked out fine for me.
With the theme being declared, "Your Time Is Up," the fastest idea I had on paper was only "something about a grim reaper." There was a vague image in my head of a 2D platformer type game where the player would play as a grim reaper and control their scythe with 1:1 crank movement....What came would be a bit different in gameplay but the overall idea stuck.
While I had to use a lot of pre-existing assets, I did end up drawing quite a bit! Like many, I love aseprite so that's my pixel art editor of choice. I ended up doing the art for the main player character (a grim reaper sort) and their weapon.
For other character art I would have to leverage opengameart a lot. I am not super speedy at pixel art (or any good at it in any other way) so being stubborn about painting every pixel was not going to get me across the finish line. Specifically for this game I grabbed Stendhal Ghost and MV Platformer Male.
I also did all of the environment pieces, health bars, secondary screens (game over, etc), and all the metadata art for the game (images that show up on the device for the eventual installer). Showing some examples here will also expose that the game's eventual name was Scythe Shepard, though that was a pretty last minute decision.
Lastly I did also use Pixel FX Designer to create a little particle explosion sprite animation for the ghost death.
Initially I had imagined a single screen game with a flat floor and 3 static platforms with the idea being to survive as long as possible. There would be enemy characters appearing on the edges of the screen and following the user to attack them -- the player would have to use the crank to swing their scythe and kill an attacker. After a short time the dead attacker would turn into a ghost and start floating up towards the top of the screen. The player would need to switch to a "Net" weapon that behaved the same as the scythe but was used to catch ghosts and stop the ghost from leaving the top of the screen. This would give the player two game-crucial goals to balance -- don't get killed by the attackers and don't let too many ghosts get off screen. I felt this would provide enough healthy stress to the player to make it feel like a real game.
As the deadline loomed, though, I ended up changing the verticality of the idea a lot to cut down on (mostly) art work -- adding jumping animations to all the characters was a bit of a non-starter.
So, the "Net" weapon got scrapped, as did the 3 static platforms. Instead of the net to catch the ghosts I added some Speaker looking devices to the top of the screen and forced the ghosts to try and escape out of the middle there. Once the ghosts were close enough to their escape the user could activate the little speakers and they would kill any nearby ghosts.
This ended up being the entire gameplay loop as I was otherwise occupied with bug fixes, art, and sound; the only thing left to work out was the "difficulty curve." I ended up making it so that the game was played in "waves" -- each wave would spawn n human enemies where n was the wave number. The number of humans spawn at once was n/5 rounded up -- this meant that every 5 levels the game would increase the enemies spawn at once by one, making the player have to deal with more simultaneous threats as they progress. Simple, but effective enough in test play ... my biggest concern was players having too easy a time and having to put down the game out of boredom before it overtook them.
Speaking of play testing, this was an exciting thing to do! I wish I had more time and testers, of course, but this felt like a big moment....even if it was just my sister/BIL.
Let's get this out of the way -- I didn't have time to make music! This bums me out greatly, but I simply ran out of time and really feared making a quick loop that was just dreadful to listen to over and over. I also felt that adding music would require adding a "Settings" screen to allow the user to toggle the music/on and off and I didn't want to add that work either.
What I did gladly get to do is some quick sound design on the eurorack gear. Nothing very complex but here's a quick video of me trying to find the last bit of the sound that would play when a player swung the scythe and hit something (note: you may need to turn your volume up a little, this might be quiet.)
I really enjoyed making all the little sounds for this and next time hope to have more time to experiment and make more interesting and unique fodder -- such a unique challenge!
Submission and voting
After a couple days of constant work, I turned in my game along with about 20 other folks! Some of these I was really excited to try out since some devs were posting work-in-progress stuff on twitter.
Now that everyone was submitted, it was time for a week-long voting phase where everyone (participators and spectators) were encouraged to try to play and rate the other games on the categories of "fun," "creativity," and "use of console." Each game also has a comment section in the jam -- these were immediately readable while we would have to wait the full week to see any results from the ratings.
I got way more feedback on my game than I expected during the voting phase. I am often a little disappointed on the amount/depth of feedback I get for music so this was really fun for me. I think what helped draw in the reviews, though, were of course the contained context of the game jam, the specialty of the hardware, and the fact that games are interactive and much easier (I think) for someone to have more concrete responses to. Either way, it makes me excited to try another jam in the future! The whole community for both game dev and especially playdate dev in my experience has been so positive :]
That written feedback was so valuable to me I almost forgot about the week long numerical/categorized voting... I did end up getting 4th (out of 21) overall which ain't bad! Didn't come on top in any individual category but that doesn't surprise me or anything. Just happy I finished and people tried the game.
So happy to have climbed this mountain, even if the game is pretty small. It feels real!