I Wanted Orange (The machine would not make a mistake.)


Takin’ New Ground in PackBSP

As I mentioned earlier, Valve's been updating some of the SDK stuff, which means I have to play catch-up supporting these new things before I can really get my momentum back for PackBSP 2.  In addition to the @MaterialExclusion and @AutoVisGroup sections, it seems that @FilterClass is a new part of the FGD lexicon, to support some TF2 features.

So I've managed to rewrite the FGD parsing code in such a way that it should be a lot more friendly for a hypothetical future where Valve adds a new @ArbitraryPurposeClass, as long as it fulfills the same expectations  that the other class declaration sections do.

With that out of the way I can get back to putting in a GUI for a beta release. Except for the interface for customizing which files you want to pack, the user generally just has to choose things and click 'next".


Iron Man 2

Just went out and saw this with some friends. It was a good movie. Not as good as the original, but during certain points of the movie and while driving home I had some Fridge Logic moments that I'd like to unpack. Spoilers after the jump. (And I'll skip the predictable "physics doesn't work that way!" stuff.)


FGD API example

Just a sample from the FGD code I wrote for the Hl2Parse library. This snippet loads the TF2 FGD file and then re-outputs the FGD format to show it has parsed everything. It also prints the "default" version and then the "combined" version which collapses all the inheritance.

final String fgdPath = "...";
FgdSpec spec = new FgdSpec();
spec.loadFrom(new File(fgd));

final String entName = "func_respawnroom";
FgdEntClass spawnroom = spec.getEntClass(entName); // Get normal version
System.out.println(spawnroom.toText(entName)); // Print sparse form

FgdEntClass combined = spawnroom.getInherited(spec); // Do inheritance
System.out.println(combined.toText(entName)); // Print comnined form
The first print statement replicates the set-up in the original file, using the base(...) modifier to do inheritance.
@SolidClass base(Targetname,TeamNum,EnableDisable,Toggle) = func_respawnroom :
"Designates a respawn room for a team." [
The second prints statement shows how it looks after the inheritance rules have been applied.
@SolidClass  = func_respawnroom :
"Designates a respawn room for a team." [
targetname(target_source) : "Name" : "" : "The name that other entities refer to this entity by."
StartDisabled(choices) : "Start Disabled" : 0 : "" =
TeamNum(choices) : "Team" : 0 : "Team" =
input KillHierarchy(void) : "Removes this entity and all its children from the world."
input Enable(void) : "Enable this entity."
input Disable(void) : "Disable this entity."
input SetTeam(integer) : "Changes the entity's team."
input Kill(void) : "Removes this entity from the world."
input FireUser4(void) : "Causes this entity's OnUser4 output to be fired."
input FireUser3(void) : "Causes this entity's OnUser3 output to be fired."
input FireUser2(void) : "Causes this entity's OnUser2 output to be fired."
input AddOutput(string) : "Adds an entity I/O connection to this entity. Format: <output name> <targetname>:<inputname>:<parameter>:<delay>:<max times to fire (-1 == infinite)>. Very dangerous, use with care."
input FireUser1(void) : "Causes this entity's OnUser1 output to be fired."
input Toggle(void) : "Toggle the enabled/disabled status of this entity."
output OnUser1(void) : "Fired in response to FireUser1 input."
output OnUser4(void) : "Fired in response to FireUser4 input."
output OnUser2(void) : "Fired in response to FireUser2 input."
output OnUser3(void) : "Fired in response to FireUser3 input."
Tagged as: , , Comments Off

The Pyro’s Problem: Afterburn versus smart enemies

The Pyro has always been an interesting class, struggling to find its niche. It's gotten some buffs and some nerfs, but at the end of the day a common TF2 issue arises: A balanced gameplay mechanic against "Joe Average" which becomes disproportionately worse as enemy players get smarter. And with the "War!" update,  some of his common enemies have new tools to use against him, such as the Demoman's Targe (+50% fire resistance) and the Soldier's Direct Hit (fast rockets difficult to reflect.) I think the Pyro could use another very circumspect buff which would actually help carve out his own niche in higher-level play...

Tagged as: , Continue reading


I took my siblings and a friend out to see Avatar (to disambiguate, the James Cameron version) at the huge local IMAX. It wasn't a bad film, but I think the storyline and set of characters was chosen to be as "safe" as possible while relying on the visuals to carry the movie. People are right when they point out that it closely parallels a lot of other stories and movies. That said, it's a step up from some of the horrible CGI-centric movies that have been foisted upon the public. There were some things which bothered me...


Lenovo G-550 first impressions

After a lot of trepidation, I managed to convince myself that I could use--nay, deserved--a laptop. One which would be cheap and portable, while still being powerful and comfortable enough for a two-hour coding binge at a local Starbucks. I ended up settling on a Lenovo G-550 from Frys. (Yes, I've heard the customer-service horror stories already.) The main difference from the model on Lenovo's site is that it moves from 2GB of higher-mhz memory to 3GB that's lower for about the same price. Probably the right trade-off considering the rest of the build.

So in terms of good and bad things...


The blog, it lives!

Well, I finally broke down and installed a blog on my site here. I'd been meaning to finish writing up a whole Zend-Framework-based system of "real" pages and the like, but I'm not really in that business anymore.

I'll leave my old code lying around--just in case I find myself pressing up against the boundaries of what WordPress will manage--but I think it's just a life lesson in the importance of incremental development.