About Dietrich Epp (twitter: @DietrichEpp)


Ludum Dare 36
Ludum Dare 34
Ludum Dare 33
Ludum Dare 32
MiniLD #57
Ludum Dare 31
Ludum Dare 30
Ludum Dare 29
Ludum Dare 26
Ludum Dare 24
Ludum Dare 22

Dietrich Epp's Trophies

Dietrich Epp's Archive

Trying, Trying, Trying

Posted by (twitter: @DietrichEpp)
Sunday, December 11th, 2016 7:31 am

Trying, trying, trying but it’s not a game yet.

Crew Report

Here’s your intrepid, randomly-generated crew. With cool sunglasses. You’ll have to earn those.

Space Ship

And here’s the Expensive Undertaking, a badly damaged ship with only enough power to run one room at a time. Uh oh! Well, that’s the view in the Unity editor. I ditched vanilla JavaScript this time around, and I probably should have done it earlier.

This is actually my first Unity game that’s not a team game. Let’s see how badly it goes!

So, I got it this time

Posted by (twitter: @DietrichEpp)
Sunday, August 28th, 2016 8:27 pm

I made it. I was reckless, I worked on the build system for almost a full day before starting work on the game itself! Needless to say, much was cut, but I’m still pleased with the result.


It’s a damn short game, that’s what it is. Time to sleep, I’ll play your game tomorrow… but first, a post-mortem.

What went wrong: Working on a build system for almost a full day (9PM Friday to 3PM Saturday). I was in the middle of reorganizing all my game projects when Ludum Dare hit, and I really just wanted to finish the job. Game physics was a pain, as usual. Didn’t get enough sleep.

What went right: Having used P2 and Phaser separately, there were a few things that were much easier because I was using them together. For example, teleporting a physics-enabled sprite in Phaser was a bit of a pain and web searches revealed no solutions, but it became much easier when I just dived into the guts of P2. I felt like feature prioritization went fairly well once I was actually working on the game, and I didn’t dawdle polishing irrelevant bits like I sometimes do (with the exception of the build system).

I feel like this is the first compo game I’ve done where all the pieces are there, so to speak. Animations, sound effects, and levels are all there. Just not very many :-)

Link: http://ludumdare.com/compo/ludum-dare-36/?action=preview&uid=7606

Progress report… and combat simulations

Posted by (twitter: @DietrichEpp)
Sunday, April 17th, 2016 1:40 am

To test game balance, I wrote a script to test combat between all possible shapes you can shift into. It’s basically an automatic 2v2 arena with the results summarized in a table. The first number in each cell tells you how often the monster to the left wins, and the second number tells you how often the monster at the top wins.

So you can see that the “air” monster is quite victorious, only losing fights against the mage–and even then, it still wins 22% of the time. I’m going to have to nerf that monster a lot. Or maybe I’ll just stick it at the end. The bat is also a bit overpowered.

“Unicorn” and “glip” don’t win, but they’re not really supposed to win by themselves.


Totally in

Posted by (twitter: @DietrichEpp)
Friday, April 15th, 2016 10:07 am

I’ll have to cut my participation short this year, but by no means am I going to give up. Just going to have to make it smaller! I’m going to try and squeeze everything into 36 hours or so.

Going to use raw WebGL again, and this time I’ve got most of a proper text system. I can mess with the text in the vertex shader, and get nasty output like this. And hey–it handles kerning properly and calculates line breaks with the Knuth-Plass algorithm, because I have fun overengineering things.


Visualizing Gameplay with D3.js and SQL

Posted by (twitter: @DietrichEpp)
Thursday, May 7th, 2015 6:37 pm

Chaos Tomb is too hard. What makes it too hard? Short answer: I made the treasure too hard to reach, so players were poorly equipped to play the game. I should have made weapons and hearts easier to access, and hidden something else (gold coins, stars, collectible keychains) around the levels to challenge players. For the long answer, see the full article, complete with visualizations using D3.js.


Full article

Chaos Tomb Post-Mortem

Posted by (twitter: @DietrichEpp)
Saturday, April 25th, 2015 1:13 am

Time for a post-mortem of Chaos Tomb.

The game does report some basic progress stats to me, and I’ve been checking up on how well you guys are doing. It’s a bit humbling, to be honest! It seems like my game is hard… even too hard… unless, like me, you were playing it and tweaking it for 72 hours straight. Not even one player from the Ludum Dare website has visited all 14 levels in the game, although a couple players have come close.

Went worse than expected

It’s not obvious what to do. To be clear, you get in, pick up weapons, and get out. You don’t need to clear the levels. The “exit” signs may be a bit ambiguous, too.

It’s not obvious that you can (sometimes) just run past the monsters. The first area with monsters also holds the first weapon. If I had put another area early on with monsters but no weapons, players would have been forced to run past the monsters without killing them, so they would realize that you don’t have to fight them. This is also a good strategy to use if you have the shield generator.

Picking up treasure—I wanted to reward exploration, but I was too miserly

The game is completely non-linear. It’s based around a hub, and players can explore as much as they wanted. But this meant that players often missed some items when they went on to play harder levels. I saw someone playing one of the later levels without picking up any extra hearts first—while certainly doable, they were having a rough time. I should have put more treasure in the player’s path early on. Especially hearts, which are more often in difficult-to-reach locations. In fact, now that I think about it, there is only one heart in the game that you can just pick up… the others require tricky jumps or other special techniques. If that one “easy” heart is hard to get because you get a bad weapon load-out, the game’s not going to get any easier.

The brick breaker—far too situational

The brick breaker is a garbage weapon. It wasn’t supposed to be quite so garbage. Unfortunately, I was unable to get it to bounce correctly off of the boundaries of the world. It could only bounce off of level tiles. Instead of putting ceilings on all of the levels, I let the brick breaker become a much too situational weapon. It also only bounces a couple times before exploding. Ideally, it should be able to bounce all over the place before hitting its target.

You can get two garbage weapons right at the start. I’m talking about the potato and the brick breaker. If you pick those two up, just go ahead and start a new game (unless you like the challenge). The game should only give you the potato once you already have a couple good weapons.

The gun—good weapon, no opportunities to use it

There’s no good opportunity to use the “ultimate weapon”, which is the gun. Once you’ve collected everything, there should be a final gauntlet to play through with all of the weapons and plenty of hearts. Instead, you just head back to the starting area and out the exit.

Went better than expected


After We Saved the World: post-mortem

Posted by (twitter: @DietrichEpp)
Monday, February 23rd, 2015 12:09 pm

After We Saved the World is a tactical RPG with a twist: you start out with all of the characters, all of the best items, and all of the most powerful skills, and you must return everything back to the way it was when you lived in generic fantasy village #3. All in all, I’m counting this one as a success, but it was a rough ride.

What went wrong

  • Stubborn refusal to use an existing game engine. That’s right: the game is built on nothing more than WebGL and a couple random libraries like howler.js. Worse still, I came into this project with front-end development skills that were novice at best, so I had to sink a lot of time into learning how to use node.js and gulp and things like that.
  • Bad timing with work. I know—I’m who’s running this Mini LD, and I could have just chosen a week where I didn’t have as much of a conflict with work! But I just didn’t plan everything out well enough. A bit of stress and overwork had me on a bad sleep schedule before the project even started, but by the end of the week I managed to get some consistent good nights of sleep in.
  • Large scope. This is the perennial problem with Ludum Dare games, or games in general, or heck, software projects. A tactical RPG, what, was I insane? It turns out I just had barely enough time to get combat and basic game structure working before the end of the week.

What went right

  • Creative Commons assets. Even though I had always made my own assets for Ludum Dare in the past, I decided to go the Creative Commons route for almost everything except for music and a few odd UI elements. I managed to find some great sprites, textures, and icons on opengameart.org. Not only is it better than what I could have done by myself, but the whole thing even looks like it was supposed to fit together.
  • Rolling my own WebGL code. I know that this is also in the “what went wrong” column, but I’ve been doing OpenGL for long enough that my first thoughts after picking a genre were along the lines of, “ah, I know how I want to batch this data”, and “these are the shaders I need.” I even managed to simplify the pointer hit test code: rather than write a bunch of geometry code to calculate which tile the player clicked on, I just read the coordinates out of a special WebGL buffer.
  • Choosing a concept that is both new and fun. I love tactical games, and that enjoyment transferred well to the project. But I had never made a tactical RPG before—to be honest, I only ever played Avernum—and that meant I wasn’t rehashing a game that I had made before.

I’d post a link to my game, or a screenshot, but something is wrong with the time vortex. Check back later.

Mini LD #57 — Reversed

Posted by (twitter: @DietrichEpp)
Sunday, February 15th, 2015 2:58 pm

!esreveR – 75# DL iniM

Your goal is to make a game which is somehow REVERSED.

As a bonus, please write your post-mortem first, before you start making your game. Tell us what went wrong and what went right… then go make your game!


Q: Can I…

A: Yes.


You have the week from Friday, February 20 to Friday, February 27. Submissions will close on the 28th, and I will record gameplay videos for as many games as I can manage.

Bonus theme

The bonus theme is Chinese Zodiac… happy year of the Goat!

Ludum Dare #31 Episode 5

Posted by (twitter: @DietrichEpp)
Friday, December 19th, 2014 5:25 pm

Twelve more cool games from Ludum Dare #31! The backlog is a little bit smaller now, feel free to send me requests :-)

  1. Finish Your Project (Compo) by AgentParsec
  2. Sheep enchanter (Compo) by jsmtux
  3. Press i for inventory (Jam) by mr_tag
  4. Galvatross (Jam) by MrShoestore (twitter: @shlfstudios)
  5. SQUISH AND BOUNCE (Jam) by waveformmodulations
  6. The Spy (Jam) by cyrus
  7. INtire (Jam) by A Flat Miner Studios (twitter: @AbMinerStudios)
  8. Pipe Quest (Jam) by HotBoxGames (twitter: @HotBoxGames)
  9. Swotch (Jam) by Ulydev
  10. pOp (Jam) by Ulydev
  11. Batz (Compo) by recursor (twitter: @recursor)
  12. Life of a Geek (Compo) by Tommyno222 (twitter: @TomasBencko)

Ludum Dare #31 Episode 4

Posted by (twitter: @DietrichEpp)
Thursday, December 18th, 2014 9:50 pm

Another thirteen cool games from Ludum Dare #31, bringing the total to 50! I’m still taking requests, but there’s a bit of a backlog so it may take some time before your game appears in a video :-)

  1. Rare Earth (Jam) by Thingo Studios
  2. TMO (Compo) by aaronjbaptiste (twitter: @aaronjbaptiste)
  3. Möbius Dungeon (Compo) by nesis (twitter: @llnesisll)
  4. Scan Lines (Compo) by KilledByAPixel
  5. Fluidity (Compo) by WetDesertRock
  6. Kevin’s uncommon story (Jam) by Zimennik
  7. 0000 : Press Z (Compo) by alvarop (twitter: @theotheralvaro)
  8. Case #31 (Jam) by Pestel Crew
  9. Dimensions (Compo) by mystakin (twitter: @mystakin)
  10. Myopia (Jam) by Team Myopia
  11. Houston, We’ve Got a Problem (Jam) by MrBadIvan
  12. Walk the Plank (Compo) by MiniBobbo
  13. Fruit Factory (Jam) by abdurrahmankh (twitter: @Abdurrahman_Kh)

Ludum Dare #31 Episode 3

Posted by (twitter: @DietrichEpp)
Monday, December 15th, 2014 7:32 pm

Another twelve cool games from Ludum Dare #31… Send me your game and I’ll record a video! I currently have a short backlog of requests, so if you made your request last time around, it’s on my list. But keep the games coming :-)

  1. One Act (Compo) by Sheepolution (twitter: @Sheepolution)
  2. 2P – BounceEmUp (Jam) by Kuality Games (twitter: @KualityGames)
  3. Slam Dunkin’s Beat The Crap Out Of Everybody (Jam) by sP0CkEr2 (twitter: @sP0CkEr2)
  4. Fibonacci Grid (Compo) by Andrew Adams (twitter: @andyjamesadams)
  5. A MAZE inc (Compo) by 5you
  6. GTAlien (Jam) by Pulsartronic (twitter: @pulsartronic)
  7. Meme Pixels THE GAME (Jam) by TrentSterling (twitter: @Trent_Sterling)
  8. Frosty Ninja (Compo) by belva1234
  9. The Lonely Realm of Tom Thaum, the Space Wizard (Jam) by JJEvil (twitter: @joeyjandrews)
  10. SumoBall! (Compo) by flyingbear
  11. Vibrant City (Compo) by Anshul Goyal (twitter: @goyalanshul)
  12. Fantastic Ludum Dare theme generator (Jam) by Rick Hoppmann (twitter: @tinyworlds)

Ludum Dare #31 Episode 2

Posted by (twitter: @DietrichEpp)
Saturday, December 13th, 2014 2:52 pm

Thirteen more cool games from Ludum Dare #31… Send me your game and I’ll record a video!

Caved In
KudukuForgiveUs (Compo)

That Dangerous Bridge
Shackhal (Compo) @shackhal

The Harrowing
K.Chplr (Compo) @kchplr

Stay Frosty
trenchgames (Jam) @TrenchGames

Last Ark
Nuclear Napalm (Compo) @NuclearNapalm

kipelovets (Jam)

Walk to the door
el-pepi (Compo)

Space Cube
lxd1 (Compo)

Thermonuclear War
panda (Compo)

SuperDisk (Compo)

On The Field
redoxkun (Jam)

Vanitas I
ProgrammerPony (Jam)

Towards Light
Last Man Standing (Compo)

Ludum Dare #31 Episode 1

Posted by (twitter: @DietrichEpp)
Friday, December 12th, 2014 4:58 pm

12 cool games from Ludum Dare #31. Send me links and I’ll get your games on video!

Five Weird Games

Posted by (twitter: @DietrichEpp)
Friday, September 12th, 2014 10:01 pm

Here are five weird (and cool) games from Ludum Dare #30 which I’ve reviewed, now that I reached the 100 games mark.

Title: A Roller-Skating A-List Odyssey
Author: AnnaGavaldaKedavra
Category: 48 hour compo

Author: stvr
Category: 48 hour compo

Title: The Bacon Uprising
Author: Tigro
Category: 48 hour compo

Title: Titania
Author: Incredible Ape (@IAOfficial)
Category: 72 hour jam

Title: Sllukswefa
Author: Nanolotl (@nanolotl)
Category: 48 hour compo

This wouldn’t be complete without a plug for my game, Dreamless.

I dream of post-mortems

Posted by (twitter: @DietrichEpp)
Monday, September 8th, 2014 10:59 pm

Ludum Dare #30 was my fifth successful Ludum Dare, which brings me to a 50% success rate. Yay! Time for a post-mortem.

By the way, you can also play my game.

What went right

The engine. I wrote the engine in C++ this time, and took notes from an article called “Programming M. C. Kids” Iz-Tavares and Chang. The platformer physics turned out rather well, and the game feels responsive but not crazy. There was even enough time for some tricky shader effects, and I’m going to show those off in a GIF:

Dreamless Gameplay

Dreamless Gameplay

Core gameplay. Once the gameplay concept got to its final, simplified form, I could focus on implementing it and writing levels. The level format was just ASCII text, so I could crank them out pretty quickly, and I ended up with 9 levels.

Sound effects. Just a couple hours with a microphone (and some music software) were all it took. There are 13 sounds with an average of 5 variations each, and the engine picks a variation at random each time a sound is played. The effect is rather nice, especially for the footsteps.

Dialogue This was the last piece of code implemented, but it gives crucial context to the game. The writing isn’t great, but I’m really glad it’s there.

Analytics. I keep a record of every time a level is beaten or restarted, along with a couple other things. Here’s a chart of the statistics for each of the 9 levels. You can see that about 60% of the players who start the game finish it, and players who get to level 8 restart it 2.5 times, on average.

Chart of level data

Analytics for “Dreamless” by level

What went wrong

No tutorial. The game doesn’t exactly throw you into the deep end, but it does very little to tell you what you’re expected to do. This was painfully obvious once I watched someone else play the game. For everyone who played my game: thank you for taking the time to figure things out!

The worst part is the double jump. I was careful to make it so you could beat the game without the double jump, but there are some places where you have to restart if you don’t know about the double jump.

Slow start to the project. Looking at the commit logs, the game didn’t even respond to input until 16 hours into the contest, and jumping didn’t work until 21 hours had passed. I spent the time refactoring, messing with base code, and other things that don’t make games.

Not enough time on graphics and music. With only an hour and ten minutes left to go, I cranked out a music track and a bunch of sprites. I spent less than 10 minutes on music, and that’s including the time it took to start up the sequencer. I picked out two chords (Cm9 and Gm9), hit record, and rendered the result to disk without editing it at all. I even used the default patch you get when you start a new song!

Special Thanks

Special thanks to Obsolete Entertainment, who put footage of gameplay for Dreamless on YouTube. In general, thanks to everyone who posts videos of the games they play!

Base code declaration

Posted by (twitter: @DietrichEpp)
Friday, April 25th, 2014 11:05 pm

Here’s my base code. Just about to dive into coding, and I hadn’t decided what programming language I was going to use until now. BSD license, about 1.6k lines of C++ with SDL and OpenGL.


[cache: storing page]