Archive for February, 2006

My first game job or The world’s most incompetent producer

Friday, February 24th, 2006

The very first job I got in the game industry was a 2 month contract at a small 20 or so person company in San Francisco. This company was hired by a major publisher to remake something in the ballpark of 8 arcade classics for the Palm OS and Windows CE. I had no idea how much a game programmer should make at the time so only asked for $16 an hour, prepared to fight not to go lower. The owner replied something to the effect of “Wow that’s really cheap, I’ll give you $20!” Oops. As it later turns out the guy sitting next to me with no degree was getting $60 an hour + $20 an hour for the recruiter. Double, oops. Anyway, the job was nice because the owner agreed to let me telecommute once classes started the next week, so I didn’t mind so much.

I started on a Tuesday… with nothing to do. Past the initial 20 minute briefing I and 5 other programmers just sat there until late Thursday. It wasn’t that we didn’t theoretically have anything to do – they just didn’t get around assigning the games to the 6 programmers yet. 18 hours lost * 6 programmers * 50 bucks an hour on average = $5,400 lost by a company so small just weeks before they moved out of an apartment complex. Worse, it wasn’t like it was a complex process assigning games to programmers either. No thought was even given to the process until our 10 minute meeting late Thursday, at which point arbitrary assignments were made. I wind up with a job to remake Robotron. Fortunately, they give me a design document and the original source to Robotron during the meeting, which I look at when I come in on Friday.

Fresh and eager to make my name in the industry, I come in on Friday and get to work. I look at the design document… or what I was told was a design document. Actually, it was a stack of PR sheets of bullet points. I look at the source code… It was a corrupted file with some recovered assembly for a machine no longer in use. I put that aside and go to work… or actually I try to go to work. But it’s time for a meeting. Then lunch, more meetings, waiting a few hours for the producer to give me useless documents, then installed software on the computers they bought, etc. At the end of the day I get 20 minutes of work done by downloading Mame and writing down some notes about Robotron. The day was a loss, the meetings were an utter waste of everyone’s time. It was just a way for the producer to feel important by having a bunch of people sit around listening to him talk about unrelated subjects.

Friday night I get home and start my REAL work day. I download the Robotron emulator, play for a while, and write up a design doc for my framework. Over the weekend I program the framework – to some extent I have a running game for the first level. I email a request for artwork and wait for a response.

Tuesday morning I get a call from the producer. “Hello Kevin, where are you?” Apparently, no one told the producer I’d be working at home. We argue about it. He thinks it’s not possible for a programmer to telecommute because face to face communication is necessary to get anything done. I tell him I’m not spending 3 hours a day on the road through San Francisco traffic when I can work perfectly well from home without disrupting my college schedule. I add that the owner already agreed I could telecommute, I couldn’t come in and go to college at the same time, and that was final.

I continue to work hard over the first week and achieve the first milestone, due in one month, in about 20 hours of work.

It’s time to integrate the real art. I sent yet another email to the producer for art (my last email was ignored). One week later he sends me a 20×20 bmp for ONE of the monsters. On top of that, the BMP has errors: the filename is wrong, it’s cropped wrong, and the palette order is wrong. I fix it myself.

This goes on over the two month project:

I email the producer a list of assets I need to achieve the milestone they give me.
The producer doesn’t bother reading the whole email and I get one asset a week later.
Another week goes by and I get an email from the producer asking why the other two assets are not in the game. I reply that they are, you just can’t see them because I don’t have the art I repeatedly asked for and was repeatedly ignored on. In one case I asked him for the same art 4 times in a row and didn’t get it. So when he emailed me wondering what’s up I cut and paste all 4 email requests along with the dates I sent them. If I were him I’d apologize and feel rather stupid about it, but somehow I don’t think he did.

On top of that, I wind up doing the artist’s jobs for them. The art that I do get invariably has errors – wrong palette order, wrong filename, wrong sizes, shifting tile centers, etc. The level design specifications I get are ambiguous and incomplete.

Some significant milestones:

Three weeks:
I come in and look around at the other programmer’s computers. What did they accomplish? Nothing! They are still working on frameworks, the same thing I accomplished the first weekend.

Four weeks:
I come in again and find out who the artist is supplying me the art. I was hoping I could explain things to him about what I need, since the producer obviously wasn’t cutting it. I look at the artist’s computer and HE ALREADY HAS ALL THE ART! I the artist had been creating original art for the game which is why it would take a week to get me a 20×20 bitmap. Nope, all the art was already there courtesy of the publisher in a giant BMP. All the artist had been doing was cutting and pasting out individual images and fucking up every possible step that could have gone wrong in the process. WTF? At that point I tell the producer “Look, just give me that BMP and I’ll make the images myself. I will have the game 100% done by the end of the week.” He didn’t agree to send me the BMP.

Five weeks:
They start getting late about sending me checks. I found out later this is because the producer wasn’t sending the checks on time. Of course I call every day for two weeks asking when the check would be sent, and was told every day “Today”. I eventually have to take the 3 hour drive there to get it in person.

Seven weeks (out of an eight week project):
Sounds still aren’t ready. I send three emails to the producer and the lead programmer that my contract ends in one week, so I either need the sounds or an interface to the sound wrapper so I can implement that before I stop working.

Eight weeks:
My emails are ignored. No sounds, no interface, my contract duration is over. My final email thanks them for the job, asks when my last check will finally arrive, and I tell the lead programmer where my sound interface is so he can add the sounds himself.

Nine weeks:
Out of the blue I get an email from the producer asking why the sounds weren’t done.

As it turns out, for this particular producer:
– He insisted on being the go-between between myself and the artist, rather than just let me get the stuff myself even if it means the project will take 4X longer.
– He can’t understand more than one topic per email. If I include more than one topic per email, all other topics get ignored. It took me a while to realize this but the end-result is certain milestones were late because he didn’t address issues I needed to proceed.
– The producer can’t understand even vaguely technical issues, such as a wrong palette order in the images. Rather than admit it, he ignores the emails no matter how many times I tell him. As a result, I had to spend a significant part of my time fixing silly art issues.
– The producer never did any actual work that I could determine.
– Because (in part) of the producer forcing everyone else to work at the office and be subjected to meetings, etc. everyone else took two months to get done what I got done in two weeks. I worked a total of 150 hours. Everyone else 320. My game was done in two weeks of work and six weeks of waiting for art. Some other people weren’t done in those two months, when I came in for the last time.

Recording ITunes

Wednesday, February 22nd, 2006

My wife said to me one of her friends was asking about “that site where you can get the free music.” So I told her about Magnatune, wiki, and some other places where you can do so. Obviously that wasn’t what her friend wanted though, which reminded me back in the mid-90’s about how I used to record the audio-out from my computer. It occured to me that there isn’t really any way that online radio can stop you from reading the audio-out from your sound card and recording it. So as a quick test I downloaded Audio Record Wizard and it worked…

Audio Record Wizard

Of course I only recorded a song I legally owned already, deleted it immediately, and am not condoning others doing this. As we all know, piracy is wrong.

Ubuntu seems alright

Sunday, February 12th, 2006

I downloaded the free version of VMWare server and installed Ubutnu onto it, figuring I’d end up deleting it 20 minutes later. As it turned out, Ubuntu is the least sucky version of Linux I’ve seen so far. I even connected to the internet without creating 4 partitions, making a make file, and recompiling the kernel from a console window!

It seems like Google has the right idea. If and when they make a desktop version of Linux based on Ubuntu I’ll buy it.

I do my best thinking when sleeping

Saturday, February 11th, 2006

For the last year, working on the AI, I was never bothered by the workplace enviroment (two people chatting next to me, the vacuum cleaners from the janitors, somebody opening the door) because I rarely had any significant problems to think about. However, now that I’m doing network programming, which sometimes requires deep thought to solve asynchronous problems, it’s a different issue. Sometimes I can’t solve a bug all morning, but solve it 30 seconds during my walk get lunch.

I’m a shitty driver sometimes because that’s one of the few times during the day when I’m alone and can really solve the deep problems to the point where I take a wrong turn on the way home… I use to solve math problems in my head on the way home from college that way.

I think the main reason why I’m so productive at home as compared to work is that I have a door I can close and in the early mornings nobody to distract me. For thought workers, not giving them a place to work with a door is like throwing away half their salary just so you can save a little money on office space.

Effective AI programming

Wednesday, February 8th, 2006

In game programming you need to keep learning to stay effective. When I finish a game, I reflect on what I’ve learned and consider my new skills to be more valuable than the pay I’ve earned (although that’s important too).

For my last two games, Getting Up and Star Wars Ep3, I worked on the AI. Although work on is sort of misleading, because all I really did was support users for the AI code that was already written. The existing AI code was pretty good – lots of code, lots of features, and most importantly anytime anyone else tried to add to it it was invariably worse than what was already there (and often duplicated an existing feature they just didn’t know about). So I didn’t much rewrite or extend it, and honestly there wasn’t that much to learn. In fact, a few months ago I would have said the only thing I learned is what a pain in the ass it is to maintain other people’s code who no longer work there.

On reflection though, I did learn a lesson. Because I’ve been dealing with AI actually since I started in the industry. We had the same AI programmer for every game from my first company, and the AI sucked equally bad for every game that company released. What this has demonstrated is the same thing that the AI code for GU and EP3 has demonstrated: that your AI is only as good as how high level you design it from the start.

In my first game, the design was at the level of pathfinding and movement. Subsequent attempts to add cover pretty much failed, because cover is a higher level concept that takes higher level design. I used to have a teacher that said “You can’t see the forest from the trees” and I never understood what he meant until I worked for a couple of years.

In GU and EP3, the design is at the level of combat and game mechanics, such as triggers, hide points, and gotos. Therefore, these features worked fairly well but there was no higher level planning such as group tactics or fear.

I think in order to have really good AI in a game, you need to design in high level tactics from the start, and fill in lower level concepts such as pathfinding later. Otherwise you will get bogged down in tweaking the existing code to try to compensate and never really succeed.

True convergence of games and movies

Tuesday, February 7th, 2006

I have a premonition that the convergence of games and movies is going to be more real than people think.

Consider these points:

  1. Budgets and graphical realism for games keep increasing.
  2. Hollywood is increasingly adverse to investment risks
  3. Game and movie tie-ins are increasing, with many major movies being released at the same time as the game.
  4. Computer animated movies are increasingly popular and make a lot of money

Right now it costs $30-$50 million for an AAA game and from $50 to $200 million for a movie. Lets say 10 years from now games are truly photorealistic and cost twice what they do now. What’s the next logical step?

Rather than make a game for $100 million and a movie for $100 million, make a movie using the game’s graphics engine The movie is in fact just the scripted portions of the game tied together.

Does this sound reasonable?

Genius or idiot?

Sunday, February 5th, 2006

About a year and a half ago, before I got my current job, I had been applying around the industry. While I don’t usually do so, I went through a recruiter and indirectly spoke to Flagship Studios. After they looked at my network library, the recruiter called back and said they didn’t want me because I had UDP experience instead of TCP experience. They wanted to use TCP for their game because WoW does so, and the founders originally came from Blizzard.

If you are familiar with game network programming, you are probably thinking how strange that is. It’s like saying you don’t want someone to drive your automatic because they usually drive a manual. If I wanted change RakNet to use TCP there wouldn’t be much more to it than changing SOCK_DGRAM to SOCK_STREAM, disabling the nagle algorithm, and bypassing my reliable communications layer. Of course RakNet would then suck, losing efficiency, speed, and some features but my point isn’t that but that there’s little substantial programmatical difference between the two THAT I KNOW OF.

And that’s the key point, one I’ve been wondering for a year and a half about. Is the guy who spoke to the recruiter a genius or an idiot?

Idiot:
This guy wrote a UDP network library and we want TCP experience.

Genius:
There are many complex lessons from TCP game programming that only come from experience, and only he and a select few (excluding myself) know what they are.

An idiot would think there is some huge difference when there isn’t one while a genius would know of some huge difference that nobody else does.

I can’t figure it out. What do you think?

Library packaging

Saturday, February 4th, 2006

Wow, it’s been since Oct. since I’ve updated? Time really flies.

So lately some Linux users have been going after me for including dependency libraries in the RakNet download, rather than telling them to go download it themselves after downloading RakNet. They make the argument that this is the only way to use up-to-date dependencies and that it also cuts down on the download size.

About a year ago I was trying to make a game using SDL. Since that’s a Linux oriented library, it had many dependencies, and some of those dependencies had dependencies. At one point I downloaded this library that had SIX different dependencies. Of those six libraries, how many do you think

A. Were still available for download?
B. Were still supported?
C. Worked with the library I was trying to use, as well as each other?

The answer is two. So like a dependency graph with a broken node, that ultimately affected my ability to use SDL and I had to find something else.

This is why I include all dependencies with RakNet. And with good cause: when I last went to upgrade speex, RakVoice no longer worked. I’m fixing that now, but in the meantime nobody would have been able to use RakVoice.

Just to drive the argument home, even if all dependent libraries were available and functional, who wants to spend the next 30 minutes downloading other libraries and figuring out where or how to unpackage or install them? When people download RakNet, they want to use RakNet, not necessarily Speex or zLib.