Snow Brawl – NESDev Compo ’23 Post Mortem

I occasionally browse game jams listed on, and after finding the NESDev Compo (2 weeks before the deadline!), I thought it would be cool to learn how to make a game for the NES. I had a vague idea of how making a game for the NES would involve working with very strict limits, so my goal was to learn as much about NES development as possible with the time remaining.

I ended up discovering NESFab, a relatively new language made for NES game development. If I had started earlier, I might’ve considered 6502 assembly, but with only 2 weeks left, and seeing how NESFab looked more familiar to me, I went with that.

For art, thanks to help from the NESFab Discord server, I learned about NAW, a graphics program made specifically for the NES workflow. I’m used to working with Aseprite, but having a specialized tool like NAW ended up being really helpful and saved me a lot of time.

The Idea

I wanted a simple concept for my game, something that’ll let me focus on learning the tools and not worry too much about complex game mechanics or art. Winter is coming soon, so I thought about snowball fights and how simple they could be as a digital game. You have two players throwing snowballs (projectiles) at each other, sometimes with objects around to hide behind (walls, snow forts, trees, boulders). Collision is simple, being only between the players, snowballs, and solid objects.

To avoid having you spam-throw snowballs, the game can have a snowball limit, but then how do you get more snowballs? Well, in real life, you just grab more snow from the ground. In the game, I decided to make the snowballs leave behind a pile of snow that either player can dig to get more snowballs. I also made snowballs disappear when hitting a player, which means the further into the game you are, the more careful you have to be about your snowballs.

Development Process

Working with NESFab was challenging but pretty fun. Having worked with PICO-8 before, I felt some similarities in how to go about implementing certain features like tile collisions, color palette changes, and animations. On the other hand, I think I was too focused on PICO-8 comparisons that it influenced my decision to making the tiles and sprites 8×8, leading to some issues.

PICO-8 vs. NES

PICO-8 has a 128×128 resolution. The NES has a 256×240 resolution. 8×8 sprites fit well with the former resolution, but with the latter they’re way smaller than I was imagining. While you could definitely make an NES game with that sprite size in mind, you’ll have far more space left to fill up with other things. It wasn’t a big deal overall though, but I did read about metasprites (meant to be used for combining several 8×8 sprites together), which I ended up using in a hacky probably-not-intended way to animate the player, but oh well.

Another issue I encountered was the 8-sprites horizontal limit the NES has. Both players have 8 snowballs, and snowballs can spawn snow piles, which are sprites themselves. If enough snow piles are in a horizontal line, then you’ll start seeing some of those sprites disappear. Unfortunately, I couldn’t come up with a good solution for this issue besides lowering the snowballs count and player hp. This issue isn’t a thing in PICO-8, so it caught me by surprise when I noticed it. NAW actually has a toggle to show this sprite limit, so I should’ve been using it more in my mockups.

Sound Effects and Music

I didn’t have enough time to add audio to my game. I wasn’t too surprised since the coding itself was challenging, but now that I’m more familiar with NESFab, I can spend more time learning audio tools in a future project (FamiTracker seems like the next thing to pick up).


I met most of my goals for this jam. I learned how to make an NES game, and although I didn’t get to the audio parts, I’m much more prepared to tackle those next time. I also didn’t get to add all the features I wanted for the game, like more maps, more objects to hide behind, and a single player mode with enemies, but I can always work on those in my own time.

Leave a Reply

Your email address will not be published. Required fields are marked *