• entries
35
67
• views
21187

Offloading geekery to fixed storage to make room for pointers in my head.

## Path Finding Research

[size="2"][font="Courier New"][font="Microsoft Sans Serif"][size="3"]I'm currently working on the architecture for how the game will do path finding. Up until a couple of days ago, I had a plan that would work reasonably well, but then I stumbled upon a link to a thesis paper that really made me re-think what I was planning. I'll start this entry with a brief description of what the requirements are, then the "current" plan, and then I'll go into why this paper has made me re-think my plans.
[/font]
[/font][size="5"][font="Microsoft Sans Serif"]
Part 1: World Description[/font]

[font="Microsoft Sans Serif"][size="3"]The game world is logically divided into lots (i.e. user-changeable areas) and the rest of the world (users can only interact with this area and cannot actually build on it or do much to change it). The lots are inserted into the world at essentially random places and they are pretty much completely dynamic, from changing terrain to walls to objects placed on them), but are at least guaranteed to be convex polygons.[/font]

[font="Microsoft Sans Serif"][size="3"]The world also has roads and paths that are essentially cheaper for agents to travel on, so they tend to move to them and then along them for longer trips. Some roads are for cars and bicycles only, some are useable by cars, bikes, and pedestrians and some are for bikes and pedestrians only. There might end up being other permutations or even more types of agents as well.[/font]

[font="Microsoft Sans Serif"][size="3"]The world also has water areas (both sea and lakes/ponds) that will be routed upon as well, by various agent types (swimmers, boats, etc). Steep-sloped areas might also be routable via climbing animations, but more expensive to move on for path-finding, so they'll only be used in specific circumstances and/or by specific types of agents.[/font]

[font="Microsoft Sans Serif"][size="3"]Finally, a number of objects may be routable as well - bridges, for example. And since objects can be placed or deleted by users, the objects must have routing information built into them that can be "attached" to whatever data structure(s) we end up using to represent the world, lots, etc.[/font]

[size="2"][font="Microsoft Sans Serif"][size="3"]Lots are connected to the world via portals. Routable objects will also be connected via portals. Portals are simply links between 2 different pieces of the world and may or may not be on the same navmesh/grid/graph (or whatever we end up using that has its own local-space coordinates) and can be traversed via normal movement, teleportation, or a custom animation. Other examples of portals would be stairs between levels of a lot (custom animation to move the agent), doors between rooms (custom animation to move the agent and open/close the door), teleportals (instantly jump to another part of the world), or a boundary between land and water (move normally, then animate slower, then finally, change to a swim move-type or the reverse for exiting the water). Portals are by default open, but can be locked to specific agents. Like all edges between search nodes, portals can be one-way or two-way.

[size="5"]
Part 2: Requirements

[/font][font="Microsoft Sans Serif"][size="3"]1) Quickly and efficiently path-find (10-20 asynchronous path plan queries per frame, most of which will be short-distances) between different areas of the world, taking into account all of the following:

[/font] [font="Microsoft Sans Serif"][size="3"]the different types of areas that can be pathed-upon[/font] [font="Microsoft Sans Serif"][size="3"][/font][font="Microsoft Sans Serif"][size="3"]the movement capabilities of the agents[/font] [font="Microsoft Sans Serif"][size="3"]the widths of the agents[/font] [font="Microsoft Sans Serif"][size="3"]the allowed movement types within various parts of the world[/font] [font="Microsoft Sans Serif"][size="3"]portals[/font] [font="Microsoft Sans Serif"][size="3"]boundaries between different navigation data structures (lots vs. world vs. routable objects, etc)[/font][font="Microsoft Sans Serif"][size="3"]
2) Can very quickly handle synchronous queries that just ask whether or not a path exists between 2 points

3) Can handle relatively infrequent large updates to the world abstraction layer, but frequent small, local updates (i.e. objects moving within the world happens frequently and their footprints in the data must be updated, but large changes to lots will also happen (much less frequently) and will be allowed more time to
update if necessary. In other words, the pathfinding world data structures must scale from small, frequent changes to large, infrequent changes. Note that such changes will also be asynchronous and may affect current path plans in progress. Limiting the re-plans from this would be ideal.

4) Path plan queries must be able to account for changes in status of portals, lots, and/or routable objects for specific agents (i.e. portal 3 is locked for this path-find for this agent). These status changes will be sent by the caller as part of the path plan query. In addition, the caller will also specify the minimum width for the agent for this particular path-plan.

5) The results of the path plan must return a list of points for the path along with a set of points describing a corridor boundary to either side of the path that
describes the routable area around the center points of the path. The agent and the avoidance system will thus have enough information to freely move around the center of the path without doing a lot of expensive line-of-sights tests or replans.

6) The path planner will always return a path if one exists, but if one does NOT exist, then it will return a path that gets it as close as possible to the goal point.

7) Path planner must be able to account for local-space path-planning. For example, it must be able to return a valid path on a routable object that is moving within the world.
[/font][font="Microsoft Sans Serif"][size="3"]
[font="Microsoft Sans Serif"] [/font]
[font="Microsoft Sans Serif"] [/font]In my humble opinion, this is actually a very daunting list of requirements for a path planner! I've always been happy when given a difficult problem, however, so I started doing some research and lots of thinking.[/font]

[font="Microsoft Sans Serif"][size="5"]Part 3: Solution 1[/font]

[font="Microsoft Sans Serif"][size="3"] The first solution to this problem borrows heavily from the work my colleague and I did on a previous game's path planner. To start off, I realized that the world is too large for efficient planning using one big navmesh/grid/graph. A typical world in that game, for example, had well over 50,000 search nodes (which made A* go very, very slow) and the plans I've seen for this game's maps are at least that big. Thus, like the previous game, we'll start with an HPA*-based architecture (described in "Hierarchical Path Planning for Multi-size Agents in Heterogeneous Environments" at [/font][font="Microsoft Sans Serif"][size="3"][color="#0000ff"]http://harablog.files.wordpress.com/2009/01/haa.pdf[/color][/font][font="Microsoft Sans Serif"][size="3"]).[/font]

[font="Microsoft Sans Serif"][size="3"] To solve some known problems we ran into, we'll use navmeshes for all the layers and connect them where appropriate via portal nodes. The navmeshes will be composed of convex polygons and we'll strive to avoid long, thin polygons whenever possible when creating the Navmesh. The good news is, we already have code to create such a navmesh given our terrain and a quadtree with footprint boundaries for objects and other obstacles. It uses the GLU Tesselator and it's very fast - fast enough to use in real-time for relatively small meshes. The only problem with the existing code is that it can only generate the navmesh from scratch. Effort will be needed to allow it to update an existing navmesh to accommodate a small localized change. I'm assuming (for now) that this will be possible, even if it's a non-trivial task.[/font]

[font="Microsoft Sans Serif"][size="3"] To allow for quick queries on whether a path is possible or not, when we create the navmesh, we'll perform flood fills on the polygons and mark all connected areas with connection group indices. That way, to tell if a path exists is just a quick query to find the start and goal polygons, check their connection group indices and if they're not the same, then no path is possible.[/font]

[font="Microsoft Sans Serif"][size="3"] At the top layer of the hierarchy will be the world navmesh. Below that will be navmeshes that are embedded in it (such as lots or routable objects). The borders were a large problem in our previous game and I suspect still will be with this solution, but I have a few tricks to use some heuristics that I think will minimize this problem now. To the world mesh, a lot or routable object will simply be a polygon with edge costs based somewhat loosely on the structure of the interior of the routable area. For example, a "cluttered" lot might have a higher cost to enter than a completely clear lot. This is a non-trivial problem, however, and I expect that a fair amount of work will be needed to deal with the problems the borders between hierarchy layers inevitably introduces. Nonetheless, it IS a solvable problem.[/font]

[font="Microsoft Sans Serif"][size="3"] One optimization that is a big help for this problem is to add "preferred" entry points to the lots and routable object meshes. We didn't have those in our previous game and thus had to decide (by some complex heuristics based on the front door and mailbox positions on a lot) where the best entry points for a lot were. Mostly, this worked, but sometimes it failed
and caused some wonky paths. Having some pre-defined entry points would greatly help the path planner deal with the hierarchy-boundary problem, so we'll specify in the design that these will be needed for lots and routable objects as part of their navigation info. Users can then decide where to best enter their lot and designers can decide ahead of time where to enter/exit routable objects and we'll speed up the path planner by getting rid of the step to decide best entry points.[/font]

[font="Microsoft Sans Serif"][size="3"] Finally, the planner will keep an octree of all the navmeshes in the world so that we can quickly determine which navmesh any 3D point in the world belongs to. Note that this does introduce a restriction that no two navmeshes can occupy the same space in world coordinates. After talking with the designers though, this is fine.[/font]

[font="Microsoft Sans Serif"][size="3"] To query the path planner, the start and goal are provided along with any context info. The following algorithm is then followed:

[/font]
[font="Microsoft Sans Serif"][size="3"]1) Find polygons for start and goal point (along with which navmesh contains them).

2) Do "trivial" checks:[/font][font="Microsoft Sans Serif"][size="3"]

[/font] [font="Microsoft Sans Serif"][size="3"]If start and goal are in same polygon, return a straight-line path[/font] [font="Microsoft Sans Serif"][size="3"]If goal is invalid, return an error[/font] [font="Microsoft Sans Serif"][size="3"]Check to see if a path exists by checking connection groups. If not, then find new goal point in start point's connection group that is closest to the goal point (this is[/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"] [/font][/font][/font][/font][font="Microsoft Sans Serif"][size="3"]an interesting problem in itself and one I might go into in a future devlog entry).[/font][font="Microsoft Sans Serif"][size="3"] [/font][font="Microsoft Sans Serif"][size="3"]Alternately, we could save some state information during the A* search (in a later[/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"] [/font][/font][/font][/font][font="Microsoft Sans Serif"][size="3"]step) and find the closest goal point based on the nodes that A* explored near the[/font][font="Microsoft Sans Serif"][size="3"] [font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"]actual goal.[/font][/font][/font][/font][/font][font="Microsoft Sans Serif"][size="3"]
[/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][size="3"]
3) Update navmesh data structures with temporary restrictions from path context (make costs infinite for edges of locked portals, lots, and objects)[/font][/font][/font][/font]If both start and goal are in the same navmesh, then do an A* search on that navmesh[font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][size="3"]

4) If start and goal are on different navmeshes, do an A* search on the navmesh that is in the highest layer. If they are both in the same layer (i.e. lot-to-lot path planning), then do a path find in the layer above them[/font][/font][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][size="3"]

5) Go through each node in this initial path and find the nodes that correspond to entry points, lower-layer navmesh points, and exit points (always in that order, with the exit point being optional if the lower-layer navmesh point is at the end of the path (and the same logic for the start point and initial entry point). Note that because we have preferred entry/exit points for our lower-layer navmeshes, we can skip the step that was required in our previous game to find the "best" entry/exit points before running the lower-layer search as well as the code that changed the higher-layer path to use the modified start/exit points instead.[/font][/font][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][size="3"]

6) For all other points, find the widths around them that are clear so that we can return the corridor around the path. Interestingly, this turned out to be a non-trivial problem when I looked into how to do this, but that research is also how I ended up finding the link that led me to Solution 2[/font][/font][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][size="3"]

7) For each set of special points, perform an A* search on the navmesh that corresponds to that higher-layer point using the entry and exit points as the start and goal points[/font][/font][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][size="3"]

8) Repeat steps 5 - 7 recursively for lower-layer navmeshes until all special nodes are filled in with paths at the top layer[/font][/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"]

9) S[/font][font="Microsoft Sans Serif"]mooth the path, fill in elevations as needed, etc.[/font][/font][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][size="3"]

10) Restore default edge costs of nodes affected by step 3[/font][/font][font="Microsoft Sans Serif"][font="Microsoft Sans Serif"][size="3"]

11) Return the results[/font][/font]

[size="3"][font="Microsoft Sans Serif"][size="2"] There's likely some steps that I'm missing as I'm doing this from memory, but I think that's the gist of how solution 1 would work. It's basically a generalization of how we did path planning for our previous game using navmeshes instead of grids and waypoint graphs with some improvements and optimizations.[/font]
[font="Microsoft Sans Serif"][size="3"]
[/font][font="Microsoft Sans Serif"][size="3"]How do we handle navigation on navmeshes that are moving around? Well, the answer is deceptively simple - as part of the return values for each path point, we return a pointer to the navmesh it belongs to. The navmesh itself can be queried by the animation/movement system at each step to see what the current offset is (and this can be done recursively so that you can navigate on a navmesh that is moving within another navmesh that is moving within....well, ad nauseum. Just add all the offsets, like animation does with bone offsets). There are a couple of problems with this I can think of, and I suspect there's a few I haven't thought of as well, but I believe they're solvable, so I'm not going to worry too much about it right now.[/font]

[font="Microsoft Sans Serif"][size="3"] Note that handling such things as allowed movement types and agent width restrictions would be handled at the A* level. Handling movement types is relatively easy (I think) by just checking against valid movement types allowed by each edge (set during navmesh creation), but width restrictions may not be. I know it's possible without being forced to use different navmeshes for each agent size as I know other games have done it, but I'll need to do more research to figure out details. Again, though, I believe this to be a solvable problem, so for now, I'm ignoring it in the interests of getting a high-level design done in a timely manner.[/font]

[font="Microsoft Sans Serif"][size="3"] So, that's solution 1. It's sketchy in parts and there's too much hand-waving in other parts for me to feel comfortable with it as a recommended architecture, so I would definitely need to do more research and some prototyping to flesh things out more...which was exactly what I was doing when I ran across solution 2...
[/font]
[font="Microsoft Sans Serif"][size="5"]
Part 4: Solution 2[/font]

[font="Microsoft Sans Serif"][size="3"] While doing some research for solution 1 (namely, figuring out how to determine the path corridor points), I stumbed across a thesis by Douglas Jon Demyen called "Efficient Triangulation-based Pathfinding" ([/font][font="Microsoft Sans Serif"][size="3"]http://skatgame.net/mburo/ps/thesis_demyen_2006.pdf[/font][font="Microsoft Sans Serif"][size="3"]). It's a hefty paper (141 pages) and it took me a couple days to read and fully grok it, but it's worth it. The way he does path finding is pretty brilliant, in my opinion, and drastically cuts down the number of nodes that need to be searched. I'm honestly surprised that I haven't heard more about this considering that it was published in 2007.[/font][font="Microsoft Sans Serif"][size="3"]

[/font][font="Microsoft Sans Serif"][size="3"] For solution 2, the world would be structured somewhat like solution 1 except I'm seriously debating whether a hierarchy is needed. At this point, I'm leaning towards no and that of course would solve the problems that are introduced by a hierarchy. However, before I definitely answer that question, I really need to prototype this system and see how well it performs on a large navmesh.[/font][font="Microsoft Sans Serif"][size="3"]

[/font][font="Microsoft Sans Serif"][size="3"] The three benefits to this system compared to solution 1 are:
[/font][font="Microsoft Sans Serif"][size="3"]
1) Because it uses a Constrained Delauney Triangulation method, there are known methods to quickly do small localized updates to the navmesh[/font][font="Microsoft Sans Serif"][size="3"]

2) Despite using triangles instead of full-fledged n-sided convex polygons, there are, in general, far fewer nodes to search in a typical path-find query. The reason for this is because the method reduces the search down to just the major decision points on a path and progressively fills out the path with almost pre-set path-finds on a smaller and smaller scale. In a way, this is a built-in hierarchy of path-finding. In addition, it tends to quickly know where dead-ends are and completely ignore them without searching them at all. This by itself is a HUGE optimization over A*[/font][font="Microsoft Sans Serif"][size="3"]

3) Because of the smaller number of nodes searched (in general), it may very well eliminate the need for a hierarchical path-planner architecture. The hierarchy is already built into the navmesh! While I need more data to confirm that this will be faster and that it will handle meshes of the size we use without problem, I'm reasonably sure that it will handle larger meshes in general and could at least get rid of one or more layers of the hierarchy from solution 1.[/font][size="2"][font="Courier New"][font="Microsoft Sans Serif"][size="3"]
[/font]
[/font][size="3"][font="Microsoft Sans Serif"]The secret is how it constructs the navmesh in the first place by denoting each triangle/node as a level 0, 1, 2, or 3. Level 0 nodes are islands not connected to any other nodes. Level 1s are leaves of a tree that is essentially a dead-end. Level 2 nodes are roots of level 1 trees that connect the entire tree to other level 2 nodes or level 3 nodes (though there is a stricter definition to handle some special cases like loops). Level 3 nodes are the top layer and they are where all navigable edges of the triangle are unconstrained and joined to level 2 or level 3 nodes only. There's some special case handling for rings and such, but essentially assigning levels to each node does most of the work of path planning right off the bat by pre-finding the dead-ends, corridors, and major decision points in a map. It's pretty brilliant, I think, and much easier to understand intuitively (to me, anyway) than other path-finding data representations. It emulates the way our brains do path-finding much better than any other method I've ever seen.[/font]

[font="Microsoft Sans Serif"][size="3"]Another optimization that is built into the navmesh generation algorithm is finding choke points - since we know where the "corridors" are, we can pre-compute the narrowest point along that corridor and then use that as a quick search at the higher layers of the path-find to cut off whole corridors at a time if they are too narrow.

[/font][font="Microsoft Sans Serif"][size="3"]Of course, it's not all good as there are still a few problems and some requirements I'm not sure the architecture will currently handle (portals, for example) and I suspect that there will be some interesting problems when trying to stitch together the navmeshes. I'm also sure there are some problems I haven't thought of yet. And this is assuming I even understood what I read correctly (which, given that it was a 141 page thesis, is not guaranteed!). Nonetheless, I believe it warrants further investigation and prototyping before even trying to complete the research for solution 1.

[/font][font="Microsoft Sans Serif"][size="3"]Based on all this, these would be the general steps for a path-finding query, many of which are still the same as solution 1.
[/font][font="Microsoft Sans Serif"][size="3"]
1) [/font][font="Microsoft Sans Serif"][size="3"]Find triangles for start and goal point

2) Do "trivial" checks[/font][font="Microsoft Sans Serif"][size="3"]

[/font] [font="Microsoft Sans Serif"][size="3"]If start and goal are in same polygon, return a straight-line path[/font] [font="Microsoft Sans Serif"][size="3"]If goal is invalid, return an error[/font] [font="Microsoft Sans Serif"][size="3"]Check to see if a path exists by checking connection groups. If not, then find new goal point in start point's connection group that is closest to the goal point[/font][font="Microsoft Sans Serif"][size="3"] [/font][font="Microsoft Sans Serif"][size="3"](this will require some re-working of the original solution and could thus be a bit of a time sink). There may be some simple ways, based on the node levels that would provide this cheaper than the methods used for solution 1, though.[/font][font="Microsoft Sans Serif"][size="3"] [/font][font="Microsoft Sans Serif"][size="3"]More research needed[/font][font="Microsoft Sans Serif"][size="3"]
[/font][font="Microsoft Sans Serif"][size="3"]
3) Check for other special cases that need to be handled separately (see section 7.1 of Demyen's paper)

4) [/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"]Update navmesh data structures with temporary restrictions from path context (make costs infinite for edges of locked portals, lots, and objects)

5) [/font][/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"]Find the most abstract layer for the start and goal nodes, which will determine what layer the initial search is run in

6) [/font][/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"]Run TRA* (Triangulation Reduction A*, described in section 7.2 of Demyen's paper) on the layer determined in step 4. I don't fully understand this part yet, so I'm sure there's more to it than this, but that's what I'm working on researching now
[/font][/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"]
7) For all returned points, find the widths around them that are clear so that we can return the corridor around the path. The good news is that there's some built-in functionality for this already in the navmesh abstraction and an algorithm is presented in the paper to find this information. Hopefully, it will just be a matter of using the algorithm at the appropriate time
[/font][/font][font="Microsoft Sans Serif"][size="3"][font="Microsoft Sans Serif"]
8) Smooth the path, fill in elevations as needed, etc.[/font][/font][font="Microsoft Sans Serif"][size="3"]

9) Restore default edge costs of nodes affected by step 3[/font][font="Microsoft Sans Serif"][size="3"]

10) Return the results

[/font][font="Microsoft Sans Serif"][size="3"]So that's where I'm at right now in my search for a good path finding architecture for our requirements. It's all very rough and hand-wavy still, which tells me I have more research to do.[/font]

## It's Been a While...

I last wrote in this journal in 2006 and my life as a programmer has definitely taken some interesting turns. Since I started at EA, I've now worked on a lot of Sims games:

- Sims 2 Console (Engineer, worked on Create-a-Sim)
- Sims 2 Pets for Consoles (Engine Lead, mainly worked on optimization)
- Sims 2 Castaway for PS2 and Wii (Technical Director - worked on LOTS of stuff, but primarily Create-a-Sim, Back-end Database tools, and the in-game weather system)
- Moved to Stormfront Studios for a while (just before they shut down, unfortunately) and worked on Spiderwick Chronicles (Senior Engineer, worked on Load/Save mostly since I came onto the project so late)
- Decided I didn't like Stormfront, so moved back to EA (SF announced they were shutting down a week after I gave notice...ironic)
- Worked on Sims 3 (Senior Engineer, worked on overall game optimization and then spent the rest of the time on path finding)
- Sims 3 World Adventures (Senior Engineer, did a brief stint and worked on routing in basements and on bridges)
- Sims 3 Wii (Technical Director, weird project - mainly I talked to a lot of people in the the development company that actually did the work and ported a bunch of code from another internal project to their code-base to help them. Definitely not a role I think I was very good at or want to do again)
- Sims 3 3DS (Senior Engineer, came in right at the end of the project and helped do some bug fixing for a month or so. It's now been announced as a launch title (at least in Europe) for that platform, so I can publicly say that I think the game kicks ass. That dev team rocks)
- Current Project (Senior Engineer, unannounced project so I can't say anything about it, but what I'm working on is path finding and unlike on Sims 3 where we were forced to make some sub-optimal choices based on time (though, despite the severe roadblocks we faced, I think the final product was pretty good...and if you disagree, you should have seen what we had to start with and how long we had to fix it!), I have some freedom to do path finding from the ground up and do it right this time...or at least better )

So that's my gamedev career highlights up to the current point in time. I re-read some of the old entries in this journal and I have to laugh about how nervous I was about interviewing at EA originally. I'm much more relaxed and confident now - having a couple games under my belt helps

At any rate, I think I'm going to start writing in this journal again as I'm starting work on a very interesting problem and it will be fun to blog about it a bit and get some advice from the many smart people here on GameDev.

## What Did I Do?

Well, given the choices in my previous entry, I finally made a decision to go with option 2. I told my boss. Then the lead for the project in choice #1 convinced me to change my mind and so I decided to go for the smaller, current-gen project. I told my boss again. He now has whiplash.

I'm now a Technical Director (well, as soon as our current project finishes anyway - "very soon now") Yippee!

:)

## What would YOU do?

Given the following choices, what would YOU do?

1) Become a Technical Director on a small project for current-gen console technology. This would be an interesting game in itself with a very small team of people that you know and enjoy working with. The only real downside is that there's not a lot of technical challenge in it and it's working with essentially out-of-date technology so any skills gained are pretty useless going forward. Oh, and because its a smaller team with a shorter shipping schedule, it would likely mean some long hours next summer.

2) Become a Senior Engineer for the Next Big Game shipping on next-gen technology working on Terrain and/or AI (to me, these are really interesting fields and I would really enjoy either).

3) Quit and go find a job working on a game that you'd really love to work on. Neither of the above games are ones that I would really be passionate about (beyond the fact that I love programming games in general) and I KNOW that I could find a job doing a game I'd love...but this could very well mean moving out of state and it would also mean starting over at a new company, earning trust and proving myself all over again, etc. Ug.

*sigh* A couple of years ago, I would never have dreamed I'd have these choices. Life does seem to change at miraculous speed sometimes.

## GDC 2006

Well, looks like I'm going to GDC this year after all. I didn't think I'd have money, but that seems to have changed. I won't have a Gigapass this year, but a Classic Pass is still just fine for me.

So much has changed since my last GDC - I feel like that was a different life.

I'm definitely looking forward to GDC this year. Unlike last year, I have no agenda, nothing I'm looking to achieve. I just want to go to interesting panels and lectures, meet people and shoot the sh*t. Oh and talk about purple splines again, of course.

## Layoffs Suck

I hate layoffs. Just in general. Even when you "survive", it's suddenly not such a fun place to work any more.

I've been through far too many of them it seems - comes from working in the computer industry for so long I suppose. I understand why they happen. I even (sort of) understand the rationale for "springing" it on people en masse with no warning and no time to prepare, but it's still just unpleasant all around.

The good news, I suppose, is that the game industry seems to be in a hiring mood in general. Or at least it seems to be based on how many recruiter calls I (and others) seem to get these days. At least the people leaving should pretty easily find more jobs.

But still.

## It's been an Interesting Trip

I was re-reading old journal entries tonight and I noticed a couple things:

1) I don't update much any more.
2) My life has changed a LOT in the last couple of years.

I don't update much any more not because I don't have anything to talk about. I have more geekery in my head than ever before it seems. But all my geekery these days is for work and I work for a large company. Large companies like secrecy and they have lawyers.

I think that's really my only real regret about coming here. I miss being able to talk about programming freely. It's my passion and I feel so isolated when I do elegant code (or stupid code for that matter) and can't talk about it. I can't post code samples. I can't post screenshots. Well, not of the stuff from work anyway (my own stuff, sure, but I don't seem to be making a lot of time these days to work on my own projects).

I wrote up a post-mortem about the last project. In it I talked about some of the history of my part of the project, some funny stories from the project, and some general ramblings about work. I also had screenshots from the dev cycle (basically a series of snapshots that showed the metamorphosis from comically/tragically funny to production-quality.

Being the cautious person I am, I decided to get it cleared through my boss first since many companies have a nasty tendency to fire people over seemingly innocuous journal entries that lawyers think reveal some secret or other. Well, of course, it got sent on to legal and all of a sudden I was being asked to fill out about 10 pages of forms.

So not worth it. And thus ended that journal entry, stillborn.

But I guess that's the price I pay for working in a game company. If that's the worst thing I have to deal with, I'll be content. But alas, it does make it hard to think of worthwhile journal entries. Talking about the rest of my life (what little there is of it) bores everyone to tears, I suspect (including me).

As for the second thing I noticed - the changes in my life over the last couple of years - I was amazed at the transformation.

For years, most of my adult life in fact, I wanted to program games. I'd say that, and I'd whine about how no one would hire me. But I wouldn't actually do what I needed to in order to get hired. I wouldn't take the time to learn the code, nor do enough projects to get practice at it. I'd just feel terribly frustrated and wonder why no one handed me my heart's desire just because I asked for it.

And then, out of the blue, I get an interview with Turbine in October 2003. I felt real hope for the first time in years that I might actually be able to follow my dreams. The interviews went well for a long while and they eventually flew me to Boston for a full set of in-person interviews. Even better, it was for working on Middle Earth Online. I can't imagine many other games I'd rather work on, honestly, given my passion for Tolkien and fantasy gaming, MMOs, RPGs, etc. It felt too good to be true.

Well, of course, it was. They ended up not hiring me. The funny thing was, I don't think it was because I lacked in technical ability. I did well on the tech parts of the interview - which still amazes me because I look back on how little I really knew about game coding back then and I... well, I laugh.

Not getting hired was the catalyst for a midlife crisis, I think. I had had a real taste of hope. For a brief time, I'd felt more alive than I ever had when I thought I might actually be able to work on a game like that. Somehow, unlike previous disappointments, I was able to channel the massive depression from that rejection into something useful.

I spent the next year or so tinkering around with game code. I absorbed massive amounts of knowledge from books, code libraries, forums, anything I could lay my hands on. I dove into driving problems - terrain generation, permutations, 3D math, etc. I tore apart and wrote rendering engines. I gave up games and much of my social life. I had never felt such determination or had such discipline before.

At any rate, in the summer of 2004, my wife saw a blurb in the University of Washington about a game certificate program - a year long course in game programming. By that point, I was starting to feel like I was spinning my wheels a bit. I knew enough to know I didn't know much and that I needed mentoring and people to bounce questions off of. So, I figured out how to pay for the course (thanks Dad!) and enrolled.

October 2004 was the beginning of a year of real transformation - because of that class. I became obsessed with the class, learning everything I could. I not only did the assignments, but wrote a complex game engine from the ground up. I literally ate, drank, and slept game code for the next six months. I would spend every waking moment either working on my day job or working on my game code. And I was in heaven doing it.

Of course, there was a price to pay, though. I realized how much I was disliking my day job and I just found it harder and harder to muster the discipline to work at it. They noticed, wanted to help me and tried their damndest to compromise. But I just couldn't put my heart and soul into it anymore. Or much of my brain. All I wanted to do was program games. What remained of my social life went by the wayside. I started seeing my family less and less.

Six months into the class, I realized I couldn't continue like that. I was wearing myself out, and not seeing my family was not good for any of us. So I decided to back off somewhat - concentrate more on work, see my family more, and only do the minimum for the assignments for a while.

Literally days after I'd made that decision, EA emails me and within a month, I had a job offer to work on the Sims as a programmer and enough money so that I didn't have to automatically turn it down because I couldn't afford to take the job.

But the job was in California and for various reasons, would require me to move there by myself for up to a year. I wanted to finish the game programming course, I wanted to fulfill agreements with my current job and stay to help finish a project I was relatively critical for, and I definitely didn't want to move out on my own.

But this was the opportunity I'd been waiting for and had worked so hard for years to get. There was no guarantee I'd get other offers in the Seattle area, though it was seeming likely. The game, while not my favorite genre, had interesting technology and would be a great project to work on. Most importantly, it would get my foot in the door, be that big break that I needed to get in the industry and prove (to myself more than anything!) that I could indeed do this.

So I accepted the offer, moved to California, got a little studio apartment and dove into the project with a will and a passion that surprised even me. Living on my own, I had no reason to go home at night and no real desire to, so I spent pretty much all my waking hours here. Not exactly healthy, especially since I'd been already doing a similar schedule for the six months previous.

Interestingly, I felt closer to my family in some ways. I flew home every other weekend and the time I spent at home was real quality time. I wasn't constantly thinking about what I should be doing to fill my spare time with code so I could get a gaming job. I was able to really relax during my weekends off - the first time really in years I'd been able to do that I think.

And when I wasn't in Seattle, I was at work, pouring my heart and soul into a game, absorbing code, learning the engine architecture, learning to program on consoles instead of PCs, and generally having the time of my life.

And then, one day, the project ended. We had a release candidate and no more code changes were being accepted. And then it passed internal testing, then external testing, and finally went gold.

It was hard to come down off that mental mind-set - buried in crunch mode. I felt lost for a while again. But then I was basically told "take some time off". So I did and I flew home for a couple weeks.

I immediately got sick for a week, of course, hacking up a lung, etc. A year of stress (even good stress) will do that to you. My body rebelled and I let it, finally. But I also completely relaxed. I played games again. I worked on a project of my own, just because it was fun. I spent time with my family and had real conversations with my son. I visited friends.

And now, I'm back at work, starting pre-production for our next project. After an initial day or so of confusion where I got to know and grok my new bosses (and vice versa) and figure out what I'd like to be doing on the project, I'm now figuring out tasks and diving into them with gusto. Despite initial confusion, it's clear that I do indeed have some say in my destiny here, which is extremely important to me. It makes a huge difference being asked to do something instead of being told.

So, life is back to a new "normal" for me, I think. After two years of pretty intense change, I think I can finally relax a bit, settle into my own skin, start enjoying my life with less stress again, and really enjoy my new career, because it's what I've wanted for most of my life.

Oh, and go home in the evenings. =)

And impatiently wait for next May, when my family can move down with me.

## From Under My Rock

Yes, I'm still alive.

Really.

The last few months have been some of the most intense (and enjoyable!) of my life. I've dived into a new (to me) codebase. I've finished my first shipping game product. I've made a good impression. I've made some new friends. I've lived completely on my own for the first time since I was 18. I've done my own laundry at least once!

All that and more, in fact.

I've learned that most of my preconceived notions about working in the game industry were..dead on accurate. Some were not, but for the most part, there was very little that I didn't expect. It was a lot of work, but I enjoyed (almost) all of it. The code was nothing magical, it was just code. There was nothing I couldn't understand, given a little study. The people I worked with were very intelligent, but I didn't feel intellectually dwarfed (most of the time =) ). I was thrown into a fire, but my firefighting skills were up to the task.

In short, I've found my niche in life and I'm happy to be here.

I'm also glad that I have some time off to recover and relax. =)

I'm coming to Seattle this weekend, then going to some classes the week after that, then coming to Seattle again for another week (possibly 2) after that. The rest of October and November will be relatively peaceful, no crunch time at all. I'll take some more classes, do some prototyping, write some post-mortems, and figure out how to accomplish some new tasks on our next game. Oh, and maybe write a few more journal entries, since they've been so nonexistent for a while. And FINALLY, I'll have time to really read SimmerD's amazing journal entries. Some excellent stuff there that I really want to take time to digest.

In a few hours I'll get to see my family again after a very-long month of working, and I'm really looking forward to that. So, for now, I'm off. Hope everyone is doing well.

## Sleep?

I think I'll sleep...now...

*thump*

Almost there...

So close!

## Hot Coffee and GTA

I think this pretty much sums up my opinion on the GTA thing

*shakes head and wanders away*

## Some previews and screenshots!

So, EA invited some press folks recently to show off some games. The game I'm working on, Sims 2 Console, has been getting really good reviews (with good reason, honestly - it's going to be a very good game, imo!). Now that some screenshots and reviews are public I can point to some public URLs.

Sims 2 Console Preview from 1up
Gamespot preview
Screenshots (All of the latest ones show what I've been working on in some ways - rendering the Sims themselves!)
Sims in the hot tub (One of my many tasks was the costume-changing code =) )

Obviously, I'm not the only person who's had a hand in rendering the Sims - all the artists, modelers, animators, etc have done a fantastic job and the sheer amount and quality of content is amazing. In addition, I'm only part of a small team of programmers responsible for Create-a-Sim, Sim rendering, etc. I just happen to have spent a lot of my time here doing the texture compositing, costume-changes, and general rendering of the Sims.

Anyway, just thought I should share since we're getting lots of good reviews so far and that makes me all glowy-happy.

my $s = shift; my @a1 = @{ @_[0] }; my @a2 = @{ @_[1] }; } foo($n, $m, \@a1, \@a2 ); sub foo ($$**) { local($n, $s, *a1, *a2 ) = @_; } And there's even more ways to do this as well, but I'm not including them all for brevity - I just wanted to illustrate my point. Ultimately, this flexibility in syntax is both a good and a bad thing - it makes the language very powerful and flexible, but it also makes it virtually unreadable at times and means that everyone is going to get used to doing things in different ways - making other people's Perl code much harder to "translate". Anyway, there really isn't a lot of point to this entry except to say that I love Perl...and I hate it. This came up, of course, because I've been doing a few "simple" scripts in Perl lately for work. As always happens, the "simple" job turns into a massive behemoth of a job and the scripts to handle it get convoluted, loaded with special-case handlers, etc. Perl allowed me to do some very elegant solutions, but everyone else who's looked at the code has just boggled because it's...well, Perl, and they didn't know Perl could do many of the things I did with it. The gist: code reviews of Perl are a bitch =) ## Tired but Happy Wow, I can't believe how busy I am lately! We're getting ready for an internal deadline and the whole team is working furiously, including me. It's really exciting being part of a team like this - like a well-oiled machine running at top performance. I haven't been a part of something like this since the beginning of RealArcade. It's a wonderful feeling! Of course, I've been working pretty hard lately. It's a damn good thing I enjoy this job, or I'd be hating life right now. I can honestly say, though, that I'm doing it because I'm a perfectionist. I'm putting a lot of pride into my work and I want to put out the best damn product I'm capable of. When this game comes out, these Sims are going to look incredible! (Hell, they already DO!) It's funny, actually. I can understand some of the bad reports I read about EA before I came here. I can understand why people would feel overworked, underappreciated, etc. If I wasn't absolutely having the time of my life and pouring my heart and soul into this work, I might feel overworked too. All I can say is that it's all about where you are in life. The way I look at it is that it's a tough industry - you either love the work and WANT to devote your heart and soul to it, or it's probably not the right industry for you. I realize I'll probably incite a few arguments with that last statement, so let me clarify a bit. I do believe that it's possible to still maintain a balance in life while devoting your heart and soul to a project. "Crunch" time is NOT all the time. We have crunch time for very logical reasons caused by external deadlines that cannot be changed ("Oh, hey, we're a little behind in our code this year, would you mind postponing Christmas for a few days please?"). But when we don't have crunch time, we SHOULD take time off for the rest of life - see our families, go jet-skiing, play some games, get our oil changed, etc. Life doesn't have to be balanced ALL the time, but it does need to be balanced in the long run. A sacrifice of a few weeks here and there to put out a good product is very worthwhile, in my opinion. I will also put forth my opinion that crunch time is not caused just by bad scheduling. Crunch time is caused as much by engineers like me who want to tweak every detail to perfection as designers and managers who want every little feature possible to get into the game. Ultimately, we all want the same thing - to put out the best game we possibly can. Personally, I'm going to get a huge thrill seeing this game go on the store shelves and knowing that part of it is an example of my best work. That will make every extra hour I've put in here worth it for me. No regrets. But I also guarantee that when all is said and done, I'm going to be just as fanatical about spending quality time with my family. I firmly believe that it's possible to have sporadic crunch times and still have a high quality of life outside work - you just have to be vigilant about knowing when to stop tweaking and go home. Sometimes that's pretty hard for us obsessive/compulsive software engineer types. That whole "just one more turn and then I'll go to sleep!" (or in Everquest terms, "just one more bubble of xp, then I'll go to bed!") is a phenomenon that happens to many gamers. In our hearts, game developers are gamers too and just as susceptible to the problems. We have to be vigilant in taking care of ourselves and our own needs. What I do know for sure is that I'm being paid good money to do something that I've wanted to do all my life and would do on my own anyway. How could I not be grateful for that kind of opportunity or not want to give it my all? After many years of waking up in the morning and half the time dreading going in to work, I now wake up every morning cheerful. Having literally dreamed a solution to something, I can't wait to get in to work and code it. Every time I walk in to the lobby at work, I can't help grinning. That kind of satisfaction in life is so hard to achieve - I'm amazed that I've found it, and I have no problems working hard to make sure I continue to have it. OK, I'll get off my soapbox now. Hopefully I won't be tarred and feathered too badly for having an opinion that probably doesn't match that of many others. Realize that it's just that - my opinion. In other news, I had a really wonderful weekend when Karen came down and visited. We ended up shopping a lot and buying a bunch of stuff to get my new place all set up. It was good to get away from work for the weekend - I needed the break. This coming weekend, I'm flying home for a long weekend. I'm looking forward to seeing my son and my friends and taking another break. Besides, my bosses are giving me the evil eye and telling me to get the hell out of here for a few days, so I guess I can't argue with that =) ## Climbing out of my hole for a bit Well, it's been a while since I did a real entry. I've been...busy. Work is going reasonably well still. There were a few days last week when I was despairing that I would be able to do what was needed to finish the project - I didn't think the problems were solvable or at least implementable in time. But one of the major ones turned out to be a stupid bug on my part (though a very subtle one). Once that was solved, things got back on track and I'm now confident that the new Sim model and rendering system works as designed. Now I just have to work out the last few kinks and optimize the hell out of it. And after that, there's still a few projects on my task list as well. It's going to be a busy month ahead still. Despite being dead on my feet some days, I'm still having a great time. The work is very satisfying when I can wrangle the code into submission. Seeing a beautiful Sim on my screen for the first time was a moment I'll never forget =) Especially given how many "not so beautiful" Sims I'd seen before that =) My new place is interesting. It's a small studio apartment in downtown San Carlos - about 3 miles from work. The walls, it seems, are pretty damn thin, and my upstairs neighbors like to move furniture around at 2 am. And loud conversations. And have noisy sex. They walk like a herd of elephants. The cars going by in the morning wake me up as well. So I've not been doing so good on sleep this week. I'm getting more used to the ambient car noise and the stomping upstairs I can deal with. But still, I need to somehow figure out how to soundproof the place a bit. I'm not there much, but when I am, I really need sleep. Karen is coming down to visit this weekend and she's promised to drag me away from work to go shopping for the ten million little things I need. Things like soap, toilet paper, clock, nightstand, couch, microwave, toaster, dishes, silverware, cookware, etc. Somewhere in all that I'm looking forward to just seeing her and taking a couple days off. Sometime soon, I need to find a gaming group around here. I miss gaming and need something to do when I'm not at work..so I'll have a reason to not be at work sometimes =) Some balance in life is a good thing =) That's all for now. At some point I'll have time to write up more of the technical details of what I'm doing because it's some pretty neat stuff. Probably a post-mortem thing though, at this point. Ah well. ## Sims 2 Console - Best Simulation Game Nominee at E It's good to have positive feedback from the industry. The game I'm working on (Sims 2 Console) has gotten a nomination at E3 this year for best Simulation game from the Game Critics Awards: Best of E3 2005. This is great news and means that I'm working on a project with pretty high visibility. The full nominations are here, but the list in our category is: Nintendogs (Nintendo for Nintendo DS) Sims 2 (Electronic Arts for All Consoles) Spore (Maxis/Electronic Arts for PC) The Movies (Lionhead Studios/Activision for PC) Trauma Center: Under the Knife (Atlus Co. for Nintendo DS) Neat! ## Having a Great Time, Wish You Were Here! Today is the beginning of my third week at EA and I figure this is a good time to post a status update. I'm having the time of my life here. I still find it hard to believe they're paying me to do something this fun! My first week was mostly spent digging deep into the code base. It's large and complex and it takes a lot of digging to really understand it. In addition, because of it's age, it's been through a lot of hands, each with their own ideas of design and architecture, so the code is typical for that kind of history. Lots of little gotchas and false paths, lots of dead-end code paths, etc. Nonetheless, I'm finding that despite its warts, I'm really liking having a code base that allows me to really do some complex stuff without having to write all the infrastructure from the ground up. Most of the pieces I need are already there - it's just a matter of finding them =) Early last week I think I got past the initial "huh?" stage of dealing with a new codebase and started to contribute and really think about how to do the tasks I've been given. As is typical in many game projects, the initial design is relatively fluid and not only am I dealing with a set of tasks, but those tasks can change quite frequently. Luckily, I'm somewhat used to that, and once I realized that the project design was fluid, I adjusted my mindset and working habits to accomodate that. So much of last week was spent not really writing a lot of code (and what I did write, I ended up throwing out), but instead hammering out the design, and figuring out how to rearrange tasks given some new design changes. Turns out that my initial task of rendering, designing the data structures, and handling NPCs didn't make a lot of sense given some of the design priorities that weren't understood initially. Originally, the plan was to make the NPCs a certain way for optimization of data and rendering speed. But, for various reasons, that way wasn't flexible enough, and so the plan was scrapped and NPCs will now be done a different way. This actually made things a lot easier for the engineering, art, and design departments, but, of course, there's always tradeoffs, and we'll have to work hard to optimize them in different ways now. Also as part of my initial foray into the codebase to figure out how to render NPCs in the new way, I learned a lot about how this rendering system currently works. There were more tasks to use a new system to render PCs with various shaders, texture pre-compositing, etc that were assigned to another engineer originally. But since I now understood that section of code pretty intimately and he hadn't gotten to that task yet, we moved the task to my plate. So I'm currently working on texture-compositing, blending, and rendering of all Sims (NPCs and PCs), both in-game and in the Create-a-Sim portion of the game. This is pretty exciting stuff for me and I'm digging in with a vengeance. As of this morning, I have a first stab at doing all of that in-game, but haven't been able to test it yet. I fully expect it to blow up and require more work, but at least the major initial portion and design work is done. After this, I have lots more on my plate, but so far this task is taking far less time than I originally thought it would, so unless I've made some major mistakes in the logic of what I'm doing, I'm ahead of schedule right now. So far, this has been exactly the challenge that I needed in my life. I realized last year when I was buried deep in the coding for the game programming class that I had found my niche. Nothing I had ever done before in programming challenged me like that code, or held my interest so much. I was hoping that moving to a new codebase wouldn't take away that challenge and ability to do complex, interesting code. My worries were unfounded though, as I'm definitely feeling challenged here. I'm not feeling overwhelmed, though (most of the time anyway), so I'm achieving that fine balance between being challenged and being overwhelmed. I can certainly say that I could never have done something like this without writing my own engine and game code first, though. Everything I learned doing that I'm putting to good use here. In many ways, the shiny new-ness of the job is wearing off. It's feeling more like any other coding job in some ways, and that's a good thing. I'm not doing unfamiliar things or totally revamping my working habits or thought processes. Things are familiar enough that I understand enough to fit in and be quickly productive. But in the important ways, the subtle things that were making me so damn unhappy in my previous jobs are different. I'm working on something that I can really, truly enjoy. Instead of making things that are just useful, I'm making things that people will truly enjoy. That's important to me, and one of the major reasons I've wanted to change to a career in game development. The only thing that makes it not-so-good is that I miss my family. It's a catch-22 though. I want them here, but I also know that if they were, I wouldn't be doing so well in my job right now. If they were here, I'd feel guilty about not seeing them and that would just make us all unhappy. As it is, I can dedicate all the hours I want to doing well at my new career. Right now, that's critical, both to make a good impression (so far, so good!) and to really learning and becoming valuable. So far, I've been dedicating a lot of hours to this. I took this last Saturday off, and the Saturday before that, I didn't come in to work until 5pm or so. Other than that, though, I've been here pretty much everyday from 9-10am or so until around 1-2 am (that's approx. 176 hours since May 16th, including today). And before people start crying foul, EA is not at all asking me to do that. Certainly no one else on the team is pulling anywhere near those kinds of hours that I know of, and that's a wonderful thing. I would be extremely worried about my future here if others were doing these kinds of hours. We're not in crunch mode by any means yet, and I suspect we won't be for a couple more weeks yet. Even then, it's a relatively short expected crunch-time (a week or two?) and then an estimated week or two of normal work hours and then a couple more weeks of crunch. I'm actually impressed with how well this project is being managed and scheduled. They're really prioritizing scheduling to make sure that crunch-time is minimized. So much for the horror stories of EA, huh. Like the horror stories I always used to hear about Microsoft, everything depends greatly on what department you work in, and what projects you're working on. Things can go badly sometimes and when that happens, it gets stressful. Honestly, that's no different than the rest of the computer industry, though. Crunch time happens - again, just like the rest of the industry. But so far, I haven't seen any signs of the horrors that I heard (and read) about before coming here. Not having been through a full game development cycle here yet, I can't say with certainty how things are, but from everything I can gather so far, there's nothing to worry about here with respect to constant crunch time, etc. At least on this project, anyway. I can't speak for other teams - but I do know that when I go home at night, my car is one of the few left in the garage =) I'm flying up to Seattle next weekend and I'm really looking forward to it. My son is testing for his next belt in martial arts, we're having dinner with a couple friends, and I'll get a chance to see my family again. I know, for me, I do very well indeed on a schedule where I can intensely focus for a week or three, then have a few days of down-time completely away from code. Not working on any side projects right now helps a lot with that, too. I'm starting to feel a little run-down, and I can tell I'm going to be really ready to see them. Somehow during this, I also managed to find a place to live here. Currently I'm staying at a Residence Inn for a month (part of the relocation package). I've been looking at getting a room in a shared-living situation as well as getting my own place. The tradeoffs being that if I get a roommate, I can live cheaper and have a nicer place..but less privacy and I'd have to deal with roommates. Getting my own place is a little more expensive (mainly because of utilities and the fact I'll have to buy things like towels, plates, silverware, a bed, etc), but not terribly so. I would have all the privacy I wanted and could live on my own terms, clean up as I wanted to (or not), and not have to answer to anyone. In the end, I went with option 2 and found a nice little 1 bedroom apartment for$750/mo. The landlord is really great and it's less than a mile from work. It's a little far for a daily walk, but easily bikeable and it's a quiet location right near downtown San Carlos. I move in on June 15th. So, that's a load off my mind at least.

On the social side of life, well...ok, I don't have one right now. I've joined a mailing list and LJ community for some of my shared interests, and I suspect I'll eventually meet people. So far, though, I haven't had a lot of urge to get out and socialize - I'm enjoying my work too much =) I thought about going to Baycon this weekend, but on Saturday I just ended up doing errands and playing a game I checked out from the library here. I really just needed the downtime and going to Baycon would have been fun, but not relaxing.

I'm really enjoying Warhammer 40K: Dawn of War so far. While the gameplay is relatively standard for an RTS, there's a few new elements that add a fair bit of depth and the graphics are truly amazing. It's really, really FUN to just watch the Space Marines and Orks blow the crap out of each other. I suspect I'll get bored with it soon, like I usually do with RTS's after a short amount of time, but for now, I'm enjoying the game. I also bought Armies of Exigo from the company store (with some of my employee purchase points), but haven't played it yet. I remember reading about it, though, and I'm looking forward to playing it. In my copious spare time =)

I think that's about it to report about my life right now. Summary: enjoying the hell out of the job, spending all my time doing said job (on my own volition) because I'm enjoying it so much. Found a place to live. Missing my family and friends, but doing ok for now, especially since I wouldn't have time to see anyone even if they were here =) Feeling very, very fulfilled in life right now.

## Star Wars: Revenge of the Sith

Revenge of the Sith rocked. It wasn't quite up to Empire Strikes Back (my favorite), but I have to say I think this is my second favorite of the series.

George, you're redeemed.
May The Force Be With You. Always.

## The Laptop o' Doom

It's here! It's here! The Laptop o' Doom is here!

This thing...rocks.

And for some reason Alienware screwed up it seems - they gave me an EXTRA 3.4 Ghz P4 processor (so the machine is a dual-processor laptop). The hard drives are SCSI, too, instead of the SATA ones I ordered (currently configured for RAID-1 unfortunately). At least they screwed up in my favor (in a major way!)

Wow.

edit: Apparently, Alienware set it up correctly. The multi-processor is just Intel's Hyperthreading making one processor look like two to the OS, and the RAID controller makes the HDD's look like SCSI to the OS. So things are normal. But it still rocks =)

## Back to the Geeking

I can already tell how much I'm going to enjoy this job. My first three days have been a whirlwind of activity - getting the codebase set up on my machine, digging through the source trying to grok what it's doing, learning my way around the campus, getting to know my co-workers, and working on my first task. For the first time in many years, I feel content in my career. Now if only I didn't miss my family so much, life would be perfect.

Monday I spent mostly just getting things installed on my machine and learning how to use the tools. Yesterday and today I spent really digging into the codebase and grokking how it works. I still don't have a great handle on it, but I'm diving in-depth into a few pieces and have at least a shallow understanding of many more parts, including some of the underlying engine architecture. This has allowed me to actually start contributing on at least a basic design level for my first task. By tonight, I had worked it out enough and done sanity checks with other devs enough to ask for some art assets to test the new pieces, so this was a good step.

Tomorrow, I get to try my hand at a design document to put down in writing what I'm intending to implement. Would be nice if I knew what the boundaries were on what I can talk about here. I'll have to ask soon as I actually want to post some of the details (which are quite fascinating, imho) and gather feedback on the ideas.

So far, this really is a wonderful work environment for me. My manager rocks, my coworkers are very helpful and knowledgeable, my dev machine is a monster (a good thing), and my cube is about the best cube I could ask for (given that I have to have a cube rather than an office; it's a corporate culture thing - everyone here has cubes). I have a nice window cube overlooking the central lawn area and its a generally quiet, peaceful area of the building. Best of all, I have a really neat email address - maxis.com.

Anyway, I have my flight booked for the night of June 3rd to come back to Seattle for the weekend. I'll definitely be needing the break by then, I suspect. In the meantime, I'm having the time of my life digging into this job - it really is everything I'd hoped for in the game industry.

## Into the Fire!

It's been a hectic week! I've been essentially computer-less since late last week. Most of the time, it hasn't been too bad since I've also been taking a road trip with my son and enjoying the time with him. In fact, I have to say that I really enjoyed my trip and wouldn't have traded the time with Nicky for anything. He's getting so grown-up!

Also stopped by my dad's for a brief visit on Thursday. He's very happy for me. In fact, pretty much everyone seems to be happy for me. Including me.

Sunday afternoon, Nicky flew home. Apparently, he was on the same flight as a good friend of mine and we all sat around in the same terminal for 4 hours without noticing each other, waiting for the the flight. *sigh*

Sunday night was ... well, boring. My laptop isn't due to arrive till next Wednesday. But on the bright side, I've been getting a lot of reading done =)

My first day of work today was highly interesting. I'm definitely being thrown into the fire and my first deliverable deadline is in 2 weeks. Guess I better ramp up quickly, huh. In all honesty, though, I'm glad for the challenge. It feels so good to actually BE challenged at work again.

Of course, my first day of work was spent getting my machine set up - it's a beefy monster of a machine, too. After a few hours of software installs and learning the dev setup here, I finally got the codebase compiling. Of course, when I ran it, I got a blank green screen. Hmmm, guess I did something wrong. =)

Ah well, I have lots of code to study, so time to cut this short.

## New Laptop Ordered!

Since my current company owns my current laptop, I have to give it back when I leave. Fortunately, I have lots of vacation accrued that I never really used and that will get paid to me when I leave. So, with that, I can afford to buy a laptop of my own.

Since I'm also hoping to learn more Shader Model 3.0 stuff, I'm forced to go with a specific graphics card and thus my choices are limited. I shopped around, and strangely, Alienware is giving the best deal (strange because they're usually more expensive). Anyway, here's the laptop I ordered - I'm pretty pleased with the price for what it offers.

Alienware MJ-12m 7700

Case: Alienware(R) MJ12m 7700 Case with 17" WideSXGA+ 1680 x 1050 LCD Display with Built-in Camera - Xeno Grey
Motherboard: Intel(R) 915P Chipset Supporting PCI-Express
Processor: Intel(R) Pentium(R) 4 Processor 550 w/ HT Technology 3.4GHz 800MHz FSB 1MB Cache
Memory: 1GB Dual Channel DDR2 SO-DIMM at 533MHz - 2 x 512MB (2 slots unused)
Graphics Accelerator: Alienware(R) MJ12m 7700 NVIDIA Quadro FX Go 1400 with 256MB of DDR memory
Hard Drive: Dual Drive Configuration - Non RAID - 120GB (60GB x 2) 7200 RPM ATA100 - Hitachi
Primary Optical Drive: 8X Dual Layer DVD+/-RW / 24X CD-RW Combo w/Software
Floppy Drive: USB Floppy Drive
Modem: 56K Modem with V.92 Technology
Ethernet NIC: Integrated 10/1000Mb Gigabit Ethernet NIC
Wireless Network: Internal Wireless 802.11b/g miniPCI Card
Digital Audio Hardware: Intel(R) High-Definition Audio (24-bit, 192Khz) with 7.1 surround sound
Additional AC Adapter: Alienware(R) 7700 series 180 Watt Auto-switch AC Adapter
Free Alienware Mousepad: Free Alienware(R) Mousepad (isn't that special, I get a FREE mousepad!)

It should ship on Mon 9th, so I'll only be a few days without a computer, and that makes me happy.

No computer == suck.

## Details, details

Well, I'm getting down to the details of moving. Today I'm starting to pack up my office at RealArcade. I've gotten information about where I'll be staying in San Fransisco, I've done lots of brain dumps on people before I leave, and I'm basically just doing the details now. It's a strange feeling knowing that I'm really leaving. Hasn't truly hit me until this afternoon when I have some boxes packed and my office is looking emptier.

I have to really give EA credit - they're being really good to me, and they really seem as excited to have me as I am to go. They've been incredibly helpful with relocation and miscellaneous questions, even when I bug them several times a day. They've done their damndest to make this transition as painless as possible for me, and I'm extremely grateful.

I've also talked some with my new boss and gotten more details of the job, the work environment, etc. I figured since I had some spare time up here, I might as well ask what I can research and study up on to prepare for the job, so he sent me some information and has been really responsive to questions, etc. I think I'm going to really, really enjoy this job.

I went to my last class last week. I was really sad to say goodbye, actually. I've really enjoyed those classes and I know for a fact I never would have been as successful following my dreams if I hadn't taken that class. I always intended to stay through the last class and then start looking for a game industry position, but I guess life just likes to throw curve balls. No complaints, in this case, but I'm still sad to leave in the middle of the quarter.

This weekend, Karen and I will be flying down to San Fransisco to look around and get a lay of the land. Apparently, this is standard for relocating people, and we get a guided tour from the relocation agency and everything.

I'm also having a going-away party on the 10th, and I think it will end up being a blast. My theory of parties has always been to get lots of interesting people together and see what interesting things happen - and there'll be lots of interesting people there I think =)

Finally, I'll leave here on the 12th of May, drive down to San Fransisco with my son (visit my dad on the way, take the CA coast and see the redwoods, and generally just spend some good father-son bonding time with him). I'll arrive in SF on Saturday or Sunday and put my son on a plane home.

I'll be staying in Corporate housing for up to a month while I find a place to stay. I could find places from here, but I'd really rather not rush things and have a chance to really look around before jumping into a roommate situation.

Karen and Nicky will be staying in Seattle for a while - 6 months to a year, probably - getting our house ready to rent, getting prepared at her job to work remotely, helping take care of my sister's new baby, etc. Eventually, she and Nicky will move down with me and we'll look for a place to live (rent, probably...don't trust the CA real-estate market, honestly) while we rent out our house up here.

It'll be lonely for a while, but I'll be flying home twice a month or so for weekends and plus, I'll actually enjoy the chance to really just dive into the job for a while. Hopefully, I'll keep my sanity. Judging by the last six months, though, that won't be much of an issue (I think it's already gone). But I will miss them, so we'll see how long they end up staying in Seattle. Everything is fluid in life.

Once I get down there, I'll be working on Sims 2 console version on the Create-a-Sim portion. This is really exciting for me as it will really give me a chance to work on shaders and other stuff I want to learn lots more about.

So, things are all falling into place for major life changes. Still having a little bit of a hard time believing that it's happening, finally.

Life is good =)

## New Job

All the dominos have fallen into place, and it's official. I'll be starting my new job in mid-May. My last day at my current job will be Monday, May 9th. I'm extremely excited about the new job and the life change it involves. There's some drawbacks, of course, but overall, it's the opportunity of a lifetime and I'll deal just fine with the bad stuff.

I guess it's probably ok to say where the job is at this point also. I'll be working at Electronic Arts, on a Sims 2 project.

In some ways, my new situation is a scary thing. I'm being thrown into the fire to some degree and it'll be interesting to see whether I sink or swim. I'm honestly looking forward to the challenge, though, and the chance to really shine. I will say that after talking with them extensively during the interview about it, I am far more optimistic about my ability to handle the job, and I don't think their expectations are misguided. I have some work to do in coming up to speed still in the domain-knowledge of game programming, but overall, code is code, and I am an experienced developer. I've taken enough of the initial steps at this point to have a good foundation to know the right things to learn in order to improve.

Besides, if I can't adapt, I probably shouldn't be in the programming business anyway.

I want to thank gamedev.net for providing many of the resources that I have used thus far to learn the art of game programming. This site is absolutely invaluable, and I plan to continue using it =)