Criminal Dorms

  • Genre: Game
  • Year: 2016
  • Duration: 4 months
  • Team: 1

Criminal Dorms is an interactive story game about our experiences as exchange students in Japan. Almost all characters in the game are real people that actually lived there - even the room numbers are correct. You can play the game right here in your browser, it should also work on mobile:

[Play Criminal Dorms]

The main game mechanic is inspired by the classic board game "who is it?", but instead of using visual features like hair colour or clothing the characters in the game are distinguished by their individual interests or mother tongue. This offers a surprising amount of complexity and adds a lot of personality to each character.


You start out as a new office worker. At the beginning everything seems to be fine, but after a while you realize that some of the students are playing tricks on you! By inspecting the dorm you start to find out more and more about the persons involved. Can you expose the person that is responsible for all the pranks?


The game and it's environment is inspired by the beautiful view I had of my room at the dorm. Here you can see both my room where most of the game was developed and also the nice view of Beppu:

you would sometimes even see the local train passing through the city, at first I wanted to include that too

The final background for the game is a multi-layered line painting of this view. I wanted to have a nice parallax effect when scrolling down the criminal dorm page, as the player would do this over and over again through the course of the game.

background, mid- and foreground used for the parallax scrolling effect


creating all people

To get all people into the game I linked the results of a google form to a google sheet (Daniel Shiffman explains this very well in his Mad Libs tutorial).

Taking a look at all the survey results is really funny, but see for yourself how many people would like to have a bird or like listening to classic music:

at first I had the option 'goldfish' but later changed that to 'fish'

I also asked people for a greet- and prank-word in their mother tongue. I will spare you the details, just take a look at this overview:

creating the narrative

For the procedural story generation I used google sheets and tabletop js. The story is made up from building blocks that get randomly chosen each time you make a decision. This applies to paragraphs, single sentences and even some words that change every time you play.

screenshot of the 'routine' tab, there are various other tabs for each game state, like 'intro', 'first night' or 'boss call'

The buttons are also generated from specific text inside a sheet cell, so I was able to link from one cell to another simply by typing in the cells name. This came in quite handy to quickly generate a branching narrative:

Furthermore I had a 'string-replacer' system that would replace placeholder text with dynamic content, like for example writing $$STUDENT_NAME$$ would give you the first name of the current student, and $$HE_SHE$$ or $$HIS_HER$$ the appropriate style of addressing that person. One of the more fancy ideas was to implement a realtime weather request: when people in the game refer to the weather or temperature outside it's in fact actual realtime weather data queried from Beppus coordinates.

There is quite a big sheet behind all this, and as the story got bigger and more complex it was very important to keep the sheet clean and overseeable (spoiler: it became a complex mess!).

merging content generation and game system

Content generation and game system were two completely separate parts for the longest time - which worked well for prototyping but was quite difficult when they both became more sophisticated and had to be merged together.

The good thing is that by that time I was almost finished with the game system:

  • you could basically play a digital version of 'who is it'
  • the game was always beatable: at the end you are 100% sure who the culprit is, there is no guessing
  • to achieve a nice difficulty curve and at the same time not make solving too easy I implemented an algorithm that could calculate the steps necessary to solve a case (and this was really tricky, because you would often rely on the 'method of elimination' to solve difficult cases)

The method of elimination worked like this: take for example a case where you know that the prankster likes rice. If you know what each person likes to eat, this is a very valuable information. But if you would only know that the prankster does NOT like to eat potatoes, this leaves much more options open, and makes solving the case more difficult.


There also have been various prototypes before I arrived at this concept, one of them had the idea to tie up the garbage as precise as possible:

Another prototype felt more like an "office-worker-simulator" and was based on requests and tasks that have to be finished:

I hope you enjoyed clearing up this little case, let me know if you want to read more articles like this in the future!