The Last Soul, post-mortem

Posted by (twitter: @_Gaeel_)
May 12th, 2013 10:51 am

Hey there!

I made this
The Last Soul

Written in Lua for a bastardised version of Löve2D (fixes audio and optimises some thingies in 0.8, but is redundant since 0.9)

I used Sublime Text 2 with a heavily customised Arch Linux setup (AwesomeWM loaded with some funky scripts and a nice little dmenu kerfuffle which takes care of my workflow, YOU DON’T KNOW ME, DON’T JUDGE ME!)

For content, I used GIMP for graphics and Renoise for audio.

I am
Kevin 'Gaeel' Bradshaw
and I’m one of the founders of
Baptême du Jeu
and we organised this
Ludum Dare @ Kawenga with BdJ
with help from the awesome people at

So here goes for a DUAL Post-Mortem, commenting on the game itself, and the gathering we organised.

The theme really wasn’t an inspiration at first, and I found myself quite angry at it. After all, minimalism isn’t really a theme, but a quality. I laid down with my headphones, and played some Burial (a pretty awesome London-based artist) and halfway through Prayer (listen to this track for the next paragraph or so), I had this idea of a game where you find yourself as the last remaining human at the end of the inevitable yet inexplicable downfall of civilisation, and life itself.
I didn’t see this as a particular violent or depressing idea, simply the notion that nature just ends up overpowering order through it’s simple existence.
This kind of feeling is something that I come back to often, and sometimes I imagine characters fighting to their very last, terrified at the idea that their families, memories and belongings will simply fade away. Other times, I see a character accepting this fate as inevitable, and instead deciding to exit existence solemnly, discarding their fears to lay down and pass into the void.

This latter feeling is hard to explain in words, and I felt that maybe a simple yet powerful visual and audio experience might be able to impart it to another person. So with Burial’s soundtrack playing, I went to work.

This might be a good time to reassure you about something, I am a particularly extroverted and happy person, guided by my sense of humour and my ability to make friends anywhere and everywhere, so please don’t worry, I just like to explore various emotions in art.

Now, on to the actual MAKING of the game.
I’m a big fan of Löve2D, it has all the bits and bobs I need to load content, and throw it on the screen and through the speakers in a nice, tight, no-fuss package. It uses Lua, which is the juiciest language out there, it’s fun to program in it, it’s fast, and it has a bunch of features which give me nerd boners. It’s no wonder that it has become my framework of choice for jams, prototypes, and maybe even production code when I get round to that.

I have a bad habit of playing around with the visuals and feel of my games, and losing track of the core gameplay mechanics, which can sometimes lead to some fiascos (Crobal and Friends for LD#25, Robot in the Garden for LD#23), so this time I forced myself to have all the mechanics nice and solid, and a good level editor, before even THINKING about the visuals. This turned out to be a good decision, I know how long it takes for me to make things look nice, and I can kludge some nice feeling into a game quite quickly, and with about 18 hours to spare, I had the tools I needed to start designing my levels and bringing them to life.

PRO-TIP: I made my level editor in the engine. There’s a global variable (GLOBAL.mode) which I set to either “play” or “edit”, and gameplay code checks for GLOBAL.mode==”play” before updating and the editing interface checks for GLOBAL.mode==”edit. This means that when I press the hotkey to toggle, the game pauses, I can edit the level and then toggle again to see if the changes I made were good.
Also, the levels were built on three “layers”:

  • Collision map:
    A tile grid with the various collision tiles
  • Decorations:
    Sprites that can be placed freely
  • Hotspots:
    Tagged areas that can be accessed via scripts
  • The collision map is the only part that the player character directly interacts with, and uses a (clumsily written) platforming engine to provide the core gameplay.
    The hotspots are naked objects that I override with context scripts, the obvious ones are the particle fountains the player can stand near to pray, but there are others for respawning the player after death, changing the colour scheme and making sure the player dies reliably when hurling himself into a hole.
    The decorations are static objects that only draw themselves to the screen, the implementation is also quite clumsy, but it’s good enough for the purpose.

    The Last Soul level editor

    The editor interface was mostly mouse-driven:

  • Scroll wheel to change layer
  • In collision mode, left and right buttons cycled the tile under the cursor through the available tiles
  • In hotspot mode, clicking placed a new hotspot
  • In decoration mode, left click placed the currently selected sprite, right click cycled through the sprites
  • In both hotspot and decoration, backspace removed the last placed object
  • This simple yet powerful system allowed me to design the world very quickly. Adding new sprites to use as decoration was simply a matter of drawing a new sprite in gimp and adding it with the correct name and number to the image directory. Adding new hotspots was only a tad more complex, in edit mode, hotspots draw to the screen at their location and display their number, I would jot down the number and the intent on my notepad (e.g: 12 – respawn point), and then I could add the appropriate behaviour to the level initialisation script later.

    All this added up to a fun development process, and allowed me to pace my time quite well. However I had quite the struggle getting my platforming physics to work, and the end result is a very hacky and dodgy system that doesn’t hold up all that well.

    The Gathering
    BdJ gathering at Kawenga

    I live in Montpellier in the south of France, it’s a nice placed to live, steeped in centuries of arts and science, a short tram ride from the sunny mediterranean beaches. Full to the brim with interesting and motivated people, Montpellier is an ideal place for budding game developers to meet and work. With this in mind, we’re working with various companies, schools and associations to bring all these beautiful people together and get them making awesome games.
    Last Ludum Dare we had 14 people gathered in the computer science building at the Université Montpellier II, the faculty paid for food and security, and allowed us to use their workshop. That was the first Baptême du Jeu event, followed fairly shortly by Global Game Jam.
    Global Game Jam was organised at Kawenga, a media lab in Montpellier, at the initiative of the students from the Master Fictions Numériques (Digital fiction) from Université Montpellier III.
    And now we organised our second Ludum Dare gathering, again at Kawenga, which brough 35 people together making games.

    We also have plans for our own game jam which will be called Fu(nky|ture) (the interpretation of this regular expression is left as an exercise to the reader) which will be focused on imposing genres and techniques, or maybe some strange rules (e.g: “you make the art for the person to your left”). We’re hoping to have this ready this summer, and you’re all welcome to come hang out with us.

    If you don’t have plans for this summer, consider coming to Montpellier, let us know on our Facebook group or Tumblr and we’ll do our best to get you a place to stay and people to jam with.

    2 Responses to “The Last Soul, post-mortem”

    1. wilbefast says:

      I’ve done my fair share of somewhat emo games too – I guess deep down we’re both just tortured souls man 😛

      Anywhoo – speaking as someone who has built several custom level-editor for several games… ultimately I’d recommend just using “Tiled” frankly 😉

      • Gaeel says:

        The level editor was actually really easy to write, that’s the whole point, since it’s in-engine, it’s just a matter of having a data structure that isn’t too stupid, a save and load from file (which you’ll need to write for Tiled anyway, and is just LON (Lua Object Notation) in this case) and an interface to tweak the data.

    Leave a Reply

    You must be logged in to post a comment.

    [cache: storing page]