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?

How to Run Electric Quilt 8 on Linux

Status: INCOMPLETE

Good Morning from my Robotics Blog! This is Shadow_8472 and today I am installing Electric Quilt 8 on Linux for my mother. Let’s get started!

First off, I think I’m going to try something new. I always seem to juggle 3-5 longer projects, splitting off extra parts if I didn’t complete something. A few updates were a bit underwhelming. Going forward, I want to try using a series of updates into old posts as I finish projects.

Electric Quilt 8

EQ8 (Electric Quilt 8) is a quilting program my mother uses. It is also my mother’s last Windows holdout. Seeing as Windows 11 is all sorts of bad news and her laptop was forcefully migrated, I took on the project of coaxing EQ8 into running off-platform. The gold standard is of course native performance, but a small Windows 10 VM (Virtual Machine) is on the table as a last resort.

Attempted Solutions

WINE:

The first stop when attempting to run Windows programs on Linux is WINE (abbreviated: “WINE Is Not an Emulator”), a compatibility layer for translating Windows system calls into Linux equivalents. Long story short, I’ve thrown several versions at it, but I’m not a WINE wizard. There is potential here, but I cannot unlock it alone.

ReactOS:

ReactOS is an open source operating system based on Windows’ architecture. I had set up a VM from another project, but once I got EQ8 over and tried to install, it said it wanted Windows 7. For context, ReactOS is starting to think about re-implementing software libraries introduced in Vista. This is a dead end for now.

Crossover:

I contacted EQ Support with a don’t-ask:-don’t-get attitude. As expected, they only support Windows installations, but the representative pointed me in the direction of Crossover, saying, “Other customers have had success using their product with our software.” I am currently on the 2 week free trial, and while I haven’t gotten it working yet, this is also a promising avenue to explore.

Fedora:

My mother contacted one lady who’s gotten EQ8 working on Fedora Linux. I made a VM for Fedora 42 and tried both Lutris and Crossover. No improvement. As of Oct. 26, the last I’ve heard from her is “Fedora Version 42, Wine Version 10.12, Windows 7 (without Internet-Connection), no launcher.”

Tech Pile:

It’s always fun to raid the tech pile in the hopes of getting something to run. We turned up 2 Vista laptops and a netbook with Windows 7 Starter. Win7 Starter is 32 bit. EQ8 is 64. It wasn’t entirely fruitless, as one of my computers has a Windows 10 drive I never nuked.

Community:

Long story short: I haven’t been able to break into many conversations on my own about EQ8. Reddit has a couple references to running it on Linux, but they run dry pretty quickly.

This is an open project. Check back later for updates.

Final Question

Do you use EQ8 on Linux? Maybe you’re a WINE guru and found this Help Wanted post. If either of these is so, please reach out to me either in the comments below or on Discord so I can update this post with a solution. You can find an invite to my server on my Socials page.

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?

My Pi 400 Travel Desktop

Good Morning from my Robotics Lab! This is Shadow8472, and today I am trying out my Raspberry Pi 400 as a lightweight daily driver. Let’s get started.

rPi 400

The Pi 400 is a special edition of Raspberry Pi – essentially a Pi 4 built into a keyboard. It’s missing a USB 2.0 port (made up for by the keyboard) and the 3.5mm audio jack. In theory, the miniature keyboard computer is perfect for travel – assuming you have a screen at your destination that is.

Choosing a Distro

My first thought was to try installing Arch. A brief search found an Arch on ARM project as vanilla Arch only supports x86 architecture. The instructions involved formatting a drive on the terminal. I bought a 256 GB SD card and did so on the first convenient rPi install I had – Kali linux.

It took a few failed attempts to install Arch. The pure open source method that reportedly works on the regular Pi 4 didn’t on my Pi 400, and the standard method wasn’t cooperative when installing a login manager and any of a few desktop environments. Running on a time crunch before leaving on a trip, I switched to DietPi, another lightweight distro I’ve worked with before for, but for a much different project. As with Arch, MATE was uncooperative, so I settled with XFCE. Special thanks to Balena Etcher for a special warning when formatting large drives.

Packing For a Trip

To shortcut setup, I copied my browser and LibreOffice data from my main desktop. LibreOffice worked for me, but didn’t carry the full dark mode – a problem I’ve encountered before, but ultimately decided to live with.

Firefox ESR –as installed from DietPi’s hedged garden– refused to accept my profile. Regular Firefox –installed from the apt repositories– was up to date and started as expected. Notably, it included my extensions – especially Bitwarden, my password vault.

A screen was not procured at my destination, so I packed one from home. The missing audio jack was also problematic, so I packed my Blue Yeti with plans to disable voice monitoring. For redundancy, I packed an HDMI monitor, but busted the ​​styrofoam while stuffing it into the slightly wrong box. As of writing, I have done nothing with sound.

Deployment

We left on our trip. Upon arriving, I found my over-packed tech bag lacked a long enough HDMI cable. I borrowed a longer one. The monitor signal kept flickering. For a while, I assumed I was overloading the Pi with a couple hundred browser tabs, but after a power blink and several reboots, it came out that the HDMI was bad. We bought a replacement, and it’s been working properly since.

Ejected Challenges

Arch wasn’t the only thing I had to back off from. I brought a couple additional Pi 4’s to have myself a nice, little network with Pi-Hole ad blocking, but Wi-Fi strength and configuration challenges meant those were both a no-go.

Another challenge I want to pull off is playing Stardew Valley. I copied the files over back home, but haven’t had time to try the conversion I found yet.

Takeaway

Finishing a project as a rule is better than stalling an overly ambitious one. I have an on-the-go workstation, even though it still lacks polish.

Of special interest, this week marks the 6th anniversary of my Robotics Lab. And some months ago, I decided I wanted to do a Sabbath year cycle. I’ve proven that I can be consistent at posting, even if I feel my quality slips some weeks. The facts of the matters is that weekly posts are getting a bit repetitive for me, so for the next year, I’m only going to post when I finish a major project, such as when I have the full software suite I have in mind for my homelab. After that, perhaps I’ll stick to monthly. We’ll see in a year’s time.

Final Question

Setting up a travel computer on the quick was a bit of a trick. What must-haves would you include in a similar package?

I look forward to hearing your answers in the comments below or on my Socials.

Server Rebuild With Quadlet

Good Morning from my Robotics Lab! This is Shadow_8472, and today I am continuing my work on my home’s network. Let’s get started!

State of the Homelab

Bitwarden. I self host using Vaultwarden, a 3rd party server. Done properly, it fits nicely in a larger homelab stack, but its OCI container can stand alone in a development environment. Due to skill limitations, I’ve been using it in this configuration. My recent network work has invalidated my manually self-signed certificates, and I’d rather focus my efforts on upgrades instead of re-learning the old system to maintain it.

Today, I am working on my newest server, Joystick (Rocky Linux 9). I compiled some command-by-command notes on using `podman generate systemd` to make self-starting, rootless containers, but just as I was getting the hang of it again, a warning message encouraged me to use a newer technique: Quadlet.

Quadlet

Quadlets? I’ve studied them before, but failed to grasp key concepts. It finally clicked though: they replace not just running `podman generate systemd` once I have a working prototype setup, but also everything I might want to do leading up to that point including defining Podman networks and volumes. Just make your Quadlet definitions once, and the system handles the rest.

The tutorial I found that best matches my use case can be found at mo8it.com [1]. Follow the link under Works Cited for the full text. It’s very detailed; I couldn’t have done a better job myeslf. But it doesn’t cover everything, like how `sudo su user` isn’t a true login for `systemctl –user …`. I had to use a twitchy Cockpit terminal for that (Wayland-Firefox bug).

Caddy

Caddy is the base of my dream homelab tech tree, so I’ll start there. My existing prototype calls for a Podman network, two Podman volumes, and a Caddyfile I’m mounting as a volume from the file system. I threw together caddy.container based on my script, but only the supporting network and volumes showed up. Systemd picked up on “mysleep.container,” an example from RedHat.

As it turned out, caddy.container had missed a capitalization. I found the problem by commenting out lines, reloading, and running `systemctl –user list-unit-files` to see when it didn’t load. Likewise, my Caddyfile volume had a file path bug to squash.

Vaultwarden

Good, that’s started and should be stable. On to Vaultwarden. I updated both ButtonMash and Joystick’s NFS unit files to copy over relevant files, but Joystick’s SELinux didn’t like my user’s fingerprints (owner/group/SELinux data) on the NFS definitions. I cleaned those up with a series of cp and mv commands with sudo and then I could enable the automounts.

Vaultwarden went up with simple enough debugging, but the challenge was in accessing it. I toyed with Cerberus/OPNsense (hardware firewall) DNS overrides until Caddy returned a test message from <domain.lan>:<port#>.

Everything

My next battle was with Joystick’s firewall: I forgot to forward tcp traffic from ports 80 and 443 to 8000 and 44300, respectively. Back on Cerberus, I had to actually figure out the alias system and use that. Firefox needed Caddy’s root certificate. Bouncing back to the network Quadlet, I configured it according to another tutorial doing something very similar to what I want [2]. I configured mine without an external DNS. A final adjustment to my Caddyfile to correct Vaultwarden’s fully qualified domain name, and I was in – padlock and everything.

Takeaways

I come out of this project with an intuition of how to manage Systemd files – especially Quadlet. The Quadlet workflow makes Podman container recipes for Systemd, and a working container will work forever – baring bad updates. I would still recommend prototyping with scripts when stuck though. When a Quadlet fails, there is no obvious error message to look up – it just fails to show up.

Even though it is still new, a lot of my time on Joystick this week was diagnosing my own sloppiness. Reboots helped when I got stuck, and thanks to Quadlet, I didn’t have to worry about spaghetti scripts like how I originally organized ButtonMash and never stabilized this victory I re-achieved today.

Final Question

NextCloud is going to be very similar, which I will make a pod along with MariaDB and Redis containers. But I am still missing one piece: NFS. How do I do that?

I look forward to your answers below or on my Socials.

Works Cited

[1] mo8bit, “Quadlet: Running Podman containers under systemd,” mo8it.com, Jan. 2-Feb. 19, 2024. [Online]. Available: https://mo8it.com/blog/quadlet/. [accessed: Sept. 13, 2024].

[2] G. Coletto, “How to install multi-container applications with Podman quadlets,” giacomo.coletto.io, May 25, 2024. [Online]. Available: https://giacomo.coletto.io/blog/podman-quadlets/. [accessed: Sept. 13, 2024].

Replacing My Tablet’s Battery

Good Morning from my Robotics Lab! This is Shadow8472 with a side project of the week. Let’s get started!

I’ve had my Samsung Galaxy Tab A 10.1 (2016) since before my new Android device lockout. It’s held out for the most part, but several months ago, it developed a problem where it would lose power while plugging it in or unplugging it. At worst, it would pulse its battery charging picture until eventually moving to a charge meter. The problem grew worse over time, and new power cables didn’t solve the problem. The parts to replace the USB connector and battery were out of my price range. One day, I even made a “Goodbye” backup.

I don’t know how I found this, but a little pressure on the back let my tablet boot again. Sometimes, the battery would register as empty and shut down once Android loaded – even when connected to wall power and the battery showed up as 100% again a moment later.

I zeroed in on the left-middle (viewed from the front in portrait mode) as the place to press. As I got used to this arrangement, I had to keep pressing harder. Eventually, I pried the back cover off with an orange peeler. The battery has two sections, and I’d been pressing on the bottom-outside corner of the upper pack. The battery itself did not appear bloated or otherwise damaged, and continued to work applying pressure directly to the battery pack (DUMB IDEA, by the way; DO NOT TRY) and pressing the tiny, exposed power button.

As it turns out, Android sees the battery as a critical part (unlike laptops), and I don’t have the tools or know-how to simulate one, but some kind of wall-only power mode would have been a courteous gesture, even if it were buried deep within the firmware.

Through another month or two of observations, I learned how the battery failed when I stopped pressing too soon after booting or if the tablet started drawing too much power, such as when turning on when when plugging it in while off. With this, I narrowed my diagnostic to just the battery pack, which I figured was worth trying to replace. Reviews of different compatible replacement batteries said not to expect more than a year out of it – even genuine ones. My guess is that it’s all old stock, changes pushed to the operating system intended to slow battery aging, or a combination thereof.

Replacing the battery once it arrived was only a matter of formality. The screwdriver that came with the kit was worthless, but I had access to a better one. I expected little of the battery, and I got little of it. It’s a step or two above junk, but it’s worlds better than the old one. I just need to be a bit more careful about how I handle my tablet from now on. If it only lasts another year or less, my plan is to replace it entirely.

Final Question

I can’t find any information online about applying pressure to batteries. Do you have any insights? If so, I look forward to hearing from you in the comments below or on my Socials.

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?

Telescope Bag Reinforcement

Good Morning from my Robotics Lab! This is Shadow_8471, and today I am reinforcing my telescope carry bag. Let’s get started!

I got a telescope last Christmas. As part of caring for it, I got it a travel bag to take it to local dark spots. A comment on the bag’s store page recommended reinforcement – possibly with the cardboard box the bag arrived in. I wanted a frame. Metal and wood can be expensive and heavy, so I went with PVC piping. My father and I bought supplies and started the project late January, but time constraints and busy schedules halted progress until now.

We measured the bag as 40”x12”x9”. The store sold half inch diameter pipe in 10 foot/120 inch segments. My intuition said to buy two pipes, but a quick mental estimate came up 4 inches too short: 2x(120-(40+12+9))=-4. Accounting for the diameters of perpendicular segments affords the needed margin: 3x8x.5”-4”=8”.

The base went together nicely, but the bag got really tight once the first two vertical supports went in. News flash: the bag is ever so slightly trapezoidal in shape. When we came back to finish the project this week, we re-measured from the top of the bag, but those measurements would have been too short for the interior dividing wall running lengthwise along the bag. In the end, we trimmed the pipes to fit outside this wall and lowered the height until the bag could zip closed over the frame.

One future improvement remains: my accessories are currently loose in a cardboard box that barely fits in the telescope bag. It stretches the bag, making it difficult to access – especially if I’m after something without pulling out the whole telescope.

Takeaway

This project had an unusually long break in it. While I would have liked a shorter timetable, it is always a risk when working with someone else on a relatively minor project. Our schedules just happened to line up this week well enough to follow through when I pushed a little.

Final Question

What small projects do you have going on that shouldn’t take long to finish? Might now be the time?

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].