WARNING: Spoilers for Left 4 Dead 2: The Passing and Half-Life 2:
Episode 2
For the last few months, Valve coyly hyped up that in their new Left 4 Dead 2 DLC "The Passing" the survivors from the first game were going to meet up with the survivors of the second game, and that one of the original survivors was going to die. Awesome, I thought, but no. Here's how Valve managed to fuck that up: I went into The Passing without expecting anything groundbreaking in terms of gameplay (it is, after all, just a DLC pack). What I was expecting was some story. Obviously, the overall arc of Left 4 Dead 1 and 2 isn't very well presented. Hell, the first game was supposed to be 4 unrelated B-Movies strung together with Valve retroactively making an actual coherent story out of them all. But with the release of Crash Course and an overall arc between episodes in Left 4 Dead 2, I was expecting Valve to at least do something memorable for this somewhat-hyped The Passing. What we got is two decently sized levels of typical L4D2 zombie killing. Fine. A little stale, but fine.
What do we get as our two-groups-of-survivors-crossing-paths? We walk by a bridge with three survivors standing on it, looking normal, acting like everything's ok, ready and willing to help. About three sentences later, we're off. Ok… maybe the cool part is coming up. Go about searching these rooms and oh-by-the-way there's Bill's body in a corner room. No subtle hint of sorrow from the original character NPCs. No awesome go-down-in-flames moment. Everything's fine and there's a body in the corner over there that nobody seems to notice. I understand that this is Left 4 Dead we're talking about. It's not exactly a game for its cinematic value and storytelling. Most people just want to kill zombies and be done with it, but come on. That's it?!? At the very least, we could have had the original survivors covering the new group as they make their way across the finale (which they already do anyway), with a short 20 second in-game cut-scene of the old survivors holding off the last wave of zombies while the new heroes speed off into the distance only to have Bill get whisked away by a Charger that crept up out of nowhere. his body thrown into the wall with Zoey and Francis shooting after it only to realize they're too late. The Charger and Bill lie motionless on the ground. Zoey breaks into tears hovering over Bills body whimpering "Bill!…. No…" with Francis offering his best attempt at sincerity: "I'm going to miss that old bastard…" [CREDITS]. Something!… Anything is better than the oh-by-the-way-Bill-died-when-you-weren't-looking that was delivered. What Valve did was pretty much akin to if the original Star Wars never showed Ben Kenobi's death, but rather Ben Kenobi deactivates the tractor beam and is along his merry way only finding out in dialogue as Luke runs to the Millennium Falcon "Sorry kid, the old man's dead, now get your ass on board!". No Luke spectacting the fight. No wise jedi raises his lightsaber and sacrifices himself for the greater good. No cry of anguish from Luke with a John Williams score to seal the deal. "What happened to Ben?" "Oh, he died, but whatever."
We spent the entire Left 4 Dead game with these characters; their dialogue and dynamics building through each succeeding chapter. With Left 4 Dead 1's scarcity of ammo and supplies with you were constantly running out on harder difficulties, forcing you to rely on these characters as your life-line in dire situations. This establishes something with these characters that was completely not acknowledged in The Passing. Remember the end of Half-Life 2: Episode 2? There's a reason you do. In that ending, we lost an important character that we had watched evolved from Half-Life 2. It was an emotional moment for the characters and also an emotional moment for anyone playing who gave a slight damn about the story of Half-Life. We watched Eli Vance die. We didn't walk in and find Alex acting nonchalant to her father's body propped up in the corner. The characters of Left 4 Dead 1 were developed in the same way. We fell in love with the cast of Left 4 Dead 2, and they deserved the same respect as the cast of Half-Life. The only possible way Valve can make this right is if the Left 4 Dead 1 DLC has you play the events prior to The Passing and concludes with Bill's death, and it's actually done in a way that respects the character.
Posted: April 23rd, 2010
Categories:
Gaming
Tags:
Comments:
No Comments.
On April 1st, 2010 YouTube pulled what I considered to be the greatest Tech Industry prank of the day: TEXTp. For the fools, YouTube claimed that using this video quality mode saved bandwidth; an obvious ruse. In reality it was simply a pixel shader that was applied to the video stream that turned streamed video frames into the ASCII style that we all know and love. I love ASCII art, so I thought this was the coolest thing I’d seen in a long while. I had hoped that YouTube would realize just how awesome this effect truely is and leave it available year round, but my hopes were in vain. At midnight on April 2nd, the effect was gone. You couldn’t even append the &textp=fool parameter into the querystring. Lucky me I had Firefox save me a page on my disk that still had all the proper flashvars to keep using the effect. But sometime on April 5th, YouTube removed the pixel bender shader they were using for the effect from public access. TEXTp was no more as far as YouTube was concerned.
Long story short, I was mad that they removed something so awesome, so I created my own TEXTp pixel shader to cope. I call it AsciiMii. Here we have optimus prime demonstrating the effect:

The shader is written in Adobe’s Pixel Bender framework. There’s still a few things that need tweaking, but I’m going to see how far I can run with this. I’ve already got it attachable to video objects in flash, and since its a Pixel Bender kernel, I can probably turn it into a Photoshop filter. I’ll post more when I actually figure out what I’m going to do with this. At the very least, I’ll just release the shader (sorry… I should really be calling it a “kernel”) source code and be done with it.
Posted: April 7th, 2010
Categories:
Programming
Tags:
Comments:
No Comments.
Note: Recent tests lead me to believe that this does not work properly in IE7. I still have to look into it.
So some buddies of mine asked me a few days ago if I would build them a web application to help them track runs in EVE Online. Seeing as how it would both give me something to do and let me start a fresh web project not riddled with code I wrote when I didn’t know any better, I agreed. One thing I wanted to do correctly from the start was JavaScript DOM mutations. Back when I didn’t know any better I used innerHTML like it was thrown in free because I waited for more during a Billy Mays infomercial (Hi, Billy Mays here for Internet Explorer! Why conform to all those pesky internet standards…).
As I started writing client-side DOM mutation functions for AJAX callbacks, I started abstracting the logic into simple DOM functions. After awhile I realized that the only way I was going to be truly happy was by using a JavaScript parser that could take a string of HTML markup and convert it to a DOM sub-tree. This way I could have templates of HTML stored server-side, send those templates back with the proper information when requested by the client, and the client can just parse the HTML string and inject it into the DOM as needed. I initially set off to write one, but then thought that somebody else probably already wrote one (this is, after all, the internet). After a bit of googleing, I found that John Resig had already modified one made by Erik Arvidsson to seemingly do exactly what I was looking for. I gave it a spin and it did most of what I wanted, but was lacking one feature that, after taking a bit of time to figure out the parser’s logic, I added to it.
I really only added about three lines of code to make it work. Originally, the HTMLtoDOM function did not actually inject the parsed HTML into the DOM at the given node, it would just blindly inject it into the document body. Also, the original function would only seem to inject the parsed HTML into the DOM, or return a complete DOM tree, starting at an HTML root node. I thought it would be more useful if it returned the parsed DOM sub-tree without actually injecting it into the DOM, that way you could still do whatever you wanted with it (element swaps/clones/etc. outside the parser’s logic). This is done by returning the first child of the parent DOM object that marks where the parsed HTML is to be injected. By supplying the function with a garbage div [HTMLtoDOM(htmlString, document.createElement("div"));], the parser injects the parsed HTML as a child of the bogus div that was created for the parser, and returns that element. Since the bogus div is never injected into the actual page DOM, you’re free to do whatever you want with this DOM sub-tree before your attach it to the page DOM.
Here is the JavaScript file: htmlparser.js
The original can be found at John Resig’s blog
I haven’t tested that the other functions still work because I never use them. I just left them in for completeness, but there’s no reason that they shouldn’t work. Modifications were only made to the HTMLtoDOM function.
Posted: July 4th, 2009
Categories:
Programming
Tags:
Comments:
No Comments.
I had an epiphany (well, it wasn’t an epiphany, but more of a realization that I’m a college graduate and nowhere near a path that leads to what I want to do with my life) the other day, and decided that it was time to stop playing games and start messing with them again. I had just finished another run through of the Half-Life series and decided that it was time to get back to my game modding roots. Back in the day (when I wanted to go to Art School), I started making maps for GoldSrc games (Counter-Strike, Day of Defeat, HLDM, etc…) and finished about 5 or 6 that I ended up releasing. I always wanted to make a short single player mod, but found that I lacked the honed art skill to make original content (models and textures) and the programming ability to make changes to the game so that it wouldn’t seem like 30 minutes of the original game with a face lift. But now that I’m a college graduate with a degree in Computer Science, maybe now I can make some of those code changes to make the game slightly enhanced from its parent and embrace my art roots to make some custom content that actually looks good. I decided to start my endeavor at the most logical continuation point: The Source Engine.
Actually, on reflection, it would seem more logical to pick up my game-making endeavors where I left them off: the Doom 3 engine. The Doom 3 engine is great for making maps and mods. Everything is open. You don’t need any custom tools to compile anything. Everything except the modeling program (Lightwave) ships with the game, and id software has always been stellar at being open to the modding community. Truth is I’m going with the Source Engine for two reasons: After playing with Portal for the n-th time, I had some ideas of possible modifications I could make to the code base that would enhance the game-play possibilities far greater than I could think of with any other engine; and two, all of my “game-making” buddies I hang around with work with Source on a regular basis (all of them either worked or are working on the Black Mesa Source modification for Half-Life 2).
Cracking open the hood of Source (specifically the Portal code), I see a lot of potential. I’m quite surprised at the way some of the things are done, and other things are just genius (portals are rendered by copying the view into the frame buffer, and use the stencil buffer to help with filters… absolute genius). I would like to build some kind of very quick single player mission that involves not only portal puzzle solving, but also combat with the portal gun. I first tried to see what I could get away with using what’s currently under the hood of the Orange Box SDK. I build a very quick “orange box” (no pun intended [no, seriously, it was a dev level that was a box with a light and a few entities]) to check a few things, and the results… out of the box… not a whole lot that deviates from Portal itself.
First thing I noticed is that all NPCs that aren’t npc_turret_floor or npc_turrent_ground objects do not comprehend Portals at all. I can understand this. I dig some digging through the code-base and found what seems to be the reason for this.
inside npc_turret_floor.cpp:
#ifdef PORTAL
if ( !FInViewCone( pEnemy ) || !FVisible( pEnemy ) )
{
CProp_Portal *pPortal = FInViewConeThroughPortal( pEnemy );
if ( pPortal )
{
// Translate our target across the portal
UTIL_Portal_PointTransform( pPortal->m_hLinkedPortal->MatrixThisToLinked(), vEnemyPos, vEnemyPos );
}
}
#endif
The majority of the Portal specific code seems to be inside of precompiler directives (for obvious reasons). This little snippet lives inside the function that determines how a turret searches for an enemy (the player); basically the turret is saying “if I can’t see the enemy anywhere, are there any portals I can see, and if so, can I see the enemy through the portal (UTIL_Portal_PointTransform function call)”. I haven’t actually ported this logic into any other npc classes yet (I’ll see what I can do this weekend… I really should be studying for my MS Active Directory certification test).
I only spent about an hour prowling through the source code looking for explanations as to why things were they way they were in my test level. While messing around with my box level, I jotted down a few things that I noticed were awry and want to look into changing:
- NPCs don’t understand portals (can’t detect through portals) [see images at end of post]
- after detection works, see if I can get the AI to follow through a portal
- prop_physics don’t seem to inflict fall damage on NPCs (might just be incorrect settings in hammer)
- Weapons do not understand portals (a combine soldier’s dropped weapon)
- Ragdolls don’t understand portals
- Cannot spawn portals underneath NPCs (except turrets)
- Begs question, what do you do when this happens? If I spawn a portal
link underneath a combine solder and the end of the link is on a wall
at floor height, the damage inflicted by the trip wouldn’t kill him…
The easy way out would just be kill him and make his ragdoll fall
through and only build maps that allow soldiers to drop through portals
that cause a very long fall. Also easier because of the fact that
objects can emerge through a portal upside down in certain cases…
this would require a metric fuck-ton of animations/conditions to kill
the npc if he/she’s oriented a certain way, and just fall in others.
Maybe it wouldn’t be that hard, but at first glance, this seems light a
lot of work.
- NPCs don’t shoot bullets (they do throw grenades though) [i hear it's a problem with the multiplayer code base, which I didn't think I was using... maybe Portal's code base is a branch of the multiplayer code base?]
- Physics gun does not re-grab teleported prop_physics object after going through a portal (portal gun does)
Long shots ideas that will probably never get implemented:
- HDR through portals?
- Emulate light coming from a portal [[Extreme Long Shot (Don't have
access to radiosity engine; probably hard to fake with it still looking
good)]]
I’m actually kind of excited to see what kind of havoc I can make with the Source SDK.
Creating a portal in front of a Combine NPC and trying to peek-a-boo through it. Combine NPC complete ignores me, while the floor turret (off to the right, not shown) detects me no problem

After going through the portal, and then stepping back through, the Combine NPC is alerted to me, but can’t find me.

Posted: May 1st, 2009
Categories:
Gaming,
Programming
Tags:
Comments:
No Comments.
Greetings.
For those of you that don’t know, I’ve taken up music as a hobby and am teaching myself to play guitar/bass (as if my Facebook profile picture, constant status updates about it, and constant talking about it [for those of you who are unfortunate enough to associate with me in person] didn’t suggest otherwise). I’m taking the classic approach of learning by emulation.
One of my greatest mentors once told me that if you want to learn a specific style/technique of doing something, start trying to emulate that style exactly, because you’ll find that you won’t be able to emulate it to the letter. Subtle hints of your personality will influence the emulation and eventually you’ll have something else entirely. Well, surprise surprise, I’m learning by emulating what is, in my opinion (that I have made very clear [sorry to all of you who have to keep hearing about it]) the greatest band in the world: Muse. It’s the standard deal: pick a song, learn how to play it.
One of the many songs I’ve practiced is Interlude, the 7th track off Muse’s 3rd album Absolution. This track is a 38 second masterpiece. It takes Samuel Barber’s Adagio for Strings and compresses it into a quick, eerie blend of heavily distorted guitar and bass with a hint of haunting falsetto. One of the reasons I picked this song is because it is a great starting song to get your feet wet with playing multiple parts, recording, and mixing, and the song’s simplicity tries to hide the fact that it’s really 30 seconds of tremolo picking (really really really fast picking of the strings, so that it sounds like one continuous note [think Miserlou or the intro to Knights of Cydonia]. When I wanted to practice increasing my tremolo picking speed, this song was the first choice.
So the other night, I’m messing around with my guitar and I notice that over the last few months that my stamina and speed had increased significantly, so on a whim, I recorded myself playing it. Well, I thought it sounded pretty good (which is surprising, because I usually think I sound like shit), so I grabbed my bass, hashed out a few takes of the bass track, and mixed it together (no haunting falsetto, though. I could record it, I just can’t imagine anyone would want to hear it):
Interlude (Cover).mp3 (1.47 mb)
It’s pretty much two tracks mixed together. The guitar part is my Ibanez S320 running through Guitar Rig 3 with a Quad Delay and a Studio Reverb effect chained after an Ultrasonic Aggressive [overdrive] amp/cabinet preset combo. The second part is the bass (a cheap Crate that I’m soon replacing with an Epiphone Thunderbird IV (sweetwater doesn’t have any in stock at the moment) with the same effects, just with a Bass Pro Distorted amp/cabinet instead of the Ultrasonic. Here’s the two separated tracks straight from Guitar Rig 3 (my bass picking is very uneven, and you can hear it in the track):
Interlude (Cover) [Guitar Track].mp3 (1.47 mb)
Interlude (Cover) [Bass Track].mp3 (1.48 mb)
They were mixed together with Adobe Soundbooth and a few more effects were added (some equalizing filters and more reverb for the guitar; some equalizing filters and an additional delay for the bass). There’s some obvious differences between my cover and the real deal: first and foremost, mine lacks the haunting falsetto (maybe I’ll add it in later). Second, the album version’s guitar part breaks the tremolo half way through the song to slide down and back up the neck and then continue the tremolo. I left this out on purpose, because I think it sounds better without it. Otherwise, it’s just minor differences (album has more fuzz and a more predominate guitar ending note, but then again, I didn’t record mine in a studio and I don’t really know jack shit about recording/mixing audio, I’m picking this up as I go).
Also, while I’m at it, I may as well post this other recording. It’s an emulation of the Close Encounters of the Third Kind riff that Bellamy uses as an intro to Knights of Cydonia during the Wembley Stadium performances on the HAARP DVD. When Bellamy plays it, it’s just the five notes from Close Encounters with a reverse delay effect and some fuzz, but Guitar Rig 3 doesn’t have a reverse delay that’s as smooth as the one he uses, so I started fidgeting around with various effects. I recorded this about a month ago, so I don’t even really remember what effects or branching is going on here (the Psychekiller FX preset in Guitar Rig 3 is the closest thing that reproduces the sound). Anyway, I think it sounds kinda funky/sci-fi:
Close Encounters Riff.mp3 (1.60 mb)
So yeah, that’s what I’ve been up to these last few months. If people like these, I’ll post some other riff recordings I’ve got. And if anyone wants more info on how it was recorded/mixed/etc, I’ll gladly fill you in.
I just ordered a Fuzz Factory pedal from eBay. Once it gets here maybe I’ll upload some more stuff.
Posted: April 8th, 2009
Categories:
ABC,
Music
Tags:
Comments:
No Comments.
I’m seeing a lot of this posted on the Sins of a Solar Empire beta and tech support board (hell, there’s even a post by me complaining about this very same issue before I applied common sense to my list of acquired problem solving skills)
For those of you who have played Sins of a Solar Empire and, like me, enjoy engaging in epic battles for all of space against nine other opponents in a system with the upwards of one hundred planets, you’ve probably had your parade abruptly shat on by the delightful Windows error sound accompanied by a message saying something about a mini-dump. At first you think nothing of it. “A mere fluke”, says I. Surely it shan’t happen again and dissuade me from conquering the galaxy from my remaining opponents; to which Sins replies with yet another Windows error sound, which at this point sounds like evil snickering, and the word “mini-dump” sticking out like a Star Trek fan at a Victoria’s Secret fashion show. What is the meaning of this travesty! Is there a glitch in this epic game that is preventing me from playing matches on an “unrivaled scale”? Well… yes and no.
Here’s the deal. Sins is a huge game (obviously). If you’re running a 32 bit Operating System, Sins is restricted to 2GB of virtual memory. This is a limitation of the 32 bit (x86) operating systems (The Microsoft consumer ones, anyway…). 32 bit OSes (Vista in particular) can only see 4GB of RAM in your box, and only reports 3GB to the user. Why? Because there aren’t enough bits in 32… bits to access memory addresses past 4GB. Well, then you’re asking yourself “why is vista telling me I only have 3GB?”. Because vista is reserving 1GB for hardware addressing. Now you’re probably thinking “Why the hell am I still reading this blog entry?” (because you find my attempts at humorous sincerity amusing) and if you’re not, you’re probably thinking “Alright, then shouldn’t Sins be able to use the 3GB of memory that Vista is telling me I have?”. Short answer “No”, long answer “No.” The other gig is used for Vista’s kernel processes, leaving 2GB for user applications.
If you’re playing a game of Sins on the largest map possible with as many players as possible and everyone has fleets of 200 ships and you’re running on the highest detail settings across the board, your mini-dump crashes are probably due to Sins running out of memory to store that scout frigate you just built. Test it. Launch Sins in windowed mode and open up task manager and start playing. Just watch the Memory Usage of the sins executable climb as you continue to play. Oh yes, it will drop here and there, but if everybody is building fast enough, the memory well dries up quicker than a Scotsman’s beer glass.
The “fix”? Lower all of your detail settings to “High” instead of “Highest” (except “Planet Detail”, leave that at “Highest”, otherwise the planets and main menu look like ass). It’s not really a fix per-say, but it’s the best thing that will let you finish that epic battle for galactic conquest. Besides, it’s really hard to tell the difference between High and Highest when your micromanaging your 7 choke points. Another possible fix is to just switch to a 64 bit operating system, where Sins will have 8GB of virtual memory to play around with.
Addendum: For those of you wondering how an application can use more memory that you physically have in your computer (if you only have 2GB of RAM for example), here’s how:
Wikipedia on Virtual Memory
Wikipedia on Paging
Posted: March 12th, 2009
Categories:
Gaming
Tags:
Comments:
No Comments.
I have a blog. Get ready for a slew of posts telling you more than you wanted, followed by me probably forgetting about this blog and it eventually becoming another spec on the convoluted history of the Internet.
I’ll try to keep this free of personal jargon that few would actually have interest in, and try to keep it more full of productive/useful things.
Posted: March 12th, 2009
Categories:
Misc
Tags:
Comments:
No Comments.