Cloud Courier Postmortem


Hi! My name's Cheese, and I was project lead on Cloud Courier. Most of the words in this post are mine, but I've invited my collaborators to chime in and share their perspectives/experiences. You can recognise them by the following formatting: Albuffalo and lclhstr.

This post is divided into several sections to make reading/skimming a bit easier:

  • Origin
  • Team setup
  • Concept
  • Workload
  • Process
  • Timeline
  • Reflections
  • Learnings


Origin

On Sunday morning, I woke up early. After lying in bed for a couple of hours, waiting for a sensible time to get up, I started to feel motivated to make something for the STOP WAITING FOR GODOT jam.

I'd been asked previously if I was going to participate, and at the time I'd said that I wasn't - Bat Egg is getting close to release, and I wasn't sure that I wanted something else on my plate. The idea of a little game about controlling a balloon's altitude in order to enter and exit horizontally moving air streams felt like something small that I could do in the couple of days that remained in the jam, and started to grow on me.

Sometimes it's a good idea to follow impulses, and game jams can give a nice, limited scope to explore an idea without committing to it longer term.

Mist rising off the Tamar River in Launceston, Tasmania at sunrise

I got up and pinged a couple of people before heading out for a walk to watch mist rise off the river as the sun rose. When I got back, I had a response from Albuffalo, who I'd known for a few years through the community for Hand of Fate 2 (a game I worked on) and had commissioned to do some art for my 2020 recap for two projects that I wanted to talk about but hadn't done any visual work on (which will be relevant later!). Albuffalo hadn't participated in a game jam before, but had mentioned that she'd always wanted to try making game art. With that in mind, I tried to reassure that game jams are most rewarding when they're about learning from an attempt more than they are about having something tangible at the other end.

Later on, I heard back from lclhstr, who I'd previously done some small collaboration with on past projects (The Farrier and Into Darkgroove Forest) which didn't quite end up being fully realised and I imagine weren't fulfilling experiences. I was definitely keen to provide a better opportunity this time.

I was delighted that they were interested, and was looking forward to working with both again.


Team setup

Before starting, I had a brainstorming session with Albuffalo, where we identified the game's core scope, the minimum art assets we'd need, and discussed some ideas for aesthetics, mechanics, game flow, and some optional bits and pieces we could consider if a minimal version of the project came together.

I made sure to give Albuffalo the space to make art director type decisions and avoid pre-empting or predisposing. I figure that if I bring a collaborator on board and I'm only letting them make what I want them to make, I'm not being a good collaborator. It's always exciting to discover what another artist sees in my work, and what their interpretations inspire in me. That's stuff can't happen if I don't give the people I work with creative latitude.

Similarly, when lclhstr expressed interest, I tried to give a brief that reflected where the project was headed and was happy to share some early gameplay footage, but I also wanted to be open to whatever interpretation came out of that.

lclhstr: I was slightly weary about the short time available (this being a gamejam), but it turned out to be enough for the scope of the project, partly because the set of requirements was generous and non-constraining.

"We're aiming for something cute and wholesome feeling. The framing is probably going to be about making people happy by delivering gifts and flowers and food and stuff. It'd probably make sense to the music to feel a bit laid back (or at least not feel too tense or bombastic). Beyond that, I don't have anything specific in mind" - Cheeseness

Albuffalo: I know time was initially my biggest concern... In the first few minutes I was thinking we were maybe going to have a week to do all this, but very quickly Cheese let me know that that we had about 2 and a half days left to submit the game. Under normal circumstances I might had said no, because it would would had meant I had one Sunday to get all the art done and I'm generally out for work all (Mon)day until after the Jam's 7PM local deadline. But I actually had a holiday that Monday so I had time; the scale of the game wasn't big so there wouldn't need to be too much that needs to be done; I always wanted to try working on a game, and I trust in Cheeseness' ability to bring it all together, so I figured: 'Hey, why not?'

With the short time limit the expectations I had for the game was that we would essentially have a playable prototype by the deadline, but I was honestly confident we could get it done-- or that Cheese could get it done; I just had to make the art and send it to him 😅


Concept

The game's concept as it coalesced was to have players control a balloon's height in order to ride air streams to destinations while delivering packages between villages in the sky. If we had time, we decided that it would be interesting to try to present performance/progression in the happiness of the villagers to hopefully reinforce that the player's abstract narrative role is to connect people, and enrich their lives by metaphorically bringing them together.

An early sketch illustrating a possible delivery routes between islands. Below are some scribbles illustrating the 2D in 3D implementation that we went with

Ideas like upgrades, different balloon models, damage mechanics, weight mechanics, cosmetics, a dialogue system, multiple environments, and chained deliveries that could tell little stories were all put on the table, but we recognised that it was important to focus on a minimal version of the game first, and only consider that stuff after.

We decided to go for 2D sprites positioned in 3D space, doing one level/environment. Building sprites and islands would be separate so that we could generate islands with varying combinations of buildings on them at runtime. Characters would have single frame poses that we could switch between based on state rather than animations between them.

The pilot and villager sprites that Albuffalo painted for Cloud Courier


Workload

For myself, I did my best to hold to a eight hours a day, which a few hours' break in the middle. To help keep to this, I decided to only work on stream (you can find archives here, but be warned, the mic I was using across the event has a delightful whine from time to time), which turned out pretty well. I find that I work slower when I'm streaming, but as a more experienced Godot developer participating in the jam in solidarity with all the less-experienced developers, it felt important to show my working.

I ended up going over by a couple of hours at the end of day three, but aside from that, I feel pretty good about the time I applied and the work that I got done.

I didn't put explicit time constraints on my collaborators, but I hope that they felt encouraged to not overwork themselves and embrace the idea of a jam as a time management problem to be solved rather than brute forced.


Process

Since I was filling both a team leader and a do-everything-nobody-else-is-doing type role, my focus was mostly in getting the core of the game up and happening to a point where lclhstr and Albuffalo's contributions could be put into the game. Particularly for the kind of team distribution we had, there's a lot of value in making sure that people have the opportunity to get a feel for how their work is presenting in-game, and allow them to start iterating on that as early as possible if needed.

Time zones worked out such that I was able to front load getting basic movement and interaction mechanics front loaded before any other assets were ready to put into the game. I'd previously written code for loading resources from the user's home folder and allowing that to override what's packaged with the game. I don't think Albuffalo or lclhstr ended up using that, but the option to try stuff out in-game without me doing new builds was available if needed.

At the start and end of each day, I made myself available for catch up and planning chats to make sure that we were all on the same page as much as possible, and catch any potential issues or concerns that might reveal themselves while I was asleep. I think that streaming my progress also helped my collaborators keep tabs on the game's progress as I went.

lclhstr: An orchestral texture felt appropriate for the game's topic. Composition was a fairly traditional process (started from two simple contrapuntal melodies supported by a tonal chord progression, added a few bits of decoration here and there). An intermediary preview seemed to fit with the general mood, and the team agreed to proceed.


The level music was split in instrument groups that would stack, to keep the loop interesting for more than one listening, Cheese agreed and associated adding/removing layers with game events (successful delivery and completely losing fuel).

Albuffalo: I know Cheese didn't want to influence me on the design of the assets. When we were planning out what the screen would look like and what we would need Cheese used simple shapes to keep things neutral. I had already been playing Odin Sphere in my travel times so I knew I wanted to digital paint the assets, and style wise I had already been thinking about Tintin and the Little Prince for the lovely detail and the simple faces. =)

A process image showing an example wrapped parcel and a character's head and shoulders being painted across five steps

I know Cheese offered if I wanted to try some pixel art, but I didn't feel confident enough to try something new where a single pixel could drive you mad. Besides, I felt digital painting was a bit more forgiving to be a little rougher with the art if I had to go faster. In terms of an actual process, I suppose it's like putting a blob of clay, and then molding and refining the parts of it into shape.


Timeline

In the interests of further showing process, here's an overview of each day's work. If you're after a more detailed account, you can take a peek at this post on my Patreon page.


Day 1: First steps

Timezones aligned in a way where I had most of the first day to myself before either of my collaborators would have work for me to look at implementing, so I worked on getting basic movement and interactions in place.

By the time I'd used up my eight hours, I had a balloon that could go up and down, air streams that would push it, villages that packages could be picked up from/delivered to, and markers showing where off-screen villages were located.

A video of the end-of-day 1 build, showing a balloon riding an air stream and picking up a package from a village

I opted to not focus on level generation since I knew that would be a time sink and getting other aspects of the game behaving would be more beneficial in terms of having more stuff ready to receive assets. For the Time Being, an air stream above each island moving left or right was good enough.


Day 2: Assets

After a late start, I was able to get island, building, cloud, and balloon assets into the game before Albuffalo went to bed. I've kept things fairly zoomed out while working on my first implementation, but brought things in closer to give the new art more visibility.

I started off with one building per island, and as development progressed, the idea of the collection of islands being one village rather than each having a village felt like a better fit for the game, making things feel a bit more direct and personal.

lclhstr's first pass on level music arrived, quickly followed by a bunch of separate tracks for each part that could be toggled independently. After some discussion, we decided to go with an implementation where the music got an additional layer with each successful delivery, and lost one with each death.

The end-of-day 2 build, showing initial implementations for balloon, island, and building assets, as well as the fuel and altimeter gauges and speech bubble markers

Since the rest of the game had progressed a lot visually, I made some new UI assets for the fuel gauge, differential altimeter, and pick up/deliver progress bars. I also updated the village markers to look more like speech bubbles, and put a balloon on the ones that indicated where someone had a package that needed picking up.

Before the end of the day, I added a main menu, settings screen, credits screen, and a custom bindings configuration system, borrowing some code from Bat Egg to speed along a couple of non-game aspects. Credits might feel a bit premature, but I've committed to recognising my Patreon supporters in my games' credits, and if that gets left to the last second, it usually doesn't make it into builds.


Day 3: Taking shape

Day three opened with some new menu music from lclhstr, and new art for characters and packages from Albuffalo.

I started by working on the music system, which needed a little refactoring in order to handle having a separate music track for the menu.

With two hours left before the jam submission deadline, I switched to work on implementing character sprites for the balloon pilot and villagers, which would pass the package sprites to each other during pickup and delivery.

Rather than address level generation properly, I just added a second air stream below every island running in the opposite direction to the one above. A quick and hacky solution, but one that would mean that players could go in either direction from any island.

A photo of the middle-of-day-3 build, showing a male villager receiving a wrapped gift and the updated balloon sprites

The jam deadline was extended, but I still pushed up builds to coincide with the original end time, and then took a break to discuss how to use the remaining time available with Albuffalo and lclhstr.

My focus for this last leg was to revisit rough edges and keep an eye out for things that I'd overlooked. I wanted to be sure to make sure that any effort I put in was elevating the project in a meaningful way, prioritising small efforts that would have big impacts on the feel of the game or the experience of playing.

Some of these where small cosmetic tweaks like sorting speech bubbles above the HUD so that they wouldn't be obscured (the gauges still look nicer when partially transparent though), while others affected gameplay, like speech bubbles not being reset properly after dying, leaving false ones floating around that didn't indicate a real delivery.

A photo of the end-of-jam build, showing woman villager sending a wrapped gift

lclhstr provided some updates to music tracks and some stings for successful pick ups and deliveries.

I'd forgotten to implement the second set of villager sprites, so I got those into the game, along with some new cloud sprites. I also tweaked the scaling and positioning for buildings and islands to fit better with the character sprites, giving the whole game a more zoomed in feel.


Day 4: Overtime polish

Since I'd forgotten to include an updated sprite for the fruit basket package and had a couple of feedback items I wanted to address, I felt like I could spend another half day (which ended up being a full day) working on the game without really going beyond what was achievable during the jam. Considering that the jam had been running for two days before we started, taking that extra time didn't feel like too much of a stretch.

This extra day saw lots of little tweaks and changes. Some cosmetic, like putting clouds on the main menu or nice transitions when dying and respawning. Others were more mechanical, like updating air streams to push the balloon further and the climb/descend mechanic to allow the buttons to be held over time. I made some balancing changes to increase maximum fuel, tweak fuel refill rates, and change villager collision shapes in order to make the game feel more approachable.

A screenshot of the day 4 build, showing the new HUD additions

These changes allowed the game to flow better, and let me feel comfortable not pushing ahead with reworking level generation, which at best would have taken a couple of hours, and at worst could have gobbled up the whole day.

Instead, I used the time to update the HUD, putting the currently carried package down next to the gauges, and a tally of completed deliveries on the bottom right. The tally doesn't really give a sense of progression, but it does add some distinction between playing for a few seconds and playing for twenty minutes, and I think that's valuable for appreciating what's currently in the game.


Reflections

In general, I'm feeling pretty good about what we managed to come up with, given that we started late. We put a focus on achieving the most minimal version of the project first and expanding from there, which allowed us to constrain the scope down to something that could reasonably be done in a few days.

Albuffalo's art give the game a charm and character that I find very endearing, and lclhstr's music sets the tone perfectly. I couldn't be happier with their work and contributions to Cloud Courier!

If the game in its current state has a failing, it's that level generation doesn't create networks of air streams that are interesting to navigate. That's the core of the game, and while sometimes levels come up that are fun to move around, that's not guaranteed, and I think that it's too easy for a player to feel like they're meant to get around with the lateral thrust mechanic (which was a debug feature I left in so that players could make small adjustments when they were close, but hadn't quite made it to the village they were aiming for). The fourth day's efforts help with that a bit, but it's still a dominant weak point.

A screenshot of Cloud Courier's main menu

Some in-game instructions probably would have been worthwhile, and I think I would have been able to squeeze them in if it had occurred to me. I would also have liked to have gotten the ability to accept or refuse a delivery in. Early on, I'd done initial work on a weight system that affected balloon handling, and not being able to refuse deliveries was effectively a blocker on allowing the player to carry multiple packages. The interface for accepting or refusing deliveries would have been most of the work needed for the dialogue system we'd discussed, but I'm not sure that there was time to give that feature the attention it deserved either way.

Last, but not least, I went over my intended work hours by a couple of hours. Not a big deal or any meaningful inconvenience, but definitely a time management failing on my part.

lclhstr: The game looks great and it feels very pleasant to interact with, it delivers on the "spend a few minutes in a pleasant environment doing nice things for people" promise.

Albuffalo: Pretty good honestly! I wasn't sure how everything was going to piece together, but I was very pleased! I know I had a different idea to how close the camera was going to be so my scale was pretty off, but I think it still turned out great! It's like the people are representing their building (or the same 1-2 people representing that building since I only made 2 villagers, lol).

Speaking of villagers, I love me some easter eggs, and I was really happy to kind of sneak in 2 characters from Hatcher and Starfighter concept art [you can see those halfway down this post - Cheese]. I love the idea for their games, so I can't wait to see them someday, but I thought it would be cute to include them. One other little easter egg I put in-- but that you really can't see-- is that on the wax seal of the letter is a bee as a little nod to Hive Time. But again, you really can't see it at all, lol (but the wax seal on the letter is still nice).

The four package sprites that Albuffalo painted for Cloud Courier

There are a couple of things I wish I did a bit better; like I left a extra dark spot in the cloud title for the top of the screen and that kind of bugs me. And the first building I did I accidentally put a lower perspective on it and that just looks weird. I also ended up asking Cheese to do the UI since I had trouble conceptualizing what Cheese was referring to, I feel like he already had enough on his plate for the deadline... 💦


Learnings

I think the big things that I came away with from Cloud Courier primarily revolve around checking assumptions when bringing someone into a new domain. I made sure to frequently ask if I was using terms or referring to things that didn't make sense, but I completely forgot to do things like establish file naming conventions or mention the need for keeping orientation or position consistent between sprites.

I wasn't previously aware that Godot was set up to handle SVG icons for runtime application icons (as opposed to icons that get embedded in binaries or included in a .app package), which was a super nice thing to stumble across. I'll definitely be doing that for future projects.

lclhstr: Probably more music should have been written (time permitting), the slightly static harmony does become repetitive eventually. I also should have mixed both the menu and level music as a whole, to avoid some volume mismatch issues 😅

Albuffalo: I ended up learning and using a couple more brushes just to help speed things up; I also learned how to make a tile that it repeats nicely and I feel like there's potential to do more with that. And I realize I do enjoy drawing buildings and objects more than I thought.

The five building sprites that Albuffalo painted for Cloud Courier


And that about wraps it up!

At this stage, we're taking some time away to see how we feel about the project before deciding whether or not we'd like to work on it more. Regardless, I'm proud of what our little team accomplished and am very happy with how things turned out.

A photo of some clouds that Albuffalo and I used as a reference while backgrounds that I took a couple of weeks ago

Thanks for reading, and see you among the clouds!

Get Cloud Courier

Leave a comment

Log in with itch.io to leave a comment.