~/blog/cultivate-post-mortem

Cultivate Post-Mortem

by Kyle Travis on 2016-01-03

Hello there! With just over a day remaining in the voting period, it seemed like a great time to finally write up a post-mortem for my experience this time around. I've included my favorites/recommendations of the entries that I've played so far at the end of this post.

Of course, if you haven't played the game yet I would love to get your feedback! Visit the game page here.

Overview

This was a really interesting Ludum Dare for me -- the second I've completed an entry for (and the fourth or fifth that I've actively attempted.) The idea of an adventure game with binary choices that lead to branching paths seemed like it might easily get out of hand and too ambitious for the compo, but I wanted to attempt it anyway. If nothing else, it would be an exercise in limiting scope -- something I usually struggle with in game design.

Ultimately I ended up with an entry that I'm really proud of: despite a few issues it feels reasonably complete (though I would have been pleased to add music!), and represents the original concept well.

Inspiration

My main inspirations for Cultivate were (in no particular order):

Story

Overall there are several different "sub-stories" within the game, which are seen based on making different sets of choices. For those interested, I'll outline a couple of them, and their endings, here. It should go without saying, below there are SPOILERS for the game!

I'm not sure whether anyone has seen some of them yet, so if you play I'd love to hear your experience!

End SPOILERS

Tools

Technical

If you are interested, I hosted the source in a GitHub repository. I encourage you to check it out!

I spent most of my 48 hours programming the components that script the scenes of the game. The design I went with was almost like a domain-specific language in itself for representing a (non-linear) scene within the game's story as a C# Dictionary of "Action" objects, which the engine would iterate over, performing the appropriate functions. With more time I think I would have looked for a more elegant way to write and parse these scripts, but given the reality of the time crunch I had to go for what would allow me to write the story quickly, and provide the bare minimum of functionality (I had a very hard time avoiding feature creep here -- it was easy to get excited about an idea and start refactoring to implement it).

A snippet of a scene from the script like this:

{ "waking", new Scene(
                SET.TIME(0800),
                SET.BG(""),
                SET.MSG("( ... )"),
                A.WAIT(),
                SET.MSG("( you can hear the most horrible sound )"),
                A.WAIT(),
                SET.MSG("*BZZZT* *BZZZT* *BZZZT*"),
                SET.CHOICES(
                    new Choice("Snooze...", INC.TIME(0010)),
                    new Choice("Open your eyes, turn it off", A.GOTO("awake"))
                ),
                SET.MSG("( ... )"),
                A.WAIT(),
                SET.MSG("*BZZZT* *BZZZT* *BZZZT*"),
                SET.CHOICES(
                    null,
                    new Choice("Open your eyes, turn it off", A.GOTO("awake"))
                ),
            A.LABEL("awake"),
                SET.BG("waking-up"),
                SET.MSG("Ah, another fine school day. ( you urgently need the restroom )"),
                A.WAIT(),
                SET.SCENE("bathroom")
    ) }

It ends up looking a bit like Assembler-style directives, that block and branch at calls to "SET.CHOICES(...)" based on the player's response. I use a very simple system of "labels" to jump (i.e. "GOTO" places in the script). Not shown here are the stats which are stored in a dictionary and modified via "SET" and "INC", as well as conditional actions, which will branch based on the values of those stats. This allowed me to do things like change a line of dialogue, or an entire scene, based on the player's "empathy" stat, for example.

This system has a fair number of limitations, but it did allow me to write the story quick enough to finish in time. The entire scenes file contains almost 1200 lines of these actions which I spent most of the second day writing. Needless to say, my hands were a bit tired by the end of the compo!

Roundup

The good:
The bad:

Recommendations

Overall my favorite part of this Ludum Dare has been playing everyone's entries, I've seen so many that blew me away! The theme(s) really seemed to inspire people this time around. Here are a few that I wanted to mention fondness for -- again in now particular order, and I'm sorry if I've forgotten to include your entry! It's hard to remember all of the amazing games.

Fruit Wolf (Jam)

I love this entry: the style, the concept, the music -- all fantastic!

Grow Your Love (Jam)

Another amazing interpretation of the themes. I can't overstate how charmed I was by the aesthetic and music -- though it should be mentioned how cleverly the gameplay is designed. Even for the Jam, I am amazed by the level of polish here.

Acrodog

Adorable, challenging and addictive. This was another entry that seemed to naturally fit within the theme while feeling very unique.

Tamamystery

I don't think I can accurately describe this one, other than to say it was very clever! Lots of nostalgia, and a very complete experience.

The Serpent's Shadow

Created for/with Pico8, this is a fantastic puzzle game with a great visual style, music, and a puzzle-solving mechanic that feels really innovative.

Initial Conditions

A deceptively simple puzzle game. Overall this entry had excellent design, and some really challenging levels. Beyond that, it even incorporates impressive voice-acting between puzzles.

Nomads

Moving and minimalist. Attempts a different type of game that fits the theme well, and succeeds in being captivating (to me, at least!)

Though there were many others I played and greatly enjoyed, this list is already getting quite long! If you have an entry I haven't commented on, link it in the comments, I'd love to see it!

Thank you for reading, and making this LD awesome. Happy New Year!