Showing posts with label mh. Show all posts
Showing posts with label mh. Show all posts

Thursday, March 7, 2013

2.39. The Different Guild

"Archimonde the Defiler"
Artwork by Jim Nelson

Archimonde Anxiety

I have reason to believe that Xanax was invented as a result of the Archimonde encounter.

Since Blain's return to leading in full force, we saw a tremendous turnaround in raid progression. Serpentshrine Cavern and Tempest Keep were systematically blown apart, and the first boss in Mount Hyjal, Rage Winterchill, was one-shot with zero preparation. Bosses that followed -- Anetheron, Kaz'rogal and Azgalor -- were all pushing up daisies. To ensure our continued momentum, Blain switched gears and diverted us to Black Temple. High Warlord Naj'entus was our first victory there, and I earned my five minutes of fame dominating the damage meters during our execution of Supremus. But our rocket thrust was now in jeopardy. Blain was comfortable with the amount of people now in possession of their PvP trinkets, which meant it was time to return to Hyjal Summit, and wrap up the only outstanding obstacle:

Archimonde.

I dreaded the return to Hyjal Summit because after stripping Archimonde of all his bluish tint, his ret-conned Eredar lore, his pixels and sound effects and 3D model animations...I knew exactly what he was: A zero margin-of-error linchpin encounter. Linchpins like this caused anxiety to nearly strangle me, ever since Magtheridon fell to DoD's raiders a year earlier. Our strengths would be diminished, while our weaknesses would float to the top. Team jell was now much lower in importance on the totem pole. In its place stood the "personal accountability" obelisk of doom, wherein each player had to take their survivability into their own hands -- or ensure the death of all of us.

No carrying.

No covering for one another.

No room to excuse lag or timing or your add-ons or your slow-ass computer.

Everybody performs...or everybody dies.

As with linchpins before this, the typical tactics of a guild leader weren't an option. Continued failure couldn't result in kicking these players to the curb, bringing in another round to replace them. We had invested heavily in our 25-Man Progression team by this point, many of whom were well-geared -- starting from scratch because a certain person who "didn't get it" wasn't going to work. I had to be proactively correcting the roster's issues, not be a victim to it. Rather than wait for someone to complain that they used their Tears of the Goddess, but "lag got them", I went to the roster ahead of time, spoke to each player individually, and got a rundown of their Internet provider, general stability, problems they'd experienced with latency in the past. I even went so far as to check which players were using a wireless router, many of whom were none the wiser on its detrimental effects to real-time streaming online games.

In today's age, where Netflix usage is commonplace and every third house has an XBox 360 playing Call of Duty online, this may not seem like such a big deal. In 2008, however, working on Archimonde via a wireless router would sign our death warrant. Packet loss was an inevitability on hardware in those days. Even with players that claimed to have never experienced a router problem in their life, I still politely insisted that they cut over to a hard wire. It would only take one player death for this to end poorly. One lag spike, one moment of wireless latency that would bring it all crashing down. Each vocalist in my choir had to be pitch-perfect. The potential for any one single player to be the cause for a wipe left me perpetually wound up, a constantly bouncing ball of nerves. My mind begged for release but would gain no such relief from prescription meds.

"Legend of Mount Hyjal"
Artwork by Trent Kaniuga

Twilight of the Gods

April 13th, 2008, was an otherwise ordinary Sunday. Discussion on the guild forums circulated around various topics: whether or not win-trading was taking place in arenas, a link to a "Teron Gorefiend" simulator available on the web, and a group of players leaving MySpace for a new site that was gaining popularity identified only as "Facebook". Chief among the posts, however, was a discussion title "Archie", including videos and references to the Elitists Jerks forums. DoD actively engaged in discussion and assessed valid strategies. Of primary importance was the acquisition of PvP trinkets: our backup plan to break Archimonde's fearbomb...if you had the good fortune to be heading uncontrollably towards Doomfire. The healthy debate of strategy, what would work, what we should try, how we should solve problems on-the-fly was impressive.

They were aligned. Constant, consistent success.

---

As we huddled near some Night Elf architecture, buffing, flasking, and eating food, Blain gave us the 411.

"We can do this tonight."

Inside my brain, confidence was at war with skepticism. My inner realist kept picking away at me. Archimonde was a brick-wall boss, a linchpin with no room for error, a verifiable guild-killer. Every failure would be the result of a single man or woman fucking up, ruining the chance for the rest of us. Handled incorrectly, this would cause bitterness to impregnate the team. Animosity would incubate, eventually blooming into hatred and disgust. An undeniable stench of meh would fill the room. Left alone, it would infect the team and devour us from the inside out. Signups would fall off. Players would stop talking to one another, replaced by sarcasm and cheap shots.

"Oh, great. Him again. Thanks for ruining our raid night on Archimonde YET AGAIN. I love having my time wasted."

Eventually, the guild would collapse as its insides were eaten out. The risk was very real, the question was, would my guild be ready to rise above that?

In a final act of encouragement, Ater wrapped up the strategy by reiterating the guild motto he coined many moons ago -- one whose meaning was more relevant now than ever, due to Archimonde's Soul Charges:

"If we don't die...we win."

Descendants of Draenor defeats Archimonde,
Hyjal Summit

Famous Last Pull

The first few attempts allowed us to get a feel for timing on fears and Doomfire calls. Most important was the first-hand experience on the air blast, and at what part of the arc was most appropriate to use Tears of the Goddess. Too soon, and the buff would wear out before the player landed. Too late, and they'd become a fine red paste across the green plains at the Hyjal Summit. Misjudging either way produced the same result: falling to one's death, or "cratering". Each death allowed Archimonde to generate a Soul Charge, which he would then burn on us and wipe the raid.

While players adjusted to the timing of air burst and perfected use of their Tears, Blain observed the position of the groups. He spread us into the four prongs of a fork, with the tanks and melee at the base, and continued to refine this placement as the hours ticked away. Ater kept communication flowing back to the raid, alerting us of air bursts, and with each attempt he improved his own positioning, avoiding the air burst himself.

As expected, the mechanics were unforgiving. Doomfire wreaked havoc on us, especially during fear-bombs. Players cratered as they struggled to match their timing with their latency. The chain reaction of player-death-to-raid-wipe was alarming...and blunt. My fear was realized. One simple mistake was all it took. As soon as a player died, Archimonde's Soul Charge took out massive groups of players until it was a wipe. By the fourth and final hour, we completed a total of twenty-two pulls, and not one attempt had whittled the boss's health down below 50%.

"Last pull", Blain announced in Vent.

We arrived at the tail end of the raid. I did not want us to leave with ours tucked between our legs.

---

Ater's infamous countdown in Vent began, thus signaling the start of our twenty-third and final attempt of the night. I moved into position along my fork prong and began to light the giant Eredar up with Vampiric Touch and Shadow Word: Pain. A bluish beam of shadowy energy followed my DoTs, flaying Archimonde's mind. Doomfire etched its way across the plains without remorse, seeking targets to ignite; I side-stepped the fire and continued my shadowy barrage. Images of Battle.net forum posts began to flash in the back of my mind:
"DoD fails at raiding, disbands. LOL"
"Zanjina an embarrassment to Deathwing-US. Worst player on server."
I snapped out of it and refreshed Vampiric Touch to keep the mana flowing back to my group. Ater held Archimonde tightly in position, calculating small, surgical shifts to avoid air bursts. A tremor totem hit the ground, and moments later, Archimonde dropped a fear-bomb. Melee shifted for half-a-second in terror, then instantly returned to their duties...the tremor totem mitigating the bomb. My chat window lit up in bright purple as Melkezadek's' macro spammed me.

[W From] Melkezadek: FEAR WARD Cast: You're next!!!!

I moved towards Cyrant, hit him with a Fear Ward, and and spammed my own macro.

[W To] Neps: FEAR WARD NOW ON CYRANT...YOU ARE NEXT OMGWTFBBQ!!!!!!

Calm. 

Focus.

The air burst struck me and I was flung in to the air.

Hold.

Hold.

I reached the apex of the arc.

......Now.

I spammed Tears of the Goddess and drifted back down to the grass, rushing back into position. Cyrant dropped his tremor totem, moments before another fear-bomb, safe with my Ward shielding him from the chaos.

"Ater's air bursted."

"The warlock's are cut off from Doomfire."

Blain called out to Eacavissi, warning him of the impending fear bomb. A handful players along the ranged forks began running in random directions as panic and tension continued to smash its fist at the door.

"STRAIGHT. BACK." Blain reminded everyone. Running in a zig-zag pattern would only make Doomfire more vicious as it snaked its way toward targets. Staying in a straight line was the only way to keep it at bay, running along the length of the fire, rather than towards the tip. The fear-bomb hit; melee and tanks remained safe and in control.

"Oh, sweet Tremor." Blain said with relief.

I dropped from Shadowform and began putting whatever minuscule heals I could on the the players eating Doomfire. Houla dropped dangerously low, his health-bar a tiny green sliver on my screen. One more tick of damage would end him...along with this final attempt. I slapped on a renew and continued to look for players that needed help.

Suddenly, Blain called out. The moment of truth had arrived.

"OK, Bloodlust in 3, 2, 1...Go Bloodlust. GO. All out."

"Even healers. DoTs..." called Neps.

"Everybody DPS, there is no healing" added Breginna.

Lightning bolts flashed around the great Eredar, and the sky faded to red as night elf wisps bore down on him. Every raider blew every cooldown they had, all DPS, all working together, all alive....

At last, one single blinding explosion erupted in a shower of arcane energy, and Archimonde's battered armor lay at our feet. I couldn't believe it. Other players in the raid joined me in disbelief.

"...four fucking hours??" asked Dalans, as if to say how is this even possible?

Disbelief hung suspended while reality slowly set in. One of the most difficult bosses in The Burning Crusade, killed in only one night of work. Visions of the weeks we wasted on Gruul and Magtheridon, making the same mistakes over and over, were quickly blurring over. We had become so used to the same failures, the same excuses, that it was hard to digest what an accomplishment this truly was. Our crutch had been the profound claim that we took anyone to raids; that we felt everyone deserved a shot at end-game content. That mission statement wasn't wrong, but simply incomplete. We had failed with an incomplete vision for so long that an accomplishment like this seemed unreal.

But it was very real.

"Setting players' expectations of what our unified goals were" had finally taken hold of this group of players. Keeping people accountable, disallowing them from making excuses for failures, proactively solving problems before they manifested...it was like a different world. A different game.

A different guild.

Thursday, February 14, 2013

2.35. Time Travel

The entrance to Hyjal Summit in present day Azeroth
blocked by an impenetrable gate (Vanilla/TBC era),
Darkwhisper Gorge, Winterspring

Mind Control for Fun and Profit

Fueled by the back-to-back deaths of Kael'thas Sunstrider and Rage Winterchill, the progression raiders seared with electricity upon returning to the Caverns of Time. Hyjal Summit boasted a uniquely different design when compared to raids of the past. Rather than moving from trash pack to trash pack, weaving through corridors and dungeon halls to discover what boss awaited us, Hyjal was a re-creation of the final level of Warcraft III: Reign of Chaos, the RTS which would seed an eventual MMO. In that final mission of the RTS, "Twilight of the Gods", players wielded the combined forces of the orcs, the humans, and the night elves, combining the might of their armies against wave after wave of undead minions, backed by the power of the Burning Legion. A series of doomguards would appear at various intervals, signaling a major milestone that needed to be overcome.

Those doomguard would serve as our boss progression through this instance.

As it was in the original RTS mission, waves of undead scourge, backed by the nathrezim, would come to us. Our tanks grabbed a hold of them while we burned them down, awaiting each successive onslaught. To some, this was a fresh new way to approach raid content. To others -- like Dalans -- it was a nightmare of repetitive tedium. If we happened to make a wrong move on the boss, setting off a chain of events that led to our wipe, we'd have to restart the eight waves of mobs. Every boss wipe guaranteed eight new waves of trash. As a result, raiders had more of a vested interest in putting in additional effort. Nobody wanted to redo trash. The challenge was in teaching players to keep their opinions about the trash to themselves. It benefited no one to complain, and only served to chip away at the integrity of the roster. So, I reminded folks to keep quiet and focus on delivering boss kills, which I felt was a much more prudent strategy to combat complaints and burnout.

I continued to find my own place as a contributor during these later months in TBC, struggling for placement on the damage meters. Thankfully, The Battle for Mount Hyjal gave me another opportunity to shine. Nestled among the many waves of banshees, ghouls, infernals, gargoyles, and frost wyrms were human units named Shadowy Necromancers. These casters, draped in blood-red cloth, could be mind-controlled by a priest, thereby revealing their secret ability: Unholy Frenzy. This 100% attack speed buff could then be cast on players whom benefited greatly from said spell. Since my own damage continued to struggle among the many well-played folks in our roster, I took on the responsibility of mind-controlling, buffing players like Blain, Jungard, and Abrinis, whose melee damage shot through the roof as a result. They sawed through waves of undead flesh with a greater proficiency than I could ever hope to attain. Buffing others was a less glorious role than climbing the damage meters, but it helped me regain a sense of tangible contribution. Over time, I grew more likely to believe I was of value to progression, rather than remain the Achilles heel of it.

After Rage Winterchill came Anetheron, a dreadlord that summoned infernals to pummel the raid while a Carrion Swarm enveloped us, reducing the effectiveness of our healers. It was vitally important that Anetheron be faced away from the raid because of his heal-dampening locusts; healing efficiency needed to remain at 100%. Meanwhile, Anetheron's strikes leeched health, so Blain took on the role of applying wound poison to the boss. Two could play at the nerf-healing game. Meanwhile, a fire-resist tank would position himself near Jaina Proudmoore, in preparation for Anetheron's inferno. After three seconds, a fiery infernal plummeted to the ground, striking everyone in an area with AoE damage. The infernal needed to be picked up before it began one-shotting players, and a focused DPS group had to burn that rock creature of greenish fire down as fast possible. Dragging the infernal to Jaina caused her to join in the fight, which was a helpful trick to widen the margin of error.

Only one weekend of work was all it took.

Anetheron outstretched his arms in agony and dissipated in a puff of smoke, his armor crashing to the ground. We were now 2/5 in Hyjal, with only two weekends of raids in -- and time was still left on the clock to leave the humans behind, and move up to join the orcs in their defense of the world tree.

Descendants of Draenor defeats Anetheron,
Hyjal Summit

Clutch

Kaz'rogal proceeded Anetheron, providing only a moderate challenge. Aside from a nasty cleave that could one-shot unsuspecting melee (as damage was shared among all targets), and the occasional warstomp which stunned players in close proximity, Kaz'rogal had a truly evil trick up his demonic sleeve in store for the casters. He placed a debuff, a "Mark of Kaz'rogal" on unsuspecting players. This debuff would drain mana from the target like a siphon. If the player was unable to keep their mana pool afloat during this time, they would become a mana bomb and detonate, taking out nearby players in the process. So, while he was technically a linchpin of sorts (as any one caster could take out the entire raid), the margin of error could be mitigated by shadow resistance gear and mana potions.

Kaz'rogal joined Rage Winterchill and Broodlord Lashlayer as one of the few bosses we were able to one-shot on our very first pull of the boss, an inconsequential challenge upon reflection. A few weeks later -- when a number of poorly positioned casters, empty of mana, carved gigantic chunks out of the living -- was when the challenge began to reveal itself. And when it appeared that the attempt would be a wipe, as a skeletal crew of several tanks, a few melee, and only one healer remained, the situation looked grim. Our minds turned to the approaching wipe with contempt and disgust, preparing for the monotony of having to clear another eight waves of trash. I rested my head down on the desk, waiting to hear when it was safe to release and run back.

And then, something brilliant happened.

The lone healer, who just happened to be a healing officer and a druid, decided to take matters in to her owns hands. Breginna bolted towards the tanks, and shifted into Bear Form, standing next to them to diminish the impact of Kaz'rogal's cleave. Someone in Vent yelled out "Go Breginna!" and I glanced back up at the screen.

What the...

The casters and healers were dead, so the Mark of Kaz'rogal held no more weight. From here on out, it was tanks and melee, albeit a pitiful few. But there hopped Breginna in bear form, waiting for the cleave to come in, eating it, and gaining tiny bits of health by burning rage into Frenzied Regeneration. It was a genius move. By being in bear form, her mana pool was non-existant, yet she was still able to keep herself alive in those remaining few moments while melee laid into the doomguard with every last bit of vigor in their virtual veins. People in Vent began chanting to Breginna, the volume escalated to that of an entire crowd cheering on their team, as the seconds clicked off to the end of the game. Breginna said nothing, continuing to hop in Bear Form, tanking Kaz'rogal, eating cleaves, burning rage for heals, while the last few rogues and warriors drove their blades into the boss's ankles.

Kaz'rogal, looking as stunned as I at this clutch turnaround, collapsed dead at Thrall's feet. Cheers filled Vent as the bear druid stood up and did a dance. I stared wide-eyed at the screen. Breginna had saved the day.

Descendants of Draenor defeats Kaz'rogal,
Hyjal Summit

The 180

Rocraw was in a funk.

Normally, the orc warrior that held the line at the head of the raid was a constant beam of positive energy that the raid had come to rely on. His positive attitude, humility surrounding his class, and dedication to his fellow guild-members established him as a recognizable face in the roster -- one we'd all come to rely on over these many months. Regardless of whether we were struggling or enjoying success, Rocraw was a consistent, solid member of the team...and a loyal friend. So to see his attitude suddenly spiral downwards was disconcerting. Once laughing and joking with us in Vent, he grew quiet and found little amusement in the day-to-day chatter. He grew clumsy behind the wheel inside raid instances, made more mistakes, lost control of adds with greater frequency. For all intents and purposes, Rocraw seemed to be vacant, mentally checked-out and lost in a confusion of his own troubling thoughts.

I should have seen it coming; the path of breadcrumbs he left me any hippie with a talking dog could have followed. But as with other events in my guild that I let slip through the cracks, I failed to pay attention to each individual shard of the mosaic. Each exercise in guild leadership was the act of dumping all the puzzle pieces out on the table. It was as though a lunatic was challenging me with mad ravings: all the thousand pieces must be placed together correctly in order to see the final picture. One by one, you rotate and flip them, you plug them together until the picture matches the box, then wipe your hands and move on. Yet, when you are putting the puzzle together, the individual pieces make little sense. A fragmented beam of light here, a shrub there. You become frustrated, trying to jam pieces together, thinking they fit when they don't, because you lack the image of that final picture. So what do you do? Go back to the box cover. Review the big picture. Ensure you're on the right track. Rinse. Repeat.

As it was with many of the decisions I made during The Burning Crusade, I left the puzzle box cover face-down, never referring to it, unable to grasp the impact each piece had on the entire picture. Until it was too late.

It had something to do with her.

Tuesday, February 12, 2013

2.34. The Lemmings Are Marching...

Descendants of Draenor defeats Rage Winterchill,
Hyjal Summit

Rage Winterchill

My heart was racing. I frantically scanned the landscape for anything that could kill me, but wasn't certain exactly what to look for. Twenty-four players were in the instance with me and seventeen of them were dead. My eyes darted down to the damage meters. I took a deep breath, trying to remain calm, keeping my DoT rotation as maximized as possible. Being unprepared was unsettling. Our attention had been a laser for the last five weeks, burning a focused beam of light squarely through Kael'thas Sunstrider and his council. The encounter's nightmarish complexity of tactics and coordination dominated our thoughts and invaded our dreams. With all of our energy poured into his defeat, we spent little time on anything beyond his lifeless body...yet he lay dead at our feet only an hour earlier. In any other case, this would be cause for celebration and an early night off.

Blain was uninterested in ending the raid early.

We still had a long road ahead. Two full tiers of content were now crushed under our boots, leaving us to tread the final path through tier 6. And there was a deadline to keep.

The enormous skeletal necromancer continued to lose health, while Blain kept the raid calm -- kept me calm. Panic was not an option, regardless of your level of preparedness. Be calm. Focused. Do your job. Stop calling things out. Winterchill's health melted away while I hopped out of Death and Decay, my PvP trinket granting me the ability to break out of his ice-block. A few moments later, the lich burst apart in a flash of light.

We had one-shot Rage Winterchill, the first boss of tier 6 content. The last time we had one-shot a boss on the first pull was Broodlord Lashlayer, third boss of Blackwing Lair. Vanilla. Two years earlier. I was beginning to think that the new raid mentality was sinking in. The guild's expectations of fun were starting to align with ours. Constant, consistent success. And for the first time in months, I felt like Illidan was once again squarely in our sights. Our confidence remained intact.

---

This surge of confidence catapulted me back into examining the issues that plagued the guild. Long had I been a slave to the roster, with its constant fluctuations and myriad of faces giving me varying degrees of commitment. Step one was already behind me: set expectations clearly and concisely, so there was no room to misinterpret who we needed each night in raids. In order to shift the power the roster had over me, I needed to grow the pool further, riding on the steam of our recent completion of tier 5. If I could find away to recruit more efficiently, more effectively -- I might be able to put a stop the never-ending excuse factory:

"I don't want to raid anymore."

"Sorry, I'm grounded."

"I don't want to bring my rogue, I want to change my main to a shaman."

"Oh, I thought the raid was cancelled?"

"Man, Nip/Tuck is on!"

It amazed me how a guild like Elitist Jerks could pull it off for an entire expansion (or longer) with a fixed roster -- how do you compel a player to show any sense of loyalty and dedication to the guild? I remained baffled, spending far too much time in-game trying to keep the roster from falling apart. Our new schedule demanded that we raid every Friday and Sunday without excuse. I needed to ensure that Descendants of Draenor held good on that promise. So recruitment continued. I spent hours sifting through useless Battle.net forum posts, cluttered with other guilds begging for new players; leaders in the same boat I was in. Trying to find a single player looking for a new guild was almost entirely a wasted effort, as the reams of forum topics were nothing but officers cast into the same leaky boat as I.

An item from the game Unweb,
written by Hanzo

Gimme The Cache

I needed to come up with a new recruitment strategy, something that would save me hours of sifting through Battle.net forums looking for "that one priest" or "that one druid" that could potentially close the door on the excuse factory for good. I had been toying with the idea of writing a parser in CFML that would scan the Battle.net recruitment forums for users, trying to pick out only what we wanted: players looking for a guild. This automated process could save me hours of recruitment time as it tossed aside the miscellaneous posts of other guilds sharing my pain. But there was a concern with my approach.

Fetching web pages, parsing their HTML, and performing very specific business logic on the content seemed too expensive for CFML to handle. I attempted on-the-fly parsing once before in a web-based game I called "Unweb". Inspired by Diablo II, Unweb let you type in a URL which was converted into a "monster" that you would go on to slay for items and gold. It was a pretty fun exercise to explore application development and allowed me to grow as a programmer.

In practice, however, my architecture was short-sighted. Unlike a typical website driven by static pages of unchanging content, Unweb needed to create content dynamically on each and every page click. To further complicate this, a key step in the process -- the act of reaching out to a specific URL and parsing its content -- was what we in the industry refer to as a blocking call: a part of program execution that must pause and wait for a completion flag before continuing. This pause varies in time because the data is somewhere else, and can only run as fast as the slowest result.

Confused? Let me give you an example of how horrible this particular decision would've played out if it were in WoW. Pretend for a moment that all of the character data for your toon doesn't sit natively in the WoW game client, but rather exists in its entirety in only one place: the WoW armory on the Battle.net website. So while you are playing the game and decide you want to open your character panel to review your stats, the entire game locks up the minute you press the "C" button, as the game client pauses to fetch info from the website. Can you imagine how frustrating this would be if it were the case in real life? Constant pauses and lock-ups, just to look at your character info?

This is what was happening behind the scenes in Unweb, each and every time someone tried to play the game.

The strain of many hundreds of concurrent users playing Unweb caused the webserver to hang while blocking calls waited for URLs to return website results. Alas, this design was the oversight of an amateur developer attempting a large-scale game which didn't lend itself well to HTTP. My lack of experience afforded me no strategies to mitigate its poor performance. The flawed design of Unweb essentially turned what was supposed to be a fun web-based game into a inadvertent load testing tool; the more players that piled on, the quicker the web server buckled.

With the Battle.net forum parser idea in the back of my head, but lacking a real strategy to solve the performance issue, I turned to the one person I knew that could offer me new insight: Ater.

---

"Cache the results", he said to me, biting into a sandwich. Luggage was piled up behind his kitchen table, as he prepared for his upcoming move to Illinois.

"What?" I replied. His simplicity often overwhelmed me.

"You're thinking about it the wrong way." Ater elaborated, "You're approaching this like you've got a search interface, and when you enter in a URL, it's going to go out to Blizzard's forums and parse them live. Right when you click the submit button."

I never told Ater about Unweb, but In that one sentence, he successfully described Unweb's architecture, thereby pointing out the flaw in my original design.

"The search interface will hit a cache, not Blizzard's live forums. You schedule a task for the parser and it'll run in the background, on some fixed interval. Y'know, say every thirty minutes. It'll scan the forums on its own, collect up the data, dump it in the cache...a local database on your server. Then your search interface queries the cache. Simple."

Everything was just so damn simple to Ater. Simple, and one-hundred percent correct. In his succinct explanation, he re-designed my idea and solved the problems I experienced with Unweb. Now, it was not just a CFML-based forum parser, it was a fully-fledged spidering engine.

A screenshot of WoW Lemmings, a guild
recruitment tool, written by Hanzo

Rebuild Your Guild

I went to work immediately, implementing Ater's suggestions. That entire weekend was spent coming up with the initial architecture of the spider. It would run in three passes. The first pass would scan Blizzard's guild recruitment forums, looking for posts, slurp them up, and dump them into a database. On the second pass, the engine would follow the URLs to those forum posts from the database, extracting the bodies of the actual post itself. This is where the meat was: where a player would talk about themselves, what server they were on, what class they played, and where they hoped to find a new guild they could call home. It was the third and final pass where the spider would analyze the content in the forum post, scoring it on such things as: Can I determine a class (ie. Priest, Hunter, Rogue), a server (ie. US-Deathwing), a server type (ie. PvP, PvE). Additionally, was there an armory link provided? Could I use it to process the player's gear? The more information that was provided, the better the score. This scored database of parsed data became what Ater called the "cache" -- a collection of pruned posts comprising only players looking for guilds and nothing else.

I slapped on a web-based interface to allow users to search the cache, and released the new website into the wild, watching the cache grow. Every thirty minutes, another set of players would show up:

"Priest LF new Guild"

"4/5 Hyjal Resto Shaman LFG"

"Tankadin looking for raiding guild"

It was working. Not only was it incredibly cool, but I actually started seeing people I wanted to contact immediately...just while testing the app! The days of wading through hundreds of forum posts were fast becoming a distant memory. Now all the players needing a guild would come directly to me, through a simple search interface. Towards my web site they headed, single file, awaiting their fate. They hoped to be saved, to be plucked from their death march and placed into a new raiding home. It was in that instant that I came up with the name of my new guild recruitment tool:

WoW Lemmings.

A place where guild leaders and recruitment officers could go to find the masses of lost players seeking a new home. A place to rebuild your guild.

On February 13th, 2008, after briefly discussing the tool with Gurgthock, I announced WoW Lemmings on the Elitist Jerks forums, hoping to solicit feedback. Initial response was extremely positive; I received numerous suggestions and tweaks that I used to improve the app further, including the ability to scan other forums outside of Battle.net: MMO-Champion, Wowhead...anywhere recruitment forums resided. WoW Lemmings served (and continues to serve) me, as well as countless other guild leaders, shaving significant time off our recruitment hours. Thanks to this tool, I was able to once again get a handle on recruitment without it dominating all my waking hours. Slowly, eventually, I grew the roster back to a healthy pool of progression raiders (and fillers). And like so many times before, I again had Ater to thank. His simple insight into changing my approach toward the app's architecture turned it from a doomed load-testing tool, to one of the most stable and self-reliant systems I've ever assembled.