Archive for the ‘Game Design’ Category

What a creative mind can do with Tipp-Ex

Friday, December 9th, 2011

One day I found a copy of the old classic game “Guild of Thieves” on sale on Amazon through one of their merchants. The game was described as complete and the price was reasonable so I bought it.

The game arrived a week later and when I opened the box, it was in good condition and everything was there – except one item. A special dice, one with one side blank.

I obviously wanted the complete original package (as advertised) so I sent an email to the seller:

Hi, I ordered a copy of “Guild of Thieves” for the Amiga. The description said it was “used, very good” which it is. However, the game should have included a small dice which was not present and I believe the description did not mention any missing items. If you could refund me some amount for this inconvenience I’d be happy.

I got an answer the following day:

Sorry we didn’t know this came with a dice. We will send you a dice out immediately. Sorry for the inconvenience.

I felt I had to clarify a bit. The game is a collector’s item and to be complete all original items had to be there, any old dice wouldn’t do. I typed up an answered:

Oh, if you have that dice it’s fantastic. It’s supposed to be a special dice where the face with three dots is blank (see pic below).

I didn’t receive any answer but a week later a small envelope arrived.

In the envelope was a small zip-lock plastic bag…

… and in the plastic bag – was this:


I honestly want to be a better designer

Friday, November 4th, 2011

Background: The fall of 2008 I was working on a large project for Avalanche Studios. The project was canned in the wake of the financial meltdown and I ended up without work. Our son was 8 months at the time and I took the opportunity and left for a parental leave that lasted almost a year. I spent that year thinking back at my time in the game industry so far and I made many brutal realizations about my work. I saw a couple of apparent problems and started to think about how to deal with them.

A year later I started working at Pixeltales and stayed for about 6 months. During that time I was fortunate enough to be able to put some of the thoughts I’ve been having into practice. I worked on the design of a peculiar action puzzle game. It never saw the light of day, but I tried to deal with the design process in the way I had come to realize was the only honest way to do it. Before talking about what that is I want to summarize what I had come to see as clear signs of bad design process:

  • Hard design problems that appear during the process are pushed into the future with the words: “Let’s deal with it when we get to that feature.”
  • Hidden problems will require hard meticulous work to find. Work that is not done properly.

This creates an accumulating “snowball” of problems, questions and unknowns that cause severe problems with the projects: delays, cuts, excessive crunch… you know the drill.

Now, there is unfortunately no silver bullet available that will make these production problems magically go away. But I believe we designers can do better. Much better!

I have seen a couple of articles lately (here’s a good one) talking about industry wide disrespect for designers. I have heard the argument that “anyone can be a designer”. I think I know why that is. It is our fault and it is up to us designers to do something about it. We need to evaluate what we are doing and how. Why? Because I believe that the following is true:

Designers are good at creating work (problems) for others. Designers are bad at providing the tools necessary for solving these problems.

In other words, the role of the game designer is not to create “ideas” for the team. It is to provide design. Those are two very different things. Design is not about dumping problems (the “ideas”) on other people and force them to do the actual design work.

I have heard designers say things like “this move doesn’t feel good, it has to be animated better so it feels right” – heck, I’ve said stuff like that myself! And you know what? That is a piece of utterly worthless feedback! If I work on a mechanic, I should know the purpose of it. If I can’t answer why it is in the design, what its function is, how could I ever know what to look for during implementation? It is lack of understanding that leads me to blurt out vague statements like “this has to feel cooler”.

It is my duty to properly drill into the designs. It is our job to sort out unknowns, find answer to questions and make sure that all those uncomfortable issues that appear during the drilling process are called out and dealt with. When our co-workers start to implement the design that we have created, we should give them the answers and tools they need.

When a programmer needs diagrams describing the flows of moves and metrics for speeds, distances and timings, I should be the one to turn to.

If a level designer needs pacing plans and a library of blueprints for combat encounter set pieces – I should create those tools because it is my job to understand the game and answer questions.

Now you might ask yourself just how to drill into design and how to deal with these kinds of problems? Luckily, there are some very smart people in the games industry that has put a lot of thought into just that. I would recommend you start by watching the following two speeches by the brilliant Jonathan Blow:

Truth in game design

Designing to reveal the nature of the universe (with Marc Ten Boch)


Puzzle gymnastics

Wednesday, November 2nd, 2011

Do you like logic puzzles? I do! In this article I am describing an attempt to create some logic puzzles that requires “out of the box thinking” to solve. If that sounds intriguing, read on!

When I was a kid my father subscribed to “Reader’s Digest” (maybe he still does, I don’t know). I used to read it and remember particularly enjoying two types of articles. One kind was a type of story that typically told the thrilling story of some guy who went out into the wilderness, got stuck under a fallen tree and eventually had to carve his limbs off with a pocket knife to get loose and then crawl all the way home without bleeding to death.

The other kind of article I enjoyed was “IQ tests”. The tests they published was pretty standard ones where you had to try to figure out which image out of 3 or 4 that belonged in another series or images. To solve them you had to find how the series progressed – this was usually by rotations, additions and subtraction of elements in the pictures.

Now, I don’t particularly see the value of “intelligence tests”, but I do enjoy the puzzle aspect of them. As a kid I was very thrilled by these puzzles – they gave me a lot of fun challenges.

If you google for “IQ test” you will find many that are similar to the ones “Reader’s Digest” published. However, most of these tests are constructed following a few standard patterns (rotations, add, subtract etc) and I recently started thinking that it might be fun to try to construct similar puzzles – but without following the usual patterns. I started out and quickly realized that the process of creating puzzles like this is a great, fun and different challenge. Hopefully they will be fun for you too, trying to solve them.

So, here is a set of three puzzles. The objective in all three is to find out which image (A, B, C or D) that is supposed to replace the one(s) marked with ‘?’ in the image grid.

Please post feedback in the comments section. Enjoy!

Puzzle #1

Puzzle

Puzzle suggestions

Puzzle #2

Puzzle

Puzzle suggestions

Puzzle #3

Puzzle

Puzzle suggestions


The launch trailer for Battlefield 3 is out

Saturday, October 22nd, 2011

Big launch next week and now the launch trailer is out.

Enjoy!


How to create a language in one day

Tuesday, October 18th, 2011

Purpose: In this article I am presenting an easy, fast and fun method to create the illusion of real language and produce material can be used for a variety of purposes.

About a year ago I worked on a very interesting project which involved creating a unique world with all its history, people, physics, metaphysics and so forth. I like fictional worlds that are thoroughly created and I have always marveled at people like Tolkien or Richard Garriot who go such great lengths and even create languages for their worlds. I have since I was young thought that it would be cool to one day create my own language.

When I started studying linguistics and computational linguistics many years ago I learned a lot about the behavior of language. I got more acquainted in the world of languages and learned what I needed to cover to construct a language of my own, and roughly in what end I should start. I also realized the daunting scope of such a project.

However, a year ago I was thinking about the game world we were creating and I briefly returned to the idea of creating a language. I though about it and wondered if I couldn’t be much more efficient. I mean, I wouldn’t wanna spend a couple of months on a language that would just be a minor background element in this fictional world. It would add some depth to the world, but few would probably fully appreciate a proper constructed language.

One evening I began to do some basic research, looking for ways to cheat and sidestep what would ordinarily be required in the process of creating a language. I figured that for my specific purpose I could fake quite a lot. This lead to some quick tests and after spending another evening I was done with my language. I had created a fictional language in (less than) one day.

Linear B

First, I wanted a language that felt real. It should reek of history. In the end I turned to Linear B and figured I could use it. (Of course I could have drawn my own set of symbols and worked out their pronunciation, but this time I decided to go with Linear B as it is)

Linear B

This is not the whole Linear B writing system. There is a set of logograms and special characters in the system as well, but I decided to ignore them and just go with the symbols you see above.

One interesting aspect of this part of the Linear B system is that each symbol corresponds to a syllable. This is quite different from our Latin alphabet. Whereas Linear B uses one symbol to denote the syllable “wo”, we would in English write it with two symbols: ‘w’ and ‘o’.

Translating syllables

Now, what would happen if I could just somehow translate English syllables into Linear B ones? After some more digging I found a list of the few hundred most common digraphic (two character) syllables in English. The 10 most common being:

Syllable Frequency
TH 3,99%
HE 3,65%
AN 2,17%
ER 2,11%
IN 2,10%
RE 1,64%
ND 1,62%
OU 1,41%
EN 1,37%
ON 1,36%

That’s well and good. Now, If I could set up a table matching the 60 most common digraphs in English against the 60 Linear B symbols I might get somewhere. Piece of cake! Python (or Ruby or Perl for that matter) to the rescue! These are excellent languages for these kinds of tasks. Here comes the translation table:

translation_table = [
    ('en','a'),  # Digraphs
    ('er','e'),
    ('nt','i'),
    ('th','o'),
    ('on','u'),
    ('in','da'),
    ('te','de'),
    ('an','di'),
    ('or','do'),
    ('st','du'),
    # ... more pairs like these ...
    ('ll','za'),
    ('ng','ze'),
    ('me','zo')]

I can pretty much pair these as I want since Linear B syllables always have a vowel in them. So I won’t end up with long strings of consonants ("jfdksjfdf") however hard I try.

Ok, we also need translation functions. translateWord() translates single words syllable for syllable and translate() iterates over a whole string (sentence) and translates it word by word:

punctuation = (',','.',':',';','!','?')
 
def translateWord(word):
    def trans(str):
        for (ep, lp) in translation_table:
            if str.startswith(ep):
                return (lp, str[len(ep):])
        # didn't find a syllable. chip off one character and move on
        if str[0].endswith(punctuation):
            return (str[0], str[1:])
        else:
            return ('', str[1:])
    tword = ''
    word = word.lower()
    while word != '':
        (syl, word) = trans(word)
        tword = tword + syl
    return tword
 
def translate(str):
    return " ".join([translateWord(w) for w in str.split(' ')])

Now we can try to translate sentences:

This is my new language

translates into

oqe qe je teze

This looks promising, but we need to fix one thing. Since there is no corresponding syllable to “my”, the whole word “my” gets consumed. Adding the single vowels (‘a’, ‘o’, ‘u’ etc) to translation_table and have them correspond to Linear B syllables does the trick.

Why is this your new language?

now becomes

o qe oqe opi je tezeanesi?

Giving the language more flavor

It’s a good start, but we can get a bit further. First of all, the translation table could be expanded a bit with entries for semi-wovels (‘w’, ‘j’, ‘l’) and some consonants. But there’s also things we can do with the language structurally. There is a linguistic term called “agglutination” which means that instead of isolating a word of some syntactic meaning, it is instead tacked onto another word as a prefix or a suffix. English does this with the plural marker ‘-s’, for instance, while pronouns like “your” and “us” are separate words.

Some languages are heavily agglutinating, like Finnish where “talossanikin” means “in my house, too” whereas a language like Mandarin isolate everything (these are also called analytic languages).

For the sake of making my language more exotic than English I decided to have it use suffixes where English uses separate words in a number of cases. Another table does the trick:

switch_table = [ 
    'a', 'an', 'the', 'my', 'your', 'his', 'her', 'its', 'their', 'your', 'our',
    'i', 'we', 'you', 'he', 'she', 'it',
    'one', 'two', 'three', 'many', 'some',
    'not']

(My final table is a little bigger than this but this illustrates the point)

If any of the words in the table are encountered, they switch place with the next word and joins it as a suffix. The function intermediate() handles that and creates the “intermediate” English form:

def intermediate(str):
    i = 0
    s = str.lower().split(' ')
    s2 = []
    while i < len(s) - 1:
        if switch_table.count(s[i]) > 0:
            # Make suffix
            n = s[i+1]
            nsuffix = ''
            if n.endswith(punctuation):
                nsuffix = n[-1]
                n = n[0:-1]
            s2.append(n+s[i]+nsuffix)
            i = i + 1
        else:
            s2.append(s[i])
        i = i + 1
    if i < len(s):
        s2.append(s[i])
    return ' '.join(s2)

So if I run the string Why is this your new language? through intermediate() I get:

why is this newyour language?

And feeding that through translate() yields:

o qe oqe jeopi tezeanesi?

Writing it out

Now we only have to get it written into the nice Linear B symbols. Fortunately, Unicode covers Linear B so if we only have a font that includes its symbols (You’ll find one called “Aegean” here), any web browser will be able to display the text. First, we just add the Unicode codes for each entry in the translation table:

translation_table = [
    ('en','a', '&#x00010000;'),  # Digraphs
    ('er','e', '&#x00010001;'),
    ('nt','i', '&#x00010002;'),
    ('th','o', '&#x00010003;'),
    # ...and so on...

We also need to modify the translateWord() function to return tuples of Ascii and Unicode (exercise left to the reader). Then we can easily dig out either the written or “spoken” version of the text and put it all in a HTML page (another exercise to the reader) for your favorite web browser to render.

Let’s try it…

It is a dark time for the Rebellion. Although the Death Star has been destroyed, Imperial troops have driven the Rebel forces from their hidden base and pursued them across the galaxy.

(Intermediate form) isit darka time thefor rebellion. although deaththe star has been destroyed, imperial troops have driven rebelthe forces theirfrom hidden base and pursued them theacross galaxy.

qewo rotawine kuzo osinita tasikisuina. reopise qokotasi duma mo kime qodutioja, ruzeerure titazeso nejo rosojo tasikisuosi nitariso owetati raroqo kimosi diro zesesoaja osi oqatisoso sereneo.

It is a dark time

Now we are done!