October 01, 2014

An open letter to Intel

I posted this letter through Intel's corporate responsibility page just now in support of GamaSutra and its editorial stance.

Hi Intel,

I've been a game developer for coming on 17 years, and spent all of that time developing both on and for Intel architectures. I was at LucasArts in the late 90s and early 00s, and we were often lucky to receive Intel development hardware directly from you. I've used your tools for years, including your optimizing compiler, which led the competition in terms of performance almost from its birth.

So it's with no small amount of sadness that I see you pulling your ad support for GamaSutra today. I imagine there's been some incoming email about recent editorial choices at the site.

GamaSutra, and it's long-associated print publication Game Developer (RIP), were the developer-focused materials that I could also rely on over much of my career. I've seen your sponsored articles there frequently over the years; often it would be the first or even only place where I'd see your products, since so few advertiser-supported sites focus exclusively on game development.

I believe that pulling your support over recent editorial choices is a mistake; I believe that you've largely been contacted by a group who are not made up of the site's audience. It's a shame to see you pull your advertising dollars in hostage to a virulent hate campaign orchestrated by a small number of people who use the Internet's anonymity as a shield.

I hope you'll reconsider. I visit GamaSutra frequently, and I think the editorial choices have always pursued inclusivity in game development. Indeed, I think that's why it has lasted as long as it has.


Brett Douville

Posted by Brett Douville at 07:46 PM | Comments (0)

September 06, 2014

My "extending the branch" Storify

Putting the link here of my discussion with someone upset over "GamerGate" in case someone comes to the blog looking for it.

Posted by Brett Douville at 06:29 AM | Comments (0)

September 05, 2014

On "GamerGate"

Caveat lector: I ramble.

The last few years in the culture surrounding video games have been really exciting ones for me, both in my career and as a player of games.

I started this blog back in 2005 to share my excitement about games, but also to look at other media and see what sorts of things they could achieve, and ask whether or not games were capable of eliciting the same sorts of responses. Not the simplistic "Can games make you cry?" of yesteryear¹, which I thought had already been definitely asked and answered; the right story done up the right way with interactive bits in the middle could trigger tears about as well as Hollywood could. I wanted to know whether games could investigate emotions more deeply, and in a way that only games could. And, as an adult² who had been playing games for more than twenty years at that point, I was looking for ways in which games were going to connect with a wider audience. Not a bigger audience, but a wider one.

Because in the late 90s there had been that terrible spate of school shootings³, right around the time I had joined the industry, and in the worst of them, id's DOOM had been targeted. Which was kind of startling, because I had taken a little time off from games in the late 80s and early 90s, and games like DOOM had brought me back, and had in fact made me look at games as a possible career. When Columbine happened and the industry and the hobby were targeted, I wrote a long letter to my family defending my choice of career. I explained that the medium excited me, that I believed that there was something fundamental there that made me believe that they were on the cusp of something great. I believed that as horrible as the shootings were, scapegoating video games was an easy way to circumvent other forms of social culpability4 through demonizing a little-understood hobby. And in fact, just a year or two prior, someone I worked with at LucasArts5 had testified before Congress about the industry's ability to police itself when it came to labeling violence in games, at a time when the ESRB was still quite young.

The greatness of the medium that I defended was still a little while to come.

I grew up at a time when nobody really knew what would stick with video games, and indeed, they headed straight towards a crash. I was lucky in that I was never really stigmatized for my enjoyment; my father, who wasn't someone who enjoyed the hobby long-term, had nonetheless introduced me to it through ADVENT, and my parents bought me an Apple ][+6 in the middle of the fifth grade at what must have been a humongous expense for them at the time. I had neighbors with an Atari, friends with Vectrex, TRS-80, IntelliVision, an Odyssey. I had friends with whom I played D&D every day at lunch at school, sometimes after school, and sometimes on weekends. And I started writing my first programs, many of them games; a program I wrote for a science fair project about aerodynamics won us a prize; I wrote my first 3D renderer (wireframe) in around 1986.

Around that time the hobby had gone into decline, and I had moved, and kind of drifted from games into other hobbies: music, running, my lifelong love of reading, film. The computer was always in my room but tended to get more time with writing up school reports and printing them out in dot matrix. At that time, a deep interest in games might have ostracized me, but I didn't have one and so it didn't.

Off to college, grad school, not tons of video game playing then but occasionally, if someone had a Genesis or whatever; we played a lot of Madden and Flashback, for a month once. I pulled an all-nighter playing Prince of Persia in a computer lab, and a friend and I beat Ultima 7. It was one hobby amongst many I had, and not dominant. But it was at this time that what I had known as a kid had blossomed into Industry, such that it could support a career, and ultimately I followed that dream. I've covered that elsewhere.

Anyway, back to where I started, forgive the ramblings. When I started the blog it was 2005, a time when something called "The New Games Journalism" was still somewhat new and its influence was beginning to be felt. I had just left a company where business concerns had largely forced out artistic ones, and rightly so to a degree, the games had gotten so expensive. The PS2 had been a juggernaut which had allowed, in its enormous ecosystem (but not *overly* complicated or expensive development) for a real variety of experiences, some of which I still treasure today; not quite as varied as the even cheaper to build games of the PS1, but still pretty varied. Towards the end of that cycle, in response to pressures of very real censorship, the industry had grown up a lot, become corporate, found a lot of money and a bigger audience.

And here came this new form of games criticism which sought to personalize the conversation around games, to find a way to try to express the ways in which games uniquely touched us. The Internet had meant that there was room to explore this form of criticism; had we been bound to print still, the time wouldn't have been right, the costs would have been too high. The Internet was democratizing; even then, though, it was hard to know how to pay people to do it. I started this blog more or less to try and explore those same sorts of ideas; my angle was to take other cultural forms and look at what they were doing, and ask whether we could elicit similar responses. I believed then, as I believe now, that we were fully capable of expressing the full range of human emotion, in our own way, that we could stand aside my other cultural favorites, literature and film, as tools for the exploration of just what it means to be human.

I wanted that wide an audience for games. I want that wide an audience for games.

Over the next few years there started to be visibility for games that showed it was possible to tackle deep subjects; Passage came along and in the space of five minutes of play surprised us enormously7, The Marriage sought to put everything in minimalist systems to express its core idea (and I wrote my own response about divorce in the same vein). They were just the tiniest glimpse of what was to come, of what we have today.

Today we've got Gone Home and Papers, Please and Dys4ia and Depression Quest and Sacrilege and Cart Life and The Novelist and a million others. I haven't had a lot to complain about in the blog over the last few years; the recent explosion in tools and distribution availability have meant that real artists have been able to emerge and use the language of interaction that we've been building up for years to try and do something new. The improvements in the technologies have meant that artists can play in the space and create and explore works that address ourselves as human beings, to do all the things I wanted games to do when I started out writing here in 2005, to do all the things I hoped they'd do back when I defended them in 1999 (against a family who was not attacking them).

And so I've largely abandoned the blog, posting only occasionally about what I'm playing or about something someone has asked about like the treadmill desk or whatever8. I'll probably keep doing that, as the mood strikes me or people ask about stuff; maybe I'll launch a more proper development blog to talk about the game I'm making. Games as a cultural medium have established the foothold they needed; they are undeniably a part of a wide cultural conversation, and they are drawing actually interesting criticism.

So, GamerGate, the ostensible subject of this post. For the most part, people aren't saying that your hobby is dead -- that's so obviously not true that it's silly to even say it. There is still plenty of money to be made putting out shooters and what-have-you, and as long as there is money to be made there will be corporations doing it. If you identify as a gamer, you have nothing to fear so long as you keep buying.

But some day you'll be getting a bit older and I can tell you, you'll get bored with what you're playing now, and if you want to keep playing, you'll be glad that there are other sorts of things to play. I'm probably not going to play Titanfall ever, nor Destiny; I've gotten to a point in my life where I've played that sort of thing to death and while I still indulge in that occasionally as a sort of nostalgia, it just doesn't engage me any more. I'm so thankful that games have grown up as I have. We've finally gotten to a point where I can go to games as a place where I might learn something about myself, as I have increasingly turned to literature and film to do alongside my career in games. This is a great place to be; it took comic books and television9 much longer to do it, and I think we have the easy availability of differing voices in criticism and creation to thank for that.

So please, please. Allow these other voices to be heard; stop shouting them down in defense of something that is not under any real threat.

These voices have their own audience, even if you are not their audience today. Some day you will be; having grown up a gamer and cast that aside as an identity, I'm grateful to them.

¹The answer was already 'yes,' by this time, and for quite a long time. The first tear I shed might have been over Floyd in Planetfall, and more recently I had been fairly overwhelmed by Final Fantasy IX's elegantly circular triumphant final scene.

²In 2005 I was in my 30s, and I'm now in my 40s.

³Plus ça change, plus c'est la même chose.

4At the risk of pissing off a more right-wing reader, how a teenager gets his hands on TEC-9s and carbines I'll never understand.

5This was Wayne Cline, who was the first production manager (proto-producer, though not as powerful) on Star Wars: Starfighter. Wayne and I had come up with the original story for that game, some of whose features would come to be a big part of it -- three main characters, one of them a space pirate and another a cadet in the Naboo Air Force. In our original version, Nym (as yet unnamed, just "Pirate Captain") had been raiding in the same sector and that's what brought him into conflict with the Trade Federation. Ah, good times. Haven't seen Wayne in over a decade. Hope he's well.

6When I would meet John Romero many years later, we'd talk about the books that were available for the 6502 instruction set and how terrible they were. It wasn't something I had thought about for years and was just a huge pleasure. What a nice guy.

7I once, during a difficult time for me emotionally, spent six months playing Passage every morning and writing about it afterwards. I'd use it as a memento mori, to prod myself to remember just how brief all of this is, what a ridiculously short time I have. So it'll always have a space in my heart.

8I do have a thing I'll hopefully post over the weekend that talks about one piece of the latest Feminist Frequency video.

9And it's worth noting: no one took away the superhero comic books. No one took away the sitcoms. Mass entertainment stays... but we end up with stuff for smaller audience, enriching material as a result of the growth.

Posted by Brett Douville at 07:47 AM | Comments (0)

July 22, 2014

How I deal with data, part one

A Maze of Stupid Little Languages, All Alike

Advance notice: Nothing here is terribly new or revolutionary. Someone out there may find it useful. This is the sort of stuff that often comes up in game development but that people rarely write about, at least, in my experience.

I'm in the process of designing and building a game with attention-management, simulation, and Sim elements. In it, the player will directly and indirectly affect the happiness of Little Computer People through decisions made in the attention management part of the game, backed by a richer simulation of an audience for that performance. That's all kind of hopelessly abstract, I realize, but it's kind of the level at which I'm comfortable discussing it in a public Internet forum at the moment. (I do discuss more specifics in person with people. So ask me when you see me.)

Lately¹ I've been taking my ugly, rough, hard-coded test data prototype to a series of data files that can help me more fully flesh out the game play and create content that is more reflective of how I expect the final game to actually work and feel, both in terms of quantity and quality. My intent is to have a "campaign" of fully authored data with a procedural approach for people who want to continue playing beyond that, and these articles address the hand-authored content specifically, though I expect the description of procedural stuff to follow along similar lines. After I feel like I have the data thing nailed down enough to build, balance, and play a few (again, super-ugly) levels that have the right feedback loops to the player, I'll be looking into the actual visuals that will support the final product (characters, environment, etc).

Anyway, because I'm a programmer, I tend to go straight to text for data. It's easy to manipulate (by hand if need be, which is where I'm starting from right now) and easy to read. In so doing, I tend to come up with very simple little context-specific languages to deal with my data. But for performance and sanity reasons, I work with binary when I'm actually loading this stuff into my game², mostly because I hate parsing stuff in C++. Granted, I could use a well-known format like JSON or what-have-you, but I haven't at that point really solved anything, I've just offloaded parsing the text into a library (with its own run-time performance concerns, usually having to do with memory allocation), and then I need to walk the built-up data structure to look for stuff, and handle failure conditions. Bleh. Instead, I prefer to build a custom format that can be directly mapped simply to data structures in memory, allowing for a single allocation to read in the file once, a little walking over that data to map structure pointers (typically by converting offsets to pointers). The data can be then deleted in a single deallocation later and the structure cleared out.

It's also worth noting that I could, at a later date, write tools that sit on top of that simple format, and I may well do so to support post-ship modding of the game or the Steam workshop (should I be on Steam), or whatever. For some of the data I expect to author, it'll be useful to be able to visualize the data in terms of frequency of certain occurrences, but I could certainly do that by writing additional simple tools that spit out different data (images, comma-delimited text files, whatever) from

I would almost certainly choose differently if I were working on data that I expected many people to have their hands in at any given time. At that point, I'd probably want a database of some kind and things like that. Solo development makes this sort of thing much easier. In this case, I'm designing development tools for myself -- a person who is super-comfortable with text files and actually can visualize stuff from text files pretty well in his head. Whenever you're developing, you should think first of the client for your tools. Also: if I worked against a database, later steps of this process would be largely the same, I just wouldn't be parsing the data in the same way.

Here's what my languages tend to look like, with some real text that I've moderately fudged to obscure actual subject matter (in other words, not a game about outlaws). Just to give the flavor. There are no lawyers, guns, or butter in my game. I may add butter. ;)

## Josie Wails
:littlecomputerperson JWails "Josie Wails"
:lcpshort JWails "Former outlaw, now reformed"
:lcplong JWails "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et"
:lcplong JWails " dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
:lcparrives JWails 3.3
:lcpskill JWails lawyers 16
:lcpskill JWails guns 32
:lcpskill JWails money 16
:lcpskill JWails butter -8
:lcpappears JWails initial
:lcpinitialHappy JWails 32
:lcpHappy JWails and gte ammunition .3 lte butter 0 3
:lcpHappy JWails gte ammunition .6 3
:lcparrives default 0.0

Stuff to note:

  • Simple command structure. Basically, every line is a command, and they all follow a pretty simple structure that adds a specific bit of data to a particular main container item. I declare the LCPs with friendly names (which will be displayed in-game) but then use identifiers from that point on to prevent the need for global search and replace later.

    This has some great benefits, in particular that I can separate out data however I like -- I might want to keep all the skills descriptions in one place so that I can see at a glance that I don't have anyone who has a positive "butter" skill or I might put all the descriptions in one place at the bottom since I tend to write them once and then not think about them again. If I were working with a format like JSON, my natural inclination would be to keep all the data for a particular LCP together in one place. (It would probably also be significantly more verbose.)

  • Minimal data per line. As I'm not going to ever ship this stuff, I just go ahead and put only one bit of data per line. It's all "this command tells you this about this data object".
  • No multi-line stuff. As you can see in the :lcplong command, it would sometimes be easier to deal with this stuff on multiple lines, but that just makes parsing complicated. Instead, whenever I see a long description, I look for the LCP id in the appropriate Python dictionary, and if it's there, I append.
  • Prepended : for commands. On occasion I have need to rename a command because I've changed what it means and already have data. It's helpful for find-and-replace to have the : there and it doesn't add appreciably to typing. Originally I had named the command "lcplong" as "long" but ended up using the same command in multiple data files. In case I want to merge them all together later, it's helpful to have distinct commands and searching and replacing ":long" with ":lcplong" meant I didn't have to worry about stepping on the word "long" in descriptive text.
  • Not shown: documentation in the file. At the top of each file I explain the syntax to myself for each command, because I expect I'll forget things. Often, it's enough to see the commands already in use, but it's helpful to have something to refer back to in case it's not clear. In a pinch, I can always examine the Python parser, but I'd prefer not to have to.
  • Also not shown: extensibility. Adding an "include" directive is super easy and doesn't complicate the resulting Python all that much, it just means encapsulating the parser loop in a function that can be called in a re-entrant fashion. Because commands are all basically additive, the "state" will be just held in Python data structures and anything that needs to be shared and included in multiple files can be easily handled.
  • Handling default behavior. Ultimately, I'm going to want to have reasonable defaults for things to fall back on, so there's a dedicated keyword that can't be used as the id of any specific LCP, which is "default". All of my parsing commands will notice this, as you'll see tomorrow.
  • Comments. Comments are, like Python, begun with the octothorpe³ and are single-line only.

Tomorrow I'll come back to this and show how simple languages like these are easily handled in Python and output to a binary.

¹Since shipping Sixty Second Shooter about a month ago, which had occasioned a six month break from my game or so.

²Note that I say game and not game engine. My game is currently hand-coded C++ on top of some cross-platform libraries.

³How great is that word.

Posted by Brett Douville at 02:30 PM | Comments (0)