Team Fortress 2: Poll Results

By Shamus Posted Monday Jun 1, 2009

Filed under: Video Games 68 comments

I was planning on letting the poll run for a few days, but there doesn’t seem to be any point in doing so. While the votes continue to roll in, the overall results haven’t changed in over 24 hours. There is an unmistakable trend here:

(not pictured)de_dust had a score of over +1 million, and it wasnt even on the poll.

Assuming that playing a map you hate is worse than not playing a map you love, I scored it so that each positive vote is worth +1 and each negative vote against a map is worth -1.5. I wanted seven maps, but it looks like there are only six that have an overall favorable rating. (And granary is pretty borderline.) It’s amazing how little the overall shape of this chart changed as the day wore on and more people voted.

Note that while 2fort had the lowest overall score, it was actually #4 in the “love” list. Granary is another controversial map, and the ratio of fans-to-haters remained very close to 3:2, which kept its score near zero. If we ignore the hate votes, then the top scorers are:

1) cp_gravelpit
2) cp_dustbowl
3) cp_badlands
4) ctf_2fort
5) cp_granary
6) cp_steel
7) cp_well

Yesterday I was trying to get on the server, but having no luck. It was at maximum capacity all day. After waiting in line for half an hour, I did the only reasonable thing I could: I used the remote console to boot someone signed up for a second server. There are now two servers: Twenty Sided: Lawful, and the new one: Twenty Sided: Chaotic.

I think Lawful should remain pure, vanilla, and with the broadest possible appeal. I’ll keep the payload maps (I might remove HooDoo, as someone reported it’s heavier than the other maps on slower computers) and use the five maps with large positive scores.

Chaotic can be our server for community maps and controversial stuff like 2fort. I don’t want to go crazy with the community maps, but one or two popular ones (I’m still liking the look and sound of payload “Swift”) would be nice.

Lawful is the priority. If the end of the month rolls around and there is enough money, I’ll renew both. If not, I’ll just renew Lawful and make up the difference myself. So, if you donate, keep in mind this priority. Hopefully the two servers will give us enough room so that we’re not all stuck waiting. Also keep in mind these things are only $30 a month each. You can see the balance here. It’s backwards, though, so negative values are better. Again, no pressure. I don’t want to do the public television thing and make you feel guilty if you don’t pony up. The thing is there to be played. Log on and do your part for the team.

Also, I have a few people in mind to be mods. I’ll be emailing those folks over the next couple of days.

 


 

Example Code

By Shamus Posted Monday Jun 1, 2009

Filed under: Programming 58 comments

Allow me a rant on technical documentation. This has been bugging me lately, and I thought I’d lessen the irritation by inflicting it on you.

The stereotype is that technical people are bad at writing documentation. Technical people are supposedly inept at organizing information, bad at translating technical concepts into plain English, and useless at intuiting what the audience needs to know. There is a reason for this stereotype. It’s completely true.

From manual pages to tutorials, most prose intended to teach the reader something technical is so poorly written that it might as well be in MD5-hashed Cantonese. People have been emailing me for advice on how to learn X or Y in the field of programming. It’s a bit frustrating, because often there is no decent place to send them for the knowledge they desire.

Sometimes people say things like, “Ah man. I tried to learn [programming or scripting language] but it was too hard. I’m just not smart enough to figure that stuff out.” But in many cases I think the problem is less with the student and more with the teacher.

At my day job, I have a primary duty and eleven hundred secondary ones. One of those duties is writing documentation. I do not claim to be a master, but There is a pattern that should be followed when presenting information to a reader. You need to give them an overview of what this document is about so that they don’t waste five minutes reading the thing before they realize they’re on the wrong page. There needs to be a raw presentation of the knowledge (syntax, usage, that sort of thing) and then the in-depth details on the thing, followed by a few working examples. Finally, there should be some links to other related documents in case this isn’t what they were looking for.

Some of my pet peeves:

1. Assumption that the reader will have prior knowledge of some area not directly related to the tutorial. Under no circumstances should you require the user to have a grip on concepts more complex than the one you’re trying to teach. If you’re explaining how to use gas stove, don’t write directions that include “Step 3: Cook dark chocolate soufflé with raspberry sauce.”

2. Writing production-quality code to serve as an example. This is probably the result of someone having “good coding practices” beaten into their heads in college. They learn heaps of dogma about what you “never” do when writing code, and apply that thinking to tutorials. If they were asked to provide a working example of an internal combustion engine, their docs would be the blueprints for a Ford F-150 pickup with fuel injection, anti-lock brakes, power steering, and all the other complexities of modern vehicles. It might be a working example of an internal combustion engine, but it’s not a useful one. It’s much too bloated and complex for the purposes of teaching. A tutorial should be cut down to contain only the concept being demonstrated and the bare minimum of code needed to support it.

Windows interface programs are really bad at this. I once saw one that was supposed to show you how to implement a simple slider control. The full example was a working sound player that let you browse your computer, open wav files, and start and stop sound playback. It had to interface with special libraries for loading and playing sounds, and had lots of little control buttons to access the various features. All of that, just so it could show you a slider control that was used to govern the volume. (Or panning. I can’t remember now.)

3. Over-organization of code. It’s really annoying for someone trying to learn to have to track activity over several source files. Perhaps the tutorial is there to demonstrate how to calculate the distance between two points in three-dimensional space. They start at core of the program in main.cpp, which then calls something in distance.cpp, which references vector.cpp, which at last leads them to math.cpp and the four lines of code they care about:


float delta_x = x1 - x2;
float delta_y = y1 - y2;
float delta_z = z1 - z2;
return sqrt (delta_x * delta_x + delta_y * delta_y + delta_z * delta_z);

Thanks a lot, pal. Why didn’t you just say so in the first place!?!?

I messed around with the DirectX API in the late 90’s, and those example programs suffered from this. Example code should be reduced to the bare number of files possible (one, ideally) and have the minimum level of call depth. You’re trying to teach someone else, not add a shipped title to your resume.

4. Over-use of jargon. Many, many programming tutorials suffer from this. Supposedly there to introduce newcomers to the discipline, they throw words like “rasterization” and “frustum” at the user without the slightest explanation. The reader will need to know these things, but just tossing out these words instead of paraphrasing in non-technical terms (or taking the time to teach them) simply introduces the question of who exactly is going to read this? Anyone sufficiently knowledgeable to parse the text is likely past the point where they need the tutorial.

Terrible: Terms are presented without explanation, leaving the user to try to decipher what is being said; turning the whole thing into an exercise in cryptography.

Acceptable: Terms are defined within the prose, making the text longer and less readable.

Good: Terms are defined at the start of the document, where they can be skipped or studied as needed.

Ideal: Terms are presented as hyperlinks to definitions.

5. Mixing high and low level concepts together. If you’re explaining malloc (), don’t spend three paragraphs talking about memory management and portability issues before you get to the point. If you’re explaining the finer points of memory management, don’t inflict the nitty-gritty details of how to use malloc () on the reader.

What are the worst docs or tutorials you’ve ever been obliged to read?

 


 

Twenty Sided Server: Map Rotation

By Shamus Posted Sunday May 31, 2009

Filed under: Video Games 60 comments

There are varying opinions on what maps should be in the rotation on our Team Fortress 2 server. Strong opinions in some cases. There are maps some people hate. Maps some people love. Maps to which which some people are ambivalent or indifferent. The problem: How to arrange the map list so that the maximum number of people get the maximum number of maps that they love while (more importantly) minimizing the number of people who end up playing a map they hate. Oh, and the map list must meet some minimum level of complexity and variety, rather than just taking one popular map and repeating it endlessly.

Clearly this is an NP-Complete problem. Luckily, we’re only dealing with a list of 13 potential maps. Unluckily, we’re dealing with hundreds and hundreds of people with varying tastes. I’m not sure if I should optimize for maximum happiness or maximum fairness. (Always a problem in any social system.) To wit: Do I throw in maps to satisfy a small minority of users with very unpopular tastes, or do I simply “sacrifice” those few in order to improve the overall happiness of the player base? Hmm.

Coding the proper algorithm is going to take weeks of research and testing. I’ll need to put all of the users into a database along with their preferences, and sort through different map lists and calculate how much each map is loved and hated. Then I’ll need to sort through millions of possible map lists and find the permutation that has the maximum number of satisfied players.

Or maybe I should just take an inaccurate and highly unscientific poll and then eyeball the results? You know what? That sounds pretty good:

[poll id=”4″]

[poll id=”5″]

What about arena maps?

Fie on arena. It has its place and its fans, but the whole idea of arena runs counter to my vision of a fun and newbie-friendly server.

What about payload maps?

Payload maps are a given. All of the payload maps are in rotation. Every other alternating map is payload. The others are capture point or capture the flag.

There are three standard payload maps (Badwater, Goldrush, and HooDoo) plus that crazy dual-payload cart going in both directions. (Pipeline.) I think a good map list will look something like this:

1. Payload Badwater
2. (Map #1)
3. Payload Goldrush
4. (Map #2)
5. Payload HooDoo
6. (Map #3)
7. Payload Badwater
8. (Map #4)
9. Payload Goldrush
10. (Map #5)
11. Payload HooDoo
12. (Map #6)
13. Payload Pipeline
14. (Map #7)

Maps #1 through #7 will be filled in using whatever knowledge I can glean from the polls above. This gives us a list of 11 unique maps, which should give us a nice variety without completely overwhelming newcomers.

 


 

Damien Walters Showreel

By Shamus Posted Saturday May 30, 2009

Filed under: Movies 45 comments


Link (YouTube)

My thoughts:

That one trick at the 55 second mark? Pfft. Big deal. I took off my pants as recently as yesterday, and I did it without the trampoline thing.

More seriously: I always laughed at those wall-run moves in Prince of Persia, but they aren’t all that different from what this guy is doing. And he doesn’t have time-traveling cutlery to bail him out if he messes up.

Jackie Chan is fifty-five years old. As much as I love his work, he’s getting to the point where he probably shouldn’t be back-flipping out of an exploding helicopter into a burning car crusher owned by angry Shaolin monks. I have always wondered who could possibly take his place as the world’s foremost comic kung-fu stunt actor. After seeing this, I nominate Damien Walters. Someone hurry up and get that man into a helicopter made of dynamite and filled with ninjas.

Putting this guy on wires would be insane. The stuff he’s doing on the street already looks fake. (For example, watch this one at the 45 second mark.)

Also: He’s good with kids.

It really is disgusting how much talent some people have. The nerve.

 


 

Twenty Sided Server: Novelty rounds

By Shamus Posted Friday May 29, 2009

Filed under: Video Games 74 comments

On Wednesday night I jumped onto the server and found everyone running around bare-handed, killing each other with taunts. (I did not know this. Apparently certain taunts are instant kills if you can walk up to an enemy and get them to hold still long enough to pull it off. The downside being you have to be close, you’re rooted in place while taunting, and the animation takes a few seconds.) Seeing twenty four people all agree to set aside the established gameplay and run around operating under an impromptu rule set was pretty impressive. The results were hilarious, and I’m confident that such a thing would be impossible on a vast majority of existing servers.

They also did a round where everyone chose the heavy weapons guy class, and did the round using nothing but fists. Citizenparker was good enough to get some screengrabs of the event:

http://www.flickr.com/photos/22871999@N02/sets/72157618889278414/

Thanks to everyone for being so much fun to play with. Thanks also to everyone who donated. (Next month is 2/3 paid for already. Like I said, no sweat if you don’t give, just make sure you log in and say hi. And let me set you on fire.)

Open thread. Perhaps tell us about your most epic moment on the server.

 


 

Stolen Pixels #94: Crysis Demo, Part 3

By Shamus Posted Friday May 29, 2009

Filed under: Column 23 comments

The ending of the Crysis Demo was quite a surprise.

Punchline spoiler: People refuse to believe, but yes. See for yourself.

 


 

Team Fortess 2: Classes Part 2

By Shamus Posted Wednesday May 27, 2009

Filed under: Game Reviews 93 comments


tf2_engineer.jpg
Engineer

Engineers are a key support class in the game. They can build three things:

  1. Sentries: These automated turrets arguably deal out more damage than even the heavy. They have near-flawless aim, very fast (but not instant!) target acquisition, massive damage output, and they can run for ages without needing an ammo refill. But! They’re rooted in place and easily disabled by spies.
  2. Dispensers: A magic vending machine of ammunition and health. Looks like a gas pump. On maps with shifting battle-lines (like control points and payload) this has an interesting effect on gameplay. There’s just enough health and ammo in the average map to supply a small team. But as things get crowded, it becomes harder and harder to to find supplies after surviving an engagement. If an engineer takes the time to erect a dispenser, he can keep more people alive than even the medic. (The medic saves people during a fight. The engineer’s dispenser saves people that won or pulled out of a fight.) This small thing can change the battlefield completely.
  3. Teleporters: It can sometimes take twenty seconds to walk from your starting area back to the active area of the map, and along the way you might find yourself picked at by enemy forces. (Snipers, mostly.) Getting picked off means another trip into the respawn queue, and another hike. An engineer can set up a teleport to connect the start area to the front lines, thus getting forces back into the fight at much greater rate. Again, this can turn the tide of battle.

Tip: This class takes a bit of time to figure out. Building, upgrading, and repairing costs metal. Build a dispenser first, so that you can use the metal it provides to build your sentries and teleporters. Try to place sentries in good “ambush” positions, so that foes will walk around the corner and into the jaws of your bullet-spewing death machine.

Newbie suggestion: Try one of the other classes first. Once you have a feel for sentries (by getting killed by them) and teleporters (by using them) and dispensers (by having your life saved by them) you’ll have a pretty good idea of where to put them.


You know, she does look feminine here.
You know, she does look feminine here.
Pyro

The perfect ambusher class, and arguably my favorite. (It seems I prefer medic for offense, and pyro if I’m defending.) The pyro’s flamethrower spits out a cone of burning death that does tremendous damage at point-blank. It has a short range and a wide spread, letting you light groups of enemies in a single sweep. The pyro’s slightly diminished speed and limited range makes them very vulnerable in the open, and they tend to hide around corners or in small rooms where they can drop down or pop out on and unsuspecting foe.

Tagging a foe with the end of your cone can often force a retreat, even if the actual damage done is minimal. The psycological value of setting people on fire should not be underestimated. This makes it very easy for the cunning pyro to retreat if she’s injured. Other classes have trouble escaping when the battle goes against them, but people are usually very reluctant to chase a pyro. (And since the pyro’s flame hangs in the air for a split second, her range is effectively increased when shooting backwards rather than forwards. I’ve had battles where an enemy pyro was chasing me. She was running into my flames while hers were falling just short of me, and so she dropped dead while I escaped with only minimal damage.)

The pyro is the ultimate anti-spy. Her flamethrower fuel is smart enough to tell friend from foe, and will ignite an enemy even if they are cloaked or disguised. Not even the engineer’s sentries can do that. This means the pyro is the only class that can unmask a spy for others. Some classes have stuff they can do to see if a friend is a spy (and of course everyone can just shoot suspect teammates to see if they die) but if they discover a spy they still have to communicate their knowledge to the team. And “THERE’S A SPY BEHIND YOU!” shouted into team chat isn’t very illuminating. By the time they explain who the spy is, where they are, and who they’re behind, the spy will have already done his dastardly work and retreated to the shadows. But the pyro can just puff out bits of flame. If it touches an enemy spy he will become visible if cloaked, and unmasked if disguised. Everyone else will immediately see the spy (burning people are hard to miss) and be able to take action.

Like the heavy, using a pyro is more about strategy and timing and less about aiming and dodging. (Although pyros do end up in dogfights occasionally, which is more or less impossible for a heavy.) Knowing where to wait and when to pop out is the key to a successful life of murder and arson as a pyro.

Tip: Spy-check everyone. Even the guy you just spy-checked. If someone leaves your field of view, they are suspect when they return. I have racked up an amusing number of accidental kills by simply puffing a bit of fire at people who I thought were undoubtedly genuine teammates. Paranoia pays.

Newbie suggestion: The pyro is not a bad starting class if you’re eager to get right into the thick of things. You might struggle a bit before you learn where the good ambush spots are, but a newbie pyro can usually get a bit of positive feedback as long as they don’t run around in the open.


tf2_soldier.jpg
Soldier

The soldier class is straightforward. He’s armed with slow-moving splash-damage rockets. He’s slow moving himself, and has a decent number of hitpoints.

I’m not all that impressed with the soldier class. The rockets are so slow that most players dodge them without a fuss at long range, and out-maneuver the slowbie soldier at short range. The splash damage radius isn’t very large, and so bombing grouped enemies isn’t nearly as effective as it should be. It’s possible to get the drop on a cluster of foes and have them scatter before you can kill any of them. (This is much less true for the heavy or pyro.)

The soldier can only have four rockets in the launcher at once, which means he’s going to be reloading often. This increases the chances he’ll be in the middle of reloading when opportunity knocks. And finally, the soldier can only carry 24 rockets at a time. I find myself constantly withdrawing from the battle in search of ammo.

The game keeps track of who has been killing you and will let you know if someone is “dominating” you. (Killed you several times without being killed in return.) Sometimes foes will be elevated to “nemesis” if they’re really daunting you. But in all the hours I’ve put into this game, I don’t remember ever having a soldier as a nemesis. It’s very rare for the post-death screenshot to show me a picture of a soldier. This either means that the soldier is under-powered or under-used.

Tip: Like in Quake or Unreal Tournament, aim your rockets at the feet of your enemies, so that if they dodge (and they will) you can still nick them with a bit of splash damage. Reload constantly.

Newbie suggestion: My own gripes with his performance aside, some people really enjoy the soldier. He’s simple to use and is worth a try if you think shooting people with rockets sounds like a fun way to spend your time.


tf2_demo.jpg
Demo

The demolition man is a tricky class. He’s the only class that doesn’t have a conventional dogfighting weapon. Everyone else – even the medic – gets a backup sidearm or shotgun for emergencies or situations where their primary weapon doesn’t cut it. But the demo is armed only with arcing explosives. His primary weapon is the grenade launcher, which can lob grenades over walls or angle them around corners. His secondary is the “stickybomb”, which can place explosvies onto any surface where they can be detonated at will with the right mouse button.

The demo definitely takes some practice, but a good demo is a fearsome opponent. He’s your go-to guy for digging out entrenched enemy positions. A good demo will stand behind his team and hurl bombs into the fray, placing themselves beyond the reach of the enemy.

Tip: Placing stickybombs above eye level makes it much more likely that foes will not notice them and blunder into the kill zone.

Newbie suggestion: It’s a tricky class to learn to use, and it’s hard to do your job until you know the maps well enough to know what things look like around the next corner. It’s probably best to start with a different class.


tf2_spy.jpg
Spy

The spy is the most unique class in the game. No other class has as wide a range of powers or as steep a learning curve. A newbie spy is a nuisance that might get the occasional lucky kill. A master spy is a killing machine that can single-handedly break enemy fortifications, sow confusion, and force the enemy team to adapt to his attacks by changing their behavior. No other class can make the opposing team change their classes the way a spy can.

You can cloak at will, but you have a limited duration. You can disguise yourself as any class on either team, but performing an attack will instantly break the disguise. You can sabotage devices like sentry guns, but only if you can get close enough without the other team killing you. (Any they tend to be very suspicious of people that get close to the engineer and his work.) You can instant-kill anyone in the game with a backstab, but only if you can get close enough and get them to show you their back. Friendly players can pass through one another, but members of opposing teams bump into each other. This means that touching other people in a tight hallway can give away your status as a spy.

But to be a good spy you have to be familiar with all of the other classes in the game. It amazing how easy it is to spot a bad spy, because they break expected behaviors. You will become a suspect the instant they see: A pyro hanging out in the open. A sniper in a tight backstabby corridor. A heavy taking a secondary route. A medic alone. Anyone they can’t walk through. A scout standing still. An engineer too close to the battle. A pyro not spy-checking everyone she meets. A demo man without a view of the front lines. A soldier not firing rockets into opportune corners. A heavy who is near the battle but hasn’t spun up his minigun. A scout that takes the long way around a pit or object instead of leaping over it. A friendly spy going the wrong way or not wearing a disguise. Anyone besides a spy uncloaking. A friendly who is the wrong class. (Which happens when a spy disguises himself as a class that the other team doesn’t have. If the red spy pretends to be a sniper and blue team has no snipers, then he’ll appear as a sniper but with a random name from the other team. I know Rutskarn is playing as a pyro, so when I see Rutskarn the sniper I attack on sight.) All of these behaviors will out the hapless spy, who will then be gunned down and left wondering what he did to give himself away.

In order to be a good spy, you need to know how the other classes behave, where they hang out, and what they should be doing at any given time. You need to know the maps and where you can stand safely while waiting for your cloak to recharge. You need to know what targets are valuable enough that it’s worth breaking cover, and you need to know where there are safe corners are so you can recharge your cloak and ready your next disguise.

I’ve seen a skilled spy walk into a fortified room, sap the sentries, backstab the attending engineer, then disguise as a pyro and pretend to “help” in the search of the spy when the rest of the team comes running. They do another backstab, cloak, retreat, double back, backstab a medic and heavy exiting the spawn room, then dash to the front lines to sabotage the teleport. I can’t think of another class that could do this much damage to the enemy effectiveness in such a short time.

Tip: As with the sniper, too many spies on your team causes the enemy to become paranoid and instead of one excellent and effective spy you’ll end up with three useless ones. No matter how big the team, you never want more than one or two spies at most, but a good sized team should have at least one spy to keep the enemy guessing. Don’t keep assaulting the same location over and over. Change tactics often and move around. Paranoia spikes locally when you strike and subsides after a time as players get re-immersed in their work. By moving from one area to the next you’ll be facing the most distracted foes with the lowest paranoia.

Newbie suggestion: Learn the rest of the game before you mess with the spy. Like the sniper, the spy attracts newbies who want to rack up kills without placing themselves into the fray. And also like the sniper, the newbies usually end up frustrated and confused.

tf2_classes.jpg

My favorite gametype is payload. My favorite class is probably pyro. And my favorite moments in the game are when I see my friends burning to death in front of my flamethrower. This means I’m probably better at Team Fortress than I am at friendship, which is pretty sad since I’m not all that good at the game yet.

Stop by the server sometime and I’ll do my best to set you on fire.