Misadventures in 3D

Good Morning from my Robotics Lab! This is Shadow_8472, and this whole month is the Redot 2026 Summer Game Jam. I joined. Let’s get started.

Before I Really Get Started

I’d just like to take a moment to commemorate the United States turning 250 this month! HAPPY BIRTHDAY AMERICA!!! I thank God for this country, and I pray that we as a nation will trust and obey Him, that God may bless America again.

Entering A Month-Long Game Jam

I’ll be up front. I’m still a bit shaken from my last jam. I wasn’t interested in a month-long commitment. But at the same time, I don’t want a permanent mental block against participating in game jams. The theme was hinted this time, priming us to think about mining. When it was announced as “Industrial expansion vs. the planet,” I was more than a little off-put by the apparent environmental message requirement.

Don’t get me wrong: I do care about he planet. I just don’t think we should be obsessing over “being green” to the point that we are neglecting human needs or needlessly leaving ourselves vulnerable to natural disasters, like wildfires.

I talked with one of the organizers, who explained that the jam had different management this time around. The intent was to encourage factory/industrial themed games. Not particularly in my set of interests, but nobody’s saying it has to be anything as long as it uses the theme in some way.

I assembled a team myself to better control the working culture. Namely, I need things kept professional behind the scenes. And if we totally flop, oh well. This jam gets me back into the relevant programs, and that’s the important part.

On previous jams, I’ve worked with code. This time around, I wanted to try making 3D assets. I already knew some modeling basics, but I wanted a little push to learn how to texture, rig, and animate in Blender.

We settled on a team of penguins sent to Antarctica to study the melting ice caps with inspiration from Virtual Villagers for game mechanics (The classic series by Last Day of Work is available from their website for free and works in WINE).

Battling Myself

The mental block was real though. As the jam started, I picked up a new numbers-go-up game I really shouldn’t have. Whenever my attention bounced hard away from jam, that is where it ended up. As of writing, I have closed that tab, but I can’t get that time back. What I can do is reclaim time not already wasted.

And it’s not like I didn’t make small victories along the way. I updated Blender and Redot. Git<–>Codeberg gave me a little grief, but I figured it out. As it turns out, penguins are actually kind of forgiving when it comes to 3D, so I was able to get one that looked half-decent. Texturing took a bit longer to figure out, but my previous work on a splatter map did provide insight into the process I needed. Importing the Blender file into Redot was unassumingly simple. Animation… took a bit longer, and I’m still stumped on making additional animations on the same model. That and my initial modeling attempt isn’t working out all that great under mesh deformation.

Takeaway

Procrastination. I don’t have much to show for this month because of procrastination. What I do have is… hard to appreciate, but at least I believe I can resume game development once I get my homelab in order next month.

Prayer

Father God,

I pray for anyone struggling with bouncing off projects he/she desperately wants to do. 3D has a learning curve, I feel stuck in it. Normally I’d reach out to a community for help, but I have no one to reach out to. I didn’t feel comfortable in the main Discord (if that’s the one I’m thinking of), but maybe I should start looking again. Please help anyone in a similar situation.

In Jesus’ name I pray,
Amen

Final Question

Where do you go to for Blender help?

The Importance of Team Communication

Good Morning from my Robotics Lab! This is Shadow_8472 and this month, I participated in the 2026 Redot Winter Game Jam. I have a story out of it, but it didn’t go the best. Let’s get started!

Disclaimer

I do not wish to defame anyone – only warn about the importance of communication. I am therefore substituting the names of my teammates for Stardew Valley characters based loosely on roll in the project while ignoring other characteristics, such as age or gender.

People have bad days, and I am only one witness of a narrow window of time. So please: unless you are a moderator, leave idle curiosity here. Fellow participants, do not allow anything you read here to affect how you rate the entries.

Out the Door Studios

One of my longer-term goals has been to code a big idea I’ve had as a video game, but I need to build skills to that end first. I entered the Redot Winter Game Jam last year to do just that. Redot is a fork of Godot – itself a free and open source game engine. Godot made a comment I found unwelcoming on their socials, and Redot prioritizes making games over witch hunting wrongthinkers. Under that context, I built what became Out the Door Studios. Going into the Redot Winter 2026 jam, I have two jams worth of experience plus a little from personal projects.

A Group Founded in Poor Communication

The official theme for this jam is officially “Slippery when…”. For me, it is miscommunication – not all of it mine, not all of it bad. The first miscommunication involved meeting Sebastian, a programmer with a little 3D experience. He mistook our 2025 entry for 2026, but I invited him to Out the Door nonetheless. Nobody I’ve previously jammed with was both available and interested. Within a few minutes of my pre-jam pitch, he had delivered a visual matching my inspiration perfectly.

And then I spotted an ad by Lewis. He wanted a programmer and a 3D artist to round out his jam team for a more ambitious 3D project. I applied, offering Sebastian’s and my talents. It went back and forth between Sebastian, myself, and Lewis for quite a while, with me making Lewis out to be “middle-to-top of the little leagues.” Somewhere in there, I listed my years of experience with Linux intending that as an ability to solve problems.

Unbeknownst to me at the time, Lewis was more “bottom of the big leagues” and took my experience maintaining a homelab to mean I was programming the entire time. When I arrived in Lewis’ Discord, it had about 10x the members I expected. It is set up more like an office than an informal development environment. Impostor syndrome set in, but I pushed it aside. Their rules weren’t copy-pasted –usually a good sign– but the casual coarse language made me uncomfortable from the start.

Already on the team were people to whom I will refer as Leah, a concept artist I didn’t interact with much, and Maru, another programmer. Yellow flag out the gate: time zones – the five of us were spread roughly equally around the globe. Most pointedly: our programmers shared little in the way of sleep schedule, severely hampering collaboration.

The Jam Begins

Now, I never signed any NDA’s (Non-Disclosure Agreements), but as of publication, the jam is ongoing; I will avoid mentioning specifics unless they’re vague or important. We got a relatively good jam theme, “Slippery when…”, lending itself as easily to ice/slipping as stealth/evasion/pursuit. Four of us hopped in voice (Maru was asleep).

In that first meeting, I immediately got cussed at to turn my mic down (apparently, my mic settings were out of whack from fiddling last month). I proposed using Codeberg – having to explain the difference between GitHub (code-hosting website) and Git (version control software at GitHub’s heart), but Lewis about insisted on using GitHub, “let’s just stick with what’s familiar.” ‘But, GitHub is not familiar to me,’ I thought. His house, his rules.

Alone, that wouldn’t mean much, but every design decision followed suit. At one point, we were split 3:2 over what to call a gameplay element. Despite Lewis landing in the minority, it shifted from “we’ll just agree to know what we mean when either term comes up” to an unspoken, ‘just use Lewis’ term in-code.’ Yellow flag.

My main contribution to the game was locating a system important to the main gameplay gimmick. I found something on the in-engine asset store and had it half-way working, but after a day it proved buggy and inherently didn’t support browsers. I spent another day studying how similar effects were accomplished in familiar titles. One lonely video demonstrated everything we needed running in Godot (which Redot is compatible with), but without code or contact info.

The Tutorial

Then someone –Sebastian, I believe– located the tutorial. How to do <our gimmick> in Godot 4. Code was published, but lacked a visible license. I spent a day tracking one down. Let’s call the tutorial author Mr. G4 for Godot 4. His project built off someone’s Godot 3 code. Mr. G3 was following up on a fourth party’s Godot 2 demo. Between them, I only found an eMail for Mr. G3. Mr. G2’s digital footprints ended in 2021, one post after retweeting an incitement to violence against police in 2020, which I reported. Mr. G3 got back to me with an MIT License, and I was able to share my Container Analogy post.

Mr. G4 was tricky. I asked Lewis, citing enough context between the video and comments section to treat it as MIT, and he said his personal philosophy is that if there’s no license, just do whatever; it’s just a game jam. Yellow flag: one might get away with CC0 (public domain, even without public domain), but that’s not how copyright usually works.

I showed the tutorial to Muggyfox1, a colleague from my second jam, who figured it was fine. The code had been online for years, I made an effort to reach out, and the author clearly intended to be copy-pasted.

In either Mr. G4’s implementation or the asset library’s, the mechanic relies on a shader (GPU code usually used for graphics). Maru was wary of using shaders, but I figured it was within reach, given ready code and my success reading data back out of the graphics card.

Meeting

Sunday came around, and the jam team was invited to a meeting. Sebastian had a previous engagement, and I woke up early. Did I say the jam team? No, it was server-wide! I caught the tail end of a foul mouthed, pre-meeting goof off session. They deliberated content creator sponsorship programs to apply for as a server while alluding to male reproductive organs at the pair they eventually got.

I abstained from deliberation and voting, as I was planning to peace out after the jam at least until another jam – besides, none of the potential sponsors interested me anyway. When pressed for comment on something, I noted for the record that I considered myself as “on probation” for the time being.

Flashpoint and Aftermath

A week into the two-week jam, Lewis was feeling the time crunch. He was using all-caps in chat, demanding that someone start the 3D environment. We programmers were presumably all waiting on each other for things. Lacking a good 3D environment, I had been asking for help all day to add a slightly less important feature to the shader. Eventually, I entered a voice call with Lewis.

Lewis tried the demo I had on GitHub, but it was from a weird development point where something wasn’t working right. I offered to share directly from my screen, but Lewis wasn’t as impressed as I would have hoped. He was quite miffed to hear I was working on a shader and simultaneously told me to “SCRAP IT!!” and, “See it through!” If you’ve ever read about the development of Sonic X-treme, that’s what it felt like.

“Tell me ONE good reason I should not kick you out right now!” he said.

I had already committed to forgiving him after He apologized, otherwise it might have turned into a shouting match. I prayed to Jesus for the situation as I actively ignored any rash words of passion that lent themselves to being hurled back. “I’m the only one who knows how the <REDACTED> system works,” I said as calmly as I could.

I tried not to flake afterwords, but the damage had already been done when Lewis yelled at me. It came into focus the next day after two unproductive hours without positive directions and a reality check with my sister and mother. I was easily spending 10+ hours a day focused on this project, trying to keep things moving when Lewis was offline and people (mostly Sebastian) were at a loss as to what was currently needed. When I DM’ed Maru, she shared her doubts from the start and said, “learning while trying to deliver a complete game in 1 week [sic] is nuts.” (The jam is two weeks.) I had tried to be clear to Lewis, “I am here to learn and have fun with the goal of getting something out the door that is a bit more complex than my previous work.” Neither of those bolded conditions were true anymore.

Sebastian had been more optimistic the night before. I had taught him the system I’d assembled and documented it with plenty of screenshots. He commented on a couple missing features on the shader, and let no one truthfully say I didn’t give it my all to add them until I was burned out.

But when I did burn out, I tried to leave with as much class as possible while still saying things I felt needed to be said. I put my code in order, leaving a new comment or two, then organized the shader with frames around nodes meant to function together. When I told Sebastian about my plans to leave and Maru’s pessimism, he replied, “I might be the only [guy] who can stitch everything together.” Maru expressed disappointment upon hearing we wouldn’t get to work together on something more serious. In the end, I wrote a 500 word letter of resignation telling this story and dropped it in his server, CC’ing everyone in the jam’s section, including what looked like a server admin.

As a last order of business, I licensed my contributions under GPL to Lewis and his team, then ensured its admittance into the main branch (I don’t know that Lewis knows how to use ‘git checkout’ to cleanly remove my contributions). Since I’m not trying to sabotage the jam, I wrote in an exemption until the submission deadline. After that GPL applies, meaning if Lewis wants to continue development, he will have to either publish his entire project’s source as GPL or contact me through a 3rd party for negotiations, but only in the presence of a chaperon approved by me and who has authority to end the conversation at any time for any reason.

Takeaway

I am proud of the work I did complete, and I really hope the team can publish a fun game on time. But at no point did I ever sign any NDA (Non-Disclosure Agreements) nor did I sign away any rights to code I wrote/modified. I hope Lewis grows as an individual from losing me like this. When you work with volunteers, you’re working with volunteers.

I had fun with the mechanic I did get working, and I think I want to do something with it in the future.

Final Question

Have you ever had to walk out on a bad team situation?

A Pair of Programming Projects

Good Morning from my Robotics Lab! This is Shadow_8472 and today I am covering my programming work this past month. Let’s get started!

I am finding that even on the monthly cycle, I don’t always finish the projects I intend to. This month, I was intending to work on my phone, but that project hit some tough truth and the story isn’t ready yet.

HyperTrace

I might as well introduce my newest long-term project, HyperTrace. It started out in October as a spectator camera for a larger Redot community project. I studied up on using quaternions to rotate a camera node to avoid gimble lock, but just as I was starting to get it under control after I was bored stiff of them, I realized I could just attach a camera to a physics object.

But once I had a camera with 6 degrees of freedom (three positional and three rotational), I started thinking about how I could make a game out of it. I figured a space piloting game was in order. I got into studying up on using Perlin noise and similar methods of making structured noise to generate a shifting cave structure to represent a hyperspace mesh for the player to navigate – preferably at high speed.

The idea is that an unnamed pilot is tracing out a route through a shifting hyperspace (preferably at high speed), and if he collides with a wall, he is thrown out of hyperspace, where it isn’t safe to re-enter, so he must return to port under conventional physics. If he succeeds, his fleet can instantly jump across his route. This FTL system sets the stage for a future where humanity has colonized the solar system, but is hesitant to venture out to other stars. Think Star Wars meets Space Engineers meets Monkey Ball.

So far, my best tech demo is a blue fog you can navigate at slow, careful speeds. It takes an unacceptably long

Shell Scripting

My services were called upon for a “computer project.” My mother had some PDF files of recipes to separate. Over the course of an afternoon, I wrote a BASH script to separate out each page in each PDF. At its heart was the program qpdf. Along the way, I tried to keep good practices like leaving comments and having checks to prevent accidental overwriting.

Now, I only know a modest bit of BASH (popular Linux command line interface aimed at users), but I know enough about basic programming it was just a matter of syntax for me. But I figured I could do one better in around the same amount of time. I saved a copy of the script and its output, and I set about naming files after their contents, identifying+recombining second pages, and sorting out charts, and numbering repeats (some duplicate recipes had changes).

But for every hour I spent working out a feature, I figured I spent another debugging edge cases. Several recipes had BASH control characters in their titles like *, &, and /. I preferred to use special handling of strings, but in the end I sanitized / as ÷ and * was removed entirely. This additional work extended the project to a total of three days.

Closing thoughts

My goal with Hypertrace is to publish it to Itch.io or similar platform on a donation basis. And before I get past more than a couple tech demos, I’m going to want a version control server in my homelab just in case something happens to my laptop. While I really want to think ahead in terms of security, I know I don’t know enough to make an informed decision about the utility I need now.

Final Question

What Git setup do you recommend for a homelab?

Building an Improvised Recording Booth

Good Morning from my Robotics Lab! This is Shadow_8472, and today I am building a sound booth in my closet. Let’s get started!

Designing a Recording Booth

At one point in my year off, I researched the basics of voice acting. I already have a Blue Yeti and Tenacity (fork of Audacity, a free/open source sound recording program), but the recording environment is just as important. Tenacity and other programs that handle audio often come with powerful tools to clean up background noise, and better techniques are being innovated all the time.

But no matter how good post-production gets, it’s still best to minimize unwanted noise relative to signal (voice or instruments) in the first place. This is called the noise floor. And depending on the size and shape of your room, sound reflects back and echos. Vibrations from the building can also travel up a simple mic stand and degrade quality that way. Little tweaks like are endless, but these are the scope of my project today.

Common DIY sound booth solutions range from recording in a closet to draping moving blankets off a collapsible PVC pipe frame to building a mattress fort. My budget is “stuff from around the home,” so no PVC or mattresses for me. The theory behind closets is that the clothes absorb the sound bouncing around. But I read that if you think you have enough clothes for that, you don’t have enough clothes. Long story short: I hung the heaviest, unused blankets I found around the house in my closet for a compromise between the lower two solutions. I also used a dresser drawer to reduce mic vibrations.

Project

What good is a sound booth without a project to test it on? As of writing, I’ve only done test recordings of “Marry Had a Little Lamb” comparing the sound floor loose in my room to a camper when I visited family in the mountains this summer and again within the sound booth. I think the biggest factor I need to worry about is my rather loud laptop fans.

For the longer term, I auditioned for an unpaid role in a fan re-animation project: The Tigger Movie: ReBounced [Link to Casting Call Club page]. I looked it up as I actually have a pretty good Eeyore impression, but that role was taken already. After a little self-debate, I tried out for Piglet since digital manipulation was on the table, and Piglet’s role is as small as he is. My family picked up a copy of the original movie to watch, and I’m finding Piglet’s stutter a little difficult to master, but it is nothing compared to Tigger’s lisp. The project is in need of animators, so if you happen to have some time, feel free to check it out.

Final Question

What entry-level equipment would you recommend and in what order?

I’m Back

Good Morning from my Robotics Lab! This is Shadow_8472 with a quick update. Let’s get started!

Keeping things short, I’m back from my year-long break. I didn’t do [as] much in terms of stuff to cover, but I did get a new laptop built for Linux and I participated in Redot’s New Year’s and Spring game jams. Check them out on Itch.io. I’ll be writing about them and other projects in coming months.

Speaking of, I am moving to monthly posts – the last Monday of each month. Weekly posts kept me moving when projects were simple, but I eventually found myself writing fluff. There are only so many times I want to explain NFS auto-mounts, yet I’d do it to publish something. A monthly format will allow time for tougher and/or more haunting challenges, like my Nextcloud saga I finally have an answer to. Concluding such epic efforts might be worthy of a video, which I am interested in trying out.

Final Question

One of my long-term goals is to build a following, and I understand a good way to do that is networking with similar content creators. Do you know anyone I might have a chance at getting to know?

Responsibility of the Network

Good Morning from my Robotics Lab! This is Shadow_8472, and today I have a doozy of a network week to cover. Let’s get started!

Meet the Computers

  • Cerberus – the main star today. It is our new hardware firewall running OPNsense
  • Red Router – a tp-link gaming Wi-Fi router fancied up beyond what it should have been
  • LAB – my homelab with a few servers
  • LAN – everything else connected via Wi-Fi or Ethernet

Network Implosion

It all started with revisiting a .lan domain. Cerberus’ extensive webUI left me with the hunch I’d need one machine in charge of DHCP assigning dynamic IP addresses. Red Router’s “operation mode” to work as an access point was hidden in literally the last menu to click through.

It was afternoon and no one would be using the network for the 30 seconds to 5 minutes I estimated switching the LAB and LAN Ethernet cables from Red Router over to Cerberus would take. Nope. No traffic made it through. DHCP mis-configuration? Cue a slow back and forth, bopping a setting from a workstation and trying a different physical configuration. Eventually, Cerberus ended up on my desk with Red Router talking directly to our ISP’s gateway/modem.

Order of events is a bit fuzzy from here, but when the Wi-Fi stopped working, I was without a good access to online answers. I worked the problem into the night. Around 1:00 AM, I knew I had done too much for a clean reversion. For two hours, I worked in loops hoping to spot something different. So much waiting! Cerberus would behave on my desk, then fail when redeployed. Worse: when I re-connected all the wires to Red Router, it started dancing between 192.168.0.1 and 192.168.1.1 every 45 seconds or so. I configured its IP manually, but gave up on Internet by morning at 3:00 AM, preparing to concede to my father’s suggestion earlier about hiring a professional to untangle my mess.

The Next Day

Newtork Loop. In my brain fog, I had Red Router talking to itself on a cable leftover from removing Cerberus for the night. With the house to myself for several hours, I alternated between bursts of intense diagnostics and mental processing. Somewhere in there, I rebooted the ISP’s modem.

Around noon, I realized the extra ports on Cerberus aren’t a switch as is Red Router’s default configuration, but were following firewall rules – which explained its behavior the previous day when I tried a computer from LAB without anything in-between. At around 3 PM, I got a Discord notification while mentally checked out, letting me know the network was back on.

6 PM on the second day: I situated my workstation in Cerberus’ LAN port and a Raspberry Pi in one I named LAN2. I’d previously copied firewall rules from LAN to LAN2 and LAB, but to no obvious effect – until I had the two computers ping each other. LAN2 failed as expected, but LAN’s ping was returned. I corrected the interfaces’ rules to allow them to reach out, and that was it.

Fallout

Without going into too much detail, a subnet shift like this is a major undertaking for networks with static IP servers on them. Not only do the network and computers need to be adjusted, but all traces of the old subnet need to be corrected. NFS clients needed to be told where the server was now, and the NFS server shares needed to be updated about what IP’s were allowed to mount them. I also still have Bitwarden to clients to update at my leisure.

Takeaway

OPNsense is a heavy weight in terms of configuration options. It has a learning curve compared to products simple enough to for Grandma and Grandpa to use. I may have solved my own emergency, but it may be wise to get someone looking at it professionally anyway to grade my work and give me some pointers on rootless Podman mounting NFS shares, or other long-term places where I’ve gotten stuck.

Final Question

I admit: networking is more fun than I gave it credit for before I knew basically anything. I still find it a bit taxing to mentally reach around my mental map, but I manage. How do you visualize networks?

Sonic 3 AIR (Linux, Wii/Mega Collection Method)

Good Morning from my Robotics Lab! This is Shadow_8472 and today I am using a hacked Wii and Linux to rip Sonic Mega Collection for a ROM to play Sonic 3 AIR. Let’s get started!

I am not a lawyer, nothing in this blog post is legal advice.

Say what you like about the GameCube, it was my sister’s and my first video game console. Among our initial collection was Sonic Mega Collection, a library of Sonic’s Sega Genesis titles. The games played poorly with an analogue stick, and I lost interest after never getting past a second zone.

Years later, a university friend re-introduced me to classic Sonic games through the world of emulation. I found myself browsing Sonic Retro and trying out several ROM hacks of base games I owned back home. Of note: fan content is a legal gray area some companies like Sega happily leave gray – letting fans explore their IP (Free advertising, anyone?) while leaving themselves room to threaten troublemakers. That said, the unwritten code of conduct for handling hacked/leaked prototypes is:

  1. No selling hacks.
  2. No advocating piracy.
  3. No redistributing raw ROM’s.
  4. Don’t ask, don’t tell.
  5. Own a legit copy if available.
  6. Support quality official ports.

That said: Sega has hired Sonic Retro talent to port their classic games.

Sonic 3 Fan Projects

Most ROM hacks on Sonic Retro are outright love letters to their respective base games, but my hands-down favorite was Sonic 3 Complete (S3C) [1]. This hack aimed to restore the game’s original vision before time constraints split it into Sonic 3 (S3) and Sonic & Knuckles (S&K) with the option to combine their cartridges into Sonic 3 & Knuckles (S3&K). S3C added a game select, custom level transitions, fine tweaks to revert assets, and an option to move Flying Battery Zone to just before Ice Cap so Sonic can snowboard down on a hatch he knocked off in a cutscene. Polishing continued until it approached the Genesis’s ROM size limit.

When the S3C team signed off in 2013, they named another project as their successor: Sonic 3 Angel Island Revisited (Sonic 3 AIR/S3AIR). In addition to similar polish to S3C, Sonic 3 AIR uses a newer engine with widescreen and 60 fps support. Mods are also supported. The catch is it requires an original S3&K ROM for game files. This used to be available from Steam, but I had to dump my physical copy using the Wii I hacked last week.

Following a tutorial as can be found on GameBananna (linked in Works Cited) [2], I installed CleanRip and backed up four of my GameCube disks – Sonic Mega Collection among them. Each game gave me three files: GAME-dumpinfo.txt, GAME.bca (data about the copy protection), and GMAE.iso (the game data itself). The .iso doesn’t mount, but Dolphin emulator lets you browse its file system anyway. I located S3&K’s .dat file and set that aside.

GameBananna’s tutorial breaks on the next step. It calls for a converter by GreyRouge [3], but the link is broken and the forum has been abandoned since early 2023.

https://zenhax.com/viewtopic.php?t=695

Instead of finding four good captures on WaybackMachine, I the topic number into a working URL [3]:

https://zenhax.com/viewtopic.php@t=695.html

But I wasn’t done yet. GrayRouge used an old version of Visual Studo, but some research, I got it working in normal C++ by making the following changes:

Replace: #include "stdafx.h"
with: #include <iostream>
and #include <string>

Replace: int _tmain(int argc, _TCHAR* argv[])
with: int main(int argc, char* argv[])

The compiled program worked got S3&K loading in an emulator. I posted my modifications to Reddit where my hope is to be of help to someone. S3AIR was stubborn about looking for the ROM in my Steam files, so I gave it a link.

~/path/to/Sega\ Classics/uncompressed\ ROMS/Sonic_Knuckles_wSonic3.bin

Takeaway

My original motive for following through on this project was on the off chance my PinePhone could run it on the go. Yeah, no. I tried my best on a time crunch, but I did spot a warning in S3AIR’s documentation that it wasn’t going to run on ARM processors.

Also: the full program code is on Reddit. Someone re-uploaded it after the original link broke, but I lost the link to that.

Final Question

Are you on a journey similar to mine? If I was of any help, please feel free to let me know in the comments below or on my Socials!

Works Cited

[1] Sonic Retro, “Sonic 3 Complete,”Sonic Retro, Jan 12, 2022.[Online]. Available: https://info.sonicretro.org/Sonic_3_Complete. [Accessed: Aug. 19, 2024].

[2] Tyranger, NickyFan7, “Ways to get a Sonic 3 & Knuckles ROM (Post-Delist),” gamebananna.com, Apr. 30, 2022. [Online]. Available: https://gamebanana.com/tuts/14939. [Accessed: Aug. 19, 2024].

[3] GrayRouge, “Sonic Mega Collection (GC) dat files,” zenhax.com, Mar. 7, 2015. [Online]. Available: https://zenhax.com/viewtopic.php@t=695.html. [Accessed: Aug. 19, 2024].

Finally Passing Wii Hacking 101

Good Morning from my Robotics Lab! This is Shadow_8472 and today I am actually hacking my Wii. Let’s get started!

!!ALERT!!

THIS BLOG POST ABOUT WII HACKING IS UNMAINTAINED!! While unmaintained documentation can be entertaining or contain useful hints not found anywhere else, it often lacks nuance and is best treated as unauthoritative. Be careful with it. Be responsible with it. This applies to all media forms – especially YouTube.

As of writing in August, 2024, the authoritative site is https://wii.hacks.guide/ [1].

Seriously. As with installing Linux or any activity that disregards OEM walled gardens, you take a risk by hacking your Wii. Many generous people have put years of effort into minimizing these risks, but at the end of the day, the only one to blame for bricking your device is you. The community may back you up on a volunteer basis with no obligations. You own your hardware. Have fun!

With that out of the way…

Recap

A video game console must be built like a castle to protect company profits. Security must stop pirates while being as invisible as possible to legitimate customers. The Homebrew community doesn’t cleanly fit into either category; it climbs the castle walls for fun, but in ways that aim to complement the original product.

I bought a Wii from someone in my area a couple years back with the intention of hacking it. I’ve researched it sporadically since then, building confidence, then backing out each time. Last time, I made it so far as to install the Homebrew Channel on Dolphin Emulator. This time, I make it all the way.

The Homebrew Channel

All video game consoles are just specialized computers. The Wii just didn’t hide this fact as much as most previous consoles. Its operating system boots to a menu with sever channels I mostly ignored, but nonetheless shaped the system’s identity. Perhaps the most [in]famous channel is The Homebrew Channel, a menu for 3rd party software and the primary objective for this week.

There is no direct way to install the Homebrew Channel, so an exploit must be used. The Wii has a rich history of exploits that rely on specially corrupted saves of specific games, but the three in use today only require an SD card formatted to FAT32 (LetterBomb and Wilbrand) or an Internet connection (str4hax). The idea is to load HackMii and install The Homebrew Channel from there.

Glossary of Terms

The Wii uses a lot of abbreviations. Refer to this section if you see any.

  • Brick v. – to mess up software so bad, the system won’t start. It may as well be a clay brick.
  • CIOS – Custom IOS
  • IOS – Acronym unknown. Pertains to files in Wii’s firmware (Has nothing to do with Apple’s iPhones)
  • NAND – System memory
  • NUS – Nintendo Update Server
  • NUSD – NUS Downloader
  • WAD – Wii Application Distribution
  • YAWMM – Yet Another Wad Manager ModMii Edition

Groundhog Exploits

First of all, what kind of Wii am I hacking?

  1. White with GameCube adapters
  2. US Serial number
  3. Firmware upgraded to 3.3U to play Animal Crossing: City Folk (U for US region)
  4. Bought 2nd hand, but presumably stock (unmodded)

As part of my setup, I joined the r/Wiihacks Discord server. The community was friendly enough, but I let myself be pressured into updating to firmware version 4.3U, but only once I’d confirmed my serial number matched US region. Updating to or past 4.2 carries a slight chance of bricking in exchange for simplified research. I was OK, but I strongly advise you to research how to update to 4.1 and hack from there.

I started with str4hax, which aims the Wii’s DNS at a special server that replaces the User Agreement with Dashie (Rainbow Dash from My Little Pony: Friendship is Magic) and takes one to two minutes to glitch the system into loading a script that boots the Wii into BootMii. I saw the exploit performed on a YouTube video, so I knew to expect rainbow static with green flashes. BootMii hung (got stuck) on its anti-scam warning, so I tried it around a dozen times in total.

What I didn’t understand at the time was the difference between exploit and payload. This difference was more apparent after running Wilbrand, a Wii Message Board based exploit named after the inventor of TNT. Using a bunch of special information including a Wii’s MAC address, it generates a special letter stored on a properly formatted SD card. When this letter is opened, the Wii crashes and loads boot.elf from the SD card. It took several tries to format my SD card, but once I had Wilbrand working, it was a much faster turn around. When it works correctly, HackMii should load quickly.

Neither of these were perfectly consistent:

  • str2hax hung on Dashie for me once and a few times the script to load HackMii failed trying to change Internet settings.
  • Wilbrand sometimes gave me a black screen and a blinking blue disk drive (.5 sec. on/.5 sec. off). I also had it drop TV signal in a different fail state.

HackMii Being Stubborn

Whichever exploit you use, when HackMii loads correctly, it puts a scam warning on screen, and after 30 seconds (or until HackMii finishes loading) it should tell you to press 1 to continue on to installing The Homebrew Channel and BootMii.

In my experience though, HackMii hung on this screen with no visual feedback besides the remote being stuck on (working correctly, HackMii does disconnect the remote). I was stuck here for over a day. Wisdom gleaned from community documentation and forum posts say this error is caused by one or more cIOS (or custom IOS) present on the Wii, which can be an indicator of piracy. The accepted diagnostic tool is SysCheck, but its documentation says to load it from The Homebrew Channel I haven’t installed yet!

Under advisement, I was directed to try using ModMii, a tool intended exclusively for Windows. Running under WINE, the CLI edition of version 7.0.2 wants to update to the latest version: 7.0.2. It also failed to set up its download list. The GUI edition was slightly less buggy in that it recognized it was up to date. I tried a few versions of WINE/Proton using Lutris to switch between them, but nothing worked. I was not desperate enough to explore trying .net to see if that made ModMii run. WINE rating: Garbage

Exploring on my own, I felt silly when I found a file called installer.log:

HackMii v1.2 installer starting up
PVR = 00087200
running under IOS 38 rev 0xe19
52 titles are installed
Found IOS 16: revision: 0x200.
Found IOS 10: revision: 0x300.
Found IOS 80: revision: 0x1b20.
Found IOS 38: revision: 0xe19.
Found IOS 37: revision: 0x161f.
Found IOS 36: revision: 0xe18.
Found IOS 35: revision: 0xe18.
Found IOS 34: revision: 0xe18.
Found IOS 33: revision: 0xe18.
Found IOS 31: revision: 0xe18.
Found IOS 30: revision: 0xb00.
Found IOS 28: revision: 0x70f.
Found IOS 22: revision: 0x50e.
Found IOS 20: revision: 0x100.
Found IOS 17: revision: 0x408.
Found IOS 15: revision: 0x408.
Found IOS 14: revision: 0x408.
Found IOS 13: revision: 0x408.
Found IOS 12: revision: 0x20e.
Found IOS 11: revision: 0x100.
Found IOS 21: revision: 0x40f.
Found IOS 2: revision: 0x201.
Found IOS 9: revision: 0x40a.
Found IOS 4: revision: 0xff00.
launching IOS 38 for the installer…

IOS launched…

IOS versions: Installer: 38, HBC: 0
starting preparations

Acting under the assumption I might have a bad cIOS hiding in that list, I converted the revision hexadecimal numbers into decimal looked up each one up on wiibrew.org [2]. All I found was that IOS2 was a false positive and actually part of the system menu. After bringing this back to r/WiiHacks’ Discord, I was advised about an odd line:

IOS versions: Installer: 38, HBC: 0

HackMii usually works better exploiting another IOS, like IOS58, which was either absent or incorrectly loaded during the 4.3 update (I never was properly convinced either way). Discounting ModMii or technical piracy, my last chance at obtaining IOS58 was NUSD. While it is a Windows tool, I found NUSD runs perfectly in WINE on Linux. Platinum rating.

From there, I loaded a WAD file for IOS58 on my SD card alongside a WAD manager called YAWMM, and copied/renamed its boot file to <SD_card>/boot.elf as the payload in place of HackMii. Installation was straightforward from there, and HackMii was repaired.

A blow for blow description of the solution that worked for me can be found here: https://www.rwiihacks.com/tutorials/hackmiiscamstuckfix/index.html#method-3 [3]

“Press (1) to continue” appeared, and I used it to install both The Homebrew Channel and BootMii as an IOS.

BootMii and Priiloader

The Wii has three boot stages: boot0, boot1, and boot2. boot2 can be written to, but only early hardware revisions will brick if boot2 is homebrewed. HackMii detected a patched motherboard and didn’t let me install BootMii to boot2.

BootMii can backing up and restoring the Wii’s internal NAND memory. If you can install it to boot2, it gives you a low-level option to recover from a brick. I don’t get that though.

My next obstacle is SD card size. A stock Wii can only use a 2GB or 32GB SD card depending on if it is running firmware version 4.0 or later. It is recommended to have something a bit bigger than 256MB, as I have been using so far. I sacrificed my Manjaro ARM 32GB microSD for the cause, but I got a NAND backup through BootMii.

Priiloader loads after boot2 and before the System Menu and thereby is a powerful tool from recovering from a brick (though it is second to BootMii boot2 edition). It also offers a bunch of customization options to research another day, but following the wii.hacks.guide tutorial, I disabled disk/online updates and disabled an anti-flicker feature intended for tube TV’s.

D2x and cIOS

As a general rule, wisdom gleaned from the community says cIOS should be avoided, as they’ve learned how to do most things they want to do without changing firmware. However, the wii.hacks.guide checklist does install four cIOS files. Published details are vague, but I gather they do things like allow loading games off USB instead of the DVD drive and using unofficial online services. Wiibrew.org wasn’t particularly helpful when I looked each base IOS up, but then again this is my first time customizing firmware.

Diving deeper, D2x patches official IOS files during installation. This process went smoothly even if it was nerveracking. I double or triple checked each of the four ISO’s to be installed. But even if something did go wrong, that’s what doing a NAND backup early is for.

Loading Homebrew Apps

One more touch, and I can consider my Wii fully hacked for now: the Homebrew Browser. If The Homebrew Channel doesn’t find apps on the SD card (or optionally a USB drive), it shows nothing but bubbles your pointer can pop on contact. The Homebrew Browser can load and update apps to SD (or USB), but itself must be loaded manually. I installed a few recommended utilities, but further tinkering will have to wait for another topic.

Takeaway

Unfortunately, the channel I was working in/using for notes was deleted once I had gotten to The Homebrew Channel. I am mad because by then I had only written my disclaimer and half the recap by then. By God’s grace, I forgive the one[s] responsible, but my hope is that our shared lesson be the value of the footprints we leave behind when working in niche community support topics.

Final Question

Have you ever tried hacking/soft modding a Wii or any other game console? I look forward to hearing from you in the comments below or on my Socials!

Works Cited

[1] Nintendo Homebrew, “Wii Hacks Guide,” wii.hacks.guide, 2024. [Online].Available: https://wii.hacks.guide/ [Accessed Aug. 12, 2024].

[2] wiibrew.org,Nov. 18, 2021. Available: [Online]. https://www.wiibrew.org [Accessed Aug. 12, 2024].

[3] u/WiiExpertise, “HackMii Scamstuck Fix,”rwiihacks.com, 2023. [Online]. Available: https://www.rwiihacks.com/tutorials/hackmiiscamstuckfix/index.html#method-3 [Accessed Aug. 12, 2024].

A Let’s Player I am Not

Good Morning and Happy Easter/April Fool’s from my Robotics Lab! This is Shadow_8472 and today I am salvaging an attempted Let’s Play I tried making for Minetest Exile. Let’s get started!

Minetest is an open source block game engine and Exile among the top games on that engine. In this game created by Dokimi and continued by Mantar, you play as an exile banished from a post-postapocalyptic Iron Age civilization to the ruined land of the ancients for crimes you likely didn’t commit. When you lose a character to the wasteland, you will respawn as a fresh exile with a distinct backstory.

Suffice it to say Exile has a difficult learning curve. A .pdf tutorial exists by the original creator, Dokimi, but I found it very outdated two (I think) years ago. I tried making my own tutorial in the same style, but I found it too exhausting to switch between gameplay and organizing my thoughts, so I put the project down and all but forgot about it without publishing anything.

This week, I was inspired to try recording my gameplay with live commentary. I installed OBS from the repository and set it up for recording. It took me a while to get a good mix between my voice and game sounds, but I eventually got something halfway decent.

Gameplay wise, I got a decently lucky start with finding a good food to farm. Thanks to new clothing items since I last played, I wasn’t too bad off despite sub-optimal fiber sources previously being a practical requirement for keeping a critter alive while starting from scratch. I found a spot for a year one farm, but had to make a seepage pit for water to drink, which eventually gave me a stomach bug that crashed my game. I gave up on the Let’s Play and reported the bug. As of writing this on Friday afternoon, the bug has already been addressed. My save was still corrupted though, so I doubt I’ll be committing to a let’s play anytime soon.

Takeaway

Taking cumulative lessons from this project’s two attempts so far, I believe the wisest course of action is to record footage playing a season at a time while taking verbal notes, then grab screenshots from the video and write commentary on the highlights.

Final Question

Have you ever tried making a Let’s Play? How did it go?

Stashing Christmas

Good Morning from my Robotics Lab! This is Shadow_8472, and this week I did not complete my intended project for the week, but I did finish something interesting nonetheless. Let’s get started!

Red or Blue?

God has blessed my family to the point where when we pull out the Christmas decorations in November or so, we ask ourselves, “Do we want a red Christmas or a blue Christmas this year?” We then set up our artificial tree and garlands and adorn them tastefully from our “red” or “blue” bucket.

In fact: God has blessed us such that we could surprise my aunt some years back by getting a skinny artificial tree for our Christmas party. Circumstances dictated this tree as now our main tree this year, and we were able to bless a school run by our church with not just our large tree, but also some smaller ones for a few classrooms.

But Christmas is over. It’s time to put things away.

Let-There-Be-Christmas Boxes

In the likely event we are with the school next Christmas, my mother, Annie_8472, wanted to re-organize our buckets into our usual red/blue/both categories plus a number of classroom kits with our tiny trees and decorations for them. For each of red and blue things, we have a bucket for shatterproof balls, a case for smaller themed ornaments, etc.

Most of my contribution was hauling buckets between the living room and garage. I spotted a few buckets in comparatively poor condition, and arranged for them to end up at the bottom of the bucket stack. Annie clearly marked each bucket she used and had me aim them out when shelving them.

Takeaway

The same sorting system can be used with anything. Fabric –for example– can be sorted by color or material. Rank your items’ most important qualities, and store the most similar stuff together. This way, other people can find things (and put them away when done).

Final Question

Red or blue?