World of Warcraft came out in 2004. I have played it on and off for years, and in all that time it never once occurred to me that I could change it. I installed other people's addons like everybody else. Thirty-some of them sitting in a folder, quietly doing things I never thought to look inside of. Last weekend I finally opened that folder, and instead of installing something, I wrote something.
A Question the Game Could Not Answer
It started with a small thing, which is usually how these go. I wanted to know how much time I had actually spent playing. Not the number you get from /played, because that one counts everything, including the hours the window sat open in a city while I did something else entirely.
Nothing in the game reports the difference, and nothing outside the game can see it either, because as far as your computer is concerned the window is just called "World of Warcraft" no matter which character you are on. The only place to get the answer was from inside. Which meant an addon, which meant learning Lua, which meant I was finally going to have to stop being a passenger.
What Writing One Actually Looks Like
Addons are written in Lua, and the model is event driven, which took me a minute to get my head around. You do not sit in a loop asking the game what is happening. You tell the client which events you care about and it calls you back when they happen. Your code stops being one long set of instructions and becomes a set of small reactions, and it lives or dies on whether you picked the right events.
My first real lesson had nothing to do with code and was thoroughly humbling. I wrote the thing, dropped the folder in place, typed /reload, and nothing happened. Typed it again. It turns out the client builds its list of addons once, at startup, so a brand new folder does not exist to it until you fully restart. I lost a good half hour to that, and I will never lose it again.
Discover, Never Configure
The rule I am proudest of came out of pure laziness.
I play more than ten characters on one account, and no two of them play alike. Different classes, different abilities, different cooldowns worth watching. That is where it gets genuinely hard to keep straight, and it is the whole reason the addon earns its place. My first version wanted me to tell it about every one of them. Set this up, then set that up, then remember to do it again next time. I hated it immediately. So I flipped it around. Instead of asking me anything, it looks at what is already sitting on my machine and works it out for itself.
There is no code in it specific to any one class. It rebuilds itself around whoever logs in, because it is not following a list I wrote down, it is reading what is actually there. Ten characters is ten different sets of buttons, and I never had to teach it a single one of them.
I keep thinking about how much of the software I use every day has this backwards. It asks you to describe your own situation to it, when it could have just looked.
The Part Where It Got Hard
Modern WoW deliberately hides certain values from addon code, so that nobody's addon can do their thinking for them. I have no argument with that. But the effect is that code behaving perfectly in one place falls over somewhere else entirely, and not politely. It throws. In some cases you are not even allowed to test the value, let alone read it. That bit me three times, and it changed how I write a guard. Every check needs a fallback, and the direction of that fallback is a real decision rather than a detail. One of mine defaulted to the safe sounding answer and quietly switched off data collection. Safe was wrong.
The nastier version is not the errors, though. It is the calls that succeed and hand you a zero. Ask for a value while the character is still loading and you get zero, and zero looks exactly like a real answer. Nothing complains, and you go hunting for a bug in entirely the wrong half of the program.
I now treat a zero from anything that could still be loading as no answer, rather than as the answer.
What I Am Not Going to Explain
I will be straight about this part. I am not going to lay out exactly what the addon does for me now. It grew well past time tracking within about a day, and the useful bits are the ones I would rather keep. Not because any of it is brilliant. Every piece is built from documented functions anybody can read. It is that the arrangement is mine, and part of the enjoyment is knowing nobody else is running it. If you want something like it, the door is wide open and always has been.
Why a Game From 2004 Was the Right Place to Learn
A game from 2004 lets me rewrite its interface. Not a plugin store, not a settings menu with checkboxes. Actual code, running inside the client, with a documented interface and real access to the screen, and it has worked that way for over twenty years. Almost nothing else I use is that generous. Most modern software would sooner take a feature away than let you add one.
And the stakes are zero, which is what makes it such a good place to learn. When I build software for one of my businesses, a mistake costs somebody something real. Here the worst case is an error message and a restart. So I tried things I would never have tried at work. I rewrote one piece seven times before it behaved itself, and by the seventh attempt I understood something about how the game stores its own data that no amount of reading documentation would have taught me.
That is the fulfilling part, and I genuinely did not see it coming. It was not the finished thing. It was the moment a system I had used for years without ever questioning turned into something I could open up, understand, and change.
Go Look Inside the Folder
So my honest takeaway is this. If you use something every day and one small thing is missing from it, go find out whether you are allowed to build that thing yourself. Check for an interface. Check for a documentation page. Check whether there is a folder somewhere full of other people's work that you have been dropping files into for years without once looking inside one.
A lot more is open than people assume. Same idea as learning backwards: I saw the finished thing first, in everybody else's addons, and worked my way back from it. The gap was smaller than it looked.
Now I cannot stop. I have a list.