Categories
Geek / Technical Personal Development

Global Day of Coderetreat is This Saturday

A couple of years ago I attended my first Global Day of Coderetreat, a day to celebrate software craftsmanship and practice software development with like-minded developers outside of the context of a normal work environment.

I had a great time then, and so when I learned at the last minute that there was one coming up, I signed up for it right away. It’s a free local event, so there’s no excuse not to take advantage of it.

Last time we paired with different people in multiple iterations of developing John Conway’s Game of Life, with each iteration forcing us to throw away our old code and work under different constraints.

For example, one iteration asked us to avoid using primitives. At the time, I struggled to understand what it meant since you can’t create a custom class without using primitives at some point.

But the spirit of the exercise is that your solution shouldn’t expose implementation details. If you are using integer values to represent states, you could use a typedef:

typedef int State;

And then use State instead of int where appropriate. In this way, your code reads better because the way you model it is part of the language of the code.

Note how even with bad single-character variable names that

void update(GridPosition g, State s);

communicates intent a lot better than

void update(int x, int y, int s);

And ever since that coderetreat, I’ve been able to use that experience to write more readable code than I used to.

I’m looking forward to Saturday’s Coderetreat here in Des Moines, IA. It should be fun.

Are you attending a Coderetreat near you? Are you hosting?

Categories
Geek / Technical Personal Development

You Are NOT a Code Monkey, So Stop Acting Like One

I lead a C++ lunch-and-learn group at my day job. Its audience is either non-developers interested in learning some basic programming, or developers who have experience with a different language and are still getting to grips with C++’s basic syntax.

One of the things I try to stress is the need to be conscious when coding. Software development is an intellectual activity. The most important aspect is not coding. It’s thinking.

So I often stop my group and ask them to justify a code change. Too often I see someone copy and paste code in the hopes that it will “work”. It then becomes trial-and-error in getting the magic incantation of semi-colons, curly braces, and keywords in the right order in an attempt to appease the compiler so that the developer can continue.

It’s what I call Hope-and-Pray-based Development, and while a million code monkeys eventually might be able to hack out the equivalent of Shakespeare’s works using this method, it’s not what a software engineer should be doing when trying to create customer value through code.

Now, it’s one thing to leverage the compiler. If you type out some code, and you’re not sure if it is right, the compiler will happily tell you why faster than you can formulate a guess. But you’re not just typing and pasting code in different ways in the hopes that the compiler will shut up.

The key is that you are testing a hypothesis and getting feedback and, most importantly, learning.

But sometimes the lesson is subtle.

Recently we’ve been working on the Prime Factors Kata by Uncle Bob Martin. It’s a short kata in Java that we’ve translated to C++ as we’ve gone through it, but because of my insistence on being conscious developers, it has taken a few sessions to get through the first few tests.

The first unit test says that you get an empty collection when you ask for the prime factors of the number 1. The second unit test asks you to return the number 2 when you ask for the prime factors of 2. So after the second test passes, the code looks something like:

std::vector<int> primeFactors(int number)
{
  std::vector<int> factors;
  if (number == 2)
  {
     factors.push_back(2);
  }
  return factors;
}

The third test is about the prime factors of the number 3. Once it passes, the code looks like:

std::vector<int> primeFactors(int number)
{
  std::vector<int> factors;
  if (number == 2)
  {
     factors.push_back(2);
  }
  if (number == 3)
  {
     factors.push_back(3);
  }
  return factors;
}

The third part of the test-driven development cycle is refactoring, and my group wanted to refactor this code to look like:

std::vector<int> primeFactors(int number)
{
  std::vector<int> factors;
  if (number == 2 || number == 3)
  {
     factors.push_back(number);
  }
  return factors;
}

The tests still passed, but I asked the group to justify their refactoring. I got responses about how it is more readable this way, or that there are fewer lines of code.

I said that those reasons are all well and good, but I fear they’ve lost something in terms of intent. I said that the variable number is the input. We’re asking for the prime factors of number, and giving back number as output happens to work but isn’t really what we’re doing when we’re providing the prime factors of a number. I argued that this change is hiding the intent of the code and that explicitly returning 2 for 2 and 3 for 3, while more lengthy, didn’t assume anything about the input as output.

This discussion/debate went on for the last 10 minutes of the session. Afterwards, they read ahead in the kata’s slides and saw that the refactoring in the slides does, in fact, do the refactoring as they did.

So was I wrong?

The prime factors of a number are directly related to the number, so it makes sense that the code can be written to return values that are defined in terms of that inputted number. So, ultimately, yes, the code will reflect this fact.

But I wasn’t focused on the code’s correctness. I was focused on the correctness of the thinking behind the code.

The developers in my group didn’t argue that the refactoring’s validity is due to the number being its own prime factor. They were focused on removing what they saw as duplication, on making the code shorter.

Effectively, they saw a change they could make and made it without concern about how it will be read later or how it will impact changes later. It was a change made for its own sake, mimicking changes they’ve seen elsewhere. It “worked” in this other context, so it must “work” here.

In other words, I recognized that this otherwise fine code change was happening for the wrong reasons.

Another example is when we passed our second unit test and decided to refactor the tests. We created a fixture, and the code originally looked like:

class PrimeFactorsFixture : Test
{
};

The compiler didn’t like it: error: ‘static void testing::Test::SetUpTestCase()’ is inaccessible
static void SetUpTestCase() {}

After the developers eventually read the error message and tried to figure out why this function was even relevant to their code, someone suggested that sometimes the keyword public is put in front of the base class.

So they tried it, and it “worked”. The compiler built the code and we were able to run the unit tests.

Rather than continue on with the refactoring, I spent the next few minutes (re)explaining how inheritance works in C++, and that there is a difference between private and public inheritance, and that what they saw was a compiler error as our unit test was expecting PrimeFactorsFixture to have functions that Test provides but because we were inheriting from it privately, those functions were not available.

I spent that time because it is important that they understand WHY it worked. I want them to get out of the habit of throwing spaghetti at a wall and seeing if it sticks. I don’t want them to be satisfied with waving a dead chicken to get past a compiler error. I want them to think beyond “I saw this other code that looked like it might work here” and get to “we need this code because of this good reason.”

Trial and error is fine if you are actively learning from your errors, but if you don’t stop to find out why the errors happen, you won’t learn how to avoid them in the future. You’ll just leave behind a trail of horrible half-functioning code that appears to “work” at the time you wrote it without you being able to explain why.

If your development process could be replaced by a script that generates copy and pasted code or shifts values around at random until the compiler works, you aren’t acting like a software developer. You are acting like a code monkey.

Code monkeys bang on the keyboard until things seem to work, even if the code doesn’t in fact work as they think it does. They focus on getting past compiler errors without worrying about why the errors happened or if the code changes they made to “make it work” are even sensible in terms of what they are trying to accomplish.

Software developers think through what code is needed, and once they implement it, they know with some level of confidence that their code actually does in fact work. They learn from their mistakes. It’s not about getting it working. It’s about getting it working correctly.

And since I want my group to be made up of software developers, I often stop my lunch and learn group and force them to justify what they were thinking when they made a change. I won’t tolerate random code changes to appease the compiler. Instead, I want them to think the code through. I want them to be able to predict accurately how the compiler will react to their code when they write it.

I want them to put down the dead chickens and think.

Categories
Geek / Technical Personal Development

Code Katas Shouldn’t Be Called Katas

I’ve told a few people this over the years, but I hate the term “code kata.”

More accurately, I hate that people call code katas what would otherwise just be “programming problems.”

In martial arts, a kata is a choreographed routine that teaches and reinforces form and movement. Here’s a short video that shows a beginner’s kata. You can see that the stance, the punching, and the blocking moves are repeated in different transitions. A practitioner would do that kata the same way each time.

The goal? To internalize the movement so it becomes second-nature, so that outside of a kata there is less need for conscious thought when deciding what move to do. The position of the head, hips, and shoulders, the movement of the feet, and the general stance of the practitioner are all things that might feel unnatural and forced at first. Repeating the katas help make it feel natural.

Code katas, on the other hand, don’t usually look anything like a martial arts kata. There’s a problem statement, and you are left to solve it on your own.

They are great exercises, and the more famous ones are at CodeKata.com. I think they are helpful for a developer to gain experience with the hard work of software development, which is mostly thinking.

But the word “kata” implies a form to repeat.

Uncle Bob Martin’s bowling game kata, to me, is a kata, because it’s purpose is to teach the red-green-refactor cadence of test-driven development.

For people new to TDD, it’s a great way to learn how to test-drive the design of code. One of the subtle lessons is going through the design upfront and then discovering at the end that the code’s implementation is simpler and doesn’t necessarily look like the initial design. But the important part is writing a test first, writing just enough code to make it pass, and then refactoring out any duplication. Over and over.

I’ve done the bowling game kata a few times, and I’ve seen Uncle Bob demonstrate it twice. The TDD form was always the same, but it wasn’t rigid and mindless. It was helpful to have the slides and follow along, especially as the original kata was implemented in Java and I was doing it in C++. I had a guide that gave me the feedback I needed to know if I was on the right track. “I moved on to the next test, but I see the next slide had us refactor. Whoops. I forgot the refactor part of red-green-refactor.”

Contrast this code kata with what usually passes for a code kata: “Here’s an interesting problem statement. Solve it.”

There’s no guide. There’s not usually a right or wrong way to solve it. And when you do it, there’s no feedback that lets you know you did well or where you need more work. It’s just a programming problem or puzzle.

And while they are useful, I wouldn’t call them katas.

Unfortunately, we’ve had code katas for long enough that I don’t see this name going away anytime soon.

What’s your opinion on calling them “code katas”? Am I missing something subtle about them that makes the name appropriate?

Categories
Games Politics/Government

How to Apologize Correctly

When I was a senior in high school, I was editor of the school paper. I wanted to publish more than fluff pieces. I couldn’t count how many times the formulaic headline “[insert school event here] a Success” showed up in that paper.

Some of the articles ended up quite controversial, and I got us in trouble quite a few times. I was the reason why future issues of the paper had to be approved by the principal.

And while I can be proud that, after years of people complaining, my paper resulted in actual changes to the cafeteria food quality and pricing, I did have one article that poked fun at past administrators that got me pulled into the principal’s office. I was told that I needed to write an apology for the next issue.

I remember writing the words, “We regret any offense we may have caused.” It sounded good and official, as if it was something in a real newspaper.

And I remember being told that my statement wasn’t good enough. It’s not an apology to “regret” that someone was offended. It’s basically saying that we’d do it again and that any offense is the responsibility of the offended.

So I had to rewrite it: “We apologize for the offense we caused.” It’s a lot more direct and lot less weaselly.

An apology isn’t something you say to make bad feelings go away. “I’m sorry” isn’t a magic phrase to get people who are upset with you to disappear. And you don’t apologize with a non-apology such as “I’m sorry if you were offended” because you’re basically saying that you’re not sorry you did someone something wrong because you don’t think you actually did.

According to Ars Technica, slave-Tetris mode was removed from Playing History 2: Slade Trade by Serious Games Interactive after a public outcry when the game became more well known due to a Steam sale.

Ugh. I did just type those words, didn’t I? Slave Tetris? Really? Someone thought it was a good idea?

I have no problem with a game being used to educate players about history. And no one else who understands how games aren’t just for kids has a problem with the concept either.

But Slave Tetris isn’t the most respectful way to teach how horrible the conditions of the slave ships were. This isn’t navigating the Dalles in The Oregon Trail. You can’t reduce the real experiences of millions of people to a mini-game and not expect people to feel that those lives themselves have been minimized.

Simon Egenfeldt-Nielsen of Serious Games Interactive had this non-apology:

The phrase “as it was perceived to be extremely insensitive by some people” is very similar to “we regret any offense we may have caused.”

This phrase makes it sound like the Slave Tetris minigame is actually quite sensitive and perfectly fine, but because some people took offense, SGI decided to take it out to make the bad publicity and bad feelings magically go away.

I think Egenfeldt-Nielsen honestly believes that this is a good educational game that brings the horrors of the trans-Atlantic slave trade to life much better than any history book could do. And he may be right about the game as a whole, although having someone in the game talk like Mr. T seems to contradict his claims that “We are definitely not making it into a joke.”

Playing History 2: Slave Trade - Pity the Fool?

Furthermore, I have a feeling that many of the negative reactions in here are knee-jerk reactions and she eps following what other says. Please take time to look at the game before forming your opinion.

The problem with Egenfeldt-Nielsen’s commentary is that he says, “we are listening” but then in the same breath says, “I really don’t think that all the comments here are warranted.”

Oh.

People are offended, and it isn’t the Race Card or Political Correctness or people who are just looking to get offended professionally.

He made a mini-game about earning points by stacking human slaves efficiently in a slave ship. It’s offensive.

If there was a mini-game about slamming planes into the Twin Towers and scoring points for the number of people you force to jump to their deaths, people would be offended because it is offensive to take such a serious situation and try to pretend there’s a fun game out of it. There would be real lives being represented in a terrible way. The seriousness of that day would be missed, no matter how accurate or true it technically might be.

I agree with Egenfeldt-Nielsen that games have a lot of potential beyond being fun. In fact, there are plenty of serious games out there on a wide variety of topics that the casual game player might get surprised about. There are games about dealing with cancer, depression, and many other health issues. There are games about current events, war, and logistics for aid organizations, all of which treat the topic seriously and can bring awareness without making light of the situation.

But as I’m sure he has discovered, it’s not easy to work with serious subjects. You can’t separate the game from the people and events it is portraying. A game about slavery can’t just be game mechanics with a slavery backstory. To think otherwise is to betray the mindset that this serious issue is serious in the abstract but not serious enough to consider other people’s reactions to it as important.

Slavery is horrific. A game about slavery need not be, but Playing History: Slave Trade‘s Slave Tetris isn’t driving home the point that slave ships were actually like a Tetris board. In a subtle way, it’s minimizing the horror.

But I worry the lesson he learned isn’t to treat serious subjects with more respect and awareness. I worry the lesson he learned was that he needs to walk on eggshells to avoid having seemingly unreasonable people offended. His regret is that others were offended, not that he participated in the offending.

Categories
Game Design Games Geek / Technical

The Neat Little Experiments of Ludum Dare Entries #LDJam

Since I’m on vacation, I’ve had more time dedicated to playing and rating the entries from Ludum Dare #33, and it occurs to me that I’ve never played so many games from a compo before.

And apparently I’ve been missing out.

When over 1,200 people submit games within 48 hours for a single theme, you’re bound to see some really amazing, innovative, and bizarre takes on it. While many might be mediocre, even the poorer entries might have a glimmer of brilliance hidden in them. It’s like having hundreds of people doing research and development all at once.

Monster Mash by Budda allows you to create and customize your own monster. Using the bones of the adventurers you defeat, you can upgrade your body parts and weapons to get more powerful and deal with the stronger and deadlier adventurers.

LD33 Monster Mash by BuddaT

The battle screen features your monster on the left and your enemy adventurer on the right. What I liked about it was how the interface was simple and abstract: click on the various body parts to attack and heal. When your enemy hurts you enough, you might lose the ability to use one of your body parts. It’s bizarre to see your head turn red to indicate it is disabled when the rest of your body is fine, but I bet it is terrifying to the adventurers as well.

I can see this experiment result in a genre of simple yet tactical mobile games.

Goloumo by HippGame is a quick platformer. While you can move about and jump, the way to make it through the game is to use your ability to manipulate other objects in space. Click and dragging a table or an elevator when you’re on it, and you can get to areas that would otherwise be impassable.

LD33 Goloumo by HippGame

It’s a rough experiment, but I can see this mechanic being used to great effect in a Nintendo DS game.

Sirens by miotatsu has you sing to lure ships towards your rocks. It’s art is a bit crude and the audio shows how little polish was expected, but it works well.

LD33 Sirens by miotatsu

It’s essentially a tower defense game in which the stationary rocks are both your weapons and your defense. Still, combined with the singing ability to lure ships in on purpose, I think Sirens has a bit more to it than might be expected.

Hydra Confusion by concalf has you controlling a hydra’s many heads, ensuring each one is fed and happy. If you mess up, a new head appears, which makes it more difficult for you to manage.

LD33 Hydra Confusion by concalf

Hydras were always cool, and I’ve never seen a game that featured one you could play! Moving about and controlling the individual heads isn’t terribly challenging, but managing them all at once is.

Fear Me by joe has you in the role of a monster trying to scare someone who is trying to sleep. You need to be just visible enough to scare without being too visible and caught.

LD33 Fear Me by joe

It’s kind of like playing a character in Monsters, Inc. You can hide under the bed or in a box, but it takes up precious time. While I suppose Metal Gear did similar stealth mechanics, this is the first time I’ve seen you in the role of a scary monster.

What’s funny is how each Ludum Dare starts with the announcement of a theme that many people will vocally hate. When “Roads” was announced for Ludum Dare #13, I remember people complaining that everyone was going to make a racing game and it was going to be a boring theme. But like most LDs, there was quite a bit of variety present.

Similarly, people whined about “You Are the Monster” for LD #33, citing how hard it was to come up with an idea, and yet in just a handful of games I found that no two are alike, and they sometimes bear little resemblance to professionally-created games, but in a good way. It’s mind-boggling how much creativity Ludum Dare unleashed.

Years ago, I was given a jazz album to listen to while I worked, but it was so bizarre and jarring that I couldn’t concentrate. I looked up the artists, and it turns out that they combine “modern avant-garde jazz with rock and pop influences.” Ok, sounds great, but it sounded like random noise to me.

The thing is, I figured that it must sound good to a more practiced ear, and so I wondered what I was missing. When I asked a friend who is more of a music expert, he explained that avant-garde music is meant to be experimental. Often what someone discovers with avant-garde finds its way into the mainstream eventually.

Now, there is a lot more to avant-garde art. It’s not about being a proving grounds for new work but is instead meant to push boundaries and challenge traditional social values. It’s more political than commercial.

But the experiments do get leveraged to create commercial works.

And playing Ludum Dare entries, I’m reminded of this idea. The game mechanics might be rough and unbalanced, but there’s often a spark of cleverness.

Have you seen any interesting Ludum Dare entries worth noting?

Categories
Game Design Game Development Geek / Technical Personal Development

Development Strategies for Game Jams #LDJam

As I play and rate Ludum Dare games, I see that games fall into a few groups:

  • Highly polished games that feel complete
  • Highly polished games that feel incomplete
  • Unpolished games that feel complete
  • Unpolished games that feel incomplete

By complete, I mean they have all the elements of a game: an objective, conflict, rules, unpredictable outcomes, endings, etc.

By polish, I am referring to the production quality. There’s few bugs, the aesthetics are cohesive, and everything feels balanced when you play it.

So how do you make a highly polished and complete game in 48 hours? What tips and tricks are developers using?

Make It Playable as Fast as Possible

Games are complex systems in action. You can’t design a game well unless you playtest it because it isn’t always obvious how the rules of a game interact. Making something playable early means you have more time to test it as you add, remove, or change mechanics. You also have time to make decisions, such as whether to kill planned features or spend time on making the controls feel better.

I’ve found that when I fail to submit a game to a Ludum Dare, it usually coincides with a game that either has no game play or gets the bare minimum of game play added at the very end. I have no time to play and see how the game feels, which means that even if I get it done on time, it’s more likely to be an unpolished and incomplete tech demo.

On the other hand, when I focus on getting something playable early, such as during Ludum Dare #24, it’s a game from the beginning. It might start out unpolished and incomplete, but by the deadline, even if I don’t get all the features I wanted in there and I can identify glaring problems, I have something to submit. For my entry for the theme Evolution, I didn’t get to add the features that take advantage of the theme, but I recall how sluggish the tank felt to move and I spent a little time tweaking it until it felt better to play. When you killed the enemies, I had points float up above their heads. I’m not saying it was a beautiful game, but it was more polished than most of my entries have been. And it didn’t have everything I wanted in it, but what was in it felt complete.

Ideally, your work in progress will be easy to deploy to other people so they can play test it and give you feedback. You might think the game is fine, but you’ve been immersed in it for hours and might miss how difficult it is for someone who hasn’t seen it before. Your game is ultimately for other people to play, so their feedback is very important.

Know Your Tools

If someone gave you a complex tool you’ve never seen before, you’d probably muddle through how to use it, but it would be slow and painful.

On the other hand, if you were given a tool you’re familiar with, you no longer need to worry about how to use it as it is almost second-nature. You can focus on the task in front of you instead of focusing on how to use the tool.

Years ago, I struggled with making programmer art in GIMP. I wrote code. I didn’t art.

Partly from learning during previous Ludum Dare compos, partly from talking with artists about their workflow, and partly from practicing outside of compos for my own projects, I learned how to do things I normally need to do during a game jam. For instance, I use layers, preferably named ones, to make it easier to create a complex image. I know how to scale images and layers with fewer artifacts. I know how to use an alpha selection to get an online of an image, and I can grow and shrink selections so I can create a silhouette or a border. I even learned common shortcut keys so I can quickly switch from the Pencil tool, the Bucket Fill tool, the Rectangle Selection tool, and the Ellipse Selection Tool, which saves me time.

I remember reading the manual for Applesoft BASIC and learning that instead of typing out:

PRINT “HELLO, WORLD!”

you could type out:

? “HELLO, WORLD!”

And that question mark would automatically get turned into the PRINT command. The manual mentioned that it saved four keystrokes and time. At the time I wondered how much time it could possibly save, but since I was typing PRINT almost all the time, I realized that it added up.

Today, knowing your IDE’s shortcuts similarly helps. As my friend Chris Freeman said in his presentation on refactoring, tools reduce cognitive load. Instead of using the mouse to hunt and click on everything in menus, you ideally should be able to unconsciously move your fingers to the right key combinations to make things happen. It’s like learning how to ride a bike or drive a car. Once you get the hang of it, you no longer focus on where your feet are. When you want to move forward, your feet automatically know what to do.

During a game jam, you don’t want to spend time reading a manual or searching online for help. You want to just DO things that move the game forward.

For my first Ludum Dare, I was learning how to use libSDL, and luckily I kept the scope of the game down because I knew I wasn’t going to be able to do very much. I spent a lot of my time figuring out what SDL provided and how to write code to take advantage of it.

For the latest Ludum Dare, I was often very pleased with how even major code changes compiled on the first try. I was much more familiar with the language and with the interface of my tools such as Vim and Gimp.

Come up with a Plan

You’re two hours into a 48 hour compo. What are you working on now?

With only two days of development, it might feel like you don’t have time to plan. Every moment not working on game development is a lost opportunity.

But planning saves time, and it doesn’t even have to be very complicated to be effective. There’s no need to create a Gantt chart for your project.

Some game developers create entire detailed design documents to keep their thoughts organized, and other developers use nothing more than a list of planned features that they cross off as they get implemented.

But what about time?

You could work on one thing at a time until it is all done, but the risk is that the later items don’t get done at all. What you don’t want is to find yourself with an hour left and realizing that you forgot to implement a way to end the game or that your game is completely silent.

Some people try to get a good chunk of the game done early so that the rest of the compo is spent on balancing and adding polish. Some developers set aside blocks of time, such as a couple of hours, to creating sound effects.

Other people understand that their energy levels are going to be different throughout the day, and when they are too exhausted from programming, they can switch hats to creating graphics or music. Einstein actively relaxed by playing the violin, and you could do worse than emulate him.

No matter how you plan your two days, having that plan gives you more insight into what to do at any given moment so that you have the best chance of submitting a finished game.

Your Tips?

I’m not saying I’m an expert, and I still feel like I’m learning how to pace myself and put together something. But after participating in 10+ Ludum Dare game compos and a handful of other game jams, I think I’ve gotten some worthwhile experience to share.

I should probably invest in The Game Jam Survival Guide by Christer “McFunkypants” Kaitila.

What are your strategies when participating in a game jam? How do you ensure your game is complete and polished before the submission deadline?

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD33: Free Me, You Idiots! Ported to Android! #LDJam

Shortly after I ported my Ludum Dare game to Windows, I ported it to Android! You can download and install the .apk now and play on your phone or tablet. I’ve updated my LD#33 compo entry.

Here’s a handy link to explain how to install an app outside of the Google Play store.

LD#33 Game Play

Warning: it’s not really optimized for mobile yet. It pauses when idle, but it doesn’t pay attention to the back button, so you’ll have to long-press the Home button then swipe it away to close it.

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD33: Free Me, You Idiots! Ported to Windows #LDJam

I’ve updated my Ludum Dare #33 compo entry with the Windows version of Free Me, You Idiots!. Now most of the world can play it!

LD#33 Game Play

Next up: fixing my Linux-based entry so that it uses a non-custom install of SDL2.

Categories
Game Design Politics/Government

Take Seriously the Responsibility of Game Creation #LDJam

After a marathon game development weekend in which I finished my Ludum Dare compo entry on time, I found myself looking forward to playing everyone else’s games. I pulled up the random list of games it provides for me to rate, and the very first game on the list?

A game about being a rapist.

Seriously? Ugh.

I know. I know the theme for Ludum Dare #33 was “You Are the Monster.” I know the very first thought most people will have with the word “monster” is some kind of creature, whether evil or good, and the second thought is, “Ah, but people can be metaphorical monsters, too!”

And there have been some amazing games taken in both directions. In just a handful of games, I played the role of a politician in two of them. One was humorous, and one was chillingly dark. Both were done well.

But I can’t comprehend how someone could think playing as a rapist would make for a good game concept, no matter how much it might fit the theme.

I’m having trouble articulating what bothers me so much about a game about being a rapist. We have lots of games that put you in terribly violent roles, and I would be one of the last people to argue that they shouldn’t be made.

But this game has you treat women as objects to overpower as a core game play mechanic. That’s horrific.

When I brought this up in the Ludum Dare IRC channel, I was told something to the effect of “If you don’t like it, then just don’t play it.”

I think that attitude works fine for matters of taste. If I am not a sports fan, I could just not play the next incarnation of Madden instead of whining about the existence of another game I don’t care for.

But this is a game about subjugating and raping women, of treating them as Less Than. I would not think it’s a matter of taste. I would like to think that it’s not a matter of some people being offended and some people not. I think it is perfectly valid to call out a bad creation. I mean, there are bad games, and then there are bad games.

It’s not “just a game”. I hate that phrase because it makes it sound like games are not important.

Games matter. And I know this is a 48 hour game made by an amateur and not a professionally produced controversial product. But games matter.

We live in a world where the tools of creation have been democratized, and as I wrote last month, anyone can create, and they do:

You could simulate complex interpersonal relationships, or you could go the easy route of hypersexualization, stereotypes, and power fantasy.

It’s a choice.

And with the increased availability of tools and publishing platforms, anyone can make these kinds of choices.

And many do. Sometimes without realizing that they are making important choices.

And some of these choices get front-page status, which means a lot of people get the subtle message that these choices are normal.

Being careless about this topic bothers me a lot. Rape is serious. It is dehumanizing to its victims. It is horrific. It should not be treated casually, because then you risk making rape sound as almost normal, maybe even funny. When rape is treated in an unserious way, it’s telling the world that it is no big deal.

I’m not saying that certain topics are taboo and should not be the subject of games. Other media have tackled it, and some have done better than others in not treating it as merely a plot development, and I believe games could as well. I think it may be possible to create a game about violent misogyny and rape that seriously deals with the issue.

I am saying that if rape is going to be addressed in a game, it needs more careful thought behind it. Making a game about rape is not something you just do.

A note to people who don’t play games: Games don’t have to be fun to be games. They don’t have to be for kids to be games. They can deal with adult themes. They can inform.

Games mean something and they say something to the world. Even if you think they don’t say anything, THAT says something. Playing a game featuring casual misogyny such as the Batman:Arkham series of games says something to us about the views of the creators, views that potentially get absorbed by the players. These games aren’t going to turn every fan into a raging women-hating fiend, but it sure doesn’t help to be exposed to hours of game play normalizing certain attitudes toward women.

A game about being a violent rapist says something about the creator’s views, views that can get absorbed by it’s players. People might see this game and think, whether consciously or not, “Huh, someone made a game about being a rapist. I guess that’s a thing now.” And rape gets even more normalized in more minds.

I don’t know what to call for in terms of this specific game. I’m not asking for it to be banned or removed from Ludum Dare, but that’s more because I don’t know if it should be. I’m still a bit shocked that someone thought to make it in the first place.

But in general, I am asking that game developers take the responsibility for what they put out into the world more seriously. You’re creating culture. Act like it.

Categories
Game Design Game Development Geek / Technical Linux Game Development Personal Development

LD33: Free Me, You Idiots! Development Time Lapse #LDJam

Want to see the last 48 hours compressed down to a little over 3 minutes?

I uploaded the time lapse video of my development of Free Me, You Idiots!:

You can find the final submission at http://ludumdare.com/compo/ludum-dare-33/?action=preview&uid=251. Thanks for playing!