Devs Discuss: Random Events

If you’re curious about random events in games, you might want to check out this discussion between Johannes from Curious Expedition, Marco from Picaresque Studio and me where we discuss just that. The three of us are all developing travel-games with random events, so that topic fit quite well.

Inspired by a throwaway twitter comment, this improvised chat is just over an hour long and features a bunch of interesting points about the goals and design of these events. So if you’re into that sort of thing, check it out!

– Martin

Unity UI ScrollRect Tools

Working on Nowhere Prophet I built two quick tools for the ScrollRect. I wanted to briefly post them here so maybe someone else can get some use out of them.

One called the ScrollRectTweener can take control over a ScrollRect and smoothly scroll it to a given normalized target position. If the player moves the view while the tweener is acting, then it aborts it’s movement, but you have the option to lock out the player drag when it is working.

The second is the ScrollRectLinker. This component can be put on one scrollRect to link its normalized position to the normalized position of another scrollRect. That way simple parallax scrolling can be quickly set up.


using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;

public class ScrollRectTweener : MonoBehaviour, IDragHandler {

	ScrollRect scrollRect;
	Vector2 startPos;
	Vector2 targetPos;

	bool wasHorizontal;
	bool wasVertical;

	public float moveSpeed = 5000f;
	public bool disableDragWhileTweening = false;

	void Awake() {
		scrollRect = GetComponent<ScrollRect>();
		wasHorizontal = scrollRect.horizontal;
		wasVertical = scrollRect.vertical;

	public void ScrollHorizontal(float normalizedX) {
		Scroll(new Vector2(normalizedX, scrollRect.verticalNormalizedPosition));

	public void ScrollHorizontal(float normalizedX, float duration) {
		Scroll(new Vector2(normalizedX, scrollRect.verticalNormalizedPosition), duration);
	public void ScrollVertical(float normalizedY) {
		Scroll(new Vector2(scrollRect.horizontalNormalizedPosition, normalizedY));
	public void ScrollVertical(float normalizedY, float duration) {
		Scroll(new Vector2(scrollRect.horizontalNormalizedPosition, normalizedY), duration);
	public void Scroll(Vector2 normalizedPos) {
		Scroll(normalizedPos, GetScrollDuration(normalizedPos) );

	float GetScrollDuration(Vector2 normalizedPos) {		
		Vector2 currentPos = GetCurrentPos();
		return Vector2.Distance( DeNormalize(currentPos), DeNormalize(normalizedPos) ) / moveSpeed;
	Vector2 DeNormalize(Vector2 normalizedPos) {
		return new Vector2(normalizedPos.x * scrollRect.content.rect.width, normalizedPos.y * scrollRect.content.rect.height);

	Vector2 GetCurrentPos() {
		return new Vector2(scrollRect.horizontalNormalizedPosition, scrollRect.verticalNormalizedPosition);
	public void Scroll(Vector2 normalizedPos, float duration) {
		startPos = GetCurrentPos();
		targetPos = normalizedPos;
		if (disableDragWhileTweening) 

	IEnumerator DoMove(float duration) {

		// Abort if movement would be too short
		if (duration < 0.05f)
			yield break;

		Vector2 posOffset = targetPos - startPos;

		float currentTime = 0f;
		while (currentTime < duration) {
			currentTime += Time.deltaTime;
			scrollRect.normalizedPosition = EaseVector(currentTime, startPos, posOffset, duration);
			yield return null;

		scrollRect.normalizedPosition = targetPos;

		if (disableDragWhileTweening) 

	public Vector2 EaseVector(float currentTime, Vector2 startValue, Vector2 changeInValue, float duration) {
		return new Vector2(
			changeInValue.x * Mathf.Sin(currentTime/duration * (Mathf.PI/2)) + startValue.x,
			changeInValue.y * Mathf.Sin(currentTime/duration * (Mathf.PI/2)) + startValue.y

	public void OnDrag(PointerEventData eventData) {
		if (!disableDragWhileTweening)
	void StopScroll() {
		if (disableDragWhileTweening) 
	void LockScrollability() {
		scrollRect.horizontal = false;
		scrollRect.vertical = false;
	void RestoreScrollability() {
		scrollRect.horizontal = wasHorizontal;
		scrollRect.vertical = wasVertical;



using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;

public class ScrollRectLinker : MonoBehaviour {

	public bool clamp = true;

	[SerializeField] ScrollRect controllingScrollRect;
	ScrollRect scrollRect;

	void Awake () {
		scrollRect = GetComponent<ScrollRect>();
		if (controllingScrollRect != null)

	void MirrorPos(Vector2 scrollPos) {

		if (clamp) 
			scrollRect.normalizedPosition = new Vector2( Mathf.Clamp01(scrollPos.x), Mathf.Clamp01(scrollPos.y) );
			scrollRect.normalizedPosition = scrollPos;



– Martin

Unity Editor: Enum Flags as Toggle Buttons

Note: We’ve since cleaned up this code, added view options and released it as a cheap plugin on the Unity Asset Store.

Working on the content tools for our current project I needed enum flags, unfortunately the Unity Editor doesn’t natively support those. Looking around I found a few implementations of enum flags as dropdowns similar to the layer mask dropdown in Unity itself. While that’s pretty neat it has the disadvantage that you don’t have a quick overview over which flags are on and which are off. To that end I’ve built a new custom PropertyDrawer that displays EnumFlags as a neat row of toggle buttons:

Toggle Buttons in Action

Toggle Buttons in Action

All you need is two scripts and an attribute. Also note that your enum needs to start with 1, not 0 and that each value needs to be a power of two (1, 2, 4, 8 etc.)

And here’s the code:


This file needs to go in a regular scripts folder (not Editor!). It creates the [EnumFlags] attribute.

using UnityEngine;

public class EnumFlagAttribute : PropertyAttribute
	public EnumFlagAttribute() {}


This one goes into an Editor folder. It manages the display of fields that have the [EnumFlags] attribute.

using System;
using UnityEditor;
using UnityEngine;

public class EnumFlagsAttributeDrawer : PropertyDrawer

	public override void OnGUI(Rect _position, SerializedProperty _property, GUIContent _label)
		int buttonsIntValue = 0;
		int enumLength = _property.enumNames.Length;
		bool[] buttonPressed = new bool[enumLength];
		float buttonWidth = (_position.width - EditorGUIUtility.labelWidth) / enumLength;

		EditorGUI.LabelField(new Rect(_position.x, _position.y, EditorGUIUtility.labelWidth, _position.height), _label);

		EditorGUI.BeginChangeCheck ();

		for (int i = 0; i < enumLength; i++) {

			// Check if the button is/was pressed 
			if ( ( _property.intValue & (1 << i) ) == 1 << i ) {
				buttonPressed[i] = true;

			Rect buttonPos = new Rect (_position.x + EditorGUIUtility.labelWidth + buttonWidth * i, _position.y, buttonWidth, _position.height);

			buttonPressed[i] = GUI.Toggle(buttonPos, buttonPressed[i], _property.enumNames[i],  "Button");

			if (buttonPressed[i])
				buttonsIntValue += 1 << i;

		if (EditorGUI.EndChangeCheck()) {
			_property.intValue = buttonsIntValue;

I hope you enjoy it. And if you’ve got comments or ideas, let me know!

– Martin

Update: Note about the Unity Asset Store release of an updated version of this code added.

Tooltips with the new Unity UI (uGUI)

Since I needed tooltips to test something really quick I went to see if there was an implementation in the new uGUI system. Unfortunately there were none but a few custom made solutions from other devs. None of those suited me though, so I quickly built my own, very rough version. It consists of two scripts and a view that is the tooltip.

Tooltip Demo

Tooltip Demo


This script is put on all the objects you want to trigger the tooltip. It contains the text that should be shown as a public variable. Everything else is handled by the TooltipView.

using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;

namespace Sharkbomb.View {
	public class TooltipTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler {

		public string text;

		public void OnPointerEnter(PointerEventData eventData)
			StartHover(new Vector3(eventData.position.x, eventData.position.y - 18f, 0f));
		public void OnSelect(BaseEventData eventData)
		public void OnPointerExit(PointerEventData eventData)
		public void OnDeselect(BaseEventData eventData)

		void StartHover(Vector3 position) {
			TooltipView.Instance.ShowTooltip(text, position);
		void StopHover() {



This script is put on a separate uGUI object that is the actual visible tooltip. It’s a singleton so the many TooltipTriggers can access it quickly and easily.

using UnityEngine;
using System.Collections;

namespace Sharkbomb.View {
	public class TooltipView : MonoBehaviour {
		public bool IsActive {
			get {
				return gameObject.activeSelf;
		//public CanvasGroup tooltip;
		public UnityEngine.UI.Text tooltipText;

		void Awake() {
			instance = this;

		public void ShowTooltip(string text, Vector3 pos) {
			if (tooltipText.text != text)
				tooltipText.text = text;

			transform.position = pos;

		public void HideTooltip() {
		// Standard Singleton Access 
		private static TooltipView instance;
		public static TooltipView Instance
				if (instance == null)
					instance = GameObject.FindObjectOfType<TooltipView>();
				return instance;

As said, it’s a very simple script. There’s a bunch of things it doesn’t do and a few things to be aware of:

– It doesn’t wait a second before showing the tooltip.
– It currently places the tooltip over the object when selecting it via keyboard
– The tooltip can leave the boundaries of the screen and become (partially) invisible
– The tooltip doesn’t move with the cursor – that means it can block raytraces and cause flickering as it blocks the ray to the hovered object, disappearing and reappearing in a new pos

Fast ScriptableObject Creation in Unity

ScriptableObjects can be a very useful feature of Unity but they’re a hassle to create. Here’s a way to do this quickly:

Scriptable Object Context Menu

Scriptable Object Context Menu

In the stock interface there is no way to create ScriptableObjects. Most solutions I found solve this by adding a MenuItem to the top bar. This item then creates a ScriptableObject .asset file of a specific class. This is works but it requires you to adjust the script for each project so it points to a class of that pr oject. It also requires you to create a specific script for each of your classes, even if that might otherwise not be neccessary.

Our ScriptableObjectContextEditor script avoids these problems. Instead of the clumsy menu, it allows you to create .asset files directy from the project pane, where you’d expect it. Not only that, it also has an implementation that allows you to select a script file from which to create an asset, so you don’t need to adjust the script for each project. However if you want to do that you can make use of a generic function provided to create additional pulldown options for specific classes of your own.

Art Direction for Video Games

Art Direction Crash Course!

Art Direction Crash Course!

This Saturday, September 27th the stupendous Anjin Anhut and I will stream another crash course. This time it’s three hours of art direction for video games. You will be able to watch it live on the Sharkbombs Google+ Page.

Target Audience:

This course is intended for small developers, indie developers, students, freelancers and hobbyists who would like to learn more about how to create cohesive and appealing visuals and how to make them work within production requirements and technical limitations. This course provides methods and practices to find and define your artistic vision and to execute that vision alone or in teams.


We will cover research, working with references, establishing of visual language and style, style guide creation and art review.

All tipps and tricks work for a wide range of styles and many practices apply not only to video games but to comics and animation as well.

When you are joining live, you can ask questions or comment on what you see via the chat. The stream will be in an interview/lecture format in which I will hold the lecture and provide the content, while Martin will be in the role of student. We hope this conversation style format will create a helpful pacing and allow for a fun but also comprehensive course.


2pm German time. Here’s a handy widget to help you figure out your local time:

Time converter at


You can watch the video live on the Sharkbombs Google+ Page.
If you miss it you will be able to catch a recording on the Sharkbomb YouTube Channel.

We hope to see you there.

– Martin and Anjin

P.S.: While you wait you can take a look at our first Crash Course: Unity Basics.


So a few weeks ago I released Different, a short game about self-consciousness and first impressions. It’s a personal piece anchored in my experiences and perceptions.

Different Title

Different Title

At it’s core it’s a game about growing up as a non-white person in a predominantly white environment and how one’s perception of race changes slowly. In my case it’s the story of how constant encounters with casual racism made me more and more aware of the fact that I do look decidedly different from the “regular German”.

The most German kiddie picture of me I could find

The most German kiddie picture of me I could find

As a kid I was hardly ever confronted with racism of any kind, but the few instances that I did made the experience stand out strongly. Later in life the occurences have become a lot more frequent, if subtle. Nowadays it’s very common for me to meet someone for the first time, and then, within the first minutes, get asked about my origins.

It is this constant barrage of seemingly innocent questions (“Where are you from?”) and off-putting compliments (“Your German is really good!”) that has solidified in me the awareness of looking different. In the mind of my younger self, there was nothing that clearly separated me from anyone else. We were all different from one another, all in our own way.

In recent years these questions have started to frustrate me more and more, up to the point that I knew I wanted to build the game. It took a while from idea to execution but I am very happy with it. It’s an abstract game, that tries to recreate that experience and that slowly dawning realization, that you are seen as different.

Different Screenshot

Different Screenshot

With my growing awareness also came a frustration at being reduced to this part of me. This found it’s outlet in my answers to these remarks becoming increasingly curt and gruff. Something I’m struggling to let go again. Maybe the game is part of the process.

Warm Hearts (Lyst Summit 2014)

Have you ever slowly slid your finger into another person’s fist? Or have someone slide theirs into your fist? Give it a try. You might like it. I know I did.

And that’s not the only thing I did and enjoyed at Lyst Summit 2014 in Copenhagen last weekend.

Conference Info Envelope

Conference Info Envelope

I couchsurfed and I was on a boat. I got my hair braided and made rich_lem paint his nails with my polish. I made a game and danced in a dome. I learned how to do sex in Nordic LARP and I read a touching love letter. I gave and was given hearts. I felt comfortable and I laughed. I humped a man’s back and sang into a floppy piece of asparagus. Oh and I laughed. A lot.

To put it in a nutshell, Lyst was an absolute blast.

Foreplay (Getting there)

I’ve already spent this year visiting a few conferences. In Februrary I was in Amsterdam on Casual Connect. March was San Francisco with the annual Game Developers Conference. And finally in April was the terrific A Maze in Berlin. And after that I was done with conferences, until the astonishing Lucy Morris pointed out Lyst to me. Love, romance, sex and games? I knew I had to be there.

Since the year was pretty expensive already I was looking for a cheap couch to stay and fortunately the Lyst folks set me up with the Kajakklubben, a bunch of Dutch game developers, none of which I knew. I arrived late thursday, bringing 5 liters of good german beer with me. A traditional present for my gracious hosts. I’m not sure if it was me, their open attitude or the beer but we had a lot of fun making some impromptu music (or noise), talking and hanging out and suddenly it was two o’clock in the morning.

Dirty Talk (The conference)

Even though I meant to be there for the first talk the previous night’s escapades delayed my getting-out-of-bed somewhat. Getting on the bus I was at the love boat in time for the second session though. Yes, you read that right: love boat. The Lyst Summit was held on a boat, the MF William Jørgensen. Granted, I was a bit iffy on the idea, as my stomach tend to be sensible when it comes to these things. The boat featured one open area, where most of the festivities, chaired by non other than Richard Lemarchand, were held and it was appropriately decorated with hearts and made comfortable by a smattering of carpets. And best of all: It didn’t once leave the harbor. Otherwise I might have not enjoyed the excellent food as much as I did. Queasy stomach and all.

Arriving at the Boat

Ida arriving at the Boat

Keynote: Touching the Player

The first talk I caught was from Jaakko Stenros. He talked a bit about Nordic LARP, a scene of LARP in Scandinavia that often veers from the traditional fantasy LARP and into more expressive and experimental territory. He talked about how, in the late oughties they started looking for ways to simulate and abstract amorous interaction (love, sex etc.). Just as we don’t want to engage in actual violence within the game, there are enough reasons why we might not want to engage in actual lovemaking either.

Jaakko presented a few of these rules or methods. Among them such things as radio play, where the interaction is audibly telegraphed to inform the potential audience, without there being any actual interaction. Something often employed in LARPs with lots of tents. Or Ars Amandi, where only the arms and shoulders of the participants touch to model the encounter and it’s qualities – rough or gentle for example. Or using body painting as similarly sensuous abstraction.

Why the Games [4Diversity] Jam Mattered Matters

When Menno Deen took the stage he talked about his experiences with the Games [4Diversity] Jam he organized and how he tried to make the world a better place with it. So far the Jam has dealt with feminine and LGBTQ issues. The talk was enlightening to see his presentation but most interesting were the questions and comments afterwards.

So for the coming year the Jam is planing to deal with the issues of race. A topic I’m currently working on myself with my as-of-yet-unreleased game Different. Next to sex, race is an obvious and often talked about facet of diversity. But as the venerable Ernest Adams pointed out: Age is one too – one we often forget. Our industry is generally very young and only rarely deals with issues of age. The same is true for physical disabilities, something Menno himself was bound to find out, since his right arm was in cast from a bike accident.

Being the only Woman in the Room

Cristina Majcher was next. I met her at GDC earlier this year, sitting on the floor trying to breathe life back into my dying iPhone 5. We shared the power socket and a few words. She’s an industry journalist, covering games for a long time, and she talked about how she’s often the only woman in the room.

She is a very positive person and this came through in her talk as she tried to focus on the potential positives of such a situation. The super-power of being different from the rest can be a powerful asset. For example the unique perspective of the “lone woman” can be especially valuable.

She also spoke about a personal experience, that spoke to me in a slightly different context: She mentioned how she regularly got (and still does) these incredulous questions, after she mentions that she writes about games: “Oh, do you play?” and how she initially used these as a springboard to educate. But after more and more of these came she eventually got fed up and angry with them.

While I’m not the only woman in the room, I’m usually the non-white German in any room, especially outside game development. And I usually get the “Where are you from?” question, that has started to annoy me so much, I’ve started making a game about this (the above mentioned Different. And yes, you can play it. Soon. I promise).

However Cristinas positivity again shone through when she overcame her frustration and went back to trying to educate people instead, focusing on the good she can do when she hit’s this unreflected ignorance. Something I want to take to heart.

Reinventing Slumber Party Games

Lau Korsgaard took the stage to talk about their thoughts behind and experience with Spin The Bottle, their game for Wii U. He explained how slumber party games ride the line between innocent play and potential transgressive context. The talk was very inspirational and ended up being the springboard for the Game Jam project of my team, of which Lau was also a part.

Keynote: The Mechanics of Love

In the second one-hour keynote Ernest W. Adams stepped up to deliver a talk on human relationships and how they could possibly be simulated. He took apart a few games that try to deal with relationships. Among them dating sims, Leisure Suit Larry and Dragon Age. He showed how these are often troublesome, propagating very unhealthy systems of attraction or friendship. How you only need to give enough presents to your “target” until the final reward of sex is unlocked.

He also talked at length about the different ways with which relationships can be simulated, different preferences and weighting among other things. Most important to me though was his closing remark: Making love into a game is doomed to fail, as this will always overlay values of winning and game mechanics onto it. Simulating love however is a valuable pursuit.

Ellie’s Last Line

Unfortunately I missed a big chunk of Dr. Esther MacCallum-Stewarts talk, as I had to flee from the drastic Last of Us spoilers.

Arse Elektronika

Johannes Grenzfurthner of the artist collective Monochrom has been organizing Arse Elektronika for a few years now. The conference is not only a pun on the famous ars electronica, it’s also a honest-to-god conference about sex and technology. Each year dedicated to a different topic. Johannes gave us an intense and rapid fire look at a few of the conferences with anything from the 12 year development time of a personal butt-plug up to books on electrical stimulation. The world of sex and tech is wonderful and weird and this talk was a tremendously interesting (and entertaining!) look into that world.

Art - A special place for special people

Johannes on art: A special place for special people

Loving through Games, Designing for Compassion

In the days final talk Dr. Hanna Wirman, who works for the Hong Kong Polytechnic University recounted her experience in designing games for non-human animals. In her case she’s working with orangutangs, experimenting with games specific to their nature. Another very interesting talk and her playdoer for compassion was an excellent way to end the formal part of the conference.

Dinner and Games

With the talks done we played some games. We played a wild selection of getting-to-know-you games. And the weird and wonderful tale of the lovebirds was told. Players rubbed their beaks against one another in the shade of the gummi trees, while a violin played on. And moaning was heard as two players joined their rhythms in a version of the Dark Room Sex Game played with Playstation Move Controllers.

Dark Room Sex Game

Menno and Karin playing Dark Room Sex Game

After this we turned to dinner and then got started on the second part of Lyst: The game jam.

Play Time (the game jam)

Separated by the colors of our hearts we formed into groups. Mine, the purple hearts was made up of Cecilie Stranger-Thorsen, Lau Korsgaard and myself. We quickly knew we wanted to make a game that helps you to get to know people in your group a sort-of pub setting. With that out of the way we spent many hours discussing back and forth, coming up with ideas and throwing them away. At one point we had a game about escalating dares with the loser paying a round of beer. That ended with me singing the Rains of Castamere into a floppy piece of asparagus, to a crowd of strangers. Sexily.

Saturday rolled around and we were still struggling with lots of ideas. By then we knew we wanted something with lots of physical contact. The hands seemed ideal for this, as they are often used to touch others in the hand shake, and they are a very innocent tool but can also be used to get closer to someone. This would allow people to get more physically comfortable with one another without making anyone uneasy. However the game still eluded us until I brought up the German kid’s game of Commando Bimberle.

Here one player calls for a gesture and all other players need to quickly execute it. There’s an element of misdirection involved, as the lead player can say something different from what the gesture they make, trying to confuse others. This was the initial inspiration for our game but we knew we didn’t want the element of misdirection.

Sushi Hands

After this it didn’t take long for Sushi Hands to emerge. Without any tech we were able to play the game pretty instantly. We grabbed a few volunteers here and there and started testing out the game. As soon as we showed the gestures and had some people playing the giggling started and we knew we were on the right track. So I got off the boat for a bit to work in a less sway-prone environment as we started to refine the game:

We tried out a lot of different hand gestures to provide some variety while maintaing the suggestive nature of the game. We also found out that we needed a bunch of three-handed gestures to make even numbers of players more likely to lose hands. And we added the Sushi Train rule to break ties, which often happen around 6 players with 2 hands or 1 hand each. We also wrote the rules, something that is far more difficult than one imagines. We tested the rules over and over by letting new people read and explain them. In the end we rewrote them at least half a dozen times.

We also added the rule of switching seats at the end of the game. I have often experienced that when sitting around the table people usually only talk to the ones they are close to. Add to this the fact that people often only sit close to the people they know best and getting to know new people gets difficult. This rule makes it more likely for the seating to change and the players being able to engage other people, in the game and out of it.

Game Jam Presentations

On sunday the presentations of the games rolled around. A total of 11 games was produced during the jam. Most notable to me were the following:

Fever, game where multiple players need to join together to wrangle all the input on a controller into a very precarious position to recreate the pattern on the screen.

Touch of Three, which has two players control to human avatars in an escalating battle of physical contact. The players alternatingly decide on actions and the avatars decide whether to go through with them or not. Only if they perform the action does the player get points. The player to get the most points wins. Since riskier actions score more points but are more likely to be denied by the avatars the game makes the players try to explore and push the boundaries.

Touch of Three presentation

Touch of Three presentation

Dear You, a twine game that features two interactive love-letters. One to a little brother and one to a best friend. The is well written, honest and personal. It was touching to read.

Custody, is for two players, each playing one parent on one computer. Between them is the smartphone, which is the child around which play centers. Each computer shows a match 3 game that needs to be played to earn money. The child is also always with one of the two parents, requiring attention and distracting from work. At regular intervals the child is passed back and forth. In the end the player who performs best wins custody of the child in the end.

The jam was also ranked, with the winners being chosen by the participants. Custody came first with 10 hearts, Fever followed with 9 and Sushi Hands came in third with 8 full hearts. A very satisfying result for us.

Lyst Jame Scores

Lyst Jame Scores

The Climax (My Conclusion)

In case it wasn’t evident, but Lyst was a complete success for me. Despite not knowing anyone in Copenhagen and only having met two of the attendees briefly previously, I felt welcomed. It took no time for me to feel completely comfortable with All the participants rank among the most excellent of human beings. As do the organizators. The whole conference was simply made with love. everyone around. From the envelopes that contained all the paper, to the heart-shaped name-tags. Everything was excellent.

And even beside the conference and the jam we simply had an excellent time. There was great food, dancing, swimming, cupcakes, the spoiler boat, painting nails and even a chocolate fountain to be had. Granted, there was little sleep to be had, but that’s a price gladly paid.

So after these three spectacular days in Copenhagen I can confidently state two things:

  1. I find myself gently rocking back and forth as if I still was on a boat.
  2. And I will nevertheless be stepping on board again next year. After all Lyst has won my heart.
Lyst Nametag

Heart-Shaped Nametag

Ludum Dare 29 and Me

So earlier this week the 29th installment of Ludum Dare happened. This time the theme turned out to be the wonderfully evocative Beneath the Surface. Joachim and me had been meaning to join in for over a year now, and this time we managed to actually do so. However not together.

Ludum Dare Logo

Ludum Dare Logo

Joachim and his wife Mel joined the jam, which gave them 72 hours to build a game with a team. Their little piece is called Mars Station 23. Check it out! Considering this was Mel’s first time creating pixel art it turned out pretty damn nice.

I on the other hand took part in the compo part, which gives you 48 hours to build a game on your own. My little game is called Happy Birthday. It’s not a coincidence that my birthday is actually today. This Jam ended up being a very personal journey for me and I’d like to share it with you here. It’s going to be very candid and open. Also there will be spoilers for the game.

Happy Birthday Title Screen

Play Happy Birthday

First Thoughts

So, I started Ludum Dare knowing I didn’t have a lot of experience building a game completely on my own. Also I knew I had bunch of things planned on the weekend so I wanted to go with something really small. Having just recently played Electric Tortoise, which I enjoyed, I knew that I could do something of a similar complexity. I also still had the free version of the Unity Plugin Dialoguer lying around. This meant that this was a doable coding challenge and it would let me flex my writing muscles for a change.

So then, what could I write about given the theme of Beneath the Surface?

I quickly knew that I wanted to write about a conversation that could be only on the surface level, but if the player would want he could delve deeper and see what’s beneath the surface. I decided to deal with depression or sadness that’s hidden beneath the surface. This is a very personal issue that I’ve been dealing with for a while, one that has also impacted my creative side. In the last couple of months I’ve also had similar conversations with friends, from both perspectives. In essence this game ended up being a conversation with a weird sort of version of me.

Initially the game was supposed to be a real conversation, possibly even multiple spanning a few days. The idea was that it would be triggered by a serendipitous meeting of the two characters. However during development it eventually morphed into a single facebook-conversation (for pragmatic reasons) with the all too common “happy birthday!” post as the starting point. Posts like that are well-meant wishes and they are an excellent opportunity to get in touch with someone you rarely speak with, yet they almost never go deeper than a wish followed by a thank you.

My Facebook wall today

My Facebook wall today

So I had my start, my medium and my content.

The Message

I knew however that I wanted to make this conversation difficult. Talking to someone who has personal issues and is not very good at sharing is a bit like walking a tightrope. For me it’s finding the right mix of listening and providing some perspective when helpful. When I want to share, things take time and it’s sometimes better just to listen and not to provide lots of insightful advice.

There’s a lot of other things that can go wrong and that only make the other party feel worse. Some things I’ve encountered and others I’ve (unfortunately) practiced in the past. An obvious mistake is to not take someone’s personal experiences seriously enough. Or to outdo them by telling them how you’ve had it even worse in the past. Or by bringing in empty platitudes.

Because this decision between talking and listening is very important I decided that the the conversation always progress automatically, if you don’t decide on a line. This can be good in some cases, as your conversation partner keeps sharing, and can be bad in others when he’s left hanging.


So, then I went to work.

I started looking at Dialoguer and then adjusted it to build the conversation behavior I wanted. This meant mainly adding the wait times, the conversation history and adjusting the looks accordingly. This went pretty well. I was making good progress and feeling pretty good about this thing. The early sort of euphoric phase of a project, I guess.

A Brief Motivational High

A Brief Motivational High

However when the system was in place to build the conversaion I needed to start writing. And that’s when I pretty quickly hit a wall.


Whatever I wrote, I just wasn’t happy. I didn’t like my texts. Everything felt overly whiny. I was convinced nobody would care about this sort of self-indulgent bullshit. Why should they? Fucking artsy-fartsy crap. I tried to slog on but why would anyone want to play this at all?

Eventually I just gave up.

I put the project down and watch five episodes of The Wire to get my mind off it. I went out to a party and got drunk, yet the project wouldn’t really leave me.

A picture from my last birthday

A picture from my last birthday

In hindsight this is kind of funny for three reasons:

  1. I’m working on a game about being depressed and being dissatisfied with everything I’m working on because of that depression. And then of course I’m dissatisfied with the game I’m working on.
  2. I’m writing about loneliness and of course feel isolated. Everyone is having fun at awesome Ludum Dare locations, Jo is working with Mel and all I’ve got is my boring white Ikea desk and my monitor.
  3. I’m writing about the difficulty of sharing deeply emotional content. And of course I think it’s shit. I don’t want to bother anyone with my problems. The main reason I have such a hard time sharing my feelings.

So Sunday rolls around and I show the game to a friend of mine (Thanks Pepe!) looking for some positive feedback. It’s not enough though and I decide not to submit the game to Ludum Dare Compo. After all I didn’t work on in enough and most of the text is missing and a couple of other made up excuses. On Monday I think I could submit it to the Ludum Dare Jam but again chicken out.

However the itch remains.


Over the first few days of the week I talk to a few people about the game. Describing it and the ideas behind it. I feel silly doing so as it’s very personal, and I’m bad at this. But I know that talking about this helps me – I’ve learned that much.

And it did help.

Writing Process

Writing Process

Today I sat down, hungover from the early birthday celebration, to finally finish the game. I had to cut some content but now it’s done and I’m damned elated. Happy Birthday is not an excellent game and I don’t think the writing is anything special. But my journey has been.

I’ve finally managed to start a project and see i through the end, in spite of all the frustration and discontentment. After a long time of nothing I finally made a game again.

And god damn it that feels good.


Martin - Game Designer

Martin – Game Designer