\n

May 25

I murdered a man yesterday.

I murdered a man yesterday. Not for revenge; not because I wanted something he had; I think just because I could.

The wall that separates life from death is so thin. Being alive feels so active, so permanent that we forget how little it takes to shatter it: just 10 grams of lead moving at 800 metres per second.

My victim—no, that doesn’t sound right. The man hadn’t seen me lying prone in the dirt beside a bush. He had just gone into a nearby barn, looking for supplies I guess. He was obviously new to the area: a veteran would have long since ditched the small Coyote backpack and Makarov pistol that he carried for something better. And I guess he was low on ammunition, too, because when he spooked a few zeds, he fired only three shots before he turned and ran. Right into my sights.

I suppose I could have helped him out, killed the two zeds that were after him. The thought never crossed my mind—in fact I didn’t really think anything at all. He was there, running, and I was there unseen, with my gun, and him in the sights. I fired once, and he fell.

Murders: 1

The zeds were still intent on him, clawing at his corpse, and ignored me. I shot them too, for safety. Then I figured I might as well see what he’d been carrying. A tin of beans. An empty water bottle. Painkillers. Nothing of any real value. I might have kept the beans; I don’t remember.

While still beside his body, I saw another figure not far off, running along the road that crossed the field ahead. Instinct made me lie down, beside the corpses, as I kept my gun on this new arrival. Coyote backpack. Makarov. Carelessly visible as he ran down the road. Another rookie.

Again, because I could. I fired once, I think I missed. He started, but continued to move. Twice more, and his silhouette collapsed into the grass. I still felt nothing.

Murders: 2

I didn’t have any hope that he would have anything else I wanted. But he did: a compass, a hunting knife, matches. It was only then, taking these from his corpse that I felt a momentary guilt; but it quickly faded, swallowed by the apprehension that someone else might have heard my shots, and do to me what I had just done to these two. I left the road and the buildings behind me, and plunged back into the forest.

The man's corpse, lying by the road.

Apr 28

80 word review: Prince of Persia (2008)

I would like to see Duncan Harris get his hands on this game and its colourful, imaginative vistas. It is beautiful in stills, but even more so in motion: the characters are finely detailed and fluidly animated, down to the constant desert wind rippling their hair and clothing. Sadly, the mechanical and repetitive platforming and fighting, and too many collectibles turn the game into a chore long before the story reaches its surprising end. Now, where’s that donkey got to?

Prince of Persia by Ubisoft Montreal, released in 2008.

Apr 10

“But in Driver: SF, the context of a dream world has the polar opposite effect. It doesn’t break my immersion or render my actions meaningless. Rather, it grounds the very weirdness native to all videogames. It justifies those things that sit in the corner of your vision in any videogame world, the things that if you focus on for too long, threaten to tear the fabric of the entire virtual world apart.” — Brendan Keogh, California Dreamer

Mar 14

Journey

As they say, it’s not the destination, it’s the journey.

Forward, cautious, over sand to the mountain. Wind blows the sanddrift through my cloak billowing, scarf waving. A sound, musical voice, and I echo it, turn to see echo of myself beside, companion. Through the desert, ruins and stones, as the clothbirds soar.

Drop.

Falling, darkening. Now deep we press on. Sombre void halls, and a red eye glimmering, predator hunting. Cower beneath, breathless till it passes. Forward, cautious, eyes all around. Cautious. Reach at last the light, stretching far underground.

Escape.

Rising to sunlight, now at the mountain. Wind blows the snowdrift freezing. Flagging, upslope, huddling for warmth. Each foot, step, step, step. Cower behind, as the storm rises. Step. Higher. No warmth, no sunlight, no goal. No hope.

No hope.

Moments.

Renewing, respiriting, resinging, break through the storm. Rising and leaping up to the mountain, higher, flying above. Closer the cleft, fuller the thrill, rising and deepening, and climax.

Stillness.

Forward, ascending.

Feb 27

Sorting winners from losers

(This is a cross-post from nodraw.net)

In my TF2 king of the hill map koth_skylab, I wanted an ending sequence that would use a trigger to set the losing team on fire.

The usual way of distinguishing between teams in a trigger is to use a filter_activator_tfteam. It has a Team property which can be set to the red team or blue team. Spawn room doors are a typical use of this filter, to allow only Red players into the Red spawn room, and only Blue players into the Blu spawn room.

Opening a spawn room door

An alternative property, Associated Control Point, allows the filter to allow only playersfrom whichver team owns a particular control point. A trigger using this filter, connected to a door, would only open the door for Red players if Red had captured the control point, and similarly for Blue if Blue owned the point. If the control point was neutral, the door would open for nobody.

Opening a door for the control point holders

Finding the winners

In a king of the hill map, there is a single control point. Each team must try to hold the point for as long as possible. A team wins when they have held the control point cumulatively for a certain time; e.g. three minutes. Consequently, you can identify the winning team as the team that owns the control point when the round finishes. The winning team then gets ten seconds or so—the “humiliation period”—in which to slaughter the losers.

When the Red team wins a round, the tf_gamerules entity sends the OnWonByTeam1 output; when Blue wins, it sends the OnWonByTeam2 output. If you have a trigger, filtered by the control point, that is initially disabled, and then enable it when either team wins, only the winning players will activate the trigger.

I don’t really want to set the winners on fire—it would be a strange reward for winning—but I’ll add the logic here so you can see how it works. When the trigger gets an OnStartTouch input, it sends the IgnitePlayer output to !activator, which is the special identifier for “the entity that sent the input”, which in this case will be any player matching the filter. Hammer may not recognise these options, and will display them in red, but they will work just fine in the game.

Setting the winning team on fire

Finding the losers?

Finding the losers should be easy. The third property on filter_activator_tfteam is Filter Mode. Set this to Disallow, and instead of allowing the matching team to activate the trigger, the filter will disallow them, and allow every other player to activate it. The team-filtered door in the second example above would open for both teams when nobody owned the point, for the Red team when Blue owned the point, and for the Blue team when Red owned the point. For pyromaniacs, the trigger shown below will set the entire losing team in the trigger area on fire.

Setting the losing team on fire - with a bug

However, there is a catch. If you enable this trigger during the round, it will work exactly as expected: the team that owns the point will be unaffected, and the team that doesn’t own it will burn. But if the trigger is enabled in the humiliation period after the round ends, both teams catch fire.

It turns out that for the duration of the humiliation period, all team-based filters will always match the winning team. This is so that the winning Blu team can open the spawn room doors of the losing Red team (or vice-versa), to slaughter any cowardly players trying to hide in it—a worthy cause, indeed.

But it causes me a little problem: although I can identify the winners, those-who-own-the-control-point, the inverted logic those-who-don’t-own-the-control-point that should identify the losers also matches the winners. It’s incredibly funny when both teams catch fire, but it’s not quite what I want.

All is not lost

I can still identify the losers, and only the losers, but those-who-don’t-own-the-control-point isn’t good enough because of the peculiar behaviour of filter_activator_tfteam after the round. What I need is to take the effect of the winning team filter (which still only matches the winners after the round ends) and invert its logic in some other way.

There’s another filter entity in Source, filter_multi, which allows you to create complex filters by performing logical operations on several other filters that you specify. If you set its Logic Type property to AND, it will pass only if all the other filters pass; set it to OR, and it will pass if any one of the other filters pass. I don’t need that capability here, but filter_multi also has a Negate Outcome property, which turns what would be a pass into a fail, and vice-versa.

What this means is that the output of the filter_multi is not affected by team logic or humiliation periods at all, but only by the outputs of the other filters it specifies. So although the Filter Mode property of the filter_activator_tfteam turned out to be unsuitable, if I use a winning team filter and send its output through a negated filter_multi, it will match only the losing team.

Setting only the losing team on fire

Final notes

There’s one small issue remaining with our trigger and filter set up: the filter_activator_tfteam matches all players on the winning team, and so the filter_multi, being negated, matches everything else. Not just players, but all other entities. The fix for this is easy: just ensure the trigger flags are set to just Clients.

Jan 20

The MPAA studios hate us

The MPAA studios hate us. They hate us with region locks and unskippable screens and encryption and criminalization of fair use. They see us as stupid eyeballs with wallets, and they are entitled to a constant stream of our money. They despise us, and they certainly don’t respect us.

Yet when we watch their movies, we support them.

Marco Arment, The Next SOPA

Jan 18

Why SOPA, PIPA, DMCA, DEA, etc. exist:

“We’re dealing with archaic industries that were built around the impossibility of that which is now possible. Their time is up, and they know it. But they are so massive, so enormously powerful, that they are going to do everything imaginable to defend their fortunes. And that’s why we have SOPA and PIPA. They know it won’t beat piracy, because it’s immediately obvious to anyone with half a clue that it cannot. But it will give them terrible control of the internet, that all history shows they will abuse to the most ludicrous degree. It will give them terrible control of the internet, which is presently the thing that terrifies them more than anything else: free.

“The most insane thing is, they don’t quite know what for. They just know that it’s the means by which their business models are rendered pointless, and they know they currently can’t control it.”

John Walker, Why People Are Still Failing to Accept the True Horror of SOPA/PIPA

Jan 05

Bulletstorm, in 80 words

When I had killed as many enemies by kicking with my boot as by shooting, I started to question the name of this game. Its points-for-combos approach to combat and emphasis on using environmental hazards is fresh and exciting, but the story it has to tell follows Epic’s trademark bro-gamer recipe, with a sprinkling of comedy—sadly not self-aware enough to be parody. However, I give it points for its lush, colourful (if post-apocalyptic) setting.

Dec 12

Something bothers me about dungeons

Many dungeon designs have the player entering the dungeon, travelling deeper and deeper into it while facing foes and/or traps of increasing difficulty, culminating in a climactic encounter, often a boss or mini boss.

That’s fine: these are chieftains, or guardians of great treasures, or whatnot, so naturally they’d surround themselves with minions for their own defence.

No, what bothers me is what all too often comes next: a convenient doorway that leads directly out of this deepest hold of the dungeon and back to the outside world. Even more irritating is when this exit has you emerging right beneath the entrance.

Brad Gallaway, in his post Fifteen Hours With Skyrim described this happening in Skyrim:

Almost every dungeon I’ve been to roughly follows the same “underground narrow hallways with some larger rooms” blueprint, and each final chamber has a very convenient shortcut door back to the surface.

I’ve not played Skyrim yet, but I’ve noticed this pattern occurring a lot in Oblivion, Fallout 3, and to some extent also in Zelda games and the like.

Here’s why it irritates. Imagine, if you will, a narrator, telling the tale of this hero (my avatar) and his quest into the dungeon:

“The hero Ulfang dares to enter the Cave of Unfirthaur. For days he slays many goblins in the Upper Chambers; he defeats the three Guardian Trolls in the Middle Halls; and finally, a week after entering, he penetrates to the deep Underfortress, where he vanquishes the great Gnarr himself, and takes his prized jewels.”

The narrator takes a sip of water to moisten his throat, and continues.

“Ulfang now spends another week retracing—”

He looks up at me. “You look a little impatient. Tell you what, why don’t we skip ahead to when Ulfang gets back outside. I’ll just pretend that there was a little express elevator here that takes him back to the surface in just a few minutes.”

“Don’t!” I plead. “It doesn’t fit. You can’t break the rules of the world just for me. It isn’t my world—it’s Ulfang’s world, and Gnarr’s. And if Gnarr has a fortress seven miles deep, then by The Dribbling Goddess, Ulfang should have to walk back out the same way he came in!” But it is too late. The narrator has already changed the story.

My complaint isn’t about realism, but verisimilitude. In a moment, the game world has broken the fourth wall and is now acknowledging me, the player directly, instead of my avatar. It’s a disconcerting discontinuity, like the pop and skipping of a scratched track on a CD.

Dec 06

Stalkers and Anomalies

A lone stalker dares searing heat and jets of flame in the bitumen anomaly.

In Call of Pripyat, there are areas of odd chemical, electrical, fire, or gravitational behaviour (and usually high radiation also); these are called anomalies. For the most part these are merely incidental obstacles in your way, but from time to time objects called “artifacts” appear in them.

These artifacts are highly valuable to sell, but if you carry them they also provide protective ability, mostly against the hazards of the anomalies. So they are well worth the time to carefully explore the anomaly fields (throwing bolts to identify where the anomalies lie and where is safe to walk) to find them.

In the parlance of the game (something it borrows from the book Roadside Picnic which inspires it), “stalker” is the name given to the people who wander the zone, hunting for artifacts. It contrasts with the military or paramilitary factions and bandits who are also there; unlike those groups, stalkers usually travel alone.

The game itself has a very rich AI system: animals hunt, feed, and sleep; and defend their territory against intrusion from humans. But there are also many NPCs from all factions that are AI-controlled. The military go on patrols, the stalkers explore the anomalies hunting for artifacts, and the bandits look for lone stalkers to steal from.

All of this contributes greatly to the feel of the zone as a living place.

I wrote about my experience in Call of Pripyat when I first played it on release in February 2010.