Friday, May 30, 2014

Voyager to Nebular 5

For the tech-boys & girls, it has been a while since I wrote about freshly new implemented techniques in Tower22. That is mostly because I didn't program anything new, or at least not the kind of stuff worth a juicy article. Well, fasten your seatbelts, because I learned a lesson or two about particle-lighting & blending last week. Thanks to the always helpful people at gamedev.


Fog. Got to hate it

Nothing changed at all? Really? Nevertheless, Silent Hill is one of the few games where the fog is acceptable. Because it adds up to the unreal horrible athmosphere.

Didn't I just mention in the "Goldeneye" review, how fog ruined the looks of many N64 / PSX era games? The military uses smoke grenades to create a coverage curtain. Magicians use spotlights & fog to keep the audience focussed at the act instead of the background. Games used fog to mask their incapability’s to render more than a few thousand polygons. The world literally ended after ~50 meters or even less. Those days are over fortunately, but that doesn’t mean fog completely disappeared.

What the heck is fog anyway? Why do we see fog, or actually can't see shit because of fog? Well, pretty simple. The air is filled with microscopic water droplets that reflect/refract light. A single droplet won't hide the car driving 50 meters in front of you, but a huge quantity does. The same kind of effect is reached when blowing smoke or a gas substance into a room. Tiny particles block sight. If you don't believe me, buy 3 packs of cigarettes and start steaming in your bedroom. Don't forget to open the window after the experiment so your mom won't notice.

So, despite the harm it did too older games, fog is a natural thing. And thus, we want it in games. But... either to apply on much greater distances, or too simulate very local volumetric effects. Traditional fog is nothing more than a colour that would take over as the depth increases. But when looking at real fog, clouds, smoke, smog or other gassy substances, you'll notice variations. It seems to be thicker just above the water. Ghastly stretched strings of fog slowly slide above the grass on a fresh early morning. You see, fog can be quite beautiful actually, just as long you avoid the old traditional formula to generate linear depth-fog as much as possible.


Our Dutch landscapes aren't known for spectacular nature phenomena. But my daily bicycle ride to work gets an extra touch when greeting my black & white grass eating friends in the morning dawn. Beauty is in the little things.

Making fog... Easier said than done. Everyone who programmed some graphics or made 3D scenes in whatever program / game-engine, probably knows how hard semi-transparent volumes of "stuff" can be. To begin with, they are sort of shapeless, or at least morph into anything. So just making a half-transparent 3D mesh is not going to work by default. How the hell would you model strings of fog? Or a campfire with smoke? A long time ago we invented "sprites" for that; billboards with an (animated) texture that would always face the camera. But just having a single flat plate with an animated campfire picture on it, would still look dull from nearby. You immediately notice its flat once you see the intersection lines.


Nice, a little candle flame!.... A naughty little FLAT candle flame that is, sigh.


Pump up the volume
We need some punch, some volume. But you can't do that with a single sprite… How about using many more (very small) sprites? And so the name "particle" was born in the games industry. Although it's not exactly the same as the ultra-microscopic stuff CERN launches to create new dimensions with. In games, particles are typically small but still viewable. A patch of smoke, a raindrop, or a falling tree leaf. One particle is still shapeless, but combining a whole bunch of them makes a 3D volume. Sort of.

The reason why we won't just use real-life microscopic particles, is because it would take at least millions of them to render the slightest gassy fart. We can render quite a lot of them, but not THAT much. So we up-scaled them. Yet, speed is still an issue. To fill the whole room with Zyklon B, you still need (hundred)thousands of particles. Or, you'll upscale the particles even further. More particles = performance loss. But less and larger particles on the other hand will reveal the flattish 2D look again. Using "Soft-particles" (meaning you gently fade out particle pixels that almost intersect solid geometry) reduces the damage, but only to some extent. Also, when rendering a bunch of larger particles in a row, there is a big chance of overdraw and performance loss. Finding the good balance between quantity and size is important.

In an ideal situation, we can render more (smaller) particles. But at some point, you'll hit the ceiling. The memory can't carry an infinite amount of particles, and updating + drawing all of them is also a pain. Especially now that the rendering of opaque 3D objects got more and more tense. Engines and games brag about "200 lights in this level!", "more than 30 dynamic shadows active!". It seems artists just love to spray light all over the place. Obviously, particles should catch light like any other object as well. But if there were dozens of (shadow-casting) lights, ten-thousands of particles, and a video-card that already sweats when drawing multiple layers of unlitten particles in a row? Then how would you properly do that?

When something should show up "volumetric", it should also obey the rules of light. Rendering smoke that gives the middle finger to your lights, will look very artificial. And flat. And stupid. To spice things up big time, you can light your particle pixels. If it works for a brick wall... then why not far particles? Damn right homie.

But then you quickly realize that the performance was crushed again. And another practical problem; how & which lights to apply on each particle anyway? If you have a "200 lights in this level!" situation, you'll get a hard time letting your particle loop through all of them.


In the 2011 T22 demo, each billbiard(sprite) pixel would test if the nearby lamp volumes would affect it. Pretty nice results, but too slow for comfort. Most of my particle attempts just never felt right.


Deferred Particle Lighting
I wish it was my invention, but it isn't. Doing deferred lighting for the last 8 years, the answer was in front of us all the time. But instead we tried all kinds of difficult hacks that felt uncomfortable. Fortunately someone pointed me to this Lords of the fallen paper. Don't know if they were the first -probably not- but at least they were kind enough to explain "Deferred lighting for particles" in plain English. It's really pretty simple, if you have a solid foundation with deferred lighting and GPU driven particles at least. And, before I sound too euphoric, Deferred Particle Lighting is not the Final-Solution either. It's a cheap and very efficient ointment, but not for each and every malady. Got it? Then here we go.

When doing particles on the GPU (and if you don't do that already, please do), you can depict them as points. Each particle would be a single point, a bunch of vertex attributes such as a position, colour(multiplier), size, velocity and state. And very important for this technique, is also an unique ID (0,1,2,...n). Typically you could write those attributes into a struct that consumes 64 to 128 bytes. Next, a Compute-Shader can be used to evaluate the physics of each particle. Apply gravity, let them bounce on the floor, or just randomly zoom around like stinky flies. Cool thing about Compute-Shaders btw, is that you can even let particles follow each other. Unlike ordinary shaders, you can access the data of other "neighbour" particles in a Compute-Shader. The CS accesses data from the particle array, which is basically a VBO (Vertex Buffer Object), does some math, and writes the results back into it.

But hey, didn't you tell a particle was a sprite or billboard? Thus a camera-facing quad instead of a single point? Yes it is, but you don't have to treat them as quads initially. Here is where the Geometry shader becomes handy. In a first stage, you update the physics for all particles. In a second stage, you actually render them. As an array of points. But between the Vertex- and Fragment shader, there is a Geometry shader that makes a quad out of a point. Like Bazoo the clown inflating balloons before passing them over to the kids. Tadaa!


The story of Benjamin Button.

So far, we didn't mention light though. When walking right through a cloud of particles, we may quickly render millions of pixels (that overlap each other). Lighting each pixel would be a (too) heavy task. But the amount of particle-points, the origin of each particle sprite, is much smaller. Here you are talking about magnitudes of thousands, not millions. So what if we would just calculate the light for each particle-point? Thus basically per-Vertex lighting?

And how about if we can do that the "Deferred lighting" way? Instead of looping through all potential lights for each particle, we do a reverse approach. Like traditional deferred lighting, we first splat all the particles into a 2D texture, or G-Buffer. Then we'll render each light on top of it, using additive blending. I'll explain the steps.


Step 1: Making the G-spot
To light stuff up, we need to know at least a position and normal:
 Diffuse light = max( 0, dot( lightVector, surface.normal )) * light.color * attenuation
 where lightVector = normalize( light.position - surface.position );
 where attenuation = someFalloffdistance formula, depending on the light.range

For particles, we only need to know their positions really, as their normals can be guessed; they face towards the camera. Besides, translucent particles let light through, so maybe you don't even have to care about directions really, or reduce the effect of it at least.

This means we'll need to put all particle positions into a G-Buffer (or just a 2D target texture). A 512x512 texture would provide space for 262.144 particles. Not enough? Try 1024x512 or 1024x1024 then. Ok, now where to render each particle on this canvas? The location doesn't matter, just as long each particle gets its own very unique place that no other particle can override. That's why you should add an unique ID number to each particle. Besides for these rasterizing purposes, an ID is also nice to generate pseudo-random data in your other shaders. Anyway. Using the ID you could make target plot-coordinates like this:
 // Vertex Shader that plots the particle data onto a G-Buffer
 const float TEXW = 1024.f; // G-Buffer dimensions
 const float TEXH = 1024.f;
 
  // Calculate plot coordinates
  float ID = round(particle.ID); // Be careful with floating point artifacts, or your ID might toggle between 2 numbers!
  float iy = floor( ID / TEXW );
  float ix = floor( ID - (iy * TEXW) );
  // Convert to -1..+1 range (0,0 = center of target buffer)
   out.position.x = ((ix * 2.f) - TEXW) / TEXW;
   out.position.y = ((iy * 2.f) - TEXH) / TEXH;

 // Fragment Shader
  out.color.rgb = particle.worldPosition.xyz;
  out.color.a = 1.f; // whatever

Here you go. A rather ugly cryptic texture filled with particle positions. Oh, and don't forget to make your target textures/G-Buffers or whatever you like to call them, at least 16bit floating point. You probably won't need super accuracy, but 8bits won't do.



Step 2: Let there be light, deferred style
With common deferred lighting, the second step is to draw light volumes (spheres, cones, cubes) "on top" of the G-Buffers. The light volume would read the data it needs (position or depth, normal, ...) from the G-Buffers, and poop out a litten pixel. Because light volumes can intersect and overlap each other, additive blending should be used to sum up light. This is finally stored back into a diffuse- and specular texture. Then later on these textures can be used again when rendering all bits together.

Same thing here, but with some slight adjustments. Simplifications really, don't worry. We render the results to a Light-Texture, equally sized to the particle-position G-Buffer we made in step 1. Instead of a volume, we render a screen-filling quad for each light. This is because the output from step 1 doesn't represent a 3D scene at all. A particle could be anywhere on the canvas. My English isn't perfect, but I believe that is what they call an "Interleaved texture". So, to make sure we don't miss anybody, just render a quad that covers the whole canvas.

Some more adjustments; We need to derive the normal from the particlePosition-to-camera vector, and/or apply translucency. Does it really matter if you light your particle from the front, behind, left or right? But if you do care, you can consider storing a translucency or "opaqueness" factor into the alpha channel of the G-Buffer we made in step 1. Finally, we can forget about specular light, and other complicated tricks such as BRDF's. Yeah.

Oh, I should note one more thing. You can test if your particle is shaded or not, in case you use shadowMaps. But please make a smooth transition then (soft edges, radiance shadowMapping, ...). Since you only calculate the incoming light for the centre-position of your particle, it may suddenly pop from shaded to unshaded or vice-versa if the particle moves around. This is one major disadvantage of this technique, but it can at least be reduced by having soft-edges in your shadowMaps, using more & smaller particles, and/or reduce movement of your particles.


Step 3: Rendering the particles
Step one and two can happen somewhere behind the scenes. Whatever suits you. But at some point you'll have to render the little bastards. Well, this is cheap. Either your fragment- or vertex shader, can grab its shot of light in the "light-texture" (step2), using the same ID we used in step 1 to calculate the plot coordinates. Careful that reading from the exact right spot might be a bit tricky though. Maybe you want to disable linear filtering and use NEAREST sampling on your lighting-texture. And depending on which shader language & instructions you use, you may have to add half-a pixel size to access the right location. This is how I did it in Cg:
 const float TEXW = 1024.f;  // Light texture dimensions
 const float TEXH =  512.f;
 const float HALFX = 0.5f / TEXW;  // Half pixel size
 const float HALFY = 0.5f / TEXH;
 
  float ID = round(particle.ID);
  float iy = floor( ID / TEXW );
  float ix = floor( ID - (iy * TEXW) );
  // Convert to 0..+1 range, half texel offset
  float2 defTexUV;
   defTexUV.x = (ix / TEXW) + HALFX;
   defTexUV.y = (iy / TEXH) + HALFY;
   diffuseLight = tex2D( particleLighting, defTexUV ).rgb;

There you go, diffuseLight. Full of vitamin-A coming from ALL your scene lamps, including vitamin S(hadow) as well. Hence it could even include ambient light (see below). Now it's easy to see where the speed gain comes from. Doing this (eventually just once in the vertex-shader), or looping through lamps and doing fuzzy light-math for each billboard pixel? As said, being vertex-litten, it's not pixel perfect and therefore somewhat inaccurate. But all in all, a cheap and effective trick!



Ambient light
When just doing deferred lighting, thus using direct lighting only, your particles will appear black once they are out of range. In Tower22, I use an "Ambient-Probe-Grid". Before starting step2, I "clean" the buffer by rendering ambient light into it first. Each particle would sample its ambient portion via this probe-grid, using its particle world position. If that goes beyond your lighting system, then you could at least use an overall ambient colour to clean the buffer with, instead of just making it black. This gives a base colour to all of your particles. Furthermore I advice to have a customizable colour multiplier that the artist can configure for each particle generator. Smart code or not, you still can’t fully rely on machines here.




Into the blender; Premultiplied Alpha Blending
A bit outside the scope of this article, but important nevertheless. Particles, and alpha-transparent objects in general, are notorious for sorting problems. If surfaceA is IN FRONT of surfaceB, but gets rendered BEFORE surface B, then surface may get masked where surfaceA is... huh?

FlameA makes a "hole" in background smoke spriteB, while other flameC doesn't. This is because flameA gets rendered first, while it should be rendered last. Also the transparent pixels of the flame, will claim a position in the depth buffer. The smoke sprite behind it will be partially masked, as it thinks the flameA pixels are occluding, having a lower depth value.

Particle clouds with "random" sorting canget ugly quickly if this happens. There are two remedies; sort your shit, or use a blending method that doesn't require Alpha-Testing. The first method means you'll have to re-arrange the rendering order. Audience in the background gets a ticket first, audience in the front gets rendered last. Hence the name "Depth-Sorting". I must admit I never really did this (properly), so I can't give golden advices here. Except that sorting sucks and can eat precious time, or just isn't possible in same situations. Fortunately, you actually can swap places in a VBO using Compute-Shaders these days though.

But even better is to avoid of course. Not always possible, but foggy, smoggy, smokey, gassy particle substances can do the trick with "Pre-multiplied alpha blending", which doesn't care about the order. That term sounds terribly difficult, but a child can implement it. Step one is to activate blending (OpenGL code) like this:
...glEnable( GL_BLEND );
...glDisable( GL_ALPHA_TEST ); // <--- you can keep this one off
...glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // out = src.rgb * 1 + dest.rgb * (1 - src.a)
Step two is to multiply your RGB color with its alpha value in your fragment shader:
...out.color.rgb *= out.color.aaa;


What just happened? Ordinary additive blending isn't always the right option. For bright fog or gasses maybe, but smog/smoke should actually darken the background pixels instead of just adding up. Pre-multiplied-Alpha blending mode can do both, as you can split up the blending effect. The amount of Alpha in your result, tells how much will remain of the original background colour. High alpha completely replaces the background with your new RGB colour, while a low alpha just adds your RGB to the existing background. Thus, dark smoke would use a high alpha value, dark RGB colour. A more transparent greyish fog would use a relative low alpha value.

What I liked in particular with this methods, asides being able to both darken and brighten using the same method, is that it doses much better than common additive blending. With particles, it's often unpredictable how many layers will overlap. It depends on random movement, and where the camera stands (inside/outside the volume, from which side it’s looking, etc). If your particle has an average brightness of 0.25, it makes quite a difference if there are 4 (4 x 0.25 = 1.0) or 8 (8 x 0.25 = 2.0) billboards placed in a row. In my case, it would always end up with either way too bright results, or barely visible particle clouds. Having the exact right dosis, was a matter of the camera being the right place at the right time. Luck. This method on the other hand doses much better.


To demonstrate, I wanted dark greenish "fog" at the bottom. With normal additive blending, it would quickly turn chemical-bright green. With normal transparency on the other hand, I would get depth-sorting issues.

Ok. There is much more to tell about volumetric effects, because even with this cool add-on to the engine, there are still a lot of problems to solve. But let's call it quits for today. Fart. Out.

Sunday, May 18, 2014

Post-mortem-review #2: Goldeneye

Let’s throw another classic game review on the table: Goldeneye. For the Nintendo64 that is, not the shitty remakes on other platforms. One of my all-time favourites... or is it?

Some games seem to be immortal and like the oldest trees on Earth, they're not impressed by modern times. Some other games just age. Although I must admit it was on a PC emulator, Goldeneye felt less fantastic last time I played it. Probably more than any other game genre, shooters are more sensitive for high-end graphics and turbulent hardware upgrades. But thinking again, I still do enjoy Doom or Duke Nukem a lot. Why does Goldeneye feels aged, while Doom or Duke –even older games!- don’t? Good question.

Anyhow, that’s not a reason to throw Goldeneye out of the Arc of Noah. Beautiful women turn into old, saggy witches too (men on the other hand only get cooler, like Alec Baldwin or Harrison Ford). Goldeneye was the Marylyn Monroe. A bit dead now, but hot coffee back then.

In my time, we bought games in a box. Having more boxes to show in your showcase made you a better person.


Now you’re playing with power. Crappy power.
Unlike the SNES, not everyone owned a Nintendo64. And probably not even all of you readers were even born when Goldeneye saw daylight, 1997. Late 1997 for Europe. So it’s probably worth to put the spotlights on this title, as it contained a lot of revolutionary shooter elements. Dude, even the commercial was revolutionary. First time I saw it was on a mega screen in the cinema. Almost pissed my pants. I knew what Santa Claus would bring that Christmas!

First, try to put things in the right context. 1997. The other shooter milestone Halflife wasn’t released yet, so the best thing since sliced shooter-game bread was probably Quake 2. And some other semi 2D/3D titles such as Blood or Redneck Rampage. The Nintendo didn’t bring steaming shooters yet (although I learned to appreciate Doom64 later on). For one thing, it seems Nintendo took the (wrong) turn into more “kiddy” games. NES and SNES had dirty pixel porn, but the 64 chose a more kosher menu from now on. But there were some full 3D first-person-shooters. You may remember “Turok the Dinosaur hunter” which was... different. Despite the handy analogue stick on the N64 joystick, they struggled with finding the right controls. How to walk and aim at the same time? Doom and Duke got away with auto-aiming (you couldn’t look up or down really), but when Quake showed full 3D capabilities, the mouse became the second best friend for PC gamers. And still. Shooters feel a bit awkward and slow on the PS3 or Xbox.

The Nintendo64 had yet another problem. If a game wasn’t 3D from now on, it sucked. But at the same moment, the hardware also sucked big time on rendering 3D graphics properly. The N64, but also the PSX, Sega Saturn and PC were on the tumbling point between solid proven 2D games, and poor 3D technology. 3D was still in its infancy. Very blurry textures, “balls” made out of 7 polygons, tedious controls, no real lighting, empty environments. And oh my Lord that darn fog… Except for Silent Hill, fog ruined the looks of quite some games.

Body Harvest was a pretty fun game, but the guys were made out of six cubes, the path texture was too blurry to follow, and it was permanently foggy, making it a bit spooky actually.

Well, the game developers didn’t make their games ugly on purpose of course. Looking at the hardware specs, it’s actually a miracle they managed to create a 3D game. PC’s had CD-ROMs now, but guess what the size of a N64 cartridge was? 64 MB. And they were 200 times more expensive than a CD btw (but they did a good job loading things quickly). Now 64 MB doesn’t sound THAT bad, but most games were actually crammed in about 10 Megabytes only! To compare: a single monster in Tower22 consumes almost more. Two times a 2048 x 1024 x RGBA8 (DXT compressed!) texture, plus a 10k triangle model eats about 5 megabytes already. And we didn’t mention the sound effects and additional pictures yet.

Besides the microscopic storage space, the N64 had a whopping 4 MB RAM (could be extended to 12 with a RAM pack in the joystick), and its processor ran on ~94 Megahertz. And yes, it was the most powerful console ever so far. Nowadays Nintendo doesn’t even try to compete with Sony or Microsoft, but the earlier Nintendo’s were real powerhouses. Shit, (N)64-bit was twice as much as the PSX, thus twice as good! Well, the bits didn’t quite work like that. This console was *capable* of doing 64 bit math operations. But unless you need GPS coordinates or super high precission math, I have no idea why one would need that. So, most games were just doing 32-bit operations, just like Tower22 still does in 2014.

The N64 was capable of rendering 150.000 polygons per second. Many games do that per frame now. All in all, developers had a very limited toolbox to make something good looking. No wonder that, when looking back now, games from the very early Jurassic 3D period look like triangular piles of blurry stool now. But we should embrace those pioneers. Without them kicking the hardware into the 21th century, we would still be playing Duck-Hunt as a FPS now.


A Christmas Carol
Double-O-Seven on the N64 was a pioneer. A true Marco Polo amongst First-Person-Shooter games. It was one of the first FPS games that did everything right. For one thing, it didn’t feel like a bad movie-cash-cow game. Times change, but quickly making horrible games, parasitizing on popular movie titles, happened all the time.

I’m not a very big James Bond fan. Enjoyed watching the movies together with my parents as a young kid, but being 13 years old, I found the old Bond a bit weak. No blood, no guts flying around, and Bond would always win. How predictable. So, as usual with my favourite games, I wasn’t sold straight away. When a 007 game was announced in the games-magazines, I was like “meh”. Found the upcoming Blast-Corps (another great job by Rare) more interesting. But the game scored sky high in the magazines, and the cinema commercial proved I was wrong. Some of the kids who claimed they played this game already, told me the wildest stories about climbing on tanks and throwing grenades in the hatch (which doesn’t work in the game btw, I tried it).

The greatest thing about Christmas was getting new games. And a great thing about being young, was that you had to wait patiently. You didn’t buy a game to entertain yourself for a few hours, you we’re about to get golden memories that would last for the rest of your life. I almost died waiting those weeks, scanning the TV channels for commercials. Huh? Yes, everyone hates commercials, but I had to see the Goldeneye game again. We still didn’t have Youtube dummy!

Christmas Eve. Of course my dad first had to go in bath for an hour, take a crap for another hour, get back in bath, fall asleep. Jesus Christ that day took forever. We rushed through the presents until we finally unwrapped the unmistakable rectangular N64 game-box. Still had to wait though. Eat your cake, unpack the other boxes, have some family time, BARHH!


The first man on the Moonraker
It was worth the waiting though. Sneaking towards the first guard tower (with a moving(!) truck in the background) would reveal that this game didn’t look like another foggy blurry empty blocky foggy faggy raggedy shaggy game. The fog would start 10 meters further away than normal, and the especially the effects and sounds made a violent, cinematic impression. The machine guns spew big flames, and counter-fire bullet tracers flew around my ears. Almost like a movie! And the explosions, they are still good. It didn’t help the framerate, but till this very day, Goldeneye is one of the few games that leaves an aftermath of smoke after an explosion. In many games, the red barrel says boom, big fireball, and then it’s gone as if nothing happened. Real explosions leave smoke, dust, damage, and a charred floor.

Goldeneye understood the importance of that. When I shoot something, it has to break, bleed, or at least leave a big bullet hole. I can understand older games didn’t have resources to do so, but even modern titles sometimes forget this. Bullets disappear in a metal box, leaving no trace as if it was sucked in a black hole. And did you see any bloody wounds on the Crysis 2 foes? Shooting an unmounted .50 or not, it degrades the impact. Unacceptable. Big boom and no flying ragdolls? Grrrrr.

Goldeneye had big explosions, smoke clouds, (vague) bloody wounds, bullet holes, breakable furniture, orange fire tracers, flying bullet cases, and of course soldiers doing acrobatic summersaults, backflips and head-rolls when being hit by an explosion. And the list doesn’t end there. You couldn’t throw grenades in tank hatches, but you could drive them! And how about sniping? Believe it or not, but there weren’t much precision rifles out there yet. Quake nor Doom nor Duke showed us a scope before. It actually took some time before I figured what the black horn-thing on top of the rifle was; you could zoom in and shoot an unwary soldier! In the face! How freak’n handy is that? Maybe they should use that in the army.

Photorealistic! In Goldeneye’s follow-up, Perfect Dark, you were actually able to take a photo of your own mug and wrap it on your character. The idea was banned though. Murdering your friends wasn’t very Nintendo-like…


There were many reasons to like Goldeneye. One important one were your enemy soldiers. Their heads looked very real(…), and they actually behaved a bit like human. Well, sort of. Again, keep in mind we were mostly murdering aliens, demons, monsters, knights, goblins and other fictional scum. But now we were dealing with real human soldiers. So they had to act somewhat reasonable too. The Bond baddies didn’t yell “take cover!” and didn’t cooperate as a team either. Nevertheless, they looked pretty real thanks to their wide variety of animations. Most enemies so far could walk, fire, and die. But these guys could throw grenades, reload a gun, kneel, or take a Rambo side-roll to “surprise” you.

Even better were the hit- and dead animations. Shoot a foe in his left hand, and he will shake his left hand in pain and agony. Shoot a foe in the butt crack, and he’ll jump up like a little girly that was stung by a bee, in the ass. Shoot a foe in the head and… he just drops dead. Trying out all the hitzones was a joy on itself, but also had a tactical element. Obviously headshots are effective, but hard to make. Shooting a guy in a more easy but painful area, would slow him down for some seconds. And these little bits of extra time are crucial, but often forgotten in console shooter games. With analogue sticks on your controller, you just can’t aim that fast. The badguys in 007 are relative slow, they take some time to aim and fire. Not because they are stupid, but otherwise the game would simply be unfair. And believe me, many console games made or still make the mistake of bad pacing.

I must tell the enemies in Perfect Dark, the other Rare shooter on the N64, were even more “realistic”. They could kick you, run to an alarm or call for help. You could shoot the weapon out of their hands, and some would surrender. All kinds of tricks to make you believe you’re dealing with humans instead of robots. Quite funny that the foes in many modern games still aren’t that far. They never surrender, they don’t care about their mates, and even after a head- and kneeshot they still keep charging. You see, Rare was making big steps with their shooter games, as well as other great titles they did. Too bad Microsoft lured Rare to the Xbox, let them made a fool of themselves with the Perfect Dark sequel fuck-up, and threw them back on the streets like a raped whore. So much creative potential wasted. Nintendo and Rare were born for each other. Donkey Kong, Goldeneye, Blastcrops, Banjo Kazooie…


The facility

Anyway, my name is Bond. James Bond. Explosions check. Badguys check. But how about the other typical James Bond things? You know, babes, Q gadgets, secret bases, a story line? I didn’t see the Goldeneye movie with Pierce Brosnan when I started the game, so I had no reference. But at least the game felt like a Bond movie. And judging after seeing the movie, it actually stays pretty close to the movie. Same main characters, and same main locations such as the (nerve gas?) facility + runaway airport, the frigate, Siberia satellite base, Soviet statue graveyard, st. Petersburg, secret jungle base, and of course the flying cradle where main villain Trevelyan comes to his end.

Bond himself didn’t visit all these locations in the movie, but for a game it’s fun to blow them all up of course, so they did tweak and mangle the script. There are twenty levels, plus two more bonus stages. That doesn’t sound like a whole lot, but each level is unique and hard to beat. Whereas most shooters would still drag you through one corridor after another, Goldeneye had more open area’s and allowed you to try multiple approaches. Sneak enemies from behind and keep a low profile, or sound the alarm, place trip mines, and mow down everything that moves?

Also pretty new were its objectives. It sounds silly now, but in a shooter the goal was usually just to find the exit, killing everything on your path, and eventually find some keys to unlock doors. In Goldeneye, you would have to do “Bond” things, like placing a tracker unit on a helicopter, hack a mainframe, escort women, or find a suitcase. It’s up to you to decide in which order, but Goldeneye is also a difficult game. Choosing the right routing, weapons and moments are crucial for winning the levels.

And that made Goldeneye an addictive and lengthy game. Beating it on Easy was well, pretty Easy. But doing the same on Medium or Hard was another story. Not only did the enemies get tougher, there were also more objectives to accomplish. Normally I wouldn’t bother doing a game all over again, but the levels were so much fun, plus the game smartly rewarded you. Beating levels on hard would give all kinds of cool cheats. Paintball mode, DK (big head) mode, infinite ammo, all weapons, et cetera. The dessert would be unlocking two secret levels when accomplishing all levels on the highest difficulty. Which was almost impossible, I spend many hours and days trying to do that. But leaving the game behind, knowing you didn’t see all 22 levels was not an option.

Still remember all 22 levels?


The man with multiple Golden guns
Another reward for finishing levels, were extra characters and levels in the Multiplayer mode… Yes, Multiplayer mode. Again you kids probably scratch your head, but in 1997 this wasn’t all too common. Certainly not on a game console. Yes games like Doom and Duke already offered Deathmatch. But unless you were a lucky bastard playing with lazy colleagues in the office, no one had a (proper working) IPX network. Quake went a step further, but again, Internet was still something most parents considered as a not so necessary funny feature. Plus, like an old telephone, it would cost you for each minute you were playing.

In other words, asides from some half failed attempts with Doom, GTA and Red Alert, I never really played a Multiplayer game. But now Goldeneye would offer you a split screen modus. And, the N64 didn’t have 2 but 4(!) connectors. I don’t have to explain you how Deathmatch works, but it was all fresh and new. Whenever a friend came by, doing some Goldeneye Deathmatch was part of the visit. And my little brother was also forced to join, although we gave the little fucker special “anti-spy” toilet roll goggles. Odd but true, somehow that asshole always knew our secret hiding positions… So had to wear the goggles and sit 40 cm away from the TV, so he could only see his own quarter of the screen.

The funny thing is, except for Goldeneye and Unreal Tournament, I never liked Deathmatch games. I can see the potential of working as a team, defeating another intelligent enemy. But the fact is, no one works as a team. Because you don’t know each other, and a virtual life is worth absolutely nothing. You’ll respawn in 4 seconds anyway. In a game like Battlefield, I see one idiot after another running into the most nearby chopper, take off, launch a few missiles, and get blown up again. In theory you would cautiously approach the enemy with your buddies. In practice people run circles around each other firing missiles. Realism.

Then again, you don’t have to take a game very seriously of course. In that case, what is better than grabbing chips and beer, and have fun with friends? Goldeneye had some options to make teams, and mess around with the available weapons and health. So for example, you could make your own challenge, 3 tiny “Oddjob’s” trying to kill a gigantic max health Jaws. Or let one player hide proximity mines everywhere, and then let the others try to disarm all bombs without getting killed.


I’d like to use this opportunity to explain one more “only once, never seen again” multiplayer feature Rare made for Perfect Dark. Besides Deathmatch, Perfect Dark also offered a lovely cooperative modus, which means you play the main story campaign as usual, but with the help of a friend. I’m a fan of coöperative gameplay. Too bad that many classic games such as Halflife didn’t involve an integrated coop. It’s more common now, but now I lack friends coming over here to play a game. And doing Resident Evil 5 together with little Julia is… not yet.

Anyhow, Perfect Dark had yet another mode called “Counter-Operative”. Again, the player would do a normal level, against the computer. But instead of helping you, player #2 would take control over a random computer foe. This allowed to put yourself in the shoes of the CPU, seeing the levels from another perspective. Patrolling a bit around as a soldier, hiding yourself in the toilet, slap other soldiers. Wouldn’t it be cool to chill a bit with the Combine in Halflife2, waiting for Gordon to show up? Once again Rare showed its creative capabilities, but for some reason (PC) games never copied this feature. The only game I know which has something similar, is Left 4 Dead. Opponents can take control of zombies and assault the survivors.



The key question
As said, Goldeneye was a pioneer for its time. Spectacular graphics and sounds, new elements such as objective based levels and Deathmatch, well thought level design, addictive gameplay, tons and tons of weapons. This was a reason to buy a Nintendo64, and a shooter milestone in general. Then why does Goldeneye feels aged more than Doom for example?

Hard to answer, but I think Goldeneye looks too much like a (dated) modern shooter, whilst Doom or Duke are distinctive different games than, for example Crysis. Goldeneye tried to look realistic (and did for its time), Doom or Duke while look like cartoons. They still look somewhat good, because they didn’t have to look realistic in the first place. You don’t say The Simpsons or Southpark look dated and unrealistic either. Pretty much any modern shooter has tons of machine guns, destructible environments, smart soldier opponents, open worlds with objectives, and multiplayer. And clearly in a more mature stadium than Goldeneye or Perfect Dark. You can’t play Goldeneye without comparing the level size with modern game worlds, and no matter how cool the hit- and dead animations were back then, they can’t beat ragdoll physics. Doom or Duke on the other hand are brainless arcade action games, where you would blow up as many monsters as possible. Quite different than most modern “serious” games, and therefore refreshing and still fun to play once in a while.

Doom and Duke are timeless ancient artifacts, Goldeneye was a beautiful woman from the past. Aged now, but the pleasure was all mine when I met her.

Sunday, May 4, 2014

Don't call me daughter

It has been a while, so let’s throw a few vague screenshots from rooms you didn’t see before. Nothing too fancy, but hey, better than nothing. These are part from a little “test-demo” I’d like to show you somewhere… I’d better not make time-related promises… I wish I could, but we’re still busy finishing the other “official” demo movie, everyone is extraordinary busy at work, AND, I have a new excuse in my sleeves…

Or well, not a good excuse (yet), but I'd like to share it anyway; I'm going to be a daddy again :) If everything goes well of course, 10 weeks is still quite premature. And yes, I will annoy you with some father & daughter stories this time. Dedicated for all the daddies, and I’d-like-to-have-kids-but-I’m-not-quite-ready-yet fathers (and moms of course).


MTV Teenage moms
I became a dad pretty young. Well, for Western standards at least. Aged 30 now, in some countries I could have been a great-grandmother already. Anyhow, I was 23 when a panicking girlfriend text messaged me, writing she wanted to die. Not literally I presume, but getting kids at that age was a privilege for MTV teen moms, trailer trash, and fanatic servants of the Lord. In addition, I still lived with pops & moms, sleeping in my solo manhole game dungeon bedroom, fresh from school. And moreover, no one else in our direct circles had kids.

My girl-magnet skills didn't work out very well so far, so when predicting our futures with friends, my prognoses was that I would find a charming cow called Bertha somewhere in a singles bar at the age of 40. Although I found this "little twist" pretty funny actually, I was also ashamed to announce I would become the "first dad”. I told my friends and brother pretty early, but telling mom and dad felt like climbing the Atlantic wall. "Rick! You should know better!". Finished school, just got a promising job, and look who's a MTV Trailer kid now?!


Well, pride is something you can swallow. Self-mockery also helps. But more trivial was the fact I didn't knew my girlfriend that long back then. Not much longer than a year. Hence not even a year if you exclude the periods she wasn't here. As she comes from Poland, she worked here for random periods, then had to return again for a few weeks or months. Or maybe forever in case there wouldn't be new work anymore. After some years, a real man is glad he can be home-alone or gone-with-friends without having to listen to Nonstop Female FM. Orders here, complaints there, guess what Suzy said?! No she didn't! But when being just in love, it's terrible to get separated, not even knowing she'll ever come back. And no, we didn’t have Skype or anything. Let’s say in my girlfriends household, they still wind up the TV with a donkey.

Not exactly a solid fundament for getting kids. Hence, at that time we couldn't even normally communicate. As said, now she yaps the ears of my head but back then her Dutch was pretty bad, and I don't speak a single Polish phrase either. Cuddling doesn't require much language. Arguing in strange languages downgrades the arguments and reasoning to childish levels. So how about real serious matter, such as living together, and raising a kid together? It's not like giving your girlfriend a rabbit for her birthday. Your whole life will change, playtime is over. And needless to say, she had the same concerns.



Almost forgot, the screenshots. Not the best looking scene every, it's "programmer-art".

Flee Forest!
If I ever had good arguments to flee, this would be it. Drink beer with friends or change diapers? Start working and save money for a nice place later, or spend all your bucks on a crying kid in a little house now? Put an end to an already difficult relation, or get forced to live together because of a baby? Wait for the right moment, or put a kid on the world in turbulent conditions? Pride or shame? My girl was prepared for the worst when she text messaged me that November day. A pregnant young woman, all alone in a strange country, without any guarantees...

I received that message while I was working. Thought for some seconds, and then replied with one of the few smart things I ever said: "It's going to be all right.". That evening, I drove to her, and gave her a kiss on her belly to pull her a bit out of her shock. I'm far from a romantic, thoughtful type, but I'm still pretty proud on what I did that day. If there is a shipwreck, you'll need a vast rock where the drowning can clamp on. My perfect future picture was shattered, but I only needed a few minutes to decide I would help her. And the baby. Period.

Words can be hollow, but in case you ever get in this situation, never forget there are worse things. I always wanted children anyway, and how hard can it really be? Billions of people did it before. Some without a husband, or even without a house or food. You can make drama as much as you want, but it isn't going to fix anything. We aren't stupid. We are fixers, here is the moment to prove what you're worth.

And it all went well. Baby is getting a real spoiled princess now. Girlfriend speaks, works and lives like any Dutch now. We live in a little but nice house, and I still drink beer with friends. Maybe not as often anymore, but if you can get some help you certainly won’t get trapped in your house. Be creative, switch tasks with your girl, call the babysitter, or ask mom and dad. Yes, they were shocked when I finally had the balls and told them. But as soon as they can start buying little socks and then see a little critter 9 months later, they will become a proud grandpa and grandma. Despite the fact babies can't do much more than sleeping, burping, crying and overload their brand new pants, they have that mysterious skill to charm another. Mom, dad, grandma, grandpa, aunt, uncle, friends... the whole discussion of right or wrong fades away like rain in the sun when they can finally hold that little guy. Mother Nature overrules.



Perfect timing
This time, the pregnancy period will be a little party. Not having to visit the gynaecologist in silence. Not having to buy an house in a rush and beg your employer for a contract. Not having to delay the inevitable confrontation with your parents. Not having to worry and doubt about each other anymore. This time, we can enjoy.

What is the right moment to get kids anyway? When looking at my friends, we're still the only couple with kid(s). Not that my friends don't want kids, but they await the right moment I guess. School, work, house, be happy together for at least X years, marriage maybe, realize your own plans first. The logical order. But even then, there won't be a "Goddamn, I can use some kids now." moment. Like the little bastards or not, they don't come for free. They eat your time, wallet, and your girls breasts. And you can't exchange them, or put them in a freezer for some days if you had enough. Being a parent, is forever. So of course, I don't judge or blame their awaiting.

But unless you really hate kids, have far more important priorities, or just live in a shitty situation at the moment, the good things in life sometimes require a sacrifice. If one expects or demands everything for "free", he or she isn't worth a kid. There won't be a perfect moment. You're always busy with something. Whether it’s getting a promotion on work, moving to another house, redoing the garden, or mourning because of family tragedy, there is always something. When you turn 35, you probably still like to go on vacation. When you turn 40, you still may get a busier job with more responsibility. Getting up early on Sundays will always suck. And your house will never be perfectly finished either. I'm not saying one should rush. Hell no, do whatever you like. But don't forget the clock is ticking. It's a bit like going to the dentist, whether you go right now, tomorrow or next week, it's going to suck anyway.

Have some faith in yourself. Even if the house is isn't finished, the baby will sleep fine. Maybe you won't, but hey, that's only temporary. If there were some financial problems, in Africa they raise kids with absolutely nothing so just hold back a bit on whatever isn't really necessary, and you'll be fine. You can miss more than you think. You see, anything can be fixed. And looking back now, I'm actually quite happy we're "young parents". It's not only biologically justified, you have more energy to overcome hectic tasks, and it's easier to understand their world (being still half a kid yourself).





Centre of the universe
But ultimately, it's not only about making offers. If you can love your girl, your mom or your dog, then sure you will love your baby just as much, if not even more. Giving love and being loved. That my friends, is priceless. You can't translate that to 100 times drinking with friends, sleeping 4 hours more in the weekends, 3 expensive vacations, or a 20% bigger house. Personally I don't believe luck can be bought anyway. A faster car is fun, but you'll get used to it. A new video game keeps you amused for approximately 10 to 30 hours. But they aren't going to help you, cheer you up, or play Bingo with you once you're 82 years old and all alone. You already feel it when dropping of your kids, and being alone for a day. The house feels… empty.

I think people are too much busy with themselves these days. And so am I. Work, work, work, Tower22. Check telephone, check emails. Talk about what you did, show your new stuff. Train yourself, develop yourself, treat yourself. Face it, how much hours each day are you doing "your stuff"? Probably more than listening or taking care of another. The best example is our distinguished classic house-mom-slave. Just like men, women are busy making a career and often don't even know anymore how to turn on the microwave. I'm not judging, that's our society. But with a kid, you'll realize and accept you're not the main act on the stage anymore.

Next Saturday I'll bring my little girl to swimming lessons for the first time. 8 o fucking clock in the morning. But I can guarantee you, watching her trying to stay above the water, having fun, and proudly telling mom and me what she did afterwards will make it all worth. I'll be there to watch my little girl, not to have some more "me-time", which would have probably been "stinking in bed" at that time.


And in case you're just not really a "kids-person", well, neither am I. just never really knew how to react or behave when someone else kid is there. Tell a dirty joke, and an angry mom will slap you. Touch them and an angry dad will kick you. Do something wrong and they suddenly start crying. Being on their level, with the same kind of humour and interests is difficult. But don't worry, you will learn. Just as long you spend some time with them. Notice I said "spend time", that's not the same as buying iPads to keep them silenced. Read them stories, play games, make jokes, teach them all the wonderful things. Allow yourself to be a kid again, just a little bit. It might be your last chance this lifetime.

Like it or not, but our kids are the future, not you and me (anymore). And it’s good to know someone will continue our journey. What you teach them, will eventually become your legacy.