Matt Hughson (NES & GB Dev)
banner
mhughson.bsky.social
Matt Hughson (NES & GB Dev)
@mhughson.bsky.social
Game developer making new games for old systems, such as the NES and Game Boy! #nesdev #gbdev

• From Below (NES | 2020)
• Witch n' Wiz (NES | 2021)
• From Below Pocket (GB | 2023)
• Super Sunny World (NES | TBD)

MORE: https://linktr.ee/matthughson
Oh yah, I misread that haha
November 11, 2025 at 3:10 AM
Oh really? That's awesome. I actually didn't even notice the attract mode. Is it in the Demo?
November 10, 2025 at 11:29 PM
Looking forward to my perfect review score 😁
November 10, 2025 at 11:28 PM
And that's how the attract mode works in my upcoming NES platformer, Super Sunny World, a love-letter to Super Mario Bros 1.

If you want to play Super Sunny World, please WISHLIST it on Steam RIGHT NOW!

store.steampowered.com/app/2772980/...
Super Sunny World on Steam
Super Sunny World is the ultimate love letter to the platformer greats of the 8-bit era. Jump, bump, and kick your way through 8 worlds of pixel-perfect platforming, cute characters, and exciting powe...
store.steampowered.com
November 10, 2025 at 6:18 PM
It works for 2 reasons:

1st, the game is deterministic; every time it is run the exact same thing will happen (given the same inputs).

2nd, luck! I wrote this logic, and it mostly worked 1st try. I tweaked values until it could make it through the 1st enemies, and it ended up completing the level!
November 10, 2025 at 6:18 PM
The comments in GREEN explain how it works.

1. ALWAYS move right
2. Jump every 64 frames
3. WALK for 16 frames, then RUN for 48 frames.

That's it! But why does this work?
November 10, 2025 at 6:18 PM
There is no "player AI" figuring out what to do. I don't even record inputs and play them back.

This is the entirety of the player logic for attract mode! Basically 10 lines of code.
November 10, 2025 at 6:18 PM
There is no universal solution for implementing an Attract Mode, and games choose a wide variety of designs, from gameplay to story to little animatics.

Super Sunny World 🌞 implements a classic gameplay loop.

How I do this is deceptively simple; only about 10 lines of code!😈
November 10, 2025 at 6:18 PM
I post lots of behind the scenes information about how NES games work, so please give me a follow if you enjoy this kind of content!

If you want to be notified when my NES platformer comes out, please wishlist it on Steam!

store.steampowered.com/app/2772980/...
Super Sunny World on Steam
Super Sunny World is the ultimate love letter to the platformer greats of the 8-bit era. Jump, bump, and kick your way through 8 worlds of pixel-perfect platforming, cute characters, and exciting powe...
store.steampowered.com
November 8, 2025 at 11:19 PM
And now when we run the game, and open the graphics debugging tools, we can see the final result (left), the background tile layout that matches NEXXT (center), and the graphics data from YY-CHR (right).
November 8, 2025 at 11:19 PM
And the final step is to simply load the graphics data into memory at the right time. In my game that's a simple function call that I pass in the byte array of layout data. At the same time, I will run some code to swap to the that new bank of CHR memory we created in YY-CHR.
November 8, 2025 at 11:19 PM
To include the action graphics data (the stuff we drew at the start in YY-CHR), I simply include the same CHR file that I used in NEXXT. It just needs to go in the right segment of memory so that the NES functions properly.

In Super Sunny World, there are 32 banks of CHR data!
November 8, 2025 at 11:19 PM
Now I can include that byte array anywhere in my code to access the image layout data. Now remember, this is just the layout data (which tile goes where, and what color). It is not the actual graphics!
November 8, 2025 at 11:19 PM
If you code at all, you will likely see that this is simply a c-style char array. Nothing fancy. There is RLE compression being done so that the array is smaller, but it's really just a big list of numbers.
November 8, 2025 at 11:19 PM
Now that the screen has been designed, it needs to get into game!

Step 1: export that Canvas as a byte array. This is a long list of numbers where each number represents a tile in the tileset (eg. 0 would be the first tile, 1 would be the next tile). NEXXT does this for me!
November 8, 2025 at 11:19 PM
The artwork in this demonstration was created for my game by the artist, @michirin.bsky.social!
November 8, 2025 at 11:19 PM
After the tiles are placed, I then set the color to use for each region of the screen, called "attributes". On the NES I can select from 4 palettes at a time, each with 3 colors each, and shared "background" color (in this case, dark blue).
November 8, 2025 at 11:19 PM
That image file is then imported into another tool called NEXXT. You can see the image data on the right side labeled "tileset". This is a kind of "palette" where I can select a tile and "paint" it to the "Canvas" on the left. That canvas will be what we see in game.
November 8, 2025 at 11:19 PM
It starts in a drawing tool called "YY-CHR", where the tiles for the background are drawn with just 4 colors. The image itself does not contain any color at this point, so the tool allows you to swap palettes on-the-fly to see how things look.

This gets saved to a CHR file.
November 8, 2025 at 11:19 PM
Actual NES game!
November 8, 2025 at 3:16 PM