Aurel300

LD 38

In with a Haxe library

I'm in, of course. :smile:

I also created the first official version of the library I was using for LD the past couple of times. It may still be rough, but I'm putting it here just in case.

https://github.com/Aurel300/plustd

Good luck to everyone!

LD 40

19th time's the charm

I'm in again, can't break the streak :)

final.png

Wonder which one will it be? As is tradition, my toolset:

  • Haxe
  • plustd - my Haxe game library
  • Photoshop
  • A friend with FL Studio for the music

After the jam we will likely be streaming some games with @DanaePlays

gl hf

Ignorance is Bliss post-mortem

Play Ignorance is Bliss

(this is a mirror of my blog post on thenet.sk)

"The more you have, the worse it is" was the theme for the latest Ludum Dare - LD40. I made a cyberpunk surveillance simulation game called Ignorance is Bliss. Here is how that went.

Preparations

Unlike some of my previous entries, I knew I was doing the jam (72 hours) ahead of time. My friend, "eidovolta", has agreed to make some time (again) during his weekend to make music for our game. I say again because he did the same for Planet of Babel, even though I did not have time to put the music in, whoops! Not having to worry too much about the music or sounds during the jam helped a lot.

Having played Snatcher) recently, having listened to a lot of Shadowrun OST, and having followed Archillect on twitter I was really feeling the cyberpunky / noir mood lately. Before the jam started I have already decided I wanted to make a game with this general genre in mind, though I was not at all sure how I would implement it.

Before going to sleep on Friday I also made sure all of my workflow was ready, as always:

  • A github repo - to keep track of my commits and make it easier to write this post-mortem.
  • tl (from shkit) - to record a timelapse / take a screenshot every 3 seconds.
  • autobuild - to globally bind the fn-A and fn-R keyboard shortcuts to "build" and "build and run" respectively.
  • psdwatch - to watch my PSD (Photoshop) files for changes and convert them to PNG whenever needed.
    • I had to add an additional post-processing step, consisting of a custom PNG decode and re-encode here, to make sure the resulting PNG has no metadata (waste of space) but, more importantly, to make sure the PNG has no gamma correction information. Some description of the problem is available here and here. Displaying a PNG differently in the JavaScript builds would not be a big problem, but if I want to read pixel colours directly (like I did in The Last Scholar for the map), I had to make sure that a 0xFFFF0000 (100% red) would be exactly the same in Photoshop and in the web build.
  • plustd - confirmed both the JavaScript and Flash builds are working.
    • Hot-reloading - reloading image assets on the fly without having to rebuild is always nice.

So everything was working, in theory. Some troubles occurred during the jam, obviously!

Day one

After having slept some 8 hours (European timezone after all), I found the theme. Once again, I had no favourites among the themes, so I was okay with anything.

img00.png

"The more you have, the worse it is" was a very strong 0 for me!

I started thinking about how to implement the theme in my game. The first burst of brainstorming essentially got me to:

You take control of an AI which oversees the operation of a city via console. You are investigating a possible rebellion. You can interrogate people by navigating a city map, looking at buildings, and then videophoning. Every conversation is recorded on tape and transcript. (Twist: the more human interaction you have, the worse your experience is, because you are becoming sentient and rampant.) You can revise video recordings from public cameras. The (apparent) end goal is to identify the source of the rebellion.

img01.jpg

And a tiny sketch with the first design for the GUI.

So the subject of the theme would be "information" or "human interaction". I wanted to make the player feel their transformation in their dialogue choices, the screen becoming more chaotic? More realistic? Who knows. Either way, a city needed to be displayed to the player.

Rendering the city

The city renderer is very similar in many aspects to the room renderer in one rooms.

The city consist of a number of buildings, each of which has several floors. Every floor is technically a polygon, although in practice it is always a rectangle. Every line of each floor / rectangle of each building is processed and rendered as follows:

  1. The building (as a whole) coordinates in the city are offset by the current camera position (in city map coordinates).
  2. Both points of the line are added to the building coordinates, and scaled according to the scale / zoom factor.
  3. Both points are transformed using the camera angle transform.
  4. A Bresenham line is drawn between the two transformed points (now in screen coordinates).

The camera angle transform is basically a rotation matrix, with the y axis squeezed according to the "pitch" of the viewport:

img12.png

The actual point plotting is done on a pixel-by-pixel basis. This works fine enough in Flash. Unfortunately, it made any browser die immediately in the JavaScript build. I should probably try to rethink how this should work in the JS target of plustd. (This is also how I abandoned the JS build entirely.)

The rendering was different for the "road" and the "parks", but it also used the line drawing as described above.

City planning

When I was happy with my renderer rendering a single building nicely, I planned out the city on paper, with some thought as to where to place buildings important to the story.

img02.jpg

Then it was time to redraw the whole thing in Photoshop:

img03.png

I did plan a power grid for the city, so that the player would be able to turn off power plants and stop power supply for large block of city, for whatever reason. This did not make the final cut.

With the city in pixels (and working magically), I had to go through each line of pixels left-to-right to tag the buildings with their ID, type, and description. This was somewhat of a painful process, even more so because I added some buildings into the digital version that were not on paper. But then it was done and I was not planning on ever changing the city layout.

Interface

Once the city was "done", I started working on the interface. I transferred the sketch from paper to an extremely rough draft:

img04.png

I saved a lot of time by actually using big Photoshop brushes, combined with some magic wand trickery to select circle sections of various radii. I also used a dither mask:

  1. I created a checkerboard pattern of sufficient size in a separate layer.
  2. Using the magic wand (continuous selection: no) I selected all of its pixels.
  3. I selected the target layer (the layer where I wanted the dither effect).
  4. I inverted the selection twice, which allowed me to move it around again with the arrow keys and position it appropriately.
  5. I set the magic wand mode to "intersection" (with continuous selection this time) and selected the region / colour I wanted to dither.
  6. I filled (continuous: no) the selection with a colour and the dither was done.

Yes, I still want to switch to a different (preferably custom) program for pixel art, something more lightweight and more fine-tuned for the task. But it is still nice to be able to have little techniques like this.

For the actual interface design, I chose to do something quite commonly found in cyberpunk movies and games - "modern" technology combined with old / retro implementations. In this case, a sentient AI monitoring the entire city versus an old CRT / vector green-on-black screen with an interface consisting of big blocky buttons one could find on a tape recorder, and even a tape reel for the recordings. Skeumorphism and retrofuturism.

Most of the way the interface works is quite straightforward. Sprites blitted on screen, sometimes a different one if a button is held down, etc. The tape reel is slightly more complicated - it consists of 60 (partially) code-generated frames generated when the game is loaded. The slots in the tape cylinder are used as an alpha mask which is offset to create the highlights and the shadows around the slots. This way the specular bits move around quite realistically when the reel is turning.

https://imgur.com/526qvBi

Interacting with the city

I needed to make sure the player can actually interact with the buildings in the city. I was quite sleep deprived and so I wasted some time trying to work out how to do this without approaching the problem properly. The problem was: how to tell which building the player is pointing at?

After a little while I came to my senses and I realised all I needed was an inverse function to the one described above for the city coordinate transformation. More or less, this is just applying the inverse steps in the reverse order. The inverse to a matrix could in general be more complicated, but in this case it is simply a rotation matrix - its reverse is a rotation matrix with the opposite angle.

img06.jpg

Portraits, story, and jukebox

This time I wanted to make the story somewhat more complex as it is basically the core of the gameplay. I recently watched this talk by Taro Yoko. It detailed his (probably not only his) technique for writing a story - work from the end backwards. I tried to write the timeline for the story like this. I focused on the consequences (rebellion happens, meeting happens, etc) and tried to think of a reason why they can happen. For instance, the major plot point - the coup (spoiler alert I guess):

  • A coup requires a leader, a military / mercenary force, and weapons
    • The leader must be alive
    • The mercenary force must be bought
      • The leader must have the money
    • The mercenary force must have the weapons
      • The weapons must be given / transported to the mercenaries
      • The weapons must be bought
      • The leader must have the money

In the game it was simplified greatly, because of time reasons, obviously. But the principle did remain the same - phonecalls to agree on meeting times and places. Meetings to trigger plot points. Eliminating a person changes the story somewhat. Here is a small sketch I had with the timeline:

img07.jpg

As I was working on the story, I spent a couple of hours to implement hot-loading for the story. I wrote a second "version" of the game with everything stripped but the story. Whenever I changed the scenario file, it would recompile and serialise the scenario (using the basic Haxe stdlib serialisation), then send that to the running game the same way image assets are sent in plustd, which is a simple websocket server.

Hot-loading the story was pretty nice, because, for whatever reason, I still need to manually word wrap my text. In hindsight, it would probably have taken much less time to write an automatic justification / word wrapping into plustd than I spent wrapping my text. But oh well.

I also used the plustd console (removed in the online build naturally!), and wrote some basic debug commands which allowed me to skip to various points in the scenario, change the day, change the current music track, etc without modifying the code and rebuilding. This was also something eidovolta needed to listen to his music loops in-game (a jukebox mode, basically) to see if there were no pops or gaps.

Speaking of pops and gaps - Flash supports two audio formats for its sound assets. Uncompressed WAV / wave files are huge, but lossless. MP3 files are much smaller, but lossy. Most importantly, there is nothing in the MP3 format to encode the exact length of an audio file. In other words, a perfect audio loop, without a miniscule but audible gap in playback is impossible with MP3, without using special tags or an external data source to determine the exact file length. For my jam submission I therefore used WAVs because I could not bear the gaps in the music. This led to a huge, ~30 megabyte file. Soon after the jam I used a Haxe Ogg decoder to decode Ogg Vorbis sound assets, which are compressed but lossless. A 3 megabyte file is pretty okay in my opinion.

Wrapping up and falling asleep

Once again, I attempted to go without sleep between the second and third day of the jam. It did not go so well for Planet of Babel. This time, my solution was this:

img08.jpg

Not the sushi or the cake (though they were pretty good too), but a poor man's standing desk. I was standing for most of the last day, kind of dancing to get the blood flowing. Sitting down would make me fall asleep extremely quickly. Somehow this really worked, since I guess I am not capable of sleeping while standing, at least not without more than 2 days of sleep deprivation.

I can certainly recommend standing to not fall asleep if you decide to do so. It also helped me avoid the helpless gloom I was feeling with Planet of Babel, when I was completely certain I could not finish enough of the game in time. Maybe I was progressing better, maybe falling asleep all the time makes you lose motivation. I don't regret the sleep management this time either way.

Flash is dead!!1!

Among the feedback for my game, criticism of Flash as a platform was very common. I absolutely want to move to JavaScript and desktop builds. I must admit I am somewhat sad to see Flash go - despite its many security flaws it was actually pretty good for making games rapidly. The scripting engine was optimised enough to run software renderers without having to resort to shaders. Historically, Flash was pretty significant in the development of the modern indie gamedev. I don't think there will ever be anything as well-suited for the task as Flash is. Unity seems to be responsible for too many terrible games to count. JavaScript / HTML 5 will hopefully take over, but there are many tiny details (gapless audio being one) that just don't or can't yet work reliably, cross-browser, and cross-platform.

But, once again - I will try to improve plustd in the future and hopefully I won't have to be ashamed for having a Flash-only game anymore!

Other feedback

It is now more than two weeks after I published my game, and I have received enough comments to know / confirm what went well and what went wrong. First of all, the worst two decisions for this game:

  • Unreadable font - I used one of my own fonts as always, but I think the shadow / outline effect was just too much. It is easy to read the text when you know what it says anyway, but this is clearly a case of developer blindness.
  • Text scrolling - The text scrolls very slowly. There definitely should have been a way to make it scroll faster, e.g. by clicking rapidly / double clicking. It might subtract a tiny bit from the "realism" of the typewriter but gameplay convenience is much more important here.

Apart from that, I notice fewer ratings in the humour and theme categories. The game takes a long time to play through, for any ending, and having no speed up option requires a lot of patience. Some people probably were nice enough not to rate the categories not having played enough to be able to tell. But either way, I am not expect very good ratings in humour or theme - admittedly it is quite fair. Ludum Dare is probably not the best for developing story-driven games.

Well, that is it for now! I hope this was fun to read. The next gamejam I will be participating in (apart from the weekly one hour gamejams!) is probably the second Alakajam! in February. Enjoy the bonus:

Some food pictures

img09.jpg

img10.jpg

img11.jpg

(oh yeah, it was my birthday, too)

LD 42

Runnink out of Space post-mortem

Play Runnink out of Space

(this is a mirror of my blog post on thenet.sk)

Ludum Dare 42 was held August 10th – 13th, 2018. The theme was "Running out of Space", and I made a puzzle / adventure game I'm very happy with called "Runnink out of Space".

About Ludum Dare 41

Before I talk about LD 42, let me just briefly mention my LD 41 entry, Advance Cookwares. Yes, I participated and I submitted a game but I was really unhappy about the result towards the end. The game looked fine, but the gameplay suffered a lot from not being properly explained. I never got around to writing much about it.

The game barely ended up in top 100 for two categories but overall it is a disappointing one!

ldres.png

Back to LD 42.

Themes and early start

These were my votes for the themes in the final round:

  • 0 Running out of space
  • +1 Night is coming
  • +1 Decay
  • -1 Safe in the dark
  • +1 Fragile
  • -1 You are the final boss
  • -1 Evolve
  • -1 Light is key
  • -1 Death is useful
  • +1 Two points of view
  • 0 Dying planet
  • -1 It's spreading
  • +1 3 Rules
  • -1 One enemy only
  • -1 One minute
  • -1 You control the environment, not player

I downvoted the duplicate-sounding themes in this and the previous rounds. "Running out of Space" was one of those themes that I just felt neutral about and didn't really think much about it.

In fact, since this time around LD started a couple hours earlier than usual, I discovered the theme at 11 pm local time, and I used the evening to brainstorm. Before the jam, I was thinking of doing a game vaguely inspired by Flashback, but that thought very quickly dissolved and I ended up just making a retro game. Like always!

Initial brainstorming

During that first brainstorming session I thought of an interesting (I hope) mechanic for the inventory system: the world map = the inventory = the player's abilities. Knowing where you are is a trade off for having an item, or being capable of performing an action like jumping. At this point I was thinking of a vaguely metroidvaniac puzzle platformer.

However, having one single container for everything that the player needs (map, inventory, abilities) got me thinking – what if these "things" are all essentially the same? How to unify the abilities and the items? (How to unify program code and data?)

With that line of thought I got to System's Twilight, an amazing puzzle game that I love a lot. In the game, there is an area called the swamps, in which the player solves levels based on manipulating words and answering riddles. The levels increase in difficulty and size, and it is very possible to get into unsolvable states by answering riddles with the wrong word or by manipulating your words in the wrong way. This makes the puzzles quite challenging and a little bit frustrating also. I wasn't sure if I wanted this kind of difficulty in my game at this point.

(As an aside: King Kinplot in the game is a reference to System's Twilight creator, Andrew Plotkin.)

Still during the first brainstorming session, I thought of a story that was centred around literally running out of space in the cosmic sense, and a way to explain why the player was running out of memory, as well as why they should embark on a completely surreal adventure – it's an illusory puzzle labyrinth of course. This story got the girlfriend stamp of approval, though I suspect the pun in the title played a role in that.

img00.jpg

And I listened to Out of Space.

https://www.youtube.com/watch?v=a4eav7dFvc8

At around 1 am I called it a night and went to sleep.

First morning

On Saturday I continued the brainstorm as we were eating out for breakfast. I was firmly discouraged from having levels where the player would be completely stuck and would have to reset the level. After some thought I agreed, and I realised that if the game was unlosable, I could also get away with having a single large map instead of multiple smaller levels. After all, if the player got stuck towards the end of a large map, they might be too upset to restart and give the game another try!

Puzzle design

When we got home, I started drawing the map along with whatever words / riddles would be present in each room. This was to be the core of the gameplay, so the hours I spent on this before doing practically anything else were hours well spent.

If you haven't played the game (I encourage you to do so to avoid more spoilers!), here is what the gameplay is like, so that you understand what I am describing in the following section:

  • the player moves around a map split into individual rooms
  • in each room, there may be interactions in which
    • a word can be "taken" from the map - the player has to manually type out the answer to a riddle and they can then take this answer and keep it in their inventory
    • a word can be "given" - the player needs to have the answer to the riddle in their inventory
    • a word can be "transformed" - a word from the player's inventory may be given to be transformed, and if the transformation works on the given word, the player may keep the transformed word in their inventory

I am also happy with the approach I took, an approach which made drawing the map a relatively straight-forward task – I started from the end of the game and worked my way backwards until I thought there was enough content. So, I drew the bottom floor of the map first, including the ultimate goal, the Cuttlefiship. Since it was the final room, it needed to be guarded, naturally, so I added the three guardians, who took three very similar answers. And so on, and so forth. I wrote down all the answers, and I thought of some common transformations that could be applied to get TO the answers FROM a different set of words, which then became the words given to the player, or intermediate steps.

img01.jpg

The set of word transformations I had come up with:

  • reverse word
  • swap first and last letters
  • increase the first letter by one (a to b, b to c, etc)
  • decrease the first letter by three (d to a)
  • remove all c letters
  • change o's to u's
  • remove the first letter

(Notice one transformation that ended up in the game is missing: I had to add it last-minute because I was too tired to realise that "climb" has an "m" while "blind" has an "n"!)

At some point I was considering adding a word transformation to the game which would add a letter to the supplied word. But I realised, when the player has the ability to cut off the first letter, increase or decrease the first letter, AND add a letter, they can actually make any word whatsoever, without having to take the words from the rooms in the map. Such a set of transformations would be too powerful and would be a generating set for all possible words. So of course I made sure not to put this transformation in the game!

As it is, I was worried that I missed a way to "sequence break" the game, i.e. solve certain riddles without taking all the words needed from the map. When I watched my friend playtest the game (a day or two after submission), he got really close to a sequence break ... but he only found a different way to generate a required word.

img02.jpg

I had the map and word lists finished and almost finalised quite early in the jam. However, no actual dialogue was written, only the key sentence for one or two riddles. I delayed dialogue writing until the third day.

Audio surprise

(What a corny subtitle.)

Just like with many of my previous LD entries, I asked my friend "Eidovolta" (whose real name shall remain hidden!) to make the music for the game. Unfortunately, this did not happen due to some last-minue work assignment. This meant that I was unsure what would become of the audio, or if there would be anything besides the basic beeps and boops I could get from bfxr.

As luck would have it, however, I was hanging out on the #alakajam IRC channel, as one does during gamejams, and wan happened to be there. I also knew he was a solid audio artist from his previous gamejam entries, so I asked him for help. My vision (audiation?) for the soundtrack was simply something retro, Amiga-like:

https://www.youtube.com/watch?v=PvSfqBJi0ss

… to hopefully fit with the feel of the game overall.

So wan abandoned his not-quite-started LD entry to make music for my / our game. Thanks again, wan!

First floor

In the evening on the first day, I had the map ready, so I selected a palette and started drawing the backgrounds for the first floor. I thought I would finally get to use my drawing tablet for this LD, but it never happened. In fact, I think the sort of pixel art that I used in the game is easier to draw for me with the laptop trackpad.

While I was drawing the first floor I realised the final amount of image data would be relatively large, even though individually they were quite low-res. 7 floors, each of which has 5 rooms with one background layer and one foreground layer, perhaps a bit more if there are moving bits. So I tried to think of a way to prevent having a single huge bitmap for all the room imagery.

I drew a grid and tried to align the graphics to it. I wanted to run a script which would check the contents of all the tiles, detect duplicates with some fast hashing, and then only save the unique tiles in addition to a map referencing those tiles by ID.

Cool idea but naturally a waste of time. Instead I had each floor in a separate file (so as to not exceed some engine limitations for bitmap sizes) and saw that the PNGs were pretty tiny in the end.

But in the end I was quite happy I had a grid, since it was very easy to align the interactive bits drawn in the room backgrounds with interactive zones that the player can click to activate.

There is a lesson there: over-engineering, then giving up halfway through can lead to benefits in the long-term.

Room transitions

With the first floor done, I had to think of a way to visually show the transition between the rooms.

The sides of rooms generally lined up with the same kind of door on either side, and I made sure to have ladders line up as well. Still, I didn't think a simple scroll would be good enough. So instead, I scrolled each row of pixels separately (or column of pixels for vertical transitions), with some delay.

In addition to the delay in rows, each row was also moved non-linearly, using a smoothed timing curve.

img03.gif

The pseudo-code for a left-to-right transition would then be:

let TransitionLength := 20 frames
let RoomWidth := 318 pixels
let RoomHeight := 175 pixels
for Frame from 0 to TransitionLength:
  for Y from 0 (top) to RoomHeight (bottom):
    let RowProgress := (Frame / TransitionLength) - (Y / RoomHeight)
    let SmoothProgress := QuartInOut(RowProgress) * RoomWidth
    copy Yth row of left room to X: SmoothProgress
    copy Yth row of right room to X: SmoothProgress + RoomWidth

(Where QuartInOut is a quartic ease-in-out function.)

Or look here if you prefer actual code for transitions in all 4 directions. I felt these transitions worked very nicely and added a bit of interesting eye-candy to the game.

Ragdolls

It was time to place the player into the world. Maybe because of the smoothness of the room transitions, I thought of ragdoll animations. I modelled all of the characters in the game, including the player, as humanoid ragdolls made out of:

  • a head
  • a torso
  • left and right upper arm
  • left and right lower arm
  • left and right thigh
  • left and right calf

Then I could create a small number of poses and animations and be able to apply them to all the characters without having to animate each. Well, that was the idea. In the end, only the player ragdoll uses the animations:

  • walking
  • climbing
  • slipping
  • falling down

Everything else uses an idle standing animation, except the King and the Queen, who are (very awkwardly) sitting.

My original intention was to create a simple tool in which I could arrange a ragdoll the way I wanted and use that to create the keyframes for animations. This did not end up happening, as it would probably take a long time. The alternative was, unfortunately, to create the keyframes by setting the angle at each limb manually, loosely based on a walk cycle tutorial. Naturally, this made the animation look rather stilted and robotic. But of course, since the player character IS a robot, it looked appropriate!

img04.jpg

Second day, more ragdolls

During the second day, I kept working on the ragdoll animations. Making sure the player moved smoothly from tile to tile while walking or climbing was a little bit frustrating, same for making queued actions work properly (e.g. walk THEN climb).

But in the end, after spending maybe 12 to 18 hours of my total LD time, I had the player walking around the map smoothly, transitioning from room to room. It is quite a large chunk of time and with some foresight the process could have been planned somewhat better, but all in all I don't regret the choice.

img05.gif

UI work

More than halfway through the jam I realised there was no actual gameplay in the game yet. No way to solve riddles, transform words, etc. I had the general layout for the UI but, well, judge for yourself:

img06.png

You may notice that there are four sections in the layout. The bottom two ended up the same in the final game, but for a long time I wasn't sure what to put in the top right. The actual rooms were displayed in the top left only. The idea was to have a minimap in the top right, from which the player could drag their current location onto their memory to "remember" it. I eventually abandoned this idea in favour of just centring the room visuals in the top part of the screen, since the map discovery was made automatic. This is why there are vertical bars on the sides of the rooms in the final game.

I made the bottom left window be the dialogue box. Expanding upwards to show more text in a chat-like fashion seemed a natural choice. I was happy I had an automatic text justification ready from my Alakajam! 2 entry, otherwise manually justifying each bit of dialogue like I had to do for LD 40 would be a major pain and a waste of time. The justification worked pretty well for the most part, the one exception being:

img07.png

I didn't think this was worth fixing.

The bottom right is the memory / map / inventory system. I was considering at some point making the memory of a room more important – e.g. if you remove the room from memory, you will need to answer the riddles in it once again to get back the words. But this would probably be very annoying. As it is, the map overriding the player's words if they are not careful can be sufficiently challenging.

Pixel art morning

With the UI done, the gameplay was basically complete. Except ... I was missing most of the floor graphics and most of the dialogues! I had about 14 hours, but I figured it takes about 1 hour to complete the graphics for 1 floor, reusing common elements like the doors, of course.

So with that in mind I spent the entire morning of the third day drawing. I tried to make each room somewhat unique, but naturally my time was running out. I guess it shows that the last floors are a bit less varied than the first ones.

img08.png

But hey, by the time players get there, noticing the pixel art is the last thing on their minds!

As I already mentioned above, all of this was drawn using a trackpad. I use my laptop as my primary workstation, and over the last couple of years I haven't been using a mouse very much. It feels very comfortable and easy to draw with the trackpad as a result. In the case of this game, most of the art is rather geometric and technical, rather than organic or natural. If I were creating a game with more of the latter, I would probably give the tablet a go again, since it is easier to draw organic shapes free-hand.

Dialogues, wrapping up

By this point (early afternoon of the third day), it was really time to tie up the loose ends. There was a lot of dialogue still missing from the game, though I knew roughly what all of it should say. I made sure no interaction was missing, placed all the character ragdolls in the correct positions, tried a couple of playtests to spot some obvious problems.

Originally I wanted the dialogue system to support branching paths, where different text could display based on the current game state. As it turns out, the only dialogue that actually used this feature was the King, who would say different lines if the player hasn't helped the Queen yet. With the chat system as it was, this seemed rather complex to implement and I was worried it would confuse the players anyway, so I scrapped the feature and instead made the door leading to the King a bit more intelligent – it checked that both the Guard's and the Queen's puzzles were solved before opening.

By this time I also had all the music and sound effects from wan, so I put them in the game as appropriate. I used the crossfade system I had from LD 40 / LD 41 for transitioning between music tracks.

With about 1 hour to go, I had enough time to put in little markers on the map, display the room titles, i.e. a bit of polish. I put in a title screen as a little wall of text, but did not have the time to put in an end screen, so players get a disappointing "(YOU WIN!)" in the dialogue box, allowing them to explore the world after finishing the game.

The end screen was meant to show space, and when the space was restored by the player, the camera would simply zoom out, thereby showing more space. (Idea courtesy of Danae!) This would have been fun, I admit.

Post-jam

Now it is time to wait for the results. I am extremely happy with how the game turned out, and I am now convinced that a regular sleeping schedule during gamejams actually leads to much better results; the few extra hours are not worth the decrease in productivity. Watching a couple of streamers play the game was very entertaining, see ursagames' playthrough or ArdjenDesign's partial playthrough.

You can play the game here, or on itch.io. I uploaded a timelapse, and wan made a post about the soundtrack. And, if you are stuck, here is a walkthrough.

That is it for now, I hope you enjoyed reading this as much as I enjoyed making the game!

Food log

img09.jpg

img10.jpg

img11.jpg

img12.jpg

img13.jpg

LD 44

Timelapse for Arcade Wars

https://youtu.be/D_4HFKtPw1Q

Play now

For once I managed to create the timelapse in a timely manner ^^

Ludum Dare 48

Streaming LD now (weighted raffle system!)

Come join us on stream:

https://www.twitch.tv/danaeplays

We will pick games from the chat by raffle. The more times you enter the raffle, the higher your chances of being picked!

Ludum Dare 51

Ludum Dare 52

h y p e

catto.jpg

Ludum Dare 54

I'm in, switching languages

I've been rewriting my engine from Haxe to Rust. I think this time I'll participate with a Rust game :)

htr.jpg

Ludum Dare 56

Alakajam!

Given the news, here is another alternative gamejam that might interest you!

logo-small.png

Alakajam! is a jam with now over 20 iterations (+ various side events) that started as a more community-driven Ludum Dare. The community (centred around our Discord) feels very friendly and there is plenty of feedback given to every game. We have a moderation system to fight spam, the website is open-source, and the ruleset is similar to LD's with a 48-hour solo division and a 72-hour jam division.

Our next event is starting February 21st, hope to see you there :video_game:

Alakajam! website | Discord

Ludum Dare 57

submarine

sub.png

BTW timelapse

Haven't posted a timelapse since LD47 :) This time I also tried to make some janky music to go with it, to learn to work with a DAW a little bit!

https://www.youtube.com/watch?v=t3Yqze7hnLc

BTW: Beneath the Waves

Ludum Dare 59

Post-mortem/making of

I wrote a post-mortem/making of for my LDJam entry. Includes: audio and image processing, story/poem analysis, scrapped ideas, and more (:

Post-mortem

(I would include an image here but image uploads are currently broken :upside_down: )