A (Finished) NES Game!
Those who follow me on social media or elsewhere may already know, however I recently released a brand new game for the NES. (Yes, the Nintendo Entertainment System from the 1980s) It is free to play online, and also an entrant into the 2016 NESDev Coding Competition.
It’s a typical sidescroller, with a very obvious nod to the game Eversion. (Which is fantastic, and worth trying if you’ve never played!) You play as a duck, who was tragically removed from his own timeline, and needs to find his way home.
If you like retro gaming at all, give it a try! Games in the competition will also (eventually) be available on a multicart, playable on a real NES, too! Source code will be on Github once I have a little time to document some of the messier stuff. I’m hoping this will be a helpful reference to future NES developers.
Having just finished, I’ve also taken some time to reflect on how the game went, so for those who want to know more, click the full post.
Okay, you made it this far. Rambling ahead…
Also note, there will be spoilers below. While the game’s story isn’t great, if you want to figure it out for yourself, play it first!
The first thing that I think about is the gameplay. With a few noted exceptions, the game’s engine felt pretty solid to me. The various pieces – collisions, time/dimensional travel, etc all come together to form a very playable game. (Though, it could be said the collisions were pretty poor, and the movement needed help)
Another thing I’m proud of is the music. While it’s certainly not amazing, and perhaps not even good, it’s definitely the best thing I’ve produced, and I’d like to think it doesn’t detract from the game. My hope is that the tracks for different dimensions helped make them feel distinct to the player. From what little I’ve seen of people playing it, this worked.
The Not So Good
The game definitely has some shortcomings, though hopefully none enough to kill it. The first is the story. The story is abysmal. I thought my art or my music would be the worst piece of this game, but somehow I managed to make those borderline acceptable. I had a story in mind from the beginning, and while I think the story I tried to tell was reasonable, the way I wrote it in the game just didn’t tell the story the way I hoped. I should have made this a priority early on, but once I had the basic idea in my head I figured I’d be able to put it into good words. I think the biggest thing I didn’t anticipate was how hard it would be to cram my words into the limitations on what can fit on a screen (and what a player is willing to read) on a 256×240 pixel screen. As you might notice, I tend to be very… well, verbose in my writing. Much like every other part of development for the NES, you have to carefully tailor everything for the limitations of the system, and I definitely failed here.
On a related note, the ending feels underwhelming – mostly as a result of the lackluster story. I’d also like to have developed a more full feeling ending theme – what I had was just a rehash of the first theme you hear in the game. While that could have worked with some more finagling, I was never quite satisfied with the results.
Another thing that I’m concerned about is how obvious the warp zones are. The only thing I really do (as of 1.0) is darken the screen in them. While this is enough when you know to look for them, it’s pretty easy to miss the first time. I really didn’t want to tell people explicitly what to do here – that would take the fun out! (Plus, Waddles doesn’t know he has this power yet.) Still, making these zones stand out more would have been good. From what I’ve heard, we will have some time to polish entries before the multicart is published, so I may take some time to improve this – folks have suggested some simple particles and a sound effect while you’re in the zone. Both of these should be doable.
My biggest mistake was probably not having anyone test the game early on. I had a few friends try it out, and I don’t think there was anything earth-shattering that was missed, but people playing earlier on might have made a few things more obvious. For example, the lack of clarity around teleport zones was immediately apparent during a later play test. There were also some minor level bugs, such as one spot where lava can take you out when you’re perfectly in bounds due to a level design gaffe – these could have been avoided. I was really focused on making the engine solid first (I still had some pretty regular ppu glitches until 2 weeks before submission or so) but slapping a “work in progress” on it probably would have been okay. Part of the challenge was also finding people willing to give a half-done game a try, but I could have done more to put it in front of people, such as post on NESDev.
Another mistake was neglecting certain engine features until late in development. The worst problem is the hitboxes for tiles that cause damage, such as lava and fire. I hadn’t planned for this when building the feature, and I put off fixing this until late in the game. When I looked at it, I realized I introduced a lot of risk of introducing other features by changing this behavior, so I ended up changing my level design to severely limit the times when it would affect the player. (Ever notice how lava is never at the same height as the ground around it?) The hitboxes on the fire are the worst due to their size – you can be a full 4-6 pixels above the fire sprite and be killed by it, which really stinks as a player. I also had a planned mechanic where you could extend your jump by flapping your wings, but I put off adding this so long that I’d have had to redesign every single level for the feature. (So, it was never implemented)
Yet another big mistake was the level design. I started with a few levels that had somewhat clever puzzles, and interesting uses of backtracking and the warp mechanic. However when I got to later levels, the designs got more straightforward, and focused more on platforming. I really wish I’d spent more effort on the designs for later levels – there was a lot of lost potential there.
The last one is much simpler – the title screen is way too simple. It serves its purpose, but doesn’t feature the main character, and is nothing short of boring. It is one of the first things people will see while playing the title screen, and I really could have afforded it a bit more love. I brought the final title screen in pretty late – perhaps if I had spread the art-heavy stuff more evenly through the life of the project would have helped. (Much of the art and music weren’t done until the last month or so.)
Other Lessons Learned
One thing I found was that I felt really limited by my music engine. Famitone2 is amazing, and really powerful. It fits a lot of music into quite a bit less space compared to other engines, uses less cpu, and significantly less memory. (At least in the zero page, where it really counts.) A talented musician could no doubt make an amazing score targeted at it. That said, I am an absolute beginner when it comes to composing for the NES. I very often found myself creating something I thought was nice, only to find out I had tripped over the note restriction again (C1-D6 only – anything else and the export will fail!) or tried to use some feature that it didn’t support. While I was able to tailor my music to work, I do wonder if I could have done better with the more complex famitracker engine, and just used all of the features of the tool to the best of my ability. (Since I started, the author of famitone2 published an example using famitone2 for sound effects, and famitracker for music, which could have been perfect!) Nothing I would have changed this time around, but something to consider for another project. (Perhaps one with more lax restrictions.)
I also learned a bit about how I work. About midway through, I found I wasn’t making quite the progress I liked. I had days where I’d make monumental amounts of progress, but then days I’d accomplish nothing, and had no motivation to work on it. I decided to make sure I made at least one visible (to me) improvement to the game every day. That could be something as complex as a new engine feature, or as simple as designing/improving a tiny section of a level. I kept this up until the day I submitted with very few exceptions (I didn’t do any updates during Magfest, for example.) and this helped keep me motivated. I strongly recommend trying this for anyone struggling in that way – seeing any amount of progress towards your goal feels good, and at least for me that was a huge motivator to keep the project alive.
Despite the mistakes and bad parts, and despite the lackluster placing in the contest, I’m pretty proud of how this game came out. It’s been quite a while since I’ve taken a project from start to finish in a reasonable amount of time, and not lost focus on it for something unrelated. Once people figure out the controls (including the teleporting bit) they’re off, and while the game provides a challenge it’s completely beatable in a single session. (Which is a good goal for a game on a multi-cart.) In my opinion it also has some of the same feel from the game that inspired it (Eversion, see the very top of this post) which is a nice plus. At least one play tester that was familiar with Eversion was able to call out the influence before I had made it obvious in the credits, so that seemed really positive.
If you got this far and have any questions about the game (or just want to chat about it) feel free to reach out – I certainly don’t mind talking about it.