Unshaded By Hue

2020-12-02

Disclaimer: The beginning chunk is a reflection on events as I experienced them in a fairly offhanded fashion, thus parts of it may be wrong. I’m no historian, nor do I have an eidetic memory.

My prior post here has hopefully been read before tackling this one. While not strictly required, it provides at least some context as to how I discovered and then picked up ROM hacking as a hobby. Suffice to say, though, that I discovered various early YouTubers using ROM hacking as a story medium, and was an avid fan. Inspired by these creators, I briefly experimented with the practice, but ultimately was put off. Only years later would I attempt another crack at ROM hacking, which is where we start now.

I formally entered the Gen III Pokémon hacking scene around 2010 or 2011, I believe. Right before what I consider to be its “second wave.” Something of a strange time, where a lot of early big names in the scene were moving on, and many commonplace features in modern hacks simply didn’t exist. Back in those days, you couldn’t even add new Pokémon without replacing vanilla ones. The same went for moves and abilities. I cannot possibly overstate how important- potentially taken for granted- these things are today in modern hacks. In less than a decade, the scene was propelled forward tremendously into today, even as the Gen III games are reverse engineered and brand new doors are opened in the form of disassembly hacking.

Of course, I didn’t start with all that cool junk. I began with more familiar territory- mapping- and gradually branched out to other skills like scripting, hex editing, music editing, and general graphics work. That’s not even touching programming in assembly (ASM) or C. There’s really a lot that can be put into a hack, and the community tends to push for a jack-of-all-trades ROM hacker over forming teams. In fact, in my experience, teams have often been frowned upon, so a lot of hacks are the work of a single person cobbling it all together themselves. It leaves a bit of a high bar at times, though I can understand how people are jaded from past teams unilaterally failing time and time again. My own belief is that they are absolutely viable, and it is a deficiency of foundation, organization, and internal politics that ultimately amounts to nothing.

For now, though, allow me to offer some advice. If you’ve ever wanted to jump into a technical hobby with little thought, no prior background, and are too stubborn- like myself- to ask for help, I have one word:

DON’T

Learn from my mistakes and know to ask for help. Unless you happen to be an absolute savant, there’s a world of hurt and discouragement likely on the horizon. I can’t even tell you how many ROMs I broke, or in how many ways. Just… one after the other, sometimes weeks or months following regular work on them. This isn’t helped at all by the inconsistent quality of many binary hacking tools, some of which have still not been fully replaced. I’m so familiar with the sound of a hack crashing that, during a stream of the pre-public version of my hack Creamy, I immediately knew what had occurred when it crashed live. Everyone- including the streamer- is wondering what’s going on, and I just say, “Yeah, no, that’s the sound of a crash. I recognize it.”

Talk about embarrassing.

Through all of that tenuous failure and hardship, however, I did learn things. It’s hard to continuously throw yourself at your own brick wall without eventually maximizing efficiency, and finally breaking through to the next layer. That last sentence barely counts as a metaphor, but it’s there to imply, specifically, my struggle. Take something like, say, scripting- the creation of in-game events- which I’m quite proficient in today, and I remember banging my head against that wall for hours. All of the trouble of writing and debugging a script, and it just doesn’t work after everything. It can be infuriating.

Just to give people an idea of what scripting is like, here’s an example of the classic Hello World with excessive comments:


#dynamic 0x720000       //start looking for free space at this offset

#org @main              //start of code block
lock                    //locks the PC and NPC in place
faceplayer              //NPC faces the PC
loadpointer @text       //used to load a text pointer
callstd 0x6             //calls the "standard function" for a regular textbox
release                 //releases the PC and NPC
end                     //ends the code block

#org @text
= Hello, world!

The Gen III games use this scripting language for every event, and us ROM hackers use it as well. Works for what it is, but lacks a certain level of scope due to being so domain specific.

In those earlier days, I attempted to help others in their hacks. Gather experience before jumping into my dream project. That’s very sound advice right there, honestly. One shouldn’t become overly ambitious to the point that it clouds their judgment and, moreover, a lack of skill. That is, often, what happens to fan games like these, and even the people I tried to help. Of the maybe four or five hacks I worked on in some capacity back then, only one ever released anything (that I recall). Even then, it was horribly buggy, barely counted as an alpha, and had undocumented changes that forced the creator to start over. Measure yourself, folks, and plan this out.

On the upside of that example, though, I met a friend that I still have to this day through that ordeal. I had been out of contact with him for a good two or three years, but right around when I came out of “retirement” to start Creamy, he messaged me. We reconnected, and have rebooted that hack again. If you’re wondering why I said again… well, this hack has quite an internal history of being scrapped and started over multiple times. That cycle becomes relevant to my career, as much of it has been taken up by that.

A major factor was creating a ROM base. There weren’t really ones like there are now, and it was a fantastic learning experience for me in hex editing. A hex editor, is, in many ways, the most important tool of a ROM hacker. It allows you to edit the raw binary data of a file, represented in hexadecimal values. That is, base-16, as opposed to the standard decimal’s base-10. Everything that higher level tools can do are possible in a hex editor, but it’s not nearly as intuitive. For the purpose of inserting custom programs written in ASM, expanding tables, or making byte changes or corrections, they are king. Nowadays I prefer to automate the insertion of ASM and byte changes with the phenomenal armips assembler, but it will never replace a good hex editor.

The first version of my ROM base was a clunky hunk of junk. It was horribly broken and just piled on stuff to be super special awesome and provide hours of power, and other stupid phrases that make me sound like a salesman trying to sell software to idiots. Despite its ultimately flawed existence- which I wasn’t aware of at first- we rebuilt the hack on it. Then we had to redo it once more when I realized how badly I’d messed up. The next time, I, like a fool, maintained two separate branches- without sexy version control or even a proper changelog, mind you- and it remained, up until I “retired,” the foundation of our renewed-renewed hack. It was a much better beast, and benefited from much of the cool new power allotted to us by wonderful people sharing their ASM and reverse engineering work.

As a very quick aside, when I refer to assembly or ASM, I’m referring to a CPU’s instructions. Like, addition, subtraction, logical operators, and working with registers. It’s more or less about as low as you can get before hitting binary code. It offers more control and usually raw power than a higher level programming language, at the expense of usability. The GBA uses an ARM7 processor, which has two instruction sets: Arm and Thumb. For a number of reasons, Thumb is used in hacking over Arm, despite it being more limited. What it lacks there it mostly makes up for in speed.

This next generation of ROM hackers and their creations were a step up from what came before, technically speaking. No longer were we nearly as restricted by the game’s vanilla limits, and could go beyond them. That applied to features ported from later Pokémon generations- the Physical/Special split, for one- the aforementioned addition of new Pokémon, moves, and abilities, and brand new things entirely. Did you endeavor to make a more difficult hack that imposed challenges like the inability to run away, or to use items? Done. Want better music? You can expand the number of instruments and tracks per song for your uses, and add a custom sound mixer. New Poké Balls, new forms of evolution? Done and done.

I could continue to list stuff for a while, honestly. It’s not something to easily quantify for a fairly informal post like this. The gist of it is that this was a wild time to get into Gen III hacking, and the extent of just what you could pull off in your own hack was gradually increasing. It still is, though a great deal of focus has shifted to the disassemblies in recent years. What that means is that the Gen III games are being completely reverse engineered, such that you can edit everything and generate a working ROM instead of doing it the old fashioned, binary way. This has profound advantages, and disassembly hacking is truly the way forward. It’s a sort of final realization of any ROM hacking community, and I can’t express how cool it is that we’ve reached that point. Took longer than it needed to, I think, but better late than never.

Much of my remaining time before a lack of interest started to settle in was fairly uneventful. My friend and I would work on our hack, talk about what we wanted to do, and I’d add new features as they came along and seemed relevant to us. Our dissatisfaction with the second run had prompted a third, however, and the sporadic progress and lack of organization began to wear on me. I was the most critical of our work as the main writer, and just couldn’t create what I wanted. The hack deviated further and further from its original incarnation- which, to be fair, was far from quality writing- and despite some initial enthusiasm towards the new direction, I couldn’t do it. The creative spark had left me.

So I walked away.

Fell out of contact with my friend, dropped the hobby, and archived all of my old work, tools, and documentation. My love for Pokémon as a whole had already been waning around this time, and it still isn’t the same today. I’m not excited when a new game comes out, nor do I really care to play hacks anymore. There’s more context to the former in my distastes with Nintendo, but they’re not as relevant as the fact that I’d simply moved on. Maybe I just grew out of the nostalgia, or it couldn’t sustain itself anymore. All I know is that I stopped, and didn’t come back for a good few years.

The inkling to create again began when I started watching streams regularly. Not at first, but nearly a year or so into that. A friend of the main streamer I watched- Kywil- was streaming his first ever run of Pokémon Emerald, and I started attending for kicks. He’d never played a main game past Gen II, and it was part of a running series of playing each generation. So I started giving him tips, and continued appearances culminated in greater involvement with Kywil’s community. That itself extended into watching some of his streamer friends, and I’ve come to know several wonderful people for nearly three years. Thus, it was near the conclusion of his EM run that I contemplated hacking again, as a way to prolong his Hoenn adventure. Give him some extra content before he moved on to Gen IV. Give back a bit.

Setting everything back up wasn’t easy, especially since I had made a hard switch to Linux over Windows around the time I “retired.” It was a very imperfect setup- WINE compatibility is a nightmare for this stuff- but it didn’t have to be fancy. I wasn’t after anything groundbreaking, only some custom events to give Kywil event Legendaries. This took the form of a fairly hastily thrown together pile of community-inside-joke meme trash, the likes of which I had a ton of fun with. Seeing people react to my work after a prior career of almost no public releases was fantastic, but especially Kywil’s reaction. There’s a certain fulfillment in seeing a man be taken so off guard by your silly writing that he starts laughing, gets up from his chair, leaves for a moment, then comes back, flips off chat, and calls you out specifically for being so sly.

All in a very joking manner, obviously.

This brings us fairly close to today, with the faint beginnings of my hack Creamy. It originally began as a desire to get Kywil to stick with Gen III for longer, with the premise that he should do a Nuzlocke run in Fire Red. I reasoned that it would be a different way to experience Kanto again, and playing EM would have already made him familiar with most of the mechanics. Furthermore, I had specialized in FR back in the day, and could do much more with it than EM. Really work my mojo and do more than some custom events and a bit of under-the-hood work. My excitement wasn’t shared by Kywil, though, and it took some prodding to get past his fears of it not only being his first FR playthrough, but also his first Nuzlocke.

As part of my initial proposal, Creamy was only going to be an updated FR base for Kywil to play on. Custom events were to be few and far between- so as to preserve the vanilla Fire Red game- and have involvement from the rest of the community in their creation. I didn’t even think that the hack needed a name, and referred to it merely as the Nuzlocke hack for several months. Perhaps my most substantial gameplay change in the early development was rewriting a lot of NPC dialogue, and giving each town and city a theme with which to base that writing on. Viridian, for example, has multiple people speculating on the identity of its mysterious Gym Leader. The majority of NPCs throughout Creamy also have more than one piece of dialogue, often with varying opinions and subjects to make the world seem more alive.

The shift to hijacking story events for my own take and christening my ridiculous creation Creamy was a slow one. This was most apparent in the Rocket Hideout in Celadon, where I rewrote all of Giovanni’s dialogue to allude to something beyond the default plot. Creamy was officially given its name and an altered titlescreen not long after, to the joy of Kywil. Regardless of my repeated statements that much of my work was very lazily done- it really was, at times- the quality of the hack continued to rise. My reinvigorated drive to create a Pokémon game demanded that I do better, and I reciprocated. More and more of the plot was altered, I began scaling up all Trainer teams for more challenge, and new features were added every so often. Pivotal battles like with Gym Leaders began to have fully custom teams, and were all double battles as per an agreement with Kywil.

Not everything was perfect, however, and we ran into a plethora of bugs during and outside of the streams in my own testing. I also strongly believe that my scaling was very insufficient for nearly half the game, and the rudimentary nature of the enemy AI rarely correlated to the strategies I attempted to create. Kywil also began to take extended breaks from Creamy, as some of the more tedious aspects of a Nuzlocke- grinding- were wearing on his enthusiasm. Rather demoralizing, but I never gave up hope. Creamy is more than just my hack and Kywil’s challenge. It is an expression of this little community I became a part of, good and bad included in box. Whether or not he actually beats the Nuzlocke doesn’t matter to me as much as he and everyone else enjoying my absolute nonsense.

Though, I admit that can be difficult to believe with how much the difficulty has ramped up towards the end of the run.

On that note, we’re very close to the conclusion of Kywil’s Pokémon journey. Victory Road has been traversed, and the final challenge in the Pokémon League awaits. I can’t even begin to describe my excitement, not only for the main game’s conclusion, but for the post-game content I have planned. In addition, this December marked the third anniversary of the start of Creamy’s development. Freaking wild to believe that it’s been three years, and I’m really hoping it goes out with a bang. We all deserve that from this adventure, and the nightmare we dare call the year 2020. It will also open the door to working on my next hack, which I’m equally excited about.

The future is truly bright in some places.