MAGFest 2026

gm112
@ MAGFest 2026 was an awesum possum grade awesum event! The whole trip happened due to a desire to meet people I knew from Zelda Fan Game Central. There was a lot to unpack, and I felt that now the time is right to finally decompress everything that had led up to going to MAGFest, and the OoT2D Rick Roll Demo.
The Beginning
During a conversation with Steve, we had talked about Ocarina of Time 2D and how nice it would have been to do a panel on it. To give a spotlight to the community of where OoT2D was born. That discussion evolved into a project that went down a rabbit hole of learning how to make a game on the Game Boy. The idea was to make an Ocarina of Time 2D demo that would play into the hopelessness of Demo 4 (I will write an article about this later). And also, given how many assets were created by other members at ZFGC, I wanted to make a box that would include content made by members of Zelda Fan Game Central. Unfortunately, that idea fell through due to time constraints and lack of responses.
The plan ended up evolving into:
- Make Rick Astley's "Never Gonna Give You Up" sing on the Game Boy
- Tile out Kikori Forest
- Add NPCs and script to invoke rick roll
- Profit???
MG-Zero and gm112 combine their half-braincells together to form one braincell
Thankfully, I had already had been helping another friend of mine, Aaron, with theirown Game Boy project, Dearborn, which has a similar playstyle to 2D Zeldas. Aaron had been working on Dearborn, and then reached out to me to help with developing the game. Since we were in pre-production, we experimented with a couple of different ideas. One was a turned based combat system demo, which ended up being scrapped due to the original design being an action adventure style game. I cannot wait until Aaron is ready to show the world his game!
Christmas was approaching soon, so I made the decision to take the time to develop the action adventure mechanics into the game and fork off into our glorious rick roll for MAGFest. It seemed like the perfect fit for building a version of the game that would rick roll the player! :D So, off I went to putting together the demo! Steve (MG-Zero) would later go on to help create the cart label for the rick roll.
Mwahaha >: )
Why Rick Roll, you ask? Well, ZFGC had a long history of loving memes, even having a presence on YTMND! And the community had been edged enough about the release of Demo 4 or some other variation of OoT2D that how could it NOT be Rick Roll? Rick Astley was always there for us, after all.
From Dearborn to Rick Roll
Copying Dearborn's files into a new project gave me the starting point for creating Link's Room, using tiles from Oracle of Ages. My thinking was to start from the very beginning, and move on from there. GB Studio was very familiar to me, since I've used Game Maker in the past. It also takes care making sure you're not getting caught up in how tedious working with such an old console can be! But, I got a little carried away. :) One of the first things I did was bundle the cli tool so that we did not have to build the cli ourselves. At the moment, the changes were wiped away in a rebase I did, but you can see the fork here.
So one of the first requirements I had to handle was reworking the camera to scroll sections of the map in the same style as 2D Zeldas, and to implement a tile streaming mechanism for allowing for arbitrary map sizes. At this point I had forked GB Studio and began adding things to help with overcoming some of the rougher workflows for the type of game we were developing.
Robert Donman made a good video that talks about the camera system in GB Studio. This was the first approach I attempted. But I felt it could be improved. The approach was limited to the available VRAM for each scene, since you had to construct the world using smaller grid single-screen maps. And, I wanted to be able to have arbitrarily sized maps. Exporting the engine, I wrote a routine that would stream chunks. And a custom camera was setup to remove the requirement of using trigger volumes in scenes to control camera scrolling. Now was time for actually creating maps!
The Label: What's up with that ESRB rating?
Using a label template from Dinierto, we went back and forth on how to design the label. We settled on going for something that could look like a legitimate cart from far away, but as you took a closer look, something should look off. ;)

Special shout out to Steve for the rated D for Dick ESRB rating idea. >: )
Level Design: Scale in a top-down game on the Game Boy
Majora from ZFGC had made a complete OoT2D Map in ALTTP Style. Which it worked as a great reference! ZFGC also served as a great place for references, since I had access to the assets archive.
The first problem I came across with mapping was scale. Maps simply were too big. Even with a 2D representation with another 2D Artstyle, the scope of the world just conveyed differently with the resolution of the Game Boy. After a bit of trial and error, I learned how to reduce the size of the maps to work within the Game Boy's resolution.
Level Design: Color palette limitations
Another problem I ran into while mapping was learning how to break up tiles vs sprites. Sometimes if you wanted to express some kind of visual element, using background tiles may not be practical due to the choice of 4 colors per- tile. And while you can use multiple background palettes, you may be unable to use the correct palette for all tiles within an 8x8 tile block. This is where sprites can help. For The Great Deku Tree, I used the Maku Tree sprite from Oracle of Ages, and when implementing the Tree, I separated the eyes from into their own sprites and wrote a routine to control rendering them. This also let me place additional sprites for flowers and such on the Tree. Though, sprites aren't always the best solution for this because you can run out of sprite slots per scanline! Which segways into another technique, you can use RGBGFX to write a script to process your map scene in such a way where it can help overcome the color limitations of the background tiles. My recommended approach is to create a shared tileset with some duplicate tiles that are modified, because then you can have more control over the color palette of the background tiles. It is also a great tool to know for Game Boy development! : D
Figuring out the audio situation
GB Studio noted that audio had to be formatted a certain way. Using yt-dlp and ffmpeg from the AUR and started with a script to generate the WAV files.
#!/usr/bin/env bash
set -e
INPUT="$1"
OUTDIR="$2"
if [[ -z "$INPUT" || -z "$OUTDIR" ]]; then
echo "Usage: $0 input.webm output_dir"
exit 1
fi
mkdir -p "$OUTDIR"
ffmpeg -i "$INPUT" \
-filter_complex "\
[0:a]\
dcshift=0,\
pan=mono|c0=0.5*c0+0.5*c1,\
highpass=60,\
lowpass=3300,\
equalizer=f=400:t=q:w=1:g=-1.5,\
equalizer=f=1200:t=q:w=1:g=1.2,\
equalizer=f=1800:t=q:w=1:g=1.8,\
equalizer=f=2500:t=q:w=1:g=-3.2,\
volume=3.0\
[aud]; \
anoisesrc=color=white:amplitude=0.0007 \
[noise]; \
[aud][noise]amix=inputs=2:weights=1 0.15:duration=shortest,\
alimiter=limit=0.86\
[out]" \
-map "[out]" \
-ac 1 \
-ar 8000 \
-c:a pcm_u8 \
-f segment \
-segment_time 3 \
-reset_timestamps 1 \
"$OUTDIR/never-gonna-give-you-up-%03d.wav"
ls -1 | wc -l
# 72 - the number of output files
The ffmpeg parameters above were approximated by using Audacity to experiment with bit crushing the WAV files and trying similar results in ffmpeg. The parameters were found by hugging the ffmpeg filters documentation and thanking it for the help. They probably are far from optimal. It was a fun experiment and the results appeared to be acceptable.
With around 72 output files, I removed 3 of them
and replaced the last
one with a silence file. The next step was to see if we could playback the wave
files. My first attempt involved queuing up two GBVM VM_SFX_PLAY commands,
which didn't work on its own. Then I tried using a C-style array, and manually
using a DMA transfer to the APU's Channel 3. This worked, but my implementation
stole the CPU.
Going back to the drawing board, I felt the VM_SFX_PLAY approach could work.
Being the simpleton I am, I remembered that for the demo, I implemented a
function that played back a sound effect on the noise channel on a separate
script thread for a sword swing sound.
If that worked, then surely I could do the same thing, except with many WAV files!
.macro PLAY_WAIT bank, snd, mask
VM_SFX_PLAY bank, snd, mask, .SFX_PRIORITY_NORMAL
VM_SET_CONST 0, 174
VM_INVOKE b_wait_frames, _wait_frames, 0, 0
.endm
VM_MUSIC_STOP
VM_MUSIC_MUTE 0x0F
PLAY_WAIT ___bank_sound_never_gonna_give_you_, _sound_never_gonna_give_you_, ___mute_mask_sound_never_gonna_give_you_
PLAY_WAIT ___bank_sound_never_gonna_give_you__0, _sound_never_gonna_give_you__0, ___mute_mask_sound_never_gonna_give_you__0
; ... etc. you get the idea.
VM_RET_FAR
This bone headed bit of code was stuffed into a GBVM Script in the project file, and thankfully it was good enough to handle playback. Shoutouts to the GBVM and GB Studio developers for making this possible! Psst. See if you can find the hidden easter egg in the ROM or code!
At this point I began testing in other emulators.
Emulator Accuracy
This has to be called out, but upon realizing that I might have a problem with audio playback on hardware, I resorted to testing the ROM on multiple emulators. Up until this point, I had used SkyEmu for testing. But, it seems every other emulator I tried, had issues with audio playback. Audio pops, no playback, etc, it felt like maybe I was walking into a brick wall once I tried this on a real Game Boy. Many hours and nights were spent trying to figure out what was going on.
At this point my shipment of flashcarts had arrived, and I was able to test the ROM on real hardware, and all seemed well! At this point, I wrote off the audio issues in other emulators as something that's just out of scope to deal with, especially given the simple approach to playing back Rick Astley's "Never Gonna Give You Up". ;p
A few months pass...
Departing
The day finally came. It was a cold winter morning, I had booked my flight really early so that I could get into registration early for MAGFest. My MacBook Air M1 was getting loaded up right before I left for the flight with a simple scp copy command. After packing the last of my luggage, I loaded the laptop in my bookbag and left for the airport.
Then, I arrived on the airplane. Opened up the MacBook loaded up GB Studio and then, "Oh fuck", I thought to myself.
![]()
Turns out, only a few of the files had came over, since I had completely ran out of disk space! With only an hour, I scrambled to slap together a new demo. I had used the RPG template project that was included in GB Studio. Then, grabbed the Tiled maps and any assets that came over and created a small map that could work for the rick roll. Thankfully the converted wav files had came over, the code and for the music playback was just a few lines of code and also came over!
The airplane I was on happened to be a smaller passenger plane, so it was quite an experience remaking the demo while crammed into a small space. My first priority was to make sure Rick Astley still sang, and after doing that, using one of the resources grabbed from Spriters Resource I compiled something that I felt could still fulfill the spirit of the prank.
After an hour, I landed and made my way to the Gaylord Convention Center.
At the Gaylord

Around 7AM on the first day of MAGFest, I was able to get my badge without even waiting for a line. How nice!
After wandering around the Gaylord, I settled in the food court area and continued to try to bring back some of the original demo. Kikori Forest was fully tiled out, with everything up to when you had met the Great Deku Tree was originally planned for the demo, but lost due to poor planning and disorganization on my part. D: At this point, I was attempting to at least bring back the Great Deku Tree, and some of Kikori Forest, but then my phone had started buzzing with notifications which took my attention.
Steve had messaged me, and it took me a moment to respond since I was distracted by making those last minute changes to the rebuilt demo. Many decades of shitposting back and forth, nerding out about music, Zelda, and many other random tech/science things, brought this moment together. Two nerds and shitposters unite! And also the people who were rooming with us at the hotel! Everyone was chill. Everyone introduced themselves and finally we can say: MAGFest Mission Start!
We made it to the hotel room, and I plopped on the bed and busted out the goods. >: )

Because of missing some of the object data, I decided to scrap Kikori Forest, the Great Deku Tree, and just make a simple single room for the rick roll. After fiddling with the scene script, a ROM flashing extravaganza happened! haha
Sadly the GBA SP I had was somewhat faulty with the audio, which made verifying the carts a bit difficult, but we printed everything.
Don Patch
Don Patch. That is all.

Unleashing Rick Astley onto MAGFest (Release time!)
We left for the convention center with some cartridges in hand. I had come to MAGFest with a total of 14 carts, with 5 reserved for friends. Steve also created a line of stickers to go along with the carts, so we distributed both in tandem. After leaving a few carts, we noticed that they did not last long on the floor, so we made a game out of guessing how long they would last! The rest was then handed out.

gm112 and MG-Zero present to you: Rick Astley!
Now that I'm home, it was time for publishing everything! Due to the limitations of cost, I could not produce very many carts. The compromise was to publish the source code and ROM along with a video, for all to see and also mess around with themselves. : )
Video, ROM and Source Code
I've also posted this on archive.org, and naturally the GitHub repository. You can use Web SkyEmu to play the ROM.
Closing Thoughts
There were a lot of lessons learned, a lot of fun and memories made along the way. I'm glad I got to celebrate the love of Zelda, OoT2D, ZFGC and friendship! In another timeline, someone showed up to MAGFest 2026 and said, "Hey everyone, behold - Ocarina of Time 2D Demo 4!", followed by world peace and harmony. It is just incredible to me how a fan project could bring so many people together, and still be remembered so many years later. Many of us are still friends, still play Zelda, and it reminds me of how fortunate we are to have such a wonderful community. Even in poking fun at OoT2D, let me be clear that it is out of love of the project, the idea of it, and the desire to one day see Ocarina of Time 2D come to life. Working on the Game Boy was much easier than anticipated, thanks to GB Studio and the efforts of the gbdev community! I look forward to experimenting some more. Until next time!
gm112 waz here. And then, he ran off!