Goodnight Meowmie Post-mortem

This is a post-mortem writeup for Goodnight Meowmie.

This was my 18th time competing in Ludum Dare, and my 10th time working together with xellaya. We've been working together for the past 4 LD games (Samurai Shaver, Goodnight Sheep, The Music Box, Raven Delivery Service), but this was actually the first time since Ludum Dare 36 in 2016 that it was just us two working alone with each other. Coming off of our first place win last time with Samurai Shaver, I was feeling up for trying something new and pushing our boundaries a bit, which we certainly did with Goodnight Meowmie. We actually struggled a lot during the first half of the jam, and I'm honestly shocked that we were able to come out with something so cohesive given how slowly we started.



We ended up with quite a unique game -- one that combined the gentle playfulness of Pet Furball with horror elements, which was something completely new to us. This is also the first game we've made that really tells a complete narrative story (though we come close with some previous attempts).

Before we get into what actually happened during the jam and all that, let's look at our final ratings:

Scores


Overall:    14th  (4.352 average from 56 ratings)
Fun:        276th (3.645 average from 57 ratings)
Innovation: 217th (3.773 average from 57 ratings)
Theme:      115th (4.236 average from 57 ratings)
Graphics:   42nd  (4.500 average from 57 ratings)
Audio:      4th   (4.509 average from 55 ratings)
Mood:       2nd   (4.574 average from 56 ratings - highest ever!)

Average Score: 4.23

Our mood scores have really shot up over the past couple of entries! It makes a lot of sense that we did so well in the mood category, as I think one of the things that makes Goodnight Meowmie unique is the way that it juxtaposes a warm and safe feeling of comfort and companionship against a cold and dark fear of the unknown. We received several comments highlighting that aspect of the game and I am really happy that it managed to resonate with others in that way.

Other than that, it's a solid set of scores all around. As with Goodnight Sheep, it's actually pretty cool that we were able to place so highly overall despite an comparably unimpressive score in "fun". I was actually surprised that we placed so highly in the audio category because I didn't spend all that much time on music, but I guess what I had worked well and I did sink a lot of time into sound design and ambience, which got highlighted in the horror half of the game.

Brainstorming

The theme for this round of Ludum Dare was "Combine 2 Incompatible Genres", which was actually quite interesting! The brainstorming process went quite differently than usual as a result of the theme, and for a while we were thinking about random genre combinations and what kinds of games they would lead to. Eventually we ended up with a handful of genres that seemed more interesting than the others, and discarded ones that we weren't really that interested in (we weren't going to make an FPS, or an MMO, or a trivia game, etc.). "Horror" in particular was something that seemed to lead to some crazy combinations ("horror + fishing", "horror + rhythm", "horror + dress-up", ...), and both of us were pretty interested in what it would be like to craft a horror game, so eventually we decided on the combination of horror + farming game, which sounded pretty unique and interesting.

The Initial (Failed) Idea

The idea was to take the routine comfort of a farming game like Stardew Valley and add in horror elements, so you would be trying to grow these crops day by day but you'd need to avoid creepy monsters in the dark. We had various different scenes planned, such as looking in a dark shed for seeds and tools, going to the well to refill your watering can, and of course actually planting and watering your crops. We wanted to leverage dynamic lighting so that you would never quite know where the monsters were, and would have to constantly be on the lookout for them. Ideally there would be this anxious tension between getting your farming duties done quickly versus cautiously looking around you for monsters. Sort of like the game Spaghet, which we came across while researching about the horror genre.

I started off by delving into dynamic lighting and post-processing effects to figure out how to get the lighting working, as that was clearly going to be a key component since we were making a horror game where darkness was an important element. xellaya drew up some rough sketches that I could use as placeholder assets for the girl and the background, and for the monsters I just used the monsters from Match Girl as a placeholder. This is a first for me, as I'm usually not very prone to overengineering things in these situations, but I actually ended up delving a bit too far and doing some extra work that probably wasn't necessary -- I added some things like chromatic aberration that we didn't end up using in the final game. You can also see from the above animation that I even managed to implement dynamic shadow casting, which took quite a bit of effort to get working properly in 2D (definitely not something that Unity is set up to do out of the box!). This was a really cool idea, but ultimately didn't make a lot of sense given our art style and perspective (would have made more sense with a fully top-down perspective, which we didn't want).

The good news was that the dynamic lighting system with the flashlight and the grainy noise filter looked great, so that was one big implementation aspect out of the way. The bad news was that we were really having a lot of trouble with both the actual gameplay and the entire overarching narrative. We had these very rough ideas in our head, for example you would do various actions with the crops while avoiding these monsters, but when we actually sat down to think about it, having a bunch of monsters wandering around in an open field didn't quite seem too interesting or suspenseful. We thought about having some sort of stealth-based gameplay, but it was really hard to pin it all down into something concrete. More importantly, we really couldn't figure out what the whole point of the crops was. Supposedly you were growing them in order to accomplish some objective (feed yourself? produce energy? provide light?), but we couldn't really figure out what the narrative was or how it was supposed to end. We also had this whole other idea about a recurring ghost that would show up every so often as sort of the key antagonist, and it would represent loss/the past...but again we were having a hard time figuring out how that was actually supposed to play out. Everything about the project was pretty vague and even worse, it was quickly becoming clear that we needed to cut it all down to something more manageable to have a chance of getting it done in time.

Introducing Meowmie

By this time it was Saturday afternoon/evening and we were feeling pretty demotivated...it was getting pretty clear that we needed to stop and rethink things. After stepping away from the project for a while xellaya eventually came up with the idea of getting rid of the farming aspect (since it felt really tacked-on anyways) and instead making the game about caring for a cat. That would provide the comforting atmosphere that we originally wanted with the "farming" half of the game (but never really achieved at all), and also provided a reason for going outside the bedroom (which was the "safe space") -- finding food for Meowmie.





Spoiler Warning -- The rest of this write-up will contain heavy spoilers for the plot and ending of Goodnight Meowmie! If you have not already played through the game, proceed at your own discretion.





xellaya also figured out the overarching story arc of the game -- a story of the girl who had lost Meowmie after leaving the window open one day. We came up with a rough outline of the story spread across 7 different in-game days, then ended up cutting it down to 5 days since we needed to make sure we could finish in time. It was Saturday night and we had lost a lot of time trying to figure out how to get the whole farming thing to work (and then scrapping it entirely), but we had a new idea that we were both behind, as well as a plan for how it would work.

The Big Push

We worked through Sunday and finally were feeling like we were heading in the right direction, but we weren't really close to being done with even half the game yet. I mentioned earlier how impressed I was at the amount of content that we were able to fit into even the initial compo version of the game, and that's because we basically made the majority of the game on Monday (the last day of the jam). Just for fun, I went back and checked out the version of the game that we had at the end of Sunday night. Here's a list of things that hadn't done yet at that point:

It's worth noting that we spent an extra 4 hours after the submission deadline finishing the entire ending flow, title screen, and credits sequence. So from roughly 11AM until 11PM on Monday we basically worked nonstop and put all of these things in. It was perhaps the most stressful Ludum Dare ever because even though we had a plan, everything was coming together last-minute and it was really not clear at all that we'd be able to finish. There were still several major problems that we needed to tackle during those last 12 hours, too. The ending sequence, for example, was initially suposed to involve walking outside and seeing Meowmie's grave (as it is in the post-jam version), but at the time we simply didn't have any assets for the outdoor scene, so we had to come up with a completely different ending sequence on the fly since we wouldn't have time to get that scene drawn.

Because we were so strapped for time, we also didn't get to work as collaboratively as we would have liked, since we were just heads-down working most of the time. I ended up writing most of the dialogue in the game myself as well as implementing most of the virtual pet asspects without much input from xellaya, since she was busy working on all of the animations and artwork all day. It was really stressful trying to figure out everything on the spot, but the only thing we could really do was reference the plan and trust in each other to execute on it to the best of our ability.

Somehow we managed to pull it all together at the end, though. It was an amazing feeling looking back on just how much we had created in such a short time. There were still many flaws and missing things (that we eventually added to the post-jam version), but we had created what felt like an actual meaningful narrative in a really short time. We have always wanted to really tell meaningful stories with our games, but have never really managed to successfully do so before, so I think Goodnight Meowmie was very significant to both of us for that reason.

Designing for Horror

We have gotten a lot of feedback on how frightening the horror parts of the game are, and even several people who told us they couldn't handle it and had to stop playing, which really surprised us because this is our first time working with horror as a genre and we were definitely figuring it out as we went along.

One of the first things I realized when I started doing research into how to effectively design for horror in games is that there are very few great examples of horror done well in 2D games at all. There's a plethora of 3D first-person horror games to reference, of course, but for 2D games there were actually very few really informative examples:

Since it was very difficult to reference existing examples of 2D horror done well, we ended up thinking about and researching a lot of the ideas and concepts that have been applied to 3D horror games and trying to translate them to our game. We thought about games such as P.T. and Little Nightmares as we were trying to figure out how to design our horror elements. Of course, we were facing pretty heavy time constraints, so we didn't have the opportunity to go super in-depth with our horror design, but we tried our best to draw from a few key realizations.

Suspense and Anticipation through Uncertainty

This article was probably the best and most helpful writeup we came across and I'd highly recommend it as a resource for trying to understand the psychology behind effective horror games.

One of the keys toward creating an actually-frightening experience is to build up suspense and anticipation through uncertainty -- the feeling where a player feels that something terrible is going to happen, but they have no idea what it will be, and more importantly, when it will occur. This is why playing into established horror tropes is so common: they signal to the player that you ought to be afraid, which builds this anticipation.


For Goodnight Meowmie, as soon as you step outside the bedroom you get hit by a completely different atmosphere that cues you into the fact that something is wrong. More importantly, the darkness prevents you from seeing everything on the screen, so there is uncertainty about where any danger could be. Since you only have a narrow cone of light, scary things could potentially be right next to you or behind you without you knowing it!


These first two screens actually don't contain anything that can possibly harm or scare you. (This will be significant later on!) Notice that when you can see the entire room layout like this, there's less feeling of anxiety because everything is in plain view, and there's no feeling of exploration since you already know exactly where the doors in each area are. These two rooms serve as sort of a a buildup for what is to come, just like a long drawn-out sequence in a horror film.

Monster Behaviour

In the third screen we introduce the "monsters" of the game. In the original compo version of the game, these were creepy eyeball monsters that would snap open when you passed by, but in the post-jam version we changed these to be bloody animal skulls to tie in more with the narrative.

The actual behavior of the monsters took a few tries to get right. For day 2, they are all stationary, with a certain activation radius that causes them to trigger (with a sharp *PING!* sound) and move towards you. On the left you can see an early version of the monster behavior, where they slowly drift toward you once they activate, stopping once you move outside that radius. This worked well with the screen distortion effects, and there was a feeling of "Is it going to get me?" as you try to rush by one of them.

In the end, though, we decided to change up the monsters pretty drastically to what you see in the animation on the right. Now you just have to sneak by the monsters completely, because once they activate they latch onto you very quickly and you can't escape. This ultimately made them feel much more threatening and added to the feeling of tiptoeing around landmines.


In day 3 you need to walk through a large room that features a handful of these monsters, except this time they slowly wander around the room instead of staying still. This is a natural progression and works really well because now you realize that danger actually COULD be approaching from behind you or to the side and you wouldn't be able to see it. Even better: in order to shine your light towards a direction you need to walk towards it, which potentially brings you closer to danger! So there's also this tension between moving away from something versus being able to see it.


The Hallway Scene

This is where our first chase scene happens, and I wanted to play with anticipation and suspense just a little bit more in this room. First off, there's no ambient music in this hallway, which provides a very different atmosphere than the previous screens.



When you reach the end of the hallway you find the food you were searching for, but nothing happens when you take it. You just walk back to the entrance...



...then this happens. Because you already just saw the rest of the hallway, there's only one place to go -- back to the other end of the hallway. So something will probably happen there...



At the end of the hallway you find nothing more than the key to get out. Maybe nothing will happen after all...?



Finally, after all that, we get our first chase sequence, running away from the red footprints. This chase sequence perhaps isn't the most exciting or well executed -- perhaps it would have worked better to have a jump scare with something appearing as you near the exit, or to have a faster-paced chase scene, or one with more obstacles and tension? But I think it's worth noting how much time is spent on anticipation of the chase sequence versus how long the chase actually lasts. Playing with that expectation is a key component of horror, I think. You could imagine how this scene would play out differently if the footstep chase sequence occurred right after you picked up the food...that's already the most obvious timing for "the big scary thing" to happen, so there wouldn't be nearly as much impact.

Something that's important to understand about horror is that the number of things that actually harm or hinder you tends to actually be significantly less than with an action-oriented game. It's really more about the anticipation of those things, and the cognitive dissonance between when they happen vs. when you expect them to happen. In an action game, there are a ton of obstacles that hinder you, but you generally know way ahead of time how it's all going to play out. In a horror game, there's only one or two things that end up happening, but you have no idea what or when they will be.

Jump Scares

Jump scares are terribly overused in a lot of second-rate horror games because they are the easiest, most brain-dead way to shock and frighten someone. Done well, they can provide a vivid moment of fear that serves to punctuate all of the anticipation that's been building up through the rest of the game. Done poorly, they make players feel frustrated and almost "cheated". I think the key here is to make the player feel like it was their own fault they were caught off guard, rather than making them feel like there was no possible way they could have been prepared for the jump scare. Again, this article really explains it well.

We actually only have one true jump scare in the game (and it's not super intense, but still worth talking about). For this one we tried to time it during a time when you might be starting to not be so cautious anymore. Think about a classic horror scene where there's a long drawn-out build up, rising suspense and cacophonic strings, and then...nothing happens. The protagonist (and viewer) breathes a sigh of relief, turns around, and -- BAM! -- that's when the Big Bad Thing gets them. It's so cliche at this point that it's almost expected, but the concept as a whole is still relevant.

Remember this hallway? It's the first dark hallway that you walked through, with only one exit on each end. Because you already walked through it before, your brain probably registers it as being a safe place -- you already "cleared it out", so to speak. But then you get these sudden red footprints that appear with really heavy *THUMP* sounds:

Since the hallway feels like a known quantity, there might not feel like there is much reason to pay close attention and keep your guard up, so you might already be thinking about what will happen next after this point. When a jump scare happens during a moment where your cognitive load is focused somewhere else, there's this brief moment where your mind gets flipped over and goes into this sudden state of shock, which is what we're aiming for. I think it's this situation that makes you as a player think "I was distracted and let my guard down...you got me good." rather than "I was totally expected something, but it happened completely at random and there was no way I could have known...that was a cheap trick."

Meowmie

Something crazy happened on Monday as I was trying to figure out the dialogue for the ending of the game: I started crying. I had become really emotionally invested in this story -- something that had never happened for any of the other games I worked on. Having witnessed the passing away of a pet myself just half a year ago, thinking about Meowmie really stirred up my feelings and though it was painful to think about, I'd like to believe that having those feelings and memories to draw upon really helped me understand the story and feelings we were trying to convey. We have really always wanted to touch upon the subject of loss and moving on in our games, because we feel very strongly about it, but we have never been able to successfully do it before. Goodnight Meowmie is a bit of a milestone for us in that way, I think.

The Ending

We really struggled to put together something meaningful and cohesive for the ending because we were running so short on time -- even during submission hour itself we were still in the middle of trying to figure out how the story was going to end. We had initially planned on the story ending with the girl going outside and seeing Meowmie's grave, but that wasn't an option because we didn't have time to create any of those assets for the outdoor scene.

We ended up with this replacement ending instead, where the girl thinks about her memories with Meowie and then comes to terms with the fact that Meowmie has passed away, but still keeps Meowmie in her mind. She knows that Meowmie will never be real again, but she is content with being with Meowmie in spirit and continuing to think about Meowmie. We made the ending loop back to the beginning, with "Goodnight, Meowmie" being the last words that the girl says to the spirit of Meowmie.

I liked that this ending provided a sort of hope for the future. Ultimately, though, it was really hard to actually understand what had happened. I think the wording of the ending sequence didn't make it clear enough that Meowmie's passing away had happened in the past before the game had started, and then it was super confusing that the girl still got to be with Meowmie in the end. More importantly, I think it felt "dishonest" to have such a hopeful and happy ending where the girl and Meomwie still got to be together.

After Ludum Dare we set out to rework the ending into something closer to what we had talked about in the beginning (before we ran out of time). It took a bunch of iteration to figure out the design of the outdoor scene, but xellaya did a great job on it.

In this ending the girl still goes through her memories of Meowmie like before, but this time instead of returning to the bedroom together with Meowmie, the final scene is outdoors, where you walk to Meowmie's grave for the final "Goodnight, Meowmie." This is a relatively straightforward scene, and not much of the dialogue ended up changing very much, but it actually took quite a while to really settle on exactly how this ending would work out. It was very tricky to get the right balance of tone, and also to convey what we wanted to without being too subtle.


After the final fade to black, the credits roll, and then the very last thing you see before the game wraps around to the title screen is this scene with "Thank you for playing" and the girl holding Meowmie while walking across the screen. I felt really strongly about this scene, and hope that it caps the experience off with a nice feeling at the very end.

Visual Effects

It's very rare that I have something technically interesting to talk about for one of my game jam entries (that isn't just dealing with syncing music to gameplay), but one of the more unique things about working on this project was crafting the visual effects for the nighttime "horror" sections. We heavily leveraged a few lighting and shading effects, which I'll try to break down here.


For reference, here's what the end in-game rendering looks like:



...and here's the same thing with absolutely no effects or lighting applied:

As usual, we're using Unity sprite renderer to draw our character sprite, and the background is a tilemap handled by Tiled2Unity, which integrates Tiled with Unity. (I know Unity also has its own newfangled Tilemap support now as well, but I hadn't gotten a chance to play around with it yet)



Now we add per-pixel dynamic lighting! This is an effect that's not always super common for 2D games and depending on how you implement it, can actually look really cheap and bad! The only other time I've ever used dynamic lighting for a 2D game was for Match Girl, which used a different approach I think...I'm pretty sure I just cut out circular shapes into a black texture and then rendered the black texture (with holes) on top of everything else. Anyhow, for Goodnight Meowmie, the bulk of the work is done by the main pixel shader, which is a hacked-up version of UnitySpriteShaders. That project actually has support for quite a number of fancy features like normal maps and such, but we didn't use any of it. The main change I made to the shader was limiting the maximum brightness of a pixel to be whatever it was in the original asset. (The original shader just let you keep on adding light without limits until your sprite is just entirely white, but I wanted "fully lit" to look like the original artwork and not any brighter)

The whole system is actually pretty janky as there's no such thing as a "2D light" in Unity, so I'm actually using 3D point lights (spheres!) to cast light over a circular area. The cone of light cast by the girl's lantern is actually another point light, but using Unity's "light cookie" feature to shape the light according to a triangle-shaped mask (that I generated/drew in GIMP). If I were to do a larger and more serious project I would definitely rework this whole system to be cleaner to work with.



The main other thing that happens is a post-processing noise/grain affect applied to the entire screen. This has the end result of turning the soft lighting gradients into these really fuzzy and noisy areas, specifically in the darker parts. I used the old version of Unity's "Noise and Grain" image effect (which has since been replaced by the "Grain" effect), since it's implemented a bit differently and gives you a bit more control over how the effect is applied to light vs dark areas. This noise is also randomized per-frame, like static on a TV (do people in this day and age still know what that looks like?) so there's a lot of "motion" in those pixels, which works to emphasize the fact that the darker areas are more uncertain and thus more "dangerous".



The very last thing that's added is a particle system that simulates these dust-like (?) particles that float and drift around on the screen. They're pretty subtle, so you may not even have noticed them consciously in-game, but they really help to give a sense of "life" to the space. It really makes a difference to an environment when there is at least *something* moving, as opposed to just an entirely static background. Here's a gif where I've turned up the size and amount of those particles higher than normal, so you can see them in action:

Unity's built-in particle system doesn't let you provide random dynamic motion (that changes over time) on a per-particle basis, but the ParticleSystem API allows you to get and set the velocity of each particle, so we can implement that ourself with some code that looks like this:

[SerializeField] float _minSpeed = 100.0f;
[SerializeField] float _maxSpeed = 500.0f;
[SerializeField] float _velocityChangeRate = 500.0f;

// Temporary array for reading/writing particle data.
static readonly ParticleSystem.Particle[] _particles = new ParticleSystem.Particle[1000];

protected virtual void Update() {
    ParticleSystem system = GetComponent();
    Assert.IsTrue(system.particleCount <= _particles.Length);
    int count = system.GetParticles(_particles);
    
    for (int i = 0; i < count; ++i) {
        // Add some velocity in a random direction.
        _particles[i].velocity += Random.onUnitSphere * Time.deltaTime * _velocityChangeRate;
        
        // Clamp speed between min and max.
        float speed = _particles[i].velocity.magnitude;
        speed = Mathf.Clamp(speed, _minSpeed, _maxSpeed);
        _particles[i].velocity = _particles[i].velocity.normalized * speed;
    }

    // Apply changes.
    system.SetParticles(_particles, count);
}

Of course, the actual particle motion could be handled in whatever way you want (affect angle and speed separately, be drawn towards a specific point, etc.).

These particles use sprite rendering (the actual sprite is just a single white pixel), using the same pixel-lit shader as everything else so that they are also affected by lighting. There's also an added quirk where because I'm also moving the particles in the Z axis, and because my light shapes are actually spheres, the particles sometimes move in front or behind the light spheres, meaning they'll show up as darker even though they are within the 2D circle of light. This wasn't intentionally planned, but provides a nice effect since the particles have a nice gradation between white and black depending on their motion.

Visual Effects

When a monster closes in on you, we add some additional effects to mess with the screen so it gets all distorted and creepy-looking.

The first thing we do is crank up the noise and grain effect to the max as the monster gets closer and closer, which means now it's being applied to both light and dark areas alike with full strength.



We also apply red color weighting so that the whole screen gets tinted red...



And here's the cool part -- we apply an edge detection effect, which adds black edges to the rendered image wherever there are significant color differences (this is another Unity image effect). We increase the "sample distance" as the monster gets closer, which increases the "aggressiveness" of the effect and the way that it bleeds into neighboring areas.

Audio Design

While the music for Goodnight Meowmie was very simplistic (I used more or less the same melody for the entire game, just arranged differently), the audio design for some of the sound effects were actually somewhat interesting to work with. While many of the sound effects (footsteps, doors opening and closing, etc.) were free resources found on freesound.org, there were several that I worked on or modified myself.


For the meowing sounds that Meowmie made, I spent a brief amount of time looking through cat sounds on Freesound, but I decided to synthesize Meowmie's voice instead (as I did in Pet Furball) since that would give me a lot more control over the expressions and a more consistent sound overall. The timbre of the sound is really simple: it's mainly just a single triangle wave, with another softer one an octave above for some added richness. Then I just played around with pitch bends of varying lengths and amounts to generate a handful of different expressions.



Heavily pitching sounds down and/or timestretching them came in handy for generating creepy ambient noises. For one of the ambient sound tracks, I simply took these four percussive impact samples:


...and pitched them down anywhere between 2400 and 4800 cents (4-16 times slower). It's super simple to do, and the end result is this:



During the final chase sequence there's an interesting garbled sound that rises in intensity as you make your way back to the bedroom. This sound has sort of a curious origin -- it's actually a carryover from the initial failed horror + farming game work, where we were throwing around the idea of a persistent ghostly female antagonist that was haunting you throughout the game. I wanted to try starting with some audio material that fit the source of the sound (in this case, a human voice) and distorting it until it sounded really creepy. The idea is that even though you're garbling the sound up, you still have the timbre of the original sound in there, so there's some level of subconscious association.

Here's the original voice audio that I started with, sampled from an interview of some sort:


From that I made four different layered sounds that play on top of each other.

Layer 1 is reversed and pitched down by about 25%. I also applied some formant filtering (basically modifying the "throat shape" of the sound) and some light audio degradation:


Layer 2 is also reversed and is pitched down to half the original speed. This one has some different formant filtering, a stereo delay effect, and two different audio degradation types applied to it:


Layer 3 is reversed, pitched up by about 20%, and run through some glitching plugins that shuffle around the sections of the sound and apply some time-based filtering to them:


Layer 4 is reversed and pitched down to a quarter of the original speed, then run through an echo effect:


Combining all four layers yields the final sound texture:

Closing Remarks

Well, this project has really been a journey. Thank you for those of you who actually read these ramblings -- I had quite a lot to say this time, it seems. I'm really glad we were able to make this game together and I'm excited to see what we can come up in the future as we become more comfortable weaving narratives into our games.

<< Back to "Articles"