← All work

Turtle WoW

Four years owning every raid, dungeon and boss encounter on the largest Classic+ server in the world

Role
Lead PvE developer - every vanilla raid, plus custom dungeons, raids and quests. Maintainer of the bridge to upstream VMaNGOS.
Period
2019 - 2023
Status
Shipped
Stack
C++ · SQL · VMaNGOS · MySQL · Encounter scripting
200k+
concurrent players at peak
4 years
owning every PvE encounter

Lead PvE developer for four years on the largest Classic+ World of Warcraft server. Everything players fought - stock raids, custom dungeons, boss scripting, the quests holding it together - came through me, on realms that peaked above 200,000 concurrent players. The growth started at the end of 2019, when I brought a dead server’s player base across.

01What the job actually was

PvE is most of what a Vanilla server is. Every boss a group fights, every dungeon they clear, every raid a guild organises its week around - all of it is content somebody has to build, script, tune and keep working while the population grows. For four years I carried all of it: the encounters the core shipped with, the custom dungeons and raids built on top of them, and the quest chains holding the two together.

Turtle had about thirty players online when I arrived, and I did not arrive empty-handed. Hyjal, the server my own players were on, had stopped - and a stopped server still holds the one thing it can no longer use: accounts, and the characters people spent years on. Competing projects offered money for those databases. Turtle got them for nothing, because it was the only server in that scene I thought had a future. Its administrator merged them in, population went past a thousand, and it compounded from there.

Scale changes what the job is. At thirty players online, a broken encounter is a bug report somebody files. Above a hundred thousand it is every guild’s raid night at once, across two continents of timezones, and a fix that is subtly wrong is found by more people in one evening than most software has users in a year.

02Repairing the raids everybody actually runs

The server core descends from MaNGOS, and its vanilla raid encounters had never really worked well. Scripts that approximated a fight instead of reproducing it: phases that fired at the wrong time, threat that behaved nothing like the original, abilities and immunities that were simply absent. Every server in this lineage inherited that and most of them lived with it.

I went through the vanilla raids and fixed them - encounter by encounter, phase logic, timers, threat behaviour, add handling and ability rotations - and then tuned them so they played the way people remembered rather than the way the database happened to describe them.

Custom dungeons get the announcement posts. But a returning player judges a Vanilla server on Molten Core and Blackwing Lair, because that is what they came back for. A server whose flagship raids are subtly wrong loses people quietly, a month in, without anybody filing a bug.

A raid boss encounter as a state machineAn encounter runs as phases advanced by health thresholds: an opening phase with an ability rotation on cooldowns, a second phase adding a timed wave of adds during which the boss is immune, and an enrage phase where damage doubles. Underneath all of them run a threat table, per-ability and per-phase timers, add spawn and leash rules, and an immunity table. A wipe returns the encounter to the start, and every timer, threat entry and add has to be cleared with it.a wipe returns all of it to the start — every timer, every threat entry, every addPhase 1ability rotation on cooldownsthreat table picks the targethealth ≤ 70%Phase 2add wave on a 25 s clockboss immune while adds livehealth ≤ 30%Phase 3enrage: damage doublesthreat rules change againRUNNING UNDERNEATH ALL THREE, FOR FORTY PEOPLE AT ONCEThreat tabletaunt, multipliers, drop-offTimersper ability and per phaseAdd wavesspawn, leash, despawnImmunitiesper phase, per schoolthe scripts this core shipped with reproduced the shape of this and got the parts that decide the fight wrong
One boss. Multiply it by every encounter in every vanilla raid, then by a population that grew past two hundred thousand, and the reset arrow is the one that matters: if a single timer or threat entry survives a wipe, the next attempt is subtly wrong, and nobody files that as a bug.

03Custom PvE content

Custom content is the half with no upstream to fall back on: dungeons, raids and quest chains written against the server core with no reference implementation to check them against, where correct is whatever the team decides correct means. Hateforge Quarry - a five-player dungeon in the Burning Steppes, shipped in patch 1.16.1 in July 2022 - is the piece of it still visible from outside.

Custom content on a Vanilla server is two halves that have to agree: a client-side patch archive carrying the map, the models and the client database records, and the server-side data and scripts driving the encounters. A mismatch between the two does not fail loudly - it produces a boss that does nothing, or a door that is not there for half the raid.

04Holding the bridge to upstream

Turtle’s core is a fork of VMaNGOS, and it carries an enormous amount of custom content. That is exactly the condition under which a fork stops being able to take upstream patches: every custom change is another place a cherry-pick conflicts, until eventually nobody tries and the fork inherits every bug upstream has already fixed.

Keeping cherry-picks possible was a standing part of my job for four years - keeping custom work structured so it sat beside upstream code rather than inside it, and staying close enough to upstream that a fix could still be taken when it landed.

05Decisions worth explaining

The databases were worth money. Turtle got them for free.

A stopped server’s account and character databases are an asset, and competing projects made paid offers for these. The cheap way to absorb a population is an announcement telling people to come and reroll, and almost nobody does: the characters, the items, the guild and the years are the reason they were there. I handed the databases over for nothing, to the one server in that scene I believed would still exist in five years - partly because the alternative was watching people I had played alongside lose everything they had built. It was a call about which project had a future, made before there was evidence for it. Turtle went from thirty concurrent players to over two hundred thousand.

A fork that can still take patches

The tempting way to add custom content to an emulator core is to change the core. It works immediately and it costs you upstream forever. Keeping the fork mergeable is not an architecture decision made once - it is a small tax paid on every change for four years, and it is why bug fixes from upstream were still reachable at the end of that.

Questions about this project?

I am happy to walk through the architecture, the parts that did not work, or the code itself.